[
  {
    "path": ".github/pull_request_template.md",
    "content": "> **_IMPORTANT:_**  Please remember to update plugin metadata in plugins.json along with the metadata in your plugin. Always increase the version number when submitting an update.\n\nPlease only update one plugin per pull-request (unless you are applying the same fix to multiple pull requests, and nothing else).\n"
  },
  {
    "path": ".github/workflows/plugin_updates.yml",
    "content": "name: Plugin Updates\n\non:\n  push:\n    branches: [master]\n\njobs:\n  generate-updates:\n    if: github.repository == 'JannisX11/blockbench-plugins'\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: \"22\"\n\n      - name: Generate updates.json\n        working-directory: build\n        run: node update_plugin_updates.mjs\n\n      - name: Commit and push updates.json\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"41898282+github-actions[bot]@users.noreply.github.com\"\n          git add updates.json\n          if ! git diff --cached --quiet; then\n            git commit -m \"Update updates.json\"\n            git push\n          else\n            echo \"No changes to commit\"\n          fi"
  },
  {
    "path": ".github/workflows/validate.yml",
    "content": "name: Plugin Validator\non: [pull_request]\n\njobs:\n  verify-json-validation:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n      - name: Validate JSON\n        uses: docker://orrosenblatt/validate-json-action:latest\n        env:\n          INPUT_SCHEMA: ./schema.json\n          INPUT_JSONS: ./plugins.json\n\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: \"22\"\n\n      - name: Checkout the code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0 # Ensures we have the full history for diff\n\n      - name: Validate\n        run: |\n          npm ci\n          git fetch origin ${{ github.base_ref }}\n          CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)\n          CHANGED_FILES=\"$CHANGED_FILES\" npm run validate\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules/\n\n.DS_Store\ndesktop.ini\n\n/.idea"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"json.schemas\": [\n        {\n            \"fileMatch\": [\n                \"changelog.json\"\n            ],\n            \"url\": \"./types/changelog.schema.json\"\n        },\n        {\n            \"fileMatch\": [\n                \"plugins.json\"\n            ],\n            \"url\": \"./types/plugins.schema.json\"\n        }\n    ]\n}"
  },
  {
    "path": "README.md",
    "content": "# Blockbench Plugin Repository\n\nCreate a pull request to submit or update plugins. Open an issue to report bugs within plugins and tag the author if possible.\n\n## Installing Plugins\n\nTo install a plugin, go to File > Plugins... and switch to the available tab. Find the plugin you want to use and click Install.\n\n\n## Links\n\n* Discover plugins: [blockbench.net/plugins](https://blockbench.net/plugins)\n* Main Blockbench repository: [JannisX11/blockbench](https://github.com/JannisX11/blockbench)\n* Plugin Documentation: [blockbench.net/wiki/api/plugin](https://www.blockbench.net/wiki/api/plugin)\n* Discord plugin development forum: [#bb-plugin-dev](https://discord.gg/2Df3h6ge9f)\n\n## Conventions\n\n* Plugin IDs should be snake_case and must be consistent across all properties and file names.\n* Indentation for common files must be Tab character. Individual plugin files can follow own personal preferences.\n* Use simple semver for plugin versioning: MAJOR.MINOR.PATCH, e. g. \"1.2.11\". You need to increase the version number for each update that is published.\n\n## File Structure\nBlockbench supports two file structure systems.\n\n### Legacy structure\nThe legacy format, where plugin Javascript files are saved directly in the plugins directory, was used by Blockbench 4.7 and older, and will continue to be supported for already existing plugins.\n\n### Current structure\nThe new structure utilizes a separate directory per plugin in the plugins directory, which contains the plugin Javascript file, as well as other optional files.\nThe new structure will be used by Blockbench if the `\"min_version\"` is set to 4.8.0 or higher.\nThe new structure is recommended for new plugins.\n\nThese are the files that can be added to the plugin directory\n* `plugins/plugin_id/plugin_id.js`- The plugin Javascript file itself\n* `plugins/plugin_id/about.md`: Markdown file containing the plugin about + instructions.\n* `plugins/plugin_id/icon.png` or `icon.svg`: The plugin icon. Icons can be either PNG or SVG files with a resolution of 48x48 - 96x96 and a maximum size of 12 KB. To register an icon, set the icon field in the plugin meta data to the file name of the icon.\n* `plugins/plugin_id/members.yml`: This file allows you to list Github users who have your permission to do changes to your model, without me having to check back with you. You can add two types of members: `maintainers` Can do anything with the plugin, including removing it entirely or modifying the members list. `developers` can contribute new versions of the plugin.\n* `plugins/plugin_id/LICENSE.MD`: Add a license if you want to license your plugin as open source. You can choose your license here: [choosealicense.com](https://choosealicense.com)\n* `plugins/plugin_id/changelog.json`: Add a changelog file for your plugin. Set `has_changelog` to `true` in the meta data to enable this. If you use VS Code (which I recommend), you'll automatically have autocomplete and validation for this file. Make sure to add new versions to the bottom of the file!\n* `plugins/plugin_id/src/**`: Use this directory to store the plugin source, if using a bundler.\n\n## Development\n\n* To develop a plugin, fork and clone the repository. Make sure [NodeJS](https://nodejs.org/en/) is installed and run `npm install` in the repository. This will install the Blockbench types that make it easier to use the Blockbench API.\n\n## Bundling\n\nIf your plugin exceeds a certain level of complexity, it can reach the point where it becomes necessary to use a Bundler, such as Webpack or esbuild, to build the plugin JS file.\n\nThis is possible, but comes with the requirement that the source code must be public and human-readable, and builds must be reprocable by anyone from the source.\n\nThere are several options for keeping your source code:\n* You can keep the source code in the `src` folder of your plugin's directory. Good example: `plugins/geckolib/src`\n* In the root `src` folder. Example: `src/resourcepack_packager`. This is deprecated for new plugins.\n* In an external Git repository. This is recommended for large plugins with active development. Requirements are a min_version of 5.0.0 or higher, a link to the source repository in the plugin metadata, and passing the automatic validation with no errors.\n\nWhen bundling, obfuscation is not allowed. You may use minification if the bundle would otherwise become too large, otherwise consider leaving it unminified for transparency and easier debugging.\n\n\n## Submission\n\nIn order to submit your plugin, you need to meet a few requirements:\n\n* If your plugin is created by a bundler, you need to upload the source as well. See **Bundling**\n* If your plugin is designed for anything related to Minecraft, add one of the tags `Minecraft: Java Edition`, `Minecraft: Bedrock Edition` (or `Minecraft`). The same applies if it's designed for another specific game.\n\t(Keep in mind that artists from many different areas use Blockbench, so provide some context in the meta data)\n* In total, you can provide up to three plugin tags\n* THE PLUGIN META DATA NEEDS TO BE THE SAME in the plugin file itself and in the file `plugins.json`.\n* Plugins should not be larger than 2 MB\n* Make sure to not bundle dependencies that are already included in Blockbench. Blockbench comes with a number of libraries already included that can be used by plugins, such as ThreeJS, Vue 2, JSZip, Marked, and MolangJS.\n* Plugins may not execute code from external sources. This includes separately hosted scripts, user inputs or files, or otherwise externally hosted or generated code. This also applies to rendering of HTML content.\n* Plugins that utilize generative AI are not accepted into this repository but may be shared externally.\n\nThis list of plugins is curated to some extent. Plugins will be reviewed and may not be accepted if they don't meet quality standards. Already published plugins may also be taken down if they no longer meet the requirements.\n\nWhile it is the goal to keep the plugin API generally compatible across different Blockbench version, it can happen that a feature is changed or deprecated and your plugin must be updated in order to keep working.\nIt is recommended to test all of your plugins during the beta phase before each Blockbench feature update!\n\nTo help catch some common issues, you can use the validator script in the root of this repo to catch common issues.\nThis script will also run in each pull request.\n\n```bash\nnpm install\nnpm run validate <plugin-id>\n```\n\nOnce you are ready to submit your plugin, create a pull request.\n\n## Updates\n\nUpdates to plugins can be submitted via pull request.\n\nIn order for the plugin to auto update for users who already have it installed, the version number needs to be increased both in the plugin file and in plugins.json.\n\nOptionally, a changelog can indicate what changed in a given update. See [Current structure](#current-structure).\n\n\n## Third party contributions\n\nAs explained above, you can add approved contributors in the `members.yml` file.\n\nFor contributions from third parties, the original creator or maintainer of the plugin will be pinged in the respective Pull Request for permission.\n\nIf you have a preference, you can specify in `membery.yml` under `abandoned` what you would like to happen if you no longer contribute to the plugin and no longer approval third party contributions.\nIf unspecified, if you haven't replied within 4 weeks and are no longer active on Github, or if you haven't replied in 8 weeks despite being active, we may test and merge the contribution.\n\nSome small changes like fixes for changed Blockbench APIs may be merged without asking for permission of the original creator.\n"
  },
  {
    "path": "build/generate_plugin_updates.mjs",
    "content": "import plugins from \"../plugins.json\" with { type: \"json\" }\nimport fs from \"node:fs\"\n\nconst updates = {}\n\nfor (const [id, data] of Object.entries(plugins)) {\n  if (!data.version || !/^\\d+\\.\\d+\\.\\d+$/.test(data.version)) {\n    continue\n  }\n\n  updates[id] = {\n    version: data.version\n  }\n\n  let changelog\n  if (data.has_changelog && fs.existsSync(`../plugins/${id}/changelog.json`)) {\n    try {\n      changelog = Object.values(JSON.parse(fs.readFileSync(`../plugins/${id}/changelog.json`)))\n    } catch {}\n  }\n\n  if (data.creation_date) {\n    updates[id].created = Date.parse(data.creation_date) || 0\n  } else if (changelog?.[0]?.date) {\n    updates[id].created = Date.parse(changelog[0].date) || 0\n  } else {\n    updates[id].created = 0\n  }\n\n  if (changelog?.at(-1)?.date) {\n    updates[id].updated = Date.parse(changelog.at(-1).date) || updates[id].created\n  } else {\n    updates[id].updated = updates[id].created\n  }\n}\n\nfs.writeFileSync(\"../updates.json\", JSON.stringify(updates, null, 2))"
  },
  {
    "path": "build/update_plugin_updates.mjs",
    "content": "import plugins from \"../plugins.json\" with { type: \"json\" }\nimport updates from \"../updates.json\" with { type: \"json\" }\nimport fs from \"node:fs\"\n\nconst now = Date.now()\n\nfor (const [id, data] of Object.entries(plugins)) {\n  if (!data.version || !/^\\d+\\.\\d+\\.\\d+$/.test(data.version)) {\n    continue\n  }\n\n  if (!updates[id]) {\n    updates[id] = {\n      version: data.version,\n      created: now,\n      updated: now\n    }\n    continue\n  }\n\n  if (data.version === updates[id].version) {\n    continue\n  }\n\n  const [oMaj, oMin, oPatch] = updates[id].version.split(\".\").map(Number)\n  const [nMaj, nMin, nPatch] = data.version.split(\".\").map(Number)\n\n  const wentDown = nMaj < oMaj || (nMaj === oMaj && nMin < oMin) || (nMaj === oMaj && nMin === oMin && nPatch < oPatch)\n  const onlyPatchChanged = nMaj === oMaj && nMin === oMin && nPatch !== oPatch\n\n  updates[id].version = data.version\n\n  if (wentDown || onlyPatchChanged) {\n    continue\n  }\n\n  updates[id].updated = now\n}\n\nfs.writeFileSync(\"../updates.json\", JSON.stringify(updates, null, 2))"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"blockbench-plugins\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Blockbench plugins repository.\",\n  \"main\": \"index.js\",\n  \"types\": \"types/index.d.ts\",\n  \"type\": \"module\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/JannisX11/blockbench-plugins.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/JannisX11/blockbench-plugins/issues\"\n  },\n  \"homepage\": \"https://github.com/JannisX11/blockbench-plugins#readme\",\n  \"devDependencies\": {\n    \"blockbench-types\": \"^5.1.0\",\n    \"compare-versions\": \"^6.1.1\",\n    \"image-size\": \"^2.0.2\"\n  },\n  \"scripts\": {\n    \"validate\": \"node ./scripts/validate.js\"\n  }\n}\n"
  },
  {
    "path": "plugins/_template/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/_template/about.md",
    "content": "Template plugin!\n\n## How to use\n"
  },
  {
    "path": "plugins/_template/members.yml",
    "content": "maintainers:\n  - YourName\ndevelopers:\n  - OtherName\n"
  },
  {
    "path": "plugins/_template/plugin.js",
    "content": "/// <reference path=\"../../types/index.d.ts\" />\n\n(function() {\n\n// When updating, apply meta data changes to plugins.json entry!\nBBPlugin.register('plugin', {\n\ttitle: 'Plugin',\n\ticon: 'icon.png',\n\tauthor: '',\n\tdescription: '',\n\ttags: [],\n\tversion: '0.0.1',\n\tmin_version: '4.9.0',\n\tvariant: 'both',\n\tonload() {\n\n\t},\n\tonunload() {\n\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/activity_tracker/about.md",
    "content": "<div id=\"about-content\">\n  <p>This plugin allows you to keep track of how much time you spend using Blockbench and how long you spend working on each project.</p>\n  <h3>Usage:</h3>\n  <ul>\n    <li>Head to the <strong>Tools</strong> menu and select <strong>Activity Tracker</strong></li>\n    <li>From here you can see all your stats for both Blockbench and the current project.</li>\n    <li>You can use the options in the dialog to configure if tracking should pause when tabbed out.</li>\n  </ul>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/activity_tracker/activity_tracker.js",
    "content": "let styles, dialog, action, running, importDialog, exportDialog, interval, timeout, notification, state\n\nconst id = \"activity_tracker\"\nconst name = \"Activity Tracker\"\nconst icon = \"trending_up\"\nconst description = \"Track how long you spend using Blockbench and working on each project.\"\nconst activity = JSON.parse(localStorage.getItem(id) ?? '{ \"clock\": 0 }')\n\nlet pauseOnLostFocus = localStorage.getItem(`${id}_pause_lost_focus`) ?? \"0\"\n\nPlugin.register(id, {\n  title: name,\n  icon: \"icon.png\",\n  author: \"Ewan Howell\",\n  description,\n  tags: [\"Tracking\", \"Stats\", \"Utility\"],\n  version: \"1.1.1\",\n  min_version: \"4.8.0\",\n  variant: \"both\",\n  creation_date: \"2023-03-30\",\n  website: \"https://ewanhowell.com/plugins/activity-tracker/\",\n  repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/activity-tracker\",\n  bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Activity Tracker]\",\n  has_changelog: true,\n  onload() {\n    activity.session = activity.clock\n\n    styles = Blockbench.addCSS(`\n      #tracker-container {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        text-align: center;\n      }\n      .tracker-row {\n        display: flex;\n        gap: 20px;\n        width: 100%;\n        margin: 10px 0 20px;\n        justify-content: center;\n      }\n      .tracker-col {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 10px;\n      }\n      .tracker-col > p {\n        color: var(--color-light);\n        font-size: 1.5rem;\n      }\n      .tracker-line {\n        width: 100%;\n        border-top: 2px solid var(--color-border);\n        margin: 10px 0 20px;\n      }\n      #tracker-container .button-row {\n        display: flex;\n        justify-content: flex-end;\n        width: 100%;\n      }\n      #tracker-import {\n        margin: 20px 0 10px;\n      }\n      #tracker-export {\n        user-select: all;\n      }\n      .tracker-row-center {\n        align-items: center;\n        gap: 10px;\n      }\n      #tracker-container i {\n        cursor: pointer;\n      }\n      #tracker-container i:hover {\n        color: var(--color-light);\n      }\n    `)\n\n    property = new Property(ModelProject, \"number\", id, {\n      default: 0,\n      exposed: false\n    })\n\n    ModelProject.all.forEach(e => {\n      e.activity_tracker = 0\n      e.activity_tracker_session = 0\n    })\n\n    importDialog = new Dialog({\n      id: `${id}_import`,\n      title: `${name} Import`,\n      buttons: [],\n      component: {\n        data: {\n          seconds: 0\n        },\n        methods: {\n          input(e) {\n            this.seconds = Math.min(parseInt(e.target.value) || 0, 9999999999)\n          },\n          durationString,\n          confirm() {\n            activity.clock = this.seconds\n            activity.session = this.seconds\n            importDialog.close()\n          }\n        },\n        template: `\n          <div id=\"tracker-container\">\n            <h2>Enter number of seconds:</h2>\n            <input id=\"tracker-import\" class=\"dark_bordered half\" type=\"number\" placeholder=\"123456789\" @input=\"input\"></input>\n            <p>Preview: {{ durationString(seconds) }}</p>\n            <div class=\"button-row\">\n              <button @click=\"confirm\">Confirm</button>\n            </div>\n          </div>\n        `\n      }\n    })\n\n    exportDialog = new Dialog({\n      id: `${id}_export`,\n      title: `${name} Export`,\n      buttons: [],\n      component: {\n        data: {\n          clock: activity.clock\n        },\n        methods: {\n          copy() {\n            navigator.clipboard.writeText(this.clock)\n            const text = $(\"#tracker-export\").text(\"Copied...\")\n            setTimeout(() => text.text(this.clock), 1000)\n          }\n        },\n        template: `\n          <div id=\"tracker-container\">\n            <h2>Your total activity in seconds:</h2>\n            <div class=\"tracker-row tracker-row-center\">\n              <p id=\"tracker-export\" class=\"dark_bordered half\">{{ clock }}</p>\n              <i class=\"material-icons icon\" title=\"Copy to clipboard\" @click=\"copy\">content_copy</i>\n            </div>\n          </div>\n        `\n      }\n    })\n\n    dialog = new Dialog({\n      id,\n      title: name,\n      buttons: [],\n      component: {\n        data: () => ({\n          get Project() { return Project },\n          activity,\n          importDialog,\n          exportDialog,\n          options: {\n            \"0\": \"Immediately\",\n            \"10\": \"After 10 seconds\",\n            \"30\": \"After 30 seconds\",\n            \"60\": \"After 1 minute\",\n            \"300\": \"After 5 minutes\",\n            \"600\": \"After 10 minutes\",\n            \"1200\": \"After 20 minutes\",\n            \"1800\": \"After 30 minutes\",\n            \"2700\": \"After 45 minutes\",\n            \"3600\": \"After 1 hour\",\n            \"never\": \"Never\"\n          },\n          option: pauseOnLostFocus\n        }),\n        methods: {\n          durationString,\n          set(e) {\n            pauseOnLostFocus = e\n            localStorage.setItem(`${id}_pause_lost_focus`, e)\n          }\n        },\n        template: `\n          <div id=\"tracker-container\">\n            <h1>Global Activity</h1>\n            <div class=\"tracker-row\">\n              <div class=\"tracker-col\">\n                <h2>Total</h2>\n                <p>{{ durationString(activity.clock) }}</p>\n              </div>\n              <div class=\"tracker-col\">\n                <h2>Current session</h2>\n                <p>{{ durationString(activity.clock - activity.session) }}</p>\n              </div>\n            </div>\n            <div v-if=\"Project\" id=\"project-tracker\">\n              <div class=\"tracker-line\"></div>\n              <h1>Current Project Activity</h1>\n              <p>Models must be saved as a bbmodel to preserve per project activity tracking.</p>\n              <div class=\"tracker-row\">\n                <div class=\"tracker-col\">\n                  <h2>Total</h2>\n                  <p>{{ durationString(Project.${id}) }}</p>\n                </div>\n                <div class=\"tracker-col\">\n                  <h2>Current session</h2>\n                  <p>{{ durationString(Project.${id} - Project.${id}_session) }}</p>\n                </div>\n              </div>\n            </div>\n            <div class=\"tracker-line\"></div>\n            <div id=\"pause-tracking-select-container\" class=\"tracker-row tracker-row-center\">\n              <p>Pause tracking when tabbed out:</p>\n              <select-input v-model=\"option\" :options=\"options\" @input=\"set\" />\n            </div>\n            <div class=\"tracker-line\"></div>\n            <div class=\"tracker-row\">\n              <button @click=\"importDialog.show()\">Import time</button>\n              <button @click=\"exportDialog.show()\">Export time</button>\n            </div>\n          </div>\n        `\n      }\n    })\n\n    action = new Action({\n      name,\n      id,\n      description,\n      icon,\n      click: () => dialog.show()\n    })\n\n    MenuBar.addAction(action, \"tools\")\n    window.addEventListener(\"focus\", focus)\n    window.addEventListener(\"blur\", blur)\n    if (Blockbench.isWeb) document.addEventListener(\"visibilitychange\", visibilityChange)\n    Blockbench.on(\"select_project\", selectProject)\n    selectProject()\n    focus()\n  },\n  onunload() {\n    window.removeEventListener(\"focus\", focus)\n    window.removeEventListener(\"blur\", blur)\n    if (Blockbench.isWeb) document.removeEventListener(\"visibilitychange\", visibilityChange)\n    Blockbench.removeListener(\"select_project\", selectProject)\n    clearTimeout(timeout)\n    clearInterval(interval)\n    styles.delete()\n    property.delete()\n    action.delete()\n    dialog.close()\n    importDialog.close()\n    exportDialog.close()\n  }\n})\n\nfunction durationString(num) {\n  num = num * 1000\n  const years = Math.floor(num / 3.1536e10)\n  let days = Math.floor(num / 8.64e7) % 365\n  const weeks = Math.floor(days / 7)\n  days %= 7\n  const hours = Math.floor(num / 3.6e6) % 24\n  const minutes = Math.floor(num / 6e4) % 60\n  const seconds = Math.round(num / 1000 % 60)\n  return `${years} year${years === 1 ? \"\" : \"s\"}, ${weeks} week${weeks === 1 ? \"\" : \"s\"}, ${days} day${days === 1 ? \"\" : \"s\"}, ${hours.toString().padStart(2, 0)}:${minutes.toString().padStart(2, 0)}:${seconds.toString().padStart(2, 0)}`.replace(/(?<!\\d)0\\s[a-z]+,\\s/g, \"\").replace(/(, 00:00:00)/, \"\")\n}\n\nfunction selectProject() {\n  setTimeout(() => {\n    Project.activity_tracker_session ||= Project.activity_tracker\n  }, 0)\n}\n\nfunction visibilityChange() {\n  if (document.visibilityState === \"hidden\") blur()\n  else focus()\n}\n\nfunction focus() {\n  if (state === \"focus\") return\n  state = \"focus\"\n  clearTimeout(timeout)\n  notification?.delete()\n  if (running) return\n  running = true\n  interval = setInterval(() => {\n    activity.clock += 1\n    Project.activity_tracker += 1\n    localStorage.setItem(id, JSON.stringify(activity))\n  }, 1000)\n}\n\nfunction blur() {\n  if (state === \"blur\") return\n  state = \"blur\"\n  if (pauseOnLostFocus === \"never\") return\n  timeout = setTimeout(() => {\n    clearInterval(interval)\n    running = false\n    notification = Blockbench.showToastNotification({\n      text: \"Activity tracking paused. Tab back in to resume.\",\n      icon\n    })\n  }, parseInt(pauseOnLostFocus) * 1000)\n}"
  },
  {
    "path": "plugins/activity_tracker/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2023-03-30\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2023-04-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Fixes\",\n        \"list\": [\n          \"Fixed minor tracking issues\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2025-10-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Updated to new repository format\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed project tracking not showing for Blockbench 5.0\"\n        ]\n      }\n    ]\n  },\n  \"1.1.1\": {\n    \"title\": \"1.1.1\",\n    \"date\": \"2025-10-19\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed project tracking not showing if Activity Tracker is first opened on the Start Screen\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/ambient_occlusion.js",
    "content": "(function() {\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.EffectComposer = function ( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tif ( renderTarget === undefined ) {\n\n\t\tvar parameters = {\n\t\t\tminFilter: THREE.LinearFilter,\n\t\t\tmagFilter: THREE.LinearFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\tstencilBuffer: false\n\t\t};\n\n\t\tvar size = renderer.getSize( new THREE.Vector2() );\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\t\tthis._width = size.width;\n\t\tthis._height = size.height;\n\n\t\trenderTarget = new THREE.WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, parameters );\n\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t} else {\n\n\t\tthis._pixelRatio = 1;\n\t\tthis._width = renderTarget.width;\n\t\tthis._height = renderTarget.height;\n\n\t}\n\n\tthis.renderTarget1 = renderTarget;\n\tthis.renderTarget2 = renderTarget.clone();\n\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.renderToScreen = true;\n\n\tthis.passes = [];\n\n\t// dependencies\n\n\tif ( THREE.CopyShader === undefined ) {\n\n\t\tconsole.error( 'THREE.EffectComposer relies on THREE.CopyShader' );\n\n\t}\n\n\tif ( THREE.ShaderPass === undefined ) {\n\n\t\tconsole.error( 'THREE.EffectComposer relies on THREE.ShaderPass' );\n\n\t}\n\n\tthis.copyPass = new THREE.ShaderPass( THREE.CopyShader );\n\n\tthis.clock = new THREE.Clock();\n\n};\n\nObject.assign( THREE.EffectComposer.prototype, {\n\n\tswapBuffers: function () {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t},\n\n\tinsertPass: function ( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\n\t},\n\n\tisLastEnabledPass: function ( passIndex ) {\n\n\t\tfor ( var i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\trender: function ( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tvar currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.getContext();\n\t\t\t\t\tvar stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( THREE.MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tvar size = this.renderer.getSize( new THREE.Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tvar effectiveWidth = this._width * this._pixelRatio;\n\t\tvar effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( var i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t},\n\n\tsetPixelRatio: function ( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n} );\n\n\nTHREE.Pass = function () {\n\n\t// if set to true, the pass is processed by the composer\n\tthis.enabled = true;\n\n\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\tthis.needsSwap = true;\n\n\t// if set to true, the pass clears its buffer before rendering\n\tthis.clear = false;\n\n\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\tthis.renderToScreen = false;\n\n};\n\nObject.assign( THREE.Pass.prototype, {\n\n\tsetSize: function ( /* width, height */ ) {},\n\n\trender: function ( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n} );\n\n// Helper for passes that need to fill the viewport with a single quad.\nTHREE.Pass.FullScreenQuad = ( function () {\n\n\tvar camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\tvar geometry = new THREE.PlaneBufferGeometry( 2, 2 );\n\n\tvar FullScreenQuad = function ( material ) {\n\n\t\tthis._mesh = new THREE.Mesh( geometry, material );\n\n\t};\n\n\tObject.defineProperty( FullScreenQuad.prototype, 'material', {\n\n\t\tget: function () {\n\n\t\t\treturn this._mesh.material;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._mesh.material = value;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( FullScreenQuad.prototype, {\n\n\t\tdispose: function () {\n\n\t\t\tthis._mesh.geometry.dispose();\n\n\t\t},\n\n\t\trender: function ( renderer ) {\n\n\t\t\trenderer.render( this._mesh, camera );\n\n\t\t}\n\n\t} );\n\n\treturn FullScreenQuad;\n\n} )();\n\n\n\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nTHREE.CopyShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { value: null },\n\t\t\"opacity\": { value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\"\tvUv = uv;\",\n\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" ),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\"\tvec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\"\tgl_FragColor = opacity * texel;\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" )\n\n};\n\n\n\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.ShaderPass = function ( shader, textureID ) {\n\n\tTHREE.Pass.call( this );\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tif ( shader instanceof THREE.ShaderMaterial ) {\n\n\t\tthis.uniforms = shader.uniforms;\n\n\t\tthis.material = shader;\n\n\t} else if ( shader ) {\n\n\t\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\t\tthis.material = new THREE.ShaderMaterial( {\n\n\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t} );\n\n\t}\n\n\tthis.fsQuad = new THREE.Pass.FullScreenQuad( this.material );\n\n};\n\nTHREE.ShaderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {\n\n\tconstructor: THREE.ShaderPass,\n\n\trender: function ( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n} );\n\n\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tTHREE.Pass.call( this );\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;\n\n\tthis.clear = true;\n\tthis.clearDepth = false;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {\n\n\tconstructor: THREE.RenderPass,\n\n\trender: function ( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tvar oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tvar oldClearColor, oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor ) {\n\n\t\t\toldClearColor = renderer.getClearColor(new THREE.Color()).getHex();\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\trenderer.render( this.scene, this.camera );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( oldClearColor, oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n} );\n\n\n/**\n * TODO\n */\n\nTHREE.SAOShader = {\n\tdefines: {\n\t\t\"NUM_SAMPLES\": 7,\n\t\t\"NUM_RINGS\": 4,\n\t\t\"NORMAL_TEXTURE\": 0,\n\t\t\"DIFFUSE_TEXTURE\": 0,\n\t\t\"DEPTH_PACKING\": 1,\n\t\t\"PERSPECTIVE_CAMERA\": 1\n\t},\n\tuniforms: {\n\n\t\t\"tDepth\": { value: null },\n\t\t\"tDiffuse\": { value: null },\n\t\t\"tNormal\": { value: null },\n\t\t\"size\": { value: new THREE.Vector2( 512, 512 ) },\n\n\t\t\"cameraNear\": { value: 1 },\n\t\t\"cameraFar\": { value: 100 },\n\t\t\"cameraProjectionMatrix\": { value: new THREE.Matrix4() },\n\t\t\"cameraInverseProjectionMatrix\": { value: new THREE.Matrix4() },\n\n\t\t\"scale\": { value: 1.0 },\n\t\t\"intensity\": { value: 0.1 },\n\t\t\"bias\": { value: 0.5 },\n\n\t\t\"minResolution\": { value: 0.0 },\n\t\t\"kernelRadius\": { value: 100.0 },\n\t\t\"randomSeed\": { value: 0.0 }\n\t},\n\tvertexShader: [\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\t\t\"\tvUv = uv;\",\n\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"}\"\n\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#include <common>\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"#if DIFFUSE_TEXTURE == 1\",\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"#endif\",\n\n\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\"#if NORMAL_TEXTURE == 1\",\n\t\t\"uniform sampler2D tNormal;\",\n\t\t\"#endif\",\n\n\t\t\"uniform float cameraNear;\",\n\t\t\"uniform float cameraFar;\",\n\t\t\"uniform mat4 cameraProjectionMatrix;\",\n\t\t\"uniform mat4 cameraInverseProjectionMatrix;\",\n\n\t\t\"uniform float scale;\",\n\t\t\"uniform float intensity;\",\n\t\t\"uniform float bias;\",\n\t\t\"uniform float kernelRadius;\",\n\t\t\"uniform float minResolution;\",\n\t\t\"uniform vec2 size;\",\n\t\t\"uniform float randomSeed;\",\n\n\t\t\"// RGBA depth\",\n\n\t\t\"#include <packing>\",\n\n\t\t\"vec4 getDefaultColor( const in vec2 screenPosition ) {\",\n\t\t\"\t#if DIFFUSE_TEXTURE == 1\",\n\t\t\"\treturn texture2D( tDiffuse, vUv );\",\n\t\t\"\t#else\",\n\t\t\"\treturn vec4( 1.0 );\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"float getDepth( const in vec2 screenPosition ) {\",\n\t\t\"\t#if DEPTH_PACKING == 1\",\n\t\t\"\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\",\n\t\t\"\t#else\",\n\t\t\"\treturn texture2D( tDepth, screenPosition ).x;\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"float getViewZ( const in float depth ) {\",\n\t\t\"\t#if PERSPECTIVE_CAMERA == 1\",\n\t\t\"\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\",\n\t\t\"\t#else\",\n\t\t\"\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"vec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\",\n\t\t\"\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\",\n\t\t\"\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\",\n\t\t\"\tclipPosition *= clipW; // unprojection.\",\n\n\t\t\"\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\",\n\t\t\"}\",\n\n\t\t\"vec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition ) {\",\n\t\t\"\t#if NORMAL_TEXTURE == 1\",\n\t\t\"\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\",\n\t\t\"\t#else\",\n\t\t\"\treturn normalize( cross( dFdx( viewPosition ), dFdy( viewPosition ) ) );\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"float scaleDividedByCameraFar;\",\n\t\t\"float minResolutionMultipliedByCameraFar;\",\n\n\t\t\"float getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\",\n\t\t\"\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\",\n\t\t\"\tfloat viewDistance = length( viewDelta );\",\n\t\t\"\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\",\n\n\t\t\"\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\",\n\t\t\"}\",\n\n\t\t\"// moving costly divides into consts\",\n\t\t\"const float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\",\n\t\t\"const float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\",\n\n\t\t\"float getAmbientOcclusion( const in vec3 centerViewPosition ) {\",\n\t\t\"\t// precompute some variables require in getOcclusion.\",\n\t\t\"\tscaleDividedByCameraFar = scale / cameraFar;\",\n\t\t\"\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\",\n\t\t\"\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv );\",\n\n\t\t\"\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\",\n\t\t\"\tfloat angle = rand( vUv + randomSeed ) * PI2;\",\n\t\t\"\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\",\n\t\t\"\tvec2 radiusStep = radius;\",\n\n\t\t\"\tfloat occlusionSum = 0.0;\",\n\t\t\"\tfloat weightSum = 0.0;\",\n\n\t\t\"\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\",\n\t\t\"\t\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\",\n\t\t\"\t\tradius += radiusStep;\",\n\t\t\"\t\tangle += ANGLE_STEP;\",\n\n\t\t\"\t\tfloat sampleDepth = getDepth( sampleUv );\",\n\t\t\"\t\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\",\n\t\t\"\t\t\tcontinue;\",\n\t\t\"\t\t}\",\n\n\t\t\"\t\tfloat sampleViewZ = getViewZ( sampleDepth );\",\n\t\t\"\t\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\",\n\t\t\"\t\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\",\n\t\t\"\t\tweightSum += 1.0;\",\n\t\t\"\t}\",\n\n\t\t\"\tif( weightSum == 0.0 ) discard;\",\n\n\t\t\"\treturn occlusionSum * ( intensity / weightSum );\",\n\t\t\"}\",\n\n\n\t\t\"void main() {\",\n\t\t\"\tfloat centerDepth = getDepth( vUv );\",\n\t\t\"\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\",\n\t\t\"\t\tdiscard;\",\n\t\t\"\t}\",\n\n\t\t\"\tfloat centerViewZ = getViewZ( centerDepth );\",\n\t\t\"\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\",\n\n\t\t\"\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition );\",\n\n\t\t\"\tgl_FragColor = getDefaultColor( vUv );\",\n\t\t\"\tgl_FragColor.xyz *=  1.0 - ambientOcclusion;\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n\n\n\n\n\n/**\n * TODO\n */\n\nTHREE.DepthLimitedBlurShader = {\n\tdefines: {\n\t\t\"KERNEL_RADIUS\": 4,\n\t\t\"DEPTH_PACKING\": 1,\n\t\t\"PERSPECTIVE_CAMERA\": 1\n\t},\n\tuniforms: {\n\t\t\"tDiffuse\": { value: null },\n\t\t\"size\": { value: new THREE.Vector2( 512, 512 ) },\n\t\t\"sampleUvOffsets\": { value: [ new THREE.Vector2( 0, 0 ) ] },\n\t\t\"sampleWeights\": { value: [ 1.0 ] },\n\t\t\"tDepth\": { value: null },\n\t\t\"cameraNear\": { value: 10 },\n\t\t\"cameraFar\": { value: 1000 },\n\t\t\"depthCutoff\": { value: 10 },\n\t},\n\tvertexShader: [\n\t\t\"#include <common>\",\n\n\t\t\"uniform vec2 size;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec2 vInvSize;\",\n\n\t\t\"void main() {\",\n\t\t\"\tvUv = uv;\",\n\t\t\"\tvInvSize = 1.0 / size;\",\n\n\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\t\t\"}\"\n\n\t].join( \"\\n\" ),\n\tfragmentShader: [\n\t\t\"#include <common>\",\n\t\t\"#include <packing>\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform sampler2D tDepth;\",\n\n\t\t\"uniform float cameraNear;\",\n\t\t\"uniform float cameraFar;\",\n\t\t\"uniform float depthCutoff;\",\n\n\t\t\"uniform vec2 sampleUvOffsets[ KERNEL_RADIUS + 1 ];\",\n\t\t\"uniform float sampleWeights[ KERNEL_RADIUS + 1 ];\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec2 vInvSize;\",\n\n\t\t\"float getDepth( const in vec2 screenPosition ) {\",\n\t\t\"\t#if DEPTH_PACKING == 1\",\n\t\t\"\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\",\n\t\t\"\t#else\",\n\t\t\"\treturn texture2D( tDepth, screenPosition ).x;\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"float getViewZ( const in float depth ) {\",\n\t\t\"\t#if PERSPECTIVE_CAMERA == 1\",\n\t\t\"\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\",\n\t\t\"\t#else\",\n\t\t\"\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\",\n\t\t\"\t#endif\",\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\t\t\"\tfloat depth = getDepth( vUv );\",\n\t\t\"\tif( depth >= ( 1.0 - EPSILON ) ) {\",\n\t\t\"\t\tdiscard;\",\n\t\t\"\t}\",\n\n\t\t\"\tfloat centerViewZ = -getViewZ( depth );\",\n\t\t\"\tbool rBreak = false, lBreak = false;\",\n\n\t\t\"\tfloat weightSum = sampleWeights[0];\",\n\t\t\"\tvec4 diffuseSum = texture2D( tDiffuse, vUv ) * weightSum;\",\n\n\t\t\"\tfor( int i = 1; i <= KERNEL_RADIUS; i ++ ) {\",\n\n\t\t\"\t\tfloat sampleWeight = sampleWeights[i];\",\n\t\t\"\t\tvec2 sampleUvOffset = sampleUvOffsets[i] * vInvSize;\",\n\n\t\t\"\t\tvec2 sampleUv = vUv + sampleUvOffset;\",\n\t\t\"\t\tfloat viewZ = -getViewZ( getDepth( sampleUv ) );\",\n\n\t\t\"\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) rBreak = true;\",\n\n\t\t\"\t\tif( ! rBreak ) {\",\n\t\t\"\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\",\n\t\t\"\t\t\tweightSum += sampleWeight;\",\n\t\t\"\t\t}\",\n\n\t\t\"\t\tsampleUv = vUv - sampleUvOffset;\",\n\t\t\"\t\tviewZ = -getViewZ( getDepth( sampleUv ) );\",\n\n\t\t\"\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) lBreak = true;\",\n\n\t\t\"\t\tif( ! lBreak ) {\",\n\t\t\"\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\",\n\t\t\"\t\t\tweightSum += sampleWeight;\",\n\t\t\"\t\t}\",\n\n\t\t\"\t}\",\n\n\t\t\"\tgl_FragColor = diffuseSum / weightSum;\",\n\t\t\"}\"\n\t].join( \"\\n\" )\n};\n\nTHREE.BlurShaderUtils = {\n\n\tcreateSampleWeights: function ( kernelRadius, stdDev ) {\n\n\t\tvar gaussian = function ( x, stdDev ) {\n\n\t\t\treturn Math.exp( - ( x * x ) / ( 2.0 * ( stdDev * stdDev ) ) ) / ( Math.sqrt( 2.0 * Math.PI ) * stdDev );\n\n\t\t};\n\n\t\tvar weights = [];\n\n\t\tfor ( var i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\tweights.push( gaussian( i, stdDev ) );\n\n\t\t}\n\n\t\treturn weights;\n\n\t},\n\n\tcreateSampleOffsets: function ( kernelRadius, uvIncrement ) {\n\n\t\tvar offsets = [];\n\n\t\tfor ( var i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\toffsets.push( uvIncrement.clone().multiplyScalar( i ) );\n\n\t\t}\n\n\t\treturn offsets;\n\n\t},\n\n\tconfigure: function ( material, kernelRadius, stdDev, uvIncrement ) {\n\n\t\tmaterial.defines[ \"KERNEL_RADIUS\" ] = kernelRadius;\n\t\tmaterial.uniforms[ \"sampleUvOffsets\" ].value = THREE.BlurShaderUtils.createSampleOffsets( kernelRadius, uvIncrement );\n\t\tmaterial.uniforms[ \"sampleWeights\" ].value = THREE.BlurShaderUtils.createSampleWeights( kernelRadius, stdDev );\n\t\tmaterial.needsUpdate = true;\n\n\t}\n\n};\n\n\n\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Unpack RGBA depth shader\n * - show RGBA encoded depth as monochrome color\n */\n\nTHREE.UnpackDepthRGBAShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { value: null },\n\t\t\"opacity\": { value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\"\tvUv = uv;\",\n\t\t\"\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" ),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"#include <packing>\",\n\n\t\t\"void main() {\",\n\n\t\t\"\tfloat depth = 1.0 - unpackRGBAToDepth( texture2D( tDiffuse, vUv ) );\",\n\t\t\"\tgl_FragColor = vec4( vec3( depth ), opacity );\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" )\n\n};\n\n\n\n\n\n/**\n * @author ludobaka / ludobaka.github.io\n * SAO implementation inspired from bhouston previous SAO work\n */\n\nTHREE.SAOPass = function ( scene, camera, depthTexture, useNormals, resolution ) {\n\n\tTHREE.Pass.call( this );\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.clear = true;\n\tthis.needsSwap = false;\n\n\tthis.supportsDepthTextureExtension = ( depthTexture !== undefined ) ? depthTexture : false;\n\tthis.supportsNormalTexture = ( useNormals !== undefined ) ? useNormals : false;\n\n\tthis.originalClearColor = new THREE.Color();\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.params = {\n\t\toutput: 0,\n\t\tsaoBias: 0.5,\n\t\tsaoIntensity: 0.18,\n\t\tsaoScale: 1,\n\t\tsaoKernelRadius: 100,\n\t\tsaoMinResolution: 0,\n\t\tsaoBlur: true,\n\t\tsaoBlurRadius: 8,\n\t\tsaoBlurStdDev: 4,\n\t\tsaoBlurDepthCutoff: 0.01\n\t};\n\n\tthis.resolution = ( resolution !== undefined ) ? new THREE.Vector2( resolution.x, resolution.y ) : new THREE.Vector2( 256, 256 );\n\n\tthis.saoRenderTarget = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, {\n\t\tminFilter: THREE.LinearFilter,\n\t\tmagFilter: THREE.LinearFilter,\n\t\tformat: THREE.RGBAFormat\n\t} );\n\tthis.blurIntermediateRenderTarget = this.saoRenderTarget.clone();\n\tthis.beautyRenderTarget = this.saoRenderTarget.clone();\n\n\tthis.normalRenderTarget = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, {\n\t\tminFilter: THREE.NearestFilter,\n\t\tmagFilter: THREE.NearestFilter,\n\t\tformat: THREE.RGBAFormat\n\t} );\n\tthis.depthRenderTarget = this.normalRenderTarget.clone();\n\n\tif ( this.supportsDepthTextureExtension ) {\n\n\t\tvar depthTexture = new THREE.DepthTexture();\n\t\tdepthTexture.type = THREE.UnsignedShortType;\n\t\tdepthTexture.minFilter = THREE.NearestFilter;\n\t\tdepthTexture.maxFilter = THREE.NearestFilter;\n\n\t\tthis.beautyRenderTarget.depthTexture = depthTexture;\n\t\tthis.beautyRenderTarget.depthBuffer = true;\n\n\t}\n\n\tthis.depthMaterial = new THREE.MeshDepthMaterial();\n\tthis.depthMaterial.depthPacking = THREE.RGBADepthPacking;\n\tthis.depthMaterial.blending = THREE.NoBlending;\n\n\tthis.normalMaterial = new THREE.MeshNormalMaterial();\n\tthis.normalMaterial.blending = THREE.NoBlending;\n\n\tif ( THREE.SAOShader === undefined ) {\n\n\t\tconsole.error( 'THREE.SAOPass relies on THREE.SAOShader' );\n\n\t}\n\n\tthis.saoMaterial = new THREE.ShaderMaterial( {\n\t\tdefines: Object.assign( {}, THREE.SAOShader.defines ),\n\t\tfragmentShader: THREE.SAOShader.fragmentShader,\n\t\tvertexShader: THREE.SAOShader.vertexShader,\n\t\tuniforms: THREE.UniformsUtils.clone( THREE.SAOShader.uniforms )\n\t} );\n\tthis.saoMaterial.extensions.derivatives = true;\n\tthis.saoMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;\n\tthis.saoMaterial.defines[ 'NORMAL_TEXTURE' ] = this.supportsNormalTexture ? 1 : 0;\n\tthis.saoMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\tthis.saoMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;\n\tthis.saoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;\n\tthis.saoMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\tthis.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrix ).invert();\n\tthis.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix;\n\tthis.saoMaterial.blending = THREE.NoBlending;\n\n\tif ( THREE.DepthLimitedBlurShader === undefined ) {\n\n\t\tconsole.error( 'THREE.SAOPass relies on THREE.DepthLimitedBlurShader' );\n\n\t}\n\n\tthis.vBlurMaterial = new THREE.ShaderMaterial( {\n\t\tuniforms: THREE.UniformsUtils.clone( THREE.DepthLimitedBlurShader.uniforms ),\n\t\tdefines: Object.assign( {}, THREE.DepthLimitedBlurShader.defines ),\n\t\tvertexShader: THREE.DepthLimitedBlurShader.vertexShader,\n\t\tfragmentShader: THREE.DepthLimitedBlurShader.fragmentShader\n\t} );\n\tthis.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;\n\tthis.vBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\tthis.vBlurMaterial.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;\n\tthis.vBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;\n\tthis.vBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\tthis.vBlurMaterial.blending = THREE.NoBlending;\n\n\tthis.hBlurMaterial = new THREE.ShaderMaterial( {\n\t\tuniforms: THREE.UniformsUtils.clone( THREE.DepthLimitedBlurShader.uniforms ),\n\t\tdefines: Object.assign( {}, THREE.DepthLimitedBlurShader.defines ),\n\t\tvertexShader: THREE.DepthLimitedBlurShader.vertexShader,\n\t\tfragmentShader: THREE.DepthLimitedBlurShader.fragmentShader\n\t} );\n\tthis.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;\n\tthis.hBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\tthis.hBlurMaterial.uniforms[ 'tDiffuse' ].value = this.blurIntermediateRenderTarget.texture;\n\tthis.hBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;\n\tthis.hBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\tthis.hBlurMaterial.blending = THREE.NoBlending;\n\n\tif ( THREE.CopyShader === undefined ) {\n\n\t\tconsole.error( 'THREE.SAOPass relies on THREE.CopyShader' );\n\n\t}\n\n\tthis.materialCopy = new THREE.ShaderMaterial( {\n\t\tuniforms: THREE.UniformsUtils.clone( THREE.CopyShader.uniforms ),\n\t\tvertexShader: THREE.CopyShader.vertexShader,\n\t\tfragmentShader: THREE.CopyShader.fragmentShader,\n\t\tblending: THREE.NoBlending\n\t} );\n\tthis.materialCopy.transparent = true;\n\tthis.materialCopy.depthTest = false;\n\tthis.materialCopy.depthWrite = false;\n\tthis.materialCopy.blending = THREE.CustomBlending;\n\tthis.materialCopy.blendSrc = THREE.DstColorFactor;\n\tthis.materialCopy.blendDst = THREE.ZeroFactor;\n\tthis.materialCopy.blendEquation = THREE.AddEquation;\n\tthis.materialCopy.blendSrcAlpha = THREE.DstAlphaFactor;\n\tthis.materialCopy.blendDstAlpha = THREE.ZeroFactor;\n\tthis.materialCopy.blendEquationAlpha = THREE.AddEquation;\n\n\tif ( THREE.UnpackDepthRGBAShader === undefined ) {\n\n\t\tconsole.error( 'THREE.SAOPass relies on THREE.UnpackDepthRGBAShader' );\n\n\t}\n\n\tthis.depthCopy = new THREE.ShaderMaterial( {\n\t\tuniforms: THREE.UniformsUtils.clone( THREE.UnpackDepthRGBAShader.uniforms ),\n\t\tvertexShader: THREE.UnpackDepthRGBAShader.vertexShader,\n\t\tfragmentShader: THREE.UnpackDepthRGBAShader.fragmentShader,\n\t\tblending: THREE.NoBlending\n\t} );\n\n\tthis.fsQuad = new THREE.Pass.FullScreenQuad( null );\n\n};\n\nTHREE.SAOPass.OUTPUT = {\n\t'Beauty': 1,\n\t'Default': 0,\n\t'SAO': 2,\n\t'Depth': 3,\n\t'Normal': 4\n};\n\nTHREE.SAOPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {\n\tconstructor: THREE.SAOPass,\n\n\trender: function ( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// Rendering readBuffer first when rendering to screen\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.materialCopy.blending = THREE.NoBlending;\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\t\t\tthis.renderPass( renderer, this.materialCopy, null );\n\n\t\t}\n\n\t\tif ( this.params.output === 1 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.oldClearColor.copy( renderer.getClearColor(new THREE.Color()) );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tvar oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setRenderTarget( this.depthRenderTarget );\n\t\trenderer.clear();\n\n\t\tthis.saoMaterial.uniforms[ 'bias' ].value = this.params.saoBias;\n\t\tthis.saoMaterial.uniforms[ 'intensity' ].value = this.params.saoIntensity;\n\t\tthis.saoMaterial.uniforms[ 'scale' ].value = this.params.saoScale;\n\t\tthis.saoMaterial.uniforms[ 'kernelRadius' ].value = this.params.saoKernelRadius;\n\t\tthis.saoMaterial.uniforms[ 'minResolution' ].value = this.params.saoMinResolution;\n\t\tthis.saoMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.saoMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\t// this.saoMaterial.uniforms['randomSeed'].value = Math.random();\n\n\t\tvar depthCutoff = this.params.saoBlurDepthCutoff * ( this.camera.far - this.camera.near );\n\t\tthis.vBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff;\n\t\tthis.hBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff;\n\n\t\tthis.vBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.vBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\tthis.hBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.hBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\n\t\tthis.params.saoBlurRadius = Math.floor( this.params.saoBlurRadius );\n\t\tif ( ( this.prevStdDev !== this.params.saoBlurStdDev ) || ( this.prevNumSamples !== this.params.saoBlurRadius ) ) {\n\n\t\t\tTHREE.BlurShaderUtils.configure( this.vBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new THREE.Vector2( 0, 1 ) );\n\t\t\tTHREE.BlurShaderUtils.configure( this.hBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new THREE.Vector2( 1, 0 ) );\n\t\t\tthis.prevStdDev = this.params.saoBlurStdDev;\n\t\t\tthis.prevNumSamples = this.params.saoBlurRadius;\n\n\t\t}\n\n\t\t// Rendering scene to depth texture\n\t\trenderer.setClearColor( 0x000000 );\n\t\trenderer.setRenderTarget( this.beautyRenderTarget );\n\t\trenderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// Re-render scene if depth texture extension is not supported\n\t\tif ( ! this.supportsDepthTextureExtension ) {\n\n\t\t\t// Clear rule : far clipping plane in both RGBA and Basic encoding\n\t\t\tthis.renderOverride( renderer, this.depthMaterial, this.depthRenderTarget, 0x000000, 1.0 );\n\n\t\t}\n\n\t\tif ( this.supportsNormalTexture ) {\n\n\t\t\t// Clear rule : default normal is facing the camera\n\t\t\tthis.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );\n\n\t\t}\n\n\t\t// Rendering SAO texture\n\t\tthis.renderPass( renderer, this.saoMaterial, this.saoRenderTarget, 0xffffff, 1.0 );\n\n\t\t// Blurring SAO texture\n\t\tif ( this.params.saoBlur ) {\n\n\t\t\tthis.renderPass( renderer, this.vBlurMaterial, this.blurIntermediateRenderTarget, 0xffffff, 1.0 );\n\t\t\tthis.renderPass( renderer, this.hBlurMaterial, this.saoRenderTarget, 0xffffff, 1.0 );\n\n\t\t}\n\n\t\tvar outputMaterial = this.materialCopy;\n\t\t// Setting up SAO rendering\n\t\tif ( this.params.output === 3 ) {\n\n\t\t\tif ( this.supportsDepthTextureExtension ) {\n\n\t\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.depthTexture;\n\t\t\t\tthis.materialCopy.needsUpdate = true;\n\n\t\t\t} else {\n\n\t\t\t\tthis.depthCopy.uniforms[ 'tDiffuse' ].value = this.depthRenderTarget.texture;\n\t\t\t\tthis.depthCopy.needsUpdate = true;\n\t\t\t\toutputMaterial = this.depthCopy;\n\n\t\t\t}\n\n\t\t} else if ( this.params.output === 4 ) {\n\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\n\t\t} else {\n\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\n\t\t}\n\n\t\t// Blending depends on output, only want a CustomBlending when showing SAO\n\t\tif ( this.params.output === 0 ) {\n\n\t\t\toutputMaterial.blending = THREE.CustomBlending;\n\n\t\t} else {\n\n\t\t\toutputMaterial.blending = THREE.NoBlending;\n\n\t\t}\n\n\t\t// Rendering SAOPass result on top of previous pass\n\t\tthis.renderPass( renderer, outputMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t},\n\n\trenderPass: function ( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\t// save original state\n\t\tthis.originalClearColor.copy( renderer.getClearColor(new THREE.Color()) );\n\t\tvar originalClearAlpha = renderer.getClearAlpha();\n\t\tvar originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t// setup pass state\n\t\trenderer.autoClear = false;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.fsQuad.material = passMaterial;\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this.originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t},\n\n\trenderOverride: function ( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\tthis.originalClearColor.copy( renderer.getClearColor(new THREE.Color()) );\n\t\tvar originalClearAlpha = renderer.getClearAlpha();\n\t\tvar originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = overrideMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = null;\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this.originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tthis.beautyRenderTarget.setSize( width, height );\n\t\tthis.saoRenderTarget.setSize( width, height );\n\t\tthis.blurIntermediateRenderTarget.setSize( width, height );\n\t\tthis.normalRenderTarget.setSize( width, height );\n\t\tthis.depthRenderTarget.setSize( width, height );\n\n\t\tthis.saoMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrix ).invert();\n\t\tthis.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix;\n\t\tthis.saoMaterial.needsUpdate = true;\n\n\t\tthis.vBlurMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.vBlurMaterial.needsUpdate = true;\n\n\t\tthis.hBlurMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.hBlurMaterial.needsUpdate = true;\n\n\t}\n\n} );\n\n\n\n\nPlugin.register('ambient_occlusion', {\n\ttitle: 'Ambient Occlusion',\n\ticon: 'gradient',\n\tauthor: 'JannisX11',\n\tdescription: 'Adds a screen space ambient occlusion shader',\n\ttags: [\"Deprecated\"],\n\tdeprecation_note: \"This plugin can cause visual artifacts and a decreased framerate\",\n\tversion: '1.0.4',\n\tmin_version: '3.2.0',\n\tvariant: 'both',\n\tonload() {\n\n\t\tnew Setting('ambient_occlusion_enabled', {\n\t\t\tname: 'Ambient Occlusion',\n\t\t\tdescription: 'Enable Ambient Occlusion in the Blockbench previews',\n\t\t\tcategory: 'preview',\n\t\t\tvalue: 'true',\n\t\t\tonChange: (value) => {\n\t\t\t\tPreview.all.forEach(preview => {\n\t\t\t\t\tif (!value || preview == MediaPreview) return;\n\t\t\t\t\tpreview.composer.setSize(preview.width, preview.height);\n\t\t\t\t})\n\t\t\t}\n\t\t}) \n\t\tnew Setting('ambient_occlusion_intensity', {\n\t\t\tname: 'Ambient Occlusion Intensity',\n\t\t\tdescription: 'Ambient Occlusion intensity in the Blockbench previews, 50 is the maximum.',\n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 25,\n\t\t\tmin: 0,\n\t\t\tmax: 50,\n\t\t\tonChange: (value) => {\n\t\t\t\tvalue = Math.clamp(value, 0, 50)/100;\n\t\t\t\tPreview.all.forEach(preview => {\n\t\t\t\t\tif (!preview.saoPass || preview == MediaPreview) return;\n\t\t\t\t\tpreview.saoPass.params.saoIntensity = value;\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tfunction setupPreviewSAO(preview) {\n\n\t\t\tvar this_scene = (preview.id == 'display' && Blockbench.isOlderThan('4.3')) ? window.display_scene : scene;\n\n\t\t\tpreview.composer = new THREE.EffectComposer( preview.renderer );\n\t\t\tpreview.renderPass = new THREE.RenderPass( this_scene, preview.camPers );\n\t\t\tpreview.composer.addPass( preview.renderPass );\n\t\t\tpreview.saoPass = new THREE.SAOPass( this_scene, preview.camPers, false, true );\n\t\t\tpreview.composer.addPass( preview.saoPass );\n\n\t\t\tpreview.saoPass.params.saoIntensity = 0.25;\n\t\t\tpreview.saoPass.params.saoScale = 2900;\n\n\t\t}\n\n\n\n\t\tPreview.all.filter(preview => preview != MediaPreview).forEach(setupPreviewSAO)\n\n\t\tPreview.prototype.render = function() {\n\t\t\tthis.controls.update()\n\t\t\t//console.log(Settings.get('ambient_occlusion_enabled') ? 'composer' : 'renderer', this[Settings.get('ambient_occlusion_enabled') ? 'composer' : 'renderer'])\n\t\t\tthis[(Settings.get('ambient_occlusion_enabled') && this !== MediaPreview) ? 'composer' : 'renderer'].render(\n\t\t\t\t(Modes.display && Blockbench.isOlderThan('4.3'))\n\t\t\t\t\t? display_scene\n\t\t\t\t\t: scene,\n\t\t\t\tthis.camera\n\t\t\t)\n\t\t}\n\n\t\tPreview.prototype.resize = function(width, height) {\n\n\t\t\tif (this.canvas.isConnected && this !== MediaPreview) {\n\t\t\t\tthis.height = this.node.parentElement.clientHeight;\n\t\t\t\tthis.width  = this.node.parentElement.clientWidth;\n\t\t\t} else if (height && width) {\n\t\t\t\tthis.height = height;\n\t\t\t\tthis.width = width;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tif (!this.saoPass && this !== MediaPreview) {\n\t\t\t\tsetupPreviewSAO(this);\n\t\t\t}\n\t\n\t\t\tif (this.isOrtho === false) {\n\t\t\t\tthis.camPers.aspect = this.width / this.height\n\t\t\t\tthis.camPers.updateProjectionMatrix();\n\t\t\t} else {\n\t\t\t\tthis.camOrtho.right = this.width / 80\n\t\t\t\tthis.camOrtho.left = this.camOrtho.right*-1\n\t\t\t\tthis.camOrtho.top = this.height / 80\n\t\t\t\tthis.camOrtho.bottom = this.camOrtho.top*-1\n\t\t\t\tthis.camOrtho.updateProjectionMatrix();\n\t\t\t}\n\t\t\t\n\n\t\t\tthis.renderer.setSize(this.width, this.height);\n\n\t\t\tif (Settings.get('ambient_occlusion_enabled') && this !== MediaPreview) this.composer.setSize(this.width, this.height);\n\t\t\tthis.renderer.setPixelRatio(window.devicePixelRatio);\n\t\t\tif (this.canvas.isConnected) {\n\t\t\t\tthis.updateBackground()\n\t\t\t\tif (Transformer) {\n\t\t\t\t\tTransformer.update()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._wasOrtho != this.isOrtho && this !== MediaPreview) {\n\t\t\t\tthis.renderPass.camera = this.camera;\n\t\t\t\tthis.saoPass.camera = this.camera;\n\t\t\t\tthis._wasOrtho == this.isOrtho;\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t},\n\tonunload() {\n\t\tif (settings.ambient_occlusion_enabled) settings.ambient_occlusion_enabled.delete();\n\t\tif (settings.ambient_occlusion_intensity) settings.ambient_occlusion_intensity.delete();\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/animated_java/about.md",
    "content": "<div class=\"blurb animated-java-plugin-page-17qwm57\"><span>Do you wish your Vanilla Minecraft creations could move and animate like the ones in\n\t\tmods? </span>\n\t<span>Are you <i>tired</i> of Minecraft&#39;s </span>\n\t<span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-5000ms\">s</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4925ms\">i</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4850ms\">l</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4775ms\">l</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4700ms\">y</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4625ms\">&nbsp;</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4550ms\">m</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4475ms\">o</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4400ms\">d</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4325ms\">e</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4250ms\">l</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4175ms\">&nbsp;</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4100ms\">l</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-4025ms\">i</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3950ms\">m</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3875ms\">i</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3800ms\">t</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3725ms\">a</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3650ms\">t</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3575ms\">i</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3500ms\">o</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3425ms\">n</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3350ms\">s</span><span class=\"silly animated-java-plugin-page-17qwm57\" style=\"animation-delay:-3275ms\">?</span></span>\n\t<span> Animated Java is here to help! </span></div>\n\n<div style=\"display: flex; align-items: center; height: 64px; margin-top: 8px; \"><h1>Welcome to Animated Java!</h1>\n\t<img src=\"https://github.com/Animated-Java/animated-java/blob/main/src/assets/armor_stand_wave.webp?raw=true\" alt=\"Armor Stand Waving\" width=\"80px\"></div>\n\n<p>Animated Java is a plugin for Blockbench that allows you to create custom animations and models\n\tfor Vanilla Minecraft. It uses the power of Java Edition&#39;s Data Pack and Resource Pack systems\n\tto bring your creations to life!\n</p>\n\n<h3 class=\"animated-java-plugin-page-h3 animated-java-plugin-page-17qwm57\">Features</h3>\n\n<ul><li class=\"animated-java-plugin-page-17qwm57\">Variants: Swap between different textures in-game.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Highly optimized: Hours of performance tests and optimization tweaks have gone into Animated\n\t\tJava&#39;s Exported Data Pack to make sure it has as little performance impact as possible.\n\t</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Limited Molang support. If Blockbench can render it, Animated Java can animate it.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Text Display previewing and animation support.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Resource Pack-less exporting. Animate Vanilla block and item models!</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Locators: Run commands relative to a locators position via keyframes.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Camera Plugin Support: Install the <a href=\"https://www.blockbench.net/plugins/cameras\">Official Camera Plugin</a> to create cinematic camera paths with ease!\n\t</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Animation Tweening: Create smooth transitions between animations.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Many different configuration options.</li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">Complete Documentation at <a href=\"https://animated-java.dev/docs\">animated-java.dev/documentation/</a></li>\n\t<li class=\"animated-java-plugin-page-17qwm57\">And much more!</li></ul>\n\n<h3 class=\"animated-java-plugin-page-h3 animated-java-plugin-page-17qwm57\">Getting started</h3>\n\n<p>To learn the basics of Animated Java, check out our <a href=\"https://animated-java.dev/docs/getting-started/installing-animated-java\">Getting Started</a> guide.\n</p>\n\n<p class=\"note animated-java-plugin-page-17qwm57\"><i>Note that it is <b>highly</b> recommended to have a basic understanding of Java Edition&#39;s Data\n\t\tPack and Resource Pack systems before using Animated Java!</i></p>\n\n<h3 class=\"animated-java-plugin-page-h3 animated-java-plugin-page-17qwm57\">Need Help?</h3>\n\n<p>Check our <a href=\"https://animated-java.dev/docs\">Documentation</a> to find answers to common\n\tquestions or make a post in the\n\t<a href=\"https://discord.gg/adWuKnZD69\">#animated-java-support</a> channel on our\n\t<a href=\"https://animated-java.dev/discord\">Discord</a> server to get help from the community and\n\tdevelopers.\n</p>\n\n<h3 class=\"animated-java-plugin-page-h3 animated-java-plugin-page-17qwm57\">Found a bug?</h3>\n\n<p>If you find a bug, please report it on our <a href=\"https://animated-java.dev/source\">GitHub</a>. It only takes a few moments of your time, and improves the quality of the project for\n\teveryone!\n</p>\n<style>h3.animated-java-plugin-page-17qwm57{border-bottom:1px solid var(--color-accent)}li.animated-java-plugin-page-17qwm57{margin:0px}.blurb.animated-java-plugin-page-17qwm57{margin:0px !important}.note.animated-java-plugin-page-17qwm57{font-size:0.9em;color:var(--color-error)}@keyframes animated-java-plugin-page-17qwm57-wave{0%{transform:translatey(-1px)}50%{transform:translatey(1px)}100%{transform:translatey(-1px)}}.silly.animated-java-plugin-page-17qwm57{display:inline-block;animation:animated-java-plugin-page-17qwm57-wave 1.5s infinite;animation-timing-function:ease-in-out}</style>"
  },
  {
    "path": "plugins/animated_java/animated_java.js",
    "content": "\n//?? ╭─────────────────────────────────────────────────────────────────────────────────╮\n//?? │            ____ _  _ _ _  _ ____ ___ ____ ___      _ ____ _  _ ____             │\n//?? │            |__| |\\ | | |\\/| |__|  |  |___ |  \\     | |__| |  | |__|             │\n//?? │            |  | | \\| | |  | |  |  |  |___ |__/    _| |  |  \\/  |  |             │\n//?? │                                                                                 │\n//?? │                                     v1.8.1                                      │\n//?? │                                                                                 │\n//?? │        Effortlessly craft complex animations for Minecraft: Java Edition        │\n//?? │                                                                                 │\n//?? │                       Created by Titus Evans (SnaveSutit)                       │\n//?? │    (snavesutit@gmail.com) [https://discordapp.com/users/213746232923783168]     │\n//?? │                                                                                 │\n//?? │                             With AMAZING help from                              │\n//?? │                                                                                 │\n//?? │                              Ian Senne (FetchBot)                               │\n//?? │    (contact@iansenne.com) [https://discordapp.com/users/162347688011104256]     │\n//?? │                                                                                 │\n//?? │                          and Jesse Spicer (Dominexis)                           │\n//?? │    (dominexis9@gmail.com) [https://discordapp.com/users/749826119636615229]     │\n//?? │                                                                                 │\n//?? │                               [ SPECIAL THANKS ]                                │\n//?? │                                                                                 │\n//?? │               Howzieky, MulverineX, YokaiS, Ancientkingg, Ersatz,               │\n//?? │               CubeDeveloper, __SK__, MrMakistein, Flubberschnub,                │\n//?? │              legitimoose, VelVoxelRaptor, _JeffWooden, Onnowhere,               │\n//?? │                  DoubleFelix, JayPeaSize, Kastle, Matt/Arwen,                   │\n//?? │                 Nerdrope, Sprunkles, Suso, taj, TheRedstoneer,                  │\n//?? │                   Totigonzales, VioletXIV, CommanderRedstone,                   │\n//?? │                       FabulousCodingFox, ououn, luigiutmc                       │\n//?? │                                                                                 │\n//?? │                                   [ SOURCE ]                                    │\n//?? │                 https://github.com/Animated-Java/animated-java                  │\n//?? │                                                                                 │\n//?? │                                   [ LICENSE ]                                   │\n//?? │ Animated Java - A tool for easily making animations in Minecraft: Java Edition! │\n//?? │                         Copyright (C) 2023 Titus Evans                          │\n//?? │                                                                                 │\n//?? │      This program is free software: you can redistribute it and/or modify       │\n//?? │    it under the terms of the GNU Affero General Public License as published     │\n//?? │      by the Free Software Foundation, either version 3 of the License, or       │\n//?? │                       (at your option) any later version.                       │\n//?? │                                                                                 │\n//?? │         This program is distributed in the hope that it will be useful,         │\n//?? │         but WITHOUT ANY WARRANTY; without even the implied warranty of          │\n//?? │          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          │\n//?? │               GNU Affero General Public License for more details.               │\n//?? │                                                                                 │\n//?? │    You should have received a copy of the GNU Affero General Public License     │\n//?? │     along with this program.  If not, see <https://www.gnu.org/licenses/>.      │\n//?? │                                                                                 │\n//?? │                        GNU AFFERO GENERAL PUBLIC LICENSE                        │\n//?? │                           Version 3, 19 November 2007                           │\n//?? │                                                                                 │\n//?? │      Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>       │\n//?? │          Everyone is permitted to copy and distribute verbatim copies           │\n//?? │            of this license document, but changing it is not allowed.            │\n//?? │                                                                                 │\n//?? │                                    Preamble                                     │\n//?? │                                                                                 │\n//?? │      The GNU Affero General Public License is a free, copyleft license for      │\n//?? │       software and other kinds of works, specifically designed to ensure        │\n//?? │     cooperation with the community in the case of network server software.      │\n//?? │                                                                                 │\n//?? │      The licenses for most software and other practical works are designed      │\n//?? │     to take away your freedom to share and change the works.  By contrast,      │\n//?? │      our General Public Licenses are intended to guarantee your freedom to      │\n//?? │    share and change all versions of a program--to make sure it remains free     │\n//?? │                           software for all its users.                           │\n//?? │                                                                                 │\n//?? │        When we speak of free software, we are referring to freedom, not         │\n//?? │     price.  Our General Public Licenses are designed to make sure that you      │\n//?? │     have the freedom to distribute copies of free software (and charge for      │\n//?? │      them if you wish), that you receive source code or can get it if you       │\n//?? │      want it, that you can change the software or use pieces of it in new       │\n//?? │            free programs, and that you know you can do these things.            │\n//?? │                                                                                 │\n//?? │       Developers that use our General Public Licenses protect your rights       │\n//?? │       with two steps: (1) assert copyright on the software, and (2) offer       │\n//?? │      you this License which gives you legal permission to copy, distribute      │\n//?? │                           and/or modify the software.                           │\n//?? │                                                                                 │\n//?? │           A secondary benefit of defending all users' freedom is that           │\n//?? │         improvements made in alternate versions of the program, if they         │\n//?? │        receive widespread use, become available for other developers to         │\n//?? │        incorporate.  Many developers of free software are heartened and         │\n//?? │        encouraged by the resulting cooperation.  However, in the case of        │\n//?? │      software used on network servers, this result may fail to come about.      │\n//?? │      The GNU General Public License permits making a modified version and       │\n//?? │       letting the public access it on a server without ever releasing its       │\n//?? │                           source code to the public.                            │\n//?? │                                                                                 │\n//?? │        The GNU Affero General Public License is designed specifically to        │\n//?? │     ensure that, in such cases, the modified source code becomes available      │\n//?? │       to the community.  It requires the operator of a network server to        │\n//?? │      provide the source code of the modified version running there to the       │\n//?? │     users of that server.  Therefore, public use of a modified version, on      │\n//?? │       a publicly accessible server, gives the public access to the source       │\n//?? │                          code of the modified version.                          │\n//?? │                                                                                 │\n//?? │         An older license, called the Affero General Public License and          │\n//?? │     published by Affero, was designed to accomplish similar goals.  This is     │\n//?? │      a different license, not a version of the Affero GPL, but Affero has       │\n//?? │    released a new version of the Affero GPL which permits relicensing under     │\n//?? │                                  this license.                                  │\n//?? │                                                                                 │\n//?? │         The precise terms and conditions for copying, distribution and          │\n//?? │                              modification follow.                               │\n//?? │                                                                                 │\n//?? │                              TERMS AND CONDITIONS                               │\n//?? │                                                                                 │\n//?? │                                 0. Definitions.                                 │\n//?? │                                                                                 │\n//?? │  \"This License\" refers to version 3 of the GNU Affero General Public License.   │\n//?? │                                                                                 │\n//?? │     \"Copyright\" also means copyright-like laws that apply to other kinds of     │\n//?? │                       works, such as semiconductor masks.                       │\n//?? │                                                                                 │\n//?? │       \"The Program\" refers to any copyrightable work licensed under this        │\n//?? │         License.  Each licensee is addressed as \"you\".  \"Licensees\" and         │\n//?? │                \"recipients\" may be individuals or organizations.                │\n//?? │                                                                                 │\n//?? │     To \"modify\" a work means to copy from or adapt all or part of the work      │\n//?? │    in a fashion requiring copyright permission, other than the making of an     │\n//?? │      exact copy.  The resulting work is called a \"modified version\" of the      │\n//?? │               earlier work or a work \"based on\" the earlier work.               │\n//?? │                                                                                 │\n//?? │      A \"covered work\" means either the unmodified Program or a work based       │\n//?? │                                 on the Program.                                 │\n//?? │                                                                                 │\n//?? │        To \"propagate\" a work means to do anything with it that, without         │\n//?? │          permission, would make you directly or secondarily liable for          │\n//?? │      infringement under applicable copyright law, except executing it on a      │\n//?? │      computer or modifying a private copy.  Propagation includes copying,       │\n//?? │      distribution (with or without modification), making available to the       │\n//?? │             public, and in some countries other activities as well.             │\n//?? │                                                                                 │\n//?? │       To \"convey\" a work means any kind of propagation that enables other       │\n//?? │    parties to make or receive copies.  Mere interaction with a user through     │\n//?? │        a computer network, with no transfer of a copy, is not conveying.        │\n//?? │                                                                                 │\n//?? │       An interactive user interface displays \"Appropriate Legal Notices\"        │\n//?? │       to the extent that it includes a convenient and prominently visible       │\n//?? │       feature that (1) displays an appropriate copyright notice, and (2)        │\n//?? │      tells the user that there is no warranty for the work (except to the       │\n//?? │       extent that warranties are provided), that licensees may convey the       │\n//?? │      work under this License, and how to view a copy of this License.  If       │\n//?? │      the interface presents a list of user commands or options, such as a       │\n//?? │            menu, a prominent item in the list meets this criterion.             │\n//?? │                                                                                 │\n//?? │                                 1. Source Code.                                 │\n//?? │                                                                                 │\n//?? │        The \"source code\" for a work means the preferred form of the work        │\n//?? │       for making modifications to it.  \"Object code\" means any non-source       │\n//?? │                                 form of a work.                                 │\n//?? │                                                                                 │\n//?? │      A \"Standard Interface\" means an interface that either is an official       │\n//?? │       standard defined by a recognized standards body, or, in the case of       │\n//?? │      interfaces specified for a particular programming language, one that       │\n//?? │            is widely used among developers working in that language.            │\n//?? │                                                                                 │\n//?? │      The \"System Libraries\" of an executable work include anything, other       │\n//?? │      than the work as a whole, that (a) is included in the normal form of       │\n//?? │        packaging a Major Component, but which is not part of that Major         │\n//?? │       Component, and (b) serves only to enable use of the work with that        │\n//?? │       Major Component, or to implement a Standard Interface for which an        │\n//?? │        implementation is available to the public in source code form.  A        │\n//?? │      \"Major Component\", in this context, means a major essential component      │\n//?? │       (kernel, window system, and so on) of the specific operating system       │\n//?? │        (if any) on which the executable work runs, or a compiler used to        │\n//?? │         produce the work, or an object code interpreter used to run it.         │\n//?? │                                                                                 │\n//?? │       The \"Corresponding Source\" for a work in object code form means all       │\n//?? │       the source code needed to generate, install, and (for an executable       │\n//?? │     work) run the object code and to modify the work, including scripts to      │\n//?? │       control those activities.  However, it does not include the work's        │\n//?? │     System Libraries, or general-purpose tools or generally available free      │\n//?? │      programs which are used unmodified in performing those activities but      │\n//?? │       which are not part of the work.  For example, Corresponding Source        │\n//?? │      includes interface definition files associated with source files for       │\n//?? │       the work, and the source code for shared libraries and dynamically        │\n//?? │      linked subprograms that the work is specifically designed to require,      │\n//?? │      such as by intimate data communication or control flow between those       │\n//?? │                    subprograms and other parts of the work.                     │\n//?? │                                                                                 │\n//?? │          The Corresponding Source need not include anything that users          │\n//?? │       can regenerate automatically from other parts of the Corresponding        │\n//?? │                                     Source.                                     │\n//?? │                                                                                 │\n//?? │         The Corresponding Source for a work in source code form is that         │\n//?? │                                   same work.                                    │\n//?? │                                                                                 │\n//?? │                              2. Basic Permissions.                              │\n//?? │                                                                                 │\n//?? │        All rights granted under this License are granted for the term of        │\n//?? │        copyright on the Program, and are irrevocable provided the stated        │\n//?? │       conditions are met.  This License explicitly affirms your unlimited       │\n//?? │      permission to run the unmodified Program.  The output from running a       │\n//?? │      covered work is covered by this License only if the output, given its      │\n//?? │      content, constitutes a covered work.  This License acknowledges your       │\n//?? │      rights of fair use or other equivalent, as provided by copyright law.      │\n//?? │                                                                                 │\n//?? │          You may make, run and propagate covered works that you do not          │\n//?? │      convey, without conditions so long as your license otherwise remains       │\n//?? │     in force.  You may convey covered works to others for the sole purpose      │\n//?? │      of having them make modifications exclusively for you, or provide you      │\n//?? │     with facilities for running those works, provided that you comply with      │\n//?? │      the terms of this License in conveying all material for which you do       │\n//?? │     not control copyright.  Those thus making or running the covered works      │\n//?? │       for you must do so exclusively on your behalf, under your direction       │\n//?? │       and control, on terms that prohibit them from making any copies of        │\n//?? │         your copyrighted material outside their relationship with you.          │\n//?? │                                                                                 │\n//?? │        Conveying under any other circumstances is permitted solely under        │\n//?? │      the conditions stated below.  Sublicensing is not allowed; section 10      │\n//?? │                              makes it unnecessary.                              │\n//?? │                                                                                 │\n//?? │         3. Protecting Users' Legal Rights From Anti-Circumvention Law.          │\n//?? │                                                                                 │\n//?? │       No covered work shall be deemed part of an effective technological        │\n//?? │      measure under any applicable law fulfilling obligations under article      │\n//?? │         11 of the WIPO copyright treaty adopted on 20 December 1996, or         │\n//?? │          similar laws prohibiting or restricting circumvention of such          │\n//?? │                                    measures.                                    │\n//?? │                                                                                 │\n//?? │       When you convey a covered work, you waive any legal power to forbid       │\n//?? │    circumvention of technological measures to the extent such circumvention     │\n//?? │       is effected by exercising rights under this License with respect to       │\n//?? │     the covered work, and you disclaim any intention to limit operation or      │\n//?? │      modification of the work as a means of enforcing, against the work's       │\n//?? │      users, your or third parties' legal rights to forbid circumvention of      │\n//?? │                             technological measures.                             │\n//?? │                                                                                 │\n//?? │                          4. Conveying Verbatim Copies.                          │\n//?? │                                                                                 │\n//?? │       You may convey verbatim copies of the Program's source code as you        │\n//?? │         receive it, in any medium, provided that you conspicuously and          │\n//?? │       appropriately publish on each copy an appropriate copyright notice;       │\n//?? │            keep intact all notices stating that this License and any            │\n//?? │     non-permissive terms added in accord with section 7 apply to the code;      │\n//?? │      keep intact all notices of the absence of any warranty; and give all       │\n//?? │            recipients a copy of this License along with the Program.            │\n//?? │                                                                                 │\n//?? │       You may charge any price or no price for each copy that you convey,       │\n//?? │           and you may offer support or warranty protection for a fee.           │\n//?? │                                                                                 │\n//?? │                     5. Conveying Modified Source Versions.                      │\n//?? │                                                                                 │\n//?? │       You may convey a work based on the Program, or the modifications to       │\n//?? │        produce it from the Program, in the form of source code under the        │\n//?? │    terms of section 4, provided that you also meet all of these conditions:     │\n//?? │                                                                                 │\n//?? │       a) The work must carry prominent notices stating that you modified        │\n//?? │                         it, and giving a relevant date.                         │\n//?? │                                                                                 │\n//?? │           b) The work must carry prominent notices stating that it is           │\n//?? │       released under this License and any conditions added under section        │\n//?? │          7.  This requirement modifies the requirement in section 4 to          │\n//?? │                           \"keep intact all notices\".                            │\n//?? │                                                                                 │\n//?? │           c) You must license the entire work, as a whole, under this           │\n//?? │          License to anyone who comes into possession of a copy.  This           │\n//?? │        License will therefore apply, along with any applicable section 7        │\n//?? │         additional terms, to the whole of the work, and all its parts,          │\n//?? │           regardless of how they are packaged.  This License gives no           │\n//?? │        permission to license the work in any other way, but it does not         │\n//?? │         invalidate such permission if you have separately received it.          │\n//?? │                                                                                 │\n//?? │        d) If the work has interactive user interfaces, each must display        │\n//?? │       Appropriate Legal Notices; however, if the Program has interactive        │\n//?? │         interfaces that do not display Appropriate Legal Notices, your          │\n//?? │                         work need not make them do so.                          │\n//?? │                                                                                 │\n//?? │       A compilation of a covered work with other separate and independent       │\n//?? │      works, which are not by their nature extensions of the covered work,       │\n//?? │      and which are not combined with it such as to form a larger program,       │\n//?? │       in or on a volume of a storage or distribution medium, is called an       │\n//?? │       \"aggregate\" if the compilation and its resulting copyright are not        │\n//?? │       used to limit the access or legal rights of the compilation's users       │\n//?? │      beyond what the individual works permit.  Inclusion of a covered work      │\n//?? │        in an aggregate does not cause this License to apply to the other        │\n//?? │                             parts of the aggregate.                             │\n//?? │                                                                                 │\n//?? │                         6. Conveying Non-Source Forms.                          │\n//?? │                                                                                 │\n//?? │        You may convey a covered work in object code form under the terms        │\n//?? │             of sections 4 and 5, provided that you also convey the              │\n//?? │     machine-readable Corresponding Source under the terms of this License,      │\n//?? │                              in one of these ways:                              │\n//?? │                                                                                 │\n//?? │        a) Convey the object code in, or embodied in, a physical product         │\n//?? │         (including a physical distribution medium), accompanied by the          │\n//?? │             Corresponding Source fixed on a durable physical medium             │\n//?? │                   customarily used for software interchange.                    │\n//?? │                                                                                 │\n//?? │        b) Convey the object code in, or embodied in, a physical product         │\n//?? │          (including a physical distribution medium), accompanied by a           │\n//?? │         written offer, valid for at least three years and valid for as          │\n//?? │       long as you offer spare parts or customer support for that product        │\n//?? │        model, to give anyone who possesses the object code either (1) a         │\n//?? │          copy of the Corresponding Source for all the software in the           │\n//?? │         product that is covered by this License, on a durable physical          │\n//?? │        medium customarily used for software interchange, for a price no         │\n//?? │          more than your reasonable cost of physically performing this           │\n//?? │                 conveying of source, or (2) access to copy the                  │\n//?? │            Corresponding Source from a network server at no charge.             │\n//?? │                                                                                 │\n//?? │        c) Convey individual copies of the object code with a copy of the        │\n//?? │            written offer to provide the Corresponding Source.  This             │\n//?? │        alternative is allowed only occasionally and noncommercially, and        │\n//?? │       only if you received the object code with such an offer, in accord        │\n//?? │                               with subsection 6b.                               │\n//?? │                                                                                 │\n//?? │         d) Convey the object code by offering access from a designated          │\n//?? │       place (gratis or for a charge), and offer equivalent access to the        │\n//?? │        Corresponding Source in the same way through the same place at no        │\n//?? │          further charge.  You need not require recipients to copy the           │\n//?? │        Corresponding Source along with the object code.  If the place to        │\n//?? │       copy the object code is a network server, the Corresponding Source        │\n//?? │         may be on a different server (operated by you or a third party)         │\n//?? │       that supports equivalent copying facilities, provided you maintain        │\n//?? │        clear directions next to the object code saying where to find the        │\n//?? │           Corresponding Source.  Regardless of what server hosts the            │\n//?? │         Corresponding Source, you remain obligated to ensure that it is         │\n//?? │         available for as long as needed to satisfy these requirements.          │\n//?? │                                                                                 │\n//?? │       e) Convey the object code using peer-to-peer transmission, provided       │\n//?? │         you inform other peers where the object code and Corresponding          │\n//?? │        Source of the work are being offered to the general public at no         │\n//?? │                           charge under subsection 6d.                           │\n//?? │                                                                                 │\n//?? │      A separable portion of the object code, whose source code is excluded      │\n//?? │         from the Corresponding Source as a System Library, need not be          │\n//?? │                   included in conveying the object code work.                   │\n//?? │                                                                                 │\n//?? │      A \"User Product\" is either (1) a \"consumer product\", which means any       │\n//?? │     tangible personal property which is normally used for personal, family,     │\n//?? │    or household purposes, or (2) anything designed or sold for incorporation    │\n//?? │    into a dwelling.  In determining whether a product is a consumer product,    │\n//?? │    doubtful cases shall be resolved in favor of coverage.  For a particular     │\n//?? │       product received by a particular user, \"normally used\" refers to a        │\n//?? │    typical or common use of that class of product, regardless of the status     │\n//?? │        of the particular user or of the way in which the particular user        │\n//?? │    actually uses, or expects or is expected to use, the product.  A product     │\n//?? │     is a consumer product regardless of whether the product has substantial     │\n//?? │     commercial, industrial or non-consumer uses, unless such uses represent     │\n//?? │                the only significant mode of use of the product.                 │\n//?? │                                                                                 │\n//?? │        \"Installation Information\" for a User Product means any methods,         │\n//?? │    procedures, authorization keys, or other information required to install     │\n//?? │    and execute modified versions of a covered work in that User Product from    │\n//?? │      a modified version of its Corresponding Source.  The information must      │\n//?? │     suffice to ensure that the continued functioning of the modified object     │\n//?? │         code is in no case prevented or interfered with solely because          │\n//?? │                           modification has been made.                           │\n//?? │                                                                                 │\n//?? │      If you convey an object code work under this section in, or with, or       │\n//?? │      specifically for use in, a User Product, and the conveying occurs as       │\n//?? │      part of a transaction in which the right of possession and use of the      │\n//?? │       User Product is transferred to the recipient in perpetuity or for a       │\n//?? │      fixed term (regardless of how the transaction is characterized), the       │\n//?? │      Corresponding Source conveyed under this section must be accompanied       │\n//?? │      by the Installation Information.  But this requirement does not apply      │\n//?? │        if neither you nor any third party retains the ability to install        │\n//?? │       modified object code on the User Product (for example, the work has       │\n//?? │                             been installed in ROM).                             │\n//?? │                                                                                 │\n//?? │     The requirement to provide Installation Information does not include a      │\n//?? │    requirement to continue to provide support service, warranty, or updates     │\n//?? │     for a work that has been modified or installed by the recipient, or for     │\n//?? │    the User Product in which it has been modified or installed.  Access to a    │\n//?? │        network may be denied when the modification itself materially and        │\n//?? │    adversely affects the operation of the network or violates the rules and     │\n//?? │                 protocols for communication across the network.                 │\n//?? │                                                                                 │\n//?? │      Corresponding Source conveyed, and Installation Information provided,      │\n//?? │        in accord with this section must be in a format that is publicly         │\n//?? │        documented (and with an implementation available to the public in        │\n//?? │       source code form), and must require no special password or key for        │\n//?? │                         unpacking, reading or copying.                          │\n//?? │                                                                                 │\n//?? │                              7. Additional Terms.                               │\n//?? │                                                                                 │\n//?? │      \"Additional permissions\" are terms that supplement the terms of this       │\n//?? │        License by making exceptions from one or more of its conditions.         │\n//?? │     Additional permissions that are applicable to the entire Program shall      │\n//?? │     be treated as though they were included in this License, to the extent      │\n//?? │      that they are valid under applicable law.  If additional permissions       │\n//?? │       apply only to part of the Program, that part may be used separately       │\n//?? │       under those permissions, but the entire Program remains governed by       │\n//?? │           this License without regard to the additional permissions.            │\n//?? │                                                                                 │\n//?? │        When you convey a copy of a covered work, you may at your option         │\n//?? │      remove any additional permissions from that copy, or from any part of      │\n//?? │        it.  (Additional permissions may be written to require their own         │\n//?? │       removal in certain cases when you modify the work.)  You may place        │\n//?? │       additional permissions on material, added by you to a covered work,       │\n//?? │        for which you have or can give appropriate copyright permission.         │\n//?? │                                                                                 │\n//?? │      Notwithstanding any other provision of this License, for material you      │\n//?? │    add to a covered work, you may (if authorized by the copyright holders of    │\n//?? │         that material) supplement the terms of this License with terms:         │\n//?? │                                                                                 │\n//?? │       a) Disclaiming warranty or limiting liability differently from the        │\n//?? │                 terms of sections 15 and 16 of this License; or                 │\n//?? │                                                                                 │\n//?? │       b) Requiring preservation of specified reasonable legal notices or        │\n//?? │        author attributions in that material or in the Appropriate Legal         │\n//?? │                  Notices displayed by works containing it; or                   │\n//?? │                                                                                 │\n//?? │       c) Prohibiting misrepresentation of the origin of that material, or       │\n//?? │         requiring that modified versions of such material be marked in          │\n//?? │           reasonable ways as different from the original version; or            │\n//?? │                                                                                 │\n//?? │       d) Limiting the use for publicity purposes of names of licensors or       │\n//?? │                           authors of the material; or                           │\n//?? │                                                                                 │\n//?? │        e) Declining to grant rights under trademark law for use of some         │\n//?? │                  trade names, trademarks, or service marks; or                  │\n//?? │                                                                                 │\n//?? │          f) Requiring indemnification of licensors and authors of that          │\n//?? │      material by anyone who conveys the material (or modified versions of       │\n//?? │       it) with contractual assumptions of liability to the recipient, for       │\n//?? │       any liability that these contractual assumptions directly impose on       │\n//?? │                          those licensors and authors.                           │\n//?? │                                                                                 │\n//?? │        All other non-permissive additional terms are considered \"further        │\n//?? │     restrictions\" within the meaning of section 10.  If the Program as you      │\n//?? │      received it, or any part of it, contains a notice stating that it is       │\n//?? │          governed by this License along with a term that is a further           │\n//?? │     restriction, you may remove that term.  If a license document contains      │\n//?? │      a further restriction but permits relicensing or conveying under this      │\n//?? │      License, you may add to a covered work material governed by the terms      │\n//?? │      of that license document, provided that the further restriction does       │\n//?? │                   not survive such relicensing or conveying.                    │\n//?? │                                                                                 │\n//?? │       If you add terms to a covered work in accord with this section, you       │\n//?? │          must place, in the relevant source files, a statement of the           │\n//?? │       additional terms that apply to those files, or a notice indicating        │\n//?? │                       where to find the applicable terms.                       │\n//?? │                                                                                 │\n//?? │      Additional terms, permissive or non-permissive, may be stated in the       │\n//?? │         form of a separately written license, or stated as exceptions;          │\n//?? │                    the above requirements apply either way.                     │\n//?? │                                                                                 │\n//?? │                                 8. Termination.                                 │\n//?? │                                                                                 │\n//?? │       You may not propagate or modify a covered work except as expressly        │\n//?? │       provided under this License.  Any attempt otherwise to propagate or       │\n//?? │      modify it is void, and will automatically terminate your rights under      │\n//?? │       this License (including any patent licenses granted under the third       │\n//?? │                            paragraph of section 11).                            │\n//?? │                                                                                 │\n//?? │         However, if you cease all violation of this License, then your          │\n//?? │          license from a particular copyright holder is reinstated (a)           │\n//?? │       provisionally, unless and until the copyright holder explicitly and       │\n//?? │     finally terminates your license, and (b) permanently, if the copyright      │\n//?? │      holder fails to notify you of the violation by some reasonable means       │\n//?? │                      prior to 60 days after the cessation.                      │\n//?? │                                                                                 │\n//?? │          Moreover, your license from a particular copyright holder is           │\n//?? │       reinstated permanently if the copyright holder notifies you of the        │\n//?? │       violation by some reasonable means, this is the first time you have       │\n//?? │      received notice of violation of this License (for any work) from that      │\n//?? │       copyright holder, and you cure the violation prior to 30 days after       │\n//?? │                           your receipt of the notice.                           │\n//?? │                                                                                 │\n//?? │      Termination of your rights under this section does not terminate the       │\n//?? │      licenses of parties who have received copies or rights from you under      │\n//?? │     this License.  If your rights have been terminated and not permanently      │\n//?? │       reinstated, you do not qualify to receive new licenses for the same       │\n//?? │                           material under section 10.                            │\n//?? │                                                                                 │\n//?? │                  9. Acceptance Not Required for Having Copies.                  │\n//?? │                                                                                 │\n//?? │       You are not required to accept this License in order to receive or        │\n//?? │       run a copy of the Program.  Ancillary propagation of a covered work       │\n//?? │      occurring solely as a consequence of using peer-to-peer transmission       │\n//?? │        to receive a copy likewise does not require acceptance.  However,        │\n//?? │      nothing other than this License grants you permission to propagate or      │\n//?? │      modify any covered work.  These actions infringe copyright if you do       │\n//?? │       not accept this License.  Therefore, by modifying or propagating a        │\n//?? │      covered work, you indicate your acceptance of this License to do so.       │\n//?? │                                                                                 │\n//?? │                10. Automatic Licensing of Downstream Recipients.                │\n//?? │                                                                                 │\n//?? │        Each time you convey a covered work, the recipient automatically         │\n//?? │       receives a license from the original licensors, to run, modify and        │\n//?? │     propagate that work, subject to this License.  You are not responsible      │\n//?? │          for enforcing compliance by third parties with this License.           │\n//?? │                                                                                 │\n//?? │       An \"entity transaction\" is a transaction transferring control of an       │\n//?? │       organization, or substantially all assets of one, or subdividing an       │\n//?? │      organization, or merging organizations.  If propagation of a covered       │\n//?? │           work results from an entity transaction, each party to that           │\n//?? │       transaction who receives a copy of the work also receives whatever        │\n//?? │      licenses to the work the party's predecessor in interest had or could      │\n//?? │      give under the previous paragraph, plus a right to possession of the       │\n//?? │      Corresponding Source of the work from the predecessor in interest, if      │\n//?? │          the predecessor has it or can get it with reasonable efforts.          │\n//?? │                                                                                 │\n//?? │       You may not impose any further restrictions on the exercise of the        │\n//?? │      rights granted or affirmed under this License.  For example, you may       │\n//?? │       not impose a license fee, royalty, or other charge for exercise of        │\n//?? │     rights granted under this License, and you may not initiate litigation      │\n//?? │      (including a cross-claim or counterclaim in a lawsuit) alleging that       │\n//?? │      any patent claim is infringed by making, using, selling, offering for      │\n//?? │              sale, or importing the Program or any portion of it.               │\n//?? │                                                                                 │\n//?? │                                  11. Patents.                                   │\n//?? │                                                                                 │\n//?? │       A \"contributor\" is a copyright holder who authorizes use under this       │\n//?? │      License of the Program or a work on which the Program is based.  The       │\n//?? │      work thus licensed is called the contributor's \"contributor version\".      │\n//?? │                                                                                 │\n//?? │         A contributor's \"essential patent claims\" are all patent claims         │\n//?? │       owned or controlled by the contributor, whether already acquired or       │\n//?? │      hereafter acquired, that would be infringed by some manner, permitted      │\n//?? │     by this License, of making, using, or selling its contributor version,      │\n//?? │           but do not include claims that would be infringed only as a           │\n//?? │      consequence of further modification of the contributor version.  For       │\n//?? │       purposes of this definition, \"control\" includes the right to grant        │\n//?? │       patent sublicenses in a manner consistent with the requirements of        │\n//?? │                                  this License.                                  │\n//?? │                                                                                 │\n//?? │      Each contributor grants you a non-exclusive, worldwide, royalty-free       │\n//?? │       patent license under the contributor's essential patent claims, to        │\n//?? │      make, use, sell, offer for sale, import and otherwise run, modify and      │\n//?? │               propagate the contents of its contributor version.                │\n//?? │                                                                                 │\n//?? │      In the following three paragraphs, a \"patent license\" is any express       │\n//?? │      agreement or commitment, however denominated, not to enforce a patent      │\n//?? │     (such as an express permission to practice a patent or covenant not to      │\n//?? │      sue for patent infringement).  To \"grant\" such a patent license to a       │\n//?? │      party means to make such an agreement or commitment not to enforce a       │\n//?? │                            patent against the party.                            │\n//?? │                                                                                 │\n//?? │      If you convey a covered work, knowingly relying on a patent license,       │\n//?? │      and the Corresponding Source of the work is not available for anyone       │\n//?? │     to copy, free of charge and under the terms of this License, through a      │\n//?? │      publicly available network server or other readily accessible means,       │\n//?? │        then you must either (1) cause the Corresponding Source to be so         │\n//?? │       available, or (2) arrange to deprive yourself of the benefit of the       │\n//?? │      patent license for this particular work, or (3) arrange, in a manner       │\n//?? │     consistent with the requirements of this License, to extend the patent      │\n//?? │      license to downstream recipients.  \"Knowingly relying\" means you have      │\n//?? │      actual knowledge that, but for the patent license, your conveying the      │\n//?? │     covered work in a country, or your recipient's use of the covered work      │\n//?? │      in a country, would infringe one or more identifiable patents in that      │\n//?? │               country that you have reason to believe are valid.                │\n//?? │                                                                                 │\n//?? │          If, pursuant to or in connection with a single transaction or          │\n//?? │       arrangement, you convey, or propagate by procuring conveyance of, a       │\n//?? │         covered work, and grant a patent license to some of the parties         │\n//?? │      receiving the covered work authorizing them to use, propagate, modify      │\n//?? │     or convey a specific copy of the covered work, then the patent license      │\n//?? │      you grant is automatically extended to all recipients of the covered       │\n//?? │                           work and works based on it.                           │\n//?? │                                                                                 │\n//?? │       A patent license is \"discriminatory\" if it does not include within        │\n//?? │           the scope of its coverage, prohibits the exercise of, or is           │\n//?? │      conditioned on the non-exercise of one or more of the rights that are      │\n//?? │     specifically granted under this License.  You may not convey a covered      │\n//?? │      work if you are a party to an arrangement with a third party that is       │\n//?? │     in the business of distributing software, under which you make payment      │\n//?? │      to the third party based on the extent of your activity of conveying       │\n//?? │         the work, and under which the third party grants, to any of the         │\n//?? │      parties who would receive the covered work from you, a discriminatory      │\n//?? │        patent license (a) in connection with copies of the covered work         │\n//?? │      conveyed by you (or copies made from those copies), or (b) primarily       │\n//?? │        for and in connection with specific products or compilations that        │\n//?? │       contain the covered work, unless you entered into that arrangement,       │\n//?? │           or that patent license was granted, prior to 28 March 2007.           │\n//?? │                                                                                 │\n//?? │       Nothing in this License shall be construed as excluding or limiting       │\n//?? │         any implied license or other defenses to infringement that may          │\n//?? │           otherwise be available to you under applicable patent law.            │\n//?? │                                                                                 │\n//?? │                      12. No Surrender of Others' Freedom.                       │\n//?? │                                                                                 │\n//?? │     If conditions are imposed on you (whether by court order, agreement or      │\n//?? │     otherwise) that contradict the conditions of this License, they do not      │\n//?? │     excuse you from the conditions of this License.  If you cannot convey a     │\n//?? │    covered work so as to satisfy simultaneously your obligations under this     │\n//?? │   License and any other pertinent obligations, then as a consequence you may    │\n//?? │   not convey it at all.  For example, if you agree to terms that obligate you   │\n//?? │    to collect a royalty for further conveying from those to whom you convey     │\n//?? │      the Program, the only way you could satisfy both those terms and this      │\n//?? │        License would be to refrain entirely from conveying the Program.         │\n//?? │                                                                                 │\n//?? │    13. Remote Network Interaction; Use with the GNU General Public License.     │\n//?? │                                                                                 │\n//?? │     Notwithstanding any other provision of this License, if you modify the      │\n//?? │         Program, your modified version must prominently offer all users         │\n//?? │    interacting with it remotely through a computer network (if your version     │\n//?? │     supports such interaction) an opportunity to receive the Corresponding      │\n//?? │     Source of your version by providing access to the Corresponding Source      │\n//?? │     from a network server at no charge, through some standard or customary      │\n//?? │      means of facilitating copying of software.  This Corresponding Source      │\n//?? │    shall include the Corresponding Source for any work covered by version 3     │\n//?? │     of the GNU General Public License that is incorporated pursuant to the      │\n//?? │                              following paragraph.                               │\n//?? │                                                                                 │\n//?? │          Notwithstanding any other provision of this License, you have          │\n//?? │       permission to link or combine any covered work with a work licensed       │\n//?? │         under version 3 of the GNU General Public License into a single         │\n//?? │       combined work, and to convey the resulting work.  The terms of this       │\n//?? │      License will continue to apply to the part which is the covered work,      │\n//?? │     but the work with which it is combined will remain governed by version      │\n//?? │                      3 of the GNU General Public License.                       │\n//?? │                                                                                 │\n//?? │                      14. Revised Versions of this License.                      │\n//?? │                                                                                 │\n//?? │     The Free Software Foundation may publish revised and/or new versions of     │\n//?? │   the GNU Affero General Public License from time to time.  Such new versions   │\n//?? │  will be similar in spirit to the present version, but may differ in detail to  │\n//?? │                        address new problems or concerns.                        │\n//?? │                                                                                 │\n//?? │         Each version is given a distinguishing version number.  If the          │\n//?? │   Program specifies that a certain numbered version of the GNU Affero General   │\n//?? │        Public License \"or any later version\" applies to it, you have the        │\n//?? │      option of following the terms and conditions either of that numbered       │\n//?? │         version or of any later version published by the Free Software          │\n//?? │      Foundation.  If the Program does not specify a version number of the       │\n//?? │  GNU Affero General Public License, you may choose any version ever published   │\n//?? │                        by the Free Software Foundation.                         │\n//?? │                                                                                 │\n//?? │          If the Program specifies that a proxy can decide which future          │\n//?? │   versions of the GNU Affero General Public License can be used, that proxy's   │\n//?? │     public statement of acceptance of a version permanently authorizes you      │\n//?? │                     to choose that version for the Program.                     │\n//?? │                                                                                 │\n//?? │           Later license versions may give you additional or different           │\n//?? │       permissions.  However, no additional obligations are imposed on any       │\n//?? │       author or copyright holder as a result of your choosing to follow a       │\n//?? │                                 later version.                                  │\n//?? │                                                                                 │\n//?? │                           15. Disclaimer of Warranty.                           │\n//?? │                                                                                 │\n//?? │        THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY         │\n//?? │     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT      │\n//?? │    HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY    │\n//?? │    OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,     │\n//?? │     THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR      │\n//?? │   PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM    │\n//?? │    IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF     │\n//?? │                 ALL NECESSARY SERVICING, REPAIR OR CORRECTION.                  │\n//?? │                                                                                 │\n//?? │                          16. Limitation of Liability.                           │\n//?? │                                                                                 │\n//?? │      IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING      │\n//?? │    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS    │\n//?? │   THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY   │\n//?? │    GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE     │\n//?? │    USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF    │\n//?? │   DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD    │\n//?? │    PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),     │\n//?? │    EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF    │\n//?? │                                  SUCH DAMAGES.                                  │\n//?? │                                                                                 │\n//?? │                    17. Interpretation of Sections 15 and 16.                    │\n//?? │                                                                                 │\n//?? │       If the disclaimer of warranty and limitation of liability provided        │\n//?? │       above cannot be given local legal effect according to their terms,        │\n//?? │      reviewing courts shall apply local law that most closely approximates      │\n//?? │        an absolute waiver of all civil liability in connection with the         │\n//?? │       Program, unless a warranty or assumption of liability accompanies a       │\n//?? │                    copy of the Program in return for a fee.                     │\n//?? │                                                                                 │\n//?? │                           END OF TERMS AND CONDITIONS                           │\n//?? │                                                                                 │\n//?? │                  How to Apply These Terms to Your New Programs                  │\n//?? │                                                                                 │\n//?? │       If you develop a new program, and you want it to be of the greatest       │\n//?? │     possible use to the public, the best way to achieve this is to make it      │\n//?? │   free software which everyone can redistribute and change under these terms.   │\n//?? │                                                                                 │\n//?? │      To do so, attach the following notices to the program.  It is safest       │\n//?? │       to attach them to the start of each source file to most effectively       │\n//?? │       state the exclusion of warranty; and each file should have at least       │\n//?? │      the \"copyright\" line and a pointer to where the full notice is found.      │\n//?? │                                                                                 │\n//?? │     <one line to give the program's name and a brief idea of what it does.>     │\n//?? │                     Copyright (C) <year>  <name of author>                      │\n//?? │                                                                                 │\n//?? │      This program is free software: you can redistribute it and/or modify       │\n//?? │    it under the terms of the GNU Affero General Public License as published     │\n//?? │      by the Free Software Foundation, either version 3 of the License, or       │\n//?? │                       (at your option) any later version.                       │\n//?? │                                                                                 │\n//?? │         This program is distributed in the hope that it will be useful,         │\n//?? │         but WITHOUT ANY WARRANTY; without even the implied warranty of          │\n//?? │          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          │\n//?? │               GNU Affero General Public License for more details.               │\n//?? │                                                                                 │\n//?? │    You should have received a copy of the GNU Affero General Public License     │\n//?? │     along with this program.  If not, see <https://www.gnu.org/licenses/>.      │\n//?? │                                                                                 │\n//?? │    Also add information on how to contact you by electronic and paper mail.     │\n//?? │                                                                                 │\n//?? │      If your software can interact with users remotely through a computer       │\n//?? │     network, you should also make sure that it provides a way for users to      │\n//?? │     get its source.  For example, if your program is a web application, its     │\n//?? │     interface could display a \"Source\" link that leads users to an archive      │\n//?? │     of the code.  There are many ways you could offer source, and different     │\n//?? │     solutions will be better for different programs; see section 13 for the     │\n//?? │                             specific requirements.                              │\n//?? │                                                                                 │\n//?? │   You should also get your employer (if you work as a programmer) or school,    │\n//?? │     if any, to sign a \"copyright disclaimer\" for the program, if necessary.     │\n//?? │   For more information on this, and how to apply and follow the GNU AGPL, see   │\n//?? │                        <https://www.gnu.org/licenses/>.                         │\n//?? │                                                                                 │\n//?? ╰─────────────────────────────────────────────────────────────────────────────────╯\n\n(() => {\n\tif (!compareVersions('5.0.0', Blockbench.version)) {\n\t\tconst message = `\n# Animated Java does not work in Blockbench 5\n\nYou will need to install and use Blockbench v4.12.6 to use Animated Java until it is updated to support 5.\n\n## How to install Blockbench v4.12.6\n\n1. Download the portable version of Blockbench 4.12.6 [here](https://github.com/JannisX11/blockbench/releases/download/v4.12.6/Blockbench_4.12.6_portable.exe).\n2. Once it's finished downloading, double click the .exe file to run it.\n\nIf you're familiar with command line interfaces, you can use [Envbench](https://www.npmjs.com/package/envbench) to install and manage multiple Blockbench versions side by side.\n`;\n\t\tBlockbench.showMessageBox({title: 'Animated Java - Incompatible Blockbench Version',message,width:600});\n\t\trequestAnimationFrame(() => Plugins.registered['animated_java'].uninstall());\n\t\tthrow new Error(message);\n\t}\n})()\n\n\"use strict\";(()=>{var xI=Object.create;var ys=Object.defineProperty;var jy=Object.getOwnPropertyDescriptor;var vI=Object.getOwnPropertyNames;var bI=Object.getPrototypeOf,yI=Object.prototype.hasOwnProperty;var wI=(t,e,n)=>e in t?ys(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var s=(t,e)=>ys(t,\"name\",{value:e,configurable:!0}),Ee=(t=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(t,{get:(e,n)=>(typeof require<\"u\"?require:e)[n]}):t)(function(t){if(typeof require<\"u\")return require.apply(this,arguments);throw new Error('Dynamic require of \"'+t+'\" is not supported')});var EI=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),vn=(t,e)=>{for(var n in e)ys(t,n,{get:e[n],enumerable:!0})},Ay=(t,e,n,i)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let a of vI(e))!yI.call(t,a)&&a!==n&&ys(t,a,{get:()=>e[a],enumerable:!(i=jy(e,a))||i.enumerable});return t};var wi=(t,e,n)=>(n=t!=null?xI(bI(t)):{},Ay(e||!t||!t.__esModule?ys(n,\"default\",{value:t,enumerable:!0}):n,t)),nu=t=>Ay(ys({},\"__esModule\",{value:!0}),t),Do=(t,e,n,i)=>{for(var a=i>1?void 0:i?jy(e,n):e,r=t.length-1,o;r>=0;r--)(o=t[r])&&(a=(i?o(e,n,a):o(a))||a);return i&&a&&ys(e,n,a),a};var lt=(t,e,n)=>(wI(t,typeof e!=\"symbol\"?e+\"\":e,n),n);var kI=t=>new Uint8Array(Buffer.from(t,\"base64\"));var Dl={};vn(Dl,{Buffer:()=>ks});var ks,No=EI(()=>{ks=globalThis.Buffer});var Cp=oe((zg,c1)=>{var Tp=(No(),nu(Dl)),hr=Tp.Buffer;function l1(t,e){for(var n in t)e[n]=t[n]}s(l1,\"copyProps\");hr.from&&hr.alloc&&hr.allocUnsafe&&hr.allocUnsafeSlow?c1.exports=Tp:(l1(Tp,zg),zg.Buffer=js);function js(t,e,n){return hr(t,e,n)}s(js,\"SafeBuffer\");js.prototype=Object.create(hr.prototype);l1(hr,js);js.from=function(t,e,n){if(typeof t==\"number\")throw new TypeError(\"Argument must not be a number\");return hr(t,e,n)};js.alloc=function(t,e,n){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");var i=hr(t);return e!==void 0?typeof n==\"string\"?i.fill(e,n):i.fill(e):i.fill(0),i};js.allocUnsafe=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return hr(t)};js.allocUnsafeSlow=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return Tp.SlowBuffer(t)}});var h1=oe((Y2e,Ug)=>{\"use strict\";Ug.exports=Ile;Ug.exports.parse=Rle;var u1=Ee(\"path\").basename,yle=Cp().Buffer,wle=/[\\x00-\\x20\"'()*,/:;<=>?@[\\\\\\]{}\\x7f]/g,Ele=/%[0-9A-Fa-f]{2}/,kle=/%([0-9A-Fa-f]{2})/g,p1=/[^\\x20-\\x7e\\xa0-\\xff]/g,jle=/\\\\([\\u0000-\\u007f])/g,Ale=/([\\\\\"])/g,d1=/;[\\x09\\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\\x09\\x20]*=[\\x09\\x20]*(\"(?:[\\x20!\\x23-\\x5b\\x5d-\\x7e\\x80-\\xff]|\\\\[\\x20-\\x7e])*\"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\\x09\\x20]*/g,Tle=/^[\\x20-\\x7e\\x80-\\xff]+$/,Cle=/^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/,Sle=/^([A-Za-z0-9!#$%&+\\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/,Ole=/^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\\x09\\x20]*(?:$|;)/;function Ile(t,e){var n=e||{},i=n.type||\"attachment\",a=Dle(t,n.fallback);return Fle(new f1(i,a))}s(Ile,\"contentDisposition\");function Dle(t,e){if(t!==void 0){var n={};if(typeof t!=\"string\")throw new TypeError(\"filename must be a string\");if(e===void 0&&(e=!0),typeof e!=\"string\"&&typeof e!=\"boolean\")throw new TypeError(\"fallback must be a string or boolean\");if(typeof e==\"string\"&&p1.test(e))throw new TypeError(\"fallback must be ISO-8859-1 string\");var i=u1(t),a=Tle.test(i),r=typeof e!=\"string\"?e&&m1(i):u1(e),o=typeof r==\"string\"&&r!==i;return(o||!a||Ele.test(i))&&(n[\"filename*\"]=i),(a||o)&&(n.filename=o?r:i),n}}s(Dle,\"createparams\");function Fle(t){var e=t.parameters,n=t.type;if(!n||typeof n!=\"string\"||!Cle.test(n))throw new TypeError(\"invalid type\");var i=String(n).toLowerCase();if(e&&typeof e==\"object\")for(var a,r=Object.keys(e).sort(),o=0;o<r.length;o++){a=r[o];var l=a.substr(-1)===\"*\"?Lle(e[a]):Ple(e[a]);i+=\"; \"+a+\"=\"+l}return i}s(Fle,\"format\");function Nle(t){var e=Sle.exec(t);if(!e)throw new TypeError(\"invalid extended field value\");var n=e[1].toLowerCase(),i=e[2],a,r=i.replace(kle,Mle);switch(n){case\"iso-8859-1\":a=m1(r);break;case\"utf-8\":a=yle.from(r,\"binary\").toString(\"utf8\");break;default:throw new TypeError(\"unsupported charset in extended field\")}return a}s(Nle,\"decodefield\");function m1(t){return String(t).replace(p1,\"?\")}s(m1,\"getlatin1\");function Rle(t){if(!t||typeof t!=\"string\")throw new TypeError(\"argument string is required\");var e=Ole.exec(t);if(!e)throw new TypeError(\"invalid type format\");var n=e[0].length,i=e[1].toLowerCase(),a,r=[],o={},l;for(n=d1.lastIndex=e[0].substr(-1)===\";\"?n-1:n;e=d1.exec(t);){if(e.index!==n)throw new TypeError(\"invalid parameter format\");if(n+=e[0].length,a=e[1].toLowerCase(),l=e[2],r.indexOf(a)!==-1)throw new TypeError(\"invalid duplicate parameter\");if(r.push(a),a.indexOf(\"*\")+1===a.length){a=a.slice(0,-1),l=Nle(l),o[a]=l;continue}typeof o[a]!=\"string\"&&(l[0]==='\"'&&(l=l.substr(1,l.length-2).replace(jle,\"$1\")),o[a]=l)}if(n!==-1&&n!==t.length)throw new TypeError(\"invalid parameter format\");return new f1(i,o)}s(Rle,\"parse\");function Mle(t,e){return String.fromCharCode(parseInt(e,16))}s(Mle,\"pdecode\");function Ble(t){return\"%\"+String(t).charCodeAt(0).toString(16).toUpperCase()}s(Ble,\"pencode\");function Ple(t){var e=String(t);return'\"'+e.replace(Ale,\"\\\\$1\")+'\"'}s(Ple,\"qstring\");function Lle(t){var e=String(t),n=encodeURIComponent(e).replace(wle,Ble);return\"UTF-8''\"+n}s(Lle,\"ustring\");function f1(t,e){this.type=t,this.parameters=e}s(f1,\"ContentDisposition\")});var _1=oe((Z2e,g1)=>{\"use strict\";g1.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;r<i.length;r++)if(i[r]!==e[r+a.offset])return!1;return!0},\"check\");if(n([255,216,255]))return{ext:\"jpg\",mime:\"image/jpeg\"};if(n([137,80,78,71,13,10,26,10]))return{ext:\"png\",mime:\"image/png\"};if(n([71,73,70]))return{ext:\"gif\",mime:\"image/gif\"};if(n([87,69,66,80],{offset:8}))return{ext:\"webp\",mime:\"image/webp\"};if(n([70,76,73,70]))return{ext:\"flif\",mime:\"image/flif\"};if((n([73,73,42,0])||n([77,77,0,42]))&&n([67,82],{offset:8}))return{ext:\"cr2\",mime:\"image/x-canon-cr2\"};if(n([73,73,42,0])||n([77,77,0,42]))return{ext:\"tif\",mime:\"image/tiff\"};if(n([66,77]))return{ext:\"bmp\",mime:\"image/bmp\"};if(n([73,73,188]))return{ext:\"jxr\",mime:\"image/vnd.ms-photo\"};if(n([56,66,80,83]))return{ext:\"psd\",mime:\"image/vnd.adobe.photoshop\"};if(n([80,75,3,4])&&n([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:\"epub\",mime:\"application/epub+zip\"};if(n([80,75,3,4])&&n([77,69,84,65,45,73,78,70,47,109,111,122,105,108,108,97,46,114,115,97],{offset:30}))return{ext:\"xpi\",mime:\"application/x-xpinstall\"};if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:\"zip\",mime:\"application/zip\"};if(n([117,115,116,97,114],{offset:257}))return{ext:\"tar\",mime:\"application/x-tar\"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:\"rar\",mime:\"application/x-rar-compressed\"};if(n([31,139,8]))return{ext:\"gz\",mime:\"application/gzip\"};if(n([66,90,104]))return{ext:\"bz2\",mime:\"application/x-bzip2\"};if(n([55,122,188,175,39,28]))return{ext:\"7z\",mime:\"application/x-7z-compressed\"};if(n([120,1]))return{ext:\"dmg\",mime:\"application/x-apple-diskimage\"};if(n([0,0,0])&&(e[3]===24||e[3]===32)&&n([102,116,121,112],{offset:4})||n([51,103,112,53])||n([0,0,0,28,102,116,121,112,109,112,52,50])&&n([109,112,52,49,109,112,52,50,105,115,111,109],{offset:16})||n([0,0,0,28,102,116,121,112,105,115,111,109])||n([0,0,0,28,102,116,121,112,109,112,52,50,0,0,0,0]))return{ext:\"mp4\",mime:\"video/mp4\"};if(n([0,0,0,28,102,116,121,112,77,52,86]))return{ext:\"m4v\",mime:\"video/x-m4v\"};if(n([77,84,104,100]))return{ext:\"mid\",mime:\"audio/midi\"};if(n([26,69,223,163])){let i=e.subarray(4,4100),a=i.findIndex((r,o,l)=>l[o]===66&&l[o+1]===130);if(a>=0){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),\"findDocType\");if(o(\"matroska\"))return{ext:\"mkv\",mime:\"video/x-matroska\"};if(o(\"webm\"))return{ext:\"webm\",mime:\"video/webm\"}}}return n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4})?{ext:\"mov\",mime:\"video/quicktime\"}:n([82,73,70,70])&&n([65,86,73],{offset:8})?{ext:\"avi\",mime:\"video/x-msvideo\"}:n([48,38,178,117,142,102,207,17,166,217])?{ext:\"wmv\",mime:\"video/x-ms-wmv\"}:n([0,0,1,186])?{ext:\"mpg\",mime:\"video/mpeg\"}:n([73,68,51])||n([255,251])?{ext:\"mp3\",mime:\"audio/mpeg\"}:n([102,116,121,112,77,52,65],{offset:4})||n([77,52,65,32])?{ext:\"m4a\",mime:\"audio/m4a\"}:n([79,112,117,115,72,101,97,100],{offset:28})?{ext:\"opus\",mime:\"audio/opus\"}:n([79,103,103,83])?{ext:\"ogg\",mime:\"audio/ogg\"}:n([102,76,97,67])?{ext:\"flac\",mime:\"audio/x-flac\"}:n([82,73,70,70])&&n([87,65,86,69],{offset:8})?{ext:\"wav\",mime:\"audio/x-wav\"}:n([35,33,65,77,82,10])?{ext:\"amr\",mime:\"audio/amr\"}:n([37,80,68,70])?{ext:\"pdf\",mime:\"application/pdf\"}:n([77,90])?{ext:\"exe\",mime:\"application/x-msdownload\"}:(e[0]===67||e[0]===70)&&n([87,83],{offset:1})?{ext:\"swf\",mime:\"application/x-shockwave-flash\"}:n([123,92,114,116,102])?{ext:\"rtf\",mime:\"application/rtf\"}:n([0,97,115,109])?{ext:\"wasm\",mime:\"application/wasm\"}:n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff\",mime:\"application/font-woff\"}:n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff2\",mime:\"application/font-woff\"}:n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8}))?{ext:\"eot\",mime:\"application/octet-stream\"}:n([0,1,0,0,0])?{ext:\"ttf\",mime:\"application/font-sfnt\"}:n([79,84,84,79,0])?{ext:\"otf\",mime:\"application/font-sfnt\"}:n([0,0,1,0])?{ext:\"ico\",mime:\"image/x-icon\"}:n([70,76,86,1])?{ext:\"flv\",mime:\"video/x-flv\"}:n([37,33])?{ext:\"ps\",mime:\"application/postscript\"}:n([253,55,122,88,90,0])?{ext:\"xz\",mime:\"application/x-xz\"}:n([83,81,76,105])?{ext:\"sqlite\",mime:\"application/x-sqlite3\"}:n([78,69,83,26])?{ext:\"nes\",mime:\"application/x-nintendo-nes-rom\"}:n([67,114,50,52])?{ext:\"crx\",mime:\"application/x-google-chrome-extension\"}:n([77,83,67,70])||n([73,83,99,40])?{ext:\"cab\",mime:\"application/vnd.ms-cab-compressed\"}:n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121])?{ext:\"deb\",mime:\"application/x-deb\"}:n([33,60,97,114,99,104,62])?{ext:\"ar\",mime:\"application/x-unix-archive\"}:n([237,171,238,219])?{ext:\"rpm\",mime:\"application/x-rpm\"}:n([31,160])||n([31,157])?{ext:\"Z\",mime:\"application/x-compress\"}:n([76,90,73,80])?{ext:\"lz\",mime:\"application/x-lzip\"}:n([208,207,17,224,161,177,26,225])?{ext:\"msi\",mime:\"application/x-msi\"}:n([6,14,43,52,2,5,1,1,13,1,2,1,1,2])?{ext:\"mxf\",mime:\"application/mxf\"}:n([66,76,69,78,68,69,82])?{ext:\"blend\",mime:\"application/x-blender\"}:null}});var v1=oe(($2e,x1)=>{\"use strict\";var Vle=_1(),zle=new Set([\"7z\",\"bz2\",\"gz\",\"rar\",\"tar\",\"zip\",\"xz\",\"gz\"]);x1.exports=t=>{let e=Vle(t);return zle.has(e&&e.ext)?e:null}});var y1=oe((eEe,b1)=>{var Ro=Ee(\"constants\"),Ule=process.cwd,Sp=null,qle=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return Sp||(Sp=Ule.call(process)),Sp};try{process.cwd()}catch{}typeof process.chdir==\"function\"&&(qg=process.chdir,process.chdir=function(t){Sp=null,qg.call(process,t)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,qg));var qg;b1.exports=Hle;function Hle(t){Ro.hasOwnProperty(\"O_SYMLINK\")&&process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)&&e(t),t.lutimes||n(t),t.chown=r(t.chown),t.fchown=r(t.fchown),t.lchown=r(t.lchown),t.chmod=i(t.chmod),t.fchmod=i(t.fchmod),t.lchmod=i(t.lchmod),t.chownSync=o(t.chownSync),t.fchownSync=o(t.fchownSync),t.lchownSync=o(t.lchownSync),t.chmodSync=a(t.chmodSync),t.fchmodSync=a(t.fchmodSync),t.lchmodSync=a(t.lchmodSync),t.stat=l(t.stat),t.fstat=l(t.fstat),t.lstat=l(t.lstat),t.statSync=c(t.statSync),t.fstatSync=c(t.fstatSync),t.lstatSync=c(t.lstatSync),t.chmod&&!t.lchmod&&(t.lchmod=function(u,p,m){m&&process.nextTick(m)},t.lchmodSync=function(){}),t.chown&&!t.lchown&&(t.lchown=function(u,p,m,f){f&&process.nextTick(f)},t.lchownSync=function(){}),qle===\"win32\"&&(t.rename=typeof t.rename!=\"function\"?t.rename:function(u){function p(m,f,g){var x=Date.now(),_=0;u(m,f,s(function h(v){if(v&&(v.code===\"EACCES\"||v.code===\"EPERM\"||v.code===\"EBUSY\")&&Date.now()-x<6e4){setTimeout(function(){t.stat(f,function(b,y){b&&b.code===\"ENOENT\"?u(m,f,h):g(v)})},_),_<100&&(_+=10);return}g&&g(v)},\"CB\"))}return s(p,\"rename\"),Object.setPrototypeOf&&Object.setPrototypeOf(p,u),p}(t.rename)),t.read=typeof t.read!=\"function\"?t.read:function(u){function p(m,f,g,x,_,h){var v;if(h&&typeof h==\"function\"){var b=0;v=s(function(y,w,S){if(y&&y.code===\"EAGAIN\"&&b<10)return b++,u.call(t,m,f,g,x,_,v);h.apply(this,arguments)},\"callback\")}return u.call(t,m,f,g,x,_,v)}return s(p,\"read\"),Object.setPrototypeOf&&Object.setPrototypeOf(p,u),p}(t.read),t.readSync=typeof t.readSync!=\"function\"?t.readSync:function(u){return function(p,m,f,g,x){for(var _=0;;)try{return u.call(t,p,m,f,g,x)}catch(h){if(h.code===\"EAGAIN\"&&_<10){_++;continue}throw h}}}(t.readSync);function e(u){u.lchmod=function(p,m,f){u.open(p,Ro.O_WRONLY|Ro.O_SYMLINK,m,function(g,x){if(g){f&&f(g);return}u.fchmod(x,m,function(_){u.close(x,function(h){f&&f(_||h)})})})},u.lchmodSync=function(p,m){var f=u.openSync(p,Ro.O_WRONLY|Ro.O_SYMLINK,m),g=!0,x;try{x=u.fchmodSync(f,m),g=!1}finally{if(g)try{u.closeSync(f)}catch{}else u.closeSync(f)}return x}}s(e,\"patchLchmod\");function n(u){Ro.hasOwnProperty(\"O_SYMLINK\")&&u.futimes?(u.lutimes=function(p,m,f,g){u.open(p,Ro.O_SYMLINK,function(x,_){if(x){g&&g(x);return}u.futimes(_,m,f,function(h){u.close(_,function(v){g&&g(h||v)})})})},u.lutimesSync=function(p,m,f){var g=u.openSync(p,Ro.O_SYMLINK),x,_=!0;try{x=u.futimesSync(g,m,f),_=!1}finally{if(_)try{u.closeSync(g)}catch{}else u.closeSync(g)}return x}):u.futimes&&(u.lutimes=function(p,m,f,g){g&&process.nextTick(g)},u.lutimesSync=function(){})}s(n,\"patchLutimes\");function i(u){return u&&function(p,m,f){return u.call(t,p,m,function(g){d(g)&&(g=null),f&&f.apply(this,arguments)})}}s(i,\"chmodFix\");function a(u){return u&&function(p,m){try{return u.call(t,p,m)}catch(f){if(!d(f))throw f}}}s(a,\"chmodFixSync\");function r(u){return u&&function(p,m,f,g){return u.call(t,p,m,f,function(x){d(x)&&(x=null),g&&g.apply(this,arguments)})}}s(r,\"chownFix\");function o(u){return u&&function(p,m,f){try{return u.call(t,p,m,f)}catch(g){if(!d(g))throw g}}}s(o,\"chownFixSync\");function l(u){return u&&function(p,m,f){typeof m==\"function\"&&(f=m,m=null);function g(x,_){_&&(_.uid<0&&(_.uid+=4294967296),_.gid<0&&(_.gid+=4294967296)),f&&f.apply(this,arguments)}return s(g,\"callback\"),m?u.call(t,p,m,g):u.call(t,p,g)}}s(l,\"statFix\");function c(u){return u&&function(p,m){var f=m?u.call(t,p,m):u.call(t,p);return f&&(f.uid<0&&(f.uid+=4294967296),f.gid<0&&(f.gid+=4294967296)),f}}s(c,\"statFixSync\");function d(u){if(!u||u.code===\"ENOSYS\")return!0;var p=!process.getuid||process.getuid()!==0;return!!(p&&(u.code===\"EINVAL\"||u.code===\"EPERM\"))}s(d,\"chownErOk\")}s(Hle,\"patch\")});var k1=oe((nEe,E1)=>{var w1=Ee(\"stream\").Stream;E1.exports=Jle;function Jle(t){return{ReadStream:e,WriteStream:n};function e(i,a){if(!(this instanceof e))return new e(i,a);w1.call(this);var r=this;this.path=i,this.fd=null,this.readable=!0,this.paused=!1,this.flags=\"r\",this.mode=438,this.bufferSize=64*1024,a=a||{};for(var o=Object.keys(a),l=0,c=o.length;l<c;l++){var d=o[l];this[d]=a[d]}if(this.encoding&&this.setEncoding(this.encoding),this.start!==void 0){if(typeof this.start!=\"number\")throw TypeError(\"start must be a Number\");if(this.end===void 0)this.end=1/0;else if(typeof this.end!=\"number\")throw TypeError(\"end must be a Number\");if(this.start>this.end)throw new Error(\"start must be <= end\");this.pos=this.start}if(this.fd!==null){process.nextTick(function(){r._read()});return}t.open(this.path,this.flags,this.mode,function(u,p){if(u){r.emit(\"error\",u),r.readable=!1;return}r.fd=p,r.emit(\"open\",p),r._read()})}function n(i,a){if(!(this instanceof n))return new n(i,a);w1.call(this),this.path=i,this.fd=null,this.writable=!0,this.flags=\"w\",this.encoding=\"binary\",this.mode=438,this.bytesWritten=0,a=a||{};for(var r=Object.keys(a),o=0,l=r.length;o<l;o++){var c=r[o];this[c]=a[c]}if(this.start!==void 0){if(typeof this.start!=\"number\")throw TypeError(\"start must be a Number\");if(this.start<0)throw new Error(\"start must be >= zero\");this.pos=this.start}this.busy=!1,this._queue=[],this.fd===null&&(this._open=t.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}s(Jle,\"legacy\")});var A1=oe((aEe,j1)=>{\"use strict\";j1.exports=Wle;var Gle=Object.getPrototypeOf||function(t){return t.__proto__};function Wle(t){if(t===null||typeof t!=\"object\")return t;if(t instanceof Object)var e={__proto__:Gle(t)};else var e=Object.create(null);return Object.getOwnPropertyNames(t).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}s(Wle,\"clone\")});var O1=oe((oEe,Gg)=>{var jn=Ee(\"fs\"),Kle=y1(),Yle=k1(),Xle=A1(),Op=Ee(\"util\"),ri,Dp;typeof Symbol==\"function\"&&typeof Symbol.for==\"function\"?(ri=Symbol.for(\"graceful-fs.queue\"),Dp=Symbol.for(\"graceful-fs.previous\")):(ri=\"___graceful-fs.queue\",Dp=\"___graceful-fs.previous\");function Zle(){}s(Zle,\"noop\");function S1(t,e){Object.defineProperty(t,ri,{get:function(){return e}})}s(S1,\"publishQueue\");var As=Zle;Op.debuglog?As=Op.debuglog(\"gfs4\"):/\\bgfs4\\b/i.test(process.env.NODE_DEBUG||\"\")&&(As=s(function(){var t=Op.format.apply(Op,arguments);t=\"GFS4: \"+t.split(/\\n/).join(`\nGFS4: `),console.error(t)},\"debug\"));jn[ri]||(T1=global[ri]||[],S1(jn,T1),jn.close=function(t){function e(n,i){return t.call(jn,n,function(a){a||C1(),typeof i==\"function\"&&i.apply(this,arguments)})}return s(e,\"close\"),Object.defineProperty(e,Dp,{value:t}),e}(jn.close),jn.closeSync=function(t){function e(n){t.apply(jn,arguments),C1()}return s(e,\"closeSync\"),Object.defineProperty(e,Dp,{value:t}),e}(jn.closeSync),/\\bgfs4\\b/i.test(process.env.NODE_DEBUG||\"\")&&process.on(\"exit\",function(){As(jn[ri]),Ee(\"assert\").equal(jn[ri].length,0)}));var T1;global[ri]||S1(global,jn[ri]);Gg.exports=Hg(Xle(jn));process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH&&!jn.__patched&&(Gg.exports=Hg(jn),jn.__patched=!0);function Hg(t){Kle(t),t.gracefulify=Hg,t.createReadStream=w,t.createWriteStream=S;var e=t.readFile;t.readFile=n;function n(k,R,D){return typeof R==\"function\"&&(D=R,R=null),B(k,R,D);function B(q,G,W,ee){return e(q,G,function(Z){Z&&(Z.code===\"EMFILE\"||Z.code===\"ENFILE\")?Fl([B,[q,G,W],Z,ee||Date.now(),Date.now()]):typeof W==\"function\"&&W.apply(this,arguments)})}s(B,\"go$readFile\")}s(n,\"readFile\");var i=t.writeFile;t.writeFile=a;function a(k,R,D,B){return typeof D==\"function\"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return i(G,W,ee,function(X){X&&(X.code===\"EMFILE\"||X.code===\"ENFILE\")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z==\"function\"&&Z.apply(this,arguments)})}s(q,\"go$writeFile\")}s(a,\"writeFile\");var r=t.appendFile;r&&(t.appendFile=o);function o(k,R,D,B){return typeof D==\"function\"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return r(G,W,ee,function(X){X&&(X.code===\"EMFILE\"||X.code===\"ENFILE\")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z==\"function\"&&Z.apply(this,arguments)})}s(q,\"go$appendFile\")}s(o,\"appendFile\");var l=t.copyFile;l&&(t.copyFile=c);function c(k,R,D,B){return typeof D==\"function\"&&(B=D,D=0),q(k,R,D,B);function q(G,W,ee,Z,me){return l(G,W,ee,function(X){X&&(X.code===\"EMFILE\"||X.code===\"ENFILE\")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z==\"function\"&&Z.apply(this,arguments)})}s(q,\"go$copyFile\")}s(c,\"copyFile\");var d=t.readdir;t.readdir=p;var u=/^v[0-5]\\./;function p(k,R,D){typeof R==\"function\"&&(D=R,R=null);var B=u.test(process.version)?s(function(W,ee,Z,me){return d(W,q(W,ee,Z,me))},\"go$readdir\"):s(function(W,ee,Z,me){return d(W,ee,q(W,ee,Z,me))},\"go$readdir\");return B(k,R,D);function q(G,W,ee,Z){return function(me,X){me&&(me.code===\"EMFILE\"||me.code===\"ENFILE\")?Fl([B,[G,W,ee],me,Z||Date.now(),Date.now()]):(X&&X.sort&&X.sort(),typeof ee==\"function\"&&ee.call(this,me,X))}}}if(s(p,\"readdir\"),process.version.substr(0,4)===\"v0.8\"){var m=Yle(t);h=m.ReadStream,b=m.WriteStream}var f=t.ReadStream;f&&(h.prototype=Object.create(f.prototype),h.prototype.open=v);var g=t.WriteStream;g&&(b.prototype=Object.create(g.prototype),b.prototype.open=y),Object.defineProperty(t,\"ReadStream\",{get:function(){return h},set:function(k){h=k},enumerable:!0,configurable:!0}),Object.defineProperty(t,\"WriteStream\",{get:function(){return b},set:function(k){b=k},enumerable:!0,configurable:!0});var x=h;Object.defineProperty(t,\"FileReadStream\",{get:function(){return x},set:function(k){x=k},enumerable:!0,configurable:!0});var _=b;Object.defineProperty(t,\"FileWriteStream\",{get:function(){return _},set:function(k){_=k},enumerable:!0,configurable:!0});function h(k,R){return this instanceof h?(f.apply(this,arguments),this):h.apply(Object.create(h.prototype),arguments)}s(h,\"ReadStream\");function v(){var k=this;N(k.path,k.flags,k.mode,function(R,D){R?(k.autoClose&&k.destroy(),k.emit(\"error\",R)):(k.fd=D,k.emit(\"open\",D),k.read())})}s(v,\"ReadStream$open\");function b(k,R){return this instanceof b?(g.apply(this,arguments),this):b.apply(Object.create(b.prototype),arguments)}s(b,\"WriteStream\");function y(){var k=this;N(k.path,k.flags,k.mode,function(R,D){R?(k.destroy(),k.emit(\"error\",R)):(k.fd=D,k.emit(\"open\",D))})}s(y,\"WriteStream$open\");function w(k,R){return new t.ReadStream(k,R)}s(w,\"createReadStream\");function S(k,R){return new t.WriteStream(k,R)}s(S,\"createWriteStream\");var F=t.open;t.open=N;function N(k,R,D,B){return typeof D==\"function\"&&(B=D,D=null),q(k,R,D,B);function q(G,W,ee,Z,me){return F(G,W,ee,function(X,Q){X&&(X.code===\"EMFILE\"||X.code===\"ENFILE\")?Fl([q,[G,W,ee,Z],X,me||Date.now(),Date.now()]):typeof Z==\"function\"&&Z.apply(this,arguments)})}s(q,\"go$open\")}return s(N,\"open\"),t}s(Hg,\"patch\");function Fl(t){As(\"ENQUEUE\",t[0].name,t[1]),jn[ri].push(t),Jg()}s(Fl,\"enqueue\");var Ip;function C1(){for(var t=Date.now(),e=0;e<jn[ri].length;++e)jn[ri][e].length>2&&(jn[ri][e][3]=t,jn[ri][e][4]=t);Jg()}s(C1,\"resetQueue\");function Jg(){if(clearTimeout(Ip),Ip=void 0,jn[ri].length!==0){var t=jn[ri].shift(),e=t[0],n=t[1],i=t[2],a=t[3],r=t[4];if(a===void 0)As(\"RETRY\",e.name,n),e.apply(null,n);else if(Date.now()-a>=6e4){As(\"TIMEOUT\",e.name,n);var o=n.pop();typeof o==\"function\"&&o.call(null,i)}else{var l=Date.now()-r,c=Math.max(r-a,1),d=Math.min(c*1.2,100);l>=d?(As(\"RETRY\",e.name,n),e.apply(null,n.concat([a]))):jn[ri].push(t)}Ip===void 0&&(Ip=setTimeout(Jg,0))}}s(Jg,\"retry\")});var Wg=oe((lEe,I1)=>{\"use strict\";I1.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;r<i.length;r++)if(i[r]!==e[r+a.offset])return!1;return!0},\"check\");if(n([255,216,255]))return{ext:\"jpg\",mime:\"image/jpeg\"};if(n([137,80,78,71,13,10,26,10]))return{ext:\"png\",mime:\"image/png\"};if(n([71,73,70]))return{ext:\"gif\",mime:\"image/gif\"};if(n([87,69,66,80],{offset:8}))return{ext:\"webp\",mime:\"image/webp\"};if(n([70,76,73,70]))return{ext:\"flif\",mime:\"image/flif\"};if((n([73,73,42,0])||n([77,77,0,42]))&&n([67,82],{offset:8}))return{ext:\"cr2\",mime:\"image/x-canon-cr2\"};if(n([73,73,42,0])||n([77,77,0,42]))return{ext:\"tif\",mime:\"image/tiff\"};if(n([66,77]))return{ext:\"bmp\",mime:\"image/bmp\"};if(n([73,73,188]))return{ext:\"jxr\",mime:\"image/vnd.ms-photo\"};if(n([56,66,80,83]))return{ext:\"psd\",mime:\"image/vnd.adobe.photoshop\"};if(n([80,75,3,4])&&n([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:\"epub\",mime:\"application/epub+zip\"};if(n([80,75,3,4])&&n([77,69,84,65,45,73,78,70,47,109,111,122,105,108,108,97,46,114,115,97],{offset:30}))return{ext:\"xpi\",mime:\"application/x-xpinstall\"};if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:\"zip\",mime:\"application/zip\"};if(n([117,115,116,97,114],{offset:257}))return{ext:\"tar\",mime:\"application/x-tar\"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:\"rar\",mime:\"application/x-rar-compressed\"};if(n([31,139,8]))return{ext:\"gz\",mime:\"application/gzip\"};if(n([66,90,104]))return{ext:\"bz2\",mime:\"application/x-bzip2\"};if(n([55,122,188,175,39,28]))return{ext:\"7z\",mime:\"application/x-7z-compressed\"};if(n([120,1]))return{ext:\"dmg\",mime:\"application/x-apple-diskimage\"};if(n([0,0,0])&&(e[3]===24||e[3]===32)&&n([102,116,121,112],{offset:4})||n([51,103,112,53])||n([0,0,0,28,102,116,121,112,109,112,52,50])&&n([109,112,52,49,109,112,52,50,105,115,111,109],{offset:16})||n([0,0,0,28,102,116,121,112,105,115,111,109])||n([0,0,0,28,102,116,121,112,109,112,52,50,0,0,0,0]))return{ext:\"mp4\",mime:\"video/mp4\"};if(n([0,0,0,28,102,116,121,112,77,52,86]))return{ext:\"m4v\",mime:\"video/x-m4v\"};if(n([77,84,104,100]))return{ext:\"mid\",mime:\"audio/midi\"};if(n([26,69,223,163])){let i=e.subarray(4,4100),a=i.findIndex((r,o,l)=>l[o]===66&&l[o+1]===130);if(a>=0){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),\"findDocType\");if(o(\"matroska\"))return{ext:\"mkv\",mime:\"video/x-matroska\"};if(o(\"webm\"))return{ext:\"webm\",mime:\"video/webm\"}}}return n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4})?{ext:\"mov\",mime:\"video/quicktime\"}:n([82,73,70,70])&&n([65,86,73],{offset:8})?{ext:\"avi\",mime:\"video/x-msvideo\"}:n([48,38,178,117,142,102,207,17,166,217])?{ext:\"wmv\",mime:\"video/x-ms-wmv\"}:n([0,0,1,186])?{ext:\"mpg\",mime:\"video/mpeg\"}:n([73,68,51])||n([255,251])?{ext:\"mp3\",mime:\"audio/mpeg\"}:n([102,116,121,112,77,52,65],{offset:4})||n([77,52,65,32])?{ext:\"m4a\",mime:\"audio/m4a\"}:n([79,112,117,115,72,101,97,100],{offset:28})?{ext:\"opus\",mime:\"audio/opus\"}:n([79,103,103,83])?{ext:\"ogg\",mime:\"audio/ogg\"}:n([102,76,97,67])?{ext:\"flac\",mime:\"audio/x-flac\"}:n([82,73,70,70])&&n([87,65,86,69],{offset:8})?{ext:\"wav\",mime:\"audio/x-wav\"}:n([35,33,65,77,82,10])?{ext:\"amr\",mime:\"audio/amr\"}:n([37,80,68,70])?{ext:\"pdf\",mime:\"application/pdf\"}:n([77,90])?{ext:\"exe\",mime:\"application/x-msdownload\"}:(e[0]===67||e[0]===70)&&n([87,83],{offset:1})?{ext:\"swf\",mime:\"application/x-shockwave-flash\"}:n([123,92,114,116,102])?{ext:\"rtf\",mime:\"application/rtf\"}:n([0,97,115,109])?{ext:\"wasm\",mime:\"application/wasm\"}:n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff\",mime:\"font/woff\"}:n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff2\",mime:\"font/woff2\"}:n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8}))?{ext:\"eot\",mime:\"application/octet-stream\"}:n([0,1,0,0,0])?{ext:\"ttf\",mime:\"font/ttf\"}:n([79,84,84,79,0])?{ext:\"otf\",mime:\"font/otf\"}:n([0,0,1,0])?{ext:\"ico\",mime:\"image/x-icon\"}:n([70,76,86,1])?{ext:\"flv\",mime:\"video/x-flv\"}:n([37,33])?{ext:\"ps\",mime:\"application/postscript\"}:n([253,55,122,88,90,0])?{ext:\"xz\",mime:\"application/x-xz\"}:n([83,81,76,105])?{ext:\"sqlite\",mime:\"application/x-sqlite3\"}:n([78,69,83,26])?{ext:\"nes\",mime:\"application/x-nintendo-nes-rom\"}:n([67,114,50,52])?{ext:\"crx\",mime:\"application/x-google-chrome-extension\"}:n([77,83,67,70])||n([73,83,99,40])?{ext:\"cab\",mime:\"application/vnd.ms-cab-compressed\"}:n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121])?{ext:\"deb\",mime:\"application/x-deb\"}:n([33,60,97,114,99,104,62])?{ext:\"ar\",mime:\"application/x-unix-archive\"}:n([237,171,238,219])?{ext:\"rpm\",mime:\"application/x-rpm\"}:n([31,160])||n([31,157])?{ext:\"Z\",mime:\"application/x-compress\"}:n([76,90,73,80])?{ext:\"lz\",mime:\"application/x-lzip\"}:n([208,207,17,224,161,177,26,225])?{ext:\"msi\",mime:\"application/x-msi\"}:n([6,14,43,52,2,5,1,1,13,1,2,1,1,2])?{ext:\"mxf\",mime:\"application/mxf\"}:n([71],{offset:4})&&(n([71],{offset:192})||n([71],{offset:196}))?{ext:\"mts\",mime:\"video/mp2t\"}:n([66,76,69,78,68,69,82])?{ext:\"blend\",mime:\"application/x-blender\"}:n([66,80,71,251])?{ext:\"bpg\",mime:\"image/bpg\"}:null}});var Fp=oe((uEe,D1)=>{\"use strict\";var io=D1.exports=function(t){return t!==null&&typeof t==\"object\"&&typeof t.pipe==\"function\"};io.writable=function(t){return io(t)&&t.writable!==!1&&typeof t._write==\"function\"&&typeof t._writableState==\"object\"};io.readable=function(t){return io(t)&&t.readable!==!1&&typeof t._read==\"function\"&&typeof t._readableState==\"object\"};io.duplex=function(t){return io.writable(t)&&io.readable(t)};io.transform=function(t){return io.duplex(t)&&typeof t._transform==\"function\"&&typeof t._transformState==\"object\"}});var pu=oe((dEe,Kg)=>{\"use strict\";typeof process>\"u\"||!process.version||process.version.indexOf(\"v0.\")===0||process.version.indexOf(\"v1.\")===0&&process.version.indexOf(\"v1.8.\")!==0?Kg.exports={nextTick:Qle}:Kg.exports=process;function Qle(t,e,n,i){if(typeof t!=\"function\")throw new TypeError('\"callback\" argument must be a function');var a=arguments.length,r,o;switch(a){case 0:case 1:return process.nextTick(t);case 2:return process.nextTick(s(function(){t.call(null,e)},\"afterTickOne\"));case 3:return process.nextTick(s(function(){t.call(null,e,n)},\"afterTickTwo\"));case 4:return process.nextTick(s(function(){t.call(null,e,n,i)},\"afterTickThree\"));default:for(r=new Array(a-1),o=0;o<r.length;)r[o++]=arguments[o];return process.nextTick(s(function(){t.apply(null,r)},\"afterTick\"))}}s(Qle,\"nextTick\")});var N1=oe((mEe,F1)=>{var $le={}.toString;F1.exports=Array.isArray||function(t){return $le.call(t)==\"[object Array]\"}});var Yg=oe((fEe,R1)=>{R1.exports=Ee(\"stream\")});var Rp=oe((Xg,B1)=>{var Np=(No(),nu(Dl)),ao=Np.Buffer;function M1(t,e){for(var n in t)e[n]=t[n]}s(M1,\"copyProps\");ao.from&&ao.alloc&&ao.allocUnsafe&&ao.allocUnsafeSlow?B1.exports=Np:(M1(Np,Xg),Xg.Buffer=Nl);function Nl(t,e,n){return ao(t,e,n)}s(Nl,\"SafeBuffer\");M1(ao,Nl);Nl.from=function(t,e,n){if(typeof t==\"number\")throw new TypeError(\"Argument must not be a number\");return ao(t,e,n)};Nl.alloc=function(t,e,n){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");var i=ao(t);return e!==void 0?typeof n==\"string\"?i.fill(e,n):i.fill(e):i.fill(0),i};Nl.allocUnsafe=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return ao(t)};Nl.allocUnsafeSlow=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return Np.SlowBuffer(t)}});var Rl=oe(xi=>{function ece(t){return Array.isArray?Array.isArray(t):Mp(t)===\"[object Array]\"}s(ece,\"isArray\");xi.isArray=ece;function tce(t){return typeof t==\"boolean\"}s(tce,\"isBoolean\");xi.isBoolean=tce;function nce(t){return t===null}s(nce,\"isNull\");xi.isNull=nce;function ice(t){return t==null}s(ice,\"isNullOrUndefined\");xi.isNullOrUndefined=ice;function ace(t){return typeof t==\"number\"}s(ace,\"isNumber\");xi.isNumber=ace;function rce(t){return typeof t==\"string\"}s(rce,\"isString\");xi.isString=rce;function oce(t){return typeof t==\"symbol\"}s(oce,\"isSymbol\");xi.isSymbol=oce;function sce(t){return t===void 0}s(sce,\"isUndefined\");xi.isUndefined=sce;function lce(t){return Mp(t)===\"[object RegExp]\"}s(lce,\"isRegExp\");xi.isRegExp=lce;function cce(t){return typeof t==\"object\"&&t!==null}s(cce,\"isObject\");xi.isObject=cce;function uce(t){return Mp(t)===\"[object Date]\"}s(uce,\"isDate\");xi.isDate=uce;function dce(t){return Mp(t)===\"[object Error]\"||t instanceof Error}s(dce,\"isError\");xi.isError=dce;function pce(t){return typeof t==\"function\"}s(pce,\"isFunction\");xi.isFunction=pce;function mce(t){return t===null||typeof t==\"boolean\"||typeof t==\"number\"||typeof t==\"string\"||typeof t==\"symbol\"||typeof t>\"u\"}s(mce,\"isPrimitive\");xi.isPrimitive=mce;xi.isBuffer=(No(),nu(Dl)).Buffer.isBuffer;function Mp(t){return Object.prototype.toString.call(t)}s(Mp,\"objectToString\")});var P1=oe((xEe,Zg)=>{typeof Object.create==\"function\"?Zg.exports=s(function(e,n){n&&(e.super_=n,e.prototype=Object.create(n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))},\"inherits\"):Zg.exports=s(function(e,n){if(n){e.super_=n;var i=s(function(){},\"TempCtor\");i.prototype=n.prototype,e.prototype=new i,e.prototype.constructor=e}},\"inherits\")});var Ts=oe((bEe,$g)=>{try{if(Qg=Ee(\"util\"),typeof Qg.inherits!=\"function\")throw\"\";$g.exports=Qg.inherits}catch{$g.exports=P1()}var Qg});var V1=oe((yEe,e_)=>{\"use strict\";function fce(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}s(fce,\"_classCallCheck\");var L1=Rp().Buffer,mu=Ee(\"util\");function hce(t,e,n){t.copy(e,n)}s(hce,\"copyBuffer\");e_.exports=function(){function t(){fce(this,t),this.head=null,this.tail=null,this.length=0}return s(t,\"BufferList\"),t.prototype.push=s(function(n){var i={data:n,next:null};this.length>0?this.tail.next=i:this.head=i,this.tail=i,++this.length},\"push\"),t.prototype.unshift=s(function(n){var i={data:n,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length},\"unshift\"),t.prototype.shift=s(function(){if(this.length!==0){var n=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,n}},\"shift\"),t.prototype.clear=s(function(){this.head=this.tail=null,this.length=0},\"clear\"),t.prototype.join=s(function(n){if(this.length===0)return\"\";for(var i=this.head,a=\"\"+i.data;i=i.next;)a+=n+i.data;return a},\"join\"),t.prototype.concat=s(function(n){if(this.length===0)return L1.alloc(0);for(var i=L1.allocUnsafe(n>>>0),a=this.head,r=0;a;)hce(a.data,i,r),r+=a.data.length,a=a.next;return i},\"concat\"),t}();mu&&mu.inspect&&mu.inspect.custom&&(e_.exports.prototype[mu.inspect.custom]=function(){var t=mu.inspect({length:this.length});return this.constructor.name+\" \"+t})});var t_=oe((EEe,z1)=>{\"use strict\";var Bp=pu();function gce(t,e){var n=this,i=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return i||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,Bp.nextTick(Pp,this,t)):Bp.nextTick(Pp,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(r){!e&&r?n._writableState?n._writableState.errorEmitted||(n._writableState.errorEmitted=!0,Bp.nextTick(Pp,n,r)):Bp.nextTick(Pp,n,r):e&&e(r)}),this)}s(gce,\"destroy\");function _ce(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}s(_ce,\"undestroy\");function Pp(t,e){t.emit(\"error\",e)}s(Pp,\"emitErrorNT\");z1.exports={destroy:gce,undestroy:_ce}});var q1=oe((jEe,U1)=>{U1.exports=Ee(\"util\").deprecate});var i_=oe((AEe,Z1)=>{\"use strict\";var Cs=pu();Z1.exports=Bn;function J1(t){var e=this;this.next=null,this.entry=null,this.finish=function(){Rce(e,t)}}s(J1,\"CorkedRequest\");var xce=!process.browser&&[\"v0.10\",\"v0.9.\"].indexOf(process.version.slice(0,5))>-1?setImmediate:Cs.nextTick,Ml;Bn.WritableState=hu;var G1=Object.create(Rl());G1.inherits=Ts();var vce={deprecate:q1()},W1=Yg(),Vp=Rp().Buffer,bce=(typeof global<\"u\"?global:typeof window<\"u\"?window:typeof self<\"u\"?self:{}).Uint8Array||function(){};function yce(t){return Vp.from(t)}s(yce,\"_uint8ArrayToBuffer\");function wce(t){return Vp.isBuffer(t)||t instanceof bce}s(wce,\"_isUint8Array\");var K1=t_();G1.inherits(Bn,W1);function Ece(){}s(Ece,\"nop\");function hu(t,e){Ml=Ml||Ss(),t=t||{};var n=e instanceof Ml;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,a=t.writableHighWaterMark,r=this.objectMode?16:16*1024;i||i===0?this.highWaterMark=i:n&&(a||a===0)?this.highWaterMark=a:this.highWaterMark=r,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(l){Oce(e,l)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new J1(this)}s(hu,\"WritableState\");hu.prototype.getBuffer=s(function(){for(var e=this.bufferedRequest,n=[];e;)n.push(e),e=e.next;return n},\"getBuffer\");(function(){try{Object.defineProperty(hu.prototype,\"buffer\",{get:vce.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var Lp;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(Lp=Function.prototype[Symbol.hasInstance],Object.defineProperty(Bn,Symbol.hasInstance,{value:function(t){return Lp.call(this,t)?!0:this!==Bn?!1:t&&t._writableState instanceof hu}})):Lp=s(function(t){return t instanceof this},\"realHasInstance\");function Bn(t){if(Ml=Ml||Ss(),!Lp.call(Bn,this)&&!(this instanceof Ml))return new Bn(t);this._writableState=new hu(t,this),this.writable=!0,t&&(typeof t.write==\"function\"&&(this._write=t.write),typeof t.writev==\"function\"&&(this._writev=t.writev),typeof t.destroy==\"function\"&&(this._destroy=t.destroy),typeof t.final==\"function\"&&(this._final=t.final)),W1.call(this)}s(Bn,\"Writable\");Bn.prototype.pipe=function(){this.emit(\"error\",new Error(\"Cannot pipe, not readable\"))};function kce(t,e){var n=new Error(\"write after end\");t.emit(\"error\",n),Cs.nextTick(e,n)}s(kce,\"writeAfterEnd\");function jce(t,e,n,i){var a=!0,r=!1;return n===null?r=new TypeError(\"May not write null values to stream\"):typeof n!=\"string\"&&n!==void 0&&!e.objectMode&&(r=new TypeError(\"Invalid non-string/buffer chunk\")),r&&(t.emit(\"error\",r),Cs.nextTick(i,r),a=!1),a}s(jce,\"validChunk\");Bn.prototype.write=function(t,e,n){var i=this._writableState,a=!1,r=!i.objectMode&&wce(t);return r&&!Vp.isBuffer(t)&&(t=yce(t)),typeof e==\"function\"&&(n=e,e=null),r?e=\"buffer\":e||(e=i.defaultEncoding),typeof n!=\"function\"&&(n=Ece),i.ended?kce(this,n):(r||jce(this,i,t,n))&&(i.pendingcb++,a=Tce(this,i,r,t,e,n)),a};Bn.prototype.cork=function(){var t=this._writableState;t.corked++};Bn.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Y1(this,t))};Bn.prototype.setDefaultEncoding=s(function(e){if(typeof e==\"string\"&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new TypeError(\"Unknown encoding: \"+e);return this._writableState.defaultEncoding=e,this},\"setDefaultEncoding\");function Ace(t,e,n){return!t.objectMode&&t.decodeStrings!==!1&&typeof e==\"string\"&&(e=Vp.from(e,n)),e}s(Ace,\"decodeChunk\");Object.defineProperty(Bn.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Tce(t,e,n,i,a,r){if(!n){var o=Ace(e,i,a);i!==o&&(n=!0,a=\"buffer\",i=o)}var l=e.objectMode?1:i.length;e.length+=l;var c=e.length<e.highWaterMark;if(c||(e.needDrain=!0),e.writing||e.corked){var d=e.lastBufferedRequest;e.lastBufferedRequest={chunk:i,encoding:a,isBuf:n,callback:r,next:null},d?d.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else n_(t,e,!1,l,i,a,r);return c}s(Tce,\"writeOrBuffer\");function n_(t,e,n,i,a,r,o){e.writelen=i,e.writecb=o,e.writing=!0,e.sync=!0,n?t._writev(a,e.onwrite):t._write(a,r,e.onwrite),e.sync=!1}s(n_,\"doWrite\");function Cce(t,e,n,i,a){--e.pendingcb,n?(Cs.nextTick(a,i),Cs.nextTick(fu,t,e),t._writableState.errorEmitted=!0,t.emit(\"error\",i)):(a(i),t._writableState.errorEmitted=!0,t.emit(\"error\",i),fu(t,e))}s(Cce,\"onwriteError\");function Sce(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}s(Sce,\"onwriteStateUpdate\");function Oce(t,e){var n=t._writableState,i=n.sync,a=n.writecb;if(Sce(n),e)Cce(t,n,i,e,a);else{var r=X1(n);!r&&!n.corked&&!n.bufferProcessing&&n.bufferedRequest&&Y1(t,n),i?xce(H1,t,n,r,a):H1(t,n,r,a)}}s(Oce,\"onwrite\");function H1(t,e,n,i){n||Ice(t,e),e.pendingcb--,i(),fu(t,e)}s(H1,\"afterWrite\");function Ice(t,e){e.length===0&&e.needDrain&&(e.needDrain=!1,t.emit(\"drain\"))}s(Ice,\"onwriteDrain\");function Y1(t,e){e.bufferProcessing=!0;var n=e.bufferedRequest;if(t._writev&&n&&n.next){var i=e.bufferedRequestCount,a=new Array(i),r=e.corkedRequestsFree;r.entry=n;for(var o=0,l=!0;n;)a[o]=n,n.isBuf||(l=!1),n=n.next,o+=1;a.allBuffers=l,n_(t,e,!0,e.length,a,\"\",r.finish),e.pendingcb++,e.lastBufferedRequest=null,r.next?(e.corkedRequestsFree=r.next,r.next=null):e.corkedRequestsFree=new J1(e),e.bufferedRequestCount=0}else{for(;n;){var c=n.chunk,d=n.encoding,u=n.callback,p=e.objectMode?1:c.length;if(n_(t,e,!1,p,c,d,u),n=n.next,e.bufferedRequestCount--,e.writing)break}n===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=n,e.bufferProcessing=!1}s(Y1,\"clearBuffer\");Bn.prototype._write=function(t,e,n){n(new Error(\"_write() is not implemented\"))};Bn.prototype._writev=null;Bn.prototype.end=function(t,e,n){var i=this._writableState;typeof t==\"function\"?(n=t,t=null,e=null):typeof e==\"function\"&&(n=e,e=null),t!=null&&this.write(t,e),i.corked&&(i.corked=1,this.uncork()),i.ending||Nce(this,i,n)};function X1(t){return t.ending&&t.length===0&&t.bufferedRequest===null&&!t.finished&&!t.writing}s(X1,\"needFinish\");function Dce(t,e){t._final(function(n){e.pendingcb--,n&&t.emit(\"error\",n),e.prefinished=!0,t.emit(\"prefinish\"),fu(t,e)})}s(Dce,\"callFinal\");function Fce(t,e){!e.prefinished&&!e.finalCalled&&(typeof t._final==\"function\"?(e.pendingcb++,e.finalCalled=!0,Cs.nextTick(Dce,t,e)):(e.prefinished=!0,t.emit(\"prefinish\")))}s(Fce,\"prefinish\");function fu(t,e){var n=X1(e);return n&&(Fce(t,e),e.pendingcb===0&&(e.finished=!0,t.emit(\"finish\"))),n}s(fu,\"finishMaybe\");function Nce(t,e,n){e.ending=!0,fu(t,e),n&&(e.finished?Cs.nextTick(n):t.once(\"finish\",n)),e.ended=!0,t.writable=!1}s(Nce,\"endWritable\");function Rce(t,e,n){var i=t.entry;for(t.entry=null;i;){var a=i.callback;e.pendingcb--,a(n),i=i.next}e.corkedRequestsFree.next=t}s(Rce,\"onCorkedFinish\");Object.defineProperty(Bn.prototype,\"destroyed\",{get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}});Bn.prototype.destroy=K1.destroy;Bn.prototype._undestroy=K1.undestroy;Bn.prototype._destroy=function(t,e){this.end(),e(t)}});var Ss=oe((CEe,tw)=>{\"use strict\";var Q1=pu(),Mce=Object.keys||function(t){var e=[];for(var n in t)e.push(n);return e};tw.exports=ro;var $1=Object.create(Rl());$1.inherits=Ts();var ew=o_(),r_=i_();$1.inherits(ro,ew);for(a_=Mce(r_.prototype),zp=0;zp<a_.length;zp++)Up=a_[zp],ro.prototype[Up]||(ro.prototype[Up]=r_.prototype[Up]);var a_,Up,zp;function ro(t){if(!(this instanceof ro))return new ro(t);ew.call(this,t),r_.call(this,t),t&&t.readable===!1&&(this.readable=!1),t&&t.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,t&&t.allowHalfOpen===!1&&(this.allowHalfOpen=!1),this.once(\"end\",Bce)}s(ro,\"Duplex\");Object.defineProperty(ro.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Bce(){this.allowHalfOpen||this._writableState.ended||Q1.nextTick(Pce,this)}s(Bce,\"onend\");function Pce(t){t.end()}s(Pce,\"onEndNT\");Object.defineProperty(ro.prototype,\"destroyed\",{get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(t){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=t,this._writableState.destroyed=t)}});ro.prototype._destroy=function(t,e){this.push(null),this.end(),Q1.nextTick(e,t)}});var aw=oe((s_,iw)=>{var qp=(No(),nu(Dl)),oo=qp.Buffer;function nw(t,e){for(var n in t)e[n]=t[n]}s(nw,\"copyProps\");oo.from&&oo.alloc&&oo.allocUnsafe&&oo.allocUnsafeSlow?iw.exports=qp:(nw(qp,s_),s_.Buffer=Bl);function Bl(t,e,n){return oo(t,e,n)}s(Bl,\"SafeBuffer\");nw(oo,Bl);Bl.from=function(t,e,n){if(typeof t==\"number\")throw new TypeError(\"Argument must not be a number\");return oo(t,e,n)};Bl.alloc=function(t,e,n){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");var i=oo(t);return e!==void 0?typeof n==\"string\"?i.fill(e,n):i.fill(e):i.fill(0),i};Bl.allocUnsafe=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return oo(t)};Bl.allocUnsafeSlow=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return qp.SlowBuffer(t)}});var u_=oe(ow=>{\"use strict\";var c_=aw().Buffer,rw=c_.isEncoding||function(t){switch(t=\"\"+t,t&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function Lce(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}s(Lce,\"_normalizeEncoding\");function Vce(t){var e=Lce(t);if(typeof e!=\"string\"&&(c_.isEncoding===rw||!rw(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}s(Vce,\"normalizeEncoding\");ow.StringDecoder=gu;function gu(t){this.encoding=Vce(t);var e;switch(this.encoding){case\"utf16le\":this.text=Gce,this.end=Wce,e=4;break;case\"utf8\":this.fillLast=qce,e=4;break;case\"base64\":this.text=Kce,this.end=Yce,e=3;break;default:this.write=Xce,this.end=Zce;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=c_.allocUnsafe(e)}s(gu,\"StringDecoder\");gu.prototype.write=function(t){if(t.length===0)return\"\";var e,n;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return\"\";n=this.lastNeed,this.lastNeed=0}else n=0;return n<t.length?e?e+this.text(t,n):this.text(t,n):e||\"\"};gu.prototype.end=Jce;gu.prototype.text=Hce;gu.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length};function l_(t){return t<=127?0:t>>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}s(l_,\"utf8CheckByte\");function zce(t,e,n){var i=e.length-1;if(i<n)return 0;var a=l_(e[i]);return a>=0?(a>0&&(t.lastNeed=a-1),a):--i<n||a===-2?0:(a=l_(e[i]),a>=0?(a>0&&(t.lastNeed=a-2),a):--i<n||a===-2?0:(a=l_(e[i]),a>=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}s(zce,\"utf8CheckIncomplete\");function Uce(t,e,n){if((e[0]&192)!==128)return t.lastNeed=0,\"\\uFFFD\";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,\"\\uFFFD\";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,\"\\uFFFD\"}}s(Uce,\"utf8CheckExtraBytes\");function qce(t){var e=this.lastTotal-this.lastNeed,n=Uce(this,t,e);if(n!==void 0)return n;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}s(qce,\"utf8FillLast\");function Hce(t,e){var n=zce(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=n;var i=t.length-(n-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString(\"utf8\",e,i)}s(Hce,\"utf8Text\");function Jce(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+\"\\uFFFD\":e}s(Jce,\"utf8End\");function Gce(t,e){if((t.length-e)%2===0){var n=t.toString(\"utf16le\",e);if(n){var i=n.charCodeAt(n.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],n.slice(0,-1)}return n}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}s(Gce,\"utf16Text\");function Wce(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var n=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,n)}return e}s(Wce,\"utf16End\");function Kce(t,e){var n=(t.length-e)%3;return n===0?t.toString(\"base64\",e):(this.lastNeed=3-n,this.lastTotal=3,n===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-n))}s(Kce,\"base64Text\");function Yce(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}s(Yce,\"base64End\");function Xce(t){return t.toString(this.encoding)}s(Xce,\"simpleWrite\");function Zce(t){return t&&t.length?this.write(t):\"\"}s(Zce,\"simpleEnd\")});var o_=oe((NEe,xw)=>{\"use strict\";var Ll=pu();xw.exports=pn;var Qce=N1(),_u;pn.ReadableState=mw;var FEe=Ee(\"events\").EventEmitter,uw=s(function(t,e){return t.listeners(e).length},\"EElistenerCount\"),h_=Yg(),xu=Rp().Buffer,$ce=(typeof global<\"u\"?global:typeof window<\"u\"?window:typeof self<\"u\"?self:{}).Uint8Array||function(){};function eue(t){return xu.from(t)}s(eue,\"_uint8ArrayToBuffer\");function tue(t){return xu.isBuffer(t)||t instanceof $ce}s(tue,\"_isUint8Array\");var dw=Object.create(Rl());dw.inherits=Ts();var d_=Ee(\"util\"),Lt=void 0;d_&&d_.debuglog?Lt=d_.debuglog(\"stream\"):Lt=s(function(){},\"debug\");var nue=V1(),pw=t_(),Pl;dw.inherits(pn,h_);var p_=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function iue(t,e,n){if(typeof t.prependListener==\"function\")return t.prependListener(e,n);!t._events||!t._events[e]?t.on(e,n):Qce(t._events[e])?t._events[e].unshift(n):t._events[e]=[n,t._events[e]]}s(iue,\"prependListener\");function mw(t,e){_u=_u||Ss(),t=t||{};var n=e instanceof _u;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var i=t.highWaterMark,a=t.readableHighWaterMark,r=this.objectMode?16:16*1024;i||i===0?this.highWaterMark=i:n&&(a||a===0)?this.highWaterMark=a:this.highWaterMark=r,this.highWaterMark=Math.floor(this.highWaterMark),this.buffer=new nue,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Pl||(Pl=u_().StringDecoder),this.decoder=new Pl(t.encoding),this.encoding=t.encoding)}s(mw,\"ReadableState\");function pn(t){if(_u=_u||Ss(),!(this instanceof pn))return new pn(t);this._readableState=new mw(t,this),this.readable=!0,t&&(typeof t.read==\"function\"&&(this._read=t.read),typeof t.destroy==\"function\"&&(this._destroy=t.destroy)),h_.call(this)}s(pn,\"Readable\");Object.defineProperty(pn.prototype,\"destroyed\",{get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(t){this._readableState&&(this._readableState.destroyed=t)}});pn.prototype.destroy=pw.destroy;pn.prototype._undestroy=pw.undestroy;pn.prototype._destroy=function(t,e){this.push(null),e(t)};pn.prototype.push=function(t,e){var n=this._readableState,i;return n.objectMode?i=!0:typeof t==\"string\"&&(e=e||n.defaultEncoding,e!==n.encoding&&(t=xu.from(t,e),e=\"\"),i=!0),fw(this,t,e,!1,i)};pn.prototype.unshift=function(t){return fw(this,t,null,!0,!1)};function fw(t,e,n,i,a){var r=t._readableState;if(e===null)r.reading=!1,sue(t,r);else{var o;a||(o=aue(r,e)),o?t.emit(\"error\",o):r.objectMode||e&&e.length>0?(typeof e!=\"string\"&&!r.objectMode&&Object.getPrototypeOf(e)!==xu.prototype&&(e=eue(e)),i?r.endEmitted?t.emit(\"error\",new Error(\"stream.unshift() after end event\")):m_(t,r,e,!0):r.ended?t.emit(\"error\",new Error(\"stream.push() after EOF\")):(r.reading=!1,r.decoder&&!n?(e=r.decoder.write(e),r.objectMode||e.length!==0?m_(t,r,e,!1):hw(t,r)):m_(t,r,e,!1))):i||(r.reading=!1)}return rue(r)}s(fw,\"readableAddChunk\");function m_(t,e,n,i){e.flowing&&e.length===0&&!e.sync?(t.emit(\"data\",n),t.read(0)):(e.length+=e.objectMode?1:n.length,i?e.buffer.unshift(n):e.buffer.push(n),e.needReadable&&Hp(t)),hw(t,e)}s(m_,\"addChunk\");function aue(t,e){var n;return!tue(e)&&typeof e!=\"string\"&&e!==void 0&&!t.objectMode&&(n=new TypeError(\"Invalid non-string/buffer chunk\")),n}s(aue,\"chunkInvalid\");function rue(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark||t.length===0)}s(rue,\"needMoreData\");pn.prototype.isPaused=function(){return this._readableState.flowing===!1};pn.prototype.setEncoding=function(t){return Pl||(Pl=u_().StringDecoder),this._readableState.decoder=new Pl(t),this._readableState.encoding=t,this};var sw=8388608;function oue(t){return t>=sw?t=sw:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}s(oue,\"computeNewHighWaterMark\");function lw(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=oue(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}s(lw,\"howMuchToRead\");pn.prototype.read=function(t){Lt(\"read\",t),t=parseInt(t,10);var e=this._readableState,n=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return Lt(\"read: emitReadable\",e.length,e.ended),e.length===0&&e.ended?f_(this):Hp(this),null;if(t=lw(t,e),t===0&&e.ended)return e.length===0&&f_(this),null;var i=e.needReadable;Lt(\"need readable\",i),(e.length===0||e.length-t<e.highWaterMark)&&(i=!0,Lt(\"length less than watermark\",i)),e.ended||e.reading?(i=!1,Lt(\"reading or ended\",i)):i&&(Lt(\"do read\"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=lw(n,e)));var a;return t>0?a=gw(t,e):a=null,a===null?(e.needReadable=!0,t=0):e.length-=t,e.length===0&&(e.ended||(e.needReadable=!0),n!==t&&e.ended&&f_(this)),a!==null&&this.emit(\"data\",a),a};function sue(t,e){if(!e.ended){if(e.decoder){var n=e.decoder.end();n&&n.length&&(e.buffer.push(n),e.length+=e.objectMode?1:n.length)}e.ended=!0,Hp(t)}}s(sue,\"onEofChunk\");function Hp(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(Lt(\"emitReadable\",e.flowing),e.emittedReadable=!0,e.sync?Ll.nextTick(cw,t):cw(t))}s(Hp,\"emitReadable\");function cw(t){Lt(\"emit readable\"),t.emit(\"readable\"),g_(t)}s(cw,\"emitReadable_\");function hw(t,e){e.readingMore||(e.readingMore=!0,Ll.nextTick(lue,t,e))}s(hw,\"maybeReadMore\");function lue(t,e){for(var n=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length<e.highWaterMark&&(Lt(\"maybeReadMore read 0\"),t.read(0),n!==e.length);)n=e.length;e.readingMore=!1}s(lue,\"maybeReadMore_\");pn.prototype._read=function(t){this.emit(\"error\",new Error(\"_read() is not implemented\"))};pn.prototype.pipe=function(t,e){var n=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=t;break;case 1:i.pipes=[i.pipes,t];break;default:i.pipes.push(t);break}i.pipesCount+=1,Lt(\"pipe count=%d opts=%j\",i.pipesCount,e);var a=(!e||e.end!==!1)&&t!==process.stdout&&t!==process.stderr,r=a?l:_;i.endEmitted?Ll.nextTick(r):n.once(\"end\",r),t.on(\"unpipe\",o);function o(h,v){Lt(\"onunpipe\"),h===n&&v&&v.hasUnpiped===!1&&(v.hasUnpiped=!0,u())}s(o,\"onunpipe\");function l(){Lt(\"onend\"),t.end()}s(l,\"onend\");var c=cue(n);t.on(\"drain\",c);var d=!1;function u(){Lt(\"cleanup\"),t.removeListener(\"close\",g),t.removeListener(\"finish\",x),t.removeListener(\"drain\",c),t.removeListener(\"error\",f),t.removeListener(\"unpipe\",o),n.removeListener(\"end\",l),n.removeListener(\"end\",_),n.removeListener(\"data\",m),d=!0,i.awaitDrain&&(!t._writableState||t._writableState.needDrain)&&c()}s(u,\"cleanup\");var p=!1;n.on(\"data\",m);function m(h){Lt(\"ondata\"),p=!1;var v=t.write(h);v===!1&&!p&&((i.pipesCount===1&&i.pipes===t||i.pipesCount>1&&_w(i.pipes,t)!==-1)&&!d&&(Lt(\"false write response, pause\",i.awaitDrain),i.awaitDrain++,p=!0),n.pause())}s(m,\"ondata\");function f(h){Lt(\"onerror\",h),_(),t.removeListener(\"error\",f),uw(t,\"error\")===0&&t.emit(\"error\",h)}s(f,\"onerror\"),iue(t,\"error\",f);function g(){t.removeListener(\"finish\",x),_()}s(g,\"onclose\"),t.once(\"close\",g);function x(){Lt(\"onfinish\"),t.removeListener(\"close\",g),_()}s(x,\"onfinish\"),t.once(\"finish\",x);function _(){Lt(\"unpipe\"),n.unpipe(t)}return s(_,\"unpipe\"),t.emit(\"pipe\",n),i.flowing||(Lt(\"pipe resume\"),n.resume()),t};function cue(t){return function(){var e=t._readableState;Lt(\"pipeOnDrain\",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,e.awaitDrain===0&&uw(t,\"data\")&&(e.flowing=!0,g_(t))}}s(cue,\"pipeOnDrain\");pn.prototype.unpipe=function(t){var e=this._readableState,n={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,n),this);if(!t){var i=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var r=0;r<a;r++)i[r].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var o=_w(e.pipes,t);return o===-1?this:(e.pipes.splice(o,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),t.emit(\"unpipe\",this,n),this)};pn.prototype.on=function(t,e){var n=h_.prototype.on.call(this,t,e);if(t===\"data\")this._readableState.flowing!==!1&&this.resume();else if(t===\"readable\"){var i=this._readableState;!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.emittedReadable=!1,i.reading?i.length&&Hp(this):Ll.nextTick(uue,this))}return n};pn.prototype.addListener=pn.prototype.on;function uue(t){Lt(\"readable nexttick read 0\"),t.read(0)}s(uue,\"nReadingNextTick\");pn.prototype.resume=function(){var t=this._readableState;return t.flowing||(Lt(\"resume\"),t.flowing=!0,due(this,t)),this};function due(t,e){e.resumeScheduled||(e.resumeScheduled=!0,Ll.nextTick(pue,t,e))}s(due,\"resume\");function pue(t,e){e.reading||(Lt(\"resume read 0\"),t.read(0)),e.resumeScheduled=!1,e.awaitDrain=0,t.emit(\"resume\"),g_(t),e.flowing&&!e.reading&&t.read(0)}s(pue,\"resume_\");pn.prototype.pause=function(){return Lt(\"call pause flowing=%j\",this._readableState.flowing),this._readableState.flowing!==!1&&(Lt(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this};function g_(t){var e=t._readableState;for(Lt(\"flow\",e.flowing);e.flowing&&t.read()!==null;);}s(g_,\"flow\");pn.prototype.wrap=function(t){var e=this,n=this._readableState,i=!1;t.on(\"end\",function(){if(Lt(\"wrapped end\"),n.decoder&&!n.ended){var o=n.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on(\"data\",function(o){if(Lt(\"wrapped data\"),n.decoder&&(o=n.decoder.write(o)),!(n.objectMode&&o==null)&&!(!n.objectMode&&(!o||!o.length))){var l=e.push(o);l||(i=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]==\"function\"&&(this[a]=function(o){return function(){return t[o].apply(t,arguments)}}(a));for(var r=0;r<p_.length;r++)t.on(p_[r],this.emit.bind(this,p_[r]));return this._read=function(o){Lt(\"wrapped _read\",o),i&&(i=!1,t.resume())},this};Object.defineProperty(pn.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});pn._fromList=gw;function gw(t,e){if(e.length===0)return null;var n;return e.objectMode?n=e.buffer.shift():!t||t>=e.length?(e.decoder?n=e.buffer.join(\"\"):e.buffer.length===1?n=e.buffer.head.data:n=e.buffer.concat(e.length),e.buffer.clear()):n=mue(t,e.buffer,e.decoder),n}s(gw,\"fromList\");function mue(t,e,n){var i;return t<e.head.data.length?(i=e.head.data.slice(0,t),e.head.data=e.head.data.slice(t)):t===e.head.data.length?i=e.shift():i=n?fue(t,e):hue(t,e),i}s(mue,\"fromListPartial\");function fue(t,e){var n=e.head,i=1,a=n.data;for(t-=a.length;n=n.next;){var r=n.data,o=t>r.length?r.length:t;if(o===r.length?a+=r:a+=r.slice(0,t),t-=o,t===0){o===r.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=r.slice(o));break}++i}return e.length-=i,a}s(fue,\"copyFromBufferString\");function hue(t,e){var n=xu.allocUnsafe(t),i=e.head,a=1;for(i.data.copy(n),t-=i.data.length;i=i.next;){var r=i.data,o=t>r.length?r.length:t;if(r.copy(n,n.length-t,0,o),t-=o,t===0){o===r.length?(++a,i.next?e.head=i.next:e.head=e.tail=null):(e.head=i,i.data=r.slice(o));break}++a}return e.length-=a,n}s(hue,\"copyFromBuffer\");function f_(t){var e=t._readableState;if(e.length>0)throw new Error('\"endReadable()\" called on non-empty stream');e.endEmitted||(e.ended=!0,Ll.nextTick(gue,e,t))}s(f_,\"endReadable\");function gue(t,e){!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"))}s(gue,\"endReadableNT\");function _w(t,e){for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n;return-1}s(_w,\"indexOf\")});var __=oe((MEe,yw)=>{\"use strict\";yw.exports=so;var Jp=Ss(),bw=Object.create(Rl());bw.inherits=Ts();bw.inherits(so,Jp);function _ue(t,e){var n=this._transformState;n.transforming=!1;var i=n.writecb;if(!i)return this.emit(\"error\",new Error(\"write callback called multiple times\"));n.writechunk=null,n.writecb=null,e!=null&&this.push(e),i(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}s(_ue,\"afterTransform\");function so(t){if(!(this instanceof so))return new so(t);Jp.call(this,t),this._transformState={afterTransform:_ue.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,t&&(typeof t.transform==\"function\"&&(this._transform=t.transform),typeof t.flush==\"function\"&&(this._flush=t.flush)),this.on(\"prefinish\",xue)}s(so,\"Transform\");function xue(){var t=this;typeof this._flush==\"function\"?this._flush(function(e,n){vw(t,e,n)}):vw(this,null,null)}s(xue,\"prefinish\");so.prototype.push=function(t,e){return this._transformState.needTransform=!1,Jp.prototype.push.call(this,t,e)};so.prototype._transform=function(t,e,n){throw new Error(\"_transform() is not implemented\")};so.prototype._write=function(t,e,n){var i=this._transformState;if(i.writecb=n,i.writechunk=t,i.writeencoding=e,!i.transforming){var a=this._readableState;(i.needTransform||a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}};so.prototype._read=function(t){var e=this._transformState;e.writechunk!==null&&e.writecb&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};so.prototype._destroy=function(t,e){var n=this;Jp.prototype._destroy.call(this,t,function(i){e(i),n.emit(\"close\")})};function vw(t,e,n){if(e)return t.emit(\"error\",e);if(n!=null&&t.push(n),t._writableState.length)throw new Error(\"Calling transform done when ws.length != 0\");if(t._transformState.transforming)throw new Error(\"Calling transform done when still transforming\");return t.push(null)}s(vw,\"done\")});var jw=oe((PEe,kw)=>{\"use strict\";kw.exports=vu;var ww=__(),Ew=Object.create(Rl());Ew.inherits=Ts();Ew.inherits(vu,ww);function vu(t){if(!(this instanceof vu))return new vu(t);ww.call(this,t)}s(vu,\"PassThrough\");vu.prototype._transform=function(t,e,n){n(null,t)}});var Os=oe((oi,Gp)=>{var gr=Ee(\"stream\");process.env.READABLE_STREAM===\"disable\"&&gr?(Gp.exports=gr,oi=Gp.exports=gr.Readable,oi.Readable=gr.Readable,oi.Writable=gr.Writable,oi.Duplex=gr.Duplex,oi.Transform=gr.Transform,oi.PassThrough=gr.PassThrough,oi.Stream=gr):(oi=Gp.exports=o_(),oi.Stream=gr||oi,oi.Readable=oi,oi.Writable=i_(),oi.Duplex=Ss(),oi.Transform=__(),oi.PassThrough=jw())});var Tw=oe((VEe,Aw)=>{Aw.exports=Os().Duplex});var Sw=oe((zEe,Cw)=>{var x_=Tw(),vue=Ee(\"util\"),Vl=Cp().Buffer;function In(t){if(!(this instanceof In))return new In(t);if(this._bufs=[],this.length=0,typeof t==\"function\"){this._callback=t;var e=s(function(i){this._callback&&(this._callback(i),this._callback=null)},\"piper\").bind(this);this.on(\"pipe\",s(function(i){i.on(\"error\",e)},\"onPipe\")),this.on(\"unpipe\",s(function(i){i.removeListener(\"error\",e)},\"onUnpipe\"))}else this.append(t);x_.call(this)}s(In,\"BufferList\");vue.inherits(In,x_);In.prototype._offset=s(function(e){var n=0,i=0,a;if(e===0)return[0,0];for(;i<this._bufs.length;i++){if(a=n+this._bufs[i].length,e<a||i==this._bufs.length-1)return[i,e-n];n=a}},\"_offset\");In.prototype.append=s(function(e){var n=0;if(Vl.isBuffer(e))this._appendBuffer(e);else if(Array.isArray(e))for(;n<e.length;n++)this.append(e[n]);else if(e instanceof In)for(;n<e._bufs.length;n++)this.append(e._bufs[n]);else e!=null&&(typeof e==\"number\"&&(e=e.toString()),this._appendBuffer(Vl.from(e)));return this},\"append\");In.prototype._appendBuffer=s(function(e){this._bufs.push(e),this.length+=e.length},\"appendBuffer\");In.prototype._write=s(function(e,n,i){this._appendBuffer(e),typeof i==\"function\"&&i()},\"_write\");In.prototype._read=s(function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)},\"_read\");In.prototype.end=s(function(e){x_.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)},\"end\");In.prototype.get=s(function(e){return this.slice(e,e+1)[0]},\"get\");In.prototype.slice=s(function(e,n){return typeof e==\"number\"&&e<0&&(e+=this.length),typeof n==\"number\"&&n<0&&(n+=this.length),this.copy(null,0,e,n)},\"slice\");In.prototype.copy=s(function(e,n,i,a){if((typeof i!=\"number\"||i<0)&&(i=0),(typeof a!=\"number\"||a>this.length)&&(a=this.length),i>=this.length||a<=0)return e||Vl.alloc(0);var r=!!e,o=this._offset(i),l=a-i,c=l,d=r&&n||0,u=o[1],p,m;if(i===0&&a==this.length){if(!r)return this._bufs.length===1?this._bufs[0]:Vl.concat(this._bufs,this.length);for(m=0;m<this._bufs.length;m++)this._bufs[m].copy(e,d),d+=this._bufs[m].length;return e}if(c<=this._bufs[o[0]].length-u)return r?this._bufs[o[0]].copy(e,n,u,u+c):this._bufs[o[0]].slice(u,u+c);for(r||(e=Vl.allocUnsafe(l)),m=o[0];m<this._bufs.length;m++){if(p=this._bufs[m].length-u,c>p)this._bufs[m].copy(e,d,u),d+=p;else{this._bufs[m].copy(e,d,u,u+c),d+=p;break}c-=p,u&&(u=0)}return e.length>d?e.slice(0,d):e},\"copy\");In.prototype.shallowSlice=s(function(e,n){e=e||0,n=n||this.length,e<0&&(e+=this.length),n<0&&(n+=this.length);var i=this._offset(e),a=this._offset(n),r=this._bufs.slice(i[0],a[0]+1);return a[1]==0?r.pop():r[r.length-1]=r[r.length-1].slice(0,a[1]),i[1]!=0&&(r[0]=r[0].slice(i[1])),new In(r)},\"shallowSlice\");In.prototype.toString=s(function(e,n,i){return this.slice(n,i).toString(e)},\"toString\");In.prototype.consume=s(function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this},\"consume\");In.prototype.duplicate=s(function(){for(var e=0,n=new In;e<this._bufs.length;e++)n.append(this._bufs[e]);return n},\"duplicate\");In.prototype.destroy=s(function(){this._bufs.length=0,this.length=0,this.push(null)},\"destroy\");(function(){var t={readDoubleBE:8,readDoubleLE:8,readFloatBE:4,readFloatLE:4,readInt32BE:4,readInt32LE:4,readUInt32BE:4,readUInt32LE:4,readInt16BE:2,readInt16LE:2,readUInt16BE:2,readUInt16LE:2,readInt8:1,readUInt8:1};for(var e in t)(function(n){In.prototype[n]=function(i){return this.slice(i,i+t[n])[n](0)}})(e)})();Cw.exports=In});var Iw=oe((qEe,Ow)=>{Ow.exports=yue;var bue=Object.prototype.hasOwnProperty;function yue(){for(var t={},e=0;e<arguments.length;e++){var n=arguments[e];for(var i in n)bue.call(n,i)&&(t[i]=n[i])}return t}s(yue,\"extend\")});var v_=oe((JEe,Fw)=>{Fw.exports=Eue;var Dw=Buffer.from&&Buffer.from!==Uint8Array.from?Buffer.from:wue;function wue(t,e){return new Buffer(t,e)}s(wue,\"bufferFrom\");function Eue(t,e){if(Buffer.isBuffer(t))return t;if(typeof t==\"string\")return Dw(t,e);if(Array.isArray(t))return Dw(t);throw new Error(\"Input should be a buffer or a string\")}s(Eue,\"toBuffer\")});var Rw=oe((WEe,Nw)=>{var kue=function(){try{if(!Buffer.isEncoding(\"latin1\"))return!1;var t=Buffer.alloc?Buffer.alloc(4):new Buffer(4);return t.fill(\"ab\",\"ucs2\"),t.toString(\"hex\")===\"61006200\"}catch{return!1}}();function jue(t){return t.length===1&&t.charCodeAt(0)<256}s(jue,\"isSingleByte\");function Wp(t,e,n,i){if(n<0||i>t.length)throw new RangeError(\"Out of range index\");return n=n>>>0,i=i===void 0?t.length:i>>>0,i>n&&t.fill(e,n,i),t}s(Wp,\"fillWithNumber\");function Aue(t,e,n,i){if(n<0||i>t.length)throw new RangeError(\"Out of range index\");if(i<=n)return t;n=n>>>0,i=i===void 0?t.length:i>>>0;for(var a=n,r=e.length;a<=i-r;)e.copy(t,a),a+=r;return a!==i&&e.copy(t,a,0,i-a),t}s(Aue,\"fillWithBuffer\");function Tue(t,e,n,i,a){if(kue)return t.fill(e,n,i,a);if(typeof e==\"number\")return Wp(t,e,n,i);if(typeof e==\"string\"){if(typeof n==\"string\"?(a=n,n=0,i=t.length):typeof i==\"string\"&&(a=i,i=t.length),a!==void 0&&typeof a!=\"string\")throw new TypeError(\"encoding must be a string\");if(a===\"latin1\"&&(a=\"binary\"),typeof a==\"string\"&&!Buffer.isEncoding(a))throw new TypeError(\"Unknown encoding: \"+a);if(e===\"\")return Wp(t,0,n,i);if(jue(e))return Wp(t,e.charCodeAt(0),n,i);e=new Buffer(e,a)}return Buffer.isBuffer(e)?Aue(t,e,n,i):Wp(t,0,n,i)}s(Tue,\"fill\");Nw.exports=Tue});var Bw=oe((YEe,Mw)=>{function Cue(t){if(typeof t!=\"number\")throw new TypeError('\"size\" argument must be a number');if(t<0)throw new RangeError('\"size\" argument must not be negative');return Buffer.allocUnsafe?Buffer.allocUnsafe(t):new Buffer(t)}s(Cue,\"allocUnsafe\");Mw.exports=Cue});var b_=oe((ZEe,Lw)=>{var Pw=Rw(),Sue=Bw();Lw.exports=s(function(e,n,i){if(typeof e!=\"number\")throw new TypeError('\"size\" argument must be a number');if(e<0)throw new RangeError('\"size\" argument must not be negative');if(Buffer.alloc)return Buffer.alloc(e,n,i);var a=Sue(e);return e===0?a:n===void 0?Pw(a,0):(typeof i!=\"string\"&&(i=void 0),Pw(a,n,i))},\"alloc\")});var w_=oe(Ul=>{var Oue=v_(),Iue=b_(),Due=\"0000000000000000000\",Fue=\"7777777777777777777\",Vw=\"0\".charCodeAt(0),Nue=\"ustar\\x0000\",Rue=parseInt(\"7777\",8),Mue=s(function(t,e,n){return typeof t!=\"number\"?n:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},\"clamp\"),Bue=s(function(t){switch(t){case 0:return\"file\";case 1:return\"link\";case 2:return\"symlink\";case 3:return\"character-device\";case 4:return\"block-device\";case 5:return\"directory\";case 6:return\"fifo\";case 7:return\"contiguous-file\";case 72:return\"pax-header\";case 55:return\"pax-global-header\";case 27:return\"gnu-long-link-path\";case 28:case 30:return\"gnu-long-path\"}return null},\"toType\"),Pue=s(function(t){switch(t){case\"file\":return 0;case\"link\":return 1;case\"symlink\":return 2;case\"character-device\":return 3;case\"block-device\":return 4;case\"directory\":return 5;case\"fifo\":return 6;case\"contiguous-file\":return 7;case\"pax-header\":return 72}return 0},\"toTypeflag\"),zw=s(function(t,e,n,i){for(;n<i;n++)if(t[n]===e)return n;return i},\"indexOf\"),Uw=s(function(t){for(var e=256,n=0;n<148;n++)e+=t[n];for(var i=156;i<512;i++)e+=t[i];return e},\"cksum\"),Mo=s(function(t,e){return t=t.toString(8),t.length>e?Fue.slice(0,e)+\" \":Due.slice(0,e-t.length)+t+\" \"},\"encodeOct\");function Lue(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var n=!1,i=[],a=t.length-1;a>0;a--){var r=t[a];e?i.push(r):n&&r===0?i.push(0):n?(n=!1,i.push(256-r)):i.push(255-r)}var o=0,l=i.length;for(a=0;a<l;a++)o+=i[a]*Math.pow(256,a);return e?o:-1*o}s(Lue,\"parse256\");var Bo=s(function(t,e,n){if(t=t.slice(e,e+n),e=0,t[e]&128)return Lue(t);for(;e<t.length&&t[e]===32;)e++;for(var i=Mue(zw(t,32,e,t.length),t.length,t.length);e<i&&t[e]===0;)e++;return i===e?0:parseInt(t.slice(e,i).toString(),8)},\"decodeOct\"),zl=s(function(t,e,n,i){return t.slice(e,zw(t,0,e,e+n)).toString(i)},\"decodeStr\"),y_=s(function(t){var e=Buffer.byteLength(t),n=Math.floor(Math.log(e)/Math.log(10))+1;return e+n>=Math.pow(10,n)&&n++,e+n+t},\"addLength\");Ul.decodeLongPath=function(t,e){return zl(t,0,t.length,e)};Ul.encodePax=function(t){var e=\"\";t.name&&(e+=y_(\" path=\"+t.name+`\n`)),t.linkname&&(e+=y_(\" linkpath=\"+t.linkname+`\n`));var n=t.pax;if(n)for(var i in n)e+=y_(\" \"+i+\"=\"+n[i]+`\n`);return Oue(e)};Ul.decodePax=function(t){for(var e={};t.length;){for(var n=0;n<t.length&&t[n]!==32;)n++;var i=parseInt(t.slice(0,n).toString(),10);if(!i)return e;var a=t.slice(n+1,i-1).toString(),r=a.indexOf(\"=\");if(r===-1)return e;e[a.slice(0,r)]=a.slice(r+1),t=t.slice(i)}return e};Ul.encode=function(t){var e=Iue(512),n=t.name,i=\"\";if(t.typeflag===5&&n[n.length-1]!==\"/\"&&(n+=\"/\"),Buffer.byteLength(n)!==n.length)return null;for(;Buffer.byteLength(n)>100;){var a=n.indexOf(\"/\");if(a===-1)return null;i+=i?\"/\"+n.slice(0,a):n.slice(0,a),n=n.slice(a+1)}return Buffer.byteLength(n)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(n),e.write(Mo(t.mode&Rue,6),100),e.write(Mo(t.uid,6),108),e.write(Mo(t.gid,6),116),e.write(Mo(t.size,11),124),e.write(Mo(t.mtime.getTime()/1e3|0,11),136),e[156]=Vw+Pue(t.type),t.linkname&&e.write(t.linkname,157),e.write(Nue,257),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Mo(t.devmajor||0,6),329),e.write(Mo(t.devminor||0,6),337),i&&e.write(i,345),e.write(Mo(Uw(e),6),148),e)};Ul.decode=function(t,e){var n=t[156]===0?0:t[156]-Vw,i=zl(t,0,100,e),a=Bo(t,100,8),r=Bo(t,108,8),o=Bo(t,116,8),l=Bo(t,124,12),c=Bo(t,136,12),d=Bue(n),u=t[157]===0?null:zl(t,157,100,e),p=zl(t,265,32),m=zl(t,297,32),f=Bo(t,329,8),g=Bo(t,337,8);t[345]&&(i=zl(t,345,155,e)+\"/\"+i),n===0&&i&&i[i.length-1]===\"/\"&&(n=5);var x=Uw(t);if(x===8*32)return null;if(x!==Bo(t,148,8))throw new Error(\"Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?\");return{name:i,mode:a,uid:r,gid:o,size:l,mtime:new Date(1e3*c),type:d,linkname:u,uname:p,gname:m,devmajor:f,devminor:g}}});var Yw=oe((tke,Kw)=>{var Hw=Ee(\"util\"),Vue=Sw(),zue=Iw(),bu=w_(),Jw=Os().Writable,Gw=Os().PassThrough,Ww=s(function(){},\"noop\"),qw=s(function(t){return t&=511,t&&512-t},\"overflow\"),Uue=s(function(t,e){var n=new Kp(t,e);return n.end(),n},\"emptyStream\"),que=s(function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},\"mixinPax\"),Kp=s(function(t,e){this._parent=t,this.offset=e,Gw.call(this)},\"Source\");Hw.inherits(Kp,Gw);Kp.prototype.destroy=function(t){this._parent.destroy(t)};var lo=s(function(t){if(!(this instanceof lo))return new lo(t);Jw.call(this,t),t=t||{},this._offset=0,this._buffer=Vue(),this._missing=0,this._partial=!1,this._onparse=Ww,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,n=e._buffer,i=s(function(){e._continue()},\"oncontinue\"),a=s(function(m){if(e._locked=!1,m)return e.destroy(m);e._stream||i()},\"onunlock\"),r=s(function(){e._stream=null;var m=qw(e._header.size);m?e._parse(m,o):e._parse(512,p),e._locked||i()},\"onstreamend\"),o=s(function(){e._buffer.consume(qw(e._header.size)),e._parse(512,p),i()},\"ondrain\"),l=s(function(){var m=e._header.size;e._paxGlobal=bu.decodePax(n.slice(0,m)),n.consume(m),r()},\"onpaxglobalheader\"),c=s(function(){var m=e._header.size;e._pax=bu.decodePax(n.slice(0,m)),e._paxGlobal&&(e._pax=zue(e._paxGlobal,e._pax)),n.consume(m),r()},\"onpaxheader\"),d=s(function(){var m=e._header.size;this._gnuLongPath=bu.decodeLongPath(n.slice(0,m),t.filenameEncoding),n.consume(m),r()},\"ongnulongpath\"),u=s(function(){var m=e._header.size;this._gnuLongLinkPath=bu.decodeLongPath(n.slice(0,m),t.filenameEncoding),n.consume(m),r()},\"ongnulonglinkpath\"),p=s(function(){var m=e._offset,f;try{f=e._header=bu.decode(n.slice(0,512),t.filenameEncoding)}catch(g){e.emit(\"error\",g)}if(n.consume(512),!f){e._parse(512,p),i();return}if(f.type===\"gnu-long-path\"){e._parse(f.size,d),i();return}if(f.type===\"gnu-long-link-path\"){e._parse(f.size,u),i();return}if(f.type===\"pax-global-header\"){e._parse(f.size,l),i();return}if(f.type===\"pax-header\"){e._parse(f.size,c),i();return}if(e._gnuLongPath&&(f.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(f.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=f=que(f,e._pax),e._pax=null),e._locked=!0,!f.size||f.type===\"directory\"){e._parse(512,p),e.emit(\"entry\",f,Uue(e,m),a);return}e._stream=new Kp(e,m),e.emit(\"entry\",f,e._stream,a),e._parse(f.size,r),i()},\"onheader\");this._onheader=p,this._parse(512,p)},\"Extract\");Hw.inherits(lo,Jw);lo.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};lo.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};lo.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=Ww,this._overflow?this._write(this._overflow,void 0,t):t()}};lo.prototype._write=function(t,e,n){if(!this._destroyed){var i=this._stream,a=this._buffer,r=this._missing;if(t.length&&(this._partial=!0),t.length<r)return this._missing-=t.length,this._overflow=null,i?i.write(t,n):(a.append(t),n());this._cb=n,this._missing=0;var o=null;t.length>r&&(o=t.slice(r),t=t.slice(0,r)),i?i.end(t):a.append(t),this._overflow=o,this._onparse()}};lo.prototype._final=function(t){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));t()};Kw.exports=lo});var Zw=oe((ike,Xw)=>{Xw.exports=Ee(\"fs\").constants||Ee(\"constants\")});var e3=oe((ake,$w)=>{$w.exports=Qw;function Qw(t,e){if(t&&e)return Qw(t)(e);if(typeof t!=\"function\")throw new TypeError(\"need wrapper function\");return Object.keys(t).forEach(function(i){n[i]=t[i]}),n;function n(){for(var i=new Array(arguments.length),a=0;a<i.length;a++)i[a]=arguments[a];var r=t.apply(this,i),o=i[i.length-1];return typeof r==\"function\"&&r!==o&&Object.keys(o).forEach(function(l){r[l]=o[l]}),r}s(n,\"wrapper\")}s(Qw,\"wrappy\")});var k_=oe((oke,E_)=>{var t3=e3();E_.exports=t3(Yp);E_.exports.strict=t3(n3);Yp.proto=Yp(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return Yp(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return n3(this)},configurable:!0})});function Yp(t){var e=s(function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))},\"f\");return e.called=!1,e}s(Yp,\"once\");function n3(t){var e=s(function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},\"f\"),n=t.name||\"Function wrapped with `once`\";return e.onceError=n+\" shouldn't be called more than once\",e.called=!1,e}s(n3,\"onceStrict\")});var j_=oe((lke,a3)=>{var Hue=k_(),Jue=s(function(){},\"noop\"),Gue=s(function(t){return t.setHeader&&typeof t.abort==\"function\"},\"isRequest\"),Wue=s(function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},\"isChildProcess\"),i3=s(function(t,e,n){if(typeof e==\"function\")return i3(t,null,e);e||(e={}),n=Hue(n||Jue);var i=t._writableState,a=t._readableState,r=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,l=!1,c=s(function(){t.writable||d()},\"onlegacyfinish\"),d=s(function(){o=!1,r||n.call(t)},\"onfinish\"),u=s(function(){r=!1,o||n.call(t)},\"onend\"),p=s(function(_){n.call(t,_?new Error(\"exited with error code: \"+_):null)},\"onexit\"),m=s(function(_){n.call(t,_)},\"onerror\"),f=s(function(){process.nextTick(g)},\"onclose\"),g=s(function(){if(!l){if(r&&!(a&&a.ended&&!a.destroyed))return n.call(t,new Error(\"premature close\"));if(o&&!(i&&i.ended&&!i.destroyed))return n.call(t,new Error(\"premature close\"))}},\"onclosenexttick\"),x=s(function(){t.req.on(\"finish\",d)},\"onrequest\");return Gue(t)?(t.on(\"complete\",d),t.on(\"abort\",f),t.req?x():t.on(\"request\",x)):o&&!i&&(t.on(\"end\",c),t.on(\"close\",c)),Wue(t)&&t.on(\"exit\",p),t.on(\"end\",u),t.on(\"finish\",d),e.error!==!1&&t.on(\"error\",m),t.on(\"close\",f),function(){l=!0,t.removeListener(\"complete\",d),t.removeListener(\"abort\",f),t.removeListener(\"request\",x),t.req&&t.req.removeListener(\"finish\",d),t.removeListener(\"end\",c),t.removeListener(\"close\",c),t.removeListener(\"finish\",d),t.removeListener(\"exit\",p),t.removeListener(\"end\",u),t.removeListener(\"error\",m),t.removeListener(\"close\",f)}},\"eos\");a3.exports=i3});var c3=oe((uke,l3)=>{var ql=Zw(),r3=j_(),Zp=Ee(\"util\"),Kue=b_(),Yue=v_(),o3=Os().Readable,Hl=Os().Writable,Xue=Ee(\"string_decoder\").StringDecoder,Xp=w_(),Zue=parseInt(\"755\",8),Que=parseInt(\"644\",8),s3=Kue(1024),T_=s(function(){},\"noop\"),A_=s(function(t,e){e&=511,e&&t.push(s3.slice(0,512-e))},\"overflow\");function $ue(t){switch(t&ql.S_IFMT){case ql.S_IFBLK:return\"block-device\";case ql.S_IFCHR:return\"character-device\";case ql.S_IFDIR:return\"directory\";case ql.S_IFIFO:return\"fifo\";case ql.S_IFLNK:return\"symlink\"}return\"file\"}s($ue,\"modeToType\");var Qp=s(function(t){Hl.call(this),this.written=0,this._to=t,this._destroyed=!1},\"Sink\");Zp.inherits(Qp,Hl);Qp.prototype._write=function(t,e,n){if(this.written+=t.length,this._to.push(t))return n();this._to._drain=n};Qp.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var $p=s(function(){Hl.call(this),this.linkname=\"\",this._decoder=new Xue(\"utf-8\"),this._destroyed=!1},\"LinkSink\");Zp.inherits($p,Hl);$p.prototype._write=function(t,e,n){this.linkname+=this._decoder.write(t),n()};$p.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var yu=s(function(){Hl.call(this),this._destroyed=!1},\"Void\");Zp.inherits(yu,Hl);yu.prototype._write=function(t,e,n){n(new Error(\"No body allowed for this entry\"))};yu.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var _r=s(function(t){if(!(this instanceof _r))return new _r(t);o3.call(this,t),this._drain=T_,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null},\"Pack\");Zp.inherits(_r,o3);_r.prototype.entry=function(t,e,n){if(this._stream)throw new Error(\"already piping an entry\");if(!(this._finalized||this._destroyed)){typeof e==\"function\"&&(n=e,e=null),n||(n=T_);var i=this;if((!t.size||t.type===\"symlink\")&&(t.size=0),t.type||(t.type=$ue(t.mode)),t.mode||(t.mode=t.type===\"directory\"?Zue:Que),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e==\"string\"&&(e=Yue(e)),Buffer.isBuffer(e))return t.size=e.length,this._encode(t),this.push(e),A_(i,t.size),process.nextTick(n),new yu;if(t.type===\"symlink\"&&!t.linkname){var a=new $p;return r3(a,function(o){if(o)return i.destroy(),n(o);t.linkname=a.linkname,i._encode(t),n()}),a}if(this._encode(t),t.type!==\"file\"&&t.type!==\"contiguous-file\")return process.nextTick(n),new yu;var r=new Qp(this);return this._stream=r,r3(r,function(o){if(i._stream=null,o)return i.destroy(),n(o);if(r.written!==t.size)return i.destroy(),n(new Error(\"size mismatch\"));A_(i,t.size),i._finalizing&&i.finalize(),n()}),r}};_r.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(s3),this.push(null))};_r.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.destroy&&this._stream.destroy())};_r.prototype._encode=function(t){if(!t.pax){var e=Xp.encode(t);if(e){this.push(e);return}}this._encodePax(t)};_r.prototype._encodePax=function(t){var e=Xp.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),n={name:\"PaxHeader\",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:\"pax-header\",linkname:t.linkname&&\"PaxHeader\",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(Xp.encode(n)),this.push(e),A_(this,e.length),n.size=t.size,n.type=t.type,this.push(Xp.encode(n))};_r.prototype._read=function(t){var e=this._drain;this._drain=T_,e()};l3.exports=_r});var u3=oe(C_=>{C_.extract=Yw();C_.pack=c3()});var em=oe((mke,p3)=>{\"use strict\";var d3=Wg(),ede=Fp(),tde=u3();p3.exports=()=>t=>{if(!Buffer.isBuffer(t)&&!ede(t))return Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`));if(Buffer.isBuffer(t)&&(!d3(t)||d3(t).ext!==\"tar\"))return Promise.resolve([]);let e=tde.extract(),n=[];e.on(\"entry\",(a,r,o)=>{let l=[];r.on(\"data\",c=>l.push(c)),r.on(\"end\",()=>{let c={data:Buffer.concat(l),mode:a.mode,mtime:a.mtime,path:a.name,type:a.type};(a.type===\"symlink\"||a.type===\"link\")&&(c.linkname=a.linkname),n.push(c),o()})});let i=new Promise((a,r)=>{Buffer.isBuffer(t)||t.on(\"error\",r),e.on(\"finish\",()=>a(n)),e.on(\"error\",r)});return e.then=i.then.bind(i),e.catch=i.catch.bind(i),Buffer.isBuffer(t)?e.end(t):t.pipe(e),e}});var f3=oe((fke,m3)=>{\"use strict\";var Jl=s(t=>Array.from(t).map(e=>e.charCodeAt(0)),\"toBytes\"),nde=Jl(\"META-INF/mozilla.rsa\"),ide=Jl(\"[Content_Types].xml\"),ade=Jl(\"_rels/.rels\");m3.exports=t=>{let e=new Uint8Array(t);if(!(e&&e.length>1))return null;let n=s((i,a)=>{a=Object.assign({offset:0},a);for(let r=0;r<i.length;r++)if(a.mask){if(i[r]!==(a.mask[r]&e[r+a.offset]))return!1}else if(i[r]!==e[r+a.offset])return!1;return!0},\"check\");if(n([255,216,255]))return{ext:\"jpg\",mime:\"image/jpeg\"};if(n([137,80,78,71,13,10,26,10]))return{ext:\"png\",mime:\"image/png\"};if(n([71,73,70]))return{ext:\"gif\",mime:\"image/gif\"};if(n([87,69,66,80],{offset:8}))return{ext:\"webp\",mime:\"image/webp\"};if(n([70,76,73,70]))return{ext:\"flif\",mime:\"image/flif\"};if((n([73,73,42,0])||n([77,77,0,42]))&&n([67,82],{offset:8}))return{ext:\"cr2\",mime:\"image/x-canon-cr2\"};if(n([73,73,42,0])||n([77,77,0,42]))return{ext:\"tif\",mime:\"image/tiff\"};if(n([66,77]))return{ext:\"bmp\",mime:\"image/bmp\"};if(n([73,73,188]))return{ext:\"jxr\",mime:\"image/vnd.ms-photo\"};if(n([56,66,80,83]))return{ext:\"psd\",mime:\"image/vnd.adobe.photoshop\"};if(n([80,75,3,4])){if(n([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:\"epub\",mime:\"application/epub+zip\"};if(n(nde,{offset:30}))return{ext:\"xpi\",mime:\"application/x-xpinstall\"};if(n(ide,{offset:30})||n(ade,{offset:30})){let i=e.subarray(4,2004),a=s(o=>o.findIndex((l,c,d)=>d[c]===80&&d[c+1]===75&&d[c+2]===3&&d[c+3]===4),\"nextZipHeaderIndex\"),r=a(i);if(r!==-1){let o=e.subarray(r+8,r+8+1e3),l=a(o);if(l!==-1){let c=8+r+l+30;if(n(Jl(\"word/\"),{offset:c}))return{ext:\"docx\",mime:\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"};if(n(Jl(\"ppt/\"),{offset:c}))return{ext:\"pptx\",mime:\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"};if(n(Jl(\"xl/\"),{offset:c}))return{ext:\"xlsx\",mime:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"}}}}}if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:\"zip\",mime:\"application/zip\"};if(n([117,115,116,97,114],{offset:257}))return{ext:\"tar\",mime:\"application/x-tar\"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:\"rar\",mime:\"application/x-rar-compressed\"};if(n([31,139,8]))return{ext:\"gz\",mime:\"application/gzip\"};if(n([66,90,104]))return{ext:\"bz2\",mime:\"application/x-bzip2\"};if(n([55,122,188,175,39,28]))return{ext:\"7z\",mime:\"application/x-7z-compressed\"};if(n([120,1]))return{ext:\"dmg\",mime:\"application/x-apple-diskimage\"};if(n([51,103,112,53])||n([0,0,0])&&n([102,116,121,112],{offset:4})&&(n([109,112,52,49],{offset:8})||n([109,112,52,50],{offset:8})||n([105,115,111,109],{offset:8})||n([105,115,111,50],{offset:8})||n([109,109,112,52],{offset:8})||n([77,52,86],{offset:8})||n([100,97,115,104],{offset:8})))return{ext:\"mp4\",mime:\"video/mp4\"};if(n([77,84,104,100]))return{ext:\"mid\",mime:\"audio/midi\"};if(n([26,69,223,163])){let i=e.subarray(4,4100),a=i.findIndex((r,o,l)=>l[o]===66&&l[o+1]===130);if(a!==-1){let r=a+3,o=s(l=>Array.from(l).every((c,d)=>i[r+d]===c.charCodeAt(0)),\"findDocType\");if(o(\"matroska\"))return{ext:\"mkv\",mime:\"video/x-matroska\"};if(o(\"webm\"))return{ext:\"webm\",mime:\"video/webm\"}}}if(n([0,0,0,20,102,116,121,112,113,116,32,32])||n([102,114,101,101],{offset:4})||n([102,116,121,112,113,116,32,32],{offset:4})||n([109,100,97,116],{offset:4})||n([119,105,100,101],{offset:4}))return{ext:\"mov\",mime:\"video/quicktime\"};if(n([82,73,70,70])&&n([65,86,73],{offset:8}))return{ext:\"avi\",mime:\"video/x-msvideo\"};if(n([48,38,178,117,142,102,207,17,166,217]))return{ext:\"wmv\",mime:\"video/x-ms-wmv\"};if(n([0,0,1,186]))return{ext:\"mpg\",mime:\"video/mpeg\"};for(let i=0;i<2&&i<e.length-16;i++)if(n([73,68,51],{offset:i})||n([255,226],{offset:i,mask:[255,226]}))return{ext:\"mp3\",mime:\"audio/mpeg\"};return n([102,116,121,112,77,52,65],{offset:4})||n([77,52,65,32])?{ext:\"m4a\",mime:\"audio/m4a\"}:n([79,112,117,115,72,101,97,100],{offset:28})?{ext:\"opus\",mime:\"audio/opus\"}:n([79,103,103,83])?{ext:\"ogg\",mime:\"audio/ogg\"}:n([102,76,97,67])?{ext:\"flac\",mime:\"audio/x-flac\"}:n([82,73,70,70])&&n([87,65,86,69],{offset:8})?{ext:\"wav\",mime:\"audio/x-wav\"}:n([35,33,65,77,82,10])?{ext:\"amr\",mime:\"audio/amr\"}:n([37,80,68,70])?{ext:\"pdf\",mime:\"application/pdf\"}:n([77,90])?{ext:\"exe\",mime:\"application/x-msdownload\"}:(e[0]===67||e[0]===70)&&n([87,83],{offset:1})?{ext:\"swf\",mime:\"application/x-shockwave-flash\"}:n([123,92,114,116,102])?{ext:\"rtf\",mime:\"application/rtf\"}:n([0,97,115,109])?{ext:\"wasm\",mime:\"application/wasm\"}:n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff\",mime:\"font/woff\"}:n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4}))?{ext:\"woff2\",mime:\"font/woff2\"}:n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8}))?{ext:\"eot\",mime:\"application/octet-stream\"}:n([0,1,0,0,0])?{ext:\"ttf\",mime:\"font/ttf\"}:n([79,84,84,79,0])?{ext:\"otf\",mime:\"font/otf\"}:n([0,0,1,0])?{ext:\"ico\",mime:\"image/x-icon\"}:n([70,76,86,1])?{ext:\"flv\",mime:\"video/x-flv\"}:n([37,33])?{ext:\"ps\",mime:\"application/postscript\"}:n([253,55,122,88,90,0])?{ext:\"xz\",mime:\"application/x-xz\"}:n([83,81,76,105])?{ext:\"sqlite\",mime:\"application/x-sqlite3\"}:n([78,69,83,26])?{ext:\"nes\",mime:\"application/x-nintendo-nes-rom\"}:n([67,114,50,52])?{ext:\"crx\",mime:\"application/x-google-chrome-extension\"}:n([77,83,67,70])||n([73,83,99,40])?{ext:\"cab\",mime:\"application/vnd.ms-cab-compressed\"}:n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121])?{ext:\"deb\",mime:\"application/x-deb\"}:n([33,60,97,114,99,104,62])?{ext:\"ar\",mime:\"application/x-unix-archive\"}:n([237,171,238,219])?{ext:\"rpm\",mime:\"application/x-rpm\"}:n([31,160])||n([31,157])?{ext:\"Z\",mime:\"application/x-compress\"}:n([76,90,73,80])?{ext:\"lz\",mime:\"application/x-lzip\"}:n([208,207,17,224,161,177,26,225])?{ext:\"msi\",mime:\"application/x-msi\"}:n([6,14,43,52,2,5,1,1,13,1,2,1,1,2])?{ext:\"mxf\",mime:\"application/mxf\"}:n([71],{offset:4})&&(n([71],{offset:192})||n([71],{offset:196}))?{ext:\"mts\",mime:\"video/mp2t\"}:n([66,76,69,78,68,69,82])?{ext:\"blend\",mime:\"application/x-blender\"}:n([66,80,71,251])?{ext:\"bpg\",mime:\"image/bpg\"}:null}});var _3=oe((gke,g3)=>{var h3=[0,1,3,7,15,31,63,127,255],wu=s(function(t){this.stream=t,this.bitOffset=0,this.curByte=0,this.hasByte=!1},\"BitReader\");wu.prototype._ensureByte=function(){this.hasByte||(this.curByte=this.stream.readByte(),this.hasByte=!0)};wu.prototype.read=function(t){for(var e=0;t>0;){this._ensureByte();var n=8-this.bitOffset;if(t>=n)e<<=n,e|=h3[n]&this.curByte,this.hasByte=!1,this.bitOffset=0,t-=n;else{e<<=t;var i=n-t;e|=(this.curByte&h3[t]<<i)>>i,this.bitOffset+=t,t=0}}return e};wu.prototype.seek=function(t){var e=t%8,n=(t-e)/8;this.bitOffset=e,this.stream.seek(n),this.hasByte=!1};wu.prototype.pi=function(){var t=new Buffer(6),e;for(e=0;e<t.length;e++)t[e]=this.read(8);return t.toString(\"hex\")};g3.exports=wu});var v3=oe((xke,x3)=>{var Is=s(function(){},\"Stream\");Is.prototype.readByte=function(){throw new Error(\"abstract method readByte() not implemented\")};Is.prototype.read=function(t,e,n){for(var i=0;i<n;){var a=this.readByte();if(a<0)return i===0?-1:i;t[e++]=a,i++}return i};Is.prototype.seek=function(t){throw new Error(\"abstract method seek() not implemented\")};Is.prototype.writeByte=function(t){throw new Error(\"abstract method readByte() not implemented\")};Is.prototype.write=function(t,e,n){var i;for(i=0;i<n;i++)this.writeByte(t[e++]);return n};Is.prototype.flush=function(){};x3.exports=Is});var y3=oe((bke,b3)=>{b3.exports=function(){var t=new Uint32Array([0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,2552477408,2632100695,2443283854,2506133561,2334638140,2414271883,2191915858,2254759653,3190512472,3135915759,3081330742,3009969537,2905550212,2850959411,2762807018,2691435357,3560074640,3505614887,3719321342,3648080713,3342211916,3287746299,3467911202,3396681109,4063920168,4143685023,4223187782,4286162673,3779000052,3858754371,3904687514,3967668269,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,2896545431,2825181984,2770861561,2716262478,3215044683,3143675388,3055782693,3001194130,2326604591,2389456536,2200899649,2280525302,2578013683,2640855108,2418763421,2498394922,3769900519,3832873040,3912640137,3992402750,4088425275,4151408268,4197601365,4277358050,3334271071,3263032808,3476998961,3422541446,3585640067,3514407732,3694837229,3640369242,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,4046411278,4126034873,4172115296,4234965207,3794477266,3874110821,3953728444,4016571915,3609705398,3555108353,3735388376,3664026991,3290680682,3236090077,3449943556,3378572211,3174993278,3120533705,3032266256,2961025959,2923101090,2868635157,2813903052,2742672763,2604032198,2683796849,2461293480,2524268063,2284983834,2364738477,2175806836,2238787779,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,3316196985,3244833742,3425377559,3370778784,3601682597,3530312978,3744426955,3689838204,3819031489,3881883254,3928223919,4007849240,4037393693,4100235434,4180117107,4259748804,2310601993,2373574846,2151335527,2231098320,2596047829,2659030626,2470359227,2550115596,2947551409,2876312838,2788305887,2733848168,3165939309,3094707162,3040238851,2985771188]),e=s(function(){var n=4294967295;this.getCRC=function(){return~n>>>0},this.updateCRC=function(i){n=n<<8^t[(n>>>24^i)&255]},this.updateCRCRun=function(i,a){for(;a-- >0;)n=n<<8^t[(n>>>24^i)&255]}},\"CRC32\");return e}()});var w3=oe((wke,rde)=>{rde.exports={name:\"seek-bzip\",version:\"1.0.6\",contributors:[\"C. Scott Ananian (http://cscott.net)\",\"Eli Skeggs\",\"Kevin Kwok\",\"Rob Landley (http://landley.net)\"],description:\"a pure-JavaScript Node.JS module for random-access decoding bzip2 data\",main:\"./lib/index.js\",repository:{type:\"git\",url:\"https://github.com/cscott/seek-bzip.git\"},license:\"MIT\",bin:{\"seek-bunzip\":\"./bin/seek-bunzip\",\"seek-table\":\"./bin/seek-bzip-table\"},directories:{test:\"test\"},dependencies:{commander:\"^2.8.1\"},devDependencies:{fibers:\"~1.0.6\",mocha:\"~2.2.5\"},scripts:{test:\"mocha\"}}});var O3=oe((Eke,S3)=>{var ode=_3(),Eu=v3(),A3=y3(),T3=w3(),tm=20,E3=258,k3=0,sde=1,lde=2,cde=6,ude=50,dde=\"314159265359\",pde=\"177245385090\",j3=s(function(t,e){var n=t[e],i;for(i=e;i>0;i--)t[i]=t[i-1];return t[0]=n,n},\"mtf\"),mn={OK:0,LAST_BLOCK:-1,NOT_BZIP_DATA:-2,UNEXPECTED_INPUT_EOF:-3,UNEXPECTED_OUTPUT_EOF:-4,DATA_ERROR:-5,OUT_OF_MEMORY:-6,OBSOLETE_INPUT:-7,END_OF_BLOCK:-8},Po={};Po[mn.LAST_BLOCK]=\"Bad file checksum\";Po[mn.NOT_BZIP_DATA]=\"Not bzip data\";Po[mn.UNEXPECTED_INPUT_EOF]=\"Unexpected input EOF\";Po[mn.UNEXPECTED_OUTPUT_EOF]=\"Unexpected output EOF\";Po[mn.DATA_ERROR]=\"Data error\";Po[mn.OUT_OF_MEMORY]=\"Out of memory\";Po[mn.OBSOLETE_INPUT]=\"Obsolete (pre 0.9.5) bzip format not supported.\";var si=s(function(t,e){var n=Po[t]||\"unknown error\";e&&(n+=\": \"+e);var i=new TypeError(n);throw i.errorCode=t,i},\"_throw\"),Ei=s(function(t,e){this.writePos=this.writeCurrent=this.writeCount=0,this._start_bunzip(t,e)},\"Bunzip\");Ei.prototype._init_block=function(){var t=this._get_next_block();return t?(this.blockCRC=new A3,!0):(this.writeCount=-1,!1)};Ei.prototype._start_bunzip=function(t,e){var n=new Buffer(4);(t.read(n,0,4)!==4||String.fromCharCode(n[0],n[1],n[2])!==\"BZh\")&&si(mn.NOT_BZIP_DATA,\"bad magic\");var i=n[3]-48;(i<1||i>9)&&si(mn.NOT_BZIP_DATA,\"level out of range\"),this.reader=new ode(t),this.dbufSize=1e5*i,this.nextoutput=0,this.outputStream=e,this.streamCRC=0};Ei.prototype._get_next_block=function(){var t,e,n,i=this.reader,a=i.pi();if(a===pde)return!1;a!==dde&&si(mn.NOT_BZIP_DATA),this.targetBlockCRC=i.read(32)>>>0,this.streamCRC=(this.targetBlockCRC^(this.streamCRC<<1|this.streamCRC>>>31))>>>0,i.read(1)&&si(mn.OBSOLETE_INPUT);var r=i.read(24);r>this.dbufSize&&si(mn.DATA_ERROR,\"initial position out of bounds\");var o=i.read(16),l=new Buffer(256),c=0;for(t=0;t<16;t++)if(o&1<<15-t){var d=t*16;for(n=i.read(16),e=0;e<16;e++)n&1<<15-e&&(l[c++]=d+e)}var u=i.read(3);(u<lde||u>cde)&&si(mn.DATA_ERROR);var p=i.read(15);p===0&&si(mn.DATA_ERROR);var m=new Buffer(256);for(t=0;t<u;t++)m[t]=t;var f=new Buffer(p);for(t=0;t<p;t++){for(e=0;i.read(1);e++)e>=u&&si(mn.DATA_ERROR);f[t]=j3(m,e)}var g=c+2,x=[],_;for(e=0;e<u;e++){var h=new Buffer(g),v=new Uint16Array(tm+1);for(o=i.read(5),t=0;t<g;t++){for(;(o<1||o>tm)&&si(mn.DATA_ERROR),!!i.read(1);)i.read(1)?o--:o++;h[t]=o}var b,y;for(b=y=h[0],t=1;t<g;t++)h[t]>y?y=h[t]:h[t]<b&&(b=h[t]);_={},x.push(_),_.permute=new Uint16Array(E3),_.limit=new Uint32Array(tm+2),_.base=new Uint32Array(tm+1),_.minLen=b,_.maxLen=y;var w=0;for(t=b;t<=y;t++)for(v[t]=_.limit[t]=0,o=0;o<g;o++)h[o]===t&&(_.permute[w++]=o);for(t=0;t<g;t++)v[h[t]]++;for(w=o=0,t=b;t<y;t++)w+=v[t],_.limit[t]=w-1,w<<=1,o+=v[t],_.base[t+1]=w-o;_.limit[y+1]=Number.MAX_VALUE,_.limit[y]=w+v[y]-1,_.base[b]=0}var S=new Uint32Array(256);for(t=0;t<256;t++)m[t]=t;var F=0,N=0,k=0,R,D=this.dbuf=new Uint32Array(this.dbufSize);for(g=0;;){for(g--||(g=ude-1,k>=p&&si(mn.DATA_ERROR),_=x[f[k++]]),t=_.minLen,e=i.read(t);t>_.maxLen&&si(mn.DATA_ERROR),!(e<=_.limit[t]);t++)e=e<<1|i.read(1);e-=_.base[t],(e<0||e>=E3)&&si(mn.DATA_ERROR);var B=_.permute[e];if(B===k3||B===sde){F||(F=1,o=0),B===k3?o+=F:o+=2*F,F<<=1;continue}if(F)for(F=0,N+o>this.dbufSize&&si(mn.DATA_ERROR),R=l[m[0]],S[R]+=o;o--;)D[N++]=R;if(B>c)break;N>=this.dbufSize&&si(mn.DATA_ERROR),t=B-1,R=j3(m,t),R=l[R],S[R]++,D[N++]=R}for((r<0||r>=N)&&si(mn.DATA_ERROR),e=0,t=0;t<256;t++)n=e+S[t],S[t]=e,e=n;for(t=0;t<N;t++)R=D[t]&255,D[S[R]]|=t<<8,S[R]++;var q=0,G=0,W=0;return N&&(q=D[r],G=q&255,q>>=8,W=-1),this.writePos=q,this.writeCurrent=G,this.writeCount=N,this.writeRun=W,!0};Ei.prototype._read_bunzip=function(t,e){var n,i,a;if(this.writeCount<0)return 0;for(var r=0,o=this.dbuf,l=this.writePos,c=this.writeCurrent,d=this.writeCount,u=this.outputsize,p=this.writeRun;d;){for(d--,i=c,l=o[l],c=l&255,l>>=8,p++===3?(n=c,a=i,c=-1):(n=1,a=c),this.blockCRC.updateCRCRun(a,n);n--;)this.outputStream.writeByte(a),this.nextoutput++;c!=i&&(p=0)}return this.writeCount=d,this.blockCRC.getCRC()!==this.targetBlockCRC&&si(mn.DATA_ERROR,\"Bad block CRC (got \"+this.blockCRC.getCRC().toString(16)+\" expected \"+this.targetBlockCRC.toString(16)+\")\"),this.nextoutput};var S_=s(function(t){if(\"readByte\"in t)return t;var e=new Eu;return e.pos=0,e.readByte=function(){return t[this.pos++]},e.seek=function(n){this.pos=n},e.eof=function(){return this.pos>=t.length},e},\"coerceInputStream\"),C3=s(function(t){var e=new Eu,n=!0;if(t)if(typeof t==\"number\")e.buffer=new Buffer(t),n=!1;else{if(\"writeByte\"in t)return t;e.buffer=t,n=!1}else e.buffer=new Buffer(16384);return e.pos=0,e.writeByte=function(i){if(n&&this.pos>=this.buffer.length){var a=new Buffer(this.buffer.length*2);this.buffer.copy(a),this.buffer=a}this.buffer[this.pos++]=i},e.getBuffer=function(){if(this.pos!==this.buffer.length){if(!n)throw new TypeError(\"outputsize does not match decoded input\");var i=new Buffer(this.pos);this.buffer.copy(i,0,0,this.pos),this.buffer=i}return this.buffer},e._coerced=!0,e},\"coerceOutputStream\");Ei.Err=mn;Ei.decode=function(t,e,n){for(var i=S_(t),a=C3(e),r=new Ei(i,a);!(\"eof\"in i&&i.eof());)if(r._init_block())r._read_bunzip();else{var o=r.reader.read(32)>>>0;if(o!==r.streamCRC&&si(mn.DATA_ERROR,\"Bad stream CRC (got \"+r.streamCRC.toString(16)+\" expected \"+o.toString(16)+\")\"),n&&\"eof\"in i&&!i.eof())r._start_bunzip(i,a);else break}if(\"getBuffer\"in a)return a.getBuffer()};Ei.decodeBlock=function(t,e,n){var i=S_(t),a=C3(n),r=new Ei(i,a);r.reader.seek(e);var o=r._get_next_block();if(o&&(r.blockCRC=new A3,r.writeCopies=0,r._read_bunzip()),\"getBuffer\"in a)return a.getBuffer()};Ei.table=function(t,e,n){var i=new Eu;i.delegate=S_(t),i.pos=0,i.readByte=function(){return this.pos++,this.delegate.readByte()},i.delegate.eof&&(i.eof=i.delegate.eof.bind(i.delegate));var a=new Eu;a.pos=0,a.writeByte=function(){this.pos++};for(var r=new Ei(i,a),o=r.dbufSize;!(\"eof\"in i&&i.eof());){var l=i.pos*8+r.reader.bitOffset;if(r.reader.hasByte&&(l-=8),r._init_block()){var c=a.pos;r._read_bunzip(),e(l,a.pos-c)}else{var d=r.reader.read(32);if(n&&\"eof\"in i&&!i.eof())r._start_bunzip(i,a),console.assert(r.dbufSize===o,\"shouldn't change block size within multistream file\");else break}}};Ei.Stream=Eu;Ei.version=T3.version;Ei.license=T3.license;S3.exports=Ei});var F3=oe((I3,D3)=>{var mde=Ee(\"stream\");I3=D3.exports=O_;O_.through=O_;function O_(t,e,n){t=t||function(u){this.queue(u)},e=e||function(){this.queue(null)};var i=!1,a=!1,r=[],o=!1,l=new mde;l.readable=l.writable=!0,l.paused=!1,l.autoDestroy=!(n&&n.autoDestroy===!1),l.write=function(u){return t.call(this,u),!l.paused};function c(){for(;r.length&&!l.paused;){var u=r.shift();if(u===null)return l.emit(\"end\");l.emit(\"data\",u)}}s(c,\"drain\"),l.queue=l.push=function(u){return o||(u===null&&(o=!0),r.push(u),c()),l},l.on(\"end\",function(){l.readable=!1,!l.writable&&l.autoDestroy&&process.nextTick(function(){l.destroy()})});function d(){l.writable=!1,e.call(l),!l.readable&&l.autoDestroy&&l.destroy()}return s(d,\"_end\"),l.end=function(u){if(!i)return i=!0,arguments.length&&l.write(u),d(),l},l.destroy=function(){if(!a)return a=!0,i=!0,r.length=0,l.writable=l.readable=!1,l.emit(\"close\"),l},l.pause=function(){if(!l.paused)return l.paused=!0,l},l.resume=function(){return l.paused&&(l.paused=!1,l.emit(\"resume\")),c(),l.paused||l.emit(\"drain\"),l},l}s(O_,\"through\")});var R3=oe((Ake,N3)=>{function I_(t){this.name=\"Bzip2Error\",this.message=t,this.stack=new Error().stack}s(I_,\"Bzip2Error\");I_.prototype=new Error;var li={Error:function(t){throw new I_(t)}},xr={};xr.Bzip2Error=I_;xr.crcTable=[0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,2552477408,2632100695,2443283854,2506133561,2334638140,2414271883,2191915858,2254759653,3190512472,3135915759,3081330742,3009969537,2905550212,2850959411,2762807018,2691435357,3560074640,3505614887,3719321342,3648080713,3342211916,3287746299,3467911202,3396681109,4063920168,4143685023,4223187782,4286162673,3779000052,3858754371,3904687514,3967668269,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,2896545431,2825181984,2770861561,2716262478,3215044683,3143675388,3055782693,3001194130,2326604591,2389456536,2200899649,2280525302,2578013683,2640855108,2418763421,2498394922,3769900519,3832873040,3912640137,3992402750,4088425275,4151408268,4197601365,4277358050,3334271071,3263032808,3476998961,3422541446,3585640067,3514407732,3694837229,3640369242,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,4046411278,4126034873,4172115296,4234965207,3794477266,3874110821,3953728444,4016571915,3609705398,3555108353,3735388376,3664026991,3290680682,3236090077,3449943556,3378572211,3174993278,3120533705,3032266256,2961025959,2923101090,2868635157,2813903052,2742672763,2604032198,2683796849,2461293480,2524268063,2284983834,2364738477,2175806836,2238787779,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,3316196985,3244833742,3425377559,3370778784,3601682597,3530312978,3744426955,3689838204,3819031489,3881883254,3928223919,4007849240,4037393693,4100235434,4180117107,4259748804,2310601993,2373574846,2151335527,2231098320,2596047829,2659030626,2470359227,2550115596,2947551409,2876312838,2788305887,2733848168,3165939309,3094707162,3040238851,2985771188];xr.array=function(t){var e=0,n=0,i=[0,1,3,7,15,31,63,127,255];return function(a){for(var r=0;a>0;){var o=8-e;a>=o?(r<<=o,r|=i[o]&t[n++],e=0,a-=o):(r<<=a,r|=(t[n]&i[a]<<8-a-e)>>8-a-e,e+=a,a=0)}return r}};xr.simple=function(t,e){var n=xr.array(t),i=xr.header(n),a=!1,r=1e5*i,o=new Int32Array(r);do a=xr.decompress(n,e,o,r);while(!a)};xr.header=function(t){this.byteCount=new Int32Array(256),this.symToByte=new Uint8Array(256),this.mtfSymbol=new Int32Array(256),this.selectors=new Uint8Array(32768),t(8*3)!=4348520&&li.Error(\"No magic number found\");var e=t(8)-48;return(e<1||e>9)&&li.Error(\"Not a BZIP archive\"),e};xr.decompress=function(t,e,n,i,a){for(var r=20,o=258,l=0,c=1,d=50,u=-1,p=\"\",m=0;m<6;m++)p+=t(8).toString(16);if(p==\"177245385090\"){var f=t(32)|0;return f!==a&&li.Error(\"Error in bzip2: crc32 do not match\"),t(null),null}p!=\"314159265359\"&&li.Error(\"eek not valid bzip data\");var g=t(32)|0;t(1)&&li.Error(\"unsupported obsolete version\");var x=t(24);x>i&&li.Error(\"Initial position larger than buffer size\");var _=t(16),h=0;for(m=0;m<16;m++)if(_&1<<15-m){var v=t(16);for(Q=0;Q<16;Q++)v&1<<15-Q&&(this.symToByte[h++]=16*m+Q)}var b=t(3);(b<2||b>6)&&li.Error(\"another error\");var y=t(15);y==0&&li.Error(\"meh\");for(var m=0;m<b;m++)this.mtfSymbol[m]=m;for(var m=0;m<y;m++){for(var Q=0;t(1);Q++)Q>=b&&li.Error(\"whoops another error\");for(var w=this.mtfSymbol[Q],v=Q-1;v>=0;v--)this.mtfSymbol[v+1]=this.mtfSymbol[v];this.mtfSymbol[0]=w,this.selectors[m]=w}for(var Z=h+2,S=[],F=new Uint8Array(o),N=new Uint16Array(r+1),k,Q=0;Q<b;Q++){_=t(5);for(var m=0;m<Z;m++){for(;(_<1||_>r)&&li.Error(\"I gave up a while ago on writing error messages\"),!!t(1);)t(1)?_--:_++;F[m]=_}var R,D;R=D=F[0];for(var m=1;m<Z;m++)F[m]>D?D=F[m]:F[m]<R&&(R=F[m]);k=S[Q]={},k.permute=new Int32Array(o),k.limit=new Int32Array(r+1),k.base=new Int32Array(r+1),k.minLen=R,k.maxLen=D;for(var B=k.base,q=k.limit,G=0,m=R;m<=D;m++)for(var _=0;_<Z;_++)F[_]==m&&(k.permute[G++]=_);for(m=R;m<=D;m++)N[m]=q[m]=0;for(m=0;m<Z;m++)N[F[m]]++;for(G=_=0,m=R;m<D;m++)G+=N[m],q[m]=G-1,G<<=1,B[m+1]=G-(_+=N[m]);q[D]=G+N[D]-1,B[R]=0}for(var m=0;m<256;m++)this.mtfSymbol[m]=m,this.byteCount[m]=0;var W,ee,Z,me;for(W=ee=Z=me=0;;){for(Z--||(Z=d-1,me>=y&&li.Error(\"meow i'm a kitty, that's an error\"),k=S[this.selectors[me++]],B=k.base,q=k.limit),m=k.minLen,Q=t(m);m>k.maxLen&&li.Error(\"rawr i'm a dinosaur\"),!(Q<=q[m]);)m++,Q=Q<<1|t(1);Q-=B[m],(Q<0||Q>=o)&&li.Error(\"moo i'm a cow\");var X=k.permute[Q];if(X==l||X==c){W||(W=1,_=0),X==l?_+=W:_+=2*W,W<<=1;continue}if(W)for(W=0,ee+_>i&&li.Error(\"Boom.\"),w=this.symToByte[this.mtfSymbol[0]],this.byteCount[w]+=_;_--;)n[ee++]=w;if(X>h)break;ee>=i&&li.Error(\"I can't think of anything. Error\"),m=X-1,w=this.mtfSymbol[m];for(var v=m-1;v>=0;v--)this.mtfSymbol[v+1]=this.mtfSymbol[v];this.mtfSymbol[0]=w,w=this.symToByte[w],this.byteCount[w]++,n[ee++]=w}(x<0||x>=ee)&&li.Error(\"I'm a monkey and I'm throwing something at someone, namely you\");for(var Q=0,m=0;m<256;m++)v=Q+this.byteCount[m],this.byteCount[m]=Q,Q=v;for(var m=0;m<ee;m++)w=n[m]&255,n[this.byteCount[w]]|=m<<8,this.byteCount[w]++;var he=0,Ie=0,le=0;ee&&(he=n[x],Ie=he&255,he>>=8,le=-1),ee=ee;for(var ge,V,H;ee;){for(ee--,V=Ie,he=n[he],Ie=he&255,he>>=8,le++==3?(ge=Ie,H=V,Ie=-1):(ge=1,H=Ie);ge--;)u=(u<<8^this.crcTable[(u>>24^H)&255])&4294967295,e(H);Ie!=V&&(le=0)}return u=(u^-1)>>>0,(u|0)!=(g|0)&&li.Error(\"Error in bzip2: crc32 do not match\"),a=(u^(a<<1|a>>>31))&4294967295,a};N3.exports=xr});var P3=oe((Cke,B3)=>{var M3=[0,1,3,7,15,31,63,127,255];B3.exports=s(function(e){var n=0,i=0,a=e(),r=s(function(o){if(o===null&&n!=0){n=0,i++;return}for(var l=0;o>0;){i>=a.length&&(i=0,a=e());var c=8-n;n===0&&o>0&&r.bytesRead++,o>=c?(l<<=c,l|=M3[c]&a[i++],n=0,o-=c):(l<<=o,l|=(a[i]&M3[o]<<8-o-n)>>8-o-n,n+=o,o=0)}return l},\"f\");return r.bytesRead=0,r},\"bitIterator\")});var z3=oe((Oke,V3)=>{var fde=F3(),L3=R3(),hde=P3();V3.exports=gde;function gde(){var t=[],e=0,n=0,i=!1,a=!1,r=null,o=null;function l(u){if(n){var p=1e5*n,m=new Int32Array(p),f=[],g=s(function(x){f.push(x)},\"f\");return o=L3.decompress(r,g,m,p,o),o===null?(n=0,!1):(u(Buffer.from(f)),!0)}else return n=L3.header(r),o=0,!0}s(l,\"decompressBlock\");var c=0;function d(u){if(!i)try{return l(function(p){u.queue(p),p!==null&&(c+=p.length)})}catch(p){return u.emit(\"error\",p),i=!0,!1}}return s(d,\"decompressAndQueue\"),fde(s(function(p){for(t.push(p),e+=p.length,r===null&&(r=hde(function(){return t.shift()}));!i&&e-r.bytesRead+1>=(25e3+1e5*n||4);)d(this)},\"write\"),s(function(p){for(;!i&&r&&e>r.bytesRead;)d(this);i||(o!==null&&this.emit(\"error\",new Error(\"input stream ended prematurely\")),this.queue(null))},\"end\"))}s(gde,\"unbzip2Stream\")});var J3=oe((Dke,H3)=>{\"use strict\";var U3=em(),q3=f3(),_de=Fp(),xde=O3(),vde=z3();H3.exports=()=>t=>!Buffer.isBuffer(t)&&!_de(t)?Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`)):Buffer.isBuffer(t)&&(!q3(t)||q3(t).ext!==\"bz2\")?Promise.resolve([]):Buffer.isBuffer(t)?U3()(xde.decode(t)):U3()(t.pipe(vde()))});var K3=oe((Fke,W3)=>{\"use strict\";var bde=Ee(\"zlib\"),yde=em(),G3=Wg(),wde=Fp();W3.exports=()=>t=>{if(!Buffer.isBuffer(t)&&!wde(t))return Promise.reject(new TypeError(`Expected a Buffer or Stream, got ${typeof t}`));if(Buffer.isBuffer(t)&&(!G3(t)||G3(t).ext!==\"gz\"))return Promise.resolve([]);let e=bde.createGunzip(),n=yde()(e);return Buffer.isBuffer(t)?e.end(t):t.pipe(e),n}});var X3=oe((Nke,Y3)=>{\"use strict\";Y3.exports=function(t){return t&&t.length>1?t[0]===255&&t[1]===216&&t[2]===255?{ext:\"jpg\",mime:\"image/jpeg\"}:t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?{ext:\"png\",mime:\"image/png\"}:t[0]===71&&t[1]===73&&t[2]===70?{ext:\"gif\",mime:\"image/gif\"}:t[8]===87&&t[9]===69&&t[10]===66&&t[11]===80?{ext:\"webp\",mime:\"image/webp\"}:t[0]===70&&t[1]===76&&t[2]===73&&t[3]===70?{ext:\"flif\",mime:\"image/flif\"}:(t[0]===73&&t[1]===73&&t[2]===42&&t[3]===0||t[0]===77&&t[1]===77&&t[2]===0&&t[3]===42)&&t[8]===67&&t[9]===82?{ext:\"cr2\",mime:\"image/x-canon-cr2\"}:t[0]===73&&t[1]===73&&t[2]===42&&t[3]===0||t[0]===77&&t[1]===77&&t[2]===0&&t[3]===42?{ext:\"tif\",mime:\"image/tiff\"}:t[0]===66&&t[1]===77?{ext:\"bmp\",mime:\"image/bmp\"}:t[0]===73&&t[1]===73&&t[2]===188?{ext:\"jxr\",mime:\"image/vnd.ms-photo\"}:t[0]===56&&t[1]===66&&t[2]===80&&t[3]===83?{ext:\"psd\",mime:\"image/vnd.adobe.photoshop\"}:t[0]===80&&t[1]===75&&t[2]===3&&t[3]===4&&t[30]===109&&t[31]===105&&t[32]===109&&t[33]===101&&t[34]===116&&t[35]===121&&t[36]===112&&t[37]===101&&t[38]===97&&t[39]===112&&t[40]===112&&t[41]===108&&t[42]===105&&t[43]===99&&t[44]===97&&t[45]===116&&t[46]===105&&t[47]===111&&t[48]===110&&t[49]===47&&t[50]===101&&t[51]===112&&t[52]===117&&t[53]===98&&t[54]===43&&t[55]===122&&t[56]===105&&t[57]===112?{ext:\"epub\",mime:\"application/epub+zip\"}:t[0]===80&&t[1]===75&&t[2]===3&&t[3]===4&&t[30]===77&&t[31]===69&&t[32]===84&&t[33]===65&&t[34]===45&&t[35]===73&&t[36]===78&&t[37]===70&&t[38]===47&&t[39]===109&&t[40]===111&&t[41]===122&&t[42]===105&&t[43]===108&&t[44]===108&&t[45]===97&&t[46]===46&&t[47]===114&&t[48]===115&&t[49]===97?{ext:\"xpi\",mime:\"application/x-xpinstall\"}:t[0]===80&&t[1]===75&&(t[2]===3||t[2]===5||t[2]===7)&&(t[3]===4||t[3]===6||t[3]===8)?{ext:\"zip\",mime:\"application/zip\"}:t[257]===117&&t[258]===115&&t[259]===116&&t[260]===97&&t[261]===114?{ext:\"tar\",mime:\"application/x-tar\"}:t[0]===82&&t[1]===97&&t[2]===114&&t[3]===33&&t[4]===26&&t[5]===7&&(t[6]===0||t[6]===1)?{ext:\"rar\",mime:\"application/x-rar-compressed\"}:t[0]===31&&t[1]===139&&t[2]===8?{ext:\"gz\",mime:\"application/gzip\"}:t[0]===66&&t[1]===90&&t[2]===104?{ext:\"bz2\",mime:\"application/x-bzip2\"}:t[0]===55&&t[1]===122&&t[2]===188&&t[3]===175&&t[4]===39&&t[5]===28?{ext:\"7z\",mime:\"application/x-7z-compressed\"}:t[0]===120&&t[1]===1?{ext:\"dmg\",mime:\"application/x-apple-diskimage\"}:t[0]===0&&t[1]===0&&t[2]===0&&(t[3]===24||t[3]===32)&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112||t[0]===51&&t[1]===103&&t[2]===112&&t[3]===53||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===109&&t[9]===112&&t[10]===52&&t[11]===50&&t[16]===109&&t[17]===112&&t[18]===52&&t[19]===49&&t[20]===109&&t[21]===112&&t[22]===52&&t[23]===50&&t[24]===105&&t[25]===115&&t[26]===111&&t[27]===109||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===105&&t[9]===115&&t[10]===111&&t[11]===109||t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===109&&t[9]===112&&t[10]===52&&t[11]===50&&t[12]===0&&t[13]===0&&t[14]===0&&t[15]===0?{ext:\"mp4\",mime:\"video/mp4\"}:t[0]===0&&t[1]===0&&t[2]===0&&t[3]===28&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===77&&t[9]===52&&t[10]===86?{ext:\"m4v\",mime:\"video/x-m4v\"}:t[0]===77&&t[1]===84&&t[2]===104&&t[3]===100?{ext:\"mid\",mime:\"audio/midi\"}:t[31]===109&&t[32]===97&&t[33]===116&&t[34]===114&&t[35]===111&&t[36]===115&&t[37]===107&&t[38]===97?{ext:\"mkv\",mime:\"video/x-matroska\"}:t[0]===26&&t[1]===69&&t[2]===223&&t[3]===163?{ext:\"webm\",mime:\"video/webm\"}:t[0]===0&&t[1]===0&&t[2]===0&&t[3]===20&&t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112?{ext:\"mov\",mime:\"video/quicktime\"}:t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===65&&t[9]===86&&t[10]===73?{ext:\"avi\",mime:\"video/x-msvideo\"}:t[0]===48&&t[1]===38&&t[2]===178&&t[3]===117&&t[4]===142&&t[5]===102&&t[6]===207&&t[7]===17&&t[8]===166&&t[9]===217?{ext:\"wmv\",mime:\"video/x-ms-wmv\"}:t[0]===0&&t[1]===0&&t[2]===1&&t[3].toString(16)[0]===\"b\"?{ext:\"mpg\",mime:\"video/mpeg\"}:t[0]===73&&t[1]===68&&t[2]===51||t[0]===255&&t[1]===251?{ext:\"mp3\",mime:\"audio/mpeg\"}:t[4]===102&&t[5]===116&&t[6]===121&&t[7]===112&&t[8]===77&&t[9]===52&&t[10]===65||t[0]===77&&t[1]===52&&t[2]===65&&t[3]===32?{ext:\"m4a\",mime:\"audio/m4a\"}:t[28]===79&&t[29]===112&&t[30]===117&&t[31]===115&&t[32]===72&&t[33]===101&&t[34]===97&&t[35]===100?{ext:\"opus\",mime:\"audio/opus\"}:t[0]===79&&t[1]===103&&t[2]===103&&t[3]===83?{ext:\"ogg\",mime:\"audio/ogg\"}:t[0]===102&&t[1]===76&&t[2]===97&&t[3]===67?{ext:\"flac\",mime:\"audio/x-flac\"}:t[0]===82&&t[1]===73&&t[2]===70&&t[3]===70&&t[8]===87&&t[9]===65&&t[10]===86&&t[11]===69?{ext:\"wav\",mime:\"audio/x-wav\"}:t[0]===35&&t[1]===33&&t[2]===65&&t[3]===77&&t[4]===82&&t[5]===10?{ext:\"amr\",mime:\"audio/amr\"}:t[0]===37&&t[1]===80&&t[2]===68&&t[3]===70?{ext:\"pdf\",mime:\"application/pdf\"}:t[0]===77&&t[1]===90?{ext:\"exe\",mime:\"application/x-msdownload\"}:(t[0]===67||t[0]===70)&&t[1]===87&&t[2]===83?{ext:\"swf\",mime:\"application/x-shockwave-flash\"}:t[0]===123&&t[1]===92&&t[2]===114&&t[3]===116&&t[4]===102?{ext:\"rtf\",mime:\"application/rtf\"}:t[0]===119&&t[1]===79&&t[2]===70&&t[3]===70&&(t[4]===0&&t[5]===1&&t[6]===0&&t[7]===0||t[4]===79&&t[5]===84&&t[6]===84&&t[7]===79)?{ext:\"woff\",mime:\"application/font-woff\"}:t[0]===119&&t[1]===79&&t[2]===70&&t[3]===50&&(t[4]===0&&t[5]===1&&t[6]===0&&t[7]===0||t[4]===79&&t[5]===84&&t[6]===84&&t[7]===79)?{ext:\"woff2\",mime:\"application/font-woff\"}:t[34]===76&&t[35]===80&&(t[8]===0&&t[9]===0&&t[10]===1||t[8]===1&&t[9]===0&&t[10]===2||t[8]===2&&t[9]===0&&t[10]===2)?{ext:\"eot\",mime:\"application/octet-stream\"}:t[0]===0&&t[1]===1&&t[2]===0&&t[3]===0&&t[4]===0?{ext:\"ttf\",mime:\"application/font-sfnt\"}:t[0]===79&&t[1]===84&&t[2]===84&&t[3]===79&&t[4]===0?{ext:\"otf\",mime:\"application/font-sfnt\"}:t[0]===0&&t[1]===0&&t[2]===1&&t[3]===0?{ext:\"ico\",mime:\"image/x-icon\"}:t[0]===70&&t[1]===76&&t[2]===86&&t[3]===1?{ext:\"flv\",mime:\"video/x-flv\"}:t[0]===37&&t[1]===33?{ext:\"ps\",mime:\"application/postscript\"}:t[0]===253&&t[1]===55&&t[2]===122&&t[3]===88&&t[4]===90&&t[5]===0?{ext:\"xz\",mime:\"application/x-xz\"}:t[0]===83&&t[1]===81&&t[2]===76&&t[3]===105?{ext:\"sqlite\",mime:\"application/x-sqlite3\"}:t[0]===78&&t[1]===69&&t[2]===83&&t[3]===26?{ext:\"nes\",mime:\"application/x-nintendo-nes-rom\"}:t[0]===67&&t[1]===114&&t[2]===50&&t[3]===52?{ext:\"crx\",mime:\"application/x-google-chrome-extension\"}:t[0]===77&&t[1]===83&&t[2]===67&&t[3]===70||t[0]===73&&t[1]===83&&t[2]===99&&t[3]===40?{ext:\"cab\",mime:\"application/vnd.ms-cab-compressed\"}:t[0]===33&&t[1]===60&&t[2]===97&&t[3]===114&&t[4]===99&&t[5]===104&&t[6]===62&&t[7]===10&&t[8]===100&&t[9]===101&&t[10]===98&&t[11]===105&&t[12]===97&&t[13]===110&&t[14]===45&&t[15]===98&&t[16]===105&&t[17]===110&&t[18]===97&&t[19]===114&&t[20]===121?{ext:\"deb\",mime:\"application/x-deb\"}:t[0]===33&&t[1]===60&&t[2]===97&&t[3]===114&&t[4]===99&&t[5]===104&&t[6]===62?{ext:\"ar\",mime:\"application/x-unix-archive\"}:t[0]===237&&t[1]===171&&t[2]===238&&t[3]===219?{ext:\"rpm\",mime:\"application/x-rpm\"}:t[0]===31&&t[1]===160||t[0]===31&&t[1]===157?{ext:\"Z\",mime:\"application/x-compress\"}:t[0]===76&&t[1]===90&&t[2]===73&&t[3]===80?{ext:\"lz\",mime:\"application/x-lzip\"}:t[0]===208&&t[1]===207&&t[2]===17&&t[3]===224&&t[4]===161&&t[5]===177&&t[6]===26&&t[7]===225?{ext:\"msi\",mime:\"application/x-msi\"}:null:null}});var a2=oe((Rke,i2)=>{\"use strict\";var F_=\"pending\",Z3=\"settled\",nm=\"fulfilled\",im=\"rejected\",Ede=s(function(){},\"NOOP\"),Q3=typeof global<\"u\"&&typeof global.process<\"u\"&&typeof global.process.emit==\"function\",kde=typeof setImmediate>\"u\"?setTimeout:setImmediate,ku=[],D_;function jde(){for(var t=0;t<ku.length;t++)ku[t][0](ku[t][1]);ku=[],D_=!1}s(jde,\"asyncFlush\");function am(t,e){ku.push([t,e]),D_||(D_=!0,kde(jde,0))}s(am,\"asyncCall\");function Ade(t,e){function n(a){N_(e,a)}s(n,\"resolvePromise\");function i(a){ju(e,a)}s(i,\"rejectPromise\");try{t(n,i)}catch(a){i(a)}}s(Ade,\"invokeResolver\");function $3(t){var e=t.owner,n=e._state,i=e._data,a=t[n],r=t.then;if(typeof a==\"function\"){n=nm;try{i=a(i)}catch(o){ju(r,o)}}e2(r,i)||(n===nm&&N_(r,i),n===im&&ju(r,i))}s($3,\"invokeCallback\");function e2(t,e){var n;try{if(t===e)throw new TypeError(\"A promises callback cannot return that same promise.\");if(e&&(typeof e==\"function\"||typeof e==\"object\")){var i=e.then;if(typeof i==\"function\")return i.call(e,function(a){n||(n=!0,e===a?t2(t,a):N_(t,a))},function(a){n||(n=!0,ju(t,a))}),!0}}catch(a){return n||ju(t,a),!0}return!1}s(e2,\"handleThenable\");function N_(t,e){(t===e||!e2(t,e))&&t2(t,e)}s(N_,\"resolve\");function t2(t,e){t._state===F_&&(t._state=Z3,t._data=e,am(Tde,t))}s(t2,\"fulfill\");function ju(t,e){t._state===F_&&(t._state=Z3,t._data=e,am(Cde,t))}s(ju,\"reject\");function n2(t){t._then=t._then.forEach($3)}s(n2,\"publish\");function Tde(t){t._state=nm,n2(t)}s(Tde,\"publishFulfillment\");function Cde(t){t._state=im,n2(t),!t._handled&&Q3&&global.process.emit(\"unhandledRejection\",t._data,t)}s(Cde,\"publishRejection\");function Sde(t){global.process.emit(\"rejectionHandled\",t)}s(Sde,\"notifyRejectionHandled\");function Qi(t){if(typeof t!=\"function\")throw new TypeError(\"Promise resolver \"+t+\" is not a function\");if(!(this instanceof Qi))throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");this._then=[],Ade(t,this)}s(Qi,\"Promise\");Qi.prototype={constructor:Qi,_state:F_,_then:null,_data:void 0,_handled:!1,then:function(t,e){var n={owner:this,then:new this.constructor(Ede),fulfilled:t,rejected:e};return(e||t)&&!this._handled&&(this._handled=!0,this._state===im&&Q3&&am(Sde,this)),this._state===nm||this._state===im?am($3,n):this._then.push(n),n.then},catch:function(t){return this.then(null,t)}};Qi.all=function(t){if(!Array.isArray(t))throw new TypeError(\"You must pass an array to Promise.all().\");return new Qi(function(e,n){var i=[],a=0;function r(c){return a++,function(d){i[c]=d,--a||e(i)}}s(r,\"resolver\");for(var o=0,l;o<t.length;o++)l=t[o],l&&typeof l.then==\"function\"?l.then(r(o),n):i[o]=l;a||e(i)})};Qi.race=function(t){if(!Array.isArray(t))throw new TypeError(\"You must pass an array to Promise.race().\");return new Qi(function(e,n){for(var i=0,a;i<t.length;i++)a=t[i],a&&typeof a.then==\"function\"?a.then(e,n):e(a)})};Qi.resolve=function(t){return t&&typeof t==\"object\"&&t.constructor===Qi?t:new Qi(function(e){e(t)})};Qi.reject=function(t){return new Qi(function(e,n){n(t)})};i2.exports=Qi});var o2=oe((Bke,r2)=>{\"use strict\";r2.exports=typeof Promise==\"function\"?Promise:a2()});var rm=oe((Pke,l2)=>{\"use strict\";var s2=Object.getOwnPropertySymbols,Ode=Object.prototype.hasOwnProperty,Ide=Object.prototype.propertyIsEnumerable;function Dde(t){if(t==null)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}s(Dde,\"toObject\");function Fde(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",Object.getOwnPropertyNames(t)[0]===\"5\")return!1;for(var e={},n=0;n<10;n++)e[\"_\"+String.fromCharCode(n)]=n;var i=Object.getOwnPropertyNames(e).map(function(r){return e[r]});if(i.join(\"\")!==\"0123456789\")return!1;var a={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(r){a[r]=r}),Object.keys(Object.assign({},a)).join(\"\")===\"abcdefghijklmnopqrst\"}catch{return!1}}s(Fde,\"shouldUseNative\");l2.exports=Fde()?Object.assign:function(t,e){for(var n,i=Dde(t),a,r=1;r<arguments.length;r++){n=Object(arguments[r]);for(var o in n)Ode.call(n,o)&&(i[o]=n[o]);if(s2){a=s2(n);for(var l=0;l<a.length;l++)Ide.call(n,a[l])&&(i[a[l]]=n[a[l]])}}return i}});var u2=oe((Vke,c2)=>{var Nde=Ee(\"stream\").PassThrough,Rde=rm();c2.exports=function(t){t=Rde({},t);var e=t.array,n=t.encoding,i=n===\"buffer\",a=!1;e?a=!(n||i):n=n||\"utf8\",i&&(n=null);var r=0,o=[],l=new Nde({objectMode:a});return n&&l.setEncoding(n),l.on(\"data\",function(c){o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=function(){return e?o:i?Buffer.concat(o,r):o.join(\"\")},l.getBufferedLength=function(){return r},l}});var p2=oe((zke,om)=>{\"use strict\";var d2=o2(),R_=rm(),Mde=u2();function M_(t,e){if(!t)return d2.reject(new Error(\"Expected a stream\"));e=R_({maxBuffer:1/0},e);var n=e.maxBuffer,i,a,r=new d2(function(o,l){i=Mde(e),t.once(\"error\",c),t.pipe(i),i.on(\"data\",function(){i.getBufferedLength()>n&&l(new Error(\"maxBuffer exceeded\"))}),i.once(\"error\",c),i.on(\"end\",o),a=s(function(){t.unpipe&&t.unpipe(i)},\"clean\");function c(d){d&&(d.bufferedData=i.getBufferedValue()),l(d)}s(c,\"error\")});return r.then(a,a),r.then(function(){return i.getBufferedValue()})}s(M_,\"getStream\");om.exports=M_;om.exports.buffer=function(t,e){return M_(t,R_({},e,{encoding:\"buffer\"}))};om.exports.array=function(t,e){return M_(t,R_({},e,{array:!0}))}});var B_=oe((qke,h2)=>{\"use strict\";var m2=s(function(t,e,n){return function(){for(var i=this,a=new Array(arguments.length),r=0;r<arguments.length;r++)a[r]=arguments[r];return new e(function(o,l){a.push(function(c,d){if(c)l(c);else if(n.multiArgs){for(var u=new Array(arguments.length-1),p=1;p<arguments.length;p++)u[p-1]=arguments[p];o(u)}else o(d)}),t.apply(i,a)})}},\"processFn\"),f2=h2.exports=function(t,e,n){typeof e!=\"function\"&&(n=e,e=Promise),n=n||{},n.exclude=n.exclude||[/.+Sync$/];var i=s(function(r){var o=s(function(l){return typeof l==\"string\"?r===l:l.test(r)},\"match\");return n.include?n.include.some(o):!n.exclude.some(o)},\"filter\"),a=typeof t==\"function\"?function(){return n.excludeMain?t.apply(this,arguments):m2(t,e,n).apply(this,arguments)}:{};return Object.keys(t).reduce(function(r,o){var l=t[o];return r[o]=typeof l==\"function\"&&i(o)?m2(l,e,n):l,r},a)};f2.all=f2});var v2=oe((Jke,x2)=>{x2.exports=sm;function sm(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}s(sm,\"Pend\");sm.prototype.go=function(t){this.pending<this.max?_2(this,t):this.waiting.push(t)};sm.prototype.wait=function(t){this.pending===0?t(this.error):this.listeners.push(t)};sm.prototype.hold=function(){return g2(this)};function g2(t){t.pending+=1;var e=!1;return n;function n(a){if(e)throw new Error(\"callback called twice\");if(e=!0,t.error=t.error||a,t.pending-=1,t.waiting.length>0&&t.pending<t.max)_2(t,t.waiting.shift());else if(t.pending===0){var r=t.listeners;t.listeners=[],r.forEach(i)}}function i(a){a(t.error)}}s(g2,\"pendHold\");function _2(t,e){e(g2(t))}s(_2,\"pendGo\")});var y2=oe(Tu=>{var Au=Ee(\"fs\"),lm=Ee(\"util\"),P_=Ee(\"stream\"),b2=P_.Readable,L_=P_.Writable,Bde=P_.PassThrough,Pde=v2(),cm=Ee(\"events\").EventEmitter;Tu.createFromBuffer=Lde;Tu.createFromFd=Vde;Tu.BufferSlicer=uo;Tu.FdSlicer=co;lm.inherits(co,cm);function co(t,e){e=e||{},cm.call(this),this.fd=t,this.pend=new Pde,this.pend.max=1,this.refCount=0,this.autoClose=!!e.autoClose}s(co,\"FdSlicer\");co.prototype.read=function(t,e,n,i,a){var r=this;r.pend.go(function(o){Au.read(r.fd,t,e,n,i,function(l,c,d){o(),a(l,c,d)})})};co.prototype.write=function(t,e,n,i,a){var r=this;r.pend.go(function(o){Au.write(r.fd,t,e,n,i,function(l,c,d){o(),a(l,c,d)})})};co.prototype.createReadStream=function(t){return new um(this,t)};co.prototype.createWriteStream=function(t){return new dm(this,t)};co.prototype.ref=function(){this.refCount+=1};co.prototype.unref=function(){var t=this;if(t.refCount-=1,t.refCount>0)return;if(t.refCount<0)throw new Error(\"invalid unref\");t.autoClose&&Au.close(t.fd,e);function e(n){n?t.emit(\"error\",n):t.emit(\"close\")}s(e,\"onCloseDone\")};lm.inherits(um,b2);function um(t,e){e=e||{},b2.call(this,e),this.context=t,this.context.ref(),this.start=e.start||0,this.endOffset=e.end,this.pos=this.start,this.destroyed=!1}s(um,\"ReadStream\");um.prototype._read=function(t){var e=this;if(!e.destroyed){var n=Math.min(e._readableState.highWaterMark,t);if(e.endOffset!=null&&(n=Math.min(n,e.endOffset-e.pos)),n<=0){e.destroyed=!0,e.push(null),e.context.unref();return}e.context.pend.go(function(i){if(e.destroyed)return i();var a=new Buffer(n);Au.read(e.context.fd,a,0,n,e.pos,function(r,o){r?e.destroy(r):o===0?(e.destroyed=!0,e.push(null),e.context.unref()):(e.pos+=o,e.push(a.slice(0,o))),i()})})}};um.prototype.destroy=function(t){this.destroyed||(t=t||new Error(\"stream destroyed\"),this.destroyed=!0,this.emit(\"error\",t),this.context.unref())};lm.inherits(dm,L_);function dm(t,e){e=e||{},L_.call(this,e),this.context=t,this.context.ref(),this.start=e.start||0,this.endOffset=e.end==null?1/0:+e.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on(\"finish\",this.destroy.bind(this))}s(dm,\"WriteStream\");dm.prototype._write=function(t,e,n){var i=this;if(!i.destroyed){if(i.pos+t.length>i.endOffset){var a=new Error(\"maximum file length exceeded\");a.code=\"ETOOBIG\",i.destroy(),n(a);return}i.context.pend.go(function(r){if(i.destroyed)return r();Au.write(i.context.fd,t,0,t.length,i.pos,function(o,l){o?(i.destroy(),r(),n(o)):(i.bytesWritten+=l,i.pos+=l,i.emit(\"progress\"),r(),n())})})}};dm.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};lm.inherits(uo,cm);function uo(t,e){cm.call(this),e=e||{},this.refCount=0,this.buffer=t,this.maxChunkSize=e.maxChunkSize||Number.MAX_SAFE_INTEGER}s(uo,\"BufferSlicer\");uo.prototype.read=function(t,e,n,i,a){var r=i+n,o=r-this.buffer.length,l=o>0?o:n;this.buffer.copy(t,e,i,r),setImmediate(function(){a(null,l)})};uo.prototype.write=function(t,e,n,i,a){t.copy(this.buffer,i,e,e+n),setImmediate(function(){a(null,n,t)})};uo.prototype.createReadStream=function(t){t=t||{};var e=new Bde(t);e.destroyed=!1,e.start=t.start||0,e.endOffset=t.end,e.pos=e.endOffset||this.buffer.length;for(var n=this.buffer.slice(e.start,e.pos),i=0;;){var a=i+this.maxChunkSize;if(a>=n.length){i<n.length&&e.write(n.slice(i,n.length));break}e.write(n.slice(i,a)),i=a}return e.end(),e.destroy=function(){e.destroyed=!0},e};uo.prototype.createWriteStream=function(t){var e=this;t=t||{};var n=new L_(t);return n.start=t.start||0,n.endOffset=t.end==null?this.buffer.length:+t.end,n.bytesWritten=0,n.pos=n.start,n.destroyed=!1,n._write=function(i,a,r){if(!n.destroyed){var o=n.pos+i.length;if(o>n.endOffset){var l=new Error(\"maximum file length exceeded\");l.code=\"ETOOBIG\",n.destroyed=!0,r(l);return}i.copy(e.buffer,n.pos,0,i.length),n.bytesWritten+=i.length,n.pos=o,n.emit(\"progress\"),r()}},n.destroy=function(){n.destroyed=!0},n};uo.prototype.ref=function(){this.refCount+=1};uo.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error(\"invalid unref\")};function Lde(t,e){return new uo(t,e)}s(Lde,\"createFromBuffer\");function Vde(t,e){return new co(t,e)}s(Vde,\"createFromFd\")});var k2=oe((Yke,E2)=>{var Lo=(No(),nu(Dl)).Buffer,V_=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<\"u\"&&(V_=new Int32Array(V_));function w2(t){if(Lo.isBuffer(t))return t;var e=typeof Lo.alloc==\"function\"&&typeof Lo.from==\"function\";if(typeof t==\"number\")return e?Lo.alloc(t):new Lo(t);if(typeof t==\"string\")return e?Lo.from(t):new Lo(t);throw new Error(\"input must be buffer, number, or string, received \"+typeof t)}s(w2,\"ensureBuffer\");function zde(t){var e=w2(4);return e.writeInt32BE(t,0),e}s(zde,\"bufferizeInt\");function z_(t,e){t=w2(t),Lo.isBuffer(e)&&(e=e.readUInt32BE(0));for(var n=~~e^-1,i=0;i<t.length;i++)n=V_[(n^t[i])&255]^n>>>8;return n^-1}s(z_,\"_crc32\");function U_(){return zde(z_.apply(null,arguments))}s(U_,\"crc32\");U_.signed=function(){return z_.apply(null,arguments)};U_.unsigned=function(){return z_.apply(null,arguments)>>>0};E2.exports=U_});var I2=oe(br=>{var q_=Ee(\"fs\"),Ude=Ee(\"zlib\"),j2=y2(),qde=k2(),fm=Ee(\"util\"),hm=Ee(\"events\").EventEmitter,A2=Ee(\"stream\").Transform,H_=Ee(\"stream\").PassThrough,Hde=Ee(\"stream\").Writable;br.open=Jde;br.fromFd=T2;br.fromBuffer=Gde;br.fromRandomAccessReader=J_;br.dosDateTimeToDate=S2;br.validateFileName=O2;br.ZipFile=Vo;br.Entry=Cu;br.RandomAccessReader=zo;function Jde(t,e,n){typeof e==\"function\"&&(n=e,e=null),e==null&&(e={}),e.autoClose==null&&(e.autoClose=!0),e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1),n==null&&(n=mm),q_.open(t,\"r\",function(i,a){if(i)return n(i);T2(a,e,function(r,o){r&&q_.close(a,mm),n(r,o)})})}s(Jde,\"open\");function T2(t,e,n){typeof e==\"function\"&&(n=e,e=null),e==null&&(e={}),e.autoClose==null&&(e.autoClose=!1),e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1),n==null&&(n=mm),q_.fstat(t,function(i,a){if(i)return n(i);var r=j2.createFromFd(t,{autoClose:!0});J_(r,a.size,e,n)})}s(T2,\"fromFd\");function Gde(t,e,n){typeof e==\"function\"&&(n=e,e=null),e==null&&(e={}),e.autoClose=!1,e.lazyEntries==null&&(e.lazyEntries=!1),e.decodeStrings==null&&(e.decodeStrings=!0),e.validateEntrySizes==null&&(e.validateEntrySizes=!0),e.strictFileNames==null&&(e.strictFileNames=!1);var i=j2.createFromBuffer(t,{maxChunkSize:65536});J_(i,t.length,e,n)}s(Gde,\"fromBuffer\");function J_(t,e,n,i){typeof n==\"function\"&&(i=n,n=null),n==null&&(n={}),n.autoClose==null&&(n.autoClose=!0),n.lazyEntries==null&&(n.lazyEntries=!1),n.decodeStrings==null&&(n.decodeStrings=!0);var a=!!n.decodeStrings;if(n.validateEntrySizes==null&&(n.validateEntrySizes=!0),n.strictFileNames==null&&(n.strictFileNames=!1),i==null&&(i=mm),typeof e!=\"number\")throw new Error(\"expected totalSize parameter to be a number\");if(e>Number.MAX_SAFE_INTEGER)throw new Error(\"zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.\");t.ref();var r=22,o=65535,l=Math.min(r+o,e),c=vr(l),d=e-c.length;Gl(t,c,0,l,d,function(u){if(u)return i(u);for(var p=l-r;p>=0;p-=1)if(c.readUInt32LE(p)===101010256){var m=c.slice(p),f=m.readUInt16LE(4);if(f!==0)return i(new Error(\"multi-disk zip files are not supported: found disk number: \"+f));var g=m.readUInt16LE(10),x=m.readUInt32LE(16),_=m.readUInt16LE(20),h=m.length-r;if(_!==h)return i(new Error(\"invalid comment length. expected: \"+h+\". found: \"+_));var v=a?pm(m,22,m.length,!1):m.slice(22);if(!(g===65535||x===4294967295))return i(null,new Vo(t,x,e,g,v,n.autoClose,n.lazyEntries,a,n.validateEntrySizes,n.strictFileNames));var b=vr(20),y=d+p-b.length;Gl(t,b,0,b.length,y,function(w){if(w)return i(w);if(b.readUInt32LE(0)!==117853008)return i(new Error(\"invalid zip64 end of central directory locator signature\"));var S=Wl(b,8),F=vr(56);Gl(t,F,0,F.length,S,function(N){return N?i(N):F.readUInt32LE(0)!==101075792?i(new Error(\"invalid zip64 end of central directory record signature\")):(g=Wl(F,32),x=Wl(F,48),i(null,new Vo(t,x,e,g,v,n.autoClose,n.lazyEntries,a,n.validateEntrySizes,n.strictFileNames)))})});return}i(new Error(\"end of central directory record signature not found\"))})}s(J_,\"fromRandomAccessReader\");fm.inherits(Vo,hm);function Vo(t,e,n,i,a,r,o,l,c,d){var u=this;hm.call(u),u.reader=t,u.reader.on(\"error\",function(p){C2(u,p)}),u.reader.once(\"close\",function(){u.emit(\"close\")}),u.readEntryCursor=e,u.fileSize=n,u.entryCount=i,u.comment=a,u.entriesRead=0,u.autoClose=!!r,u.lazyEntries=!!o,u.decodeStrings=!!l,u.validateEntrySizes=!!c,u.strictFileNames=!!d,u.isOpen=!0,u.emittedError=!1,u.lazyEntries||u._readEntry()}s(Vo,\"ZipFile\");Vo.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function La(t,e){t.autoClose&&t.close(),C2(t,e)}s(La,\"emitErrorAndAutoClose\");function C2(t,e){t.emittedError||(t.emittedError=!0,t.emit(\"error\",e))}s(C2,\"emitError\");Vo.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error(\"readEntry() called without lazyEntries:true\");this._readEntry()};Vo.prototype._readEntry=function(){var t=this;if(t.entryCount===t.entriesRead){setImmediate(function(){t.autoClose&&t.close(),!t.emittedError&&t.emit(\"end\")});return}if(!t.emittedError){var e=vr(46);Gl(t.reader,e,0,e.length,t.readEntryCursor,function(n){if(n)return La(t,n);if(!t.emittedError){var i=new Cu,a=e.readUInt32LE(0);if(a!==33639248)return La(t,new Error(\"invalid central directory file header signature: 0x\"+a.toString(16)));if(i.versionMadeBy=e.readUInt16LE(4),i.versionNeededToExtract=e.readUInt16LE(6),i.generalPurposeBitFlag=e.readUInt16LE(8),i.compressionMethod=e.readUInt16LE(10),i.lastModFileTime=e.readUInt16LE(12),i.lastModFileDate=e.readUInt16LE(14),i.crc32=e.readUInt32LE(16),i.compressedSize=e.readUInt32LE(20),i.uncompressedSize=e.readUInt32LE(24),i.fileNameLength=e.readUInt16LE(28),i.extraFieldLength=e.readUInt16LE(30),i.fileCommentLength=e.readUInt16LE(32),i.internalFileAttributes=e.readUInt16LE(36),i.externalFileAttributes=e.readUInt32LE(38),i.relativeOffsetOfLocalHeader=e.readUInt32LE(42),i.generalPurposeBitFlag&64)return La(t,new Error(\"strong encryption is not supported\"));t.readEntryCursor+=46,e=vr(i.fileNameLength+i.extraFieldLength+i.fileCommentLength),Gl(t.reader,e,0,e.length,t.readEntryCursor,function(r){if(r)return La(t,r);if(!t.emittedError){var o=(i.generalPurposeBitFlag&2048)!==0;i.fileName=t.decodeStrings?pm(e,0,i.fileNameLength,o):e.slice(0,i.fileNameLength);var l=i.fileNameLength+i.extraFieldLength,c=e.slice(i.fileNameLength,l);i.extraFields=[];for(var d=0;d<c.length-3;){var u=c.readUInt16LE(d+0),p=c.readUInt16LE(d+2),m=d+4,f=m+p;if(f>c.length)return La(t,new Error(\"extra field length exceeds extra field buffer size\"));var g=vr(p);c.copy(g,0,m,f),i.extraFields.push({id:u,data:g}),d=f}if(i.fileComment=t.decodeStrings?pm(e,l,l+i.fileCommentLength,o):e.slice(l,l+i.fileCommentLength),i.comment=i.fileComment,t.readEntryCursor+=e.length,t.entriesRead+=1,i.uncompressedSize===4294967295||i.compressedSize===4294967295||i.relativeOffsetOfLocalHeader===4294967295){for(var x=null,d=0;d<i.extraFields.length;d++){var _=i.extraFields[d];if(_.id===1){x=_.data;break}}if(x==null)return La(t,new Error(\"expected zip64 extended information extra field\"));var h=0;if(i.uncompressedSize===4294967295){if(h+8>x.length)return La(t,new Error(\"zip64 extended information extra field does not include uncompressed size\"));i.uncompressedSize=Wl(x,h),h+=8}if(i.compressedSize===4294967295){if(h+8>x.length)return La(t,new Error(\"zip64 extended information extra field does not include compressed size\"));i.compressedSize=Wl(x,h),h+=8}if(i.relativeOffsetOfLocalHeader===4294967295){if(h+8>x.length)return La(t,new Error(\"zip64 extended information extra field does not include relative header offset\"));i.relativeOffsetOfLocalHeader=Wl(x,h),h+=8}}if(t.decodeStrings)for(var d=0;d<i.extraFields.length;d++){var _=i.extraFields[d];if(_.id===28789){if(_.data.length<6||_.data.readUInt8(0)!==1)continue;var v=_.data.readUInt32LE(1);if(qde.unsigned(e.slice(0,i.fileNameLength))!==v)continue;i.fileName=pm(_.data,5,_.data.length,!0);break}}if(t.validateEntrySizes&&i.compressionMethod===0){var b=i.uncompressedSize;if(i.isEncrypted()&&(b+=12),i.compressedSize!==b){var y=\"compressed/uncompressed size mismatch for stored file: \"+i.compressedSize+\" != \"+i.uncompressedSize;return La(t,new Error(y))}}if(t.decodeStrings){t.strictFileNames||(i.fileName=i.fileName.replace(/\\\\/g,\"/\"));var w=O2(i.fileName,t.validateFileNameOptions);if(w!=null)return La(t,new Error(w))}t.emit(\"entry\",i),t.lazyEntries||t._readEntry()}})}})}};Vo.prototype.openReadStream=function(t,e,n){var i=this,a=0,r=t.compressedSize;if(n==null)n=e,e={};else{if(e.decrypt!=null){if(!t.isEncrypted())throw new Error(\"options.decrypt can only be specified for encrypted entries\");if(e.decrypt!==!1)throw new Error(\"invalid options.decrypt value: \"+e.decrypt);if(t.isCompressed()&&e.decompress!==!1)throw new Error(\"entry is encrypted and compressed, and options.decompress !== false\")}if(e.decompress!=null){if(!t.isCompressed())throw new Error(\"options.decompress can only be specified for compressed entries\");if(!(e.decompress===!1||e.decompress===!0))throw new Error(\"invalid options.decompress value: \"+e.decompress)}if(e.start!=null||e.end!=null){if(t.isCompressed()&&e.decompress!==!1)throw new Error(\"start/end range not allowed for compressed entry without options.decompress === false\");if(t.isEncrypted()&&e.decrypt!==!1)throw new Error(\"start/end range not allowed for encrypted entry without options.decrypt === false\")}if(e.start!=null){if(a=e.start,a<0)throw new Error(\"options.start < 0\");if(a>t.compressedSize)throw new Error(\"options.start > entry.compressedSize\")}if(e.end!=null){if(r=e.end,r<0)throw new Error(\"options.end < 0\");if(r>t.compressedSize)throw new Error(\"options.end > entry.compressedSize\");if(r<a)throw new Error(\"options.end < options.start\")}}if(!i.isOpen)return n(new Error(\"closed\"));if(t.isEncrypted()&&e.decrypt!==!1)return n(new Error(\"entry is encrypted, and options.decrypt !== false\"));i.reader.ref();var o=vr(30);Gl(i.reader,o,0,o.length,t.relativeOffsetOfLocalHeader,function(l){try{if(l)return n(l);var c=o.readUInt32LE(0);if(c!==67324752)return n(new Error(\"invalid local file header signature: 0x\"+c.toString(16)));var d=o.readUInt16LE(26),u=o.readUInt16LE(28),p=t.relativeOffsetOfLocalHeader+o.length+d+u,m;if(t.compressionMethod===0)m=!1;else if(t.compressionMethod===8)m=e.decompress!=null?e.decompress:!0;else return n(new Error(\"unsupported compression method: \"+t.compressionMethod));var f=p,g=f+t.compressedSize;if(t.compressedSize!==0&&g>i.fileSize)return n(new Error(\"file data overflows file bounds: \"+f+\" + \"+t.compressedSize+\" > \"+i.fileSize));var x=i.reader.createReadStream({start:f+a,end:f+r}),_=x;if(m){var h=!1,v=Ude.createInflateRaw();x.on(\"error\",function(b){setImmediate(function(){h||v.emit(\"error\",b)})}),x.pipe(v),i.validateEntrySizes?(_=new Su(t.uncompressedSize),v.on(\"error\",function(b){setImmediate(function(){h||_.emit(\"error\",b)})}),v.pipe(_)):_=v,_.destroy=function(){h=!0,v!==_&&v.unpipe(_),x.unpipe(v),x.destroy()}}n(null,_)}finally{i.reader.unref()}})};function Cu(){}s(Cu,\"Entry\");Cu.prototype.getLastModDate=function(){return S2(this.lastModFileDate,this.lastModFileTime)};Cu.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Cu.prototype.isCompressed=function(){return this.compressionMethod===8};function S2(t,e){var n=t&31,i=(t>>5&15)-1,a=(t>>9&127)+1980,r=0,o=(e&31)*2,l=e>>5&63,c=e>>11&31;return new Date(a,i,n,c,l,o,r)}s(S2,\"dosDateTimeToDate\");function O2(t){return t.indexOf(\"\\\\\")!==-1?\"invalid characters in fileName: \"+t:/^[a-zA-Z]:/.test(t)||/^\\//.test(t)?\"absolute path: \"+t:t.split(\"/\").indexOf(\"..\")!==-1?\"invalid relative path: \"+t:null}s(O2,\"validateFileName\");function Gl(t,e,n,i,a,r){if(i===0)return setImmediate(function(){r(null,vr(0))});t.read(e,n,i,a,function(o,l){if(o)return r(o);if(l<i)return r(new Error(\"unexpected EOF\"));r()})}s(Gl,\"readAndAssertNoEof\");fm.inherits(Su,A2);function Su(t){A2.call(this),this.actualByteCount=0,this.expectedByteCount=t}s(Su,\"AssertByteCountStream\");Su.prototype._transform=function(t,e,n){if(this.actualByteCount+=t.length,this.actualByteCount>this.expectedByteCount){var i=\"too many bytes in the stream. expected \"+this.expectedByteCount+\". got at least \"+this.actualByteCount;return n(new Error(i))}n(null,t)};Su.prototype._flush=function(t){if(this.actualByteCount<this.expectedByteCount){var e=\"not enough bytes in the stream. expected \"+this.expectedByteCount+\". got only \"+this.actualByteCount;return t(new Error(e))}t()};fm.inherits(zo,hm);function zo(){hm.call(this),this.refCount=0}s(zo,\"RandomAccessReader\");zo.prototype.ref=function(){this.refCount+=1};zo.prototype.unref=function(){var t=this;if(t.refCount-=1,t.refCount>0)return;if(t.refCount<0)throw new Error(\"invalid unref\");t.close(e);function e(n){if(n)return t.emit(\"error\",n);t.emit(\"close\")}s(e,\"onCloseDone\")};zo.prototype.createReadStream=function(t){var e=t.start,n=t.end;if(e===n){var i=new H_;return setImmediate(function(){i.end()}),i}var a=this._readStreamForRange(e,n),r=!1,o=new gm(this);a.on(\"error\",function(c){setImmediate(function(){r||o.emit(\"error\",c)})}),o.destroy=function(){a.unpipe(o),o.unref(),a.destroy()};var l=new Su(n-e);return o.on(\"error\",function(c){setImmediate(function(){r||l.emit(\"error\",c)})}),l.destroy=function(){r=!0,o.unpipe(l),o.destroy()},a.pipe(o).pipe(l)};zo.prototype._readStreamForRange=function(t,e){throw new Error(\"not implemented\")};zo.prototype.read=function(t,e,n,i,a){var r=this.createReadStream({start:i,end:i+n}),o=new Hde,l=0;o._write=function(c,d,u){c.copy(t,e+l,0,c.length),l+=c.length,u()},o.on(\"finish\",a),r.on(\"error\",function(c){a(c)}),r.pipe(o)};zo.prototype.close=function(t){setImmediate(t)};fm.inherits(gm,H_);function gm(t){H_.call(this),this.context=t,this.context.ref(),this.unreffedYet=!1}s(gm,\"RefUnrefFilter\");gm.prototype._flush=function(t){this.unref(),t()};gm.prototype.unref=function(t){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var Wde=\"\\0\\u263A\\u263B\\u2665\\u2666\\u2663\\u2660\\u2022\\u25D8\\u25CB\\u25D9\\u2642\\u2640\\u266A\\u266B\\u263C\\u25BA\\u25C4\\u2195\\u203C\\xB6\\xA7\\u25AC\\u21A8\\u2191\\u2193\\u2192\\u2190\\u221F\\u2194\\u25B2\\u25BC !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\u2302\\xC7\\xFC\\xE9\\xE2\\xE4\\xE0\\xE5\\xE7\\xEA\\xEB\\xE8\\xEF\\xEE\\xEC\\xC4\\xC5\\xC9\\xE6\\xC6\\xF4\\xF6\\xF2\\xFB\\xF9\\xFF\\xD6\\xDC\\xA2\\xA3\\xA5\\u20A7\\u0192\\xE1\\xED\\xF3\\xFA\\xF1\\xD1\\xAA\\xBA\\xBF\\u2310\\xAC\\xBD\\xBC\\xA1\\xAB\\xBB\\u2591\\u2592\\u2593\\u2502\\u2524\\u2561\\u2562\\u2556\\u2555\\u2563\\u2551\\u2557\\u255D\\u255C\\u255B\\u2510\\u2514\\u2534\\u252C\\u251C\\u2500\\u253C\\u255E\\u255F\\u255A\\u2554\\u2569\\u2566\\u2560\\u2550\\u256C\\u2567\\u2568\\u2564\\u2565\\u2559\\u2558\\u2552\\u2553\\u256B\\u256A\\u2518\\u250C\\u2588\\u2584\\u258C\\u2590\\u2580\\u03B1\\xDF\\u0393\\u03C0\\u03A3\\u03C3\\xB5\\u03C4\\u03A6\\u0398\\u03A9\\u03B4\\u221E\\u03C6\\u03B5\\u2229\\u2261\\xB1\\u2265\\u2264\\u2320\\u2321\\xF7\\u2248\\xB0\\u2219\\xB7\\u221A\\u207F\\xB2\\u25A0\\xA0\";function pm(t,e,n,i){if(i)return t.toString(\"utf8\",e,n);for(var a=\"\",r=e;r<n;r++)a+=Wde[t[r]];return a}s(pm,\"decodeBuffer\");function Wl(t,e){var n=t.readUInt32LE(e),i=t.readUInt32LE(e+4);return i*4294967296+n}s(Wl,\"readUInt64LE\");var vr;typeof Buffer.allocUnsafe==\"function\"?vr=s(function(t){return Buffer.allocUnsafe(t)},\"newBuffer\"):vr=s(function(t){return new Buffer(t)},\"newBuffer\");function mm(t){if(t)throw t}s(mm,\"defaultCallback\")});var R2=oe(($ke,N2)=>{\"use strict\";var D2=X3(),Kde=p2(),F2=B_(),Yde=I2(),Xde=s((t,e)=>{let r=t.versionMadeBy>>8;return(e&61440)===40960?\"symlink\":(e&61440)===16384||r===0&&t.externalFileAttributes===16?\"directory\":\"file\"},\"getType\"),Zde=s((t,e)=>{let n={mode:t.externalFileAttributes>>16&65535,mtime:t.getLastModDate(),path:t.fileName};return n.type=Xde(t,n.mode),n.mode===0&&n.type===\"directory\"&&(n.mode=493),n.mode===0&&(n.mode=420),F2(e.openReadStream.bind(e))(t).then(Kde.buffer).then(i=>(n.data=i,n.type===\"symlink\"&&(n.linkname=i.toString()),n)).catch(i=>{throw e.close(),i})},\"extractEntry\"),Qde=s(t=>new Promise((e,n)=>{let i=[];t.readEntry(),t.on(\"entry\",a=>{Zde(a,t).catch(n).then(r=>{i.push(r),t.readEntry()})}),t.on(\"error\",n),t.on(\"end\",()=>e(i))}),\"extractFile\");N2.exports=()=>t=>Buffer.isBuffer(t)?!D2(t)||D2(t).ext!==\"zip\"?Promise.resolve([]):F2(Yde.fromBuffer)(t,{lazyEntries:!0}).then(Qde):Promise.reject(new TypeError(`Expected a Buffer, got ${typeof t}`))});var P2=oe((t5e,B2)=>{\"use strict\";var M2=s((t,e)=>function(){let n=e.promiseModule,i=new Array(arguments.length);for(let a=0;a<arguments.length;a++)i[a]=arguments[a];return new n((a,r)=>{e.errorFirst?i.push(function(o,l){if(e.multiArgs){let c=new Array(arguments.length-1);for(let d=1;d<arguments.length;d++)c[d-1]=arguments[d];o?(c.unshift(o),r(c)):a(c)}else o?r(o):a(l)}):i.push(function(o){if(e.multiArgs){let l=new Array(arguments.length-1);for(let c=0;c<arguments.length;c++)l[c]=arguments[c];a(l)}else a(o)}),t.apply(this,i)})},\"processFn\");B2.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=s(a=>{let r=s(o=>typeof o==\"string\"?a===o:o.test(a),\"match\");return e.include?e.include.some(r):!e.exclude.some(r)},\"filter\"),i;typeof t==\"function\"?i=s(function(){return e.excludeMain?t.apply(this,arguments):M2(t,e).apply(this,arguments)},\"ret\"):i=Object.create(Object.getPrototypeOf(t));for(let a in t){let r=t[a];i[a]=typeof r==\"function\"&&n(a)?M2(r,e):r}return i}});var U2=oe((i5e,G_)=>{\"use strict\";var $de=Ee(\"fs\"),Ds=Ee(\"path\"),L2=P2(),V2={mode:511&~process.umask(),fs:$de},z2=s(t=>{if(process.platform===\"win32\"&&/[<>:\"|?*]/.test(t.replace(Ds.parse(t).root,\"\"))){let n=new Error(`Path contains invalid characters: ${t}`);throw n.code=\"EINVAL\",n}},\"checkPath\");G_.exports=(t,e)=>Promise.resolve().then(()=>{z2(t),e=Object.assign({},V2,e);let n=L2(e.fs.mkdir),i=L2(e.fs.stat),a=s(r=>n(r,e.mode).then(()=>r).catch(o=>{if(o.code===\"ENOENT\"){if(o.message.includes(\"null bytes\")||Ds.dirname(r)===r)throw o;return a(Ds.dirname(r)).then(()=>a(r))}return i(r).then(l=>l.isDirectory()?r:Promise.reject()).catch(()=>{throw o})}),\"make\");return a(Ds.resolve(t))});G_.exports.sync=(t,e)=>{z2(t),e=Object.assign({},V2,e);let n=s(i=>{try{e.fs.mkdirSync(i,e.mode)}catch(a){if(a.code===\"ENOENT\"){if(a.message.includes(\"null bytes\")||Ds.dirname(i)===i)throw a;return n(Ds.dirname(i)),n(i)}try{if(!e.fs.statSync(i).isDirectory())throw new Error(\"The path is not a directory\")}catch{throw a}}return i},\"make\");return n(Ds.resolve(t))}});var H2=oe((r5e,q2)=>{\"use strict\";q2.exports=s(function(e,n){if(n){if(typeof n!=\"object\")throw new TypeError(String(n)+\" is not an object. Expected an object that has boolean `includeZero` property.\");if(\"includeZero\"in n){if(typeof n.includeZero!=\"boolean\")throw new TypeError(String(n.includeZero)+\" is neither true nor false. `includeZero` option must be a Boolean value.\");if(n.includeZero&&e===0)return!0}}return Number.isSafeInteger(e)&&e>=1},\"isNaturalNumber\")});var G2=oe((s5e,J2)=>{\"use strict\";var Ou=Ee(\"path\"),Iu=Ee(\"util\"),epe=H2();J2.exports=s(function(e,n,i){if(typeof e!=\"string\")throw new TypeError(Iu.inspect(e)+\" is not a string. First argument to strip-dirs must be a path string.\");if(Ou.posix.isAbsolute(e)||Ou.win32.isAbsolute(e))throw new Error(`${e} is an absolute path. strip-dirs requires a relative path.`);if(!epe(n,{includeZero:!0}))throw new Error(\"The Second argument of strip-dirs must be a natural number or 0, but received \"+Iu.inspect(n)+\".\");if(i){if(typeof i!=\"object\")throw new TypeError(Iu.inspect(i)+\" is not an object. Expected an object with a boolean `disallowOverflow` property.\");if(Array.isArray(i))throw new TypeError(Iu.inspect(i)+\" is an array. Expected an object with a boolean `disallowOverflow` property.\");if(\"disallowOverflow\"in i&&typeof i.disallowOverflow!=\"boolean\")throw new TypeError(Iu.inspect(i.disallowOverflow)+\" is neither true nor false. `disallowOverflow` option must be a Boolean value.\")}else i={disallowOverflow:!1};let a=Ou.normalize(e).split(Ou.sep);if(a.length>1&&a[0]===\".\"&&a.shift(),n>a.length-1){if(i.disallowOverflow)throw new RangeError(\"Cannot strip more directories than there are.\");n=a.length-1}return Ou.join.apply(null,a.slice(n))},\"stripDirs\")});var K2=oe((c5e,W2)=>{\"use strict\";var _m=Ee(\"path\"),tpe=O1(),npe=em(),ipe=J3(),ape=K3(),rpe=R2(),W_=U2(),ope=B_(),spe=G2(),$i=ope(tpe),lpe=s((t,e)=>e.plugins.length===0?Promise.resolve([]):Promise.all(e.plugins.map(n=>n(t,e))).then(n=>n.reduce((i,a)=>i.concat(a))),\"runPlugins\"),K_=s((t,e)=>$i.realpath(t).catch(n=>{let i=_m.dirname(t);return K_(i,e)}).then(n=>{if(n.indexOf(e)!==0)throw new Error(\"Refusing to create a directory outside the output path.\");return W_(t).then($i.realpath)}),\"safeMakeDir\"),cpe=s((t,e)=>$i.readlink(t).catch(n=>null).then(n=>{if(n)throw new Error(\"Refusing to write into a symlink\");return e}),\"preventWritingThroughSymlink\"),upe=s((t,e,n)=>lpe(t,n).then(i=>(n.strip>0&&(i=i.map(a=>(a.path=spe(a.path,n.strip),a)).filter(a=>a.path!==\".\")),typeof n.filter==\"function\"&&(i=i.filter(n.filter)),typeof n.map==\"function\"&&(i=i.map(n.map)),e?Promise.all(i.map(a=>{let r=_m.join(e,a.path),o=a.mode&~process.umask(),l=new Date;return a.type===\"directory\"?W_(e).then(c=>$i.realpath(c)).then(c=>K_(r,c)).then(()=>$i.utimes(r,l,a.mtime)).then(()=>a):W_(e).then(c=>$i.realpath(c)).then(c=>K_(_m.dirname(r),c).then(()=>c)).then(c=>a.type===\"file\"?cpe(r,c):c).then(c=>$i.realpath(_m.dirname(r)).then(d=>{if(d.indexOf(c)!==0)throw new Error(\"Refusing to write outside output directory: \"+d)})).then(()=>a.type===\"link\"||a.type===\"symlink\"&&process.platform===\"win32\"?$i.link(a.linkname,r):a.type===\"symlink\"?$i.symlink(a.linkname,r):$i.writeFile(r,a.data,{mode:o})).then(()=>a.type===\"file\"&&$i.utimes(r,l,a.mtime)).then(()=>a)})):i)),\"extractFile\");W2.exports=(t,e,n)=>typeof t!=\"string\"&&!Buffer.isBuffer(t)?Promise.reject(new TypeError(\"Input file required\")):(typeof e==\"object\"&&(n=e,e=null),n=Object.assign({plugins:[npe(),ipe(),ape(),rpe()]},n),(typeof t==\"string\"?$i.readFile(t):Promise.resolve(t)).then(a=>upe(a,e,n)))});var Y_=oe((d5e,Y2)=>{\"use strict\";var dpe=/[|\\\\{}()[\\]^$+*?.]/g;Y2.exports=function(t){if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return t.replace(dpe,\"\\\\$&\")}});var Z2=oe((p5e,X2)=>{\"use strict\";var ppe=Y_();X2.exports=function(t,e){if(typeof t!=\"string\"||typeof e!=\"string\")throw new TypeError(\"Expected a string\");return t.replace(new RegExp(\"(?:\"+ppe(e)+\"){2,}\",\"g\"),e)}});var Q2=oe((m5e,X_)=>{\"use strict\";X_.exports=()=>/[<>:\"\\/\\\\|?*\\x00-\\x1F]/g;X_.exports.windowsNames=()=>/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i});var eE=oe((f5e,$2)=>{\"use strict\";var mpe=Y_();$2.exports=function(t,e){if(typeof t!=\"string\"||typeof e!=\"string\")throw new TypeError;return e=mpe(e),t.replace(new RegExp(\"^\"+e+\"|\"+e+\"$\",\"g\"),\"\")}});var nE=oe((h5e,Q_)=>{\"use strict\";var xm=Ee(\"path\"),fpe=Z2(),Z_=Q2(),hpe=eE(),gpe=100,tE=/[\\u0000-\\u001f\\u0080-\\u009f]/g,_pe=/^\\.+/,vm=s((t,e={})=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");let n=e.replacement===void 0?\"!\":e.replacement;if(Z_().test(n)&&tE.test(n))throw new Error(\"Replacement string cannot contain reserved filename characters\");return t=t.replace(Z_(),n),t=t.replace(tE,n),t=t.replace(_pe,n),n.length>0&&(t=fpe(t,n),t=t.length>1?hpe(t,n):t),t=Z_.windowsNames().test(t)?t+n:t,t=t.slice(0,gpe),t},\"filenamify\");vm.path=(t,e)=>(t=xm.resolve(t),xm.join(xm.dirname(t),vm(xm.basename(t),e)));Q_.exports=vm;Q_.exports.default=vm});var rE=oe((_5e,aE)=>{var xpe=k_(),vpe=j_(),$_=Ee(\"fs\"),Du=s(function(){},\"noop\"),bpe=/^v?\\.0/.test(process.version),bm=s(function(t){return typeof t==\"function\"},\"isFn\"),ype=s(function(t){return!bpe||!$_?!1:(t instanceof($_.ReadStream||Du)||t instanceof($_.WriteStream||Du))&&bm(t.close)},\"isFS\"),wpe=s(function(t){return t.setHeader&&bm(t.abort)},\"isRequest\"),Epe=s(function(t,e,n,i){i=xpe(i);var a=!1;t.on(\"close\",function(){a=!0}),vpe(t,{readable:e,writable:n},function(o){if(o)return i(o);a=!0,i()});var r=!1;return function(o){if(!a&&!r){if(r=!0,ype(t))return t.close(Du);if(wpe(t))return t.abort();if(bm(t.destroy))return t.destroy();i(o||new Error(\"stream was destroyed\"))}}},\"destroyer\"),iE=s(function(t){t()},\"call\"),kpe=s(function(t,e){return t.pipe(e)},\"pipe\"),jpe=s(function(){var t=Array.prototype.slice.call(arguments),e=bm(t[t.length-1]||Du)&&t.pop()||Du;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error(\"pump requires two streams per minimum\");var n,i=t.map(function(a,r){var o=r<t.length-1,l=r>0;return Epe(a,o,l,function(c){n||(n=c),c&&i.forEach(iE),!o&&(i.forEach(iE),e(n))})});return t.reduce(kpe)},\"pump\");aE.exports=jpe});var sE=oe((v5e,oE)=>{\"use strict\";var{PassThrough:Ape}=Ee(\"stream\");oE.exports=t=>{t=Object.assign({},t);let{array:e}=t,{encoding:n}=t,i=n===\"buffer\",a=!1;e?a=!(n||i):n=n||\"utf8\",i&&(n=null);let r=0,o=[],l=new Ape({objectMode:a});return n&&l.setEncoding(n),l.on(\"data\",c=>{o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=()=>e?o:i?Buffer.concat(o,r):o.join(\"\"),l.getBufferedLength=()=>r,l}});var lE=oe((b5e,Nu)=>{\"use strict\";var Tpe=rE(),Cpe=sE(),Fu=class extends Error{constructor(){super(\"maxBuffer exceeded\"),this.name=\"MaxBufferError\"}};s(Fu,\"MaxBufferError\");function e0(t,e){if(!t)return Promise.reject(new Error(\"Expected a stream\"));e=Object.assign({maxBuffer:1/0},e);let{maxBuffer:n}=e,i;return new Promise((a,r)=>{let o=s(l=>{l&&(l.bufferedData=i.getBufferedValue()),r(l)},\"rejectPromise\");i=Tpe(t,Cpe(e),l=>{if(l){o(l);return}a()}),i.on(\"data\",()=>{i.getBufferedLength()>n&&o(new Fu)})}).then(()=>i.getBufferedValue())}s(e0,\"getStream\");Nu.exports=e0;Nu.exports.buffer=(t,e)=>e0(t,Object.assign({},e,{encoding:\"buffer\"}));Nu.exports.array=(t,e)=>e0(t,Object.assign({},e,{array:!0}));Nu.exports.MaxBufferError=Fu});var uE=oe((w5e,cE)=>{\"use strict\";cE.exports=function(t){return encodeURIComponent(t).replace(/[!'()*]/g,function(e){return\"%\"+e.charCodeAt(0).toString(16).toUpperCase()})}});var hE=oe((E5e,fE)=>{\"use strict\";var mE=\"%[a-f0-9]{2}\",dE=new RegExp(\"(\"+mE+\")|([^%]+?)\",\"gi\"),pE=new RegExp(\"(\"+mE+\")+\",\"gi\");function t0(t,e){try{return[decodeURIComponent(t.join(\"\"))]}catch{}if(t.length===1)return t;e=e||1;var n=t.slice(0,e),i=t.slice(e);return Array.prototype.concat.call([],t0(n),t0(i))}s(t0,\"decodeComponents\");function Spe(t){try{return decodeURIComponent(t)}catch{for(var e=t.match(dE)||[],n=1;n<e.length;n++)t=t0(e,n).join(\"\"),e=t.match(dE)||[];return t}}s(Spe,\"decode\");function Ope(t){for(var e={\"%FE%FF\":\"\\uFFFD\\uFFFD\",\"%FF%FE\":\"\\uFFFD\\uFFFD\"},n=pE.exec(t);n;){try{e[n[0]]=decodeURIComponent(n[0])}catch{var i=Spe(n[0]);i!==n[0]&&(e[n[0]]=i)}n=pE.exec(t)}e[\"%C2\"]=\"\\uFFFD\";for(var a=Object.keys(e),r=0;r<a.length;r++){var o=a[r];t=t.replace(new RegExp(o,\"g\"),e[o])}return t}s(Ope,\"customDecodeURIComponent\");fE.exports=function(t){if(typeof t!=\"string\")throw new TypeError(\"Expected `encodedURI` to be of type `string`, got `\"+typeof t+\"`\");try{return t=t.replace(/\\+/g,\" \"),decodeURIComponent(t)}catch{return Ope(t)}}});var yE=oe(Ru=>{\"use strict\";var Ipe=uE(),_E=rm(),gE=hE();function Dpe(t){switch(t.arrayFormat){case\"index\":return function(e,n,i){return n===null?[ea(e,t),\"[\",i,\"]\"].join(\"\"):[ea(e,t),\"[\",ea(i,t),\"]=\",ea(n,t)].join(\"\")};case\"bracket\":return function(e,n){return n===null?ea(e,t):[ea(e,t),\"[]=\",ea(n,t)].join(\"\")};default:return function(e,n){return n===null?ea(e,t):[ea(e,t),\"=\",ea(n,t)].join(\"\")}}}s(Dpe,\"encoderForArrayFormat\");function Fpe(t){var e;switch(t.arrayFormat){case\"index\":return function(n,i,a){if(e=/\\[(\\d*)\\]$/.exec(n),n=n.replace(/\\[\\d*\\]$/,\"\"),!e){a[n]=i;return}a[n]===void 0&&(a[n]={}),a[n][e[1]]=i};case\"bracket\":return function(n,i,a){if(e=/(\\[\\])$/.exec(n),n=n.replace(/\\[\\]$/,\"\"),e){if(a[n]===void 0){a[n]=[i];return}}else{a[n]=i;return}a[n]=[].concat(a[n],i)};default:return function(n,i,a){if(a[n]===void 0){a[n]=i;return}a[n]=[].concat(a[n],i)}}}s(Fpe,\"parserForArrayFormat\");function ea(t,e){return e.encode?e.strict?Ipe(t):encodeURIComponent(t):t}s(ea,\"encode\");function xE(t){return Array.isArray(t)?t.sort():typeof t==\"object\"?xE(Object.keys(t)).sort(function(e,n){return Number(e)-Number(n)}).map(function(e){return t[e]}):t}s(xE,\"keysSorter\");function vE(t){var e=t.indexOf(\"?\");return e===-1?\"\":t.slice(e+1)}s(vE,\"extract\");function bE(t,e){e=_E({arrayFormat:\"none\"},e);var n=Fpe(e),i=Object.create(null);return typeof t!=\"string\"||(t=t.trim().replace(/^[?#&]/,\"\"),!t)?i:(t.split(\"&\").forEach(function(a){var r=a.replace(/\\+/g,\" \").split(\"=\"),o=r.shift(),l=r.length>0?r.join(\"=\"):void 0;l=l===void 0?null:gE(l),n(gE(o),l,i)}),Object.keys(i).sort().reduce(function(a,r){var o=i[r];return o&&typeof o==\"object\"&&!Array.isArray(o)?a[r]=xE(o):a[r]=o,a},Object.create(null)))}s(bE,\"parse\");Ru.extract=vE;Ru.parse=bE;Ru.stringify=function(t,e){var n={encode:!0,strict:!0,arrayFormat:\"none\"};e=_E(n,e),e.sort===!1&&(e.sort=function(){});var i=Dpe(e);return t?Object.keys(t).sort(e.sort).map(function(a){var r=t[a];if(r===void 0)return\"\";if(r===null)return ea(a,e);if(Array.isArray(r)){var o=[];return r.slice().forEach(function(l){l!==void 0&&o.push(i(a,l,o.length))}),o.join(\"&\")}return ea(a,e)+\"=\"+ea(r,e)}).filter(function(a){return a.length>0}).join(\"&\"):\"\"};Ru.parseUrl=function(t,e){return{url:t.split(\"?\")[0]||\"\",query:bE(vE(t),e)}}});var n0=oe((T5e,wE)=>{\"use strict\";wE.exports=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(`Expected \\`url\\` to be of type \\`string\\`, got \\`${typeof t}\\``);return t=t.trim(),e=Object.assign({https:!1},e),/^\\.*\\/|^(?!localhost)\\w+:/.test(t)?t:t.replace(/^(?!(?:\\w+:)?\\/\\/)/,e.https?\"https://\":\"http://\")}});var i0=oe((C5e,EE)=>{\"use strict\";var Npe=Object.prototype.toString;EE.exports=function(t){var e;return Npe.call(t)===\"[object Object]\"&&(e=Object.getPrototypeOf(t),e===null||e===Object.getPrototypeOf({}))}});var jE=oe((S5e,kE)=>{\"use strict\";var a0=i0();kE.exports=(t,e)=>{if(!a0(t))throw new TypeError(\"Expected a plain object\");if(e=e||{},typeof e==\"function\")throw new TypeError(\"Specify the compare function as an option instead\");let n=e.deep,i=[],a=[],r=s(o=>{let l=i.indexOf(o);if(l!==-1)return a[l];let c={},d=Object.keys(o).sort(e.compare);i.push(o),a.push(c);for(let u=0;u<d.length;u++){let p=d[u],m=o[p];if(n&&Array.isArray(m)){let f=[];for(let g=0;g<m.length;g++)f[g]=a0(m[g])?r(m[g]):m[g];c[p]=f;continue}c[p]=n&&a0(m)?r(m):m}return c},\"sortKeys\");return r(t)}});var SE=oe((I5e,CE)=>{\"use strict\";var r0=Ee(\"url\"),Rpe=Ee(\"punycode\"),AE=yE(),Mpe=n0(),Bpe=jE(),Ppe={\"http:\":80,\"https:\":443,\"ftp:\":21},Lpe={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,\"http:\":!0,\"https:\":!0,\"ftp:\":!0,\"gopher:\":!0,\"file:\":!0};function TE(t,e){return e.some(n=>n instanceof RegExp?n.test(t):n===t)}s(TE,\"testParameter\");CE.exports=(t,e)=>{if(e=Object.assign({normalizeProtocol:!0,normalizeHttps:!1,stripFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),typeof t!=\"string\")throw new TypeError(\"Expected a string\");let n=t.startsWith(\"//\");t=Mpe(t.trim()).replace(/^\\/\\//,\"http://\");let i=r0.parse(t);if(e.normalizeHttps&&i.protocol===\"https:\"&&(i.protocol=\"http:\"),!i.hostname&&!i.pathname)throw new Error(\"Invalid URL\");delete i.host,delete i.query,e.stripFragment&&delete i.hash;let a=Ppe[i.protocol];if(Number(i.port)===a&&delete i.port,i.pathname&&(i.pathname=i.pathname.replace(/\\/{2,}/g,\"/\")),i.pathname&&(i.pathname=decodeURI(i.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=i.pathname.split(\"/\"),l=o[o.length-1];TE(l,e.removeDirectoryIndex)&&(o=o.slice(0,o.length-1),i.pathname=o.slice(1).join(\"/\")+\"/\")}if(Lpe[i.protocol]){let o=i.protocol+\"//\"+i.hostname,l=r0.resolve(o,i.pathname);i.pathname=l.replace(o,\"\")}i.hostname&&(i.hostname=Rpe.toUnicode(i.hostname).toLowerCase(),i.hostname=i.hostname.replace(/\\.$/,\"\"),e.stripWWW&&(i.hostname=i.hostname.replace(/^www\\./,\"\"))),i.search===\"?\"&&delete i.search;let r=AE.parse(i.search);if(Array.isArray(e.removeQueryParameters))for(let o in r)TE(o,e.removeQueryParameters)&&delete r[o];return e.sortQueryParameters&&(i.search=AE.stringify(Bpe(r))),i.search!==null&&(i.search=decodeURIComponent(i.search)),t=r0.format(i),(e.removeTrailingSlash||i.pathname===\"/\")&&(t=t.replace(/\\/$/,\"\")),n&&!e.normalizeProtocol&&(t=t.replace(/^http:\\/\\//,\"//\")),t}});var IE=oe((F5e,OE)=>{\"use strict\";var Vpe=Ee(\"stream\").PassThrough;OE.exports=t=>{t=Object.assign({},t);let e=t.array,n=t.encoding,i=n===\"buffer\",a=!1;e?a=!(n||i):n=n||\"utf8\",i&&(n=null);let r=0,o=[],l=new Vpe({objectMode:a});return n&&l.setEncoding(n),l.on(\"data\",c=>{o.push(c),a?r=o.length:r+=c.length}),l.getBufferedValue=()=>e?o:i?Buffer.concat(o,r):o.join(\"\"),l.getBufferedLength=()=>r,l}});var s0=oe((N5e,ym)=>{\"use strict\";var zpe=IE();function o0(t,e){if(!t)return Promise.reject(new Error(\"Expected a stream\"));e=Object.assign({maxBuffer:1/0},e);let n=e.maxBuffer,i,a,r=new Promise((o,l)=>{let c=s(d=>{d&&(d.bufferedData=i.getBufferedValue()),l(d)},\"error\");i=zpe(e),t.once(\"error\",c),t.pipe(i),i.on(\"data\",()=>{i.getBufferedLength()>n&&l(new Error(\"maxBuffer exceeded\"))}),i.once(\"error\",c),i.on(\"end\",o),a=s(()=>{t.unpipe&&t.unpipe(i)},\"clean\")});return r.then(a,a),r.then(()=>i.getBufferedValue())}s(o0,\"getStream\");ym.exports=o0;ym.exports.buffer=(t,e)=>o0(t,Object.assign({},e,{encoding:\"buffer\"}));ym.exports.array=(t,e)=>o0(t,Object.assign({},e,{array:!0}))});var FE=oe((M5e,DE)=>{\"use strict\";function Upe(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}s(Upe,\"_classCallCheck\");var qpe=[200,203,204,206,300,301,404,405,410,414,501],Hpe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],Jpe={connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},Gpe={\"content-length\":!0,\"content-encoding\":!0,\"transfer-encoding\":!0,\"content-range\":!0};function l0(t){var e={};if(!t)return e;for(var n=t.trim().split(/\\s*,\\s*/),r=n,i=Array.isArray(r),a=0,r=i?r:r[Symbol.iterator]();;){var o;if(i){if(a>=r.length)break;o=r[a++]}else{if(a=r.next(),a.done)break;o=a.value}var l=o,c=l.split(/\\s*=\\s*/,2),d=c[0],u=c[1];e[d]=u===void 0?!0:u.replace(/^\"|\"$/g,\"\")}return e}s(l0,\"parseCacheControl\");function Wpe(t){var e=[];for(var n in t){var i=t[n];e.push(i===!0?n:n+\"=\"+i)}if(e.length)return e.join(\", \")}s(Wpe,\"formatCacheControl\");DE.exports=function(){function t(e,n){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=i.shared,r=i.cacheHeuristic,o=i.immutableMinTimeToLive,l=i.ignoreCargoCult,c=i._fromObject;if(Upe(this,t),c){this._fromObject(c);return}if(!n||!n.headers)throw Error(\"Response headers missing\");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=a!==!1,this._cacheHeuristic=r!==void 0?r:.1,this._immutableMinTtl=o!==void 0?o:24*3600*1e3,this._status=\"status\"in n?n.status:200,this._resHeaders=n.headers,this._rescc=l0(n.headers[\"cache-control\"]),this._method=\"method\"in e?e.method:\"GET\",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=n.headers.vary?e.headers:null,this._reqcc=l0(e.headers[\"cache-control\"]),l&&\"pre-check\"in this._rescc&&\"post-check\"in this._rescc&&(delete this._rescc[\"pre-check\"],delete this._rescc[\"post-check\"],delete this._rescc[\"no-cache\"],delete this._rescc[\"no-store\"],delete this._rescc[\"must-revalidate\"],this._resHeaders=Object.assign({},this._resHeaders,{\"cache-control\":Wpe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!n.headers[\"cache-control\"]&&/no-cache/.test(n.headers.pragma)&&(this._rescc[\"no-cache\"]=!0)}return s(t,\"CachePolicy\"),t.prototype.now=s(function(){return Date.now()},\"now\"),t.prototype.storable=s(function(){return!!(!this._reqcc[\"no-store\"]&&(this._method===\"GET\"||this._method===\"HEAD\"||this._method===\"POST\"&&this._hasExplicitExpiration())&&Hpe.indexOf(this._status)!==-1&&!this._rescc[\"no-store\"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc[\"max-age\"]||this._rescc[\"s-maxage\"]||qpe.indexOf(this._status)!==-1))},\"storable\"),t.prototype._hasExplicitExpiration=s(function(){return this._isShared&&this._rescc[\"s-maxage\"]||this._rescc[\"max-age\"]||this._resHeaders.expires},\"_hasExplicitExpiration\"),t.prototype._assertRequestHasHeaders=s(function(n){if(!n||!n.headers)throw Error(\"Request headers missing\")},\"_assertRequestHasHeaders\"),t.prototype.satisfiesWithoutRevalidation=s(function(n){this._assertRequestHasHeaders(n);var i=l0(n.headers[\"cache-control\"]);if(i[\"no-cache\"]||/no-cache/.test(n.headers.pragma)||i[\"max-age\"]&&this.age()>i[\"max-age\"]||i[\"min-fresh\"]&&this.timeToLive()<1e3*i[\"min-fresh\"])return!1;if(this.stale()){var a=i[\"max-stale\"]&&!this._rescc[\"must-revalidate\"]&&(i[\"max-stale\"]===!0||i[\"max-stale\"]>this.age()-this.maxAge());if(!a)return!1}return this._requestMatches(n,!1)},\"satisfiesWithoutRevalidation\"),t.prototype._requestMatches=s(function(n,i){return(!this._url||this._url===n.url)&&this._host===n.headers.host&&(!n.method||this._method===n.method||i&&n.method===\"HEAD\")&&this._varyMatches(n)},\"_requestMatches\"),t.prototype._allowsStoringAuthenticated=s(function(){return this._rescc[\"must-revalidate\"]||this._rescc.public||this._rescc[\"s-maxage\"]},\"_allowsStoringAuthenticated\"),t.prototype._varyMatches=s(function(n){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary===\"*\")return!1;for(var i=this._resHeaders.vary.trim().toLowerCase().split(/\\s*,\\s*/),o=i,a=Array.isArray(o),r=0,o=a?o:o[Symbol.iterator]();;){var l;if(a){if(r>=o.length)break;l=o[r++]}else{if(r=o.next(),r.done)break;l=r.value}var c=l;if(n.headers[c]!==this._reqHeaders[c])return!1}return!0},\"_varyMatches\"),t.prototype._copyWithoutHopByHopHeaders=s(function(n){var i={};for(var a in n)Jpe[a]||(i[a]=n[a]);if(n.connection)for(var r=n.connection.trim().split(/\\s*,\\s*/),c=r,o=Array.isArray(c),l=0,c=o?c:c[Symbol.iterator]();;){var d;if(o){if(l>=c.length)break;d=c[l++]}else{if(l=c.next(),l.done)break;d=l.value}var u=d;delete i[u]}if(i.warning){var p=i.warning.split(/,/).filter(function(m){return!/^\\s*1[0-9][0-9]/.test(m)});p.length?i.warning=p.join(\",\").trim():delete i.warning}return i},\"_copyWithoutHopByHopHeaders\"),t.prototype.responseHeaders=s(function(){var n=this._copyWithoutHopByHopHeaders(this._resHeaders),i=this.age();return i>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(n.warning=(n.warning?`${n.warning}, `:\"\")+'113 - \"rfc7234 5.5.4\"'),n.age=`${Math.round(i)}`,n},\"responseHeaders\"),t.prototype.date=s(function(){var n=Date.parse(this._resHeaders.date),i=8*3600*1e3;return Number.isNaN(n)||n<this._responseTime-i||n>this._responseTime+i?this._responseTime:n},\"date\"),t.prototype.age=s(function(){var n=Math.max(0,(this._responseTime-this.date())/1e3);if(this._resHeaders.age){var i=this._ageValue();i>n&&(n=i)}var a=(this.now()-this._responseTime)/1e3;return n+a},\"age\"),t.prototype._ageValue=s(function(){var n=parseInt(this._resHeaders.age);return isFinite(n)?n:0},\"_ageValue\"),t.prototype.maxAge=s(function(){if(!this.storable()||this._rescc[\"no-cache\"]||this._isShared&&this._resHeaders[\"set-cookie\"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary===\"*\")return 0;if(this._isShared){if(this._rescc[\"proxy-revalidate\"])return 0;if(this._rescc[\"s-maxage\"])return parseInt(this._rescc[\"s-maxage\"],10)}if(this._rescc[\"max-age\"])return parseInt(this._rescc[\"max-age\"],10);var n=this._rescc.immutable?this._immutableMinTtl:0,i=this.date();if(this._resHeaders.expires){var a=Date.parse(this._resHeaders.expires);return Number.isNaN(a)||a<i?0:Math.max(n,(a-i)/1e3)}if(this._resHeaders[\"last-modified\"]){var r=Date.parse(this._resHeaders[\"last-modified\"]);if(isFinite(r)&&i>r)return Math.max(n,(i-r)/1e3*this._cacheHeuristic)}return n},\"maxAge\"),t.prototype.timeToLive=s(function(){return Math.max(0,this.maxAge()-this.age())*1e3},\"timeToLive\"),t.prototype.stale=s(function(){return this.maxAge()<=this.age()},\"stale\"),t.fromObject=s(function(n){return new this(void 0,void 0,{_fromObject:n})},\"fromObject\"),t.prototype._fromObject=s(function(n){if(this._responseTime)throw Error(\"Reinitialized\");if(!n||n.v!==1)throw Error(\"Invalid serialization\");this._responseTime=n.t,this._isShared=n.sh,this._cacheHeuristic=n.ch,this._immutableMinTtl=n.imm!==void 0?n.imm:24*3600*1e3,this._status=n.st,this._resHeaders=n.resh,this._rescc=n.rescc,this._method=n.m,this._url=n.u,this._host=n.h,this._noAuthorization=n.a,this._reqHeaders=n.reqh,this._reqcc=n.reqcc},\"_fromObject\"),t.prototype.toObject=s(function(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}},\"toObject\"),t.prototype.revalidationHeaders=s(function(n){this._assertRequestHasHeaders(n);var i=this._copyWithoutHopByHopHeaders(n.headers);if(delete i[\"if-range\"],!this._requestMatches(n,!0)||!this.storable())return delete i[\"if-none-match\"],delete i[\"if-modified-since\"],i;this._resHeaders.etag&&(i[\"if-none-match\"]=i[\"if-none-match\"]?`${i[\"if-none-match\"]}, ${this._resHeaders.etag}`:this._resHeaders.etag);var a=i[\"accept-ranges\"]||i[\"if-match\"]||i[\"if-unmodified-since\"]||this._method&&this._method!=\"GET\";if(a){if(delete i[\"if-modified-since\"],i[\"if-none-match\"]){var r=i[\"if-none-match\"].split(/,/).filter(function(o){return!/^\\s*W\\//.test(o)});r.length?i[\"if-none-match\"]=r.join(\",\").trim():delete i[\"if-none-match\"]}}else this._resHeaders[\"last-modified\"]&&!i[\"if-modified-since\"]&&(i[\"if-modified-since\"]=this._resHeaders[\"last-modified\"]);return i},\"revalidationHeaders\"),t.prototype.revalidatedPolicy=s(function(n,i){if(this._assertRequestHasHeaders(n),!i||!i.headers)throw Error(\"Response headers missing\");var a=!1;if(i.status!==void 0&&i.status!=304?a=!1:i.headers.etag&&!/^\\s*W\\//.test(i.headers.etag)?a=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===i.headers.etag:this._resHeaders.etag&&i.headers.etag?a=this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===i.headers.etag.replace(/^\\s*W\\//,\"\"):this._resHeaders[\"last-modified\"]?a=this._resHeaders[\"last-modified\"]===i.headers[\"last-modified\"]:!this._resHeaders.etag&&!this._resHeaders[\"last-modified\"]&&!i.headers.etag&&!i.headers[\"last-modified\"]&&(a=!0),!a)return{policy:new this.constructor(n,i),modified:!0};var r={};for(var o in this._resHeaders)r[o]=o in i.headers&&!Gpe[o]?i.headers[o]:this._resHeaders[o];var l=Object.assign({},i,{status:this._status,method:this._method,headers:r});return{policy:new this.constructor(n,l),modified:!1}},\"revalidatedPolicy\"),t}()});var RE=oe((P5e,NE)=>{\"use strict\";NE.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i<n.length;i++)e[n[i].toLowerCase()]=t[n[i]];return e}});var BE=oe((L5e,ME)=>{\"use strict\";var Kpe=Ee(\"stream\").Readable,Ype=RE(),wm=class extends Kpe{constructor(e,n,i,a){if(typeof e!=\"number\")throw new TypeError(\"Argument `statusCode` should be a number\");if(typeof n!=\"object\")throw new TypeError(\"Argument `headers` should be an object\");if(!(i instanceof Buffer))throw new TypeError(\"Argument `body` should be a buffer\");if(typeof a!=\"string\")throw new TypeError(\"Argument `url` should be a string\");super(),this.statusCode=e,this.headers=Ype(n),this.body=i,this.url=a}_read(){this.push(this.body),this.push(null)}};s(wm,\"Response\");ME.exports=wm});var LE=oe((z5e,PE)=>{\"use strict\";PE.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i<n.length;i++)e[n[i].toLowerCase()]=t[n[i]];return e}});var Em=oe((U5e,VE)=>{\"use strict\";var Xpe=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];VE.exports=(t,e)=>{let n=new Set(Object.keys(t).concat(Xpe));for(let i of n)i in e||(e[i]=typeof t[i]==\"function\"?t[i].bind(t):t[i])}});var UE=oe((q5e,zE)=>{\"use strict\";var Zpe=Ee(\"stream\").PassThrough,Qpe=Em(),$pe=s(t=>{if(!(t&&t.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new Zpe;return Qpe(t,e),t.pipe(e)},\"cloneResponse\");zE.exports=$pe});var qE=oe(c0=>{c0.stringify=s(function t(e){if(typeof e>\"u\")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(\":base64:\"+e.toString(\"base64\"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e==\"object\"){var n=\"\",i=Array.isArray(e);n=i?\"[\":\"{\";var a=!0;for(var r in e){var o=typeof e[r]==\"function\"||!i&&typeof e[r]>\"u\";Object.hasOwnProperty.call(e,r)&&!o&&(a||(n+=\",\"),a=!1,i?e[r]==null?n+=\"null\":n+=t(e[r]):e[r]!==void 0&&(n+=t(r)+\":\"+t(e[r])))}return n+=i?\"]\":\"}\",n}else return typeof e==\"string\"?JSON.stringify(/^:/.test(e)?\":\"+e:e):typeof e>\"u\"?\"null\":JSON.stringify(e)},\"stringify\");c0.parse=function(t){return JSON.parse(t,function(e,n){return typeof n==\"string\"?/^:base64:/.test(n)?new Buffer(n.substring(8),\"base64\"):/^:/.test(n)?n.substring(1):n:n})}});var GE=oe((W5e,JE)=>{\"use strict\";var eme=Ee(\"events\"),HE=qE(),tme=s(t=>{let e={redis:\"@keyv/redis\",mongodb:\"@keyv/mongo\",mongo:\"@keyv/mongo\",sqlite:\"@keyv/sqlite\",postgresql:\"@keyv/postgres\",postgres:\"@keyv/postgres\",mysql:\"@keyv/mysql\"};if(t.adapter||t.uri){let n=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(Ee(e[n]))(t)}return new Map},\"loadStore\"),km=class extends eme{constructor(e,n){if(super(),this.opts=Object.assign({namespace:\"keyv\"},typeof e==\"string\"?{uri:e}:e,n),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=tme(i)}typeof this.opts.store.on==\"function\"&&this.opts.store.on(\"error\",i=>this.emit(\"error\",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e){e=this._getKeyPrefix(e);let n=this.opts.store;return Promise.resolve().then(()=>n.get(e)).then(i=>{if(i=typeof i==\"string\"?HE.parse(i):i,i!==void 0){if(typeof i.expires==\"number\"&&Date.now()>i.expires){this.delete(e);return}return i.value}})}set(e,n,i){e=this._getKeyPrefix(e),typeof i>\"u\"&&(i=this.opts.ttl),i===0&&(i=void 0);let a=this.opts.store;return Promise.resolve().then(()=>{let r=typeof i==\"number\"?Date.now()+i:null;return n={value:n,expires:r},a.set(e,HE.stringify(n),i)}).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let n=this.opts.store;return Promise.resolve().then(()=>n.delete(e))}clear(){let e=this.opts.store;return Promise.resolve().then(()=>e.clear())}};s(km,\"Keyv\");JE.exports=km});var XE=oe((Y5e,YE)=>{\"use strict\";var nme=Ee(\"events\"),WE=Ee(\"url\"),ime=SE(),ame=s0(),u0=FE(),KE=BE(),rme=LE(),ome=UE(),sme=GE(),pa=class{constructor(e,n){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new sme({uri:typeof n==\"string\"&&n,store:typeof n!=\"string\"&&n,namespace:\"cacheable-request\"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(n,i)=>{typeof n==\"string\"&&(n=WE.parse(n)),n=Object.assign({headers:{},method:\"GET\",cache:!0,strictTtl:!1,automaticFailover:!1},n),n.headers=rme(n.headers);let a=new nme,r=ime(WE.format(n)),o=`${n.method}:${r}`,l=!1,c=!1,d=s(p=>{c=!0;let m=s(f=>{if(l){let x=u0.fromObject(l.cachePolicy).revalidatedPolicy(p,f);if(!x.modified){let _=x.policy.responseHeaders();f=new KE(f.statusCode,_,l.body,l.url),f.cachePolicy=x.policy,f.fromCache=!0}}f.fromCache||(f.cachePolicy=new u0(p,f),f.fromCache=!1);let g;p.cache&&f.cachePolicy.storable()?(g=ome(f),ame.buffer(f).then(x=>{let _={cachePolicy:f.cachePolicy.toObject(),url:f.url,statusCode:f.fromCache?l.statusCode:f.statusCode,body:x},h=p.strictTtl?f.cachePolicy.timeToLive():void 0;return this.cache.set(o,_,h)}).catch(x=>a.emit(\"error\",new pa.CacheError(x)))):p.cache&&l&&this.cache.delete(o).catch(x=>a.emit(\"error\",new pa.CacheError(x))),a.emit(\"response\",g||f),typeof i==\"function\"&&i(g||f)},\"handler\");try{let f=e(p,m);a.emit(\"request\",f)}catch(f){a.emit(\"error\",new pa.RequestError(f))}},\"makeRequest\"),u=s(p=>Promise.resolve().then(()=>p.cache?this.cache.get(o):void 0).then(m=>{if(typeof m>\"u\")return d(p);let f=u0.fromObject(m.cachePolicy);if(f.satisfiesWithoutRevalidation(p)){let g=f.responseHeaders(),x=new KE(m.statusCode,g,m.body,m.url);x.cachePolicy=f,x.fromCache=!0,a.emit(\"response\",x),typeof i==\"function\"&&i(x)}else l=m,p.headers=f.revalidationHeaders(p),d(p)}),\"get\");return this.cache.on(\"error\",p=>a.emit(\"error\",new pa.CacheError(p))),u(n).catch(p=>{n.automaticFailover&&!c&&d(n),a.emit(\"error\",new pa.CacheError(p))}),a}}};s(pa,\"CacheableRequest\");pa.RequestError=class extends Error{constructor(t){super(t.message),this.name=\"RequestError\",Object.assign(this,t)}};pa.CacheError=class extends Error{constructor(t){super(t.message),this.name=\"CacheError\",Object.assign(this,t)}};YE.exports=pa});var ZE=oe(($5e,p0)=>{\"use strict\";var d0=Ee(\"stream\");function Kl(t,e,n){typeof n>\"u\"&&(n=e,e=t,t=null),d0.Duplex.call(this,t),typeof n.read!=\"function\"&&(n=new d0.Readable(t).wrap(n)),this._writable=e,this._readable=n,this._waiting=!1;var i=this;e.once(\"finish\",function(){i.end()}),this.once(\"finish\",function(){e.end()}),n.on(\"readable\",function(){i._waiting&&(i._waiting=!1,i._read())}),n.once(\"end\",function(){i.push(null)}),(!t||typeof t.bubbleErrors>\"u\"||t.bubbleErrors)&&(e.on(\"error\",function(a){i.emit(\"error\",a)}),n.on(\"error\",function(a){i.emit(\"error\",a)}))}s(Kl,\"DuplexWrapper\");Kl.prototype=Object.create(d0.Duplex.prototype,{constructor:{value:Kl}});Kl.prototype._write=s(function(e,n,i){this._writable.write(e,n,i)},\"_write\");Kl.prototype._read=s(function(){for(var e,n=0;(e=this._readable.read())!==null;)this.push(e),n++;n===0&&(this._waiting=!0)},\"_read\");p0.exports=s(function(e,n,i){return new Kl(e,n,i)},\"duplex2\");p0.exports.DuplexWrapper=Kl});var ik=oe((tje,nk)=>{var QE=Os().Readable,lme=Ts();nk.exports=jm;jm.ctor=$E;jm.obj=dme;var cme=$E();function ume(t){return t=t.slice(),function(e,n){var i=null,a=t.length?t.shift():null;a instanceof Error&&(i=a,a=null),n(i,a)}}s(ume,\"toFunction\");function jm(t,e){(typeof t!=\"object\"||Array.isArray(t))&&(e=t,t={});var n=new cme(t);return n._from=Array.isArray(e)?ume(e):e||ek,n}s(jm,\"from2\");function $E(t,e){typeof t==\"function\"&&(e=t,t={}),t=tk(t),lme(n,QE);function n(i){if(!(this instanceof n))return new n(i);this._reading=!1,this._callback=o,this.destroyed=!1,QE.call(this,i||t);var a=this,r=this._readableState.highWaterMark;function o(l,c){if(!a.destroyed){if(l)return a.destroy(l);if(c===null)return a.push(null);a._reading=!1,a.push(c)&&a._read(r)}}s(o,\"check\")}return s(n,\"Class\"),n.prototype._from=e||ek,n.prototype._read=function(i){this._reading||this.destroyed||(this._reading=!0,this._from(i,this._callback))},n.prototype.destroy=function(i){if(!this.destroyed){this.destroyed=!0;var a=this;process.nextTick(function(){i&&a.emit(\"error\",i),a.emit(\"close\")})}},n}s($E,\"ctor\");function dme(t,e){return(typeof t==\"function\"||Array.isArray(t))&&(e=t,t={}),t=tk(t),t.objectMode=!0,t.highWaterMark=16,jm(t,e)}s(dme,\"obj\");function ek(){}s(ek,\"noop\");function tk(t){return t=t||{},t}s(tk,\"defaults\")});var rk=oe((ije,ak)=>{\"use strict\";ak.exports=t=>t instanceof Promise||t!==null&&typeof t==\"object\"&&typeof t.then==\"function\"&&typeof t.catch==\"function\"});var lk=oe((aje,m0)=>{\"use strict\";var ok=ik(),sk=rk();m0.exports=t=>{Array.isArray(t)&&(t=t.slice());let e,n;i(t);function i(a){t=a,e=sk(t)?t:null,n=!e&&t[Symbol.iterator]&&typeof t!=\"string\"&&!Buffer.isBuffer(t)?t[Symbol.iterator]():null}return s(i,\"prepare\"),ok(s(function a(r,o){if(e){e.then(i).then(()=>a.call(this,r,o),o);return}if(n){let c=n.next();setImmediate(o,null,c.done?null:c.value);return}if(t.length===0){setImmediate(o,null,null);return}let l=t.slice(0,r);t=t.slice(r),setImmediate(o,null,l)},\"reader\"))};m0.exports.obj=t=>{Array.isArray(t)&&(t=t.slice());let e,n;i(t);function i(a){t=a,e=sk(t)?t:null,n=!e&&t[Symbol.iterator]?t[Symbol.iterator]():null}return s(i,\"prepare\"),ok.obj(s(function a(r,o){if(e){e.then(i).then(()=>a.call(this,r,o),o);return}if(n){let l=n.next();setImmediate(o,null,l.done?null:l.value);return}this.push(t),setImmediate(o,null,null)},\"reader\"))}});var g0=oe((f0,h0)=>{\"use strict\";Object.defineProperty(f0,\"__esModule\",{value:!0});var ck=Ee(\"util\"),pme=Object.prototype.toString,Mu=s(t=>e=>typeof e===t,\"isOfType\"),Am=s(t=>{let e=pme.call(t).slice(8,-1);return e||null},\"getObjectType\"),Pn=s(t=>e=>Am(e)===t,\"isObjectOfType\");function yr(t){if(t===null)return\"null\";if(t===!0||t===!1)return\"boolean\";let e=typeof t;if(e===\"undefined\")return\"undefined\";if(e===\"string\")return\"string\";if(e===\"number\")return\"number\";if(e===\"symbol\")return\"symbol\";if(yr.function_(t))return\"Function\";if(Array.isArray(t))return\"Array\";if(Buffer.isBuffer(t))return\"Buffer\";let n=Am(t);if(n)return n;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError(\"Please don't use object wrappers for primitive types\");return\"Object\"}s(yr,\"is\");(function(t){let e=s(h=>typeof h==\"object\",\"isObject\");t.undefined=Mu(\"undefined\"),t.string=Mu(\"string\"),t.number=Mu(\"number\"),t.function_=Mu(\"function\"),t.null_=h=>h===null,t.class_=h=>t.function_(h)&&h.toString().startsWith(\"class \"),t.boolean=h=>h===!0||h===!1,t.symbol=Mu(\"symbol\"),t.array=Array.isArray,t.buffer=Buffer.isBuffer,t.nullOrUndefined=h=>t.null_(h)||t.undefined(h),t.object=h=>!t.nullOrUndefined(h)&&(t.function_(h)||e(h)),t.iterable=h=>!t.nullOrUndefined(h)&&t.function_(h[Symbol.iterator]),t.generator=h=>t.iterable(h)&&t.function_(h.next)&&t.function_(h.throw),t.nativePromise=Pn(\"Promise\");let n=s(h=>!t.null_(h)&&e(h)&&t.function_(h.then)&&t.function_(h.catch),\"hasPromiseAPI\");t.promise=h=>t.nativePromise(h)||n(h);let i=s(h=>v=>t.function_(v)&&t.function_(v.constructor)&&v.constructor.name===h,\"isFunctionOfType\");t.generatorFunction=i(\"GeneratorFunction\"),t.asyncFunction=i(\"AsyncFunction\"),t.boundFunction=h=>t.function_(h)&&!h.hasOwnProperty(\"prototype\"),t.regExp=Pn(\"RegExp\"),t.date=Pn(\"Date\"),t.error=Pn(\"Error\"),t.map=Pn(\"Map\"),t.set=Pn(\"Set\"),t.weakMap=Pn(\"WeakMap\"),t.weakSet=Pn(\"WeakSet\"),t.int8Array=Pn(\"Int8Array\"),t.uint8Array=Pn(\"Uint8Array\"),t.uint8ClampedArray=Pn(\"Uint8ClampedArray\"),t.int16Array=Pn(\"Int16Array\"),t.uint16Array=Pn(\"Uint16Array\"),t.int32Array=Pn(\"Int32Array\"),t.uint32Array=Pn(\"Uint32Array\"),t.float32Array=Pn(\"Float32Array\"),t.float64Array=Pn(\"Float64Array\"),t.arrayBuffer=Pn(\"ArrayBuffer\"),t.sharedArrayBuffer=Pn(\"SharedArrayBuffer\"),t.dataView=Pn(\"DataView\"),t.directInstanceOf=(h,v)=>t.object(h)&&t.object(v)&&Object.getPrototypeOf(h)===v.prototype,t.truthy=h=>!!h,t.falsy=h=>!h,t.nan=h=>Number.isNaN(h);let a=new Set([\"undefined\",\"string\",\"number\",\"boolean\",\"symbol\"]);t.primitive=h=>t.null_(h)||a.has(typeof h),t.integer=h=>Number.isInteger(h),t.safeInteger=h=>Number.isSafeInteger(h),t.plainObject=h=>{let v;return Am(h)===\"Object\"&&(v=Object.getPrototypeOf(h),v===null||v===Object.getPrototypeOf({}))};let r=new Set([\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\"]);t.typedArray=h=>{let v=Am(h);return v===null?!1:r.has(v)};let o=s(h=>t.safeInteger(h)&&h>-1,\"isValidLength\");t.arrayLike=h=>!t.nullOrUndefined(h)&&!t.function_(h)&&o(h.length),t.inRange=(h,v)=>{if(t.number(v))return h>=Math.min(0,v)&&h<=Math.max(v,0);if(t.array(v)&&v.length===2)return h>=Math.min.apply(null,v)&&h<=Math.max.apply(null,v);throw new TypeError(`Invalid range: ${ck.inspect(v)}`)};let l=1,c=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];t.domElement=h=>t.object(h)&&h.nodeType===l&&t.string(h.nodeName)&&!t.plainObject(h)&&c.every(v=>v in h),t.nodeStream=h=>!t.nullOrUndefined(h)&&e(h)&&t.function_(h.pipe),t.infinite=h=>h===1/0||h===-1/0;let d=s(h=>v=>t.integer(v)&&Math.abs(v%2)===h,\"isAbsoluteMod2\");t.even=d(0),t.odd=d(1);let u=s(h=>t.string(h)&&/\\S/.test(h)===!1,\"isWhiteSpaceString\"),p=s(h=>(t.string(h)||t.array(h))&&h.length===0,\"isEmptyStringOrArray\"),m=s(h=>!t.map(h)&&!t.set(h)&&t.object(h)&&Object.keys(h).length===0,\"isEmptyObject\"),f=s(h=>(t.map(h)||t.set(h))&&h.size===0,\"isEmptyMapOrSet\");t.empty=h=>t.falsy(h)||p(h)||m(h)||f(h),t.emptyOrWhitespace=h=>t.empty(h)||u(h);let g=s((h,v,b)=>{let y=Array.prototype.slice.call(b,1);if(t.function_(v)===!1)throw new TypeError(`Invalid predicate: ${ck.inspect(v)}`);if(y.length===0)throw new TypeError(\"Invalid number of values\");return h.call(y,v)},\"predicateOnArray\");function x(h){return g(Array.prototype.some,h,arguments)}s(x,\"any\"),t.any=x;function _(h){return g(Array.prototype.every,h,arguments)}s(_,\"all\"),t.all=_})(yr||(yr={}));Object.defineProperties(yr,{class:{value:yr.class_},function:{value:yr.function_},null:{value:yr.null_}});f0.default=yr;h0.exports=yr;h0.exports.default=yr});var dk=oe((sje,uk)=>{\"use strict\";uk.exports=function(t,e){if(t.timeoutTimer)return t;var n=isNaN(e)?e:{socket:e,connect:e},i=t._headers?\" to \"+t._headers.host:\"\";n.connect!==void 0&&(t.timeoutTimer=setTimeout(s(function(){t.abort();var l=new Error(\"Connection timed out on request\"+i);l.code=\"ETIMEDOUT\",t.emit(\"error\",l)},\"timeoutHandler\"),n.connect)),t.on(\"socket\",s(function(l){if(!(l.connecting||l._connecting)){r();return}l.once(\"connect\",r)},\"assign\"));function a(){t.timeoutTimer&&(clearTimeout(t.timeoutTimer),t.timeoutTimer=null)}s(a,\"clear\");function r(){a(),n.socket!==void 0&&t.setTimeout(n.socket,s(function(){t.abort();var l=new Error(\"Socket timed out on request\"+i);l.code=\"ESOCKETTIMEDOUT\",t.emit(\"error\",l)},\"socketTimeoutHandler\"))}return s(r,\"connect\"),t.on(\"error\",a)}});var mk=oe((cje,pk)=>{\"use strict\";var mme=Ee(\"url\"),fme=n0();pk.exports=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(`Expected \\`url\\` to be of type \\`string\\`, got \\`${typeof t}\\` instead.`);let n=fme(t,Object.assign({https:!0},e));return mme.parse(n)}});var hk=oe((uje,fk)=>{\"use strict\";function hme(t){var e={protocol:t.protocol,hostname:t.hostname,hash:t.hash,search:t.search,pathname:t.pathname,path:`${t.pathname}${t.search}`,href:t.href};return t.port!==\"\"&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username}:${t.password}`),e}s(hme,\"urlToOptions\");fk.exports=hme});var _k=oe((pje,gk)=>{\"use strict\";gk.exports=function(t){for(var e={},n=Object.keys(Object(t)),i=0;i<n.length;i++)e[n[i].toLowerCase()]=t[n[i]];return e}});var vk=oe((mje,xk)=>{\"use strict\";var gme=Ee(\"stream\").PassThrough,_me=Ee(\"zlib\"),xme=Em();xk.exports=t=>{if([\"gzip\",\"deflate\"].indexOf(t.headers[\"content-encoding\"])===-1)return t;let e=_me.createUnzip(),n=new gme;return xme(t,n),e.on(\"error\",i=>{if(i.code===\"Z_BUF_ERROR\"){n.end();return}n.emit(\"error\",i)}),t.pipe(e).pipe(n),n}});var yk=oe((fje,bk)=>{\"use strict\";var vme=[\"ETIMEDOUT\",\"ECONNRESET\",\"EADDRINUSE\",\"ESOCKETTIMEDOUT\",\"ECONNREFUSED\",\"EPIPE\",\"EHOSTUNREACH\",\"EAI_AGAIN\"],bme=[\"ENOTFOUND\",\"ENETUNREACH\",\"UNABLE_TO_GET_ISSUER_CERT\",\"UNABLE_TO_GET_CRL\",\"UNABLE_TO_DECRYPT_CERT_SIGNATURE\",\"UNABLE_TO_DECRYPT_CRL_SIGNATURE\",\"UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY\",\"CERT_SIGNATURE_FAILURE\",\"CRL_SIGNATURE_FAILURE\",\"CERT_NOT_YET_VALID\",\"CERT_HAS_EXPIRED\",\"CRL_NOT_YET_VALID\",\"CRL_HAS_EXPIRED\",\"ERROR_IN_CERT_NOT_BEFORE_FIELD\",\"ERROR_IN_CERT_NOT_AFTER_FIELD\",\"ERROR_IN_CRL_LAST_UPDATE_FIELD\",\"ERROR_IN_CRL_NEXT_UPDATE_FIELD\",\"OUT_OF_MEM\",\"DEPTH_ZERO_SELF_SIGNED_CERT\",\"SELF_SIGNED_CERT_IN_CHAIN\",\"UNABLE_TO_GET_ISSUER_CERT_LOCALLY\",\"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\"CERT_CHAIN_TOO_LONG\",\"CERT_REVOKED\",\"INVALID_CA\",\"PATH_LENGTH_EXCEEDED\",\"INVALID_PURPOSE\",\"CERT_UNTRUSTED\",\"CERT_REJECTED\"];bk.exports=function(t){return!t||!t.code||vme.indexOf(t.code)!==-1?!0:bme.indexOf(t.code)===-1}});var Ek=oe((hje,wk)=>{\"use strict\";wk.exports=typeof Symbol==\"function\"&&typeof Symbol(\"\")==\"symbol\"});var jk=oe((gje,kk)=>{\"use strict\";kk.exports=Ek()&&typeof Symbol.toStringTag==\"symbol\"});var Tk=oe((_je,Ak)=>{\"use strict\";Ak.exports=s(function(e){return typeof e==\"object\"&&e!==null},\"isObject\")});var Ok=oe((vje,Sk)=>{\"use strict\";var yme=jk(),Ck=Tk(),wme=Object.prototype.toString,Eme=\"[object URL]\",kme=\"hash\",jme=\"host\",Ame=\"hostname\",Tme=\"href\",Cme=\"password\",Sme=\"pathname\",Ome=\"port\",Ime=\"protocol\",Dme=\"search\",Fme=\"username\",_0=s((t,e)=>Ck(t)?!yme&&wme.call(t)===Eme?!0:!(!(Tme in t)||!(Ime in t)||!(Fme in t)||!(Cme in t)||!(Ame in t)||!(Ome in t)||!(jme in t)||!(Sme in t)||!(Dme in t)||!(kme in t)||e!==!0&&!Ck(t.searchParams)):!1,\"isURL\");_0.lenient=t=>_0(t,!0);Sk.exports=_0});var v0=oe((yje,x0)=>{\"use strict\";var Bu=class extends Error{constructor(){super(\"Promise was canceled\"),this.name=\"CancelError\"}get isCanceled(){return!0}};s(Bu,\"CancelError\");var Fs=class{static fn(e){return function(){let n=[].slice.apply(arguments);return new Fs((i,a,r)=>{n.push(r),e.apply(null,n).then(i,a)})}}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._promise=new Promise((n,i)=>(this._reject=i,e(a=>{this._isPending=!1,n(a)},a=>{this._isPending=!1,i(a)},a=>{this._cancelHandlers.push(a)})))}then(e,n){return this._promise.then(e,n)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let e of this._cancelHandlers)e()}catch(e){this._reject(e)}this._isCanceled=!0,this._reject(new Bu)}}get isCanceled(){return this._isCanceled}};s(Fs,\"PCancelable\");Object.setPrototypeOf(Fs.prototype,Promise.prototype);x0.exports=Fs;x0.exports.CancelError=Bu});var Dk=oe((Eje,Ik)=>{\"use strict\";Ik.exports=(t,e)=>(e=e||(()=>{}),t.then(n=>new Promise(i=>{i(e())}).then(()=>n),n=>new Promise(i=>{i(e())}).then(()=>{throw n})))});var y0=oe((kje,b0)=>{\"use strict\";var Nme=Dk(),Pu=class extends Error{constructor(e){super(e),this.name=\"TimeoutError\"}};s(Pu,\"TimeoutError\");b0.exports=(t,e,n)=>new Promise((i,a)=>{if(typeof e!=\"number\"||e<0)throw new TypeError(\"Expected `ms` to be a positive number\");let r=setTimeout(()=>{if(typeof n==\"function\"){try{i(n())}catch(c){a(c)}return}let o=typeof n==\"string\"?n:`Promise timed out after ${e} milliseconds`,l=n instanceof Error?n:new Pu(o);typeof t.cancel==\"function\"&&t.cancel(),a(l)},e);Nme(t.then(i,a),()=>{clearTimeout(r)})});b0.exports.TimeoutError=Pu});var Rk=oe((Aje,Nk)=>{\"use strict\";var Fk=s((t,e)=>function(){let n=e.promiseModule,i=new Array(arguments.length);for(let a=0;a<arguments.length;a++)i[a]=arguments[a];return new n((a,r)=>{e.errorFirst?i.push(function(o,l){if(e.multiArgs){let c=new Array(arguments.length-1);for(let d=1;d<arguments.length;d++)c[d-1]=arguments[d];o?(c.unshift(o),r(c)):a(c)}else o?r(o):a(l)}):i.push(function(o){if(e.multiArgs){let l=new Array(arguments.length-1);for(let c=0;c<arguments.length;c++)l[c]=arguments[c];a(l)}else a(o)}),t.apply(this,i)})},\"processFn\");Nk.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=s(a=>{let r=s(o=>typeof o==\"string\"?a===o:o.test(a),\"match\");return e.include?e.include.some(r):!e.exclude.some(r)},\"filter\"),i;typeof t==\"function\"?i=s(function(){return e.excludeMain?t.apply(this,arguments):Fk(t,e).apply(this,arguments)},\"ret\"):i=Object.create(Object.getPrototypeOf(t));for(let a in t){let r=t[a];i[a]=typeof r==\"function\"&&n(a)?Fk(r,e):r}return i}});var Mk=oe((Cje,Rme)=>{Rme.exports={name:\"got\",version:\"8.3.2\",description:\"Simplified HTTP requests\",license:\"MIT\",repository:\"sindresorhus/got\",maintainers:[{name:\"Sindre Sorhus\",email:\"sindresorhus@gmail.com\",url:\"sindresorhus.com\"},{name:\"Vsevolod Strukchinsky\",email:\"floatdrop@gmail.com\",url:\"github.com/floatdrop\"},{name:\"Alexander Tesfamichael\",email:\"alex.tesfamichael@gmail.com\",url:\"alextes.me\"}],engines:{node:\">=4\"},scripts:{test:\"xo && nyc ava\",coveralls:\"nyc report --reporter=text-lcov | coveralls\"},files:[\"index.js\",\"errors.js\"],keywords:[\"http\",\"https\",\"get\",\"got\",\"url\",\"uri\",\"request\",\"util\",\"utility\",\"simple\",\"curl\",\"wget\",\"fetch\",\"net\",\"network\",\"electron\"],dependencies:{\"@sindresorhus/is\":\"^0.7.0\",\"cacheable-request\":\"^2.1.1\",\"decompress-response\":\"^3.3.0\",duplexer3:\"^0.1.4\",\"get-stream\":\"^3.0.0\",\"into-stream\":\"^3.1.0\",\"is-retry-allowed\":\"^1.1.0\",isurl:\"^1.0.0-alpha5\",\"lowercase-keys\":\"^1.0.0\",\"mimic-response\":\"^1.0.0\",\"p-cancelable\":\"^0.4.0\",\"p-timeout\":\"^2.0.1\",pify:\"^3.0.0\",\"safe-buffer\":\"^5.1.1\",\"timed-out\":\"^4.0.1\",\"url-parse-lax\":\"^3.0.0\",\"url-to-options\":\"^1.0.1\"},devDependencies:{ava:\"^0.25.0\",coveralls:\"^3.0.0\",\"form-data\":\"^2.1.1\",\"get-port\":\"^3.0.0\",nyc:\"^11.0.2\",\"p-event\":\"^1.3.0\",pem:\"^1.4.4\",proxyquire:\"^1.8.0\",sinon:\"^4.0.0\",\"slow-stream\":\"0.0.4\",tempfile:\"^2.0.0\",tempy:\"^0.2.1\",\"universal-url\":\"1.0.0-alpha\",xo:\"^0.20.0\"},ava:{concurrency:4},browser:{\"decompress-response\":!1,electron:!1}}});var Bk=oe((Sje,wr)=>{\"use strict\";var Mme=Ee(\"url\"),w0=Ee(\"http\"),Bme=v0(),Pme=g0(),Va=class extends Error{constructor(e,n,i){super(e),Error.captureStackTrace(this,this.constructor),this.name=\"GotError\",Pme.undefined(n.code)||(this.code=n.code),Object.assign(this,{host:i.host,hostname:i.hostname,method:i.method,path:i.path,protocol:i.protocol,url:i.href})}};s(Va,\"GotError\");wr.exports.GotError=Va;wr.exports.CacheError=class extends Va{constructor(t,e){super(t.message,t,e),this.name=\"CacheError\"}};wr.exports.RequestError=class extends Va{constructor(t,e){super(t.message,t,e),this.name=\"RequestError\"}};wr.exports.ReadError=class extends Va{constructor(t,e){super(t.message,t,e),this.name=\"ReadError\"}};wr.exports.ParseError=class extends Va{constructor(t,e,n,i){super(`${t.message} in \"${Mme.format(n)}\": \n${i.slice(0,77)}...`,t,n),this.name=\"ParseError\",this.statusCode=e,this.statusMessage=w0.STATUS_CODES[this.statusCode]}};wr.exports.HTTPError=class extends Va{constructor(t,e,n,i){e?e=e.replace(/\\r?\\n/g,\" \").trim():e=w0.STATUS_CODES[t],super(`Response code ${t} (${e})`,{},i),this.name=\"HTTPError\",this.statusCode=t,this.statusMessage=e,this.headers=n}};wr.exports.MaxRedirectsError=class extends Va{constructor(t,e,n){super(\"Redirected 10 times. Aborting.\",{},n),this.name=\"MaxRedirectsError\",this.statusCode=t,this.statusMessage=w0.STATUS_CODES[this.statusCode],this.redirectUrls=e}};wr.exports.UnsupportedProtocolError=class extends Va{constructor(t){super(`Unsupported protocol \"${t.protocol}\"`,{},t),this.name=\"UnsupportedProtocolError\"}};wr.exports.CancelError=Bme.CancelError});var zk=oe((Pje,Vk)=>{var Pk=Ee(\"fs\"),E0=Ee(\"path\"),Lk=E0.join(__dirname,\"path.txt\");function Lme(){let t;if(Pk.existsSync(Lk)&&(t=Pk.readFileSync(Lk,\"utf-8\")),process.env.ELECTRON_OVERRIDE_DIST_PATH)return E0.join(process.env.ELECTRON_OVERRIDE_DIST_PATH,t||\"electron\");if(t)return E0.join(__dirname,\"dist\",t);throw new Error(\"Electron failed to install correctly, please delete node_modules/electron and try installing again\")}s(Lme,\"getElectronPath\");Vk.exports=Lme()});var t5=oe((Vje,e5)=>{\"use strict\";var Xk=Ee(\"events\"),Vme=Ee(\"http\"),zme=Ee(\"https\"),Uk=Ee(\"stream\").PassThrough,Ume=Ee(\"stream\").Transform,Lu=Ee(\"url\"),qk=Ee(\"fs\"),Hk=Ee(\"querystring\"),Jk=XE(),qme=ZE(),Hme=lk(),Dt=g0(),Gk=s0(),Jme=dk(),Gme=mk(),Wme=hk(),Kme=_k(),Wk=vk(),Yme=Em(),Xme=yk(),Zme=Ok(),Qme=v0(),$me=y0(),Kk=Rk(),Tm=Cp().Buffer,Yk=Mk(),efe=Bk(),tfe=new Set([300,301,302,303,304,305,307,308]),nfe=new Set([300,303,307,308]),k0=s(t=>Dt.nodeStream(t)&&Dt.function(t.getBoundary),\"isFormData\"),ife=s(t=>{let e=t.body;return t.headers[\"content-length\"]?Number(t.headers[\"content-length\"]):!e&&!t.stream?0:Dt.string(e)?Tm.byteLength(e):k0(e)?Kk(e.getLength.bind(e))():e instanceof qk.ReadStream?Kk(qk.stat)(e.path).then(n=>n.size):Dt.nodeStream(e)&&Dt.buffer(e._buffer)?e._buffer.length:null},\"getBodySize\");function Zk(t){t=t||{};let e=new Xk,n=t.href||Lu.resolve(Lu.format(t),t.path),i=[],a=Dt.object(t.agent)?t.agent:null,r=0,o,l,c=0,d=s(u=>{if(u.protocol!==\"http:\"&&u.protocol!==\"https:\"){e.emit(\"error\",new Hn.UnsupportedProtocolError(u));return}let p=u.protocol===\"https:\"?zme:Vme;if(a){let x=u.protocol===\"https:\"?\"https\":\"http\";u.agent=a[x]||u.agent}if(u.useElectronNet&&process.versions.electron){let x=zk();p=x.net||x.remote.net}let m,g=new Jk(p.request,u.cache)(u,x=>{clearInterval(m),e.emit(\"uploadProgress\",{percent:1,transferred:c,total:l});let _=x.statusCode;x.url=o||n,x.requestUrl=n;let h=u.followRedirect&&\"location\"in x.headers,v=h&&tfe.has(_);if(h&&nfe.has(_)||v&&(u.method===\"GET\"||u.method===\"HEAD\")){if(x.resume(),_===303&&(u.method=\"GET\"),i.length>=10){e.emit(\"error\",new Hn.MaxRedirectsError(_,i,u),null,x);return}let y=Tm.from(x.headers.location,\"binary\").toString();o=Lu.resolve(Lu.format(u),y),i.push(o);let w=Object.assign({},u,Lu.parse(o));e.emit(\"redirect\",x,w),d(w);return}setImmediate(()=>{try{afe(x,u,e,i)}catch(y){e.emit(\"error\",y)}})});g.on(\"error\",x=>{x instanceof Jk.RequestError?e.emit(\"error\",new Hn.RequestError(x,u)):e.emit(\"error\",new Hn.CacheError(x,u))}),g.once(\"request\",x=>{let _=!1;x.once(\"abort\",h=>{_=!0}),x.once(\"error\",h=>{if(clearInterval(m),_)return;let v=u.retries(++r,h);if(v){setTimeout(d,v,u);return}e.emit(\"error\",new Hn.RequestError(h,u))}),e.once(\"request\",h=>{e.emit(\"uploadProgress\",{percent:0,transferred:0,total:l});let v=h.connection;if(v){let b=v.connecting===void 0?v._connecting:v.connecting,y=s(()=>{m=setInterval(()=>{if(v.destroyed){clearInterval(m);return}let S=c,F=h._header?Tm.byteLength(h._header):0;c=v.bytesWritten-F,l&&c>l&&(c=l),!(c===S||c===l)&&e.emit(\"uploadProgress\",{percent:l?c/l:0,transferred:c,total:l})},150)},\"onSocketConnect\");b?v.once(\"connect\",y):y()}}),u.gotTimeout&&(clearInterval(m),Jme(x,u.gotTimeout)),setImmediate(()=>{e.emit(\"request\",x)})})},\"get\");return setImmediate(()=>{Promise.resolve(ife(t)).then(u=>{l=u,Dt.undefined(t.headers[\"content-length\"])&&Dt.undefined(t.headers[\"transfer-encoding\"])&&k0(t.body)&&(t.headers[\"content-length\"]=u),d(t)}).catch(u=>{e.emit(\"error\",u)})}),e}s(Zk,\"requestAsEventEmitter\");function afe(t,e,n,i){let a=Number(t.headers[\"content-length\"])||null,r=0,o=new Ume({transform(c,d,u){r+=c.length;let p=a?r/a:0;p<1&&n.emit(\"downloadProgress\",{percent:p,transferred:r,total:a}),u(null,c)},flush(c){n.emit(\"downloadProgress\",{percent:1,transferred:r,total:a}),c()}});Yme(t,o),o.redirectUrls=i;let l=e.decompress===!0&&Dt.function(Wk)&&e.method!==\"HEAD\"?Wk(o):o;!e.decompress&&[\"gzip\",\"deflate\"].indexOf(t.headers[\"content-encoding\"])!==-1&&(e.encoding=null),n.emit(\"response\",l),n.emit(\"downloadProgress\",{percent:0,transferred:0,total:a}),t.pipe(o)}s(afe,\"getResponse\");function rfe(t){let e=s(r=>t.gotTimeout&&t.gotTimeout.request?$me(r,t.gotTimeout.request,new Hn.RequestError({message:\"Request timed out\",code:\"ETIMEDOUT\"},t)):r,\"timeoutFn\"),n=new Xk,i=new Qme((r,o,l)=>{let c=Zk(t),d=!1;l(()=>{d=!0}),c.on(\"request\",u=>{if(d&&u.abort(),l(()=>{u.abort()}),Dt.nodeStream(t.body)){t.body.pipe(u),t.body=void 0;return}u.end(t.body)}),c.on(\"response\",u=>{(Dt.null(t.encoding)?Gk.buffer(u):Gk(u,t)).catch(m=>o(new Hn.ReadError(m,t))).then(m=>{let f=u.statusCode,g=t.followRedirect?299:399;if(u.body=m,t.json&&u.body)try{u.body=JSON.parse(u.body)}catch(x){if(f>=200&&f<300)throw new Hn.ParseError(x,f,t,m)}if(t.throwHttpErrors&&f!==304&&(f<200||f>g))throw new Hn.HTTPError(f,u.statusMessage,u.headers,t);r(u)}).catch(m=>{Object.defineProperty(m,\"response\",{value:u}),o(m)})}),c.once(\"error\",o),c.on(\"redirect\",n.emit.bind(n,\"redirect\")),c.on(\"uploadProgress\",n.emit.bind(n,\"uploadProgress\")),c.on(\"downloadProgress\",n.emit.bind(n,\"downloadProgress\"))});Object.defineProperty(i,\"canceled\",{get(){return i.isCanceled}});let a=e(i);return a.cancel=i.cancel.bind(i),a.on=(r,o)=>(n.on(r,o),a),a}s(rfe,\"asPromise\");function Qk(t){t.stream=!0;let e=new Uk,n=new Uk,i=qme(e,n),a;if(t.gotTimeout&&t.gotTimeout.request&&(a=setTimeout(()=>{i.emit(\"error\",new Hn.RequestError({message:\"Request timed out\",code:\"ETIMEDOUT\"},t))},t.gotTimeout.request)),t.json)throw new Error(\"Got can not be used as a stream when the `json` option is used\");t.body&&(i.write=()=>{throw new Error(\"Got's stream is not writable when the `body` option is used\")});let r=Zk(t);return r.on(\"request\",o=>{if(i.emit(\"request\",o),Dt.nodeStream(t.body)){t.body.pipe(o);return}if(t.body){o.end(t.body);return}if(t.method===\"POST\"||t.method===\"PUT\"||t.method===\"PATCH\"){e.pipe(o);return}o.end()}),r.on(\"response\",o=>{clearTimeout(a);let l=o.statusCode;if(o.on(\"error\",c=>{i.emit(\"error\",new Hn.ReadError(c,t))}),o.pipe(n),t.throwHttpErrors&&l!==304&&(l<200||l>299)){i.emit(\"error\",new Hn.HTTPError(l,o.statusMessage,o.headers,t),null,o);return}i.emit(\"response\",o)}),r.on(\"error\",i.emit.bind(i,\"error\")),r.on(\"redirect\",i.emit.bind(i,\"redirect\")),r.on(\"uploadProgress\",i.emit.bind(i,\"uploadProgress\")),r.on(\"downloadProgress\",i.emit.bind(i,\"downloadProgress\")),i}s(Qk,\"asStream\");function $k(t,e){if(!Dt.string(t)&&!Dt.object(t))throw new TypeError(`Parameter \\`url\\` must be a string or object, not ${Dt(t)}`);if(Dt.string(t)){t=t.replace(/^unix:/,\"http://$&\");try{decodeURI(t)}catch{throw new Error(\"Parameter `url` must contain valid UTF-8 character sequences\")}if(t=Gme(t),t.auth)throw new Error(\"Basic authentication must be done with the `auth` option\")}else Zme.lenient(t)&&(t=Wme(t));e=Object.assign({path:\"\",retries:2,cache:!1,decompress:!0,useElectronNet:!1,throwHttpErrors:!0},t,{protocol:t.protocol||\"http:\"},e);let n=Kme(e.headers);for(let r of Object.keys(n))Dt.nullOrUndefined(n[r])&&delete n[r];e.headers=Object.assign({\"user-agent\":`${Yk.name}/${Yk.version} (https://github.com/sindresorhus/got)`},n),e.decompress&&Dt.undefined(e.headers[\"accept-encoding\"])&&(e.headers[\"accept-encoding\"]=\"gzip, deflate\");let i=e.query;i&&(Dt.string(i)||(e.query=Hk.stringify(i)),e.path=`${e.path.split(\"?\")[0]}?${e.query}`,delete e.query),e.json&&Dt.undefined(e.headers.accept)&&(e.headers.accept=\"application/json\");let a=e.body;if(Dt.nullOrUndefined(a))e.method=(e.method||\"GET\").toUpperCase();else{let r=e.headers;if(!Dt.nodeStream(a)&&!Dt.string(a)&&!Dt.buffer(a)&&!(e.form||e.json))throw new TypeError(\"The `body` option must be a stream.Readable, string, Buffer or plain Object\");let o=Dt.plainObject(a)||Dt.array(a);if((e.form||e.json)&&!o)throw new TypeError(\"The `body` option must be a plain Object or Array when the `form` or `json` option is used\");if(k0(a)?r[\"content-type\"]=r[\"content-type\"]||`multipart/form-data; boundary=${a.getBoundary()}`:e.form&&o?(r[\"content-type\"]=r[\"content-type\"]||\"application/x-www-form-urlencoded\",e.body=Hk.stringify(a)):e.json&&o&&(r[\"content-type\"]=r[\"content-type\"]||\"application/json\",e.body=JSON.stringify(a)),Dt.undefined(r[\"content-length\"])&&Dt.undefined(r[\"transfer-encoding\"])&&!Dt.nodeStream(a)){let l=Dt.string(e.body)?Tm.byteLength(e.body):e.body.length;r[\"content-length\"]=l}Dt.buffer(a)&&(e.body=Hme(a),e.body._buffer=a),e.method=(e.method||\"POST\").toUpperCase()}if(e.hostname===\"unix\"){let r=/(.+?):(.+)/.exec(e.path);r&&(e.socketPath=r[1],e.path=r[2],e.host=null)}if(!Dt.function(e.retries)){let r=e.retries;e.retries=(o,l)=>{if(o>r||!Xme(l))return 0;let c=Math.random()*100;return(1<<o)*1e3+c}}return Dt.undefined(e.followRedirect)&&(e.followRedirect=!0),e.timeout&&(Dt.number(e.timeout)?e.gotTimeout={request:e.timeout}:e.gotTimeout=e.timeout,delete e.timeout),e}s($k,\"normalizeArguments\");function Hn(t,e){try{let n=$k(t,e);return n.stream?Qk(n):rfe(n)}catch(n){return Promise.reject(n)}}s(Hn,\"got\");Hn.stream=(t,e)=>Qk($k(t,e));var ofe=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];for(let t of ofe)Hn[t]=(e,n)=>Hn(e,Object.assign({},n,{method:t})),Hn.stream[t]=(e,n)=>Hn.stream(e,Object.assign({},n,{method:t}));Object.assign(Hn,efe);e5.exports=Hn});var a5=oe((Uje,i5)=>{\"use strict\";var n5=s((t,e)=>function(...n){let i=e.promiseModule;return new i((a,r)=>{e.multiArgs?n.push((...o)=>{e.errorFirst?o[0]?r(o):(o.shift(),a(o)):a(o)}):e.errorFirst?n.push((o,l)=>{o?r(o):a(l)}):n.push(a),t.apply(this,n)})},\"processFn\");i5.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=typeof t;if(!(t!==null&&(n===\"object\"||n===\"function\")))throw new TypeError(`Expected \\`input\\` to be a \\`Function\\` or \\`Object\\`, got \\`${t===null?\"null\":n}\\``);let i=s(r=>{let o=s(l=>typeof l==\"string\"?r===l:l.test(r),\"match\");return e.include?e.include.some(o):!e.exclude.some(o)},\"filter\"),a;n===\"function\"?a=s(function(...r){return e.excludeMain?t(...r):n5(t,e).apply(this,r)},\"ret\"):a=Object.create(Object.getPrototypeOf(t));for(let r in t){let o=t[r];a[r]=typeof o==\"function\"&&i(r)?n5(o,e):o}return a}});var y5=oe((pt,b5)=>{pt=b5.exports=Ot;var Wt;typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?Wt=s(function(){var t=Array.prototype.slice.call(arguments,0);t.unshift(\"SEMVER\"),console.log.apply(console,t)},\"debug\"):Wt=s(function(){},\"debug\");pt.SEMVER_SPEC_VERSION=\"2.0.0\";var Vu=256,Cm=Number.MAX_SAFE_INTEGER||9007199254740991,j0=16,sfe=Vu-6,zu=pt.re=[],un=pt.safeRe=[],be=pt.src=[],Ct=0,O0=\"[a-zA-Z0-9-]\",A0=[[\"\\\\s\",1],[\"\\\\d\",Vu],[O0,sfe]];function Nm(t){for(var e=0;e<A0.length;e++){var n=A0[e][0],i=A0[e][1];t=t.split(n+\"*\").join(n+\"{0,\"+i+\"}\").split(n+\"+\").join(n+\"{1,\"+i+\"}\")}return t}s(Nm,\"makeSafeRe\");var Yl=Ct++;be[Yl]=\"0|[1-9]\\\\d*\";var Xl=Ct++;be[Xl]=\"\\\\d+\";var I0=Ct++;be[I0]=\"\\\\d*[a-zA-Z-]\"+O0+\"*\";var o5=Ct++;be[o5]=\"(\"+be[Yl]+\")\\\\.(\"+be[Yl]+\")\\\\.(\"+be[Yl]+\")\";var s5=Ct++;be[s5]=\"(\"+be[Xl]+\")\\\\.(\"+be[Xl]+\")\\\\.(\"+be[Xl]+\")\";var T0=Ct++;be[T0]=\"(?:\"+be[Yl]+\"|\"+be[I0]+\")\";var C0=Ct++;be[C0]=\"(?:\"+be[Xl]+\"|\"+be[I0]+\")\";var D0=Ct++;be[D0]=\"(?:-(\"+be[T0]+\"(?:\\\\.\"+be[T0]+\")*))\";var F0=Ct++;be[F0]=\"(?:-?(\"+be[C0]+\"(?:\\\\.\"+be[C0]+\")*))\";var S0=Ct++;be[S0]=O0+\"+\";var qu=Ct++;be[qu]=\"(?:\\\\+(\"+be[S0]+\"(?:\\\\.\"+be[S0]+\")*))\";var N0=Ct++,l5=\"v?\"+be[o5]+be[D0]+\"?\"+be[qu]+\"?\";be[N0]=\"^\"+l5+\"$\";var R0=\"[v=\\\\s]*\"+be[s5]+be[F0]+\"?\"+be[qu]+\"?\",M0=Ct++;be[M0]=\"^\"+R0+\"$\";var tc=Ct++;be[tc]=\"((?:<|>)?=?)\";var Sm=Ct++;be[Sm]=be[Xl]+\"|x|X|\\\\*\";var Om=Ct++;be[Om]=be[Yl]+\"|x|X|\\\\*\";var Ns=Ct++;be[Ns]=\"[v=\\\\s]*(\"+be[Om]+\")(?:\\\\.(\"+be[Om]+\")(?:\\\\.(\"+be[Om]+\")(?:\"+be[D0]+\")?\"+be[qu]+\"?)?)?\";var Ql=Ct++;be[Ql]=\"[v=\\\\s]*(\"+be[Sm]+\")(?:\\\\.(\"+be[Sm]+\")(?:\\\\.(\"+be[Sm]+\")(?:\"+be[F0]+\")?\"+be[qu]+\"?)?)?\";var c5=Ct++;be[c5]=\"^\"+be[tc]+\"\\\\s*\"+be[Ns]+\"$\";var u5=Ct++;be[u5]=\"^\"+be[tc]+\"\\\\s*\"+be[Ql]+\"$\";var d5=Ct++;be[d5]=\"(?:^|[^\\\\d])(\\\\d{1,\"+j0+\"})(?:\\\\.(\\\\d{1,\"+j0+\"}))?(?:\\\\.(\\\\d{1,\"+j0+\"}))?(?:$|[^\\\\d])\";var Rm=Ct++;be[Rm]=\"(?:~>?)\";var $l=Ct++;be[$l]=\"(\\\\s*)\"+be[Rm]+\"\\\\s+\";zu[$l]=new RegExp(be[$l],\"g\");un[$l]=new RegExp(Nm(be[$l]),\"g\");var lfe=\"$1~\",p5=Ct++;be[p5]=\"^\"+be[Rm]+be[Ns]+\"$\";var m5=Ct++;be[m5]=\"^\"+be[Rm]+be[Ql]+\"$\";var Mm=Ct++;be[Mm]=\"(?:\\\\^)\";var ec=Ct++;be[ec]=\"(\\\\s*)\"+be[Mm]+\"\\\\s+\";zu[ec]=new RegExp(be[ec],\"g\");un[ec]=new RegExp(Nm(be[ec]),\"g\");var cfe=\"$1^\",f5=Ct++;be[f5]=\"^\"+be[Mm]+be[Ns]+\"$\";var h5=Ct++;be[h5]=\"^\"+be[Mm]+be[Ql]+\"$\";var B0=Ct++;be[B0]=\"^\"+be[tc]+\"\\\\s*(\"+R0+\")$|^$\";var P0=Ct++;be[P0]=\"^\"+be[tc]+\"\\\\s*(\"+l5+\")$|^$\";var Rs=Ct++;be[Rs]=\"(\\\\s*)\"+be[tc]+\"\\\\s*(\"+R0+\"|\"+be[Ns]+\")\";zu[Rs]=new RegExp(be[Rs],\"g\");un[Rs]=new RegExp(Nm(be[Rs]),\"g\");var ufe=\"$1$2$3\",g5=Ct++;be[g5]=\"^\\\\s*(\"+be[Ns]+\")\\\\s+-\\\\s+(\"+be[Ns]+\")\\\\s*$\";var _5=Ct++;be[_5]=\"^\\\\s*(\"+be[Ql]+\")\\\\s+-\\\\s+(\"+be[Ql]+\")\\\\s*$\";var x5=Ct++;be[x5]=\"(<|>)?=?\\\\s*\\\\*\";for(Er=0;Er<Ct;Er++)Wt(Er,be[Er]),zu[Er]||(zu[Er]=new RegExp(be[Er]),un[Er]=new RegExp(Nm(be[Er])));var Er;pt.parse=Ms;function Ms(t,e){if((!e||typeof e!=\"object\")&&(e={loose:!!e,includePrerelease:!1}),t instanceof Ot)return t;if(typeof t!=\"string\"||t.length>Vu)return null;var n=e.loose?un[M0]:un[N0];if(!n.test(t))return null;try{return new Ot(t,e)}catch{return null}}s(Ms,\"parse\");pt.valid=dfe;function dfe(t,e){var n=Ms(t,e);return n?n.version:null}s(dfe,\"valid\");pt.clean=pfe;function pfe(t,e){var n=Ms(t.trim().replace(/^[=v]+/,\"\"),e);return n?n.version:null}s(pfe,\"clean\");pt.SemVer=Ot;function Ot(t,e){if((!e||typeof e!=\"object\")&&(e={loose:!!e,includePrerelease:!1}),t instanceof Ot){if(t.loose===e.loose)return t;t=t.version}else if(typeof t!=\"string\")throw new TypeError(\"Invalid Version: \"+t);if(t.length>Vu)throw new TypeError(\"version is longer than \"+Vu+\" characters\");if(!(this instanceof Ot))return new Ot(t,e);Wt(\"SemVer\",t,e),this.options=e,this.loose=!!e.loose;var n=t.trim().match(e.loose?un[M0]:un[N0]);if(!n)throw new TypeError(\"Invalid Version: \"+t);if(this.raw=t,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>Cm||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>Cm||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>Cm||this.patch<0)throw new TypeError(\"Invalid patch version\");n[4]?this.prerelease=n[4].split(\".\").map(function(i){if(/^[0-9]+$/.test(i)){var a=+i;if(a>=0&&a<Cm)return a}return i}):this.prerelease=[],this.build=n[5]?n[5].split(\".\"):[],this.format()}s(Ot,\"SemVer\");Ot.prototype.format=function(){return this.version=this.major+\".\"+this.minor+\".\"+this.patch,this.prerelease.length&&(this.version+=\"-\"+this.prerelease.join(\".\")),this.version};Ot.prototype.toString=function(){return this.version};Ot.prototype.compare=function(t){return Wt(\"SemVer.compare\",this.version,this.options,t),t instanceof Ot||(t=new Ot(t,this.options)),this.compareMain(t)||this.comparePre(t)};Ot.prototype.compareMain=function(t){return t instanceof Ot||(t=new Ot(t,this.options)),Zl(this.major,t.major)||Zl(this.minor,t.minor)||Zl(this.patch,t.patch)};Ot.prototype.comparePre=function(t){if(t instanceof Ot||(t=new Ot(t,this.options)),this.prerelease.length&&!t.prerelease.length)return-1;if(!this.prerelease.length&&t.prerelease.length)return 1;if(!this.prerelease.length&&!t.prerelease.length)return 0;var e=0;do{var n=this.prerelease[e],i=t.prerelease[e];if(Wt(\"prerelease compare\",e,n,i),n===void 0&&i===void 0)return 0;if(i===void 0)return 1;if(n===void 0)return-1;if(n===i)continue;return Zl(n,i)}while(++e)};Ot.prototype.inc=function(t,e){switch(t){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",e);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",e);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",e),this.inc(\"pre\",e);break;case\"prerelease\":this.prerelease.length===0&&this.inc(\"patch\",e),this.inc(\"pre\",e);break;case\"major\":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case\"pre\":if(this.prerelease.length===0)this.prerelease=[0];else{for(var n=this.prerelease.length;--n>=0;)typeof this.prerelease[n]==\"number\"&&(this.prerelease[n]++,n=-2);n===-1&&this.prerelease.push(0)}e&&(this.prerelease[0]===e?isNaN(this.prerelease[1])&&(this.prerelease=[e,0]):this.prerelease=[e,0]);break;default:throw new Error(\"invalid increment argument: \"+t)}return this.format(),this.raw=this.version,this};pt.inc=mfe;function mfe(t,e,n,i){typeof n==\"string\"&&(i=n,n=void 0);try{return new Ot(t,n).inc(e,i).version}catch{return null}}s(mfe,\"inc\");pt.diff=ffe;function ffe(t,e){if(L0(t,e))return null;var n=Ms(t),i=Ms(e),a=\"\";if(n.prerelease.length||i.prerelease.length){a=\"pre\";var r=\"prerelease\"}for(var o in n)if((o===\"major\"||o===\"minor\"||o===\"patch\")&&n[o]!==i[o])return a+o;return r}s(ffe,\"diff\");pt.compareIdentifiers=Zl;var r5=/^[0-9]+$/;function Zl(t,e){var n=r5.test(t),i=r5.test(e);return n&&i&&(t=+t,e=+e),t===e?0:n&&!i?-1:i&&!n?1:t<e?-1:1}s(Zl,\"compareIdentifiers\");pt.rcompareIdentifiers=hfe;function hfe(t,e){return Zl(e,t)}s(hfe,\"rcompareIdentifiers\");pt.major=gfe;function gfe(t,e){return new Ot(t,e).major}s(gfe,\"major\");pt.minor=_fe;function _fe(t,e){return new Ot(t,e).minor}s(_fe,\"minor\");pt.patch=xfe;function xfe(t,e){return new Ot(t,e).patch}s(xfe,\"patch\");pt.compare=po;function po(t,e,n){return new Ot(t,n).compare(new Ot(e,n))}s(po,\"compare\");pt.compareLoose=vfe;function vfe(t,e){return po(t,e,!0)}s(vfe,\"compareLoose\");pt.rcompare=bfe;function bfe(t,e,n){return po(e,t,n)}s(bfe,\"rcompare\");pt.sort=yfe;function yfe(t,e){return t.sort(function(n,i){return pt.compare(n,i,e)})}s(yfe,\"sort\");pt.rsort=wfe;function wfe(t,e){return t.sort(function(n,i){return pt.rcompare(n,i,e)})}s(wfe,\"rsort\");pt.gt=Uu;function Uu(t,e,n){return po(t,e,n)>0}s(Uu,\"gt\");pt.lt=Im;function Im(t,e,n){return po(t,e,n)<0}s(Im,\"lt\");pt.eq=L0;function L0(t,e,n){return po(t,e,n)===0}s(L0,\"eq\");pt.neq=v5;function v5(t,e,n){return po(t,e,n)!==0}s(v5,\"neq\");pt.gte=V0;function V0(t,e,n){return po(t,e,n)>=0}s(V0,\"gte\");pt.lte=z0;function z0(t,e,n){return po(t,e,n)<=0}s(z0,\"lte\");pt.cmp=Dm;function Dm(t,e,n,i){switch(e){case\"===\":return typeof t==\"object\"&&(t=t.version),typeof n==\"object\"&&(n=n.version),t===n;case\"!==\":return typeof t==\"object\"&&(t=t.version),typeof n==\"object\"&&(n=n.version),t!==n;case\"\":case\"=\":case\"==\":return L0(t,n,i);case\"!=\":return v5(t,n,i);case\">\":return Uu(t,n,i);case\">=\":return V0(t,n,i);case\"<\":return Im(t,n,i);case\"<=\":return z0(t,n,i);default:throw new TypeError(\"Invalid operator: \"+e)}}s(Dm,\"cmp\");pt.Comparator=ma;function ma(t,e){if((!e||typeof e!=\"object\")&&(e={loose:!!e,includePrerelease:!1}),t instanceof ma){if(t.loose===!!e.loose)return t;t=t.value}if(!(this instanceof ma))return new ma(t,e);t=t.trim().split(/\\s+/).join(\" \"),Wt(\"comparator\",t,e),this.options=e,this.loose=!!e.loose,this.parse(t),this.semver===Hu?this.value=\"\":this.value=this.operator+this.semver.version,Wt(\"comp\",this)}s(ma,\"Comparator\");var Hu={};ma.prototype.parse=function(t){var e=this.options.loose?un[B0]:un[P0],n=t.match(e);if(!n)throw new TypeError(\"Invalid comparator: \"+t);this.operator=n[1],this.operator===\"=\"&&(this.operator=\"\"),n[2]?this.semver=new Ot(n[2],this.options.loose):this.semver=Hu};ma.prototype.toString=function(){return this.value};ma.prototype.test=function(t){return Wt(\"Comparator.test\",t,this.options.loose),this.semver===Hu?!0:(typeof t==\"string\"&&(t=new Ot(t,this.options)),Dm(t,this.operator,this.semver,this.options))};ma.prototype.intersects=function(t,e){if(!(t instanceof ma))throw new TypeError(\"a Comparator is required\");(!e||typeof e!=\"object\")&&(e={loose:!!e,includePrerelease:!1});var n;if(this.operator===\"\")return n=new An(t.value,e),Fm(this.value,n,e);if(t.operator===\"\")return n=new An(this.value,e),Fm(t.semver,n,e);var i=(this.operator===\">=\"||this.operator===\">\")&&(t.operator===\">=\"||t.operator===\">\"),a=(this.operator===\"<=\"||this.operator===\"<\")&&(t.operator===\"<=\"||t.operator===\"<\"),r=this.semver.version===t.semver.version,o=(this.operator===\">=\"||this.operator===\"<=\")&&(t.operator===\">=\"||t.operator===\"<=\"),l=Dm(this.semver,\"<\",t.semver,e)&&(this.operator===\">=\"||this.operator===\">\")&&(t.operator===\"<=\"||t.operator===\"<\"),c=Dm(this.semver,\">\",t.semver,e)&&(this.operator===\"<=\"||this.operator===\"<\")&&(t.operator===\">=\"||t.operator===\">\");return i||a||r&&o||l||c};pt.Range=An;function An(t,e){if((!e||typeof e!=\"object\")&&(e={loose:!!e,includePrerelease:!1}),t instanceof An)return t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease?t:new An(t.raw,e);if(t instanceof ma)return new An(t.value,e);if(!(this instanceof An))return new An(t,e);if(this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease,this.raw=t.trim().split(/\\s+/).join(\" \"),this.set=this.raw.split(\"||\").map(function(n){return this.parseRange(n.trim())},this).filter(function(n){return n.length}),!this.set.length)throw new TypeError(\"Invalid SemVer Range: \"+this.raw);this.format()}s(An,\"Range\");An.prototype.format=function(){return this.range=this.set.map(function(t){return t.join(\" \").trim()}).join(\"||\").trim(),this.range};An.prototype.toString=function(){return this.range};An.prototype.parseRange=function(t){var e=this.options.loose,n=e?un[_5]:un[g5];t=t.replace(n,Dfe),Wt(\"hyphen replace\",t),t=t.replace(un[Rs],ufe),Wt(\"comparator trim\",t,un[Rs]),t=t.replace(un[$l],lfe),t=t.replace(un[ec],cfe);var i=e?un[B0]:un[P0],a=t.split(\" \").map(function(r){return kfe(r,this.options)},this).join(\" \").split(/\\s+/);return this.options.loose&&(a=a.filter(function(r){return!!r.match(i)})),a=a.map(function(r){return new ma(r,this.options)},this),a};An.prototype.intersects=function(t,e){if(!(t instanceof An))throw new TypeError(\"a Range is required\");return this.set.some(function(n){return n.every(function(i){return t.set.some(function(a){return a.every(function(r){return i.intersects(r,e)})})})})};pt.toComparators=Efe;function Efe(t,e){return new An(t,e).set.map(function(n){return n.map(function(i){return i.value}).join(\" \").trim().split(\" \")})}s(Efe,\"toComparators\");function kfe(t,e){return Wt(\"comp\",t,e),t=Tfe(t,e),Wt(\"caret\",t),t=jfe(t,e),Wt(\"tildes\",t),t=Sfe(t,e),Wt(\"xrange\",t),t=Ife(t,e),Wt(\"stars\",t),t}s(kfe,\"parseComparator\");function ki(t){return!t||t.toLowerCase()===\"x\"||t===\"*\"}s(ki,\"isX\");function jfe(t,e){return t.trim().split(/\\s+/).map(function(n){return Afe(n,e)}).join(\" \")}s(jfe,\"replaceTildes\");function Afe(t,e){var n=e.loose?un[m5]:un[p5];return t.replace(n,function(i,a,r,o,l){Wt(\"tilde\",t,i,a,r,o,l);var c;return ki(a)?c=\"\":ki(r)?c=\">=\"+a+\".0.0 <\"+(+a+1)+\".0.0\":ki(o)?c=\">=\"+a+\".\"+r+\".0 <\"+a+\".\"+(+r+1)+\".0\":l?(Wt(\"replaceTilde pr\",l),c=\">=\"+a+\".\"+r+\".\"+o+\"-\"+l+\" <\"+a+\".\"+(+r+1)+\".0\"):c=\">=\"+a+\".\"+r+\".\"+o+\" <\"+a+\".\"+(+r+1)+\".0\",Wt(\"tilde return\",c),c})}s(Afe,\"replaceTilde\");function Tfe(t,e){return t.trim().split(/\\s+/).map(function(n){return Cfe(n,e)}).join(\" \")}s(Tfe,\"replaceCarets\");function Cfe(t,e){Wt(\"caret\",t,e);var n=e.loose?un[h5]:un[f5];return t.replace(n,function(i,a,r,o,l){Wt(\"caret\",t,i,a,r,o,l);var c;return ki(a)?c=\"\":ki(r)?c=\">=\"+a+\".0.0 <\"+(+a+1)+\".0.0\":ki(o)?a===\"0\"?c=\">=\"+a+\".\"+r+\".0 <\"+a+\".\"+(+r+1)+\".0\":c=\">=\"+a+\".\"+r+\".0 <\"+(+a+1)+\".0.0\":l?(Wt(\"replaceCaret pr\",l),a===\"0\"?r===\"0\"?c=\">=\"+a+\".\"+r+\".\"+o+\"-\"+l+\" <\"+a+\".\"+r+\".\"+(+o+1):c=\">=\"+a+\".\"+r+\".\"+o+\"-\"+l+\" <\"+a+\".\"+(+r+1)+\".0\":c=\">=\"+a+\".\"+r+\".\"+o+\"-\"+l+\" <\"+(+a+1)+\".0.0\"):(Wt(\"no pr\"),a===\"0\"?r===\"0\"?c=\">=\"+a+\".\"+r+\".\"+o+\" <\"+a+\".\"+r+\".\"+(+o+1):c=\">=\"+a+\".\"+r+\".\"+o+\" <\"+a+\".\"+(+r+1)+\".0\":c=\">=\"+a+\".\"+r+\".\"+o+\" <\"+(+a+1)+\".0.0\"),Wt(\"caret return\",c),c})}s(Cfe,\"replaceCaret\");function Sfe(t,e){return Wt(\"replaceXRanges\",t,e),t.split(/\\s+/).map(function(n){return Ofe(n,e)}).join(\" \")}s(Sfe,\"replaceXRanges\");function Ofe(t,e){t=t.trim();var n=e.loose?un[u5]:un[c5];return t.replace(n,function(i,a,r,o,l,c){Wt(\"xRange\",t,i,a,r,o,l,c);var d=ki(r),u=d||ki(o),p=u||ki(l),m=p;return a===\"=\"&&m&&(a=\"\"),d?a===\">\"||a===\"<\"?i=\"<0.0.0\":i=\"*\":a&&m?(u&&(o=0),l=0,a===\">\"?(a=\">=\",u?(r=+r+1,o=0,l=0):(o=+o+1,l=0)):a===\"<=\"&&(a=\"<\",u?r=+r+1:o=+o+1),i=a+r+\".\"+o+\".\"+l):u?i=\">=\"+r+\".0.0 <\"+(+r+1)+\".0.0\":p&&(i=\">=\"+r+\".\"+o+\".0 <\"+r+\".\"+(+o+1)+\".0\"),Wt(\"xRange return\",i),i})}s(Ofe,\"replaceXRange\");function Ife(t,e){return Wt(\"replaceStars\",t,e),t.trim().replace(un[x5],\"\")}s(Ife,\"replaceStars\");function Dfe(t,e,n,i,a,r,o,l,c,d,u,p,m){return ki(n)?e=\"\":ki(i)?e=\">=\"+n+\".0.0\":ki(a)?e=\">=\"+n+\".\"+i+\".0\":e=\">=\"+e,ki(c)?l=\"\":ki(d)?l=\"<\"+(+c+1)+\".0.0\":ki(u)?l=\"<\"+c+\".\"+(+d+1)+\".0\":p?l=\"<=\"+c+\".\"+d+\".\"+u+\"-\"+p:l=\"<=\"+l,(e+\" \"+l).trim()}s(Dfe,\"hyphenReplace\");An.prototype.test=function(t){if(!t)return!1;typeof t==\"string\"&&(t=new Ot(t,this.options));for(var e=0;e<this.set.length;e++)if(Ffe(this.set[e],t,this.options))return!0;return!1};function Ffe(t,e,n){for(var i=0;i<t.length;i++)if(!t[i].test(e))return!1;if(e.prerelease.length&&!n.includePrerelease){for(i=0;i<t.length;i++)if(Wt(t[i].semver),t[i].semver!==Hu&&t[i].semver.prerelease.length>0){var a=t[i].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}s(Ffe,\"testSet\");pt.satisfies=Fm;function Fm(t,e,n){try{e=new An(e,n)}catch{return!1}return e.test(t)}s(Fm,\"satisfies\");pt.maxSatisfying=Nfe;function Nfe(t,e,n){var i=null,a=null;try{var r=new An(e,n)}catch{return null}return t.forEach(function(o){r.test(o)&&(!i||a.compare(o)===-1)&&(i=o,a=new Ot(i,n))}),i}s(Nfe,\"maxSatisfying\");pt.minSatisfying=Rfe;function Rfe(t,e,n){var i=null,a=null;try{var r=new An(e,n)}catch{return null}return t.forEach(function(o){r.test(o)&&(!i||a.compare(o)===1)&&(i=o,a=new Ot(i,n))}),i}s(Rfe,\"minSatisfying\");pt.minVersion=Mfe;function Mfe(t,e){t=new An(t,e);var n=new Ot(\"0.0.0\");if(t.test(n)||(n=new Ot(\"0.0.0-0\"),t.test(n)))return n;n=null;for(var i=0;i<t.set.length;++i){var a=t.set[i];a.forEach(function(r){var o=new Ot(r.semver.version);switch(r.operator){case\">\":o.prerelease.length===0?o.patch++:o.prerelease.push(0),o.raw=o.format();case\"\":case\">=\":(!n||Uu(n,o))&&(n=o);break;case\"<\":case\"<=\":break;default:throw new Error(\"Unexpected operation: \"+r.operator)}})}return n&&t.test(n)?n:null}s(Mfe,\"minVersion\");pt.validRange=Bfe;function Bfe(t,e){try{return new An(t,e).range||\"*\"}catch{return null}}s(Bfe,\"validRange\");pt.ltr=Pfe;function Pfe(t,e,n){return U0(t,e,\"<\",n)}s(Pfe,\"ltr\");pt.gtr=Lfe;function Lfe(t,e,n){return U0(t,e,\">\",n)}s(Lfe,\"gtr\");pt.outside=U0;function U0(t,e,n,i){t=new Ot(t,i),e=new An(e,i);var a,r,o,l,c;switch(n){case\">\":a=Uu,r=z0,o=Im,l=\">\",c=\">=\";break;case\"<\":a=Im,r=V0,o=Uu,l=\"<\",c=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(Fm(t,e,i))return!1;for(var d=0;d<e.set.length;++d){var u=e.set[d],p=null,m=null;if(u.forEach(function(f){f.semver===Hu&&(f=new ma(\">=0.0.0\")),p=p||f,m=m||f,a(f.semver,p.semver,i)?p=f:o(f.semver,m.semver,i)&&(m=f)}),p.operator===l||p.operator===c||(!m.operator||m.operator===l)&&r(t,m.semver))return!1;if(m.operator===c&&o(t,m.semver))return!1}return!0}s(U0,\"outside\");pt.prerelease=Vfe;function Vfe(t,e){var n=Ms(t,e);return n&&n.prerelease.length?n.prerelease:null}s(Vfe,\"prerelease\");pt.intersects=zfe;function zfe(t,e,n){return t=new An(t,n),e=new An(e,n),t.intersects(e)}s(zfe,\"intersects\");pt.coerce=Ufe;function Ufe(t){if(t instanceof Ot)return t;if(typeof t!=\"string\")return null;var e=t.match(un[d5]);return e==null?null:Ms(e[1]+\".\"+(e[2]||\"0\")+\".\"+(e[3]||\"0\"))}s(Ufe,\"coerce\")});var C5=oe((Jje,Pm)=>{\"use strict\";var Bm=Ee(\"fs\"),mo=Ee(\"path\"),w5=a5(),qfe=y5(),E5={mode:511&~process.umask(),fs:Bm},k5=qfe.satisfies(process.version,\">=10.12.0\"),j5=s(t=>{if(process.platform===\"win32\"&&/[<>:\"|?*]/.test(t.replace(mo.parse(t).root,\"\"))){let n=new Error(`Path contains invalid characters: ${t}`);throw n.code=\"EINVAL\",n}},\"checkPath\"),A5=s(t=>{let e=new Error(`operation not permitted, mkdir '${t}'`);return e.code=\"EPERM\",e.errno=-4048,e.path=t,e.syscall=\"mkdir\",e},\"permissionError\"),T5=s((t,e)=>Promise.resolve().then(()=>{j5(t),e=Object.assign({},E5,e);let n=w5(e.fs.mkdir),i=w5(e.fs.stat);if(k5&&e.fs.mkdir===Bm.mkdir){let r=mo.resolve(t);return n(r,{mode:e.mode,recursive:!0}).then(()=>r)}let a=s(r=>n(r,e.mode).then(()=>r).catch(o=>{if(o.code===\"EPERM\")throw o;if(o.code===\"ENOENT\"){if(mo.dirname(r)===r)throw A5(r);if(o.message.includes(\"null bytes\"))throw o;return a(mo.dirname(r)).then(()=>a(r))}return i(r).then(l=>l.isDirectory()?r:Promise.reject()).catch(()=>{throw o})}),\"make\");return a(mo.resolve(t))}),\"makeDir\");Pm.exports=T5;Pm.exports.default=T5;Pm.exports.sync=(t,e)=>{if(j5(t),e=Object.assign({},E5,e),k5&&e.fs.mkdirSync===Bm.mkdirSync){let i=mo.resolve(t);return Bm.mkdirSync(i,{mode:e.mode,recursive:!0}),i}let n=s(i=>{try{e.fs.mkdirSync(i,e.mode)}catch(a){if(a.code===\"EPERM\")throw a;if(a.code===\"ENOENT\"){if(mo.dirname(i)===i)throw A5(i);if(a.message.includes(\"null bytes\"))throw a;return n(mo.dirname(i)),n(i)}try{if(!e.fs.statSync(i).isDirectory())throw new Error(\"The path is not a directory\")}catch{throw a}}return i},\"make\");return n(mo.resolve(t))}});var I5=oe((Wje,O5)=>{\"use strict\";var S5=s((t,e)=>function(...n){let i=e.promiseModule;return new i((a,r)=>{e.multiArgs?n.push((...o)=>{e.errorFirst?o[0]?r(o):(o.shift(),a(o)):a(o)}):e.errorFirst?n.push((o,l)=>{o?r(o):a(l)}):n.push(a),t.apply(this,n)})},\"processFn\");O5.exports=(t,e)=>{e=Object.assign({exclude:[/.+(Sync|Stream)$/],errorFirst:!0,promiseModule:Promise},e);let n=typeof t;if(!(t!==null&&(n===\"object\"||n===\"function\")))throw new TypeError(`Expected \\`input\\` to be a \\`Function\\` or \\`Object\\`, got \\`${t===null?\"null\":n}\\``);let i=s(r=>{let o=s(l=>typeof l==\"string\"?r===l:l.test(r),\"match\");return e.include?e.include.some(o):!e.exclude.some(o)},\"filter\"),a;n===\"function\"?a=s(function(...r){return e.excludeMain?t(...r):S5(t,e).apply(this,r)},\"ret\"):a=Object.create(Object.getPrototypeOf(t));for(let r in t){let o=t[r];a[r]=typeof o==\"function\"&&i(r)?S5(o,e):o}return a}});var R5=oe((Yje,Lm)=>{\"use strict\";var Hfe=y0(),Jfe=Symbol.asyncIterator||\"@@asyncIterator\",D5=s(t=>{let e=t.on||t.addListener||t.addEventListener,n=t.off||t.removeListener||t.removeEventListener;if(!e||!n)throw new TypeError(\"Emitter is not compatible\");return{addListener:e.bind(t),removeListener:n.bind(t)}},\"normalizeEmitter\"),F5=s(t=>Array.isArray(t)?t:[t],\"normalizeEvents\"),N5=s((t,e,n)=>{let i,a=new Promise((r,o)=>{if(n=Object.assign({rejectionEvents:[\"error\"],multiArgs:!1,resolveImmediately:!1},n),!(n.count>=0&&(n.count===1/0||Number.isInteger(n.count))))throw new TypeError(\"The `count` option should be at least 0 or more\");let l=F5(e),c=[],{addListener:d,removeListener:u}=D5(t),p=s((...f)=>{let g=n.multiArgs?f:f[0];n.filter&&!n.filter(g)||(c.push(g),n.count===c.length&&(i(),r(c)))},\"onItem\"),m=s(f=>{i(),o(f)},\"rejectHandler\");i=s(()=>{for(let f of l)u(f,p);for(let f of n.rejectionEvents)u(f,m)},\"cancel\");for(let f of l)d(f,p);for(let f of n.rejectionEvents)d(f,m);n.resolveImmediately&&r(c)});if(a.cancel=i,typeof n.timeout==\"number\"){let r=Hfe(a,n.timeout);return r.cancel=i,r}return a},\"multiple\");Lm.exports=(t,e,n)=>{typeof n==\"function\"&&(n={filter:n}),n=Object.assign({},n,{count:1,resolveImmediately:!1});let i=N5(t,e,n),a=i.then(r=>r[0]);return a.cancel=i.cancel,a};Lm.exports.multiple=N5;Lm.exports.iterator=(t,e,n)=>{typeof n==\"function\"&&(n={filter:n});let i=F5(e);n=Object.assign({rejectionEvents:[\"error\"],resolutionEvents:[],limit:1/0,multiArgs:!1},n);let{limit:a}=n;if(!(a>=0&&(a===1/0||Number.isInteger(a))))throw new TypeError(\"The `limit` option should be a non-negative integer or Infinity\");if(a===0)return{[Symbol.asyncIterator](){return this},next(){return Promise.resolve({done:!0,value:void 0})}};let o=!1,{addListener:l,removeListener:c}=D5(t),d=!1,u,p=!1,m=[],f=[],g=0,x=s((...b)=>{g++,o=g===a;let y=n.multiArgs?b:b[0];if(m.length>0){let{resolve:w}=m.shift();w({done:!1,value:y}),o&&_();return}f.push(y),o&&_()},\"valueHandler\"),_=s(()=>{d=!0;for(let b of i)c(b,x);for(let b of n.rejectionEvents)c(b,h);for(let b of n.resolutionEvents)c(b,v);for(;m.length>0;){let{resolve:b}=m.shift();b({done:!0,value:void 0})}},\"cancel\"),h=s((...b)=>{if(u=n.multiArgs?b:b[0],m.length>0){let{reject:y}=m.shift();y(u)}else p=!0;_()},\"rejectHandler\"),v=s((...b)=>{let y=n.multiArgs?b:b[0];if(!(n.filter&&!n.filter(y))){if(m.length>0){let{resolve:w}=m.shift();w({done:!0,value:y})}else f.push(y);_()}},\"resolveHandler\");for(let b of i)l(b,x);for(let b of n.rejectionEvents)l(b,h);for(let b of n.resolutionEvents)l(b,v);return{[Jfe](){return this},next(){if(f.length>0){let b=f.shift();return Promise.resolve({done:d&&f.length===0&&!o,value:b})}return p?(p=!1,Promise.reject(u)):d?Promise.resolve({done:!0,value:void 0}):new Promise((b,y)=>m.push({resolve:b,reject:y}))},return(b){return _(),Promise.resolve({done:d,value:b})}}}});var B5=oe(Ju=>{\"use strict\";Ju.stringToBytes=t=>[...t].map(e=>e.charCodeAt(0));var M5=s((t,e,n)=>String.fromCharCode(...t.slice(e,n)),\"uint8ArrayUtf8ByteString\");Ju.readUInt64LE=(t,e=0)=>{let n=t[e],i=1,a=0;for(;++a<8;)i*=256,n+=t[e+a]*i;return n};Ju.tarHeaderChecksumMatches=t=>{if(t.length<512)return!1;let e=128,n=256,i=0;for(let r=0;r<148;r++){let o=t[r];n+=o,i+=o&e}for(let r=156;r<512;r++){let o=t[r];n+=o,i+=o&e}let a=parseInt(M5(t,148,154),8);return a===n||a===n-(i<<1)};Ju.uint8ArrayUtf8ByteString=M5});var P5=oe((exports,module)=>{\"use strict\";var{stringToBytes,readUInt64LE,tarHeaderChecksumMatches,uint8ArrayUtf8ByteString}=B5(),xpiZipFilename=stringToBytes(\"META-INF/mozilla.rsa\"),oxmlContentTypes=stringToBytes(\"[Content_Types].xml\"),oxmlRels=stringToBytes(\"_rels/.rels\"),fileType=s(t=>{if(!(t instanceof Uint8Array||t instanceof ArrayBuffer||Buffer.isBuffer(t)))throw new TypeError(`Expected the \\`input\\` argument to be of type \\`Uint8Array\\` or \\`Buffer\\` or \\`ArrayBuffer\\`, got \\`${typeof t}\\``);let e=t instanceof Uint8Array?t:new Uint8Array(t);if(!(e&&e.length>1))return;let n=s((a,r)=>{r=Object.assign({offset:0},r);for(let o=0;o<a.length;o++)if(r.mask){if(a[o]!==(r.mask[o]&e[o+r.offset]))return!1}else if(a[o]!==e[o+r.offset])return!1;return!0},\"check\"),i=s((a,r)=>n(stringToBytes(a),r),\"checkString\");if(n([255,216,255]))return{ext:\"jpg\",mime:\"image/jpeg\"};if(n([137,80,78,71,13,10,26,10]))return{ext:\"png\",mime:\"image/png\"};if(n([71,73,70]))return{ext:\"gif\",mime:\"image/gif\"};if(n([87,69,66,80],{offset:8}))return{ext:\"webp\",mime:\"image/webp\"};if(n([70,76,73,70]))return{ext:\"flif\",mime:\"image/flif\"};if((n([73,73,42,0])||n([77,77,0,42]))&&n([67,82],{offset:8}))return{ext:\"cr2\",mime:\"image/x-canon-cr2\"};if(n([73,73,82,79,8,0,0,0,24]))return{ext:\"orf\",mime:\"image/x-olympus-orf\"};if(n([73,73,42,0,16,251,134,1]))return{ext:\"arw\",mime:\"image/x-sony-arw\"};if(n([73,73,42,0,8,0,0,0,45]))return{ext:\"dng\",mime:\"image/x-adobe-dng\"};if(n([73,73,42,0,48,61,114,1,28]))return{ext:\"nef\",mime:\"image/x-nikon-nef\"};if(n([73,73,42,0])||n([77,77,0,42]))return{ext:\"tif\",mime:\"image/tiff\"};if(n([66,77]))return{ext:\"bmp\",mime:\"image/bmp\"};if(n([73,73,188]))return{ext:\"jxr\",mime:\"image/vnd.ms-photo\"};if(n([56,66,80,83]))return{ext:\"psd\",mime:\"image/vnd.adobe.photoshop\"};if(n([80,75,3,4])){if(n([109,105,109,101,116,121,112,101,97,112,112,108,105,99,97,116,105,111,110,47,101,112,117,98,43,122,105,112],{offset:30}))return{ext:\"epub\",mime:\"application/epub+zip\"};if(n(xpiZipFilename,{offset:30}))return{ext:\"xpi\",mime:\"application/x-xpinstall\"};if(i(\"mimetypeapplication/vnd.oasis.opendocument.text\",{offset:30}))return{ext:\"odt\",mime:\"application/vnd.oasis.opendocument.text\"};if(i(\"mimetypeapplication/vnd.oasis.opendocument.spreadsheet\",{offset:30}))return{ext:\"ods\",mime:\"application/vnd.oasis.opendocument.spreadsheet\"};if(i(\"mimetypeapplication/vnd.oasis.opendocument.presentation\",{offset:30}))return{ext:\"odp\",mime:\"application/vnd.oasis.opendocument.presentation\"};let a=s((c,d=0)=>c.findIndex((u,p,m)=>p>=d&&m[p]===80&&m[p+1]===75&&m[p+2]===3&&m[p+3]===4),\"findNextZipHeaderIndex\"),r=0,o=!1,l;do{let c=r+30;if(o||(o=n(oxmlContentTypes,{offset:c})||n(oxmlRels,{offset:c})),l||(i(\"word/\",{offset:c})?l={ext:\"docx\",mime:\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"}:i(\"ppt/\",{offset:c})?l={ext:\"pptx\",mime:\"application/vnd.openxmlformats-officedocument.presentationml.presentation\"}:i(\"xl/\",{offset:c})&&(l={ext:\"xlsx\",mime:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"})),o&&l)return l;r=a(e,c)}while(r>=0);if(l)return l}if(n([80,75])&&(e[2]===3||e[2]===5||e[2]===7)&&(e[3]===4||e[3]===6||e[3]===8))return{ext:\"zip\",mime:\"application/zip\"};if(n([48,48,48,48,48,48],{offset:148,mask:[248,248,248,248,248,248]})&&tarHeaderChecksumMatches(e))return{ext:\"tar\",mime:\"application/x-tar\"};if(n([82,97,114,33,26,7])&&(e[6]===0||e[6]===1))return{ext:\"rar\",mime:\"application/x-rar-compressed\"};if(n([31,139,8]))return{ext:\"gz\",mime:\"application/gzip\"};if(n([66,90,104]))return{ext:\"bz2\",mime:\"application/x-bzip2\"};if(n([55,122,188,175,39,28]))return{ext:\"7z\",mime:\"application/x-7z-compressed\"};if(n([120,1]))return{ext:\"dmg\",mime:\"application/x-apple-diskimage\"};if(n([102,114,101,101],{offset:4})||n([109,100,97,116],{offset:4})||n([109,111,111,118],{offset:4})||n([119,105,100,101],{offset:4}))return{ext:\"mov\",mime:\"video/quicktime\"};if(n([102,116,121,112],{offset:4})&&e[8]&96&&e[9]&96&&e[10]&96&&e[11]&96){let a=uint8ArrayUtf8ByteString(e,8,12);switch(a){case\"mif1\":return{ext:\"heic\",mime:\"image/heif\"};case\"msf1\":return{ext:\"heic\",mime:\"image/heif-sequence\"};case\"heic\":case\"heix\":return{ext:\"heic\",mime:\"image/heic\"};case\"hevc\":case\"hevx\":return{ext:\"heic\",mime:\"image/heic-sequence\"};case\"qt  \":return{ext:\"mov\",mime:\"video/quicktime\"};case\"M4V \":case\"M4VH\":case\"M4VP\":return{ext:\"m4v\",mime:\"video/x-m4v\"};case\"M4P \":return{ext:\"m4p\",mime:\"video/mp4\"};case\"M4B \":return{ext:\"m4b\",mime:\"audio/mp4\"};case\"M4A \":return{ext:\"m4a\",mime:\"audio/x-m4a\"};case\"F4V \":return{ext:\"f4v\",mime:\"video/mp4\"};case\"F4P \":return{ext:\"f4p\",mime:\"video/mp4\"};case\"F4A \":return{ext:\"f4a\",mime:\"audio/mp4\"};case\"F4B \":return{ext:\"f4b\",mime:\"audio/mp4\"};default:return a.startsWith(\"3g\")?a.startsWith(\"3g2\")?{ext:\"3g2\",mime:\"video/3gpp2\"}:{ext:\"3gp\",mime:\"video/3gpp\"}:{ext:\"mp4\",mime:\"video/mp4\"}}}if(n([77,84,104,100]))return{ext:\"mid\",mime:\"audio/midi\"};if(n([26,69,223,163])){let a=e.subarray(4,4100),r=a.findIndex((o,l,c)=>c[l]===66&&c[l+1]===130);if(r!==-1){let o=r+3,l=s(c=>[...c].every((d,u)=>a[o+u]===d.charCodeAt(0)),\"findDocType\");if(l(\"matroska\"))return{ext:\"mkv\",mime:\"video/x-matroska\"};if(l(\"webm\"))return{ext:\"webm\",mime:\"video/webm\"}}}if(n([82,73,70,70])){if(n([65,86,73],{offset:8}))return{ext:\"avi\",mime:\"video/vnd.avi\"};if(n([87,65,86,69],{offset:8}))return{ext:\"wav\",mime:\"audio/vnd.wave\"};if(n([81,76,67,77],{offset:8}))return{ext:\"qcp\",mime:\"audio/qcelp\"}}if(n([48,38,178,117,142,102,207,17,166,217])){let a=30;do{let r=readUInt64LE(e,a+16);if(n([145,7,220,183,183,169,207,17,142,230,0,192,12,32,83,101],{offset:a})){if(n([64,158,105,248,77,91,207,17,168,253,0,128,95,92,68,43],{offset:a+24}))return{ext:\"wma\",mime:\"audio/x-ms-wma\"};if(n([192,239,25,188,77,91,207,17,168,253,0,128,95,92,68,43],{offset:a+24}))return{ext:\"wmv\",mime:\"video/x-ms-asf\"};break}a+=r}while(a+24<=e.length);return{ext:\"asf\",mime:\"application/vnd.ms-asf\"}}if(n([0,0,1,186])||n([0,0,1,179]))return{ext:\"mpg\",mime:\"video/mpeg\"};for(let a=0;a<2&&a<e.length-16;a++){if(n([73,68,51],{offset:a})||n([255,226],{offset:a,mask:[255,230]}))return{ext:\"mp3\",mime:\"audio/mpeg\"};if(n([255,228],{offset:a,mask:[255,230]}))return{ext:\"mp2\",mime:\"audio/mpeg\"};if(n([255,248],{offset:a,mask:[255,252]}))return{ext:\"mp2\",mime:\"audio/mpeg\"};if(n([255,240],{offset:a,mask:[255,252]}))return{ext:\"mp4\",mime:\"audio/mpeg\"}}if(n([79,112,117,115,72,101,97,100],{offset:28}))return{ext:\"opus\",mime:\"audio/opus\"};if(n([79,103,103,83]))return n([128,116,104,101,111,114,97],{offset:28})?{ext:\"ogv\",mime:\"video/ogg\"}:n([1,118,105,100,101,111,0],{offset:28})?{ext:\"ogm\",mime:\"video/ogg\"}:n([127,70,76,65,67],{offset:28})?{ext:\"oga\",mime:\"audio/ogg\"}:n([83,112,101,101,120,32,32],{offset:28})?{ext:\"spx\",mime:\"audio/ogg\"}:n([1,118,111,114,98,105,115],{offset:28})?{ext:\"ogg\",mime:\"audio/ogg\"}:{ext:\"ogx\",mime:\"application/ogg\"};if(n([102,76,97,67]))return{ext:\"flac\",mime:\"audio/x-flac\"};if(n([77,65,67,32]))return{ext:\"ape\",mime:\"audio/ape\"};if(n([119,118,112,107]))return{ext:\"wv\",mime:\"audio/wavpack\"};if(n([35,33,65,77,82,10]))return{ext:\"amr\",mime:\"audio/amr\"};if(n([37,80,68,70]))return{ext:\"pdf\",mime:\"application/pdf\"};if(n([77,90]))return{ext:\"exe\",mime:\"application/x-msdownload\"};if((e[0]===67||e[0]===70)&&n([87,83],{offset:1}))return{ext:\"swf\",mime:\"application/x-shockwave-flash\"};if(n([123,92,114,116,102]))return{ext:\"rtf\",mime:\"application/rtf\"};if(n([0,97,115,109]))return{ext:\"wasm\",mime:\"application/wasm\"};if(n([119,79,70,70])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4})))return{ext:\"woff\",mime:\"font/woff\"};if(n([119,79,70,50])&&(n([0,1,0,0],{offset:4})||n([79,84,84,79],{offset:4})))return{ext:\"woff2\",mime:\"font/woff2\"};if(n([76,80],{offset:34})&&(n([0,0,1],{offset:8})||n([1,0,2],{offset:8})||n([2,0,2],{offset:8})))return{ext:\"eot\",mime:\"application/vnd.ms-fontobject\"};if(n([0,1,0,0,0]))return{ext:\"ttf\",mime:\"font/ttf\"};if(n([79,84,84,79,0]))return{ext:\"otf\",mime:\"font/otf\"};if(n([0,0,1,0]))return{ext:\"ico\",mime:\"image/x-icon\"};if(n([0,0,2,0]))return{ext:\"cur\",mime:\"image/x-icon\"};if(n([70,76,86,1]))return{ext:\"flv\",mime:\"video/x-flv\"};if(n([37,33]))return{ext:\"ps\",mime:\"application/postscript\"};if(n([253,55,122,88,90,0]))return{ext:\"xz\",mime:\"application/x-xz\"};if(n([83,81,76,105]))return{ext:\"sqlite\",mime:\"application/x-sqlite3\"};if(n([78,69,83,26]))return{ext:\"nes\",mime:\"application/x-nintendo-nes-rom\"};if(n([67,114,50,52]))return{ext:\"crx\",mime:\"application/x-google-chrome-extension\"};if(n([77,83,67,70])||n([73,83,99,40]))return{ext:\"cab\",mime:\"application/vnd.ms-cab-compressed\"};if(n([33,60,97,114,99,104,62,10,100,101,98,105,97,110,45,98,105,110,97,114,121]))return{ext:\"deb\",mime:\"application/x-deb\"};if(n([33,60,97,114,99,104,62]))return{ext:\"ar\",mime:\"application/x-unix-archive\"};if(n([237,171,238,219]))return{ext:\"rpm\",mime:\"application/x-rpm\"};if(n([31,160])||n([31,157]))return{ext:\"Z\",mime:\"application/x-compress\"};if(n([76,90,73,80]))return{ext:\"lz\",mime:\"application/x-lzip\"};if(n([208,207,17,224,161,177,26,225]))return{ext:\"msi\",mime:\"application/x-msi\"};if(n([6,14,43,52,2,5,1,1,13,1,2,1,1,2]))return{ext:\"mxf\",mime:\"application/mxf\"};if(n([71],{offset:4})&&(n([71],{offset:192})||n([71],{offset:196})))return{ext:\"mts\",mime:\"video/mp2t\"};if(n([66,76,69,78,68,69,82]))return{ext:\"blend\",mime:\"application/x-blender\"};if(n([66,80,71,251]))return{ext:\"bpg\",mime:\"image/bpg\"};if(n([0,0,0,12,106,80,32,32,13,10,135,10])){if(n([106,112,50,32],{offset:20}))return{ext:\"jp2\",mime:\"image/jp2\"};if(n([106,112,120,32],{offset:20}))return{ext:\"jpx\",mime:\"image/jpx\"};if(n([106,112,109,32],{offset:20}))return{ext:\"jpm\",mime:\"image/jpm\"};if(n([109,106,112,50],{offset:20}))return{ext:\"mj2\",mime:\"image/mj2\"}}if(n([70,79,82,77]))return{ext:\"aif\",mime:\"audio/aiff\"};if(i(\"<?xml \"))return{ext:\"xml\",mime:\"application/xml\"};if(n([66,79,79,75,77,79,66,73],{offset:60}))return{ext:\"mobi\",mime:\"application/x-mobipocket-ebook\"};if(n([171,75,84,88,32,49,49,187,13,10,26,10]))return{ext:\"ktx\",mime:\"image/ktx\"};if(n([68,73,67,77],{offset:128}))return{ext:\"dcm\",mime:\"application/dicom\"};if(n([77,80,43]))return{ext:\"mpc\",mime:\"audio/x-musepack\"};if(n([77,80,67,75]))return{ext:\"mpc\",mime:\"audio/x-musepack\"};if(n([66,69,71,73,78,58]))return{ext:\"ics\",mime:\"text/calendar\"};if(n([103,108,84,70,2,0,0,0]))return{ext:\"glb\",mime:\"model/gltf-binary\"};if(n([212,195,178,161])||n([161,178,195,212]))return{ext:\"pcap\",mime:\"application/vnd.tcpdump.pcap\"};if(n([68,83,68,32]))return{ext:\"dsf\",mime:\"audio/x-dsf\"};if(n([76,0,0,0,1,20,2,0,0,0,0,0,192,0,0,0,0,0,0,70]))return{ext:\"lnk\",mime:\"application/x.ms.shortcut\"};if(n([98,111,111,107,0,0,0,0,109,97,114,107,0,0,0,0]))return{ext:\"alias\",mime:\"application/x.apple.alias\"};if(i(\"Creative Voice File\"))return{ext:\"voc\",mime:\"audio/x-voc\"};if(n([11,119]))return{ext:\"ac3\",mime:\"audio/vnd.dolby.dd-raw\"}},\"fileType\");module.exports=fileType;Object.defineProperty(fileType,\"minimumBytes\",{value:4100});fileType.stream=readableStream=>new Promise((resolve,reject)=>{let stream=eval(\"require\")(\"stream\");readableStream.once(\"readable\",()=>{let t=new stream.PassThrough,e=readableStream.read(module.exports.minimumBytes)||readableStream.read();try{t.fileType=fileType(e)}catch(n){reject(n)}readableStream.unshift(e),stream.pipeline?resolve(stream.pipeline(readableStream,t,()=>{})):resolve(readableStream.pipe(t))})})});var L5=oe((eAe,Gfe)=>{Gfe.exports={\"application/1d-interleaved-parityfec\":{source:\"iana\"},\"application/3gpdash-qoe-report+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/3gpp-ims+xml\":{source:\"iana\",compressible:!0},\"application/3gpphal+json\":{source:\"iana\",compressible:!0},\"application/3gpphalforms+json\":{source:\"iana\",compressible:!0},\"application/a2l\":{source:\"iana\"},\"application/ace+cbor\":{source:\"iana\"},\"application/ace+json\":{source:\"iana\",compressible:!0},\"application/ace-groupcomm+cbor\":{source:\"iana\"},\"application/activemessage\":{source:\"iana\"},\"application/activity+json\":{source:\"iana\",compressible:!0},\"application/aif+cbor\":{source:\"iana\"},\"application/aif+json\":{source:\"iana\",compressible:!0},\"application/alto-cdni+json\":{source:\"iana\",compressible:!0},\"application/alto-cdnifilter+json\":{source:\"iana\",compressible:!0},\"application/alto-costmap+json\":{source:\"iana\",compressible:!0},\"application/alto-costmapfilter+json\":{source:\"iana\",compressible:!0},\"application/alto-directory+json\":{source:\"iana\",compressible:!0},\"application/alto-endpointcost+json\":{source:\"iana\",compressible:!0},\"application/alto-endpointcostparams+json\":{source:\"iana\",compressible:!0},\"application/alto-endpointprop+json\":{source:\"iana\",compressible:!0},\"application/alto-endpointpropparams+json\":{source:\"iana\",compressible:!0},\"application/alto-error+json\":{source:\"iana\",compressible:!0},\"application/alto-networkmap+json\":{source:\"iana\",compressible:!0},\"application/alto-networkmapfilter+json\":{source:\"iana\",compressible:!0},\"application/alto-propmap+json\":{source:\"iana\",compressible:!0},\"application/alto-propmapparams+json\":{source:\"iana\",compressible:!0},\"application/alto-tips+json\":{source:\"iana\",compressible:!0},\"application/alto-tipsparams+json\":{source:\"iana\",compressible:!0},\"application/alto-updatestreamcontrol+json\":{source:\"iana\",compressible:!0},\"application/alto-updatestreamparams+json\":{source:\"iana\",compressible:!0},\"application/aml\":{source:\"iana\"},\"application/andrew-inset\":{source:\"iana\",extensions:[\"ez\"]},\"application/appinstaller\":{compressible:!1,extensions:[\"appinstaller\"]},\"application/applefile\":{source:\"iana\"},\"application/applixware\":{source:\"apache\",extensions:[\"aw\"]},\"application/appx\":{compressible:!1,extensions:[\"appx\"]},\"application/appxbundle\":{compressible:!1,extensions:[\"appxbundle\"]},\"application/at+jwt\":{source:\"iana\"},\"application/atf\":{source:\"iana\"},\"application/atfx\":{source:\"iana\"},\"application/atom+xml\":{source:\"iana\",compressible:!0,extensions:[\"atom\"]},\"application/atomcat+xml\":{source:\"iana\",compressible:!0,extensions:[\"atomcat\"]},\"application/atomdeleted+xml\":{source:\"iana\",compressible:!0,extensions:[\"atomdeleted\"]},\"application/atomicmail\":{source:\"iana\"},\"application/atomsvc+xml\":{source:\"iana\",compressible:!0,extensions:[\"atomsvc\"]},\"application/atsc-dwd+xml\":{source:\"iana\",compressible:!0,extensions:[\"dwd\"]},\"application/atsc-dynamic-event-message\":{source:\"iana\"},\"application/atsc-held+xml\":{source:\"iana\",compressible:!0,extensions:[\"held\"]},\"application/atsc-rdt+json\":{source:\"iana\",compressible:!0},\"application/atsc-rsat+xml\":{source:\"iana\",compressible:!0,extensions:[\"rsat\"]},\"application/atxml\":{source:\"iana\"},\"application/auth-policy+xml\":{source:\"iana\",compressible:!0},\"application/automationml-aml+xml\":{source:\"iana\",compressible:!0,extensions:[\"aml\"]},\"application/automationml-amlx+zip\":{source:\"iana\",compressible:!1,extensions:[\"amlx\"]},\"application/bacnet-xdd+zip\":{source:\"iana\",compressible:!1},\"application/batch-smtp\":{source:\"iana\"},\"application/bdoc\":{compressible:!1,extensions:[\"bdoc\"]},\"application/beep+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/bufr\":{source:\"iana\"},\"application/c2pa\":{source:\"iana\"},\"application/calendar+json\":{source:\"iana\",compressible:!0},\"application/calendar+xml\":{source:\"iana\",compressible:!0,extensions:[\"xcs\"]},\"application/call-completion\":{source:\"iana\"},\"application/cals-1840\":{source:\"iana\"},\"application/captive+json\":{source:\"iana\",compressible:!0},\"application/cbor\":{source:\"iana\"},\"application/cbor-seq\":{source:\"iana\"},\"application/cccex\":{source:\"iana\"},\"application/ccmp+xml\":{source:\"iana\",compressible:!0},\"application/ccxml+xml\":{source:\"iana\",compressible:!0,extensions:[\"ccxml\"]},\"application/cda+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/cdfx+xml\":{source:\"iana\",compressible:!0,extensions:[\"cdfx\"]},\"application/cdmi-capability\":{source:\"iana\",extensions:[\"cdmia\"]},\"application/cdmi-container\":{source:\"iana\",extensions:[\"cdmic\"]},\"application/cdmi-domain\":{source:\"iana\",extensions:[\"cdmid\"]},\"application/cdmi-object\":{source:\"iana\",extensions:[\"cdmio\"]},\"application/cdmi-queue\":{source:\"iana\",extensions:[\"cdmiq\"]},\"application/cdni\":{source:\"iana\"},\"application/cea\":{source:\"iana\"},\"application/cea-2018+xml\":{source:\"iana\",compressible:!0},\"application/cellml+xml\":{source:\"iana\",compressible:!0},\"application/cfw\":{source:\"iana\"},\"application/cid-edhoc+cbor-seq\":{source:\"iana\"},\"application/city+json\":{source:\"iana\",compressible:!0},\"application/clr\":{source:\"iana\"},\"application/clue+xml\":{source:\"iana\",compressible:!0},\"application/clue_info+xml\":{source:\"iana\",compressible:!0},\"application/cms\":{source:\"iana\"},\"application/cnrp+xml\":{source:\"iana\",compressible:!0},\"application/coap-group+json\":{source:\"iana\",compressible:!0},\"application/coap-payload\":{source:\"iana\"},\"application/commonground\":{source:\"iana\"},\"application/concise-problem-details+cbor\":{source:\"iana\"},\"application/conference-info+xml\":{source:\"iana\",compressible:!0},\"application/cose\":{source:\"iana\"},\"application/cose-key\":{source:\"iana\"},\"application/cose-key-set\":{source:\"iana\"},\"application/cose-x509\":{source:\"iana\"},\"application/cpl+xml\":{source:\"iana\",compressible:!0,extensions:[\"cpl\"]},\"application/csrattrs\":{source:\"iana\"},\"application/csta+xml\":{source:\"iana\",compressible:!0},\"application/cstadata+xml\":{source:\"iana\",compressible:!0},\"application/csvm+json\":{source:\"iana\",compressible:!0},\"application/cu-seeme\":{source:\"apache\",extensions:[\"cu\"]},\"application/cwl\":{source:\"iana\",extensions:[\"cwl\"]},\"application/cwl+json\":{source:\"iana\",compressible:!0},\"application/cwl+yaml\":{source:\"iana\"},\"application/cwt\":{source:\"iana\"},\"application/cybercash\":{source:\"iana\"},\"application/dart\":{compressible:!0},\"application/dash+xml\":{source:\"iana\",compressible:!0,extensions:[\"mpd\"]},\"application/dash-patch+xml\":{source:\"iana\",compressible:!0,extensions:[\"mpp\"]},\"application/dashdelta\":{source:\"iana\"},\"application/davmount+xml\":{source:\"iana\",compressible:!0,extensions:[\"davmount\"]},\"application/dca-rft\":{source:\"iana\"},\"application/dcd\":{source:\"iana\"},\"application/dec-dx\":{source:\"iana\"},\"application/dialog-info+xml\":{source:\"iana\",compressible:!0},\"application/dicom\":{source:\"iana\"},\"application/dicom+json\":{source:\"iana\",compressible:!0},\"application/dicom+xml\":{source:\"iana\",compressible:!0},\"application/dii\":{source:\"iana\"},\"application/dit\":{source:\"iana\"},\"application/dns\":{source:\"iana\"},\"application/dns+json\":{source:\"iana\",compressible:!0},\"application/dns-message\":{source:\"iana\"},\"application/docbook+xml\":{source:\"apache\",compressible:!0,extensions:[\"dbk\"]},\"application/dots+cbor\":{source:\"iana\"},\"application/dpop+jwt\":{source:\"iana\"},\"application/dskpp+xml\":{source:\"iana\",compressible:!0},\"application/dssc+der\":{source:\"iana\",extensions:[\"dssc\"]},\"application/dssc+xml\":{source:\"iana\",compressible:!0,extensions:[\"xdssc\"]},\"application/dvcs\":{source:\"iana\"},\"application/ecmascript\":{source:\"apache\",compressible:!0,extensions:[\"ecma\"]},\"application/edhoc+cbor-seq\":{source:\"iana\"},\"application/edi-consent\":{source:\"iana\"},\"application/edi-x12\":{source:\"iana\",compressible:!1},\"application/edifact\":{source:\"iana\",compressible:!1},\"application/efi\":{source:\"iana\"},\"application/elm+json\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/elm+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.cap+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/emergencycalldata.comment+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.control+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.deviceinfo+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.ecall.msd\":{source:\"iana\"},\"application/emergencycalldata.legacyesn+json\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.providerinfo+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.serviceinfo+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.subscriberinfo+xml\":{source:\"iana\",compressible:!0},\"application/emergencycalldata.veds+xml\":{source:\"iana\",compressible:!0},\"application/emma+xml\":{source:\"iana\",compressible:!0,extensions:[\"emma\"]},\"application/emotionml+xml\":{source:\"iana\",compressible:!0,extensions:[\"emotionml\"]},\"application/encaprtp\":{source:\"iana\"},\"application/epp+xml\":{source:\"iana\",compressible:!0},\"application/epub+zip\":{source:\"iana\",compressible:!1,extensions:[\"epub\"]},\"application/eshop\":{source:\"iana\"},\"application/exi\":{source:\"iana\",extensions:[\"exi\"]},\"application/expect-ct-report+json\":{source:\"iana\",compressible:!0},\"application/express\":{source:\"iana\",extensions:[\"exp\"]},\"application/fastinfoset\":{source:\"iana\"},\"application/fastsoap\":{source:\"iana\"},\"application/fdf\":{source:\"iana\",extensions:[\"fdf\"]},\"application/fdt+xml\":{source:\"iana\",compressible:!0,extensions:[\"fdt\"]},\"application/fhir+json\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/fhir+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/fido.trusted-apps+json\":{compressible:!0},\"application/fits\":{source:\"iana\"},\"application/flexfec\":{source:\"iana\"},\"application/font-sfnt\":{source:\"iana\"},\"application/font-tdpfr\":{source:\"iana\",extensions:[\"pfr\"]},\"application/font-woff\":{source:\"iana\",compressible:!1},\"application/framework-attributes+xml\":{source:\"iana\",compressible:!0},\"application/geo+json\":{source:\"iana\",compressible:!0,extensions:[\"geojson\"]},\"application/geo+json-seq\":{source:\"iana\"},\"application/geopackage+sqlite3\":{source:\"iana\"},\"application/geoxacml+json\":{source:\"iana\",compressible:!0},\"application/geoxacml+xml\":{source:\"iana\",compressible:!0},\"application/gltf-buffer\":{source:\"iana\"},\"application/gml+xml\":{source:\"iana\",compressible:!0,extensions:[\"gml\"]},\"application/gnap-binding-jws\":{source:\"iana\"},\"application/gnap-binding-jwsd\":{source:\"iana\"},\"application/gnap-binding-rotation-jws\":{source:\"iana\"},\"application/gnap-binding-rotation-jwsd\":{source:\"iana\"},\"application/gpx+xml\":{source:\"apache\",compressible:!0,extensions:[\"gpx\"]},\"application/grib\":{source:\"iana\"},\"application/gxf\":{source:\"apache\",extensions:[\"gxf\"]},\"application/gzip\":{source:\"iana\",compressible:!1,extensions:[\"gz\"]},\"application/h224\":{source:\"iana\"},\"application/held+xml\":{source:\"iana\",compressible:!0},\"application/hjson\":{extensions:[\"hjson\"]},\"application/hl7v2+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/http\":{source:\"iana\"},\"application/hyperstudio\":{source:\"iana\",extensions:[\"stk\"]},\"application/ibe-key-request+xml\":{source:\"iana\",compressible:!0},\"application/ibe-pkg-reply+xml\":{source:\"iana\",compressible:!0},\"application/ibe-pp-data\":{source:\"iana\"},\"application/iges\":{source:\"iana\"},\"application/im-iscomposing+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/index\":{source:\"iana\"},\"application/index.cmd\":{source:\"iana\"},\"application/index.obj\":{source:\"iana\"},\"application/index.response\":{source:\"iana\"},\"application/index.vnd\":{source:\"iana\"},\"application/inkml+xml\":{source:\"iana\",compressible:!0,extensions:[\"ink\",\"inkml\"]},\"application/iotp\":{source:\"iana\"},\"application/ipfix\":{source:\"iana\",extensions:[\"ipfix\"]},\"application/ipp\":{source:\"iana\"},\"application/isup\":{source:\"iana\"},\"application/its+xml\":{source:\"iana\",compressible:!0,extensions:[\"its\"]},\"application/java-archive\":{source:\"iana\",compressible:!1,extensions:[\"jar\",\"war\",\"ear\"]},\"application/java-serialized-object\":{source:\"apache\",compressible:!1,extensions:[\"ser\"]},\"application/java-vm\":{source:\"apache\",compressible:!1,extensions:[\"class\"]},\"application/javascript\":{source:\"apache\",charset:\"UTF-8\",compressible:!0,extensions:[\"js\"]},\"application/jf2feed+json\":{source:\"iana\",compressible:!0},\"application/jose\":{source:\"iana\"},\"application/jose+json\":{source:\"iana\",compressible:!0},\"application/jrd+json\":{source:\"iana\",compressible:!0},\"application/jscalendar+json\":{source:\"iana\",compressible:!0},\"application/jscontact+json\":{source:\"iana\",compressible:!0},\"application/json\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"json\",\"map\"]},\"application/json-patch+json\":{source:\"iana\",compressible:!0},\"application/json-seq\":{source:\"iana\"},\"application/json5\":{extensions:[\"json5\"]},\"application/jsonml+json\":{source:\"apache\",compressible:!0,extensions:[\"jsonml\"]},\"application/jsonpath\":{source:\"iana\"},\"application/jwk+json\":{source:\"iana\",compressible:!0},\"application/jwk-set+json\":{source:\"iana\",compressible:!0},\"application/jwt\":{source:\"iana\"},\"application/kpml-request+xml\":{source:\"iana\",compressible:!0},\"application/kpml-response+xml\":{source:\"iana\",compressible:!0},\"application/ld+json\":{source:\"iana\",compressible:!0,extensions:[\"jsonld\"]},\"application/lgr+xml\":{source:\"iana\",compressible:!0,extensions:[\"lgr\"]},\"application/link-format\":{source:\"iana\"},\"application/linkset\":{source:\"iana\"},\"application/linkset+json\":{source:\"iana\",compressible:!0},\"application/load-control+xml\":{source:\"iana\",compressible:!0},\"application/logout+jwt\":{source:\"iana\"},\"application/lost+xml\":{source:\"iana\",compressible:!0,extensions:[\"lostxml\"]},\"application/lostsync+xml\":{source:\"iana\",compressible:!0},\"application/lpf+zip\":{source:\"iana\",compressible:!1},\"application/lxf\":{source:\"iana\"},\"application/mac-binhex40\":{source:\"iana\",extensions:[\"hqx\"]},\"application/mac-compactpro\":{source:\"apache\",extensions:[\"cpt\"]},\"application/macwriteii\":{source:\"iana\"},\"application/mads+xml\":{source:\"iana\",compressible:!0,extensions:[\"mads\"]},\"application/manifest+json\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"webmanifest\"]},\"application/marc\":{source:\"iana\",extensions:[\"mrc\"]},\"application/marcxml+xml\":{source:\"iana\",compressible:!0,extensions:[\"mrcx\"]},\"application/mathematica\":{source:\"iana\",extensions:[\"ma\",\"nb\",\"mb\"]},\"application/mathml+xml\":{source:\"iana\",compressible:!0,extensions:[\"mathml\"]},\"application/mathml-content+xml\":{source:\"iana\",compressible:!0},\"application/mathml-presentation+xml\":{source:\"iana\",compressible:!0},\"application/mbms-associated-procedure-description+xml\":{source:\"iana\",compressible:!0},\"application/mbms-deregister+xml\":{source:\"iana\",compressible:!0},\"application/mbms-envelope+xml\":{source:\"iana\",compressible:!0},\"application/mbms-msk+xml\":{source:\"iana\",compressible:!0},\"application/mbms-msk-response+xml\":{source:\"iana\",compressible:!0},\"application/mbms-protection-description+xml\":{source:\"iana\",compressible:!0},\"application/mbms-reception-report+xml\":{source:\"iana\",compressible:!0},\"application/mbms-register+xml\":{source:\"iana\",compressible:!0},\"application/mbms-register-response+xml\":{source:\"iana\",compressible:!0},\"application/mbms-schedule+xml\":{source:\"iana\",compressible:!0},\"application/mbms-user-service-description+xml\":{source:\"iana\",compressible:!0},\"application/mbox\":{source:\"iana\",extensions:[\"mbox\"]},\"application/media-policy-dataset+xml\":{source:\"iana\",compressible:!0,extensions:[\"mpf\"]},\"application/media_control+xml\":{source:\"iana\",compressible:!0},\"application/mediaservercontrol+xml\":{source:\"iana\",compressible:!0,extensions:[\"mscml\"]},\"application/merge-patch+json\":{source:\"iana\",compressible:!0},\"application/metalink+xml\":{source:\"apache\",compressible:!0,extensions:[\"metalink\"]},\"application/metalink4+xml\":{source:\"iana\",compressible:!0,extensions:[\"meta4\"]},\"application/mets+xml\":{source:\"iana\",compressible:!0,extensions:[\"mets\"]},\"application/mf4\":{source:\"iana\"},\"application/mikey\":{source:\"iana\"},\"application/mipc\":{source:\"iana\"},\"application/missing-blocks+cbor-seq\":{source:\"iana\"},\"application/mmt-aei+xml\":{source:\"iana\",compressible:!0,extensions:[\"maei\"]},\"application/mmt-usd+xml\":{source:\"iana\",compressible:!0,extensions:[\"musd\"]},\"application/mods+xml\":{source:\"iana\",compressible:!0,extensions:[\"mods\"]},\"application/moss-keys\":{source:\"iana\"},\"application/moss-signature\":{source:\"iana\"},\"application/mosskey-data\":{source:\"iana\"},\"application/mosskey-request\":{source:\"iana\"},\"application/mp21\":{source:\"iana\",extensions:[\"m21\",\"mp21\"]},\"application/mp4\":{source:\"iana\",extensions:[\"mp4\",\"mpg4\",\"mp4s\",\"m4p\"]},\"application/mpeg4-generic\":{source:\"iana\"},\"application/mpeg4-iod\":{source:\"iana\"},\"application/mpeg4-iod-xmt\":{source:\"iana\"},\"application/mrb-consumer+xml\":{source:\"iana\",compressible:!0},\"application/mrb-publish+xml\":{source:\"iana\",compressible:!0},\"application/msc-ivr+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/msc-mixer+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/msix\":{compressible:!1,extensions:[\"msix\"]},\"application/msixbundle\":{compressible:!1,extensions:[\"msixbundle\"]},\"application/msword\":{source:\"iana\",compressible:!1,extensions:[\"doc\",\"dot\"]},\"application/mud+json\":{source:\"iana\",compressible:!0},\"application/multipart-core\":{source:\"iana\"},\"application/mxf\":{source:\"iana\",extensions:[\"mxf\"]},\"application/n-quads\":{source:\"iana\",extensions:[\"nq\"]},\"application/n-triples\":{source:\"iana\",extensions:[\"nt\"]},\"application/nasdata\":{source:\"iana\"},\"application/news-checkgroups\":{source:\"iana\",charset:\"US-ASCII\"},\"application/news-groupinfo\":{source:\"iana\",charset:\"US-ASCII\"},\"application/news-transmission\":{source:\"iana\"},\"application/nlsml+xml\":{source:\"iana\",compressible:!0},\"application/node\":{source:\"iana\",extensions:[\"cjs\"]},\"application/nss\":{source:\"iana\"},\"application/oauth-authz-req+jwt\":{source:\"iana\"},\"application/oblivious-dns-message\":{source:\"iana\"},\"application/ocsp-request\":{source:\"iana\"},\"application/ocsp-response\":{source:\"iana\"},\"application/octet-stream\":{source:\"iana\",compressible:!1,extensions:[\"bin\",\"dms\",\"lrf\",\"mar\",\"so\",\"dist\",\"distz\",\"pkg\",\"bpk\",\"dump\",\"elc\",\"deploy\",\"exe\",\"dll\",\"deb\",\"dmg\",\"iso\",\"img\",\"msi\",\"msp\",\"msm\",\"buffer\"]},\"application/oda\":{source:\"iana\",extensions:[\"oda\"]},\"application/odm+xml\":{source:\"iana\",compressible:!0},\"application/odx\":{source:\"iana\"},\"application/oebps-package+xml\":{source:\"iana\",compressible:!0,extensions:[\"opf\"]},\"application/ogg\":{source:\"iana\",compressible:!1,extensions:[\"ogx\"]},\"application/ohttp-keys\":{source:\"iana\"},\"application/omdoc+xml\":{source:\"apache\",compressible:!0,extensions:[\"omdoc\"]},\"application/onenote\":{source:\"apache\",extensions:[\"onetoc\",\"onetoc2\",\"onetmp\",\"onepkg\"]},\"application/opc-nodeset+xml\":{source:\"iana\",compressible:!0},\"application/oscore\":{source:\"iana\"},\"application/oxps\":{source:\"iana\",extensions:[\"oxps\"]},\"application/p21\":{source:\"iana\"},\"application/p21+zip\":{source:\"iana\",compressible:!1},\"application/p2p-overlay+xml\":{source:\"iana\",compressible:!0,extensions:[\"relo\"]},\"application/parityfec\":{source:\"iana\"},\"application/passport\":{source:\"iana\"},\"application/patch-ops-error+xml\":{source:\"iana\",compressible:!0,extensions:[\"xer\"]},\"application/pdf\":{source:\"iana\",compressible:!1,extensions:[\"pdf\"]},\"application/pdx\":{source:\"iana\"},\"application/pem-certificate-chain\":{source:\"iana\"},\"application/pgp-encrypted\":{source:\"iana\",compressible:!1,extensions:[\"pgp\"]},\"application/pgp-keys\":{source:\"iana\",extensions:[\"asc\"]},\"application/pgp-signature\":{source:\"iana\",extensions:[\"sig\",\"asc\"]},\"application/pics-rules\":{source:\"apache\",extensions:[\"prf\"]},\"application/pidf+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/pidf-diff+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/pkcs10\":{source:\"iana\",extensions:[\"p10\"]},\"application/pkcs12\":{source:\"iana\"},\"application/pkcs7-mime\":{source:\"iana\",extensions:[\"p7m\",\"p7c\"]},\"application/pkcs7-signature\":{source:\"iana\",extensions:[\"p7s\"]},\"application/pkcs8\":{source:\"iana\",extensions:[\"p8\"]},\"application/pkcs8-encrypted\":{source:\"iana\"},\"application/pkix-attr-cert\":{source:\"iana\",extensions:[\"ac\"]},\"application/pkix-cert\":{source:\"iana\",extensions:[\"cer\"]},\"application/pkix-crl\":{source:\"iana\",extensions:[\"crl\"]},\"application/pkix-pkipath\":{source:\"iana\",extensions:[\"pkipath\"]},\"application/pkixcmp\":{source:\"iana\",extensions:[\"pki\"]},\"application/pls+xml\":{source:\"iana\",compressible:!0,extensions:[\"pls\"]},\"application/poc-settings+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/postscript\":{source:\"iana\",compressible:!0,extensions:[\"ai\",\"eps\",\"ps\"]},\"application/ppsp-tracker+json\":{source:\"iana\",compressible:!0},\"application/private-token-issuer-directory\":{source:\"iana\"},\"application/private-token-request\":{source:\"iana\"},\"application/private-token-response\":{source:\"iana\"},\"application/problem+json\":{source:\"iana\",compressible:!0},\"application/problem+xml\":{source:\"iana\",compressible:!0},\"application/provenance+xml\":{source:\"iana\",compressible:!0,extensions:[\"provx\"]},\"application/prs.alvestrand.titrax-sheet\":{source:\"iana\"},\"application/prs.cww\":{source:\"iana\",extensions:[\"cww\"]},\"application/prs.cyn\":{source:\"iana\",charset:\"7-BIT\"},\"application/prs.hpub+zip\":{source:\"iana\",compressible:!1},\"application/prs.implied-document+xml\":{source:\"iana\",compressible:!0},\"application/prs.implied-executable\":{source:\"iana\"},\"application/prs.implied-object+json\":{source:\"iana\",compressible:!0},\"application/prs.implied-object+json-seq\":{source:\"iana\"},\"application/prs.implied-object+yaml\":{source:\"iana\"},\"application/prs.implied-structure\":{source:\"iana\"},\"application/prs.nprend\":{source:\"iana\"},\"application/prs.plucker\":{source:\"iana\"},\"application/prs.rdf-xml-crypt\":{source:\"iana\"},\"application/prs.vcfbzip2\":{source:\"iana\"},\"application/prs.xsf+xml\":{source:\"iana\",compressible:!0,extensions:[\"xsf\"]},\"application/pskc+xml\":{source:\"iana\",compressible:!0,extensions:[\"pskcxml\"]},\"application/pvd+json\":{source:\"iana\",compressible:!0},\"application/qsig\":{source:\"iana\"},\"application/raml+yaml\":{compressible:!0,extensions:[\"raml\"]},\"application/raptorfec\":{source:\"iana\"},\"application/rdap+json\":{source:\"iana\",compressible:!0},\"application/rdf+xml\":{source:\"iana\",compressible:!0,extensions:[\"rdf\",\"owl\"]},\"application/reginfo+xml\":{source:\"iana\",compressible:!0,extensions:[\"rif\"]},\"application/relax-ng-compact-syntax\":{source:\"iana\",extensions:[\"rnc\"]},\"application/remote-printing\":{source:\"apache\"},\"application/reputon+json\":{source:\"iana\",compressible:!0},\"application/resource-lists+xml\":{source:\"iana\",compressible:!0,extensions:[\"rl\"]},\"application/resource-lists-diff+xml\":{source:\"iana\",compressible:!0,extensions:[\"rld\"]},\"application/rfc+xml\":{source:\"iana\",compressible:!0},\"application/riscos\":{source:\"iana\"},\"application/rlmi+xml\":{source:\"iana\",compressible:!0},\"application/rls-services+xml\":{source:\"iana\",compressible:!0,extensions:[\"rs\"]},\"application/route-apd+xml\":{source:\"iana\",compressible:!0,extensions:[\"rapd\"]},\"application/route-s-tsid+xml\":{source:\"iana\",compressible:!0,extensions:[\"sls\"]},\"application/route-usd+xml\":{source:\"iana\",compressible:!0,extensions:[\"rusd\"]},\"application/rpki-checklist\":{source:\"iana\"},\"application/rpki-ghostbusters\":{source:\"iana\",extensions:[\"gbr\"]},\"application/rpki-manifest\":{source:\"iana\",extensions:[\"mft\"]},\"application/rpki-publication\":{source:\"iana\"},\"application/rpki-roa\":{source:\"iana\",extensions:[\"roa\"]},\"application/rpki-signed-tal\":{source:\"iana\"},\"application/rpki-updown\":{source:\"iana\"},\"application/rsd+xml\":{source:\"apache\",compressible:!0,extensions:[\"rsd\"]},\"application/rss+xml\":{source:\"apache\",compressible:!0,extensions:[\"rss\"]},\"application/rtf\":{source:\"iana\",compressible:!0,extensions:[\"rtf\"]},\"application/rtploopback\":{source:\"iana\"},\"application/rtx\":{source:\"iana\"},\"application/samlassertion+xml\":{source:\"iana\",compressible:!0},\"application/samlmetadata+xml\":{source:\"iana\",compressible:!0},\"application/sarif+json\":{source:\"iana\",compressible:!0},\"application/sarif-external-properties+json\":{source:\"iana\",compressible:!0},\"application/sbe\":{source:\"iana\"},\"application/sbml+xml\":{source:\"iana\",compressible:!0,extensions:[\"sbml\"]},\"application/scaip+xml\":{source:\"iana\",compressible:!0},\"application/scim+json\":{source:\"iana\",compressible:!0},\"application/scvp-cv-request\":{source:\"iana\",extensions:[\"scq\"]},\"application/scvp-cv-response\":{source:\"iana\",extensions:[\"scs\"]},\"application/scvp-vp-request\":{source:\"iana\",extensions:[\"spq\"]},\"application/scvp-vp-response\":{source:\"iana\",extensions:[\"spp\"]},\"application/sdp\":{source:\"iana\",extensions:[\"sdp\"]},\"application/secevent+jwt\":{source:\"iana\"},\"application/senml+cbor\":{source:\"iana\"},\"application/senml+json\":{source:\"iana\",compressible:!0},\"application/senml+xml\":{source:\"iana\",compressible:!0,extensions:[\"senmlx\"]},\"application/senml-etch+cbor\":{source:\"iana\"},\"application/senml-etch+json\":{source:\"iana\",compressible:!0},\"application/senml-exi\":{source:\"iana\"},\"application/sensml+cbor\":{source:\"iana\"},\"application/sensml+json\":{source:\"iana\",compressible:!0},\"application/sensml+xml\":{source:\"iana\",compressible:!0,extensions:[\"sensmlx\"]},\"application/sensml-exi\":{source:\"iana\"},\"application/sep+xml\":{source:\"iana\",compressible:!0},\"application/sep-exi\":{source:\"iana\"},\"application/session-info\":{source:\"iana\"},\"application/set-payment\":{source:\"iana\"},\"application/set-payment-initiation\":{source:\"iana\",extensions:[\"setpay\"]},\"application/set-registration\":{source:\"iana\"},\"application/set-registration-initiation\":{source:\"iana\",extensions:[\"setreg\"]},\"application/sgml\":{source:\"iana\"},\"application/sgml-open-catalog\":{source:\"iana\"},\"application/shf+xml\":{source:\"iana\",compressible:!0,extensions:[\"shf\"]},\"application/sieve\":{source:\"iana\",extensions:[\"siv\",\"sieve\"]},\"application/simple-filter+xml\":{source:\"iana\",compressible:!0},\"application/simple-message-summary\":{source:\"iana\"},\"application/simplesymbolcontainer\":{source:\"iana\"},\"application/sipc\":{source:\"iana\"},\"application/slate\":{source:\"iana\"},\"application/smil\":{source:\"apache\"},\"application/smil+xml\":{source:\"iana\",compressible:!0,extensions:[\"smi\",\"smil\"]},\"application/smpte336m\":{source:\"iana\"},\"application/soap+fastinfoset\":{source:\"iana\"},\"application/soap+xml\":{source:\"iana\",compressible:!0},\"application/sparql-query\":{source:\"iana\",extensions:[\"rq\"]},\"application/sparql-results+xml\":{source:\"iana\",compressible:!0,extensions:[\"srx\"]},\"application/spdx+json\":{source:\"iana\",compressible:!0},\"application/spirits-event+xml\":{source:\"iana\",compressible:!0},\"application/sql\":{source:\"iana\",extensions:[\"sql\"]},\"application/srgs\":{source:\"iana\",extensions:[\"gram\"]},\"application/srgs+xml\":{source:\"iana\",compressible:!0,extensions:[\"grxml\"]},\"application/sru+xml\":{source:\"iana\",compressible:!0,extensions:[\"sru\"]},\"application/ssdl+xml\":{source:\"apache\",compressible:!0,extensions:[\"ssdl\"]},\"application/ssml+xml\":{source:\"iana\",compressible:!0,extensions:[\"ssml\"]},\"application/st2110-41\":{source:\"iana\"},\"application/stix+json\":{source:\"iana\",compressible:!0},\"application/stratum\":{source:\"iana\"},\"application/swid+cbor\":{source:\"iana\"},\"application/swid+xml\":{source:\"iana\",compressible:!0,extensions:[\"swidtag\"]},\"application/tamp-apex-update\":{source:\"iana\"},\"application/tamp-apex-update-confirm\":{source:\"iana\"},\"application/tamp-community-update\":{source:\"iana\"},\"application/tamp-community-update-confirm\":{source:\"iana\"},\"application/tamp-error\":{source:\"iana\"},\"application/tamp-sequence-adjust\":{source:\"iana\"},\"application/tamp-sequence-adjust-confirm\":{source:\"iana\"},\"application/tamp-status-query\":{source:\"iana\"},\"application/tamp-status-response\":{source:\"iana\"},\"application/tamp-update\":{source:\"iana\"},\"application/tamp-update-confirm\":{source:\"iana\"},\"application/tar\":{compressible:!0},\"application/taxii+json\":{source:\"iana\",compressible:!0},\"application/td+json\":{source:\"iana\",compressible:!0},\"application/tei+xml\":{source:\"iana\",compressible:!0,extensions:[\"tei\",\"teicorpus\"]},\"application/tetra_isi\":{source:\"iana\"},\"application/thraud+xml\":{source:\"iana\",compressible:!0,extensions:[\"tfi\"]},\"application/timestamp-query\":{source:\"iana\"},\"application/timestamp-reply\":{source:\"iana\"},\"application/timestamped-data\":{source:\"iana\",extensions:[\"tsd\"]},\"application/tlsrpt+gzip\":{source:\"iana\"},\"application/tlsrpt+json\":{source:\"iana\",compressible:!0},\"application/tm+json\":{source:\"iana\",compressible:!0},\"application/tnauthlist\":{source:\"iana\"},\"application/token-introspection+jwt\":{source:\"iana\"},\"application/toml\":{compressible:!0,extensions:[\"toml\"]},\"application/trickle-ice-sdpfrag\":{source:\"iana\"},\"application/trig\":{source:\"iana\",extensions:[\"trig\"]},\"application/ttml+xml\":{source:\"iana\",compressible:!0,extensions:[\"ttml\"]},\"application/tve-trigger\":{source:\"iana\"},\"application/tzif\":{source:\"iana\"},\"application/tzif-leap\":{source:\"iana\"},\"application/ubjson\":{compressible:!1,extensions:[\"ubj\"]},\"application/ulpfec\":{source:\"iana\"},\"application/urc-grpsheet+xml\":{source:\"iana\",compressible:!0},\"application/urc-ressheet+xml\":{source:\"iana\",compressible:!0,extensions:[\"rsheet\"]},\"application/urc-targetdesc+xml\":{source:\"iana\",compressible:!0,extensions:[\"td\"]},\"application/urc-uisocketdesc+xml\":{source:\"iana\",compressible:!0},\"application/vc\":{source:\"iana\"},\"application/vcard+json\":{source:\"iana\",compressible:!0},\"application/vcard+xml\":{source:\"iana\",compressible:!0},\"application/vemmi\":{source:\"iana\"},\"application/vividence.scriptfile\":{source:\"apache\"},\"application/vnd.1000minds.decision-model+xml\":{source:\"iana\",compressible:!0,extensions:[\"1km\"]},\"application/vnd.1ob\":{source:\"iana\"},\"application/vnd.3gpp-prose+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp-prose-pc3a+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp-prose-pc3ach+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp-prose-pc3ch+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp-prose-pc8+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp-v2x-local-service-information\":{source:\"iana\"},\"application/vnd.3gpp.5gnas\":{source:\"iana\"},\"application/vnd.3gpp.5gsa2x\":{source:\"iana\"},\"application/vnd.3gpp.5gsa2x-local-service-information\":{source:\"iana\"},\"application/vnd.3gpp.access-transfer-events+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.bsf+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.crs+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.current-location-discovery+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.gmop+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.gtpc\":{source:\"iana\"},\"application/vnd.3gpp.interworking-data\":{source:\"iana\"},\"application/vnd.3gpp.lpp\":{source:\"iana\"},\"application/vnd.3gpp.mc-signalling-ear\":{source:\"iana\"},\"application/vnd.3gpp.mcdata-affiliation-command+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-payload\":{source:\"iana\"},\"application/vnd.3gpp.mcdata-regroup+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-service-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-signalling\":{source:\"iana\"},\"application/vnd.3gpp.mcdata-ue-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcdata-user-profile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-affiliation-command+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-floor-request+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-location-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-mbms-usage-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-regroup+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-service-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-signed+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-ue-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-ue-init-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcptt-user-profile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-affiliation-command+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-location-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-mbms-usage-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-regroup+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-service-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-transmission-request+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-ue-config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mcvideo-user-profile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.mid-call+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.ngap\":{source:\"iana\"},\"application/vnd.3gpp.pfcp\":{source:\"iana\"},\"application/vnd.3gpp.pic-bw-large\":{source:\"iana\",extensions:[\"plb\"]},\"application/vnd.3gpp.pic-bw-small\":{source:\"iana\",extensions:[\"psb\"]},\"application/vnd.3gpp.pic-bw-var\":{source:\"iana\",extensions:[\"pvb\"]},\"application/vnd.3gpp.pinapp-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.s1ap\":{source:\"iana\"},\"application/vnd.3gpp.seal-group-doc+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-location-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-mbms-usage-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-network-qos-management-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-ue-config-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-unicast-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.seal-user-profile-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.sms\":{source:\"iana\"},\"application/vnd.3gpp.sms+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.srvcc-ext+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.srvcc-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.state-and-event-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.ussd+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp.v2x\":{source:\"iana\"},\"application/vnd.3gpp.vae-info+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp2.bcmcsinfo+xml\":{source:\"iana\",compressible:!0},\"application/vnd.3gpp2.sms\":{source:\"iana\"},\"application/vnd.3gpp2.tcap\":{source:\"iana\",extensions:[\"tcap\"]},\"application/vnd.3lightssoftware.imagescal\":{source:\"iana\"},\"application/vnd.3m.post-it-notes\":{source:\"iana\",extensions:[\"pwn\"]},\"application/vnd.accpac.simply.aso\":{source:\"iana\",extensions:[\"aso\"]},\"application/vnd.accpac.simply.imp\":{source:\"iana\",extensions:[\"imp\"]},\"application/vnd.acm.addressxfer+json\":{source:\"iana\",compressible:!0},\"application/vnd.acm.chatbot+json\":{source:\"iana\",compressible:!0},\"application/vnd.acucobol\":{source:\"iana\",extensions:[\"acu\"]},\"application/vnd.acucorp\":{source:\"iana\",extensions:[\"atc\",\"acutc\"]},\"application/vnd.adobe.air-application-installer-package+zip\":{source:\"apache\",compressible:!1,extensions:[\"air\"]},\"application/vnd.adobe.flash.movie\":{source:\"iana\"},\"application/vnd.adobe.formscentral.fcdt\":{source:\"iana\",extensions:[\"fcdt\"]},\"application/vnd.adobe.fxp\":{source:\"iana\",extensions:[\"fxp\",\"fxpl\"]},\"application/vnd.adobe.partial-upload\":{source:\"iana\"},\"application/vnd.adobe.xdp+xml\":{source:\"iana\",compressible:!0,extensions:[\"xdp\"]},\"application/vnd.adobe.xfdf\":{source:\"apache\",extensions:[\"xfdf\"]},\"application/vnd.aether.imp\":{source:\"iana\"},\"application/vnd.afpc.afplinedata\":{source:\"iana\"},\"application/vnd.afpc.afplinedata-pagedef\":{source:\"iana\"},\"application/vnd.afpc.cmoca-cmresource\":{source:\"iana\"},\"application/vnd.afpc.foca-charset\":{source:\"iana\"},\"application/vnd.afpc.foca-codedfont\":{source:\"iana\"},\"application/vnd.afpc.foca-codepage\":{source:\"iana\"},\"application/vnd.afpc.modca\":{source:\"iana\"},\"application/vnd.afpc.modca-cmtable\":{source:\"iana\"},\"application/vnd.afpc.modca-formdef\":{source:\"iana\"},\"application/vnd.afpc.modca-mediummap\":{source:\"iana\"},\"application/vnd.afpc.modca-objectcontainer\":{source:\"iana\"},\"application/vnd.afpc.modca-overlay\":{source:\"iana\"},\"application/vnd.afpc.modca-pagesegment\":{source:\"iana\"},\"application/vnd.age\":{source:\"iana\",extensions:[\"age\"]},\"application/vnd.ah-barcode\":{source:\"apache\"},\"application/vnd.ahead.space\":{source:\"iana\",extensions:[\"ahead\"]},\"application/vnd.airzip.filesecure.azf\":{source:\"iana\",extensions:[\"azf\"]},\"application/vnd.airzip.filesecure.azs\":{source:\"iana\",extensions:[\"azs\"]},\"application/vnd.amadeus+json\":{source:\"iana\",compressible:!0},\"application/vnd.amazon.ebook\":{source:\"apache\",extensions:[\"azw\"]},\"application/vnd.amazon.mobi8-ebook\":{source:\"iana\"},\"application/vnd.americandynamics.acc\":{source:\"iana\",extensions:[\"acc\"]},\"application/vnd.amiga.ami\":{source:\"iana\",extensions:[\"ami\"]},\"application/vnd.amundsen.maze+xml\":{source:\"iana\",compressible:!0},\"application/vnd.android.ota\":{source:\"iana\"},\"application/vnd.android.package-archive\":{source:\"apache\",compressible:!1,extensions:[\"apk\"]},\"application/vnd.anki\":{source:\"iana\"},\"application/vnd.anser-web-certificate-issue-initiation\":{source:\"iana\",extensions:[\"cii\"]},\"application/vnd.anser-web-funds-transfer-initiation\":{source:\"apache\",extensions:[\"fti\"]},\"application/vnd.antix.game-component\":{source:\"iana\",extensions:[\"atx\"]},\"application/vnd.apache.arrow.file\":{source:\"iana\"},\"application/vnd.apache.arrow.stream\":{source:\"iana\"},\"application/vnd.apache.parquet\":{source:\"iana\"},\"application/vnd.apache.thrift.binary\":{source:\"iana\"},\"application/vnd.apache.thrift.compact\":{source:\"iana\"},\"application/vnd.apache.thrift.json\":{source:\"iana\"},\"application/vnd.apexlang\":{source:\"iana\"},\"application/vnd.api+json\":{source:\"iana\",compressible:!0},\"application/vnd.aplextor.warrp+json\":{source:\"iana\",compressible:!0},\"application/vnd.apothekende.reservation+json\":{source:\"iana\",compressible:!0},\"application/vnd.apple.installer+xml\":{source:\"iana\",compressible:!0,extensions:[\"mpkg\"]},\"application/vnd.apple.keynote\":{source:\"iana\",extensions:[\"key\"]},\"application/vnd.apple.mpegurl\":{source:\"iana\",extensions:[\"m3u8\"]},\"application/vnd.apple.numbers\":{source:\"iana\",extensions:[\"numbers\"]},\"application/vnd.apple.pages\":{source:\"iana\",extensions:[\"pages\"]},\"application/vnd.apple.pkpass\":{compressible:!1,extensions:[\"pkpass\"]},\"application/vnd.arastra.swi\":{source:\"apache\"},\"application/vnd.aristanetworks.swi\":{source:\"iana\",extensions:[\"swi\"]},\"application/vnd.artisan+json\":{source:\"iana\",compressible:!0},\"application/vnd.artsquare\":{source:\"iana\"},\"application/vnd.astraea-software.iota\":{source:\"iana\",extensions:[\"iota\"]},\"application/vnd.audiograph\":{source:\"iana\",extensions:[\"aep\"]},\"application/vnd.autopackage\":{source:\"iana\"},\"application/vnd.avalon+json\":{source:\"iana\",compressible:!0},\"application/vnd.avistar+xml\":{source:\"iana\",compressible:!0},\"application/vnd.balsamiq.bmml+xml\":{source:\"iana\",compressible:!0,extensions:[\"bmml\"]},\"application/vnd.balsamiq.bmpr\":{source:\"iana\"},\"application/vnd.banana-accounting\":{source:\"iana\"},\"application/vnd.bbf.usp.error\":{source:\"iana\"},\"application/vnd.bbf.usp.msg\":{source:\"iana\"},\"application/vnd.bbf.usp.msg+json\":{source:\"iana\",compressible:!0},\"application/vnd.bekitzur-stech+json\":{source:\"iana\",compressible:!0},\"application/vnd.belightsoft.lhzd+zip\":{source:\"iana\",compressible:!1},\"application/vnd.belightsoft.lhzl+zip\":{source:\"iana\",compressible:!1},\"application/vnd.bint.med-content\":{source:\"iana\"},\"application/vnd.biopax.rdf+xml\":{source:\"iana\",compressible:!0},\"application/vnd.blink-idb-value-wrapper\":{source:\"iana\"},\"application/vnd.blueice.multipass\":{source:\"iana\",extensions:[\"mpm\"]},\"application/vnd.bluetooth.ep.oob\":{source:\"iana\"},\"application/vnd.bluetooth.le.oob\":{source:\"iana\"},\"application/vnd.bmi\":{source:\"iana\",extensions:[\"bmi\"]},\"application/vnd.bpf\":{source:\"iana\"},\"application/vnd.bpf3\":{source:\"iana\"},\"application/vnd.businessobjects\":{source:\"iana\",extensions:[\"rep\"]},\"application/vnd.byu.uapi+json\":{source:\"iana\",compressible:!0},\"application/vnd.bzip3\":{source:\"iana\"},\"application/vnd.c3voc.schedule+xml\":{source:\"iana\",compressible:!0},\"application/vnd.cab-jscript\":{source:\"iana\"},\"application/vnd.canon-cpdl\":{source:\"iana\"},\"application/vnd.canon-lips\":{source:\"iana\"},\"application/vnd.capasystems-pg+json\":{source:\"iana\",compressible:!0},\"application/vnd.cendio.thinlinc.clientconf\":{source:\"iana\"},\"application/vnd.century-systems.tcp_stream\":{source:\"iana\"},\"application/vnd.chemdraw+xml\":{source:\"iana\",compressible:!0,extensions:[\"cdxml\"]},\"application/vnd.chess-pgn\":{source:\"iana\"},\"application/vnd.chipnuts.karaoke-mmd\":{source:\"iana\",extensions:[\"mmd\"]},\"application/vnd.ciedi\":{source:\"iana\"},\"application/vnd.cinderella\":{source:\"iana\",extensions:[\"cdy\"]},\"application/vnd.cirpack.isdn-ext\":{source:\"iana\"},\"application/vnd.citationstyles.style+xml\":{source:\"iana\",compressible:!0,extensions:[\"csl\"]},\"application/vnd.claymore\":{source:\"iana\",extensions:[\"cla\"]},\"application/vnd.cloanto.rp9\":{source:\"iana\",extensions:[\"rp9\"]},\"application/vnd.clonk.c4group\":{source:\"iana\",extensions:[\"c4g\",\"c4d\",\"c4f\",\"c4p\",\"c4u\"]},\"application/vnd.cluetrust.cartomobile-config\":{source:\"iana\",extensions:[\"c11amc\"]},\"application/vnd.cluetrust.cartomobile-config-pkg\":{source:\"iana\",extensions:[\"c11amz\"]},\"application/vnd.cncf.helm.chart.content.v1.tar+gzip\":{source:\"iana\"},\"application/vnd.cncf.helm.chart.provenance.v1.prov\":{source:\"iana\"},\"application/vnd.cncf.helm.config.v1+json\":{source:\"iana\",compressible:!0},\"application/vnd.coffeescript\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.document\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.document-template\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.presentation\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.presentation-template\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.spreadsheet\":{source:\"iana\"},\"application/vnd.collabio.xodocuments.spreadsheet-template\":{source:\"iana\"},\"application/vnd.collection+json\":{source:\"iana\",compressible:!0},\"application/vnd.collection.doc+json\":{source:\"iana\",compressible:!0},\"application/vnd.collection.next+json\":{source:\"iana\",compressible:!0},\"application/vnd.comicbook+zip\":{source:\"iana\",compressible:!1},\"application/vnd.comicbook-rar\":{source:\"iana\"},\"application/vnd.commerce-battelle\":{source:\"iana\"},\"application/vnd.commonspace\":{source:\"iana\",extensions:[\"csp\"]},\"application/vnd.contact.cmsg\":{source:\"iana\",extensions:[\"cdbcmsg\"]},\"application/vnd.coreos.ignition+json\":{source:\"iana\",compressible:!0},\"application/vnd.cosmocaller\":{source:\"iana\",extensions:[\"cmc\"]},\"application/vnd.crick.clicker\":{source:\"iana\",extensions:[\"clkx\"]},\"application/vnd.crick.clicker.keyboard\":{source:\"iana\",extensions:[\"clkk\"]},\"application/vnd.crick.clicker.palette\":{source:\"iana\",extensions:[\"clkp\"]},\"application/vnd.crick.clicker.template\":{source:\"iana\",extensions:[\"clkt\"]},\"application/vnd.crick.clicker.wordbank\":{source:\"iana\",extensions:[\"clkw\"]},\"application/vnd.criticaltools.wbs+xml\":{source:\"iana\",compressible:!0,extensions:[\"wbs\"]},\"application/vnd.cryptii.pipe+json\":{source:\"iana\",compressible:!0},\"application/vnd.crypto-shade-file\":{source:\"iana\"},\"application/vnd.cryptomator.encrypted\":{source:\"iana\"},\"application/vnd.cryptomator.vault\":{source:\"iana\"},\"application/vnd.ctc-posml\":{source:\"iana\",extensions:[\"pml\"]},\"application/vnd.ctct.ws+xml\":{source:\"iana\",compressible:!0},\"application/vnd.cups-pdf\":{source:\"iana\"},\"application/vnd.cups-postscript\":{source:\"iana\"},\"application/vnd.cups-ppd\":{source:\"iana\",extensions:[\"ppd\"]},\"application/vnd.cups-raster\":{source:\"iana\"},\"application/vnd.cups-raw\":{source:\"iana\"},\"application/vnd.curl\":{source:\"iana\"},\"application/vnd.curl.car\":{source:\"apache\",extensions:[\"car\"]},\"application/vnd.curl.pcurl\":{source:\"apache\",extensions:[\"pcurl\"]},\"application/vnd.cyan.dean.root+xml\":{source:\"iana\",compressible:!0},\"application/vnd.cybank\":{source:\"iana\"},\"application/vnd.cyclonedx+json\":{source:\"iana\",compressible:!0},\"application/vnd.cyclonedx+xml\":{source:\"iana\",compressible:!0},\"application/vnd.d2l.coursepackage1p0+zip\":{source:\"iana\",compressible:!1},\"application/vnd.d3m-dataset\":{source:\"iana\"},\"application/vnd.d3m-problem\":{source:\"iana\"},\"application/vnd.dart\":{source:\"iana\",compressible:!0,extensions:[\"dart\"]},\"application/vnd.data-vision.rdz\":{source:\"iana\",extensions:[\"rdz\"]},\"application/vnd.datalog\":{source:\"iana\"},\"application/vnd.datapackage+json\":{source:\"iana\",compressible:!0},\"application/vnd.dataresource+json\":{source:\"iana\",compressible:!0},\"application/vnd.dbf\":{source:\"iana\",extensions:[\"dbf\"]},\"application/vnd.debian.binary-package\":{source:\"iana\"},\"application/vnd.dece.data\":{source:\"iana\",extensions:[\"uvf\",\"uvvf\",\"uvd\",\"uvvd\"]},\"application/vnd.dece.ttml+xml\":{source:\"iana\",compressible:!0,extensions:[\"uvt\",\"uvvt\"]},\"application/vnd.dece.unspecified\":{source:\"iana\",extensions:[\"uvx\",\"uvvx\"]},\"application/vnd.dece.zip\":{source:\"iana\",extensions:[\"uvz\",\"uvvz\"]},\"application/vnd.denovo.fcselayout-link\":{source:\"iana\",extensions:[\"fe_launch\"]},\"application/vnd.desmume.movie\":{source:\"iana\"},\"application/vnd.dir-bi.plate-dl-nosuffix\":{source:\"iana\"},\"application/vnd.dm.delegation+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dna\":{source:\"iana\",extensions:[\"dna\"]},\"application/vnd.document+json\":{source:\"iana\",compressible:!0},\"application/vnd.dolby.mlp\":{source:\"apache\",extensions:[\"mlp\"]},\"application/vnd.dolby.mobile.1\":{source:\"iana\"},\"application/vnd.dolby.mobile.2\":{source:\"iana\"},\"application/vnd.doremir.scorecloud-binary-document\":{source:\"iana\"},\"application/vnd.dpgraph\":{source:\"iana\",extensions:[\"dpg\"]},\"application/vnd.dreamfactory\":{source:\"iana\",extensions:[\"dfac\"]},\"application/vnd.drive+json\":{source:\"iana\",compressible:!0},\"application/vnd.ds-keypoint\":{source:\"apache\",extensions:[\"kpxx\"]},\"application/vnd.dtg.local\":{source:\"iana\"},\"application/vnd.dtg.local.flash\":{source:\"iana\"},\"application/vnd.dtg.local.html\":{source:\"iana\"},\"application/vnd.dvb.ait\":{source:\"iana\",extensions:[\"ait\"]},\"application/vnd.dvb.dvbisl+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.dvbj\":{source:\"iana\"},\"application/vnd.dvb.esgcontainer\":{source:\"iana\"},\"application/vnd.dvb.ipdcdftnotifaccess\":{source:\"iana\"},\"application/vnd.dvb.ipdcesgaccess\":{source:\"iana\"},\"application/vnd.dvb.ipdcesgaccess2\":{source:\"iana\"},\"application/vnd.dvb.ipdcesgpdd\":{source:\"iana\"},\"application/vnd.dvb.ipdcroaming\":{source:\"iana\"},\"application/vnd.dvb.iptv.alfec-base\":{source:\"iana\"},\"application/vnd.dvb.iptv.alfec-enhancement\":{source:\"iana\"},\"application/vnd.dvb.notif-aggregate-root+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-container+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-generic+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-ia-msglist+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-ia-registration-request+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-ia-registration-response+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.notif-init+xml\":{source:\"iana\",compressible:!0},\"application/vnd.dvb.pfr\":{source:\"iana\"},\"application/vnd.dvb.service\":{source:\"iana\",extensions:[\"svc\"]},\"application/vnd.dxr\":{source:\"iana\"},\"application/vnd.dynageo\":{source:\"iana\",extensions:[\"geo\"]},\"application/vnd.dzr\":{source:\"iana\"},\"application/vnd.easykaraoke.cdgdownload\":{source:\"iana\"},\"application/vnd.ecdis-update\":{source:\"iana\"},\"application/vnd.ecip.rlp\":{source:\"iana\"},\"application/vnd.eclipse.ditto+json\":{source:\"iana\",compressible:!0},\"application/vnd.ecowin.chart\":{source:\"iana\",extensions:[\"mag\"]},\"application/vnd.ecowin.filerequest\":{source:\"iana\"},\"application/vnd.ecowin.fileupdate\":{source:\"iana\"},\"application/vnd.ecowin.series\":{source:\"iana\"},\"application/vnd.ecowin.seriesrequest\":{source:\"iana\"},\"application/vnd.ecowin.seriesupdate\":{source:\"iana\"},\"application/vnd.efi.img\":{source:\"iana\"},\"application/vnd.efi.iso\":{source:\"iana\"},\"application/vnd.eln+zip\":{source:\"iana\",compressible:!1},\"application/vnd.emclient.accessrequest+xml\":{source:\"iana\",compressible:!0},\"application/vnd.enliven\":{source:\"iana\",extensions:[\"nml\"]},\"application/vnd.enphase.envoy\":{source:\"iana\"},\"application/vnd.eprints.data+xml\":{source:\"iana\",compressible:!0},\"application/vnd.epson.esf\":{source:\"iana\",extensions:[\"esf\"]},\"application/vnd.epson.msf\":{source:\"iana\",extensions:[\"msf\"]},\"application/vnd.epson.quickanime\":{source:\"iana\",extensions:[\"qam\"]},\"application/vnd.epson.salt\":{source:\"iana\",extensions:[\"slt\"]},\"application/vnd.epson.ssf\":{source:\"iana\",extensions:[\"ssf\"]},\"application/vnd.ericsson.quickcall\":{source:\"iana\"},\"application/vnd.erofs\":{source:\"iana\"},\"application/vnd.espass-espass+zip\":{source:\"iana\",compressible:!1},\"application/vnd.eszigno3+xml\":{source:\"iana\",compressible:!0,extensions:[\"es3\",\"et3\"]},\"application/vnd.etsi.aoc+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.asic-e+zip\":{source:\"iana\",compressible:!1},\"application/vnd.etsi.asic-s+zip\":{source:\"iana\",compressible:!1},\"application/vnd.etsi.cug+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvcommand+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvdiscovery+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvprofile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvsad-bc+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvsad-cod+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvsad-npvr+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvservice+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvsync+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.iptvueprofile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.mcid+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.mheg5\":{source:\"iana\"},\"application/vnd.etsi.overload-control-policy-dataset+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.pstn+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.sci+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.simservs+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.timestamp-token\":{source:\"iana\"},\"application/vnd.etsi.tsl+xml\":{source:\"iana\",compressible:!0},\"application/vnd.etsi.tsl.der\":{source:\"iana\"},\"application/vnd.eu.kasparian.car+json\":{source:\"iana\",compressible:!0},\"application/vnd.eudora.data\":{source:\"iana\"},\"application/vnd.evolv.ecig.profile\":{source:\"iana\"},\"application/vnd.evolv.ecig.settings\":{source:\"iana\"},\"application/vnd.evolv.ecig.theme\":{source:\"iana\"},\"application/vnd.exstream-empower+zip\":{source:\"iana\",compressible:!1},\"application/vnd.exstream-package\":{source:\"iana\"},\"application/vnd.ezpix-album\":{source:\"iana\",extensions:[\"ez2\"]},\"application/vnd.ezpix-package\":{source:\"iana\",extensions:[\"ez3\"]},\"application/vnd.f-secure.mobile\":{source:\"iana\"},\"application/vnd.familysearch.gedcom+zip\":{source:\"iana\",compressible:!1},\"application/vnd.fastcopy-disk-image\":{source:\"iana\"},\"application/vnd.fdf\":{source:\"apache\",extensions:[\"fdf\"]},\"application/vnd.fdsn.mseed\":{source:\"iana\",extensions:[\"mseed\"]},\"application/vnd.fdsn.seed\":{source:\"iana\",extensions:[\"seed\",\"dataless\"]},\"application/vnd.ffsns\":{source:\"iana\"},\"application/vnd.ficlab.flb+zip\":{source:\"iana\",compressible:!1},\"application/vnd.filmit.zfc\":{source:\"iana\"},\"application/vnd.fints\":{source:\"iana\"},\"application/vnd.firemonkeys.cloudcell\":{source:\"iana\"},\"application/vnd.flographit\":{source:\"iana\",extensions:[\"gph\"]},\"application/vnd.fluxtime.clip\":{source:\"iana\",extensions:[\"ftc\"]},\"application/vnd.font-fontforge-sfd\":{source:\"iana\"},\"application/vnd.framemaker\":{source:\"iana\",extensions:[\"fm\",\"frame\",\"maker\",\"book\"]},\"application/vnd.freelog.comic\":{source:\"iana\"},\"application/vnd.frogans.fnc\":{source:\"apache\",extensions:[\"fnc\"]},\"application/vnd.frogans.ltf\":{source:\"apache\",extensions:[\"ltf\"]},\"application/vnd.fsc.weblaunch\":{source:\"iana\",extensions:[\"fsc\"]},\"application/vnd.fujifilm.fb.docuworks\":{source:\"iana\"},\"application/vnd.fujifilm.fb.docuworks.binder\":{source:\"iana\"},\"application/vnd.fujifilm.fb.docuworks.container\":{source:\"iana\"},\"application/vnd.fujifilm.fb.jfi+xml\":{source:\"iana\",compressible:!0},\"application/vnd.fujitsu.oasys\":{source:\"iana\",extensions:[\"oas\"]},\"application/vnd.fujitsu.oasys2\":{source:\"iana\",extensions:[\"oa2\"]},\"application/vnd.fujitsu.oasys3\":{source:\"iana\",extensions:[\"oa3\"]},\"application/vnd.fujitsu.oasysgp\":{source:\"iana\",extensions:[\"fg5\"]},\"application/vnd.fujitsu.oasysprs\":{source:\"iana\",extensions:[\"bh2\"]},\"application/vnd.fujixerox.art-ex\":{source:\"iana\"},\"application/vnd.fujixerox.art4\":{source:\"iana\"},\"application/vnd.fujixerox.ddd\":{source:\"iana\",extensions:[\"ddd\"]},\"application/vnd.fujixerox.docuworks\":{source:\"iana\",extensions:[\"xdw\"]},\"application/vnd.fujixerox.docuworks.binder\":{source:\"iana\",extensions:[\"xbd\"]},\"application/vnd.fujixerox.docuworks.container\":{source:\"iana\"},\"application/vnd.fujixerox.hbpl\":{source:\"iana\"},\"application/vnd.fut-misnet\":{source:\"iana\"},\"application/vnd.futoin+cbor\":{source:\"iana\"},\"application/vnd.futoin+json\":{source:\"iana\",compressible:!0},\"application/vnd.fuzzysheet\":{source:\"iana\",extensions:[\"fzs\"]},\"application/vnd.ga4gh.passport+jwt\":{source:\"iana\"},\"application/vnd.genomatix.tuxedo\":{source:\"iana\",extensions:[\"txd\"]},\"application/vnd.genozip\":{source:\"iana\"},\"application/vnd.gentics.grd+json\":{source:\"iana\",compressible:!0},\"application/vnd.gentoo.catmetadata+xml\":{source:\"iana\",compressible:!0},\"application/vnd.gentoo.ebuild\":{source:\"iana\"},\"application/vnd.gentoo.eclass\":{source:\"iana\"},\"application/vnd.gentoo.gpkg\":{source:\"iana\"},\"application/vnd.gentoo.manifest\":{source:\"iana\"},\"application/vnd.gentoo.pkgmetadata+xml\":{source:\"iana\",compressible:!0},\"application/vnd.gentoo.xpak\":{source:\"iana\"},\"application/vnd.geo+json\":{source:\"apache\",compressible:!0},\"application/vnd.geocube+xml\":{source:\"apache\",compressible:!0},\"application/vnd.geogebra.file\":{source:\"iana\",extensions:[\"ggb\"]},\"application/vnd.geogebra.slides\":{source:\"iana\",extensions:[\"ggs\"]},\"application/vnd.geogebra.tool\":{source:\"iana\",extensions:[\"ggt\"]},\"application/vnd.geometry-explorer\":{source:\"iana\",extensions:[\"gex\",\"gre\"]},\"application/vnd.geonext\":{source:\"iana\",extensions:[\"gxt\"]},\"application/vnd.geoplan\":{source:\"iana\",extensions:[\"g2w\"]},\"application/vnd.geospace\":{source:\"iana\",extensions:[\"g3w\"]},\"application/vnd.gerber\":{source:\"iana\"},\"application/vnd.globalplatform.card-content-mgt\":{source:\"iana\"},\"application/vnd.globalplatform.card-content-mgt-response\":{source:\"iana\"},\"application/vnd.gmx\":{source:\"iana\",extensions:[\"gmx\"]},\"application/vnd.gnu.taler.exchange+json\":{source:\"iana\",compressible:!0},\"application/vnd.gnu.taler.merchant+json\":{source:\"iana\",compressible:!0},\"application/vnd.google-apps.document\":{compressible:!1,extensions:[\"gdoc\"]},\"application/vnd.google-apps.presentation\":{compressible:!1,extensions:[\"gslides\"]},\"application/vnd.google-apps.spreadsheet\":{compressible:!1,extensions:[\"gsheet\"]},\"application/vnd.google-earth.kml+xml\":{source:\"iana\",compressible:!0,extensions:[\"kml\"]},\"application/vnd.google-earth.kmz\":{source:\"iana\",compressible:!1,extensions:[\"kmz\"]},\"application/vnd.gov.sk.e-form+xml\":{source:\"apache\",compressible:!0},\"application/vnd.gov.sk.e-form+zip\":{source:\"iana\",compressible:!1},\"application/vnd.gov.sk.xmldatacontainer+xml\":{source:\"iana\",compressible:!0,extensions:[\"xdcf\"]},\"application/vnd.gpxsee.map+xml\":{source:\"iana\",compressible:!0},\"application/vnd.grafeq\":{source:\"iana\",extensions:[\"gqf\",\"gqs\"]},\"application/vnd.gridmp\":{source:\"iana\"},\"application/vnd.groove-account\":{source:\"iana\",extensions:[\"gac\"]},\"application/vnd.groove-help\":{source:\"iana\",extensions:[\"ghf\"]},\"application/vnd.groove-identity-message\":{source:\"iana\",extensions:[\"gim\"]},\"application/vnd.groove-injector\":{source:\"iana\",extensions:[\"grv\"]},\"application/vnd.groove-tool-message\":{source:\"iana\",extensions:[\"gtm\"]},\"application/vnd.groove-tool-template\":{source:\"iana\",extensions:[\"tpl\"]},\"application/vnd.groove-vcard\":{source:\"iana\",extensions:[\"vcg\"]},\"application/vnd.hal+json\":{source:\"iana\",compressible:!0},\"application/vnd.hal+xml\":{source:\"iana\",compressible:!0,extensions:[\"hal\"]},\"application/vnd.handheld-entertainment+xml\":{source:\"iana\",compressible:!0,extensions:[\"zmm\"]},\"application/vnd.hbci\":{source:\"iana\",extensions:[\"hbci\"]},\"application/vnd.hc+json\":{source:\"iana\",compressible:!0},\"application/vnd.hcl-bireports\":{source:\"iana\"},\"application/vnd.hdt\":{source:\"iana\"},\"application/vnd.heroku+json\":{source:\"iana\",compressible:!0},\"application/vnd.hhe.lesson-player\":{source:\"iana\",extensions:[\"les\"]},\"application/vnd.hp-hpgl\":{source:\"iana\",extensions:[\"hpgl\"]},\"application/vnd.hp-hpid\":{source:\"iana\",extensions:[\"hpid\"]},\"application/vnd.hp-hps\":{source:\"iana\",extensions:[\"hps\"]},\"application/vnd.hp-jlyt\":{source:\"iana\",extensions:[\"jlt\"]},\"application/vnd.hp-pcl\":{source:\"iana\",extensions:[\"pcl\"]},\"application/vnd.hp-pclxl\":{source:\"iana\",extensions:[\"pclxl\"]},\"application/vnd.hsl\":{source:\"iana\"},\"application/vnd.httphone\":{source:\"iana\"},\"application/vnd.hydrostatix.sof-data\":{source:\"iana\",extensions:[\"sfd-hdstx\"]},\"application/vnd.hyper+json\":{source:\"iana\",compressible:!0},\"application/vnd.hyper-item+json\":{source:\"iana\",compressible:!0},\"application/vnd.hyperdrive+json\":{source:\"iana\",compressible:!0},\"application/vnd.hzn-3d-crossword\":{source:\"iana\"},\"application/vnd.ibm.afplinedata\":{source:\"apache\"},\"application/vnd.ibm.electronic-media\":{source:\"iana\"},\"application/vnd.ibm.minipay\":{source:\"iana\",extensions:[\"mpy\"]},\"application/vnd.ibm.modcap\":{source:\"apache\",extensions:[\"afp\",\"listafp\",\"list3820\"]},\"application/vnd.ibm.rights-management\":{source:\"iana\",extensions:[\"irm\"]},\"application/vnd.ibm.secure-container\":{source:\"iana\",extensions:[\"sc\"]},\"application/vnd.iccprofile\":{source:\"iana\",extensions:[\"icc\",\"icm\"]},\"application/vnd.ieee.1905\":{source:\"iana\"},\"application/vnd.igloader\":{source:\"iana\",extensions:[\"igl\"]},\"application/vnd.imagemeter.folder+zip\":{source:\"iana\",compressible:!1},\"application/vnd.imagemeter.image+zip\":{source:\"iana\",compressible:!1},\"application/vnd.immervision-ivp\":{source:\"iana\",extensions:[\"ivp\"]},\"application/vnd.immervision-ivu\":{source:\"iana\",extensions:[\"ivu\"]},\"application/vnd.ims.imsccv1p1\":{source:\"iana\"},\"application/vnd.ims.imsccv1p2\":{source:\"iana\"},\"application/vnd.ims.imsccv1p3\":{source:\"iana\"},\"application/vnd.ims.lis.v2.result+json\":{source:\"iana\",compressible:!0},\"application/vnd.ims.lti.v2.toolconsumerprofile+json\":{source:\"iana\",compressible:!0},\"application/vnd.ims.lti.v2.toolproxy+json\":{source:\"iana\",compressible:!0},\"application/vnd.ims.lti.v2.toolproxy.id+json\":{source:\"iana\",compressible:!0},\"application/vnd.ims.lti.v2.toolsettings+json\":{source:\"iana\",compressible:!0},\"application/vnd.ims.lti.v2.toolsettings.simple+json\":{source:\"iana\",compressible:!0},\"application/vnd.informedcontrol.rms+xml\":{source:\"iana\",compressible:!0},\"application/vnd.informix-visionary\":{source:\"apache\"},\"application/vnd.infotech.project\":{source:\"iana\"},\"application/vnd.infotech.project+xml\":{source:\"iana\",compressible:!0},\"application/vnd.innopath.wamp.notification\":{source:\"iana\"},\"application/vnd.insors.igm\":{source:\"iana\",extensions:[\"igm\"]},\"application/vnd.intercon.formnet\":{source:\"iana\",extensions:[\"xpw\",\"xpx\"]},\"application/vnd.intergeo\":{source:\"iana\",extensions:[\"i2g\"]},\"application/vnd.intertrust.digibox\":{source:\"iana\"},\"application/vnd.intertrust.nncp\":{source:\"iana\"},\"application/vnd.intu.qbo\":{source:\"iana\",extensions:[\"qbo\"]},\"application/vnd.intu.qfx\":{source:\"iana\",extensions:[\"qfx\"]},\"application/vnd.ipfs.ipns-record\":{source:\"iana\"},\"application/vnd.ipld.car\":{source:\"iana\"},\"application/vnd.ipld.dag-cbor\":{source:\"iana\"},\"application/vnd.ipld.dag-json\":{source:\"iana\"},\"application/vnd.ipld.raw\":{source:\"iana\"},\"application/vnd.iptc.g2.catalogitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.conceptitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.knowledgeitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.newsitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.newsmessage+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.packageitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.iptc.g2.planningitem+xml\":{source:\"iana\",compressible:!0},\"application/vnd.ipunplugged.rcprofile\":{source:\"iana\",extensions:[\"rcprofile\"]},\"application/vnd.irepository.package+xml\":{source:\"iana\",compressible:!0,extensions:[\"irp\"]},\"application/vnd.is-xpr\":{source:\"iana\",extensions:[\"xpr\"]},\"application/vnd.isac.fcs\":{source:\"iana\",extensions:[\"fcs\"]},\"application/vnd.iso11783-10+zip\":{source:\"iana\",compressible:!1},\"application/vnd.jam\":{source:\"iana\",extensions:[\"jam\"]},\"application/vnd.japannet-directory-service\":{source:\"iana\"},\"application/vnd.japannet-jpnstore-wakeup\":{source:\"iana\"},\"application/vnd.japannet-payment-wakeup\":{source:\"iana\"},\"application/vnd.japannet-registration\":{source:\"iana\"},\"application/vnd.japannet-registration-wakeup\":{source:\"iana\"},\"application/vnd.japannet-setstore-wakeup\":{source:\"iana\"},\"application/vnd.japannet-verification\":{source:\"iana\"},\"application/vnd.japannet-verification-wakeup\":{source:\"iana\"},\"application/vnd.jcp.javame.midlet-rms\":{source:\"iana\",extensions:[\"rms\"]},\"application/vnd.jisp\":{source:\"iana\",extensions:[\"jisp\"]},\"application/vnd.joost.joda-archive\":{source:\"iana\",extensions:[\"joda\"]},\"application/vnd.jsk.isdn-ngn\":{source:\"iana\"},\"application/vnd.kahootz\":{source:\"iana\",extensions:[\"ktz\",\"ktr\"]},\"application/vnd.kde.karbon\":{source:\"iana\",extensions:[\"karbon\"]},\"application/vnd.kde.kchart\":{source:\"iana\",extensions:[\"chrt\"]},\"application/vnd.kde.kformula\":{source:\"iana\",extensions:[\"kfo\"]},\"application/vnd.kde.kivio\":{source:\"iana\",extensions:[\"flw\"]},\"application/vnd.kde.kontour\":{source:\"iana\",extensions:[\"kon\"]},\"application/vnd.kde.kpresenter\":{source:\"iana\",extensions:[\"kpr\",\"kpt\"]},\"application/vnd.kde.kspread\":{source:\"iana\",extensions:[\"ksp\"]},\"application/vnd.kde.kword\":{source:\"iana\",extensions:[\"kwd\",\"kwt\"]},\"application/vnd.kenameaapp\":{source:\"iana\",extensions:[\"htke\"]},\"application/vnd.kidspiration\":{source:\"iana\",extensions:[\"kia\"]},\"application/vnd.kinar\":{source:\"iana\",extensions:[\"kne\",\"knp\"]},\"application/vnd.koan\":{source:\"iana\",extensions:[\"skp\",\"skd\",\"skt\",\"skm\"]},\"application/vnd.kodak-descriptor\":{source:\"iana\",extensions:[\"sse\"]},\"application/vnd.las\":{source:\"iana\"},\"application/vnd.las.las+json\":{source:\"iana\",compressible:!0},\"application/vnd.las.las+xml\":{source:\"iana\",compressible:!0,extensions:[\"lasxml\"]},\"application/vnd.laszip\":{source:\"iana\"},\"application/vnd.ldev.productlicensing\":{source:\"iana\"},\"application/vnd.leap+json\":{source:\"iana\",compressible:!0},\"application/vnd.liberty-request+xml\":{source:\"iana\",compressible:!0},\"application/vnd.llamagraphics.life-balance.desktop\":{source:\"iana\",extensions:[\"lbd\"]},\"application/vnd.llamagraphics.life-balance.exchange+xml\":{source:\"iana\",compressible:!0,extensions:[\"lbe\"]},\"application/vnd.logipipe.circuit+zip\":{source:\"iana\",compressible:!1},\"application/vnd.loom\":{source:\"iana\"},\"application/vnd.lotus-1-2-3\":{source:\"iana\",extensions:[\"123\"]},\"application/vnd.lotus-approach\":{source:\"iana\",extensions:[\"apr\"]},\"application/vnd.lotus-freelance\":{source:\"iana\",extensions:[\"pre\"]},\"application/vnd.lotus-notes\":{source:\"iana\",extensions:[\"nsf\"]},\"application/vnd.lotus-organizer\":{source:\"iana\",extensions:[\"org\"]},\"application/vnd.lotus-screencam\":{source:\"iana\",extensions:[\"scm\"]},\"application/vnd.lotus-wordpro\":{source:\"iana\",extensions:[\"lwp\"]},\"application/vnd.macports.portpkg\":{source:\"iana\",extensions:[\"portpkg\"]},\"application/vnd.mapbox-vector-tile\":{source:\"iana\",extensions:[\"mvt\"]},\"application/vnd.marlin.drm.actiontoken+xml\":{source:\"iana\",compressible:!0},\"application/vnd.marlin.drm.conftoken+xml\":{source:\"iana\",compressible:!0},\"application/vnd.marlin.drm.license+xml\":{source:\"iana\",compressible:!0},\"application/vnd.marlin.drm.mdcf\":{source:\"iana\"},\"application/vnd.mason+json\":{source:\"iana\",compressible:!0},\"application/vnd.maxar.archive.3tz+zip\":{source:\"iana\",compressible:!1},\"application/vnd.maxmind.maxmind-db\":{source:\"iana\"},\"application/vnd.mcd\":{source:\"iana\",extensions:[\"mcd\"]},\"application/vnd.mdl\":{source:\"iana\"},\"application/vnd.mdl-mbsdf\":{source:\"iana\"},\"application/vnd.medcalcdata\":{source:\"iana\",extensions:[\"mc1\"]},\"application/vnd.mediastation.cdkey\":{source:\"iana\",extensions:[\"cdkey\"]},\"application/vnd.medicalholodeck.recordxr\":{source:\"iana\"},\"application/vnd.meridian-slingshot\":{source:\"iana\"},\"application/vnd.mermaid\":{source:\"iana\"},\"application/vnd.mfer\":{source:\"iana\",extensions:[\"mwf\"]},\"application/vnd.mfmp\":{source:\"iana\",extensions:[\"mfm\"]},\"application/vnd.micro+json\":{source:\"iana\",compressible:!0},\"application/vnd.micrografx.flo\":{source:\"iana\",extensions:[\"flo\"]},\"application/vnd.micrografx.igx\":{source:\"iana\",extensions:[\"igx\"]},\"application/vnd.microsoft.portable-executable\":{source:\"iana\"},\"application/vnd.microsoft.windows.thumbnail-cache\":{source:\"iana\"},\"application/vnd.miele+json\":{source:\"iana\",compressible:!0},\"application/vnd.mif\":{source:\"iana\",extensions:[\"mif\"]},\"application/vnd.minisoft-hp3000-save\":{source:\"iana\"},\"application/vnd.mitsubishi.misty-guard.trustweb\":{source:\"iana\"},\"application/vnd.mobius.daf\":{source:\"iana\",extensions:[\"daf\"]},\"application/vnd.mobius.dis\":{source:\"iana\",extensions:[\"dis\"]},\"application/vnd.mobius.mbk\":{source:\"iana\",extensions:[\"mbk\"]},\"application/vnd.mobius.mqy\":{source:\"iana\",extensions:[\"mqy\"]},\"application/vnd.mobius.msl\":{source:\"iana\",extensions:[\"msl\"]},\"application/vnd.mobius.plc\":{source:\"iana\",extensions:[\"plc\"]},\"application/vnd.mobius.txf\":{source:\"iana\",extensions:[\"txf\"]},\"application/vnd.modl\":{source:\"iana\"},\"application/vnd.mophun.application\":{source:\"iana\",extensions:[\"mpn\"]},\"application/vnd.mophun.certificate\":{source:\"iana\",extensions:[\"mpc\"]},\"application/vnd.motorola.flexsuite\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.adsi\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.fis\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.gotap\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.kmr\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.ttc\":{source:\"iana\"},\"application/vnd.motorola.flexsuite.wem\":{source:\"iana\"},\"application/vnd.motorola.iprm\":{source:\"iana\"},\"application/vnd.mozilla.xul+xml\":{source:\"iana\",compressible:!0,extensions:[\"xul\"]},\"application/vnd.ms-3mfdocument\":{source:\"iana\"},\"application/vnd.ms-artgalry\":{source:\"iana\",extensions:[\"cil\"]},\"application/vnd.ms-asf\":{source:\"iana\"},\"application/vnd.ms-cab-compressed\":{source:\"iana\",extensions:[\"cab\"]},\"application/vnd.ms-color.iccprofile\":{source:\"apache\"},\"application/vnd.ms-excel\":{source:\"iana\",compressible:!1,extensions:[\"xls\",\"xlm\",\"xla\",\"xlc\",\"xlt\",\"xlw\"]},\"application/vnd.ms-excel.addin.macroenabled.12\":{source:\"iana\",extensions:[\"xlam\"]},\"application/vnd.ms-excel.sheet.binary.macroenabled.12\":{source:\"iana\",extensions:[\"xlsb\"]},\"application/vnd.ms-excel.sheet.macroenabled.12\":{source:\"iana\",extensions:[\"xlsm\"]},\"application/vnd.ms-excel.template.macroenabled.12\":{source:\"iana\",extensions:[\"xltm\"]},\"application/vnd.ms-fontobject\":{source:\"iana\",compressible:!0,extensions:[\"eot\"]},\"application/vnd.ms-htmlhelp\":{source:\"iana\",extensions:[\"chm\"]},\"application/vnd.ms-ims\":{source:\"iana\",extensions:[\"ims\"]},\"application/vnd.ms-lrm\":{source:\"iana\",extensions:[\"lrm\"]},\"application/vnd.ms-office.activex+xml\":{source:\"iana\",compressible:!0},\"application/vnd.ms-officetheme\":{source:\"iana\",extensions:[\"thmx\"]},\"application/vnd.ms-opentype\":{source:\"apache\",compressible:!0},\"application/vnd.ms-outlook\":{compressible:!1,extensions:[\"msg\"]},\"application/vnd.ms-package.obfuscated-opentype\":{source:\"apache\"},\"application/vnd.ms-pki.seccat\":{source:\"apache\",extensions:[\"cat\"]},\"application/vnd.ms-pki.stl\":{source:\"apache\",extensions:[\"stl\"]},\"application/vnd.ms-playready.initiator+xml\":{source:\"iana\",compressible:!0},\"application/vnd.ms-powerpoint\":{source:\"iana\",compressible:!1,extensions:[\"ppt\",\"pps\",\"pot\"]},\"application/vnd.ms-powerpoint.addin.macroenabled.12\":{source:\"iana\",extensions:[\"ppam\"]},\"application/vnd.ms-powerpoint.presentation.macroenabled.12\":{source:\"iana\",extensions:[\"pptm\"]},\"application/vnd.ms-powerpoint.slide.macroenabled.12\":{source:\"iana\",extensions:[\"sldm\"]},\"application/vnd.ms-powerpoint.slideshow.macroenabled.12\":{source:\"iana\",extensions:[\"ppsm\"]},\"application/vnd.ms-powerpoint.template.macroenabled.12\":{source:\"iana\",extensions:[\"potm\"]},\"application/vnd.ms-printdevicecapabilities+xml\":{source:\"iana\",compressible:!0},\"application/vnd.ms-printing.printticket+xml\":{source:\"apache\",compressible:!0},\"application/vnd.ms-printschematicket+xml\":{source:\"iana\",compressible:!0},\"application/vnd.ms-project\":{source:\"iana\",extensions:[\"mpp\",\"mpt\"]},\"application/vnd.ms-tnef\":{source:\"iana\"},\"application/vnd.ms-windows.devicepairing\":{source:\"iana\"},\"application/vnd.ms-windows.nwprinting.oob\":{source:\"iana\"},\"application/vnd.ms-windows.printerpairing\":{source:\"iana\"},\"application/vnd.ms-windows.wsd.oob\":{source:\"iana\"},\"application/vnd.ms-wmdrm.lic-chlg-req\":{source:\"iana\"},\"application/vnd.ms-wmdrm.lic-resp\":{source:\"iana\"},\"application/vnd.ms-wmdrm.meter-chlg-req\":{source:\"iana\"},\"application/vnd.ms-wmdrm.meter-resp\":{source:\"iana\"},\"application/vnd.ms-word.document.macroenabled.12\":{source:\"iana\",extensions:[\"docm\"]},\"application/vnd.ms-word.template.macroenabled.12\":{source:\"iana\",extensions:[\"dotm\"]},\"application/vnd.ms-works\":{source:\"iana\",extensions:[\"wps\",\"wks\",\"wcm\",\"wdb\"]},\"application/vnd.ms-wpl\":{source:\"iana\",extensions:[\"wpl\"]},\"application/vnd.ms-xpsdocument\":{source:\"iana\",compressible:!1,extensions:[\"xps\"]},\"application/vnd.msa-disk-image\":{source:\"iana\"},\"application/vnd.mseq\":{source:\"iana\",extensions:[\"mseq\"]},\"application/vnd.msgpack\":{source:\"iana\"},\"application/vnd.msign\":{source:\"iana\"},\"application/vnd.multiad.creator\":{source:\"iana\"},\"application/vnd.multiad.creator.cif\":{source:\"iana\"},\"application/vnd.music-niff\":{source:\"iana\"},\"application/vnd.musician\":{source:\"iana\",extensions:[\"mus\"]},\"application/vnd.muvee.style\":{source:\"iana\",extensions:[\"msty\"]},\"application/vnd.mynfc\":{source:\"iana\",extensions:[\"taglet\"]},\"application/vnd.nacamar.ybrid+json\":{source:\"iana\",compressible:!0},\"application/vnd.nato.bindingdataobject+cbor\":{source:\"iana\"},\"application/vnd.nato.bindingdataobject+json\":{source:\"iana\",compressible:!0},\"application/vnd.nato.bindingdataobject+xml\":{source:\"iana\",compressible:!0,extensions:[\"bdo\"]},\"application/vnd.nato.openxmlformats-package.iepd+zip\":{source:\"iana\",compressible:!1},\"application/vnd.ncd.control\":{source:\"iana\"},\"application/vnd.ncd.reference\":{source:\"iana\"},\"application/vnd.nearst.inv+json\":{source:\"iana\",compressible:!0},\"application/vnd.nebumind.line\":{source:\"iana\"},\"application/vnd.nervana\":{source:\"iana\"},\"application/vnd.netfpx\":{source:\"iana\"},\"application/vnd.neurolanguage.nlu\":{source:\"iana\",extensions:[\"nlu\"]},\"application/vnd.nimn\":{source:\"iana\"},\"application/vnd.nintendo.nitro.rom\":{source:\"iana\"},\"application/vnd.nintendo.snes.rom\":{source:\"iana\"},\"application/vnd.nitf\":{source:\"iana\",extensions:[\"ntf\",\"nitf\"]},\"application/vnd.noblenet-directory\":{source:\"iana\",extensions:[\"nnd\"]},\"application/vnd.noblenet-sealer\":{source:\"iana\",extensions:[\"nns\"]},\"application/vnd.noblenet-web\":{source:\"iana\",extensions:[\"nnw\"]},\"application/vnd.nokia.catalogs\":{source:\"iana\"},\"application/vnd.nokia.conml+wbxml\":{source:\"iana\"},\"application/vnd.nokia.conml+xml\":{source:\"iana\",compressible:!0},\"application/vnd.nokia.iptv.config+xml\":{source:\"iana\",compressible:!0},\"application/vnd.nokia.isds-radio-presets\":{source:\"iana\"},\"application/vnd.nokia.landmark+wbxml\":{source:\"iana\"},\"application/vnd.nokia.landmark+xml\":{source:\"iana\",compressible:!0},\"application/vnd.nokia.landmarkcollection+xml\":{source:\"iana\",compressible:!0},\"application/vnd.nokia.n-gage.ac+xml\":{source:\"iana\",compressible:!0,extensions:[\"ac\"]},\"application/vnd.nokia.n-gage.data\":{source:\"iana\",extensions:[\"ngdat\"]},\"application/vnd.nokia.n-gage.symbian.install\":{source:\"apache\",extensions:[\"n-gage\"]},\"application/vnd.nokia.ncd\":{source:\"iana\"},\"application/vnd.nokia.pcd+wbxml\":{source:\"iana\"},\"application/vnd.nokia.pcd+xml\":{source:\"iana\",compressible:!0},\"application/vnd.nokia.radio-preset\":{source:\"iana\",extensions:[\"rpst\"]},\"application/vnd.nokia.radio-presets\":{source:\"iana\",extensions:[\"rpss\"]},\"application/vnd.novadigm.edm\":{source:\"iana\",extensions:[\"edm\"]},\"application/vnd.novadigm.edx\":{source:\"iana\",extensions:[\"edx\"]},\"application/vnd.novadigm.ext\":{source:\"iana\",extensions:[\"ext\"]},\"application/vnd.ntt-local.content-share\":{source:\"iana\"},\"application/vnd.ntt-local.file-transfer\":{source:\"iana\"},\"application/vnd.ntt-local.ogw_remote-access\":{source:\"iana\"},\"application/vnd.ntt-local.sip-ta_remote\":{source:\"iana\"},\"application/vnd.ntt-local.sip-ta_tcp_stream\":{source:\"iana\"},\"application/vnd.oai.workflows\":{source:\"iana\"},\"application/vnd.oai.workflows+json\":{source:\"iana\",compressible:!0},\"application/vnd.oai.workflows+yaml\":{source:\"iana\"},\"application/vnd.oasis.opendocument.base\":{source:\"iana\"},\"application/vnd.oasis.opendocument.chart\":{source:\"iana\",extensions:[\"odc\"]},\"application/vnd.oasis.opendocument.chart-template\":{source:\"iana\",extensions:[\"otc\"]},\"application/vnd.oasis.opendocument.database\":{source:\"apache\",extensions:[\"odb\"]},\"application/vnd.oasis.opendocument.formula\":{source:\"iana\",extensions:[\"odf\"]},\"application/vnd.oasis.opendocument.formula-template\":{source:\"iana\",extensions:[\"odft\"]},\"application/vnd.oasis.opendocument.graphics\":{source:\"iana\",compressible:!1,extensions:[\"odg\"]},\"application/vnd.oasis.opendocument.graphics-template\":{source:\"iana\",extensions:[\"otg\"]},\"application/vnd.oasis.opendocument.image\":{source:\"iana\",extensions:[\"odi\"]},\"application/vnd.oasis.opendocument.image-template\":{source:\"iana\",extensions:[\"oti\"]},\"application/vnd.oasis.opendocument.presentation\":{source:\"iana\",compressible:!1,extensions:[\"odp\"]},\"application/vnd.oasis.opendocument.presentation-template\":{source:\"iana\",extensions:[\"otp\"]},\"application/vnd.oasis.opendocument.spreadsheet\":{source:\"iana\",compressible:!1,extensions:[\"ods\"]},\"application/vnd.oasis.opendocument.spreadsheet-template\":{source:\"iana\",extensions:[\"ots\"]},\"application/vnd.oasis.opendocument.text\":{source:\"iana\",compressible:!1,extensions:[\"odt\"]},\"application/vnd.oasis.opendocument.text-master\":{source:\"iana\",extensions:[\"odm\"]},\"application/vnd.oasis.opendocument.text-master-template\":{source:\"iana\"},\"application/vnd.oasis.opendocument.text-template\":{source:\"iana\",extensions:[\"ott\"]},\"application/vnd.oasis.opendocument.text-web\":{source:\"iana\",extensions:[\"oth\"]},\"application/vnd.obn\":{source:\"iana\"},\"application/vnd.ocf+cbor\":{source:\"iana\"},\"application/vnd.oci.image.manifest.v1+json\":{source:\"iana\",compressible:!0},\"application/vnd.oftn.l10n+json\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.contentaccessdownload+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.contentaccessstreaming+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.cspg-hexbinary\":{source:\"iana\"},\"application/vnd.oipf.dae.svg+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.dae.xhtml+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.mippvcontrolmessage+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.pae.gem\":{source:\"iana\"},\"application/vnd.oipf.spdiscovery+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.spdlist+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.ueprofile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oipf.userprofile+xml\":{source:\"iana\",compressible:!0},\"application/vnd.olpc-sugar\":{source:\"iana\",extensions:[\"xo\"]},\"application/vnd.oma-scws-config\":{source:\"iana\"},\"application/vnd.oma-scws-http-request\":{source:\"iana\"},\"application/vnd.oma-scws-http-response\":{source:\"iana\"},\"application/vnd.oma.bcast.associated-procedure-parameter+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.bcast.drm-trigger+xml\":{source:\"apache\",compressible:!0},\"application/vnd.oma.bcast.imd+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.bcast.ltkm\":{source:\"iana\"},\"application/vnd.oma.bcast.notification+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.bcast.provisioningtrigger\":{source:\"iana\"},\"application/vnd.oma.bcast.sgboot\":{source:\"iana\"},\"application/vnd.oma.bcast.sgdd+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.bcast.sgdu\":{source:\"iana\"},\"application/vnd.oma.bcast.simple-symbol-container\":{source:\"iana\"},\"application/vnd.oma.bcast.smartcard-trigger+xml\":{source:\"apache\",compressible:!0},\"application/vnd.oma.bcast.sprov+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.bcast.stkm\":{source:\"iana\"},\"application/vnd.oma.cab-address-book+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.cab-feature-handler+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.cab-pcc+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.cab-subs-invite+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.cab-user-prefs+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.dcd\":{source:\"iana\"},\"application/vnd.oma.dcdc\":{source:\"iana\"},\"application/vnd.oma.dd2+xml\":{source:\"iana\",compressible:!0,extensions:[\"dd2\"]},\"application/vnd.oma.drm.risd+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.group-usage-list+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.lwm2m+cbor\":{source:\"iana\"},\"application/vnd.oma.lwm2m+json\":{source:\"iana\",compressible:!0},\"application/vnd.oma.lwm2m+tlv\":{source:\"iana\"},\"application/vnd.oma.pal+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.poc.detailed-progress-report+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.poc.final-report+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.poc.groups+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.poc.invocation-descriptor+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.poc.optimized-progress-report+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.push\":{source:\"iana\"},\"application/vnd.oma.scidm.messages+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oma.xcap-directory+xml\":{source:\"iana\",compressible:!0},\"application/vnd.omads-email+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/vnd.omads-file+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/vnd.omads-folder+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/vnd.omaloc-supl-init\":{source:\"iana\"},\"application/vnd.onepager\":{source:\"iana\"},\"application/vnd.onepagertamp\":{source:\"iana\"},\"application/vnd.onepagertamx\":{source:\"iana\"},\"application/vnd.onepagertat\":{source:\"iana\"},\"application/vnd.onepagertatp\":{source:\"iana\"},\"application/vnd.onepagertatx\":{source:\"iana\"},\"application/vnd.onvif.metadata\":{source:\"iana\"},\"application/vnd.openblox.game+xml\":{source:\"iana\",compressible:!0,extensions:[\"obgx\"]},\"application/vnd.openblox.game-binary\":{source:\"iana\"},\"application/vnd.openeye.oeb\":{source:\"iana\"},\"application/vnd.openofficeorg.extension\":{source:\"apache\",extensions:[\"oxt\"]},\"application/vnd.openstreetmap.data+xml\":{source:\"iana\",compressible:!0,extensions:[\"osm\"]},\"application/vnd.opentimestamps.ots\":{source:\"iana\"},\"application/vnd.openxmlformats-officedocument.custom-properties+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.customxmlproperties+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawing+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.extended-properties+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.comments+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.presentation\":{source:\"iana\",compressible:!1,extensions:[\"pptx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.slide\":{source:\"iana\",extensions:[\"sldx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.slideshow\":{source:\"iana\",extensions:[\"ppsx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.tags+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.template\":{source:\"iana\",extensions:[\"potx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":{source:\"iana\",compressible:!1,extensions:[\"xlsx\"]},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.template\":{source:\"iana\",extensions:[\"xltx\"]},\"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.theme+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.themeoverride+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.vmldrawing\":{source:\"iana\"},\"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":{source:\"iana\",compressible:!1,extensions:[\"docx\"]},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.template\":{source:\"iana\",extensions:[\"dotx\"]},\"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-package.core-properties+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\":{source:\"iana\",compressible:!0},\"application/vnd.openxmlformats-package.relationships+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oracle.resource+json\":{source:\"iana\",compressible:!0},\"application/vnd.orange.indata\":{source:\"iana\"},\"application/vnd.osa.netdeploy\":{source:\"iana\"},\"application/vnd.osgeo.mapguide.package\":{source:\"iana\",extensions:[\"mgp\"]},\"application/vnd.osgi.bundle\":{source:\"iana\"},\"application/vnd.osgi.dp\":{source:\"iana\",extensions:[\"dp\"]},\"application/vnd.osgi.subsystem\":{source:\"iana\",extensions:[\"esa\"]},\"application/vnd.otps.ct-kip+xml\":{source:\"iana\",compressible:!0},\"application/vnd.oxli.countgraph\":{source:\"iana\"},\"application/vnd.pagerduty+json\":{source:\"iana\",compressible:!0},\"application/vnd.palm\":{source:\"iana\",extensions:[\"pdb\",\"pqa\",\"oprc\"]},\"application/vnd.panoply\":{source:\"iana\"},\"application/vnd.paos.xml\":{source:\"iana\"},\"application/vnd.patentdive\":{source:\"iana\"},\"application/vnd.patientecommsdoc\":{source:\"iana\"},\"application/vnd.pawaafile\":{source:\"iana\",extensions:[\"paw\"]},\"application/vnd.pcos\":{source:\"iana\"},\"application/vnd.pg.format\":{source:\"iana\",extensions:[\"str\"]},\"application/vnd.pg.osasli\":{source:\"iana\",extensions:[\"ei6\"]},\"application/vnd.piaccess.application-licence\":{source:\"iana\"},\"application/vnd.picsel\":{source:\"iana\",extensions:[\"efif\"]},\"application/vnd.pmi.widget\":{source:\"iana\",extensions:[\"wg\"]},\"application/vnd.poc.group-advertisement+xml\":{source:\"iana\",compressible:!0},\"application/vnd.pocketlearn\":{source:\"iana\",extensions:[\"plf\"]},\"application/vnd.powerbuilder6\":{source:\"iana\",extensions:[\"pbd\"]},\"application/vnd.powerbuilder6-s\":{source:\"iana\"},\"application/vnd.powerbuilder7\":{source:\"iana\"},\"application/vnd.powerbuilder7-s\":{source:\"iana\"},\"application/vnd.powerbuilder75\":{source:\"iana\"},\"application/vnd.powerbuilder75-s\":{source:\"iana\"},\"application/vnd.preminet\":{source:\"iana\"},\"application/vnd.previewsystems.box\":{source:\"iana\",extensions:[\"box\"]},\"application/vnd.proteus.magazine\":{source:\"iana\",extensions:[\"mgz\"]},\"application/vnd.psfs\":{source:\"iana\"},\"application/vnd.pt.mundusmundi\":{source:\"iana\"},\"application/vnd.publishare-delta-tree\":{source:\"iana\",extensions:[\"qps\"]},\"application/vnd.pvi.ptid1\":{source:\"iana\",extensions:[\"ptid\"]},\"application/vnd.pwg-multiplexed\":{source:\"iana\"},\"application/vnd.pwg-xhtml-print+xml\":{source:\"iana\",compressible:!0,extensions:[\"xhtm\"]},\"application/vnd.qualcomm.brew-app-res\":{source:\"iana\"},\"application/vnd.quarantainenet\":{source:\"iana\"},\"application/vnd.quark.quarkxpress\":{source:\"iana\",extensions:[\"qxd\",\"qxt\",\"qwd\",\"qwt\",\"qxl\",\"qxb\"]},\"application/vnd.quobject-quoxdocument\":{source:\"iana\"},\"application/vnd.radisys.moml+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-audit+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-audit-conf+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-audit-conn+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-audit-dialog+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-audit-stream+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-conf+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-base+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-fax-detect+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-fax-sendrecv+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-group+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-speech+xml\":{source:\"iana\",compressible:!0},\"application/vnd.radisys.msml-dialog-transform+xml\":{source:\"iana\",compressible:!0},\"application/vnd.rainstor.data\":{source:\"iana\"},\"application/vnd.rapid\":{source:\"iana\"},\"application/vnd.rar\":{source:\"iana\",extensions:[\"rar\"]},\"application/vnd.realvnc.bed\":{source:\"iana\",extensions:[\"bed\"]},\"application/vnd.recordare.musicxml\":{source:\"iana\",extensions:[\"mxl\"]},\"application/vnd.recordare.musicxml+xml\":{source:\"iana\",compressible:!0,extensions:[\"musicxml\"]},\"application/vnd.relpipe\":{source:\"iana\"},\"application/vnd.renlearn.rlprint\":{source:\"iana\"},\"application/vnd.resilient.logic\":{source:\"iana\"},\"application/vnd.restful+json\":{source:\"iana\",compressible:!0},\"application/vnd.rig.cryptonote\":{source:\"iana\",extensions:[\"cryptonote\"]},\"application/vnd.rim.cod\":{source:\"apache\",extensions:[\"cod\"]},\"application/vnd.rn-realmedia\":{source:\"apache\",extensions:[\"rm\"]},\"application/vnd.rn-realmedia-vbr\":{source:\"apache\",extensions:[\"rmvb\"]},\"application/vnd.route66.link66+xml\":{source:\"iana\",compressible:!0,extensions:[\"link66\"]},\"application/vnd.rs-274x\":{source:\"iana\"},\"application/vnd.ruckus.download\":{source:\"iana\"},\"application/vnd.s3sms\":{source:\"iana\"},\"application/vnd.sailingtracker.track\":{source:\"iana\",extensions:[\"st\"]},\"application/vnd.sar\":{source:\"iana\"},\"application/vnd.sbm.cid\":{source:\"iana\"},\"application/vnd.sbm.mid2\":{source:\"iana\"},\"application/vnd.scribus\":{source:\"iana\"},\"application/vnd.sealed.3df\":{source:\"iana\"},\"application/vnd.sealed.csf\":{source:\"iana\"},\"application/vnd.sealed.doc\":{source:\"iana\"},\"application/vnd.sealed.eml\":{source:\"iana\"},\"application/vnd.sealed.mht\":{source:\"iana\"},\"application/vnd.sealed.net\":{source:\"iana\"},\"application/vnd.sealed.ppt\":{source:\"iana\"},\"application/vnd.sealed.tiff\":{source:\"iana\"},\"application/vnd.sealed.xls\":{source:\"iana\"},\"application/vnd.sealedmedia.softseal.html\":{source:\"iana\"},\"application/vnd.sealedmedia.softseal.pdf\":{source:\"iana\"},\"application/vnd.seemail\":{source:\"iana\",extensions:[\"see\"]},\"application/vnd.seis+json\":{source:\"iana\",compressible:!0},\"application/vnd.sema\":{source:\"iana\",extensions:[\"sema\"]},\"application/vnd.semd\":{source:\"iana\",extensions:[\"semd\"]},\"application/vnd.semf\":{source:\"iana\",extensions:[\"semf\"]},\"application/vnd.shade-save-file\":{source:\"iana\"},\"application/vnd.shana.informed.formdata\":{source:\"iana\",extensions:[\"ifm\"]},\"application/vnd.shana.informed.formtemplate\":{source:\"iana\",extensions:[\"itp\"]},\"application/vnd.shana.informed.interchange\":{source:\"iana\",extensions:[\"iif\"]},\"application/vnd.shana.informed.package\":{source:\"iana\",extensions:[\"ipk\"]},\"application/vnd.shootproof+json\":{source:\"iana\",compressible:!0},\"application/vnd.shopkick+json\":{source:\"iana\",compressible:!0},\"application/vnd.shp\":{source:\"iana\"},\"application/vnd.shx\":{source:\"iana\"},\"application/vnd.sigrok.session\":{source:\"iana\"},\"application/vnd.simtech-mindmapper\":{source:\"iana\",extensions:[\"twd\",\"twds\"]},\"application/vnd.siren+json\":{source:\"iana\",compressible:!0},\"application/vnd.smaf\":{source:\"iana\",extensions:[\"mmf\"]},\"application/vnd.smart.notebook\":{source:\"iana\"},\"application/vnd.smart.teacher\":{source:\"iana\",extensions:[\"teacher\"]},\"application/vnd.smintio.portals.archive\":{source:\"iana\"},\"application/vnd.snesdev-page-table\":{source:\"iana\"},\"application/vnd.software602.filler.form+xml\":{source:\"iana\",compressible:!0,extensions:[\"fo\"]},\"application/vnd.software602.filler.form-xml-zip\":{source:\"iana\"},\"application/vnd.solent.sdkm+xml\":{source:\"iana\",compressible:!0,extensions:[\"sdkm\",\"sdkd\"]},\"application/vnd.spotfire.dxp\":{source:\"iana\",extensions:[\"dxp\"]},\"application/vnd.spotfire.sfs\":{source:\"iana\",extensions:[\"sfs\"]},\"application/vnd.sqlite3\":{source:\"iana\"},\"application/vnd.sss-cod\":{source:\"iana\"},\"application/vnd.sss-dtf\":{source:\"iana\"},\"application/vnd.sss-ntf\":{source:\"iana\"},\"application/vnd.stardivision.calc\":{source:\"apache\",extensions:[\"sdc\"]},\"application/vnd.stardivision.draw\":{source:\"apache\",extensions:[\"sda\"]},\"application/vnd.stardivision.impress\":{source:\"apache\",extensions:[\"sdd\"]},\"application/vnd.stardivision.math\":{source:\"apache\",extensions:[\"smf\"]},\"application/vnd.stardivision.writer\":{source:\"apache\",extensions:[\"sdw\",\"vor\"]},\"application/vnd.stardivision.writer-global\":{source:\"apache\",extensions:[\"sgl\"]},\"application/vnd.stepmania.package\":{source:\"iana\",extensions:[\"smzip\"]},\"application/vnd.stepmania.stepchart\":{source:\"iana\",extensions:[\"sm\"]},\"application/vnd.street-stream\":{source:\"iana\"},\"application/vnd.sun.wadl+xml\":{source:\"iana\",compressible:!0,extensions:[\"wadl\"]},\"application/vnd.sun.xml.calc\":{source:\"apache\",extensions:[\"sxc\"]},\"application/vnd.sun.xml.calc.template\":{source:\"apache\",extensions:[\"stc\"]},\"application/vnd.sun.xml.draw\":{source:\"apache\",extensions:[\"sxd\"]},\"application/vnd.sun.xml.draw.template\":{source:\"apache\",extensions:[\"std\"]},\"application/vnd.sun.xml.impress\":{source:\"apache\",extensions:[\"sxi\"]},\"application/vnd.sun.xml.impress.template\":{source:\"apache\",extensions:[\"sti\"]},\"application/vnd.sun.xml.math\":{source:\"apache\",extensions:[\"sxm\"]},\"application/vnd.sun.xml.writer\":{source:\"apache\",extensions:[\"sxw\"]},\"application/vnd.sun.xml.writer.global\":{source:\"apache\",extensions:[\"sxg\"]},\"application/vnd.sun.xml.writer.template\":{source:\"apache\",extensions:[\"stw\"]},\"application/vnd.sus-calendar\":{source:\"iana\",extensions:[\"sus\",\"susp\"]},\"application/vnd.svd\":{source:\"iana\",extensions:[\"svd\"]},\"application/vnd.swiftview-ics\":{source:\"iana\"},\"application/vnd.sybyl.mol2\":{source:\"iana\"},\"application/vnd.sycle+xml\":{source:\"iana\",compressible:!0},\"application/vnd.syft+json\":{source:\"iana\",compressible:!0},\"application/vnd.symbian.install\":{source:\"apache\",extensions:[\"sis\",\"sisx\"]},\"application/vnd.syncml+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"xsm\"]},\"application/vnd.syncml.dm+wbxml\":{source:\"iana\",charset:\"UTF-8\",extensions:[\"bdm\"]},\"application/vnd.syncml.dm+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"xdm\"]},\"application/vnd.syncml.dm.notification\":{source:\"iana\"},\"application/vnd.syncml.dmddf+wbxml\":{source:\"iana\"},\"application/vnd.syncml.dmddf+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"ddf\"]},\"application/vnd.syncml.dmtnds+wbxml\":{source:\"iana\"},\"application/vnd.syncml.dmtnds+xml\":{source:\"iana\",charset:\"UTF-8\",compressible:!0},\"application/vnd.syncml.ds.notification\":{source:\"iana\"},\"application/vnd.tableschema+json\":{source:\"iana\",compressible:!0},\"application/vnd.tao.intent-module-archive\":{source:\"iana\",extensions:[\"tao\"]},\"application/vnd.tcpdump.pcap\":{source:\"iana\",extensions:[\"pcap\",\"cap\",\"dmp\"]},\"application/vnd.think-cell.ppttc+json\":{source:\"iana\",compressible:!0},\"application/vnd.tmd.mediaflex.api+xml\":{source:\"iana\",compressible:!0},\"application/vnd.tml\":{source:\"iana\"},\"application/vnd.tmobile-livetv\":{source:\"iana\",extensions:[\"tmo\"]},\"application/vnd.tri.onesource\":{source:\"iana\"},\"application/vnd.trid.tpt\":{source:\"iana\",extensions:[\"tpt\"]},\"application/vnd.triscape.mxs\":{source:\"iana\",extensions:[\"mxs\"]},\"application/vnd.trueapp\":{source:\"iana\",extensions:[\"tra\"]},\"application/vnd.truedoc\":{source:\"iana\"},\"application/vnd.ubisoft.webplayer\":{source:\"iana\"},\"application/vnd.ufdl\":{source:\"iana\",extensions:[\"ufd\",\"ufdl\"]},\"application/vnd.uiq.theme\":{source:\"iana\",extensions:[\"utz\"]},\"application/vnd.umajin\":{source:\"iana\",extensions:[\"umj\"]},\"application/vnd.unity\":{source:\"iana\",extensions:[\"unityweb\"]},\"application/vnd.uoml+xml\":{source:\"iana\",compressible:!0,extensions:[\"uoml\",\"uo\"]},\"application/vnd.uplanet.alert\":{source:\"iana\"},\"application/vnd.uplanet.alert-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.bearer-choice\":{source:\"iana\"},\"application/vnd.uplanet.bearer-choice-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.cacheop\":{source:\"iana\"},\"application/vnd.uplanet.cacheop-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.channel\":{source:\"iana\"},\"application/vnd.uplanet.channel-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.list\":{source:\"iana\"},\"application/vnd.uplanet.list-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.listcmd\":{source:\"iana\"},\"application/vnd.uplanet.listcmd-wbxml\":{source:\"iana\"},\"application/vnd.uplanet.signal\":{source:\"iana\"},\"application/vnd.uri-map\":{source:\"iana\"},\"application/vnd.valve.source.material\":{source:\"iana\"},\"application/vnd.vcx\":{source:\"iana\",extensions:[\"vcx\"]},\"application/vnd.vd-study\":{source:\"iana\"},\"application/vnd.vectorworks\":{source:\"iana\"},\"application/vnd.vel+json\":{source:\"iana\",compressible:!0},\"application/vnd.verimatrix.vcas\":{source:\"iana\"},\"application/vnd.veritone.aion+json\":{source:\"iana\",compressible:!0},\"application/vnd.veryant.thin\":{source:\"iana\"},\"application/vnd.ves.encrypted\":{source:\"iana\"},\"application/vnd.vidsoft.vidconference\":{source:\"iana\"},\"application/vnd.visio\":{source:\"iana\",extensions:[\"vsd\",\"vst\",\"vss\",\"vsw\"]},\"application/vnd.visionary\":{source:\"iana\",extensions:[\"vis\"]},\"application/vnd.vividence.scriptfile\":{source:\"iana\"},\"application/vnd.vsf\":{source:\"iana\",extensions:[\"vsf\"]},\"application/vnd.wap.sic\":{source:\"iana\"},\"application/vnd.wap.slc\":{source:\"iana\"},\"application/vnd.wap.wbxml\":{source:\"iana\",charset:\"UTF-8\",extensions:[\"wbxml\"]},\"application/vnd.wap.wmlc\":{source:\"iana\",extensions:[\"wmlc\"]},\"application/vnd.wap.wmlscriptc\":{source:\"iana\",extensions:[\"wmlsc\"]},\"application/vnd.wasmflow.wafl\":{source:\"iana\"},\"application/vnd.webturbo\":{source:\"iana\",extensions:[\"wtb\"]},\"application/vnd.wfa.dpp\":{source:\"iana\"},\"application/vnd.wfa.p2p\":{source:\"iana\"},\"application/vnd.wfa.wsc\":{source:\"iana\"},\"application/vnd.windows.devicepairing\":{source:\"iana\"},\"application/vnd.wmc\":{source:\"iana\"},\"application/vnd.wmf.bootstrap\":{source:\"iana\"},\"application/vnd.wolfram.mathematica\":{source:\"iana\"},\"application/vnd.wolfram.mathematica.package\":{source:\"iana\"},\"application/vnd.wolfram.player\":{source:\"iana\",extensions:[\"nbp\"]},\"application/vnd.wordlift\":{source:\"iana\"},\"application/vnd.wordperfect\":{source:\"iana\",extensions:[\"wpd\"]},\"application/vnd.wqd\":{source:\"iana\",extensions:[\"wqd\"]},\"application/vnd.wrq-hp3000-labelled\":{source:\"iana\"},\"application/vnd.wt.stf\":{source:\"iana\",extensions:[\"stf\"]},\"application/vnd.wv.csp+wbxml\":{source:\"iana\"},\"application/vnd.wv.csp+xml\":{source:\"iana\",compressible:!0},\"application/vnd.wv.ssp+xml\":{source:\"iana\",compressible:!0},\"application/vnd.xacml+json\":{source:\"iana\",compressible:!0},\"application/vnd.xara\":{source:\"iana\",extensions:[\"xar\"]},\"application/vnd.xecrets-encrypted\":{source:\"iana\"},\"application/vnd.xfdl\":{source:\"iana\",extensions:[\"xfdl\"]},\"application/vnd.xfdl.webform\":{source:\"iana\"},\"application/vnd.xmi+xml\":{source:\"iana\",compressible:!0},\"application/vnd.xmpie.cpkg\":{source:\"iana\"},\"application/vnd.xmpie.dpkg\":{source:\"iana\"},\"application/vnd.xmpie.plan\":{source:\"iana\"},\"application/vnd.xmpie.ppkg\":{source:\"iana\"},\"application/vnd.xmpie.xlim\":{source:\"iana\"},\"application/vnd.yamaha.hv-dic\":{source:\"iana\",extensions:[\"hvd\"]},\"application/vnd.yamaha.hv-script\":{source:\"iana\",extensions:[\"hvs\"]},\"application/vnd.yamaha.hv-voice\":{source:\"iana\",extensions:[\"hvp\"]},\"application/vnd.yamaha.openscoreformat\":{source:\"iana\",extensions:[\"osf\"]},\"application/vnd.yamaha.openscoreformat.osfpvg+xml\":{source:\"iana\",compressible:!0,extensions:[\"osfpvg\"]},\"application/vnd.yamaha.remote-setup\":{source:\"iana\"},\"application/vnd.yamaha.smaf-audio\":{source:\"iana\",extensions:[\"saf\"]},\"application/vnd.yamaha.smaf-phrase\":{source:\"iana\",extensions:[\"spf\"]},\"application/vnd.yamaha.through-ngn\":{source:\"iana\"},\"application/vnd.yamaha.tunnel-udpencap\":{source:\"iana\"},\"application/vnd.yaoweme\":{source:\"iana\"},\"application/vnd.yellowriver-custom-menu\":{source:\"iana\",extensions:[\"cmp\"]},\"application/vnd.zul\":{source:\"iana\",extensions:[\"zir\",\"zirz\"]},\"application/vnd.zzazz.deck+xml\":{source:\"iana\",compressible:!0,extensions:[\"zaz\"]},\"application/voicexml+xml\":{source:\"iana\",compressible:!0,extensions:[\"vxml\"]},\"application/voucher-cms+json\":{source:\"iana\",compressible:!0},\"application/vp\":{source:\"iana\"},\"application/vq-rtcpxr\":{source:\"iana\"},\"application/wasm\":{source:\"iana\",compressible:!0,extensions:[\"wasm\"]},\"application/watcherinfo+xml\":{source:\"iana\",compressible:!0,extensions:[\"wif\"]},\"application/webpush-options+json\":{source:\"iana\",compressible:!0},\"application/whoispp-query\":{source:\"iana\"},\"application/whoispp-response\":{source:\"iana\"},\"application/widget\":{source:\"iana\",extensions:[\"wgt\"]},\"application/winhlp\":{source:\"apache\",extensions:[\"hlp\"]},\"application/wita\":{source:\"iana\"},\"application/wordperfect5.1\":{source:\"iana\"},\"application/wsdl+xml\":{source:\"iana\",compressible:!0,extensions:[\"wsdl\"]},\"application/wspolicy+xml\":{source:\"iana\",compressible:!0,extensions:[\"wspolicy\"]},\"application/x-7z-compressed\":{source:\"apache\",compressible:!1,extensions:[\"7z\"]},\"application/x-abiword\":{source:\"apache\",extensions:[\"abw\"]},\"application/x-ace-compressed\":{source:\"apache\",extensions:[\"ace\"]},\"application/x-amf\":{source:\"apache\"},\"application/x-apple-diskimage\":{source:\"apache\",extensions:[\"dmg\"]},\"application/x-arj\":{compressible:!1,extensions:[\"arj\"]},\"application/x-authorware-bin\":{source:\"apache\",extensions:[\"aab\",\"x32\",\"u32\",\"vox\"]},\"application/x-authorware-map\":{source:\"apache\",extensions:[\"aam\"]},\"application/x-authorware-seg\":{source:\"apache\",extensions:[\"aas\"]},\"application/x-bcpio\":{source:\"apache\",extensions:[\"bcpio\"]},\"application/x-bdoc\":{compressible:!1,extensions:[\"bdoc\"]},\"application/x-bittorrent\":{source:\"apache\",extensions:[\"torrent\"]},\"application/x-blorb\":{source:\"apache\",extensions:[\"blb\",\"blorb\"]},\"application/x-bzip\":{source:\"apache\",compressible:!1,extensions:[\"bz\"]},\"application/x-bzip2\":{source:\"apache\",compressible:!1,extensions:[\"bz2\",\"boz\"]},\"application/x-cbr\":{source:\"apache\",extensions:[\"cbr\",\"cba\",\"cbt\",\"cbz\",\"cb7\"]},\"application/x-cdlink\":{source:\"apache\",extensions:[\"vcd\"]},\"application/x-cfs-compressed\":{source:\"apache\",extensions:[\"cfs\"]},\"application/x-chat\":{source:\"apache\",extensions:[\"chat\"]},\"application/x-chess-pgn\":{source:\"apache\",extensions:[\"pgn\"]},\"application/x-chrome-extension\":{extensions:[\"crx\"]},\"application/x-cocoa\":{source:\"nginx\",extensions:[\"cco\"]},\"application/x-compress\":{source:\"apache\"},\"application/x-conference\":{source:\"apache\",extensions:[\"nsc\"]},\"application/x-cpio\":{source:\"apache\",extensions:[\"cpio\"]},\"application/x-csh\":{source:\"apache\",extensions:[\"csh\"]},\"application/x-deb\":{compressible:!1},\"application/x-debian-package\":{source:\"apache\",extensions:[\"deb\",\"udeb\"]},\"application/x-dgc-compressed\":{source:\"apache\",extensions:[\"dgc\"]},\"application/x-director\":{source:\"apache\",extensions:[\"dir\",\"dcr\",\"dxr\",\"cst\",\"cct\",\"cxt\",\"w3d\",\"fgd\",\"swa\"]},\"application/x-doom\":{source:\"apache\",extensions:[\"wad\"]},\"application/x-dtbncx+xml\":{source:\"apache\",compressible:!0,extensions:[\"ncx\"]},\"application/x-dtbook+xml\":{source:\"apache\",compressible:!0,extensions:[\"dtb\"]},\"application/x-dtbresource+xml\":{source:\"apache\",compressible:!0,extensions:[\"res\"]},\"application/x-dvi\":{source:\"apache\",compressible:!1,extensions:[\"dvi\"]},\"application/x-envoy\":{source:\"apache\",extensions:[\"evy\"]},\"application/x-eva\":{source:\"apache\",extensions:[\"eva\"]},\"application/x-font-bdf\":{source:\"apache\",extensions:[\"bdf\"]},\"application/x-font-dos\":{source:\"apache\"},\"application/x-font-framemaker\":{source:\"apache\"},\"application/x-font-ghostscript\":{source:\"apache\",extensions:[\"gsf\"]},\"application/x-font-libgrx\":{source:\"apache\"},\"application/x-font-linux-psf\":{source:\"apache\",extensions:[\"psf\"]},\"application/x-font-pcf\":{source:\"apache\",extensions:[\"pcf\"]},\"application/x-font-snf\":{source:\"apache\",extensions:[\"snf\"]},\"application/x-font-speedo\":{source:\"apache\"},\"application/x-font-sunos-news\":{source:\"apache\"},\"application/x-font-type1\":{source:\"apache\",extensions:[\"pfa\",\"pfb\",\"pfm\",\"afm\"]},\"application/x-font-vfont\":{source:\"apache\"},\"application/x-freearc\":{source:\"apache\",extensions:[\"arc\"]},\"application/x-futuresplash\":{source:\"apache\",extensions:[\"spl\"]},\"application/x-gca-compressed\":{source:\"apache\",extensions:[\"gca\"]},\"application/x-glulx\":{source:\"apache\",extensions:[\"ulx\"]},\"application/x-gnumeric\":{source:\"apache\",extensions:[\"gnumeric\"]},\"application/x-gramps-xml\":{source:\"apache\",extensions:[\"gramps\"]},\"application/x-gtar\":{source:\"apache\",extensions:[\"gtar\"]},\"application/x-gzip\":{source:\"apache\"},\"application/x-hdf\":{source:\"apache\",extensions:[\"hdf\"]},\"application/x-httpd-php\":{compressible:!0,extensions:[\"php\"]},\"application/x-install-instructions\":{source:\"apache\",extensions:[\"install\"]},\"application/x-iso9660-image\":{source:\"apache\",extensions:[\"iso\"]},\"application/x-iwork-keynote-sffkey\":{extensions:[\"key\"]},\"application/x-iwork-numbers-sffnumbers\":{extensions:[\"numbers\"]},\"application/x-iwork-pages-sffpages\":{extensions:[\"pages\"]},\"application/x-java-archive-diff\":{source:\"nginx\",extensions:[\"jardiff\"]},\"application/x-java-jnlp-file\":{source:\"apache\",compressible:!1,extensions:[\"jnlp\"]},\"application/x-javascript\":{compressible:!0},\"application/x-keepass2\":{extensions:[\"kdbx\"]},\"application/x-latex\":{source:\"apache\",compressible:!1,extensions:[\"latex\"]},\"application/x-lua-bytecode\":{extensions:[\"luac\"]},\"application/x-lzh-compressed\":{source:\"apache\",extensions:[\"lzh\",\"lha\"]},\"application/x-makeself\":{source:\"nginx\",extensions:[\"run\"]},\"application/x-mie\":{source:\"apache\",extensions:[\"mie\"]},\"application/x-mobipocket-ebook\":{source:\"apache\",extensions:[\"prc\",\"mobi\"]},\"application/x-mpegurl\":{compressible:!1},\"application/x-ms-application\":{source:\"apache\",extensions:[\"application\"]},\"application/x-ms-shortcut\":{source:\"apache\",extensions:[\"lnk\"]},\"application/x-ms-wmd\":{source:\"apache\",extensions:[\"wmd\"]},\"application/x-ms-wmz\":{source:\"apache\",extensions:[\"wmz\"]},\"application/x-ms-xbap\":{source:\"apache\",extensions:[\"xbap\"]},\"application/x-msaccess\":{source:\"apache\",extensions:[\"mdb\"]},\"application/x-msbinder\":{source:\"apache\",extensions:[\"obd\"]},\"application/x-mscardfile\":{source:\"apache\",extensions:[\"crd\"]},\"application/x-msclip\":{source:\"apache\",extensions:[\"clp\"]},\"application/x-msdos-program\":{extensions:[\"exe\"]},\"application/x-msdownload\":{source:\"apache\",extensions:[\"exe\",\"dll\",\"com\",\"bat\",\"msi\"]},\"application/x-msmediaview\":{source:\"apache\",extensions:[\"mvb\",\"m13\",\"m14\"]},\"application/x-msmetafile\":{source:\"apache\",extensions:[\"wmf\",\"wmz\",\"emf\",\"emz\"]},\"application/x-msmoney\":{source:\"apache\",extensions:[\"mny\"]},\"application/x-mspublisher\":{source:\"apache\",extensions:[\"pub\"]},\"application/x-msschedule\":{source:\"apache\",extensions:[\"scd\"]},\"application/x-msterminal\":{source:\"apache\",extensions:[\"trm\"]},\"application/x-mswrite\":{source:\"apache\",extensions:[\"wri\"]},\"application/x-netcdf\":{source:\"apache\",extensions:[\"nc\",\"cdf\"]},\"application/x-ns-proxy-autoconfig\":{compressible:!0,extensions:[\"pac\"]},\"application/x-nzb\":{source:\"apache\",extensions:[\"nzb\"]},\"application/x-perl\":{source:\"nginx\",extensions:[\"pl\",\"pm\"]},\"application/x-pilot\":{source:\"nginx\",extensions:[\"prc\",\"pdb\"]},\"application/x-pkcs12\":{source:\"apache\",compressible:!1,extensions:[\"p12\",\"pfx\"]},\"application/x-pkcs7-certificates\":{source:\"apache\",extensions:[\"p7b\",\"spc\"]},\"application/x-pkcs7-certreqresp\":{source:\"apache\",extensions:[\"p7r\"]},\"application/x-pki-message\":{source:\"iana\"},\"application/x-rar-compressed\":{source:\"apache\",compressible:!1,extensions:[\"rar\"]},\"application/x-redhat-package-manager\":{source:\"nginx\",extensions:[\"rpm\"]},\"application/x-research-info-systems\":{source:\"apache\",extensions:[\"ris\"]},\"application/x-sea\":{source:\"nginx\",extensions:[\"sea\"]},\"application/x-sh\":{source:\"apache\",compressible:!0,extensions:[\"sh\"]},\"application/x-shar\":{source:\"apache\",extensions:[\"shar\"]},\"application/x-shockwave-flash\":{source:\"apache\",compressible:!1,extensions:[\"swf\"]},\"application/x-silverlight-app\":{source:\"apache\",extensions:[\"xap\"]},\"application/x-sql\":{source:\"apache\",extensions:[\"sql\"]},\"application/x-stuffit\":{source:\"apache\",compressible:!1,extensions:[\"sit\"]},\"application/x-stuffitx\":{source:\"apache\",extensions:[\"sitx\"]},\"application/x-subrip\":{source:\"apache\",extensions:[\"srt\"]},\"application/x-sv4cpio\":{source:\"apache\",extensions:[\"sv4cpio\"]},\"application/x-sv4crc\":{source:\"apache\",extensions:[\"sv4crc\"]},\"application/x-t3vm-image\":{source:\"apache\",extensions:[\"t3\"]},\"application/x-tads\":{source:\"apache\",extensions:[\"gam\"]},\"application/x-tar\":{source:\"apache\",compressible:!0,extensions:[\"tar\"]},\"application/x-tcl\":{source:\"apache\",extensions:[\"tcl\",\"tk\"]},\"application/x-tex\":{source:\"apache\",extensions:[\"tex\"]},\"application/x-tex-tfm\":{source:\"apache\",extensions:[\"tfm\"]},\"application/x-texinfo\":{source:\"apache\",extensions:[\"texinfo\",\"texi\"]},\"application/x-tgif\":{source:\"apache\",extensions:[\"obj\"]},\"application/x-ustar\":{source:\"apache\",extensions:[\"ustar\"]},\"application/x-virtualbox-hdd\":{compressible:!0,extensions:[\"hdd\"]},\"application/x-virtualbox-ova\":{compressible:!0,extensions:[\"ova\"]},\"application/x-virtualbox-ovf\":{compressible:!0,extensions:[\"ovf\"]},\"application/x-virtualbox-vbox\":{compressible:!0,extensions:[\"vbox\"]},\"application/x-virtualbox-vbox-extpack\":{compressible:!1,extensions:[\"vbox-extpack\"]},\"application/x-virtualbox-vdi\":{compressible:!0,extensions:[\"vdi\"]},\"application/x-virtualbox-vhd\":{compressible:!0,extensions:[\"vhd\"]},\"application/x-virtualbox-vmdk\":{compressible:!0,extensions:[\"vmdk\"]},\"application/x-wais-source\":{source:\"apache\",extensions:[\"src\"]},\"application/x-web-app-manifest+json\":{compressible:!0,extensions:[\"webapp\"]},\"application/x-www-form-urlencoded\":{source:\"iana\",compressible:!0},\"application/x-x509-ca-cert\":{source:\"iana\",extensions:[\"der\",\"crt\",\"pem\"]},\"application/x-x509-ca-ra-cert\":{source:\"iana\"},\"application/x-x509-next-ca-cert\":{source:\"iana\"},\"application/x-xfig\":{source:\"apache\",extensions:[\"fig\"]},\"application/x-xliff+xml\":{source:\"apache\",compressible:!0,extensions:[\"xlf\"]},\"application/x-xpinstall\":{source:\"apache\",compressible:!1,extensions:[\"xpi\"]},\"application/x-xz\":{source:\"apache\",extensions:[\"xz\"]},\"application/x-zmachine\":{source:\"apache\",extensions:[\"z1\",\"z2\",\"z3\",\"z4\",\"z5\",\"z6\",\"z7\",\"z8\"]},\"application/x400-bp\":{source:\"iana\"},\"application/xacml+xml\":{source:\"iana\",compressible:!0},\"application/xaml+xml\":{source:\"apache\",compressible:!0,extensions:[\"xaml\"]},\"application/xcap-att+xml\":{source:\"iana\",compressible:!0,extensions:[\"xav\"]},\"application/xcap-caps+xml\":{source:\"iana\",compressible:!0,extensions:[\"xca\"]},\"application/xcap-diff+xml\":{source:\"iana\",compressible:!0,extensions:[\"xdf\"]},\"application/xcap-el+xml\":{source:\"iana\",compressible:!0,extensions:[\"xel\"]},\"application/xcap-error+xml\":{source:\"iana\",compressible:!0},\"application/xcap-ns+xml\":{source:\"iana\",compressible:!0,extensions:[\"xns\"]},\"application/xcon-conference-info+xml\":{source:\"iana\",compressible:!0},\"application/xcon-conference-info-diff+xml\":{source:\"iana\",compressible:!0},\"application/xenc+xml\":{source:\"iana\",compressible:!0,extensions:[\"xenc\"]},\"application/xfdf\":{source:\"iana\",extensions:[\"xfdf\"]},\"application/xhtml+xml\":{source:\"iana\",compressible:!0,extensions:[\"xhtml\",\"xht\"]},\"application/xhtml-voice+xml\":{source:\"apache\",compressible:!0},\"application/xliff+xml\":{source:\"iana\",compressible:!0,extensions:[\"xlf\"]},\"application/xml\":{source:\"iana\",compressible:!0,extensions:[\"xml\",\"xsl\",\"xsd\",\"rng\"]},\"application/xml-dtd\":{source:\"iana\",compressible:!0,extensions:[\"dtd\"]},\"application/xml-external-parsed-entity\":{source:\"iana\"},\"application/xml-patch+xml\":{source:\"iana\",compressible:!0},\"application/xmpp+xml\":{source:\"iana\",compressible:!0},\"application/xop+xml\":{source:\"iana\",compressible:!0,extensions:[\"xop\"]},\"application/xproc+xml\":{source:\"apache\",compressible:!0,extensions:[\"xpl\"]},\"application/xslt+xml\":{source:\"iana\",compressible:!0,extensions:[\"xsl\",\"xslt\"]},\"application/xspf+xml\":{source:\"apache\",compressible:!0,extensions:[\"xspf\"]},\"application/xv+xml\":{source:\"iana\",compressible:!0,extensions:[\"mxml\",\"xhvml\",\"xvml\",\"xvm\"]},\"application/yaml\":{source:\"iana\"},\"application/yang\":{source:\"iana\",extensions:[\"yang\"]},\"application/yang-data+cbor\":{source:\"iana\"},\"application/yang-data+json\":{source:\"iana\",compressible:!0},\"application/yang-data+xml\":{source:\"iana\",compressible:!0},\"application/yang-patch+json\":{source:\"iana\",compressible:!0},\"application/yang-patch+xml\":{source:\"iana\",compressible:!0},\"application/yang-sid+json\":{source:\"iana\",compressible:!0},\"application/yin+xml\":{source:\"iana\",compressible:!0,extensions:[\"yin\"]},\"application/zip\":{source:\"iana\",compressible:!1,extensions:[\"zip\"]},\"application/zlib\":{source:\"iana\"},\"application/zstd\":{source:\"iana\"},\"audio/1d-interleaved-parityfec\":{source:\"iana\"},\"audio/32kadpcm\":{source:\"iana\"},\"audio/3gpp\":{source:\"iana\",compressible:!1,extensions:[\"3gpp\"]},\"audio/3gpp2\":{source:\"iana\"},\"audio/aac\":{source:\"iana\",extensions:[\"adts\",\"aac\"]},\"audio/ac3\":{source:\"iana\"},\"audio/adpcm\":{source:\"apache\",extensions:[\"adp\"]},\"audio/amr\":{source:\"iana\",extensions:[\"amr\"]},\"audio/amr-wb\":{source:\"iana\"},\"audio/amr-wb+\":{source:\"iana\"},\"audio/aptx\":{source:\"iana\"},\"audio/asc\":{source:\"iana\"},\"audio/atrac-advanced-lossless\":{source:\"iana\"},\"audio/atrac-x\":{source:\"iana\"},\"audio/atrac3\":{source:\"iana\"},\"audio/basic\":{source:\"iana\",compressible:!1,extensions:[\"au\",\"snd\"]},\"audio/bv16\":{source:\"iana\"},\"audio/bv32\":{source:\"iana\"},\"audio/clearmode\":{source:\"iana\"},\"audio/cn\":{source:\"iana\"},\"audio/dat12\":{source:\"iana\"},\"audio/dls\":{source:\"iana\"},\"audio/dsr-es201108\":{source:\"iana\"},\"audio/dsr-es202050\":{source:\"iana\"},\"audio/dsr-es202211\":{source:\"iana\"},\"audio/dsr-es202212\":{source:\"iana\"},\"audio/dv\":{source:\"iana\"},\"audio/dvi4\":{source:\"iana\"},\"audio/eac3\":{source:\"iana\"},\"audio/encaprtp\":{source:\"iana\"},\"audio/evrc\":{source:\"iana\"},\"audio/evrc-qcp\":{source:\"iana\"},\"audio/evrc0\":{source:\"iana\"},\"audio/evrc1\":{source:\"iana\"},\"audio/evrcb\":{source:\"iana\"},\"audio/evrcb0\":{source:\"iana\"},\"audio/evrcb1\":{source:\"iana\"},\"audio/evrcnw\":{source:\"iana\"},\"audio/evrcnw0\":{source:\"iana\"},\"audio/evrcnw1\":{source:\"iana\"},\"audio/evrcwb\":{source:\"iana\"},\"audio/evrcwb0\":{source:\"iana\"},\"audio/evrcwb1\":{source:\"iana\"},\"audio/evs\":{source:\"iana\"},\"audio/flac\":{source:\"iana\"},\"audio/flexfec\":{source:\"iana\"},\"audio/fwdred\":{source:\"iana\"},\"audio/g711-0\":{source:\"iana\"},\"audio/g719\":{source:\"iana\"},\"audio/g722\":{source:\"iana\"},\"audio/g7221\":{source:\"iana\"},\"audio/g723\":{source:\"iana\"},\"audio/g726-16\":{source:\"iana\"},\"audio/g726-24\":{source:\"iana\"},\"audio/g726-32\":{source:\"iana\"},\"audio/g726-40\":{source:\"iana\"},\"audio/g728\":{source:\"iana\"},\"audio/g729\":{source:\"iana\"},\"audio/g7291\":{source:\"iana\"},\"audio/g729d\":{source:\"iana\"},\"audio/g729e\":{source:\"iana\"},\"audio/gsm\":{source:\"iana\"},\"audio/gsm-efr\":{source:\"iana\"},\"audio/gsm-hr-08\":{source:\"iana\"},\"audio/ilbc\":{source:\"iana\"},\"audio/ip-mr_v2.5\":{source:\"iana\"},\"audio/isac\":{source:\"apache\"},\"audio/l16\":{source:\"iana\"},\"audio/l20\":{source:\"iana\"},\"audio/l24\":{source:\"iana\",compressible:!1},\"audio/l8\":{source:\"iana\"},\"audio/lpc\":{source:\"iana\"},\"audio/matroska\":{source:\"iana\"},\"audio/melp\":{source:\"iana\"},\"audio/melp1200\":{source:\"iana\"},\"audio/melp2400\":{source:\"iana\"},\"audio/melp600\":{source:\"iana\"},\"audio/mhas\":{source:\"iana\"},\"audio/midi\":{source:\"apache\",extensions:[\"mid\",\"midi\",\"kar\",\"rmi\"]},\"audio/midi-clip\":{source:\"iana\"},\"audio/mobile-xmf\":{source:\"iana\",extensions:[\"mxmf\"]},\"audio/mp3\":{compressible:!1,extensions:[\"mp3\"]},\"audio/mp4\":{source:\"iana\",compressible:!1,extensions:[\"m4a\",\"mp4a\"]},\"audio/mp4a-latm\":{source:\"iana\"},\"audio/mpa\":{source:\"iana\"},\"audio/mpa-robust\":{source:\"iana\"},\"audio/mpeg\":{source:\"iana\",compressible:!1,extensions:[\"mpga\",\"mp2\",\"mp2a\",\"mp3\",\"m2a\",\"m3a\"]},\"audio/mpeg4-generic\":{source:\"iana\"},\"audio/musepack\":{source:\"apache\"},\"audio/ogg\":{source:\"iana\",compressible:!1,extensions:[\"oga\",\"ogg\",\"spx\",\"opus\"]},\"audio/opus\":{source:\"iana\"},\"audio/parityfec\":{source:\"iana\"},\"audio/pcma\":{source:\"iana\"},\"audio/pcma-wb\":{source:\"iana\"},\"audio/pcmu\":{source:\"iana\"},\"audio/pcmu-wb\":{source:\"iana\"},\"audio/prs.sid\":{source:\"iana\"},\"audio/qcelp\":{source:\"iana\"},\"audio/raptorfec\":{source:\"iana\"},\"audio/red\":{source:\"iana\"},\"audio/rtp-enc-aescm128\":{source:\"iana\"},\"audio/rtp-midi\":{source:\"iana\"},\"audio/rtploopback\":{source:\"iana\"},\"audio/rtx\":{source:\"iana\"},\"audio/s3m\":{source:\"apache\",extensions:[\"s3m\"]},\"audio/scip\":{source:\"iana\"},\"audio/silk\":{source:\"apache\",extensions:[\"sil\"]},\"audio/smv\":{source:\"iana\"},\"audio/smv-qcp\":{source:\"iana\"},\"audio/smv0\":{source:\"iana\"},\"audio/sofa\":{source:\"iana\"},\"audio/sp-midi\":{source:\"iana\"},\"audio/speex\":{source:\"iana\"},\"audio/t140c\":{source:\"iana\"},\"audio/t38\":{source:\"iana\"},\"audio/telephone-event\":{source:\"iana\"},\"audio/tetra_acelp\":{source:\"iana\"},\"audio/tetra_acelp_bb\":{source:\"iana\"},\"audio/tone\":{source:\"iana\"},\"audio/tsvcis\":{source:\"iana\"},\"audio/uemclip\":{source:\"iana\"},\"audio/ulpfec\":{source:\"iana\"},\"audio/usac\":{source:\"iana\"},\"audio/vdvi\":{source:\"iana\"},\"audio/vmr-wb\":{source:\"iana\"},\"audio/vnd.3gpp.iufp\":{source:\"iana\"},\"audio/vnd.4sb\":{source:\"iana\"},\"audio/vnd.audiokoz\":{source:\"iana\"},\"audio/vnd.celp\":{source:\"iana\"},\"audio/vnd.cisco.nse\":{source:\"iana\"},\"audio/vnd.cmles.radio-events\":{source:\"iana\"},\"audio/vnd.cns.anp1\":{source:\"iana\"},\"audio/vnd.cns.inf1\":{source:\"iana\"},\"audio/vnd.dece.audio\":{source:\"iana\",extensions:[\"uva\",\"uvva\"]},\"audio/vnd.digital-winds\":{source:\"iana\",extensions:[\"eol\"]},\"audio/vnd.dlna.adts\":{source:\"iana\"},\"audio/vnd.dolby.heaac.1\":{source:\"iana\"},\"audio/vnd.dolby.heaac.2\":{source:\"iana\"},\"audio/vnd.dolby.mlp\":{source:\"iana\"},\"audio/vnd.dolby.mps\":{source:\"iana\"},\"audio/vnd.dolby.pl2\":{source:\"iana\"},\"audio/vnd.dolby.pl2x\":{source:\"iana\"},\"audio/vnd.dolby.pl2z\":{source:\"iana\"},\"audio/vnd.dolby.pulse.1\":{source:\"iana\"},\"audio/vnd.dra\":{source:\"iana\",extensions:[\"dra\"]},\"audio/vnd.dts\":{source:\"iana\",extensions:[\"dts\"]},\"audio/vnd.dts.hd\":{source:\"iana\",extensions:[\"dtshd\"]},\"audio/vnd.dts.uhd\":{source:\"iana\"},\"audio/vnd.dvb.file\":{source:\"iana\"},\"audio/vnd.everad.plj\":{source:\"iana\"},\"audio/vnd.hns.audio\":{source:\"iana\"},\"audio/vnd.lucent.voice\":{source:\"iana\",extensions:[\"lvp\"]},\"audio/vnd.ms-playready.media.pya\":{source:\"iana\",extensions:[\"pya\"]},\"audio/vnd.nokia.mobile-xmf\":{source:\"iana\"},\"audio/vnd.nortel.vbk\":{source:\"iana\"},\"audio/vnd.nuera.ecelp4800\":{source:\"iana\",extensions:[\"ecelp4800\"]},\"audio/vnd.nuera.ecelp7470\":{source:\"iana\",extensions:[\"ecelp7470\"]},\"audio/vnd.nuera.ecelp9600\":{source:\"iana\",extensions:[\"ecelp9600\"]},\"audio/vnd.octel.sbc\":{source:\"iana\"},\"audio/vnd.presonus.multitrack\":{source:\"iana\"},\"audio/vnd.qcelp\":{source:\"apache\"},\"audio/vnd.rhetorex.32kadpcm\":{source:\"iana\"},\"audio/vnd.rip\":{source:\"iana\",extensions:[\"rip\"]},\"audio/vnd.rn-realaudio\":{compressible:!1},\"audio/vnd.sealedmedia.softseal.mpeg\":{source:\"iana\"},\"audio/vnd.vmx.cvsd\":{source:\"iana\"},\"audio/vnd.wave\":{compressible:!1},\"audio/vorbis\":{source:\"iana\",compressible:!1},\"audio/vorbis-config\":{source:\"iana\"},\"audio/wav\":{compressible:!1,extensions:[\"wav\"]},\"audio/wave\":{compressible:!1,extensions:[\"wav\"]},\"audio/webm\":{source:\"apache\",compressible:!1,extensions:[\"weba\"]},\"audio/x-aac\":{source:\"apache\",compressible:!1,extensions:[\"aac\"]},\"audio/x-aiff\":{source:\"apache\",extensions:[\"aif\",\"aiff\",\"aifc\"]},\"audio/x-caf\":{source:\"apache\",compressible:!1,extensions:[\"caf\"]},\"audio/x-flac\":{source:\"apache\",extensions:[\"flac\"]},\"audio/x-m4a\":{source:\"nginx\",extensions:[\"m4a\"]},\"audio/x-matroska\":{source:\"apache\",extensions:[\"mka\"]},\"audio/x-mpegurl\":{source:\"apache\",extensions:[\"m3u\"]},\"audio/x-ms-wax\":{source:\"apache\",extensions:[\"wax\"]},\"audio/x-ms-wma\":{source:\"apache\",extensions:[\"wma\"]},\"audio/x-pn-realaudio\":{source:\"apache\",extensions:[\"ram\",\"ra\"]},\"audio/x-pn-realaudio-plugin\":{source:\"apache\",extensions:[\"rmp\"]},\"audio/x-realaudio\":{source:\"nginx\",extensions:[\"ra\"]},\"audio/x-tta\":{source:\"apache\"},\"audio/x-wav\":{source:\"apache\",extensions:[\"wav\"]},\"audio/xm\":{source:\"apache\",extensions:[\"xm\"]},\"chemical/x-cdx\":{source:\"apache\",extensions:[\"cdx\"]},\"chemical/x-cif\":{source:\"apache\",extensions:[\"cif\"]},\"chemical/x-cmdf\":{source:\"apache\",extensions:[\"cmdf\"]},\"chemical/x-cml\":{source:\"apache\",extensions:[\"cml\"]},\"chemical/x-csml\":{source:\"apache\",extensions:[\"csml\"]},\"chemical/x-pdb\":{source:\"apache\"},\"chemical/x-xyz\":{source:\"apache\",extensions:[\"xyz\"]},\"font/collection\":{source:\"iana\",extensions:[\"ttc\"]},\"font/otf\":{source:\"iana\",compressible:!0,extensions:[\"otf\"]},\"font/sfnt\":{source:\"iana\"},\"font/ttf\":{source:\"iana\",compressible:!0,extensions:[\"ttf\"]},\"font/woff\":{source:\"iana\",extensions:[\"woff\"]},\"font/woff2\":{source:\"iana\",extensions:[\"woff2\"]},\"image/aces\":{source:\"iana\",extensions:[\"exr\"]},\"image/apng\":{source:\"iana\",compressible:!1,extensions:[\"apng\"]},\"image/avci\":{source:\"iana\",extensions:[\"avci\"]},\"image/avcs\":{source:\"iana\",extensions:[\"avcs\"]},\"image/avif\":{source:\"iana\",compressible:!1,extensions:[\"avif\"]},\"image/bmp\":{source:\"iana\",compressible:!0,extensions:[\"bmp\",\"dib\"]},\"image/cgm\":{source:\"iana\",extensions:[\"cgm\"]},\"image/dicom-rle\":{source:\"iana\",extensions:[\"drle\"]},\"image/dpx\":{source:\"iana\",extensions:[\"dpx\"]},\"image/emf\":{source:\"iana\",extensions:[\"emf\"]},\"image/fits\":{source:\"iana\",extensions:[\"fits\"]},\"image/g3fax\":{source:\"iana\",extensions:[\"g3\"]},\"image/gif\":{source:\"iana\",compressible:!1,extensions:[\"gif\"]},\"image/heic\":{source:\"iana\",extensions:[\"heic\"]},\"image/heic-sequence\":{source:\"iana\",extensions:[\"heics\"]},\"image/heif\":{source:\"iana\",extensions:[\"heif\"]},\"image/heif-sequence\":{source:\"iana\",extensions:[\"heifs\"]},\"image/hej2k\":{source:\"iana\",extensions:[\"hej2\"]},\"image/hsj2\":{source:\"iana\",extensions:[\"hsj2\"]},\"image/ief\":{source:\"iana\",extensions:[\"ief\"]},\"image/j2c\":{source:\"iana\"},\"image/jls\":{source:\"iana\",extensions:[\"jls\"]},\"image/jp2\":{source:\"iana\",compressible:!1,extensions:[\"jp2\",\"jpg2\"]},\"image/jpeg\":{source:\"iana\",compressible:!1,extensions:[\"jpeg\",\"jpg\",\"jpe\"]},\"image/jph\":{source:\"iana\",extensions:[\"jph\"]},\"image/jphc\":{source:\"iana\",extensions:[\"jhc\"]},\"image/jpm\":{source:\"iana\",compressible:!1,extensions:[\"jpm\",\"jpgm\"]},\"image/jpx\":{source:\"iana\",compressible:!1,extensions:[\"jpx\",\"jpf\"]},\"image/jxl\":{source:\"iana\",extensions:[\"jxl\"]},\"image/jxr\":{source:\"iana\",extensions:[\"jxr\"]},\"image/jxra\":{source:\"iana\",extensions:[\"jxra\"]},\"image/jxrs\":{source:\"iana\",extensions:[\"jxrs\"]},\"image/jxs\":{source:\"iana\",extensions:[\"jxs\"]},\"image/jxsc\":{source:\"iana\",extensions:[\"jxsc\"]},\"image/jxsi\":{source:\"iana\",extensions:[\"jxsi\"]},\"image/jxss\":{source:\"iana\",extensions:[\"jxss\"]},\"image/ktx\":{source:\"iana\",extensions:[\"ktx\"]},\"image/ktx2\":{source:\"iana\",extensions:[\"ktx2\"]},\"image/naplps\":{source:\"iana\"},\"image/pjpeg\":{compressible:!1},\"image/png\":{source:\"iana\",compressible:!1,extensions:[\"png\"]},\"image/prs.btif\":{source:\"iana\",extensions:[\"btif\",\"btf\"]},\"image/prs.pti\":{source:\"iana\",extensions:[\"pti\"]},\"image/pwg-raster\":{source:\"iana\"},\"image/sgi\":{source:\"apache\",extensions:[\"sgi\"]},\"image/svg+xml\":{source:\"iana\",compressible:!0,extensions:[\"svg\",\"svgz\"]},\"image/t38\":{source:\"iana\",extensions:[\"t38\"]},\"image/tiff\":{source:\"iana\",compressible:!1,extensions:[\"tif\",\"tiff\"]},\"image/tiff-fx\":{source:\"iana\",extensions:[\"tfx\"]},\"image/vnd.adobe.photoshop\":{source:\"iana\",compressible:!0,extensions:[\"psd\"]},\"image/vnd.airzip.accelerator.azv\":{source:\"iana\",extensions:[\"azv\"]},\"image/vnd.cns.inf2\":{source:\"iana\"},\"image/vnd.dece.graphic\":{source:\"iana\",extensions:[\"uvi\",\"uvvi\",\"uvg\",\"uvvg\"]},\"image/vnd.djvu\":{source:\"iana\",extensions:[\"djvu\",\"djv\"]},\"image/vnd.dvb.subtitle\":{source:\"iana\",extensions:[\"sub\"]},\"image/vnd.dwg\":{source:\"iana\",extensions:[\"dwg\"]},\"image/vnd.dxf\":{source:\"iana\",extensions:[\"dxf\"]},\"image/vnd.fastbidsheet\":{source:\"iana\",extensions:[\"fbs\"]},\"image/vnd.fpx\":{source:\"iana\",extensions:[\"fpx\"]},\"image/vnd.fst\":{source:\"iana\",extensions:[\"fst\"]},\"image/vnd.fujixerox.edmics-mmr\":{source:\"iana\",extensions:[\"mmr\"]},\"image/vnd.fujixerox.edmics-rlc\":{source:\"iana\",extensions:[\"rlc\"]},\"image/vnd.globalgraphics.pgb\":{source:\"iana\"},\"image/vnd.microsoft.icon\":{source:\"iana\",compressible:!0,extensions:[\"ico\"]},\"image/vnd.mix\":{source:\"iana\"},\"image/vnd.mozilla.apng\":{source:\"iana\"},\"image/vnd.ms-dds\":{compressible:!0,extensions:[\"dds\"]},\"image/vnd.ms-modi\":{source:\"iana\",extensions:[\"mdi\"]},\"image/vnd.ms-photo\":{source:\"apache\",extensions:[\"wdp\"]},\"image/vnd.net-fpx\":{source:\"iana\",extensions:[\"npx\"]},\"image/vnd.pco.b16\":{source:\"iana\",extensions:[\"b16\"]},\"image/vnd.radiance\":{source:\"iana\"},\"image/vnd.sealed.png\":{source:\"iana\"},\"image/vnd.sealedmedia.softseal.gif\":{source:\"iana\"},\"image/vnd.sealedmedia.softseal.jpg\":{source:\"iana\"},\"image/vnd.svf\":{source:\"iana\"},\"image/vnd.tencent.tap\":{source:\"iana\",extensions:[\"tap\"]},\"image/vnd.valve.source.texture\":{source:\"iana\",extensions:[\"vtf\"]},\"image/vnd.wap.wbmp\":{source:\"iana\",extensions:[\"wbmp\"]},\"image/vnd.xiff\":{source:\"iana\",extensions:[\"xif\"]},\"image/vnd.zbrush.pcx\":{source:\"iana\",extensions:[\"pcx\"]},\"image/webp\":{source:\"iana\",extensions:[\"webp\"]},\"image/wmf\":{source:\"iana\",extensions:[\"wmf\"]},\"image/x-3ds\":{source:\"apache\",extensions:[\"3ds\"]},\"image/x-cmu-raster\":{source:\"apache\",extensions:[\"ras\"]},\"image/x-cmx\":{source:\"apache\",extensions:[\"cmx\"]},\"image/x-freehand\":{source:\"apache\",extensions:[\"fh\",\"fhc\",\"fh4\",\"fh5\",\"fh7\"]},\"image/x-icon\":{source:\"apache\",compressible:!0,extensions:[\"ico\"]},\"image/x-jng\":{source:\"nginx\",extensions:[\"jng\"]},\"image/x-mrsid-image\":{source:\"apache\",extensions:[\"sid\"]},\"image/x-ms-bmp\":{source:\"nginx\",compressible:!0,extensions:[\"bmp\"]},\"image/x-pcx\":{source:\"apache\",extensions:[\"pcx\"]},\"image/x-pict\":{source:\"apache\",extensions:[\"pic\",\"pct\"]},\"image/x-portable-anymap\":{source:\"apache\",extensions:[\"pnm\"]},\"image/x-portable-bitmap\":{source:\"apache\",extensions:[\"pbm\"]},\"image/x-portable-graymap\":{source:\"apache\",extensions:[\"pgm\"]},\"image/x-portable-pixmap\":{source:\"apache\",extensions:[\"ppm\"]},\"image/x-rgb\":{source:\"apache\",extensions:[\"rgb\"]},\"image/x-tga\":{source:\"apache\",extensions:[\"tga\"]},\"image/x-xbitmap\":{source:\"apache\",extensions:[\"xbm\"]},\"image/x-xcf\":{compressible:!1},\"image/x-xpixmap\":{source:\"apache\",extensions:[\"xpm\"]},\"image/x-xwindowdump\":{source:\"apache\",extensions:[\"xwd\"]},\"message/bhttp\":{source:\"iana\"},\"message/cpim\":{source:\"iana\"},\"message/delivery-status\":{source:\"iana\"},\"message/disposition-notification\":{source:\"iana\",extensions:[\"disposition-notification\"]},\"message/external-body\":{source:\"iana\"},\"message/feedback-report\":{source:\"iana\"},\"message/global\":{source:\"iana\",extensions:[\"u8msg\"]},\"message/global-delivery-status\":{source:\"iana\",extensions:[\"u8dsn\"]},\"message/global-disposition-notification\":{source:\"iana\",extensions:[\"u8mdn\"]},\"message/global-headers\":{source:\"iana\",extensions:[\"u8hdr\"]},\"message/http\":{source:\"iana\",compressible:!1},\"message/imdn+xml\":{source:\"iana\",compressible:!0},\"message/mls\":{source:\"iana\"},\"message/news\":{source:\"apache\"},\"message/ohttp-req\":{source:\"iana\"},\"message/ohttp-res\":{source:\"iana\"},\"message/partial\":{source:\"iana\",compressible:!1},\"message/rfc822\":{source:\"iana\",compressible:!0,extensions:[\"eml\",\"mime\"]},\"message/s-http\":{source:\"apache\"},\"message/sip\":{source:\"iana\"},\"message/sipfrag\":{source:\"iana\"},\"message/tracking-status\":{source:\"iana\"},\"message/vnd.si.simp\":{source:\"apache\"},\"message/vnd.wfa.wsc\":{source:\"iana\",extensions:[\"wsc\"]},\"model/3mf\":{source:\"iana\",extensions:[\"3mf\"]},\"model/e57\":{source:\"iana\"},\"model/gltf+json\":{source:\"iana\",compressible:!0,extensions:[\"gltf\"]},\"model/gltf-binary\":{source:\"iana\",compressible:!0,extensions:[\"glb\"]},\"model/iges\":{source:\"iana\",compressible:!1,extensions:[\"igs\",\"iges\"]},\"model/jt\":{source:\"iana\",extensions:[\"jt\"]},\"model/mesh\":{source:\"iana\",compressible:!1,extensions:[\"msh\",\"mesh\",\"silo\"]},\"model/mtl\":{source:\"iana\",extensions:[\"mtl\"]},\"model/obj\":{source:\"iana\",extensions:[\"obj\"]},\"model/prc\":{source:\"iana\",extensions:[\"prc\"]},\"model/step\":{source:\"iana\"},\"model/step+xml\":{source:\"iana\",compressible:!0,extensions:[\"stpx\"]},\"model/step+zip\":{source:\"iana\",compressible:!1,extensions:[\"stpz\"]},\"model/step-xml+zip\":{source:\"iana\",compressible:!1,extensions:[\"stpxz\"]},\"model/stl\":{source:\"iana\",extensions:[\"stl\"]},\"model/u3d\":{source:\"iana\",extensions:[\"u3d\"]},\"model/vnd.bary\":{source:\"iana\",extensions:[\"bary\"]},\"model/vnd.cld\":{source:\"iana\",extensions:[\"cld\"]},\"model/vnd.collada+xml\":{source:\"iana\",compressible:!0,extensions:[\"dae\"]},\"model/vnd.dwf\":{source:\"iana\",extensions:[\"dwf\"]},\"model/vnd.flatland.3dml\":{source:\"iana\"},\"model/vnd.gdl\":{source:\"iana\",extensions:[\"gdl\"]},\"model/vnd.gs-gdl\":{source:\"apache\"},\"model/vnd.gs.gdl\":{source:\"iana\"},\"model/vnd.gtw\":{source:\"iana\",extensions:[\"gtw\"]},\"model/vnd.moml+xml\":{source:\"iana\",compressible:!0},\"model/vnd.mts\":{source:\"iana\",extensions:[\"mts\"]},\"model/vnd.opengex\":{source:\"iana\",extensions:[\"ogex\"]},\"model/vnd.parasolid.transmit.binary\":{source:\"iana\",extensions:[\"x_b\"]},\"model/vnd.parasolid.transmit.text\":{source:\"iana\",extensions:[\"x_t\"]},\"model/vnd.pytha.pyox\":{source:\"iana\",extensions:[\"pyo\",\"pyox\"]},\"model/vnd.rosette.annotated-data-model\":{source:\"iana\"},\"model/vnd.sap.vds\":{source:\"iana\",extensions:[\"vds\"]},\"model/vnd.usda\":{source:\"iana\",extensions:[\"usda\"]},\"model/vnd.usdz+zip\":{source:\"iana\",compressible:!1,extensions:[\"usdz\"]},\"model/vnd.valve.source.compiled-map\":{source:\"iana\",extensions:[\"bsp\"]},\"model/vnd.vtu\":{source:\"iana\",extensions:[\"vtu\"]},\"model/vrml\":{source:\"iana\",compressible:!1,extensions:[\"wrl\",\"vrml\"]},\"model/x3d+binary\":{source:\"apache\",compressible:!1,extensions:[\"x3db\",\"x3dbz\"]},\"model/x3d+fastinfoset\":{source:\"iana\",extensions:[\"x3db\"]},\"model/x3d+vrml\":{source:\"apache\",compressible:!1,extensions:[\"x3dv\",\"x3dvz\"]},\"model/x3d+xml\":{source:\"iana\",compressible:!0,extensions:[\"x3d\",\"x3dz\"]},\"model/x3d-vrml\":{source:\"iana\",extensions:[\"x3dv\"]},\"multipart/alternative\":{source:\"iana\",compressible:!1},\"multipart/appledouble\":{source:\"iana\"},\"multipart/byteranges\":{source:\"iana\"},\"multipart/digest\":{source:\"iana\"},\"multipart/encrypted\":{source:\"iana\",compressible:!1},\"multipart/form-data\":{source:\"iana\",compressible:!1},\"multipart/header-set\":{source:\"iana\"},\"multipart/mixed\":{source:\"iana\"},\"multipart/multilingual\":{source:\"iana\"},\"multipart/parallel\":{source:\"iana\"},\"multipart/related\":{source:\"iana\",compressible:!1},\"multipart/report\":{source:\"iana\"},\"multipart/signed\":{source:\"iana\",compressible:!1},\"multipart/vnd.bint.med-plus\":{source:\"iana\"},\"multipart/voice-message\":{source:\"iana\"},\"multipart/x-mixed-replace\":{source:\"iana\"},\"text/1d-interleaved-parityfec\":{source:\"iana\"},\"text/cache-manifest\":{source:\"iana\",compressible:!0,extensions:[\"appcache\",\"manifest\"]},\"text/calendar\":{source:\"iana\",extensions:[\"ics\",\"ifb\"]},\"text/calender\":{compressible:!0},\"text/cmd\":{compressible:!0},\"text/coffeescript\":{extensions:[\"coffee\",\"litcoffee\"]},\"text/cql\":{source:\"iana\"},\"text/cql-expression\":{source:\"iana\"},\"text/cql-identifier\":{source:\"iana\"},\"text/css\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"css\"]},\"text/csv\":{source:\"iana\",compressible:!0,extensions:[\"csv\"]},\"text/csv-schema\":{source:\"iana\"},\"text/directory\":{source:\"iana\"},\"text/dns\":{source:\"iana\"},\"text/ecmascript\":{source:\"apache\"},\"text/encaprtp\":{source:\"iana\"},\"text/enriched\":{source:\"iana\"},\"text/fhirpath\":{source:\"iana\"},\"text/flexfec\":{source:\"iana\"},\"text/fwdred\":{source:\"iana\"},\"text/gff3\":{source:\"iana\"},\"text/grammar-ref-list\":{source:\"iana\"},\"text/hl7v2\":{source:\"iana\"},\"text/html\":{source:\"iana\",compressible:!0,extensions:[\"html\",\"htm\",\"shtml\"]},\"text/jade\":{extensions:[\"jade\"]},\"text/javascript\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"js\",\"mjs\"]},\"text/jcr-cnd\":{source:\"iana\"},\"text/jsx\":{compressible:!0,extensions:[\"jsx\"]},\"text/less\":{compressible:!0,extensions:[\"less\"]},\"text/markdown\":{source:\"iana\",compressible:!0,extensions:[\"md\",\"markdown\"]},\"text/mathml\":{source:\"nginx\",extensions:[\"mml\"]},\"text/mdx\":{compressible:!0,extensions:[\"mdx\"]},\"text/mizar\":{source:\"iana\"},\"text/n3\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"n3\"]},\"text/parameters\":{source:\"iana\",charset:\"UTF-8\"},\"text/parityfec\":{source:\"iana\"},\"text/plain\":{source:\"iana\",compressible:!0,extensions:[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\",\"in\",\"ini\"]},\"text/provenance-notation\":{source:\"iana\",charset:\"UTF-8\"},\"text/prs.fallenstein.rst\":{source:\"iana\"},\"text/prs.lines.tag\":{source:\"iana\",extensions:[\"dsc\"]},\"text/prs.prop.logic\":{source:\"iana\"},\"text/prs.texi\":{source:\"iana\"},\"text/raptorfec\":{source:\"iana\"},\"text/red\":{source:\"iana\"},\"text/rfc822-headers\":{source:\"iana\"},\"text/richtext\":{source:\"iana\",compressible:!0,extensions:[\"rtx\"]},\"text/rtf\":{source:\"iana\",compressible:!0,extensions:[\"rtf\"]},\"text/rtp-enc-aescm128\":{source:\"iana\"},\"text/rtploopback\":{source:\"iana\"},\"text/rtx\":{source:\"iana\"},\"text/sgml\":{source:\"iana\",extensions:[\"sgml\",\"sgm\"]},\"text/shaclc\":{source:\"iana\"},\"text/shex\":{source:\"iana\",extensions:[\"shex\"]},\"text/slim\":{extensions:[\"slim\",\"slm\"]},\"text/spdx\":{source:\"iana\",extensions:[\"spdx\"]},\"text/strings\":{source:\"iana\"},\"text/stylus\":{extensions:[\"stylus\",\"styl\"]},\"text/t140\":{source:\"iana\"},\"text/tab-separated-values\":{source:\"iana\",compressible:!0,extensions:[\"tsv\"]},\"text/troff\":{source:\"iana\",extensions:[\"t\",\"tr\",\"roff\",\"man\",\"me\",\"ms\"]},\"text/turtle\":{source:\"iana\",charset:\"UTF-8\",extensions:[\"ttl\"]},\"text/ulpfec\":{source:\"iana\"},\"text/uri-list\":{source:\"iana\",compressible:!0,extensions:[\"uri\",\"uris\",\"urls\"]},\"text/vcard\":{source:\"iana\",compressible:!0,extensions:[\"vcard\"]},\"text/vnd.a\":{source:\"iana\"},\"text/vnd.abc\":{source:\"iana\"},\"text/vnd.ascii-art\":{source:\"iana\"},\"text/vnd.curl\":{source:\"iana\",extensions:[\"curl\"]},\"text/vnd.curl.dcurl\":{source:\"apache\",extensions:[\"dcurl\"]},\"text/vnd.curl.mcurl\":{source:\"apache\",extensions:[\"mcurl\"]},\"text/vnd.curl.scurl\":{source:\"apache\",extensions:[\"scurl\"]},\"text/vnd.debian.copyright\":{source:\"iana\",charset:\"UTF-8\"},\"text/vnd.dmclientscript\":{source:\"iana\"},\"text/vnd.dvb.subtitle\":{source:\"iana\",extensions:[\"sub\"]},\"text/vnd.esmertec.theme-descriptor\":{source:\"iana\",charset:\"UTF-8\"},\"text/vnd.exchangeable\":{source:\"iana\"},\"text/vnd.familysearch.gedcom\":{source:\"iana\",extensions:[\"ged\"]},\"text/vnd.ficlab.flt\":{source:\"iana\"},\"text/vnd.fly\":{source:\"iana\",extensions:[\"fly\"]},\"text/vnd.fmi.flexstor\":{source:\"iana\",extensions:[\"flx\"]},\"text/vnd.gml\":{source:\"iana\"},\"text/vnd.graphviz\":{source:\"iana\",extensions:[\"gv\"]},\"text/vnd.hans\":{source:\"iana\"},\"text/vnd.hgl\":{source:\"iana\"},\"text/vnd.in3d.3dml\":{source:\"iana\",extensions:[\"3dml\"]},\"text/vnd.in3d.spot\":{source:\"iana\",extensions:[\"spot\"]},\"text/vnd.iptc.newsml\":{source:\"iana\"},\"text/vnd.iptc.nitf\":{source:\"iana\"},\"text/vnd.latex-z\":{source:\"iana\"},\"text/vnd.motorola.reflex\":{source:\"iana\"},\"text/vnd.ms-mediapackage\":{source:\"iana\"},\"text/vnd.net2phone.commcenter.command\":{source:\"iana\"},\"text/vnd.radisys.msml-basic-layout\":{source:\"iana\"},\"text/vnd.senx.warpscript\":{source:\"iana\"},\"text/vnd.si.uricatalogue\":{source:\"apache\"},\"text/vnd.sosi\":{source:\"iana\"},\"text/vnd.sun.j2me.app-descriptor\":{source:\"iana\",charset:\"UTF-8\",extensions:[\"jad\"]},\"text/vnd.trolltech.linguist\":{source:\"iana\",charset:\"UTF-8\"},\"text/vnd.vcf\":{source:\"iana\"},\"text/vnd.wap.si\":{source:\"iana\"},\"text/vnd.wap.sl\":{source:\"iana\"},\"text/vnd.wap.wml\":{source:\"iana\",extensions:[\"wml\"]},\"text/vnd.wap.wmlscript\":{source:\"iana\",extensions:[\"wmls\"]},\"text/vnd.zoo.kcl\":{source:\"iana\"},\"text/vtt\":{source:\"iana\",charset:\"UTF-8\",compressible:!0,extensions:[\"vtt\"]},\"text/wgsl\":{source:\"iana\",extensions:[\"wgsl\"]},\"text/x-asm\":{source:\"apache\",extensions:[\"s\",\"asm\"]},\"text/x-c\":{source:\"apache\",extensions:[\"c\",\"cc\",\"cxx\",\"cpp\",\"h\",\"hh\",\"dic\"]},\"text/x-component\":{source:\"nginx\",extensions:[\"htc\"]},\"text/x-fortran\":{source:\"apache\",extensions:[\"f\",\"for\",\"f77\",\"f90\"]},\"text/x-gwt-rpc\":{compressible:!0},\"text/x-handlebars-template\":{extensions:[\"hbs\"]},\"text/x-java-source\":{source:\"apache\",extensions:[\"java\"]},\"text/x-jquery-tmpl\":{compressible:!0},\"text/x-lua\":{extensions:[\"lua\"]},\"text/x-markdown\":{compressible:!0,extensions:[\"mkd\"]},\"text/x-nfo\":{source:\"apache\",extensions:[\"nfo\"]},\"text/x-opml\":{source:\"apache\",extensions:[\"opml\"]},\"text/x-org\":{compressible:!0,extensions:[\"org\"]},\"text/x-pascal\":{source:\"apache\",extensions:[\"p\",\"pas\"]},\"text/x-processing\":{compressible:!0,extensions:[\"pde\"]},\"text/x-sass\":{extensions:[\"sass\"]},\"text/x-scss\":{extensions:[\"scss\"]},\"text/x-setext\":{source:\"apache\",extensions:[\"etx\"]},\"text/x-sfv\":{source:\"apache\",extensions:[\"sfv\"]},\"text/x-suse-ymp\":{compressible:!0,extensions:[\"ymp\"]},\"text/x-uuencode\":{source:\"apache\",extensions:[\"uu\"]},\"text/x-vcalendar\":{source:\"apache\",extensions:[\"vcs\"]},\"text/x-vcard\":{source:\"apache\",extensions:[\"vcf\"]},\"text/xml\":{source:\"iana\",compressible:!0,extensions:[\"xml\"]},\"text/xml-external-parsed-entity\":{source:\"iana\"},\"text/yaml\":{compressible:!0,extensions:[\"yaml\",\"yml\"]},\"video/1d-interleaved-parityfec\":{source:\"iana\"},\"video/3gpp\":{source:\"iana\",extensions:[\"3gp\",\"3gpp\"]},\"video/3gpp-tt\":{source:\"iana\"},\"video/3gpp2\":{source:\"iana\",extensions:[\"3g2\"]},\"video/av1\":{source:\"iana\"},\"video/bmpeg\":{source:\"iana\"},\"video/bt656\":{source:\"iana\"},\"video/celb\":{source:\"iana\"},\"video/dv\":{source:\"iana\"},\"video/encaprtp\":{source:\"iana\"},\"video/evc\":{source:\"iana\"},\"video/ffv1\":{source:\"iana\"},\"video/flexfec\":{source:\"iana\"},\"video/h261\":{source:\"iana\",extensions:[\"h261\"]},\"video/h263\":{source:\"iana\",extensions:[\"h263\"]},\"video/h263-1998\":{source:\"iana\"},\"video/h263-2000\":{source:\"iana\"},\"video/h264\":{source:\"iana\",extensions:[\"h264\"]},\"video/h264-rcdo\":{source:\"iana\"},\"video/h264-svc\":{source:\"iana\"},\"video/h265\":{source:\"iana\"},\"video/h266\":{source:\"iana\"},\"video/iso.segment\":{source:\"iana\",extensions:[\"m4s\"]},\"video/jpeg\":{source:\"iana\",extensions:[\"jpgv\"]},\"video/jpeg2000\":{source:\"iana\"},\"video/jpm\":{source:\"apache\",extensions:[\"jpm\",\"jpgm\"]},\"video/jxsv\":{source:\"iana\"},\"video/matroska\":{source:\"iana\"},\"video/matroska-3d\":{source:\"iana\"},\"video/mj2\":{source:\"iana\",extensions:[\"mj2\",\"mjp2\"]},\"video/mp1s\":{source:\"iana\"},\"video/mp2p\":{source:\"iana\"},\"video/mp2t\":{source:\"iana\",extensions:[\"ts\",\"m2t\",\"m2ts\",\"mts\"]},\"video/mp4\":{source:\"iana\",compressible:!1,extensions:[\"mp4\",\"mp4v\",\"mpg4\"]},\"video/mp4v-es\":{source:\"iana\"},\"video/mpeg\":{source:\"iana\",compressible:!1,extensions:[\"mpeg\",\"mpg\",\"mpe\",\"m1v\",\"m2v\"]},\"video/mpeg4-generic\":{source:\"iana\"},\"video/mpv\":{source:\"iana\"},\"video/nv\":{source:\"iana\"},\"video/ogg\":{source:\"iana\",compressible:!1,extensions:[\"ogv\"]},\"video/parityfec\":{source:\"iana\"},\"video/pointer\":{source:\"iana\"},\"video/quicktime\":{source:\"iana\",compressible:!1,extensions:[\"qt\",\"mov\"]},\"video/raptorfec\":{source:\"iana\"},\"video/raw\":{source:\"iana\"},\"video/rtp-enc-aescm128\":{source:\"iana\"},\"video/rtploopback\":{source:\"iana\"},\"video/rtx\":{source:\"iana\"},\"video/scip\":{source:\"iana\"},\"video/smpte291\":{source:\"iana\"},\"video/smpte292m\":{source:\"iana\"},\"video/ulpfec\":{source:\"iana\"},\"video/vc1\":{source:\"iana\"},\"video/vc2\":{source:\"iana\"},\"video/vnd.cctv\":{source:\"iana\"},\"video/vnd.dece.hd\":{source:\"iana\",extensions:[\"uvh\",\"uvvh\"]},\"video/vnd.dece.mobile\":{source:\"iana\",extensions:[\"uvm\",\"uvvm\"]},\"video/vnd.dece.mp4\":{source:\"iana\"},\"video/vnd.dece.pd\":{source:\"iana\",extensions:[\"uvp\",\"uvvp\"]},\"video/vnd.dece.sd\":{source:\"iana\",extensions:[\"uvs\",\"uvvs\"]},\"video/vnd.dece.video\":{source:\"iana\",extensions:[\"uvv\",\"uvvv\"]},\"video/vnd.directv.mpeg\":{source:\"iana\"},\"video/vnd.directv.mpeg-tts\":{source:\"iana\"},\"video/vnd.dlna.mpeg-tts\":{source:\"iana\"},\"video/vnd.dvb.file\":{source:\"iana\",extensions:[\"dvb\"]},\"video/vnd.fvt\":{source:\"iana\",extensions:[\"fvt\"]},\"video/vnd.hns.video\":{source:\"iana\"},\"video/vnd.iptvforum.1dparityfec-1010\":{source:\"iana\"},\"video/vnd.iptvforum.1dparityfec-2005\":{source:\"iana\"},\"video/vnd.iptvforum.2dparityfec-1010\":{source:\"iana\"},\"video/vnd.iptvforum.2dparityfec-2005\":{source:\"iana\"},\"video/vnd.iptvforum.ttsavc\":{source:\"iana\"},\"video/vnd.iptvforum.ttsmpeg2\":{source:\"iana\"},\"video/vnd.motorola.video\":{source:\"iana\"},\"video/vnd.motorola.videop\":{source:\"iana\"},\"video/vnd.mpegurl\":{source:\"iana\",extensions:[\"mxu\",\"m4u\"]},\"video/vnd.ms-playready.media.pyv\":{source:\"iana\",extensions:[\"pyv\"]},\"video/vnd.nokia.interleaved-multimedia\":{source:\"iana\"},\"video/vnd.nokia.mp4vr\":{source:\"iana\"},\"video/vnd.nokia.videovoip\":{source:\"iana\"},\"video/vnd.objectvideo\":{source:\"iana\"},\"video/vnd.radgamettools.bink\":{source:\"iana\"},\"video/vnd.radgamettools.smacker\":{source:\"apache\"},\"video/vnd.sealed.mpeg1\":{source:\"iana\"},\"video/vnd.sealed.mpeg4\":{source:\"iana\"},\"video/vnd.sealed.swf\":{source:\"iana\"},\"video/vnd.sealedmedia.softseal.mov\":{source:\"iana\"},\"video/vnd.uvvu.mp4\":{source:\"iana\",extensions:[\"uvu\",\"uvvu\"]},\"video/vnd.vivo\":{source:\"iana\",extensions:[\"viv\"]},\"video/vnd.youtube.yt\":{source:\"iana\"},\"video/vp8\":{source:\"iana\"},\"video/vp9\":{source:\"iana\"},\"video/webm\":{source:\"apache\",compressible:!1,extensions:[\"webm\"]},\"video/x-f4v\":{source:\"apache\",extensions:[\"f4v\"]},\"video/x-fli\":{source:\"apache\",extensions:[\"fli\"]},\"video/x-flv\":{source:\"apache\",compressible:!1,extensions:[\"flv\"]},\"video/x-m4v\":{source:\"apache\",extensions:[\"m4v\"]},\"video/x-matroska\":{source:\"apache\",compressible:!1,extensions:[\"mkv\",\"mk3d\",\"mks\"]},\"video/x-mng\":{source:\"apache\",extensions:[\"mng\"]},\"video/x-ms-asf\":{source:\"apache\",extensions:[\"asf\",\"asx\"]},\"video/x-ms-vob\":{source:\"apache\",extensions:[\"vob\"]},\"video/x-ms-wm\":{source:\"apache\",extensions:[\"wm\"]},\"video/x-ms-wmv\":{source:\"apache\",compressible:!1,extensions:[\"wmv\"]},\"video/x-ms-wmx\":{source:\"apache\",extensions:[\"wmx\"]},\"video/x-ms-wvx\":{source:\"apache\",extensions:[\"wvx\"]},\"video/x-msvideo\":{source:\"apache\",extensions:[\"avi\"]},\"video/x-sgi-movie\":{source:\"apache\",extensions:[\"movie\"]},\"video/x-smv\":{source:\"apache\",extensions:[\"smv\"]},\"x-conference/x-cooltalk\":{source:\"apache\",extensions:[\"ice\"]},\"x-shader/x-fragment\":{compressible:!0},\"x-shader/x-vertex\":{compressible:!0}}});var z5=oe((tAe,V5)=>{V5.exports=L5()});var H5=oe((nAe,q5)=>{\"use strict\";var U5=z5();q5.exports=function(){var t={};return Object.keys(U5).forEach(function(e){var n=U5[e];n.extensions&&n.extensions.length>0&&n.extensions.forEach(function(i){t[i]=e})}),t}});var W5=oe((iAe,G5)=>{\"use strict\";var J5=i0();G5.exports=function(t,e){if(!J5(t))throw new TypeError(\"Expected a plain object\");e=e||{},typeof e==\"function\"&&(e={compare:e});var n=e.deep,i=[],a=[],r=s(function(o){var l=i.indexOf(o);if(l!==-1)return a[l];var c={},d=Object.keys(o).sort(e.compare);i.push(o),a.push(c);for(var u=0;u<d.length;u++){var p=d[u],m=o[p];c[p]=n&&J5(m)?r(m):m}return c},\"sortKeys\");return r(t)}});var Y5=oe((rAe,q0)=>{\"use strict\";var K5=W5();q0.exports.desc=function(t){return K5(t,function(e,n){return n.length-e.length})};q0.exports.asc=function(t){return K5(t,function(e,n){return e.length-n.length})}});var Q5=oe((oAe,H0)=>{\"use strict\";var X5=H5(),Z5=Y5();H0.exports=t=>{let e=Z5.desc(X5()),n=Object.keys(e).filter(i=>t.endsWith(i));return n.length===0?[]:n.map(i=>({ext:i,mime:e[i]}))};H0.exports.mime=t=>{let e=Z5.desc(X5()),n=Object.keys(e).filter(i=>e[i]===t);return n.length===0?[]:n.map(i=>({ext:i,mime:e[i]}))}});var nj=oe((sAe,tj)=>{\"use strict\";var Wfe=Ee(\"fs\"),Gu=Ee(\"path\"),{URL:Kfe}=Ee(\"url\"),Yfe=h1(),$5=v1(),ej=K2(),Xfe=nE(),Zfe=lE(),Qfe=t5(),$fe=C5(),ehe=I5(),the=R5(),nhe=P5(),ihe=Q5(),ahe=ehe(Wfe),rhe=s(t=>Gu.basename(new Kfe(t.requestUrl).pathname),\"filenameFromPath\"),ohe=s(t=>{let e=t.headers[\"content-type\"];if(!e)return null;let n=ihe.mime(e);return n.length!==1?null:n[0].ext},\"getExtFromMime\"),she=s((t,e)=>{let n=t.headers[\"content-disposition\"];if(n){let a=Yfe.parse(n);if(a.parameters&&a.parameters.filename)return a.parameters.filename}let i=rhe(t);if(!Gu.extname(i)){let a=(nhe(e)||{}).ext||ohe(t);a&&(i=`${i}.${a}`)}return i},\"getFilename\");tj.exports=(t,e,n)=>{typeof e==\"object\"&&(n=e,e=null),n=Object.assign({encoding:null,rejectUnauthorized:!0},n);let i=Qfe.stream(t,n),a=the(i,\"response\").then(r=>{let o=n.encoding===null?\"buffer\":n.encoding;return Promise.all([Zfe(i,{encoding:o}),r])}).then(r=>{let[o,l]=r;if(!e)return n.extract&&$5(o)?ej(o,n):o;let c=n.filename||Xfe(she(l,o)),d=Gu.join(e,c);return n.extract&&$5(o)?ej(o,Gu.dirname(d),n):$fe(Gu.dirname(d)).then(()=>ahe.writeFile(d,o)).then(()=>o)});return i.then=a.then.bind(a),i.catch=a.catch.bind(a),i}});var H4=oe((vPe,q4)=>{\"use strict\";q4.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var vv=oe((bPe,G4)=>{var Ld=H4(),J4={};for(let t of Object.keys(Ld))J4[Ld[t]]=t;var Ye={rgb:{channels:3,labels:\"rgb\"},hsl:{channels:3,labels:\"hsl\"},hsv:{channels:3,labels:\"hsv\"},hwb:{channels:3,labels:\"hwb\"},cmyk:{channels:4,labels:\"cmyk\"},xyz:{channels:3,labels:\"xyz\"},lab:{channels:3,labels:\"lab\"},lch:{channels:3,labels:\"lch\"},hex:{channels:1,labels:[\"hex\"]},keyword:{channels:1,labels:[\"keyword\"]},ansi16:{channels:1,labels:[\"ansi16\"]},ansi256:{channels:1,labels:[\"ansi256\"]},hcg:{channels:3,labels:[\"h\",\"c\",\"g\"]},apple:{channels:3,labels:[\"r16\",\"g16\",\"b16\"]},gray:{channels:1,labels:[\"gray\"]}};G4.exports=Ye;for(let t of Object.keys(Ye)){if(!(\"channels\"in Ye[t]))throw new Error(\"missing channels property: \"+t);if(!(\"labels\"in Ye[t]))throw new Error(\"missing channel labels property: \"+t);if(Ye[t].labels.length!==Ye[t].channels)throw new Error(\"channel and label counts mismatch: \"+t);let{channels:e,labels:n}=Ye[t];delete Ye[t].channels,delete Ye[t].labels,Object.defineProperty(Ye[t],\"channels\",{value:e}),Object.defineProperty(Ye[t],\"labels\",{value:n})}Ye.rgb.hsl=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.min(e,n,i),r=Math.max(e,n,i),o=r-a,l,c;r===a?l=0:e===r?l=(n-i)/o:n===r?l=2+(i-e)/o:i===r&&(l=4+(e-n)/o),l=Math.min(l*60,360),l<0&&(l+=360);let d=(a+r)/2;return r===a?c=0:d<=.5?c=o/(r+a):c=o/(2-r-a),[l,c*100,d*100]};Ye.rgb.hsv=function(t){let e,n,i,a,r,o=t[0]/255,l=t[1]/255,c=t[2]/255,d=Math.max(o,l,c),u=d-Math.min(o,l,c),p=s(function(m){return(d-m)/6/u+1/2},\"diffc\");return u===0?(a=0,r=0):(r=u/d,e=p(o),n=p(l),i=p(c),o===d?a=i-n:l===d?a=1/3+e-i:c===d&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[a*360,r*100,d*100]};Ye.rgb.hwb=function(t){let e=t[0],n=t[1],i=t[2],a=Ye.rgb.hsl(t)[0],r=1/255*Math.min(e,Math.min(n,i));return i=1-1/255*Math.max(e,Math.max(n,i)),[a,r*100,i*100]};Ye.rgb.cmyk=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.min(1-e,1-n,1-i),r=(1-e-a)/(1-a)||0,o=(1-n-a)/(1-a)||0,l=(1-i-a)/(1-a)||0;return[r*100,o*100,l*100,a*100]};function gbe(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}s(gbe,\"comparativeDistance\");Ye.rgb.keyword=function(t){let e=J4[t];if(e)return e;let n=1/0,i;for(let a of Object.keys(Ld)){let r=Ld[a],o=gbe(t,r);o<n&&(n=o,i=a)}return i};Ye.keyword.rgb=function(t){return Ld[t]};Ye.rgb.xyz=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let a=e*.4124+n*.3576+i*.1805,r=e*.2126+n*.7152+i*.0722,o=e*.0193+n*.1192+i*.9505;return[a*100,r*100,o*100]};Ye.rgb.lab=function(t){let e=Ye.rgb.xyz(t),n=e[0],i=e[1],a=e[2];n/=95.047,i/=100,a/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let r=116*i-16,o=500*(n-i),l=200*(i-a);return[r,o,l]};Ye.hsl.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100,a,r,o;if(n===0)return o=i*255,[o,o,o];i<.5?a=i*(1+n):a=i+n-i*n;let l=2*i-a,c=[0,0,0];for(let d=0;d<3;d++)r=e+1/3*-(d-1),r<0&&r++,r>1&&r--,6*r<1?o=l+(a-l)*6*r:2*r<1?o=a:3*r<2?o=l+(a-l)*(2/3-r)*6:o=l,c[d]=o*255;return c};Ye.hsl.hsv=function(t){let e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);i*=2,n*=i<=1?i:2-i,a*=r<=1?r:2-r;let o=(i+n)/2,l=i===0?2*a/(r+a):2*n/(i+n);return[e,l*100,o*100]};Ye.hsv.rgb=function(t){let e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),l=255*i*(1-n*r),c=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,c,o];case 1:return[l,i,o];case 2:return[o,i,c];case 3:return[o,l,i];case 4:return[c,o,i];case 5:return[i,o,l]}};Ye.hsv.hsl=function(t){let e=t[0],n=t[1]/100,i=t[2]/100,a=Math.max(i,.01),r,o;o=(2-n)*i;let l=(2-n)*a;return r=n*a,r/=l<=1?l:2-l,r=r||0,o/=2,[e,r*100,o*100]};Ye.hwb.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100,a=n+i,r;a>1&&(n/=a,i/=a);let o=Math.floor(6*e),l=1-i;r=6*e-o,o&1&&(r=1-r);let c=n+r*(l-n),d,u,p;switch(o){default:case 6:case 0:d=l,u=c,p=n;break;case 1:d=c,u=l,p=n;break;case 2:d=n,u=l,p=c;break;case 3:d=n,u=c,p=l;break;case 4:d=c,u=n,p=l;break;case 5:d=l,u=n,p=c;break}return[d*255,u*255,p*255]};Ye.cmyk.rgb=function(t){let e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100,r=1-Math.min(1,e*(1-a)+a),o=1-Math.min(1,n*(1-a)+a),l=1-Math.min(1,i*(1-a)+a);return[r*255,o*255,l*255]};Ye.xyz.rgb=function(t){let e=t[0]/100,n=t[1]/100,i=t[2]/100,a,r,o;return a=e*3.2406+n*-1.5372+i*-.4986,r=e*-.9689+n*1.8758+i*.0415,o=e*.0557+n*-.204+i*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,r=r>.0031308?1.055*r**(1/2.4)-.055:r*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,a=Math.min(Math.max(0,a),1),r=Math.min(Math.max(0,r),1),o=Math.min(Math.max(0,o),1),[a*255,r*255,o*255]};Ye.xyz.lab=function(t){let e=t[0],n=t[1],i=t[2];e/=95.047,n/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let a=116*n-16,r=500*(e-n),o=200*(n-i);return[a,r,o]};Ye.lab.xyz=function(t){let e=t[0],n=t[1],i=t[2],a,r,o;r=(e+16)/116,a=n/500+r,o=r-i/200;let l=r**3,c=a**3,d=o**3;return r=l>.008856?l:(r-16/116)/7.787,a=c>.008856?c:(a-16/116)/7.787,o=d>.008856?d:(o-16/116)/7.787,a*=95.047,r*=100,o*=108.883,[a,r,o]};Ye.lab.lch=function(t){let e=t[0],n=t[1],i=t[2],a;a=Math.atan2(i,n)*360/2/Math.PI,a<0&&(a+=360);let o=Math.sqrt(n*n+i*i);return[e,o,a]};Ye.lch.lab=function(t){let e=t[0],n=t[1],a=t[2]/360*2*Math.PI,r=n*Math.cos(a),o=n*Math.sin(a);return[e,r,o]};Ye.rgb.ansi16=function(t,e=null){let[n,i,a]=t,r=e===null?Ye.rgb.hsv(t)[2]:e;if(r=Math.round(r/50),r===0)return 30;let o=30+(Math.round(a/255)<<2|Math.round(i/255)<<1|Math.round(n/255));return r===2&&(o+=60),o};Ye.hsv.ansi16=function(t){return Ye.rgb.ansi16(Ye.hsv.rgb(t),t[2])};Ye.rgb.ansi256=function(t){let e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)};Ye.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let n=(~~(t>50)+1)*.5,i=(e&1)*n*255,a=(e>>1&1)*n*255,r=(e>>2&1)*n*255;return[i,a,r]};Ye.ansi256.rgb=function(t){if(t>=232){let r=(t-232)*10+8;return[r,r,r]}t-=16;let e,n=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[n,i,a]};Ye.rgb.hex=function(t){let n=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return\"000000\".substring(n.length)+n};Ye.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let n=e[0];e[0].length===3&&(n=n.split(\"\").map(l=>l+l).join(\"\"));let i=parseInt(n,16),a=i>>16&255,r=i>>8&255,o=i&255;return[a,r,o]};Ye.rgb.hcg=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255,a=Math.max(Math.max(e,n),i),r=Math.min(Math.min(e,n),i),o=a-r,l,c;return o<1?l=r/(1-o):l=0,o<=0?c=0:a===e?c=(n-i)/o%6:a===n?c=2+(i-e)/o:c=4+(e-n)/o,c/=6,c%=1,[c*360,o*100,l*100]};Ye.hsl.hcg=function(t){let e=t[1]/100,n=t[2]/100,i=n<.5?2*e*n:2*e*(1-n),a=0;return i<1&&(a=(n-.5*i)/(1-i)),[t[0],i*100,a*100]};Ye.hsv.hcg=function(t){let e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],i*100,a*100]};Ye.hcg.rgb=function(t){let e=t[0]/360,n=t[1]/100,i=t[2]/100;if(n===0)return[i*255,i*255,i*255];let a=[0,0,0],r=e%1*6,o=r%1,l=1-o,c=0;switch(Math.floor(r)){case 0:a[0]=1,a[1]=o,a[2]=0;break;case 1:a[0]=l,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=o;break;case 3:a[0]=0,a[1]=l,a[2]=1;break;case 4:a[0]=o,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=l}return c=(1-n)*i,[(n*a[0]+c)*255,(n*a[1]+c)*255,(n*a[2]+c)*255]};Ye.hcg.hsv=function(t){let e=t[1]/100,n=t[2]/100,i=e+n*(1-e),a=0;return i>0&&(a=e/i),[t[0],a*100,i*100]};Ye.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,a=0;return i>0&&i<.5?a=e/(2*i):i>=.5&&i<1&&(a=e/(2*(1-i))),[t[0],a*100,i*100]};Ye.hcg.hwb=function(t){let e=t[1]/100,n=t[2]/100,i=e+n*(1-e);return[t[0],(i-e)*100,(1-i)*100]};Ye.hwb.hcg=function(t){let e=t[1]/100,i=1-t[2]/100,a=i-e,r=0;return a<1&&(r=(i-a)/(1-a)),[t[0],a*100,r*100]};Ye.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Ye.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Ye.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Ye.gray.hsl=function(t){return[0,0,t[0]]};Ye.gray.hsv=Ye.gray.hsl;Ye.gray.hwb=function(t){return[0,100,t[0]]};Ye.gray.cmyk=function(t){return[0,0,0,t[0]]};Ye.gray.lab=function(t){return[t[0],0,0]};Ye.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return\"000000\".substring(i.length)+i};Ye.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var K4=oe((wPe,W4)=>{var Xf=vv();function _be(){let t={},e=Object.keys(Xf);for(let n=e.length,i=0;i<n;i++)t[e[i]]={distance:-1,parent:null};return t}s(_be,\"buildGraph\");function xbe(t){let e=_be(),n=[t];for(e[t].distance=0;n.length;){let i=n.pop(),a=Object.keys(Xf[i]);for(let r=a.length,o=0;o<r;o++){let l=a[o],c=e[l];c.distance===-1&&(c.distance=e[i].distance+1,c.parent=i,n.unshift(l))}}return e}s(xbe,\"deriveBFS\");function vbe(t,e){return function(n){return e(t(n))}}s(vbe,\"link\");function bbe(t,e){let n=[e[t].parent,t],i=Xf[e[t].parent][t],a=e[t].parent;for(;e[a].parent;)n.unshift(e[a].parent),i=vbe(Xf[e[a].parent][a],i),a=e[a].parent;return i.conversion=n,i}s(bbe,\"wrapConversion\");W4.exports=function(t){let e=xbe(t),n={},i=Object.keys(e);for(let a=i.length,r=0;r<a;r++){let o=i[r];e[o].parent!==null&&(n[o]=bbe(o,e))}return n}});var X4=oe((kPe,Y4)=>{var bv=vv(),ybe=K4(),Nc={},wbe=Object.keys(bv);function Ebe(t){let e=s(function(...n){let i=n[0];return i==null?i:(i.length>1&&(n=i),t(n))},\"wrappedFn\");return\"conversion\"in t&&(e.conversion=t.conversion),e}s(Ebe,\"wrapRaw\");function kbe(t){let e=s(function(...n){let i=n[0];if(i==null)return i;i.length>1&&(n=i);let a=t(n);if(typeof a==\"object\")for(let r=a.length,o=0;o<r;o++)a[o]=Math.round(a[o]);return a},\"wrappedFn\");return\"conversion\"in t&&(e.conversion=t.conversion),e}s(kbe,\"wrapRounded\");wbe.forEach(t=>{Nc[t]={},Object.defineProperty(Nc[t],\"channels\",{value:bv[t].channels}),Object.defineProperty(Nc[t],\"labels\",{value:bv[t].labels});let e=ybe(t);Object.keys(e).forEach(i=>{let a=e[i];Nc[t][i]=kbe(a),Nc[t][i].raw=Ebe(a)})});Y4.exports=Nc});var nC=oe((APe,tC)=>{\"use strict\";var Z4=s((t,e)=>(...n)=>`\\x1B[${t(...n)+e}m`,\"wrapAnsi16\"),Q4=s((t,e)=>(...n)=>{let i=t(...n);return`\\x1B[${38+e};5;${i}m`},\"wrapAnsi256\"),$4=s((t,e)=>(...n)=>{let i=t(...n);return`\\x1B[${38+e};2;${i[0]};${i[1]};${i[2]}m`},\"wrapAnsi16m\"),Zf=s(t=>t,\"ansi2ansi\"),eC=s((t,e,n)=>[t,e,n],\"rgb2rgb\"),Rc=s((t,e,n)=>{Object.defineProperty(t,e,{get:()=>{let i=n();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},\"setLazyProperty\"),yv,Mc=s((t,e,n,i)=>{yv===void 0&&(yv=X4());let a=i?10:0,r={};for(let[o,l]of Object.entries(yv)){let c=o===\"ansi16\"?\"ansi\":o;o===e?r[c]=t(n,a):typeof l==\"object\"&&(r[c]=t(l[e],a))}return r},\"makeDynamicStyles\");function jbe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[n,i]of Object.entries(e)){for(let[a,r]of Object.entries(i))e[a]={open:`\\x1B[${r[0]}m`,close:`\\x1B[${r[1]}m`},i[a]=e[a],t.set(r[0],r[1]);Object.defineProperty(e,n,{value:i,enumerable:!1})}return Object.defineProperty(e,\"codes\",{value:t,enumerable:!1}),e.color.close=\"\\x1B[39m\",e.bgColor.close=\"\\x1B[49m\",Rc(e.color,\"ansi\",()=>Mc(Z4,\"ansi16\",Zf,!1)),Rc(e.color,\"ansi256\",()=>Mc(Q4,\"ansi256\",Zf,!1)),Rc(e.color,\"ansi16m\",()=>Mc($4,\"rgb\",eC,!1)),Rc(e.bgColor,\"ansi\",()=>Mc(Z4,\"ansi16\",Zf,!0)),Rc(e.bgColor,\"ansi256\",()=>Mc(Q4,\"ansi256\",Zf,!0)),Rc(e.bgColor,\"ansi16m\",()=>Mc($4,\"rgb\",eC,!0)),e}s(jbe,\"assembleStyles\");Object.defineProperty(tC,\"exports\",{enumerable:!0,get:jbe})});var aC=oe((CPe,iC)=>{\"use strict\";iC.exports=(t,e=process.argv)=>{let n=t.startsWith(\"-\")?\"\":t.length===1?\"-\":\"--\",i=e.indexOf(n+t),a=e.indexOf(\"--\");return i!==-1&&(a===-1||i<a)}});var sC=oe((SPe,oC)=>{\"use strict\";var Abe=Ee(\"os\"),rC=Ee(\"tty\"),Ta=aC(),{env:Qn}=process,os;Ta(\"no-color\")||Ta(\"no-colors\")||Ta(\"color=false\")||Ta(\"color=never\")?os=0:(Ta(\"color\")||Ta(\"colors\")||Ta(\"color=true\")||Ta(\"color=always\"))&&(os=1);\"FORCE_COLOR\"in Qn&&(Qn.FORCE_COLOR===\"true\"?os=1:Qn.FORCE_COLOR===\"false\"?os=0:os=Qn.FORCE_COLOR.length===0?1:Math.min(parseInt(Qn.FORCE_COLOR,10),3));function wv(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}s(wv,\"translateLevel\");function Ev(t,e){if(os===0)return 0;if(Ta(\"color=16m\")||Ta(\"color=full\")||Ta(\"color=truecolor\"))return 3;if(Ta(\"color=256\"))return 2;if(t&&!e&&os===void 0)return 0;let n=os||0;if(Qn.TERM===\"dumb\")return n;if(process.platform===\"win32\"){let i=Abe.release().split(\".\");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if(\"CI\"in Qn)return[\"TRAVIS\",\"CIRCLECI\",\"APPVEYOR\",\"GITLAB_CI\",\"GITHUB_ACTIONS\",\"BUILDKITE\"].some(i=>i in Qn)||Qn.CI_NAME===\"codeship\"?1:n;if(\"TEAMCITY_VERSION\"in Qn)return/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(Qn.TEAMCITY_VERSION)?1:0;if(Qn.COLORTERM===\"truecolor\")return 3;if(\"TERM_PROGRAM\"in Qn){let i=parseInt((Qn.TERM_PROGRAM_VERSION||\"\").split(\".\")[0],10);switch(Qn.TERM_PROGRAM){case\"iTerm.app\":return i>=3?3:2;case\"Apple_Terminal\":return 2}}return/-256(color)?$/i.test(Qn.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Qn.TERM)||\"COLORTERM\"in Qn?1:n}s(Ev,\"supportsColor\");function Tbe(t){let e=Ev(t,t&&t.isTTY);return wv(e)}s(Tbe,\"getSupportLevel\");oC.exports={supportsColor:Tbe,stdout:wv(Ev(!0,rC.isatty(1))),stderr:wv(Ev(!0,rC.isatty(2)))}});var cC=oe((IPe,lC)=>{\"use strict\";var Cbe=s((t,e,n)=>{let i=t.indexOf(e);if(i===-1)return t;let a=e.length,r=0,o=\"\";do o+=t.substr(r,i-r)+e+n,r=i+a,i=t.indexOf(e,r);while(i!==-1);return o+=t.substr(r),o},\"stringReplaceAll\"),Sbe=s((t,e,n,i)=>{let a=0,r=\"\";do{let o=t[i-1]===\"\\r\";r+=t.substr(a,(o?i-1:i)-a)+e+(o?`\\r\n`:`\n`)+n,a=i+1,i=t.indexOf(`\n`,a)}while(i!==-1);return r+=t.substr(a),r},\"stringEncaseCRLFWithFirstIndex\");lC.exports={stringReplaceAll:Cbe,stringEncaseCRLFWithFirstIndex:Sbe}});var fC=oe((FPe,mC)=>{\"use strict\";var Obe=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,uC=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,Ibe=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,Dbe=/\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi,Fbe=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function pC(t){let e=t[0]===\"u\",n=t[1]===\"{\";return e&&!n&&t.length===5||t[0]===\"x\"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&n?String.fromCodePoint(parseInt(t.slice(2,-1),16)):Fbe.get(t)||t}s(pC,\"unescape\");function Nbe(t,e){let n=[],i=e.trim().split(/\\s*,\\s*/g),a;for(let r of i){let o=Number(r);if(!Number.isNaN(o))n.push(o);else if(a=r.match(Ibe))n.push(a[2].replace(Dbe,(l,c,d)=>c?pC(c):d));else throw new Error(`Invalid Chalk template style argument: ${r} (in style '${t}')`)}return n}s(Nbe,\"parseArguments\");function Rbe(t){uC.lastIndex=0;let e=[],n;for(;(n=uC.exec(t))!==null;){let i=n[1];if(n[2]){let a=Nbe(i,n[2]);e.push([i].concat(a))}else e.push([i])}return e}s(Rbe,\"parseStyle\");function dC(t,e){let n={};for(let a of e)for(let r of a.styles)n[r[0]]=a.inverse?null:r.slice(1);let i=t;for(let[a,r]of Object.entries(n))if(Array.isArray(r)){if(!(a in i))throw new Error(`Unknown Chalk style: ${a}`);i=r.length>0?i[a](...r):i[a]}return i}s(dC,\"buildStyle\");mC.exports=(t,e)=>{let n=[],i=[],a=[];if(e.replace(Obe,(r,o,l,c,d,u)=>{if(o)a.push(pC(o));else if(c){let p=a.join(\"\");a=[],i.push(n.length===0?p:dC(t,n)(p)),n.push({inverse:l,styles:Rbe(c)})}else if(d){if(n.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");i.push(dC(t,n)(a.join(\"\"))),a=[],n.pop()}else a.push(u)}),i.push(a.join(\"\")),n.length>0){let r=`Chalk template literal is missing ${n.length} closing bracket${n.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(r)}return i.join(\"\")}});var yC=oe((RPe,bC)=>{\"use strict\";var Vd=nC(),{stdout:jv,stderr:Av}=sC(),{stringReplaceAll:Mbe,stringEncaseCRLFWithFirstIndex:Bbe}=cC(),{isArray:$f}=Array,gC=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],Bc=Object.create(null),Pbe=s((t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error(\"The `level` option should be an integer from 0 to 3\");let n=jv?jv.level:0;t.level=e.level===void 0?n:e.level},\"applyOptions\"),Qf=class{constructor(e){return _C(e)}};s(Qf,\"ChalkClass\");var _C=s(t=>{let e={};return Pbe(e,t),e.template=(...n)=>vC(e.template,...n),Object.setPrototypeOf(e,eh.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=Qf,e.template},\"chalkFactory\");function eh(t){return _C(t)}s(eh,\"Chalk\");for(let[t,e]of Object.entries(Vd))Bc[t]={get(){let n=th(this,Tv(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:n}),n}};Bc.visible={get(){let t=th(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:t}),t}};var xC=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let t of xC)Bc[t]={get(){let{level:e}=this;return function(...n){let i=Tv(Vd.color[gC[e]][t](...n),Vd.color.close,this._styler);return th(this,i,this._isEmpty)}}};for(let t of xC){let e=\"bg\"+t[0].toUpperCase()+t.slice(1);Bc[e]={get(){let{level:n}=this;return function(...i){let a=Tv(Vd.bgColor[gC[n]][t](...i),Vd.bgColor.close,this._styler);return th(this,a,this._isEmpty)}}}}var Lbe=Object.defineProperties(()=>{},{...Bc,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Tv=s((t,e,n)=>{let i,a;return n===void 0?(i=t,a=e):(i=n.openAll+t,a=e+n.closeAll),{open:t,close:e,openAll:i,closeAll:a,parent:n}},\"createStyler\"),th=s((t,e,n)=>{let i=s((...a)=>$f(a[0])&&$f(a[0].raw)?hC(i,vC(i,...a)):hC(i,a.length===1?\"\"+a[0]:a.join(\" \")),\"builder\");return Object.setPrototypeOf(i,Lbe),i._generator=t,i._styler=e,i._isEmpty=n,i},\"createBuilder\"),hC=s((t,e)=>{if(t.level<=0||!e)return t._isEmpty?\"\":e;let n=t._styler;if(n===void 0)return e;let{openAll:i,closeAll:a}=n;if(e.indexOf(\"\\x1B\")!==-1)for(;n!==void 0;)e=Mbe(e,n.close,n.open),n=n.parent;let r=e.indexOf(`\n`);return r!==-1&&(e=Bbe(e,a,i,r)),i+e+a},\"applyStyle\"),kv,vC=s((t,...e)=>{let[n]=e;if(!$f(n)||!$f(n.raw))return e.join(\" \");let i=e.slice(1),a=[n.raw[0]];for(let r=1;r<n.length;r++)a.push(String(i[r-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(n.raw[r]));return kv===void 0&&(kv=fC()),kv(t,a.join(\"\"))},\"chalkTag\");Object.defineProperties(eh.prototype,Bc);var nh=eh();nh.supportsColor=jv;nh.stderr=eh({level:Av?Av.level:0});nh.stderr.supportsColor=Av;bC.exports=nh});var Ty={type:\"module\",name:\"animated_java\",title:\"Animated Java\",icon:\"icon.svg\",description:\"Effortlessly craft complex animations for Minecraft: Java Edition\",version:\"1.8.1\",min_blockbench_version:\"4.12.0\",max_blockbench_version:\"4.12.6\",variant:\"desktop\",tags:[\"Minecraft: Java Edition\",\"Animation\",\"Display Entities\"],author:{name:\"Titus Evans (SnaveSutit)\",email:\"snavesutit@gmail.com\",url:\"https://discordapp.com/users/213746232923783168\"},contributors:[{email:\"contact@iansenne.com\",name:\"Ian Senne (FetchBot)\",url:\"https://discordapp.com/users/162347688011104256\"},{email:\"dominexis9@gmail.com\",name:\"Jesse Spicer (Dominexis)\",url:\"https://discordapp.com/users/749826119636615229\"}],subscription_supporters:[\"123yeah_boi321\",\"alumina6767\",\"LadyCailin\",\"VonLeipenstein\",\"Zoe\"],special_thanks:[\"Howzieky\",\"MulverineX\",\"YokaiS\",\"Ancientkingg\",\"Ersatz\",\"CubeDeveloper\",\"__SK__\",\"MrMakistein\",\"Flubberschnub\",\"legitimoose\",\"VelVoxelRaptor\",\"_JeffWooden\",\"Onnowhere\",\"DoubleFelix\",\"JayPeaSize\",\"Kastle\",\"Matt/Arwen\",\"Nerdrope\",\"Sprunkles\",\"Suso\",\"taj\",\"TheRedstoneer\",\"Totigonzales\",\"VioletXIV\",\"CommanderRedstone\",\"FabulousCodingFox\",\"ououn\",\"luigiutmc\"],repository:{type:\"github\",url:\"https://github.com/Animated-Java/animated-java\"},main:\"./dist/index.js\",types:\"./dist/src/index.d.ts\",private:!0,scripts:{\"build:scripts\":\"esbuild --bundle --platform=node --outfile=dist/build.cjs --packages=external ./tools/esbuild.ts\",dev:\"yarn build:scripts && node ./dist/build.cjs --mode=dev\",prod:\"node ./tools/cleanupDist.cjs && yarn build:scripts && node ./dist/build.cjs\",format:\"prettier --write .\",test:\"yarn build:scripts && vitest run\",coverage:\"yarn build:scripts && vitest run --coverage\",\"check-formatting\":\"prettier . --check\",lint:\"eslint . --max-warnings=0 --no-warn-ignored\"},devDependencies:{\"@novacbn/svelte-codejar\":\"^0.1.2\",\"@types/download\":\"^8.0.5\",\"@types/eslint\":\"^8.21.1\",\"@types/js-yaml\":\"^4.0.5\",\"@types/node\":\"^17.0.21\",\"@types/websocket\":\"^1.0.10\",\"@typescript-eslint/eslint-plugin\":\"^5.54.0\",\"@typescript-eslint/parser\":\"^5.54.0\",\"blockbench-types\":\"https://github.com/SnaveSutit/blockbench-types.git\",esbuild:\"^0.17.10\",\"esbuild-plugin-import-glob\":\"^0.1.1\",\"esbuild-plugin-inline-image\":\"^0.0.9\",\"esbuild-plugin-inline-worker\":\"^0.1.1\",\"esbuild-plugin-svelte\":\"^0.1.1\",eslint:\"^9.37.0\",\"eslint-plugin-svelte\":\"^3.12.4\",firebase:\"^9.19.0\",jiti:\"^2.6.1\",\"js-yaml\":\"^4.1.0\",\"mc-build\":\"^3.6.7\",\"node-modules-vscode-problems-patch\":\"^1.0.9\",octokit:\"^5.0.3\",prettier:\"^2.5.1\",svelte:\"^3.55.1\",\"svelte-awesome-color-picker\":\"^3.0.0-beta.7\",\"svelte-eslint-parser\":\"^1.3.3\",\"svelte-multiselect\":\"^11.0.0-rc.1\",\"svelte-preprocess\":\"^5.0.1\",\"svelte-preprocess-esbuild\":\"^3.0.1\",typescript:\"^4.5.5\",\"typescript-eslint\":\"^8.45.0\",vitest:\"^3.2.4\"},dependencies:{deepslate:\"^0.19.2\",download:\"^8.0.0\",fflate:\"^0.8.2\",\"generic-stream\":\"^1.2.6\",marked:\"^4.3.0\",\"marked-gfm-heading-id\":\"^3.0.0\",\"request-progress\":\"^3.0.0\",\"svelte-ace\":\"^1.0.21\",\"svelte-dnd-action\":\"^0.9.38\"},packageManager:\"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"};var Ke=Ty;function kt(){let t=new Set,e=!1;return{subscribe:(n,i=!1)=>{if(i){let a=s(r=>{n(r),t.delete(a)},\"wrappedCallback\");t.add(a)}else t.add(n);return()=>t.delete(n)},publish:n=>{e||(e=!0,t.forEach(i=>i(n)),e=!1)}}}s(kt,\"subscribable\");var Qr={PLUGIN_LOAD:kt(),PLUGIN_FINISHED_LOADING:kt(),PLUGIN_UNLOAD:kt(),PLUGIN_FINISHED_UNLOADING:kt(),PLUGIN_INSTALL:kt(),PLUGIN_UNINSTALL:kt(),EXTERNAL_PLUGIN_LOAD:kt(),EXTERNAL_PLUGIN_UNLOAD:kt(),INJECT_MODS:kt(),EXTRACT_MODS:kt(),NETWORK_CONNECTED:kt(),MINECRAFT_ASSETS_LOADED:kt(),MINECRAFT_REGISTRY_LOADED:kt(),MINECRAFT_FONTS_LOADED:kt(),BLOCKSTATE_REGISTRY_LOADED:kt(),PRE_SELECT_PROJECT:kt(),POST_SELECT_PROJECT:kt(),SELECT_PROJECT:kt(),UNSELECT_PROJECT:kt(),CLOSE_PROJECT:kt(),SELECT_AJ_PROJECT:kt(),UNSELECT_AJ_PROJECT:kt(),CREATE_VARIANT:kt(),UPDATE_VARIANT:kt(),DELETE_VARIANT:kt(),SELECT_VARIANT:kt(),UPDATE_KEYFRAME_SELECTION:kt(),UPDATE_SELECTION:kt(),UPDATE_VIEW:kt(),UNDO:kt(),REDO:kt()},K=Qr;Blockbench.on(\"select_project\",({project:t})=>{Qr.SELECT_PROJECT.publish(t)});Blockbench.on(\"unselect_project\",({project:t})=>{Qr.UNSELECT_PROJECT.publish(t)});Blockbench.on(\"close_project\",()=>Qr.CLOSE_PROJECT.publish(Project));Blockbench.on(\"update_keyframe_selection\",Qr.UPDATE_KEYFRAME_SELECTION.publish);Blockbench.on(\"update_selection\",Qr.UPDATE_SELECTION.publish);Blockbench.on(\"update_view\",Qr.UPDATE_VIEW.publish);Blockbench.on(\"undo\",Qr.UNDO.publish);Blockbench.on(\"redo\",Qr.REDO.publish);var Eg={};vn(Eg,{\"animated_java.action.create_text_display.title\":()=>FI,\"animated_java.action.create_vanilla_block_display.title\":()=>RI,\"animated_java.action.create_vanilla_item_display.title\":()=>NI,\"animated_java.action.export.name\":()=>DI,\"animated_java.action.open_about.name\":()=>CI,\"animated_java.action.open_blueprint_settings.name\":()=>AI,\"animated_java.action.open_bone_config.name\":()=>SI,\"animated_java.action.open_documentation.name\":()=>TI,\"animated_java.action.open_locator_config.name\":()=>OI,\"animated_java.action.open_text_display_config.name\":()=>II,\"animated_java.action.open_vanilla_block_display_config.name\":()=>BI,\"animated_java.action.open_vanilla_item_display_config.name\":()=>MI,\"animated_java.action.upgrade_old_aj_model_loader.body\":()=>ON,\"animated_java.action.upgrade_old_aj_model_loader.button\":()=>IN,\"animated_java.action.upgrade_old_aj_model_loader.name\":()=>TN,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":()=>SN,\"animated_java.action.variants.create\":()=>oR,\"animated_java.action.variants.delete\":()=>cR,\"animated_java.action.variants.duplicate\":()=>sR,\"animated_java.action.variants.open_config\":()=>lR,\"animated_java.animation.excluded_nodes\":()=>uR,\"animated_java.animation.invert_excluded_nodes\":()=>dR,\"animated_java.block_model_manager.facing_warning\":()=>jM,\"animated_java.block_model_manager.fluid_warning\":()=>EM,\"animated_java.block_model_manager.mob_head_warning\":()=>kM,\"animated_java.dialog.about.close_button\":()=>UI,\"animated_java.dialog.about.title\":()=>zI,\"animated_java.dialog.animation_properties.animation_name.description\":()=>NN,\"animated_java.dialog.animation_properties.animation_name.error.empty\":()=>VN,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":()=>zN,\"animated_java.dialog.animation_properties.animation_name.title\":()=>FN,\"animated_java.dialog.animation_properties.bone_lists.description\":()=>HN,\"animated_java.dialog.animation_properties.excluded_nodes.description\":()=>GN,\"animated_java.dialog.animation_properties.excluded_nodes.title\":()=>JN,\"animated_java.dialog.animation_properties.included_nodes.description\":()=>KN,\"animated_java.dialog.animation_properties.included_nodes.title\":()=>WN,\"animated_java.dialog.animation_properties.loop_delay.description\":()=>qN,\"animated_java.dialog.animation_properties.loop_delay.title\":()=>UN,\"animated_java.dialog.animation_properties.loop_mode.description\":()=>MN,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":()=>PN,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":()=>LN,\"animated_java.dialog.animation_properties.loop_mode.options.once\":()=>BN,\"animated_java.dialog.animation_properties.loop_mode.title\":()=>RN,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":()=>YN,\"animated_java.dialog.animation_properties.title\":()=>DN,\"animated_java.dialog.blueprint_loading.title\":()=>ZN,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":()=>QD,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":()=>ZD,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":()=>$D,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description\":()=>t8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":()=>i8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":()=>n8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":()=>a8,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":()=>YI,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":()=>kD,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":()=>ED,\"animated_java.dialog.blueprint_settings.baked_animations.description\":()=>O8,\"animated_java.dialog.blueprint_settings.baked_animations.title\":()=>S8,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":()=>ZI,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":()=>XI,\"animated_java.dialog.blueprint_settings.bounding_box.description\":()=>AD,\"animated_java.dialog.blueprint_settings.bounding_box.title\":()=>jD,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":()=>BD,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":()=>MD,\"animated_java.dialog.blueprint_settings.data_pack.description\":()=>d8,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":()=>m8,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":()=>g8,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":()=>h8,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":()=>p8,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":()=>f8,\"animated_java.dialog.blueprint_settings.data_pack.title\":()=>u8,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":()=>_D,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":()=>bD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":()=>xD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":()=>vD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":()=>gD,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":()=>s8,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":()=>x8,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":()=>v8,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":()=>b8,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":()=>_8,\"animated_java.dialog.blueprint_settings.display_item.description\":()=>ID,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":()=>FD,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":()=>ND,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":()=>DD,\"animated_java.dialog.blueprint_settings.display_item.title\":()=>OD,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":()=>RD,\"animated_java.dialog.blueprint_settings.display_item_path.description\":()=>XD,\"animated_java.dialog.blueprint_settings.display_item_path.title\":()=>YD,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":()=>c8,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":()=>l8,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":()=>SD,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":()=>CD,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":()=>uD,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":()=>cD,\"animated_java.dialog.blueprint_settings.export_namespace.description\":()=>rD,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":()=>oD,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":()=>lD,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":()=>sD,\"animated_java.dialog.blueprint_settings.export_namespace.title\":()=>aD,\"animated_java.dialog.blueprint_settings.export_settings.title\":()=>iD,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":()=>k8,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":()=>E8,\"animated_java.dialog.blueprint_settings.json_file.description\":()=>D8,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":()=>F8,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":()=>N8,\"animated_java.dialog.blueprint_settings.json_file.title\":()=>I8,\"animated_java.dialog.blueprint_settings.model_folder.title\":()=>e8,\"animated_java.dialog.blueprint_settings.resource_pack.description\":()=>LD,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":()=>zD,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":()=>HD,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":()=>qD,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":()=>VD,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":()=>UD,\"animated_java.dialog.blueprint_settings.resource_pack.title\":()=>PD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":()=>pD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":()=>hD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":()=>mD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":()=>fD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":()=>dD,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":()=>TD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":()=>GD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":()=>WD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":()=>KD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":()=>JD,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":()=>wD,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":()=>yD,\"animated_java.dialog.blueprint_settings.summon_commands.description\":()=>w8,\"animated_java.dialog.blueprint_settings.summon_commands.title\":()=>y8,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":()=>A8,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":()=>j8,\"animated_java.dialog.blueprint_settings.texture_folder.description\":()=>o8,\"animated_java.dialog.blueprint_settings.texture_folder.title\":()=>r8,\"animated_java.dialog.blueprint_settings.texture_size.description\":()=>$I,\"animated_java.dialog.blueprint_settings.texture_size.title\":()=>QI,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":()=>nD,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":()=>tD,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":()=>eD,\"animated_java.dialog.blueprint_settings.title\":()=>KI,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":()=>C8,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":()=>T8,\"animated_java.dialog.bone_config.billboard.description\":()=>mF,\"animated_java.dialog.bone_config.billboard.options.center\":()=>_F,\"animated_java.dialog.bone_config.billboard.options.fixed\":()=>fF,\"animated_java.dialog.bone_config.billboard.options.horizontal\":()=>gF,\"animated_java.dialog.bone_config.billboard.options.vertical\":()=>hF,\"animated_java.dialog.bone_config.billboard.title\":()=>pF,\"animated_java.dialog.bone_config.brightness_override.description\":()=>iF,\"animated_java.dialog.bone_config.brightness_override.title\":()=>nF,\"animated_java.dialog.bone_config.default_variant_subtitle\":()=>B8,\"animated_java.dialog.bone_config.enchanted.description\":()=>rF,\"animated_java.dialog.bone_config.enchanted.title\":()=>aF,\"animated_java.dialog.bone_config.glow_color.description\":()=>Y8,\"animated_java.dialog.bone_config.glow_color.title\":()=>K8,\"animated_java.dialog.bone_config.glowing.description\":()=>J8,\"animated_java.dialog.bone_config.glowing.title\":()=>H8,\"animated_java.dialog.bone_config.inherit_settings.description\":()=>q8,\"animated_java.dialog.bone_config.inherit_settings.title\":()=>U8,\"animated_java.dialog.bone_config.invisible.description\":()=>sF,\"animated_java.dialog.bone_config.invisible.title\":()=>oF,\"animated_java.dialog.bone_config.nbt.description\":()=>cF,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":()=>dF,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":()=>uF,\"animated_java.dialog.bone_config.nbt.title\":()=>lF,\"animated_java.dialog.bone_config.override_brightness.description\":()=>tF,\"animated_java.dialog.bone_config.override_brightness.title\":()=>eF,\"animated_java.dialog.bone_config.override_glow_color.description\":()=>W8,\"animated_java.dialog.bone_config.override_glow_color.title\":()=>G8,\"animated_java.dialog.bone_config.selected_variant\":()=>M8,\"animated_java.dialog.bone_config.selected_variant_subtitle\":()=>P8,\"animated_java.dialog.bone_config.shadow_radius.description\":()=>Z8,\"animated_java.dialog.bone_config.shadow_radius.title\":()=>X8,\"animated_java.dialog.bone_config.shadow_strength.description\":()=>$8,\"animated_java.dialog.bone_config.shadow_strength.title\":()=>Q8,\"animated_java.dialog.bone_config.title\":()=>R8,\"animated_java.dialog.bone_config.use_nbt.description\":()=>V8,\"animated_java.dialog.bone_config.use_nbt.title\":()=>L8,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":()=>z8,\"animated_java.dialog.bone_config.vanilla_item_model.description\":()=>DF,\"animated_java.dialog.bone_config.vanilla_item_model.title\":()=>IF,\"animated_java.dialog.export_progress.title\":()=>XN,\"animated_java.dialog.locator_config.entity_type.description\":()=>EF,\"animated_java.dialog.locator_config.entity_type.error.empty\":()=>kF,\"animated_java.dialog.locator_config.entity_type.title\":()=>wF,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":()=>jF,\"animated_java.dialog.locator_config.plugin_mode_warning\":()=>vF,\"animated_java.dialog.locator_config.summon_commands.description\":()=>TF,\"animated_java.dialog.locator_config.summon_commands.title\":()=>AF,\"animated_java.dialog.locator_config.ticking_commands.description\":()=>SF,\"animated_java.dialog.locator_config.ticking_commands.title\":()=>CF,\"animated_java.dialog.locator_config.title\":()=>xF,\"animated_java.dialog.locator_config.use_entity.description\":()=>yF,\"animated_java.dialog.locator_config.use_entity.title\":()=>bF,\"animated_java.dialog.text_display_config.billboard.description\":()=>iN,\"animated_java.dialog.text_display_config.billboard.options.center\":()=>sN,\"animated_java.dialog.text_display_config.billboard.options.fixed\":()=>aN,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":()=>oN,\"animated_java.dialog.text_display_config.billboard.options.vertical\":()=>rN,\"animated_java.dialog.text_display_config.billboard.title\":()=>nN,\"animated_java.dialog.text_display_config.brightness_override.description\":()=>ZF,\"animated_java.dialog.text_display_config.brightness_override.title\":()=>XF,\"animated_java.dialog.text_display_config.glow_color.description\":()=>qF,\"animated_java.dialog.text_display_config.glow_color.title\":()=>UF,\"animated_java.dialog.text_display_config.glowing.description\":()=>LF,\"animated_java.dialog.text_display_config.glowing.title\":()=>PF,\"animated_java.dialog.text_display_config.inherit_settings.description\":()=>BF,\"animated_java.dialog.text_display_config.inherit_settings.title\":()=>MF,\"animated_java.dialog.text_display_config.invisible.description\":()=>$F,\"animated_java.dialog.text_display_config.invisible.title\":()=>QF,\"animated_java.dialog.text_display_config.nbt.description\":()=>tN,\"animated_java.dialog.text_display_config.nbt.title\":()=>eN,\"animated_java.dialog.text_display_config.override_brightness.description\":()=>YF,\"animated_java.dialog.text_display_config.override_brightness.title\":()=>KF,\"animated_java.dialog.text_display_config.override_glow_color.description\":()=>zF,\"animated_java.dialog.text_display_config.override_glow_color.title\":()=>VF,\"animated_java.dialog.text_display_config.shadow_radius.description\":()=>JF,\"animated_java.dialog.text_display_config.shadow_radius.title\":()=>HF,\"animated_java.dialog.text_display_config.shadow_strength.description\":()=>WF,\"animated_java.dialog.text_display_config.shadow_strength.title\":()=>GF,\"animated_java.dialog.text_display_config.title\":()=>OF,\"animated_java.dialog.text_display_config.use_nbt.description\":()=>NF,\"animated_java.dialog.text_display_config.use_nbt.title\":()=>FF,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":()=>RF,\"animated_java.dialog.unexpected_error.close_button\":()=>HI,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":()=>GI,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":()=>JI,\"animated_java.dialog.unexpected_error.paragraph\":()=>WI,\"animated_java.dialog.unexpected_error.title\":()=>qI,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":()=>CN,\"animated_java.dialog.vanilla_block_display_config.title\":()=>lN,\"animated_java.dialog.vanilla_item_display_config.title\":()=>cN,\"animated_java.dialog.variant_config.bone_lists.description\":()=>yN,\"animated_java.dialog.variant_config.excluded_nodes.description\":()=>EN,\"animated_java.dialog.variant_config.excluded_nodes.title\":()=>wN,\"animated_java.dialog.variant_config.generate_name_from_display_name\":()=>mN,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":()=>fN,\"animated_java.dialog.variant_config.included_nodes.description\":()=>jN,\"animated_java.dialog.variant_config.included_nodes.title\":()=>kN,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":()=>AN,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":()=>vN,\"animated_java.dialog.variant_config.texture_map.description\":()=>xN,\"animated_java.dialog.variant_config.texture_map.no_mappings\":()=>bN,\"animated_java.dialog.variant_config.texture_map.title\":()=>_N,\"animated_java.dialog.variant_config.title\":()=>uN,\"animated_java.dialog.variant_config.variant_display_name\":()=>dN,\"animated_java.dialog.variant_config.variant_display_name.description\":()=>pN,\"animated_java.dialog.variant_config.variant_name\":()=>hN,\"animated_java.dialog.variant_config.variant_name.description\":()=>gN,\"animated_java.effect_animator.keyframes.commands\":()=>hR,\"animated_java.effect_animator.keyframes.execute_condition\":()=>gR,\"animated_java.effect_animator.keyframes.variant\":()=>fR,\"animated_java.effect_animator.timeline.commands\":()=>mR,\"animated_java.effect_animator.timeline.variant\":()=>pR,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":()=>TM,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":()=>AM,\"animated_java.format_category.animated_java\":()=>wM,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":()=>bM,\"animated_java.misc.failed_to_export.blueprint_settings.message\":()=>vM,\"animated_java.misc.failed_to_export.button\":()=>yM,\"animated_java.misc.failed_to_export.custom_models.message\":()=>xM,\"animated_java.misc.failed_to_export.title\":()=>_M,\"animated_java.panel.keyframe.commands.description\":()=>yR,\"animated_java.panel.keyframe.commands.title\":()=>bR,\"animated_java.panel.keyframe.easing_args.description\":()=>WR,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":()=>ZR,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":()=>XR,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":()=>$R,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":()=>QR,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":()=>YR,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":()=>KR,\"animated_java.panel.keyframe.easing_args.title\":()=>GR,\"animated_java.panel.keyframe.easing_mode.description\":()=>UR,\"animated_java.panel.keyframe.easing_mode.options.in\":()=>qR,\"animated_java.panel.keyframe.easing_mode.options.inout\":()=>JR,\"animated_java.panel.keyframe.easing_mode.options.out\":()=>HR,\"animated_java.panel.keyframe.easing_mode.title\":()=>zR,\"animated_java.panel.keyframe.easing_type.description\":()=>SR,\"animated_java.panel.keyframe.easing_type.options.back\":()=>LR,\"animated_java.panel.keyframe.easing_type.options.bounce\":()=>VR,\"animated_java.panel.keyframe.easing_type.options.circ\":()=>BR,\"animated_java.panel.keyframe.easing_type.options.cubic\":()=>FR,\"animated_java.panel.keyframe.easing_type.options.elastic\":()=>PR,\"animated_java.panel.keyframe.easing_type.options.expo\":()=>MR,\"animated_java.panel.keyframe.easing_type.options.linear\":()=>OR,\"animated_java.panel.keyframe.easing_type.options.quad\":()=>DR,\"animated_java.panel.keyframe.easing_type.options.quart\":()=>NR,\"animated_java.panel.keyframe.easing_type.options.quint\":()=>RR,\"animated_java.panel.keyframe.easing_type.options.sine\":()=>IR,\"animated_java.panel.keyframe.easing_type.title\":()=>CR,\"animated_java.panel.keyframe.execute_condition.description\":()=>ER,\"animated_java.panel.keyframe.execute_condition.title\":()=>wR,\"animated_java.panel.keyframe.keyframe_title\":()=>_R,\"animated_java.panel.keyframe.repeat.description\":()=>jR,\"animated_java.panel.keyframe.repeat.title\":()=>kR,\"animated_java.panel.keyframe.repeat_frequency.description\":()=>TR,\"animated_java.panel.keyframe.repeat_frequency.title\":()=>AR,\"animated_java.panel.keyframe.variant.description\":()=>vR,\"animated_java.panel.keyframe.variant.title\":()=>xR,\"animated_java.panel.text_display.title\":()=>eM,\"animated_java.panel.vanilla_block_display.description\":()=>hM,\"animated_java.panel.vanilla_block_display.title\":()=>fM,\"animated_java.panel.vanilla_item_display.description\":()=>mM,\"animated_java.panel.vanilla_item_display.title\":()=>pM,\"animated_java.panel.variants.title\":()=>QN,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":()=>rR,\"animated_java.panel.variants.tool.create_new_variant\":()=>$N,\"animated_java.panel.variants.tool.delete_selected_variant\":()=>nR,\"animated_java.panel.variants.tool.duplicate_selected_variant\":()=>tR,\"animated_java.panel.variants.tool.edit_variant\":()=>eR,\"animated_java.panel.variants.tool.variant_not_visible\":()=>aR,\"animated_java.panel.variants.tool.variant_visible\":()=>iR,\"animated_java.popup.loading.loading\":()=>PI,\"animated_java.popup.loading.offline\":()=>VI,\"animated_java.popup.loading.success\":()=>LI,\"animated_java.tool.text_display.background_color.description\":()=>aM,\"animated_java.tool.text_display.background_color.title\":()=>iM,\"animated_java.tool.text_display.line_width.description\":()=>nM,\"animated_java.tool.text_display.line_width.title\":()=>tM,\"animated_java.tool.text_display.text_alignment.description\":()=>lM,\"animated_java.tool.text_display.text_alignment.options.center\":()=>uM,\"animated_java.tool.text_display.text_alignment.options.left\":()=>cM,\"animated_java.tool.text_display.text_alignment.options.right\":()=>dM,\"animated_java.tool.text_display.text_alignment.title\":()=>sM,\"animated_java.tool.text_display.text_shadow.description\":()=>oM,\"animated_java.tool.text_display.text_shadow.title\":()=>rM,\"animated_java.vanilla_item_display.title\":()=>gM,default:()=>CM});var AI=\"Blaupause-Einstellungen\",TI=\"Dokumentation\",CI=\"Plugin Info\",SI=\"Knochen-Konfiguration\",OI=\"Locator-Konfiguration\",II=\"Textanzeige-Konfiguration\",DI=\"Projekt exportieren\",FI=\"Textanzeige hinzuf\\xFCgen\",NI=\"Vanilla Itemanzeige hinzuf\\xFCgen\",RI=\"Vanilla Blockanzeige hinzuf\\xFCgen\",MI=\"Vanilla Itemanzeige-Konfiguration\",BI=\"Vanilla Blockanzeige-Konfiguration\",PI=\"Animated Java wird geladen...\",LI=\"Animated Java wurde erfolgreich geladen!\",VI=`Animated Java konnte sich nicht verbinden!\nEinige Funktionen sind m\\xF6glicherweise nicht verf\\xFCgbar.`,zI=\"\\xDCber Animated Java\",UI=\"Schlie\\xDFen\",qI=\"Ein unerwarteter Fehler tritt auf!\",HI=\"Schlie\\xDFen\",JI=\"Fehlermeldung wurde in die Zwischenablage kopiert!\",GI=\"Klicken Sie, um die Fehlermeldung in die Zwischenablage zu kopieren.\",WI=\"Bitte melden Sie diesen Fehler, indem Sie unserem {0} beitreten und einen Beitrag im #animated-java-support Kanal erstellen, oder indem Sie ein Issue auf unserem {1} erstellen. Danke!\",KI=\"Blaupause-Einstellungen\",YI=\"Erweiterte Einstellungen sollten nur verwendet werden, wenn sie unbedingt erforderlich sind!\",XI=\"Blaupausenname\",ZI=\"Der name der Blaupause. Wird nur verwendet, um das Projekt im Arbeitsbereich zu identifizieren.\",QI=\"Textur-Gr\\xF6\\xDFe\",$I=\"Die Aufl\\xF6sung des UV-Editors. Diese sollte die gleiche Gr\\xF6\\xDFe wie die gr\\xF6\\xDFte Textur sein. Die besten Ergebnisse erzielen Sie mit einer quadratischen Aufl\\xF6sung, wobei die Gr\\xF6\\xDFe eine Potenz von 2 ist.\",eD=\"Die Textur-Gr\\xF6\\xDFe sollte quadratisch sein f\\xFCr die besten Ergebnisse.\",tD=\"Die Textur-Gr\\xF6\\xDFe sollte eine Potenz von 2 sein f\\xFCr die besten Ergebnisse.\",nD=\"Die Textur-Gr\\xF6\\xDFe sollte mit der Gr\\xF6\\xDFe der gr\\xF6\\xDFten Textur \\xFCbereinstimmen.\",iD=\"Export-Einstellungen\",aD=\"Export-Namespace\",rD=\"Der Namespace, in den das Projekt exportiert werden soll. Dies ist der Namespace, der im exportierten Ressourcenpaket und Datenpaket verwendet wird.\",oD=\"Der Export-Namespace darf nicht leer sein!\",sD='Der Export-Namespace \"{0}\" ist f\\xFCr interne Funktionen reserviert! Bitte w\\xE4hlen Sie einen anderen Namespace.',lD=\"Der Export-Namespace enth\\xE4lt ung\\xFCltige Zeichen! Ein Namespace darf nur Buchstaben, Nummern und Unterstriche enthalten.\",cD=\"Plugin-Modus\",uD=\"Ob der Plugin-Modus aktiviert werden soll oder nicht. Aktivieren Sie diese Option, falls Sie die .ajblueprint Datei in einem Plugin anstelle eines Ressourcenpaket / Datenpakets verwenden m\\xF6chten.\",dD=\"Ressourcenpaket Export-Modus\",pD=`Bestimmt, wie das Ressourcenpaket exportiert werden soll.\nOrdner - Exportiert das Ressourcenpaket als Ordner.\nZip - Exportiert das Ressourcenpaket als eine .zip-Datei.\nKeine - Deaktiviert den Export des Ressourcenpakets.`,mD=\"Ordner\",fD=\"Zip\",hD=\"Keine\",gD=\"Datenpaket Export-Modus\",_D=`Bestimmt, wie das Datenpaket exportiert werden soll.\nOrdner - Exportiert das Datenpaket als Ordner.\nZip - Exportiert das Datenpaket als eine .zip-Datei.\nKeine - Deaktiviert den Export des Datenpakets.`,xD=\"Ordner\",vD=\"Zip\",bD=\"Keine\",yD=\"Bounding Box anzeigen\",wD=\"Ob die Bounding Box im Editor angezeigt werden soll oder nicht.\",ED=\"Automatische Bounding Box\",kD=`Ob die Bounding Box automatisch anhand der Geometrie des Modells berechnet werden soll oder nicht.\nHINWEIS: Die automatische Bounding Box ber\\xFCcksichtigt NICHT die Knochen-Versetzungen bei Animationen, so dass die Bounding Box manchmals kleiner sein kann als erforderlich.`,jD=\"Bounding Box\",AD=\"Bestimmt die Culling-Box des Modells. Das Modell wird nicht gerendert sobald diese Box au\\xDFerhalb des Bildschirms liegt.\",TD=\"Ressourcenpaket-Einstellungen\",CD=\"Erweiterte Einstellungen benutzen\",SD=\"Ob erweiterte Ressourcenpaket-Einstellungen aktiviert sind oder nicht.\",OD=\"Anzeige-Item\",ID=\"Das Item zur Anzeige der Blaupausenmodelle im Spiel. Mehrere Blaupausen k\\xF6nnen auf demselben Item platziert werden und werden automatisch zusammengef\\xFChrt.\",DD=\"Kein Item ausgew\\xE4hlt!\",FD=\"Das angegebene Item ist ung\\xFCltig! Item-IDs m\\xFCssen als namespace:item_id formattiert sein.\",ND=\"Die angegebene Item-ID ist ung\\xFCltig! Item-IDs d\\xFCrfen keine Leerzeichen enthalten.\",RD=\"Das angegebene Item existiert nicht in Vanilla!\",MD=\"CMD-Versetzung\",BD=\"Der Versatz, der f\\xFCr die benutzerdefinierten Modelldaten des Anzeige-Items verwendet werden soll. Erlaubt mehrere Blaupausen f\\xFCr dasselbe Item, aber in separaten, nicht zugeh\\xF6rigen Ressourcenpaketen.\",PD=\"Ressourcenpaket\",LD=\"Der Hauptordner des Ressourcenpakets, in den das Projekt exportiert werden soll.\",VD=\"Kein Ordner ausgew\\xE4hlt!\",zD=\"Der ausgew\\xE4hlte Ordner existiert nicht!\",UD=\"Der ausgew\\xE4hlte Dateipfad ist kein Ordner!\",qD=\"Im ausgew\\xE4hlten Ordner fehlt die pack.mcmeta-Datei!\",HD=\"Im ausgew\\xE4hlten Ordner fehlt der assets-Ordner!\",JD=\"Ressourcenpaket Zip\",GD=\"Der Dateipfad zu der .zip-Datei, in die das Projekt exportiert werden soll.\",WD=\"Keine Datei ausgew\\xE4hlt!\",KD=\"Der ausgew\\xE4hlte Dateipfad ist keine Datei!\",YD=\"Anzeige-Item-Pfad\",XD=\"Wo das Anzeige-Item gespeichert werden soll. Dies sollte ein Dateipfad zu einer .json-Datei in einem Ressourcenpaket sein.\",ZD=\"Keine Datei ausgew\\xE4hlt!\",QD=\"Die ausgew\\xE4hlte Datei existiert nicht!\",$D=\"Der ausgew\\xE4hlte Dateipfad ist keine Datei!\",e8=\"Modell-Ordner\",t8=\"Wo alle exportierten Modelle gespeichert werden sollen. Dies sollte ein Dateipfad zu einem Ordner in einem Ressourcenpaket sein.\",n8=\"Kein Ordner ausgew\\xE4hlt!\",i8=\"Der ausgew\\xE4hlte Ordner existiert nicht!\",a8=\"Der ausgew\\xE4hlte Dateipfad ist kein Ordner!\",r8=\"Texturen-Ordner\",o8=\"Wo alle exportierten Texturen gespeichert werden sollen. Dies sollte ein Dateipfad zu einem Ordner in einem Ressourcenpaket sein.\",s8=\"Datenpaket-Einstellungen\",l8=\"Erweiterte Einstellungen benutzen\",c8=\"Ob erweiterte Datenpaket-Einstellungen aktiviert sind oder nicht.\",u8=\"Datenpaket\",d8=\"Der Hauptordner des Datenpakets, in den das Projekt exportiert werden soll.\",p8=\"Kein Ordner ausgew\\xE4hlt!\",m8=\"Der ausgew\\xE4hlte Ordner existiert nicht!\",f8=\"Der ausgew\\xE4hlte Dateipfad ist kein Ordner!\",h8=\"Im ausgew\\xE4hlten Ordner fehlt die pack.mcmeta-Datei!\",g8=\"Im ausgew\\xE4hlten Ordner fehlt der data-Ordner!\",_8=\"Datenpaket Zip\",x8=\"Der Dateipfad zu der .zip-Datei, in die das Projekt exportiert werden soll.\",v8=\"Keine Datei ausgew\\xE4hlt!\",b8=\"Der ausgew\\xE4hlte Dateipfad ist keine Datei!\",y8=\"On-Summon-Befehle\",w8=`Befehle, die beim Erschaffen des Root-Objektes ausgef\\xFChrt werden.\nBehandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\\xFCtzt auch MC-Build-Syntax!)`,E8=\"Interpolation-Dauer\",k8=\"Die Dauer (in Ticks) der Gl\\xE4ttung zwischen Keyframes. Dies ist die Zeit, die das Modell ben\\xF6tigt, um von einem Keyframe zum n\\xE4chsten zu wechseln. H\\xF6here Werte f\\xFChren dazu, dass die Animationen ungenauer werden. In der Regel sollten Werte von 1 oder 2 gen\\xFCgen.\",j8=\"Teleport-Dauer\",A8=\"Die Dauer (in Ticks) der Teleportation zwischen Keyframes. Dies ist die Zeit, in der das Modell visuell zwischen seiner alten und neuer Position interpoliert. H\\xF6here Werte f\\xFChren dazu, dass die Animationen ungenauer werden.\",T8=\"NBT-Speicher f\\xFCr Animationen benutzen\",C8=`Ob NBT-Speicher zum Speichern von Animationsdaten anstelle von Funktionen verwendet werden soll oder nicht.\nDadurch wird die Anzahl der Funktionen im generierten Datenpaket erheblich reduziert, ist aber 42% langsamer.`,S8=\"Animationen verbinden\",O8=`Ob die exportierten Animationen verbunden werden oder nicht.\nBei verbundenen Animationen werden die Frames vorberechnet und in der exportierten JSON-Datei gespeichert, wodurch die Komplexit\\xE4t des Renderings des Modells im Spiel reduziert wird.\nBei einigen Plugins muss dies aktiviert sein, damit sie korrekt funktionieren.`,I8=\"JSON-Datei\",D8=\"Der Dateipfad zu der JSON-Datei, in der das Projekt exportiert wird.\",F8=\"Keine Datei ausgew\\xE4hlt!\",N8=\"Der ausgew\\xE4hlte Dateipfad ist keine Datei!\",R8=\"Knochen-Konfiguration\",M8=\"Ausgew\\xE4hlte Variante: {0}\",B8=\"Die folgenden Einstellungen werden standardm\\xE4\\xDFig auf diesen Knochen angewendet.\",P8=\"Die folgenden Einstellungen werden nur auf diesen Knochen angewendet, wenn diese Variante verwendet wird.\",L8=\"NBT benutzen\",V8=\"Ob NBT zur Konfiguration des Knochens anstelle von Einstellungen verwendet werden soll oder nicht.\",z8=\"Die Verwendung von NBT setzt alle anderen Einstellungen au\\xDFer Kraft, und alle \\xC4nderungen, die Sie vornehmen, sind im Editor nicht sichtbar. Verwenden Sie dies nur, wenn Sie wissen, was Sie tun!\",U8=\"Einstellungen erben\",q8=\"Ob die Einstellungen des \\xFCbergeordneten Knochens geerbt werden sollen oder nicht.\",H8=\"Leuchten\",J8=\"Ob der Knochen im Spiel leuchten soll oder nicht.\",G8=\"Leuchtfarbe \\xFCberschreiben\",W8=\"Ob die Standard-Leuchtfarbe \\xFCberschrieben werden soll oder nicht.\",K8=\"Leuchtfarbe\",Y8=\"Die Farbe des Leuchtens.\",X8=\"Schatten-Radius\",Z8=\"Der Radius des Schattens.\",Q8=\"Schatten-Intensit\\xE4t\",$8=\"Die Intensit\\xE4t des Schattens.\",eF=\"Helligkeit \\xFCberschreiben\",tF=\"Ob die Standard-Helligkeit \\xFCberschrieben werden soll oder nicht.\",nF=\"Helligkeit\",iF=\"Die Helligkeit des Knochens. Dies sollte ein Wert zwischen 0 und 15 sein.\",aF=\"Verzaubert\",rF=\"Ob dieser Knochen verzaubert sein soll oder nicht.\",oF=\"Unsichtbar\",sF=\"Ob dieser Knochen unsichtbar sein soll oder nicht.\",lF=\"NBT\",cF=\"Die NBT, die auf den Knochen angewendet werden soll.\",uF=`Die NBT muss ein compound tag sein! Bsp. {CustomName:'\"my name\"'}`,dF=`Ung\\xFCltige NBT!\n{0}`,pF=\"Anzeigetafel\",mF=\"Ob dieser Knochen beim Rendern im Spiel zum Spieler hin drehen soll oder nicht. Es kann fixiert (sowohl vertikal als auch horizontale Winkel sind fixiert), vertikal (dreht sich um die vertikale Achse), horizontal (dreht sich um die horizontale Achse), oder zentriert (dreht sich um den Mittelpunkt) sein.\",fF=\"Fixiert\",hF=\"Vertikal\",gF=\"Horizontal\",_F=\"Zentriert\",xF=\"Locator-Konfiguration\",vF=`Plugin-Modus ist aktiviert! Locators k\\xF6nnen nicht konfiguriert werden im Plugin-Modus.\nVerwenden Sie stattdessen die Plugin-API, um Ihren Locators individuelle Funktionen hinzuzuf\\xFCgen.\nWeitere Informationen finden Sie in der offiziellen Plugin-API-Dokumentation.`,bF=\"Objekt benutzen\",yF=\"Ob ein Objekt an den Locator angeh\\xE4ngt werden soll oder nicht.\",wF=\"Objekt-Typ\",EF=\"Das Objekt, dass an den Locator angeh\\xE4ngt wird.\",kF=\"Objekt-Typ darf nicht leer sein!\",jF=\"Das ausgew\\xE4hlte Objekt existiert nicht in Minecraft {0}\",AF=\"On-Summon Befehle\",TF=`Befehle, die beim Erschaffen des Locator-Objektes ausgef\\xFChrt werden.\nBehandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\\xFCtzt auch MC-Build-Syntax!)`,CF=\"Ticking Befehle\",SF=`Befehle, die bei jedem Tick an der Position des Locators ausgef\\xFChrt werden.\nBehandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\\xFCtzt auch MC-Build-Syntax!)`,OF=\"Textanzeige-Konfiguration\",IF=\"Vanilla Item Model\",DF=`If set, the bone will render as a vanilla item model.\nThis will overwrite the bone's existing cubes.`,FF=\"NBT benutzen\",NF=\"Ob NBT zur Konfiguration der Textanzeige anstelle von Einstellungen verwendet werden soll oder nicht.\",RF=\"Die Verwendung von NBT setzt alle anderen Einstellungen au\\xDFer Kraft, und alle \\xC4nderungen, die Sie vornehmen, sind im Editor nicht sichtbar. Verwenden Sie dies nur, wenn Sie wissen, was Sie tun!\",MF=\"Einstellungen erben\",BF=\"Ob die Einstellungen der \\xFCbergeordneten Textanzeige geerbt werden sollen oder nicht.\",PF=\"Leuchten\",LF=\"Ob die Textanzeige im Spiel leuchten soll oder nicht.\",VF=\"Leuchtfarbe \\xFCberschreiben\",zF=\"Ob die Standard-Leuchtfarbe \\xFCberschrieben werden soll oder nicht.\",UF=\"Leuchtfarbe\",qF=\"Die Farbe des Leuchtens.\",HF=\"Schatten-Radius\",JF=\"Der Radius des Schattens.\",GF=\"Schatten-Intensit\\xE4t\",WF=\"Die Intensit\\xE4t des Schattens.\",KF=\"Helligkeit \\xFCberschreiben\",YF=\"Ob die Standard-Helligkeit \\xFCberschrieben werden soll oder nicht.\",XF=\"Helligkeit\",ZF=\"Die Helligkeit der Textanzeige. Dies sollte ein Wert zwischen 0 und 15 sein.\",QF=\"Unsichtbar\",$F=\"Ob diese Textanzeige unsichtbar sein soll oder nicht.\",eN=\"NBT\",tN=\"Die NBT, die auf die Textanzeige angewendet werden soll.\",nN=\"Anzeigetafel\",iN=\"Ob diese Textanzeige beim Rendern im Spiel zum Spieler hin drehen soll oder nicht. Es kann fixiert (sowohl vertikal als auch horizontale Winkel sind fixiert), vertikal (dreht sich um die vertikale Achse), horizontal (dreht sich um die horizontale Achse), oder zentriert (dreht sich um den Mittelpunkt) sein.\",aN=\"Fixiert\",rN=\"Vertikal\",oN=\"Horizontal\",sN=\"Zentriert\",lN=\"Vanilla Blockanzeige-Konfiguration\",cN=\"Vanilla Itemanzeige-Konfiguration\",uN=\"Variante-Konfiguration\",dN=\"Anzeigename\",pN=\"Wird verwendet, um die Variante im Editor und in Fehlermeldungen zu identifizieren.\",mN=\"Name aus Anzeigename generieren\",fN=\"Ob der Name automatisch aus dem Anzeigenamen generiert werden soll.\",hN=\"Name\",gN=\"Wird verwendet, um die Variante im exportierten Ressourcenpaket und Datenpaket zu identifizieren.\",_N=\"Textur Zuordnung\",xN=\"Eine Zuordnung mit den Texturen, die bei dieser Variante ausgetauscht werden sollen.\",vN=\"Neue Zuordnung erstellen\",bN=\"Variante hat keine ausgetauschten Texturen.\",yN=\"Eine Liste von Nodes, die von der Variante ein- oder ausgeschlossen werden sollen. Nur die Nodes in der eingeschlossenen Liste werden von der Variante ge\\xE4ndert, die Nodes in der ausgeschlossenen Liste werden ignoriert.\",wN=\"Ausgeschlossene Nodes\",EN=\"Eine Liste von Nodes, die von der Variante ausgeschlossen werden sollen. Diese Nodes werden von der Variante ignoriert.\",kN=\"Eingeschlossene Nodes\",jN=\"Eine Liste von Nodes, die von der Variante eingeschlossen werden. Nur diese Nodes werden von der Variante ge\\xE4ndert.\",AN=\"Listen tauschen\",TN=\".ajmodel aktualisieren\",CN=\".ajmodel aktualisieren\",SN=\".ajmodel-Datei ausw\\xE4hlen\",ON=\"Aktualisieren Sie Ihre veraltete .ajmodel-Datei zum neuen .ajblueprint-Format.\",IN=\"W\\xE4hlen Sie eine .ajmodel-Datei f\\xFCr das Aktualisieren aus\",DN=\"Animationseigenschaften ({0})\",FN=\"Animationsname\",NN=\"Der Name der Animation.\",RN=\"Schleifen-Modus\",MN=\"Bestimmt, wie die Animation in einer Schleife abgespielt werden soll. Einmal - Die Animation wird einmal abgespielt und h\\xF6rt auf. Halten - Die Animation wird einmal abgespielt und das letzte Pose wird gehalten. Schleife - Die Animation wird in einer Endlosschleife abgespielt.\",BN=\"Einmal\",PN=\"Halten\",LN=\"Schleife\",VN=\"Der Animationsname darf nicht leer sein!\",zN=\"Der Animationsname enth\\xE4lt ung\\xFCltige Zeichen! Animationsnamen d\\xFCrfen nur Buchstaben, Zahlen und Punkte enthalten.\",UN=\"Schleifenverz\\xF6gerung\",qN=\"Die Verz\\xF6gerung zwischen Schleifen. Dies ist die Zeit, die die Animation pausiert, bevor sie wieder beginnt. Dies wird nur benutzt, wenn der Schleifenmodus auf Schleife eingestellt ist.\",HN=\"Eine Liste von Nodes, die von der Animation ein- oder ausgeschlossen werden sollen. Nur die Nodes in der eingeschlossenen Liste werden von der Animation ge\\xE4ndert, die Nodes in der ausgeschlossenen Liste werden ignoriert.\",JN=\"Ausgeschlossene Nodes\",GN=\"Eine Liste von Nodes, die von der Animation ausgeschlossen werden sollen. Diese Nodes werden von der Animation ignoriert.\",WN=\"Eingeschlossene Nodes\",KN=\"Eine Liste von Nodes, die von der Animation eingeschlossen werden. Nur diese Nodes werden von der Animation ge\\xE4ndert.\",YN=\"Listen tauschen\",XN=\"Projekt wird exportiert...\",ZN=\"Blaupause wird geladen...\",QN=\"Varianten\",$N=\"Neue Variante erstellen\",eR=\"Variante editieren\",tR=\"Ausgew\\xE4hlte Variante duplizieren\",nR=\"Ausgew\\xE4hlte Variante l\\xF6schen\",iR=\"Ausgew\\xE4hlte Variante\",aR=\"Nicht ausgew\\xE4hlte Variante\",rR=\"Standard-Variante darf nicht gel\\xF6scht werden!\",oR=\"Variante erstellen\",sR=\"Variante duplizieren\",lR=\"Variante-Konfiguration \\xF6ffnen\",cR=\"Variante l\\xF6schen\",uR=\"Ausgeschlossene Nodes\",dR=\"Ausgeschlossene Nodes umkehren\",pR=\"Variante\",mR=\"Befehle\",fR=\"Variante\",hR=\"Befehle\",gR=\"Ausf\\xFChrbedingung\",_R=\"Keyframe ({0})\",xR=\"Variante\",vR=\"Die Variante, die bei diesem Keyframe angewendet wird.\",bR=\"Befehle\",yR=`Befehle, die ausgef\\xFChrt werden, sobald dieses Keyframe erreicht wird.\nBehandeln Sie diese Texteingabe wie eine .mcfunction-Datei. (Unterst\\xFCtzt auch MC-Build-Syntax!)`,wR=\"Ausf\\xFChrbedingung\",ER=\"Eine bedingung, die erf\\xFCllt sein muss, damit das Keyframe ausgef\\xFChrt wird. Behandeln Sie diese Texteingabe wie Unterbefehle eines execute Befehls.\",kR=\"Wiederholen?\",jR=`Ob dieser Befehl in diesem Keyframe wiederholt ausgef\\xFChrt wird.\nWenn diese Option aktiviert ist, werden die Befehle einmal pro Wiederholungsfrequenz ausgef\\xFChrt.`,AR=\"Wiederholungsfrequenz\",TR=`Wieviele Ticks dieses Keyframe warten soll, bevor die Befehle erneut ausgef\\xFChrt werden.\nFalls dieser Wert 1 ist, werden die Befehle einmal pro Tick ausgef\\xFChrt.\nHINWEIS: Falls die Animation nicht gleichm\\xE4\\xDFig durch diesen Wert teilbar ist, kann das Intervall beim Schleifen der Animation leicht abweichen.\nFalls dieser Wert gr\\xF6\\xDFer als die L\\xE4nge der Animation ist, werden die Befehle nur einmal ausgef\\xFChrt (sobald der Keyframe erreicht wird).`,CR=\"Gl\\xE4ttungsart\",SR=\"Die Gl\\xE4ttungsart, die bei diesem Keyframe angewendet wird.\",OR=\"Linear\",IR=\"Sinus\",DR=\"Quad\",FR=\"Kubisch\",NR=\"Quart\",RR=\"Quint\",MR=\"Expo\",BR=\"Circ\",PR=\"Elastisch\",LR=\"Zur\\xFCck\",VR=\"Abprallen\",zR=\"Gl\\xE4ttungs-Modus\",UR=\"Die Gl\\xE4ttungs-Modus, die bei diesem Keyframe angewendet wird.\",qR=\"Ein\",HR=\"Aus\",JR=\"Ein-Aus\",GR=\"Gl\\xE4ttungs-Argumente\",WR=\"Die Argumente, die auf die Gl\\xE4ttungsfunktion angewendet werden soll.\",KR=\"Elastizit\\xE4t\",YR=\"Die Elastizit\\xE4t der Gl\\xE4ttungsfunktion.\",XR=\"\\xDCberschwingen\",ZR=\"Der Betrag des \\xDCberschwingens, der auf die Gl\\xE4ttungsfunktion angewendet werden soll.\",QR=\"Sprungkraft\",$R=\"Die Sprungkraft der Gl\\xE4ttungsfunktion.\",eM=\"Textanzeige\",tM=\"Zeilenbreite\",nM=\"Die Breite der Textanzeige in Pixeln.\",iM=\"Hintergrundsfarbe\",aM=\"Die Farbe des Hintergrunds der Textanzeige\",rM=\"Textschatten\",oM=\"Ob die Textanzeige einen Schatten hinter dem Text anzeigt oder nicht.\",sM=\"Textausrichtung\",lM=\"Die Ausrichtung des Textes.\",cM=\"Links\",uM=\"Mitte\",dM=\"Rechts\",pM=\"Angezeigtes Item\",mM=\"Das Item, dass angezeigt werden soll.\",fM=\"Angezeigter Block\",hM=\"Der Block, der angezeigt werden soll. Unterst\\xFCtzt Block states!\",gM=\"Vanilla Item Anzeige\",_M=\"Fehler beim Exportieren\",xM=\"Sie haben den Export des Ressourcenpakets deaktiviert, haben aber benutzerdefinierte Modelle im Projekt! Bitte aktivieren Sie den Export des Ressourcenpakets oder entfernen sie benutzerdefinierte Modelle vor dem Export.\",vM=\"Ihre Blaupause-Einstellungen ist fehlerhaft! Bitte beheben Sie diese, bevor Sie exportieren.\",bM=\"Ein Problem ist aufgetreten mit {0}:\",yM=\"Ok\",wM=\"Animated Java\",EM=\"Fl\\xFCssigkeiten renderen nicht in Blockanzeigen.\",kM=\"Mob-K\\xF6pfe renderen nicht in Blockanzeigen. Benutzen Sie stattdessen Itemanzeigen.\",jM='Der Blockzustand \"facing\" wird in Blockanzeigen nicht unterst\\xFCtzt.',AM=\"Blaupause-Exportpfad Existiert Nicht\",TM=`Der Exportpfad '{0}' existiert nicht!\nVergewissern Sie sich, dass der Ordner, in dem Sie speichern wollen, existiert, und versuchen Sie es erneut.`,CM={\"animated_java.action.open_blueprint_settings.name\":AI,\"animated_java.action.open_documentation.name\":TI,\"animated_java.action.open_about.name\":CI,\"animated_java.action.open_bone_config.name\":SI,\"animated_java.action.open_locator_config.name\":OI,\"animated_java.action.open_text_display_config.name\":II,\"animated_java.action.export.name\":DI,\"animated_java.action.create_text_display.title\":FI,\"animated_java.action.create_vanilla_item_display.title\":NI,\"animated_java.action.create_vanilla_block_display.title\":RI,\"animated_java.action.open_vanilla_item_display_config.name\":MI,\"animated_java.action.open_vanilla_block_display_config.name\":BI,\"animated_java.popup.loading.loading\":PI,\"animated_java.popup.loading.success\":LI,\"animated_java.popup.loading.offline\":VI,\"animated_java.dialog.about.title\":zI,\"animated_java.dialog.about.close_button\":UI,\"animated_java.dialog.unexpected_error.title\":qI,\"animated_java.dialog.unexpected_error.close_button\":HI,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":JI,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":GI,\"animated_java.dialog.unexpected_error.paragraph\":WI,\"animated_java.dialog.blueprint_settings.title\":KI,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":YI,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":XI,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":ZI,\"animated_java.dialog.blueprint_settings.texture_size.title\":QI,\"animated_java.dialog.blueprint_settings.texture_size.description\":$I,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":eD,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":tD,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":nD,\"animated_java.dialog.blueprint_settings.export_settings.title\":iD,\"animated_java.dialog.blueprint_settings.export_namespace.title\":aD,\"animated_java.dialog.blueprint_settings.export_namespace.description\":rD,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":oD,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":sD,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":lD,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":cD,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":uD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":dD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":pD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":mD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":fD,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":hD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":gD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":_D,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":xD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":vD,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":bD,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":yD,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":wD,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":ED,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":kD,\"animated_java.dialog.blueprint_settings.bounding_box.title\":jD,\"animated_java.dialog.blueprint_settings.bounding_box.description\":AD,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":TD,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":CD,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":SD,\"animated_java.dialog.blueprint_settings.display_item.title\":OD,\"animated_java.dialog.blueprint_settings.display_item.description\":ID,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":DD,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":FD,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":ND,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":RD,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":MD,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":BD,\"animated_java.dialog.blueprint_settings.resource_pack.title\":PD,\"animated_java.dialog.blueprint_settings.resource_pack.description\":LD,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":VD,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":zD,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":UD,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":qD,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":HD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":JD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":GD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":WD,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":KD,\"animated_java.dialog.blueprint_settings.display_item_path.title\":YD,\"animated_java.dialog.blueprint_settings.display_item_path.description\":XD,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":ZD,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":QD,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":$D,\"animated_java.dialog.blueprint_settings.model_folder.title\":e8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description\":t8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":n8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":i8,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":a8,\"animated_java.dialog.blueprint_settings.texture_folder.title\":r8,\"animated_java.dialog.blueprint_settings.texture_folder.description\":o8,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":s8,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":l8,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":c8,\"animated_java.dialog.blueprint_settings.data_pack.title\":u8,\"animated_java.dialog.blueprint_settings.data_pack.description\":d8,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":p8,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":m8,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":f8,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":h8,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":g8,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":_8,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":x8,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":v8,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":b8,\"animated_java.dialog.blueprint_settings.summon_commands.title\":y8,\"animated_java.dialog.blueprint_settings.summon_commands.description\":w8,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":E8,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":k8,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":j8,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":A8,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":T8,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":C8,\"animated_java.dialog.blueprint_settings.baked_animations.title\":S8,\"animated_java.dialog.blueprint_settings.baked_animations.description\":O8,\"animated_java.dialog.blueprint_settings.json_file.title\":I8,\"animated_java.dialog.blueprint_settings.json_file.description\":D8,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":F8,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":N8,\"animated_java.dialog.bone_config.title\":R8,\"animated_java.dialog.bone_config.selected_variant\":M8,\"animated_java.dialog.bone_config.default_variant_subtitle\":B8,\"animated_java.dialog.bone_config.selected_variant_subtitle\":P8,\"animated_java.dialog.bone_config.use_nbt.title\":L8,\"animated_java.dialog.bone_config.use_nbt.description\":V8,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":z8,\"animated_java.dialog.bone_config.inherit_settings.title\":U8,\"animated_java.dialog.bone_config.inherit_settings.description\":q8,\"animated_java.dialog.bone_config.glowing.title\":H8,\"animated_java.dialog.bone_config.glowing.description\":J8,\"animated_java.dialog.bone_config.override_glow_color.title\":G8,\"animated_java.dialog.bone_config.override_glow_color.description\":W8,\"animated_java.dialog.bone_config.glow_color.title\":K8,\"animated_java.dialog.bone_config.glow_color.description\":Y8,\"animated_java.dialog.bone_config.shadow_radius.title\":X8,\"animated_java.dialog.bone_config.shadow_radius.description\":Z8,\"animated_java.dialog.bone_config.shadow_strength.title\":Q8,\"animated_java.dialog.bone_config.shadow_strength.description\":$8,\"animated_java.dialog.bone_config.override_brightness.title\":eF,\"animated_java.dialog.bone_config.override_brightness.description\":tF,\"animated_java.dialog.bone_config.brightness_override.title\":nF,\"animated_java.dialog.bone_config.brightness_override.description\":iF,\"animated_java.dialog.bone_config.enchanted.title\":aF,\"animated_java.dialog.bone_config.enchanted.description\":rF,\"animated_java.dialog.bone_config.invisible.title\":oF,\"animated_java.dialog.bone_config.invisible.description\":sF,\"animated_java.dialog.bone_config.nbt.title\":lF,\"animated_java.dialog.bone_config.nbt.description\":cF,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":uF,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":dF,\"animated_java.dialog.bone_config.billboard.title\":pF,\"animated_java.dialog.bone_config.billboard.description\":mF,\"animated_java.dialog.bone_config.billboard.options.fixed\":fF,\"animated_java.dialog.bone_config.billboard.options.vertical\":hF,\"animated_java.dialog.bone_config.billboard.options.horizontal\":gF,\"animated_java.dialog.bone_config.billboard.options.center\":_F,\"animated_java.dialog.locator_config.title\":xF,\"animated_java.dialog.locator_config.plugin_mode_warning\":vF,\"animated_java.dialog.locator_config.use_entity.title\":bF,\"animated_java.dialog.locator_config.use_entity.description\":yF,\"animated_java.dialog.locator_config.entity_type.title\":wF,\"animated_java.dialog.locator_config.entity_type.description\":EF,\"animated_java.dialog.locator_config.entity_type.error.empty\":kF,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":jF,\"animated_java.dialog.locator_config.summon_commands.title\":AF,\"animated_java.dialog.locator_config.summon_commands.description\":TF,\"animated_java.dialog.locator_config.ticking_commands.title\":CF,\"animated_java.dialog.locator_config.ticking_commands.description\":SF,\"animated_java.dialog.text_display_config.title\":OF,\"animated_java.dialog.bone_config.vanilla_item_model.title\":IF,\"animated_java.dialog.bone_config.vanilla_item_model.description\":DF,\"animated_java.dialog.text_display_config.use_nbt.title\":FF,\"animated_java.dialog.text_display_config.use_nbt.description\":NF,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":RF,\"animated_java.dialog.text_display_config.inherit_settings.title\":MF,\"animated_java.dialog.text_display_config.inherit_settings.description\":BF,\"animated_java.dialog.text_display_config.glowing.title\":PF,\"animated_java.dialog.text_display_config.glowing.description\":LF,\"animated_java.dialog.text_display_config.override_glow_color.title\":VF,\"animated_java.dialog.text_display_config.override_glow_color.description\":zF,\"animated_java.dialog.text_display_config.glow_color.title\":UF,\"animated_java.dialog.text_display_config.glow_color.description\":qF,\"animated_java.dialog.text_display_config.shadow_radius.title\":HF,\"animated_java.dialog.text_display_config.shadow_radius.description\":JF,\"animated_java.dialog.text_display_config.shadow_strength.title\":GF,\"animated_java.dialog.text_display_config.shadow_strength.description\":WF,\"animated_java.dialog.text_display_config.override_brightness.title\":KF,\"animated_java.dialog.text_display_config.override_brightness.description\":YF,\"animated_java.dialog.text_display_config.brightness_override.title\":XF,\"animated_java.dialog.text_display_config.brightness_override.description\":ZF,\"animated_java.dialog.text_display_config.invisible.title\":QF,\"animated_java.dialog.text_display_config.invisible.description\":$F,\"animated_java.dialog.text_display_config.nbt.title\":eN,\"animated_java.dialog.text_display_config.nbt.description\":tN,\"animated_java.dialog.text_display_config.billboard.title\":nN,\"animated_java.dialog.text_display_config.billboard.description\":iN,\"animated_java.dialog.text_display_config.billboard.options.fixed\":aN,\"animated_java.dialog.text_display_config.billboard.options.vertical\":rN,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":oN,\"animated_java.dialog.text_display_config.billboard.options.center\":sN,\"animated_java.dialog.vanilla_block_display_config.title\":lN,\"animated_java.dialog.vanilla_item_display_config.title\":cN,\"animated_java.dialog.variant_config.title\":uN,\"animated_java.dialog.variant_config.variant_display_name\":dN,\"animated_java.dialog.variant_config.variant_display_name.description\":pN,\"animated_java.dialog.variant_config.generate_name_from_display_name\":mN,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":fN,\"animated_java.dialog.variant_config.variant_name\":hN,\"animated_java.dialog.variant_config.variant_name.description\":gN,\"animated_java.dialog.variant_config.texture_map.title\":_N,\"animated_java.dialog.variant_config.texture_map.description\":xN,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":vN,\"animated_java.dialog.variant_config.texture_map.no_mappings\":bN,\"animated_java.dialog.variant_config.bone_lists.description\":yN,\"animated_java.dialog.variant_config.excluded_nodes.title\":wN,\"animated_java.dialog.variant_config.excluded_nodes.description\":EN,\"animated_java.dialog.variant_config.included_nodes.title\":kN,\"animated_java.dialog.variant_config.included_nodes.description\":jN,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":AN,\"animated_java.action.upgrade_old_aj_model_loader.name\":TN,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":CN,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":SN,\"animated_java.action.upgrade_old_aj_model_loader.body\":ON,\"animated_java.action.upgrade_old_aj_model_loader.button\":IN,\"animated_java.dialog.animation_properties.title\":DN,\"animated_java.dialog.animation_properties.animation_name.title\":FN,\"animated_java.dialog.animation_properties.animation_name.description\":NN,\"animated_java.dialog.animation_properties.loop_mode.title\":RN,\"animated_java.dialog.animation_properties.loop_mode.description\":MN,\"animated_java.dialog.animation_properties.loop_mode.options.once\":BN,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":PN,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":LN,\"animated_java.dialog.animation_properties.animation_name.error.empty\":VN,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":zN,\"animated_java.dialog.animation_properties.loop_delay.title\":UN,\"animated_java.dialog.animation_properties.loop_delay.description\":qN,\"animated_java.dialog.animation_properties.bone_lists.description\":HN,\"animated_java.dialog.animation_properties.excluded_nodes.title\":JN,\"animated_java.dialog.animation_properties.excluded_nodes.description\":GN,\"animated_java.dialog.animation_properties.included_nodes.title\":WN,\"animated_java.dialog.animation_properties.included_nodes.description\":KN,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":YN,\"animated_java.dialog.export_progress.title\":XN,\"animated_java.dialog.blueprint_loading.title\":ZN,\"animated_java.panel.variants.title\":QN,\"animated_java.panel.variants.tool.create_new_variant\":$N,\"animated_java.panel.variants.tool.edit_variant\":eR,\"animated_java.panel.variants.tool.duplicate_selected_variant\":tR,\"animated_java.panel.variants.tool.delete_selected_variant\":nR,\"animated_java.panel.variants.tool.variant_visible\":iR,\"animated_java.panel.variants.tool.variant_not_visible\":aR,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":rR,\"animated_java.action.variants.create\":oR,\"animated_java.action.variants.duplicate\":sR,\"animated_java.action.variants.open_config\":lR,\"animated_java.action.variants.delete\":cR,\"animated_java.animation.excluded_nodes\":uR,\"animated_java.animation.invert_excluded_nodes\":dR,\"animated_java.effect_animator.timeline.variant\":pR,\"animated_java.effect_animator.timeline.commands\":mR,\"animated_java.effect_animator.keyframes.variant\":fR,\"animated_java.effect_animator.keyframes.commands\":hR,\"animated_java.effect_animator.keyframes.execute_condition\":gR,\"animated_java.panel.keyframe.keyframe_title\":_R,\"animated_java.panel.keyframe.variant.title\":xR,\"animated_java.panel.keyframe.variant.description\":vR,\"animated_java.panel.keyframe.commands.title\":bR,\"animated_java.panel.keyframe.commands.description\":yR,\"animated_java.panel.keyframe.execute_condition.title\":wR,\"animated_java.panel.keyframe.execute_condition.description\":ER,\"animated_java.panel.keyframe.repeat.title\":kR,\"animated_java.panel.keyframe.repeat.description\":jR,\"animated_java.panel.keyframe.repeat_frequency.title\":AR,\"animated_java.panel.keyframe.repeat_frequency.description\":TR,\"animated_java.panel.keyframe.easing_type.title\":CR,\"animated_java.panel.keyframe.easing_type.description\":SR,\"animated_java.panel.keyframe.easing_type.options.linear\":OR,\"animated_java.panel.keyframe.easing_type.options.sine\":IR,\"animated_java.panel.keyframe.easing_type.options.quad\":DR,\"animated_java.panel.keyframe.easing_type.options.cubic\":FR,\"animated_java.panel.keyframe.easing_type.options.quart\":NR,\"animated_java.panel.keyframe.easing_type.options.quint\":RR,\"animated_java.panel.keyframe.easing_type.options.expo\":MR,\"animated_java.panel.keyframe.easing_type.options.circ\":BR,\"animated_java.panel.keyframe.easing_type.options.elastic\":PR,\"animated_java.panel.keyframe.easing_type.options.back\":LR,\"animated_java.panel.keyframe.easing_type.options.bounce\":VR,\"animated_java.panel.keyframe.easing_mode.title\":zR,\"animated_java.panel.keyframe.easing_mode.description\":UR,\"animated_java.panel.keyframe.easing_mode.options.in\":qR,\"animated_java.panel.keyframe.easing_mode.options.out\":HR,\"animated_java.panel.keyframe.easing_mode.options.inout\":JR,\"animated_java.panel.keyframe.easing_args.title\":GR,\"animated_java.panel.keyframe.easing_args.description\":WR,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":KR,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":YR,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":XR,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":ZR,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":QR,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":$R,\"animated_java.panel.text_display.title\":eM,\"animated_java.tool.text_display.line_width.title\":tM,\"animated_java.tool.text_display.line_width.description\":nM,\"animated_java.tool.text_display.background_color.title\":iM,\"animated_java.tool.text_display.background_color.description\":aM,\"animated_java.tool.text_display.text_shadow.title\":rM,\"animated_java.tool.text_display.text_shadow.description\":oM,\"animated_java.tool.text_display.text_alignment.title\":sM,\"animated_java.tool.text_display.text_alignment.description\":lM,\"animated_java.tool.text_display.text_alignment.options.left\":cM,\"animated_java.tool.text_display.text_alignment.options.center\":uM,\"animated_java.tool.text_display.text_alignment.options.right\":dM,\"animated_java.panel.vanilla_item_display.title\":pM,\"animated_java.panel.vanilla_item_display.description\":mM,\"animated_java.panel.vanilla_block_display.title\":fM,\"animated_java.panel.vanilla_block_display.description\":hM,\"animated_java.vanilla_item_display.title\":gM,\"animated_java.misc.failed_to_export.title\":_M,\"animated_java.misc.failed_to_export.custom_models.message\":xM,\"animated_java.misc.failed_to_export.blueprint_settings.message\":vM,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":bM,\"animated_java.misc.failed_to_export.button\":yM,\"animated_java.format_category.animated_java\":wM,\"animated_java.block_model_manager.fluid_warning\":EM,\"animated_java.block_model_manager.mob_head_warning\":kM,\"animated_java.block_model_manager.facing_warning\":jM,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":AM,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":TM};var kg={};vn(kg,{\"animated_java.action.copy_display_entity_config.message\":()=>YM,\"animated_java.action.copy_display_entity_config.name\":()=>KM,\"animated_java.action.create_text_display.title\":()=>JM,\"animated_java.action.create_vanilla_block_display.title\":()=>WM,\"animated_java.action.create_vanilla_item_display.title\":()=>GM,\"animated_java.action.export.name\":()=>BM,\"animated_java.action.export_all.description\":()=>VM,\"animated_java.action.export_all.name\":()=>LM,\"animated_java.action.export_all_debug.description\":()=>UM,\"animated_java.action.export_all_debug.name\":()=>zM,\"animated_java.action.export_debug.name\":()=>PM,\"animated_java.action.extract.confirm\":()=>HM,\"animated_java.action.extract.name\":()=>qM,\"animated_java.action.open_about.name\":()=>NM,\"animated_java.action.open_blueprint_settings.name\":()=>IM,\"animated_java.action.open_changelog.name\":()=>FM,\"animated_java.action.open_display_entity_config.name\":()=>RM,\"animated_java.action.open_documentation.name\":()=>DM,\"animated_java.action.open_locator_config.name\":()=>MM,\"animated_java.action.paste_display_entity_config.message\":()=>ZM,\"animated_java.action.paste_display_entity_config.name\":()=>XM,\"animated_java.action.upgrade_old_aj_model_loader.body\":()=>_9,\"animated_java.action.upgrade_old_aj_model_loader.button\":()=>x9,\"animated_java.action.upgrade_old_aj_model_loader.name\":()=>f9,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":()=>g9,\"animated_java.action.variants.create\":()=>K9,\"animated_java.action.variants.delete\":()=>Z9,\"animated_java.action.variants.duplicate\":()=>Y9,\"animated_java.action.variants.open_config\":()=>X9,\"animated_java.animation.excluded_nodes\":()=>Q9,\"animated_java.animation.invert_excluded_nodes\":()=>$9,\"animated_java.block_model_manager.facing_warning\":()=>Pz,\"animated_java.block_model_manager.fluid_warning\":()=>Mz,\"animated_java.block_model_manager.mob_head_warning\":()=>Bz,\"animated_java.dialog.about.close_button\":()=>dB,\"animated_java.dialog.about.title\":()=>uB,\"animated_java.dialog.animation_properties.animation_name.description\":()=>y9,\"animated_java.dialog.animation_properties.animation_name.error.empty\":()=>T9,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":()=>C9,\"animated_java.dialog.animation_properties.animation_name.title\":()=>b9,\"animated_java.dialog.animation_properties.bone_lists.description\":()=>I9,\"animated_java.dialog.animation_properties.excluded_nodes.description\":()=>F9,\"animated_java.dialog.animation_properties.excluded_nodes.title\":()=>D9,\"animated_java.dialog.animation_properties.included_nodes.description\":()=>R9,\"animated_java.dialog.animation_properties.included_nodes.title\":()=>N9,\"animated_java.dialog.animation_properties.loop_delay.description\":()=>O9,\"animated_java.dialog.animation_properties.loop_delay.title\":()=>S9,\"animated_java.dialog.animation_properties.loop_mode.description\":()=>E9,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":()=>j9,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":()=>A9,\"animated_java.dialog.animation_properties.loop_mode.options.once\":()=>k9,\"animated_java.dialog.animation_properties.loop_mode.title\":()=>w9,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":()=>M9,\"animated_java.dialog.animation_properties.title\":()=>v9,\"animated_java.dialog.blueprint_loading.title\":()=>P9,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":()=>bB,\"animated_java.dialog.blueprint_settings.auto_render_box.description\":()=>BB,\"animated_java.dialog.blueprint_settings.auto_render_box.title\":()=>MB,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description\":()=>YP,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title\":()=>KP,\"animated_java.dialog.blueprint_settings.baked_animations.description\":()=>$P,\"animated_java.dialog.blueprint_settings.baked_animations.title\":()=>QP,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":()=>pP,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":()=>dP,\"animated_java.dialog.blueprint_settings.data_pack.description\":()=>AP,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":()=>SP,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":()=>IP,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":()=>CP,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":()=>OP,\"animated_java.dialog.blueprint_settings.data_pack.title\":()=>jP,\"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder\":()=>TP,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder\":()=>YB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":()=>ZB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":()=>XB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":()=>KB,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":()=>kP,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":()=>FP,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":()=>NP,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":()=>RP,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":()=>DP,\"animated_java.dialog.blueprint_settings.display_item.description\":()=>aP,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":()=>oP,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":()=>sP,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":()=>uP,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":()=>rP,\"animated_java.dialog.blueprint_settings.display_item.title\":()=>iP,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":()=>lP,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":()=>cP,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":()=>nP,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":()=>tP,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":()=>qB,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":()=>UB,\"animated_java.dialog.blueprint_settings.export_namespace.description\":()=>OB,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":()=>IB,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":()=>FB,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":()=>DB,\"animated_java.dialog.blueprint_settings.export_namespace.title\":()=>SB,\"animated_java.dialog.blueprint_settings.export_settings.title\":()=>CB,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":()=>JP,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":()=>HP,\"animated_java.dialog.blueprint_settings.json_file.description\":()=>tL,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":()=>nL,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":()=>iL,\"animated_java.dialog.blueprint_settings.json_file.title\":()=>eL,\"animated_java.dialog.blueprint_settings.on_post_tick_function.description\":()=>qP,\"animated_java.dialog.blueprint_settings.on_post_tick_function.title\":()=>UP,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.description\":()=>zP,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.title\":()=>VP,\"animated_java.dialog.blueprint_settings.on_remove_function.description\":()=>LP,\"animated_java.dialog.blueprint_settings.on_remove_function.title\":()=>PP,\"animated_java.dialog.blueprint_settings.on_summon_function.description\":()=>BP,\"animated_java.dialog.blueprint_settings.on_summon_function.title\":()=>MP,\"animated_java.dialog.blueprint_settings.project_name.description\":()=>wB,\"animated_java.dialog.blueprint_settings.project_name.title\":()=>yB,\"animated_java.dialog.blueprint_settings.project_settings.title\":()=>vB,\"animated_java.dialog.blueprint_settings.render_box.description\":()=>LB,\"animated_java.dialog.blueprint_settings.render_box.title\":()=>PB,\"animated_java.dialog.blueprint_settings.resource_pack.description\":()=>fP,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":()=>_P,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":()=>vP,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":()=>gP,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":()=>xP,\"animated_java.dialog.blueprint_settings.resource_pack.title\":()=>mP,\"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder\":()=>hP,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder\":()=>JB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":()=>WB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":()=>GB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":()=>HB,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":()=>eP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":()=>yP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":()=>wP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":()=>EP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":()=>bP,\"animated_java.dialog.blueprint_settings.show_render_box.description\":()=>RB,\"animated_java.dialog.blueprint_settings.show_render_box.title\":()=>NB,\"animated_java.dialog.blueprint_settings.target_minecraft_version.description\":()=>$B,\"animated_java.dialog.blueprint_settings.target_minecraft_version.title\":()=>QB,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":()=>WP,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":()=>GP,\"animated_java.dialog.blueprint_settings.texture_size.description\":()=>kB,\"animated_java.dialog.blueprint_settings.texture_size.title\":()=>EB,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":()=>TB,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":()=>AB,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":()=>jB,\"animated_java.dialog.blueprint_settings.title\":()=>xB,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":()=>ZP,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":()=>XP,\"animated_java.dialog.blueprint_settings.view_range.description\":()=>zB,\"animated_java.dialog.blueprint_settings.view_range.title\":()=>VB,\"animated_java.dialog.bone_config.vanilla_item_model.description\":()=>d7,\"animated_java.dialog.bone_config.vanilla_item_model.title\":()=>u7,\"animated_java.dialog.changelog_dialog.title\":()=>pB,\"animated_java.dialog.display_entity.billboard.description\":()=>LL,\"animated_java.dialog.display_entity.billboard.options.center\":()=>qL,\"animated_java.dialog.display_entity.billboard.options.fixed\":()=>VL,\"animated_java.dialog.display_entity.billboard.options.horizontal\":()=>UL,\"animated_java.dialog.display_entity.billboard.options.vertical\":()=>zL,\"animated_java.dialog.display_entity.billboard.title\":()=>PL,\"animated_java.dialog.display_entity.brightness_override.description\":()=>SL,\"animated_java.dialog.display_entity.brightness_override.title\":()=>CL,\"animated_java.dialog.display_entity.custom_brightness.description\":()=>FL,\"animated_java.dialog.display_entity.custom_brightness.title\":()=>DL,\"animated_java.dialog.display_entity.custom_name.description\":()=>pL,\"animated_java.dialog.display_entity.custom_name.invalid_json.error\":()=>mL,\"animated_java.dialog.display_entity.custom_name.title\":()=>dL,\"animated_java.dialog.display_entity.custom_name_visible.description\":()=>hL,\"animated_java.dialog.display_entity.custom_name_visible.title\":()=>fL,\"animated_java.dialog.display_entity.enchanted.description\":()=>RL,\"animated_java.dialog.display_entity.enchanted.title\":()=>NL,\"animated_java.dialog.display_entity.glow_color.description\":()=>yL,\"animated_java.dialog.display_entity.glow_color.title\":()=>bL,\"animated_java.dialog.display_entity.glowing.description\":()=>_L,\"animated_java.dialog.display_entity.glowing.title\":()=>gL,\"animated_java.dialog.display_entity.invisible.description\":()=>BL,\"animated_java.dialog.display_entity.invisible.title\":()=>ML,\"animated_java.dialog.display_entity.node_options.title\":()=>rL,\"animated_java.dialog.display_entity.on_apply_function.description\":()=>uL,\"animated_java.dialog.display_entity.on_apply_function.title\":()=>cL,\"animated_java.dialog.display_entity.on_summon_function.description\":()=>lL,\"animated_java.dialog.display_entity.on_summon_function.title\":()=>sL,\"animated_java.dialog.display_entity.override_brightness.description\":()=>TL,\"animated_java.dialog.display_entity.override_brightness.title\":()=>AL,\"animated_java.dialog.display_entity.override_glow_color.description\":()=>vL,\"animated_java.dialog.display_entity.override_glow_color.title\":()=>xL,\"animated_java.dialog.display_entity.per_variant_options.title\":()=>oL,\"animated_java.dialog.display_entity.shadow_radius.description\":()=>EL,\"animated_java.dialog.display_entity.shadow_radius.title\":()=>wL,\"animated_java.dialog.display_entity.shadow_strength.description\":()=>jL,\"animated_java.dialog.display_entity.shadow_strength.title\":()=>kL,\"animated_java.dialog.display_entity.title\":()=>aL,\"animated_java.dialog.display_entity.use_custom_brightness.description\":()=>IL,\"animated_java.dialog.display_entity.use_custom_brightness.title\":()=>OL,\"animated_java.dialog.export_progress.title\":()=>B9,\"animated_java.dialog.locator_config.entity_type.description\":()=>YL,\"animated_java.dialog.locator_config.entity_type.error.empty\":()=>XL,\"animated_java.dialog.locator_config.entity_type.title\":()=>KL,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":()=>ZL,\"animated_java.dialog.locator_config.on_remove_function.description\":()=>a7,\"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity\":()=>r7,\"animated_java.dialog.locator_config.on_remove_function.title\":()=>i7,\"animated_java.dialog.locator_config.on_summon_function.description\":()=>t7,\"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity\":()=>n7,\"animated_java.dialog.locator_config.on_summon_function.title\":()=>e7,\"animated_java.dialog.locator_config.on_tick_function.description\":()=>s7,\"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity\":()=>l7,\"animated_java.dialog.locator_config.on_tick_function.title\":()=>o7,\"animated_java.dialog.locator_config.plugin_mode_warning\":()=>JL,\"animated_java.dialog.locator_config.sync_passenger_rotation.description\":()=>$L,\"animated_java.dialog.locator_config.sync_passenger_rotation.title\":()=>QL,\"animated_java.dialog.locator_config.title\":()=>HL,\"animated_java.dialog.locator_config.use_entity.description\":()=>WL,\"animated_java.dialog.locator_config.use_entity.title\":()=>GL,\"animated_java.dialog.reset\":()=>cB,\"animated_java.dialog.text_display_config.brightness_override.description\":()=>O7,\"animated_java.dialog.text_display_config.brightness_override.title\":()=>S7,\"animated_java.dialog.text_display_config.custom_brightness.description\":()=>N7,\"animated_java.dialog.text_display_config.custom_brightness.title\":()=>F7,\"animated_java.dialog.text_display_config.glow_color.description\":()=>w7,\"animated_java.dialog.text_display_config.glow_color.title\":()=>y7,\"animated_java.dialog.text_display_config.glowing.description\":()=>x7,\"animated_java.dialog.text_display_config.glowing.title\":()=>_7,\"animated_java.dialog.text_display_config.inherit_settings.description\":()=>g7,\"animated_java.dialog.text_display_config.inherit_settings.title\":()=>h7,\"animated_java.dialog.text_display_config.invisible.description\":()=>M7,\"animated_java.dialog.text_display_config.invisible.title\":()=>R7,\"animated_java.dialog.text_display_config.nbt.description\":()=>P7,\"animated_java.dialog.text_display_config.nbt.title\":()=>B7,\"animated_java.dialog.text_display_config.override_brightness.description\":()=>C7,\"animated_java.dialog.text_display_config.override_brightness.title\":()=>T7,\"animated_java.dialog.text_display_config.override_glow_color.description\":()=>b7,\"animated_java.dialog.text_display_config.override_glow_color.title\":()=>v7,\"animated_java.dialog.text_display_config.shadow_radius.description\":()=>k7,\"animated_java.dialog.text_display_config.shadow_radius.title\":()=>E7,\"animated_java.dialog.text_display_config.shadow_strength.description\":()=>A7,\"animated_java.dialog.text_display_config.shadow_strength.title\":()=>j7,\"animated_java.dialog.text_display_config.title\":()=>c7,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":()=>D7,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":()=>I7,\"animated_java.dialog.text_display_config.use_nbt.description\":()=>m7,\"animated_java.dialog.text_display_config.use_nbt.title\":()=>p7,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":()=>f7,\"animated_java.dialog.unexpected_error.close_button\":()=>fB,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":()=>gB,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":()=>hB,\"animated_java.dialog.unexpected_error.paragraph\":()=>_B,\"animated_java.dialog.unexpected_error.title\":()=>mB,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":()=>h9,\"animated_java.dialog.vanilla_block_display.custom_name.description\":()=>z7,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":()=>U7,\"animated_java.dialog.vanilla_block_display.custom_name.title\":()=>V7,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":()=>H7,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":()=>q7,\"animated_java.dialog.vanilla_block_display_config.title\":()=>L7,\"animated_java.dialog.vanilla_item_display.custom_name.description\":()=>W7,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":()=>K7,\"animated_java.dialog.vanilla_item_display.custom_name.title\":()=>G7,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":()=>X7,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":()=>Y7,\"animated_java.dialog.vanilla_item_display_config.title\":()=>J7,\"animated_java.dialog.variant_config.bone_lists.description\":()=>l9,\"animated_java.dialog.variant_config.excluded_nodes.description\":()=>u9,\"animated_java.dialog.variant_config.excluded_nodes.title\":()=>c9,\"animated_java.dialog.variant_config.generate_name_from_display_name\":()=>e9,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":()=>t9,\"animated_java.dialog.variant_config.included_nodes.description\":()=>p9,\"animated_java.dialog.variant_config.included_nodes.title\":()=>d9,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":()=>m9,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":()=>o9,\"animated_java.dialog.variant_config.texture_map.description\":()=>r9,\"animated_java.dialog.variant_config.texture_map.no_mappings\":()=>s9,\"animated_java.dialog.variant_config.texture_map.title\":()=>a9,\"animated_java.dialog.variant_config.title\":()=>Z7,\"animated_java.dialog.variant_config.variant_display_name\":()=>Q7,\"animated_java.dialog.variant_config.variant_display_name.description\":()=>$7,\"animated_java.dialog.variant_config.variant_name\":()=>n9,\"animated_java.dialog.variant_config.variant_name.description\":()=>i9,\"animated_java.effect_animator.keyframe_data_point.execute_condition\":()=>aV,\"animated_java.effect_animator.keyframe_data_point.function\":()=>iV,\"animated_java.effect_animator.keyframe_data_point.repeat\":()=>rV,\"animated_java.effect_animator.keyframe_data_point.repeat_frequency\":()=>oV,\"animated_java.effect_animator.keyframe_data_point.variant\":()=>nV,\"animated_java.effect_animator.timeline.function\":()=>tV,\"animated_java.effect_animator.timeline.variant\":()=>eV,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":()=>Vz,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":()=>Lz,\"animated_java.format.blueprint.name\":()=>OM,\"animated_java.format_category.animated_java\":()=>Rz,\"animated_java.menubar.label\":()=>SM,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":()=>Tz,\"animated_java.misc.failed_to_export.blueprint_settings.message\":()=>Az,\"animated_java.misc.failed_to_export.button\":()=>Cz,\"animated_java.misc.failed_to_export.custom_models.message\":()=>jz,\"animated_java.misc.failed_to_export.invalid_rotation.message\":()=>Sz,\"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6\":()=>Oz,\"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message\":()=>Dz,\"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message\":()=>Iz,\"animated_java.misc.failed_to_export.title\":()=>kz,\"animated_java.panel.keyframe.easing_args.description\":()=>BV,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":()=>zV,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":()=>VV,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":()=>qV,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":()=>UV,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":()=>LV,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":()=>PV,\"animated_java.panel.keyframe.easing_args.title\":()=>MV,\"animated_java.panel.keyframe.easing_mode.description\":()=>DV,\"animated_java.panel.keyframe.easing_mode.options.in\":()=>FV,\"animated_java.panel.keyframe.easing_mode.options.inout\":()=>RV,\"animated_java.panel.keyframe.easing_mode.options.out\":()=>NV,\"animated_java.panel.keyframe.easing_mode.title\":()=>IV,\"animated_java.panel.keyframe.easing_type.description\":()=>vV,\"animated_java.panel.keyframe.easing_type.options.back\":()=>SV,\"animated_java.panel.keyframe.easing_type.options.bounce\":()=>OV,\"animated_java.panel.keyframe.easing_type.options.circ\":()=>TV,\"animated_java.panel.keyframe.easing_type.options.cubic\":()=>EV,\"animated_java.panel.keyframe.easing_type.options.elastic\":()=>CV,\"animated_java.panel.keyframe.easing_type.options.expo\":()=>AV,\"animated_java.panel.keyframe.easing_type.options.linear\":()=>bV,\"animated_java.panel.keyframe.easing_type.options.quad\":()=>wV,\"animated_java.panel.keyframe.easing_type.options.quart\":()=>kV,\"animated_java.panel.keyframe.easing_type.options.quint\":()=>jV,\"animated_java.panel.keyframe.easing_type.options.sine\":()=>yV,\"animated_java.panel.keyframe.easing_type.title\":()=>xV,\"animated_java.panel.keyframe.execute_condition.description\":()=>mV,\"animated_java.panel.keyframe.execute_condition.title\":()=>pV,\"animated_java.panel.keyframe.function.description\":()=>dV,\"animated_java.panel.keyframe.function.title\":()=>uV,\"animated_java.panel.keyframe.keyframe_title\":()=>sV,\"animated_java.panel.keyframe.nonlinear_interpolation\":()=>HV,\"animated_java.panel.keyframe.repeat.description\":()=>hV,\"animated_java.panel.keyframe.repeat.title\":()=>fV,\"animated_java.panel.keyframe.repeat_frequency.description\":()=>_V,\"animated_java.panel.keyframe.repeat_frequency.title\":()=>gV,\"animated_java.panel.keyframe.variant.description\":()=>cV,\"animated_java.panel.keyframe.variant.title\":()=>lV,\"animated_java.panel.text_display.title\":()=>JV,\"animated_java.panel.vanilla_block_display.description\":()=>wz,\"animated_java.panel.vanilla_block_display.title\":()=>yz,\"animated_java.panel.vanilla_item_display.description\":()=>cz,\"animated_java.panel.vanilla_item_display.title\":()=>lz,\"animated_java.panel.variants.title\":()=>L9,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":()=>G9,\"animated_java.panel.variants.tool.cannot_edit_default_variant\":()=>W9,\"animated_java.panel.variants.tool.create_new_variant\":()=>V9,\"animated_java.panel.variants.tool.delete_selected_variant\":()=>q9,\"animated_java.panel.variants.tool.duplicate_selected_variant\":()=>U9,\"animated_java.panel.variants.tool.edit_variant\":()=>z9,\"animated_java.panel.variants.tool.variant_not_visible\":()=>J9,\"animated_java.panel.variants.tool.variant_visible\":()=>H9,\"animated_java.plugin_dialog.incompatability_notice\":()=>lB,\"animated_java.popup.incompatability_popup.button.disable_all\":()=>oB,\"animated_java.popup.incompatability_popup.button.ignore\":()=>sB,\"animated_java.popup.incompatability_popup.description\":()=>aB,\"animated_java.popup.incompatability_popup.disable_button\":()=>rB,\"animated_java.popup.incompatability_popup.title\":()=>iB,\"animated_java.popup.installed_popup.close_button\":()=>nB,\"animated_java.popup.installed_popup.title\":()=>tB,\"animated_java.popup.loading.loading\":()=>QM,\"animated_java.popup.loading.offline\":()=>eB,\"animated_java.popup.loading.success\":()=>$M,\"animated_java.toast.invalid_rotations\":()=>Fz,\"animated_java.toast.invalid_rotations_post_1_21_6\":()=>Nz,\"animated_java.tool.item_display.item_display.description\":()=>dz,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":()=>hz,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":()=>gz,\"animated_java.tool.item_display.item_display.options.fixed\":()=>bz,\"animated_java.tool.item_display.item_display.options.ground\":()=>vz,\"animated_java.tool.item_display.item_display.options.gui\":()=>xz,\"animated_java.tool.item_display.item_display.options.head\":()=>_z,\"animated_java.tool.item_display.item_display.options.none\":()=>pz,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":()=>mz,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":()=>fz,\"animated_java.tool.item_display.item_display.title\":()=>uz,\"animated_java.tool.text_display.background_color.description\":()=>YV,\"animated_java.tool.text_display.background_color.title\":()=>KV,\"animated_java.tool.text_display.copy_text.copied\":()=>sz,\"animated_java.tool.text_display.copy_text.description\":()=>oz,\"animated_java.tool.text_display.copy_text.title\":()=>rz,\"animated_java.tool.text_display.line_width.description\":()=>WV,\"animated_java.tool.text_display.line_width.title\":()=>GV,\"animated_java.tool.text_display.see_through.description\":()=>az,\"animated_java.tool.text_display.see_through.title\":()=>iz,\"animated_java.tool.text_display.text_alignment.description\":()=>$V,\"animated_java.tool.text_display.text_alignment.options.center\":()=>tz,\"animated_java.tool.text_display.text_alignment.options.left\":()=>ez,\"animated_java.tool.text_display.text_alignment.options.right\":()=>nz,\"animated_java.tool.text_display.text_alignment.title\":()=>QV,\"animated_java.tool.text_display.text_shadow.description\":()=>ZV,\"animated_java.tool.text_display.text_shadow.title\":()=>XV,\"animated_java.vanilla_item_display.title\":()=>Ez,default:()=>zz});var SM=\"Animated Java\",OM=\"Blueprint\",IM=\"Blueprint Settings\",DM=\"Documentation\",FM=\"Changelog\",NM=\"About\",RM=\"Display Entity Config\",MM=\"Locator Config\",BM=\"Export\",PM=\"Export (Debug)\",LM=\"Export All\",VM=\"Export all open Blueprint projects.\",zM=\"Export All (Debug)\",UM=\"Export all open Blueprint projects in debug mode.\",qM=\"Extract\",HM=\"Confirm Extraction\",JM=\"Add Text Display\",GM=\"Add Item Display\",WM=\"Add Block Display\",KM=\"Copy Display Entity Config\",YM='Copied Display Entity Config from \"{0}\"',XM=\"Paste Display Entity Config\",ZM='Pasted Display Entity Config from \"{0}\"',QM=\"Loading Animated Java...\",$M=\"Animated Java Loaded Successfully!\",eB=`Animated Java Failed to Connect!\nSome features may be unavailable.`,tB=\"Thank you for installing!\",nB=\"Let's Get Animating!\",iB=\"Animated Java Incompatibility Detected\",aB=`You have plugins installed that are known to cause issues with Animated Java.\nPlease disable or uninstall the following plugin(s) and restart Blockbench to use Animated Java:`,rB=\"Disable Plugin\",oB=\"Disable All Incompatible Plugins\",sB=\"Ignore and Continue (Not Recommended)\",lB=`This plugin is known to cause issues with Animated Java.\n\nYou will be unable to install this plugin while Animated Java is installed.`,cB=\"Reset to Default\",uB=\"About Animated Java\",dB=\"Close\",pB=\"Animated Java Changelog\",mB=\"An Unexpected Error Occurred!\",fB=\"Close\",hB=\"Error Message Copied to Clipboard!\",gB=\"Click to copy the error message to the clipboard.\",_B=\"Please report this error by joining our {0} and creating a thread in the #animated-java-support channel, or by creating an issue on our {1}. Thank you!\",xB=\"Blueprint Settings\",vB=\"Project\",bB=\"Advanced settings should only be used if absolutely needed!\",yB=\"Name\",wB=`The Blueprint's filename.\n\nThis will be overwritten if you save the Blueprint with a different name.`,EB=\"Texture Size\",kB=`The resolution of the UV editor.\n\nThis should match the size of the largest texture in your Blueprint.`,jB=\"Texture Size should be square if possible!\",AB=\"Texture Size should be a power of 2 if possible!\",TB=\"The chosen Texture Size does not match the size of the largest texture in your Blueprint!\",CB=\"Export\",SB=\"Namespace\",OB=`The namespace to use when generating the Resource Pack and Data Pack.\n\nIt is recommended to use a unique namespace to avoid conflicts with other Resource Packs and Data Packs.`,IB=\"The export namespace cannot be empty!\",DB='The export namespace \"{0}\" is reserved for internal functionality! Please choose a different namespace.',FB=\"The export namespace contains invalid characters! Namespaces can only contain letters, numbers, and underscores.\",NB=\"Show Render Box\",RB=\"When enabled, the render box will be visible in the editor.\",MB=\"Auto-Size Render Box\",BB=\"When enabled, the render box will be automatically calculated based on the model's geometry.\",PB=\"Render Box Size\",LB=\"The [width and height](https://minecraft.wiki/w/Display#Entity_data) of the rig's display entities.\",VB=\"View Range\",zB=\"The default [view range](https://minecraft.wiki/w/Display#Entity_data) of the rig.\",UB=\"Plugin Mode\",qB=\"When enabled, the project will be exported as a JSON file designed for use with plugins.\",HB=\"Resource Pack Export Mode\",JB=\"Folder\",GB=\"Zip\",WB=\"None\",KB=\"Data Pack Export Mode\",YB=\"Folder\",XB=\"Zip\",ZB=\"None\",QB=\"Target Minecraft Version\",$B=`The version of Minecraft to target when exporting the project.\n\nIf the version you are using is not available, select the closest version below it.\n\nE.g If you are using \\`1.21.8\\`, select \\`1.21.5\\`.\n\nSome features may be altered, or unavailable depending on the selected version.\n\nAnimated Java will inform you of any changes that need to be made.`,eP=\"Resource Pack\",tP=\"Advanced Settings\",nP=\"Advanced Folders\",iP=\"Display Item\",aP=`The item to use for the rig's models.\n\nMultiple Blueprints in the same project can use the same item, and they will be merged automatically when exported.`,rP=\"No item selected!\",oP=\"The provided item ID is invalid! Item IDs should be in the format `namespace:item_id`.\",sP=\"The provided item ID is invalid! Item IDs should not contain any whitespace.\",lP=\"The selected item does not exist in vanilla!\",cP=\"The selected item does not use `minecraft:item/generated` as its parent. This may cause model issues in-game.\",uP=`The selected item does not have a model file in the vanilla resource pack!\n\nIf you believe this is an error, try restarting Blockbench, and waiting for the AJ loading popup to disappear before opening a Blueprint.`,dP=\"CMD Offset\",pP=\"Offsets the Custom Model Data (CMD) values used in the display item's predicates by the specified amount.\",mP=\"Resource Pack\",fP=\"The root folder of a Resource Pack to export the project to.\\n\\nThe targeted Resource Pack must contain a `pack.mcmeta` file.\",hP=\"The selected Resource Pack is missing an assets folder!\",gP=\"No folder selected!\",_P=\"The selected folder does not exist!\",xP=\"The selected path is not a folder!\",vP=\"The selected folder is missing a pack.mcmeta file!\",bP=\"Resource Pack Zip\",yP=\"The path to the .zip file to export the project to.\",wP=\"No file selected!\",EP=\"The selected path is not a file!\",kP=\"Data Pack\",jP=\"Data Pack\",AP=\"The root folder of a Data Pack to export the project to.\\n\\nThe targeted Data Pack must contain a `pack.mcmeta` file.\",TP=\"The selected Data Pack is missing a data folder!\",CP=\"No folder selected!\",SP=\"The selected folder does not exist!\",OP=\"The selected path is not a folder!\",IP=\"The selected folder is missing a pack.mcmeta file!\",DP=\"Data Pack Zip\",FP=\"The path to the .zip file to export the project to.\",NP=\"No file selected!\",RP=\"The selected path is not a file!\",MP=\"On-Summon Function\",BP=\"Commands to execute `as` and `at` the root entity when summoned.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",PP=\"On-Remove Function\",LP=\"Commands to run `as` and `at` the root entity when removed.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",VP=\"Pre-Tick Function\",zP=\"Commands to run `as` and `at` the root entity every tick *before* Animated Java's own ticking logic.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",UP=\"Post-Tick Function\",qP=\"Commands to run `as` and `at` the root entity every tick *after* Animated Java's own ticking logic.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",HP=\"Interpolation Duration\",JP=`The default [interpolation duration](https://minecraft.wiki/w/Display#Entity_data) of the rig.\n\nHigher values make animations smoother but less responsive.`,GP=\"Teleport Duration\",WP=`The default [teleport duration](https://minecraft.wiki/w/Display#Entity_data) of the rig.\n\nHigher values make large movements smoother but less responsive.`,KP=\"Auto Update Rig Orientation\",YP=`When **enabled**, syncs the positions and rotations of all node entities with the root entity every tick.\nAllowing you to simply teleport the root entity to move and rotate the entire rig.\n\nWhen **disabled**, you must use the move function to teleport the rig:\n\n\\`\\`\\`\nexecute as @e[tag=aj.<export_namespace>_root] \\\\\n    positioned <x> <y> <z> rotated <yaw> <pitch> run \\\\\n    function animated_java:<export_namespace>/move\n\\`\\`\\`\n\nSyncing node positions and rotations every tick can be expensive, especially for large rigs.\nDisabling this option can improve performance at the cost of convenience.`,XP=\"Use Storage for Animation\",ZP=`When enabled, NBT storage will be used to store animation data instead of functions.\n\nThis greatly reduces the file count of the exported Data Pack, but is significantly slower.`,QP=\"Baked Animations\",$P=`Whether or not to bake the exported animations.\nBaked animations have their frames pre-calculated and stored in the exported JSON file, reducing the complexity of rendering the model in-game.\nSome Plugins may require this to be enabled to function correctly.`,eL=\"JSON File\",tL=\"The path to the JSON file to export the project to.\",nL=\"No file selected!\",iL=\"The selected path is not a file!\",aL='Display Entity Config for \"{0}\"',rL=\"Node\",oL=\"Per-Variant\",sL=\"On-Summon Function\",lL=\"Commands to run `as` the display entity when summoned.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",cL=\"On-Apply Function\",uL=\"Commands to run `as` the display entity when the variant is applied.\\n\\nTreat this input as if it were a `.mcfunction` file.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",dL=\"Custom Name\",pL=\"The custom name of the node.\",mL=`Invalid JSON Text!\n{0}`,fL=\"Custom Name Visible\",hL=\"Whether or not the custom name should always be visible.\",gL=\"Glowing\",_L=\"Whether or not the node should glow in-game.\",xL=\"Override Glow Color\",vL=\"Whether or not to override the default glow color.\",bL=\"Glow Color\",yL=\"The color of the glow.\",wL=\"Shadow Radius\",EL=\"The radius of the shadow.\",kL=\"Shadow Strength\",jL=\"The strength of the shadow.\",AL=\"Override Brightness\",TL=\"Whether or not to override the default brightness.\",CL=\"Brightness\",SL=\"The brightness of the node. This should be a value between 0 and 15.\",OL=\"Use Custom Brightness\",IL=\"Whether or not to enable the custom brightness override for the node.\",DL=\"Custom Brightness\",FL=\"The custom brightness of the node. This should be a value between 0 and 15.\",NL=\"Enchanted\",RL=\"Whether or not the node should be enchanted.\",ML=\"Invisible\",BL=\"Whether or not the node should be invisible.\",PL=\"Billboard\",LL=`Controls if this nodes model should pivot to face player when rendered.\n- **Fixed**: Both vertical and horizontal angles are fixed.\n- **Vertical**: Pivots around vertical axis.\n- **Horizontal**: Pivots around horizontal axis.\n- **Center**: Pivots around center point.`,VL=\"Fixed\",zL=\"Vertical\",UL=\"Horizontal\",qL=\"Center\",HL=\"Locator Config\",JL=`Plugin Mode is enabled! Locators have no configuration in Plugin Mode.\nInstead, use the Plugin API to add custom functionality to your Locators.\nFor more information, see the Official Plugin API documentation for more information.`,GL=\"Use Entity\",WL=\"When enabled, the Locator will summon and use an entity to represent itself in-game.\",KL=\"Entity Type\",YL=\"The type of entity to attach to the Locator.\",XL=\"Entity Type cannot be empty!\",ZL=\"The selected entity type doesn't exist in Minecraft {0}\",QL=\"Sync Passenger Rotation\",$L=\"Automatically sync the rotation of the Locator's passenger entities.\",e7=\"On-Summon Function\",t7=\"Commands to run `as` the root entity and `at` the Locator's position when the rig is summoned.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",n7=\"Commands to run `as` and `at` the Locator's entity when summoned.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",i7=\"On-Remove Function\",a7=\"Commands to run `as` the root entity and `at` the Locator's position when the rig is removed.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",r7=\"Commands to run `as` and `at` the Locator's entity when removed.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",o7=\"On-Tick Function\",s7=\"Commands to run `at` the Locator's position every tick.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",l7=\"Commands to run `as` and `at` the Locator's entity every tick.\\n\\nSupports [MC-Build](https://mcbuild.dev) syntax.\",c7=\"Text Display Config\",u7=\"Vanilla Item Model\",d7=`If set, the bone will render as a vanilla item model.\nThis will overwrite the bone's existing cubes.`,p7=\"Use NBT\",m7=\"Whether or not to use NBT to configure the text display instead of settings.\",f7=\"Using NBT will override all other settings, and any changes you make will not be visible in the editor. Only use this if you know what you're doing!\",h7=\"Inherit Settings\",g7=\"Whether or not to inherit the settings from the parent text display.\",_7=\"Glowing\",x7=\"Whether or not the text display should glow in-game.\",v7=\"Override Glow Color\",b7=\"Whether or not to override the default glow color.\",y7=\"Glow Color\",w7=\"The color of the glow.\",E7=\"Shadow Radius\",k7=\"The radius of the shadow.\",j7=\"Shadow Strength\",A7=\"The strength of the shadow.\",T7=\"Override Brightness\",C7=\"Whether or not to override the default brightness.\",S7=\"Brightness\",O7=\"The brightness of the text display. This should be a value between 0 and 15.\",I7=\"Use Custom Brightness\",D7=\"Whether or not to enable the custom brightness override for the bone.\",F7=\"Custom Brightness\",N7=\"The custom brightness of the bone. This should be a value between 0 and 15.\",R7=\"Invisible\",M7=\"Whether or not the text display should be invisible.\",B7=\"NBT\",P7=\"The NBT to apply to the text display.\",L7=\"Block Display Config\",V7=\"Custom Name\",z7=\"The custom name of the block display.\",U7=`Invalid JSON Text!\n{0}`,q7=\"Custom Name Visible\",H7=\"Whether or not the custom name should always be visible.\",J7=\"Item Display Config\",G7=\"Custom Name\",W7=\"The custom name of the item display.\",K7=`Invalid JSON Text!\n{0}`,Y7=\"Custom Name Visible\",X7=\"Whether or not the custom name should always be visible.\",Z7=\"Variant Config\",Q7=\"Display Name\",$7=\"Used to identify the Variant in the editor, and in error messages.\",e9=\"Generate Name From Display Name\",t9=\"Whether or not to generate the Name automatically from the Display Name.\",n9=\"Name\",i9=\"Used to identify the Variant in the exported Resource Pack and Data Pack.\",a9=\"Texture Map\",r9=\"A map of which textures to swap out when applying this Variant.\",o9=\"Create New Mapping\",s9=\"Variant has no mapped textures.\",l9=`Specify which nodes the Variant should affect.\n\nNodes in the included list will be changed when applying the Variant.\n\nNodes in the excluded list will remain unchanged.`,c9=\"Excluded Nodes\",u9=\"A list of nodes to exclude from the Variant. These nodes will remain unchanged when applying the Variant.\",d9=\"Included Nodes\",p9=\"A list of nodes to include in the Variant. Only these nodes will be changed when applying the Variant.\",m9=\"Swap Lists\",f9=\"Update .ajmodel\",h9=\"Update .ajmodel\",g9=\"Select .ajmodel File\",_9=\"Upgrade your outdated .ajmodel files to the new .ajblueprint format.\",x9=\"Select an .ajmodel File to Upgrade\",v9=\"Animation Properties ({0})\",b9=\"Animation Name\",y9=\"The name of the animation.\",w9=\"Loop Mode\",E9=`- Once: The animation will play once, then reset to the first frame.\n- Hold: The animation will play once and hold the last frame.\n- Loop: The animation will loop indefinitely.`,k9=\"Once\",j9=\"Hold\",A9=\"Loop\",T9=\"The animation name cannot be empty!\",C9=\"The animation name contains invalid characters! Animation names should only contain letters, numbers, underscores, and periods.\",S9=\"Loop Delay\",O9=`The number of ticks to wait before restarting the animation when in Loop mode.\n\nE.g. A value of 20 will cause the animation to wait 1 second before restarting.`,I9=`Specify which nodes the animation should affect.\n\nNodes in the included list will be modified by the animation.\n\nNodes in the excluded list will remain unchanged.`,D9=\"Excluded Nodes\",F9=\"A list of nodes to exclude from the animation. These nodes will remain unchanged when applying the animation.\",N9=\"Included Nodes\",R9=\"A list of nodes to include in the animation. Only these nodes will be modified by the animation.\",M9=\"Swap Lists\",B9=\"Exporting...\",P9=\"Loading Blueprint...\",L9=\"Variants\",V9=\"Create New Variant\",z9=\"Edit Variant\",U9=\"Duplicate Selected Variant\",q9=\"Delete Selected Variant\",H9=\"Variant Selected\",J9=\"Variant Not Selected\",G9=\"Cannot delete the default variant!\",W9=\"Cannot edit the default variant!\",K9=\"Create Variant\",Y9=\"Duplicate Variant\",X9=\"Open Variant Config\",Z9=\"Delete Variant\",Q9=\"Excluded Nodes\",$9=\"Invert Excluded Nodes\",eV=\"Variant\",tV=\"Function\",nV=\"Variant\",iV=\"Function\",aV=\"Execute Condition\",rV=\"Repeat\",oV=\"Repeat Frequency\",sV=\"Keyframe ({0})\",lV=\"Variant\",cV=\"The Variant to apply to the keyframe.\",uV=\"Function\",dV=`Commands to run when the keyframe is reached.\n\nTreat this text input as if it were a \\`.mcfunction\\` file.\n\nSupports [MC-Build](https://mcbuild.dev) syntax.`,pV=\"Execute Condition\",mV=\"A condition that must be met for the keyframe to execute.\\n\\nTreat this text input as if it were the condition in an `execute if` command.\\n\\nE.g. `if score @s myScore matches 1..`\",fV=\"Repeat\",hV=\"When enabled, the commands in this keyframe will repeat at the interval specified by Frequency.\",gV=\"Frequency\",_V=`Number of ticks between command repeats.\n\nSet to 1 to run every tick of the animation.`,xV=\"Easing Type\",vV=\"The type of easing to apply to the keyframe.\",bV=\"Linear\",yV=\"Sine\",wV=\"Quad\",EV=\"Cubic\",kV=\"Quart\",jV=\"Quint\",AV=\"Expo\",TV=\"Circ\",CV=\"Elastic\",SV=\"Back\",OV=\"Bounce\",IV=\"Easing Mode\",DV=\"The easing mode to apply to the keyframe.\",FV=\"In\",NV=\"Out\",RV=\"In-Out\",MV=\"Easing Args\",BV=\"The arguments to apply to the easing function.\",PV=\"Elasticity\",LV=\"The elasticity of the easing function.\",VV=\"Overshoot\",zV=\"The amount of overshoot to apply to the easing function.\",UV=\"Bounciness\",qV=\"The bounciness of the easing function.\",HV=`Advanced easing options are disabled.\nChange the keyframe's interpolation mode to 'linear' to enable them.`,JV=\"Text Display\",GV=\"Line Width\",WV=\"The width of the text display in pixels.\",KV=\"Background Color\",YV=\"The color of the background of the text display.\",XV=\"Text Shadow\",ZV=\"Whether or not to display a shadow behind the text.\",QV=\"Text Alignment\",$V=\"The alignment of the text.\",ez=\"Left\",tz=\"Center\",nz=\"Right\",iz=\"See Through\",az=\"Whether or not the text display should be visible through blocks.\",rz=\"Copy exported text component\",oz=\"Copy the exported text component to your clipboard.\",sz=\"Text copied to clipboard!\",lz=\"Displayed Item\",cz=\"The item to display.\",uz=\"Item Display Mode\",dz=\"Which item model transform to apply to the item (as defined in display field in model JSON).\",pz=\"None\",mz=\"Third Person Left Hand\",fz=\"Third Person Right Hand\",hz=\"First Person Left Hand\",gz=\"First Person Right Hand\",_z=\"Head\",xz=\"GUI\",vz=\"Ground\",bz=\"Fixed\",yz=\"Displayed Block\",wz=\"The block to display. Supports block states!\",Ez=\"Item Display\",kz=\"Failed to Export\",jz=\"You have disabled resource pack exporting, but have custom models in your project! Please enable resource pack exporting or remove the custom models before exporting.\",Az=\"There are errors in your blueprint settings! Please fix them before exporting.\",Tz=\"Found an issue with {0}:\",Cz=\"Ok\",Sz=`Some cubes in your model have an invalid rotations!\n\nCubes must have a rotation of -45, -22.5, 0, 22.5, or 45 degrees, and can only be rotated on a single axis at a time when targeting Minecraft versions before 1.21.6.\n\nIf you want to rotate a cube more precisely, or on multiple axes, put it in a bone and rotate the bone instead.\n\nAll of the invalid cubes are outlined in red in the editor. Please fix them before exporting.`,Oz=`Some cubes in your model have an invalid rotations!\n\nCubes can only be rotated on a single axis at a time when targeting Minecraft 1.21.6 or later.\n\nIf you want to rotate a cube on multiple axes, put it in a bone and rotate the bone instead.\n\nAll of the invalid cubes are outlined in red in the editor. Please fix them before exporting.`,Iz=`You have textures applied to your model, but have no custom models (Cubes) to use them!\nPlease create some Cubes to use these textures, or remove the textures before exporting.`,Dz=`You have custom models (Cubes) in your model, but have no textures applied to them!\nPlease apply textures to your Cubes, or remove the Cubes before exporting.`,Fz=`Invalid Cube Rotations!\n\nCubes must have a rotation of: 45, 22.5, 0, -22.5, or -45, and can only be rotated on a single axis at a time.\n\nAll cubes with invalid rotations are outlined in red.`,Nz=`Invalid Cube Rotations!\n\nCubes can only be rotated on a single axis at a time when targeting Minecraft 1.21.6 or later.\n\nAll cubes with invalid rotations are outlined in red.`,Rz=\"Animated Java\",Mz=\"Fluids don't render in Block Displays.\",Bz=\"Mob Heads don't render in Block Displays. Use an Item Display instead.\",Pz='The \"facing\" blockstate key is not supported in Block Displays.',Lz=\"Blueprint Export Path Doesn't Exist\",Vz=`The export path '{0}' does not exist!\n\nMake sure the folder you're saving to exists and try again.`,zz={\"animated_java.menubar.label\":SM,\"animated_java.format.blueprint.name\":OM,\"animated_java.action.open_blueprint_settings.name\":IM,\"animated_java.action.open_documentation.name\":DM,\"animated_java.action.open_changelog.name\":FM,\"animated_java.action.open_about.name\":NM,\"animated_java.action.open_display_entity_config.name\":RM,\"animated_java.action.open_locator_config.name\":MM,\"animated_java.action.export.name\":BM,\"animated_java.action.export_debug.name\":PM,\"animated_java.action.export_all.name\":LM,\"animated_java.action.export_all.description\":VM,\"animated_java.action.export_all_debug.name\":zM,\"animated_java.action.export_all_debug.description\":UM,\"animated_java.action.extract.name\":qM,\"animated_java.action.extract.confirm\":HM,\"animated_java.action.create_text_display.title\":JM,\"animated_java.action.create_vanilla_item_display.title\":GM,\"animated_java.action.create_vanilla_block_display.title\":WM,\"animated_java.action.copy_display_entity_config.name\":KM,\"animated_java.action.copy_display_entity_config.message\":YM,\"animated_java.action.paste_display_entity_config.name\":XM,\"animated_java.action.paste_display_entity_config.message\":ZM,\"animated_java.popup.loading.loading\":QM,\"animated_java.popup.loading.success\":$M,\"animated_java.popup.loading.offline\":eB,\"animated_java.popup.installed_popup.title\":tB,\"animated_java.popup.installed_popup.close_button\":nB,\"animated_java.popup.incompatability_popup.title\":iB,\"animated_java.popup.incompatability_popup.description\":aB,\"animated_java.popup.incompatability_popup.disable_button\":rB,\"animated_java.popup.incompatability_popup.button.disable_all\":oB,\"animated_java.popup.incompatability_popup.button.ignore\":sB,\"animated_java.plugin_dialog.incompatability_notice\":lB,\"animated_java.dialog.reset\":cB,\"animated_java.dialog.about.title\":uB,\"animated_java.dialog.about.close_button\":dB,\"animated_java.dialog.changelog_dialog.title\":pB,\"animated_java.dialog.unexpected_error.title\":mB,\"animated_java.dialog.unexpected_error.close_button\":fB,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":hB,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":gB,\"animated_java.dialog.unexpected_error.paragraph\":_B,\"animated_java.dialog.blueprint_settings.title\":xB,\"animated_java.dialog.blueprint_settings.project_settings.title\":vB,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":bB,\"animated_java.dialog.blueprint_settings.project_name.title\":yB,\"animated_java.dialog.blueprint_settings.project_name.description\":wB,\"animated_java.dialog.blueprint_settings.texture_size.title\":EB,\"animated_java.dialog.blueprint_settings.texture_size.description\":kB,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":jB,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":AB,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":TB,\"animated_java.dialog.blueprint_settings.export_settings.title\":CB,\"animated_java.dialog.blueprint_settings.export_namespace.title\":SB,\"animated_java.dialog.blueprint_settings.export_namespace.description\":OB,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":IB,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":DB,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":FB,\"animated_java.dialog.blueprint_settings.show_render_box.title\":NB,\"animated_java.dialog.blueprint_settings.show_render_box.description\":RB,\"animated_java.dialog.blueprint_settings.auto_render_box.title\":MB,\"animated_java.dialog.blueprint_settings.auto_render_box.description\":BB,\"animated_java.dialog.blueprint_settings.render_box.title\":PB,\"animated_java.dialog.blueprint_settings.render_box.description\":LB,\"animated_java.dialog.blueprint_settings.view_range.title\":VB,\"animated_java.dialog.blueprint_settings.view_range.description\":zB,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":UB,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":qB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":HB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder\":JB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":GB,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":WB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":KB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder\":YB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":XB,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":ZB,\"animated_java.dialog.blueprint_settings.target_minecraft_version.title\":QB,\"animated_java.dialog.blueprint_settings.target_minecraft_version.description\":$B,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":eP,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":tP,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":nP,\"animated_java.dialog.blueprint_settings.display_item.title\":iP,\"animated_java.dialog.blueprint_settings.display_item.description\":aP,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":rP,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":oP,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":sP,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":lP,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":cP,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":uP,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":dP,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":pP,\"animated_java.dialog.blueprint_settings.resource_pack.title\":mP,\"animated_java.dialog.blueprint_settings.resource_pack.description\":fP,\"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder\":hP,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":gP,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":_P,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":xP,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":vP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":bP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":yP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":wP,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":EP,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":kP,\"animated_java.dialog.blueprint_settings.data_pack.title\":jP,\"animated_java.dialog.blueprint_settings.data_pack.description\":AP,\"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder\":TP,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":CP,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":SP,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":OP,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":IP,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":DP,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":FP,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":NP,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":RP,\"animated_java.dialog.blueprint_settings.on_summon_function.title\":MP,\"animated_java.dialog.blueprint_settings.on_summon_function.description\":BP,\"animated_java.dialog.blueprint_settings.on_remove_function.title\":PP,\"animated_java.dialog.blueprint_settings.on_remove_function.description\":LP,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.title\":VP,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.description\":zP,\"animated_java.dialog.blueprint_settings.on_post_tick_function.title\":UP,\"animated_java.dialog.blueprint_settings.on_post_tick_function.description\":qP,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":HP,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":JP,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":GP,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":WP,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title\":KP,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description\":YP,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":XP,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":ZP,\"animated_java.dialog.blueprint_settings.baked_animations.title\":QP,\"animated_java.dialog.blueprint_settings.baked_animations.description\":$P,\"animated_java.dialog.blueprint_settings.json_file.title\":eL,\"animated_java.dialog.blueprint_settings.json_file.description\":tL,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":nL,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":iL,\"animated_java.dialog.display_entity.title\":aL,\"animated_java.dialog.display_entity.node_options.title\":rL,\"animated_java.dialog.display_entity.per_variant_options.title\":oL,\"animated_java.dialog.display_entity.on_summon_function.title\":sL,\"animated_java.dialog.display_entity.on_summon_function.description\":lL,\"animated_java.dialog.display_entity.on_apply_function.title\":cL,\"animated_java.dialog.display_entity.on_apply_function.description\":uL,\"animated_java.dialog.display_entity.custom_name.title\":dL,\"animated_java.dialog.display_entity.custom_name.description\":pL,\"animated_java.dialog.display_entity.custom_name.invalid_json.error\":mL,\"animated_java.dialog.display_entity.custom_name_visible.title\":fL,\"animated_java.dialog.display_entity.custom_name_visible.description\":hL,\"animated_java.dialog.display_entity.glowing.title\":gL,\"animated_java.dialog.display_entity.glowing.description\":_L,\"animated_java.dialog.display_entity.override_glow_color.title\":xL,\"animated_java.dialog.display_entity.override_glow_color.description\":vL,\"animated_java.dialog.display_entity.glow_color.title\":bL,\"animated_java.dialog.display_entity.glow_color.description\":yL,\"animated_java.dialog.display_entity.shadow_radius.title\":wL,\"animated_java.dialog.display_entity.shadow_radius.description\":EL,\"animated_java.dialog.display_entity.shadow_strength.title\":kL,\"animated_java.dialog.display_entity.shadow_strength.description\":jL,\"animated_java.dialog.display_entity.override_brightness.title\":AL,\"animated_java.dialog.display_entity.override_brightness.description\":TL,\"animated_java.dialog.display_entity.brightness_override.title\":CL,\"animated_java.dialog.display_entity.brightness_override.description\":SL,\"animated_java.dialog.display_entity.use_custom_brightness.title\":OL,\"animated_java.dialog.display_entity.use_custom_brightness.description\":IL,\"animated_java.dialog.display_entity.custom_brightness.title\":DL,\"animated_java.dialog.display_entity.custom_brightness.description\":FL,\"animated_java.dialog.display_entity.enchanted.title\":NL,\"animated_java.dialog.display_entity.enchanted.description\":RL,\"animated_java.dialog.display_entity.invisible.title\":ML,\"animated_java.dialog.display_entity.invisible.description\":BL,\"animated_java.dialog.display_entity.billboard.title\":PL,\"animated_java.dialog.display_entity.billboard.description\":LL,\"animated_java.dialog.display_entity.billboard.options.fixed\":VL,\"animated_java.dialog.display_entity.billboard.options.vertical\":zL,\"animated_java.dialog.display_entity.billboard.options.horizontal\":UL,\"animated_java.dialog.display_entity.billboard.options.center\":qL,\"animated_java.dialog.locator_config.title\":HL,\"animated_java.dialog.locator_config.plugin_mode_warning\":JL,\"animated_java.dialog.locator_config.use_entity.title\":GL,\"animated_java.dialog.locator_config.use_entity.description\":WL,\"animated_java.dialog.locator_config.entity_type.title\":KL,\"animated_java.dialog.locator_config.entity_type.description\":YL,\"animated_java.dialog.locator_config.entity_type.error.empty\":XL,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":ZL,\"animated_java.dialog.locator_config.sync_passenger_rotation.title\":QL,\"animated_java.dialog.locator_config.sync_passenger_rotation.description\":$L,\"animated_java.dialog.locator_config.on_summon_function.title\":e7,\"animated_java.dialog.locator_config.on_summon_function.description\":t7,\"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity\":n7,\"animated_java.dialog.locator_config.on_remove_function.title\":i7,\"animated_java.dialog.locator_config.on_remove_function.description\":a7,\"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity\":r7,\"animated_java.dialog.locator_config.on_tick_function.title\":o7,\"animated_java.dialog.locator_config.on_tick_function.description\":s7,\"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity\":l7,\"animated_java.dialog.text_display_config.title\":c7,\"animated_java.dialog.bone_config.vanilla_item_model.title\":u7,\"animated_java.dialog.bone_config.vanilla_item_model.description\":d7,\"animated_java.dialog.text_display_config.use_nbt.title\":p7,\"animated_java.dialog.text_display_config.use_nbt.description\":m7,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":f7,\"animated_java.dialog.text_display_config.inherit_settings.title\":h7,\"animated_java.dialog.text_display_config.inherit_settings.description\":g7,\"animated_java.dialog.text_display_config.glowing.title\":_7,\"animated_java.dialog.text_display_config.glowing.description\":x7,\"animated_java.dialog.text_display_config.override_glow_color.title\":v7,\"animated_java.dialog.text_display_config.override_glow_color.description\":b7,\"animated_java.dialog.text_display_config.glow_color.title\":y7,\"animated_java.dialog.text_display_config.glow_color.description\":w7,\"animated_java.dialog.text_display_config.shadow_radius.title\":E7,\"animated_java.dialog.text_display_config.shadow_radius.description\":k7,\"animated_java.dialog.text_display_config.shadow_strength.title\":j7,\"animated_java.dialog.text_display_config.shadow_strength.description\":A7,\"animated_java.dialog.text_display_config.override_brightness.title\":T7,\"animated_java.dialog.text_display_config.override_brightness.description\":C7,\"animated_java.dialog.text_display_config.brightness_override.title\":S7,\"animated_java.dialog.text_display_config.brightness_override.description\":O7,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":I7,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":D7,\"animated_java.dialog.text_display_config.custom_brightness.title\":F7,\"animated_java.dialog.text_display_config.custom_brightness.description\":N7,\"animated_java.dialog.text_display_config.invisible.title\":R7,\"animated_java.dialog.text_display_config.invisible.description\":M7,\"animated_java.dialog.text_display_config.nbt.title\":B7,\"animated_java.dialog.text_display_config.nbt.description\":P7,\"animated_java.dialog.vanilla_block_display_config.title\":L7,\"animated_java.dialog.vanilla_block_display.custom_name.title\":V7,\"animated_java.dialog.vanilla_block_display.custom_name.description\":z7,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":U7,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":q7,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":H7,\"animated_java.dialog.vanilla_item_display_config.title\":J7,\"animated_java.dialog.vanilla_item_display.custom_name.title\":G7,\"animated_java.dialog.vanilla_item_display.custom_name.description\":W7,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":K7,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":Y7,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":X7,\"animated_java.dialog.variant_config.title\":Z7,\"animated_java.dialog.variant_config.variant_display_name\":Q7,\"animated_java.dialog.variant_config.variant_display_name.description\":$7,\"animated_java.dialog.variant_config.generate_name_from_display_name\":e9,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":t9,\"animated_java.dialog.variant_config.variant_name\":n9,\"animated_java.dialog.variant_config.variant_name.description\":i9,\"animated_java.dialog.variant_config.texture_map.title\":a9,\"animated_java.dialog.variant_config.texture_map.description\":r9,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":o9,\"animated_java.dialog.variant_config.texture_map.no_mappings\":s9,\"animated_java.dialog.variant_config.bone_lists.description\":l9,\"animated_java.dialog.variant_config.excluded_nodes.title\":c9,\"animated_java.dialog.variant_config.excluded_nodes.description\":u9,\"animated_java.dialog.variant_config.included_nodes.title\":d9,\"animated_java.dialog.variant_config.included_nodes.description\":p9,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":m9,\"animated_java.action.upgrade_old_aj_model_loader.name\":f9,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":h9,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":g9,\"animated_java.action.upgrade_old_aj_model_loader.body\":_9,\"animated_java.action.upgrade_old_aj_model_loader.button\":x9,\"animated_java.dialog.animation_properties.title\":v9,\"animated_java.dialog.animation_properties.animation_name.title\":b9,\"animated_java.dialog.animation_properties.animation_name.description\":y9,\"animated_java.dialog.animation_properties.loop_mode.title\":w9,\"animated_java.dialog.animation_properties.loop_mode.description\":E9,\"animated_java.dialog.animation_properties.loop_mode.options.once\":k9,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":j9,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":A9,\"animated_java.dialog.animation_properties.animation_name.error.empty\":T9,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":C9,\"animated_java.dialog.animation_properties.loop_delay.title\":S9,\"animated_java.dialog.animation_properties.loop_delay.description\":O9,\"animated_java.dialog.animation_properties.bone_lists.description\":I9,\"animated_java.dialog.animation_properties.excluded_nodes.title\":D9,\"animated_java.dialog.animation_properties.excluded_nodes.description\":F9,\"animated_java.dialog.animation_properties.included_nodes.title\":N9,\"animated_java.dialog.animation_properties.included_nodes.description\":R9,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":M9,\"animated_java.dialog.export_progress.title\":B9,\"animated_java.dialog.blueprint_loading.title\":P9,\"animated_java.panel.variants.title\":L9,\"animated_java.panel.variants.tool.create_new_variant\":V9,\"animated_java.panel.variants.tool.edit_variant\":z9,\"animated_java.panel.variants.tool.duplicate_selected_variant\":U9,\"animated_java.panel.variants.tool.delete_selected_variant\":q9,\"animated_java.panel.variants.tool.variant_visible\":H9,\"animated_java.panel.variants.tool.variant_not_visible\":J9,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":G9,\"animated_java.panel.variants.tool.cannot_edit_default_variant\":W9,\"animated_java.action.variants.create\":K9,\"animated_java.action.variants.duplicate\":Y9,\"animated_java.action.variants.open_config\":X9,\"animated_java.action.variants.delete\":Z9,\"animated_java.animation.excluded_nodes\":Q9,\"animated_java.animation.invert_excluded_nodes\":$9,\"animated_java.effect_animator.timeline.variant\":eV,\"animated_java.effect_animator.timeline.function\":tV,\"animated_java.effect_animator.keyframe_data_point.variant\":nV,\"animated_java.effect_animator.keyframe_data_point.function\":iV,\"animated_java.effect_animator.keyframe_data_point.execute_condition\":aV,\"animated_java.effect_animator.keyframe_data_point.repeat\":rV,\"animated_java.effect_animator.keyframe_data_point.repeat_frequency\":oV,\"animated_java.panel.keyframe.keyframe_title\":sV,\"animated_java.panel.keyframe.variant.title\":lV,\"animated_java.panel.keyframe.variant.description\":cV,\"animated_java.panel.keyframe.function.title\":uV,\"animated_java.panel.keyframe.function.description\":dV,\"animated_java.panel.keyframe.execute_condition.title\":pV,\"animated_java.panel.keyframe.execute_condition.description\":mV,\"animated_java.panel.keyframe.repeat.title\":fV,\"animated_java.panel.keyframe.repeat.description\":hV,\"animated_java.panel.keyframe.repeat_frequency.title\":gV,\"animated_java.panel.keyframe.repeat_frequency.description\":_V,\"animated_java.panel.keyframe.easing_type.title\":xV,\"animated_java.panel.keyframe.easing_type.description\":vV,\"animated_java.panel.keyframe.easing_type.options.linear\":bV,\"animated_java.panel.keyframe.easing_type.options.sine\":yV,\"animated_java.panel.keyframe.easing_type.options.quad\":wV,\"animated_java.panel.keyframe.easing_type.options.cubic\":EV,\"animated_java.panel.keyframe.easing_type.options.quart\":kV,\"animated_java.panel.keyframe.easing_type.options.quint\":jV,\"animated_java.panel.keyframe.easing_type.options.expo\":AV,\"animated_java.panel.keyframe.easing_type.options.circ\":TV,\"animated_java.panel.keyframe.easing_type.options.elastic\":CV,\"animated_java.panel.keyframe.easing_type.options.back\":SV,\"animated_java.panel.keyframe.easing_type.options.bounce\":OV,\"animated_java.panel.keyframe.easing_mode.title\":IV,\"animated_java.panel.keyframe.easing_mode.description\":DV,\"animated_java.panel.keyframe.easing_mode.options.in\":FV,\"animated_java.panel.keyframe.easing_mode.options.out\":NV,\"animated_java.panel.keyframe.easing_mode.options.inout\":RV,\"animated_java.panel.keyframe.easing_args.title\":MV,\"animated_java.panel.keyframe.easing_args.description\":BV,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":PV,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":LV,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":VV,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":zV,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":UV,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":qV,\"animated_java.panel.keyframe.nonlinear_interpolation\":HV,\"animated_java.panel.text_display.title\":JV,\"animated_java.tool.text_display.line_width.title\":GV,\"animated_java.tool.text_display.line_width.description\":WV,\"animated_java.tool.text_display.background_color.title\":KV,\"animated_java.tool.text_display.background_color.description\":YV,\"animated_java.tool.text_display.text_shadow.title\":XV,\"animated_java.tool.text_display.text_shadow.description\":ZV,\"animated_java.tool.text_display.text_alignment.title\":QV,\"animated_java.tool.text_display.text_alignment.description\":$V,\"animated_java.tool.text_display.text_alignment.options.left\":ez,\"animated_java.tool.text_display.text_alignment.options.center\":tz,\"animated_java.tool.text_display.text_alignment.options.right\":nz,\"animated_java.tool.text_display.see_through.title\":iz,\"animated_java.tool.text_display.see_through.description\":az,\"animated_java.tool.text_display.copy_text.title\":rz,\"animated_java.tool.text_display.copy_text.description\":oz,\"animated_java.tool.text_display.copy_text.copied\":sz,\"animated_java.panel.vanilla_item_display.title\":lz,\"animated_java.panel.vanilla_item_display.description\":cz,\"animated_java.tool.item_display.item_display.title\":uz,\"animated_java.tool.item_display.item_display.description\":dz,\"animated_java.tool.item_display.item_display.options.none\":pz,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":mz,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":fz,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":hz,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":gz,\"animated_java.tool.item_display.item_display.options.head\":_z,\"animated_java.tool.item_display.item_display.options.gui\":xz,\"animated_java.tool.item_display.item_display.options.ground\":vz,\"animated_java.tool.item_display.item_display.options.fixed\":bz,\"animated_java.panel.vanilla_block_display.title\":yz,\"animated_java.panel.vanilla_block_display.description\":wz,\"animated_java.vanilla_item_display.title\":Ez,\"animated_java.misc.failed_to_export.title\":kz,\"animated_java.misc.failed_to_export.custom_models.message\":jz,\"animated_java.misc.failed_to_export.blueprint_settings.message\":Az,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":Tz,\"animated_java.misc.failed_to_export.button\":Cz,\"animated_java.misc.failed_to_export.invalid_rotation.message\":Sz,\"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6\":Oz,\"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message\":Iz,\"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message\":Dz,\"animated_java.toast.invalid_rotations\":Fz,\"animated_java.toast.invalid_rotations_post_1_21_6\":Nz,\"animated_java.format_category.animated_java\":Rz,\"animated_java.block_model_manager.fluid_warning\":Mz,\"animated_java.block_model_manager.mob_head_warning\":Bz,\"animated_java.block_model_manager.facing_warning\":Pz,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":Lz,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":Vz};var jg={};vn(jg,{\"animated_java.action.create_text_display.title\":()=>Yz,\"animated_java.action.create_vanilla_block_display.title\":()=>Zz,\"animated_java.action.create_vanilla_item_display.title\":()=>Xz,\"animated_java.action.export.name\":()=>Kz,\"animated_java.action.open_about.name\":()=>Hz,\"animated_java.action.open_blueprint_settings.name\":()=>Uz,\"animated_java.action.open_bone_config.name\":()=>Jz,\"animated_java.action.open_documentation.name\":()=>qz,\"animated_java.action.open_locator_config.name\":()=>Gz,\"animated_java.action.open_text_display_config.name\":()=>Wz,\"animated_java.action.open_vanilla_block_display_config.name\":()=>$z,\"animated_java.action.open_vanilla_item_display_config.name\":()=>Qz,\"animated_java.action.upgrade_old_aj_model_loader.body\":()=>HJ,\"animated_java.action.upgrade_old_aj_model_loader.button\":()=>JJ,\"animated_java.action.upgrade_old_aj_model_loader.name\":()=>zJ,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":()=>qJ,\"animated_java.action.variants.create\":()=>vG,\"animated_java.action.variants.delete\":()=>wG,\"animated_java.action.variants.duplicate\":()=>bG,\"animated_java.action.variants.open_config\":()=>yG,\"animated_java.animation.excluded_nodes\":()=>EG,\"animated_java.animation.invert_excluded_nodes\":()=>kG,\"animated_java.block_model_manager.mob_head_warning\":()=>MW,\"animated_java.dialog.about.close_button\":()=>aU,\"animated_java.dialog.about.title\":()=>iU,\"animated_java.dialog.animation_properties.animation_name.description\":()=>KJ,\"animated_java.dialog.animation_properties.animation_name.error.empty\":()=>eG,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":()=>tG,\"animated_java.dialog.animation_properties.animation_name.title\":()=>WJ,\"animated_java.dialog.animation_properties.bone_lists.description\":()=>aG,\"animated_java.dialog.animation_properties.excluded_nodes.description\":()=>oG,\"animated_java.dialog.animation_properties.excluded_nodes.title\":()=>rG,\"animated_java.dialog.animation_properties.included_nodes.description\":()=>lG,\"animated_java.dialog.animation_properties.included_nodes.title\":()=>sG,\"animated_java.dialog.animation_properties.loop_delay.description\":()=>iG,\"animated_java.dialog.animation_properties.loop_delay.title\":()=>nG,\"animated_java.dialog.animation_properties.loop_mode.description\":()=>XJ,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":()=>QJ,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":()=>$J,\"animated_java.dialog.animation_properties.loop_mode.options.once\":()=>ZJ,\"animated_java.dialog.animation_properties.loop_mode.title\":()=>YJ,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":()=>cG,\"animated_java.dialog.animation_properties.title\":()=>GJ,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":()=>fq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":()=>mq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":()=>hq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description\":()=>_q,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":()=>vq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":()=>xq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":()=>bq,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":()=>dU,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":()=>VU,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":()=>LU,\"animated_java.dialog.blueprint_settings.baked_animations.description\":()=>Gq,\"animated_java.dialog.blueprint_settings.baked_animations.title\":()=>Jq,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":()=>mU,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":()=>pU,\"animated_java.dialog.blueprint_settings.bounding_box.description\":()=>UU,\"animated_java.dialog.blueprint_settings.bounding_box.title\":()=>zU,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":()=>$U,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":()=>QU,\"animated_java.dialog.blueprint_settings.data_pack.description\":()=>Tq,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":()=>Sq,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":()=>Dq,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":()=>Iq,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":()=>Cq,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":()=>Oq,\"animated_java.dialog.blueprint_settings.data_pack.title\":()=>Aq,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":()=>FU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":()=>MU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":()=>NU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":()=>RU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":()=>DU,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":()=>Eq,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":()=>Nq,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":()=>Rq,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":()=>Mq,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":()=>Fq,\"animated_java.dialog.blueprint_settings.display_item.description\":()=>WU,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":()=>YU,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":()=>XU,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":()=>KU,\"animated_java.dialog.blueprint_settings.display_item.title\":()=>GU,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":()=>ZU,\"animated_java.dialog.blueprint_settings.display_item_path.description\":()=>pq,\"animated_java.dialog.blueprint_settings.display_item_path.title\":()=>dq,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":()=>jq,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":()=>kq,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":()=>JU,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":()=>HU,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":()=>AU,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":()=>jU,\"animated_java.dialog.blueprint_settings.export_namespace.description\":()=>yU,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":()=>wU,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":()=>kU,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":()=>EU,\"animated_java.dialog.blueprint_settings.export_namespace.title\":()=>bU,\"animated_java.dialog.blueprint_settings.export_settings.title\":()=>vU,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":()=>Vq,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":()=>Lq,\"animated_java.dialog.blueprint_settings.json_file.description\":()=>Kq,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":()=>Yq,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":()=>Xq,\"animated_java.dialog.blueprint_settings.json_file.title\":()=>Wq,\"animated_java.dialog.blueprint_settings.model_folder.title\":()=>gq,\"animated_java.dialog.blueprint_settings.resource_pack.description\":()=>tq,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":()=>iq,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":()=>oq,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":()=>rq,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":()=>nq,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":()=>aq,\"animated_java.dialog.blueprint_settings.resource_pack.title\":()=>eq,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":()=>CU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":()=>IU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":()=>SU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":()=>OU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":()=>TU,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":()=>qU,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":()=>lq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":()=>cq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":()=>uq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":()=>sq,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":()=>PU,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":()=>BU,\"animated_java.dialog.blueprint_settings.summon_commands.description\":()=>Pq,\"animated_java.dialog.blueprint_settings.summon_commands.title\":()=>Bq,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":()=>Uq,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":()=>zq,\"animated_java.dialog.blueprint_settings.texture_folder.description\":()=>wq,\"animated_java.dialog.blueprint_settings.texture_folder.title\":()=>yq,\"animated_java.dialog.blueprint_settings.texture_size.description\":()=>hU,\"animated_java.dialog.blueprint_settings.texture_size.title\":()=>fU,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":()=>xU,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":()=>_U,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":()=>gU,\"animated_java.dialog.blueprint_settings.title\":()=>uU,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":()=>Hq,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":()=>qq,\"animated_java.dialog.bone_config.billboard.description\":()=>SH,\"animated_java.dialog.bone_config.billboard.options.center\":()=>FH,\"animated_java.dialog.bone_config.billboard.options.fixed\":()=>OH,\"animated_java.dialog.bone_config.billboard.options.horizontal\":()=>DH,\"animated_java.dialog.bone_config.billboard.options.vertical\":()=>IH,\"animated_java.dialog.bone_config.billboard.title\":()=>CH,\"animated_java.dialog.bone_config.brightness_override.description\":()=>vH,\"animated_java.dialog.bone_config.brightness_override.title\":()=>xH,\"animated_java.dialog.bone_config.default_variant_subtitle\":()=>$q,\"animated_java.dialog.bone_config.enchanted.description\":()=>yH,\"animated_java.dialog.bone_config.enchanted.title\":()=>bH,\"animated_java.dialog.bone_config.glow_color.description\":()=>dH,\"animated_java.dialog.bone_config.glow_color.title\":()=>uH,\"animated_java.dialog.bone_config.glowing.description\":()=>sH,\"animated_java.dialog.bone_config.glowing.title\":()=>oH,\"animated_java.dialog.bone_config.inherit_settings.description\":()=>rH,\"animated_java.dialog.bone_config.inherit_settings.title\":()=>aH,\"animated_java.dialog.bone_config.invisible.description\":()=>EH,\"animated_java.dialog.bone_config.invisible.title\":()=>wH,\"animated_java.dialog.bone_config.nbt.description\":()=>jH,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":()=>TH,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":()=>AH,\"animated_java.dialog.bone_config.nbt.title\":()=>kH,\"animated_java.dialog.bone_config.override_brightness.description\":()=>_H,\"animated_java.dialog.bone_config.override_brightness.title\":()=>gH,\"animated_java.dialog.bone_config.override_glow_color.description\":()=>cH,\"animated_java.dialog.bone_config.override_glow_color.title\":()=>lH,\"animated_java.dialog.bone_config.selected_variant\":()=>Qq,\"animated_java.dialog.bone_config.selected_variant_subtitle\":()=>eH,\"animated_java.dialog.bone_config.shadow_radius.description\":()=>mH,\"animated_java.dialog.bone_config.shadow_radius.title\":()=>pH,\"animated_java.dialog.bone_config.shadow_strength.description\":()=>hH,\"animated_java.dialog.bone_config.shadow_strength.title\":()=>fH,\"animated_java.dialog.bone_config.title\":()=>Zq,\"animated_java.dialog.bone_config.use_nbt.description\":()=>nH,\"animated_java.dialog.bone_config.use_nbt.title\":()=>tH,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":()=>iH,\"animated_java.dialog.bone_config.vanilla_item_model.description\":()=>KH,\"animated_java.dialog.bone_config.vanilla_item_model.title\":()=>WH,\"animated_java.dialog.export_progress.title\":()=>uG,\"animated_java.dialog.locator_config.entity_type.description\":()=>LH,\"animated_java.dialog.locator_config.entity_type.error.empty\":()=>VH,\"animated_java.dialog.locator_config.entity_type.title\":()=>PH,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":()=>zH,\"animated_java.dialog.locator_config.plugin_mode_warning\":()=>RH,\"animated_java.dialog.locator_config.summon_commands.description\":()=>qH,\"animated_java.dialog.locator_config.summon_commands.title\":()=>UH,\"animated_java.dialog.locator_config.ticking_commands.description\":()=>JH,\"animated_java.dialog.locator_config.ticking_commands.title\":()=>HH,\"animated_java.dialog.locator_config.title\":()=>NH,\"animated_java.dialog.locator_config.use_entity.description\":()=>BH,\"animated_java.dialog.locator_config.use_entity.title\":()=>MH,\"animated_java.dialog.text_display_config.billboard.description\":()=>vJ,\"animated_java.dialog.text_display_config.billboard.options.center\":()=>EJ,\"animated_java.dialog.text_display_config.billboard.options.fixed\":()=>bJ,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":()=>wJ,\"animated_java.dialog.text_display_config.billboard.options.vertical\":()=>yJ,\"animated_java.dialog.text_display_config.billboard.title\":()=>xJ,\"animated_java.dialog.text_display_config.brightness_override.description\":()=>mJ,\"animated_java.dialog.text_display_config.brightness_override.title\":()=>pJ,\"animated_java.dialog.text_display_config.glow_color.description\":()=>rJ,\"animated_java.dialog.text_display_config.glow_color.title\":()=>aJ,\"animated_java.dialog.text_display_config.glowing.description\":()=>tJ,\"animated_java.dialog.text_display_config.glowing.title\":()=>eJ,\"animated_java.dialog.text_display_config.inherit_settings.description\":()=>$H,\"animated_java.dialog.text_display_config.inherit_settings.title\":()=>QH,\"animated_java.dialog.text_display_config.invisible.description\":()=>hJ,\"animated_java.dialog.text_display_config.invisible.title\":()=>fJ,\"animated_java.dialog.text_display_config.nbt.description\":()=>_J,\"animated_java.dialog.text_display_config.nbt.title\":()=>gJ,\"animated_java.dialog.text_display_config.override_brightness.description\":()=>dJ,\"animated_java.dialog.text_display_config.override_brightness.title\":()=>uJ,\"animated_java.dialog.text_display_config.override_glow_color.description\":()=>iJ,\"animated_java.dialog.text_display_config.override_glow_color.title\":()=>nJ,\"animated_java.dialog.text_display_config.shadow_radius.description\":()=>sJ,\"animated_java.dialog.text_display_config.shadow_radius.title\":()=>oJ,\"animated_java.dialog.text_display_config.shadow_strength.description\":()=>cJ,\"animated_java.dialog.text_display_config.shadow_strength.title\":()=>lJ,\"animated_java.dialog.text_display_config.title\":()=>GH,\"animated_java.dialog.text_display_config.use_nbt.description\":()=>XH,\"animated_java.dialog.text_display_config.use_nbt.title\":()=>YH,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":()=>ZH,\"animated_java.dialog.unexpected_error.close_button\":()=>oU,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":()=>lU,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":()=>sU,\"animated_java.dialog.unexpected_error.paragraph\":()=>cU,\"animated_java.dialog.unexpected_error.title\":()=>rU,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":()=>UJ,\"animated_java.dialog.variant_config.bone_lists.description\":()=>RJ,\"animated_java.dialog.variant_config.excluded_nodes.description\":()=>BJ,\"animated_java.dialog.variant_config.excluded_nodes.title\":()=>MJ,\"animated_java.dialog.variant_config.generate_name_from_display_name\":()=>TJ,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":()=>CJ,\"animated_java.dialog.variant_config.included_nodes.description\":()=>LJ,\"animated_java.dialog.variant_config.included_nodes.title\":()=>PJ,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":()=>VJ,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":()=>FJ,\"animated_java.dialog.variant_config.texture_map.description\":()=>DJ,\"animated_java.dialog.variant_config.texture_map.no_mappings\":()=>NJ,\"animated_java.dialog.variant_config.texture_map.title\":()=>IJ,\"animated_java.dialog.variant_config.title\":()=>kJ,\"animated_java.dialog.variant_config.variant_display_name\":()=>jJ,\"animated_java.dialog.variant_config.variant_display_name.description\":()=>AJ,\"animated_java.dialog.variant_config.variant_name\":()=>SJ,\"animated_java.dialog.variant_config.variant_name.description\":()=>OJ,\"animated_java.effect_animator.keyframes.commands\":()=>CG,\"animated_java.effect_animator.keyframes.execute_condition\":()=>SG,\"animated_java.effect_animator.keyframes.variant\":()=>TG,\"animated_java.effect_animator.timeline.commands\":()=>AG,\"animated_java.effect_animator.timeline.variant\":()=>jG,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":()=>PW,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":()=>BW,\"animated_java.format_category.animated_java\":()=>RW,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":()=>FW,\"animated_java.misc.failed_to_export.blueprint_settings.message\":()=>DW,\"animated_java.misc.failed_to_export.button\":()=>NW,\"animated_java.misc.failed_to_export.custom_models.message\":()=>IW,\"animated_java.misc.failed_to_export.title\":()=>OW,\"animated_java.panel.keyframe.commands.description\":()=>NG,\"animated_java.panel.keyframe.commands.title\":()=>FG,\"animated_java.panel.keyframe.easing_args.description\":()=>oW,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":()=>uW,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":()=>cW,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":()=>pW,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":()=>dW,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":()=>lW,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":()=>sW,\"animated_java.panel.keyframe.easing_args.title\":()=>rW,\"animated_java.panel.keyframe.easing_mode.description\":()=>tW,\"animated_java.panel.keyframe.easing_mode.options.in\":()=>nW,\"animated_java.panel.keyframe.easing_mode.options.inout\":()=>aW,\"animated_java.panel.keyframe.easing_mode.options.out\":()=>iW,\"animated_java.panel.keyframe.easing_mode.title\":()=>eW,\"animated_java.panel.keyframe.easing_type.description\":()=>UG,\"animated_java.panel.keyframe.easing_type.options.back\":()=>QG,\"animated_java.panel.keyframe.easing_type.options.bounce\":()=>$G,\"animated_java.panel.keyframe.easing_type.options.circ\":()=>XG,\"animated_java.panel.keyframe.easing_type.options.cubic\":()=>GG,\"animated_java.panel.keyframe.easing_type.options.elastic\":()=>ZG,\"animated_java.panel.keyframe.easing_type.options.expo\":()=>YG,\"animated_java.panel.keyframe.easing_type.options.linear\":()=>qG,\"animated_java.panel.keyframe.easing_type.options.quad\":()=>JG,\"animated_java.panel.keyframe.easing_type.options.quart\":()=>WG,\"animated_java.panel.keyframe.easing_type.options.quint\":()=>KG,\"animated_java.panel.keyframe.easing_type.options.sine\":()=>HG,\"animated_java.panel.keyframe.easing_type.title\":()=>zG,\"animated_java.panel.keyframe.execute_condition.description\":()=>MG,\"animated_java.panel.keyframe.execute_condition.title\":()=>RG,\"animated_java.panel.keyframe.keyframe_title\":()=>OG,\"animated_java.panel.keyframe.repeat.description\":()=>PG,\"animated_java.panel.keyframe.repeat.title\":()=>BG,\"animated_java.panel.keyframe.repeat_frequency.description\":()=>VG,\"animated_java.panel.keyframe.repeat_frequency.title\":()=>LG,\"animated_java.panel.keyframe.variant.description\":()=>DG,\"animated_java.panel.keyframe.variant.title\":()=>IG,\"animated_java.panel.text_display.title\":()=>mW,\"animated_java.panel.vanilla_block_display.description\":()=>CW,\"animated_java.panel.vanilla_block_display.title\":()=>TW,\"animated_java.panel.vanilla_item_display.description\":()=>AW,\"animated_java.panel.vanilla_item_display.title\":()=>jW,\"animated_java.panel.variants.title\":()=>dG,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":()=>xG,\"animated_java.panel.variants.tool.create_new_variant\":()=>pG,\"animated_java.panel.variants.tool.delete_selected_variant\":()=>hG,\"animated_java.panel.variants.tool.duplicate_selected_variant\":()=>fG,\"animated_java.panel.variants.tool.edit_variant\":()=>mG,\"animated_java.panel.variants.tool.variant_not_visible\":()=>_G,\"animated_java.panel.variants.tool.variant_visible\":()=>gG,\"animated_java.popup.loading.loading\":()=>eU,\"animated_java.popup.loading.offline\":()=>nU,\"animated_java.popup.loading.success\":()=>tU,\"animated_java.tool.text_display.background_color.description\":()=>_W,\"animated_java.tool.text_display.background_color.title\":()=>gW,\"animated_java.tool.text_display.line_width.description\":()=>hW,\"animated_java.tool.text_display.line_width.title\":()=>fW,\"animated_java.tool.text_display.text_alignment.description\":()=>yW,\"animated_java.tool.text_display.text_alignment.options.center\":()=>EW,\"animated_java.tool.text_display.text_alignment.options.left\":()=>wW,\"animated_java.tool.text_display.text_alignment.options.right\":()=>kW,\"animated_java.tool.text_display.text_alignment.title\":()=>bW,\"animated_java.tool.text_display.text_shadow.description\":()=>vW,\"animated_java.tool.text_display.text_shadow.title\":()=>xW,\"animated_java.vanilla_item_display.title\":()=>SW,default:()=>LW});var Uz=\"Blauwdruk Instellingen\",qz=\"Documentatie\",Hz=\"Over\",Jz=\"Bot Configuratie\",Gz=\"Locator Configuratie\",Wz=\"Tekstweergave Configuratie\",Kz=\"Exporteren\",Yz=\"Voeg Tekstweergave toe\",Xz=\"Voeg Vanilla Voorwerpweergave toe\",Zz=\"Voeg Vanilla Blokweergave toe\",Qz=\"Vanilla Voorwerpweergave Configuratie\",$z=\"Vanilla Blokweergave Configuratie\",eU=\"Animated Java Laden...\",tU=\"Animated Java succesvol geladen!\",nU=`Animated Java Kon niet Verbinden!\nSommige functies zijn mogelijk niet beschikbaar.`,iU=\"Over Animated Java\",aU=\"Sluiten\",rU=\"Er Is Een Onverwachte Fout Opgetreden!\",oU=\"Sluiten\",sU=\"Foutmelding Gekopieerd naar klembord!\",lU=\"Klik op om de foutmelding naar het klembord te kopi\\xEBren.\",cU=\"Meld deze fout door lid te worden van onze {0} en een thread te maken in het #animated-java-support kanaal, of door een probleem aan te maken op onze {1}. Bedankt!\",uU=\"Blauwdruk Instellingen\",dU=\"Geavanceerde instellingen moeten alleen worden gebruikt als het echt nodig is!\",pU=\"Blauwdruk Naam\",mU=\"De naam van de Blauwdruk. Wordt alleen gebruikt om het project in de werkruimte te identificeren.\",fU=\"Textuurgrootte\",hU=\"De resolutie van de UV-editor. Deze moet dezelfde grootte hebben als de grootste textuur. Voor het beste resultaat gebruik je een vierkante textuur en zorg je ervoor dat de grootte een macht van 2 is.\",gU=\"De Textuurgrootte moet vierkant zijn voor de beste resultaten.\",_U=\"De Textuurgrootte moet een macht van 2 zijn voor de beste resultaten.\",xU=\"De Textuurgrootte moet overeenkomen met de grootte van de grootste textuur.\",vU=\"Exportinstellingen\",bU=\"Export Namespace\",yU=\"De Namespace om het project naar te exporteren. Dit is de Namespace die zal worden gebruikt in de ge\\xEBxporteerde Resource Pack en Data Pack.\",wU=\"De export namespace Mag niet leeg zijn!\",EU='De export namespace \"{0}\" is gereserveerd voor interne functionaliteit! Kies een andere namespace.',kU=\"De export namespace bevat ongeldige tekens! Namespaces kunnen alleen letters, cijfers en underscores bevatten.\",jU=\"Plugin-Modus\",AU=\"Plugin-modus wel of niet inschakelen. Inschakelen als je van plan bent om een plugin-gebaseerde oplossing te gebruiken in plaats van een Resource Pack en/of Data Pack.\",TU=\"Resource Pack Export Modus\",CU=`Bepaalt hoe de Resource Pack moet worden ge\\xEBxporteerd.\nRaw - Exporteert de Resource Pack als een map.\nZip - Exporteert de Resource Pack als een .zip bestand.\nNone - Schakelt het exporteren van Resource Packs uit.`,SU=\"Raw\",OU=\"Zip\",IU=\"None\",DU=\"Data Pack Export Modus\",FU=`Bepaalt hoe de Data Pack moet worden ge\\xEBxporteerd.\nRaw - Exporteert de Data Pack als een map.\nZip - Exporteert de Data Pack als een .zip bestand.\nNone - Schakelt het exporteren van Data Packs uit.`,NU=\"Raw\",RU=\"Zip\",MU=\"None\",BU=\"Toon Bounding Box\",PU=\"Of de bounding box wel of niet moet worden weergegeven in de editor.\",LU=\"Auto Bounding Box\",VU=`Wel of niet automatisch de bounding box berekenen op basis van de geometrie van het model.\nOPMERKING: de automatische bounding box houdt GEEN rekening met botoffsets van animaties, dus de bounding box kan in sommige gevallen kleiner zijn dan nodig.`,zU=\"Bounding Box\",UU=\"Bepaalt de culling box van het model. Het model stopt met renderen wanneer deze box buiten het scherm valt.\",qU=\"Resource Pack Instellingen\",HU=\"Geavanceerde Instellingen Gebruiken\",JU=\"Of de geavanceerde instellingen voor Resource Packs wel of niet moeten worden ingeschakeld.\",GU=\"Weergave Voorwerp\",WU=\"Het voorwerp om de Blauwdruk-modellen in het spel weer te geven. Meerdere Blauwdrukken kunnen op hetzelfde voorwerp worden geplaatst en ze worden automatisch samengevoegd.\",KU=\"Geen voorwerp geselecteerd!\",YU=\"Het opgegeven voorwerp-ID is ongeldig! Voorwerp ID's moeten het formaat namespace:voorwerp_id hebben.\",XU=\"Het opgegeven voorwerp-ID is ongeldig! Voorwerp ID's mogen geen spaties bevatten.\",ZU=\"Het geselecteerde voorwerp bestaat niet in vanilla!\",QU=\"CMD Offset\",$U=\"De offset die moet worden gebruikt voor de Custom Model Data van het weergave voorwerp. Staat meerdere blauwdrukken op hetzelfde voorwerp toe, maar in afzonderlijke, niet-aangesloten Resource Packs.\",eq=\"Resource Pack\",tq=\"De hoofdmap van de Resource Pack waarnaar het project moet worden ge\\xEBxporteerd.\",nq=\"Geen map geselecteerd!\",iq=\"De geselecteerde map bestaat niet!\",aq=\"Het geselecteerde pad is geen map!\",rq=\"De geselecteerde map mist een pack.mcmeta bestand!\",oq=\"De geselecteerde Resource Pack mist een assets map!\",sq=\"Resource Pack Zip\",lq=\"Het pad naar het .zip-bestand om het project naar te exporteren.\",cq=\"Geen bestand geselecteerd!\",uq=\"Het geselecteerde pad is geen bestand!\",dq=\"Display Item Pad\",pq=\"Waar het Weergave Voorwerp moet worden geplaatst. Dit moet een pad zijn naar een .json bestand in een Resource Pack.\",mq=\"Geen bestand geselecteerd!\",fq=\"Het geselecteerde bestand bestaat niet!\",hq=\"Het geselecteerde pad is geen bestand!\",gq=\"Model Map\",_q=\"Waar alle ge\\xEBxporteerde modellen moeten worden geplaatst. Dit moet een pad zijn naar een map in een Resource Pack.\",xq=\"Geen map geselecteerd!\",vq=\"De geselecteerde map bestaat niet!\",bq=\"Het geselecteerde pad is geen map!\",yq=\"Textuur Map\",wq=\"Waar alle ge\\xEBxporteerde texturen moeten worden geplaatst. Dit moet een pad zijn naar een map in een Resource Pack.\",Eq=\"Data Pack Instellingen\",kq=\"Geavanceerde Instellingen Gebruiken\",jq=\"Of de geavanceerde instellingen voor Data Packs wel of niet moeten worden ingeschakeld.\",Aq=\"Data Pack\",Tq=\"De hoofdmap van de Data Pack waarnaar het project moet worden ge\\xEBxporteerd.\",Cq=\"Geen map geselecteerd!\",Sq=\"De geselecteerde map bestaat niet!\",Oq=\"Het geselecteerde pad is geen map!\",Iq=\"De geselecteerde map mist een pack.mcmeta bestand!\",Dq=\"De geselecteerde Data Pack mist een data map!\",Fq=\"Data Pack Zip\",Nq=\"Het pad naar het .zip-bestand om het project naar te exporteren.\",Rq=\"Geen bestand geselecteerd!\",Mq=\"Het geselecteerde pad is geen bestand!\",Bq=\"On-Summon Commando's\",Pq=`Commando's om uit te voeren als de hoofdentiteit wanneer deze wordt opgeroepen.\nBehandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,Lq=\"Interpolatie Duratie\",Vq=\"De duur van de interpolatie tussen keyframes in ticks. Dit is de tijd die het model nodig heeft om over te gaan van de ene keyframe naar de volgende. Hogere waarden zorgen ervoor dat animaties precisie verliezen. Over het algemeen wil je dat dit een waarde van 1 of 2 heeft.\",zq=\"Teleportatie Duratie\",Uq=\"De duur van de teleportatie tussen keyframes in ticks. Dit is de tijd waarover het model visueel zal interpoleren tussen zijn oude positie en zijn nieuwe positie. Hogere waarden zorgen ervoor dat animaties precisie verliezen.\",qq=\"Opslag gebruiken voor animatie\",Hq=`Wel of geen NBT-opslag gebruiken om animatiegegevens op te slaan in plaats van functies.\nDit vermindert het aantal functies in het gegenereerde Data Pack enorm, maar is 42% langzamer dan de functiemethode.`,Jq=\"Gebakken Animaties\",Gq=`De ge\\xEBxporteerde animaties al dan niet bakken.\nBij gebakken animaties worden de frames vooraf berekend en opgeslagen in het ge\\xEBxporteerde JSON-bestand, waardoor het minder complex wordt om het model in de game te renderen.\nSommige Plugins vereisen dat dit is ingeschakeld om correct te functioneren.`,Wq=\"JSON Bestand\",Kq=\"Het pad naar het JSON bestand om het project naar te exporteren.\",Yq=\"Geen bestand geselecteerd!\",Xq=\"Het geselecteerde pad is geen bestand!\",Zq=\"Bot Configuratie\",Qq=\"Geselecteerde Variant: {0}\",$q=\"De onderstaande instellingen worden standaard toegepast op dit bot.\",eH=\"De onderstaande instellingen worden alleen op dit bot toegepast wanneer deze variant wordt toegepast.\",tH=\"Gebruik NBT\",nH=\"Of NBT al dan niet moet worden gebruikt om de bot te configureren in plaats van instellingen.\",iH=\"Als je NBT gebruikt, worden alle andere instellingen overschreven en zijn wijzigingen die je maakt niet zichtbaar in de editor. Gebruik dit alleen als je weet wat je doet!\",aH=\"Instellingen Overnemen\",rH=\"Of de instellingen wel of niet moeten worden overgenomen van het parent-bot.\",oH=\"Gloeien\",sH=\"Of het bot wel of niet moet gloeien in het spel.\",lH=\"Overschrijf Gloed Kleur\",cH=\"Of de standaard gloed kleur wel of niet moet worden overschreven.\",uH=\"Gloed Kleur\",dH=\"De kleur van de gloed.\",pH=\"Schaduw Straal\",mH=\"De straal van de schaduw.\",fH=\"Schaduw Sterkte\",hH=\"De sterkte van de schaduw.\",gH=\"Overschrijf Helderheid\",_H=\"Of de standaard helderheid wel of niet moet worden overschreven.\",xH=\"Helderheid\",vH=\"De helderheid van het bot. Dit moet een waarde tussen 0 en 15 zijn.\",bH=\"Betoverd\",yH=\"Of het bot wel of niet betoverd moet worden.\",wH=\"Onzichtbaar\",EH=\"Of het bot wel of niet onzichtbaar moet worden.\",kH=\"NBT\",jH=\"De NBT die op het bot moet worden toegepast.\",AH=`De NBT moet een compound tag zijn! Bijv. {CustomName:'\"mijn naam\"'}`,TH=`Ongeldige NBT!\n{0}`,CH=\"Billboard\",SH=\"Bepaalt of dit bot naar de speler moet draaien wanneer het wordt weergegeven. Het kan vast zijn (draait niet met de speler mee), verticaal (draait met de speler mee rond verticale as), horizontaal (draait rond horizontale as) en midden (draait rond middelpunt).\",OH=\"Vast\",IH=\"Verticaal\",DH=\"Horizontaal\",FH=\"Midden\",NH=\"Locator Configuratie\",RH=`Plugin-Modus is ingeschakeld! Locators hebben geen configuratie in Plugin-Modus.\nGebruik in plaats daarvan de Plugin API om aangepaste functionaliteit aan je Locators toe te voegen.\nRaadpleeg voor meer informatie de offici\\xEBle Plugin API documentatie.`,MH=\"Gebruik Entiteit\",BH=\"Of er al dan niet een entiteit aan de Locator moet worden gekoppeld.\",PH=\"Type Entiteit\",LH=\"Het type entiteit dat aan de Locator moet worden gekoppeld.\",VH=\"Type Entiteit mag niet leeg zijn!\",zH=\"Het geselecteerde entiteit-type bestaat niet in Minecraft {0}\",UH=\"On-Summon Commando's\",qH=`Commando's om als entiteit van de Locator uit te voeren wanneer deze wordt opgeroepen.\nBehandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,HH=\"Ticking Commands\",JH=`Opdrachten om elke tick uit te voeren op de positie van de Locator.\nBehandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,GH=\"Tekstweergave Configuratie\",WH=\"Vanilla Voorwerp Model\",KH=`Als dit is ingesteld, wordt het bot weergegeven als een vanilla voorwerp model.\nHierdoor worden de bestaande kubussen van het bot overschreven.`,YH=\"Gebruik NBT\",XH=\"Of NBT al dan niet moet worden gebruikt om de tekstweergave te configureren in plaats van instellingen.\",ZH=\"Als je NBT gebruikt, worden alle andere instellingen overschreven en zijn wijzigingen die je maakt niet zichtbaar in de editor. Gebruik dit alleen als je weet wat je doet!\",QH=\"Instellingen Overnemen\",$H=\"Of de instellingen wel of niet moeten worden overgenomen van de parent-tekstweergave.\",eJ=\"Gloeien\",tJ=\"Of het bot wel of niet moet gloeien in het spel.\",nJ=\"Overschrijf Gloed Kleur\",iJ=\"Of de standaard gloed kleur wel of niet moet worden overschreven.\",aJ=\"Gloed Kleur\",rJ=\"De kleur van de gloed.\",oJ=\"Schaduw Straal\",sJ=\"De straal van de schaduw.\",lJ=\"Schaduw Sterkte\",cJ=\"De sterke van de schaduw.\",uJ=\"Overschrijf Helderheid\",dJ=\"Of de standaard helderheid wel of niet moet worden overschreven.\",pJ=\"Helderheid\",mJ=\"De helderheid van het bot. Dit moet een waarde tussen 0 en 15 zijn.\",fJ=\"Onzichtbaar\",hJ=\"Of de tekstweergave wel of niet onzichtbaar moet worden.\",gJ=\"NBT\",_J=\"De NBT die op de tekstweergave moet worden toegepast.\",xJ=\"Billboard\",vJ=\"Bepaalt of dit bot naar de speler moet draaien wanneer het wordt weergegeven. Het kan vast zijn (draait niet met de speler mee), verticaal (draait met de speler mee rond verticale as), horizontaal (draait rond horizontale as) en midden (draait rond middelpunt).\",bJ=\"Vast\",yJ=\"Verticaal\",wJ=\"Horizontaal\",EJ=\"Midden\",kJ=\"Variant Configuratie\",jJ=\"Weergavenaam\",AJ=\"Wordt gebruikt om de variant te identificeren in de editor en in foutmeldingen.\",TJ=\"Genereer Naam uit Weergavenaam\",CJ=\"Of de Naam al dan niet automatisch moet worden gegenereerd uit de Weergavenaam.\",SJ=\"Naam\",OJ=\"Wordt gebruikt om de variant in de ge\\xEBxporteerde Resource Pack en Data Pack te identificeren.\",IJ=\"Textuur Map\",DJ=\"Een map van welke texturen moeten worden verwisseld bij het toepassen van deze variant.\",FJ=\"Nieuwe Mapping Maken\",NJ=\"Variant heeft geen in kaart gebrachte texturen.\",RJ=\"Een lijst met nodes die wel of niet worden meegenomen in de Variant. Alleen nodes in de ge\\xEFncludeerde lijst worden gewijzigd door de Variant, en nodes in de uitgesloten lijst worden genegeerd.\",MJ=\"Uitgelosten Nodes\",BJ=\"Een lijst met nodes die uitgesloten moeten worden van de Variant. Deze nodes worden niet gewijzigd door de Variant.\",PJ=\"Inbegrepen Nodes\",LJ=\"Een lijst met nodes die in de Variant moeten worden opgenomen. Alleen deze nodes worden gewijzigd door de Variant.\",VJ=\"Lijsten Omwisselen\",zJ=\"Update .ajmodel\",UJ=\"Update .ajmodel\",qJ=\"Selecteeer .ajmodel Bestand\",HJ=\"Upgrade je verouderde .ajmodel bestanden naar het nieuwe .ajblueprint formaat.\",JJ=\"Selecteer een .ajmodel Bestand om te upgraden\",GJ=\"Animatie Eigenschappen ({0})\",WJ=\"Animatie Naam\",KJ=\"De naam van de animatie.\",YJ=\"Lus Modus\",XJ=\"Bepaalt hoe de animatie moet worden herhaald. Eenmaal - De animatie wordt eenmaal afgespeeld en stopt dan. Houden - De animatie wordt eenmaal afgespeeld en het laatste frame wordt vastgehouden. Lus - De animatie wordt oneindig herhaald.\",ZJ=\"Eenmaal\",QJ=\"Houden\",$J=\"Lus\",eG=\"De naam van de animatie kan niet leeg zijn!\",tG=\"De naam van de animatie bevat ongeldige tekens! Animatie namen mogen alleen letters, cijfers, underscores en punten bevatten.\",nG=\"Lus Vertraging\",iG=\"De vertraging tussen lussen. Dit is de tijd dat de animatie pauzeert voor hij opnieuw begint. Dit wordt alleen gebruikt als de Lus Modus is ingesteld op Lus.\",aG=\"Een lijst van nodes die wel of niet worden meegenomen in de animatie. Alleen nodes in de lijst met inbegrepen nodes worden gewijzigd door de animatie, nodes in de lijst met uitgesloten nodes worden genegeerd.\",rG=\"Uitgesloten Nodes\",oG=\"Een lijst van nodes die uitgesloten moeten worden van de animatie. Deze nodes worden niet gewijzigd door de animatie.\",sG=\"Inbegrepen Nodes\",lG=\"Een lijst van nodes die in de animatie moeten worden opgenomen. Alleen deze nodes worden gewijzigd door de animatie.\",cG=\"Lijsten Omwisselen\",uG=\"Exporteren...\",dG=\"Varianten\",pG=\"Nieuwe Variant Maken\",mG=\"Variant Bewerken\",fG=\"Geselecteerde Variant Dupliceren\",hG=\"Geselecteerde Variant Verwijderen\",gG=\"Variant Geselecteerd\",_G=\"Variant Niet Geselecteerd\",xG=\"Kan de standaard variant niet verwijderen!\",vG=\"Variant Maken\",bG=\"Variant Dupliceren\",yG=\"Open Variant Configuratie\",wG=\"Variant Verwijderen\",EG=\"Uitgesloten Nodes\",kG=\"Uitgesloten Nodes Inverteren\",jG=\"Variant\",AG=\"Commando's\",TG=\"Variant\",CG=\"Commando's\",SG=\"Uitvoer Voorwaarde\",OG=\"Keyframe ({0})\",IG=\"Variant\",DG=\"De Variant die moet worden toegepast op de keyframe.\",FG=\"Commando's\",NG=`Commando's die worden uitgevoerd wanneer de keyframe is bereikt.\nBehandel deze tekstinvoer als een .mcfunction-bestand. (Ondersteunt ook MC-Build syntaxis!)`,RG=\"Uitvoer Voorwaarde\",MG=\"Een voorwaarde waaraan moet worden voldaan om het keyframe uit te voeren. Behandel deze tekstinvoer als een sub-commando van een execute command.\",BG=\"Herhalen?\",PG=`Of de commando's in dit keyframe al dan niet herhaaldelijk moeten worden uitgevoerd.\nAls deze optie is ingeschakeld, worden de commando's elke Herhaal Frequentie ticks uitgevoerd.`,LG=\"Herhaal Frequentie\",VG=`Hoeveel ticks er moeten worden gewacht voordat de commando's in dit keyframe opnieuw worden uitgevoerd.\nAls je dit instelt op 1, worden de commando's elke tik uitgevoerd.\nOPMERKING: Als de animatie niet gelijkmatig deelbaar is door deze waarde, kan het interval enigszins afwijken wanneer de animatie in een lus loopt.\nAls dit is ingesteld op een waarde groter dan de lengte van de animatie, zullen de commando's worden uitgevoerd alsof herhalen is uitgeschakeld (Zodra het keyframe is bereikt).`,zG=\"Versoepeling Type\",UG=\"Het type versoepeling dat moet worden toegepast op het keyframe.\",qG=\"Linear\",HG=\"Sine\",JG=\"Quad\",GG=\"Cubic\",WG=\"Quart\",KG=\"Quint\",YG=\"Expo\",XG=\"Circ\",ZG=\"Elastic\",QG=\"Back\",$G=\"Bounce\",eW=\"Versoepling Modus\",tW=\"De versoepelingsmodus die moet worden toegepast op het keyframe.\",nW=\"In\",iW=\"Out\",aW=\"In-Out\",rW=\"Versoepeling Argumenten\",oW=\"De argumenten die moeten worden toegepast op de versoepelings functie.\",sW=\"Elasticiteit\",lW=\"De elasticiteit van de versoepelings functie.\",cW=\"Overschrijding\",uW=\"De hoeveelheid overschrijding die moet worden toegepast op de versoepelings functie.\",dW=\"Stuiterigheid\",pW=\"De stuiterigheid van de versoepelings functie.\",mW=\"Tekstweergave\",fW=\"Lijnbreedte\",hW=\"De breedte van de tekstweergave in pixels.\",gW=\"Achtergrond Kleur\",_W=\"De kleur van de achtergrond van de tekstweergave.\",xW=\"Tekst Schaduw\",vW=\"Wel of geen schaduw achter de tekst weergeven.\",bW=\"Uitlijning Van Tekst\",yW=\"De uitlijning van de tekst.\",wW=\"Links\",EW=\"Midden\",kW=\"Rechts\",jW=\"Weergegeven Voorwerp\",AW=\"Het voorwerp dat moet worden weergegeven.\",TW=\"Weergegeven Blok.\",CW=\"Het blok dat moet worden weergegeven. Ondersteunt block states!\",SW=\"Vanilla Voorwerpweergave\",OW=\"Exporteren Mislukt\",IW=\"Je hebt resource pack exporteren uitgeschakeld, maar je hebt aangepaste modellen in je project! Schakel resource pack exporteren in of verwijder de aangepaste modellen voordat je exporteert.\",DW=\"Er zitten fouten in je blauwdruk instellingen! Herstel deze voordat je exporteert.\",FW=\"Een probleem gevonden met {0}:\",NW=\"Ok\",RW=\"Animated Java\",MW=\"Mob hoofden worden niet weergegeven in Blokweergaves. Gebruik in plaats daarvan een Voorwerpweergave.\",BW=\"Blauwdruk export pad bestaat niet\",PW=`Het exportpad '{0}' bestaat niet!\nControleer of de map waarin je opslaat bestaat en probeer het opnieuw.`,LW={\"animated_java.action.open_blueprint_settings.name\":Uz,\"animated_java.action.open_documentation.name\":qz,\"animated_java.action.open_about.name\":Hz,\"animated_java.action.open_bone_config.name\":Jz,\"animated_java.action.open_locator_config.name\":Gz,\"animated_java.action.open_text_display_config.name\":Wz,\"animated_java.action.export.name\":Kz,\"animated_java.action.create_text_display.title\":Yz,\"animated_java.action.create_vanilla_item_display.title\":Xz,\"animated_java.action.create_vanilla_block_display.title\":Zz,\"animated_java.action.open_vanilla_item_display_config.name\":Qz,\"animated_java.action.open_vanilla_block_display_config.name\":$z,\"animated_java.popup.loading.loading\":eU,\"animated_java.popup.loading.success\":tU,\"animated_java.popup.loading.offline\":nU,\"animated_java.dialog.about.title\":iU,\"animated_java.dialog.about.close_button\":aU,\"animated_java.dialog.unexpected_error.title\":rU,\"animated_java.dialog.unexpected_error.close_button\":oU,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":sU,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":lU,\"animated_java.dialog.unexpected_error.paragraph\":cU,\"animated_java.dialog.blueprint_settings.title\":uU,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":dU,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":pU,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":mU,\"animated_java.dialog.blueprint_settings.texture_size.title\":fU,\"animated_java.dialog.blueprint_settings.texture_size.description\":hU,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":gU,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":_U,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":xU,\"animated_java.dialog.blueprint_settings.export_settings.title\":vU,\"animated_java.dialog.blueprint_settings.export_namespace.title\":bU,\"animated_java.dialog.blueprint_settings.export_namespace.description\":yU,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":wU,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":EU,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":kU,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":jU,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":AU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":TU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":CU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":SU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":OU,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":IU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":DU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":FU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":NU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":RU,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":MU,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":BU,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":PU,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":LU,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":VU,\"animated_java.dialog.blueprint_settings.bounding_box.title\":zU,\"animated_java.dialog.blueprint_settings.bounding_box.description\":UU,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":qU,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":HU,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":JU,\"animated_java.dialog.blueprint_settings.display_item.title\":GU,\"animated_java.dialog.blueprint_settings.display_item.description\":WU,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":KU,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":YU,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":XU,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":ZU,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":QU,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":$U,\"animated_java.dialog.blueprint_settings.resource_pack.title\":eq,\"animated_java.dialog.blueprint_settings.resource_pack.description\":tq,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":nq,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":iq,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":aq,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":rq,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":oq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":sq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":lq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":cq,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":uq,\"animated_java.dialog.blueprint_settings.display_item_path.title\":dq,\"animated_java.dialog.blueprint_settings.display_item_path.description\":pq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":mq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":fq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":hq,\"animated_java.dialog.blueprint_settings.model_folder.title\":gq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.description\":_q,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":xq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":vq,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":bq,\"animated_java.dialog.blueprint_settings.texture_folder.title\":yq,\"animated_java.dialog.blueprint_settings.texture_folder.description\":wq,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":Eq,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":kq,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":jq,\"animated_java.dialog.blueprint_settings.data_pack.title\":Aq,\"animated_java.dialog.blueprint_settings.data_pack.description\":Tq,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":Cq,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":Sq,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":Oq,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":Iq,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":Dq,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":Fq,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":Nq,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":Rq,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":Mq,\"animated_java.dialog.blueprint_settings.summon_commands.title\":Bq,\"animated_java.dialog.blueprint_settings.summon_commands.description\":Pq,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":Lq,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":Vq,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":zq,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":Uq,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":qq,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":Hq,\"animated_java.dialog.blueprint_settings.baked_animations.title\":Jq,\"animated_java.dialog.blueprint_settings.baked_animations.description\":Gq,\"animated_java.dialog.blueprint_settings.json_file.title\":Wq,\"animated_java.dialog.blueprint_settings.json_file.description\":Kq,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":Yq,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":Xq,\"animated_java.dialog.bone_config.title\":Zq,\"animated_java.dialog.bone_config.selected_variant\":Qq,\"animated_java.dialog.bone_config.default_variant_subtitle\":$q,\"animated_java.dialog.bone_config.selected_variant_subtitle\":eH,\"animated_java.dialog.bone_config.use_nbt.title\":tH,\"animated_java.dialog.bone_config.use_nbt.description\":nH,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":iH,\"animated_java.dialog.bone_config.inherit_settings.title\":aH,\"animated_java.dialog.bone_config.inherit_settings.description\":rH,\"animated_java.dialog.bone_config.glowing.title\":oH,\"animated_java.dialog.bone_config.glowing.description\":sH,\"animated_java.dialog.bone_config.override_glow_color.title\":lH,\"animated_java.dialog.bone_config.override_glow_color.description\":cH,\"animated_java.dialog.bone_config.glow_color.title\":uH,\"animated_java.dialog.bone_config.glow_color.description\":dH,\"animated_java.dialog.bone_config.shadow_radius.title\":pH,\"animated_java.dialog.bone_config.shadow_radius.description\":mH,\"animated_java.dialog.bone_config.shadow_strength.title\":fH,\"animated_java.dialog.bone_config.shadow_strength.description\":hH,\"animated_java.dialog.bone_config.override_brightness.title\":gH,\"animated_java.dialog.bone_config.override_brightness.description\":_H,\"animated_java.dialog.bone_config.brightness_override.title\":xH,\"animated_java.dialog.bone_config.brightness_override.description\":vH,\"animated_java.dialog.bone_config.enchanted.title\":bH,\"animated_java.dialog.bone_config.enchanted.description\":yH,\"animated_java.dialog.bone_config.invisible.title\":wH,\"animated_java.dialog.bone_config.invisible.description\":EH,\"animated_java.dialog.bone_config.nbt.title\":kH,\"animated_java.dialog.bone_config.nbt.description\":jH,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":AH,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":TH,\"animated_java.dialog.bone_config.billboard.title\":CH,\"animated_java.dialog.bone_config.billboard.description\":SH,\"animated_java.dialog.bone_config.billboard.options.fixed\":OH,\"animated_java.dialog.bone_config.billboard.options.vertical\":IH,\"animated_java.dialog.bone_config.billboard.options.horizontal\":DH,\"animated_java.dialog.bone_config.billboard.options.center\":FH,\"animated_java.dialog.locator_config.title\":NH,\"animated_java.dialog.locator_config.plugin_mode_warning\":RH,\"animated_java.dialog.locator_config.use_entity.title\":MH,\"animated_java.dialog.locator_config.use_entity.description\":BH,\"animated_java.dialog.locator_config.entity_type.title\":PH,\"animated_java.dialog.locator_config.entity_type.description\":LH,\"animated_java.dialog.locator_config.entity_type.error.empty\":VH,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":zH,\"animated_java.dialog.locator_config.summon_commands.title\":UH,\"animated_java.dialog.locator_config.summon_commands.description\":qH,\"animated_java.dialog.locator_config.ticking_commands.title\":HH,\"animated_java.dialog.locator_config.ticking_commands.description\":JH,\"animated_java.dialog.text_display_config.title\":GH,\"animated_java.dialog.bone_config.vanilla_item_model.title\":WH,\"animated_java.dialog.bone_config.vanilla_item_model.description\":KH,\"animated_java.dialog.text_display_config.use_nbt.title\":YH,\"animated_java.dialog.text_display_config.use_nbt.description\":XH,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":ZH,\"animated_java.dialog.text_display_config.inherit_settings.title\":QH,\"animated_java.dialog.text_display_config.inherit_settings.description\":$H,\"animated_java.dialog.text_display_config.glowing.title\":eJ,\"animated_java.dialog.text_display_config.glowing.description\":tJ,\"animated_java.dialog.text_display_config.override_glow_color.title\":nJ,\"animated_java.dialog.text_display_config.override_glow_color.description\":iJ,\"animated_java.dialog.text_display_config.glow_color.title\":aJ,\"animated_java.dialog.text_display_config.glow_color.description\":rJ,\"animated_java.dialog.text_display_config.shadow_radius.title\":oJ,\"animated_java.dialog.text_display_config.shadow_radius.description\":sJ,\"animated_java.dialog.text_display_config.shadow_strength.title\":lJ,\"animated_java.dialog.text_display_config.shadow_strength.description\":cJ,\"animated_java.dialog.text_display_config.override_brightness.title\":uJ,\"animated_java.dialog.text_display_config.override_brightness.description\":dJ,\"animated_java.dialog.text_display_config.brightness_override.title\":pJ,\"animated_java.dialog.text_display_config.brightness_override.description\":mJ,\"animated_java.dialog.text_display_config.invisible.title\":fJ,\"animated_java.dialog.text_display_config.invisible.description\":hJ,\"animated_java.dialog.text_display_config.nbt.title\":gJ,\"animated_java.dialog.text_display_config.nbt.description\":_J,\"animated_java.dialog.text_display_config.billboard.title\":xJ,\"animated_java.dialog.text_display_config.billboard.description\":vJ,\"animated_java.dialog.text_display_config.billboard.options.fixed\":bJ,\"animated_java.dialog.text_display_config.billboard.options.vertical\":yJ,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":wJ,\"animated_java.dialog.text_display_config.billboard.options.center\":EJ,\"animated_java.dialog.variant_config.title\":kJ,\"animated_java.dialog.variant_config.variant_display_name\":jJ,\"animated_java.dialog.variant_config.variant_display_name.description\":AJ,\"animated_java.dialog.variant_config.generate_name_from_display_name\":TJ,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":CJ,\"animated_java.dialog.variant_config.variant_name\":SJ,\"animated_java.dialog.variant_config.variant_name.description\":OJ,\"animated_java.dialog.variant_config.texture_map.title\":IJ,\"animated_java.dialog.variant_config.texture_map.description\":DJ,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":FJ,\"animated_java.dialog.variant_config.texture_map.no_mappings\":NJ,\"animated_java.dialog.variant_config.bone_lists.description\":RJ,\"animated_java.dialog.variant_config.excluded_nodes.title\":MJ,\"animated_java.dialog.variant_config.excluded_nodes.description\":BJ,\"animated_java.dialog.variant_config.included_nodes.title\":PJ,\"animated_java.dialog.variant_config.included_nodes.description\":LJ,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":VJ,\"animated_java.action.upgrade_old_aj_model_loader.name\":zJ,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":UJ,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":qJ,\"animated_java.action.upgrade_old_aj_model_loader.body\":HJ,\"animated_java.action.upgrade_old_aj_model_loader.button\":JJ,\"animated_java.dialog.animation_properties.title\":GJ,\"animated_java.dialog.animation_properties.animation_name.title\":WJ,\"animated_java.dialog.animation_properties.animation_name.description\":KJ,\"animated_java.dialog.animation_properties.loop_mode.title\":YJ,\"animated_java.dialog.animation_properties.loop_mode.description\":XJ,\"animated_java.dialog.animation_properties.loop_mode.options.once\":ZJ,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":QJ,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":$J,\"animated_java.dialog.animation_properties.animation_name.error.empty\":eG,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":tG,\"animated_java.dialog.animation_properties.loop_delay.title\":nG,\"animated_java.dialog.animation_properties.loop_delay.description\":iG,\"animated_java.dialog.animation_properties.bone_lists.description\":aG,\"animated_java.dialog.animation_properties.excluded_nodes.title\":rG,\"animated_java.dialog.animation_properties.excluded_nodes.description\":oG,\"animated_java.dialog.animation_properties.included_nodes.title\":sG,\"animated_java.dialog.animation_properties.included_nodes.description\":lG,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":cG,\"animated_java.dialog.export_progress.title\":uG,\"animated_java.panel.variants.title\":dG,\"animated_java.panel.variants.tool.create_new_variant\":pG,\"animated_java.panel.variants.tool.edit_variant\":mG,\"animated_java.panel.variants.tool.duplicate_selected_variant\":fG,\"animated_java.panel.variants.tool.delete_selected_variant\":hG,\"animated_java.panel.variants.tool.variant_visible\":gG,\"animated_java.panel.variants.tool.variant_not_visible\":_G,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":xG,\"animated_java.action.variants.create\":vG,\"animated_java.action.variants.duplicate\":bG,\"animated_java.action.variants.open_config\":yG,\"animated_java.action.variants.delete\":wG,\"animated_java.animation.excluded_nodes\":EG,\"animated_java.animation.invert_excluded_nodes\":kG,\"animated_java.effect_animator.timeline.variant\":jG,\"animated_java.effect_animator.timeline.commands\":AG,\"animated_java.effect_animator.keyframes.variant\":TG,\"animated_java.effect_animator.keyframes.commands\":CG,\"animated_java.effect_animator.keyframes.execute_condition\":SG,\"animated_java.panel.keyframe.keyframe_title\":OG,\"animated_java.panel.keyframe.variant.title\":IG,\"animated_java.panel.keyframe.variant.description\":DG,\"animated_java.panel.keyframe.commands.title\":FG,\"animated_java.panel.keyframe.commands.description\":NG,\"animated_java.panel.keyframe.execute_condition.title\":RG,\"animated_java.panel.keyframe.execute_condition.description\":MG,\"animated_java.panel.keyframe.repeat.title\":BG,\"animated_java.panel.keyframe.repeat.description\":PG,\"animated_java.panel.keyframe.repeat_frequency.title\":LG,\"animated_java.panel.keyframe.repeat_frequency.description\":VG,\"animated_java.panel.keyframe.easing_type.title\":zG,\"animated_java.panel.keyframe.easing_type.description\":UG,\"animated_java.panel.keyframe.easing_type.options.linear\":qG,\"animated_java.panel.keyframe.easing_type.options.sine\":HG,\"animated_java.panel.keyframe.easing_type.options.quad\":JG,\"animated_java.panel.keyframe.easing_type.options.cubic\":GG,\"animated_java.panel.keyframe.easing_type.options.quart\":WG,\"animated_java.panel.keyframe.easing_type.options.quint\":KG,\"animated_java.panel.keyframe.easing_type.options.expo\":YG,\"animated_java.panel.keyframe.easing_type.options.circ\":XG,\"animated_java.panel.keyframe.easing_type.options.elastic\":ZG,\"animated_java.panel.keyframe.easing_type.options.back\":QG,\"animated_java.panel.keyframe.easing_type.options.bounce\":$G,\"animated_java.panel.keyframe.easing_mode.title\":eW,\"animated_java.panel.keyframe.easing_mode.description\":tW,\"animated_java.panel.keyframe.easing_mode.options.in\":nW,\"animated_java.panel.keyframe.easing_mode.options.out\":iW,\"animated_java.panel.keyframe.easing_mode.options.inout\":aW,\"animated_java.panel.keyframe.easing_args.title\":rW,\"animated_java.panel.keyframe.easing_args.description\":oW,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":sW,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":lW,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":cW,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":uW,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":dW,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":pW,\"animated_java.panel.text_display.title\":mW,\"animated_java.tool.text_display.line_width.title\":fW,\"animated_java.tool.text_display.line_width.description\":hW,\"animated_java.tool.text_display.background_color.title\":gW,\"animated_java.tool.text_display.background_color.description\":_W,\"animated_java.tool.text_display.text_shadow.title\":xW,\"animated_java.tool.text_display.text_shadow.description\":vW,\"animated_java.tool.text_display.text_alignment.title\":bW,\"animated_java.tool.text_display.text_alignment.description\":yW,\"animated_java.tool.text_display.text_alignment.options.left\":wW,\"animated_java.tool.text_display.text_alignment.options.center\":EW,\"animated_java.tool.text_display.text_alignment.options.right\":kW,\"animated_java.panel.vanilla_item_display.title\":jW,\"animated_java.panel.vanilla_item_display.description\":AW,\"animated_java.panel.vanilla_block_display.title\":TW,\"animated_java.panel.vanilla_block_display.description\":CW,\"animated_java.vanilla_item_display.title\":SW,\"animated_java.misc.failed_to_export.title\":OW,\"animated_java.misc.failed_to_export.custom_models.message\":IW,\"animated_java.misc.failed_to_export.blueprint_settings.message\":DW,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":FW,\"animated_java.misc.failed_to_export.button\":NW,\"animated_java.format_category.animated_java\":RW,\"animated_java.block_model_manager.mob_head_warning\":MW,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":BW,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":PW};var Ag={};vn(Ag,{\"animated_java.action.copy_display_entity_config.message\":()=>oK,\"animated_java.action.copy_display_entity_config.name\":()=>rK,\"animated_java.action.create_text_display.title\":()=>nK,\"animated_java.action.create_vanilla_block_display.title\":()=>aK,\"animated_java.action.create_vanilla_item_display.title\":()=>iK,\"animated_java.action.export.name\":()=>KW,\"animated_java.action.export_all.description\":()=>ZW,\"animated_java.action.export_all.name\":()=>XW,\"animated_java.action.export_all_debug.description\":()=>$W,\"animated_java.action.export_all_debug.name\":()=>QW,\"animated_java.action.export_debug.name\":()=>YW,\"animated_java.action.extract.confirm\":()=>tK,\"animated_java.action.extract.name\":()=>eK,\"animated_java.action.open_about.name\":()=>JW,\"animated_java.action.open_blueprint_settings.name\":()=>UW,\"animated_java.action.open_changelog.name\":()=>HW,\"animated_java.action.open_display_entity_config.name\":()=>GW,\"animated_java.action.open_documentation.name\":()=>qW,\"animated_java.action.open_locator_config.name\":()=>WW,\"animated_java.action.paste_display_entity_config.message\":()=>lK,\"animated_java.action.paste_display_entity_config.name\":()=>sK,\"animated_java.action.upgrade_old_aj_model_loader.body\":()=>CQ,\"animated_java.action.upgrade_old_aj_model_loader.button\":()=>SQ,\"animated_java.action.upgrade_old_aj_model_loader.name\":()=>jQ,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":()=>TQ,\"animated_java.action.variants.create\":()=>r$,\"animated_java.action.variants.delete\":()=>l$,\"animated_java.action.variants.duplicate\":()=>o$,\"animated_java.action.variants.open_config\":()=>s$,\"animated_java.animation.excluded_nodes\":()=>c$,\"animated_java.animation.invert_excluded_nodes\":()=>u$,\"animated_java.block_model_manager.facing_warning\":()=>Yee,\"animated_java.block_model_manager.fluid_warning\":()=>Wee,\"animated_java.block_model_manager.mob_head_warning\":()=>Kee,\"animated_java.dialog.about.close_button\":()=>wK,\"animated_java.dialog.about.title\":()=>yK,\"animated_java.dialog.animation_properties.animation_name.description\":()=>DQ,\"animated_java.dialog.animation_properties.animation_name.error.empty\":()=>PQ,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":()=>LQ,\"animated_java.dialog.animation_properties.animation_name.title\":()=>IQ,\"animated_java.dialog.animation_properties.bone_lists.description\":()=>UQ,\"animated_java.dialog.animation_properties.excluded_nodes.description\":()=>HQ,\"animated_java.dialog.animation_properties.excluded_nodes.title\":()=>qQ,\"animated_java.dialog.animation_properties.included_nodes.description\":()=>GQ,\"animated_java.dialog.animation_properties.included_nodes.title\":()=>JQ,\"animated_java.dialog.animation_properties.loop_delay.description\":()=>zQ,\"animated_java.dialog.animation_properties.loop_delay.title\":()=>VQ,\"animated_java.dialog.animation_properties.loop_mode.description\":()=>NQ,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":()=>MQ,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":()=>BQ,\"animated_java.dialog.animation_properties.loop_mode.options.once\":()=>RQ,\"animated_java.dialog.animation_properties.loop_mode.title\":()=>FQ,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":()=>WQ,\"animated_java.dialog.animation_properties.title\":()=>OQ,\"animated_java.dialog.blueprint_loading.title\":()=>YQ,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":()=>IK,\"animated_java.dialog.blueprint_settings.auto_render_box.description\":()=>KK,\"animated_java.dialog.blueprint_settings.auto_render_box.title\":()=>WK,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description\":()=>oX,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title\":()=>rX,\"animated_java.dialog.blueprint_settings.baked_animations.description\":()=>uX,\"animated_java.dialog.blueprint_settings.baked_animations.title\":()=>cX,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":()=>EY,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":()=>wY,\"animated_java.dialog.blueprint_settings.data_pack.description\":()=>BY,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":()=>VY,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":()=>UY,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":()=>LY,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":()=>zY,\"animated_java.dialog.blueprint_settings.data_pack.title\":()=>MY,\"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder\":()=>PY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder\":()=>oY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":()=>lY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":()=>sY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":()=>rY,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":()=>RY,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":()=>HY,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":()=>JY,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":()=>GY,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":()=>qY,\"animated_java.dialog.blueprint_settings.display_item.description\":()=>hY,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":()=>_Y,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":()=>xY,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":()=>yY,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":()=>gY,\"animated_java.dialog.blueprint_settings.display_item.title\":()=>fY,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":()=>vY,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":()=>bY,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":()=>mY,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":()=>pY,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":()=>eY,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":()=>$K,\"animated_java.dialog.blueprint_settings.export_namespace.description\":()=>zK,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":()=>UK,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":()=>HK,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":()=>qK,\"animated_java.dialog.blueprint_settings.export_namespace.title\":()=>VK,\"animated_java.dialog.blueprint_settings.export_settings.title\":()=>LK,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":()=>nX,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":()=>tX,\"animated_java.dialog.blueprint_settings.json_file.description\":()=>pX,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":()=>mX,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":()=>fX,\"animated_java.dialog.blueprint_settings.json_file.title\":()=>dX,\"animated_java.dialog.blueprint_settings.on_post_tick_function.description\":()=>eX,\"animated_java.dialog.blueprint_settings.on_post_tick_function.title\":()=>$Y,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.description\":()=>QY,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.title\":()=>ZY,\"animated_java.dialog.blueprint_settings.on_remove_function.description\":()=>XY,\"animated_java.dialog.blueprint_settings.on_remove_function.title\":()=>YY,\"animated_java.dialog.blueprint_settings.on_summon_function.description\":()=>KY,\"animated_java.dialog.blueprint_settings.on_summon_function.title\":()=>WY,\"animated_java.dialog.blueprint_settings.project_name.description\":()=>FK,\"animated_java.dialog.blueprint_settings.project_name.title\":()=>DK,\"animated_java.dialog.blueprint_settings.project_settings.title\":()=>OK,\"animated_java.dialog.blueprint_settings.render_box.description\":()=>XK,\"animated_java.dialog.blueprint_settings.render_box.title\":()=>YK,\"animated_java.dialog.blueprint_settings.resource_pack.description\":()=>jY,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":()=>CY,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":()=>OY,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":()=>TY,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":()=>SY,\"animated_java.dialog.blueprint_settings.resource_pack.title\":()=>kY,\"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder\":()=>AY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder\":()=>nY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":()=>aY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":()=>iY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":()=>tY,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":()=>dY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":()=>DY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":()=>FY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":()=>NY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":()=>IY,\"animated_java.dialog.blueprint_settings.show_render_box.description\":()=>GK,\"animated_java.dialog.blueprint_settings.show_render_box.title\":()=>JK,\"animated_java.dialog.blueprint_settings.target_minecraft_version.description\":()=>uY,\"animated_java.dialog.blueprint_settings.target_minecraft_version.title\":()=>cY,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":()=>aX,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":()=>iX,\"animated_java.dialog.blueprint_settings.texture_size.description\":()=>RK,\"animated_java.dialog.blueprint_settings.texture_size.title\":()=>NK,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":()=>PK,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":()=>BK,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":()=>MK,\"animated_java.dialog.blueprint_settings.title\":()=>SK,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":()=>lX,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":()=>sX,\"animated_java.dialog.blueprint_settings.view_range.description\":()=>QK,\"animated_java.dialog.blueprint_settings.view_range.title\":()=>ZK,\"animated_java.dialog.bone_config.vanilla_item_model.description\":()=>wZ,\"animated_java.dialog.bone_config.vanilla_item_model.title\":()=>yZ,\"animated_java.dialog.changelog_dialog.title\":()=>EK,\"animated_java.dialog.display_entity.billboard.description\":()=>XX,\"animated_java.dialog.display_entity.billboard.options.center\":()=>eZ,\"animated_java.dialog.display_entity.billboard.options.fixed\":()=>ZX,\"animated_java.dialog.display_entity.billboard.options.horizontal\":()=>$X,\"animated_java.dialog.display_entity.billboard.options.vertical\":()=>QX,\"animated_java.dialog.display_entity.billboard.title\":()=>YX,\"animated_java.dialog.display_entity.brightness_override.description\":()=>VX,\"animated_java.dialog.display_entity.brightness_override.title\":()=>LX,\"animated_java.dialog.display_entity.custom_brightness.description\":()=>HX,\"animated_java.dialog.display_entity.custom_brightness.title\":()=>qX,\"animated_java.dialog.display_entity.custom_name.description\":()=>EX,\"animated_java.dialog.display_entity.custom_name.invalid_json.error\":()=>kX,\"animated_java.dialog.display_entity.custom_name.title\":()=>wX,\"animated_java.dialog.display_entity.custom_name_visible.description\":()=>AX,\"animated_java.dialog.display_entity.custom_name_visible.title\":()=>jX,\"animated_java.dialog.display_entity.enchanted.description\":()=>GX,\"animated_java.dialog.display_entity.enchanted.title\":()=>JX,\"animated_java.dialog.display_entity.glow_color.description\":()=>DX,\"animated_java.dialog.display_entity.glow_color.title\":()=>IX,\"animated_java.dialog.display_entity.glowing.description\":()=>CX,\"animated_java.dialog.display_entity.glowing.title\":()=>TX,\"animated_java.dialog.display_entity.invisible.description\":()=>KX,\"animated_java.dialog.display_entity.invisible.title\":()=>WX,\"animated_java.dialog.display_entity.node_options.title\":()=>gX,\"animated_java.dialog.display_entity.on_apply_function.description\":()=>yX,\"animated_java.dialog.display_entity.on_apply_function.title\":()=>bX,\"animated_java.dialog.display_entity.on_summon_function.description\":()=>vX,\"animated_java.dialog.display_entity.on_summon_function.title\":()=>xX,\"animated_java.dialog.display_entity.override_brightness.description\":()=>PX,\"animated_java.dialog.display_entity.override_brightness.title\":()=>BX,\"animated_java.dialog.display_entity.override_glow_color.description\":()=>OX,\"animated_java.dialog.display_entity.override_glow_color.title\":()=>SX,\"animated_java.dialog.display_entity.per_variant_options.title\":()=>_X,\"animated_java.dialog.display_entity.shadow_radius.description\":()=>NX,\"animated_java.dialog.display_entity.shadow_radius.title\":()=>FX,\"animated_java.dialog.display_entity.shadow_strength.description\":()=>MX,\"animated_java.dialog.display_entity.shadow_strength.title\":()=>RX,\"animated_java.dialog.display_entity.title\":()=>hX,\"animated_java.dialog.display_entity.use_custom_brightness.description\":()=>UX,\"animated_java.dialog.display_entity.use_custom_brightness.title\":()=>zX,\"animated_java.dialog.export_progress.title\":()=>KQ,\"animated_java.dialog.locator_config.entity_type.description\":()=>oZ,\"animated_java.dialog.locator_config.entity_type.error.empty\":()=>sZ,\"animated_java.dialog.locator_config.entity_type.title\":()=>rZ,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":()=>lZ,\"animated_java.dialog.locator_config.on_remove_function.description\":()=>hZ,\"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity\":()=>gZ,\"animated_java.dialog.locator_config.on_remove_function.title\":()=>fZ,\"animated_java.dialog.locator_config.on_summon_function.description\":()=>pZ,\"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity\":()=>mZ,\"animated_java.dialog.locator_config.on_summon_function.title\":()=>dZ,\"animated_java.dialog.locator_config.on_tick_function.description\":()=>xZ,\"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity\":()=>vZ,\"animated_java.dialog.locator_config.on_tick_function.title\":()=>_Z,\"animated_java.dialog.locator_config.plugin_mode_warning\":()=>nZ,\"animated_java.dialog.locator_config.sync_passenger_rotation.description\":()=>uZ,\"animated_java.dialog.locator_config.sync_passenger_rotation.title\":()=>cZ,\"animated_java.dialog.locator_config.title\":()=>tZ,\"animated_java.dialog.locator_config.use_entity.description\":()=>aZ,\"animated_java.dialog.locator_config.use_entity.title\":()=>iZ,\"animated_java.dialog.reset\":()=>bK,\"animated_java.dialog.text_display_config.brightness_override.description\":()=>zZ,\"animated_java.dialog.text_display_config.brightness_override.title\":()=>VZ,\"animated_java.dialog.text_display_config.custom_brightness.description\":()=>JZ,\"animated_java.dialog.text_display_config.custom_brightness.title\":()=>HZ,\"animated_java.dialog.text_display_config.glow_color.description\":()=>FZ,\"animated_java.dialog.text_display_config.glow_color.title\":()=>DZ,\"animated_java.dialog.text_display_config.glowing.description\":()=>SZ,\"animated_java.dialog.text_display_config.glowing.title\":()=>CZ,\"animated_java.dialog.text_display_config.inherit_settings.description\":()=>TZ,\"animated_java.dialog.text_display_config.inherit_settings.title\":()=>AZ,\"animated_java.dialog.text_display_config.invisible.description\":()=>WZ,\"animated_java.dialog.text_display_config.invisible.title\":()=>GZ,\"animated_java.dialog.text_display_config.nbt.description\":()=>YZ,\"animated_java.dialog.text_display_config.nbt.title\":()=>KZ,\"animated_java.dialog.text_display_config.override_brightness.description\":()=>LZ,\"animated_java.dialog.text_display_config.override_brightness.title\":()=>PZ,\"animated_java.dialog.text_display_config.override_glow_color.description\":()=>IZ,\"animated_java.dialog.text_display_config.override_glow_color.title\":()=>OZ,\"animated_java.dialog.text_display_config.shadow_radius.description\":()=>RZ,\"animated_java.dialog.text_display_config.shadow_radius.title\":()=>NZ,\"animated_java.dialog.text_display_config.shadow_strength.description\":()=>BZ,\"animated_java.dialog.text_display_config.shadow_strength.title\":()=>MZ,\"animated_java.dialog.text_display_config.title\":()=>bZ,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":()=>qZ,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":()=>UZ,\"animated_java.dialog.text_display_config.use_nbt.description\":()=>kZ,\"animated_java.dialog.text_display_config.use_nbt.title\":()=>EZ,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":()=>jZ,\"animated_java.dialog.unexpected_error.close_button\":()=>jK,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":()=>TK,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":()=>AK,\"animated_java.dialog.unexpected_error.paragraph\":()=>CK,\"animated_java.dialog.unexpected_error.title\":()=>kK,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":()=>AQ,\"animated_java.dialog.vanilla_block_display.custom_name.description\":()=>QZ,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":()=>$Z,\"animated_java.dialog.vanilla_block_display.custom_name.title\":()=>ZZ,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":()=>tQ,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":()=>eQ,\"animated_java.dialog.vanilla_block_display_config.title\":()=>XZ,\"animated_java.dialog.vanilla_item_display.custom_name.description\":()=>aQ,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":()=>rQ,\"animated_java.dialog.vanilla_item_display.custom_name.title\":()=>iQ,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":()=>sQ,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":()=>oQ,\"animated_java.dialog.vanilla_item_display_config.title\":()=>nQ,\"animated_java.dialog.variant_config.bone_lists.description\":()=>vQ,\"animated_java.dialog.variant_config.excluded_nodes.description\":()=>yQ,\"animated_java.dialog.variant_config.excluded_nodes.title\":()=>bQ,\"animated_java.dialog.variant_config.generate_name_from_display_name\":()=>dQ,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":()=>pQ,\"animated_java.dialog.variant_config.included_nodes.description\":()=>EQ,\"animated_java.dialog.variant_config.included_nodes.title\":()=>wQ,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":()=>kQ,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":()=>_Q,\"animated_java.dialog.variant_config.texture_map.description\":()=>gQ,\"animated_java.dialog.variant_config.texture_map.no_mappings\":()=>xQ,\"animated_java.dialog.variant_config.texture_map.title\":()=>hQ,\"animated_java.dialog.variant_config.title\":()=>lQ,\"animated_java.dialog.variant_config.variant_display_name\":()=>cQ,\"animated_java.dialog.variant_config.variant_display_name.description\":()=>uQ,\"animated_java.dialog.variant_config.variant_name\":()=>mQ,\"animated_java.dialog.variant_config.variant_name.description\":()=>fQ,\"animated_java.effect_animator.keyframe_data_point.execute_condition\":()=>h$,\"animated_java.effect_animator.keyframe_data_point.function\":()=>f$,\"animated_java.effect_animator.keyframe_data_point.repeat\":()=>g$,\"animated_java.effect_animator.keyframe_data_point.repeat_frequency\":()=>_$,\"animated_java.effect_animator.keyframe_data_point.variant\":()=>m$,\"animated_java.effect_animator.timeline.function\":()=>p$,\"animated_java.effect_animator.timeline.variant\":()=>d$,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":()=>Zee,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":()=>Xee,\"animated_java.format.blueprint.name\":()=>zW,\"animated_java.format_category.animated_java\":()=>Gee,\"animated_java.menubar.label\":()=>VW,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":()=>Pee,\"animated_java.misc.failed_to_export.blueprint_settings.message\":()=>Bee,\"animated_java.misc.failed_to_export.button\":()=>Lee,\"animated_java.misc.failed_to_export.custom_models.message\":()=>Mee,\"animated_java.misc.failed_to_export.invalid_rotation.message\":()=>Vee,\"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6\":()=>zee,\"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message\":()=>qee,\"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message\":()=>Uee,\"animated_java.misc.failed_to_export.title\":()=>Ree,\"animated_java.panel.keyframe.easing_args.description\":()=>K$,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":()=>Q$,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":()=>Z$,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":()=>eee,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":()=>$$,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":()=>X$,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":()=>Y$,\"animated_java.panel.keyframe.easing_args.title\":()=>W$,\"animated_java.panel.keyframe.easing_mode.description\":()=>q$,\"animated_java.panel.keyframe.easing_mode.options.in\":()=>H$,\"animated_java.panel.keyframe.easing_mode.options.inout\":()=>G$,\"animated_java.panel.keyframe.easing_mode.options.out\":()=>J$,\"animated_java.panel.keyframe.easing_mode.title\":()=>U$,\"animated_java.panel.keyframe.easing_type.description\":()=>O$,\"animated_java.panel.keyframe.easing_type.options.back\":()=>V$,\"animated_java.panel.keyframe.easing_type.options.bounce\":()=>z$,\"animated_java.panel.keyframe.easing_type.options.circ\":()=>P$,\"animated_java.panel.keyframe.easing_type.options.cubic\":()=>N$,\"animated_java.panel.keyframe.easing_type.options.elastic\":()=>L$,\"animated_java.panel.keyframe.easing_type.options.expo\":()=>B$,\"animated_java.panel.keyframe.easing_type.options.linear\":()=>I$,\"animated_java.panel.keyframe.easing_type.options.quad\":()=>F$,\"animated_java.panel.keyframe.easing_type.options.quart\":()=>R$,\"animated_java.panel.keyframe.easing_type.options.quint\":()=>M$,\"animated_java.panel.keyframe.easing_type.options.sine\":()=>D$,\"animated_java.panel.keyframe.easing_type.title\":()=>S$,\"animated_java.panel.keyframe.execute_condition.description\":()=>k$,\"animated_java.panel.keyframe.execute_condition.title\":()=>E$,\"animated_java.panel.keyframe.function.description\":()=>w$,\"animated_java.panel.keyframe.function.title\":()=>y$,\"animated_java.panel.keyframe.keyframe_title\":()=>x$,\"animated_java.panel.keyframe.nonlinear_interpolation\":()=>tee,\"animated_java.panel.keyframe.repeat.description\":()=>A$,\"animated_java.panel.keyframe.repeat.title\":()=>j$,\"animated_java.panel.keyframe.repeat_frequency.description\":()=>C$,\"animated_java.panel.keyframe.repeat_frequency.title\":()=>T$,\"animated_java.panel.keyframe.variant.description\":()=>b$,\"animated_java.panel.keyframe.variant.title\":()=>v$,\"animated_java.panel.text_display.title\":()=>nee,\"animated_java.panel.vanilla_block_display.description\":()=>Fee,\"animated_java.panel.vanilla_block_display.title\":()=>Dee,\"animated_java.panel.vanilla_item_display.description\":()=>bee,\"animated_java.panel.vanilla_item_display.title\":()=>vee,\"animated_java.panel.variants.title\":()=>XQ,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":()=>i$,\"animated_java.panel.variants.tool.cannot_edit_default_variant\":()=>a$,\"animated_java.panel.variants.tool.create_new_variant\":()=>ZQ,\"animated_java.panel.variants.tool.delete_selected_variant\":()=>e$,\"animated_java.panel.variants.tool.duplicate_selected_variant\":()=>$Q,\"animated_java.panel.variants.tool.edit_variant\":()=>QQ,\"animated_java.panel.variants.tool.variant_not_visible\":()=>n$,\"animated_java.panel.variants.tool.variant_visible\":()=>t$,\"animated_java.plugin_dialog.incompatability_notice\":()=>vK,\"animated_java.popup.incompatability_popup.button.disable_all\":()=>_K,\"animated_java.popup.incompatability_popup.button.ignore\":()=>xK,\"animated_java.popup.incompatability_popup.description\":()=>hK,\"animated_java.popup.incompatability_popup.disable_button\":()=>gK,\"animated_java.popup.incompatability_popup.title\":()=>fK,\"animated_java.popup.installed_popup.close_button\":()=>mK,\"animated_java.popup.installed_popup.title\":()=>pK,\"animated_java.popup.loading.loading\":()=>cK,\"animated_java.popup.loading.offline\":()=>dK,\"animated_java.popup.loading.success\":()=>uK,\"animated_java.toast.invalid_rotations\":()=>Hee,\"animated_java.toast.invalid_rotations_post_1_21_6\":()=>Jee,\"animated_java.tool.item_display.item_display.description\":()=>wee,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":()=>Aee,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":()=>Tee,\"animated_java.tool.item_display.item_display.options.fixed\":()=>Iee,\"animated_java.tool.item_display.item_display.options.ground\":()=>Oee,\"animated_java.tool.item_display.item_display.options.gui\":()=>See,\"animated_java.tool.item_display.item_display.options.head\":()=>Cee,\"animated_java.tool.item_display.item_display.options.none\":()=>Eee,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":()=>kee,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":()=>jee,\"animated_java.tool.item_display.item_display.title\":()=>yee,\"animated_java.tool.text_display.background_color.description\":()=>oee,\"animated_java.tool.text_display.background_color.title\":()=>ree,\"animated_java.tool.text_display.copy_text.copied\":()=>xee,\"animated_java.tool.text_display.copy_text.description\":()=>_ee,\"animated_java.tool.text_display.copy_text.title\":()=>gee,\"animated_java.tool.text_display.line_width.description\":()=>aee,\"animated_java.tool.text_display.line_width.title\":()=>iee,\"animated_java.tool.text_display.see_through.description\":()=>hee,\"animated_java.tool.text_display.see_through.title\":()=>fee,\"animated_java.tool.text_display.text_alignment.description\":()=>uee,\"animated_java.tool.text_display.text_alignment.options.center\":()=>pee,\"animated_java.tool.text_display.text_alignment.options.left\":()=>dee,\"animated_java.tool.text_display.text_alignment.options.right\":()=>mee,\"animated_java.tool.text_display.text_alignment.title\":()=>cee,\"animated_java.tool.text_display.text_shadow.description\":()=>lee,\"animated_java.tool.text_display.text_shadow.title\":()=>see,\"animated_java.vanilla_item_display.title\":()=>Nee,default:()=>Qee});var VW=\"Animated Java\",zW=\"\\u0427\\u0435\\u0440\\u0442\\u0451\\u0436\",UW=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430\",qW=\"\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0430\\u0446\\u0438\\u044F\",HW=\"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0439\",JW=\"\\u041E \\u043D\\u0430\\u0441\",GW=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438\",WW=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430\",KW=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\",YW=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 (\\u041E\\u0442\\u043B\\u0430\\u0434\\u043A\\u0430)\",XW=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 \\u0432\\u0441\\u0435\\u0433\\u043E\",ZW=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432\\u0441\\u0435 \\u043E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044B\\u0435 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0438.\",QW=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 \\u0432\\u0441\\u0435\\u0433\\u043E (\\u041E\\u0442\\u043B\\u0430\\u0434\\u043A\\u0430)\",$W=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432\\u0441\\u0435 \\u043E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044B\\u0435 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0438 \\u0432 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0435 \\u043E\\u0442\\u043B\\u0430\\u0434\\u043A\\u0438.\",eK=\"\\u0418\\u0437\\u0432\\u043B\\u0435\\u0447\\u044C\",tK=\"\\u041F\\u043E\\u0434\\u0442\\u0432\\u0435\\u0440\\u0434\\u0438\\u0442\\u044C \\u0438\\u0437\\u0432\\u043B\\u0435\\u0447\\u0435\\u043D\\u0438\\u0435\",nK=\"\\u0414\\u043E\\u0431\\u0430\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",iK=\"\\u0414\\u043E\\u0431\\u0430\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",aK=\"\\u0414\\u043E\\u0431\\u0430\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435 \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",rK=\"\\u041A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0443 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438\",oK='\\u0421\\u043A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u0430 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438\\u0437 \"{0}\"',sK=\"\\u0412\\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u044C \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0443 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438\",lK='\\u0412\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u0430 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438\\u0437 \"{0}\"',cK=\"\\u0417\\u0430\\u0433\\u0440\\u0443\\u0437\\u043A\\u0430 Animated Java...\",uK=\"Animated Java \\u0437\\u0430\\u0433\\u0440\\u0443\\u0436\\u0435\\u043D\\u0430 \\u0443\\u0441\\u043F\\u0435\\u0448\\u043D\\u043E!\",dK=`Animated Java \\u043D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u043F\\u043E\\u0434\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C!\n\\u041D\\u0435\\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0439 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u043E\\u043D\\u0430\\u043B \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043D\\u0435\\u0434\\u043E\\u0441\\u0442\\u0443\\u043F\\u0435\\u043D.`,pK=\"\\u0421\\u043F\\u0430\\u0441\\u0438\\u0431\\u043E \\u0437\\u0430 \\u0443\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043A\\u0443!\",mK=\"\\u041D\\u0430\\u0447\\u043D\\u0451\\u043C \\u0430\\u043D\\u0438\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C!\",fK=\"Animated Java \\u041E\\u0431\\u043D\\u0430\\u0440\\u0443\\u0436\\u0435\\u043D\\u0430 \\u043D\\u0435\\u0441\\u043E\\u0432\\u043C\\u0435\\u0441\\u0442\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C\",hK=`\\u0423 \\u0432\\u0430\\u0441 \\u0443\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u044B \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D\\u044B \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0432\\u044B\\u0437\\u044B\\u0432\\u0430\\u044E\\u0442 \\u043F\\u0440\\u043E\\u0431\\u043B\\u0435\\u043C\\u044B \\u0441 Animated Java.\n\\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u043E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u0435 \\u0438\\u043B\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u0435 \\u044D\\u0442\\u0438 \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D(\\u044B) \\u0438 \\u043F\\u0435\\u0440\\u0435\\u0437\\u0430\\u043F\\u0443\\u0441\\u0442\\u0438\\u0442\\u0435 Blockbench \\u0447\\u0442\\u043E\\u0431\\u044B \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C Animated Java:`,gK=\"\\u041E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D\",_K=\"\\u041E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u044C \\u0432\\u0441\\u0435 \\u043D\\u0435\\u0441\\u043E\\u0432\\u043C\\u0435\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D\\u044B\",xK=\"\\u0418\\u0433\\u043D\\u043E\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0438 \\u043F\\u0440\\u043E\\u0434\\u043E\\u043B\\u0436\\u0438\\u0442\\u044C (\\u041D\\u0435 \\u0420\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0443\\u0435\\u0442\\u0441\\u044F)\",vK=`\\u042D\\u0442\\u043E\\u0442 \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D \\u0432\\u044B\\u0437\\u044B\\u0432\\u0430\\u0435\\u0442 \\u043F\\u0440\\u043E\\u0431\\u043B\\u0435\\u043C\\u044B \\u0441 Animated Java.\n\n\\u0412\\u044B \\u043D\\u0435 \\u0441\\u043C\\u043E\\u0436\\u0435\\u0442\\u0435 \\u0443\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u0438\\u0442\\u044C \\u044D\\u0442\\u043E\\u0442 \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D \\u043F\\u043E\\u043A\\u0430 Animated Java \\u0443\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D.`,bK=\"\\u0421\\u0431\\u0440\\u043E\\u0441 \\u043A \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430\\u043C \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E\",yK=\"\\u041F\\u0440\\u043E Animated Java\",wK=\"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",EK=\"Animated Java \\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0439\",kK=\"\\u041F\\u0440\\u043E\\u0438\\u0437\\u043E\\u0448\\u043B\\u0430 \\u043D\\u0435\\u043F\\u0440\\u0435\\u0434\\u0432\\u0438\\u0434\\u0435\\u043D\\u043D\\u0430\\u044F \\u043E\\u0448\\u0438\\u0431\\u043A\\u0430!\",jK=\"\\u0417\\u0430\\u043A\\u0440\\u044B\\u0442\\u044C\",AK=\"\\u0421\\u043E\\u043E\\u0431\\u0449\\u0435\\u043D\\u0438\\u0435 \\u0441 \\u043E\\u0448\\u0438\\u0431\\u043A\\u043E\\u0439 \\u0441\\u043A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043E \\u0432 \\u0431\\u0443\\u0444\\u0435\\u0440 \\u043E\\u0431\\u043C\\u0435\\u043D\\u0430!\",TK=\"\\u041D\\u0430\\u0436\\u043C\\u0438\\u0442\\u0435 \\u0447\\u0442\\u043E\\u0431\\u044B \\u0441\\u043A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0441\\u043E\\u043E\\u0431\\u0449\\u0435\\u043D\\u0438\\u0435 \\u0441 \\u043E\\u0448\\u0438\\u0431\\u043A\\u043E\\u0439.\",CK=\"\\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0441\\u043E\\u043E\\u0431\\u0449\\u0438\\u0442\\u0435 \\u043E\\u0431 \\u044D\\u0442\\u043E\\u0439 \\u043E\\u0448\\u0438\\u0431\\u043A\\u0435 \\u0432 \\u043D\\u0430\\u0448\\u0435\\u043C {0} \\u0438 \\u0441\\u043E\\u0437\\u0434\\u0430\\u0439\\u0442\\u0435 \\u0442\\u0438\\u043A\\u0435\\u0442 \\u0432 #animated-java-support \\u043A\\u0430\\u043D\\u0430\\u043B\\u0435, \\u0438\\u043B\\u0438 \\u0441\\u043E\\u0437\\u0434\\u0430\\u0432 \\u0437\\u0430\\u0434\\u0430\\u0447\\u0443 \\u043D\\u0430 \\u043D\\u0430\\u0448\\u0435\\u043C {1}. \\u0421\\u043F\\u0430\\u0441\\u0438\\u0431\\u043E!\",SK=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430\",OK=\"\\u041F\\u0440\\u043E\\u0435\\u043A\\u0442\",IK=\"\\u041F\\u0440\\u043E\\u0434\\u0432\\u0438\\u043D\\u0443\\u0442\\u044B\\u0435 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0431\\u044B\\u0442\\u044C \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u044B \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043F\\u0440\\u0438 \\u043D\\u0435\\u043E\\u0431\\u0445\\u043E\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u0438!\",DK=\"\\u041D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u0435\",FK=`\\u0418\\u043C\\u044F \\u0444\\u0430\\u0439\\u043B\\u0430 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430.\n\n\\u042D\\u0442\\u043E \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043F\\u0435\\u0440\\u0435\\u0437\\u0430\\u043F\\u0438\\u0441\\u0430\\u043D\\u043E, \\u0435\\u0441\\u043B\\u0438 \\u0432\\u044B \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u0438\\u0442\\u0435 \\u0447\\u0435\\u0440\\u0442\\u0451\\u0436 \\u043F\\u043E \\u0434\\u0440\\u0443\\u0433\\u0438\\u043C \\u0438\\u043C\\u0435\\u043D\\u0435\\u043C.`,NK=\"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0422\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B\",RK=`\\u0420\\u0430\\u0437\\u0440\\u0435\\u0448\\u0435\\u043D\\u0438\\u0435 \\u0440\\u0435\\u0434\\u0430\\u043A\\u0442\\u043E\\u0440\\u0430 UV.\n\n\\u042D\\u0442\\u043E \\u0434\\u043E\\u043B\\u0436\\u043D\\u043E \\u0441\\u043E\\u043E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u043E\\u0432\\u0430\\u0442\\u044C \\u0440\\u0430\\u0437\\u043C\\u0435\\u0440\\u0443 \\u0441\\u0430\\u043C\\u043E\\u0439 \\u0431\\u043E\\u043B\\u044C\\u0448\\u043E\\u0439 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u0432 \\u0432\\u0430\\u0448\\u0435\\u043C \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0435.`,MK=\"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0422\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0431\\u044B\\u0442\\u044C \\u043A\\u0432\\u0430\\u0434\\u0440\\u0430\\u0442\\u043D\\u044B\\u043C!\",BK=\"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0431\\u044B\\u0442\\u044C \\u0441\\u0442\\u0435\\u043F\\u0435\\u043D\\u044C\\u044E \\u0447\\u0438\\u0441\\u043B\\u0430 2, \\u0435\\u0441\\u043B\\u0438 \\u044D\\u0442\\u043E \\u0432\\u043E\\u0437\\u043C\\u043E\\u0436\\u043D\\u043E!\",PK=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0422\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u043D\\u0435 \\u0441\\u043E\\u043E\\u0442\\u0432\\u0435\\u0442\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442 \\u0440\\u0430\\u0437\\u043C\\u0435\\u0440\\u0443 \\u0441\\u0430\\u043C\\u043E\\u0439 \\u0431\\u043E\\u043B\\u044C\\u0448\\u043E\\u0439 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u0432 \\u0432\\u0430\\u0448\\u0435\\u043C \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0435!\",LK=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\",VK=\"\\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0435\\u043D\",zK=`\\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D \\u043A\\u043E\\u0442\\u043E\\u0440\\u043E\\u0435 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u043E \\u043F\\u0440\\u0438 \\u0433\\u0435\\u043D\\u0435\\u0440\\u0430\\u0446\\u0438\\u0438 \\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430 \\u0438 \\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0430.\n\n\\u0420\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u043E\\u0432\\u0430\\u043D\\u043E \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0443\\u043D\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D \\u0447\\u0442\\u043E\\u0431\\u044B \\u0438\\u0437\\u0431\\u0435\\u0436\\u0430\\u0442\\u044C \\u043A\\u043E\\u043D\\u0444\\u043B\\u0438\\u043A\\u0442\\u043E\\u0432 \\u0441 \\u0434\\u0440\\u0443\\u0433\\u0438\\u043C\\u0438 \\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430\\u043C\\u0438 \\u0438 \\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0430\\u043C\\u0438.`,UK=\"\\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u043D\\u0435 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u0443\\u0441\\u0442\\u044B\\u043C!\",qK='\\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \"{0}\" \\u0437\\u0430\\u0440\\u0435\\u0437\\u0435\\u0440\\u0432\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043E \\u0434\\u043B\\u044F \\u0432\\u043D\\u0443\\u0442\\u0440\\u0435\\u043D\\u043D\\u0435\\u0439 \\u0440\\u0430\\u0431\\u043E\\u0442\\u044B \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D\\u0430! \\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0432\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 \\u0434\\u0440\\u0443\\u0433\\u043E\\u0435 \\u043F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D.',HK=\"\\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E \\u0438\\u043C\\u0451\\u043D \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u0438\\u043C\\u0435\\u0435\\u0442 \\u0437\\u0430\\u043F\\u0440\\u0435\\u0449\\u0451\\u043D\\u043D\\u044B\\u0435 \\u0441\\u0438\\u043C\\u0432\\u043E\\u043B\\u044B! \\u041F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u0430 \\u0438\\u043C\\u0451\\u043D \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044C \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0431\\u0443\\u043A\\u0432\\u044B, \\u0446\\u0438\\u0444\\u0440\\u044B \\u0438 \\u043D\\u0438\\u0436\\u043D\\u0438\\u0435 \\u043F\\u043E\\u0434\\u0447\\u0451\\u0440\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F.\",JK=\"\\u041F\\u043E\\u043A\\u0430\\u0437\\u0430\\u0442\\u044C \\u041E\\u0431\\u043B\\u0430\\u0441\\u0442\\u044C \\u0420\\u0435\\u043D\\u0434\\u0435\\u0440\\u0430\",GK=\"\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u0442 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440 \\u043A\\u043E\\u0440\\u043E\\u0431\\u043A\\u0443 \\u0432 \\u0440\\u0435\\u0434\\u0430\\u043A\\u0442\\u043E\\u0440\\u0435.\",WK=\"\\u0410\\u0432\\u0442\\u043E-\\u0440\\u0430\\u0437\\u043C\\u0435\\u0440 \\u041E\\u0431\\u043B\\u0430\\u0441\\u0442\\u0438 \\u0420\\u0435\\u043D\\u0434\\u0435\\u0440\\u0430\",KK=\"\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, \\u043E\\u0431\\u043B\\u0430\\u0441\\u0442\\u044C \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u0430 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0430\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438 \\u0440\\u0430\\u0441\\u0441\\u0447\\u0438\\u0442\\u044B\\u0432\\u0430\\u0442\\u044C\\u0441\\u044F \\u043D\\u0430 \\u043E\\u0441\\u043D\\u043E\\u0432\\u0435 \\u0433\\u0435\\u043E\\u043C\\u0435\\u0442\\u0440\\u0438\\u0438 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438.\",YK=\"\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u041E\\u0431\\u043B\\u0430\\u0441\\u0442\\u0438 \\u0420\\u0435\\u043D\\u0434\\u0435\\u0440\\u0430\",XK=\"[\\u0420\\u0430\\u0437\\u043C\\u0435\\u0440 \\u0438 \\u0412\\u044B\\u0441\\u043E\\u0442\\u0430](https://minecraft.wiki/w/Display#Entity_data) \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0435\\u0439 \\u0440\\u0438\\u0433\\u0430.\",ZK=\"\\u041E\\u0431\\u043B\\u0430\\u0441\\u0442\\u044C \\u043E\\u0431\\u0437\\u043E\\u0440\\u0430\",QK=\"[\\u041E\\u0431\\u043B\\u0430\\u0441\\u0442\\u044C \\u043E\\u0431\\u0437\\u043E\\u0440\\u0430](https://minecraft.wiki/w/Display#Entity_data) \\u0440\\u0438\\u0433\\u0430 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E.\",$K=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u041F\\u043B\\u0430\\u0433\\u0438\\u043D\\u0430\",eY=\"\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D \\u043A\\u0430\\u043A JSON \\u0444\\u0430\\u0439\\u043B \\u0441\\u043F\\u0435\\u0446\\u0438\\u0430\\u043B\\u044C\\u043D\\u043E \\u0434\\u043B\\u044F \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u0438\\u044F \\u043F\\u043B\\u0430\\u0433\\u0438\\u043D\\u0430\\u043C\\u0438.\",tY=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430\",nY=\"\\u041F\\u0430\\u043F\\u043A\\u0430\",iY=\"Zip \\u0410\\u0440\\u0445\\u0438\\u0432\",aY=\"\\u041D\\u0438\\u0447\\u0435\\u0433\\u043E\",rY=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0430\",oY=\"\\u041F\\u0430\\u043F\\u043A\\u0430\",sY=\"Zip \\u0410\\u0440\\u0445\\u0438\\u0432\",lY=\"\\u041D\\u0438\\u0447\\u0435\\u0433\\u043E\",cY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442 \\u0432\\u0435\\u0440\\u0441\\u0438\\u044F\",uY=`\\u0412\\u0435\\u0440\\u0441\\u0438\\u044F \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442\\u0430 \\u0434\\u043B\\u044F \\u043A\\u043E\\u0442\\u043E\\u0440\\u043E\\u0439 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442.\n\n\\u0415\\u0441\\u043B\\u0438 \\u0432\\u0435\\u0440\\u0441\\u0438\\u044F \\u043A\\u043E\\u0442\\u043E\\u0440\\u0443\\u044E \\u0432\\u044B \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0435 \\u043D\\u0435\\u0434\\u043E\\u0441\\u0442\\u0443\\u043F\\u043D\\u0430, \\u0432\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 \\u0431\\u043B\\u0438\\u0436\\u0430\\u0439\\u0448\\u0443\\u044E \\u0432\\u0435\\u0440\\u0441\\u0438\\u044E \\u043D\\u0438\\u0436\\u0435 \\u043D\\u0443\\u0436\\u043D\\u043E\\u0439.\n\n\\u0422.\\u0435 \\u0415\\u0441\\u043B\\u0438 \\u0432\\u044B \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0435 \\`1.21.8\\`, \\u0432\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 \\`1.21.5\\`.\n\n\\u041D\\u0435\\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0438 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0431\\u044B\\u0442\\u044C \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B, \\u0438\\u043B\\u0438 \\u043D\\u0435\\u0434\\u043E\\u0441\\u0442\\u0443\\u043F\\u043D\\u044B \\u0432 \\u0437\\u0430\\u0432\\u0438\\u0441\\u0438\\u043C\\u043E\\u0441\\u0442\\u0438 \\u043E\\u0442 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u0432\\u0435\\u0440\\u0441\\u0438\\u0438.\n\nAnimated Java \\u0443\\u0432\\u0435\\u0434\\u043E\\u043C\\u0438\\u0442 \\u0432\\u0430\\u0441 \\u043E \\u043B\\u044E\\u0431\\u044B\\u0445 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F\\u0445, \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0432\\u043E\\u0441\\u0442\\u0440\\u0435\\u0431\\u043E\\u0432\\u0430\\u043D\\u044B.`,dY=\"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\",pY=\"\\u041F\\u0440\\u043E\\u0434\\u0432\\u0438\\u043D\\u0443\\u0442\\u044B\\u0435 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438\",mY=\"\\u041F\\u0440\\u043E\\u0434\\u0432\\u0438\\u043D\\u0443\\u0442\\u044B\\u0435 \\u043F\\u0430\\u043F\\u043A\\u0438\",fY=\"\\u041F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439\",hY=`\\u041F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u043C\\u044B\\u0439 \\u0434\\u043B\\u044F \\u043C\\u043E\\u0434\\u0435\\u043B\\u0435\\u0439 \\u0440\\u0438\\u0433\\u0430.\n\n\\u041C\\u043D\\u043E\\u0436\\u0435\\u0441\\u0442\\u0432\\u043E \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0435\\u0439 \\u0432 \\u043E\\u0434\\u043D\\u043E\\u043C \\u0438 \\u0442\\u043E\\u043C \\u0436\\u0435 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u0435 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u043E\\u0434\\u0438\\u043D \\u0438 \\u0442\\u043E\\u0442 \\u0436\\u0435 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442, \\u0438 \\u043E\\u043D\\u0438 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0430\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438 \\u043E\\u0431\\u044A\\u0435\\u0434\\u0438\\u043D\\u0435\\u043D\\u044B \\u043F\\u0440\\u0438 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0435.`,gY=\"\\u041D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442!\",_Y=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0439 ID \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u0430! ID \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u043E\\u0432 \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0431\\u044B\\u0442\\u044C \\u0432 \\u0444\\u043E\\u0440\\u043C\\u0430\\u0442\\u0435`namespace:item_id`.\",xY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0439 ID \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u0430! ID \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u043E\\u0432 \\u043D\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044C \\u043F\\u0440\\u043E\\u0431\\u0435\\u043B\\u043E\\u0432.\",vY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442 \\u0432 \\u0432\\u0430\\u043D\\u0438\\u043B\\u044C\\u043D\\u043E\\u0439 \\u0438\\u0433\\u0440\\u0435!\",bY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u043D\\u0435 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442 `minecraft:item/generated` \\u0432 \\u0444\\u043E\\u0440\\u043C\\u0435 \\u0441\\u0432\\u043E\\u0435\\u0433\\u043E \\u0440\\u043E\\u0434\\u0438\\u0442\\u0435\\u043B\\u044F. \\u042D\\u0442\\u043E \\u043C\\u043E\\u0436\\u0435\\u0442 \\u043F\\u0440\\u0438\\u0432\\u0435\\u0441\\u0442\\u0438 \\u043A \\u043F\\u0440\\u043E\\u0431\\u043B\\u0435\\u043C\\u0430\\u043C \\u0432 \\u0438\\u0433\\u0440\\u0435.\",yY=`\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u043D\\u0435 \\u0438\\u043C\\u0435\\u0435\\u0442 \\u0444\\u0430\\u0439\\u043B\\u0430 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0432 \\u0432\\u0430\\u043D\\u0438\\u043B\\u044C\\u043D\\u043E\\u043C \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0435!\n\n\\u0415\\u0441\\u043B\\u0438 \\u0432\\u044B \\u043F\\u0440\\u0435\\u0434\\u043F\\u043E\\u043B\\u0430\\u0433\\u0430\\u0435\\u0442\\u0435, \\u0447\\u0442\\u043E \\u044D\\u0442\\u043E \\u043E\\u0448\\u0438\\u0431\\u043A\\u0430, \\u043F\\u043E\\u043F\\u0440\\u043E\\u0431\\u0443\\u0439\\u0442\\u0435 \\u043F\\u0435\\u0440\\u0435\\u0437\\u0430\\u043F\\u0443\\u0441\\u0442\\u0438\\u0442\\u044C Blockbench, \\u0438 \\u043F\\u043E\\u0434\\u043E\\u0436\\u0434\\u0430\\u0442\\u044C \\u043F\\u043E\\u043A\\u0430 \\u0437\\u0430\\u0433\\u0440\\u0443\\u0437\\u043A\\u0430 AJ \\u043F\\u0440\\u043E\\u043F\\u0430\\u0434\\u0451\\u0442 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u043E\\u0442\\u043A\\u0440\\u044B\\u0442\\u0438\\u0435\\u043C \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430.`,wY=\"CMD \\u0421\\u043C\\u0435\\u0449\\u0435\\u043D\\u0438\\u0435\",EY=\"\\u0421\\u043C\\u0435\\u0449\\u0430\\u0435\\u0442 Custom Model Data (CMD) \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u044F \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0432 \\u043F\\u0440\\u0435\\u0434\\u0438\\u043A\\u0430\\u0442\\u0430\\u0445 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F \\u043D\\u0430 \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u043E\\u0435 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435.\",kY=\"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\",jY=\"\\u041E\\u0441\\u043D\\u043E\\u0432\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430 \\u0434\\u043B\\u044F \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430.\\n\\n\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0438\\u043C\\u0435\\u0442\\u044C \\u0444\\u0430\\u0439\\u043B `pack.mcmeta`.\",AY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A \\u043D\\u0435 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043F\\u0430\\u043F\\u043A\\u0443 `assets`!\",TY=\"\\u041F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u0430!\",CY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442!\",SY=\"\\u0423\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0443\\u0442\\u044C \\u043D\\u0435 \\u044F\\u0432\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F \\u043F\\u0430\\u043F\\u043A\\u043E\\u0439!\",OY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u0444\\u0430\\u0439\\u043B pack.mcmeta!\",IY=\"\\u0420\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A Zip \\u0410\\u0440\\u0445\\u0438\\u0432\",DY=\"\\u041F\\u0443\\u0442\\u044C \\u043A .zip \\u0430\\u0440\\u0445\\u0438\\u0432\\u0443 \\u0434\\u043B\\u044F \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430.\",FY=\"\\u0424\\u0430\\u0439\\u043B \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D!\",NY=\"\\u0423\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0443\\u0442\\u044C \\u043D\\u0435 \\u044F\\u0432\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F \\u0444\\u0430\\u0439\\u043B\\u043E\\u043C!\",RY=\"\\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\",MY=\"\\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\",BY=\"\\u041E\\u0441\\u043D\\u043E\\u0432\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0430 \\u0434\\u043B\\u044F \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430.\\n\\n\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0434\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0438\\u043C\\u0435\\u0442\\u044C \\u0444\\u0430\\u0439\\u043B `pack.mcmeta`.\",PY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0434\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A \\u043D\\u0435 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043F\\u0430\\u043F\\u043A\\u0443 `data`!\",LY=\"\\u041F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u0430!\",VY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442!\",zY=\"\\u0423\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0443\\u0442\\u044C \\u043D\\u0435 \\u044F\\u0432\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F \\u043F\\u0430\\u043F\\u043A\\u043E\\u0439!\",UY=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u0430\\u044F \\u043F\\u0430\\u043F\\u043A\\u0430 \\u043D\\u0435 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u0444\\u0430\\u0439\\u043B pack.mcmeta!\",qY=\"\\u0414\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A Zip \\u0410\\u0440\\u0445\\u0438\\u0432\",HY=\"\\u041F\\u0443\\u0442\\u044C \\u043A .zip \\u0430\\u0440\\u0445\\u0438\\u0432\\u0443 \\u0434\\u043B\\u044F \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430.\",JY=\"\\u0424\\u0430\\u0439\\u043B \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D!\",GY=\"\\u0423\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0443\\u0442\\u044C \\u043D\\u0435 \\u044F\\u0432\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F \\u0444\\u0430\\u0439\\u043B\\u043E\\u043C!\",WY=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435\",KY=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",YY=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0435\\u043D\\u0438\\u0438\",XY=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043F\\u0440\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0435\\u043D\\u0438\\u0438.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",ZY=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u0434\\u043E \\u0442\\u0438\\u043A\\u0430\",QY=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 *\\u043F\\u0435\\u0440\\u0435\\u0434* \\u0442\\u0438\\u043A \\u043B\\u043E\\u0433\\u0438\\u043A\\u043E\\u0439 Animated Java.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",$Y=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u043E\\u0441\\u043B\\u0435 \\u0442\\u0438\\u043A\\u0430\",eX=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 *\\u043F\\u043E\\u0441\\u043B\\u0435* \\u0442\\u0438\\u043A \\u043B\\u043E\\u0433\\u0438\\u043A\\u0438 Animated Java.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",tX=\"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C \\u0418\\u043D\\u0442\\u0435\\u0440\\u043F\\u043E\\u043B\\u044F\\u0446\\u0438\\u0438\",nX=`[\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C \\u0438\\u043D\\u0442\\u0435\\u0440\\u043F\\u043E\\u043B\\u044F\\u0446\\u0438\\u0438](https://minecraft.wiki/w/Display#Entity_data) \\u0440\\u0438\\u0433\\u0430 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E.\n\n\\u0427\\u0435\\u043C \\u0432\\u044B\\u0448\\u0435 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043C \\u043F\\u043B\\u0430\\u0432\\u043D\\u0435\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F, \\u043D\\u043E \\u043C\\u0435\\u043D\\u044C\\u0448\\u0435 \\u043E\\u0442\\u0437\\u044B\\u0432\\u0447\\u0438\\u0432\\u043E\\u0441\\u0442\\u044C.`,iX=\"\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C \\u0422\\u0435\\u043B\\u0435\\u043F\\u043E\\u0440\\u0442\\u0430\\u0446\\u0438\\u0438\",aX=`[\\u0414\\u043B\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043B\\u0435\\u043F\\u043E\\u0440\\u0442\\u0430\\u0446\\u0438\\u0438](https://minecraft.wiki/w/Display#Entity_data) \\u0440\\u0438\\u0433\\u0430 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E.\n\n\\u0427\\u0435\\u043C \\u0432\\u044B\\u0448\\u0435 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043C \\u043F\\u043B\\u0430\\u0432\\u043D\\u0435\\u0435 \\u043A\\u0440\\u0443\\u043F\\u043D\\u044B\\u0435 \\u0434\\u0432\\u0438\\u0436\\u0435\\u043D\\u0438\\u044F, \\u043D\\u043E \\u043C\\u0435\\u043D\\u044C\\u0448\\u0435 \\u043E\\u0442\\u0437\\u044B\\u0432\\u0447\\u0438\\u0432\\u043E\\u0441\\u0442\\u044C.`,rX=\"\\u0410\\u0432\\u0442\\u043E\\u043E\\u0431\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435 \\u043E\\u0440\\u0438\\u0435\\u043D\\u0442\\u0430\\u0446\\u0438\\u0438 \\u0440\\u0438\\u0433\\u0430\",oX=`\\u041A\\u043E\\u0433\\u0434\\u0430 **\\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E**, \\u0441\\u0438\\u043D\\u0445\\u0440\\u043E\\u043D\\u0438\\u0437\\u0438\\u0440\\u0443\\u0435\\u0442 \\u043F\\u043E\\u0437\\u0438\\u0446\\u0438\\u0438 \\u0438 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442\\u044B \\u0432\\u0441\\u0435\\u0445 \\u043D\\u043E\\u0434\\u043E\\u0432\\u044B\\u0445 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0435\\u0439 \\u0441 \\u043A\\u043E\\u0440\\u043D\\u0435\\u0432\\u043E\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u044C\\u044E \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0438\\u043A.\n\\u041F\\u043E\\u0437\\u0432\\u043E\\u043B\\u044F\\u0435\\u0442 \\u043F\\u0440\\u043E\\u0441\\u0442\\u043E \\u0442\\u0435\\u043B\\u0435\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u044C \\u0447\\u0442\\u043E\\u0431\\u044B \\u043F\\u0435\\u0440\\u0435\\u043C\\u0435\\u0449\\u0430\\u0442\\u044C \\u0440\\u0438\\u0433.\n\n\\u041A\\u043E\\u0433\\u0434\\u0430 **\\u0432\\u044B\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E**, \\u0432\\u0430\\u043C \\u0441\\u0442\\u043E\\u0438\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C move \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u044E \\u0434\\u043B\\u044F \\u043F\\u0435\\u0440\\u0435\\u043C\\u0435\\u0449\\u0435\\u043D\\u0438\\u044F \\u0440\\u0438\\u0433\\u0430:\n\n\\`\\`\\`\nexecute as @e[tag=aj.<\\u043F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E_\\u0438\\u043C\\u0451\\u043D>_root] \\\\\n    positioned <x> <y> <z> rotated <yaw> <pitch> run \\\\\n    function animated_java:<\\u043F\\u0440\\u043E\\u0441\\u0442\\u0440\\u0430\\u043D\\u0441\\u0442\\u0432\\u043E_\\u0438\\u043C\\u0451\\u043D>/move\n\\`\\`\\`\n\n\\u0421\\u0438\\u043D\\u0445\\u0440\\u043E\\u043D\\u0438\\u0437\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u043F\\u043E\\u0437\\u0438\\u0446\\u0438\\u0438 \\u0438 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442\\u044B \\u043D\\u043E\\u0434\\u043E\\u0432 \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0438\\u043A \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0434\\u0430\\u0432\\u0430\\u0442\\u044C \\u043D\\u0430\\u0433\\u0440\\u0443\\u0437\\u043A\\u0443, \\u043E\\u0441\\u043E\\u0431\\u0435\\u043D\\u043D\\u043E \\u0434\\u043B\\u044F \\u0431\\u043E\\u043B\\u044C\\u0448\\u0438\\u0445 \\u0440\\u0438\\u0433\\u043E\\u0432.\n\\u041E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u0438\\u0435 \\u044D\\u0442\\u043E\\u0433\\u043E \\u043F\\u0430\\u0440\\u0430\\u043C\\u0435\\u0442\\u0440\\u0430 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0443\\u043B\\u0443\\u0447\\u0448\\u0438\\u0442\\u044C \\u043F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0441\\u0442\\u044C \\u0436\\u0435\\u0440\\u0442\\u0432\\u0443\\u044F \\u0443\\u0434\\u043E\\u0431\\u0441\\u0442\\u0432\\u043E\\u043C.`,sX=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0445\\u0440\\u0430\\u043D\\u0438\\u043B\\u0438\\u0449\\u0435 \\u0434\\u043B\\u044F \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438\",lX=`\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, NBT \\u0445\\u0440\\u0430\\u043D\\u0438\\u043B\\u0438\\u0449\\u0435 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u043E \\u0434\\u043B\\u044F \\u0445\\u0440\\u0430\\u043D\\u0435\\u043D\\u0438\\u044F \\u0434\\u0430\\u043D\\u043D\\u044B\\u0445 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438 \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0439.\n\n\\u042D\\u0442\\u043E \\u0437\\u043D\\u0430\\u0447\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u0443\\u043C\\u0435\\u043D\\u044C\\u0448\\u0430\\u0435\\u0442 \\u043A\\u043E\\u043B\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043E \\u0444\\u0430\\u0439\\u043B\\u043E\\u0432 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u043E\\u0433\\u043E \\u0434\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0430, \\u0431\\u0443\\u0434\\u0443\\u0447\\u0438 \\u0432 \\u0440\\u0430\\u0437\\u044B \\u043C\\u0435\\u043D\\u0435\\u0435 \\u043F\\u0440\\u043E\\u0438\\u0437\\u0432\\u043E\\u0434\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u044B\\u043C.`,cX=\"\\u0417\\u0430\\u043F\\u0435\\u0447\\u0451\\u043D\\u043D\\u044B\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438\",uX=`\\u0417\\u0430\\u043F\\u0435\\u043A\\u0430\\u0442\\u044C \\u0438\\u043B\\u0438 \\u043D\\u0435\\u0442 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438.\n\\u0417\\u0430\\u043F\\u0435\\u0447\\u0451\\u043D\\u043D\\u044B\\u0435 \\u043A\\u0430\\u0434\\u0440\\u044B \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0439 \\u0437\\u0430\\u0440\\u0430\\u043D\\u0435\\u0435 \\u043E\\u0431\\u0440\\u0430\\u0431\\u0430\\u0442\\u044B\\u0432\\u0430\\u044E\\u0442\\u0441\\u044F \\u0438 \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u044F\\u044E\\u0442\\u0441\\u044F \\u0432 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439 JSON \\u0444\\u0430\\u0439\\u043B, \\u0443\\u043C\\u0435\\u043D\\u044C\\u0448\\u0430\\u044F \\u0441\\u043B\\u043E\\u0436\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u0430 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0432 \\u0438\\u0433\\u0440\\u0435.\n\\u041D\\u0435\\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u041F\\u043B\\u0430\\u0433\\u0438\\u043D\\u044B \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0442\\u0440\\u0435\\u0431\\u043E\\u0432\\u0430\\u0442\\u044C \\u044D\\u0442\\u0443 \\u043E\\u043F\\u0446\\u0438\\u044E \\u0447\\u0442\\u043E\\u0431\\u044B \\u0440\\u0430\\u0431\\u043E\\u0442\\u0430\\u0442\\u044C \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u044C\\u043D\\u043E.`,dX=\"JSON \\u0424\\u0430\\u0439\\u043B\",pX=\"\\u041F\\u0443\\u0442\\u044C \\u043A JSON \\u0444\\u0430\\u0439\\u043B\\u0443 \\u0434\\u043B\\u044F \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430.\",mX=\"\\u0424\\u0430\\u0439\\u043B \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D!\",fX=\"\\u0423\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0439 \\u043F\\u0443\\u0442\\u044C \\u043D\\u0435 \\u044F\\u0432\\u043B\\u044F\\u0435\\u0442\\u0441\\u044F \\u0444\\u0430\\u0439\\u043B\\u043E\\u043C!\",hX='\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0434\\u043B\\u044F \"{0}\"',gX=\"\\u041D\\u043E\\u0434\",_X=\"\\u0414\\u043B\\u044F \\u043A\\u0430\\u0436\\u0434\\u043E\\u0433\\u043E \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430\",xX=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435\",vX=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",bX=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0438\",yX=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043F\\u0440\\u0438 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `.mcfunction` \\u0444\\u0430\\u0439\\u043B.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",wX=\"\\u0418\\u043C\\u044F\",EX=\"\\u041F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u043E\\u0435 \\u0438\\u043C\\u044F \\u043D\\u043E\\u0434\\u0430.\",kX=`\\u041D\\u0435\\u0432\\u0435\\u0440\\u043D\\u044B\\u0439 JSON \\u0442\\u0435\\u043A\\u0441\\u0442!\n{0}`,jX=\"\\u0412\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438\",AX=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438.\",TX=\"\\u0421\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u0435\",CX=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u0435 \\u043D\\u043E\\u0434\\u0430 \\u0432 \\u0438\\u0433\\u0440\\u0435.\",SX=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u0446\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F\",OX=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u0446\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F.\",IX=\"\\u0426\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F\",DX=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u043E\\u043A\\u0440\\u0430\\u0441 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F \\u043D\\u043E\\u0434\\u0430.\",FX=\"\\u0420\\u0430\\u0434\\u0438\\u0443\\u0441 \\u0442\\u0435\\u043D\\u0438\",NX=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441 \\u0442\\u0435\\u043D\\u0438.\",RX=\"\\u0418\\u043D\\u0442\\u0435\\u043D\\u0441\\u0438\\u0432\\u043D\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043D\\u0438\",MX=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0438\\u043D\\u0442\\u0435\\u043D\\u0441\\u0438\\u0432\\u043D\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043D\\u0438.\",BX=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0430\\u044F \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",PX=\"\\u0423\\u0441\\u0442\\u0430\\u043D\\u0430\\u0432\\u043B\\u0438\\u0432\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u043D\\u043E\\u0434\\u0430.\",LX=\"\\u042F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",VX=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u043D\\u043E\\u0434\\u0430. \\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u043E \\u0431\\u044B\\u0442\\u044C \\u043E\\u0442 0 \\u0434\\u043E 15.\",zX=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",UX=\"\\u0423\\u0441\\u0442\\u0430\\u043D\\u0430\\u0432\\u043B\\u0438\\u0432\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u043D\\u043E\\u0434\\u0430..\",qX=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0430\\u044F \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",HX=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u043D\\u043E\\u0434\\u0430. \\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u043E \\u0431\\u044B\\u0442\\u044C \\u043E\\u0442 0 \\u0434\\u043E 15.\",JX=\"\\u0417\\u0430\\u0447\\u0430\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439\",GX=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0431\\u043B\\u0435\\u0441\\u043A \\u0437\\u0430\\u0447\\u0430\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043D\\u043E\\u0434\\u0430.\",WX=\"\\u041D\\u0435\\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C\",KX=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u043D\\u043E\\u0434\\u0430 \\u0432 \\u0438\\u0433\\u0440\\u0435.\",YX=\"\\u0411\\u0438\\u043B\\u0431\\u043E\\u0440\\u0434\",XX=`\\u041D\\u0430\\u0441\\u0442\\u0440\\u0430\\u0438\\u0432\\u0430\\u0435\\u0442 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u043A \\u0432\\u0437\\u0433\\u043B\\u044F\\u0434\\u0443 \\u0438\\u0433\\u0440\\u043E\\u043A\\u0430 \\u043F\\u0440\\u0438 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u0435.\n- **\\u0424\\u0438\\u043A\\u0441\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439**: \\u0412\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u044B\\u0435 \\u0438 \\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u044B\\u0435 \\u043E\\u0441\\u0438 \\u0444\\u0438\\u043A\\u0441\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u044B.\n- **\\u0412\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439**: \\u041F\\u043E\\u0432\\u043E\\u0440\\u0430\\u0447\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u043E \\u0432\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u0438.\n- **\\u0413\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439**: \\u041F\\u043E\\u0432\\u043E\\u0440\\u0430\\u0447\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u043E \\u0433\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u0438.\n- **\\u0426\\u0435\\u043D\\u0442\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439**: \\u041F\\u043E\\u0432\\u043E\\u0440\\u0430\\u0447\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u043E \\u0446\\u0435\\u043D\\u0442\\u0440\\u0443.`,ZX=\"\\u0424\\u0438\\u043A\\u0441\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439\",QX=\"\\u0412\\u0435\\u0440\\u0442\\u0438\\u043A\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439\",$X=\"\\u0413\\u043E\\u0440\\u0438\\u0437\\u043E\\u043D\\u0442\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439\",eZ=\"\\u0426\\u0435\\u043D\\u0442\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439\",tZ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430\",nZ=`\\u0420\\u0435\\u0436\\u0438\\u043C \\u041F\\u043B\\u0430\\u0433\\u0438\\u043D\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D! \\u041B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u044B \\u043D\\u0435 \\u0438\\u043C\\u0435\\u044E\\u0442 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0435\\u043A \\u0432 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0435 \\u041F\\u043B\\u0430\\u0433\\u0438\\u043D\\u0430.\n\\u0412\\u043C\\u0435\\u0441\\u0442\\u043E \\u044D\\u0442\\u043E\\u0433\\u043E \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0439\\u0442\\u0435 Plugin API \\u0447\\u0442\\u043E\\u0431\\u044B \\u0434\\u043E\\u0431\\u0430\\u0432\\u0438\\u0442\\u044C \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u043E\\u043D\\u0430\\u043B \\u0432\\u0430\\u0448\\u0438\\u043C \\u041B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430\\u043C.\n\\u041F\\u043E\\u0434\\u0440\\u043E\\u0431\\u043D\\u0435\\u0435 \\u043E Plugin API \\u043C\\u043E\\u0436\\u043D\\u043E \\u0443\\u0437\\u043D\\u0430\\u0442\\u044C \\u0432 \\u041E\\u0444\\u0438\\u0446\\u0438\\u0430\\u043B\\u044C\\u043D\\u043E\\u0439 Plugin API \\u0434\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0430\\u0446\\u0438\\u0438.`,iZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u044C\",aZ=\"\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440 \\u0441\\u043E\\u0437\\u0434\\u0430\\u0441\\u0442 \\u0438 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u044C \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442 \\u0432 \\u0438\\u0433\\u0440\\u0435.\",rZ=\"\\u0422\\u0438\\u043F \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438\",oZ=\"\\u0422\\u0438\\u043F \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0439 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043F\\u0440\\u0438\\u0432\\u044F\\u0437\\u0430\\u043D \\u043A \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0443.\",sZ=\"\\u0422\\u0438\\u043F \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043D\\u0435 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u0443\\u0441\\u0442\\u044B\\u043C!\",lZ=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0442\\u0438\\u043F \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442 \\u0432 \\u043C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442\\u0435 {0}\",cZ=\"\\u0421\\u0438\\u043D\\u0445\\u0440\\u043E\\u043D\\u0438\\u0437\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u041F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u041F\\u0430\\u0441\\u0441\\u0430\\u0436\\u0438\\u0440\\u043E\\u0432\",uZ=\"\\u0410\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438 \\u0441\\u0438\\u043D\\u0445\\u0440\\u043E\\u043D\\u0438\\u0437\\u0438\\u0440\\u0443\\u0435\\u0442 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u043F\\u0430\\u0441\\u0441\\u0430\\u0436\\u0438\\u0440\\u043E\\u0432 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430.\",dZ=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435\",pZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u043A\\u043E\\u0440\\u043D\\u0435\\u0432\\u043E\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",mZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u043A\\u043E\\u0440\\u043D\\u0435\\u0432\\u043E\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0437\\u043E\\u0432\\u0435.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",fZ=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0435\\u043D\\u0438\\u0438\",hZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u043A\\u043E\\u0440\\u043D\\u0435\\u0432\\u043E\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043F\\u0440\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0435\\u043D\\u0438\\u0438.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",gZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `as` (\\u043E\\u0442 \\u043B\\u0438\\u0446\\u0430) \\u043A\\u043E\\u0440\\u043D\\u0435\\u0432\\u043E\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0438 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043F\\u0440\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0435\\u043D\\u0438\\u0438.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",_Z=\"\\u0422\\u0438\\u043A \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F\",xZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0438\\u043A.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",vZ=\"\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 `at` (\\u043D\\u0430 \\u043C\\u0435\\u0441\\u0442\\u0435) \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u043B\\u043E\\u043A\\u0430\\u0442\\u043E\\u0440\\u0430 \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0438\\u043A.\\n\\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.\",bZ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",yZ=\"\\u0412\\u0430\\u043D\\u0438\\u043B\\u044C\\u043D\\u0430\\u044F \\u043C\\u043E\\u0434\\u0435\\u043B\\u044C \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u0430\",wZ=`\\u0415\\u0441\\u043B\\u0438 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D, \\u043A\\u043E\\u0441\\u0442\\u044C \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u0438\\u0442\\u044C\\u0441\\u044F \\u043A\\u0430\\u043A \\u0432\\u0430\\u043D\\u0438\\u043B\\u044C\\u043D\\u044B\\u0439 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442.\n\\u042D\\u0442\\u043E \\u043F\\u0435\\u0440\\u0435\\u0437\\u0430\\u043F\\u0438\\u0448\\u0435\\u0442 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u044E\\u0449\\u0438\\u0435 \\u043A\\u0443\\u0431\\u044B \\u043A\\u043E\\u0441\\u0442\\u0438.`,EZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C NBT\",kZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442 NBT \\u0447\\u0442\\u043E\\u0431\\u044B \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0438\\u0442\\u044C \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439 \\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u044C \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0435\\u043A.\",jZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435 NBT \\u043F\\u0435\\u0440\\u0435\\u0437\\u0430\\u043F\\u0438\\u0448\\u0435\\u0442 \\u0432\\u0441\\u0435 \\u0434\\u0440\\u0443\\u0433\\u0438\\u0435 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438, \\u0438 \\u043B\\u044E\\u0431\\u044B\\u0435 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u043D\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u044B \\u0432 \\u0440\\u0435\\u0434\\u0430\\u043A\\u0442\\u043E\\u0440\\u0435. \\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0439\\u0442\\u0435 \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043F\\u0440\\u0438 \\u043D\\u0435\\u043E\\u0431\\u0445\\u043E\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u0438!\",AZ=\"\\u041D\\u0430\\u0441\\u043B\\u0435\\u0434\\u043E\\u0432\\u0430\\u0442\\u044C \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438\",TZ=\"\\u041D\\u0430\\u0441\\u043B\\u0435\\u0434\\u0443\\u0435\\u0442 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u043E\\u0442 \\u0440\\u043E\\u0434\\u0438\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u043E\\u0439 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438.\",CZ=\"\\u0421\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u0435\",SZ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0432 \\u0438\\u0433\\u0440\\u0435.\",OZ=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u0446\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F\",IZ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0439 \\u0446\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F \\u0432 \\u0438\\u0433\\u0440\\u0435.\",DZ=\"\\u0426\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F\",FZ=\"\\u0426\\u0432\\u0435\\u0442 \\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u0438\\u044F \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438.\",NZ=\"\\u0420\\u0430\\u0434\\u0438\\u0443\\u0441 \\u0442\\u0435\\u043D\\u0438\",RZ=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0440\\u0430\\u0434\\u0438\\u0443\\u0441 \\u0442\\u0435\\u043D\\u0438.\",MZ=\"\\u0418\\u043D\\u0442\\u0435\\u043D\\u0441\\u0438\\u0432\\u043D\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043D\\u0438\",BZ=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0438\\u043D\\u0442\\u0435\\u043D\\u0441\\u0438\\u0432\\u043D\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043D\\u0438.\",PZ=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0430\\u044F \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",LZ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C.\",VZ=\"\\u042F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",zZ=\"\\u042F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438. \\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u043E \\u0431\\u044B\\u0442\\u044C \\u043E\\u0442 0 \\u0434\\u043E 15.\",UZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u042F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",qZ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u0434\\u043B\\u044F \\u043A\\u043E\\u0441\\u0442\\u0438.\",HZ=\"\\u0421\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0430\\u044F \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C\",JZ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442 \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u0443\\u044E \\u044F\\u0440\\u043A\\u043E\\u0441\\u0442\\u044C \\u0434\\u043B\\u044F \\u043A\\u043E\\u0441\\u0442\\u0438. \\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u043E \\u0431\\u044B\\u0442\\u044C \\u043E\\u0442 0 \\u0434\\u043E 15.\",GZ=\"\\u041D\\u0435\\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C\",WZ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438 \\u0432 \\u0438\\u0433\\u0440\\u0435.\",KZ=\"NBT\",YZ=\"NBT \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0438\\u043C\\u043E\\u0435 \\u043A \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439-\\u0441\\u0443\\u0449\\u043D\\u043E\\u0441\\u0442\\u0438.\",XZ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",ZZ=\"\\u0418\\u043C\\u044F\",QZ=\"\\u041F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u043E\\u0435 \\u0438\\u043C\\u044F \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F.\",$Z=`\\u041D\\u0435\\u0432\\u0435\\u0440\\u043D\\u044B\\u0439 JSON \\u0442\\u0435\\u043A\\u0441\\u0442!\n{0}`,eQ=\"\\u0412\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438\",tQ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438.\",nQ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\",iQ=\"\\u0418\\u043C\\u044F\",aQ=\"\\u041F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u043E\\u0435 \\u0438\\u043C\\u044F \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F.\",rQ=`\\u041D\\u0435\\u0432\\u0435\\u0440\\u043D\\u044B\\u0439 JSON \\u0442\\u0435\\u043A\\u0441\\u0442!\n{0}`,oQ=\"\\u0412\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438\",sQ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0442\\u044C \\u043B\\u0438 \\u043F\\u043E\\u0441\\u0442\\u043E\\u044F\\u043D\\u043D\\u0443\\u044E \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C \\u0438\\u043C\\u0435\\u043D\\u0438.\",lQ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u043E\\u0432\",cQ=\"\\u041E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u043C\\u043E\\u0435 \\u0438\\u043C\\u044F\",uQ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0441\\u044F \\u0432 \\u0440\\u0435\\u0434\\u0430\\u043A\\u0442\\u043E\\u0440\\u0435 \\u0438 \\u0432 \\u0441\\u043E\\u043E\\u0431\\u0449\\u0435\\u043D\\u0438\\u044F\\u0445 \\u043E\\u0448\\u0438\\u0431\\u043E\\u043A.\",dQ=\"\\u0421\\u0433\\u0435\\u043D\\u0435\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0438\\u043C\\u044F \\u0438\\u0437 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u043C\\u043E\\u0433\\u043E \\u0438\\u043C\\u0435\\u043D\\u0438\",pQ=\"\\u0410\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438 \\u0433\\u0435\\u043D\\u0435\\u0440\\u0438\\u0440\\u0443\\u0435\\u0442 \\u0438\\u043C\\u044F \\u043D\\u0430 \\u043E\\u0441\\u043D\\u043E\\u0432\\u0435 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u043C\\u043E\\u0433\\u043E \\u0438\\u043C\\u0435\\u043D\\u0438.\",mQ=\"\\u0418\\u043C\\u044F\",fQ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0441\\u044F \\u0432 \\u0434\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0435 \\u0438 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0435.\",hQ=\"\\u0422\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u043D\\u0430\\u044F \\u043A\\u0430\\u0440\\u0442\\u0430\",gQ=\"\\u041A\\u0430\\u0440\\u0442\\u0430 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440, \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0437\\u0430\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B \\u043F\\u0440\\u0438 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0438 \\u044D\\u0442\\u043E\\u0433\\u043E \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430.\",_Q=\"\\u0421\\u043E\\u0437\\u0434\\u0430\\u0442\\u044C \\u043D\\u043E\\u0432\\u044B\\u0439 \\u043C\\u0430\\u043F\\u043F\\u0438\\u043D\\u0433\",xQ=\"\\u0423 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430 \\u043D\\u0435\\u0442 \\u0437\\u0430\\u043C\\u0435\\u043D\\u044F\\u0435\\u043C\\u044B\\u0445 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440.\",vQ=`\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043D\\u043E\\u0434\\u044B \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0431\\u044B\\u0442\\u044C \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B \\u043F\\u0440\\u0438 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430.\n\n\\u041D\\u043E\\u0434\\u044B \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0432 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B \\u043F\\u0440\\u0438 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430.\n\n\\u041D\\u043E\\u0434\\u044B \\u043D\\u0435 \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0432 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0435 \\u043E\\u0441\\u0442\\u0430\\u043D\\u0443\\u0442\\u0441\\u044F \\u043D\\u0435\\u0442\\u0440\\u043E\\u043D\\u0443\\u0442\\u044B\\u043C\\u0438.`,bQ=\"\\u0418\\u0441\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",yQ=\"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u043D\\u043E\\u0434\\u043E\\u0432 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0438\\u0433\\u043D\\u043E\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C. \\u042D\\u0442\\u0438 \\u043D\\u043E\\u0434\\u044B \\u043E\\u0441\\u0442\\u0430\\u043D\\u0443\\u0442\\u0441\\u044F \\u043D\\u0435\\u0442\\u0440\\u043E\\u043D\\u0443\\u0442\\u044B\\u043C\\u0438.\",wQ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",EQ=\"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u043D\\u043E\\u0434\\u043E\\u0432 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u0434\\u043E\\u043B\\u0436\\u0435\\u043D \\u0438\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C. \\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u044D\\u0442\\u0438 \\u043D\\u043E\\u0434\\u044B \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B.\",kQ=\"\\u041F\\u043E\\u043C\\u0435\\u043D\\u044F\\u0442\\u044C \\u043C\\u0435\\u0441\\u0442\\u0430\\u043C\\u0438\",jQ=\"\\u041E\\u0431\\u043D\\u043E\\u0432\\u0438\\u0442\\u044C .ajmodel\",AQ=\"\\u041E\\u0431\\u043D\\u043E\\u0432\\u0438\\u0442\\u044C .ajmodel\",TQ=\"\\u0412\\u044B\\u0431\\u0440\\u0430\\u0442\\u044C .ajmodel \\u0444\\u0430\\u0439\\u043B\",CQ=\"\\u041E\\u0431\\u043D\\u043E\\u0432\\u0438\\u0442\\u0435 \\u0441\\u0432\\u043E\\u0438 \\u0443\\u0441\\u0442\\u0430\\u0440\\u0435\\u0432\\u0448\\u0438\\u0435 .ajmodel \\u0444\\u0430\\u0439\\u043B\\u044B \\u043D\\u0430 \\u043D\\u043E\\u0432\\u044B\\u0439 .ajblueprint \\u0444\\u043E\\u0440\\u043C\\u0430\\u0442.\",SQ=\"\\u0412\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 .ajmodel \\u0444\\u0430\\u0439\\u043B \\u0434\\u043B\\u044F \\u043E\\u0431\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u0438\\u044F\",OQ=\"\\u0421\\u0432\\u043E\\u0439\\u0441\\u0442\\u0432\\u0430 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438 ({0})\",IQ=\"\\u041D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438\",DQ=\"\\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0441\\u044F \\u0432 \\u0434\\u0430\\u0442\\u0430\\u043F\\u0430\\u043A\\u0435.\",FQ=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u0446\\u0438\\u043A\\u043B\\u0430\",NQ=`- \\u041E\\u0434\\u043D\\u043E\\u0440\\u0430\\u0437\\u043E\\u0432\\u044B\\u0439: \\u0410\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0432\\u043E\\u0441\\u043F\\u0440\\u043E\\u0438\\u0437\\u0432\\u0435\\u0434\\u0451\\u0442\\u0441\\u044F \\u0435\\u0434\\u0438\\u043D\\u043E\\u0436\\u0434\\u044B, \\u0437\\u0430\\u0442\\u0435\\u043C \\u0432\\u0435\\u0440\\u043D\\u0435\\u0442\\u0441\\u044F \\u043A \\u043F\\u0435\\u0440\\u0432\\u043E\\u043C\\u0443 \\u043A\\u0430\\u0434\\u0440\\u0443.\n- \\u0423\\u0434\\u0435\\u0440\\u0436\\u0430\\u043D\\u0438\\u0435: \\u0410\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0432\\u043E\\u0441\\u043F\\u0440\\u043E\\u0438\\u0437\\u0432\\u0435\\u0434\\u0451\\u0442\\u0441\\u044F \\u0435\\u0434\\u0438\\u043D\\u043E\\u0436\\u0434\\u044B \\u0438 \\u043E\\u0441\\u0442\\u0430\\u043D\\u0435\\u0442\\u0441\\u044F \\u043D\\u0430 \\u043F\\u043E\\u0441\\u043B\\u0435\\u0434\\u043D\\u0435\\u043C \\u043A\\u0430\\u0434\\u0440\\u0435.\n- \\u0426\\u0438\\u043A\\u043B: \\u0410\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0431\\u0435\\u0441\\u043A\\u043E\\u043D\\u0435\\u0447\\u043D\\u043E \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u044F\\u0442\\u044C\\u0441\\u044F.`,RQ=\"\\u041E\\u0434\\u043D\\u043E\\u0440\\u0430\\u0437\\u043E\\u0432\\u044B\\u0439\",MQ=\"\\u0423\\u0434\\u0435\\u0440\\u0436\\u0430\\u043D\\u0438\\u0435\",BQ=\"\\u0426\\u0438\\u043A\\u043B\",PQ=\"\\u041D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438 \\u043D\\u0435 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u0443\\u0441\\u0442\\u044B\\u043C!\",LQ=\"\\u041D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u0441\\u0438\\u043C\\u0432\\u043E\\u043B\\u044B! \\u041D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u044F \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0439 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0430\\u0442\\u044C \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0431\\u0443\\u043A\\u0432\\u044B, \\u0447\\u0438\\u0441\\u043B\\u0430, \\u043D\\u0438\\u0436\\u043D\\u0438\\u0435 \\u043F\\u043E\\u0434\\u0447\\u0451\\u0440\\u043A\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F \\u0438 \\u0442\\u043E\\u0447\\u043A\\u0438.\",VQ=\"\\u0417\\u0430\\u0434\\u0435\\u0440\\u0436\\u043A\\u0430 \\u0446\\u0438\\u043A\\u043B\\u0430\",zQ=`\\u0417\\u0430\\u0434\\u0435\\u0440\\u0436\\u043A\\u0430 \\u0432 \\u0442\\u0438\\u043A\\u0430\\u0445 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u043D\\u044B\\u043C \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u043E\\u043C \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438 \\u0432 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0435 \\u0426\\u0438\\u043A\\u043B.\n\n\\u0422.\\u0435. \\u0417\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435 20 \\u0437\\u043D\\u0430\\u0447\\u0438\\u0442, \\u0447\\u0442\\u043E \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0437\\u0430\\u0441\\u0442\\u044B\\u043D\\u0435\\u0442 \\u043D\\u0430 1 \\u0441\\u0435\\u043A\\u0443\\u043D\\u0434\\u0443 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u043D\\u044B\\u043C \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u043E\\u043C.`,UQ=`\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043D\\u043E\\u0434\\u044B \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0434\\u043E\\u043B\\u0436\\u043D\\u0430 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C.\n\n\\u041D\\u043E\\u0434\\u044B \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0432 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0435\\u0439.\n\n\\u041D\\u043E\\u0434\\u044B \\u043D\\u0435 \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u044B\\u0435 \\u0432 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0435 \\u043E\\u0441\\u0442\\u0430\\u043D\\u0443\\u0442\\u0441\\u044F \\u043D\\u0435\\u0442\\u0440\\u043E\\u043D\\u0443\\u0442\\u044B\\u043C\\u0438.`,qQ=\"\\u0418\\u0441\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",HQ=\"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u043D\\u043E\\u0434\\u043E\\u0432 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0433\\u043D\\u043E\\u0440\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C. \\u042D\\u0442\\u0438 \\u043D\\u043E\\u0434\\u044B \\u043E\\u0441\\u0442\\u0430\\u043D\\u0443\\u0442\\u0441\\u044F \\u043D\\u0435\\u0442\\u0440\\u043E\\u043D\\u0443\\u0442\\u044B\\u043C\\u0438.\",JQ=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",GQ=\"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A \\u043D\\u043E\\u0434\\u043E\\u0432 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u044F \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0438\\u0437\\u043C\\u0435\\u043D\\u044F\\u0442\\u044C. \\u0422\\u043E\\u043B\\u044C\\u043A\\u043E \\u044D\\u0442\\u0438 \\u043D\\u043E\\u0434\\u044B \\u0431\\u0443\\u0434\\u0443\\u0442 \\u0438\\u0437\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B.\",WQ=\"\\u041F\\u043E\\u043C\\u0435\\u043D\\u044F\\u0442\\u044C \\u043C\\u0435\\u0441\\u0442\\u0430\\u043C\\u0438\",KQ=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435...\",YQ=\"\\u0417\\u0430\\u0433\\u0440\\u0443\\u0437\\u043A\\u0430 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430...\",XQ=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u044B\",ZQ=\"\\u0421\\u043E\\u0437\\u0434\\u0430\\u0442\\u044C \\u043D\\u043E\\u0432\\u044B\\u0439 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",QQ=\"\\u041D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0438\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",$Q=\"\\u0414\\u0443\\u0431\\u043B\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",e$=\"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",t$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\",n$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u043D\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\",i$=\"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E \\u043D\\u0435\\u043B\\u044C\\u0437\\u044F!\",a$=\"\\u0418\\u0437\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u043F\\u043E \\u0443\\u043C\\u043E\\u043B\\u0447\\u0430\\u043D\\u0438\\u044E \\u043D\\u0435\\u043B\\u044C\\u0437\\u044F!\",r$=\"\\u0421\\u043E\\u0437\\u0434\\u0430\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",o$=\"\\u0414\\u0443\\u0431\\u043B\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",s$=\"\\u041E\\u0442\\u043A\\u0440\\u044B\\u0442\\u044C \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\\u0430\",l$=\"\\u0423\\u0434\\u0430\\u043B\\u0438\\u0442\\u044C \\u0432\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",c$=\"\\u0418\\u0441\\u043A\\u043B\\u044E\\u0447\\u0451\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",u$=\"\\u0418\\u043D\\u0432\\u0435\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u0438\\u0441\\u043A\\u043B\\u044E\\u0447\\u0451\\u043D\\u043D\\u044B\\u0435 \\u043D\\u043E\\u0434\\u044B\",d$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",p$=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F\",m$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",f$=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F\",h$=\"\\u0423\\u0441\\u043B\\u043E\\u0432\\u0438\\u0435 Execute\",g$=\"\\u041F\\u043E\\u0432\\u0442\\u043E\\u0440\",_$=\"\\u0418\\u043D\\u0442\\u0435\\u0440\\u0432\\u0430\\u043B \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u0430\",x$=\"\\u041A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u0439 \\u043A\\u0430\\u0434\\u0440 ({0})\",v$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442\",b$=\"\\u0412\\u0430\\u0440\\u0438\\u0430\\u043D\\u0442 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0438\\u043C\\u044B\\u0439 \\u043A \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u043C\\u0443 \\u043A\\u0430\\u0434\\u0440\\u0443.\",y$=\"\\u0424\\u0443\\u043D\\u043A\\u0446\\u0438\\u044F\",w$=`\\u041A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u043C\\u044B\\u0435 \\u043F\\u0440\\u0438 \\u0434\\u043E\\u0441\\u0442\\u0438\\u0436\\u0435\\u043D\\u0438\\u0438 \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u0433\\u043E \\u043A\\u0430\\u0434\\u0440\\u0430.\n\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A \\`.mcfunction\\` \\u0444\\u0430\\u0439\\u043B.\n\n\\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 [MC-Build](https://mcbuild.dev) \\u0441\\u0438\\u043D\\u0442\\u0430\\u043A\\u0441.`,E$=\"\\u0423\\u0441\\u043B\\u043E\\u0432\\u0438\\u0435 Execute\",k$=\"\\u0423\\u0441\\u043B\\u043E\\u0432\\u0438\\u0435 \\u043F\\u0440\\u0438 \\u043A\\u043E\\u0442\\u043E\\u0440\\u043E\\u043C \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u0439 \\u043A\\u0430\\u0434\\u0440 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D.\\n\\n\\u0412\\u043E\\u0441\\u043F\\u0440\\u0438\\u043D\\u0438\\u043C\\u0430\\u0439\\u0442\\u0435 \\u044D\\u0442\\u043E \\u043F\\u043E\\u043B\\u0435 \\u043A\\u0430\\u043A `execute if` \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u0443.\\n\\n\\u0422.\\u0435. `if score @s myScore matches 1..`\",j$=\"\\u041F\\u043E\\u0432\\u0442\\u043E\\u0440\",A$=\"\\u041A\\u043E\\u0433\\u0434\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E, \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B \\u0432 \\u044D\\u0442\\u043E\\u043C \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u043C \\u043A\\u0430\\u0434\\u0440\\u0435 \\u0431\\u0443\\u0434\\u0443\\u0442 \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u044F\\u0442\\u044C\\u0441\\u044F \\u0432 \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043D\\u043E\\u043C \\u0438\\u043D\\u0442\\u0435\\u0440\\u0432\\u0430\\u043B\\u0435.\",T$=\"\\u0418\\u043D\\u0442\\u0435\\u0440\\u0432\\u0430\\u043B\",C$=`\\u041A\\u043E\\u043B\\u0438\\u0447\\u0435\\u0441\\u0442\\u0432\\u043E \\u0442\\u0438\\u043A\\u043E\\u0432 \\u043C\\u0435\\u0436\\u0434\\u0443 \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u043E\\u043C \\u043A\\u043E\\u043C\\u0430\\u043D\\u0434\\u044B.\n\n\\u041F\\u043E\\u0441\\u0442\\u0430\\u0432\\u044C\\u0442\\u0435 1 \\u0447\\u0442\\u043E\\u0431\\u044B \\u0437\\u0430\\u043F\\u0443\\u0441\\u043A\\u0430\\u0442\\u044C \\u043A\\u0430\\u0436\\u0434\\u044B\\u0439 \\u0442\\u0438\\u043A \\u0430\\u043D\\u0438\\u043C\\u0430\\u0446\\u0438\\u0438.`,S$=\"\\u0422\\u0438\\u043F \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F\",O$=\"The type of easing to apply to the keyframe.\",I$=\"\\u041B\\u0438\\u043D\\u0435\\u0439\\u043D\\u043E\\u0435\",D$=\"\\u0421\\u0438\\u043D\\u0443\\u0441\\u043E\\u0438\\u0434\\u0430\\u043B\\u044C\\u043D\\u043E\\u0435\",F$=\"\\u041A\\u0432\\u0430\\u0434\\u0440\\u0430\\u0442\\u0438\\u0447\\u043D\\u043E\\u0435\",N$=\"\\u041A\\u0443\\u0431\\u0438\\u0447\\u0435\\u0441\\u043A\\u043E\\u0435\",R$=\"\\u0411\\u0438\\u043A\\u0432\\u0430\\u0434\\u0440\\u0430\\u0442\\u0438\\u0447\\u043D\\u043E\\u0435\",M$=\"\\u0411\\u0438\\u043A\\u0443\\u0431\\u0438\\u0447\\u0435\\u0441\\u043A\\u043E\\u0435\",B$=\"\\u042D\\u043A\\u0441\\u043F\\u043E\\u043D\\u0435\\u043D\\u0446\\u0438\\u0430\\u043B\\u044C\\u043D\\u043E\\u0435\",P$=\"\\u041A\\u0440\\u0443\\u0433\\u043E\\u0432\\u043E\\u0435\",L$=\"\\u042D\\u043B\\u0430\\u0441\\u0442\\u0438\\u0447\\u043D\\u043E\\u0435\",V$=\"\\u041E\\u0442\\u0441\\u043A\\u043E\\u043A \\u043D\\u0430\\u0437\\u0430\\u0434\",z$=\"\\u041F\\u0440\\u044B\\u0433\\u0430\\u044E\\u0449\\u0435\\u0435\",U$=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F\",q$=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0438\\u044F \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F \\u043A \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u043C\\u0443 \\u043A\\u0430\\u0434\\u0440\\u0443.\",H$=\"\\u0412 \\u043D\\u0430\\u0447\\u0430\\u043B\\u0435\",J$=\"\\u0412 \\u043A\\u043E\\u043D\\u0446\\u0435\",G$=\"\\u0412 \\u043D\\u0430\\u0447\\u0430\\u043B\\u0435 \\u0438 \\u0432 \\u043A\\u043E\\u043D\\u0446\\u0435\",W$=\"\\u0410\\u0440\\u0433\\u0443\\u043C\\u0435\\u043D\\u0442\\u044B \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F\",K$=\"\\u0410\\u0433\\u0440\\u0443\\u043C\\u0435\\u043D\\u0442\\u044B \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0438\\u043C\\u044B\\u0435 \\u043A \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0438 \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F.\",Y$=\"\\u042D\\u043B\\u0430\\u0441\\u0442\\u0438\\u0447\\u043D\\u043E\\u0441\\u0442\\u044C\",X$=\"\\u042D\\u043B\\u0430\\u0441\\u0442\\u0438\\u0447\\u043D\\u043E\\u0441\\u0442\\u044C \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0438 \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F.\",Z$=\"\\u041F\\u0435\\u0440\\u0435\\u0440\\u0430\\u0441\\u0442\\u044F\\u0436\\u0435\\u043D\\u0438\\u0435\",Q$=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0441\\u0442\\u0435\\u043F\\u0435\\u043D\\u044C \\u043F\\u0435\\u0440\\u0435\\u0440\\u0430\\u0441\\u0442\\u044F\\u0436\\u0435\\u043D\\u0438\\u044F \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0438 \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F.\",$$=\"\\u041F\\u0440\\u044B\\u0433\\u0443\\u0447\\u0435\\u0441\\u0442\\u044C\",eee=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0441\\u0442\\u0435\\u043F\\u0435\\u043D\\u044C \\u043F\\u0440\\u044B\\u0433\\u0443\\u0447\\u0435\\u0441\\u0442\\u0438 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0438\\u0438 \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F.\",tee=`\\u041F\\u0440\\u043E\\u0434\\u0432\\u0438\\u043D\\u0443\\u0442\\u044B\\u0435 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0438 \\u0441\\u0433\\u043B\\u0430\\u0436\\u0438\\u0432\\u0430\\u043D\\u0438\\u044F \\u043E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u044B.\n\\u0421\\u043C\\u0435\\u043D\\u0438\\u0442\\u0435 \\u0440\\u0435\\u0436\\u0438\\u043C \\u0438\\u043D\\u0442\\u0435\\u0440\\u043F\\u043E\\u043B\\u044F\\u0446\\u0438\\u0438 \\u043A\\u043B\\u044E\\u0447\\u0435\\u0432\\u043E\\u0433\\u043E \\u043A\\u0430\\u0434\\u0440\\u0430 \\u043D\\u0430 \\u043B\\u0438\\u043D\\u0435\\u0439\\u043D\\u044B\\u0439 \\u0434\\u043B\\u044F \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u0438\\u044F.`,nee=\"\\u0422\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439\",iee=\"\\u0414\\u043B\\u0438\\u043D\\u0430 \\u0441\\u0442\\u0440\\u043E\\u043A\\u0438\",aee=\"\\u0428\\u0438\\u0440\\u0438\\u043D\\u0430 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F \\u0432 \\u043F\\u0438\\u043A\\u0441\\u0435\\u043B\\u044F\\u0445.\",ree=\"\\u0426\\u0432\\u0435\\u0442 \\u0444\\u043E\\u043D\\u0430\",oee=\"\\u0426\\u0432\\u0435\\u0442 \\u0444\\u043E\\u043D\\u0430 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F.\",see=\"\\u0422\\u0435\\u043D\\u044C \\u0442\\u0435\\u043A\\u0441\\u0442\\u0430\",lee=\"\\u0412\\u043A\\u043B\\u044E\\u0447\\u0430\\u0435\\u0442 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043D\\u0438 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0430.\",cee=\"\\u0412\\u044B\\u0440\\u0430\\u0432\\u043D\\u0438\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0430\",uee=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442 \\u0432\\u044B\\u0440\\u0430\\u0432\\u043D\\u0438\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0430.\",dee=\"\\u041F\\u043E \\u043B\\u0435\\u0432\\u043E\\u043C\\u0443 \\u043A\\u0440\\u0430\\u044E\",pee=\"\\u041F\\u043E \\u0446\\u0435\\u043D\\u0442\\u0440\\u0443\",mee=\"\\u041F\\u043E \\u043F\\u0440\\u0430\\u0432\\u043E\\u043C\\u0443 \\u043A\\u0440\\u0430\\u044E\",fee=\"\\u0421\\u043A\\u0432\\u043E\\u0437\\u043D\\u0430\\u044F \\u0432\\u0438\\u0434\\u0438\\u043C\\u043E\\u0441\\u0442\\u044C\",hee=\"\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442, \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043B\\u0438 \\u0442\\u0435\\u043A\\u0441\\u0442 \\u0432\\u0438\\u0434\\u0435\\u043D \\u0441\\u043A\\u0432\\u043E\\u0437\\u044C \\u0431\\u043B\\u043E\\u043A\\u0438.\",gee=\"\\u041A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0442\\u0435\\u043A\\u0441\\u0442\\u043E\\u0432\\u044B\\u0439 \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442\",_ee=\"\\u041A\\u043E\\u043F\\u0438\\u0440\\u0443\\u0435\\u0442 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0442\\u0435\\u043A\\u0441\\u0442\\u043E\\u0432\\u044B\\u0439 \\u043A\\u043E\\u043C\\u043F\\u043E\\u043D\\u0435\\u043D\\u0442 \\u0432 \\u0431\\u0443\\u0444\\u0435\\u0440 \\u043E\\u0431\\u043C\\u0435\\u043D\\u0430.\",xee=\"\\u0422\\u0435\\u043A\\u0441\\u0442 \\u0441\\u043A\\u043E\\u043F\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D \\u0432 \\u0431\\u0443\\u0444\\u0435\\u0440 \\u043E\\u0431\\u043C\\u0435\\u043D\\u0430!\",vee=\"\\u041E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u043C\\u044B\\u0439 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\",bee=\"\\u041F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442, \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0439 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0442\\u044C\\u0441\\u044F.\",yee=\"\\u0420\\u0435\\u0436\\u0438\\u043C \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u0430\",wee='\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u0442, \\u043A\\u0430\\u043A\\u0430\\u044F \\u0442\\u0440\\u0430\\u043D\\u0441\\u0444\\u043E\\u0440\\u043C\\u0430\\u0446\\u0438\\u044F \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u0430 \\u043A \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442\\u0443 (\\u043A\\u0430\\u043A \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D\\u043E \\u0432 \\u043F\\u043E\\u043B\\u0435 \"display\" JSON-\\u0444\\u0430\\u0439\\u043B\\u0430 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438).',Eee=\"\\u041D\\u0435\\u0442\",kee=\"\\u041E\\u0442 \\u0442\\u0440\\u0435\\u0442\\u044C\\u0435\\u0433\\u043E \\u043B\\u0438\\u0446\\u0430 (\\u043B\\u0435\\u0432\\u0430\\u044F \\u0440\\u0443\\u043A\\u0430)\",jee=\"\\u041E\\u0442 \\u0442\\u0440\\u0435\\u0442\\u044C\\u0435\\u0433\\u043E \\u043B\\u0438\\u0446\\u0430 (\\u043F\\u0440\\u0430\\u0432\\u0430\\u044F \\u0440\\u0443\\u043A\\u0430)\",Aee=\"\\u041E\\u0442 \\u043F\\u0435\\u0440\\u0432\\u043E\\u0433\\u043E \\u043B\\u0438\\u0446\\u0430 (\\u043B\\u0435\\u0432\\u0430\\u044F \\u0440\\u0443\\u043A\\u0430)\",Tee=\"\\u041E\\u0442 \\u043F\\u0435\\u0440\\u0432\\u043E\\u0433\\u043E \\u043B\\u0438\\u0446\\u0430 (\\u043F\\u0440\\u0430\\u0432\\u0430\\u044F \\u0440\\u0443\\u043A\\u0430)\",Cee=\"\\u0413\\u043E\\u043B\\u043E\\u0432\\u0430\",See=\"\\u0418\\u043D\\u0442\\u0435\\u0440\\u0444\\u0435\\u0439\\u0441 (GUI)\",Oee=\"\\u041D\\u0430 \\u0437\\u0435\\u043C\\u043B\\u0435\",Iee=\"\\u0424\\u0438\\u043A\\u0441\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u043D\\u043E\",Dee=\"\\u041E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0435\\u043C\\u044B\\u0439 \\u0431\\u043B\\u043E\\u043A\",Fee=\"\\u0411\\u043B\\u043E\\u043A, \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0439 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0430\\u0442\\u044C\\u0441\\u044F. \\u041F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u044E\\u0442\\u0441\\u044F \\u0441\\u043E\\u0441\\u0442\\u043E\\u044F\\u043D\\u0438\\u044F \\u0431\\u043B\\u043E\\u043A\\u043E\\u0432!\",Nee=\"\\u041F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439\",Ree=\"\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u0442\\u044C\",Mee=\"\\u0412\\u044B \\u043E\\u0442\\u043A\\u043B\\u044E\\u0447\\u0438\\u043B\\u0438 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430, \\u043D\\u043E \\u0432 \\u0432\\u0430\\u0448\\u0435\\u043C \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u0435 \\u0435\\u0441\\u0442\\u044C \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0435 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438! \\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0438\\u0442\\u0435 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043F\\u0430\\u043A\\u0430 \\u0438\\u043B\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u0435 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.\",Bee=\"\\u0412 \\u043D\\u0430\\u0441\\u0442\\u0440\\u043E\\u0439\\u043A\\u0430\\u0445 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430 \\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u044B \\u043E\\u0448\\u0438\\u0431\\u043A\\u0438! \\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0438\\u0441\\u043F\\u0440\\u0430\\u0432\\u044C\\u0442\\u0435 \\u0438\\u0445 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.\",Pee=\"\\u041D\\u0430\\u0439\\u0434\\u0435\\u043D\\u0430 \\u043E\\u0448\\u0438\\u0431\\u043A\\u0430 \\u0441 {0}:\",Lee=\"\\u041E\\u043A\",Vee=`\\u041D\\u0435\\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u0432 \\u0432\\u0430\\u0448\\u0435\\u0439 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0438\\u043C\\u0435\\u044E\\u0442 \\u043D\\u0435\\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u044C\\u043D\\u044B\\u0435 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442\\u044B!\n\n\\u041A\\u0443\\u0431\\u044B \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0438\\u043C\\u0435\\u0442\\u044C \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u0432 -45, -22.5, 0, 22.5, \\u0438\\u043B\\u0438 45 \\u0433\\u0440\\u0430\\u0434\\u0443\\u0441\\u043E\\u0432, \\u0438 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u043E\\u0432\\u0451\\u0440\\u043D\\u0443\\u0442\\u044B \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043D\\u0430 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u043E\\u0441\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0431\\u043E\\u0440\\u0435 \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442 \\u0432\\u0435\\u0440\\u0441\\u0438\\u0439 \\u043D\\u0438\\u0436\\u0435 1.21.6.\n\n\\u0415\\u0441\\u043B\\u0438 \\u0445\\u043E\\u0442\\u0438\\u0442\\u0435 \\u043F\\u043E\\u0432\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u043A\\u0443\\u0431 \\u0431\\u043E\\u043B\\u0435\\u0435 \\u0442\\u043E\\u0447\\u043D\\u043E, \\u0438\\u043B\\u0438 \\u043D\\u0430 \\u043C\\u043D\\u043E\\u0436\\u0438\\u0441\\u0442\\u0432\\u0435 \\u043E\\u0441\\u0435\\u0439, \\u043F\\u0435\\u0440\\u0435\\u043C\\u0435\\u0441\\u0442\\u0438\\u0442\\u0435 \\u043A\\u0443\\u0431 \\u0432 \\u043A\\u043E\\u0441\\u0442\\u044C \\u0438 \\u043F\\u043E\\u0432\\u043E\\u0440\\u0430\\u0447\\u0438\\u0432\\u0430\\u0439\\u0442\\u0435 \\u0435\\u0451 \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u043A\\u0443\\u0431\\u0430.\n\n\\u0412\\u0441\\u0435 \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u043F\\u043E\\u0434\\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u044B \\u043A\\u0440\\u0430\\u0441\\u043D\\u044B\\u043C. \\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0438\\u0441\\u043F\\u0440\\u0430\\u0432\\u044C\\u0442\\u0435 \\u0438\\u0445 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.`,zee=`\\u041D\\u0435\\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u0432 \\u0432\\u0430\\u0448\\u0435\\u0439 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0438\\u043C\\u0435\\u044E\\u0442 \\u043D\\u0435\\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u044C\\u043D\\u044B\\u0435 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442\\u044B!\n\n\\u041A\\u0443\\u0431\\u044B \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u043E\\u0432\\u0451\\u0440\\u043D\\u0443\\u0442\\u044B \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043D\\u0430 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u043E\\u0441\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0431\\u043E\\u0440\\u0435 \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442 \\u0432\\u0435\\u0440\\u0441\\u0438\\u0438 1.21.6 \\u0438\\u043B\\u0438 \\u0432\\u044B\\u0448\\u0435.\n\n\\u0415\\u0441\\u043B\\u0438 \\u0445\\u043E\\u0442\\u0438\\u0442\\u0435 \\u043F\\u043E\\u0432\\u0435\\u0440\\u043D\\u0443\\u0442\\u044C \\u043A\\u0443\\u0431 \\u043D\\u0430 \\u043C\\u043D\\u043E\\u0436\\u0438\\u0441\\u0442\\u0432\\u0435 \\u043E\\u0441\\u0435\\u0439, \\u043F\\u0435\\u0440\\u0435\\u043C\\u0435\\u0441\\u0442\\u0438\\u0442\\u0435 \\u043A\\u0443\\u0431 \\u0432 \\u043A\\u043E\\u0441\\u0442\\u044C \\u0438 \\u043F\\u043E\\u0432\\u043E\\u0440\\u0430\\u0447\\u0438\\u0432\\u0430\\u0439\\u0442\\u0435 \\u0435\\u0451 \\u0432\\u043C\\u0435\\u0441\\u0442\\u043E \\u043A\\u0443\\u0431\\u0430.\n\n\\u0412\\u0441\\u0435 \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u043F\\u043E\\u0434\\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u044B \\u043A\\u0440\\u0430\\u0441\\u043D\\u044B\\u043C. \\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0438\\u0441\\u043F\\u0440\\u0430\\u0432\\u044C\\u0442\\u0435 \\u0438\\u0445 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.`,Uee=`\\u0423 \\u0432\\u0430\\u0448\\u0435\\u0439 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0435\\u0441\\u0442\\u044C \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B, \\u043D\\u043E \\u043D\\u0435\\u0442 \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0445 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0435\\u0439 (\\u041A\\u0443\\u0431\\u043E\\u0432) \\u043A \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u043C \\u0438\\u0445 \\u043C\\u043E\\u0436\\u043D\\u043E \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C!\n\\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0441\\u043E\\u0437\\u0434\\u0430\\u0439\\u0442\\u0435 \\u043A\\u0443\\u0431\\u044B \\u0438 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0439\\u0442\\u0435 \\u044D\\u0442\\u0438 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B, \\u0438\\u043B\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.`,qee=`\\u0423 \\u0432\\u0430\\u0448\\u0435\\u0439 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 \\u0435\\u0441\\u0442\\u044C \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0435 \\u043C\\u043E\\u0434\\u0435\\u043B\\u0438 (\\u041A\\u0443\\u0431\\u044B), \\u043D\\u043E \\u043D\\u0435\\u0442 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440 \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u0435 \\u043C\\u043E\\u0436\\u043D\\u043E \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0438\\u0442\\u044C \\u043A \\u043D\\u0438\\u043C!\n\\u041F\\u043E\\u0436\\u0430\\u043B\\u0443\\u0439\\u0441\\u0442\\u0430 \\u0434\\u043E\\u0431\\u0430\\u0432\\u044C\\u0442\\u0435 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443\\u0440\\u044B \\u043A \\u0432\\u0430\\u0448\\u0438\\u043C \\u043A\\u0443\\u0431\\u0430\\u043C, \\u0438\\u043B\\u0438 \\u0443\\u0434\\u0430\\u043B\\u0438\\u0442\\u0435 \\u0438\\u0445 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u043E\\u043C.`,Hee=`\\u041D\\u0435\\u0432\\u0435\\u0440\\u043D\\u044B\\u0439 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u043A\\u0443\\u0431\\u043E\\u0432!\n\n\\u041A\\u0443\\u0431\\u044B \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0438\\u043C\\u0435\\u0442\\u044C \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u0432 -45, -22.5, 0, 22.5, \\u0438\\u043B\\u0438 45 \\u0433\\u0440\\u0430\\u0434\\u0443\\u0441\\u043E\\u0432, \\u0438 \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u043E\\u0432\\u0451\\u0440\\u043D\\u0443\\u0442\\u044B \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043D\\u0430 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u043E\\u0441\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0431\\u043E\\u0440\\u0435 \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442 \\u0432\\u0435\\u0440\\u0441\\u0438\\u0439 \\u043D\\u0438\\u0436\\u0435 1.21.6.\n\n\\u0412\\u0441\\u0435 \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u043F\\u043E\\u0434\\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u044B \\u043A\\u0440\\u0430\\u0441\\u043D\\u044B\\u043C.`,Jee=`\\u041D\\u0435\\u0432\\u0435\\u0440\\u043D\\u044B\\u0439 \\u043F\\u043E\\u0432\\u043E\\u0440\\u043E\\u0442 \\u043A\\u0443\\u0431\\u043E\\u0432!\n\n\\u041A\\u0443\\u0431\\u044B \\u043C\\u043E\\u0433\\u0443\\u0442 \\u0431\\u044B\\u0442\\u044C \\u043F\\u043E\\u0432\\u0451\\u0440\\u043D\\u0443\\u0442\\u044B \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043D\\u0430 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u043E\\u0441\\u0438 \\u043F\\u0440\\u0438 \\u0432\\u044B\\u0431\\u043E\\u0440\\u0435 \\u041C\\u0430\\u0439\\u043D\\u043A\\u0440\\u0430\\u0444\\u0442 \\u0432\\u0435\\u0440\\u0441\\u0438\\u0438 1.21.6 \\u0438 \\u0432\\u044B\\u0448\\u0435.\n\n\\u0412\\u0441\\u0435 \\u043D\\u0435\\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u044B\\u0435 \\u043A\\u0443\\u0431\\u044B \\u043F\\u043E\\u0434\\u0441\\u0432\\u0435\\u0447\\u0435\\u043D\\u044B \\u043A\\u0440\\u0430\\u0441\\u043D\\u044B\\u043C.`,Gee=\"Animated Java\",Wee=\"\\u0416\\u0438\\u0434\\u043A\\u043E\\u0441\\u0442\\u0438 \\u043D\\u0435 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u044F\\u0442\\u0441\\u044F \\u0432 \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\\u0445.\",Kee=\"\\u0413\\u043E\\u043B\\u043E\\u0432\\u044B \\u043C\\u043E\\u0431\\u043E\\u0432 \\u043D\\u0435 \\u0440\\u0435\\u043D\\u0434\\u0435\\u0440\\u044F\\u0442\\u0441\\u044F \\u0432 \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\\u0445. \\u0418\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0439\\u0442\\u0435 \\u043F\\u0440\\u0435\\u0434\\u043C\\u0435\\u0442 \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u0439.\",Yee='\\u0421\\u043E\\u0441\\u0442\\u043E\\u044F\\u043D\\u0438\\u0435 \"facing\" \\u043D\\u0435 \\u043F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u0432 \\u0431\\u043B\\u043E\\u043A \\u0434\\u0438\\u0441\\u043F\\u043B\\u0435\\u044F\\u0445.',Xee=\"\\u041F\\u0443\\u0442\\u044C \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430 \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442.\",Zee=`\\u041F\\u0443\\u0442\\u044C \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442\\u0430 \\u0447\\u0435\\u0440\\u0442\\u0435\\u0436\\u0430 '{0}' \\u043D\\u0435 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442!\n\n\\u0423\\u0431\\u0435\\u0434\\u0438\\u0442\\u0435\\u0441\\u044C \\u0447\\u0442\\u043E \\u043F\\u0430\\u043F\\u043A\\u0430 \\u0432 \\u043A\\u043E\\u0442\\u043E\\u0440\\u0443\\u044E \\u043F\\u0440\\u043E\\u0438\\u0441\\u0445\\u043E\\u0434\\u0438\\u0442 \\u044D\\u043A\\u0441\\u043F\\u043E\\u0440\\u0442 \\u0441\\u0443\\u0449\\u0435\\u0441\\u0442\\u0432\\u0443\\u0435\\u0442 \\u0438 \\u043F\\u043E\\u043F\\u0440\\u043E\\u0431\\u0443\\u0439\\u0442\\u0435 \\u0441\\u043D\\u043E\\u0432\\u0430.`,Qee={\"animated_java.menubar.label\":VW,\"animated_java.format.blueprint.name\":zW,\"animated_java.action.open_blueprint_settings.name\":UW,\"animated_java.action.open_documentation.name\":qW,\"animated_java.action.open_changelog.name\":HW,\"animated_java.action.open_about.name\":JW,\"animated_java.action.open_display_entity_config.name\":GW,\"animated_java.action.open_locator_config.name\":WW,\"animated_java.action.export.name\":KW,\"animated_java.action.export_debug.name\":YW,\"animated_java.action.export_all.name\":XW,\"animated_java.action.export_all.description\":ZW,\"animated_java.action.export_all_debug.name\":QW,\"animated_java.action.export_all_debug.description\":$W,\"animated_java.action.extract.name\":eK,\"animated_java.action.extract.confirm\":tK,\"animated_java.action.create_text_display.title\":nK,\"animated_java.action.create_vanilla_item_display.title\":iK,\"animated_java.action.create_vanilla_block_display.title\":aK,\"animated_java.action.copy_display_entity_config.name\":rK,\"animated_java.action.copy_display_entity_config.message\":oK,\"animated_java.action.paste_display_entity_config.name\":sK,\"animated_java.action.paste_display_entity_config.message\":lK,\"animated_java.popup.loading.loading\":cK,\"animated_java.popup.loading.success\":uK,\"animated_java.popup.loading.offline\":dK,\"animated_java.popup.installed_popup.title\":pK,\"animated_java.popup.installed_popup.close_button\":mK,\"animated_java.popup.incompatability_popup.title\":fK,\"animated_java.popup.incompatability_popup.description\":hK,\"animated_java.popup.incompatability_popup.disable_button\":gK,\"animated_java.popup.incompatability_popup.button.disable_all\":_K,\"animated_java.popup.incompatability_popup.button.ignore\":xK,\"animated_java.plugin_dialog.incompatability_notice\":vK,\"animated_java.dialog.reset\":bK,\"animated_java.dialog.about.title\":yK,\"animated_java.dialog.about.close_button\":wK,\"animated_java.dialog.changelog_dialog.title\":EK,\"animated_java.dialog.unexpected_error.title\":kK,\"animated_java.dialog.unexpected_error.close_button\":jK,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":AK,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":TK,\"animated_java.dialog.unexpected_error.paragraph\":CK,\"animated_java.dialog.blueprint_settings.title\":SK,\"animated_java.dialog.blueprint_settings.project_settings.title\":OK,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":IK,\"animated_java.dialog.blueprint_settings.project_name.title\":DK,\"animated_java.dialog.blueprint_settings.project_name.description\":FK,\"animated_java.dialog.blueprint_settings.texture_size.title\":NK,\"animated_java.dialog.blueprint_settings.texture_size.description\":RK,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":MK,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":BK,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":PK,\"animated_java.dialog.blueprint_settings.export_settings.title\":LK,\"animated_java.dialog.blueprint_settings.export_namespace.title\":VK,\"animated_java.dialog.blueprint_settings.export_namespace.description\":zK,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":UK,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":qK,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":HK,\"animated_java.dialog.blueprint_settings.show_render_box.title\":JK,\"animated_java.dialog.blueprint_settings.show_render_box.description\":GK,\"animated_java.dialog.blueprint_settings.auto_render_box.title\":WK,\"animated_java.dialog.blueprint_settings.auto_render_box.description\":KK,\"animated_java.dialog.blueprint_settings.render_box.title\":YK,\"animated_java.dialog.blueprint_settings.render_box.description\":XK,\"animated_java.dialog.blueprint_settings.view_range.title\":ZK,\"animated_java.dialog.blueprint_settings.view_range.description\":QK,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":$K,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":eY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":tY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.folder\":nY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":iY,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":aY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":rY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.folder\":oY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":sY,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":lY,\"animated_java.dialog.blueprint_settings.target_minecraft_version.title\":cY,\"animated_java.dialog.blueprint_settings.target_minecraft_version.description\":uY,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":dY,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":pY,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":mY,\"animated_java.dialog.blueprint_settings.display_item.title\":fY,\"animated_java.dialog.blueprint_settings.display_item.description\":hY,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":gY,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":_Y,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":xY,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":vY,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":bY,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":yY,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":wY,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":EY,\"animated_java.dialog.blueprint_settings.resource_pack.title\":kY,\"animated_java.dialog.blueprint_settings.resource_pack.description\":jY,\"animated_java.dialog.blueprint_settings.resource_pack.warning.missing_assets_folder\":AY,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":TY,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":CY,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":SY,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":OY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":IY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":DY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":FY,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":NY,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":RY,\"animated_java.dialog.blueprint_settings.data_pack.title\":MY,\"animated_java.dialog.blueprint_settings.data_pack.description\":BY,\"animated_java.dialog.blueprint_settings.data_pack.warning.missing_data_folder\":PY,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":LY,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":VY,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":zY,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":UY,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":qY,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":HY,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":JY,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":GY,\"animated_java.dialog.blueprint_settings.on_summon_function.title\":WY,\"animated_java.dialog.blueprint_settings.on_summon_function.description\":KY,\"animated_java.dialog.blueprint_settings.on_remove_function.title\":YY,\"animated_java.dialog.blueprint_settings.on_remove_function.description\":XY,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.title\":ZY,\"animated_java.dialog.blueprint_settings.on_pre_tick_function.description\":QY,\"animated_java.dialog.blueprint_settings.on_post_tick_function.title\":$Y,\"animated_java.dialog.blueprint_settings.on_post_tick_function.description\":eX,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":tX,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":nX,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":iX,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":aX,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.title\":rX,\"animated_java.dialog.blueprint_settings.auto_update_rig_orientation.description\":oX,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":sX,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":lX,\"animated_java.dialog.blueprint_settings.baked_animations.title\":cX,\"animated_java.dialog.blueprint_settings.baked_animations.description\":uX,\"animated_java.dialog.blueprint_settings.json_file.title\":dX,\"animated_java.dialog.blueprint_settings.json_file.description\":pX,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":mX,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":fX,\"animated_java.dialog.display_entity.title\":hX,\"animated_java.dialog.display_entity.node_options.title\":gX,\"animated_java.dialog.display_entity.per_variant_options.title\":_X,\"animated_java.dialog.display_entity.on_summon_function.title\":xX,\"animated_java.dialog.display_entity.on_summon_function.description\":vX,\"animated_java.dialog.display_entity.on_apply_function.title\":bX,\"animated_java.dialog.display_entity.on_apply_function.description\":yX,\"animated_java.dialog.display_entity.custom_name.title\":wX,\"animated_java.dialog.display_entity.custom_name.description\":EX,\"animated_java.dialog.display_entity.custom_name.invalid_json.error\":kX,\"animated_java.dialog.display_entity.custom_name_visible.title\":jX,\"animated_java.dialog.display_entity.custom_name_visible.description\":AX,\"animated_java.dialog.display_entity.glowing.title\":TX,\"animated_java.dialog.display_entity.glowing.description\":CX,\"animated_java.dialog.display_entity.override_glow_color.title\":SX,\"animated_java.dialog.display_entity.override_glow_color.description\":OX,\"animated_java.dialog.display_entity.glow_color.title\":IX,\"animated_java.dialog.display_entity.glow_color.description\":DX,\"animated_java.dialog.display_entity.shadow_radius.title\":FX,\"animated_java.dialog.display_entity.shadow_radius.description\":NX,\"animated_java.dialog.display_entity.shadow_strength.title\":RX,\"animated_java.dialog.display_entity.shadow_strength.description\":MX,\"animated_java.dialog.display_entity.override_brightness.title\":BX,\"animated_java.dialog.display_entity.override_brightness.description\":PX,\"animated_java.dialog.display_entity.brightness_override.title\":LX,\"animated_java.dialog.display_entity.brightness_override.description\":VX,\"animated_java.dialog.display_entity.use_custom_brightness.title\":zX,\"animated_java.dialog.display_entity.use_custom_brightness.description\":UX,\"animated_java.dialog.display_entity.custom_brightness.title\":qX,\"animated_java.dialog.display_entity.custom_brightness.description\":HX,\"animated_java.dialog.display_entity.enchanted.title\":JX,\"animated_java.dialog.display_entity.enchanted.description\":GX,\"animated_java.dialog.display_entity.invisible.title\":WX,\"animated_java.dialog.display_entity.invisible.description\":KX,\"animated_java.dialog.display_entity.billboard.title\":YX,\"animated_java.dialog.display_entity.billboard.description\":XX,\"animated_java.dialog.display_entity.billboard.options.fixed\":ZX,\"animated_java.dialog.display_entity.billboard.options.vertical\":QX,\"animated_java.dialog.display_entity.billboard.options.horizontal\":$X,\"animated_java.dialog.display_entity.billboard.options.center\":eZ,\"animated_java.dialog.locator_config.title\":tZ,\"animated_java.dialog.locator_config.plugin_mode_warning\":nZ,\"animated_java.dialog.locator_config.use_entity.title\":iZ,\"animated_java.dialog.locator_config.use_entity.description\":aZ,\"animated_java.dialog.locator_config.entity_type.title\":rZ,\"animated_java.dialog.locator_config.entity_type.description\":oZ,\"animated_java.dialog.locator_config.entity_type.error.empty\":sZ,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":lZ,\"animated_java.dialog.locator_config.sync_passenger_rotation.title\":cZ,\"animated_java.dialog.locator_config.sync_passenger_rotation.description\":uZ,\"animated_java.dialog.locator_config.on_summon_function.title\":dZ,\"animated_java.dialog.locator_config.on_summon_function.description\":pZ,\"animated_java.dialog.locator_config.on_summon_function.description_with_use_entity\":mZ,\"animated_java.dialog.locator_config.on_remove_function.title\":fZ,\"animated_java.dialog.locator_config.on_remove_function.description\":hZ,\"animated_java.dialog.locator_config.on_remove_function.description_with_use_entity\":gZ,\"animated_java.dialog.locator_config.on_tick_function.title\":_Z,\"animated_java.dialog.locator_config.on_tick_function.description\":xZ,\"animated_java.dialog.locator_config.on_tick_function.description_with_use_entity\":vZ,\"animated_java.dialog.text_display_config.title\":bZ,\"animated_java.dialog.bone_config.vanilla_item_model.title\":yZ,\"animated_java.dialog.bone_config.vanilla_item_model.description\":wZ,\"animated_java.dialog.text_display_config.use_nbt.title\":EZ,\"animated_java.dialog.text_display_config.use_nbt.description\":kZ,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":jZ,\"animated_java.dialog.text_display_config.inherit_settings.title\":AZ,\"animated_java.dialog.text_display_config.inherit_settings.description\":TZ,\"animated_java.dialog.text_display_config.glowing.title\":CZ,\"animated_java.dialog.text_display_config.glowing.description\":SZ,\"animated_java.dialog.text_display_config.override_glow_color.title\":OZ,\"animated_java.dialog.text_display_config.override_glow_color.description\":IZ,\"animated_java.dialog.text_display_config.glow_color.title\":DZ,\"animated_java.dialog.text_display_config.glow_color.description\":FZ,\"animated_java.dialog.text_display_config.shadow_radius.title\":NZ,\"animated_java.dialog.text_display_config.shadow_radius.description\":RZ,\"animated_java.dialog.text_display_config.shadow_strength.title\":MZ,\"animated_java.dialog.text_display_config.shadow_strength.description\":BZ,\"animated_java.dialog.text_display_config.override_brightness.title\":PZ,\"animated_java.dialog.text_display_config.override_brightness.description\":LZ,\"animated_java.dialog.text_display_config.brightness_override.title\":VZ,\"animated_java.dialog.text_display_config.brightness_override.description\":zZ,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":UZ,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":qZ,\"animated_java.dialog.text_display_config.custom_brightness.title\":HZ,\"animated_java.dialog.text_display_config.custom_brightness.description\":JZ,\"animated_java.dialog.text_display_config.invisible.title\":GZ,\"animated_java.dialog.text_display_config.invisible.description\":WZ,\"animated_java.dialog.text_display_config.nbt.title\":KZ,\"animated_java.dialog.text_display_config.nbt.description\":YZ,\"animated_java.dialog.vanilla_block_display_config.title\":XZ,\"animated_java.dialog.vanilla_block_display.custom_name.title\":ZZ,\"animated_java.dialog.vanilla_block_display.custom_name.description\":QZ,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":$Z,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":eQ,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":tQ,\"animated_java.dialog.vanilla_item_display_config.title\":nQ,\"animated_java.dialog.vanilla_item_display.custom_name.title\":iQ,\"animated_java.dialog.vanilla_item_display.custom_name.description\":aQ,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":rQ,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":oQ,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":sQ,\"animated_java.dialog.variant_config.title\":lQ,\"animated_java.dialog.variant_config.variant_display_name\":cQ,\"animated_java.dialog.variant_config.variant_display_name.description\":uQ,\"animated_java.dialog.variant_config.generate_name_from_display_name\":dQ,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":pQ,\"animated_java.dialog.variant_config.variant_name\":mQ,\"animated_java.dialog.variant_config.variant_name.description\":fQ,\"animated_java.dialog.variant_config.texture_map.title\":hQ,\"animated_java.dialog.variant_config.texture_map.description\":gQ,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":_Q,\"animated_java.dialog.variant_config.texture_map.no_mappings\":xQ,\"animated_java.dialog.variant_config.bone_lists.description\":vQ,\"animated_java.dialog.variant_config.excluded_nodes.title\":bQ,\"animated_java.dialog.variant_config.excluded_nodes.description\":yQ,\"animated_java.dialog.variant_config.included_nodes.title\":wQ,\"animated_java.dialog.variant_config.included_nodes.description\":EQ,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":kQ,\"animated_java.action.upgrade_old_aj_model_loader.name\":jQ,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":AQ,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":TQ,\"animated_java.action.upgrade_old_aj_model_loader.body\":CQ,\"animated_java.action.upgrade_old_aj_model_loader.button\":SQ,\"animated_java.dialog.animation_properties.title\":OQ,\"animated_java.dialog.animation_properties.animation_name.title\":IQ,\"animated_java.dialog.animation_properties.animation_name.description\":DQ,\"animated_java.dialog.animation_properties.loop_mode.title\":FQ,\"animated_java.dialog.animation_properties.loop_mode.description\":NQ,\"animated_java.dialog.animation_properties.loop_mode.options.once\":RQ,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":MQ,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":BQ,\"animated_java.dialog.animation_properties.animation_name.error.empty\":PQ,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":LQ,\"animated_java.dialog.animation_properties.loop_delay.title\":VQ,\"animated_java.dialog.animation_properties.loop_delay.description\":zQ,\"animated_java.dialog.animation_properties.bone_lists.description\":UQ,\"animated_java.dialog.animation_properties.excluded_nodes.title\":qQ,\"animated_java.dialog.animation_properties.excluded_nodes.description\":HQ,\"animated_java.dialog.animation_properties.included_nodes.title\":JQ,\"animated_java.dialog.animation_properties.included_nodes.description\":GQ,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":WQ,\"animated_java.dialog.export_progress.title\":KQ,\"animated_java.dialog.blueprint_loading.title\":YQ,\"animated_java.panel.variants.title\":XQ,\"animated_java.panel.variants.tool.create_new_variant\":ZQ,\"animated_java.panel.variants.tool.edit_variant\":QQ,\"animated_java.panel.variants.tool.duplicate_selected_variant\":$Q,\"animated_java.panel.variants.tool.delete_selected_variant\":e$,\"animated_java.panel.variants.tool.variant_visible\":t$,\"animated_java.panel.variants.tool.variant_not_visible\":n$,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":i$,\"animated_java.panel.variants.tool.cannot_edit_default_variant\":a$,\"animated_java.action.variants.create\":r$,\"animated_java.action.variants.duplicate\":o$,\"animated_java.action.variants.open_config\":s$,\"animated_java.action.variants.delete\":l$,\"animated_java.animation.excluded_nodes\":c$,\"animated_java.animation.invert_excluded_nodes\":u$,\"animated_java.effect_animator.timeline.variant\":d$,\"animated_java.effect_animator.timeline.function\":p$,\"animated_java.effect_animator.keyframe_data_point.variant\":m$,\"animated_java.effect_animator.keyframe_data_point.function\":f$,\"animated_java.effect_animator.keyframe_data_point.execute_condition\":h$,\"animated_java.effect_animator.keyframe_data_point.repeat\":g$,\"animated_java.effect_animator.keyframe_data_point.repeat_frequency\":_$,\"animated_java.panel.keyframe.keyframe_title\":x$,\"animated_java.panel.keyframe.variant.title\":v$,\"animated_java.panel.keyframe.variant.description\":b$,\"animated_java.panel.keyframe.function.title\":y$,\"animated_java.panel.keyframe.function.description\":w$,\"animated_java.panel.keyframe.execute_condition.title\":E$,\"animated_java.panel.keyframe.execute_condition.description\":k$,\"animated_java.panel.keyframe.repeat.title\":j$,\"animated_java.panel.keyframe.repeat.description\":A$,\"animated_java.panel.keyframe.repeat_frequency.title\":T$,\"animated_java.panel.keyframe.repeat_frequency.description\":C$,\"animated_java.panel.keyframe.easing_type.title\":S$,\"animated_java.panel.keyframe.easing_type.description\":O$,\"animated_java.panel.keyframe.easing_type.options.linear\":I$,\"animated_java.panel.keyframe.easing_type.options.sine\":D$,\"animated_java.panel.keyframe.easing_type.options.quad\":F$,\"animated_java.panel.keyframe.easing_type.options.cubic\":N$,\"animated_java.panel.keyframe.easing_type.options.quart\":R$,\"animated_java.panel.keyframe.easing_type.options.quint\":M$,\"animated_java.panel.keyframe.easing_type.options.expo\":B$,\"animated_java.panel.keyframe.easing_type.options.circ\":P$,\"animated_java.panel.keyframe.easing_type.options.elastic\":L$,\"animated_java.panel.keyframe.easing_type.options.back\":V$,\"animated_java.panel.keyframe.easing_type.options.bounce\":z$,\"animated_java.panel.keyframe.easing_mode.title\":U$,\"animated_java.panel.keyframe.easing_mode.description\":q$,\"animated_java.panel.keyframe.easing_mode.options.in\":H$,\"animated_java.panel.keyframe.easing_mode.options.out\":J$,\"animated_java.panel.keyframe.easing_mode.options.inout\":G$,\"animated_java.panel.keyframe.easing_args.title\":W$,\"animated_java.panel.keyframe.easing_args.description\":K$,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":Y$,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":X$,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":Z$,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":Q$,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":$$,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":eee,\"animated_java.panel.keyframe.nonlinear_interpolation\":tee,\"animated_java.panel.text_display.title\":nee,\"animated_java.tool.text_display.line_width.title\":iee,\"animated_java.tool.text_display.line_width.description\":aee,\"animated_java.tool.text_display.background_color.title\":ree,\"animated_java.tool.text_display.background_color.description\":oee,\"animated_java.tool.text_display.text_shadow.title\":see,\"animated_java.tool.text_display.text_shadow.description\":lee,\"animated_java.tool.text_display.text_alignment.title\":cee,\"animated_java.tool.text_display.text_alignment.description\":uee,\"animated_java.tool.text_display.text_alignment.options.left\":dee,\"animated_java.tool.text_display.text_alignment.options.center\":pee,\"animated_java.tool.text_display.text_alignment.options.right\":mee,\"animated_java.tool.text_display.see_through.title\":fee,\"animated_java.tool.text_display.see_through.description\":hee,\"animated_java.tool.text_display.copy_text.title\":gee,\"animated_java.tool.text_display.copy_text.description\":_ee,\"animated_java.tool.text_display.copy_text.copied\":xee,\"animated_java.panel.vanilla_item_display.title\":vee,\"animated_java.panel.vanilla_item_display.description\":bee,\"animated_java.tool.item_display.item_display.title\":yee,\"animated_java.tool.item_display.item_display.description\":wee,\"animated_java.tool.item_display.item_display.options.none\":Eee,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":kee,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":jee,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":Aee,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":Tee,\"animated_java.tool.item_display.item_display.options.head\":Cee,\"animated_java.tool.item_display.item_display.options.gui\":See,\"animated_java.tool.item_display.item_display.options.ground\":Oee,\"animated_java.tool.item_display.item_display.options.fixed\":Iee,\"animated_java.panel.vanilla_block_display.title\":Dee,\"animated_java.panel.vanilla_block_display.description\":Fee,\"animated_java.vanilla_item_display.title\":Nee,\"animated_java.misc.failed_to_export.title\":Ree,\"animated_java.misc.failed_to_export.custom_models.message\":Mee,\"animated_java.misc.failed_to_export.blueprint_settings.message\":Bee,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":Pee,\"animated_java.misc.failed_to_export.button\":Lee,\"animated_java.misc.failed_to_export.invalid_rotation.message\":Vee,\"animated_java.misc.failed_to_export.invalid_rotation.message_post_1_21_6\":zee,\"animated_java.misc.failed_to_export.rig_has_textures_but_no_custom_models.message\":Uee,\"animated_java.misc.failed_to_export.rig_has_custom_models_but_no_textures.message\":qee,\"animated_java.toast.invalid_rotations\":Hee,\"animated_java.toast.invalid_rotations_post_1_21_6\":Jee,\"animated_java.format_category.animated_java\":Gee,\"animated_java.block_model_manager.fluid_warning\":Wee,\"animated_java.block_model_manager.mob_head_warning\":Kee,\"animated_java.block_model_manager.facing_warning\":Yee,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":Xee,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":Zee};var Tg={};vn(Tg,{\"animated_java.action.create_text_display.title\":()=>ote,\"animated_java.action.create_vanilla_block_display.title\":()=>lte,\"animated_java.action.create_vanilla_item_display.title\":()=>ste,\"animated_java.action.export.name\":()=>rte,\"animated_java.action.open_about.name\":()=>tte,\"animated_java.action.open_blueprint_settings.name\":()=>$ee,\"animated_java.action.open_bone_config.name\":()=>nte,\"animated_java.action.open_documentation.name\":()=>ete,\"animated_java.action.open_locator_config.name\":()=>ite,\"animated_java.action.open_text_display_config.name\":()=>ate,\"animated_java.action.open_vanilla_block_display_config.name\":()=>ute,\"animated_java.action.open_vanilla_item_display_config.name\":()=>cte,\"animated_java.action.upgrade_old_aj_model_loader.body\":()=>Rre,\"animated_java.action.upgrade_old_aj_model_loader.button\":()=>Mre,\"animated_java.action.upgrade_old_aj_model_loader.name\":()=>Dre,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":()=>Nre,\"animated_java.action.variants.create\":()=>doe,\"animated_java.action.variants.delete\":()=>foe,\"animated_java.action.variants.duplicate\":()=>poe,\"animated_java.action.variants.open_config\":()=>moe,\"animated_java.animation.excluded_nodes\":()=>hoe,\"animated_java.animation.invert_excluded_nodes\":()=>goe,\"animated_java.block_model_manager.facing_warning\":()=>Hse,\"animated_java.block_model_manager.fluid_warning\":()=>Use,\"animated_java.block_model_manager.mob_head_warning\":()=>qse,\"animated_java.dialog.about.close_button\":()=>xte,\"animated_java.dialog.about.title\":()=>_te,\"animated_java.dialog.animation_properties.animation_name.description\":()=>Lre,\"animated_java.dialog.animation_properties.animation_name.error.empty\":()=>Jre,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":()=>Gre,\"animated_java.dialog.animation_properties.animation_name.title\":()=>Pre,\"animated_java.dialog.animation_properties.bone_lists.description\":()=>Yre,\"animated_java.dialog.animation_properties.excluded_nodes.description\":()=>Zre,\"animated_java.dialog.animation_properties.excluded_nodes.title\":()=>Xre,\"animated_java.dialog.animation_properties.included_nodes.description\":()=>$re,\"animated_java.dialog.animation_properties.included_nodes.title\":()=>Qre,\"animated_java.dialog.animation_properties.loop_delay.description\":()=>Kre,\"animated_java.dialog.animation_properties.loop_delay.title\":()=>Wre,\"animated_java.dialog.animation_properties.loop_mode.description\":()=>zre,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":()=>qre,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":()=>Hre,\"animated_java.dialog.animation_properties.loop_mode.options.once\":()=>Ure,\"animated_java.dialog.animation_properties.loop_mode.title\":()=>Vre,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":()=>eoe,\"animated_java.dialog.animation_properties.title\":()=>Bre,\"animated_java.dialog.blueprint_loading.title\":()=>noe,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":()=>Dne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":()=>Ine,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":()=>Fne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":()=>Bne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":()=>Mne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":()=>Pne,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":()=>jte,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":()=>ene,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":()=>$te,\"animated_java.dialog.blueprint_settings.baked_animations.description\":()=>pie,\"animated_java.dialog.blueprint_settings.baked_animations.title\":()=>die,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":()=>Tte,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":()=>Ate,\"animated_java.dialog.blueprint_settings.bounding_box.description\":()=>nne,\"animated_java.dialog.blueprint_settings.bounding_box.title\":()=>tne,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":()=>_ne,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":()=>gne,\"animated_java.dialog.blueprint_settings.data_pack.description\":()=>Jne,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":()=>Wne,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":()=>Xne,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":()=>Yne,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":()=>Gne,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":()=>Kne,\"animated_java.dialog.blueprint_settings.data_pack.title\":()=>Hne,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":()=>Wte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":()=>Xte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":()=>Kte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":()=>Yte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":()=>Gte,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":()=>zne,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":()=>Qne,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":()=>$ne,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":()=>eie,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":()=>Zne,\"animated_java.dialog.blueprint_settings.display_item.description\":()=>cne,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":()=>dne,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":()=>pne,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":()=>hne,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":()=>une,\"animated_java.dialog.blueprint_settings.display_item.title\":()=>lne,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":()=>mne,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":()=>fne,\"animated_java.dialog.blueprint_settings.display_item_path.description\":()=>One,\"animated_java.dialog.blueprint_settings.display_item_path.title\":()=>Sne,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":()=>qne,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":()=>Une,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.description\":()=>sne,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":()=>one,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":()=>rne,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":()=>ane,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":()=>Vte,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":()=>Lte,\"animated_java.dialog.blueprint_settings.export_namespace.description\":()=>Rte,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":()=>Mte,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":()=>Pte,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":()=>Bte,\"animated_java.dialog.blueprint_settings.export_namespace.title\":()=>Nte,\"animated_java.dialog.blueprint_settings.export_settings.title\":()=>Fte,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":()=>oie,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":()=>rie,\"animated_java.dialog.blueprint_settings.json_file.description\":()=>fie,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":()=>hie,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":()=>gie,\"animated_java.dialog.blueprint_settings.json_file.title\":()=>mie,\"animated_java.dialog.blueprint_settings.model_folder.description\":()=>Rne,\"animated_java.dialog.blueprint_settings.model_folder.title\":()=>Nne,\"animated_java.dialog.blueprint_settings.resource_pack.description\":()=>vne,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":()=>yne,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":()=>kne,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":()=>Ene,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":()=>bne,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":()=>wne,\"animated_java.dialog.blueprint_settings.resource_pack.title\":()=>xne,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":()=>Ute,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":()=>Jte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":()=>qte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":()=>Hte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":()=>zte,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":()=>ine,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":()=>Ane,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":()=>Tne,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":()=>Cne,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":()=>jne,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":()=>Qte,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":()=>Zte,\"animated_java.dialog.blueprint_settings.summon_commands.description\":()=>nie,\"animated_java.dialog.blueprint_settings.summon_commands.title\":()=>tie,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":()=>lie,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":()=>sie,\"animated_java.dialog.blueprint_settings.texture_folder.description\":()=>Vne,\"animated_java.dialog.blueprint_settings.texture_folder.title\":()=>Lne,\"animated_java.dialog.blueprint_settings.texture_size.description\":()=>Ste,\"animated_java.dialog.blueprint_settings.texture_size.title\":()=>Cte,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":()=>Dte,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":()=>Ite,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":()=>Ote,\"animated_java.dialog.blueprint_settings.ticking_commands.description\":()=>aie,\"animated_java.dialog.blueprint_settings.ticking_commands.title\":()=>iie,\"animated_java.dialog.blueprint_settings.title\":()=>kte,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":()=>uie,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":()=>cie,\"animated_java.dialog.bone_config.billboard.description\":()=>aae,\"animated_java.dialog.bone_config.billboard.options.center\":()=>lae,\"animated_java.dialog.bone_config.billboard.options.fixed\":()=>rae,\"animated_java.dialog.bone_config.billboard.options.horizontal\":()=>sae,\"animated_java.dialog.bone_config.billboard.options.vertical\":()=>oae,\"animated_java.dialog.bone_config.billboard.title\":()=>iae,\"animated_java.dialog.bone_config.brightness_override.description\":()=>Hie,\"animated_java.dialog.bone_config.brightness_override.title\":()=>qie,\"animated_java.dialog.bone_config.custom_brightness.description\":()=>Kie,\"animated_java.dialog.bone_config.custom_brightness.title\":()=>Wie,\"animated_java.dialog.bone_config.custom_name.description\":()=>Tie,\"animated_java.dialog.bone_config.custom_name.invalid_json.error\":()=>Cie,\"animated_java.dialog.bone_config.custom_name.title\":()=>Aie,\"animated_java.dialog.bone_config.custom_name_visible.description\":()=>Oie,\"animated_java.dialog.bone_config.custom_name_visible.title\":()=>Sie,\"animated_java.dialog.bone_config.default_variant_subtitle\":()=>vie,\"animated_java.dialog.bone_config.enchanted.description\":()=>Xie,\"animated_java.dialog.bone_config.enchanted.title\":()=>Yie,\"animated_java.dialog.bone_config.glow_color.description\":()=>Mie,\"animated_java.dialog.bone_config.glow_color.title\":()=>Rie,\"animated_java.dialog.bone_config.glowing.description\":()=>Die,\"animated_java.dialog.bone_config.glowing.title\":()=>Iie,\"animated_java.dialog.bone_config.inherit_settings.description\":()=>jie,\"animated_java.dialog.bone_config.inherit_settings.title\":()=>kie,\"animated_java.dialog.bone_config.invisible.description\":()=>Qie,\"animated_java.dialog.bone_config.invisible.title\":()=>Zie,\"animated_java.dialog.bone_config.nbt.description\":()=>eae,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":()=>nae,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":()=>tae,\"animated_java.dialog.bone_config.nbt.title\":()=>$ie,\"animated_java.dialog.bone_config.override_brightness.description\":()=>Uie,\"animated_java.dialog.bone_config.override_brightness.title\":()=>zie,\"animated_java.dialog.bone_config.override_glow_color.description\":()=>Nie,\"animated_java.dialog.bone_config.override_glow_color.title\":()=>Fie,\"animated_java.dialog.bone_config.selected_variant\":()=>xie,\"animated_java.dialog.bone_config.selected_variant_subtitle\":()=>bie,\"animated_java.dialog.bone_config.shadow_radius.description\":()=>Pie,\"animated_java.dialog.bone_config.shadow_radius.title\":()=>Bie,\"animated_java.dialog.bone_config.shadow_strength.description\":()=>Vie,\"animated_java.dialog.bone_config.shadow_strength.title\":()=>Lie,\"animated_java.dialog.bone_config.title\":()=>_ie,\"animated_java.dialog.bone_config.use_custom_brightness.description\":()=>Gie,\"animated_java.dialog.bone_config.use_custom_brightness.title\":()=>Jie,\"animated_java.dialog.bone_config.use_nbt.description\":()=>wie,\"animated_java.dialog.bone_config.use_nbt.title\":()=>yie,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":()=>Eie,\"animated_java.dialog.bone_config.vanilla_item_model.description\":()=>Eae,\"animated_java.dialog.bone_config.vanilla_item_model.title\":()=>wae,\"animated_java.dialog.export_progress.title\":()=>toe,\"animated_java.dialog.installed_popup.close_button\":()=>hte,\"animated_java.dialog.installed_popup.title\":()=>fte,\"animated_java.dialog.locator_config.entity_type.description\":()=>fae,\"animated_java.dialog.locator_config.entity_type.error.empty\":()=>hae,\"animated_java.dialog.locator_config.entity_type.title\":()=>mae,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":()=>gae,\"animated_java.dialog.locator_config.plugin_mode_warning\":()=>uae,\"animated_java.dialog.locator_config.summon_commands.description\":()=>xae,\"animated_java.dialog.locator_config.summon_commands.title\":()=>_ae,\"animated_java.dialog.locator_config.ticking_commands.description\":()=>bae,\"animated_java.dialog.locator_config.ticking_commands.title\":()=>vae,\"animated_java.dialog.locator_config.title\":()=>cae,\"animated_java.dialog.locator_config.use_entity.description\":()=>pae,\"animated_java.dialog.locator_config.use_entity.title\":()=>dae,\"animated_java.dialog.reset\":()=>gte,\"animated_java.dialog.text_display_config.billboard.description\":()=>Qae,\"animated_java.dialog.text_display_config.billboard.options.center\":()=>nre,\"animated_java.dialog.text_display_config.billboard.options.fixed\":()=>$ae,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":()=>tre,\"animated_java.dialog.text_display_config.billboard.options.vertical\":()=>ere,\"animated_java.dialog.text_display_config.billboard.title\":()=>Zae,\"animated_java.dialog.text_display_config.brightness_override.description\":()=>Uae,\"animated_java.dialog.text_display_config.brightness_override.title\":()=>zae,\"animated_java.dialog.text_display_config.custom_brightness.description\":()=>Gae,\"animated_java.dialog.text_display_config.custom_brightness.title\":()=>Jae,\"animated_java.dialog.text_display_config.glow_color.description\":()=>Nae,\"animated_java.dialog.text_display_config.glow_color.title\":()=>Fae,\"animated_java.dialog.text_display_config.glowing.description\":()=>Oae,\"animated_java.dialog.text_display_config.glowing.title\":()=>Sae,\"animated_java.dialog.text_display_config.inherit_settings.description\":()=>Cae,\"animated_java.dialog.text_display_config.inherit_settings.title\":()=>Tae,\"animated_java.dialog.text_display_config.invisible.description\":()=>Kae,\"animated_java.dialog.text_display_config.invisible.title\":()=>Wae,\"animated_java.dialog.text_display_config.nbt.description\":()=>Xae,\"animated_java.dialog.text_display_config.nbt.title\":()=>Yae,\"animated_java.dialog.text_display_config.override_brightness.description\":()=>Vae,\"animated_java.dialog.text_display_config.override_brightness.title\":()=>Lae,\"animated_java.dialog.text_display_config.override_glow_color.description\":()=>Dae,\"animated_java.dialog.text_display_config.override_glow_color.title\":()=>Iae,\"animated_java.dialog.text_display_config.shadow_radius.description\":()=>Mae,\"animated_java.dialog.text_display_config.shadow_radius.title\":()=>Rae,\"animated_java.dialog.text_display_config.shadow_strength.description\":()=>Pae,\"animated_java.dialog.text_display_config.shadow_strength.title\":()=>Bae,\"animated_java.dialog.text_display_config.title\":()=>yae,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":()=>Hae,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":()=>qae,\"animated_java.dialog.text_display_config.use_nbt.description\":()=>jae,\"animated_java.dialog.text_display_config.use_nbt.title\":()=>kae,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":()=>Aae,\"animated_java.dialog.unexpected_error.close_button\":()=>bte,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":()=>wte,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":()=>yte,\"animated_java.dialog.unexpected_error.paragraph\":()=>Ete,\"animated_java.dialog.unexpected_error.title\":()=>vte,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":()=>Fre,\"animated_java.dialog.vanilla_block_display.custom_name.description\":()=>rre,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":()=>ore,\"animated_java.dialog.vanilla_block_display.custom_name.title\":()=>are,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":()=>lre,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":()=>sre,\"animated_java.dialog.vanilla_block_display_config.title\":()=>ire,\"animated_java.dialog.vanilla_item_display.custom_name.description\":()=>dre,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":()=>pre,\"animated_java.dialog.vanilla_item_display.custom_name.title\":()=>ure,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":()=>fre,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":()=>mre,\"animated_java.dialog.vanilla_item_display_config.title\":()=>cre,\"animated_java.dialog.variant_config.bone_lists.description\":()=>Are,\"animated_java.dialog.variant_config.excluded_nodes.description\":()=>Cre,\"animated_java.dialog.variant_config.excluded_nodes.title\":()=>Tre,\"animated_java.dialog.variant_config.generate_name_from_display_name\":()=>xre,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":()=>vre,\"animated_java.dialog.variant_config.included_nodes.description\":()=>Ore,\"animated_java.dialog.variant_config.included_nodes.title\":()=>Sre,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":()=>Ire,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":()=>kre,\"animated_java.dialog.variant_config.texture_map.description\":()=>Ere,\"animated_java.dialog.variant_config.texture_map.no_mappings\":()=>jre,\"animated_java.dialog.variant_config.texture_map.title\":()=>wre,\"animated_java.dialog.variant_config.title\":()=>hre,\"animated_java.dialog.variant_config.variant_display_name\":()=>gre,\"animated_java.dialog.variant_config.variant_display_name.description\":()=>_re,\"animated_java.dialog.variant_config.variant_name\":()=>bre,\"animated_java.dialog.variant_config.variant_name.description\":()=>yre,\"animated_java.effect_animator.keyframes.commands\":()=>boe,\"animated_java.effect_animator.keyframes.execute_condition\":()=>yoe,\"animated_java.effect_animator.keyframes.variant\":()=>voe,\"animated_java.effect_animator.timeline.commands\":()=>xoe,\"animated_java.effect_animator.timeline.variant\":()=>_oe,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":()=>Gse,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":()=>Jse,\"animated_java.format_category.animated_java\":()=>zse,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":()=>Lse,\"animated_java.misc.failed_to_export.blueprint_settings.message\":()=>Pse,\"animated_java.misc.failed_to_export.button\":()=>Vse,\"animated_java.misc.failed_to_export.custom_models.message\":()=>Bse,\"animated_java.misc.failed_to_export.title\":()=>Mse,\"animated_java.panel.keyframe.commands.description\":()=>Aoe,\"animated_java.panel.keyframe.commands.title\":()=>joe,\"animated_java.panel.keyframe.easing_args.description\":()=>Qoe,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":()=>nse,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":()=>tse,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":()=>ase,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":()=>ise,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":()=>ese,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":()=>$oe,\"animated_java.panel.keyframe.easing_args.title\":()=>Zoe,\"animated_java.panel.keyframe.easing_mode.description\":()=>Woe,\"animated_java.panel.keyframe.easing_mode.options.in\":()=>Koe,\"animated_java.panel.keyframe.easing_mode.options.inout\":()=>Xoe,\"animated_java.panel.keyframe.easing_mode.options.out\":()=>Yoe,\"animated_java.panel.keyframe.easing_mode.title\":()=>Goe,\"animated_java.panel.keyframe.easing_type.description\":()=>Noe,\"animated_java.panel.keyframe.easing_type.options.back\":()=>Hoe,\"animated_java.panel.keyframe.easing_type.options.bounce\":()=>Joe,\"animated_java.panel.keyframe.easing_type.options.circ\":()=>Uoe,\"animated_java.panel.keyframe.easing_type.options.cubic\":()=>Poe,\"animated_java.panel.keyframe.easing_type.options.elastic\":()=>qoe,\"animated_java.panel.keyframe.easing_type.options.expo\":()=>zoe,\"animated_java.panel.keyframe.easing_type.options.linear\":()=>Roe,\"animated_java.panel.keyframe.easing_type.options.quad\":()=>Boe,\"animated_java.panel.keyframe.easing_type.options.quart\":()=>Loe,\"animated_java.panel.keyframe.easing_type.options.quint\":()=>Voe,\"animated_java.panel.keyframe.easing_type.options.sine\":()=>Moe,\"animated_java.panel.keyframe.easing_type.title\":()=>Foe,\"animated_java.panel.keyframe.execute_condition.description\":()=>Coe,\"animated_java.panel.keyframe.execute_condition.title\":()=>Toe,\"animated_java.panel.keyframe.keyframe_title\":()=>woe,\"animated_java.panel.keyframe.nonlinear_interpolation\":()=>rse,\"animated_java.panel.keyframe.repeat.description\":()=>Ooe,\"animated_java.panel.keyframe.repeat.title\":()=>Soe,\"animated_java.panel.keyframe.repeat_frequency.description\":()=>Doe,\"animated_java.panel.keyframe.repeat_frequency.title\":()=>Ioe,\"animated_java.panel.keyframe.variant.description\":()=>koe,\"animated_java.panel.keyframe.variant.title\":()=>Eoe,\"animated_java.panel.text_display.title\":()=>ose,\"animated_java.panel.vanilla_block_display.description\":()=>Nse,\"animated_java.panel.vanilla_block_display.title\":()=>Fse,\"animated_java.panel.vanilla_item_display.description\":()=>yse,\"animated_java.panel.vanilla_item_display.title\":()=>bse,\"animated_java.panel.variants.title\":()=>ioe,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":()=>uoe,\"animated_java.panel.variants.tool.create_new_variant\":()=>aoe,\"animated_java.panel.variants.tool.delete_selected_variant\":()=>soe,\"animated_java.panel.variants.tool.duplicate_selected_variant\":()=>ooe,\"animated_java.panel.variants.tool.edit_variant\":()=>roe,\"animated_java.panel.variants.tool.variant_not_visible\":()=>coe,\"animated_java.panel.variants.tool.variant_visible\":()=>loe,\"animated_java.popup.loading.loading\":()=>dte,\"animated_java.popup.loading.offline\":()=>mte,\"animated_java.popup.loading.success\":()=>pte,\"animated_java.tool.item_display.item_display.description\":()=>Ese,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":()=>Tse,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":()=>Cse,\"animated_java.tool.item_display.item_display.options.fixed\":()=>Dse,\"animated_java.tool.item_display.item_display.options.ground\":()=>Ise,\"animated_java.tool.item_display.item_display.options.gui\":()=>Ose,\"animated_java.tool.item_display.item_display.options.head\":()=>Sse,\"animated_java.tool.item_display.item_display.options.none\":()=>kse,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":()=>jse,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":()=>Ase,\"animated_java.tool.item_display.item_display.title\":()=>wse,\"animated_java.tool.text_display.background_color.description\":()=>use,\"animated_java.tool.text_display.background_color.title\":()=>cse,\"animated_java.tool.text_display.line_width.description\":()=>lse,\"animated_java.tool.text_display.line_width.title\":()=>sse,\"animated_java.tool.text_display.see_through.description\":()=>vse,\"animated_java.tool.text_display.see_through.title\":()=>xse,\"animated_java.tool.text_display.text_alignment.description\":()=>fse,\"animated_java.tool.text_display.text_alignment.options.center\":()=>gse,\"animated_java.tool.text_display.text_alignment.options.left\":()=>hse,\"animated_java.tool.text_display.text_alignment.options.right\":()=>_se,\"animated_java.tool.text_display.text_alignment.title\":()=>mse,\"animated_java.tool.text_display.text_shadow.description\":()=>pse,\"animated_java.tool.text_display.text_shadow.title\":()=>dse,\"animated_java.vanilla_item_display.title\":()=>Rse,default:()=>Wse});var $ee=\"\\u84DD\\u56FE\\u8BBE\\u7F6E\",ete=\"\\u6587\\u6863\",tte=\"\\u5173\\u4E8E\",nte=\"\\u9AA8\\u9ABC\\u914D\\u7F6E\",ite=\"\\u5B9A\\u4F4D\\u5668\\u914D\\u7F6E\",ate=\"\\u6587\\u672C\\u5C55\\u793A\\u914D\\u7F6E\",rte=\"\\u5BFC\\u51FA\",ote=\"\\u6DFB\\u52A0\\u6587\\u672C\\u5C55\\u793A\\u5B9E\\u4F53\",ste=\"\\u6DFB\\u52A0\\u7269\\u54C1\\u5C55\\u793A\\u5B9E\\u4F53\",lte=\"\\u6DFB\\u52A0\\u65B9\\u5757\\u5C55\\u793A\\u5B9E\\u4F53\",cte=\"\\u7269\\u54C1\\u5C55\\u793A\\u914D\\u7F6E\",ute=\"\\u65B9\\u5757\\u5C55\\u793A\\u914D\\u7F6E\",dte=\"Animated Java \\u52A0\\u8F7D\\u4E2D...\",pte=\"Animated Java \\u52A0\\u8F7D\\u5B8C\\u6210\\uFF01\",mte=`Animated Java \\u8FDE\\u63A5\\u5931\\u8D25\\uFF01\n\\u90E8\\u5206\\u529F\\u80FD\\u5C06\\u4E0D\\u53EF\\u7528\\u3002`,fte=\"\\u611F\\u8C22\\u5B89\\u88C5\\uFF01\",hte=\"\\u662F\\u65F6\\u5019\\u52A8\\u8D77\\u6765\\u4E86\\uFF01\",gte=\"\\u91CD\\u7F6E\\u4E3A\\u9ED8\\u8BA4\\u503C\",_te=\"\\u5173\\u4E8E Animated Java\",xte=\"\\u5173\\u95ED\",vte=\"\\u53D1\\u751F\\u4E86\\u610F\\u5916\\u9519\\u8BEF\\uFF01\",bte=\"\\u5173\\u95ED\",yte=\"\\u5DF2\\u590D\\u5236\\u9519\\u8BEF\\u4FE1\\u606F\\uFF01\",wte=\"\\u70B9\\u51FB\\u4FDD\\u5B58\\u9519\\u8BEF\\u4FE1\\u606F\\u5230\\u526A\\u5207\\u677F\\u3002\",Ete=\"\\u53EF\\u52A0\\u5165 Discord \\u670D\\u52A1\\u5668 {0} \\u5E76\\u5728 #animated-java-support \\u9891\\u9053\\u521B\\u5EFA\\u8BA8\\u8BBA\\u4E32\\u6765\\u62A5\\u544A\\u8BE5\\u9519\\u8BEF\\u4FE1\\u606F\\uFF0C\\u6216\\u5728 {1} \\u4E0B\\u521B\\u5EFA\\u4E00\\u4E2Aissue\\u3002\\u8C22\\u8C22\\uFF01\",kte=\"\\u84DD\\u56FE\\u8BBE\\u7F6E\",jte=\"\\u4EC5\\u5728\\u5341\\u5206\\u5FC5\\u8981\\u65F6\\u4F7F\\u7528\\u9AD8\\u7EA7\\u8BBE\\u7F6E\\uFF01\",Ate=\"\\u84DD\\u56FE\\u540D\\u79F0\",Tte=\"\\u84DD\\u56FE\\u7684\\u540D\\u79F0\\uFF0C\\u4EC5\\u7528\\u4E8E\\u8BC6\\u522B\\u5DE5\\u4F5C\\u533A\\u4E2D\\u7684\\u9879\\u76EE\\u3002\",Cte=\"\\u7EB9\\u7406\\u5C3A\\u5BF8\",Ste=\"UV\\u7F16\\u8F91\\u5668\\u7684\\u5206\\u8FA8\\u7387\\uFF0C\\u5E94\\u5F53\\u4E0E\\u6700\\u5927\\u7684\\u7EB9\\u7406\\u5C3A\\u5BF8\\u4E00\\u81F4\\u3002\\u4E3A\\u8FBE\\u5230\\u66F4\\u597D\\u7684\\u6E38\\u620F\\u6548\\u679C\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528\\u957F\\u5BBD\\u76F8\\u7B49\\u4E14\\u4E3A2\\u7684\\u5E42\\u6B21\\u65B9\\u7684\\u8D34\\u56FE\\u3002\",Ote=\"\\u4E3A\\u8FBE\\u5230\\u6700\\u4F73\\u6548\\u679C\\uFF0C\\u7EB9\\u7406\\u7684\\u957F\\u4E0E\\u5BBD\\u5E94\\u8BE5\\u76F8\\u7B49\\u3002\",Ite=\"\\u4E3A\\u8FBE\\u5230\\u6700\\u4F73\\u6548\\u679C\\uFF0C\\u7EB9\\u7406\\u7684\\u5C3A\\u5BF8\\u5E94\\u4E3A2\\u7684\\u5E42\\u6B21\\u65B9\\u3002\",Dte=\"\\u7EB9\\u7406\\u7684\\u5C3A\\u5BF8\\u5E94\\u5F53\\u4E0E\\u6700\\u5927\\u7EB9\\u7406\\u7684\\u5C3A\\u5BF8\\u4E00\\u81F4\\u3002\",Fte=\"\\u5BFC\\u51FA\\u8BBE\\u7F6E\",Nte=\"\\u5BFC\\u51FA\\u547D\\u540D\\u7A7A\\u95F4\",Rte=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u65F6\\u6240\\u4F7F\\u7528\\u7684\\u540D\\u79F0\\uFF0C\\u6216\\u8005\\u8BF4\\u662F\\u5BFC\\u51FA\\u4E3A\\u8D44\\u6E90\\u5305\\u4E0E\\u6570\\u636E\\u5305\\u65F6\\u6240\\u4F7F\\u7528\\u7684\\u547D\\u540D\\u7A7A\\u95F4\\u3002\",Mte=\"\\u5BFC\\u51FA\\u547D\\u540D\\u7A7A\\u95F4\\u4E0D\\u80FD\\u4E3A\\u7A7A\\uFF01\",Bte=\"\\u5BFC\\u51FA\\u547D\\u540D\\u7A7A\\u95F4 \\u201C{0}\\u201D \\u4EC5\\u7528\\u4E8E\\u5185\\u90E8\\u8FD0\\u4F5C\\uFF01\\u8BF7\\u4F7F\\u7528\\u5176\\u4ED6\\u547D\\u540D\\u7A7A\\u95F4\\u3002\",Pte=\"\\u5BFC\\u51FA\\u547D\\u540D\\u7A7A\\u95F4\\u7684\\u540D\\u79F0\\u5305\\u542B\\u4E86\\u975E\\u6CD5\\u5B57\\u7B26\\uFF01\\u8BF7\\u4EC5\\u4F7F\\u7528\\u82F1\\u6587\\u5B57\\u7B26\\u3001\\u6570\\u5B57\\u548C\\u4E0B\\u5212\\u7EBF\\u3002\",Lte=\"\\u63D2\\u4EF6\\u6A21\\u5F0F\",Vte=\"\\u662F\\u5426\\u5F00\\u542F\\u63D2\\u4EF6\\u6A21\\u5F0F\\uFF0C\\u8BA1\\u5212\\u4F7F\\u7528\\u57FA\\u4E8E\\u63D2\\u4EF6\\u800C\\u975E\\u8D44\\u6E90\\u5305/\\u6570\\u636E\\u5305\\u7684\\u8BDD\\u542F\\u7528\\u8BE5\\u6A21\\u5F0F\\u3002\",zte=\"\\u8D44\\u6E90\\u5305\\u5BFC\\u51FA\\u6A21\\u5F0F\",Ute=`\\u8D44\\u6E90\\u5305\\u7684\\u5BFC\\u51FA\\u65B9\\u5F0F\\u3002\n\\u539F\\u59CB - \\u8D44\\u6E90\\u5305\\u4EE5\\u6587\\u4EF6\\u5939\\u7684\\u65B9\\u5F0F\\u5BFC\\u51FA\\u3002\n\\u538B\\u7F29 - \\u8D44\\u6E90\\u5305\\u4EE5 .zip \\u538B\\u7F29\\u5305\\u7684\\u65B9\\u5F0F\\u5BFC\\u51FA\\u3002\n\\u65E0 - \\u5173\\u95ED\\u5BF9\\u8D44\\u6E90\\u5305\\u7684\\u5BFC\\u51FA\\u3002`,qte=\"\\u539F\\u59CB\",Hte=\"\\u538B\\u7F29\",Jte=\"\\u65E0\",Gte=\"\\u6570\\u636E\\u5305\\u5BFC\\u51FA\\u6A21\\u5F0F\",Wte=`\\u6570\\u636E\\u5305\\u7684\\u5BFC\\u51FA\\u65B9\\u5F0F\\u3002\n\\u539F\\u59CB - \\u6570\\u636E\\u5305\\u4EE5\\u6587\\u4EF6\\u5939\\u7684\\u65B9\\u5F0F\\u5BFC\\u51FA\\u3002\n\\u538B\\u7F29 - \\u6570\\u636E\\u5305\\u4EE5 .zip \\u538B\\u7F29\\u5305\\u7684\\u65B9\\u5F0F\\u5BFC\\u51FA\\u3002\n\\u65E0 - \\u5173\\u95ED\\u5BF9\\u6570\\u636E\\u5305\\u7684\\u5BFC\\u51FA\\u3002`,Kte=\"\\u539F\\u59CB\",Yte=\"\\u538B\\u7F29\",Xte=\"\\u65E0\",Zte=\"\\u663E\\u793A\\u8FB9\\u754C\\u6846\",Qte=\"\\u662F\\u5426\\u5728\\u7F16\\u8F91\\u6A21\\u5F0F\\u4E0B\\u663E\\u793A\\u8FB9\\u754C\\u6846\\u3002\",$te=\"\\u81EA\\u52A8\\u8FB9\\u754C\\u6846\",ene=`\\u662F\\u5426\\u6839\\u636E\\u6A21\\u578B\\u7684\\u5F62\\u72B6\\u81EA\\u52A8\\u8BA1\\u7B97\\u8FB9\\u754C\\u6846\\u3002\n\\u6CE8\\uFF1A\\u81EA\\u52A8\\u8FB9\\u754C\\u6846\\u5E76\\u4E0D\\u4F1A\\u6839\\u636E\\u52A8\\u753B\\u65F6\\u9AA8\\u9ABC\\u7684\\u504F\\u79FB\\u8FDB\\u884C\\u8BA1\\u7B97\\uFF0C\\u6240\\u4EE5\\u53EF\\u80FD\\u5BFC\\u81F4\\u6BD4\\u9884\\u60F3\\u4E2D\\u8981\\u5C0F\\u7684\\u60C5\\u51B5\\u3002`,tne=\"\\u8FB9\\u754C\\u6846\",nne=\"\\u786E\\u5B9A\\u6A21\\u578B\\u7684\\u5254\\u9664\\u6846\\uFF0C\\u5F53\\u8BE5\\u6846\\u79BB\\u5F00\\u5C4F\\u5E55\\u65F6\\u5C06\\u505C\\u6B62\\u8BE5\\u6A21\\u578B\\u7684\\u6E32\\u67D3\\u3002\",ine=\"\\u8D44\\u6E90\\u5305\\u8BBE\\u7F6E\",ane=\"\\u9AD8\\u7EA7\\u8BBE\\u7F6E\",rne=\"\\u662F\\u5426\\u542F\\u7528\\u8D44\\u6E90\\u5305\\u7684\\u9AD8\\u7EA7\\u8BBE\\u7F6E\\u3002\",one=\"\\u9AD8\\u7EA7\\u6587\\u4EF6\\u5939\",sne=\"\\u662F\\u5426\\u542F\\u7528\\u9AD8\\u7EA7\\u8D44\\u6E90\\u5305\\u6587\\u4EF6\\u5939\\u8BBE\\u7F6E\\u3002\",lne=\"\\u627F\\u8F7D\\u7269\",cne=\"\\u6E38\\u620F\\u4E2D\\u7528\\u4E8E\\u663E\\u793A\\u84DD\\u56FE\\u5185\\u6A21\\u578B\\u7684\\u7269\\u54C1\\u3002\\u591A\\u4E2A\\u84DD\\u56FE\\u4F7F\\u7528\\u76F8\\u540C\\u7684\\u7269\\u54C1\\u65F6\\u4F1A\\u88AB\\u81EA\\u52A8\\u5408\\u5E76\\u3002\",une=\"\\u672A\\u6307\\u5B9A\\u7269\\u54C1\\uFF01\",dne=\"\\u6240\\u63D0\\u4F9B\\u7684\\u7269\\u54C1ID\\u65E0\\u6548\\uFF01\\u7269\\u54C1ID\\u7684\\u586B\\u5199\\u683C\\u5F0F\\u5E94\\u4E3A \\u547D\\u540D\\u7A7A\\u95F4:\\u7269\\u54C1id \\u3002\",pne=\"\\u6240\\u63D0\\u4F9B\\u7684\\u7269\\u54C1ID\\u65E0\\u6548\\uFF01\\u7269\\u54C1ID\\u4E0D\\u5E94\\u5305\\u542B\\u7A7A\\u683C\\u3002\",mne=\"\\u539F\\u7248\\u4E0D\\u5B58\\u5728\\u6240\\u6307\\u5B9A\\u7684\\u7269\\u54C1\\uFF01\",fne=\"\\u6240\\u9009\\u7269\\u54C1\\u5E76\\u672A\\u4F7F\\u7528 'minecraft:item/generated' \\u4E3A\\u7236\\u7C7B\\u3002\\u53EF\\u80FD\\u4F1A\\u5BFC\\u81F4\\u6E38\\u620F\\u4E2D\\u7684\\u6A21\\u578B\\u51FA\\u73B0\\u95EE\\u9898\\u3002\",hne=\"\\u6240\\u9009\\u7269\\u54C1\\u5728\\u539F\\u7248\\u8D44\\u6E90\\u5305\\u4E2D\\u4E0D\\u5B58\\u5728\\u6A21\\u578B\\u6587\\u4EF6\\uFF01\",gne=\"CMD \\u504F\\u4F4D\",_ne=\"\\u627F\\u8F7D\\u7269\\u7684 Custom Model Data \\u6240\\u4F7F\\u7528\\u7684\\u504F\\u79FB\\u91CF\\u3002\\u5141\\u8BB8\\u4E92\\u76F8\\u72EC\\u7ACB\\u7684\\u8D44\\u6E90\\u5305\\u5185\\u7684\\u591A\\u4E2A\\u84DD\\u56FE\\u4F7F\\u7528\\u76F8\\u540C\\u7684\\u7269\\u54C1\\u4E3A\\u627F\\u8F7D\\u7269\\u3002\",xne=\"\\u8D44\\u6E90\\u5305\",vne=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u5230\\u7684\\u8D44\\u6E90\\u5305\\u7684\\u6839\\u6587\\u4EF6\\u5939\\u3002\",bne=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\u5939\\uFF01\",yne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u4E0D\\u5B58\\u5728\\uFF01\",wne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\u5939\\uFF01\",Ene=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u7F3A\\u5C11 pack.mcmeta \\u6587\\u4EF6\\uFF01\",kne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8D44\\u6E90\\u5305\\u7F3A\\u5C11 assets \\u6587\\u4EF6\\u5939\\uFF01\",jne=\"\\u538B\\u7F29\\u8D44\\u6E90\\u5305\",Ane=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u5230 .zip \\u6587\\u4EF6\\u7684\\u8DEF\\u5F84\\u3002\",Tne=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\uFF01\",Cne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\uFF01\",Sne=\"\\u627F\\u8F7D\\u7269\\u8DEF\\u5F84\",One=\"\\u6240\\u6709\\u627F\\u8F7D\\u7269\\u7684\\u5B58\\u653E\\u4F4D\\u7F6E\\u3002\\u5E94\\u4E3A\\u8D44\\u6E90\\u5305\\u5185\\u5230 .json \\u6587\\u4EF6\\u7684\\u8DEF\\u5F84\\u3002\",Ine=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\uFF01\",Dne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u4E0D\\u5B58\\u5728\\uFF01\",Fne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\uFF01\",Nne=\"\\u6A21\\u578B\\u6587\\u4EF6\\u5939\",Rne=\"\\u6240\\u6709\\u5BFC\\u51FA\\u6A21\\u578B\\u7684\\u5B58\\u653E\\u4F4D\\u7F6E\\u3002\\u5E94\\u4E3A\\u8D44\\u6E90\\u5305\\u5185\\u5230\\u6587\\u4EF6\\u5939\\u7684\\u8DEF\\u5F84\\u3002\",Mne=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\u5939\\uFF01\",Bne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u4E0D\\u5B58\\u5728\\uFF01\",Pne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\u5939\\uFF01\",Lne=\"\\u7EB9\\u7406\\u6587\\u4EF6\\u5939\",Vne=\"\\u6240\\u6709\\u5BFC\\u51FA\\u7EB9\\u7406\\u7684\\u5B58\\u653E\\u4F4D\\u7F6E\\u3002\\u5E94\\u4E3A\\u8D44\\u6E90\\u5305\\u5185\\u5230\\u6587\\u4EF6\\u5939\\u7684\\u8DEF\\u5F84\\u3002\",zne=\"\\u6570\\u636E\\u5305\\u8BBE\\u7F6E\",Une=\"\\u542F\\u7528\\u9AD8\\u7EA7\\u8BBE\\u7F6E\",qne=\"\\u662F\\u5426\\u542F\\u7528\\u6570\\u636E\\u5305\\u7684\\u9AD8\\u7EA7\\u8BBE\\u7F6E\\u3002\",Hne=\"\\u6570\\u636E\\u5305\",Jne=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u5230\\u7684\\u6570\\u636E\\u5305\\u7684\\u6839\\u6587\\u4EF6\\u5939\\u3002\",Gne=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\u5939\\uFF01\",Wne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u4E0D\\u5B58\\u5728\\uFF01\",Kne=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\u5939\\uFF01\",Yne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u7F3A\\u5C11 pack.mcmeta \\u6587\\u4EF6\\uFF01\",Xne=\"\\u6240\\u6307\\u5B9A\\u7684\\u6570\\u636E\\u5305\\u7F3A\\u5C11 data \\u6587\\u4EF6\\u5939\\uFF01\",Zne=\"\\u538B\\u7F29\\u6570\\u636E\\u5305\",Qne=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u5230 .zip \\u6587\\u4EF6\\u7684\\u8DEF\\u5F84\\u3002\",$ne=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\uFF01\",eie=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\uFF01\",tie=\"\\u8FDB\\u573A\\u547D\\u4EE4\",nie=`\\u88AB summon \\u65F6\\u4EE5\\u6839\\u5B9E\\u4F53\\u6267\\u884C\\u7684\\u547D\\u4EE4\\u3002\n\\u8BE5\\u4F4D\\u7F6E\\u7684\\u6587\\u672C\\u8F93\\u5165\\u53EF\\u89C6\\u4E3A\\u5728 .mcfunction \\u4E2D\\u8FD0\\u884C\\u3002\\uFF08\\u4E5F\\u652F\\u6301 MC-Build \\u8BED\\u6CD5\\uFF01\\uFF09`,iie=\"\\u9AD8\\u9891\\u547D\\u4EE4\",aie=`\\u5728\\u6839\\u5B9E\\u4F53\\u4F4D\\u7F6E\\u9AD8\\u9891\\u6267\\u884C\\u7684\\u547D\\u4EE4\\u3002\n\\u8BE5\\u4F4D\\u7F6E\\u7684\\u6587\\u672C\\u8F93\\u5165\\u53EF\\u89C6\\u4E3A\\u5728 .mcfunction \\u4E2D\\u8FD0\\u884C\\u3002\\uFF08\\u4E5F\\u652F\\u6301 MC-Build \\u8BED\\u6CD5\\uFF01\\uFF09\n\\u8BE5\\u547D\\u4EE4\\u5C06\\u5728\\u52A8\\u753B\\u903B\\u8F91\\u4E4B\\u540E\\u6267\\u884C\\u3002`,rie=\"\\u63D2\\u503C\\u65F6\\u95F4\",oie=\"\\u4EE5tick\\u4E3A\\u5355\\u4F4D\\uFF0C\\u5173\\u952E\\u5E27\\u4E4B\\u95F4\\u5E73\\u6ED1\\u8FC7\\u6E21\\u7684\\u6301\\u7EED\\u65F6\\u95F4\\u3002\\u662F\\u6A21\\u578B\\u8FC7\\u6E21\\u5230\\u4E0B\\u4E00\\u4E2A\\u5173\\u952E\\u5E27\\u6240\\u7528\\u7684\\u65F6\\u95F4\\u3002\\u8F83\\u9AD8\\u7684\\u63D2\\u503C\\u65F6\\u95F4\\u5C06\\u5BFC\\u81F4\\u52A8\\u753B\\u5931\\u53BB\\u7CBE\\u5EA6\\uFF0C\\u56E0\\u6B64\\u8BE5\\u503C\\u4E00\\u822C\\u5EFA\\u8BAE\\u4E3A1\\u62162\\u3002\",sie=\"\\u4F20\\u9001\\u65F6\\u95F4\",lie=\"\\u4EE5tick\\u4E3A\\u5355\\u4F4D\\uFF0C\\u5173\\u952E\\u5E27\\u4E4B\\u95F4\\u4F20\\u9001\\u7684\\u6301\\u7EED\\u65F6\\u95F4\\u3002\\u662F\\u6A21\\u578B\\u5728\\u89C6\\u89C9\\u4E0A\\u4ECE\\u4E0A\\u4E00\\u4E2A\\u4F4D\\u7F6E\\u8FC7\\u6E21\\u5230\\u65B0\\u4F4D\\u7F6E\\u6240\\u7528\\u7684\\u65F6\\u95F4\\u3002\\u8F83\\u9AD8\\u7684\\u4F20\\u9001\\u65F6\\u95F4\\u5C06\\u5BFC\\u81F4\\u52A8\\u753B\\u5931\\u53BB\\u7CBE\\u5EA6\\u3002\",cie=\"\\u4F7F\\u7528 storage \\u5B58\\u50A8\\u52A8\\u753B\",uie=`\\u662F\\u5426\\u4F7F\\u7528 NBT storage \\u4EE3\\u66FF\\u51FD\\u6570\\u8FDB\\u884C\\u52A8\\u753B\\u6570\\u636E\\u5B58\\u50A8\\u3002\n\\u5C06\\u4F1A\\u5927\\u5927\\u51CF\\u5C11\\u6570\\u636E\\u5305\\u751F\\u6210\\u65F6\\u7684\\u51FD\\u6570\\u6587\\u4EF6\\u6570\\u91CF\\uFF0C\\u76F8\\u5BF9\\u7684\\u8FD9\\u4F1A\\u6BD4\\u4F7F\\u7528\\u51FD\\u6570\\u5B58\\u50A8\\u7684\\u529E\\u6CD5\\u616242%\\u3002`,die=\"\\u70D8\\u57F9\\u52A8\\u753B\",pie=`\\u662F\\u5426\\u70D8\\u57F9\\u5BFC\\u51FA\\u7684\\u52A8\\u753B\\u3002\n\\u5DF2\\u70D8\\u57F9\\u52A8\\u753B\\u7684\\u5E27\\u4F1A\\u9884\\u5148\\u8BA1\\u7B97\\u5E76\\u5B58\\u50A8\\u5728\\u5BFC\\u51FA\\u7684 JSON \\u6587\\u4EF6\\u4E2D\\uFF0C\\u4ECE\\u800C\\u964D\\u4F4E\\u5728\\u6E38\\u620F\\u4E2D\\u6E32\\u67D3\\u6A21\\u578B\\u65F6\\u7684\\u590D\\u6742\\u6027\\u3002\n\\u90E8\\u5206\\u63D2\\u4EF6\\u53EF\\u80FD\\u9700\\u8981\\u5F00\\u542F\\u8FD9\\u9879\\u4EE5\\u786E\\u4FDD\\u6B63\\u5E38\\u8FD0\\u4F5C\\u3002`,mie=\"JSON \\u6587\\u4EF6\",fie=\"\\u9879\\u76EE\\u5BFC\\u51FA\\u5230 JSON \\u6587\\u4EF6\\u7684\\u8DEF\\u5F84\\u3002\",hie=\"\\u672A\\u6307\\u5B9A\\u6587\\u4EF6\\uFF01\",gie=\"\\u6240\\u6307\\u5B9A\\u7684\\u8DEF\\u5F84\\u5E76\\u975E\\u6587\\u4EF6\\uFF01\",_ie=\"\\u9AA8\\u9ABC\\u914D\\u7F6E\",xie=\"\\u201C\\u5DF2\\u9009\\u53D8\\u4F53\\uFF1A{0}\\u201D\",vie=\"\\u4EE5\\u4E0B\\u8BBE\\u7F6E\\u5C06\\u9ED8\\u8BA4\\u5E94\\u7528\\u5230\\u8BE5\\u9AA8\\u9ABC\\u3002\",bie=\"\\u4EE5\\u4E0B\\u8BBE\\u7F6E\\u4EC5\\u5728\\u5E94\\u7528\\u8BE5\\u53D8\\u4F53\\u65F6\\u5E94\\u7528\\u5230\\u8BE5\\u9AA8\\u9ABC\\u3002\",yie=\"\\u4F7F\\u7528 NBT\",wie=\"\\u662F\\u5426\\u4F7F\\u7528 NBT \\u53D6\\u4EE3\\u8BBE\\u7F6E\\u8FDB\\u884C\\u9AA8\\u9ABC\\u914D\\u7F6E\\u3002\",Eie=\"\\u4F7F\\u7528 NBT \\u5C06\\u4F1A\\u8986\\u76D6\\u6240\\u6709\\u5176\\u4ED6\\u8BBE\\u7F6E\\uFF0C\\u4EFB\\u4F55\\u66F4\\u6539\\u4E5F\\u4E0D\\u4F1A\\u5728\\u7F16\\u8F91\\u5668\\u4E2D\\u53EF\\u89C1\\u3002\\u4EC5\\u5728\\u719F\\u6089\\u6B64\\u529F\\u80FD\\u7684\\u60C5\\u51B5\\u4E0B\\u4F7F\\u7528\\uFF01\",kie=\"\\u7EE7\\u627F\\u8BBE\\u7F6E\",jie=\"\\u662F\\u5426\\u4ECE\\u7236\\u7EA7\\u9AA8\\u9ABC\\u7EE7\\u627F\\u8BBE\\u7F6E\\u3002\",Aie=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\",Tie=\"\\u9AA8\\u9ABC\\u7684\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u3002\",Cie=`\\u65E0\\u6548\\u7684 JSON \\u6587\\u672C\\uFF01\n{0}`,Sie=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u53EF\\u89C1\\u6027\",Oie=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u662F\\u5426\\u603B\\u662F\\u53EF\\u89C1\\u3002\",Iie=\"\\u53D1\\u5149\",Die=\"\\u9AA8\\u9ABC\\u662F\\u5426\\u5728\\u6E38\\u620F\\u4E2D\\u53D1\\u5149\\u3002\",Fie=\"\\u4FEE\\u6539\\u53D1\\u5149\\u989C\\u8272\",Nie=\"\\u662F\\u5426\\u6539\\u53D8\\u53D1\\u5149\\u7684\\u9ED8\\u8BA4\\u989C\\u8272\\u3002\",Rie=\"\\u53D1\\u5149\\u989C\\u8272\",Mie=\"\\u53D1\\u5149\\u7684\\u989C\\u8272\\u3002\",Bie=\"\\u9634\\u5F71\\u534A\\u5F84\",Pie=\"\\u9634\\u5F71\\u7684\\u534A\\u5F84\\u3002\",Lie=\"\\u9634\\u5F71\\u5F3A\\u5EA6\",Vie=\"\\u9634\\u5F71\\u7684\\u5F3A\\u5EA6\\u3002\",zie=\"\\u4FEE\\u6539\\u4EAE\\u5EA6\",Uie=\"\\u662F\\u5426\\u4FEE\\u6539\\u4EAE\\u5EA6\\u7684\\u9ED8\\u8BA4\\u7B49\\u7EA7\\u3002\",qie=\"\\u4EAE\\u5EA6\",Hie=\"\\u9AA8\\u9ABC\\u7684\\u4EAE\\u5EA6\\u3002\\u53D6\\u503C\\u8303\\u56F4\\u4E3A0\\u81F315\\u4E4B\\u95F4\\u3002\",Jie=\"\\u4F7F\\u7528\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\",Gie=\"\\u9AA8\\u9ABC\\u662F\\u5426\\u542F\\u7528\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\\u3002\",Wie=\"\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\",Kie=\"\\u9AA8\\u9ABC\\u7684\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\\u3002\\u53D6\\u503C\\u8303\\u56F4\\u4E3A0\\u81F315\\u4E4B\\u95F4\\u3002\",Yie=\"\\u9644\\u9B54\",Xie=\"\\u9AA8\\u9ABC\\u662F\\u5426\\u4E3A\\u9644\\u9B54\\u72B6\\u6001\\u6548\\u679C\\u3002\",Zie=\"\\u9690\\u5F62\",Qie=\"\\u9AA8\\u9ABC\\u662F\\u5426\\u9690\\u5F62\\u3002\",$ie=\"NBT\",eae=\"\\u5E94\\u7528\\u5230\\u9AA8\\u9ABC\\u7684NBT\\u3002\",tae=`\\u586B\\u5199\\u7684NBT\\u5E94\\u4E3A\\u590D\\u5408\\u6807\\u7B7E\\uFF01\\u4F8B\\uFF1A{CustomName:'\"\\u4F60\\u7684\\u540D\\u5B57\"'}`,nae=`\\u65E0\\u6548\\u7684NBT\\uFF01\n{0}`,iae=\"\\u5E7F\\u544A\\u724C\",aae=\"\\u63A7\\u5236\\u6B64\\u9AA8\\u9ABC\\u5728\\u6E32\\u67D3\\u65F6\\u5982\\u4F55\\u65CB\\u8F6C\\u4EE5\\u9762\\u5411\\u73A9\\u5BB6\\u3002\\u53EF\\u8BBE\\u7F6E\\u4E3A\\u56FA\\u5B9A\\uFF08\\u56FA\\u5B9A\\u5782\\u76F4\\u548C\\u6C34\\u5E73\\u8F74\\uFF0C\\u65E0\\u65CB\\u8F6C\\uFF09\\uFF0C\\u5782\\u76F4\\uFF08\\u56FA\\u5B9A\\u5782\\u76F4\\u8F74\\uFF09\\uFF0C\\u6C34\\u5E73\\uFF08\\u56FA\\u5B9A\\u6C34\\u5E73\\u8F74\\uFF09\\uFF0C\\u548C\\u4E2D\\u5FC3\\uFF08\\u6309\\u7167\\u4E2D\\u5FC3\\u65CB\\u8F6C\\u8DDF\\u968F\\u73A9\\u5BB6\\u89C6\\u89D2\\uFF09\\u3002\",rae=\"\\u56FA\\u5B9A\",oae=\"\\u5782\\u76F4\",sae=\"\\u6C34\\u5E73\",lae=\"\\u4E2D\\u5FC3\",cae=\"\\u5B9A\\u4F4D\\u5668\\u914D\\u7F6E\",uae=`\\u63D2\\u4EF6\\u6A21\\u5F0F\\u5DF2\\u542F\\u7528\\uFF01\\u8BE5\\u6A21\\u5F0F\\u4E0B\\u6CA1\\u6709\\u5B9A\\u4F4D\\u5668\\u914D\\u7F6E\\u3002\n\\u8BF7\\u4F7F\\u7528\\u63D2\\u4EF6API\\u4E3A\\u5B9A\\u4F4D\\u5668\\u6DFB\\u52A0\\u81EA\\u5B9A\\u4E49\\u529F\\u80FD\\u3002\n\\u8BE6\\u60C5\\u8BF7\\u67E5\\u770B\\u5B98\\u65B9\\u7684\\u63D2\\u4EF6API\\u6587\\u6863\\u3002`,dae=\"\\u4F7F\\u7528\\u5B9E\\u4F53\",pae=\"\\u662F\\u5426\\u5728\\u5B9A\\u4F4D\\u5668\\u5904\\u9644\\u52A0\\u8DDF\\u968F\\u5B9E\\u4F53\\u3002\",mae=\"\\u5B9E\\u4F53\\u7C7B\\u578B\",fae=\"\\u9644\\u52A0\\u5230\\u5B9A\\u4F4D\\u5668\\u7684\\u5B9E\\u4F53\\u7C7B\\u578B\\u3002\",hae=\"\\u5B9E\\u4F53\\u7C7B\\u578B\\u4E0D\\u80FD\\u4E3A\\u7A7A\\uFF01\",gae=\"\\u6240\\u9009\\u7684\\u5B9E\\u4F53\\u7C7B\\u578B {0} \\u4E0D\\u5B58\\u5728\\u4E8EMinecraft\\u4E2D\\u3002\",_ae=\"\\u8FDB\\u573A\\u547D\\u4EE4\",xae=`\\u88AB summon \\u65F6\\u4EE5\\u5B9A\\u4F4D\\u5668\\u5B9E\\u4F53\\u6267\\u884C\\u7684\\u547D\\u4EE4\\u3002\n\\u8BE5\\u4F4D\\u7F6E\\u7684\\u6587\\u672C\\u8F93\\u5165\\u53EF\\u89C6\\u4E3A\\u5728 .mcfunction \\u4E2D\\u8FD0\\u884C\\u3002\\uFF08\\u4E5F\\u652F\\u6301 MC-Build \\u8BED\\u6CD5\\uFF01\\uFF09`,vae=\"\\u9AD8\\u9891\\u547D\\u4EE4\",bae=`\\u5728\\u5B9A\\u4F4D\\u5668\\u4F4D\\u7F6E\\u9AD8\\u9891\\u6267\\u884C\\u7684\\u547D\\u4EE4\\u3002\n\\u8BE5\\u4F4D\\u7F6E\\u7684\\u6587\\u672C\\u8F93\\u5165\\u53EF\\u89C6\\u4E3A\\u5728 .mcfunction \\u4E2D\\u8FD0\\u884C\\u3002\\uFF08\\u4E5F\\u652F\\u6301 MC-Build \\u8BED\\u6CD5\\uFF01\\uFF09`,yae=\"\\u6587\\u672C\\u5C55\\u793A\\u914D\\u7F6E\",wae=\"\\u539F\\u7248\\u7269\\u54C1\\u6A21\\u578B\",Eae=`\\u82E5\\u8BBE\\u7F6E\\uFF0C\\u6B64\\u9AA8\\u9ABC\\u5C06\\u663E\\u793A\\u4E3A\\u539F\\u7248\\u7269\\u54C1\\u6A21\\u578B\\u3002\n\\u5E76\\u4E14\\u8986\\u76D6\\u9AA8\\u9ABC\\u73B0\\u6709\\u7684\\u65B9\\u5757\\u3002`,kae=\"\\u4F7F\\u7528 NBT\",jae=\"\\u662F\\u5426\\u4F7F\\u7528 NBT \\u53D6\\u4EE3\\u8BBE\\u7F6E\\u8FDB\\u884C\\u6587\\u672C\\u5C55\\u793A\\u914D\\u7F6E\\u3002\",Aae=\"\\u4F7F\\u7528 NBT \\u5C06\\u4F1A\\u8986\\u76D6\\u6240\\u6709\\u5176\\u4ED6\\u8BBE\\u7F6E\\uFF0C\\u4EFB\\u4F55\\u66F4\\u6539\\u4E5F\\u4E0D\\u4F1A\\u5728\\u7F16\\u8F91\\u5668\\u4E2D\\u53EF\\u89C1\\u3002\\u4EC5\\u5728\\u719F\\u6089\\u6B64\\u529F\\u80FD\\u7684\\u60C5\\u51B5\\u4E0B\\u4F7F\\u7528\\uFF01\",Tae=\"\\u7EE7\\u627F\\u8BBE\\u7F6E\",Cae=\"\\u662F\\u5426\\u4ECE\\u7236\\u7EA7\\u6587\\u672C\\u5C55\\u793A\\u7EE7\\u627F\\u8BBE\\u7F6E\\u3002\",Sae=\"\\u53D1\\u5149\",Oae=\"\\u6587\\u672C\\u5C55\\u793A\\u662F\\u5426\\u5728\\u6E38\\u620F\\u4E2D\\u53D1\\u5149\\u3002\",Iae=\"\\u4FEE\\u6539\\u53D1\\u5149\\u989C\\u8272\",Dae=\"\\u662F\\u5426\\u6539\\u53D8\\u53D1\\u5149\\u7684\\u9ED8\\u8BA4\\u989C\\u8272\\u3002\",Fae=\"\\u53D1\\u5149\\u989C\\u8272\",Nae=\"\\u53D1\\u5149\\u7684\\u989C\\u8272\",Rae=\"\\u9634\\u5F71\\u534A\\u5F84\",Mae=\"\\u9634\\u5F71\\u7684\\u534A\\u5F84\\u3002\",Bae=\"\\u9634\\u5F71\\u5F3A\\u5EA6\",Pae=\"\\u9634\\u5F71\\u7684\\u5F3A\\u5EA6\",Lae=\"\\u4FEE\\u6539\\u4EAE\\u5EA6\",Vae=\"\\u662F\\u5426\\u4FEE\\u6539\\u4EAE\\u5EA6\\u7684\\u9ED8\\u8BA4\\u7B49\\u7EA7\\u3002\",zae=\"\\u4EAE\\u5EA6\",Uae=\"\\u6587\\u672C\\u5C55\\u793A\\u7684\\u4EAE\\u5EA6\\u3002\\u53D6\\u503C\\u8303\\u56F4\\u4E3A0\\u81F315\\u4E4B\\u95F4\\u3002\",qae=\"\\u4F7F\\u7528\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\",Hae=\"\\u9AA8\\u9ABC\\u662F\\u5426\\u542F\\u7528\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\\u3002\",Jae=\"\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\",Gae=\"\\u9AA8\\u9ABC\\u7684\\u81EA\\u5B9A\\u4E49\\u4EAE\\u5EA6\\u3002\\u53D6\\u503C\\u8303\\u56F4\\u4E3A0\\u81F315\\u4E4B\\u95F4\\u3002\",Wae=\"\\u9690\\u5F62\",Kae=\"\\u6587\\u672C\\u5C55\\u793A\\u662F\\u5426\\u9690\\u5F62\\u3002\",Yae=\"NBT\",Xae=\"\\u5E94\\u7528\\u5230\\u6587\\u672C\\u5C55\\u793A\\u7684NBT\\u3002\",Zae=\"\\u5E7F\\u544A\\u724C\",Qae=\"\\u63A7\\u5236\\u6B64\\u6587\\u672C\\u5C55\\u793A\\u5728\\u6E32\\u67D3\\u65F6\\u5982\\u4F55\\u65CB\\u8F6C\\u4EE5\\u9762\\u5411\\u73A9\\u5BB6\\u3002\\u53EF\\u8BBE\\u7F6E\\u4E3A\\u56FA\\u5B9A\\uFF08\\u56FA\\u5B9A\\u5782\\u76F4\\u548C\\u6C34\\u5E73\\u8F74\\uFF0C\\u65E0\\u65CB\\u8F6C\\uFF09\\uFF0C\\u5782\\u76F4\\uFF08\\u56FA\\u5B9A\\u5782\\u76F4\\u8F74\\uFF09\\uFF0C\\u6C34\\u5E73\\uFF08\\u56FA\\u5B9A\\u6C34\\u5E73\\u8F74\\uFF09\\uFF0C\\u548C\\u4E2D\\u5FC3\\uFF08\\u6309\\u7167\\u4E2D\\u5FC3\\u65CB\\u8F6C\\u8DDF\\u968F\\u73A9\\u5BB6\\u89C6\\u89D2\\uFF09\\u3002\",$ae=\"\\u56FA\\u5B9A\",ere=\"\\u5782\\u76F4\",tre=\"\\u6C34\\u5E73\",nre=\"\\u4E2D\\u5FC3\",ire=\"\\u65B9\\u5757\\u5C55\\u793A\\u914D\\u7F6E\",are=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\",rre=\"\\u65B9\\u5757\\u5C55\\u793A\\u7684\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u3002\",ore=`\\u65E0\\u6548\\u7684 JSON \\u6587\\u672C\\uFF01\n{0}`,sre=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u53EF\\u89C1\\u6027\",lre=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u662F\\u5426\\u603B\\u662F\\u53EF\\u89C1\\u3002\",cre=\"\\u7269\\u54C1\\u5C55\\u793A\\u914D\\u7F6E\",ure=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\",dre=\"\\u7269\\u54C1\\u5C55\\u793A\\u7684\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u3002\",pre=`\\u65E0\\u6548\\u7684 JSON \\u6587\\u672C\\uFF01\n{0}`,mre=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u53EF\\u89C1\\u6027\",fre=\"\\u81EA\\u5B9A\\u4E49\\u540D\\u79F0\\u662F\\u5426\\u603B\\u662F\\u53EF\\u89C1\\u3002\",hre=\"\\u53D8\\u4F53\\u914D\\u7F6E\",gre=\"\\u663E\\u793A\\u540D\\u79F0\",_re=\"\\u7528\\u4E8E\\u5728\\u7F16\\u8F91\\u5668\\u548C\\u9519\\u8BEF\\u4FE1\\u606F\\u4E2D\\u8BC6\\u522B\\u53D8\\u4F53\\u3002\",xre=\"\\u751F\\u6210\\u663E\\u793A\\u540D\\u79F0\",vre=\"\\u662F\\u5426\\u6839\\u636E\\u663E\\u793A\\u540D\\u79F0\\u81EA\\u52A8\\u751F\\u6210\\u540D\\u79F0\\u3002\",bre=\"\\u540D\\u79F0\",yre=\"\\u7528\\u4E8E\\u5728\\u5BFC\\u51FA\\u7684\\u8D44\\u6E90\\u5305\\u548C\\u6570\\u636E\\u5305\\u4E2D\\u8BC6\\u522B\\u53D8\\u4F53\\u3002\",wre=\"\\u7EB9\\u7406\\u6620\\u5C04\",Ere=\"\\u5E94\\u7528\\u8BE5\\u53D8\\u4F53\\u65F6\\u6240\\u4F7F\\u7528\\u7684\\u8D34\\u56FE\\u3002\",kre=\"\\u521B\\u5EFA\\u65B0\\u7684\\u6620\\u5C04\",jre=\"\\u53D8\\u4F53\\u4E0D\\u5B58\\u5728\\u6620\\u5C04\\u7684\\u7EB9\\u7406\\u3002\",Are=\"\\u5305\\u542B\\u6216\\u6392\\u9664\\u5728\\u53D8\\u4F53\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u5305\\u542B\\u7684\\u8282\\u70B9\\u5C06\\u4F1A\\u88AB\\u53D8\\u4F53\\u4FEE\\u6539\\uFF0C\\u6392\\u9664\\u7684\\u8282\\u70B9\\u5219\\u4F1A\\u88AB\\u8282\\u70B9\\u5FFD\\u7565\\u3002\",Tre=\"\\u6392\\u9664\\u8282\\u70B9\",Cre=\"\\u6392\\u9664\\u5728\\u53D8\\u4F53\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u8BE5\\u8282\\u70B9\\u5C06\\u4E0D\\u4F1A\\u88AB\\u53D8\\u4F53\\u4FEE\\u6539\\u3002\",Sre=\"\\u5305\\u542B\\u8282\\u70B9\",Ore=\"\\u5305\\u542B\\u5728\\u53D8\\u4F53\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u8BE5\\u8282\\u70B9\\u5C06\\u4F1A\\u88AB\\u53D8\\u4F53\\u4FEE\\u6539\\u3002\",Ire=\"\\u4E92\\u6362\\u5217\\u8868\",Dre=\"\\u66F4\\u65B0 .ajmodel\",Fre=\"\\u66F4\\u65B0 .ajmodel\",Nre=\"\\u9009\\u62E9 .ajmodel \\u6587\\u4EF6\",Rre=\"\\u5347\\u7EA7\\u65E7\\u7248 .ajmodel \\u6587\\u4EF6\\u4E3A\\u65B0\\u7684 .ajblueprint \\u683C\\u5F0F\\u6587\\u4EF6\\u3002\",Mre=\"\\u9009\\u62E9\\u9700\\u8981\\u66F4\\u65B0\\u7684 .ajmodel \\u6587\\u4EF6\",Bre=\"\\u52A8\\u753B\\u5C5E\\u6027 ({0})\",Pre=\"\\u52A8\\u753B\\u540D\\u79F0\",Lre=\"\\u52A8\\u753B\\u7684\\u540D\\u79F0\\u3002\",Vre=\"\\u5FAA\\u73AF\\u6A21\\u5F0F\",zre=\"\\u52A8\\u753B\\u7684\\u5FAA\\u73AF\\u65B9\\u5F0F\\u3002\\u5355\\u6B21 - \\u52A8\\u753B\\u64AD\\u653E\\u4E00\\u6B21\\u540E\\u505C\\u6B62\\u3002\\u505C\\u7559 - \\u52A8\\u753B\\u64AD\\u653E\\u4E00\\u6B21\\u540E\\u505C\\u7559\\u5728\\u6700\\u540E\\u5E27\\u3002\\u5FAA\\u73AF - \\u52A8\\u753B\\u91CD\\u590D\\u64AD\\u653E\\u3002\",Ure=\"\\u5355\\u6B21\",qre=\"\\u505C\\u7559\",Hre=\"\\u5FAA\\u73AF\",Jre=\"\\u52A8\\u753B\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\\uFF01\",Gre=\"\\u52A8\\u753B\\u7684\\u540D\\u79F0\\u5305\\u542B\\u4E86\\u975E\\u6CD5\\u5B57\\u7B26\\uFF01\\u8BF7\\u4EC5\\u4F7F\\u7528\\u82F1\\u6587\\u5B57\\u7B26\\u3001\\u6570\\u5B57\\u3001\\u4E0B\\u5212\\u7EBF\\u548C\\u82F1\\u6587\\u70B9\\u53F7\\u3002\",Wre=\"\\u5FAA\\u73AF\\u5EF6\\u8FDF\",Kre=\"\\u5FAA\\u73AF\\u7684\\u5EF6\\u8FDF\\u3002\\u52A8\\u753B\\u7ED3\\u675F\\u540E\\u5230\\u518D\\u6B21\\u64AD\\u653E\\u7684\\u95F4\\u9694\\u65F6\\u95F4\\u3002\\u4EC5\\u5728\\u5FAA\\u73AF\\u6A21\\u5F0F\\u4E3A\\u5FAA\\u73AF\\u65F6\\u9002\\u7528\\u3002\",Yre=\"\\u5305\\u542B\\u6216\\u6392\\u9664\\u5728\\u52A8\\u753B\\u4E2D\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u5305\\u542B\\u7684\\u8282\\u70B9\\u5C06\\u4F1A\\u88AB\\u52A8\\u753B\\u4FEE\\u6539\\uFF0C\\u6392\\u9664\\u7684\\u8282\\u70B9\\u5219\\u4F1A\\u88AB\\u52A8\\u753B\\u5FFD\\u7565\\u3002\",Xre=\"\\u6392\\u9664\\u8282\\u70B9\",Zre=\"\\u6392\\u9664\\u5728\\u52A8\\u753B\\u4E2D\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u8BE5\\u8282\\u70B9\\u5C06\\u4E0D\\u4F1A\\u88AB\\u52A8\\u753B\\u4FEE\\u6539\\u3002\",Qre=\"\\u5305\\u542B\\u8282\\u70B9\",$re=\"\\u5305\\u542B\\u5728\\u52A8\\u753B\\u4E2D\\u7684\\u8282\\u70B9\\u5217\\u8868\\u3002\\u8BE5\\u8282\\u70B9\\u5C06\\u4F1A\\u88AB\\u52A8\\u753B\\u4FEE\\u6539\\u3002\",eoe=\"\\u4E92\\u6362\\u5217\\u8868\",toe=\"\\u5BFC\\u51FA\\u4E2D...\",noe=\"\\u84DD\\u56FE\\u52A0\\u8F7D\\u4E2D...\",ioe=\"\\u53D8\\u4F53\",aoe=\"\\u521B\\u5EFA\\u65B0\\u53D8\\u4F53\",roe=\"\\u7F16\\u8F91\\u53D8\\u4F53\",ooe=\"\\u590D\\u5236\\u6240\\u9009\\u53D8\\u4F53\",soe=\"\\u5220\\u9664\\u6240\\u9009\\u53D8\\u4F53\",loe=\"\\u5DF2\\u9009\\u62E9\\u53D8\\u4F53\",coe=\"\\u672A\\u9009\\u62E9\\u53D8\\u4F53\",uoe=\"\\u4E0D\\u53EF\\u5220\\u9664\\u9ED8\\u8BA4\\u53D8\\u4F53\\uFF01\",doe=\"\\u521B\\u5EFA\\u53D8\\u4F53\",poe=\"\\u590D\\u5236\\u53D8\\u4F53\",moe=\"\\u6253\\u5F00\\u53D8\\u4F53\\u914D\\u7F6E\",foe=\"\\u5220\\u9664\\u53D8\\u4F53\",hoe=\"\\u6392\\u9664\\u8282\\u70B9\",goe=\"\\u53CD\\u8F6C\\u6392\\u9664\\u8282\\u70B9\",_oe=\"\\u53D8\\u4F53\",xoe=\"\\u547D\\u4EE4\",voe=\"\\u53D8\\u4F53\",boe=\"\\u547D\\u4EE4\",yoe=\"\\u6267\\u884C\\u6761\\u4EF6\",woe=\"\\u5173\\u952E\\u5E27 ({0})\",Eoe=\"\\u53D8\\u4F53\",koe=\"\\u5E94\\u7528\\u5230\\u5173\\u952E\\u5E27\\u7684\\u53D8\\u4F53\\u3002\",joe=\"\\u547D\\u4EE4\",Aoe=`\\u5230\\u8FBE\\u76EE\\u6807\\u5173\\u952E\\u5E27\\u65F6\\u8FD0\\u884C\\u7684\\u547D\\u4EE4\\u3002\n\\u8BE5\\u4F4D\\u7F6E\\u7684\\u6587\\u672C\\u8F93\\u5165\\u53EF\\u89C6\\u4E3A\\u5728 .mcfunction \\u4E2D\\u8FD0\\u884C\\u3002\\uFF08\\u4E5F\\u652F\\u6301 MC-Build \\u8BED\\u6CD5\\uFF01\\uFF09`,Toe=\"\\u6267\\u884C\\u6761\\u4EF6\",Coe=\"\\u5173\\u952E\\u5E27\\u6267\\u884C\\u547D\\u4EE4\\u65F6\\u5FC5\\u987B\\u6EE1\\u8DB3\\u7684\\u6761\\u4EF6\\u3002\\u53EF\\u89C6\\u8F93\\u5165\\u7684\\u6587\\u672C\\u4E3A execute \\u547D\\u4EE4\\u7684\\u5B50\\u547D\\u4EE4\\u3002\",Soe=\"\\u91CD\\u590D\\u6267\\u884C\\uFF1F\",Ooe=`\\u662F\\u5426\\u5728\\u8BE5\\u5173\\u952E\\u5E27\\u91CD\\u590D\\u6267\\u884C\\u547D\\u4EE4\\u3002\n\\u82E5\\u542F\\u7528\\uFF0C\\u5219\\u4F1A\\u4EE5\\u76F8\\u5E94\\u7684\\u9891\\u7387\\u6267\\u884C\\u547D\\u4EE4\\u3002`,Ioe=\"\\u91CD\\u590D\\u9891\\u7387\",Doe=`\\u8BE5\\u5173\\u952E\\u5E27\\u518D\\u6B21\\u6267\\u884C\\u547D\\u4EE4\\u7684\\u7B49\\u5F85\\u523B\\u6570\\u3002\n\\u8BBE\\u7F6E\\u4E3A1\\u5219\\u5728\\u6BCF\\u4E00\\u523B\\u6267\\u884C\\u4E00\\u6B21\\u547D\\u4EE4\\u3002\n\\u6CE8\\u610F\\uFF1A\\u82E5\\u52A8\\u753B\\u4E0D\\u80FD\\u88AB\\u8BE5\\u503C\\u6574\\u9664\\uFF0C\\u5219\\u52A8\\u753B\\u5FAA\\u73AF\\u65F6\\u95F4\\u9694\\u53EF\\u80FD\\u4F1A\\u7565\\u6709\\u504F\\u5DEE\\u3002\n\\u82E5\\u8BBE\\u503C\\u5927\\u4E8E\\u52A8\\u753B\\u7684\\u957F\\u5EA6\\uFF0C\\u547D\\u4EE4\\u5219\\u4F1A\\u89C6\\u4E3A\\u91CD\\u590D\\u88AB\\u7981\\u6B62\\u65F6\\u6267\\u884C\\u3002\\uFF08\\u5230\\u8FBE\\u5173\\u952E\\u5E27\\u65F6\\u6267\\u884C\\u4E00\\u6B21\\uFF09`,Foe=\"\\u7F13\\u52A8\\u7C7B\\u578B\",Noe=\"\\u5E94\\u7528\\u5230\\u5173\\u952E\\u5E27\\u7684\\u7F13\\u52A8\\u7C7B\\u578B\\u3002\",Roe=\"\\u7EBF\\u6027\",Moe=\"\\u6B63\\u5F26\",Boe=\"\\u4E8C\\u6B21\\u65B9\",Poe=\"\\u4E09\\u6B21\\u65B9\",Loe=\"\\u56DB\\u6B21\\u65B9\",Voe=\"\\u4E94\\u6B21\\u65B9\",zoe=\"\\u6307\\u6570\",Uoe=\"\\u5706\",qoe=\"\\u5F39\\u6027\",Hoe=\"\\u540E\\u89C6\\u56FE\",Joe=\"\\u5F39\\u8DF3\",Goe=\"\\u7F13\\u52A8\\u6A21\\u5F0F\",Woe=\"\\u5E94\\u7528\\u5230\\u5173\\u952E\\u5E27\\u7684\\u7F13\\u52A8\\u6A21\\u5F0F\\u3002\",Koe=\"\\u6DE1\\u5165\",Yoe=\"\\u6DE1\\u51FA\",Xoe=\"\\u6DE1\\u5165\\u6DE1\\u51FA\",Zoe=\"\\u7F13\\u52A8\\u53C2\\u6570\",Qoe=\"\\u7F13\\u52A8\\u51FD\\u6570\\u4F7F\\u7528\\u7684\\u53C2\\u6570\\u3002\",$oe=\"\\u5F39\\u6027\",ese=\"\\u7F13\\u52A8\\u51FD\\u6570\\u7684\\u5F39\\u6027\\u3002\",tse=\"\\u8FC7\\u51B2\",nse=\"\\u7F13\\u52A8\\u51FD\\u6570\\u4E2D\\u7684\\u8FC7\\u51B2\\u6B21\\u6570\\u3002\",ise=\"\\u5F39\\u8DF3\",ase=\"\\u7F13\\u52A8\\u51FD\\u6570\\u7684\\u5F39\\u8DF3\\u6027\\u3002\",rse=`\\u5F53\\u524D\\u7981\\u7528\\u9AD8\\u7EA7\\u7F13\\u52A8\\u8BBE\\u7F6E\\u3002\n\\u4FEE\\u6539\\u5173\\u952E\\u5E27\\u7684\\u63D2\\u503C\\u6A21\\u5F0F\\u4E3A\\u201C\\u7EBF\\u6027\\u201D\\u4EE5\\u542F\\u7528\\u3002`,ose=\"\\u6587\\u672C\\u5C55\\u793A\",sse=\"\\u884C\\u5BBD\",lse=\"\\u6587\\u672C\\u5C55\\u793A\\u7684\\u884C\\u5BBD\\uFF0C\\u4EE5\\u50CF\\u7D20\\u4E3A\\u5355\\u4F4D\\u3002\",cse=\"\\u80CC\\u666F\\u989C\\u8272\",use=\"\\u6587\\u672C\\u5C55\\u793A\\u7684\\u80CC\\u666F\\u989C\\u8272\\u3002\",dse=\"\\u6587\\u5B57\\u9634\\u5F71\",pse=\"\\u662F\\u5426\\u5728\\u663E\\u793A\\u7684\\u6587\\u5B57\\u540E\\u9762\\u663E\\u793A\\u9634\\u5F71\\u3002\",mse=\"\\u6587\\u672C\\u5BF9\\u9F50\",fse=\"\\u6587\\u672C\\u7684\\u5BF9\\u9F50\\u65B9\\u5F0F\\u3002\",hse=\"\\u9760\\u5DE6\",gse=\"\\u5C45\\u4E2D\",_se=\"\\u9760\\u53F3\",xse=\"\\u7A7F\\u900F\",vse=\"\\u6587\\u672C\\u5C55\\u793A\\u662F\\u5426\\u5728\\u65B9\\u5757\\u540E\\u4F9D\\u7136\\u53EF\\u89C1\\u3002\",bse=\"\\u663E\\u793A\\u7269\\u54C1\",yse=\"\\u6240\\u663E\\u793A\\u7684\\u7269\\u54C1\\u3002\",wse=\"\\u7269\\u54C1\\u663E\\u793A\\u6A21\\u5F0F\",Ese=\"\\u5E94\\u7528\\u5230\\u7269\\u54C1\\u6A21\\u578B\\u7684\\u53D8\\u5316\\u3002\\uFF08\\u53C2\\u8003\\u81EA JSON \\u6A21\\u578B\\u4E2D display \\u7684\\u5B9A\\u4E49\\uFF09\",kse=\"\\u65E0\",jse=\"\\u7B2C\\u4E09\\u4EBA\\u79F0\\u5DE6\\u624B\",Ase=\"\\u7B2C\\u4E09\\u4EBA\\u79F0\\u53F3\\u624B\",Tse=\"\\u7B2C\\u4E00\\u4EBA\\u79F0\\u5DE6\\u624B\",Cse=\"\\u7B2C\\u4E00\\u4EBA\\u79F0\\u53F3\\u624B\",Sse=\"\\u5934\\u90E8\",Ose=\"GUI\",Ise=\"\\u5730\\u9762\",Dse=\"\\u56FA\\u5B9A\",Fse=\"\\u663E\\u793A\\u65B9\\u5757\",Nse=\"\\u6240\\u663E\\u793A\\u7684\\u65B9\\u5757\\u3002\\u652F\\u6301\\u8F93\\u5165\\u65B9\\u5757\\u72B6\\u6001\\uFF01\",Rse=\"\\u539F\\u7248\\u7269\\u54C1\\u5C55\\u793A\",Mse=\"\\u5BFC\\u51FA\\u5931\\u8D25\",Bse=\"\\u5F53\\u524D\\u8BBE\\u7F6E\\u4E3A\\u4E0D\\u5BFC\\u51FA\\u8D44\\u6E90\\u5305\\uFF0C\\u4F46\\u9879\\u76EE\\u4E2D\\u5B58\\u5728\\u81EA\\u5B9A\\u4E49\\u6A21\\u578B\\uFF01\\u8BF7\\u542F\\u7528\\u8D44\\u6E90\\u5305\\u5BFC\\u51FA\\u6216\\u79FB\\u9664\\u81EA\\u5B9A\\u4E49\\u6A21\\u578B\\u540E\\u518D\\u6B21\\u5C1D\\u8BD5\\u5BFC\\u51FA\\u3002\",Pse=\"\\u84DD\\u56FE\\u8BBE\\u7F6E\\u5B58\\u5728\\u9519\\u8BEF\\uFF01\\u8BF7\\u5728\\u4FEE\\u6B63\\u540E\\u518D\\u6B21\\u5C1D\\u8BD5\\u5BFC\\u51FA\\u3002\",Lse=\"\\u627E\\u5230\\u9519\\u8BEF {0}\\uFF1A\",Vse=\"\\u597D\",zse=\"Animated Java\",Use=\"\\u65B9\\u5757\\u5C55\\u793A\\u4E0B\\u4E0D\\u4F1A\\u6E32\\u67D3\\u6D41\\u4F53\\u3002\",qse=\"\\u65B9\\u5757\\u5C55\\u793A\\u4E0B\\u4E0D\\u4F1A\\u6E32\\u67D3\\u751F\\u7269\\u5934\\u9885\\uFF0C\\u8BF7\\u6539\\u7528\\u7269\\u54C1\\u5C55\\u793A\\u3002\",Hse=\"\\u65B9\\u5757\\u5C55\\u793A\\u4E0D\\u652F\\u6301\\u65B9\\u5757\\u72B6\\u6001 \\u201Cfacing\\u201D\\u3002\",Jse=\"\\u84DD\\u56FE\\u5BFC\\u51FA\\u8DEF\\u5F84\\u4E0D\\u5B58\\u5728\",Gse=`\\u4E0D\\u5B58\\u5728\\u6240\\u6307\\u5B9A\\u7684\\u5BFC\\u51FA\\u8DEF\\u5F84 '{0}' \\uFF01\n\\u8BF7\\u5728\\u786E\\u4FDD\\u8DEF\\u5F84\\u4E0B\\u5B58\\u5728\\u6307\\u5B9A\\u7684\\u6587\\u4EF6\\u5939\\u540E\\u518D\\u6B21\\u5C1D\\u8BD5\\u3002`,Wse={\"animated_java.action.open_blueprint_settings.name\":$ee,\"animated_java.action.open_documentation.name\":ete,\"animated_java.action.open_about.name\":tte,\"animated_java.action.open_bone_config.name\":nte,\"animated_java.action.open_locator_config.name\":ite,\"animated_java.action.open_text_display_config.name\":ate,\"animated_java.action.export.name\":rte,\"animated_java.action.create_text_display.title\":ote,\"animated_java.action.create_vanilla_item_display.title\":ste,\"animated_java.action.create_vanilla_block_display.title\":lte,\"animated_java.action.open_vanilla_item_display_config.name\":cte,\"animated_java.action.open_vanilla_block_display_config.name\":ute,\"animated_java.popup.loading.loading\":dte,\"animated_java.popup.loading.success\":pte,\"animated_java.popup.loading.offline\":mte,\"animated_java.dialog.installed_popup.title\":fte,\"animated_java.dialog.installed_popup.close_button\":hte,\"animated_java.dialog.reset\":gte,\"animated_java.dialog.about.title\":_te,\"animated_java.dialog.about.close_button\":xte,\"animated_java.dialog.unexpected_error.title\":vte,\"animated_java.dialog.unexpected_error.close_button\":bte,\"animated_java.dialog.unexpected_error.copy_error_message_button.message\":yte,\"animated_java.dialog.unexpected_error.copy_error_message_button.description\":wte,\"animated_java.dialog.unexpected_error.paragraph\":Ete,\"animated_java.dialog.blueprint_settings.title\":kte,\"animated_java.dialog.blueprint_settings.advanced_settings_warning\":jte,\"animated_java.dialog.blueprint_settings.blueprint_name.title\":Ate,\"animated_java.dialog.blueprint_settings.blueprint_name.description\":Tte,\"animated_java.dialog.blueprint_settings.texture_size.title\":Cte,\"animated_java.dialog.blueprint_settings.texture_size.description\":Ste,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_square\":Ote,\"animated_java.dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\":Ite,\"animated_java.dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\":Dte,\"animated_java.dialog.blueprint_settings.export_settings.title\":Fte,\"animated_java.dialog.blueprint_settings.export_namespace.title\":Nte,\"animated_java.dialog.blueprint_settings.export_namespace.description\":Rte,\"animated_java.dialog.blueprint_settings.export_namespace.error.empty\":Mte,\"animated_java.dialog.blueprint_settings.export_namespace.error.reserved\":Bte,\"animated_java.dialog.blueprint_settings.export_namespace.error.invalid_characters\":Pte,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.title\":Lte,\"animated_java.dialog.blueprint_settings.enable_plugin_mode.description\":Vte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.title\":zte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.description\":Ute,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.raw\":qte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.zip\":Hte,\"animated_java.dialog.blueprint_settings.resource_pack_export_mode.options.none\":Jte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.title\":Gte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.description\":Wte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.raw\":Kte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.zip\":Yte,\"animated_java.dialog.blueprint_settings.data_pack_export_mode.options.none\":Xte,\"animated_java.dialog.blueprint_settings.show_bounding_box.title\":Zte,\"animated_java.dialog.blueprint_settings.show_bounding_box.description\":Qte,\"animated_java.dialog.blueprint_settings.auto_bounding_box.title\":$te,\"animated_java.dialog.blueprint_settings.auto_bounding_box.description\":ene,\"animated_java.dialog.blueprint_settings.bounding_box.title\":tne,\"animated_java.dialog.blueprint_settings.bounding_box.description\":nne,\"animated_java.dialog.blueprint_settings.resource_pack_settings.title\":ine,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\":ane,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_settings.description\":rne,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.title\":one,\"animated_java.dialog.blueprint_settings.enable_advanced_resource_pack_folders.description\":sne,\"animated_java.dialog.blueprint_settings.display_item.title\":lne,\"animated_java.dialog.blueprint_settings.display_item.description\":cne,\"animated_java.dialog.blueprint_settings.display_item.error.no_item_selected\":une,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\":dne,\"animated_java.dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\":pne,\"animated_java.dialog.blueprint_settings.display_item.warning.item_does_not_exist\":mne,\"animated_java.dialog.blueprint_settings.display_item.warning.item_model_not_generated\":fne,\"animated_java.dialog.blueprint_settings.display_item.error.item_model_not_found\":hne,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.title\":gne,\"animated_java.dialog.blueprint_settings.custom_model_data_offset.description\":_ne,\"animated_java.dialog.blueprint_settings.resource_pack.title\":xne,\"animated_java.dialog.blueprint_settings.resource_pack.description\":vne,\"animated_java.dialog.blueprint_settings.resource_pack.error.no_folder_selected\":bne,\"animated_java.dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\":yne,\"animated_java.dialog.blueprint_settings.resource_pack.error.not_a_folder\":wne,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\":Ene,\"animated_java.dialog.blueprint_settings.resource_pack.error.missing_assets_folder\":kne,\"animated_java.dialog.blueprint_settings.resource_pack_zip.title\":jne,\"animated_java.dialog.blueprint_settings.resource_pack_zip.description\":Ane,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\":Tne,\"animated_java.dialog.blueprint_settings.resource_pack_zip.error.not_a_file\":Cne,\"animated_java.dialog.blueprint_settings.display_item_path.title\":Sne,\"animated_java.dialog.blueprint_settings.display_item_path.description\":One,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.no_file_selected\":Ine,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.file_does_not_exist\":Dne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_file.error.not_a_file\":Fne,\"animated_java.dialog.blueprint_settings.model_folder.title\":Nne,\"animated_java.dialog.blueprint_settings.model_folder.description\":Rne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.no_folder_selected\":Mne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.folder_does_not_exist\":Bne,\"animated_java.dialog.blueprint_settings.advanced_resource_pack_folder.error.not_a_folder\":Pne,\"animated_java.dialog.blueprint_settings.texture_folder.title\":Lne,\"animated_java.dialog.blueprint_settings.texture_folder.description\":Vne,\"animated_java.dialog.blueprint_settings.data_pack_settings.title\":zne,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.title\":Une,\"animated_java.dialog.blueprint_settings.enable_advanced_data_pack_settings.description\":qne,\"animated_java.dialog.blueprint_settings.data_pack.title\":Hne,\"animated_java.dialog.blueprint_settings.data_pack.description\":Jne,\"animated_java.dialog.blueprint_settings.data_pack.error.no_folder_selected\":Gne,\"animated_java.dialog.blueprint_settings.data_pack.error.folder_does_not_exist\":Wne,\"animated_java.dialog.blueprint_settings.data_pack.error.not_a_folder\":Kne,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\":Yne,\"animated_java.dialog.blueprint_settings.data_pack.error.missing_data_folder\":Xne,\"animated_java.dialog.blueprint_settings.data_pack_zip.title\":Zne,\"animated_java.dialog.blueprint_settings.data_pack_zip.description\":Qne,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.no_file_selected\":$ne,\"animated_java.dialog.blueprint_settings.data_pack_zip.error.not_a_file\":eie,\"animated_java.dialog.blueprint_settings.summon_commands.title\":tie,\"animated_java.dialog.blueprint_settings.summon_commands.description\":nie,\"animated_java.dialog.blueprint_settings.ticking_commands.title\":iie,\"animated_java.dialog.blueprint_settings.ticking_commands.description\":aie,\"animated_java.dialog.blueprint_settings.interpolation_duration.title\":rie,\"animated_java.dialog.blueprint_settings.interpolation_duration.description\":oie,\"animated_java.dialog.blueprint_settings.teleportation_duration.title\":sie,\"animated_java.dialog.blueprint_settings.teleportation_duration.description\":lie,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.title\":cie,\"animated_java.dialog.blueprint_settings.use_storage_for_animation.description\":uie,\"animated_java.dialog.blueprint_settings.baked_animations.title\":die,\"animated_java.dialog.blueprint_settings.baked_animations.description\":pie,\"animated_java.dialog.blueprint_settings.json_file.title\":mie,\"animated_java.dialog.blueprint_settings.json_file.description\":fie,\"animated_java.dialog.blueprint_settings.json_file.error.no_file_selected\":hie,\"animated_java.dialog.blueprint_settings.json_file.error.not_a_file\":gie,\"animated_java.dialog.bone_config.title\":_ie,\"animated_java.dialog.bone_config.selected_variant\":xie,\"animated_java.dialog.bone_config.default_variant_subtitle\":vie,\"animated_java.dialog.bone_config.selected_variant_subtitle\":bie,\"animated_java.dialog.bone_config.use_nbt.title\":yie,\"animated_java.dialog.bone_config.use_nbt.description\":wie,\"animated_java.dialog.bone_config.use_nbt.use_nbt_warning\":Eie,\"animated_java.dialog.bone_config.inherit_settings.title\":kie,\"animated_java.dialog.bone_config.inherit_settings.description\":jie,\"animated_java.dialog.bone_config.custom_name.title\":Aie,\"animated_java.dialog.bone_config.custom_name.description\":Tie,\"animated_java.dialog.bone_config.custom_name.invalid_json.error\":Cie,\"animated_java.dialog.bone_config.custom_name_visible.title\":Sie,\"animated_java.dialog.bone_config.custom_name_visible.description\":Oie,\"animated_java.dialog.bone_config.glowing.title\":Iie,\"animated_java.dialog.bone_config.glowing.description\":Die,\"animated_java.dialog.bone_config.override_glow_color.title\":Fie,\"animated_java.dialog.bone_config.override_glow_color.description\":Nie,\"animated_java.dialog.bone_config.glow_color.title\":Rie,\"animated_java.dialog.bone_config.glow_color.description\":Mie,\"animated_java.dialog.bone_config.shadow_radius.title\":Bie,\"animated_java.dialog.bone_config.shadow_radius.description\":Pie,\"animated_java.dialog.bone_config.shadow_strength.title\":Lie,\"animated_java.dialog.bone_config.shadow_strength.description\":Vie,\"animated_java.dialog.bone_config.override_brightness.title\":zie,\"animated_java.dialog.bone_config.override_brightness.description\":Uie,\"animated_java.dialog.bone_config.brightness_override.title\":qie,\"animated_java.dialog.bone_config.brightness_override.description\":Hie,\"animated_java.dialog.bone_config.use_custom_brightness.title\":Jie,\"animated_java.dialog.bone_config.use_custom_brightness.description\":Gie,\"animated_java.dialog.bone_config.custom_brightness.title\":Wie,\"animated_java.dialog.bone_config.custom_brightness.description\":Kie,\"animated_java.dialog.bone_config.enchanted.title\":Yie,\"animated_java.dialog.bone_config.enchanted.description\":Xie,\"animated_java.dialog.bone_config.invisible.title\":Zie,\"animated_java.dialog.bone_config.invisible.description\":Qie,\"animated_java.dialog.bone_config.nbt.title\":$ie,\"animated_java.dialog.bone_config.nbt.description\":eae,\"animated_java.dialog.bone_config.nbt.invalid_nbt.not_compound\":tae,\"animated_java.dialog.bone_config.nbt.invalid_nbt.error\":nae,\"animated_java.dialog.bone_config.billboard.title\":iae,\"animated_java.dialog.bone_config.billboard.description\":aae,\"animated_java.dialog.bone_config.billboard.options.fixed\":rae,\"animated_java.dialog.bone_config.billboard.options.vertical\":oae,\"animated_java.dialog.bone_config.billboard.options.horizontal\":sae,\"animated_java.dialog.bone_config.billboard.options.center\":lae,\"animated_java.dialog.locator_config.title\":cae,\"animated_java.dialog.locator_config.plugin_mode_warning\":uae,\"animated_java.dialog.locator_config.use_entity.title\":dae,\"animated_java.dialog.locator_config.use_entity.description\":pae,\"animated_java.dialog.locator_config.entity_type.title\":mae,\"animated_java.dialog.locator_config.entity_type.description\":fae,\"animated_java.dialog.locator_config.entity_type.error.empty\":hae,\"animated_java.dialog.locator_config.entity_type.warning.invalid\":gae,\"animated_java.dialog.locator_config.summon_commands.title\":_ae,\"animated_java.dialog.locator_config.summon_commands.description\":xae,\"animated_java.dialog.locator_config.ticking_commands.title\":vae,\"animated_java.dialog.locator_config.ticking_commands.description\":bae,\"animated_java.dialog.text_display_config.title\":yae,\"animated_java.dialog.bone_config.vanilla_item_model.title\":wae,\"animated_java.dialog.bone_config.vanilla_item_model.description\":Eae,\"animated_java.dialog.text_display_config.use_nbt.title\":kae,\"animated_java.dialog.text_display_config.use_nbt.description\":jae,\"animated_java.dialog.text_display_config.use_nbt.use_nbt_warning\":Aae,\"animated_java.dialog.text_display_config.inherit_settings.title\":Tae,\"animated_java.dialog.text_display_config.inherit_settings.description\":Cae,\"animated_java.dialog.text_display_config.glowing.title\":Sae,\"animated_java.dialog.text_display_config.glowing.description\":Oae,\"animated_java.dialog.text_display_config.override_glow_color.title\":Iae,\"animated_java.dialog.text_display_config.override_glow_color.description\":Dae,\"animated_java.dialog.text_display_config.glow_color.title\":Fae,\"animated_java.dialog.text_display_config.glow_color.description\":Nae,\"animated_java.dialog.text_display_config.shadow_radius.title\":Rae,\"animated_java.dialog.text_display_config.shadow_radius.description\":Mae,\"animated_java.dialog.text_display_config.shadow_strength.title\":Bae,\"animated_java.dialog.text_display_config.shadow_strength.description\":Pae,\"animated_java.dialog.text_display_config.override_brightness.title\":Lae,\"animated_java.dialog.text_display_config.override_brightness.description\":Vae,\"animated_java.dialog.text_display_config.brightness_override.title\":zae,\"animated_java.dialog.text_display_config.brightness_override.description\":Uae,\"animated_java.dialog.text_display_config.use_custom_brightness.title\":qae,\"animated_java.dialog.text_display_config.use_custom_brightness.description\":Hae,\"animated_java.dialog.text_display_config.custom_brightness.title\":Jae,\"animated_java.dialog.text_display_config.custom_brightness.description\":Gae,\"animated_java.dialog.text_display_config.invisible.title\":Wae,\"animated_java.dialog.text_display_config.invisible.description\":Kae,\"animated_java.dialog.text_display_config.nbt.title\":Yae,\"animated_java.dialog.text_display_config.nbt.description\":Xae,\"animated_java.dialog.text_display_config.billboard.title\":Zae,\"animated_java.dialog.text_display_config.billboard.description\":Qae,\"animated_java.dialog.text_display_config.billboard.options.fixed\":$ae,\"animated_java.dialog.text_display_config.billboard.options.vertical\":ere,\"animated_java.dialog.text_display_config.billboard.options.horizontal\":tre,\"animated_java.dialog.text_display_config.billboard.options.center\":nre,\"animated_java.dialog.vanilla_block_display_config.title\":ire,\"animated_java.dialog.vanilla_block_display.custom_name.title\":are,\"animated_java.dialog.vanilla_block_display.custom_name.description\":rre,\"animated_java.dialog.vanilla_block_display.custom_name.invalid_json.error\":ore,\"animated_java.dialog.vanilla_block_display.custom_name_visible.title\":sre,\"animated_java.dialog.vanilla_block_display.custom_name_visible.description\":lre,\"animated_java.dialog.vanilla_item_display_config.title\":cre,\"animated_java.dialog.vanilla_item_display.custom_name.title\":ure,\"animated_java.dialog.vanilla_item_display.custom_name.description\":dre,\"animated_java.dialog.vanilla_item_display.custom_name.invalid_json.error\":pre,\"animated_java.dialog.vanilla_item_display.custom_name_visible.title\":mre,\"animated_java.dialog.vanilla_item_display.custom_name_visible.description\":fre,\"animated_java.dialog.variant_config.title\":hre,\"animated_java.dialog.variant_config.variant_display_name\":gre,\"animated_java.dialog.variant_config.variant_display_name.description\":_re,\"animated_java.dialog.variant_config.generate_name_from_display_name\":xre,\"animated_java.dialog.variant_config.generate_name_from_display_name.description\":vre,\"animated_java.dialog.variant_config.variant_name\":bre,\"animated_java.dialog.variant_config.variant_name.description\":yre,\"animated_java.dialog.variant_config.texture_map.title\":wre,\"animated_java.dialog.variant_config.texture_map.description\":Ere,\"animated_java.dialog.variant_config.texture_map.create_new_mapping\":kre,\"animated_java.dialog.variant_config.texture_map.no_mappings\":jre,\"animated_java.dialog.variant_config.bone_lists.description\":Are,\"animated_java.dialog.variant_config.excluded_nodes.title\":Tre,\"animated_java.dialog.variant_config.excluded_nodes.description\":Cre,\"animated_java.dialog.variant_config.included_nodes.title\":Sre,\"animated_java.dialog.variant_config.included_nodes.description\":Ore,\"animated_java.dialog.variant_config.swap_columns_button.tooltip\":Ire,\"animated_java.action.upgrade_old_aj_model_loader.name\":Dre,\"animated_java.dialog.upgrade_old_aj_model_loader.title\":Fre,\"animated_java.action.upgrade_old_aj_model_loader.select_file\":Nre,\"animated_java.action.upgrade_old_aj_model_loader.body\":Rre,\"animated_java.action.upgrade_old_aj_model_loader.button\":Mre,\"animated_java.dialog.animation_properties.title\":Bre,\"animated_java.dialog.animation_properties.animation_name.title\":Pre,\"animated_java.dialog.animation_properties.animation_name.description\":Lre,\"animated_java.dialog.animation_properties.loop_mode.title\":Vre,\"animated_java.dialog.animation_properties.loop_mode.description\":zre,\"animated_java.dialog.animation_properties.loop_mode.options.once\":Ure,\"animated_java.dialog.animation_properties.loop_mode.options.hold\":qre,\"animated_java.dialog.animation_properties.loop_mode.options.loop\":Hre,\"animated_java.dialog.animation_properties.animation_name.error.empty\":Jre,\"animated_java.dialog.animation_properties.animation_name.error.invalid_characters\":Gre,\"animated_java.dialog.animation_properties.loop_delay.title\":Wre,\"animated_java.dialog.animation_properties.loop_delay.description\":Kre,\"animated_java.dialog.animation_properties.bone_lists.description\":Yre,\"animated_java.dialog.animation_properties.excluded_nodes.title\":Xre,\"animated_java.dialog.animation_properties.excluded_nodes.description\":Zre,\"animated_java.dialog.animation_properties.included_nodes.title\":Qre,\"animated_java.dialog.animation_properties.included_nodes.description\":$re,\"animated_java.dialog.animation_properties.swap_columns_button.tooltip\":eoe,\"animated_java.dialog.export_progress.title\":toe,\"animated_java.dialog.blueprint_loading.title\":noe,\"animated_java.panel.variants.title\":ioe,\"animated_java.panel.variants.tool.create_new_variant\":aoe,\"animated_java.panel.variants.tool.edit_variant\":roe,\"animated_java.panel.variants.tool.duplicate_selected_variant\":ooe,\"animated_java.panel.variants.tool.delete_selected_variant\":soe,\"animated_java.panel.variants.tool.variant_visible\":loe,\"animated_java.panel.variants.tool.variant_not_visible\":coe,\"animated_java.panel.variants.tool.cannot_delete_default_variant\":uoe,\"animated_java.action.variants.create\":doe,\"animated_java.action.variants.duplicate\":poe,\"animated_java.action.variants.open_config\":moe,\"animated_java.action.variants.delete\":foe,\"animated_java.animation.excluded_nodes\":hoe,\"animated_java.animation.invert_excluded_nodes\":goe,\"animated_java.effect_animator.timeline.variant\":_oe,\"animated_java.effect_animator.timeline.commands\":xoe,\"animated_java.effect_animator.keyframes.variant\":voe,\"animated_java.effect_animator.keyframes.commands\":boe,\"animated_java.effect_animator.keyframes.execute_condition\":yoe,\"animated_java.panel.keyframe.keyframe_title\":woe,\"animated_java.panel.keyframe.variant.title\":Eoe,\"animated_java.panel.keyframe.variant.description\":koe,\"animated_java.panel.keyframe.commands.title\":joe,\"animated_java.panel.keyframe.commands.description\":Aoe,\"animated_java.panel.keyframe.execute_condition.title\":Toe,\"animated_java.panel.keyframe.execute_condition.description\":Coe,\"animated_java.panel.keyframe.repeat.title\":Soe,\"animated_java.panel.keyframe.repeat.description\":Ooe,\"animated_java.panel.keyframe.repeat_frequency.title\":Ioe,\"animated_java.panel.keyframe.repeat_frequency.description\":Doe,\"animated_java.panel.keyframe.easing_type.title\":Foe,\"animated_java.panel.keyframe.easing_type.description\":Noe,\"animated_java.panel.keyframe.easing_type.options.linear\":Roe,\"animated_java.panel.keyframe.easing_type.options.sine\":Moe,\"animated_java.panel.keyframe.easing_type.options.quad\":Boe,\"animated_java.panel.keyframe.easing_type.options.cubic\":Poe,\"animated_java.panel.keyframe.easing_type.options.quart\":Loe,\"animated_java.panel.keyframe.easing_type.options.quint\":Voe,\"animated_java.panel.keyframe.easing_type.options.expo\":zoe,\"animated_java.panel.keyframe.easing_type.options.circ\":Uoe,\"animated_java.panel.keyframe.easing_type.options.elastic\":qoe,\"animated_java.panel.keyframe.easing_type.options.back\":Hoe,\"animated_java.panel.keyframe.easing_type.options.bounce\":Joe,\"animated_java.panel.keyframe.easing_mode.title\":Goe,\"animated_java.panel.keyframe.easing_mode.description\":Woe,\"animated_java.panel.keyframe.easing_mode.options.in\":Koe,\"animated_java.panel.keyframe.easing_mode.options.out\":Yoe,\"animated_java.panel.keyframe.easing_mode.options.inout\":Xoe,\"animated_java.panel.keyframe.easing_args.title\":Zoe,\"animated_java.panel.keyframe.easing_args.description\":Qoe,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.title\":$oe,\"animated_java.panel.keyframe.easing_args.easing_arg.elastic.description\":ese,\"animated_java.panel.keyframe.easing_args.easing_arg.back.title\":tse,\"animated_java.panel.keyframe.easing_args.easing_arg.back.description\":nse,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.title\":ise,\"animated_java.panel.keyframe.easing_args.easing_arg.bounce.description\":ase,\"animated_java.panel.keyframe.nonlinear_interpolation\":rse,\"animated_java.panel.text_display.title\":ose,\"animated_java.tool.text_display.line_width.title\":sse,\"animated_java.tool.text_display.line_width.description\":lse,\"animated_java.tool.text_display.background_color.title\":cse,\"animated_java.tool.text_display.background_color.description\":use,\"animated_java.tool.text_display.text_shadow.title\":dse,\"animated_java.tool.text_display.text_shadow.description\":pse,\"animated_java.tool.text_display.text_alignment.title\":mse,\"animated_java.tool.text_display.text_alignment.description\":fse,\"animated_java.tool.text_display.text_alignment.options.left\":hse,\"animated_java.tool.text_display.text_alignment.options.center\":gse,\"animated_java.tool.text_display.text_alignment.options.right\":_se,\"animated_java.tool.text_display.see_through.title\":xse,\"animated_java.tool.text_display.see_through.description\":vse,\"animated_java.panel.vanilla_item_display.title\":bse,\"animated_java.panel.vanilla_item_display.description\":yse,\"animated_java.tool.item_display.item_display.title\":wse,\"animated_java.tool.item_display.item_display.description\":Ese,\"animated_java.tool.item_display.item_display.options.none\":kse,\"animated_java.tool.item_display.item_display.options.thirdperson_lefthand\":jse,\"animated_java.tool.item_display.item_display.options.thirdperson_righthand\":Ase,\"animated_java.tool.item_display.item_display.options.firstperson_lefthand\":Tse,\"animated_java.tool.item_display.item_display.options.firstperson_righthand\":Cse,\"animated_java.tool.item_display.item_display.options.head\":Sse,\"animated_java.tool.item_display.item_display.options.gui\":Ose,\"animated_java.tool.item_display.item_display.options.ground\":Ise,\"animated_java.tool.item_display.item_display.options.fixed\":Dse,\"animated_java.panel.vanilla_block_display.title\":Fse,\"animated_java.panel.vanilla_block_display.description\":Nse,\"animated_java.vanilla_item_display.title\":Rse,\"animated_java.misc.failed_to_export.title\":Mse,\"animated_java.misc.failed_to_export.custom_models.message\":Bse,\"animated_java.misc.failed_to_export.blueprint_settings.message\":Pse,\"animated_java.misc.failed_to_export.blueprint_settings.error_item\":Lse,\"animated_java.misc.failed_to_export.button\":Vse,\"animated_java.format_category.animated_java\":zse,\"animated_java.block_model_manager.fluid_warning\":Use,\"animated_java.block_model_manager.mob_head_warning\":qse,\"animated_java.block_model_manager.facing_warning\":Hse,\"animated_java.error.blueprint_export_path_doesnt_exist.title\":Jse,\"animated_java.error.blueprint_export_path_doesnt_exist.description\":Gse};var Kse=[Eg,kg,jg,Ag,Tg],Cy=Kse,Sy=[\"../lang/de.yml\",\"../lang/en.yml\",\"../lang/nl.yml\",\"../lang/ru.yml\",\"../lang/zh_cn.yml\"];var Oy=Sy.map(t=>PathModule.basename(t,\".yml\"));function A(t,...e){let n=Oy.indexOf(settings.language.value);n===-1&&(console.warn(`Could not find language '${settings.language.value}'`),n=Oy.indexOf(\"en\"));let i=Cy[n];t.startsWith(\"animated_java.\")||(t=`animated_java.${t}`);let a=i[t];return a?a.replace(/\\{(\\d+)\\}/g,(r,o)=>e[o]||\"\"):(console.warn(`Could not find translation for '${t}'`),t)}s(A,\"translate\");var vp=class extends Error{constructor(e,n){super(`'${e}' failed to install: ${n.message}`+(n.stack?`\n`+n.stack:\"\"))}};s(vp,\"ModInstallError\");var bp=class extends Error{constructor(e,n){super(`'${e}' failed to uninstall: ${n.message}`+(n.stack?`\n`+n.stack:\"\"))}};s(bp,\"ModUninstallError\");var ws=new Map,$r=[];K.PLUGIN_LOAD.subscribe(async()=>{console.groupCollapsed(\"Installing Mods...\");try{for(let t of $r){let e=ws.get(t);e.isInstalled()||await e.install()}}catch(t){throw console.groupEnd(),t}for(let t of Object.values(Plugins.registered))t.id!==Ke.name&&K.EXTERNAL_PLUGIN_LOAD.publish(t);console.groupEnd(),K.PLUGIN_FINISHED_LOADING.publish()});K.PLUGIN_UNLOAD.subscribe(async()=>{console.groupCollapsed(\"Uninstalling Mods...\");try{for(let t of[...$r].reverse()){let e=ws.get(t);e.isInstalled()&&await e.uninstall()}}catch(t){throw console.groupEnd(),t}for(let t of Object.values(Plugins.registered))t.id!==Ke.name&&K.EXTERNAL_PLUGIN_UNLOAD.publish(t);console.groupEnd(),K.PLUGIN_FINISHED_UNLOADING.publish()});function Yse(){$r.sort((t,e)=>{let n=ws.get(t);return ws.get(e).priority-n.priority});for(let t of $r){let e=ws.get(t);if(e.dependencies!==void 0)for(let n of e.dependencies){let i=$r.indexOf(n);if(i===-1)throw new Error(`Mod '${t}' depends on unknown mod '${n}'`);let a=$r.indexOf(t);i>a&&($r.splice(i,1),$r.splice(a,0,n))}}}s(Yse,\"updateModInstallOrder\");function St(t){let e,n=!1;if(ws.has(t.id))throw new Error(`A Mod with the ID '${t.id}' is already registered!`);let i={id:t.id,dependencies:t.dependencies,priority:t.priority??0,isInstalled(){return n},async install(){console.log(`Installing '${t.id}'`);try{if(n)throw new Error(`Attempted to install '${t.id}' while it was already installed.`);e=await t.apply(),n=!0}catch(a){throw new vp(t.id,a)}},async uninstall(){console.log(`Uninstalling '${t.id}'`);try{if(!n)throw new Error(`Attempted to uninstall '${t.id}' before it was installed.`);await t.revert(e),n=!1}catch(a){throw new bp(t.id,a)}}};return ws.set(t.id,i),$r.push(t.id),Yse(),i}s(St,\"registerMod\");function da(t){let e=null;return St({...t,apply:()=>[K.PRE_SELECT_PROJECT.subscribe(n=>{e===null&&t.condition(n)&&(console.log(`Applying project mod '${t.id}'`),e=t.apply())}),K.UNSELECT_PROJECT.subscribe(()=>{e!==null&&(console.log(`Reverting project mod '${t.id}'`),t.revert(e),e=null)})],revert:n=>{n.forEach(i=>i())}})}s(da,\"registerProjectMod\");function Dy(t){let e;return St({...t,apply:()=>[K.EXTERNAL_PLUGIN_LOAD.subscribe(n=>{Condition(t.condition,n)&&(console.log(`Applying plugin mod '${t.id}'`),e=t.apply())}),K.EXTERNAL_PLUGIN_UNLOAD.subscribe(()=>{e!==void 0&&(console.log(`Reverting plugin mod '${t.id}'`),t.revert(e),e=void 0)})],revert:n=>{n.forEach(i=>i())}})}s(Dy,\"registerPluginMod\");function yl(t,e){return s(function({id:i,priority:a,dependencies:r},...o){let l,c=kt(),d=kt(),u={get:()=>l,onCreated:c.subscribe,onDeleted:d.subscribe};return St({id:i,priority:a,dependencies:r,apply:()=>(l=t(i,...o),c.publish(l),l),revert:p=>{e(p),l=null,d.publish(p)}}),u},\"handler\")}s(yl,\"registerDeletableFactory\");var nn=yl((t,e)=>new Action(t,e),t=>t.delete()),Fy=yl((t,e)=>new ModelFormat({...e,id:t}),t=>t.delete()),Ny=yl((t,e)=>new Codec(t,{...e}),t=>t.delete()),Ry=yl((t,e,n)=>new BarMenu(t,e,n),t=>{t.node.remove(),t.label.remove(),delete MenuBar.menus[t.id]}),My=yl((t,e)=>new ModelLoader(t,e),t=>t.delete()),By=yl((t,e,n)=>new Menu(t,e,n),t=>{t.node.remove()});function iu(t){St({...t,apply:()=>{if(t.object==null)throw new Error(\"Cannot override property on undefined object.\");let e={value:void 0,descriptor:void 0};if(e.value=t.object[t.key],e.descriptor=Object.getOwnPropertyDescriptor(t.object,t.key)??{value:e.value,writable:!0,configurable:!0},e.descriptor.configurable===!1)throw new Error(`Cannot override property '${String(t.key)}' on object because it is not configurable.`);return Object.defineProperty(t.object,t.key,{configurable:!0,get(){return t.get.call(this,e.value)},set(n){e.value=n}}),{original:e}},revert:({original:e})=>{Object.defineProperty(t.object,t.key,e.descriptor)}})}s(iu,\"registerPropertyOverrideMod\");function Nt(t){St({...t,apply:()=>{if(t.object==null)throw new Error(\"Cannot override property on undefined object.\");let e={value:void 0,descriptor:void 0};if(e.value=t.object[t.key],e.descriptor=Object.getOwnPropertyDescriptor(t.object,t.key)??{value:e.value,writable:!0,configurable:!0},e.descriptor.configurable===!1)throw new Error(`Cannot override property '${String(t.key)}' on object because it is not configurable.`);return Object.defineProperty(t.object,t.key,{configurable:!0,enumerable:e.descriptor.enumerable,get:function(){return Condition(t.condition,this)?t.get.call(this,e.value):e.value},set:t.set?function(n){Condition(t.condition,this)?t.set.call(this,n):e.value=n}:n=>{e.value=n}}),{original:e}},revert:({original:e})=>{Object.defineProperty(t.object,t.key,e.descriptor)}})}s(Nt,\"registerConditionalPropertyOverrideMod\");var Iy=new Map;function Py(t,e){let n=Iy.get(t),i={value:t[e]};if(n===void 0){let a=kt(),r=kt();n=[a,r],Iy.set(t,n),Object.defineProperty(t,e,{get(){return a.publish({storage:i,value:i.value}),i.value},set(o){i.value=o,r.publish({storage:i,newValue:o})},configurable:!0}),K.PLUGIN_UNLOAD.subscribe(()=>{let o=t[e];delete t[e],Object.defineProperty(t,e,{value:o,configurable:!0})},!0)}return n}s(Py,\"createPropertySubscribable\");var Cg=class extends Property{constructor(e,n,i){super(e,\"object\",n,i)}copy(e,n){e[this.name]==null?n[this.name]=e[this.name]:n[this.name]=JSON.parse(JSON.stringify(e[this.name]))}merge(e,n){n[this.name]==null?e[this.name]=this.default:e[this.name]=JSON.parse(JSON.stringify(n[this.name]))}};s(Cg,\"ObjectProperty\");var wl=class extends Error{constructor(){super(\"Polling was cancelled\"),this.name=\"PollingCancelledError\"}};s(wl,\"PollingCancelledError\");function El(t,e,n=1e3*60,i){let a=performance.now(),r=i!==void 0?o=>setTimeout(o,i):requestAnimationFrame;return new Promise((o,l)=>{let c=s(()=>{if(e())return l(new wl);let d=t();if(d!=null)return o(d);if(performance.now()-a>n)return l(new Error(\"Polling timed out\"));r(c)},\"poll\");r(c)})}s(El,\"pollUntilResult\");function Gn(t){let e;if(typeof t.target==\"string\"?e=document.querySelector(t.target):typeof t.target==\"function\"?e=t.target():e=t.target,!e)throw new Error(\"Target element not found\");let n;if(t.replaceChildren)e.replaceChildren();else{if(t.hideTargetChildren)for(let a of Array.from(e.children))a instanceof HTMLElement&&(a.style.display=\"none\");t.prepend?n=e.children[0]:t.injectIndex!==void 0&&(n=e.children[t.injectIndex])}let i=new t.component({target:e,anchor:n,props:t.props});return t.onMount?.(i,e),i.$on(\"destroy\",()=>{t.onDestroy?.(i)}),i}s(Gn,\"mountSvelteComponent\");function yp(t){let e=typeof t.target==\"string\"?document.querySelector.bind(document,t.target):t.target,n,i=s(()=>{n!=null&&(t.onDestroy?.(n),n?.$destroy(),n=void 0)},\"destroy\"),a=St({...t,apply:()=>{i(),El(()=>e(),()=>!a.isInstalled()||!!t.cancelCondition?.()).catch(r=>{if(r instanceof wl){console.error(\"Mounting Svelte component cancelled for mod\",t.id);return}else console.error(\"Error mounting Svelte component for mod\",t.id,r)}).then(r=>{r&&(n=Gn({...t,target:r}))})},revert:i});return a}s(yp,\"registerMountSvelteComponentMod\");function ie(){}s(ie,\"noop\");var ou=s(t=>t,\"identity\");function zy(t,e){for(let n in e)t[n]=e[n];return t}s(zy,\"assign\");function Xse(t){return!!t&&(typeof t==\"object\"||typeof t==\"function\")&&typeof t.then==\"function\"}s(Xse,\"is_promise\");function Fg(t){return t()}s(Fg,\"run\");function Ly(){return Object.create(null)}s(Ly,\"blank_object\");function Rt(t){t.forEach(Fg)}s(Rt,\"run_all\");function qn(t){return typeof t==\"function\"}s(qn,\"is_function\");function De(t,e){return t!=t?e==e:t!==e||t&&typeof t==\"object\"||typeof t==\"function\"}s(De,\"safe_not_equal\");var wp;function Ht(t,e){return wp||(wp=document.createElement(\"a\")),wp.href=e,t===wp.href}s(Ht,\"src_url_equal\");function Uy(t){return Object.keys(t).length===0}s(Uy,\"is_empty\");function rt(t,...e){if(t==null)return ie;let n=t.subscribe(...e);return n.unsubscribe?()=>n.unsubscribe():n}s(rt,\"subscribe\");function Ng(t){let e;return rt(t,n=>e=n)(),e}s(Ng,\"get_store_value\");function Pa(t,e,n){t.$$.on_destroy.push(rt(e,n))}s(Pa,\"component_subscribe\");function qy(t,e,n,i){if(t){let a=Hy(t,e,n,i);return t[0](a)}}s(qy,\"create_slot\");function Hy(t,e,n,i){return t[1]&&i?zy(n.ctx.slice(),t[1](i(e))):n.ctx}s(Hy,\"get_slot_context\");function Jy(t,e,n,i){if(t[2]&&i){let a=t[2](i(n));if(e.dirty===void 0)return a;if(typeof a==\"object\"){let r=[],o=Math.max(e.dirty.length,a.length);for(let l=0;l<o;l+=1)r[l]=e.dirty[l]|a[l];return r}return e.dirty|a}return e.dirty}s(Jy,\"get_slot_changes\");function Gy(t,e,n,i,a,r){if(a){let o=Hy(e,n,i,r);t.p(o,a)}}s(Gy,\"update_slot_base\");function Wy(t){if(t.ctx.length>32){let e=[],n=t.ctx.length/32;for(let i=0;i<n;i++)e[i]=-1;return e}return-1}s(Wy,\"get_all_dirty_from_scope\");function Xi(t){return t??\"\"}s(Xi,\"null_to_empty\");function Jt(t,e,n){return t.set(n),e}s(Jt,\"set_store_value\");function bn(t){return t&&qn(t.destroy)?t.destroy:ie}s(bn,\"action_destroyer\");var Ky=typeof window<\"u\",Yy=Ky?()=>window.performance.now():()=>Date.now(),Rg=Ky?t=>requestAnimationFrame(t):ie;var Al=new Set;function Xy(t){Al.forEach(e=>{e.c(t)||(Al.delete(e),e.f())}),Al.size!==0&&Rg(Xy)}s(Xy,\"run_tasks\");function Zy(t){let e;return Al.size===0&&Rg(Xy),{promise:new Promise(n=>{Al.add(e={c:t,f:n})}),abort(){Al.delete(e)}}}s(Zy,\"loop\");var Qy=typeof window<\"u\"?window:typeof globalThis<\"u\"?globalThis:global,Tl=class{constructor(e){this.options=e,this._listeners=\"WeakMap\"in Qy?new WeakMap:void 0}observe(e,n){return this._listeners.set(e,n),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(n=>{var i;for(let a of n)Tl.entries.set(a.target,a),(i=this._listeners.get(a.target))===null||i===void 0||i(a)})}};s(Tl,\"ResizeObserverSingleton\");Tl.entries=\"WeakMap\"in Qy?new WeakMap:void 0;var $y=!1;function Zse(){$y=!0}s(Zse,\"start_hydrating\");function Qse(){$y=!1}s(Qse,\"end_hydrating\");function I(t,e){t.appendChild(e)}s(I,\"append\");function e1(t){if(!t)return document;let e=t.getRootNode?t.getRootNode():t.ownerDocument;return e&&e.host?e:t.ownerDocument}s(e1,\"get_root_for_style\");function $se(t){let e=L(\"style\");return ele(e1(t),e),e.sheet}s($se,\"append_empty_stylesheet\");function ele(t,e){return I(t.head||t,e),e.sheet}s(ele,\"append_stylesheet\");function U(t,e,n){t.insertBefore(e,n||null)}s(U,\"insert\");function z(t){t.parentNode&&t.parentNode.removeChild(t)}s(z,\"detach\");function Wn(t,e){for(let n=0;n<t.length;n+=1)t[n]&&t[n].d(e)}s(Wn,\"destroy_each\");function L(t){return document.createElement(t)}s(L,\"element\");function tle(t){return document.createElementNS(\"http://www.w3.org/2000/svg\",t)}s(tle,\"svg_element\");function Re(t){return document.createTextNode(t)}s(Re,\"text\");function J(){return Re(\" \")}s(J,\"space\");function _t(){return Re(\"\")}s(_t,\"empty\");function Ue(t,e,n,i){return t.addEventListener(e,n,i),()=>t.removeEventListener(e,n,i)}s(Ue,\"listen\");function t1(t){return function(e){return e.stopPropagation(),t.call(this,e)}}s(t1,\"stop_propagation\");function E(t,e,n){n==null?t.removeAttribute(e):t.getAttribute(e)!==n&&t.setAttribute(e,n)}s(E,\"attr\");function Sl(t){return t===\"\"?null:+t}s(Sl,\"to_number\");function nle(t){return Array.from(t.childNodes)}s(nle,\"children\");function ct(t,e){e=\"\"+e,t.data!==e&&(t.data=e)}s(ct,\"set_data\");function Bt(t,e){t.value=e??\"\"}s(Bt,\"set_input_value\");function Xe(t,e,n,i){n==null?t.style.removeProperty(e):t.style.setProperty(e,n,i?\"important\":\"\")}s(Xe,\"set_style\");function n1(t,e,{bubbles:n=!1,cancelable:i=!1}={}){let a=document.createEvent(\"CustomEvent\");return a.initCustomEvent(t,n,i,e),a}s(n1,\"custom_event\");var Yi=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,n,i=null){this.e||(this.is_svg?this.e=tle(n.nodeName):this.e=L(n.nodeType===11?\"TEMPLATE\":n.nodeName),this.t=n.tagName!==\"TEMPLATE\"?n:n.content,this.c(e)),this.i(i)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName===\"TEMPLATE\"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let n=0;n<this.n.length;n+=1)U(this.t,this.n[n],e)}p(e){this.d(),this.h(e),this.i(this.a)}d(){this.n.forEach(z)}};s(Yi,\"HtmlTag\");var kp=new Map,jp=0;function ile(t){let e=5381,n=t.length;for(;n--;)e=(e<<5)-e^t.charCodeAt(n);return e>>>0}s(ile,\"hash\");function ale(t,e){let n={stylesheet:$se(e),rules:{}};return kp.set(t,n),n}s(ale,\"create_style_information\");function i1(t,e,n,i,a,r,o,l=0){let c=16.666/i,d=`{\n`;for(let _=0;_<=1;_+=c){let h=e+(n-e)*r(_);d+=_*100+`%{${o(h,1-h)}}\n`}let u=d+`100% {${o(n,1-n)}}\n}`,p=`__svelte_${ile(u)}_${l}`,m=e1(t),{stylesheet:f,rules:g}=kp.get(m)||ale(m,t);g[p]||(g[p]=!0,f.insertRule(`@keyframes ${p} ${u}`,f.cssRules.length));let x=t.style.animation||\"\";return t.style.animation=`${x?`${x}, `:\"\"}${p} ${i}ms linear ${a}ms 1 both`,jp+=1,p}s(i1,\"create_rule\");function Og(t,e){let n=(t.style.animation||\"\").split(\", \"),i=n.filter(e?r=>r.indexOf(e)<0:r=>r.indexOf(\"__svelte\")===-1),a=n.length-i.length;a&&(t.style.animation=i.join(\", \"),jp-=a,jp||rle())}s(Og,\"delete_rule\");function rle(){Rg(()=>{jp||(kp.forEach(t=>{let{ownerNode:e}=t.stylesheet;e&&z(e)}),kp.clear())})}s(rle,\"clear_rules\");function su(t,e,n,i){if(!e)return ie;let a=t.getBoundingClientRect();if(e.left===a.left&&e.right===a.right&&e.top===a.top&&e.bottom===a.bottom)return ie;let{delay:r=0,duration:o=300,easing:l=ou,start:c=Yy()+r,end:d=c+o,tick:u=ie,css:p}=n(t,{from:e,to:a},i),m=!0,f=!1,g;function x(){p&&(g=i1(t,0,1,o,r,l,p)),r||(f=!0)}s(x,\"start\");function _(){p&&Og(t,g),m=!1}return s(_,\"stop\"),Zy(h=>{if(!f&&h>=c&&(f=!0),f&&h>=d&&(u(1,0),_()),!m)return!1;if(f){let v=h-c,b=0+1*l(v/o);u(b,1-b)}return!0}),x(),u(0,1),_}s(su,\"create_animation\");function lu(t){let e=getComputedStyle(t);if(e.position!==\"absolute\"&&e.position!==\"fixed\"){let{width:n,height:i}=e,a=t.getBoundingClientRect();t.style.position=\"absolute\",t.style.width=n,t.style.height=i,ole(t,a)}}s(lu,\"fix_position\");function ole(t,e){let n=t.getBoundingClientRect();if(e.left!==n.left||e.top!==n.top){let i=getComputedStyle(t),a=i.transform===\"none\"?\"\":i.transform;t.style.transform=`${a} translate(${e.left-n.left}px, ${e.top-n.top}px)`}}s(ole,\"add_transform\");var ru;function eo(t){ru=t}s(eo,\"set_current_component\");function Mg(){if(!ru)throw new Error(\"Function called outside component initialization\");return ru}s(Mg,\"get_current_component\");function Zi(t){Mg().$$.on_destroy.push(t)}s(Zi,\"onDestroy\");function Bg(){let t=Mg();return(e,n,{cancelable:i=!1}={})=>{let a=t.$$.callbacks[e];if(a){let r=n1(e,n,{cancelable:i});return a.slice().forEach(o=>{o.call(t,r)}),!r.defaultPrevented}return!0}}s(Bg,\"createEventDispatcher\");var jl=[];var Te=[],Cl=[],Ig=[],sle=Promise.resolve(),Dg=!1;function lle(){Dg||(Dg=!0,sle.then(Pg))}s(lle,\"schedule_update\");function to(t){Cl.push(t)}s(to,\"add_render_callback\");function Me(t){Ig.push(t)}s(Me,\"add_flush_callback\");var Sg=new Set,kl=0;function Pg(){if(kl!==0)return;let t=ru;do{try{for(;kl<jl.length;){let e=jl[kl];kl++,eo(e),cle(e.$$)}}catch(e){throw jl.length=0,kl=0,e}for(eo(null),jl.length=0,kl=0;Te.length;)Te.pop()();for(let e=0;e<Cl.length;e+=1){let n=Cl[e];Sg.has(n)||(Sg.add(n),n())}Cl.length=0}while(jl.length);for(;Ig.length;)Ig.pop()();Dg=!1,Sg.clear(),eo(t)}s(Pg,\"flush\");function cle(t){if(t.fragment!==null){t.update(),Rt(t.before_update);let e=t.dirty;t.dirty=[-1],t.fragment&&t.fragment.p(t.ctx,e),t.after_update.forEach(to)}}s(cle,\"update\");function ule(t){let e=[],n=[];Cl.forEach(i=>t.indexOf(i)===-1?e.push(i):n.push(i)),n.forEach(i=>i()),Cl=e}s(ule,\"flush_render_callbacks\");var au;function dle(){return au||(au=Promise.resolve(),au.then(()=>{au=null})),au}s(dle,\"wait\");function Vy(t,e,n){t.dispatchEvent(n1(`${e?\"intro\":\"outro\"}${n}`))}s(Vy,\"dispatch\");var Ep=new Set,Es;function Sn(){Es={r:0,c:[],p:Es}}s(Sn,\"group_outros\");function On(){Es.r||Rt(Es.c),Es=Es.p}s(On,\"check_outros\");function ae(t,e){t&&t.i&&(Ep.delete(t),t.i(e))}s(ae,\"transition_in\");function de(t,e,n,i){if(t&&t.o){if(Ep.has(t))return;Ep.add(t),Es.c.push(()=>{Ep.delete(t),i&&(n&&t.d(1),i())}),t.o(e)}else i&&i()}s(de,\"transition_out\");var ple={duration:0};function cu(t,e,n){let i={direction:\"in\"},a=e(t,n,i),r=!1,o,l,c=0;function d(){o&&Og(t,o)}s(d,\"cleanup\");function u(){let{delay:m=0,duration:f=300,easing:g=ou,tick:x=ie,css:_}=a||ple;_&&(o=i1(t,0,1,f,m,g,_,c++)),x(0,1);let h=Yy()+m,v=h+f;l&&l.abort(),r=!0,to(()=>Vy(t,!0,\"start\")),l=Zy(b=>{if(r){if(b>=v)return x(1,0),Vy(t,!0,\"end\"),d(),r=!1;if(b>=h){let y=g((b-h)/f);x(y,1-y)}}return r})}s(u,\"go\");let p=!1;return{start(){p||(p=!0,Og(t),qn(a)?(a=a(i),dle().then(u)):u())},invalidate(){p=!1},end(){r&&(d(),r=!1)}}}s(cu,\"create_in_transition\");function a1(t,e){let n=e.token={};function i(a,r,o,l){if(e.token!==n)return;e.resolved=l;let c=e.ctx;o!==void 0&&(c=c.slice(),c[o]=l);let d=a&&(e.current=a)(c),u=!1;e.block&&(e.blocks?e.blocks.forEach((p,m)=>{m!==r&&p&&(Sn(),de(p,1,1,()=>{e.blocks[m]===p&&(e.blocks[m]=null)}),On())}):e.block.d(1),d.c(),ae(d,1),d.m(e.mount(),e.anchor),u=!0),e.block=d,e.blocks&&(e.blocks[r]=d),u&&Pg()}if(s(i,\"update\"),Xse(t)){let a=Mg();if(t.then(r=>{eo(a),i(e.then,1,e.value,r),eo(null)},r=>{if(eo(a),i(e.catch,2,e.error,r),eo(null),!e.hasCatch)throw r}),e.current!==e.pending)return i(e.pending,0),!0}else{if(e.current!==e.then)return i(e.then,1,e.value,t),!0;e.resolved=t}}s(a1,\"handle_promise\");function r1(t,e,n){let i=e.slice(),{resolved:a}=t;t.current===t.then&&(i[t.value]=a),t.current===t.catch&&(i[t.error]=a),t.block.p(i,n)}s(r1,\"update_await_block_branch\");function mle(t,e){t.d(1),e.delete(t.key)}s(mle,\"destroy_block\");function uu(t,e){t.f(),mle(t,e)}s(uu,\"fix_and_destroy_block\");function du(t,e,n,i,a,r,o,l,c,d,u,p){let m=t.length,f=r.length,g=m,x={};for(;g--;)x[t[g].key]=g;let _=[],h=new Map,v=new Map,b=[];for(g=f;g--;){let F=p(a,r,g),N=n(F),k=o.get(N);k?i&&b.push(()=>k.p(F,e)):(k=d(N,F),k.c()),h.set(N,_[g]=k),N in x&&v.set(N,Math.abs(g-x[N]))}let y=new Set,w=new Set;function S(F){ae(F,1),F.m(l,u),o.set(F.key,F),u=F.first,f--}for(s(S,\"insert\");m&&f;){let F=_[f-1],N=t[m-1],k=F.key,R=N.key;F===N?(u=F.first,m--,f--):h.has(R)?!o.has(k)||y.has(k)?S(F):w.has(R)?m--:v.get(k)>v.get(R)?(w.add(k),S(F)):(y.add(R),m--):(c(N,o),m--)}for(;m--;){let F=t[m];h.has(F.key)||c(F,o)}for(;f;)S(_[f-1]);return Rt(b),_}s(du,\"update_keyed_each\");var fle=[\"allowfullscreen\",\"allowpaymentrequest\",\"async\",\"autofocus\",\"autoplay\",\"checked\",\"controls\",\"default\",\"defer\",\"disabled\",\"formnovalidate\",\"hidden\",\"inert\",\"ismap\",\"loop\",\"multiple\",\"muted\",\"nomodule\",\"novalidate\",\"open\",\"playsinline\",\"readonly\",\"required\",\"reversed\",\"selected\"],S2e=new Set([...fle]);function Be(t,e,n){let i=t.$$.props[e];i!==void 0&&(t.$$.bound[i]=n,n(t.$$.ctx[i]))}s(Be,\"bind\");function Ce(t){t&&t.c()}s(Ce,\"create_component\");function Ae(t,e,n,i){let{fragment:a,after_update:r}=t.$$;a&&a.m(e,n),i||to(()=>{let o=t.$$.on_mount.map(Fg).filter(qn);t.$$.on_destroy?t.$$.on_destroy.push(...o):Rt(o),t.$$.on_mount=[]}),r.forEach(to)}s(Ae,\"mount_component\");function je(t,e){let n=t.$$;n.fragment!==null&&(ule(n.after_update),Rt(n.on_destroy),n.fragment&&n.fragment.d(e),n.on_destroy=n.fragment=null,n.ctx=[])}s(je,\"destroy_component\");function hle(t,e){t.$$.dirty[0]===-1&&(jl.push(t),lle(),t.$$.dirty.fill(0)),t.$$.dirty[e/31|0]|=1<<e%31}s(hle,\"make_dirty\");function Ve(t,e,n,i,a,r,o,l=[-1]){let c=ru;eo(t);let d=t.$$={fragment:null,ctx:[],props:r,update:ie,not_equal:a,bound:Ly(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(e.context||(c?c.$$.context:[])),callbacks:Ly(),dirty:l,skip_bound:!1,root:e.target||c.$$.root};o&&o(d.root);let u=!1;if(d.ctx=n?n(t,e.props||{},(p,m,...f)=>{let g=f.length?f[0]:m;return d.ctx&&a(d.ctx[p],d.ctx[p]=g)&&(!d.skip_bound&&d.bound[p]&&d.bound[p](g),u&&hle(t,p)),m}):[],d.update(),u=!0,Rt(d.before_update),d.fragment=i?i(d.ctx):!1,e.target){if(e.hydrate){Zse();let p=nle(e.target);d.fragment&&d.fragment.l(p),p.forEach(z)}else d.fragment&&d.fragment.c();e.intro&&ae(t.$$.fragment),Ae(t,e.target,e.anchor,e.customElement),Qse(),Pg()}eo(c)}s(Ve,\"init\");var gle;typeof HTMLElement==\"function\"&&(gle=s(class extends HTMLElement{constructor(){super(),this.attachShadow({mode:\"open\"})}connectedCallback(){let{on_mount:t}=this.$$;this.$$.on_disconnect=t.map(Fg).filter(qn);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(t,e,n){this[t]=n}disconnectedCallback(){Rt(this.$$.on_disconnect)}$destroy(){je(this,1),this.$destroy=ie}$on(t,e){if(!qn(e))return ie;let n=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return n.push(e),()=>{let i=n.indexOf(e);i!==-1&&n.splice(i,1)}}$set(t){this.$$set&&!Uy(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}},\"SvelteElement\"));var Pe=class{$destroy(){je(this,1),this.$destroy=ie}$on(e,n){if(!qn(n))return ie;let i=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return i.push(n),()=>{let a=i.indexOf(n);a!==-1&&i.splice(a,1)}}$set(e){this.$$set&&!Uy(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};s(Pe,\"SvelteComponent\");function _le(t){let e,n,i,a,r,o=xle()+\"\",l,c,d,u,p=A(\"dialog.unexpected_error.paragraph\",'<a href=\"https://animated-java.dev/discord\">Discord</a>','<a href=\"https://github.com/Animated-Java/animated-java/issues\">Github</a>')+\"\",m,f,g,x,_,h,v,b;return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"i\"),a=J(),r=L(\"h2\"),l=J(),c=L(\"i\"),d=J(),u=L(\"p\"),m=J(),f=L(\"div\"),g=L(\"textarea\"),x=J(),_=L(\"i\"),E(i,\"class\",\"fas fa-quote-left dialog_form_warning text_icon svelte-hszt7f\"),Xe(r,\"font-size\",\"24px\"),Xe(r,\"text-align\",\"center\"),E(c,\"class\",\"fas fa-quote-right dialog_form_warning text_icon svelte-hszt7f\"),E(n,\"class\",\"quote svelte-hszt7f\"),g.readOnly=!0,E(g,\"class\",\"svelte-hszt7f\"),E(_,\"class\",\"fas fa-copy dialog_form_warning text_icon svelte-hszt7f\"),E(_,\"title\",h=A(\"dialog.unexpected_error.copy_error_message_button.description\")),E(f,\"class\",\"codebox dark_bordered svelte-hszt7f\"),E(e,\"class\",\"container svelte-hszt7f\")},m(y,w){U(y,e,w),I(e,n),I(n,i),I(n,a),I(n,r),r.innerHTML=o,I(n,l),I(n,c),I(e,d),I(e,u),u.innerHTML=p,I(e,m),I(e,f),I(f,g),Bt(g,t[0]),I(f,x),I(f,_),v||(b=[Ue(g,\"input\",t[3]),Ue(_,\"click\",t[1])],v=!0)},p(y,[w]){w&1&&Bt(g,y[0])},i:ie,o:ie,d(y){y&&z(e),v=!1,Rt(b)}}}s(_le,\"create_fragment\");var o1=[\"Uh oh!\",\"Time to fire up the ol' debugger!\",\"Your item displays are sad \\u{1F97A}\",'Ok, who pushed the big <span style=\"color: var(--color-error)\">red</span> button?',\"Skill Issue.\",\"You have how many elements!?\",\"I'll export successfully some day!\",\"When I grow up, I wanna be just like Blender!\",\"Should'a seen that one comming...\",\"It's all Jannis' fault! :(\",\"Snaviewavie did an oopsie poopsie x3\",\"We to a little trolling\",\"execute run execute run execute run execute run say This is fine.\",\"This is why we can't have nice things. :(\",\"Have you tried turning it off and on again?\",\"What if I put my command block next to yours? Haha just kidding... Unless?\",\"If at first you don't succeed, Try, try again!\",\"B:01010111 01100101 00100000 01100100 01101111 00100000 01100001 00100000 01101100 01101001 01110100 01110100 01101100 01100101 00100000 01110100 01110010 01101111 01101100 01101100 01101001 01101110 01100111\",`<div style=\"display: flex; flex-direction: column; padding: 16px;\">\n\t\t\t<p>SnaveSutit would like to know your location</p>\n\t\t\t<div style=\"display: flex; flex-direction: row; align-items: center; justify-content: center;\">\n\t\t\t\t<button style=\"font-size: 1rem; margin: 0px 4px;\">Allow</button>\n\t\t\t\t<button style=\"font-size: 1rem; margin: 0px 4px;\">Deny</button>\n\t\t\t</div>\n\t\t</div>`,\"I've decided to stop working for today. Try again tomorrow!\",\"Every time you see this error message, a developer vanishes in a puff of binary.\",`\"Flavor Text\"? I've never tasted text before...`,\"( \\u0361\\xB0 \\u035C\\u0296 \\u0361\\xB0)\",\"That's a nice model you have there, it'd be a shame if something were to happen to it...\",\"Some day you'll learn. But until then, I control the cheese\",\"Please deposit 5 coins!\",'<a href=\"https://youtu.be/dQw4w9WgXcQ\">Click here to find a solution!</a>','<img src=\"https://i.kym-cdn.com/photos/images/original/000/296/199/9ff.gif\" alt=\"roflcopter\">',\"Failed to find global 'pandemic'\"];function xle(){return o1[Math.floor(Math.random()*o1.length)]}s(xle,\"pickRandomFlavorQuote\");function vle(t,e,n){let{error:i}=e,a=i.message+`\n`+(i.stack??\"\");function r(){navigator.clipboard.writeText(a).then(()=>{Blockbench.showQuickMessage(A(\"dialog.unexpected_error.copy_error_message_button.message\"))})}s(r,\"copyError\");function o(){a=this.value,n(0,a)}return s(o,\"textarea_input_handler\"),t.$$set=l=>{\"error\"in l&&n(2,i=l.error)},[a,r,i,o]}s(vle,\"instance\");var Ap=class extends Pe{constructor(e){super(),Ve(this,e,vle,_le,De,{error:2})}};s(Ap,\"UnexpectedErrorDialog\");var s1=Ap;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".container.svelte-hszt7f{height:25rem;display:flex;flex-direction:column}.codebox.svelte-hszt7f{height:25rem;display:flex;margin-top:16px}.quote.svelte-hszt7f{display:flex;justify-content:center;align-items:center;margin-bottom:1rem}textarea.svelte-hszt7f{width:100%;height:100%;border:unset}i.svelte-hszt7f{cursor:pointer;padding:5px;max-height:2rem}i.svelte-hszt7f:hover{color:var(--color-light)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Lg=[];function Vg(t,e){for(let[n,i]of Object.entries(e))t.style[n]=i??\"\"}s(Vg,\"applyStyleObject\");var cn=class extends Dialog{wrapperElement=null;contentElement=null;contentComponent=null;extraComponent=null;constructor(e){let n=document.createComment(\"svelte-dialog-\"+guid()),i={...e};delete i.component,super(e.id,{...i,lines:[n]}),this.onOpen=()=>{if(!this.contentComponent){if(this.contentElement=n.parentElement,!this.contentElement){console.error(\"Failed to find dialog content element\");return}if(this.wrapperElement=this.contentElement.parentElement,!this.wrapperElement){console.error(\"Failed to find dialog wrapper element\");return}e.contentStyle&&Vg(this.contentElement,e.contentStyle),e.wrapperStyle&&Vg(this.wrapperElement,e.wrapperStyle),e.dialogStyle&&Vg(this.object,e.dialogStyle),this.contentComponent=new e.content.component({target:this.contentElement,props:e.content.props}),e.extra&&(this.extraComponent=new e.extra.component({target:this.object,props:e.extra.props})),e.onOpen&&e.onOpen(),e.stackable||(Lg.forEach(a=>a.cancel()),Lg.empty()),Lg.push(this),requestAnimationFrame(()=>{let r=$(this.object).height(),o=Math.max(window.innerHeight-r,0),l=o*.25;this.object.style.top=Math.clamp(o/2-l,26,2e3)+\"px\"})}},this.confirm=a=>{if(a instanceof KeyboardEvent){if(e.preventKeybinds){a.preventDefault(),a.stopPropagation();return}else if(e.preventKeybindConfirm&&a.key===Keybinds.extra.confirm.keybind.getCode()){a.preventDefault(),a.stopPropagation();return}else if(e.preventKeybindCancel&&a.key===Keybinds.extra.cancel.keybind.getCode()){a.preventDefault(),a.stopPropagation();return}}this.close(this.confirmIndex,a)},this.onButton=(...a)=>{this.contentComponent&&(this.extraComponent?.$destroy(),this.contentComponent.$destroy(),this.contentComponent=null,e.onButton&&e.onButton(...a),e.onClose&&e.onClose())},this.onCancel=(...a)=>{this.contentComponent&&(this.extraComponent?.$destroy(),this.contentComponent.$destroy(),this.contentComponent=null,e.onCancel&&e.onCancel(...a),e.onClose&&e.onClose())}}};s(cn,\"SvelteDialog\");function Fo(t){new cn({id:`${Ke.name}:unexpectedError`,title:A(\"dialog.unexpected_error.title\"),width:600,content:{component:s1,props:{error:t}},preventKeybinds:!0,buttons:[A(\"dialog.unexpected_error.close_button\")]}).show()}s(Fo,\"openUnexpectedErrorDialog\");var qc=wi(Ee(\"path\"),1);var mf={};vn(mf,{assetsLoaded:()=>Qo,checkForAssetsUpdate:()=>Ux,extractAssets:()=>TS,getJSONAsset:()=>Mi,getLatestVersionClientDownloadUrl:()=>yh,getPngAssetAsDataUrl:()=>Zo,getRawAsset:()=>sb,hasAsset:()=>Lx,updateAssets:()=>bh});var ble=\"https://launchermeta.mojang.com/mc/game/version_manifest_v2.json\",Ol;async function no(){if(Ol)return Ol;if(!window.navigator.onLine){if(console.warn(\"Not connected to the internet! Using last known latest version.\"),Ol=Il(),!Ol)throw new Error(\"No internet connection, and no previous latest version cached!\");return Ol}let t;try{t=await fetch(ble)}catch(e){throw new Error(`Failed to fetch latest Minecraft version manifest: ${e.message}`)}if(t?.ok){let e=await t.json(),n=e.versions.find(i=>i.id===e.latest.snapshot);if(!n)throw new Error(`Failed to find version data for '${e.latest.snapshot}'`);return Ol=n,localStorage.setItem(\"animated_java:minecraftVersion\",JSON.stringify(n)),n}throw new Error(\"Failed to fetch latest Minecraft version manifest.\")}s(no,\"getLatestVersion\");function Il(){let t=localStorage.getItem(\"animated_java:minecraftVersion\");if(t)return JSON.parse(t)}s(Il,\"getCurrentVersion\");var AS=wi(nj(),1);var ij={\"assets/animated_java/textures/steve.png\":\"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABL1BMVEUBAABGOqUwKHIAr6+qfWaWX0EAaGgAf38AqKgAmZlqQDB1Ry8qHQ0mIVs/Pz9ra2uHVTuWb1soKCgAYGBWScwmGgoAzMwvHw86MYkkGAgoGwoAW1sAAABRMSUAnp4pHAwsHg6GUzQrHg2BUzkfEAsmGAsoGg0nGwstHQ4tIBCaY0QzJBFFIg6cZ0gjFwkkGAomGgwoGwsoHAsrHg4sHhEvIhEyIxBBIQw6KBRiQy9SPYl0SC+KTD2EUjGHWDqIWjmKWTucY0WcaUydak+iake0hG27iXL///8vIA1CHQo0JRI/KhVCKhJSKCZtQypvRSx6TjOAUzSDVTuPXj6QXkOWX0CcY0aaZEqfaEmcclysdlqze2K1e2etgG23gnK2iWy+iGy9i3K9jnK9jnTGloCtoI9HAAAAAXRSTlMAQObYZgAAAwBJREFUWMPtlmd7okAQxyNL2UX04O4QhAvNWNN7v/Tkeu+9ff/PcLO7bqIYA8a3/h8fdyjzY2aZh5mpqa4Mowq/6kyxq6lRZVQdBwDVos50C4Dj2BzwAPR8dEDVoTk4BgfcKgLDtp1xAMx/HIDthPYMBcR6HN/mLYQ2yDBGfo2eZzfDjXb7UeKsVO3EaLc3wqbteaIu8gDsKExmkySZffY0WplNwsimgG5dZAKiuh2uLi+Gyc8//37//fIkXFxeDe16JOoiO4JGK/Ka0bp8Jn//fH58vB41vajV8ERd5EjBW1p4eLR1drHz7XznQt46eriwBCdFXeQANOpr+8rBh68/dP3X6esDZX+t3qCbyOsiew+81vZJJy6+e7+5tzf3tlaMOyfbLS8SdZEJiONOPK8c7r58sfl4bu7Nq93DT/Mf5ztQS7QuinGuWrgPugsSxxVeS5V7XYnzuFLB+rQ+nQ3g34QBQAU0LgCDvz5WCgMASSpJBRAsdHU1TfNJUDut1YIAbC3AGCOEMbcRWxHoClDqAxQ0VdUwDsAfIbBVTO8GAJgawiig11MAqQ/AbkQ4IOAJtoq4MAMjBr0Z4KuqD9cDAn/cJggTDoCgbogADBek+r5PCHUjBEyfecOxoiimDDLBoGs/wHULdC8oAHxUwh9KAKYidoA5wJJlxbwO0LsHFAABYAaAPaDeADE5wGIAy+oBSNLAWxAAjW3iJYA+mQLM/ggEQLoCIOaFiNgwKvDjACUFKJcFoFy+A9JUTSOEBsABYLNtUDhAVmgkkEoPgDuKFVIpUWDBBQAtMtfFhLgFDrBkFkkGgEUEBCLKm8AffTL4WWY6gokmmmiiUeYFPKwr5x44QGMB8LDBYpQUcgN65wWX9gkQfOODgbkgG1C6bDQBNAmt2+rzA6RSb6fCA219FMC1c8FQQGpeGDoXDAeU+LxwCRAtLS8glQIFWBxg9s0F2QCeiskArCubOSOQUgCFA8ycgPS8oHRzp6MNTSUHoL/dsydb4wAgd8tio821gP/oPFz1ouD5GQAAAABJRU5ErkJggg==\",\"assets/index.json\":`{}\\r\n`,\"assets/minecraft/blockstates/black_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/black_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/black_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/black_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/blue_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/blue_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/blue_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/blue_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/brown_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/brown_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/brown_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/brown_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/chest.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/chest\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/conduit.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/conduit\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/cyan_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/cyan_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/cyan_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/cyan_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/ender_chest.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/ender_chest\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/gray_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/gray_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/gray_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/gray_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/green_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/green_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/green_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/green_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/light_blue_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/light_blue_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/light_blue_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/light_blue_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/light_gray_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/light_gray_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/light_gray_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/light_gray_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/lime_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/lime_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/lime_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/lime_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/magenta_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/magenta_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/magenta_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/magenta_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/orange_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/orange_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/orange_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/orange_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/pink_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/pink_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/pink_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/pink_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/purple_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/purple_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/purple_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/purple_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/red_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/red_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/red_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/red_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/white_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/white_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/white_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/white_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/yellow_bed.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/yellow_bed\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/blockstates/yellow_shulker_box.json\":`{\\r\n\t\"variants\": {\\r\n\t\t\"\": {\\r\n\t\t\t\"model\": \"minecraft:block/yellow_shulker_box\"\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/bed.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"bed\",\\r\n\t\t\t\"from\": [0, 3, 0],\\r\n\t\t\t\"to\": [16, 9, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"x\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [9.5, 0, 5.5, 1.5], \"rotation\": 180, \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 1.5, 1.5, 5.5], \"rotation\": 270, \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [5.5, 1.5, 1.5, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [5.5, 1.5, 7, 5.5], \"rotation\": 90, \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [1.5, 1.5, 5.5, 5.5], \"rotation\": 180, \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [7, 1.5, 11, 5.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"bed\",\\r\n\t\t\t\"from\": [0, 3, -16],\\r\n\t\t\t\"to\": [16, 9, 0],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"x\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [9.5, 5.5, 5.5, 7], \"rotation\": 180, \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 7, 1.5, 11], \"rotation\": 270, \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [5.5, 7, 1.5, 5.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [5.5, 7, 7, 11], \"rotation\": 90, \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [1.5, 7, 5.5, 11], \"rotation\": 180, \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [7, 7, 11, 11], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg0\",\\r\n\t\t\t\"from\": [13, 0, -16],\\r\n\t\t\t\"to\": [16, 3, -13],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [13.25, 0.75, 14, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [12.5, 0.75, 13.25, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14.75, 0.75, 15.5, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [14, 0.75, 14.75, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [14, 0.75, 13.25, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14.75, 0, 14, 0.75], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg1\",\\r\n\t\t\t\"from\": [13, 0, 13],\\r\n\t\t\t\"to\": [16, 3, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [13.25, 2.25, 14, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [12.5, 2.25, 13.25, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14.75, 2.25, 15.5, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [14, 2.25, 14.75, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [14, 2.25, 13.25, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14.75, 1.5, 14, 2.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg2\",\\r\n\t\t\t\"from\": [0, 0, -16],\\r\n\t\t\t\"to\": [3, 3, -13],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [13.25, 3.75, 14, 4.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [12.5, 3.75, 13.25, 4.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14.75, 3.75, 15.5, 4.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [14, 3.75, 14.75, 4.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [14, 3.75, 13.25, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14.75, 3, 14, 3.75], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg3\",\\r\n\t\t\t\"from\": [0, 0, 13],\\r\n\t\t\t\"to\": [3, 3, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [13.25, 5.25, 14, 6], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [12.5, 5.25, 13.25, 6], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14.75, 5.25, 15.5, 6], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [14, 5.25, 14.75, 6], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [14, 5.25, 13.25, 4.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14.75, 4.5, 14, 5.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t],\\r\n\t\"groups\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"bed\",\\r\n\t\t\t\"origin\": [8, 0, 8],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [0, 1]\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg0\",\\r\n\t\t\t\"origin\": [14.5, 1.5, -6.5],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [2]\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg1\",\\r\n\t\t\t\"origin\": [14.5, 1.5, 22.5],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [3]\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg2\",\\r\n\t\t\t\"origin\": [1.5, 1.5, -6.5],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [4]\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leg3\",\\r\n\t\t\t\"origin\": [1.5, 1.5, 22.5],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [5]\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/block/black_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/black\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/black_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_black\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/blue_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/blue\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/blue_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_blue\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/brown_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/brown\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/brown_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_brown\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/chest.json\":`{\\r\n\t\"parent\": \"block/block\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/chest/normal\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 9, 1],\\r\n\t\t\t\"to\": [15, 14, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 11.5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [7, 3.5, 3.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [3.5, 3.5, 0, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [14, 3.5, 10.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [10.5, 3.5, 7, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 3.5, 10.5, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 3.5, 7, 0], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [7, 8, 15],\\r\n\t\t\t\"to\": [9, 12, 16],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 10, 15.5] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [1, 1.25, 0.5, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0.5, 1.25, 0.25, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [1, 1.25, 0.5, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [1.25, 1.25, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [0.5, 0.25, 1, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [0.5, 0.25, 1, 0], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 0, 1],\\r\n\t\t\t\"to\": [15, 10, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [7, 8.25, 3.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [10.5, 8.25, 7, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [14, 8.25, 10.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [3.5, 8.25, 0, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 8.25, 10.5, 4.75], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 8.25, 7, 4.75], \"rotation\": 180, \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/block/conduit.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [32, 16],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"minecraft:entity/conduit/base\",\\r\n\t\t\"particle\": \"minecraft:entity/conduit/base\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [5, 5, 5],\\r\n\t\t\t\"to\": [11, 11, 11],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [5, 5, 5] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [3, 6, 6, 12], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 6, 3, 12], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [9, 6, 12, 12], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [6, 6, 9, 12], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [6, 6, 3, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [9, 0, 6, 6], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/block/cyan_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/cyan\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/cyan_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_cyan\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/ender_chest.json\":`{\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/chest/ender\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 9, 1],\\r\n\t\t\t\"to\": [15, 14, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 11.5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10.5, 3.5, 14, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 3.5, 3.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [3.5, 3.5, 7, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [7, 3.5, 10.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 0, 10.5, 3.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 0, 7, 3.5], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [7, 8, 0],\\r\n\t\t\t\"to\": [9, 12, 1],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 10, 0.5] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0.5, 1.25, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0.25, 1.25, 0.5, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [0.5, 1.25, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [1, 1.25, 1.25, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [0.5, 0, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [0.5, 0, 1, 0.25], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 0, 1],\\r\n\t\t\t\"to\": [15, 10, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10.5, 8.25, 14, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [7, 8.25, 10.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [3.5, 8.25, 7, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [0, 8.25, 3.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 4.75, 10.5, 8.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 4.75, 7, 8.25], \"rotation\": 180, \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/block/gray_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/gray\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/gray_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_gray\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/green_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/green\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/green_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_green\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/light_blue_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/light_blue\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/light_blue_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_light_blue\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/light_gray_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/light_gray\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/light_gray_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_light_gray\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/lime_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/lime\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/lime_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_lime\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/magenta_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/magenta\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/magenta_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_magenta\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/orange_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/orange\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/orange_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_orange\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/pink_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/pink\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/pink_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_pink\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/purple_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/purple\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/purple_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_purple\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/red_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/red\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/red_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_red\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/shulker_box.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker\",\\r\n\t\t\"particle\": \"entity/shulker/shulker\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [0, 0, 0],\\r\n\t\t\t\"to\": [16, 16, 16],\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0, 9, 4, 13], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 9, 4, 13], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [0, 9, 4, 13], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [0, 9, 4, 13], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [8, 7, 12, 11], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [0, 0, 0],\\r\n\t\t\t\"to\": [16, 16, 16],\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [0, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [0, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [4, 0, 8, 4], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/block/white_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/white\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/white_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_white\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/yellow_bed.json\":`{\\r\n\t\"parent\": \"block/bed\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/bed/yellow\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/block/yellow_shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shulker/shulker_yellow\"\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/black_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/black_shulker_box.json\":`{\\r\n\t\"parent\": \"block/black_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/blue_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/blue_shulker_box.json\":`{\\r\n\t\"parent\": \"block/blue_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/brown_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/brown_shulker_box.json\":`{\\r\n\t\"parent\": \"block/brown_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/conduit.json\":`{\\r\n\t\"parent\": \"block/conduit\",\\r\n\t\"textures\": {\\r\n\t\t\"particle\": \"block/conduit\"\\r\n\t},\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1.0, 1.0, 1.0]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.8, 0.8, 0.8]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/creeper_head.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 32],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/creeper/creeper\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"Head\",\\r\n\t\t\t\"from\": [4, -8, 4],\\r\n\t\t\t\"to\": [12, 0, 12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -4, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2, 4, 4, 8], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 4, 2, 8], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [6, 4, 8, 8], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [4, 4, 6, 8], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [4, 4, 2, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [6, 0, 4, 4], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/cyan_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/cyan_shulker_box.json\":`{\\r\n\t\"parent\": \"block/cyan_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/decorated_pot.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/decorated_pot/decorated_pot_side\",\\r\n\t\t\"1\": \"entity/decorated_pot/decorated_pot_base\",\\r\n\t\t\"particle\": \"entity/decorated_pot/decorated_pot_side\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 0, 1],\\r\n\t\t\t\"to\": [15, 16, 15],\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [1, 0, 15, 16], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [1, 0, 15, 16], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [1, 0, 15, 16], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [1, 0, 15, 16], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 6.5, 14, 13.5], \"texture\": \"#1\" },\\r\n\t\t\t\t\"down\": { \"uv\": [0, 6.5, 7, 13.5], \"texture\": \"#1\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [4.75, 16, 4.75],\\r\n\t\t\t\"to\": [11.25, 20, 11.25],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [6, 16, 6] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0, 4, 4, 6], \"texture\": \"#1\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 4, 4, 6], \"texture\": \"#1\" },\\r\n\t\t\t\t\"south\": { \"uv\": [0, 4, 4, 6], \"texture\": \"#1\" },\\r\n\t\t\t\t\"west\": { \"uv\": [0, 4, 4, 6], \"texture\": \"#1\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [4, 17, 4],\\r\n\t\t\t\"to\": [12, 20, 12],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [6, 17, 6] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [12, 4, 16, 5.5], \"texture\": \"#1\" },\\r\n\t\t\t\t\"east\": { \"uv\": [12, 4, 16, 5.5], \"texture\": \"#1\" },\\r\n\t\t\t\t\"south\": { \"uv\": [12, 4, 16, 5.5], \"texture\": \"#1\" },\\r\n\t\t\t\t\"west\": { \"uv\": [12, 4, 16, 5.5], \"texture\": \"#1\" },\\r\n\t\t\t\t\"up\": { \"uv\": [4, 0, 8, 4], \"texture\": \"#1\" },\\r\n\t\t\t\t\"down\": { \"uv\": [8, 0, 12, 4], \"texture\": \"#1\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/dragon_head.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [256, 256],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"enderdragon\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [2, -6, -16],\\r\n\t\t\t\"to\": [14, -1, 0],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [12, 3.75, 12.75, 4.0625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [11, 3.75, 12, 4.0625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [13.75, 3.75, 14.5, 4.0625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [12.75, 3.75, 13.75, 4.0625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [12.75, 3.75, 12, 2.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [13.5, 2.75, 12.75, 3.75], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [0, -10, 0],\\r\n\t\t\t\"to\": [16, 6, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 24]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [8, 2.875, 9, 3.875], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [7, 2.875, 8, 3.875], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [10, 2.875, 11, 3.875], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [9, 2.875, 10, 3.875], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [9, 2.875, 8, 1.875], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [10, 1.875, 9, 2.875], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [11, 6, 6],\\r\n\t\t\t\"to\": [13, 10, 12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 30]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [0.5, 0.375, 0.375, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0.875, 0.375, 0.5, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [1, 0.375, 0.875, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [0.375, 0.375, 0, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [0.375, 0.375, 0.5, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [0.5, 0, 0.625, 0.375], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [11, -1, -16],\\r\n\t\t\t\"to\": [13, 1, -12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [7.375, 0.25, 7.25, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [7.625, 0.25, 7.375, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [7.75, 0.25, 7.625, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [7.25, 0.25, 7, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [7.25, 0.25, 7.375, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [7.375, 0, 7.5, 0.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [3, 6, 6],\\r\n\t\t\t\"to\": [5, 10, 12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 30]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [0.375, 0.375, 0.5, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 0.375, 0.375, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [0.875, 0.375, 1, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [0.5, 0.375, 0.875, 0.625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [0.5, 0.375, 0.375, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [0.625, 0, 0.5, 0.375], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [3, -1, -16],\\r\n\t\t\t\"to\": [5, 1, -12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -9, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [7.25, 0.25, 7.375, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [7, 0.25, 7.25, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [7.625, 0.25, 7.75, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [7.375, 0.25, 7.625, 0.375], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [7.375, 0.25, 7.25, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [7.5, 0, 7.375, 0.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"jaw\",\\r\n\t\t\t\"from\": [2, -10, -16],\\r\n\t\t\t\"to\": [14, -6, 0],\\r\n\t\t\t\"rotation\": {\"angle\": -22.5, \"axis\": \"x\", \"origin\": [8, -6, 0]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [12, 5.0625, 12.75, 5.3125], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [11, 5.0625, 12, 5.3125], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [13.75, 5.0625, 14.5, 5.3125], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [12.75, 5.0625, 13.75, 5.3125], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [12.75, 5.0625, 12, 4.0625], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [13.5, 4.0625, 12.75, 5.0625], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t],\\r\n\t\"groups\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"origin\": [8, 7, -50],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [\\r\n\t\t\t\t0,\\r\n\t\t\t\t1,\\r\n\t\t\t\t2,\\r\n\t\t\t\t3,\\r\n\t\t\t\t4,\\r\n\t\t\t\t5,\\r\n\t\t\t\t{\\r\n\t\t\t\t\t\"name\": \"jaw\",\\r\n\t\t\t\t\t\"origin\": [8, 3, -63],\\r\n\t\t\t\t\t\"color\": 0,\\r\n\t\t\t\t\t\"children\": [6]\\r\n\t\t\t\t}\\r\n\t\t\t]\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/ender_chest.json\":`{\\r\n\t\"parent\": \"minecraft:block/ender_chest\"\\r\n}\\r\n`,\"assets/minecraft/models/item/gray_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/gray_shulker_box.json\":`{\\r\n\t\"parent\": \"block/gray_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/green_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/green_shulker_box.json\":`{\\r\n\t\"parent\": \"block/green_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/light_blue_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/light_blue_shulker_box.json\":`{\\r\n\t\"parent\": \"block/light_blue_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/light_gray_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/light_gray_shulker_box.json\":`{\\r\n\t\"parent\": \"block/light_gray_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/lime_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/lime_shulker_box.json\":`{\\r\n\t\"parent\": \"block/lime_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/magenta_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/magenta_shulker_box.json\":`{\\r\n\t\"parent\": \"block/magenta_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/mob_skull.json\":`{\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [4, 0, 4],\\r\n\t\t\t\"to\": [12, 8, 12],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [2, 4, 4, 8], \"texture\": \"#skull\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 4, 2, 8], \"texture\": \"#skull\" },\\r\n\t\t\t\t\"south\": { \"uv\": [6, 4, 8, 8], \"texture\": \"#skull\" },\\r\n\t\t\t\t\"west\": { \"uv\": [4, 4, 6, 8], \"texture\": \"#skull\" },\\r\n\t\t\t\t\"up\": { \"uv\": [4, 4, 2, 0], \"texture\": \"#skull\" },\\r\n\t\t\t\t\"down\": { \"uv\": [6, 0, 4, 4], \"texture\": \"#skull\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/orange_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/orange_shulker_box.json\":`{\\r\n\t\"parent\": \"block/orange_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/piglin_head.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/piglin/piglin\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"rightear\",\\r\n\t\t\t\"from\": [12.5, -7, 6],\\r\n\t\t\t\"to\": [13.5, -2, 10],\\r\n\t\t\t\"rotation\": {\"angle\": 45, \"axis\": \"z\", \"origin\": [13, -2, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [10.75, 2.5, 11, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [9.75, 2.5, 10.75, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [12, 2.5, 12.25, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [11, 2.5, 12, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [11, 2.5, 10.75, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [11.25, 1.5, 11, 2.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"leftear\",\\r\n\t\t\t\"from\": [2.5, -7, 6],\\r\n\t\t\t\"to\": [3.5, -2, 10],\\r\n\t\t\t\"rotation\": {\"angle\": -45, \"axis\": \"z\", \"origin\": [3, -2, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [13.75, 2.5, 14, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [12.75, 2.5, 13.75, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [15, 2.5, 15.25, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [14, 2.5, 15, 3.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [14, 2.5, 13.75, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14.25, 1.5, 14, 2.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [10, -8, 3],\\r\n\t\t\t\"to\": [11, -6, 4],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [0.75, 0.25, 1, 0.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0.5, 0.25, 0.75, 0.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [1.25, 0.25, 1.5, 0.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [1, 0.25, 1.25, 0.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [1, 0.25, 0.75, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [1.25, 0, 1, 0.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [5, -8, 3],\\r\n\t\t\t\"to\": [6, -6, 4],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [0.75, 1.25, 1, 1.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0.5, 1.25, 0.75, 1.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [1.25, 1.25, 1.5, 1.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [1, 1.25, 1.25, 1.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [1, 1.25, 0.75, 1], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [1.25, 1, 1, 1.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [6, -8, 3],\\r\n\t\t\t\"to\": [10, -4, 4],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [8, 0.5, 9, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [7.75, 0.5, 8, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [9.25, 0.5, 10.25, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [9, 0.5, 9.25, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [9, 0.5, 8, 0.25], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [10, 0.25, 9, 0.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"head\",\\r\n\t\t\t\"from\": [3.02, -7.98, 4.02],\\r\n\t\t\t\"to\": [12.98, -0.02, 11.98],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2, 2, 4.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 2, 2, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [6.5, 2, 9, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [4.5, 2, 6.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [4.5, 2, 2, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [7, 0, 4.5, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/pink_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/pink_shulker_box.json\":`{\\r\n\t\"parent\": \"block/pink_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/player_head.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"animated_java:steve\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"Hat Layer\",\\r\n\t\t\t\"from\": [3.5, -8.5, 3.5],\\r\n\t\t\t\"to\": [12.5, 0.5, 12.5],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -31.5, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [10, 2, 12, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [8, 2, 10, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14, 2, 16, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [12, 2, 14, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [12, 2, 10, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14, 0, 12, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"Head\",\\r\n\t\t\t\"from\": [4, -8, 4],\\r\n\t\t\t\"to\": [12, 0, 12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2, 2, 4, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 2, 2, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [6, 2, 8, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [4, 2, 6, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [4, 2, 2, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [6, 0, 4, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/purple_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/purple_shulker_box.json\":`{\\r\n\t\"parent\": \"block/purple_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/red_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/red_shulker_box.json\":`{\\r\n\t\"parent\": \"block/red_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/shield.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/shield_base\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"shield\",\\r\n\t\t\t\"from\": [16, -11, 13],\\r\n\t\t\t\"to\": [18, -5, 19],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [18, -36, 13]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [8, 1.5, 8.5, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [6.5, 1.5, 8, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [10, 1.5, 10.5, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [8.5, 1.5, 10, 3], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [8.5, 1.5, 8, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [9, 0, 8.5, 1.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"shield\",\\r\n\t\t\t\"from\": [11, -19, 12],\\r\n\t\t\t\"to\": [23, 3, 13],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [18, -29, 13]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [0.25, 0.25, 3.25, 5.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 0.25, 0.25, 5.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [3.5, 0.25, 6.5, 5.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [3.25, 0.25, 3.5, 5.75], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [3.25, 0.25, 0.25, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [6.25, 0, 3.25, 0.25], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t],\\r\n\t\"groups\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"shield\",\\r\n\t\t\t\"origin\": [7, 15.5, 11],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [0, 1]\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/shulker_box.json\":`{\\r\n\t\"parent\": \"block/shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/skeleton_skull.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 32],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"minecraft:entity/skeleton/skeleton\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"Hat Layer\",\\r\n\t\t\t\"from\": [3.5, -8.5, 3.5],\\r\n\t\t\t\"to\": [12.5, 0.5, 12.5],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, -31.5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10, 4, 12, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [8, 4, 10, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [14, 4, 16, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [12, 4, 14, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [12, 4, 10, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [14, 0, 12, 4], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"Head\",\\r\n\t\t\t\"from\": [4, -8, 4],\\r\n\t\t\t\"to\": [12, 0, 12],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [2, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 4, 2, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [6, 4, 8, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [4, 4, 6, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [4, 4, 2, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [6, 0, 4, 4], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/template_banner.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/banner_base\",\\r\n\t\t\"tint\": \"entity/banner_base\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"stand\",\\r\n\t\t\t\"from\": [-2, 30, 7],\\r\n\t\t\t\"to\": [18, 32, 9],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 0, 7] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0.5, 11, 5.5, 11.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 11, 0.5, 11.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [6, 11, 11, 11.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [5.5, 11, 6, 11.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [5.5, 11, 0.5, 10.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [10.5, 10.5, 5.5, 11], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"stand\",\\r\n\t\t\t\"from\": [7, -12, 7],\\r\n\t\t\t\"to\": [9, 30, 9],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, -2, 7] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [11.5, 0.5, 12, 11], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [11, 0.5, 11.5, 11], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [12.5, 0.5, 13, 11], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [12, 0.5, 12.5, 11], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [12, 0.5, 11.5, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [12.5, 0, 12, 0.5], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"banner\",\\r\n\t\t\t\"from\": [-2, -8, 6],\\r\n\t\t\t\"to\": [18, 32, 7],\\r\n\t\t\t\"rotation\": { \"angle\": 0.5, \"axis\": \"x\", \"origin\": [8, 32, 7] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0.25, 0.25, 5.25, 10.25], \"texture\": \"#tint\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 0.25, 0.25, 10.25], \"texture\": \"#tint\" },\\r\n\t\t\t\t\"south\": { \"uv\": [5.5, 0.25, 10.5, 10.25], \"texture\": \"#tint\" },\\r\n\t\t\t\t\"west\": { \"uv\": [5.25, 0.25, 5.5, 10.25], \"texture\": \"#tint\" },\\r\n\t\t\t\t\"up\": { \"uv\": [5.25, 0.25, 0.25, 0], \"texture\": \"#tint\" },\\r\n\t\t\t\t\"down\": { \"uv\": [10.25, 0, 5.25, 0.25], \"texture\": \"#tint\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t],\\r\n\t\"display\": {\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 90, 0],\\r\n\t\t\t\"translation\": [0, 2, 0.5],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 90, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"translation\": [0, 1, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 20, 0],\\r\n\t\t\t\"translation\": [0, -3.25, 0],\\r\n\t\t\t\"scale\": [0.5325, 0.5325, 0.5325]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 16, 7],\\r\n\t\t\t\"scale\": [1.5, 1.5, 1.5]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t}\\r\n\t},\\r\n\t\"groups\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"stand\",\\r\n\t\t\t\"origin\": [8, 0, 8],\\r\n\t\t\t\"color\": 0,\\r\n\t\t\t\"children\": [\\r\n\t\t\t\t0,\\r\n\t\t\t\t1,\\r\n\t\t\t\t{\\r\n\t\t\t\t\t\"name\": \"banner\",\\r\n\t\t\t\t\t\"origin\": [8, 44, 8],\\r\n\t\t\t\t\t\"color\": 0,\\r\n\t\t\t\t\t\"children\": [2]\\r\n\t\t\t\t}\\r\n\t\t\t]\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/template_chest.json\":`{\\r\n\t\"parent\": \"block/block\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/chest/normal\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 9, 1],\\r\n\t\t\t\"to\": [15, 14, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 11.5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10.5, 3.5, 14, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 3.5, 3.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [3.5, 3.5, 7, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [7, 3.5, 10.5, 4.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 0, 10.5, 3.5], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 0, 7, 3.5], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [7, 8, 0],\\r\n\t\t\t\"to\": [9, 12, 1],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 10, 0.5] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [0.5, 1.25, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0.25, 1.25, 0.5, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [0.5, 1.25, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [1, 1.25, 1.25, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [0.5, 0, 1, 0.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [0.5, 0, 1, 0.25], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [1, 0, 1],\\r\n\t\t\t\"to\": [15, 10, 15],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, 5, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10.5, 8.25, 14, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [7, 8.25, 10.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [3.5, 8.25, 7, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [0, 8.25, 3.5, 10.75], \"rotation\": 180, \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [7, 4.75, 10.5, 8.25], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [3.5, 4.75, 7, 8.25], \"rotation\": 180, \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/trident.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/trident\",\\r\n\t\t\"particle\": \"entity/trident\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"from\": [15, -34, 15],\\r\n\t\t\t\"to\": [16, -3, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [15, -18, 15]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [1.5, 0.5, 2, 16], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [1, 0.5, 1.5, 16], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [0.5, 0.5, 1, 16], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [0, 0.5, 0.5, 16], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [0.5, 0, 1, 0.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [1, 0, 1.5, 0.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [14, -9, 15],\\r\n\t\t\t\"to\": [17, -7, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [14, -18, 15]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2.5, 0.5, 4, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [2, 0.5, 2.5, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [2.5, 0.5, 4, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [3, 0.5, 3.5, 1.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [2.5, 0, 4, 0.5], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [4, 0, 5.5, 0.5], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [13, -8, 15],\\r\n\t\t\t\"to\": [14, -4, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [13, -17, 15]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2.5, 2, 3, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [2, 2, 2.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [3.5, 2, 4, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [3, 2, 3.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [2.5, 1.5, 3, 2], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [3, 1.5, 3.5, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"from\": [17, -8, 15],\\r\n\t\t\t\"to\": [18, -4, 16],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [17, -17, 15]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2.5, 2, 3, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [2, 2, 2.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [3.5, 2, 4, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [3, 2, 3.5, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [2.5, 1.5, 3, 2], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [3, 1.5, 3.5, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}`,\"assets/minecraft/models/item/white_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/white_shulker_box.json\":`{\\r\n\t\"parent\": \"block/white_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/wither_skeleton_skull.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 32],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/skeleton/wither_skeleton\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"Hat Layer\",\\r\n\t\t\t\"from\": [3.5, -1, 3.5],\\r\n\t\t\t\"to\": [12.5, 8, 12.5],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, -24, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [10, 4, 12, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [8, 4, 10, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [14, 4, 16, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [12, 4, 14, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [12, 4, 10, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [14, 0, 12, 4], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"Head\",\\r\n\t\t\t\"from\": [4, 0, 4],\\r\n\t\t\t\"to\": [12, 8, 12],\\r\n\t\t\t\"rotation\": { \"angle\": 0, \"axis\": \"y\", \"origin\": [8, -24, 8] },\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": { \"uv\": [2, 4, 4, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"east\": { \"uv\": [0, 4, 2, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"south\": { \"uv\": [6, 4, 8, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"west\": { \"uv\": [4, 4, 6, 8], \"texture\": \"#0\" },\\r\n\t\t\t\t\"up\": { \"uv\": [4, 4, 2, 0], \"texture\": \"#0\" },\\r\n\t\t\t\t\"down\": { \"uv\": [6, 0, 4, 4], \"texture\": \"#0\" }\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}\\r\n`,\"assets/minecraft/models/item/yellow_banner.json\":`{\\r\n\t\"parent\": \"item/template_banner\"\\r\n}\\r\n`,\"assets/minecraft/models/item/yellow_shulker_box.json\":`{\\r\n\t\"parent\": \"block/yellow_shulker_box\",\\r\n\t\"display\": {\\r\n\t\t\"gui\": {\\r\n\t\t\t\"rotation\": [30, 45, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.625, 0.625, 0.625]\\r\n\t\t},\\r\n\t\t\"ground\": {\\r\n\t\t\t\"rotation\": [0, 0, 0],\\r\n\t\t\t\"translation\": [0, 3, 0],\\r\n\t\t\t\"scale\": [0.25, 0.25, 0.25]\\r\n\t\t},\\r\n\t\t\"head\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [1, 1, 1]\\r\n\t\t},\\r\n\t\t\"fixed\": {\\r\n\t\t\t\"rotation\": [0, 180, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.5, 0.5, 0.5]\\r\n\t\t},\\r\n\t\t\"thirdperson_righthand\": {\\r\n\t\t\t\"rotation\": [75, 315, 0],\\r\n\t\t\t\"translation\": [0, 2.5, 0],\\r\n\t\t\t\"scale\": [0.375, 0.375, 0.375]\\r\n\t\t},\\r\n\t\t\"firstperson_righthand\": {\\r\n\t\t\t\"rotation\": [0, 315, 0],\\r\n\t\t\t\"translation\": [0, 0, 0],\\r\n\t\t\t\"scale\": [0.4, 0.4, 0.4]\\r\n\t\t}\\r\n\t}\\r\n}\\r\n`,\"assets/minecraft/models/item/zombie_head.json\":`{\\r\n\t\"credit\": \"Made with Blockbench\",\\r\n\t\"texture_size\": [64, 64],\\r\n\t\"textures\": {\\r\n\t\t\"0\": \"entity/zombie/zombie\"\\r\n\t},\\r\n\t\"elements\": [\\r\n\t\t{\\r\n\t\t\t\"name\": \"Hat Layer\",\\r\n\t\t\t\"from\": [3.5, -8.5, 3.5],\\r\n\t\t\t\"to\": [12.5, 0.5, 12.5],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -31.5, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [10, 2, 12, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [8, 2, 10, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [14, 2, 16, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [12, 2, 14, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [12, 2, 10, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [14, 0, 12, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t},\\r\n\t\t{\\r\n\t\t\t\"name\": \"Head\",\\r\n\t\t\t\"from\": [4, -8, 4],\\r\n\t\t\t\"to\": [12, 0, 12],\\r\n\t\t\t\"rotation\": {\"angle\": 0, \"axis\": \"y\", \"origin\": [8, -32, 8]},\\r\n\t\t\t\"faces\": {\\r\n\t\t\t\t\"north\": {\"uv\": [2, 2, 4, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"east\": {\"uv\": [0, 2, 2, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"south\": {\"uv\": [6, 2, 8, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"west\": {\"uv\": [4, 2, 6, 4], \"texture\": \"#0\"},\\r\n\t\t\t\t\"up\": {\"uv\": [4, 2, 2, 0], \"texture\": \"#0\"},\\r\n\t\t\t\t\"down\": {\"uv\": [6, 0, 4, 2], \"texture\": \"#0\"}\\r\n\t\t\t}\\r\n\t\t}\\r\n\t]\\r\n}`};var nc=[];function aj(t,e=ie){let n,i=new Set;function a(l){if(De(t,l)&&(t=l,n)){let c=!nc.length;for(let d of i)d[1](),nc.push(d,t);if(c){for(let d=0;d<nc.length;d+=2)nc[d][0](nc[d+1]);nc.length=0}}}s(a,\"set\");function r(l){a(l(t))}s(r,\"update\");function o(l,c=ie){let d=[l,c];return i.add(d),i.size===1&&(n=e(a)||ie),l(t),()=>{i.delete(d),i.size===0&&n&&(n(),n=null)}}return s(o,\"subscribe\"),{set:a,update:r,subscribe:o}}s(aj,\"writable\");var J0=class{store;valueValidator;constructor(e,n){this.store=aj(e),this.valueValidator=n??(i=>i),J0.all.push(this)}get(){return this.valueValidator(Ng(this.store))}set(e){return this.store.set(this.valueValidator(e))}update(e){return this.store.update(n=>this.valueValidator(e(n)))}subscribe(e,n){return this.store.subscribe(e,n)}},ke=J0;s(ke,\"Valuable\"),lt(ke,\"all\",[]);var Vm=\"data:image/webp;base64,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\";function che(t){let e,n,i,a,r,o,l,c=(t[6]!==\"\"||t[7]!==0)&&rj(t);return{c(){e=L(\"div\"),n=L(\"div\"),n.textContent=`${A(\"popup.loading.loading\")}`,i=J(),a=L(\"img\"),o=J(),c&&c.c(),l=_t(),E(n,\"class\",\"text svelte-biysx8\"),Ht(a.src,r=Vm)||E(a,\"src\",r),E(a,\"alt\",\"Running Armor Stand\"),E(a,\"class\",\"svelte-biysx8\"),Xe(e,\"display\",\"flex\"),Xe(e,\"flex-direction\",\"row\")},m(d,u){U(d,e,u),I(e,n),I(e,i),I(e,a),U(d,o,u),c&&c.m(d,u),U(d,l,u)},p(d,u){d[6]!==\"\"||d[7]!==0?c?c.p(d,u):(c=rj(d),c.c(),c.m(l.parentNode,l)):c&&(c.d(1),c=null)},d(d){d&&z(e),d&&z(o),c&&c.d(d),d&&z(l)}}}s(che,\"create_else_block\");function uhe(t){let e;return{c(){e=L(\"div\"),e.textContent=`${A(\"popup.loading.success\")}`},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(uhe,\"create_if_block_1\");function dhe(t){let e,n=A(\"popup.loading.offline\").split(`\n`).map(mhe).join(\"\")+\"\";return{c(){e=L(\"div\"),Xe(e,\"display\",\"flex\"),Xe(e,\"flex-direction\",\"column\")},m(i,a){U(i,e,a),e.innerHTML=n},p:ie,d(i){i&&z(e)}}}s(dhe,\"create_if_block\");function rj(t){let e,n,i,a;return{c(){e=L(\"div\"),n=Re(t[6]),i=J(),a=L(\"progress\"),a.value=t[7],E(a,\"max\",\"100\"),E(a,\"class\",\"svelte-biysx8\")},m(r,o){U(r,e,o),I(e,n),U(r,i,o),U(r,a,o)},p(r,o){o&64&&ct(n,r[6]),o&128&&(a.value=r[7])},d(r){r&&z(e),r&&z(i),r&&z(a)}}}s(rj,\"create_if_block_2\");function phe(t){let e,n;function i(o,l){return o[4]?dhe:o[5]?uhe:che}s(i,\"select_block_type\");let a=i(t,-1),r=a(t);return{c(){e=L(\"div\"),r.c(),E(e,\"class\",n=Xi(`floating ${t[4]?\"red-border\":\"blue-border\"}`)+\" svelte-biysx8\")},m(o,l){U(o,e,l),r.m(e,null)},p(o,[l]){a===(a=i(o,l))&&r?r.p(o,l):(r.d(1),r=a(o),r&&(r.c(),r.m(e,null))),l&16&&n!==(n=Xi(`floating ${o[4]?\"red-border\":\"blue-border\"}`)+\" svelte-biysx8\")&&E(e,\"class\",n)},i:ie,o:ie,d(o){o&&z(e),r.d()}}}s(phe,\"create_fragment\");var mhe=s(t=>\"<p>\"+t+\"</p>\",\"func\");function fhe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(_,b=>n(4,i=b)),_),\"$$subscribe_offline\"),o,l=ie,c=s(()=>(l(),l=rt(x,b=>n(5,o=b)),x),\"$$subscribe_loaded\"),d,u=ie,p=s(()=>(u(),u=rt(v,b=>n(6,d=b)),v),\"$$subscribe_progressLabel\"),m,f=ie,g=s(()=>(f(),f=rt(h,b=>n(7,m=b)),h),\"$$subscribe_progress\");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u()),t.$$.on_destroy.push(()=>f());let{loaded:x}=e;c();let{offline:_}=e;r();let{progress:h}=e;g();let{progressLabel:v}=e;return p(),t.$$set=b=>{\"loaded\"in b&&c(n(0,x=b.loaded)),\"offline\"in b&&r(n(1,_=b.offline)),\"progress\"in b&&g(n(2,h=b.progress)),\"progressLabel\"in b&&p(n(3,v=b.progressLabel))},[x,_,h,v,i,o,d,m]}s(fhe,\"instance\");var zm=class extends Pe{constructor(e){super(),Ve(this,e,fhe,phe,De,{loaded:0,offline:1,progress:2,progressLabel:3})}};s(zm,\"AnimatedJavaLoadingPopup\");var oj=zm;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".floating.svelte-biysx8{position:absolute;bottom:2rem;right:2rem;background:var(--color-ui);padding:8px 16px;display:flex;align-items:center;flex-direction:column}.blue-border.svelte-biysx8{border:1px solid var(--color-accent)}.red-border.svelte-biysx8{border:1px solid var(--color-error)}.text.svelte-biysx8{margin-right:16px}img.svelte-biysx8{width:32px;height:32px;margin:-4px -10px}progress.svelte-biysx8{width:100%}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var sj=new ke(!1),lj=new ke(!1),cj=new ke(0),uj=new ke(\"\"),kr;function dj(){kr||(kr=Gn({component:oj,props:{loaded:sj,offline:lj,progress:cj,progressLabel:uj},target:document.body}))}s(dj,\"showLoadingPopup\");function pj(){kr&&(sj.set(!0),setTimeout(()=>{kr&&(kr.$destroy(),kr=void 0)},2e3))}s(pj,\"hideLoadingPopup\");function G0(){kr&&(lj.set(!0),setTimeout(()=>{kr&&(kr.$destroy(),kr=void 0)},1e4))}s(G0,\"showOfflineError\");function mj(t){cj.set(t)}s(mj,\"updateLoadingProgress\");function fj(t){uj.set(t)}s(fj,\"updateLoadingProgressLabel\");function hj(t){var e=t.slice(0,2);return e.length===2&&e[0]===31&&e[1]===139}s(hj,\"hasGzipHeader\");function gj(t){let e=t.slice(0,2);return e.length===2&&e[0]===120&&(e[1]===1||e[1]===94||e[1]===156||e[2]===218)}s(gj,\"hasZlibHeader\");function _j(t){let e=t.slice(0,8),n=new DataView(e.buffer,e.byteOffset),i=n.getUint32(0,!0),a=n.getUint32(4,!0);if(e.length===8&&i>0&&i<100&&a===t.byteLength-8)return i}s(_j,\"getBedrockHeader\");function xj(t){var e=[],n,i;for(n=0;n<t.length;n++)i=t.charCodeAt(n),i<128?e.push(i):i<2048?(e.push(192|i>>6),e.push(128|i&63)):i<65536?(e.push(224|i>>12),e.push(128|i>>6&63),e.push(128|i&63)):(e.push(240|i>>18&7),e.push(128|i>>12&63),e.push(128|i>>6&63),e.push(128|i&63));return e}s(xj,\"encodeUTF8\");function vj(t){var e=[],n;for(n=0;n<t.length;n++)t[n]&128?n+1<t.length&&(t[n]&224)===192&&(t[n+1]&192)===128?e.push((t[n]&31)<<6|t[n+1]&63):n+2<t.length&&(t[n]&240)===224&&(t[n+1]&192)===128&&(t[n+2]&192)===128?e.push((t[n]&15)<<12|(t[n+1]&63)<<6|t[n+2]&63):n+3<t.length&&(t[n]&248)===240&&(t[n+1]&192)===128&&(t[n+2]&192)===128&&(t[n+3]&192)===128&&e.push((t[n]&7)<<18|(t[n+1]&63)<<12|(t[n+2]&63)<<6|t[n+3]&63):e.push(t[n]&127);return String.fromCharCode.apply(null,e)}s(vj,\"decodeUTF8\");var Wu=class{littleEndian;offset;array;view;constructor(e,n){this.littleEndian=n?.littleEndian??!1,this.offset=n?.offset??0,this.array=e instanceof Uint8Array?e:new Uint8Array(e),this.view=new DataView(this.array.buffer,this.array.byteOffset)}readNumber(e,n){let i=this.view[e](this.offset,this.littleEndian);return this.offset+=n,i}readByte=this.readNumber.bind(this,\"getInt8\",1);readShort=this.readNumber.bind(this,\"getInt16\",2);readInt=this.readNumber.bind(this,\"getInt32\",4);readFloat=this.readNumber.bind(this,\"getFloat32\",4);readDouble=this.readNumber.bind(this,\"getFloat64\",8);readBytes(e){let n=this.array.slice(this.offset,this.offset+e);return this.offset+=e,n}readString(){let e=this.readShort(),n=this.readBytes(e);return vj(n)}};s(Wu,\"RawDataInput\");var Ku=class{littleEndian;offset;buffer;array;view;constructor(e){this.littleEndian=e?.littleEndian??!1,this.offset=e?.offset??0,this.buffer=new ArrayBuffer(e?.initialSize??1024),this.array=new Uint8Array(this.buffer),this.view=new DataView(this.buffer)}accommodate(e){let n=this.offset+e;if(this.buffer.byteLength>=n)return;let i=this.buffer.byteLength;for(;i<n;)i*=2;let a=new ArrayBuffer(i),r=new Uint8Array(a);r.set(this.array),this.offset>this.buffer.byteLength&&r.fill(0,this.buffer.byteLength,this.offset),this.buffer=a,this.view=new DataView(a),this.array=r}writeNumber(e,n,i){this.accommodate(n),this.view[e](this.offset,i,this.littleEndian),this.offset+=n}writeByte=this.writeNumber.bind(this,\"setInt8\",1);writeShort=this.writeNumber.bind(this,\"setInt16\",2);writeInt=this.writeNumber.bind(this,\"setInt32\",4);writeFloat=this.writeNumber.bind(this,\"setFloat32\",4);writeDouble=this.writeNumber.bind(this,\"setFloat64\",8);writeBytes(e){this.accommodate(e.length),this.array.set(e,this.offset),this.offset+=e.length}writeString(e){let n=xj(e);this.writeShort(n.length),this.writeBytes(n)}getData(){return this.accommodate(0),this.array.slice(0,this.offset)}};s(Ku,\"RawDataOutput\");var ut;(function(t){function e(p){return typeof p==\"number\"?p:void 0}s(e,\"readNumber\"),t.readNumber=e;function n(p){return typeof p==\"number\"?Math.floor(p):void 0}s(n,\"readInt\"),t.readInt=n;function i(p){return typeof p==\"string\"?p:void 0}s(i,\"readString\"),t.readString=i;function a(p){return typeof p==\"boolean\"?p:void 0}s(a,\"readBoolean\"),t.readBoolean=a;function r(p){return typeof p==\"object\"&&p!==null&&!Array.isArray(p)?p:void 0}s(r,\"readObject\"),t.readObject=r;function o(p,m){if(Array.isArray(p))return m?p.map(f=>m(f)):p}s(o,\"readArray\"),t.readArray=o;function l(p,m){if(Array.isArray(p))return[0,1].map(f=>m(p[f]))}s(l,\"readPair\"),t.readPair=l;function c(p,m){let f=r(p)??{};return Object.fromEntries(Object.entries(f).map(([g,x])=>[g,m(x)]))}s(c,\"readMap\"),t.readMap=c;function d(p,m,f){let g=m(p);return g?f(g):void 0}s(d,\"compose\"),t.compose=d;function u(p,m){return typeof p!=\"string\"?m[0]:m.includes(p)?p:m[0]}s(u,\"readEnum\"),t.readEnum=u})(ut||(ut={}));var ci=class{source;cursor;constructor(e){this.source=e,this.cursor=0}get remainingLength(){return this.source.length-this.cursor}get totalLength(){return this.source.length}getRead(e=0){return this.source.substring(e,this.cursor)}getRemaining(){return this.source.substring(this.cursor)}canRead(e=1){return this.cursor+e<=this.source.length}peek(e=0){return this.source.charAt(this.cursor+e)}read(){return this.source.charAt(this.cursor++)}skip(){this.cursor+=1}skipWhitespace(){for(;this.canRead()&&ci.isWhitespace(this.peek());)this.skip()}expect(e,n=!1){if(n&&this.skipWhitespace(),!this.canRead()||this.peek()!==e)throw this.createError(`Expected '${e}'`);this.skip()}readInt(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInNumber(this.peek());)this.skip();let n=this.getRead(e);if(n.length===0)throw this.createError(\"Expected integer\");try{let i=Number(n);if(isNaN(i)||!Number.isInteger(i))throw new Error;return i}catch{throw this.cursor=e,this.createError(`Invalid integer '${n}'`)}}readFloat(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInNumber(this.peek());)this.skip();let n=this.getRead(e);if(n.length===0)throw this.createError(\"Expected float\");try{let i=Number(n);if(isNaN(i))throw new Error;return i}catch{throw this.cursor=e,this.createError(`Invalid float '${n}'`)}}readUnquotedString(){let e=this.cursor;for(;this.canRead()&&ci.isAllowedInUnquotedString(this.peek());)this.skip();return this.getRead(e)}readQuotedString(){if(!this.canRead())return\"\";let e=this.peek();if(!ci.isQuotedStringStart(e))throw this.createError(\"Expected quote to start a string\");return this.skip(),this.readStringUntil(e)}readString(){if(!this.canRead())return\"\";let e=this.peek();return ci.isQuotedStringStart(e)?(this.skip(),this.readStringUntil(e)):this.readUnquotedString()}readStringUntil(e){let n=[],i=!1;for(;this.canRead();){let a=this.read();if(i)if(a===e||a===\"\\\\\")n.push(a),i=!1;else throw this.cursor-=1,this.createError(`Invalid escape sequence '${a}' in quoted string`);else if(a===\"\\\\\")i=!0;else{if(a===e)return n.join(\"\");n.push(a)}}throw this.createError(\"Unclosed quoted string\")}readBoolean(){let e=this.cursor,n=this.readUnquotedString();if(n.length===0)throw this.createError(\"Expected bool\");if(n===\"true\")return!0;if(n===\"false\")return!1;throw this.cursor=e,this.createError(`Invalid bool, expected true or false but found '${n}'`)}static isAllowedInNumber(e){return e>=\"0\"&&e<=\"9\"||e===\".\"||e===\"-\"}static isAllowedInUnquotedString(e){return e>=\"0\"&&e<=\"9\"||e>=\"A\"&&e<=\"Z\"||e>=\"a\"&&e<=\"z\"||e===\"_\"||e===\"-\"||e===\".\"||e===\"+\"}static isQuotedStringStart(e){return e===\"'\"||e==='\"'}static isWhitespace(e){return e===\" \"||e===\"\t\"||e===`\n`||e===\"\\r\"}createError(e){let n=Math.min(this.source.length,this.cursor),i=(n>10?\"...\":\"\")+this.source.substring(Math.max(0,n-10),n);return new Error(`${e} at position ${this.cursor}: ${i}<--[HERE]`)}};s(ci,\"StringReader\");function lc(t){let e=t.length;for(;--e>=0;)t[e]=0}s(lc,\"zero$1\");var hhe=0,aA=1,ghe=2,_he=3,xhe=258,gx=29,cd=256,td=cd+1+gx,rc=30,_x=19,rA=2*td+1,Bs=15,W0=16,vhe=7,xx=256,oA=16,sA=17,lA=18,sx=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),Wm=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),bhe=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),cA=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),yhe=512,ho=new Array((td+2)*2);lc(ho);var Qu=new Array(rc*2);lc(Qu);var nd=new Array(yhe);lc(nd);var id=new Array(xhe-_he+1);lc(id);var vx=new Array(gx);lc(vx);var Km=new Array(rc);lc(Km);function K0(t,e,n,i,a){this.static_tree=t,this.extra_bits=e,this.extra_base=n,this.elems=i,this.max_length=a,this.has_stree=t&&t.length}s(K0,\"StaticTreeDesc\");var uA,dA,pA;function Y0(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}s(Y0,\"TreeDesc\");var mA=s(t=>t<256?nd[t]:nd[256+(t>>>7)],\"d_code\"),ad=s((t,e)=>{t.pending_buf[t.pending++]=e&255,t.pending_buf[t.pending++]=e>>>8&255},\"put_short\"),Ri=s((t,e,n)=>{t.bi_valid>W0-n?(t.bi_buf|=e<<t.bi_valid&65535,ad(t,t.bi_buf),t.bi_buf=e>>W0-t.bi_valid,t.bi_valid+=n-W0):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=n)},\"send_bits\"),Ar=s((t,e,n)=>{Ri(t,n[e*2],n[e*2+1])},\"send_code\"),fA=s((t,e)=>{let n=0;do n|=t&1,t>>>=1,n<<=1;while(--e>0);return n>>>1},\"bi_reverse\"),whe=s(t=>{t.bi_valid===16?(ad(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=t.bi_buf&255,t.bi_buf>>=8,t.bi_valid-=8)},\"bi_flush\"),Ehe=s((t,e)=>{let n=e.dyn_tree,i=e.max_code,a=e.stat_desc.static_tree,r=e.stat_desc.has_stree,o=e.stat_desc.extra_bits,l=e.stat_desc.extra_base,c=e.stat_desc.max_length,d,u,p,m,f,g,x=0;for(m=0;m<=Bs;m++)t.bl_count[m]=0;for(n[t.heap[t.heap_max]*2+1]=0,d=t.heap_max+1;d<rA;d++)u=t.heap[d],m=n[n[u*2+1]*2+1]+1,m>c&&(m=c,x++),n[u*2+1]=m,!(u>i)&&(t.bl_count[m]++,f=0,u>=l&&(f=o[u-l]),g=n[u*2],t.opt_len+=g*(m+f),r&&(t.static_len+=g*(a[u*2+1]+f)));if(x!==0){do{for(m=c-1;t.bl_count[m]===0;)m--;t.bl_count[m]--,t.bl_count[m+1]+=2,t.bl_count[c]--,x-=2}while(x>0);for(m=c;m!==0;m--)for(u=t.bl_count[m];u!==0;)p=t.heap[--d],!(p>i)&&(n[p*2+1]!==m&&(t.opt_len+=(m-n[p*2+1])*n[p*2],n[p*2+1]=m),u--)}},\"gen_bitlen\"),hA=s((t,e,n)=>{let i=new Array(Bs+1),a=0,r,o;for(r=1;r<=Bs;r++)a=a+n[r-1]<<1,i[r]=a;for(o=0;o<=e;o++){let l=t[o*2+1];l!==0&&(t[o*2]=fA(i[l]++,l))}},\"gen_codes\"),khe=s(()=>{let t,e,n,i,a,r=new Array(Bs+1);for(n=0,i=0;i<gx-1;i++)for(vx[i]=n,t=0;t<1<<sx[i];t++)id[n++]=i;for(id[n-1]=i,a=0,i=0;i<16;i++)for(Km[i]=a,t=0;t<1<<Wm[i];t++)nd[a++]=i;for(a>>=7;i<rc;i++)for(Km[i]=a<<7,t=0;t<1<<Wm[i]-7;t++)nd[256+a++]=i;for(e=0;e<=Bs;e++)r[e]=0;for(t=0;t<=143;)ho[t*2+1]=8,t++,r[8]++;for(;t<=255;)ho[t*2+1]=9,t++,r[9]++;for(;t<=279;)ho[t*2+1]=7,t++,r[7]++;for(;t<=287;)ho[t*2+1]=8,t++,r[8]++;for(hA(ho,td+1,r),t=0;t<rc;t++)Qu[t*2+1]=5,Qu[t*2]=fA(t,5);uA=new K0(ho,sx,cd+1,td,Bs),dA=new K0(Qu,Wm,0,rc,Bs),pA=new K0(new Array(0),bhe,0,_x,vhe)},\"tr_static_init\"),gA=s(t=>{let e;for(e=0;e<td;e++)t.dyn_ltree[e*2]=0;for(e=0;e<rc;e++)t.dyn_dtree[e*2]=0;for(e=0;e<_x;e++)t.bl_tree[e*2]=0;t.dyn_ltree[xx*2]=1,t.opt_len=t.static_len=0,t.sym_next=t.matches=0},\"init_block\"),_A=s(t=>{t.bi_valid>8?ad(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},\"bi_windup\"),bj=s((t,e,n,i)=>{let a=e*2,r=n*2;return t[a]<t[r]||t[a]===t[r]&&i[e]<=i[n]},\"smaller\"),X0=s((t,e,n)=>{let i=t.heap[n],a=n<<1;for(;a<=t.heap_len&&(a<t.heap_len&&bj(e,t.heap[a+1],t.heap[a],t.depth)&&a++,!bj(e,i,t.heap[a],t.depth));)t.heap[n]=t.heap[a],n=a,a<<=1;t.heap[n]=i},\"pqdownheap\"),yj=s((t,e,n)=>{let i,a,r=0,o,l;if(t.sym_next!==0)do i=t.pending_buf[t.sym_buf+r++]&255,i+=(t.pending_buf[t.sym_buf+r++]&255)<<8,a=t.pending_buf[t.sym_buf+r++],i===0?Ar(t,a,e):(o=id[a],Ar(t,o+cd+1,e),l=sx[o],l!==0&&(a-=vx[o],Ri(t,a,l)),i--,o=mA(i),Ar(t,o,n),l=Wm[o],l!==0&&(i-=Km[o],Ri(t,i,l)));while(r<t.sym_next);Ar(t,xx,e)},\"compress_block\"),lx=s((t,e)=>{let n=e.dyn_tree,i=e.stat_desc.static_tree,a=e.stat_desc.has_stree,r=e.stat_desc.elems,o,l,c=-1,d;for(t.heap_len=0,t.heap_max=rA,o=0;o<r;o++)n[o*2]!==0?(t.heap[++t.heap_len]=c=o,t.depth[o]=0):n[o*2+1]=0;for(;t.heap_len<2;)d=t.heap[++t.heap_len]=c<2?++c:0,n[d*2]=1,t.depth[d]=0,t.opt_len--,a&&(t.static_len-=i[d*2+1]);for(e.max_code=c,o=t.heap_len>>1;o>=1;o--)X0(t,n,o);d=r;do o=t.heap[1],t.heap[1]=t.heap[t.heap_len--],X0(t,n,1),l=t.heap[1],t.heap[--t.heap_max]=o,t.heap[--t.heap_max]=l,n[d*2]=n[o*2]+n[l*2],t.depth[d]=(t.depth[o]>=t.depth[l]?t.depth[o]:t.depth[l])+1,n[o*2+1]=n[l*2+1]=d,t.heap[1]=d++,X0(t,n,1);while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],Ehe(t,e),hA(n,c,t.bl_count)},\"build_tree\"),wj=s((t,e,n)=>{let i,a=-1,r,o=e[0*2+1],l=0,c=7,d=4;for(o===0&&(c=138,d=3),e[(n+1)*2+1]=65535,i=0;i<=n;i++)r=o,o=e[(i+1)*2+1],!(++l<c&&r===o)&&(l<d?t.bl_tree[r*2]+=l:r!==0?(r!==a&&t.bl_tree[r*2]++,t.bl_tree[oA*2]++):l<=10?t.bl_tree[sA*2]++:t.bl_tree[lA*2]++,l=0,a=r,o===0?(c=138,d=3):r===o?(c=6,d=3):(c=7,d=4))},\"scan_tree\"),Ej=s((t,e,n)=>{let i,a=-1,r,o=e[0*2+1],l=0,c=7,d=4;for(o===0&&(c=138,d=3),i=0;i<=n;i++)if(r=o,o=e[(i+1)*2+1],!(++l<c&&r===o)){if(l<d)do Ar(t,r,t.bl_tree);while(--l!==0);else r!==0?(r!==a&&(Ar(t,r,t.bl_tree),l--),Ar(t,oA,t.bl_tree),Ri(t,l-3,2)):l<=10?(Ar(t,sA,t.bl_tree),Ri(t,l-3,3)):(Ar(t,lA,t.bl_tree),Ri(t,l-11,7));l=0,a=r,o===0?(c=138,d=3):r===o?(c=6,d=3):(c=7,d=4)}},\"send_tree\"),jhe=s(t=>{let e;for(wj(t,t.dyn_ltree,t.l_desc.max_code),wj(t,t.dyn_dtree,t.d_desc.max_code),lx(t,t.bl_desc),e=_x-1;e>=3&&t.bl_tree[cA[e]*2+1]===0;e--);return t.opt_len+=3*(e+1)+5+5+4,e},\"build_bl_tree\"),Ahe=s((t,e,n,i)=>{let a;for(Ri(t,e-257,5),Ri(t,n-1,5),Ri(t,i-4,4),a=0;a<i;a++)Ri(t,t.bl_tree[cA[a]*2+1],3);Ej(t,t.dyn_ltree,e-1),Ej(t,t.dyn_dtree,n-1)},\"send_all_trees\"),The=s(t=>{let e=4093624447,n;for(n=0;n<=31;n++,e>>>=1)if(e&1&&t.dyn_ltree[n*2]!==0)return 0;if(t.dyn_ltree[9*2]!==0||t.dyn_ltree[10*2]!==0||t.dyn_ltree[13*2]!==0)return 1;for(n=32;n<cd;n++)if(t.dyn_ltree[n*2]!==0)return 1;return 0},\"detect_data_type\"),kj=!1,Che=s(t=>{kj||(khe(),kj=!0),t.l_desc=new Y0(t.dyn_ltree,uA),t.d_desc=new Y0(t.dyn_dtree,dA),t.bl_desc=new Y0(t.bl_tree,pA),t.bi_buf=0,t.bi_valid=0,gA(t)},\"_tr_init$1\"),xA=s((t,e,n,i)=>{Ri(t,(hhe<<1)+(i?1:0),3),_A(t),ad(t,n),ad(t,~n),n&&t.pending_buf.set(t.window.subarray(e,e+n),t.pending),t.pending+=n},\"_tr_stored_block$1\"),She=s(t=>{Ri(t,aA<<1,3),Ar(t,xx,ho),whe(t)},\"_tr_align$1\"),Ohe=s((t,e,n,i)=>{let a,r,o=0;t.level>0?(t.strm.data_type===2&&(t.strm.data_type=The(t)),lx(t,t.l_desc),lx(t,t.d_desc),o=jhe(t),a=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=a&&(a=r)):a=r=n+5,n+4<=a&&e!==-1?xA(t,e,n,i):t.strategy===4||r===a?(Ri(t,(aA<<1)+(i?1:0),3),yj(t,ho,Qu)):(Ri(t,(ghe<<1)+(i?1:0),3),Ahe(t,t.l_desc.max_code+1,t.d_desc.max_code+1,o+1),yj(t,t.dyn_ltree,t.dyn_dtree)),gA(t),i&&_A(t)},\"_tr_flush_block$1\"),Ihe=s((t,e,n)=>(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=n,e===0?t.dyn_ltree[n*2]++:(t.matches++,e--,t.dyn_ltree[(id[n]+cd+1)*2]++,t.dyn_dtree[mA(e)*2]++),t.sym_next===t.sym_end),\"_tr_tally$1\"),Dhe=Che,Fhe=xA,Nhe=Ohe,Rhe=Ihe,Mhe=She,Bhe={_tr_init:Dhe,_tr_stored_block:Fhe,_tr_flush_block:Nhe,_tr_tally:Rhe,_tr_align:Mhe},Phe=s((t,e,n,i)=>{let a=t&65535|0,r=t>>>16&65535|0,o=0;for(;n!==0;){o=n>2e3?2e3:n,n-=o;do a=a+e[i++]|0,r=r+a|0;while(--o);a%=65521,r%=65521}return a|r<<16|0},\"adler32\"),rd=Phe,Lhe=s(()=>{let t,e=[];for(var n=0;n<256;n++){t=n;for(var i=0;i<8;i++)t=t&1?3988292384^t>>>1:t>>>1;e[n]=t}return e},\"makeTable\"),Vhe=new Uint32Array(Lhe()),zhe=s((t,e,n,i)=>{let a=Vhe,r=i+n;t^=-1;for(let o=i;o<r;o++)t=t>>>8^a[(t^e[o])&255];return t^-1},\"crc32\"),Kn=zhe,Vs={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"},qs={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8},{_tr_init:Uhe,_tr_stored_block:cx,_tr_flush_block:qhe,_tr_tally:Ho,_tr_align:Hhe}=Bhe,{Z_NO_FLUSH:Jo,Z_PARTIAL_FLUSH:Jhe,Z_FULL_FLUSH:Ghe,Z_FINISH:fa,Z_BLOCK:jj,Z_OK:ui,Z_STREAM_END:Aj,Z_STREAM_ERROR:Tr,Z_DATA_ERROR:Whe,Z_BUF_ERROR:Z0,Z_DEFAULT_COMPRESSION:Khe,Z_FILTERED:Yhe,Z_HUFFMAN_ONLY:Um,Z_RLE:Xhe,Z_FIXED:Zhe,Z_DEFAULT_STRATEGY:Qhe,Z_UNKNOWN:$he,Z_DEFLATED:Zm}=qs,ege=9,tge=15,nge=8,ige=29,age=256,ux=age+1+ige,rge=30,oge=19,sge=2*ux+1,lge=15,It=3,qo=258,Cr=qo+It+1,cge=32,oc=42,bx=57,dx=69,px=73,mx=91,fx=103,Ps=113,Xu=666,ji=1,cc=2,zs=3,uc=4,uge=3,Ls=s((t,e)=>(t.msg=Vs[e],e),\"err\"),Tj=s(t=>t*2-(t>4?9:0),\"rank\"),Uo=s(t=>{let e=t.length;for(;--e>=0;)t[e]=0},\"zero\"),dge=s(t=>{let e,n,i,a=t.w_size;e=t.hash_size,i=e;do n=t.head[--i],t.head[i]=n>=a?n-a:0;while(--e);e=a,i=e;do n=t.prev[--i],t.prev[i]=n>=a?n-a:0;while(--e)},\"slide_hash\"),pge=s((t,e,n)=>(e<<t.hash_shift^n)&t.hash_mask,\"HASH_ZLIB\"),Go=pge,ta=s(t=>{let e=t.state,n=e.pending;n>t.avail_out&&(n=t.avail_out),n!==0&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+n),t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,e.pending===0&&(e.pending_out=0))},\"flush_pending\"),na=s((t,e)=>{qhe(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,ta(t.strm)},\"flush_block_only\"),Vt=s((t,e)=>{t.pending_buf[t.pending++]=e},\"put_byte\"),Yu=s((t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=e&255},\"putShortMSB\"),hx=s((t,e,n,i)=>{let a=t.avail_in;return a>i&&(a=i),a===0?0:(t.avail_in-=a,e.set(t.input.subarray(t.next_in,t.next_in+a),n),t.state.wrap===1?t.adler=rd(t.adler,e,a,n):t.state.wrap===2&&(t.adler=Kn(t.adler,e,a,n)),t.next_in+=a,t.total_in+=a,a)},\"read_buf\"),vA=s((t,e)=>{let n=t.max_chain_length,i=t.strstart,a,r,o=t.prev_length,l=t.nice_match,c=t.strstart>t.w_size-Cr?t.strstart-(t.w_size-Cr):0,d=t.window,u=t.w_mask,p=t.prev,m=t.strstart+qo,f=d[i+o-1],g=d[i+o];t.prev_length>=t.good_match&&(n>>=2),l>t.lookahead&&(l=t.lookahead);do if(a=e,!(d[a+o]!==g||d[a+o-1]!==f||d[a]!==d[i]||d[++a]!==d[i+1])){i+=2,a++;do;while(d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&d[++i]===d[++a]&&i<m);if(r=qo-(m-i),i=m-qo,r>o){if(t.match_start=e,o=r,r>=l)break;f=d[i+o-1],g=d[i+o]}}while((e=p[e&u])>c&&--n!==0);return o<=t.lookahead?o:t.lookahead},\"longest_match\"),sc=s(t=>{let e=t.w_size,n,i,a;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Cr)&&(t.window.set(t.window.subarray(e,e+e-i),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),dge(t),i+=e),t.strm.avail_in===0)break;if(n=hx(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=It)for(a=t.strstart-t.insert,t.ins_h=t.window[a],t.ins_h=Go(t,t.ins_h,t.window[a+1]);t.insert&&(t.ins_h=Go(t,t.ins_h,t.window[a+It-1]),t.prev[a&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=a,a++,t.insert--,!(t.lookahead+t.insert<It)););}while(t.lookahead<Cr&&t.strm.avail_in!==0)},\"fill_window\"),bA=s((t,e)=>{let n=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,i,a,r,o=0,l=t.strm.avail_in;do{if(i=65535,r=t.bi_valid+42>>3,t.strm.avail_out<r||(r=t.strm.avail_out-r,a=t.strstart-t.block_start,i>a+t.strm.avail_in&&(i=a+t.strm.avail_in),i>r&&(i=r),i<n&&(i===0&&e!==fa||e===Jo||i!==a+t.strm.avail_in)))break;o=e===fa&&i===a+t.strm.avail_in?1:0,cx(t,0,0,o),t.pending_buf[t.pending-4]=i,t.pending_buf[t.pending-3]=i>>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,ta(t.strm),a&&(a>i&&(a=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+a),t.strm.next_out),t.strm.next_out+=a,t.strm.avail_out-=a,t.strm.total_out+=a,t.block_start+=a,i-=a),i&&(hx(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(o===0);return l-=t.strm.avail_in,l&&(l>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=l&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-l,t.strm.next_in),t.strstart),t.strstart+=l,t.insert+=l>t.w_size-t.insert?t.w_size-t.insert:l),t.block_start=t.strstart),t.high_water<t.strstart&&(t.high_water=t.strstart),o?uc:e!==Jo&&e!==fa&&t.strm.avail_in===0&&t.strstart===t.block_start?cc:(r=t.window_size-t.strstart,t.strm.avail_in>r&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,r+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),r>t.strm.avail_in&&(r=t.strm.avail_in),r&&(hx(t.strm,t.window,t.strstart,r),t.strstart+=r,t.insert+=r>t.w_size-t.insert?t.w_size-t.insert:r),t.high_water<t.strstart&&(t.high_water=t.strstart),r=t.bi_valid+42>>3,r=t.pending_buf_size-r>65535?65535:t.pending_buf_size-r,n=r>t.w_size?t.w_size:r,a=t.strstart-t.block_start,(a>=n||(a||e===fa)&&e!==Jo&&t.strm.avail_in===0&&a<=r)&&(i=a>r?r:a,o=e===fa&&t.strm.avail_in===0&&i===a?1:0,cx(t,t.block_start,i,o),t.block_start+=i,ta(t.strm)),o?zs:ji)},\"deflate_stored\"),Q0=s((t,e)=>{let n,i;for(;;){if(t.lookahead<Cr){if(sc(t),t.lookahead<Cr&&e===Jo)return ji;if(t.lookahead===0)break}if(n=0,t.lookahead>=It&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),n!==0&&t.strstart-n<=t.w_size-Cr&&(t.match_length=vA(t,n)),t.match_length>=It)if(i=Ho(t,t.strstart-t.match_start,t.match_length-It),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=It){t.match_length--;do t.strstart++,t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart;while(--t.match_length!==0);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=Go(t,t.ins_h,t.window[t.strstart+1]);else i=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(i&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=t.strstart<It-1?t.strstart:It-1,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},\"deflate_fast\"),ic=s((t,e)=>{let n,i,a;for(;;){if(t.lookahead<Cr){if(sc(t),t.lookahead<Cr&&e===Jo)return ji;if(t.lookahead===0)break}if(n=0,t.lookahead>=It&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=It-1,n!==0&&t.prev_length<t.max_lazy_match&&t.strstart-n<=t.w_size-Cr&&(t.match_length=vA(t,n),t.match_length<=5&&(t.strategy===Yhe||t.match_length===It&&t.strstart-t.match_start>4096)&&(t.match_length=It-1)),t.prev_length>=It&&t.match_length<=t.prev_length){a=t.strstart+t.lookahead-It,i=Ho(t,t.strstart-1-t.prev_match,t.prev_length-It),t.lookahead-=t.prev_length-1,t.prev_length-=2;do++t.strstart<=a&&(t.ins_h=Go(t,t.ins_h,t.window[t.strstart+It-1]),n=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart);while(--t.prev_length!==0);if(t.match_available=0,t.match_length=It-1,t.strstart++,i&&(na(t,!1),t.strm.avail_out===0))return ji}else if(t.match_available){if(i=Ho(t,0,t.window[t.strstart-1]),i&&na(t,!1),t.strstart++,t.lookahead--,t.strm.avail_out===0)return ji}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(i=Ho(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<It-1?t.strstart:It-1,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},\"deflate_slow\"),mge=s((t,e)=>{let n,i,a,r,o=t.window;for(;;){if(t.lookahead<=qo){if(sc(t),t.lookahead<=qo&&e===Jo)return ji;if(t.lookahead===0)break}if(t.match_length=0,t.lookahead>=It&&t.strstart>0&&(a=t.strstart-1,i=o[a],i===o[++a]&&i===o[++a]&&i===o[++a])){r=t.strstart+qo;do;while(i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&i===o[++a]&&a<r);t.match_length=qo-(r-a),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=It?(n=Ho(t,1,t.match_length-It),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=0,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},\"deflate_rle\"),fge=s((t,e)=>{let n;for(;;){if(t.lookahead===0&&(sc(t),t.lookahead===0)){if(e===Jo)return ji;break}if(t.match_length=0,n=Ho(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&(na(t,!1),t.strm.avail_out===0))return ji}return t.insert=0,e===fa?(na(t,!0),t.strm.avail_out===0?zs:uc):t.sym_next&&(na(t,!1),t.strm.avail_out===0)?ji:cc},\"deflate_huff\");function jr(t,e,n,i,a){this.good_length=t,this.max_lazy=e,this.nice_length=n,this.max_chain=i,this.func=a}s(jr,\"Config\");var Zu=[new jr(0,0,0,0,bA),new jr(4,4,8,4,Q0),new jr(4,5,16,8,Q0),new jr(4,6,32,32,Q0),new jr(4,4,16,16,ic),new jr(8,16,32,32,ic),new jr(8,16,128,128,ic),new jr(8,32,128,256,ic),new jr(32,128,258,1024,ic),new jr(32,258,258,4096,ic)],hge=s(t=>{t.window_size=2*t.w_size,Uo(t.head),t.max_lazy_match=Zu[t.level].max_lazy,t.good_match=Zu[t.level].good_length,t.nice_match=Zu[t.level].nice_length,t.max_chain_length=Zu[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=It-1,t.match_available=0,t.ins_h=0},\"lm_init\");function gge(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Zm,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(sge*2),this.dyn_dtree=new Uint16Array((2*rge+1)*2),this.bl_tree=new Uint16Array((2*oge+1)*2),Uo(this.dyn_ltree),Uo(this.dyn_dtree),Uo(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(lge+1),this.heap=new Uint16Array(2*ux+1),Uo(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(2*ux+1),Uo(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}s(gge,\"DeflateState\");var ud=s(t=>{if(!t)return 1;let e=t.state;return!e||e.strm!==t||e.status!==oc&&e.status!==bx&&e.status!==dx&&e.status!==px&&e.status!==mx&&e.status!==fx&&e.status!==Ps&&e.status!==Xu?1:0},\"deflateStateCheck\"),yA=s(t=>{if(ud(t))return Ls(t,Tr);t.total_in=t.total_out=0,t.data_type=$he;let e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap===2?bx:e.wrap?oc:Ps,t.adler=e.wrap===2?0:1,e.last_flush=-2,Uhe(e),ui},\"deflateResetKeep\"),wA=s(t=>{let e=yA(t);return e===ui&&hge(t.state),e},\"deflateReset\"),_ge=s((t,e)=>ud(t)||t.state.wrap!==2?Tr:(t.state.gzhead=e,ui),\"deflateSetHeader\"),EA=s((t,e,n,i,a,r)=>{if(!t)return Tr;let o=1;if(e===Khe&&(e=6),i<0?(o=0,i=-i):i>15&&(o=2,i-=16),a<1||a>ege||n!==Zm||i<8||i>15||e<0||e>9||r<0||r>Zhe||i===8&&o!==1)return Ls(t,Tr);i===8&&(i=9);let l=new gge;return t.state=l,l.strm=t,l.status=oc,l.wrap=o,l.gzhead=null,l.w_bits=i,l.w_size=1<<l.w_bits,l.w_mask=l.w_size-1,l.hash_bits=a+7,l.hash_size=1<<l.hash_bits,l.hash_mask=l.hash_size-1,l.hash_shift=~~((l.hash_bits+It-1)/It),l.window=new Uint8Array(l.w_size*2),l.head=new Uint16Array(l.hash_size),l.prev=new Uint16Array(l.w_size),l.lit_bufsize=1<<a+6,l.pending_buf_size=l.lit_bufsize*4,l.pending_buf=new Uint8Array(l.pending_buf_size),l.sym_buf=l.lit_bufsize,l.sym_end=(l.lit_bufsize-1)*3,l.level=e,l.strategy=r,l.method=n,wA(t)},\"deflateInit2\"),xge=s((t,e)=>EA(t,e,Zm,tge,nge,Qhe),\"deflateInit\"),vge=s((t,e)=>{if(ud(t)||e>jj||e<0)return t?Ls(t,Tr):Tr;let n=t.state;if(!t.output||t.avail_in!==0&&!t.input||n.status===Xu&&e!==fa)return Ls(t,t.avail_out===0?Z0:Tr);let i=n.last_flush;if(n.last_flush=e,n.pending!==0){if(ta(t),t.avail_out===0)return n.last_flush=-1,ui}else if(t.avail_in===0&&Tj(e)<=Tj(i)&&e!==fa)return Ls(t,Z0);if(n.status===Xu&&t.avail_in!==0)return Ls(t,Z0);if(n.status===oc&&n.wrap===0&&(n.status=Ps),n.status===oc){let a=Zm+(n.w_bits-8<<4)<<8,r=-1;if(n.strategy>=Um||n.level<2?r=0:n.level<6?r=1:n.level===6?r=2:r=3,a|=r<<6,n.strstart!==0&&(a|=cge),a+=31-a%31,Yu(n,a),n.strstart!==0&&(Yu(n,t.adler>>>16),Yu(n,t.adler&65535)),t.adler=1,n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(n.status===bx){if(t.adler=0,Vt(n,31),Vt(n,139),Vt(n,8),n.gzhead)Vt(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),Vt(n,n.gzhead.time&255),Vt(n,n.gzhead.time>>8&255),Vt(n,n.gzhead.time>>16&255),Vt(n,n.gzhead.time>>24&255),Vt(n,n.level===9?2:n.strategy>=Um||n.level<2?4:0),Vt(n,n.gzhead.os&255),n.gzhead.extra&&n.gzhead.extra.length&&(Vt(n,n.gzhead.extra.length&255),Vt(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(t.adler=Kn(t.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=dx;else if(Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,0),Vt(n,n.level===9?2:n.strategy>=Um||n.level<2?4:0),Vt(n,uge),n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(n.status===dx){if(n.gzhead.extra){let a=n.pending,r=(n.gzhead.extra.length&65535)-n.gzindex;for(;n.pending+r>n.pending_buf_size;){let l=n.pending_buf_size-n.pending;if(n.pending_buf.set(n.gzhead.extra.subarray(n.gzindex,n.gzindex+l),n.pending),n.pending=n.pending_buf_size,n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex+=l,ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0,r-=l}let o=new Uint8Array(n.gzhead.extra);n.pending_buf.set(o.subarray(n.gzindex,n.gzindex+r),n.pending),n.pending+=r,n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex=0}n.status=px}if(n.status===px){if(n.gzhead.name){let a=n.pending,r;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0}n.gzindex<n.gzhead.name.length?r=n.gzhead.name.charCodeAt(n.gzindex++)&255:r=0,Vt(n,r)}while(r!==0);n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),n.gzindex=0}n.status=mx}if(n.status===mx){if(n.gzhead.comment){let a=n.pending,r;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a)),ta(t),n.pending!==0)return n.last_flush=-1,ui;a=0}n.gzindex<n.gzhead.comment.length?r=n.gzhead.comment.charCodeAt(n.gzindex++)&255:r=0,Vt(n,r)}while(r!==0);n.gzhead.hcrc&&n.pending>a&&(t.adler=Kn(t.adler,n.pending_buf,n.pending-a,a))}n.status=fx}if(n.status===fx){if(n.gzhead.hcrc){if(n.pending+2>n.pending_buf_size&&(ta(t),n.pending!==0))return n.last_flush=-1,ui;Vt(n,t.adler&255),Vt(n,t.adler>>8&255),t.adler=0}if(n.status=Ps,ta(t),n.pending!==0)return n.last_flush=-1,ui}if(t.avail_in!==0||n.lookahead!==0||e!==Jo&&n.status!==Xu){let a=n.level===0?bA(n,e):n.strategy===Um?fge(n,e):n.strategy===Xhe?mge(n,e):Zu[n.level].func(n,e);if((a===zs||a===uc)&&(n.status=Xu),a===ji||a===zs)return t.avail_out===0&&(n.last_flush=-1),ui;if(a===cc&&(e===Jhe?Hhe(n):e!==jj&&(cx(n,0,0,!1),e===Ghe&&(Uo(n.head),n.lookahead===0&&(n.strstart=0,n.block_start=0,n.insert=0))),ta(t),t.avail_out===0))return n.last_flush=-1,ui}return e!==fa?ui:n.wrap<=0?Aj:(n.wrap===2?(Vt(n,t.adler&255),Vt(n,t.adler>>8&255),Vt(n,t.adler>>16&255),Vt(n,t.adler>>24&255),Vt(n,t.total_in&255),Vt(n,t.total_in>>8&255),Vt(n,t.total_in>>16&255),Vt(n,t.total_in>>24&255)):(Yu(n,t.adler>>>16),Yu(n,t.adler&65535)),ta(t),n.wrap>0&&(n.wrap=-n.wrap),n.pending!==0?ui:Aj)},\"deflate$2\"),bge=s(t=>{if(ud(t))return Tr;let e=t.state.status;return t.state=null,e===Ps?Ls(t,Whe):ui},\"deflateEnd\"),yge=s((t,e)=>{let n=e.length;if(ud(t))return Tr;let i=t.state,a=i.wrap;if(a===2||a===1&&i.status!==oc||i.lookahead)return Tr;if(a===1&&(t.adler=rd(t.adler,e,n,0)),i.wrap=0,n>=i.w_size){a===0&&(Uo(i.head),i.strstart=0,i.block_start=0,i.insert=0);let c=new Uint8Array(i.w_size);c.set(e.subarray(n-i.w_size,n),0),e=c,n=i.w_size}let r=t.avail_in,o=t.next_in,l=t.input;for(t.avail_in=n,t.next_in=0,t.input=e,sc(i);i.lookahead>=It;){let c=i.strstart,d=i.lookahead-(It-1);do i.ins_h=Go(i,i.ins_h,i.window[c+It-1]),i.prev[c&i.w_mask]=i.head[i.ins_h],i.head[i.ins_h]=c,c++;while(--d);i.strstart=c,i.lookahead=It-1,sc(i)}return i.strstart+=i.lookahead,i.block_start=i.strstart,i.insert=i.lookahead,i.lookahead=0,i.match_length=i.prev_length=It-1,i.match_available=0,t.next_in=o,t.input=l,t.avail_in=r,i.wrap=a,ui},\"deflateSetDictionary\"),wge=xge,Ege=EA,kge=wA,jge=yA,Age=_ge,Tge=vge,Cge=bge,Sge=yge,Oge=\"pako deflate (from Nodeca project)\",$u={deflateInit:wge,deflateInit2:Ege,deflateReset:kge,deflateResetKeep:jge,deflateSetHeader:Age,deflate:Tge,deflateEnd:Cge,deflateSetDictionary:Sge,deflateInfo:Oge},Ige=s((t,e)=>Object.prototype.hasOwnProperty.call(t,e),\"_has\"),Dge=s(function(t){let e=Array.prototype.slice.call(arguments,1);for(;e.length;){let n=e.shift();if(n){if(typeof n!=\"object\")throw new TypeError(n+\"must be non-object\");for(let i in n)Ige(n,i)&&(t[i]=n[i])}}return t},\"assign\"),Fge=s(t=>{let e=0;for(let i=0,a=t.length;i<a;i++)e+=t[i].length;let n=new Uint8Array(e);for(let i=0,a=0,r=t.length;i<r;i++){let o=t[i];n.set(o,a),a+=o.length}return n},\"flattenChunks\"),Qm={assign:Dge,flattenChunks:Fge},kA=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch{kA=!1}var od=new Uint8Array(256);for(let t=0;t<256;t++)od[t]=t>=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;od[254]=od[254]=1;var Nge=s(t=>{if(typeof TextEncoder==\"function\"&&TextEncoder.prototype.encode)return new TextEncoder().encode(t);let e,n,i,a,r,o=t.length,l=0;for(a=0;a<o;a++)n=t.charCodeAt(a),(n&64512)===55296&&a+1<o&&(i=t.charCodeAt(a+1),(i&64512)===56320&&(n=65536+(n-55296<<10)+(i-56320),a++)),l+=n<128?1:n<2048?2:n<65536?3:4;for(e=new Uint8Array(l),r=0,a=0;r<l;a++)n=t.charCodeAt(a),(n&64512)===55296&&a+1<o&&(i=t.charCodeAt(a+1),(i&64512)===56320&&(n=65536+(n-55296<<10)+(i-56320),a++)),n<128?e[r++]=n:n<2048?(e[r++]=192|n>>>6,e[r++]=128|n&63):n<65536?(e[r++]=224|n>>>12,e[r++]=128|n>>>6&63,e[r++]=128|n&63):(e[r++]=240|n>>>18,e[r++]=128|n>>>12&63,e[r++]=128|n>>>6&63,e[r++]=128|n&63);return e},\"string2buf\"),Rge=s((t,e)=>{if(e<65534&&t.subarray&&kA)return String.fromCharCode.apply(null,t.length===e?t:t.subarray(0,e));let n=\"\";for(let i=0;i<e;i++)n+=String.fromCharCode(t[i]);return n},\"buf2binstring\"),Mge=s((t,e)=>{let n=e||t.length;if(typeof TextDecoder==\"function\"&&TextDecoder.prototype.decode)return new TextDecoder().decode(t.subarray(0,e));let i,a,r=new Array(n*2);for(a=0,i=0;i<n;){let o=t[i++];if(o<128){r[a++]=o;continue}let l=od[o];if(l>4){r[a++]=65533,i+=l-1;continue}for(o&=l===2?31:l===3?15:7;l>1&&i<n;)o=o<<6|t[i++]&63,l--;if(l>1){r[a++]=65533;continue}o<65536?r[a++]=o:(o-=65536,r[a++]=55296|o>>10&1023,r[a++]=56320|o&1023)}return Rge(r,a)},\"buf2string\"),Bge=s((t,e)=>{e=e||t.length,e>t.length&&(e=t.length);let n=e-1;for(;n>=0&&(t[n]&192)===128;)n--;return n<0||n===0?e:n+od[t[n]]>e?n:e},\"utf8border\"),sd={string2buf:Nge,buf2string:Mge,utf8border:Bge};function Pge(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}s(Pge,\"ZStream\");var jA=Pge,AA=Object.prototype.toString,{Z_NO_FLUSH:Lge,Z_SYNC_FLUSH:Vge,Z_FULL_FLUSH:zge,Z_FINISH:Uge,Z_OK:Ym,Z_STREAM_END:qge,Z_DEFAULT_COMPRESSION:Hge,Z_DEFAULT_STRATEGY:Jge,Z_DEFLATED:Gge}=qs;function dd(t){this.options=Qm.assign({level:Hge,method:Gge,chunkSize:16384,windowBits:15,memLevel:8,strategy:Jge},t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new jA,this.strm.avail_out=0;let n=$u.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(n!==Ym)throw new Error(Vs[n]);if(e.header&&$u.deflateSetHeader(this.strm,e.header),e.dictionary){let i;if(typeof e.dictionary==\"string\"?i=sd.string2buf(e.dictionary):AA.call(e.dictionary)===\"[object ArrayBuffer]\"?i=new Uint8Array(e.dictionary):i=e.dictionary,n=$u.deflateSetDictionary(this.strm,i),n!==Ym)throw new Error(Vs[n]);this._dict_set=!0}}s(dd,\"Deflate$1\");dd.prototype.push=function(t,e){let n=this.strm,i=this.options.chunkSize,a,r;if(this.ended)return!1;for(e===~~e?r=e:r=e===!0?Uge:Lge,typeof t==\"string\"?n.input=sd.string2buf(t):AA.call(t)===\"[object ArrayBuffer]\"?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;){if(n.avail_out===0&&(n.output=new Uint8Array(i),n.next_out=0,n.avail_out=i),(r===Vge||r===zge)&&n.avail_out<=6){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(a=$u.deflate(n,r),a===qge)return n.next_out>0&&this.onData(n.output.subarray(0,n.next_out)),a=$u.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===Ym;if(n.avail_out===0){this.onData(n.output);continue}if(r>0&&n.next_out>0){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(n.avail_in===0)break}return!0};dd.prototype.onData=function(t){this.chunks.push(t)};dd.prototype.onEnd=function(t){t===Ym&&(this.result=Qm.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};function yx(t,e){let n=new dd(e);if(n.push(t,!0),n.err)throw n.msg||Vs[n.err];return n.result}s(yx,\"deflate$1\");function Wge(t,e){return e=e||{},e.raw=!0,yx(t,e)}s(Wge,\"deflateRaw$1\");function Kge(t,e){return e=e||{},e.gzip=!0,yx(t,e)}s(Kge,\"gzip$1\");var Yge=dd,Xge=yx,Zge=Wge,Qge=Kge,$ge=qs,e_e={Deflate:Yge,deflate:Xge,deflateRaw:Zge,gzip:Qge,constants:$ge},qm=16209,t_e=16191,n_e=s(function(e,n){let i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D=e.state;i=e.next_in,k=e.input,a=i+(e.avail_in-5),r=e.next_out,R=e.output,o=r-(n-e.avail_out),l=r+(e.avail_out-257),c=D.dmax,d=D.wsize,u=D.whave,p=D.wnext,m=D.window,f=D.hold,g=D.bits,x=D.lencode,_=D.distcode,h=(1<<D.lenbits)-1,v=(1<<D.distbits)-1;e:do{g<15&&(f+=k[i++]<<g,g+=8,f+=k[i++]<<g,g+=8),b=x[f&h];t:for(;;){if(y=b>>>24,f>>>=y,g-=y,y=b>>>16&255,y===0)R[r++]=b&65535;else if(y&16){w=b&65535,y&=15,y&&(g<y&&(f+=k[i++]<<g,g+=8),w+=f&(1<<y)-1,f>>>=y,g-=y),g<15&&(f+=k[i++]<<g,g+=8,f+=k[i++]<<g,g+=8),b=_[f&v];n:for(;;){if(y=b>>>24,f>>>=y,g-=y,y=b>>>16&255,y&16){if(S=b&65535,y&=15,g<y&&(f+=k[i++]<<g,g+=8,g<y&&(f+=k[i++]<<g,g+=8)),S+=f&(1<<y)-1,S>c){e.msg=\"invalid distance too far back\",D.mode=qm;break e}if(f>>>=y,g-=y,y=r-o,S>y){if(y=S-y,y>u&&D.sane){e.msg=\"invalid distance too far back\",D.mode=qm;break e}if(F=0,N=m,p===0){if(F+=d-y,y<w){w-=y;do R[r++]=m[F++];while(--y);F=r-S,N=R}}else if(p<y){if(F+=d+p-y,y-=p,y<w){w-=y;do R[r++]=m[F++];while(--y);if(F=0,p<w){y=p,w-=y;do R[r++]=m[F++];while(--y);F=r-S,N=R}}}else if(F+=p-y,y<w){w-=y;do R[r++]=m[F++];while(--y);F=r-S,N=R}for(;w>2;)R[r++]=N[F++],R[r++]=N[F++],R[r++]=N[F++],w-=3;w&&(R[r++]=N[F++],w>1&&(R[r++]=N[F++]))}else{F=r-S;do R[r++]=R[F++],R[r++]=R[F++],R[r++]=R[F++],w-=3;while(w>2);w&&(R[r++]=R[F++],w>1&&(R[r++]=R[F++]))}}else if(y&64){e.msg=\"invalid distance code\",D.mode=qm;break e}else{b=_[(b&65535)+(f&(1<<y)-1)];continue n}break}}else if(y&64)if(y&32){D.mode=t_e;break e}else{e.msg=\"invalid literal/length code\",D.mode=qm;break e}else{b=x[(b&65535)+(f&(1<<y)-1)];continue t}break}}while(i<a&&r<l);w=g>>3,i-=w,g-=w<<3,f&=(1<<g)-1,e.next_in=i,e.next_out=r,e.avail_in=i<a?5+(a-i):5-(i-a),e.avail_out=r<l?257+(l-r):257-(r-l),D.hold=f,D.bits=g},\"inflate_fast\"),ac=15,Cj=852,Sj=592,Oj=0,$0=1,Ij=2,i_e=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),a_e=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),r_e=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),o_e=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]),s_e=s((t,e,n,i,a,r,o,l)=>{let c=l.bits,d=0,u=0,p=0,m=0,f=0,g=0,x=0,_=0,h=0,v=0,b,y,w,S,F,N=null,k,R=new Uint16Array(ac+1),D=new Uint16Array(ac+1),B=null,q,G,W;for(d=0;d<=ac;d++)R[d]=0;for(u=0;u<i;u++)R[e[n+u]]++;for(f=c,m=ac;m>=1&&R[m]===0;m--);if(f>m&&(f=m),m===0)return a[r++]=1<<24|64<<16|0,a[r++]=1<<24|64<<16|0,l.bits=1,0;for(p=1;p<m&&R[p]===0;p++);for(f<p&&(f=p),_=1,d=1;d<=ac;d++)if(_<<=1,_-=R[d],_<0)return-1;if(_>0&&(t===Oj||m!==1))return-1;for(D[1]=0,d=1;d<ac;d++)D[d+1]=D[d]+R[d];for(u=0;u<i;u++)e[n+u]!==0&&(o[D[e[n+u]]++]=u);if(t===Oj?(N=B=o,k=20):t===$0?(N=i_e,B=a_e,k=257):(N=r_e,B=o_e,k=0),v=0,u=0,d=p,F=r,g=f,x=0,w=-1,h=1<<f,S=h-1,t===$0&&h>Cj||t===Ij&&h>Sj)return 1;for(;;){q=d-x,o[u]+1<k?(G=0,W=o[u]):o[u]>=k?(G=B[o[u]-k],W=N[o[u]-k]):(G=32+64,W=0),b=1<<d-x,y=1<<g,p=y;do y-=b,a[F+(v>>x)+y]=q<<24|G<<16|W|0;while(y!==0);for(b=1<<d-1;v&b;)b>>=1;if(b!==0?(v&=b-1,v+=b):v=0,u++,--R[d]===0){if(d===m)break;d=e[n+o[u]]}if(d>f&&(v&S)!==w){for(x===0&&(x=f),F+=p,g=d-x,_=1<<g;g+x<m&&(_-=R[g+x],!(_<=0));)g++,_<<=1;if(h+=1<<g,t===$0&&h>Cj||t===Ij&&h>Sj)return 1;w=v&S,a[w]=f<<24|g<<16|F-r|0}}return v!==0&&(a[F+v]=d-x<<24|64<<16|0),l.bits=f,0},\"inflate_table\"),ed=s_e,l_e=0,TA=1,CA=2,{Z_FINISH:Dj,Z_BLOCK:c_e,Z_TREES:Hm,Z_OK:Us,Z_STREAM_END:u_e,Z_NEED_DICT:d_e,Z_STREAM_ERROR:ha,Z_DATA_ERROR:SA,Z_MEM_ERROR:OA,Z_BUF_ERROR:p_e,Z_DEFLATED:Fj}=qs,$m=16180,Nj=16181,Rj=16182,Mj=16183,Bj=16184,Pj=16185,Lj=16186,Vj=16187,zj=16188,Uj=16189,Xm=16190,fo=16191,ex=16192,qj=16193,tx=16194,Hj=16195,Jj=16196,Gj=16197,Wj=16198,Jm=16199,Gm=16200,Kj=16201,Yj=16202,Xj=16203,Zj=16204,Qj=16205,nx=16206,$j=16207,eA=16208,yn=16209,IA=16210,DA=16211,m_e=852,f_e=592,h_e=15,g_e=h_e,tA=s(t=>(t>>>24&255)+(t>>>8&65280)+((t&65280)<<8)+((t&255)<<24),\"zswap32\");function __e(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}s(__e,\"InflateState\");var Hs=s(t=>{if(!t)return 1;let e=t.state;return!e||e.strm!==t||e.mode<$m||e.mode>DA?1:0},\"inflateStateCheck\"),FA=s(t=>{if(Hs(t))return ha;let e=t.state;return t.total_in=t.total_out=e.total=0,t.msg=\"\",e.wrap&&(t.adler=e.wrap&1),e.mode=$m,e.last=0,e.havedict=0,e.flags=-1,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new Int32Array(m_e),e.distcode=e.distdyn=new Int32Array(f_e),e.sane=1,e.back=-1,Us},\"inflateResetKeep\"),NA=s(t=>{if(Hs(t))return ha;let e=t.state;return e.wsize=0,e.whave=0,e.wnext=0,FA(t)},\"inflateReset\"),RA=s((t,e)=>{let n;if(Hs(t))return ha;let i=t.state;return e<0?(n=0,e=-e):(n=(e>>4)+5,e<48&&(e&=15)),e&&(e<8||e>15)?ha:(i.window!==null&&i.wbits!==e&&(i.window=null),i.wrap=n,i.wbits=e,NA(t))},\"inflateReset2\"),MA=s((t,e)=>{if(!t)return ha;let n=new __e;t.state=n,n.strm=t,n.window=null,n.mode=$m;let i=RA(t,e);return i!==Us&&(t.state=null),i},\"inflateInit2\"),x_e=s(t=>MA(t,g_e),\"inflateInit\"),nA=!0,ix,ax,v_e=s(t=>{if(nA){ix=new Int32Array(512),ax=new Int32Array(32);let e=0;for(;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(ed(TA,t.lens,0,288,ix,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;ed(CA,t.lens,0,32,ax,0,t.work,{bits:5}),nA=!1}t.lencode=ix,t.lenbits=9,t.distcode=ax,t.distbits=5},\"fixedtables\"),BA=s((t,e,n,i)=>{let a,r=t.state;return r.window===null&&(r.wsize=1<<r.wbits,r.wnext=0,r.whave=0,r.window=new Uint8Array(r.wsize)),i>=r.wsize?(r.window.set(e.subarray(n-r.wsize,n),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>i&&(a=i),r.window.set(e.subarray(n-i,n-i+a),r.wnext),i-=a,i?(r.window.set(e.subarray(n-i,n),0),r.wnext=i,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave<r.wsize&&(r.whave+=a))),0},\"updatewindow\"),b_e=s((t,e)=>{let n,i,a,r,o,l,c,d,u,p,m,f,g,x,_=0,h,v,b,y,w,S,F,N,k=new Uint8Array(4),R,D,B=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Hs(t)||!t.output||!t.input&&t.avail_in!==0)return ha;n=t.state,n.mode===fo&&(n.mode=ex),o=t.next_out,a=t.output,c=t.avail_out,r=t.next_in,i=t.input,l=t.avail_in,d=n.hold,u=n.bits,p=l,m=c,N=Us;e:for(;;)switch(n.mode){case $m:if(n.wrap===0){n.mode=ex;break}for(;u<16;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(n.wrap&2&&d===35615){n.wbits===0&&(n.wbits=15),n.check=0,k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0),d=0,u=0,n.mode=Nj;break}if(n.head&&(n.head.done=!1),!(n.wrap&1)||(((d&255)<<8)+(d>>8))%31){t.msg=\"incorrect header check\",n.mode=yn;break}if((d&15)!==Fj){t.msg=\"unknown compression method\",n.mode=yn;break}if(d>>>=4,u-=4,F=(d&15)+8,n.wbits===0&&(n.wbits=F),F>15||F>n.wbits){t.msg=\"invalid window size\",n.mode=yn;break}n.dmax=1<<n.wbits,n.flags=0,t.adler=n.check=1,n.mode=d&512?Uj:fo,d=0,u=0;break;case Nj:for(;u<16;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(n.flags=d,(n.flags&255)!==Fj){t.msg=\"unknown compression method\",n.mode=yn;break}if(n.flags&57344){t.msg=\"unknown header flags set\",n.mode=yn;break}n.head&&(n.head.text=d>>8&1),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0,n.mode=Rj;case Rj:for(;u<32;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.head&&(n.head.time=d),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,k[2]=d>>>16&255,k[3]=d>>>24&255,n.check=Kn(n.check,k,4,0)),d=0,u=0,n.mode=Mj;case Mj:for(;u<16;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.head&&(n.head.xflags=d&255,n.head.os=d>>8),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0,n.mode=Bj;case Bj:if(n.flags&1024){for(;u<16;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.length=d,n.head&&(n.head.extra_len=d),n.flags&512&&n.wrap&4&&(k[0]=d&255,k[1]=d>>>8&255,n.check=Kn(n.check,k,2,0)),d=0,u=0}else n.head&&(n.head.extra=null);n.mode=Pj;case Pj:if(n.flags&1024&&(f=n.length,f>l&&(f=l),f&&(n.head&&(F=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Uint8Array(n.head.extra_len)),n.head.extra.set(i.subarray(r,r+f),F)),n.flags&512&&n.wrap&4&&(n.check=Kn(n.check,i,f,r)),l-=f,r+=f,n.length-=f),n.length))break e;n.length=0,n.mode=Lj;case Lj:if(n.flags&2048){if(l===0)break e;f=0;do F=i[r+f++],n.head&&F&&n.length<65536&&(n.head.name+=String.fromCharCode(F));while(F&&f<l);if(n.flags&512&&n.wrap&4&&(n.check=Kn(n.check,i,f,r)),l-=f,r+=f,F)break e}else n.head&&(n.head.name=null);n.length=0,n.mode=Vj;case Vj:if(n.flags&4096){if(l===0)break e;f=0;do F=i[r+f++],n.head&&F&&n.length<65536&&(n.head.comment+=String.fromCharCode(F));while(F&&f<l);if(n.flags&512&&n.wrap&4&&(n.check=Kn(n.check,i,f,r)),l-=f,r+=f,F)break e}else n.head&&(n.head.comment=null);n.mode=zj;case zj:if(n.flags&512){for(;u<16;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(n.wrap&4&&d!==(n.check&65535)){t.msg=\"header crc mismatch\",n.mode=yn;break}d=0,u=0}n.head&&(n.head.hcrc=n.flags>>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=fo;break;case Uj:for(;u<32;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}t.adler=n.check=tA(d),d=0,u=0,n.mode=Xm;case Xm:if(n.havedict===0)return t.next_out=o,t.avail_out=c,t.next_in=r,t.avail_in=l,n.hold=d,n.bits=u,d_e;t.adler=n.check=1,n.mode=fo;case fo:if(e===c_e||e===Hm)break e;case ex:if(n.last){d>>>=u&7,u-=u&7,n.mode=nx;break}for(;u<3;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}switch(n.last=d&1,d>>>=1,u-=1,d&3){case 0:n.mode=qj;break;case 1:if(v_e(n),n.mode=Jm,e===Hm){d>>>=2,u-=2;break e}break;case 2:n.mode=Jj;break;case 3:t.msg=\"invalid block type\",n.mode=yn}d>>>=2,u-=2;break;case qj:for(d>>>=u&7,u-=u&7;u<32;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if((d&65535)!==(d>>>16^65535)){t.msg=\"invalid stored block lengths\",n.mode=yn;break}if(n.length=d&65535,d=0,u=0,n.mode=tx,e===Hm)break e;case tx:n.mode=Hj;case Hj:if(f=n.length,f){if(f>l&&(f=l),f>c&&(f=c),f===0)break e;a.set(i.subarray(r,r+f),o),l-=f,r+=f,c-=f,o+=f,n.length-=f;break}n.mode=fo;break;case Jj:for(;u<14;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(n.nlen=(d&31)+257,d>>>=5,u-=5,n.ndist=(d&31)+1,d>>>=5,u-=5,n.ncode=(d&15)+4,d>>>=4,u-=4,n.nlen>286||n.ndist>30){t.msg=\"too many length or distance symbols\",n.mode=yn;break}n.have=0,n.mode=Gj;case Gj:for(;n.have<n.ncode;){for(;u<3;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.lens[B[n.have++]]=d&7,d>>>=3,u-=3}for(;n.have<19;)n.lens[B[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,R={bits:n.lenbits},N=ed(l_e,n.lens,0,19,n.lencode,0,n.work,R),n.lenbits=R.bits,N){t.msg=\"invalid code lengths set\",n.mode=yn;break}n.have=0,n.mode=Wj;case Wj:for(;n.have<n.nlen+n.ndist;){for(;_=n.lencode[d&(1<<n.lenbits)-1],h=_>>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(b<16)d>>>=h,u-=h,n.lens[n.have++]=b;else{if(b===16){for(D=h+2;u<D;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(d>>>=h,u-=h,n.have===0){t.msg=\"invalid bit length repeat\",n.mode=yn;break}F=n.lens[n.have-1],f=3+(d&3),d>>>=2,u-=2}else if(b===17){for(D=h+3;u<D;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}d>>>=h,u-=h,F=0,f=3+(d&7),d>>>=3,u-=3}else{for(D=h+7;u<D;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}d>>>=h,u-=h,F=0,f=11+(d&127),d>>>=7,u-=7}if(n.have+f>n.nlen+n.ndist){t.msg=\"invalid bit length repeat\",n.mode=yn;break}for(;f--;)n.lens[n.have++]=F}}if(n.mode===yn)break;if(n.lens[256]===0){t.msg=\"invalid code -- missing end-of-block\",n.mode=yn;break}if(n.lenbits=9,R={bits:n.lenbits},N=ed(TA,n.lens,0,n.nlen,n.lencode,0,n.work,R),n.lenbits=R.bits,N){t.msg=\"invalid literal/lengths set\",n.mode=yn;break}if(n.distbits=6,n.distcode=n.distdyn,R={bits:n.distbits},N=ed(CA,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,R),n.distbits=R.bits,N){t.msg=\"invalid distances set\",n.mode=yn;break}if(n.mode=Jm,e===Hm)break e;case Jm:n.mode=Gm;case Gm:if(l>=6&&c>=258){t.next_out=o,t.avail_out=c,t.next_in=r,t.avail_in=l,n.hold=d,n.bits=u,n_e(t,m),o=t.next_out,a=t.output,c=t.avail_out,r=t.next_in,i=t.input,l=t.avail_in,d=n.hold,u=n.bits,n.mode===fo&&(n.back=-1);break}for(n.back=0;_=n.lencode[d&(1<<n.lenbits)-1],h=_>>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(v&&!(v&240)){for(y=h,w=v,S=b;_=n.lencode[S+((d&(1<<y+w)-1)>>y)],h=_>>>24,v=_>>>16&255,b=_&65535,!(y+h<=u);){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}d>>>=y,u-=y,n.back+=y}if(d>>>=h,u-=h,n.back+=h,n.length=b,v===0){n.mode=Qj;break}if(v&32){n.back=-1,n.mode=fo;break}if(v&64){t.msg=\"invalid literal/length code\",n.mode=yn;break}n.extra=v&15,n.mode=Kj;case Kj:if(n.extra){for(D=n.extra;u<D;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.length+=d&(1<<n.extra)-1,d>>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=Yj;case Yj:for(;_=n.distcode[d&(1<<n.distbits)-1],h=_>>>24,v=_>>>16&255,b=_&65535,!(h<=u);){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(!(v&240)){for(y=h,w=v,S=b;_=n.distcode[S+((d&(1<<y+w)-1)>>y)],h=_>>>24,v=_>>>16&255,b=_&65535,!(y+h<=u);){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}d>>>=y,u-=y,n.back+=y}if(d>>>=h,u-=h,n.back+=h,v&64){t.msg=\"invalid distance code\",n.mode=yn;break}n.offset=b,n.extra=v&15,n.mode=Xj;case Xj:if(n.extra){for(D=n.extra;u<D;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}n.offset+=d&(1<<n.extra)-1,d>>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg=\"invalid distance too far back\",n.mode=yn;break}n.mode=Zj;case Zj:if(c===0)break e;if(f=m-c,n.offset>f){if(f=n.offset-f,f>n.whave&&n.sane){t.msg=\"invalid distance too far back\",n.mode=yn;break}f>n.wnext?(f-=n.wnext,g=n.wsize-f):g=n.wnext-f,f>n.length&&(f=n.length),x=n.window}else x=a,g=o-n.offset,f=n.length;f>c&&(f=c),c-=f,n.length-=f;do a[o++]=x[g++];while(--f);n.length===0&&(n.mode=Gm);break;case Qj:if(c===0)break e;a[o++]=n.length,c--,n.mode=Gm;break;case nx:if(n.wrap){for(;u<32;){if(l===0)break e;l--,d|=i[r++]<<u,u+=8}if(m-=c,t.total_out+=m,n.total+=m,n.wrap&4&&m&&(t.adler=n.check=n.flags?Kn(n.check,a,m,o-m):rd(n.check,a,m,o-m)),m=c,n.wrap&4&&(n.flags?d:tA(d))!==n.check){t.msg=\"incorrect data check\",n.mode=yn;break}d=0,u=0}n.mode=$j;case $j:if(n.wrap&&n.flags){for(;u<32;){if(l===0)break e;l--,d+=i[r++]<<u,u+=8}if(n.wrap&4&&d!==(n.total&4294967295)){t.msg=\"incorrect length check\",n.mode=yn;break}d=0,u=0}n.mode=eA;case eA:N=u_e;break e;case yn:N=SA;break e;case IA:return OA;case DA:default:return ha}return t.next_out=o,t.avail_out=c,t.next_in=r,t.avail_in=l,n.hold=d,n.bits=u,(n.wsize||m!==t.avail_out&&n.mode<yn&&(n.mode<nx||e!==Dj))&&BA(t,t.output,t.next_out,m-t.avail_out),p-=t.avail_in,m-=t.avail_out,t.total_in+=p,t.total_out+=m,n.total+=m,n.wrap&4&&m&&(t.adler=n.check=n.flags?Kn(n.check,a,m,t.next_out-m):rd(n.check,a,m,t.next_out-m)),t.data_type=n.bits+(n.last?64:0)+(n.mode===fo?128:0)+(n.mode===Jm||n.mode===tx?256:0),(p===0&&m===0||e===Dj)&&N===Us&&(N=p_e),N},\"inflate$2\"),y_e=s(t=>{if(Hs(t))return ha;let e=t.state;return e.window&&(e.window=null),t.state=null,Us},\"inflateEnd\"),w_e=s((t,e)=>{if(Hs(t))return ha;let n=t.state;return n.wrap&2?(n.head=e,e.done=!1,Us):ha},\"inflateGetHeader\"),E_e=s((t,e)=>{let n=e.length,i,a,r;return Hs(t)||(i=t.state,i.wrap!==0&&i.mode!==Xm)?ha:i.mode===Xm&&(a=1,a=rd(a,e,n,0),a!==i.check)?SA:(r=BA(t,e,n,n),r?(i.mode=IA,OA):(i.havedict=1,Us))},\"inflateSetDictionary\"),k_e=NA,j_e=RA,A_e=FA,T_e=x_e,C_e=MA,S_e=b_e,O_e=y_e,I_e=w_e,D_e=E_e,F_e=\"pako inflate (from Nodeca project)\",go={inflateReset:k_e,inflateReset2:j_e,inflateResetKeep:A_e,inflateInit:T_e,inflateInit2:C_e,inflate:S_e,inflateEnd:O_e,inflateGetHeader:I_e,inflateSetDictionary:D_e,inflateInfo:F_e};function N_e(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}s(N_e,\"GZheader\");var R_e=N_e,PA=Object.prototype.toString,{Z_NO_FLUSH:M_e,Z_FINISH:B_e,Z_OK:ld,Z_STREAM_END:rx,Z_NEED_DICT:ox,Z_STREAM_ERROR:P_e,Z_DATA_ERROR:iA,Z_MEM_ERROR:L_e}=qs;function pd(t){this.options=Qm.assign({chunkSize:1024*64,windowBits:15,to:\"\"},t||{});let e=this.options;e.raw&&e.windowBits>=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,e.windowBits===0&&(e.windowBits=-15)),e.windowBits>=0&&e.windowBits<16&&!(t&&t.windowBits)&&(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&(e.windowBits&15||(e.windowBits|=15)),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new jA,this.strm.avail_out=0;let n=go.inflateInit2(this.strm,e.windowBits);if(n!==ld)throw new Error(Vs[n]);if(this.header=new R_e,go.inflateGetHeader(this.strm,this.header),e.dictionary&&(typeof e.dictionary==\"string\"?e.dictionary=sd.string2buf(e.dictionary):PA.call(e.dictionary)===\"[object ArrayBuffer]\"&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=go.inflateSetDictionary(this.strm,e.dictionary),n!==ld)))throw new Error(Vs[n])}s(pd,\"Inflate$1\");pd.prototype.push=function(t,e){let n=this.strm,i=this.options.chunkSize,a=this.options.dictionary,r,o,l;if(this.ended)return!1;for(e===~~e?o=e:o=e===!0?B_e:M_e,PA.call(t)===\"[object ArrayBuffer]\"?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;){for(n.avail_out===0&&(n.output=new Uint8Array(i),n.next_out=0,n.avail_out=i),r=go.inflate(n,o),r===ox&&a&&(r=go.inflateSetDictionary(n,a),r===ld?r=go.inflate(n,o):r===iA&&(r=ox));n.avail_in>0&&r===rx&&n.state.wrap>0&&t[n.next_in]!==0;)go.inflateReset(n),r=go.inflate(n,o);switch(r){case P_e:case iA:case ox:case L_e:return this.onEnd(r),this.ended=!0,!1}if(l=n.avail_out,n.next_out&&(n.avail_out===0||r===rx))if(this.options.to===\"string\"){let c=sd.utf8border(n.output,n.next_out),d=n.next_out-c,u=sd.buf2string(n.output,c);n.next_out=d,n.avail_out=i-d,d&&n.output.set(n.output.subarray(c,c+d),0),this.onData(u)}else this.onData(n.output.length===n.next_out?n.output:n.output.subarray(0,n.next_out));if(!(r===ld&&l===0)){if(r===rx)return r=go.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(n.avail_in===0)break}}return!0};pd.prototype.onData=function(t){this.chunks.push(t)};pd.prototype.onEnd=function(t){t===ld&&(this.options.to===\"string\"?this.result=this.chunks.join(\"\"):this.result=Qm.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};function wx(t,e){let n=new pd(e);if(n.push(t),n.err)throw n.msg||Vs[n.err];return n.result}s(wx,\"inflate$1\");function V_e(t,e){return e=e||{},e.raw=!0,wx(t,e)}s(V_e,\"inflateRaw$1\");var z_e=pd,U_e=wx,q_e=V_e,H_e=wx,J_e=qs,G_e={Inflate:z_e,inflate:U_e,inflateRaw:q_e,ungzip:H_e,constants:J_e},{Deflate:W_e,deflate:K_e,deflateRaw:Y_e,gzip:X_e}=e_e,{Inflate:Z_e,inflate:Q_e,inflateRaw:$_e,ungzip:e0e}=G_e,t0e=W_e,n0e=K_e,i0e=Y_e,a0e=X_e,r0e=Z_e,o0e=Q_e,s0e=$_e,l0e=e0e,c0e=qs,ef={Deflate:t0e,deflate:n0e,deflateRaw:i0e,gzip:a0e,Inflate:r0e,inflate:o0e,inflateRaw:s0e,ungzip:l0e,constants:c0e};var Oe;(function(t){t[t.End=0]=\"End\",t[t.Byte=1]=\"Byte\",t[t.Short=2]=\"Short\",t[t.Int=3]=\"Int\",t[t.Long=4]=\"Long\",t[t.Float=5]=\"Float\",t[t.Double=6]=\"Double\",t[t.ByteArray=7]=\"ByteArray\",t[t.String=8]=\"String\",t[t.List=9]=\"List\",t[t.Compound=10]=\"Compound\",t[t.IntArray=11]=\"IntArray\",t[t.LongArray=12]=\"LongArray\"})(Oe||(Oe={}));var tf=class{static register(e,n){let i=n.create().getId();if(i!==e)throw new Error(`Registered factory ${Oe[i]} does not match type ${Oe[e]}`);tf.FACTORIES.set(e,n)}isEnd(){return this.getId()===Oe.End}isByte(){return this.getId()===Oe.Byte}isShort(){return this.getId()===Oe.Short}isInt(){return this.getId()===Oe.Int}isLong(){return this.getId()===Oe.Long}isFloat(){return this.getId()===Oe.Float}isDouble(){return this.getId()===Oe.Double}isByteArray(){return this.getId()===Oe.ByteArray}isString(){return this.getId()===Oe.String}isList(){return this.getId()===Oe.List}isCompound(){return this.getId()===Oe.Compound}isIntArray(){return this.getId()===Oe.IntArray}isLongArray(){return this.getId()===Oe.LongArray}isNumber(){return this.isByte()||this.isShort()||this.isInt()||this.isLong()||this.isFloat()||this.isDouble()}isArray(){return this.isByteArray()||this.isIntArray()||this.isLongArray()}isListOrArray(){return this.isList()||this.isArray()}getAsNumber(){return 0}getAsString(){return\"\"}toJsonWithId(){return{type:this.getId(),value:this.toJson()}}static getFactory(e){let n=this.FACTORIES.get(e);if(!n)throw new Error(`Invalid tag id ${e}`);return n}static create(e){return this.getFactory(e).create()}static fromString(e){let n=typeof e==\"string\"?new ci(e):e;return this.getFactory(Oe.Compound).fromString(n)}static fromJson(e,n=Oe.Compound){return this.getFactory(n).fromJson(e)}static fromJsonWithId(e){let n=ut.readObject(e)??{},i=ut.readInt(n.type)??0;return tf.fromJson(n.value??{},i)}static fromBytes(e,n=Oe.Compound){return this.getFactory(n).fromBytes(e)}},st=tf;s(st,\"NbtTag\"),lt(st,\"FACTORIES\",new Map);var Js=class extends st{value;constructor(e){super(),this.value=typeof e==\"number\"?e:e?1:0}getId(){return Oe.Byte}getAsNumber(){return this.value}toString(){return this.value.toFixed()+\"b\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeByte(this.value)}static create(){return Js.ZERO}static fromJson(e){return new Js(ut.readInt(e)??0)}static fromBytes(e){let n=e.readByte();return new Js(n)}},di=Js;s(di,\"NbtByte\"),lt(di,\"ZERO\",new Js(0)),lt(di,\"ONE\",new Js(1));st.register(Oe.Byte,di);var za=class extends st{items;constructor(e){super(),this.items=e}getItems(){return this.items.slice(0)}getAsTuple(e,n){return[...Array(e)].map((i,a)=>n(this.items[a]))}get(e){if(e=Math.floor(e),!(e<0||e>=this.items.length))return this.items[e]}get length(){return this.items.length}map(e){return this.items.map(e)}filter(e){return this.items.filter(e)}forEach(e){this.items.forEach(e)}set(e,n){this.items[e]=n}add(e){this.items.push(e)}insert(e,n){this.items.splice(e,0,n)}delete(e){this.items.splice(e,1)}clear(){this.items=[]}};s(za,\"NbtAbstractList\");var ga=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n==\"number\"?new di(n):n))}getId(){return Oe.ByteArray}getType(){return Oe.Byte}toString(){return\"[B;\"+this.items.map(n=>n.getAsNumber().toFixed()+\"B\").join(\",\")+\"]\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsNumber())}toJson(){return this.items.map(e=>e.getAsNumber())}toBytes(e){e.writeInt(this.items.length),e.writeBytes(this.items.map(n=>n.getAsNumber()))}static create(){return new ga([])}static fromJson(e){let n=ut.readArray(e,i=>ut.readNumber(i)??0)??[];return new ga(n)}static fromBytes(e){let n=e.readInt(),i=e.readBytes(n);return new ga(i)}};s(ga,\"NbtByteArray\");st.register(Oe.ByteArray,ga);var fn=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Float}getAsNumber(){return this.value}toString(){return this.value.toString()+\"f\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeFloat(this.value)}static create(){return new fn(0)}static fromJson(e){return new fn(ut.readNumber(e)??0)}static fromBytes(e){let n=e.readFloat();return new fn(n)}};s(fn,\"NbtFloat\");st.register(Oe.Float,fn);var an=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Int}getAsNumber(){return this.value}toString(){return this.value.toFixed()}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeInt(this.value)}static create(){return new an(0)}static fromJson(e){return new an(ut.readInt(e)??0)}static fromBytes(e){let n=e.readInt();return new an(n)}};s(an,\"NbtInt\");st.register(Oe.Int,an);var _a=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n==\"number\"?new an(n):n))}getId(){return Oe.IntArray}getType(){return Oe.Int}get length(){return this.items.length}toString(){return\"[I;\"+this.items.map(n=>n.getAsNumber().toFixed()).join(\",\")+\"]\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsNumber())}toJson(){return this.items.map(e=>e.getAsNumber())}toBytes(e){e.writeInt(this.items.length);for(let n of this.items)e.writeInt(n.getAsNumber())}static create(){return new _a}static fromJson(e){let n=ut.readArray(e,i=>ut.readNumber(i)??0)??[];return new _a(n)}static fromBytes(e){let n=e.readInt(),i=[];for(let a=0;a<n;a+=1)i.push(e.readInt());return new _a(i)}};s(_a,\"NbtIntArray\");st.register(Oe.IntArray,_a);var Tn=class extends za{type;constructor(e,n){super(e??[]),this.type=this.items.length===0?Oe.End:n??this.items[0].getId()}static make(e,n){return new Tn(n.map(i=>new e(i)))}getId(){return Oe.List}getType(){return this.type}getNumber(e){let n=this.get(e);return n?.isNumber()?n.getAsNumber():0}getString(e){let n=this.get(e);return n?.isString()?n.getAsString():\"\"}getList(e,n){let i=this.get(e);return i?.isList()&&i.getType()===n?i:Tn.create()}getCompound(e){let n=this.get(e);return n?.isCompound()?n:ot.create()}set(e,n){this.updateType(n),super.set(e,n)}add(e){this.updateType(e),super.add(e)}insert(e,n){this.updateType(n),super.insert(e,n)}updateType(e){if(e.getId()!==Oe.End){if(this.type===Oe.End)this.type=e.getId();else if(this.type!==e.getId())throw new Error(`Trying to add tag of type ${Oe[e.getId()]} to list of ${Oe[this.type]}`)}}clear(){super.clear(),this.type=Oe.End}toString(){return\"[\"+this.items.map(e=>e.toString()).join(\",\")+\"]\"}toPrettyString(e=\"  \",n=0){if(this.length===0)return\"[]\";let i=e.repeat(n),a=e.repeat(n+1);return`[\n`+this.map(r=>a+r.toPrettyString(e,n+1)).join(`,\n`)+`\n`+i+\"]\"}toSimplifiedJson(){return this.map(e=>e.toSimplifiedJson())}toJson(){return{type:this.type,items:this.items.map(e=>e.toJson())}}toBytes(e){this.items.length===0?this.type=Oe.End:this.type=this.items[0].getId(),e.writeByte(this.type),e.writeInt(this.items.length);for(let n of this.items)n.toBytes(e)}static create(){return new Tn}static fromJson(e){let n=ut.readObject(e)??{},i=ut.readNumber(n.type)??Oe.Compound,a=(ut.readArray(n.items)??[]).flatMap(r=>r!==void 0?[st.fromJson(r,i)]:[]);return new Tn(a,i)}static fromBytes(e){let n=e.readByte(),i=e.readInt();if(n===Oe.End&&i>0)throw new Error(`Missing type on ListTag but length is ${i}`);let a=[];for(let r=0;r<i;r+=1)a.push(st.fromBytes(e,n));return new Tn(a,n)}};s(Tn,\"NbtList\");st.register(Oe.List,Tn);var Jn=class extends st{value;constructor(e){super(),this.value=Jn.toPair(e)}static toPair(e){return Array.isArray(e)?e:Jn.bigintToPair(e)}static bigintToPair(e){return Jn.dataview.setBigInt64(0,e),[Jn.dataview.getInt32(0),Jn.dataview.getInt32(4)]}static pairToBigint(e){return Jn.dataview.setInt32(0,Number(e[0])),Jn.dataview.setInt32(4,Number(e[1])),Jn.dataview.getBigInt64(0)}static pairToString(e){return Jn.pairToBigint(e).toString()}static pairToNumber(e){return Number(Jn.pairToBigint(e))}getId(){return Oe.Long}getAsNumber(){return Jn.pairToNumber(this.value)}getAsPair(){return this.value}toBigInt(){return Jn.pairToBigint(this.value)}toString(){return Jn.pairToString(this.value)+\"L\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return Jn.pairToNumber(this.value)}toJson(){return this.value}toBytes(e){e.writeInt(this.value[0]),e.writeInt(this.value[1])}static create(){return new Jn([0,0])}static fromJson(e){return new Jn(Array.isArray(e)&&e.length===2?e.map(n=>typeof n==\"number\"?n:0):[0,0])}static fromBytes(e){let n=e.readInt(),i=e.readInt();return new Jn([n,i])}},_o=Jn;s(_o,\"NbtLong\"),lt(_o,\"dataview\",new DataView(new Uint8Array(8).buffer));st.register(Oe.Long,_o);var xa=class extends za{constructor(e){super(Array.from(e??[],n=>typeof n==\"bigint\"||Array.isArray(n)?new _o(n):n))}getId(){return Oe.LongArray}getType(){return Oe.Long}get length(){return this.items.length}toString(){return\"[I;\"+this.items.map(n=>n.toString()).join(\",\")+\"]\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.items.map(e=>e.getAsPair())}toJson(){return this.items.map(e=>e.getAsPair())}toBytes(e){e.writeInt(this.items.length);for(let n of this.items){let[i,a]=n.getAsPair();e.writeInt(i),e.writeInt(a)}}static create(){return new xa}static fromJson(e){let n=ut.readArray(e,i=>ut.readPair(i,a=>ut.readNumber(a)??0)??[0,0])??[];return new xa(n)}static fromBytes(e){let n=e.readInt(),i=[];for(let a=0;a<n;a+=1)i.push([e.readInt(),e.readInt()]);return new xa(i)}};s(xa,\"NbtLongArray\");st.register(Oe.LongArray,xa);var Sr=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Short}getAsNumber(){return this.value}toString(){return this.value.toFixed()+\"s\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeShort(this.value)}static create(){return new Sr(0)}static fromJson(e){return new Sr(typeof e==\"number\"?Math.floor(e):0)}static fromBytes(e){let n=e.readShort();return new Sr(n)}};s(Sr,\"NbtShort\");st.register(Oe.Short,Sr);var dc=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.String}getAsString(){return this.value}toString(){return'\"'+this.value.replace(/(\\\\|\")/g,\"\\\\$1\")+'\"'}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeString(this.value)}static create(){return dc.EMPTY}static fromJson(e){return new dc(typeof e==\"string\"?e:\"\")}static fromBytes(e){let n=e.readString();return new dc(n)}},xt=dc;s(xt,\"NbtString\"),lt(xt,\"EMPTY\",new dc(\"\"));st.register(Oe.String,xt);var nf;(function(t){let e=new RegExp(\"^[-+]?(?:[0-9]+[.]|[0-9]*[.][0-9]+)(?:e[-+]?[0-9]+)?$\",\"i\"),n=new RegExp(\"^[-+]?(?:[0-9]+[.]?|[0-9]*[.][0-9]+)(?:e[-+]?[0-9]+)?d$\",\"i\"),i=new RegExp(\"^[-+]?(?:[0-9]+[.]?|[0-9]*[.][0-9]+)(?:e[-+]?[0-9]+)?f$\",\"i\"),a=new RegExp(\"^[-+]?(?:0|[1-9][0-9]*)b$\",\"i\"),r=new RegExp(\"^[-+]?(?:0|[1-9][0-9]*)l$\",\"i\"),o=new RegExp(\"^[-+]?(?:0|[1-9][0-9]*)s$\",\"i\"),l=new RegExp(\"^[-+]?(?:0|[1-9][0-9]*)$\",\"i\");function c(f){if(f.skipWhitespace(),!f.canRead())throw f.createError(\"Expected value\");let g=f.peek();if(g===\"{\")return d(f);if(g===\"[\")if(f.canRead(3)&&!ci.isQuotedStringStart(f.peek(1))&&f.peek(2)===\";\"){f.expect(\"[\",!0);let x=f.cursor,_=f.read();if(f.skip(),f.skipWhitespace(),f.canRead()){if(_===\"B\")return p(f,ga,Oe.ByteArray,Oe.Byte);if(_===\"L\")return p(f,xa,Oe.LongArray,Oe.Long);if(_===\"I\")return p(f,_a,Oe.IntArray,Oe.Int);throw f.cursor=x,f.createError(`Invalid array type '${_}'`)}else throw f.createError(\"Expected value\")}else return u(f);else{f.skipWhitespace();let x=f.cursor;if(ci.isQuotedStringStart(f.peek()))return new xt(f.readQuotedString());{let _=f.readUnquotedString();if(_.length===0)throw f.cursor=x,f.createError(\"Expected value\");try{if(i.test(_)){let h=Number(_.substring(0,_.length-1));return new fn(h)}else if(a.test(_)){let h=Number(_.substring(0,_.length-1));return new di(Math.floor(h))}else if(r.test(_)){let h=BigInt(_.substring(0,_.length-1));return new _o(h)}else if(o.test(_)){let h=Number(_.substring(0,_.length-1));return new Sr(Math.floor(h))}else if(l.test(_)){let h=Number(_);return new an(Math.floor(h))}else if(n.test(_)){let h=Number(_.substring(0,_.length-1));return new Ua(h)}else if(e.test(_)){let h=Number(_);return new Ua(h)}else{if(_.toLowerCase()===\"true\")return di.ONE;if(_.toLowerCase()===\"false\")return di.ZERO}}catch{}return _.length===0?xt.EMPTY:new xt(_)}}}s(c,\"readTag\"),t.readTag=c;function d(f){f.expect(\"{\",!0);let g=new Map;for(f.skipWhitespace();f.canRead()&&f.peek()!==\"}\";){let x=f.cursor;if(f.skipWhitespace(),!f.canRead())throw f.createError(\"Expected key\");let _=f.readString();if(_.length===0)throw f.cursor=x,f.createError(\"Expected key\");f.expect(\":\",!0);let h=c(f);if(g.set(_,h),!m(f))break;if(!f.canRead())throw f.createError(\"Expected key\")}return f.expect(\"}\",!0),new ot(g)}s(d,\"readCompound\");function u(f){if(f.expect(\"[\",!0),f.skipWhitespace(),!f.canRead())throw f.createError(\"Expected value\");let g=[],x=Oe.End;for(;f.peek()!==\"]\";){let _=f.cursor,h=c(f),v=h.getId();if(x===Oe.End)x=v;else if(v!==x)throw f.cursor=_,f.createError(`Can't insert ${Oe[v]} into list of ${Oe[x]}`);if(g.push(h),!m(f))break;if(!f.canRead())throw f.createError(\"Expected value\")}return f.expect(\"]\",!0),new Tn(g,x)}s(u,\"readList\");function p(f,g,x,_){let h=[];for(;f.peek()!==\"]\";){let v=c(f);if(v.getId()!==_)throw f.createError(`Can't insert ${Oe[v.getId()]} into ${Oe[x]}`);if(h.push(v.isLong()?v.getAsPair():v.getAsNumber()),!m(f))break;if(!f.canRead())throw f.createError(\"Expected value\")}return f.expect(\"]\"),new g(h)}s(p,\"readArray\");function m(f){return f.skipWhitespace(),f.canRead()&&f.peek()===\",\"?(f.skip(),f.skipWhitespace(),!0):!1}s(m,\"hasElementSeparator\")})(nf||(nf={}));var ot=class extends st{properties;constructor(e){super(),this.properties=e??new Map}getId(){return Oe.Compound}has(e){return this.properties.has(e)}hasNumber(e){return this.get(e)?.isNumber()??!1}hasString(e){return this.get(e)?.isString()??!1}hasList(e,n,i){let a=this.get(e);return(a?.isList()&&(n===void 0||a.getType()===n)&&(i===void 0||a.length===i))??!1}hasCompound(e){return this.get(e)?.isCompound()??!1}get(e){return this.properties.get(e)}getString(e){return this.get(e)?.getAsString()??\"\"}getNumber(e){return this.get(e)?.getAsNumber()??0}getBoolean(e){return this.getNumber(e)!==0}getList(e,n){let i=this.get(e);return i?.isList()&&(n===void 0||i.getType()===n)?i:Tn.create()}getCompound(e){let n=this.get(e);return n?.isCompound()?n:ot.create()}getByteArray(e){let n=this.get(e);return n?.isByteArray()?n:ga.create()}getIntArray(e){let n=this.get(e);return n?.isIntArray()?n:_a.create()}getLongArray(e){let n=this.get(e);return n?.isLongArray()?n:xa.create()}keys(){return this.properties.keys()}get size(){return this.properties.size}map(e){return Object.fromEntries([...this.properties.entries()].map(([n,i])=>e(n,i,this)))}forEach(e){[...this.properties.entries()].forEach(([n,i])=>e(n,i,this))}set(e,n){return this.properties.set(e,n),this}delete(e){return this.properties.delete(e)}clear(){return this.properties.clear(),this}toString(){let e=[];for(let[n,i]of this.properties.entries()){let a=n.split(\"\").some(r=>!ci.isAllowedInUnquotedString(r));e.push((a?JSON.stringify(n):n)+\":\"+i.toString())}return\"{\"+e.join(\",\")+\"}\"}toPrettyString(e=\"  \",n=0){if(this.size===0)return\"{}\";let i=e.repeat(n),a=e.repeat(n+1);return`{\n`+Object.values(this.map((r,o)=>[r,a+r+\": \"+o.toPrettyString(e,n+1)])).join(`,\n`)+`\n`+i+\"}\"}toSimplifiedJson(){return this.map((e,n)=>[e,n.toSimplifiedJson()])}toJson(){return this.map((e,n)=>[e,{type:n.getId(),value:n.toJson()}])}toBytes(e){for(let[n,i]of this.properties.entries()){let a=i.getId();e.writeByte(a),e.writeString(n),i.toBytes(e)}e.writeByte(Oe.End)}static create(){return new ot}static fromString(e){return nf.readTag(e)}static fromJson(e){let n=ut.readMap(e,i=>{let{type:a,value:r}=ut.readObject(i)??{},o=ut.readNumber(a);return st.fromJson(r??{},o)});return new ot(new Map(Object.entries(n)))}static fromBytes(e){let n=new Map;for(;;){let i=e.readByte();if(i===Oe.End)break;let a=e.readString(),r=st.fromBytes(e,i);n.set(a,r)}return new ot(n)}};s(ot,\"NbtCompound\");st.register(Oe.Compound,ot);var Wo=class{name;root;compression;littleEndian;bedrockHeader;constructor(e,n,i,a,r){this.name=e,this.root=n,this.compression=i,this.littleEndian=a,this.bedrockHeader=r}writeNamedTag(e){e.writeByte(Oe.Compound),e.writeString(this.name),this.root.toBytes(e)}write(){let e=this.littleEndian===!0||this.bedrockHeader!==void 0,n=new Ku({littleEndian:e,offset:this.bedrockHeader&&8});if(this.writeNamedTag(n),this.bedrockHeader!==void 0){let a=n.offset;n.offset=0,n.writeInt(this.bedrockHeader),n.writeInt(a-8),n.offset=a}let i=n.getData();return this.compression===\"gzip\"?ef.gzip(i):this.compression===\"zlib\"?ef.deflate(i):i}static readNamedTag(e){if(e.readByte()!==Oe.Compound)throw new Error(\"Top tag should be a compound\");return{name:e.readString(),root:ot.fromBytes(e)}}static create(e={}){let n=e.name??Wo.DEFAULT_NAME,i=ot.create(),a=e.compression??\"none\",r=typeof e.bedrockHeader==\"boolean\"?Wo.DEFAULT_BEDROCK_HEADER:e.bedrockHeader,o=e.littleEndian??e.bedrockHeader!==void 0;return new Wo(n,i,a,o,r)}static read(e,n={}){let i=typeof n.bedrockHeader==\"number\"?n.bedrockHeader:n.bedrockHeader?_j(e):void 0,a=n.compression===\"gzip\"||!i&&n.compression===void 0&&hj(e),r=n.compression===\"zlib\"||!i&&n.compression===void 0&&gj(e),o=r||a?ef.inflate(e):e,l=n.littleEndian||i!==void 0,c=a?\"gzip\":r?\"zlib\":\"none\",d=new Wu(o,{littleEndian:l,offset:i&&8}),{name:u,root:p}=Wo.readNamedTag(d);return new Wo(n.name??u,p,c,l,i)}toJson(){return{name:this.name,root:this.root.toJson(),compression:this.compression,littleEndian:this.littleEndian,bedrockHeader:this.bedrockHeader??null}}static fromJson(e){let n=ut.readObject(e)??{},i=ut.readString(n.name)??\"\",a=ot.fromJson(n.root??{}),r=ut.readString(n.compression)??\"none\",o=ut.readBoolean(n.littleEndian)??!1,l=ut.readNumber(n.bedrockHeader);return new Wo(i,a,r,o,l)}},qa=Wo;s(qa,\"NbtFile\"),lt(qa,\"DEFAULT_NAME\",\"\"),lt(qa,\"DEFAULT_BEDROCK_HEADER\",4);var va=class{x;z;compression;timestamp;raw;file;dirty;constructor(e,n,i,a,r){this.x=e,this.z=n,this.compression=i,this.timestamp=a,this.raw=r,this.dirty=!1}getCompression(){switch(this.compression){case 1:return\"gzip\";case 2:return\"zlib\";case 3:return\"none\";default:throw new Error(`Invalid compression mode ${this.compression}`)}}setCompression(e){switch(e){case\"gzip\":this.compression=1;break;case\"zlib\":this.compression=2;break;case\"none\":this.compression=3;break;default:throw new Error(`Invalid compression mode ${e}`)}}getFile(){return this.file===void 0&&(this.file=qa.read(this.raw,{compression:this.getCompression()})),this.file}getRoot(){return this.getFile().root}setRoot(e){this.file===void 0&&(this.file=qa.create({compression:this.getCompression()})),this.file.root=e,this.markDirty()}markDirty(){this.dirty=!0}getRaw(){if(this.file===void 0||this.dirty===!1)return this.raw;this.file.compression=this.getCompression();let e=this.file.write();return this.raw=e,this.dirty=!1,e}toJson(){return{x:this.x,z:this.z,compression:this.compression,timestamp:this.timestamp,size:this.raw.byteLength}}toRef(e){return new va.Ref(this.x,this.z,this.compression,this.timestamp,this.raw.byteLength,e)}static create(e,n,i,a){let r=new va(e,n,0,a??0,i.write());return r.setCompression(i.compression),r}static fromJson(e,n){let i=ut.readObject(e)??{},a=ut.readInt(i.x)??0,r=ut.readInt(i.z)??0,o=ut.readNumber(i.compression)??2,l=ut.readInt(i.timestamp)??0,c=ut.readInt(i.size)??0;return new va.Ref(a,r,o,l,c,n)}};s(va,\"NbtChunk\");(function(t){class e{x;z;compression;timestamp;size;resolver;file;constructor(i,a,r,o,l,c){this.x=i,this.z=a,this.compression=r,this.timestamp=o,this.size=l,this.resolver=c}getFile(){if(this.file instanceof qa)return this.file}getRoot(){if(this.file instanceof qa)return this.file.root}async getFileAsync(){return this.file?this.file:(this.file=(async()=>{let i=await this.resolver(this.x,this.z);return this.file=i,i})(),this.file)}async getRootAsync(){return(await this.getFileAsync()).root}isResolved(){return this.file instanceof qa}}s(e,\"Ref\"),t.Ref=e})(va||(va={}));var md=class{chunks;constructor(e){this.chunks=Array(32*32).fill(void 0);for(let n of e){let i=Or.getIndex(n.x,n.z);this.chunks[i]=n}}getChunkPositions(){return this.chunks.flatMap(e=>e?[[e.x,e.z]]:[])}getChunk(e){if(!(e<0||e>=32*32))return this.chunks[e]}findChunk(e,n){return this.getChunk(Or.getIndex(e,n))}getFirstChunk(){return this.chunks.filter(e=>e!==void 0)[0]}filter(e){return this.chunks.filter(n=>n!==void 0&&e(n))}map(e){return this.chunks.flatMap(n=>n!==void 0?[e(n)]:[])}};s(md,\"NbtAbstractRegion\");var Or=class extends md{constructor(e){super(e)}write(){let e=0;for(let r of this.chunks)r!==void 0&&(e+=Math.ceil(r.getRaw().length/4096));let n=new Uint8Array(8192+e*4096),i=new DataView(n.buffer),a=2;for(let r of this.chunks){if(r===void 0)continue;let o=r.getRaw(),l=4*((r.x&31)+(r.z&31)*32),c=Math.ceil(o.length/4096);i.setInt8(l,a>>16),i.setInt16(l+1,a&65535),i.setInt8(l+3,c),i.setInt32(l+4096,r.timestamp);let d=a*4096;i.setInt32(d,o.length+1),i.setInt8(d+4,r.compression),n.set(o,d+5),a+=c}return n}static read(e){let n=[];for(let i=0;i<32;i+=1)for(let a=0;a<32;a+=1){let r=4*((i&31)+(a&31)*32);if(e[r+3]===0)continue;let l=(e[r]<<16)+(e[r+1]<<8)+e[r+2],c=(e[r+4096]<<24)+(e[r+4097]<<16)+(e[r+4098]<<8)+e[r+4099],d=l*4096,u=(e[d]<<24)+(e[d+1]<<16)+(e[d+2]<<8)+e[d+3],p=e[d+4],m=e.slice(d+5,d+4+u);n.push(new va(i,a,p,c,m))}return new Or(n)}static getIndex(e,n){return(e&31)+(n&31)*32}toJson(){return{chunks:this.map(e=>e.toJson())}}static fromJson(e,n){let i=ut.readObject(e)??{},r=(ut.readArray(i.chunks)??[]).flatMap(o=>o!==void 0?[va.fromJson(o,n)]:[]);return new Or.Ref(r)}};s(Or,\"NbtRegion\");(function(t){class e extends md{}s(e,\"Ref\"),t.Ref=e})(Or||(Or={}));var Ua=class extends st{value;constructor(e){super(),this.value=e}getId(){return Oe.Double}getAsNumber(){return this.value}toString(){return Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}toPrettyString(){return this.toString()}toSimplifiedJson(){return this.value}toJson(){return this.value}toBytes(e){e.writeDouble(this.value)}static create(){return new Ua(0)}static fromJson(e){return new Ua(ut.readNumber(e)??0)}static fromBytes(e){let n=e.readDouble();return new Ua(n)}};s(Ua,\"NbtDouble\");st.register(Oe.Double,Ua);var pc=class extends st{constructor(){super()}getId(){return Oe.End}toString(){return\"END\"}toPrettyString(){return this.toString()}toSimplifiedJson(){return null}toJson(){return null}toBytes(){}static create(){return pc.INSTANCE}static fromJson(){return pc.INSTANCE}static fromBytes(){return pc.INSTANCE}},fd=pc;s(fd,\"NbtEnd\"),lt(fd,\"INSTANCE\",new pc);st.register(Oe.End,fd);var LA={},u0e=s(function(t,e,n,i,a){var r=new Worker(LA[e]||(LA[e]=URL.createObjectURL(new Blob([t+';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:\"text/javascript\"}))));return r.onmessage=function(o){var l=o.data,c=l.$e$;if(c){var d=new Error(c[0]);d.code=c[1],d.stack=c[2],a(d,null)}else a(null,l)},r.postMessage(n,i),r},\"wk\"),Ti=Uint8Array,Gs=Uint16Array,UA=Int32Array,jx=new Ti([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ax=new Ti([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),qA=new Ti([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),HA=s(function(t,e){for(var n=new Gs(31),i=0;i<31;++i)n[i]=e+=1<<t[i-1];for(var a=new UA(n[30]),i=1;i<30;++i)for(var r=n[i];r<n[i+1];++r)a[r]=r-n[i]<<5|i;return{b:n,r:a}},\"freb\"),JA=HA(jx,2),Tx=JA.b,d0e=JA.r;Tx[28]=258,d0e[258]=28;var GA=HA(Ax,0),WA=GA.b,SCe=GA.r,sf=new Gs(32768);for(zt=0;zt<32768;++zt)xo=(zt&43690)>>1|(zt&21845)<<1,xo=(xo&52428)>>2|(xo&13107)<<2,xo=(xo&61680)>>4|(xo&3855)<<4,sf[zt]=((xo&65280)>>8|(xo&255)<<8)>>1;var xo,zt,mc=s(function(t,e,n){for(var i=t.length,a=0,r=new Gs(e);a<i;++a)t[a]&&++r[t[a]-1];var o=new Gs(e);for(a=1;a<e;++a)o[a]=o[a-1]+r[a-1]<<1;var l;if(n){l=new Gs(1<<e);var c=15-e;for(a=0;a<i;++a)if(t[a])for(var d=a<<4|t[a],u=e-t[a],p=o[t[a]-1]++<<u,m=p|(1<<u)-1;p<=m;++p)l[sf[p]>>c]=d}else for(l=new Gs(i),a=0;a<i;++a)t[a]&&(l[a]=sf[o[t[a]-1]++]>>15-t[a]);return l},\"hMap\"),hd=new Ti(288);for(zt=0;zt<144;++zt)hd[zt]=8;var zt;for(zt=144;zt<256;++zt)hd[zt]=9;var zt;for(zt=256;zt<280;++zt)hd[zt]=7;var zt;for(zt=280;zt<288;++zt)hd[zt]=8;var zt,KA=new Ti(32);for(zt=0;zt<32;++zt)KA[zt]=5;var zt;var YA=mc(hd,9,1);var XA=mc(KA,5,1),rf=s(function(t){for(var e=t[0],n=1;n<t.length;++n)t[n]>e&&(e=t[n]);return e},\"max\"),ba=s(function(t,e,n){var i=e/8|0;return(t[i]|t[i+1]<<8)>>(e&7)&n},\"bits\"),of=s(function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},\"bits16\"),ZA=s(function(t){return(t+7)/8|0},\"shft\"),lf=s(function(t,e,n){return(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length),new Ti(t.subarray(e,n))},\"slc\");var QA=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],Ai=s(function(t,e,n){var i=new Error(e||QA[t]);if(i.code=t,Error.captureStackTrace&&Error.captureStackTrace(i,Ai),!n)throw i;return i},\"err\"),$A=s(function(t,e,n,i){var a=t.length,r=i?i.length:0;if(!a||e.f&&!e.l)return n||new Ti(0);var o=!n,l=o||e.i!=2,c=e.i;o&&(n=new Ti(a*3));var d=s(function(Y){var we=n.length;if(Y>we){var Le=new Ti(Math.max(we*2,Y));Le.set(n),n=Le}},\"cbuf\"),u=e.f||0,p=e.p||0,m=e.b||0,f=e.l,g=e.d,x=e.m,_=e.n,h=a*8;do{if(!f){u=ba(t,p,1);var v=ba(t,p+1,3);if(p+=3,v)if(v==1)f=YA,g=XA,x=9,_=5;else if(v==2){var S=ba(t,p,31)+257,F=ba(t,p+10,15)+4,N=S+ba(t,p+5,31)+1;p+=14;for(var k=new Ti(N),R=new Ti(19),D=0;D<F;++D)R[qA[D]]=ba(t,p+D*3,7);p+=F*3;for(var B=rf(R),q=(1<<B)-1,G=mc(R,B,1),D=0;D<N;){var W=G[ba(t,p,q)];p+=W&15;var b=W>>4;if(b<16)k[D++]=b;else{var ee=0,Z=0;for(b==16?(Z=3+ba(t,p,3),p+=2,ee=k[D-1]):b==17?(Z=3+ba(t,p,7),p+=3):b==18&&(Z=11+ba(t,p,127),p+=7);Z--;)k[D++]=ee}}var me=k.subarray(0,S),X=k.subarray(S);x=rf(me),_=rf(X),f=mc(me,x,1),g=mc(X,_,1)}else Ai(1);else{var b=ZA(p)+4,y=t[b-4]|t[b-3]<<8,w=b+y;if(w>a){c&&Ai(0);break}l&&d(m+y),n.set(t.subarray(b,w),m),e.b=m+=y,e.p=p=w*8,e.f=u;continue}if(p>h){c&&Ai(0);break}}l&&d(m+131072);for(var Q=(1<<x)-1,he=(1<<_)-1,Ie=p;;Ie=p){var ee=f[of(t,p)&Q],le=ee>>4;if(p+=ee&15,p>h){c&&Ai(0);break}if(ee||Ai(2),le<256)n[m++]=le;else if(le==256){Ie=p,f=null;break}else{var ge=le-254;if(le>264){var D=le-257,V=jx[D];ge=ba(t,p,(1<<V)-1)+Tx[D],p+=V}var H=g[of(t,p)&he],re=H>>4;H||Ai(3),p+=H&15;var X=WA[re];if(re>3){var V=Ax[re];X+=of(t,p)&(1<<V)-1,p+=V}if(p>h){c&&Ai(0);break}l&&d(m+131072);var xe=m+ge;if(m<X){var fe=r-X,te=Math.min(X,xe);for(fe+m<0&&Ai(3);m<te;++m)n[m]=i[fe+m]}for(;m<xe;++m)n[m]=n[m-X]}}e.l=f,e.p=Ie,e.b=m,e.f=u,f&&(u=1,e.m=x,e.d=g,e.n=_)}while(!u);return m!=n.length&&o?lf(n,0,m):n.subarray(0,m)},\"inflt\");var p0e=new Ti(0);var m0e=s(function(t,e){var n={};for(var i in t)n[i]=t[i];for(var i in e)n[i]=e[i];return n},\"mrg\"),VA=s(function(t,e,n){for(var i=t(),a=t.toString(),r=a.slice(a.indexOf(\"[\")+1,a.lastIndexOf(\"]\")).replace(/\\s+/g,\"\").split(\",\"),o=0;o<i.length;++o){var l=i[o],c=r[o];if(typeof l==\"function\"){e+=\";\"+c+\"=\";var d=l.toString();if(l.prototype)if(d.indexOf(\"[native code]\")!=-1){var u=d.indexOf(\" \",8)+1;e+=d.slice(u,d.indexOf(\"(\",u))}else{e+=d;for(var p in l.prototype)e+=\";\"+c+\".prototype.\"+p+\"=\"+l.prototype[p].toString()}else e+=d}else n[c]=l}return e},\"wcln\"),af=[],f0e=s(function(t){var e=[];for(var n in t)t[n].buffer&&e.push((t[n]=new t[n].constructor(t[n])).buffer);return e},\"cbfs\"),h0e=s(function(t,e,n,i){if(!af[n]){for(var a=\"\",r={},o=t.length-1,l=0;l<o;++l)a=VA(t[l],a,r);af[n]={c:VA(t[o],a,r),e:r}}var c=m0e({},af[n].e);return u0e(af[n].c+\";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=\"+e.toString()+\"}\",n,c,f0e(c),i)},\"wrkr\"),g0e=s(function(){return[Ti,Gs,UA,jx,Ax,qA,Tx,WA,YA,XA,sf,QA,mc,rf,ba,of,ZA,lf,Ai,$A,Cx,eT,tT]},\"bInflt\");var eT=s(function(t){return postMessage(t,[t.buffer])},\"pbf\"),tT=s(function(t){return t&&{out:t.size&&new Ti(t.size),dictionary:t.dictionary}},\"gopt\"),_0e=s(function(t,e,n,i,a,r){var o=h0e(n,i,a,function(l,c){o.terminate(),r(l,c)});return o.postMessage([t,e],e.consume?[t.buffer]:[]),function(){o.terminate()}},\"cbify\");var Ir=s(function(t,e){return t[e]|t[e+1]<<8},\"b2\"),Ha=s(function(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0},\"b4\"),Ex=s(function(t,e){return Ha(t,e)+Ha(t,e+4)*4294967296},\"b8\");function x0e(t,e,n){return n||(n=e,e={}),typeof n!=\"function\"&&Ai(7),_0e(t,e,[g0e],function(i){return eT(Cx(i.data[0],tT(i.data[1])))},1,n)}s(x0e,\"inflate\");function Cx(t,e){return $A(t,{i:2},e&&e.out,e&&e.dictionary)}s(Cx,\"inflateSync\");var kx=typeof TextDecoder<\"u\"&&new TextDecoder,v0e=0;try{kx.decode(p0e,{stream:!0}),v0e=1}catch{}var b0e=s(function(t){for(var e=\"\",n=0;;){var i=t[n++],a=(i>127)+(i>223)+(i>239);if(n+a>t.length)return{s:e,r:lf(t,n-1)};a?a==3?(i=((i&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|i>>10,56320|i&1023)):a&1?e+=String.fromCharCode((i&31)<<6|t[n++]&63):e+=String.fromCharCode((i&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(i)}},\"dutf8\");function y0e(t,e){if(e){for(var n=\"\",i=0;i<t.length;i+=16384)n+=String.fromCharCode.apply(null,t.subarray(i,i+16384));return n}else{if(kx)return kx.decode(t);var a=b0e(t),r=a.s,n=a.r;return n.length&&Ai(8),r}}s(y0e,\"strFromU8\");var w0e=s(function(t,e){return e+30+Ir(t,e+26)+Ir(t,e+28)},\"slzh\"),E0e=s(function(t,e,n){var i=Ir(t,e+28),a=y0e(t.subarray(e+46,e+46+i),!(Ir(t,e+8)&2048)),r=e+46+i,o=Ha(t,e+20),l=n&&o==4294967295?k0e(t,r):[o,Ha(t,e+24),Ha(t,e+42)],c=l[0],d=l[1],u=l[2];return[Ir(t,e+10),c,d,a,r+Ir(t,e+30)+Ir(t,e+32),u]},\"zh\"),k0e=s(function(t,e){for(;Ir(t,e)!=1;e+=4+Ir(t,e+2));return[Ex(t,e+12),Ex(t,e+4),Ex(t,e+20)]},\"z64e\");var zA=typeof queueMicrotask==\"function\"?queueMicrotask:typeof setTimeout==\"function\"?setTimeout:function(t){t()};function nT(t,e,n){n||(n=e,e={}),typeof n!=\"function\"&&Ai(7);var i=[],a=s(function(){for(var _=0;_<i.length;++_)i[_]()},\"tAll\"),r={},o=s(function(_,h){zA(function(){n(_,h)})},\"cbd\");zA(function(){o=n});for(var l=t.length-22;Ha(t,l)!=101010256;--l)if(!l||t.length-l>65558)return o(Ai(13,0,1),null),a;var c=Ir(t,l+8);if(c){var d=c,u=Ha(t,l+16),p=u==4294967295||d==65535;if(p){var m=Ha(t,l-12);p=Ha(t,m)==101075792,p&&(d=c=Ha(t,m+32),u=Ha(t,m+48))}for(var f=e&&e.filter,g=s(function(_){var h=E0e(t,u,p),v=h[0],b=h[1],y=h[2],w=h[3],S=h[4],F=h[5],N=w0e(t,F);u=S;var k=s(function(D,B){D?(a(),o(D,null)):(B&&(r[w]=B),--c||o(null,r))},\"cbl\");if(!f||f({name:w,size:b,originalSize:y,compression:v}))if(!v)k(null,lf(t,N,N+b));else if(v==8){var R=t.subarray(N,N+b);if(y<524288||b>.8*y)try{k(null,Cx(R,{out:new Ti(y)}))}catch(D){k(D,null)}else i.push(x0e(R,{size:y},k))}else k(Ai(14,\"unknown compression type \"+v,1),null);else k(null,null)},\"_loop_3\"),x=0;x<d;++x)g(x)}else o(null,{});return a}s(nT,\"unzip\");function j0e(t){let e,n,i,a,r,o,l,c,d,u,p,m;return{c(){e=L(\"p\"),e.textContent=\"Create advanced animated models for Vanilla Java Edition\",n=J(),i=L(\"p\"),i.innerHTML=`<b>Target</b>:\n\t<span>Minecraft: Java Edition</span>`,a=J(),r=L(\"h3\"),r.innerHTML='<p class=\"markdown\">Getting Started</p>',o=J(),l=L(\"p\"),l.innerHTML='<a href=\"https://animated-java.dev/docs/getting-started/creating-a-blueprint\">Check out the Docs</a> to learn how to use Animated Java.',c=J(),d=L(\"div\"),u=L(\"button\"),u.innerHTML=`<i class=\"material-icons\">arrow_forward</i>\n\t\tCreate new AJ Blueprint`,E(e,\"class\",\"format_description\"),E(i,\"class\",\"format_target\"),E(r,\"class\",\"markdown\"),E(u,\"class\",\"svelte-16p5p64\"),E(d,\"class\",\"button_bar\")},m(f,g){U(f,e,g),U(f,n,g),U(f,i,g),U(f,a,g),U(f,r,g),U(f,o,g),U(f,l,g),U(f,c,g),U(f,d,g),I(d,u),p||(m=Ue(u,\"click\",t[0]),p=!0)},p:ie,i:ie,o:ie,d(f){f&&z(e),f&&z(n),f&&z(i),f&&z(a),f&&z(r),f&&z(o),f&&z(l),f&&z(c),f&&z(d),p=!1,m()}}}s(j0e,\"create_fragment\");function A0e(t){return[s(()=>aT(),\"click_handler\")]}s(A0e,\"instance\");var cf=class extends Pe{constructor(e){super(),Ve(this,e,A0e,j0e,De,{})}};s(cf,\"FormatPage\");var iT=cf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"button.svelte-16p5p64{width:100%;height:40px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var rT='data:image/svg+xml,<svg width=\"512\" height=\"512\" viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<rect width=\"512\" height=\"512\" fill=\"%23AB44CF\"/>%0D%0A<g filter=\"url(%23filter0_d_207_2)\">%0D%0A<path d=\"M277.332 456L256.396 445.31V304.998L277.332 294.753L297.822 304.998L277.332 315.243V456Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M297.822 445.755L277.332 456V315.243L297.822 304.998V445.755Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M276.886 456L255.951 445.31V304.998M276.886 456L297.376 445.755V304.998M276.886 456V315.243M255.951 304.998L276.886 315.243M255.951 304.998L276.886 294.753L297.376 304.998M276.886 315.243L297.376 304.998\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M235.461 435.51L214.526 424.82V284.508L235.461 274.263L255.951 284.508L235.461 294.753V435.51Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M255.951 425.265L235.461 435.51V294.753L255.951 284.508V425.265Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M235.461 435.51L214.526 424.82V284.508M235.461 435.51L255.951 425.265V284.508M235.461 435.51V294.753M214.526 284.508L235.461 294.753M214.526 284.508L235.461 274.263L255.951 284.508M235.461 294.753L255.951 284.508\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M287.577 295.644V320.588L203.835 279.163V254.218L224.771 243.528L308.067 284.953L287.577 295.644Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M287.577 320.588V295.644L308.067 284.953V310.788L287.577 320.588Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M308.067 284.953V310.788L287.577 320.588M308.067 284.953L287.577 295.644M308.067 284.953L224.771 243.528L203.835 254.218M287.577 295.644V320.588M287.577 295.644L203.835 254.218M287.577 320.588L203.835 279.163V254.218\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M297.822 190.967L277.332 201.212V290.298L256.396 280.053V190.967L277.332 180.722L297.822 190.967Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M297.822 190.967L277.332 201.212V290.298L297.822 280.053V190.967Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M276.886 201.212L297.376 190.967M276.886 201.212L255.951 190.967M276.886 201.212V290.298M297.376 190.967L276.886 180.722L255.951 190.967M297.376 190.967V280.053L276.886 290.298M255.951 190.967V280.053L276.886 290.298\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M255.951 170.477L235.461 180.722V269.808L214.526 259.563V170.477L235.461 160.232L255.951 170.477Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M255.951 170.477L235.461 180.722V269.808L255.951 259.563V170.477Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M235.461 180.722L255.951 170.477M235.461 180.722L214.526 170.477M235.461 180.722V269.808M255.951 170.477L235.461 160.232L214.526 170.477M255.951 170.477V259.563L235.461 269.808M214.526 170.477V259.563L235.461 269.808\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M333.011 166.022L302.722 181.613V219.474L178 157.559V119.252L209.18 103.216L333.011 166.022Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M333.011 166.022L302.722 181.612V219.474L333.011 203.884V166.022Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M302.722 181.613L333.011 166.022M302.722 181.613V219.474M302.722 181.613L178 119.252M333.011 166.022V203.884L302.722 219.474M333.011 166.022L209.18 103.216L178 119.252M302.722 219.474L178 157.559V119.252\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M255.951 76.49V153.105L235.016 142.414V66.245L255.951 56L276.886 66.245L255.951 76.49Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M255.951 153.105V76.49L276.886 66.245V142.414L255.951 153.105Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M255.951 76.49V153.105M255.951 76.49L235.016 66.245M255.951 76.49L276.886 66.245M255.951 153.105L235.016 142.414V66.245M255.951 153.105L276.886 142.414V66.245M235.016 66.245L255.951 56L276.886 66.245\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A</g>%0D%0A<defs>%0D%0A<filter id=\"filter0_d_207_2\" x=\"175\" y=\"49\" width=\"175.011\" height=\"414\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">%0D%0A<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>%0D%0A<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>%0D%0A<feOffset dx=\"10\"/>%0D%0A<feGaussianBlur stdDeviation=\"2\"/>%0D%0A<feComposite in2=\"hardAlpha\" operator=\"out\"/>%0D%0A<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>%0D%0A<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_207_2\"/>%0D%0A<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_207_2\" result=\"shape\"/>%0D%0A</filter>%0D%0A</defs>%0D%0A</svg>%0D%0A';var ya='data:image/svg+xml,<svg width=\"512\" height=\"512\" viewBox=\"0 0 512 512\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A%09<rect width=\"512\" height=\"512\" fill=\"%2300ACED\" />%0D%0A%09<g class=\"armor-stand-all\">%0D%0A%09%09<g class=\"armor-stand-left-leg\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M277.332 456L256.396 445.31V304.998L277.332 294.753L297.822 304.998L277.332 315.243V456Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M297.822 445.755L277.332 456V315.243L297.822 304.998V445.755Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M276.886 456L255.951 445.31V304.998M276.886 456L297.376 445.755V304.998M276.886 456V315.243M255.951 304.998L276.886 315.243M255.951 304.998L276.886 294.753L297.376 304.998M276.886 315.243L297.376 304.998\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-right-leg\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M235.461 435.51L214.526 424.82V284.508L235.461 274.263L255.951 284.508L235.461 294.753V435.51Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M255.951 425.265L235.461 435.51V294.753L255.951 284.508V425.265Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M235.461 435.51L214.526 424.82V284.508M235.461 435.51L255.951 425.265V284.508M235.461 435.51V294.753M214.526 284.508L235.461 294.753M214.526 284.508L235.461 274.263L255.951 284.508M235.461 294.753L255.951 284.508\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-waist\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M287.577 295.644V320.588L203.835 279.163V254.218L224.771 243.528L308.067 284.953L287.577 295.644Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M287.577 320.588V295.644L308.067 284.953V310.788L287.577 320.588Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M308.067 284.953V310.788L287.577 320.588M308.067 284.953L287.577 295.644M308.067 284.953L224.771 243.528L203.835 254.218M287.577 295.644V320.588M287.577 295.644L203.835 254.218M287.577 320.588L203.835 279.163V254.218\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-left-side\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M297.822 190.967L277.332 201.212V290.298L256.396 280.053V190.967L277.332 180.722L297.822 190.967Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M297.822 190.967L277.332 201.212V290.298L297.822 280.053V190.967Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M276.886 201.212L297.376 190.967M276.886 201.212L255.951 190.967M276.886 201.212V290.298M297.376 190.967L276.886 180.722L255.951 190.967M297.376 190.967V280.053L276.886 290.298M255.951 190.967V280.053L276.886 290.298\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-right-side\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M255.951 170.477L235.461 180.722V269.808L214.526 259.563V170.477L235.461 160.232L255.951 170.477Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M255.951 170.477L235.461 180.722V269.808L255.951 259.563V170.477Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M235.461 180.722L255.951 170.477M235.461 180.722L214.526 170.477M235.461 180.722V269.808M255.951 170.477L235.461 160.232L214.526 170.477M255.951 170.477V259.563L235.461 269.808M214.526 170.477V259.563L235.461 269.808\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-shoulder\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M333.011 166.022L302.722 181.612V219.474L178 157.559V119.252L209.18 103.216L333.011 166.022Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M333.011 166.022L302.722 181.612V219.474L333.011 203.884V166.022Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M302.722 181.612L333.011 166.022M302.722 181.612V219.474M302.722 181.612L178 119.252M333.011 166.022V203.884L302.722 219.474M333.011 166.022L209.18 103.216L178 119.252M302.722 219.474L178 157.559V119.252\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09%09<g class=\"armor-stand-head\">%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M255.951 76.49V153.105L235.016 142.414V66.245L255.951 56L276.886 66.245L255.951 76.49Z\"%0D%0A%09%09%09%09fill=\"%23BFBFBF\" />%0D%0A%09%09%09<path d=\"M255.951 153.105V76.49L276.886 66.245V142.414L255.951 153.105Z\"%0D%0A%09%09%09%09fill=\"%23818181\" />%0D%0A%09%09%09<path%0D%0A%09%09%09%09d=\"M255.951 76.49V153.105M255.951 76.49L235.016 66.245M255.951 76.49L276.886 66.245M255.951 153.105L235.016 142.414V66.245M255.951 153.105L276.886 142.414V66.245M235.016 66.245L255.951 56L276.886 66.245\"%0D%0A%09%09%09%09stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\" stroke-linecap=\"round\" />%0D%0A%09%09</g>%0D%0A%09</g>%0D%0A%09<defs>%0D%0A%0D%0A%09</defs>%0D%0A</svg>';function S0e(t){let e,n;return{c(){e=L(\"img\"),Ht(e.src,n=ya)||E(e,\"src\",n),E(e,\"alt\",\"\"),E(e,\"class\",\"svelte-uye5l3\")},m(i,a){U(i,e,a)},p:ie,d(i){i&&z(e)}}}s(S0e,\"create_else_block\");function O0e(t){let e,n;return{c(){e=L(\"img\"),Ht(e.src,n=rT)||E(e,\"src\",n),E(e,\"alt\",\"\"),E(e,\"class\",\"svelte-uye5l3\")},m(i,a){U(i,e,a)},p:ie,d(i){i&&z(e)}}}s(O0e,\"create_if_block\");function I0e(t){let e;function n(r,o){return r[1]?O0e:S0e}s(n,\"select_block_type\");let i=n(t,-1),a=i(t);return{c(){a.c(),e=_t()},m(r,o){a.m(r,o),U(r,e,o)},p(r,[o]){i===(i=n(r,o))&&a?a.p(r,o):(a.d(1),a=i(r),a&&(a.c(),a.m(e.parentNode,e)))},i:ie,o:ie,d(r){a.d(r),r&&z(e)}}}s(I0e,\"create_fragment\");function D0e(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(o,l=>n(1,i=l)),o),\"$$subscribe_pluginMode\");t.$$.on_destroy.push(()=>a());let{pluginMode:o}=e;return r(),t.$$set=l=>{\"pluginMode\"in l&&r(n(0,o=l.pluginMode))},[o,i]}s(D0e,\"instance\");var uf=class extends Pe{constructor(e){super(),Ve(this,e,D0e,I0e,De,{pluginMode:0})}};s(uf,\"ProjectTitle\");var oT=uf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"img.svelte-uye5l3{width:20px;height:20px;margin-top:2px;margin-right:2px;border-radius:2px;box-shadow:1px 1px 1px #000000aa}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Ws=class{map;constructor(){this.map=new Map}add(e,n){this.map.set(e,n)}get(e){return this.map.get(e)}has(e){return this.map.has(e)}delete(e){this.map.delete(e)}getMappedTexture(e){let n=this.map.get(e instanceof Texture?e.uuid:e);return Texture.all.find(i=>i.uuid===n)}setMappedTexture(e,n){this.map.set(e.uuid,n.uuid)}toJSON(){return Object.fromEntries(this.map)}static fromJSON(e){let n=new Ws;for(let[i,a]of Object.entries(e))n.add(i,a);return n}copy(){let e=new Ws;return e.map=new Map(this.map),e}verifyTextures(){for(let[e,n]of this.map)Texture.all.some(i=>i.uuid===n)||this.map.delete(e)}};s(Ws,\"TextureMap\");var rn=class{id;displayName;name;uuid;textureMap;isDefault=!1;generateNameFromDisplayName=!0;excludedNodes=[];constructor(e,n=!1){if(this.displayName=rn.makeDisplayNameUnique(this,e),this.name=rn.makeNameUnique(this,this.displayName),this.isDefault=n,this.uuid=guid(),this.textureMap=new Ws,this.id=rn.all.length,this.isDefault){if(rn.hasDefault())throw new Error(\"There can only be one default variant!\");this.displayName=\"Default\",this.name=\"default\"}rn.all.push(this),K.CREATE_VARIANT.publish(this)}select(){rn.selected&&rn.selected.unselect(),rn.selected=this,Canvas.updateAllFaces(),K.SELECT_VARIANT.publish(this)}unselect(){rn.selected=void 0}delete(){if(this.isDefault)return;let e=rn.all.indexOf(this);e>-1&&rn.all.splice(e,1),rn.selected===this&&(this.unselect(),rn.selectDefault()),K.DELETE_VARIANT.publish(this)}toJSON(){let e={name:this.name,display_name:this.displayName,uuid:this.uuid,texture_map:Object.fromEntries(this.textureMap.map),excluded_nodes:this.excludedNodes.map(n=>n.value)};return this.isDefault&&(e.is_default=!0),e}duplicate(){let e=new rn(this.displayName,!1);e.uuid=guid(),e.isDefault=!1,e.generateNameFromDisplayName=this.generateNameFromDisplayName,e.textureMap=this.textureMap.copy(),e.excludedNodes=this.excludedNodes.map(n=>({...n})),e.select()}verifyTextureMap(){this.textureMap.verifyTextures()}static fromJSON(e,n=!1){let i=new rn(e.display_name,n);if(i.uuid=e.uuid,e.is_default)return i;for(let[a,r]of Object.entries(e.texture_map))i.textureMap.add(a,r);return i.excludedNodes=e.excluded_nodes.map(a=>{let r=Group.all.find(o=>o.uuid===a);return r?{name:r.name,value:a}:void 0}).filter(Boolean),i}static makeDisplayNameUnique(e,n){if(!rn.all.some(o=>o!==e&&o.displayName===n))return n;let i=1,a=/\\d+$/.exec(n);a&&(i=parseInt(a[0]),n=n.slice(0,-a[0].length));let r=1e3;for(;r-- >0;){let o=`${n}${i}`;if(!rn.all.some(l=>l!==e&&l.displayName===o))return o;i++}throw new Error(\"Could not make Variant display name unique!\")}static makeNameUnique(e,n){if(n=Kt(n),!rn.all.some(o=>o!==e&&o.name===n))return n;let i=1,a=/\\d+$/.exec(n);a&&(i=parseInt(a[0]),n=n.slice(0,-a[0].length));let r=1e3;for(;r-- >0;){let o=`${n}${i}`;if(!rn.all.some(l=>l!==e&&l.name===o))return o;i++}throw new Error(\"Could not make Variant name unique!\")}static selectDefault(){rn.getDefault().select()}static getByUUID(e){return rn.all.find(n=>n.uuid===e)}static allExcludingDefault(){return rn.all.filter(e=>!e.isDefault)}static hasDefault(){return rn.all.some(e=>e.isDefault)}static getDefault(){return rn.all.find(e=>e.isDefault)??new rn(\"Default\",!0)}},qe=rn;s(qe,\"Variant\"),lt(qe,\"all\",[]),lt(qe,\"selected\");K.SELECT_PROJECT.subscribe(t=>{t.variants??=[],qe.all=t.variants});K.UNSELECT_PROJECT.subscribe(()=>{qe.all=[]});var df=s(class{item;index=-1;string;itemCode;line=1;column=0;lineStart=0;lines=[{number:1,startIndex:0,content:\"\"}];constructor(t){this.string=t,this.consume()}get length(){return this.string.length}get progress(){return Math.min(this.index/this.length,1)}get next(){return this.string.at(this.index+1)}get nextCode(){return this.string.charCodeAt(this.index+1)}get currentLine(){return this.lines[this.line-1]}look(t,e=1){return this.string.slice(this.index+t,this.index+t+e)}consume(){let t=this.item;this.item&&(this.currentLine.content+=this.item),this.item=this.string.at(this.index+1),this.itemCode=this.item?.charCodeAt(0),this.index++,this.column++,(t===`\n`||t!=null&&this.item==null)&&this.completeLine()}consumeN(t){for(let e=0;e<t;e++)this.consume()}consumeWhile(t){for(;this.item&&t(this);)this.consume()}collect(){let t=this.item;return this.consume(),t}collectN(t){let e=\"\";for(let n=0;n<t;n++)e+=this.collect();return e}collectWhile(t){let e=\"\";for(;this.item&&t(this);)e+=this.collect();return e}seek(t,e=1/0){if(e=Math.min(this.index+e,this.length),typeof t==\"function\")for(let n=this.index;n<e;n++){let i=this.string.at(n);if(t(i))return n}else for(let n=this.index;n<e;n++)if(this.string.at(n)===t)return n}lineNumberToIndex(t){return t-1}completeLine(){this.line++,this.column=1,this.lines.push({number:this.line,startIndex:this.index,content:\"\"})}},\"r\");function Ja(t,e){return Math.round(t*10**e)/10**e}s(Ja,\"roundTo\");function Dr(t,e){return Math.round(t*e)/e}s(Dr,\"roundToNth\");function sT(t){t.x===0&&(t.x=1e-5),t.y===0&&(t.y=1e-5),t.z===0&&(t.z=1e-5)}s(sT,\"makeNotZero\");function Ks(t){for(let e in t)t[e]===void 0?delete t[e]:typeof t[e]==\"object\"&&Ks(t[e]);return t}s(Ks,\"scrubUndefined\");function pf(t){let e=new THREE.Euler().setFromQuaternion(t,\"YXZ\"),n=new THREE.Vector3(e.x,e.y,e.z).multiplyScalar(180/Math.PI);return n.x*=-1,n.y=n.y*-1+180,n}s(pf,\"eulerFromQuaternion\");var pi=class{constructor(e){this.name=e}startTime;endTime;duration;start(){if(this.startTime!==void 0)throw new Error(\"Stopwatch already started\");return this.startTime=performance.now(),this}debug(...e){this.stop();let n=this.createMessage();return e.length>0&&(n[0]+=`\n`),console.log(...n,...e),this}stop(){if(this.startTime===void 0)throw new Error(\"Stopwatch not started\");return this.endTime=performance.now(),this.duration=this.endTime-this.startTime,this.duration}createMessage(){let e=this.duration===void 0?\"Not finished\":`${Ja(this.duration,5)}ms`;return[`%c\\u23F1\\uFE0F ${this.name}%c: %c${e}`,\"color: #FFFF55\",\"color: #AAAAAA\",\"color: #55FFFF\"]}static function(e,n){return(...i)=>{let a=new pi(e).start(),r=n(...i);return r instanceof Promise?r.finally(a.debug.bind(a)):(a.debug(),r)}}static promise(e,n){let i=new pi(e).start();return n.finally(i.debug.bind(i))}};s(pi,\"Stopwatch\");var gd=class{constructor(e){this.minecraftVersion=e;fc(this.minecraftVersion,\"1.21.5\")>=0&&(this.enabledFeatures&=-2,this.enabledFeatures&=-3)}enabledFeatures=3;stringify(e){return this.stringifyTextElement(e)}stringifyString(e){e=e.replaceAll(`\n`,\"\\\\n\"),this.enabledFeatures&2&&(e=e.replaceAll(\"\\\\s\",\" \"));let n=e.replace(/\\\\'/g,\"'\").replace(/\\\\\"/g,'\"'),i=n.includes(\"'\"),a=n.includes('\"');return this.enabledFeatures&1?`\"${n.replace(/\"/g,'\\\\\"')}\"`:i&&a?`'${n.replace(/'/g,\"\\\\'\")}'`:i?`\"${n.replace(/\"/g,'\\\\\"')}\"`:`'${n.replace(/'/g,\"\\\\'\")}'`}stringifyTextElementArray(e){return`[${e.map(n=>this.stringifyTextElement(n)).join(\",\")}]`}stringifyScoreObject(e){return this.enabledFeatures&1?`{\"name\":${this.stringifyString(e.name)},\"objective\":${this.stringifyString(e.objective)}}`:`{name:${this.stringifyString(e.name)},objective:${this.stringifyString(e.objective)}}`}stringifyPlayerObject(e){let n=this.enabledFeatures&1?'\"':\"\",i=[];if(e.name!==void 0&&i.push(`${n}name${n}:${this.stringifyString(e.name)}`),e.id!==void 0&&i.push(`${n}id${n}:${JSON.stringify(e.id)}`),e.texture!==void 0&&i.push(`${n}texture${n}:${e.texture}`),e.cape!==void 0&&i.push(`${n}cape${n}:${e.cape}`),e.model!==void 0&&i.push(`${n}model${n}:${this.stringifyString(e.model)}`),e.hat!==void 0&&i.push(`${n}hat${n}:${e.hat}`),e.properties!==void 0)for(let a of e.properties)i.push(`{name:${this.stringifyString(a.name)},value:${this.stringifyString(a.value)}`+(a.signature===void 0?\"\":`,signature:${this.stringifyString(a.signature)}`)+\"}\");return\"{\"+i.join(\",\")+\"}\"}stringifyLegacyHoverEvent(e){switch(e.action){case\"show_text\":return`{\"action\":\"show_text\",\"contents\":${this.stringifyTextElement(e.contents)}}`;case\"show_item\":{let n='{\"action\":\"show_item\",\"contents\":';return typeof e.contents==\"string\"?n+=this.stringifyString(e.contents):(n+='{\"id\":'+this.stringifyString(e.contents.id),e.contents.count!==void 0&&(n+=`,\"count\":${e.contents.count}`),e.contents.tag!==void 0&&(n+=`,\"tag\":${this.stringifyTextElement(e.contents.tag)}`)),n+\"}}\"}case\"show_entity\":{let n=`{\"action\":\"show_entity\",\"contents\":{\"type\":${this.stringifyString(e.contents.type)}`;return Array.isArray(e.contents.id)?n+=`,\"id\":[${e.contents.id.join(\",\")}]`:typeof e.contents.id==\"string\"&&(n+=`,\"id\":${this.stringifyString(e.contents.id)}`),e.contents.name!==void 0&&(n+=`,\"name\":${this.stringifyTextElement(e.contents.name)}`),n+\"}}\"}}}stringifyModernHoverEvent(e){switch(e.action){case\"show_text\":return`{action:show_text,value:${this.stringifyTextElement(e.value)}}`;case\"show_item\":{let n=`{action:show_item,id:${this.stringifyString(e.id)}`;return e.count!==void 0&&(n+=`,count:${e.count}`),n+\"}\"}case\"show_entity\":{let n=`{action:show_entity,id:${this.stringifyString(e.id)}`;return e.name!==void 0&&(n+=`,name:${this.stringifyTextElement(e.name)}`),Array.isArray(e.uuid)?n+=`,uuid:[I;${e.uuid.join(\",\")}]`:typeof e.uuid==\"string\"&&(n+=`,uuid:${this.stringifyString(e.uuid)}`),n+\"}\"}}}stringifyLegacyClickEvent(e){return`{\"action\":\"${e.action}\",\"value\":${this.stringifyString(e.value)}}`}stringifyModernClickEvent(e){switch(e.action){case\"open_url\":return`{action:open_url,url:${this.stringifyString(e.url)}}`;case\"open_file\":return`{action:open_file,path:${this.stringifyString(e.path)}}`;case\"run_command\":return`{action:run_command,command:${this.stringifyString(e.command)}}`;case\"suggest_command\":return`{action:suggest_command,command:${this.stringifyString(e.command)}}`;case\"copy_to_clipboard\":return`{action:copy_to_clipboard,value:${this.stringifyString(e.value)}}`;case\"change_page\":return`{action:change_page,page:${e.page}}`;case\"show_dialog\":throw new Error(\"show_dialog click events are not supported in text displays\");case\"custom\":let n=`{action:custom,id:${this.stringifyString(e.id)}`;return e.payload!==void 0&&(n+=`,payload:${this.stringifyTextElement(e.payload)}`),n+\"}\"}}stringifyTextObject(e){let n=[];for(let i of Object.keys(e)){if(e[i]===void 0)continue;let a=this.enabledFeatures&1?'\"':\"\",r=a+i+a;switch(i){case\"type\":case\"text\":case\"translate\":case\"fallback\":case\"keybind\":case\"nbt\":case\"source\":case\"block\":case\"entity\":case\"storage\":case\"selector\":case\"font\":case\"insertion\":case\"object\":case\"sprite\":case\"atlas\":case\"color\":n.push(`${r}:${this.stringifyString(e[i])}`);break;case\"shadow_color\":if(Array.isArray(e[i])){n.push(`${r}:${JSON.stringify(e[i])}`);break}case\"bold\":case\"italic\":case\"obfuscated\":case\"strikethrough\":case\"underlined\":case\"interpret\":n.push(`${r}:${e[i]}`);break;case\"with\":case\"extra\":case\"separator\":n.push(`${r}:${this.stringifyTextElement(e[i])}`);break;case\"score\":n.push(`${r}:${this.stringifyScoreObject(e[i])}`);break;case\"player\":n.push(`${r}:${this.stringifyPlayerObject(e[i])}`);break;case\"clickEvent\":n.push(`${r}:${this.stringifyLegacyClickEvent(e[i])}`);break;case\"click_event\":n.push(`${r}:${this.stringifyModernClickEvent(e[i])}`);break;case\"hoverEvent\":n.push(`${r}:${this.stringifyLegacyHoverEvent(e[i])}`);break;case\"hover_event\":n.push(`${r}:${this.stringifyModernHoverEvent(e[i])}`);break;default:console.warn(`Unknown key in TextObject: '${i}'`);break}}return`{${n.join(\",\")}}`}stringifyTextElement(e){if(typeof e==\"string\")return this.stringifyString(e);if(Array.isArray(e))return this.stringifyTextElementArray(e);if(typeof e==\"object\"&&e!==null)return this.stringifyTextObject(e);throw console.error(e),new Error(\"Invalid TextElement\")}};s(gd,\"JsonTextStringifier\");var Sx=(c=>(c.BOLD=\"bold\",c.ITALIC=\"italic\",c.UNDERLINED=\"underlined\",c.STRIKETHROUGH=\"strikethrough\",c.OBFUSCATED=\"obfuscated\",c.COLOR=\"color\",c.FONT=\"font\",c.SHADOW_COLOR=\"shadow_color\",c))(Sx||{}),Ox=(l=>(l.TEXT=\"text\",l.TRANSLATABLE=\"translatable\",l.SCORE=\"score\",l.SELECTOR=\"selector\",l.KEYBIND=\"keybind\",l.NBT=\"nbt\",l.OBJECT=\"object\",l))(Ox||{}),_d=(c=>(c.TEXT=\"text\",c.TRANSLATE=\"translate\",c.SCORE=\"score\",c.SELECTOR=\"selector\",c.KEYBIND=\"keybind\",c.NBT=\"nbt\",c.SPRITE=\"sprite\",c.PLAYER=\"player\",c))(_d||{});var vo={dark_red:\"#AA0000\",red:\"#FF5555\",gold:\"#FFAA00\",yellow:\"#FFFF55\",dark_green:\"#00AA00\",green:\"#55FF55\",aqua:\"#55FFFF\",dark_aqua:\"#00AAAA\",dark_blue:\"#0000AA\",blue:\"#5555FF\",light_purple:\"#FF55FF\",dark_purple:\"#AA00AA\",white:\"#FFFFFF\",gray:\"#AAAAAA\",dark_gray:\"#555555\",black:\"#000000\"},Ix=(c=>(c.ID=\"id\",c.URL=\"url\",c.PATH=\"path\",c.COMMAND=\"command\",c.PAGE=\"page\",c.VALUE=\"value\",c.DIALOG=\"dialog\",c.PAYLOAD=\"payload\",c))(Ix||{}),ia=class{isJsonTextClass=!0;content;constructor(e){this.content=e}toString(e=!0,n=ia.defaultMinecraftVersion){let i=e?this.flatten():this.content;return new gd(n).stringify(i)}toJSON(){return structuredClone(this.content)}flatten(e=!1){let n=[],i=s((a,r={})=>{let o=ia.getComponentStyle(a,r),l=n[n.length-1];switch(!0){case Array.isArray(a):{for(let c of a)i(c,o);break}case typeof a==\"string\":if(typeof l==\"string\"&&ia.hasSameStyle(o,r)){n[n.length-1]=l+a;break}else if(typeof l==\"object\"&&l.text!==void 0&&ia.hasSameStyle(o,l)){l.text+=a;break}if(!e&&ia.hasSameStyle(o,r)){n.push(a);break}n.push({...r,text:a});break;case typeof a==\"object\":{let c=ia.getComponentStyle(a,r),d={...a};delete d.with,delete d.extra,n.push({...c,...d});let{with:u=[],extra:p=[]}=a;u.length>0&&i(u,c),p.length>0&&i(p,c);break}default:console.warn(\"Unknown component type in flatten:\",a);break}},\"processComponent\");return i(this.content),n}static getComponentStyle(e,n=ia.defaultStyle){switch(!0){case Array.isArray(e):return e.length===0?{...n}:ia.getComponentStyle(e[0],n);case typeof e==\"string\":return{...n};case typeof e==\"object\":{let i={...n};for(let a of Object.values(Sx))e[a]!==void 0&&(i[a]=e[a]);return i}default:return console.warn(\"Unknown component type in getComponentStyle:\",e),{...n}}}static hasSameStyle(e,n){for(let i of Object.values(Sx))if(e[i]!==n[i])return!1;return!0}static intToRgba(e){let n=e>>24&255,i=e>>16&255,a=e>>8&255,r=e&255;return[i/255,a/255,r/255,n/255]}static rgbaToInt([e,n,i,a]){return e=Math.floor(e*255),n=Math.floor(n*255),i=Math.floor(i*255),a=Math.floor(a*255),a<<24|e<<16|n<<8|i}static intToHex8(e){return`#${(e>>>0).toString(16).padStart(8,\"0\")}`}static hexToRgba(e){return ia.intToRgba(ia.hexToInt(e))}static moveHex8AlphaToStart(e){return\"#\"+e.slice(-2)+e.slice(1,-2)}static hexToInt(e){if(!e.startsWith(\"#\")||e.length!==7&&e.length!==9)throw new Error(\"Invalid hex color format. Expected #RRGGBB or #AARRGGBB.\");e.length===7&&(e=\"#ff\"+e.slice(1));let n=parseInt(e.slice(1),16);return n>2147483647?n-4294967296:n}static getColor(e){if(Array.isArray(e))return tinycolor({r:e[0]*255,g:e[1]*255,b:e[2]*255,a:e[3]??1*255});if(typeof e==\"number\"){let n=ia.intToRgba(e);return tinycolor({r:n[0]*255,g:n[1]*255,b:n[2]*255,a:n[3]*255})}else return e.startsWith(\"#\")?tinycolor(e):e in vo?tinycolor(vo[e]):(console.warn(\"Unknown color:\",e),tinycolor(\"white\"))}static fromString(e,n){return new Yn(n).parse(e)}},jt=ia;s(jt,\"JsonText\"),lt(jt,\"defaultStyle\",{color:\"white\"}),lt(jt,\"defaultMinecraftVersion\",\"1.21.9\");var lT=(v=>(v[v.LITERAL_KEYS=1]=\"LITERAL_KEYS\",v[v.LITERAL_STRINGS=2]=\"LITERAL_STRINGS\",v[v.SINGLE_QUOTES=4]=\"SINGLE_QUOTES\",v[v.TRAILING_COMMAS=8]=\"TRAILING_COMMAS\",v[v.OPTIONAL_COMMAS=16]=\"OPTIONAL_COMMAS\",v[v.MODERN_EVENT_FORMAT=32]=\"MODERN_EVENT_FORMAT\",v[v.CLICK_EVENT_ACTION_SHOW_DIALOG=64]=\"CLICK_EVENT_ACTION_SHOW_DIALOG\",v[v.TEXT_OBJECT_TYPE_OBJECT=128]=\"TEXT_OBJECT_TYPE_OBJECT\",v[v.SHADOW_COLOR=256]=\"SHADOW_COLOR\",v[v.SHADOW_COLOR_ACCEPTS_STRING=512]=\"SHADOW_COLOR_ACCEPTS_STRING\",v[v.SPACE_ESCAPE_SEQUENCE=1024]=\"SPACE_ESCAPE_SEQUENCE\",v[v.HEX_ESCAPE_SEQUENCE=2048]=\"HEX_ESCAPE_SEQUENCE\",v[v.EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE=4096]=\"EIGHT_DIGIT_UNICODE_ESCAPE_SEQUENCE\",v[v.NAMED_UNICODE_ESCAPE_SEQUENCE=8192]=\"NAMED_UNICODE_ESCAPE_SEQUENCE\",v[v.IMPLICIT_TEXT_KEY=16384]=\"IMPLICIT_TEXT_KEY\",v[v.TEXT_OBJECT_INFERRED_KEYS=32768]=\"TEXT_OBJECT_INFERRED_KEYS\",v[v.ALLOW_CLICK_EVENTS=65536]=\"ALLOW_CLICK_EVENTS\",v[v.ALLOW_HOVER_EVENTS=131072]=\"ALLOW_HOVER_EVENTS\",v))(lT||{});function fc(t,e){let n=t.split(\".\").map(Number),i=e.split(\".\").map(Number);for(let a=0;a<Math.max(n.length,i.length);a++){let r=n[a]??0,o=i[a]??0;if(r>o)return 1;if(r<o)return-1}return 0}s(fc,\"compareVersions\");var Ys=class extends Error{constructor(e){super(e),this.name=\"JsonTextParserError\"}};s(Ys,\"JsonTextParserError\");var Ko=class extends Error{originalMessage;stream;child;line;column;pointerLength;constructor(e,n,{child:i,line:a=n.line,column:r=n.column,pointerLength:o=1}={}){if(super(e),this.name=\"JsonTextSyntaxError\",this.stream=n,this.child=i,this.line=a,this.column=r,this.pointerLength=o,this.originalMessage=e,this.child){this.message=`${this.message} at ${this.line}:${this.column}\n${this.child.message}`;return}this.updatePointerMessage()}getOriginErrorMessage(){return this.child?this.child instanceof Ko?this.child.getOriginErrorMessage():this.child.message:this.message}updatePointerMessage(){let e=this.stream.lines[this.line-1].startIndex,n=this.stream.seek(`\n`),i=this.stream.string.slice(e,n).trimEnd(),a=i.slice(0,this.column-1).replace(/\\t/g,\"    \").length+1,r=\" \".repeat(a-1)+\"\\u2191\".repeat(this.pointerLength);this.message=`${this.originalMessage} at ${this.line}:${this.column}\n${i}\n${r}`}};s(Ko,\"JsonTextSyntaxError\");var wn;(x=>(x.ALPHA_LOWER=Array.from(\"abcdefghijklmnopqrstuvwxyz\"),x.ALPHA_UPPER=Array.from(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"),x.ALPHA=x.ALPHA_LOWER.concat(x.ALPHA_UPPER),x.NUMBER=Array.from(\"0123456789\"),x.INT_START=Array.from(\"-123456789\"),x.NUMBER_START=x.NUMBER.concat(Array.from(\"-.\")),x.ALPHANUMERIC=x.ALPHA.concat(x.NUMBER),x.VERTICAL_WHITESPACE=Array.from(`\n\\r`),x.WHITESPACE=Array.from(\" \t\").concat(x.VERTICAL_WHITESPACE),x.LITERAL=x.ALPHANUMERIC.concat(Array.from(\"._-+\")),x.LITERAL_START=x.ALPHA.concat(\"_\"),x.QUOTES=Array.from(`\"'`),x.BINARY=Array.from(\"01\"),x.HEXADECIMAL=x.NUMBER.concat(Array.from(\"abcdef\"),Array.from(\"ABCDEF\")),x.SYNTAX_BOUNDARY=x.WHITESPACE.concat(x.QUOTES,Array.from(\",:[]{}\"))))(wn||={});var hc=class{s;currentNestingDepth=0;minecraftVersion;enabledFeatures=0;constructor(e){let{minecraftVersion:n=jt.defaultMinecraftVersion,featureFlags:i}=e??{};this.minecraftVersion=n,this.reset(),typeof i==\"number\"?this.enabledFeatures=i:(this.enabledFeatures|=hc.defaultFeatures,fc(this.minecraftVersion,\"1.21.4\")>=0&&(this.enabledFeatures|=256),fc(this.minecraftVersion,\"1.21.5\")>=0&&(this.enabledFeatures|=15392),fc(this.minecraftVersion,\"1.21.6\")>=0&&(this.enabledFeatures|=64),fc(this.minecraftVersion,\"1.21.9\")>=0&&(this.enabledFeatures|=128))}parse(e){let n=new pi(\"Parse JSON Text\").start();this.s=new df(e),this.reset();try{this.consumeWhitespace();let i=this.parseTextElement();return this.consumeWhitespace(),this.s.item&&this.throwSyntax(`Unexpected trailing '${this.s.item}' after JsonTextElement`),n.debug(i),new jt(i)}catch(i){throw i instanceof Ys?new Ys(`Internal Parser Error:\n\t${i.message}\nThis is a bug, please report it.`):i}}throwSyntax(e,n){throw new Ko(e,this.s,n)}recordPosition(){return{index:this.s.index,line:this.s.line,column:this.s.column,equals(e){return this.line===e.line&&this.column===e.column}}}reset(){this.currentNestingDepth=0}consumeWhitespace(){this.s.consumeWhile(e=>!!e.item&&wn.WHITESPACE.includes(e.item))}parseTextElement(){let e;return this.s.item===\"{\"?e=this.parseTextObject():this.s.item===\"[\"?e=this.parseTextElementArray():!this.s.item||wn.QUOTES.includes(this.s.item)||wn.LITERAL_START.includes(this.s.item)?e=this.parseString():this.throwSyntax(`Unexpected '${this.s.item}' in JsonTextElement`),e}parseObject({objectName:e,keys:n=new Set,required:i,parseKey:a,parseValue:r,validateResult:o}){this.currentNestingDepth++,this.currentNestingDepth>hc.maxNestingDepth&&this.throwSyntax(\"Nesting depth limit exceeded\");let l=this.recordPosition();try{this.expect(this.s.item,\"{\",\"to begin \"+e,!0),this.consumeWhitespace();let c={};for(;this.s.item!==\"}\";){let d=this.recordPosition();wn.QUOTES.includes(this.s.item)&&d.column++;let p,m=a?.(n,c);if(m?p=m.key:this.enabledFeatures&1?p=this.parseString():p=this.parseQuotedString(),m?.value!==void 0)c[p]=m.value,this.consumeWhitespace(),this.s.item===\":\"&&this.throwSyntax(`Unknown key '${m.value}' in ${e}`,{...d,pointerLength:m.value.length});else{c[p]!==void 0&&this.throwSyntax(`Duplicate key '${p}'`,{...d,pointerLength:p.length}),n.size>0&&!n.has(p)&&this.throwSyntax(`Unknown key '${p}' in ${e}`,{...d,pointerLength:p.length}),this.expectSyntaxBoundaryAfter(`key '${p}'`),this.consumeWhitespace(),this.expect(this.s.item,\":\",`to follow key '${p}'`,!0),this.consumeWhitespace(),this.s.item||this.throwSyntax(\"Unexpected EOF in \"+e,this.s);let f=this.recordPosition();r(p,c),f.equals(this.s)&&this.throwSyntax(`Missing value for '${p}'`,this.s)}if(this.consumeWhitespace(),this.s.item===\",\")this.s.consume(),this.consumeWhitespace(),this.s.item===\",\"&&this.throwSyntax(\"Extra comma\",this.s),this.s.item===\"}\"&&!(this.enabledFeatures&8)&&this.throwSyntax(\"Trailing comma in \"+e,this.s);else{if(this.s.item===\"}\")break;this.s.item===void 0?this.throwSyntax(\"Unexpected EOF in \"+e,this.s):this.enabledFeatures&16||this.throwSyntax(`Expected ',' or '}' after ${e} entry`)}}if(this.s.consume(),i)for(let d of i)c[d]===void 0&&this.throwSyntax(`Missing required field '${String(d)}' in `+e,l);if(o){let d=o(c);d&&this.throwSyntax(d,l)}return this.currentNestingDepth--,c}catch(c){this.throwSyntax(\"Invalid \"+e,{child:c,...l})}}normalizeHexColor(e){return e.startsWith(\"0x\")&&(e=\"#\"+e.substring(2)),/^#[0-9a-fA-F]{6}$/i.test(e)||this.throwSyntax(`Invalid hex color '${e}'`,this.s),e.toLowerCase()}normalizeHex8Color(e){return e.startsWith(\"0x\")&&(e=\"#\"+e.substring(2)),/^#[0-9a-fA-F]{8}$/i.test(e)||this.throwSyntax(`Invalid hex color '${e}'`,this.s),e.toLowerCase()}assertTextObjectColorIsValid(e){e.startsWith(\"#\")?this.normalizeHexColor(e):e in vo||this.throwSyntax(`Unknown color '${e}'`,this.s)}parseTextObjectColor(){let e=this.parseString();if(e.startsWith(\"#\"))return this.normalizeHexColor(e),e;if(e in vo)return e;this.throwSyntax(`Unknown color '${e}'`,this.s)}parseTextObjectShadowColor(){if(this.enabledFeatures&256||this.throwSyntax(\"'shadow_color' field is only available in Minecraft 1.21.4 and above\"),this.s.item===\"[\"){let n=this.parseFloatArray(4);for(let i of n)(typeof i!=\"number\"||i<0||i>1)&&this.throwSyntax(\"'shadow_color' array values must be numbers between 0 and 1\");return n}else if(wn.NUMBER.includes(this.s.item)){let n=this.parseNumber(\"int\"),i;return n.startsWith(\"0x\")?i=parseInt(n.substring(2),16):i=parseInt(n,10),(typeof i!=\"number\"||i<0||i>4294967295)&&this.throwSyntax(\"'shadow_color' value must be a number between 0 and 0xffffffff\"),jt.intToRgba(i)}this.enabledFeatures&512||this.throwSyntax(\"Expected value of 'shadow_color' to be a float-array or integer.\");let e=this.parseString();return e.startsWith(\"#\")?e=this.normalizeHex8Color(e):e in vo?e=vo[e]:this.throwSyntax(`Unknown color '${e}'`,this.s),jt.hexToRgba(e)}parseTextObject(){return this.parseObject({objectName:\"TextObject\",keys:new Set([\"type\",\"font\",\"color\",\"bold\",\"italic\",\"underlined\",\"strikethrough\",\"obfuscated\",\"extra\",\"insertion\",\"clickEvent\",\"hoverEvent\",\"shadow_color\",\"click_event\",\"hover_event\",\"text\",\"translate\",\"fallback\",\"with\",\"score\",\"selector\",\"separator\",\"keybind\",\"nbt\",\"block\",\"entity\",\"storage\",\"interpret\",\"object\",\"sprite\",\"atlas\",\"player\"]),parseKey:(e,n)=>{if(this.enabledFeatures&32768){if(this.s.item===\"#\")return n.color!==void 0&&this.throwSyntax(\"Cannot infer keyless value as 'color' when 'color' is already defined\",this.s),{key:\"color\",value:this.parseHashedHexColor()};if(this.s.look(0,2)===\"0x\"){n.color!==void 0&&this.throwSyntax(\"Cannot infer keyless value as 'color' when 'color' is already defined\",this.s);let a=this.parseNumber(\"hexadecimal\");return{key:\"color\",value:this.normalizeHexColor(a)}}}let i;if(this.enabledFeatures&1?i=this.parseString():i=this.parseQuotedString(),e.has(i)||n[i]!=null)return{key:i};if(this.enabledFeatures&32768){if(n.color===void 0&&(n.text!==void 0||n.translate!==void 0))return this.assertTextObjectColorIsValid(i),{key:\"color\",value:i};if(n.translate===void 0&&(n.fallback!==void 0||n.with!==void 0))return{key:\"translate\",value:i};if(n.text===void 0)return{key:\"text\",value:i}}return{key:i}},parseValue:(e,n)=>{switch(e){case\"sprite\":case\"atlas\":this.enabledFeatures&128||this.throwSyntax(`'${e}' field is only available in Minecraft 1.21.9 and above`);case\"insertion\":case\"font\":case\"keybind\":case\"selector\":case\"nbt\":case\"block\":case\"entity\":case\"storage\":case\"text\":case\"translate\":case\"fallback\":n[e]=this.parseString();break;case\"bold\":case\"italic\":case\"obfuscated\":case\"strikethrough\":case\"underlined\":case\"interpret\":n[e]=this.parseBoolean();break;case\"source\":n[e]=this.parseString([\"storage\",\"block\",\"entity\"]);break;case\"separator\":n[e]=this.parseTextElement();break;case\"object\":this.enabledFeatures&128||this.throwSyntax(\"'object' field is only available in Minecraft 1.21.9 and above\"),n[e]=this.parseString([\"atlas\",\"player\"]);break;case\"player\":this.enabledFeatures&128||this.throwSyntax(\"'player' field is only available in Minecraft 1.21.9 and above\"),n[e]=this.parsePlayerObject();break;case\"type\":{let a=this.parseString(Object.values(Ox));a===\"object\"&&!(this.enabledFeatures&128)&&this.throwSyntax(`Object type '${\"object\"}' is only available in Minecraft 1.21.9 and above`),n[e]=a;break}case\"color\":n[e]=this.parseTextObjectColor();break;case\"shadow_color\":n[e]=this.parseTextObjectShadowColor();break;case\"with\":case\"extra\":n[e]=this.parseTextElementArray();break;case\"score\":n[e]=this.parseScoreObject();break;case\"clickEvent\":{this.enabledFeatures&65536||this.throwSyntax(\"'clickEvent' field is not allowed\");let a=this.parseLegacyClickEventObject();if(this.enabledFeatures&32){n.click_event!==void 0&&this.throwSyntax(\"Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions below 1.21.5, use only 'clickEvent'\"),n.click_event=this.transformLegacyClickEventToModern(a),delete n.clickEvent;break}n[e]=a;break}case\"click_event\":{this.enabledFeatures&65536||this.throwSyntax(\"'click_event' field is not allowed\");let a=this.parseModernClickEventObject();if(!(this.enabledFeatures&32)){n.clickEvent!==void 0&&this.throwSyntax(\"Cannot use both 'clickEvent' and 'click_event' fields. For Minecraft versions 1.21.5 and above, use only 'click_event'\"),n.clickEvent=this.transformModernClickEventObjectToLegacy(a),delete n.click_event;break}n[e]=a;break}case\"hoverEvent\":{this.enabledFeatures&131072||this.throwSyntax(\"'hoverEvent' field is not allowed\");let a=this.parseLegacyHoverEventObject();if(this.enabledFeatures&32){n.hover_event!==void 0&&this.throwSyntax(\"Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions below 1.21.5, use only 'hoverEvent'\"),n.hover_event=this.transformLegacyHoverEventObjectToModern(a),delete n.hoverEvent;break}n[e]=a;break}case\"hover_event\":this.enabledFeatures&131072||this.throwSyntax(\"'hover_event' field is not allowed\");let i=this.parseModernHoverEventObject();if(!(this.enabledFeatures&32)){n.hoverEvent!==void 0&&this.throwSyntax(\"Cannot use both 'hoverEvent' and 'hover_event' fields. For Minecraft versions 1.21.5 and above, use only 'hover_event'\"),n.hoverEvent=this.transformModernHoverEventObjectToLegacy(i),delete n.hover_event;break}n[e]=i;break}},validateResult:e=>{this.enabledFeatures&32768&&e.text!==void 0&&e.translate===void 0&&(e.with!==void 0||e.fallback!==void 0)&&(e.translate=e.text,delete e.text);let n=Object.values(_d).filter(i=>e[i]!==void 0);if(n.length>1)return`Only one content field may be present, but found ${n.length}: '${n.join(\"', '\")}'`;if(Object.values(_d).every(i=>e[i]==null))if(this.enabledFeatures&16384)e.text??=\"\";else return`At least one content field must be present: ${Object.values(_d).join(\", \")}`;switch(e.type){case\"text\":if(e.text==null)return`'text' is required when 'type' is '${\"text\"}'`;break;case\"translatable\":if(e.translate==null)return`'translate' is required when 'type' is '${\"translatable\"}'`;break;case\"score\":if(e.score==null)return`'score' is required when 'type' is '${\"score\"}'`;break;case\"selector\":if(e.selector==null)return`'selector' is required when 'type' is '${\"selector\"}'`;break;case\"keybind\":if(e.keybind==null)return`'keybind' is required when 'type' is '${\"keybind\"}'`;break;case\"nbt\":if(e.nbt==null)return`'nbt' is required when 'type' is '${\"nbt\"}'`;break;case\"object\":if(e.sprite==null)return`'sprite' is required when 'type' is '${\"object\"}'`;break}if(e.translate==null&&e.with!=null)return\"'with' requires 'translate'\";if(e.translate==null&&e.fallback!=null)return\"'fallback' requires 'translate'\";if(e.separator!=null&&e.nbt==null&&e.selector==null)return\"'separator' requires 'nbt' or 'selector'\";if(e.object!=null){if(e.object===\"player\"&&e.player==null)return\"player object requires 'player'\";if(e.object===\"atlas\"&&e.sprite==null)return\"atlas object requires 'sprite'\";if(e.player==null&&e.sprite==null)return\"'object' requires 'player' or 'sprite'\"}if(e.atlas!=null&&e.sprite==null)return\"'atlas' requires 'sprite'\";if(e.nbt==null){if(e.source!=null)return\"'source' requires 'nbt'\";if(e.block!=null)return\"'block' requires 'nbt'\";if(e.entity!=null)return\"'entity' requires 'nbt'\";if(e.storage!=null)return\"'storage' requires 'nbt'\"}if(e.nbt!=null){if(e.block==null&&e.entity==null&&e.storage==null)return\"'nbt' requires 'block', 'entity', or 'storage'\";switch(e.source){case\"block\":if(e.block==null)return\"'nbt' with source of 'block' requires 'block'\";break;case\"entity\":if(e.entity==null)return\"'nbt' with source of 'entity' requires 'entity'\";break;case\"storage\":if(e.storage==null)return\"'nbt' with source of 'storage' requires 'storage'\";break}}}})}parsePlayerPropertyObject(){return this.parseObject({objectName:\"player property object\",keys:new Set([\"name\",\"value\",\"signature\"]),required:new Set([\"name\",\"value\"]),parseValue:(e,n)=>{switch(e){case\"name\":case\"value\":case\"signature\":n[e]=this.parseString();break}}})}parsePlayerPropertiesArray(){return this.parseArray({arrayName:\"player properties array\",parseItem:this.parsePlayerPropertyObject.bind(this)})}parsePlayerObject(){return this.parseObject({objectName:\"player object\",keys:new Set([\"name\",\"id\",\"texture\",\"cape\",\"model\",\"properties\",\"hat\"]),parseValue:(e,n)=>{switch(e){case\"id\":if(this.s.item===\"[\"){n[e]=this.parseIntArray(!1,4);break}case\"name\":case\"texture\":case\"cape\":n[e]=this.parseString();break;case\"hat\":n[e]=this.parseBoolean();break;case\"model\":n[e]=this.parseString([\"wide\",\"slim\"]);break;case\"properties\":n[e]=this.parsePlayerPropertiesArray();break}}})}parseUnknownArray(e){return this.parseArray({arrayName:e,parseItem:this.parseUnknownValue.bind(this)})}parseUnknownValue(){if(this.s.item===\"{\")return this.parseUnknownObject(\"object\");if(this.s.item===\"[\")return this.parseUnknownArray(\"array\");if(!this.s.item)this.throwSyntax(\"Unexpected EOF\",this.s);else{if(wn.QUOTES.includes(this.s.item))return this.parseQuotedString();if(this.s.item===\"t\"||this.s.item===\"f\")return this.parseBoolean();if(wn.NUMBER_START.includes(this.s.item))return this.parseNumber();if(wn.LITERAL_START.includes(this.s.item))return this.parseLiteral();this.throwSyntax(`Unexpected '${this.s.item}'`,this.s)}}parseUnknownObject(e){return this.parseObject({objectName:e,parseValue:(n,i)=>{i[n]=this.parseUnknownValue()}})}parseScoreObject(){return this.parseObject({objectName:\"score object\",keys:new Set([\"name\",\"objective\"]),required:new Set([\"name\",\"objective\"]),parseValue:(e,n)=>{switch(e){case\"name\":case\"objective\":n[e]=this.parseString();break}}})}parseLegacyClickEventObject(){return this.parseObject({objectName:\"clickEvent\",keys:new Set([\"action\",\"value\"]),required:new Set([\"action\",\"value\"]),parseValue:(e,n)=>{switch(e){case\"action\":let i=this.parseString([\"open_url\",\"open_file\",\"run_command\",\"suggest_command\",\"change_page\",\"copy_to_clipboard\"]);i===\"open_file\"&&this.throwSyntax(\"clickEvent 'open_file' cannot be used by commands\"),n[e]=i;break;case\"value\":n[e]=this.parseString();break}}})}parseModernClickEventObject(){return this.parseObject({objectName:\"click_event\",keys:new Set([\"action\",\"url\",\"path\",\"command\",\"page\",\"value\",\"dialog\",\"id\",\"payload\"]),required:new Set([\"action\"]),parseValue:(e,n)=>{switch(e){case\"action\":let i=this.parseString([\"open_url\",\"open_file\",\"run_command\",\"suggest_command\",\"change_page\",\"copy_to_clipboard\",\"show_dialog\",\"custom\"]);i===\"open_file\"&&this.throwSyntax(\"Click event 'open_file' cannot be used by commands\"),i===\"show_dialog\"&&(this.enabledFeatures&64||this.throwSyntax(\"Click event 'show_dialog' is only available in Minecraft 1.21.6 and above\")),n[e]=i;break;case\"url\":let a=this.parseString(),r;try{r=new URL(a)}catch(o){this.throwSyntax(`Invalid URL format for 'url' in 'open_url' clickEvent: ${o.message}`)}r.protocol!==\"http:\"&&r.protocol!==\"https:\"&&this.throwSyntax(\"Invalid URL: Protocol must be 'http:' or 'https:'\"),n[e]=a;break;case\"path\":n[e]=this.parseString();break;case\"command\":n[e]=this.parseString();break;case\"page\":n[e]=parseInt(this.parseNumber(\"int\"));break;case\"value\":n[e]=this.parseString();break;case\"dialog\":n[e]=this.parseUnknownObject(\"click_event.dialog\");break;case\"id\":n[e]=this.parseString();break;case\"payload\":n[e]=this.parseUnknownValue();break}},validateResult:e=>{let n=Object.values(Ix);switch(e.action){case\"open_url\":if(e.url===void 0)return\"Click event of type 'open_url' missing required key 'url'\";n=n.filter(i=>i!==\"url\");break;case\"open_file\":if(e.path===void 0)return\"Click event of type 'open_file' missing required key 'path'\";n=n.filter(i=>i!==\"path\");break;case\"run_command\":if(e.command===void 0)return\"Click event of type 'run_command' missing required key 'command'\";n=n.filter(i=>i!==\"command\");break;case\"suggest_command\":if(e.command===void 0)return\"Click event of type 'suggest_command' missing required key 'command'\";n=n.filter(i=>i!==\"command\");break;case\"change_page\":if(e.page===void 0)return\"Click event of type 'change_page' missing required key 'page'\";n=n.filter(i=>i!==\"page\");break;case\"copy_to_clipboard\":if(e.value===void 0)return\"Click event of type 'copy_to_clipboard' missing required key 'value'\";n=n.filter(i=>i!==\"value\");break;case\"custom\":if(e.id===void 0)return\"Click event of type 'custom' missing required key 'id'\";n=n.filter(i=>i!==\"id\"),n=n.filter(i=>i!==\"payload\");break;case\"show_dialog\":if(e.dialog===void 0)return\"Click event of type 'show_dialog' missing required key 'dialog'\";n=n.filter(i=>i!==\"dialog\");break}if(n.some(i=>e[i]!==void 0))return`Click event of type '${e.action}' cannot have keys: ${n.map(i=>`'${i}'`).join(\", \")}`}})}transformModernClickEventObjectToLegacy(e){switch(e.action){case\"open_url\":return{action:\"open_url\",value:e.url};case\"open_file\":this.throwSyntax(\"Click event 'open_file' cannot be used by commands\");case\"run_command\":case\"suggest_command\":return{action:e.action,value:e.command};case\"change_page\":return{action:\"change_page\",value:String(e.page)};case\"copy_to_clipboard\":return{action:\"copy_to_clipboard\",value:e.value};case\"show_dialog\":this.throwSyntax(\"Click events of type 'show_dialog' are not supported in versions below 1.21.6\");case\"custom\":this.throwSyntax(\"Click events of type 'custom' are not supported in versions below 1.21.5\")}}transformLegacyClickEventToModern(e){switch(e.action){case\"open_url\":{let n;try{n=new URL(e.value).toString()}catch{this.throwSyntax(\"Invalid URL format for 'open_url' clickEvent\")}return/^https?:\\/\\//.exec(e.value)||this.throwSyntax(\"Invalid URL format for 'open_url' clickEvent. URL must start with 'http://' or 'https://'\"),{action:\"open_url\",url:n}}case\"open_file\":this.throwSyntax(\"Click event 'open_file' cannot be used by commands\");case\"run_command\":case\"suggest_command\":return{action:e.action,command:e.value};case\"change_page\":return{action:\"change_page\",page:Number(e.value)};case\"copy_to_clipboard\":return{action:\"copy_to_clipboard\",value:e.value}}}parseLegacyHoverEventObjectShowItemContents(){return this.parseObject({objectName:\"hoverEvent.contents\",keys:new Set([\"id\",\"count\",\"tag\"]),required:new Set([\"id\"]),parseValue:(e,n)=>{switch(e){case\"id\":n[e]=this.parseString();break;case\"count\":n[e]=parseInt(this.parseNumber(\"byte\"));break;case\"tag\":n[e]=this.parseUnknownValue();break}}})}parseLegacyHoverEventObjectShowEntityContents(){return this.parseObject({objectName:\"hoverEvent.contents\",keys:new Set([\"type\",\"id\",\"name\"]),required:new Set([\"type\",\"id\"]),parseValue:(e,n)=>{switch(e){case\"id\":if(this.s.item===\"[\"){n[e]=this.parseIntArray(!1,4);break}case\"type\":case\"name\":n[e]=this.parseString();break}}})}parseLegacyHoverEventObject(){return this.parseObject({objectName:\"hoverEvent\",keys:new Set([\"action\",\"contents\"]),required:new Set([\"action\",\"contents\"]),parseValue:(e,n)=>{switch(e){case\"action\":n[e]=this.parseString([\"show_text\",\"show_item\",\"show_entity\"]);break;case\"contents\":switch(n.action){case void 0:this.throwSyntax(\"'action' must be defined before 'contents' in hoverEvent\");case\"show_text\":{n[e]=this.parseTextElement();break}case\"show_item\":{if(this.s.item===\"{\"){n[e]=this.parseLegacyHoverEventObjectShowItemContents();break}n[e]=this.parseString();break}case\"show_entity\":{n[e]=this.parseLegacyHoverEventObjectShowEntityContents();break}}break}}})}parseModernHoverEventObject(){return this.parseObject({objectName:\"hover_event\",keys:new Set([\"action\",\"value\",\"id\",\"count\",\"components\",\"name\",\"uuid\"]),required:new Set([\"action\"]),parseValue:(e,n)=>{switch(e){case\"action\":n[e]=this.parseString([\"show_text\",\"show_item\",\"show_entity\"]);break;case\"uuid\":if(this.s.item===\"[\"){n[e]=this.parseIntArray(!1,4);break}case\"id\":case\"name\":n[e]=this.parseString();break;case\"value\":n[e]=this.parseTextElement();break;case\"count\":n[e]=parseInt(this.parseNumber(\"byte\"));break;case\"components\":n[e]=this.parseUnknownValue();break}},validateResult:e=>{if(e.action===void 0)return\"Hover event must include 'action' field\";switch(e.action){case\"show_text\":if(e.value===void 0)return\"Hover event 'show_text' missing required field 'value'\";break;case\"show_item\":if(e.id===void 0)return\"Hover event 'show_item' missing required field 'id'\";break;case\"show_entity\":if(e.id===void 0)return\"Hover event 'show_entity' missing required field 'id'\";if(e.uuid===void 0)return\"Hover event 'show_entity' missing required field 'uuid'\";break}switch(!0){case(e.value!==void 0&&e.action!==\"show_text\"):return\"'value' is only valid when hover_event action is 'show_text'\";case(e.count!==void 0&&e.action!==\"show_item\"):return\"'count' is only valid when hover_event action is 'show_item'\";case(e.id!==void 0&&e.action!==\"show_item\"&&e.action!==\"show_entity\"):return\"'id' is only valid when hover_event action is 'show_item' or 'show_entity'\";case(e.components!==void 0&&e.action!==\"show_item\"):return\"'components' is only valid when hover_event action is 'show_item'\";case(e.name!==void 0&&e.action!==\"show_entity\"):return\"'name' is only valid when hover_event action is 'show_entity'\";case(e.uuid!==void 0&&e.action!==\"show_entity\"):return\"'uuid' is only valid when hover_event action is 'show_entity'\"}}})}transformLegacyHoverEventObjectToModern(e){switch(e.action){case\"show_text\":return{action:\"show_text\",value:e.contents};case\"show_item\":return typeof e.contents==\"string\"?{action:\"show_item\",id:e.contents}:(e.contents.tag!==void 0&&this.throwSyntax(\"Cannot transform 'hoverEvent' with 'tag' into modern 'hover_event'. Please use 'hover_event' for Minecraft versions 1.21.5 and above\"),{action:\"show_item\",id:e.contents.id,count:e.contents.count});case\"show_entity\":return{action:\"show_entity\",id:e.contents.type,uuid:e.contents.id,name:e.contents.name}}}transformModernHoverEventObjectToLegacy(e){switch(e.action){case\"show_text\":return{action:\"show_text\",contents:e.value};case\"show_item\":return e.components!==void 0&&this.throwSyntax(\"Cannot transform 'hover_event' with 'components' into legacy 'hoverEvent'. Please use 'hoverEvent' for Minecraft versions below 1.21.5\"),{action:\"show_item\",contents:{id:e.id,count:e.count}};case\"show_entity\":return Array.isArray(e.uuid)&&this.throwSyntax(\"Cannot transform 'hover_event' with 'uuid' as int-array into legacy 'hoverEvent'. Please either use a string UUID, or use 'hoverEvent' for Minecraft versions below 1.21.5\"),{action:\"show_entity\",contents:{type:e.id,id:e.uuid,name:e.name}}}}parseArray({arrayName:e,parsePrefix:n,parseItem:i,expectedLength:a}){this.currentNestingDepth++,this.currentNestingDepth>hc.maxNestingDepth&&this.throwSyntax(\"Nesting depth limit exceeded\",this.s),this.expect(this.s.item,\"[\",\"to begin \"+e,!0),this.consumeWhitespace(),n&&(n(),this.consumeWhitespace());let r=[];for(;this.s.item!==\"]\";){this.consumeWhitespace();let o=this.recordPosition(),l=i();if(o.equals(this.s))throw new Ys(`parseItem function for ${e} did not consume any input`);if(r.push(l),r.length>hc.maxArrayLength&&this.throwSyntax(\"Array length limit exceeded\",this.s),this.expectSyntaxBoundaryAfter(\"array item\"),this.consumeWhitespace(),a!==void 0&&r.length>a&&this.throwSyntax(\"Too many items in \"+e+` (expected ${a})`,o),this.s.item===\",\")this.s.consume(),this.consumeWhitespace(),this.s.item===\",\"&&this.throwSyntax(\"Extra comma\",this.s),this.s.item===\"]\"&&!(this.enabledFeatures&8)&&this.throwSyntax(\"Trailing comma in \"+e,this.s);else{if(this.s.item===\"]\")break;this.s.item===void 0?this.throwSyntax(\"Unexpected EOF in \"+e,this.s):this.enabledFeatures&16||this.throwSyntax(`Expected ',' or ']' after ${e} item`,this.s)}}return a!==void 0&&r.length<a&&this.throwSyntax(\"Not enough items in \"+e+` (expected ${a}, got ${r.length})`),this.s.consume(),r}parseTextElementArray(){return this.parseArray({arrayName:\"TextElementArray\",parseItem:this.parseTextElement.bind(this)})}parseIntArray(e,n){return this.parseArray({arrayName:\"int-array\",parsePrefix:()=>{this.s.item===\"I\"?(this.s.consume(),this.consumeWhitespace(),this.expect(this.s.item,\";\",\"to follow array type identifier\",!0)):e&&this.throwSyntax(\"Expected explicit int-array\",this.s)},parseItem:()=>parseInt(this.parseNumber(\"int\")),expectedLength:n})}parseFloatArray(e){return this.parseArray({arrayName:\"float-array\",parseItem:()=>parseFloat(this.parseNumber(\"float\")),expectedLength:e})}collectHexDigits(e){let n=\"\";for(let i=0;i<e;i++)this.s.item&&wn.HEXADECIMAL.includes(this.s.item)?(n+=this.s.item,this.s.consume()):this.throwSyntax(`Unexpected '${this.s.item}' in ${e}-digit hex escape sequence`);return n}parseHashedHexColor(){this.expect(this.s.item,\"#\",\"to begin hex color\",!0);let e=this.parseDigits(\"hex\",wn.HEXADECIMAL);return this.normalizeHexColor(\"#\"+e)}parseNamedUnicodeEscapeSequence(){this.expect(this.s.look(0,2),\"N{\",\"to begin named unicode escape sequence\",!0);let e=\"\";for(;this.s.item&&this.s.item!==\"}\"&&!wn.VERTICAL_WHITESPACE.includes(this.s.item);)e+=this.s.item,this.s.consume();return e=e.trim().toUpperCase(),e.length===0&&this.throwSyntax(\"Expected name in named unicode escape sequence\",this.s),this.expect(this.s.item,\"}\",\"to end named unicode escape sequence\",!0),`\\\\N{${e}}`}parseUnicodeEscapeSequence(){this.expect(this.s.item,[\"x\",\"u\",\"U\"],\"to begin escape sequence\");let e=this.s.item,n=this.s.item===\"x\"?2:this.s.item===\"u\"?4:8;this.s.consume();let i=this.collectHexDigits(n);return`\\\\${e}${i}`}parseEscapeSequence(){this.expect(this.s.item,\"\\\\\",\"to begin escape sequence\",!0);let e=this.s.item;if(e===\"\\\\\"||e===\"'\"||e==='\"'||e===\"n\"||e===\"b\"||e===\"r\"||e===\"t\"||e===\"f\")return this.s.consume(),\"\\\\\"+e;if(e===\"s\")return this.enabledFeatures&1024||this.throwSyntax(`Minecraft ${this.minecraftVersion} does not support space escape sequences ('\\\\s')`),this.s.consume(),\"\\\\s\";if(e===\"u\")return this.parseUnicodeEscapeSequence();if(e===\"x\")return this.enabledFeatures&2048||this.throwSyntax(`Minecraft ${this.minecraftVersion} does not support hex unicode escape sequences ('\\\\x00')`),this.parseUnicodeEscapeSequence();if(e===\"U\")return this.enabledFeatures&4096||this.throwSyntax(`Minecraft ${this.minecraftVersion} does not support 8-digit unicode escape sequences ('\\\\U00000000')`),this.parseUnicodeEscapeSequence();if(e===\"N\")return this.enabledFeatures&8192||this.throwSyntax(`Minecraft ${this.minecraftVersion} does not support named unicode escape sequences ('\\\\${e}{Name}')`),this.parseNamedUnicodeEscapeSequence();this.throwSyntax(`Unknown escape sequence '\\\\${e}'`,this.s)}parseQuotedString(){let e=this.s.item;this.expect(this.s.item,wn.QUOTES,\"to begin string\",!0),this.s.item===\"'\"&&!(this.enabledFeatures&4)&&this.throwSyntax(`Single quotes are not supported in Minecraft ${this.minecraftVersion}`);let n=\"\";for(;this.s.item;){if(this.s.item===\"\\\\\"){n+=this.parseEscapeSequence();continue}else{if(this.s.item===e)break;wn.VERTICAL_WHITESPACE.includes(this.s.item)&&this.throwSyntax(`Expected ${e} to close string`,this.s)}n+=this.s.item,this.s.consume()}return this.s.item||this.throwSyntax(\"Unexpected EOF in string\",this.s),this.expect(this.s.item,e,\"to close string\",!0),n}parseLiteral(){this.enabledFeatures&2||this.throwSyntax(`Literal strings are not supported in Minecraft ${this.minecraftVersion}`),(!this.s.item||!wn.LITERAL_START.includes(this.s.item))&&this.throwSyntax(`Expected [a-zA-Z0-9_] to start literal string. Found '${this.s.item}' instead`);let e=this.s.collectWhile(n=>!!n.item&&wn.LITERAL.includes(n.item));if(e.length===0)throw new Ys(\"Literal string parsing failed unexpectedly\");return e}parseString(e){let n,i=this.recordPosition();return this.s.item&&wn.QUOTES.includes(this.s.item)?n=this.parseQuotedString():n=this.parseLiteral(),e&&!e.includes(n)&&this.throwSyntax(`Expected one of ${e.join(\", \")}`,i),n}parseBoolean(){if(this.s.look(0,4).toLowerCase()===\"true\")return this.s.consumeN(4),!0;if(this.s.look(0,5).toLowerCase()===\"false\")return this.s.consumeN(5),!1;this.throwSyntax(\"Expected boolean\",this.s)}parseDigits(e,n=wn.NUMBER,i=0,a=1/0){let r=\"\";for(;this.s.item&&n.includes(this.s.item);){r+=this.s.item,r.length>a&&this.throwSyntax(`Too many ${e} digits (max ${a})`,this.s),this.s.consume();let o=this.recordPosition(),l=wn.WHITESPACE.includes(this.s.item);if(this.consumeWhitespace(),this.s.item===\"_\")l&&this.throwSyntax(`Underscore must be between ${e} digits`,this.s),this.s.consumeWhile(c=>c.item===\"_\"),this.s.item&&n.includes(this.s.item)||this.throwSyntax(`Underscore must be between ${e} digits`,this.s);else if(l){this.s.index=o.index-1,this.s.consume();break}}return r.length<i&&this.throwSyntax(`Not enough ${e} digits (min ${i})`,this.s),r}parseNumber(e=\"number\"){let n=\"\",i=!1,a=wn.NUMBER,r=this.s.look(0,2).toLowerCase();r===\"0x\"?(this.s.consumeN(2),n+=\"0x\",a=wn.HEXADECIMAL,e=\"hexadecimal\"):r===\"0b\"?(this.s.consumeN(2),n+=\"0b\",a=wn.BINARY,e=\"binary number\"):this.s.item===\"-\"&&(n+=\"-\",this.s.consume(),this.consumeWhitespace()),e===\"hexadecimal\"&&r!==\"0x\"?this.throwSyntax(\"Hexadecimal numbers must begin with '0x'\",this.s):e===\"binary number\"&&r!==\"0b\"&&this.throwSyntax(\"Binary numbers must begin with '0b'\",this.s);let o=e===\"float\"||e===\"double\";for(this.s.item===\".\"&&(o||this.throwSyntax(`Decimal points are not permitted in ${e}s`),n+=\".\",i=!0,this.s.consume(),this.consumeWhitespace()),this.expect(this.s.item,a,\"to begin \"+e);this.s.item&&(a.includes(this.s.item)||this.s.item===\".\"||this.s.item===\"_\");)if(n+=this.parseDigits(e,a),this.consumeWhitespace(),this.s.item===\"e\"||this.s.item===\"E\"){o||this.throwSyntax(`E notation is not allowed in ${e}s`,this.s),this.s.consume(),this.consumeWhitespace();let c=parseFloat(n);isNaN(c)&&this.throwSyntax(`Invalid ${e} before exponent`,this.s);let d=parseInt(this.parseNumber(\"int\"));return isNaN(d)&&this.throwSyntax(\"Invalid exponent\",this.s),c.toString()+\"e\"+d.toString()}else this.s.item===\".\"&&(i&&this.throwSyntax(\"Second decimal point in \"+e,this.s),i=!0,n+=\".\",this.s.consume(),this.consumeWhitespace());this.expectSyntaxBoundaryAfter(e);let l;switch(e){case\"byte\":case\"short\":case\"int\":case\"long\":l=parseInt(n);break;case\"hexadecimal\":l=parseInt(n.substring(2),16);break;case\"binary number\":l=parseInt(n.substring(2),2);break;case\"float\":case\"double\":case\"number\":l=parseFloat(n);break}return isNaN(l)&&this.throwSyntax(\"Invalid \"+e,this.s),n}expect(e,n,i,a=!1){(Array.isArray(n)?!e||!n.includes(e):e!==n)&&(Array.isArray(n)&&this.throwSyntax(`Expected one of '${n.join(\"', '\")}' ${i}. Found '${e}' instead`),this.throwSyntax(`Expected '${n}' ${i}. Found '${e}' instead`)),a&&(Array.isArray(n)?this.s.consume():this.s.consumeN(n.length))}expectSyntaxBoundaryAfter(e){if(this.s.item&&!wn.SYNTAX_BOUNDARY.includes(this.s.item)){let n=this.s.string.at(this.s.index-1);if(n&&wn.SYNTAX_BOUNDARY.includes(n))return;this.throwSyntax(`Unexpected '${this.s.item}' after ${e}`,this.s)}}},Yn=hc;s(Yn,\"JsonTextParser\"),lt(Yn,\"maxNestingDepth\",512),lt(Yn,\"maxArrayLength\",2**31-9),lt(Yn,\"FEATURES\",lT),lt(Yn,\"defaultFeatures\",246303);var Ga=class extends Property{constructor(e,n,i){super(e,\"object\",n,i)}merge(e,n){typeof n[this.name]==\"object\"&&(e[this.name]=JSON.parse(JSON.stringify(n[this.name])))}copy(e,n){typeof e[this.name]==\"object\"&&(n[this.name]=JSON.parse(JSON.stringify(e[this.name])))}};s(Ga,\"DeepClonedObjectProperty\");var Yo=s(t=>(t.properties={...t.properties},t),\"fixClassPropertyInheritance\");var hT=Ee(\"crypto\");var cT=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9ba0UqCnYQcYjQOtlFRRxLFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi7OCk6CIl/i8ptIjx4Lgf7+497t4B3maVKUZPDFBUU08n4kIuvyoEXuHHEHoxjojIDC2ZWczCdXzdw8PXuyjPcj/35xiQCwYDPAJxjGm6SbxBPLtpapz3iUOsLMrE58STOl2Q+JHrksNvnEs2e3lmSM+m54lDxEKpi6UuZmVdIZ4hDsuKSvnenMMy5y3OSrXO2vfkLwwW1JUM12mOIYElJJGCAAl1VFCFiSitKikG0rQfd/GP2v4UuSRyVcDIsYAaFIi2H/wPfndrFKennKRgHPC/WNZHBAjsAq2GZX0fW1brBPA9A1dqx19rAnOfpDc6WvgIGNwGLq47mrQHXO4AI0+aqIu25KPpLRaB9zP6pjwwfAv0rzm9tfdx+gBkqavlG+DgEJgoUfa6y7v7unv790y7vx+v+3K/mrIdyAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFEAYjBv19RUYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAJUlEQVQY02P8////fwY0wMjIyAjnoCtA5zMxEAB0UMCCzWEkAQDoPxACvFjV6wAAAABJRU5ErkJggg==\";var{BufferAttribute:N0e,BufferGeometry:R0e,Float32BufferAttribute:ySe,InstancedBufferAttribute:wSe,InterleavedBuffer:ESe,InterleavedBufferAttribute:kSe,TriangleFanDrawMode:jSe,TriangleStripDrawMode:ASe,TrianglesDrawMode:TSe,Vector3:CSe}=THREE;function wa(t,e=!1){let n=t[0].index!==null,i=new Set(Object.keys(t[0].attributes)),a=new Set(Object.keys(t[0].morphAttributes)),r={},o={},l=t[0].morphTargetsRelative,c=new R0e,d=0;for(let u=0;u<t.length;++u){let p=t[u],m=0;if(n!==(p.index!==null))return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+\". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"),null;for(let f in p.attributes){if(!i.has(f))return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+'. All geometries must have compatible attributes; make sure \"'+f+'\" attribute exists among all geometries, or in none of them.'),null;r[f]===void 0&&(r[f]=[]),r[f].push(p.attributes[f]),m++}if(m!==i.size)return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+\". Make sure all geometries have the same number of attributes.\"),null;if(l!==p.morphTargetsRelative)return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+\". .morphTargetsRelative must be consistent throughout all geometries.\"),null;for(let f in p.morphAttributes){if(!a.has(f))return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+\".  .morphAttributes must be consistent throughout all geometries.\"),null;o[f]===void 0&&(o[f]=[]),o[f].push(p.morphAttributes[f])}if(e){let f;if(n)f=p.index.count;else if(p.attributes.position!==void 0)f=p.attributes.position.count;else return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \"+u+\". The geometry must have either an index or a position attribute\"),null;c.addGroup(d,f,u),d+=f}}if(n){let u=0,p=[];for(let m=0;m<t.length;++m){let f=t[m].index;for(let g=0;g<f.count;++g)p.push(f.getX(g)+u);u+=t[m].attributes.position.count}c.setIndex(p)}for(let u in r){let p=uT(r[u]);if(!p)return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \"+u+\" attribute.\"),null;c.setAttribute(u,p)}for(let u in o){let p=o[u][0].length;if(p===0)break;c.morphAttributes=c.morphAttributes||{},c.morphAttributes[u]=[];for(let m=0;m<p;++m){let f=[];for(let x=0;x<o[u].length;++x)f.push(o[u][x][m]);let g=uT(f);if(!g)return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \"+u+\" morphAttribute.\"),null;c.morphAttributes[u].push(g)}}return c}s(wa,\"mergeGeometries\");function uT(t){let e,n,i,a=-1,r=0;for(let d=0;d<t.length;++d){let u=t[d];if(e===void 0&&(e=u.array.constructor),e!==u.array.constructor)return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"),null;if(n===void 0&&(n=u.itemSize),n!==u.itemSize)return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"),null;if(i===void 0&&(i=u.normalized),i!==u.normalized)return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"),null;if(a===-1&&(a=u.gpuType),a!==u.gpuType)return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.\"),null;r+=u.count*n}let o=new e(r),l=new N0e(o,n,i),c=0;for(let d=0;d<t.length;++d){let u=t[d];if(u.isInterleavedBufferAttribute){let p=c/n;for(let m=0,f=u.count;m<f;m++)for(let g=0;g<n;g++){let x=u.getComponent(m,g);l.setComponent(m+p,g,x)}}else o.set(u.array,c);c+=u.count*n}return a!==void 0&&(l.gpuType=a),l}s(uT,\"mergeAttributes\");var Dx={\"\\\\\":\"\\\\\",\"'\":\"'\",'\"':'\"',n:`\n`,s:\" \",t:\"\t\",b:\"\\b\",f:\"\\f\",r:\"\\r\"},gc=new Map;async function M0e(){let e=await(await fetch(\"https://unicode.org/Public/UNIDATA/UnicodeData.txt\")).text();gc.clear();let n=e.split(`\n`);for(let i of n){let a=i.split(\";\"),r=a[0],o=a[1],l=parseInt(r,16);isNaN(l)||o===\"<control>\"||o===\"\"||gc.set(o,String.fromCodePoint(l))}console.log(`Loaded ${gc.size} Unicode character mappings`,gc);for(let i of ve.all)i.updateTextMesh()}s(M0e,\"loadUnicodeCharMappings\");K.NETWORK_CONNECTED.subscribe(()=>{M0e()});function B0e(t,e){let n=\"\";for(let i=0;i<e;i++)if(t.item&&/[0-9a-fA-F]/.test(t.item))n+=t.item,t.consume();else throw new Error(`Expected ${e} hex digits in unicode escape sequence, got only ${i}`);return n}s(B0e,\"collectHexDigits\");function P0e(t){if(t.next!==\"{\")return console.warn(\"Expected 'N{' to begin named unicode escape sequence\"),\"\\\\N\";t.consume(),t.consume();let e=\"\";for(;t.item&&t.item!==\"}\";)e+=t.item,t.consume();return e=e.trim().toUpperCase(),e.length===0?(console.warn(\"Expected name in named unicode escape sequence\"),\"\\\\N{}\"):t.item!==\"}\"?(console.warn(\"Expected '}' to end named unicode escape sequence\"),`\\\\N{${e}`):(t.consume(),gc.has(e)?gc.get(e):`\\\\N{${e}}`)}s(P0e,\"resolveNamedUnicodeEscapeSequence\");function L0e(t){if(!\"xuU\".includes(t.item))return console.warn(\"Expected 'x', 'u', or 'U' to begin unicode escape sequence\"),\"\\\\\"+t.item;let e=t.item,n=t.item===\"x\"?2:t.item===\"u\"?4:8;t.consume();let i=B0e(t,n),a=parseInt(i,16);return isNaN(a)||a<0||a>1114111?(console.warn(`Invalid unicode code point: ${i}`),`\\\\${e}${i}`):String.fromCodePoint(a)}s(L0e,\"resolveUnicodeEscapeSequence\");function V0e(t){let e=\"\",n=new df(t);for(;n.item;){if(n.item===\"\\\\\"){let i=n.look(1);if((i===\"\\\\\"||i===\"'\"||i==='\"'||i===\"n\"||i===\"s\"||i===\"t\"||i===\"b\"||i===\"f\"||i===\"r\")&&Dx[i]){if(Dx[i]){n.consume(),n.consume(),e+=Dx[i];continue}}else if(i===\"N\"){n.consume(),e+=P0e(n);continue}else if(i===\"u\"||i===\"U\"||i===\"x\"){n.consume(),e+=L0e(n);continue}}e+=n.item,n.consume()}return e}s(V0e,\"resolveEscapeSequences\");var xd=class{chars=[];str;constructor(e){if(this.str=e,this.str!==\"\"){this.str=V0e(e);for(let n of this.str.matchAll(xd.regex))this.chars.push(n[0])}}[Symbol.iterator](){return this.chars[Symbol.iterator]()}get length(){return this.chars.length}includes(e){return this.chars.includes(e)}indexOf(e){return this.chars.indexOf(e)}slice(e,n){let i=this.chars.slice(e,n);return xd.fromChars(i)}at(e){if(!(e<0||e>=this.chars.length))return this.chars[e]}append(e){this.chars.push(e),this.str+=e}toString(){return this.str}static fromChars(e){return new xd(e.join(\"\"))}},hn=xd;s(hn,\"UnicodeString\"),lt(hn,\"regex\",/[^]/gmu);function dT(t){if(typeof t==\"string\")return new hn(t);switch(!0){case t.text!==void 0:return new hn(t.text);case t.translate!==void 0:return new hn(`{${t.translate}}`);case t.selector!==void 0:return new hn(`{${t.selector}}`);case t.score!==void 0:return new hn(`{${t.score.name}:${t.score.objective}}`);case t.keybind!==void 0:return new hn(`{${t.keybind}}`);case t.nbt!==void 0:switch(!0){case t.block!==void 0:return new hn(`{${t.block}:${t.nbt}}`);case t.entity!==void 0:return new hn(`{${t.entity}:${t.nbt}}`);case t.storage!==void 0:return new hn(`{${t.storage}:${t.nbt}}`);default:return new hn(`{${t.nbt}}`)}case t.sprite!==void 0:return new hn(`{sprite:${t.sprite}}`);case t.player!==void 0:return new hn(`{player:${t.player}}`);default:return console.warn(\"Unknown JSON Text element:\",t),new hn(\"{Unknown Element}\")}}s(dT,\"getRawText\");function z0e(t){let e=new pi(\"Parse Words\").start(),n=new jt(t).flatten(!0);if(!n.length)return[];let i=[],a,r=n.shift();if(r===void 0)return i;let o=dT(r),l={style:jt.getComponentStyle(r),start:0,end:0};for(;r!==void 0;){for(let c of o){if(c===\" \")a&&a.text.at(-1)!==\" \"&&(l.end++,Object.keys(l.style).length&&(a.styles.push({...l}),l.start=0,l.end=0),i.push(a),a=void 0);else if(c===`\n`){a&&(Object.keys(l.style).length&&(l.start<l.end&&a.styles.push({...l}),l.start=0,l.end=0),i.push(a)),i.push({styles:[],text:new hn(\"\"),width:0,forceWrap:!0}),a=void 0;continue}else c!==\" \"&&a?.text.at(-1)===\" \"&&(l.end++,Object.keys(l.style).length&&(a.styles.push({...l}),l.start=0,l.end=0),i.push(a),a=void 0);a??={styles:[],text:new hn(\"\"),width:0},a.text.append(c),l.end++}r=n.shift(),r!==void 0&&(o=dT(r),a?(a.styles.push(l),l={style:jt.getComponentStyle(r),start:l.end,end:l.end}):l={style:jt.getComponentStyle(r),start:0,end:0})}return a&&(Object.keys(l.style).length&&a.styles.push(l),i.push(a)),e.debug(),i}s(z0e,\"parseWords\");async function pT(t,e=200){let n=new pi(\"Wrap Json Text\").start(),i=z0e(t.toJSON()),a=[],r=await _c(),o=0,l={words:[],width:0};for(let c of i){let d=r.getWordWidth(c),u=[...c.styles];if(d-1>e){l.words.length&&(a.push(l),o=Math.max(o,l.width)),l={words:[],width:0};let p=new hn(\"\"),m=0,f=0,g=u.shift();if(!g)throw new Error(`No active style found for word '${c.text.toString()}'`);for(let x=0;x<c.text.length;x++){let _=c.text.at(x);u.length>1&&x>=g.end&&(g=u.shift());let h=r.getTextWidth(new hn(_),g);if(p.length>0&&m+(h-1)>e){let v=c.styles.filter(b=>b.start<f+p.length&&b.end>=f).map(b=>({...b,start:Math.max(b.start-f,0),end:Math.min(b.end-f,p.length)}));a.push({words:[{text:p,styles:v,width:d}],width:m}),o=Math.max(o,m),f+=p.length,p=new hn(\"\"),m=0}p.append(_),m+=h}if(p){let x=c.styles.filter(_=>_.start<f+p.length&&_.end>=f).map(_=>({..._,start:Math.max(_.start-f,0),end:Math.min(_.end-f,p.length)}));o=Math.max(o,m),l={words:[{text:p,styles:x,width:d}],width:m}}continue}else if(c.forceWrap)l.words.length&&(a.push(l),o=Math.max(o,l.width)),l={words:[],width:0};else if(l.words.length&&l.width+(d-1)>e){let p=l.words.at(-1);p?.text.at(-1)===\" \"&&(l.words.pop(),l.width-=p.width),a.push(l),o=Math.max(o,l.width),l={words:[],width:0}}c.width=d,l.words.push(c),l.width+=d}return l.words.length&&(a.push(l),o=Math.max(o,l.width)),n.debug(),{lines:a,backgroundWidth:o}}s(pT,\"wrapJsonText\");var gT=new THREE.TextureLoader().load(cT);function _T(){return{type:\"bitmap\",ascent:7,width:6,atlas:gT,bitmapUV:{x:0,y:0,width:8,height:8}}}s(_T,\"createMissingCharacter\");var vc=class{type;loaded=!1;constructor(e){this.type=e.type}static fromAssetPath(e){e.endsWith(\".json\")||(e+=\".json\");let n=Mi(e);switch(n.type){case\"bitmap\":return new yd(n);case\"reference\":return new vd(n);case\"space\":return new bd(n);default:throw new Error(`Unsupported font provider type: ${n.type}`)}}};s(vc,\"FontProvider\");var vd=class extends vc{reference;constructor(e){super(e);let n=Fr(e.id,\"font\");this.reference=new Xo(e.id,n+\".json\")}async load(){return this.loaded?this:(await this.reference.load(),this.loaded=!0,this)}getChar(e){let n=this.reference.getChar(e);if(!(n.type===\"bitmap\"&&n.atlas===gT))return n}};s(vd,\"ReferenceFontProvider\");var bd=class extends vc{advances;constructor(e){super(e),this.advances=e.advances}load(){return this.loaded?this:(this.loaded=!0,this)}getChar(e){if(this.advances[e]!==void 0)return{type:\"space\",width:this.advances[e]}}};s(bd,\"SpaceFontProvider\");var yd=class extends vc{bitmapPath;charHeight;charWidth;ascent;chars=[];atlas=THREE.Texture.DEFAULT_IMAGE;canvas=document.createElement(\"canvas\");charCache=new Map;constructor(e){super(e),this.type=e.type,this.bitmapPath=Fr(e.file,\"textures\"),this.charHeight=e.height??8,this.charWidth=8,this.ascent=e.ascent;for(let n of e.chars)this.chars.push(new hn(n))}async load(){if(this.loaded)return this;let e=Zo(this.bitmapPath),n=await new THREE.TextureLoader().loadAsync(e);return this.atlas=n,this.charHeight=n.image.height/this.chars.length,this.charWidth=n.image.width/this.chars[0].length,this.canvas.width=n.image.width,this.canvas.height=n.image.height,this.canvas.getContext(\"2d\",{willReadFrequently:!0}).drawImage(this.atlas.image,0,0),this.loaded=!0,this}getCharIndex(e){for(let n of this.chars)if(n.includes(e))return[this.chars.indexOf(n),n.indexOf(e)];return[-1,-1]}getChar(e){let n=this.charCache.get(e);if(n)return n;let i=this.getCharIndex(e);if(i[0]===-1)return;let a=i[1]*this.charWidth,r=i[0]*this.charHeight,o=this.canvas.getContext(\"2d\").getImageData(a,r,this.charWidth,this.charHeight),l=0;for(let c=0;c<this.charWidth;c++)for(let d=0;d<this.charHeight;d++){let u=(d*this.charWidth+c)*4;if(o.data[u+3]>0){l=c+1;break}}return l===0?_T():(this.charCache.set(e,{type:\"bitmap\",ascent:this.ascent,width:l+1,atlas:this.atlas,bitmapUV:{x:a,y:r,width:l,height:this.charHeight}}),this.charCache.get(e))}};s(yd,\"BitmapFontProvider\");var Xs=class{id;providers=[];fallback;loaded=!1;charCache=new Map;geoCache=new Map;materialCache=new Map;constructor(e,n,i){this.id=e,this.fallback=i;let a;try{a=Mi(n)}catch(r){throw console.error(`Failed to load font JSON from ${n}:`,r),r}for(let r of a.providers)switch(r.type){case\"bitmap\":this.providers.push(new yd(r));break;case\"reference\":this.providers.push(new vd(r));break;case\"space\":this.providers.push(new bd(r));break;default:throw new Error(`Unsupported font provider type: ${r.type}`)}Xs.all.push(this)}static getById(e){return Xs.all.find(n=>n.id===e)}async load(){return this.loaded?this:(await Promise.all(this.providers.map(e=>e.load())),this.loaded=!0,this)}getChar(e){let n=this.charCache.get(e);if(n)return n;for(let i of this.providers){let a=i.getChar(e);if(a)return this.charCache.set(e,a),a}return _T()}getTextWidth(e,n){let i=0,a=n?.style.bold?1:0,r=this;if(n?.style.font&&n.style.font!==this.id){let o=Xs.getById(n.style.font);o&&(r=o)}for(let o of e){if(o===`\n`)break;let l=r.getChar(o);if(!l){console.warn(\"Encountered unknown character while getting text width:\",o);continue}i+=l.width+a}return Math.max(i,0)}getWordWidth(e){let n=0,i=this;for(let a of e.styles){if(a.style.font&&a.style.font!==this.id){let l=Xs.getById(a.style.font);l&&(i=l)}let r=e.text.slice(a.start,a.end),o=i.getTextWidth(r,a);n+=o}return Math.max(n,0)}getColorMaterial(e){let n=e.toHex8String(),i=this.materialCache.get(n);if(!i){let a=e.getAlpha();a<1?i=new THREE.MeshBasicMaterial({color:e.toHexString(),transparent:!0,opacity:a}):i=new THREE.MeshBasicMaterial({color:e.toHexString()}),this.materialCache.set(n,i)}return i}async generateTextDisplayMesh({jsonText:e,maxLineWidth:n=ve.properties.maxLineWidth.default,backgroundColor:i=tinycolor(ve.properties.backgroundColor.default),shadow:a=ve.properties.shadow.default,alignment:r=ve.properties.align.default}){let o=new pi(\"Generate Text Display Mesh\").start(),{lines:l,backgroundWidth:c}=await pT(e,n),d=c+1,u=(l.length||1)*10+1,p=[],m=[],f={x:0,y:u-9};for(let b of l){switch(r){case\"center\":f.x=-d/2+Math.ceil((d-b.width)/2);break;case\"right\":f.x=-d/2+d-b.width;break;default:f.x=-d/2+1}for(let y of b.words)for(let w of y.styles){let S=[],F=[],N=y.text.slice(w.start,w.end);for(let k of N){let R=this.getCharGeo(k,w.style);if(!R){console.error(\"Failed to get character geometry:\",k);continue}if(R.geo){let D=R.geo.clone();if(D.translate(f.x,f.y,0),S.push(D),a){let B=R.geo.clone();B.translate(f.x+1,f.y-1,-.01),F.push(B)}}f.x+=R.width}if(S.length>0){p.push(wa(S));let k=jt.getColor(w.style.color??vo.white);m.push(this.getColorMaterial(k)),a&&F.length>0&&(p.push(wa(F)),w.style.shadow_color?m.push(this.getColorMaterial(jt.getColor(w.style.shadow_color))):m.push(this.getColorMaterial(tinycolor(new THREE.Color(k.toHexString()).multiplyScalar(.25).getHexString()))))}}f.y-=10}let g=new THREE.Mesh,x=s(b=>(b.scale(.4,.4,.4),b.rotateY(Math.PI),b.translate(1/5,0,0),b),\"transform\");if(p.length>0){let b=x(wa(p,!0)),y=new THREE.Mesh(b,m);y.name=\"text\",g.add(y)}let _=x(new THREE.PlaneBufferGeometry(d,u).translate(0,u/2,-.05)),h=new THREE.Mesh(_,new THREE.MeshBasicMaterial({color:i.toHexString(),opacity:i.getAlpha(),transparent:!0}));h.name=\"background\",g.add(h);let v=new THREE.LineSegments(new THREE.EdgesGeometry(_),Canvas.outlineMaterial);return v.no_export=!0,v.renderOrder=2,v.frustumCulled=!1,o.debug({mesh:g,hitbox:_,outline:v}),{mesh:g,hitbox:_,outline:v}}getCharGeo(e,n){let i=this;if(n.font){let d=Xs.getById(n.font);d&&(i=d)}let a=(0,hT.createHash)(\"sha256\");a.update(e),a.update(\";\"+i.id),n.bold&&a.update(\"bold\"),n.italic&&a.update(\"italic\"),n.underlined&&a.update(\"underlined\"),n.strikethrough&&a.update(\"strikethrough\"),n.font&&a.update(\";\"+i.id);let r=a.digest(\"hex\"),o=i.getChar(e),l=n.bold?1:0,c=this.geoCache.get(r);if(c===void 0){let d=document.createElement(\"canvas\");o.type===\"space\"?(d.width=o.width,d.height=7):(d.width=o.bitmapUV.width,d.height=o.bitmapUV.height);let u=d.getContext(\"2d\",{willReadFrequently:!0});u.imageSmoothingEnabled=!1,u.clearRect(0,0,d.width,d.height),o.type!==\"space\"&&u.drawImage(o.atlas.image,o.bitmapUV.x,o.bitmapUV.y,o.bitmapUV.width,o.bitmapUV.height,0,0,d.width,d.height);let p=u.getImageData(0,0,d.width,d.height),m=new THREE.BufferGeometry,f={vertices:[],indices:[],uvs:[]},g=s((x,_,h,v)=>{let b=f.vertices.length/3;f.vertices.push(x,_,0,x+h,_,0,x+h,_+v,0,x,_+v,0),f.indices.push(b,b+1,b+2,b,b+2,b+3)},\"createQuad\");if(o.type!==\"space\")for(let x=0;x<d.height;x++){let _=-x+o.ascent,h=0;for(let v=0;v<d.width;v++){let b=(x*d.width+v)*4;if(p.data[b+3]===0){h>0&&(g(v-h,_,h+l,1),h=0);continue}else h++}h>0&&g(d.width-h,_,h+l,1)}if(m.setIndex(f.indices),m.setAttribute(\"position\",new THREE.BufferAttribute(new Float32Array(f.vertices),3)),n.italic&&(m.applyMatrix4(new THREE.Matrix4().makeShear(0,0,.2,0,0,0)),m.translate(-1,0,0)),f.vertices=Array.from(m.getAttribute(\"position\").array),f.indices=Array.from(m.getIndex().array),n.underlined&&g(-1,-1,d.width+2,1),o.type===\"space\")n.strikethrough&&g(-1,3.5,d.width+2,1);else if(n.strikethrough){let x=o.ascent/2;g(-1,x,d.width+2,1)}m.setIndex(f.indices),m.setAttribute(\"position\",new THREE.BufferAttribute(new Float32Array(f.vertices),3)),m.attributes.position.needsUpdate=!0,c={geo:m,width:o.width+l},this.geoCache.set(r,c)}return c}},Xo=Xs;s(Xo,\"MinecraftFont\"),lt(Xo,\"all\",[]);var xc,mT,fT;function U0e(){console.log(\"Loading Minecraft fonts...\"),xc=new Xo(\"minecraft:default\",\"assets/minecraft/font/default.json\"),mT=new Xo(\"minecraft:illageralt\",\"assets/minecraft/font/illageralt.json\",xc),fT=new Xo(\"minecraft:alt\",\"assets/minecraft/font/alt.json\",xc),Promise.all([xc.load(),mT.load(),fT.load()]).then(()=>{console.log(\"Minecraft fonts loaded!\"),requestAnimationFrame(()=>K.MINECRAFT_FONTS_LOADED.publish())})}s(U0e,\"loadMinecraftFonts\");async function _c(){return xc||await new Promise(t=>{K.MINECRAFT_FONTS_LOADED.subscribe(()=>t())}),xc.load()}s(_c,\"getVanillaFont\");K.MINECRAFT_ASSETS_LOADED.subscribe(()=>{U0e()});var gn=class extends OutlinerElement{type=\"resizable\";name;position;rotation;scale;visibility;preview_controller=q0e;movable=!0;rotatable=!0;scalable=!0;resizable=!0;get from(){return this.position}set from(e){this.position=e}get to(){return[0,0,0]}get stretch(){return[]}get uv_offset(){return[]}constructor(e,n=guid()){super(e,n),this.extend(e),this.name??=\"resizable_outliner_element\",this.position??=[0,0,0],this.rotation??=[0,0,0],this.scale??=[1,1,1],this.visibility??=!0}get origin(){return this.position}getWorldCenter(){return Reusable.vec3.set(0,0,0),THREE.fastWorldPosition(this.mesh,Reusable.vec2).add(Reusable.vec3)}extend(e){let n=this.constructor.properties;for(let i in n)n[i].merge(this,e);return this}selectLow(){return Project.selected_elements.safePush(this),this.selected=!0,TickUpdates.selection=!0,this}size(e,n){return e===void 0?n?this.scale.map(i=>Math.floor(i)):[...this.scale]:n?Math.floor(this.scale[e]):this.scale[e]}oldScale;resize(e,n){let i=this.oldScale??this.size(n);i instanceof Array&&(i=i[n]);let a=i<0&&n!==1?-1:1,r=typeof e==\"function\"?e:o=>o+e*a/16;this.scale[n]=r(i),this.preview_controller.updateGeometry?.(this),this.preview_controller.updateTransform(this)}getSaveCopy(){let e=super.getSaveCopy?.()??{};return e.uuid=this.uuid,e.type=this.type,e}};s(gn,\"ResizableOutlinerElement\"),gn=Do([Yo],gn);new Property(gn,\"string\",\"name\",{default:\"resizable_outliner_element\"});new Property(gn,\"vector\",\"position\",{default:[0,0,0]});new Property(gn,\"vector\",\"rotation\",{default:[0,0,0]});new Property(gn,\"vector\",\"scale\",{default:[1,1,1]});new Property(gn,\"boolean\",\"visibility\",{default:!0});new Property(gn,\"boolean\",\"locked\",{default:!1});new Property(gn,\"boolean\",\"export\",{default:!0});var q0e=new NodePreviewController(gn,{setup(t){let e=new THREE.Mesh;e.isElement=!0,e.fix_rotation=new THREE.Euler(0,0,0,\"ZYX\"),e.fix_rotation.x=Math.degToRad(t.rotation[0]),e.fix_rotation.y=Math.degToRad(t.rotation[1]),e.fix_rotation.z=Math.degToRad(t.rotation[2]),e.fix_position=new THREE.Vector3(...t.position),e.fix_scale=new THREE.Vector3(...t.scale),Project.nodes_3d[t.uuid]=e,t.preview_controller.updateGeometry?.(t),t.preview_controller.dispatchEvent(\"setup\",{element:t})},updateTransform(t){NodePreviewController.prototype.updateTransform.call(t.preview_controller,t),t.mesh.fix_position&&(t.mesh.fix_position.set(...t.position),t.parent instanceof Group&&(t.mesh.fix_position.x-=t.parent.origin[0],t.mesh.fix_position.y-=t.parent.origin[1],t.mesh.fix_position.z-=t.parent.origin[2])),t.mesh.fix_rotation&&t.mesh.fix_rotation.copy(t.mesh.rotation),t.mesh.fix_scale&&(t.mesh.fix_scale.set(...t.scale),sT(t.mesh.fix_scale)),t.preview_controller.dispatchEvent(\"update_transform\",{element:t})}});var Px={};vn(Px,{getBlockModel:()=>Mx,parseBlockModel:()=>Wa,parseBlockState:()=>ET,validateBlockState:()=>Bx});var Nx={};vn(Nx,{applyModelDisplayTransform:()=>gf,getItemModel:()=>Fx});var ff=`\n\tattribute float highlight;\n\n\tuniform bool SHADE;\n\tuniform int LIGHTSIDE;\n\n\tvarying vec2 vUv;\n\tvarying float light;\n\tvarying float lift;\n\n\tfloat AMBIENT = 0.5;\n\tfloat XFAC = -0.15;\n\tfloat ZFAC = 0.05;\n\n\tvoid main()\n\t{\n\n\t\tif (SHADE) {\n\n\t\t\tvec3 N = normalize( vec3( modelMatrix * vec4(normal, 0.0) ) );\n\n\t\t\tif (LIGHTSIDE == 1) {\n\t\t\t\tfloat temp = N.y;\n\t\t\t\tN.y = N.z * -1.0;\n\t\t\t\tN.z = temp;\n\t\t\t}\n\t\t\tif (LIGHTSIDE == 2) {\n\t\t\t\tfloat temp = N.y;\n\t\t\t\tN.y = N.x;\n\t\t\t\tN.x = temp;\n\t\t\t}\n\t\t\tif (LIGHTSIDE == 3) {\n\t\t\t\tN.y = N.y * -1.0;\n\t\t\t}\n\t\t\tif (LIGHTSIDE == 4) {\n\t\t\t\tfloat temp = N.y;\n\t\t\t\tN.y = N.z;\n\t\t\t\tN.z = temp;\n\t\t\t}\n\t\t\tif (LIGHTSIDE == 5) {\n\t\t\t\tfloat temp = N.y;\n\t\t\t\tN.y = N.x * -1.0;\n\t\t\t\tN.x = temp;\n\t\t\t}\n\n\t\t\tfloat yLight = (1.0+N.y) * 0.5;\n\t\t\tlight = yLight * (1.0-AMBIENT) + N.x*N.x * XFAC + N.z*N.z * ZFAC + AMBIENT;\n\n\t\t} else {\n\n\t\t\tlight = 1.0;\n\n\t\t}\n\n\t\tif (highlight == 2.0) {\n\t\t\tlift = 0.22;\n\t\t} else if (highlight == 1.0) {\n\t\t\tlift = 0.1;\n\t\t} else {\n\t\t\tlift = 0.0;\n\t\t}\n\n\t\tvUv = uv;\n\t\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\t\tgl_Position = projectionMatrix * mvPosition;\n\t}`,hf=`\n\t#ifdef GL_ES\n\tprecision highp float;\n\t#endif\n\n\tuniform sampler2D map;\n\n\tuniform bool SHADE;\n\tuniform bool EMISSIVE;\n\tuniform vec3 LIGHTCOLOR;\n\n\tvarying vec2 vUv;\n\tvarying float light;\n\tvarying float lift;\n\n\tvoid main(void)\n\t{\n\t\tvec4 color = texture2D(map, vUv);\n\n\t\tif (color.a < 0.01) discard;\n\n\t\tif (EMISSIVE == false) {\n\n\t\t\tgl_FragColor = vec4(lift + color.rgb * light, color.a);\n\t\t\tgl_FragColor.r = gl_FragColor.r * LIGHTCOLOR.r;\n\t\t\tgl_FragColor.g = gl_FragColor.g * LIGHTCOLOR.g;\n\t\t\tgl_FragColor.b = gl_FragColor.b * LIGHTCOLOR.b;\n\n\t\t} else {\n\n\t\t\tfloat light_r = (light * LIGHTCOLOR.r) + (1.0 - light * LIGHTCOLOR.r) * (1.0 - color.a);\n\t\t\tfloat light_g = (light * LIGHTCOLOR.g) + (1.0 - light * LIGHTCOLOR.g) * (1.0 - color.a);\n\t\t\tfloat light_b = (light * LIGHTCOLOR.b) + (1.0 - light * LIGHTCOLOR.b) * (1.0 - color.a);\n\t\t\tgl_FragColor = vec4(lift + color.r * light_r, lift + color.g * light_g, lift + color.b * light_b, 1.0);\n\n\t\t}\n\n\t\tif (lift > 0.2) {\n\t\t\tgl_FragColor.r = gl_FragColor.r * 0.6;\n\t\t\tgl_FragColor.g = gl_FragColor.g * 0.7;\n\t\t}\n\t}`;var H0e=new THREE.TextureLoader,xT=new Map;async function Fx(t,e){await Qo();let n=t+\"|\"+e,i=xT.get(n);if(i||(i=await vT(J0e(t),e),xT.set(n,i)),!!i)return i={mesh:i.mesh.clone(!0),outline:i.outline.clone(!0),boundingBox:i.boundingBox.clone(),isBlock:i.isBlock},i.mesh.geometry=i.mesh.geometry.clone(),i.outline.geometry=i.outline.geometry.clone(),i.mesh.name=t,i.isBlock?i.mesh.isVanillaBlockModel=!0:i.mesh.isVanillaItemModel=!0,i}s(Fx,\"getItemModel\");function J0e(t){let e=bc(t);return e.namespace+\":item/\"+e.path}s(J0e,\"getItemResourceLocation\");var G0e={thirdperson_righthand:{translation:[0,3,1],scale:[.55,.55,.55]},thirdperson_lefthand:{translation:[0,3,1],scale:[.55,.55,.55]},firstperson_righthand:{rotation:[0,-90,25],translation:[1.13,3.2,1.13],scale:[.68,.68,.68]},firstperson_lefthand:{rotation:[0,-90,25],translation:[1.13,3.2,1.13],scale:[.68,.68,.68]},ground:{translation:[0,2,0],scale:[.5,.5,.5]},head:{rotation:[0,-180,0],translation:[0,13,7]},fixed:{rotation:[0,-180,0]}};function gf(t,e,n){if(n===\"none\"||!e.display)return;!e.display.thirdperson_lefthand&&e.display.thirdperson_righthand&&(e.display.thirdperson_lefthand=structuredClone(e.display.thirdperson_righthand)),!e.display.firstperson_lefthand&&e.display.firstperson_righthand&&(e.display.firstperson_lefthand=structuredClone(e.display.thirdperson_righthand));let i=e.display[n];if(!i)return;let a=new THREE.Matrix4;if(i.rotation){let r=i.rotation.map(o=>o*Math.PI/180);a.makeRotationFromEuler(Reusable.euler1.set(-r[0],-r[1],r[2]))}i.translation&&a.setPosition(Reusable.vec1.set(i.translation[0],i.translation[1],i.translation[2])),i.scale&&a.scale(Reusable.vec2.set(...i.scale)),t.boundingBox.applyMatrix4(a),t.outline.geometry.applyMatrix4(a),t.mesh.applyMatrix4(a)}s(gf,\"applyModelDisplayTransform\");async function vT(t,e,n){let i=Fr(t,\"models\"),a;try{a=Mi(i+\".json\")}catch{a=Mi(i.replace(\"item/\",\"block/\")+\".json\")}if(n&&(n.textures!==void 0&&(a.textures??={},Object.assign(a.textures,n.textures)),n.elements!==void 0&&(a.elements=n.elements),n.display!==void 0&&Object.assign(a.display,n.display),n.gui_light!==void 0&&(a.gui_light=n.gui_light),n.overrides!==void 0&&(a.overrides=n.overrides)),a.parent){let r=bc(a.parent);if(r.type===\"block\")return await Wa({model:a.parent,isItemModel:!0},a,e);if(r.path===\"item/generated\"){let o=await W0e(t,a);return a.display??=G0e,gf(o,a,e),o}else return await vT(a.parent,e,a)}else return await Wa({model:t,isItemModel:!0},a,e)}s(vT,\"parseItemModel\");async function W0e(t,e){let n=new THREE.Mesh,i=[],a=[];for(let c of Object.values(e.textures)){let d=Fr(c,\"textures\")+\".png\",u=Zo(d),p=await H0e.loadAsync(u);p.magFilter=THREE.NearestFilter,p.minFilter=THREE.NearestFilter;let m=new THREE.ShaderMaterial({uniforms:{map:{type:\"t\",value:p},SHADE:{type:\"bool\",value:settings.shading.value},LIGHTCOLOR:{type:\"vec3\",value:new THREE.Color().copy(Canvas.global_light_color).multiplyScalar(settings.brightness.value/50)},LIGHTSIDE:{type:\"int\",value:Canvas.global_light_side},EMISSIVE:{type:\"bool\",value:!1}},vertexShader:ff,fragmentShader:hf,blending:THREE.NormalBlending,side:Canvas.getRenderSide(),transparent:!0});m.map=p,m.name=t;let f=new THREE.Mesh(new THREE.BoxGeometry(1,1,1),m),g=[],x=[],_=[],h=[],v=[],b=s((S,F,N)=>{h.push(S,F,N,S,F,N,S,F,N,S,F,N)},\"addNormal\");if(p?.image.width){let S=document.createElement(\"canvas\"),F=S.getContext(\"2d\");S.width=p.image.width,S.height=p.image.height,F.drawImage(p.image,0,0);let N=s((G,W,ee,Z,me)=>{let X=g.length/3,Q=me===1?-1:0;g.push(-G,Q,W,-G,Q,W+1,-G-ee,Q,W+Z,-G-ee,Q,W+Z-1),me===1?x.push(X+0,X+1,X+2,X+0,X+2,X+3):me===-1&&x.push(X+0,X+2,X+1,X+0,X+3,X+2),b(me,0,0),_.push((G+ee)/S.width,1-W/S.height,(G+ee)/S.width,1-(W+Z)/S.height,G/S.width,1-(W+Z)/S.height,G/S.width,1-W/S.height),v.push(1,1,1,1,1,1,1,1,1,1,1,1)},\"addFace\"),k=s((G,W,ee,Z,me)=>{let X=g.length/3;g.push(-G,0,W,-G,-1,W,-ee,-1,Z,-ee,0,Z),me===1?x.push(X+0,X+1,X+2,X+0,X+2,X+3):me===-1&&x.push(X+0,X+2,X+1,X+0,X+3,X+2),G==ee&&(G+=.1*-me,ee+=.4*-me,W+=.1,Z-=.1,b(-me,0,0)),W==Z&&(W+=.1*me,Z+=.4*me,G+=.1,ee-=.1,b(0,0,-me)),_.push(ee/S.width,1-W/S.height,ee/S.width,1-Z/S.height,G/S.width,1-Z/S.height,G/S.width,1-W/S.height),v.push(1,1,1,1,1,1,1,1,1,1,1,1)},\"addEdge\"),R=F.getImageData(0,0,S.width,S.height),D=[];for(let G=0;G<R.data.length;G+=4)D.push(R.data[G+3]>140?1:0);let B=D.slice(),q=0;for(let G=0;G<S.height;G++)for(let W=0;W<S.width;W++)q=D[G*S.width+W],q&&(N(W,G,1,1,1),N(W,G,1,1,-1));for(let G=0;G<S.height;G++)for(let W=0;W<=S.width;W++){let ee=W==0?0:D[G*S.width+W-1],Z=W==S.width?0:D[G*S.width+W];!ee!=!Z&&k(W,G,W,G+1,ee?1:-1)}for(let G=0;G<S.width;G++)for(let W=0;W<=S.height;W++){let ee=W==0?0:B[(W-1)*S.width+G],Z=W==S.height?0:B[W*S.width+G];!ee!=!Z&&k(G,W,G+1,W,ee?-1:1)}}g.forEach((S,F)=>{g[F]=S+[8,.5,-8][F%3]}),f.geometry.setAttribute(\"position\",new THREE.BufferAttribute(new Float32Array(g),3)),f.geometry.setAttribute(\"highlight\",new THREE.BufferAttribute(new Uint8Array(f.geometry.attributes.position.count),1)),f.geometry.setIndex(x),f.geometry.setAttribute(\"uv\",new THREE.BufferAttribute(new Float32Array(_),2)),f.geometry.setAttribute(\"color\",new THREE.BufferAttribute(new Float32Array(v),3)),f.geometry.setAttribute(\"normal\",new THREE.BufferAttribute(new Float32Array(h),3)),f.geometry.attributes.color.needsUpdate=!0,f.geometry.attributes.normal.needsUpdate=!0,f.geometry.rotateX(Math.PI/2);let y=f.geometry.clone(),w=Array.from(y.attributes.position.array);w.splice(0,24),y.setAttribute(\"position\",new THREE.BufferAttribute(new Float32Array(w),3)),a.push(y),i.push(f.geometry.clone()),n.add(f)}let r=wa(a),o=wa(i),l=new THREE.LineSegments(new THREE.EdgesGeometry(r),Canvas.outlineMaterial);return{mesh:n,outline:l,boundingBox:o}}s(W0e,\"generateItemMesh\");var K0e=new THREE.TextureLoader,bT=new Map,yT=new Map([[\"water\",A(\"block_model_manager.fluid_warning\")],[\"lava\",A(\"block_model_manager.fluid_warning\")],[\"player_head\",A(\"block_model_manager.mob_head_warning\")],[\"player_wall_head\",A(\"block_model_manager.mob_head_warning\")],[\"skeleton_skull\",A(\"block_model_manager.mob_head_warning\")],[\"skeleton_wall_skull\",A(\"block_model_manager.mob_head_warning\")],[\"wither_skeleton_skull\",A(\"block_model_manager.mob_head_warning\")],[\"wither_skeleton_wall_skull\",A(\"block_model_manager.mob_head_warning\")],[\"creeper_head\",A(\"block_model_manager.mob_head_warning\")],[\"creeper_wall_head\",A(\"block_model_manager.mob_head_warning\")],[\"zombie_head\",A(\"block_model_manager.mob_head_warning\")],[\"zombie_wall_head\",A(\"block_model_manager.mob_head_warning\")],[\"dragon_head\",A(\"block_model_manager.mob_head_warning\")],[\"dragon_wall_head\",A(\"block_model_manager.mob_head_warning\")],[\"piglin_head\",A(\"block_model_manager.mob_head_warning\")],[\"piglin_wall_head\",A(\"block_model_manager.mob_head_warning\")]]);async function Mx(t){await Qo();let e=bT.get(t);if(!e){let n=await wd(t);if(!n)return;if(yT.has(t))throw new Error(yT.get(t));e=await ET(n),bT.set(t,e)}if(e){e={mesh:e.mesh.clone(!0),outline:e.outline.clone(!0),boundingBox:e.boundingBox.clone(),isBlock:!0};for(let n of e.mesh.children)n.geometry=n.geometry.clone();return e.mesh.geometry=e.mesh.geometry.clone(),e.mesh.name=t,e.mesh.isVanillaBlockModel=!0,e}}s(Mx,\"getBlockModel\");async function Wa(t,e,n=\"none\"){let i=Fr(t.model,\"models\"),a=Mi(i+\".json\");if(e&&(e.textures!==void 0&&(a.textures??={},Object.assign(a.textures,e.textures)),e.elements!==void 0&&(a.elements=e.elements),e.display!==void 0&&(a.display=Object.assign(a.display??{},e.display)),e.ambientocclusion!==void 0&&(a.ambientocclusion=e.ambientocclusion)),a.parent){let o={...t,model:a.parent};return await Wa(o,a,n)}let r=await Y0e(t,a);return gf(r,a,n),r}s(Wa,\"parseBlockModel\");async function Y0e(t,e){if(console.log(`Generating block mesh for '${t.model}':`,`\n - Variant`,t,`\n - Model`,e),!e.elements)throw new Error(`No elements defined in block model '${t.model}'`);if(!e.textures)throw new Error(`No textures defined in block model '${t.model}'`);let n=new THREE.Mesh,i=[],a=[];for(let c of e.elements){let d=[c.to[0]-c.from[0],c.to[1]-c.from[1],c.to[2]-c.from[2]],u=[c.from[0]+(c.to[0]-c.from[0])/2,c.from[1]+(c.to[1]-c.from[1])/2,c.from[2]+(c.to[2]-c.from[2])/2];d[0]===0&&(d[0]+=.01,u[0]-=.005),d[1]===0&&(d[1]+=.01,u[1]-=.005),d[2]===0&&(d[2]+=.01,u[2]-=.005);let p=new THREE.BoxGeometry(...d);if(p.translate(...u),c.rotation){let h;c.rotation.rescale&&(h=getRescalingFactor(c.rotation.angle));let v=c.rotation.origin;switch(v&&p.translate(...v.map(b=>-b)),c.rotation.axis){case\"x\":p.rotateX(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(1,h,h);break;case\"y\":p.rotateY(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(h,1,h);break;case\"z\":p.rotateZ(Math.degToRad(c.rotation.angle)),h!==void 0&&p.scale(h,h,1);break}v&&p.translate(...v)}p.translate(-8,-8,-8),p.rotateY(Math.degToRad(180)),t.x&&p.rotateX(Math.degToRad(t.x)),t.y&&p.rotateY(-Math.degToRad(t.y)),p.rotateY(Math.degToRad(-180)),t.isItemModel||p.translate(8,8,8);let m=[];for(let h=0;h<6;h++)m.push(0+h*4,2+h*4,1+h*4,2+h*4,3+h*4,1+h*4),p.addGroup(h*6,6,h);if(p.setIndex(m),p.setAttribute(\"highlight\",new THREE.BufferAttribute(new Uint8Array(p.attributes.position.count),1)),!c.faces)throw new Error(`No faces defined in element for block model '${t.model}'`);let f=[],g=[];for(let h of Canvas.face_order){let v=c.faces[h];if(!v){g.push(Canvas.transparentMaterial),f.push(0,0,0,0,0,0,0,0);continue}let b=(await wT(e.textures,v.texture)).clone(),y=new THREE.ShaderMaterial({uniforms:{map:new THREE.Uniform(b),SHADE:{type:\"bool\",value:settings.shading.value},LIGHTCOLOR:{type:\"vec3\",value:new THREE.Color().copy(Canvas.global_light_color).multiplyScalar(settings.brightness.value/50)},LIGHTSIDE:{type:\"int\",value:Canvas.global_light_side},EMISSIVE:{type:\"bool\",value:!1}},vertexShader:ff,fragmentShader:hf,blending:THREE.NormalBlending,side:Canvas.getRenderSide(),transparent:!0});y.map=b,y.name=t.model,g.push(y);let w=16,S=16;if(v.uv){let[F,N,k,R]=v.uv,D=[[F/w,N/S],[k/w,N/S],[F/w,R/S],[k/w,R/S]];if(v.rotation){let B=v.rotation+0;for(;B>0;){let q=D[0];D[0]=D[2],D[2]=D[3],D[3]=D[1],D[1]=q,B-=90}}b.flipY=!1,f.push(...D.flat())}else{let[F,N,k]=c.from,[R,D,B]=d;switch(h){case\"down\":f.push(F/w,k/S,(F+R)/w,k/S,F/w,(k+B)/S,(F+R)/w,(k+B)/S);break;case\"up\":f.push(F/w,k/S,(F+R)/w,k/S,F/w,(k+B)/S,(F+R)/w,(k+B)/S);break;case\"north\":f.push((F+R)/w,(N+D)/S,F/w,(N+D)/S,(F+R)/w,N/S,F/w,N/S);break;case\"south\":f.push((F+R)/w,(N+D)/S,F/w,(N+D)/S,(F+R)/w,N/S,F/w,N/S);break;case\"west\":f.push((k+B)/w,(N+D)/S,k/w,(N+D)/S,(k+B)/w,N/S,k/w,N/S);break;case\"east\":f.push((k+B)/w,(N+D)/S,k/w,(N+D)/S,(k+B)/w,N/S,k/w,N/S);break}}b.needsUpdate=!0}p.setAttribute(\"uv\",new THREE.Float32BufferAttribute(f,2)),p.attributes.uv.needsUpdate=!0,i.push(p.clone());let x=new THREE.EdgesGeometry(p);a.push(x);let _=new THREE.Mesh(p,g);n.add(_)}let r=wa(a),o=new THREE.LineSegments(r,Canvas.outlineMaterial),l=wa(i);return o.no_export=!0,o.renderOrder=2,o.frustumCulled=!1,{mesh:n,outline:o,boundingBox:l,isBlock:!0}}s(Y0e,\"generateModelMesh\");var Rx=new Map;async function wT(t,e){e.at(0)===\"#\"&&(e=e.slice(1));let n=t[e];if(n?.at(0)===\"#\")return await wT(t,n.slice(1));let i=Fr(n,\"textures\")+\".png\";if(Rx.has(i))return Rx.get(i);let a;if(Lx(i+\".mcmeta\")){let r=new Image;r.src=Zo(i);let o=document.createElement(\"canvas\"),l=o.getContext(\"2d\");await new Promise(c=>{r.onload=()=>{o.width=r.width,o.height=r.width,l.drawImage(r,0,0),c()}}),a=new THREE.CanvasTexture(o)}else a=await K0e.loadAsync(Zo(i));return a.magFilter=THREE.NearestFilter,a.minFilter=THREE.NearestFilter,Rx.set(i,a),a}s(wT,\"loadTexture\");function Bx(t){if(t.blockStateRegistryEntry)for(let[e,n]of Object.entries(t.states))if(t.blockStateRegistryEntry.stateValues[e]){if(!t.blockStateRegistryEntry.stateValues[e].includes(n))return`Invalid block state value '${n.toString()}' for '${e}'. Expected one of: ${t.blockStateRegistryEntry.stateValues[e].join(\", \")}`}else return`Invalid block state '${e}' for '${t.resource.name}' Expected one of: ${Object.keys(t.blockStateRegistryEntry.stateValues).join(\", \")}`;else if(Object.keys(t.states).length>0)return`${t.resource.name} has no block states`;return\"\"}s(Bx,\"validateBlockState\");async function ET(t){let e=Fr(t.resourceLocation,\"blockstates\"),n=await Mi(e+\".json\");if(!t.blockStateRegistryEntry)throw new Error(`Block state registry entry not found for '${t.resource.name}'`);t.states=Object.assign({},t.blockStateRegistryEntry.defaultStates,t.states),console.log(\"Block states for\",t.resourceLocation,`\n - States`,t.states,`\n - Registry entry`,t.blockStateRegistryEntry);for(let[i,a]of Object.entries(t.states))if(t.blockStateRegistryEntry.stateValues[i]){if(!t.blockStateRegistryEntry.stateValues[i].includes(a))throw new Error(`Invalid block state value '${a.toString()}' for '${i}'. Expected one of: ${t.blockStateRegistryEntry.stateValues[i].join(\", \")}`)}else throw new Error(`Invalid block state '${i}' for '${t.resource.name}' Expected one of: ${Object.keys(t.blockStateRegistryEntry.stateValues).join(\", \")}`);if(n.variants){let i=n.variants[\"\"];if(i)return Array.isArray(i)?(console.warn(`Multiple weighted variants found for '${t.resourceLocation}' default variant. Using the first one.`),await Wa(i[0])):await Wa(i);for(let[a,r]of Object.entries(n.variants)){let o={},l=a.split(\",\");for(let u of l){let[p,m]=u.trim().split(\"=\"),f=Zs(m,!1);o[p]=f}if(!Object.entries(o).allAre(([u,p])=>kT(t,u,p,!1)))continue;let d;return Array.isArray(r)?(console.warn(`Multiple weighted variants found for '${t.resourceLocation}' variant '${a}'. Using the first one.`),d=await Wa(r[0])):d=await Wa(r),d}}else if(n.multipart){let i=new THREE.Mesh,a=[],r=[];for(let d of n.multipart){let u=await X0e(t,d);if(!u)continue;for(let m of u.mesh.children){let f=m.clone();f.geometry=f.geometry.clone(),f.rotateY(u.mesh.rotation.y),f.rotateX(u.mesh.rotation.x),i.add(f);let g=u.boundingBox.clone();g.rotateY(u.mesh.rotation.y),g.rotateX(u.mesh.rotation.x),a.push(g)}let p=u.outline.geometry.clone();p.rotateY(u.mesh.rotation.y),p.rotateX(u.mesh.rotation.x),r.push(p)}if(r.length===0)throw new Error(`The selected block state for '${t.resourceLocation}' has no model!`);let o=wa(r),l=new THREE.LineSegments(o,Canvas.outlineMaterial),c=wa(a);return l.no_export=!0,l.renderOrder=2,l.frustumCulled=!1,{mesh:i,outline:l,boundingBox:c,isBlock:!0}}throw new Error(`Unsupported block state '${t.resourceLocation}'`)}s(ET,\"parseBlockState\");async function X0e(t,e){if(e.when){let n=s(a=>{if(a.OR&&a.AND)throw new Error(\"Cannot have both OR and AND in a multipart case condition\");if(a.OR)return a.OR.some(o=>n(o));if(a.AND)return a.AND.every(o=>n(o));let r=!0;for(let[o,l]of Object.entries(a)){let c=Zs(l,!0);if(r=kT(t,o,c,!0),!r)break}return r},\"recurse\");if(!n(e.when))return}return Array.isArray(e.apply)?await Wa(e.apply[0]):await Wa(e.apply)}s(X0e,\"parseMultipartCase\");function kT(t,e,n,i){if(typeof n==\"string\"&&n.includes(\"|\")){if(!i)throw new Error(`Unsupported OR condition in block state '${e}': '${n}'`);n=n.split(\"|\")}if(typeof n==\"boolean\")return t.states[e]===n;if(typeof n==\"string\")return t.states[e]===n;if(typeof n==\"number\")return n===0?t.states[e]===n||t.states[e]===void 0:t.states[e]===n;if(i)return n.includes(t.states[e]);throw new Error(`Unsupported variant state type '${typeof n}'`)}s(kT,\"checkIfBlockStateMatches\");var Z0e=\"https://raw.githubusercontent.com/misode/mcmeta/summary/blocks/data.json\",_f=class{defaultStates={};stateValues={};constructor(e){for(let[n,i]of Object.entries(e[1]))this.defaultStates[n]=Zs(i,!1);for(let[n,i]of Object.entries(e[0]))this.stateValues[n]=i.map(a=>Zs(a,!1))}};s(_f,\"BlockStateRegistryEntry\");var yc={};function Q0e(){let t=localStorage.getItem(\"animated_java:blockStateRegistry\");if(!t){console.error(\"BlockState Registry not found in local storage\");return}let e=JSON.parse(t);for(let n in e)yc[n]=new _f(e[n])}s(Q0e,\"updateMemoryRegistry\");async function Vx(){console.log(\"Updating BlockState Registry...\");let t=3;for(;t-->=0;){let e;try{e=await fetch(Z0e)}catch(n){console.error(\"Failed to fetch latest BlockState registry:\",n)}if(e?.ok){let n=await e.json();localStorage.setItem(\"animated_java:blockStateRegistry\",JSON.stringify(n));let i=await no();localStorage.setItem(\"animated_java:blockStateRegistryVersion\",JSON.stringify(i)),console.log(\"BlockState Registry updated!\");return}}throw new Error(\"Failed to fetch latest BlockState registry after 3 retries.\")}s(Vx,\"updateLocalRegistry\");async function $0e(){if(console.log(\"Checking if BlockState Registry update...\"),!localStorage.getItem(\"animated_java:blockStateRegistry\")){console.log(\"No BlockState Registry found. Updating...\"),await Vx();return}let e=localStorage.getItem(\"animated_java:blockStateRegistryVersion\");if(!e){console.log(\"No BlockState Registry version found. Updating...\"),await Vx();return}let n=JSON.parse(e),i=await no();if(n.id!==i.id){console.log(\"BlockState Registry is outdated. Updating...\"),await Vx();return}console.log(\"BlockState Registry is up to date!\"),Q0e(),requestAnimationFrame(()=>K.BLOCKSTATE_REGISTRY_LOADED.publish())}s($0e,\"checkForRegistryUpdate\");async function wc(t){return Object.keys(yc).length===0?new Promise(e=>{K.BLOCKSTATE_REGISTRY_LOADED.subscribe(()=>{e(yc[t])},!0)}):yc[t]}s(wc,\"getBlockState\");K.PLUGIN_LOAD.subscribe(()=>{$0e().catch(t=>{console.error(t)})});var exe=\"https://raw.githubusercontent.com/misode/mcmeta/summary/registries/data.json\",xf=class{items=[];constructor(e){this.items=e}has(e){return this.items.includes(e)}find(e){return this.items.find(e)}};s(xf,\"MinecraftRegistryEntry\");var Xn={};function txe(){let t=localStorage.getItem(\"animated_java:minecraftRegistry\");if(!t){console.error(\"Minecraft Registry not found in local storage\");return}let e=JSON.parse(t);for(let n in e)Xn[n]=new xf(e[n])}s(txe,\"updateMemoryRegistry\");async function zx(){console.log(\"Updating Minecraft Registry...\");let t=3;for(;t-->=0;){let e;try{e=await fetch(exe)}catch(n){console.error(\"Failed to fetch latest Minecraft registry:\",n)}if(e?.ok){let n=await e.json();localStorage.setItem(\"animated_java:minecraftRegistry\",JSON.stringify(n));let i=await no();localStorage.setItem(\"animated_java:minecraftRegistryVersion\",JSON.stringify(i)),console.log(\"Minecraft Registry updated!\");return}}throw new Error(\"Failed to fetch latest Minecraft registry after 3 retries.\")}s(zx,\"updateLocalRegistry\");async function nxe(){if(console.log(\"Checking if Minecraft Registry update...\"),!localStorage.getItem(\"animated_java:minecraftRegistry\")){console.log(\"No Minecraft Registry found. Updating...\"),await zx();return}let e=localStorage.getItem(\"animated_java:minecraftRegistryVersion\");if(!e){console.log(\"No Minecraft Registry version found. Updating...\"),await zx();return}let n=JSON.parse(e),i=await no();if(n.id!==i.id){console.log(\"Minecraft Registry is outdated. Updating...\"),await zx();return}console.log(\"Minecraft Registry is up to date!\"),txe(),requestAnimationFrame(()=>K.MINECRAFT_REGISTRY_LOADED.publish())}s(nxe,\"checkForRegistryUpdate\");K.NETWORK_CONNECTED.subscribe(()=>{nxe().then(async()=>{await Ux()})});var qx=Canvas.outlineMaterial.clone();qx.color.set(\"#ff0000\");var $e=class extends gn{type=$e.type;icon=$e.icon;needsUniqueName=!0;__block=new ke(\"minecraft:stone\");onSummonFunction=$e.properties.onSummonFunction.default;configs;error=new ke(\"\");buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=ixe;constructor(e,n=guid()){super(e,n),$e.all.push(this);for(let i in $e.properties)$e.properties[i].reset(this);this.name=\"block_display\",this.extend(e),this.sanitizeName(),this.__block.subscribe(()=>{this.updateBlock()})}get block(){return this.__block===void 0?\"minecraft:stone\":this.__block.get()}set block(e){this.__block!==void 0&&this.block!==e&&this.__block.set(e)}getBlockValuable(){return this.__block}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}getUndoCopy(){let e={};for(let n in $e.properties)$e.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in $e.properties)$e.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),$e.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),$e.selected.remove(this),this.selected=!1,TickUpdates.selection=!0,this.preview_controller.updateHighlight(this))}async updateBlock(){let e=await vf(this.block);if(e){this.error.set(e),this.mesh?.outline instanceof THREE.LineSegments&&(this.error.get()?this.mesh.outline.material=qx:this.mesh.outline.material=Canvas.outlineMaterial);return}this.preview_controller.updateGeometry(this)}applyBlockModel(e){let n=this.mesh;n.name=this.uuid,n.geometry=e.boundingBox,n.material=Canvas.transparentMaterial,n.clear(),e.outline.name=this.uuid+\"_outline\",e.outline.visible=this.selected,n.outline=e.outline,n.add(e.mesh),n.add(e.outline),this.preview_controller.updateHighlight(this),this.preview_controller.updateTransform(this),n.visible=this.visibility}};s($e,\"VanillaBlockDisplay\"),lt($e,\"type\",`${Ke.name}:vanilla_block_display`),lt($e,\"icon\",\"deployed_code\"),lt($e,\"selected\",[]),lt($e,\"all\",[]),$e=Do([Yo],$e);$e.prototype.icon=$e.icon;new Property($e,\"string\",\"block\",{default:\"minecraft:stone\"});new Property($e,\"string\",\"onSummonFunction\",{default:\"\"});new Ga($e,\"configs\",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType($e,$e.type);var Hx=new THREE.TextureLoader().load(\"data:image/svg+xml,\"+encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#e3e3e3\"><path d=\"M440-183v-274L200-596v274l240 139Zm80 0 240-139v-274L520-457v274Zm-40-343 237-137-237-137-237 137 237 137ZM160-252q-19-11-29.5-29T120-321v-318q0-22 10.5-40t29.5-29l280-161q19-11 40-11t40 11l280 161q19 11 29.5 29t10.5 40v318q0 22-10.5 40T800-252L520-91q-19 11-40 11t-40-11L160-252Zm320-228Z\"/></svg>'));Hx.minFilter=THREE.NearestFilter;Hx.magFilter=THREE.NearestFilter;var ixe=new NodePreviewController($e,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Hx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/32);let i=t.mesh;i.add(n),i.sprite=n},updateGeometry(t){t.mesh&&Mx(t.block).then(e=>{e?.mesh&&t.applyBlockModel(e)}).catch(e=>{console.error(\"Failed to get block model:\",e),typeof e.message==\"string\"&&t.error.set(e.message)}).finally(()=>{t.mesh?.outline instanceof THREE.LineSegments&&(t.error.get()?t.mesh.outline.material=qx:t.mesh.outline.material=Canvas.outlineMaterial)})},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)},updateHighlight(t,e){if(!Fe()||!t?.mesh)return;let n=Modes.edit&&(e===!0||e===t||t.selected)?1:0,i=t.mesh.children.at(0);if(i)for(let a of i.children){if(!(a instanceof THREE.Mesh))continue;let r=a.geometry.attributes.highlight;r.array[0]!=n&&(r.array.set(Array(r.count).fill(n)),r.needsUpdate=!0)}}}),Ed=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!==\"root\"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),\"ZYX\");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x-=Math.degToRad(e[0])*n,i.rotation.y-=Math.degToRad(e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x*=1+(e[0]-1)*n||1e-5,i.scale.y*=1+(e[1]-1)*n||1e-5,i.scale.z*=1+(e[2]-1)*n||1e-5,this}};s(Ed,\"VanillaBlockDisplayAnimator\");Ed.prototype.type=$e.type;$e.animator=Ed;var jT=nn({id:\"animated-java:create-vanilla-block-display\"},{name:A(\"action.create_vanilla_block_display.title\"),icon:\"deployed_code\",category:\"animated_java\",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new $e({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit(\"Create Vanilla Block Display\",{outliner:!0,elements:selected,selection:!0}),t}}),AT=[];jT.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),AT.push(K.SELECT_PROJECT.subscribe(e=>{e.vanillaBlockDisplays??=[],$e.all.empty(),$e.all.push(...e.vanillaBlockDisplays)}),K.UNSELECT_PROJECT.subscribe(e=>{e.vanillaBlockDisplays=[...$e.all],$e.all.empty()}))});jT.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),AT.forEach(e=>e())});function TT(){let t=Math.floor(Math.sqrt(Xn.block.items.length));for(let e=0;e<Xn.block.items.length;e++){let n=Xn.block.items[e],i=e%t*32,a=Math.floor(e/t)*32;new $e({name:n,block:n,position:[i,8,a]}).init()}}s(TT,\"debugBlocks\");async function CT(t){let e=await wc(t);if(!e)return;let n=rxe(e.stateValues),i=Math.floor(Math.sqrt(n.length));for(let a=0;a<n.length;a++){let r=a%i*32,o=Math.floor(a/i)*32,l=axe(n[a]);new $e({name:t+l,block:t+l,position:[r,8,o]}).init()}}s(CT,\"debugBlockState\");function axe(t){return`[${Object.entries(t).map(([n,i])=>`${n}=${i.toString()}`).join(\",\")}]`}s(axe,\"generateBlockStateString\");function rxe(t){let e=Object.values(t).reduce((i,a)=>i*a.length,1),n=[];for(let i=0;i<e;i++){let a={},r=i;Object.entries(t).forEach(([o,l])=>{let c=r%l.length;a[o]=String(l[c]),r=Math.floor(r/l.length)}),n.push(a)}return n}s(rxe,\"computeAllStatePermutations\");var We=class extends gn{type=We.type;icon=We.icon;needsUniqueName=!0;__item=new ke(\"minecraft:diamond\");__itemDisplay=new ke(\"none\");onSummonFunction=We.properties.onSummonFunction.default;configs;error=new ke(\"\");buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=oxe;constructor(e,n=guid()){super(e,n),We.all.push(this);for(let i in We.properties)We.properties[i].reset(this);this.name=\"item_display\",this.extend(e),this.sanitizeName(),this.__item.subscribe(()=>{this.updateItem()})}get item(){return this.__item===void 0?\"minecraft:diamond\":this.__item.get()}set item(e){this.__item!==void 0&&this.__item.set(e)}get itemDisplay(){return this.__itemDisplay===void 0?\"none\":this.__itemDisplay.get()}set itemDisplay(e){this.__itemDisplay!==void 0&&this.__itemDisplay.set(e)}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}getUndoCopy(){let e={};for(let n in We.properties)We.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in We.properties)We.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),We.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),We.selected.remove(this),this.selected=!1,TickUpdates.selection=!0,this.preview_controller.updateHighlight(this))}async updateItem(){let e=await bf(this.item);if(e){this.error.set(e);return}this.error.set(\"\"),this.preview_controller.updateGeometry(this)}};s(We,\"VanillaItemDisplay\"),lt(We,\"type\",`${Ke.name}:vanilla_item_display`),lt(We,\"icon\",\"icecream\"),lt(We,\"selected\",[]),lt(We,\"all\",[]),We=Do([Yo],We);We.prototype.icon=We.icon;new Property(We,\"string\",\"item\",{default:\"minecraft:diamond\"});new Property(We,\"string\",\"itemDisplay\",{default:\"none\"});new Property(We,\"string\",\"onSummonFunction\",{default:\"\"});new Ga(We,\"configs\",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType(We,We.type);var Gx=new THREE.TextureLoader().load(\"data:image/svg+xml,\"+encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#e3e3e3\"><path d=\"M482-40 294-400q-71 3-122.5-41T120-560q0-51 29.5-92t74.5-58q18-91 89.5-150.5T480-920q95 0 166.5 59.5T736-710q45 17 74.5 58t29.5 92q0 75-53 119t-119 41L482-40ZM280-480q15 0 29.5-5t26.5-17l22-22 26 16q21 14 45.5 21t50.5 7q26 0 50.5-7t45.5-21l26-16 22 22q12 12 26.5 17t29.5 5q33 0 56.5-23.5T760-560q0-30-19-52.5T692-640l-30-4-2-32q-5-69-57-116.5T480-840q-71 0-123 47.5T300-676l-2 32-30 6q-30 6-49 27t-19 51q0 33 23.5 56.5T280-480Zm202 266 108-210q-24 12-52 18t-58 6q-27 0-54.5-6T372-424l110 210Zm-2-446Z\"/></svg>'));Gx.minFilter=THREE.NearestFilter;Gx.magFilter=THREE.NearestFilter;var oxe=new NodePreviewController(We,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Gx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/20);let i=t.mesh;i.add(n),i.sprite=n},updateGeometry(t){t.mesh&&Fx(t.item,t.itemDisplay).then(e=>{if(!e)return;let n=t.mesh;n.name=t.uuid,n.geometry=e.boundingBox,n.material=Canvas.transparentMaterial,n.clear(),n.add(e.mesh),n.add(e.outline),n.outline=e.outline,n.outline.visible=t.selected,t.preview_controller.updateHighlight(t),t.preview_controller.updateTransform(t),n.visible=t.visibility}).catch(e=>{typeof e.message==\"string\"&&t.error.set(e.message)})},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)},updateHighlight(t,e){if(!Fe()||!t?.mesh)return;let n=Modes.edit&&(e===!0||e===t||t.selected)?1:0,i=t.mesh.children.at(0);if(i)for(let a of i.children){if(!(a instanceof THREE.Mesh))continue;let r=a.geometry.attributes.highlight;r.array[0]!=n&&(r.array.set(Array(r.count).fill(n)),r.needsUpdate=!0)}}}),kd=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!==\"root\"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),\"ZYX\");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x+=Math.degToRad(-e[0])*n,i.rotation.y+=Math.degToRad(-e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x=1+(e[0]-1)*n||1e-5,i.scale.y=1+(e[1]-1)*n||1e-5,i.scale.z=1+(e[2]-1)*n||1e-5,this}};s(kd,\"VanillaItemDisplayAnimator\");kd.prototype.type=We.type;We.animator=kd;var ST=nn({id:\"animated-java:action/create-vanilla-item-display\"},{name:A(\"action.create_vanilla_item_display.title\"),icon:\"icecream\",category:\"animated_java\",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new We({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit(\"Create Vanilla Item Display\",{outliner:!0,elements:selected,selection:!0}),t}}),Jx=[];ST.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),Jx.push(K.SELECT_PROJECT.subscribe(e=>{e.vanillaItemDisplays??=[],We.all.empty(),We.all.push(...e.vanillaItemDisplays)}),K.UNSELECT_PROJECT.subscribe(e=>{e.vanillaItemDisplays=[...We.all],We.all.empty()}))});ST.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),Jx.forEach(e=>e()),Jx.empty()});function Ea(t,e){t=Kt(t);let n=[...$e.all,...Group.all,...ve.all,...We.all,...Locator.all];OutlinerElement.types.camera&&n.push(...OutlinerElement.types.camera.all),n=n.filter(l=>l.uuid!==e);let i=new Set(n.map(l=>l.name));if(!i.has(t))return t;let a=1,r=/\\d+$/.exec(t);r&&(a=parseInt(r[0]),t=t.slice(0,-r[0].length));let o=1e4;for(;o-- >0;){let l=`${t}${a}`;if(!i.has(l))return t=l,l;a++}throw new Error(`Could not make name unique for ${t} (${e})!`)}s(Ea,\"sanitizeOutlinerElementName\");var ve=class extends gn{type=ve.type;icon=ve.icon;needsUniqueName=!0;configs;buttons=[Outliner.buttons.export,Outliner.buttons.locked,Outliner.buttons.visibility];preview_controller=sxe;textError=new ke(\"\");needsMeshUpdate=!1;__pendingMeshUpdate;__text=new ke(\"Hello World!\");__lineWidth=ve.properties.lineWidth.default;__backgroundColor=ve.properties.backgroundColor.default;__shadow=ve.properties.shadow.default;__align=ve.properties.align.default;seeThrough=ve.properties.seeThrough.default;onSummonFunction=ve.properties.onSummonFunction.default;constructor(e,n=guid()){super(e,n),ve.all.push(this);for(let i in ve.properties)ve.properties[i].reset(this);this.name=\"text_display\",this.extend(e),this.sanitizeName()}sanitizeName(){return this.name=Ea(this.name,this.uuid),this.name}get text(){return this.__text===void 0?ve.properties.text.default:this.__text.get()}set text(e){this.__text!==void 0&&e!==this.__text.get()&&(this.__text.set(e),this.needsMeshUpdate=!0)}get lineWidth(){return this.__lineWidth===void 0?ve.properties.lineWidth.default:this.__lineWidth}set lineWidth(e){this.__lineWidth!==void 0&&e!==this.__lineWidth&&(this.__lineWidth=e,this.needsMeshUpdate=!0)}get backgroundColor(){return this.__backgroundColor===void 0?ve.properties.backgroundColor.default:this.__backgroundColor}set backgroundColor(e){this.__backgroundColor!==void 0&&e!==this.__backgroundColor&&(this.__backgroundColor=e,this.needsMeshUpdate=!0)}get shadow(){return this.__shadow===void 0?ve.properties.shadow.default:this.__shadow}set shadow(e){this.__shadow!==void 0&&e!==this.__shadow&&(this.__shadow=e,this.needsMeshUpdate=!0)}get align(){return this.__align===void 0?ve.properties.align.default:this.__align}set align(e){this.__align!==void 0&&e!==this.__align&&(this.__align=e,this.needsMeshUpdate=!0)}getTextValuable(){return this.__text}getUndoCopy(){let e=new ve(this);for(let n in ve.properties)ve.properties[n].copy(this,e);return e.uuid=this.uuid,e.type=this.type,delete e.parent,e}getSaveCopy(){let e=super.getSaveCopy?.()??{};for(let n in ve.properties)ve.properties[n].copy(this,e);return e}select(){return Group.first_selected&&Group.first_selected.unselect(),!Pressing.ctrl&&!Pressing.shift&&(Cube.selected.length&&Cube.selected.forEachReverse(e=>e.unselect()),selected.length&&selected.forEachReverse(e=>e!==this&&e.unselect())),ve.selected.safePush(this),this.selectLow(),this.showInOutliner(),updateSelection(),Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator(this).select(),this}unselect(){this.selected&&(Animator.open&&Timeline.selected_animator&&Timeline.selected_animator.element===this&&Timeline.selected&&Timeline.selected.empty(),Project.selected_elements.remove(this),ve.selected.remove(this),this.selected=!1,TickUpdates.selection=!0)}updateTextMesh(){let e;try{let n=new Yn({minecraftVersion:Project.animated_java.target_minecraft_version});n.enabledFeatures&=~(Yn.FEATURES.ALLOW_CLICK_EVENTS|Yn.FEATURES.ALLOW_HOVER_EVENTS),e=n.parse(this.text),this.textError.set(\"\")}catch(n){console.error(n),n instanceof Ko?this.textError.set(n.getOriginErrorMessage()):this.textError.set(n.message)}e??=new jt({text:\"Invalid JSON Text!\",color:\"red\"}),this.renderTextMesh(e).then(({mesh:n,hitbox:i,outline:a})=>{this.applyTextMesh(n,i,a)})}renderTextMesh(e){let n=_c().then(i=>i.generateTextDisplayMesh({jsonText:e,maxLineWidth:this.lineWidth,backgroundColor:tinycolor(this.backgroundColor),shadow:this.shadow,alignment:this.align})).then(i=>this.__pendingMeshUpdate===n?(this.__pendingMeshUpdate=void 0,i):this.__pendingMeshUpdate);return this.__pendingMeshUpdate=n,n}applyTextMesh(e,n,i){e.name=this.uuid+\"_text\",e.isTextDisplayText=!0;let a=this.mesh;if(!a){console.warn(\"TextDisplay mesh not found\");return}a.clear(),delete a.sprite,a.name=this.uuid,a.material=Canvas.transparentMaterial,a.geometry=n,a.add(e),i.name=this.uuid+\"_outline\",i.visible=this.selected,a.outline=i,a.add(i),a.visible=this.visibility,Canvas.updateView({elements:[],element_aspects:{}})}};s(ve,\"TextDisplay\"),lt(ve,\"type\",`${Ke.name}:text_display`),lt(ve,\"icon\",\"text_fields\"),lt(ve,\"selected\",[]),lt(ve,\"all\",[]),lt(ve,\"invalidJsonText\",{text:\"Invalid JSON Text!\",color:\"red\"}),ve=Do([Yo],ve);ve.prototype.icon=ve.icon;new Property(ve,\"string\",\"text\",{default:'\"Hello World!\"'});new Property(ve,\"number\",\"lineWidth\",{default:200});new Property(ve,\"string\",\"backgroundColor\",{default:\"#00000040\"});new Property(ve,\"string\",\"align\",{default:\"center\"});new Property(ve,\"boolean\",\"shadow\",{default:!1});new Property(ve,\"boolean\",\"seeThrough\",{default:!1});new Property(ve,\"string\",\"onSummonFunction\",{default:\"\"});new Ga(ve,\"configs\",{default:()=>({default:{},variants:{}})});OutlinerElement.registerType(ve,ve.type);var Wx=new THREE.TextureLoader().load(\"data:image/svg+xml,\"+encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#e3e3e3\"><path d=\"M280-160v-520H80v-120h520v120H400v520H280Zm360 0v-320H520v-120h360v120H760v320H640Z\"/></svg>'));Wx.minFilter=THREE.NearestFilter;Wx.magFilter=THREE.NearestFilter;var sxe=new NodePreviewController(ve,{setup(t){gn.prototype.preview_controller.setup(t);let e=new THREE.SpriteMaterial({map:Wx,alphaTest:.1,sizeAttenuation:!1}),n=new THREE.Sprite(e);n.scale.setScalar(1/32);let i=t.mesh;i.add(n),i.sprite=n,i.renderOrder=-1,t.preview_controller.dispatchEvent(\"setup\",{element:t})},updateGeometry(t){t.needsMeshUpdate&&(t.updateTextMesh(),t.needsMeshUpdate=!1)},updateTransform(t){gn.prototype.preview_controller.updateTransform(t)}}),jd=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(!this.element.selected&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element.parent&&this.element.parent!==\"root\"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayRotation(e,n=1){let i=this.getElement().mesh;if(i.fix_rotation&&i.rotation.copy(i.fix_rotation),e)if(e.length===4){let a=new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(e),\"ZYX\");i.rotation.x-=a.x*n,i.rotation.y-=a.y*n,i.rotation.z+=a.z*n}else i.rotation.x-=Math.degToRad(e[0])*n,i.rotation.y-=Math.degToRad(e[1])*n,i.rotation.z+=Math.degToRad(e[2])*n;if(this.rotation_global){let a=i.parent?.getWorldQuaternion(Reusable.quat1);if(!a)return this;a.invert(),i.quaternion.premultiply(a)}return this}displayPosition(e,n=1){let i=this.getElement().mesh;return i.fix_position&&i.position.copy(i.fix_position),e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}displayScale(e,n=1){if(!e)return this;let i=this.getElement().mesh;return i.fix_scale&&i.scale.copy(i.fix_scale),i.scale.x*=1+(e[0]-1)*n||1e-5,i.scale.y*=1+(e[1]-1)*n||1e-5,i.scale.z*=1+(e[2]-1)*n||1e-5,this}};s(jd,\"TextDisplayAnimator\");jd.prototype.type=ve.type;ve.animator=jd;var OT=nn({id:\"animated-java:create-text-display\"},{name:A(\"action.create_text_display.title\"),icon:\"text_fields\",category:\"animated_java\",condition(){return Fe()&&Mode.selected.id===Modes.options.edit.id},click(){Undo.initEdit({outliner:!0,elements:[],selection:!0});let t=new ve({}).init(),e=getCurrentGroup();return e instanceof Group&&(t.addTo(e),t.extend({position:e.origin.slice()})),selected.forEachReverse(n=>n.unselect()),Group.first_selected?.unselect(),t.select(),Undo.finishEdit(\"Create Text Display\",{outliner:!0,elements:selected,selection:!0}),t}}),IT=[];OT.onCreated(t=>{Interface.Panels.outliner.menu.addAction(t,3),Toolbars.outliner.add(t,0),MenuBar.menus.edit.addAction(t,8),IT.push(K.SELECT_PROJECT.subscribe(e=>{Fe()&&(e.textDisplays??=[],ve.all.empty(),ve.all.push(...e.textDisplays))}),K.UNSELECT_PROJECT.subscribe(e=>{Fe()&&(e.textDisplays=[...ve.all],ve.all.empty())}))});OT.onDeleted(t=>{Interface.Panels.outliner.menu.removeAction(t),Toolbars.outliner.remove(t),MenuBar.menus.edit.removeAction(t),IT.forEach(e=>e())});var DT=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABgWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kTtIA0EURY+JokjEwhQiFltEK21UxFKiKIKBkETwV7i7MVHIrmE3YmMp2AYs/DRGLWystbWwFQTBD4i1hZWijcj6ZhNIEOPAMIc7cy9v3oNAKWdabuMoWHbBSUxGtdm5ea35hSaCQIAR3XTzseREirrr844Gdd72q6z67/5cbell14QGTXjUzDsF4SXh4Y1CXvGecNhc0dPCZ8J9jhQo/KB0o8yvirM+B1Rm2EklxoTDwlq2ho0aNlccS3hIOJK2bMkPzJY5rXhTsZVbNyt1qh+Glu2ZpNJldzPJFDHiaBiss0qOAv1y2qK4JOQ+Wsff5fvj4jLEtYopjnHWsNB9P2oGv3vrZgYHykmhKDQ9e957DzTvwHfR876OPO/7GIJPcGlX/WslGPkQvVjVIofQvgXnV1XN2IWLbeh8zOuO7kv+/DMZeDuVMc1Bxw20LpT7Vrnn5B5S0qvpa9g/gN6sZC/W+XdLbd/+fVPp3w9iNHKgdXImZAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+gFAwAFKkpaLkIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAEklEQVQ4y2NgGAWjYBSMAggAAAQQAAGFP6pyAAAAAElFTkSuQmCC\";var wt=class{__onApplyFunction;__billboard;__overrideBrightness;__brightnessOverride;__enchanted;__glowing;__overrideGlowColor;__glowColor;__invisible;__shadowRadius;__shadowStrength;static getDefault(){return wt.fromJSON({on_apply_function:\"\",billboard:\"fixed\",override_brightness:!1,brightness_override:0,enchanted:!1,glowing:!1,override_glow_color:!1,glow_color:\"#ffffff\",invisible:!1,shadow_radius:0,shadow_strength:1})}get onApplyFunction(){return this.__onApplyFunction!==void 0?this.__onApplyFunction:\"\"}set onApplyFunction(e){this.__onApplyFunction=e}get billboard(){return this.__billboard!==void 0?this.__billboard:wt.getDefault().billboard}set billboard(e){this.__billboard=e}get overrideBrightness(){return this.__overrideBrightness!==void 0?this.__overrideBrightness:wt.getDefault().overrideBrightness}set overrideBrightness(e){this.__overrideBrightness=e}get brightnessOverride(){return this.__brightnessOverride!==void 0?this.__brightnessOverride:wt.getDefault().brightnessOverride}set brightnessOverride(e){this.__brightnessOverride=e}get enchanted(){return this.__enchanted!==void 0?this.__enchanted:wt.getDefault().enchanted}set enchanted(e){this.__enchanted=e}get glowing(){return this.__glowing!==void 0?this.__glowing:wt.getDefault().glowing}set glowing(e){this.__glowing=e}get overrideGlowColor(){return this.__overrideGlowColor!==void 0?this.__overrideGlowColor:wt.getDefault().overrideGlowColor}set overrideGlowColor(e){this.__overrideGlowColor=e}get glowColor(){return this.__glowColor!==void 0?this.__glowColor:wt.getDefault().glowColor}set glowColor(e){this.__glowColor=e}get invisible(){return this.__invisible!==void 0?this.__invisible:wt.getDefault().invisible}set invisible(e){this.__invisible=e}get shadowRadius(){return this.__shadowRadius!==void 0?this.__shadowRadius:wt.getDefault().shadowRadius}set shadowRadius(e){this.__shadowRadius=e}get shadowStrength(){return this.__shadowStrength!==void 0?this.__shadowStrength:wt.getDefault().shadowStrength}set shadowStrength(e){this.__shadowStrength=e}checkIfEqual(e){return this.__onApplyFunction===e.__onApplyFunction&&this.__billboard===e.__billboard&&this.__overrideBrightness===e.__overrideBrightness&&this.__brightnessOverride===e.__brightnessOverride&&this.__enchanted===e.__enchanted&&this.__glowing===e.__glowing&&this.__overrideGlowColor===e.__overrideGlowColor&&this.__glowColor===e.__glowColor&&this.__invisible===e.__invisible&&this.__shadowRadius===e.__shadowRadius&&this.__shadowStrength===e.__shadowStrength}isDefault(){return this.checkIfEqual(wt.getDefault())}toJSON(){return Ks({on_apply_function:this.__onApplyFunction,billboard:this.__billboard,override_brightness:this.__overrideBrightness,brightness_override:this.__brightnessOverride,enchanted:this.__enchanted,glowing:this.__glowing,override_glow_color:this.__overrideGlowColor,glow_color:this.__glowColor,invisible:this.__invisible,shadow_radius:this.__shadowRadius,shadow_strength:this.__shadowStrength})}inheritFrom(e){e.__onApplyFunction!==void 0&&(this.onApplyFunction=e.onApplyFunction),e.__billboard!==void 0&&(this.billboard=e.billboard),e.__overrideBrightness!==void 0&&(this.overrideBrightness=e.overrideBrightness),e.__brightnessOverride!==void 0&&(this.brightnessOverride=e.brightnessOverride),e.__enchanted!==void 0&&(this.enchanted=e.enchanted),e.__glowing!==void 0&&(this.glowing=e.glowing),e.__overrideGlowColor!==void 0&&(this.overrideGlowColor=e.overrideGlowColor),e.__glowColor!==void 0&&(this.glowColor=e.glowColor),e.__invisible!==void 0&&(this.invisible=e.invisible),e.__shadowRadius!==void 0&&(this.shadowRadius=e.shadowRadius),e.__shadowStrength!==void 0&&(this.shadowStrength=e.shadowStrength)}static fromJSON(e){let n=new wt;return e.on_apply_function!==void 0&&(n.__onApplyFunction=e.on_apply_function),e.billboard!==void 0&&(n.__billboard=e.billboard),e.override_brightness!==void 0&&(n.__overrideBrightness=e.override_brightness),e.brightness_override!==void 0&&(n.__brightnessOverride=e.brightness_override),e.enchanted!==void 0&&(n.__enchanted=e.enchanted),e.glowing!==void 0&&(n.__glowing=e.glowing),e.override_glow_color!==void 0&&(n.__overrideGlowColor=e.override_glow_color),e.glow_color!==void 0&&(n.__glowColor=e.glow_color),e.invisible!==void 0&&(n.__invisible=e.invisible),e.shadow_radius!==void 0&&(n.__shadowRadius=e.shadow_radius),e.shadow_strength!==void 0&&(n.__shadowStrength=e.shadow_strength),n}toNBT(e=new ot){if(this.__billboard&&e.set(\"billboard\",new xt(this.billboard)),this.overrideBrightness&&e.set(\"brightness\",new ot().set(\"block\",new fn(this.brightnessOverride)).set(\"sky\",new fn(this.brightnessOverride))),this.enchanted){let n=e.get(\"item\")??new ot;if(compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version))if(compareVersions(Project.animated_java.target_minecraft_version,\"1.20.4\")){let i=n.get(\"components\")??new ot;n.set(\"components\",i);let a=i.get(\"minecraft:enchantments\")??new ot;i.set(\"minecraft:enchantments\",a),a.set(\"levels\",new ot().set(\"minecraft:infinity\",new an(1)))}else{let i=n.get(\"tag\")??new ot;n.set(\"tag\",i);let a=i.get(\"Enchantments\")??new Tn;i.set(\"Enchantments\",a),a.add(new ot().set(\"id\",new xt(\"minecraft:infinity\")).set(\"lvl\",new an(1)))}else{let i=n.get(\"components\")??new ot;n.set(\"components\",i);let a=i.get(\"minecraft:enchantments\")??new ot;i.set(\"minecraft:enchantments\",a),a.set(\"minecraft:infinity\",new an(1))}e.set(\"item\",n)}return this.glowing&&e.set(\"Glowing\",new di(Number(this.glowing))),this.overrideGlowColor&&e.set(\"glow_color_override\",new an(Number(this.glowColor.replace(\"#\",\"0x\")))),this.__shadowRadius&&e.set(\"shadow_radius\",new fn(this.shadowRadius)),this.__shadowStrength&&e.set(\"shadow_strength\",new fn(this.shadowStrength)),e}};s(wt,\"DisplayEntityConfig\");var Nr=class{__useEntity;__entityType;__syncPassengerRotation;__onSummonFunction;__onRemoveFunction;__onTickFunction;getDefault(){return Nr.fromJSON({use_entity:!1,entity_type:\"minecraft:pig\",sync_passenger_rotation:!1,on_summon_function:\"\",on_remove_function:\"\",on_tick_function:\"\"})}get useEntity(){return this.__useEntity!==void 0?this.__useEntity:this.getDefault().useEntity}set useEntity(e){this.__useEntity=e}get entityType(){return this.__entityType!==void 0?this.__entityType:this.getDefault().entityType}set entityType(e){this.__entityType=e}get syncPassengerRotation(){return this.__syncPassengerRotation!==void 0?this.__syncPassengerRotation:this.getDefault().syncPassengerRotation}set syncPassengerRotation(e){this.__syncPassengerRotation=e}get onSummonFunction(){return this.__onSummonFunction!==void 0?this.__onSummonFunction:this.getDefault().onSummonFunction}set onSummonFunction(e){this.__onSummonFunction=e}get onRemoveFunction(){return this.__onRemoveFunction!==void 0?this.__onRemoveFunction:this.getDefault().onRemoveFunction}set onRemoveFunction(e){this.__onRemoveFunction=e}get onTickFunction(){return this.__onTickFunction!==void 0?this.__onTickFunction:this.getDefault().onTickFunction}set onTickFunction(e){this.__onTickFunction=e}toJSON(){return Ks({use_entity:this.__useEntity,entity_type:this.__entityType,sync_passenger_rotation:this.__syncPassengerRotation,on_summon_function:this.__onSummonFunction,on_remove_function:this.__onRemoveFunction,on_tick_function:this.__onTickFunction})}static fromJSON(e){let n=new Nr;return e.use_entity!==void 0&&(n.__useEntity=e.use_entity),e.entity_type!==void 0&&(n.__entityType=e.entity_type),e.sync_passenger_rotation!==void 0&&(n.__syncPassengerRotation=e.sync_passenger_rotation),e.on_summon_function!==void 0&&(n.__onSummonFunction=e.on_summon_function),e.on_remove_function!==void 0&&(n.__onRemoveFunction=e.on_remove_function),e.on_tick_function!==void 0&&(n.__onTickFunction=e.on_tick_function),n}isDefault(){return this.checkIfEqual(new Nr)}checkIfEqual(e){return this.useEntity===e.useEntity&&this.entityType===e.entityType&&this.syncPassengerRotation===e.syncPassengerRotation&&this.onSummonFunction===e.onSummonFunction&&this.onRemoveFunction===e.onRemoveFunction&&this.onTickFunction===e.onTickFunction}};s(Nr,\"LocatorConfig\");function yf(t){t?.meta?.model_format===\"animatedJava/ajmodel\"&&(t.meta.model_format=\"animated_java/ajmodel\",t.meta.format_version=\"0.0\");try{let e=t.meta.format_version.length===3;if(e=e||compareVersions(Ke.version,t.meta.format_version),!e)return t;if(console.groupCollapsed(\"Upgrading project from\",t.meta.format_version,\"to\",Ke.version),console.log(\"Original model:\",JSON.parse(JSON.stringify(t))),t.meta.format_version.length===3){console.groupCollapsed(\"Discovered outdated ajmodel format! Upgrading to blueprint format...\");try{compareVersions(\"1.0\",t.meta.format_version)&&(t=cxe(t)),compareVersions(\"1.1\",t.meta.format_version)&&(t=uxe(t)),compareVersions(\"1.2\",t.meta.format_version)&&(t=dxe(t)),compareVersions(\"1.3\",t.meta.format_version)&&(t=pxe(t)),compareVersions(\"1.4\",t.meta.format_version)&&(t=mxe(t)),t.meta.format_version=\"0.3.9\",console.log(\"Upgrade to blueprint format complete\",JSON.parse(JSON.stringify(t)))}catch(i){throw console.error(\"Failed to upgrade from ajmodel format to blueprint format\",i),i}finally{console.groupEnd()}}switch(!0){case compareVersions(\"0.3.10\",t.meta.format_version):t=fxe(t);case compareVersions(\"0.5.0\",t.meta.format_version):t=hxe(t);case compareVersions(\"0.5.5\",t.meta.format_version):t=gxe(t);case compareVersions(\"0.5.6\",t.meta.format_version):t=_xe(t);case compareVersions(\"0.5.7\",t.meta.format_version):t=xxe(t);case compareVersions(\"1.4.0\",t.meta.format_version):t=vxe(t);case compareVersions(\"1.6.3\",t.meta.format_version):t=bxe(t);case compareVersions(\"1.6.5\",t.meta.format_version):t=yxe(t);case compareVersions(\"1.8.0\",t.meta.format_version):t=wxe(t)}let n=Qs();for(let i in t.blueprint_settings)i in n||(console.warn(\"Removing unknown blueprint setting\",i,t.blueprint_settings[i]),delete t.blueprint_settings[i]);return t.meta.format_version=\"1.8.0\",console.log(\"Upgrade complete\",JSON.parse(JSON.stringify(t))),t}catch(e){throw Fo(e),e}finally{console.groupEnd()}}s(yf,\"process\");function cxe(t){console.log(\"Processing model format 1.0\",t);let e=JSON.parse(JSON.stringify(t));if(e.meta.settings){console.log(\"Upgrading settings...\");let n={settings:{project_name:e.meta.settings.animatedJava.projectName,verbose:e.meta.settings.animatedJava.verbose,rig_item:e.meta.settings.animatedJava.rigItem,rig_item_model:e.meta.settings.animatedJava.predicateFilePath,rig_export_folder:e.meta.settings.animatedJava.rigModelsExportFolder},exporter_settings:{},variants:[]};e.animated_java=n}if(e.meta.variants){console.log(\"Upgrading variants...\");let n=[];for(let[i,a]of Object.entries(e.meta.variants))n.push({name:i,uuid:guid(),textureMap:a,default:i===\"default\",boneConfig:{},affectedBones:[],affectedBonesIsAWhitelist:!1});e.animated_java.variants=n}if(e.animations?.find(n=>Object.keys(n.animators).find(i=>i===\"effects\"))){console.log(\"Upgrading effects...\");for(let n of e.animations){let i=n.animators.effects;if(i){for(let a of i.keyframes)if(a.channel===\"timeline\")for(let r of a.data_points)r.script&&(r.commands=r.script,delete r.script,a.channel=\"commands\")}}console.log(\"Upgrading effects complete\",e.animations)}return e.meta.format_version=Ke.version,delete e.meta.variants,delete e.meta.settings,delete e.meta.uuid,e}s(cxe,\"updateModelToOld1_0\");function uxe(t){console.log(\"Processing model format 1.1\",t);let e=JSON.parse(JSON.stringify(t));e.animated_java.settings.resource_pack_mcmeta=e.animated_java.settings.resource_pack_folder,delete e.animated_java.settings.resource_pack_folder;let n=e.animated_java.exporter_settings[\"animated_java:animation_exporter\"];return n&&(n.datapack_mcmeta=n.datapack_folder,delete n.datapack_folder),e}s(uxe,\"updateModelToOld1_1\");function dxe(t){console.log(\"Processing model format 1.2\",t);let e=JSON.parse(JSON.stringify(t));for(let n of e.animated_java.variants)for(let[i,a]of Object.entries(n.textureMap)){let r=i.split(\"::\")[0],o=a.split(\"::\")[0];n.textureMap[r]=o,delete n.textureMap[i]}return e}s(dxe,\"updateModelToOld1_2\");function pxe(t){console.log(\"Processing model format 1.3\",t);let e=JSON.parse(JSON.stringify(t));return e.animated_java.settings.exporter===\"animated_java:animation_exporter\"&&(e.animated_java.settings.exporter=\"animated_java:datapack_exporter\"),e.animated_java.exporter_settings[\"animated_java:animation_exporter\"]&&(e.animated_java.exporter_settings[\"animated_java:datapack_exporter\"]=e.animated_java.exporter_settings[\"animated_java:animation_exporter\"],delete e.animated_java.exporter_settings[\"animated_java:animation_exporter\"]),e}s(pxe,\"updateModelToOld1_3\");function mxe(t){console.log(\"Processing model format 1.4\",t);let e=JSON.parse(JSON.stringify(t)),n=e.animated_java.exporter_settings[\"animated_java:datapack_exporter\"];return n&&n.outdated_rig_warning!==void 0&&(e.animated_java.exporter_settings[\"animated_java:datapack_exporter\"].enable_outdated_rig_warning=e.animated_java.exporter_settings[\"animated_java:datapack_exporter\"].outdated_rig_warning,delete e.animated_java.exporter_settings[\"animated_java:datapack_exporter\"].outdated_rig_warning),e}s(mxe,\"updateModelToOld1_4\");function fxe(t){console.log(\"Processing model for AJ 0.3.10\",t);let e=JSON.parse(JSON.stringify(t));return e.meta??={},e.meta.model_format=\"animated_java/blueprint\",e}s(fxe,\"updateModelTo0_3_10\");function hxe(t){console.log(\"Processing model format 1.0.0-pre1\",t);let e=Qs(),n=t.animated_java.exporter_settings[\"animated_java:datapack_exporter\"],i=t.animated_java.variants.find(c=>!!c.default),a={meta:{format:\"animated_java_blueprint\",format_version:\"0.5.0\",uuid:t.meta.uuid??guid(),last_used_export_namespace:t.animated_java.settings.project_namespace},project_settings:{show_bounding_box:e.show_render_box,auto_bounding_box:e.auto_render_box,bounding_box:e.render_box,export_namespace:t.animated_java.settings.project_namespace,enable_plugin_mode:e.enable_plugin_mode,resource_pack_export_mode:e.resource_pack_export_mode,data_pack_export_mode:e.data_pack_export_mode,display_item:t.animated_java.settings.rig_item,custom_model_data_offset:0,enable_advanced_resource_pack_settings:t.animated_java.settings.enable_advanced_resource_pack_settings,resource_pack:t.animated_java.settings.resource_pack_mcmeta?t.animated_java.settings.resource_pack_mcmeta.replace(/pack\\.mcmeta$/,\"\"):\"\",display_item_path:t.animated_java.settings.rig_item_model,model_folder:t.animated_java.settings.rig_export_folder,texture_folder:t.animated_java.settings.texture_export_folder,enable_advanced_data_pack_settings:e.enable_advanced_data_pack_settings,data_pack:n?.datapack_mcmeta?n.datapack_mcmeta.replace(/pack\\.mcmeta$/,\"\"):\"\",summon_commands:e.on_summon_function,interpolation_duration:e.interpolation_duration,teleportation_duration:e.teleportation_duration,use_storage_for_animation:e.use_storage_for_animation,baked_animations:e.baked_animations,json_file:e.json_file},variants:{default:{name:\"default\",display_name:i.name??\"Default\",uuid:i.uuid??guid(),texture_map:i.textureMap??{},excluded_bones:[]},list:[]},resolution:t.resolution,outliner:[],elements:t.elements,animations:t.animations,textures:t.textures,animation_variable_placeholders:t.animation_variable_placeholders},r=[],o=s(c=>{typeof c!=\"string\"&&(r.push(c.uuid),c.configs={default:new wt().toJSON(),variants:{}},c.children.forEach(d=>{typeof d!=\"string\"&&o(d)}),c.nbt&&c.nbt!==\"{}\"&&(c.configs.default.use_nbt=!0,c.configs.default.nbt=c.nbt,delete c.nbt))},\"recurseOutliner\");t.outliner.forEach(o),a.outliner=t.outliner;for(let c of a.elements??[])if(c.type===\"locator\"&&(c.config={use_entity:!0},c.entity_type&&(c.config.entity_type=c.entity_type),c.nbt)){let d=[],u=st.fromString(c.nbt);u.delete(\"Passengers\");let p=u.get(\"Tags\")?.map(f=>f.getAsString());u.delete(\"Tags\"),d.push(\"data merge entity @s \"+u.toString()),p&&d.push(...p.map(f=>`tag @s add ${f}`));let m=s(f=>{let g=st.fromString(f);if(!(g instanceof ot))throw new Error(\"NBT is not a compound\");let x=g.get(\"Passengers\");if(x){console.log(\"Found passengers\");let _=x.map(h=>{let v=h.get(\"id\").getAsString();h.delete(\"id\");let b=h.get(\"Tags\").map(w=>w.getAsString());h.delete(\"Tags\");let y=h.toString();return`execute summon ${v} run {\n\t${[`data merge entity @s ${y}`,...b.map(w=>`tag @s add ${w}`),\"tag @s add to_mount\",...m(y)].join(`\n\t`)}\n}`});return _.push(\"tag @s add vehicle\",\"execute as @e[tag=to_mount,distance=..0.01] run {\",\"\tride @s mount @e[tag=vehicle,limit=1]\",\"\ttag @s remove to_mount\",\"}\",\"tag @s remove vehicle\",\"execute on passengers run tag @s remove to_mount\"),_}return[]},\"recursePassengers\");try{d.push(...m(c.nbt))}catch(f){console.error(\"Failed to parse NBT\",c.nbt),console.error(f)}d.length===0&&d.push(`data merge entity @s ${c.nbt}`),c.config.summon_commands=d.join(`\n`)}let l=t.animated_java?.variants?.filter(c=>!c.default)??[];for(let c of l){let d=c.affectedBones.map(p=>p.value),u;c.affectedBonesIsAWhitelist?u=r.filter(p=>!d.includes(p)):u=d,a.variants.list.push({name:c.name,display_name:c.name,uuid:c.uuid,texture_map:c.textureMap,excluded_nodes:u})}if(n?.root_entity_nbt&&n.root_entity_nbt!==\"{}\"){let c=[],d=st.fromString(n.root_entity_nbt),u=d.get(\"Tags\")?.map(p=>p.getAsString());d.delete(\"Tags\"),[...d.keys()].length!==0&&c.push(\"data merge entity @s \"+d.toString()),u&&c.push(...u.map(p=>`tag @s add ${p}`)),a.project_settings.summon_commands=c.join(`\n`)}return a}s(hxe,\"updateModelTo1_0pre1\");function gxe(t){console.log(\"Processing model format 1.0.0-pre6\",t);let e=JSON.parse(JSON.stringify(t)),n=e.variants.default;n?.excluded_bones&&(n.excluded_nodes=n.excluded_bones,delete n.excluded_bones);for(let i of e.variants?.list??[])i?.excluded_bones&&(i.excluded_nodes=i.excluded_bones,delete i.excluded_bones);for(let i of e.animations??[])i?.excluded_bones&&(i.excluded_nodes=i.excluded_bones,delete i.excluded_bones);return e}s(gxe,\"updateModelTo1_0pre6\");function _xe(t){console.log(\"Processing model format 1.0.0-pre7\",t);let e=JSON.parse(JSON.stringify(t));return e.project_settings.enable_resource_pack!==void 0&&(e.project_settings.resource_pack_export_mode=e.project_settings.enable_resource_pack?\"raw\":\"none\",delete e.project_settings.enable_resource_pack),e.project_settings.enable_data_pack!==void 0&&(e.project_settings.data_pack_export_mode=e.project_settings.enable_data_pack?\"raw\":\"none\",delete e.project_settings.enable_data_pack),e}s(_xe,\"updateModelTo1_0pre7\");function xxe(t){console.log(\"Processing model format 1.0.0-pre8\",t);let e=JSON.parse(JSON.stringify(t));return e.project_settings&&(e.blueprint_settings=e.project_settings,delete e.project_settings),e}s(xxe,\"updateModelTo1_0pre8\");function vxe(t){console.log(\"Processing model format 1.4.0\",t);let e=JSON.parse(JSON.stringify(t));return e.blueprint_settings.enable_advanced_resource_pack_settings&&(e.blueprint_settings.enable_advanced_resource_pack_folders=!0),e.blueprint_settings.custom_model_data_offset!==void 0&&e.blueprint_settings.custom_model_data_offset!==0&&(e.blueprint_settings.enable_advanced_resource_pack_settings=!0),e}s(vxe,\"updateModelTo1_4_0\");function bxe(t){console.log(\"Processing model format 1.6.3\",t);let e=JSON.parse(JSON.stringify(t));for(let n of e.variants.list)if(Object.values(n.texture_map).includes(\"797174ae-5c58-4a83-a630-eefd51007c80\")){let i=new Texture({name:\"transparent\"},\"797174ae-5c58-4a83-a630-eefd51007c80\").fromDataURL(DT);e.textures.push(i.getSaveCopy());break}return e}s(bxe,\"updateModelTo1_6_3\");function yxe(t){console.log(\"Processing model format 1.6.5\",t);let e=JSON.parse(JSON.stringify(t));return typeof e.blueprint_settings?.target_minecraft_version==\"string\"&&(e.blueprint_settings.target_minecraft_versions=[e.blueprint_settings.target_minecraft_version],delete e.blueprint_settings.target_minecraft_version),e}s(yxe,\"updateModelTo1_6_5\");function wxe(t){console.log(\"Processing model format 1.8.0\",JSON.parse(JSON.stringify(t)));let e=JSON.parse(JSON.stringify(t));if(e.blueprint_settings??={},t.blueprint_settings?.resource_pack_export_mode===\"raw\"&&(e.blueprint_settings.resource_pack_export_mode=\"folder\"),t.blueprint_settings?.data_pack_export_mode===\"raw\"&&(e.blueprint_settings.data_pack_export_mode=\"folder\"),t.blueprint_settings?.show_bounding_box!=null&&(e.blueprint_settings.show_render_box=t.blueprint_settings.show_bounding_box,delete e.blueprint_settings.show_bounding_box),t.blueprint_settings?.auto_bounding_box!=null&&(e.blueprint_settings.auto_render_box=t.blueprint_settings.auto_bounding_box,delete e.blueprint_settings.auto_bounding_box),t.blueprint_settings?.bounding_box!=null&&(e.blueprint_settings.render_box=t.blueprint_settings.bounding_box,delete e.blueprint_settings.bounding_box),t.blueprint_settings?.summon_commands!=null&&(e.blueprint_settings.on_summon_function=t.blueprint_settings.summon_commands,delete e.blueprint_settings.summon_commands),t.blueprint_settings?.remove_commands!=null&&(e.blueprint_settings.on_remove_function=t.blueprint_settings.remove_commands,delete e.blueprint_settings.remove_commands),t.blueprint_settings?.ticking_commands!=null&&(e.blueprint_settings.on_post_tick_function=t.blueprint_settings.ticking_commands,delete e.blueprint_settings.ticking_commands),Array.isArray(t.blueprint_settings?.target_minecraft_versions)&&(e.blueprint_settings.target_minecraft_version=t.blueprint_settings.target_minecraft_versions.at(0)??Qs().target_minecraft_version,delete e.blueprint_settings.target_minecraft_versions),Array.isArray(e.elements)){let n=e.elements.filter(r=>r.type===ve.type);for(let r of n)r.backgroundAlpha!==void 0&&(r.backgroundColor??=ve.properties.backgroundColor.default,r.backgroundColor=tinycolor(r.backgroundColor).setAlpha(r.backgroundAlpha).toHex8String(),delete r.backgroundAlpha);let i=e.elements.filter(r=>r.type===AnimatedJava.TextDisplay.type||r.type===AnimatedJava.VanillaItemDisplay.type||r.type===AnimatedJava.VanillaBlockDisplay.type);for(let r of i)r.config&&(r.config.custom_name!==void 0&&(r.config.on_apply_function??=\"\",r.config.on_apply_function+=`\n# Auto-upgraded custom name setting (May need fixing):\ndata modify entity @s CustomName set value '${r.config.custom_name}'\n`,delete r.config.custom_name),r.config.custom_name_visible&&(r.config.on_apply_function??=\"\",r.config.on_apply_function+=`\n# Auto-upgraded custom name visibility setting:\ndata modify entity @s CustomNameVisible set value ${r.config.custom_name_visible}\n`,delete r.config.custom_name_visible),r.configs={default:r.config,variants:{}},delete r.config);let a=e.elements.filter(r=>r.type===Locator.prototype.type);for(let r of a)r.config?.summon_commands&&(r.config.on_summon_function=r.config.summon_commands,delete r.config.summon_commands),r.config?.ticking_commands&&(r.config.on_tick_function=r.config.ticking_commands,delete r.config.ticking_commands)}if(Array.isArray(e.animations)){for(let n of e.animations)for(let i of Object.values(n.animators??{}))if(Array.isArray(i.keyframes)){for(let a of i.keyframes)if(a.channel===\"commands\"&&(a.channel=\"function\",Array.isArray(a.data_points)))for(let r of a.data_points)r.commands&&(r.function=r.commands,delete r.commands)}}return e}s(wxe,\"updateModelTo1_8_0\");function wf(t){return t.replace(/\\\\/g,\"/\")}s(wf,\"normalizePath\");function Ec(t){return t.endsWith(\".json\")&&(t.includes(\"tags\\\\function\")||t.includes(\"tags/function\")||t.includes(\"tags\\\\functions\")||t.includes(\"tags/functions\"))}s(Ec,\"isFunctionTagPath\");function Exe(t){return t.replace(/%([^%]+)%/g,function(e,n){if(!process.env[n])throw new Error(\"Environment variable \"+n+\" does not exist.\");return process.env[n]})}s(Exe,\"resolveEnvVariables\");function kxe(t){return t.startsWith(\"./\")||t.startsWith(\"../\")||t.startsWith(\".\\\\\")||t.startsWith(\"..\\\\\")}s(kxe,\"isRelativePath\");function jxe(t){if(!Project?.save_path)return;let e=PathModule.dirname(Project.save_path);return PathModule.resolve(e,t)}s(jxe,\"resolveRelativePath\");function $o(t){if(kxe(t)){let e=jxe(t);if(!e)throw new Error(`Failed to resolve relative path '${t}'`);t=e}return wf(Exe(t))}s($o,\"resolvePath\");function Ef(t){try{return fs.readFileSync(t)}catch{return}}s(Ef,\"safeReadSync\");var NT=\"data:image/webp;base64,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\";var RT=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+malUqDnYQcchQnSyIiugmVSyChdJWaNXB5NI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC4A+Iq4uToouU+F1SaBHjHcc9vPe9L3ffAUK9zFSzYxxQNctIxqJiJrsqBl7RRbMHs5iRmKnHU4tpeI6ve/j4fhfhWd51f44+JWcywCcSzzHdsIg3iKc3LZ3zPnGIFSWF+Jx4zKALEj9yXXb5jXPBYYFnhox0cp44RCwW2lhuY1Y0VOIp4rCiapQvZFxWOG9xVstV1rwnf2Ewp62kuE5rGDEsIY4ERMioooQyLERo10gxkaTzqId/yPEnyCWTqwRGjgVUoEJy/OB/8Lu3Zn5ywk0KRoHOF9v+GAECu0CjZtvfx7bdOAH8z8CV1vJX6sDMJ+m1lhY+Avq3gYvrlibvAZc7wOCTLhmSI/lpCfk88H5G35QFBm6B3jW3b81znD4AaerV8g1wcAiMFih73ePd3e19+7em2b8f4B1y0yv9YvYAAAAGYktHRADZAKIAhTqIWPYAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfnBgYJOi0CGZJlAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAD9JREFUCNd1jcEJADAIA1NXyP5j+LK7pR8tIhgQNBciAECkRGruJlJwRwGkROp0Y8ruAr4f+acmZltsoAf6/QADBCX4xA+nZQAAAABJRU5ErkJggg==\";function MT(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x;return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"div\"),a=L(\"img\"),o=J(),l=L(\"span\"),l.textContent=\"Animated Java?\",c=J(),d=L(\"i\"),d.textContent=\"close\",u=J(),p=L(\"a\"),m=L(\"img\"),E(a,\"class\",\"heart svelte-1loc3ll\"),Ht(a.src,r=RT)||E(a,\"src\",r),E(a,\"alt\",\"\\u2764\\uFE0F\"),E(l,\"class\",\"svelte-1loc3ll\"),E(d,\"class\",\"material-icons icon svelte-1loc3ll\"),E(i,\"class\",\"title svelte-1loc3ll\"),Ht(m.src,f=NT)||E(m,\"src\",f),E(m,\"alt\",\"\"),E(m,\"class\",\"svelte-1loc3ll\"),E(p,\"href\",\"https://ko-fi.com/snavesutit\"),E(p,\"class\",\"ko-fi-button svelte-1loc3ll\"),E(n,\"class\",\"ko-fi-popup svelte-1loc3ll\"),E(e,\"class\",\"ko-fi-popup-container svelte-1loc3ll\")},m(_,h){U(_,e,h),I(e,n),I(n,i),I(i,a),I(i,o),I(i,l),I(i,c),I(i,d),I(n,u),I(n,p),I(p,m),g||(x=[Ue(d,\"click\",t[1]),Ue(d,\"mouseenter\",t[2]),Ue(d,\"mouseleave\",t[3])],g=!0)},p:ie,d(_){_&&z(e),g=!1,Rt(x)}}}s(MT,\"create_if_block\");function Cxe(t){let e,n=t[0]&&MT(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,[a]){i[0]?n?n.p(i,a):(n=MT(i),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},i:ie,o:ie,d(i){n&&n.d(i),i&&z(e)}}}s(Cxe,\"create_fragment\");localStorage.setItem(\"animated_java_settings_support_me_popup\",\"true\");function Sxe(t,e,n){let i=localStorage.getItem(\"animated_java_settings_support_me_popup\")===\"true\";return[i,s(()=>{localStorage.setItem(\"animated_java_settings_support_me_popup\",\"false\"),n(0,i=!1)},\"clickSupportMeXButton\"),s(l=>{l.target instanceof HTMLElement&&(l.target.textContent=\"sentiment_sad\")},\"hoverCloseButton\"),s(l=>{l.target instanceof HTMLElement&&(l.target.textContent=\"close\")},\"leaveCloseButton\")]}s(Sxe,\"instance\");var kf=class extends Pe{constructor(e){super(),Ve(this,e,Sxe,Cxe,De,{})}};s(kf,\"KofiPopup\");var BT=kf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`i.svelte-1loc3ll.svelte-1loc3ll{cursor:pointer;height:fit-content;transition:transform 0.2s ease 0s,\\r\n\t\t\tcolor 0.2s ease 0s;text-shadow:1.5px 1.5px 0px rgba(0, 0, 0, 0.25);align-self:flex-start}i.svelte-1loc3ll.svelte-1loc3ll:hover{transform:scale(1.25)}.ko-fi-popup-container.svelte-1loc3ll.svelte-1loc3ll{position:absolute;top:30px;left:100%;font-family:'MinecraftFull';font-size:24px;color:white;overflow:hidden}.ko-fi-popup.svelte-1loc3ll.svelte-1loc3ll{position:relative;padding:10px 12px;background-color:#00aced;border-radius:0 8px 8px 0;animation:svelte-1loc3ll-slideIn 1.5s;line-height:1}.heart.svelte-1loc3ll.svelte-1loc3ll{width:28px;height:28px;animation:svelte-1loc3ll-heartbeat 2s ease infinite}@keyframes svelte-1loc3ll-heartbeat{0%{transform:scale(1)}10%{transform:scale(1.2)}20%{transform:scale(1)}}.ko-fi-popup.svelte-1loc3ll span.svelte-1loc3ll{text-shadow:0.2rem 0.2rem 0px rgba(0, 0, 0, 0.25)}.ko-fi-button.svelte-1loc3ll img.svelte-1loc3ll{width:100%;image-rendering:auto;transition:transform 0.2s ease}.ko-fi-button.svelte-1loc3ll img.svelte-1loc3ll:hover{transform:scale(1.05)}.ko-fi-popup.svelte-1loc3ll .title.svelte-1loc3ll{display:flex;align-items:center;gap:1rem;white-space:nowrap;margin-bottom:8px}@keyframes svelte-1loc3ll-slideIn{0%{right:100%}50%{right:100%}100%{right:0}}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var PT=Canvas.outlineMaterial.clone();PT.color.set(\"#ff0000\");function Yx(){for(let t of Cube.all)Cube.preview_controller.updateTransform(t)}s(Yx,\"updateAllCubeOutlines\");function Kx(t,e){t.isRotationValid!==e&&(t.mesh.outline.material=e?Canvas.outlineMaterial:PT,t.isRotationValid=e)}s(Kx,\"updateCubeValidity\");var jf=null;function Oxe(){if(!jf){jf=Blockbench.showToastNotification({text:A(Rr(\"1.21.6\")?\"toast.invalid_rotations_post_1_21_6\":\"toast.invalid_rotations\"),color:\"var(--color-error)\",click:()=>!1});let t=setInterval(()=>{Cube.all.some(e=>Ad(e)===\"invalid\")&&document.querySelector(\"li.toast_notification\")||(clearInterval(t),jf?.delete(),jf=null,requestAnimationFrame(Yx))},1e3)}}s(Oxe,\"showToastNotification\");St({id:\"animated-java:cube-outline-mod\",apply:()=>{let t=Cube.preview_controller.updateTransform;Cube.preview_controller.updateTransform=function(n){if(Fe())switch(Ad(n)){case\"valid\":{Kx(n,!0);break}case\"1.21.6+\":if(Rr(\"1.21.6\")){Kx(n,!0);break}case\"invalid\":{Kx(n,!1),Oxe();break}}t.call(this,n)};let e=Cube.prototype.init;return Cube.prototype.init=function(){let n=e.call(this);n.isRotationValid=!0;let[,i]=Py(n.mesh.outline,\"visible\");return i.subscribe(({storage:a})=>{Fe()&&(a.value=!n.isRotationValid||a.value)}),n},{originalUpdateTransform:t,originalInit:e}},revert:({originalUpdateTransform:t,originalInit:e})=>{Cube.preview_controller.updateTransform=t,Cube.prototype.init=e}});var Ixe={};vn(Ixe,{default:()=>Xx});var Xx=kI(\"AAEAAAANAIAAAwBQRkZUTTylB+MAAaIMAAAAHEdERUYAJQAAAAGh9AAAABhPUy8y/fxN0gAAAVgAAABgY21hcHhH6IYAABRAAAAKrmdhc3D//wADAAGh7AAAAAhnbHlmcJz5JAAAKDgAAU3kaGVhZL/tgK4AAADcAAAANmhoZWEHggijAAABFAAAACRobXR4GdUXAAAAAbgAABKIbG9jYfA4nFgAAB7wAAAJRm1heHAEwwCCAAABOAAAACBuYW1lrGdvGwABdhwAAAJMcG9zdEMAzNIAAXhoAAAphAABAAAAAQAA3fpnrl8PPPUACwQAAAAAAHw3nBsAAAAA4JaglgAA/4AEAAOAAAAACAACAAAAAAAAAAEAAAOA/4AAAASAAAAAAAQAAAEAAAAAAAAAAAAAAAAAAASiAAEAAASiAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgKSAZAABQAEAgACAAAA/8ACAAIAAAACAAAzAMwAAAAABAAAAAAAAACkAA6/QAnw+wAAoDAAAAAAWUFMLgBAACD//QOA/4AAAAOAAIAAAAH/AAAAAAKAA4AAAAAgAAEAgAAAAIAAAAFVAAACAAAAAQAAAAIAAAADAAAAAwAAAAMAAAADAAAAAQAAAAIAAAACAAAAAgAAAAMAAAABAAAAAwAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAABAAAAAoAAAAMAAAACgAAAAwAAAAOAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAgAAAAMAAAADAAAAAYAAAAMAAAADAAAAAwAAAAMAAAADAAAAAoAAAAMAAAADAAAAAQAAAAMAAAACgAAAAYAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAEAAAACAAAAA4AAAAEAAAADAAAAAwAAAAQAAAADAAAAAQAAAAMAAAACAAAABAAAAAKAAAADgAAAAwAAAAIAAAAEAAAAAwAAAAKAAAADAAAAAoAAAAKAAAABgAAAAwAAAAOAAAAAgAAAAgAAAAKAAAADgAAABAAAAAQAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAACgAAAAgAAAAQAAAADgAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAA4AAAAMAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAACAAAAAwAAAAEAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAACAAAABAAAAAKAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAA4AAAAQAAAADAAAAAwAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAAEAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAAwAAAAMAAAAEAAAAAwAAAAMAAAAEAAAAAwAAAAKAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAADAAAAAoAAAAGAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAwAAAAOAAAACAAAAAgAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAA4AAAAMAAAADAAAAAoAAAAMAAAADgAAAAwAAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAGAAAACgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAQAAAADAAAAAwAAAAIAAAADAAAABAAAAAOAAAADgAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAA4AAAAMAAAAEAAAABIAAAAOAAAAEAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADgAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAA4AAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAEAAAADAAAABAAAAAOAAAADgAAAA4AAAAMAAAADAAAAA4AAAAOAAAADgAAAAwAAAASAAAADgAAAA4AAAAMAAAADgAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAwAAAAMAAAADAAAAA4AAAAOAAAADAAAAAoAAAAOAAAADAAAAAwAAAAMAAAADAAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAAwAAAAMAAAADAAAAAYAAAAGAAAABgAAAAgAAAAGAAAACAAAAAwAAAAMAAAADAAAAAwAAAAOAAAADgAAAAwAAAAOAAAACgAAAAwAAAAMAAAADgAAAAwAAAAGAAAADgAAAAwAAAAMAAAADAAAAAwAAAAOAAAADAAAAA4AAAAMAAAADgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAOAAAAEAAAAAwAAAAMAAAACgAAABAAAAAOAAAADAAAAAwAAAAOAAAADgAAAAwAAAAMAAAADAAAAAQAAAAIAAAADAAAAAwAAAAKAAAADAAAAAwAAAAEAAAACAAAAAwAAAAMAAAABAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAAAgAAAAIAAAABgAAAAoAAAAMAAAADAAAABAAAAAQAAAADAAAAAwAAAAQAAAAEAAAABAAAAAMAAAADAAAABAAAAAOAAAADAAAABAAAAAQAAAADgAAABAAAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAEAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAABAAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAKAAAADAAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAoAAAAMAAAADAAAAAwAAAAMAAAACgAAAAoAAAAIAAAACgAAAAoAAAAKAAAADAAAAAgAAAAIAAAADAAAAAwAAAAKAAAACAAAAAoAAAAKAAAADAAAAAwAAAAMAAAACgAAAAwAAAAMAAAADAAAAAgAAAAMAAAACAAAAAwAAAAEAAAACAAAAA4AAAAMAAAADAAAAAgAAAAMAAAACgAAAAwAAAAIAAAADAAAAAQAAAAIAAAADAAAAAwAAAAIAAAACgAAAAoAAAAIAAAACgAAAAoAAAAMAAAADAAAAAwAAAAIAAAACAAAAAoAAAAMAAAADAAAAAwAAAAOAAIAEAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAQAAAAMAAAACgAAABAAAAAGAAAABAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAABAAAAAKAAAABgAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAAAoAAAAKAAAADAAAAAwAAAAMAAAACgAAAAwAAAAOAAAACAAAAAgAAAAOAAAAEgAAAAYAAAAGAAAABgAAAAoAAAAKAAAACgAAAAwAAAAMAAAABgAAABAAAAAQAAAAEgAAAAYAAAAKAAAADgAAAAYAAAAKAAAADgAAAAgAAAAIAAAAEAAAAAgAAAAMAAAAEAAAABAAAAAQAAAACgAAAA4AAAAIAAAABAAAAAgAAAAIAAAAEgAAAAoAAAAEAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACAAAAAgAAAAIAAAABgAAAAYAAAAKAAAACgAAAAgAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAgAAAAIAAAACAAAAAYAAAAGAAAADAAAAAwAAAAMAAAADgAAAAwAAAAMAAAAEAAAABAAAAAQAAAADgAAAA4AAAAOAAAADAAAAAwAAAAQAAAADAAAABAAAAAQAAAADAAAAAwAAAAQAAAADAAAAAwAAAAOAAAAEAAAAAwAAAAOAAAADgAAAAwAAAAQAAAAEgAAAAwAAAAMAAAADAAAAAwAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEAAAABAAAAASAAAAEgAAABIAAAASAAAADgAAABIAAAAQAAAADAAAABAAAAAMAAAAEgAAABAAAAASAAAAEgAAABIAAAAOAAAAEAAAAAoAAAAMAAAADAAAAAwAAAAQAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwABgAOAAAAEAAAABAAAAAOAAAAEAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADgAAABAAAAAMAAAADgAAAA4AAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAACAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAGAAoAAAAMAAAADgAAAA4AAAAQAAAAEAAAAA4AAAAIAAAACAAAAAwAAAAMAAAACAAAAAwAAAAMAAAAEAAAABAAAAAEAAAAEgAAAAwABgASAAYADAAAABIABgAMAAAAEgAGAAwAAAASAAAAEgAAABIAAAASAAAAEAAEABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIABgASAAQAEgAEAAwAAAAQAAAAEAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAAAoAAAASAAgAEAAAABIAAAASAAAADAAAAAwAAAAMAAAADAAAA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CrIKzgsICygLSgtsC3gLmgu6C8wL+gwkDFwMkgykDNoM7A0wDVANkg2iDbAOAg4QDjAOUA54DqgOug7SDu4O7g8EDywPbA+qD+oQNBBeEJgQwBDeEQoRQBFaEYIRoBHAEeYSDBIgEkwSbhKUEroS3BL0Ex4TUBNqE5gTtBPoE/4UIhROFHIUmBS8FNwVBBUsFVQVhhWuFdAV+BYgFiwWQBZiFnQWoBbCFu4XIBdQF2YXlhfAF+QYABgmGEwYcBikGM4Y6BkKGSwZThl8GaQZyhnsGhIaNhpeGoQarhrUGvobIBtKG2wbjhuwG9gb/hwqHFIceByYHLoc5B0IHS4dWh2GHaQdzh3wHhQePh5eHoQesB7MHuIfCh8wH0Ifah+MH7Af2B/0IBAgMiBUIIIgriDMIOohDCEqIUQhXiF+IZ4hxCHeIgYiICI8Il4iiiKqItAi7CMMIzAjZCOMI74j4CQEJCYkTCR0JJYkwiTuJQYlLiVWJWYljiW6JeYmFCYgJiwmOCZKJlYmdCaYJqgmzibmJw4nJidOJ2QnjCe0J9Yn+CgUKDQoRihiKIgomii+KOopJClIKXQpoinQKgQqOipeKpAqpirKKtwrAisuK0YrbCueK74r1Cv0LCAsPixYLHgsoizcLQAtNC1aLYQtsC3aLfAuCi4yLlgugC6eLrwu4C7wLxIvKi9wL6IvxC/sMAQwJjA+MF4wcDCMMLIwxDDkMRQxTjFmMYAxmDG0MdQx+DIUMkAyajKKMqwy0jL0MwQzJjNGM3gzqjPMM/I0CjQsNEQ0ZDR2NJo0wDTSNPI1GDVSNWo1hDWcNbg11jX4NhQ2PjZoNog2sjbWNug3CDcuN1Q3eDecN8A34jgMODY4TjhmOLI46DkUOT45Wjl2OZo5vjnqOhY6MDpOOmQ6jjqwOtQ69jsSOzg7WDt8O5o7uDveO/Q8EDw8PGA8ejyKPKw84Dz6PRo9UD1sPYo9pj3YPfQ+Hj44PmY+hD6yPtA+6j8EPzY/UD+CP5Q/wD/kQARAMkBEQFZAaEB8QI5ApkC2QNhA+kEcQURBXkGCQahBwEHiQhBCMkJQQmBCiEK+Qt5C/EMuQ0hDckOMQ6ZDwEPoRAZEKERMRHREkkSoRMRE5ET6RRxFLEVSRXxFnEXORe5GEkYkRlBGXkZwRoZGsEbIRuxG/kcURyBHMkdIR2hHdEeER55HvEfSR/pIBkgcSDxIYkh6SJpIvkjmSQhJHEk+SVhJbEmASZRJpknGSehKDEouSkRKbkqASppKwkriSvJLEEs6S2BLfEuuS8xL6EwKTCRMQkxqTJJMrkzITOJNCE0iTUZNak2MTbZN0k4MTixORE5mToZOpE7UTwBPKE9KT3JPnE/WT/xQLlBcUIhQrlDWUSBRSlFyUaRR1FH+UjhSWFKKUrpS/FMgU1ZTfFOyU9xUDFQwVHJUrlTOVPhVMFV2VaxV1FYKVkJWelamVsxW+FciVzpXVleAV7hX2FfyWBZYRlhwWJJYuljiWRBZLllQWW5Zllm6WeJaFlo2WlZailq2WuRbBlsiWz5bYFucW+ZcClwoXE5chlyeXMJc2lz+XQpdIl1gXYpdrl3GXeZeDl4wXlxeel6GXpheul7cXvRfFl9CX2JfiF+0X9ZgAGAkYDZgTmBuYKJg7GEYYWJhjGHEYe5iEmJWYoxisGK8YvJjFmNEY1JjZGN8Y55j2GQEZCZkRmSEZJpkxGTwZQ5lMmVQZXZlkGWoZbpl1GX8Zh5mPmZaZnxmjmaoZsxm7mcQZzJnXmeEZ6Zn0GgGaDBoVGiGaLZoxGjSaOBo7mkAaRJpJGlEaWRphGmcab5pzGnkahpqWGpqaohqsmrEauJrDGsua05ruGvYbABsXmyUbMps5m0AbSJtNG1ybZZtzG3sbf5uHG46bl5uem6qbtBu5G7ybwZvHm80b0pvam+Ab6hv2G/2cBRwOHBUcIRwqnC+cMxw4HD4cQ5xNnFkcZRxsnHgcgByMHJocpBywHL4cyRzRnOEc6xz2HQMdDp0anSQdM505nUQdT51hHWodc51/nYudnh2ona4dtx3AHc+d3x3ungAeEx4kHjceSx5anm0efp6THqceuZ7Entoe4R7oHu6e9R7/HwifFB8cnyifMZ89n0cfU59Zn2OfeR+DH5Efm5+qH7Oftx++n8IfyZ/Vn9+f65/5H/4gB6ARIBegHiAsIDKgOKBHIE8gV6BeIGigcqB8oIWgjqCcoKogsiC6IL6gwyDIIM2g2CDioOyg8yD7oREhHSEzoT2hSqFRIVehXyFnoXAheaGDIYshkKGVoZshoCGlIaihriG8ocyhz6HTIdah2yHfIeOh6CHtIfIh9yH8IgKiB6INIhKiGCIfIiSiKiIwojYiO6JCokgiTaJUolsiYiJqonEieCKBIoeijaKVopyioqKrIrQivSLJIsyi0CLTotci2qLzoySjOqM+I0OjSaNTI1kjYqNoo3Gjd6OBI4ijlaOdo68jtKO5o8Cj16Pko/GkA6QWJB6kLyQ7JE0kWaRgJGikcSR7pIOkjaSXpKOkrSS2pMQkziTWJN4k5iTzpQElCCUVJRylJCUvpTQlOiVCJUqlUKVXpWKlZ6VuJXYlf6WKpZcloqWpJbol1CXhpeyl96YEJhSmISYwpjymSqZdpmamcKaKJpWmnqanJqwmsaa6JsQm0ibdJugm8ab8pwUnDCcXpx4nJqcvJzmnPydHp0+nWKdeJ2Wnbqd4J4AniKePJ5annyekp68nuCfDp8mnzyfVJ90n46frJ/Sn/SgGqA6oG6gjqCmoMag4KD+oSihUKF6oYyhpKGwodyh9KISojCiVqKEorKixqLqoxyjSqN0o5ajwqPSo+SkHKREpHCkmqTIpOilDqVApWSldqWQpbal1KXopgimLKZKplymeqagprim8gAAAAIAAAAAAIADgAADAAcAABEzESMVMxUjgICAgAOA/YCAgAAAAAIAAAKAAYADgAADAAcAABEzESMBMxEjgIABAICAA4D/AAEA/wAAAAACAAAAAAKAA4AAGwAfAAATMxEzETMRMxUjFTMVIxEjESMRIxEjNTM1IzUzFxUzNYCAgICAgICAgICAgICAgICAA4D/AAEA/wCAgID/AAEA/wABAICAgICAgAAAAAUAAAAAAoADgAAHAAsADwATABsAAAEzFSEVITUzBTMVIzMhFSkBMxUjKQEVIxUjNSEBAIABAP4AgP8AgICAAYD+gAGAgID+AAIAgID/AAOAgICAgICAgICAgAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABEzESMBMxUrATMRKwEzFSsBMxEjJTMRIyUzFSOAgAIAgICAgICAgICAgIABgICA/gCAgAOA/wABAID/AID/AID/AICAAAAACAAAAAACgAOAAAMABwALABcAGwAfACMAJwAAATMVKwEzFSMlMxUrATMRMxEjNSM1IzUzITMVIyEzESMzIRUhJTMVIwEAgICAgIABAICAgICAgICAgAEAgID+AICAgAEA/wABgICAA4CAgICA/wD/AICAgID/AICAgAAAAAEAAAKAAIADgAADAAARMxEjgIADgP8AAAUAAAAAAYADgAADAAcACwAPABMAAAEzFSsBMxUrATMRIzsBFSM7ARUjAQCAgICAgICAgICAgICAgAOAgID+gICAAAAABQAAAAABgAOAAAMABwALAA8AEwAAETMVIzsBFSM7ARErATMVKwEzFSOAgICAgICAgICAgICAgAOAgID+gICAAAUAAAIAAYADgAADAAcACwAPABMAABEzFSMlMxUrATMVKwEzFSMlMxUjgIABAICAgICAgICAAQCAgAOAgICAgICAgAAAAQAAAIACgAMAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAMA/wCA/wABAIAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAYACgAIAAAMAABEhFSECgP2AAgCAAAAAAAEAAAAAAIAAgAADAAA1MxUjgICAgAAAAAUAAAAAAoADgAADAAcACwAPABMAAAEzFSsBMxErATMVKwEzESsBMxUjAgCAgICAgICAgICAgICAgAOAgP8AgP8AgAAABQAAAAACgAOAAAMACwATABcAGwAAEyEVISMzETMVIxUjATMRIxEjNTMFMxUjAyEVIYABgP6AgICAgIACAICAgID/AICAgAGA/oADgID+gICAAoD9gAGAgICA/wCAAAAAAQAAAAACgAOAAAsAAAEzESEVITUhESM1MwEAgAEA/YABAICAA4D9AICAAgCAAAAABgAAAAACgAOAAAMABwALAA8AEwAbAAATIRUhIzMVIyUzESMpARUhIzMVKwEzFSE1MxEhgAGA/oCAgIACAICA/wABAP8AgICAgIABgID9gAOAgICA/wCAgICA/wAAAAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMRIykBFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/wABAICA/gCAgIABgP6AA4CAgID/AID/AICAgAAAAAMAAAAAAoADgAALAA8AEwAAASERIxEhETMVIRErATMVKwEzFSMBgAEAgP4AgAGAgICAgICAgAOA/IABAAEAgAGAgIAABAAAAAACgAOAAAcACwAPABMAABEhFSEVIRUpATMRIyUzFSMzIRUhAoD+AAGA/gACAICA/gCAgIABgP6AA4CAgID+gICAgAAABQAAAAACgAOAAAMABwAPABMAFwAAASEVISMzFSsBMxUhFSERIwEzESMpARUhAQABAP8AgICAgIABgP6AgAIAgID+gAGA/oADgICAgID/AAEA/wCAAAAAAAMAAAAAAoADgAAHAAsADwAAESERIxEhFSMFMxUrATMRIwKAgP6AgAGAgICAgIADgP6AAQCAgID+gAAAAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAATIRUhIzMRIwEzESMpARUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AgICAAgCAgP6AAYD+gAOAgP8AAQD/AID/AAEA/wCAAAAABQAAAAACgAOAAAMABwAPABMAFwAAEyEVISMzESMBMxEjNSE1IQMzFSMpARUhgAGA/oCAgIACAICA/oABgICAgP8AAQD/AAOAgP8AAQD+AICA/wCAgAAAAAIAAAAAAIACgAADAAcAABEzFSMRMxUjgICAgAKAgP6AgAAAAAIAAP+AAIACgAADAAcAABEzFSMRMxEjgICAgAKAgP6A/wAAAAcAAAAAAgADgAADAAcACwAPABMAFwAbAAABMxUrATMVKwEzFSsBMxUjOwEVIzsBFSM7ARUjAYCAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAAAAACAAAAgAKAAoAAAwAHAAARIRUhESEVIQKA/YACgP2AAoCA/wCAAAAABwAAAAACAAOAAAMABwALAA8AEwAXABsAABEzFSM7ARUjOwEVIzsBFSsBMxUrATMVKwEzFSOAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIyUzESsBMxUrATMVIxUzFSOAAYD+gICAgAIAgICAgICAgICAgAOAgICA/wCAgICAAAAEAAD/gAMAAwAAAwAHABEAFQAAEyEVISMzESMBMxEhESEVIxUhASEVIYACAP4AgICAAoCA/gABAIABAP4AAgD+AAMAgP2AAoD+AAGAgID/AIAAAAACAAAAAAKAA4AAAwAPAAATIRUhIzMVITUzESMRIREjgAGA/oCAgAGAgID+gIADgICAgP0AAgD+AAAAAAADAAAAAAKAA4AACwAPABMAABEhFSEVIRUhESEVIQEzFSMVMxEjAgD+gAGA/oABgP4AAgCAgICAA4CAgID+gIADAICA/oAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AA4CA/YACgID+gICAAAAAAgAAAAACgAOAAAcACwAAESEVIREhFSEBMxEjAgD+gAGA/gACAICAA4CA/YCAAwD9gAAAAAEAAAAAAoADgAALAAARIRUhFSEVIREhFSECgP4AAQD/AAIA/YADgICAgP6AgAAAAAEAAAAAAoADgAAJAAARIRUhFSEVIREjAoD+AAEA/wCAA4CAgID+AAAEAAAAAAKAA4AAAwAHAA0AEQAAEyEVISMzESMBIREjESMBIRUhgAIA/gCAgIABgAEAgID/AAGA/oADgID9gAIA/gABgP6AgAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAABAAAAAAGAA4AACwAAESEVIxEzFSE1MxEjAYCAgP6AgIADgID9gICAAoAAAAMAAAAAAoADgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAOA/QCAgIAAAAAFAAAAAAKAA4AABwALAA8AEwAXAAARMxEhFSERIwEzFSsBMxUjFTMVIzsBESOAAQD/AIACAICAgICAgICAgIADgP8AgP4AA4CAgICA/oAAAAEAAAAAAoADgAAFAAARMxEhFSGAAgD9gAOA/QCAAAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzBTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAKAgICAAAADAAAAAAKAA4AABwAPABMAABEzFTMVIxEjATMRIxEjNTMlMxUjgICAgAIAgICAgP8AgIADgICA/YADgPyAAYCAgIAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAACAAAAAAKAA4AACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIADgICAgP4AAwCAAAAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAEyEVISMzESMBMxErATMVIykBFSElMxUjgAGA/oCAgIACAICAgICA/wABAP8AAYCAgAOAgP2AAoD+AICAgIAAAAADAAAAAAKAA4AACQANABEAABEhFSEVIRUhESMBMxUjFTMRIwIA/oABgP6AgAIAgICAgAOAgICA/gADAICA/gAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIzMhFSkBMxEjJTMVIzMhFSGAAgD+AICAgIABgP6AAYCAgP4AgICAAYD+gAOAgICA/oCAgIAAAQAAAAACgAOAAAcAABEhFSERIxEhAoD/AID/AAOAgP0AAwAAAwAAAAACgAOAAAMABwALAAARMxEjATMRIykBFSGAgAIAgID+gAGA/oADgP0AAwD9AIAAAAUAAAAAAoADgAADAAcACwAPABMAABEzESMBMxEjITMRIwEzESsBMxUjgIACAICA/oCAgAEAgICAgIADgP4AAgD+AP8AAQD/AIAAAAADAAAAAAKAA4AABwAPABMAABEzETMVIxUjATMRIzUjNTMlMxUjgICAgAIAgICAgP8AgIADgP2AgIADgPyAgICAgAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzESMBMxEjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgID+gAGA/oAABQAAAAACgAOAAAMABwALAA8AEwAAETMVIyUzFSMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAOAgICAgICA/YAAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAABAAAAAAGAA4AABwAAESEVIREhFSEBgP8AAQD+gAOAgP2AgAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxUjOwERIzsBFSM7AREjOwEVI4CAgICAgICAgICAgICAA4CA/wCA/wCAAAAAAAEAAAAAAYADgAAHAAARIREhNSERIQGA/oABAP8AA4D8gIACgAAAAAAFAAACAAKAA4AAAwAHAAsADwATAAABMxUrATMVIyUzFSMhMxUjJTMVIwEAgICAgIABAICA/oCAgAIAgIADgICAgICAgIAAAAABAAD/gAKAAAAAAwAAMSEVIQKA/YCAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAADAAAAAAKAAoAAAwANABEAABMhFSkBMxEhNSE1ITUhBTMVI4ABgP6AAYCA/gABgP6AAYD+AICAAoCA/gCAgICAgAAAAAMAAAAAAoADgAAJAA0AEQAAETMRMxUjESEVIQEhFSkBMxEjgICAAYD+AAEAAQD/AAEAgIADgP6AgP8AgAKAgP6AAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzESMBMxUjFTMVIykBFSGAAYD+gICAgAIAgICAgP6AAYD+gAKAgP6AAYCAgICAAAAAAAMAAAAAAoADgAAJAA0AEQAAATMRITUhESM1MyUhFSEjMxEjAgCA/gABgICA/oABAP8AgICAA4D8gIABAICAgP6AAAAAAwAAAAACgAKAAAMADQARAAATIRUhIzMVITUzESEVIzMhFSGAAYD+gICAAYCA/gCAgAIA/gACgICAgP8AgIAAAAIAAAAAAgADgAADAA8AAAEhFSEjMxUhFSERIxEjNTMBAAEA/wCAgAEA/wCAgIADgICAgP4AAgCAAAAAAAMAAP+AAoACgAAJAA0AEQAAEyERIzUhNSERISMzESMRIRUhgAIAgP6AAYD+gICAgAIA/gACgP2AgIABAP8A/wCAAAAAAwAAAAACgAOAAAcACwAPAAARMxEzFSMRIwEhFSkBMxEjgICAgAEAAQD/AAEAgIADgP6AgP6AAoCA/gAAAgAAAAAAgAOAAAMABwAAETMVIxUzESOAgICAA4CAgP2AAAAABAAA/4ACgAOAAAMABwALAA8AAAEzFSMVMxEjATMRIzMhFSECAICAgID+AICAgAGA/oADgICA/YABAP8AgAAAAAUAAAAAAgADgAAHAAsADwATABcAABEzETMVIxEjATMVKwEzFSMVMxUjOwEVI4CAgIABgICAgICAgICAgIADgP4AgP8AAoCAgICAgAACAAAAAAEAA4AAAwAHAAARMxEjOwEVI4CAgICAA4D9AIAAAAAEAAAAAAKAAoAABQAJAA0AEQAAESEVIxEjATMVKwEzESMBMxEjAQCAgAGAgICAgIABAICAAoCA/gACgID/AAEA/gAAAAIAAAAAAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID+AAIA/gAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAMAAP+AAoACgAALAA8AEwAAETMVMxUjFSEVIREjASEVKQEzESOAgIABgP6AgAEAAQD/AAEAgIACgICAgID/AAMAgP8AAAAAAAMAAP+AAoACgAADAA8AEwAAEyEVISUzESMRITUhNSM1MyEzESOAAQD/AAGAgID+gAGAgID+AICAAoCAgP0AAQCAgID/AAAAAAMAAAAAAoACgAAHAAsADwAAETMVMxUjESMBIRUpATMVI4CAgIABAAEA/wABAICAAoCAgP6AAoCAgAAAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjMyEVKQEzFSMpARUhgAIA/gCAgICAAYD+gAGAgID+AAIA/gACgICAgICAAAIAAAAAAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D/AID+gAGAgP4AgAAAAgAAAAACgAKAAAMACQAAETMRIwEzESE1IYCAAgCA/gABgAKA/gACAP2AgAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxEjATMRIyEzFSMlMxUrATMVI4CAAgCAgP6AgIABAICAgICAAoD+gAGA/oCAgICAAAACAAAAAAKAAoAAAwANAAARMxEjATMRITUzETMRM4CAAgCA/gCAgIACgP4AAgD9gIABAP8AAAAAAAkAAAAAAoACgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzFSMlMxUjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIACgICAgICAgICAgICAgIAAAAAAAwAA/4ACgAKAAAMACwAPAAARMxEjATMRIzUhNSEBIRUhgIACAICA/oABgP4AAgD+AAKA/oABgP2AgID/AIAAAAMAAAAAAoACgAAHAAsAEwAAESEVIxUjNSEFMxUrATMVIRUhNTMCgICA/oABAICAgIABgP2AgAKAgICAgICAgIAAAAAABQAAAAABgAOAAAMABwALAA8AEwAAATMVKwEzESsBMxUjOwERIzsBFSMBAICAgICAgICAgICAgICAA4CA/wCA/wCAAAABAAAAAACAA4AAAwAAETMRI4CAA4D8gAAFAAAAAAGAA4AAAwAHAAsADwATAAARMxUjOwERIzsBFSsBMxErATMVI4CAgICAgICAgICAgICAA4CA/wCA/wCAAAAAAAQAAAKAAwADgAADAAcACwAPAAATIRUhJTMVIyEzFSMlIRUhgAEA/wACAICA/YCAgAGAAQD/AAOAgICAgICAAAACAAD/gACAAwAAAwAHAAARMxUjFTMRI4CAgIADAICA/YAAAAAFAAD/gAKAAwAABwALAA8AEwAbAAABMxUzFSE1MwUzESMBMxUjFTMVIykBFSMVIzUjAQCAgP6AgP8AgIACAICAgID+gAGAgICAAwCAgICA/oABgICAgICAgAAAAAMAAAAAAoADgAADABMAFwAAASEVISMzESEVIREhFSE1MxEjNTMBMxUjAQABAP8AgIABAP8AAYD9gICAgAGAgIADgID/AID/AICAAQCAAQCAAAAAAAgAAAAAA4ACgAADAAcACwAPABMAFwAbAB8AABEzFSMlIRUhJTMVIyEzESMBMxEjITMVIyUhFSElMxUjgIABAAGA/oACAICA/YCAgAIAgID9gICAAQABgP6AAgCAgAKAgICAgID+gAGA/oCAgICAgAAFAAAAAAKAA4AAAwAHAAsADwAjAAARMxUjJTMVIyEzFSMlMxUrATMVIRUhFSEVIRUjNSE1ITUhNSGAgAIAgID+gICAAQCAgICAAQD/AAEA/wCA/wABAP8AAQADgICAgICAgICAgICAgICAgAACAAAAAACAA4AAAwAHAAARMxEjFTMRI4CAgIADgP6AgP6AAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAATIRUhIzMVIzMhFSEjMxUjJTMVIykBFSkBMxUjKQEVIYACAP4AgICAgAGA/oCAgIACAICA/oABgP6AAYCAgP4AAgD+AAOAgICAgICAgICAAAACAAADAAGAA4AAAwAHAAARMxUjJTMVI4CAAQCAgAOAgICAAAAJAAAAAAOAA4AAAwAHAAsADwAXABsAHwAjACcAAAEhFSEjMxUjJTMVIyEzESMBIRUhFSEVIQEzESMhMxUjJTMVIykBFSEBAAGA/oCAgIACAICA/YCAgAEAAYD/AAEA/oACAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGAgICAAYD+gICAgIAAAwAAAIACAAOAAAMACwAPAAATIRUpATMRITUjNSEBIRUhgAEA/wABAID+gIABgP6AAgD+AAOAgP6AgID+gIAAAAoAAACAAwADAAADAAcACwAPABMAFwAbAB8AIwAnAAABMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjAQCAgAGAgID+AICAAYCAgP4AgIABgICA/wCAgAGAgID/AICAAYCAgAMAgICAgICAgICAgICAgICAAAAAAAEAAACAAoACAAAFAAARIREjESECgID+AAIA/oABAAAAAQAAAQABgAGAAAMAABEhFSEBgP6AAYCAAAAAAAsAAAAAA4ADgAAHAAsADwATABsAHwAjACcAKwAvADMAAAEhFSMVIzUrATMVIyUzFSMhMxEjATMVMxUjFSMBMxUjJTMRIyUzFSMhMxUjJTMVIykBFSEBAAGAgICAgICAAgCAgP2AgIABAICAgIABAICAAQCAgP8AgID+gICAAgCAgP6AAYD+gAOAgICAgICA/oABgICAgAGAgID+gICAgICAgAAAAQAAAwACgAOAAAMAABEhFSECgP2AA4CAAAAAAAQAAAGAAgADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAEA/wCAgIABgICA/wABAP8AA4CA/wABAP8AgAACAAAAAAKAA4AACwAPAAABMxEhFSERIxEhNSEBIRUhAQCAAQD/AID/AAEA/wACgP2AA4D/AID/AAEAgP4AgAAABQAAAQACAAOAAAMABwALAA8AFwAAEyEVISMzFSMlMxUrATMVKwEzFSEVITUzgAEA/wCAgIABgICAgICAgIABAP4AgAOAgICAgICAgIAAAAAHAAABAAIAA4AAAwAHAAsADwATABcAGwAAEyEVISMzFSMlMxUrATMVIyEzFSMlMxUjKQEVIYABAP8AgICAAYCAgICAgP8AgIABgICA/wABAP8AA4CAgICAgICAgIAAAAACAAACgAEAA4AAAwAHAAATMxUrATMVI4CAgICAgAOAgIAAAAACAAD/gAKAAoAABwALAAARMxEhFSEVIwEzESOAAYD+gIACAICAAoD+AICAAwD+AAABAAAAAAMAA4AADwAAEyEVIxEjESMRIxEjNSM1M4ACgICAgICAgIADgID9AAMA/QACAICAAAAAAAEAAAEAAYADgAALAAATMxEzFSE1MxEjNTOAgID+gICAgAOA/gCAgAEAgAAABQAAAIACAAOAAAMABwALAA8AEwAAEyEVISMzESMBMxEjKQEVIQchFSGAAQD/AICAgAGAgID/AAEA/wCAAgD+AAOAgP8AAQD/AICAgAAAAAAKAAAAgAMAAwAAAwAHAAsADwATABcAGwAfACMAJwAAETMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVI4CAAYCAgP8AgIABgICA/wCAgAGAgID+AICAAYCAgP4AgIABgICAAwCAgICAgICAgICAgICAgIAAAAcAAAAAA4ADgAAHAAsADwATAB8AIwAnAAATMxEjESM1MyUzFSsBMxErATMVIyUhESM1IREzFTM1IyEzESsBMxUjgICAgIACAICAgICAgICAAQABAID/AICAgP6AgICAgIADgP4AAQCAgID/AICA/gCAAQCAgP8AgAAAAAAIAAAAAAOAA4AABwALAA8AEwAZAB0AIwAnAAATMxEjESM1MyUzFSsBMxErATMVIyUhESM1IyEzESMlMxUzFSElMxUjgICAgIACAICAgICAgICAAQABAICA/oCAgAGAgID/AP4AgIADgP4AAQCAgID/AICA/wCA/wCAgICAgAAAAAkAAAAAA4ADgAAHAAsADwATABcAGwAnACsALwAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IREzFTM1IyEzESsBMxUjAYCAgIACgICAgICA/wCAgP8AAQD/AAGAgIABAAEAgP8AgICA/oCAgICAgAOAgICAgID/AICAgICAgP4AgAEAgID/AIAAAAAGAAD/gAKAAwAAAwAHAAsADwATABcAAAEzFSMVMxUrATMVKwEzESMlMxUjKQEVIQEAgICAgICAgICAgAIAgID+gAGA/oADAICAgID/AICAgAAAAAAJAAAAgAKAAwAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAwCAgICAgICAgICAgICAAAAAAAMAAAAAAoADgAAJABMAFwAAEyEVMxEjESMRISMzETMRIRUhNSMBMxUjgAGAgICA/wCAgIABAP6AgAEAgIADgID9gAGAAQD+gP8AgIABgIAAAgAAAAACgAOAAAsADwAAETMRIRUhFSEVIREjATMVI4ABgP6AAYD+gIACAICAA4D/AICAgP8AAgCAAAAABgAA/4ACgAOAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzFSMpARUpATMRIykBFSGAAYD+gICAgAIAgID/AAEA/wABAICA/wABAP8AA4CA/IADgICA/oCAAAcAAAAAAoADgAADAAcACwAPABcAGwAfAAATIRUhJTMVKwEzFSsBMxUjJTMRIzUhNSEFMxUjMyEVIYABAP8AAYCAgICAgICAgAEAgID+gAGA/gCAgIABgP6AA4CAgICAgID+AICAgICAAAAAAAMAAACAAoADAAADAAcACwAAATMVIwUhFSEFMxUjAQCAgP8AAoD9gAEAgIADAICAgICAAAADAAAAAAKAAoAACQATABcAABMhFTMRIxEjNSEjMxEzFSEVITUjATMVI4ABgICAgP8AgICAAQD+gIABAICAAoCA/oABAID/AICAgAEAgAAAAAIAAP+AAoADgAALAA8AABEzESEVIREhFSERIwEzESOAAYD+gAGA/oCAAgCAgAOA/wCA/wCA/wACgP8AAAQAAAAAAoADgAADAAcACwAPAAARMxEjATMRIyUzFSMzIRUhgIACAICA/gCAgIABgP6AA4D+AAIA/QCAgIAAAAAFAAD/gAIAA4AAAwAHAAsADwATAAARMxUjJTMVIwUzESMBMxEjKQEVIYCAAYCAgP6AgIABgICA/oABgP6AA4CAgICA/gACAP2AgAAABQAAAAACAAKAAAcACwAPABMAFwAAETMRMxUjESMBMxUrATMVIxUzFSM7ARUjgICAgAGAgICAgICAgICAgAKA/wCA/wACgICAgICAAAIAAAAAAYADgAADAAcAABMhFSEjMxEjgAEA/wCAgIADgID9AAAAAAAEAAAAAAOAA4AADQARABUAGQAAEyEVIRUhFSERIRUhESsBMxUjJTMVIxUzESOAAoD+gAGA/oABgP4AgICAgAMAgICAgAOAgICA/oCAAwCAgICA/oAAAAAAAgAAAAADAAOAAA0AEQAAEzMRIRUhESEVIREjNTMBMxEjgIABgP6AAYD+AICAAgCAgAOA/oCA/wCAAoCA/oD/AAAAAAADAAAAAAMAA4AADQARABUAABMzETMVIxEhFSERIzUzBSEVKQEzESOAgICAAYD+AICAAQABAP8AAQCAgAOA/oCA/wCAAoCAgID+gAAABQAAAAACgAOAAAMABwALAA8AEwAAEyEVISMzFSMlMxEjJTMVIzMhFSGAAYD+gICAgAIAgID+AICAgAGA/oADgICAgP2AgICAAAAAAAIAAAAAAwADgAAPABMAABMhFSEVMxUjESEVIREjNTMlMxEjgAIA/oCAgAGA/gCAgAIAgIADgICAgP6AgAIAgID9gAAAAQAAAAACgAOAAAsAABEhESE1ITUhNSERIQKA/YACAP8AAQD+AAOA/ICAgIABgAAABAAAAAACgAOAAAMABwARABUAABMhFSEjMxUjJTMRIxEhESMRIQEhFSGAAYD+gICAgAIAgID+gIACAP6AAYD+gAOAgICA/YABAP8AAYD+gIAAAAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMVIwUhFSEjMxEjJTMVIykBFSGAAYD+gICAgAIAgID+gAEA/wCAgIACAICA/oABgP6AA4CA/wABAICAgP8AgICAAAIAAP+AAwADgAAJAA0AABMhFSEVIRUhESsBMxUjgAKA/gABAP8AgICAgAOAgICA/gCAAAAFAAD/gAKAA4AAAwAPABMAFwAbAAABMxUrATMRMxUjESMRIzUzATMVIwEzFSM7ARUjAYCAgICAgICAgIABAICA/gCAgICAgAOAgP8AgP6AAYCAAQCA/gCAgAAAAAIAAAAAAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D+gID/AAEAgP6AgAAABgAAAAACgAOAAAMADwATABcAGwAfAAARIRUpATMVMxUjFSM1IzUzAzMVIyUzFSMhMxEjATMRIwEA/wABAICAgICAgICAgAEAgID+gICAAgCAgAOAgICAgICA/wCAgID/AAEA/wAAAAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP2AAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESERMxEjESERIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AA4CA/wABAP2AAQD/AIAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAESEVKQEzFSMpARUhIzMRIyUzFSMpARUhAgD+AAIAgID+gAGA/oCAgIACAICA/oABgP6AA4CAgID+gICAgAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAARIRUpATMVIykBFSEjMxUjMyEVIQIA/gACAICA/oABgP6AgICAgAIA/gACgICAgICAAAAFAAAAAAKAA4AABQAJAA0AEQAXAAARIRUhFSM7ARUjOwEVKwEzFSsBMxUhFSECgP4AgICAgICAgICAgICAAgD9gAOAgICAgICAgAAABAAA/4ACgAOAAAMABwAPABMAABMzFSsBMxUjJTMRIxEjNTMTIRUhgICAgICAAQCAgICAgAEA/wADgICAgP0AAgCA/YCAAAAABAAAAAACgAOAAAUACQANABEAABEzESEVIQEzFSM7ARErATMVI4ABAP6AAYCAgICAgICAgAOA/QCAA4CA/gCAAAUAAP+AAoADgAAFAAkADQARABUAABEhESM1IQUhFSkBMxEjJTMVIzMhFSECgID+AAEAAQD/AAEAgID+AICAgAGA/oADgP8AgICA/gCAgIAABQAA/4ACgAOAAAUACQANABEAFQAAESEVIRUjMyEVISMzESMlMxUjKQEVIQKA/gCAgAEA/wCAgIACAICA/oABgP6AA4CAgID+AICAgAAAAAAFAAD/gAKAAoAABQAJAA0AEQAVAAARIRUhFSMzIRUhIzMRIyUzFSMpARUhAoD+AICAAQD/AICAgAIAgID+gAGA/oACgICAgP8AgICAAAAAAAUAAAAAAoADgAADAAcACwAXAB8AABMhFSEjMxUjJTMVKwEzFTMVIRUjNSM1IQEzFSE1MxEhgAGA/oCAgIACAICAgICA/oCAgAGA/oCAAYCA/YADgICAgICAgICAgP8AgID/AAAEAAAAAAKAA4AACQANABEAFQAAESEVIRUhFSERIwEzESMlMxUjMyEVIQKA/oABAP6AgAIAgID+AICAgAGA/oADgICAgAEA/wD+gICAgAAAAAMAAAAAAoACgAAJAA0AEQAAESEVIRUhFSERIwEzFSMpARUhAoD+gAEA/oCAAgCAgP4AAgD+AAKAgICAAQD/AICAAAAABAAAAAACgAOAAAsADwATABcAABMzETMVIxUjNSM1MxMhFSkBMxUjKQEVIYCAgICAgICAAQD/AAEAgID+AAIA/gADgP8AgICAgP8AgICAAAAEAAD/gAKAAoAACwAPABMAFwAAETMVMxUjESEVIRUjASEVKQEzESsBMxUjgICAAQD/AIABAAEA/wABAICAgICAAoCAgP8AgIADAID/AIAAAAEAAAAAAIADgAADAAARMxEjgIADgPyAAAIAAAAAAYADgAADAAcAABEzESMBMxEjgIABAICAA4D8gAOA/IAAAAABAAAAAAKAA4AAEwAAATMRIRUhFSEVIREjESE1ITUhNSEBAIABAP8AAQD/AID/AAEA/wABAAOA/wCAgID/AAEAgICAAAIAAAAAAIADgAADAAcAABEzESMVMxUjgICAgAOA/YCAgAAAAAYAAP+AA4ADgAADAAcACwAPABMAFwAAETMRIwEzFSMVMxEjATMRIyUzFSMpARUhgIADAICAgID+gICA/wCAgAGAAQD/AAOA/QADAICA/YABAP8AgICAAAADAAAAAAKAAoAAAwANABEAABEhFSkBMxEjNSEVIxEhASEVIQIA/gACAICA/oCAAgD+gAGA/oACgID+gICAAQD/AIAAAAUAAP+AAoADgAALAA8AEwAXABsAABEzFTMVIxEzFSMRIwEhFSkBMxErATMVKwEzFSOAgICAgIABAAEA/wABAICAgICAgICAA4CAgP6AgP8ABACA/wCAgAAHAAD/gAKAA4AAAwAHAAsAEQAVABkAHQAAEyEVISMzFSMlMxUrATMRITUzFzMRKwEzFSMpARUhgAGA/oCAgIACAICAgID/AICAgICAgID+gAGA/oADgICAgID/AICA/wCAgAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSkBMxUrATMVIykBFSGAAYD+gICAgAIAgID/AAEA/wABAICAgICA/oABgP6AAoCAgICAgICAgAAAAgAA/4ACgAOAAAUACQAAESEVIREjATMRIwIA/oCAAgCAgAOAgP0AAwD8gAAFAAD/gAOAA4AADQARABUAGQAdAAABMxEzFSMVITUhESM1MyUhFSEjMxEjITMVKwEzFSMCAICAgP4AAYCAgP6AAQD/AICAgAMAgICAgIADgP2AgICAAQCAgID+gICAAAAFAAD/gAKAA4AABQAJAA0AEQAZAAARIREjNSEFMxUrATMVKwEzFSsBMxUhESM1IQKAgP4AAYCAgICAgICAgICAAgCA/gADgP8AgICAgICA/wCAAAADAAD/gAKAAoAABwALABUAABEhFSMVIzUhBTMVKwEzFSERIzUhNTMCgICA/oABAICAgIABgID+AIACgICAgICAgP8AgIAAAAADAAD/gAGAA4AABwALAA8AABEzETMVIxUjJTMVKwEzFSOAgICAAQCAgICAgAOA/YCAgICAgAAAAAQAAP+AA4ACgAAFAA0AEQAVAAARIRUhESMBMxEzFSMVIyUzFSsBMxUjAgD+gIACAICAgIABAICAgICAAoCA/gACAP8AgICAgIAAAAADAAAAAAIAA4AADwATABcAABMzETMVIxUzFSMVIxEjNTMBMxUrATMVI4CAgICAgICAgAEAgICAgIADgP8AgICAgAGAgP6AgIAAAAAAAQAAAAACgAOAABcAABMhFTMRIxEjFSM1IxUzESMVIxEzFSE1IYABgICAgICAgICAgAEA/wADgID9AAIAgICA/wCAAwCAgAAABwAAAAACgAOAAAMACwAPABMAFwAbAB8AABMhFSEjMxEzFSMVIwEzFSsBMxUrATMVIwUzFSMpARUhgAGA/oCAgICAgAIAgICAgICAgIABAICA/oABgP6AA4CA/oCAgAKAgICAgICAAAAEAAAAAAKAAoAABwARABUAGQAAEyEVMxUhNSEjMxEzFSEVITUjATMVIyEzFSOAAYCA/wD/AICAgAEA/oCAAQCAgAEAgIACgICAgP8AgICAAQCAgAABAAAAAAMAA4AADQAAEzMRMxUjESEVIREjNTOAgICAAgD9gICAA4D+gID/AIABgIAAAAAAAgAAAAACgAOAABEAFQAAESERIzUjFTMVIxEjESM1MxEhETMVIwKAgICAgICAgP8AgIADgP8AgICA/gABAIABgP4AgAAEAAAAAAKAA4AAAwAHAAsAEQAAEyEVISMzFSMlMxEjKQEVIxEjgAGA/oCAgIACAICA/wABAICAA4CAgID+gID/AAAAAAQAAAAAAoACgAADAAcACwARAAATIRUhIzMVIyUzESMpARUjFSOAAYD+gICAgAIAgID/AAEAgIACgICAgP8AgIAAAAAAAwAAAAADAAOAABMAFwAbAAATIRUhFSEVIRUhFSEVIRUhESM1MwEzFSMVMxEjgAIA/oABgP6AAQD/AAGA/gCAgAIAgICAgAOAgICAgICAgAEAgAGAgID+gAAAAAACAAAAAAOAA4AAEwAXAAATMxEhETMRMxUjESMRIREjESM1MxMhFSGAgAGAgICAgP6AgICAgAGA/oADgP8AAQD/AID+gAGA/oABgID+AIAAAAUAAAAAAoADgAADAAcACwAPABMAAAEzFSsBMxEjATMRIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAOAgP8AAQD/AP4AAgD+AAABAAAAAAKAA4AAFQAAESERIzUhFSEVIxUjNSMVMxUjFSEVIQKAgP6AAYCAgICAgAIA/YADgP8AgICAgICAgICAAAAAAAIAAAAAAwACgAARABUAAAEhFTMRIRUhFSE1IxEzFSE1IQEzFSMBAAGAgP6AAYD+AICAAQD/AP8AgIACgID/AICAgAGAgID+gIAAAAADAAAAAAMAA4AACwAPABMAAAEzETMVIxEjESM1MwEzFSMzIRUhAgCAgICAgID+AICAgAGA/oADgP8AgP6AAYCA/oCAgAAAAAAEAAD/gAMAA4AAAwAPABMAFwAAATMVIxUzFTMVIxEjESM1MwEzESMzIRUhAgCAgICAgICAgP4AgICAAYD+gAOAgICAgP6AAYCA/wD/AIAAAAQAAP+AAwADgAAJAA0AEQAVAAATIREjNSM1MxEhIzMRIzMhFSkBMxUjgAIAgICA/oCAgICAAQD/AAIAgIADgPyAgIACAP2AgIAAAAAEAAD/gAMAAoAAAwAPABMAFwAAEyEVISUzESM1ITUhNSM1MyEzESMBMxUjgAEA/wABgICA/oABgICA/gCAgAKAgIACgICA/YCAgICA/wD/AIAAAAADAAAAAAMAA4AADQARABUAABMhFSEVIRUhESMRIzUzJTMVIxUzESOAAgD+gAGA/oCAgIACAICAgIADgICAgP4AAgCAgICA/gAAAAAAAwAAAAADAAKAAA8AEwAXAAATMxUzFSMVMxUjFSM1IzUzASEVKQEzFSOAgICAgICAgIABAAEA/wABAICAAoCAgICAgICAAYCAgAAAAAIAAAAAA4ADgAATABcAABMzFSE1MxUzFSEVIzUjFSM1ITUzATMRI4CAAYCAgP8AgICA/wCAAQCAgAOAgICAgICAgICA/wD+AAAAAAACAAD/gAOAAoAAFwAbAAATMxUhNTMVMxUjESM1ITUhNSEVIzUjNTMRIRUhgIABgICAgID+gAGA/oCAgIACAP4AAoCAgICA/oCAgICAgID+AIAAAAADAAAAAAKAAoAACQANABEAABEhFSEVIRUhFSMBMxUjASEVIQIA/oABgP6AgAIAgID+gAGA/oACgICAgIABgID/AIAAAAMAAAAAAoACgAADAA0AEQAAEyEVISUzESE1IREjNTMhMxEjgAEA/wABgID+AAGAgID+AICAAoCAgP2AgAEAgP6AAAAAAwAAAAACgAKAAAkADQARAAARIRUhETMVIxUjATMRIykBFSECAP6AgICAAgCAgP8AAQD/AAKAgP8AgIACAP6AgAAAAAAEAAAAAAKAA4AAAwANABEAFQAAEyEVISMzETMVIxEhFSEBIRUpATMRI4ABgP6AgICAgAGA/gABAAEA/wABAICAA4CA/wCA/wCAAoCA/oAAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjJTMRIyUzFSMzIRUhgAGA/oCAgIACAICA/gCAgIABgP6AAoCAgID+gICAgAAAAAAFAAD/gAKAAoAAAwAHAAsAFwAbAAATIRUhIzMRIwEzFSsBMxUzFSMVIzUjNTMlMxUjgAGA/oCAgIABgICAgICAgICAgAEAgIACgID+gAEAgICAgICAgIAABAAA/4ADAAOAAAkADQARABUAAAEzESE1IREjNTMlIRUhIzMRIwUzFSMCAID+AAGAgID+gAEA/wCAgIACgICAA4D8gIABAICAgP6AgIAAAAAEAAAAAAMAA4AAAwANABEAFQAAATMVKwEzESE1IREjNTMlIRUhIzMRIwKAgICAgP4AAYCAgP6AAQD/AICAgAOAgP0AgAEAgICA/oAAAwAAAAACgAKAAAMADQARAAATIRUhIzMVITUzESM1IRUhFSGAAYD+gICAAYCAgP4AAgD+AAKAgICA/oCAgIAAAAMAAAAAAoACgAADAA0AEQAAESEVKQEzESM1IRUjESEBIRUhAgD+AAIAgID+gIACAP6AAYD+gAKAgP6AgIABAP8AgAAABAAAAAADgAKAAAMADwATABcAABEhFSkCFSMRIzUhFSMRKQEzFSMFIRUhAgD+AAIAAQCAgP6AgAIAAQCAgP2AAYD+gAKAgID/AICAAQCAgIAAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUhIzMVIzMhFSGAAgD+AICAgIABAP8AgICAgAIA/gACgICAgICAAAAABQAAAAACgAKAAAMABwALAA8AEwAAESEVKQEzFSMpARUpATMVIykBFSECAP4AAgCAgP8AAQD/AAEAgID+AAIA/gACgICAgICAAAAAAAYAAAAAA4ACgAADAAcACwAPABMAFwAAESEVKQIVKQIVISUzFSMhMxUjKQEVIQIA/gACAAEA/wD/AAEA/wACAICA/wCAgP4AAgD+AAKAgICAgICAgAAAAAAGAAAAAAKAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMVIykBFSkBMxUjKQEVIYABgP6AgICAAgCAgP8AAQD/AAEAgID+gAGA/oACgID+gAGAgICAgAAAAgAA/4ACAAMAAAsADwAAATMRMxUjFSM1ITUhASEVIQEAgICAgP8AAQD/AAEA/wADAP4AgICAgP8AgAAABAAA/4ADAAOAAAMADwATABcAAAEzFSsBMxEjNSE1IREhNSEFMxEjESEVIQKAgICAgID+gAGA/oABgP4AgIACAP4AA4CA/QCAgAEAgID/AP8AgAAAAwAA/4ACgAKAAAkADQARAAATIREjNSE1IREhIzMRIxEhFSGAAgCA/oABgP6AgICAAgD+AAKA/YCAgAEA/wD/AIAAAAAEAAAAAAKAAoAAAwAHAA0AEQAAEyEVISMzESMBIREjNSMFIRUhgAIA/gCAgIABgAEAgID/AAGA/oACgID+gAEA/wCAgIAAAAAGAAAAAAKAAoAAAwAHAAsADwATABcAABEhFSElIRUhIzMVKwEzESMBMxErATMVIwEA/wABgAEA/wCAgICAgIABAICAgICAAoCAgICA/wABAP8AgAADAAD/gAKAAwAAAwALAA8AABEzESMBMxEjESM1MwUhFSGAgAIAgICAgP6AAQD/AAMA/gACAPyAAYCAgIAAAAAABAAAAAACgAOAAAMACwAPABMAABMhFSEjMxEzFSMRIwEhFSkBMxEjgAIA/gCAgICAgAEAAQD/AAEAgIADgID/AID+gAKAgP4AAAAAAAUAAP+AAoADgAADAAsADwATABcAABMhFSEjMxEzFSMRIwEhFSkBMxEjKQEVIYACAP4AgICAgIABAAEA/wABAICA/wABAP8AA4CA/wCA/oACgID+AIAAAAACAAAAAAGAA4AAAwAPAAATMxUjFTMRMxUjESMRIzUzgICAgICAgICAA4CAgP8AgP8AAQCAAAAAAAEAAAAAAYACgAALAAARIRUjETMVITUzESMBgICA/oCAgAKAgP6AgIABgAAABAAAAAACgAOAAAsADwATABcAAAEzETMVIxEjESM1MyEzFSMhMxUjATMVIwEAgICAgICAAQCAgP4AgIABgICAA4D+gID/AAGAgICA/wCAAAADAAAAAAIAA4AADwATABcAAAEzETMVIxUjNSM1MzUjNTMFMxUjATMVIwEAgICAgICAgID/AICAAYCAgAOA/gCAgICAgICAgP8AgAAAAgAA/4ABAAOAAAMABwAAETMRIzsBFSOAgICAgAOA/ICAAAAABAAA/4ACgAOAAAkADQARABUAABEzESERIzUhESMBIRUpATMRIykBFSGAAgCA/oCAAQABAP8AAQCAgP8AAQD/AAOA/wD/AID+AAGAgP8AgAAEAAAAAAKAAoAAAwAJAA0AEQAAETMRIwEzESE1MwEzESsBMxUjgIACAID/AID/AICAgICAAoD+AAIA/YCAAQD/AIAAAAQAAP+AAoACgAADAAsADwATAAARMxEjATMRIzUjNTMBMxErATMVI4CAAgCAgICA/wCAgICAgAKA/gACAP0AgIABAP8AgAAAAAUAAP+AAoACgAAFAAkADQARABUAABEhFSMRIwEzFSsBMxEjATMRKwEzFSMBAICAAYCAgICAgAEAgICAgIACgID+AAKAgP8AAQD+AIAAAAAAAwAA/4ADAAKAAAUACQANAAATIRUhESMBMxEjITMVI4ACAP6AgAIAgID9gICAAoCA/gACAP4AgAADAAD/gAMAAoAABQAJAA0AABEhFSERIwEzESM7ARUjAgD+gIACAICAgICAAoCA/gACAP4AgAAAAAMAAAAAAoACgAAHAA8AEwAAETMVMxUjESMBMxEjNSM1MyUzFSOAgICAAgCAgICA/wCAgAKAgID+gAKA/YCAgICAAAAAAwAAAAACgAKAAAMADwATAAATIRUhIzMVITUzESM1IRUjMyEVIYABgP6AgIABgICA/oCAgAGA/oACgICAgP6AgICAAAAGAAAAAAOAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMRIwEzESMpARUhJSEVIYACgP2AgICAAwCAgP6AgID/AAEA/wABgAEA/wACgID+gAGA/oABAP8AgICAAAMAAP+AAoADAAATABcAGwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwEAgICAgICAgICAgP8AgIACAICAAwCAgP6AgICAgAGAgID+gAGA/oAAAAADAAAAAAKAAoAABwALAA8AAAEzESM1IzUzITMVIzMhFSECAICAgID+AICAgAEA/wACgP2AgICAgAAAAAADAAAAAAKAA4AABwALAA8AAAEzESM1IzUzITMVIzMhFSECAICAgID+AICAgAEA/wADgPyAgICAgAAAAAAEAAD/gAMAAoAABwALAA8AEwAAATMRIzUjNTMhMxUjMyEVKQEzFSMCAICAgID+AICAgAEA/wACAICAAoD9gICAgICAAAMAAP+AAoACgAAHAAsADwAAETMVMxUjESMBIRUpATMVI4CAgIABAAEA/wABAICAAoCAgP4AAwCAgAAAAAMAAAAAAoACgAADAAcACwAAEyEVISMzESMBMxUjgAGA/oCAgIACAICAAoCA/gACAIAAAAADAAD/gAKAAoAAAwAHAAsAABMhFSEjMxUjJTMRI4ABgP6AgICAAgCAgAKAgICA/YAAAAAAAwAAAAACgAKAAAkADQARAAARIRUhFSEVIREjATMVIxUzESMCAP6AAYD+gIACAICAgIACgICAgP8AAgCAgP8AAAMAAAAAAoACgAAJAA0AEQAAETMRIRUhFSEVIQEzESMVMxUjgAGA/oABgP4AAgCAgICAAoD/AICAgAKA/wCAgAAEAAD/gAMAA4AAAwAPABMAFwAAATMVKwEzETMVIxUjNSM1MyEzESMzIRUhAoCAgICAgICAgID+AICAgAGA/oADgID+AICAgID/AIAAAwAA/4ACgAKAAAMABwALAAARIRUpATMRIzMhFSEBAP8AAQCAgIABAP8AAoCA/gCAAAAAAAQAAP+AAwADgAADAA8AEwAXAAABIRUhIzMRMxUjFSM1ITUhBTMVIzMhFSECAAEA/wCAgICAgP8AAQD+gICAgAEA/wADgID+AICAgICAgIAAAgAA/4ABgAMAAAMADwAAETMVIzsBETMVIxEjESM1M4CAgICAgICAgAMAgP6AgP8AAQCAAAIAAP+AAYADgAALAA8AABMzETMVIxEjESM1MxMzFSOAgICAgICAgICAA4D/AID+AAIAgP2AgAAAAQAAAAADgAKAABUAABMzESERMxEzFSMRITUhNSEVIzUjNTOAgAGAgICA/gABgP6AgICAAoD/AAEA/wCA/wCAgICAgAAFAAAAAAKAAoAABQALAA8AEwAXAAARIREjNSMlIRUjFSMhMxEjATMRIykBFSEBAICAAYABAICA/oCAgAIAgID+gAGA/oACgP8AgICAgP8AAQD/AIAAAAAABAAAAAACgAKAAAMABwALAA8AABEzESMBMxUjOwERIykBFSGAgAGAgICAgID+gAGA/oACgP4AAgCA/oCAAAAAAAUAAAAAAoACgAADAAcACwAPABMAAAEzFSsBMxUjJTMVIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAKAgICAgP6AAYD+gAAAAAACAAAAAAKAAoAACQANAAARIRUjESMRIxEjATMRIwIAgICAgAIAgIACgID/AAEA/gACAP4AAAAAAAMAAAAAAoADAAADAAsADwAAEyEVISMzFSEVIREjATMRI4ACAP4AgIABgP6AgAIAgIADAICAgP6AAYD+gAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxUjJTMVIyEzFSMlMxUrATMRI4CAAgCAgP6AgIABAICAgICAAoCAgICAgID+gAAAAAAFAAD/gAKAAoAABwALAA8AHQAhAAARIRUjFSM1IRczFSMlMxUjITMVMzUzFTMVIxUjNSEBMxUjAgCAgP8AgICAAQCAgP6AgICAgICA/wACAICAAoCAgICAgICAgICAgICAAQCAAAAAAAUAAP+AAoACgAAFAAkADQARABUAABEhESM1IQUhFSkBMxEjJTMVIzMhFSECgID+AAEAAQD/AAEAgID+AICAgAGA/oACgP8AgICA/wCAgIAABgAA/4ACgAKAAAUACQANABEAFQAdAAARIREjNSEFIRUhIzMVIyUzESMlMxUjJTMVMxUhNTMCgID+AAEAAQD/AICAgAGAgID+AICAAQCAgP6AgAKA/wCAgICAgP8AgICAgICAAAQAAAAAAoADgAADAAcACwARAAATIRUhIzMVIyUzESMpARUjESOAAYD+gICAgAIAgID/AAEAgIADgICAgP6AgP8AAAAABAAAAAACgAOAAAMABwALABEAABMhFSEjMxEjATMVIwEhESMRI4ABgP6AgICAAgCAgP6AAQCAgAOAgP6AAYCA/wD+gAEAAAAABAAAAAACgAOAAAUACQANABEAAAEzETMVKQEzESMlMxUjMyEVIQEAgID/AAEAgID+AICAgAGA/oADgP8AgP6AgICAAAAFAAD/gAKAAoAAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AAoCA/gACAID/AICAAAAABQAAAAACgAOAAAMABwALAA8AEwAAEyEVISMzESMBMxEjATMVIwMhFSGAAYD+gICAgAIAgID/AICAgAGA/oADgID9gAKA/YABgID/AIAAAAADAAAAAAKAAoAACwAPABMAABEhFSEVIRUhFSEVIQEzFSMVMxUjAgD+gAGA/oABgP4AAgCAgICAAoCAgICAgAIAgICAAAYAAAAAAoACgAADAAcACwAPABMAFwAAEyEVISMzFSMlMxEjASEVISMzFSMzIRUhgAGA/oCAgIACAICA/oABAP8AgICAgAGA/oACgICAgP6AAQCAgIAAAAAFAAAAAAMAA4AAAwAJAA0AEwAXAAABMxUrATMRITUhBTMRIwEhESM1IwUhFSECgICAgID+AAGA/gCAgAGAAQCAgP8AAYD+gAOAgP8AgID+gAEA/wCAgIAAAQAAAAACgAKAAAsAABEzESERMxEjESERI4ABgICA/oCAAoD/AAEA/YABAP8AAAAABAAA/4ACgAOAAAMADwATABcAAAEzFSMVMxEzFSMVIzUhNSEFMxUjMyEVIQGAgICAgICA/wABAP6AgICAAQD/AAOAgID+gICAgICAgIAAAAAFAAD/gAIAAwAAAwALAA8AEwAXAAARMxUjJTMRIxEjNTMlMxUjFTMVKwEzFSOAgAGAgICAgP8AgICAgICAgAMAgID8gAIAgICAgICAAAAAAAEAAAAAAoACgAAFAAARMxEhFSGAAgD9gAKA/gCAAAAABAAA/4ADAAOAAAMADwATABcAAAEzFSsBMxEjESE1ITUjNTMlIRUhIzMRIwKAgICAgID+gAGAgID+gAEA/wCAgIADgID8gAEAgICAgID/AAAEAAAAAAKAA4AAAwAHAAsAGQAAEyEVISMzFSMlMxEjKQEVIxUhFSEVIzUhNSGAAYD+gICAgAIAgID/AAEAgAEA/wCA/wABAAOAgICA/wCAgICAgIAAAAAABAAAAAACgAOAAAMABwALABkAABMhFSEjMxEjATMVIwUhESEVIRUjNSE1ITUjgAGA/oCAgIACAICA/oABAAEA/wCA/wABAIADgID/AAEAgID/AICAgICAAAQAAAAAAoADgAAJAA0AFwAbAAARMxEzNTMVMxUhATMRIwEzETM1MxUzFSEBMxEjgICAgP4AAgCAgP4AgICAgP4AAgCAgAOA/wCAgIABgP8A/wD/AICAgAGA/wAAAQAAAoAAgAOAAAMAABEzESOAgAOA/wAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAoAAgAMAAAMAABEzFSOAgAMAgAAAAgAA/4AAgAIAAAMABwAAETMVIxEzESOAgICAAgCA/wD/AAAAAQAAAgAAgAKAAAMAABEzFSOAgAKAgAAAAgAAAAACgAOAAAMADwAAEyEVISMzFSE1MxEjESERI4ABgP6AgIABgICA/oCAA4CAgID9AAIA/gAAAAAAAwAAAAACgAOAAAsADwATAAARIRUhFSEVIREhFSEBMxUjFTMRIwIA/oABgP6AAYD+AAIAgICAgAOAgICA/oCAAwCAgP6AAAAAAQAAAAACgAOAAAUAABEhFSERIwKA/gCAA4CA/QAAAAAEAAAAAAKAA4AAAwAHAAsAEwAAATMRKwEzESMBMxEjITMVITUzESEBAICAgICAAQCAgP6AgAGAgP2AA4D/AP6AAYD+gICA/wAAAAAAAQAAAAACgAOAAAsAABEhFSEVIRUhESEVIQKA/gABAP8AAgD9gAOAgICA/oCAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzESMBMxUjAyEVIYABgP6AgICAAgCAgP8AgICAAYD+gAOAgP2AAoD9gAGAgP8AgAAAAAEAAAAAAYADgAALAAARIRUjETMVITUzESMBgICA/oCAgAOAgP2AgIACgAAABQAAAAACgAOAAAcACwAPABMAFwAAETMRIRUhESMBMxUrATMVIxUzFSM7AREjgAEA/wCAAgCAgICAgICAgICAA4D/AID+AAOAgICAgP6AAAAFAAAAAAKAA4AAAwAHAAsADwATAAABMxErATMRIwEzESMhMxEjATMRIwEAgICAgIABAICA/oCAgAIAgIADgP8A/oABgP6A/wABAP8AAAAAAAMAAAAAAoADgAAHAA8AEwAAETMVMxUjESMBMxEjESM1MwUzFSOAgICAAgCAgICA/wCAgAOAgID9gAOA/IACgICAgAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzJTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAGAgICAAAADAAAAAAKAA4AAAwAHAAsAABEhFSETIRUhAyEVIQKA/YCAAYD+gIACgP2AA4CA/wCA/wCAAAAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAABAAAAAAKAA4AABwAAESERIxEhESMCgID+gIADgPyAAwD9AAACAAAAAAKAA4AACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIADgICAgP4AAwCAAAAAAAUAAAAAAoADgAAFAAkADQARABcAABEhFSEVIzsBFSM7ARUrATMVKwEzFSEVIQKA/gCAgICAgICAgICAgIACAP2AA4CAgICAgICAAAABAAAAAAKAA4AABwAAESEVIREjESECgP8AgP8AA4CA/QADAAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxUjJTMVIyEzFSMlMxUrATMRI4CAAgCAgP6AgIABAICAgICAA4CAgICAgID9gAAAAAADAAAAAAKAA4AAEwAXABsAAAEzFTMVIxEzFSMVIzUjNTMRIzUzBTMRIwEzESMBAICAgICAgICAgID/AICAAgCAgAOAgID+gICAgIABgICA/oABgP6AAAAACQAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjAAARMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjITMRIwEzESOAgAIAgID+gICAAQCAgICAgICAgAEAgID+gICAAgCAgAOAgICAgICAgICAgP6AAYD+gAADAAAAAAKAA4AAAwAPABMAABEzESMBMxEzFSMRIxEjNTMBMxEjgIABAICAgICAgAEAgIADgP8AAQD/AID+AAIAgAEA/wAAAAAFAAAAAAKAA4AAAwAHAAsAEQAXAAATIRUhIzMRIwEzESMhMxEhNTMlMxUzFSGAAYD+gICAgAIAgID+gID/AIABAICA/wADgID+AAIA/gD/AICAgIAAAAAABgAAAAACgAKAAAMABwALAA8AEwAXAAATIRUhJTMVIyEzESMBMxEjKQEVISUzFSOAAQD/AAGAgID+AICAAYCAgP8AAQD/AAGAgIACgICAgP6AAYD+gICAgAAAAAAGAAD/gAKAA4AAAwALAA8AEwAXABsAABMhFSEjMxEhFSEVIwEzFSsBMxUjOwEVIzsBESOAAQD/AICAAYD+gIABgICAgICAgICAgICAA4CA/YCAgAOAgICA/wAAAAgAAP+AAoACgAADAAcACwAPABMAFwAbAB8AABEzFSMlMxUjITMVIyUzFSsBMxUrATMRIwEzESsBMxUjgIACAICA/oCAgAEAgICAgICAgIABAICAgICAAoCAgICAgICA/wABAP8AgAAACAAAAAACgAOAAAMABwALAA8AEwAXABsAHwAAASEVISMzFSM7ARUrATMVIyUzFSMhMxEjATMRIykBFSEBAAEA/wCAgICAgICAgIABAICA/oCAgAIAgID+gAGA/oADgICAgICAgP8AAQD/AIAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUhIzMVIzMhFSGAAgD+AICAgIABAP8AgICAgAIA/gACgICAgICAAAAACAAA/4ACgAOAAAMABwALAA8AEwAXABsAHwAAESEVKQEzFSsBMxUrATMVKwEzFSMzIRUpATMVKwEzFSMCAP4AAgCAgICAgICAgICAgIABAP8AAQCAgICAgAOAgICAgICAgIAAAAIAAP+AAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID+AAIA/YAAAwAAAAACgAOAAAMADwATAAATIRUhIzMRIREzESMRIREjMyEVIYABgP6AgIABgICA/oCAgAGA/oADgID/AAEA/YABAP8AgAAAAgAAAAABAAKAAAMABwAAETMRIzsBFSOAgICAgAKA/gCAAAAABQAAAAACAAKAAAcACwAPABMAFwAAETMRMxUjESMBMxUrATMVIxUzFSM7ARUjgICAgAGAgICAgICAgICAgAKA/wCA/wACgICAgICAAAYAAAAAAoADgAADAAcACwAPABMAFwAAESEVKQEzESsBMxEjATMRIyEzESMBMxEjAQD/AAEAgICAgIABAICA/oCAgAIAgIADgID/AP8AAQD/AP8AAQD/AAACAAD/gAKAAoAABwALAAARMxEhFSEVIwEzESOAAYD+gIACAICAAoD+AICAAwD+AAAFAAAAAAKAAoAAAwAHAAsADwATAAARMxEjATMRIyEzESMBMxErATMVI4CAAgCAgP6AgIABAICAgICAAoD/AAEA/wD/AAEA/wCAAAAACAAA/4ACgAOAAAMABwALAA8AEwAXABsAHwAAETMVIzMhFSEjMxUjMyEVISMzFSMzIRUpATMVKwEzFSOAgIABgP6AgICAgAGA/oCAgICAAYD+gAGAgICAgIADgICAgICAgICAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAABAAAAAAKAAoAACwAAESEVIxEjESMRIxEjAoCAgICAgAKAgP4AAgD+AAIAAAMAAP+AAoACgAADAAsADwAAEyEVISMzESEVIREjATMRI4ABgP6AgIABgP6AgAIAgIACgID/AID/AAKA/wAAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAABMhFSEjMxEjATMVIwUhFSkBMxUrATMVI4ABgP6AgICAAgCAgP6AAYD+gAGAgICAgIACgID/AAEAgICAgIAAAAAAAwAAAAADAAKAAAcACwAPAAATIRUjESMRISMzESMzIRUhgAKAgID+gICAgIABgP6AAoCA/oABgP6AgAAAAgAAAAACgAKAAAcACwAAESEVIREjESEBMxUjAoD/AID/AAGAgIACgID+gAGA/oCAAAAAAAQAAAAAAoACgAADAAcACwAPAAARMxEjATMVIzsBESMpARUhgIABgICAgICA/oABgP6AAoD+AAIAgP6AgAAAAAAEAAD/gAKAAoAAAwAHABMAFwAAATMVIyEzESMBMxEzFSMVIzUjNTMBMxEjAYCAgP6AgIABAICAgICAgAEAgIACgID+gAGA/oCAgICAAYD+gAAAAAAJAAD/gAKAAoAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxEjATMRI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAoCAgICAgICAgICA/wABAP8AAAMAAP+AAoACgAADAA8AEwAAETMRIwEzETMVIxEjESM1MwEzESOAgAEAgICAgICAAQCAgAKA/oABgP6AgP8AAQCAAYD+gAAAAAcAAAAAA4ACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxEjATMRIykBFSElIRUhgICAAgCAgP2AgIADAICA/oCAgP8AAQD/AAGAAQD/AAKAgICA/oABgP6AAQD/AICAgAAABAAAAAACgAOAAAMABwALABMAABMhFSEjMxEjATMVIwEhESE1ITUhgAGA/oCAgIACAICA/oACAP2AAgD+gAOAgP6AAYCA/wD+gICAAAQAAAAAA4ADgAALAA8AEwAXAAARIRUhETMVIxEjESEFIRUpATMRKwEzFSMCgP8AgICA/wACAAEA/wABAICAgICAA4CA/wCA/oADAICA/oCAAAAAAAUAAAAAAoADgAADAAsADwATABcAABMhFSEjMxEhFSERIwEzFSMRMxUjKQEVIYABgP6AgIABAP8AgAIAgICAgP6AAYD+gAOAgP8AgP8AAoCA/oCAgAAAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAABMhFSEjMxUjMyEVKQEzESMlMxUjMyEVIYACAP4AgICAgAGA/oABgICA/gCAgIABgP6AA4CAgID+gICAgAABAAAAAAGAA4AACwAAESEVIxEzFSE1MxEjAYCAgP6AgIADgID9gICAAoAAAAMAAAAAAoADgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAOA/QCAgIAAAAADAAAAAAOAA4AADQARABUAABMhESEVIREhFSERIxEjATMRIyEzFSOAAYABAP8AAQD+gICAAoCAgP0AgIADgP8AgP6AgAMA/YABgP6AgAAAAAIAAAAAAwADgAARABUAABEzETMRMxEhFSERIRUhESMRIwEzESOAgIABAP8AAQD+gICAAoCAgAOA/wABAP8AgP6AgAIA/gACAP6AAAADAAAAAAMAA4AADwATABcAABMzFSEVIREzFSMRIxEjNTMBIRUpATMRI4CAAYD+gICAgICAAQABAP8AAQCAgAOAgID/AID/AAKAgP8AgP6AAAIAAAAAAoADgAADAA8AABMhFSEjMxUhNTMRIxEhESOAAYD+gICAAYCAgP6AgAOAgICA/QACAP4AAAAAAAIAAAAAAoADgAALAA8AABEhFSEVIRUhESEVIQEzESMCgP4AAYD+gAGA/gACAICAA4CAgID+gIACAP6AAAMAAAAAAoADgAALAA8AEwAAESEVIRUhFSERIRUhATMVIxUzESMCAP6AAYD+gAGA/gACAICAgIADgICAgP6AgAMAgID+gAAAAAEAAAAAAoADgAAFAAARIRUhESMCgP4AgAOAgP0AAAAAAQAA/4ADAAOAABMAAAEhETMRIzUhFSMRMxEzESERIxEjAQABgICA/gCAgIABAICAA4D9AP8AgIABAAGA/oACgP8AAAABAAAAAAKAA4AACwAAESEVIRUhFSERIRUhAoD+AAEA/wACAP2AA4CAgID+gIAAAAAJAAAAAAOAA4AAAwAPABMAFwAbAB8AIwAnACsAABEzFSMlMxEzFSMRIxEjNTMBMxUjITMVIyUzFSMFMxUjJTMVIyEzESMBMxEjgIABgICAgICAgAGAgID9gICAAgCAgP4AgIACAICA/YCAgAMAgIADgICA/wCA/gACAIABAICAgICAgICA/oABgP6AAAcAAAAAAoADgAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSMpARUpATMRIyUzFSMzIRUhgAGA/oCAgIACAICA/wABAP8AAQCAgP4AgICAAYD+gAOAgICAgID+gICAgAAAAAADAAAAAAKAA4AABwAPABMAABEzETMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIADgP6AgP6AA4D8gAKAgICAAAUAAAAAAoADgAAHAAsADwATABcAABEzESEVIREjATMVKwEzFSMVMxUjOwERI4ABAP8AgAIAgICAgICAgICAgAOA/wCA/gADgICAgID+gAAAAgAAAAACgAOAAAcACwAAEyERIxEhESsBMxUjgAIAgP8AgICAgAOA/IADAP2AgAAAAwAAAAACgAOAAAcADwATAAARMxUzFSMRIwEzESMRIzUzBTMVI4CAgIACAICAgID/AICAA4CAgP2AA4D8gAKAgICAAAABAAAAAAKAA4AACwAAETMRIREzESMRIREjgAGAgID+gIADgP8AAQD8gAIA/gAAAAAEAAAAAAKAA4AAAwAHAAsADwAAEyEVISMzESMBMxEjKQEVIYABgP6AgICAAgCAgP6AAYD+gAOAgP2AAoD9gIAAAQAAAAACgAOAAAcAABEhESMRIREjAoCA/oCAA4D8gAMA/QAAAgAAAAACgAOAAAkADQAAESEVIRUhFSERIwEzFSMCAP6AAYD+gIACAICAA4CAgID+AAMAgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAATIRUhIzMRIwEzFSMRMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AA4CA/YACgID+gICAAAAAAQAAAAACgAOAAAcAABEhFSERIxEhAoD/AID/AAOAgP0AAwAAAwAAAAACgAOAAAMACwAPAAARMxEjATMRIxEhNSEBIRUhgIACAICA/oABgP4AAgD+AAOA/oABgP0AAQCA/oCAAAMAAP+AA4ADgAATABcAGwAAATMVIRUhESEVIRUjNSE1IREhNSEFMxEjATMRIwGAgAEA/wABAP8AgP8AAQD/AAEA/oCAgAMAgIADgICA/gCAgICAAgCAgP4AAgD+AAAAAAkAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAAETMVIyUzFSMhMxUjJTMVKwEzFSsBMxUjJTMVIyEzESMBMxEjgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgID+gAGA/oAAAQAA/4ADAAOAAAsAABEzESERMxEzESM1IYABgICAgP2AA4D9AAMA/QD/AIAAAAAAAgAAAAACgAOAAAMACwAAETMRIwEzESMRITUhgIACAICA/oABgAOA/oABgPyAAYCAAAAAAAEAAAAAA4ADgAALAAARMxEhETMRIREzESGAAQCAAQCA/IADgP0AAwD9AAMA/IAAAAEAAP+ABAADgAAPAAARMxEhETMRIREzETMRIzUhgAEAgAEAgICA/IADgP0AAwD9AAMA/QD/AIAAAgAAAAADAAOAAAsADwAAESERIRUhESEVIREjATMRIwEAAYD+gAGA/gCAAoCAgAOA/oCA/wCAAwD+gP8AAAAAAAMAAAAAA4ADgAAJAA0AEQAAETMRIRUhESEVIQEzESMBMxEjgAGA/oABgP4AAwCAgP8AgIADgP6AgP8AgAOA/IABgP8AAAAAAAIAAAAAAoADgAAJAA0AABEzESEVIREhFSEBMxEjgAGA/oABgP4AAgCAgAOA/oCA/wCAAYD/AAAABQAAAAACgAOAAAMABwAPABMAFwAAEyEVISMzFSMlMxEjESE1IQEzFSMzIRUhgAGA/oCAgIACAICA/wABAP4AgICAAYD+gAOAgICA/YABAID/AICAAAAAAAQAAAAAA4ADgAALAA8AEwAXAAARMxEzETMRIxEjESMBIRUpATMRIykBFSGAgICAgIABgAGA/oABgICA/oABgP6AA4D+gAEA/YABAP6AA4CA/YCAAAMAAAAAAoADgAAJAA0AEQAAEyERIxEhNSE1ISMzFSMVMxEjgAIAgP6AAYD+gICAgICAA4D8gAIAgICAgP4AAAADAAAAAAKAAoAAAwANABEAABMhFSkBMxEhNSE1ITUhBTMVI4ABgP6AAYCA/gABgP6AAYD+AICAAoCA/gCAgICAgAAAAAQAAAAAAoADgAADAAsADwATAAATIRUhIzMVIRUhESMBMxEjKQEVIYACAP4AgIABgP6AgAIAgID+gAGA/oADgICAgP6AAYD+gIAAAAADAAAAAAKAAoAACwAPABMAABEhFSEVIRUhFSEVIQEzFSMVMxUjAgD+gAGA/oABgP4AAgCAgICAAoCAgICAgAIAgICAAAEAAAAAAgACgAAFAAARIRUhESMCAP6AgAKAgP4AAAAAAQAA/4ADAAKAABMAAAEhETMRIzUhFSMRMxEzESERIxUjAQABgICA/gCAgIABAICAAoD+AP8AgIABAAEA/wABgIAAAAADAAAAAAKAAoAAAwANABEAABMhFSEjMxUhNTMRIRUjMyEVIYABgP6AgIABgID+AICAAgD+AAKAgICA/wCAgAAABQAAAAACgAKAAAMADwATABcAGwAAETMRIwEzETMVIxEjESM1MwEzESMFMxEjATMRI4CAAQCAgICAgIABAICA/gCAgAIAgIACgP8AAQD/AID/AAEAgAEA/wCA/wABAP8AAAAAAAcAAAAAAoACgAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSMpARUpATMVIyUzFSMpARUhgAGA/oCAgIACAICA/wABAP8A/wCAgAIAgID+gAGA/oACgICAgICAgICAgAAAAAADAAAAAAKAAoAABwAPABMAABEzETMVIxUjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgP6AgIACgP2AAYCAgIAAAAUAAAAAAgACgAAHAAsADwATABcAABEzETMVIxEjATMVKwEzFSMVMxUjOwEVI4CAgIABgICAgICAgICAgIACgP8AgP8AAoCAgICAgAACAAAAAAKAAoAABwALAAATIREjESERKwEzFSOAAgCA/wCAgICAAoD9gAIA/oCAAAADAAAAAAKAAoAABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgICA/oACgP2AAYCAgIAAAAEAAAAAAoACgAALAAARMxEhETMRIxEhESOAAYCAgP6AgAKA/wABAP2AAQD/AAAAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAABAAAAAAKAAoAABwAAESERIxEhESMCgID+gIACgP2AAgD+AAADAAD/gAKAAoAACwAPABMAABEzFTMVIxUhFSERIwEhFSkBMxEjgICAAYD+gIABAAEA/wABAICAAoCAgICA/wADAID/AAAAAAAFAAAAAAKAAoAAAwAHAAsADwATAAATIRUhIzMRIwEzFSMVMxUjKQEVIYABgP6AgICAAgCAgICA/oABgP6AAoCA/oABgICAgIAAAAAAAQAAAAACgAKAAAcAABEhFSERIxEhAoD/AID/AAKAgP4AAgAAAwAA/4ACgAKAAAMACwAPAAARMxEjATMRIzUhNSEBIRUhgIACAICA/oABgP4AAgD+AAKA/oABgP2AgID/AIAAAAMAAP+AAoACgAAPABMAFwAAEyEVIxEzFSMVIzUjNTMRKwEzESMBMxEjgAGAgICAgICAgICAgAIAgIACgID+gICAgIABgP6AAYD+gAAJAAAAAAKAAoAAAwAHAAsADwATABcAGwAfACMAABEzFSMlMxUjITMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVI4CAAgCAgP6AgIABAICAgICAgICAAQCAgP6AgIACAICAAoCAgICAgICAgICAgICAAAAAAAEAAP+AAoACgAALAAARMxEhETMRMxEjNSGAAQCAgID+AAKA/gACAP4A/wCAAAAAAAIAAAAAAoACgAADAAsAABEzESMBMxEjESE1IYCAAgCAgP6AAYACgP8AAQD9gAEAgAAAAAABAAAAAAKAAoAACwAAETMRMxEzETMRMxEhgICAgID9gAKA/gACAP4AAgD9gAAAAAABAAD/gAMAAoAADwAAETMRMxEzETMRMxEzESM1IYCAgICAgID9gAKA/gACAP4AAgD+AP8AgAAAAAIAAAAAAwACgAALAA8AABEhESEVIRUhFSERIwEzFSMBAAGA/oABgP4AgAKAgIACgP8AgICAAgD/AIAAAAMAAAAAAwACgAAJAA0AEQAAETMRIRUhFSEVIQEzESMBMxUjgAEA/wABAP6AAoCAgP8AgIACgP8AgICAAoD9gAEAgAAAAgAAAAACgAKAAAkADQAAETMRIRUhFSEVIQEzFSOAAYD+gAGA/gACAICAAoD/AICAgAEAgAAAAAAFAAAAAAKAAoAAAwAHAA8AEwAXAAATIRUhIzMVIyUzESM1ITUhBTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/gCAgIABgP6AAoCAgID+gICAgICAAAAEAAAAAAOAAoAACwAPABMAFwAAETMRMzUzESM1IxEjASEVKQEzESMpARUhgICAgICAAYABgP6AAYCAgP6AAYD+gAKA/wCA/oCA/wACgID+gIAAAAADAAAAAAKAAoAACQANABEAABMhESMRITUhNSEjMxUjFTMRI4ACAID+gAGA/oCAgICAgAKA/YABAICAgID/AAAABQAAAAACgAKAAAMACwAPABMAFwAAEyEVISMzFSEVIRUjATMVIxUzFSMpARUhgAGA/oCAgAEA/wCAAgCAgICA/oABgP6AAoCAgICAAYCAgICAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzFSMzIRUpATMVIykBFSGAAgD+AICAgIABgP6AAYCAgP4AAgD+AAKAgICAgIAAAgAAAAAAgAOAAAMABwAAETMVIxUzESOAgICAA4CAgP2AAAAABAAA/4ACgAOAAAMABwALAA8AAAEzFSMVMxEjATMRIzMhFSECAICAgID+AICAgAGA/oADgICA/YABAP8AgAAAAAMAAAAAA4ACgAANABEAFQAAEyERIRUhFSEVIREjESMlMxUjITMVI4ABgAEA/wABAP6AgIACgICA/QCAgAKA/wCAgIACAP6AgICAAAACAAAAAAMAAoAAEQAVAAARMxEzETMRIRUhFSEVIREjESMBMxUjgICAAQD/AAEA/oCAgAKAgIACgP8AAQD/AICAgAEA/wABAIAAAAAAAgAAAAADAAOAABEAFQAAEzMVMxUjFSEVIREhFSERIzUzATMRI4CAgIABgP6AAYD+AICAAgCAgAOAgICAgP8AgAKAgP6A/wAAAgAAAAADAAMAABEAFQAAEzMVMxUjFSEVIRUhFSERIzUzATMVI4CAgIABgP6AAYD+AICAAgCAgAMAgICAgICAAgCA/oCAAAAAAwAAAAACgAOAAAMADwATAAATIRUhIzMRIREzESMRIREjMyEVIYABgP6AgIABgICA/oCAgAGA/oADgID/AAEA/YABAP8AgAAAAwAAAAACgAKAAAMADwATAAATIRUhIzMVITUzESM1IRUjMyEVIYABgP6AgIABgICA/oCAgAGA/oACgICAgP6AgICAAAAGAAAAAAMAA4AAAwAHAAsADwATABcAABEzESMBMxUrATMRIyEzESMBMxErATMVI4CAAoCAgICAgP6AgIABAICAgICAA4D+AAIAgP6A/wABAP8AgAAGAAAAAAMAAoAAAwAHAAsADwATABcAABEzESMBMxUrATMRIyEzFSMlMxUrATMVI4CAAoCAgICAgP6AgIABAICAgICAAoD+gAGAgP8AgICAgAAAAAABAAAAAAMAA4AADQAAEyEVIRUzFSMRIxEjNTOAAoD+AICAgICAA4CAgID+AAIAgAABAAAAAAKAAoAADQAAEyEVIRUzFSMRIxEjNTOAAgD+gICAgICAAoCAgID/AAEAgAAJAAD/gAQAA4AAAwAPABMAFwAbAB8AIwAnAC8AABEzFSMlMxEzFSMRIxEjNTMBMxUjITMVIyUzFSMFMxUjJTMVIyEzESMBMxEzESM1I4CAAYCAgICAgIABgICA/YCAgAIAgID+AICAAgCAgP2AgIADAICAgIADgICA/wCA/gACAIABAICAgICAgICA/oABgP8A/wCAAAAAAAUAAP+AAwACgAADAA8AEwAXAB8AABEzESMBMxEzFSMRIxEjNTMBMxEjBTMRIwEzFTMRIzUjgIABAICAgICAgAEAgID+AICAAgCAgICAAoD/AAEA/wCA/wABAIABAP8AgP8AAQCA/wCAAAAAAAUAAP+AAwADgAAHAAsADwATABsAABEzESEVIREjATMVKwEzFSMVMxUjOwERMxEjNSOAAQD/AIACAICAgICAgICAgICAgAOA/wCA/gADgICAgID/AP8AgAAFAAD/gAKAAoAABwALAA8AEwAZAAARMxEzFSMRIwEzFSsBMxUjFTMVIzMhESM1I4CAgIABgICAgICAgICAAQCAgAKA/wCA/wACgICAgID/AIAAAAABAAD/gAMAA4AADwAAETMRIREzETMRIzUjESERI4ABgICAgID+gIADgP8AAQD9AP8AgAIA/gAAAAEAAP+AAwACgAAPAAARMxEhETMRMxEjNSMRIREjgAGAgICAgP6AgAKA/wABAP4A/wCAAQD/AAAABQAAAAACgAOAAAMABwALAA8AEwAAETMVIyUzFSMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAOAgICAgICA/YAAAAAABQAA/4ACgAKAAAMABwALAA8AEwAAETMRIwEzESMhMxUjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAKA/wABAP8AgICA/oAABQAAAAACgAOAAAMABwALAA8AGwAAETMVIyUzFSMhMxUjJTMVKwEzFTMVIxEjESM1M4CAAgCAgP6AgIABAICAgICAgICAgAOAgICAgICAgID+gAGAgAAAAAUAAP+AAoACgAADAAcACwAPABsAABEzESMBMxEjITMVIyUzFSsBMxUzFSMVIzUjNTOAgAIAgID+gICAAQCAgICAgICAgIACgP8AAQD/AICAgICAgICAAAACAAAAAAKAA4AABwALAAARMxEhFSERIwEzESOAAYD+gIACAICAA4D/AID+AAIA/gAAAAAAAwAAAAACgAOAAAcACwAPAAARMxEzFSMRIwEhFSkBMxEjgICAgAEAAQD/AAEAgIADgP6AgP6AAoCA/gAAAQAAAAABgAOAAAsAABEhFSMRMxUhNTMRIwGAgID+gICAA4CA/YCAgAKAAAAEAAAAAAKAA4AAAwAHABEAFQAAEyEVISMzFSMlMxEjESERIxEhASEVIYABgP6AgICAAgCAgP6AgAIA/oABgP6AA4CAgID9gAEA/wABgP6AgAAAAAADAAAAAAKAAoAAAwANABEAABEhFSkBMxEjNSEVIxEhASEVIQIA/gACAICA/oCAAgD+gAGA/oACgID+gICAAQD/AIAAAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESERMxEjESERIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AA4CA/wABAP2AAQD/AIAAAAMAAAAAAoACgAADAA8AEwAAEyEVISMzFSE1MxEjNSEVIzMhFSGAAYD+gICAAYCAgP6AgIABgP6AAoCAgID+gICAgAAAAgAAAAACgAOAAAkADQAAATMRITUhNSE1IQUzFSMCAID+AAGA/oABgP4AgIADgPyAgICAgIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAARMxEjATMRKwEzFSMpARUhJTMVI4CAAgCAgICAgP8AAQD/AAGAgIADgP0AAwD9gICAgIAAAAAAAwAAAAACgAOAAAMACwAPAAATIRUhIzMRIRUhESMBMxEjgAGA/oCAgAIA/gCAAgCAgAOAgP6AgP8AAwD/AAAAAAMAAAAAAwADgAADAAcAEwAAEyEVISMzESMBMxEzFSMRIxEhNSGAAYD+gICAgAIAgICAgP6AAYADgID+gAGA/oCA/wABAIAAAAMAAAAAAwADgAADAAcADwAAEyEVISMzESMBMxEzFSMRI4ABgP6AgICAAgCAgICAA4CA/oABgP6AgP8AAAMAAAAAAoADgAAHAAsADwAAETMRIRUhESMlMxUjKQEVIYACAP4AgAIAgID+gAGA/oADgP8AgP6AgICAAAQAAAAAAoADgAADAAcACwAVAAATIRUhIzMVIyUzESMhMxUhNTMVMxUhgAGA/oCAgIACAICA/gCAAQCAgP2AA4CAgID+AICAgIAAAAABAAAAAAKAA4AACQAAETMRIRUhESEVIYACAP4AAgD9gAOA/wCA/oCAAAAAAAMAAAAAAoADgAADAAkADQAAEyEVISMzESEVIQEzFSOAAYD+gICAAgD9gAIAgIADgID9gIADAIAABQAAAAADAAOAAAMABwAPABMAFwAAEyEVISMzESMBMxEjESE1IQUzESMzIRUhgAIA/gCAgIACgICA/wABAP6AgICAAQD/AAOAgP0AAwD9gAEAgID/AIAAAAMAAAAAAwADgAALAA8AEwAAATMRMxUjESMRITUhBTMRIzMhFSECAICAgID+gAGA/gCAgIABgP6AA4D/AID+gAGAgID+gIAAAAIAAAAAAoADgAAHAAsAABEzESEVIREjATMRI4ABgP6AgAIAgIADgP8AgP4AAgD+gAAAAAABAAAAAAIAA4AABQAAETMRIRUhgAGA/gADgP0AgAAAAAMAAAAAAwADgAAJAA0AEQAAETMRIREjESMRIwEzESMpARUhgAEAgICAAoCAgP8AAQD/AAOA/wD+AAGA/gACgP4AgAAABwAAAAACgAOAAAMABwANABEAFQAZAB0AABEzFSMlIRUpAhUjFSMlMxUjITMRIwEzESMpARUhgIABgAEA/wD/AAEAgIABAICA/oCAgAIAgID+gAGA/oADgICAgICAgID+gAGA/oCAAAACAAAAAAKAA4AAAwALAAARMxEjATMRIxEhNSGAgAIAgID+gAGAA4D+gAEA/QABgIAAAAAABAAAAAACgAOAAAMABwALAA8AABEhFSkBMxUjKQEVKQEzESMCAP4AAgCAgP4AAgD+AAIAgIADgICAgP4AAAAAAAcAAAAAAoADgAADAAcACwAPABMAFwAfAAATIRUhIzMRIwEzESMhMxUjJTMVIyEzFSMlMxUhFSE1M4ABgP6AgICAAgCAgP6AgIABAICA/oCAgAEAgAEA/gCAA4CA/wABAP6AgICAgICAgIAAAAMAAAAAAwADgAADAAcADQAAEyEVISMzESMBMxEzFSGAAYD+gICAgAIAgID/AAOAgP8AAQD9gIAAAgAAAAACgAOAAAMADwAAEyEVISMzFSEVIREhETMRIYABgP6AgIABgP6AAYCA/YADgICAgP6AAYD+AAAAAwAAAAADAAOAAAMACQANAAARMxEjASEVIxEjKQEVIYCAAgABAICA/oABgP6AA4D9AAMAgP2AgAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAEyEVISMzFSMlMxEjKQEVKQEzESMlMxUjMyEVIYABgP6AgICAAgCAgP4AAgD+AAIAgID+AICAgAGA/oADgICAgP8AgP8AgICAAAAAAwAAAAACgAOAAAUACQANAAARIREjESMBMxUjKQEVIQEAgIACAICA/wABAP8AA4D9AAKA/gCAgAAFAAAAAAKAA4AABwALAA8AEwAXAAARIRUhFSM1IRczFSsBMxEjJTMVIykBFSECgP8AgP8AgICAgICAAgCAgP6AAYD+gAOAgICAgID+gICAgAAAAAADAAAAAAKAA4AAAwAHAAsAABMhFSEjMxEjATMRI4ABgP6AgICAAgCAgAOAgP0AAwD9AAAABgAAAAACgAOAAAMABwALAA8AFQAZAAATIRUhIzMVIyUzESsBMxUrATMRITUhFyEVIYABgP6AgICAAgCAgICAgICA/oABAIABAP8AA4CAgID/AID/AICAgAAAAAADAAAAAAKAA4AABwALAA8AABMhFSMRIxErATMRIwEzESOAAYCAgICAgIACAICAA4CA/oABgP8AAQD9AAAFAAAAAAKAA4AAAwAJAA0AEQAZAAATIRUhIzMVMxUhATMRIwEzESM7ARUzFSE1IYABgP6AgICA/wACAICA/wCAgICAgP2AAYADgICAgAEA/gABAP8AgICAAAAAAAMAAAAAAwADgAADAAcADwAAEyEVISMzESMBMxEzFSMVI4ABgP6AgICAAgCAgICAA4CA/QADAP4AgIAAAAMAAAAAAoADgAADAAcACwAAETMRIwEzESMpARUhgIACAICA/oABgP6AA4D9AAMA/QCAAAACAAAAAAKAA4AABwALAAABMxEjESE1IQEzESMCAICA/oABgP4AgIADgPyAAQCAAQD/AAAABwAAAAACgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMVIwUhFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID+gAGA/oABgICA/gCAgIABgP6AA4CA/wABAICAgP8AgICAAAMAAAAAAoADgAADAAcACwAAEyEVISMzESMBMxUjgAGA/oCAgIACAICAA4CA/QADAIAAAAAHAAAAAAKAA4AAAwAHAAsADwATABcAGwAAEyEVISMzESMBMxEjKQEVISMzFSMlMxEjKQEVIYABgP6AgICAAgCAgP6AAYD+gICAgAIAgID+gAGA/oADgID/AAEA/wCAgID/AIAAAQAAAAACAAOAAAcAABEzESEVIREjgAGA/oCAA4D/AID+AAAAAwAAAAACgAOAABMAFwAbAAABMxUzFSMRMxUjFSM1IzUzESM1MwUzESMBMxEjAQCAgICAgICAgICA/wCAgAIAgIADgICA/oCAgICAAYCAgP6AAYD+gAAAAAMAAAAAAoADgAADAA8AEwAAEyEVISMzESEVIRUhFSEVIwEzESOAAYD+gICAAYD+gAIA/gCAAgCAgAOAgP8AgICAgAMA/wAAAAQAAAAAAoADgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AA4CA/YACgP2AgAAEAAAAAAKAA4AAEQAVABkAHQAAEyERMxUjETMVITUzESM1MzUrATMVIwUzESMlMxUjgAEAgICA/oCAgICAgICAAgCAgP4AgIADgP8AgP6AgIABgICAgID+gICAAAIAAAIAAQADgAADAAcAABEzESM7ARUjgICAgIADgP8AgAAAAAIAAAIAAQADgAADAAcAABMzESsBMxUjgICAgICAA4D/AIAAAAIAAAKAAQADgAADAAcAABMzFSsBMxUjgICAgICAA4CAgAAAAAEAAAIAAYADgAAHAAABMxEhFSMRIQEAgP8AgAEAA4D/AIABAAAAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAADAAACAAGAA4AAAwAHAAsAABMzFSsBMxEjATMVI4CAgICAgAEAgIADgID/AAEAgAABAAACgAKAA4AABQAAETMVIRUhgAIA/YADgICAAAAAAAQAAAAAAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID+AAKAgP8AAQD+AAAABAAAAAACgAKAAAMACQANABEAABEzESMBMxEhNTMBMxErATMVI4CAAgCA/wCA/wCAgICAgAKA/gACAP2AgAEA/wCAAAADAAD/gAKAAoAACwAPABMAABEzFTMVIxUhFSERIwEhFSkBMxUjgICAAgD+AIABAAEA/wABAICAAoCAgICA/wADAICAAAMAAP+AAwACgAADABMAFwAAEyEVISUzETMVIxEjESE1ITUjNTMhMxEjgAEA/wABgICAgID+gAGAgID+AICAAoCAgP6AgP8AAQCAgID/AAAAAgAA/4ADAAKAAAUADQAAESEVIREjATMRMxUjFSMCAP6AgAIAgICAgAKAgP4AAgD+gICAAAMAAAAAAoADgAAHAA8AEwAAETMRIRUhESMBMxEjNSM1MwUhFSGAAQD/AIACAICAgID+gAEA/wADgP8AgP6AAQD+gICAgIAAAAMAAP+AAwACgAADABEAFQAAEyEVISUzETMVIREhNSE1IzUzITMRI4ABAP8AAYCAgP8A/oABgICA/gCAgAKAgID9gIABAICAgP8AAAABAAD/gAIAA4AACwAAETMRIRUhESERIzUhgAGA/oABgID+gAOA/wCA/oD/AIAAAAADAAD/gAKAAoAACQANABEAABEzFTMVIxEhFSEBIRUpATMRI4CAgAIA/YABAAEA/wABAICAAoCAgP6AgAMAgP6AAAAAAAUAAP+AAoACgAAHAAsAEwAXABsAABEzFTMVIxEjASEVKQEzESM1IzUzBTMVIzsBFSOAgICAAQABAP8AAQCAgICA/wCAgICAgAKAgID+AAMAgP6AgICAgIAAAAAAAgAAAAADAAOAAA0AEQAAATMRMxUjESE1IREhNSEFMxEjAgCAgID+AAGA/oABgP4AgIADgP8AgP4AgAGAgID+gAAAAAADAAD/gAKAA4AABwALAA8AABEzETMVIxEjASEVKQEzESOAgICAAQABAP8AAQCAgAOA/oCA/gADAID+AAABAAD/gAEAAoAABQAAETMRMxUhgID/AAKA/YCAAAAAAAQAAP+AAwADgAAHAAsAEQAVAAARMxEzFSMRIwEzFSMlMxEhNTMBMxEjgICAgAEAgIABgID/AID/AICAA4D+gID+AAMAgID9gIABgP6AAAAACAAAAAACgAOAAAMABwALAA8AEwAXABsAHwAAEzMVKwEzFSMlIRUpAhUhIzMRIwEzFSM7AREjKQEVIYCAgICAgAGAAQD/AP8AAQD/AICAgAGAgICAgID+gAGA/oADgICAgICA/oABgID/AIAAAwAA/4ACgAOAAAMACwAPAAARMxEjATMRIxEjNTMFIRUhgIACAICAgID+gAEA/wADgP2AAgD8gAGAgICAAAAAAAMAAAAAAoADgAAHAAsADwAAETMRMxUjESMBIRUpATMRI4CAgIABAAEA/wABAICAA4D+gID+gAKAgP4AAAYAAAAAAoADgAADAAkADQARABkAHQAAETMVIzMhESM1IRUhFSEjMxEjATMRIzUjNTMFIRUhgICAAgCA/oABgP6AgICAAgCAgICA/oABAP8AA4CA/wCAgID/AAEA/oCAgICAAAACAAD/gAMAAoAABQALAAARIRUhESMBMxEzFSECAP6AgAIAgID/AAKAgP4AAgD+AIAAAAAABAAAAAACgAOAAAMACwATABcAABMhFSEjMxUhFSERIwEzESM1IzUzBSEVIYACAP4AgIABgP6AgAIAgICAgP6AAQD/AAOAgICA/oABgP4AgICAgAAAAgAAAAADAAOAAAcACwAAASEVIxEhNSEBMxEjAgABAID+AAGA/gCAgAOAgP0AgAIA/gAAAAMAAP+AAoACgAADAAcACwAAATMRIyUzFSMzIRUhAgCAgP4AgICAAYD+gAKA/YCAgIAAAAACAAAAAAMAA4AABQALAAARIREjESMFMxEhNSEBAICAAoCA/gABgAOA/QACgID9gIAAAAAABQAA/4ACgAKAAAMABwALAA8AFQAAEyEVISMzFSMlMxEjKQEVISMzFSEVIYABgP6AgICAAgCAgP6AAYD+gICAAgD9gAKAgICA/wCAgIAAAAADAAAAAAKAAoAABwALAA8AABEzFTMVIxEjASEVKQEzESOAgICAAQABAP8AAQCAgAKAgID+gAKAgP4AAAAEAAD/gAKAAoAAAwAJAA0AEwAAETMVIzMhESM1IRUhFSEjMxUhFSGAgIACAID+gAGA/oCAgAIA/YACgID/AICAgICAAAQAAP+AAoACgAADAAsADwATAAARMxEjATMRIzUjNTMBMxErATMVI4CAAgCAgICA/wCAgICAgAKA/gACAP0AgIABAP8AgAAAAAUAAP+AAoACgAADAAcACwAPABUAABMhFSEjMxEjATMRIykBFSEjMxUhFSGAAYD+gICAgAIAgID+gAGA/oCAgAIA/YACgID/AAEA/wCAgIAAAwAAAAACgAKAAAUACQAPAAARIRUhESMBMxErATMVMxUhAgD+gIACAICAgICA/wACgID+AAIA/wCAgAAAAgAAAAACgAKAAAMACQAAETMRIwEzESE1IYCAAgCA/gABgAKA/gACAP2AgAACAAD/gAMAA4AACQANAAABMxEzFSE1ITUhATMRIwIAgID/AP6AAYD+AICAA4D8gICAgAIA/gAAAAMAAAAAA4ACgAADAAsADwAAETMRIwEhFSERITUhATMRI4CAAYABgP8A/oABAAGAgIACgP4AAgCA/gCAAYD+AAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/YACgP4AAAMAAP+AAoACgAAJAA0AEQAAEyERIzUhNSERISMzESMRIRUhgAIAgP6AAYD+gICAgAIA/gACgP2AgIABAP8A/wCAAAAAAQAAAAACAAKAAAUAABEzESEVIYABgP4AAoD+AIAAAAADAAD/gAOAA4AACwAPABMAAAEzESEVIREjNSE1IQEzESMBMxEjAYCAAQD/AID/AAEA/oCAgAMAgIADgP8AgP2AgIACAP4AAYD+AAAAAwAA/4ADAAKAABEAFQAZAAATMxUzFSEVIRUhFSEVIzUjNTMBIRUpATMVI4CAgAEA/oACAP4AgICAAQABAP8AAQCAgAKAgICAgICAgIACAICAAAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAQAAP+AAoADgAAVABkAHQAhAAATIREzFSMRMxUjFSM1IzUzESM1MzUrATMVIwUzESMlMxUjgAEAgICAgICAgICAgICAgAIAgID+AICAA4D/AID+gICAgIABgICAgID+gICAAAADAAAAAAMAA4AAAwANABEAABEzESMBMxEhFSE1IzUzBTMVI4CAAYCAAQD+gICA/wCAgAOA/QABgP6AgICAgIAAAwAA/4ADAAKAAAsADwATAAABMxEzFSMRIxEhNSEBMxUjMyEVIQIAgICAgP8AAQD+AICAgAGA/oACgP8AgP8AAQCA/wCAgAAAAgAAAYACgAKAAAMABwAAETMVIzMhFSGAgIACAP4AAoCAgAAAAwAAAAACgAOAAAMABwAbAAATIRUhIzMVIyUzETMVIxUzFSMVIzUhNSE1ITUhgAEA/wCAgIABgICAgICAgP8AAQD/AAEAA4CAgID/AICAgICAgICAAAAAAAEAAAIAAoACgAADAAARIRUhAoD9gAKAgAAAAAACAAAAAACAAoAAAwAHAAARMxUjETMVI4CAgIACgID+gIAAAAACAAAAAAGAAoAAAwAJAAATIRUhIzMRIRUhgAEA/wCAgAEA/oACgID+gIAAAAUAAAAAAoACgAADAAcADwATABcAABEzFSMlMxEjJTMVIREjNSEjMxEjJTMVI4CAAgCAgP6AgAEAgP8AgICAAgCAgAKAgID/AICA/wCA/wCAgAAAAAIAAAAAAoACgAADAAsAABEhFSkBMxEzFSE1IQGA/oABgICA/YABgAKAgP6AgIAAAAUAAAAAAgACgAADAAcACwAPABMAABEhFSkBMxErATMVIyUzESMlMxUjAQD/AAEAgICAgIABAICA/oCAgAKAgP8AgID/AICAAAEAAAAAAoACgAAHAAARIRUjESMRIQKAgID+gAKAgP4AAgAAAAIAAAAAAoACgAAFAAkAABEhESMRIRUzESMCgID+AICAAoD9gAIAgP6AAAAAAQAAAAAAgAKAAAMAABEzESOAgAKA/YAAAQAAAAABgAKAAAcAABEhFSMRIxEjAYCAgIACgID+AAIAAAAAAgAAAAACgAKAAAUACQAAESEVIREjATMRIwIA/oCAAgCAgAKAgP4AAgD+AAAEAAAAAAKAAoAAAwAHAAsADwAAETMRIwEhFSkBMxEjKQEVIYCAAQABAP8AAQCAgP6AAYD+gAKA/gACAID+gIAAAQAAAYAAgAKAAAMAABEzESOAgAKA/wAAAQAA/4ACgAKAAAUAABEhESMRIQKAgP4AAoD9AAKAAAADAAAAAAKAAoAAAwAHAAsAABEhFSkBMxEjKQEVIQIA/gACAICA/gACAP4AAoCA/oCAAAAAAwAAAAACgAMAAAcACwAPAAARMxUhESMRIQEzFSsBMxUjgAIAgP4AAYCAgICAgAMAgP6AAQD/AICAAAAAAQAAAAACgAKAAAkAABEhFSERIREzESECAP6AAYCA/YACgID+gAGA/gAAAAAFAAAAAAKAAoAAAwAHAAsAEQAVAAARMxUjJSEVISMzFSMlMxEhNTMBMxEjgIABAAEA/wCAgIABgID/AID+AICAAoCAgICAgP4AgAEA/oAAAAEAAP+AAIACgAADAAARMxEjgIACgP0AAAIAAAAAAYACgAADAAkAABEhFSkBMxEhNSEBAP8AAQCA/oABAAKAgP4AgAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAUAAP+AAoACgAADAAcACwAPABMAABMzESMBMxEjJTMVIzsBFSMpARUhgICAAYCAgP8AgICAgID+gAGA/oACgP6AAYD+AICAgIAAAAACAAD/gAKAAoAABwALAAARIRUhFTMVIQEzESMCAP6AgP8AAgCAgAKAgICAAQD9gAADAAAAAAKAAoAABwALAA8AABEhFSEVIRUhATMRIykBFSECAP6AAQD+gAIAgID+AAIA/gACgICAgAEA/oCAAAAABQAA/4ACgAKAAAMABwALAA8AEwAAETMVIyUzESMlMxEjJTMVKwEzESOAgAIAgID+gICAAQCAgICAgAKAgID/AID/AICA/oAABQAAAAACgAKAAAMABwALAA8AFQAAETMVIyUzESMlMxUjMyEVKQEzESE1IYCAAgCAgP6AgICAAQD/AAEAgP2AAgACgICA/wCAgID/AIAAAAAEAAD/gAKAAoAABQAJAA0AEQAAESERIzUhFTMRIwEzFSsBMxEjAoCA/gCAgAGAgICAgIACgP8AgID+AAIAgP8AAAAAAAIAAAAAAoACgAADAAcAABEhFSkBMxEjAgD+AAIAgIACgID+AAAAAAADAAAAAAKAAoAABwALABEAABEzETMVIxUjATMRIwEzESE1IYCAgIABAICAAQCA/gABgAKA/wCAgAIA/wABAP2AgAAAAAIAAAAAAoACgAAJAA0AABEhFSERITUzESMhMxEjAgD/AP8AgIACAICAAoCA/gCAAYD+AAACAAAAAAGAAoAAAwAHAAARMxEjATMRI4CAAQCAgAKA/YACgP2AAAAAAgAAAAABgAKAAAMABwAAETMRIwEzESOAgAEAgIACgP8AAQD9gAAAAAIAAAGAAYACgAADAAcAABEzESMBMxEjgIABAICAAoD/AAEA/wAAAAACAAABAAEAAoAAAwAHAAATMxErATMVI4CAgICAgAKA/wCAAAAEAAABAAIAAoAAAwAHAAsADwAAEzMRIwEzESMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAKA/wABAP8AgICAAAAAAwAAAAACgAOAAAsADwATAAARMxEhESM1IREzFSEBMxUrATMVI4ACAID+gID/AAGAgICAgIADgP8A/wCA/oCAAYCAgAAEAAAAAAKAA4AABwALAA8AEwAAESEVIRUjNSMVMxEjJTMVIykBFSECgP6AgICAgAIAgID+gAGA/oADgICAgID+AICAgAAAAAADAAAAAAOAA4AAAwANABEAABMzFSMlMxEhFSERITUhATMRI4CAgAGAgAEA/oD+gAGA/gCAgAOAgID9AIABgIABAP8AAAEAAAAAA4ADgAAJAAARIREhFSERIRUjAoABAP6A/oCAA4D9AIADAIAAAAAABAAAAAACgAOAAAsADwATABcAABEhFSEVMxUhNTM1IREzESMBMxEjKQEVIQKA/wCA/oCA/wCAgAIAgID+gAGA/oADgICAgICA/wD+gAGA/oCAAAAAAQAAAAACgAOAAAcAABEhESMRIRUjAoCA/oCAA4D8gAMAgAAAAQAAAAADgAOAAA0AABEhESERIzUjESMRIRUjAoABAICAgP6AgAOA/wD/AID+AAMAgAAAAAQAAAAAA4ADgAAJAA0AEQAVAAARIREzFSMRIxEhBSEVKQEzESMpARUhAYCAgID/AAIAAQD/AAEAgID+gAGA/oADgP6AgP8AAoCAgP6AgAAAAgAAAAADgAOAAA0AEQAAEyERIREjNSMRITUhESEjMxEjgAIAAQCAgP4AAYD+gICAgAOA/wD/AID+AIACgP2AAAEAAAAAAoADgAAFAAARIREjESECgID+AAOA/IADAAAAAgAAAAACgAOAAAcADwAAETMVIRUhESMBMxEjNSE1IYABgP6AgAIAgID+gAGAA4CAgP6AAYD9gICAAAAABAAAAAADgAOAAAsADwATABcAABEhETMVIxEjESMVIykBFSkBMxEjKQEVIQGAgICAgIACAAEA/wABAICA/oABgP6AA4D+gID/AAKAgID+gIAAAAAAAwAAAAADAAOAAA0AEQAVAAARIREzFSMRIxEhNSE1IREzESMzIRUhAoCAgID+gAGA/gCAgIABgP6AA4D/AID+gAGAgID/AP6AgAAAAAIAAAAAAoADgAAJAA0AABEhFSEVIRUhESMBMxEjAoD+AAGA/oCAAgCAgAOAgICA/gACAP4AAAAABwAAAAADgAOAAAMABwALAA8AEwAXABsAABMhFSEjMxEjATMRKwEzFSMlMxUjKQEVISUhFSGAAYD+gICAgAIAgICAgIABgICA/YABAP8AAYABAP8AA4CA/YACgP4AgICAgICAAAMAAAAAA4ADgAAFAAkADQAAESERIxEhJTMRIykBFSEBgID/AAMAgID+gAGA/oADgP0AAoCA/QCAAAAAAAIAAAAAAwADgAAFAA0AABEhESMRIyUzESMRITUhAQCAgAKAgID+gAGAA4D+gAEAgPyAAYCAAAAAAwAAAAADgAOAAAkADQARAAABMxEhESM1IxEjATMRIzMhFSECAIABAICAgP4AgICAAYD+gAOA/wD/AID+gAEA/wCAAAADAAAAAAKAA4AAAwAHAAsAABEzESMBMxEjKQEVIYCAAgCAgP6AAYD+gAOA/QABAP8AgAAAAgAAAAACgAOAAAsADwAAESEVIRUhFSERIRUhATMVIwIA/oABgP6AAgD9gAIAgIADgICAgP6AgAMAgAAABQAAAAADgAOAAAMABwANABEAFQAAEyEVISMzESMBMxEzFSkCFSElMxUjgAGA/oCAgIACAICA/wD+gAGA/oACgICAA4CA/YACgP4AgICAgAADAAAAAAKAA4AADwATABcAABMhFSMRMxUjESMRIzUzESsBMxEjATMRI4ABgICAgICAgICAgIACAICAA4CA/oCA/wABAIABgP6AAYD+gAAAAAEAAAAAAoADgAAPAAABMxEhESM1IxEjESERMxUzAQCAAQCAgID/AICAA4D/AP8AgP4AAgABAIAAAwAAAAACgAOAAAMABwALAAATIRUhIzMRIwEzESOAAYD+gICAgAIAgIADgID9AAMA/QAAAAIAAAAAAoADgAADAAsAABEzESMBMxEjESE1IYCAAgCAgP6AAYADgP6AAYD8gAGAgAAAAAAEAAAAAAKAA4AAAwALAA8AEwAAETMRIwEzESMRITUhATMVIzMhFSGAgAIAgID+gAGA/gCAgIABgP6AA4D+gAGA/QABAID/AICAAAAAAgAAAAACgAOAAAcACwAAETMRIRUhESMBMxEjgAGA/oCAAgCAgAOA/wCA/gACAP4AAAAAAAQAAP+AAoADgAADAAcACwATAAATIRUhIzMRIwEzFSMRMxEjNSE1IYABgP6AgICAAgCAgICA/oABgAOAgP2AAoCA/oD+gICAAAIAAAAAA4ADgAAPABMAAAEzESERIzUjESE1IREhNSEFMxEjAgCAAQCAgP4AAYD+gAGA/gCAgAOA/wD/AID+AIABgICA/oAAAAIAAAAAAoADgAAPABMAABEhFSEVIRUhFSERIzUjESMBMxUjAgD+gAGA/oABAICAgAIAgIADgICAgID/AID/AAMAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMVIzMhFSkBMxEjJTMVIzMhFSGAAgD+AICAgIABgP6AAYCAgP4AgICAAYD+gAOAgICA/oCAgIAAAgAAAAACgAOAAAkADQAAETMRIRUhESEVIQEzESOAAYD+gAIA/YACAICAA4D+gID/AIADgP6AAAAIAAD/gAKAA4AABwALAA8AEwAXABsAHwAjAAARIREjNSEVIzsBESMBMxErATMVKwEzESMBMxUjOwEVIyEzFSMCgID+gICAgIABAICAgICAgICAAQCAgICAgP4AgIADgP8AgID/AAEA/wCA/wABAICAgAAAAAMAAAAAA4ADgAAHAAsADwAAESERIxEjFSMBMxEjKQEVIQGAgICAAwCAgP6AAYD+gAOA/QACgID/AP8AgAAAAAACAAAAAAKAA4AABwALAAARMxEhFSERIwEzFSOAAYD+gIACAICAA4D/AID+AAIAgAAEAAAAAAKAA4AABQAJAA0AEQAAETMVIRUpATMRIyUzFSMzIRUhgAGA/gACAICA/gCAgIABgP6AA4CAgP4AgICAAAAAAAMAAAAAAoADgAADAAsADwAAEzMVIyUzESMRITUhATMRI4CAgAGAgID+gAGA/gCAgAOAgID8gAGAgAEA/wAAAAADAAAAAAKAA4AAAwAHAA8AABEzESMBMxEjKQEVIxEjESOAgAIAgID+gAGAgICAA4D+gAGA/oCA/oABgAADAAAAAAOAA4AAEwAXABsAAAEhFSEVIRUhFSEVIREhNSE1ITUhATMVIwEzFSMBgAGA/wABAP8AAQD/AP6AAQD/AAEAAYCAgP0AgIADgICAgICA/wCAgIABgID+gIAAAAAGAAAAAAKAA4AAAwAHAAsADwATABcAABEhFSkBMxUjKQEVISMzESMlMxUjKQEVIQIA/gACAICA/oABgP6AgICAAgCAgP6AAYD+gAOAgICA/oCAgIAAAAAABQAAAAACgAOAAAUACQANABEAFwAAESERIzUhBTMVKwEzFSsBMxUrATMVIRUhAoCA/gABgICAgICAgICAgIACAP2AA4D/AICAgICAgIAAAAAEAAAAAAKAAoAABQAJAA0AEQAAATMVMxUpATMRIyUzFSMzIRUhAQCAgP8AAQCAgP4AgICAAYD+gAKAgID/AICAgAAAAAQAAAAAAoADgAAJAA0AEQAVAAARIREzFSE1MxEhETMRIwEzESMpARUhAYCA/oCA/wCAgAIAgID+gAGA/oADgP6AgIABAP6A/wABAP8AgAAABQAA/4ACgAKAAAMACQANABEAFQAAESEVKQEzESE1IQUzESMBMxEjKQEVIQGA/oABgID+gAEA/oCAgAIAgID+gAGA/oACgID/AICA/wABAP8AgAAACAAA/4ACgAKAAAMABwALAA8AEwAXAB8AIwAAEzMVIyUzFSMhMxEjATMVIyUzFSsBMxUjITMVMxUhNTMFMxUjgICAAQCAgP6AgIABAICAAQCAgICAgP8AgID+gIABAICAAoCAgID/AAEAgICAgICAgICAAAAFAAD/gAKAAoAAAwAHAAsADwATAAATIRUhIzMVIyUzESMlMxUjMyEVIYABgP6AgICAAgCAgP4AgICAAYD+gAKAgICA/gCAgIAAAAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSkBMxEjJTMVIzMhFSGAAYD+gICAgAIAgID/AAEA/wABAICA/gCAgIABgP6AAoCAgICAgP8AgICAAAAAAAUAAAAAAoADgAADAAcAEwAXABsAABMzFSsBMxEjATMRMxUjESMRIzUzBTMRKwEzFSOAgICAgIABAICAgICAgAEAgICAgIADgID/AAEA/wCA/wABAICA/wCAAAAABgAAAAACgAKAAAMABwALAA8AEwAXAAATMxUjJTMVIyEzESMBMxEjATMRIyUzFSOAgIABAICA/oCAgAEAgIABAICA/oCAgAKAgICA/oABgP6AAYD+AICAAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxEjATMRIyEzFSMlMxUjgAGA/oCAgIACAICA/oCAgAEAgIACgID+gAGA/oCAgIAAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAAAEzFSM7ARUrATMVIzsBESMlMxUjMyEVIQGAgICAgICAgICAgID+AICAgAGA/oACgICAgP8AgICAAAsAAP+AA4ACgAADAAcACwAPABMAFwAbAB8AIwAnACsAABMzFSMlMxUjJTMVIyEzESMBMxUjJTMVIyUzESMpARUhIzMVIyUhFSkBMxUjgICAAQCAgAEAgID9gICAAQCAgAEAgIABAICA/YABAP8AgICAAYABAP8AAQCAgAKAgICAgID/AAEAgICAgP8AgICAgIAAAAAFAAAAAAKAA4AAAwALAA8AEwAXAAATIRUpATMRIxEjNTMlIRUhIzMRIzMhFSGAAYD+gAGAgICAgP6AAQD/AICAgIABgP6AA4CA/YABAICAgP6AgAAEAAAAAAKAA4AACQANABEAFQAAESEVIREzFSMRIwEhFSkBMxEjKQEVIQKA/gCAgIABAAEA/wABAICA/oABgP6AA4CA/wCA/wACAID+gIAAAAcAAAAAAoACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxEjATMRIyEzFSMlMxUjgICAAQCAgP6AgIABAICAAQCAgP6AgIABAICAAoCAgID+gAGA/wABAP6AgICAAAAHAAD/gAKAA4AAAwAHAAsADwATABcAGwAAETMVIzMhFSkBMxEjKQEVKQEzESMlMxUjMyEVIYCAgAGA/oABgICA/wABAP8AAQCAgP4AgICAAYD+gAOAgID/AID/AICAgAAFAAD/gAKAAoAABwALAA8AEwAXAAABIREjESMVIyUzFSM7ARUjBzMVIzMhFSEBAAGAgICA/wCAgICAgICAgIABgP6AAoD9gAIAgICAgICAgAAAAAAIAAAAAAKAA4AAAwAHAA8AEwAXABsAHwAjAAABMxUjKQEVISMzFTMVIxEjATMVKwEzFSMlMxEjITMVIyUzFSMCAICA/oABgP6AgICAgIABgICAgICAAQCAgP6AgIABAICAA4CAgICA/wABgICAgP8AgICAAAQAAAAAAoADgAADAAcACwAPAAARMxEjATMVIzsBESMpARUhgIABgICAgICA/oABgP6AA4D9AAIAgP6AgAAAAAAGAAD/gAKAAwAAAwAHAA8AEwAXABsAAAEzFSsBMxUjJTMRIxUjETMFMxEjATMRIykBFSEBAICAgICAAQCAgICA/oCAgAIAgID+gAGA/oADAICAgP8AgAEAgP6AAYD+gIAAAAAABwAA/4ACgAKAAAMABwALAA8AEwAXABsAABMzFSMlMxUjITMVIyUzFSMlMxEjJTMVIzMhFSGAgIABAICA/oCAgAEAgIABAICA/gCAgIABgP6AAoCAgICAgICA/gCAgIAACgAA/4ACgAKAAAMABwALAA8AEwAXABsAHwAjACcAABMzFSMlMxUjITMVIyUzFSMlMxEjJTMVIyEzFSMhMxUjJTMVIykBFSGAgIABAICA/oCAgAEAgIABAICA/oCAgAEAgID/AICAAYCAgP8AAQD/AAKAgICAgICAgP8AgICAgICAgAAABAAA/4ACgAOAAAcACwAPABMAAAEzESMRITUhBTMVIwczFSMzIRUhAgCAgP8AAQD+gICAgICAgAGA/oADgPyAAYCAgICAgIAABwAA/4ACgAKAAAMABwALAA8AEwAbAB8AABMzFSMlMxUjITMRIwEzFSMlMxEjITMVMxUhNTMFMxUjgICAAQCAgP6AgIABAICAAQCAgP6AgID+gIABAICAAoCAgID/AAEAgID/AICAgICAAAAABAAA/4ACgAKAAAMACwAPABMAABMzFSMlMxEjNSE1IQEzESMRIRUhgICAAYCAgP6AAYD+AICAAgD+AAKAgID9gICAAQD/AP8AgAAAAAcAAAAAAoADgAADAAcACwAPABcAGwAfAAATMxUjJTMVIyEzFSMlMxUjJTMRIxEhNSEFMxEjMyEVIYCAgAEAgID+gICAAQCAgAEAgID/AAEA/oCAgIABAP8AA4CAgICAgICA/YABAICA/wCAAAQAAAAAAoADgAADAA8AEwAXAAATIRUhIzMVIRUhFSEVIREjATMVIxMzESOAAQD/AICAAQD/AAGA/oCAAYCAgICAgAOAgICAgID/AAMAgP6A/wAAAAcAAP+AAoACgAADAAcACwAPABMAFwAbAAATMxUjJTMVIyEzESMBMxUrATMVIzsBESMpARUhgICAAQCAgP6AgIACAICAgICAgICA/oABgP6AAoCAgID+AAIAgID/AIAAAAQAAAAAAoADgAAHAAsADwATAAABMxEjESM1MyUhFSEjMxEjMyEVIQIAgICAgP6AAQD/AICAgIABgP6AA4D9AAEAgICA/oCAAAkAAP+AAoADgAADAAcADwATABcAGwAfACMAJwAAEzMVIyUzFSMhMxEhFSEVIwEzFSMlMxUjETMVIyEzESMBMxErATMVI4CAgAEAgID+gIABgP6AgAEAgIABAICAgID+gICAAQCAgICAgAOAgICA/wCAgAIAgICA/wCA/wABAP8AgAAAAAYAAP+AAoADgAADABcAGwAfACMAJwAAESEVKQEzFTMVIxUzFSMVIzUjNTM1IzUzBTMVIwMzFSMlMxUjKQEVIQGA/oABgICAgICAgICAgID/AICAgICAAgCAgP6AAYD+gAOAgICAgICAgICAgICA/wCAgICAAAAAAAMAAAAAAoADgAAHAAsADwAAETMRIRUhESMBMxEjKQEVIYABgP6AgAIAgID+gAGA/oADgP6AgP8AAQD/AIAAAAAEAAD/gAIAA4AACwAPABMAFwAAATMRMxUjESMRIzUzEzMRIyUzFSMzIRUhAQCAgICAgICAgID+gICAgAEA/wADgP8AgP8AAQCA/oD/AICAgAAAAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAABIRUpATMVIykBFSkBMxUjKQEVKQEzFSMlMxUjKQEVIQEAAQD/AAEAgID/AAEA/wABAICA/wABAP8A/wCAgAIAgID+gAGA/oADgICAgICAgICAgAAACgAAAAADAAOAAAMABwAPABMAFwAbAB8AIwAnACsAABMzFSMlMxUjITMRMxUjESMBMxEjATMVKwEzFSM7ARUrATMVIzsBFSMpARUhgICAAYCAgP4AgICAgAEAgIABgICAgICAgICAgICAgICA/gACAP4AA4CAgID/AID/AAKA/wABAICAgICAgAAAAAAIAAD/gAKAAoAAAwAHAAsADwATABcAGwAfAAATIRUhIzMRIwEzESMhMxUjJTMVKwEzFSsBMxUjJTMVI4ABgP6AgICAAgCAgP6AgIABAICAgICAgICAAQCAgAKAgP8AAQD/AICAgICAgIAAAAAEAAD/gAKAAoAACQANABEAFQAAESEVIxEhNTM1IQEzESMlMxUjMyEVIQKAgP8AgP6AAgCAgP4AgICAAYD+gAKAgP8AgID/AP8AgICAAAAAAAgAAP+AAoADgAADAAcACwAPABMAFwAbAB8AABMhFSEjMxUjMyEVKQEzFSMpARUpATMRIyUzFSMzIRUhgAEA/wCAgICAAYD+gAGAgID/AAEA/wABAICA/gCAgIABgP6AA4CAgICAgP8AgICAAAUAAP+AAoADgAADAAcAGwAfACMAABMhFSEjMxUjJTMVMxUjFTMVIxEjESE1ITUhNSEBMxEjMyEVIYABAP8AgICAAYCAgICAgID/AAEA/wABAP6AgICAAQD/AAOAgICAgICAgP8AAQCAgID+gP8AgAAFAAD/gAKAA4AAAwAXABsAHwAjAAARIRUpATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwMhFSEBAP8AAQCAgICAgICAgICA/wCAgAIAgICAAQD/AAOAgICA/wCAgICAAQCAgP8AAQD/AP8AgAAABgAA/4ACgAKAAAMABwALAA8AEwAXAAARIRUpATMVIykBFSEjMxEjJTMVIykBFSECAP4AAgCAgP6AAYD+gICAgAIAgID+gAGA/oACgICAgP8AgICAAAAAAAQAAP+AAoACgAAHAAsADwATAAARMxEhFSEVIwEzFSM7AREjASEVIYABgP6AgAGAgICAgID+gAIA/gACgP6AgIACgID/AP8AgAAAAAAFAAD/gAKAAoAAAwAHAAsAEwAXAAATIRUhIzMRIwEzESMpARUjFSM1IwUhFSGAAYD+gICAgAIAgID+gAGAgICAAQABAP8AAoCA/wABAP8AgICAgIAAAAAABQAA/4ACgAKAAAMABwALABMAFwAAEyEVISMzESMBMxUjBTMVIRUhNTMFMxUjgAGA/oCAgIACAICA/oCAAQD+AIABgICAAoCA/wABAICAgICAgIAAAwAAAIABgAIAAAMABwALAAARMxUjITMVIyEzFSOAgAEAgID/AICAAgCAgIAAAAAAAgAAAQABgAOAAAsADwAAESEVIRUzFSMVMxUhATMVIwGA/wCAgID/AAEAgIADgICAgICAAQCAAAAGAAD/gAKAAoAAAwAHAAsADwATABcAABMhFSEjMxUjMyEVKQEzESMlMxUjMyEVIYACAP4AgICAgAGA/oABgICA/gCAgIABgP6AAoCAgID/AICAgAAIAAD/gAKAAoAAAwAHAAsADwATABcAGwAfAAARIRUhJSEVISMzFSsBMxUjJTMVIyEzESMBMxEjKQEVIQEA/wABgAEA/wCAgICAgIABAICA/oCAgAIAgID+gAGA/oACgICAgICAgID/AAEA/wCAAAAABAAAAAACgAKAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAYD+gICAgAIAgID+gAGA/oACgID+gAGA/oCAAAIAAAAAAoADgAAHAAsAABMhESE1IREhIzMRI4ACAP4AAYD+gICAgAOA/ICAAoD9gAAAAAADAAAAAAKAA4AACwAPABMAABMhESE1ITUhNSERISMzESMVMxUjgAIA/gABgP6AAYD+gICAgICAA4D8gICAgAGA/oCAgAAAAAAGAAAAAAKAA4AABwALAA8AEwAXABsAABEhESM1IRUjITMVIykBFSEjMxEjJTMVIykBFSECgID+gIABgICA/wABAP8AgICAAgCAgP6AAYD+gAOA/wCAgICA/wCAgIAAAAAFAAAAAAIAA4AACwAPABMAFwAbAAARMxEzFSMVMxUjESMBMxUrATMVIzsBFSsBMxUjgICAgICAAYCAgICAgICAgICAgAOA/wCAgID/AAOAgICAgAAEAAAAAAKAA4AABQAJAA0AEQAAESEVIxEjATMRIzsBESM7AREjAQCAgAEAgICAgICAgIADgID9AAMA/wD/AP8AAAAAAAUAAAAAAoADgAAFAAkADQARABUAABEhFSMRIwEzESM7ARErATMRIwEzESMBAICAAQCAgICAgICAgAEAgIADgID9AAMA/wD/AP8AAQD/AAAABQAAAAACgAOAAAUACQANABEAFQAAESEVIxEjATMRIzsBESsBMxUjJTMRIwEAgIABAICAgICAgICAAQCAgAOAgP0AAwD/AP8AgID/AAAAAAAFAAAAAAKAA4AACQANABEAFQAZAAARIRUjETMRIxEjATMRIzsBESsBMxEjATMRIwEAgICAgAEAgICAgICAgIABAICAA4CA/wD/AP8AAwD/AP8A/wABAP8AAAAAAAIAAAAAAgADgAALAA8AABEzESEVIRUhFSERIwEzFSOAAQD/AAEA/wCAAYCAgAOA/wCAgID/AAIAgAAAAAIAAAAAAgADgAAPABMAABEzFSEVIRUzFSMVIRUhFSMBMxEjgAEA/wCAgAEA/wCAAYCAgAOAgICAgICAgAKA/oAAAAAAAwAAAAABgAOAAAkADQARAAARIRUjFTMVIxEjATMVIxUzFSMBAICAgIABAICAgIADgICAgP4AAwCAgIAABQAAAAACAAOAAAkADQARABUAGQAAESEVIxUzFSMRIwEzFSsBMxUjOwEVKwEzFSMBAICAgIABgICAgICAgICAgICAA4CAgID+AAOAgICAgAAEAAAAAAIAA4AACQANABEAFQAAESEVIxUzFSMRIwEzFSsBMxUjFTMVIwEAgICAgAGAgICAgICAgAOAgICA/gADgICAgIAAAAAFAAAAAAIAA4AACQANABEAFQAZAAARIRUjFTMVIxEjATMVIzsBFSsBMxUjOwEVIwEAgICAgAEAgICAgICAgICAgIADgICAgP4AAwCAgICAAAUAAAAAAoADgAATABcAGwAfACMAAAEzETMVIxUzFSMVIxEjNTM1IzUzJTMVIxUzFSMhMxUjFTMVIwEAgICAgICAgICAgP8AgICAgAIAgICAgAOA/oCAgICAAQCAgICAgICAgICAAAAAAwAAAAABgAOAAAsADwATAAARMxEzFSMVMxUjFSMBMxUjFTMVI4CAgICAgAEAgICAgAOA/oCAgICAAYCAgIAAAAMAAAAAAYADgAALAA8AEwAAATMRIzUjNTM1IzUzBTMVIxUzFSMBAICAgICAgP8AgICAgAOA/ICAgICAgICAgAAFAAAAAAKAA4AAEwAXABsAHwAjAAABMxEzFSMVMxUjESM1IzUzNSM1MwEzFSMVMxUjITMVIxUzFSMBAICAgICAgICAgIABAICAgID+AICAgIADgP8AgICA/wCAgICAAQCAgICAgIAAAAQAAAAAAoADgAAPABMAFwAbAAABMxEzFSMRIzUjNTM1IzUzATMVIwEzFSMVMxUjAQCAgICAgICAgAEAgID+AICAgIADgP8AgP4AgICAgAEAgP8AgICAAAAGAAAAAAIAA4AACQANABEAFQAZAB0AABEhFSMRMxUjESMBMxUjOwEVKwEzFSMVMxUjOwEVIwEAgICAgAEAgICAgICAgICAgICAgAOAgP6AgP8AAwCAgICAgIAAAAUAAACAAYADAAADAAcACwAPABMAAAEzFSsBMxUrATMVIzsBFSM7ARUjAQCAgICAgICAgICAgICAgAMAgICAgIAAAAAAAwAAAAACAAOAAAcACwAPAAARMxEzFSMRIwEzFSM7ARUjgICAgAEAgICAgIADgP4AgP8AAQCAgAADAAAAAAIAA4AABwALAA8AABEzETMVIxEjATMVKwEzFSOAgICAAYCAgICAgAOA/wCA/gADgICAAAMAAAAAAoADgAALAA8AEwAAEzMRMxEjESMRIxEzATMVKwEzFSOAgICAgICAAYCAgICAgAOA/wD/AP6AAYABAAEAgIAACQAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjAAARMxUjJTMVIyEzESMBMxErATMVKwEzESMBMxEjITMVIyUzFSOAgAIAgID+gICAAQCAgICAgICAgAEAgID+gICAAgCAgAOAgICA/wABAP8AgP8AAQD/AICAgAAACwAAAAACgAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAAETMVIyUzFSMhMxEjATMRIyEzFSMlMxUjJTMVIyEzESMBMxEjITMVIyUzFSOAgAIAgID+gICAAQCAgP6AgIABAICAAQCAgP6AgIABAICA/oCAgAIAgIADgICAgP8AAQD/AICAgICA/wABAP8AgICAAAAAAAQAAAAAAgADgAAJAA0AEQAVAAARIRUjETMVIxEjATMVIzsBFSsBMxUjAQCAgICAAQCAgICAgICAgAOAgP6AgP8AAwCAgIAAAAIAAAAAAoADgAAHAA8AABEzESEVIREjATMRIxEjNTOAAQD/AIACAICAgIADgP6AgP6AA4D8gAEAgAAAAAIAAAAAAoADgAALABcAABEzESEVIRUhFSERIwEzESM1IzUzNSM1M4ABAP8AAQD/AIACAICAgICAgAOA/wCAgID/AAOA/ICAgICAAAAFAAAAAAKAA4AAEwAXABsAHwAjAAABMxEzFSMVMxUjESMRIzUzNSM1MyUzFSMlMxUjATMVIyUzFSMBAICAgICAgICAgID/AICAAgCAgP4AgIACAICAA4D/AICAgP8AAQCAgICAgICA/oCAgIAAAAAAAQAAAAABgAOAAAsAABMzETMRIxEjESMRM4CAgICAgIADgP8A/wD+gAGAAQAAAAAAAwAAAAACgAOAAAsADwATAAABMxEzFSMRIxEjNTMlMxUjATMVIwEAgICAgICA/wCAgAIAgIADgP6AgP6AAgCAgID/AIAAAAAAAgAAAAABgAOAAAcACwAAETMRMxUjESMBMxUjgICAgAEAgIADgP6AgP6AAYCAAAAAAwAAAAACgAOAAAsADwATAAABMxEzESMRIxEjETMlMxUjATMVIwEAgICAgICA/wCAgAIAgIADgP8A/wD+gAGAAQCAgP8AgAAAAQAAAAAAgAOAAAMAABEzESOAgAOA/IAAAQAAAAABgAOAAAsAABMzETMRIxEjESMRM4CAgICAgIADgP8A/wD+gAGAAQAAAAAACgAAAAADAAOAAAMABwALAA8AEwAXABsAHwAjACcAAAEzFSsBMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMBAICAgICAgICAAYCAgP8AgIABgICA/wCAgAGAgICAgICAgIADgICAgICAgICAgICAgIAAAAMAAAAAAoADgAATABcAGwAAATMRMxUjFTMVIxEjESM1MzUjNTMFMxUjJTMVIwEAgICAgICAgICAgP8AgIACAICAA4D/AICAgP8AAQCAgICAgICAAAMAAAAAAoADgAALAA8AEwAAATMRMxUjESMRIzUzATMVIwEzFSMBAICAgICAgAEAgID+AICAA4D/AID+AAGAgAEAgP8AgAAAAAIAAAAAAYADgAAHAAsAAAEzESMRIzUzBTMVIwEAgICAgP8AgIADgPyAAYCAgIAAAAMAAAAAAoADgAAHAAsADwAAASEVIxEhNTMBMxUjATMVIwEAAQCA/wCAAQCAgP4AgIADgID9AIACgID+gIAAAAAFAAAAAAIAA4AABwALAA8AEwAXAAARIRUjETMVIQEzFSsBMxUjETMVIzsBFSMBAICA/wABgICAgICAgICAgIADgID9gIADgICA/oCAgAAAAAMAAAAAAoADgAADAA8AEwAAETMVIyUzFTMRIxEjESMRMyUzFSOAgAEAgICAgICAAQCAgAOAgICA/wD+AAIAAQCAgAAABwAAAAABgAOAAAMABwALAA8AEwAXABsAAAEzFSsBMxUrATMVIzMhFSEjMxUjOwEVIzsBFSMBAICAgICAgICAgAEA/wCAgICAgICAgIADgICAgICAgIAAAAMAAAAAAoADgAAFAAsADwAAETMRMxUhASERIxErATMVI4CA/wABgAEAgICAgIADgP4AgAGA/YACAIAAAAEAAAIAAIADgAADAAARMxEjgIADgP6AAAEAAAGAAYADgAAHAAATMxEzESERM4CAgP6AgAOA/wD/AAEAAAMAAAEAAoADgAALAA8AEwAAATMRMxUjFSM1IzUzJTMVIyUzFSMBAICAgICAgP8AgIACAICAA4D+gICAgICAgICAAAAAAwAAAAACgAOAAAsADwATAAABMxUzFSMRIxEjNTMFMxUjJTMVIwEAgICAgICA/wCAgAIAgIADgICA/YACgICAgICAAAACAAAAAAGAA4AABwALAAABMxEjESM1MwUzFSMBAICAgID/AICAA4D8gAKAgICAAAACAAAAAAIAA4AADwATAAABMxEzESMRIxEjETM1IzUzBTMVIwEAgICAgICAgID/AICAA4D+gP8A/wABAAEAgICAgAAAAAUAAAAAAgADgAALAA8AEwAXABsAABEhFSERMxUjESEVIQEzFSsBMxUjFTMVIzsBFSMBgP8AgIABAP6AAYCAgICAgICAgICAA4CA/wCA/wCAAwCAgICAgAADAAAAAAGAA4AACwAPABMAABEzETMVIxUzFSMRIwEzFSMVMxUjgICAgICAAQCAgICAA4D/AICAgP8AAwCAgIAAAwAAAAACAAOAAA8AEwAXAAARIRUhFTMVMxUhFTMVMxUhATMRIxUzESMBgP8AgID/AICA/oABgICAgIADgICAgICAgIADAP8AgP8AAAUAAAAAAgADgAALAA8AEwAXABsAABEzETMVIxUzFSMRIwEzFSsBMxUjETMVIzsBFSOAgICAgIABgICAgICAgICAgIADgP8AgICA/wADgICA/oCAgAAAAAADAAAAAAKAA4AABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIADgICA/YADgPyAAoCAgIAAAAMAAAAAAoADgAALABcAGwAAETMVMxUjFTMVIxEjATMRIxEjNTM1IzUzBTMVI4CAgICAgAIAgICAgICA/wCAgAOAgICAgP6AA4D8gAGAgICAgIAAAAMAAAAAAoADgAADAA8AEwAAETMRIwEzETMVIxEjESM1MwEzESOAgAEAgICAgICAAQCAgAOA/wABAP8AgP4AAgCAAQD/AAAAAAEAAAAAAYADgAAHAAARIREjESMRIwGAgICAA4D/AP2AAoAAAAIAAAAAAYADgAAHAAsAABEzFTMVIxEjATMVI4CAgIABAICAA4CAgP2AAoCAAAAAAAIAAAAAAgADgAAPABMAABMzFTMVIxUzESMRIxEjETMlMxUjgICAgICAgICAAQCAgAOAgICA/wD/AAEAAQCAgAAIAAAAgAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAgIAAAAwAAAAAAoADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAAEzMVIyUzFSsBMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjgICAAQCAgICAgICAgAEAgID+gICAAgCAgP6AgIABAICAgICAgICAAQCAgAOAgICAgICAgICAgICAgICAgIAAAAADAAAAAAKAA4AACwAXABsAABEzFTMRIxUzESMVIwEzESM1IxEzNSMRMwEzFSOAgICAgIACAICAgICAgP8AgIADgID/AID/AIADgPyAgAEAgAEA/wCAAAAADACAAAADAAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAvAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVKwEzFSMlMxUjITMVIyUzFSMBgICAgICAAQCAgP6AgIACAICA/oCAgAEAgICAgICAgIABAICA/oCAgAIAgIADgICAgICAgICAgICAgICAgICAAAUAAAAAA4ADgAADAAsADwATABcAABEzFSMlIRUjESMRIyUzFSMhMxUjJTMVI4CAAQABgICAgAIAgID9gICAAgCAgAOAgICA/QADAICAgICAAAAAAAUAAAAAAoADgAATABcAGwAfACMAAAEzETMVIxUzFSMRIxEjNTM1IzUzJTMVIyUzFSMBMxUjJTMVIwEAgICAgICAgICAgP8AgIACAICA/gCAgAIAgIADgP8AgICA/wABAICAgICAgID+gICAgAAAAAAFAAAAAAOAA4AABwALAA8AEwAXAAABIRUjESE1MwEzFSsBMxUjATMVKwEzFSMBgAEAgP8AgAGAgICAgID+AICAgICAA4CA/QCAAwCAgP6AgIAAAAADAAAAAAKAA4AACwAPABMAAAEzETMRIxUjNSMRMwEzFSMlMxUjAQCAgICAgID/AICAAgCAgAOA/gD/AICAAQD/AICAgAAAAAAHAAAAAAKAA4AAAwAXABsAHwAjACcAKwAAETMVIyUzFTMRIxUzESMVIzUjETM1IxEzJTMVIwEzFSMlMxUjATMVIyUzFSOAgAEAgICAgICAgICAgAEAgID+AICAAgCAgP4AgIACAICAA4CAgID/AID/AICAAQCAAQCAgP8AgICA/wCAgIAAAAAABAAAAAACgAOAAA8AHwAjACcAABEzFTMVIxUzFSMVMxUjFSMBMxEjNSM1MzUjNTM1IzUzBTMVIxUzFSOAgICAgICAgAIAgICAgICAgID/AICAgIADgICAgICAgIADgPyAgICAgICAgICAgAAAAwAAAAACgAOAAAsADwATAAABMxEzFSMRIxEjNTMFMxEjATMRIwEAgICAgICA/wCAgAIAgIADgP4AgP8AAQCAgP8AAQD/AAAAAQAAAAAAgAGAAAMAABEzESOAgAGA/oAABQAAAAACgAOAABMAFwAbAB8AIwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxUjJTMVIwUzFSMlMxUjAQCAgICAgICAgICA/wCAgAIAgID+AICAAgCAgAOAgID+gICAgIABgICAgICAgICAgAAABAAAAAACAAOAAAkADQARABUAAAEhESMRIzUzESsBMxUrATMVIzsBFSMBAAEAgICAgICAgICAgICAgAOA/IABAIABgICAgAAAAwAAAAADgAOAAA0AGwAfAAATMxUzFSMRMxUhESM1MykBETMVIxEjNSM1MxErATMVI4CAgICA/wCAgAGAAQCAgICAgICAgIADgICA/wCAAQCA/wCA/wCAgAEAgAABAAABAAEAAgAAAwAAESERIQEA/wACAP8AAAAAAgAAAIAAgAKAAAMABwAAETMVIxEzFSOAgICAAoCA/wCAAAAAAQAAAIACgAMAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAMA/wCA/wABAIAAAwAAAAACgAOAAAkADQARAAABIRUjESMRIzUzATMVIwEzFSMBAAEAgICAgAEAgID+AICAA4CA/QABgIABAID/AIAAAAAFAAAAAAKAA4AAAwAXABsAHwAjAAARMxEjATMRMxUjFTMVIxEjESM1MzUjNTMBMxEjATMRIwEzESOAgAEAgICAgICAgICAgAEAgID+AICAAgCAgAOA/wABAP8AgICA/wABAICAgAEA/wD+gP8AAQD/AAAAAAMAAAAAAoADgAATABcAGwAAATMVMxUjETMVIxUjNSM1MxEjNTMFMxEjATMRIwEAgICAgICAgICAgP8AgIACAICAA4CAgP6AgICAgAGAgID+gAGA/oAAAAAEAAAAAAKAA4AABwALAA8AEwAAETMRMxUjESMBMxUjOwERIzsBESOAgICAAQCAgICAgICAgAOA/oCA/oACgID/AP8AAAMAAAAAAoADgAAFAAsADwAAATMRITUzASEVIxEjATMVIwIAgP8AgP4AAQCAgAEAgIADgP2AgAEAgP4AAgCAAAAHAAAAAAOAA4AADwATABcAGwAfACMAJwAAASEVIxEzFSMRIxEjNTMRKwEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIwEAAYCAgICAgICAgICAAgCAgP2AgIADAICA/YCAgAIAgIADgID+gID/AAEAgAGAgICAgICAgICAAAAAAQAAAAACAAOAAAsAABEzESE1MxEjESEVI4ABAICA/wCAA4D+gID9gAGAgAAHAAAAAAEAA4AAAwAHAAsADwATABcAGwAAEzMVKwEzFSM7ARUrATMVIzsBFSsBMxUjOwEVI4CAgICAgICAgICAgICAgICAgICAgAOAgICAgICAgAAFAAAAAAKAA4AAAwAPABMAFwAbAAATMxEjOwEVMxUjFSM1IzUzJTMVIwUzFSMhMxEjgICAgICAgICAgAEAgID+AICAAYCAgAOA/wCAgICAgICAgID/AAAAAwAAAAACgAOAAAcACwAPAAARMxEhFSERIwEzESM7AREjgAEA/wCAAYCAgICAgAOA/wCA/gACAP8A/wAAAwAAAAACgAOAAAsADwATAAABMxEzESM1IxUjETMBMxUjJTMVIwEAgICAgICA/wCAgAIAgIADgP4A/wCAgAEA/wCAgIAAAAAAAgAAAAACgAKAAAMADwAAEyEVISMzFSE1MxEjESERI4ABgP6AgIABgICA/oCAAoCAgID+AAEA/wAAAAAABQAAAAACgAKAAAMABwALAA8AEwAAEyEVISMzESMBMxUjFTMVIykBFSGAAYD+gICAgAIAgICAgP6AAYD+gAKAgP6AAYCAgICAAAAAAAIAAAAAAoACgAAHAAsAABEhFSERIRUhATMRIwIA/oABgP4AAgCAgAKAgP6AgAIA/oAAAAABAAAAAAKAAoAACwAAESEVIRUhFSEVIRUhAoD+AAEA/wACAP2AAoCAgICAgAAAAAACAAD/gACAAwAAAwAHAAARMxEjFTMVI4CAgIADAP2AgIAAAAADAAAAAAKAAoAAAwAHAAsAAAEzESMlMxUjMyEVIQIAgID+AICAgAGA/oACgP4AgICAAAAABQAAAAACgAKAAAcACwAPABMAFwAAETMRIRUhESMBMxUrATMVIxUzFSM7ARUjgAEA/wCAAgCAgICAgICAgICAAoD/AID/AAKAgICAgIAAAAADAAAAAAKAAoAABwAPABMAABEzFTMVIxEjATMRIxEjNTMFMxUjgICAgAIAgICAgP8AgIACgICA/oACgP2AAYCAgIAAAAQAAAAAAoACgAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAoCA/oABgP6AgAACAAAAAAKAAoAACQANAAARIRUhFSEVIREjATMVIwIA/oABgP6AgAIAgIACgICAgP8AAgCAAAAAAAMAAAAAAoADgAADAA0AEQAAETMRIwEzESE1ITUhNSEFMxUjgIACAID+AAGA/oABgP4AgIADgP4AAgD8gICAgICAAAAAAQAAAAACgAKAAAcAABEhFSERIxEhAoD/AID/AAKAgP4AAgAAAwAAAAACgAKAAAMABwALAAARMxEjATMRIykBFSGAgAIAgID+gAGA/oACgP4AAgD+AIAAAAUAAAAAAoACgAADAAcACwAPABMAABEzESMBMxEjITMVIyUzFSsBMxUjgIACAICA/oCAgAEAgICAgIACgP6AAYD+gICAgIAAAAMAAAAAAoACgAAHAA8AEwAAETMRMxUjFSMBMxEjNSM1MyUzFSOAgICAAgCAgICA/wCAgAKA/oCAgAKA/YCAgICAAAAAAwAAAAACgAKAAAcACwATAAARIRUjFSM1IQUzFSsBMxUhFSE1MwKAgID+gAEAgICAgAGA/YCAAoCAgICAgICAgAAAAAADAAAAAAKAAwAAAwANABEAABMhFSEjMxUhFSERIRUhATMRI4ACAP4AgIABgP6AAYD+AAIAgIADAICAgP8AgAGA/wAAAAUAAP+AAwADgAADAA0AEQAVABkAAAEzFSsBMxEhNSERIzUzJSEVISMzESMFMxUjAoCAgICA/gABgICA/oABAP8AgICAAoCAgAOAgP0AgAEAgICA/oCAgAADAAAAAAIAA4AAAwATABcAAAEhFSEjMxEzFSMRIzUjNTMRIzUzBTMVIwEAAQD/AICAgICAgICAgAEAgIADgID+gID/AICAAQCAgIAAAgAAAAACAAOAAAMAEwAAASEVISMzFSEVIREjESM1MzUjNTMBAAEA/wCAgAEA/wCAgICAgAOAgICA/gABAICAgAAAAAAFAAAAAAKAA4AABQAJAA0AEQAVAAATIREjNSEjMxEjASEVKQEzESMpARUhgAIAgP6AgICAAQABAP8AAQCAgP8AAQD/AAOA/wCA/QACgID+gIAAAAAIAAAAAAKAA4AAAwAHAAsADwATABcAGwAfAAABIRUhIzMVIzsBFSsBMxUjJTMVIyEzESMBMxEjKQEVIQEAAQD/AICAgICAgICAgAEAgID+gICAAgCAgP6AAYD+gAOAgICAgICA/wABAP8AgAAGAAAAAAKAA4AAAwAHAAsADwATABcAAAEzFSsBMxUrATMRIwEzFSM7AREjKQEVIQEAgICAgICAgIABgICAgICA/oABgP6AA4CAgP4AAgCA/oCAAAAFAAAAAAIAA4AAAwAHAAsADwATAAATMxUrATMRIwEzFSM7AREjKQEVIYCAgICAgAEAgICAgID/AAEA/wADgID9gAIAgP6AgAAHAAAAAAKAA4AAAwAHAAsADwAXABsAHwAAETMVIyUzFSMhMxUjJTMVKwEzESM1IzUzBTMVIzsBFSOAgAIAgID+gICAAQCAgICAgICA/wCAgICAgAOAgICAgICA/gCAgICAgAAABQAA/4ADAAKAAAMACwAPABMAGwAAEzMRIwEzESMRITUhBTMVKwEzFSMlMxUhFSE1M4CAgAIAgID+gAGA/gCAgICAgAEAgAEA/gCAAoD/AAEA/YABAICAgICAgICAAAAAAQAAAYABgAIAAAMAABEhFSEBgP6AAgCAAAAAAAEAAAGAAYACAAADAAARIRUhAYD+gAIAgAAAAAABAAABgAMAAgAAAwAAESEVIQMA/QACAIAAAAAAAQAAAYAEAAIAAAMAABEhFSEEAPwAAgCAAAAAAAIAAAIAAQADgAADAAcAABMzFSsBMxEjgICAgICAA4CA/wAAAAIAAAIAAQADgAADAAcAABMzESsBMxUjgICAgICAA4D/AIAAAAIAAP+AAQABAAADAAcAABMzESsBMxUjgICAgICAAQD/AIAAAAQAAAIAAgADgAADAAcACwAPAAATMxUjJTMVIyEzESMBMxEjgICAAQCAgP6AgIABAICAA4CAgID/AAEA/wAAAAAEAAACAAIAA4AAAwAHAAsADwAAEzMRIwEzESMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAOA/wABAP8AgICAAAAABAAA/4ACAAEAAAMABwALAA8AABMzESMBMxEjITMVIyUzFSOAgIABAICA/oCAgAEAgIABAP8AAQD/AICAgAAAAAEAAAAAAoADgAALAAABMxEhFSERIxEhNSEBAIABAP8AgP8AAQADgP8AgP4AAgCAAAEAAAAAAoADgAATAAABMxEhFSEVIRUhESMRITUhNSE1IQEAgAEA/wABAP8AgP8AAQD/AAEAA4D/AICAgP8AAQCAgIAAAQAAAQABAAIAAAMAABEhESEBAP8AAgD/AAAAAAMAAAAAA4AAgAADAAcACwAANTMVIyUzFSMlMxUjgIABgICAAYCAgICAgICAgAAAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AABEzESMBMxUrATMRKwEzFSsBMxEjJTMRIwEzESMlMxUjgIACAICAgICAgICAgICAAYCAgAEAgID9AICAA4D/AAEAgP8AgP8AgP8AAQD/AICAAAkAAAAABAADgAADAAcACwAPABMAFwAbAB8AIwAAETMRIwEzFSsBMxErATMVKwEzESMlMxEjATMRIwEzESMlMxUjgIACAICAgICAgICAgICAAQCAgAEAgIABAICA/ICAgAOA/wABAID/AID/AID/AAEA/wABAP8AgIAAAAACAAACgAEAA4AAAwAHAAATMxUrATMVI4CAgICAgAOAgIAAAAAEAAACgAIAA4AAAwAHAAsADwAAEzMVIyUzFSMhMxUjJTMVI4CAgAEAgID+gICAAQCAgAOAgICAgICAAAAGAAACgAMAA4AAAwAHAAsADwATABcAABMzFSMlMxUjJTMVIyEzFSMlMxUjJTMVI4CAgAEAgIABAICA/YCAgAEAgIABAICAA4CAgICAgICAgICAAAACAAACgAEAA4AAAwAHAAARMxUjOwEVI4CAgICAA4CAgAAAAAAEAAACgAIAA4AAAwAHAAsADwAAETMVIyUzFSsBMxUjJTMVI4CAAQCAgICAgAEAgIADgICAgICAgAAAAAAGAAACgAMAA4AAAwAHAAsADwATABcAABEzFSMlMxUjJTMVIyEzFSMlMxUjJTMVI4CAAQCAgAEAgID+gICAAQCAgAEAgIADgICAgICAgICAgIAAAAAFAAAAgAGAAwAAAwAHAAsADwATAAABMxUrATMVKwEzFSM7ARUjOwEVIwEAgICAgICAgICAgICAgIADAICAgICAAAAAAAUAAACAAYADAAADAAcACwAPABMAABEzFSM7ARUjOwEVKwEzFSsBMxUjgICAgICAgICAgICAgIADAICAgICAAAARAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwBDAAARMxUjJTMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjJTMVI4CAAYCAgAGAgID9gICAAgCAgP6AgIABAICA/gCAgAGAgIABgICA/gCAgAEAgID+gICAAgCAgP2AgIABgICAAYCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAQAAAAAAYADgAADAAcACwAPAAARMxEjATMRIwUzFSMlMxUjgIABAICA/wCAgAEAgIADgP2AAoD9gICAgIAAAAAEAAAAAAKAA4AACwAPABMAFwAAEyEVIxEzFSMVIxErATMVIyUzESMBMxUjgAGAgICAgICAgIACAICA/wCAgAOAgP8AgIACAICA/wD+gIAAAA8AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwAAATMVIyUzFSsBMxUrATMVIyUzFSMFMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjAQCAgAEAgICAgICAgIABAICA/gCAgAEAgIABAICAAQCAgP2AgIACAICA/YCAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgAAACAAAAAADgAOAAAMABwALAA8AEwAXABsAHwAAEyEVISUzESMBMxUjJTMRKwEzFSsBMxUjFTMVIyUzFSOAAYD+gAKAgID9AICAAgCAgICAgICAgICAAgCAgAOAgID9gAIAgID/AICAgICAgAAACAAAAAADgAOAAAMABwALAA8AEwAXABsAHwAAETMRIwEhFSEjMxUjJTMRKwEzFSsBMxUjBTMVIyUzFSOAgAGAAYD+gICAgAIAgICAgICAgID+AICAAgCAgAOA/YACgICAgP8AgICAgICAAAAAAwAAAAACAAKAAAUACQANAAARIREjNSEFMxErATMVIwIAgP6AAQCAgICAgAKA/wCAgP8AgAAAAAABAAAAAAMAA4AADwAAESEVMxUjFSMRIxEjESMRIwKAgICAgICAgAOAgICA/gADAP0AAwAABQAAAQABgAKAAAMABwALAA8AEwAAETMVIyUzFSsBMxUrATMVIyUzFSOAgAEAgICAgICAgIABAICAAoCAgICAgICAAAACAAD/gACAAoAAAwAHAAARMxUjETMRI4CAgIACgID+gP8AAAAKAAAAAAGAA4AAAwAHAAsADwATABcAGwAfACMAJwAAETMVIyUzFSsBMxUrATMVIyUzFSMFMxUjJTMVKwEzFSsBMxUjJTMVI4CAAQCAgICAgICAgAEAgID/AICAAQCAgICAgICAgAEAgIADgICAgICAgICAgICAgICAgAAABQAAAAABgAOAAAMABwALAA8AEwAAETMVIyUzESsBMxErATMRIyUzFSOAgAEAgICAgICAgIABAICAA4CAgP8A/oD/AICAAAAACAAAAoAEAAOAAAMABwALAA8AEwAXABsAHwAAEzMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSOAgIABAICAAQCAgAEAgID8gICAAQCAgAEAgIABAICAA4CAgICAgICAgICAgICAgAAABAAAAQACAAOAAAMABwALAA8AABMhFSEjMxEjATMRIykBFSGAAQD/AICAgAGAgID/AAEA/wADgID+gAGA/oCAAAIAAAEAAIADgAADAAcAABEzFSMVMxEjgICAgAOAgID+gAAAAAIAAAEAAgADgAALAA8AAAEhESM1IREzFSERKwEzFSMBAAEAgP6AgAEAgICAgAOA/YCAAQCAAQCAAAAAAAMAAAEAAgADgAAHAAsADwAAESEVIRUhFSkBMxUjKQEVIQIA/oABAP6AAYCAgP6AAYD+gAOAgICAgIAAAAQAAAEAAgADgAADAAsADwATAAATIRUhIzMVIRUhFSMlMxUjKQEVIYABAP8AgIABAP8AgAGAgID/AAEA/wADgICAgICAgIAAAAMAAAEAAgADgAAHAAsADwAAESERIzUhFSMhMxUrATMRIwIAgP8AgAEAgICAgIADgP8AgICA/wAABwAAAQACAAOAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSEjMxUjJTMVIykBFSGAAQD/AICAgAGAgID/AAEA/wCAgIABgICA/wABAP8AA4CAgICAgICAgIAABAAAAQACAAOAAAMABwAPABMAABMhFSEjMxUjJTMRIzUhNSEBIRUhgAEA/wCAgIABgICA/wABAP8AAQD/AAOAgICA/oCAgP8AgAAAAAEAAAGAAYADAAALAAATMxUzFSMVIzUjNTOAgICAgICAAwCAgICAgAABAAACAAGAAoAAAwAAESEVIQGA/oACgIAAAAAAAgAAAYABgAMAAAMABwAAESEVIRUhFSEBgP6AAYD+gAMAgICAAAAAAAMAAAEAAQADgAADAAcACwAAEzMVKwEzESM7ARUjgICAgICAgICAA4CA/oCAAAAAAAMAAAEAAQADgAADAAcACwAAETMVIzsBESsBMxUjgICAgICAgIADgID+gIAAAgAAAQACAAMAAAUACQAAESEVIREjATMRIwGA/wCAAYCAgAMAgP6AAYD+gAAEAAD/gAIAAgAAAwAHAAsADwAAEyEVISMzESMBMxEjKQEVIYABAP8AgICAAYCAgP8AAQD/AAIAgP6AAYD+gIAAAQAA/4ABgAIAAAsAABMzETMVITUzESM1M4CAgP6AgICAAgD+AICAAQCAAAAFAAD/gAIAAgAAAwAHAAsADwAXAAATIRUhIzMVIyUzFSsBMxUrATMVIRUhNTOAAQD/AICAgAGAgICAgICAgAEA/gCAAgCAgICAgICAgAAAAAcAAP+AAgACAAADAAcACwAPABMAFwAbAAATIRUhIzMVIyUzFSsBMxUjITMVIyUzFSMpARUhgAEA/wCAgIABgICAgICA/wCAgAGAgID/AAEA/wACAICAgICAgICAgAAAAAIAAP+AAgACAAALAA8AAAEhESM1IREzFSERKwEzFSMBAAEAgP6AgAEAgICAgAIA/YCAAQCAAQCAAAAAAAMAAP+AAgACAAAHAAsADwAAESEVIRUhFSkBMxUjKQEVIQIA/oABAP6AAYCAgP6AAYD+gAIAgICAgIAAAAQAAP+AAgACAAADAAsADwATAAATIRUhIzMVIRUhFSMlMxUjKQEVIYABAP8AgIABAP8AgAGAgID/AAEA/wACAICAgICAgIAAAAMAAP+AAgACAAAHAAsADwAAESERIzUhFSMhMxUrATMRIwIAgP8AgAEAgICAgIACAP8AgICA/wAABwAA/4ACAAIAAAMABwALAA8AEwAXABsAABMhFSEjMxUjJTMVIykBFSEjMxUjJTMVIykBFSGAAQD/AICAgAGAgID/AAEA/wCAgIABgICA/wABAP8AAgCAgICAgICAgIAABAAA/4ACAAIAAAMABwAPABMAABMhFSEjMxUjJTMRIzUhNSEBIRUhgAEA/wCAgIABgICA/wABAP8AAQD/AAIAgICA/oCAgP8AgAAAAAEAAAAAAYABgAALAAATMxUzFSMVIzUjNTOAgICAgICAAYCAgICAgAABAAAAgAGAAQAAAwAAESEVIQGA/oABAIAAAAAAAgAAAAABgAGAAAMABwAAESEVIRUhFSEBgP6AAYD+gAGAgICAAAAAAAMAAP+AAQACAAADAAcACwAAEzMVKwEzESM7ARUjgICAgICAgICAAgCA/oCAAAAAAAMAAP+AAQACAAADAAcACwAAETMVIzsBESsBMxUjgICAgICAgIACAID+gIAAAwAAAAACgAOAAAMABwAXAAATIRUhIzMRIwEhFSEVMxUjFSEVIREjNTOAAYD+gICAgAEAAYD/AICAAQD+gICAA4CA/oABAICAgICAAQCAAAAFAAAAAAKAA4AABwALAA8AEwAbAAATMxUzNTMRISMzESMBMxUjFTMVIykBESM1IxUjgICAgP6AgICAAgCAgICA/oABgICAgAOAgID/AP6AAYCAgID/AICAAAAAAAYAAAAAAoADgAADAAcACwAPABcAGwAAEyEVISMzESMBMxUjByEVISMzETMVITUzJTMVI4ABgP6AgICAAgCAgIABAP8AgICA/oCAAQCAgAOAgP2AAoCAgID/AICAgIAAAAEAAAAAAwADgAARAAATIRUhFSEVIRUzFSMRIxEjNTOAAoD+AAEA/wCAgICAgAOAgICAgID/AAEAgAAAAAMAAAAAAoADgAADABsAHwAAASEVISMzFTMVIxUzFSMVIRUhNTM1IzUzNSM1MyUzFSMBAAEA/wCAgICAgIABgP2AgICAgIABgICAA4CAgICAgICAgICAgICAgAAAAgAA/4ACgAKAAA0AEQAAATMVMxUjESMRIxEjESEFMxEjAQCAgICAgIABAAEAgIACgICA/gACAP6AAgCA/oAAAAIAAAAAA4ADgAAdACEAABMzFTMVIREzETMVIxUzFSMRIxEhESMRIzUzNSM1MxcVITWAgIABAICAgICAgP6AgICAgICAAQADgICAAQD/AICAgP8AAQD/AAEAgICAgICAAAIAAAAAA4ADgAAnACsAABMzFSE1MxUzFSMVMxUjESM1IzUzNSMVIzUjFTMVIxUjESM1MzUjNTMXFSE1gIABgICAgICAgICAgICAgICAgICAgIABgAOAgICAgICA/oCAgICAgICAgAGAgICAgICAAAAEAAAAAAOAAoAABQALAA8AEwAAESEVIREjATMRITUhATMRIyUzESMCAP6AgAMAgP4AAYD/AICA/wCAgAKAgP4AAoD9gIABgP8AgP8AAAAAAAQAAP+AAwADgAARABUAGQAdAAABMxUzFSMRITUhNSM1MzUjNTMFIRUhIzMRIxEhFSECAICAgP4AAYCAgICA/oABAP8AgICAAoD9gAOAgID+AICAgICAgID/AP8AgAAAAAUAAAAAAwADgAADABcAGwAfACMAAAEhFSEjMxUhFSEVIRUhFSM1IzUzNSM1MyUzFSMRMxUjKQEVIQEAAYD+gICAAQD/AAEA/wCAgICAgAIAgICAgP6AAYD+gAOAgICAgICAgICAgICA/oCAgAAAAAADAAAAAAMAA4AAEwAXABsAABMzESE1MxUzFSMVIzUhESMRIzUzATMVIxEzESOAgAEAgICAgP8AgICAAgCAgICAA4D/AICAgICA/gACAIABAID+gP6AAAAAAQAAAAACgAOAABcAABEhFSEVMxUjFTMVIxEjNSM1MzUjNTMRIQKA/wCAgICAgICAgID/AAOAgICAgID/AICAgIABAAAJAAD/gAKAA4AAAwAHAAsADwATABcAGwAfACMAAAEzFSsBMxEjATMRKwEzESMlMxUrATMVIyUzFSMlMxEjKQEVIQGAgICAgIABAICAgICA/wCAgICAgAEAgIABAICA/wABAP8AA4CA/wABAP8A/wCAgICAgID/AIAAAAAAAgAAAAADgAOAABUAGQAAEyEVIRUjFTMVIRUhESMRIzUzNSM1MxcVITWAAgABAICA/wD+gICAgICAgAGAA4CAgICAgP8AAYCAgICAgIAAAAACAAAAAAKAA4AAGQAdAAABMxUhFSEVIREjNSMVMxUjFSM1IzUzESM1MwUzESMBAIABAP8AAQCAgICAgICAgID/AICAA4CAgID/AICAgICAgAGAgID+gAAAAwAAAAADgAOAAAMAHwAjAAABIRUhIzMVITUzFTMVIxUzFSMRIxEhESMRIzUzNSM1MxcVITUBAAGA/oCAgAGAgICAgICA/oCAgICAgIABgAOAgICAgICAgP8AAQD/AAEAgICAgICAAAADAAAAAAOAA4AAAwAXABsAABMhFSkBMxUzFSEVIRUhFSM1IzUhNSE1IQEhFSGAAgD+AAIAgID+gAGA/YCAgAGA/oACgP6AAgD+AAOAgICAgICAgICAgP4AgAAAAAQAAAAAAoADgAATABcAGwAfAAABMxUzFSMRMxUjFSM1IzUzESM1MwUzESMBMxUjFTMVIwEAgICAgICAgICAgP8AgIACAICAgIADgICA/oCAgICAAYCAgP6AAYCAgIAAAAIAAAAAAoADgAATABcAABMzETMRMxEzFSMRIxEjESMRIzUzATMVI4CAgICAgICAgICAAYCAgAOA/wABAP8AgP6AAYD+AAIAgP4AgAAIAAAAAAOAA4AAAwAHAAsADwAVABkAHQAjAAABIRUhIzMVIzMhFSkBMxEjJSEVIxEjATMVKwEzESMBIRUjFSMBgAIA/gCAgICAAYD+gAGAgID9AAEAgIABgICAgICAAQABAICAA4CAgID/AICA/wABgID/AAEAgIAAAAAAAgAAAAACgAOAAAMACwAAESEVIRUhFSERIxEhAoD9gAKA/wCA/wADgICAgP4AAgAABAAAAAACgAOAAA8AEwAXABsAABEhFSMVMxUhFSM1ITUhNSETMxUjOwEVIzsBFSMCgICA/wCA/wABgP6AgICAgICAgICAA4CAgICAgICA/oCAgIAAAwAAAAADAAOAABUAGQAdAAATMxUhFSEVIRUhESEVIREjNTM1IzUzATMVKwEzFSOAgAEA/wABAP8AAQD+gICAgIACAICAgICAA4CAgICA/wCAAQCAgID/AICAAAAJAAAAAAOAA4AAAwAHAAsAFwAbAB8AIwAnACsAABMzFSsBMxUjJSEVISMzFTMVIxEjNSM1MwEzESMlMxUrATMVIyUzFSMFIRUhgICAgICAAQACAP4AgICAgICAgAKAgID/AICAgICAAQCAgP6AAYD+gAOAgICAgICA/wCAgAEA/wCAgICAgICAAAAAAAMAAAAAAoACgAALAA8AEwAAATMVMxUjESMRIzUzBTMRIwEzESMBAICAgICAgP8AgIACAICAAoCAgP6AAYCAgP6AAYD+gAAAAAIAAAAAAwADgAARABUAABMhFSEVIRUhFSEVIREjESM1MwEzFSOAAgD+gAGA/oABAP8AgICAAgCAgAOAgICAgID/AAEAgAGAgAAAAAADAAAAAAMAA4AAEwAXAB8AAAEzFTM1MxUzFSMRIxEjESMRIzUzBTMRIzsBFSEVITUzAQCAgICAgICAgICA/wCAgICAAgD9AIADgICAgID/AAEA/wABAICA/oCAgIAAAAADAAAAAAKAA4AAFwAbAB8AABMzFTM1MxEhFSEVIRUhESM1IxUjNSMRMwUzFSMVMxUjgICAgP6AAYD+gAGAgICAgIABgICAgIADgICA/wCAgID/AICAgAKAgICAgAAAAAAJAAAAAAOAA4AABwALAA8AEwAdACEAJQApAC0AAAEhFSMVIzUrATMVIyUzFSMhMxEjATMVMzUzESEVIwEzESMhMxUjJTMVIykBFSEBAAGAgICAgICAAgCAgP2AgIABAICAgP8AgAIAgID9gICAAgCAgP6AAYD+gAOAgICAgICA/oABgICA/wCAAYD+gICAgIAAAAAAAwAAAYAEAAOAAA0AFQAZAAARIRUzFSMRIxEjESMRIyUzESMRIzUzBTMVIwIAgICAgICAA4CAgICA/wCAgAOAgID/AAGA/oABgID+AAEAgICAAAAAAQAAAAACgAOAAAkAAAEzESE1ITUhNSECAID9gAIA/wABAAOA/ICAgIAAAAAEAAAAAAKAA4AAAwAJAA0AEQAAEyEVISMzETMVIQEzESMpARUhgAGA/oCAgID/AAIAgID+AAIA/gADgID+gIACAP2AgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAABMxErATMVIyUzFSMhMxUjJTMVIwEAgICAgIABAICA/oCAgAIAgIADgP2AgICAgICAAAAIAAAAAAKAA4AAAwAHABMAFwAbAB8AIwAnAAARMxUjJSEVISMzFTMVMxUjFSMRIwEzESMhMxUjFzMVIyUzFSsBMxUjgIABAAEA/wCAgICAgICAAYCAgP4AgICAgIABAICAgICAA4CAgICAgICAAQABAP8AgICAgICAAAAACAAAAAAEAAOAAAcACwAPABMAGQAdACEAJQAAEzMRIxEjNTMlMxUrATMRKwEzFSMlIREjNSkBMxEjJTMRIyUzFSOAgICAgAIAgICAgICAgIABAAGAgP8A/oCAgAIAgID9gICAA4D+AAEAgICA/wCAgP8AgP8AgP8AgIAAAAgAAAAABAADgAAHAAsADwATABkAHQAhACUAABMzESMRIzUzJTMVKwEzESsBMxUjJSERIzUhJTMRKwEzFSMlMxUjgICAgIACAICAgICAgICAAQABgID/AP6AgICAgIACgICAA4D+AAEAgICA/wCAgP6AgID/AICAgAAAAAAJAAAAAAQAA4AABwALAA8AEwAbAB8AIwAnACsAABMzESMRIzUzJTMVKwEzESsBMxUjJSEVIxUjNSMhMxEjJTMVIyEzFSMlIRUhgICAgIACAICAgICAgICAAQABgICAgP6AgIACgICA/QCAgAIAAQD/AAOA/gABAICAgP8AgICAgID/AICAgICAAAAAAAoAAAAABAADgAAFAAkADQATABcAHwAjACcAKwAvAAARIREjNSMlMxUrATMRIyUzFTMVISUzFSMlIRUjFSM1IyEzESMlMxUjITMVIyUhFSEBAICAAoCAgICAgP4AgID/AAGAgIABAAGAgICA/oCAgAKAgID9AICAAgABAP8AA4D/AICAgP8AgICAgICAgICA/wCAgICAgAAACQAAAAAEAAOAAAcACwAPABMAGQAdACEAJQApAAATMxEjESM1MyUzFSsBMxErATMVIyUhFSMVISUzESMlMxUjITMVIyUhFSGAgICAgAIAgICAgICAgIABAAGAgP8A/oCAgAKAgID9AICAAgABAP8AA4D+AAEAgICA/wCAgICAgP8AgICAgIAAAAoAAAAABAADgAAFAAkADQATABcAHQAhACUAKQAtAAARIREjNSMlMxUrATMRIyUzFTMVISUzFSMlIRUjFSElMxEjJTMVIyEzFSMlIRUhAQCAgAKAgICAgID+AICA/wABgICAAQABgID/AP6AgIACgICA/QCAgAIAAQD/AAOA/wCAgID/AICAgICAgICAgP8AgICAgIAAAAAACwAAAAAEAAOAAAcACwAPABMAFwAbACEAJQApAC0AMQAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhFSMVISUzESMlMxUjITMVIyUhFSEBgICAgAKAgICAgID/AICA/wABAP8AAYCAgAEAAYCA/wD+gICAAoCAgP0AgIACAAEA/wADgICAgICA/wCAgICAgICAgID/AICAgICAAAgAAAAAA4ADgAAHAAsADwATABcAGwAhACUAABMzESMRIzUzJTMVKwEzESsBMxUjJTMVIyEzESMBMxUhESElMxUjgICAgIACAICAgICAgICAAQCAgP6AgIABAIABAP6A/oCAgAOA/gABAICAgP8AgICA/wABAID/AICAAAAKAAAAAAOAA4AABQAJAA0AEQAVABkAHQAhACcAKwAAESEVIxUhATMVKwEzESMlMxUjKQEVISUzFSMlMxUjITMRIwEzFSERISUzFSMBgID/AAKAgICAgID/AICA/wABAP8AAYCAgAEAgID+gICAAQCAAQD+gP6AgIADgICAAQCA/wCAgICAgICA/wABAID/AICAAAAACAAAAAAEAAOAAAcACwAPABMAGQAdACcAKwAAEzMRIxEjNTMlMxUrATMRKwEzFSMlIREjNSMhMxEjASEVIxUzNTMRISUzFSOAgICAgAIAgICAgICAgIABgAEAgID+AICAAQABAICAgP6A/oCAgAOA/gABAICAgP8AgID/AID/AAEAgICA/wCAgAAAAAAKAAAAAAQAA4AABwALAA8AEwAXABsAIQAlAC8AMwAAESEVIxUjNSMlMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IyEzESMBIRUjFTM1MxEhJTMVIwGAgICAAoCAgICAgP8AgID/AAEA/wABgICAAYABAICA/gCAgAEAAQCAgID+gP6AgIADgICAgICA/wCAgICAgID/AID/AAEAgICA/wCAgAAAAAoAAAAABAADgAAFAAkADQARABUAGQAfACMALQAxAAARIRUjFSEBMxUrATMRIyUzFSMpARUhJTMVIyUhESM1IyEzESMBIRUjFTM1MxEhJTMVIwGAgP8AAoCAgICAgP8AgID/AAEA/wABgICAAYABAICA/gCAgAEAAQCAgID+gP6AgIADgICAAQCA/wCAgICAgID/AID/AAEAgICA/wCAgAAJAAAAAAQAA4AABQAJAA0AEQAVABsAHwApAC0AABEhESM1ISUzFSsBMxEjJTMRIyUzFSMlIREjNSMhMxEjASEVIxUzNTMRISUzFSMBgID/AAKAgICAgID+gICAAQCAgAGAAQCAgP4AgIABAAEAgICA/oD+gICAA4D/AICAgP8AgP8AgICA/wCA/wABAICAgP8AgIAABgAAAAADAAOAAAcACwAPABMAFwAbAAATMxEjESM1MyUzFSsBMxErATMVKwEzESsBMxUjgICAgIACAICAgICAgICAgICAgICAA4D+AAEAgICA/wCA/wCAAAwAAAAABAADgAADAAcACwAPABMAFwAbACMAJwArAC8AMwAAEzMVIyUzFSMhMxEjATMRIwEzESMhMxUjJTMVIyUhFSMVIzUjITMRIyUzFSMhMxUjJSEVIYCAgAIAgID9gICAAQCAgAEAgID+gICAAQCAgAEAAYCAgID+gICAAoCAgP0AgIACAAEA/wADgICAgP8AAQD/AAEA/wCAgICAgICA/wCAgICAgAAAAAABAAAAgAOAAwAADwAAATMRIRUhESM1IzUjNTM1MwEAgAIA/gCAgICAgAMA/wCA/wCAgICAAAAAAAEAAAAAAoADgAAPAAABMxUzFTMVIREjESE1MzUzAQCAgID/AID/AICAA4CAgID+AAIAgIAAAAAAAQAAAIADgAMAAA8AAAEzFTMVMxUjFSMVIxEhNSECAICAgICAgP4AAgADAICAgICAAQCAAAEAAAAAAoADgAAPAAABMxEhFSMVIxUjNSM1IzUhAQCAAQCAgICAgAEAA4D+AICAgICAgAABAAAAgAQAAwAAGwAAATMRIREzFTMVMxUjFSMVIxEhESM1IzUjNTM1MwEAgAEAgICAgICA/wCAgICAgAMA/wABAICAgICAAQD/AICAgIAAAAIAAACAA4ADgAALABcAAAEzFTMVIxUjNSE1IQEzFSEVIRUjNSM1MwKAgICAgP2AAoD+AIACgP2AgICAA4CAgICAgP8AgICAgIAAAAACAAAAgAQAAwAAGwAfAAABMxUzNTMVMxUhFSEVIxUjNSEVIzUjNSE1ITUhBTMVIwGAgICAgP4AAgCAgP6AgIABAP8AAYACAICAAwCAgICAgICAgICAgICAgIAAAAMAAACABAADAAAHAAsAEwAAATMVMxUhNSEFMxUjKQEVIxUjNSECgICA/IACgAEAgID8gAOAgID9gAMAgICAgICAgIAABAAAAIAEAAMAAAsADwATAB8AAAEzFSE1MxUzFSE1MwUzFSMlMxUjKQEVIxUjNSEVIzUjAQCAAQCAgP0AgP8AgIADgICA/QADAICA/wCAgAMAgICAgICAgICAgICAgIAAAgAAAAADAAOAAAsAFwAAEzMRMxUjFSM1IzUzATMVMxUjESMRIzUzgICAgICAgAGAgICAgICAA4D9gICAgIACgICA/YACgIAABgAAAAADgAOAAAMABwAPABMAFwAbAAARMxEjATMRIykBESM1IRUjOwERIwEzESsBMxUjgIADAICA/YACgID+gICAgIABAICAgICAA4D/AAEA/wD/AICA/wABAP8AgAAABQAAAAACAAOAAAMABwALAA8AEwAAEyEVISMzESMBMxUjETMVIykBFSGAAQD/AICAgAGAgICAgP8AAQD/AAOAgP2AAoCA/oCAgAAAAAYAAAAAAoADgAADAAcADwATABcAGwAAASEVISMzFSMlMxEjNSE1IQUzESMlMxUjKQEVIQEAAQD/AICAgAGAgID+gAGA/gCAgAGAgID/AAEA/wADgICAgP4AgICA/wCAgIAAAAABAAAAAAKAA4AACwAAESERITUhESE1IREhAoD9gAIA/gACAP4AA4D8gIABAIABAAADAAD/gAKAA4AADQARABUAABEhESEVIxEzESM1IREpAREzEQERIRECgP4AgICAAQD/AAGAgP8AAQADgPyAgAEAAQCAAQD/AAEA/oD/AAEAAA0AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzAAABIRUhJTMVIyEzFSMlMxUjITMRIwEzFSMlMxEjATMVKwEzFSsBMxUjJTMVIyEzFSMlIRUhAQABgP6AAgCAgP2AgIACAICA/YCAgAIAgIABAICA/oCAgICAgICAgAIAgID9gICAAQABgP6AA4CAgICAgID+gAGAgID+gAEAgICAgICAgIAAAAAFAAAAAAKAA4AAAwAHAA8AEwAXAAABIRUhIzMVKwEzFSEVIRUjOwEVIzMhFSEBAAGA/oCAgICAgAIA/gCAgICAgAGA/oADgICAgICAgIAAAAYAAAAAAoADgAAFAAkAGQAdACEAJQAAASERIzUhIzMVKwEzFSE1MxUzFSEVIzUjFSM7ARUrATMVIyUhFSEBAAGAgP8AgICAgIABAICA/wCAgICAgICAgIABAAGA/oADgP8AgICAgICAgICAgICAgAAFAAAAAAKAA4AAAwAHAA8AEwAXAAARIRUpATMVIzsBESM1ITUhAzMVIykBFSEBgP6AAYCAgICAgP4AAgCAgID+gAGA/oADgICA/oCAgP8AgIAAAAAGAAAAAAKAA4AAAwAHAAsAGwAhACUAABEhFSElMxUrATMVKwEzFTM1MxEjNSEVIzUjNSEBMxUhFSEBMxUjAYD+gAIAgICAgICAgICAgP8AgIABAP8AgAEA/oABgICAA4CAgICAgID+gICAgID/AICAAQCAAAUAAAAAAoADgAAFAAkADQARABcAABEhFSEVIzsBFSM7ARUrATMVKwEzFSEVIQKA/gCAgICAgICAgICAgIACAP2AA4CAgICAgICAAAABAAABgAKAAgAAAwAAESEVIQKA/YACAIAAAAAAAgAAAAACgAOAAAMADwAAESEVIQUzESEVIREjESE1IQKA/YABAIABAP8AgP8AAQADgICA/wCA/wABAIAAAQGAAQACgAIAAAMAAAEhESEBgAEA/wACAP8AAAMAAAAAAwADgAAHAAsADwAAASEVIREhNTMBMxUjOwEVIwGAAYD/AP8AgP6AgICAgIADgID9AIABAICAAAUAAAAAA4ADgAAHAA8AEwAXABsAABEhFSMVIzUjJSEVIREhNTMBMxUjKQEVIQUzFSMBgICAgAIAAYD/AP8AgP8AgID/AAEA/wABAICAA4CAgICAgP0AgAIAgICAgAAAAAMAAAAAA4ADgAALABMAFwAAEyERIzUhETMVMzUjJSEVIREhNTMlMxUjgAEAgP8AgICAAYABgP8A/wCA/wCAgAOA/gCAAQCAgICA/QCAgIAABgAAAIADAAKAAAMABwALAA8AEwAXAAATIRUhJSEVKQEzESMBMxEjKQEVISUhFSGAAQD/AAGAAQD/AP4AgIABgICA/wABAP8AAYABAP8AAoCAgID/AAEA/wCAgIAAAAAABwAAAIADgAKAAAMABwALAA8AEwAXABsAABMhFSElIRUpATMRIwEzESMBMxEjKQEVISUhFSGAAQD/AAGAAQD/AP4AgIABgICAAYCAgP2AAQD/AAGAAQD/AAKAgICA/wABAP8AAQD/AICAgAAAAgAAAAABgAOAAAMABwAAETMRIwEzESOAgAEAgIADgPyAA4D8gAAAAAUAAACAAoADAAADAAcACwAPABMAAAEzFSsBMxEjATMRIyEzESMBMxEjAQCAgICAgAEAgID+gICAAgCAgAMAgP8AAQD/AP8AAQD/AAAFAAAAgAKAAwAAAwAHAAsADwATAAARMxEjATMRIyEzESMBMxErATMVI4CAAgCAgP6AgIABAICAgICAAwD/AAEA/wD/AAEA/wCAAAAAAwAAAAACgAOAAAMABwALAAATIRUhIzMRIwEzESOAAYD+gICAgAIAgIADgID9AAMA/QAAAAMAAP+AAoADgAADAAcACwAAASEVISMzESMpARUhAYABAP8AgICA/wABAP8AA4CA/QCAAAAFAAD/gAKAA4AAAwAXABsAHwAjAAABIRUhIzMVMxUjFTMVIxEjESM1MzUjNTMFMxUjJTMVIwEhFSEBgAEA/wCAgICAgICAgICAgP8AgIACAICA/gABAP8AA4CAgICAgP8AAQCAgICAgICA/oCAAAAAAwAAAIACgAMAAAMABwALAAABMxUjATMVIyUzFSMBAICA/wCAgAIAgIADAID+gICAgAAAAAMAAACAAoADAAADAAcACwAAETMVIyUzFSMBMxUjgIACAICA/wCAgAMAgICA/oCAAAgAAACAAwADAAADAAcACwAPABMAFwAbAB8AABMhFSElMxUjITMVIyUhFSEFIRUhJTMVIyEzFSMlIRUhgAEA/wACAICA/YCAgAGAAQD/AP8AAQD/AAIAgID9gICAAYABAP8AAwCAgICAgICAgICAgICAAAAABAAAAQADgAKAAAMABwALAA8AABEzFSMlIRUhBTMVIyUhFSGAgAEAAoD9gP8AgIABAAKA/YACgICAgICAgIAAAAEAAAAAAoADAAATAAABMxUzFSERIRUhFSM1IzUhESE1IQGAgID/AAEA/oCAgAEA/wABgAMAgID/AICAgIABAIAAAAAAAwAAAIADAAMAAAMABwALAAARIRUhFSEVIRUhFSEDAP0AAwD9AAMA/QADAICAgICAAAAAAAEAAAAAAwADgAAbAAABMxUzFSEVIRUhFSEVIRUjNSM1ITUhNSE1ITUhAgCAgP8AAQD+gAGA/gCAgAEA/wABgP6AAgADgICAgICAgICAgICAgIAAAAYAAAAAAoADgAADAAcACwAPABMAFwAAATMVKwEzFSsBMxUjOwEVIzsBFSMFIRUhAYCAgICAgICAgICAgICAgP6AAoD9gAOAgICAgICAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATMxUjOwEVIzsBFSsBMxUrATMVIwchFSGAgICAgICAgICAgICAgICAAoD9gAOAgICAgICAgAAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAABIRUhIzMVKwEzESM7ARUjMyEVIQEAAYD+gICAgICAgICAgIABgP6AA4CAgP6AgIAAAAAFAAAAAAKAA4AAAwAHAAsADwATAAARIRUpATMVIzsBESsBMxUjKQEVIQGA/oABgICAgICAgICA/oABgP6AA4CAgP6AgIAAAAAHAAAAAAKAA4AABQAJABEAFQAZAB0AIQAAASERIzUhIzMVKwEzETMRIzUjATMVKwEzFSMBMxUjJSEVIQEAAYCA/wCAgICAgICAgAGAgICAgID/AICAAQABgP6AA4D/AICA/wD/AIABgICA/wCAgIAABwAAAAACgAOAAAMABwAPABMAFwAdACEAABEhFSElMxUrATMVMxEjESsBMxUrATMVKwEzFSEVIQEzFSMBgP6AAgCAgICAgICAgICAgICAgIABAP6AAYCAgAOAgICAgP6AAQCAgICAAQCAAAAABAAAAAACgAOAAAMABwALAA8AABMhFSEjMxEjMyEVIQchFSGAAgD+AICAgIACAP4AgAKA/YADgID+gICAgAAAAAQAAAAAAoADgAADAAcACwAPAAARIRUpATMRIykBFSEVIRUhAgD+AAIAgID+AAIA/gACgP2AA4CA/oCAgIAAAAABAAAAgAKAAwAABwAAETMRIRUhESOAAgD+AIADAP8AgP8AAAABAAAAgAKAAwAABwAAESEVIREjESECgP8AgP8AAwCA/gACAAABAAAAgAKAAwAABwAAATMRIRUhNSEBAIABAP2AAQADAP4AgIAAAAAAAQAAAIACgAMAAAsAABEzFSEVIRUhFSEVI4ACAP4AAgD+AIADAICAgICAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEzFSMlMxUjITMVIyUzFSsBMxUjBSEVIYCAAgCAgP6AgIABAICAgICA/wACgP2AAwCAgICAgICAgIAAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEhFSEFMxUrATMVIyUzFSMhMxUjJTMVIwKA/YABAICAgICAAQCAgP6AgIACAICAAwCAgICAgICAgIAAAAAGAAAAgAKAAwAAAwAHAAsADwATABcAABEhFSEVMxUjJTMVIyEzFSMlMxUrATMVIwKA/YCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAAAMAAAAAAoADgAADAAcACwAAETMRIwEzESMpARUhgIACAICA/oABgP6AA4D9AAMA/QCAAAAFAAABAAGAAoAAAwAHAAsADwATAAARMxUjJTMVKwEzFSsBMxUjJTMVI4CAAQCAgICAgICAgAEAgIACgICAgICAgIAAAA0AAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzAAABIRUhJTMVIyEzFSMlMxUjITMRIwEzFSMlMxEjATMVKwEzFSsBMxUjJTMVIyEzFSMlIRUhAQABgP6AAgCAgP2AgIACAICA/YCAgAIAgIABAICA/oCAgICAgICAgAIAgID9gICAAQABgP6AA4CAgICAgID+gAGAgID+gAEAgICAgICAgIAAAAAGAAAAAAOAA4AAAwAHAAsADwATABsAAAEzFSsBMxUjJTMVIyEzFSMlMxUjITMRIREzESEBgICAgICAAQCAgP6AgIACAICA/YCAAoCA/IADgICAgICAgID+gAGA/gAAAAAKAAAAAAOAA4AAAwAHAAsAJwArAC8AMwA3ADsAPwAAEzMVIyUzFSMhMxUjJTMVMzUzFTMVIxUzFSMVIzUjFSM1IzUzNSM1MxcVMzUBMxUjATMVIyUzFSMhMxUjJTMVI4CAgAIAgID9gICAAQCAgICAgICAgICAgICAgICAAQCAgP0AgIADAICA/YCAgAIAgIADgICAgICAgICAgICAgICAgICAgICAgAEAgP6AgICAgICAAAAEAAAAAAOAA4AACQANABEAFQAAEyEVIREzFSERISMzESMBMxEjKQEVIYACgP8AgP8A/wCAgIADAICA/YACgP2AA4CA/wCAAYD9gAKA/YCAAAQAAAAAA4ADgAALAA8AEwAfAAARIRUjESMRIREjESMBMxUjJTMVIyEzESERMxEzFSE1MwOAgID+gICAAQCAgAEAgID+gIABgICA/ICAA4CA/wABAP8AAQD/AICAgP8AAQD/AICAAAAAAwGA/4ADgAOAAAMABwALAAABIRUhIzMRIwEzESMCAAEA/wCAgIABgICAA4CA/IADgP8AAAMAAP+AAgADgAADAAcACwAAATMRIwEzESMzIRUhAYCAgP6AgICAAQD/AAOA/IABAP8AgAACAAAAgAKAAwAACwAPAAABMxUzFTMVITUzNTMBIRUhAQCAgID9gICA/wACgP2AAwCAgICAgP6AgAAAAAABAAAAgAMAAwAAFwAAETMVMxUzETMVMxUzFSMVIxUjESMVIxUjgICAgICAgICAgICAAwCAgAEAgICAgIABAICAAAAAAAEAAACAAwADAAAXAAABMxEzNTM1MxEjNSM1IxEjNSM1IzUzNTMBAICAgICAgICAgICAgAMA/wCAgP2AgID/AICAgIAAAQAAAIADgAMAABsAABEzFTMVMxEzFTMVMxEzESMRIxUjFSMRIxUjFSOAgICAgICAgICAgICAgAMAgIABAICAAQD9gAEAgIABAICAAAEAAACAA4ADAAAbAAARMxEzNTM1MxEzNTM1MxEjNSM1IxEjNSM1IxEjgICAgICAgICAgICAgIADAP8AgID/AICA/YCAgP8AgID/AAACAAAAgAMAAwAADwATAAARMxUzFTMRMxEjESMVIxUjATMRI4CAgICAgICAAoCAgAMAgIABAP2AAQCAgAKA/YAAAQAAAIABgAMAAAsAAAEzESM1IzUjNTM1MwEAgICAgICAAwD9gICAgIAAAAABAAAAgAGAAwAACwAAETMVMxUzFSMVIxUjgICAgICAAwCAgICAgAAAAQAAAQACgAKAAAsAAAEzFTMVMxUhNTM1MwEAgICA/YCAgAKAgICAgIAAAAABAAABAAKAAoAACwAAESEVIxUjFSM1IzUjAoCAgICAgAKAgICAgIAAAgAAAIABgAMAAAMABwAAETMRIwEzESOAgAEAgIADAP2AAoD9gAAAAAEAAACAAoADAAADAAARIREhAoD9gAMA/YAAAAABAAAAgAKAAwAACwAAEyEVMxEjFSE1IxEzgAGAgID+gICAAwCA/oCAgAGAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AAAEzESMBMxUjJTMVIyEzESMBMxEjITMVIyUzFSMpARUhAYCAgP8AgIACAICA/YCAgAMAgID9gICAAgCAgP6AAYD+gAOA/oABAICAgP6AAYD+gICAgIAAAAAACQAAAAADgAOAAAMABwALAA8AEwAXABsAHwAjAAABIRUhIzMVIyUzFSMhMxEjATMRIwEzESMhMxUjJTMVIykBFSEBAAGA/oCAgIACAICA/YCAgAGAgIABgICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oABgP6AgICAgAAAAAABAAAAAACAA4AAAwAAETMRI4CAA4D8gAABAAABAAQAAYAAAwAAESEVIQQA/AABgIAAAAAAAQGA/4ACgAOAAAMAAAEhESEBgAEA/wADgPwAAAEBgP+ABAABgAAFAAABIRUhESEBgAKA/oD/AAGAgP6AAAAAAAEAAP+AAoABgAAFAAARIREhESECgP8A/oABgP4AAYAAAQGAAQAEAAOAAAUAAAEhESEVIQGAAQABgP2AA4D+AIAAAAAAAQAAAQACgAOAAAUAAAEhESE1IQGAAQD9gAGAA4D9gIAAAAAAAQGA/4AEAAOAAAcAAAEhESEVIREhAYABAAGA/oD/AAOA/gCA/oAAAAEAAP+AAoADgAAHAAABIREhESE1IQGAAQD/AP6AAYADgPwAAYCAAAABAAD/gAQAAYAABwAAESEVIREhESEEAP6A/wD+gAGAgP6AAYAAAAAAAQAAAQAEAAOAAAcAAAEhESEVITUhAYABAAGA/AABgAOA/gCAgAAAAAEAAP+ABAADgAALAAABIREhFSERIREhNSEBgAEAAYD+gP8A/oABgAOA/gCA/oABgIAAAAACAAABAAQAAoAAAwAHAAARIRUhFSEVIQQA/AAEAPwAAoCAgIAAAAAAAgEA/4ADgAOAAAMABwAAASERIQEhESEBAAEA/wABgAEA/wADgPwABAD8AAABAYD/gAQAAoAACQAAASEVIRUhFSERIQGAAoD+gAGA/oD/AAKAgICA/oAAAAEBAP+ABAABgAAJAAABIRUjESERIxEhAQADAID/AID/AAGAgP6AAYD+gAAAAgEA/4AEAAKAAAUACwAAASEVIREhASEVIxEhAQADAP4A/wABgAGAgP8AAoCA/YACAID+gAAAAAABAAD/gAKAAoAACQAAESERIREhNSE1IQKA/wD+gAGA/oACgP0AAYCAgAAAAAEAAP+AA4ABgAAJAAARIREhESMRIREhA4D/AID/AP8AAYD+AAGA/oABgAAAAgAA/4ADgAKAAAUACwAAESERIREhFSERIREhA4D/AP2AAgD/AP8AAoD9AAKAgP4AAYAAAAEBgAEABAADgAAJAAABIREhFSEVIRUhAYABAAGA/oABgP2AA4D/AICAgAAAAQEAAQAEAAOAAAkAAAEhETMRIREzFSEBAAEAgAEAgP0AA4D+AAIA/gCAAAACAQABAAQAA4AABQALAAABIREhFSEBIREzFSEBAAEAAgD9AAGAAQCA/oADgP4AgAKA/wCAAAAAAAEAAAEAAoADgAAJAAABIREhNSE1ITUhAYABAP2AAYD+gAGAA4D9gICAgAAAAQAAAQADgAOAAAkAAAEhETMRIREhNSEBAAEAgAEA/IABAAOA/gACAP2AgAACAAABAAOAA4AABQALAAABIREhNSEBIREhNSEBAAEA/gABAAGAAQD8gAKAA4D+gIABAP2AgAAAAAEBgP+ABAADgAALAAABIREhFSEVIRUhESEBgAEAAYD+gAGA/oD/AAOA/wCAgID+gAAAAAACAQD/gAQAA4AAAwALAAABIREhASERMxUjESEBAAEA/wABgAEAgID/AAOA/AAEAP4AgP6AAAAAAAMBAP+ABAADgAADAAkADwAAASERIQEhETMVIRUhFSMRIQEAAQD/AAGAAQCA/oABgID/AAOA/AAEAP8AgICA/oAAAAAAAQAA/4ACgAOAAAsAAAEhESERITUhNSE1IQGAAQD/AP6AAYD+gAGAA4D8AAGAgICAAAAAAAIAAP+AA4ADgAAHAAsAAAEhESERITUhASERIQEAAQD/AP8AAQABgAEA/wADgPwAAYCAAgD8AAAAAwAA/4ADgAOAAAUACQAPAAABIREhNSEBIREhASERIREhAQABAP4AAQABgAEA/wD9gAIA/wD/AAOA/oCAAQD8AAIA/gABgAAAAgAA/4AEAAKAAAMACwAAESEVIRUhFSERIREhBAD8AAQA/oD/AP6AAoCAgID+gAGAAAAAAAEAAP+ABAABgAALAAARIRUjESERIxEhESEEAID/AID/AP8AAYCA/oABgP6AAYAAAAMAAP+ABAACgAADAAkADwAAESEVIRUhESERISUhFSMRIQQA/AACAP8A/wACgAGAgP8AAoCAgP4AAYCAgP6AAAACAAABAAQAA4AABwALAAABIREhFSE1IQEhFSEBgAEAAYD8AAGA/oAEAPwAA4D/AICA/wCAAAAAAAEAAAEABAADgAALAAABIREzESERMxUhNSEBAAEAgAEAgPwAAQADgP4AAgD+AICAAAMAAAEABAADgAAFAAsADwAAASERITUhASERMxUhBSEVIQEAAQD+AAEAAYABAID+gP2ABAD8AAOA/oCAAQD/AICAgAAAAQAA/4AEAAOAABMAAAEhESEVIRUhFSERIREhNSE1ITUhAYABAAGA/oABgP6A/wD+gAGA/oABgAOA/wCAgID+gAGAgICAAAAAAQAA/4AEAAOAABMAAAEhETMRIREzFSMRIREjESERITUhAQABAIABAICA/wCA/wD/AAEAA4D+AAIA/gCA/oABgP6AAYCAAAAABAAA/4AEAAOAAAUACwARABcAAAEhESE1IQEhETMVIQUhESERISUhFSMRIQEAAQD+AAEAAYABAID+gP2AAgD/AP8AAoABgID/AAOA/oCAAQD/AICA/gABgICA/oAAAAAAAQAAAYAEAAOAAAMAABEhESEEAPwAA4D+AAAAAAEAAP+ABAABgAADAAARIREhBAD8AAGA/gAAAAABAAD/gAQAA4AAAwAAESERIQQA/AADgPwAAAAAAQAA/4ACAAOAAAMAABEhESECAP4AA4D8AAAAAAECAP+ABAADgAADAAABIREhAgACAP4AA4D8AAAQAAD/gAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzFSMhMxUjJTMVIwEAgIACAICA/QCAgAIAgID/AICAAgCAgP0AgIACAICA/wCAgAIAgID9AICAAgCAgP8AgIACAICA/QCAgAIAgIADgICAgICAgICAgICAgICAgICAgICAgICAgAAAACAAAP+ABAADgAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AABMzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjITMVIyUzFSMlMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyUzFSMlMxUjgICAAQCAgAEAgIABAICA/ICAgAEAgIABAICAAQCAgP2AgIABAICAAQCAgAEAgID8gICAAQCAgAEAgIABAICA/YCAgAEAgIABAICAAQCAgPyAgIABAICAAQCAgAEAgID9gICAAQCAgAEAgIABAICA/ICAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAABwAA/4AEAAOAACkALQAxADUAOQA9AEEAABEhFTM1IRUjFTMVMzUjNTM1IREjFTMRIxUhNSM1IxUzFSERMzUjETM1IwUVMzUdATM1BRUzNSEVMzUFFTM1HQEzNQEAgAEAgICAgIABAICAgP6AgICA/oCAgICAAQCAgP8AgAEAgP8AgIADgICAgICAgICA/oCA/oCAgICAgAEAgAGAgICAgICAgICAgICAgICAgICAAAABAAAAgAKAAwAAAwAAESERIQKA/YADAP2AAAAAAgAAAIACgAMAAAMABwAAESERIRMRIRECgP2AgAGAAwD9gAIA/oABgAAAAAABAAAAgAKAA4AACwAAATMRMxEzESERMxEzAQCAgID9gICAA4D/AP8A/wABAAEAAAAEAAAAgAKAA4AAAwAHAAsAEwAAATMRKwEzESMBMxEjITMVITUzESEBAICAgICAAQCAgP6AgAGAgP2AA4D/AP8AAQD/AICA/wAAAAAAAQAAAIADAAMAAAsAABEhFSEVIRUhFSEVIQEAAQABAP8A/wD/AAMAgICAgIAAAAAABAAAAIADAAMAAAcACwAPABMAABEhFSMRMxUhASEVKQIVKQIVIQEAgID/AAEAAQD/AAEAAQD/AP8AAQD/AAMAgP6AgAIAgICAAAAAAAEAAACAAoADgAALAAARIREjESMRIxEjESMCgICAgICAA4D/AP8A/wABAAEAAAAAAAQAAACAAoADgAAHAAsADwATAAARIREjNSEVIzsBESMBMxErATMRIwKAgP6AgICAgAEAgICAgIADgP8AgID/AAEA/wD/AAAAAAEAAACAAwADAAALAAABIREhNSE1ITUhNSECAAEA/wD/AP8AAQABAAMA/YCAgICAAAQAAACAAwADAAAHAAsADwATAAABIREhNTMRIykBFSkCFSkCFSECAAEA/wCAgP8AAQD/AP8AAQD/AAEAAQD/AAMA/YCAAYCAgIAAAAABAAAAgAKAAwAAEwAAATMVMxUzFSMVIxUjNSM1IzUzNTMBAICAgICAgICAgIADAICAgICAgICAgAAAAAAIAAAAgAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgICAgICAgIAAAAQAAACAAoADAAADAAcACwAPAAATIRUhIzMRIwEzESMpARUhgAGA/oCAgIACAICA/oABgP6AAwCA/oABgP6AgAAKAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwAAASEVISMzFSMlMxUjITMRIwEhESETFTM1JTMRIyEzFSMlMxUjKQEVIQEAAYD+gICAgAIAgID9gICAAQABgP6AgIABAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oABAICAgP6AgICAgAAAAAEAAACAAgACgAALAAATIRUzESMVITUjETOAAQCAgP8AgIACgID/AICAAQAAAgAAAQABgAKAAAMABwAAESERIRMVMzUBgP6AgIACgP6AAQCAgAAAAAQAAAEAAYACgAADAAcACwAPAAATMxUrATMVIyUzFSsBMxUjgICAgICAAQCAgICAgAKAgICAgIAADQAA/4AEAAOAAAMABwALAA8AEwAfACMAJwArAC8AMwA3ADsAABEzFSMlMxUjJTMVIyEzFSMlMxUjKQEVMxEjFSE1IxEzITMVIyEzFSMXMxUjJTMVIyEzFSMlMxUjJTMVI4CAAYCAgAIAgID9AICAAoCAgP6AAQCAgP8AgIACAICA/ICAgICAgAKAgID9AICAAgCAgAGAgIADgICAgICAgICAgP8AgIABAICAgICAgICAgICAAAAAAAcAAACABAADgAADAAcACwAPABMAFwAbAAABIRUhIzMVIyUzESMlIRUhIzMRIwEzESMpARUhAgABAP8AgICAAYCAgP2AAQD/AICAgAOAgID9AAMA/QADgICAgP8AgID/AAEA/wCAAAAABgAA/4ADgAOAAAMABwALABcAGwAfAAABIRUhIzMVIyUzFSMhMxUhNTMRIREjESETMxUjOwEVIwEAAYD+gICAgAIAgID9gIACgID+gID+gICAgICAgAOAgICAgICA/wD+gAGA/wCAgAAIAAD/gAOAA4AAAwAHAAsAGwAfACMAJwArAAATMxUjJSEVISUzFSMhMxEhETMVMxUjFSERIxEjJTMVIzsBESMBMxEjKQEVIYCAgAEAAQD/AAGAgID+AIABAICAgP8AgID/AICAgICAAoCAgP4AAgD+AAOAgICAgID/AAEAgICA/wABAICA/oABgP6AgAAAAAALAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAAABMxUjJTMVIyEzFSMlMxUrATMVIykBFSElMxUjITMRIwEzESMBMxUjBSEVIQGAgIABgICA/gCAgAGAgICAgID+gAEA/wACgICA/QCAgAGAgIABAICA/gABAP8AA4CAgICAgICAgICA/wABAP8AAQCAgIAAAQAAAAADgAOAABMAAAEzFTMVIREjESE1IxUhESMRITUzAYCAgAEAgP8AgP8AgAEAgAOAgID/AP6AgIABgAEAgAAAAAAIAAAAAAOAA4AAAwAHAAsAEQAXAB0AIwAnAAABMxUrATMVIyUzFSMpARUjFSMBIREjNSMFMxEzFSEBMxEhNTMlMxUjAYCAgICAgAEAgID+AAEAgIACgAEAgID+AICA/wACAID/AID/AICAA4CAgICAgIABAP8AgID/AIABgP6AgICAAAAFAAAAAAOAA4AACQANABEAFQAdAAARIRUjFSM1IREjATMVKwEzFSM7ARUjJTMRITUzNTMDgICA/gCAAgCAgICAgICAgAEAgP6AgIADgICAgP0AAoCAgICA/oCAgAAAAAAJAAD/gAOAA4AABQAJAA0AEQAVABkAJQApAC0AAAEzFSEVIQEzFSMhMxUjJTMVIyEzFSMlMxUjITMVITUzESERIxEhFzMVIzsBFSMBAIABAP6AAYCAgP2AgIADAICA/YCAgAIAgID9gIACgID+gID+gICAgICAgAOAgIABAICAgICAgICAgP8A/wABAICAgAACAAAAAAOAA4AAGwAfAAATIRUzESMRIzUjESERIREjESERIREjFSMRIxEzATMVI4ACgICAgIABAP8AgP8AAQCAgICAAQCAgAOAgP4A/wCAAQABAP8AAQD/AP8AgAEAAgD9gIAAAwAAAIACgAMAAAMABwALAAARIRUhFSEVIRUhFSECgP2AAoD9gAKA/YADAICAgICAAAAAAAQAAACAAoADAAADAAcACwAPAAARIRUhJSEVIQUhFSEVIRUhAQD/AAGAAQD/AP6AAoD9gAKA/YADAICAgICAgIAAAAAABAAAAIACgAMAAAMABwALAA8AABEhFSEVIRUhJSEVIQUhFSECgP2AAQD/AAGAAQD/AP6AAoD9gAMAgICAgICAgAAAAAAFAAAAgAKAAwAAAwAHAAsADwATAAARIRUhJSEVIQUhFSElIRUhBSEVIQEA/wABgAEA/wD+gAEA/wABgAEA/wD+gAKA/YADAICAgICAgICAgAAAAAAEAAAAgAKAAwAAAwAHAAsADwAAESEVIRUhFSEVIRUhJSEVIQKA/YACgP2AAQD/AAGAAQD/AAMAgICAgICAgAAABQAAAIACgAMAAAMABwALAA8AEwAAESEVISUhFSEFIRUhFSEVISUhFSEBAP8AAYABAP8A/oACgP2AAQD/AAGAAQD/AAMAgICAgICAgICAAAAFAAAAgAKAAwAAAwAHAAsADwATAAARIRUhFSEVISUhFSEFIRUhJSEVIQKA/YABAP8AAYABAP8A/oABAP8AAYABAP8AAwCAgICAgICAgIAAAAYAAACAAoADAAADAAcACwAPABMAFwAAESEVISUhFSEFIRUhJSEVIQUhFSElIRUhAQD/AAGAAQD/AP6AAQD/AAGAAQD/AP6AAQD/AAGAAQD/AAMAgICAgICAgICAgIAAAAUAAACAAoADAAADAAcACwAPABMAABMzESMBMxEjBSEVISMzFSMlMxUjgICAAQCAgP8AAYD+gICAgAIAgIADAP8AAQD/AICAgICAAAAFAAAAgAKAAwAAAwAHAAsADwATAAATMxEjATMRIwUzFSMlMxUjKQEVIYCAgAEAgID+gICAAgCAgP6AAYD+gAMA/wABAP8AgICAgIAABgAAAAADgAOAAAsADwATABcAGwAfAAATIRUzESMVITUjETsBETMRMxEzEQEVMzUhFTM1BRUhNYACgICA/YCAgICAgID+AIABgID+AAGAA4CA/YCAgAKA/wABAP8AAQD+gICAgICAgIAAAAAAAQAA/4AEAAOAABsAAAEhFTMVMxEjFSMVITUjNSMRMxUzFSE1MxEjNSMCAAEAgICAgP4AgICAgAGAgICAA4CAgP4AgICAgAEAgICAAYCAAAACAAAAAAGAAwAADwATAAARIREjFTMVIxUjNSM1MzUjExUzNQGAgICAgICAgICAAwD+gICAgICAgAEAgIAAAAAAAwAAAIACgAMAAAcACwAPAAABIREjNSM1IwUhESETFTM1AQABgICAgP8AAYD+gICAAwD+gICAgP6AAQCAgAAAAAEAAAAAAoADAAATAAABMxUzFTMRIRUzFSE1MzUhETM1MwEAgICA/wCA/oCA/wCAgAMAgID/AICAgIABAIAAAAAIAAAAAAKAAwAAAwAHAAsADwATABcAGwAfAAATMxUjJTMVIyEzESMBMxUjJTMRIyEzFSMlMxUrATMVI4CAgAEAgID+gICAAQCAgAEAgID+gICAAQCAgICAgAMAgICA/oABgICA/oCAgICAAAAIAAAAAAKAAwAAAwAHAAsADwATABcAGwAfAAABMxUrATMVIyUzFSMhMxEjATMRIyEzFSMlMxUrATMVIwEAgICAgIABAICA/oCAgAIAgID+gICAAQCAgICAgAMAgICAgP8AAQD/AICAgIAAAAABAAAAAAKAAwAADwAAEyERMxEhFTMVITUzNSERM4ABgID/AID+gID/AIADAP8A/wCAgICAAQAAAAYAAAAAAoADAAADAAcACwARABcAHwAAATMVKwEzFSMlMxUjITMVMxUhATMRITUzBTMVMxUhNTMBAICAgICAAQCAgP6AgID/AAIAgP8AgP8AgID+gIADAICAgICAgAEA/wCAgICAgAAAAQAAAAACgAMAABMAABMzFTM1MxUzESMVIxUjNSM1IxEzgICAgICAgICAgIADAICAgP6AgICAgAGAAAAAAQAAAAACgAMAABMAAAEzFTMVMxEjFSMVIzUjNSMRMzUzAQCAgICAgICAgICAAwCAgP8AgICAgAEAgAAABAAAAAACgAMAAAcADQATABsAABMhESM1IxUrATMVMxUhATMRITUzBTMVMxUhNTOAAYCAgICAgID/AAIAgP8AgP8AgID+gIADAP8AgICAgAEA/wCAgICAgAAAAAABAAAAAAGAA4AABQAAATMRIREhAQCA/oABAAOA/IABAAAAAAABAAAAAAKAA4AACwAAASEVMxEjNSMRIREhAQABAICAgP6AAQADgID/AID9gAEAAAACAAAAAAOAA4AABwAPAAABIREhESERKQIVIxEhESECAAGA/oABAP8A/wABAID+gAEAA4D9AAEAAYCA/YABAAAAAgAAAAADgAOAAAsADwAAASERIREhESERIREhExUhNQEAAoD+gAEA/oD+gAEAgAGAA4D8gAEAAQD+AAEAAgCAgAAAAAABAAAAAAGAA4AACwAAETMRIREjESMRMxUhgAEAgICA/wADgP6A/oABAP8AgAAAAAACAAAAAAGAA4AACwAPAAARMxEzNTMRIxEjFSMTFTM1gICAgICAgIADgP8AgP0AAQCAAYCAgAAAAAIAAAAAAoADgAAbAB8AAAEzFTMVIxUzFSMRIzUjESM1IzUzNSM1MxEzFTMHFTM1AYCAgICAgICAgICAgICAgICAA4CAgICA/wCA/wCAgICAAQCAgICAAAACAAAAAAOAA4AAAwAHAAARIREhARUzNQOA/IABgIADgPyAAgCAgAAAAwAAAAADgAOAAAMABwALAAARIREhExUzNQEVMzUDgPyAgIABgIADgPyAAwCAgP4AgIAAAAQAAAAAA4ADgAADAAcACwAPAAARIREhExUzNRMVMzUTFTM1A4D8gICAgICAgAOA/IADAICA/wCAgP8AgIAAAAAFAAAAAAOAA4AAAwAHAAsADwATAAARIREhExUzNSEVMzUBFTM1IRUzNQOA/ICAgAGAgP2AgAGAgAOA/IADAICAgID+AICAgIAAAAAABgAAAAADgAOAAAMABwALAA8AEwAXAAARIREhExUzNSEVMzUBFTM1ARUzNSEVMzUDgPyAgIABgID+gID+gIABgIADgPyAAwCAgICA/wCAgP8AgICAgAAAAAcAAAAAA4ADgAADAAcACwAPABMAFwAbAAARIREhExUzNSEVMzUBFTM1IRUzNQEVMzUhFTM1A4D8gICAAYCA/YCAAYCA/YCAAYCAA4D8gAMAgICAgP8AgICAgP8AgICAgAAAAAAEAAD/gAOAA4AACQARABUAGQAAESEVIREhFSERIwEhESE1MxEjKQEVIREhFSEBgP8AAQD/AIACgAEA/wCAgP8AAQD/AAEA/wADgID+gID+gAQA/YCAAYCA/oCAAAEAAP+AA4ADgAANAAARIRUhNSERIRUhNSERIwGAAQABAP8A/wD/AIADgICA/YCAgP6AAAAIAAD/gAOAA4AAAwAHAAsAGwAfACMAJwArAAABMxUrATMVIyUzFSsBMxUzFSMRMxUhNTMRIzUzBTMRIwEzESMhMxUjJTMVIwGAgICAgIABAICAgICAgID+gICAgP6AgIADAICA/YCAgAIAgIADgICAgICAgP6AgIABgICA/wABAP8AgICAAAAAEQAAAAADgAOAAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwAAETMVIyUzFSMhMxUjJTMVIyEzFSMlMxUrATMVIyEzFSMlMxUjJTMVIyUzFSMhMxUjJTMVIyEzFSMlMxUjJTMVIyUzFSOAgAMAgID9gICAAgCAgP6AgIABAICAgICA/oCAgAEAgIABAICAAQCAgP2AgIACAICA/YCAgAEAgIABAICAAQCAgAOAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAUAAP+AA4ADgAAJAA0AEQAVACUAAAEhESMVIxEzNSEjMxUrATMVKwEzFSsBMxUhNTMRIxUjFSE1IzUjAgABgICAgP8AgICAgICAgICAgIACgICAgP6AgIADgP6AgAEAgICAgICA/wCAgICAAAUAAAAAAoADgAADAAcAEwAXABsAAAEzFSsBMxUrATMVIRUjFSM1ITUzEzMVKwEzFSMBgICAgICAgIABgICA/oCAgICAgICAA4CAgICAgICA/wCAgAAAAAADAAD/gAKAA4AABwAXABsAAAEhESM1IzUjBSERIxUzFSMVIzUjNTM1IxMVMzUBAAGAgICA/wABgICAgICAgICAgAOA/oCAgID+gICAgICAgAEAgIAAAAAABQAA/4ADAAOAAAMADwATABcAGwAAASEVISMzESERMxEhESMRKwEzESMBMxEjKQEVIQEAAQD/AICAAQCA/wCAgICAgAKAgID+AAIA/gADgID/AAEA/oD/AAEA/oABgP6AgAAAAAgAAP+ABAADgAADAAcACwAPABMAFwAjACcAAAEhFSEjMxUjJTMRIyUhFSEjMxEjATMRIyUzFSEVIxUjNSE1IREzFSMCAAEA/wCAgIABgICA/YABAP8AgICAA4CAgP6AgAEAgID+AAGAgIADgICAgP8AgID/AAEA/wCAgICAgID/AIAAAAYAAP+ABAADgAALAA8AEwAXABsAHwAAASEVMxUzESMRIREhATMVKwEzFSsBMxUrATMVKwEzFSMBAAIAgICA/wD+gAEAgICAgICAgICAgICAgIADgICA/gABgAEA/wCAgICAgAAHAAD/gAOAA4AABwATABcAGwAfACMAJwAAESERIxEhESMBMxUzFSMVIzUjNTMBMxUjJTMVIyEzFSMlMxUrATMVIwOAgP2AgAGAgICAgICA/wCAgAIAgID+gICAAQCAgICAgAOA/YACAP4AAYCAgICAgP8AgICAgICAgAAAAQAAAAADgAOAACEAAAEhFSMVIxUhESMVMzUhETM1MzUzESMVIxUhFSERMxEzNTMBgAGAgID/AICAAQCAgICAgP8A/oCAgIADgICAgP8AgIABAICA/oCAgIABgAEAgAAABgAAAAADgAMAAAMACwAXABsAHwAjAAARIREhARUzFTM1MzUFESERIxUjFSM1IzUxMxUjJTMVKwEzFSMDgPyAAQCAgID+AAKAgICAgICAAQCAgICAgAMA/QACgICAgICA/oABgICAgICAgICAAAAAAAsAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AIwArAC8AAAEzFSsBMxUjJTMVIyEzFSMlMxUjJTMVIyEzFSMlMxUjITMVIyUzESE1MzUzITMVIwEAgICAgIABAICA/oCAgAEAgIABAICA/oCAgAIAgID+gICAAgCA/oCAgP6AgIADgICAgICAgICAgICAgICA/oCAgIAAAAAAAQAAAAADAAOAABcAAAEzESMRIxEjFSM1IzUjETMVMxUzETMRMwKAgICAgICAgICAgICAA4D/AP8A/wCAgIABAICAAQABAAAAAQAAAAADAAOAABsAAAEzESMVIxUzESM1IRUjFSMRMzUzNSMRMxUhNTMCgICAgICA/wCAgICAgIABAIADgP8AgID/AICAgAEAgIABAICAAAAQAAAAAAOAA4AAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAATMVIyUzFSMhMxUjJTMRIwEzFSMhMxUjJTMVIyEzFSMlMxUjITMVIyUzESMBMxUjITMVIyUzFSMhMxUjJTMVIwEAgIABAICA/gCAgAGAgIABgICA/YCAgAIAgID+gICAAQCAgP6AgIABAICAAQCAgP2AgIADAICA/gCAgAEAgIADgICAgICA/wABAICAgICAgICAgP8AAQCAgICAgICAAAABAAAAAAMAA4AAIwAAETMVMxUhNTM1MxEjFSMVMxUzESM1IzUhFSMVIxEzNTM1IzUjgIABAICAgICAgICA/wCAgICAgIADgICAgID/AICAgP8AgICAgAEAgICAAAIAAAAAAoADgAATABcAABMzFTM1MxUzESMVIxUjNSM1IxEzEzMVI4CAgICAgICAgICAgICAA4CAgID/AICAgIABAP2AgAAAAAEAAAAAA4ADgAAXAAATIRUzNSEVMxEjFSMVIxUjNSM1IzUjETOAAQCAAQCAgICAgICAgIADgICAgP6AgICAgICAAYAAAQAAAAACgAOAAAcAAAEzESEVITUhAQCAAQD9gAEAA4D9AICAAAAAAAEAAAAAAoADgAALAAARIRUhETMVIxUjESECgP8AgICA/wADgID+AICAAwAABAAAAAADgAOAAAMABwALAA8AABEhESETESERBSERIRMVMzUDgPyAgAKA/gABgP6AgIADgPyAAwD9gAKAgP6AAQCAgAABAAAAAAOAA4AAGwAAATMRIRUjFSMVMxEjNSM1IxUjFSMRMzUjNSM1IQGAgAGAgICAgICAgICAgIABgAOA/wCAgID/AICAgIABAICAgAAAAAgAAAAAA4ADgAADAAcACwAPABMAFwAbAB8AAAEhFSEjMxUjJTMVIyEzESMBMxEjITMVIyUzFSMpARUhAQABgP6AgICAAgCAgP2AgIADAICA/YCAgAIAgID+gAGA/oADgICAgID+gAGA/oCAgICAAAADAAAAAAOAA4AADwAVABsAAAEzFTMVIxEjFSERIxEhNTMFIREjNSMVMxEhNTMBgICAgID/AIABAIABAAEAgICA/wCAA4CAgP4AgAGAAQCAgP8AgID+gIAAAwAAAAADgAOAAA8AFQAbAAABMxUzFSERIxEhNSMRIzUzBSEVIxUjOwERMxUhAYCAgAEAgP8AgICA/oABAICAgICA/wADgICA/wD+gIACAICAgID/AIAAAAMAAAAAAwACgAANABEAFQAAEyEVMxEhNSM1MzUhNSETFSE1EzMVI4ABgID+AICAAQD/AIABAICAgAKAgP4AgICAgP8AgIABgIAAAAAEAAAAAAKAA4AADQARABUAGQAAATMRMxUjESE1MxEjNTMlMxUjATMVIyUzFSMBAICAgP8AgICAAQCAgP4AgIABgICAA4D/AID+gIABAICAgP4AgICAAAAAAwAAAAACgAOAAAMADQARAAATIRUhJTMRITUhESM1MyEzESOAAQD/AAGAgP4AAYCAgP4AgIADgICA/ICAAgCA/YAAAAACAAAAAAKAA4AACwAPAAARMxEhETMRIzUhFSMzIRUhgAGAgID+gICAAYD+gAOA/gACAP0AgICAAAYAAAAAA4ACgAADAAkADQARABUAGQAAETMRIwEhFSMRIwEzFSMFMxUjJTMVKwEzFSOAgAIAAQCAgAEAgID9gICAAQCAgICAgAKA/oABgID/AAEAgICAgICAAAAAAgAAAAACgAKAAAcACwAAESEVIREhFSEBMxUjAgD+gAIA/YACAICAAoCA/oCAAgCAAAAAAAQAAP+AAwACgAADAAkADQARAAARMxEjATMRITUhFzMVIykBFSGAgAIAgP4AAYCAgID+AAIA/gACgP6AAYD+AICAgIAABAAA/4ADAAKAAAUACQANABEAABEhFSERIwEzESM7ARUjKQEVIQIA/oCAAgCAgICAgP4AAgD+AAKAgP6AAYD+gICAAAAEAAAAAAKAA4AACwAPABMAFwAAEyEVIxUzFSE1MzUjAzMRIwEzESMpARUhgAGAgID+gICAgICAAgCAgP6AAYD+gAOAgICAgID/AP6AAYD+gIAAAAACAAD/gAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP2AAAQAAP+AAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID+AAKAgP2AAoD+AAAAAgAAAAADAAOAAAsADwAAESERIRUhESEVIREjATMRIwEAAYD+gAGA/gCAAoCAgAOA/wCA/oCAAwD/AP6AAAAAAAQAAAAAAoACgAAHAAsADwATAAARIRUjETMVIQEzFSsBMxEjATMRIwEAgID/AAGAgICAgIABAICAAoCA/oCAAoCA/oABgP4AAAIAAAAAAoACgAAFAAkAABEhFSERIwEzESMCAP6AgAIAgIACgID/AAEA/gAAAgAA/4ACgAOAAAcADwAAETMVIRUhESMBMxEjESE1IYABgP6AgAIAgID+gAGAA4CAgP6AAYD9AAEAgAAABAAAAAACgAKAAAUACQANABMAABEhFSMRIwEzFSsBMxEjATMRITUzAQCAgAGAgICAgIABAID/AIACgID+AAKAgP6AAYD+AIAABAAAAAACgAOAAAMACwAPABMAABEhFSkBMxEjESE1IQUzESMzIRUhAgD+AAIAgID+gAGA/gCAgIABgP6AA4CA/YABgICA/oCAAAAAAAMAAAAAAoADgAADAAsADwAAEyEVISMzFSEVIREjATMRI4ACAP4AgIABgP6AgAIAgIADgICAgP4AAgD+AAAAAAAEAAAAAAKAAoAAAwAHAA0AEQAAETMRIwEzESMBMxEhNTMhMxUjgIABAICAAQCA/wCA/oCAgAKA/gACAP4AAgD9gICAAAIAAAAAAwACgAAFAAsAABEhESMRIyUzESE1IQEAgIACgID+AAGAAoD+AAGAgP2AgAAAAAACAAD/gAMAA4AABwANAAABMxEjESE1IQEhESMRIwKAgID+gAGA/YABAICAA4D8AAEAgAGA/oABAAAAAAADAAAAAAKAA4AACQANABEAAAEzETMVIxEhNTMBMxEjATMRIwEAgICA/wCA/wCAgAIAgIADgP8AgP4AgAIA/gABgP4AAAIAAAAAAoADgAADAAkAABEzESMBMxEhNSGAgAIAgP4AAYADgP0AAgD9gIAABAAA/4ACgAKAAAsADwATABcAABEzFTMVIxUhFSEVIwEhFSkBMxEjASEVIYCAgAGA/oCAAQABAP8AAQCAgP6AAgD+AAKAgICAgIACgID/AP8AgAAABAAA/4ACgAOAAAcACwAPABMAAAEzESM1IzUzATMRIwEzESsBMxUjAgCAgICA/gCAgAEAgICAgIADgPwAgIACAP4AAgD+AIAABQAA/4ACgAKAAAMABwALABcAGwAAEzMVIyUzFSMhMxEjATMRMxUjFSM1IzUzATMRI4CAgAEAgID+gICAAQCAgICAgIABAICAAoCAgID+gAGA/oCAgICAAYD+gAABAAD/gAKAA4AACwAAATMRIRUhESMRITUhAQCAAQD/AID/AAEAA4D/AID9gAKAgAACAAAAAAKAAoAABQAJAAARIRUhESMBMxEjAgD+gIACAICAAoCA/gACAP4AAAIAAP+AAoACgAADAAsAABEzESMBMxEjNSE1IYCAAgCAgP6AAYACgP4AAgD9AICAAAMAAP+AAoACgAADAAsADwAAETMRIwEzESM1ITUhASEVIYCAAgCAgP6AAYD+AAIA/gACgP6AAYD9gICA/wCAAAACAAD/gAKAA4AABwALAAARMxEhFSERIwEzESOAAYD+gIACAICAA4D/AID9gAKA/gAAAAAAAwAA/4ACgAKAAAUACQANAAARIRUhESMBMxEjBSEVIQIA/oCAAgCAgP6AAgD+AAKAgP4AAgD+gICAAAAAAwAAAAACgAOAAA0AEQAVAAABMxEzFSMRITUzESM1MwUzESMBMxEjAQCAgID/AICAgP8AgIACAICAA4D/AID+AIABgICA/oABgP4AAAQAAP+AAoACgAAFAAkADQARAAARIRUjESMBMxUrATMRIwEzESMBAICAAYCAgICAgAEAgIACgID9gAMAgP4AAgD+AAAABAAA/4ADAAKAAAcACwAPABMAABEhFSERIRUhATMVIxMzFSMpARUhAgD+gAIA/YACAICAgICA/gACAP4AAoCA/wCAAYCA/wCAgAAAAAMAAP+AAoACgAAHAAsADwAAETMRIRUhFSMBMxEjASEVIYABgP6AgAIAgID+gAIA/gACgP6AgIACgP6A/wCAAAAHAAD/gAKAAoAABwALAA8AEwAXABsAHwAAESERIzUhFSM7ARUjJTMVKwEzFSsBMxUjJSEVKQEzFSMCgID+gICAgIABAICAgICAgICAAQABAP8A/oCAgAKA/wCAgICAgICAgICAAAAAAAMAAAAAAoACgAAFAAsADwAAESEVIxEjATMRITUzATMRIwEAgIACAID/AID/AICAAoCA/gACgP2AgAGA/oAAAAACAAD/gAKAA4AABwALAAARMxEhFSERIwEzFSOAAYD+gIACAICAA4D/AID9gAKAgAAEAAAAAAKAAoAAAwAHAAsADwAAESEVKQEzESMBMxEjMyEVIQIA/gACAICA/gCAgIABgP6AAoCA/oABAP8AgAAAAgAA/4ACgAOAAAcACwAAATMRIzUhNSEBMxEjAgCAgP6AAYD+AICAA4D8AICAAgD+AAAAAAMAAP+AAoACgAADAAcADwAAETMRIwEzESMpARUjESMRI4CAAgCAgP6AAYCAgIACgP6AAYD+gID/AAEAAAMAAAAAAoADgAAPABMAFwAAASEVIREzFSMRITUzESM1MwUzESMBMxEjAQABgP8AgID/AICAgP8AgIACAICAA4CA/wCA/oCAAYCAgP6AAQD+gAAAAAQAAP+AAoADAAADAA8AEwAXAAABMxUjFTMRMxUhNTMRIzUzBTMRIyUzFSMBAICAgID+gICAgP8AgIACAICAAwCAgP4AgIABAICA/wCAgAAABgAAAAACgAOAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzFSMFMxUjOwEVIxUzFSOAAYD+gICAgAIAgID+gICAgICAgIADgID/AAEAgICAgICAAAAAAgAAAIAAgAOAAAMABwAAETMRIxEzFSOAgICAA4D/AP6AgAAAAQAAAAACgAOAAAsAAAEzESEVIREjESE1IQEAgAEA/wCA/wABAAOA/gCA/wABAIAAAQAA/4AAgACAAAMAADUzESOAgID/AAAAAQAAAAACgAOAABsAAAEzFSEVIRUhFSEVIRUhFSM1ITUhNSE1ITUhNSEBAIABAP8AAQD/AAEA/wCA/wABAP8AAQD/AAEAA4CAgICAgICAgICAgICAAAAAAAIAAAAAAoADAAADAAsAABEhFSEVIRUhESMRIQKA/YACgP8AgP8AAwCAgID+gAGAAAMAAAAAAoADgAADAAcADwAAATMRKwEzFSsBMxEhNTMRIQEAgICAgICAgAGAgP2AA4D+gID/AID/AAAAAAIAAP+AAoADgAALAA8AABEzESERMxEjESERIykBFSGAAYCAgP6AgAEAAQD/AAOA/wABAPyAAgD+AIAAAAQAAP+AAoADgAAHAAsADwATAAARMxEzFSMRIwEhFSkBMxEjKQEVIYCAgIABAAEA/wABAICA/wABAP8AA4D+gID+gAKAgP4AgAAAAAAEAAD/gAOAA4AADQARABUAGQAAESEVIRUhESM1IREjESEBIRUpATMRIykBFSECgP8AAgCA/oCA/wACAAEA/wABAICA/wABAP8AA4CAgP8AgP4AAwD+gID/AIAAAAQAAP+AAwADgAANABEAFQAZAAATMxEhESM1IREjESM1MwEhFSkBMxEjKQEVIYCAAgCA/oCAgIABAAEA/wABAICA/wABAP8AA4D/AP8AgP4AAgCA/wCA/wCAAAAAAQAAAAACgAKAAAkAABEhFSEVIRUhESMCgP4AAQD/AIACgICAgP8AAAUAAAAAAoACgAADAAcACwAPABMAABMhFSEjMxUjMyEVKQEzFSMpARUhgAIA/gCAgICAAYD+gAGAgID+AAIA/gACgICAgICAAAUAAAAABAACgAADAAcAEwAXABsAABMhFSElMxEjATMRMxUhNSE1ITUhBTMVIyUzFSOAAYD+gAMAgID+gICA/YABgP6AAYD+AICAAwCAgAKAgID+gAEA/oCAgICAgICAgAAAAAADAAAAAAQAAoAAAwAZAB0AABMhFSElMxEjFSM1IxUzFSE1ITUhNSE1MxUhBTMVI4ABgP6AAwCAgICAgP2AAYD+gAGAgAEA/ICAgAKAgID+gICAgICAgICAgICAAAYAAAAAAoADgAADAAcADQARABUAGQAAESEVKQEzFSMpARUhFSM7ARUjOwEVIzsBFSMCAP4AAgCAgP6AAYD/AICAgICAgICAgIADgICAgICAgIAAAAQAAAAAAgACgAADAAcADQARAAARIRUpATMVIykBESM1IwUzFSMBgP6AAYCAgP8AAQCAgAEAgIACgICA/wCAgIAAAAAABgAAAAACgAOAAAMABwALAA8AEwAXAAARMxUjJSEVISMzFSMlMxEjATMRIzMhFSGAgAEAAQD/AICAgAGAgID+AICAgAGA/oADgICAgICA/YACAP4AgAAAAAEAAAAAAoADgAAFAAARIREjESECgID+AAOA/IADAAAAAgAA/4ABAAMAAAMABwAAETMVIzsBESOAgICAgAMAgP0AAAAABwAAAAADAAOAAAMABwARABUAGQAdACEAABMhFSEjMxUjMyEVMxEjESM1ISUzFSMFMxUjITMVIzMhFSGAAgD+AICAgIABgICAgP8AAgCAgP6AgID/AICAgAGA/oADgICAgP6AAQCAgICAgICAAAAAAAMAAAAAAoACgAARABUAGQAAEyEVIxEjFTMVITUhNSM1ITUhIzMVIwUzFSOAAgCAgID+AAEAgAEA/wCAgIACAICAAoCA/wCAgICAgICAgIAABgAAAAACgAKAAAMABwALAA8AEwAXAAATIRUhIzMRIwEzESsBMxUjKQEVISUzFSOAAYD+gICAgAIAgICAgID/AAEA/wABgICAAoCA/oABgP8AgICAgAAAAAUAAAAAAoADgAADAAsADwATABcAABEzESMBMxEjESE1ISUzFSMVMxUrATMVI4CAAgCAgP8AAQD+gICAgICAgIADgP6AAYD8gAEAgICAgICAAAAAAAMAAAAAA4ADgAADAAcAGwAAASEVISUhFSkBMxUhNTMVIRUhESMRIREjESM1MwEAAQD/AAGAAQD/AP4AgAEAgAEA/wCA/wCAgIADgICAgICAgID+AAIA/gACAIAAAgAAAAACgAOAAAMAEQAAASEVISMzFSERIxEhESMRIzUzAQABgP6AgIABgID/AICAgAOAgID9gAIA/gACAIAAAAIAAAAAAwADgAARABUAAAEhESMRIREjESM1MzUzFSE1IQEzFSMBAAGAgP8AgICAgAEA/wABgICAA4D9AAGA/gACAICAgID9gIAAAAADAAAAAAQAA4AAAwAHAB0AAAEhFSElIRUpATMVITUzFSERIxEhESMRIREjESM1MwEAAQD/AAGAAYD+gP4AgAEAgAGAgP8AgP8AgICAA4CAgICAgID9gAIA/gACAP4AAgCAAAAAAwAAAAACgAOAAA0AEQAVAAATIREzFSMRIxEjNTM1ISMzESMlMxUjgAGAgICAgID/AICAgAIAgIADgP8AgP6AAYCAgP0AgIAAAgAAAIAAgAKAAAMABwAAETMRIxUzFSOAgICAAoD/AICAAAAAAwAAAIABgAKAAAMABwALAAARMxEjATMRIwUhFSGAgAEAgID/AAGA/oACgP8AAQD/AICAAAQAAAAAAoADgAADAAsADwAVAAARMxUjFTMRMxUjFSMBMxEjATMRITUhgICAgICAAQCAgAEAgP4AAYADgICA/wCAgAIA/wABAP2AgAADAAAAAAKAAoAAAwALAA8AABEhFSkBMxEzFSE1IQEzFSMBgP6AAYCAgP2AAYD/AICAAoCA/oCAgAEAgAACAAAAAAGAAoAAAwAHAAABMxEjATMVIwEAgID/AICAAoD9gAGAgAAABAAAAAACAAKAAAMABwALAA8AABEhFSkBMxEjATMVIwchFSEBgP6AAYCAgP8AgICAAYD+gAKAgP6AAQCAgIAAAAQAAAAAAoACgAAFAAkADQARAAARIRUhESMBMxEjATMVIwUhFSECAP6AgAIAgID/AICA/wACAP4AAoCA/wABAP6AAQCAgIAAAAIAAAAAAoACgAANABEAABEhFSEVMxUjESE1MxEjITMRIwIA/wCAgP8AgIACAICAAoCAgID/AIABgP4AAAIAAAAAAQADgAADAAcAABMzFSMHMxEjgICAgICAA4CAgP2AAAMAAAAAAoADgAADAAcADwAAESEVIRUhFSkBMxEzFSE1IQGA/oABgP6AAYCAgP2AAYADgICAgP6AgIAAAAQAAAAAAoADgAADAAsADwATAAATIRUhByEVIRUhFSEBMxEjKQEVIYABgP6AgAIA/oABAP6AAgCAgP4AAgD+AAOAgICAgIABAP6AgAABAAAAAAKAAoAACwAAATMRIRUhESMRITUhAQCAAQD/AID/AAEAAoD/AID/AAEAgAADAAD/gAOAA4AABwAlACkAAAEzFTMVITUzBTMVIRUjFTM1MxEzFTMRIxUjFSM1IxUjNSM1IxEzATMVIwGAgID+gID/AIABAICAgICAgICAgICAgIABAICAA4CAgICAgICAgAEAgP8AgICAgICAAQD+AIAAAAAAFAD2AAEAAAAAAAAAAwAIAAEAAAAAAAEACQAgAAEAAAAAAAIABwA6AAEAAAAAAAMACQBWAAEAAAAAAAQAEQCEAAEAAAAAAAUACwCuAAEAAAAAAAYACQDOAAEAAAAAAAkADgD2AAEAAAAAAA0AEwEtAAEAAAAAABMABgFPAAMAAQQJAAAABgAAAAMAAQQJAAEAEgAMAAMAAQQJAAIADgAqAAMAAQQJAAMAEgBCAAMAAQQJAAQAIgBgAAMAAQQJAAUAFgCWAAMAAQQJAAYAEgC6AAMAAQQJAAkAHADYAAMAAQQJAA0AJgEFAAMAAQQJABMADAFBACgAYwApAAAoYykAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAE0AaQBuAGUAYwByAGEAZgB0ACAAUgBlAGcAdQBsAGEAcgAATWluZWNyYWZ0IFJlZ3VsYXIAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAE0AaQBuAGUAYwByAGEAZgB0AABNaW5lY3JhZnQAAE0AbwBqAGEAbgBnACAAUwB0AHUAZABpAG8AcwAATW9qYW5nIFN0dWRpb3MAAEEAbABsACAAcgBpAGcAaAB0AHMAIAByAGUAcwBlAHIAdgBlAGQAAEFsbCByaWdodHMgcmVzZXJ2ZWQAAEgAZQBsAGwAbwAhAABIZWxsbyEAAAIAAAAAAAAAZgAzAAAAAAAAAAAAAAAAAAAAAAAAAAAEogAAAQIAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAowCEAIUAvQCWAOgAhgCOAIsAnQCpAKQBAwCKANoAgwCTAQQBBQCNAJcAiADDAQYAngCqAPUA9AD2AKIA8ACRAO0AiQDqALgAoQDuAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMApgEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAWkBagFrAWwBbQFuAW8BcAFxAXIBcwF0AXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwDcAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwACbAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oAsgCzALYAtwDEALQAtQDFAIIAwgCHAKsAxgN7A3wDfQN+A38DgAOBAL4AvwOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgD3A68DsAOxA7IDswO0A7UDtgO3A7gDuQO6A7sDvAO9A74DvwPAA8EDwgPDA8QDxQPGA8cDyACMA8kDygPLA8wDzQPOA88D0APRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wPgA+ED4gPjA+QD5QPmA+cAmAPoA+kD6gPrA+wD7QPuAJkA7wPvA/AApQPxA/ID8wCSA/QD9QP2A/cAnAP4A/kD+gCnA/sAjwP8A/0AlACVA/4D/wQABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BQAFAQUCBmdseXBoMQd1bmkwMEFEB3VuaTAwQjIHdW5pMDBCMwd1bmkwMEI5AklKAmlqDGtncmVlbmxhbmRpYwVsb25ncwd1bmkwMTgxB3VuaTAxODQHdW5pMDE4NQd1bmkwMTg2B3VuaTAxODkHdW5pMDE4RQd1bmkwMThGB3VuaTAxOTAHdW5pMDE5MQd1bmkwMTlBB3VuaTAxOUIHdW5pMDE5RQd1bmkwMTlGB3VuaTAxQTcHdW5pMDFBOAd1bmkwMUE5B3VuaTAxQUEHdW5pMDFCMgd1bmkwMUI3B3VuaTAxQjgHdW5pMDFCOQd1bmkwMUJCB3VuaTAxQkMHdW5pMDFCRAd1bmkwMUJFB3VuaTAxQkYHdW5pMDFDMAd1bmkwMUMxB3VuaTAxQzIHdW5pMDFDMwd1bmkwMUM5B3VuaTAxREQHdW5pMDFGNwd1bmkwMjFDB3VuaTAyMUQHdW5pMDIyMAd1bmkwMjIxB3VuaTAyMjQHdW5pMDIyNQd1bmkwMjM0B3VuaTAyMzUHdW5pMDIzNgd1bmkwMjNBB3VuaTAyM0IHdW5pMDIzQwd1bmkwMjNEB3VuaTAyM0UHdW5pMDI0MQd1bmkwMjQyB3VuaTAyNDMHdW5pMDI0NAd1bmkwMjQ1B3VuaTAyNDYHdW5pMDI0Nwd1bmkwMjQ4B3VuaTAyNDkHdW5pMDI0QQd1bmkwMjRCB3VuaTAyNEMHdW5pMDI0RAd1bmkwMjRFB3VuaTAyNEYHdW5pMDI1MAd1bmkwMjUxB3VuaTAyNTIHdW5pMDI1Mwd1bmkwMjU0B3VuaTAyNTUHdW5pMDI1Ngd1bmkwMjU3B3VuaTAyNTgHdW5pMDI1OQd1bmkwMjVBB3VuaTAyNUIHdW5pMDI1Qwd1bmkwMjVEB3VuaTAyNUUHdW5pMDI1Rgd1bmkwMjYwB3VuaTAyNjEHdW5pMDI2Mgd1bmkwMjY0B3VuaTAyNjUHdW5pMDI2Ngd1bmkwMjY3B3VuaTAyNjgHdW5pMDI2QQd1bmkwMjZCB3VuaTAyNkMHdW5pMDI2RAd1bmkwMjZFB3VuaTAyNkYHdW5pMDI3MAd1bmkwMjcxB3VuaTAyNzIHdW5pMDI3Mwd1bmkwMjc0B3VuaTAyNzUHdW5pMDI3Nwd1bmkwMjc4B3VuaTAyNzkHdW5pMDI3QQd1bmkwMjdCB3VuaTAyN0MHdW5pMDI3RQd1bmkwMjdGB3VuaTAyODAHdW5pMDI4MQd1bmkwMjg0B3VuaTAyODUHdW5pMDI4Ngd1bmkwMjg3B3VuaTAyODgHdW5pMDI4OQd1bmkwMjhBB3VuaTAyOEIHdW5pMDI4Qwd1bmkwMjhEB3VuaTAyOEUHdW5pMDI4Rgd1bmkwMjkxB3VuaTAyOTIHdW5pMDI5Mwd1bmkwMjk0B3VuaTAyOTUHdW5pMDI5Ngd1bmkwMjk3B3VuaTAyOTgHdW5pMDI5OQd1bmkwMjlBB3VuaTAyOUIHdW5pMDI5Qwd1bmkwMjlEB3VuaTAyOUUHdW5pMDI5Rgd1bmkwMkEwB3VuaTAyQTEHdW5pMDJBMgd1bmkwMkFDB3VuaTAyQkIHdW5pMDJDQwd1bmkwMzdFCWFub3RlbGVpYQVBbHBoYQRCZXRhBUdhbW1hB3VuaTAzOTQHRXBzaWxvbgRaZXRhA0V0YQVUaGV0YQRJb3RhBUthcHBhBkxhbWJkYQJNdQJOdQJYaQdPbWljcm9uAlBpA1JobwVTaWdtYQNUYXUHVXBzaWxvbgNQaGkDQ2hpA1BzaQd1bmkwM0E5BWFscGhhBGJldGEFZ2FtbWEFZGVsdGEHZXBzaWxvbgR6ZXRhA2V0YQV0aGV0YQRpb3RhBWthcHBhBmxhbWJkYQd1bmkwM0JDAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQd1bmkwM0RCB3VuaTA0MDIHdW5pMDQwNAd1bmkwNDA1B3VuaTA0MDYHdW5pMDQwOAd1bmkwNDA5B3VuaTA0MEEHdW5pMDQwQgd1bmkwNDEwB3VuaTA0MTEHdW5pMDQxMgd1bmkwNDEzB3VuaTA0MTQHdW5pMDQxNQd1bmkwNDE2B3VuaTA0MTcHdW5pMDQxOAd1bmkwNDFBB3VuaTA0MUIHdW5pMDQxQwd1bmkwNDFEB3VuaTA0MUUHdW5pMDQxRgd1bmkwNDIwB3VuaTA0MjEHdW5pMDQyMgd1bmkwNDIzB3VuaTA0MjQHdW5pMDQyNQd1bmkwNDI2B3VuaTA0MjcHdW5pMDQyOAd1bmkwNDI5B3VuaTA0MkEHdW5pMDQyQgd1bmkwNDJDB3VuaTA0MkQHdW5pMDQyRQd1bmkwNDJGB3VuaTA0MzAHdW5pMDQzMQd1bmkwNDMyB3VuaTA0MzMHdW5pMDQzNAd1bmkwNDM1B3VuaTA0MzYHdW5pMDQzNwd1bmkwNDM4B3VuaTA0M0EHdW5pMDQzQgd1bmkwNDNDB3VuaTA0M0QHdW5pMDQzRQd1bmkwNDNGB3VuaTA0NDAHdW5pMDQ0MQd1bmkwNDQyB3VuaTA0NDMHdW5pMDQ0NAd1bmkwNDQ1B3VuaTA0NDYHdW5pMDQ0Nwd1bmkwNDQ4B3VuaTA0NDkHdW5pMDQ0QQd1bmkwNDRCB3VuaTA0NEMHdW5pMDQ0RAd1bmkwNDRFB3VuaTA0NEYHdW5pMDQ1NAd1bmkwNDU1B3VuaTA0NTYHdW5pMDQ1OAd1bmkwNDU5B3VuaTA0NUEHdW5pMDQ2Mgd1bmkwNDYzB3VuaTA0NzIHdW5pMDQ3Mwd1bmkwNDc0B3VuaTA0NzUHdW5pMDQ5Mgd1bmkwNDkzB3VuaTA0OTYHdW5pMDQ5Nwd1bmkwNDlBB3VuaTA0OUIHdW5pMDRBMgd1bmkwNEEzB3VuaTA0QUUHdW5pMDRBRgd1bmkwNEIwB3VuaTA0QjEHdW5pMDRCQQd1bmkwNEJCB3VuaTA0QzAHdW5pMDREOAd1bmkwNEQ5B3VuaTA0RTgHdW5pMDRFOQd1bmkwNTAwB3VuaTA1MzEHdW5pMDUzMgd1bmkwNTMzB3VuaTA1MzQHdW5pMDUzNQd1bmkwNTM2B3VuaTA1MzcHdW5pMDUzOAd1bmkwNTM5B3VuaTA1M0EHdW5pMDUzQgd1bmkwNTNDB3VuaTA1M0QHdW5pMDUzRQd1bmkwNTNGB3VuaTA1NDAHdW5pMDU0MQd1bmkwNTQyB3VuaTA1NDMHdW5pMDU0NAd1bmkwNTQ1B3VuaTA1NDYHdW5pMDU0Nwd1bmkwNTQ4B3VuaTA1NDkHdW5pMDU0QQd1bmkwNTRCB3VuaTA1NEMHdW5pMDU0RAd1bmkwNTRFB3VuaTA1NEYHdW5pMDU1MAd1bmkwNTUxB3VuaTA1NTIHdW5pMDU1Mwd1bmkwNTU0B3VuaTA1NTUHdW5pMDU1Ngd1bmkwNTU5B3VuaTA1NUEHdW5pMDU1Qgd1bmkwNTVDB3VuaTA1NUQHdW5pMDU1RQd1bmkwNTVGB3VuaTA1NjAHdW5pMDU2MQd1bmkwNTYyB3VuaTA1NjMHdW5pMDU2NAd1bmkwNTY1B3VuaTA1NjYHdW5pMDU2Nwd1bmkwNTY4B3VuaTA1NjkHdW5pMDU2QQd1bmkwNTZCB3VuaTA1NkMHdW5pMDU2RAd1bmkwNTZFB3VuaTA1NkYHdW5pMDU3MAd1bmkwNTcxB3VuaTA1NzIHdW5pMDU3Mwd1bmkwNTc0B3VuaTA1NzUHdW5pMDU3Ngd1bmkwNTc3B3VuaTA1NzgHdW5pMDU3OQd1bmkwNTdBB3VuaTA1N0IHdW5pMDU3Qwd1bmkwNTdEB3VuaTA1N0UHdW5pMDU3Rgd1bmkwNTgwB3VuaTA1ODEHdW5pMDU4Mgd1bmkwNTgzB3VuaTA1ODQHdW5pMDU4NQd1bmkwNTg2B3VuaTA1ODcHdW5pMDU4OAd1bmkwNThBB3VuaTA1OEYHdW5pMDVCRQd1bmkwNUMzB3VuaTA1QzYHdW5pMDVEMAd1bmkwNUQxB3VuaTA1RDIHdW5pMDVEMwd1bmkwNUQ0B3VuaTA1RDUHdW5pMDVENgd1bmkwNUQ3B3VuaTA1RDgHdW5pMDVEOQd1bmkwNURBB3VuaTA1REIHdW5pMDVEQwd1bmkwNUREB3VuaTA1REUHdW5pMDVERgd1bmkwNUUwB3VuaTA1RTEHdW5pMDVFMgd1bmkwNUUzB3VuaTA1RTQHdW5pMDVFNQd1bmkwNUU2B3VuaTA1RTcHdW5pMDVFOAd1bmkwNUU5B3VuaTA1RUEHdW5pMDVGMAd1bmkwNUYxB3VuaTA1RjIHdW5pMDVGMwd1bmkwNUY0B3VuaTA3QzgHdW5pMTBBMAd1bmkxMEExB3VuaTEwQTIHdW5pMTBBMwd1bmkxMEE0B3VuaTEwQTUHdW5pMTBBNgd1bmkxMEE3B3VuaTEwQTgHdW5pMTBBOQd1bmkxMEFBB3VuaTEwQUIHdW5pMTBBQwd1bmkxMEFEB3VuaTEwQUUHdW5pMTBBRgd1bmkxMEIwB3VuaTEwQjEHdW5pMTBCMgd1bmkxMEIzB3VuaTEwQjQHdW5pMTBCNQd1bmkxMEI2B3VuaTEwQjcHdW5pMTBCOAd1bmkxMEI5B3VuaTEwQkEHdW5pMTBCQgd1bmkxMEJDB3VuaTEwQkQHdW5pMTBCRQd1bmkxMEJGB3VuaTEwQzAHdW5pMTBDMQd1bmkxMEMyB3VuaTEwQzMHdW5pMTBDNAd1bmkxMEM1B3VuaTEwQzcHdW5pMTBDRAd1bmkxMEQwB3VuaTEwRDEHdW5pMTBEMgd1bmkxMEQzB3VuaTEwRDQHdW5pMTBENQd1bmkxMEQ2B3VuaTEwRDcHdW5pMTBEOAd1bmkxMEQ5B3VuaTEwREEHdW5pMTBEQgd1bmkxMERDB3VuaTEwREQHdW5pMTBERQd1bmkxMERGB3VuaTEwRTAHdW5pMTBFMQd1bmkxMEUyB3VuaTEwRTMHdW5pMTBFNAd1bmkxMEU1B3VuaTEwRTYHdW5pMTBFNwd1bmkxMEU4B3VuaTEwRTkHdW5pMTBFQQd1bmkxMEVCB3VuaTEwRUMHdW5pMTBFRAd1bmkxMEVFB3VuaTEwRUYHdW5pMTBGMAd1bmkxMEYxB3VuaTEwRjIHdW5pMTBGMwd1bmkxMEY0B3VuaTEwRjUHdW5pMTBGNgd1bmkxMEY3B3VuaTEwRjgHdW5pMTBGOQd1bmkxMEZBB3VuaTEwRkIHdW5pMTBGQwd1bmkxMEZEB3VuaTEwRkUHdW5pMTBGRgd1bmkxNUUxB3VuaTE1RkEHdW5pMTYxNAd1bmkxNkEwB3VuaTE2QTIHdW5pMTZBMwd1bmkxNkE0B3VuaTE2QTUHdW5pMTZBNgd1bmkxNkE3B3VuaTE2QTgHdW5pMTZBOQd1bmkxNkFBB3VuaTE2QUIHdW5pMTZBQwd1bmkxNkFEB3VuaTE2QUUHdW5pMTZBRgd1bmkxNkIwB3VuaTE2QjEHdW5pMTZCMgd1bmkxNkIzB3VuaTE2QjQHdW5pMTZCNgd1bmkxNkI3B3VuaTE2QjgHdW5pMTZCOQd1bmkxNkJBB3VuaTE2QkIHdW5pMTZCQwd1bmkxNkJEB3VuaTE2QkUHdW5pMTZCRgd1bmkxNkMwB3VuaTE2QzEHdW5pMTZDMgd1bmkxNkMzB3VuaTE2QzQHdW5pMTZDNQd1bmkxNkM2B3VuaTE2QzcHdW5pMTZDOAd1bmkxNkM5B3VuaTE2Q0EHdW5pMTZDQgd1bmkxNkNDB3VuaTE2Q0QHdW5pMTZDRQd1bmkxNkNGB3VuaTE2RDAHdW5pMTZEMQd1bmkxNkQyB3VuaTE2RDMHdW5pMTZENAd1bmkxNkQ1B3VuaTE2RDYHdW5pMTZENwd1bmkxNkQ4B3VuaTE2RDkHdW5pMTZEQQd1bmkxNkRCB3VuaTE2REMHdW5pMTZERAd1bmkxNkRFB3VuaTE2REYHdW5pMTZFMAd1bmkxNkUxB3VuaTE2RTIHdW5pMTZFMwd1bmkxNkU0B3VuaTE2RTUHdW5pMTZFNgd1bmkxNkU3B3VuaTE2RTgHdW5pMTZFOQd1bmkxNkVBB3VuaTE2RUIHdW5pMTZFQwd1bmkxNkVEB3VuaTE2RUUHdW5pMTZFRgd1bmkxNkYwB3VuaTE2RjEHdW5pMTZGMgd1bmkxNkYzB3VuaTE2RjQHdW5pMTZGNQd1bmkxNkY2B3VuaTE2RjcHdW5pMTZGOAd1bmkxRDAwB3VuaTFEMDQHdW5pMUQwNQd1bmkxRDA3B3VuaTFEMDkHdW5pMUQwQQd1bmkxRDBCB3VuaTFEMEQHdW5pMUQwRgd1bmkxRDE4B3VuaTFEMUEHdW5pMUQxQgd1bmkxRDFDB3VuaTFEMjAHdW5pMUQyMQd1bmkxRDIyB3VuaTFENzcHdW5pMUQ5MQd1bmkxRTlDB3VuaTFFOUQHdW5pMUU5RQd1bmkxRTlGB3VuaTFFRkMHdW5pMUVGRAd1bmkxRUZFB3VuaTFFRkYHdW5pMjAxMAd1bmkyMDExB3VuaTIwMzEGbWludXRlBnNlY29uZAd1bmkyMDM0B3VuaTIwMzUHdW5pMjAzNgd1bmkyMDM3B3VuaTIwM0IJZXhjbGFtZGJsB3VuaTIwM0QHdW5pMjA0Mgd1bmkyMDQ4B3VuaTIwNDkHdW5pMjA0QQd1bmkyMDRCB3VuaTIwNEUHdW5pMjA0Rgd1bmkyMDUxB3VuaTIwNTIHdW5pMjA1Nwd1bmkyMDcwB3VuaTIwNzEHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkHdW5pMjA3QQd1bmkyMDdCB3VuaTIwN0MHdW5pMjA3RAd1bmkyMDdFB3VuaTIwN0YHdW5pMjA4MAd1bmkyMDgxB3VuaTIwODIHdW5pMjA4Mwd1bmkyMDg0B3VuaTIwODUHdW5pMjA4Ngd1bmkyMDg3B3VuaTIwODgHdW5pMjA4OQd1bmkyMDhBB3VuaTIwOEIHdW5pMjA4Qwd1bmkyMDhEB3VuaTIwOEUHdW5pMjBBMA1jb2xvbm1vbmV0YXJ5B3VuaTIwQTIEbGlyYQd1bmkyMEE1B3VuaTIwQTYHdW5pMjBBOQd1bmkyMEFBBGRvbmcERXVybwd1bmkyMEFEB3VuaTIwQUUHdW5pMjBCMAd1bmkyMEIxB3VuaTIwQjIHdW5pMjBCMwd1bmkyMEI0B3VuaTIwQjUHdW5pMjBCNgd1bmkyMEI3B3VuaTIwQjgHdW5pMjBCOQd1bmkyMEJBB3VuaTIwQkIHdW5pMjBCQwd1bmkyMEJEB3VuaTIwQkUHdW5pMjBCRgd1bmkyMTE3B3VuaTIxMzIHdW5pMjE0MQd1bmkyMTQ0B3VuaTIxNEIHdW5pMjE1MAd1bmkyMTUxCG9uZXRoaXJkCXR3b3RoaXJkcwd1bmkyMTU1B3VuaTIxNTYHdW5pMjE1Nwd1bmkyMTU5B3VuaTIxNUEJb25lZWlnaHRoDHRocmVlZWlnaHRocwtmaXZlZWlnaHRocwxzZXZlbmVpZ2h0aHMHdW5pMjE1Rgd1bmkyMTg5CWFycm93bGVmdAdhcnJvd3VwCmFycm93cmlnaHQJYXJyb3dkb3duCWFycm93Ym90aAd1bmkyMUM0B3VuaTIxQ0YNYXJyb3dkYmxyaWdodAxhcnJvd2RibGJvdGgHdW5pMjFGNQl1bml2ZXJzYWwHdW5pMjIwMQtleGlzdGVudGlhbAd1bmkyMjA0CGVtcHR5c2V0B2VsZW1lbnQKbm90ZWxlbWVudAhzdWNodGhhdAd1bmkyMjBDB3VuaTIyMTMHdW5pMjIxOQd1bmkyMjFCB3VuaTIyMUMMcHJvcG9ydGlvbmFsB3VuaTIyMjUKbG9naWNhbGFuZAlsb2dpY2Fsb3IMaW50ZXJzZWN0aW9uB3VuaTIyMkUJdGhlcmVmb3JlB3VuaTIyMzUHdW5pMjI1NAtlcXVpdmFsZW5jZQd1bmkyMjYyDHByb3BlcnN1YnNldA5wcm9wZXJzdXBlcnNldAlub3RzdWJzZXQHdW5pMjI4NQxyZWZsZXhzdWJzZXQOcmVmbGV4c3VwZXJzZXQHdW5pMjJBMgd1bmkyMkE0DXBlcnBlbmRpY3VsYXIHdW5pMjJBOAd1bmkyMkJCB3VuaTIyQkMHdW5pMjJCRAd1bmkyMkMzB3VuaTIyQzYHdW5pMjMwMAVob3VzZQd1bmkyMzE4B3VuaTIzMUEHdW5pMjMxQgppbnRlZ3JhbHRwCmludGVncmFsYnQHdW5pMjNDRgd1bmkyM0U5B3VuaTIzRUEHdW5pMjNFRAd1bmkyM0VFB3VuaTIzRUYHdW5pMjNGNAd1bmkyM0Y1B3VuaTIzRjYHdW5pMjNGNwd1bmkyM0Y4B3VuaTIzRjkHdW5pMjNGQQd1bmkyM0ZCB3VuaTIzRkMHdW5pMjNGRAhTRjEwMDAwMAhTRjExMDAwMAhTRjAxMDAwMAhTRjAzMDAwMAhTRjAyMDAwMAhTRjA0MDAwMAhTRjA4MDAwMAhTRjA5MDAwMAhTRjA2MDAwMAhTRjA3MDAwMAhTRjA1MDAwMAhTRjQzMDAwMAhTRjI0MDAwMAhTRjUxMDAwMAhTRjUyMDAwMAhTRjM5MDAwMAhTRjIyMDAwMAhTRjIxMDAwMAhTRjI1MDAwMAhTRjUwMDAwMAhTRjQ5MDAwMAhTRjM4MDAwMAhTRjI4MDAwMAhTRjI3MDAwMAhTRjI2MDAwMAhTRjM2MDAwMAhTRjM3MDAwMAhTRjQyMDAwMAhTRjE5MDAwMAhTRjIwMDAwMAhTRjIzMDAwMAhTRjQ3MDAwMAhTRjQ4MDAwMAhTRjQxMDAwMAhTRjQ1MDAwMAhTRjQ2MDAwMAhTRjQwMDAwMAhTRjU0MDAwMAhTRjUzMDAwMAhTRjQ0MDAwMAd1cGJsb2NrB2RuYmxvY2sFYmxvY2sHbGZibG9jawdydGJsb2NrB2x0c2hhZGUFc2hhZGUHZGtzaGFkZQlmaWxsZWRib3gGSDIyMDczB3RyaWFndXAHdW5pMjVCMwd1bmkyNUI2B3VuaTI1QjcHdHJpYWdkbgd1bmkyNUJEB3VuaTI1QzAHdW5pMjVDMQd1bmkyNUM2B3VuaTI1QzcGY2lyY2xlB3VuaTI1Q0UGSDE4NTMzCWludmJ1bGxldApvcGVuYnVsbGV0B3VuaTI2MDAHdW5pMjYwMQd1bmkyNjAyB3VuaTI2MDMHdW5pMjYwNAd1bmkyNjA1B3VuaTI2MDYHdW5pMjYwOAd1bmkyNjE0B3VuaTI2MjAHdW5pMjYzMAd1bmkyNjMxB3VuaTI2MzIHdW5pMjYzMwd1bmkyNjM0B3VuaTI2MzUHdW5pMjYzNgd1bmkyNjM3B3VuaTI2MzkJc21pbGVmYWNlDGludnNtaWxlZmFjZQd1bmkyNjNEBmZlbWFsZQRtYWxlBXNwYWRlB3VuaTI2NjEHdW5pMjY2MgRjbHViB3VuaTI2NjQFaGVhcnQHZGlhbW9uZAd1bmkyNjY3B3VuaTI2NjkLbXVzaWNhbG5vdGUObXVzaWNhbG5vdGVkYmwHdW5pMjY2Qwd1bmkyNjZEB3VuaTI2NkUHdW5pMjY2Rgd1bmkyNjgwB3VuaTI2ODEHdW5pMjY4Mgd1bmkyNjgzB3VuaTI2ODQHdW5pMjY4NQd1bmkyNjkwB3VuaTI2OTEHdW5pMjY5Mwd1bmkyNjk0B3VuaTI2OTcHdW5pMjZBMQd1bmkyNkE1B3VuaTI2QzQHdW5pMjZDOAd1bmkyNkNGB3VuaTI2RTgHdW5pMjcwMgd1bmkyNzA5B3VuaTI3MEUHdW5pMjcxNAd1bmkyNzE4B3VuaTI3NDQHdW5pMjc0Qwd1bmkyNzYzB3VuaTI3NjQHdW5pMjdEOAd1bmkyOTVEB3VuaTI5QzgHdW5pMkI1MAd1bmkyQjU4B3VuaTJCRUEHdW5pMkJFQgd1bmkyQzY1B3VuaTJDNjYHdW5pMkM2RAd1bmkyQzZGB3VuaTJDNzEHdW5pMkQwMAd1bmkyRDAxB3VuaTJEMDIHdW5pMkQwMwd1bmkyRDA0B3VuaTJEMDUHdW5pMkQwNgd1bmkyRDA3B3VuaTJEMDgHdW5pMkQwOQd1bmkyRDBBB3VuaTJEMEIHdW5pMkQwQwd1bmkyRDBEB3VuaTJEMEUHdW5pMkQwRgd1bmkyRDEwB3VuaTJEMTEHdW5pMkQxMgd1bmkyRDEzB3VuaTJEMTQHdW5pMkQxNQd1bmkyRDE2B3VuaTJEMTcHdW5pMkQxOAd1bmkyRDE5B3VuaTJEMUEHdW5pMkQxQgd1bmkyRDFDB3VuaTJEMUQHdW5pMkQxRQd1bmkyRDFGB3VuaTJEMjAHdW5pMkQyMQd1bmkyRDIyB3VuaTJEMjMHdW5pMkQyNAd1bmkyRDI1B3VuaTJFMTgHdW5pMkUyRQd1bmkyRTM1B3VuaTJFMzgHdW5pMkU0MQd1bmkyRTRCB3VuaTMwMTIHdW5pMzEyNQd1bmlBNzI2B3VuaUE3MjcHdW5pQTcyOAd1bmlBNzI5B3VuaUE3MzAHdW5pQTczMQd1bmlBNzM5B3VuaUE3M0IHdW5pQTc1QQd1bmlBNzVCB3VuaUE3NzkHdW5pQTc4MAd1bmlBNzgxB3VuaUE3QTgHdW5pQTdBOQd1bmlBN0FGB3VuaUE3QjAHdW5pRkIwMAd1bmlGQjAxB3VuaUZCMDIHdW5pRkIwMwd1bmlGQjA1B3VuaUZCMUQHdW5pRkIxRgd1bmlGQjJCB3VuaUZCMzEHdW5pRkIzNQd1bmlGQjNCB3VuaUZCNDQHdW5pRkI0QQd1bmlGQjRCB3VuaUZCNEMHdW5pRkI0RQd1bmlGRjBCB3VuaUZGRkQAAAAB//8AAgABAAAADAAAABAAAAACAAAABAAAAAIAAAAAAAEAAAAA39bLMQAAAAB8N5wbAAAAAOCWoJY=\");var Fxe=s(t=>({}),\"get_default_slot_changes\"),LT=s(t=>({id:t[4]}),\"get_default_slot_context\");function Nxe(t){let e,n,i,a,r=pureMarked(t[1])+\"\";return{c(){e=L(\"div\"),n=L(\"i\"),i=J(),a=new Yi(!1),E(n,\"class\",\"fa fa-exclamation-triangle dialog_form_warning text_icon svelte-1g4tfme\"),a.a=null,E(e,\"class\",\"warning_text svelte-1g4tfme\")},m(o,l){U(o,e,l),I(e,n),I(e,i),a.m(r,e)},p(o,l){l&2&&r!==(r=pureMarked(o[1])+\"\")&&a.p(r)},d(o){o&&z(e)}}}s(Nxe,\"create_if_block_2\");function Rxe(t){let e,n,i,a,r=pureMarked(t[2])+\"\";return{c(){e=L(\"div\"),n=L(\"i\"),i=J(),a=L(\"div\"),E(n,\"class\",\"fa fa-exclamation-circle dialog_form_error text_icon svelte-1g4tfme\"),E(a,\"class\",\"error_lines svelte-1g4tfme\"),E(e,\"class\",\"error_text svelte-1g4tfme\")},m(o,l){U(o,e,l),I(e,n),I(e,i),I(e,a),a.innerHTML=r},p(o,l){l&4&&r!==(r=pureMarked(o[2])+\"\")&&(a.innerHTML=r)},d(o){o&&z(e)}}}s(Rxe,\"create_if_block_1\");function VT(t){let e,n=pureMarked(t[0])+\"\",i;return{c(){e=new Yi(!1),i=_t(),e.a=i},m(a,r){e.m(n,a,r),U(a,i,r)},p(a,r){r&1&&n!==(n=pureMarked(a[0])+\"\")&&e.p(n)},d(a){a&&z(i),a&&e.d()}}}s(VT,\"create_if_block\");function Mxe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f=t[7].default,g=qy(f,t,t[6],LT);function x(b,y){if(b[2])return Rxe;if(b[1])return Nxe}s(x,\"select_block_type\");let _=x(t,-1),h=_&&_(t),v=t[0]&&VT(t);return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"div\"),g&&g.c(),a=J(),r=L(\"div\"),h&&h.c(),o=J(),v&&v.c(),l=J(),c=L(\"i\"),E(r,\"class\",\"description svelte-1g4tfme\"),E(i,\"class\",\"slot_container svelte-1g4tfme\"),E(c,\"class\",\"fa fa-rotate-left dialog_form_description dialog-form-description reset-button svelte-1g4tfme\"),E(c,\"title\",d=A(\"dialog.reset\")),E(n,\"class\",\"base_dialog_item svelte-1g4tfme\"),E(e,\"class\",\"dialog_item_container svelte-1g4tfme\")},m(b,y){U(b,e,y),I(e,n),I(n,i),g&&g.m(i,null),I(i,a),I(i,r),h&&h.m(r,null),I(r,o),v&&v.m(r,null),I(n,l),I(n,c),u=!0,p||(m=Ue(c,\"click\",function(){qn(t[3])&&t[3].apply(this,arguments)}),p=!0)},p(b,[y]){t=b,g&&g.p&&(!u||y&64)&&Gy(g,f,t,t[6],u?Jy(f,t[6],y,Fxe):Wy(t[6]),LT),_===(_=x(t,y))&&h?h.p(t,y):(h&&h.d(1),h=_&&_(t),h&&(h.c(),h.m(r,o))),t[0]?v?v.p(t,y):(v=VT(t),v.c(),v.m(r,null)):v&&(v.d(1),v=null)},i(b){u||(ae(g,b),u=!0)},o(b){de(g,b),u=!1},d(b){b&&z(e),g&&g.d(b),h&&h.d(),v&&v.d(),p=!1,m()}}}s(Mxe,\"create_fragment\");function Bxe(t,e,n){let{$$slots:i={},$$scope:a}=e,{label:r}=e,{tooltip:o=\"\"}=e,{warningText:l=\"\"}=e,{errorText:c=\"\"}=e,{onReset:d}=e,u=guid();return t.$$set=p=>{\"label\"in p&&n(5,r=p.label),\"tooltip\"in p&&n(0,o=p.tooltip),\"warningText\"in p&&n(1,l=p.warningText),\"errorText\"in p&&n(2,c=p.errorText),\"onReset\"in p&&n(3,d=p.onReset),\"$$scope\"in p&&n(6,a=p.$$scope)},t.$$.update=()=>{if(t.$$.dirty&36)e:c&&(bo.get()[r]=c)},[o,l,c,d,u,r,a,i]}s(Bxe,\"instance\");var Af=class extends Pe{constructor(e){super(),Ve(this,e,Bxe,Mxe,De,{label:5,tooltip:0,warningText:1,errorText:2,onReset:3})}};s(Af,\"BaseDialogItem\");var Ln=Af;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".dialog_item_container.svelte-1g4tfme.svelte-1g4tfme{margin:0px 16px 8px}.base_dialog_item.svelte-1g4tfme.svelte-1g4tfme{display:flex;flex-direction:row}.base_dialog_item.svelte-1g4tfme label{--max_label_width:200px !important}.slot_container.svelte-1g4tfme.svelte-1g4tfme{flex-grow:1;margin-right:4px;max-width:96%}.warning_text.svelte-1g4tfme i.svelte-1g4tfme{font-size:1.2em}.warning_text.svelte-1g4tfme.svelte-1g4tfme{display:flex;align-items:center;color:var(--color-warning);font-family:var(--font-code);margin:0.75rem;margin-top:0}.description.svelte-1g4tfme.svelte-1g4tfme{font-size:0.9rem;color:var(--color-subtle_text);margin:0 0.75rem;display:flex;flex-direction:column;gap:2px}.description.svelte-1g4tfme li{list-style:circle;margin-left:1.5rem}.error_text.svelte-1g4tfme i.svelte-1g4tfme{font-size:1.2em}.error_text.svelte-1g4tfme.svelte-1g4tfme{display:flex;align-items:center;color:var(--color-error);font-family:var(--font-code);margin:0.75rem;margin-top:0}.error_lines.svelte-1g4tfme.svelte-1g4tfme{display:flex;flex-direction:column}.text_icon.svelte-1g4tfme.svelte-1g4tfme{margin-right:8px}.dialog-form-description.svelte-1g4tfme.svelte-1g4tfme{padding-top:12px}.reset-button.svelte-1g4tfme.svelte-1g4tfme{padding-top:12px;margin-left:4px}.reset-button.svelte-1g4tfme.svelte-1g4tfme:hover{color:var(--color-error);transition:unset}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Pxe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"div\"),l=L(\"div\"),c=L(\"input\"),u=J(),p=L(\"div\"),p.innerHTML='<i class=\"material-icons icon\">code</i>',m=J(),f=L(\"div\"),g=L(\"input\"),_=J(),h=L(\"div\"),h.innerHTML='<i class=\"material-icons icon\">code</i>',E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[32]),E(c,\"id\",d=t[32]),E(c,\"class\",\"dark_bordered focusable_input\"),E(c,\"inputmode\",\"decimal\"),E(p,\"class\",\"tool numaric_input_slider\"),E(l,\"class\",\"numeric_input\"),E(g,\"id\",x=t[32]),E(g,\"class\",\"dark_bordered focusable_input\"),E(g,\"inputmode\",\"decimal\"),E(h,\"class\",\"tool numaric_input_slider\"),E(f,\"class\",\"numeric_input\"),E(o,\"class\",\"dialog_vector_group half\"),Xe(o,\"max-width\",\"256px\"),E(e,\"class\",\"dialog_bar form_bar\")},m(y,w){U(y,e,w),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),I(l,c),t[21](c),Bt(c,t[10]),I(l,u),I(l,p),t[23](p),I(o,m),I(o,f),I(f,g),t[24](g),Bt(g,t[11]),I(f,_),I(f,h),t[26](h),v||(b=[Ue(c,\"input\",t[22]),Ue(g,\"input\",t[25])],v=!0)},p(y,w){w[0]&1&&ct(i,y[0]),w[1]&2&&a!==(a=y[32])&&E(n,\"for\",a),w[1]&2&&d!==(d=y[32])&&E(c,\"id\",d),w[0]&1024&&c.value!==y[10]&&Bt(c,y[10]),w[1]&2&&x!==(x=y[32])&&E(g,\"id\",x),w[0]&2048&&g.value!==y[11]&&Bt(g,y[11])},d(y){y&&z(e),t[21](null),t[23](null),t[24](null),t[26](null),v=!1,Rt(b)}}}s(Pxe,\"create_default_slot\");function Lxe(t){let e,n,i,a;function r(c){t[27](c)}s(r,\"basedialogitem_warningText_binding\");function o(c){t[28](c)}s(o,\"basedialogitem_errorText_binding\");let l={label:t[0],tooltip:t[1],onReset:t[12],$$slots:{default:[Pxe,({id:c})=>({32:c}),({id:c})=>[0,c?2:0]]},$$scope:{ctx:t}};return t[4]!==void 0&&(l.warningText=t[4]),t[5]!==void 0&&(l.errorText=t[5]),e=new Ln({props:l}),Te.push(()=>Be(e,\"warningText\",r)),Te.push(()=>Be(e,\"errorText\",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,d){let u={};d[0]&1&&(u.label=c[0]),d[0]&2&&(u.tooltip=c[1]),d[0]&4033|d[1]&6&&(u.$$scope={dirty:d,ctx:c}),!n&&d[0]&16&&(n=!0,u.warningText=c[4],Me(()=>n=!1)),!i&&d[0]&32&&(i=!0,u.errorText=c[5],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(Lxe,\"create_fragment\");function Vxe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(m,le=>n(10,i=le)),m),\"$$subscribe_valueX\"),o,l=ie,c=s(()=>(l(),l=rt(_,le=>n(11,o=le)),_),\"$$subscribe_valueY\");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l());let{label:d}=e,{tooltip:u=\"\"}=e,{step:p=void 0}=e,{valueX:m}=e;r();let{defaultValueX:f}=e,{minX:g=void 0}=e,{maxX:x=void 0}=e,{valueY:_}=e;c();let{defaultValueY:h}=e,{minY:v=void 0}=e,{maxY:b=void 0}=e,{valueChecker:y=void 0}=e,w=\"\",S=\"\";function F(){if(!y)return;let le=y({x:m.get(),y:_.get()});le.type===\"error\"?n(5,S=le.message):n(5,S=\"\"),le.type===\"warning\"?n(4,w=le.message):n(4,w=\"\")}s(F,\"checkValue\"),m.subscribe(()=>F()),_.subscribe(()=>F());let N=new Molang,k,R,D,B;function q(le,ge,V,H){addEventListeners(le,\"mousedown touchstart\",re=>{convertTouchEvent(re);let xe=0;function fe(Y){convertTouchEvent(Y);let we=Math.trunc((Y.clientX-re.clientX)/10)*(p??1);we!=xe&&(ge.set(Math.clamp(ge.get()+(we-xe),V??-1/0,H??1/0)),xe=we)}s(fe,\"move\");function te(){removeEventListeners(document,\"mousemove touchmove\",fe),removeEventListeners(document,\"mouseup touchend\",te)}s(te,\"stop\"),addEventListeners(document,\"mousemove touchmove\",fe),addEventListeners(document,\"mouseup touchend\",te)}),addEventListeners(k,\"focusout dblclick\",()=>{ge.set(Math.clamp(N.parse(ge.get()),V??-1/0,H??1/0))})}s(q,\"eventListenerFactory\");function G(){m.set(f),_.set(h)}s(G,\"onReset\"),requestAnimationFrame(()=>{q(R,m,g,x),q(B,_,v,b)});function W(le){Te[le?\"unshift\":\"push\"](()=>{k=le,n(6,k)})}s(W,\"input0_binding\");function ee(){i=this.value,m.set(i)}s(ee,\"input0_input_handler\");function Z(le){Te[le?\"unshift\":\"push\"](()=>{R=le,n(7,R)})}s(Z,\"div0_binding\");function me(le){Te[le?\"unshift\":\"push\"](()=>{D=le,n(8,D)})}s(me,\"input1_binding\");function X(){o=this.value,_.set(o)}s(X,\"input1_input_handler\");function Q(le){Te[le?\"unshift\":\"push\"](()=>{B=le,n(9,B)})}s(Q,\"div2_binding\");function he(le){w=le,n(4,w)}s(he,\"basedialogitem_warningText_binding\");function Ie(le){S=le,n(5,S)}return s(Ie,\"basedialogitem_errorText_binding\"),t.$$set=le=>{\"label\"in le&&n(0,d=le.label),\"tooltip\"in le&&n(1,u=le.tooltip),\"step\"in le&&n(13,p=le.step),\"valueX\"in le&&r(n(2,m=le.valueX)),\"defaultValueX\"in le&&n(14,f=le.defaultValueX),\"minX\"in le&&n(15,g=le.minX),\"maxX\"in le&&n(16,x=le.maxX),\"valueY\"in le&&c(n(3,_=le.valueY)),\"defaultValueY\"in le&&n(17,h=le.defaultValueY),\"minY\"in le&&n(18,v=le.minY),\"maxY\"in le&&n(19,b=le.maxY),\"valueChecker\"in le&&n(20,y=le.valueChecker)},[d,u,m,_,w,S,k,R,D,B,i,o,G,p,f,g,x,h,v,b,y,W,ee,Z,me,X,Q,he,Ie]}s(Vxe,\"instance\");var Tf=class extends Pe{constructor(e){super(),Ve(this,e,Vxe,Lxe,De,{label:0,tooltip:1,step:13,valueX:2,defaultValueX:14,minX:15,maxX:16,valueY:3,defaultValueY:17,minY:18,maxY:19,valueChecker:20},null,[-1,-1])}};s(Tf,\"Vector2d\");var Zx=Tf;function zxe(t){let e,n,i,a,r,o,l;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[9]),E(e,\"class\",\"dialog_bar form_bar\")},m(c,d){U(c,e,d),I(e,n),I(n,i),o||(l=bn(r=t[3].call(null,e)),o=!0)},p(c,d){d&1&&ct(i,c[0]),d&512&&a!==(a=c[9])&&E(n,\"for\",a)},d(c){c&&z(e),o=!1,l()}}}s(zxe,\"create_default_slot\");function Uxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[2],$$slots:{default:[zxe,({id:i})=>({9:i}),({id:i})=>i?512:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1537&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Uxe,\"create_fragment\");function qxe(t,e,n){let{label:i}=e,{tooltip:a=\"\"}=e,{options:r}=e,{defaultOption:o}=e,{value:l}=e;l.get()||r[l.get()]||l.set(o);let c=new Interface.CustomElements.SelectInput(\"dialog-select\",{options:r,value:l.get(),onChange(){let m=c.node.getAttribute(\"value\");if(m==null){console.warn(\"Select value is undefined\");return}l.set(m)}});function d(){l.set(o),c.node&&c.set(o)}s(d,\"onReset\");let u=l.subscribe(m=>{c.set(m)});Zi(()=>{u(),c.node.remove()});let p=s(m=>{m.appendChild(c.node)},\"mountSelect\");return t.$$set=m=>{\"label\"in m&&n(0,i=m.label),\"tooltip\"in m&&n(1,a=m.tooltip),\"options\"in m&&n(4,r=m.options),\"defaultOption\"in m&&n(5,o=m.defaultOption),\"value\"in m&&n(6,l=m.value)},[i,a,d,p,r,o,l]}s(qxe,\"instance\");var Cf=class extends Pe{constructor(e){super(),Ve(this,e,qxe,Uxe,De,{label:0,tooltip:1,options:4,defaultOption:5,value:6})}};s(Cf,\"Select\");var es=Cf;function Hxe(t){let e,n,i;return{c(){e=L(\"div\"),n=L(\"h4\"),i=Re(t[0]),E(n,\"class\",\"name_space_left svelte-ho0k60\"),E(e,\"class\",\"dialog_bar form_bar animated-java-section-header svelte-ho0k60\")},m(a,r){U(a,e,r),I(e,n),I(n,i)},p(a,[r]){r&1&&ct(i,a[0])},i:ie,o:ie,d(a){a&&z(e)}}}s(Hxe,\"create_fragment\");function Jxe(t,e,n){let{label:i}=e;return t.$$set=a=>{\"label\"in a&&n(0,i=a.label)},[i]}s(Jxe,\"instance\");var Sf=class extends Pe{constructor(e){super(),Ve(this,e,Jxe,Hxe,De,{label:0})}};s(Sf,\"SectionHeader\");var ts=Sf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".animated-java-section-header.svelte-ho0k60{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}h4.svelte-ho0k60{padding:6px 24px;font-size:24px;border-bottom:5px solid var(--color-back);background-color:var(--color-button);font-family:'MinecraftFull'}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Gxe(t){let e,n,i,a,r,o,l,c,d,u,p,m;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"div\"),l=L(\"input\"),d=J(),u=L(\"div\"),u.innerHTML='<i class=\"material-icons icon\">code</i>',E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[19]),E(l,\"id\",c=t[19]),E(l,\"class\",\"dark_bordered focusable_input svelte-190iud5\"),E(l,\"inputmode\",\"decimal\"),E(u,\"class\",\"tool numaric_input_slider slider-fix svelte-190iud5\"),E(o,\"class\",\"numeric_input\"),E(e,\"class\",\"dialog_bar form_bar\")},m(f,g){U(f,e,g),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),t[12](l),Bt(l,t[5]),I(o,d),I(o,u),t[14](u),p||(m=Ue(l,\"input\",t[13]),p=!0)},p(f,g){g&1&&ct(i,f[0]),g&524288&&a!==(a=f[19])&&E(n,\"for\",a),g&524288&&c!==(c=f[19])&&E(l,\"id\",c),g&32&&l.value!==f[5]&&Bt(l,f[5])},d(f){f&&z(e),t[12](null),t[14](null),p=!1,m()}}}s(Gxe,\"create_default_slot\");function Wxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[6],$$slots:{default:[Gxe,({id:i})=>({19:i}),({id:i})=>i?524288:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1572921&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Wxe,\"create_fragment\");function Kxe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,N=>n(5,i=N)),c),\"$$subscribe_value\");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=\"\"}=e,{value:c}=e;r();let{defaultValue:d}=e,{min:u=-1/0}=e,{max:p=1/0}=e,{valueStep:m=.1}=e,{dragStep:f=m}=e,g,x,_=s(N=>Math.clamp(Dr(N,1/(m??1)),u,p)||0,\"clampValue\"),h=s(N=>{let k=convertTouchEvent(N),R=c.get(),D=s(B=>{let q=convertTouchEvent(B),G=Math.trunc((q.clientX-k.clientX)/10)*(f??1),W=_(R+G);W!==c.get()&&c.set(W)},\"drag\");addEventListeners(document,\"mousemove touchmove\",D),addEventListeners(document,\"mouseup touchend\",()=>removeEventListeners(document,\"mousemove touchmove\",D),{once:!0})},\"onStartDrag\"),v=new Molang,b=s(()=>{c.set(_(v.parse(c.get())))},\"onInput\");requestAnimationFrame(()=>{addEventListeners(x,\"mousedown touchstart\",h),addEventListeners(g,\"focusout dblclick\",b)}),Zi(()=>{removeEventListeners(g,\"focusout dblclick\",b),removeEventListeners(x,\"mousedown touchstart\",h)});function y(){c.set(d)}s(y,\"onReset\");function w(N){Te[N?\"unshift\":\"push\"](()=>{g=N,n(3,g)})}s(w,\"input_1_binding\");function S(){i=this.value,c.set(i)}s(S,\"input_1_input_handler\");function F(N){Te[N?\"unshift\":\"push\"](()=>{x=N,n(4,x)})}return s(F,\"div0_binding\"),t.$$set=N=>{\"label\"in N&&n(0,o=N.label),\"tooltip\"in N&&n(1,l=N.tooltip),\"value\"in N&&r(n(2,c=N.value)),\"defaultValue\"in N&&n(7,d=N.defaultValue),\"min\"in N&&n(8,u=N.min),\"max\"in N&&n(9,p=N.max),\"valueStep\"in N&&n(10,m=N.valueStep),\"dragStep\"in N&&n(11,f=N.dragStep)},[o,l,c,g,x,i,y,d,u,p,m,f,w,S,F]}s(Kxe,\"instance\");var Of=class extends Pe{constructor(e){super(),Ve(this,e,Kxe,Wxe,De,{label:0,tooltip:1,value:2,defaultValue:7,min:8,max:9,valueStep:10,dragStep:11})}};s(Of,\"NumberSlider\");var Mr=Of;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"input.svelte-190iud5{padding:0 8px !important}.slider-fix.svelte-190iud5{right:8px !important}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Yxe(t){let e,n,i,a,r,o,l,c,d,u;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"input\"),E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[12]),E(o,\"type\",\"text\"),E(o,\"class\",\"dark_bordered half focusable_input svelte-oj6m6h\"),E(o,\"id\",l=t[12]),o.disabled=t[2],E(o,\"style\",c=t[2]?\"color: var(--color-subtle_text);\":\"\"),E(e,\"class\",\"dialog_bar form_bar\")},m(p,m){U(p,e,m),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[3]),d||(u=[Ue(o,\"input\",t[11]),Ue(o,\"change\",t[6])],d=!0)},p(p,m){m&1&&ct(i,p[0]),m&4096&&a!==(a=p[12])&&E(n,\"for\",a),m&4096&&l!==(l=p[12])&&E(o,\"id\",l),m&4&&(o.disabled=p[2]),m&4&&c!==(c=p[2]?\"color: var(--color-subtle_text);\":\"\")&&E(o,\"style\",c),m&8&&o.value!==p[3]&&Bt(o,p[3])},d(p){p&&z(e),d=!1,Rt(u)}}}s(Yxe,\"create_default_slot\");function Xxe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],warningText:t[4],errorText:t[5],onReset:t[7],$$slots:{default:[Yxe,({id:i})=>({12:i}),({id:i})=>i?4096:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&16&&(r.warningText=i[4]),a&32&&(r.errorText=i[5]),a&12301&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(Xxe,\"create_fragment\");function Zxe(t,e,n){let{label:i}=e,{tooltip:a=\"\"}=e,{value:r}=e,{defaultValue:o}=e,{disabled:l=!1}=e,{valueChecker:c=void 0}=e,d=r.get(),u=\"\",p=\"\";function m(){if(c){let x=c(d);x.type===\"error\"?n(5,p=x.message):n(5,p=\"\"),x.type===\"warning\"?n(4,u=x.message):n(4,u=\"\")}r.set(d),n(3,d=r.get())}s(m,\"onValueChange\");function f(){n(3,d=o),m()}s(f,\"onReset\"),m();function g(){d=this.value,n(3,d)}return s(g,\"input_input_handler\"),t.$$set=x=>{\"label\"in x&&n(0,i=x.label),\"tooltip\"in x&&n(1,a=x.tooltip),\"value\"in x&&n(8,r=x.value),\"defaultValue\"in x&&n(9,o=x.defaultValue),\"disabled\"in x&&n(2,l=x.disabled),\"valueChecker\"in x&&n(10,c=x.valueChecker)},[i,a,l,d,u,p,m,f,r,o,c,g]}s(Zxe,\"instance\");var If=class extends Pe{constructor(e){super(),Ve(this,e,Zxe,Xxe,De,{label:0,tooltip:1,value:8,defaultValue:9,disabled:2,valueChecker:10})}};s(If,\"LineInput\");var aa=If;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"input.svelte-oj6m6h{font-family:var(--font-code)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Qxe(t){let e,n,i,a,r,o,l,c,d,u,p;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"input\"),c=J(),d=L(\"div\"),d.innerHTML='<i class=\"material-icons icon svelte-9od7jv\">insert_drive_file</i>',E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[18]),E(o,\"type\",\"text\"),E(o,\"class\",\"dark_bordered half focusable_input svelte-9od7jv\"),E(o,\"id\",l=t[18]),E(d,\"class\",\"tool animated-java-file-select-icon svelte-9od7jv\"),E(e,\"class\",\"dialog_bar form_bar\")},m(m,f){U(m,e,f),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[2]),I(e,c),I(e,d),u||(p=[Ue(o,\"input\",t[13]),Ue(o,\"input\",t[5]),Ue(o,\"change\",t[5]),Ue(d,\"click\",t[14])],u=!0)},p(m,f){f&1&&ct(i,m[0]),f&262144&&a!==(a=m[18])&&E(n,\"for\",a),f&262144&&l!==(l=m[18])&&E(o,\"id\",l),f&4&&o.value!==m[2]&&Bt(o,m[2])},d(m){m&&z(e),u=!1,Rt(p)}}}s(Qxe,\"create_default_slot\");function $xe(t){let e,n,i,a;function r(c){t[15](c)}s(r,\"basedialogitem_warningText_binding\");function o(c){t[16](c)}s(o,\"basedialogitem_errorText_binding\");let l={label:t[0],tooltip:t[1],onReset:t[7],$$slots:{default:[Qxe,({id:c})=>({18:c}),({id:c})=>c?262144:0]},$$scope:{ctx:t}};return t[3]!==void 0&&(l.warningText=t[3]),t[4]!==void 0&&(l.errorText=t[4]),e=new Ln({props:l}),Te.push(()=>Be(e,\"warningText\",r)),Te.push(()=>Be(e,\"errorText\",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,[d]){let u={};d&1&&(u.label=c[0]),d&2&&(u.tooltip=c[1]),d&786437&&(u.$$scope={dirty:d,ctx:c}),!n&&d&8&&(n=!0,u.warningText=c[3],Me(()=>n=!1)),!i&&d&16&&(i=!0,u.errorText=c[4],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s($xe,\"create_fragment\");function eve(t,e,n){let{label:i}=e,{tooltip:a=\"\"}=e,{value:r}=e,{defaultValue:o}=e,{filters:l=[]}=e,{fileSelectMessage:c=\"Select Folder\"}=e,d=r.get(),{valueChecker:u=void 0}=e,p=\"\",m=\"\";function f(){if(!u)return;let w=u(r.get());w.type===\"error\"?n(4,m=w.message):n(4,m=\"\"),w.type===\"warning\"?n(3,p=w.message):n(3,p=\"\")}s(f,\"checkValue\"),r.subscribe(()=>f());function g(){r.set(d),n(2,d=r.get())}s(g,\"onValueChange\");function x(){Promise.any([electron.dialog.showOpenDialog({properties:[\"openDirectory\"],filters:l,message:c})]).then(w=>{w.canceled||(n(2,d=w.filePaths[0]),g())})}s(x,\"selectFile\");function _(){n(2,d=o),g()}s(_,\"onReset\"),g();function h(){d=this.value,n(2,d)}s(h,\"input_input_handler\");let v=s(()=>x(),\"click_handler\");function b(w){p=w,n(3,p)}s(b,\"basedialogitem_warningText_binding\");function y(w){m=w,n(4,m)}return s(y,\"basedialogitem_errorText_binding\"),t.$$set=w=>{\"label\"in w&&n(0,i=w.label),\"tooltip\"in w&&n(1,a=w.tooltip),\"value\"in w&&n(8,r=w.value),\"defaultValue\"in w&&n(9,o=w.defaultValue),\"filters\"in w&&n(10,l=w.filters),\"fileSelectMessage\"in w&&n(11,c=w.fileSelectMessage),\"valueChecker\"in w&&n(12,u=w.valueChecker)},[i,a,d,p,m,g,x,_,r,o,l,c,u,h,v,b,y]}s(eve,\"instance\");var Df=class extends Pe{constructor(e){super(),Ve(this,e,eve,$xe,De,{label:0,tooltip:1,value:8,defaultValue:9,filters:10,fileSelectMessage:11,valueChecker:12})}};s(Df,\"FolderSelect\");var Qx=Df;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".animated-java-file-select-icon.svelte-9od7jv{display:flex;justify-content:flex-end}i.svelte-9od7jv{font-size:20px;margin-right:4px;color:var(--color-subtle_text);cursor:pointer}i.svelte-9od7jv:hover{color:var(--color-text)}input.svelte-9od7jv{font-family:var(--font-code)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function tve(t){let e,n,i,a,r,o,l,c,d,u,p;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"input\"),c=J(),d=L(\"div\"),d.innerHTML='<i class=\"material-icons icon svelte-9od7jv\">insert_drive_file</i>',E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[18]),E(o,\"type\",\"text\"),E(o,\"class\",\"dark_bordered half focusable_input svelte-9od7jv\"),E(o,\"id\",l=t[18]),E(d,\"class\",\"tool animated-java-file-select-icon svelte-9od7jv\"),E(e,\"class\",\"dialog_bar form_bar\")},m(m,f){U(m,e,f),I(e,n),I(n,i),I(e,r),I(e,o),Bt(o,t[2]),I(e,c),I(e,d),u||(p=[Ue(o,\"input\",t[13]),Ue(o,\"input\",t[5]),Ue(o,\"change\",t[5]),Ue(d,\"click\",t[14])],u=!0)},p(m,f){f&1&&ct(i,m[0]),f&262144&&a!==(a=m[18])&&E(n,\"for\",a),f&262144&&l!==(l=m[18])&&E(o,\"id\",l),f&4&&o.value!==m[2]&&Bt(o,m[2])},d(m){m&&z(e),u=!1,Rt(p)}}}s(tve,\"create_default_slot\");function nve(t){let e,n,i,a;function r(c){t[15](c)}s(r,\"basedialogitem_warningText_binding\");function o(c){t[16](c)}s(o,\"basedialogitem_errorText_binding\");let l={label:t[0],tooltip:t[1],onReset:t[7],$$slots:{default:[tve,({id:c})=>({18:c}),({id:c})=>c?262144:0]},$$scope:{ctx:t}};return t[3]!==void 0&&(l.warningText=t[3]),t[4]!==void 0&&(l.errorText=t[4]),e=new Ln({props:l}),Te.push(()=>Be(e,\"warningText\",r)),Te.push(()=>Be(e,\"errorText\",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,[d]){let u={};d&1&&(u.label=c[0]),d&2&&(u.tooltip=c[1]),d&786437&&(u.$$scope={dirty:d,ctx:c}),!n&&d&8&&(n=!0,u.warningText=c[3],Me(()=>n=!1)),!i&&d&16&&(i=!0,u.errorText=c[4],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(nve,\"create_fragment\");function ive(t,e,n){let{label:i}=e,{tooltip:a=\"\"}=e,{value:r}=e,{defaultValue:o}=e,{filters:l=[]}=e,{fileSelectMessage:c=\"Select File\"}=e,d=r.get(),{valueChecker:u=void 0}=e,p=\"\",m=\"\";function f(){if(!u)return;let w=u(r.get());w.type===\"error\"?n(4,m=w.message):n(4,m=\"\"),w.type===\"warning\"?n(3,p=w.message):n(3,p=\"\")}s(f,\"checkValue\"),r.subscribe(()=>f());function g(){r.set(d),n(2,d=r.get())}s(g,\"onValueChange\");function x(){Promise.any([electron.dialog.showOpenDialog({properties:[\"openFile\",\"promptToCreate\"],filters:l,message:c})]).then(w=>{w.canceled||(n(2,d=w.filePaths[0]),g())})}s(x,\"selectFile\");function _(){n(2,d=o),g()}s(_,\"onReset\"),g();function h(){d=this.value,n(2,d)}s(h,\"input_input_handler\");let v=s(()=>x(),\"click_handler\");function b(w){p=w,n(3,p)}s(b,\"basedialogitem_warningText_binding\");function y(w){m=w,n(4,m)}return s(y,\"basedialogitem_errorText_binding\"),t.$$set=w=>{\"label\"in w&&n(0,i=w.label),\"tooltip\"in w&&n(1,a=w.tooltip),\"value\"in w&&n(8,r=w.value),\"defaultValue\"in w&&n(9,o=w.defaultValue),\"filters\"in w&&n(10,l=w.filters),\"fileSelectMessage\"in w&&n(11,c=w.fileSelectMessage),\"valueChecker\"in w&&n(12,u=w.valueChecker)},[i,a,d,p,m,g,x,_,r,o,l,c,u,h,v,b,y]}s(ive,\"instance\");var Ff=class extends Pe{constructor(e){super(),Ve(this,e,ive,nve,De,{label:0,tooltip:1,value:8,defaultValue:9,filters:10,fileSelectMessage:11,valueChecker:12})}};s(Ff,\"FileSelect\");var Nf=Ff;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".animated-java-file-select-icon.svelte-9od7jv{display:flex;justify-content:flex-end}i.svelte-9od7jv{font-size:20px;margin-right:4px;color:var(--color-subtle_text);cursor:pointer}i.svelte-9od7jv:hover{color:var(--color-text)}input.svelte-9od7jv{font-family:var(--font-code)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var ave=window;function $x(t,e,n={}){let i=Object.assign({tab:\"\t\",indentOn:/[({\\[]$/,moveToNewLine:/^[)}\\]]/,spellcheck:!1,catchTab:!0,preserveIdent:!0,addClosing:!0,history:!0,window:ave},n),a=i.window,r=a.document,o=[],l=[],c=-1,d=!1,u,p;t.setAttribute(\"contenteditable\",\"plaintext-only\"),t.setAttribute(\"spellcheck\",i.spellcheck?\"true\":\"false\"),t.style.outline=\"none\",t.style.overflowWrap=\"break-word\",t.style.overflowY=\"auto\",t.style.whiteSpace=\"pre-wrap\";let m=!1;e(t),t.contentEditable!==\"plaintext-only\"&&(m=!0),m&&t.setAttribute(\"contenteditable\",\"true\");let f=Q(()=>{let V=v();e(t,V),b(V)},30),g=!1,x=s(V=>!W(V)&&!ee(V)&&V.key!==\"Meta\"&&V.key!==\"Control\"&&V.key!==\"Alt\"&&!V.key.startsWith(\"Arrow\"),\"shouldRecord\"),_=Q(V=>{x(V)&&(D(),g=!1)},300),h=s((V,H)=>{o.push([V,H]),t.addEventListener(V,H)},\"on\");h(\"keydown\",V=>{V.defaultPrevented||(p=Ie(),i.preserveIdent?S(V):F(V),i.catchTab&&k(V),i.addClosing&&N(V),i.history&&(R(V),x(V)&&!g&&(D(),g=!0)),m&&!Z(V)&&b(v()))}),h(\"keyup\",V=>{V.defaultPrevented||V.isComposing||(p!==Ie()&&f(),_(V),u&&u(Ie()))}),h(\"focus\",V=>{d=!0}),h(\"blur\",V=>{d=!1}),h(\"paste\",V=>{D(),B(V),D(),u&&u(Ie())});function v(){let V=ge(),H={start:0,end:0,dir:void 0},{anchorNode:re,anchorOffset:xe,focusNode:fe,focusOffset:te}=V;if(!re||!fe)throw\"error1\";if(re===t&&fe===t)return H.start=xe>0&&t.textContent?t.textContent.length:0,H.end=te>0&&t.textContent?t.textContent.length:0,H.dir=te>=xe?\"->\":\"<-\",H;if(re.nodeType===Node.ELEMENT_NODE){let Y=r.createTextNode(\"\");re.insertBefore(Y,re.childNodes[xe]),re=Y,xe=0}if(fe.nodeType===Node.ELEMENT_NODE){let Y=r.createTextNode(\"\");fe.insertBefore(Y,fe.childNodes[te]),fe=Y,te=0}return q(t,Y=>{if(Y===re&&Y===fe)return H.start+=xe,H.end+=te,H.dir=xe<=te?\"->\":\"<-\",\"stop\";if(Y===re)if(H.start+=xe,!H.dir)H.dir=\"->\";else return\"stop\";else if(Y===fe)if(H.end+=te,!H.dir)H.dir=\"<-\";else return\"stop\";Y.nodeType===Node.TEXT_NODE&&(H.dir!=\"->\"&&(H.start+=Y.nodeValue.length),H.dir!=\"<-\"&&(H.end+=Y.nodeValue.length))}),t.normalize(),H}s(v,\"save\");function b(V){let H=ge(),re,xe=0,fe,te=0;if(V.dir||(V.dir=\"->\"),V.start<0&&(V.start=0),V.end<0&&(V.end=0),V.dir==\"<-\"){let{start:we,end:Le}=V;V.start=Le,V.end=we}let Y=0;q(t,we=>{if(we.nodeType!==Node.TEXT_NODE)return;let Le=(we.nodeValue||\"\").length;if(Y+Le>V.start&&(re||(re=we,xe=V.start-Y),Y+Le>V.end))return fe=we,te=V.end-Y,\"stop\";Y+=Le}),re||(re=t,xe=t.childNodes.length),fe||(fe=t,te=t.childNodes.length),V.dir==\"<-\"&&([re,xe,fe,te]=[fe,te,re,xe]),H.setBaseAndExtent(re,xe,fe,te)}s(b,\"restore\");function y(){let H=ge().getRangeAt(0),re=r.createRange();return re.selectNodeContents(t),re.setEnd(H.startContainer,H.startOffset),re.toString()}s(y,\"beforeCursor\");function w(){let H=ge().getRangeAt(0),re=r.createRange();return re.selectNodeContents(t),re.setStart(H.endContainer,H.endOffset),re.toString()}s(w,\"afterCursor\");function S(V){if(V.key===\"Enter\"){let H=y(),re=w(),[xe]=he(H),fe=xe;if(i.indentOn.test(H)&&(fe+=i.tab),fe.length>0?(le(V),V.stopPropagation(),X(`\n`+fe)):F(V),fe!==xe&&i.moveToNewLine.test(re)){let te=v();X(`\n`+xe),b(te)}}}s(S,\"handleNewLine\");function F(V){if(m&&V.key===\"Enter\")if(le(V),V.stopPropagation(),w()==\"\"){X(`\n `);let H=v();H.start=--H.end,b(H)}else X(`\n`)}s(F,\"legacyNewLineFix\");function N(V){let H=`([{'\"`,re=`)]}'\"`,xe=w(),fe=y(),te=fe.substr(fe.length-1)===\"\\\\\",Y=xe.substr(0,1);if(re.includes(V.key)&&!te&&Y===V.key){let we=v();le(V),we.start=++we.end,b(we)}else if(H.includes(V.key)&&!te&&(`\"'`.includes(V.key)||[\"\",\" \",`\n`].includes(Y))){le(V);let we=v(),Le=we.start==we.end?\"\":ge().toString(),Tt=V.key+Le+re[H.indexOf(V.key)];X(Tt),we.start++,we.end++,b(we)}}s(N,\"handleSelfClosingCharacters\");function k(V){if(V.key===\"Tab\")if(le(V),V.shiftKey){let H=y(),[re,xe]=he(H);if(re.length>0){let fe=v(),te=Math.min(i.tab.length,re.length);b({start:xe,end:xe+te}),r.execCommand(\"delete\"),fe.start-=te,fe.end-=te,b(fe)}}else X(i.tab)}s(k,\"handleTabCharacters\");function R(V){if(W(V)){le(V),c--;let H=l[c];H&&(t.innerHTML=H.html,b(H.pos)),c<0&&(c=0)}if(ee(V)){le(V),c++;let H=l[c];H&&(t.innerHTML=H.html,b(H.pos)),c>=l.length&&c--}}s(R,\"handleUndoRedo\");function D(){if(!d)return;let V=t.innerHTML,H=v(),re=l[c];if(re&&re.html===V&&re.pos.start===H.start&&re.pos.end===H.end)return;c++,l[c]={html:V,pos:H},l.splice(c+1);let xe=300;c>xe&&(c=xe,l.splice(0,1))}s(D,\"recordHistory\");function B(V){le(V);let H=(V.originalEvent||V).clipboardData.getData(\"text/plain\").replace(/\\r/g,\"\"),re=v();X(H),e(t),b({start:Math.min(re.start,re.end)+H.length,end:Math.min(re.start,re.end)+H.length,dir:\"<-\"})}s(B,\"handlePaste\");function q(V,H){let re=[];V.firstChild&&re.push(V.firstChild);let xe=re.pop();for(;xe&&H(xe)!==\"stop\";)xe.nextSibling&&re.push(xe.nextSibling),xe.firstChild&&re.push(xe.firstChild),xe=re.pop()}s(q,\"visit\");function G(V){return V.metaKey||V.ctrlKey}s(G,\"isCtrl\");function W(V){return G(V)&&!V.shiftKey&&me(V)===\"Z\"}s(W,\"isUndo\");function ee(V){return G(V)&&V.shiftKey&&me(V)===\"Z\"}s(ee,\"isRedo\");function Z(V){return G(V)&&me(V)===\"C\"}s(Z,\"isCopy\");function me(V){let H=V.key||V.keyCode||V.which;if(H)return(typeof H==\"string\"?H:String.fromCharCode(H)).toUpperCase()}s(me,\"getKeyCode\");function X(V){V=V.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#039;\"),r.execCommand(\"insertHTML\",!1,V)}s(X,\"insert\");function Q(V,H){let re=0;return(...xe)=>{clearTimeout(re),re=a.setTimeout(()=>V(...xe),H)}}s(Q,\"debounce\");function he(V){let H=V.length-1;for(;H>=0&&V[H]!==`\n`;)H--;H++;let re=H;for(;re<V.length&&/[ \\t]/.test(V[re]);)re++;return[V.substring(H,re)||\"\",H,re]}s(he,\"findPadding\");function Ie(){return t.textContent||\"\"}s(Ie,\"toString\");function le(V){V.preventDefault()}s(le,\"preventDefault\");function ge(){var V;return((V=t.parentNode)===null||V===void 0?void 0:V.nodeType)==Node.DOCUMENT_FRAGMENT_NODE?t.parentNode.getSelection():a.getSelection()}return s(ge,\"getSelection\"),{updateOptions(V){Object.assign(i,V)},updateCode(V){t.textContent=V,e(t)},onUpdate(V){u=V},toString:Ie,save:v,restore:b,recordHistory:D,destroy(){for(let[V,H]of o)t.removeEventListener(V,H)}}}s($x,\"CodeJar\");function zT(t,e={}){let n={class:\"codejar-linenumbers\",wrapClass:\"codejar-wrap\",width:\"35px\",backgroundColor:\"rgba(128, 128, 128, 0.15)\",color:\"\",...e},i;return function(a){t(a),i||(i=rve(a,n),a.addEventListener(\"scroll\",()=>i.style.top=`-${a.scrollTop}px`));let o=(a.textContent||\"\").replace(/\\n+$/,`\n`).split(`\n`).length+1,l=\"\";for(let c=1;c<o;c++)l+=`${c}\n`;i.innerText=l}}s(zT,\"withLineNumbers\");function rve(t,e){let n=getComputedStyle(t),i=document.createElement(\"div\");i.className=e.wrapClass,i.style.position=\"relative\";let a=document.createElement(\"div\");a.className=e.class,i.appendChild(a),a.style.position=\"absolute\",a.style.top=\"0px\",a.style.left=\"0px\",a.style.bottom=\"0px\",a.style.width=e.width,a.style.overflow=\"hidden\",a.style.backgroundColor=e.backgroundColor,a.style.color=e.color||n.color,a.style.setProperty(\"mix-blend-mode\",\"difference\"),a.style.fontFamily=n.fontFamily,a.style.fontSize=n.fontSize,a.style.lineHeight=n.lineHeight,a.style.paddingTop=n.paddingTop,a.style.paddingLeft=n.paddingLeft,a.style.borderTopLeftRadius=n.borderTopLeftRadius,a.style.borderBottomLeftRadius=n.borderBottomLeftRadius;let r=document.createElement(\"div\");return r.style.position=\"relative\",r.style.top=\"0px\",a.appendChild(r),t.style.paddingLeft=`calc(${e.width} + ${a.style.paddingLeft})`,t.style.whiteSpace=\"pre\",t.parentNode.insertBefore(i,t),i.appendChild(t),r}s(rve,\"init\");function UT(t,e){let{highlight:n,onUpdate:i,syntax:a,value:r,withLineNumbers:o,...l}=e,c=$x(t,p(n),l);function d(){c.destroy();let m=t.parentElement;if(m&&m.classList.contains(\"codejar-wrap\")){let f=m.parentElement;t.style.padding=\"\",f.appendChild(t),m.remove()}}s(d,\"destroy\");function u(m){i&&i(c.toString())}s(u,\"onInput\");function p(m){let f=m?g=>{var x;g.innerHTML=m((x=g.textContent)!==null&&x!==void 0?x:\"\",a)}:g=>{};return o?zT(f):f}return s(p,\"wrapHighlight\"),t.addEventListener(\"input\",u),{destroy(){d(),t.removeEventListener(\"input\",u)},update(m){({highlight:n,onUpdate:i,syntax:a,value:r,withLineNumbers:o,...l}=m),e.highlight!==n||e.withLineNumbers!==o?(d(),c=$x(t,p(n),e)):c.updateOptions(l),r!==c.toString()&&c.updateCode(r),e={highlight:n,value:r,withLineNumbers:o,...l}}}}s(UT,\"codejar\");function ove(t){let e;return{c(){e=Re(t[1])},m(n,i){U(n,e,i)},p(n,i){i&2&&ct(e,n[1])},d(n){n&&z(e)}}}s(ove,\"create_else_block\");function sve(t){let e,n=t[12](t[1],t[13])+\"\",i;return{c(){e=new Yi(!1),i=_t(),e.a=i},m(a,r){e.m(n,a,r),U(a,i,r)},p(a,r){r&12290&&n!==(n=a[12](a[1],a[13])+\"\")&&e.p(n)},d(a){a&&z(i),a&&e.d()}}}s(sve,\"create_if_block\");function lve(t){let e,n,i,a,r,o,l,c;function d(m,f){return m[12]?sve:ove}s(d,\"select_block_type\");let u=d(t,-1),p=u(t);return{c(){e=L(\"pre\"),n=L(\"code\"),p.c(),E(n,\"class\",i=t[13]?`language-${t[13]}`:\"\"),E(e,\"class\",a=(t[13]?`language-${t[13]}`:\"\")+\" \"+(t[2]??\"\")),E(e,\"style\",r=t[3]?t[3]:\"\")},m(m,f){U(m,e,f),I(e,n),p.m(n,null),t[15](e),l||(c=bn(o=UT.call(null,e,{addClosing:t[4],catchTab:t[5],highlight:t[12],history:t[6],indentOn:t[7],onUpdate:t[14],preserveIdent:t[8],spellcheck:t[9],syntax:t[13],tab:t[10],value:t[1],withLineNumbers:t[11]})),l=!0)},p(m,[f]){u===(u=d(m,f))&&p?p.p(m,f):(p.d(1),p=u(m),p&&(p.c(),p.m(n,null))),f&8192&&i!==(i=m[13]?`language-${m[13]}`:\"\")&&E(n,\"class\",i),f&8196&&a!==(a=(m[13]?`language-${m[13]}`:\"\")+\" \"+(m[2]??\"\"))&&E(e,\"class\",a),f&8&&r!==(r=m[3]?m[3]:\"\")&&E(e,\"style\",r),o&&qn(o.update)&&f&16370&&o.update.call(null,{addClosing:m[4],catchTab:m[5],highlight:m[12],history:m[6],indentOn:m[7],onUpdate:m[14],preserveIdent:m[8],spellcheck:m[9],syntax:m[13],tab:m[10],value:m[1],withLineNumbers:m[11]})},i:ie,o:ie,d(m){m&&z(e),p.d(),t[15](null),l=!1,c()}}}s(lve,\"create_fragment\");function cve(t,e,n){let i=Bg(),{element:a=void 0}=e,{class:r=void 0}=e,{style:o=void 0}=e,{addClosing:l=!0}=e,{catchTab:c=!0}=e,{history:d=!0}=e,{indentOn:u=/{$/}=e,{preserveIdent:p=!0}=e,{spellcheck:m=!1}=e,{tab:f=\"\t\"}=e,{withLineNumbers:g=void 0}=e,{highlight:x=void 0}=e,{syntax:_=void 0}=e,{value:h=\"\"}=e;function v(y){n(1,h=y),i(\"change\",{value:y})}s(v,\"onUpdate\");function b(y){Te[y?\"unshift\":\"push\"](()=>{a=y,n(0,a)})}return s(b,\"pre_binding\"),t.$$set=y=>{\"element\"in y&&n(0,a=y.element),\"class\"in y&&n(2,r=y.class),\"style\"in y&&n(3,o=y.style),\"addClosing\"in y&&n(4,l=y.addClosing),\"catchTab\"in y&&n(5,c=y.catchTab),\"history\"in y&&n(6,d=y.history),\"indentOn\"in y&&n(7,u=y.indentOn),\"preserveIdent\"in y&&n(8,p=y.preserveIdent),\"spellcheck\"in y&&n(9,m=y.spellcheck),\"tab\"in y&&n(10,f=y.tab),\"withLineNumbers\"in y&&n(11,g=y.withLineNumbers),\"highlight\"in y&&n(12,x=y.highlight),\"syntax\"in y&&n(13,_=y.syntax),\"value\"in y&&n(1,h=y.value)},[a,h,r,o,l,c,d,u,p,m,f,g,x,_,v,b]}s(cve,\"instance\");var Rf=class extends Pe{constructor(e){super(),Ve(this,e,cve,lve,De,{element:0,class:2,style:3,addClosing:4,catchTab:5,history:6,indentOn:7,preserveIdent:8,spellcheck:9,tab:10,withLineNumbers:11,highlight:12,syntax:13,value:1})}};s(Rf,\"CodeJar\");var Td=Rf;function qT(t){let e,n;return{c(){e=L(\"div\"),n=Re(t[1]),E(e,\"class\",\"placeholder svelte-e08vqd\")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(qT,\"create_if_block\");function uve(t){let e,n,i,a,r,o,l,c,d,u,p;function m(_){t[7](_)}s(m,\"codejar_element_binding\");function f(_){t[8](_)}s(f,\"codejar_value_binding\");let g={syntax:t[3],highlight:dve,preserveIdent:!0,history:!0,class:\"language-\"+(t[3]??\"plaintext\"),style:`\n\t\t\tfont-family: var(--font-code);\n\t\t\tfont-size: 14px;\n\t\t\tpadding: 3px 6px;\n\t\t\tmax-height: 20em;\n\t\t\theight: fit-content;\n\t\t\tpadding-bottom: 1rem;\n\t\t\twidth: 100%;\n\t\t\toutline: none;\n\t\t\toverflow-wrap: unset;\n\t\t\toverflow-y: scroll;\n\t\t\twhite-space: pre;\n\t\t\tmargin: 0;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tborder-radius: 0;\n\t\t\ttext-shadow: 0px 1px rgba(0, 0, 0, 0.3);\n\t\t`+t[2]};t[4]!==void 0&&(g.element=t[4]),t[0]!==void 0&&(g.value=t[0]),n=new Td({props:g}),Te.push(()=>Be(n,\"element\",m)),Te.push(()=>Be(n,\"value\",f)),n.$on(\"change\",t[9]);let x=t[1]&&(!t[0]||t[0].length===0)&&qT(t);return{c(){e=L(\"div\"),Ce(n.$$.fragment),r=J(),o=L(\"div\"),c=J(),x&&x.c(),E(e,\"class\",\"content codejar-container svelte-e08vqd\")},m(_,h){U(_,e,h),Ae(n,e,null),I(e,r),I(e,o),I(e,c),x&&x.m(e,null),d=!0,u||(p=[bn(l=t[6].call(null,o)),Ue(e,\"keydown\",t[5])],u=!0)},p(_,[h]){let v={};h&8&&(v.syntax=_[3]),h&8&&(v.class=\"language-\"+(_[3]??\"plaintext\")),h&4&&(v.style=`\n\t\t\tfont-family: var(--font-code);\n\t\t\tfont-size: 14px;\n\t\t\tpadding: 3px 6px;\n\t\t\tmax-height: 20em;\n\t\t\theight: fit-content;\n\t\t\tpadding-bottom: 1rem;\n\t\t\twidth: 100%;\n\t\t\toutline: none;\n\t\t\toverflow-wrap: unset;\n\t\t\toverflow-y: scroll;\n\t\t\twhite-space: pre;\n\t\t\tmargin: 0;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tborder-radius: 0;\n\t\t\ttext-shadow: 0px 1px rgba(0, 0, 0, 0.3);\n\t\t`+_[2]),!i&&h&16&&(i=!0,v.element=_[4],Me(()=>i=!1)),!a&&h&1&&(a=!0,v.value=_[0],Me(()=>a=!1)),n.$set(v),_[1]&&(!_[0]||_[0].length===0)?x?x.p(_,h):(x=qT(_),x.c(),x.m(e,null)):x&&(x.d(1),x=null)},i(_){d||(ae(n.$$.fragment,_),d=!0)},o(_){de(n.$$.fragment,_),d=!1},d(_){_&&z(e),je(n),x&&x.d(),u=!1,Rt(p)}}}s(uve,\"create_fragment\");function dve(t,e){return e?Prism.highlight(t,Prism.languages[e],e):t}s(dve,\"highlight\");function pve(t,e,n){let{value:i}=e,{placeholder:a=void 0}=e,{style:r=void 0}=e,{syntax:o=void 0}=e,l,c=s(f=>{f instanceof KeyboardEvent&&(f.key===\"Tab\"||f.key===\"Enter\"?f.stopPropagation():(f.code===\"KeyZ\"||f.code===\"KeyY\")&&f.ctrlKey&&requestAnimationFrame(()=>{l?.textContent!=null&&n(0,i=l.textContent)}))},\"onKeydown\"),d=s(f=>{l&&(n(4,l.style.overflowWrap=\"unset\",l),n(4,l.style.whiteSpace=\"pre\",l))},\"forceNoWrap\");function u(f){l=f,n(4,l)}s(u,\"codejar_element_binding\");function p(f){i=f,n(0,i)}s(p,\"codejar_value_binding\");let m=s(()=>d(),\"change_handler\");return t.$$set=f=>{\"value\"in f&&n(0,i=f.value),\"placeholder\"in f&&n(1,a=f.placeholder),\"style\"in f&&n(2,r=f.style),\"syntax\"in f&&n(3,o=f.syntax)},t.$$.update=()=>{if(t.$$.dirty&16)e:l&&d();if(t.$$.dirty&1)e:i!==void 0&&d()},[i,a,r,o,l,c,d,u,p,m]}s(pve,\"instance\");var Mf=class extends Pe{constructor(e){super(),Ve(this,e,pve,uve,De,{value:0,placeholder:1,style:2,syntax:3})}};s(Mf,\"CustomCodeJar\");var $s=Mf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.content.svelte-e08vqd{position:relative}.placeholder.svelte-e08vqd{position:absolute;pointer-events:none;color:var(--color-subtle_text);font-family:var(--font-code);font-size:14px;padding:6px 12px;user-select:none;opacity:0.5;top:0;left:0;width:100%;font-style:italic}.codejar-container.svelte-e08vqd .language-snbtTextComponent{& .brackets {\\r\n\t\t\tcolor: #5ba8c5;\\r\n\t\t};& .token.punctuation {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.property {\\r\n\t\t\tcolor: #eeffff;\\r\n\t\t};& .token.escape-sequence {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.constant {\\r\n\t\t\tcolor: #c767d7;\\r\n\t\t\tborder-bottom: 1px solid;\\r\n\t\t};& .token.number {\\r\n\t\t\tcolor: #f92672;\\r\n\t\t};& .token.boolean {\\r\n\t\t\tcolor: #f78c6c;\\r\n\t\t};& .token.string {\\r\n\t\t\tcolor: #aef941;\\r\n\t\t}}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function HT(t){let e,n,i;return{c(){e=L(\"textarea\"),e.readOnly=!0,E(e,\"rows\",n=t[5].split(`\n`).length+1),e.value=i=t[5]??t[4],E(e,\"class\",\"svelte-j9cb7d\")},m(a,r){U(a,e,r)},p(a,r){r&32&&n!==(n=a[5].split(`\n`).length+1)&&E(e,\"rows\",n),r&48&&i!==(i=a[5]??a[4])&&(e.value=i)},d(a){a&&z(e)}}}s(HT,\"create_if_block\");function mve(t){let e,n,i,a,r,o,l,c,d,u,p,m;function f(_){t[11](_)}s(f,\"customcodejar_value_binding\");let g={syntax:t[3],style:t[5]?\"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;\":\"border: 1px solid var(--color-border);\"};t[6]!==void 0&&(g.value=t[6]),l=new $s({props:g}),Te.push(()=>Be(l,\"value\",f));let x=(t[5]||t[4])&&HT(t);return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"div\"),Ce(l.$$.fragment),d=J(),x&&x.c(),E(n,\"class\",\"name_space_left svelte-j9cb7d\"),E(n,\"for\",a=t[15]),E(o,\"class\",\"content codejar-container svelte-j9cb7d\"),E(e,\"class\",\"dialog_bar form_bar custom svelte-j9cb7d\")},m(_,h){U(_,e,h),I(e,n),I(n,i),I(e,r),I(e,o),Ae(l,o,null),I(o,d),x&&x.m(o,null),u=!0,p||(m=Ue(o,\"keydown\",t[7]),p=!0)},p(_,h){(!u||h&1)&&ct(i,_[0]),(!u||h&32768&&a!==(a=_[15]))&&E(n,\"for\",a);let v={};h&8&&(v.syntax=_[3]),h&32&&(v.style=_[5]?\"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;\":\"border: 1px solid var(--color-border);\"),!c&&h&64&&(c=!0,v.value=_[6],Me(()=>c=!1)),l.$set(v),_[5]||_[4]?x?x.p(_,h):(x=HT(_),x.c(),x.m(o,null)):x&&(x.d(1),x=null)},i(_){u||(ae(l.$$.fragment,_),u=!0)},o(_){de(l.$$.fragment,_),u=!1},d(_){_&&z(e),je(l),x&&x.d(),p=!1,m()}}}s(mve,\"create_default_slot\");function fve(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[8],$$slots:{default:[mve,({id:i})=>({15:i}),({id:i})=>i?32768:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&98425&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(fve,\"create_fragment\");function hve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,y=>n(6,i=y)),c),\"$$subscribe_value\");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=\"\"}=e,{value:c}=e;r();let{defaultValue:d}=e,{valueChecker:u=void 0}=e,{syntax:p=void 0}=e;c.get();let m,f=\"\",g=\"\";function x(){if(u){let y=u(i);y.type===\"error\"?n(5,g=y.message):n(5,g=\"\"),y.type===\"warning\"?n(4,f=y.message):n(4,f=\"\")}}s(x,\"onValueChange\");let _=c.subscribe(()=>{x()});Zi(()=>{_()});let h=s(y=>{y instanceof KeyboardEvent&&(y.key===\"Tab\"||y.key===\"Enter\"?y.stopPropagation():(y.code===\"KeyZ\"||y.code===\"KeyY\")&&y.ctrlKey&&requestAnimationFrame(()=>{m?.textContent!=null&&Jt(c,i=m.textContent,i)}))},\"onKeydown\");function v(){Jt(c,i=d,i),x()}s(v,\"onReset\"),x();function b(y){i=y,c.set(i)}return s(b,\"customcodejar_value_binding\"),t.$$set=y=>{\"label\"in y&&n(0,o=y.label),\"tooltip\"in y&&n(1,l=y.tooltip),\"value\"in y&&r(n(2,c=y.value)),\"defaultValue\"in y&&n(9,d=y.defaultValue),\"valueChecker\"in y&&n(10,u=y.valueChecker),\"syntax\"in y&&n(3,p=y.syntax)},[o,l,c,p,f,g,i,h,v,d,u,b]}s(hve,\"instance\");var Bf=class extends Pe{constructor(e){super(),Ve(this,e,hve,fve,De,{label:0,tooltip:1,value:2,defaultValue:9,valueChecker:10,syntax:3})}};s(Bf,\"CodeInput\");var ka=Bf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`label.svelte-j9cb7d{margin-bottom:8px}.custom.svelte-j9cb7d{flex-direction:column}textarea.svelte-j9cb7d{color:var(--color-error);background-color:var(--color-back);padding:3px 6px;overflow:auto;height:min-content;font-size:0.9rem;font-family:var(--font-code);margin:8px;margin-top:0px;border-radius:0 0 0.3em 0.3em;border:1px solid var(--color-error);white-space:pre;tab-size:4}.codejar-container.svelte-j9cb7d .language-snbtTextComponent{& .brackets {\\r\n\t\t\tcolor: #5ba8c5;\\r\n\t\t};& .token.punctuation {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.property {\\r\n\t\t\tcolor: #eeffff;\\r\n\t\t};& .token.escape-sequence {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.constant {\\r\n\t\t\tcolor: #c767d7;\\r\n\t\t\tborder-bottom: 1px solid;\\r\n\t\t};& .token.number {\\r\n\t\t\tcolor: #f92672;\\r\n\t\t};& .token.boolean {\\r\n\t\t\tcolor: #f78c6c;\\r\n\t\t};& .token.string {\\r\n\t\t\tcolor: #aef941;\\r\n\t\t}}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function gve(t){let e,n,i,a,r,o,l,c,d,u,p,m;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"div\"),l=L(\"div\"),c=J(),d=L(\"input\"),E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[7]),E(l,\"class\",\"spacer svelte-1ai5ebm\"),E(d,\"type\",\"checkbox\"),E(d,\"class\",\"focusable_input\"),E(d,\"id\",u=t[7]),E(o,\"class\",\"checkbox-line svelte-1ai5ebm\"),E(e,\"class\",\"dialog_bar form_bar checkbox_bar svelte-1ai5ebm\")},m(f,g){U(f,e,g),I(e,n),I(n,i),I(e,r),I(e,o),I(o,l),I(o,c),I(o,d),d.checked=t[3],p||(m=Ue(d,\"change\",t[6]),p=!0)},p(f,g){g&1&&ct(i,f[0]),g&128&&a!==(a=f[7])&&E(n,\"for\",a),g&128&&u!==(u=f[7])&&E(d,\"id\",u),g&8&&(d.checked=f[3])},d(f){f&&z(e),p=!1,m()}}}s(gve,\"create_default_slot\");function _ve(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[4],$$slots:{default:[gve,({id:i})=>({7:i}),({id:i})=>i?128:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&393&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(_ve,\"create_fragment\");function xve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,m=>n(3,i=m)),c),\"$$subscribe_checked\");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=\"\"}=e,{checked:c}=e;r();let{defaultValue:d}=e;function u(){c.set(d)}s(u,\"onReset\");function p(){i=this.checked,c.set(i)}return s(p,\"input_change_handler\"),t.$$set=m=>{\"label\"in m&&n(0,o=m.label),\"tooltip\"in m&&n(1,l=m.tooltip),\"checked\"in m&&r(n(2,c=m.checked)),\"defaultValue\"in m&&n(5,d=m.defaultValue)},[o,l,c,i,u,d,p]}s(xve,\"instance\");var Pf=class extends Pe{constructor(e){super(),Ve(this,e,xve,_ve,De,{label:0,tooltip:1,checked:2,defaultValue:5})}};s(Pf,\"Checkbox\");var mi=Pf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".checkbox_bar.svelte-1ai5ebm{flex-direction:row}.checkbox-line.svelte-1ai5ebm{display:flex;flex-direction:row;align-items:center;height:min-content;flex-grow:1}.spacer.svelte-1ai5ebm{flex-grow:1;border-bottom:2px dashed var(--color-button);height:0px;margin:8px;margin-left:0px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var JT=Ee(\"module\");var vve=(0,JT.createRequire)(\"/\"),bve;try{bve=vve(\"worker_threads\").Worker}catch{}var ra=Uint8Array,kc=Uint16Array,yve=Int32Array,GT=new ra([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),WT=new ra([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),wve=new ra([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),KT=s(function(t,e){for(var n=new kc(31),i=0;i<31;++i)n[i]=e+=1<<t[i-1];for(var a=new yve(n[30]),i=1;i<30;++i)for(var r=n[i];r<n[i+1];++r)a[r]=r-n[i]<<5|i;return{b:n,r:a}},\"freb\"),YT=KT(GT,2),XT=YT.b,Eve=YT.r;XT[28]=258,Eve[258]=28;var ZT=KT(WT,0),kve=ZT.b,WDe=ZT.r,iv=new kc(32768);for(Ut=0;Ut<32768;++Ut)yo=(Ut&43690)>>1|(Ut&21845)<<1,yo=(yo&52428)>>2|(yo&13107)<<2,yo=(yo&61680)>>4|(yo&3855)<<4,iv[Ut]=((yo&65280)>>8|(yo&255)<<8)>>1;var yo,Ut,Cd=s(function(t,e,n){for(var i=t.length,a=0,r=new kc(e);a<i;++a)t[a]&&++r[t[a]-1];var o=new kc(e);for(a=1;a<e;++a)o[a]=o[a-1]+r[a-1]<<1;var l;if(n){l=new kc(1<<e);var c=15-e;for(a=0;a<i;++a)if(t[a])for(var d=a<<4|t[a],u=e-t[a],p=o[t[a]-1]++<<u,m=p|(1<<u)-1;p<=m;++p)l[iv[p]>>c]=d}else for(l=new kc(i),a=0;a<i;++a)t[a]&&(l[a]=iv[o[t[a]-1]++]>>15-t[a]);return l},\"hMap\"),Sd=new ra(288);for(Ut=0;Ut<144;++Ut)Sd[Ut]=8;var Ut;for(Ut=144;Ut<256;++Ut)Sd[Ut]=9;var Ut;for(Ut=256;Ut<280;++Ut)Sd[Ut]=7;var Ut;for(Ut=280;Ut<288;++Ut)Sd[Ut]=8;var Ut,QT=new ra(32);for(Ut=0;Ut<32;++Ut)QT[Ut]=5;var Ut;var jve=Cd(Sd,9,1);var Ave=Cd(QT,5,1),ev=s(function(t){for(var e=t[0],n=1;n<t.length;++n)t[n]>e&&(e=t[n]);return e},\"max\"),Ka=s(function(t,e,n){var i=e/8|0;return(t[i]|t[i+1]<<8)>>(e&7)&n},\"bits\"),tv=s(function(t,e){var n=e/8|0;return(t[n]|t[n+1]<<8|t[n+2]<<16)>>(e&7)},\"bits16\"),Tve=s(function(t){return(t+7)/8|0},\"shft\"),rv=s(function(t,e,n){return(e==null||e<0)&&(e=0),(n==null||n>t.length)&&(n=t.length),new ra(t.subarray(e,n))},\"slc\");var Cve=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],ja=s(function(t,e,n){var i=new Error(e||Cve[t]);if(i.code=t,Error.captureStackTrace&&Error.captureStackTrace(i,ja),!n)throw i;return i},\"err\"),Sve=s(function(t,e,n,i){var a=t.length,r=i?i.length:0;if(!a||e.f&&!e.l)return n||new ra(0);var o=!n,l=o||e.i!=2,c=e.i;o&&(n=new ra(a*3));var d=s(function(Y){var we=n.length;if(Y>we){var Le=new ra(Math.max(we*2,Y));Le.set(n),n=Le}},\"cbuf\"),u=e.f||0,p=e.p||0,m=e.b||0,f=e.l,g=e.d,x=e.m,_=e.n,h=a*8;do{if(!f){u=Ka(t,p,1);var v=Ka(t,p+1,3);if(p+=3,v)if(v==1)f=jve,g=Ave,x=9,_=5;else if(v==2){var S=Ka(t,p,31)+257,F=Ka(t,p+10,15)+4,N=S+Ka(t,p+5,31)+1;p+=14;for(var k=new ra(N),R=new ra(19),D=0;D<F;++D)R[wve[D]]=Ka(t,p+D*3,7);p+=F*3;for(var B=ev(R),q=(1<<B)-1,G=Cd(R,B,1),D=0;D<N;){var W=G[Ka(t,p,q)];p+=W&15;var b=W>>4;if(b<16)k[D++]=b;else{var ee=0,Z=0;for(b==16?(Z=3+Ka(t,p,3),p+=2,ee=k[D-1]):b==17?(Z=3+Ka(t,p,7),p+=3):b==18&&(Z=11+Ka(t,p,127),p+=7);Z--;)k[D++]=ee}}var me=k.subarray(0,S),X=k.subarray(S);x=ev(me),_=ev(X),f=Cd(me,x,1),g=Cd(X,_,1)}else ja(1);else{var b=Tve(p)+4,y=t[b-4]|t[b-3]<<8,w=b+y;if(w>a){c&&ja(0);break}l&&d(m+y),n.set(t.subarray(b,w),m),e.b=m+=y,e.p=p=w*8,e.f=u;continue}if(p>h){c&&ja(0);break}}l&&d(m+131072);for(var Q=(1<<x)-1,he=(1<<_)-1,Ie=p;;Ie=p){var ee=f[tv(t,p)&Q],le=ee>>4;if(p+=ee&15,p>h){c&&ja(0);break}if(ee||ja(2),le<256)n[m++]=le;else if(le==256){Ie=p,f=null;break}else{var ge=le-254;if(le>264){var D=le-257,V=GT[D];ge=Ka(t,p,(1<<V)-1)+XT[D],p+=V}var H=g[tv(t,p)&he],re=H>>4;H||ja(3),p+=H&15;var X=kve[re];if(re>3){var V=WT[re];X+=tv(t,p)&(1<<V)-1,p+=V}if(p>h){c&&ja(0);break}l&&d(m+131072);var xe=m+ge;if(m<X){var fe=r-X,te=Math.min(X,xe);for(fe+m<0&&ja(3);m<te;++m)n[m]=i[fe+m]}for(;m<xe;++m)n[m]=n[m-X]}}e.l=f,e.p=Ie,e.b=m,e.f=u,f&&(u=1,e.m=x,e.d=g,e.n=_)}while(!u);return m!=n.length&&o?rv(n,0,m):n.subarray(0,m)},\"inflt\");var Ove=new ra(0);var Br=s(function(t,e){return t[e]|t[e+1]<<8},\"b2\"),Ya=s(function(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0},\"b4\"),nv=s(function(t,e){return Ya(t,e)+Ya(t,e+4)*4294967296},\"b8\");function Ive(t,e){return Sve(t,{i:2},e&&e.out,e&&e.dictionary)}s(Ive,\"inflateSync\");var av=typeof TextDecoder<\"u\"&&new TextDecoder,Dve=0;try{av.decode(Ove,{stream:!0}),Dve=1}catch{}var Fve=s(function(t){for(var e=\"\",n=0;;){var i=t[n++],a=(i>127)+(i>223)+(i>239);if(n+a>t.length)return{s:e,r:rv(t,n-1)};a?a==3?(i=((i&15)<<18|(t[n++]&63)<<12|(t[n++]&63)<<6|t[n++]&63)-65536,e+=String.fromCharCode(55296|i>>10,56320|i&1023)):a&1?e+=String.fromCharCode((i&31)<<6|t[n++]&63):e+=String.fromCharCode((i&15)<<12|(t[n++]&63)<<6|t[n++]&63):e+=String.fromCharCode(i)}},\"dutf8\");function Nve(t,e){if(e){for(var n=\"\",i=0;i<t.length;i+=16384)n+=String.fromCharCode.apply(null,t.subarray(i,i+16384));return n}else{if(av)return av.decode(t);var a=Fve(t),r=a.s,n=a.r;return n.length&&ja(8),r}}s(Nve,\"strFromU8\");var Rve=s(function(t,e){return e+30+Br(t,e+26)+Br(t,e+28)},\"slzh\"),Mve=s(function(t,e,n){var i=Br(t,e+28),a=Nve(t.subarray(e+46,e+46+i),!(Br(t,e+8)&2048)),r=e+46+i,o=Ya(t,e+20),l=n&&o==4294967295?Bve(t,r):[o,Ya(t,e+24),Ya(t,e+42)],c=l[0],d=l[1],u=l[2];return[Br(t,e+10),c,d,a,r+Br(t,e+30)+Br(t,e+32),u]},\"zh\"),Bve=s(function(t,e){for(;Br(t,e)!=1;e+=4+Br(t,e+2));return[nv(t,e+12),nv(t,e+4),nv(t,e+20)]},\"z64e\");function $T(t,e){for(var n={},i=t.length-22;Ya(t,i)!=101010256;--i)(!i||t.length-i>65558)&&ja(13);var a=Br(t,i+8);if(!a)return{};var r=Ya(t,i+16),o=r==4294967295||a==65535;if(o){var l=Ya(t,i-12);o=Ya(t,l)==101075792,o&&(a=Ya(t,l+32),r=Ya(t,l+48))}for(var c=e&&e.filter,d=0;d<a;++d){var u=Mve(t,r,o),p=u[0],m=u[1],f=u[2],g=u[3],x=u[4],_=u[5],h=Rve(t,_);r=x,(!c||c({name:g,size:m,originalSize:f,compression:p}))&&(p?p==8?n[g]=Ive(t.subarray(h,h+m),{out:new ra(f)}):ja(14,\"unknown compression type \"+p):n[g]=rv(t,h,h+m))}return n}s($T,\"unzipSync\");var Lve=$T(Uint8Array.from(atob(\"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aWxlci8xLjIwLjUvYW5pbWF0aW9uLm1jYlBLAQIUABQAAAAIAE9qYVs3yWeemhEAAAVnAAAuAAAAAAAAAAAAAAAAALRkAABzcmMvc3lzdGVtcy9kYXRhcGFja0NvbXBpbGVyLzEuMjAuNS9zdGF0aWMubWNiUEsBAhQAFAAAAAgAT2phW5nUvcZlCQAAxisAAC4AAAAAAAAAAAAAAAAAmnYAAHNyYy9zeXN0ZW1zL2RhdGFwYWNrQ29tcGlsZXIvMS4yMS4yL2dsb2JhbC5tY2JQSwECFAAUAAAACABPamFbOQ8tTZkRAADjZgAALgAAAAAAAAAAAAAAAABLgAAAc3JjL3N5c3RlbXMvZGF0YXBhY2tDb21waWxlci8xLjIxLjIvc3RhdGljLm1jYlBLAQIUABQAAAAIAE9qYVsCLvJUqxEAAO1mAAAuAAAAAAAAAAAAAAAAADCSAABzcmMvc3lzdGVtcy9kYXRhcGFja0NvbXBpbGVyLzEuMjEuNC9zdGF0aWMubWNiUEsBAhQAFAAAAAgAT2phWwcQo4jdHgAAf7gAADEAAAAAAAAAAAAAAAAAJ6QAAHNyYy9zeXN0ZW1zL2RhdGFwYWNrQ29tcGlsZXIvMS4yMS40L2FuaW1hdGlvbi5tY2JQSwECFAAUAAAACABPamFbbnjYOcweAAB1uAAAMQAAAAAAAAAAAAAAAABTwwAAc3JjL3N5c3RlbXMvZGF0YXBhY2tDb21waWxlci8xLjIxLjIvYW5pbWF0aW9uLm1jYlBLBQYAAAAADAAMAF0EAABu4gAAAAA=\"),t=>t.charCodeAt(0)));function _n(t){return Buffer.from(Lve[t]).toString(\"utf-8\")}s(_n,\"getFile\");var e4=_n(\"src/systems/datapackCompiler/1.20.4/animation.mcb\");var ov=_n(\"src/systems/datapackCompiler/1.20.4/global.mcb\");var ns=_n(\"src/systems/datapackCompiler/1.20.4/global.mcbt\");var t4=_n(\"src/systems/datapackCompiler/1.20.4/static.mcb\");var n4=_n(\"src/systems/datapackCompiler/1.20.5/animation.mcb\");var i4=_n(\"src/systems/datapackCompiler/1.20.5/static.mcb\");var a4=_n(\"src/systems/datapackCompiler/1.21.2/animation.mcb\");var sv=_n(\"src/systems/datapackCompiler/1.21.2/global.mcb\");var r4=_n(\"src/systems/datapackCompiler/1.21.2/static.mcb\");var Od=_n(\"src/systems/datapackCompiler/1.21.4/animation.mcb\");var Id=_n(\"src/systems/datapackCompiler/1.21.4/static.mcb\");var Lf=_n(\"src/systems/datapackCompiler/1.21.5/global.mcb\");var Vve={\"1.21.9\":{animation:Od,static:Id,global:Lf,globalTemplates:ns},\"1.21.6\":{animation:Od,static:Id,global:Lf,globalTemplates:ns},\"1.21.5\":{animation:Od,static:Id,global:Lf,globalTemplates:ns},\"1.21.4\":{animation:Od,static:Id,global:sv,globalTemplates:ns},\"1.21.2\":{animation:a4,static:r4,global:sv,globalTemplates:ns},\"1.20.5\":{animation:n4,static:i4,global:ov,globalTemplates:ns},\"1.20.4\":{animation:e4,static:t4,global:ov,globalTemplates:ns}},wo=Vve;function o4(t){let e,n,i,a;function r(c){t[40](c)}s(r,\"vector2d_valueX_binding_1\");function o(c){t[41](c)}s(o,\"vector2d_valueY_binding_1\");let l={label:A(\"dialog.blueprint_settings.render_box.title\"),tooltip:A(\"dialog.blueprint_settings.render_box.description\"),defaultValueX:qt.render_box[0],minX:2,maxX:4096,defaultValueY:qt.render_box[1],minY:2,maxY:4096};return t[9]!==void 0&&(l.valueX=t[9]),t[10]!==void 0&&(l.valueY=t[10]),e=new Zx({props:l}),Te.push(()=>Be(e,\"valueX\",r)),Te.push(()=>Be(e,\"valueY\",o)),{c(){Ce(e.$$.fragment)},m(c,d){Ae(e,c,d),a=!0},p(c,d){let u={};!n&&d[0]&512&&(n=!0,u.valueX=c[9],Me(()=>n=!1)),!i&&d[0]&1024&&(i=!0,u.valueY=c[10],Me(()=>i=!1)),e.$set(u)},i(c){a||(ae(e.$$.fragment,c),a=!0)},o(c){de(e.$$.fragment,c),a=!1},d(c){je(e,c)}}}s(o4,\"create_if_block_9\");function zve(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_;function h(k){t[46](k)}s(h,\"select0_value_binding\");let v={label:A(\"dialog.blueprint_settings.target_minecraft_version.title\"),tooltip:A(\"dialog.blueprint_settings.target_minecraft_version.description\"),options:d4,defaultOption:Object.keys(d4).at(-1)??\"1.20.4\"};t[6]!==void 0&&(v.value=t[6]),e=new es({props:v}),Te.push(()=>Be(e,\"value\",h)),a=new ts({props:{label:A(\"dialog.blueprint_settings.resource_pack_settings.title\")}});function b(k){t[47](k)}s(b,\"select1_value_binding\");let y={label:A(\"dialog.blueprint_settings.resource_pack_export_mode.title\"),options:{folder:A(\"dialog.blueprint_settings.resource_pack_export_mode.options.folder\"),none:A(\"dialog.blueprint_settings.resource_pack_export_mode.options.none\")},defaultOption:\"folder\"};t[4]!==void 0&&(y.value=t[4]),o=new es({props:y}),Te.push(()=>Be(o,\"value\",b));let w=t[30]!==\"none\"&&s4(t);u=new ts({props:{label:A(\"dialog.blueprint_settings.data_pack_settings.title\")}});function S(k){t[53](k)}s(S,\"select2_value_binding\");let F={label:A(\"dialog.blueprint_settings.data_pack_export_mode.title\"),options:{folder:A(\"dialog.blueprint_settings.data_pack_export_mode.options.folder\"),none:A(\"dialog.blueprint_settings.data_pack_export_mode.options.none\")},defaultOption:\"folder\"};t[5]!==void 0&&(F.value=t[5]),m=new es({props:F}),Te.push(()=>Be(m,\"value\",S));let N=t[32]!==\"none\"&&u4(t);return{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),r=J(),Ce(o.$$.fragment),c=J(),w&&w.c(),d=J(),Ce(u.$$.fragment),p=J(),Ce(m.$$.fragment),g=J(),N&&N.c(),x=_t()},m(k,R){Ae(e,k,R),U(k,i,R),Ae(a,k,R),U(k,r,R),Ae(o,k,R),U(k,c,R),w&&w.m(k,R),U(k,d,R),Ae(u,k,R),U(k,p,R),Ae(m,k,R),U(k,g,R),N&&N.m(k,R),U(k,x,R),_=!0},p(k,R){let D={};!n&&R[0]&64&&(n=!0,D.value=k[6],Me(()=>n=!1)),e.$set(D);let B={};!l&&R[0]&16&&(l=!0,B.value=k[4],Me(()=>l=!1)),o.$set(B),k[30]!==\"none\"?w?(w.p(k,R),R[0]&1073741824&&ae(w,1)):(w=s4(k),w.c(),ae(w,1),w.m(d.parentNode,d)):w&&(Sn(),de(w,1,1,()=>{w=null}),On());let q={};!f&&R[0]&32&&(f=!0,q.value=k[5],Me(()=>f=!1)),m.$set(q),k[32]!==\"none\"?N?(N.p(k,R),R[1]&2&&ae(N,1)):(N=u4(k),N.c(),ae(N,1),N.m(x.parentNode,x)):N&&(Sn(),de(N,1,1,()=>{N=null}),On())},i(k){_||(ae(e.$$.fragment,k),ae(a.$$.fragment,k),ae(o.$$.fragment,k),ae(w),ae(u.$$.fragment,k),ae(m.$$.fragment,k),ae(N),_=!0)},o(k){de(e.$$.fragment,k),de(a.$$.fragment,k),de(o.$$.fragment,k),de(w),de(u.$$.fragment,k),de(m.$$.fragment,k),de(N),_=!1},d(k){je(e,k),k&&z(i),je(a,k),k&&z(r),je(o,k),k&&z(c),w&&w.d(k),k&&z(d),je(u,k),k&&z(p),je(m,k),k&&z(g),N&&N.d(k),k&&z(x)}}}s(zve,\"create_else_block\");function Uve(t){let e,n,i,a,r,o,l,c,d;function u(_){t[43](_)}s(u,\"lineinput_value_binding\");let p={label:A(\"dialog.blueprint_settings.display_item.title\"),tooltip:A(\"dialog.blueprint_settings.display_item.description\"),defaultValue:qt.display_item,valueChecker:p4};t[11]!==void 0&&(p.value=t[11]),e=new aa({props:p}),Te.push(()=>Be(e,\"value\",u));function m(_){t[44](_)}s(m,\"checkbox_checked_binding\");let f={label:A(\"dialog.blueprint_settings.baked_animations.title\"),tooltip:A(\"dialog.blueprint_settings.baked_animations.description\"),defaultValue:qt.baked_animations};t[24]!==void 0&&(f.checked=t[24]),a=new mi({props:f}),Te.push(()=>Be(a,\"checked\",m));function g(_){t[45](_)}s(g,\"fileselect_value_binding\");let x={label:A(\"dialog.blueprint_settings.json_file.title\"),tooltip:A(\"dialog.blueprint_settings.json_file.description\"),defaultValue:qt.json_file,valueChecker:Qve};return t[25]!==void 0&&(x.value=t[25]),l=new Nf({props:x}),Te.push(()=>Be(l,\"value\",g)),{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment)},m(_,h){Ae(e,_,h),U(_,i,h),Ae(a,_,h),U(_,o,h),Ae(l,_,h),d=!0},p(_,h){let v={};!n&&h[0]&2048&&(n=!0,v.value=_[11],Me(()=>n=!1)),e.$set(v);let b={};!r&&h[0]&16777216&&(r=!0,b.checked=_[24],Me(()=>r=!1)),a.$set(b);let y={};!c&&h[0]&33554432&&(c=!0,y.value=_[25],Me(()=>c=!1)),l.$set(y)},i(_){d||(ae(e.$$.fragment,_),ae(a.$$.fragment,_),ae(l.$$.fragment,_),d=!0)},o(_){de(e.$$.fragment,_),de(a.$$.fragment,_),de(l.$$.fragment,_),d=!1},d(_){je(e,_),_&&z(i),je(a,_),_&&z(o),je(l,_)}}}s(Uve,\"create_if_block\");function s4(t){let e,n,i,a,r,o,l,c,d,u=t[27]&&l4(t),p=[Hve,qve],m=[];function f(h,v){return h[30]===\"folder\"?0:h[30]===\"zip\"?1:-1}s(f,\"select_block_type_1\"),~(n=f(t,[-1,-1,-1]))&&(i=m[n]=p[n](t));function g(h){t[51](h)}s(g,\"checkbox_checked_binding_1\");let x={label:A(\"dialog.blueprint_settings.enable_advanced_resource_pack_settings.title\"),defaultValue:qt.enable_advanced_resource_pack_settings};t[13]!==void 0&&(x.checked=t[13]),r=new mi({props:x}),Te.push(()=>Be(r,\"checked\",g));let _=t[31]&&c4(t);return{c(){u&&u.c(),e=J(),i&&i.c(),a=J(),Ce(r.$$.fragment),l=J(),_&&_.c(),c=_t()},m(h,v){u&&u.m(h,v),U(h,e,v),~n&&m[n].m(h,v),U(h,a,v),Ae(r,h,v),U(h,l,v),_&&_.m(h,v),U(h,c,v),d=!0},p(h,v){h[27]?u?(u.p(h,v),v[0]&134217728&&ae(u,1)):(u=l4(h),u.c(),ae(u,1),u.m(e.parentNode,e)):u&&(Sn(),de(u,1,1,()=>{u=null}),On());let b=n;n=f(h,v),n===b?~n&&m[n].p(h,v):(i&&(Sn(),de(m[b],1,1,()=>{m[b]=null}),On()),~n?(i=m[n],i?i.p(h,v):(i=m[n]=p[n](h),i.c()),ae(i,1),i.m(a.parentNode,a)):i=null);let y={};!o&&v[0]&8192&&(o=!0,y.checked=h[13],Me(()=>o=!1)),r.$set(y),h[31]?_?(_.p(h,v),v[1]&1&&ae(_,1)):(_=c4(h),_.c(),ae(_,1),_.m(c.parentNode,c)):_&&(Sn(),de(_,1,1,()=>{_=null}),On())},i(h){d||(ae(u),ae(i),ae(r.$$.fragment,h),ae(_),d=!0)},o(h){de(u),de(i),de(r.$$.fragment,h),de(_),d=!1},d(h){u&&u.d(h),h&&z(e),~n&&m[n].d(h),h&&z(a),je(r,h),h&&z(l),_&&_.d(h),h&&z(c)}}}s(s4,\"create_if_block_4\");function l4(t){let e,n,i;function a(o){t[48](o)}s(a,\"lineinput_value_binding_1\");let r={label:A(\"dialog.blueprint_settings.display_item.title\"),tooltip:A(\"dialog.blueprint_settings.display_item.description\"),defaultValue:qt.display_item,valueChecker:p4};return t[11]!==void 0&&(r.value=t[11]),e=new aa({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2048&&(n=!0,c.value=o[11],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(l4,\"create_if_block_8\");function qve(t){let e,n,i;function a(o){t[50](o)}s(a,\"fileselect_value_binding_1\");let r={label:A(\"dialog.blueprint_settings.resource_pack_zip.title\"),tooltip:A(\"dialog.blueprint_settings.resource_pack_zip.description\"),defaultValue:qt.resource_pack,valueChecker:m4};return t[14]!==void 0&&(r.value=t[14]),e=new Nf({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&16384&&(n=!0,c.value=o[14],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(qve,\"create_if_block_7\");function Hve(t){let e,n,i;function a(o){t[49](o)}s(a,\"folderselect_value_binding\");let r={label:A(\"dialog.blueprint_settings.resource_pack.title\"),tooltip:A(\"dialog.blueprint_settings.resource_pack.description\"),defaultValue:qt.resource_pack,valueChecker:Zve};return t[14]!==void 0&&(r.value=t[14]),e=new Qx({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&16384&&(n=!0,c.value=o[14],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Hve,\"create_if_block_6\");function c4(t){let e,n,i,a,r;function o(c){t[52](c)}s(o,\"numberslider_value_binding\");let l={label:A(\"dialog.blueprint_settings.custom_model_data_offset.title\"),tooltip:A(\"dialog.blueprint_settings.custom_model_data_offset.description\"),defaultValue:qt.custom_model_data_offset,min:0,max:2147483647,valueStep:1};return t[12]!==void 0&&(l.value=t[12]),i=new Mr({props:l}),Te.push(()=>Be(i,\"value\",o)),{c(){e=L(\"p\"),e.textContent=`${A(\"dialog.blueprint_settings.advanced_settings_warning\")}`,n=J(),Ce(i.$$.fragment),E(e,\"class\",\"warning svelte-1fhdn4b\")},m(c,d){U(c,e,d),U(c,n,d),Ae(i,c,d),r=!0},p(c,d){let u={};!a&&d[0]&4096&&(a=!0,u.value=c[12],Me(()=>a=!1)),i.$set(u)},i(c){r||(ae(i.$$.fragment,c),r=!0)},o(c){de(i.$$.fragment,c),r=!1},d(c){c&&z(e),c&&z(n),je(i,c)}}}s(c4,\"create_if_block_5\");function u4(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B=[Gve,Jve],q=[];function G(Y,we){return Y[32]===\"folder\"?0:Y[32]===\"zip\"?1:-1}s(G,\"select_block_type_2\"),~(e=G(t,[-1,-1,-1]))&&(n=q[e]=B[e](t));function W(Y){t[56](Y)}s(W,\"codeinput0_value_binding\");let ee={label:A(\"dialog.blueprint_settings.on_summon_function.title\"),tooltip:A(\"dialog.blueprint_settings.on_summon_function.description\"),defaultValue:qt.on_summon_function};t[16]!==void 0&&(ee.value=t[16]),a=new ka({props:ee}),Te.push(()=>Be(a,\"value\",W));function Z(Y){t[57](Y)}s(Z,\"codeinput1_value_binding\");let me={label:A(\"dialog.blueprint_settings.on_remove_function.title\"),tooltip:A(\"dialog.blueprint_settings.on_remove_function.description\"),defaultValue:qt.on_remove_function};t[17]!==void 0&&(me.value=t[17]),l=new ka({props:me}),Te.push(()=>Be(l,\"value\",Z));function X(Y){t[58](Y)}s(X,\"codeinput2_value_binding\");let Q={label:A(\"dialog.blueprint_settings.on_pre_tick_function.title\"),tooltip:A(\"dialog.blueprint_settings.on_pre_tick_function.description\"),defaultValue:qt.on_pre_tick_function};t[18]!==void 0&&(Q.value=t[18]),u=new ka({props:Q}),Te.push(()=>Be(u,\"value\",X));function he(Y){t[59](Y)}s(he,\"codeinput3_value_binding\");let Ie={label:A(\"dialog.blueprint_settings.on_post_tick_function.title\"),tooltip:A(\"dialog.blueprint_settings.on_post_tick_function.description\"),defaultValue:qt.on_post_tick_function};t[19]!==void 0&&(Ie.value=t[19]),f=new ka({props:Ie}),Te.push(()=>Be(f,\"value\",he));function le(Y){t[60](Y)}s(le,\"numberslider0_value_binding\");let ge={label:A(\"dialog.blueprint_settings.interpolation_duration.title\"),tooltip:A(\"dialog.blueprint_settings.interpolation_duration.description\"),defaultValue:qt.interpolation_duration,min:0,max:2147483647,valueStep:1};t[20]!==void 0&&(ge.value=t[20]),_=new Mr({props:ge}),Te.push(()=>Be(_,\"value\",le));function V(Y){t[61](Y)}s(V,\"numberslider1_value_binding\");let H={label:A(\"dialog.blueprint_settings.teleportation_duration.title\"),tooltip:A(\"dialog.blueprint_settings.teleportation_duration.description\"),defaultValue:qt.teleportation_duration,min:0,max:2147483647,valueStep:1};t[21]!==void 0&&(H.value=t[21]),b=new Mr({props:H}),Te.push(()=>Be(b,\"value\",V));function re(Y){t[62](Y)}s(re,\"checkbox0_checked_binding_1\");let xe={label:A(\"dialog.blueprint_settings.auto_update_rig_orientation.title\"),tooltip:A(\"dialog.blueprint_settings.auto_update_rig_orientation.description\"),defaultValue:qt.auto_update_rig_orientation};t[23]!==void 0&&(xe.checked=t[23]),S=new mi({props:xe}),Te.push(()=>Be(S,\"checked\",re));function fe(Y){t[63](Y)}s(fe,\"checkbox1_checked_binding_1\");let te={label:A(\"dialog.blueprint_settings.use_storage_for_animation.title\"),tooltip:A(\"dialog.blueprint_settings.use_storage_for_animation.description\"),defaultValue:qt.use_storage_for_animation};return t[22]!==void 0&&(te.checked=t[22]),k=new mi({props:te}),Te.push(()=>Be(k,\"checked\",fe)),{c(){n&&n.c(),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),Ce(u.$$.fragment),m=J(),Ce(f.$$.fragment),x=J(),Ce(_.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),Ce(S.$$.fragment),N=J(),Ce(k.$$.fragment)},m(Y,we){~e&&q[e].m(Y,we),U(Y,i,we),Ae(a,Y,we),U(Y,o,we),Ae(l,Y,we),U(Y,d,we),Ae(u,Y,we),U(Y,m,we),Ae(f,Y,we),U(Y,x,we),Ae(_,Y,we),U(Y,v,we),Ae(b,Y,we),U(Y,w,we),Ae(S,Y,we),U(Y,N,we),Ae(k,Y,we),D=!0},p(Y,we){let Le=e;e=G(Y,we),e===Le?~e&&q[e].p(Y,we):(n&&(Sn(),de(q[Le],1,1,()=>{q[Le]=null}),On()),~e?(n=q[e],n?n.p(Y,we):(n=q[e]=B[e](Y),n.c()),ae(n,1),n.m(i.parentNode,i)):n=null);let Tt={};!r&&we[0]&65536&&(r=!0,Tt.value=Y[16],Me(()=>r=!1)),a.$set(Tt);let tn={};!c&&we[0]&131072&&(c=!0,tn.value=Y[17],Me(()=>c=!1)),l.$set(tn);let kn={};!p&&we[0]&262144&&(p=!0,kn.value=Y[18],Me(()=>p=!1)),u.$set(kn);let Rn={};!g&&we[0]&524288&&(g=!0,Rn.value=Y[19],Me(()=>g=!1)),f.$set(Rn);let ii={};!h&&we[0]&1048576&&(h=!0,ii.value=Y[20],Me(()=>h=!1)),_.$set(ii);let Ft={};!y&&we[0]&2097152&&(y=!0,Ft.value=Y[21],Me(()=>y=!1)),b.$set(Ft);let $t={};!F&&we[0]&8388608&&(F=!0,$t.checked=Y[23],Me(()=>F=!1)),S.$set($t);let ai={};!R&&we[0]&4194304&&(R=!0,ai.checked=Y[22],Me(()=>R=!1)),k.$set(ai)},i(Y){D||(ae(n),ae(a.$$.fragment,Y),ae(l.$$.fragment,Y),ae(u.$$.fragment,Y),ae(f.$$.fragment,Y),ae(_.$$.fragment,Y),ae(b.$$.fragment,Y),ae(S.$$.fragment,Y),ae(k.$$.fragment,Y),D=!0)},o(Y){de(n),de(a.$$.fragment,Y),de(l.$$.fragment,Y),de(u.$$.fragment,Y),de(f.$$.fragment,Y),de(_.$$.fragment,Y),de(b.$$.fragment,Y),de(S.$$.fragment,Y),de(k.$$.fragment,Y),D=!1},d(Y){~e&&q[e].d(Y),Y&&z(i),je(a,Y),Y&&z(o),je(l,Y),Y&&z(d),je(u,Y),Y&&z(m),je(f,Y),Y&&z(x),je(_,Y),Y&&z(v),je(b,Y),Y&&z(w),je(S,Y),Y&&z(N),je(k,Y)}}}s(u4,\"create_if_block_1\");function Jve(t){let e,n,i;function a(o){t[55](o)}s(a,\"fileselect_value_binding_2\");let r={label:A(\"dialog.blueprint_settings.data_pack_zip.title\"),tooltip:A(\"dialog.blueprint_settings.data_pack_zip.description\"),defaultValue:qt.data_pack,valueChecker:m4};return t[15]!==void 0&&(r.value=t[15]),e=new Nf({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&32768&&(n=!0,c.value=o[15],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Jve,\"create_if_block_3\");function Gve(t){let e,n,i;function a(o){t[54](o)}s(a,\"folderselect_value_binding_1\");let r={label:A(\"dialog.blueprint_settings.data_pack.title\"),tooltip:A(\"dialog.blueprint_settings.data_pack.description\"),defaultValue:qt.data_pack,valueChecker:Xve};return t[15]!==void 0&&(r.value=t[15]),e=new Qx({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&32768&&(n=!0,c.value=o[15],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Gve,\"create_if_block_2\");function Wve(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k;e=new ts({props:{label:A(\"dialog.blueprint_settings.project_settings.title\")}});function R(V){t[35](V)}s(R,\"lineinput0_value_binding\");let D={label:A(\"dialog.blueprint_settings.project_name.title\"),tooltip:A(\"dialog.blueprint_settings.project_name.description\"),defaultValue:\"My Blueprint\"};t[0]!==void 0&&(D.value=t[0]),i=new aa({props:D}),Te.push(()=>Be(i,\"value\",R));function B(V){t[36](V)}s(B,\"vector2d_valueX_binding\");function q(V){t[37](V)}s(q,\"vector2d_valueY_binding\");let G={label:A(\"dialog.blueprint_settings.texture_size.title\"),tooltip:A(\"dialog.blueprint_settings.texture_size.description\"),defaultValueX:16,minX:2,maxX:4096,defaultValueY:16,minY:2,maxY:4096,valueChecker:Yve};t[1]!==void 0&&(G.valueX=t[1]),t[2]!==void 0&&(G.valueY=t[2]),o=new Zx({props:G}),Te.push(()=>Be(o,\"valueX\",B)),Te.push(()=>Be(o,\"valueY\",q));function W(V){t[38](V)}s(W,\"checkbox0_checked_binding\");let ee={label:A(\"dialog.blueprint_settings.show_render_box.title\"),tooltip:A(\"dialog.blueprint_settings.show_render_box.description\"),defaultValue:qt.show_render_box};t[7]!==void 0&&(ee.checked=t[7]),u=new mi({props:ee}),Te.push(()=>Be(u,\"checked\",W));function Z(V){t[39](V)}s(Z,\"checkbox1_checked_binding\");let me={label:A(\"dialog.blueprint_settings.auto_render_box.title\"),tooltip:A(\"dialog.blueprint_settings.auto_render_box.description\"),defaultValue:qt.auto_render_box};t[8]!==void 0&&(me.checked=t[8]),f=new mi({props:me}),Te.push(()=>Be(f,\"checked\",Z));let X=!t[29]&&o4(t);h=new ts({props:{label:A(\"dialog.blueprint_settings.export_settings.title\")}});function Q(V){t[42](V)}s(Q,\"lineinput1_value_binding\");let he={label:A(\"dialog.blueprint_settings.export_namespace.title\"),tooltip:A(\"dialog.blueprint_settings.export_namespace.description\"),defaultValue:qt.export_namespace,valueChecker:Kve};t[3]!==void 0&&(he.value=t[3]),b=new aa({props:he}),Te.push(()=>Be(b,\"value\",Q));let Ie=[Uve,zve],le=[];function ge(V,H){return V[28]?0:1}return s(ge,\"select_block_type\"),S=ge(t,[-1,-1,-1]),F=le[S]=Ie[S](t),{c(){Ce(e.$$.fragment),n=J(),Ce(i.$$.fragment),r=J(),Ce(o.$$.fragment),d=J(),Ce(u.$$.fragment),m=J(),Ce(f.$$.fragment),x=J(),X&&X.c(),_=J(),Ce(h.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),F.c(),N=_t()},m(V,H){Ae(e,V,H),U(V,n,H),Ae(i,V,H),U(V,r,H),Ae(o,V,H),U(V,d,H),Ae(u,V,H),U(V,m,H),Ae(f,V,H),U(V,x,H),X&&X.m(V,H),U(V,_,H),Ae(h,V,H),U(V,v,H),Ae(b,V,H),U(V,w,H),le[S].m(V,H),U(V,N,H),k=!0},p(V,H){let re={};!a&&H[0]&1&&(a=!0,re.value=V[0],Me(()=>a=!1)),i.$set(re);let xe={};!l&&H[0]&2&&(l=!0,xe.valueX=V[1],Me(()=>l=!1)),!c&&H[0]&4&&(c=!0,xe.valueY=V[2],Me(()=>c=!1)),o.$set(xe);let fe={};!p&&H[0]&128&&(p=!0,fe.checked=V[7],Me(()=>p=!1)),u.$set(fe);let te={};!g&&H[0]&256&&(g=!0,te.checked=V[8],Me(()=>g=!1)),f.$set(te),V[29]?X&&(Sn(),de(X,1,1,()=>{X=null}),On()):X?(X.p(V,H),H[0]&536870912&&ae(X,1)):(X=o4(V),X.c(),ae(X,1),X.m(_.parentNode,_));let Y={};!y&&H[0]&8&&(y=!0,Y.value=V[3],Me(()=>y=!1)),b.$set(Y);let we=S;S=ge(V,H),S===we?le[S].p(V,H):(Sn(),de(le[we],1,1,()=>{le[we]=null}),On(),F=le[S],F?F.p(V,H):(F=le[S]=Ie[S](V),F.c()),ae(F,1),F.m(N.parentNode,N))},i(V){k||(ae(e.$$.fragment,V),ae(i.$$.fragment,V),ae(o.$$.fragment,V),ae(u.$$.fragment,V),ae(f.$$.fragment,V),ae(X),ae(h.$$.fragment,V),ae(b.$$.fragment,V),ae(F),k=!0)},o(V){de(e.$$.fragment,V),de(i.$$.fragment,V),de(o.$$.fragment,V),de(u.$$.fragment,V),de(f.$$.fragment,V),de(X),de(h.$$.fragment,V),de(b.$$.fragment,V),de(F),k=!1},d(V){je(e,V),V&&z(n),je(i,V),V&&z(r),je(o,V),V&&z(d),je(u,V),V&&z(m),je(f,V),V&&z(x),X&&X.d(V),V&&z(_),je(h,V),V&&z(v),je(b,V),V&&z(w),le[S].d(V),V&&z(N)}}}s(Wve,\"create_fragment\");[...document.fonts.keys()].some(t=>t.family===\"MinecraftFull\")||new FontFace(\"MinecraftFull\",Xx,{}).load().then(t=>{document.fonts.add(t)});var d4=Object.fromEntries(Object.entries(wo).map(([t])=>[t,t]));function Kve(t){return t===\"\"?{type:\"error\",message:A(\"dialog.blueprint_settings.export_namespace.error.empty\")}:/[^a-zA-Z0-9_]/.exec(t.trim())?{type:\"error\",message:A(\"dialog.blueprint_settings.export_namespace.error.invalid_characters\")}:[\"global\",\"animated_java\"].includes(t)?{type:\"error\",message:A(\"dialog.blueprint_settings.export_namespace.error.reserved\",t)}:{type:\"success\",message:\"\"}}s(Kve,\"exportNamespaceChecker\");function p4(t){if(t===\"\")return{type:\"error\",message:A(\"dialog.blueprint_settings.display_item.error.no_item_selected\")};if(t.split(\":\").length!==2)return{type:\"error\",message:A(\"dialog.blueprint_settings.display_item.error.invalid_item_id.no_namespace\")};if(t.includes(\" \"))return{type:\"error\",message:A(\"dialog.blueprint_settings.display_item.error.invalid_item_id.whitespace\")};if(Xn.item&&!Xn.item.has(t.replace(\"minecraft:\",\"\")))return{type:\"warning\",message:A(\"dialog.blueprint_settings.display_item.warning.item_does_not_exist\")};{let e;try{e=Mi(\"assets/minecraft/models/item/\"+t.replace(\"minecraft:\",\"\")+\".json\")}catch(n){return console.error(n),{type:\"error\",message:A(\"dialog.blueprint_settings.display_item.error.item_model_not_found\")}}return e.parent===\"item/generated\"||e.parent===\"minecraft:item/generated\"?{type:\"success\",message:\"\"}:{type:\"warning\",message:A(\"dialog.blueprint_settings.display_item.warning.item_model_not_generated\")}}}s(p4,\"displayItemChecker\");function Yve(t){let e=Number(t.x),n=Number(t.y),i=Number(Texture.all.map(r=>r.height).reduce((r,o)=>Math.max(r,o),0)),a=Number(Texture.all.map(r=>r.width).reduce((r,o)=>Math.max(r,o),0));return e===a&&n===i?e!==n?{type:\"warning\",message:A(\"dialog.blueprint_settings.texture_size.warning.not_square\")}:e!==2**Math.floor(Math.log2(e))||n!==2**Math.floor(Math.log2(n))?{type:\"warning\",message:A(\"dialog.blueprint_settings.texture_size.warning.not_a_power_of_2\")}:{type:\"success\",message:\"\"}:{type:\"warning\",message:A(\"dialog.blueprint_settings.texture_size.warning.does_not_match_largest_texture\")}}s(Yve,\"textureSizeChecker\");function Xve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack.error.folder_does_not_exist\")}}switch(!0){case t===\"\":return{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack.error.no_folder_selected\")};case!fs.existsSync(e):return{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack.error.folder_does_not_exist\")};case!fs.statSync(e).isDirectory():return{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack.error.not_a_folder\")};case!fs.existsSync(PathModule.join(e,\"pack.mcmeta\")):return{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack.error.missing_pack_mcmeta\")};case!fs.existsSync(PathModule.join(e,\"data\")):return{type:\"warning\",message:A(\"dialog.blueprint_settings.data_pack.warning.missing_data_folder\")};default:return{type:\"success\",message:\"\"}}}s(Xve,\"dataPackFolderChecker\");function Zve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\")}}switch(!0){case t===\"\":return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack.error.no_folder_selected\")};case!fs.existsSync(e):return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack.error.folder_does_not_exist\")};case!fs.statSync(e).isDirectory():return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack.error.not_a_folder\")};case!fs.existsSync(PathModule.join(e,\"pack.mcmeta\")):return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack.error.missing_pack_mcmeta\")};case!fs.existsSync(PathModule.join(e,\"assets\")):return{type:\"warning\",message:A(\"dialog.blueprint_settings.resource_pack.warning.missing_assets_folder\")};default:return{type:\"success\",message:\"\"}}}s(Zve,\"resourcePackFolderChecker\");function Qve(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:\"error\",message:A(\"dialog.blueprint_settings.json_file.error.file_does_not_exist\")}}switch(!0){case t===\"\":return{type:\"error\",message:A(\"dialog.blueprint_settings.json_file.error.no_file_selected\")};case(fs.existsSync(e)&&!fs.statSync(e).isFile()):return{type:\"error\",message:A(\"dialog.blueprint_settings.json_file.error.not_a_file\")};default:return{type:\"success\",message:\"\"}}}s(Qve,\"jsonFileChecker\");function m4(t){let e;try{e=$o(t)}catch(n){return console.error(n),{type:\"error\",message:A(\"dialog.blueprint_settings.data_pack_zip.error.file_does_not_exist\")}}switch(!0){case t===\"\":return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack_zip.error.no_file_selected\")};case(fs.existsSync(e)&&!fs.statSync(e).isFile()):return{type:\"error\",message:A(\"dialog.blueprint_settings.resource_pack_zip.error.not_a_file\")};default:return{type:\"success\",message:\"\"}}}s(m4,\"zipChecker\");function $ve(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(q,ce=>n(34,i=ce)),q),\"$$subscribe_targetMinecraftVersion\"),o,l,c=ie,d=s(()=>(c(),c=rt(R,ce=>n(28,l=ce)),R),\"$$subscribe_enablePluginMode\"),u,p=ie,m=s(()=>(p(),p=rt(W,ce=>n(29,u=ce)),W),\"$$subscribe_autoRenderBox\"),f,g=ie,x=s(()=>(g(),g=rt(D,ce=>n(30,f=ce)),D),\"$$subscribe_resourcePackExportMode\"),_,h=ie,v=s(()=>(h(),h=rt(Q,ce=>n(31,_=ce)),Q),\"$$subscribe_enableAdvancedResourcePackSettings\"),b,y=ie,w=s(()=>(y(),y=rt(B,ce=>n(32,b=ce)),B),\"$$subscribe_dataPackExportMode\");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>c()),t.$$.on_destroy.push(()=>p()),t.$$.on_destroy.push(()=>g()),t.$$.on_destroy.push(()=>h()),t.$$.on_destroy.push(()=>y());let{blueprintName:S}=e,{textureSizeX:F}=e,{textureSizeY:N}=e,{exportNamespace:k}=e,{enablePluginMode:R}=e;d(),Jt(R,l=!1,l);let{resourcePackExportMode:D}=e;x();let{dataPackExportMode:B}=e;w();let{targetMinecraftVersion:q}=e;r();let{showRenderBox:G}=e,{autoRenderBox:W}=e;m();let{renderBoxX:ee}=e,{renderBoxY:Z}=e,{displayItem:me}=e,{customModelDataOffset:X}=e,{enableAdvancedResourcePackSettings:Q}=e;v();let{resourcePack:he}=e,{dataPack:Ie}=e,{onSummonFunction:le}=e,{onRemoveFunction:ge}=e,{onPreTickFunction:V}=e,{onPostTickFunction:H}=e,{interpolationDuration:re}=e,{teleportationDuration:xe}=e,{useStorageForAnimation:fe}=e,{autoUpdateRigOrientation:te}=e,{bakedAnimations:Y}=e,{jsonFile:we}=e,Le=new ke(!1);Pa(t,Le,ce=>n(27,o=ce));function Tt(ce){S=ce,n(0,S)}s(Tt,\"lineinput0_value_binding\");function tn(ce){F=ce,n(1,F)}s(tn,\"vector2d_valueX_binding\");function kn(ce){N=ce,n(2,N)}s(kn,\"vector2d_valueY_binding\");function Rn(ce){G=ce,n(7,G)}s(Rn,\"checkbox0_checked_binding\");function ii(ce){W=ce,m(n(8,W))}s(ii,\"checkbox1_checked_binding\");function Ft(ce){ee=ce,n(9,ee)}s(Ft,\"vector2d_valueX_binding_1\");function $t(ce){Z=ce,n(10,Z)}s($t,\"vector2d_valueY_binding_1\");function ai(ce){k=ce,n(3,k)}s(ai,\"lineinput1_value_binding\");function cr(ce){me=ce,n(11,me)}s(cr,\"lineinput_value_binding\");function Fa(ce){Y=ce,n(24,Y)}s(Fa,\"checkbox_checked_binding\");function Na(ce){we=ce,n(25,we)}s(Na,\"fileselect_value_binding\");function Ra(ce){q=ce,r(n(6,q))}s(Ra,\"select0_value_binding\");function ur(ce){D=ce,x(n(4,D))}s(ur,\"select1_value_binding\");function Fi(ce){me=ce,n(11,me)}s(Fi,\"lineinput_value_binding_1\");function Gr(ce){he=ce,n(14,he)}s(Gr,\"folderselect_value_binding\");function Ma(ce){he=ce,n(14,he)}s(Ma,\"fileselect_value_binding_1\");function Wr(ce){Q=ce,v(n(13,Q))}s(Wr,\"checkbox_checked_binding_1\");function Wi(ce){X=ce,n(12,X)}s(Wi,\"numberslider_value_binding\");function Ne(ce){B=ce,w(n(5,B))}s(Ne,\"select2_value_binding\");function Un(ce){Ie=ce,n(15,Ie)}s(Un,\"folderselect_value_binding_1\");function Kr(ce){Ie=ce,n(15,Ie)}s(Kr,\"fileselect_value_binding_2\");function dr(ce){le=ce,n(16,le)}s(dr,\"codeinput0_value_binding\");function Yr(ce){ge=ce,n(17,ge)}s(Yr,\"codeinput1_value_binding\");function pr(ce){V=ce,n(18,V)}s(pr,\"codeinput2_value_binding\");function _l(ce){H=ce,n(19,H)}s(_l,\"codeinput3_value_binding\");function So(ce){re=ce,n(20,re)}s(So,\"numberslider0_value_binding\");function mr(ce){xe=ce,n(21,xe)}s(mr,\"numberslider1_value_binding\");function Xr(ce){te=ce,n(23,te)}s(Xr,\"checkbox0_checked_binding_1\");function ps(ce){fe=ce,n(22,fe)}return s(ps,\"checkbox1_checked_binding_1\"),t.$$set=ce=>{\"blueprintName\"in ce&&n(0,S=ce.blueprintName),\"textureSizeX\"in ce&&n(1,F=ce.textureSizeX),\"textureSizeY\"in ce&&n(2,N=ce.textureSizeY),\"exportNamespace\"in ce&&n(3,k=ce.exportNamespace),\"enablePluginMode\"in ce&&d(n(26,R=ce.enablePluginMode)),\"resourcePackExportMode\"in ce&&x(n(4,D=ce.resourcePackExportMode)),\"dataPackExportMode\"in ce&&w(n(5,B=ce.dataPackExportMode)),\"targetMinecraftVersion\"in ce&&r(n(6,q=ce.targetMinecraftVersion)),\"showRenderBox\"in ce&&n(7,G=ce.showRenderBox),\"autoRenderBox\"in ce&&m(n(8,W=ce.autoRenderBox)),\"renderBoxX\"in ce&&n(9,ee=ce.renderBoxX),\"renderBoxY\"in ce&&n(10,Z=ce.renderBoxY),\"displayItem\"in ce&&n(11,me=ce.displayItem),\"customModelDataOffset\"in ce&&n(12,X=ce.customModelDataOffset),\"enableAdvancedResourcePackSettings\"in ce&&v(n(13,Q=ce.enableAdvancedResourcePackSettings)),\"resourcePack\"in ce&&n(14,he=ce.resourcePack),\"dataPack\"in ce&&n(15,Ie=ce.dataPack),\"onSummonFunction\"in ce&&n(16,le=ce.onSummonFunction),\"onRemoveFunction\"in ce&&n(17,ge=ce.onRemoveFunction),\"onPreTickFunction\"in ce&&n(18,V=ce.onPreTickFunction),\"onPostTickFunction\"in ce&&n(19,H=ce.onPostTickFunction),\"interpolationDuration\"in ce&&n(20,re=ce.interpolationDuration),\"teleportationDuration\"in ce&&n(21,xe=ce.teleportationDuration),\"useStorageForAnimation\"in ce&&n(22,fe=ce.useStorageForAnimation),\"autoUpdateRigOrientation\"in ce&&n(23,te=ce.autoUpdateRigOrientation),\"bakedAnimations\"in ce&&n(24,Y=ce.bakedAnimations),\"jsonFile\"in ce&&n(25,we=ce.jsonFile)},t.$$.update=()=>{if(t.$$.dirty[1]&8)e:Jt(Le,o=compareVersions(\"1.21.2\",i),o)},[S,F,N,k,D,B,q,G,W,ee,Z,me,X,Q,he,Ie,le,ge,V,H,re,xe,fe,te,Y,we,R,o,l,u,f,_,b,Le,i,Tt,tn,kn,Rn,ii,Ft,$t,ai,cr,Fa,Na,Ra,ur,Fi,Gr,Ma,Wr,Wi,Ne,Un,Kr,dr,Yr,pr,_l,So,mr,Xr,ps]}s($ve,\"instance\");var Vf=class extends Pe{constructor(e){super(),Ve(this,e,$ve,Wve,De,{blueprintName:0,textureSizeX:1,textureSizeY:2,exportNamespace:3,enablePluginMode:26,resourcePackExportMode:4,dataPackExportMode:5,targetMinecraftVersion:6,showRenderBox:7,autoRenderBox:8,renderBoxX:9,renderBoxY:10,displayItem:11,customModelDataOffset:12,enableAdvancedResourcePackSettings:13,resourcePack:14,dataPack:15,onSummonFunction:16,onRemoveFunction:17,onPreTickFunction:18,onPostTickFunction:19,interpolationDuration:20,teleportationDuration:21,useStorageForAnimation:22,autoUpdateRigOrientation:23,bakedAnimations:24,jsonFile:25},null,[-1,-1,-1])}};s(Vf,\"BlueprintSettingsDialog\");var f4=Vf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".warning.svelte-1fhdn4b{color:var(--color-warning);font-family:var(--font-code);font-size:0.8em;margin:-16px 29px 8px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function ebe(){return{blueprintName:new ke(Project.name,t=>t||\"My Blueprint\"),textureSizeX:new ke(Project.texture_width),textureSizeY:new ke(Project.texture_height),showRenderBox:new ke(Project.animated_java.show_render_box),autoRenderBox:new ke(Project.animated_java.auto_render_box),renderBoxX:new ke(Project.animated_java.render_box[0]),renderBoxY:new ke(Project.animated_java.render_box[1]),enablePluginMode:new ke(Project.animated_java.enable_plugin_mode),exportNamespace:new ke(Project.animated_java.export_namespace,t=>t?Kt(t):qt.export_namespace),resourcePackExportMode:new ke(Project.animated_java.resource_pack_export_mode),dataPackExportMode:new ke(Project.animated_java.data_pack_export_mode),targetMinecraftVersion:new ke(Project.animated_java.target_minecraft_version),displayItem:new ke(Project.animated_java.display_item,t=>t||qt.display_item),customModelDataOffset:new ke(Project.animated_java.custom_model_data_offset),enableAdvancedResourcePackSettings:new ke(Project.animated_java.enable_advanced_resource_pack_settings),resourcePack:new ke(Project.animated_java.resource_pack),enableAdvancedDataPackSettings:new ke(Project.animated_java.enable_advanced_data_pack_settings),dataPack:new ke(Project.animated_java.data_pack),onSummonFunction:new ke(Project.animated_java.on_summon_function),onRemoveFunction:new ke(Project.animated_java.on_remove_function),onPreTickFunction:new ke(Project.animated_java.on_pre_tick_function),onPostTickFunction:new ke(Project.animated_java.on_post_tick_function),interpolationDuration:new ke(Project.animated_java.interpolation_duration),teleportationDuration:new ke(Project.animated_java.teleportation_duration),autoUpdateRigOrientation:new ke(Project.animated_java.auto_update_rig_orientation),useStorageForAnimation:new ke(Project.animated_java.use_storage_for_animation),bakedAnimations:new ke(Project.animated_java.baked_animations),jsonFile:new ke(Project.animated_java.json_file)}}s(ebe,\"getSettings\");function tbe(t){Project&&(Project.name=t.blueprintName.get(),setProjectResolution(t.textureSizeX.get(),t.textureSizeY.get(),!0),Project.animated_java.show_render_box=t.showRenderBox.get(),Project.animated_java.auto_render_box=t.autoRenderBox.get(),Project.animated_java.render_box=[t.renderBoxX.get(),t.renderBoxY.get()],Project.animated_java.enable_plugin_mode=t.enablePluginMode.get(),Project.pluginMode.set(t.enablePluginMode.get()),Project.animated_java.export_namespace=t.exportNamespace.get(),Project.animated_java.resource_pack_export_mode=t.resourcePackExportMode.get(),Project.animated_java.data_pack_export_mode=t.dataPackExportMode.get(),Project.animated_java.target_minecraft_version=t.targetMinecraftVersion.get(),Project.animated_java.display_item=t.displayItem.get(),Project.animated_java.custom_model_data_offset=t.customModelDataOffset.get(),Project.animated_java.enable_advanced_resource_pack_settings=t.enableAdvancedResourcePackSettings.get(),Project.animated_java.resource_pack=t.resourcePack.get(),Project.animated_java.enable_advanced_data_pack_settings=t.enableAdvancedDataPackSettings.get(),Project.animated_java.data_pack=t.dataPack.get(),Project.animated_java.on_summon_function=t.onSummonFunction.get(),Project.animated_java.on_remove_function=t.onRemoveFunction.get(),Project.animated_java.on_pre_tick_function=t.onPreTickFunction.get(),Project.animated_java.on_post_tick_function=t.onPostTickFunction.get(),Project.animated_java.interpolation_duration=t.interpolationDuration.get(),Project.animated_java.teleportation_duration=t.teleportationDuration.get(),Project.animated_java.auto_update_rig_orientation=t.autoUpdateRigOrientation.get(),Project.animated_java.use_storage_for_animation=t.useStorageForAnimation.get(),Project.animated_java.baked_animations=t.bakedAnimations.get(),Project.animated_java.json_file=t.jsonFile.get(),console.log(\"Successfully saved project settings\",Project))}s(tbe,\"setSettings\");function jc(){if(!Project)return;let t=ebe();return new cn({id:`${Ke.name}:blueprintSettingsDialog`,title:A(\"dialog.blueprint_settings.title\"),width:800,content:{component:f4,props:t},extra:{component:BT},contentStyle:{marginTop:\"10px\"},preventKeybinds:!0,onConfirm(){tbe(t),zf(),Yx(),Canvas.updateAll()}}).show()}s(jc,\"openBlueprintSettingsDialog\");function h4(t){let e,n;return{c(){e=L(\"progress\"),e.value=n=t[4]/t[5]||0,E(e,\"max\",\"1\"),E(e,\"class\",\"svelte-x7e53b\")},m(i,a){U(i,e,a)},p(i,a){a&48&&n!==(n=i[4]/i[5]||0)&&(e.value=n)},d(i){i&&z(e)}}}s(h4,\"create_if_block\");function nbe(t){let e,n,i,a,r,o,l,c,d=t[4]!==0&&h4(t);return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"p\"),a=Re(t[3]),r=J(),o=L(\"img\"),c=J(),d&&d.c(),Ht(o.src,l=Vm)||E(o,\"src\",l),E(o,\"width\",\"64px\"),E(n,\"class\",\"progress-container svelte-x7e53b\"),E(e,\"class\",\"dialog-container svelte-x7e53b\")},m(u,p){U(u,e,p),I(e,n),I(n,i),I(i,a),I(n,r),I(n,o),I(e,c),d&&d.m(e,null)},p(u,[p]){p&8&&ct(a,u[3]),u[4]!==0?d?d.p(u,p):(d=h4(u),d.c(),d.m(e,null)):d&&(d.d(1),d=null)},i:ie,o:ie,d(u){u&&z(e),d&&d.d()}}}s(nbe,\"create_fragment\");function ibe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(g,x=>n(3,i=x)),g),\"$$subscribe_progressDescription\"),o,l=ie,c=s(()=>(l(),l=rt(m,x=>n(4,o=x)),m),\"$$subscribe_progress\"),d,u=ie,p=s(()=>(u(),u=rt(f,x=>n(5,d=x)),f),\"$$subscribe_maxProgress\");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u());let{progress:m}=e;c();let{maxProgress:f}=e;p();let{progressDescription:g}=e;return r(),t.$$set=x=>{\"progress\"in x&&c(n(0,m=x.progress)),\"maxProgress\"in x&&p(n(1,f=x.maxProgress)),\"progressDescription\"in x&&r(n(2,g=x.progressDescription))},[m,f,g,i,o,d]}s(ibe,\"instance\");var Uf=class extends Pe{constructor(e){super(),Ve(this,e,ibe,nbe,De,{progress:0,maxProgress:1,progressDescription:2})}};s(Uf,\"ExportProgressDialog\");var g4=Uf;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".dialog-container.svelte-x7e53b{display:flex;flex-direction:column;align-items:center}.progress-container.svelte-x7e53b{width:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between}progress.svelte-x7e53b{width:100%}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Pt=new ke(0),Bi=new ke(1),Dn=new ke(\"\");function qf(t){return Pt.set(0),Bi.set(1),Dn.set(\"Preparing...\"),t&&(Bi.set(1e3),setInterval(()=>{Pt.set(Pt.get()+1),Pt.get()>=Bi.get()&&Pt.set(0)},10)),new cn({id:`${Ke.name}:exportProgressDialog`,title:A(\"dialog.export_progress.title\"),width:512,content:{component:g4,props:{progress:Pt,maxProgress:Bi,progressDescription:Dn}},preventKeybinds:!0,buttons:[]}).show()}s(qf,\"openExportProgressDialog\");var _4=wi(Ee(\"crypto\"),1);var Dd=new ke(!0);Nt({id:\"animated-java:override-function/bone-animator/interpolate\",object:BoneAnimator.prototype,key:\"interpolate\",condition:()=>Dd.get()&&Fe(),get:t=>function(e,n,i){if(!Dd.get()||!Fe()||n===!1)return t.call(this,e,n,i);let a=this.animation.time;try{Timeline.time=Dr(this.animation.time,20);let r,o,l,c;if(Timeline.time<a){if(l=Timeline.time,r=t.call(this,e,n,i),!r||(c=Dr(Timeline.time+.05,20),Timeline.time=c,o=t.call(this,e,n,i),!o))return!1}else if(c=Timeline.time,o=t.call(this,e,n,i),!o||(l=Dr(Timeline.time-.05,20),Timeline.time=l,r=t.call(this,e,n,i),!r))return!1;let d=(a-l)/(c-l);return[Math.lerp(r[0],o[0],d),Math.lerp(r[1],o[1],d),Math.lerp(r[2],o[2],d)]}finally{Timeline.time=a}}});function uv(){main_preview.controls.rotateLeft(Math.PI),scene.setRotationFromAxisAngle(new THREE.Vector3(0,1,0),Math.PI)}s(uv,\"correctSceneAngle\");function dv(){main_preview.controls.rotateLeft(-Math.PI),scene.setRotationFromAxisAngle(new THREE.Vector3(0,1,0),0)}s(dv,\"restoreSceneAngle\");function Hf(t,e){let n=t.mesh.matrixWorld.clone(),i=new THREE.Vector3().setFromMatrixPosition(n).multiplyScalar(1/16);n.setPosition(i);let a=new THREE.Vector3().setScalar(e);return n.scale(a),t instanceof ve&&n.multiply(new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(0,Math.PI,0,\"XYZ\"))),n}s(Hf,\"getNodeMatrix\");function abe(t){let e=new THREE.Vector3,n=new THREE.Quaternion,i=new THREE.Vector3;return t.decompose(e,n,i),{translation:e,left_rotation:n,scale:i}}s(abe,\"getDecomposedTransformation\");function rbe(t){let e=new THREE.Euler().setFromQuaternion(t,\"YXZ\");return[Math.radToDeg(-e.x),Math.radToDeg(-e.y)+180]}s(rbe,\"threeAxisRotationToTwoAxisRotation\");var lv,Ac=new Map,Fd=new Map,cv=new Set,Jf=new Map;function pv(t,e,n=0){let i={time:n,node_transforms:{},...obe(t,n),...sbe(t,n)};if(lv!==t){lv=t,Ac=new Map,Fd=new Map;for(let a of Object.keys(e)){let r=t.animators[a];if(!r)continue;let o=r.keyframes?new Map(r.keyframes.map(l=>[l.time,l])):new Map;Fd.set(a,o)}cv=new Set(t.excluded_nodes?t.excluded_nodes.map(a=>a.value):[]),Jf=new Map;for(let a of cbe())Jf.set(a.uuid,a)}for(let[a,r]of Object.entries(e)){let o=Jf.get(a);if(!o||cv.has(a))continue;let l=Fd.get(a);if(!l)continue;let c=l.get(n),d=l.get(n-.05),u=Ac.get(a),p={};switch(r.type){case\"text_display\":case\"item_display\":case\"block_display\":case\"bone\":{if(p.matrix=Hf(o,r.base_scale),r.parent&&r.parent!==\"root\"){let x=Fd.get(r.parent),_=x?.get(n),h=x?.get(n-.05);_?.interpolation===\"step\"?p.interpolation=\"step\":h?.data_points.length===2&&(p.interpolation=\"pre-post\")}if(u&&u.matrix.equals(p.matrix)&&p.interpolation==null)continue;if(c?.interpolation===\"step\")p.interpolation=\"step\";else if(d?.data_points.length===2){p.interpolation=\"pre-post\",Nd(t,n+.001);let x=Hf(o,r.base_scale);p.matrix=x,Nd(t,n)}Ac.set(a,{matrix:p.matrix,keyframe:c});break}case\"locator\":{if(p.matrix=Hf(o,1),c)p.function=c.function,p.function_execute_condition=c.execute_condition,Ac.set(a,{matrix:p.matrix,keyframe:c});else if(u?.keyframe){let x=u.keyframe.repeat,_=u.keyframe.repeat_frequency;x&&_&&Math.round(n*20)%_===0&&(p.function=u.keyframe.function,p.function_execute_condition=u.keyframe.execute_condition)}break}case\"camera\":case\"struct\":{if(p.matrix=Hf(o,1),u?.matrix.equals(p.matrix))continue;Ac.set(a,{matrix:p.matrix,keyframe:c});break}}let m=new THREE.Vector3,f=new THREE.Quaternion,g=new THREE.Vector3;p.matrix.decompose(m,f,g),p.decomposed=abe(p.matrix),(r.type===\"locator\"||r.type===\"camera\")&&(r.max_distance=Math.max(r.max_distance,m.length())),p.pos=[m.x,m.y,m.z],p.rot=pf(f).toArray(),p.scale=[g.x,g.y,g.z],p.head_rot=rbe(f),i.node_transforms[a]=p}return i}s(pv,\"getFrame\");function obe(t,e){let n=t.animators.effects?.variant;if(n){let i=n.find(a=>a.time===e);if(i){let a=i.variant?.uuid;if(a)return Ks({variants:[a],variants_execute_condition:i.execute_condition?.trim()})}}return{}}s(obe,\"getVariantKeyframe\");function sbe(t,e){let n=t.animators.effects?.function;if(n){let i=n.find(a=>a.time===e);if(i)return Ks({function:i.function?.trim(),function_execute_condition:i.execute_condition?.trim()})}return{}}s(sbe,\"getFunctionKeyframe\");function Nd(t,e){Timeline.time=e,Animator.showDefaultPose(!0);let n=[...Group.all,...NullObject.all,...Locator.all,...ve.all,...$e.all,...We.all];OutlinerElement.types.camera&&n.push(...OutlinerElement.types.camera.all);for(let i of n)i.constructor.animator&&(Animator.resetLastValues(),t.getBoneAnimator(i).displayFrame());Animator.resetLastValues(),scene.updateMatrixWorld(),t.effects&&t.effects.displayFrame()}s(Nd,\"updatePreview\");function lbe(t,e){let n={name:t.name,storage_name:Kt(t.name),uuid:t.uuid,loop_delay:Number(t.loop_delay)||0,frames:[],duration:0,loop_mode:t.loop,modified_nodes:{}};t.select();let i=new Set;for(let a=0;a<=t.length;a=Dr(a+.05,20)){Nd(t,a);let r=pv(t,e.nodes,a);Object.keys(r.node_transforms).forEach(o=>i.add(o)),n.frames.push(r)}return n.duration=n.frames.length,n.modified_nodes=Object.fromEntries(Array.from(i).map(a=>[a,e.nodes[a]])),n}s(lbe,\"renderAnimation\");function x4(t){let e=_4.createHash(\"sha256\");for(let n of t){e.update(\"anim;\"+n.name),e.update(\";\"+n.duration.toString()),e.update(\";\"+n.loop_mode),e.update(\";\"+Object.keys(n.modified_nodes).join(\";\"));for(let i of n.frames){e.update(\";\"+i.time.toString());for(let[a,r]of Object.entries(i.node_transforms))e.update(\";\"+a),e.update(\";\"+r.pos.join(\";\")),e.update(\";\"+r.rot.join(\";\")),e.update(\";\"+r.scale.join(\";\")),r.interpolation&&e.update(\";\"+r.interpolation),r.function&&e.update(\";\"+r.function),r.function_execute_condition&&e.update(\";\"+r.function_execute_condition);i.variants&&(e.update(\";\"+i.variants),i.variants_execute_condition&&e.update(\";\"+i.variants_execute_condition)),i.function&&e.update(\";\"+i.function),i.function_execute_condition&&e.update(\";\"+i.function_execute_condition)}}return e.digest(\"hex\")}s(x4,\"hashAnimations\");function cbe(){return[...Group.all,...Locator.all,...ve.all,...$e.all,...We.all,...OutlinerElement.types.camera?OutlinerElement.types.camera.all:[]]}s(cbe,\"getAnimatableNodes\");async function v4(t,e){lv=void 0,Ac=new Map,Fd=new Map,cv=new Set,Jf=new Map,Dd.set(!1),Dn.set(\"Rendering Animations...\"),Pt.set(0),Bi.set(t.animations.length),console.time(\"Rendering animations took\");let n,i=0;Timeline.pause(),Mode.selected.id===\"animate\"&&(n=Animator.selected,i=Timeline.time),uv();let a=[];for(let r of t.animations)a.push(lbe(r,e)),Pt.set(Pt.get()+1),await b4();return dv(),Dd.set(!0),Mode.selected.id===\"animate\"&&n?(n.select(),Timeline.setTime(i),Animator.preview()):Mode.selected.id===\"edit\"&&Animator.showDefaultPose(),console.timeEnd(\"Rendering animations took\"),console.log(\"Animations:\",a),a}s(v4,\"renderProjectAnimations\");var Rd=class{constructor(e){this.limit=e;this.lastTime=performance.now()}lastTime;async sync(){return performance.now()-this.lastTime>=this.limit?(await new Promise(i=>requestAnimationFrame(i)),this.lastTime=performance.now(),!0):!1}};s(Rd,\"MSLimiter\");var j=class{static global(e){return j.globals[e]?j.globals[e]:j.globals[e]={}}static createStatic(e,n,i){let a=null;Object.defineProperty(e,n,{enumerable:!0,get:function(){return i!=null&&(a=i(),i=null),a},set:function(r){i!=null&&(a=i(),i=null),a=r}})}static iterator(e){if(Array.isArray(e)){let n=e;return function(){return j.mkIter(n)}}else return typeof e.iterator==\"function\"?e.iterator.bind(e):e.iterator}static getIterator(e){return Array.isArray(e)?j.mkIter(e):e.iterator()}static mkIter(e){return new mv(e)}static extend(e){function n(){this[j.new].apply(this,arguments)}return s(n,\"res\"),Object.setPrototypeOf(n.prototype,e.prototype),n}static inherits(e,n){n==null&&(n=!1);function i(){n&&e&&i[j.init]&&i[j.init](),this[j.new].apply(this,arguments)}return s(i,\"res\"),n?i[j.init]=()=>{let a=e();a[j.init]&&a[j.init](),Object.setPrototypeOf(i.prototype,a.prototype),i[j.init]=void 0}:e&&e[j.init]?(n=!0,i[j.init]=()=>{e[j.init]&&e[j.init](),Object.setPrototypeOf(i.prototype,e.prototype),i[j.init]=void 0}):e&&Object.setPrototypeOf(i.prototype,e.prototype),i}static bind(e,n){if(n==null)return null;n.__id__==null&&(n.__id__=j.fid++);let i=null;return e.hx__closures__==null?e.hx__closures__={}:i=e.hx__closures__[n.__id__],i==null&&(i=n.bind(e),e.hx__closures__[n.__id__]=i),i}static get __name__(){return\"genes.Register\"}get __class__(){return j}};s(j,\"Register\");j.$global=typeof window<\"u\"?window:typeof global<\"u\"?global:typeof self<\"u\"?self:void 0;j.globals={};j.new=Symbol();j.init=Symbol();j.fid=0;var mv=j.global(\"$hxClasses\")[\"genes._Register.ArrayIterator\"]=s(class y4 extends j.inherits(){[j.new](e){this.current=0,this.array=e}hasNext(){return this.current<this.array.length}next(){return this.array[this.current++]}static get __name__(){return\"genes._Register.ArrayIterator\"}get __class__(){return y4}},\"ArrayIterator\");mv.prototype.array=null;mv.prototype.current=null;var KFe=j.$global,Gf=j.global(\"$hxClasses\")[\"haxe.ValueException\"]=s(class w4 extends j.inherits(()=>ne,!0){[j.new](e,n,i){super[j.new](String(e),n,i),this.value=e}unwrap(){return this.value}static get __name__(){return\"haxe.ValueException\"}static get __super__(){return ne}get __class__(){return w4}},\"ValueException\");Gf.prototype.value=null;var $Fe=j.$global,ne=j.global(\"$hxClasses\")[\"haxe.Exception\"]=s(class Md extends j.inherits(()=>Error,!0){[j.new](e,n,i){Error.call(this,e),this.message=e,this.__previousException=n,this.__nativeException=i??this}unwrap(){return this.__nativeException}toString(){return this.get_message()}get_message(){return this.message}get_native(){return this.__nativeException}static caught(e){return e instanceof Md?e:e instanceof Error?new Md(e.message,null,e):new Gf(e,null,e)}static thrown(e){return e instanceof Md?e.get_native():e instanceof Error?e:new Gf(e)}static get __name__(){return\"haxe.Exception\"}static get __super__(){return Error}get __class__(){return Md}},\"Exception\");ne.prototype.message=null;ne.prototype.native=null;ne.prototype.__skipStack=null;ne.prototype.__nativeException=null;ne.prototype.__previousException=null;var aNe=j.$global,at=j.global(\"$hxClasses\").HxOverrides=s(class E4{static dateStr(e){let n=e.getMonth()+1,i=e.getDate(),a=e.getHours(),r=e.getMinutes(),o=e.getSeconds();return e.getFullYear()+\"-\"+(n<10?\"0\"+n:\"\"+n)+\"-\"+(i<10?\"0\"+i:\"\"+i)+\" \"+(a<10?\"0\"+a:\"\"+a)+\":\"+(r<10?\"0\"+r:\"\"+r)+\":\"+(o<10?\"0\"+o:\"\"+o)}static strDate(e){switch(e.length){case 8:let n=e.split(\":\"),i=new Date;return i.setTime(0),i.setUTCHours(n[0]),i.setUTCMinutes(n[1]),i.setUTCSeconds(n[2]),i;break;case 10:let a=e.split(\"-\");return new Date(a[0],a[1]-1,a[2],0,0,0);case 19:let r=e.split(\" \"),o=r[0].split(\"-\"),l=r[1].split(\":\");return new Date(o[0],o[1]-1,o[2],l[0],l[1],l[2]);default:throw ne.thrown(\"Invalid date format : \"+e)}}static cca(e,n){let i=e.charCodeAt(n);if(i==i)return i}static substr(e,n,i){if(i==null)i=e.length;else if(i<0)if(n==0)i=e.length+i;else return\"\";return e.substr(n,i)}static now(){return Date.now()}static get __name__(){return\"HxOverrides\"}get __class__(){return E4}},\"HxOverrides\");typeof performance<\"u\"&&typeof performance.now==\"function\"&&(at.now=performance.now.bind(performance));var cNe=j.$global,Et=j.global(\"$hxClasses\").StringTools=s(class Tc{static isSpace(e,n){let i=at.cca(e,n);return i>8&&i<14?!0:i==32}static ltrim(e){let n=e.length,i=0;for(;i<n&&Tc.isSpace(e,i);)++i;return i>0?at.substr(e,i,n-i):e}static rtrim(e){let n=e.length,i=0;for(;i<n&&Tc.isSpace(e,n-i-1);)++i;return i>0?at.substr(e,0,n-i):e}static trim(e){return Tc.ltrim(Tc.rtrim(e))}static hex(e,n){let i=\"\",a=\"0123456789ABCDEF\";do i=a.charAt(e&15)+i,e>>>=4;while(e>0);if(n!=null)for(;i.length<n;)i=\"0\"+i;return i}static get __name__(){return\"StringTools\"}get __class__(){return Tc}},\"StringTools\");var fNe=j.$global,Nn=j.global(\"$hxEnums\")[\"mcl.Token\"]={__ename__:\"mcl.Token\",Literal:Object.assign((t,e)=>({_hx_index:0,__enum__:\"mcl.Token\",v:t,pos:e,\"@kind\":\"Literal\"}),{_hx_name:\"Literal\",__params__:[\"v\",\"pos\"]}),BracketOpen:Object.assign((t,e)=>({_hx_index:1,__enum__:\"mcl.Token\",pos:t,data:e,\"@kind\":\"BracketOpen\"}),{_hx_name:\"BracketOpen\",__params__:[\"pos\",\"data\"]}),BracketClose:Object.assign(t=>({_hx_index:2,__enum__:\"mcl.Token\",pos:t,\"@kind\":\"BracketClose\"}),{_hx_name:\"BracketClose\",__params__:[\"pos\"]})};Nn.__constructs__=[Nn.Literal,Nn.BracketOpen,Nn.BracketClose];Nn.__empty_constructs__=[];var Eo=j.global(\"$hxEnums\")[\"mcl.Brackets\"]={__ename__:\"mcl.Brackets\",Curly:{_hx_name:\"Curly\",_hx_index:0,__enum__:\"mcl.Brackets\",\"@kind\":\"Curly\"},Square:{_hx_name:\"Square\",_hx_index:1,__enum__:\"mcl.Brackets\",\"@kind\":\"Square\"},Round:{_hx_name:\"Round\",_hx_index:2,__enum__:\"mcl.Brackets\",\"@kind\":\"Round\"}};Eo.__constructs__=[Eo.Curly,Eo.Square,Eo.Round];Eo.__empty_constructs__=[Eo.Curly,Eo.Square,Eo.Round];var Zn=j.global(\"$hxClasses\")[\"mcl.Tokenizer\"]=s(class k4{static tokenize(e,n){let i=!1,a=[],r=[],o=0,l=e.split(`\n`);for(;o<l.length;){let f=l[o];++o;let g=0;for(;;){let x;switch(f.charAt(0)){case\"\t\":case\" \":f=f.substring(1),++g,x=!0;break;default:x=!1}if(!x)break}a.push(g),r.push(f)}let c=r,d=[],u=0,p=0,m=0;for(;m<c.length;){let f=c[m],g=a[u];for(;;){for(;f.charAt(f.length-1)==`\n`||f.charAt(f.length-1)==\"\\r\";)f=f.substring(0,f.length-1);if(f.endsWith(\" \\\\\"))f=Et.rtrim(f.substring(0,f.length-2)),f+=\" \"+Et.trim(c[++m]),++u;else break}if(++m,++u,f==\"###\"){i=!i;continue}if(i){d.push(Nn.Literal(\"### \"+f,{line:u,col:p+g,file:n}));continue}if(f.charAt(0)==\"#\"){d.push(Nn.Literal(f,{line:u,col:p+g,file:n}));continue}f.charAt(0)==\"}\"&&(d.push(Nn.BracketClose({line:u,col:p+g,file:n})),f=f.substring(1));let x=0,_=[],h=!1;for(;x<f.length;){let b=f.length-x-1,y=f.charAt(b);if(y==\"}\")_.push(Eo.Curly);else if(y==\"{\"){if(_.length==0){let w=Et.trim(f.substring(0,b));w.length>0&&d.push(Nn.Literal(w,{line:u,col:p+g,file:n}));let S=Et.trim(f.substring(b+1));d.push(Nn.BracketOpen({line:u,col:p+g+b,file:n},S)),h=!0;break}_.pop()}++x}let v=Et.trim(f);h||v.length==0||d.push(Nn.Literal(Et.trim(v),{line:u,col:p+g,file:n}))}return d}static get __name__(){return\"mcl.Tokenizer\"}get __class__(){return k4}},\"Tokenizer\");var Bv=wi(Ee(\"module\"));var vNe=j.$global,Ci=j.global(\"$hxClasses\")[\"mcl.error.McbError\"]=s(class fv extends j.inherits(ne){[j.new](e,n){super[j.new](e),this.mcbstack=n}__init__(){}static isMclError(e){return e instanceof fv}static get __name__(){return\"mcl.error.McbError\"}static get __super__(){return ne}get __class__(){return fv}},\"McbError\");Ci.prototype.mcbstack=null;var kNe=j.$global,Je=j.global(\"$hxClasses\")[\"mcl.error.CompilerError\"]=s(class j4 extends j.inherits(Ci){[j.new](e,n,i){super[j.new]((n?\"Internal \":\"\")+`Compiler Error:\n\t`+e,i),this.internal=n}static get __name__(){return\"mcl.error.CompilerError\"}static get __super__(){return Ci}get __class__(){return j4}},\"CompilerError\");Je.prototype.internal=null;var SNe=j.$global,Ze=j.global(\"$hxClasses\")[\"haxe.io.Path\"]=s(class el extends j.inherits(){[j.new](e){switch(e){case\".\":case\"..\":this.dir=e,this.file=\"\";return}let n=e.lastIndexOf(\"/\"),i=e.lastIndexOf(\"\\\\\");n<i?(this.dir=at.substr(e,0,i),e=at.substr(e,i+1,null),this.backslash=!0):i<n?(this.dir=at.substr(e,0,n),e=at.substr(e,n+1,null)):this.dir=null;let a=e.lastIndexOf(\".\");a!=-1?(this.ext=at.substr(e,a+1,null),this.file=at.substr(e,0,a)):(this.ext=null,this.file=e)}toString(){return(this.dir==null?\"\":this.dir+(this.backslash?\"\\\\\":\"/\"))+this.file+(this.ext==null?\"\":\".\"+this.ext)}static withoutExtension(e){let n=new el(e);return n.ext=null,n.toString()}static directory(e){let n=new el(e);return n.dir==null?\"\":n.dir}static extension(e){let n=new el(e);return n.ext==null?\"\":n.ext}static join(e){let n=[],i=0,a=e;for(;i<a.length;){let d=a[i];++i,d!=null&&d!=\"\"&&n.push(d)}let r=n;if(r.length==0)return\"\";let o=r[0],l=1,c=r.length;for(;l<c;){let d=l++;o=el.addTrailingSlash(o),o+=r[d]}return el.normalize(o)}static normalize(e){let n=\"/\";if(e=e.split(\"\\\\\").join(n),e==n)return n;let i=[],a=0,r=e.split(n);for(;a<r.length;){let m=r[a];++a,m==\"..\"&&i.length>0&&i[i.length-1]!=\"..\"?i.pop():m==\"\"?(i.length>0||at.cca(e,0)==47)&&i.push(m):m!=\".\"&&i.push(m)}let o=i.join(n),l=\"\",c=!1,d=!1,u=0,p=o;for(;u<p.length;){let m=p,f=u++,g=m.charCodeAt(f);g>=55296&&g<=56319&&(g=g-55232<<10|m.charCodeAt(f+1)&1023);let x=g;x>=65536&&++u;let _=x;switch(_){case 47:if(!c)d=!0;else{let v=_;c=!1,d&&(l+=\"/\",d=!1),l+=String.fromCodePoint(v)}break;case 58:l+=\":\",c=!0;break;default:let h=_;c=!1,d&&(l+=\"/\",d=!1),l+=String.fromCodePoint(h)}}return l}static addTrailingSlash(e){if(e.length==0)return\"/\";let n=e.lastIndexOf(\"/\"),i=e.lastIndexOf(\"\\\\\");return n<i?i!=e.length-1?e+\"\\\\\":e:n!=e.length-1?e+\"/\":e}static get __name__(){return\"haxe.io.Path\"}get __class__(){return el}},\"Path\");Ze.prototype.dir=null;Ze.prototype.file=null;Ze.prototype.ext=null;Ze.prototype.backslash=null;var FNe=j.$global,nl=s(function(){},\"IMap\");nl.__isInterface__=!0;var BNe=j.$global,Mt=j.global(\"$hxClasses\")[\"genes.util.EsMap\"]=s(class hv extends j.inherits(){[j.new](){this.inst=new Map}get(e){return this.inst.get(e)}keys(){return hv.adaptIterator(this.inst.keys())}clear(){this.inst.clear()}static adaptIterator(e){let n,i,a=s(function(){let r=e.next();n=r.value,i=r.done},\"queue\");return{hasNext:function(){return i==null&&a(),!i},next:function(){i==null&&a();let r=n;return a(),r}}}static get __name__(){return\"genes.util.EsMap\"}get __class__(){return hv}},\"EsMap\");Mt.prototype.inst=null;var qNe=j.$global,et=j.global(\"$hxClasses\")[\"haxe.ds.StringMap\"]=s(class A4 extends j.inherits(Mt){[j.new](){super[j.new]()}static get __name__(){return\"haxe.ds.StringMap\"}static get __interfaces__(){return[nl]}static get __super__(){return Mt}get __class__(){return A4}},\"StringMap\");var ZNe=j.$global,gv=j.global(\"$hxClasses\")[\"mcl.TagManager\"]=s(class T4 extends j.inherits(){[j.new](){this.tagEntries=new et}ensureTag(e,n){let i=e.indexOf(\":\");if(i==-1)e=n.namespace+\":\"+n.path.concat([e]).join(\"/\");else if(i!=e.lastIndexOf(\":\")){let a=null;throw new Je(Qe.formatContext(\"Invalid tag name: \"+e,a,n),!1,[a].concat(n.stack))}return this.tagEntries.inst.has(e)||this.tagEntries.inst.set(e,{entries:new Set,replace:!1}),e}addTagEntry(e,n,i,a){a==null&&(a=!1),e=this.ensureTag(e,i),this.tagEntries.inst.get(e).entries.add({value:n,replace:a})}setTagReplace(e,n,i){e=this.ensureTag(e,n),this.tagEntries.inst.get(e).replace=i}writeTagFiles(e){let n=this.tagEntries,i=n,a=n.keys();for(;a.hasNext();){let r=a.next(),o=i.get(r),c=r,d=o,u=c.split(\":\"),p=u.length!=2,m=u[0],f=u[1],g=Ze.join([\"data\",m,\"tags\",e.config.features.useFolderRenames48?\"function\":\"functions\",f+\".json\"]),x=e.io,_=[],h=d.entries.values(),v=h,b=h.next();for(;!b.done;){let y=b.value;b=v.next();let w=y,S=w.replace;_.push(w.value)}x.write(g,JSON.stringify({values:_,replace:d.replace?!0:void 0}))}}static get __name__(){return\"mcl.TagManager\"}get __class__(){return T4}},\"TagManager\");gv.prototype.tagEntries=null;var nRe=j.$global,Si=j.global(\"$hxClasses\")[\"mcl.error.ParserError\"]=s(class C4 extends j.inherits(Ci){[j.new](e){super[j.new](`Parser Error:\n\t`+e,[])}static get __name__(){return\"mcl.error.ParserError\"}static get __super__(){return Ci}get __class__(){return C4}},\"ParserError\");var oRe=j.$global,Yt=j.global(\"$hxEnums\")[\"mcl.JsonTagType\"]={__ename__:\"mcl.JsonTagType\",Tag:Object.assign((t,e,n)=>({_hx_index:0,__enum__:\"mcl.JsonTagType\",subType:t,replace:e,entries:n,\"@kind\":\"Tag\"}),{_hx_name:\"Tag\",__params__:[\"subType\",\"replace\",\"entries\"]}),Advancement:Object.assign(t=>({_hx_index:1,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"Advancement\"}),{_hx_name:\"Advancement\",__params__:[\"entries\"]}),ItemModifier:Object.assign(t=>({_hx_index:2,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"ItemModifier\"}),{_hx_name:\"ItemModifier\",__params__:[\"entries\"]}),LootTable:Object.assign(t=>({_hx_index:3,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"LootTable\"}),{_hx_name:\"LootTable\",__params__:[\"entries\"]}),Predicate:Object.assign(t=>({_hx_index:4,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"Predicate\"}),{_hx_name:\"Predicate\",__params__:[\"entries\"]}),Recipe:Object.assign(t=>({_hx_index:5,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"Recipe\"}),{_hx_name:\"Recipe\",__params__:[\"entries\"]}),ChatType:Object.assign(t=>({_hx_index:6,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"ChatType\"}),{_hx_name:\"ChatType\",__params__:[\"entries\"]}),DamageType:Object.assign(t=>({_hx_index:7,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"DamageType\"}),{_hx_name:\"DamageType\",__params__:[\"entries\"]}),Dimension:Object.assign(t=>({_hx_index:8,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"Dimension\"}),{_hx_name:\"Dimension\",__params__:[\"entries\"]}),DimensionType:Object.assign(t=>({_hx_index:9,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"DimensionType\"}),{_hx_name:\"DimensionType\",__params__:[\"entries\"]}),Enchantment:Object.assign(t=>({_hx_index:10,__enum__:\"mcl.JsonTagType\",entries:t,\"@kind\":\"Enchantment\"}),{_hx_name:\"Enchantment\",__params__:[\"entries\"]}),WorldGen:Object.assign((t,e,n)=>({_hx_index:11,__enum__:\"mcl.JsonTagType\",subType:t,name:e,entries:n,\"@kind\":\"WorldGen\"}),{_hx_name:\"WorldGen\",__params__:[\"subType\",\"name\",\"entries\"]})};Yt.__constructs__=[Yt.Tag,Yt.Advancement,Yt.ItemModifier,Yt.LootTable,Yt.Predicate,Yt.Recipe,Yt.ChatType,Yt.DamageType,Yt.Dimension,Yt.DimensionType,Yt.Enchantment,Yt.WorldGen];Yt.__empty_constructs__=[];var pe=j.global(\"$hxEnums\")[\"mcl.AstNode\"]={__ename__:\"mcl.AstNode\",Raw:Object.assign((t,e,n,i)=>({_hx_index:0,__enum__:\"mcl.AstNode\",pos:t,value:e,continuations:n,isMacro:i,\"@kind\":\"Raw\"}),{_hx_name:\"Raw\",__params__:[\"pos\",\"value\",\"continuations\",\"isMacro\"]}),FunctionDef:Object.assign((t,e,n,i)=>({_hx_index:1,__enum__:\"mcl.AstNode\",pos:t,name:e,body:n,appendTo:i,\"@kind\":\"FunctionDef\"}),{_hx_name:\"FunctionDef\",__params__:[\"pos\",\"name\",\"body\",\"appendTo\"]}),TemplateDef:Object.assign((t,e,n)=>({_hx_index:2,__enum__:\"mcl.AstNode\",pos:t,name:e,body:n,\"@kind\":\"TemplateDef\"}),{_hx_name:\"TemplateDef\",__params__:[\"pos\",\"name\",\"body\"]}),Directory:Object.assign((t,e,n)=>({_hx_index:3,__enum__:\"mcl.AstNode\",pos:t,name:e,body:n,\"@kind\":\"Directory\"}),{_hx_name:\"Directory\",__params__:[\"pos\",\"name\",\"body\"]}),Import:Object.assign((t,e)=>({_hx_index:4,__enum__:\"mcl.AstNode\",pos:t,name:e,\"@kind\":\"Import\"}),{_hx_name:\"Import\",__params__:[\"pos\",\"name\"]}),CompileTimeLoop:Object.assign((t,e,n,i)=>({_hx_index:5,__enum__:\"mcl.AstNode\",pos:t,expression:e,as:n,body:i,\"@kind\":\"CompileTimeLoop\"}),{_hx_name:\"CompileTimeLoop\",__params__:[\"pos\",\"expression\",\"as\",\"body\"]}),CompileTimeIf:Object.assign((t,e,n,i)=>({_hx_index:6,__enum__:\"mcl.AstNode\",pos:t,expression:e,body:n,elseExpressions:i,\"@kind\":\"CompileTimeIf\"}),{_hx_name:\"CompileTimeIf\",__params__:[\"pos\",\"expression\",\"body\",\"elseExpressions\"]}),MultiLineScript:Object.assign((t,e)=>({_hx_index:7,__enum__:\"mcl.AstNode\",pos:t,value:e,\"@kind\":\"MultiLineScript\"}),{_hx_name:\"MultiLineScript\",__params__:[\"pos\",\"value\"]}),Block:Object.assign((t,e,n,i,a,r)=>({_hx_index:8,__enum__:\"mcl.AstNode\",pos:t,name:e,body:n,data:i,isMacro:a,isInline:r,\"@kind\":\"Block\"}),{_hx_name:\"Block\",__params__:[\"pos\",\"name\",\"body\",\"data\",\"isMacro\",\"isInline\"]}),TickBlock:Object.assign((t,e)=>({_hx_index:9,__enum__:\"mcl.AstNode\",pos:t,body:e,\"@kind\":\"TickBlock\"}),{_hx_name:\"TickBlock\",__params__:[\"pos\",\"body\"]}),LoadBlock:Object.assign((t,e)=>({_hx_index:10,__enum__:\"mcl.AstNode\",pos:t,body:e,\"@kind\":\"LoadBlock\"}),{_hx_name:\"LoadBlock\",__params__:[\"pos\",\"body\"]}),ExecuteBlock:Object.assign((t,e,n,i,a,r)=>({_hx_index:11,__enum__:\"mcl.AstNode\",pos:t,execute:e,data:n,body:i,continuations:a,isMacro:r,\"@kind\":\"ExecuteBlock\"}),{_hx_name:\"ExecuteBlock\",__params__:[\"pos\",\"execute\",\"data\",\"body\",\"continuations\",\"isMacro\"]}),ScheduleBlock:Object.assign((t,e,n,i,a)=>({_hx_index:12,__enum__:\"mcl.AstNode\",pos:t,delay:e,type:n,body:i,isMacro:a,\"@kind\":\"ScheduleBlock\"}),{_hx_name:\"ScheduleBlock\",__params__:[\"pos\",\"delay\",\"type\",\"body\",\"isMacro\"]}),SequenceBlock:Object.assign((t,e)=>({_hx_index:13,__enum__:\"mcl.AstNode\",pos:t,body:e,\"@kind\":\"SequenceBlock\"}),{_hx_name:\"SequenceBlock\",__params__:[\"pos\",\"body\"]}),RuntimeLoop:Object.assign((t,e,n)=>({_hx_index:14,__enum__:\"mcl.AstNode\",pos:t,expression:e,body:n,\"@kind\":\"RuntimeLoop\"}),{_hx_name:\"RuntimeLoop\",__params__:[\"pos\",\"expression\",\"body\"]}),Comment:Object.assign((t,e)=>({_hx_index:15,__enum__:\"mcl.AstNode\",pos:t,value:e,\"@kind\":\"Comment\"}),{_hx_name:\"Comment\",__params__:[\"pos\",\"value\"]}),JsonFile:Object.assign((t,e,n)=>({_hx_index:16,__enum__:\"mcl.AstNode\",pos:t,name:e,info:n,\"@kind\":\"JsonFile\"}),{_hx_name:\"JsonFile\",__params__:[\"pos\",\"name\",\"info\"]}),TemplateOverload:Object.assign((t,e,n)=>({_hx_index:17,__enum__:\"mcl.AstNode\",pos:t,args:e,body:n,\"@kind\":\"TemplateOverload\"}),{_hx_name:\"TemplateOverload\",__params__:[\"pos\",\"args\",\"body\"]}),ClockExpr:Object.assign((t,e,n,i)=>({_hx_index:18,__enum__:\"mcl.AstNode\",pos:t,name:e,time:n,body:i,\"@kind\":\"ClockExpr\"}),{_hx_name:\"ClockExpr\",__params__:[\"pos\",\"name\",\"time\",\"body\"]}),Execute:Object.assign((t,e,n,i)=>({_hx_index:19,__enum__:\"mcl.AstNode\",pos:t,command:e,value:n,isMacro:i,\"@kind\":\"Execute\"}),{_hx_name:\"Execute\",__params__:[\"pos\",\"command\",\"value\",\"isMacro\"]}),FunctionCall:Object.assign((t,e,n,i)=>({_hx_index:20,__enum__:\"mcl.AstNode\",pos:t,name:e,data:n,isMacro:i,\"@kind\":\"FunctionCall\"}),{_hx_name:\"FunctionCall\",__params__:[\"pos\",\"name\",\"data\",\"isMacro\"]}),EqCommand:Object.assign((t,e)=>({_hx_index:21,__enum__:\"mcl.AstNode\",pos:t,command:e,\"@kind\":\"EqCommand\"}),{_hx_name:\"EqCommand\",__params__:[\"pos\",\"command\"]}),ScheduleCall:Object.assign((t,e,n,i,a)=>({_hx_index:22,__enum__:\"mcl.AstNode\",pos:t,delay:e,target:n,mode:i,isMacro:a,\"@kind\":\"ScheduleCall\"}),{_hx_name:\"ScheduleCall\",__params__:[\"pos\",\"delay\",\"target\",\"mode\",\"isMacro\"]}),ReturnRun:Object.assign((t,e,n)=>({_hx_index:23,__enum__:\"mcl.AstNode\",pos:t,value:e,isMacro:n,\"@kind\":\"ReturnRun\"}),{_hx_name:\"ReturnRun\",__params__:[\"pos\",\"value\",\"isMacro\"]}),ScheduleClear:Object.assign((t,e,n)=>({_hx_index:24,__enum__:\"mcl.AstNode\",pos:t,target:e,isMacro:n,\"@kind\":\"ScheduleClear\"}),{_hx_name:\"ScheduleClear\",__params__:[\"pos\",\"target\",\"isMacro\"]}),Void:{_hx_name:\"Void\",_hx_index:25,__enum__:\"mcl.AstNode\",\"@kind\":\"Void\"},Group:Object.assign(t=>({_hx_index:26,__enum__:\"mcl.AstNode\",body:t,\"@kind\":\"Group\"}),{_hx_name:\"Group\",__params__:[\"body\"]})};pe.__constructs__=[pe.Raw,pe.FunctionDef,pe.TemplateDef,pe.Directory,pe.Import,pe.CompileTimeLoop,pe.CompileTimeIf,pe.MultiLineScript,pe.Block,pe.TickBlock,pe.LoadBlock,pe.ExecuteBlock,pe.ScheduleBlock,pe.SequenceBlock,pe.RuntimeLoop,pe.Comment,pe.JsonFile,pe.TemplateOverload,pe.ClockExpr,pe.Execute,pe.FunctionCall,pe.EqCommand,pe.ScheduleCall,pe.ReturnRun,pe.ScheduleClear,pe.Void,pe.Group];pe.__empty_constructs__=[pe.Void];var dRe=j.$global,Pr=j.global(\"$hxClasses\")[\"js.Boot\"]=s(class vi{static getClass(e){if(e==null)return null;if(e instanceof Array)return Array;{let n=e.__class__;if(n!=null)return n;let i=vi.__nativeClassName(e);return i!=null?vi.__resolveNativeClass(i):null}}static __string_rec(e,n){if(e==null)return\"null\";if(n.length>=5)return\"<...>\";let i=typeof e;switch(i==\"function\"&&(e.__name__||e.__ename__)&&(i=\"object\"),i){case\"function\":return\"<function>\";case\"object\":if(e.__enum__){let d=j.global(\"$hxEnums\")[e.__enum__].__constructs__[e._hx_index],u=d._hx_name;return d.__params__?(n=n+\"\t\",u+\"(\"+function(p){var m;let f=[];{let g=0,x=d.__params__;for(;g<x.length;){let _=x[g];g=g+1,f.push(vi.__string_rec(e[_],n))}}return m=f,m}(this).join(\",\")+\")\"):u}if(e instanceof Array){let c=\"[\";n+=\"\t\";let d=0,u=e.length;for(;d<u;){let p=d++;c+=(p>0?\",\":\"\")+vi.__string_rec(e[p],n)}return c+=\"]\",c}let a;try{a=e.toString}catch{return\"???\"}if(a!=null&&a!=Object.toString&&typeof a==\"function\"){let c=e.toString();if(c!=\"[object Object]\")return c}let r=`{\n`;n+=\"\t\";let o=e.hasOwnProperty!=null,l=null;for(l in e)o&&!e.hasOwnProperty(l)||l==\"prototype\"||l==\"__class__\"||l==\"__super__\"||l==\"__interfaces__\"||l==\"__properties__\"||(r.length!=2&&(r+=`, \n`),r+=n+l+\" : \"+vi.__string_rec(e[l],n));return n=n.substring(1),r+=`\n`+n+\"}\",r;break;case\"string\":return e;default:return String(e)}}static __interfLoop(e,n){if(e==null)return!1;if(e==n)return!0;let i=e.__interfaces__;if(i!=null&&(e.__super__==null||e.__super__.__interfaces__!=i)){let a=0,r=i.length;for(;a<r;){let o=a++,l=i[o];if(l==n||vi.__interfLoop(l,n))return!0}}return vi.__interfLoop(e.__super__,n)}static __instanceof(e,n){if(n==null)return!1;switch(n){case Array:return e instanceof Array;case\"$hxCoreType__Bool\":return typeof e==\"boolean\";case\"$hxCoreType__Dynamic\":return e!=null;case\"$hxCoreType__Float\":return typeof e==\"number\";case\"$hxCoreType__Int\":return typeof e==\"number\"?(e|0)===e:!1;case String:return typeof e==\"string\";default:if(e!=null){if(typeof n==\"function\"){if(vi.__downcastCheck(e,n))return!0}else if(typeof n==\"object\"&&vi.__isNativeObj(n)&&e instanceof n)return!0}else return!1;return n==\"$hxCoreType__Class\"&&e.__name__!=null||n==\"$hxCoreType__Enum\"&&e.__ename__!=null?!0:e.__enum__!=null?j.global(\"$hxEnums\")[e.__enum__]==n:!1}}static __downcastCheck(e,n){return e instanceof n?!0:n.__isInterface__?vi.__interfLoop(vi.getClass(e),n):!1}static __cast(e,n){if(e==null||vi.__instanceof(e,n))return e;throw ne.thrown(\"Cannot cast \"+Ge.string(e)+\" to \"+Ge.string(n))}static __nativeClassName(e){let n=vi.__toStr.call(e).slice(8,-1);return n==\"Object\"||n==\"Function\"||n==\"Math\"||n==\"JSON\"?null:n}static __isNativeObj(e){return vi.__nativeClassName(e)!=null}static __resolveNativeClass(e){return j.$global[e]}static get __name__(){return\"js.Boot\"}get __class__(){return vi}},\"Boot\");Pr.__toStr={}.toString;var gRe=j.$global,Ge=j.global(\"$hxClasses\").Std=s(class S4{static string(e){return Pr.__string_rec(e,\"\")}static parseInt(e){let n=parseInt(e);return isNaN(n)?null:n}static get __name__(){return\"Std\"}get __class__(){return S4}},\"Std\");Object.defineProperty(String.prototype,\"__class__\",{value:j.global(\"$hxClasses\").String=String,enumerable:!1,writable:!0}),String.__name__=!0,j.global(\"$hxClasses\").Array=Array,Array.__name__=!0,Date.prototype.__class__=j.global(\"$hxClasses\").Date=Date,Date.__name__=\"Date\",ube={},dbe={},pbe=Number,mbe=Boolean,fbe={},hbe={};var ube,dbe,pbe,mbe,fbe,hbe;var wRe=j.$global,Lr=j.global(\"$hxClasses\").EReg=s(class O4 extends j.inherits(){[j.new](e,n){this.r=new RegExp(e,n.split(\"u\").join(\"\"))}match(e){return this.r.global&&(this.r.lastIndex=0),this.r.m=this.r.exec(e),this.r.s=e,this.r.m!=null}matched(e){if(this.r.m!=null&&e>=0&&e<this.r.m.length)return this.r.m[e];throw ne.thrown(\"EReg::matched\")}matchedRight(){if(this.r.m==null)throw ne.thrown(\"No string matched\");let e=this.r.m.index+this.r.m[0].length;return at.substr(this.r.s,e,this.r.s.length-e)}matchedPos(){if(this.r.m==null)throw ne.thrown(\"No string matched\");return{pos:this.r.m.index,len:this.r.m[0].length}}static get __name__(){return\"EReg\"}get __class__(){return O4}},\"EReg\");Lr.prototype.r=null;var DRe=j.$global,ko=j.global(\"$hxClasses\")[\"mcl.ArrayInput\"]=s(class I4 extends j.inherits(){[j.new](e){this.array=e,this.set_index(0)}get index(){return this.get_index()}set index(e){this.set_index(e)}get_index(){return this._index}set_index(e){return this._index=e}next(){if(this._index>=this.array.length)throw new Si(\"Tried to read past the end of the token list\");let e=this.array,n=this.get_index();return this.set_index(n+1),e[n]}skip(){this.set_index(this.get_index()+1)}peek(){return this.array[this.get_index()]}hasNext(){return this.get_index()<this.array.length}insert(e){let n=this.array,i=this.get_index();n.splice(i,0,e)}back(){this.set_index(this.get_index()-1)}update(e){this.array[this.get_index()]=e}static get __name__(){return\"mcl.ArrayInput\"}get __class__(){return I4}},\"ArrayInput\");ko.prototype.array=null;ko.prototype._index=null;var Xt=j.global(\"$hxClasses\")[\"mcl.Parser\"]=s(class ye{static format(e,...n){let i=new RegExp(\"\\\\{\\\\}\",\"\".split(\"u\").join(\"\")),a=0,r=n.slice();for(;a<r.length;){let o=r[a];++a,e=e.replace(i,Ge.string(o))}return e}static toss(e,n){switch(e._hx_index){case 0:let i=e.v,a=e.pos;throw new Si(ye.format(n,i,a.file,a.line,a.col));case 1:let r=e.pos,o=e.data;throw new Si(ye.format(n,o,r.file,r.line,r.col));case 2:let l=e.pos;throw new Si(ye.format(n,l.file,l.line,l.col))}}static unreachable(e){let n;switch(e._hx_index){case 0:let i=e.v,a=e.pos;n=ye.format(\"Unexpected token '{}' at {}:{}:{}\",i,a.file,a.line,a.col);break;case 1:let r=e.pos,o=e.data;n=ye.format(\"Unexpected '{' with data '{}' at {}:{}:{}\",o,r.file,r.line,r.col);break;case 2:let l=e.pos;n=ye.format(\"Unexpected '}' at {}:{}:{}\",l.file,l.line,l.col);break}return new Si(n)}static expect(e,n){let i=e.next();if(!n(i))throw ye.unreachable(i)}static expectThenData(e,n){n==null&&(n=!0);let i=e.peek();if(ye.expect(e,function(a){return a._hx_index==1}),i._hx_index==1){let a=i.pos,r=i.data;if(!n&&r.length>0)throw ye.unreachable(i);return r}else return null}static block(e,n,i,a){i==null&&(i=!0);let r=ye.expectThenData(e,i);for(;;){if(!e.hasNext())throw new Si(\"Unexpected end of file!\");let o=e.peek();if(o._hx_index==2){let l=o.pos;a?.(o);break}else n()}return ye.expect(e,function(o){return o._hx_index==2}),r==\"\"?null:r}static readFunction(e,n,i){let a=[],r=null,o=e.split(\" \");return o.length==2?(e=o[0],r=o[1]):o.length==1&&(e=o[0]),ye.block(n,function(){a.push(ye.innerParse(n))},!1),pe.FunctionDef(i,e,a,r)}static innerParseTemplate(e){let n=e.peek();if(n._hx_index==0){let i=n.v,a=n.pos;switch(i){case\"load\":let r=a;e.skip();let o=[];return ye.block(e,function(){o.push(ye.innerParse(e))},!1),pe.LoadBlock(r,o);break;case\"tick\":let l=a;e.skip();let c=[];return ye.block(e,function(){c.push(ye.innerParse(e))},!1),pe.TickBlock(l,c);break;default:let d=i,u=a;if(d==\"with\"||d.startsWith(\"with \")){e.skip();let p=Et.trim(d.substring(5)),m=[];return ye.block(e,function(){m.push(ye.innerParse(e))},!1),pe.TemplateOverload(u,p,m)}else{let p=i,m=a;if(p.startsWith(\"#\"))return e.skip(),null;throw ye.unreachable(e.next())}}}else throw ye.unreachable(e.next())}static readTemplate(e,n,i){let a=[];return ye.block(n,function(){let r=ye.innerParseTemplate(n);r!=null&&a.push(r)},!1),pe.TemplateDef(i,e,a)}static pos(e){switch(e._hx_index){case 0:let n=e.v;return e.pos;case 1:let a=e.data;return e.pos;case 2:return e.pos}}static json(e){let n=ye.pos(e.peek()),i=0,a=\"\";do{if(!e.hasNext())throw new Si(\"Unexpected end of file!\");let r=e.next();switch(r._hx_index){case 0:let o=r.pos,l=r.v;a+=l;break;case 1:let c=r.pos,d=r.data;a+=\"{\",a+=d,++i;break;case 2:let u=r.pos;--i,a+=\"}\";break}}while(i>0);return pe.Raw(n,a,[],!1)}static parseMcbFile(e){let n=new ko(e),i=[];for(;n.hasNext();)i.push(ye.parseTLD(n));return i}static parseMcbtFile(e){let n=new ko(e),i=[];for(;n.hasNext();){let a=n.next(),r;if(a._hx_index==0){let o=a.v,l=a.pos;if(o.startsWith(\"template \")){let c=Et.trim(o.substring(9));r=ye.readTemplate(c,n,l)}else if(o.startsWith(\"#\"))r=pe.Comment(l,o);else if(o.startsWith(\"import \"))r=pe.Import(l,o.substring(7));else throw ye.unreachable(a)}else throw ye.unreachable(a);i.push(r)}return i}static parserCompilerLoop(e,n,i,a){let r=[];if(ye.block(i,function(){r.push(a())}),ye.loopRegExp.match(e)){let o=ye.loopRegExp.matched(1),l=ye.loopRegExp.matched(2),c;if(l.length==0)c=null;else{let d=[],u=0,p=l.split(\",\");for(;u<p.length;){let m=p[u];++u,d.push(Et.trim(m))}c=d}return pe.CompileTimeLoop(n,o,c,r)}return pe.CompileTimeLoop(n,e,null,r)}static parseTLD(e){let n=e.next();if(n._hx_index==0){let i=n.v,a=n.pos;if(i.startsWith(\"function \")){let r=Et.trim(i.substring(9));return ye.readFunction(r,e,a)}else if(i.startsWith(\"clock \")){let r=Et.trim(i.substring(6));if(r.indexOf(\" \")==-1)throw new Si(ye.format('\"Expected a name and a time for the clock command\" at {}:{}:{}',a.file,a.line,a.col));let o=Et.trim(r.substring(0,r.indexOf(\" \")+1));r=Et.trim(r.substring(r.indexOf(\" \")));let l=[];return ye.block(e,function(){l.push(ye.innerParse(e))}),pe.ClockExpr(a,o,r,l)}else{if(i.startsWith(\"import \"))return pe.Import(a,i.substring(7));if(i.startsWith(\"dir \")&&e.peek()._hx_index==1){let r=[];if(ye.block(e,function(){r.push(ye.parseTLD(e))},!1)!=null)throw ye.unreachable(Nn.Literal(i,a));return pe.Directory(a,i.substring(4),r)}else if(i.startsWith(\"<%%\")){let r=[];for(;;){if(!e.hasNext())throw new Si(\"Unexpected end of file!\");let o=e.peek();if(o._hx_index==0){let l=o.pos;if(o.v==\"%%>\"){e.skip();break}}r.push(e.next())}return pe.MultiLineScript(a,r)}else{if(i.startsWith(\"#\"))return pe.Comment(a,i);if(i.startsWith(\"REPEAT\"))return ye.parserCompilerLoop(i,a,e,function(){return ye.parseTLD(e)});if(i.startsWith(\"IF\"))return ye.parseCompileTimeIf(i,a,e,function(){return ye.parseTLD(e)});if(i.startsWith(\"tag \")){let r=Et.trim(i.substring(4)).split(\" \"),o=r.shift(),l=r.shift(),c=r.shift()==\"replace\",d=[];return ye.block(e,function(){d.push(ye.innerParse(e))}),pe.JsonFile(a,l,Yt.Tag(o,c,d))}else{if(i.startsWith(\"advancement \")||i.startsWith(\"enchantment \")||i.startsWith(\"item_modifier \")||i.startsWith(\"loot_table \")||i.startsWith(\"predicate \")||i.startsWith(\"recipe \")||i.startsWith(\"chat_type \")||i.startsWith(\"damage_type \")||i.startsWith(\"dimension \")||i.startsWith(\"dimension_type \"))return ye.readPlainJsonFile(i,a,e);if(i.startsWith(\"worldgen \")){let r=Et.trim(i.substring(9)),o=r.substring(0,r.indexOf(\" \"));r=r.substring(r.indexOf(\" \")+1);let l=[];return ye.block(e,function(){l.push(ye.innerParse(e))}),pe.JsonFile(a,r,Yt.WorldGen(o,r,l))}else throw ye.unreachable(Nn.Literal(i,a))}}}}else{let i=n;throw ye.unreachable(i)}}static readPlainJsonFile(e,n,i){let a=[],r=0,o=e.split(\" \");for(;r<o.length;){let m=o[r];++r,m!=\"\"&&a.push(m)}let l=a,c=l.shift(),d=l.shift(),u=[];ye.block(i,function(){u.push(ye.json(i))});let p;if(c==null)throw ye.unreachable(Nn.Literal(e,n));switch(c){case\"advancement\":p=Yt.Advancement(u);break;case\"chat_type\":p=Yt.ChatType(u);break;case\"damage_type\":p=Yt.DamageType(u);break;case\"dimension\":p=Yt.Dimension(u);break;case\"dimension_type\":p=Yt.DimensionType(u);break;case\"enchantment\":p=Yt.Enchantment(u);break;case\"item_modifier\":p=Yt.ItemModifier(u);break;case\"loot_table\":p=Yt.LootTable(u);break;case\"predicate\":p=Yt.Predicate(u);break;case\"recipe\":p=Yt.Recipe(u);break;default:throw ye.unreachable(Nn.Literal(e,n))}return pe.JsonFile(n,d,p)}static innerParse(e){let n=e.peek();switch(n._hx_index){case 0:let i=n.v,a=n.pos;e.next();let r=i.charAt(0)==\"$\";if(r&&(i=i.substring(1)),i==\"<%%\"){let u=[];for(;;){if(!e.hasNext())throw new Si(\"Unexpected end of file!\");let p=e.peek();if(p._hx_index==0){let m=p.pos;if(p.v==\"%%>\"){e.skip();break}}u.push(e.next())}return pe.MultiLineScript(a,u)}else{if(i.startsWith(\"IF\"))return ye.parseCompileTimeIf(i,a,e,function(){return ye.innerParse(e)});if(i.startsWith(\"function \")){let u=i.substring(9),p=u.indexOf(\" \"),m=u.substring(0,p==-1?u.length:p),f=u.substring(m.length+1);return pe.FunctionCall(a,m,f,r)}else if(i.startsWith(\"schedule \")){let u=Et.trim(i.substring(9));if(u.startsWith(\"function \")){let x=u.substring(9),_=x.indexOf(\" \"),h=x.substring(0,_==-1?x.length:_),v=_==-1?null:x.substring(h.length+1),b=\"replace\";if(v.endsWith(\" append\")&&(b=\"append\",v=v.substring(0,v.length-7)),v.endsWith(\" replace\")&&(b=\"replace\",v=v.substring(0,v.length-8)),v==null)throw new Si(ye.format('\"Expected delay after function name in schedule command\" at {}:{}:{}',a.file,a.line,a.col));return pe.ScheduleCall(a,v,h,b,r)}if(u.startsWith(\"clear \"))return pe.ScheduleClear(a,u.substring(6),r);let p=u.indexOf(\" \"),m=p==-1?u:u.substring(0,p),f=\"append\";u.endsWith(\" append\")&&(f=\"append\",u=u.substring(0,u.length-7)),u.endsWith(\" replace\")&&(f=\"replace\",u=u.substring(0,u.length-8));let g=[];if(e.peek()._hx_index!=1)throw new Si(\"Expected { after delay in schedule block command\");return ye.block(e,function(){g.push(ye.innerParse(e))}),pe.ScheduleBlock(a,m,f,g,r)}else if(i.startsWith(\"execute\")&&(i.charAt(7)==\" \"||i.charAt(7)==\"<\"))if(e.hasNext()&&e.peek()._hx_index==1){let u=[];if(!i.endsWith(\"run\")&&ye.executeRegExp.match(i)){let f=ye.executeRegExp.matchedPos(),g={file:a.file,line:a.line,col:a.col+f.pos+f.len},x=Nn.Literal(Et.ltrim(i.substring(f.pos+f.len)),g);return e.insert(x),pe.Execute(a,Et.rtrim(i.substring(0,f.pos+3)),ye.innerParse(e),r)}let p=ye.block(e,function(){u.push(ye.innerParse(e))}),m=[];e:for(;e.hasNext();){let f=e.peek();if(f._hx_index==0){let g=f.v,x=f.pos;switch(g){case\"else $run\":let _=x;e.skip();let h=[],v=ye.block(e,function(){h.push(ye.innerParse(e))});m.push(pe.Block(_,null,h,v,!0,!1));break;case\"else run\":let b=x;e.skip();let y=[],w=ye.block(e,function(){y.push(ye.innerParse(e))});m.push(pe.Block(b,null,y,w,!1,!1));break;default:let S=g,F=x;if(S.startsWith(\"else $\")&&S.endsWith(\"run\")){e.skip();let N=Et.trim(S.substring(6)),k=[],R=ye.block(e,function(){k.push(ye.innerParse(e))});F.col+=5,m.push(pe.ExecuteBlock(F,N,R,k,null,!0))}else{let N=g,k=x;if(N.startsWith(\"else \")&&N.endsWith(\"run\")){e.skip();let R=Et.trim(N.substring(5)),D=[],B=ye.block(e,function(){D.push(ye.innerParse(e))});k.col+=5,m.push(pe.ExecuteBlock(k,R,B,D,null,!1))}else break e}}}else break}return pe.ExecuteBlock(a,i,p,u,m.length>0?m:null,r)}else{if(!ye.executeRegExp.match(i))return ye.readRaw(a,i,e,r);let u=ye.executeRegExp.matchedPos(),p={file:a.file,line:a.line,col:a.col+u.pos+u.len},m=Nn.Literal(Et.ltrim(i.substring(u.pos+u.len)),p);return e.insert(m),pe.Execute(a,Et.rtrim(i.substring(0,u.pos+3)),ye.innerParse(e),r)}else{if(i.startsWith(\"REPEAT\"))return ye.parserCompilerLoop(i,a,e,function(){return ye.innerParse(e)});if(i.startsWith(\"#\"))return pe.Comment(a,i);if(i==\"block\"||i.startsWith(\"block \")){let u=Et.trim(i.substring(6)),p=[],m=ye.block(e,function(){p.push(ye.innerParse(e))});return pe.Block(a,u,p,m,r,!1)}else if(i.startsWith(\"return run\")){let u=Et.trim(i.substring(11)),p={file:a.file,line:a.line,col:a.col+11},m=e.peek();if(m._hx_index==1){let f=m.pos,g=m.data;if(u.length==0){let x=[],_=ye.block(e,function(){x.push(ye.innerParse(e))});return pe.ReturnRun(f,pe.Block(f,null,x,_,!1,!1),r)}else return e.back(),e.update(Nn.Literal(u,p)),pe.ReturnRun(p,ye.innerParse(e),r)}else return e.back(),e.update(Nn.Literal(u,p)),pe.ReturnRun(p,ye.innerParse(e),r)}else if(i==\"tick\"){let u=[];return ye.block(e,function(){u.push(ye.innerParse(e))},!1),pe.TickBlock(a,u)}else if(i==\"load\"){let u=[];return ye.block(e,function(){u.push(ye.innerParse(e))},!1),pe.LoadBlock(a,u)}else return i.startsWith(\"eq \")?pe.EqCommand(a,i.substring(3)):ye.readRaw(a,i,e,r)}}break;case 1:let o=n.data,l=n.pos,c=[],d=ye.block(e,function(){c.push(ye.innerParse(e))});return pe.Block(l,null,c,d,!1,!1);default:throw ye.unreachable(n)}}static readRaw(e,n,i,a){if(!i.hasNext())return pe.Raw(e,n,[],a);let r=[],o=e.line;e:for(;;){if(!i.hasNext())throw new Si(\"Unexpected end of file!\");let l=i.peek();switch(l._hx_index){case 0:let c=l.v,d=l.pos;if(d.line==o)i.skip(),r.push(pe.Raw(d,c,[],!1));else break e;break;case 1:let u=l.pos,p=l.data;if(u.line==o){let f=[],g=ye.block(i,function(){f.push(ye.innerParse(i))});r.push(pe.Block(u,null,f,g,!1,!1))}else break e;break;case 2:let m=l.pos;if(m.line==o)throw ye.unreachable(Nn.Literal(n,m));break e;default:break e}}return pe.Raw(e,n,r,a)}static parseCompileTimeIf(e,n,i,a){let r=Et.trim(e.substring(2)),o=[];ye.block(i,function(){o.push(a())},!1);let l=[];for(;;){if(!i.hasNext())throw new Si(\"Unexpected end of file!\");let c=i.peek();if(c._hx_index==0){let d=c.v,u=c.pos;if(d==\"ELSE\"||d.startsWith(\"ELSE \")){i.skip();let p=d==\"ELSE\"?null:Et.trim(d.substring(5));p!=null?p.startsWith(\"IF\")&&(p=Et.trim(p.substring(2))):p=null;let m=[];ye.block(i,function(){m.push(a())},!1),l.push({condition:p,node:m})}else break}else break}return pe.CompileTimeIf(n,r,o,l)}static get __name__(){return\"mcl.Parser\"}get __class__(){return ye}},\"Parser\");Xt.loopRegExp=new Lr(\"(REPEAT\\\\s*\\\\(.+?\\\\))\\\\s\\\\s*as\\\\s\\\\s*([a-zA-Z,\\\\s]+)\",\"\");Xt.executeRegExp=new Lr(\"\\\\b(run\\\\s+?)\\\\b\",\"\");var MRe=j.$global,mt=j.global(\"$hxEnums\")[\"haxpression.ValueType\"]={__ename__:\"haxpression.ValueType\",VFloat:Object.assign(t=>({_hx_index:0,__enum__:\"haxpression.ValueType\",v:t,\"@kind\":\"VFloat\"}),{_hx_name:\"VFloat\",__params__:[\"v\"]}),VInt:Object.assign(t=>({_hx_index:1,__enum__:\"haxpression.ValueType\",v:t,\"@kind\":\"VInt\"}),{_hx_name:\"VInt\",__params__:[\"v\"]}),VBool:Object.assign(t=>({_hx_index:2,__enum__:\"haxpression.ValueType\",v:t,\"@kind\":\"VBool\"}),{_hx_name:\"VBool\",__params__:[\"v\"]}),VString:Object.assign(t=>({_hx_index:3,__enum__:\"haxpression.ValueType\",v:t,\"@kind\":\"VString\"}),{_hx_name:\"VString\",__params__:[\"v\"]}),VNA:{_hx_name:\"VNA\",_hx_index:4,__enum__:\"haxpression.ValueType\",\"@kind\":\"VNA\"},VNM:{_hx_name:\"VNM\",_hx_index:5,__enum__:\"haxpression.ValueType\",\"@kind\":\"VNM\"}};mt.__constructs__=[mt.VFloat,mt.VInt,mt.VBool,mt.VString,mt.VNA,mt.VNM];mt.__empty_constructs__=[mt.VNA,mt.VNM];var LRe=j.$global,nt=j.global(\"$hxClasses\")[\"haxpression.utils.Chars\"]=s(class Pi{static isDecimalDigit(e){return e>=48?e<=57:!1}static isUpperCaseLetter(e){return e>=65?e<=90:!1}static isLowerCaseLetter(e){return e>=97?e<=122:!1}static isIdentifierStart(e){return e==Pi.DOLLAR_CODE||e==Pi.UNDERSCORE_CODE||Pi.isUpperCaseLetter(e)||Pi.isLowerCaseLetter(e)?!0:Pi.OTHER_IDENTIFIER_START_CODES.includes(e)}static isIdentifierPart(e){return Pi.isIdentifierStart(e)||Pi.isDecimalDigit(e)?!0:Pi.OTHER_IDENTIFIER_PART_CODES.includes(e)}static isWhiteSpace(e){return e==Pi.TAB_CODE||e==Pi.LF_CODE||e==Pi.CR_CODE?!0:e==Pi.SPACE_CODE}static get __name__(){return\"haxpression.utils.Chars\"}get __class__(){return Pi}},\"Chars\");nt.TAB_CODE=9;nt.LF_CODE=10;nt.CR_CODE=13;nt.SPACE_CODE=32;nt.EXCLAMATION_POINT_CODE=33;nt.DOUBLE_QUOTE_CODE=34;nt.DOLLAR_CODE=36;nt.SINGLE_QUOTE_CODE=39;nt.OPEN_PAREN_CODE=40;nt.CLOSE_PAREN_CODE=41;nt.COMMA_CODE=44;nt.PERIOD_CODE=46;nt.COLON_CODE=58;nt.SEMICOLON_CODE=59;nt.QUESTION_MARK_CODE=63;nt.OPEN_BRACKET_CODE=91;nt.CLOSE_BRACKET_CODE=93;nt.UNDERSCORE_CODE=95;nt.OTHER_IDENTIFIER_START_CODES=[];nt.OTHER_IDENTIFIER_PART_CODES=[nt.EXCLAMATION_POINT_CODE,nt.DOLLAR_CODE,nt.COLON_CODE];var qRe=j.$global,Wf=j.global(\"$hxClasses\")[\"haxpression.utils.Iterators\"]=s(class D4{static toArray(e){let n=[],i=e;for(;i.hasNext();){let a=i.next();n.push(a)}return n}static get __name__(){return\"haxpression.utils.Iterators\"}get __class__(){return D4}},\"Iterators\");var WRe=j.$global,Cc=j.global(\"$hxClasses\")[\"haxpression.utils.Arrays\"]=s(class F4{static all(e,n){let i=[],a=0,r=e;for(;a<r.length;){let o=r[a];++a,n(o)&&i.push(o)}return i.length==e.length}static reduce(e,n,i){let a=0;for(;a<e.length;){let r=e[a];++a,i=n(i,r)}return i}static get __name__(){return\"haxpression.utils.Arrays\"}get __class__(){return F4}},\"Arrays\");var ZRe=j.$global,At=j.global(\"$hxClasses\")[\"haxpression.Error\"]=s(class N4 extends j.inherits(){[j.new](e,n,i){this.message=e,this.expression=n,this.position=i}toString(){let e=this.expression!=null?' in expression: \"'+this.expression+'\"':\"\",n=this.position!=null?\" at position: \"+this.position:\"\";return\"\"+this.message+e+n}static get __name__(){return\"haxpression.Error\"}get __class__(){return N4}},\"Error\");At.prototype.message=null;At.prototype.expression=null;At.prototype.position=null;var aMe=j.$global,se=j.global(\"$hxClasses\")[\"haxpression._Value.Value\"]=s(class Sc{static fromValueType(e){return e}static toValueType(e){return e}static fromFloat(e){return Sc.fromValueType(mt.VFloat(e))}static fromInt(e){return Sc.fromValueType(mt.VInt(e))}static fromBool(e){return Sc.fromValueType(mt.VBool(e))}static toFloat(e){switch(e._hx_index){case 0:return e.v;case 1:return e.v;case 2:let a=e.v;throw ne.thrown(new At(\"cannot convert Bool to Float\"));case 3:let r=e.v;throw ne.thrown(new At(\"cannot convert String to Float\"));case 4:throw ne.thrown(new At(\"cannot convert NA to Float\"));case 5:throw ne.thrown(new At(\"cannot convert NM to Float\"))}}static toInt(e){switch(e._hx_index){case 0:return e.v|0;case 1:return e.v;case 2:let a=e.v;throw ne.thrown(new At(\"cannot convert Bool to Int\"));case 3:let r=e.v;throw ne.thrown(new At(\"cannot convert String to Int\"));case 4:throw ne.thrown(new At(\"cannot convert NA to Int\"));case 5:throw ne.thrown(new At(\"cannot convert NM to Int\"))}}static toBool(e){switch(e._hx_index){case 0:return e.v!=0;case 1:return e.v!=0;case 2:return e.v;case 3:return e.v.toLowerCase()==Sc.TRUE_STRING;case 4:throw ne.thrown(new At(\"cannot convert NA to Bool\"));case 5:throw ne.thrown(new At(\"cannot convert NM to Bool\"))}}static isNA(e){return e._hx_index==4}static isNM(e){return e._hx_index==5}static get __name__(){return\"haxpression._Value.Value_Impl_\"}get __class__(){return Sc}},\"Value\");se.TRUE_STRING=\"true\";var fMe=j.$global,Xa=j.global(\"$hxClasses\")[\"haxpression.UnaryOperations\"]=s(class il{static evaluate(e,n){return il.map.inst.get(e).operation(n)}static addOperator(e,n){let i=il.map,a={operation:il.wrapOperation(n)};i.inst.set(e,a)}static hasOperator(e){return il.map.inst.has(e)}static getMaxOperatorLength(){return Cc.reduce(Wf.toArray(Mt.adaptIterator(il.map.inst.keys())),function(e,n){return n.length>e?n.length:e},0)}static wrapOperation(e){return function(n){return se.isNA(n)?se.fromValueType(mt.VNA):se.isNM(n)?se.fromValueType(mt.VNM):e(n)}}static get __name__(){return\"haxpression.UnaryOperations\"}get __class__(){return il}},\"UnaryOperations\");Xa.map=new et,Xa.addOperator(\"-\",function(t){return se.fromFloat(se.toFloat(t)*-1)}),Xa.addOperator(\"+\",function(t){return se.fromFloat(se.toFloat(t))}),Xa.addOperator(\"!\",function(t){return se.fromBool(!se.toBool(t))}),Xa.addOperator(\"~\",function(t){return se.fromInt(~se.toInt(t))});var xMe=j.$global,He=j.global(\"$hxEnums\")[\"haxpression.ExpressionType\"]={__ename__:\"haxpression.ExpressionType\",ELiteral:Object.assign(t=>({_hx_index:0,__enum__:\"haxpression.ExpressionType\",value:t,\"@kind\":\"ELiteral\"}),{_hx_name:\"ELiteral\",__params__:[\"value\"]}),EIdentifier:Object.assign(t=>({_hx_index:1,__enum__:\"haxpression.ExpressionType\",name:t,\"@kind\":\"EIdentifier\"}),{_hx_name:\"EIdentifier\",__params__:[\"name\"]}),EUnary:Object.assign((t,e)=>({_hx_index:2,__enum__:\"haxpression.ExpressionType\",operator_:t,operand:e,\"@kind\":\"EUnary\"}),{_hx_name:\"EUnary\",__params__:[\"operator_\",\"operand\"]}),EBinary:Object.assign((t,e,n)=>({_hx_index:3,__enum__:\"haxpression.ExpressionType\",operator_:t,left:e,right:n,\"@kind\":\"EBinary\"}),{_hx_name:\"EBinary\",__params__:[\"operator_\",\"left\",\"right\"]}),ECall:Object.assign((t,e)=>({_hx_index:4,__enum__:\"haxpression.ExpressionType\",callee:t,arguments:e,\"@kind\":\"ECall\"}),{_hx_name:\"ECall\",__params__:[\"callee\",\"arguments\"]}),EConditional:Object.assign((t,e,n)=>({_hx_index:5,__enum__:\"haxpression.ExpressionType\",test:t,consequent:e,alternate:n,\"@kind\":\"EConditional\"}),{_hx_name:\"EConditional\",__params__:[\"test\",\"consequent\",\"alternate\"]}),EArray:Object.assign(t=>({_hx_index:6,__enum__:\"haxpression.ExpressionType\",items:t,\"@kind\":\"EArray\"}),{_hx_name:\"EArray\",__params__:[\"items\"]}),ECompound:Object.assign(t=>({_hx_index:7,__enum__:\"haxpression.ExpressionType\",items:t,\"@kind\":\"ECompound\"}),{_hx_name:\"ECompound\",__params__:[\"items\"]})};He.__constructs__=[He.ELiteral,He.EIdentifier,He.EUnary,He.EBinary,He.ECall,He.EConditional,He.EArray,He.ECompound];He.__empty_constructs__=[];var EMe=j.$global,oa=j.global(\"$hxClasses\")[\"haxpression.ExpressionTypes\"]=s(class R4{static canEvaluateAll(e){return Cc.all(e,function(n){return bt.canEvaluate(bt.fromExpressionType(n))})}static simplify(e){let n=new Array(e.length),i=0,a=e.length;for(;i<a;){let r=i++;n[r]=bt.toExpressionType(bt.simplify(bt.fromExpressionType(e[r])))}return n}static evaluate(e,n){let i=new Array(e.length),a=0,r=e.length;for(;a<r;){let o=a++;i[o]=bt.evaluate(bt.fromExpressionType(e[o]),n)}return i}static get __name__(){return\"haxpression.ExpressionTypes\"}get __class__(){return R4}},\"ExpressionTypes\");var DMe=j.$global,on=j.global(\"$hxClasses\")[\"haxpression.CallOperations\"]=s(class Aa{static addFunction(e,n,i){let a=Aa.map,r={arity:n,operation:Aa.wrapOperation(e,n,i)};a.inst.set(e,r)}static hasFunction(e){return Aa.map.inst.has(e)}static getFunction(e){if(!Aa.hasFunction(e))throw ne.thrown(new At(\"no function implementation found for name: \"+e));return Aa.map.inst.get(e).operation}static getArity(e){if(!Aa.hasFunction(e))throw ne.thrown(new At(\"no function implementation found for name: \"+e));return Aa.map.inst.get(e).arity}static canEvaluate(e,n){if(!Aa.hasFunction(e))return!1;let i=Aa.getArity(e);return i>=0&&i!=n.length?!1:oa.canEvaluateAll(n)}static evaluate(e,n){return Aa.getFunction(e)(n)}static wrapOperation(e,n,i){return function(a){if(n>=0&&a.length!=n)throw ne.thrown(new At(\"function \"+e+\" expects exactly \"+n+\" argument(s)\"));return i(a)}}static get __name__(){return\"haxpression.CallOperations\"}get __class__(){return Aa}},\"CallOperations\");on.map=new et,on.addFunction(\"abs\",1,function(t){return se.fromFloat(Math.abs(se.toFloat(t[0])))}),on.addFunction(\"acos\",1,function(t){return se.fromFloat(Math.acos(se.toFloat(t[0])))}),on.addFunction(\"asin\",1,function(t){return se.fromFloat(Math.asin(se.toFloat(t[0])))}),on.addFunction(\"atan\",1,function(t){return se.fromFloat(Math.atan(se.toFloat(t[0])))}),on.addFunction(\"atan2\",2,function(t){return se.fromFloat(Math.atan2(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction(\"ceil\",1,function(t){return se.fromInt(Math.ceil(se.toFloat(t[0])))}),on.addFunction(\"cos\",1,function(t){return se.fromFloat(Math.cos(se.toFloat(t[0])))}),on.addFunction(\"exp\",1,function(t){return se.fromFloat(Math.exp(se.toFloat(t[0])))}),on.addFunction(\"fceil\",1,function(t){return se.fromFloat(Math.ceil(se.toFloat(t[0])))}),on.addFunction(\"ffloor\",1,function(t){return se.fromFloat(Math.floor(se.toFloat(t[0])))}),on.addFunction(\"floor\",1,function(t){return se.fromInt(Math.floor(se.toFloat(t[0])))}),on.addFunction(\"fround\",1,function(t){return se.fromFloat(Math.round(se.toFloat(t[0])))}),on.addFunction(\"log\",1,function(t){return se.fromFloat(Math.log(se.toFloat(t[0])))}),on.addFunction(\"max\",2,function(t){return se.fromFloat(Math.max(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction(\"min\",2,function(t){return se.fromFloat(Math.min(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction(\"pow\",2,function(t){return se.fromFloat(Math.pow(se.toFloat(t[0]),se.toFloat(t[1])))}),on.addFunction(\"random\",0,function(t){return se.fromFloat(Math.random())}),on.addFunction(\"rand\",0,function(t){return se.fromFloat(Math.random())}),on.addFunction(\"round\",1,function(t){return se.fromInt(Math.round(se.toFloat(t[0])))}),on.addFunction(\"sin\",1,function(t){return se.fromFloat(Math.sin(se.toFloat(t[0])))}),on.addFunction(\"sqrt\",1,function(t){return se.fromFloat(Math.sqrt(se.toFloat(t[0])))}),on.addFunction(\"tan\",1,function(t){return se.fromFloat(Math.tan(se.toFloat(t[0])))});var UMe=j.$global,Zt=j.global(\"$hxClasses\")[\"haxpression.BinaryOperations\"]=s(class is{static evaluate(e,n,i){return is.map.inst.get(e).operation(n,i)}static addOperator(e,n,i){let a=is.map,r={precedence:n,operation:is.wrapOperation(i)};a.inst.set(e,r)}static hasOperator(e){return is.map.inst.has(e)}static getOperatorPrecedence(e){return is.map.inst.get(e).precedence}static getMaxOperatorLength(){return Cc.reduce(Wf.toArray(Mt.adaptIterator(is.map.inst.keys())),function(e,n){return n.length>e?n.length:e},0)}static wrapOperation(e){return function(n,i){return se.isNA(n)||se.isNA(i)?se.fromValueType(mt.VNA):se.isNM(n)||se.isNM(i)?se.fromValueType(mt.VNM):e(n,i)}}static get __name__(){return\"haxpression.BinaryOperations\"}get __class__(){return is}},\"BinaryOperations\");Zt.map=new et,Zt.addOperator(\"||\",1,function(t,e){return se.fromBool(se.toBool(t)||se.toBool(e))}),Zt.addOperator(\"&&\",2,function(t,e){return se.fromBool(se.toBool(t)&&se.toBool(e))}),Zt.addOperator(\"|\",3,function(t,e){return se.fromInt(se.toInt(t)|se.toInt(e))}),Zt.addOperator(\"^\",4,function(t,e){return se.fromInt(se.toInt(t)^se.toInt(e))}),Zt.addOperator(\"&\",5,function(t,e){return se.fromInt(se.toInt(t)&se.toInt(e))}),Zt.addOperator(\"==\",6,function(t,e){return se.fromBool(se.toFloat(t)==se.toFloat(e))}),Zt.addOperator(\"!=\",6,function(t,e){return se.fromBool(se.toFloat(t)!=se.toFloat(e))}),Zt.addOperator(\"<\",7,function(t,e){return se.fromBool(se.toFloat(t)<se.toFloat(e))}),Zt.addOperator(\">\",7,function(t,e){return se.fromBool(se.toFloat(t)>se.toFloat(e))}),Zt.addOperator(\"<=\",7,function(t,e){return se.fromBool(se.toFloat(t)<=se.toFloat(e))}),Zt.addOperator(\">=\",7,function(t,e){return se.fromBool(se.toFloat(t)>=se.toFloat(e))}),Zt.addOperator(\"<<\",8,function(t,e){return se.fromInt(se.toInt(t)<<se.toInt(e))}),Zt.addOperator(\">>\",8,function(t,e){return se.fromInt(se.toInt(t)>>se.toInt(e))}),Zt.addOperator(\">>>\",8,function(t,e){return se.fromInt(se.toInt(t)>>>se.toInt(e))}),Zt.addOperator(\"+\",9,function(t,e){return se.fromFloat(se.toFloat(t)+se.toFloat(e))}),Zt.addOperator(\"-\",9,function(t,e){return se.fromFloat(se.toFloat(t)-se.toFloat(e))}),Zt.addOperator(\"*\",10,function(t,e){return se.fromFloat(se.toFloat(t)*se.toFloat(e))}),Zt.addOperator(\"/\",10,function(t,e){return se.fromFloat(se.toFloat(t)/se.toFloat(e))}),Zt.addOperator(\"%\",10,function(t,e){return se.fromFloat(se.toFloat(t)%se.toFloat(e))}),Zt.addOperator(\"**\",11,function(t,e){return se.fromFloat(Math.pow(se.toFloat(t),se.toFloat(e)))});var nBe=j.$global,bt=j.global(\"$hxClasses\")[\"haxpression._Expression.Expression\"]=s(class ze{static fromExpressionType(e){return e}static toExpressionType(e){return e}static simplify(e){switch(e._hx_index){case 0:let n=e.value;return ze.fromExpressionType(He.ELiteral(n));case 1:let i=e.name;return ze.fromExpressionType(He.EIdentifier(i));case 2:let a=e.operator_,r=e.operand;return ze.canEvaluate(ze.fromExpressionType(r))?ze.fromExpressionType(He.ELiteral(se.toValueType(Xa.evaluate(a,ze.evaluate(ze.fromExpressionType(r)))))):ze.fromExpressionType(He.EUnary(a,ze.toExpressionType(ze.simplify(ze.fromExpressionType(r)))));case 3:let o=e.operator_,l=e.left,c=e.right;return ze.canEvaluate(ze.fromExpressionType(l))&&ze.canEvaluate(ze.fromExpressionType(c))?ze.fromExpressionType(He.ELiteral(se.toValueType(Zt.evaluate(o,ze.evaluate(ze.fromExpressionType(l)),ze.evaluate(ze.fromExpressionType(c)))))):ze.fromExpressionType(He.EBinary(o,ze.toExpressionType(ze.simplify(ze.fromExpressionType(l))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(c)))));case 4:let d=e.callee,u=e.arguments;return oa.canEvaluateAll(u)?ze.fromExpressionType(He.ELiteral(se.toValueType(on.evaluate(d,oa.evaluate(u))))):ze.fromExpressionType(He.ECall(d,oa.simplify(u)));case 5:let p=e.test,m=e.consequent,f=e.alternate;return ze.canEvaluate(ze.fromExpressionType(p))?se.toBool(ze.evaluate(ze.fromExpressionType(p)))?ze.simplify(ze.fromExpressionType(m)):ze.simplify(ze.fromExpressionType(f)):ze.fromExpressionType(He.EConditional(ze.toExpressionType(ze.simplify(ze.fromExpressionType(p))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(m))),ze.toExpressionType(ze.simplify(ze.fromExpressionType(f)))));case 6:let g=e.items;return ze.fromExpressionType(He.EArray(oa.simplify(g)));case 7:let x=e.items;return ze.fromExpressionType(He.ECompound(oa.simplify(x)))}}static canEvaluate(e){switch(e._hx_index){case 0:let n=e.value;return!0;case 1:let i=e.name;return!1;case 2:let a=e.operator_,r=e.operand;return ze.canEvaluate(ze.fromExpressionType(r));case 3:let o=e.operator_,l=e.left,c=e.right;return ze.canEvaluate(ze.fromExpressionType(l))?ze.canEvaluate(ze.fromExpressionType(c)):!1;case 4:let d=e.callee,u=e.arguments;return on.canEvaluate(d,u);case 5:let p=e.test,m=e.consequent,f=e.alternate;return ze.canEvaluate(ze.fromExpressionType(p))?se.toBool(ze.evaluate(ze.fromExpressionType(p)))?ze.canEvaluate(ze.fromExpressionType(m)):ze.canEvaluate(ze.fromExpressionType(f)):!1;case 6:let g=e.items;return oa.canEvaluateAll(g);case 7:let x=e.items;return oa.canEvaluateAll(x)}}static evaluate(e,n){switch(n==null&&(n=new et),e._hx_index){case 0:let i=e.value;return se.fromValueType(i);case 1:let a=e.name;if(!n.inst.has(a))throw ne.thrown(new At(\"cannot evaluate expression with unset variable: \"+a));return n.inst.get(a);case 2:let r=e.operator_,o=e.operand,l=ze.evaluate(ze.fromExpressionType(o),n);return Xa.evaluate(r,l);case 3:let c=e.operator_,d=e.left,u=e.right,p=ze.evaluate(ze.fromExpressionType(d),n),m=ze.evaluate(ze.fromExpressionType(u),n);return Zt.evaluate(c,p,m);case 4:let f=e.callee,g=e.arguments;return on.evaluate(f,oa.evaluate(g,n));case 5:let x=e.test,_=e.consequent,h=e.alternate;return se.toBool(ze.evaluate(ze.fromExpressionType(x),n))?ze.evaluate(ze.fromExpressionType(_),n):ze.evaluate(ze.fromExpressionType(h),n);case 6:let v=e.items;if(v.length==0)return se.fromValueType(mt.VNA);{let y=oa.evaluate(v,n);return y[y.length-1]}break;case 7:let b=e.items;if(b.length==0)return se.fromValueType(mt.VNA);{let y=oa.evaluate(b,n);return y[y.length-1]}break}}static isCompound(e){let n=ze.toExpressionType(e);if(n._hx_index==7){let i=n.items;return!0}else return!1}static get __name__(){return\"haxpression._Expression.Expression_Impl_\"}get __class__(){return ze}},\"Expression\");var hBe=j.$global,Oc=j.global(\"$hxClasses\")[\"haxpression.Parser\"]=s(class _v extends j.inherits(){[j.new](e){this.inputString=e,this.index=0,this.length=e.length,this.expressions=[]}internalParse(){for(;this.index<this.length;){let e=this.charCodeAt(this.index);if(e==nt.SEMICOLON_CODE||e==nt.COMMA_CODE)this.index++;else{let n=this.gobbleExpression();if(n!=null)this.expressions.push(n);else if(this.index<this.length)throw ne.thrown(new At('unexpected internal parse \"'+this.charAt(this.index)+'\"',this.inputString,this.index))}}if(this.expressions.length==1)return this.expressions[0];{let e=this.expressions,n=new Array(e.length),i=0,a=e.length;for(;i<a;){let r=i++;n[r]=bt.toExpressionType(e[r])}return bt.fromExpressionType(He.ECompound(n))}}charAt(e){return this.inputString.charAt(e)}charCodeAt(e){return at.cca(this.inputString,e)}gobbleSpaces(){let e=this.charCodeAt(this.index);for(;this.index<this.length&&nt.isWhiteSpace(e);)e=this.charCodeAt(++this.index)}gobbleExpression(){let e=this.gobbleBinaryExpression();if(this.gobbleSpaces(),this.charCodeAt(this.index)==nt.QUESTION_MARK_CODE){this.index++;let n=this.gobbleExpression();if(n==null)throw ne.thrown(new At('expected a \"consequent\" expression for ternary conditional expression',this.inputString,this.index));if(this.gobbleSpaces(),this.charCodeAt(this.index)==nt.COLON_CODE){this.index++;let i=this.gobbleExpression();if(i==null)throw ne.thrown(new At('expected an \"alternate\" expression for ternary conditional expression',this.inputString,this.index));return bt.fromExpressionType(He.EConditional(bt.toExpressionType(e),bt.toExpressionType(n),bt.toExpressionType(i)))}}return e}gobbleBinaryOperator(){this.gobbleSpaces();let e=at.substr(this.inputString,this.index,Zt.getMaxOperatorLength()),n=e.length;for(;n>0;){if(Zt.hasOperator(e))return this.index+=n,e;--n,e=at.substr(e,0,n)}return null}gobbleBinaryExpression(){let e,n,i,a,r,o,l,c=this.gobbleToken(),d=this.gobbleBinaryOperator();if(d==null)return c;let u={operator_:d,precedence:Zt.getOperatorPrecedence(d)},p=this.gobbleToken();if(p==null)throw ne.thrown(new At('expected expression after binary operator_: \"'+d+'\"',this.inputString,this.index));let m=[c,u,p];for(;d=this.gobbleBinaryOperator(),!(d==null||(a=Zt.getOperatorPrecedence(d),a==0));){for(u={operator_:d,precedence:a};m.length>2&&a<=m[m.length-2].precedence;){p=m.pop(),d=m.pop().operator_,c=m.pop();let g=He.EBinary(d,bt.toExpressionType(c),bt.toExpressionType(p));m.push(g)}if(n=this.gobbleToken(),n==null)throw ne.thrown(new At('expected expression after binary operator_: \"'+d+'\"',this.inputString,this.index));m.push(u),m.push(n)}let f=m.length-1;for(n=m[f];f>1;)n=bt.fromExpressionType(He.EBinary(m[f-1].operator_,m[f-2],bt.toExpressionType(n))),f-=2;return n}gobbleToken(){this.gobbleSpaces();let e=this.charCodeAt(this.index);if(nt.isDecimalDigit(e)||e==nt.PERIOD_CODE)return this.gobbleNumericLiteral();if(e==nt.SINGLE_QUOTE_CODE||e==nt.DOUBLE_QUOTE_CODE)return this.gobbleStringLiteral();if(nt.isIdentifierStart(e)||e==nt.OPEN_PAREN_CODE)return this.gobbleVariable();if(e==nt.OPEN_BRACKET_CODE)return this.gobbleArray();{let n=at.substr(this.inputString,this.index,Xa.getMaxOperatorLength()),i=n.length;for(;i>0;){if(Xa.hasOperator(n))return this.index+=i,bt.fromExpressionType(He.EUnary(n,bt.toExpressionType(this.gobbleToken())));--i,n=at.substr(n,0,i)}return null}}gobbleNumericLiteral(){let e=\"\";for(;this.index<this.length&&nt.isDecimalDigit(this.charCodeAt(this.index));)e+=this.charAt(this.index++);if(this.charCodeAt(this.index)==nt.PERIOD_CODE)for(e+=this.charAt(this.index++);this.index<this.length&&nt.isDecimalDigit(this.charCodeAt(this.index));)e+=this.charAt(this.index++);let n=this.charAt(this.index);if(n==\"e\"||n==\"E\"){for(e+=this.charAt(this.index++),n=this.charAt(this.index),(n==\"+\"||n==\"-\")&&(e+=this.charAt(this.index++));this.index<this.length&&nt.isDecimalDigit(this.charCodeAt(this.index));)e+=this.charAt(this.index++);if(!nt.isDecimalDigit(this.charCodeAt(this.index-1)))throw ne.thrown(new At('expected exponent in numeric literal: \"'+e+this.charAt(this.index)+'\"',this.inputString,this.index))}if(this.index>=this.length)return bt.fromExpressionType(He.ELiteral(mt.VFloat(parseFloat(e))));let i=this.charCodeAt(this.index);if(nt.isIdentifierStart(i))throw ne.thrown(new At('variable names cannot start with a number: \"'+e+this.charAt(this.index)+'\"',this.inputString,this.index));if(i==nt.PERIOD_CODE)throw ne.thrown(new At('unexpected period in numeric literal: \"'+e+this.charAt(this.index)+'\"',this.inputString,this.index));return bt.fromExpressionType(He.ELiteral(mt.VFloat(parseFloat(e))))}gobbleStringLiteral(){let e=\"\",n=this.charAt(this.index++),i=!1;for(;this.index<this.length;){let a=this.charAt(this.index++);if(a==n){i=!0;break}else if(a==\"\\\\\")switch(a=this.charAt(this.index++),a){case\"n\":e+=`\n`;break;case\"r\":e+=\"\\r\";break;case\"t\":e+=\"\t\";break;case\"v\":e+=\"\\v\";break}else e+=a}if(!i)throw ne.thrown(new At('unclosed quote after: \"'+e+'\"',this.inputString,this.index));return bt.fromExpressionType(He.ELiteral(mt.VString(e)))}gobbleIdentifier(){let e=this.charCodeAt(this.index),n=this.index;if(nt.isIdentifierStart(e))this.index++;else throw ne.thrown(new At(\"unexpected \"+this.charAt(this.index),this.inputString,this.index));for(;this.index<this.length&&(e=this.charCodeAt(this.index),nt.isIdentifierPart(e));)this.index++;let i=this.inputString.substring(n,this.index);switch(i.toLowerCase()){case\"false\":return bt.fromExpressionType(He.ELiteral(mt.VBool(!1)));case\"na\":return bt.fromExpressionType(He.ELiteral(mt.VNA));case\"nm\":return bt.fromExpressionType(He.ELiteral(mt.VNM));case\"null\":return bt.fromExpressionType(He.ELiteral(mt.VNA));case\"true\":return bt.fromExpressionType(He.ELiteral(mt.VBool(!0)));case\"undefined\":return bt.fromExpressionType(He.ELiteral(mt.VNA));default:return bt.fromExpressionType(He.EIdentifier(i))}}gobbleArguments(e){let n=[],i=!1;for(;this.index<this.length;){this.gobbleSpaces();let a=this.charCodeAt(this.index);if(a==e){i=!0,this.index++;break}else if(a==nt.COMMA_CODE)this.index++;else{let r=this.gobbleExpression();if(r==null||bt.isCompound(r))throw ne.thrown(new At(\"expected comma between arguments\",this.inputString,this.index));n.push(r)}}if(!i){let a=String.fromCodePoint(e);throw ne.thrown(new At('expected termination character: \"'+a+'\"',this.inputString,this.index))}return n}gobbleVariable(){let e=this.charCodeAt(this.index),n;if(e==nt.OPEN_PAREN_CODE?n=this.gobbleGroup():n=this.gobbleIdentifier(),this.gobbleSpaces(),this.index<this.length)for(e=this.charCodeAt(this.index);this.index<this.length&&(e==nt.PERIOD_CODE||e==nt.OPEN_BRACKET_CODE||e==nt.OPEN_PAREN_CODE);){if(this.index++,e==nt.PERIOD_CODE)throw ne.thrown(new At('member access expressions like \"a.b\" are not supported',this.inputString,this.index));if(e==nt.OPEN_BRACKET_CODE)throw ne.thrown(new At('member access expressions like \"a[\"b\"]\" are not supported',this.inputString,this.index));if(e==nt.OPEN_PAREN_CODE){let i,a=bt.toExpressionType(n);if(a._hx_index==1)i=a.name;else throw ne.thrown(new At(\"expected function name identifier for function call expression\",this.inputString,this.index));let r=this.gobbleArguments(nt.CLOSE_PAREN_CODE),o=new Array(r.length),l=0,c=r.length;for(;l<c;){let u=l++;o[u]=bt.toExpressionType(r[u])}let d=o;n=bt.fromExpressionType(He.ECall(i,d))}this.gobbleSpaces(),e=this.charCodeAt(this.index)}return n}gobbleGroup(){this.index++;let e=this.gobbleExpression();if(this.charCodeAt(this.index)==nt.CLOSE_PAREN_CODE)return this.index++,e;throw ne.thrown(new At(\"unclosed (\",this.inputString,this.index))}gobbleArray(){this.index++;let e=this.gobbleArguments(nt.CLOSE_BRACKET_CODE),n=new Array(e.length),i=0,a=e.length;for(;i<a;){let o=i++;n[o]=bt.toExpressionType(e[o])}let r=n;return bt.fromExpressionType(He.EArray(r))}static parse(e){return new _v(e).internalParse()}static get __name__(){return\"haxpression.Parser\"}get __class__(){return _v}},\"Parser\");Oc.prototype.inputString=null;Oc.prototype.index=null;Oc.prototype.length=null;Oc.prototype.expressions=null;var CBe=j.$global,En=j.global(\"$hxEnums\")[\"mcl.FlattenedType\"]={__ename__:\"mcl.FlattenedType\",FLiteral:Object.assign(t=>({_hx_index:0,__enum__:\"mcl.FlattenedType\",value:t,\"@kind\":\"FLiteral\"}),{_hx_name:\"FLiteral\",__params__:[\"value\"]}),FIdentifier:Object.assign(t=>({_hx_index:1,__enum__:\"mcl.FlattenedType\",name:t,\"@kind\":\"FIdentifier\"}),{_hx_name:\"FIdentifier\",__params__:[\"name\"]}),FUnary:Object.assign((t,e)=>({_hx_index:2,__enum__:\"mcl.FlattenedType\",operant:t,operand:e,\"@kind\":\"FUnary\"}),{_hx_name:\"FUnary\",__params__:[\"operant\",\"operand\"]}),FBinary:Object.assign((t,e,n)=>({_hx_index:3,__enum__:\"mcl.FlattenedType\",operant:t,left:e,right:n,\"@kind\":\"FBinary\"}),{_hx_name:\"FBinary\",__params__:[\"operant\",\"left\",\"right\"]}),FAdd:Object.assign(t=>({_hx_index:4,__enum__:\"mcl.FlattenedType\",item:t,\"@kind\":\"FAdd\"}),{_hx_name:\"FAdd\",__params__:[\"item\"]}),FMul:Object.assign(t=>({_hx_index:5,__enum__:\"mcl.FlattenedType\",item:t,\"@kind\":\"FMul\"}),{_hx_name:\"FMul\",__params__:[\"item\"]}),FCall:Object.assign((t,e)=>({_hx_index:6,__enum__:\"mcl.FlattenedType\",callee:t,args:e,\"@kind\":\"FCall\"}),{_hx_name:\"FCall\",__params__:[\"callee\",\"args\"]}),FConditional:Object.assign((t,e,n)=>({_hx_index:7,__enum__:\"mcl.FlattenedType\",test:t,consequent:e,alternate:n,\"@kind\":\"FConditional\"}),{_hx_name:\"FConditional\",__params__:[\"test\",\"consequent\",\"alternate\"]}),FArray:Object.assign(t=>({_hx_index:8,__enum__:\"mcl.FlattenedType\",items:t,\"@kind\":\"FArray\"}),{_hx_name:\"FArray\",__params__:[\"items\"]}),FCompound:Object.assign(t=>({_hx_index:9,__enum__:\"mcl.FlattenedType\",items:t,\"@kind\":\"FCompound\"}),{_hx_name:\"FCompound\",__params__:[\"items\"]})};En.__constructs__=[En.FLiteral,En.FIdentifier,En.FUnary,En.FBinary,En.FAdd,En.FMul,En.FCall,En.FConditional,En.FArray,En.FCompound];En.__empty_constructs__=[];var M4=j.global(\"$hxClasses\")[\"mcl.McMath\"]=s(class gt{static flatten(e){switch(e._hx_index){case 0:let n=e.value;return En.FLiteral(n);case 1:let i=e.name;return En.FIdentifier(i);case 2:let a=e.operator_,r=e.operand;return En.FUnary(a,gt.flatten(r));case 3:let o=e.operator_,l=e.left,c=e.right;if(o==\"+\"){let B=new Array,q=0,G=null;return G=s(function(W){switch(W._hx_index){case 0:let ee=W.value;switch(ee._hx_index){case 0:let Z=ee.v;Z==Math.floor(Z)?q+=Math.floor(Z):B.push(gt.flatten(W));break;case 1:let me=ee.v;q+=me;break;default:B.push(gt.flatten(W))}break;case 3:if(W.operator_==\"+\"){let Z=W.left,me=W.right;G(Z),G(me)}else B.push(gt.flatten(W));break;default:B.push(gt.flatten(W))}},\"flattenAdd\"),G(e),q!=0&&B.push(En.FLiteral(mt.VInt(q))),En.FAdd(B)}if(o==\"*\"){let B=new Array,q=1,G=null;return G=s(function(W){switch(W._hx_index){case 0:let ee=W.value;switch(ee._hx_index){case 0:let Z=ee.v;Z==Math.floor(Z)?q*=Math.floor(Z):B.push(gt.flatten(W));break;case 1:let me=ee.v;q*=me;break;default:B.push(gt.flatten(W))}break;case 3:if(W.operator_==\"*\"){let Z=W.left,me=W.right;G(Z),G(me)}else B.push(gt.flatten(W));break;default:B.push(gt.flatten(W))}},\"flattenMul\"),G(e),q!=1&&B.push(En.FLiteral(mt.VInt(q))),En.FMul(B)}return En.FBinary(o,gt.flatten(l),gt.flatten(c));case 4:let d=e.callee,u=e.arguments,p=gt.flatten,m=new Array(u.length),f=0,g=u.length;for(;f<g;){let B=f++;m[B]=p(u[B])}return En.FCall(d,m);case 5:let x=e.test,_=e.consequent,h=e.alternate;return En.FConditional(gt.flatten(x),gt.flatten(_),gt.flatten(h));case 6:let v=e.items,b=gt.flatten,y=new Array(v.length),w=0,S=v.length;for(;w<S;){let B=w++;y[B]=b(v[B])}return En.FArray(y);case 7:let F=e.items,N=gt.flatten,k=new Array(F.length),R=0,D=F.length;for(;R<D;){let B=R++;k[B]=N(F[B])}return En.FCompound(k)}}static organize(e){switch(e._hx_index){case 0:let n=e.value;switch(n._hx_index){case 0:let B=n.v;return He.ELiteral(mt.VFloat(B));case 1:let q=n.v;return He.ELiteral(mt.VInt(q));case 2:let G=n.v;return He.ELiteral(mt.VBool(G));case 3:let W=n.v;return He.ELiteral(mt.VString(W));default:throw ne.thrown(\"unsupported literal\")}break;case 1:let i=e.name;return He.EIdentifier(i);case 2:let a=e.operator_,r=e.operand;return He.EUnary(a,gt.organize(r));case 3:let o=e.operator_,l=e.left,c=e.right;if(l._hx_index==0){let B=l.value,q=o,G=c,W;switch(B._hx_index){case 0:let ee=B.v;if(ee==Math.floor(ee))W=Math.floor(ee);else return He.EBinary(q,He.ELiteral(B),gt.organize(G));break;case 1:W=B.v;break;default:return He.EBinary(q,He.ELiteral(B),gt.organize(G))}return q==\"+\"?He.EBinary(q,gt.organize(G),He.ELiteral(mt.VInt(W))):q==\"-\"?He.EBinary(\"+\",gt.organize(G),He.ELiteral(mt.VInt(-W))):q==\"*\"?He.EBinary(q,gt.organize(G),He.ELiteral(mt.VInt(W))):He.EBinary(q,He.ELiteral(B),gt.organize(G))}else if(o==\"-\")if(c._hx_index==0){let B=l,q=c.value,G;switch(q._hx_index){case 0:let W=q.v;if(W==Math.floor(W))G=Math.floor(W);else return He.EBinary(\"-\",gt.organize(B),He.ELiteral(q));break;case 1:G=q.v;break;default:return He.EBinary(\"-\",gt.organize(B),He.ELiteral(q))}return He.EBinary(\"+\",gt.organize(B),He.ELiteral(mt.VInt(-G)))}else{let B=l,q=o,G=c;return He.EBinary(q,gt.organize(B),gt.organize(G))}else{let B=l,q=o,G=c;return He.EBinary(q,gt.organize(B),gt.organize(G))}break;case 4:let d=e.callee,u=e.arguments,p=gt.organize,m=new Array(u.length),f=0,g=u.length;for(;f<g;){let B=f++;m[B]=p(u[B])}return He.ECall(d,m);case 5:let x=e.test,_=e.consequent,h=e.alternate;return He.EConditional(gt.organize(x),gt.organize(_),gt.organize(h));case 6:let v=e.items,b=gt.organize,y=new Array(v.length),w=0,S=v.length;for(;w<S;){let B=w++;y[B]=b(v[B])}return He.EArray(y);case 7:let F=e.items,N=gt.organize,k=new Array(F.length),R=0,D=F.length;for(;R<D;){let B=R++;k[B]=N(F[B])}return He.ECompound(k)}}static compile(e,n){let i=0,a=e.length;for(;i<a;){let w=i++;if(e.charAt(w)==\"@\"&&e.charAt(w+1)!=\"s\"&&e.charAt(w+2)!=\"[\")throw ne.thrown(\"only unrestricted @s selectors are allowed in equations to avoid unexpected behavior.\")}let r=s(function(){let w=0;for(;e.charAt(w)==\" \"&&w<e.length;)++w;e=e.substring(w)},\"skip\"),o=s(function(){let w=\"\",S=0;for(;e.charAt(S)!=\" \"&&S<e.length;)w+=e.charAt(S),++S;return e=e.substring(S),w},\"collect\"),l=o();r(),l+=\" \"+o(),r();let c=o();r();let d=e,u=new et,p=0,m=s(function(w){let S=w.charCodeAt(0);return S>=97&&S<=122||S>=65&&S<=90||S>=48&&S<=57||S==46||S==95||S==36||S==35?!0:S==64},\"isAlphaNumeric\"),f=0,g=s(function(){return f+=1,\"var\"+f},\"getNextVarName\"),x=\"\";for(;p<d.length;){let w=d.charAt(p),S=at.cca(w,0);if(S==64||S>=97&&S<=122||S>=65&&S<=90){let F=\"\";for(;p<d.length&&m(d.charAt(p));)F+=d.charAt(p),++p;for(++p,F+=\" \";p<d.length&&m(d.charAt(p));)F+=d.charAt(p),++p;if(!u.inst.has(F)){let N=g();u.inst.set(F,N)}x+=u.inst.get(F)}else x+=w,++p}let _=gt.flatten(gt.organize(bt.toExpressionType(bt.simplify(Oc.parse(x))))),h=new et,v=u,b=v,y=v.keys();for(;y.hasNext();){let w=y.next(),S=b.get(w),N=w,k=S;h.inst.set(k,N)}return gt.render(_,l,h,c,n)}static render(e,n,i,a,r){let o=[],l=0,c=new Map,d=r.compiler.config.eqConstScoreboardName,u=r.compiler.config.eqVarScoreboardName,p=new Map,m=s(function(B,q){if(q==null&&(q=!1),q){let G=p.get(B);--G,G<=0?p.delete(B):p.set(B,G)}else{let G=p.get(B);G==null?G=1:++G,p.set(B,G)}},\"c\"),f=i,g=f,x=f.keys();for(;x.hasNext();){let B=x.next(),q=g.get(B),W=B,ee=q;c.set(ee,!0)}let _=s(function(B){return!(c.has(B)||B.endsWith(\" \"+d))},\"isSafeToModify\"),h=s(function(B,q){if(q!=null&&_(q))return o.push(\"scoreboard players operation \"+q+\" = \"+B),q;l+=1;let G=\"tmp\"+(l-1)+\" \"+u;return B.endsWith(\" \"+d)?(m(Ge.parseInt(B.substring(0,B.length-6)),!0),o.push(\"scoreboard players set \"+G+\" \"+B.substring(0,B.length-6))):o.push(\"scoreboard players operation \"+G+\" = \"+B),G},\"mkTemp\"),v=s(function(B,q){return _(B)?B:h(B,q)},\"makeSafe\"),b=s(function(B){if(B._hx_index==0){let q=B.value;return!0}else return!1},\"isConstant\"),y=s(function(B){if(B._hx_index==1){let q=B.name;return!0}else return!1},\"isVariable\"),w=s(function(B){if(B._hx_index==1){let q=B.name;return i.inst.get(q)}else throw ne.thrown(\"not a variable\")},\"getVariable\"),S=s(function(B){if(B._hx_index==0){let q=B.value;switch(q._hx_index){case 0:return q.v;case 1:return q.v;default:throw ne.thrown(\"unsupported literal\")}}throw ne.thrown(\"not a constant\")},\"getValue\"),F=s(function(B){let q=Math.floor(S(B));return m(q),\"\"+q+\" \"+d},\"getConstant\"),N=null;if(N=s(function(B,q){switch(B._hx_index){case 0:let G=B.value;switch(G._hx_index){case 0:let Ft=G.v;return m(Math.floor(Ft)),\"\"+Math.floor(Ft)+\" \"+d;break;case 1:let $t=G.v;return m($t),\"\"+$t+\" \"+d;break;default:throw ne.thrown(\"unsupported literal\")}break;case 1:let W=B.name;throw ne.thrown(\"NO NO NO NO NO2\");case 2:let ee=B.operant,Z=B.operand,me=y(Z)?v(w(Z),q):b(Z)?v(F(Z),q):N(Z,q);if(ee==\"-\"){let Ft=v(me);return m(-1),o.push(\"scoreboard players operation \"+Ft+\" *= -1 \"+d),Ft}return me;case 3:let X=B.operant,Q=B.left,he=B.right,Ie=y(Q)?v(w(Q),q):b(Q)?v(F(Q),q):N(Q,q),le=y(he)?w(he):b(he)?F(he):N(he,null);return o.push(\"scoreboard players operation \"+Ie+\" \"+X+\"= \"+le),Ie;break;case 4:let ge=B.item,V=y(ge[0])?v(w(ge[0]),q):b(ge[0])?v(F(ge[0]),q):N(ge[0],q),H=1,re=ge.length;for(;H<re;){let Ft=H++;if(y(ge[Ft]))o.push(\"scoreboard players operation \"+V+\" += \"+w(ge[Ft]));else if(b(ge[Ft])){let $t=S(ge[Ft]);$t>0?o.push(\"scoreboard players add \"+V+\" \"+$t):$t<0&&o.push(\"scoreboard players remove \"+V+\" \"+-$t)}else{let $t=N(ge[Ft],null);o.push(\"scoreboard players operation \"+V+\" += \"+$t)}}return V;case 5:let xe=B.item,fe=y(xe[0])?v(w(xe[0]),q):b(xe[0])?v(F(xe[0]),q):N(xe[0],q),te=1,Y=xe.length;for(;te<Y;){let Ft=te++,$t=y(xe[Ft])?w(xe[Ft]):b(xe[Ft])?F(xe[Ft]):N(xe[Ft],null);o.push(\"scoreboard players operation \"+fe+\" *= \"+$t)}return fe;case 6:let we=B.callee,Le=B.args;throw ne.thrown(\"unsupported call\");case 7:let Tt=B.test,tn=B.consequent,kn=B.alternate;throw ne.thrown(\"unsupported conditional\");case 8:let Rn=B.items;throw ne.thrown(\"unsupported array\");case 9:let ii=B.items;throw ne.thrown(\"unsupported compound\")}},\"renderNode\"),b(e)&&a==\"=\")o.push(\"scoreboard players set \"+n+\" \"+S(e));else if(y(e))o.push(\"scoreboard players operation \"+n+\" \"+a+\" \"+w(e));else{let B=N(e,n);n!=B&&o.push(\"scoreboard players operation \"+n+\" \"+a+\" \"+B)}let k=o.join(`\n`),R=[],D=Mt.adaptIterator(p.keys());for(;D.hasNext();){let B=D.next();R.push(B)}return{commands:k,constants:R}}static get __name__(){return\"mcl.McMath\"}get __class__(){return gt}},\"McMath\");var DBe=j.$global,as=j.global(\"$hxClasses\")[\"haxe.iterators.ArrayIterator\"]=s(class B4 extends j.inherits(){[j.new](e){this.current=0,this.array=e}hasNext(){return this.current<this.array.length}next(){return this.array[this.current++]}static get __name__(){return\"haxe.iterators.ArrayIterator\"}get __class__(){return B4}},\"ArrayIterator\");as.prototype.array=null;as.prototype.current=null;var PBe=j.$global,Ic=j.global(\"$hxClasses\")[\"haxe.ds.ObjectMap\"]=s(class P4 extends j.inherits(Mt){[j.new](){super[j.new]()}static get __name__(){return\"haxe.ds.ObjectMap\"}static get __interfaces__(){return[nl]}static get __super__(){return Mt}get __class__(){return P4}},\"ObjectMap\");var UBe=j.$global,sn=j.global(\"$hxClasses\").Reflect=s(class L4{static field(e,n){try{return e[n]}catch{return null}}static getProperty(e,n){let i;if(e==null)return null;{let a;return e.__properties__?(i=e.__properties__[\"get_\"+n],a=i):a=!1,a?e[i]():e[n]}}static fields(e){let n=[];if(e!=null){let a=Object.prototype.hasOwnProperty;for(var i in e)i!=\"__id__\"&&i!=\"hx__closures__\"&&a.call(e,i)&&n.push(i)}return n}static isFunction(e){return typeof e==\"function\"?!(e.__name__||e.__ename__):!1}static isObject(e){if(e==null)return!1;let n=typeof e;return n==\"string\"||n==\"object\"&&e.__enum__==null?!0:n==\"function\"?(e.__name__||e.__ename__)!=null:!1}static get __name__(){return\"Reflect\"}get __class__(){return L4}},\"Reflect\");var YBe=j.$global,ft=j.global(\"$hxEnums\").ValueType={__ename__:\"ValueType\",TNull:{_hx_name:\"TNull\",_hx_index:0,__enum__:\"ValueType\",\"@kind\":\"TNull\"},TInt:{_hx_name:\"TInt\",_hx_index:1,__enum__:\"ValueType\",\"@kind\":\"TInt\"},TFloat:{_hx_name:\"TFloat\",_hx_index:2,__enum__:\"ValueType\",\"@kind\":\"TFloat\"},TBool:{_hx_name:\"TBool\",_hx_index:3,__enum__:\"ValueType\",\"@kind\":\"TBool\"},TObject:{_hx_name:\"TObject\",_hx_index:4,__enum__:\"ValueType\",\"@kind\":\"TObject\"},TFunction:{_hx_name:\"TFunction\",_hx_index:5,__enum__:\"ValueType\",\"@kind\":\"TFunction\"},TClass:Object.assign(t=>({_hx_index:6,__enum__:\"ValueType\",c:t,\"@kind\":\"TClass\"}),{_hx_name:\"TClass\",__params__:[\"c\"]}),TEnum:Object.assign(t=>({_hx_index:7,__enum__:\"ValueType\",e:t,\"@kind\":\"TEnum\"}),{_hx_name:\"TEnum\",__params__:[\"e\"]}),TUnknown:{_hx_name:\"TUnknown\",_hx_index:8,__enum__:\"ValueType\",\"@kind\":\"TUnknown\"}};ft.__constructs__=[ft.TNull,ft.TInt,ft.TFloat,ft.TBool,ft.TObject,ft.TFunction,ft.TClass,ft.TEnum,ft.TUnknown];ft.__empty_constructs__=[ft.TNull,ft.TInt,ft.TFloat,ft.TBool,ft.TObject,ft.TFunction,ft.TUnknown];var Li=j.global(\"$hxClasses\").Type=s(class xv{static createInstance(e,n){let i=Function.prototype.bind.apply(e,[null].concat(n));return new i}static createEnum(e,n,i){let a=sn.field(e,n);if(a==null)throw ne.thrown(\"No such constructor \"+n);if(sn.isFunction(a)){if(i==null)throw ne.thrown(\"Constructor \"+n+\" need parameters\");return a.apply(e,i)}if(i!=null&&i.length!=0)throw ne.thrown(\"Constructor \"+n+\" does not need parameters\");return a}static typeof(e){switch(typeof e){case\"boolean\":return ft.TBool;case\"function\":return e.__name__||e.__ename__?ft.TObject:ft.TFunction;case\"number\":return Math.ceil(e)==e%2147483648?ft.TInt:ft.TFloat;case\"object\":if(e==null)return ft.TNull;let n=e.__enum__;if(n!=null)return ft.TEnum(j.global(\"$hxEnums\")[n]);let i=Pr.getClass(e);return i!=null?ft.TClass(i):ft.TObject;case\"string\":return ft.TClass(String);case\"undefined\":return ft.TNull;default:return ft.TUnknown}}static enumEq(e,n){if(e==n)return!0;try{let i=e.__enum__;if(i==null||i!=n.__enum__||e._hx_index!=n._hx_index)return!1;let r=j.global(\"$hxEnums\")[i].__constructs__[e._hx_index].__params__,o=0;for(;o<r.length;){let l=r[o];if(++o,!xv.enumEq(e[l],n[l]))return!1}}catch{return!1}return!0}static get __name__(){return\"Type\"}get __class__(){return xv}},\"Type\");var rPe=j.$global,Bd=j.global(\"$hxClasses\")[\"mcl.McIntIterator\"]=s(class V4 extends j.inherits(){[j.new](e,n){this.min=e,this.max=n,this.current=e,this.offset=e<n?1:-1}hasNext(){return this.offset==1?this.current<=this.max:this.current>=this.max}next(){let e=this.current;if(!this.hasNext())throw ne.thrown(\"No such element\");return this.current+=this.offset,e}static get __name__(){return\"mcl.McIntIterator\"}get __class__(){return V4}},\"McIntIterator\");Bd.prototype.min=null;Bd.prototype.max=null;Bd.prototype.current=null;Bd.prototype.offset=null;var Pd=j.global(\"$hxClasses\")[\"mcl.McFloatIterator\"]=s(class z4 extends j.inherits(){[j.new](e,n,i){if(this.min=e,this.max=n,this.current=e,this.offset=i,i<0&&e<n)throw ne.thrown(\"Invalid step for range\");if(i>0&&e>n)throw ne.thrown(\"Invalid step for range\")}hasNext(){return this.offset>0?this.current<=this.max:this.current>=this.max}next(){let e=this.current;if(!this.hasNext())throw ne.thrown(\"No such element\");return this.current+=this.offset,e}static get __name__(){return\"mcl.McFloatIterator\"}get __class__(){return z4}},\"McFloatIterator\");Pd.prototype.min=null;Pd.prototype.max=null;Pd.prototype.current=null;Pd.prototype.offset=null;var rs=j.global(\"$hxClasses\")[\"mcl.Globals\"]=s(class Dc{static set(e,n){Dc.map.inst.set(e,n)}static get(e){return Dc.map.inst.get(e)}static has(e){return Dc.map.inst.has(e)}static delete(e){return Dc.map.inst.delete(e)}static get __name__(){return\"mcl.Globals\"}get __class__(){return Dc}},\"Globals\");rs.loopVariants=function(t){var e;let n=new Ic;return n.inst.set([ft.TInt,ft.TInt],function(i){let a=i[0],r=i[1];return new Bd(a,r)}),n.inst.set([ft.TFloat,ft.TFloat,ft.TFloat],function(i){let a=i[0],r=i[1],o=i[2];return new Pd(a,r,o)}),n.inst.set([ft.TClass(Array)],function(i){return new as(i[0])}),n.inst.set([ft.TObject],function(i){return new as(Object.entries(i[0]))}),n.inst.set([ft.TFunction],function(i){let a=i[0];return new as(Array.from(a()))}),e=n,e}(void 0);rs.map=function(t){var e;let n=new et;return n.inst.set(\"REPEAT\",function(...i){let a=i.length,r=rs.loopVariants,o=r,l=r.keys();for(;l.hasNext();){let m=l.next(),f=o.get(m),x=m,_=f;if(x.length==a){let h=!1,v=0,b=a;for(;v<b;){let y=v++,w=Li.typeof(i[y]);if(!(Li.enumEq(x[y],w)||x[y]==ft.TFloat&&w==ft.TInt)){h=!0;break}}if(!h)return _(i.slice())}}let c=i.slice(),d=new Array(c.length),u=0,p=c.length;for(;u<p;){let m=u++;d[m]=Ge.string(Li.typeof(c[m]))}throw ne.thrown(\"Invalid arguments for REPEAT (\"+d.join(\", \")+\")\")}),e=n,e}(void 0);var dPe=j.$global,Fc=j.global(\"$hxClasses\")[\"haxe.ds.IntMap\"]=s(class U4 extends j.inherits(Mt){[j.new](){super[j.new]()}static get __name__(){return\"haxe.ds.IntMap\"}static get __interfaces__(){return[nl]}static get __super__(){return Mt}get __class__(){return U4}},\"IntMap\");var gPe=j.$global,Yf=j.global(\"$hxClasses\")[\"mcl.FeatureFlags\"]=s(class Kf extends j.inherits(){[j.new](){this.useFolderRenames48=!1}apply(e,n){let i=[],a=Kf.flags,r=a,o=a.keys();for(;o.hasNext();){let d=o.next(),u=r.get(d),m=d,f=u;i.push(m)}let l=i;l.sort(function(d,u){return d-u});let c=0;for(;c<l.length;){let d=l[c];if(++c,e<d)return;let u=Kf.flags.inst.get(d);u.useFolderRenames48!=null&&(this.useFolderRenames48=u.useFolderRenames48)}n!=null&&n.useFolderRenames48!=null&&(this.useFolderRenames48=n.useFolderRenames48),Object.freeze(this)}static get __name__(){return\"mcl.FeatureFlags\"}get __class__(){return Kf}},\"FeatureFlags\");Yf.prototype.useFolderRenames48=null;Yf.flags=function(t){var e;let n=new Fc;return n.inst.set(48,{useFolderRenames48:!0}),n.inst.set(0,{useFolderRenames43:!1,useFolderRenames48:!1}),e=n,e}(void 0);var wC=wi(yC());var LPe=j.$global,$n=j.global(\"$hxClasses\")[\"mcb.Logger\"]=s(class Za{static log(e){if(Za.enabled){let n=Za.prefix+Za.chalk.white(e);process.stdout.write(Ge.string(n)),process.stdout.write(`\n`)}}static error(e){if(Za.enabled){let n=Za.prefix+Za.chalk.redBright(e);process.stdout.write(Ge.string(n)),process.stdout.write(`\n`)}}static warn(e){if(Za.enabled){let n=Za.prefix+Za.chalk.yellow(e);process.stdout.write(Ge.string(n)),process.stdout.write(`\n`)}}static get __name__(){return\"mcb.Logger\"}get __class__(){return Za}},\"Logger\");$n.enabled=!0;$n.chalk=wC.default;$n.prefix=$n.chalk.gray(\"[\")+$n.chalk.green(\"MCB\")+$n.chalk.gray(\"] \");var IC=wi(Ee(\"fs\"));var EC=wi(Ee(\"path\"));var Vi=wi(Ee(\"fs\"));var HPe=j.$global,xn=j.global(\"$hxClasses\")[\"sys.FileSystem\"]=s(class Pc{static exists(e){try{return Vi.accessSync(e),!0}catch{return!1}}static isDirectory(e){try{return Vi.statSync(e).isDirectory()}catch{return!1}}static createDirectory(e){try{Vi.mkdirSync(e)}catch(n){let i=ne.caught(n).unwrap();if(i.code==\"ENOENT\")Pc.createDirectory(EC.dirname(e)),Vi.mkdirSync(e);else{let a;try{a=Vi.statSync(e)}catch{throw i}if(!a.isDirectory())throw i}}}static deleteDirectory(e){if(Pc.exists(e)){let n=0,i=Vi.readdirSync(e);for(;n<i.length;){let a=i[n];++n;let r=e+\"/\"+a;Pc.isDirectory(r)?Pc.deleteDirectory(r):Vi.unlinkSync(r)}Vi.rmdirSync(e)}}static get __name__(){return\"sys.FileSystem\"}get __class__(){return Pc}},\"FileSystem\");var KPe=j.$global,Qa=j.global(\"$hxEnums\")[\"haxe.io.Error\"]={__ename__:\"haxe.io.Error\",Blocked:{_hx_name:\"Blocked\",_hx_index:0,__enum__:\"haxe.io.Error\",\"@kind\":\"Blocked\"},Overflow:{_hx_name:\"Overflow\",_hx_index:1,__enum__:\"haxe.io.Error\",\"@kind\":\"Overflow\"},OutsideBounds:{_hx_name:\"OutsideBounds\",_hx_index:2,__enum__:\"haxe.io.Error\",\"@kind\":\"OutsideBounds\"},Custom:Object.assign(t=>({_hx_index:3,__enum__:\"haxe.io.Error\",e:t,\"@kind\":\"Custom\"}),{_hx_name:\"Custom\",__params__:[\"e\"]})};Qa.__constructs__=[Qa.Blocked,Qa.Overflow,Qa.OutsideBounds,Qa.Custom];Qa.__empty_constructs__=[Qa.Blocked,Qa.Overflow,Qa.OutsideBounds];var ZPe=j.$global,$a=j.global(\"$hxEnums\")[\"haxe.io.Encoding\"]={__ename__:\"haxe.io.Encoding\",UTF8:{_hx_name:\"UTF8\",_hx_index:0,__enum__:\"haxe.io.Encoding\",\"@kind\":\"UTF8\"},RawNative:{_hx_name:\"RawNative\",_hx_index:1,__enum__:\"haxe.io.Encoding\",\"@kind\":\"RawNative\"}};$a.__constructs__=[$a.UTF8,$a.RawNative];$a.__empty_constructs__=[$a.UTF8,$a.RawNative];var iLe=j.$global,Oi=j.global(\"$hxClasses\")[\"haxe.io.Bytes\"]=s(class zd extends j.inherits(){[j.new](e){this.length=e.byteLength,this.b=new Uint8Array(e),this.b.bufferValue=e,e.hxBytes=this,e.bytes=this.b}getString(e,n,i){if(e<0||n<0||e+n>this.length)throw ne.thrown(Qa.OutsideBounds);i==null&&(i=$a.UTF8);let a=\"\",r=this.b,o=e,l=e+n;switch(i._hx_index){case 0:let c=e>0;for(;o<l;){let d=r[o++];if(d<128){if(d==0)break;a+=String.fromCodePoint(d)}else if(d<224){let u=(d&63)<<6|r[o++]&127;a+=String.fromCodePoint(u)}else if(d<240){let u=r[o++],p=(d&31)<<12|(u&127)<<6|r[o++]&127;a+=String.fromCodePoint(p)}else{let u=r[o++],p=r[o++],m=(d&15)<<18|(u&127)<<12|(p&127)<<6|r[o++]&127;a+=String.fromCodePoint(m)}}break;case 1:for(;o<l;){let d=r[o++]|r[o++]<<8;a+=String.fromCodePoint(d)}break}return a}toString(){return this.getString(0,this.length)}static ofString(e,n){if(n==$a.RawNative){let r=new Uint8Array(e.length<<1),o=0,l=e.length;for(;o<l;){let c=o++,d=e.charCodeAt(c);r[c<<1]=d&255,r[c<<1|1]=d>>8}return new zd(r.buffer)}let i=new Array,a=0;for(;a<e.length;){let r=e.charCodeAt(a++);55296<=r&&r<=56319&&(r=r-55232<<10|e.charCodeAt(a++)&1023),r<=127?i.push(r):r<=2047?(i.push(192|r>>6),i.push(128|r&63)):r<=65535?(i.push(224|r>>12),i.push(128|r>>6&63),i.push(128|r&63)):(i.push(240|r>>18),i.push(128|r>>12&63),i.push(128|r>>6&63),i.push(128|r&63))}return new zd(new Uint8Array(i).buffer)}static ofData(e){let n=e.hxBytes;return n??new zd(e)}static get __name__(){return\"haxe.io.Bytes\"}get __class__(){return zd}},\"Bytes\");Oi.prototype.length=null;Oi.prototype.b=null;var lLe=j.$global,kC=j.global(\"$hxClasses\")[\"js.node.buffer._Buffer.Helper\"]=s(class jC{static bytesOfBuffer(e){let n=Object.create(Oi.prototype);return n.length=e.byteLength,n.b=e,e.bufferValue=e,e.hxBytes=n,e.bytes=e,n}static get __name__(){return\"js.node.buffer._Buffer.Helper\"}get __class__(){return jC}},\"Helper\");var fLe=j.$global,Cv=j.global(\"$hxClasses\")[\"haxe.crypto.Sha1\"]=s(class ih extends j.inherits(){[j.new](){}doEncode(e){let n=new Array,i=1732584193,a=-271733879,r=-1732584194,o=271733878,l=-1009589776,c=0;for(;c<e.length;){let d=i,u=a,p=r,m=o,f=l,g=0;for(;g<80;){if(g<16)n[g]=e[c+g];else{let _=n[g-3]^n[g-8]^n[g-14]^n[g-16];n[g]=_<<1|_>>>31}let x=(i<<5|i>>>27)+this.ft(g,a,r,o)+l+n[g]+this.kt(g);l=o,o=r,r=a<<30|a>>>2,a=i,i=x,++g}i+=d,a+=u,r+=p,o+=m,l+=f,c+=16}return[i,a,r,o,l]}ft(e,n,i,a){return e<20?n&i|~n&a:e<40?n^i^a:e<60?n&i|n&a|i&a:n^i^a}kt(e){return e<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514}hex(e){let n=\"\",i=0;for(;i<e.length;){let a=e[i];++i,n+=Et.hex(a,8)}return n.toLowerCase()}static encode(e){let n=new ih,i=n.doEncode(ih.str2blks(e));return n.hex(i)}static str2blks(e){let n=Oi.ofString(e),i=(n.length+8>>6)+1,a=new Array,r=0,o=i*16;for(;r<o;){let p=r++;a[p]=0}let l=0,c=n.length;for(;l<c;){let p=l++,m=p>>2;a[m]|=n.b[p]<<24-((p&3)<<3)}let d=n.length,u=d>>2;return a[u]|=128<<24-((d&3)<<3),a[i*16-1]=n.length*8,a}static get __name__(){return\"haxe.crypto.Sha1\"}get __class__(){return ih}},\"Sha1\");var bLe=j.$global,Ud=j.global(\"$hxClasses\")[\"haxe.crypto.BaseCode\"]=s(class AC extends j.inherits(){[j.new](e){let n=e.length,i=1;for(;n>1<<i;)++i;if(i>8||n!=1<<i)throw ne.thrown(\"BaseCode : base length must be a power of two.\");this.base=e,this.nbits=i}initTable(){let e=new Array,n=0;for(;n<256;){let r=n++;e[r]=-1}let i=0,a=this.base.length;for(;i<a;){let r=i++;e[this.base.b[r]]=r}this.tbl=e}decodeBytes(e){let n=this.nbits,i=this.base;this.tbl==null&&this.initTable();let a=this.tbl,r=e.length*n>>3,o=new Oi(new ArrayBuffer(r)),l=0,c=0,d=0,u=0;for(;u<r;){for(;c<8;){c+=n,l<<=n;let p=a[e.b[d++]];if(p==-1)throw ne.thrown(\"BaseCode : invalid encoded char\");l|=p}c-=8,o.b[u++]=l>>c&255}return o}static get __name__(){return\"haxe.crypto.BaseCode\"}get __class__(){return AC}},\"BaseCode\");Ud.prototype.base=null;Ud.prototype.nbits=null;Ud.prototype.tbl=null;var TLe=j.$global,qd=j.global(\"$hxClasses\")[\"haxe.crypto.Base64\"]=s(class Sv{static decode(e,n){if(n==null&&(n=!0),n)for(;at.cca(e,e.length-1)==61;)e=at.substr(e,0,-1);return new Ud(Sv.BYTES).decodeBytes(Oi.ofString(e))}static get __name__(){return\"haxe.crypto.Base64\"}get __class__(){return Sv}},\"Base64\");qd.CHARS=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";qd.BYTES=Oi.ofString(qd.CHARS);var DLe=j.$global,Iv=j.global(\"$hxClasses\")[\"haxe.Resource\"]=s(class Ov{static getString(e){let n=0,i=Ov.content;for(;n<i.length;){let a=i[n];if(++n,a.name==e)return a.str!=null?a.str:qd.decode(a.data).toString()}return null}static get __name__(){return\"haxe.Resource\"}get __class__(){return Ov}},\"Resource\");Iv.content=[{name:\"io-worker\",data:\"dmFyIGk9cmVxdWlyZSgid29ya2VyX3RocmVhZHMiKSx0PXJlcXVpcmUoImZzIiksYT1yZXF1aXJlKCJwYXRoIiksbj1uZXcgTWFwO2Z1bmN0aW9uIHAocyxvKXtsZXQgcj0oMCxhLnBhcnNlKShzKS5kaXI7bi5oYXMocil8fCgoMCx0Lm1rZGlyU3luYykocix7cmVjdXJzaXZlOiEwfSksbi5zZXQociwhMCkpLCgwLHQud3JpdGVGaWxlU3luYykocyxvKX1pLnBhcmVudFBvcnQub24oIm1lc3NhZ2UiLGZ1bmN0aW9uKG8pe3RyeXtvLm1hcCgoe3A6ZSxjOnJ9KT0+cChlLHIpKSxpLnBhcmVudFBvcnQucG9zdE1lc3NhZ2UoMSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19KTsK\"}];var al=wi(Ee(\"fs\"));No();var JLe=j.$global,ah=s(function(){},\"Io\");ah.__isInterface__=!0;var Dv=j.global(\"$hxClasses\").RevertTracker=s(class TC extends j.inherits(){[j.new](){this.filesTracked=new et}track(e){if(xn.exists(e)){let n=this.filesTracked,i=kC.bytesOfBuffer(al.readFileSync(e));n.inst.set(e,i)}else this.filesTracked.inst.set(e,null)}revert(){let e=this.filesTracked,n=e,i=e.keys();for(;i.hasNext();){let a=i.next(),r=n.get(a),l=a,c=r;if(c==null)al.unlinkSync(l);else{xn.createDirectory(Ze.directory(l));let d=c.b;al.writeFileSync(l,ks.from(d.buffer,d.byteOffset,c.length))}}this.filesTracked=new et}static get __name__(){return\"RevertTracker\"}get __class__(){return TC}},\"RevertTracker\");Dv.prototype.filesTracked=null;var zi=j.global(\"$hxClasses\").SyncIo=s(class CC extends j.inherits(){[j.new](){this.existingDirectories=new et,this.revertMap=new Dv,this.fileData=new et}reportFilesRemoved(e){let n=[],i=Mt.adaptIterator(e.inst.keys());for(;i.hasNext();){let a=i.next();this.fileData.inst.has(a)||n.push(a)}return n}reportFilesAdded(e){let n=[],i=Mt.adaptIterator(this.fileData.inst.keys());for(;i.hasNext();){let a=i.next();e.inst.has(a)||n.push(a)}return n}reportFilesChanged(e){let n=[],i=Mt.adaptIterator(this.fileData.inst.keys());for(;i.hasNext();){let a=i.next();e.inst.has(a)&&e.inst.get(a)!=this.fileData.inst.get(a)&&n.push(a)}return n}reportFileMetadata(){return this.fileData}write(e,n){let i=this.fileData,a=Cv.encode(n);i.inst.set(e,a),this.revertMap.track(e);let r=Ze.directory(e);this.existingDirectories.inst.has(r)||(xn.createDirectory(r),this.existingDirectories.inst.set(r,!0)),al.writeFileSync(e,n)}cleanup(){}finished(){return!0}static get __name__(){return\"SyncIo\"}static get __interfaces__(){return[ah]}get __class__(){return CC}},\"SyncIo\");zi.prototype.fileData=null;zi.prototype.revertMap=null;zi.prototype.existingDirectories=null;var Ui=j.global(\"$hxClasses\").ThreadedIo=s(class SC extends j.inherits(){[j.new](){this.terminated=!1,this.pending=!1,this.done=!1,this.fileData=new et,this.queue=[],this.enableLog=!1,this.proc||(this.proc=Ee(\"node:worker_threads\")),this.thread=new this.proc.Worker(Iv.getString(\"io-worker\"),{name:\"IoWorker\",eval:!0,workerData:{enableLog:!1}});let e=this;this.thread.on(\"error\",function(n){throw e.log(\"Worker error: \"+n),e.terminated=!0,ne.thrown(n)}),this.thread.on(\"exit\",function(n){return e.log(\"Worker stopped with exit code \"+n),e.terminated=!0}),this.thread.on(\"message\",function(){e.flush()})}reportFilesRemoved(e){let n=[],i=Mt.adaptIterator(e.inst.keys());for(;i.hasNext();){let a=i.next();this.fileData.inst.has(a)||n.push(a)}return n}reportFilesAdded(e){let n=[],i=Mt.adaptIterator(this.fileData.inst.keys());for(;i.hasNext();){let a=i.next();e.inst.has(a)||n.push(a)}return n}reportFilesChanged(e){let n=[],i=Mt.adaptIterator(this.fileData.inst.keys());for(;i.hasNext();){let a=i.next();e.inst.has(a)&&e.inst.get(a)!=this.fileData.inst.get(a)&&n.push(a)}return n}reportFileMetadata(){return this.fileData}log(e){this.enableLog&&console.log(\"src/Io.hx:153:\",\"[ThreadedIo | \"+process.uptime()+\"] \"+e)}flush(){if(this.log(\"flush\"),this.queue.length==0){this.done?(this.log(\"Terminating worker thread\"),this.thread.terminate()):this.pending=!1;return}let e=this.queue;this.queue=[],this.pending=!0,this.log(\"Posting \"+e.length+\" entries to worker thread\"),this.thread.postMessage(e)}write(e,n){let i=this.fileData,a=Cv.encode(n);if(i.inst.set(e,a),this.log(\"write \"+e),this.done)throw ne.thrown(\"Cannot write after cleanup()\");this.queue.push({p:e,c:n}),this.pending||this.flush()}cleanup(){this.log(\"cleanup\"),this.done=!0,this.pending||this.flush()}finished(){return this.terminated}static get __name__(){return\"ThreadedIo\"}static get __interfaces__(){return[ah]}get __class__(){return SC}},\"ThreadedIo\");Ui.prototype.enableLog=null;Ui.prototype.proc=null;Ui.prototype.thread=null;Ui.prototype.queue=null;Ui.prototype.fileData=null;Ui.prototype.done=null;Ui.prototype.pending=null;Ui.prototype.terminated=null;var Vr=j.global(\"$hxClasses\").MultiThreadIo=s(class OC extends j.inherits(){[j.new](e){if(this.fileData=new et,this.idx=0,this.threads=[],e&e-1)throw ne.thrown(\"Thread count must be a power of two\");this.mask=e-1;let n=0,i=e;for(;n<i;){let a=n++;this.threads.push(new Ui)}}reportFilesRemoved(e){let n=[],i=this.reportFileMetadata(),a=Mt.adaptIterator(e.inst.keys());for(;a.hasNext();){let r=a.next();i.inst.has(r)||n.push(r)}return n}reportFilesAdded(e){let n=this.reportFileMetadata(),i=[],a=Mt.adaptIterator(n.inst.keys());for(;a.hasNext();){let r=a.next();e.inst.has(r)||i.push(r)}return i}reportFilesChanged(e){let n=this.reportFileMetadata(),i=[],a=Mt.adaptIterator(n.inst.keys());for(;a.hasNext();){let r=a.next();e.inst.has(r)&&e.inst.get(r)!=n.inst.get(r)&&i.push(r)}return i}reportFileMetadata(){let e=0,n=this.threads;for(;e<n.length;){let i=n[e];++e;let a=Mt.adaptIterator(i.reportFileMetadata().inst.keys());for(;a.hasNext();){let r=a.next(),o=this.fileData,l=i.reportFileMetadata().inst.get(r);o.inst.set(r,l)}}return this.fileData}cleanup(){let e=0,n=this.threads;for(;e<n.length;){let i=n[e];++e,i.cleanup()}}write(e,n){this.threads[this.idx++&this.mask].write(e,n)}finished(){let e=0,n=this.threads;for(;e<n.length;){let i=n[e];if(++e,!i.finished())return!1}return!0}static isPowerOfTwo(e){return(e&e-1)==0}static get __name__(){return\"MultiThreadIo\"}static get __interfaces__(){return[ah]}get __class__(){return OC}},\"MultiThreadIo\");Vr.prototype.threads=null;Vr.prototype.idx=null;Vr.prototype.mask=null;Vr.prototype.fileData=null;var t7e=j.$global,Fv=j.global(\"$hxClasses\")[\"mcl.EventDispatcher\"]=s(class DC extends j.inherits(){[j.new](){this._subscribers=new Array}subscribe(e){this._subscribers.push(e)}dispatch(e){if(this._subscribers.length==0)return Promise.resolve();let n=[],i=0,a=this._subscribers;for(;i<a.length;){let r=a[i];++i,n.push(r(e))}return Promise.all(n).then(function(r){})}static get __name__(){return\"mcl.EventDispatcher\"}get __class__(){return DC}},\"EventDispatcher\");Fv.prototype._subscribers=null;var Mv=j.global(\"$hxClasses\")[\"mcl.ConfigEvents\"]=s(class FC extends j.inherits(){[j.new](){this.onPostBuild=new Fv,this.onPreBuild=new Fv}static get __name__(){return\"mcl.ConfigEvents\"}get __class__(){return FC}},\"ConfigEvents\");Mv.prototype.onPreBuild=null;Mv.prototype.onPostBuild=null;var Vbe=j.global(\"$hxClasses\")[\"mcl._Config.ConfigUtil\"]=s(class Nv{static lock(e){Object.freeze(e);let n=0,i=sn.fields(e);for(;n<i.length;){let a=i[n];++n;let r=sn.field(e,a);r!=null&&typeof r==\"object\"&&Nv.lock(r)}return e}static get __name__(){return\"mcl._Config.ConfigUtil\"}get __class__(){return Nv}},\"ConfigUtil\"),sa=j.global(\"$hxClasses\")[\"mcl.Config\"]=s(class Rv extends j.inherits(){[j.new](){this.header=`# Generated with MC-Build\n`,this.features=new Yf,this.formatVersion=1,this.dontEmitComments=!1,this.eqConstScoreboardName=\"mcb.eq.const\",this.eqVarScoreboardName=\"mcb.eq.var\",this.io=null,this.generatedDirName=\"zzz\",this.events=new Mv,this.libDir=Ze.join([__filename,\"..\",\".mcblib\"]),this.internalScoreboardName=\"mcb.internal\"}static create(e){Vbe.lock(e);let n=new Rv;if(e.libDir!=null&&(n.libDir=e.libDir),e.generatedDirName!=null&&(n.generatedDirName=e.generatedDirName),e.internalScoreboardName!=null&&(n.internalScoreboardName=e.internalScoreboardName),e.ioThreadCount!=null){let i=e.ioThreadCount;if(e.ioThreadCount<1)throw ne.thrown(\"io-thread-count must be greater than 0\");if(i==null)n.io=new Vr(e.ioThreadCount);else switch(i){case 1:n.io=new zi;break;case 2:n.io=new Ui;break;default:n.io=new Vr(e.ioThreadCount)}}if(e.eqConstScoreboardName!=null&&(n.eqConstScoreboardName=e.eqConstScoreboardName),e.eqVarScoreboardName!=null&&(n.eqVarScoreboardName=e.eqVarScoreboardName),e.header!=null&&(n.header=e.header),e.dontEmitComments!=null&&(n.dontEmitComments=e.dontEmitComments),e.formatVersion!=null)n.formatVersion=e.formatVersion;else{let i=IC.readFileSync(Ze.join([Ze.addTrailingSlash(process.cwd()),\"pack.mcmeta\"]),{encoding:\"utf8\"}),a=JSON.parse(i);a!=null&&a.pack!=null&&a.pack.pack_format!=null?n.formatVersion=a.pack.pack_format:($n.error(\"Could not determine pack format version, please specify it in the config or pack.mcmeta file, if you have a pack.mcmeta file already this may be the result of a parsing error.\"),process.exit(21))}return n.features.apply(n.formatVersion,null),e.setup!=null&&e.setup(n),n}static mergeFeatureFlagsToConfig(e){}static get __name__(){return\"mcl.Config\"}get __class__(){return Rv}},\"Config\");sa.prototype.libDir=null;sa.prototype.events=null;sa.prototype.generatedDirName=null;sa.prototype.internalScoreboardName=null;sa.prototype.io=null;sa.prototype.eqVarScoreboardName=null;sa.prototype.eqConstScoreboardName=null;sa.prototype.dontEmitComments=null;sa.prototype.formatVersion=null;sa.prototype.features=null;sa.prototype.header=null;var zbe=s(function(){},\"UserConfig\");zbe.__isInterface__=!0;var T7e=j.$global,Qe=j.global(\"$hxClasses\")[\"mcl.ErrorUtil\"]=s(class Pv{static format(e,n){return\"\"+n.file+\":\"+n.line+\":\"+(n.col+1)+\": \"+e}static formatWithStack(e,n){let i=e,a=0;for(;a<n.length;){let r=n[a];++a,r==null?i+=`\n\tat <unknown>`:i+=`\n\tat `+r.file+\":\"+r.line+\":\"+(r.col+1)}return i}static formatContext(e,n,i){return Pv.formatWithStack(e,i.stack.concat([n]))}static get __name__(){return\"mcl.ErrorUtil\"}get __class__(){return Pv}},\"ErrorUtil\"),rh=j.global(\"$hxClasses\")[\"mcl._Compiler.UidTracker\"]=s(class NC extends j.inherits(){[j.new](){this.uid=0}get(){return this.uid++}static get __name__(){return\"mcl._Compiler.UidTracker\"}get __class__(){return NC}},\"UidTracker\");rh.prototype.uid=null;var jo=j.global(\"$hxClasses\")[\"mcl.McTemplate\"]=s(class RC extends j.inherits(){[j.new](e,n,i){this.jsValueCache=new Fc,this.hasBeenUsed=!1,this.tickBlock=null,this.loadBlock=null,this.overloads=new Ic,this.name=e,this.body=n,this.parse(n),this.file=i}compileArgs(e,n){let i=[],a=e.split(\" \"),r=0,o=0;for(;o<a.length;){let l=a[o];if(++o,l==\"\"){++r;continue}i.push(dt.parse(l,{file:n.file,line:n.line,col:n.col+r})),r+=l.length}return i}parse(e){let n=0;for(;n<e.length;){let i=e[n];switch(++n,i._hx_index){case 9:let a=i.pos,r=i.body;if(this.tickBlock==null)this.tickBlock=r;else throw new Je(Qe.format(\"Templates can only have one top-level tick block\",a),!1);break;case 10:let o=i.pos,l=i.body;if(this.loadBlock==null)this.loadBlock=l;else throw new Je(Qe.format(\"Templates can only have one top-level load block\",o),!1);break;case 17:let c=i.pos,d=i.args,u=i.body,p=this.overloads,m=this.compileArgs(d,c);p.inst.set(m,u);break;default:if(i._hx_index!=16)throw new Je(Qe.format(\"Unexpected node type: \"+Ge.string(i),sn.field(i,\"pos\")),!0)}}}inject(e,n){this.hasBeenUsed=!0;let i=[];if(this.loadBlock!=null&&this.loadBlock.length>0){let a=this.loadBlock[0].pos;i.push(pe.FunctionDef(a,\"load\",this.loadBlock,\"minecraft:load\"))}if(this.tickBlock!=null&&this.tickBlock.length>0){let a=this.tickBlock[0].pos;i.push(pe.FunctionDef(a,\"tick\",this.tickBlock,\"minecraft:tick\"))}if(i.length>0){let a=i[0].pos,r=e.compiler.getInitialPathInfo(this.file.name),o={append:function(c){throw new Je(Qe.formatContext(\"tried to append to a Void context (template virtual context)\",a,e),!1,[a].concat(e.stack))},namespace:r.namespace,path:r.path,uidIndex:e.uidIndex,variables:new Gt(e.globalVariables),templates:this.file.templates,stack:e.stack,replacements:new Gt(null),isTemplate:!1,requireTemplateKeyword:!0,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},l=pe.Directory(a,this.name,i);n.embed(o,a,new et,[l],!0)}}injectTransform(e,n){this.hasBeenUsed=!0;let i=[];if(this.loadBlock!=null&&this.loadBlock.length>0){let a=this.loadBlock[0].pos;i.push(pe.FunctionDef(a,\"load\",this.loadBlock,\"minecraft:load\"))}if(this.tickBlock!=null&&this.tickBlock.length>0){let a=this.tickBlock[0].pos;i.push(pe.FunctionDef(a,\"tick\",this.tickBlock,\"minecraft:tick\"))}if(i.length>0){let a=i[0].pos,r=e.compiler.getInitialPathInfo(this.file.name),o={append:function(c){throw new Je(Qe.formatContext(\"tried to append to a Void context (template virtual context)\",a,e),!1,[a].concat(e.stack))},namespace:r.namespace,path:r.path,uidIndex:e.uidIndex,variables:new Gt(e.globalVariables),templates:this.file.templates,stack:e.stack,replacements:new Gt(null),isTemplate:!1,requireTemplateKeyword:!0,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},l=pe.Directory(a,this.name,i);n.embedTransform(o,a,new et,[l],!0)}return pe.Void}process(e,n,i,a,r){let o=Et.ltrim(a.substring(this.name.length));this.jsValueCache.clear(),dt.jsCache=this.jsValueCache;let l=this.overloads,c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p,x=new et,_=0,h=0,v=[o].concat(r??[]),b=!1,y=0,w=0;for(;w<f.length;){let F=f[w];for(++w;h<v.length&&v[h]==\"\";)++h;if(h>=v.length)break;if(F.expectBlock){if(!Li.enumEq(Li.typeof(v[h]),ft.TEnum(pe)))break;let N=F.parseValueBlock(v[h],i,n);if(!N.success)break;b=!0,x.inst.set(F.name,N.value),v[h]=N.raw,++_,++h}else{if(typeof v[h]!=\"string\")break;let N=v[h],k=null;if(N.charAt(0)==\"<\"&&N.charAt(1)==\"%\"&&!F.expectJsValue){let D=N.indexOf(\"%>\");if(D==-1)throw new Je(Qe.formatContext(\"Unexpected end of inline script block\",i,n),!1,[i].concat(n.stack));let B=N.substring(2,D);if(k=B,this.jsValueCache.inst.has(y)){let q=this.jsValueCache.inst.get(y);N=q==null?\"null\":Ge.string(q)}else{let q=ei.invokeExpressionInline(B,n,i);this.jsValueCache.inst.set(y,q),N=q==null?\"null\":Ge.string(q)}++y}else F.expectJsValue&&(dt.jsCacheIdx=y,++y);let R=F.parseValue(N,i,n);if(!R.success)break;F.name!=null&&x.inst.set(F.name,R.value),k!=null?v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(k.length+4)):v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(R.raw.length)),++_,b=!1}}for(;h<v.length&&v[h]==\"\";)++h;if(_!=f.length||h!=v.length||v[h-1]!=\"\"&&!b)continue;this.hasBeenUsed||this.inject(n,e);let S={append:n.append,namespace:n.namespace,path:n.path,uidIndex:n.uidIndex,variables:n.variables,templates:this.file.templates,stack:n.stack,replacements:n.replacements,isTemplate:!1,requireTemplateKeyword:!0,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};e.embed(S,i,x,g);return}throw new Je(Qe.formatContext(\"Failed to find matching template overload for: \"+a,i,n),!1,[i].concat(n.stack))}transform(e,n,i,a,r){let o=Et.ltrim(a.substring(this.name.length));this.jsValueCache.clear(),dt.jsCache=this.jsValueCache;let l=this.overloads,c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p,x=new et,_=0,h=0,v=[o].concat(r??[]),b=!1,y=0,w=0;for(;w<f.length;){let N=f[w];for(++w;h<v.length&&v[h]==\"\";)++h;if(h>=v.length)break;if(N.expectBlock){if(!Li.enumEq(Li.typeof(v[h]),ft.TEnum(pe)))break;let k=N.parseValueBlock(v[h],i,n);if(!k.success)break;b=!0,x.inst.set(N.name,k.value),v[h]=k.raw,++_,++h}else{if(typeof v[h]!=\"string\")break;let k=v[h],R=null;if(k.charAt(0)==\"<\"&&k.charAt(1)==\"%\"&&!N.expectJsValue){let B=k.indexOf(\"%>\");if(B==-1)throw new Je(Qe.formatContext(\"Unexpected end of inline script block\",i,n),!1,[i].concat(n.stack));let q=k.substring(2,B);if(R=q,this.jsValueCache.inst.has(y)){let G=this.jsValueCache.inst.get(y);k=G==null?\"null\":Ge.string(G)}else{let G=ei.invokeExpressionInline(q,n,i);this.jsValueCache.inst.set(y,G),k=G==null?\"null\":Ge.string(G)}++y}else N.expectJsValue&&(dt.jsCacheIdx=y,++y);let D=N.parseValue(k,i,n);if(!D.success)break;N.name!=null&&x.inst.set(N.name,D.value),R!=null?v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(R.length+4)):v[h]=Et.ltrim(Pr.__cast(v[h],String).substring(D.raw.length)),++_,b=!1}}for(;h<v.length&&v[h]==\"\";)++h;if(_!=f.length||h!=v.length||v[h-1]!=\"\"&&!b)continue;let S=[];this.hasBeenUsed||S.push(this.injectTransform(n,e));let F={append:n.append,namespace:n.namespace,path:n.path,uidIndex:n.uidIndex,variables:n.variables,templates:this.file.templates,stack:n.stack,replacements:n.replacements,isTemplate:!1,requireTemplateKeyword:!0,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};return S.push(e.embedTransform(F,i,x,g,!1)),pe.Group(S)}throw new Je(Qe.formatContext(\"Failed to find matching template overload for: \"+a,i,n),!1,[i].concat(n.stack))}static get __name__(){return\"mcl.McTemplate\"}get __class__(){return RC}},\"McTemplate\");jo.prototype.name=null;jo.prototype.body=null;jo.prototype.overloads=null;jo.prototype.loadBlock=null;jo.prototype.tickBlock=null;jo.prototype.file=null;jo.prototype.hasBeenUsed=null;jo.prototype.jsValueCache=null;var Gt=j.global(\"$hxClasses\")[\"mcl.VariableMap\"]=s(class Lv extends j.inherits(){[j.new](e,n){this.parent=e,this.variables=n??new et}get(){if(this._cache!=null){let r=new et,o=this._cache,l=o,c=o.keys();for(;c.hasNext();){let d=c.next(),u=l.get(d),m=d,f=u;r.inst.set(m,f)}return r}let e=this.parent==null?new et:this.parent.get(),n=this.variables,i=n,a=n.keys();for(;a.hasNext();){let r=a.next(),o=i.get(r),c=r,d=o;e.inst.set(c,d)}return this._cache=e,e}static fromObject(e){let n=new et,i=0,a=sn.fields(e);for(;i<a.length;){let r=a[i];++i,n.inst.set(r,sn.field(e,r))}return new Lv(null,n)}static get __name__(){return\"mcl.VariableMap\"}get __class__(){return Lv}},\"VariableMap\");Gt.prototype.parent=null;Gt.prototype.variables=null;Gt.prototype._cache=null;j.createStatic(Gt,\"globals\",function(){return new Gt(null,rs.map)});var ol=j.global(\"$hxEnums\")[\"mcl.ImportFileType\"]={__ename__:\"mcl.ImportFileType\",IMcFile:Object.assign(t=>({_hx_index:0,__enum__:\"mcl.ImportFileType\",f:t,\"@kind\":\"IMcFile\"}),{_hx_name:\"IMcFile\",__params__:[\"f\"]}),IJsFile:Object.assign(t=>({_hx_index:1,__enum__:\"mcl.ImportFileType\",f:t,\"@kind\":\"IJsFile\"}),{_hx_name:\"IJsFile\",__params__:[\"f\"]})};ol.__constructs__=[ol.IMcFile,ol.IJsFile];ol.__empty_constructs__=[];var ei=j.global(\"$hxClasses\")[\"mcl.McFile\"]=s(class rl extends j.inherits(){[j.new](e,n){this.tagsDir=\"tags\",this.functionsDir=\"functions\",this.fileJs={},this.tickCommands=[],this.loadCommands=[],this.imports=new et,this.exportedTemplates=new et,this.templates=new et,this.ast=[],this.name=e,this.ast=n,this.ext=Ze.extension(e)}getTemplates(){if(this.ext==\"mcbt\")return this.exportedTemplates;throw new Je(\"tried to get templates from non-template file:\"+this.name,!0)}setup(e){e.config.features.useFolderRenames48&&(this.functionsDir=\"function\");let n=this.ast;this.ast=[];let i=0;for(;i<n.length;){let r=n[i];switch(++i,r._hx_index){case 2:let o=r.pos,l=r.name,c=r.body,d=new jo(l,c,this);this.templates.inst.set(l,d),this.exportedTemplates.inst.set(l,d);break;case 4:let u=r.pos,p=r.name,m=e.resolve(this.name,p);switch(m._hx_index){case 0:let x=m.f;this.imports.inst.set(p,x);break;case 1:let _=m.f;Object.assign(this.fileJs,_);break}break;case 15:let f=r.pos,g=r.value;break;default:this.ast.push(r)}}let a=Mt.adaptIterator(this.imports.inst.values());for(;a.hasNext();){let l=a.next().getTemplates(),c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p;this.templates.inst.set(f,g)}}}createAnonymousFunction(e,n,i,a,r,o){r=r!=null?this.injectValues(r,a,e):null;let l=[],c=r==null?Ge.string(a.uidIndex.get()):\"\",d=r??\"\"+a.compiler.config.generatedDirName+\"/\"+c,u=r==null?[]:[r];if(r!=null&&r.indexOf(\"/\")!=-1){let ee=r.split(\"/\");ee.pop(),u=ee}let p=a.namespace+\":\"+a.path.concat(r==null?[a.compiler.config.generatedDirName,c]:[r]).join(\"/\"),m=a.namespace,f=a.variables,g=null,x=g==null?f:new Gt(f,g),_=a.path.concat(u),h=a.uidIndex,v=a.stack,b=a.variables,y=a.templates,w=a.requireTemplateKeyword,S=a.compiler,F=a.globalVariables,N=a.functions.concat([p]),k={append:function(ee){l.push(ee)},namespace:m,path:_??[],uidIndex:h,variables:x,stack:v,replacements:b,isTemplate:this.ext==\"mcbt\",templates:y,requireTemplateKeyword:w,compiler:S,globalVariables:F,functions:N,baseNamespaceInfo:a.baseNamespaceInfo,currentFunction:a.currentFunction},R=0;for(;R<n.length;){let ee=n[R];++R,this.compileCommand(ee,k)}let D=l.join(`\n`);r!=null&&(r=this.injectValues(r,a,e));let B=Ze.join([\"data\",a.namespace,this.functionsDir].concat(a.path.concat([d+\".mcfunction\"]))),q=D;a.compiler.config.header.length>0&&B.endsWith(\".mcfunction\")&&(q=a.compiler.config.header+`\n`+q),a.compiler.io.write(B,q);let G=\"function \"+a.namespace+\":\"+a.path.concat([d]).join(\"/\"),W=i==null?\"\":\" \"+this.injectValues(i,a,e);return(o?\"$\":\"\")+(G+W)}embedTransform(e,n,i,a,r){r==null&&(r=!1);let o=e.namespace,l=e.append,c=e.globalVariables,d=new Gt(Gt.globals,(i==null?c:new Gt(c,i)).get()),u=e.path,p={append:l,namespace:o,path:u??[],uidIndex:e.uidIndex,variables:d,stack:e.stack,replacements:e.replacements,isTemplate:this.ext==\"mcbt\",templates:e.templates,requireTemplateKeyword:e.requireTemplateKeyword,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},m=[],f=0;for(;f<a.length;){let x=a[f];++f,r?m.push(this.transformTld(x,p)):m.push(this.transformCommand(x,p))}let g=pe.Group(m);return r&&e.compiler.addTopLevelAstNode(g),r?pe.Void:g}embed(e,n,i,a,r){r==null&&(r=!1);let o=e.namespace,l=e.append,c=e.globalVariables,d=new Gt(Gt.globals,(i==null?c:new Gt(c,i)).get()),u=e.path,p={append:l,namespace:o,path:u??[],uidIndex:e.uidIndex,variables:d,stack:e.stack,replacements:e.replacements,isTemplate:this.ext==\"mcbt\",templates:e.templates,requireTemplateKeyword:e.requireTemplateKeyword,compiler:e.compiler,globalVariables:e.globalVariables,functions:e.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:e.currentFunction},m=0;for(;m<a.length;){let f=a[m];++m,r?this.compileTld(f,p):this.compileCommand(f,p)}}transformTemplate(e,n,i,a,r){if(e.compiler.templateParsingEnabled){i.startsWith(\"template \")&&(i=i.substring(9));let o=e.templates,l=o,c=o.keys();for(;c.hasNext();){let d=c.next(),u=l.get(d),m=d,f=u;if(i==m||i.startsWith(m))return f.transform(this,e,n,i,a)}if(a!=null&&a.length>0)throw new Je(Qe.formatContext(\"Unexpected extra data in non template command\",n,e),!1,[n].concat(e.stack))}return pe.Raw(n,this.injectValues(i,e,n),a,r)}processTemplate(e,n,i,a,r){if(e.compiler.templateParsingEnabled){i.startsWith(\"template \")&&(i=i.substring(9));let l=e.templates,c=l,d=l.keys();for(;d.hasNext();){let u=d.next(),p=c.get(u),f=u,g=p;if(i==f||i.startsWith(\"\"+f+\" \")){g.process(this,e,n,i,a);return}}if(a!=null&&a.length>0)throw new Je(Qe.formatContext(\"Unexpected extra data in non template command\",n,e),!1,[n].concat(e.stack))}let o=this.injectValues(i,e,n);e.append((r?\"$\":\"\")+o)}compileInline(e,n,i){i==null&&(i=!1);let a=Zn.tokenize(n,\"<inline \"+this.name+\">\"),r=new ko(a),o=[];for(;r.hasNext();)i?o.push(Xt.parseTLD(r)):o.push(Xt.innerParse(r));if(i){let l=0;for(;l<o.length;){let c=o[l];++l,this.compileTld(c,e)}}else{let l=0;for(;l<o.length;){let c=o[l];++l,this.compileCommand(c,e)}}}transformInline(e,n,i){i==null&&(i=!1);let a=Zn.tokenize(n,\"<inline \"+this.name+\">\"),r=new ko(a),o=[];for(;r.hasNext();)i?o.push(Xt.parseTLD(r)):o.push(Xt.innerParse(r));let l;if(i){let c=[],d=0;for(;d<o.length;){let u=o[d];++d,c.push(this.transformTld(u,e))}l=c}else{let c=[],d=0;for(;d<o.length;){let u=o[d];++d,c.push(this.transformCommand(u,e))}l=c}return pe.Group(l)}processMlScript(e,n,i,a){a==null&&(a=!1);let r=\"\",o=0;for(;o<i.length;){let h=i[o];switch(++o,h._hx_index){case 0:let v=h.v,b=h.pos;r+=v+`\n`;break;case 1:let y=h.pos,w=h.data;r+=\"{\"+w;break;case 2:let S=h.pos;r+=\"}\";break}}let l=[\"emit\",\"context\",\"embed\",\"require\"],c=s(function(h){e.append(h)},\"emit\"),d=this,u=s(function(h){d.compileInline(e,h,a)},\"emitMcb\"),p=s(function(h,v){let b=\"\"+e.compiler.config.generatedDirName+\"/\"+Ge.string(e.uidIndex.get()),y=Ze.join([\"data\",e.namespace,d.functionsDir].concat(e.path.concat([b+\".mcfunction\"]))),w=h.join(`\n`);e.compiler.config.header.length>0&&y.endsWith(\".mcfunction\")&&(w=e.compiler.config.header+`\n`+w),e.compiler.io.write(y,w);let S=\"\"+e.namespace+\":\"+e.path.concat([b]).join(\"/\");return e.append(\"function \"+S+(v==null?\"\":\" \"+v)),S},\"emitBlock\");c.mcb=u,a||(c.block=p);let m=[c,e,function(h){if(a)throw new Je(Qe.formatContext(\"embed not available in toplevel script blocks\",n,e),!1,[n].concat(e.stack));return h.embedTo(e,n,d)},e.compiler.disableRequire?function(h){throw new Je(Qe.formatContext(\"Require not available as it has been disabled, please disable compiler.disableRequire\",n,e),!1,[n].concat(e.stack))}:Bv.createRequire(this.name)],g=e.variables.get(),x=g,_=g.keys();for(;_.hasNext();){let h=_.next(),v=x.get(h),y=h,w=v;l.push(y),m.push(w)}try{new Function(...l,r)(...m)}catch(h){let v=ne.caught(h);throw v instanceof Ci?ne.thrown(v):new Je(Qe.formatContext(\"Error in multi-line script, '\"+v.get_message()+\"' at \"+n.file+\":\"+n.line+\":\"+(n.col+1),n,e),!1,[n].concat(e.stack))}}processMlScriptTransform(e,n,i,a){a==null&&(a=!1);let r=\"\",o=0;for(;o<i.length;){let v=i[o];switch(++o,v._hx_index){case 0:let b=v.v,y=v.pos;r+=b+`\n`;break;case 1:let w=v.pos,S=v.data;r+=\"{\"+S;break;case 2:let F=v.pos;r+=\"}\";break}}let l=[\"emit\",\"context\",\"embed\",\"require\"],c=[],d=s(function(v){return c.push(pe.Raw(n,v,[],null))},\"emit\"),u=this,p=s(function(v){c.push(u.transformInline(e,v,a))},\"emitMcb\"),m=s(function(v,b){let y=e.uidIndex.get(),w=e.compiler,S=n,F=n,N=\"block_\"+y,k=[],R=0;for(;R<v.length;){let D=v[R];++R,k.push(pe.Raw(n,D,[],!1))}return w.addTopLevelAstNode(pe.Directory(S,\"mcb_emmited_blocks\",[pe.FunctionDef(F,N,k,null)])),c.push(pe.FunctionCall(n,e.namespace+\":\"+e.baseNamespaceInfo.path.concat([\"mcb_emmited_blocks\",\"block_\"+y]).join(\"/\"),b==null?null:u.injectValues(b,e,n),!1)),e.namespace+\":\"+e.baseNamespaceInfo.path.concat([\"mcb_emmited_blocks\",\"block_\"+y]).join(\"/\")},\"emitBlock\");d.mcb=p,a||(d.block=m);let f=[d,e,function(v){if(a)throw new Je(Qe.formatContext(\"embed not available in toplevel script blocks\",n,e),!1,[n].concat(e.stack));return v.embedTo(e,n,u,!1)},e.compiler.disableRequire?function(v){throw new Je(Qe.formatContext(\"Require not available as it has been disabled, please disable compiler.disableRequire\",n,e),!1,[n].concat(e.stack))}:Bv.createRequire(this.name)],x=e.variables.get(),_=x,h=x.keys();for(;h.hasNext();){let v=h.next(),b=_.get(v),w=v,S=b;l.push(w),f.push(S)}try{new Function(...l,r)(...f)}catch(v){let b=ne.caught(v);throw b instanceof Ci?ne.thrown(b):new Je(Qe.formatContext(\"Error in multi-line script, '\"+b.get_message()+\"' at \"+n.file+\":\"+n.line+\":\"+(n.col+1),n,e),!1,[n].concat(e.stack))}return pe.Group(c)}transformCommand(e,n){let i=this;switch(e._hx_index){case 0:let a=e.pos,r=e.value,o=e.continuations,l=e.isMacro;return this.transformTemplate(n,a,r,o,l);case 5:let c=e.pos,d=e.expression,u=e.as,p=e.body,m=[];return this.processCompilerLoop(d,u,n,p,c,function(ln,Ba){m.push(i.transformCommand(Ba,ln))}),pe.Group(m);break;case 6:let f=e.pos,g=e.expression,x=e.body,_=e.elseExpressions;return this.transformCompileTimeIf(g,x,_,f,n,function(ln){return i.transformCommand(ln,n)});case 7:let h=e.pos,v=e.value;return this.processMlScriptTransform(n,h,v);case 8:let b=e.pos,y=e.name,w=e.body,S=e.data,F=e.isMacro,N=e.isInline,k=this.injectValues(y,n,b),R=[],D=0;for(;D<w.length;){let ln=w[D];++D,R.push(this.transformCommand(ln,n))}return pe.Block(b,k,R,this.injectValues(S,n,b),F,N);case 9:let B=e.pos,q=e.body,G=[],W=0;for(;W<q.length;){let ln=q[W];++W,G.push(this.transformCommand(ln,n))}return pe.TickBlock(B,G);case 10:let ee=e.pos,Z=e.body,me=[],X=0;for(;X<Z.length;){let ln=Z[X];++X,me.push(this.transformCommand(ln,n))}return pe.LoadBlock(ee,me);case 11:let Q=e.pos,he=e.execute,Ie=e.data,le=e.body,ge=e.continuations,V=e.isMacro,H=this.injectValues(he,n,Q),re=this.injectValues(Ie,n,Q),xe=[],fe=0;for(;fe<le.length;){let ln=le[fe];++fe,xe.push(this.transformCommand(ln,n))}let te=xe,Y;if(ge==null)Y=[];else{let ln=[],Ba=0;for(;Ba<ge.length;){let $c=ge[Ba];++Ba,ln.push(this.transformCommand($c,n))}Y=ln}return pe.ExecuteBlock(Q,H,re,te,Y,V);case 12:let we=e.pos,Le=e.delay,Tt=e.type,tn=e.body,kn=e.isMacro,Rn=this.injectValues(Le,n,we),ii=this.injectValues(Tt,n,we),Ft=[],$t=0;for(;$t<tn.length;){let ln=tn[$t];++$t,Ft.push(this.transformCommand(ln,n))}return pe.ScheduleBlock(we,Rn,ii,Ft,kn);case 15:let ai=e.pos,cr=e.value;return n.compiler.config.dontEmitComments?pe.Void:pe.Comment(ai,cr);case 19:let Fa=e.pos,Na=e.command,Ra=e.value,ur=e.isMacro;return pe.Execute(Fa,this.injectValues(Na,n,Fa),this.transformCommand(Ra,n),ur);case 20:let Fi=e.pos,Gr=e.name,Ma=e.data,Wr=e.isMacro;return pe.FunctionCall(Fi,this.injectValues(Gr,n,Fi),this.injectValues(Ma,n,Fi),Wr);case 21:let Wi=e.pos,Ne=e.command;return pe.EqCommand(Wi,this.injectValues(Ne,n,Wi));case 22:let Un=e.pos,Kr=e.delay,dr=e.target,Yr=e.mode,pr=e.isMacro;return pe.ScheduleCall(Un,this.injectValues(Kr,n,Un),this.injectValues(dr,n,Un),this.injectValues(Yr,n,Un),pr);case 23:let _l=e.pos,So=e.value,mr=e.isMacro;return pe.ReturnRun(_l,this.transformCommand(So,n),mr);case 24:let Xr=e.pos,ps=e.target,ce=e.isMacro;return pe.ScheduleClear(Xr,this.injectValues(ps,n,Xr),ce);default:throw console.log(\"src/mcl/Compiler.hx:897:\",Ge.string(e)),ne.thrown(\"Unexpected node type in transformCommand: \"+Ge.string(e))}}evaluateFunctionHandle(e,n,i,a){let r=this.injectValues(e,n,i),o=r.charAt(0)==\"#\"?\"#\":\"\";switch(o!=\"\"&&(r=r.substring(1)),r.charAt(0)){case\"*\":return\"\"+o+n.namespace+\":\"+r.substring(1);case\".\":if(r.charAt(1)==\"/\"||r.charAt(1)==\".\"&&r.charAt(2)==\"/\"){let d=n.currentFunction.concat(r.split(\"/\")),u=[],p=0;for(;p<d.length;){let m=d[p];switch(++p,m){case\"\":case\".\":break;case\"..\":if(u.length==0)throw new Je(Qe.formatContext(\"Invalid call: \"+r,i,n),!1,[i].concat(n.stack));u.pop();break;default:u.push(m)}}return\"\"+o+n.namespace+\":\"+u.join(\"/\")}else return r.indexOf(\":\")==-1&&(r=\"\"+n.namespace+\":\"+n.path.concat([r]).join(\"/\")),\"\"+o+r;break;case\"^\":let l=Ge.parseInt(r.substring(1)),c=n.functions[n.functions.length-l-1];if(c==null)throw new Je(Qe.formatContext(\"Unexpected call: \"+r,i,n),!1,[i].concat(n.stack));return\"\"+o+c;default:return r.indexOf(\":\")==-1&&(r=\"\"+n.namespace+\":\"+n.path.concat([r]).join(\"/\")),\"\"+o+r}}compileCommand(e,n){let i=this;switch(e._hx_index){case 0:let a=e.pos,r=e.value,o=e.continuations,l=e.isMacro;this.processTemplate(n,a,r,o,l);break;case 5:let c=e.pos,d=e.expression,u=e.as,p=e.body;this.processCompilerLoop(d,u,n,p,c,function(yt,Mn){i.compileCommand(Mn,yt)});break;case 6:let m=e.pos,f=e.expression,g=e.body,x=e.elseExpressions;this.compileTimeIf(f,g,x,m,n,function(yt){i.compileCommand(yt,n)});break;case 7:let _=e.pos,h=e.value;this.processMlScript(n,_,h);break;case 8:let v=e.pos,b=e.name,y=e.body,w=e.data,S=e.isMacro,F=e.isInline;if(b==null){let yt=v,Mn=y,dn=w,Io=S;if(F){if(dn!=null)throw new Je(Qe.formatContext(\"Inline block cannot have data\",yt,n),!1,[yt].concat(n.stack));{let Ki=0;for(;Ki<Mn.length;){let Ni=Mn[Ki];++Ki,this.compileCommand(Ni,n)}}}else{let Ki=n,Ni=this.createAnonymousFunction(yt,Mn,dn,n,null,Io);Ki.append(Ni)}}else if(b==\"\"){let yt=v,Mn=y,dn=w,Io=S;if(F){if(dn!=null)throw new Je(Qe.formatContext(\"Inline block cannot have data\",yt,n),!1,[yt].concat(n.stack));{let Ki=0;for(;Ki<Mn.length;){let Ni=Mn[Ki];++Ki,this.compileCommand(Ni,n)}}}else{let Ki=n,Ni=this.createAnonymousFunction(yt,Mn,dn,n,null,Io);Ki.append(Ni)}}else{let yt=b,Mn=v,dn=y,Io=w,xp=S;if(F){if(Io!=null)throw new Je(Qe.formatContext(\"Inline block cannot have data\",Mn,n),!1,[Mn].concat(n.stack));{let Ni=0;for(;Ni<dn.length;){let bl=dn[Ni];++Ni,this.compileCommand(bl,n)}}}else{let Ni=n,bl=this.createAnonymousFunction(Mn,dn,Io,n,yt,xp);Ni.append(bl)}}break;case 9:let N=e.pos,k=e.body,R=n.functions.concat([null]),D=n.path,B={append:function(yt){i.tickCommands.push(yt)},namespace:n.namespace,path:D??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:R,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},q=0;for(;q<k.length;){let yt=k[q];++q,this.compileCommand(yt,B)}break;case 10:let G=e.pos,W=e.body,ee=n.functions.concat([null]),Z=n.path,me={append:function(yt){i.loadCommands.push(yt)},namespace:n.namespace,path:Z??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:ee,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},X=0;for(;X<W.length;){let yt=W[X];++X,this.compileCommand(yt,me)}break;case 11:let Q=e.pos,he=e.execute,Ie=e.data,le=e.body,ge=e.continuations,V=e.isMacro,H=[],re=s(function(yt){H.push(yt)},\"append\"),xe=Ge.string(n.uidIndex.get()),fe=\"\"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,xe]).join(\"/\"),te=n.functions.concat([fe]),Y=n.path,we={append:re,namespace:n.namespace,path:Y??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:te,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};ge!=null&&(n.append(\"scoreboard players set #ifelse \"+n.compiler.config.internalScoreboardName+\" 0\"),we.append(\"scoreboard players set #ifelse \"+n.compiler.config.internalScoreboardName+\" 1\"));let Le=0;for(;Le<le.length;){let yt=le[Le];++Le,this.compileCommand(yt,we)}let Tt=H.join(`\n`),tn=Ze.join([\"data\",n.namespace,this.functionsDir].concat(n.path.concat([n.compiler.config.generatedDirName,xe+\".mcfunction\"]))),kn=Tt;n.compiler.config.header.length>0&&tn.endsWith(\".mcfunction\")&&(kn=n.compiler.config.header+`\n`+kn),n.compiler.io.write(tn,kn);let Rn=n,ii=this.injectValues((V?\"$\":\"\")+(\"\"+he+\" function \"+fe+(Ie==null?\"\":\" \"+Ie)),n,Q);if(Rn.append(ii),ge!=null){let yt=0,Mn=0;for(;Mn<ge.length;){let dn=ge[Mn];++Mn;let Io=yt==ge.length-1;switch(dn._hx_index){case 8:let xp=dn.pos,Ki=dn.name,Ni=dn.isInline,bl=dn.body,hy=dn.data,tI=dn.isMacro,gy=[\"scoreboard players set #ifelse \"+n.compiler.config.internalScoreboardName+\" 1\"];if(!Io)throw new Je(\"block continuation must be the last continuation\",!0);let nI=s(function(bs){gy.push(bs)},\"appendEmbed\"),gg=Ge.string(n.uidIndex.get()),iI=\"\"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,gg]).join(\"/\"),aI=n.functions.concat([iI]),_y=n.path,rI={append:nI,namespace:n.namespace,path:_y??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:aI,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},_g=0;for(;_g<bl.length;){let bs=bl[_g];++_g,this.compileCommand(bs,rI)}let oI=gy.join(`\n`),xy=Ze.join([\"data\",n.namespace,this.functionsDir].concat(n.path.concat([n.compiler.config.generatedDirName,gg+\".mcfunction\"]))),xg=oI;n.compiler.config.header.length>0&&xy.endsWith(\".mcfunction\")&&(xg=n.compiler.config.header+`\n`+xg),n.compiler.io.write(xy,xg);let sI=n,lI=\"execute if score #ifelse \"+n.compiler.config.internalScoreboardName+\" matches 0 run function \"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,gg]).join(\"/\");sI.append((tI?\"$\":\"\")+(lI+(hy==null?\"\":\" \"+hy)));break;case 11:let i2e=dn.continuations,a2e=dn.pos,vg=dn.execute,vy=dn.data,by=dn.body,cI=dn.isMacro,yy=[\"scoreboard players set #ifelse \"+n.compiler.config.internalScoreboardName+\" 1\"],uI=s(function(bs){yy.push(bs)},\"embedAppend\"),bg=Ge.string(n.uidIndex.get()),dI=\"\"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,bg]).join(\"/\"),pI=n.functions.concat([dI]),wy=n.path,mI={append:uI,namespace:n.namespace,path:wy??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:pI,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},yg=0;for(;yg<by.length;){let bs=by[yg];++yg,this.compileCommand(bs,mI)}let fI=yy.join(`\n`),Ey=Ze.join([\"data\",n.namespace,this.functionsDir].concat(n.path.concat([n.compiler.config.generatedDirName,bg+\".mcfunction\"]))),wg=fI;n.compiler.config.header.length>0&&Ey.endsWith(\".mcfunction\")&&(wg=n.compiler.config.header+`\n`+wg),n.compiler.io.write(Ey,wg);let hI=vg.startsWith(\"execute \")?vg.substring(8):vg,gI=n,_I=\"execute if score #ifelse \"+n.compiler.config.internalScoreboardName+\" matches 0 \"+hI+\" function \"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,bg]).join(\"/\");gI.append((cI?\"$\":\"\")+(_I+(vy==null?\"\":\" \"+vy)));break;default:let ky=dn.pos;throw new Je(Qe.formatContext(\"Unexpected continuation type: \"+Ge.string(dn),ky,we),!1,[ky].concat(we.stack))}++yt}}break;case 12:let Ft=e.pos,$t=e.delay,ai=e.type,cr=e.body,Fa=e.isMacro;$t=this.injectValues($t,n,Ft),ai=this.injectValues(ai,n,Ft);let Na=[],Ra=s(function(yt){Na.push(yt)},\"append1\"),ur=Ge.string(n.uidIndex.get()),Fi=\"\"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,ur]).join(\"/\"),Gr=n.functions.concat([Fi]),Ma=n.path,Wr={append:Ra,namespace:n.namespace,path:Ma??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:Gr,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},Wi=0;for(;Wi<cr.length;){let yt=cr[Wi];++Wi,this.compileCommand(yt,Wr)}let Ne=Na.join(`\n`),Un=Ge.string(n.uidIndex.get()),Kr=Ze.join([\"data\",n.namespace,this.functionsDir].concat(n.path.concat([n.compiler.config.generatedDirName,Un+\".mcfunction\"]))),dr=Ne;n.compiler.config.header.length>0&&Kr.endsWith(\".mcfunction\")&&(dr=n.compiler.config.header+`\n`+dr),n.compiler.io.write(Kr,dr);let Yr=n,pr=\"schedule function \"+n.namespace+\":\"+n.path.concat([n.compiler.config.generatedDirName,Un]).join(\"/\")+\" \"+$t+\" \"+ai;Yr.append((Fa?\"$\":\"\")+pr);break;case 15:let _l=e.pos,So=e.value;n.compiler.config.dontEmitComments||n.append(So);break;case 19:let mr=e.pos,Xr=e.command,ps=e.value,ce=e.isMacro,ln=[],Ba=n.path,$c={append:function(yt){ln.push(yt)},namespace:n.namespace,path:Ba??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};if(this.compileCommand(ps,$c),ln.length!=1)throw new Je(Qe.formatContext(\"Expected exactly 1 command after execute, got \"+ln.length,mr,n),!1,[mr].concat(n.stack));let hp=n,pg=this.injectValues((ce?\"$\":\"\")+(\"\"+Xr+\" \"+ln[0]),n,mr);hp.append(pg);break;case 20:let xl=e.pos,gp=e.name,eu=e.data,Se=e.isMacro,ue=n,tt=\"function \"+this.evaluateFunctionHandle(gp,n,xl,Se),mg=eu.length==0?\"\":\" \"+this.injectValues(eu,n,xl),py=this.injectValues((Se?\"$\":\"\")+(tt+mg),n,xl);ue.append(py);break;case 21:let fg=e.pos,hg=e.command,tu=M4.compile(this.injectValues(hg,n,fg),n);n.append(tu.commands);let Oo=\"scoreboard objectives add \"+n.compiler.config.eqConstScoreboardName+\" dummy\";this.loadCommands.includes(Oo)||this.loadCommands.push(Oo),Oo=\"scoreboard objectives add \"+n.compiler.config.eqVarScoreboardName+\" dummy\",this.loadCommands.includes(Oo)||this.loadCommands.push(Oo);let ms=0,ht=tu.constants;for(;ms<ht.length;){let yt=ht[ms];++ms;let Mn=\"scoreboard players set \"+yt+\" \"+n.compiler.config.eqConstScoreboardName+\" \"+yt;this.loadCommands.includes(Mn)||this.loadCommands.push(Mn)}break;case 22:let ca=e.pos,ua=e.delay,fr=e.target,hs=e.mode,gs=e.isMacro;ua=this.injectValues(ua,n,ca),hs=this.injectValues(hs,n,ca);let _s=n,xs=\"schedule function \"+this.evaluateFunctionHandle(fr,n,ca,gs)+\" \"+ua+\" \"+hs;_s.append((gs?\"$\":\"\")+xs);break;case 23:let vs=e.pos,_p=e.value,Zr=e.isMacro,vl=[],my=n.path,X6={append:function(yt){vl.push(yt)},namespace:n.namespace,path:my??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction};if(this.compileCommand(_p,X6),vl.length!=1)throw new Je(Qe.formatContext(\"Expected exactly 1 command after return run, got \"+vl.length,vs,n),!1,[vs].concat(n.stack));n.append((Zr?\"$\":\"\")+(\"return run \"+vl[0]));break;case 24:let Z6=e.pos,Q6=e.target,fy=e.isMacro,$6=n,eI=\"schedule clear \"+this.evaluateFunctionHandle(Q6,n,Z6,fy);$6.append((fy?\"$\":\"\")+eI);break;default:console.log(\"src/mcl/Compiler.hx:1275:\",Ge.string(e))}}compileFunction(e,n,i,a,r){n=this.injectValues(n,r,e);let o=[],l=s(function(x){o.push(x)},\"append\"),c=r.namespace+\":\"+r.path.concat([n]).join(\"/\"),d=r.functions.concat([c]),u=r.path,p={append:l,namespace:r.namespace,path:u??[],uidIndex:r.uidIndex,variables:r.variables,stack:r.stack,replacements:r.replacements,isTemplate:this.ext==\"mcbt\",templates:r.templates,requireTemplateKeyword:r.requireTemplateKeyword,compiler:r.compiler,globalVariables:r.globalVariables,functions:d,baseNamespaceInfo:r.baseNamespaceInfo,currentFunction:r.currentFunction};p.currentFunction=r.path;let m=0;for(;m<i.length;){let x=i[m];++m,this.compileCommand(x,p)}a!=null&&r.compiler.tags.addTagEntry(this.injectValues(a,r,e),c,r);let f=Ze.join([\"data\",r.namespace,this.functionsDir].concat(r.path.concat([n+\".mcfunction\"]))),g=o.join(`\n`);r.compiler.config.header.length>0&&f.endsWith(\".mcfunction\")&&(g=r.compiler.config.header+`\n`+g),r.compiler.io.write(f,g)}compileDirectory(e,n,i,a){n=this.injectValues(n,a,e);let r=a.namespace,o=a.variables,l=a.path.concat([n]),c=new rh,d={append:function(p){throw new Je(Qe.formatContext(\"append not available for directory context\",e,a),!0,[e].concat(a.stack))},namespace:r,path:l??[],uidIndex:c,variables:o,stack:a.stack,replacements:a.replacements,isTemplate:this.ext==\"mcbt\",templates:a.templates,requireTemplateKeyword:a.requireTemplateKeyword,compiler:a.compiler,globalVariables:a.globalVariables,functions:a.functions,baseNamespaceInfo:a.baseNamespaceInfo,currentFunction:a.currentFunction},u=0;for(;u<i.length;){let p=i[u];++u,this.compileTld(p,d)}}transformTld(e,n){let i=this;switch(e._hx_index){case 1:let a=e.pos,r=e.name,o=e.body,l=e.appendTo,c=this.injectValues(r,n,a),d=[],u=0;for(;u<o.length;){let ge=o[u];++u,d.push(this.transformCommand(ge,n))}return pe.FunctionDef(a,c,d,l);case 3:let p=e.pos,m=e.name,f=e.body,g=this.injectValues(m,n,p),x=[],_=0;for(;_<f.length;){let ge=f[_];++_,x.push(this.transformTld(ge,n))}return pe.Directory(p,g,x);case 5:let h=e.pos,v=e.expression,b=e.as,y=e.body,w=[];return this.processCompilerLoop(v,b,n,y,h,function(ge,V){w.push(i.transformTld(V,ge))}),pe.Group(w);break;case 6:let S=e.pos,F=e.expression,N=e.body,k=e.elseExpressions;return this.transformCompileTimeIf(F,N,k,S,n,function(ge){return i.transformTld(ge,n)});case 7:let R=e.pos,D=e.value;return this.processMlScriptTransform(n,R,D,!0);case 15:let B=e.pos,q=e.value;return e;case 16:let G=e.pos,W=e.name,ee=e.info;if(ee._hx_index==0){let ge=ee.subType,V=ee.replace,H=ee.entries,re=[],xe=0;for(;xe<H.length;){let fe=H[xe];++xe;let te;switch(fe._hx_index){case 0:let Y=fe.continuations;if(Y==null)throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",G,n),!1,[G].concat(n.stack));if(Y.length==0)if(fe.isMacro==!1){let Tt=fe.pos,tn=fe.value;te=this.injectValues(tn,n,Tt)}else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",G,n),!1,[G].concat(n.stack));else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",G,n),!1,[G].concat(n.stack));break;case 15:let we=fe.pos,Le=fe.value;te=this.injectValues(Le,n,we);break;default:throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",G,n),!1,[G].concat(n.stack))}re.push(pe.Raw(G,this.injectValues(te,n,G),[],!1))}return pe.JsonFile(G,W,Yt.Tag(ge,V,re))}else return pe.JsonFile(G,this.injectValues(W,n,G),ee);break;case 18:let Z=e.pos,me=e.name,X=e.time,Q=e.body,he=[],Ie=0;for(;Ie<Q.length;){let ge=Q[Ie];++Ie,he.push(this.transformCommand(ge,n))}return pe.ClockExpr(Z,me,X,he);default:let le=e.pos;throw new Je(Qe.formatContext(\"unexpected node type:\"+Ge.string(e),le,n),!0,[le].concat(n.stack))}}compileTld(e,n){let i=this;switch(e._hx_index){case 1:let a=e.pos,r=e.name,o=e.body,l=e.appendTo;if(!n.isTemplate)this.compileFunction(a,r,o,l,n);else{let V=e.pos;throw new Je(Qe.formatContext(\"unexpected node type:\"+Ge.string(e),V,n),!0,[V].concat(n.stack))}break;case 3:let c=e.pos,d=e.name,u=e.body;this.compileDirectory(c,d,u,n);break;case 5:let p=e.pos,m=e.expression,f=e.as,g=e.body;this.processCompilerLoop(m,f,n,g,p,function(V,H){i.compileTld(H,V)});break;case 6:let x=e.pos,_=e.expression,h=e.body,v=e.elseExpressions;this.compileTimeIf(_,h,v,x,n,function(V){i.compileTld(V,n)});break;case 7:let b=e.pos,y=e.value;this.processMlScript(n,b,y,!0);break;case 15:let w=e.pos,S=e.value;break;case 16:let F=e.pos,N=e.name,k=e.info;this.compileJsonFile(F,N,k,n);break;case 18:let R=e.pos,D=e.name,B=e.time,q=e.body,G=[],W=n.path,ee={append:function(V){G.push(V)},namespace:n.namespace,path:W??[],uidIndex:n.uidIndex,variables:n.variables,stack:n.stack,replacements:n.replacements,isTemplate:this.ext==\"mcbt\",templates:n.templates,requireTemplateKeyword:n.requireTemplateKeyword,compiler:n.compiler,globalVariables:n.globalVariables,functions:n.functions,baseNamespaceInfo:n.baseNamespaceInfo,currentFunction:n.currentFunction},Z=Ge.string(n.uidIndex.get()),me=(D==null?n.path.concat([n.compiler.config.generatedDirName,\"\"+Z]):n.path.concat([D])).join(\"/\"),X=n.namespace+\":\"+me;G.push(\"schedule function \"+X+\" \"+B+\" replace\");let Q=0;for(;Q<q.length;){let V=q[Q];++Q,this.compileCommand(V,ee)}let he=G.join(`\n`),Ie=Ze.join([\"data\",n.namespace,this.functionsDir,\"\"+me+\".mcfunction\"]),le=he;n.compiler.config.header.length>0&&Ie.endsWith(\".mcfunction\")&&(le=n.compiler.config.header+`\n`+le),n.compiler.io.write(Ie,le),n.compiler.tags.addTagEntry(\"minecraft:load\",X,n);break;default:let ge=e.pos;throw new Je(Qe.formatContext(\"unexpected node type:\"+Ge.string(e),ge,n),!0,[ge].concat(n.stack))}}compileJsonFileImpl(e,n,i,a,r){let o=\"{\"+this.stringifyJsonTag(e,n,a,r)+\"}\",l;switch(i._hx_index){case 1:let u=i.entries;l=r.compiler.config.features.useFolderRenames48?\"advancement\":\"advancements\";break;case 2:let p=i.entries;l=r.compiler.config.features.useFolderRenames48?\"item_modifier\":\"item_modifiers\";break;case 3:let m=i.entries;l=r.compiler.config.features.useFolderRenames48?\"loot_table\":\"loot_tables\";break;case 4:let f=i.entries;l=r.compiler.config.features.useFolderRenames48?\"predicate\":\"predicates\";break;case 5:let g=i.entries;l=r.compiler.config.features.useFolderRenames48?\"recipe\":\"recipes\";break;case 6:let x=i.entries;l=\"chat\";break;case 7:let _=i.entries;l=\"damage\";break;case 8:let h=i.entries;l=\"dimension\";break;case 9:let v=i.entries;l=\"dimension_type\";break;case 10:let b=i.entries;l=\"enchantment\";break;default:throw new Je(Qe.formatContext(\"unexpected json tag type:\"+Ge.string(i),e,r),!0,[e].concat(r.stack))}let c=Ze.join([\"data\",r.namespace,l].concat(r.path.concat([n+\".json\"]))),d=o;r.compiler.config.header.length>0&&c.endsWith(\".mcfunction\")&&(d=r.compiler.config.header+`\n`+d),r.compiler.io.write(c,d)}compileJsonFile(e,n,i,a){switch(i._hx_index){case 0:let r=i.subType,o=i.replace,l=i.entries;if(r==\"function\"||r==\"functions\"){n=a.namespace+\":\"+a.path.concat([n]).join(\"/\"),a.compiler.tags.ensureTag(n,a);let N=0;for(;N<l.length;){let k=l[N];switch(++N,k._hx_index){case 0:let R=k.continuations;if(R==null)throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));if(R.length==0)if(k.isMacro==!1){let q=k.pos,G=k.value;if(G=this.injectValues(G,a,q),G.indexOf(\" \")!=-1&&G.endsWith(\" replace\"))a.compiler.tags.addTagEntry(n,this.evaluateFunctionHandle(G.substring(0,G.length-8),a,q,!1),a,!0);else{if(G.indexOf(\" \")!=-1)throw new Je(Qe.formatContext(\"Malformed tag entry\",q,a),!1,[q].concat(a.stack));a.compiler.tags.addTagEntry(n,this.evaluateFunctionHandle(G,a,q,!1),a,!1)}}else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));break;case 15:let D=k.pos,B=k.value;if(B=this.injectValues(B,a,D),B.indexOf(\" \")!=-1&&B.endsWith(\" replace\"))a.compiler.tags.addTagEntry(n,this.evaluateFunctionHandle(B.substring(0,B.length-8),a,D,!1),a,!0);else{if(B.indexOf(\" \")!=-1)throw new Je(Qe.formatContext(\"Malformed tag entry\",D,a),!1,[D].concat(a.stack));a.compiler.tags.addTagEntry(n,this.evaluateFunctionHandle(B,a,D,!1),a,!1)}break;default:throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack))}}o&&a.compiler.tags.setTagReplace(n,a,!0)}else{let N=[],k=0;for(;k<l.length;){let W=l[k];++k;let ee;switch(W._hx_index){case 0:let Z=W.continuations;if(Z==null)throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));if(Z.length==0)if(W.isMacro==!1){let Q=W.pos,he=W.value;if(he=this.injectValues(he,a,Q),he.indexOf(\" \")!=-1&&he.endsWith(\" replace\"))ee={id:this.evaluateFunctionHandle(he.substring(0,he.length-8),a,Q,!1),replace:!0};else{if(he.indexOf(\" \")!=-1)throw new Je(Qe.formatContext(\"Malformed tag entry\",Q,a),!1,[Q].concat(a.stack));ee=this.evaluateFunctionHandle(he,a,Q,!1)}}else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));else throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack));break;case 15:let me=W.pos,X=W.value;if(X=this.injectValues(X,a,me),X.indexOf(\" \")!=-1&&X.endsWith(\" replace\"))ee={id:this.evaluateFunctionHandle(X.substring(0,X.length-8),a,me,!1),replace:!0};else{if(X.indexOf(\" \")!=-1)throw new Je(Qe.formatContext(\"Malformed tag entry\",me,a),!1,[me].concat(a.stack));ee=this.evaluateFunctionHandle(X,a,me,!1)}break;default:throw new Je(Qe.formatContext(\"Unexpected node type in json tag\",e,a),!1,[e].concat(a.stack))}N.push(ee)}let R=JSON.stringify({replace:o,values:N}),D=r.charAt(r.length-1)==\"s\",B=a.compiler.config.features.useFolderRenames48?D?r.substring(0,r.length-1):r:D?r:r+\"s\",q=Ze.join([\"data\",a.namespace,this.tagsDir,B].concat(a.path.concat([n+\".json\"]))),G=R;a.compiler.config.header.length>0&&q.endsWith(\".mcfunction\")&&(G=a.compiler.config.header+`\n`+G),a.compiler.io.write(q,G)}break;case 1:let c=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,c,a);break;case 2:let d=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,d,a);break;case 3:let u=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,u,a);break;case 4:let p=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,p,a);break;case 5:let m=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,m,a);break;case 6:let f=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,f,a);break;case 7:let g=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,g,a);break;case 8:let x=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,x,a);break;case 9:let _=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,_,a);break;case 10:let h=i.entries;n=this.injectValues(n,a,e),this.compileJsonFileImpl(e,n,i,h,a);break;case 11:let v=i.subType,b=i.name,y=i.entries;b=this.injectValues(b,a,e);let w=\"{\"+this.stringifyJsonTag(e,b,y,a)+\"}\",S=Ze.join([\"data\",a.namespace,\"worldgen\",v].concat(a.path.concat([b+\".json\"]))),F=w;a.compiler.config.header.length>0&&S.endsWith(\".mcfunction\")&&(F=a.compiler.config.header+`\n`+F),a.compiler.io.write(S,F);break}}processCompilerLoop(e,n,i,a,r,o){let c=rl.invokeExpressionInline(e,i,r);for(;c.hasNext();){let d=c.next();if(n==null){let u=0;for(;u<a.length;){let p=a[u];++u,o(i,p)}}else{let u=new et;if(n.length==1)u.inst.set(n[0],d);else if(Array.isArray(n)){if(d.length<n.length)throw new Je(Qe.formatContext(\"Failed to destructure as there are fewer elements then requested\",r,i),!1,[r].concat(i.stack));let v=0,b=n.length;for(;v<b;){let y=v++;u.inst.set(n[y],d[y])}}else throw new Je(Qe.formatContext(\"Invalid as clause\",r,i),!1,[r].concat(i.stack));let p=i.namespace,m=i.append,f=i.variables,g=u==null?f:new Gt(f,u),x=i.path,_={append:m,namespace:p,path:x??[],uidIndex:i.uidIndex,variables:g,stack:i.stack,replacements:i.variables,isTemplate:this.ext==\"mcbt\",templates:i.templates,requireTemplateKeyword:i.requireTemplateKeyword,compiler:i.compiler,globalVariables:i.globalVariables,functions:i.functions,baseNamespaceInfo:i.baseNamespaceInfo,currentFunction:i.currentFunction},h=0;for(;h<a.length;){let v=a[h];++h,o(_,v)}}}}stringifyJsonTag(e,n,i,a){n=this.injectValues(n,a,e);let r=[],o=a.path,l={append:function(u){r.push(u)},namespace:a.namespace,path:o??[],uidIndex:a.uidIndex,variables:a.variables,stack:a.stack,replacements:a.replacements,isTemplate:this.ext==\"mcbt\",templates:a.templates,requireTemplateKeyword:a.requireTemplateKeyword,compiler:a.compiler,globalVariables:a.globalVariables,functions:a.functions,baseNamespaceInfo:a.baseNamespaceInfo,currentFunction:a.currentFunction},c=this,d=0;for(;d<i.length;){let u=i[d];switch(++d,u._hx_index){case 0:if(u.isMacro==!1){let y=u.continuations,w=u.value,S=u.pos;if(y!=null&&y.length>0)throw new Je(Qe.formatContext(\"Unexpected extra data in json tag\",S,a),!1,[S].concat(a.stack));r.push(this.injectValues(w,a,S))}else{let y=u.pos;throw new Je(Qe.formatContext(\"unexpected node type:\"+Ge.string(u),y,a),!0,[y].concat(a.stack))}break;case 5:let p=u.pos,m=u.expression,f=u.as,g=u.body;this.processCompilerLoop(m,f,a,g,p,function(y,w){c.compileCommand(w,y)});break;case 6:let x=u.pos,_=u.expression,h=u.body,v=u.elseExpressions;this.compileTimeIf(_,h,v,x,l,function(y){c.compileCommand(y,a)});break;default:let b=u.pos;throw new Je(Qe.formatContext(\"unexpected node type:\"+Ge.string(u),b,a),!0,[b].concat(a.stack))}}return r.join(\"\")}injectValues(e,n,i){if(e==null)return\"\";if(e.indexOf(\"<%\")==-1)return e;let a=n.variables.get(),r=[\"embed\",\"context\"],o=this,l=[function(_){return _.embedTo(n,i,o)},n],c=a,d=c,u=c.keys();for(;u.hasNext();){let _=u.next(),h=d.get(_),b=_,y=h;r.push(b),l.push(y)}let p=[],m=[],f=0,g=e.split(\"<%\");for(;f<g.length;){let _=g[f];++f;let h=_.split(\"%>\");h.length==1?(m.push(h[0]),p.push(\"$$context[\"+Ge.string(m.length-1)+\"]\")):(p.push(h[0]),m.push(h[1]),p.push(\"$$context[\"+Ge.string(m.length-1)+\"]\"))}let x=\"return ([\"+p.join(\",\")+\"].join(''));\";try{return new Function(...r,\"$$context\",x).apply(null,l.concat([m]))}catch(_){let h=ne.caught(_);throw new Je(Qe.formatContext(Xt.format(\"Encountered an error whilst evaluating expression '{}' at {}:{}:{}\",h.get_message(),i.file,i.line,i.col+1),i,n),!1,[i].concat(n.stack))}}transformCompileTimeIf(e,n,i,a,r,o,l){if(l==null&&(l=!1),rl.invokeExpressionInline(e,r,a)){let d=[],u=0;for(;u<n.length;){let p=n[u];++u,d.push(o(p))}return pe.Group(d)}else{let d=0;for(;d<i.length;){let u=i[d];if(++d,u.condition==null?!0:rl.invokeExpressionInline(u.condition,r,a)){let m=[],f=0,g=u.node;for(;f<g.length;){let x=g[f];++f,m.push(o(x))}return pe.Group(m)}}return pe.Void}}compileTimeIf(e,n,i,a,r,o,l){if(l==null&&(l=!1),rl.invokeExpressionInline(e,r,a)){let d=0;for(;d<n.length;){let u=n[d];++d,o(u)}}else{let d=0;for(;d<i.length;){let u=i[d];if(++d,u.condition==null?!0:rl.invokeExpressionInline(u.condition,r,a)){let m=0,f=u.node;for(;m<f.length;){let g=f[m];++m,o(g)}return}}}}transform(e,n){let i=n.getInitialPathInfo(this.name),a=new et,r=0,o=sn.fields(this.fileJs);for(;r<o.length;){let h=o[r];++r,a.inst.set(h,sn.field(this.fileJs,h))}let l=new Gt(e,a),c=i.namespace,d=new Gt(l,rs.map),u=i.path,p=new rh,m=new Gt(null,new et),f={append:function(h){throw new Je(\"append not available for top-level context\",!0)},namespace:c,path:u??[],uidIndex:p,variables:d,stack:[],replacements:m,isTemplate:this.ext==\"mcbt\",templates:this.templates,requireTemplateKeyword:this.ext==\"mcbt\",compiler:n,globalVariables:l,functions:[],baseNamespaceInfo:i,currentFunction:null};if(f.isTemplate){if(this.ast.length>0){let h=this.ast[0].pos;throw new Je(Qe.formatContext(\"Unexpected top-level content in template file\",h,f),!1,[h].concat(f.stack))}return[pe.Void]}let g=[],x=0,_=this.ast;for(;x<_.length;){let h=_[x];++x;let v;switch(h._hx_index){case 2:let b=h.pos,y=h.name,w=h.body;throw new Je(\"import or template definition found after setup\",!0);case 4:let S=h.pos,F=h.name;throw new Je(\"import or template definition found after setup\",!0);default:v=this.transformTld(h,f)}g.push(v)}return g}compile(e,n){let i=n.getInitialPathInfo(this.name),a=new et,r=0,o=sn.fields(this.fileJs);for(;r<o.length;){let _=o[r];++r,a.inst.set(_,sn.field(this.fileJs,_))}let l=new Gt(e,a),c=i.namespace,d=new Gt(l,rs.map),u=i.path,p=new rh,m=new Gt(null,new et),f={append:function(_){throw new Je(\"append not available for top-level context\",!0)},namespace:c,path:u??[],uidIndex:p,variables:d,stack:[],replacements:m,isTemplate:this.ext==\"mcbt\",templates:this.templates,requireTemplateKeyword:this.ext==\"mcbt\",compiler:n,globalVariables:l,functions:[],baseNamespaceInfo:i,currentFunction:null};if(f.isTemplate){if(this.ast.length>0){let _=this.ast[0].pos;throw new Je(Qe.formatContext(\"Unexpected top-level content in template file\",_,f),!1,[_].concat(f.stack))}return}let g=0,x=this.ast;for(;g<x.length;){let _=x[g];switch(++g,_._hx_index){case 2:let h=_.pos,v=_.name,b=_.body;throw new Je(\"import or template definition found after setup\",!0);case 4:let y=_.pos,w=_.name;throw new Je(\"import or template definition found after setup\",!0);default:this.compileTld(_,f)}}if(this.loadCommands.length>0){let _=Ze.join([\"data\",f.namespace,this.functionsDir].concat(f.path.concat([f.compiler.config.generatedDirName,\"load.mcfunction\"]))),h=this.loadCommands.join(`\n`);f.compiler.config.header.length>0&&_.endsWith(\".mcfunction\")&&(h=f.compiler.config.header+`\n`+h),f.compiler.io.write(_,h),n.tags.addTagEntry(\"minecraft:load\",f.namespace+\":\"+f.path.concat([f.compiler.config.generatedDirName,\"load\"]).join(\"/\"),f)}if(this.tickCommands.length>0){let _=Ze.join([\"data\",f.namespace,this.functionsDir].concat(f.path.concat([f.compiler.config.generatedDirName,\"tick.mcfunction\"]))),h=this.tickCommands.join(`\n`);f.compiler.config.header.length>0&&_.endsWith(\".mcfunction\")&&(h=f.compiler.config.header+`\n`+h),f.compiler.io.write(_,h),n.tags.addTagEntry(\"minecraft:tick\",f.namespace+\":\"+f.path.concat([f.compiler.config.generatedDirName,\"tick\"]).join(\"/\"),f)}}static invokeExpressionInline(e,n,i){let a=n.variables.get(),r=[\"context\"],o=[n],l=a,c=l,d=l.keys();for(;d.hasNext();){let p=d.next(),m=c.get(p),g=p,x=m;r.push(g),o.push(x)}let u=\"return (\"+e+\");\";try{return new Function(...r,u).apply(null,o)}catch(p){let m=ne.caught(p);throw new Je(Qe.formatContext(Xt.format(\"Encountered an error whilst evaluating expression '{}' at {}:{}:{}\",m.get_message(),i.file,i.line,i.col+1),i,n),!1,[i].concat(n.stack))}}static get __name__(){return\"mcl.McFile\"}get __class__(){return rl}},\"McFile\");ei.prototype.name=null;ei.prototype.ast=null;ei.prototype.templates=null;ei.prototype.exportedTemplates=null;ei.prototype.imports=null;ei.prototype.ext=null;ei.prototype.loadCommands=null;ei.prototype.tickCommands=null;ei.prototype.fileJs=null;ei.prototype.functionsDir=null;ei.prototype.tagsDir=null;var Fn=j.global(\"$hxClasses\")[\"mcl.Compiler\"]=s(class MC extends j.inherits(){[j.new](e,n,i){this.topLevelAstNodes=new Array,this.success=!0,this.templateParsingEnabled=!0,this.disableRequire=!1,this.packNamespace=\"mcb-\"+Ge.string(new Date),this.tags=new gv,this.libStore=null,this.alreadySetupFiles=new et,this.files=new et,this.io=new zi,this.config=sa.create(n),this.baseDir=e,this.libStore=i}addFile(e,n){let i=new ei(e,n);this.files.inst.set(e,i)}resolve(e,n){if(n.charAt(0)==\".\"||n.charAt(0)==\"/\"){let i;n.charAt(0)==\"/\"?(n=n.substring(1),i=this.baseDir):i=Ze.directory(e);let a=Ze.join([i,n]),r=Ze.extension(n);if(r.endsWith(\"js\")||r==\"json\")return ol.IJsFile(Ee(a));if(this.files.inst.has(a))return this.alreadySetupFiles.inst.has(a)||(this.alreadySetupFiles.inst.set(a,!0),this.files.inst.get(a).setup(this)),ol.IMcFile(this.files.inst.get(a));throw new Je(\"Failed to resolve import: \"+a,!1)}else return ol.IMcFile(this.libStore.lookup(n,{file:e,line:0,col:0},this))}getInitialPathInfo(e){let n=(e.startsWith(this.baseDir)?e.substring(this.baseDir.length):e).split(\"\\\\\").join(\"/\");n.charAt(0)==\"/\"&&(n=n.substring(1));let i=n.split(\"/\"),a=Ze.withoutExtension(i[0]),r=i.slice(1).join(\"/\");return{namespace:a,path:i.length>1?Ze.withoutExtension(r).split(\"/\"):[]}}compile(e){this.success=!0;try{let n=Mt.adaptIterator(this.files.inst.values());for(;n.hasNext();){let a=n.next();this.alreadySetupFiles.inst.has(a.name)||a.setup(this)}let i=Mt.adaptIterator(this.files.inst.values());for(;i.hasNext();)i.next().compile(e,this);this.tags.writeTagFiles(this)}catch(n){let i=ne.caught(n).unwrap();throw this.success=!1,ne.thrown(i)}}transform(e){let n=new Map,i=Mt.adaptIterator(this.files.inst.values());for(;i.hasNext();){let r=i.next();this.alreadySetupFiles.inst.has(r.name)||r.setup(this)}let a=Mt.adaptIterator(this.files.inst.values());for(;a.hasNext();){let r=a.next();this.topLevelAstNodes=[],n.set(r.name,pe.Group(r.transform(e,this).concat(this.topLevelAstNodes)))}return n}addTopLevelAstNode(e){this.topLevelAstNodes.push(e)}static get __name__(){return\"mcl.Compiler\"}get __class__(){return MC}},\"Compiler\");Fn.prototype.io=null;Fn.prototype.files=null;Fn.prototype.alreadySetupFiles=null;Fn.prototype.libStore=null;Fn.prototype.baseDir=null;Fn.prototype.tags=null;Fn.prototype.packNamespace=null;Fn.prototype.config=null;Fn.prototype.disableRequire=null;Fn.prototype.templateParsingEnabled=null;Fn.prototype.success=null;Fn.prototype.topLevelAstNodes=null;var F7e=j.$global,oh=j.global(\"$hxClasses\")[\"mcl.args.JsTemplateArgument\"]=s(class Vv extends j.inherits(()=>dt,!0){[j.new](e,n){super[j.new](e,n),this.expectJsValue=!0}parseValue(e,n,i){if(e.startsWith(\"<%\")){let a=e.indexOf(\"%>\");if(a==-1)return{success:!1};let r=e.substring(2,a);try{let o=dt.jsCacheIdx,l=dt.jsCache.inst.has(o),c;return l?c=dt.jsCache.inst.get(o):(c=ei.invokeExpressionInline(r,i,n),dt.jsCache.inst.set(o,c)),{success:!0,value:c,raw:e.substring(0,a+2)}}catch{return{success:!1}}}return{success:!1}}static register(){dt.register(\"js\",Vv)}static get __name__(){return\"mcl.args.JsTemplateArgument\"}static get __super__(){return dt}get __class__(){return Vv}},\"JsTemplateArgument\");var L7e=j.$global,zv=j.global(\"$hxClasses\")[\"mcl.args.LiteralTemplateArgument\"]=s(class BC extends j.inherits(()=>dt,!0){[j.new](e,n){this.value=n,super[j.new](null,e)}parseValue(e,n,i){return e==this.value||e.startsWith(this.value+\" \")?{success:!0,value:e,raw:this.value}:{success:!1}}static register(){dt.register(\"literal\",oh)}static get __name__(){return\"mcl.args.LiteralTemplateArgument\"}static get __super__(){return dt}get __class__(){return BC}},\"LiteralTemplateArgument\");zv.prototype.value=null;var W7e=j.$global,dt=j.global(\"$hxClasses\")[\"mcl.args.TemplateArgument\"]=s(class Lc extends j.inherits(){[j.new](e,n){this.expectJsValue=!1,this.expectBlock=!1,this.name=e,this.pos=n}parseValue(e,n,i){throw ne.thrown(\"override this method in subclass, plz thx\")}parseValueBlock(e,n,i){throw ne.thrown(\"override this method in subclass, plz thx\")}static parse(e,n){let i=e.indexOf(\":\"),a=i==-1?\"literal\":e.substring(i+1),r=i==-1?e:e.substring(0,i);if(a==\"literal\")return new zv(n,r);if(!Lc.argumentTypes.inst.has(a))throw ne.thrown(\"Unknown template argument type: '\"+a+\"'\");return Li.createInstance(Lc.argumentTypes.inst.get(a),[r])}static register(e,n){if(Lc.argumentTypes.inst.has(e))throw ne.thrown(\"Template argument type already registered: \"+e);Lc.argumentTypes.inst.set(e,n)}static get __name__(){return\"mcl.args.TemplateArgument\"}get __class__(){return Lc}},\"TemplateArgument\");dt.prototype.name=null;dt.prototype.pos=null;dt.prototype.expectBlock=null;dt.prototype.expectJsValue=null;dt.jsCache=null;dt.jsCacheIdx=0;dt.argumentTypes=new et;var $7e=j.$global,PC=j.global(\"$hxClasses\")[\"mcl.args.WordTemplateArgument\"]=s(class Uv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){if(e==\"\")return{success:!1};let a=e.indexOf(\" \"),r=a==-1?e:at.substr(e,0,a);return{success:!0,value:r,raw:r}}static register(){dt.register(\"word\",Uv)}static get __name__(){return\"mcl.args.WordTemplateArgument\"}static get __super__(){return dt}get __class__(){return Uv}},\"WordTemplateArgument\");var a9e=j.$global,LC=j.global(\"$hxClasses\")[\"mcl.args.RawTemplateArgument\"]=s(class qv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){return{success:!0,value:e,raw:e}}static register(){dt.register(\"raw\",qv)}static get __name__(){return\"mcl.args.RawTemplateArgument\"}static get __super__(){return dt}get __class__(){return qv}},\"RawTemplateArgument\");var u9e=j.$global,VC=j.global(\"$hxClasses\")[\"mcl.args.IntTemplateArgument\"]=s(class Hv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){let a=e.indexOf(\" \");a!=-1&&(e=e.substring(0,a));let r=Ge.parseInt(e);return r==null?{success:!1}:{success:!0,value:r,raw:e}}static register(){dt.register(\"int\",Hv)}static get __name__(){return\"mcl.args.IntTemplateArgument\"}static get __super__(){return dt}get __class__(){return Hv}},\"IntTemplateArgument\");var h9e=j.$global,zC=j.global(\"$hxClasses\")[\"mcl.args.FloatTemplateArgument\"]=s(class Jv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n)}parseValue(e,n,i){let a=e.indexOf(\" \");a!=-1&&(e=e.substring(0,a));let r=parseFloat(e);return r==null?{success:!1}:{success:!0,value:r,raw:e}}static register(){dt.register(\"float\",Jv)}static get __name__(){return\"mcl.args.FloatTemplateArgument\"}static get __super__(){return dt}get __class__(){return Jv}},\"FloatTemplateArgument\");var j9e=j.$global,Wv=j.global(\"$hxClasses\")[\"mcl.args.BoundBlock\"]=s(class UC extends j.inherits(){[j.new](e,n){this.node=e,this.ctx=n}appendAstNode(e){let n=this.node;if(n._hx_index==8){let i=n.pos,a=n.name,r=n.data,o=n.isMacro,l=n.isInline;n.body.push(e)}else throw ne.thrown(\"BoundBlock.append: node is not a block\")}append(e){let n=Zn.tokenize(e,\"<inline BoundBlock.append>\"),i=new ko(n);for(;i.hasNext();)this.appendAstNode(Xt.innerParse(i))}setName(e){let n=this.node;if(n._hx_index==8){let i=n.name,a=n.pos,r=n.body,o=n.data,l=n.isMacro,c=n.isInline;this.node=pe.Block(a,e,r,o,l,c)}else throw ne.thrown(\"BoundBlock.setName: node is not a block\")}embedTo(e,n,i,a){a==null&&(a=!0);let r=[],o={isTemplate:!1,uidIndex:e.uidIndex,namespace:e.namespace,path:e.path,variables:this.ctx.variables,replacements:this.ctx.replacements,stack:this.ctx.stack,append:function(l){r.push(l)},templates:this.ctx.templates,requireTemplateKeyword:this.ctx.requireTemplateKeyword,compiler:this.ctx.compiler,globalVariables:this.ctx.globalVariables,functions:this.ctx.functions,baseNamespaceInfo:e.baseNamespaceInfo,currentFunction:this.ctx.currentFunction};return a?i.embed(o,n,new et,[this.node]):i.embedTransform(o,n,new et,[this.node]),r.join(`\n`)}static get __name__(){return\"mcl.args.BoundBlock\"}get __class__(){return UC}},\"BoundBlock\");Wv.prototype.node=null;Wv.prototype.ctx=null;var qC=j.global(\"$hxClasses\")[\"mcl.args.BlockTemplateArgument\"]=s(class Gv extends j.inherits(dt){[j.new](e,n){super[j.new](e,n),this.expectBlock=!0}parseValueBlock(e,n,i){if(e._hx_index==8){let a=e.pos,r=e.name,o=e.body,l=e.data,c=e.isMacro,d=e.isInline;return{success:!0,value:new Wv(e,i)}}else return{success:!1}}static register(){dt.register(\"block\",Gv)}static get __name__(){return\"mcl.args.BlockTemplateArgument\"}static get __super__(){return dt}get __class__(){return Gv}},\"BlockTemplateArgument\");var R9e=j.$global,sh=j.global(\"$hxClasses\")[\"mcl.TemplateRegisterer\"]=s(class HC{static register(){LC.register(),VC.register(),oh.register(),qC.register(),zC.register(),PC.register()}static get __name__(){return\"mcl.TemplateRegisterer\"}get __class__(){return HC}},\"TemplateRegisterer\");var JC=wi(Ee(\"fs\"));var G9e=j.$global,Yv=j.global(\"$hxClasses\").LibMain=s(class Kv{static main(){sh.register()}static createCompiler(e,n,i){return new Fn(e,n,i)}static parseFile(e,n){let i=Ze.extension(e),a=Zn.tokenize(n,e);if(i==\"mcb\")return Xt.parseMcbFile(a);if(i==\"mcbt\")return Xt.parseMcbtFile(a);throw ne.thrown(\"Unknown file extension: \"+i)}static addFileToCompiler(e,n){let i=Ze.extension(n),a=Zn.tokenize(JC.readFileSync(n,{encoding:\"utf8\"}),n);e.addFile(n,i==\"mcb\"?Xt.parseMcbFile(a):Xt.parseMcbtFile(a))}static compileFromFsLikeMap(e,n,i){let a=Kv.createCompiler(e,{},null),r=n.entries(),o=r,l=r.next();for(;!l.done;){let c=l.value;l=o.next();let d=c,u=Zn.tokenize(d[1],d[0]),p=Ze.extension(d[0])==\"mcb\"?Xt.parseMcbFile(u):Xt.parseMcbtFile(u);a.addFile(d[0],p)}a.io=i,a.compile(new Gt(null))}static createIoProvider(e){switch(e){case 0:return new zi;case 1:return new Ui;default:return new Vr(e)}}static get __name__(){return\"LibMain\"}get __class__(){return Kv}},\"LibMain\");var $9e=j.$global,lh=j.global(\"$hxClasses\")[\"mcl.AstStringifier\"]=s(class Xv extends j.inherits(){[j.new](){this.tabs=[\"\"],this.indent=0,this.segments=[]}tab(){let e;if(this.tabs.length>this.indent)e=this.tabs[this.indent];else{let n=this.tabs[this.tabs.length-1],i=this.tabs.length-1,a=this.indent;for(;i<a;){let r=i++;this.tabs[r]=n,n+=\"\t\"}e=n}this.segments.push(e)}inc(){this.indent++}dec(){this.indent--}literal(e){this.segments.push(e)}write(e,n,i){switch(n==null&&(n=!0),i==null&&(i=!1),!n&&this.segments[this.segments.length-1].endsWith(\"\\\\\")&&(this.segments.push(`\n`),n=!0),e._hx_index){case 0:let a=e.pos,r=e.value,o=e.continuations,l=e.isMacro;if(n&&this.tab(),l&&this.segments.push(\"$\"),this.segments.push(r),o.length>0)throw ne.thrown(\"continuations not supported\");this.segments.push(`\n`);break;case 1:let c=e.pos,d=e.name,u=e.body,p=e.appendTo;n&&this.tab(),this.segments.push(\"function \"),this.segments.push(d),p!=null&&(this.segments.push(\" \"),this.segments.push(p)),this.segments.push(`{\n`),this.inc();let m=0;for(;m<u.length;){let ht=u[m];++m,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 2:let f=e.pos,g=e.name,x=e.body;throw ne.thrown(\"template def not supported\");case 3:let _=e.pos,h=e.name,v=e.body;n&&this.tab(),this.segments.push(\"dir \"),this.segments.push(h),this.segments.push(`{\n`),this.inc();let b=0;for(;b<v.length;){let ht=v[b];++b,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 4:let y=e.pos,w=e.name;n&&this.tab(),this.segments.push(\"import \"),this.segments.push(w),this.segments.push(`\n`);break;case 5:let S=e.pos,F=e.expression,N=e.as,k=e.body;n&&this.tab(),this.segments.push(\"REPEAT(\"+F+\") as \"+Ge.string(N)+\" {\"),this.inc();let R=0;for(;R<k.length;){let ht=k[R];++R,this.write(ht)}this.dec(),this.segments.push(`}\n`);break;case 6:let D=e.pos,B=e.expression,q=e.body,G=e.elseExpressions;n&&this.tab(),this.segments.push(\"IF(\"+B+\") {\"),this.inc();let W=0;for(;W<q.length;){let ht=q[W];++W,this.write(ht)}this.dec(),this.tab(),this.segments.push(\"}\");let ee=0;for(;ee<G.length;){let ht=G[ee];++ee,this.segments.push(\" ELSE \"+(ht.condition==null?\"IF(\"+ht.condition+\")\":\"\")+\" {\"),this.inc();let ca=0,ua=ht.node;for(;ca<ua.length;){let fr=ua[ca];++ca,this.write(fr)}this.dec(),this.tab(),this.segments.push(\"}\")}this.segments.push(`\n`);break;case 7:let Z=e.pos,me=e.value;throw ne.thrown(\"multi line script not supported\");case 8:let X=e.pos,Q=e.name,he=e.body,Ie=e.data,le=e.isMacro,ge=e.isInline;n&&this.tab(),le&&!i&&this.segments.push(\"$\"),i||this.segments.push(\"block\"),Q!=null&&Q!=\"\"&&(this.segments.push(\" \"),this.segments.push(Q),this.segments.push(\" \")),this.segments.push(\"{\"+(Ie==null?\"\":\" \"+Ie)+`\n`),this.inc();let V=0;for(;V<he.length;){let ht=he[V];++V,this.write(ht)}this.dec(),this.tab(),this.segments.push(\"}\"),n&&this.segments.push(`\n`);break;case 9:let H=e.pos,re=e.body;n&&this.tab(),this.segments.push(`tick {\n`),this.inc();let xe=0;for(;xe<re.length;){let ht=re[xe];++xe,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 10:let fe=e.pos,te=e.body;n&&this.tab(),this.segments.push(`load {\n`),this.inc();let Y=0;for(;Y<te.length;){let ht=te[Y];++Y,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 11:let we=e.pos,Le=e.execute,Tt=e.data,tn=e.body,kn=e.continuations,Rn=e.isMacro;n&&this.tab(),Rn&&this.segments.push(\"$\"),this.segments.push(Le),this.segments.push(\" {\"+(Tt==null?\"\":\" \"+Tt)+`\n`),this.inc();let ii=0;for(;ii<tn.length;){let ht=tn[ii];++ii,this.write(ht)}this.dec(),this.tab(),this.segments.push(\"}\");let Ft=0,$t=kn.length-1,ai=0;for(;ai<kn.length;){let ht=kn[ai];if(++ai,ht._hx_index==8){let ca=ht.pos,ua=ht.name,fr=ht.body,hs=ht.data,gs=ht.isMacro,_s=ht.isInline;if(ua==null){let xs=ca,vs=fr,_p=hs,Zr=gs,vl=_s;this.segments.push(\" else \"+(Zr?\"$\":\"\")+\"run \"),this.write(ht,!1,!0)}else if(ua==\"\"){let xs=ca,vs=fr,_p=hs,Zr=gs,vl=_s;this.segments.push(\" else \"+(Zr?\"$\":\"\")+\"run \"),this.write(ht,!1,!0)}else this.segments.push(\" else \"),this.write(ht,!1,!0)}else this.segments.push(\" else \"),this.write(ht,!1,!0);++Ft}n&&this.segments.push(`\n`);break;case 12:let cr=e.pos,Fa=e.delay,Na=e.type,Ra=e.body,ur=e.isMacro;n&&this.tab(),ur&&this.segments.push(\"$\"),this.segments.push(\"schedule \"),this.segments.push(Fa),this.segments.push(\" \"),this.segments.push(Na),this.segments.push(` {\n`),this.inc();let Fi=0;for(;Fi<Ra.length;){let ht=Ra[Fi];++Fi,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 15:let Gr=e.pos,Ma=e.value;n&&this.tab(),this.segments.push(\"# \"),this.segments.push(Ma),this.segments.push(`\n`);break;case 16:let Wr=e.pos,Wi=e.name,Ne=e.info;switch(this.tab(),Ne._hx_index){case 0:let ht=Ne.subType,ca=Ne.replace,ua=Ne.entries;this.segments.push(\"tag \"),this.segments.push(ht),this.segments.push(\" \"),this.segments.push(Wi),ca&&this.segments.push(\" replace\"),this.segments.push(` {\n`),this.inc();let fr=0;for(;fr<ua.length;){let Zr=ua[fr];++fr,this.write(Zr)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 11:let hs=Ne.subType,gs=Ne.name,_s=Ne.entries;this.segments.push(\"worldgen \"),this.segments.push(gs),this.segments.push(` {\n`),this.inc();let xs=0;for(;xs<_s.length;){let Zr=_s[xs];++xs,this.write(Zr)}this.dec(),this.tab(),this.segments.push(`}\n`);break;default:let vs=Ne,_p=sn.getProperty(vs,\"entries\");this.segments.push(Ge.string(vs))}break;case 18:let Un=e.pos,Kr=e.name,dr=e.time,Yr=e.body;n&&this.tab(),this.segments.push(\"clock \"),this.segments.push(Kr),this.segments.push(\" \"),this.segments.push(dr),this.segments.push(` {\n`),this.inc();let pr=0;for(;pr<Yr.length;){let ht=Yr[pr];++pr,this.write(ht)}this.dec(),this.tab(),this.segments.push(`}\n`);break;case 19:let _l=e.pos,So=e.command,mr=e.value,Xr=e.isMacro;n&&this.tab(),Xr&&this.segments.push(\"$\"),this.segments.push(So),this.segments.push(\" \"),this.write(mr,!1),this.segments.push(`\n`);break;case 20:let ps=e.pos,ce=e.name,ln=e.data,Ba=e.isMacro;n&&this.tab(),Ba&&this.segments.push(\"$\"),this.segments.push(\"function \"),this.segments.push(ce),ln!=null&&ln!=\"\"&&(this.segments.push(\" \"),this.segments.push(ln)),this.segments.push(`\n`);break;case 21:let $c=e.pos,hp=e.command;n&&this.tab(),this.segments.push(\"eq \"+hp),this.segments.push(`\n`);break;case 22:let pg=e.pos,xl=e.delay,gp=e.target,eu=e.mode,Se=e.isMacro;n&&this.tab(),Se&&this.segments.push(\"$\"),this.segments.push(\"schedule function \"),this.segments.push(gp),this.segments.push(\" \"),this.segments.push(xl),this.segments.push(\" \"),this.segments.push(eu),this.segments.push(`\n`);break;case 23:let ue=e.pos,tt=e.value,mg=e.isMacro;n&&this.tab(),mg&&this.segments.push(\"$\"),this.segments.push(\"return run \"),this.inc(),this.write(tt,!1,!0),this.dec(),this.segments.push(`\n`);break;case 24:let py=e.pos,fg=e.target,hg=e.isMacro;n&&this.tab(),hg&&this.segments.push(\"$\"),this.segments.push(\"schedule clear \"),this.segments.push(fg),this.segments.push(`\n`);break;case 25:break;case 26:let tu=e.body,Oo=n==!1,ms=0;for(;ms<tu.length;){let ht=tu[ms];if(++ms,!n&&!Oo)throw ne.thrown(\"Group should not have multiple children if the location is inline\");this.write(ht,n),Oo=!1}break;default:throw ne.thrown(\"unknown node type: \"+Ge.string(e))}}toString(e){return this.write(e),this.segments.join(\"\")}static stringify(e){return new Xv().toString(e)}static get __name__(){return\"mcl.AstStringifier\"}get __class__(){return Xv}},\"AstStringifier\");lh.prototype.segments=null;lh.prototype.indent=null;lh.prototype.tabs=null;var aVe=j.$global,Zv=j.global(\"$hxClasses\")[\"mcl.error.LibraryError\"]=s(class GC extends j.inherits(Ci){[j.new](e){super[j.new](`Library Error:\n\t`+e,[])}static get __name__(){return\"mcl.error.LibraryError\"}static get __super__(){return Ci}get __class__(){return GC}},\"LibraryError\");var ch=wi(Ee(\"fs\"));var gVe=j.$global,Hd=j.global(\"$hxClasses\")[\"mcl.LibStore\"]=s(class WC extends j.inherits(){[j.new](e){this.loadedLibs=new et,this.libDir=e}lookup(e,n,i){if(this.loadedLibs.inst.has(e))return this.loadedLibs.inst.get(e).inst.get(\"mcblib/\"+e+\".mcbt\");let a=Ze.join([this.libDir,e]);if(xn.exists(a))return this.loadLib(e,a,i,n);throw new Zv(Qe.format(\"Library not found: \"+e,n))}getFilesInDirectory(e){let n=ch.readdirSync(e),i=[],a=0;for(;a<n.length;){let r=n[a];++a;let o=Ze.join([e,r]);xn.isDirectory(o)?i=i.concat(this.getFilesInDirectory(o)):i.push(o)}return i}loadLib(e,n,i,a){let r=Ze.join([n,\"src\",\"mcblib\"]),o=Ze.join([n,\"src\"]);if(!xn.exists(r))throw new Zv(\"Library \"+e+\" does not have a src/mcblib folder\");let l=new Fn(n,{}),c=this.getFilesInDirectory(r),d=new et,u=0;for(;u<c.length;){let p=c[u];++u;let m=Ze.extension(p);if(m!=\"mbt\"&&m!=\"mcbt\")continue;let f=Zn.tokenize(ch.readFileSync(p,{encoding:\"utf8\"}),p),g=m==\"mcb\"?Xt.parseMcbFile(f):Xt.parseMcbtFile(f),x=new ei(p,g);x.setup(i);let _=at.substr(p,o.length+1,null);x.name=_,d.inst.set(_,x)}return this.loadedLibs.inst.set(e,d),d.inst.get(\"mcblib/\"+e+\".mcbt\")}static get __name__(){return\"mcl.LibStore\"}get __class__(){return WC}},\"LibStore\");Hd.prototype.libDir=null;Hd.prototype.loadedLibs=null;var YC=Ee(\"url\"),XC=wi(Ee(\"https\")),ZC=wi(Ee(\"http\"));var yVe=j.$global,er=j.global(\"$hxClasses\")[\"haxe.http.HttpBase\"]=s(class KC extends j.inherits(){[j.new](e){this.url=e,this.headers=[],this.params=[],this.emptyOnData=j.bind(this,this.onData)}get responseData(){return this.get_responseData()}onData(e){}onBytes(e){}onError(e){}onStatus(e){}hasOnData(){return j.bind(this,this.onData)!=this.emptyOnData}success(e){this.responseBytes=e,this.responseAsString=null,this.hasOnData()&&this.onData(this.get_responseData()),this.onBytes(this.responseBytes)}get_responseData(){return this.responseAsString==null&&this.responseBytes!=null&&(this.responseAsString=this.responseBytes.getString(0,this.responseBytes.length,$a.UTF8)),this.responseAsString}static get __name__(){return\"haxe.http.HttpBase\"}get __class__(){return KC}},\"HttpBase\");er.prototype.url=null;er.prototype.responseBytes=null;er.prototype.responseAsString=null;er.prototype.postData=null;er.prototype.postBytes=null;er.prototype.headers=null;er.prototype.params=null;er.prototype.emptyOnData=null;No();var IVe=j.$global,uh=j.global(\"$hxClasses\")[\"haxe.http.HttpNodeJs\"]=s(class QC extends j.inherits(er){[j.new](e){super[j.new](e)}request(e){this.responseAsString=null,this.responseBytes=null,this.responseHeaders=null;let n=new YC.URL(this.url),i=n.protocol==\"https:\",a=n.hostname,r=n.pathname,o=n.port!=null?Ge.parseInt(n.port):i?443:80,l={},c=0,d=this.headers;for(;c<d.length;){let h=d[c];++c;let v=sn.field(l,h.name);v==null&&(v=new Array,l[h.name]=v),v.push(h.value)}(this.postData!=null||this.postBytes!=null)&&(e=!0);let u=null,p=0,m=this.params;for(;p<m.length;){let h=m[p];++p,u==null?u=\"\":u+=\"&\";let v=h.name,b=encodeURIComponent(v)+\"=\",y=h.value;u+=b+encodeURIComponent(y)}let f=r.split(\"?\").length<=1;u!=null&&(r+=(f?\"?\":\"&\")+u);let g={protocol:n.protocol,hostname:a,port:o,method:e?\"POST\":\"GET\",path:r,headers:l},x=this,_=s(function(h){h.setEncoding(\"binary\");let v=h.statusCode;v!=null&&x.onStatus(v);let b=[];h.on(\"data\",function(y){b.push(ks.from(y,\"binary\"))}),h.on(\"end\",function(y){let w=b.length==1?b[0]:ks.concat(b),S=w.buffer.slice(w.byteOffset,w.byteOffset+w.byteLength);x.responseBytes=Oi.ofData(S),x.req=null;let F=new et;x.responseHeaders=F;let N=0,k=sn.fields(h.headers);for(;N<k.length;){let R=k[N];++N,x.responseHeaders.inst.set(R,sn.field(h.headers,R))}v!=null&&v>=200&&v<400?x.success(x.responseBytes):x.onError(\"Http Error #\"+v)})},\"httpResponse\");this.req=i?XC.request(g,_):ZC.request(g,_),e&&(this.postData!=null?this.req.write(this.postData):this.postBytes!=null&&(this.req.setHeader(\"Content-Length\",\"\"+this.postBytes.length),this.req.write(ks.from(this.postBytes.b.bufferValue)))),this.req.end()}static get __name__(){return\"haxe.http.HttpNodeJs\"}static get __super__(){return er}get __class__(){return QC}},\"HttpNodeJs\");uh.prototype.responseHeaders=null;uh.prototype.req=null;var MVe=j.$global,tr=j.global(\"$hxClasses\")[\"haxe.ds.List\"]=s(class $C extends j.inherits(){[j.new](){this.length=0}add(e){let n=new dh(e,null);this.h==null?this.h=n:this.q.next=n,this.q=n,this.length++}push(e){let n=new dh(e,this.h);this.h=n,this.q==null&&(this.q=n),this.length++}first(){return this.h==null?null:this.h.item}pop(){if(this.h==null)return null;let e=this.h.item;return this.h=this.h.next,this.h==null&&(this.q=null),this.length--,e}isEmpty(){return this.h==null}toString(){let e=\"\",n=!0,i=this.h;for(e+=\"{\";i!=null;)n?n=!1:e+=\", \",e+=Ge.string(Ge.string(i.item)),i=i.next;return e+=\"}\",e}static get __name__(){return\"haxe.ds.List\"}get __class__(){return $C}},\"List\");tr.prototype.h=null;tr.prototype.q=null;tr.prototype.length=null;var dh=j.global(\"$hxClasses\")[\"haxe.ds._List.ListNode\"]=s(class eS extends j.inherits(){[j.new](e,n){this.item=e,this.next=n}static get __name__(){return\"haxe.ds._List.ListNode\"}get __class__(){return eS}},\"ListNode\");dh.prototype.item=null;dh.prototype.next=null;var KVe=j.$global,tS=j.global(\"$hxClasses\")[\"haxe._Unserializer.DefaultResolver\"]=s(class nS extends j.inherits(){[j.new](){}resolveClass(e){return j.global(\"$hxClasses\")[e]}resolveEnum(e){return j.global(\"$hxEnums\")[e]}static get __name__(){return\"haxe._Unserializer.DefaultResolver\"}get __class__(){return nS}},\"DefaultResolver\"),nr=j.global(\"$hxClasses\")[\"haxe.Unserializer\"]=s(class Ao extends j.inherits(){[j.new](e){this.buf=e,this.length=this.buf.length,this.pos=0,this.scache=new Array,this.cache=new Array;let n=Ao.DEFAULT_RESOLVER;n==null&&(n=new tS,Ao.DEFAULT_RESOLVER=n),this.resolver=n}readDigits(){let e=0,n=!1,i=this.pos;for(;;){let a=this.buf.charCodeAt(this.pos);if(a!=a)break;if(a==45){if(this.pos!=i)break;n=!0,this.pos++;continue}if(a<48||a>57)break;e=e*10+(a-48),this.pos++}return n&&(e*=-1),e}readFloat(){let e=this.pos;for(;;){let n=this.buf.charCodeAt(this.pos);if(n!=n)break;if(n>=43&&n<58||n==101||n==69)this.pos++;else break}return parseFloat(at.substr(this.buf,e,this.pos-e))}unserializeObject(e){for(;;){if(this.pos>=this.length)throw ne.thrown(\"Invalid object\");if(this.buf.charCodeAt(this.pos)==103)break;let n=this.unserialize();if(typeof n!=\"string\")throw ne.thrown(\"Invalid object key\");let i=this.unserialize();e[n]=i}this.pos++}unserializeEnum(e,n){if(this.buf.charCodeAt(this.pos++)!=58)throw ne.thrown(\"Invalid enum format\");let i=this.readDigits();if(i==0)return Li.createEnum(e,n);let a=new Array;for(;i-- >0;)a.push(this.unserialize());return Li.createEnum(e,n,a)}unserialize(){switch(this.buf.charCodeAt(this.pos++)){case 65:let e=this.unserialize(),n=this.resolver.resolveClass(e);if(n==null)throw ne.thrown(\"Class not found \"+e);return n;case 66:let i=this.unserialize(),a=this.resolver.resolveEnum(i);if(a==null)throw ne.thrown(\"Enum not found \"+i);return a;case 67:let r=this.unserialize(),o=this.resolver.resolveClass(r);if(o==null)throw ne.thrown(\"Class not found \"+r);let l=Object.create(o.prototype);if(this.cache.push(l),l.hxUnserialize(this),this.buf.charCodeAt(this.pos++)!=103)throw ne.thrown(\"Invalid custom data\");return l;case 77:let c=new Ic;this.cache.push(c);let d=this.buf;for(;this.buf.charCodeAt(this.pos)!=104;){let Le=this.unserialize(),Tt=this.unserialize();c.inst.set(Le,Tt)}return this.pos++,c;break;case 82:let u=this.readDigits();if(u<0||u>=this.scache.length)throw ne.thrown(\"Invalid string reference\");return this.scache[u];case 97:let p=this.buf,m=new Array;for(this.cache.push(m);;){let Le=this.buf.charCodeAt(this.pos);if(Le==104){this.pos++;break}if(Le==117){this.pos++;let Tt=this.readDigits();m[m.length+Tt-1]=null}else m.push(this.unserialize())}return m;case 98:let f=new et;this.cache.push(f);let g=this.buf;for(;this.buf.charCodeAt(this.pos)!=104;){let Le=this.unserialize(),Tt=this.unserialize();f.inst.set(Le,Tt)}return this.pos++,f;break;case 99:let x=this.unserialize(),_=this.resolver.resolveClass(x);if(_==null)throw ne.thrown(\"Class not found \"+x);let h=Object.create(_.prototype);return this.cache.push(h),this.unserializeObject(h),h;break;case 100:return this.readFloat();case 102:return!1;case 105:return this.readDigits();case 106:let v=this.unserialize(),b=this.resolver.resolveEnum(v);if(b==null)throw ne.thrown(\"Enum not found \"+v);this.pos++;let y=this.readDigits(),w=b.__constructs__,S=new Array(w.length),F=0,N=w.length;for(;F<N;){let Le=F++;S[Le]=w[Le]._hx_name}let k=S[y];if(k==null)throw ne.thrown(\"Unknown enum index \"+v+\"@\"+y);let R=this.unserializeEnum(b,k);return this.cache.push(R),R;break;case 107:return NaN;case 108:let D=new tr;this.cache.push(D);let B=this.buf;for(;this.buf.charCodeAt(this.pos)!=104;)D.add(this.unserialize());return this.pos++,D;break;case 109:return-1/0;case 110:return null;case 111:let q={};return this.cache.push(q),this.unserializeObject(q),q;break;case 112:return 1/0;case 113:let G=new Fc;this.cache.push(G);let W=this.buf,ee=this.buf.charCodeAt(this.pos++);for(;ee==58;){let Le=this.readDigits(),Tt=this.unserialize();G.inst.set(Le,Tt),ee=this.buf.charCodeAt(this.pos++)}if(ee!=104)throw ne.thrown(\"Invalid IntMap format\");return G;case 114:let Z=this.readDigits();if(Z<0||Z>=this.cache.length)throw ne.thrown(\"Invalid reference\");return this.cache[Z];case 115:let me=this.readDigits(),X=this.buf;if(this.buf.charCodeAt(this.pos++)!=58||this.length-this.pos<me)throw ne.thrown(\"Invalid bytes length\");let Q=Ao.CODES;Q==null&&(Q=Ao.initCodes(),Ao.CODES=Q);let he=this.pos,Ie=me&3,le=(me>>2)*3+(Ie>=2?Ie-1:0),ge=he+(me-Ie),V=new Oi(new ArrayBuffer(le)),H=0;for(;he<ge;){let Le=Q[X.charCodeAt(he++)],Tt=Q[X.charCodeAt(he++)];V.b[H++]=Le<<2|Tt>>4;let tn=Q[X.charCodeAt(he++)];V.b[H++]=Tt<<4|tn>>2;let kn=Q[X.charCodeAt(he++)];V.b[H++]=tn<<6|kn}if(Ie>=2){let Le=Q[X.charCodeAt(he++)],Tt=Q[X.charCodeAt(he++)];if(V.b[H++]=Le<<2|Tt>>4,Ie==3){let tn=Q[X.charCodeAt(he++)];V.b[H++]=Tt<<4|tn>>2}}return this.pos+=me,this.cache.push(V),V;break;case 116:return!0;case 118:let re;return this.buf.charCodeAt(this.pos)>=48&&this.buf.charCodeAt(this.pos)<=57&&this.buf.charCodeAt(this.pos+1)>=48&&this.buf.charCodeAt(this.pos+1)<=57&&this.buf.charCodeAt(this.pos+2)>=48&&this.buf.charCodeAt(this.pos+2)<=57&&this.buf.charCodeAt(this.pos+3)>=48&&this.buf.charCodeAt(this.pos+3)<=57&&this.buf.charCodeAt(this.pos+4)==45?(re=at.strDate(at.substr(this.buf,this.pos,19)),this.pos+=19):re=new Date(this.readFloat()),this.cache.push(re),re;break;case 119:let xe=this.unserialize(),fe=this.resolver.resolveEnum(xe);if(fe==null)throw ne.thrown(\"Enum not found \"+xe);let te=this.unserializeEnum(fe,this.unserialize());return this.cache.push(te),te;break;case 120:throw ne.thrown(this.unserialize());case 121:let Y=this.readDigits();if(this.buf.charCodeAt(this.pos++)!=58||this.length-this.pos<Y)throw ne.thrown(\"Invalid string length\");let we=at.substr(this.buf,this.pos,Y);return this.pos+=Y,we=decodeURIComponent(we.split(\"+\").join(\" \")),this.scache.push(we),we;break;case 122:return 0;default:}throw this.pos--,ne.thrown(\"Invalid char \"+this.buf.charAt(this.pos)+\" at position \"+this.pos)}static initCodes(){let e=new Array,n=0,i=Ao.BASE64.length;for(;n<i;){let a=n++;e[Ao.BASE64.charCodeAt(a)]=a}return e}static get __name__(){return\"haxe.Unserializer\"}get __class__(){return Ao}},\"Unserializer\");nr.prototype.buf=null;nr.prototype.pos=null;nr.prototype.length=null;nr.prototype.cache=null;nr.prototype.scache=null;nr.prototype.resolver=null;nr.DEFAULT_RESOLVER=new tS;nr.BASE64=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%:\";nr.CODES=null;var QVe=j.$global,ph=j.global(\"$hxClasses\").StringBuf=s(class iS extends j.inherits(){[j.new](){this.b=\"\"}static get __name__(){return\"StringBuf\"}get __class__(){return iS}},\"StringBuf\");ph.prototype.b=null;var uze=j.$global,bi=j.global(\"$hxEnums\")[\"haxe._Template.TemplateExpr\"]={__ename__:\"haxe._Template.TemplateExpr\",OpVar:Object.assign(t=>({_hx_index:0,__enum__:\"haxe._Template.TemplateExpr\",v:t,\"@kind\":\"OpVar\"}),{_hx_name:\"OpVar\",__params__:[\"v\"]}),OpExpr:Object.assign(t=>({_hx_index:1,__enum__:\"haxe._Template.TemplateExpr\",expr:t,\"@kind\":\"OpExpr\"}),{_hx_name:\"OpExpr\",__params__:[\"expr\"]}),OpIf:Object.assign((t,e,n)=>({_hx_index:2,__enum__:\"haxe._Template.TemplateExpr\",expr:t,eif:e,eelse:n,\"@kind\":\"OpIf\"}),{_hx_name:\"OpIf\",__params__:[\"expr\",\"eif\",\"eelse\"]}),OpStr:Object.assign(t=>({_hx_index:3,__enum__:\"haxe._Template.TemplateExpr\",str:t,\"@kind\":\"OpStr\"}),{_hx_name:\"OpStr\",__params__:[\"str\"]}),OpBlock:Object.assign(t=>({_hx_index:4,__enum__:\"haxe._Template.TemplateExpr\",l:t,\"@kind\":\"OpBlock\"}),{_hx_name:\"OpBlock\",__params__:[\"l\"]}),OpForeach:Object.assign((t,e)=>({_hx_index:5,__enum__:\"haxe._Template.TemplateExpr\",expr:t,loop:e,\"@kind\":\"OpForeach\"}),{_hx_name:\"OpForeach\",__params__:[\"expr\",\"loop\"]}),OpMacro:Object.assign((t,e)=>({_hx_index:6,__enum__:\"haxe._Template.TemplateExpr\",name:t,params:e,\"@kind\":\"OpMacro\"}),{_hx_name:\"OpMacro\",__params__:[\"name\",\"params\"]})};bi.__constructs__=[bi.OpVar,bi.OpExpr,bi.OpIf,bi.OpStr,bi.OpBlock,bi.OpForeach,bi.OpMacro];bi.__empty_constructs__=[];var qi=j.global(\"$hxClasses\")[\"haxe.Template\"]=s(class ti extends j.inherits(){[j.new](e){let n=this.parseTokens(e);if(this.expr=this.parseBlock(n),!n.isEmpty())throw ne.thrown(\"Unexpected '\"+Ge.string(n.first().s)+\"'\")}execute(e,n){return this.macros=n??{},this.context=e,this.stack=new tr,this.buf=new ph,this.run(this.expr),this.buf.b}resolve(e){if(e==\"__current__\")return this.context;if(sn.isObject(this.context)){let i=sn.getProperty(this.context,e);if(i!=null||Object.prototype.hasOwnProperty.call(this.context,e))return i}let n=this.stack.h;for(;n!=null;){let i=n.item;n=n.next;let a=i,r=sn.getProperty(a,e);if(r!=null||Object.prototype.hasOwnProperty.call(a,e))return r}return sn.field(ti.globals,e)}parseTokens(e){let n=new tr;for(;ti.splitter.match(e);){let i=ti.splitter.matchedPos();if(i.pos>0&&n.add({p:at.substr(e,0,i.pos),s:!0,l:null}),at.cca(e,i.pos)==58){n.add({p:at.substr(e,i.pos+2,i.len-4),s:!1,l:null}),e=ti.splitter.matchedRight();continue}let a=i.pos+i.len,r=1,o=[],l=\"\";for(;;){let c=at.cca(e,a);if(++a,c==40)++r;else if(c==41){if(--r,r<=0)break}else if(c==null)throw ne.thrown(\"Unclosed macro parenthesis\");c==44&&r==1?(o.push(l),l=\"\"):l+=String.fromCodePoint(c)}o.push(l),n.add({p:ti.splitter.matched(2),s:!1,l:o}),e=at.substr(e,a,e.length-a)}return e.length>0&&n.add({p:e,s:!0,l:null}),n}parseBlock(e){let n=new tr;for(;;){let i=e.first();if(i==null||!i.s&&(i.p==\"end\"||i.p==\"else\"||at.substr(i.p,0,7)==\"elseif \"))break;n.add(this.parse(e))}return n.length==1?n.first():bi.OpBlock(n)}parse(e){let n=e.pop(),i=n.p;if(n.s)return bi.OpStr(i);if(n.l!=null){let l=new tr,c=0,d=n.l;for(;c<d.length;){let u=d[c];++c,l.add(this.parseBlock(this.parseTokens(u)))}return bi.OpMacro(i,l)}let a=s(function(l){let c=-1,d=l.length;if(at.substr(i,0,d)==l){c=d;let u=0,p=at.substr(i,d,null);for(;u<p.length&&p.charCodeAt(u++)==32;)++c}return c},\"kwdEnd\"),r=a(\"if\");if(r>0){i=at.substr(i,r,i.length-r);let l=this.parseExpr(i),c=this.parseBlock(e),d=e.first(),u;if(d==null)throw ne.thrown(\"Unclosed 'if'\");if(d.p==\"end\")e.pop(),u=null;else if(d.p==\"else\"){if(e.pop(),u=this.parseBlock(e),d=e.pop(),d==null||d.p!=\"end\")throw ne.thrown(\"Unclosed 'else'\")}else d.p=at.substr(d.p,4,d.p.length-4),u=this.parse(e);return bi.OpIf(l,c,u)}let o=a(\"foreach\");if(o>=0){i=at.substr(i,o,i.length-o);let l=this.parseExpr(i),c=this.parseBlock(e),d=e.pop();if(d==null||d.p!=\"end\")throw ne.thrown(\"Unclosed 'foreach'\");return bi.OpForeach(l,c)}return ti.expr_splitter.match(i)?bi.OpExpr(this.parseExpr(i)):bi.OpVar(i)}parseExpr(e){let n=new tr,i=e;for(;ti.expr_splitter.match(e);){let r=ti.expr_splitter.matchedPos(),o=r.pos+r.len;r.pos!=0&&n.add({p:at.substr(e,0,r.pos),s:!0});let l=ti.expr_splitter.matched(0);n.add({p:l,s:l.indexOf('\"')>=0}),e=ti.expr_splitter.matchedRight()}if(e.length!=0){let r=0,o=e;for(;r<o.length;){let l=r,c=o.charCodeAt(r++),d=l;if(c!=32){n.add({p:at.substr(e,d,null),s:!0});break}}}let a;try{if(a=this.makeExpr(n),!n.isEmpty())throw ne.thrown(n.first().p)}catch(r){let o=ne.caught(r).unwrap();if(typeof o==\"string\"){let l=o;throw ne.thrown(\"Unexpected '\"+l+\"' in \"+i)}else throw r}return function(){try{return a()}catch(r){let o=ne.caught(r).unwrap();throw ne.thrown(\"Error : \"+Ge.string(o)+\" in \"+i)}}}makeConst(e){if(ti.expr_trim.match(e),e=ti.expr_trim.matched(1),at.cca(e,0)==34){let i=at.substr(e,1,e.length-2);return function(){return i}}if(ti.expr_int.match(e)){let i=Ge.parseInt(e);return function(){return i}}if(ti.expr_float.match(e)){let i=parseFloat(e);return function(){return i}}let n=this;return function(){return n.resolve(e)}}makePath(e,n){let i=n.first();if(i==null||i.p!=\".\")return e;n.pop();let a=n.pop();if(a==null||!a.s)throw ne.thrown(a.p);let r=a.p;return ti.expr_trim.match(r),r=ti.expr_trim.matched(1),this.makePath(function(){return sn.field(e(),r)},n)}makeExpr(e){return this.makePath(this.makeExpr2(e),e)}skipSpaces(e){let n=e.first();for(;n!=null;){let i=0,a=n.p;for(;i<a.length;)if(a.charCodeAt(i++)!=32)return;e.pop(),n=e.first()}}makeExpr2(e){this.skipSpaces(e);let n=e.pop();if(this.skipSpaces(e),n==null)throw ne.thrown(\"<eof>\");if(n.s)return this.makeConst(n.p);switch(n.p){case\"!\":let i=this.makeExpr(e);return function(){let d=i();return d!=null?d==!1:!0};case\"(\":this.skipSpaces(e);let a=this.makeExpr(e);this.skipSpaces(e);let r=e.pop();if(r==null||r.s)throw ne.thrown(r);if(r.p==\")\")return a;this.skipSpaces(e);let o=this.makeExpr(e);this.skipSpaces(e);let l=e.pop();if(this.skipSpaces(e),l==null||l.p!=\")\")throw ne.thrown(l);switch(r.p){case\"!=\":return function(){return a()!=o()};case\"&&\":return function(){return a()&&o()};case\"*\":return function(){return a()*o()};case\"+\":return function(){return a()+o()};case\"-\":return function(){return a()-o()};case\"/\":return function(){return a()/o()};case\"<\":return function(){return a()<o()};case\"<=\":return function(){return a()<=o()};case\"==\":return function(){return a()==o()};case\">\":return function(){return a()>o()};case\">=\":return function(){return a()>=o()};case\"||\":return function(){return a()||o()};default:throw ne.thrown(\"Unknown operation \"+r.p)}break;case\"-\":let c=this.makeExpr(e);return function(){return-c()}}throw ne.thrown(n.p)}run(e){switch(e._hx_index){case 0:let n=e.v,i=this.buf,a=Ge.string(this.resolve(n));i.b+=Ge.string(a);break;case 1:let r=e.expr,o=this.buf,l=Ge.string(r());o.b+=Ge.string(l);break;case 2:let c=e.expr,d=e.eif,u=e.eelse,p=c();p==null||p==!1?u!=null&&this.run(u):this.run(d);break;case 3:let m=e.str;this.buf.b+=m==null?\"null\":\"\"+m;break;case 4:let g=e.l.h;for(;g!=null;){let R=g.item;g=g.next;let D=R;this.run(D)}break;case 5:let x=e.expr,_=e.loop,h=x();try{let R=j.getIterator(h);if(R.hasNext==null)throw ne.thrown(null);h=R}catch{try{if(h.hasNext==null)throw ne.thrown(null)}catch{throw ne.thrown(\"Cannot iter on \"+Ge.string(h))}}this.stack.push(this.context);let b=h;for(;b.hasNext();){let R=b.next();this.context=R,this.run(_)}this.context=this.stack.pop();break;case 6:let y=e.name,w=e.params,S=sn.field(this.macros,y),F=new Array,N=this.buf;F.push(j.bind(this,this.resolve));let k=w.h;for(;k!=null;){let R=k.item;k=k.next;let D=R;if(D._hx_index==0){let B=D.v;F.push(this.resolve(B))}else this.buf=new ph,this.run(D),F.push(this.buf.b)}this.buf=N;try{let R=this.buf,D=Ge.string(S.apply(this.macros,F));R.b+=Ge.string(D)}catch(R){let D=ne.caught(R).unwrap(),B;try{B=F.join(\",\")}catch{B=\"???\"}let q=\"Macro call \"+y+\"(\"+B+\") failed (\"+Ge.string(D)+\")\";throw ne.thrown(q)}break}}static get __name__(){return\"haxe.Template\"}get __class__(){return ti}},\"Template\");qi.prototype.expr=null;qi.prototype.context=null;qi.prototype.macros=null;qi.prototype.stack=null;qi.prototype.buf=null;qi.splitter=new Lr('(::[A-Za-z0-9_ ()&|!+=/><*.\"-]+::|\\\\$\\\\$([A-Za-z0-9_-]+)\\\\()',\"\");qi.expr_splitter=new Lr(`(\\\\(|\\\\)|[ \\r\n\t]*\"[^\"]*\"[ \\r\n\t]*|[!+=/><*.&|-]+)`,\"\");qi.expr_trim=new Lr(\"^[ ]*([^ ]+)[ ]*$\",\"\");qi.expr_int=new Lr(\"^[0-9]+$\",\"\");qi.expr_float=new Lr(\"^([+-]?)(?=\\\\d|,\\\\d)\\\\d*(,\\\\d*)?([Ee]([+-]?\\\\d+))?$\",\"\");qi.globals={};qi.hxKeepArrayIterator=new as([]);var en=wi(Ee(\"fs\"));var Ize=j.$global,Qv=j.global(\"$hxClasses\")[\"mcb.AppMain\"]=s(class zr{static loadDebugProject(e,n){let i=new nr(en.readFileSync(e,{encoding:\"utf8\"}));for(;;){let a=i.unserialize();if(a==null)break;let r=Ze.join([n,a.f]);xn.createDirectory(Ze.directory(r)),en.writeFileSync(r,a.s),en.writeFileSync(r+\".tokens\",Ge.string(a.t)),en.writeFileSync(r+\".ast\",Ge.string(a.a))}}static discoverConfigFile(e){return xn.exists(e+\".cjs\")?e+\".cjs\":xn.exists(e+\".js\")?e+\".js\":xn.exists(e+\".json\")?e+\".json\":e}static getFilesInDirectory(e){let n=en.readdirSync(e),i=[],a=0;for(;a<n.length;){let r=n[a];++a;let o=Ze.join([e,r]);xn.isDirectory(o)?i=i.concat(zr.getFilesInDirectory(o)):i.push(o)}return i}static create(e){let n=Ze.join([Ze.directory(__filename),\"template\"]),i=Ze.join([Ze.addTrailingSlash(process.cwd()),e]);xn.createDirectory(i);let a=new uh(\"https://raw.githubusercontent.com/misode/mcmeta/summary/version.json\");a.onData=function(r){let o=JSON.parse(r),l=null;l=s(function(c,d){let u=0,p=en.readdirSync(c);for(;u<p.length;){let m=p[u];++u;let f=Ze.join([c,m]),g=Ze.join([d,m]);if(xn.isDirectory(f))xn.createDirectory(g),l(f,g);else{let x=new qi(en.readFileSync(f,{encoding:\"utf8\"})),_=e==null;en.writeFileSync(g,x.execute({name:e,version:o.data_pack_version}))}}},\"copyDir\"),l(n,i)},a.request()}static compile(e,n){$n.log(\"Started build at \"+at.dateStr(new Date));let i=Date.now()/1e3,a=Ze.join([e.baseDir,\"src\"]),r=zr.discoverConfigFile(e.configPath),o;if(en.existsSync(r))try{o=Ee(r)}catch(u){let p=ne.caught(u);throw $n.error(\"Failed to load config file: \"+r),ne.thrown(p)}else $n.warn(\"Config file not found, using default config.\"),o={};let l=new Fn(a,o,new Hd(e.libDir)),c=!0,d=s(function(u){if(c=!0,Ci.isMclError(u)){let p=u;$n.error(p.get_message())}else throw $n.error(\"A fatal error occurred during compilation. Please report this to the developers.\"),ne.thrown(u)},\"_error\");try{l.config.events.onPreBuild.dispatch({}).then(function(u){let p=zr.getFilesInDirectory(a),m=0;for(;m<p.length;){let x=p[m];++m;let _=Ze.extension(x);if(_!=\"mcb\"&&_!=\"mcbt\")continue;let h=Zn.tokenize(en.readFileSync(x,{encoding:\"utf8\"}),x);try{let v=_==\"mcb\"?Xt.parseMcbFile(h):Xt.parseMcbtFile(h);l.addFile(x,v)}catch(v){let b=ne.caught(v).unwrap();throw l.success=!1,ne.thrown(b)}}let f=l,g=new et;return g.inst.set(\"config\",o),g.inst.set(\"global\",zr.globalJsData),g.inst.set(\"store\",{}),f.compile(new Gt(null,g)),c=!1,c}).catch(function(u){console.log(\"src/mcb/AppMain.hx:154:\",Ge.string(u)),d(u)}).finally(function(){l.config.events.onPostBuild.dispatch({success:!c}).finally(function(){n?.(l);let u=Date.now()/1e3;$n.log(\"Build finished in \"+(u-i).toFixed(2)+\" seconds\")})})}catch(u){let p=ne.caught(u).unwrap();d(p)}return l}static doBuild(e){sh.register(),zr.watch=e.watch;let n=Ze.join([e.baseDir,\".mcb\",\"fs-cache.txt\"]),i;if(xn.exists(n)){let o=new et,l=0,c=en.readFileSync(n,{encoding:\"utf8\"}).split(`\n`),d=new Array(c.length),u=0,p=c.length;for(;u<p;){let f=u++;d[f]=c[f].split(\":\")}let m=d;for(;l<m.length;){let f=m[l];++l,f[0]!=\"\"&&o.inst.set(f[0],f[1])}i=o}else i=new et;let a=s(function(){xn.createDirectory(Ze.directory(n));let o=[],l=i,c=l,d=l.keys();for(;d.hasNext();){let p=d.next(),m=c.get(p),g=p,x=m;o.push(\"\"+g+\":\"+x)}let u=o.join(`\n`);en.writeFileSync(n,u)},\"writeCache\"),r=s(function(o){let l=o.reportFilesAdded(i),c=o.reportFilesRemoved(i),d=o.reportFilesChanged(i),u=new Set,p=0;for(;p<c.length;){let b=c[p];++p,xn.exists(b)&&en.unlinkSync(b),u.add(Ze.directory(b))}let m=[],f=u.values(),g=f,x=f.next();for(;!x.done;){let b=x.value;x=g.next();let y=b;m.push(y)}let _=m,h=new Set,v=0;for(;v<_.length;){let b=_[v];if(++v,b!=\"\"&&!h.has(b)&&en.readdirSync(b).length==0){if(xn.exists(b)){let y=0,w=en.readdirSync(b);for(;y<w.length;){let S=w[y];++y;let F=b+\"/\"+S;if(xn.isDirectory(F)){if(xn.exists(F)){let N=0,k=en.readdirSync(F);for(;N<k.length;){let R=k[N];++N;let D=F+\"/\"+R;xn.isDirectory(D)?xn.deleteDirectory(D):en.unlinkSync(D)}en.rmdirSync(F)}}else en.unlinkSync(F)}en.rmdirSync(b)}_.push(Ze.join([b,\"..\"])),h.add(b)}}i=o.reportFileMetadata(),a()},\"handleUpdatingFilesBasedOnCache\");zr.compile(e,function(o){if(o.success)r(o.io);else if(o.io instanceof zi){let l=o.io;$n.warn(\"Reverting file changes...\"),l.revertMap.revert()}})}static generate(e,n){let i=zr.discoverConfigFile(n.configPath),a;if(en.existsSync(i))try{a=Ee(i)}catch(d){let u=ne.caught(d);throw $n.error(\"Failed to load config file: \"+i),ne.thrown(u)}else $n.warn(\"Config file not found, using default config.\"),a={};let r=new Fn(n.baseDir,a,new Hd(n.libDir)),o=Zn.tokenize(en.readFileSync(e,{encoding:\"utf8\"}),e),l=Xt.parseMcbFile(o);r.addFile(e,l);let c=new et;c.inst.set(\"config\",a),c.inst.set(\"global\",zr.globalJsData),c.inst.set(\"store\",{}),r.transform(new Gt(null,c))}static get __name__(){return\"mcb.AppMain\"}get __class__(){return zr}},\"AppMain\");Qv.globalJsData={};Qv.watch=!1;var Mze=j.$global;Yv.main();function aS({sourceFiles:t,destPath:e,variables:n,version:i,exportedFiles:a}){console.group(\"Compiling\",t),console.log(\"Variables:\",n);let r=new Fn(\"src\",{libDir:null,generatedDirName:\"zzz\",internalScoreboardName:\"aj.i\",eqVarScoreboardName:null,eqConstScoreboardName:null,header:\"# This file was generated by Animated Java via MC-Build. It is not recommended to edit this file directly.\",ioThreadCount:null,dontEmitComments:!0,setup:null,formatVersion:Jd(i)});r.disableRequire=!0;function o(){let d=new zi;return d.write=(u,p)=>{let m=PathModule.join(e,u);a.set(m,{content:p,includeInAJMeta:!0})},d}s(o,\"createSyncIO\"),r.io=o(),console.time(\"MC-Build compiled in\");let l=Object.entries(t).filter(([d])=>d.endsWith(\".mcbt\")),c=Object.entries(t).filter(([d])=>d.endsWith(\".mcb\"));for(let[d,u]of l)try{r.addFile(d,Xt.parseMcbtFile(Zn.tokenize(u,d)))}catch(p){throw p instanceof Error&&(p.message=`Failed to compile \"${d}\":\n\t${p.message}`),p}for(let[d,u]of c)try{r.addFile(d,Xt.parseMcbFile(Zn.tokenize(u,d)))}catch(p){throw p instanceof Error&&(p.message=`Failed to compile \"${d}\":\n\t${p.message}`),p}return r.compile(Gt.fromObject(n)),console.timeEnd(\"MC-Build compiled in\"),console.log(\"Exported files:\",a.keys()),console.groupEnd(),a}s(aS,\"compileMcbProject\");var _e;(Se=>(Se.NEW=s(()=>\"aj.new\",\"NEW\"),Se.GLOBAL_ENTITY=s(()=>\"aj.global.entity\",\"GLOBAL_ENTITY\"),Se.GLOBAL_ROOT=s(()=>\"aj.global.root\",\"GLOBAL_ROOT\"),Se.GLOBAL_ROOT_CHILD=s(()=>\"aj.global.root.child\",\"GLOBAL_ROOT_CHILD\"),Se.GLOBAL_ROOT_CHILD_BONE=s(()=>\"aj.global.root.child.bone\",\"GLOBAL_ROOT_CHILD_BONE\"),Se.GLOBAL_ROOT_CHILD_ITEM_DISPLAY=s(()=>\"aj.global.root.child.item_display\",\"GLOBAL_ROOT_CHILD_ITEM_DISPLAY\"),Se.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY=s(()=>\"aj.global.root.child.block_display\",\"GLOBAL_ROOT_CHILD_BLOCK_DISPLAY\"),Se.GLOBAL_ROOT_CHILD_TEXT_DISPLAY=s(()=>\"aj.global.root.child.text_display\",\"GLOBAL_ROOT_CHILD_TEXT_DISPLAY\"),Se.GLOBAL_ROOT_CHILD_LOCATOR=s(()=>\"aj.global.root.child.locator\",\"GLOBAL_ROOT_CHILD_LOCATOR\"),Se.GLOBAL_ROOT_CHILD_CAMERA=s(()=>\"aj.global.root.child.camera\",\"GLOBAL_ROOT_CHILD_CAMERA\"),Se.GLOBAL_ROOT_CHILD_DATA=s(()=>\"aj.global.root.child.data\",\"GLOBAL_ROOT_CHILD_DATA\"),Se.GLOBAL_NODE=s(()=>\"aj.global.node\",\"GLOBAL_NODE\"),Se.GLOBAL_DISPLAY_NODE=s(()=>\"aj.global.display_node\",\"GLOBAL_DISPLAY_NODE\"),Se.GLOBAL_VANILLA_DISPLAY_NODE=s(()=>\"aj.global.vanilla_display_node\",\"GLOBAL_VANILLA_DISPLAY_NODE\"),Se.GLOBAL_BONE=s(()=>\"aj.global.bone\",\"GLOBAL_BONE\"),Se.GLOBAL_ITEM_DISPLAY=s(()=>\"aj.global.item_display\",\"GLOBAL_ITEM_DISPLAY\"),Se.GLOBAL_BLOCK_DISPLAY=s(()=>\"aj.global.block_display\",\"GLOBAL_BLOCK_DISPLAY\"),Se.GLOBAL_TEXT_DISPLAY=s(()=>\"aj.global.text_display\",\"GLOBAL_TEXT_DISPLAY\"),Se.GLOBAL_CAMERA=s(()=>\"aj.global.camera\",\"GLOBAL_CAMERA\"),Se.GLOBAL_LOCATOR=s(()=>\"aj.global.locator\",\"GLOBAL_LOCATOR\"),Se.GLOBAL_DATA=s(()=>\"aj.global.data\",\"GLOBAL_DATA\"),Se.GLOBAL_NODE_NAMED=s(ue=>`aj.global.node.${ue}`,\"GLOBAL_NODE_NAMED\"),Se.GLOBAL_DISPLAY_NODE_NAMED=s(ue=>`aj.global.display_node.${ue}`,\"GLOBAL_DISPLAY_NODE_NAMED\"),Se.GLOBAL_BONE_CHILD=s(ue=>`aj.global.bone.${ue}.child`,\"GLOBAL_BONE_CHILD\"),Se.GLOBAL_BONE_CHILD_BONE=s(ue=>`aj.global.bone.${ue}.child.bone`,\"GLOBAL_BONE_CHILD_BONE\"),Se.GLOBAL_BONE_CHILD_ITEM_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.item_display`,\"GLOBAL_BONE_CHILD_ITEM_DISPLAY\"),Se.GLOBAL_BONE_CHILD_BLOCK_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.block_display`,\"GLOBAL_BONE_CHILD_BLOCK_DISPLAY\"),Se.GLOBAL_BONE_CHILD_TEXT_DISPLAY=s(ue=>`aj.global.bone.${ue}.child.text_display`,\"GLOBAL_BONE_CHILD_TEXT_DISPLAY\"),Se.GLOBAL_BONE_CHILD_LOCATOR=s(ue=>`aj.global.bone.${ue}.child.locator`,\"GLOBAL_BONE_CHILD_LOCATOR\"),Se.GLOBAL_BONE_CHILD_CAMERA=s(ue=>`aj.global.bone.${ue}.child.camera`,\"GLOBAL_BONE_CHILD_CAMERA\"),Se.GLOBAL_BONE_DECENDANT=s(ue=>`aj.global.bone.${ue}.decendant`,\"GLOBAL_BONE_DECENDANT\"),Se.GLOBAL_BONE_DECENDANT_BONE=s(ue=>`aj.global.bone.${ue}.decendant.bone`,\"GLOBAL_BONE_DECENDANT_BONE\"),Se.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.item_display`,\"GLOBAL_BONE_DECENDANT_ITEM_DISPLAY\"),Se.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.block_display`,\"GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY\"),Se.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY=s(ue=>`aj.global.bone.${ue}.decendant.text_display`,\"GLOBAL_BONE_DECENDANT_TEXT_DISPLAY\"),Se.GLOBAL_BONE_DECENDANT_LOCATOR=s(ue=>`aj.global.bone.${ue}.decendant.locator`,\"GLOBAL_BONE_DECENDANT_LOCATOR\"),Se.GLOBAL_BONE_DECENDANT_CAMERA=s(ue=>`aj.global.bone.${ue}.decendant.camera`,\"GLOBAL_BONE_DECENDANT_CAMERA\"),Se.GLOBAL_BONE_TREE=s(ue=>`aj.global.bone.${ue}.tree`,\"GLOBAL_BONE_TREE\"),Se.GLOBAL_BONE_TREE_BONE=s(ue=>`aj.global.bone.${ue}.tree.bone`,\"GLOBAL_BONE_TREE_BONE\"),Se.PROJECT_ENTITY=s(ue=>`aj.${ue}.entity`,\"PROJECT_ENTITY\"),Se.PROJECT_ROOT=s(ue=>`aj.${ue}.root`,\"PROJECT_ROOT\"),Se.PROJECT_ROOT_CHILD=s(ue=>`aj.${ue}.root.child`,\"PROJECT_ROOT_CHILD\"),Se.PROJECT_ROOT_CHILD_BONE=s(ue=>`aj.${ue}.root.child.bone`,\"PROJECT_ROOT_CHILD_BONE\"),Se.PROJECT_ROOT_CHILD_ITEM_DISPLAY=s(ue=>`aj.${ue}.root.child.item_display`,\"PROJECT_ROOT_CHILD_ITEM_DISPLAY\"),Se.PROJECT_ROOT_CHILD_BLOCK_DISPLAY=s(ue=>`aj.${ue}.root.child.block_display`,\"PROJECT_ROOT_CHILD_BLOCK_DISPLAY\"),Se.PROJECT_ROOT_CHILD_TEXT_DISPLAY=s(ue=>`aj.${ue}.root.child.text_display`,\"PROJECT_ROOT_CHILD_TEXT_DISPLAY\"),Se.PROJECT_ROOT_CHILD_LOCATOR=s(ue=>`aj.${ue}.root.child.locator`,\"PROJECT_ROOT_CHILD_LOCATOR\"),Se.PROJECT_ROOT_CHILD_CAMERA=s(ue=>`aj.${ue}.root.child.camera`,\"PROJECT_ROOT_CHILD_CAMERA\"),Se.PROJECT_ROOT_CHILD_DATA=s(ue=>`aj.${ue}.root.child.data`,\"PROJECT_ROOT_CHILD_DATA\"),Se.PROJECT_NODE=s(ue=>`aj.${ue}.node`,\"PROJECT_NODE\"),Se.PROJECT_DISPLAY_NODE=s(ue=>`aj.${ue}.display_node`,\"PROJECT_DISPLAY_NODE\"),Se.PROJECT_VANILLA_DISPLAY_NODE=s(ue=>`aj.${ue}.vanilla_display_node`,\"PROJECT_VANILLA_DISPLAY_NODE\"),Se.PROJECT_BONE=s(ue=>`aj.${ue}.bone`,\"PROJECT_BONE\"),Se.PROJECT_ITEM_DISPLAY=s(ue=>`aj.${ue}.item_display`,\"PROJECT_ITEM_DISPLAY\"),Se.PROJECT_BLOCK_DISPLAY=s(ue=>`aj.${ue}.block_display`,\"PROJECT_BLOCK_DISPLAY\"),Se.PROJECT_TEXT_DISPLAY=s(ue=>`aj.${ue}.text_display`,\"PROJECT_TEXT_DISPLAY\"),Se.PROJECT_CAMERA=s(ue=>`aj.${ue}.camera`,\"PROJECT_CAMERA\"),Se.PROJECT_LOCATOR=s(ue=>`aj.${ue}.locator`,\"PROJECT_LOCATOR\"),Se.PROJECT_DATA=s(ue=>`aj.${ue}.data`,\"PROJECT_DATA\"),Se.PROJECT_NODE_NAMED=s((ue,tt)=>`aj.${ue}.node.${tt}`,\"PROJECT_NODE_NAMED\"),Se.PROJECT_BONE_NAMED=s((ue,tt)=>`aj.${ue}.bone.${tt}`,\"PROJECT_BONE_NAMED\"),Se.PROJECT_DISPLAY_NODE_NAMED=s((ue,tt)=>`aj.${ue}.display_node.${tt}`,\"PROJECT_DISPLAY_NODE_NAMED\"),Se.PROJECT_ITEM_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.item_display.${tt}`,\"PROJECT_ITEM_DISPLAY_NAMED\"),Se.PROJECT_BLOCK_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.block_display.${tt}`,\"PROJECT_BLOCK_DISPLAY_NAMED\"),Se.PROJECT_TEXT_DISPLAY_NAMED=s((ue,tt)=>`aj.${ue}.text_display.${tt}`,\"PROJECT_TEXT_DISPLAY_NAMED\"),Se.PROJECT_CAMERA_NAMED=s((ue,tt)=>`aj.${ue}.camera.${tt}`,\"PROJECT_CAMERA_NAMED\"),Se.PROJECT_LOCATOR_NAMED=s((ue,tt)=>`aj.${ue}.locator.${tt}`,\"PROJECT_LOCATOR_NAMED\"),Se.PROJECT_BONE_CHILD=s((ue,tt)=>`aj.${ue}.bone.${tt}.child`,\"PROJECT_BONE_CHILD\"),Se.PROJECT_BONE_CHILD_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.bone`,\"PROJECT_BONE_CHILD_BONE\"),Se.PROJECT_BONE_CHILD_ITEM_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.item_display`,\"PROJECT_BONE_CHILD_ITEM_DISPLAY\"),Se.PROJECT_BONE_CHILD_BLOCK_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.block_display`,\"PROJECT_BONE_CHILD_BLOCK_DISPLAY\"),Se.PROJECT_BONE_CHILD_TEXT_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.text_display`,\"PROJECT_BONE_CHILD_TEXT_DISPLAY\"),Se.PROJECT_BONE_CHILD_LOCATOR=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.locator`,\"PROJECT_BONE_CHILD_LOCATOR\"),Se.PROJECT_BONE_CHILD_CAMERA=s((ue,tt)=>`aj.${ue}.bone.${tt}.child.camera`,\"PROJECT_BONE_CHILD_CAMERA\"),Se.PROJECT_BONE_DECENDANT=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant`,\"PROJECT_BONE_DECENDANT\"),Se.PROJECT_BONE_DECENDANT_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.bone`,\"PROJECT_BONE_DECENDANT_BONE\"),Se.PROJECT_BONE_DECENDANT_ITEM_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.item_display`,\"PROJECT_BONE_DECENDANT_ITEM_DISPLAY\"),Se.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.block_display`,\"PROJECT_BONE_DECENDANT_BLOCK_DISPLAY\"),Se.PROJECT_BONE_DECENDANT_TEXT_DISPLAY=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.text_display`,\"PROJECT_BONE_DECENDANT_TEXT_DISPLAY\"),Se.PROJECT_BONE_DECENDANT_LOCATOR=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.locator`,\"PROJECT_BONE_DECENDANT_LOCATOR\"),Se.PROJECT_BONE_DECENDANT_CAMERA=s((ue,tt)=>`aj.${ue}.bone.${tt}.decendant.camera`,\"PROJECT_BONE_DECENDANT_CAMERA\"),Se.PROJECT_BONE_TREE=s((ue,tt)=>`aj.${ue}.bone.${tt}.tree`,\"PROJECT_BONE_TREE\"),Se.PROJECT_BONE_TREE_BONE=s((ue,tt)=>`aj.${ue}.bone.${tt}.tree.bone`,\"PROJECT_BONE_TREE_BONE\"),Se.ANIMATION_PLAYING=s((ue,tt)=>`aj.${ue}.animation.${tt}.playing`,\"ANIMATION_PLAYING\"),Se.TWEENING=s((ue,tt)=>`aj.${ue}.animation.${tt}.tween_playing`,\"TWEENING\"),Se.VARIANT_APPLIED=s((ue,tt)=>`aj.${ue}.variant.${tt}.applied`,\"VARIANT_APPLIED\"),Se.TRANSFORMS_ONLY=s(()=>\"aj.transforms_only\",\"TRANSFORMS_ONLY\"),Se.OUTDATED_RIG_TEXT_DISPLAY=s(()=>\"aj.outdated_rig_text_display\",\"OUTDATED_RIG_TEXT_DISPLAY\")))(_e||={});var $v=s(()=>new jt([{text:`\n `,color:\"gray\"},{text:Ca(\"Animated Java\"),color:\"#00aced\"},{text:`\n (animated_java:${Project.animated_java.export_namespace})`,color:\"dark_gray\",italic:!0},`\n \\u2192 `]).flatten(),\"TELLRAW_PREFIX\"),eb=s(()=>`\n`,\"TELLRAW_SUFFIX\"),Hi=s((t,e)=>new jt([{text:\"\",color:\"red\"},$v(),Ca(\"error\")+\": \",{text:t,underlined:!0},`\n\n `,...Array.isArray(e)?e:[e],eb()]),\"TELLRAW_ERROR\"),Ube=s((t,e)=>new jt([{text:\"\",color:\"yellow\"},$v(),Ca(\"warning\")+\": \",{text:t,underlined:!0},`\n\n `,...Array.isArray(e)?e:[e],eb()]),\"TELLRAW_WARNING\"),qbe=s(t=>new jt([`\n\n `,compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version)?{text:\"\\u25B6 Learn More \\u25C0\",color:\"blue\",underlined:!0,italic:!0,clickEvent:{action:\"open_url\",value:t}}:{text:\"\\u25B6 Learn More \\u25C0\",color:\"blue\",underlined:!0,italic:!0,click_event:{action:\"open_url\",url:t}}]).flatten(),\"CREATE_TELLRAW_HELP_LINK\"),rS;(h=>(h.RIG_OUTDATED=s(()=>Hi(\"Outdated Rig Instance\",[\"The instance of \",{text:\"$(export_namespace)\",color:\"yellow\"},\" at \",{text:\"$(x), $(y), $(z)\",color:\"yellow\"},\" was summoned using an older export of its Blueprint.\",\" It should be removed and re-summoned to ensure it functions correctly.\",{text:`\n\n \\u2261 `,color:\"white\"},compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version)?{text:Ca(\"Teleport to Instance\"),clickEvent:{action:\"suggest_command\",value:\"/tp @s $(uuid)\"},color:\"aqua\",underlined:!0}:{text:Ca(\"Teleport to Instance\"),click_event:{action:\"suggest_command\",command:\"/tp @s $(uuid)\"},color:\"aqua\",underlined:!0},{text:`\n \\u2261 `,color:\"white\"},compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version)?{text:Ca(\"Remove Instance\"),clickEvent:{action:\"suggest_command\",value:\"/execute as $(uuid) run function animated_java:$(export_namespace)/remove/this\"},color:\"aqua\",underlined:!0}:{text:Ca(\"Remove Instance\"),click_event:{action:\"suggest_command\",command:\"/execute as $(uuid) run function animated_java:$(export_namespace)/remove/this\"},color:\"aqua\",underlined:!0}]),\"RIG_OUTDATED\"),h.RIG_OUTDATED_TEXT_DISPLAY=s(()=>new jt([{text:\"\\u26A0 This rig instance is outdated! \\u26A0\",color:\"red\"},`\n It should be removed and re-summoned to ensure it functions correctly.`]).toString().replaceAll(\"\\\\n\",\"\\\\\\\\n\"),\"RIG_OUTDATED_TEXT_DISPLAY\"),h.FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR=s((v,b)=>{let y=new jt([{text:v,color:\"yellow\"},\"\"]).flatten(),w=`/execute as @e[tag=${b}] run function ${v}`;return Hi(\"Function Not Executed as Root Entity\",[compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version)?{text:\"[This Function]\",color:\"yellow\",hoverEvent:{action:\"show_text\",contents:y}}:{text:\"[This Function]\",color:\"yellow\",hover_event:{action:\"show_text\",value:y}},\" must be executed as the rig's root entity.\",{text:`\n\n \\u2261 `,color:\"white\",extra:[compareVersions(\"1.21.5\",Project.animated_java.target_minecraft_version)?{text:Ca(\"Show Example Command\"),color:\"aqua\",underlined:!0,clickEvent:{action:\"suggest_command\",value:w}}:{text:Ca(\"Show Example Command\"),color:\"aqua\",underlined:!0,click_event:{action:\"suggest_command\",command:w}}]},qbe(\"https://animated-java.dev/docs/rigs/controlling-a-rig-instance\")])},\"FUNCTION_NOT_EXECUTED_AS_ROOT_ERROR\"),h.INVALID_VARIANT=s(v=>Hi(\"Invalid Variant\",[\"The variant \",{nbt:\"args.variant\",storage:\"animated_java:temp\",color:\"yellow\"},\" does not exist.\",`\n `,{text:\" \\u2261 \",color:\"white\"},{text:\"Available Variants:\",color:\"green\"},...Object.values(v).map(b=>new jt([{text:`\n `,color:\"gray\"},\"\\\\s\\\\s\\\\s\",\" \\u25CF \",{text:b.name,color:\"yellow\"}]).flatten())]),\"INVALID_VARIANT\"),h.FRAME_CANNOT_BE_NEGATIVE=s(()=>Hi(\"Frame cannot be negative\",[{text:\"frame\",color:\"yellow\"},{text:\" must be a non-negative integer.\"}]),\"FRAME_CANNOT_BE_NEGATIVE\"),h.INVALID_ANIMATION=s(v=>Hi(\"Invalid Animation\",[\"The animation \",{nbt:\"args.animation\",storage:\"animated_java:temp\",color:\"yellow\"},\" does not exist.\",`\n `,{text:\" \\u2261 \",color:\"white\"},{text:\"Available Animations:\",color:\"green\"},...v.map(b=>new jt([{text:`\n `,color:\"gray\"},\"\\\\s\\\\s\\\\s\",\" \\u25CF \",{text:b.storage_name,color:\"yellow\"}]).flatten())]),\"INVALID_ANIMATION\"),h.NO_VARIANTS=s(()=>Hi(\"No Variants\",[\"This Blueprint has no variants to switch between.\"]),\"NO_VARIANTS\"),h.INVALID_VERSION=s(()=>Hi(\"Invalid Minecraft Version\",[\"Attempted to load an Animated Java Data Pack that was exported for \",{text:`Minecraft ${Project.animated_java.target_minecraft_version}`,color:\"aqua\"},\" in the wrong version!\",`\n Please ensure that the data pack is loaded in the correct version, or that your Blueprint settings are configured to target the correct version(s) of Minecraft.`]),\"INVALID_VERSION\"),h.UNINSTALL=s(()=>new jt([$v(),[{text:\"Successfully uninstalled \",color:\"green\"},{text:Project.animated_java.export_namespace,color:\"yellow\"},{text:\"!\"},{text:`\n If you have exported multiple times, you may have to remove objectives from previous exports manually, as Animated Java only knows about the objectives from the most recent export.`,color:\"gray\",italic:!0}],eb()]),\"UNINSTALL\"),h.ARGUMENT_CANNOT_BE_EMPTY=s(v=>Hi(\"Argument Cannot Be Empty\",[\"Argument \",{text:v,color:\"yellow\"},{text:\" cannot be an empty string.\"}]),\"ARGUMENT_CANNOT_BE_EMPTY\"),h.LOCATOR_NOT_FOUND=s(()=>Hi(\"Locator Not Found\",[\"Locator \",{nbt:\"args.name\",storage:\"animated_java:temp\",color:\"aqua\"},\" not found!\",`\n Please ensure that the name is spelled correctly.`]),\"LOCATOR_NOT_FOUND\"),h.LOCATOR_ENTITY_NOT_FOUND=s(()=>Hi(\"Locator Not Found\",[\"Locator \",{nbt:\"args.name\",storage:\"animated_java:temp\",color:\"aqua\"},\" does not exist!\",{text:`\n Please ensure that the name is spelled correctly, and `},{text:'\"Use Entity\"',color:\"yellow\"},\" is enabled in the locator's config.\"]),\"LOCATOR_ENTITY_NOT_FOUND\"),h.LOCATOR_COMMAND_FAILED_TO_EXECUTE=s(()=>Hi(\"Failed to Execute Command as Locator\",[\"Failed to execute command \",{nbt:\"args.command\",storage:\"animated_java:temp\",color:\"yellow\"},\" as Locator \",{nbt:\"args.name\",storage:\"animated_java:temp\",color:\"aqua\"},\".\",`\n Please ensure the command is valid.`]),\"LOCATOR_COMMAND_FAILED_TO_EXECUTE\"),h.CAMERA_ENTITY_NOT_FOUND=s(()=>Hi(\"Camera Not Found\",[\"Camera \",{nbt:\"args.name\",storage:\"animated_java:temp\",color:\"aqua\"},\" does not exist!\",`\n Please ensure that its name is spelled correctly.`]),\"CAMERA_ENTITY_NOT_FOUND\"),h.CAMERA_COMMAND_FAILED_TO_EXECUTE=s(()=>Hi(\"Failed to Execute Command as Camera\",[\"Failed to execute command \",{nbt:\"args.command\",storage:\"animated_java:temp\",color:\"yellow\"},\" as Camera \",{nbt:\"args.name\",storage:\"animated_java:temp\",color:\"aqua\"},\".\",`\n Please ensure the command is valid.`]),\"CAMERA_COMMAND_FAILED_TO_EXECUTE\"),h.AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING=s(()=>Hi(\"Called Move Function while Auto Update Rig Orientation is Enabled\",[\"The \",{text:\"move\",color:\"yellow\"},\" function cannot be called while \",{text:\"Auto Update Rig Orientation\",color:\"yellow\"},\" is enabled.\",`\n Please either disable `,{text:\"Auto Update Rig Orientation\",color:\"yellow\"},\" or avoid calling the \",{text:\"move\",color:\"yellow\"},\" function.\"]),\"AUTO_UPDATE_RIG_ORIENTATION_MOVE_WARNING\"),h.DEPRECATED_FUNCTION_WARNING=s((v,b)=>Ube(\"Deprecated Function\",[\"The function \",{text:v,color:\"aqua\"},` is deprecated.\nPlease use `,{text:b,color:\"aqua\"},\" instead.\"]),\"DEPRECATED_FUNCTION_WARNING\")))(rS||={});var mh=rS;var tb=[\"bone\",\"text_display\",\"item_display\",\"block_display\"],oS;(r=>(r.I=s(()=>\"aj.i\",\"I\"),r.ID=s(()=>\"aj.id\",\"ID\"),r.FRAME=s(o=>`aj.${o}.frame`,\"FRAME\"),r.IS_RIG_LOADED=s(()=>\"aj.is_rig_loaded\",\"IS_RIG_LOADED\"),r.TWEEN_DURATION=s(()=>\"aj.tween_duration\",\"TWEEN_DURATION\")))(oS||={});function sS(t,e){let n=[],i=[];function a(o){o.parent===\"root\"||o.parent&&(i.push({name:e.nodes[o.parent].storage_name,type:e.nodes[o.parent].type}),a(e.nodes[o.parent]))}s(a,\"recurseParents\"),a(t);let r=t.parent&&t.parent!==\"root\";switch(n.push(_e.NEW(),_e.GLOBAL_ENTITY(),_e.GLOBAL_NODE(),_e.GLOBAL_NODE_NAMED(t.storage_name),_e.PROJECT_ENTITY(Project.animated_java.export_namespace),_e.PROJECT_NODE(Project.animated_java.export_namespace),_e.PROJECT_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name)),r||n.push(_e.GLOBAL_ROOT_CHILD()),t.type){case\"bone\":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_BONE(),_e.GLOBAL_BONE_TREE(t.storage_name),_e.GLOBAL_BONE_TREE_BONE(t.storage_name),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE(Project.animated_java.export_namespace),_e.PROJECT_BONE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BONE_TREE_BONE(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_BONE(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_BONE(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_BONE());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_BONE(o),_e.GLOBAL_BONE_TREE(o),_e.GLOBAL_BONE_TREE_BONE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_BONE(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE_BONE(Project.animated_java.export_namespace,o));break}case\"item_display\":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_ITEM_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_ITEM_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_ITEM_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_ITEM_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_ITEM_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_ITEM_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_ITEM_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_ITEM_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case\"block_display\":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_BLOCK_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_BLOCK_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_BLOCK_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_BLOCK_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_BLOCK_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_BLOCK_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_BLOCK_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_BLOCK_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case\"text_display\":{n.push(_e.GLOBAL_DISPLAY_NODE_NAMED(t.storage_name),_e.GLOBAL_TEXT_DISPLAY(),_e.PROJECT_DISPLAY_NODE_NAMED(Project.animated_java.export_namespace,t.storage_name),_e.PROJECT_TEXT_DISPLAY(Project.animated_java.export_namespace),_e.PROJECT_TEXT_DISPLAY_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_TEXT_DISPLAY(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_TEXT_DISPLAY(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_TEXT_DISPLAY());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_TEXT_DISPLAY(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_TEXT_DISPLAY(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case\"locator\":{n.push(_e.GLOBAL_LOCATOR(),_e.PROJECT_LOCATOR(Project.animated_java.export_namespace),_e.PROJECT_LOCATOR_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_LOCATOR(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_LOCATOR(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_LOCATOR());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_LOCATOR(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_LOCATOR(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}case\"camera\":{n.push(_e.GLOBAL_CAMERA(),_e.PROJECT_CAMERA(Project.animated_java.export_namespace),_e.PROJECT_CAMERA_NAMED(Project.animated_java.export_namespace,t.storage_name)),r?n.push(_e.GLOBAL_BONE_CHILD(i[0].name),_e.GLOBAL_BONE_CHILD_CAMERA(i[0].name),_e.PROJECT_BONE_CHILD(Project.animated_java.export_namespace,i[0].name),_e.PROJECT_BONE_CHILD_CAMERA(Project.animated_java.export_namespace,i[0].name)):n.push(_e.GLOBAL_ROOT_CHILD_CAMERA());for(let{name:o}of i)n.push(_e.GLOBAL_BONE_DECENDANT(o),_e.GLOBAL_BONE_DECENDANT_CAMERA(o),_e.GLOBAL_BONE_TREE(o),_e.PROJECT_BONE_DECENDANT(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_DECENDANT_CAMERA(Project.animated_java.export_namespace,o),_e.PROJECT_BONE_TREE(Project.animated_java.export_namespace,o));break}default:throw new fi(`Attempted to get tags for an unknown node type: '${t.type}'!`)}return new Tn(n.sort().map(o=>new xt(o)))}s(sS,\"getNodeTags\");async function Hbe(t,e,n){let i=Project.animated_java,a=new Tn,r=new ot;if(!compareVersions(\"1.21.5\",t))r.set(\"id\",new xt(\"minecraft:item_display\"));else if(!compareVersions(\"1.20.4\",t))r.set(\"id\",new xt(\"minecraft:marker\"));else throw new Error(\"Minecraft version is below minimum supported version 1.20.4!\");a.add(r.set(\"Tags\",new Tn([new xt(_e.NEW()),new xt(_e.GLOBAL_ENTITY()),new xt(_e.GLOBAL_DATA()),new xt(_e.PROJECT_ENTITY(i.export_namespace)),new xt(_e.PROJECT_DATA(i.export_namespace))])).set(\"data\",new ot().set(\"rig_hash\",new xt(n)).set(\"export_namespace\",new xt(i.export_namespace))));for(let[l,c]of Object.entries(e.nodes)){if(c.type===\"struct\")continue;let d=new ot,u=sS(c,e);switch(d.set(\"Tags\",u),tb.includes(c.type)&&d.set(\"height\",new fn(i.render_box[1])).set(\"width\",new fn(i.render_box[0])).set(\"teleport_duration\",new an(0)).set(\"interpolation_duration\",new an(i.interpolation_duration)).set(\"transformation\",new ot().set(\"translation\",To([0,0,0])).set(\"left_rotation\",To([0,0,0,1])).set(\"right_rotation\",To([0,0,0,1])).set(\"scale\",To([0,0,0]))),c.type){case\"bone\":{let p=new ot().set(\"id\",new xt(i.display_item));d.set(\"id\",new xt(\"minecraft:item_display\")).set(\"item\",p).set(\"item_display\",new xt(\"head\"));let m=e.variants[qe.getDefault().uuid].models[l];if(!m)throw new Error(`Model for bone '${c.storage_name}' not found!`);compareVersions(\"1.21.4\",t)?compareVersions(\"1.21.2\",t)?compareVersions(\"1.20.5\",t)?compareVersions(\"1.20.4\",t)||(p.set(\"tag\",new ot().set(\"CustomModelData\",new an(m.custom_model_data))),p.set(\"Count\",new an(1))):p.set(\"components\",new ot().set(\"minecraft:custom_model_data\",new an(m.custom_model_data))):p.set(\"components\",new ot().set(\"minecraft:item_model\",new xt(m.item_model))):p.set(\"components\",new ot().set(\"minecraft:item_model\",new xt(m.item_model)).set(\"minecraft:custom_model_data\",new ot().set(\"strings\",new Tn([new xt(\"default\")])))),c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case\"text_display\":{if(d.set(\"id\",new xt(\"minecraft:text_display\")).set(\"background\",new an(jt.hexToInt(c.background_color))).set(\"line_width\",new an(c.line_width)).set(\"shadow\",new di(c.shadow?1:0)).set(\"see_through\",new di(c.see_through?1:0)).set(\"alignment\",new xt(c.align)),!compareVersions(\"1.21.5\",t))d.set(\"text\",new xt(\"$$$\"+c.type+\"_\"+c.storage_name+\"_text_placeholder$$$\"));else if(!compareVersions(\"1.20.4\",t))d.set(\"text\",new xt(new Yn({minecraftVersion:t}).parse(c.text).toString(!0,t)));else throw new Error(`Unsupported Minecraft version '${t}' for text display!`);c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case\"item_display\":{let p=new ot().set(\"id\",new xt(c.item));if(d.set(\"id\",new xt(\"minecraft:item_display\")).set(\"item\",p).set(\"item_display\",new xt(c.item_display)),!compareVersions(t,\"1.20.4\")){p.set(\"Count\",new an(1));break}c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}case\"block_display\":{let p=new ot,m=await wd(c.block);if(!m)throw new Error(`Invalid Blockstate '${c.block}' in node '${c.storage_name}'!`);for(let[f,g]of Object.entries(m.states))p.set(f,new xt(g.toString()));d.set(\"id\",new xt(\"minecraft:block_display\")).set(\"block_state\",new ot().set(\"Name\",new xt(m.resource.name)).set(\"Properties\",p)),c.configs?.default&&wt.fromJSON(c.configs.default).toNBT(d);break}default:continue}a.add(d)}let o=a.toString();if(!compareVersions(\"1.21.5\",t))for(let l of Object.values(e.nodes).filter(c=>c.type===\"text_display\"))o=o.replace('\"$$$'+l.type+\"_\"+l.storage_name+'_text_placeholder$$$\"',new Yn({minecraftVersion:t}).parse(l.text).toString(!0,t));return o}s(Hbe,\"generateRootEntityPassengers\");async function Jbe(t,e){Dn.set(\"Creating Animation Storage...\"),Pt.set(0),Bi.set(e.length+e.reduce((a,r)=>a+r.frames.length,0));let n=[],i=new Rd(16);for(let a of e){Dn.set(`Creating Animation Storage for '${a.storage_name}'`);let r=new ot,o=s(()=>{let l=`data modify storage animated_java:${Project.animated_java.export_namespace}/animations ${a.storage_name} merge value ${r.toString()}`;n.push(l),r=new ot},\"addFrameDataCommand\");for(let l=0;l<a.frames.length;l++){let c=a.frames[l],d=new ot;r.set(l.toString(),d);for(let[u,p]of Object.entries(a.modified_nodes)){if(p.type===\"struct\")continue;let m=c.node_transforms[u];if(!m){console.warn(\"No transform found for node:\",p);continue}tb.includes(p.type)?d.set(p.type.charAt(0)+\"_\"+p.storage_name,new ot().set(\"transformation\",nb(m.matrix)).set(\"start_interpolation\",new an(0))):d.set(p.type.charAt(0)+\"_\"+p.storage_name,new ot().set(\"px\",new fn(Ja(m.pos[0],4))).set(\"py\",new fn(Ja(m.pos[1],4))).set(\"pz\",new fn(Ja(m.pos[2],4))).set(\"rx\",new fn(Ja(m.rot[0],4))).set(\"ry\",new fn(Ja(m.rot[1],4))))}if(c.variants?.length){let u=c.variants[0];d.set(\"variant\",new ot().set(\"name\",new xt(t.variants[u].name)).set(\"condition\",new xt(c.variants_execute_condition?`${c.variants_execute_condition} `:\"\")))}r.toString().length>1e6&&o(),Pt.set(Pt.get()+1),await i.sync()}o(),Pt.set(Pt.get()+1),await i.sync()}return n}s(Jbe,\"createAnimationStorage\");function Gbe(t,e){return t.type===\"locator\"&&e.type!==\"locator\"?1:t.type!==\"locator\"&&e.type===\"locator\"?-1:0}s(Gbe,\"nodeSorter\");async function Gd(t,e){console.time(\"Data Pack Compilation took\");let n=Project.animated_java,i=new Ur(PathModule.join(e.dataPackFolder,\"data.ajmeta\"),n.export_namespace,Project.last_used_export_namespace,e.dataPackFolder);n.data_pack_export_mode===\"folder\"&&i.read();let a=new Map,r=new Map,o=e.dataPackFolder;for(let m of t){console.groupCollapsed(`Compiling data pack for Minecraft ${m}`);let f=new Map,g=new Map,x=t.length>1?PathModule.join(e.dataPackFolder,`animated_java_${m.replaceAll(\".\",\"_\")}`):o;await Kbe({...e,ajmeta:i,version:m,coreFiles:f,versionedFiles:g});for(let[_,h]of f){let v=PathModule.join(o,_);a.set(v,h),h.includeInAJMeta!==!1&&i.coreFiles.add(v)}for(let[_,h]of g){let v=PathModule.join(x,_);r.set(v,h),h.includeInAJMeta!==!1&&i.versionedFiles.add(v)}console.groupEnd()}console.log(\"Exported Files:\",a.size+r.size);let l=PathModule.join(e.dataPackFolder,\"pack.mcmeta\"),c=Co.fromFile(l);c.content.pack??={};let d=fh(t[0]),u=Jd(t[0]),p=d?Jd(d):1e7;if(compareVersions(\"1.21.9\",t[0])?(c.content.pack.pack_format=u,c.content.pack.supported_formats={min_inclusive:u,max_inclusive:p-1}):(c.content.pack.min_format=u,c.content.pack.max_format=p-1),c.content.pack.description??=`Animated Java Data Pack for ${t.join(\", \")}`,a.set(PathModule.join(e.dataPackFolder,\"pack.mcmeta\"),{content:autoStringify(c.toJSON()),includeInAJMeta:!1}),n.data_pack_export_mode===\"folder\"){await Wbe(i),i.coreFiles=new Set(a.keys()),i.versionedFiles=new Set(r.keys()),i.write();let m=new Map([...a,...r]);console.time(\"Writing DataPack Files took\"),await Ybe(m,e.dataPackFolder),console.timeEnd(\"Writing DataPack Files took\")}console.timeEnd(\"Data Pack Compilation took\")}s(Gd,\"compileDataPack\");async function Wbe(t){console.time(\"Removing Files took\");let e=Project.animated_java;if(e.data_pack_export_mode===\"folder\"){Dn.set(\"Removing Old Data Pack Files...\"),Pt.set(0),Bi.set(t.previousVersionedFiles.size);let n=new Set;for(let i of t.previousVersionedFiles){if(Ec(i)&&fs.existsSync(i)){if(e.export_namespace!==Project.last_used_export_namespace&&Vc(i).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)){let l=Wd(i,Project.last_used_export_namespace,e.export_namespace);await fs.promises.mkdir(PathModule.dirname(l),{recursive:!0}),await fs.promises.copyFile(i,l),await fs.promises.unlink(i)}let r;try{r=JSON.parse((await fs.promises.readFile(i)).toString())}catch(o){if(o instanceof SyntaxError)throw new fi(`Failed to parse function tag file: '${i}'. Please ensure that the file is valid JSON.`);continue}r.values=r.values.filter(o=>typeof o==\"string\"&&(!o.startsWith(`animated_java:${e.export_namespace}/`)||!o.startsWith(`animated_java:${Project.last_used_export_namespace}/`))),await fs.promises.writeFile(i,autoStringify(r))}else fs.existsSync(i)&&await fs.promises.unlink(i);let a=PathModule.dirname(i);for(;!n.has(a)&&fs.existsSync(a)&&(await fs.promises.readdir(a)).length===0;)await fs.promises.rm(a,{recursive:!0}),n.add(a),a=PathModule.dirname(a);Pt.set(Pt.get()+1)}}console.timeEnd(\"Removing Files took\")}s(Wbe,\"removeFiles\");var Kbe=s(async({version:t,versionedFiles:e,rig:n,animations:i,rigHash:a,animationHash:r,debugMode:o})=>{jt.defaultMinecraftVersion=t;let l=Project.animated_java,c=i.length===0,d={export_namespace:l.export_namespace,interpolation_duration:l.interpolation_duration,teleportation_duration:l.teleportation_duration,display_item:l.display_item,rig:n,animations:i,export_version:Math.random().toString().substring(2,10),root_entity_passengers:await Hbe(t,n,a),TAGS:_e,OBJECTIVES:oS,TELLRAW:mh,on_summon_function:l.on_summon_function,on_remove_function:l.on_remove_function,on_pre_tick_function:l.on_pre_tick_function,on_post_tick_function:l.on_post_tick_function,matrixToNbtFloatArray:nb,transformationToNbt:lS,use_storage_for_animation:l.use_storage_for_animation,animationStorage:l.use_storage_for_animation?await Jbe(n,i):null,rig_hash:a,animation_hash:r,boundingBox:l.render_box,DisplayEntityConfig:wt,roundTo:Ja,nodeSorter:Gbe,getRotationFromQuaternion:pf,has_locators:Object.values(n.nodes).filter(u=>u.type===\"locator\").length>0,has_entity_locators:Object.values(n.nodes).filter(u=>u.type===\"locator\"&&u.config?.use_entity).length>0,has_ticking_locators:Object.values(n.nodes).filter(u=>u.type===\"locator\"&&u.config?.on_tick_function).length>0,has_cameras:Object.values(n.nodes).filter(u=>u.type===\"camera\").length>0,is_static:c,getNodeTags:sS,BONE_TYPES:tb,project_storage:`animated_java:${l.export_namespace}`,temp_storage:\"animated_java:temp\",gu_storage:\"animated_java:gu\",auto_update_rig_orientation:l.auto_update_rig_orientation,debug_mode:o};aS({sourceFiles:{\"src/global.mcbt\":wo[t].globalTemplates,\"src/animated_java.mcb\":wo[t].global,[`src/animated_java/${l.export_namespace}.mcb`]:c?wo[t].static:wo[t].animation},destPath:\".\",variables:d,version:t,exportedFiles:e})},\"dataPackCompiler\");async function Ybe(t,e){Dn.set(\"Writing Data Pack...\"),Pt.set(0),Bi.set(t.size);let n=Project.animated_java,i=Project.last_used_export_namespace,a=new Set,r=new Map;async function o(d,u){if(Ec(d)&&fs.existsSync(d)){r.set(d,u);return}let p=PathModule.dirname(d);a.has(p)||(await fs.promises.mkdir(p,{recursive:!0}),a.add(p)),u.writeHandler?await u.writeHandler(d,u.content):await fs.promises.writeFile(d,new Uint8Array(Buffer.isBuffer(u.content)?u.content:Buffer.from(u.content))),Pt.set(Pt.get()+1)}s(o,\"writeFile\");let l=8,c=new Map;for(let[d,u]of t)c.set(d,o(d,u).finally(()=>{c.delete(d)})),c.size>=l&&await Promise.any(c.values());await Promise.all(c.values()),Dn.set(\"Merging Function Tags...\"),Bi.set(r.size),Pt.set(0);for(let[d,u]of r.entries()){let m=Ii.fromJSON(JSON.parse(fs.readFileSync(d,\"utf-8\"))).merge(Ii.fromJSON(JSON.parse(u.content.toString())));m.filter(f=>{let g=Ii.getEntryId(f),x=g.startsWith(\"#\"),_=bc(x?g.substring(1):g);if(_.namespace!==\"animated_java\")return!0;if(n.export_namespace!==i&&_.namespace===i)return!1;let h=Rr(\"1.21\")?\"function\":\"functions\",v=(x?\"tags/\":\"\")+h,b=x?\".json\":\".mcfunction\";for(let y of fs.readdirSync(e)){let w=PathModule.join(e,y,_.namespace,v,_.path+b);if(fs.existsSync(w))return!0}return console.warn(`Removed reference to ${x?\"tag\":\"function\"} '${g}' in '${d}' because it does not exist!`),!1}),m.sort(),await fs.promises.writeFile(d,autoStringify(m.toJSON())),Pt.set(Pt.get()+1)}}s(Ybe,\"writeFiles\");var hh=class{overrides=new Map;externalOverrides=new Map;lastOverrideId=1;rigs={};parent=\"item/generated\";textures={};setOverride(e,n){this.overrides.set(e,n)}addOverride(e){let n=this.lastOverrideId;for(;this.overrides.has(n)||this.externalOverrides.has(n);)n++;return this.lastOverrideId=n,this.overrides.set(n,e),n}assertOverride(e,n){this.overrides.has(e)||this.externalOverrides.has(e)||this.setOverride(e,n)}readExisting(e){let n=Project.animated_java,i;try{i=JSON.parse(fs.readFileSync(e,\"utf-8\"))}catch(a){console.error(\"Failed to read existing display item model:\",a);return}if(i.animated_java,i.parent&&(this.parent=i.parent),i.textures&&(this.textures=i.textures),i.overrides??=[],i.animated_java??={},typeof i.animated_java.rigs==\"object\"&&!Array.isArray(i.animated_java.rigs)){let a=i.animated_java.rigs;i.animated_java={};for(let r of Object.keys(a))i.animated_java[r]=a[r].used_ids}i.animated_java[n.export_namespace]??=[];for(let[a,r]of Object.entries(i.animated_java)){let o=n.export_namespace,l=Project.last_used_export_namespace;if(a===o||a===l){i.overrides=i.overrides.filter(c=>!r.includes(c.predicate.custom_model_data)),a===l&&o!==l&&delete i.animated_java[l];continue}else for(let c of r){let d=i.overrides.find(u=>u.predicate.custom_model_data===c);this.externalOverrides.set(c,d.model)}this.rigs[a]=r}}toJSON(){let[e,n]=Project.animated_java.display_item.split(\":\"),i=Project.animated_java.export_namespace;return{parent:this.parent,textures:Object.keys(this.textures).length>0?this.textures:{layer0:`${e}:item/${n}`},overrides:[...this.externalOverrides.entries(),...this.overrides.entries()].sort((a,r)=>a[0]-r[0]).map(([a,r])=>({predicate:{custom_model_data:a},model:r})),animated_java:gh({...this.rigs,[i]:[...this.overrides.keys()]})}}};s(hh,\"PredicateItemModel\");var Xbe=s(async({coreFiles:t,versionedFiles:e,rig:n,resourcePackPath:i,displayItemPath:a,textureExportFolder:r,modelExportFolder:o})=>{let l=Project.animated_java;Dn.set(\"Compiling Resource Pack...\"),console.log(\"Compiling resource pack...\",{rig:n,displayItemPath:a,textureExportFolder:r,modelExportFolder:o}),e.set(PathModule.join(\"assets/animated_java/models/empty.json\"),{content:\"{}\"});let c=new hh,d=PathModule.join(i,a);fs.existsSync(d)&&(console.warn(\"Display item already exists! Attempting to merge...\"),c.readExisting(d)),c.lastOverrideId=Math.max(1,l.enable_advanced_resource_pack_settings?l.custom_model_data_offset:0),c.assertOverride(1,\"animated_java:empty\");for(let m of Object.values(n.textures)){let f,g,x;if(m.source?.startsWith(\"data:\"))f=Buffer.from(m.source.split(\",\")[1],\"base64\");else if(m.path&&fs.existsSync(m.path)){if(qr(m.path))continue;{f=fs.readFileSync(m.path);let h=m.path+\".mcmeta\",v=m.path.replace(\".png\",\"_e.png\");fs.existsSync(h)&&(g=fs.readFileSync(h)),fs.existsSync(v)&&(x=fs.readFileSync(v))}}if(f===void 0)throw new Error(`Texture ${m.name} is missing it's image data.`);let _=m.name.replace(/\\.png$/,\"\");_=Kt(_)+\".png\",e.set(PathModule.join(r,_),{content:f}),g!==void 0&&e.set(PathModule.join(r,_+\".mcmeta\"),{content:g}),x!==void 0&&e.set(PathModule.join(r,_+\"_e.png\"),{content:x})}let u=PathModule.join(\"assets/minecraft/atlases/blocks.json\"),p=await fs.promises.readFile(u,\"utf-8\").catch(()=>(console.log(\"Creating new block atlas...\"),'{ \"sources\": [] }')).then(m=>JSON.parse(m));p.sources?.some(m=>m.type===\"directory\"&&m.source===\"blueprint\"&&m.prefix===\"blueprint/\")||(p.sources??=[],p.sources.push({type:\"directory\",source:\"blueprint\",prefix:\"blueprint/\"})),t.set(u,{content:autoStringify(p)});for(let m of Object.values(n.variants))for(let[f,g]of Object.entries(m.models)){let x=n.nodes[f];if(g.custom_model_data!==-1)continue;g.custom_model_data=c.addOverride(g.resource_location);let _=m.is_default?PathModule.join(o,x.name+\".json\"):PathModule.join(o,m.name,x.name+\".json\");e.set(PathModule.join(_),{content:autoStringify(g.model)})}console.log(\"Display Item Model\",c.toJSON()),e.set(a,{content:autoStringify(c.toJSON()),includeInAJMeta:!1}),console.log(\"Resource pack compiled!\")},\"compileResourcePack\"),ib=Xbe;var Zbe=s(async({coreFiles:t,versionedFiles:e,rig:n,textureExportFolder:i,modelExportFolder:a})=>{let r=a.replace(/([\\\\/])blueprint([\\\\/])/,\"$1item$2\");Dn.set(\"Compiling Resource Pack...\"),console.log(\"Compiling resource pack...\",{rig:n,textureExportFolder:i,modelExportFolder:a});let o=PathModule.join(\"assets/minecraft/atlases/blocks.json\"),l=await fs.promises.readFile(o,\"utf-8\").catch(()=>(console.log(\"Creating new block atlas...\"),JSON.stringify({sources:[]}))).then(c=>JSON.parse(c));l.sources?.some(c=>c.type===\"directory\"&&c.source===\"blueprint\"&&c.prefix===\"blueprint/\")||(l.sources??=[],l.sources.push({type:\"directory\",source:\"blueprint\",prefix:\"blueprint/\"})),t.set(o,{content:autoStringify(l)}),e.set(PathModule.join(\"assets/animated_java/models/item/empty.json\"),{content:\"{}\"});for(let c of Object.values(n.textures)){let d,u,p;if(c.source?.startsWith(\"data:\"))d=Buffer.from(c.source.split(\",\")[1],\"base64\");else if(c.path&&fs.existsSync(c.path)){if(qr(c.path))continue;if(d=Ef(c.path),d==null)throw new Error(`Failed to read texture \"${c.name}\" at ${c.path}`);u=Ef(c.path+\".mcmeta\"),p=Ef(c.path.replace(\".png\",\"_e.png\"))}if(d===void 0)throw new Error(`Texture ${c.name} is missing it's image data.`);let m=c.name.replace(/\\.png$/,\"\");m=Kt(m)+\".png\",e.set(PathModule.join(i,m),{content:d}),u!==void 0&&e.set(PathModule.join(i,m+\".mcmeta\"),{content:u}),p!==void 0&&e.set(PathModule.join(i,m+\"_e.png\"),{content:p})}for(let c of Object.values(n.variants))for(let[d,u]of Object.entries(c.models)){let p=n.nodes[d];if(u.custom_model_data!==-1)continue;let m=c.is_default?PathModule.join(r,p.name+\".json\"):PathModule.join(r,c.name,p.name+\".json\");u.model?.parent&&(u.model.parent=u.model.parent.replace(\"animated_java:blueprint/\",\"animated_java:item/\")),u.item_model=u.item_model.replace(\"animated_java:blueprint/\",\"animated_java:\"),console.log(\"Exporting model\",u.model,\"to\",m),e.set(PathModule.join(m),{content:autoStringify(u.model)})}console.log(\"Resource pack compiled!\")},\"compileResourcePack\"),cS=Zbe;var Qbe=s(async({coreFiles:t,versionedFiles:e,rig:n,textureExportFolder:i,modelExportFolder:a})=>{let r=Project.animated_java;Dn.set(\"Compiling Resource Pack...\"),console.log(\"Compiling resource pack...\",{rig:n,textureExportFolder:i,modelExportFolder:a});let o=PathModule.join(\"assets/animated_java/items/blueprint/\",r.export_namespace),l=PathModule.join(\"assets/minecraft/atlases/blocks.json\"),c=await fs.promises.readFile(l,\"utf-8\").catch(()=>(console.log(\"Creating new block atlas...\"),'{ \"sources\": [] }')).then(u=>JSON.parse(u));c.sources?.some(u=>u.type===\"directory\"&&u.source===\"blueprint\"&&u.prefix===\"blueprint/\")||(c.sources??=[],c.sources.push({type:\"directory\",source:\"blueprint\",prefix:\"blueprint/\"})),t.set(l,{content:autoStringify(c)});for(let u of Object.values(n.textures)){let p,m,f;if(u.source?.startsWith(\"data:\"))p=Buffer.from(u.source.split(\",\")[1],\"base64\");else if(u.path&&fs.existsSync(u.path)){if(qr(u.path))continue;{p=fs.readFileSync(u.path);let x=u.path+\".mcmeta\",_=u.path.replace(\".png\",\"_e.png\");fs.existsSync(x)&&(m=fs.readFileSync(x)),fs.existsSync(_)&&(f=fs.readFileSync(_))}}if(p===void 0)throw new Error(`Texture ${u.name} is missing it's image data.`);let g=u.name.replace(/\\.png$/,\"\");g=Kt(g)+\".png\",e.set(PathModule.join(i,g),{content:p}),m!==void 0&&e.set(PathModule.join(i,g+\".mcmeta\"),{content:m}),f!==void 0&&e.set(PathModule.join(i,g+\"_e.png\"),{content:f})}let d=qe.getDefault();for(let[u,p]of Object.entries(n.variants[d.uuid].models)){let m=n.nodes[u],f=PathModule.join(o,m.name+\".json\"),g;Object.values(n.variants).length===1?g=uS(p):g=$be(u,p,n),e.set(f,{content:autoStringify(g)})}for(let u of Object.values(n.variants))for(let[p,m]of Object.entries(u.models)){let f=n.nodes[p];if(m.custom_model_data!==-1)continue;let g=u.is_default?PathModule.join(a,f.name+\".json\"):PathModule.join(a,u.name,f.name+\".json\");e.set(PathModule.join(g),{content:autoStringify(m.model)})}console.log(\"Resource pack compiled!\")},\"compileResourcePack\"),Kd=Qbe;function uS(t){return{model:{type:\"minecraft:model\",model:t.resource_location,tints:[new oneLiner({type:\"minecraft:dye\",default:[1,1,1]})]}}}s(uS,\"createSingleVariantItemDefinition\");function $be(t,e,n){let i={model:{type:\"minecraft:select\",property:\"minecraft:custom_model_data\",cases:[{when:\"AJ_INTERNAL_EMPTY\",model:{type:\"minecraft:empty\"}}],fallback:{type:\"minecraft:model\",model:e.resource_location,tints:[new oneLiner({type:\"minecraft:dye\",default:[1,1,1]})]}}};for(let a of Object.values(n.variants)){let r=a.models[t];!r||a.is_default||i.model.cases.push({when:a.name,model:{type:\"minecraft:model\",model:r.resource_location,tints:[new oneLiner({type:\"minecraft:dye\",default:[1,1,1]})]}})}return i.model.cases.length===0?uS(e):i}s($be,\"createMultiVariantItemDefinition\");var eye={\"1.21.9\":Kd,\"1.21.6\":Kd,\"1.21.5\":Kd,\"1.21.4\":Kd,\"1.21.2\":cS,\"1.20.5\":ib,\"1.20.4\":ib};async function Yd(t,e){let n=Project.animated_java,i=new Ur(PathModule.join(e.resourcePackFolder,\"assets.ajmeta\"),n.export_namespace,Project.last_used_export_namespace,e.resourcePackFolder);n.resource_pack_export_mode===\"folder\"&&i.read();let a=new Map,r=new Map,o=e.resourcePackFolder;for(let m of t){console.groupCollapsed(`Compiling resource pack for Minecraft ${m}`);let f=new Map,g=new Map,x=t.length>1?PathModule.join(e.resourcePackFolder,`animated_java_${m.replaceAll(\".\",\"_\")}`):e.resourcePackFolder;await eye[m]({...e,resourcePackPath:x,ajmeta:i,coreFiles:f,versionedFiles:g});for(let[_,h]of f){let v=PathModule.join(o,_);a.set(v,h),h.includeInAJMeta!==!1&&i.coreFiles.add(v)}for(let[_,h]of g){let v=PathModule.join(x,_);r.set(v,h),h.includeInAJMeta!==!1&&i.versionedFiles.add(v)}console.groupEnd()}console.log(\"Exported files:\",a.size+r.size);let l=PathModule.join(e.resourcePackFolder,\"pack.mcmeta\"),c=Co.fromFile(l);c.content.pack??={};let d=fh(t[0]),u=ab(t[0]),p=d?ab(d):1e7;if(compareVersions(\"1.21.9\",t[0])?(c.content.pack.pack_format=u,c.content.pack.supported_formats={min_inclusive:u,max_inclusive:p-1}):(c.content.pack.min_format=u,c.content.pack.max_format=p-1),c.content.pack.description??=`Animated Java Resource Pack for ${t.join(\", \")}`,a.set(PathModule.join(e.resourcePackFolder,\"pack.mcmeta\"),{content:autoStringify(c.toJSON())}),n.enable_plugin_mode)console.log(\"Plugin mode enabled. Skipping resource pack export.\");else if(n.resource_pack_export_mode===\"folder\"){Dn.set(\"Removing Old Resource Pack Files...\"),Pt.set(0),Bi.set(i.previousVersionedFiles.size);let m=new Set;for(let x of i.previousVersionedFiles){fs.existsSync(x)&&await fs.promises.unlink(x);let _=PathModule.dirname(x);for(;!m.has(_)&&fs.existsSync(_)&&(await fs.promises.readdir(_)).length===0;)await fs.promises.rm(_,{recursive:!0}),m.add(_),_=PathModule.dirname(_);Pt.set(Pt.get()+1)}i.coreFiles=new Set(a.keys()),i.versionedFiles=new Set(r.keys()),i.write();let f=new Map([...a,...r]);Dn.set(\"Writing Resource Pack...\"),Pt.set(0),Bi.set(f.size);let g=new Set;for(let[x,_]of f){let h=PathModule.dirname(x);g.has(h)||(await fs.promises.mkdir(h,{recursive:!0}),g.add(h)),_.writeHandler?await _.writeHandler(x,_.content):await fs.promises.writeFile(x,new Uint8Array(Buffer.isBuffer(_.content)?_.content:Buffer.from(_.content))),Pt.set(Pt.get()+1)}}else if(n.resource_pack_export_mode===\"zip\")throw new fi(\"ZIP export is not yet implemented.\")}s(Yd,\"compileResourcePack\");var dS=wi(Ee(\"crypto\"),1);function tye(t,e,n){if(!t.export)return;let i={};if(i.from=t.from.slice(),i.to=t.to.slice(),t.inflate&&(i.from=i.from.map(a=>a-t.inflate),i.to=i.to.map(a=>a+t.inflate)),t.shade===!1&&(i.shade=!1),t.rotation.allEqual(0)&&t.origin.allEqual(0))t.rescale&&(i.rotation={angle:0,axis:t.rotation_axis||\"y\",origin:t.origin,rescale:!0});else{let a=t.rotationAxis()||\"y\";i.rotation={angle:t.rotation[getAxisNumber(a)],axis:a,origin:t.origin},t.rescale&&(i.rotation.rescale=!0)}if(t.parent instanceof Group){let a=t.parent;i.from=i.from.map((r,o)=>r-a.origin[o]),i.to=i.to.map((r,o)=>r-a.origin[o]),i.rotation&&!Array.isArray(i.rotation)&&(i.rotation.origin=i.rotation.origin.map((r,o)=>r-a.origin[o]))}i.faces={};for(let[a,r]of Object.entries(t.faces)){if(!r?.texture)continue;let o={};if(r.enabled&&(o.uv=r.uv.slice().map((l,c)=>l*16/UVEditor.getResolution(c%2))),r.rotation&&(o.rotation=r.rotation),r.texture){let l=r.getTexture();if(!l)throw new Error(\"Texture not found\");o.texture=\"#\"+l.id,e.textures[l.id]=l;let c=pS(l,e).resourceLocation;c&&(n.textures[l.id]=c)}r.cullface&&(o.cullface=r.cullface),r.tint>=0&&(o.tintindex=r.tint),i.faces[a]=o}Object.keys(i.faces).length!==0&&(t.light_emission&&(i.light_emission=t.light_emission),n.elements??=[],n.elements.push(i))}s(tye,\"renderCube\");var Xd=new Map;function pS(t,e){if(Xd.has(t.uuid))return Xd.get(t.uuid);let n=t.name.replace(/\\.png$/,\"\");if(n=Kt(n)+\".png\",t.path&&fs.existsSync(t.path)&&fs.statSync(t.path).isFile()){let r=Sa(t.path);if(r)return Xd.set(t.uuid,r),r;console.warn(`Texture ${t.name} has a custom path that is not in a valid resource pack location: ${t.path}`)}let i=PathModule.join(e.texture_export_folder,n),a=Sa(i);if(a)return Xd.set(t.uuid,a),a;throw console.error(t),new Error(`Invalid texture path: ${i}`)}s(pS,\"getTextureResourceLocation\");function _h(t){let e=new THREE.Box3;if(t instanceof Group){let n=t.children.filter(i=>i instanceof Cube);for(let i of n)e.expandByPoint(new THREE.Vector3(i.from[0]-i.inflate,i.from[1]-i.inflate,i.from[2]-i.inflate)),e.expandByPoint(new THREE.Vector3(i.to[0]+i.inflate,i.to[1]+i.inflate,i.to[2]+i.inflate))}else(t instanceof ve||t instanceof We||t instanceof $e)&&e.setFromObject(t.mesh);return e.expandByPoint(new THREE.Vector3(t.origin[0],t.origin[1],t.origin[2])),e}s(_h,\"getNodeBoundingBox\");function mS(t,e,n){if(!t.export)return;let i=t.parent instanceof Group?t.parent.uuid:void 0,a=PathModule.join(e.model_export_folder,t.name+\".json\"),r=Sa(a);if(!r)throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${a}`);let o={type:\"bone\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:i,bounding_box:_h(t),base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),default_transform:{}},l=n.models[t.uuid];l||(l=n.models[t.uuid]={model:{textures:{particle:\"minecraft:item/pufferfish\"},display:{head:{rotation:[0,180,0]}}},custom_model_data:-1,resource_location:r.resourceLocation,item_model:r.resourceLocation});for(let p of t.children)if(p.export)switch(!0){case p instanceof Group:{mS(p,e,n);break}case p instanceof Locator:{_S(p,e);break}case p instanceof ve:{gS(p,e);break}case(OutlinerElement.types.camera&&p instanceof OutlinerElement.types.camera):{xS(p,e);break}case p instanceof We:{fS(p,e);break}case p instanceof $e:{hS(p,e);break}case p instanceof Cube:{tye(p,e,l.model),e.includes_custom_models=!0;break}default:console.warn(\"Encountered unknown node type:\",p)}if(!l.model?.elements||l.model.elements.length===0){delete n.models[t.uuid];let p={type:\"struct\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:i,default_transform:{}};e.nodes[t.uuid]=p;return}let c=new THREE.Vector3().subVectors(o.bounding_box.max,o.bounding_box.min),d=Math.max(c.x,c.y,c.z),u=Math.min(1,24/d);for(let p of l.model.elements)p.from=p.from.map(m=>m*u+8),p.to=p.to.map(m=>m*u+8),p.rotation&&!Array.isArray(p.rotation)&&(p.rotation.origin=p.rotation.origin.map(m=>m*u+8));o.base_scale=1/u,e.nodes[t.uuid]=o}s(mS,\"renderGroup\");function fS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+\".json\");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r={type:\"item_display\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,item:t.item,item_display:t.itemDisplay,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};e.nodes[t.uuid]=r}s(fS,\"renderItemDisplay\");function hS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+\".json\");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r={type:\"block_display\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,block:t.block,parent:n,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};e.nodes[t.uuid]=r}s(hS,\"renderBlockDisplay\");function gS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:void 0,i=PathModule.join(e.model_export_folder,t.name+\".json\");if(!Sa(i))throw console.error(t),new Error(`Invalid bone path: ${t.name} -> ${i}`);let r=tinycolor(t.backgroundColor),o={type:\"text_display\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,text:t.text,line_width:t.lineWidth,background_color:jt.moveHex8AlphaToStart(r.toHex8String()),background_alpha:r.getAlpha(),align:t.align,shadow:t.shadow,see_through:t.seeThrough,base_scale:1,configs:structuredClone(t.configs),on_summon_function:t.onSummonFunction?.trim(),bounding_box:_h(t),default_transform:{}};return e.nodes[t.uuid]=o,{uuid:t.uuid,children:[]}}s(gS,\"renderTextDisplay\");function _S(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:t.parent,i={type:\"locator\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,config:structuredClone(t.config),max_distance:0,default_transform:{}};e.nodes[t.uuid]=i}s(_S,\"renderLocator\");function xS(t,e){if(!t.export)return;let n=t.parent instanceof Group?t.parent.uuid:t.parent,i={type:\"camera\",name:t.name,storage_name:Kt(t.name),uuid:t.uuid,parent:n,max_distance:0,default_transform:{}};e.nodes[t.uuid]=i}s(xS,\"renderCamera\");function nye(t,e){let n={},i=qe.getDefault(),a=e.variants[i.uuid].models;for(let[r,o]of Object.entries(e.nodes)){if(o.type!==\"bone\"||t.excludedNodes.find(g=>g.value===r))continue;let l={},c=!0,d=new Set(Object.keys(a[r].model.textures));for(let[g,x]of t.textureMap.map.entries()){let _=Texture.all.find(v=>v.uuid===g);if(!_)throw new Error(`From texture not found: ${g}`);let h=Texture.all.find(v=>v.uuid===x);if(!h)throw new Error(`To texture not found: ${x}`);l[_.id]=pS(h,e).resourceLocation,e.textures[h.id]=h,c=!1}if(Object.keys(l).length===0)continue;if(c&&d.size===0){n[r]={model:null,custom_model_data:1,resource_location:\"animated_java:empty\",item_model:\"animated_java:empty\"};continue}let u=PathModule.join(e.model_export_folder,o.storage_name+\".json\"),p=Sa(u);if(!p)throw new Error(`Invalid Bone Name: '${o.storage_name}' -> '${u}'`);let m=t.isDefault?PathModule.join(e.model_export_folder,o.storage_name+\".json\"):PathModule.join(e.model_export_folder,t.name,o.storage_name+\".json\"),f=Sa(m);if(!f)throw new Error(`Invalid Variant Name: '${t.name}' -> '${m}'`);n[r]={model:{parent:p.resourceLocation,textures:l},custom_model_data:-1,resource_location:f.resourceLocation,item_model:f.resourceLocation}}return n}s(nye,\"renderVariantModels\");function vS(t){let e=dS.createHash(\"sha256\");for(let[n,i]of Object.entries(t.nodes))switch(e.update(\"node;\"),e.update(n),e.update(i.name),e.update(i.default_transform.matrix.elements.toString()),i.type){case\"bone\":{e.update(\";\"+JSON.stringify(t.variants[qe.getDefault().uuid].models[n])),i.configs&&e.update(\";\"+JSON.stringify(i.configs));break}case\"block_display\":e.update(`;${i.block}`),i.configs&&e.update(\";\"+JSON.stringify(i.configs));break;case\"item_display\":e.update(`;${i.item};${i.item_display}`),i.configs&&e.update(\";\"+JSON.stringify(i.configs));break;case\"text_display\":e.update(`;${i.text}`),i.configs&&e.update(\";\"+JSON.stringify(i.configs));break;case\"locator\":{i.config&&e.update(\";\"+JSON.stringify(i.config));break}}return e.digest(\"hex\")}s(vS,\"hashRig\");function iye(t,e){return{...t.toJSON(),models:nye(t,e)}}s(iye,\"renderVariant\");function aye(t){let e=new Blockbench.Animation;uv(),Nd(e,0);let n=pv(e,t.nodes).node_transforms;return dv(),n}s(aye,\"getDefaultTransforms\");function bS(t,e){console.time(\"Rendering rig took\"),Texture.all.forEach((r,o)=>r.id=String(o)),Animator.showDefaultPose();let n={nodes:{},variants:{},textures:{},model_export_folder:t,texture_export_folder:e,includes_custom_models:!1},i=qe.getDefault();n.variants[i.uuid]={...i.toJSON(),models:{}};for(let r of Outliner.root)switch(!0){case r instanceof Group:{mS(r,n,n.variants[i.uuid]);break}case r instanceof Locator:{_S(r,n);break}case r instanceof ve:{gS(r,n);break}case(OutlinerElement.types.camera&&r instanceof OutlinerElement.types.camera):{xS(r,n);break}case r instanceof We:{fS(r,n);break}case r instanceof $e:{hS(r,n);break}case r instanceof Cube:throw new fi(`Cubes cannot be exported as root nodes. Please parent them to a bone. (Found '${r.name}' outside of a bone)`);default:console.warn(\"Encountered unknown node type:\",r)}let a=aye(n);for(let[r,o]of Object.entries(n.nodes))o.default_transform=a[r];for(let r of qe.all)r.isDefault||(n.variants[r.uuid]=iye(r,n));return Xd.clear(),console.timeEnd(\"Rendering rig took\"),console.log(\"Rendered rig:\",n),n}s(bS,\"renderRig\");var fi=class extends Error{constructor(n,i,a){super(n);this.messageBoxOptions=i;this.messageBoxCallback=a;this.name=\"IntentionalExportError\"}};s(fi,\"IntentionalExportError\");var Zd=class extends fi{constructor(n,i){let a=PathModule.parse(n);super(`Failed to read file <code title=\"${n}\">${a.base}</code>:\n\n\\`\\`\\`\n`+i+\"\\n```\",{commands:{open_file:{text:\"Open File Location\",icon:\"folder_open\"}}},r=>{r===\"open_file\"&&shell.showItemInFolder(n)});this.originalError=i;this.name=\"IntentionalExportErrorFromInvalidFile\"}};s(Zd,\"IntentionalExportErrorFromInvalidFile\");function rb(){let t=Project.animated_java,e=$o(t.resource_pack),n=$o(t.data_pack),i=PathModule.join(\"assets/animated_java/models/blueprint/\",t.export_namespace),a=PathModule.join(\"assets/animated_java/textures/blueprint/\",t.export_namespace),r=PathModule.join(\"assets/minecraft/models/item/\",t.display_item.split(\":\").at(-1)+\".json\");return{resourcePackFolder:e,dataPackFolder:n,textureExportFolder:a,modelExportFolder:i,displayItemPath:r}}s(rb,\"getExportPaths\");async function rye({forceSave:t=!0,debugMode:e=!1}={}){let n=Project.animated_java,i=qf();await new Promise(o=>requestAnimationFrame(o));let a=qe.selected;qe.getDefault().select();let r=new pi(\"Project Export\").start();try{for(let x of qe.all)x.verifyTextureMap();for(let x of Texture.all)if(!(x.path&&qr(x.path)&&fs.existsSync(x.path))&&Texture.all.some(_=>_!==x&&_.name===x.name))throw new fi(`Texture name \"${x.name}\" is used more than once. Please make sure all textures have unique names.`);let{resourcePackFolder:o,dataPackFolder:l,textureExportFolder:c,modelExportFolder:d,displayItemPath:u}=rb();Dn.set(\"Rendering Rig...\");let p=bS(d,c);if(!p.includes_custom_models&&Texture.all.length!==0)throw new fi(A(\"misc.failed_to_export.rig_has_textures_but_no_custom_models.message\"));if(p.includes_custom_models&&Texture.all.length===0)throw new fi(A(\"misc.failed_to_export.rig_has_custom_models_but_no_textures.message\"));if(Project.animated_java.resource_pack_export_mode===\"none\"&&p.includes_custom_models)return Blockbench.showMessageBox({title:A(\"misc.failed_to_export.title\"),message:A(\"misc.failed_to_export.custom_models.message\"),buttons:[A(\"misc.failed_to_export.button\")]}),i.close(0),!1;let m=await v4(Project,p);Dn.set(\"Hashing Rendered Objects...\");let f=vS(p),g=x4(m);return await Yd([n.target_minecraft_version],{rig:p,displayItemPath:u,resourcePackFolder:o,textureExportFolder:c,modelExportFolder:d,debugMode:e}),n.data_pack_export_mode!==\"none\"&&await Gd([n.target_minecraft_version],{rig:p,animations:m,dataPackFolder:l,rigHash:f,animationHash:g,debugMode:e}),Project.last_used_export_namespace=n.export_namespace,t&&xh(),Blockbench.showQuickMessage(\"Project exported successfully!\",2e3),!0}catch(o){if(console.error(o),o instanceof fi)return Blockbench.showMessageBox({title:A(\"misc.failed_to_export.title\"),message:o.message,buttons:[A(\"misc.failed_to_export.button\")],...o.messageBoxOptions},o.messageBoxCallback),!1;Fo(o)}finally{a?.select(),i.close(0),r.debug()}return!1}s(rye,\"actuallyExportProject\");async function zc(t){if(!Project)return!1;if(Cube.all.some(n=>Ad(n)===\"invalid\"))return Blockbench.showMessageBox({title:A(\"misc.failed_to_export.title\"),message:A(Rr(\"1.21.6\")?\"misc.failed_to_export.invalid_rotation.message_post_1_21_6\":\"misc.failed_to_export.invalid_rotation.message\"),buttons:[A(\"misc.failed_to_export.button\")]}),!1;bo.set({});let e=jc();return await new Promise(n=>requestAnimationFrame(n)),console.log(\"Blueprint Setting Errors\",bo.get()),Object.keys(bo.get()).length>0?(Blockbench.showMessageBox({title:A(\"misc.failed_to_export.title\"),message:A(\"misc.failed_to_export.blueprint_settings.message\")+`\n\n`+Object.entries(bo.get()).map(n=>A(\"misc.failed_to_export.blueprint_settings.error_item\",n[0])+`\n - `+n[1]).join(`\n\n`),buttons:[A(\"misc.failed_to_export.button\")]}),!1):(e.close(0),await rye(t))}s(zc,\"exportProject\");var vh=(t=>(t[\"1.20.4\"]=\"1.20.4\",t[\"1.20.5\"]=\"1.20.5\",t[\"1.21.2\"]=\"1.21.2\",t[\"1.21.4\"]=\"1.21.4\",t[\"1.21.5\"]=\"1.21.5\",t[\"1.21.6\"]=\"1.21.6\",t[\"1.21.9\"]=\"1.21.9\",t))(vh||{}),Ur=class{constructor(e,n,i,a){this.path=e;this.exportNamespace=n;this.lastUsedExportNamespace=i;this.rootFolder=a}coreFiles=new Set;previousCoreFiles=new Set;versionedFiles=new Set;previousVersionedFiles=new Set;previousAJMeta={};read(){if(!fs.existsSync(this.path))return;try{this.previousAJMeta=JSON.parse(fs.readFileSync(this.path,\"utf-8\"))}catch(i){throw new fi(`Failed to read existing AJMeta file: ${i}`)}if(this.previousAJMeta.formatVersion!==\"1.0.0\"){let i=this.previousAJMeta;this.previousAJMeta={formatVersion:\"1.0.0\",rigs:{}};for(let[a,r]of Object.entries(i))this.previousAJMeta.rigs[a]={versionedFiles:r.files}}this.previousAJMeta.rigs??={};let e=this.previousAJMeta.rigs[this.lastUsedExportNamespace];if(e){Array.isArray(e.versionedFiles)||(e.versionedFiles=[]);for(let i of e.versionedFiles)this.previousVersionedFiles.add(PathModule.join(this.rootFolder,i));delete this.previousAJMeta.rigs[this.lastUsedExportNamespace]}let n=this.previousAJMeta.rigs[this.exportNamespace];if(n){Array.isArray(n.versionedFiles)||(n.versionedFiles=[]);for(let i of n.versionedFiles)this.previousVersionedFiles.add(PathModule.join(this.rootFolder,i));delete this.previousAJMeta.rigs[this.exportNamespace]}}write(){let e=PathModule.dirname(this.path),n={formatVersion:\"1.0.0\",rigs:gh({...this.previousAJMeta.rigs,[this.exportNamespace]:{coreFiles:Array.from(this.coreFiles).map(i=>wf(PathModule.relative(e,i))).sort(),versionedFiles:Array.from(this.versionedFiles).map(i=>wf(PathModule.relative(e,i))).sort()}})};fs.writeFileSync(this.path,autoStringify(n))}};s(Ur,\"AJMeta\");var Co=class{content={};static fromFile(e){let n=new Co;if(!fs.existsSync(e))return console.warn(`Pack meta file does not exist at ${e}`),n;let i=fs.readFileSync(e,\"utf-8\");try{n.content=JSON.parse(i)}catch(a){throw new Zd(e,a)}return n}toJSON(){return structuredClone(this.content)}};s(Co,\"PackMeta\");var qt={export_namespace:\"blueprint\",show_render_box:!1,auto_render_box:!0,render_box:[48,48],enable_plugin_mode:!1,resource_pack_export_mode:\"folder\",data_pack_export_mode:\"folder\",target_minecraft_version:\"1.21.9\",display_item:\"minecraft:white_dye\",custom_model_data_offset:0,enable_advanced_resource_pack_settings:!1,resource_pack:\"\",enable_advanced_data_pack_settings:!1,data_pack:\"\",on_summon_function:\"\",on_remove_function:\"\",on_pre_tick_function:\"\",on_post_tick_function:\"\",interpolation_duration:1,teleportation_duration:1,auto_update_rig_orientation:!0,use_storage_for_animation:!1,baked_animations:!0,json_file:\"\"},bo=new ke({});var Hr=Ny({id:\"animated-java:codec/blueprint\"},{name:\"Blueprint\",extension:\"ajblueprint\",remember:!0,load_filter:{extensions:[\"ajblueprint\"],type:\"json\"},load(t,e){let n=ss.get();if(!n)throw new Error(\"Animated Java Blueprint format is not registered!\");if(console.log(`Loading Animated Java Blueprint from '${e.name}'...`),t=yf(t),setupProject(n,t.meta?.uuid),!Project)throw new Error(\"Failed to load Animated Java Blueprint\");this.parse(t,e.path);let i=pathToName(e.path,!0);if(e.path&&isApp&&!e.no_file){Project.name=pathToName(e.path,!1),Project.save_path=e.path,addRecentProject({name:i,path:e.path,icon:ss.get()?.icon});let a=Project;setTimeout(()=>{Project===a&&updateRecentProjectThumbnail()},500)}Settings.updateSettingsInProfiles(),console.log(`Successfully loaded Animated Java Blueprint\n - Project: ${Project.name}\n - UUID: ${Project.uuid}`)},parse(t,e){if(console.log(`Parsing Animated Java Blueprint from '${e}'...`),!Project)throw new Error(\"No project to parse into\");Project.save_path=e,t.meta?.box_uv!==void 0&&(Project.box_uv=t.meta.box_uv),t.resolution!==void 0&&(Project.texture_width=t.resolution.width??16,Project.texture_height=t.resolution.height??16);for(let n in ModelProject.properties)ModelProject.properties[n].merge(Project,t);if(t.blueprint_settings&&(Project.animated_java={...qt,...t.blueprint_settings}),Project.animated_java.enable_plugin_mode&&(Project.animated_java.enable_plugin_mode=!1),Project.last_used_export_namespace=t.meta?.last_used_export_namespace??Project.animated_java.export_namespace,t.textures)for(let n of t.textures){let i=new Texture(n,n.uuid).add(!1);if(n.relative_path&&Project.save_path){let a=PathModule.resolve(Project.save_path,n.relative_path);if(fs.existsSync(a)){i.fromPath(a);continue}}n.path&&fs.existsSync(n.path)&&!t.meta?.backup?i.fromPath(n.path):n.source?.startsWith(\"data:\")&&i.fromDataURL(n.source)}if(t.elements){let n=Texture.getDefault();for(let i of t.elements){let a=OutlinerElement.fromSave(i,!0);switch(!0){case a instanceof Cube:{for(let r in a.faces)if(i.faces){let o=i.faces[r].texture!==void 0&&Texture.all[i.faces[r].texture];o&&(a.faces[r].texture=o.uuid)}else n&&a.faces&&a.faces[r].texture!==void 0&&(a.faces[r].texture=n.uuid);break}}}}if(t.outliner){parseGroups(t.outliner);for(let n of Group.all)n.name=Kt(n.name)}if(t.variants&&(qe.all=[],t.variants.default?qe.fromJSON(t.variants?.default,!0):(console.warn('No default Variant found, creating one named \"Default\"'),new qe(\"Default\",!0)),Array.isArray(t.variants.list))){for(let n of t.variants.list)qe.fromJSON(n);Project.variants=qe.all}if(t.animations)for(let n of t.animations){let i=new Blockbench.Animation;i.uuid=n.uuid??guid(),i.extend(n).add()}if(t.animation_controllers)for(let n of t.animation_controllers){let i=new Blockbench.AnimationController;i.uuid=n.uuid??guid(),i.extend(n).add()}if(t.animation_variable_placeholders&&(Interface.Panels.variable_placeholders.inside_vue.$data.text=t.animation_variable_placeholders),t.backgrounds){for(let n in t.backgrounds)if(Object.hasOwn(Project.backgrounds,n)){let i=t.backgrounds[n],a=Project.backgrounds[n];i.image!==void 0&&(a.image=i.image),i.size!==void 0&&(a.size=i.size),i.x!==void 0&&(a.x=i.x),i.y!==void 0&&(a.y=i.y),i.lock!==void 0&&(a.lock=i.lock)}Preview.all.forEach(n=>{n.canvas.isConnected&&n.loadBackground()})}if(Array.isArray(t.collections))for(let n of t.collections)new Collection(n,n.uuid).add();Canvas.updateAll(),Validator.validate(),this.dispatchEvent(\"parsed\",{model:t})},compile(t={}){if(console.log(`Compiling Animated Java Blueprint from ${Project.name}...`),!Project)throw new Error(\"No project to compile.\");let e=qe.selected;qe.selectDefault();let n={meta:{format:Qt,format_version:Ke.version,uuid:Project.uuid,save_location:Project.save_path,last_used_export_namespace:Project.last_used_export_namespace},resolution:{width:Project.texture_width??16,height:Project.texture_height??16}},i=Qs();for(let r of Object.keys(Project.animated_java)){let o=Project.animated_java[r];o==null||o===i[r]||(n.blueprint_settings??={},n.blueprint_settings[r]=o)}for(let r in ModelProject.properties)ModelProject.properties[r].export&&ModelProject.properties[r].copy(Project,n);n.elements=[];for(let r of elements)n.elements.push(r.getSaveCopy?.(!!n.meta));n.outliner=compileGroups(!0),n.textures=[];for(let r of Texture.all){let o=r.getSaveCopy();if(delete o.selected,isApp&&Project.save_path&&r.path&&PathModule.isAbsolute(r.path)){let l=PathModule.relative(PathModule.dirname(Project.save_path),r.path);o.relative_path=l.replace(/\\\\/g,\"/\")}t.bitmaps!=!1&&(Settings.get(\"embed_textures\")||t.backup||t.bitmaps==!0)&&(o.source=r.getDataURL(),o.internal=!0),t.absolute_paths==!1&&delete o.path,n.textures.push(o)}n.variants={default:qe.getDefault().toJSON(),list:qe.allExcludingDefault().map(r=>r.toJSON())};let a={bone_names:!0,absolute_paths:t.absolute_paths};if(Blockbench.Animation.all.length>0){n.animations=[];for(let r of Blockbench.Animation.all)r.getUndoCopy&&n.animations.push(r.getUndoCopy(a,!0))}if(Blockbench.AnimationController.all.length>0){n.animation_controllers=[];for(let r of Blockbench.AnimationController.all)r.getUndoCopy&&n.animation_controllers.push(r.getUndoCopy(a,!0))}if(Interface.Panels.variable_placeholders.inside_vue.$data.text&&(n.animation_variable_placeholders=Interface.Panels.variable_placeholders.inside_vue.$data.text),!t.backup){let r={};for(let o in Project.backgrounds){let l=Project.backgrounds[o];l.image&&(r[o]=l.getSaveCopy())}Object.keys(r).length&&(n.backgrounds=r)}return Collection.all.length>0&&(n.collections=Collection.all.map(r=>r.getSaveCopy())),e?.select(),console.log(\"Successfully compiled Animated Java Blueprint\",n),t.raw?n:compileJSON(n)},export(){if(console.log(`Exporting Animated Java Blueprint for ${Project.name}...`),!Project)throw new Error(\"No project to export.\");Blockbench.export({resource_id:\"animated_java_blueprint.export\",name:(Project.name||\"unnamed\")+\".ajblueprint\",startpath:Project.save_path,type:\"json\",extensions:[this.extension],content:this.compile(),custom_writer:(t,e)=>{fs.existsSync(PathModule.dirname(e))?(Project.save_path=e,this.write(t,e)):(console.error(`Failed to export Animated Java Blueprint, file location '${e}' does not exist!`),Blockbench.showMessageBox({title:A(\"error.blueprint_export_path_doesnt_exist.title\"),message:A(\"error.blueprint_export_path_doesnt_exist\",e)}))}})},fileName(){return Project?.name?`${Project.name}.ajblueprint`:\"unnamed_project.ajblueprint\"}});var Qt=\"animated-java:format/blueprint\";function wS(t){let e=Math.max(...t.rotation),n=Math.min(...t.rotation);if(e<=45&&n>=-45)return;let i=Math.abs(e)>=Math.abs(n)?e:n,a=t.rotation.indexOf(i),r=Project.selected_elements;Project.selected_elements=[t],rotateOnAxis(()=>i,a,!0),Project.selected_elements=r}s(wS,\"fixCubeRotation\");function ES(){Project.save_path=\"\",Project.last_used_export_namespace=\"\";for(let t of Group.all)t.createUniqueName(Group.all.filter(e=>e!==t)),t.sanitizeName();for(let t of Blockbench.Animation.all)t.createUniqueName(Blockbench.Animation.all.filter(e=>e!==t)),t.name=Kt(t.name);for(let t of Cube.all)t.setUVMode(!1),wS(t);Canvas.updateAll()}s(ES,\"convertToBlueprint\");function Qs(){return{...qt}}s(Qs,\"getDefaultProjectSettings\");K.UPDATE_VIEW.subscribe(()=>{if(!Project||!Fe()||(Project.visualBoundingBox&&scene.remove(Project.visualBoundingBox),!Project.animated_java.show_render_box))return;let t=0,e=0;if(Project.animated_java.auto_render_box){for(let a of Cube.all)t=Math.max(t,Math.abs(a.to[0]),Math.abs(a.to[2]),Math.abs(a.from[0]),Math.abs(a.from[2])),e=Math.max(e,a.to[1],a.from[1]);for(let a of[...AnimatedJava.TextDisplay.all,...AnimatedJava.VanillaItemDisplay.all,...AnimatedJava.VanillaBlockDisplay.all]){let r=new THREE.Box3().setFromObject(a.mesh);t=Math.max(t,Math.abs(r.min.x),Math.abs(r.min.z),Math.abs(r.max.x),Math.abs(r.max.z)),e=Math.max(e,r.max.y)}let i=8;t+=i,e+=i}else t=Project.animated_java.render_box[0],e=Project.animated_java.render_box[1];let n=new THREE.BoxGeometry(t*2,e,t*2);Project.visualBoundingBox=new THREE.LineSegments(new THREE.EdgesGeometry(n),new THREE.LineBasicMaterial({color:\"#855000\"})),Project.visualBoundingBox.position.set(0,e/2,0),scene.add(Project.visualBoundingBox)});var ss=Fy({id:Qt,dependencies:[\"animated-java:codec/blueprint\"]},{name:A(\"format.blueprint.name\"),icon:\"icon-armor_stand\",category:\"animated_java\",target:\"Minecraft: Java Edition\",confidential:!1,condition:()=>!0,show_on_start_screen:!0,format_page:{component:{template:`<div id=\"${Qt}/format_page_mount\" style=\"display: flex; flex-direction: column; flex-grow: 1;\"></div>`,mounted(){Gn({component:iT,target:`div[id=\"${Qt}/format_page_mount\"]`})}}},onSetup(t,e){console.log(\"Animated Java Blueprint format setup\");let n=Qs();e?(t.animated_java=n,t.last_used_export_namespace=\"\"):t.animated_java={...n,...t.animated_java},t.pluginMode=new ke(t.animated_java.enable_plugin_mode),requestAnimationFrame(()=>{let i=ModelProject.all.indexOf(t),a=document.querySelectorAll(\"#tab_bar_list .project_tab\")[i];if(!a){console.error(\"Could not find project tab for Animated Java Blueprint project!\");return}a.querySelector(\"i\")?.remove(),Gn({target:a,prepend:!0,component:oT,props:{pluginMode:t.pluginMode}});for(let r of Cube.all)r.setUVMode(!1),wS(r);Canvas.updateAll()})},animated_textures:!0,animation_controllers:!0,animation_files:!0,texture_mcmeta:!0,animation_mode:!0,bone_binding_expression:!0,bone_rig:!0,box_uv:!1,centered_grid:!0,display_mode:!1,edit_mode:!0,integer_size:!1,java_face_properties:!0,locators:!0,meshes:!1,model_identifier:!1,optional_box_uv:!0,paint_mode:!0,parent_model_id:!1,pose_mode:!1,render_sides:\"front\",rotate_cubes:!0,rotation_limit:!1,select_texture_for_particles:!1,single_texture:!1,texture_folder:!1,texture_meshes:!1,uv_rotation:!0,vertex_color_ambient_occlusion:!0,java_cube_shading_properties:!0,box_uv_float_size:!1,cullfaces:!0});Language.data[\"format_category.animated_java\"]=A(\"format_category.animated_java\");ss.onCreated(t=>{let e=Hr.get();if(!e)throw new Error(\"Animated Java Blueprint codec is not registered!\");e.format=t,t.codec=e});function Fe(){return Format instanceof ModelFormat&&Format.id===Qt}s(Fe,\"activeProjectIsBlueprintFormat\");function aT(){let t=ss.get();if(!t)throw new Error(\"Animated Java Blueprint format is not registered!\");newProject(t),requestAnimationFrame(()=>{Project.openSettings()})}s(aT,\"createNewBlueprintProject\");function xh(){if(!Project||!Format||!Fe())return;let t=Hr.get();if(!t)throw new Error(\"Animated Java Blueprint codec is not registered!\");t.write(t.compile(),Project.save_path)}s(xh,\"saveBlueprint\");function Rr(t){return!compareVersions(t,Project.animated_java.target_minecraft_version)}s(Rr,\"projectTargetVersionIsAtLeast\");function oye(){return!!Group.first_selected||!!AnimatedJava.TextDisplay.selected.length||!!AnimatedJava.VanillaItemDisplay.selected.length||!!AnimatedJava.VanillaBlockDisplay.selected.length||!!(Array.isArray(OutlinerElement.types.locator?.selected)&&OutlinerElement.types.locator.selected.length)||!!(Array.isArray(OutlinerElement.types.camera?.selected)&&OutlinerElement.types.camera.selected.length)}s(oye,\"hasNonElementSelection\");function zf(){if(!Fe())return;let t=ss.get();if(!t){console.error(\"Animated Java Blueprint format is not registered!\");return}t.rotation_limit=!oye(),Rr(\"1.21.6\")||(t.rotation_snap=t.rotation_limit)}s(zf,\"updateRotationConstraints\");K.SELECT_PROJECT.subscribe(t=>{t.format.id===Qt&&K.SELECT_AJ_PROJECT.publish(t)});K.UNSELECT_PROJECT.subscribe(t=>{t.format.id===Qt&&K.UNSELECT_AJ_PROJECT.publish(t)});K.UPDATE_SELECTION.subscribe(zf);K.SELECT_AJ_PROJECT.subscribe(()=>{requestAnimationFrame(()=>{zf()})});K.UNSELECT_AJ_PROJECT.subscribe(t=>{t.visualBoundingBox&&scene.remove(t.visualBoundingBox)});function To(t){return new Tn(t.map(e=>new fn(e)))}s(To,\"arrayToNbtFloatArray\");function nb(t){let e=new THREE.Matrix4().copy(t).transpose().toArray().map(n=>Ja(n,4));return To(e)}s(nb,\"matrixToNbtFloatArray\");function lS(t){let e=new ot;return e.set(\"translation\",To(t.translation.toArray())),e.set(\"left_rotation\",To(t.left_rotation.toArray())),e.set(\"scale\",To(t.scale.toArray())),e}s(lS,\"transformationToNbt\");function Wd(t,e,n){return t.split(PathModule.sep).map(i=>i===e?n:i).join(PathModule.sep)}s(Wd,\"replacePathPart\");function gh(t){let e={};return Object.keys(t).sort().forEach(n=>{e[n]=t[n]}),e}s(gh,\"sortObjectKeys\");var kS=s((t,e)=>new Promise((n,i)=>{nT(t,e,(a,r)=>{a?i(a):n(r)})}),\"unzip\");function Ad(t){let e=t.rotation[0]+t.rotation[1]+t.rotation[2];if(e===0)return\"valid\";let n=e===t.rotation[0]||e===t.rotation[1]||e===t.rotation[2];return n&&Rr(\"1.21.6\")?e<=45&&e>=-45?\"1.21.6+\":\"invalid\":n&&(e===-45||e===-22.5||e===0||e===22.5||e===45)?\"valid\":\"invalid\"}s(Ad,\"isCubeValid\");async function b4(){return new Promise(t=>requestAnimationFrame(t))}s(b4,\"sleepForAnimationFrame\");var jS=ij;async function sye(t,e){fj(\"Downloading Minecraft Assets...\");let n=await(0,AS.default)(t,{retry:{retries:3}}).on(\"downloadProgress\",i=>{mj(i.percent*100)}).catch(i=>{console.error(\"Failed to download Minecraft client:\",i)});if(!n)throw G0(),new Error(\"Failed to download Minecraft client after 3 retries.\");await fs.promises.writeFile(e,new Uint8Array(n))}s(sye,\"downloadJar\");async function yh(){let t=3,e=await no();for(t=3;t-->=0;){let n;try{n=await fetch(e.url)}catch(i){console.error(\"Failed to fetch latest Minecraft version API:\",i)}if(n?.ok){let i=await n.json();if(!i?.downloads?.client)throw new Error(`Failed to find client download for ${e.id}`);return i.downloads.client.url}}throw new Error(\"Failed to fetch latest Minecraft version API after 3 retries.\")}s(yh,\"getLatestVersionClientDownloadUrl\");function ob(){let t=electron.app.getPath(\"userData\");return PathModule.join(t,`${Ke.name}/latest.jar`)}s(ob,\"getCachedJarFilePath\");async function bh(){localStorage.setItem(\"assetsLoaded\",\"false\");let t=await yh();console.log(\"Downloading latest Minecraft client:\",t);let e=ob();await fs.promises.mkdir(PathModule.dirname(e),{recursive:!0}),await sye(t,e),console.log(\"Downloaded latest Minecraft client:\",e)}s(bh,\"updateAssets\");async function Ux(){console.log(\"Checking for Minecraft assets update...\");let t=Il();if(!t)console.log(\"No current Minecraft version found, updating assets...\"),await bh();else{let n=await no();t.id!==n.id&&(console.log(\"Minecraft assets are outdated, updating...\"),await bh())}let e=ob();(!fs.existsSync(e)||localStorage.getItem(\"assetsLoaded\")!==\"true\")&&(console.log(\"No cached Minecraft client found, updating assets...\"),await bh()),console.log(\"Does file exist?\",fs.existsSync(e)),console.log(\"Are assets loaded?\",localStorage.getItem(\"assetsLoaded\")===\"true\"),await TS(),console.log(\"Minecraft assets are up to date!\"),localStorage.setItem(\"assetsLoaded\",\"true\"),requestAnimationFrame(()=>K.MINECRAFT_ASSETS_LOADED.publish())}s(Ux,\"checkForAssetsUpdate\");var Uc;async function TS(){let t=ob(),e=await fs.promises.readFile(t);Uc=await kS(new Uint8Array(e),{filter:n=>n.name.startsWith(\"assets/\")})}s(TS,\"extractAssets\");async function Qo(){return new Promise(t=>{Uc!==void 0?t():K.MINECRAFT_ASSETS_LOADED.subscribe(()=>t(),!0)})}s(Qo,\"assetsLoaded\");function Lx(t){if(!Uc)throw new Error(\"Assets not loaded\");return!!Uc[t]}s(Lx,\"hasAsset\");function sb(t){if(!Uc)throw new Error(\"Assets not loaded\");if(jS[t])return Buffer.from(jS[t]);let e=Uc[t];if(!e)throw new Error(`Asset not found: ${t}`);return Buffer.from(e)}s(sb,\"getRawAsset\");function Zo(t){let e=sb(t);if(!e)throw new Error(`Asset not found: ${t}`);return`data:image/png;base64,${e.toString(\"base64\")}`}s(Zo,\"getPngAssetAsDataUrl\");function Mi(t){let e=sb(t);if(!e)throw new Error(`Asset not found: ${t}`);let n=e.toString(\"utf-8\");try{return JSON.parse(n)}catch(i){throw console.error(`Failed to parse JSON asset from ${t}:`,n,i),i}}s(Mi,\"getJSONAsset\");K.PLUGIN_LOAD.subscribe(()=>{window.navigator.onLine||G0(),K.NETWORK_CONNECTED.publish(),dj(),Promise.all([new Promise(t=>K.MINECRAFT_ASSETS_LOADED.subscribe(t)),new Promise(t=>K.MINECRAFT_REGISTRY_LOADED.subscribe(t)),new Promise(t=>K.MINECRAFT_FONTS_LOADED.subscribe(t)),new Promise(t=>K.BLOCKSTATE_REGISTRY_LOADED.subscribe(t))]).then(()=>{pj()}).catch(t=>{console.error(t),Blockbench.showToastNotification({text:\"Animated Java failed to load! Please restart Blockbench\",color:\"var(--color-error)\"})})});var lye=\"abcdefghijklmnopqrstuvwxyz0123456789\",cye=\"\\u1D00\\u0299\\u1D04\\u1D05\\u1D07\\uA730\\u0262\\u029C\\u026A\\u1D0A\\u1D0B\\u029F\\u1D0D\\u0274\\u1D0F\\u1D18\\uA7AF\\u0280\\uA731\\u1D1B\\u1D1C\\u1D20\\u1D21x\\u028F\\u1D22\\u2070\\xB9\\xB2\\xB3\\u2074\\u2075\\u2076\\u2077\\u2078\\u2079\";function Ca(t){let e=\"\";for(let n of t){let i=lye.indexOf(n.toLowerCase());i!==-1?e+=cye[i]:e+=n}return e}s(Ca,\"toSmallCaps\");function Kt(t){return t.toLowerCase().replace(/[^a-z0-9_]+/g,\"_\")}s(Kt,\"sanitizeStorageKey\");function Fr(t,e){let[n,...i]=t.split(\":\");if(!n)throw new Error(`Invalid resource location: '${t}'`);return i.length===0&&(i=[n],n=\"minecraft\"),`assets/${n}/${e}/${i.join(\"/\")}`}s(Fr,\"getPathFromResourceLocation\");function qr(t){let e=Sa(t);return!!(e?.namespace&&e.resourcePath)}s(qr,\"isResourcePackPath\");function Sa(t){t=t.replaceAll(/\\\\/g,\"/\");let e=t.split(\"/\"),n=e.indexOf(\"assets\");if(n===-1)return;let i=e.slice(0,n).join(\"/\"),a=e[n+1],r=e[n+2],o=e.slice(n+3,-1).join(\"/\"),l=qc.basename(t).split(\".\").slice(0,-1).join(\".\");if(l!==l.toLowerCase())return;let c=(a+\":\"+PathModule.join(o,l)).replaceAll(/\\\\/g,\"/\"),d=e.slice(n+4).join(\"/\");return{packRoot:i,namespace:a,resourcePath:o,resourceLocation:c,subtypelessPath:d,fileName:l,fileExtension:qc.extname(t),type:r}}s(Sa,\"parseResourcePackPath\");function bc(t){let[e,...n]=t.split(\":\");n.length===0&&(n=[e],e=\"minecraft\");let i=n.join(\"\"),a=i.split(\"/\")[0],r=PathModule.parse(i),o=PathModule.join(e,i);return{namespace:e,path:i,fullPath:o,type:a,dir:r.dir,name:r.name}}s(bc,\"parseResourceLocation\");function CS(t){let e=Vc(t);return!!(e?.namespace&&e.resourcePath)}s(CS,\"isDataPackPath\");function Vc(t){t=t.replaceAll(/\\\\/g,\"/\");let e=t.split(\"/\"),n=e.indexOf(\"data\");if(n===-1)return;let i=e.slice(0,n).join(\"/\"),a=e[n+1],r=e[n+2],o;switch(r){case\"tags\":o=e.slice(n+4,-1).join(\"/\");break;default:o=e.slice(n+3,-1).join(\"/\");break}let l=qc.basename(t).split(\".\").slice(0,-1).join(\".\");if(l!==l.toLowerCase())return;let c=(a+\":\"+PathModule.join(o,l)).replaceAll(/\\\\/g,\"/\"),d=e.slice(n+4).join(\"/\");return{packRoot:i,namespace:a,resourcePath:o,resourceLocation:c,subtypelessPath:d,fileName:l,fileExtension:qc.extname(t),type:r}}s(Vc,\"parseDataPackPath\");var Ii=class{replace=!1;values=[];has(e){let n=Ii.getEntryId(e);return this.values.some(i=>Ii.getEntryId(i)===n)}add(e){this.get(e)||this.values.push(e)}get(e){let n=Ii.getEntryId(e);return this.values.find(i=>Ii.getEntryId(i)===n)}filter(e){return this.values=this.values.filter(e),this}merge(e){this.replace=e.replace;for(let n of e.values)this.add(n);return this}sort(){return this.values.sort((e,n)=>{let i=Ii.getEntryId(e),a=Ii.getEntryId(n);return i===\"animated_java:global/on_tick\"?1:a===\"animated_java:global/on_tick\"?-1:i.localeCompare(a,\"en\")}),this}static getEntryId(e){return typeof e==\"string\"?e:e.id}static fromJSON(e){let n=new Ii;return typeof e.replace==\"boolean\"&&(n.replace=e.replace),Array.isArray(e.values)&&(n.values=structuredClone(e.values)),n}toJSON(){return{replace:this.replace,values:structuredClone(this.values)}}};s(Ii,\"DataPackTag\");function Zs(t,e){return t===\"true\"?!0:t===\"false\"?!1:isNaN(Number(t))?e&&t.includes(\"|\")?t.split(\"|\").map(n=>n===\"true\"?!0:n===\"false\"?!1:isNaN(Number(n))?n:Number(n)):t:Number(t)}s(Zs,\"resolveBlockstateValueType\");async function bf(t){if(!Xn.item){await Qo();return}let[e,n]=t.split(\":\");return n||(n=e,e=\"minecraft\"),(e===\"minecraft\"||e===\"\")&&Xn.item.has(n)?\"\":`This item does not exist in Minecraft ${Il().id}.`}s(bf,\"validateItem\");async function vf(t){Xn.block||await Qo();let e=await wd(t);return e?(e.resource.namespace===\"minecraft\"||e.resource.namespace===\"\")&&Xn.block.has(e.resource.name)?Bx(e):`This block does not exist in Minecraft ${Il().id}.`:\"Invalid block ID.\"}s(vf,\"validateBlock\");async function wd(t){let e={};if(t.includes(\"[\")){let i=/(.+?)\\[((?:[^,=[\\]]+=[^,=[\\]]+,?)+)?]/.exec(t);if(!i)return;if(i[2]!==void 0){let a=i[2].split(\",\");for(let r of a){let[o,l]=r.trim().split(\"=\");e[o]=Zs(l,!1)}}t=i[1]}let n=bc(t);return{resource:n,resourceLocation:n.namespace+\":\"+n.path,states:e,blockStateRegistryEntry:await wc(n.name)}}s(wd,\"parseBlock\");function Jd(t){switch(t){case\"1.20.4\":return 26;case\"1.20.5\":return 41;case\"1.21.2\":return 57;case\"1.21.4\":return 61;case\"1.21.5\":return 71;case\"1.21.6\":return 80;case\"1.21.9\":return 88;default:return console.warn(`Unknown Minecraft version: ${t}`),1/0}}s(Jd,\"getDataPackFormat\");function ab(t){switch(t){case\"1.20.4\":return 22;case\"1.20.5\":return 32;case\"1.21.2\":return 42;case\"1.21.4\":return 46;case\"1.21.5\":return 55;case\"1.21.6\":return 63;case\"1.21.9\":return 69;default:return console.warn(`Unknown Minecraft version: ${t}`),1/0}}s(ab,\"getResourcePackFormat\");function fh(t){let e=Object.values(vh),n=e.indexOf(t);if(!(n===-1||n===e.length-1))return e[n+1]}s(fh,\"getNextSupportedVersion\");function uye(t){let e,n,i,a,r;return{c(){e=L(\"p\"),e.textContent=`${A(\"action.upgrade_old_aj_model_loader.body\")}`,n=J(),i=L(\"button\"),i.textContent=`${A(\"action.upgrade_old_aj_model_loader.button\")}`,E(i,\"class\",\"svelte-16p5p64\")},m(o,l){U(o,e,l),U(o,n,l),U(o,i,l),a||(r=Ue(i,\"click\",lb),a=!0)},p:ie,i:ie,o:ie,d(o){o&&z(e),o&&z(n),o&&z(i),a=!1,r()}}}s(uye,\"create_fragment\");var wh=class extends Pe{constructor(e){super(),Ve(this,e,null,uye,De,{})}};s(wh,\"FormatPage\");var SS=wh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"button.svelte-16p5p64{width:100%;height:40px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var cb=!1;async function lb(){if(cb)return;cb=!0;let t=await electron.dialog.showOpenDialog({properties:[\"openFile\"],filters:[{name:\".ajmodel\",extensions:[\"ajmodel\"]}],message:A(\"action.upgrade_old_aj_model_loader.select_file\")});cb=!1,!t.canceled&&dye(t.filePaths[0])}s(lb,\"openAJModel\");function dye(t){try{console.log(`Converting .ajmodel: ${t}`);let e=yf(JSON.parse(fs.readFileSync(t,\"utf8\"))),n=Hr.get();if(!n)throw new Error(\"Animated Java Blueprint codec is not registered!\");n.load(e,{name:\"Upgrade .ajmodel to Blueprint\",path:t}),e.blueprint_settings.export_namespace??=Kt(Project.name),requestAnimationFrame(()=>{Project.save_path=\"\",Project.export_path=\"\",Project.openSettings()})}catch(e){console.error(e),Fo(e)}}s(dye,\"convertAJModelToBlueprint\");My({id:\"animated-java:upgrade-aj-model-loader\"},{icon:\"upload_file\",category:\"animated_java\",name:A(\"action.upgrade_old_aj_model_loader.name\"),condition:!0,format_page:{component:{template:'<div id=\"animated-java:upgrade-aj-model-loader-target\" style=\"flex-grow: 1; display: flex; flex-direction: column; justify-content: space-between;\"></div>',mounted(){Gn({component:SS,target:\"#animated-java\\\\:upgrade-aj-model-loader-target\",injectIndex:2})}}},onStart:lb});async function Eh(){let t=Project.animated_java,{resourcePackFolder:e,dataPackFolder:n}=rb();if(t.resource_pack_export_mode===\"folder\"){let i=PathModule.join(e,\"assets.ajmeta\"),a=new Ur(i,t.export_namespace,Project.last_used_export_namespace,e);a.read();let r=new Set;for(let o of a.previousVersionedFiles){if(!Ec(o))fs.existsSync(o)&&await fs.promises.unlink(o);else if(t.export_namespace!==Project.last_used_export_namespace&&Vc(o).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)&&fs.existsSync(o)){let d=Wd(o,Project.last_used_export_namespace,t.export_namespace);await fs.promises.mkdir(PathModule.dirname(d),{recursive:!0}),await fs.promises.copyFile(o,d),await fs.promises.unlink(o)}let l=PathModule.dirname(o);for(;!r.has(l)&&fs.existsSync(l)&&(await fs.promises.readdir(l)).length===0&&(await fs.promises.rm(l,{recursive:!0}),r.add(l),l=PathModule.dirname(l),PathModule.basename(l)!==\"assets\"););}a.write()}if(t.data_pack_export_mode===\"folder\"){let i=PathModule.join(n,\"data.ajmeta\"),a=new Ur(i,t.export_namespace,Project.last_used_export_namespace,n);a.read();let r=new Set;for(let o of[...a.previousCoreFiles,...a.previousVersionedFiles]){if(Ec(o)&&fs.existsSync(o)){if(t.export_namespace!==Project.last_used_export_namespace&&Vc(o).resourceLocation.startsWith(`animated_java:${Project.last_used_export_namespace}/`)){let u=Wd(o,Project.last_used_export_namespace,t.export_namespace);await fs.promises.mkdir(PathModule.dirname(u),{recursive:!0}),await fs.promises.copyFile(o,u),await fs.promises.unlink(o)}let c=JSON.parse((await fs.promises.readFile(o)).toString());c.values=c.values.filter(d=>typeof d==\"string\"&&(!d.startsWith(`animated_java:${t.export_namespace}/`)||!d.startsWith(`animated_java:${Project.last_used_export_namespace}/`))),await fs.promises.writeFile(o,autoStringify(c))}else fs.existsSync(o)&&await fs.promises.unlink(o);let l=PathModule.dirname(o);for(;!r.has(l)&&fs.existsSync(l)&&(await fs.promises.readdir(l)).length===0&&(await fs.promises.rm(l,{recursive:!0}),r.add(l),l=PathModule.dirname(l),PathModule.basename(l)!==\"data\"););}a.write()}Blockbench.showQuickMessage(\"Exported files extracted successfully!\",2e3)}s(Eh,\"cleanupExportedFiles\");var ub={\"1.6.0\":{title:\"v1.6.0\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-01-08\",categories:[{title:\"Changes\",list:[\"[BREAKING] Changed default resource pack structure: `animated_java:textures/item/export_namespace/` -> `animated_java:textures/blueprint/export_namespace/` & `animated_java:models/item/export_namespace/` -> `animated_java:models/blueprint/export_namespace/`\",\"Added changelog popup! (You're looking at it right now!)\",\"Added an export target for Minecraft 1.21.4\",\"Added support for item definitions (1.21.4)\",\"Added warning for loading Animated Java Data Packs in the wrong version.\",\"Improved internal MCB File compression\",\"Slightly improved empty JSON text rendering ([#322](https://github.com/Animated-Java/animated-java/issues/322)\",\"Added an Extract action to remove exported files from the Resource Pack and Data Pack\",\"Changed missing assets and data folder for resource and data pack folder settings errors into warnings\",\"Added a dialog and exception for exporting a blueprint with invalid cube rotations.\"]},{title:\"Fixes\",list:[\"Fixed tags getting cleared out in old exports\",\"Fixed incorrect export location for transparent texture.\",\"Fixed Per-Face UV not being enforced when converting\",\"Fixed [#348](https://github.com/Animated-Java/animated-java/issues/348)\",\"Fixed [#349](https://github.com/Animated-Java/animated-java/issues/349)\",\"Fixed [#347](https://github.com/Animated-Java/animated-java/issues/347)\",\"Fixed [#345](https://github.com/Animated-Java/animated-java/issues/345)\",\"Fixed [#341](https://github.com/Animated-Java/animated-java/issues/341)\",\"Fixed [#343](https://github.com/Animated-Java/animated-java/issues/343)\",\"Fixed [#340](https://github.com/Animated-Java/animated-java/issues/340)\",\"Fixed [#342](https://github.com/Animated-Java/animated-java/issues/342)\"]}]},\"1.6.1\":{title:\"v1.6.1\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-01-10\",categories:[{title:\"Changes\",list:[\"Slightly improved the changelog.\"]},{title:\"Fixes\",list:[\"Fixed overlays breaking custom function tags.\",\"Fixed [#350](https://github.com/Animated-Java/animated-java/issues/350)\",\"Fixed [#353](https://github.com/Animated-Java/animated-java/issues/353)\"]}]},\"1.6.2\":{title:\"v1.6.2\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-01-12\",categories:[{title:\"Changes\",list:[\"[BREAKING] Implemented improved scoreboard tag system. Please visit [this docs page](https://animated-java.dev/docs/rigs/tags) on the Animated Java website to learn more.\",\"[BREAKING] Removed individual variant summon functions. (`animated_java:namespace/summon/variant_name`) in favor of `animated_java:namespace/summon {args:{variant: 'variant_name'}}`.\",\"[BREAKING] Removed advanced folder options for Resource Packs.\",\"Re-organized the file structure of AJ's UI files.\",\"Updated the model format order on the start menu to be organized alphabetically.\",\"Added incomptaibility warnings for installing, or having installed, plugins that are incompatible with Animated Java.\"]},{title:\"Fixes\",list:[\"Fixed some visual and interactivity issues with the Variants panel.\",\"Fixed default Variant UUID changing every time a model is opened.\",'Fixed \"Display entity is not a string\" console spam',\"Fixed 1.21.2 using `custom_model_data` instead of `item_model`\",\"Fixed [#304](https://github.com/Animated-Java/animated-java/issues/304)\",\"Fixed [#356](https://github.com/Animated-Java/animated-java/issues/356)\",\"Fixed [#357](https://github.com/Animated-Java/animated-java/issues/357)\",\"Fixed [#358](https://github.com/Animated-Java/animated-java/issues/358)\",\"Fixed [#359](https://github.com/Animated-Java/animated-java/issues/359)\"]}]},\"1.6.3\":{title:\"v1.6.3\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-01-15\",categories:[{title:\"Changes\",list:[\"Updated to Blockbench 4.12.0\",\"Removed internal Transparent texture. The plugin will automatically create a transparent texture in your model's texture list if you previously used the internal one in any of your variants.\"]},{title:\"Fixes\",list:[\"Fixed invalid JSON error when exporting into a resource pack without a block texture atlas.\"]}]},\"1.6.4\":{title:\"v1.6.4\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-01-19\",categories:[{title:\"Fixes\",list:['Fixed \"safe_name\" export crash.',\"Fixed double v prefix in About dialog.\"]}]},\"1.7.0\":{title:\"v1.7.0\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-04-30\",categories:[{title:\"Changes\",list:[\"[BREAKING] Overhauled internal functions and data structures. This may cause some issues with older exports, so you should clean out your old AJ exports and re-export them.\",\"[BREAKING] Renamed `animated_java:<export_namespace>/as_own_locator_entities` to `animated_java:<export_namespace>/as_all_locators`.\",\"Added support for Minecraft 1.21.5.\",\"Added support for exporting to multiple target Minecraft versions at once.\",\"Reduced the size of exported Data Packs by about 50%.\",\"Added `Sync Passenger Rotation` config option to Locators.\",\"Added a new function: `animated_java:<export_namespace>/at_all_locators {command: string}` that runs a command at all of a rig's entity-less locator positions.\",\"Added a new function: `animated_java:<export_namespace>/as_locator {name: string, command: string}` that runs a command as and at a named locator's entity.\",\"Added a new function: `animated_java:<export_namespace>/at_locator {name: string, command: string}` that runs a command at an entity-less locator's position.\",\"Added a new function: `animated_java:<export_namespace>/as_camera {name: string, command: string}` that runs a command as and at a camera's entity.\",\"Added a new function: `animated_java:<export_namespace>/remove/entities` that kills all entities owned by a rig, whether they are attached to a root entity or not.\",\"Added a new Blueprint setting: `On-Remove Commands`.\",\"Added support for `shadow_color` to JSON Text Components.\",\"Temporarily made all descriptions of settings appear below settings.\"]},{title:\"Fixes\",list:[\"Fixed project settings leaking between opened `.ajblueprints`.\",\"Fixed textures being forcfully set as internal when saving an `.ajblueprint`.\",\"Fixed `tints` field being placed in the wrong location in exported item model definitions.\",\"Fixed bone rotation not being synced with the root entity when a rig is exported without animations.\",\"Fixed data entity being tagged with GLOBAL_NODE instead of GLOBAL_ENTITY.\",\"Fixed added missing tag PROJECT_ENTITY to data entities.\",\"Fixed locators and cameras missing most of their tags.\",\"Fixed missing PROJECT_ENTITY tag on root entities.\",\"Fixed backslash (\\\\) being allowed in node names.\",\"Fixed locators not being removed when calling `animated_java:global/remove/everything`.\",\"Fixed crash while exporting when encountering an invalid JSON file in the target data pack.\",\"Fixed [#389](https://github.com/Animated-Java/animated-java/issues/389)\",\"Fixed custom outliner element changes not marking a project as changed.\"]}]},\"1.7.1\":{title:\"v1.7.1\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-05-06\",categories:[{title:\"Fixes\",list:[\"Fixed [#412](https://github.com/Animated-Java/animated-java/issues/409)\"]}]},\"1.7.2\":{title:\"v1.7.2\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-05-07\",categories:[{title:\"Fixes\",list:[\"Fixed incorrect entity type for data entities on versions below 1.21.5.\",\"Fixed missing `as_...` functions in exported data packs below 1.21.5.\",\"Improved .mcb code consistency.\"]}]},\"1.7.3\":{title:\"v1.7.3\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-05-08\",categories:[{title:\"Fixes\",list:[\"Fixed adding cameras to a rig causing the data entity to dismount root.\",\"Make variant keyframes reset to default if their variant doesn't exist anymore.\"]}]},\"1.8.0-beta.1\":{title:\"v1.8.0-beta.1\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-13\",categories:[{title:\"Changes\",list:[\"[BREAKING] `play` and `stop` functions now pause all animations when called.\",\"[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.\",\"[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.\",\"Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.\",\"Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)\",\"Added support for Minecraft 1.21.6 and 1.21.9\",\"Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)\",\"Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.\",\"Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.\",\"Added a button to copy the exported JSON Text component of a Text Display to your clipboard.\",\"Updated keyframe UI, making it much more responsive, and easier to use.\",\"Added support for `light_emission` on cubes.\",\"The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.\",\"Improved Text Display JSON text input syntax highlighting.\",\"Improved Text Display JSON text input appearance.\",\"Improved JSON Text component parsing and error reporting.\",\"Improved all function errors and tellraws in exported Data Packs.\",\"Improved outdated warning formatting and functionality.\",\"Improved text display rendering performance, and update reactivity.\",\"Display item is no longer configurable in versions that use `item_model` (1.20.5+).\",\"The `summon` function now provides better feedback when using invalid arguments.\",\"Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.\",\"Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.\",\"Increased width of all node configs from 400px to 600px.\",\"Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.\",\"Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.\",\"Renamed all 'Commands' settings to 'Function'.\",\"Renamed 'On-Tick Function' to 'Post-Tick Function'.\",\"Added 'Pre-Tick Function' Blueprint setting.\",\"Renamed `raw` export mode to `folder`.\",\"Added new Blueprint setting: 'Auto Update Rig Orientation'.\",\"Added `animated_java:<export_namespace>/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.\",\"Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.\",\"Reduced the number of times the orientation of locators and cameras is updated while animating.\",\"Improved performance of `fontManager` char mesh rendering.\",\"Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.\",\"Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.\",\"Improved plugin incompatibility warnings.\"]},{title:\"Fixes\",list:[\"Fixed a few minor Text Display text wrapping issues.\",\"Fixed display entities causing collections to break.\",\"Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)\",\"Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)\",\"Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)\",\"Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)\",\"Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)\",\"Fixed GU failing on first load due to missing scoreboard dependency.\",\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\"Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)\",\"Fixed Text Display JSON text input not catching tab key presses.\",\"Fixed outdated rig warning not working in some cases.\",\"Fixed outdated rig warning entities missing important tags.\",\"Fixed missing translations for install popup.\",\"Fixed function tag merging not working correctly.\",\"Fixed missing `item_display` NBT tag on exported Item Displays.\",\"Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.\",\"Fixed project save status not updating when modifying node configs.\",\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\"Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)\",\"Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.\",\"Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)\",\"Fixed invalid cube warning not updating when editing cubes.\",\"Fixed relative paths not being recognized on windows.\",\"Fixed `set_frame` failing due to incorrect tag in entity selector.\",\"Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.\",\"Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.\",\"Fixed animation config dialog not marking project as unsaved after making changes.\",\"Fixed variants panel animating when switching between projects.\",\"Fixed `ajmodel` upgrader not opening when double clicked\"]},{title:\"Camera Fixes\",list:[\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\"Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)\",\"Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)\",\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\"]},{title:\"Internal Data Pack Changes and Fixes\",list:[\"Updated to the latest version of MC-Build.\",\"Added support for `.mcbt` files to the Data Pack compiler.\",\"Reduced entity data size by reducing the length of locator and camera transform keys.\",\"Removed `global/internal` folder.\",\"Expanded all `aj` namespaces to `animated_java` except tags.\",\"Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.\",\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\"`.mcb` files now use more descriptive variable names.\",\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\"Reduced overhead when generating variant functions.\",\"Switched over to using variables for storage names.\",\"Renamed `on_summon_commands` -> `on_summon_function`.\",\"Renamed `on_remove_commands` -> `on_remove_function`.\",\"Renamed `ticking_commands` -> `on_post_tick_function`.\",\"Moved some ticking and loading functionality out of individual namespaces and into global.\",\"Added `debug` macro to reduce code duplication.\",\"Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.\",\"Replaced all `arguments[1]` references with new `context` variable.\"]},{title:\"Other Changes and Fixes\",list:[\"Most enum-like values are now using TS enums.\",\"Removed config functionality from cameras entirely.\",\"Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.\",\"Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.\",\"`AnimatedJava.API` global has been renamed to `AnimatedJava`.\",\"Improve handling of Text and Block Display entity NBT when generating root entity passengers.\",\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\"`.mcb` files now use more descriptive variable names.\",\"`assetManager.getRawAsset` now returns a Buffer.\",\"Fixed broken Animated Java bar item condition.\",\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\"Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.\",\"Improve `ModelDataFixerUpper` types, logic flow, and error handling.\",\"Add `ModelDataFixerUpper` upgrade function for v1.8.0.\",\"Made `TELLRAW.RIG_OUTDATED` runtime-generic.\"]}]},\"1.8.0-beta.2\":{title:\"v1.8.0-beta.2\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-15\",categories:[{title:\"Changes\",list:[\"[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.\",\"[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.\",\"Replaced unique node configs with universal DisplayEntityConfig.\",\"Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.\",\"Added 'On Summon Function' to Display Entity Configs.\",\"Added 'On Apply Function' to Per-variant Display Entity Configs.\",\"Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.\",\"Improved the Render Box preview's reactivity.\"]},{title:\"Fixes\",list:[\"Fixed rotation validation not checking the correct version, and marking any rotation as invalid.\",\"Fixed Blueprints becoming unsavable after opening.\",\"Fixed Blueprints becoming unsavable after converting from another format.\",\"Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.\",\"Fixed uncaught error when deleting a text display.\",\"Fixed outdated warning not appearing until the second reload after rig_hash was modified.\",\"Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data.\"]}]},\"1.8.0-beta.3\":{title:\"v1.8.0-beta.3\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-15\",categories:[{title:\"Fixes\",list:[\"Fixed On-Summon Functions and On-Apply Functions not functioning.\"]}]},\"1.8.0-beta.4\":{title:\"v1.8.0-beta.4\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-16\",categories:[{title:\"Fixes\",list:[\"Fixed Blueprint format data fixer uppper failing to upgrade Blueprints past format version 1.6.5.\",\"Fixed outdated rig function failing due to incorrect root tag.\"]}]},\"1.8.0-beta.5\":{title:\"v1.8.0-beta.5\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-19\",categories:[{title:\"Fixes\",list:[\"Fixed cube rotations in 1.21.6+ allowing rotation values outside the -45..45 degree range\",\"Fixed rotation limits not being enforced when converting to a Blueprint.\",\"Fixed rotation limit not being enforced when rotating cubes.\",\"Fixed export crash due to invalid tag reference.\"]}]},\"1.8.0\":{title:\"v1.8.0\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-10-21\",categories:[{title:\"Changes\",list:[\"[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.\",\"[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.\",\"[BREAKING] `play` and `stop` functions now pause all animations when called.\",\"[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.\",\"[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.\",\"Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.\",\"Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)\",\"Added support for Minecraft 1.21.6 and 1.21.9\",\"Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)\",\"Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.\",\"Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.\",\"Added a button to copy the exported JSON Text component of a Text Display to your clipboard.\",\"Updated keyframe UI, making it much more responsive, and easier to use.\",\"Added support for `light_emission` on cubes.\",\"Replaced unique node configs with universal DisplayEntityConfig.\",\"Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.\",\"Added 'On Summon Function' to Display Entity Configs.\",\"Added 'On Apply Function' to Per-variant Display Entity Configs.\",\"Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.\",\"Improved the Render Box preview's reactivity.\",\"The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.\",\"Improved Text Display JSON text input syntax highlighting.\",\"Improved Text Display JSON text input appearance.\",\"Improved JSON Text component parsing and error reporting.\",\"Improved all function errors and tellraws in exported Data Packs.\",\"Improved outdated warning formatting and functionality.\",\"Improved text display rendering performance, and update reactivity.\",\"Display item is no longer configurable in versions that use `item_model` (1.20.5+).\",\"The `summon` function now provides better feedback when using invalid arguments.\",\"Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.\",\"Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.\",\"Increased width of all node configs from 400px to 600px.\",\"Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.\",\"Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.\",\"Renamed all 'Commands' settings to 'Function'.\",\"Renamed 'On-Tick Function' to 'Post-Tick Function'.\",\"Added 'Pre-Tick Function' Blueprint setting.\",\"Renamed `raw` export mode to `folder`.\",\"Added new Blueprint setting: 'Auto Update Rig Orientation'.\",\"Added `animated_java:<export_namespace>/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.\",\"Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.\",\"Reduced the number of times the orientation of locators and cameras is updated while animating.\",\"Improved performance of `fontManager` char mesh rendering.\",\"Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.\",\"Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.\",\"Improved plugin incompatibility warnings.\"]},{title:\"Fixes\",list:[\"Fixed a few minor Text Display text wrapping issues.\",\"Fixed display entities causing collections to break.\",\"Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)\",\"Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)\",\"Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)\",\"Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)\",\"Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)\",\"Fixed GU failing on first load due to missing scoreboard dependency.\",\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\"Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)\",\"Fixed Text Display JSON text input not catching tab key presses.\",\"Fixed outdated rig warning not working in some cases.\",\"Fixed outdated rig warning entities missing important tags.\",\"Fixed missing translations for install popup.\",\"Fixed function tag merging not working correctly.\",\"Fixed missing `item_display` NBT tag on exported Item Displays.\",\"Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.\",\"Fixed project save status not updating when modifying node configs.\",\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\"Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)\",\"Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.\",\"Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)\",\"Fixed invalid cube warning not updating when editing cubes.\",\"Fixed relative paths not being recognized on windows.\",\"Fixed `set_frame` failing due to incorrect tag in entity selector.\",\"Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.\",\"Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.\",\"Fixed animation config dialog not marking project as unsaved after making changes.\",\"Fixed variants panel animating when switching between projects.\",\"Fixed `ajmodel` upgrader not opening when double clicked.\",\"Fixed rotation validation not checking the correct version, and marking any rotation as invalid.\",\"Fixed Blueprints becoming unsavable after opening.\",\"Fixed Blueprints becoming unsavable after converting from another format.\",\"Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.\",\"Fixed uncaught error when deleting a text display.\",\"Fixed Blueprint format data fixer upper failing to upgrade Blueprints past format version 1.6.5.\",\"Fixed outdated warning not appearing until the second reload after rig_hash was modified.\",\"Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data.\"]},{title:\"Camera Fixes\",list:[\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\"Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)\",\"Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)\",\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\"]},{title:\"Internal Data Pack Changes and Fixes\",list:[\"Updated to the latest version of MC-Build.\",\"Added support for `.mcbt` files to the Data Pack compiler.\",\"Reduced entity data size by reducing the length of locator and camera transform keys.\",\"Removed `global/internal` folder.\",\"Expanded all `aj` namespaces to `animated_java` except tags.\",\"Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.\",\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\"`.mcb` files now use more descriptive variable names.\",\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\"Reduced overhead when generating variant functions.\",\"Switched over to using variables for storage names.\",\"Renamed `on_summon_commands` -> `on_summon_function`.\",\"Renamed `on_remove_commands` -> `on_remove_function`.\",\"Renamed `ticking_commands` -> `on_post_tick_function`.\",\"Moved some ticking and loading functionality out of individual namespaces and into global.\",\"Added `debug` macro to reduce code duplication.\",\"Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.\",\"Replaced all `arguments[1]` references with new `context` variable.\",\"Fixed outdated rig function failing due to incorrect root tag.\"]},{title:\"Other Changes and Fixes\",list:[\"Most enum-like values are now using TS enums.\",\"Removed config functionality from cameras entirely.\",\"Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.\",\"Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.\",\"`AnimatedJava.API` global has been renamed to `AnimatedJava`.\",\"Improve handling of Text and Block Display entity NBT when generating root entity passengers.\",\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\"`.mcb` files now use more descriptive variable names.\",\"`assetManager.getRawAsset` now returns a Buffer.\",\"Fixed broken Animated Java bar item condition.\",\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\"Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.\",\"Improve `ModelDataFixerUpper` types, logic flow, and error handling.\",\"Add `ModelDataFixerUpper` upgrade function for v1.8.0.\",\"Made `TELLRAW.RIG_OUTDATED` runtime-generic.\"]}]},\"1.8.1\":{title:\"v1.8.1\",author:\"Titus Evans (SnaveSutit)\",date:\"2025-11-2\",categories:[{title:\"Changes\",list:[\"\\u{1F4AC} Added Russian localization - Thanks Koishem!\",\"Added previewing for Item Display's `item_display` transforms.\"]},{title:\"Fixes\",list:[\"Fixed [#465](https://github.com/Animated-Java/animated-java/issues/465)\",\"Fixed `global/on_tick` function being placed at start of `minecraft:tick` function tag.\",\"Fixed backwards / missing chest model.\",\"Fixed block models on Item Displays using the wrong pivot point.\",\"Fixed item display panel losing focus when a valid item is entered.\"]}]}};function OS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(OS,\"get_each_context\");function IS(t,e,n){let i=t.slice();return i[3]=e[n],i}s(IS,\"get_each_context_1\");function DS(t,e,n){let i=t.slice();i[6]=e[n];let a=/^Fixed \\[#(\\d+)\\]\\(.+?\\)$/.exec(i[6]);return i[7]=a,i}s(DS,\"get_each_context_2\");function mye(t){let e,n,i=pureMarked(t[6])+\"\",a;return{c(){e=L(\"li\"),n=new Yi(!1),a=J(),n.a=a},m(r,o){U(r,e,o),n.m(i,e),I(e,a)},p:ie,d(r){r&&z(e)}}}s(mye,\"create_else_block_1\");function fye(t){let e,n,i,a,r,o=pureMarked(t[6].replace(\"[BREAKING]\",\"\").trim())+\"\",l;return{c(){e=L(\"li\"),n=L(\"p\"),i=L(\"span\"),i.textContent=\"BREAKING\",a=J(),r=new Yi(!1),l=J(),E(i,\"class\",\"breaking\"),r.a=null,E(n,\"class\",\"svelte-1hhexqb\"),E(e,\"class\",\"svelte-1hhexqb\")},m(c,d){U(c,e,d),I(e,n),I(n,i),I(n,a),r.m(o,n),I(e,l)},p:ie,d(c){c&&z(e)}}}s(fye,\"create_if_block_2\");function hye(t){let e,n,i={ctx:t,current:null,token:null,hasCatch:!0,pending:bye,then:_ye,catch:gye,value:10};return a1(n=kye(t[7][1]),i),{c(){e=_t(),i.block.c()},m(a,r){U(a,e,r),i.block.m(a,i.anchor=r),i.mount=()=>e.parentNode,i.anchor=e},p(a,r){t=a,r1(i,t,r)},d(a){a&&z(e),i.block.d(a),i.token=null,i=null}}}s(hye,\"create_if_block\");function gye(t){let e,n=pureMarked(t[6])+\"\",i;return{c(){e=L(\"li\"),i=J()},m(a,r){U(a,e,r),e.innerHTML=n,U(a,i,r)},p:ie,d(a){a&&z(e),a&&z(i)}}}s(gye,\"create_catch_block\");function _ye(t){let e,n,i=\"Fixed \",a,r,o;function l(u,p){return u[10]?vye:xye}s(l,\"select_block_type_1\");let d=l(t,-1)(t);return{c(){e=L(\"li\"),n=L(\"p\"),a=Re(i),r=J(),d.c(),o=J(),E(n,\"class\",\"svelte-1hhexqb\"),E(e,\"class\",\"svelte-1hhexqb\")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(n,r),d.m(n,null),U(u,o,p)},p(u,p){d.p(u,p)},d(u){u&&z(e),d.d(),u&&z(o)}}}s(_ye,\"create_then_block\");function xye(t){let e,n=\"#\"+t[7][1],i,a;return{c(){e=L(\"a\"),i=Re(n),E(e,\"href\",a=\"$\"+(MS+t[7][1])),E(e,\"target\",\"_blank\")},m(r,o){U(r,e,o),I(e,i)},p:ie,d(r){r&&z(e)}}}s(xye,\"create_else_block\");function vye(t){let e,n=\"#\"+t[10].number,i,a,r,o=\" - \",l,c,d,u=pureMarked(t[10].title)+\"\",p;return{c(){e=L(\"a\"),i=Re(n),r=J(),l=Re(o),c=J(),d=new Yi(!1),p=_t(),E(e,\"href\",a=t[10].html_url),E(e,\"target\",\"_blank\"),d.a=p},m(m,f){U(m,e,f),I(e,i),U(m,r,f),U(m,l,f),U(m,c,f),d.m(u,m,f),U(m,p,f)},p:ie,d(m){m&&z(e),m&&z(r),m&&z(l),m&&z(c),m&&z(p),m&&d.d()}}}s(vye,\"create_if_block_1\");function bye(t){let e,n,i,a,r,o=pureMarked(t[6])+\"\",l;return{c(){e=L(\"li\"),n=L(\"p\"),i=L(\"i\"),i.textContent=\"progress_activity\",a=J(),r=new Yi(!1),l=J(),E(i,\"class\",\"material-icons icon spinner svelte-1hhexqb\"),r.a=null,E(n,\"class\",\"svelte-1hhexqb\"),E(e,\"class\",\"svelte-1hhexqb\")},m(c,d){U(c,e,d),I(e,n),I(n,i),I(n,a),r.m(o,n),U(c,l,d)},p:ie,d(c){c&&z(e),c&&z(l)}}}s(bye,\"create_pending_block\");function FS(t){let e,n;function i(o,l){return o[7]?hye:o[6].startsWith(\"[BREAKING]\")?fye:mye}s(i,\"select_block_type\");let r=i(t,-1)(t);return{c(){r.c(),n=_t()},m(o,l){r.m(o,l),U(o,n,l)},p(o,l){r.p(o,l)},d(o){r.d(o),o&&z(n)}}}s(FS,\"create_each_block_2\");function NS(t){let e,n,i=t[3].title+\"\",a,r,o,l,c=t[3].list,d=[];for(let u=0;u<c.length;u+=1)d[u]=FS(DS(t,c,u));return{c(){e=L(\"li\"),n=L(\"h4\"),a=Re(i),r=J(),o=L(\"ul\");for(let u=0;u<d.length;u+=1)d[u].c();l=J(),E(o,\"class\",\"plugin_changelog_features\")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(e,r),I(e,o);for(let m=0;m<d.length;m+=1)d[m]&&d[m].m(o,null);I(e,l)},p(u,p){if(p&0){c=u[3].list;let m;for(m=0;m<c.length;m+=1){let f=DS(u,c,m);d[m]?d[m].p(f,p):(d[m]=FS(f),d[m].c(),d[m].m(o,null))}for(;m<d.length;m+=1)d[m].d(1);d.length=c.length}},d(u){u&&z(e),Wn(d,u)}}}s(NS,\"create_each_block_1\");function RS(t){let e,n,i,a,r,o=\"Animated Java \"+t[0].title,l,c,d,u=t[0].author+\"\",p,m,f,g,x,_=Eye(t[0].date)+\"\",h,v,b,y,w,S,F=t[0].categories,N=[];for(let k=0;k<F.length;k+=1)N[k]=NS(IS(t,F,k));return{c(){e=L(\"div\"),n=L(\"img\"),a=J(),r=L(\"h3\"),l=Re(o),c=J(),d=L(\"label\"),p=Re(u),m=J(),f=L(\"label\"),g=L(\"i\"),g.textContent=\"calendar_today\",x=J(),h=Re(_),b=J(),y=L(\"ul\");for(let k=0;k<N.length;k+=1)N[k].c();w=J(),S=L(\"hr\"),Ht(n.src,i=ya)||E(n,\"src\",i),E(n,\"alt\",\"\"),E(n,\"class\",\"svelte-1hhexqb\"),E(r,\"class\",\"svelte-1hhexqb\"),E(e,\"class\",\"title-container svelte-1hhexqb\"),E(d,\"class\",\"plugin_changelog_author\"),E(g,\"class\",\"material-icons icon\"),E(f,\"class\",\"plugin_changelog_date\"),E(f,\"title\",v=wye(t[0].date)),E(S,\"class\",\"svelte-1hhexqb\")},m(k,R){U(k,e,R),I(e,n),I(e,a),I(e,r),I(r,l),U(k,c,R),U(k,d,R),I(d,p),U(k,m,R),U(k,f,R),I(f,g),I(f,x),I(f,h),U(k,b,R),U(k,y,R);for(let D=0;D<N.length;D+=1)N[D]&&N[D].m(y,null);U(k,w,R),U(k,S,R)},p(k,R){if(R&0){F=k[0].categories;let D;for(D=0;D<F.length;D+=1){let B=IS(k,F,D);N[D]?N[D].p(B,R):(N[D]=NS(B),N[D].c(),N[D].m(y,null))}for(;D<N.length;D+=1)N[D].d(1);N.length=F.length}},d(k){k&&z(e),k&&z(c),k&&z(d),k&&z(m),k&&z(f),k&&z(b),k&&z(y),Wn(N,k),k&&z(w),k&&z(S)}}}s(RS,\"create_each_block\");function yye(t){let e,n,i,a=Object.values(ub).reverse().slice(0,4),r=[];for(let o=0;o<a.length;o+=1)r[o]=RS(OS(t,a,o));return{c(){e=L(\"div\");for(let o=0;o<r.length;o+=1)r[o].c();n=J(),i=L(\"p\"),i.textContent=\"To see the full changelog, open Animated Java in the plugin list.\",E(i,\"class\",\"disclaimer svelte-1hhexqb\"),E(e,\"class\",\"content plugin_browser_tabbed_page svelte-1hhexqb\"),E(e,\"id\",\"plugin_browser_changelog\")},m(o,l){U(o,e,l);for(let c=0;c<r.length;c+=1)r[c]&&r[c].m(e,null);I(e,n),I(e,i)},p(o,[l]){if(l&0){a=Object.values(ub).reverse().slice(0,4);let c;for(c=0;c<a.length;c+=1){let d=OS(o,a,c);r[c]?r[c].p(d,l):(r[c]=RS(d),r[c].c(),r[c].m(e,n))}for(;c<r.length;c+=1)r[c].d(1);r.length=a.length}},i:ie,o:ie,d(o){o&&z(e),Wn(r,o)}}}s(yye,\"create_fragment\");var MS=\"https://api.github.com/repos/animated-java/animated-java/issues/\",wye=s(t=>getDateDisplay(t).full,\"formatDateFull\"),Eye=s(t=>getDateDisplay(t).short,\"formatDateShort\"),db=new Map,kye=s(async t=>{if(db.has(t))return db.get(t);let e=await fetch(MS+t).then(async n=>{let i=await n.json();if(!n.ok)throw new Error(`Failed to fetch issue ${t}: `+(i.message??n.statusText));return i}).catch(n=>{console.error(`Failed to fetch issue ${t}`,n)});return e&&db.set(t,e),e},\"fetchIssue\"),kh=class extends Pe{constructor(e){super(),Ve(this,e,null,yye,De,{})}};s(kh,\"ChangelogDialog\");var pb=kh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".content.svelte-1hhexqb.svelte-1hhexqb{max-height:75vh;overflow:auto}.plugin_browser_tabbed_page code{background-color:var(--color-back);padding:0.2em 0.4em;border-radius:3px;font-size:0.8em}.plugin_browser_tabbed_page .breaking{background-color:var(--color-error);color:var(--color-back);padding:0 0.3em;border-radius:3px;font-size:0.9em;font-weight:bold;height:min-content}img.svelte-1hhexqb.svelte-1hhexqb{border-radius:4px;width:24px;height:24px;margin-left:0.5px;box-shadow:1px 1px 1px #000000aa}.title-container.svelte-1hhexqb h3.svelte-1hhexqb{margin-left:8px;margin-top:0}.title-container.svelte-1hhexqb.svelte-1hhexqb{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-top:8px}hr.svelte-1hhexqb.svelte-1hhexqb{margin:2rem 0}.disclaimer.svelte-1hhexqb.svelte-1hhexqb{font-size:0.9em;color:var(--color-text-secondary);font-style:italic;text-align:center;margin-top:1rem}li.svelte-1hhexqb>p.svelte-1hhexqb{display:flex;flex-direction:row;gap:0.5rem;align-items:flex-start}@keyframes svelte-1hhexqb-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.spinner.svelte-1hhexqb.svelte-1hhexqb{animation:svelte-1hhexqb-spin 1s linear infinite}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var jye=`${Ke.name}:animationPropertiesDialog`;function Qd(){new cn({id:jye,title:A(\"dialog.changelog_dialog.title\"),width:800,content:{component:pb},buttons:[\"OK!\"],preventKeybinds:!0}).show()}s(Qd,\"openChangelogDialog\");var BS='data:image/svg+xml,<svg width=\"176\" height=\"414\" viewBox=\"0 0 176 414\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<g filter=\"url(%23filter0_d_247_2)\">%0D%0A<path d=\"M102.332 407L81.3964 396.31V255.998L102.332 245.753L122.822 255.998L102.332 266.243V407Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M122.822 396.755L102.332 407V266.243L122.822 255.998V396.755Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M101.886 407L80.951 396.31V255.998M101.886 407L122.376 396.755V255.998M101.886 407V266.243M80.951 255.998L101.886 266.243M80.951 255.998L101.886 245.753L122.376 255.998M101.886 266.243L122.376 255.998\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M60.461 386.51L39.5256 375.82V235.508L60.461 225.263L80.951 235.508L60.461 245.753V386.51Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M80.951 376.265L60.461 386.51V245.753L80.951 235.508V376.265Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M60.461 386.51L39.5256 375.82V235.508M60.461 386.51L80.951 376.265V235.508M60.461 386.51V245.753M39.5256 235.508L60.461 245.753M39.5256 235.508L60.461 225.263L80.951 235.508M60.461 245.753L80.951 235.508\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M112.577 246.644V271.588L28.8352 230.163V205.218L49.7706 194.528L133.067 235.953L112.577 246.644Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M112.577 271.588V246.644L133.067 235.953V261.788L112.577 271.588Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M133.067 235.953V261.788L112.577 271.588M133.067 235.953L112.577 246.644M133.067 235.953L49.7706 194.528L28.8352 205.218M112.577 246.644V271.588M112.577 246.644L28.8352 205.218M112.577 271.588L28.8352 230.163V205.218\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M122.822 141.967L102.332 152.212V241.298L81.3964 231.053V141.967L102.332 131.722L122.822 141.967Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M122.822 141.967L102.332 152.212V241.298L122.822 231.053V141.967Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M101.886 152.212L122.376 141.967M101.886 152.212L80.951 141.967M101.886 152.212V241.298M122.376 141.967L101.886 131.722L80.951 141.967M122.376 141.967V231.053L101.886 241.298M80.951 141.967V231.053L101.886 241.298\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M80.951 121.477L60.461 131.722V220.808L39.5256 210.563V121.477L60.461 111.232L80.951 121.477Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M80.951 121.477L60.461 131.722V220.808L80.951 210.563V121.477Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M60.461 131.722L80.951 121.477M60.461 131.722L39.5256 121.477M60.461 131.722V220.808M80.951 121.477L60.461 111.232L39.5256 121.477M80.951 121.477V210.563L60.461 220.808M39.5256 121.477V210.563L60.461 220.808\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M158.011 117.022L127.722 132.612V170.474L3 108.559V70.2517L34.1804 54.216L158.011 117.022Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M158.011 117.022L127.722 132.612V170.474L158.011 154.884V117.022Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M127.722 132.612L158.011 117.022M127.722 132.612V170.474M127.722 132.612L3 70.2517M158.011 117.022V154.884L127.722 170.474M158.011 117.022L34.1804 54.216L3 70.2517M127.722 170.474L3 108.559V70.2517\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A<path d=\"M80.951 27.49V104.105L60.0156 93.4143V17.245L80.951 7L101.886 17.245L80.951 27.49Z\" fill=\"%23BFBFBF\"/>%0D%0A<path d=\"M80.951 104.105V27.49L101.886 17.245V93.4143L80.951 104.105Z\" fill=\"%23818181\"/>%0D%0A<path d=\"M80.951 27.49V104.105M80.951 27.49L60.0156 17.245M80.951 27.49L101.886 17.245M80.951 104.105L60.0156 93.4143V17.245M80.951 104.105L101.886 93.4143V17.245M60.0156 17.245L80.951 7L101.886 17.245\" stroke=\"white\" stroke-width=\"6\" stroke-linejoin=\"round\"/>%0D%0A</g>%0D%0A<defs>%0D%0A<filter id=\"filter0_d_247_2\" x=\"0\" y=\"0\" width=\"175.011\" height=\"414\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">%0D%0A<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>%0D%0A<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>%0D%0A<feOffset dx=\"10\"/>%0D%0A<feGaussianBlur stdDeviation=\"2\"/>%0D%0A<feComposite in2=\"hardAlpha\" operator=\"out\"/>%0D%0A<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0\"/>%0D%0A<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_247_2\"/>%0D%0A<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_247_2\" result=\"shape\"/>%0D%0A</filter>%0D%0A</defs>%0D%0A</svg>%0D%0A';function PS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(PS,\"get_each_context\");function LS(t,e,n){let i=t.slice();return i[0]=e[n],i}s(LS,\"get_each_context_1\");function VS(t){let e,n=t[0]+\"\",i;return{c(){e=L(\"p\"),i=Re(n),E(e,\"class\",\"svelte-by5dje\")},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(VS,\"create_each_block_1\");function zS(t){let e,n=t[0]+\"\",i;return{c(){e=L(\"p\"),i=Re(n),E(e,\"class\",\"svelte-by5dje\")},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(zS,\"create_each_block\");function Tye(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W,ee,Z,me,X,Q,he,Ie,le=Ke.subscription_supporters.sort(),ge=[];for(let re=0;re<le.length;re+=1)ge[re]=VS(LS(t,le,re));let V=Ke.special_thanks.sort(),H=[];for(let re=0;re<V.length;re+=1)H[re]=zS(PS(t,V,re));return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"img\"),r=J(),o=L(\"div\"),l=L(\"h1\"),l.textContent=\"Animated Java\",c=J(),d=L(\"h3\"),d.textContent=`v${Ke.version}`,u=J(),p=L(\"div\"),m=L(\"a\"),f=L(\"img\"),x=J(),_=L(\"label\"),_.textContent=\"Website\",h=J(),v=L(\"a\"),v.innerHTML=`<i class=\"icon fab fa-discord svelte-by5dje\" style=\"color: rgb(114, 127, 255);\"></i> \n\t\t\t\n\t\t\t<label class=\"svelte-by5dje\">Discord</label>`,b=J(),y=L(\"a\"),y.innerHTML=`<i class=\"icon fab fa-github svelte-by5dje\" style=\"color: rgb(221, 221, 221);\"></i> \n\t\t\t\n\t\t\t<label class=\"svelte-by5dje\">GitHub</label>`,w=J(),S=L(\"a\"),S.innerHTML=`<i class=\"icon fas fa-book svelte-by5dje\"></i> \n\t\t\t\n\t\t\t<label class=\"svelte-by5dje\">Wiki</label>`,F=J(),N=L(\"p\"),N.textContent=\"Created by Titus Evans (SnaveSutit)\",k=J(),R=L(\"p\"),R.textContent=`${Ke.description}`,D=J(),B=L(\"h4\"),B.textContent=\"Special Thanks to\",q=J(),G=L(\"div\"),G.innerHTML=`<div><p class=\"svelte-by5dje\">Ian Senne (FetchBot)</p> \n\t\t\t<p class=\"svelte-by5dje\">For always being there to help.</p></div> \n\t\t<div><p class=\"svelte-by5dje\">Jesse Spicer (Dominexis)</p> \n\t\t\t<p class=\"svelte-by5dje\">For making quaternions and matrices make sense.</p></div> \n\t\t<div><p class=\"svelte-by5dje\">Jannis Petersen</p> \n\t\t\t<p class=\"svelte-by5dje\">For creating an amazing tool and community.</p></div> \n\t\t<div><p class=\"svelte-by5dje\">Ewan Howell</p> \n\t\t\t<p class=\"svelte-by5dje\">For keeping me sane as I dig through Blockbench source code.</p></div> \n\t\t<div><p class=\"svelte-by5dje\">Boxic</p> \n\t\t\t<p class=\"svelte-by5dje\">For throwing absurd amounts of money at me.</p></div> \n\t\t<div><p class=\"svelte-by5dje\">Flubberschnub</p> \n\t\t\t<p class=\"svelte-by5dje\">For showing off the power of AJ with his boss fights.</p></div>`,W=J(),ee=L(\"h4\"),ee.textContent=\"Ko-fi Supporters\",Z=J(),me=L(\"div\");for(let re=0;re<ge.length;re+=1)ge[re].c();X=J(),Q=L(\"h4\"),Q.textContent=\"Cool People who helped make AJ what it is today\",he=J(),Ie=L(\"div\");for(let re=0;re<H.length;re+=1)H[re].c();Ht(i.src,a=ya)||E(i,\"src\",a),E(i,\"class\",\"svelte-by5dje\"),E(l,\"class\",\"svelte-by5dje\"),E(d,\"class\",\"svelte-by5dje\"),E(o,\"class\",\"svelte-by5dje\"),E(n,\"class\",\"header-container svelte-by5dje\"),Ht(f.src,g=BS)||E(f,\"src\",g),E(f,\"class\",\"svelte-by5dje\"),E(_,\"class\",\"svelte-by5dje\"),E(m,\"href\",\"https://animated-java.dev\"),E(m,\"class\",\"open-in-browser svelte-by5dje\"),E(v,\"href\",\"https://discord.com/invite/jFgY4PXZfp\"),E(v,\"class\",\"open-in-browser svelte-by5dje\"),E(y,\"href\",\"https://github.com/Animated-Java/animated-java\"),E(y,\"class\",\"open-in-browser svelte-by5dje\"),E(S,\"href\",\"https://animated-java.dev/docs\"),E(S,\"class\",\"open-in-browser svelte-by5dje\"),E(p,\"class\",\"socials svelte-by5dje\"),Xe(R,\"color\",\"var(--color-subtle_text)\"),Xe(R,\"text-align\",\"center\"),E(B,\"class\",\"svelte-by5dje\"),E(G,\"class\",\"grid svelte-by5dje\"),E(ee,\"class\",\"svelte-by5dje\"),E(me,\"class\",\"grid2 svelte-by5dje\"),E(Q,\"class\",\"svelte-by5dje\"),E(Ie,\"class\",\"grid2 svelte-by5dje\"),E(e,\"class\",\"content svelte-by5dje\")},m(re,xe){U(re,e,xe),I(e,n),I(n,i),I(n,r),I(n,o),I(o,l),I(o,c),I(o,d),I(e,u),I(e,p),I(p,m),I(m,f),I(m,x),I(m,_),I(p,h),I(p,v),I(p,b),I(p,y),I(p,w),I(p,S),I(e,F),I(e,N),I(e,k),I(e,R),I(e,D),I(e,B),I(e,q),I(e,G),I(e,W),I(e,ee),I(e,Z),I(e,me);for(let fe=0;fe<ge.length;fe+=1)ge[fe]&&ge[fe].m(me,null);I(e,X),I(e,Q),I(e,he),I(e,Ie);for(let fe=0;fe<H.length;fe+=1)H[fe]&&H[fe].m(Ie,null)},p(re,[xe]){if(xe&0){le=Ke.subscription_supporters.sort();let fe;for(fe=0;fe<le.length;fe+=1){let te=LS(re,le,fe);ge[fe]?ge[fe].p(te,xe):(ge[fe]=VS(te),ge[fe].c(),ge[fe].m(me,null))}for(;fe<ge.length;fe+=1)ge[fe].d(1);ge.length=le.length}if(xe&0){V=Ke.special_thanks.sort();let fe;for(fe=0;fe<V.length;fe+=1){let te=PS(re,V,fe);H[fe]?H[fe].p(te,xe):(H[fe]=zS(te),H[fe].c(),H[fe].m(Ie,null))}for(;fe<H.length;fe+=1)H[fe].d(1);H.length=V.length}},i:ie,o:ie,d(re){re&&z(e),Wn(ge,re),Wn(H,re)}}}s(Tye,\"create_fragment\");var jh=class extends Pe{constructor(e){super(),Ve(this,e,null,Tye,De,{})}};s(jh,\"About\");var US=jh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".content.svelte-by5dje.svelte-by5dje{display:flex;flex-direction:column;align-items:center;overflow-y:scroll;max-height:55rem;padding-right:16px}.header-container.svelte-by5dje.svelte-by5dje{display:flex;align-items:center;margin-bottom:1.5rem}.header-container.svelte-by5dje div.svelte-by5dje{display:flex;flex-direction:column;justify-content:center;margin-left:2rem}.header-container.svelte-by5dje img.svelte-by5dje{width:128px;border-radius:16px;box-shadow:4px 4px 8px -4px black}.header-container.svelte-by5dje h1.svelte-by5dje{margin:0px}.header-container.svelte-by5dje h3.svelte-by5dje{margin:0px}h4.svelte-by5dje.svelte-by5dje{color:var(--color-subtle_text);margin-top:30px;border-top:2px solid var(--color-border);padding-top:12px;padding-bottom:8px;text-transform:uppercase;text-align:center;width:100%}.socials.svelte-by5dje.svelte-by5dje{display:flex;justify-content:space-evenly;width:100%;margin-bottom:16px}.socials.svelte-by5dje a.svelte-by5dje{display:flex;flex-direction:column;align-items:center;text-decoration:none;width:64px;height:64px;padding:8px;background-color:var(--color-button);border-radius:8px}.socials.svelte-by5dje a.svelte-by5dje:hover{background-color:var(--color-selected)}.socials.svelte-by5dje a .svelte-by5dje:not(label){flex-grow:1}.socials.svelte-by5dje a label.svelte-by5dje{color:var(--color-subtle_text)}.socials.svelte-by5dje a i.svelte-by5dje{display:flex;align-items:center;font-size:2em}.socials.svelte-by5dje img.svelte-by5dje{width:32px;height:32px}.grid.svelte-by5dje.svelte-by5dje{display:grid;grid-template-columns:1fr 1fr 1fr;grid-gap:0.75rem;justify-items:center}.grid.svelte-by5dje p.svelte-by5dje{text-align:center}.grid.svelte-by5dje p.svelte-by5dje:nth-child(even){color:var(--color-subtle_text)}.grid2.svelte-by5dje.svelte-by5dje{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;justify-items:center;gap:4px 8px;margin-bottom:8px}.grid2.svelte-by5dje p.svelte-by5dje{text-align:center;width:100%;box-shadow:2px 2px 4px var(--color-back);background:var(--color-button);padding:0px 4px;border-radius:4px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function qS(){new cn({id:`${Ke.name}:aboutDialog`,title:A(\"dialog.about.title\"),width:700,content:{component:US},buttons:[A(\"dialog.about.close_button\")],preventKeybinds:!0}).show()}s(qS,\"openAboutDialog\");function Cye(){let t=document.createElement(\"img\");return Object.assign(t,{src:ya,width:16,height:16}),Object.assign(t.style,{position:\"relative\",top:\"2px\",borderRadius:\"2px\",marginRight:\"6px\",boxShadow:\"1px 1px 1px #000000aa\"}),t}s(Cye,\"createIconImg\");var Sye=new MenuSeparator(\"animated-java:menu-separator/menubar-separator-a\"),Oye=new MenuSeparator(\"animated-java:menu-separator/menubar-separator-b\"),Iye=nn({id:\"animated-java:action/about\"},{icon:\"info\",category:\"animated_java\",name:A(\"action.open_about.name\"),click(){qS()}}),Dye=nn({id:\"animated-java:action/documentation\"},{icon:\"find_in_page\",category:\"animated_java\",name:A(\"action.open_documentation.name\"),click(){Blockbench.openLink(\"https://animated-java.dev/docs\")}}),Fye=nn({id:\"animated-java:action/changelog\"},{icon:\"history\",category:\"animated_java\",name:A(\"action.open_changelog.name\"),click(){Qd()}});function GS(){return Blockbench.ModelProject.all.filter(t=>t.format.id===Qt).length>1}s(GS,\"areMultipleBlueprintsOpen\");async function WS(t){let e=Project,n=Blockbench.ModelProject.all.filter(a=>a.format.id===Qt),i=!0;for(let a of n){if(a.select(),await new Promise(r=>requestAnimationFrame(r)),i=await zc({debugMode:t}),!i)break;await new Promise(r=>requestAnimationFrame(r))}i&&e?.select()}s(WS,\"exportAll\");var Nye=nn({id:\"animated-java:action/export-all-debug\"},{icon:\"bug_report\",category:\"animated_java\",name:A(\"action.export_all_debug.name\"),description:A(\"action.export_all_debug.description\"),condition:GS,click(){console.log(\"Exporting all open Blueprints in development mode...\"),WS(!0)}}),Rye=nn({id:\"animated-java:action/export-all\"},{icon:\"insert_drive_file\",category:\"animated_java\",name:A(\"action.export_all.name\"),description:A(\"action.export_all.description\"),condition:GS,click(){console.log(\"Exporting all open Blueprints...\"),WS(!1)}}),Mye=nn({id:\"animated-java:action/blueprint-settings\"},{icon:\"settings\",category:\"animated_java\",name:A(\"action.open_blueprint_settings.name\"),condition:Fe,click(){jc()}}),HS=nn({id:\"animated-java:action/extract\"},{icon:\"fa-trash-can\",category:\"animated_java\",name:A(\"action.extract.confirm\"),condition:Fe,click(){Eh()}}),Bye=nn({id:\"animated-java:action/export-debug\"},{icon:\"bug_report\",category:\"animated_java\",name:A(\"action.export_debug.name\"),condition:Fe,click(){zc({debugMode:!0})},keybind:new Keybind({ctrl:!0,key:69})}),Pye=nn({id:\"animated-java:action/export\"},{icon:\"insert_drive_file\",category:\"animated_java\",name:A(\"action.export.name\"),condition:Fe,click(){zc()},keybind:new Keybind({ctrl:!0,shift:!0,key:69})});function Lye(){if(HS.get()!=null)return{id:\"animated_java:submenu/extract\",name:A(\"action.extract.name\"),icon:\"fa-trash-can\",searchable:!1,children:[HS.get()],condition:Fe}}s(Lye,\"createExtractSubMenu\");var JS=Ry({id:\"animated-java:menubar/main\"},[]);JS.onCreated(t=>{t.label.style.display=\"inline-block\",t.label.innerHTML=A(\"menubar.label\"),t.label.prepend(Cye()),MenuBar.update(),El(()=>{let e=[Iye.get(),Dye.get(),Fye.get(),Sye,Nye.get(),Rye.get(),Oye,Mye.get(),Lye(),Bye.get(),Pye.get()];if(e.every(n=>n!=null))return e},()=>!JS.get()).then(e=>{for(let n of e)n instanceof Action&&t.addAction(n);t.structure=e})});function Ah(t,e={}){let n=[];return e?.excludeEmptyGroups?n.push(...Group.all.filter(a=>a.children.length>0&&a.children.some(r=>r instanceof Cube))):n.push(...Group.all),e?.groupsOnly||n.push(...Locator.all,...ve.all,...We.all,...$e.all,...OutlinerElement.types.camera?.all||[]),n.map(a=>{let r=t.find(l=>l.value===a.uuid);r&&(r.name=a.name);let o;switch(!0){case a instanceof Group:o=\"folder\";break;case a instanceof Locator:o=\"anchor\";break;case a instanceof ve:case a instanceof We:case a instanceof $e:o=a.icon;break;case a instanceof OutlinerElement.types.camera:o=\"videocam\";break;default:o=\"close\";break}return{icon:o,name:a.name,value:a.uuid}})}s(Ah,\"getAvailableNodes\");function $d(t){return t*t*t}s($d,\"cubicIn\");function mb(t){let e=t-1;return e*e*e+1}s(mb,\"cubicOut\");function ep(t,{delay:e=0,duration:n=400,easing:i=ou}={}){let a=+getComputedStyle(t).opacity;return{delay:e,duration:n,easing:i,css:r=>`opacity: ${r*a}`}}s(ep,\"fade\");function tp(t,{from:e,to:n},i={}){let a=getComputedStyle(t),r=a.transform===\"none\"?\"\":a.transform,[o,l]=a.transformOrigin.split(\" \").map(parseFloat),c=e.left+e.width*o/n.width-(n.left+o),d=e.top+e.height*l/n.height-(n.top+l),{delay:u=0,duration:p=s(f=>Math.sqrt(f)*120,\"duration\"),easing:m=mb}=i;return{delay:u,duration:qn(p)?p(Math.sqrt(c*c+d*d)):p,easing:m,css:(f,g)=>{let x=g*c,_=g*d,h=f+g*e.width/n.width,v=f+g*e.height/n.height;return`transform: ${r} translate(${x}px, ${_}px) scale(${h}, ${v});`}}}s(tp,\"flip\");function KS(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),n.push.apply(n,i)}return n}s(KS,\"ownKeys\");function Sh(t){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?KS(Object(n),!0).forEach(function(i){Gc(t,i,n[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):KS(Object(n)).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(n,i))})}return t}s(Sh,\"_objectSpread2\");function ap(t){\"@babel/helpers - typeof\";return ap=typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?function(e){return typeof e}:function(e){return e&&typeof Symbol==\"function\"&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},ap(t)}s(ap,\"_typeof\");function Gc(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}s(Gc,\"_defineProperty\");function Vye(t,e){if(t==null)return{};var n={},i=Object.keys(t),a,r;for(r=0;r<i.length;r++)a=i[r],!(e.indexOf(a)>=0)&&(n[a]=t[a]);return n}s(Vye,\"_objectWithoutPropertiesLoose\");function zye(t,e){if(t==null)return{};var n=Vye(t,e),i,a;if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);for(a=0;a<r.length;a++)i=r[a],!(e.indexOf(i)>=0)&&Object.prototype.propertyIsEnumerable.call(t,i)&&(n[i]=t[i])}return n}s(zye,\"_objectWithoutProperties\");function Uye(t,e){return Hye(t)||Gye(t,e)||Eb(t,e)||Kye()}s(Uye,\"_slicedToArray\");function Ia(t){return qye(t)||Jye(t)||Eb(t)||Wye()}s(Ia,\"_toConsumableArray\");function qye(t){if(Array.isArray(t))return hb(t)}s(qye,\"_arrayWithoutHoles\");function Hye(t){if(Array.isArray(t))return t}s(Hye,\"_arrayWithHoles\");function Jye(t){if(typeof Symbol<\"u\"&&t[Symbol.iterator]!=null||t[\"@@iterator\"]!=null)return Array.from(t)}s(Jye,\"_iterableToArray\");function Gye(t,e){var n=t==null?null:typeof Symbol<\"u\"&&t[Symbol.iterator]||t[\"@@iterator\"];if(n!=null){var i=[],a=!0,r=!1,o,l;try{for(n=n.call(t);!(a=(o=n.next()).done)&&(i.push(o.value),!(e&&i.length===e));a=!0);}catch(c){r=!0,l=c}finally{try{!a&&n.return!=null&&n.return()}finally{if(r)throw l}}return i}}s(Gye,\"_iterableToArrayLimit\");function Eb(t,e){if(t){if(typeof t==\"string\")return hb(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n===\"Object\"&&t.constructor&&(n=t.constructor.name),n===\"Map\"||n===\"Set\")return Array.from(t);if(n===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return hb(t,e)}}s(Eb,\"_unsupportedIterableToArray\");function hb(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n<e;n++)i[n]=t[n];return i}s(hb,\"_arrayLikeToArray\");function Wye(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}s(Wye,\"_nonIterableSpread\");function Kye(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}s(Kye,\"_nonIterableRest\");function lp(t,e){var n=typeof Symbol<\"u\"&&t[Symbol.iterator]||t[\"@@iterator\"];if(!n){if(Array.isArray(t)||(n=Eb(t))||e&&t&&typeof t.length==\"number\"){n&&(t=n);var i=0,a=s(function(){},\"F\");return{s:a,n:function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(c){throw c},f:a}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var r=!0,o=!1,l;return{s:function(){n=n.call(t)},n:function(){var c=n.next();return r=c.done,c},e:function(c){o=!0,l=c},f:function(){try{!r&&n.return!=null&&n.return()}finally{if(o)throw l}}}}s(lp,\"_createForOfIteratorHelper\");var Yye=\"finalize\",Xye=\"consider\";function Wc(t,e,n){t.dispatchEvent(new CustomEvent(Yye,{detail:{items:e,info:n}}))}s(Wc,\"dispatchFinalizeEvent\");function ds(t,e,n){t.dispatchEvent(new CustomEvent(Xye,{detail:{items:e,info:n}}))}s(ds,\"dispatchConsiderEvent\");var Mh=\"draggedEntered\",cp=\"draggedLeft\",Bh=\"draggedOverIndex\",kb=\"draggedLeftDocument\",Oh={LEFT_FOR_ANOTHER:\"leftForAnother\",OUTSIDE_OF_ANY:\"outsideOfAny\"};function Zye(t,e,n){t.dispatchEvent(new CustomEvent(Mh,{detail:{indexObj:e,draggedEl:n}}))}s(Zye,\"dispatchDraggedElementEnteredContainer\");function Qye(t,e,n){t.dispatchEvent(new CustomEvent(cp,{detail:{draggedEl:e,type:Oh.LEFT_FOR_ANOTHER,theOtherDz:n}}))}s(Qye,\"dispatchDraggedElementLeftContainerForAnother\");function $ye(t,e){t.dispatchEvent(new CustomEvent(cp,{detail:{draggedEl:e,type:Oh.OUTSIDE_OF_ANY}}))}s($ye,\"dispatchDraggedElementLeftContainerForNone\");function e1e(t,e,n){t.dispatchEvent(new CustomEvent(Bh,{detail:{indexObj:e,draggedEl:n}}))}s(e1e,\"dispatchDraggedElementIsOverIndex\");function t1e(t){window.dispatchEvent(new CustomEvent(kb,{detail:{draggedEl:t}}))}s(t1e,\"dispatchDraggedLeftDocument\");var Di={DRAG_STARTED:\"dragStarted\",DRAGGED_ENTERED:Mh,DRAGGED_ENTERED_ANOTHER:\"dragEnteredAnother\",DRAGGED_OVER_INDEX:Bh,DRAGGED_LEFT:cp,DRAGGED_LEFT_ALL:\"draggedLeftAll\",DROPPED_INTO_ZONE:\"droppedIntoZone\",DROPPED_INTO_ANOTHER:\"droppedIntoAnother\",DROPPED_OUTSIDE_OF_ANY:\"droppedOutsideOfAny\",DRAG_STOPPED:\"dragStopped\"},Gi={POINTER:\"pointer\",KEYBOARD:\"keyboard\"},sr=\"isDndShadowItem\",jb=\"data-is-dnd-shadow-item-internal\",n1e=\"data-is-dnd-shadow-item-hint\",i1e=\"id:dnd-shadow-placeholder-0000\",a1e=\"dnd-action-dragged-el\",ni=\"id\",gb=0;function sO(){gb++}s(sO,\"incrementActiveDropZoneCount\");function lO(){if(gb===0)throw new Error(\"Bug! trying to decrement when there are no dropzones\");gb--}s(lO,\"decrementActiveDropZoneCount\");var Ab=typeof window>\"u\",vt=s(function(){},\"printDebug\");function _b(t){var e,n=t.getBoundingClientRect(),i=getComputedStyle(t),a=i.transform;if(a){var r,o,l,c;if(a.startsWith(\"matrix3d(\"))e=a.slice(9,-1).split(/, /),r=+e[0],o=+e[5],l=+e[12],c=+e[13];else if(a.startsWith(\"matrix(\"))e=a.slice(7,-1).split(/, /),r=+e[0],o=+e[3],l=+e[4],c=+e[5];else return n;var d=i.transformOrigin,u=n.x-l-(1-r)*parseFloat(d),p=n.y-c-(1-o)*parseFloat(d.slice(d.indexOf(\" \")+1)),m=r?n.width/r:t.offsetWidth,f=o?n.height/o:t.offsetHeight;return{x:u,y:p,width:m,height:f,top:p,right:u+m,bottom:p+f,left:u}}else return n}s(_b,\"getBoundingRectNoTransforms\");function cO(t){var e=_b(t);return{top:e.top+window.scrollY,bottom:e.bottom+window.scrollY,left:e.left+window.scrollX,right:e.right+window.scrollX}}s(cO,\"getAbsoluteRectNoTransforms\");function uO(t){var e=t.getBoundingClientRect();return{top:e.top+window.scrollY,bottom:e.bottom+window.scrollY,left:e.left+window.scrollX,right:e.right+window.scrollX}}s(uO,\"getAbsoluteRect\");function dO(t){return{x:(t.left+t.right)/2,y:(t.top+t.bottom)/2}}s(dO,\"findCenter\");function r1e(t,e){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}s(r1e,\"calcDistance\");function Ph(t,e){return t.y<=e.bottom&&t.y>=e.top&&t.x>=e.left&&t.x<=e.right}s(Ph,\"isPointInsideRect\");function rp(t){return dO(uO(t))}s(rp,\"findCenterOfElement\");function YS(t,e){var n=rp(t),i=cO(e);return Ph(n,i)}s(YS,\"isCenterOfAInsideB\");function o1e(t,e){var n=rp(t),i=rp(e);return r1e(n,i)}s(o1e,\"calcDistanceBetweenCenters\");function s1e(t){var e=uO(t);return e.right<0||e.left>document.documentElement.scrollWidth||e.bottom<0||e.top>document.documentElement.scrollHeight}s(s1e,\"isElementOffDocument\");var Hc;function Tb(){vt(function(){return\"resetting indexes cache\"}),Hc=new Map}s(Tb,\"resetIndexesCache\");Tb();function l1e(t){var e=Array.from(t.children).findIndex(function(n){return n.getAttribute(jb)});if(e>=0)return Hc.has(t)||Hc.set(t,new Map),Hc.get(t).set(e,cO(t.children[e])),e}s(l1e,\"cacheShadowRect\");function c1e(t,e){if(!YS(t,e))return null;var n=e.children;if(n.length===0)return{index:0,isProximityBased:!0};for(var i=l1e(e),a=0;a<n.length;a++)if(YS(t,n[a])){var r=Hc.has(e)&&Hc.get(e).get(a);return r&&!Ph(rp(t),r)?{index:i,isProximityBased:!1}:{index:a,isProximityBased:!1}}for(var o=Number.MAX_VALUE,l=void 0,c=0;c<n.length;c++){var d=o1e(t,n[c]);d<o&&(o=d,l=c)}return{index:l,isProximityBased:!0}}s(c1e,\"findWouldBeIndex\");function Jr(t){return JSON.stringify(t,null,2)}s(Jr,\"toString\");function Ih(t){if(!t)throw new Error(\"cannot get depth of a falsy node\");return pO(t,0)}s(Ih,\"getDepth\");function pO(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return t.parentElement?pO(t.parentElement,e+1):e-1}s(pO,\"_getDepth\");function u1e(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(!{}.hasOwnProperty.call(e,n)||e[n]!==t[n])return!1;return!0}s(u1e,\"areObjectsShallowEqual\");function d1e(t,e){if(t.length!==e.length)return!1;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}s(d1e,\"areArraysShallowEqualSameOrder\");var p1e=200,XS=10,xb;function m1e(t,e){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:p1e,i=arguments.length>3?arguments[3]:void 0,a,r,o=!1,l,c=Array.from(e).sort(function(u,p){return Ih(p)-Ih(u)});function d(){var u=rp(t),p=i.multiScrollIfNeeded();if(!p&&l&&Math.abs(l.x-u.x)<XS&&Math.abs(l.y-u.y)<XS){xb=window.setTimeout(d,n);return}if(s1e(t)){vt(function(){return\"off document\"}),t1e(t);return}l=u;var m=!1,f=lp(c),g;try{for(f.s();!(g=f.n()).done;){var x=g.value;p&&Tb();var _=c1e(t,x);if(_!==null){var h=_.index;m=!0,x!==a?(a&&Qye(a,t,x),Zye(x,_,t),a=x):h!==r&&(e1e(x,_,t),r=h);break}}}catch(v){f.e(v)}finally{f.f()}!m&&o&&a?($ye(a,t),a=void 0,r=void 0,o=!1):o=!0,xb=window.setTimeout(d,n)}s(d,\"andNow\"),d()}s(m1e,\"observe\");function f1e(){vt(function(){return\"unobserving\"}),clearTimeout(xb),Tb()}s(f1e,\"unobserve\");var np=30;function h1e(){var t;function e(){t={directionObj:void 0,stepPx:0}}s(e,\"resetScrolling\"),e();function n(r){var o=t,l=o.directionObj,c=o.stepPx;l&&(r.scrollBy(l.x*c,l.y*c),window.requestAnimationFrame(function(){return n(r)}))}s(n,\"scrollContainer\");function i(r){return np-r}s(i,\"calcScrollStepPx\");function a(r,o){if(!o)return!1;var l=g1e(r,o);if(l===null)return e(),!1;var c=!!t.directionObj,d=!1,u=!1;return o.scrollHeight>o.clientHeight&&(l.bottom<np?(d=!0,t.directionObj={x:0,y:1},t.stepPx=i(l.bottom)):l.top<np&&(d=!0,t.directionObj={x:0,y:-1},t.stepPx=i(l.top)),!c&&d)||o.scrollWidth>o.clientWidth&&(l.right<np?(u=!0,t.directionObj={x:1,y:0},t.stepPx=i(l.right)):l.left<np&&(u=!0,t.directionObj={x:-1,y:0},t.stepPx=i(l.left)),!c&&u)?(n(o),!0):(e(),!1)}return s(a,\"scrollIfNeeded\"),{scrollIfNeeded:a,resetScrolling:e}}s(h1e,\"makeScroller\");function g1e(t,e){var n=e===document.scrollingElement?{top:0,bottom:window.innerHeight,left:0,right:window.innerWidth}:e.getBoundingClientRect();return Ph(t,n)?{top:t.y-n.top,bottom:n.bottom-t.y,left:t.x-n.left,right:n.right-t.x}:null}s(g1e,\"calcInnerDistancesBetweenPointAndSidesOfElement\");function _1e(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=arguments.length>1?arguments[1]:void 0;vt(function(){return\"creating multi-scroller\"});var n=v1e(t),i=Array.from(n).sort(function(l,c){return Ih(c)-Ih(l)}),a=h1e(),r=a.scrollIfNeeded;function o(){var l=e();if(!l||!i)return!1;for(var c=i.filter(function(p){return Ph(l,p.getBoundingClientRect())||p===document.scrollingElement}),d=0;d<c.length;d++){var u=r(l,c[d]);if(u)return!0}return!1}return s(o,\"tick\"),{multiScrollIfNeeded:n.size>0?o:function(){return!1}}}s(_1e,\"createMultiScroller\");function x1e(t){if(!t)return[];for(var e=[],n=t;n;){var i=window.getComputedStyle(n),a=i.overflow;a.split(\" \").some(function(r){return r.includes(\"auto\")||r.includes(\"scroll\")})&&e.push(n),n=n.parentElement}return e}s(x1e,\"findScrollableParents\");function v1e(t){var e=new Set,n=lp(t),i;try{for(n.s();!(i=n.n()).done;){var a=i.value;x1e(a).forEach(function(r){return e.add(r)})}}catch(r){n.e(r)}finally{n.f()}return(document.scrollingElement.scrollHeight>document.scrollingElement.clientHeight||document.scrollingElement.scrollWidth>document.scrollingElement.clientHeight)&&e.add(document.scrollingElement),e}s(v1e,\"findRelevantScrollContainers\");function b1e(t){var e=t.cloneNode(!0),n=[],i=t.tagName===\"SELECT\",a=i?[t]:Ia(t.querySelectorAll(\"select\")),r=lp(a),o;try{for(r.s();!(o=r.n()).done;){var l=o.value;n.push(l.value)}}catch(b){r.e(b)}finally{r.f()}if(a.length>0)for(var c=i?[e]:Ia(e.querySelectorAll(\"select\")),d=0;d<c.length;d++){var u=c[d],p=n[d],m=u.querySelector('option[value=\"'.concat(p,'\"'));m&&m.setAttribute(\"selected\",!0)}var f=t.tagName===\"CANVAS\",g=f?[t]:Ia(t.querySelectorAll(\"canvas\"));if(g.length>0)for(var x=f?[e]:Ia(e.querySelectorAll(\"canvas\")),_=0;_<x.length;_++){var h=g[_],v=x[_];v.width=h.width,v.height=h.height,v.getContext(\"2d\").drawImage(h,0,0)}return e}s(b1e,\"svelteNodeClone\");var op=Object.freeze({USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT:\"USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT\"}),y1e=Gc({},op.USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT,!1);function mO(t){if(!op[t])throw new Error(\"Can't get non existing feature flag \".concat(t,\"! Supported flags: \").concat(Object.keys(op)));return y1e[t]}s(mO,\"getFeatureFlag\");var w1e=.2;function sl(t){return\"\".concat(t,\" \").concat(w1e,\"s ease\")}s(sl,\"trs\");function E1e(t,e){var n=t.getBoundingClientRect(),i=b1e(t);fO(t,i),i.id=a1e,i.style.position=\"fixed\";var a=n.top,r=n.left;if(i.style.top=\"\".concat(a,\"px\"),i.style.left=\"\".concat(r,\"px\"),e){var o=dO(n);a-=o.y-e.y,r-=o.x-e.x,window.setTimeout(function(){i.style.top=\"\".concat(a,\"px\"),i.style.left=\"\".concat(r,\"px\")},0)}return i.style.margin=\"0\",i.style.boxSizing=\"border-box\",i.style.height=\"\".concat(n.height,\"px\"),i.style.width=\"\".concat(n.width,\"px\"),i.style.transition=\"\".concat(sl(\"top\"),\", \").concat(sl(\"left\"),\", \").concat(sl(\"background-color\"),\", \").concat(sl(\"opacity\"),\", \").concat(sl(\"color\"),\" \"),window.setTimeout(function(){return i.style.transition+=\", \".concat(sl(\"width\"),\", \").concat(sl(\"height\"))},0),i.style.zIndex=\"9999\",i.style.cursor=\"grabbing\",i}s(E1e,\"createDraggedElementFrom\");function k1e(t){t.style.cursor=\"grab\"}s(k1e,\"moveDraggedElementToWasDroppedState\");function j1e(t,e,n,i){fO(e,t);var a=e.getBoundingClientRect(),r=t.getBoundingClientRect(),o=a.width-r.width,l=a.height-r.height;if(o||l){var c={left:(n-r.left)/r.width,top:(i-r.top)/r.height};mO(op.USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT)||(t.style.height=\"\".concat(a.height,\"px\"),t.style.width=\"\".concat(a.width,\"px\")),t.style.left=\"\".concat(parseFloat(t.style.left)-c.left*o,\"px\"),t.style.top=\"\".concat(parseFloat(t.style.top)-c.top*l,\"px\")}}s(j1e,\"morphDraggedElementToBeLike\");function fO(t,e){var n=window.getComputedStyle(t);Array.from(n).filter(function(i){return i.startsWith(\"background\")||i.startsWith(\"padding\")||i.startsWith(\"font\")||i.startsWith(\"text\")||i.startsWith(\"align\")||i.startsWith(\"justify\")||i.startsWith(\"display\")||i.startsWith(\"flex\")||i.startsWith(\"border\")||i===\"opacity\"||i===\"color\"||i===\"list-style-type\"||mO(op.USE_COMPUTED_STYLE_INSTEAD_OF_BOUNDING_RECT)&&(i===\"width\"||i===\"height\")}).forEach(function(i){return e.style.setProperty(i,n.getPropertyValue(i),n.getPropertyPriority(i))})}s(fO,\"copyStylesFromTo\");function A1e(t,e){t.draggable=!1,t.ondragstart=function(){return!1},e?(t.style.userSelect=\"\",t.style.WebkitUserSelect=\"\",t.style.cursor=\"\"):(t.style.userSelect=\"none\",t.style.WebkitUserSelect=\"none\",t.style.cursor=\"grab\")}s(A1e,\"styleDraggable\");function hO(t){t.style.display=\"none\",t.style.position=\"fixed\",t.style.zIndex=\"-5\"}s(hO,\"hideElement\");function T1e(t){t.style.visibility=\"hidden\",t.setAttribute(jb,\"true\")}s(T1e,\"decorateShadowEl\");function C1e(t){t.style.visibility=\"\",t.removeAttribute(jb)}s(C1e,\"unDecorateShadowElement\");function Ch(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){return[]};t.forEach(function(i){var a=e(i);Object.keys(a).forEach(function(r){i.style[r]=a[r]}),n(i).forEach(function(r){return i.classList.add(r)})})}s(Ch,\"styleActiveDropZones\");function Dh(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){},n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:function(){return[]};t.forEach(function(i){var a=e(i);Object.keys(a).forEach(function(r){i.style[r]=\"\"}),n(i).forEach(function(r){return i.classList.contains(r)&&i.classList.remove(r)})})}s(Dh,\"styleInactiveDropZones\");function S1e(t){var e=t.style.minHeight;t.style.minHeight=window.getComputedStyle(t).getPropertyValue(\"height\");var n=t.style.minWidth;return t.style.minWidth=window.getComputedStyle(t).getPropertyValue(\"width\"),s(function(){t.style.minHeight=e,t.style.minWidth=n},\"undo\")}s(S1e,\"preventShrinking\");var O1e=\"--any--\",I1e=100,D1e=20,ZS=3,QS={outline:\"rgba(255, 255, 102, 0.7) solid 2px\"},$S=\"data-is-dnd-original-dragged-item\",ir,_i,Ji,Lh,Cn,Vh,us,gi,ls,la,cl=!1,Cb=!1,Sb,up=!1,ip=[],or=new Map,zn=new Map,fb=new WeakMap;function F1e(t,e){vt(function(){return\"registering drop-zone if absent\"}),or.has(e)||or.set(e,new Set),or.get(e).has(t)||(or.get(e).add(t),sO())}s(F1e,\"registerDropZone\");function eO(t,e){or.get(e).delete(t),lO(),or.get(e).size===0&&or.delete(e)}s(eO,\"unregisterDropZone\");function N1e(){vt(function(){return\"watching dragged element\"});var t=or.get(Lh),e=lp(t),n;try{for(e.s();!(n=e.n()).done;){var i=n.value;i.addEventListener(Mh,gO),i.addEventListener(cp,_O),i.addEventListener(Bh,xO)}}catch(l){e.e(l)}finally{e.f()}window.addEventListener(kb,Kc);var a=Math.max.apply(Math,Ia(Array.from(t.keys()).map(function(l){return zn.get(l).dropAnimationDurationMs}))),r=a===0?D1e:Math.max(a,I1e),o=_1e(t,function(){return la});m1e(_i,t,r*1.07,o)}s(N1e,\"watchDraggedElement\");function R1e(){vt(function(){return\"unwatching dragged element\"});var t=or.get(Lh),e=lp(t),n;try{for(e.s();!(n=e.n()).done;){var i=n.value;i.removeEventListener(Mh,gO),i.removeEventListener(cp,_O),i.removeEventListener(Bh,xO)}}catch(a){e.e(a)}finally{e.f()}window.removeEventListener(kb,Kc),f1e()}s(R1e,\"unWatchDraggedElement\");function zh(t){return t.findIndex(function(e){return!!e[sr]})}s(zh,\"findShadowElementIdx\");function M1e(t){var e;return Sh(Sh({},t),{},(e={},Gc(e,sr,!0),Gc(e,ni,i1e),e))}s(M1e,\"createShadowElData\");function gO(t){vt(function(){return[\"dragged entered\",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn){vt(function(){return\"ignoring dragged entered because drop is currently disabled\"});return}if(up=!1,n=n.filter(function(u){return u[ni]!==us[ni]}),vt(function(){return\"dragged entered items \".concat(Jr(n))}),Cn!==t.currentTarget){var a=zn.get(Cn).items,r=a.filter(function(u){return!u[sr]});ds(Cn,r,{trigger:Di.DRAGGED_ENTERED_ANOTHER,id:Ji[ni],source:Gi.POINTER})}var o=t.detail.indexObj,l=o.index,c=o.isProximityBased,d=c&&l===t.currentTarget.children.length-1?l+1:l;gi=t.currentTarget,n.splice(d,0,us),ds(t.currentTarget,n,{trigger:Di.DRAGGED_ENTERED,id:Ji[ni],source:Gi.POINTER})}s(gO,\"handleDraggedEntered\");function _O(t){if(cl){vt(function(){return[\"dragged left\",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn&&t.currentTarget!==gi){vt(function(){return\"drop is currently disabled\"});return}var a=Ia(n),r=zh(a);r!==-1&&a.splice(r,1);var o=gi;gi=void 0;var l=t.detail,c=l.type,d=l.theOtherDz;if(c===Oh.OUTSIDE_OF_ANY||c===Oh.LEFT_FOR_ANOTHER&&d!==Cn&&zn.get(d).dropFromOthersDisabled){vt(function(){return\"dragged left all, putting shadow element back in the origin dz\"}),up=!0,gi=Cn;var u=o===Cn?a:Ia(zn.get(Cn).items);u.splice(Vh,0,us),ds(Cn,u,{trigger:Di.DRAGGED_LEFT_ALL,id:Ji[ni],source:Gi.POINTER})}ds(t.currentTarget,a,{trigger:Di.DRAGGED_LEFT,id:Ji[ni],source:Gi.POINTER})}}s(_O,\"handleDraggedLeft\");function xO(t){vt(function(){return[\"dragged is over index\",t.currentTarget,t.detail]});var e=zn.get(t.currentTarget),n=e.items,i=e.dropFromOthersDisabled;if(i&&t.currentTarget!==Cn){vt(function(){return\"drop is currently disabled\"});return}var a=Ia(n);up=!1;var r=t.detail.indexObj.index,o=zh(a);o!==-1&&a.splice(o,1),a.splice(r,0,us),ds(t.currentTarget,a,{trigger:Di.DRAGGED_OVER_INDEX,id:Ji[ni],source:Gi.POINTER})}s(xO,\"handleDraggedIsOverIndex\");function Fh(t){t.preventDefault();var e=t.touches?t.touches[0]:t;la={x:e.clientX,y:e.clientY},_i.style.transform=\"translate3d(\".concat(la.x-ls.x,\"px, \").concat(la.y-ls.y,\"px, 0)\")}s(Fh,\"handleMouseMove\");function Kc(){vt(function(){return\"dropped\"}),Cb=!0,window.removeEventListener(\"mousemove\",Fh),window.removeEventListener(\"touchmove\",Fh),window.removeEventListener(\"mouseup\",Kc),window.removeEventListener(\"touchend\",Kc),R1e(),k1e(_i),gi||(vt(function(){return\"element was dropped right after it left origin but before entering somewhere else\"}),gi=Cn),vt(function(){return[\"dropped in dz\",gi]});var t=zn.get(gi),e=t.items,n=t.type;Dh(or.get(n),function(r){return zn.get(r).dropTargetStyle},function(r){return zn.get(r).dropTargetClasses});var i=zh(e);i===-1&&gi===Cn&&(i=Vh),e=e.map(function(r){return r[sr]?Ji:r});function a(){Sb(),Wc(gi,e,{trigger:up?Di.DROPPED_OUTSIDE_OF_ANY:Di.DROPPED_INTO_ZONE,id:Ji[ni],source:Gi.POINTER}),gi!==Cn&&Wc(Cn,zn.get(Cn).items,{trigger:Di.DROPPED_INTO_ANOTHER,id:Ji[ni],source:Gi.POINTER}),i!==-1&&C1e(gi.children[i]),L1e()}s(a,\"finalizeWithinZone\"),B1e(i,a)}s(Kc,\"handleDrop\");function B1e(t,e){var n=t>-1?_b(gi.children[t]):_b(gi),i={x:n.left-parseFloat(_i.style.left),y:n.top-parseFloat(_i.style.top)},a=zn.get(gi),r=a.dropAnimationDurationMs,o=\"transform \".concat(r,\"ms ease\");_i.style.transition=_i.style.transition?_i.style.transition+\",\"+o:o,_i.style.transform=\"translate3d(\".concat(i.x,\"px, \").concat(i.y,\"px, 0)\"),window.setTimeout(e,r)}s(B1e,\"animateDraggedToFinalPosition\");function P1e(t,e){ip.push({dz:t,destroy:e}),window.requestAnimationFrame(function(){hO(t),document.body.appendChild(t)})}s(P1e,\"scheduleDZForRemovalAfterDrop\");function L1e(){_i.remove(),ir.remove(),ip.length&&(vt(function(){return[\"will destroy zones that were removed during drag\",ip]}),ip.forEach(function(t){var e=t.dz,n=t.destroy;n(),e.remove()}),ip=[]),_i=void 0,ir=void 0,Ji=void 0,Lh=void 0,Cn=void 0,Vh=void 0,us=void 0,gi=void 0,ls=void 0,la=void 0,cl=!1,Cb=!1,Sb=void 0,up=!1}s(L1e,\"cleanupPostDrop\");function V1e(t,e){var n=!1,i={items:void 0,type:void 0,flipDurationMs:0,dragDisabled:!1,morphDisabled:!1,dropFromOthersDisabled:!1,dropTargetStyle:QS,dropTargetClasses:[],transformDraggedElement:s(function(){},\"transformDraggedElement\"),centreDraggedOnCursor:!1};vt(function(){return[\"dndzone good to go options: \".concat(Jr(e),\", config: \").concat(Jr(i)),{node:t}]});var a=new Map;function r(){window.addEventListener(\"mousemove\",c,{passive:!1}),window.addEventListener(\"touchmove\",c,{passive:!1,capture:!1}),window.addEventListener(\"mouseup\",l,{passive:!1}),window.addEventListener(\"touchend\",l,{passive:!1})}s(r,\"addMaybeListeners\");function o(){window.removeEventListener(\"mousemove\",c),window.removeEventListener(\"touchmove\",c),window.removeEventListener(\"mouseup\",l),window.removeEventListener(\"touchend\",l)}s(o,\"removeMaybeListeners\");function l(m){o(),ir=void 0,ls=void 0,la=void 0,m.type===\"touchend\"&&m.target.click()}s(l,\"handleFalseAlarm\");function c(m){m.preventDefault();var f=m.touches?m.touches[0]:m;la={x:f.clientX,y:f.clientY},(Math.abs(la.x-ls.x)>=ZS||Math.abs(la.y-ls.y)>=ZS)&&(o(),u())}s(c,\"handleMouseMoveMaybeDragStart\");function d(m){if(m.target!==m.currentTarget&&(m.target.value!==void 0||m.target.isContentEditable)){vt(function(){return\"won't initiate drag on a nested input element\"});return}if(m.button){vt(function(){return\"ignoring none left click button: \".concat(m.button)});return}if(cl){vt(function(){return\"cannot start a new drag before finalizing previous one\"});return}m.preventDefault(),m.stopPropagation();var f=m.touches?m.touches[0]:m;ls={x:f.clientX,y:f.clientY},la=Sh({},ls),ir=m.currentTarget,r()}s(d,\"handleMouseDown\");function u(){vt(function(){return[\"drag start config: \".concat(Jr(i)),ir]}),cl=!0;var m=a.get(ir);Vh=m,Cn=ir.parentElement;var f=Cn.closest(\"dialog\")||Cn.getRootNode(),g=f.body||f,x=i.items,_=i.type,h=i.centreDraggedOnCursor,v=Ia(x);Ji=v[m],Lh=_,us=M1e(Ji),_i=E1e(ir,h&&la),ir.setAttribute($S,!0);function b(){_i.parentElement?window.requestAnimationFrame(b):(g.appendChild(_i),_i.focus(),N1e(),hO(ir),g.appendChild(ir),us[ni]=Ji[ni])}s(b,\"keepOriginalElementInDom\"),window.requestAnimationFrame(b),Ch(Array.from(or.get(i.type)).filter(function(y){return y===Cn||!zn.get(y).dropFromOthersDisabled}),function(y){return zn.get(y).dropTargetStyle},function(y){return zn.get(y).dropTargetClasses}),v.splice(m,1,us),Sb=S1e(Cn),ds(Cn,v,{trigger:Di.DRAG_STARTED,id:Ji[ni],source:Gi.POINTER}),window.addEventListener(\"mousemove\",Fh,{passive:!1}),window.addEventListener(\"touchmove\",Fh,{passive:!1,capture:!1}),window.addEventListener(\"mouseup\",Kc,{passive:!1}),window.addEventListener(\"touchend\",Kc,{passive:!1})}s(u,\"handleDragStart\");function p(m){var f=m.items,g=f===void 0?void 0:f,x=m.flipDurationMs,_=x===void 0?0:x,h=m.type,v=h===void 0?O1e:h,b=m.dragDisabled,y=b===void 0?!1:b,w=m.morphDisabled,S=w===void 0?!1:w,F=m.dropFromOthersDisabled,N=F===void 0?!1:F,k=m.dropTargetStyle,R=k===void 0?QS:k,D=m.dropTargetClasses,B=D===void 0?[]:D,q=m.transformDraggedElement,G=q===void 0?function(){}:q,W=m.centreDraggedOnCursor,ee=W===void 0?!1:W;i.dropAnimationDurationMs=_,i.type&&v!==i.type&&eO(t,i.type),i.type=v,i.items=Ia(g),i.dragDisabled=y,i.morphDisabled=S,i.transformDraggedElement=G,i.centreDraggedOnCursor=ee,n&&cl&&!Cb&&(!u1e(R,i.dropTargetStyle)||!d1e(B,i.dropTargetClasses))&&(Dh([t],function(){return i.dropTargetStyle},function(){return B}),Ch([t],function(){return R},function(){return B})),i.dropTargetStyle=R,i.dropTargetClasses=Ia(B);function Z(he,Ie){return zn.get(he)?zn.get(he)[Ie]:i[Ie]}s(Z,\"getConfigProp\"),n&&cl&&i.dropFromOthersDisabled!==N&&(N?Dh([t],function(he){return Z(he,\"dropTargetStyle\")},function(he){return Z(he,\"dropTargetClasses\")}):Ch([t],function(he){return Z(he,\"dropTargetStyle\")},function(he){return Z(he,\"dropTargetClasses\")})),i.dropFromOthersDisabled=N,zn.set(t,i),F1e(t,v);for(var me=zh(i.items),X=0;X<t.children.length;X++){var Q=t.children[X];if(A1e(Q,y),X===me){S||j1e(_i,Q,la.x,la.y),i.transformDraggedElement(_i,Ji,X),T1e(Q);continue}Q.removeEventListener(\"mousedown\",fb.get(Q)),Q.removeEventListener(\"touchstart\",fb.get(Q)),y||(Q.addEventListener(\"mousedown\",d),Q.addEventListener(\"touchstart\",d),fb.set(Q,d)),a.set(Q,X),n||(n=!0)}}return s(p,\"configure\"),p(e),{update:s(function(f){vt(function(){return\"pointer dndzone will update newOptions: \".concat(Jr(f))}),p(f)},\"update\"),destroy:s(function(){function f(){vt(function(){return\"pointer dndzone will destroy\"}),eO(t,zn.get(t).type),zn.delete(t)}s(f,\"destroyDz\"),cl&&!t.closest(\"[\".concat($S,\"]\"))?(vt(function(){return\"pointer dndzone will be scheduled for destruction\"}),P1e(t,f)):f()},\"destroy\")}}s(V1e,\"dndzone\");var Th,vb={DND_ZONE_ACTIVE:\"dnd-zone-active\",DND_ZONE_DRAG_DISABLED:\"dnd-zone-drag-disabled\"},vO=(Th={},Gc(Th,vb.DND_ZONE_ACTIVE,\"Tab to one the items and press space-bar or enter to start dragging it\"),Gc(Th,vb.DND_ZONE_DRAG_DISABLED,\"This is a disabled drag and drop list\"),Th),z1e=\"dnd-action-aria-alert\",Vn;function bb(){Vn||(Vn=document.createElement(\"div\"),s(function(){Vn.id=z1e,Vn.style.position=\"fixed\",Vn.style.bottom=\"0\",Vn.style.left=\"0\",Vn.style.zIndex=\"-5\",Vn.style.opacity=\"0\",Vn.style.height=\"0\",Vn.style.width=\"0\",Vn.setAttribute(\"role\",\"alert\")},\"initAlertsDiv\")(),document.body.prepend(Vn),Object.entries(vO).forEach(function(t){var e=Uye(t,2),n=e[0],i=e[1];return document.body.prepend(H1e(n,i))}))}s(bb,\"initAriaOnBrowser\");function U1e(){return Ab?null:(document.readyState===\"complete\"?bb():window.addEventListener(\"DOMContentLoaded\",bb),Sh({},vb))}s(U1e,\"initAria\");function q1e(){Ab||!Vn||(Object.keys(vO).forEach(function(t){var e;return(e=document.getElementById(t))===null||e===void 0?void 0:e.remove()}),Vn.remove(),Vn=void 0)}s(q1e,\"destroyAria\");function H1e(t,e){var n=document.createElement(\"div\");return n.id=t,n.innerHTML=\"<p>\".concat(e,\"</p>\"),n.style.display=\"none\",n.style.position=\"fixed\",n.style.zIndex=\"-5\",n}s(H1e,\"instructionToHiddenDiv\");function Jc(t){if(!Ab){Vn||bb(),Vn.innerHTML=\"\";var e=document.createTextNode(t);Vn.appendChild(e),Vn.style.display=\"none\",Vn.style.display=\"inline\"}}s(Jc,\"alertToScreenReader\");var J1e=\"--any--\",tO={outline:\"rgba(255, 255, 102, 0.7) solid 2px\"},Oa=!1,yb,yi,ul=\"\",ll,ar,cs=\"\",Nh=new WeakSet,nO=new WeakMap,iO=new WeakMap,wb=new Map,hi=new Map,rr=new Map,Rh;function G1e(t,e){vt(function(){return\"registering drop-zone if absent\"}),rr.size===0&&(vt(function(){return\"adding global keydown and click handlers\"}),Rh=U1e(),window.addEventListener(\"keydown\",bO),window.addEventListener(\"click\",yO)),rr.has(e)||rr.set(e,new Set),rr.get(e).has(t)||(rr.get(e).add(t),sO())}s(G1e,\"registerDropZone$1\");function aO(t,e){vt(function(){return\"unregistering drop-zone\"}),yi===t&&sp(),rr.get(e).delete(t),lO(),rr.get(e).size===0&&rr.delete(e),rr.size===0&&(vt(function(){return\"removing global keydown and click handlers\"}),window.removeEventListener(\"keydown\",bO),window.removeEventListener(\"click\",yO),Rh=void 0,q1e())}s(aO,\"unregisterDropZone$1\");function bO(t){if(Oa)switch(t.key){case\"Escape\":{sp();break}}}s(bO,\"globalKeyDownHandler\");function yO(){Oa&&(Nh.has(document.activeElement)||(vt(function(){return\"clicked outside of any draggable\"}),sp()))}s(yO,\"globalClickHandler\");function W1e(t){if(vt(function(){return\"zone focus\"}),!!Oa){var e=t.currentTarget;if(e!==yi){ul=e.getAttribute(\"aria-label\")||\"\";var n=hi.get(yi),i=n.items,a=i.find(function(p){return p[ni]===ar}),r=i.indexOf(a),o=i.splice(r,1)[0],l=hi.get(e),c=l.items,d=l.autoAriaDisabled;e.getBoundingClientRect().top<yi.getBoundingClientRect().top||e.getBoundingClientRect().left<yi.getBoundingClientRect().left?(c.push(o),d||Jc(\"Moved item \".concat(cs,\" to the end of the list \").concat(ul))):(c.unshift(o),d||Jc(\"Moved item \".concat(cs,\" to the beginning of the list \").concat(ul)));var u=yi;Wc(u,i,{trigger:Di.DROPPED_INTO_ANOTHER,id:ar,source:Gi.KEYBOARD}),Wc(e,c,{trigger:Di.DROPPED_INTO_ZONE,id:ar,source:Gi.KEYBOARD}),yi=e}}}s(W1e,\"handleZoneFocus\");function wO(){wb.forEach(function(t,e){var n=t.update;return n(hi.get(e))})}s(wO,\"triggerAllDzsUpdate\");function sp(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;vt(function(){return\"drop\"}),hi.get(yi).autoAriaDisabled||Jc(\"Stopped dragging item \".concat(cs)),Nh.has(document.activeElement)&&document.activeElement.blur(),t&&ds(yi,hi.get(yi).items,{trigger:Di.DRAG_STOPPED,id:ar,source:Gi.KEYBOARD}),Dh(rr.get(yb),function(e){return hi.get(e).dropTargetStyle},function(e){return hi.get(e).dropTargetClasses}),ll=null,ar=null,cs=\"\",yb=null,yi=null,ul=\"\",Oa=!1,wO()}s(sp,\"handleDrop$1\");function K1e(t,e){var n={items:void 0,type:void 0,dragDisabled:!1,zoneTabIndex:0,zoneItemTabIndex:0,dropFromOthersDisabled:!1,dropTargetStyle:tO,dropTargetClasses:[],autoAriaDisabled:!1};function i(u,p,m){u.length<=1||u.splice(m,1,u.splice(p,1,u[m])[0])}s(i,\"swap\");function a(u){switch(vt(function(){return[\"handling key down\",u.key]}),u.key){case\"Enter\":case\" \":{if((u.target.disabled!==void 0||u.target.href||u.target.isContentEditable)&&!Nh.has(u.target))return;u.preventDefault(),u.stopPropagation(),Oa?sp():r(u);break}case\"ArrowDown\":case\"ArrowRight\":{if(!Oa)return;u.preventDefault(),u.stopPropagation();var p=hi.get(t),m=p.items,f=Array.from(t.children),g=f.indexOf(u.currentTarget);vt(function(){return[\"arrow down\",g]}),g<f.length-1&&(n.autoAriaDisabled||Jc(\"Moved item \".concat(cs,\" to position \").concat(g+2,\" in the list \").concat(ul)),i(m,g,g+1),Wc(t,m,{trigger:Di.DROPPED_INTO_ZONE,id:ar,source:Gi.KEYBOARD}));break}case\"ArrowUp\":case\"ArrowLeft\":{if(!Oa)return;u.preventDefault(),u.stopPropagation();var x=hi.get(t),_=x.items,h=Array.from(t.children),v=h.indexOf(u.currentTarget);vt(function(){return[\"arrow up\",v]}),v>0&&(n.autoAriaDisabled||Jc(\"Moved item \".concat(cs,\" to position \").concat(v,\" in the list \").concat(ul)),i(_,v,v-1),Wc(t,_,{trigger:Di.DROPPED_INTO_ZONE,id:ar,source:Gi.KEYBOARD}));break}}}s(a,\"handleKeyDown\");function r(u){vt(function(){return\"drag start\"}),l(u.currentTarget),yi=t,yb=n.type,Oa=!0;var p=Array.from(rr.get(n.type)).filter(function(f){return f===yi||!hi.get(f).dropFromOthersDisabled});if(Ch(p,function(f){return hi.get(f).dropTargetStyle},function(f){return hi.get(f).dropTargetClasses}),!n.autoAriaDisabled){var m=\"Started dragging item \".concat(cs,\". Use the arrow keys to move it within its list \").concat(ul);p.length>1&&(m+=\", or tab to another list in order to move the item into it\"),Jc(m)}ds(t,hi.get(t).items,{trigger:Di.DRAG_STARTED,id:ar,source:Gi.KEYBOARD}),wO()}s(r,\"handleDragStart\");function o(u){Oa&&u.currentTarget!==ll&&(u.stopPropagation(),sp(!1),r(u))}s(o,\"handleClick\");function l(u){var p=hi.get(t),m=p.items,f=Array.from(t.children),g=f.indexOf(u);ll=u,ll.tabIndex=n.zoneItemTabIndex,ar=m[g][ni],cs=f[g].getAttribute(\"aria-label\")||\"\"}s(l,\"setCurrentFocusedItem\");function c(u){var p=u.items,m=p===void 0?[]:p,f=u.type,g=f===void 0?J1e:f,x=u.dragDisabled,_=x===void 0?!1:x,h=u.zoneTabIndex,v=h===void 0?0:h,b=u.zoneItemTabIndex,y=b===void 0?0:b,w=u.dropFromOthersDisabled,S=w===void 0?!1:w,F=u.dropTargetStyle,N=F===void 0?tO:F,k=u.dropTargetClasses,R=k===void 0?[]:k,D=u.autoAriaDisabled,B=D===void 0?!1:D;n.items=Ia(m),n.dragDisabled=_,n.dropFromOthersDisabled=S,n.zoneTabIndex=v,n.zoneItemTabIndex=y,n.dropTargetStyle=N,n.dropTargetClasses=R,n.autoAriaDisabled=B,n.type&&g!==n.type&&aO(t,n.type),n.type=g,G1e(t,g),B||(t.setAttribute(\"aria-disabled\",_),t.setAttribute(\"role\",\"list\"),t.setAttribute(\"aria-describedby\",_?Rh.DND_ZONE_DRAG_DISABLED:Rh.DND_ZONE_ACTIVE)),hi.set(t,n),Oa?t.tabIndex=t===yi||ll.contains(t)||n.dropFromOthersDisabled||yi&&n.type!==hi.get(yi).type?-1:0:t.tabIndex=n.zoneTabIndex,t.addEventListener(\"focus\",W1e);for(var q=s(function(ee){var Z=t.children[ee];Nh.add(Z),Z.tabIndex=Oa?-1:n.zoneItemTabIndex,B||Z.setAttribute(\"role\",\"listitem\"),Z.removeEventListener(\"keydown\",nO.get(Z)),Z.removeEventListener(\"click\",iO.get(Z)),_||(Z.addEventListener(\"keydown\",a),nO.set(Z,a),Z.addEventListener(\"click\",o),iO.set(Z,o)),Oa&&n.items[ee][ni]===ar&&(vt(function(){return[\"focusing on\",{i:ee,focusedItemId:ar}]}),ll=Z,ll.tabIndex=n.zoneItemTabIndex,Z.focus())},\"_loop\"),G=0;G<t.children.length;G++)q(G)}s(c,\"configure\"),c(e);var d={update:s(function(p){vt(function(){return\"keyboard dndzone will update newOptions: \".concat(Jr(p))}),c(p)},\"update\"),destroy:s(function(){vt(function(){return\"keyboard dndzone will destroy\"}),aO(t,n.type),hi.delete(t),wb.delete(t)},\"destroy\")};return wb.set(t,d),d}s(K1e,\"dndzone$1\");var Y1e=[\"items\",\"flipDurationMs\",\"type\",\"dragDisabled\",\"morphDisabled\",\"dropFromOthersDisabled\",\"zoneTabIndex\",\"zoneItemTabIndex\",\"dropTargetStyle\",\"dropTargetClasses\",\"transformDraggedElement\",\"autoAriaDisabled\",\"centreDraggedOnCursor\"];function dp(t,e){if(X1e(t))return{update:s(function(){},\"update\"),destroy:s(function(){},\"destroy\")};rO(e);var n=V1e(t,e),i=K1e(t,e);return{update:s(function(r){rO(r),n.update(r),i.update(r)},\"update\"),destroy:s(function(){n.destroy(),i.destroy()},\"destroy\")}}s(dp,\"dndzone$2\");function X1e(t){return!!t.closest(\"[\".concat(n1e,'=\"true\"]'))}s(X1e,\"shouldIgnoreZone\");function rO(t){var e=t.items,n=t.flipDurationMs,i=t.type,a=t.dragDisabled,r=t.morphDisabled,o=t.dropFromOthersDisabled,l=t.zoneTabIndex,c=t.zoneItemTabIndex,d=t.dropTargetStyle,u=t.dropTargetClasses,p=t.transformDraggedElement,m=t.autoAriaDisabled,f=t.centreDraggedOnCursor,g=zye(t,Y1e);if(Object.keys(g).length>0&&console.warn(\"dndzone will ignore unknown options\",g),!e)throw new Error(\"no 'items' key provided to dndzone\");var x=e.find(function(_){return!{}.hasOwnProperty.call(_,ni)});if(x)throw new Error(\"missing '\".concat(ni,\"' property for item \").concat(Jr(x)));if(u&&!Array.isArray(u))throw new Error(\"dropTargetClasses should be an array but instead it is a \".concat(ap(u),\", \").concat(Jr(u)));if(l&&!oO(l))throw new Error(\"zoneTabIndex should be a number but instead it is a \".concat(ap(l),\", \").concat(Jr(l)));if(c&&!oO(c))throw new Error(\"zoneItemTabIndex should be a number but instead it is a \".concat(ap(c),\", \").concat(Jr(c)))}s(rO,\"validateOptions\");function oO(t){return!isNaN(t)&&function(e){return(e|0)===e}(parseFloat(t))}s(oO,\"isInt\");function Z1e(t){var e=t,n=new Set;return{get:s(function(){return e},\"get\"),set:s(function(a){e=a,Array.from(n).forEach(function(r){return r(e)})},\"set\"),subscribe:s(function(a){n.add(a),a(e)},\"subscribe\"),unsubscribe:s(function(a){n.delete(a)},\"unsubscribe\")}}s(Z1e,\"createStore\");var YJe=Z1e(!0);function EO(t,e,n){let i=t.slice();return i[18]=e[n],i}s(EO,\"get_each_context\");function kO(t,e,n){let i=t.slice();return i[18]=e[n],i}s(kO,\"get_each_context_1\");function jO(t){let e,n;return{c(){e=L(\"div\"),Xe(e,\"visibility\",\"visible\",1),Xe(e,\"border-bottom\",\"2px solid var(--color-accent)\"),Xe(e,\"width\",\"100%\"),Xe(e,\"height\",\"50%\")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(jO,\"create_if_block_1\");function AO(t,e){let n,i,a,r=(e[18].icon??\"folder\")+\"\",o,l,c,d=e[18].title+\"\",u,p,m,f=ie,g=e[18][sr]&&jO(e);return{key:t,first:null,c(){n=L(\"div\"),g&&g.c(),i=J(),a=L(\"i\"),o=Re(r),l=J(),c=L(\"span\"),u=Re(d),p=J(),E(a,\"class\",\"material-icons notranslate icon\"),Xe(a,\"color\",\"rgb(162, 235, 255)\"),E(c,\"class\",\"svelte-a8pqh0\"),E(n,\"class\",\"list-item svelte-a8pqh0\"),this.first=n},m(x,_){U(x,n,_),g&&g.m(n,null),I(n,i),I(n,a),I(a,o),I(n,l),I(n,c),I(c,u),I(n,p)},p(x,_){e=x,e[18][sr]?g?_&256&&ae(g,1):(g=jO(e),g.c(),ae(g,1),g.m(n,i)):g&&(g.d(1),g=null),_&256&&r!==(r=(e[18].icon??\"folder\")+\"\")&&ct(o,r),_&256&&d!==(d=e[18].title+\"\")&&ct(u,d)},r(){m=n.getBoundingClientRect()},f(){lu(n),f()},a(){f(),f=su(n,m,tp,{duration:150})},i(x){ae(g)},o:ie,d(x){x&&z(n),g&&g.d()}}}s(AO,\"create_each_block_1\");function TO(t){let e,n;return{c(){e=L(\"div\"),Xe(e,\"visibility\",\"visible\",1),Xe(e,\"border-bottom\",\"2px solid var(--color-accent)\"),Xe(e,\"width\",\"100%\"),Xe(e,\"height\",\"50%\")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(TO,\"create_if_block\");function CO(t,e){let n,i,a,r=(e[18].icon??\"folder\")+\"\",o,l,c,d=e[18].title+\"\",u,p,m,f=ie,g=e[18][sr]&&TO(e);return{key:t,first:null,c(){n=L(\"div\"),g&&g.c(),i=J(),a=L(\"i\"),o=Re(r),l=J(),c=L(\"span\"),u=Re(d),p=J(),E(a,\"class\",\"material-icons notranslate icon\"),Xe(a,\"color\",\"rgb(162, 235, 255)\"),E(c,\"class\",\"svelte-a8pqh0\"),E(n,\"class\",\"list-item svelte-a8pqh0\"),this.first=n},m(x,_){U(x,n,_),g&&g.m(n,null),I(n,i),I(n,a),I(a,o),I(n,l),I(n,c),I(c,u),I(n,p)},p(x,_){e=x,e[18][sr]?g?_&128&&ae(g,1):(g=TO(e),g.c(),ae(g,1),g.m(n,i)):g&&(g.d(1),g=null),_&128&&r!==(r=(e[18].icon??\"folder\")+\"\")&&ct(o,r),_&128&&d!==(d=e[18].title+\"\")&&ct(u,d)},r(){m=n.getBoundingClientRect()},f(){lu(n),f()},a(){f(),f=su(n,m,tp,{duration:150})},i(x){ae(g)},o:ie,d(x){x&&z(n),g&&g.d()}}}s(CO,\"create_each_block\");function Q1e(t){let e,n,i,a,r,o,l=[],c=new Map,d,u,p,m,f,g,x,_,h,v=[],b=new Map,y,w,S,F=t[8],N=s(D=>D[18].id,\"get_key\");for(let D=0;D<F.length;D+=1){let B=kO(t,F,D),q=N(B);c.set(q,l[D]=AO(q,B))}let k=t[7],R=s(D=>D[18].id,\"get_key_1\");for(let D=0;D<k.length;D+=1){let B=EO(t,k,D),q=R(B);b.set(q,v[D]=CO(q,B))}return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"h3\"),a=Re(t[2]),r=J(),o=L(\"section\");for(let D=0;D<l.length;D+=1)l[D].c();u=J(),p=L(\"i\"),m=J(),f=L(\"div\"),g=L(\"h3\"),x=Re(t[4]),_=J(),h=L(\"section\");for(let D=0;D<v.length;D+=1)v[D].c();E(i,\"class\",\"svelte-a8pqh0\"),E(o,\"class\",\"column sub-column-container svelte-a8pqh0\"),E(n,\"class\",\"column svelte-a8pqh0\"),E(n,\"title\",t[3]),E(p,\"class\",\"fa-icon fas fa-arrow-right-arrow-left icon in_list_button svelte-a8pqh0\"),Xe(p,\"min-width\",\"30px\"),E(p,\"title\",t[6]),E(g,\"class\",\"svelte-a8pqh0\"),E(h,\"class\",\"column sub-column-container svelte-a8pqh0\"),E(f,\"class\",\"column selected-column svelte-a8pqh0\"),E(f,\"title\",t[5]),E(e,\"class\",\"main-column-container svelte-a8pqh0\")},m(D,B){U(D,e,B),I(e,n),I(n,i),I(i,a),I(n,r),I(n,o);for(let q=0;q<l.length;q+=1)l[q]&&l[q].m(o,null);I(e,u),I(e,p),I(e,m),I(e,f),I(f,g),I(g,x),I(f,_),I(f,h);for(let q=0;q<v.length;q+=1)v[q]&&v[q].m(h,null);w||(S=[bn(d=dp.call(null,o,{items:t[8],flipDurationMs:150,centreDraggedOnCursor:!0})),Ue(o,\"consider\",t[9]),Ue(o,\"finalize\",t[16]),Ue(p,\"click\",t[12]),bn(y=dp.call(null,h,{items:t[7],flipDurationMs:150,centreDraggedOnCursor:!0})),Ue(h,\"consider\",t[10]),Ue(h,\"finalize\",t[17])],w=!0)},p(D,B){if(B&4&&ct(a,D[2]),B&256){F=D[8];for(let q=0;q<l.length;q+=1)l[q].r();l=du(l,B,N,1,D,F,c,o,uu,AO,null,kO);for(let q=0;q<l.length;q+=1)l[q].a()}if(d&&qn(d.update)&&B&256&&d.update.call(null,{items:D[8],flipDurationMs:150,centreDraggedOnCursor:!0}),B&8&&E(n,\"title\",D[3]),B&64&&E(p,\"title\",D[6]),B&16&&ct(x,D[4]),B&128){k=D[7];for(let q=0;q<v.length;q+=1)v[q].r();v=du(v,B,R,1,D,k,b,h,uu,CO,null,EO);for(let q=0;q<v.length;q+=1)v[q].a()}y&&qn(y.update)&&B&128&&y.update.call(null,{items:D[7],flipDurationMs:150,centreDraggedOnCursor:!0}),B&32&&E(f,\"title\",D[5])},i(D){for(let B=0;B<F.length;B+=1)ae(l[B]);for(let B=0;B<k.length;B+=1)ae(v[B])},o:ie,d(D){D&&z(e);for(let B=0;B<l.length;B+=1)l[B].d();for(let B=0;B<v.length;B+=1)v[B].d();w=!1,Rt(S)}}}s(Q1e,\"create_default_slot\");function $1e(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[13],$$slots:{default:[Q1e]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&8389116&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s($1e,\"create_fragment\");function ewe(t,e,n){let{label:i}=e,{tooltip:a}=e,{availableItemsColumnLable:r}=e,{availableItemsColumnTooltip:o}=e,{includedItemsColumnLable:l}=e,{includedItemsColumnTooltip:c}=e,{swapColumnsButtonTooltip:d}=e,{availableItems:u}=e,{includedItems:p}=e,m=[],f=[];for(let w=0;w<u.length;w++){let S=u[w];p.get().find(F=>F.value===S.value)?m.push({id:w,title:S.name,icon:S.icon}):f.push({id:w,title:S.name,icon:S.icon})}function g(w){n(8,f=w.detail.items)}s(g,\"handleSortAvailableItems\");function x(w){n(7,m=w.detail.items)}s(x,\"handleSortIncludedItems\");function _(){p.update(()=>m.map(w=>u.find(S=>S.name===w.title)))}s(_,\"finalizeSort\");function h(){let w=f;n(8,f=m),n(7,m=w),_()}s(h,\"swapColumns\");function v(){p.set([])}s(v,\"onReset\");let b=s(w=>{g(w),_()},\"finalize_handler\"),y=s(w=>{x(w),_()},\"finalize_handler_1\");return t.$$set=w=>{\"label\"in w&&n(0,i=w.label),\"tooltip\"in w&&n(1,a=w.tooltip),\"availableItemsColumnLable\"in w&&n(2,r=w.availableItemsColumnLable),\"availableItemsColumnTooltip\"in w&&n(3,o=w.availableItemsColumnTooltip),\"includedItemsColumnLable\"in w&&n(4,l=w.includedItemsColumnLable),\"includedItemsColumnTooltip\"in w&&n(5,c=w.includedItemsColumnTooltip),\"swapColumnsButtonTooltip\"in w&&n(6,d=w.swapColumnsButtonTooltip),\"availableItems\"in w&&n(14,u=w.availableItems),\"includedItems\"in w&&n(15,p=w.includedItems)},[i,a,r,o,l,c,d,m,f,g,x,_,h,v,u,p,b,y]}s(ewe,\"instance\");var Uh=class extends Pe{constructor(e){super(),Ve(this,e,ewe,$1e,De,{label:0,tooltip:1,availableItemsColumnLable:2,availableItemsColumnTooltip:3,includedItemsColumnLable:4,includedItemsColumnTooltip:5,swapColumnsButtonTooltip:6,availableItems:14,includedItems:15})}};s(Uh,\"Collection\");var qh=Uh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".main-column-container.svelte-a8pqh0{display:flex;justify-content:space-around}section.sub-column-container.svelte-a8pqh0{display:flex;flex-direction:column;align-items:stretch;width:unset;height:100%;background-color:var(--color-back);border:1px solid var(--color-border);margin:8px;margin-top:0px;padding:6px 8px 30px;max-height:16rem;overflow-y:auto}h3.svelte-a8pqh0{text-align:center;font-size:16px;padding:0px;margin:8px 0px}.column.svelte-a8pqh0{display:flex;flex-direction:column;width:50%}.list-item.svelte-a8pqh0{display:flex;cursor:default !important;width:100%}span.svelte-a8pqh0{padding:0 8px}span.svelte-a8pqh0:hover{color:var(--color-light)}.fa-icon.svelte-a8pqh0{display:flex;align-items:center;justify-content:center;padding-right:8px;padding-left:8px;margin-top:68px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function twe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f;function g(S){t[5](S)}s(g,\"lineinput_value_binding\");let x={label:A(\"dialog.animation_properties.animation_name.title\"),tooltip:A(\"dialog.animation_properties.animation_name.description\"),defaultValue:\"new\",valueChecker:nwe};t[0]!==void 0&&(x.value=t[0]),n=new aa({props:x}),Te.push(()=>Be(n,\"value\",g));function _(S){t[6](S)}s(_,\"select_value_binding\");let h={label:A(\"dialog.animation_properties.loop_mode.title\"),tooltip:A(\"dialog.animation_properties.loop_mode.description\"),options:{once:A(\"dialog.animation_properties.loop_mode.options.once\"),hold:A(\"dialog.animation_properties.loop_mode.options.hold\"),loop:A(\"dialog.animation_properties.loop_mode.options.loop\")},defaultOption:\"once\"};t[1]!==void 0&&(h.value=t[1]),r=new es({props:h}),Te.push(()=>Be(r,\"value\",_));function v(S){t[7](S)}s(v,\"numberslider_value_binding\");let b={label:A(\"dialog.animation_properties.loop_delay.title\"),tooltip:A(\"dialog.animation_properties.loop_delay.description\"),min:0,valueStep:1,defaultValue:0};t[2]!==void 0&&(b.value=t[2]),c=new Mr({props:b}),Te.push(()=>Be(c,\"value\",v));function y(S){t[8](S)}s(y,\"collection_includedItems_binding\");let w={label:A(\"dialog.animation_properties.excluded_nodes.title\"),tooltip:A(\"dialog.animation_properties.bone_lists.description\"),availableItemsColumnLable:A(\"dialog.animation_properties.included_nodes.title\"),availableItemsColumnTooltip:A(\"dialog.animation_properties.included_nodes.description\"),includedItemsColumnLable:A(\"dialog.animation_properties.excluded_nodes.title\"),includedItemsColumnTooltip:A(\"dialog.animation_properties.excluded_nodes.description\"),swapColumnsButtonTooltip:A(\"dialog.animation_properties.swap_columns_button.tooltip\"),availableItems:t[4]};return t[3]!==void 0&&(w.includedItems=t[3]),p=new qh({props:w}),Te.push(()=>Be(p,\"includedItems\",y)),{c(){e=L(\"div\"),Ce(n.$$.fragment),a=J(),Ce(r.$$.fragment),l=J(),Ce(c.$$.fragment),u=J(),Ce(p.$$.fragment)},m(S,F){U(S,e,F),Ae(n,e,null),I(e,a),Ae(r,e,null),I(e,l),Ae(c,e,null),I(e,u),Ae(p,e,null),f=!0},p(S,[F]){let N={};!i&&F&1&&(i=!0,N.value=S[0],Me(()=>i=!1)),n.$set(N);let k={};!o&&F&2&&(o=!0,k.value=S[1],Me(()=>o=!1)),r.$set(k);let R={};!d&&F&4&&(d=!0,R.value=S[2],Me(()=>d=!1)),c.$set(R);let D={};!m&&F&8&&(m=!0,D.includedItems=S[3],Me(()=>m=!1)),p.$set(D)},i(S){f||(ae(n.$$.fragment,S),ae(r.$$.fragment,S),ae(c.$$.fragment,S),ae(p.$$.fragment,S),f=!0)},o(S){de(n.$$.fragment,S),de(r.$$.fragment,S),de(c.$$.fragment,S),de(p.$$.fragment,S),f=!1},d(S){S&&z(e),je(n),je(r),je(c),je(p)}}}s(twe,\"create_fragment\");function nwe(t){return t.trim().length===0?{type:\"error\",message:A(\"dialog.animation_properties.animation_name.error.empty\")}:/[^a-zA-Z0-9_\\.]/.exec(t)?{type:\"error\",message:A(\"dialog.animation_properties.animation_name.error.invalid_characters\")}:{type:\"success\",message:\"\"}}s(nwe,\"animationNameValueChecker\");function iwe(t,e,n){let{animationName:i}=e,{loopMode:a}=e,{loopDelay:r}=e,{excludedNodes:o}=e,l=Ah(o.get());function c(m){i=m,n(0,i)}s(c,\"lineinput_value_binding\");function d(m){a=m,n(1,a)}s(d,\"select_value_binding\");function u(m){r=m,n(2,r)}s(u,\"numberslider_value_binding\");function p(m){o=m,n(3,o)}return s(p,\"collection_includedItems_binding\"),t.$$set=m=>{\"animationName\"in m&&n(0,i=m.animationName),\"loopMode\"in m&&n(1,a=m.loopMode),\"loopDelay\"in m&&n(2,r=m.loopDelay),\"excludedNodes\"in m&&n(3,o=m.excludedNodes)},[i,a,r,o,l,c,d,u,p]}s(iwe,\"instance\");var Hh=class extends Pe{constructor(e){super(),Ve(this,e,iwe,twe,De,{animationName:0,loopMode:1,loopDelay:2,excludedNodes:3})}};s(Hh,\"AnimationProperties\");var SO=Hh;var awe=`${Ke.name}:animationPropertiesDialog`;function OO(t){let e=new ke(t.name),n=new ke(t.loop),i=new ke(Number(t.loop_delay)||0),a=new ke(t.excluded_nodes);new cn({id:awe,title:A(\"dialog.animation_properties.title\",t.name),width:600,content:{component:SO,props:{animationName:e,loopMode:n,loopDelay:i,excludedNodes:a}},preventKeybinds:!0,onConfirm(){t.name=e.get(),t.createUniqueName(Blockbench.Animation.all),t.loop=n.get(),t.loop_delay=i.get().toString(),t.excluded_nodes=a.get(),Project.saved=!1}}).show()}s(OO,\"openAnimationPropertiesDialog\");var IGe=`${Ke.name}:animationPropertiesDialog`;function rwe(t){let e,n,i,a,r,o,l,c,d;return{c(){e=L(\"div\"),n=L(\"label\"),i=Re(t[0]),r=J(),o=L(\"div\"),E(n,\"class\",\"name_space_left\"),E(n,\"for\",a=t[9]),E(e,\"class\",\"dialog_bar form_bar\")},m(u,p){U(u,e,p),I(e,n),I(n,i),I(e,r),I(e,o),c||(d=bn(l=t[3].call(null,o)),c=!0)},p(u,p){p&1&&ct(i,u[0]),p&512&&a!==(a=u[9])&&E(n,\"for\",a)},d(u){u&&z(e),c=!1,d()}}}s(rwe,\"create_default_slot\");function owe(t){let e,n;return e=new Ln({props:{label:t[0],tooltip:t[1],onReset:t[4],$$slots:{default:[rwe,({id:i})=>({9:i}),({id:i})=>i?512:0]},$$scope:{ctx:t}}}),{c(){Ce(e.$$.fragment)},m(i,a){Ae(e,i,a),n=!0},p(i,[a]){let r={};a&1&&(r.label=i[0]),a&2&&(r.tooltip=i[1]),a&1537&&(r.$$scope={dirty:a,ctx:i}),e.$set(r)},i(i){n||(ae(e.$$.fragment,i),n=!0)},o(i){de(e.$$.fragment,i),n=!1},d(i){je(e,i)}}}s(owe,\"create_fragment\");function swe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(d,g=>n(6,i=g)),d),\"$$subscribe_value\");t.$$.on_destroy.push(()=>a());let{label:o}=e,{tooltip:l=\"\"}=e,{defaultValue:c=\"#ffffff\"}=e,{value:d}=e;r();let u=new ColorPicker(`${Ke.name}:${o}-color_picker`,{onChange(){let g=u.get();Jt(d,i=g.toHexString(),i)}});function p(g){u.toElement(g),u.set(i)}s(p,\"mountColorPicker\");function m(){Jt(d,i=c,i)}s(m,\"onReset\");let f=d.subscribe(g=>{u.set(g)});return Zi(()=>{f(),u.delete()}),t.$$set=g=>{\"label\"in g&&n(0,o=g.label),\"tooltip\"in g&&n(1,l=g.tooltip),\"defaultValue\"in g&&n(5,c=g.defaultValue),\"value\"in g&&r(n(2,d=g.value))},[o,l,d,p,m,c]}s(swe,\"instance\");var Jh=class extends Pe{constructor(e){super(),Ve(this,e,swe,owe,De,{label:0,tooltip:1,defaultValue:5,value:2})}};s(Jh,\"ColorPicker_1\");var IO=Jh;function DO(t){let e,n,i;function a(o){t[32](o)}s(a,\"numberslider_value_binding\");let r={label:A(\"dialog.display_entity.brightness_override.title\"),tooltip:A(\"dialog.display_entity.brightness_override.description\"),defaultValue:wt.prototype.brightnessOverride,min:0,max:15,valueStep:1};return t[7]!==void 0&&(r.value=t[7]),e=new Mr({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&128&&(n=!0,c.value=o[7],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(DO,\"create_if_block_2\");function FO(t){let e,n,i,a,r,o,l,c,d,u,p;function m(b){t[33](b)}s(m,\"checkbox0_checked_binding\");let f={label:A(\"dialog.display_entity.enchanted.title\"),tooltip:A(\"dialog.display_entity.enchanted.description\"),defaultValue:wt.prototype.enchanted};t[8]!==void 0&&(f.checked=t[8]),e=new mi({props:f}),Te.push(()=>Be(e,\"checked\",m));function g(b){t[34](b)}s(g,\"checkbox1_checked_binding\");let x={label:A(\"dialog.display_entity.glowing.title\"),tooltip:A(\"dialog.display_entity.glowing.description\"),defaultValue:wt.prototype.glowing};t[9]!==void 0&&(x.checked=t[9]),a=new mi({props:x}),Te.push(()=>Be(a,\"checked\",g));function _(b){t[35](b)}s(_,\"checkbox2_checked_binding\");let h={label:A(\"dialog.display_entity.override_glow_color.title\"),tooltip:A(\"dialog.display_entity.override_glow_color.description\"),defaultValue:wt.prototype.overrideGlowColor};t[10]!==void 0&&(h.checked=t[10]),l=new mi({props:h}),Te.push(()=>Be(l,\"checked\",_));let v=t[2]&&NO(t);return{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),v&&v.c(),u=_t()},m(b,y){Ae(e,b,y),U(b,i,y),Ae(a,b,y),U(b,o,y),Ae(l,b,y),U(b,d,y),v&&v.m(b,y),U(b,u,y),p=!0},p(b,y){let w={};!n&&y[0]&256&&(n=!0,w.checked=b[8],Me(()=>n=!1)),e.$set(w);let S={};!r&&y[0]&512&&(r=!0,S.checked=b[9],Me(()=>r=!1)),a.$set(S);let F={};!c&&y[0]&1024&&(c=!0,F.checked=b[10],Me(()=>c=!1)),l.$set(F),b[2]?v?(v.p(b,y),y[0]&4&&ae(v,1)):(v=NO(b),v.c(),ae(v,1),v.m(u.parentNode,u)):v&&(Sn(),de(v,1,1,()=>{v=null}),On())},i(b){p||(ae(e.$$.fragment,b),ae(a.$$.fragment,b),ae(l.$$.fragment,b),ae(v),p=!0)},o(b){de(e.$$.fragment,b),de(a.$$.fragment,b),de(l.$$.fragment,b),de(v),p=!1},d(b){je(e,b),b&&z(i),je(a,b),b&&z(o),je(l,b),b&&z(d),v&&v.d(b),b&&z(u)}}}s(FO,\"create_if_block\");function NO(t){let e,n,i;function a(o){t[36](o)}s(a,\"colorpicker_value_binding\");let r={label:A(\"dialog.display_entity.glow_color.title\"),tooltip:A(\"dialog.display_entity.glow_color.description\")};return t[11]!==void 0&&(r.value=t[11]),e=new IO({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2048&&(n=!0,c.value=o[11],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(NO,\"create_if_block_1\");function lwe(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W;e=new ts({props:{label:A(\"dialog.display_entity.node_options.title\")}});function ee(te){t[28](te)}s(ee,\"codeinput0_value_binding\");let Z={label:A(\"dialog.display_entity.on_summon_function.title\"),tooltip:A(\"dialog.display_entity.on_summon_function.description\"),defaultValue:\"\"};t[0]!==void 0&&(Z.value=t[0]),i=new ka({props:Z}),Te.push(()=>Be(i,\"value\",ee)),o=new ts({props:{label:A(\"dialog.display_entity.per_variant_options.title\")}});function me(te){t[29](te)}s(me,\"codeinput1_value_binding\");let X={label:A(\"dialog.display_entity.on_apply_function.title\"),tooltip:A(\"dialog.display_entity.on_apply_function.description\"),defaultValue:\"\"};t[4]!==void 0&&(X.value=t[4]),f=new ka({props:X}),Te.push(()=>Be(f,\"value\",me));function Q(te){t[30](te)}s(Q,\"select_value_binding\");let he={label:A(\"dialog.display_entity.billboard.title\"),tooltip:A(\"dialog.display_entity.billboard.description\"),options:cwe,defaultOption:wt.prototype.billboard};t[5]!==void 0&&(he.value=t[5]),_=new es({props:he}),Te.push(()=>Be(_,\"value\",Q));function Ie(te){t[31](te)}s(Ie,\"checkbox_checked_binding\");let le={label:A(\"dialog.display_entity.override_brightness.title\"),tooltip:A(\"dialog.display_entity.override_brightness.description\"),defaultValue:wt.prototype.overrideBrightness};t[6]!==void 0&&(le.checked=t[6]),b=new mi({props:le}),Te.push(()=>Be(b,\"checked\",Ie));let ge=t[3]&&DO(t),V=!(t[1]instanceof ve)&&FO(t);function H(te){t[37](te)}s(H,\"numberslider0_value_binding\");let re={label:A(\"dialog.display_entity.shadow_radius.title\"),tooltip:A(\"dialog.display_entity.shadow_radius.description\"),defaultValue:wt.prototype.shadowRadius,min:0,max:15};t[12]!==void 0&&(re.value=t[12]),N=new Mr({props:re}),Te.push(()=>Be(N,\"value\",H));function xe(te){t[38](te)}s(xe,\"numberslider1_value_binding\");let fe={label:A(\"dialog.display_entity.shadow_strength.title\"),tooltip:A(\"dialog.display_entity.shadow_strength.description\"),defaultValue:wt.prototype.shadowStrength,min:0,max:15};return t[13]!==void 0&&(fe.value=t[13]),D=new Mr({props:fe}),Te.push(()=>Be(D,\"value\",xe)),{c(){Ce(e.$$.fragment),n=J(),Ce(i.$$.fragment),r=J(),Ce(o.$$.fragment),l=J(),c=L(\"div\"),u=J(),p=L(\"hr\"),m=J(),Ce(f.$$.fragment),x=J(),Ce(_.$$.fragment),v=J(),Ce(b.$$.fragment),w=J(),ge&&ge.c(),S=J(),V&&V.c(),F=J(),Ce(N.$$.fragment),R=J(),Ce(D.$$.fragment),E(c,\"class\",\"variant-select svelte-11baq0x\")},m(te,Y){Ae(e,te,Y),U(te,n,Y),Ae(i,te,Y),U(te,r,Y),Ae(o,te,Y),U(te,l,Y),U(te,c,Y),U(te,u,Y),U(te,p,Y),U(te,m,Y),Ae(f,te,Y),U(te,x,Y),Ae(_,te,Y),U(te,v,Y),Ae(b,te,Y),U(te,w,Y),ge&&ge.m(te,Y),U(te,S,Y),V&&V.m(te,Y),U(te,F,Y),Ae(N,te,Y),U(te,R,Y),Ae(D,te,Y),q=!0,G||(W=bn(d=t[16].call(null,c)),G=!0)},p(te,Y){let we={};!a&&Y[0]&1&&(a=!0,we.value=te[0],Me(()=>a=!1)),i.$set(we);let Le={};!g&&Y[0]&16&&(g=!0,Le.value=te[4],Me(()=>g=!1)),f.$set(Le);let Tt={};!h&&Y[0]&32&&(h=!0,Tt.value=te[5],Me(()=>h=!1)),_.$set(Tt);let tn={};!y&&Y[0]&64&&(y=!0,tn.checked=te[6],Me(()=>y=!1)),b.$set(tn),te[3]?ge?(ge.p(te,Y),Y[0]&8&&ae(ge,1)):(ge=DO(te),ge.c(),ae(ge,1),ge.m(S.parentNode,S)):ge&&(Sn(),de(ge,1,1,()=>{ge=null}),On()),te[1]instanceof ve?V&&(Sn(),de(V,1,1,()=>{V=null}),On()):V?(V.p(te,Y),Y[0]&2&&ae(V,1)):(V=FO(te),V.c(),ae(V,1),V.m(F.parentNode,F));let kn={};!k&&Y[0]&4096&&(k=!0,kn.value=te[12],Me(()=>k=!1)),N.$set(kn);let Rn={};!B&&Y[0]&8192&&(B=!0,Rn.value=te[13],Me(()=>B=!1)),D.$set(Rn)},i(te){q||(ae(e.$$.fragment,te),ae(i.$$.fragment,te),ae(o.$$.fragment,te),ae(f.$$.fragment,te),ae(_.$$.fragment,te),ae(b.$$.fragment,te),ae(ge),ae(V),ae(N.$$.fragment,te),ae(D.$$.fragment,te),q=!0)},o(te){de(e.$$.fragment,te),de(i.$$.fragment,te),de(o.$$.fragment,te),de(f.$$.fragment,te),de(_.$$.fragment,te),de(b.$$.fragment,te),de(ge),de(V),de(N.$$.fragment,te),de(D.$$.fragment,te),q=!1},d(te){je(e,te),te&&z(n),je(i,te),te&&z(r),je(o,te),te&&z(l),te&&z(c),te&&z(u),te&&z(p),te&&z(m),je(f,te),te&&z(x),je(_,te),te&&z(v),je(b,te),te&&z(w),ge&&ge.d(te),te&&z(S),V&&V.d(te),te&&z(F),je(N,te),te&&z(R),je(D,te),G=!1,W()}}}s(lwe,\"create_fragment\");var cwe={fixed:A(\"dialog.display_entity.billboard.options.fixed\"),vertical:A(\"dialog.display_entity.billboard.options.vertical\"),horizontal:A(\"dialog.display_entity.billboard.options.horizontal\"),center:A(\"dialog.display_entity.billboard.options.center\")},lr=wt.getDefault();function uwe(t,e,n){let i,a,r=ie,o=s(()=>(r(),r=rt(we,Ne=>n(19,a=Ne)),we),\"$$subscribe_shadowStrength\"),l,c=ie,d=s(()=>(c(),c=rt(Y,Ne=>n(20,l=Ne)),Y),\"$$subscribe_shadowRadius\"),u,p,m=ie,f=s(()=>(m(),m=rt(fe,Ne=>n(22,p=Ne)),fe),\"$$subscribe_glowColor\"),g,x=ie,_=s(()=>(x(),x=rt(xe,Ne=>n(2,g=Ne)),xe),\"$$subscribe_overrideGlowColor\"),h,v=ie,b=s(()=>(v(),v=rt(re,Ne=>n(23,h=Ne)),re),\"$$subscribe_glowing\"),y,w=ie,S=s(()=>(w(),w=rt(H,Ne=>n(24,y=Ne)),H),\"$$subscribe_enchanted\"),F,N=ie,k=s(()=>(N(),N=rt(V,Ne=>n(25,F=Ne)),V),\"$$subscribe_brightnessOverride\"),R,D=ie,B=s(()=>(D(),D=rt(ge,Ne=>n(3,R=Ne)),ge),\"$$subscribe_overrideBrightness\"),q,G=ie,W=s(()=>(G(),G=rt(le,Ne=>n(26,q=Ne)),le),\"$$subscribe_billboard\"),ee,Z=ie,me=s(()=>(Z(),Z=rt(Ie,Ne=>n(27,ee=Ne)),Ie),\"$$subscribe_onApplyFunction\");t.$$.on_destroy.push(()=>r()),t.$$.on_destroy.push(()=>c()),t.$$.on_destroy.push(()=>m()),t.$$.on_destroy.push(()=>x()),t.$$.on_destroy.push(()=>v()),t.$$.on_destroy.push(()=>w()),t.$$.on_destroy.push(()=>N()),t.$$.on_destroy.push(()=>D()),t.$$.on_destroy.push(()=>G()),t.$$.on_destroy.push(()=>Z());let{displayEntity:X}=e,{onSummonFunction:Q}=e,{configs:he}=e,Ie=new ke(lr.onApplyFunction);me();let le=new ke(lr.billboard);W();let ge=new ke(lr.overrideBrightness);B();let V=new ke(lr.brightnessOverride);k();let H=new ke(lr.enchanted);S();let re=new ke(lr.glowing);b();let xe=new ke(lr.overrideGlowColor);_();let fe=new ke(lr.glowColor);f();let te=new ke(lr.invisible);Pa(t,te,Ne=>n(21,u=Ne));let Y=new ke(lr.shadowRadius);d();let we=new ke(lr.shadowStrength);o();let Le,Tt=s(Ne=>{let Un=qe.getByUUID(Ne);if(!Un){console.error(`Variant with UUID ${Ne} not found`);return}Un.isDefault?Le=wt.fromJSON(he.default):Le=wt.fromJSON(he.variants[Un.uuid]??{}),Jt(Ie,ee=Le.onApplyFunction,ee),Jt(le,q=Le.billboard,q),Jt(ge,R=Le.overrideBrightness,R),Jt(V,F=Le.brightnessOverride,F),Jt(H,y=Le.enchanted,y),Jt(re,h=Le.glowing,h),Jt(xe,g=Le.overrideGlowColor,g),Jt(fe,p=Le.glowColor,p),Jt(te,u=Le.invisible,u),Jt(Y,l=Le.shadowRadius,l),Jt(we,a=Le.shadowStrength,a)},\"loadConfig\"),tn=s(Ne=>{let Un=qe.getByUUID(Ne);if(!Un){console.error(`Variant with UUID ${Ne} not found`);return}Un.isDefault?n(17,he.default=Le.toJSON(),he):n(17,he.variants[Un.uuid]=Le.toJSON(),he)},\"saveConfig\"),kn=Object.fromEntries(qe.all.map(Ne=>[Ne.uuid,Ne.displayName])),Rn=new ke(qe.getDefault().uuid);Pa(t,Rn,Ne=>n(18,i=Ne));let ii=new Interface.CustomElements.SelectInput(\"animated-java:display-entity-variant-select\",{options:kn,value:i,onChange(Ne){Jt(Rn,i=Ne,i)}}),Ft=Rn.subscribe(Ne=>{ii.set(Ne)}),$t=s(Ne=>{Ne.appendChild(ii.node)},\"mountVariantSelect\");Zi(()=>{Ft()});function ai(Ne){Q=Ne,n(0,Q)}s(ai,\"codeinput0_value_binding\");function cr(Ne){Ie=Ne,me(n(4,Ie))}s(cr,\"codeinput1_value_binding\");function Fa(Ne){le=Ne,W(n(5,le))}s(Fa,\"select_value_binding\");function Na(Ne){ge=Ne,B(n(6,ge))}s(Na,\"checkbox_checked_binding\");function Ra(Ne){V=Ne,k(n(7,V))}s(Ra,\"numberslider_value_binding\");function ur(Ne){H=Ne,S(n(8,H))}s(ur,\"checkbox0_checked_binding\");function Fi(Ne){re=Ne,b(n(9,re))}s(Fi,\"checkbox1_checked_binding\");function Gr(Ne){xe=Ne,_(n(10,xe))}s(Gr,\"checkbox2_checked_binding\");function Ma(Ne){fe=Ne,f(n(11,fe))}s(Ma,\"colorpicker_value_binding\");function Wr(Ne){Y=Ne,d(n(12,Y))}s(Wr,\"numberslider0_value_binding\");function Wi(Ne){we=Ne,o(n(13,we))}return s(Wi,\"numberslider1_value_binding\"),t.$$set=Ne=>{\"displayEntity\"in Ne&&n(1,X=Ne.displayEntity),\"onSummonFunction\"in Ne&&n(0,Q=Ne.onSummonFunction),\"configs\"in Ne&&n(17,he=Ne.configs)},t.$$.update=()=>{if(t.$$.dirty[0]&262144)e:Tt(i);if(t.$$.dirty[0]&268173324)e:Le.onApplyFunction=ee,Le.billboard=q,Le.overrideBrightness=R,Le.brightnessOverride=F,Le.enchanted=y,Le.glowing=h,Le.overrideGlowColor=g,Le.glowColor=p,Le.invisible=u,Le.shadowRadius=l,Le.shadowStrength=a,tn(i)},[Q,X,g,R,Ie,le,ge,V,H,re,xe,fe,Y,we,te,Rn,$t,he,i,a,l,u,p,h,y,F,q,ee,ai,cr,Fa,Na,Ra,ur,Fi,Gr,Ma,Wr,Wi]}s(uwe,\"instance\");var Gh=class extends Pe{constructor(e){super(),Ve(this,e,uwe,lwe,De,{displayEntity:1,onSummonFunction:0,configs:17},null,[-1,-1])}};s(Gh,\"DisplayEntityConfigDialog\");var RO=Gh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".variant-select.svelte-11baq0x{margin:0px 32px 8px 24px}.variant-select.svelte-11baq0x bb-select{width:100%}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Ob(t){return t instanceof Group||t instanceof ve||t instanceof We||t instanceof $e}s(Ob,\"isDisplayEntity\");function dwe(t){let e=new ke(t.onSummonFunction??\"\"),n=structuredClone(t.configs);new cn({id:\"animated-java:displayEntityConfig\",title:A(\"dialog.display_entity.title\",t.name),width:600,content:{component:RO,props:{displayEntity:t,onSummonFunction:e,configs:n}},preventKeybinds:!0,onConfirm(){console.log(\"Saving display entity config for\",t.name,n),t.onSummonFunction=e.get().trim(),t.configs=n,Project.saved=!1}}).show()}s(dwe,\"openDisplayEntityConfigDialog\");var dl=null,pwe=nn({id:\"animated-java:action/copy-display-entity-config\"},{icon:\"content_copy\",name:A(\"action.copy_display_entity_config.name\"),click:()=>{let t=Group.first_selected??selected.at(0);Ob(t)?(dl={sourceName:t.name,onSummonFunction:t.onSummonFunction??\"\",configs:structuredClone(t.configs)},Blockbench.showQuickMessage(A(\"action.copy_display_entity_config.message\",dl.sourceName))):console.error(\"Attempted to copy display entity config with no display entity selected\")}}),mwe=nn({id:\"animated-java:action/paste-display-entity-config\"},{icon:\"content_paste\",name:A(\"action.paste_display_entity_config.name\"),condition:()=>!!dl&&Fe(),click:()=>{if(!dl)return;let t=Group.first_selected??selected.at(0);if(Ob(t)){t instanceof Group?Undo.initEdit({group:t}):Undo.initEdit({elements:[t]}),t.onSummonFunction=dl.onSummonFunction,t.configs=structuredClone(dl.configs);let e=A(\"action.paste_display_entity_config.message\",dl.sourceName);t instanceof Group?Undo.finishEdit(e,{group:t}):Undo.finishEdit(e,{elements:[t]}),Blockbench.showQuickMessage(e)}else console.error(\"Attempted to paste display entity config with no display entity selected\")}}),fwe=nn({id:\"animated-java:action/open-display-entity-config\",dependencies:[\"animated-java:action/copy-display-entity-config\",\"animated-java:action/paste-display-entity-config\"]},{icon:\"settings\",name:A(\"action.open_display_entity_config.name\"),condition:Fe,click:()=>{let t=Group.first_selected??selected.at(0);Ob(t)?dwe(t):console.error(\"Attempted to open display entity config dialog with no display entity selected\")}});fwe.onCreated(t=>{let e=pwe.get();if(!e){console.error(\"Copy display entity config action not registered\");return}let n=mwe.get();if(!n){console.error(\"Paste display entity config action not registered\");return}Group.prototype.menu.structure.splice(6,0,\"_\"),Group.prototype.menu.addAction(t,7),Group.prototype.menu.addAction(e,8),Group.prototype.menu.addAction(n,9);let i=new Menu([...Outliner.control_menu_group,\"_\",t,e,n,\"_\",\"rename\",\"delete\"]);ve.prototype.menu=i,We.prototype.menu=i,$e.prototype.menu=i});function MO(t,e,n){let i=t.slice();return i[14]=e[n],i}s(MO,\"get_each_context\");function hwe(t){let e,n,i,a,r,o,l;function c(f){t[8](f)}s(c,\"checkbox_checked_binding\");let d={label:A(\"dialog.locator_config.use_entity.title\"),tooltip:A(\"dialog.locator_config.use_entity.description\"),defaultValue:!1};t[0]!==void 0&&(d.checked=t[0]),e=new mi({props:d}),Te.push(()=>Be(e,\"checked\",c));let u=t[6]&&BO(t);function p(f){t[13](f)}s(p,\"codeinput_value_binding\");let m={label:A(\"dialog.locator_config.on_tick_function.title\"),tooltip:t[6]?A(\"dialog.locator_config.on_tick_function.description_with_use_entity\"):A(\"dialog.locator_config.on_tick_function.description\"),defaultValue:\"\"};return t[5]!==void 0&&(m.value=t[5]),r=new ka({props:m}),Te.push(()=>Be(r,\"value\",p)),{c(){Ce(e.$$.fragment),i=J(),u&&u.c(),a=J(),Ce(r.$$.fragment)},m(f,g){Ae(e,f,g),U(f,i,g),u&&u.m(f,g),U(f,a,g),Ae(r,f,g),l=!0},p(f,g){let x={};!n&&g&1&&(n=!0,x.checked=f[0],Me(()=>n=!1)),e.$set(x),f[6]?u?(u.p(f,g),g&64&&ae(u,1)):(u=BO(f),u.c(),ae(u,1),u.m(a.parentNode,a)):u&&(Sn(),de(u,1,1,()=>{u=null}),On());let _={};g&64&&(_.tooltip=f[6]?A(\"dialog.locator_config.on_tick_function.description_with_use_entity\"):A(\"dialog.locator_config.on_tick_function.description\")),!o&&g&32&&(o=!0,_.value=f[5],Me(()=>o=!1)),r.$set(_)},i(f){l||(ae(e.$$.fragment,f),ae(u),ae(r.$$.fragment,f),l=!0)},o(f){de(e.$$.fragment,f),de(u),de(r.$$.fragment,f),l=!1},d(f){je(e,f),f&&z(i),u&&u.d(f),f&&z(a),je(r,f)}}}s(hwe,\"create_else_block\");function gwe(t){let e,n=A(\"dialog.locator_config.plugin_mode_warning\").split(`\n`),i=[];for(let a=0;a<n.length;a+=1)i[a]=PO(MO(t,n,a));return{c(){for(let a=0;a<i.length;a+=1)i[a].c();e=_t()},m(a,r){for(let o=0;o<i.length;o+=1)i[o]&&i[o].m(a,r);U(a,e,r)},p(a,r){if(r&0){n=A(\"dialog.locator_config.plugin_mode_warning\").split(`\n`);let o;for(o=0;o<n.length;o+=1){let l=MO(a,n,o);i[o]?i[o].p(l,r):(i[o]=PO(l),i[o].c(),i[o].m(e.parentNode,e))}for(;o<i.length;o+=1)i[o].d(1);i.length=n.length}},i:ie,o:ie,d(a){Wn(i,a),a&&z(e)}}}s(gwe,\"create_if_block\");function BO(t){let e,n,i,a,r,o,l,c,d,u,p,m;function f(w){t[9](w)}s(f,\"lineinput_value_binding\");let g={label:A(\"dialog.locator_config.entity_type.title\"),tooltip:A(\"dialog.locator_config.entity_type.description\"),valueChecker:xwe,defaultValue:\"minecraft:item_display\"};t[1]!==void 0&&(g.value=t[1]),e=new aa({props:g}),Te.push(()=>Be(e,\"value\",f));function x(w){t[10](w)}s(x,\"checkbox_checked_binding_1\");let _={label:A(\"dialog.locator_config.sync_passenger_rotation.title\"),tooltip:A(\"dialog.locator_config.sync_passenger_rotation.description\"),defaultValue:!1};t[2]!==void 0&&(_.checked=t[2]),a=new mi({props:_}),Te.push(()=>Be(a,\"checked\",x));function h(w){t[11](w)}s(h,\"codeinput0_value_binding\");let v={label:A(\"dialog.locator_config.on_summon_function.title\"),tooltip:t[6]?A(\"dialog.locator_config.on_summon_function.description_with_use_entity\"):A(\"dialog.locator_config.on_summon_function.description\"),defaultValue:\"\"};t[3]!==void 0&&(v.value=t[3]),l=new ka({props:v}),Te.push(()=>Be(l,\"value\",h));function b(w){t[12](w)}s(b,\"codeinput1_value_binding\");let y={label:A(\"dialog.locator_config.on_remove_function.title\"),tooltip:t[6]?A(\"dialog.locator_config.on_remove_function.description_with_use_entity\"):A(\"dialog.locator_config.on_remove_function.description\"),defaultValue:\"\"};return t[4]!==void 0&&(y.value=t[4]),u=new ka({props:y}),Te.push(()=>Be(u,\"value\",b)),{c(){Ce(e.$$.fragment),i=J(),Ce(a.$$.fragment),o=J(),Ce(l.$$.fragment),d=J(),Ce(u.$$.fragment)},m(w,S){Ae(e,w,S),U(w,i,S),Ae(a,w,S),U(w,o,S),Ae(l,w,S),U(w,d,S),Ae(u,w,S),m=!0},p(w,S){let F={};!n&&S&2&&(n=!0,F.value=w[1],Me(()=>n=!1)),e.$set(F);let N={};!r&&S&4&&(r=!0,N.checked=w[2],Me(()=>r=!1)),a.$set(N);let k={};S&64&&(k.tooltip=w[6]?A(\"dialog.locator_config.on_summon_function.description_with_use_entity\"):A(\"dialog.locator_config.on_summon_function.description\")),!c&&S&8&&(c=!0,k.value=w[3],Me(()=>c=!1)),l.$set(k);let R={};S&64&&(R.tooltip=w[6]?A(\"dialog.locator_config.on_remove_function.description_with_use_entity\"):A(\"dialog.locator_config.on_remove_function.description\")),!p&&S&16&&(p=!0,R.value=w[4],Me(()=>p=!1)),u.$set(R)},i(w){m||(ae(e.$$.fragment,w),ae(a.$$.fragment,w),ae(l.$$.fragment,w),ae(u.$$.fragment,w),m=!0)},o(w){de(e.$$.fragment,w),de(a.$$.fragment,w),de(l.$$.fragment,w),de(u.$$.fragment,w),m=!1},d(w){je(e,w),w&&z(i),je(a,w),w&&z(o),je(l,w),w&&z(d),je(u,w)}}}s(BO,\"create_if_block_1\");function PO(t){let e,n=t[14]+\"\",i;return{c(){e=L(\"p\"),i=Re(n)},m(a,r){U(a,e,r),I(e,i)},p:ie,d(a){a&&z(e)}}}s(PO,\"create_each_block\");function _we(t){let e,n,i,a,r=[gwe,hwe],o=[];function l(c,d){return c[7]?0:1}return s(l,\"select_block_type\"),n=l(t,-1),i=o[n]=r[n](t),{c(){e=L(\"div\"),i.c()},m(c,d){U(c,e,d),o[n].m(e,null),a=!0},p(c,[d]){i.p(c,d)},i(c){a||(ae(i),a=!0)},o(c){de(i),a=!1},d(c){c&&z(e),o[n].d()}}}s(_we,\"create_fragment\");var xwe=s(t=>t.length===0?{type:\"error\",message:A(\"dialog.locator_config.entity_type.error.empty\")}:Xn.entity_type?.has(t)||Xn.entity_type?.has(t.replace(/^minecraft\\:/,\"\"))?{type:\"success\",message:\"\"}:{type:\"warning\",message:A(\"dialog.locator_config.entity_type.warning.invalid\")},\"entityTypeValidator\");function vwe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(l,b=>n(6,i=b)),l),\"$$subscribe_useEntity\");t.$$.on_destroy.push(()=>a());let o=!!Project?.animated_java?.enable_plugin_mode,{useEntity:l}=e;r();let{entityType:c}=e,{syncPassengerRotation:d}=e,{onSummonFunction:u}=e,{onRemoveFunction:p}=e,{onTickFunction:m}=e;function f(b){l=b,r(n(0,l))}s(f,\"checkbox_checked_binding\");function g(b){c=b,n(1,c)}s(g,\"lineinput_value_binding\");function x(b){d=b,n(2,d)}s(x,\"checkbox_checked_binding_1\");function _(b){u=b,n(3,u)}s(_,\"codeinput0_value_binding\");function h(b){p=b,n(4,p)}s(h,\"codeinput1_value_binding\");function v(b){m=b,n(5,m)}return s(v,\"codeinput_value_binding\"),t.$$set=b=>{\"useEntity\"in b&&r(n(0,l=b.useEntity)),\"entityType\"in b&&n(1,c=b.entityType),\"syncPassengerRotation\"in b&&n(2,d=b.syncPassengerRotation),\"onSummonFunction\"in b&&n(3,u=b.onSummonFunction),\"onRemoveFunction\"in b&&n(4,p=b.onRemoveFunction),\"onTickFunction\"in b&&n(5,m=b.onTickFunction)},[l,c,d,u,p,m,i,o,f,g,x,_,h,v]}s(vwe,\"instance\");var Wh=class extends Pe{constructor(e){super(),Ve(this,e,vwe,_we,De,{useEntity:0,entityType:1,syncPassengerRotation:2,onSummonFunction:3,onRemoveFunction:4,onTickFunction:5})}};s(Wh,\"LocatorConfigDialog\");var LO=Wh;function bwe(t){let e=Nr.fromJSON(t.config??=new Nr().toJSON()),n=new ke(e.useEntity),i=new ke(e.entityType),a=new ke(e.syncPassengerRotation),r=new ke(e.onSummonFunction),o=new ke(e.onRemoveFunction),l=new ke(e.onTickFunction);new cn({id:`${Ke.name}:locatorConfig`,title:A(\"dialog.locator_config.title\"),width:600,content:{component:LO,props:{useEntity:n,entityType:i,syncPassengerRotation:a,onSummonFunction:r,onRemoveFunction:o,onTickFunction:l}},preventKeybinds:!0,onConfirm(){e.useEntity=n.get(),e.entityType=i.get(),e.syncPassengerRotation=a.get(),e.onSummonFunction=r.get(),e.onRemoveFunction=o.get(),e.onTickFunction=l.get(),t.config=e.toJSON()}}).show()}s(bwe,\"openLocatorConfigDialog\");var ywe=nn({id:\"animated-java:locator-config\"},{icon:\"settings\",name:A(\"action.open_locator_config.name\"),condition:Fe,click:()=>{let t=Locator.selected.at(0);t&&bwe(t)}});ywe.onCreated(t=>{Locator.prototype.menu.addAction(t,\"6\")});var VO=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAA0SURBVHgB7ZKhDQBACAOPF7//vBgIC9RgCKH2khNtzYlA5GMK82jmBBMENbL8gWt8Je4QJCfXBhajwtfNAAAAAElFTkSuQmCC\";function zO(t,e,n){let i=t.slice();return i[31]=e[n],i}s(zO,\"get_each_context\");function UO(t,e,n){let i=t.slice();return i[34]=e[n],i}s(UO,\"get_each_context_1\");function qO(t,e,n){let i=t.slice();return i[34]=e[n],i}s(qO,\"get_each_context_2\");function Ewe(t){let e,n,i;function a(o){t[21](o)}s(a,\"lineinput_value_binding_2\");let r={label:A(\"dialog.variant_config.variant_name\"),tooltip:A(\"dialog.variant_config.variant_name.description\"),defaultValue:\"new_variant\"};return t[1]!==void 0&&(r.value=t[1]),e=new aa({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2&&(n=!0,c.value=o[1],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(Ewe,\"create_else_block_1\");function kwe(t){let e,n,i;function a(o){t[20](o)}s(a,\"lineinput_value_binding_1\");let r={label:A(\"dialog.variant_config.variant_name\"),tooltip:A(\"dialog.variant_config.variant_name.description\"),disabled:!0,defaultValue:\"new_variant\"};return t[1]!==void 0&&(r.value=t[1]),e=new aa({props:r}),Te.push(()=>Be(e,\"value\",a)),{c(){Ce(e.$$.fragment)},m(o,l){Ae(e,o,l),i=!0},p(o,l){let c={};!n&&l[0]&2&&(n=!0,c.value=o[1],Me(()=>n=!1)),e.$set(c)},i(o){i||(ae(e.$$.fragment,o),i=!0)},o(o){de(e.$$.fragment,o),i=!1},d(o){je(e,o)}}}s(kwe,\"create_if_block_1\");function HO(t){let e,n,i,a,r=[kwe,Ewe],o=[];function l(c,d){return c[8]?0:1}return s(l,\"select_block_type\"),e=l(t,[-1,-1]),n=o[e]=r[e](t),{c(){n.c(),i=_t()},m(c,d){o[e].m(c,d),U(c,i,d),a=!0},p(c,d){let u=e;e=l(c,d),e===u?o[e].p(c,d):(Sn(),de(o[u],1,1,()=>{o[u]=null}),On(),n=o[e],n?n.p(c,d):(n=o[e]=r[e](c),n.c()),ae(n,1),n.m(i.parentNode,i))},i(c){a||(ae(n),a=!0)},o(c){de(n),a=!1},d(c){o[e].d(c),c&&z(i)}}}s(HO,\"create_key_block_1\");function JO(t){let e,n,i,a,r,o,l,c,d,u=t[7],p,m,f=A(\"dialog.variant_config.texture_map.description\")+\"\",g,x,_,h,v,b,y=XO(t);function w(F){t[27](F)}s(w,\"collection_includedItems_binding\");let S={label:A(\"dialog.variant_config.excluded_nodes.title\"),tooltip:A(\"dialog.variant_config.bone_lists.description\"),availableItemsColumnLable:A(\"dialog.variant_config.included_nodes.title\"),availableItemsColumnTooltip:A(\"dialog.variant_config.included_nodes.description\"),includedItemsColumnLable:A(\"dialog.variant_config.excluded_nodes.title\"),includedItemsColumnTooltip:A(\"dialog.variant_config.excluded_nodes.description\"),swapColumnsButtonTooltip:A(\"dialog.variant_config.swap_columns_button.tooltip\"),availableItems:t[13]};return t[3]!==void 0&&(S.includedItems=t[3]),x=new qh({props:S}),Te.push(()=>Be(x,\"includedItems\",w)),{c(){e=L(\"div\"),n=L(\"div\"),n.textContent=`${A(\"dialog.variant_config.texture_map.title\")}`,i=J(),a=L(\"div\"),r=J(),o=L(\"div\"),l=L(\"i\"),l.textContent=\"add\",d=J(),y.c(),p=J(),m=L(\"div\"),g=J(),Ce(x.$$.fragment),E(a,\"class\",\"spacer svelte-ihnqu8\"),E(l,\"class\",\"material-icons icon\"),E(o,\"class\",\"tool\"),E(o,\"title\",c=A(\"dialog.variant_config.texture_map.create_new_mapping\")),E(e,\"class\",\"toolbar svelte-ihnqu8\"),Xe(e,\"margin\",\"8px 0\"),E(m,\"class\",\"texture-map-description svelte-ihnqu8\")},m(F,N){U(F,e,N),I(e,n),I(e,i),I(e,a),I(e,r),I(e,o),I(o,l),U(F,d,N),y.m(F,N),U(F,p,N),U(F,m,N),m.innerHTML=f,U(F,g,N),Ae(x,F,N),h=!0,v||(b=Ue(o,\"click\",t[23]),v=!0)},p(F,N){N[0]&128&&De(u,u=F[7])?(y.d(1),y=XO(F),y.c(),y.m(p.parentNode,p)):y.p(F,N);let k={};!_&&N[0]&8&&(_=!0,k.includedItems=F[3],Me(()=>_=!1)),x.$set(k)},i(F){h||(ae(x.$$.fragment,F),h=!0)},o(F){de(x.$$.fragment,F),h=!1},d(F){F&&z(e),F&&z(d),y.d(F),F&&z(p),F&&z(m),F&&z(g),je(x,F),v=!1,b()}}}s(JO,\"create_if_block\");function GO(t){let e;return{c(){e=L(\"div\"),e.textContent=`${A(\"dialog.variant_config.texture_map.no_mappings\")} \n\t\t\t\t\t`,E(e,\"class\",\"no-mappings svelte-ihnqu8\")},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(GO,\"create_else_block\");function WO(t){let e,n=t[34].name+\"\",i,a,r,o;return{c(){e=L(\"option\"),i=Re(n),a=J(),e.selected=r=t[34].uuid===t[31][0],e.__value=o=`\\r\n\t\t\t\t\t\t\t\t\t\t`+t[34].name+`\\r\n\t\t\t\t\t\t\t\t\t`,e.value=e.__value},m(l,c){U(l,e,c),I(e,i),I(e,a)},p(l,c){c[0]&64&&r!==(r=l[34].uuid===l[31][0])&&(e.selected=r)},d(l){l&&z(e)}}}s(WO,\"create_each_block_2\");function KO(t){let e,n=t[34].name+\"\",i,a,r,o;return{c(){e=L(\"option\"),i=Re(n),a=J(),e.selected=r=t[34].uuid===t[31][1],e.__value=o=`\\r\n\t\t\t\t\t\t\t\t\t\t`+t[34].name+`\\r\n\t\t\t\t\t\t\t\t\t`,e.value=e.__value},m(l,c){U(l,e,c),I(e,i),I(e,a)},p(l,c){c[0]&64&&r!==(r=l[34].uuid===l[31][1])&&(e.selected=r)},d(l){l&&z(e)}}}s(KO,\"create_each_block_1\");function YO(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N=t[11],k=[];for(let W=0;W<N.length;W+=1)k[W]=WO(qO(t,N,W));function R(...W){return t[24](t[31],...W)}s(R,\"change_handler\");let D=t[12],B=[];for(let W=0;W<D.length;W+=1)B[W]=KO(UO(t,D,W));function q(...W){return t[25](t[31],...W)}s(q,\"change_handler_1\");function G(){return t[26](t[31])}return s(G,\"click_handler_1\"),{c(){e=L(\"div\"),n=J(),i=L(\"li\"),a=L(\"div\"),r=L(\"div\"),o=L(\"img\"),c=J(),d=L(\"select\");for(let W=0;W<k.length;W+=1)k[W].c();u=J(),p=L(\"i\"),p.textContent=\"east\",m=J(),f=L(\"div\"),g=L(\"div\"),x=L(\"img\"),h=J(),v=L(\"select\");for(let W=0;W<B.length;W+=1)B[W].c();b=J(),y=L(\"i\"),y.textContent=\"delete\",w=J(),E(e,\"class\",\"texture-mapping-item svelte-ihnqu8\"),Ht(o.src,l=t[16](t[31][0]))||E(o,\"src\",l),E(o,\"alt\",\"\"),E(o,\"class\",\"svelte-ihnqu8\"),E(r,\"class\",\"img-container svelte-ihnqu8\"),E(d,\"class\",\"texture-mapping-item-dropdown svelte-ihnqu8\"),E(a,\"class\",\"texture-mapping-item-dropdown-container svelte-ihnqu8\"),E(p,\"class\",\"material-icons icon\"),Ht(x.src,_=t[16](t[31][1]))||E(x,\"src\",_),E(x,\"alt\",\"\"),E(x,\"class\",\"svelte-ihnqu8\"),E(g,\"class\",\"img-container svelte-ihnqu8\"),E(v,\"class\",\"texture-mapping-item-dropdown svelte-ihnqu8\"),E(f,\"class\",\"texture-mapping-item-dropdown-container svelte-ihnqu8\"),E(y,\"class\",\"material-icons icon tool\"),E(i,\"class\",\"texture-mapping-item svelte-ihnqu8\")},m(W,ee){U(W,e,ee),U(W,n,ee),U(W,i,ee),I(i,a),I(a,r),I(r,o),I(a,c),I(a,d);for(let Z=0;Z<k.length;Z+=1)k[Z]&&k[Z].m(d,null);I(i,u),I(i,p),I(i,m),I(i,f),I(f,g),I(g,x),I(f,h),I(f,v);for(let Z=0;Z<B.length;Z+=1)B[Z]&&B[Z].m(v,null);I(i,b),I(i,y),I(i,w),S||(F=[Ue(d,\"change\",R),Ue(v,\"change\",q),Ue(y,\"click\",G)],S=!0)},p(W,ee){if(t=W,ee[0]&64&&!Ht(o.src,l=t[16](t[31][0]))&&E(o,\"src\",l),ee[0]&2112){N=t[11];let Z;for(Z=0;Z<N.length;Z+=1){let me=qO(t,N,Z);k[Z]?k[Z].p(me,ee):(k[Z]=WO(me),k[Z].c(),k[Z].m(d,null))}for(;Z<k.length;Z+=1)k[Z].d(1);k.length=N.length}if(ee[0]&64&&!Ht(x.src,_=t[16](t[31][1]))&&E(x,\"src\",_),ee[0]&4160){D=t[12];let Z;for(Z=0;Z<D.length;Z+=1){let me=UO(t,D,Z);B[Z]?B[Z].p(me,ee):(B[Z]=KO(me),B[Z].c(),B[Z].m(v,null))}for(;Z<B.length;Z+=1)B[Z].d(1);B.length=D.length}},d(W){W&&z(e),W&&z(n),W&&z(i),Wn(k,W),Wn(B,W),S=!1,Rt(F)}}}s(YO,\"create_each_block\");function XO(t){let e,n,i=[...t[6].map.entries()],a=[];for(let o=0;o<i.length;o+=1)a[o]=YO(zO(t,i,o));let r=null;return i.length||(r=GO(t)),{c(){e=L(\"ul\");for(let o=0;o<a.length;o+=1)a[o].c();r&&r.c(),E(e,\"class\",\"texture-map-container svelte-ihnqu8\"),E(e,\"style\",n=[...t[6].map.entries()].length===0?\"min-height: 2rem;\":\"\")},m(o,l){U(o,e,l);for(let c=0;c<a.length;c+=1)a[c]&&a[c].m(e,null);r&&r.m(e,null)},p(o,l){if(l[0]&497728){i=[...o[6].map.entries()];let c;for(c=0;c<i.length;c+=1){let d=zO(o,i,c);a[c]?a[c].p(d,l):(a[c]=YO(d),a[c].c(),a[c].m(e,null))}for(;c<a.length;c+=1)a[c].d(1);a.length=i.length,!i.length&&r?r.p(o,l):i.length?r&&(r.d(1),r=null):(r=GO(o),r.c(),r.m(e,null))}l[0]&64&&n!==(n=[...o[6].map.entries()].length===0?\"min-height: 2rem;\":\"\")&&E(e,\"style\",n)},d(o){o&&z(e),Wn(a,o),r&&r.d()}}}s(XO,\"create_key_block\");function jwe(t){let e,n,i,a,r=t[9],o,l,c,d,u,p,m,f;function g(y){t[19](y)}s(g,\"lineinput_value_binding\");let x={label:A(\"dialog.variant_config.variant_display_name\"),tooltip:A(\"dialog.variant_config.variant_display_name.description\"),defaultValue:\"New Variant\"};t[0]!==void 0&&(x.value=t[0]),n=new aa({props:x}),Te.push(()=>Be(n,\"value\",g));let _=HO(t);function h(y){t[22](y)}s(h,\"checkbox_checked_binding\");let v={label:A(\"dialog.variant_config.generate_name_from_display_name\"),tooltip:A(\"dialog.variant_config.generate_name_from_display_name.description\"),defaultValue:!0};t[2]!==void 0&&(v.checked=t[2]),l=new mi({props:v}),Te.push(()=>Be(l,\"checked\",h));let b=!t[4].isDefault&&JO(t);return{c(){e=L(\"div\"),Ce(n.$$.fragment),a=J(),_.c(),o=J(),Ce(l.$$.fragment),d=J(),b&&b.c(),u=J(),p=L(\"div\"),m=Re(t[10]),E(p,\"class\",\"uuid svelte-ihnqu8\"),E(e,\"class\",\"dialog-container svelte-ihnqu8\")},m(y,w){U(y,e,w),Ae(n,e,null),I(e,a),_.m(e,null),I(e,o),Ae(l,e,null),I(e,d),b&&b.m(e,null),I(e,u),I(e,p),I(p,m),f=!0},p(y,w){let S={};!i&&w[0]&1&&(i=!0,S.value=y[0],Me(()=>i=!1)),n.$set(S),w[0]&512&&De(r,r=y[9])?(Sn(),de(_,1,1,ie),On(),_=HO(y),_.c(),ae(_,1),_.m(e,o)):_.p(y,w);let F={};!c&&w[0]&4&&(c=!0,F.checked=y[2],Me(()=>c=!1)),l.$set(F),y[4].isDefault?b&&(Sn(),de(b,1,1,()=>{b=null}),On()):b?(b.p(y,w),w[0]&16&&ae(b,1)):(b=JO(y),b.c(),ae(b,1),b.m(e,u)),(!f||w[0]&1024)&&ct(m,y[10])},i(y){f||(ae(n.$$.fragment,y),ae(_),ae(l.$$.fragment,y),ae(b),f=!0)},o(y){de(n.$$.fragment,y),de(_),de(l.$$.fragment,y),de(b),f=!1},d(y){y&&z(e),je(n),_.d(y),je(l),b&&b.d()}}}s(jwe,\"create_fragment\");function Awe(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(_,H=>n(28,i=H)),_),\"$$subscribe_displayName\"),o,l=ie,c=s(()=>(l(),l=rt(y,H=>n(8,o=H)),y),\"$$subscribe_generateNameFromDisplayName\"),d,u=ie,p=s(()=>(u(),u=rt(h,H=>n(9,d=H)),h),\"$$subscribe_name\"),m,f=ie,g=s(()=>(f(),f=rt(v,H=>n(10,m=H)),v),\"$$subscribe_uuid\");t.$$.on_destroy.push(()=>a()),t.$$.on_destroy.push(()=>l()),t.$$.on_destroy.push(()=>u()),t.$$.on_destroy.push(()=>f());let{variant:x}=e,{displayName:_}=e;r();let{name:h}=e;p();let{uuid:v}=e;g();let{textureMap:b}=e,{generateNameFromDisplayName:y}=e;c();let{excludedNodes:w}=e,S=[...Texture.all],F=[...Texture.all],N=S,k=Ah(w.get(),{groupsOnly:!0,excludeEmptyGroups:!0}),R=0;_.subscribe(H=>{o&&h.set(qe.makeNameUnique(x,H))}),y.subscribe(H=>{H&&h.set(qe.makeNameUnique(x,i))});function D(){let H=ee()[0];H&&(b.add(H.uuid,H.uuid),n(7,R++,R))}s(D,\"createTextureMapping\");function B(H){b.delete(H),n(7,R++,R)}s(B,\"deleteTextureMapping\");function q(H){let re=S.find(xe=>xe.uuid===H);return re?re.img.src:VO}s(q,\"getTextureSrc\");function G(H,re){let fe=H.target.value.trim(),te=F.find(we=>we.name===fe)?.uuid;if(!te){console.error(`Failed to find new primary texture with the name: ${fe}`);return}let Y=b.get(re);if(!Y){console.error(`Failed to find secondary texture with the uuid: ${re}`);return}b.delete(re),b.add(te,Y),n(7,R++,R)}s(G,\"selectNewPrimaryTexture\");function W(H,re){let fe=H.target.value.trim(),te=N.find(Y=>Y.name===fe)?.uuid;if(!te){console.error(`Failed to find new secondary texture with the name: ${fe}`);return}b.add(re,te),n(7,R++,R)}s(W,\"selectNewSecondaryTexture\");function ee(){let H=[...b.map.keys()];return F.filter(re=>!H.includes(re.uuid))}s(ee,\"getUnusedPrimaryTextures\");function Z(H){_=H,r(n(0,_))}s(Z,\"lineinput_value_binding\");function me(H){h=H,p(n(1,h))}s(me,\"lineinput_value_binding_1\");function X(H){h=H,p(n(1,h))}s(X,\"lineinput_value_binding_2\");function Q(H){y=H,c(n(2,y))}s(Q,\"checkbox_checked_binding\");let he=s(()=>D(),\"click_handler\"),Ie=s((H,re)=>G(re,H[0]),\"change_handler\"),le=s((H,re)=>W(re,H[0]),\"change_handler_1\"),ge=s(H=>B(H[0]),\"click_handler_1\");function V(H){w=H,n(3,w)}return s(V,\"collection_includedItems_binding\"),t.$$set=H=>{\"variant\"in H&&n(4,x=H.variant),\"displayName\"in H&&r(n(0,_=H.displayName)),\"name\"in H&&p(n(1,h=H.name)),\"uuid\"in H&&g(n(5,v=H.uuid)),\"textureMap\"in H&&n(6,b=H.textureMap),\"generateNameFromDisplayName\"in H&&c(n(2,y=H.generateNameFromDisplayName)),\"excludedNodes\"in H&&n(3,w=H.excludedNodes)},[_,h,y,w,x,v,b,R,o,d,m,F,N,k,D,B,q,G,W,Z,me,X,Q,he,Ie,le,ge,V]}s(Awe,\"instance\");var Kh=class extends Pe{constructor(e){super(),Ve(this,e,Awe,jwe,De,{variant:4,displayName:0,name:1,uuid:5,textureMap:6,generateNameFromDisplayName:2,excludedNodes:3},null,[-1,-1])}};s(Kh,\"VariantConfigDialog\");var ZO=Kh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.dialog-container.svelte-ihnqu8{display:flex;flex-direction:column;overflow-y:auto;max-height:75vh}.uuid.svelte-ihnqu8{color:var(--color-subtle_text);font-style:italic;text-align:center;font-size:14px;user-select:all}.no-mappings.svelte-ihnqu8{color:var(--color-subtle_text);font-style:italic;text-align:center}.img-container.svelte-ihnqu8{display:flex;align-items:flex-start;width:128px;height:128px;pointer-events:none;background:repeating-conic-gradient(var(--color-dark) 0% 25%, transparent 0% 50%) 50% /\\r\n\t\t\t16px 16px}img.svelte-ihnqu8{width:128px;pointer-events:none}.texture-mapping-item.svelte-ihnqu8{display:flex;align-items:center;justify-content:space-between}.texture-mapping-item-dropdown-container.svelte-ihnqu8{position:relative;flex-grow:1;height:164px;display:flex;flex-direction:column;align-items:center;justify-content:center}.texture-mapping-item-dropdown.svelte-ihnqu8{display:flex;flex-direction:column;align-items:center;max-width:128px}.texture-map-container.svelte-ihnqu8{display:flex;flex-direction:column;border:1px solid var(--color-border);background-color:var(--color-back);padding:4px;overflow-y:auto;max-height:600px;overflow-y:auto;max-height:16rem;min-height:12rem}.spacer.svelte-ihnqu8{flex-grow:1}.toolbar.svelte-ihnqu8{display:flex;flex-direction:row;align-items:center}.texture-map-description.svelte-ihnqu8{font-size:0.9em;color:var(--color-subtle_text);margin-top:4px;margin-bottom:16px;max-width:80%}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function Yh(t){let e=new ke(t.displayName),n=new ke(t.name),i=new ke(t.uuid),a=t.textureMap.copy(),r=new ke(t.generateNameFromDisplayName),o=new ke(t.excludedNodes);new cn({id:`${Ke.name}:variantConfig`,title:A(\"dialog.variant_config.title\"),width:700,content:{component:ZO,props:{variant:t,displayName:e,name:n,uuid:i,textureMap:a,generateNameFromDisplayName:r,excludedNodes:o}},preventKeybinds:!0,onConfirm(){t.displayName=e.get(),t.name=n.get(),t.uuid=i.get(),t.textureMap=a,t.generateNameFromDisplayName=r.get(),t.excludedNodes=o.get(),K.UPDATE_VARIANT.publish(t),t.select(),Project.saved=!1}}).show()}s(Yh,\"openVariantConfigDialog\");function Twe(t,e,n){if(t<e[0])return 0;if(t>e[e.length-1])return e.length-1;let i=0,a=0,r=e.length-1;for(;r-a!==1;)i=a+Math.floor((r-a)/2),t>=e[i]?a=i:r=i;return n?r:a}s(Twe,\"findIntervalBorderIndex\");function Cwe(t,e=1){if(t<2)throw new Error(`steps must be > 2, got: ${t}`);let n=e/t;return Array.from({length:t},(i,a)=>a*n)}s(Cwe,\"stepRange\");var it=class{static step0(e){return e>0?1:0}static step1(e){return e>=1?1:0}static linear(e){return e}static quad(e){return e*e}static cubic(e){return e*e*e}static poly(e){return n=>Math.pow(n,e)}static sin(e){return 1-Math.cos(e*Math.PI/2)}static circle(e){return 1-Math.sqrt(1-e*e)}static exp(e){return Math.pow(2,10*(e-1))}static elastic(e=1){let n=e*Math.PI;return i=>1-Math.pow(Math.cos(i*Math.PI/2),3)*Math.cos(i*n)}static back(e=1.70158){return n=>n*n*((e+1)*n-e)}static bounce(e=.5){let n=s(o=>7.5625*o*o,\"q\"),i=s(o=>121/4*e*Math.pow(o-6/11,2)+1-e,\"w\"),a=s(o=>121*e*e*Math.pow(o-9/11,2)+1-e*e,\"r\"),r=s(o=>484*e*e*e*Math.pow(o-10.5/11,2)+1-e*e*e,\"t\");return o=>Math.min(n(o),i(o),a(o),r(o))}static in(e){return e}static out(e){return n=>1-e(1-n)}static inOut(e){return n=>n<.5?e(n*2)/2:1-e((1-n)*2)/2}};s(it,\"Easing\");var Ib=it.poly(4),Db=it.poly(5),Fb=s((t,e,n)=>t(it.back(1.70158*e))(n),\"back\"),Nb=s((t,e,n)=>t(it.elastic(e))(n),\"elastic\"),Rb=s((t,e,n)=>t(it.bounce(e))(n),\"bounce\"),Mb={linear:it.linear,step(t,e){let n=Cwe(t);return n[Twe(e,n,!1)]},easeInQuad:it.in(it.quad),easeOutQuad:it.out(it.quad),easeInOutQuad:it.inOut(it.quad),easeInCubic:it.in(it.cubic),easeOutCubic:it.out(it.cubic),easeInOutCubic:it.inOut(it.cubic),easeInQuart:it.in(Ib),easeOutQuart:it.out(Ib),easeInOutQuart:it.inOut(Ib),easeInQuint:it.in(Db),easeOutQuint:it.out(Db),easeInOutQuint:it.inOut(Db),easeInSine:it.in(it.sin),easeOutSine:it.out(it.sin),easeInOutSine:it.inOut(it.sin),easeInExpo:it.in(it.exp),easeOutExpo:it.out(it.exp),easeInOutExpo:it.inOut(it.exp),easeInCirc:it.in(it.circle),easeOutCirc:it.out(it.circle),easeInOutCirc:it.inOut(it.circle),easeInBack:Fb.bind(null,it.in),easeOutBack:Fb.bind(null,it.out),easeInOutBack:Fb.bind(null,it.inOut),easeInElastic:Nb.bind(null,it.in),easeOutElastic:Nb.bind(null,it.out),easeInOutElastic:Nb.bind(null,it.inOut),easeInBounce:Rb.bind(null,it.in),easeOutBounce:Rb.bind(null,it.out),easeInOutBounce:Rb.bind(null,it.inOut)},Da=Object.fromEntries(Object.entries(Mb).map(t=>[t[0],t[0]]));Object.freeze(Da);var QO=\"linear\",Xh=s(t=>{switch(t.easing){case Da.easeInBack:case Da.easeOutBack:case Da.easeInOutBack:case Da.easeInElastic:case Da.easeOutElastic:case Da.easeInOutElastic:return 1;case Da.easeInBounce:case Da.easeOutBounce:case Da.easeInOutBounce:return .25;case Da.step:return 5;default:return null}},\"getEasingArgDefault\");function pl(t=\"\"){return t.includes(\"Back\")||t.includes(\"Elastic\")||t.includes(\"Bounce\")||t===Da.step}s(pl,\"hasArgs\");var Bb={};vn(Bb,{default:()=>Owe});var Owe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 20C14 20 18 31 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Pb={};vn(Pb,{default:()=>Dwe});var Dwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22C3 21 4 21 5 22C7 20 7 20 9 22C12 14 15 14 18 22C19 5.99998 22 2 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Lb={};vn(Lb,{default:()=>Nwe});var Nwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C22 19.0001 22 12 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Vb={};vn(Vb,{default:()=>Mwe});var Mwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C12 22.0001 18 12 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var zb={};vn(zb,{default:()=>Pwe});var Pwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 18.9999C5 18.9999 5 17.9999 7 17.9999C9 17.9999 10 19.9999 12 19.9999C14 19.9999 15.8152 13.0507 17 16.9999C20 26.9999 22 22 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Ub={};vn(Ub,{default:()=>Vwe});var Vwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C18 22.0001 22 18 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var qb={};vn(qb,{default:()=>Uwe});var Uwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C23 22.0001 0.999999 2 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Hb={};vn(Hb,{default:()=>Hwe});var Hwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001L22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Jb={};vn(Jb,{default:()=>Gwe});var Gwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C2 6.00009 6 2 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Gb={};vn(Gb,{default:()=>Kwe});var Kwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C12 22.0001 18 8.99999 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Wb={};vn(Wb,{default:()=>Xwe});var Xwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C14 22.0001 18 12 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Kb={};vn(Kb,{default:()=>Qwe});var Qwe='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C15 22.0001 18 15 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Yb={};vn(Yb,{default:()=>e3e});var e3e='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001C7 22.0001 18 8.99999 22 2\" stroke=\"white\" stroke-linecap=\"round\"/>%0D%0A</svg>%0D%0A';var Xb={};vn(Xb,{default:()=>n3e});var n3e='data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A<path d=\"M2 22.0001V17H7V12H12V7.00008H17V2L22 2.00012\" stroke=\"white\" stroke-linecap=\"square\"/>%0D%0A</svg>%0D%0A';var i3e=[Bb,Pb,Lb,Vb,zb,Ub,qb,Hb,Jb,Gb,Wb,Kb,Yb,Xb],$O=i3e,e6=[\"../assets/easingIcons/Back.svg\",\"../assets/easingIcons/Bounce.svg\",\"../assets/easingIcons/Circ.svg\",\"../assets/easingIcons/Cubic.svg\",\"../assets/easingIcons/Elastic.svg\",\"../assets/easingIcons/Expo.svg\",\"../assets/easingIcons/InOut.svg\",\"../assets/easingIcons/Linear.svg\",\"../assets/easingIcons/Out.svg\",\"../assets/easingIcons/Quad.svg\",\"../assets/easingIcons/Quart.svg\",\"../assets/easingIcons/Quint.svg\",\"../assets/easingIcons/Sine.svg\",\"../assets/easingIcons/Step.svg\"];function t6(t,e,n){let i=t.slice();return i[13]=e[n],i}s(t6,\"get_each_context\");function n6(t,e,n){let i=t.slice();return i[16]=e[n],i}s(n6,\"get_each_context_1\");function i6(t){let e;function n(r,o){return r[3]?.interpolation===\"linear\"?r3e:a3e}s(n,\"select_block_type\");let i=n(t,-1),a=i(t);return{c(){a.c(),e=_t()},m(r,o){a.m(r,o),U(r,e,o)},p(r,o){i===(i=n(r,o))&&a?a.p(r,o):(a.d(1),a=i(r),a&&(a.c(),a.m(e.parentNode,e)))},d(r){a.d(r),r&&z(e)}}}s(i6,\"create_if_block\");function a3e(t){let e;return{c(){e=L(\"div\"),e.textContent=`${A(\"panel.keyframe.nonlinear_interpolation\")}`,E(e,\"class\",\"easings-disabled svelte-59d7u1\")},m(n,i){U(n,e,i)},p:ie,d(n){n&&z(e)}}}s(a3e,\"create_else_block\");function r3e(t){let e,n,i=A(\"panel.keyframe.easing_type.title\")+\"\",a,r,o,l=t[0],c,d,u=pl(t[3]?.easing),p,m=r6(t),f=t[3].easing!==\"linear\"&&o6(t),g=u&&c6(t);return{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),m.c(),c=J(),f&&f.c(),d=J(),g&&g.c(),p=_t(),E(n,\"for\",\"easing_type_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),Xe(n,\"width\",\"100px\"),Xe(n,\"text-align\",\"left\"),E(n,\"title\",r=A(\"panel.keyframe.easing_type.description\")),E(e,\"class\",\"bar flex\")},m(x,_){U(x,e,_),I(e,n),I(n,a),I(e,o),m.m(e,null),U(x,c,_),f&&f.m(x,_),U(x,d,_),g&&g.m(x,_),U(x,p,_)},p(x,_){_&1&&De(l,l=x[0])?(m.d(1),m=r6(x),m.c(),m.m(e,null)):m.p(x,_),x[3].easing!==\"linear\"?f?f.p(x,_):(f=o6(x),f.c(),f.m(d.parentNode,d)):f&&(f.d(1),f=null),_&8&&(u=pl(x[3]?.easing)),u?g?g.p(x,_):(g=c6(x),g.c(),g.m(p.parentNode,p)):g&&(g.d(1),g=null)},d(x){x&&z(e),m.d(x),x&&z(c),f&&f.d(x),x&&z(d),g&&g.d(x),x&&z(p)}}}s(r3e,\"create_if_block_1\");function a6(t){let e,n,i,a,r,o,l,c,d;function u(){return t[6](t[16])}return s(u,\"click_handler\"),{c(){e=L(\"button\"),n=L(\"img\"),o=J(),E(n,\"class\",i=Xi(t[0]===t[16]?\"selected-keyframe-icon\":\"\")+\" svelte-59d7u1\"),Ht(n.src,a=Zh[t[16]])||E(n,\"src\",a),E(n,\"alt\",r=t[16]),E(e,\"class\",\"easing-type svelte-59d7u1\"),E(e,\"title\",l=A(`panel.keyframe.easing_type.options.${t[16]}`))},m(p,m){U(p,e,m),I(e,n),I(e,o),c||(d=Ue(e,\"click\",u),c=!0)},p(p,m){t=p,m&1&&i!==(i=Xi(t[0]===t[16]?\"selected-keyframe-icon\":\"\")+\" svelte-59d7u1\")&&E(n,\"class\",i)},d(p){p&&z(e),c=!1,d()}}}s(a6,\"create_each_block_1\");function r6(t){let e,n=u6,i=[];for(let a=0;a<n.length;a+=1)i[a]=a6(n6(t,n,a));return{c(){e=L(\"div\");for(let a=0;a<i.length;a+=1)i[a].c();E(e,\"id\",\"easing_type_input\"),E(e,\"class\",\"easing-container svelte-59d7u1\")},m(a,r){U(a,e,r);for(let o=0;o<i.length;o+=1)i[o]&&i[o].m(e,null)},p(a,r){if(r&35){n=u6;let o;for(o=0;o<n.length;o+=1){let l=n6(a,n,o);i[o]?i[o].p(l,r):(i[o]=a6(l),i[o].c(),i[o].m(e,null))}for(;o<i.length;o+=1)i[o].d(1);i.length=n.length}},d(a){a&&z(e),Wn(i,a)}}}s(r6,\"create_key_block_1\");function o6(t){let e,n,i=A(\"panel.keyframe.easing_mode.title\")+\"\",a,r,o,l=t[1],c=l6(t);return{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),c.c(),E(n,\"for\",\"easing_mode_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),Xe(n,\"width\",\"100px\"),Xe(n,\"text-align\",\"left\"),E(n,\"title\",r=A(\"panel.keyframe.easing_mode.description\")),E(e,\"class\",\"bar flex\")},m(d,u){U(d,e,u),I(e,n),I(n,a),I(e,o),c.m(e,null)},p(d,u){u&2&&De(l,l=d[1])?(c.d(1),c=l6(d),c.c(),c.m(e,null)):c.p(d,u)},d(d){d&&z(e),c.d(d)}}}s(o6,\"create_if_block_3\");function s6(t){let e,n,i,a,r,o,l,c,d;function u(){return t[7](t[13])}return s(u,\"click_handler_1\"),{c(){e=L(\"button\"),n=L(\"img\"),o=J(),E(n,\"class\",i=Xi(t[1]===t[13]?\"selected-keyframe-icon\":\"\")+\" svelte-59d7u1\"),Ht(n.src,a=s3e[t[13]])||E(n,\"src\",a),E(n,\"alt\",r=t[13]),E(e,\"class\",\"easing-type svelte-59d7u1\"),E(e,\"title\",l=A(`panel.keyframe.easing_mode.options.${t[13]}`))},m(p,m){U(p,e,m),I(e,n),I(e,o),c||(d=Ue(e,\"click\",u),c=!0)},p(p,m){t=p,m&2&&i!==(i=Xi(t[1]===t[13]?\"selected-keyframe-icon\":\"\")+\" svelte-59d7u1\")&&E(n,\"class\",i)},d(p){p&&z(e),c=!1,d()}}}s(s6,\"create_each_block\");function l6(t){let e,n=d6,i=[];for(let a=0;a<n.length;a+=1)i[a]=s6(t6(t,n,a));return{c(){e=L(\"div\");for(let a=0;a<i.length;a+=1)i[a].c();E(e,\"id\",\"easing_mode_input\"),E(e,\"class\",\"easing-container svelte-59d7u1\")},m(a,r){U(a,e,r);for(let o=0;o<i.length;o+=1)i[o]&&i[o].m(e,null)},p(a,r){if(r&35){n=d6;let o;for(o=0;o<n.length;o+=1){let l=t6(a,n,o);i[o]?i[o].p(l,r):(i[o]=s6(l),i[o].c(),i[o].m(e,null))}for(;o<i.length;o+=1)i[o].d(1);i.length=n.length}},d(a){a&&z(e),Wn(i,a)}}}s(l6,\"create_key_block\");function c6(t){let e,n,i=A(`panel.keyframe.easing_args.easing_arg.${t[0]}.title`)+\"\",a,r,o,l,c,d;return{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),l=L(\"input\"),E(n,\"for\",\"easing_arg_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),Xe(n,\"width\",\"100px\"),Xe(n,\"text-align\",\"left\"),E(n,\"title\",r=A(`panel.keyframe.easing_args.easing_arg.${t[0]}.description`)),E(l,\"id\",\"easing_arg_input\"),E(l,\"class\",\"dark_bordered tab_target\"),Xe(l,\"width\",\"66px\"),Xe(l,\"margin-left\",\"2px\"),E(l,\"type\",\"number\"),E(l,\"step\",\"0.1\"),E(l,\"min\",\"0\"),E(e,\"class\",\"bar flex\")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(e,o),I(e,l),Bt(l,t[4]),c||(d=Ue(l,\"input\",t[8]),c=!0)},p(u,p){p&1&&i!==(i=A(`panel.keyframe.easing_args.easing_arg.${u[0]}.title`)+\"\")&&ct(a,i),p&1&&r!==(r=A(`panel.keyframe.easing_args.easing_arg.${u[0]}.description`))&&E(n,\"title\",r),p&16&&Sl(l.value)!==u[4]&&Bt(l,u[4])},d(u){u&&z(e),c=!1,d()}}}s(c6,\"create_if_block_2\");function o3e(t){let e,n=t[3]&&i6(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,[a]){i[3]?n?n.p(i,a):(n=i6(i),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},i:ie,o:ie,d(i){n&&n.d(i),i&&z(e)}}}s(o3e,\"create_fragment\");var Zh=Object.fromEntries($O.map((t,e)=>[PathModule.basename(e6[e]).replace(\".svg\",\"\").toLowerCase(),t.default])),s3e={in:Zh.expo,out:Zh.out,inout:Zh.inout},u6=[\"linear\",\"sine\",\"quad\",\"cubic\",\"quart\",\"quint\",\"expo\",\"circ\",\"elastic\",\"back\",\"bounce\"],d6=[\"in\",\"out\",\"inout\"];function l3e(t){return t.animator.keyframes.filter(e=>e.channel===t.channel).sort((e,n)=>e.time-n.time)[0]===t}s(l3e,\"isFirstKeyframe\");function c3e(t,e,n){let i,a=ie,r=s(()=>(a(),a=rt(c,v=>n(4,i=v)),c),\"$$subscribe_easingArg\");t.$$.on_destroy.push(()=>a());let o=\"linear\",l,c;function d(){if(!g?.easing)return;let v=/ease(InOut|Out|In)(.+)/.exec(g.easing);return v?(pl(g.easing)&&m(),{type:v?.[2].toLowerCase(),mode:v?.[1].toLowerCase()}):{type:g.easing}}s(d,\"getSelectedEasing\");function u(v,b=\"inout\"){g&&(v===\"linear\"?n(3,g.easing=\"linear\",g):n(3,g.easing=`ease${b&&b!==\"inout\"?b[0].toUpperCase()+b.slice(1):\"InOut\"}${v[0].toUpperCase()+v.slice(1)}`,g),o!==v&&m(),n(0,o=v),n(1,l=b))}s(u,\"setSelectedEasing\");let p;function m(){p?.(),g&&(pl(g.easing)?(r(n(2,c=new ke(g.easingArgs?.[0]??Xh(g)??0))),p=c?.subscribe(v=>f(v))):r(n(2,c=void 0)))}s(m,\"getEasingArgs\");function f(v){if(g){if(!v){delete g.easingArgs;return}n(3,g.easingArgs=[v],g)}}s(f,\"setEasingArgs\");let g;K.UPDATE_KEYFRAME_SELECTION.subscribe(()=>{let v=Timeline.selected.at(0);if(Fe()&&v&&[\"position\",\"rotation\",\"scale\"].includes(v.channel)&&!l3e(v)){n(3,g=v);let b=d();b&&(n(0,o=b.type),n(1,l=b.mode))}else f(i),n(3,g=void 0)}),K.UNSELECT_AJ_PROJECT.subscribe(()=>{f(i),n(3,g=void 0)});let x=s(v=>u(v,l),\"click_handler\"),_=s(v=>u(o,v),\"click_handler_1\");function h(){i=Sl(this.value),c.set(i)}return s(h,\"input_input_handler\"),[o,l,c,g,i,u,x,_,h]}s(c3e,\"instance\");var Qh=class extends Pe{constructor(e){super(),Ve(this,e,c3e,o3e,De,{})}};s(Qh,\"KeyframeEasings\");var p6=Qh;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.easings-disabled.svelte-59d7u1{margin-left:16px;font-size:16px;color:var(--color-subtle_text);text-wrap:balance;margin-bottom:1rem;font-style:italic}.easing-container.svelte-59d7u1{display:flex;flex-direction:row;flex-wrap:wrap;grid-gap:2px;margin-left:2px}.easing-type.svelte-59d7u1{width:32px;padding:0px;margin:0px;min-width:unset;display:flex;align-items:center;justify-content:center}.easing-type.svelte-59d7u1:hover{background-color:var(--color-selected)}.selected-keyframe-icon.svelte-59d7u1{filter:invert(49%) sepia(16%) saturate(6320%) hue-rotate(198deg) brightness(101%)\\r\n\t\t\tcontrast(106%)}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();yp({id:\"animated-java:mounted-svelte/keyframe-easings\",component:p6,target:\"#panel_keyframe\"});function m6(t){let e,n,i=A(\"panel.keyframe.repeat_frequency.title\")+\"\",a,r,o,l,c,d;return{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),l=L(\"input\"),E(n,\"for\",\"repeat_frequency_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),E(n,\"title\",r=A(\"animated_java.panel.keyframe.repeat_frequency.description\")),E(l,\"id\",\"repeat_frequency_input\"),E(l,\"class\",\"dark_bordered tab_target\"),E(l,\"type\",\"number\"),E(e,\"class\",\"bar flex\")},m(u,p){U(u,e,p),I(e,n),I(n,a),I(e,o),I(e,l),Bt(l,t[4]),c||(d=Ue(l,\"input\",t[8]),c=!0)},p(u,p){p&16&&Sl(l.value)!==u[4]&&Bt(l,u[4])},d(u){u&&z(e),c=!1,d()}}}s(m6,\"create_if_block\");function u3e(t){let e,n,i=A(\"panel.keyframe.function.title\")+\"\",a,r,o,l,c,d,u,p,m=A(\"panel.keyframe.execute_condition.title\")+\"\",f,g,x,_,h,v,b,y,w=A(\"panel.keyframe.repeat.title\")+\"\",S,F,N,k,R,D,B,q,G;function W(Q){t[5](Q)}s(W,\"customcodejar0_value_binding\");let ee={placeholder:\"say Hello, World!\"};t[1]!==void 0&&(ee.value=t[1]),l=new $s({props:ee}),Te.push(()=>Be(l,\"value\",W));function Z(Q){t[6](Q)}s(Z,\"customcodejar1_value_binding\");let me={placeholder:\"if score @s matches 1..\"};t[2]!==void 0&&(me.value=t[2]),_=new $s({props:me}),Te.push(()=>Be(_,\"value\",Z));let X=t[0]?.repeat&&m6(t);return{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),Ce(l.$$.fragment),d=J(),u=L(\"div\"),p=L(\"label\"),f=Re(m),x=J(),Ce(_.$$.fragment),v=J(),b=L(\"div\"),y=L(\"label\"),S=Re(w),N=J(),k=L(\"input\"),R=J(),X&&X.c(),D=_t(),E(n,\"for\",\"commands_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),E(n,\"title\",r=A(\"panel.keyframe.function.description\")),E(e,\"class\",\"bar flex custom-bar svelte-1s4pafb\"),E(p,\"for\",\"execute_condition\"),E(p,\"class\",\"undefined\"),Xe(p,\"font-weight\",\"unset\"),E(p,\"title\",g=A(\"panel.keyframe.execute_condition.description\")),E(u,\"class\",\"bar flex custom-bar svelte-1s4pafb\"),E(y,\"for\",\"repeat_input\"),E(y,\"class\",\"undefined\"),Xe(y,\"font-weight\",\"unset\"),E(y,\"title\",F=A(\"animated_java.panel.keyframe.repeat.description\")),E(k,\"id\",\"repeat_input\"),E(k,\"class\",\"dark_bordered tab_target svelte-1s4pafb\"),E(k,\"type\",\"checkbox\"),E(b,\"class\",\"bar flex\")},m(Q,he){U(Q,e,he),I(e,n),I(n,a),I(e,o),Ae(l,e,null),U(Q,d,he),U(Q,u,he),I(u,p),I(p,f),I(u,x),Ae(_,u,null),U(Q,v,he),U(Q,b,he),I(b,y),I(y,S),I(b,N),I(b,k),k.checked=t[3],U(Q,R,he),X&&X.m(Q,he),U(Q,D,he),B=!0,q||(G=Ue(k,\"change\",t[7]),q=!0)},p(Q,[he]){let Ie={};!c&&he&2&&(c=!0,Ie.value=Q[1],Me(()=>c=!1)),l.$set(Ie);let le={};!h&&he&4&&(h=!0,le.value=Q[2],Me(()=>h=!1)),_.$set(le),he&8&&(k.checked=Q[3]),Q[0]?.repeat?X?X.p(Q,he):(X=m6(Q),X.c(),X.m(D.parentNode,D)):X&&(X.d(1),X=null)},i(Q){B||(ae(l.$$.fragment,Q),ae(_.$$.fragment,Q),B=!0)},o(Q){de(l.$$.fragment,Q),de(_.$$.fragment,Q),B=!1},d(Q){Q&&z(e),je(l),Q&&z(d),Q&&z(u),je(_),Q&&z(v),Q&&z(b),Q&&z(R),X&&X.d(Q),Q&&z(D),q=!1,G()}}}s(u3e,\"create_fragment\");function d3e(t,e,n){let{keyframe:i}=e,a=i?.function??\"\",r=i?.execute_condition??\"\",o=i?.repeat??!1,l=i?.repeat_frequency??1;function c(m){a=m,n(1,a)}s(c,\"customcodejar0_value_binding\");function d(m){r=m,n(2,r)}s(d,\"customcodejar1_value_binding\");function u(){o=this.checked,n(3,o)}s(u,\"input_change_handler\");function p(){l=Sl(this.value),n(4,l)}return s(p,\"input_input_handler\"),t.$$set=m=>{\"keyframe\"in m&&n(0,i=m.keyframe)},t.$$.update=()=>{if(t.$$.dirty&30)e:n(0,i.function=a,i),n(0,i.execute_condition=r,i),n(0,i.repeat=o,i),n(0,i.repeat_frequency=l,i)},[i,a,r,o,l,c,d,u,p]}s(d3e,\"instance\");var $h=class extends Pe{constructor(e){super(),Ve(this,e,d3e,u3e,De,{keyframe:0})}};s($h,\"CommandsKeyframePanel\");var f6=$h;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".custom-bar.svelte-1s4pafb{flex-direction:column}input[type='checkbox'].svelte-1s4pafb{display:flex;align-items:center;justify-content:flex-start;padding-left:8px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function p3e(t){let e,n,i=A(\"panel.keyframe.variant.title\")+\"\",a,r,o,l,c,d,u,p=A(\"panel.keyframe.execute_condition.title\")+\"\",m,f,g,x,_,h;function v(y){t[5](y)}s(v,\"customcodejar_value_binding\");let b={placeholder:\"if score @s matches 1..\"};return t[0]!==void 0&&(b.value=t[0]),x=new $s({props:b}),Te.push(()=>Be(x,\"value\",v)),{c(){e=L(\"div\"),n=L(\"label\"),a=Re(i),o=J(),l=L(\"div\"),c=J(),d=L(\"div\"),u=L(\"label\"),m=Re(p),g=J(),Ce(x.$$.fragment),E(n,\"for\",\"variant_input\"),E(n,\"class\",\"undefined\"),Xe(n,\"font-weight\",\"unset\"),Xe(n,\"width\",\"fit-content\"),E(n,\"title\",r=A(\"panel.keyframe.variant.description\")),E(l,\"class\",\"select-container svelte-1gy8tdu\"),E(e,\"class\",\"bar flex\"),E(u,\"for\",\"execute_condition\"),E(u,\"class\",\"undefined\"),Xe(u,\"font-weight\",\"unset\"),E(u,\"title\",f=A(\"panel.keyframe.execute_condition.description\")),E(d,\"class\",\"bar flex custom-bar svelte-1gy8tdu\")},m(y,w){U(y,e,w),I(e,n),I(n,a),I(e,o),I(e,l),t[4](l),U(y,c,w),U(y,d,w),I(d,u),I(u,m),I(d,g),Ae(x,d,null),h=!0},p(y,[w]){let S={};!_&&w&1&&(_=!0,S.value=y[0],Me(()=>_=!1)),x.$set(S)},i(y){h||(ae(x.$$.fragment,y),h=!0)},o(y){de(x.$$.fragment,y),h=!1},d(y){y&&z(e),t[4](null),y&&z(c),y&&z(d),je(x)}}}s(p3e,\"create_fragment\");function m3e(t,e,n){let{keyframe:i}=e,a=i?.variant?.uuid??qe.getDefault().uuid,r=i?.execute_condition??\"\",o=Object.fromEntries(qe.all.map(p=>[p.uuid,p.displayName])),l=new Interface.CustomElements.SelectInput(\"keyframe-variant-selector\",{options:o,value:a,onChange(){let p=l.node.getAttribute(\"value\");if(p==null){console.warn(\"Variant value is undefined\");return}n(3,a=p)}}),c;requestAnimationFrame(()=>{c.appendChild(l.node)});function d(p){Te[p?\"unshift\":\"push\"](()=>{c=p,n(1,c)})}s(d,\"div0_binding\");function u(p){r=p,n(0,r)}return s(u,\"customcodejar_value_binding\"),t.$$set=p=>{\"keyframe\"in p&&n(2,i=p.keyframe)},t.$$.update=()=>{if(t.$$.dirty&9)e:n(2,i.variant=qe.getByUUID(a)??qe.getDefault(),i),n(2,i.execute_condition=r,i),Animator.preview()},[r,c,i,a,d,u]}s(m3e,\"instance\");var eg=class extends Pe{constructor(e){super(),Ve(this,e,m3e,p3e,De,{keyframe:2})}};s(eg,\"VariantKeyframePanel\");var h6=eg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".custom-bar.svelte-1gy8tdu{flex-direction:column}.select-container.svelte-1gy8tdu{flex-grow:1;height:30px;padding-left:8px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var tg=(n=>(n.VARIANT=\"variant\",n.FUNCTION=\"function\",n))(tg||{});function Zb(t){return Object.values(tg).includes(t)}s(Zb,\"isCustomKeyframeChannel\");Nt({id:\"animated-java:keyframe/data-point/variant\",object:Blockbench.Keyframe.prototype,key:\"variant\",condition:()=>Fe(),get(){let t=this.data_points.at(0)?.[\"variant\"];if(t)return qe.getByUUID(t);console.error(\"Keyframe variant\",t,\"not found!\")},set(t){let e=this.data_points.at(0);e&&(e[\"variant\"]=t?.uuid)}});Nt({id:\"animated-java:keyframe/data-point/function\",object:Blockbench.Keyframe.prototype,key:\"function\",condition:()=>Fe(),get(){return this.data_points.at(0)?.[\"function\"]??\"\"},set(t){let e=this.data_points.at(0);e&&(e[\"function\"]=t)}});Nt({id:\"animated-java:keyframe/data-point/execute-condition\",object:Blockbench.Keyframe.prototype,key:\"execute_condition\",condition:()=>Fe(),get(){return this.data_points.at(0)?.[\"execute_condition\"]??\"\"},set(t){let e=this.data_points.at(0);e&&(e[\"execute_condition\"]=t)}});Nt({id:\"animated-java:keyframe/data-point/repeat\",object:Blockbench.Keyframe.prototype,key:\"repeat\",condition:()=>Fe(),get(){return this.data_points.at(0)?.[\"repeat\"]??!1},set(t){let e=this.data_points.at(0);e&&(e[\"repeat\"]=t)}});Nt({id:\"animated-java:keyframe/data-point/repeat-frequency\",object:Blockbench.Keyframe.prototype,key:\"repeat_frequency\",condition:()=>Fe(),get(){return this.data_points.at(0)?.[\"repeat_frequency\"]??1},set(t){let e=this.data_points.at(0);e&&(e[\"repeat_frequency\"]=t)}});da({id:\"animated-java:custom-keyframes\",condition:t=>t.format.id===Qt,apply:()=>{let t={...EffectAnimator.prototype.channels};EffectAnimator.addChannel(\"variant\",{name:A(\"effect_animator.timeline.variant\"),mutable:!0,max_data_points:1}),EffectAnimator.addChannel(\"function\",{name:A(\"effect_animator.timeline.function\"),mutable:!0,max_data_points:1});let e=[new Property(KeyframeDataPoint,\"string\",\"variant\",{label:A(\"effect_animator.keyframe_data_point.variant\"),condition:i=>i.keyframe.channel===\"variant\",exposed:!1,default:()=>qe.getDefault().uuid}),new Property(KeyframeDataPoint,\"string\",\"function\",{label:A(\"effect_animator.keyframe_data_point.function\"),default:\"\",condition:i=>i.keyframe.channel===\"function\",exposed:!1}),new Property(KeyframeDataPoint,\"string\",\"execute_condition\",{label:A(\"effect_animator.keyframe_data_point.execute_condition\"),default:\"\",condition:i=>Zb(i.keyframe.channel),exposed:!1}),new Property(KeyframeDataPoint,\"boolean\",\"repeat\",{label:A(\"effect_animator.keyframe_data_point.repeat\"),default:!1,condition:i=>i.keyframe.channel===\"function\",exposed:!1}),new Property(KeyframeDataPoint,\"number\",\"repeat_frequency\",{label:A(\"effect_animator.keyframe_data_point.repeat_frequency\"),default:1,condition:i=>i.keyframe.channel===\"function\",exposed:!1})];for(let i of Object.keys(t))i!==\"sound\"&&delete EffectAnimator.prototype.channels[i];let n=EffectAnimator.prototype.displayFrame;return EffectAnimator.prototype.displayFrame=function(i){if(this.muted.particle=!0,this.muted.timeline=!0,n.call(this,i),!!(Project&&Fe())){if(!this.muted[\"variant\"]){let a,r,o;for(let l of this[\"variant\"])l.time<this.animation.time?(!r||l.time>r.time)&&(r=l):(!a||l.time<a.time)&&(a=l);a&&a.time===this.animation.time?o=a:r?o=r:a&&(o=this[\"variant\"].at(-1)),o?.variant?.select()}this.last_displayed_time=this.animation.time}},{defaultChannels:t,defaultEffectDisplayFrame:n,properties:e}},revert:({defaultChannels:t,defaultEffectDisplayFrame:e,properties:n})=>{for(let i of Object.keys(t))i!==\"sound\"&&(EffectAnimator.prototype.channels[i]=t[i]);for(let i of n)KeyframeDataPoint.properties[i.name]?.delete();for(let i of Object.values(tg))delete EffectAnimator.prototype.channels[i];delete BoneAnimator.prototype.channels.commands,delete BoneAnimator.prototype.commands,EffectAnimator.prototype.displayFrame=e}});St({id:\"animated-java:panel/custom-keyframe-data-points\",apply:()=>{Language.data[\"timeline.variant\"]=A(\"effect_animator.timeline.variant\"),Language.data[\"timeline.function\"]=A(\"effect_animator.timeline.function\");let t,e=[K.UPDATE_KEYFRAME_SELECTION.subscribe(()=>{t?.$destroy(),t=void 0;let n=Timeline.selected.at(0),i=Zb(n?.channel??\"\");if(n&&i){let a;switch(n.channel){case\"variant\":a=h6;break;case\"function\":a=f6;break;default:console.error(`Unknown custom keyframe channel: '${n.channel}'`);return}t=Gn({component:a,props:{keyframe:n},target:\"#panel_keyframe .panel_vue_wrapper .keyframe_data_point\",hideTargetChildren:!0})}}),K.UNSELECT_AJ_PROJECT.subscribe(()=>{t?.$destroy(),t=void 0})];return{mounted:t,unsubs:e}},revert:({mounted:t,unsubs:e})=>{delete Language.data[\"timeline.variant\"],delete Language.data[\"timeline.function\"],e.forEach(n=>n()),t?.$destroy()}});function g6(t){let e,n;return{c(){e=L(\"textarea\"),e.readOnly=!0,E(e,\"rows\",n=t[3].split(`\n`).length+1),e.value=t[3],E(e,\"class\",\"svelte-w0fo30\")},m(i,a){U(i,e,a)},p(i,a){a&8&&n!==(n=i[3].split(`\n`).length+1)&&E(e,\"rows\",n),a&8&&(e.value=i[3])},d(i){i&&z(e)}}}s(g6,\"create_if_block\");function f3e(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v,b,y,w,S,F,N,k,R,D,B,q,G,W;function ee(Q){t[13](Q)}s(ee,\"codejar_element_binding\");function Z(Q){t[14](Q)}s(Z,\"codejar_value_binding\");let me={syntax:\"snbtTextComponent\",highlight:h3e,preserveIdent:!0,history:!0,style:`\\r\n\t\t\t\tbackground-color: var(--color-back);\\r\n\t\t\t\tfont-family: var(--font-code);\\r\n\t\t\t\tfont-size: 14px;\\r\n\t\t\t\tpadding: 3px 6px;\\r\n\t\t\t\tmax-height: 20em;\\r\n\t\t\t\theight: fit-content;\\r\n\t\t\t\tmin-height: 5rem;\\r\n\t\t\t\twidth: 100%;\\r\n\t\t\t\toutline: none;\\r\n\t\t\t\toverflow-wrap: unset;\\r\n\t\t\t\toverflow-y: scroll;\\r\n\t\t\t\twhite-space: pre;\\r\n\t\t\t\tmargin: 8px;\\r\n\t\t\t\tmargin-bottom: 0px;\\r\n\t\t\t\t`+(t[3]?\"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;\":\"border: 1px solid var(--color-border);\")+`\\r\n\t\t\t\ttext-shadow: 0px 1px rgba(0, 0, 0, 0.3);\\r\n\t\t\t`};t[2]!==void 0&&(me.element=t[2]),t[1]!==void 0&&(me.value=t[1]),N=new Td({props:me}),Te.push(()=>Be(N,\"element\",ee)),Te.push(()=>Be(N,\"value\",Z)),N.$on(\"change\",t[15]);let X=t[3]&&g6(t);return{c(){e=L(\"p\"),e.textContent=`${A(\"panel.text_display.title\")}`,n=J(),i=L(\"div\"),a=L(\"div\"),o=J(),l=L(\"div\"),d=J(),u=L(\"div\"),m=J(),f=L(\"div\"),x=J(),_=L(\"div\"),v=J(),b=L(\"div\"),w=J(),S=L(\"div\"),F=L(\"div\"),Ce(N.$$.fragment),D=J(),X&&X.c(),E(e,\"class\",\"panel_toolbar_label label svelte-w0fo30\"),E(a,\"class\",\"content\"),E(l,\"class\",\"content\"),E(u,\"class\",\"content\"),E(f,\"class\",\"content\"),E(_,\"class\",\"content\"),E(b,\"class\",\"content\"),E(i,\"class\",\"toolbar text-display-toolbar svelte-w0fo30\"),E(F,\"class\",\"content codejar-container svelte-w0fo30\"),E(S,\"class\",\"toolbar text-display-text-toolbar svelte-w0fo30\"),E(S,\"style\",B=t[0]?\"margin-bottom: 16px;\":\"visibility:hidden; height: 0px;\")},m(Q,he){U(Q,e,he),U(Q,n,he),U(Q,i,he),I(i,a),I(i,o),I(i,l),I(i,d),I(i,u),I(i,m),I(i,f),I(i,x),I(i,_),I(i,v),I(i,b),U(Q,w,he),U(Q,S,he),I(S,F),Ae(N,F,null),I(F,D),X&&X.m(F,null),q=!0,G||(W=[bn(r=t[5].call(null,a)),bn(c=t[6].call(null,l)),bn(p=t[7].call(null,u)),bn(g=t[8].call(null,f)),bn(h=t[9].call(null,_)),bn(y=t[10].call(null,b)),Ue(F,\"keydown\",t[12])],G=!0)},p(Q,[he]){let Ie={};he&8&&(Ie.style=`\\r\n\t\t\t\tbackground-color: var(--color-back);\\r\n\t\t\t\tfont-family: var(--font-code);\\r\n\t\t\t\tfont-size: 14px;\\r\n\t\t\t\tpadding: 3px 6px;\\r\n\t\t\t\tmax-height: 20em;\\r\n\t\t\t\theight: fit-content;\\r\n\t\t\t\tmin-height: 5rem;\\r\n\t\t\t\twidth: 100%;\\r\n\t\t\t\toutline: none;\\r\n\t\t\t\toverflow-wrap: unset;\\r\n\t\t\t\toverflow-y: scroll;\\r\n\t\t\t\twhite-space: pre;\\r\n\t\t\t\tmargin: 8px;\\r\n\t\t\t\tmargin-bottom: 0px;\\r\n\t\t\t\t`+(Q[3]?\"border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;\":\"border: 1px solid var(--color-border);\")+`\\r\n\t\t\t\ttext-shadow: 0px 1px rgba(0, 0, 0, 0.3);\\r\n\t\t\t`),!k&&he&4&&(k=!0,Ie.element=Q[2],Me(()=>k=!1)),!R&&he&2&&(R=!0,Ie.value=Q[1],Me(()=>R=!1)),N.$set(Ie),Q[3]?X?X.p(Q,he):(X=g6(Q),X.c(),X.m(F,null)):X&&(X.d(1),X=null),(!q||he&1&&B!==(B=Q[0]?\"margin-bottom: 16px;\":\"visibility:hidden; height: 0px;\"))&&E(S,\"style\",B)},i(Q){q||(ae(N.$$.fragment,Q),q=!0)},o(Q){de(N.$$.fragment,Q),q=!1},d(Q){Q&&z(e),Q&&z(n),Q&&z(i),Q&&z(w),Q&&z(S),je(N),X&&X.d(),G=!1,Rt(W)}}}s(f3e,\"create_fragment\");var _6=new Map;function h3e(t,e){if(!e)return t;let n=_6.get(t);if(n)return n;if(t.length>1e4)return console.warn(\"Skipping syntax highlighting due to large text size\"),t;let i=new pi(\"Highlighting\").start(),a=Prism.highlight(t,Prism.languages[e],e);return i.debug({code:t,result:a}),_6.set(t,a),a}s(h3e,\"highlight\");function g3e(t,e,n){let i,{selected:a}=e,r=a.text,o=a.textError;Pa(t,o,b=>n(3,i=b));let l;Qb.setValue(a.lineWidth),ml.set(tinycolor(a.backgroundColor)),fl.set(a.shadow),pp.set(a.align),hl.set(a.seeThrough);let c=s(b=>{b.appendChild(Qb.node)},\"mountLineWidth\"),d=s(b=>{b.appendChild(fl.node)},\"mountShadow\"),u=s(b=>{b.appendChild(pp.node)},\"mountAlignment\"),p=s(b=>{b.appendChild(hl.node)},\"mountSeeThrough\"),m=s(b=>{b.appendChild(ml.node)},\"mountBackgroundColor\"),f=s(b=>{b.appendChild(v6.node)},\"mountCopyText\");requestAnimationFrame(()=>{g()});function g(){l&&(n(2,l.style.overflowWrap=\"unset\",l),n(2,l.style.whiteSpace=\"pre\",l))}s(g,\"forceNoWrap\");let x=s(b=>{b instanceof KeyboardEvent&&(b.key===\"Tab\"?b.stopPropagation():b.code===\"KeyZ\"&&b.ctrlKey&&requestAnimationFrame(()=>{a&&l?.textContent!=null&&n(1,r=l.textContent)}))},\"onKeydown\");function _(b){l=b,n(2,l)}s(_,\"codejar_element_binding\");function h(b){r=b,n(1,r)}s(h,\"codejar_value_binding\");let v=s(()=>g(),\"change_handler\");return t.$$set=b=>{\"selected\"in b&&n(0,a=b.selected)},t.$$.update=()=>{if(t.$$.dirty&3)e:a.text!==r&&(Undo.initEdit({elements:[a]}),n(0,a.text=r,a),a.updateTextMesh(),Project.saved=!1,Undo.finishEdit(\"Change Text Display Text\",{elements:[a]}))},[a,r,l,i,o,c,d,u,p,m,f,g,x,_,h,v]}s(g3e,\"instance\");var ng=class extends Pe{constructor(e){super(),Ve(this,e,g3e,f3e,De,{selected:0})}};s(ng,\"TextDisplayElementPanel\");var x6=ng;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(`.label.svelte-w0fo30{margin-bottom:-3px !important}.text-display-text-toolbar.svelte-w0fo30{display:flex}textarea.svelte-w0fo30{color:var(--color-error);background-color:var(--color-back);padding:3px 6px;overflow:auto;height:min-content;font-size:14px;font-family:var(--font-code);width:-webkit-fill-available;margin:8px;margin-top:0px;border-radius:0 0 0.3em 0.3em;border:1px solid var(--color-error);white-space:pre;tab-size:4}.codejar-container.svelte-w0fo30{width:100%}.codejar-container.svelte-w0fo30 .language-snbtTextComponent{& .brackets {\\r\n\t\t\tcolor: #5ba8c5;\\r\n\t\t};& .token.punctuation {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.property {\\r\n\t\t\tcolor: #eeffff;\\r\n\t\t};& .token.escape-sequence {\\r\n\t\t\tcolor: #89ddff;\\r\n\t\t};& .token.constant {\\r\n\t\t\tcolor: #c767d7;\\r\n\t\t\tborder-bottom: 1px solid;\\r\n\t\t};& .token.number {\\r\n\t\t\tcolor: #f92672;\\r\n\t\t};& .token.boolean {\\r\n\t\t\tcolor: #f78c6c;\\r\n\t\t};& .token.string {\\r\n\t\t\tcolor: #aef941;\\r\n\t\t}}.text-display-toolbar.svelte-w0fo30{display:flex;flex-direction:row;margin-bottom:1px}.text-display-toolbar.svelte-w0fo30 .sp-replacer{padding:4px 18px !important;height:28px !important;margin:2px 0px !important}.text-display-toolbar.svelte-w0fo30 [toolbar_item='animated_java:textDisplayShadowToggle']{margin-right:2px !important}.text-display-toolbar.svelte-w0fo30 .bar_select{height:28px !important;margin:2px 0px !important}.text-display-toolbar.svelte-w0fo30 bb-select{height:28px !important;display:flex;align-items:center;padding-top:0}`)),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var $b=null,b6=s(()=>{$b?.$destroy(),$b=null},\"destroyMounted\"),_3e=s(()=>{b6();let t=ve.selected.at(0);t&&($b=Gn({component:x6,props:{selected:t},target:\"#panel_element\"}))},\"updatePanel\");da({id:\"animated-java:append-element-panel/text-display\",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UPDATE_SELECTION.subscribe(_3e)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),b6()}});function x3e(){let t={pattern:/^['\"]|['\"]$/,alias:\"quotation\"};Prism.languages.snbtTextComponent=Prism.languages.extend(\"json\",{punctuation:/[,:]/,brackets:{pattern:/[{}[\\]]/g},property:[{pattern:/('|\")?\\w+\\1\\s*(?=\\s*:)/,inside:{punctuation:t}}],string:[{pattern:/(\"|')(?:\\\\(?:\\r\\n?|\\n|.)|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0,inside:{punctuation:t,\"named-unicode-escape-sequence\":{pattern:/\\\\N\\{ *[\\w ]+ *\\}/,alias:\"escape-sequence\",inside:{constant:{pattern:/(\\\\N\\{ *)[\\w ]+?(?= *\\})/,lookbehind:!0}}},\"unicode-escape-sequence\":{pattern:/\\\\(?:x[\\da-fA-F]{2}|u[\\da-fA-F]{4}|U[\\da-fA-F]{8})/,alias:\"escape-sequence\",inside:{constant:{pattern:/(?:[\\da-fA-F]+)/}}},\"escape-sequence\":{pattern:/\\\\(?:n|s|t|b|f|r|'|\"|\\\\)/}}},{pattern:/([:,]\\s*)\\b(?!true|false)\\w+\\b/i,inside:{punctuation:t},lookbehind:!0}],boolean:{pattern:/\\b(?:true|false|0b|1b)\\b/i},number:/(?:(?:#|0x)[\\dA-Fa-f_]{1,8}\\b|[-]?(?:\\b\\d[\\d_]*(?:\\.[\\d_]*)?|\\B\\.[\\d_]+)(?:[eE][+-]?[\\d_]+\\b)?)/})}s(x3e,\"addPrismSyntaxForSnbtTextComponents\");x3e();var Yc=s(()=>Fe()&&!!ve.selected.length,\"TEXT_DISPLAY_CONDITION\"),Qb=new NumSlider(\"animated-java:text-display-line-width-slider\",{name:A(\"tool.text_display.line_width.title\"),icon:\"format_size\",description:A(\"tool.text_display.line_width.description\"),settings:{min:1,max:1e4,interval:1},condition:Yc,get(){let t=ve.selected.at(0);return t?t.lineWidth:ve.properties.lineWidth.default},change(t){if(!Project)return;let e=ve.selected.at(0);if(!e)return;let n=Math.clamp(t(e.lineWidth),1,1e4);e.lineWidth!==n&&(e.lineWidth=n,e.updateTextMesh(),Project.saved=!1)}}),ml=new ColorPicker(\"animated-java:text-display-background-color-picker\",{name:A(\"tool.text_display.background_color.title\"),icon:\"format_color_fill\",description:A(\"tool.text_display.background_color.description\"),condition:Yc});ml.jq.spectrum(\"option\",\"defaultColor\",ve.properties.backgroundColor.default);ml.get=function(){let t=ve.selected.at(0);return t?tinycolor(t.backgroundColor):tinycolor(ve.properties.backgroundColor.default)};ml.set=function(t){this.value=t,this.jq.spectrum(\"set\",t.toHex8String());let e=ve.selected.at(0);if(!e)return this;let n=t.toHex8String();return e.backgroundColor===n?this:(e.backgroundColor=t.toHex8String(),e.updateTextMesh(),Project.saved=!1,this)};ml.change=function(t){if(!Project)return this;let e=ve.selected.at(0);if(!e)return this;let n=t.toHex8String();return e.backgroundColor===n?this:(e.backgroundColor=n,e.updateTextMesh(),Project.saved=!1,this)};var fl=new Toggle(\"animated-java:text-display-shadow-toggle\",{name:A(\"tool.text_display.text_shadow.title\"),icon:\"check_box_outline_blank\",description:A(\"tool.text_display.text_shadow.description\"),condition:Yc,default:ve.properties.shadow.default,onChange(){if(!Project)return;let t=fl;t.setIcon(t.value?\"check_box\":\"check_box_outline_blank\");let e=ve.selected.at(0);e&&e.shadow!==fl.value&&(e.shadow=fl.value,e.updateTextMesh(),Project.saved=!1)}});fl.set=function(t){return this.value===t?this:(this.click(),this)};var pp=new BarSelect(\"animated-java:text-display-alignment-select\",{name:A(\"tool.text_display.text_alignment.title\"),icon:\"format_align_left\",description:A(\"tool.text_display.text_alignment.description\"),condition:Yc,options:{left:A(\"tool.text_display.text_alignment.options.left\"),center:A(\"tool.text_display.text_alignment.options.center\"),right:A(\"tool.text_display.text_alignment.options.right\")}});pp.get=function(){let t=ve.selected.at(0);return t?t.align:ve.properties.align.default};pp.set=function(t){let e=ve.selected.at(0);if(!e)return this;this.value=t;let n=this.getNameFor(t);return this.nodes.forEach(i=>{$(i).find(\"bb-select\").text(n)}),this.nodes.includes(this.node)||$(this.node).find(\"bb-select\").text(n),e.align===t?this:(e.align=t,e.updateTextMesh(),Project.saved=!1,this)};var hl=new Toggle(\"animated-java:text-display-see-through-toggle\",{name:A(\"tool.text_display.see_through.title\"),icon:\"check_box_outline_blank\",description:A(\"tool.text_display.see_through.description\"),condition:Yc,onChange(){if(!Project)return;let t=hl;t.setIcon(t.value?\"check_box\":\"check_box_outline_blank\");let e=ve.selected.at(0);e&&e.seeThrough!==hl.value&&(e.seeThrough=hl.value,e.updateTextMesh(),Project.saved=!1)}});hl.set=function(t){return this.value===t?this:(this.click(),this)};var v6=new Action(\"animated-java:text-display-copy-text-action\",{name:A(\"tool.text_display.copy_text.title\"),icon:\"content_copy\",description:A(\"tool.text_display.copy_text.description\"),condition:Yc,click:()=>{if(!Project)return;let t=ve.selected.at(0);if(t)try{let e=new Yn({minecraftVersion:Project.animated_java.target_minecraft_version}).parse(t.text).toString(!0,Project.animated_java.target_minecraft_version);clipboard.writeText(e),Blockbench.showQuickMessage(A(\"tool.text_display.copy_text.copied\"),2e3)}catch(e){console.error(e),Blockbench.showQuickMessage(\"Failed to copy text to clipboard\",2e3)}}});function y6(t){let e,n;return{c(){e=L(\"div\"),n=Re(t[1]),E(e,\"class\",\"error svelte-1gpclxv\")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(y6,\"create_if_block\");function v3e(t){let e,n,i,a,r,o,l,c,d,u,p=t[1]&&y6(t);return{c(){e=L(\"p\"),e.textContent=`${A(\"panel.vanilla_block_display.title\")}`,n=J(),i=L(\"div\"),a=L(\"div\"),r=L(\"input\"),l=J(),p&&p.c(),c=_t(),E(e,\"class\",\"panel_toolbar_label label svelte-1gpclxv\"),E(r,\"type\",\"text\"),E(r,\"class\",\"svelte-1gpclxv\"),E(a,\"class\",\"content\"),Xe(a,\"width\",\"95%\"),E(i,\"class\",\"toolbar custom-toolbar svelte-1gpclxv\"),E(i,\"title\",o=A(\"panel.vanilla_block_display.description\"))},m(m,f){U(m,e,f),U(m,n,f),U(m,i,f),I(i,a),I(a,r),Bt(r,t[0]),U(m,l,f),p&&p.m(m,f),U(m,c,f),d||(u=Ue(r,\"input\",t[4]),d=!0)},p(m,[f]){f&1&&r.value!==m[0]&&Bt(r,m[0]),m[1]?p?p.p(m,f):(p=y6(m),p.c(),p.m(c.parentNode,c)):p&&(p.d(1),p=null)},i:ie,o:ie,d(m){m&&z(e),m&&z(n),m&&z(i),m&&z(l),p&&p.d(m),m&&z(c),d=!1,u()}}}s(v3e,\"create_fragment\");function b3e(t,e,n){let i,{selected:a}=e,r=a.block,o=a.error;Pa(t,o,c=>n(1,i=c));function l(){r=this.value,n(0,r)}return s(l,\"input_input_handler\"),t.$$set=c=>{\"selected\"in c&&n(3,a=c.selected)},t.$$.update=()=>{if(t.$$.dirty&9)e:Jt(o,i=\"\",i),a.block!==r&&vf(r).then(c=>{if(c){Jt(o,i=c,i),console.log(\"Block validation error:\",c);return}console.log(\"Changing block to\",r),Undo.initEdit({elements:[a]}),n(3,a.block=r,a),Project.saved=!1,Undo.finishEdit(`Change Block Display Block to \"${r}\"`,{elements:[a]})}).catch(c=>{Jt(o,i=c.message,i)})},[r,i,o,a,l]}s(b3e,\"instance\");var ig=class extends Pe{constructor(e){super(),Ve(this,e,b3e,v3e,De,{selected:3})}};s(ig,\"VanillaBlockDisplayElementPanel\");var w6=ig;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"input.svelte-1gpclxv{background-color:var(--color-button);padding:2px 8px;width:100%}.label.svelte-1gpclxv{margin-bottom:-3px !important}.custom-toolbar.svelte-1gpclxv{display:flex;flex-direction:row;margin-bottom:1px}.custom-toolbar.svelte-1gpclxv .sp-replacer{padding:4px 18px !important;height:28px !important;margin:1px 0px !important}.error.svelte-1gpclxv{margin:2px 8px;font-size:14px;color:var(--color-error)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var ty=null,E6=s(()=>{ty?.$destroy(),ty=null},\"destroyMounted\"),ey=s(()=>{E6();let t=$e.selected.at(0);t&&(ty=Gn({component:w6,props:{selected:t},target:\"#panel_element\"}))},\"updatePanel\");da({id:\"animated-java:append-element-panel/vanilla-block-display\",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UNDO.subscribe(ey),K.REDO.subscribe(ey),K.UPDATE_SELECTION.subscribe(ey)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),E6()}});function k6(t){let e,n;return{c(){e=L(\"div\"),n=Re(t[1]),E(e,\"class\",\"error svelte-lxqp9c\")},m(i,a){U(i,e,a),I(e,n)},p(i,a){a&2&&ct(n,i[1])},d(i){i&&z(e)}}}s(k6,\"create_if_block\");function y3e(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g=t[1]&&k6(t);return{c(){e=L(\"p\"),e.textContent=`${A(\"panel.vanilla_item_display.title\")}`,n=J(),i=L(\"div\"),a=L(\"div\"),r=L(\"input\"),o=J(),l=L(\"div\"),u=J(),g&&g.c(),p=_t(),E(e,\"class\",\"panel_toolbar_label label svelte-lxqp9c\"),E(r,\"type\",\"text\"),E(r,\"class\",\"svelte-lxqp9c\"),E(a,\"class\",\"content\"),Xe(a,\"width\",\"95%\"),E(l,\"class\",\"content\"),E(i,\"class\",\"toolbar custom-toolbar svelte-lxqp9c\"),E(i,\"title\",d=A(\"panel.vanilla_item_display.description\"))},m(x,_){U(x,e,_),U(x,n,_),U(x,i,_),I(i,a),I(a,r),Bt(r,t[0]),I(i,o),I(i,l),U(x,u,_),g&&g.m(x,_),U(x,p,_),m||(f=[Ue(r,\"input\",t[5]),bn(c=t[3].call(null,l))],m=!0)},p(x,[_]){_&1&&r.value!==x[0]&&Bt(r,x[0]),x[1]?g?g.p(x,_):(g=k6(x),g.c(),g.m(p.parentNode,p)):g&&(g.d(1),g=null)},i:ie,o:ie,d(x){x&&z(e),x&&z(n),x&&z(i),x&&z(u),g&&g.d(x),x&&z(p),m=!1,Rt(f)}}}s(y3e,\"create_fragment\");function w3e(t,e,n){let i,{selected:a}=e,r=a.item,o=a.error;Pa(t,o,d=>n(1,i=d)),Xc.set(a.itemDisplay);let l=s(d=>{d.appendChild(Xc.node)},\"mountItemDisplaySelect\");function c(){r=this.value,n(0,r)}return s(c,\"input_input_handler\"),t.$$set=d=>{\"selected\"in d&&n(4,a=d.selected)},t.$$.update=()=>{if(t.$$.dirty&17)e:Jt(o,i=\"\",i),a.item!==r&&bf(r).then(d=>{if(d){Jt(o,i=d,i),console.log(\"Item validation error:\",d);return}console.log(\"Changing item to\",r),Undo.initEdit({elements:[a]}),n(4,a.item=r,a),Project.saved=!1,Undo.finishEdit(`Change Item Display Item to \"${r}\"`,{elements:[a]})}).catch(d=>{Jt(o,i=d.message,i)})},[r,i,o,l,a,c]}s(w3e,\"instance\");var ag=class extends Pe{constructor(e){super(),Ve(this,e,w3e,y3e,De,{selected:4})}};s(ag,\"VanillaItemDisplayElementPanel\");var j6=ag;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"input.svelte-lxqp9c{background-color:var(--color-button);padding:2px 8px;width:100%}.label.svelte-lxqp9c{margin-bottom:-3px !important}.custom-toolbar.svelte-lxqp9c{display:flex;flex-direction:row;margin-bottom:1px}.custom-toolbar.svelte-lxqp9c .sp-replacer{padding:4px 18px !important;height:28px !important;margin:1px 0px !important}.error.svelte-lxqp9c{margin:2px 8px;font-size:14px;color:var(--color-error)}.custom-toolbar.svelte-lxqp9c [toolbar_item='animated_java:itemDisplayAlignmentSelect']{margin:0px 2px !important}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var iy=null,A6=s(()=>{iy?.$destroy(),iy=null},\"destroyMounted\"),ny=s(()=>{A6();let t=We.selected.at(0);t&&(iy=Gn({component:j6,props:{selected:t},target:\"#panel_element\"}))},\"updatePanel\");da({id:\"animated-java:append-element-panel/vanilla-item-display\",condition:t=>t.format.id===Qt,apply:()=>({unsubscribers:[K.UNDO.subscribe(ny),K.REDO.subscribe(ny),K.UPDATE_SELECTION.subscribe(ny)]}),revert:({unsubscribers:t})=>{t.forEach(e=>e()),A6()}});var Xc=new BarSelect(`${Ke.name}:itemDisplayAlignmentSelect`,{name:A(\"tool.item_display.item_display.title\"),icon:\"format_align_left\",description:A(\"tool.item_display.item_display.description\"),condition:()=>Fe()&&!!We.selected.length,options:{none:A(\"tool.item_display.item_display.options.none\"),thirdperson_lefthand:A(\"tool.item_display.item_display.options.thirdperson_lefthand\"),thirdperson_righthand:A(\"tool.item_display.item_display.options.thirdperson_righthand\"),firstperson_lefthand:A(\"tool.item_display.item_display.options.firstperson_lefthand\"),firstperson_righthand:A(\"tool.item_display.item_display.options.firstperson_righthand\"),head:A(\"tool.item_display.item_display.options.head\"),gui:A(\"tool.item_display.item_display.options.gui\"),ground:A(\"tool.item_display.item_display.options.ground\"),fixed:A(\"tool.item_display.item_display.options.fixed\")}});Xc.get=function(){let t=We.selected[0];return t?t.itemDisplay:\"left\"};Xc.set=function(t){let e=We.selected.at(0);if(!e)return this;this.value=t;let n=this.getNameFor(t);if(this.nodes.forEach(i=>{$(i).find(\"bb-select\").text(n)}),this.nodes.includes(this.node)||$(this.node).find(\"bb-select\").text(n),e.itemDisplay===t)return this;if(Undo.initEdit({elements:We.selected}),We.selected.length>1)for(let i of We.selected)i.itemDisplay=t,i.updateItem();else e.itemDisplay=t,e.updateItem();return Project.saved=!1,Undo.finishEdit(`Change Item Display Node's Item Display Mode to ${t}`,{elements:We.selected}),this};function T6(){let t=We.selected.at(0)?.itemDisplay;t??=\"none\",Xc.set(t)}s(T6,\"updateItemDisplaySelect\");K.UNDO.subscribe(()=>{T6()});K.REDO.subscribe(()=>{T6()});function C6(t,e,n){let i=t.slice();return i[13]=e[n],i}s(C6,\"get_each_context\");function E3e(t){let e,n,i,a=t[13].value.displayName+\"\",r,o,l,c,d,u,p;function m(w,S){return w[13].value.isDefault?A3e:j3e}s(m,\"select_block_type_1\");let f=m(t,-1),g=f(t);function x(w,S){return qe.selected===w[13].value?C3e:T3e}s(x,\"select_block_type_2\");let _=x(t,-1),h=_(t);function v(w,S){return w[13].value.isDefault?S3e:O3e}s(v,\"select_block_type_3\");let b=v(t,-1),y=b(t);return{c(){e=L(\"i\"),e.textContent=\"texture\",n=J(),i=L(\"div\"),r=Re(a),o=J(),l=L(\"div\"),c=J(),g.c(),d=J(),h.c(),u=J(),y.c(),p=_t(),E(e,\"class\",\"material-icons icon in_list_button\"),E(i,\"class\",\"variant_item_name svelte-1deur0j\"),E(l,\"class\",\"spacer svelte-1deur0j\")},m(w,S){U(w,e,S),U(w,n,S),U(w,i,S),I(i,r),U(w,o,S),U(w,l,S),U(w,c,S),g.m(w,S),U(w,d,S),h.m(w,S),U(w,u,S),y.m(w,S),U(w,p,S)},p(w,S){S&2&&a!==(a=w[13].value.displayName+\"\")&&ct(r,a),f===(f=m(w,S))&&g?g.p(w,S):(g.d(1),g=f(w),g&&(g.c(),g.m(d.parentNode,d))),_===(_=x(w,S))&&h?h.p(w,S):(h.d(1),h=_(w),h&&(h.c(),h.m(u.parentNode,u))),b===(b=v(w,S))&&y?y.p(w,S):(y.d(1),y=b(w),y&&(y.c(),y.m(p.parentNode,p)))},i:ie,o:ie,d(w){w&&z(e),w&&z(n),w&&z(i),w&&z(o),w&&z(l),w&&z(c),g.d(w),w&&z(d),h.d(w),w&&z(u),y.d(w),w&&z(p)}}}s(E3e,\"create_else_block\");function k3e(t){let e,n;return{c(){e=L(\"div\"),Xe(e,\"visibility\",\"visible\",1),Xe(e,\"position\",\"relative\"),Xe(e,\"top\",\"0\"),Xe(e,\"left\",\"0\"),Xe(e,\"border-bottom\",\"2px solid var(--color-accent)\"),Xe(e,\"width\",\"100%\"),Xe(e,\"height\",\"15px\")},m(i,a){U(i,e,a)},p(i,a){t=i},i(i){n||to(()=>{n=cu(e,ep,{duration:150,easing:$d}),n.start()})},o:ie,d(i){i&&z(e)}}}s(k3e,\"create_if_block\");function j3e(t){let e,n,i,a,r;function o(){return t[8](t[13])}return s(o,\"click_handler_3\"),{c(){e=L(\"i\"),n=Re(\"edit\"),E(e,\"class\",\"material-icons icon in_list_button\"),E(e,\"title\",i=A(\"panel.variants.tool.edit_variant\"))},m(l,c){U(l,e,c),I(e,n),a||(r=Ue(e,\"click\",o),a=!0)},p(l,c){t=l},d(l){l&&z(e),a=!1,r()}}}s(j3e,\"create_else_block_3\");function A3e(t){let e,n,i;return{c(){e=L(\"i\"),n=Re(\"edit\"),E(e,\"class\",\"material-icons icon in_list_button in_list_button_disabled svelte-1deur0j\"),E(e,\"title\",i=A(\"panel.variants.tool.cannot_edit_default_variant\"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(A3e,\"create_if_block_3\");function T3e(t){let e,n,i;return{c(){e=L(\"i\"),n=Re(\"visibility_off\"),E(e,\"class\",\"material-icons icon in_list_button in_list_button_disabled svelte-1deur0j\"),E(e,\"title\",i=A(\"panel.variants.tool.variant_not_visible\"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(T3e,\"create_else_block_2\");function C3e(t){let e,n,i;return{c(){e=L(\"i\"),n=Re(\"visibility\"),E(e,\"class\",\"material-icons icon in_list_button\"),E(e,\"title\",i=A(\"panel.variants.tool.variant_visible\"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(C3e,\"create_if_block_2\");function S3e(t){let e,n,i;return{c(){e=L(\"i\"),n=Re(\"delete\"),E(e,\"class\",\"material-icons icon in_list_button_disabled svelte-1deur0j\"),E(e,\"title\",i=A(\"panel.variants.tool.cannot_delete_default_variant\"))},m(a,r){U(a,e,r),I(e,n)},p:ie,d(a){a&&z(e)}}}s(S3e,\"create_else_block_1\");function O3e(t){let e,n,i;return{c(){e=L(\"i\"),e.textContent=\"delete\",E(e,\"class\",\"material-icons icon in_list_button\")},m(a,r){U(a,e,r),n||(i=Ue(e,\"click\",t[9]),n=!0)},p:ie,d(a){a&&z(e),n=!1,i()}}}s(O3e,\"create_if_block_1\");function S6(t,e){let n,i,a,r,o=ie,l,c;function d(g,x){return g[13][sr]?k3e:E3e}s(d,\"select_block_type\");let u=d(e,-1),p=u(e);function m(){return e[10](e[13])}s(m,\"click_handler_5\");function f(...g){return e[11](e[13],...g)}return s(f,\"contextmenu_handler\"),{key:t,first:null,c(){n=L(\"li\"),p.c(),i=J(),E(n,\"class\",a=Xi(e[13].value===qe.selected?\"variant_item selected_variant_item\":\"variant_item\")+\" svelte-1deur0j\"),this.first=n},m(g,x){U(g,n,x),p.m(n,null),I(n,i),l||(c=[Ue(n,\"click\",m),Ue(n,\"contextmenu\",t1(f))],l=!0)},p(g,x){e=g,u===(u=d(e,x))&&p?p.p(e,x):(p.d(1),p=u(e),p&&(p.c(),ae(p,1),p.m(n,i))),x&2&&a!==(a=Xi(e[13].value===qe.selected?\"variant_item selected_variant_item\":\"variant_item\")+\" svelte-1deur0j\")&&E(n,\"class\",a)},r(){r=n.getBoundingClientRect()},f(){lu(n),o()},a(){o(),o=su(n,r,tp,{duration:ay})},i(g){ae(p)},o:ie,d(g){g&&z(n),p.d(),l=!1,Rt(c)}}}s(S6,\"create_each_block\");function O6(t){let e,n,i,a,r,o,l,c,d,u,p,m,f,g,x,_,h,v=[],b=new Map,y,w,S,F=t[1],N=s(k=>k[13].id,\"get_key\");for(let k=0;k<F.length;k+=1){let R=C6(t,F,k),D=N(R);b.set(D,v[k]=S6(D,R))}return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"div\"),a=L(\"i\"),a.textContent=\"texture_add\",o=J(),l=L(\"div\"),c=L(\"i\"),c.textContent=\"content_copy\",u=J(),p=L(\"div\"),m=L(\"i\"),f=Re(\"delete\"),_=J(),h=L(\"ul\");for(let k=0;k<v.length;k+=1)v[k].c();E(a,\"class\",\"material-icons icon\"),E(i,\"class\",\"tool\"),E(i,\"title\",r=A(\"panel.variants.tool.create_new_variant\")),E(c,\"class\",\"material-icons icon\"),E(l,\"class\",\"tool\"),E(l,\"title\",d=A(\"panel.variants.tool.duplicate_selected_variant\")),E(m,\"class\",g=Xi(\"material-icons icon\"+(qe.selected?.isDefault?\" in_list_button_disabled\":\"\"))+\" svelte-1deur0j\"),E(p,\"class\",\"tool\"),E(p,\"title\",x=A(\"panel.variants.tool.delete_selected_variant\")),E(n,\"class\",\"toolbar\"),E(h,\"class\",\"variants_list svelte-1deur0j\"),E(e,\"class\",\"panel_container svelte-1deur0j\")},m(k,R){U(k,e,R),I(e,n),I(n,i),I(i,a),I(n,o),I(n,l),I(l,c),I(n,u),I(n,p),I(p,m),I(m,f),I(e,_),I(e,h);for(let D=0;D<v.length;D+=1)v[D]&&v[D].m(h,null);w||(S=[Ue(i,\"click\",t[5]),Ue(l,\"click\",t[6]),Ue(p,\"click\",t[7]),bn(y=dp.call(null,h,{items:t[1],flipDurationMs:ay,dropTargetStyle:{}})),Ue(h,\"consider\",t[3]),Ue(h,\"finalize\",t[4])],w=!0)},p(k,R){if(R&0&&g!==(g=Xi(\"material-icons icon\"+(qe.selected?.isDefault?\" in_list_button_disabled\":\"\"))+\" svelte-1deur0j\")&&E(m,\"class\",g),R&6){F=k[1];for(let D=0;D<v.length;D+=1)v[D].r();v=du(v,R,N,1,k,F,b,h,uu,S6,null,C6);for(let D=0;D<v.length;D+=1)v[D].a()}y&&qn(y.update)&&R&2&&y.update.call(null,{items:k[1],flipDurationMs:ay,dropTargetStyle:{}})},i(k){for(let R=0;R<F.length;R+=1)ae(v[R])},o:ie,d(k){k&&z(e);for(let R=0;R<v.length;R+=1)v[R].d();w=!1,Rt(S)}}}s(O6,\"create_key_block\");function I3e(t){let e=t[0],n,i=O6(t);return{c(){i.c(),n=_t()},m(a,r){i.m(a,r),U(a,n,r)},p(a,[r]){r&1&&De(e,e=a[0])?(Sn(),de(i,1,1,ie),On(),i=O6(a),i.c(),ae(i,1),i.m(n.parentNode,n)):i.p(a,r)},i(a){ae(i)},o(a){de(i)},d(a){a&&z(n),i.d(a)}}}s(I3e,\"create_fragment\");var ay=100;function D3e(t){ry.get()?.click(t)}s(D3e,\"createVariant\");function F3e(t){oy.get()?.click(t)}s(F3e,\"duplicateVariant\");function I6(t){sy.get()?.click(t)}s(I6,\"deleteVariant\");function N3e(t,e,n){let i=Project,a=[];function r(){n(1,a=qe.all.map((_,h)=>({id:h,value:_})))}s(r,\"updateLocalVariants\"),K.CREATE_VARIANT.subscribe(()=>{r()}),K.UPDATE_VARIANT.subscribe(()=>{r()}),K.DELETE_VARIANT.subscribe(()=>{r()}),K.SELECT_AJ_PROJECT.subscribe(_=>{n(0,i=_),qe.selectDefault(),r()}),K.UNSELECT_PROJECT.subscribe(_=>{n(0,i=_)}),K.SELECT_VARIANT.subscribe(()=>{r()});function o(_){_.select(),r()}s(o,\"selectVariant\");function l(_){n(1,a=_.detail.items)}s(l,\"handleSort\");function c(_){n(1,a=_.detail.items),qe.all=a.map(h=>h.value)}return s(c,\"finalizeSort\"),r(),[i,a,o,l,c,s(_=>D3e(_),\"click_handler\"),s(_=>F3e(_),\"click_handler_1\"),s(_=>I6(_),\"click_handler_2\"),s(_=>Yh(_.value),\"click_handler_3\"),s(_=>I6(_),\"click_handler_4\"),s(_=>o(_.value),\"click_handler_5\"),s((_,h)=>{_.value.select(),F6.get()?.open(h)},\"contextmenu_handler\")]}s(N3e,\"instance\");var rg=class extends Pe{constructor(e){super(),Ve(this,e,N3e,I3e,De,{})}};s(rg,\"VariantsPanel\");var D6=rg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".panel_container.svelte-1deur0j{display:flex;flex-direction:column}.spacer.svelte-1deur0j{flex-grow:1}.variants_list.svelte-1deur0j{list-style:none;background-color:var(--color-back);scroll-behavior:smooth;overflow-y:auto;max-height:250px}.variant_item.svelte-1deur0j{display:flex;flex-direction:row;justify-content:flex-start;padding:4px;cursor:unset !important;min-height:32px;max-height:32px}.variant_item_name.svelte-1deur0j{margin-left:8px}.variant_item.svelte-1deur0j:hover{color:var(--color-light)}.in_list_button_disabled.svelte-1deur0j{color:var(--color-subtle_text)}.selected_variant_item.svelte-1deur0j{background-color:var(--color-selected)}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var mp=class extends Panel{instance;constructor(e){let n=`${Ke.name}-svelte-panel-`+guid();super(e.id,{...e,component:{name:e.id,template:`<div id=\"${n}\"></div>`}}),El(()=>document.querySelector(`#${n}`),()=>!1).then(i=>{this.instance=new e.component({target:i.parentElement,props:e.props})})}};s(mp,\"SveltePanel\");var ry=nn({id:\"animated-java:create-variant\"},{name:A(\"action.variants.create\"),icon:\"add\",click(){new qe(\"New Variant\")}}),oy=nn({id:\"animated-java:duplicate-variant\"},{name:A(\"action.variants.duplicate\"),icon:\"content_copy\",condition:()=>!!qe.selected,click(){qe.selected&&qe.selected.duplicate()}}),sy=nn({id:\"animated-java:delete-variant\"},{name:A(\"action.variants.delete\"),icon:\"delete\",condition:()=>!!qe.selected&&!qe.selected.isDefault,click(){!qe.selected||qe.selected.isDefault||qe.selected.delete()}}),R3e=nn({id:\"animated-java:open-variant-config\"},{name:A(\"action.variants.open_config\"),icon:\"settings\",condition:()=>!!qe.selected&&!qe.selected.isDefault,click(){qe.selected&&Yh(qe.selected)}}),F6=By({id:\"animated-java:variant-panel-context-menu\"},()=>{let t=[R3e.get(),new MenuSeparator,ry.get(),oy.get(),new MenuSeparator,sy.get()];return t.every(e=>e!=null)?t:[]},{}),gXe=new mp({id:\"animated-java:variants-panel\",name:A(\"panel.variants.title\"),expand_button:!0,default_side:\"right\",default_position:{slot:\"left_bar\",height:200,float_position:[0,0],float_size:[200,200],folded:!1},icon:\"settings\",condition:{formats:[Qt],modes:[Modes.options.edit.id,Modes.options.paint.id]},component:D6,props:{}});function N6(t,e,n){let i=t.slice();return i[3]=e[n],i}s(N6,\"get_each_context\");function R6(t){let e,n=t[3].hasImageIcon(),i,a=t[3].title+\"\",r,o,l,c,d,u=tl(\"dialog.plugins.disable\")+\"\",p,m,f,g,x=n&&M6(t);function _(){return t[2](t[3])}return s(_,\"click_handler\"),{c(){e=L(\"li\"),x&&x.c(),i=J(),r=Re(a),o=J(),l=L(\"button\"),c=L(\"i\"),c.textContent=\"bedtime\",d=J(),p=Re(u),m=J(),E(c,\"class\",\"material-icons icon svelte-2n8ep5\"),E(l,\"class\",\"svelte-2n8ep5\"),E(e,\"class\",\"svelte-2n8ep5\")},m(h,v){U(h,e,v),x&&x.m(e,null),I(e,i),I(e,r),I(e,o),I(e,l),I(l,c),I(l,d),I(l,p),I(e,m),f||(g=Ue(l,\"click\",_),f=!0)},p(h,v){t=h,v&1&&(n=t[3].hasImageIcon()),n?x?x.p(t,v):(x=M6(t),x.c(),x.m(e,i)):x&&(x.d(1),x=null),v&1&&a!==(a=t[3].title+\"\")&&ct(r,a)},d(h){h&&z(e),x&&x.d(),f=!1,g()}}}s(R6,\"create_if_block\");function M6(t){let e,n;return{c(){e=L(\"img\"),Ht(e.src,n=t[3].getIcon())||E(e,\"src\",n),E(e,\"alt\",\"\"),E(e,\"class\",\"svelte-2n8ep5\")},m(i,a){U(i,e,a)},p(i,a){a&1&&!Ht(e.src,n=i[3].getIcon())&&E(e,\"src\",n)},d(i){i&&z(e)}}}s(M6,\"create_if_block_1\");function B6(t){let e,n=!t[3].disabled&&R6(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,a){i[3].disabled?n&&(n.d(1),n=null):n?n.p(i,a):(n=R6(i),n.c(),n.m(e.parentNode,e))},d(i){n&&n.d(i),i&&z(e)}}}s(B6,\"create_each_block\");function M3e(t){let e,n=A(\"popup.incompatability_popup.description\").replaceAll(`\n`,\"<br />\")+\"\",i,a,r=t[0],o=[];for(let l=0;l<r.length;l+=1)o[l]=B6(N6(t,r,l));return{c(){e=L(\"p\"),i=J(),a=L(\"ul\");for(let l=0;l<o.length;l+=1)o[l].c();E(a,\"class\",\"svelte-2n8ep5\")},m(l,c){U(l,e,c),e.innerHTML=n,U(l,i,c),U(l,a,c);for(let d=0;d<o.length;d+=1)o[d]&&o[d].m(a,null)},p(l,[c]){if(c&3){r=l[0];let d;for(d=0;d<r.length;d+=1){let u=N6(l,r,d);o[d]?o[d].p(u,c):(o[d]=B6(u),o[d].c(),o[d].m(a,null))}for(;d<o.length;d+=1)o[d].d(1);o.length=r.length}},i:ie,o:ie,d(l){l&&z(e),l&&z(i),l&&z(a),Wn(o,l)}}}s(M3e,\"create_fragment\");function B3e(t,e,n){let{plugins:i}=e;function a(o){o.toggleDisabled(),i.remove(o),n(0,i=[...i]),i.length===0&&L6()}s(a,\"disablePlugin\");let r=s(o=>a(o),\"click_handler\");return t.$$set=o=>{\"plugins\"in o&&n(0,i=o.plugins)},[i,a,r]}s(B3e,\"instance\");var og=class extends Pe{constructor(e){super(),Ve(this,e,B3e,M3e,De,{plugins:0})}};s(og,\"IncompatabilityPopup\");var P6=og;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"ul.svelte-2n8ep5{display:flex;flex-direction:column;margin-top:1rem;gap:0.75rem}li.svelte-2n8ep5{display:flex;align-items:center;justify-content:flex-start;font-size:24px;background:var(--color-back);padding:12px}img.svelte-2n8ep5{width:64px;margin-right:16px}button.svelte-2n8ep5{margin-left:auto;font-size:16px;height:64px;display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:unset}i.svelte-2n8ep5{font-size:32px;max-width:min-content}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var V6=(n=>(n.GECKOLIB_ANIMATION_UTILS=\"animation_utils\",n.GECKOLIB=\"geckolib\",n))(V6||{}),gl=null;function P3e(t){gl||(gl=new cn({id:`${Ke.name}:incompatabilityPopup`,title:A(\"popup.incompatability_popup.title\"),width:700,content:{component:P6,props:{plugins:t}},preventKeybinds:!0,preventKeybindCancel:!0,buttons:[A(\"popup.incompatability_popup.button.disable_all\"),A(\"popup.incompatability_popup.button.ignore\")],onButton:e=>{e===0&&t.forEach(n=>{n.disabled||n.toggleDisabled()})},onClose:()=>{gl=null}}).show())}s(P3e,\"openIncompatabilityPopup\");function L6(){gl&&(gl.hide(),gl.delete(),gl=null)}s(L6,\"closeIncompatabilityPopup\");function ly(t){return Object.values(V6).includes(t.id)}s(ly,\"isIncompatiblePlugin\");function sg(){let t=Plugins.all.filter(e=>e.installed&&!e.disabled&&ly(e));return t.length>0?(P3e(t),!0):!1}s(sg,\"checkForIncompatabilities\");K.EXTERNAL_PLUGIN_LOAD.subscribe(()=>{sg()});function L3e(t){let e,n,i,a,r,o,l,c;return{c(){e=L(\"div\"),n=L(\"div\"),i=L(\"img\"),r=J(),o=L(\"div\"),o.innerHTML=`<h1 class=\"svelte-1h2xm0u\">Welcome to Animated Java!</h1> \n\t\t\t<h3 class=\"svelte-1h2xm0u\">Effortlessly craft complex animations for Minecraft: Java Edition</h3>`,l=J(),c=L(\"div\"),c.innerHTML=`<h2 class=\"svelte-1h2xm0u\">Not Sure Where to Start?</h2> \n\t\t<p class=\"svelte-1h2xm0u\">Check out our <a href=\"https://animated-java.dev/docs/getting-started/creating-a-blueprint\">getting started</a> page to learn how to use Animated Java!</p> \n\t\t<p class=\"svelte-1h2xm0u\">You can open our docs at any time via the Animated Java menu at the top of the screen.</p> \n\t\t<h2 class=\"svelte-1h2xm0u\">Need Help?</h2> \n\t\t<p class=\"svelte-1h2xm0u\">Join our <a href=\"https://animated-java.dev/discord\">Discord server</a> to ask questions\n\t\t\tvia our support channel.</p>`,Ht(i.src,a=ya)||E(i,\"src\",a),E(i,\"class\",\"svelte-1h2xm0u\"),E(o,\"class\",\"svelte-1h2xm0u\"),E(n,\"class\",\"header-container svelte-1h2xm0u\"),E(c,\"class\",\"another-container svelte-1h2xm0u\"),E(e,\"class\",\"content-container svelte-1h2xm0u\")},m(d,u){U(d,e,u),I(e,n),I(n,i),I(n,r),I(n,o),I(e,l),I(e,c)},p:ie,i:ie,o:ie,d(d){d&&z(e)}}}s(L3e,\"create_fragment\");var lg=class extends Pe{constructor(e){super(),Ve(this,e,null,L3e,De,{})}};s(lg,\"InstalledPopup\");var z6=lg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\".another-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;align-items:flex-start;flex-direction:column;padding:0 10%}.content-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;flex-direction:column;align-items:center}p.svelte-1h2xm0u.svelte-1h2xm0u{text-align:left}h2.svelte-1h2xm0u.svelte-1h2xm0u{text-align:center;margin-top:2rem;font-weight:500;border-bottom:1px solid var(--color-accent);margin-bottom:1rem}.header-container.svelte-1h2xm0u.svelte-1h2xm0u{display:flex;align-items:center;margin-top:1rem;justify-content:center}.header-container.svelte-1h2xm0u div.svelte-1h2xm0u{display:flex;flex-direction:column;justify-content:center;margin-left:2rem}.header-container.svelte-1h2xm0u img.svelte-1h2xm0u{width:128px;border-radius:16px;box-shadow:4px 4px 8px -4px black}.header-container.svelte-1h2xm0u h1.svelte-1h2xm0u{margin:0px;border-bottom:1px solid var(--color-accent);margin-bottom:4px}.header-container.svelte-1h2xm0u h3.svelte-1h2xm0u{margin:0px;color:var(--color-subtle_text);font-size:medium;max-width:23rem}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();function cy(){new cn({id:`${Ke.name}:installedPopup`,title:A(\"popup.installed_popup.title\"),width:700,content:{component:z6},preventKeybinds:!0,buttons:[A(\"popup.installed_popup.close_button\")]}).show()}s(cy,\"openInstallPopup\");Nt({id:\"animated-java:action-click-override/save-project\",object:BarItems.save_project,key:\"click\",condition:()=>Fe(),get:()=>xh});Nt({id:\"animated-java:action-click-override/save-project-as\",object:BarItems.save_project_as,key:\"click\",condition:()=>Fe(),get:()=>()=>{let t=Hr.get();if(!t)throw new Error(\"Blueprint codec not registered\");t.export()}});Nt({id:\"animated-java:action-click-override/project-window\",object:BarItems.project_window,key:\"click\",condition:()=>Fe(),get:()=>jc});Nt({id:\"animated-java:action-click-override/export-project\",object:BarItems.export_over,key:\"click\",condition:()=>Fe(),get:()=>()=>{if(!Project||!Format)return;let t=Hr.get();if(!t)throw new Error(\"Blueprint codec not registered\");let e=Project.save_path||Project.export_path;e?fs.existsSync(PathModule.dirname(e))?(Project.save_path=e,t.write(t.compile(),e)):(console.error(`Failed to export Animated Java Blueprint, file location '${e}' does not exist!`),t.export()):t.export()}});var U6=20,q6=.05;Nt({id:\"animated-java:function-override/animation/extend\",object:Blockbench.Animation.prototype,key:\"extend\",condition:()=>Fe(),get:t=>function(e){t.call(this,e),this.snapping=U6,this.length=Math.max(this.length,q6);for(let n of Object.values(this.animators)){if(!n)continue;let i=-1/0;for(let a of n.keyframes){let r=Dr(a.time,U6);r!==a.time&&(r===i&&(r+=.05),a.time=r,i=r)}}return this}});Nt({id:\"animated-java:function-override/animation/set-length\",object:Blockbench.Animation.prototype,key:\"setLength\",condition:()=>Fe(),get:t=>function(e){return e=Math.max(e??this.length,q6),t.call(this,e)}});Nt({id:\"animated-java:function-override/animation/properties-dialog\",object:Blockbench.Animation.prototype,key:\"propertiesDialog\",condition:()=>Fe(),get:()=>function(){if(!Blockbench.Animation.selected){Blockbench.showQuickMessage(\"No animation selected\");return}OO(Blockbench.Animation.selected)}});St({id:\"animated-java:property-definitions/animation\",apply:()=>({excludedNodesProperty:new Property(Blockbench.Animation,\"array\",\"excluded_nodes\",{condition:()=>Fe(),label:A(\"animation.excluded_nodes\"),default:[]})}),revert:({excludedNodesProperty:t})=>{t.delete()}});Nt({id:\"animated-java:animation-force-saved\",object:Blockbench.Animation.prototype,key:\"saved\",condition:()=>Fe(),get:()=>!0});Nt({id:\"animated-java:action-condition-override/save-all-animations\",object:BarItems.save_all_animations,key:\"condition\",condition:()=>Fe(),get:()=>!1});Nt({id:\"animated-java:animation-controller-force-saved\",object:AnimationController.prototype,key:\"saved\",condition:()=>Fe(),get:()=>!0});Dy({id:\"animated-java:camera-plugin/camera-name-sanitization\",condition:t=>t.id===\"cameras\",apply:()=>{let t=OutlinerElement.types.camera,e=t.prototype.saveName;t.prototype.saveName=function(i){return Fe()&&(this.name=Ea(this.name,this.uuid)),e.call(this,i)};let n=t.prototype.sanitizeName;return t.prototype.sanitizeName=function(){return Fe()&&(this.name=Ea(this.name,this.uuid)),n.call(this)},{camera:t,originalRename:e,originalSanitize:n}},revert:({camera:t,originalRename:e,originalSanitize:n})=>{t.prototype.rename=e,t.prototype.sanitizeName=n}});Nt({id:\"animated-java:property-condition-override/collection/export-path\",object:Collection.properties.export_path,key:\"condition\",condition:()=>Fe(),get:()=>!1});function V3e(t){let e,n;return{c(){e=L(\"img\"),Ht(e.src,n=ya)||E(e,\"src\",n),E(e,\"alt\",\"\"),E(e,\"class\",\"svelte-1wuqa5\")},m(i,a){U(i,e,a)},p:ie,i:ie,o:ie,d(i){i&&z(e)}}}s(V3e,\"create_fragment\");var cg=class extends Pe{constructor(e){super(),Ve(this,e,null,V3e,De,{})}};s(cg,\"Icon\");var H6=cg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"img.svelte-1wuqa5{border-radius:4px;width:24px;height:24px;margin-left:0.5px;margin-top:2px;box-shadow:1px 1px 1px #000000aa}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();yp({id:\"animated-java:injected-svelte/format-icon\",component:H6,target:`li[format=\"${Qt}\"] span`,replaceChildren:!0});St({id:\"animated-java:prioritize-animated-java-formats\",apply:()=>{let t=setInterval(()=>{let e=$(\"li.format_category > label:contains('Animated Java')\").first().parent();if(e.length===0)return;let n=$(\"li.format_category > label:contains('General')\").first().parent();e.insertBefore(n),clearInterval(t)},16)},revert:()=>{}});iu({id:\"animated-java:event-hook/external-plugin-load/load\",object:BBPlugin.prototype,key:\"load\",get:t=>function(){let e=t.call(this);return console.log(\"Loaded plugin:\",this.id),K.EXTERNAL_PLUGIN_LOAD.publish(this),e}});iu({id:\"animated-java:event-hook/external-plugin-load/toggle-disabled\",object:BBPlugin.prototype,key:\"toggleDisabled\",get:t=>function(){let e=t.call(this);return this.disabled||(console.log(\"Enabled plugin:\",this.id),K.EXTERNAL_PLUGIN_LOAD.publish(this)),e}});iu({id:\"animated-java:event-hook/external-plugin-unload/unload\",object:BBPlugin.prototype,key:\"unload\",get:t=>function(){let e=t.call(this);return console.log(\"Unloaded plugin:\",this.id),K.EXTERNAL_PLUGIN_UNLOAD.publish(this),e}});iu({id:\"animated-java:event-hook/pre-post-select-project-event\",object:ModelProject.prototype,key:\"loadEditorState\",get:t=>function(){K.PRE_SELECT_PROJECT.publish(this);let e=t.call(this);return K.POST_SELECT_PROJECT.publish(this),e}});var J6=`dialog.dialog p code {\\r\n\tpadding: 2px 6px;\\r\n\tborder: none;\\r\n\tfont-size: smaller;\\r\n}\\r\n\\r\ndialog.dialog pre:has(code) {\\r\n\tbackground-color: var(--color-back);\\r\n\tpadding: 4px 7px;\\r\n\tfont-size: smaller;\\r\n\tuser-select: text;\\r\n\twhite-space: pre-wrap;\\r\n}\\r\n\\r\n#collection_properties_vue > ul > li {\\r\n\tmax-width: unset !important;\\r\n}\\r\n\\r\n#edit_history_list ul li {\\r\n\theight: unset !important;\\r\n}\\r\n\\r\n#edit_history_list > ul > li label {\\r\n\tmargin-right: auto !important;\\r\n\toverflow-x: auto !important;\\r\n\twhite-space: nowrap !important;\\r\n\tmax-width: 75% !important;\\r\n}\\r\n`;St({id:\"animated-java:global-css\",apply:()=>Blockbench.addCSS(J6),revert:t=>{t.delete()}});St({id:\"animated-java:bone-properties\",apply:()=>({properties:[new Property(Group,\"string\",\"onSummonFunction\",{condition:Fe,default:\"\"}),new Ga(Group,\"configs\",{condition:Fe,default:()=>({default:new wt().toJSON(),variants:{}})})]}),revert:({properties:t})=>{t.forEach(e=>e.delete())}});Nt({id:\"animated-java:override-function/group/save-name\",object:Group.prototype,key:\"saveName\",condition:()=>Fe(),get:t=>function(e){return this.name=Ea(this.name,this.uuid),t.call(this,e)}});Nt({id:\"animated-java:override-function/group/sanitize-name\",object:Group.prototype,key:\"sanitizeName\",condition:()=>Fe(),get:t=>function(){return this.name=Ea(this.name,this.uuid),t.call(this)}});function U3e(t,e,n){return n*(e-t)+t}s(U3e,\"lerp\");St({id:\"animated-java:keyframe-easing\",apply:()=>{let t=[new Property(Blockbench.Keyframe,\"string\",\"easing\",{default:QO,condition:()=>Fe()}),new Property(Blockbench.Keyframe,\"array\",\"easingArgs\",{condition:()=>Fe()})],e=Blockbench.Keyframe.prototype.getLerp;return Blockbench.Keyframe.prototype.getLerp=function(n,i,a,r){let o=n.easing??\"linear\";if(!Fe()||o===\"linear\")return e.call(this,n,i,a,r);let l=Mb[o];if(pl(o)){let m=Array.isArray(n.easingArgs)&&n.easingArgs.length>0?n.easingArgs[0]:Xh(n);l=l.bind(null,m??0)}let c=l(a),d=this.calc(i),u=n.calc(i),p=U3e(d,u,c);if(Number.isNaN(p))throw new Error(\"Invalid easing function or arguments.\");return p},{properties:t,originalGetLerp:e}},revert:({properties:t,originalGetLerp:e})=>{for(let n of t)n.delete();Blockbench.Keyframe.prototype.getLerp=e}});function q3e(t){return!t||t.startsWith(\"easeInOut\")?t:t.startsWith(\"easeIn\")?t.replace(\"easeIn\",\"easeOut\"):t.startsWith(\"easeOut\")?t.replace(\"easeOut\",\"easeIn\"):t}s(q3e,\"reverseEasing\");Nt({id:\"animated-java:action-click-override/reverse-keyframes\",object:BarItems.reverse_keyframes,key:\"click\",condition:()=>Fe(),get:t=>e=>{t(e),Undo.initEdit({keyframes:Timeline.selected||void 0});let n={};for(let a of Timeline.selected||[])n[a.animator.uuid]??=[],n[a.animator.uuid].push(a);let i={};for(let[a,r]of Object.entries(n)){let o={};i[a]=o;for(let l of r)o[l.channel]??=[],o[l.channel].push(l)}for(let a of Object.values(i))for(let r of Object.values(a)){r.sort((l,c)=>l.time-c.time);let o=r.map(l=>({easing:q3e(l.easing),easingArgs:l.easingArgs}));r.forEach((l,c)=>{if(c==0){l.easing=void 0,l.easingArgs=void 0;return}let d=o[c-1];l.easing=d.easing,l.easingArgs=d.easingArgs})}Undo.finishEdit(\"Reverse keyframe easing\"),updateKeyframeSelection(),Animator.preview()}});var Zc=class extends BoneAnimator{uuid;element;constructor(e,n,i){super(e,n,i),this.uuid=e}getElement(){return this.element=OutlinerNode.uuids[this.uuid],this.element}select(){if(this.getElement(),!this.element)return unselectAllElements(),this;if(this.element.locked)return this;if(this.element.selected!==!0&&this.element&&this.element.select(),GeneralAnimator.prototype.select.call(this),this[Toolbox.selected.animation_channel]&&(Timeline.selected&&Timeline.selected.length===0||(Timeline.selected&&Timeline.selected[0].animator)!==this)){let e;this[Toolbox.selected.animation_channel].forEach(n=>{Math.abs(n.time-Timeline.time)<.002&&(e=n)}),e&&e.select()}return this.element?.parent&&this.element.parent!==\"root\"&&this.element.parent.openUp(),this}doRender(){return this.getElement(),!!this.element?.mesh}displayPosition(e,n=1){let i=this.element.mesh;return e&&(i.position.x-=e[0]*n,i.position.y+=e[1]*n,i.position.z+=e[2]*n),this}interpolate(){return[0,0,0]}displayFrame(){this.doRender()&&this.getElement()}showMotionTrail(){}};s(Zc,\"LocatorAnimator\");Zc.prototype.type=\"locator\";Zc.prototype.channels={function:{name:A(\"effect_animator.timeline.function\"),mutable:!0,transform:!0,max_data_points:1}};Nt({id:\"animated-java:property-override/locator/animator\",object:Locator,key:\"animator\",condition:()=>Fe(),get:()=>Zc});Nt({id:\"animated-java:function-override/locator/select\",object:Locator.prototype,key:\"select\",condition:()=>Fe(),get:t=>function(e,n){let i=t.call(this,e,n);return Animator.open&&Blockbench.Animation.selected&&Blockbench.Animation.selected.getBoneAnimator().select(),i}});Nt({id:\"animated-java:function-override/animator/show-motion-trail\",object:Animator,key:\"showMotionTrail\",condition:()=>Fe(),get:t=>function(e){if(!(!e||e instanceof Locator))return t(e)}});Nt({id:\"animated-java:function-override/animator/preview\",object:Animator,key:\"preview\",condition:()=>Fe(),get:t=>function(e){let n=t(e);return Mode.selected.id===Modes.options.animate.id&&Outliner.selected[0]instanceof Locator&&(Canvas.gizmos[0].visible=!1,Transformer.visible=!1),n}});da({id:\"animated-java:project-mod/locator-animator/hide-gizmos\",condition:t=>t.format.id===Qt,apply:()=>({unsub:K.UPDATE_SELECTION.subscribe(()=>{Mode.selected.id===Modes.options.animate.id&&selected.at(0)instanceof Locator&&(Canvas.gizmos[0].visible=!1,Transformer.visible=!1)})}),revert:({unsub:t})=>{t()}});St({id:\"animated-java:locator-properties\",apply:()=>({config:new Property(Locator,\"instance\",\"config\",{condition:Fe,default:void 0})}),revert:({config:t})=>{t?.delete()}});St({id:\"animated-java:model-format-convert-to-mod\",apply:()=>{let t=ModelFormat.prototype.convertTo;return ModelFormat.prototype.convertTo=function(){let e=t.call(this);return this.id===Qt&&ES(),e},{original:t}},revert:({original:t})=>{ModelFormat.prototype.convertTo=t}});var G6={\"smoothmin(a, b, k)\":`v.h = math.clamp(0.5 + (0.5 * (a - b) / k), 0, 1);\nreturn math.lerp(a, b, v.h) - (k * v.h * (1 - v.h));`,\"smoothclamp(value, min, max, k)\":\"return lunar.smoothmin(lunar.smoothmin(value, min, -k), max, k);\",\"lopsided_wave(value, lopside_mag)\":\"return math.sin(value + math.cos(value) * lopside_mag);\",\"easeinsine(progress)\":\"return 1 - math.cos((progress * 180) / 2);\",\"easeoutsine(progress)\":\"return math.sin((progress * 180) / 2);\",\"easeinoutsine(progress)\":\"return(math.cos(180 * progress) - 1) * -1 / 2;\",\"easeinquad(progress)\":\"return progress * progress;\",\"easeoutquad(progress)\":\"return 1 - (1 - progress) * (1 - progress);\",\"easeinoutquad(progress)\":`return progress < 0.5\n   ? 2 * progress * progress\n   : 1 - math.pow(-2 * progress + 2, 2) / 2;`,\"easeincubic(progress)\":\"return progress * progress * progress;\",\"easeoutcubic(progress)\":\"return 1 - math.pow(1 - progress, 3);\",\"easeinoutcubic(progress)\":`return progress < 0.5\n   ? 4 * progress * progress * progress\n   : 1 - math.pow(-2 * progress + 2, 3) / 2;`,\"easeinquart(progress)\":\"return progress * progress * progress * progress;\",\"easeoutquart(progress)\":\"return 1 - math.pow(1 - progress, 4);\",\"easeinoutquart(progress)\":`return progress < 0.5\n   ? 8 * progress * progress * progress * progress\n   : 1 - math.pow(-2 * progress + 2, 4) / 2;`,\"easeinquint(progress)\":\"return progress * progress * progress * progress * progress;\",\"easeoutquint(progress)\":\"return 1 - math.pow(1 - progress, 5);\",\"easeinoutquint(progress)\":`return progress < 0.5\n   ? 16 * progress * progress * progress * progress * progress\n   : 1 - math.pow(-2 * progress + 2, 5) / 2;`,\"easeinexpo(progress)\":`return progress == 0\n   ? 0\n   : math.pow(2, 10 * progress - 10);`,\"easeoutexpo(progress)\":`return progress == 1\n   ? 1\n   : 1 - math.pow(2, -10 * progress);`,\"easeinoutexpo(progress)\":`return progress == 0\n   ? 0\n   : progress == 1\n      ? 1\n      : progress < 0.5\n         ? math.pow(2, 20 * progress - 10) / 2\n         : (2 - math.pow(2, -20 * progress + 10)) / 2;`,\"easeincirc(progress)\":\"return math.sqrt(1 - math.pow(progress - 1, 2));\",\"easeoutcirc(progress)\":\"return math.sqrt(1 - math.pow(progress - 1, 2));\",\"easeinoutcirc(progress)\":`return progress < 0.5\n   ? (1 - math.sqrt(1 - math.pow(2 * progress, 2))) / 2\n   : (math.sqrt(1 - math.pow(-2 * progress + 2, 2)) + 1) / 2;`,\"easeinback(progress, overshoot)\":`t.overshoot=1.70158 * (overshoot ?? 1);\nreturn (t.overshoot + 1) * progress * progress * progress - t.overshoot * progress * progress;`,\"easeoutback(progress, overshoot)\":`t.overshoot=1.70158 * (overshoot ?? 1);\nreturn 1 + (t.overshoot + 1) * math.pow(progress - 1, 3) + t.overshoot * math.pow(progress - 1, 2);`,\"easeinoutback(progress, overshoot)\":`t.overshoot=1.70158 * (overshoot ?? 1);\nt.c2 = t.overshoot + 1;\nreturn progress < 0.5\n   ? (math.pow(2 * progress, 2) * ((t.c2 + 1) * 2 * progress - t.c2)) / 2\n   : (math.pow(2 * progress - 2, 2) * ((t.c2 + 1) * (progress * 2 - 2) + t.c2) + 2) / 2;`,\"easeinelastic(progress)\":`return progress == 0\n   ? 0\n   : progress == 1\n      ? 1\n      : -math.pow(2, 10 * progress - 10) * math.sin((progress * 10 - 10.75) * 90);`,\"easeoutelastic(progress)\":`return progress == 0\n   ? 0\n   : progress == 1\n      ? 1\n      : math.pow(2, -10 * progress) * math.sin((progress * 10 - 0.75) * 90) + 1;`,\"easeinoutelastic(progress)\":`return progress == 0\n   ? 0\n   : progress == 1\n      ? 1\n      : progress < 0.5\n         ? (math.pow(2, 20 * progress - 10) * math.sin((20 * progress - 11.125) * 90) * -1) / 2\n         : (math.pow(2, -20 * progress + 10) * math.sin((20 * progress - 11.125) * 90)) / 2 + 1;`,\"easeinbounce(progress)\":\"return 1 - easeoutbounce(1 - progress);\",\"easeoutbounce(progress)\":`t.n1=7.5625;\nt.d1=2.75;\nreturn progress < 1 / t.d1\n   ? (t.n1 * progress * progress)\n   : progress < 2 / t.d1\n      ? {\n         progress = progress - 1.5 / t.d1;\n         t.n1 * progress * progress + 0.75;\n      }\n      : progress < 2.5 / t.d1\n         ? {\n            progress = progress - 2.25 / t.d1;\n            t.n1 * progress * progress + 0.9375;\n         }\n         : {\n            progress = progress - 2.625 / t.d1;\n            t.n1 * progress * progress + 0.984375;\n         };`,\"easeinoutbounce(progress)\":`return progress < 0.5\n   ? 1-easeinbounce(1-2 * progress) / 2\n   : 1 + easeoutbounce(2 * progress - 1) / 2;`,\"linear_wave(progress, hang)\":`t.progress = progress * (math.pi / 180) + math.pi * 600;\nt.hang = hang * (math.pi / 180);\nreturn math.mod(math.abs(t.progress), 2 * math.pi + t.hang * 2) > math.pi + t.hang\n   ? math.clamp(-math.mod(math.abs(t.progress), math.pi + t.hang) / math.pi + 1, 0, 1)\n   : math.clamp(math.mod(math.abs(t.progress), math.pi + t.hang) / math.pi, 0, 1);`};var W6=Animator.MolangParser.global_variables,J3e=[\"true\",\"false\",\"math.\",\"query.\",\"variable.\",\"temp.\",\"context.\",\"this\",\"loop()\",\"return\",\"break\",\"continue\"],G3e=[\"all_animations_finished\",\"any_animation_finished\",\"anim_time\",\"life_time\",\"yaw_speed\",\"ground_speed\",\"vertical_speed\",\"property\",\"has_property()\",\"variant\",\"mark_variant\",\"skin_id\",\"above_top_solid\",\"actor_count\",\"all()\",\"all_tags\",\"anger_level\",\"any()\",\"any_tag\",\"approx_eq()\",\"armor_color_slot\",\"armor_material_slot\",\"armor_texture_slot\",\"average_frame_time\",\"blocking\",\"body_x_rotation\",\"body_y_rotation\",\"bone_aabb\",\"bone_origin\",\"bone_rotation\",\"camera_distance_range_lerp\",\"camera_rotation()\",\"can_climb\",\"can_damage_nearby_mobs\",\"can_dash\",\"can_fly\",\"can_power_jump\",\"can_swim\",\"can_walk\",\"cape_flap_amount\",\"cardinal_facing\",\"cardinal_facing_2d\",\"cardinal_player_facing\",\"combine_entities()\",\"count\",\"current_squish_value\",\"dash_cooldown_progress\",\"day\",\"death_ticks\",\"debug_output\",\"delta_time\",\"distance_from_camera\",\"effect_emitter_count\",\"effect_particle_count\",\"equipment_count\",\"equipped_item_all_tags\",\"equipped_item_any_tag()\",\"equipped_item_is_attachable\",\"eye_target_x_rotation\",\"eye_target_y_rotation\",\"facing_target_to_range_attack\",\"frame_alpha\",\"get_actor_info_id\",\"get_animation_frame\",\"get_default_bone_pivot\",\"get_locator_offset\",\"get_root_locator_offset\",\"had_component_group()\",\"has_any_family()\",\"has_armor_slot\",\"has_biome_tag\",\"has_block_property\",\"has_cape\",\"has_collision\",\"has_dash_cooldown\",\"has_gravity\",\"has_owner\",\"has_rider\",\"has_target\",\"head_roll_angle\",\"head_x_rotation\",\"head_y_rotation\",\"health\",\"heartbeat_interval\",\"heartbeat_phase\",\"heightmap\",\"hurt_direction\",\"hurt_time\",\"in_range()\",\"invulnerable_ticks\",\"is_admiring\",\"is_alive\",\"is_angry\",\"is_attached_to_entity\",\"is_avoiding_block\",\"is_avoiding_mobs\",\"is_baby\",\"is_breathing\",\"is_bribed\",\"is_carrying_block\",\"is_casting\",\"is_celebrating\",\"is_celebrating_special\",\"is_charged\",\"is_charging\",\"is_chested\",\"is_critical\",\"is_croaking\",\"is_dancing\",\"is_delayed_attacking\",\"is_digging\",\"is_eating\",\"is_eating_mob\",\"is_elder\",\"is_emerging\",\"is_emoting\",\"is_enchanted\",\"is_fire_immune\",\"is_first_person\",\"is_ghost\",\"is_gliding\",\"is_grazing\",\"is_idling\",\"is_ignited\",\"is_illager_captain\",\"is_in_contact_with_water\",\"is_in_love\",\"is_in_ui\",\"is_in_water\",\"is_in_water_or_rain\",\"is_interested\",\"is_invisible\",\"is_item_equipped\",\"is_item_name_any()\",\"is_jump_goal_jumping\",\"is_jumping\",\"is_laying_down\",\"is_laying_egg\",\"is_leashed\",\"is_levitating\",\"is_lingering\",\"is_moving\",\"is_name_any()\",\"is_on_fire\",\"is_on_ground\",\"is_on_screen\",\"is_onfire\",\"is_orphaned\",\"is_owner_identifier_any()\",\"is_persona_or_premium_skin\",\"is_playing_dead\",\"is_powered\",\"is_pregnant\",\"is_ram_attacking\",\"is_resting\",\"is_riding\",\"is_roaring\",\"is_rolling\",\"is_saddled\",\"is_scared\",\"is_selected_item\",\"is_shaking\",\"is_shaking_wetness\",\"is_sheared\",\"is_shield_powered\",\"is_silent\",\"is_sitting\",\"is_sleeping\",\"is_sneaking\",\"is_sneezing\",\"is_sniffing\",\"is_sonic_boom\",\"is_spectator\",\"is_sprinting\",\"is_stackable\",\"is_stalking\",\"is_standing\",\"is_stunned\",\"is_swimming\",\"is_tamed\",\"is_transforming\",\"is_using_item\",\"is_wall_climbing\",\"item_in_use_duration\",\"item_is_charged\",\"item_max_use_duration\",\"item_remaining_use_duration\",\"item_slot_to_bone_name()\",\"key_frame_lerp_time\",\"last_frame_time\",\"last_hit_by_player\",\"lie_amount\",\"life_span\",\"lod_index\",\"log\",\"main_hand_item_max_duration\",\"main_hand_item_use_duration\",\"max_durability\",\"max_health\",\"max_trade_tier\",\"maximum_frame_time\",\"minimum_frame_time\",\"model_scale\",\"modified_distance_moved\",\"modified_move_speed\",\"moon_brightness\",\"moon_phase\",\"movement_direction\",\"noise\",\"on_fire_time\",\"out_of_control\",\"player_level\",\"position()\",\"position_delta()\",\"previous_squish_value\",\"remaining_durability\",\"roll_counter\",\"rotation_to_camera()\",\"shake_angle\",\"shake_time\",\"shield_blocking_bob\",\"show_bottom\",\"sit_amount\",\"sleep_rotation\",\"sneeze_counter\",\"spellcolor\",\"standing_scale\",\"structural_integrity\",\"surface_particle_color\",\"surface_particle_texture_coordinate\",\"surface_particle_texture_size\",\"swell_amount\",\"swelling_dir\",\"swim_amount\",\"tail_angle\",\"target_x_rotation\",\"target_y_rotation\",\"texture_frame_index\",\"time_of_day\",\"time_since_last_vibration_detection\",\"time_stamp\",\"total_emitter_count\",\"total_particle_count\",\"trade_tier\",\"unhappy_counter\",\"walk_distance\",\"wing_flap_position\",\"wing_flap_speed\"],W3e={\"in_range()\":\"in_range( value, min, max )\",\"all()\":\"in_range( value, values... )\",\"any()\":\"in_range( value, values... )\",\"approx_eq()\":\"in_range( value, values... )\"},K3e=[\"item_slot\",\"block_face\",\"cardinal_block_face_placed_on\",\"is_first_person\",\"owning_entity\",\"player_offhand_arm_height\",\"other\",\"count\"],Y3e=[\"attack_time\",\"is_first_person\"],X3e=[\"sin()\",\"cos()\",\"abs()\",\"clamp()\",\"pow()\",\"sqrt()\",\"random()\",\"ceil()\",\"round()\",\"trunc()\",\"floor()\",\"mod()\",\"min()\",\"max()\",\"exp()\",\"ln()\",\"lerp()\",\"lerprotate()\",\"pi\",\"asin()\",\"acos()\",\"atan()\",\"atan2()\",\"die_roll()\",\"die_roll_integer()\",\"hermite_blend()\",\"random_integer()\"],Z3e={\"clamp()\":\"clamp( value, min, max )\",\"pow()\":\"pow( base, exponent )\",\"random()\":\"random( low, high )\",\"mod()\":\"mod( value, denominator )\",\"min()\":\"min( A, B )\",\"max()\":\"max( A, B )\",\"lerp()\":\"lerp( start, end, 0_to_1 )\",\"lerprotate()\":\"lerprotate( start, end, 0_to_1 )\",\"atan2()\":\"atan2( y, x )\",\"die_roll()\":\"die_roll( num, low, high )\",\"die_roll_integer()\":\"die_roll_integer( num, low, high )\",\"random_integer()\":\"random_integer( low, high )\",\"hermite_blend()\":\"hermite_blend( 0_to_1 )\"},uy={},dy={};for(let[t,e]of Object.entries(G6)){let n=/^(.+?)\\((.*?)\\)$/.exec(t);if(!n)continue;let i=n[1],a=n[2].split(\",\").map(r=>r.trim());uy[i]=(...r)=>{let o={};for(let l=0;l<r.length;l++)o[a[l]]=r[l]||0;return Animator.MolangParser.parse(e,o)},dy[i]=i+\"( \"+a.join(\", \")+\" )\"}function Q3e(t){let e=new Set;return getAllMolangExpressions().forEach(i=>{if(!i.value)return;let a=i.value.match(/(v|variable)\\.\\w+/gi);a&&a.forEach(r=>{let o=r.substring(r.indexOf(\".\")+1);o!==t&&e.add(o)})}),e}s(Q3e,\"getProjectVariables\");function Qc(t,e,n=!1,i=void 0){let a=t.filter(r=>r.startsWith(e)&&r.length!=e.length);return t.forEach(r=>{!a.includes(r)&&r.includes(e)&&r.length!=e.length&&a.push(r)}),n&&n.forEach(r=>a.remove(r)),a.map(r=>({text:r,label:i?.[r],overlap:e.length}))}s(Qc,\"filterAndSortList\");da({id:\"animated-java:molang-mod\",condition:t=>t.format.id===Qt,apply:()=>{Object.assign(W6,uy);let t=Animator.autocompleteMolang;return Animator.autocompleteMolang=function(e,n,i){let a=e.substring(0,n).split(/[^a-zA-Z_.]\\.*/g).last();if(!a)return[];if(a=a.toLowerCase(),a.includes(\".\")){let[r,o]=a.split(\".\");if(r==\"math\")return Qc(X3e,o,void 0,Z3e);if(r==\"query\"||r==\"q\")return Qc(G3e,o,i!==\"controller\"&&[\"all_animations_finished\",\"any_animation_finished\"],W3e);if(r==\"temp\"||r==\"t\"){let l=e.match(/([^a-z]|^)t(emp)?\\.\\w+/gi);if(l){let c=l.map(u=>u.split(\".\")[1]),d=c.filter((u,p)=>u!==o&&c.indexOf(u)===p);return Qc(d,o)}}if(r==\"context\"||r==\"c\")return Qc([...K3e],o);if(r==\"variable\"||r==\"v\"){let l=[...Q3e(o)];return l.safePush(...Y3e),Qc(l,o)}}else{let r=J3e.slice(),o={};return i===\"placeholders\"&&(o={\"toggle()\":\"toggle( name )\",\"slider()\":\"slider( name, step?, min?, max? )\",\"impulse()\":\"impulse( name, duration )\"},r.push(...Object.keys(o))),Qc([...r,...Object.keys(dy)],a,void 0,{...o,...dy})}return[]},{originalAutocompleteMolang:t}},revert:({originalAutocompleteMolang:t})=>{for(let e of Object.keys(uy))delete W6[e];Animator.autocompleteMolang=t}});St({id:\"animated-java:append-toolbar/outliner/add-locator-action\",apply:()=>{let t=BarItems.add_locator;return Toolbars.outliner.add(t,0),{action:t}},revert:({action:t})=>{Toolbars.outliner.remove(t)}});St({id:\"animated-java:panel-mod\",apply:()=>{let t=Interface.Panels.animations,e=t.inside_vue.$options.computed.files;return t.inside_vue.$options.computed.files=function(){return Fe()?{\"\":{animations:[...Blockbench.Animation.all,...Blockbench.AnimationController.all],name:\"\",hide_head:!0}}:e.call(this)},{panel:t,originalFilesFunction:e}},revert:({panel:t,originalFilesFunction:e})=>{t.inside_vue.$options.computed.files=e}});function $3e(t){let e,n,i,a,r=pureMarked(A(\"plugin_dialog.incompatability_notice\"))+\"\";return{c(){e=L(\"div\"),n=L(\"i\"),n.textContent=\"warning\",i=J(),a=L(\"div\"),E(n,\"class\",\"material-icons icon svelte-18kkwsp\"),E(a,\"class\",\"description svelte-18kkwsp\"),E(e,\"class\",\"incompatible_plugin_notice svelte-18kkwsp\")},m(o,l){U(o,e,l),I(e,n),I(e,i),I(e,a),a.innerHTML=r},p:ie,d(o){o&&z(e)}}}s($3e,\"create_if_block\");function e2e(t){let e,n=t[0]&&$3e(t);return{c(){n&&n.c(),e=_t()},m(i,a){n&&n.m(i,a),U(i,e,a)},p(i,[a]){i[0]&&n.p(i,a)},i:ie,o:ie,d(i){n&&n.d(i),i&&z(e)}}}s(e2e,\"create_fragment\");var ug=s(t=>jQuery(`.plugin_browser_page_header button:has(span:contains(\"${t}\"))`)[0],\"getButton\");function t2e(t,e,n){let{selectedPlugin:i}=e,a=!!i&&ly(i),r=s(()=>{requestAnimationFrame(()=>{let l=ug(tl(\"dialog.plugins.install\"));l&&(l.disabled=!!a,l.title=A(\"plugin_dialog.incompatability_notice\"));let c=ug(tl(\"dialog.plugins.enable\"));c&&(c.disabled=!!a,c.title=A(\"plugin_dialog.incompatability_notice\"));let d=ug(tl(\"dialog.plugins.uninstall\"));d&&(d.disabled=!1);let u=ug(tl(\"dialog.plugins.disable\"));u&&(u.disabled=!1)})},\"updateButtons\");r();let o=[K.EXTERNAL_PLUGIN_LOAD.subscribe(r),K.EXTERNAL_PLUGIN_UNLOAD.subscribe(r)];return Zi(()=>{o.forEach(l=>l())}),t.$$set=l=>{\"selectedPlugin\"in l&&n(1,i=l.selectedPlugin)},[a,i]}s(t2e,\"instance\");var dg=class extends Pe{constructor(e){super(),Ve(this,e,t2e,e2e,De,{selectedPlugin:1})}};s(dg,\"IncompatiblePluginNotice\");var K6=dg;(()=>{var t;K.PLUGIN_LOAD.subscribe(()=>t=Blockbench.addCSS(\"div.plugin_browser_page_header button:has(span):disabled{opacity:0.5 !important;cursor:not-allowed !important}div.plugin_browser_page_header > button:has(span):disabled:hover{color:var(--color-subtle_text) !important;background-color:var(--color-ui) !important}div.incompatible_plugin_notice.svelte-18kkwsp{display:flex;flex-direction:row;color:var(--color-warning);font-size:20px;border:2px solid;background-color:var(--color-button);margin-top:12px;padding:4px}i.svelte-18kkwsp{margin:5px}div.description.svelte-18kkwsp{display:flex;flex-direction:column;margin-left:5px}\")),K.PLUGIN_UNLOAD.subscribe(()=>t?.delete())})();var Y6=new ke(null);St({id:\"animated-java:plugins-dialog-mod\",apply:()=>{let t=Plugins.dialog.component.methods.selectPlugin;return Plugins.dialog.component.methods.selectPlugin=function(e){let n=t.call(this,e);return Y6.set(e),n},{original:t}},revert:({original:t})=>{Plugins.dialog.component.methods.selectPlugin=t}});var fp=null;Y6.subscribe(t=>{fp&&(fp.$destroy(),fp=null),t&&requestAnimationFrame(()=>{fp=Gn({component:K6,props:{selectedPlugin:t},target:\".plugin_browser_page_header\",prepend:!0,onDestroy:()=>{fp=null}})})});St({id:\"animated-java:show-default-pose\",apply:()=>{let t=Animator.showDefaultPose;return Animator.showDefaultPose=function(e){if(!Fe())return t(e);let n=[...Group.all,...Outliner.elements];for(let i of n){if(!i.constructor.animator)continue;let a=i.mesh;a.fix_rotation&&a.rotation.copy(a.fix_rotation),a.fix_position&&a.position.copy(a.fix_position),a.fix_scale?a.scale.copy(a.fix_scale):i.constructor.animator.prototype.channels?.scale&&(a.scale.x=a.scale.y=a.scale.z=1)}e||scene.updateMatrixWorld()},{original:t}},revert:({original:t})=>{Animator.showDefaultPose=t}});St({id:\"animated-java:variant-preview-cube-face\",apply:()=>{let t=CubeFace.prototype.getTexture;return CubeFace.prototype.getTexture=function(){if(Fe()&&this.texture){let e=qe.selected;if(e&&this.cube.parent instanceof Group&&!e.excludedNodes.find(n=>n.value===this.cube.parent.uuid)&&e.textureMap.has(this.texture))return this.lastVariant=e,e.textureMap.getMappedTexture(this.texture);if(Mode.selected.id===Modes.options.animate.id&&this.lastVariant&&!e?.isDefault)return this.lastVariant.textureMap.getMappedTexture(this.texture)}return this.lastVariant=void 0,t.call(this)},{original:t}},revert:({original:t})=>{CubeFace.prototype.getTexture=t}});var n2e={parseResourcePackPath:Sa,datapackCompiler:Gd,resourcepackCompiler:Yd,Variant:qe,MINECRAFT_REGISTRY:Xn,openExportProgressDialog:qf,isResourcePackPath:qr,isDataPackPath:CS,blueprintSettingErrors:bo,openUnexpectedErrorDialog:Fo,BLUEPRINT_FORMAT:ss,BLUEPRINT_CODEC:Hr,TextDisplay:ve,getLatestVersionClientDownloadUrl:yh,getVanillaFont:_c,assetManager:mf,itemModelManager:Nx,blockModelManager:Px,VanillaItemDisplay:We,VanillaBlockDisplay:$e,debugBlocks:TT,debugBlockState:CT,BLOCKSTATE_REGISTRY:yc,exportProject:zc,openInstallPopup:cy,removeCubesAssociatedWithTexture(t){let e=Cube.all.filter(n=>Object.values(n.faces).some(i=>i.texture===t.uuid));Undo.initEdit({elements:e,outliner:!0,textures:[t]}),e.forEach(n=>n.remove()),t.remove(),Undo.finishEdit(\"Remove Cubes Associated With Texture\")},cleanupExportedFiles:Eh,mcbFiles:wo,openChangelogDialog:Qd,checkForIncompatabilities:sg,toSmallCharacters:Ca,printMinecraftFontSheet:()=>Mi(\"assets/minecraft/font/include/default.json\").providers[0].chars.map((e,n)=>`${n}: `+e.split(\"\").join(\" \")),TELLRAW:mh,JsonText:jt,getBlockState:wc};window.AnimatedJava=n2e;K.EXTRACT_MODS.subscribe(()=>{delete window.AnimatedJava});BBPlugin.register(Ke.name,{title:Ke.title,author:Ke.author.name,description:Ke.description,icon:\"icon.svg\",variant:\"desktop\",version:Ke.version,min_version:Ke.min_blockbench_version,tags:[\"Minecraft: Java Edition\",\"Animation\",\"Display Entities\"],await_loading:!0,onload(){requestAnimationFrame(()=>{K.PLUGIN_LOAD.publish()})},onunload(){K.PLUGIN_UNLOAD.publish()},oninstall(){K.PLUGIN_INSTALL.publish(),cy()},onuninstall(){K.PLUGIN_UNINSTALL.publish(),Blockbench.showMessageBox({title:\"Animated Java has Been Uninstalled!\",message:\"In order to fully uninstall Animated Java, please restart Blockbench.\",buttons:[\"OK\"]})}});K.PLUGIN_FINISHED_LOADING.subscribe(()=>{if(sg())return;localStorage.getItem(\"animated-java-last-version\")!==Ke.version&&(localStorage.setItem(\"animated-java-last-version\",Ke.version),Qd())});})();\n/*! Bundled license information:\n\nsafe-buffer/index.js:\n  (*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)\n\ncontent-disposition/index.js:\n  (*!\n   * content-disposition\n   * Copyright(c) 2014-2017 Douglas Christopher Wilson\n   * MIT Licensed\n   *)\n\nobject-assign/index.js:\n  (*\n  object-assign\n  (c) Sindre Sorhus\n  @license MIT\n  *)\n\nis-natural-number/index.js:\n  (*!\n   * is-natural-number.js | MIT (c) Shinnosuke Watanabe\n   * https://github.com/shinnn/is-natural-number.js\n  *)\n\nstrip-dirs/index.js:\n  (*!\n   * strip-dirs | MIT (c) Shinnosuke Watanabe\n   * https://github.com/shinnn/node-strip-dirs\n  *)\n\nhas-symbol-support-x/index.js:\n  (**\n   * @file Tests if ES6 Symbol is supported.\n   * @version 1.4.2\n   * @author Xotic750 <Xotic750@gmail.com>\n   * @copyright  Xotic750\n   * @license {@link <https://opensource.org/licenses/MIT> MIT}\n   * @module has-symbol-support-x\n   *)\n\nhas-to-string-tag-x/index.js:\n  (**\n   * @file Tests if ES6 @@toStringTag is supported.\n   * @see {@link http://www.ecma-international.org/ecma-262/6.0/#sec-@@tostringtag|26.3.1 @@toStringTag}\n   * @version 1.4.1\n   * @author Xotic750 <Xotic750@gmail.com>\n   * @copyright  Xotic750\n   * @license {@link <https://opensource.org/licenses/MIT> MIT}\n   * @module has-to-string-tag-x\n   *)\n\nmime-db/index.js:\n  (*!\n   * mime-db\n   * Copyright(c) 2014 Jonathan Ong\n   * Copyright(c) 2015-2022 Douglas Christopher Wilson\n   * MIT Licensed\n   *)\n\npako/dist/pako.esm.mjs:\n  (*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) *)\n*/\n"
  },
  {
    "path": "plugins/animated_java/changelog.json",
    "content": "{\n\t\"1.6.0\": {\n\t\t\"title\": \"v1.6.0\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-01-08\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] Changed default resource pack structure: `animated_java:textures/item/export_namespace/` -> `animated_java:textures/blueprint/export_namespace/` & `animated_java:models/item/export_namespace/` -> `animated_java:models/blueprint/export_namespace/`\",\n\t\t\t\t\t\"Added changelog popup! (You're looking at it right now!)\",\n\t\t\t\t\t\"Added an export target for Minecraft 1.21.4\",\n\t\t\t\t\t\"Added support for item definitions (1.21.4)\",\n\t\t\t\t\t\"Added warning for loading Animated Java Data Packs in the wrong version.\",\n\t\t\t\t\t\"Improved internal MCB File compression\",\n\t\t\t\t\t\"Slightly improved empty JSON text rendering ([#322](https://github.com/Animated-Java/animated-java/issues/322)\",\n\t\t\t\t\t\"Added an Extract action to remove exported files from the Resource Pack and Data Pack\",\n\t\t\t\t\t\"Changed missing assets and data folder for resource and data pack folder settings errors into warnings\",\n\t\t\t\t\t\"Added a dialog and exception for exporting a blueprint with invalid cube rotations.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed tags getting cleared out in old exports\",\n\t\t\t\t\t\"Fixed incorrect export location for transparent texture.\",\n\t\t\t\t\t\"Fixed Per-Face UV not being enforced when converting\",\n\t\t\t\t\t\"Fixed [#348](https://github.com/Animated-Java/animated-java/issues/348)\",\n\t\t\t\t\t\"Fixed [#349](https://github.com/Animated-Java/animated-java/issues/349)\",\n\t\t\t\t\t\"Fixed [#347](https://github.com/Animated-Java/animated-java/issues/347)\",\n\t\t\t\t\t\"Fixed [#345](https://github.com/Animated-Java/animated-java/issues/345)\",\n\t\t\t\t\t\"Fixed [#341](https://github.com/Animated-Java/animated-java/issues/341)\",\n\t\t\t\t\t\"Fixed [#343](https://github.com/Animated-Java/animated-java/issues/343)\",\n\t\t\t\t\t\"Fixed [#340](https://github.com/Animated-Java/animated-java/issues/340)\",\n\t\t\t\t\t\"Fixed [#342](https://github.com/Animated-Java/animated-java/issues/342)\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.1\": {\n\t\t\"title\": \"v1.6.1\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-01-10\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\"Slightly improved the changelog.\"]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed overlays breaking custom function tags.\",\n\t\t\t\t\t\"Fixed [#350](https://github.com/Animated-Java/animated-java/issues/350)\",\n\t\t\t\t\t\"Fixed [#353](https://github.com/Animated-Java/animated-java/issues/353)\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.2\": {\n\t\t\"title\": \"v1.6.2\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-01-12\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] Implemented improved scoreboard tag system. Please visit [this docs page](https://animated-java.dev/docs/rigs/tags) on the Animated Java website to learn more.\",\n\t\t\t\t\t\"[BREAKING] Removed individual variant summon functions. (`animated_java:namespace/summon/variant_name`) in favor of `animated_java:namespace/summon {args:{variant: 'variant_name'}}`.\",\n\t\t\t\t\t\"[BREAKING] Removed advanced folder options for Resource Packs.\",\n\t\t\t\t\t\"Re-organized the file structure of AJ's UI files.\",\n\t\t\t\t\t\"Updated the model format order on the start menu to be organized alphabetically.\",\n\t\t\t\t\t\"Added incomptaibility warnings for installing, or having installed, plugins that are incompatible with Animated Java.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed some visual and interactivity issues with the Variants panel.\",\n\t\t\t\t\t\"Fixed default Variant UUID changing every time a model is opened.\",\n\t\t\t\t\t\"Fixed \\\"Display entity is not a string\\\" console spam\",\n\t\t\t\t\t\"Fixed 1.21.2 using `custom_model_data` instead of `item_model`\",\n\t\t\t\t\t\"Fixed [#304](https://github.com/Animated-Java/animated-java/issues/304)\",\n\t\t\t\t\t\"Fixed [#356](https://github.com/Animated-Java/animated-java/issues/356)\",\n\t\t\t\t\t\"Fixed [#357](https://github.com/Animated-Java/animated-java/issues/357)\",\n\t\t\t\t\t\"Fixed [#358](https://github.com/Animated-Java/animated-java/issues/358)\",\n\t\t\t\t\t\"Fixed [#359](https://github.com/Animated-Java/animated-java/issues/359)\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.3\": {\n\t\t\"title\": \"v1.6.3\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-01-15\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Updated to Blockbench 4.12.0\",\n\t\t\t\t\t\"Removed internal Transparent texture. The plugin will automatically create a transparent texture in your model's texture list if you previously used the internal one in any of your variants.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed invalid JSON error when exporting into a resource pack without a block texture atlas.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.4\": {\n\t\t\"title\": \"v1.6.4\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-01-19\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed \\\"safe_name\\\" export crash.\",\n\t\t\t\t\t\"Fixed double v prefix in About dialog.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.0\": {\n\t\t\"title\": \"v1.7.0\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-04-30\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] Overhauled internal functions and data structures. This may cause some issues with older exports, so you should clean out your old AJ exports and re-export them.\",\n\t\t\t\t\t\"[BREAKING] Renamed `animated_java:<export_namespace>/as_own_locator_entities` to `animated_java:<export_namespace>/as_all_locators`.\",\n\t\t\t\t\t\"Added support for Minecraft 1.21.5.\",\n\t\t\t\t\t\"Added support for exporting to multiple target Minecraft versions at once.\",\n\t\t\t\t\t\"Reduced the size of exported Data Packs by about 50%.\",\n\t\t\t\t\t\"Added `Sync Passenger Rotation` config option to Locators.\",\n\t\t\t\t\t\"Added a new function: `animated_java:<export_namespace>/at_all_locators {command: string}` that runs a command at all of a rig's entity-less locator positions.\",\n\t\t\t\t\t\"Added a new function: `animated_java:<export_namespace>/as_locator {name: string, command: string}` that runs a command as and at a named locator's entity.\",\n\t\t\t\t\t\"Added a new function: `animated_java:<export_namespace>/at_locator {name: string, command: string}` that runs a command at an entity-less locator's position.\",\n\t\t\t\t\t\"Added a new function: `animated_java:<export_namespace>/as_camera {name: string, command: string}` that runs a command as and at a camera's entity.\",\n\t\t\t\t\t\"Added a new function: `animated_java:<export_namespace>/remove/entities` that kills all entities owned by a rig, whether they are attached to a root entity or not.\",\n\t\t\t\t\t\"Added a new Blueprint setting: `On-Remove Commands`.\",\n\t\t\t\t\t\"Added support for `shadow_color` to JSON Text Components.\",\n\t\t\t\t\t\"Temporarily made all descriptions of settings appear below settings.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed project settings leaking between opened `.ajblueprints`.\",\n\t\t\t\t\t\"Fixed textures being forcfully set as internal when saving an `.ajblueprint`.\",\n\t\t\t\t\t\"Fixed `tints` field being placed in the wrong location in exported item model definitions.\",\n\t\t\t\t\t\"Fixed bone rotation not being synced with the root entity when a rig is exported without animations.\",\n\t\t\t\t\t\"Fixed data entity being tagged with GLOBAL_NODE instead of GLOBAL_ENTITY.\",\n\t\t\t\t\t\"Fixed added missing tag PROJECT_ENTITY to data entities.\",\n\t\t\t\t\t\"Fixed locators and cameras missing most of their tags.\",\n\t\t\t\t\t\"Fixed missing PROJECT_ENTITY tag on root entities.\",\n\t\t\t\t\t\"Fixed backslash (\\\\) being allowed in node names.\",\n\t\t\t\t\t\"Fixed locators not being removed when calling `animated_java:global/remove/everything`.\",\n\t\t\t\t\t\"Fixed crash while exporting when encountering an invalid JSON file in the target data pack.\",\n\t\t\t\t\t\"Fixed [#389](https://github.com/Animated-Java/animated-java/issues/389)\",\n\t\t\t\t\t\"Fixed custom outliner element changes not marking a project as changed.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.1\": {\n\t\t\"title\": \"v1.7.1\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-05-06\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\"Fixed [#412](https://github.com/Animated-Java/animated-java/issues/409)\"]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.2\": {\n\t\t\"title\": \"v1.7.2\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-05-07\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed incorrect entity type for data entities on versions below 1.21.5.\",\n\t\t\t\t\t\"Fixed missing `as_...` functions in exported data packs below 1.21.5.\",\n\t\t\t\t\t\"Improved .mcb code consistency.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.3\": {\n\t\t\"title\": \"v1.7.3\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-05-08\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed adding cameras to a rig causing the data entity to dismount root.\",\n\t\t\t\t\t\"Make variant keyframes reset to default if their variant doesn't exist anymore.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0-beta.1\": {\n\t\t\"title\": \"v1.8.0-beta.1\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-13\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] `play` and `stop` functions now pause all animations when called.\",\n\t\t\t\t\t\"[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.\",\n\t\t\t\t\t\"[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.\",\n\t\t\t\t\t\"Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.\",\n\t\t\t\t\t\"Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)\",\n\t\t\t\t\t\"Added support for Minecraft 1.21.6 and 1.21.9\",\n\t\t\t\t\t\"Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)\",\n\t\t\t\t\t\"Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.\",\n\t\t\t\t\t\"Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.\",\n\t\t\t\t\t\"Added a button to copy the exported JSON Text component of a Text Display to your clipboard.\",\n\t\t\t\t\t\"Updated keyframe UI, making it much more responsive, and easier to use.\",\n\t\t\t\t\t\"Added support for `light_emission` on cubes.\",\n\t\t\t\t\t\"The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.\",\n\t\t\t\t\t\"Improved Text Display JSON text input syntax highlighting.\",\n\t\t\t\t\t\"Improved Text Display JSON text input appearance.\",\n\t\t\t\t\t\"Improved JSON Text component parsing and error reporting.\",\n\t\t\t\t\t\"Improved all function errors and tellraws in exported Data Packs.\",\n\t\t\t\t\t\"Improved outdated warning formatting and functionality.\",\n\t\t\t\t\t\"Improved text display rendering performance, and update reactivity.\",\n\t\t\t\t\t\"Display item is no longer configurable in versions that use `item_model` (1.20.5+).\",\n\t\t\t\t\t\"The `summon` function now provides better feedback when using invalid arguments.\",\n\t\t\t\t\t\"Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.\",\n\t\t\t\t\t\"Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.\",\n\t\t\t\t\t\"Increased width of all node configs from 400px to 600px.\",\n\t\t\t\t\t\"Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.\",\n\t\t\t\t\t\"Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.\",\n\t\t\t\t\t\"Renamed all 'Commands' settings to 'Function'.\",\n\t\t\t\t\t\"Renamed 'On-Tick Function' to 'Post-Tick Function'.\",\n\t\t\t\t\t\"Added 'Pre-Tick Function' Blueprint setting.\",\n\t\t\t\t\t\"Renamed `raw` export mode to `folder`.\",\n\t\t\t\t\t\"Added new Blueprint setting: 'Auto Update Rig Orientation'.\",\n\t\t\t\t\t\"Added `animated_java:<export_namespace>/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.\",\n\t\t\t\t\t\"Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.\",\n\t\t\t\t\t\"Reduced the number of times the orientation of locators and cameras is updated while animating.\",\n\t\t\t\t\t\"Improved performance of `fontManager` char mesh rendering.\",\n\t\t\t\t\t\"Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.\",\n\t\t\t\t\t\"Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.\",\n\t\t\t\t\t\"Improved plugin incompatibility warnings.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed a few minor Text Display text wrapping issues.\",\n\t\t\t\t\t\"Fixed display entities causing collections to break.\",\n\t\t\t\t\t\"Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)\",\n\t\t\t\t\t\"Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)\",\n\t\t\t\t\t\"Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)\",\n\t\t\t\t\t\"Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)\",\n\t\t\t\t\t\"Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)\",\n\t\t\t\t\t\"Fixed GU failing on first load due to missing scoreboard dependency.\",\n\t\t\t\t\t\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\n\t\t\t\t\t\"Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)\",\n\t\t\t\t\t\"Fixed Text Display JSON text input not catching tab key presses.\",\n\t\t\t\t\t\"Fixed outdated rig warning not working in some cases.\",\n\t\t\t\t\t\"Fixed outdated rig warning entities missing important tags.\",\n\t\t\t\t\t\"Fixed missing translations for install popup.\",\n\t\t\t\t\t\"Fixed function tag merging not working correctly.\",\n\t\t\t\t\t\"Fixed missing `item_display` NBT tag on exported Item Displays.\",\n\t\t\t\t\t\"Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.\",\n\t\t\t\t\t\"Fixed project save status not updating when modifying node configs.\",\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\n\t\t\t\t\t\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\n\t\t\t\t\t\"Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)\",\n\t\t\t\t\t\"Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.\",\n\t\t\t\t\t\"Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)\",\n\t\t\t\t\t\"Fixed invalid cube warning not updating when editing cubes.\",\n\t\t\t\t\t\"Fixed relative paths not being recognized on windows.\",\n\t\t\t\t\t\"Fixed `set_frame` failing due to incorrect tag in entity selector.\",\n\t\t\t\t\t\"Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.\",\n\t\t\t\t\t\"Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.\",\n\t\t\t\t\t\"Fixed animation config dialog not marking project as unsaved after making changes.\",\n\t\t\t\t\t\"Fixed variants panel animating when switching between projects.\",\n\t\t\t\t\t\"Fixed `ajmodel` upgrader not opening when double clicked\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Camera Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\n\t\t\t\t\t\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\n\t\t\t\t\t\"Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)\",\n\t\t\t\t\t\"Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)\",\n\t\t\t\t\t\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Internal Data Pack Changes and Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Updated to the latest version of MC-Build.\",\n\t\t\t\t\t\"Added support for `.mcbt` files to the Data Pack compiler.\",\n\t\t\t\t\t\"Reduced entity data size by reducing the length of locator and camera transform keys.\",\n\t\t\t\t\t\"Removed `global/internal` folder.\",\n\t\t\t\t\t\"Expanded all `aj` namespaces to `animated_java` except tags.\",\n\t\t\t\t\t\"Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.\",\n\t\t\t\t\t\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\n\t\t\t\t\t\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\n\t\t\t\t\t\"`.mcb` files now use more descriptive variable names.\",\n\t\t\t\t\t\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\n\t\t\t\t\t\"Reduced overhead when generating variant functions.\",\n\t\t\t\t\t\"Switched over to using variables for storage names.\",\n\t\t\t\t\t\"Renamed `on_summon_commands` -> `on_summon_function`.\",\n\t\t\t\t\t\"Renamed `on_remove_commands` -> `on_remove_function`.\",\n\t\t\t\t\t\"Renamed `ticking_commands` -> `on_post_tick_function`.\",\n\t\t\t\t\t\"Moved some ticking and loading functionality out of individual namespaces and into global.\",\n\t\t\t\t\t\"Added `debug` macro to reduce code duplication.\",\n\t\t\t\t\t\"Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.\",\n\t\t\t\t\t\"Replaced all `arguments[1]` references with new `context` variable.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Other Changes and Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Most enum-like values are now using TS enums.\",\n\t\t\t\t\t\"Removed config functionality from cameras entirely.\",\n\t\t\t\t\t\"Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.\",\n\t\t\t\t\t\"Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.\",\n\t\t\t\t\t\"`AnimatedJava.API` global has been renamed to `AnimatedJava`.\",\n\t\t\t\t\t\"Improve handling of Text and Block Display entity NBT when generating root entity passengers.\",\n\t\t\t\t\t\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\n\t\t\t\t\t\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\n\t\t\t\t\t\"`.mcb` files now use more descriptive variable names.\",\n\t\t\t\t\t\"`assetManager.getRawAsset` now returns a Buffer.\",\n\t\t\t\t\t\"Fixed broken Animated Java bar item condition.\",\n\t\t\t\t\t\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\n\t\t\t\t\t\"Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.\",\n\t\t\t\t\t\"Improve `ModelDataFixerUpper` types, logic flow, and error handling.\",\n\t\t\t\t\t\"Add `ModelDataFixerUpper` upgrade function for v1.8.0.\",\n\t\t\t\t\t\"Made `TELLRAW.RIG_OUTDATED` runtime-generic.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0-beta.2\": {\n\t\t\"title\": \"v1.8.0-beta.2\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-15\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.\",\n\t\t\t\t\t\"[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.\",\n\t\t\t\t\t\"Replaced unique node configs with universal DisplayEntityConfig.\",\n\t\t\t\t\t\"Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.\",\n\t\t\t\t\t\"Added 'On Summon Function' to Display Entity Configs.\",\n\t\t\t\t\t\"Added 'On Apply Function' to Per-variant Display Entity Configs.\",\n\t\t\t\t\t\"Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.\",\n\t\t\t\t\t\"Improved the Render Box preview's reactivity.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed rotation validation not checking the correct version, and marking any rotation as invalid.\",\n\t\t\t\t\t\"Fixed Blueprints becoming unsavable after opening.\",\n\t\t\t\t\t\"Fixed Blueprints becoming unsavable after converting from another format.\",\n\t\t\t\t\t\"Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.\",\n\t\t\t\t\t\"Fixed uncaught error when deleting a text display.\",\n\t\t\t\t\t\"Fixed outdated warning not appearing until the second reload after rig_hash was modified.\",\n\t\t\t\t\t\"Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0-beta.3\": {\n\t\t\"title\": \"v1.8.0-beta.3\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-15\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\"Fixed On-Summon Functions and On-Apply Functions not functioning.\"]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0-beta.4\": {\n\t\t\"title\": \"v1.8.0-beta.4\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-16\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed Blueprint format data fixer uppper failing to upgrade Blueprints past format version 1.6.5.\",\n\t\t\t\t\t\"Fixed outdated rig function failing due to incorrect root tag.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0-beta.5\": {\n\t\t\"title\": \"v1.8.0-beta.5\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-19\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed cube rotations in 1.21.6+ allowing rotation values outside the -45..45 degree range\",\n\t\t\t\t\t\"Fixed rotation limits not being enforced when converting to a Blueprint.\",\n\t\t\t\t\t\"Fixed rotation limit not being enforced when rotating cubes.\",\n\t\t\t\t\t\"Fixed export crash due to invalid tag reference.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0\": {\n\t\t\"title\": \"v1.8.0\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-10-21\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"[BREAKING] Removed `custom_name`, `custom_name_visible`, `useNbt`, and `nbt` from Display Entity Configs. Use the new 'On Summon Function' and 'On Apply Function' settings to configure entity NBT instead.\",\n\t\t\t\t\t\"[BREAKING] Removed `inherit_settings` from Display Entity Configs. It didn't work properly and was causing more issues than it solved. Use the new copy / paste config actions instead.\",\n\t\t\t\t\t\"[BREAKING] `play` and `stop` functions now pause all animations when called.\",\n\t\t\t\t\t\"[BREAKING] Removed support for Multiple target Minecraft versions. Blueprints can now only be exported to a single target version at a time.\",\n\t\t\t\t\t\"[BREAKING] *Temporarily* disabled plugin mode entirely to avoid confusion while it's being reworked.\",\n\t\t\t\t\t\"Added `Export All` and `Export All (Debug)` action to export all open Blueprints at once.\",\n\t\t\t\t\t\"Added `Export (Debug)` action to export a Blueprint with debug features enabled. (Replaces `show_function_errors` and `show_outdated_warning` settings)\",\n\t\t\t\t\t\"Added support for Minecraft 1.21.6 and 1.21.9\",\n\t\t\t\t\t\"Added support for 1.21.6 element rotations. (No more 22.5 degree limitation!)\",\n\t\t\t\t\t\"Added full support for SNBT JSON Text components. You can now use the modern SNBT format in any version, and Animated Java will automatically convert it to the correct format for your target version on export.\",\n\t\t\t\t\t\"Added full support for 1.21.5 unicode escape sequences in SNBT JSON Text components. As long as the version of Minecraft you're exporting to supports Unicode characters, you can use them in your JSON Text components.\",\n\t\t\t\t\t\"Added a button to copy the exported JSON Text component of a Text Display to your clipboard.\",\n\t\t\t\t\t\"Updated keyframe UI, making it much more responsive, and easier to use.\",\n\t\t\t\t\t\"Added support for `light_emission` on cubes.\",\n\t\t\t\t\t\"Replaced unique node configs with universal DisplayEntityConfig.\",\n\t\t\t\t\t\"Added 'Copy Display Entity Config' and 'Paste Display Entity Config' actions to context menus for Groups, Text Displays, Item Displays, and Block Displays.\",\n\t\t\t\t\t\"Added 'On Summon Function' to Display Entity Configs.\",\n\t\t\t\t\t\"Added 'On Apply Function' to Per-variant Display Entity Configs.\",\n\t\t\t\t\t\"Improved undo / redo history and behavior for TextDisplays, ItemDisplays, and BlockDisplays.\",\n\t\t\t\t\t\"Improved the Render Box preview's reactivity.\",\n\t\t\t\t\t\"The Blueprint format now has basic support for Blockbench collections. More features will be added in future updates.\",\n\t\t\t\t\t\"Improved Text Display JSON text input syntax highlighting.\",\n\t\t\t\t\t\"Improved Text Display JSON text input appearance.\",\n\t\t\t\t\t\"Improved JSON Text component parsing and error reporting.\",\n\t\t\t\t\t\"Improved all function errors and tellraws in exported Data Packs.\",\n\t\t\t\t\t\"Improved outdated warning formatting and functionality.\",\n\t\t\t\t\t\"Improved text display rendering performance, and update reactivity.\",\n\t\t\t\t\t\"Display item is no longer configurable in versions that use `item_model` (1.20.5+).\",\n\t\t\t\t\t\"The `summon` function now provides better feedback when using invalid arguments.\",\n\t\t\t\t\t\"Removed loading popup when opening a model. Display entities are now loaded asynchronously, and will display a temporary placeholder model until they are ready.\",\n\t\t\t\t\t\"Replaced `animated_java:empty` with vanilla empty model in MC 1.21.4+.\",\n\t\t\t\t\t\"Increased width of all node configs from 400px to 600px.\",\n\t\t\t\t\t\"Entities riding the root after running the on-summon function will now be removed automatically when the rig is removed.\",\n\t\t\t\t\t\"Removed `show_function_errors` and `show_outdated_warning` and replaced them with a new `Export (Debug)` action.\",\n\t\t\t\t\t\"Renamed all 'Commands' settings to 'Function'.\",\n\t\t\t\t\t\"Renamed 'On-Tick Function' to 'Post-Tick Function'.\",\n\t\t\t\t\t\"Added 'Pre-Tick Function' Blueprint setting.\",\n\t\t\t\t\t\"Renamed `raw` export mode to `folder`.\",\n\t\t\t\t\t\"Added new Blueprint setting: 'Auto Update Rig Orientation'.\",\n\t\t\t\t\t\"Added `animated_java:<export_namespace>/move` function to move the rig when 'Auto Update Rig Orientation' is enabled.\",\n\t\t\t\t\t\"Reduced number of teleport commands run every tick when idle and animating if 'Auto Update Rig Orientation' is disabled.\",\n\t\t\t\t\t\"Reduced the number of times the orientation of locators and cameras is updated while animating.\",\n\t\t\t\t\t\"Improved performance of `fontManager` char mesh rendering.\",\n\t\t\t\t\t\"Updated plugin description to 'Effortlessly craft complex animations for Minecraft: Java Edition'.\",\n\t\t\t\t\t\"Replaced all `textarea`s in Blueprint settings, Variant config, and Node configs with a custom CodeJar that provides a better editing experience.\",\n\t\t\t\t\t\"Improved plugin incompatibility warnings.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed a few minor Text Display text wrapping issues.\",\n\t\t\t\t\t\"Fixed display entities causing collections to break.\",\n\t\t\t\t\t\"Fixed [#440](https://github.com/Animated-Java/animated-java/issues/440)\",\n\t\t\t\t\t\"Fixed [#442](https://github.com/Animated-Java/animated-java/issues/442)\",\n\t\t\t\t\t\"Fixed [#453](https://github.com/Animated-Java/animated-java/issues/453)\",\n\t\t\t\t\t\"Fixed [#213](https://github.com/Animated-Java/animated-java/issues/213)\",\n\t\t\t\t\t\"Fixed [#284](https://github.com/Animated-Java/animated-java/issues/284)\",\n\t\t\t\t\t\"Fixed GU failing on first load due to missing scoreboard dependency.\",\n\t\t\t\t\t\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\n\t\t\t\t\t\"Fixed [#439](https://github.com/Animated-Java/animated-java/issues/439)\",\n\t\t\t\t\t\"Fixed Text Display JSON text input not catching tab key presses.\",\n\t\t\t\t\t\"Fixed outdated rig warning not working in some cases.\",\n\t\t\t\t\t\"Fixed outdated rig warning entities missing important tags.\",\n\t\t\t\t\t\"Fixed missing translations for install popup.\",\n\t\t\t\t\t\"Fixed function tag merging not working correctly.\",\n\t\t\t\t\t\"Fixed missing `item_display` NBT tag on exported Item Displays.\",\n\t\t\t\t\t\"Fixed missing `Count` tag on Item Displays in Data Packs exported for 1.20.4.\",\n\t\t\t\t\t\"Fixed project save status not updating when modifying node configs.\",\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\n\t\t\t\t\t\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\n\t\t\t\t\t\"Fixed [#429](https://github.com/Animated-Java/animated-java/issues/429)\",\n\t\t\t\t\t\"Fixed Text Display, Item Display, Block Display, and Variant config menus overflowing off the screen.\",\n\t\t\t\t\t\"Fixed [#422](https://github.com/Animated-Java/animated-java/issues/422)\",\n\t\t\t\t\t\"Fixed invalid cube warning not updating when editing cubes.\",\n\t\t\t\t\t\"Fixed relative paths not being recognized on windows.\",\n\t\t\t\t\t\"Fixed `set_frame` failing due to incorrect tag in entity selector.\",\n\t\t\t\t\t\"Fixed animation preview not using in-game display entity interpolation simulation. Interpolations of fast-moving and rotating objects in the preview should now be much more accurate to how they appear in-game.\",\n\t\t\t\t\t\"Fixed `NumberSlider` dialog item failing to correctly clamp values when `valueStep` is defined.\",\n\t\t\t\t\t\"Fixed animation config dialog not marking project as unsaved after making changes.\",\n\t\t\t\t\t\"Fixed variants panel animating when switching between projects.\",\n\t\t\t\t\t\"Fixed `ajmodel` upgrader not opening when double clicked.\",\n\t\t\t\t\t\"Fixed rotation validation not checking the correct version, and marking any rotation as invalid.\",\n\t\t\t\t\t\"Fixed Blueprints becoming unsavable after opening.\",\n\t\t\t\t\t\"Fixed Blueprints becoming unsavable after converting from another format.\",\n\t\t\t\t\t\"Fixed annoying element panel UI flicker when selecting or transforming TextDisplays, ItemDisplays, or BlockDisplays.\",\n\t\t\t\t\t\"Fixed uncaught error when deleting a text display.\",\n\t\t\t\t\t\"Fixed Blueprint format data fixer upper failing to upgrade Blueprints past format version 1.6.5.\",\n\t\t\t\t\t\"Fixed outdated warning not appearing until the second reload after rig_hash was modified.\",\n\t\t\t\t\t\"Fixed custom outliner elements inheriting the same properties list, and therefor causing every node which inherits it to include every other node's properties in it's saved data.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Camera Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\",\n\t\t\t\t\t\"Fixed [#435](https://github.com/Animated-Java/animated-java/issues/435)\",\n\t\t\t\t\t\"Fixed [#434](https://github.com/Animated-Java/animated-java/issues/434)\",\n\t\t\t\t\t\"Fixed [#427](https://github.com/Animated-Java/animated-java/issues/427)\",\n\t\t\t\t\t\"Fixed [#421](https://github.com/Animated-Java/animated-java/issues/421)\",\n\t\t\t\t\t\"Fixed [#441](https://github.com/Animated-Java/animated-java/issues/441)\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Internal Data Pack Changes and Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Updated to the latest version of MC-Build.\",\n\t\t\t\t\t\"Added support for `.mcbt` files to the Data Pack compiler.\",\n\t\t\t\t\t\"Reduced entity data size by reducing the length of locator and camera transform keys.\",\n\t\t\t\t\t\"Removed `global/internal` folder.\",\n\t\t\t\t\t\"Expanded all `aj` namespaces to `animated_java` except tags.\",\n\t\t\t\t\t\"Renamed `convert_uuid_array_to_string` -> `get_entity_uuid_string`.\",\n\t\t\t\t\t\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\n\t\t\t\t\t\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\n\t\t\t\t\t\"`.mcb` files now use more descriptive variable names.\",\n\t\t\t\t\t\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\n\t\t\t\t\t\"Reduced overhead when generating variant functions.\",\n\t\t\t\t\t\"Switched over to using variables for storage names.\",\n\t\t\t\t\t\"Renamed `on_summon_commands` -> `on_summon_function`.\",\n\t\t\t\t\t\"Renamed `on_remove_commands` -> `on_remove_function`.\",\n\t\t\t\t\t\"Renamed `ticking_commands` -> `on_post_tick_function`.\",\n\t\t\t\t\t\"Moved some ticking and loading functionality out of individual namespaces and into global.\",\n\t\t\t\t\t\"Added `debug` macro to reduce code duplication.\",\n\t\t\t\t\t\"Removed an entire indentation level by including the export namespace in the source path instead of as a dir in the .mcb file.\",\n\t\t\t\t\t\"Replaced all `arguments[1]` references with new `context` variable.\",\n\t\t\t\t\t\"Fixed outdated rig function failing due to incorrect root tag.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Other Changes and Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Most enum-like values are now using TS enums.\",\n\t\t\t\t\t\"Removed config functionality from cameras entirely.\",\n\t\t\t\t\t\"Renamed `isCurrentFormat` -> `activeProjectIsBlueprintFormat`.\",\n\t\t\t\t\t\"Updated to new modern modding tools. Animated Java is now capable of being disabled, enabled, and uninstalled safely without restarting Blockbench.\",\n\t\t\t\t\t\"`AnimatedJava.API` global has been renamed to `AnimatedJava`.\",\n\t\t\t\t\t\"Improve handling of Text and Block Display entity NBT when generating root entity passengers.\",\n\t\t\t\t\t\"Removed most transformation of rig entities from `summon`. We now primarily use `set_default_pose` to apply the rig's default pose to reduce code duplication and improve consistency.\",\n\t\t\t\t\t\"Fixed global tag in `set_frame` and `apply_frame` functions not using dynamic tag getter.\",\n\t\t\t\t\t\"`.mcb` files now use more descriptive variable names.\",\n\t\t\t\t\t\"`assetManager.getRawAsset` now returns a Buffer.\",\n\t\t\t\t\t\"Fixed broken Animated Java bar item condition.\",\n\t\t\t\t\t\"Removed `path_name` in favor of `storage_name` for all rendered rig nodes, and animations.\",\n\t\t\t\t\t\"Removed `addProjectToRecentProjects` function into custom `load` logic, and let the default `Codec` functionality handle adding the project in `afterSave`.\",\n\t\t\t\t\t\"Improve `ModelDataFixerUpper` types, logic flow, and error handling.\",\n\t\t\t\t\t\"Add `ModelDataFixerUpper` upgrade function for v1.8.0.\",\n\t\t\t\t\t\"Made `TELLRAW.RIG_OUTDATED` runtime-generic.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.1\": {\n\t\t\"title\": \"v1.8.1\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"date\": \"2025-11-2\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"💬 Added Russian localization - Thanks Koishem!\",\n\t\t\t\t\t\"Added previewing for Item Display's `item_display` transforms.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed [#465](https://github.com/Animated-Java/animated-java/issues/465)\",\n\t\t\t\t\t\"Fixed `global/on_tick` function being placed at start of `minecraft:tick` function tag.\",\n\t\t\t\t\t\"Fixed backwards / missing chest model.\",\n\t\t\t\t\t\"Fixed block models on Item Displays using the wrong pivot point.\",\n\t\t\t\t\t\"Fixed item display panel losing focus when a valid item is entered.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "plugins/animated_java/members.yml",
    "content": "maintainers:\n    - SnaveSutit\n"
  },
  {
    "path": "plugins/animated_platforms/about.md",
    "content": "# Animated Platforms\n\nAn animated ground plane for Blockbench to preview motion (walk cycles, vehicles, etc.) by scrolling a textured plane under your model.\n\nThis is especially useful for Minecraft mobs / entity animation, but it works for any animation workflow.\n\n<style>\n\t.ap-links {\n\t\tdisplay: flex;\n\t\tgap: 22px;\n\t\tjustify-content: center;\n\t\tflex-wrap: wrap;\n\t\tmargin: 18px 0 10px;\n\t}\n\t.ap-links a {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\ttext-decoration: none;\n\t\tcolor: var(--color-text);\n\t\tmin-width: 150px;\n\t\tpadding: 10px;\n\t\tborder-radius: 4px;\n\t}\n\t.ap-links a:hover {\n\t\tbackground-color: var(--color-selected);\n\t\tcolor: var(--color-light);\n\t}\n\t.ap-links i {\n\t\tfont-size: 32px;\n\t}\n\t.ap-links img.ap-site-icon {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tobject-fit: contain;\n\t}\n</style>\n\n<div class=\"ap-links\" data-ap-plugin=\"animated_platforms\">\n\t<a class=\"open-in-browser\" href=\"https://x.com/cazfps1\" title=\"https://x.com/cazfps1\">\n\t\t<i class=\"fa-brands fa-twitter\" style=\"color:#00acee\"></i>\n\t\t<label>X / Twitter</label>\n\t</a>\n\t<a class=\"open-in-browser\" href=\"https://www.cazfps.com/links\" title=\"https://www.cazfps.com/links\">\n\t\t<img class=\"ap-site-icon\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCoAAAQqCAYAAACBVZ7KAAAACXBIWXMAABnWAAAZ1gEY0crtAAADYGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1wbWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLyc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyc+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9JycKICB4bWxuczpBdHRyaWI9J2h0dHA6Ly9ucy5hdHRyaWJ1dGlvbi5jb20vYWRzLzEuMC8nPgogIDxBdHRyaWI6QWRzPgogICA8cmRmOlNlcT4KICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0nUmVzb3VyY2UnPgogICAgIDxBdHRyaWI6Q3JlYXRlZD4yMDI1LTEyLTE0PC9BdHRyaWI6Q3JlYXRlZD4KICAgICA8QXR0cmliOkV4dElkPjdlZDNmM2RmLTYwYzEtNGEwNy1hZDZiLWUxNWVmNDI4ZjYzNzwvQXR0cmliOkV4dElkPgogICAgIDxBdHRyaWI6RmJJZD41MjUyNjU5MTQxNzk1ODA8L0F0dHJpYjpGYklkPgogICAgIDxBdHRyaWI6VG91Y2hUeXBlPjI8L0F0dHJpYjpUb3VjaFR5cGU+CiAgICA8L3JkZjpsaT4KICAgPC9yZGY6U2VxPgogIDwvQXR0cmliOkFkcz4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PScnCiAgeG1sbnM6ZGM9J2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6dGl0bGU+CiAgIDxyZGY6QWx0PgogICAgPHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz5VbnRpdGxlZCBkZXNpZ24gLSAxPC9yZGY6bGk+CiAgIDwvcmRmOkFsdD4KICA8L2RjOnRpdGxlPgogPC9yZGY6RGVzY3JpcHRpb24+CjwvcmRmOlJERj4KPC94Onht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\" alt=\"Website\" />\n\t\t<label>Website</label>\n\t</a>\n\t<a class=\"open-in-browser\" href=\"https://discord.gg/KDd2rcAPqA\" title=\"https://discord.gg/KDd2rcAPqA\">\n\t\t<i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\n\t\t<label>Discord Server</label>\n\t</a>\n</div>\n\n## Features\n- Scroll speed in blocks/sec (with quick presets)\n- Size/placement controls (width/length/height, rotation)\n- Optional custom texture + rotate/flip\n- Texture library for quick reuse\n- Per-animation presets (save / auto-save)\n\n## Notes\n- Custom texture rotation is visual only; movement direction stays consistent.\n- Presets are stored locally (Blockbench localStorage) and are scoped so different projects/animations don’t overwrite each other.\n\n## Author\nCazfps\n"
  },
  {
    "path": "plugins/animated_platforms/animated_platforms.js",
    "content": "(function () {\n  const PLUGIN_ID = \"animated_platforms\";\n  const PLUGIN_VERSION = \"1.0.0\";\n\n  // Settings storage key for this standalone plugin.\n  const SETTINGS_KEY = \"animated_platforms_settings\";\n\n  // Legacy IDs/keys (migration)\n  const LEGACY_PLUGIN_ID = \"moving_ground_plane\";\n  const LEGACY_SETTINGS_KEY = \"moving_ground_plane_settings\";\n  const LEGACY_PRESET_PREFIX = \"cazfps_mgp_anim_presets::\";\n  const PRESET_PREFIX = \"cazfps_animated_platforms_anim_presets::\";\n\n  // ============================================================\n  // Singleton guard (prevents duplicate timers if this file is loaded twice)\n  // ============================================================\n\n  const INSTANCE_KEY = \"__cazfps_animated_platforms_instance__\";\n  const LEGACY_INSTANCE_KEY = \"__cazfps_moving_ground_plane_instance__\";\n  try {\n    const prev1 = globalThis?.[INSTANCE_KEY];\n    if (prev1 && typeof prev1.cleanup === \"function\") prev1.cleanup();\n    const prev0 = globalThis?.[LEGACY_INSTANCE_KEY];\n    if (prev0 && typeof prev0.cleanup === \"function\") prev0.cleanup();\n  } catch (e) {}\n  try {\n    globalThis[INSTANCE_KEY] = {\n      cleanup() {},\n    };\n  } catch (e) {}\n\n  // ============================================================\n  // UI: Make this dialog non-modal (no blackout)\n  // ============================================================\n\n  // Dialog UX hack (opt-in): disables the modal overlay/blur while this plugin's dialogs are open.\n  // This mutates global DOM/CSS and must always be reverted on dialog close and on unload.\n\n  // This hack mutates global DOM/CSS and can cause persistent FPS drops on some\n  // systems/GPUs after opening a dialog. Keep it off by default.\n  const ENABLE_NO_OVERLAY_HACK = true;\n\n  // ============================================================\n  // Plugin asset URL helpers (works for store/web + file installs)\n  // ============================================================\n\n  function getAnimatedPlatformsAssetUrl(filename) {\n    const f = String(filename || \"\").trim();\n    if (!f) return \"\";\n    try {\n      const all = Plugins?.all;\n      const p = Array.isArray(all) ? all.find((x) => x && x.id === PLUGIN_ID) : null;\n      const source = String(p?.source || \"\");\n      const path = String(p?.path || \"\");\n\n      // File/URL installs: resolve relative to the plugin JS path.\n      if ((source === \"file\" || source === \"url\") && path) {\n        return path.replace(/[^\\\\/]+\\.js(\\?.*)?$/, f);\n      }\n    } catch (e) {}\n\n    // Store / web: resolve from plugin CDN path.\n    try {\n      if (typeof Plugins !== \"undefined\" && Plugins?.api_path) {\n        return `${Plugins.api_path}/${PLUGIN_ID}/${encodeURIComponent(f)}`;\n      }\n    } catch (e) {}\n    return f;\n  }\n\n  // NOTE: We avoid rewriting the Plugins window DOM.\n  // The about.md provides its own icon markup, so no cross-plugin DOM hooks are needed.\n\n  const NO_OVERLAY_CLASS = \"animated_platforms_no_overlay\";\n  const NO_OVERLAY_STYLE_ID = \"animated_platforms_no_overlay_style\";\n\n  // Some Blockbench builds apply blur/filters to the preview when dialogs are open.\n  // On some GPUs/drivers this tanks FPS while the dialog is visible.\n  // We disable ONLY the blur/filter while this plugin's dialog is open.\n  const NO_BLUR_CLASS = \"animated_platforms_no_blur\";\n  const NO_BLUR_STYLE_ID = \"animated_platforms_no_blur_style\";\n\n  // Dialog CSS injection (Dialog.lines HTML is deprecated)\n  const PANEL_STYLE_ID = \"animated_platforms_panel_style\";\n  const ABOUT_STYLE_ID = \"animated_platforms_about_style\";\n\n  function ensureStyleTag(id, cssText) {\n    try {\n      if (!document?.head) return;\n      if (!id) return;\n      if (document.getElementById(id)) return;\n      const style = document.createElement(\"style\");\n      style.id = id;\n      style.textContent = String(cssText || \"\");\n      document.head.appendChild(style);\n    } catch (e) {}\n  }\n\n  function ensurePanelStyle() {\n    ensureStyleTag(\n      PANEL_STYLE_ID,\n      `\n      #animated_platforms_panel .dialog_content { margin: 0; }\n      #animated_platforms_panel #mgp-panel { padding: 14px 16px 12px; }\n      #animated_platforms_panel .mgp-section { margin-bottom: 14px; }\n      #animated_platforms_panel .mgp-section-title { font-weight: 700; margin: 10px 0 8px; }\n      #animated_platforms_panel .mgp-row { display: flex; align-items: center; gap: 10px; margin: 6px 0; }\n      #animated_platforms_panel .mgp-row label { flex: 1; opacity: 0.95; }\n      #animated_platforms_panel .mgp-row .mgp-right { display: flex; align-items: center; gap: 8px; }\n      #animated_platforms_panel .mgp-row .mgp-right > * { flex: initial; }\n      #animated_platforms_panel .mgp-checkbox { display: flex; align-items: center; gap: 8px; }\n      #animated_platforms_panel .mgp-checkbox input { margin: 0; }\n      #animated_platforms_panel .mgp-select { min-width: 150px; }\n      #animated_platforms_panel .mgp-footer { display: flex; align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--color-border); margin-top: 10px; }\n      #animated_platforms_panel .mgp-author { opacity: 0.8; font-size: 0.95em; }\n      #animated_platforms_panel .mgp-spacer { flex: 1; }\n      #animated_platforms_panel .mgp-button-row { display: flex; gap: 8px; flex-wrap: wrap; }\n      #animated_platforms_panel .mgp-button-row > button.tool { flex: 1; min-width: 170px; }\n      #animated_platforms_panel button.tool { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-height: 34px; }\n      #animated_platforms_panel button.tool > * { pointer-events: none; }\n      #animated_platforms_panel .mgp-subtle { opacity: 0.8; }\n      #animated_platforms_panel numeric-input { width: 140px; }\n\n      #animated_platforms_textures #mgp-texture-library { padding: 12px 14px; }\n      #animated_platforms_textures .mgp-texture-library-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }\n      #animated_platforms_textures .mgp-empty { opacity: 0.8; padding: 12px 0; }\n      #animated_platforms_textures .mgp-texture-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 10px; }\n      #animated_platforms_textures .mgp-texture-card { background: var(--color-back); border: 1px solid var(--color-border); padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n      #animated_platforms_textures .mgp-thumb { background: var(--color-dark); aspect-ratio: 1 / 1; overflow: hidden; display: flex; align-items: center; justify-content: center; }\n      #animated_platforms_textures .mgp-thumb img { width: 100%; height: 100%; object-fit: cover; image-rendering: pixelated; display: block; }\n      #animated_platforms_textures .mgp-texture-actions { display: flex; gap: 8px; flex-wrap: wrap; }\n      #animated_platforms_textures .mgp-texture-actions > button.tool { flex: 1 1 0; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n      #animated_platforms_textures .mgp-footer { display: flex; align-items: center; gap: 10px; padding-top: 10px; border-top: 1px solid var(--color-border); margin-top: 10px; }\n      #animated_platforms_textures .spacer { flex: 1; }\n      `.trim()\n    );\n  }\n\n  function ensureAboutStyle() {\n    ensureStyleTag(\n      ABOUT_STYLE_ID,\n      `\n      dialog#mgp_about .dialog_title {\n        padding-left: 0;\n        display: flex;\n        align-items: center;\n        gap: 10px;\n      }\n      dialog#mgp_about .dialog_content {\n        text-align: left !important;\n        margin: 0 !important;\n      }\n      dialog#mgp_about #mgp_banner {\n        background-color: var(--color-accent);\n        color: var(--color-accent_text);\n        width: 100%;\n        padding: 0 8px;\n      }\n      dialog#mgp_about #mgp_content {\n        margin: 24px;\n      }\n      dialog#mgp_about .mgp-socials {\n        display: flex;\n        gap: 22px;\n        justify-content: center;\n        margin-top: 22px;\n      }\n      dialog#mgp_about .mgp-socials a {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 8px;\n        text-decoration: none;\n        color: var(--color-text);\n        min-width: 160px;\n        padding: 10px;\n      }\n      dialog#mgp_about .mgp-socials a:hover {\n        background-color: var(--color-selected);\n        color: var(--color-light);\n      }\n      dialog#mgp_about .mgp-socials i {\n        font-size: 32px;\n      }\n      dialog#mgp_about .mgp-socials img.mgp-site-icon {\n        width: 32px;\n        height: 32px;\n        object-fit: contain;\n      }\n      dialog#mgp_about .mgp-socials label {\n        cursor: pointer;\n        text-decoration: underline;\n      }\n      `.trim()\n    );\n  }\n\n  function migrateLegacyStorageOnce() {\n    try {\n      // Copy legacy settings if the new key is empty.\n      const cur = localStorage.getItem(SETTINGS_KEY);\n      const old = localStorage.getItem(LEGACY_SETTINGS_KEY);\n      if ((!cur || !cur.trim()) && old && old.trim()) {\n        localStorage.setItem(SETTINGS_KEY, old);\n      }\n\n      // Copy legacy per-project preset buckets (prefix rename).\n      // This keeps per-animation presets working after the plugin id rename.\n      const keys = [];\n      for (let i = 0; i < localStorage.length; i++) {\n        const k = localStorage.key(i);\n        if (k) keys.push(k);\n      }\n      keys.forEach((k) => {\n        if (!k.startsWith(LEGACY_PRESET_PREFIX)) return;\n        const newKey = PRESET_PREFIX + k.slice(LEGACY_PRESET_PREFIX.length);\n        const hasNew = localStorage.getItem(newKey);\n        if (hasNew) return;\n        const v = localStorage.getItem(k);\n        if (v !== null && v !== undefined) localStorage.setItem(newKey, v);\n      });\n    } catch (e) {}\n  }\n\n  const NO_OVERLAY_SELECTORS = [\n    \".dialog_background\",\n    \".dialog_backdrop\",\n    \".dialog_barrier\",\n    \".dialog_overlay\",\n    \"#dialog_background\",\n    \"#dialog_backdrop\",\n    \"#blackout\",\n    \".blackout\",\n    \".modal-backdrop\",\n    \".modal_backdrop\",\n    \".overlay\",\n    \".overlay_background\",\n    \".dark_overlay\",\n  ];\n\n  function ensureNoOverlayStyle() {\n    if (document.getElementById(NO_OVERLAY_STYLE_ID)) return;\n    const style = document.createElement(\"style\");\n    style.id = NO_OVERLAY_STYLE_ID;\n    style.textContent = `\n      /* Remove any blur/filters applied when a dialog is open */\n      body.${NO_OVERLAY_CLASS} #page_wrapper,\n      body.${NO_OVERLAY_CLASS} #work_screen,\n      body.${NO_OVERLAY_CLASS} #center,\n      body.${NO_OVERLAY_CLASS} .preview,\n      body.${NO_OVERLAY_CLASS} canvas.preview,\n      body.${NO_OVERLAY_CLASS} .preview canvas,\n      body.${NO_OVERLAY_CLASS} .preview_panel,\n      body.${NO_OVERLAY_CLASS} .preview_background {\n        filter: none !important;\n        backdrop-filter: none !important;\n        opacity: 1 !important;\n      }\n\n      /* Remove the dim overlay behind dialogs and make it click-through */\n      body.${NO_OVERLAY_CLASS} .dialog_background,\n      body.${NO_OVERLAY_CLASS} .dialog_backdrop,\n      body.${NO_OVERLAY_CLASS} .dialog_barrier,\n      body.${NO_OVERLAY_CLASS} .dialog_overlay,\n      body.${NO_OVERLAY_CLASS} #dialog_background,\n      body.${NO_OVERLAY_CLASS} #dialog_backdrop,\n      body.${NO_OVERLAY_CLASS} #blackout,\n      body.${NO_OVERLAY_CLASS} .blackout,\n      body.${NO_OVERLAY_CLASS} .modal-backdrop,\n      body.${NO_OVERLAY_CLASS} .modal_backdrop,\n      body.${NO_OVERLAY_CLASS} .overlay,\n      body.${NO_OVERLAY_CLASS} .overlay_background,\n      body.${NO_OVERLAY_CLASS} .dark_overlay {\n        background: transparent !important;\n        background-color: transparent !important;\n        backdrop-filter: none !important;\n        opacity: 1 !important;\n        pointer-events: none !important;\n      }\n\n      /* Fallback for versions that use inline styles for the dimmer */\n      body.${NO_OVERLAY_CLASS} div[style*=\"rgba(0,0,0\"],\n      body.${NO_OVERLAY_CLASS} div[style*=\"rgb(0, 0, 0\"],\n      body.${NO_OVERLAY_CLASS} div[style*=\"background: rgba(0,0,0\"],\n      body.${NO_OVERLAY_CLASS} div[style*=\"background-color: rgba(0,0,0\"] {\n        background: transparent !important;\n        background-color: transparent !important;\n        backdrop-filter: none !important;\n        opacity: 1 !important;\n        pointer-events: none !important;\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  function ensureNoBlurStyle() {\n    if (document.getElementById(NO_BLUR_STYLE_ID)) return;\n    const style = document.createElement(\"style\");\n    style.id = NO_BLUR_STYLE_ID;\n    style.textContent = `\n      body.${NO_BLUR_CLASS} #page_wrapper,\n      body.${NO_BLUR_CLASS} #work_screen,\n      body.${NO_BLUR_CLASS} #center,\n      body.${NO_BLUR_CLASS} .preview,\n      body.${NO_BLUR_CLASS} canvas.preview,\n      body.${NO_BLUR_CLASS} .preview canvas,\n      body.${NO_BLUR_CLASS} .preview_panel,\n      body.${NO_BLUR_CLASS} .preview_background {\n        filter: none !important;\n        backdrop-filter: none !important;\n        -webkit-backdrop-filter: none !important;\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  function setNoBlurEnabled(enabled) {\n    if (!document?.body) return;\n    if (enabled) {\n      ensureNoBlurStyle();\n      document.body.classList.add(NO_BLUR_CLASS);\n    } else {\n      document.body.classList.remove(NO_BLUR_CLASS);\n    }\n  }\n\n  function setDialogOverlayTransparent(enabled) {\n    try {\n      const nodes = [];\n      for (const sel of NO_OVERLAY_SELECTORS) {\n        document.querySelectorAll(sel).forEach((n) => nodes.push(n));\n      }\n\n      for (const el of nodes) {\n        if (!(el instanceof HTMLElement)) continue;\n\n        if (enabled) {\n          if (!el.dataset.mgpPrevBg) {\n            el.dataset.mgpPrevBg = el.style.background || \"\";\n            el.dataset.mgpPrevBgc = el.style.backgroundColor || \"\";\n            el.dataset.mgpPrevOpacity = el.style.opacity || \"\";\n            el.dataset.mgpPrevFilter = el.style.backdropFilter || \"\";\n            el.dataset.mgpPrevPointerEvents = el.style.pointerEvents || \"\";\n          }\n          el.style.background = \"transparent\";\n          el.style.backgroundColor = \"transparent\";\n          el.style.backdropFilter = \"none\";\n          el.style.opacity = \"1\";\n          el.style.pointerEvents = \"none\";\n        } else if (el.dataset.mgpPrevBg !== undefined) {\n          el.style.background = el.dataset.mgpPrevBg;\n          el.style.backgroundColor = el.dataset.mgpPrevBgc;\n          el.style.opacity = el.dataset.mgpPrevOpacity;\n          el.style.backdropFilter = el.dataset.mgpPrevFilter;\n          el.style.pointerEvents = el.dataset.mgpPrevPointerEvents;\n\n          delete el.dataset.mgpPrevBg;\n          delete el.dataset.mgpPrevBgc;\n          delete el.dataset.mgpPrevOpacity;\n          delete el.dataset.mgpPrevFilter;\n          delete el.dataset.mgpPrevPointerEvents;\n        }\n      }\n    } catch (e) {}\n  }\n\n  function setNoOverlayEnabled(enabled) {\n    if (!ENABLE_NO_OVERLAY_HACK) return;\n    if (!document?.body) return;\n    if (enabled) {\n      ensureNoOverlayStyle();\n      document.body.classList.add(NO_OVERLAY_CLASS);\n      setDialogOverlayTransparent(true);\n      // Some overlays are created slightly after dialog open.\n      setTimeout(() => setDialogOverlayTransparent(true), 0);\n      setTimeout(() => setDialogOverlayTransparent(true), 50);\n    } else {\n      setDialogOverlayTransparent(false);\n      document.body.classList.remove(NO_OVERLAY_CLASS);\n    }\n  }\n\n  // ============================================================\n  // Settings\n  // ============================================================\n\n  const Settings = {\n    enabled: false,\n    autoSaveToAnimation: false,\n    edgeFadeEnabled: true,\n    edgeFadeWidthUv: 0.08,\n    speedBlocksPerSec: 2.0,\n    widthBlocks: 256,\n    lengthBlocks: 256,\n    yBlocks: 0,\n    xBlocks: 0,\n    zBlocks: 0,\n    yaw: 0,\n    tilt: 0,\n    opacity: 1.0,\n\n    gridBlocksPerTile: 16, // 16 blocks per texture tile => 1 block squares\n    textureResolutionPx: 512,\n    gridColor: \"#ffffff\",\n    backgroundColor: \"#2b2b2b\",\n    gridMinorOpacity: 1.0,\n    gridMajorOpacity: 1.0,\n    backgroundOpacity: 1.0,\n    lineThicknessMult: 1.0,\n\n    useCustomTexture: false,\n    customTextureDataUrl: \"\",\n\n    // Custom texture transforms\n    customTextureRotation90: 0, // 0..3\n    customTextureFlipX: false,\n    customTextureFlipY: false,\n\n    // Saved texture library (data URLs)\n    savedTextures: [],\n\n    load() {\n      try {\n        const raw = localStorage.getItem(SETTINGS_KEY);\n        if (!raw) return;\n        const obj = JSON.parse(raw);\n        if (!obj || typeof obj !== \"object\") return;\n        Object.assign(this, obj);\n\n        // Normalize numeric values\n        this.enabled = !!this.enabled;\n        this.autoSaveToAnimation = !!this.autoSaveToAnimation;\n        this.edgeFadeEnabled = this.edgeFadeEnabled !== false;\n        this.edgeFadeWidthUv = Math.max(\n          0.001,\n          Math.min(0.5, Number(this.edgeFadeWidthUv ?? 0.08))\n        );\n        this.speedBlocksPerSec = Number(this.speedBlocksPerSec ?? 2.0);\n\n        // Backward compatibility: older versions stored a single sizeBlocks.\n        const legacySize = Number(this.sizeBlocks);\n        const legacy = Number.isFinite(legacySize) ? legacySize : null;\n        this.widthBlocks = Math.max(\n          3,\n          Number(this.widthBlocks ?? legacy ?? 256)\n        );\n        this.lengthBlocks = Math.max(\n          3,\n          Number(this.lengthBlocks ?? legacy ?? 256)\n        );\n\n        this.yBlocks = Number(this.yBlocks ?? 0);\n        this.xBlocks = Number(this.xBlocks ?? 0);\n        this.zBlocks = Number(this.zBlocks ?? 0);\n        this.yaw = Number(this.yaw ?? 0);\n        this.tilt = Number(this.tilt ?? 0);\n        this.opacity = Math.max(0, Math.min(1, Number(this.opacity ?? 1.0)));\n\n        this.gridBlocksPerTile = Math.max(\n          0.25,\n          Math.min(1024, Number(this.gridBlocksPerTile ?? 16))\n        );\n        this.textureResolutionPx = Math.max(\n          64,\n          Math.min(2048, Math.floor(Number(this.textureResolutionPx ?? 512)))\n        );\n\n        this.gridColor = normalizeColorToHex(this.gridColor, \"#ffffff\");\n        this.backgroundColor = normalizeColorToHex(\n          this.backgroundColor,\n          \"#2b2b2b\"\n        );\n        this.gridMinorOpacity = Math.max(\n          0,\n          Math.min(1, Number(this.gridMinorOpacity ?? 1.0))\n        );\n        this.gridMajorOpacity = Math.max(\n          0,\n          Math.min(1, Number(this.gridMajorOpacity ?? 1.0))\n        );\n        this.backgroundOpacity = Math.max(\n          0,\n          Math.min(1, Number(this.backgroundOpacity ?? 1.0))\n        );\n        this.lineThicknessMult = Math.max(\n          0.25,\n          Math.min(6, Number(this.lineThicknessMult ?? 1.0))\n        );\n\n        this.useCustomTexture = !!this.useCustomTexture;\n        this.customTextureDataUrl = String(this.customTextureDataUrl || \"\");\n        if (!this.customTextureDataUrl) this.useCustomTexture = false;\n\n        this.customTextureRotation90 = Math.max(\n          0,\n          Math.min(3, Math.floor(Number(this.customTextureRotation90 ?? 0)))\n        );\n        this.customTextureFlipX = !!this.customTextureFlipX;\n        this.customTextureFlipY = !!this.customTextureFlipY;\n\n        if (!Array.isArray(this.savedTextures)) this.savedTextures = [];\n        // Ensure the library only contains valid strings\n        this.savedTextures = this.savedTextures\n          .filter((e) => typeof e === \"string\" && e.trim())\n          .slice(0, 64);\n      } catch (e) {}\n    },\n\n    _lastSaveError: \"\",\n\n    save() {\n      try {\n        this._lastSaveError = \"\";\n        localStorage.setItem(\n          SETTINGS_KEY,\n          JSON.stringify({\n            enabled: !!this.enabled,\n            autoSaveToAnimation: !!this.autoSaveToAnimation,\n            edgeFadeEnabled: this.edgeFadeEnabled !== false,\n            edgeFadeWidthUv: Number(this.edgeFadeWidthUv ?? 0.08),\n            speedBlocksPerSec: Number(this.speedBlocksPerSec ?? 0),\n            widthBlocks: Number(this.widthBlocks ?? 256),\n            lengthBlocks: Number(this.lengthBlocks ?? 256),\n            yBlocks: Number(this.yBlocks ?? 0),\n            xBlocks: Number(this.xBlocks ?? 0),\n            zBlocks: Number(this.zBlocks ?? 0),\n            yaw: Number(this.yaw ?? 0),\n            tilt: Number(this.tilt ?? 0),\n            opacity: Number(this.opacity ?? 1.0),\n\n            gridBlocksPerTile: Number(this.gridBlocksPerTile ?? 16),\n            textureResolutionPx: Number(this.textureResolutionPx ?? 512),\n            gridColor: normalizeColorToHex(this.gridColor, \"#ffffff\"),\n            backgroundColor: normalizeColorToHex(\n              this.backgroundColor,\n              \"#2b2b2b\"\n            ),\n            gridMinorOpacity: Number(this.gridMinorOpacity ?? 1.0),\n            gridMajorOpacity: Number(this.gridMajorOpacity ?? 1.0),\n            backgroundOpacity: Number(this.backgroundOpacity ?? 1.0),\n            lineThicknessMult: Number(this.lineThicknessMult ?? 1.0),\n\n            useCustomTexture: !!this.useCustomTexture,\n            customTextureDataUrl: String(this.customTextureDataUrl || \"\"),\n\n            customTextureRotation90: Number(this.customTextureRotation90 ?? 0),\n            customTextureFlipX: !!this.customTextureFlipX,\n            customTextureFlipY: !!this.customTextureFlipY,\n\n            savedTextures: Array.isArray(this.savedTextures)\n              ? this.savedTextures.slice(0, 64)\n              : [],\n          })\n        );\n        return true;\n      } catch (e) {}\n      try {\n        this._lastSaveError = String(e?.message || e || \"\");\n      } catch (_) {}\n      return false;\n    },\n  };\n\n  function normalizeTextureDataUrlForStorage(dataUrl, maxDim = 512) {\n    return new Promise((resolve) => {\n      const url = String(dataUrl || \"\");\n      if (!url) return resolve(\"\");\n      try {\n        const img = new Image();\n        img.decoding = \"async\";\n        img.onload = () => {\n          try {\n            const w = Math.max(1, img.naturalWidth || img.width || 1);\n            const h = Math.max(1, img.naturalHeight || img.height || 1);\n            const max = Math.max(w, h);\n            const md = Math.max(32, Math.min(2048, Math.floor(Number(maxDim) || 512)));\n            const scale = max > md ? md / max : 1;\n            const outW = Math.max(1, Math.floor(w * scale));\n            const outH = Math.max(1, Math.floor(h * scale));\n\n            // If already small enough, keep original\n            if (scale === 1) return resolve(url);\n\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = outW;\n            canvas.height = outH;\n            const ctx = canvas.getContext(\"2d\");\n            if (!ctx) return resolve(url);\n\n            // Keep pixel-art crisp\n            ctx.imageSmoothingEnabled = false;\n            ctx.clearRect(0, 0, outW, outH);\n            ctx.drawImage(img, 0, 0, outW, outH);\n            try {\n              return resolve(canvas.toDataURL(\"image/png\"));\n            } catch (e) {\n              return resolve(url);\n            }\n          } catch (e) {\n            return resolve(url);\n          }\n        };\n        img.onerror = () => resolve(url);\n        img.src = url;\n      } catch (e) {\n        return resolve(url);\n      }\n    });\n  }\n\n  function hexToRgbaCss(hex, alpha = 1.0) {\n    const a = Math.max(0, Math.min(1, Number(alpha ?? 1)));\n    const rgb =\n      parseHexColorToRgb255(hex) ||\n      parseHexColorToRgb255(\"#000000\") || { r: 0, g: 0, b: 0 };\n    return `rgba(${rgb.r},${rgb.g},${rgb.b},${a})`;\n  }\n\n  // ============================================================\n  // Color helpers (Blockbench color fields can return many shapes)\n  // ============================================================\n\n  function parseHexColorToRgb255(hex) {\n    const s = String(hex || \"\").trim();\n    const m = /^#?([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(s);\n    if (!m) return null;\n    let h = m[1];\n    if (h.length === 3 || h.length === 4) {\n      h = h\n        .split(\"\")\n        .map((c) => c + c)\n        .join(\"\");\n    }\n    if (h.length === 8) h = h.slice(0, 6);\n    const n = parseInt(h, 16);\n    return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\n  }\n\n  function rgb255ToHex(rgb) {\n    const r = Math.max(0, Math.min(255, Math.round(Number(rgb?.r ?? 0))));\n    const g = Math.max(0, Math.min(255, Math.round(Number(rgb?.g ?? 0))));\n    const b = Math.max(0, Math.min(255, Math.round(Number(rgb?.b ?? 0))));\n    const to2 = (n) => n.toString(16).padStart(2, \"0\");\n    return `#${to2(r)}${to2(g)}${to2(b)}`;\n  }\n\n  function parseCssRgbToRgb255(input) {\n    const s = String(input || \"\").trim();\n    const m =\n      /^rgba?\\(\\s*([0-9.]+%?)\\s*,\\s*([0-9.]+%?)\\s*,\\s*([0-9.]+%?)(?:\\s*,\\s*([0-9.]+%?)\\s*)?\\)$/i.exec(\n        s\n      );\n    if (!m) return null;\n\n    const parseChan = (v) => {\n      const t = String(v || \"\").trim();\n      if (t.endsWith(\"%\")) {\n        const p = Number.parseFloat(t.slice(0, -1));\n        if (!Number.isFinite(p)) return null;\n        return (p / 100) * 255;\n      }\n      const n = Number.parseFloat(t);\n      if (!Number.isFinite(n)) return null;\n      return n;\n    };\n\n    const r = parseChan(m[1]);\n    const g = parseChan(m[2]);\n    const b = parseChan(m[3]);\n    if (![r, g, b].every((n) => Number.isFinite(n))) return null;\n\n    return {\n      r: Math.max(0, Math.min(255, r)),\n      g: Math.max(0, Math.min(255, g)),\n      b: Math.max(0, Math.min(255, b)),\n    };\n  }\n\n  function normalizeColorToHex(value, fallbackHex) {\n    const fallback = String(fallbackHex || \"#ffffff\");\n    try {\n      if (typeof value === \"string\") {\n        const s = value.trim();\n        if (parseHexColorToRgb255(s)) return s.startsWith(\"#\") ? s : `#${s}`;\n        const rgb = parseCssRgbToRgb255(s);\n        if (rgb) return rgb255ToHex(rgb);\n        return fallback;\n      }\n\n      if (typeof value === \"number\" && Number.isFinite(value)) {\n        const n = Math.max(0, Math.min(0xffffff, Math.floor(value)));\n        return `#${n.toString(16).padStart(6, \"0\")}`;\n      }\n\n      if (value && typeof value === \"object\") {\n        if (typeof value.hex === \"string\")\n          return normalizeColorToHex(value.hex, fallback);\n        if (typeof value.value === \"string\")\n          return normalizeColorToHex(value.value, fallback);\n        if (value.rgb && typeof value.rgb === \"object\")\n          return normalizeColorToHex(value.rgb, fallback);\n\n        if (\n          Number.isFinite(Number(value.red)) &&\n          Number.isFinite(Number(value.green)) &&\n          Number.isFinite(Number(value.blue))\n        ) {\n          return normalizeColorToHex(\n            { r: value.red, g: value.green, b: value.blue },\n            fallback\n          );\n        }\n        if (\n          Number.isFinite(Number(value._r)) &&\n          Number.isFinite(Number(value._g)) &&\n          Number.isFinite(Number(value._b))\n        ) {\n          return normalizeColorToHex(\n            { r: value._r, g: value._g, b: value._b },\n            fallback\n          );\n        }\n\n        if (typeof value.getHexString === \"function\") {\n          const h = String(value.getHexString() || \"\").trim();\n          if (h) return normalizeColorToHex(`#${h}`, fallback);\n        }\n\n        if (Array.isArray(value) && value.length >= 3) {\n          const r = Number(value[0]);\n          const g = Number(value[1]);\n          const b = Number(value[2]);\n          if ([r, g, b].every((n) => Number.isFinite(n))) {\n            const is01 = r <= 1 && g <= 1 && b <= 1;\n            return rgb255ToHex({\n              r: is01 ? r * 255 : r,\n              g: is01 ? g * 255 : g,\n              b: is01 ? b * 255 : b,\n            });\n          }\n        }\n\n        if (Array.isArray(value.value) && value.value.length >= 3) {\n          return normalizeColorToHex(value.value, fallback);\n        }\n\n        if (\n          Number.isFinite(Number(value.r)) &&\n          Number.isFinite(Number(value.g)) &&\n          Number.isFinite(Number(value.b))\n        ) {\n          const r = Number(value.r);\n          const g = Number(value.g);\n          const b = Number(value.b);\n          const is01 = r <= 1 && g <= 1 && b <= 1;\n          return rgb255ToHex({\n            r: is01 ? r * 255 : r,\n            g: is01 ? g * 255 : g,\n            b: is01 ? b * 255 : b,\n          });\n        }\n      }\n    } catch (e) {}\n    return fallback;\n  }\n\n  // ============================================================\n  // Timeline helpers\n  // ============================================================\n\n  function isBlockbenchAnimationPlaying() {\n    try {\n      if (typeof Animator !== \"undefined\" && Animator) {\n        if (typeof Animator.isPlaying === \"function\")\n          return !!Animator.isPlaying();\n        if (typeof Animator.playing !== \"undefined\") return !!Animator.playing;\n        if (typeof Animator.playback !== \"undefined\")\n          return !!Animator.playback;\n      }\n\n      if (typeof Timeline !== \"undefined\" && Timeline) {\n        if (typeof Timeline.isPlaying === \"function\")\n          return !!Timeline.isPlaying();\n        if (typeof Timeline.playing !== \"undefined\") return !!Timeline.playing;\n      }\n\n      if (typeof Animation !== \"undefined\" && Animation?.selected) {\n        const a = Animation.selected;\n        if (typeof a.playing !== \"undefined\") return !!a.playing;\n      }\n\n      if (typeof BarItems !== \"undefined\" && BarItems?.play_animation) {\n        const b = BarItems.play_animation;\n        if (typeof b.active !== \"undefined\") return !!b.active;\n        if (typeof b.pressed !== \"undefined\") return !!b.pressed;\n        if (typeof b.value !== \"undefined\") return !!b.value;\n      }\n    } catch (e) {}\n    return false;\n  }\n\n  function getBlockbenchTimelineTimeSeconds() {\n    try {\n      const normalize = (v) => {\n        if (!Number.isFinite(v)) return null;\n        const n = Number(v);\n        // Some builds expose ms; most expose seconds.\n        return n > 10000 ? n / 1000 : n;\n      };\n\n      if (typeof Timeline !== \"undefined\" && Timeline) {\n        const t =\n          normalize(Timeline.time) ??\n          normalize(Timeline.currentTime) ??\n          normalize(Timeline.cursor_time) ??\n          normalize(Timeline.playhead) ??\n          normalize(Timeline.position);\n        if (t !== null) return t;\n      }\n\n      if (typeof Animator !== \"undefined\" && Animator) {\n        const t =\n          normalize(Animator.time) ??\n          normalize(Animator.currentTime) ??\n          normalize(Animator.playhead);\n        if (t !== null) return t;\n      }\n\n      if (typeof Animation !== \"undefined\" && Animation?.selected) {\n        const a = Animation.selected;\n        const t =\n          normalize(a?.time) ?? normalize(a?.currentTime) ?? normalize(a?.playhead);\n        if (t !== null) return t;\n      }\n    } catch (e) {}\n    return null;\n  }\n\n  function parsePlaybackSpeedMult(v) {\n    try {\n      if (v === null || v === undefined) return null;\n\n      if (typeof v === \"string\") {\n        const s0 = v.trim();\n        if (!s0) return null;\n        const isPct = s0.endsWith(\"%\");\n        const hasX = /x/i.test(s0);\n        const s = s0.replace(/[%x]/gi, \"\").trim();\n        const n = Number.parseFloat(s);\n        if (!Number.isFinite(n)) return null;\n        if (isPct) return n / 100;\n        // Heuristic: Blockbench commonly stores playback speed as percent integers\n        // (e.g. 100 = 100%, 10 = 10%). Only treat as a raw multiplier when explicitly marked with 'x'.\n        if (!hasX) {\n          if (Number.isFinite(n) && Math.abs(n - Math.round(n)) < 1e-6) {\n            if (n > 0 && n <= 1000) return n / 100;\n          }\n          if (n > 10 && n <= 1000) return n / 100;\n        }\n        return n;\n      }\n\n      if (typeof v === \"number\" && Number.isFinite(v)) {\n        // Same heuristic as the string path: small integer values usually mean percent.\n        if (Math.abs(v - Math.round(v)) < 1e-6) {\n          if (v > 0 && v <= 1000) return v / 100;\n        }\n        if (v > 10 && v <= 1000) return v / 100;\n        return v;\n      }\n\n      if (typeof v === \"object\") {\n        if (Number.isFinite(Number(v.value)))\n          return parsePlaybackSpeedMult(v.value);\n        if (Number.isFinite(Number(v.current)))\n          return parsePlaybackSpeedMult(v.current);\n      }\n    } catch (e) {}\n    return null;\n  }\n\n  function getBlockbenchPlaybackSpeedMult() {\n    try {\n      const clamp = (mult) => Math.max(0.01, Math.min(10, mult));\n      const tryParse = (v) => {\n        const mult = parsePlaybackSpeedMult(v);\n        return Number.isFinite(mult) ? clamp(mult) : null;\n      };\n\n      if (typeof Timeline !== \"undefined\" && Timeline) {\n        const v =\n          tryParse(Timeline.playback_speed) ??\n          tryParse(Timeline.playbackSpeed) ??\n          tryParse(Timeline.playback_rate) ??\n          tryParse(Timeline.playbackRate) ??\n          tryParse(Timeline.speed) ??\n          tryParse(Timeline.timescale) ??\n          tryParse(Timeline.time_scale);\n        if (v !== null) return v;\n      }\n\n      if (typeof Animator !== \"undefined\" && Animator) {\n        const v =\n          tryParse(Animator.playback_speed) ??\n          tryParse(Animator.playbackSpeed) ??\n          tryParse(Animator.playback_rate) ??\n          tryParse(Animator.playbackRate) ??\n          tryParse(Animator.speed) ??\n          tryParse(Animator.timescale) ??\n          tryParse(Animator.time_scale);\n        if (v !== null) return v;\n      }\n\n      if (typeof Animation !== \"undefined\" && Animation?.selected) {\n        const a = Animation.selected;\n        const v =\n          tryParse(a?.playback_speed) ??\n          tryParse(a?.playbackSpeed) ??\n          tryParse(a?.speed) ??\n          tryParse(a?.timescale) ??\n          tryParse(a?.time_scale);\n        if (v !== null) return v;\n      }\n\n      if (typeof BarItems !== \"undefined\" && BarItems) {\n        const v =\n          tryParse(BarItems.playback_speed?.value) ??\n          tryParse(BarItems.playback_speed) ??\n          tryParse(BarItems.animation_speed?.value) ??\n          tryParse(BarItems.animation_speed);\n        if (v !== null) return v;\n      }\n    } catch (e) {}\n    return 1.0;\n  }\n\n  // ============================================================\n  // Textures\n  // ============================================================\n\n  function createMovingGroundGridTexture(\n    sizePx,\n    minorAlpha = 1.0,\n    majorAlpha = 1.0,\n    backgroundColor = \"#2b2b2b\",\n    gridColor = \"#ffffff\",\n    lineThicknessMult = 1.0\n  ) {\n    const s = Math.max(64, Math.min(2048, Math.floor(sizePx || 512)));\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = s;\n    canvas.height = s;\n\n    const ctx = canvas.getContext(\"2d\");\n    if (!ctx) return null;\n\n    ctx.fillStyle = String(backgroundColor || \"#2b2b2b\");\n    ctx.fillRect(0, 0, s, s);\n\n    const rgb = parseHexColorToRgb255(gridColor) ||\n      parseHexColorToRgb255(\"#ffffff\") || { r: 255, g: 255, b: 255 };\n\n    const minor = Math.max(8, Math.floor(s / 16));\n    const major = minor * 4;\n\n    const mult = Math.max(0.25, Math.min(6, Number(lineThicknessMult) || 1));\n    const baseLineW = Math.max(0.25, Math.min(10, (s / 512) * mult));\n    const majorLineW = Math.max(baseLineW, Math.min(14, baseLineW * 1.75));\n\n    // Minor grid\n    ctx.strokeStyle = `rgba(${rgb.r},${rgb.g},${rgb.b},${Math.max(\n      0,\n      Math.min(1, minorAlpha)\n    )})`;\n    ctx.lineWidth = baseLineW;\n    for (let i = 0; i <= s; i += minor) {\n      ctx.beginPath();\n      ctx.moveTo(i + 0.5, 0);\n      ctx.lineTo(i + 0.5, s);\n      ctx.stroke();\n\n      ctx.beginPath();\n      ctx.moveTo(0, i + 0.5);\n      ctx.lineTo(s, i + 0.5);\n      ctx.stroke();\n    }\n\n    // Major grid\n    ctx.strokeStyle = `rgba(${rgb.r},${rgb.g},${rgb.b},${Math.max(\n      0,\n      Math.min(1, majorAlpha)\n    )})`;\n    ctx.lineWidth = majorLineW;\n    for (let i = 0; i <= s; i += major) {\n      ctx.beginPath();\n      ctx.moveTo(i + 0.5, 0);\n      ctx.lineTo(i + 0.5, s);\n      ctx.stroke();\n\n      ctx.beginPath();\n      ctx.moveTo(0, i + 0.5);\n      ctx.lineTo(s, i + 0.5);\n      ctx.stroke();\n    }\n\n    const tex = new THREE.CanvasTexture(canvas);\n    tex.wrapS = THREE.RepeatWrapping;\n    tex.wrapT = THREE.RepeatWrapping;\n    try {\n      tex.magFilter = THREE.NearestFilter;\n      tex.minFilter = THREE.NearestMipmapNearestFilter;\n      tex.generateMipmaps = true;\n      tex.anisotropy = 1;\n      tex.matrixAutoUpdate = true;\n    } catch (e) {}\n    tex.needsUpdate = true;\n    return tex;\n  }\n\n  function createMovingGroundCustomTextureFromDataUrl(dataUrl) {\n    const url = String(dataUrl || \"\");\n    if (!url) return null;\n    try {\n      const img = new Image();\n      img.src = url;\n      const tex = new THREE.Texture(img);\n      img.onload = () => {\n        try {\n          tex.magFilter = THREE.NearestFilter;\n          tex.minFilter = THREE.NearestFilter;\n          tex.generateMipmaps = false;\n          tex.anisotropy = 1;\n          tex.needsUpdate = true;\n        } catch (e) {}\n      };\n\n      tex.wrapS = THREE.RepeatWrapping;\n      tex.wrapT = THREE.RepeatWrapping;\n      try {\n        tex.magFilter = THREE.NearestFilter;\n        tex.minFilter = THREE.NearestFilter;\n        tex.generateMipmaps = false;\n        tex.anisotropy = 1;\n        tex.matrixAutoUpdate = true;\n      } catch (e) {}\n\n      tex.needsUpdate = true;\n      return tex;\n    } catch (e) {}\n    return null;\n  }\n\n  // ============================================================\n  // Material helpers\n  // ============================================================\n\n  function isGifRecordingActive() {\n    try {\n      const el = document.getElementById(\"gif_recording_frame\");\n      return !!el && el.classList?.contains?.(\"recording\");\n    } catch (e) {}\n    return false;\n  }\n\n  // Shader patch: edge fade (plane borders)\n  // - UV-space alpha fade so edges softly disappear (no texture regeneration)\n  // - Chains other onBeforeCompile hooks and self-heals if the material is recompiled\n  function enableEdgeFadeOnMaterial(material, fadeWidthUv = 0.08, ditherForGif = false) {\n    try {\n      if (!material) return;\n      const w = Math.max(0.001, Math.min(0.5, Number(fadeWidthUv) || 0.08));\n      const d = ditherForGif ? 1 : 0;\n\n      material.userData = material.userData || {};\n\n      // If already enabled, just update width (no shader recompile)\n      if (material.userData.__mgpEdgeFadeEnabled) {\n        const prevW = Number(material.userData.__mgpEdgeFadeWidthUv ?? 0);\n        const prevD = Number(material.userData.__mgpEdgeFadeDither ?? 0);\n        material.userData.__mgpEdgeFadeWidthUv = w;\n        material.userData.__mgpEdgeFadeDither = d;\n        try {\n          if (material.userData.__mgpEdgeFadeUniform?.value !== undefined) {\n            material.userData.__mgpEdgeFadeUniform.value = w;\n          }\n        } catch (e) {}\n        try {\n          if (material.userData.__mgpEdgeFadeDitherUniform?.value !== undefined) {\n            material.userData.__mgpEdgeFadeDitherUniform.value = d;\n          }\n        } catch (e) {}\n\n        // If the uniform handles are missing (e.g. a different renderer compiled the material),\n        // request a recompile so onBeforeCompile can re-bind uniforms.\n        try {\n          if (!material.userData.__mgpEdgeFadeUniform || !material.userData.__mgpEdgeFadeDitherUniform) {\n            material.needsUpdate = true;\n          }\n        } catch (e) {}\n\n        // If another system replaced onBeforeCompile, recompile so our hook runs again.\n        try {\n          if (\n            material.userData.__mgpEdgeFadeOnBeforeCompileRef &&\n            material.onBeforeCompile !== material.userData.__mgpEdgeFadeOnBeforeCompileRef\n          ) {\n            material.needsUpdate = true;\n          }\n        } catch (e) {}\n\n        // Safety: occasionally Blockbench/Three can end up with stale shader state.\n        // Debounce a recompile after the user stops scrubbing to guarantee the new value sticks.\n        try {\n          const changed = Math.abs(prevW - w) > 1e-6 || prevD !== d;\n          if (changed) {\n            if (material.userData.__mgpEdgeFadeRecompileTimer) {\n              clearTimeout(material.userData.__mgpEdgeFadeRecompileTimer);\n            }\n            material.userData.__mgpEdgeFadeRecompileTimer = setTimeout(() => {\n              try {\n                material.needsUpdate = true;\n              } catch (e) {}\n            }, 120);\n          }\n        } catch (e) {}\n        return;\n      }\n\n      material.userData.__mgpEdgeFadeEnabled = true;\n      material.userData.__mgpEdgeFadeWidthUv = w;\n      material.userData.__mgpEdgeFadeDither = d;\n      if (material.userData.__mgpPrevOnBeforeCompile === undefined) {\n        material.userData.__mgpPrevOnBeforeCompile = material.onBeforeCompile || null;\n      }\n\n      // Needs blending for fade.\n      material.transparent = true;\n      material.depthWrite = false;\n\n      material.onBeforeCompile = (shader) => {\n        try {\n          // Preserve any previous shader modifications from Blockbench/other plugins\n          try {\n            const prev = material?.userData?.__mgpPrevOnBeforeCompile;\n            if (typeof prev === \"function\") prev(shader);\n          } catch (e) {}\n\n          const curW = Math.max(\n            0.001,\n            Math.min(0.5, Number(material?.userData?.__mgpEdgeFadeWidthUv ?? 0.08) || 0.08)\n          );\n          const curD = Number(material?.userData?.__mgpEdgeFadeDither) ? 1 : 0;\n          shader.uniforms.mgpEdgeFadeWidthUv = { value: curW };\n          shader.uniforms.mgpEdgeFadeDither = { value: curD };\n          try {\n            material.userData.__mgpEdgeFadeUniform = shader.uniforms.mgpEdgeFadeWidthUv;\n            material.userData.__mgpEdgeFadeDitherUniform = shader.uniforms.mgpEdgeFadeDither;\n          } catch (e) {}\n\n          // IMPORTANT: vUv in MeshBasicMaterial is usually the *transformed* UV (repeat/offset/matrix).\n          // We want the plane-edge fade to stay glued to the geometry, not scroll with the texture.\n          // So we pass through the raw geometry UV as mgpUv0.\n          shader.vertexShader = `varying vec2 mgpUv0;\\n` + shader.vertexShader;\n          shader.fragmentShader =\n            `uniform float mgpEdgeFadeWidthUv;\\n` +\n            `uniform float mgpEdgeFadeDither;\\n` +\n            `varying vec2 mgpUv0;\\n` +\n            `float mgpBayer4(vec2 p) {\\n` +\n            `  vec2 fp = floor(mod(p, 4.0));\\n` +\n            `  int x = int(fp.x);\\n` +\n            `  int y = int(fp.y);\\n` +\n            `  int i = x + y * 4;\\n` +\n            `  float b = 0.0;\\n` +\n            `  if (i == 0) b = 0.0; else if (i == 1) b = 8.0; else if (i == 2) b = 2.0; else if (i == 3) b = 10.0;\\n` +\n            `  else if (i == 4) b = 12.0; else if (i == 5) b = 4.0; else if (i == 6) b = 14.0; else if (i == 7) b = 6.0;\\n` +\n            `  else if (i == 8) b = 3.0; else if (i == 9) b = 11.0; else if (i == 10) b = 1.0; else if (i == 11) b = 9.0;\\n` +\n            `  else if (i == 12) b = 15.0; else if (i == 13) b = 7.0; else if (i == 14) b = 13.0; else if (i == 15) b = 5.0;\\n` +\n            `  return (b + 0.5) / 16.0;\\n` +\n            `}\\n` +\n            shader.fragmentShader;\n\n          const uvInject = `mgpUv0 = uv;\\n#include <uv_vertex>`;\n          const vsBefore = shader.vertexShader;\n          let vsAfter = shader.vertexShader.replace(/#include <uv_vertex>/g, uvInject);\n          if (vsAfter === vsBefore) {\n            // Fallback: insert right after main() starts.\n            vsAfter = shader.vertexShader.replace(\n              /void\\s+main\\s*\\(\\s*\\)\\s*\\{/,\n              (m) => `${m}\\n  mgpUv0 = uv;`\n            );\n          }\n          shader.vertexShader = vsAfter;\n\n          const inject = `\n            vec2 mgpEdgeUv = clamp(mgpUv0, 0.0, 1.0);\n            float mgpEdgeDist = min(min(mgpEdgeUv.x, 1.0 - mgpEdgeUv.x), min(mgpEdgeUv.y, 1.0 - mgpEdgeUv.y));\n            float mgpEdgeFade = smoothstep(0.0, mgpEdgeFadeWidthUv, mgpEdgeDist);\n            float mgpB = mgpBayer4(gl_FragCoord.xy);\n            float mgpEdgeFadeMask = mix(mgpEdgeFade, step(mgpB, mgpEdgeFade), clamp(mgpEdgeFadeDither, 0.0, 1.0));\n            diffuseColor.a *= mgpEdgeFadeMask;\n          `;\n\n          // Preferred path: modify alpha then run normal output chunk.\n          const before = shader.fragmentShader;\n          let after = shader.fragmentShader.replace(\n            /#include <output_fragment>/g,\n            `${inject}\\n#include <output_fragment>`\n          );\n\n          // Fallback: if output chunk is inlined, patch common assignments.\n          if (after === before) {\n            after = after.replace(\n              /gl_FragColor\\s*=\\s*vec4\\s*\\(\\s*outgoingLight\\s*,\\s*diffuseColor\\.a\\s*\\)\\s*;/g,\n              `${inject}\\n  gl_FragColor = vec4(outgoingLight, diffuseColor.a);`\n            );\n          }\n          shader.fragmentShader = after;\n        } catch (e) {}\n      };\n\n      try {\n        material.userData.__mgpEdgeFadeOnBeforeCompileRef = material.onBeforeCompile;\n      } catch (e) {}\n\n      material.needsUpdate = true;\n    } catch (e) {}\n  }\n\n  function disableEdgeFadeOnMaterial(material) {\n    try {\n      if (!material?.userData?.__mgpEdgeFadeEnabled) return;\n      material.userData.__mgpEdgeFadeEnabled = false;\n      try {\n        delete material.userData.__mgpEdgeFadeUniform;\n        delete material.userData.__mgpEdgeFadeDitherUniform;\n        delete material.userData.__mgpEdgeFadeOnBeforeCompileRef;\n        if (material.userData.__mgpEdgeFadeRecompileTimer) {\n          clearTimeout(material.userData.__mgpEdgeFadeRecompileTimer);\n        }\n        delete material.userData.__mgpEdgeFadeRecompileTimer;\n      } catch (e) {}\n      const prev = material.userData.__mgpPrevOnBeforeCompile;\n      material.onBeforeCompile = typeof prev === \"function\" ? prev : null;\n      material.needsUpdate = true;\n    } catch (e) {}\n  }\n\n  // ============================================================\n  // Moving Ground Rig\n  // ============================================================\n\n  class MovingGroundRig {\n    constructor() {\n      this.group = null;\n      this.plane = null;\n      this.depth_plane = null;\n      this.side_helper = null;\n      this.texture = null;\n      this._raf = null;\n      this._lastMs = 0;\n\n      this._gridBlocksPerTile = null;\n      this._texResPx = null;\n      this._gridColor = null;\n      this._bgColor = null;\n      this._gridMinorOpacity = null;\n      this._gridMajorOpacity = null;\n      this._bgOpacity = null;\n      this._lineThicknessMult = null;\n      this._useCustomTexture = null;\n      this._customTextureDataUrl = null;\n      this._customRot90 = null;\n      this._customFlipX = null;\n      this._customFlipY = null;\n\n      // Effective rotation applied to the texture (0..3). Used to keep scroll direction stable.\n      this._effectiveScrollRot90 = 0;\n\n      // Timeline-anchored scrolling\n      this._timelineAnchorTime = null;\n      this._timelineAnchorOffsetX = 0;\n      this._timelineAnchorOffsetY = 0;\n      this._timelineAnchorSpeed = null;\n      this._timelineAnchorTileBlocks = null;\n\n      // Cached timeline/playback values to avoid heavy polling each frame\n      this._cachePlaying = false;\n      this._cachePlayingMs = 0;\n      this._cacheTimelineSec = null;\n      this._cacheTimelineMs = 0;\n      this._cachePlaybackMult = 1.0;\n      this._cachePlaybackMs = 0;\n    }\n\n    ensure() {\n      if (this.group) return;\n      if (!Canvas?.scene) return;\n\n      const g = new THREE.Group();\n      g.name = \"cazfps_animated_platforms\";\n\n      const geom = new THREE.PlaneGeometry(1, 1, 1, 1);\n      const tex = createMovingGroundGridTexture(512);\n\n      // Depth-only prepass mesh: makes the plane behave as a solid occluder.\n      // It writes to the depth buffer but does not draw color.\n      const depthMat = new THREE.MeshBasicMaterial({\n        color: 0x000000,\n        transparent: false,\n        opacity: 1,\n        side: THREE.DoubleSide,\n        depthTest: true,\n        depthWrite: true,\n        colorWrite: false,\n      });\n\n      const mat = new THREE.MeshBasicMaterial({\n        map: tex,\n        transparent: true,\n        opacity: 1,\n        side: THREE.DoubleSide,\n        depthTest: true,\n        depthWrite: false,\n      });\n\n      if (Settings.edgeFadeEnabled !== false) {\n        enableEdgeFadeOnMaterial(\n          mat,\n          Math.max(0.001, Math.min(0.5, Number(Settings.edgeFadeWidthUv ?? 0.08))),\n          false\n        );\n      }\n\n      const depthPlane = new THREE.Mesh(geom, depthMat);\n      depthPlane.name = \"cazfps_animated_platforms_depth\";\n      depthPlane.rotation.x = -Math.PI / 2;\n      depthPlane.renderOrder = -60;\n      depthPlane.frustumCulled = false;\n\n      const plane = new THREE.Mesh(geom, mat);\n      plane.name = \"cazfps_animated_platforms_mesh\";\n      plane.rotation.x = -Math.PI / 2;\n      plane.renderOrder = -50;\n      plane.frustumCulled = false;\n\n      // Side-view helper: a thin line that stays visible in *exact* orthographic side views\n      // so the user can still reference the ground height when the plane is edge-on.\n      const helperGeom = new THREE.BufferGeometry();\n      helperGeom.setAttribute(\n        \"position\",\n        new THREE.BufferAttribute(new Float32Array(6), 3)\n      );\n      const helperMat = new THREE.LineBasicMaterial({\n        color: 0xffffff,\n        transparent: true,\n        opacity: 0.9,\n        depthTest: false,\n      });\n      const sideHelper = new THREE.Line(helperGeom, helperMat);\n      sideHelper.name = \"cazfps_animated_platforms_side_helper\";\n      sideHelper.renderOrder = 10_000;\n      sideHelper.frustumCulled = false;\n      sideHelper.visible = false;\n\n      g.add(depthPlane);\n      g.add(plane);\n      g.add(sideHelper);\n      Canvas.scene.add(g);\n\n      this.group = g;\n      this.plane = plane;\n      this.depth_plane = depthPlane;\n      this.side_helper = sideHelper;\n      this.texture = tex;\n    }\n\n    start() {\n      if (this._raf) return;\n      this._lastMs =\n        typeof performance !== \"undefined\" && performance.now\n          ? performance.now()\n          : Date.now();\n\n      const loop = () => {\n        // If we were stopped/disposed while a frame was queued.\n        if (!this._raf) return;\n\n        try {\n          this.tick();\n        } catch (e) {}\n\n        // Only keep the loop alive while enabled + visible.\n        if (Settings?.enabled && this.group?.visible) {\n          this._raf = requestAnimationFrame(loop);\n        } else {\n          this._raf = null;\n        }\n      };\n\n      this._raf = requestAnimationFrame(loop);\n    }\n\n    stop() {\n      if (!this._raf) return;\n      try {\n        cancelAnimationFrame(this._raf);\n      } catch (e) {}\n      this._raf = null;\n    }\n\n    dispose() {\n      this.stop();\n      try {\n        if (this.plane) {\n          this.plane.geometry?.dispose?.();\n          this.plane.material?.dispose?.();\n        }\n        if (this.depth_plane) {\n          this.depth_plane.material?.dispose?.();\n        }\n        if (this.side_helper) {\n          this.side_helper.geometry?.dispose?.();\n          this.side_helper.material?.dispose?.();\n        }\n      } catch (e) {}\n      try {\n        this.texture?.dispose?.();\n      } catch (e) {}\n      try {\n        Canvas?.scene?.remove(this.group);\n      } catch (e) {}\n\n      this.group = null;\n      this.plane = null;\n      this.depth_plane = null;\n      this.side_helper = null;\n      this.texture = null;\n    }\n\n    _updateOrthoSideHelper() {\n      const helper = this.side_helper;\n      if (!helper?.geometry) return;\n      try {\n        helper.visible = false;\n        const cam = Canvas?.camera;\n        if (!cam) return;\n        if (!cam.isOrthographicCamera) return;\n        if (!this.group) return;\n\n        // Camera direction in world space\n        const dir = new THREE.Vector3();\n        cam.getWorldDirection(dir);\n\n        // Convert camera direction into the platform's local space (respect yaw/tilt)\n        const invQ = this.group.getWorldQuaternion(new THREE.Quaternion()).invert();\n        dir.applyQuaternion(invQ).normalize();\n\n        // Only show when it's truly side-on: almost perfectly horizontal, and nearly aligned to ±X or ±Z.\n        const epsY = 0.01; // ~0.57°\n        const epsAxis = 0.001; // extremely strict axis alignment\n        if (Math.abs(dir.y) > epsY) return;\n\n        const ax = Math.abs(dir.x);\n        const az = Math.abs(dir.z);\n        const alignedX = ax > 1 - epsAxis;\n        const alignedZ = az > 1 - epsAxis;\n        if (!alignedX && !alignedZ) return;\n\n        const blockSize = 16;\n        const widthBlocks = Math.max(3, Number(Settings.widthBlocks || 256));\n        const lengthBlocks = Math.max(3, Number(Settings.lengthBlocks || 256));\n        const halfW = (widthBlocks * blockSize) / 2;\n        const halfL = (lengthBlocks * blockSize) / 2;\n\n        const pos = helper.geometry.attributes.position;\n        if (!pos || pos.count < 2) return;\n\n        if (alignedX) {\n          // Looking along local ±X: show a line across local Z at y=0.\n          pos.setXYZ(0, 0, 0, -halfL);\n          pos.setXYZ(1, 0, 0, halfL);\n        } else {\n          // Looking along local ±Z: show a line across local X at y=0.\n          pos.setXYZ(0, -halfW, 0, 0);\n          pos.setXYZ(1, halfW, 0, 0);\n        }\n        pos.needsUpdate = true;\n\n        try {\n          // Tint like the grid color, and use the major opacity as intensity.\n          helper.material.color = new THREE.Color(\n            normalizeColorToHex(Settings.gridColor, \"#ffffff\")\n          );\n          helper.material.opacity = Math.max(\n            0.15,\n            Math.min(1, Number(Settings.gridMajorOpacity ?? 1.0))\n          );\n          helper.material.needsUpdate = false;\n        } catch (e) {}\n\n        helper.visible = true;\n      } catch (e) {}\n    }\n\n    setEnabled(enabled) {\n      this.ensure();\n      if (!this.group || !this.plane) return;\n      const on = !!enabled;\n      this.group.visible = on;\n      if (on) this.start();\n      else this.stop();\n    }\n\n    rebuildTexture(\n      blocksPerTile,\n      resPx,\n      backgroundColor,\n      backgroundOpacity,\n      gridColor,\n      minorAlpha,\n      majorAlpha,\n      lineThicknessMult,\n      useCustomTexture,\n      customTextureDataUrl\n    ) {\n      if (!this.plane) return;\n\n      const bpt = Math.max(0.25, Math.min(1024, Number(blocksPerTile) || 16));\n      const res = Math.max(64, Math.min(2048, Math.floor(resPx || 512)));\n      const bg = normalizeColorToHex(backgroundColor, \"#2b2b2b\");\n      const bgA = Math.max(0, Math.min(1, Number(backgroundOpacity ?? 1.0)));\n      const gc = normalizeColorToHex(gridColor, \"#ffffff\");\n      const minorA = Math.max(0, Math.min(1, Number(minorAlpha ?? 1.0)));\n      const majorA = Math.max(0, Math.min(1, Number(majorAlpha ?? 1.0)));\n      const thickness = Math.max(\n        0.25,\n        Math.min(6, Number(lineThicknessMult) || 1)\n      );\n      const dataUrl = String(customTextureDataUrl || \"\");\n      const useCustom = !!useCustomTexture && !!dataUrl;\n\n      const oldTex = this.texture;\n      const prevOffsetX = oldTex?.offset?.x || 0;\n      const prevOffsetY = oldTex?.offset?.y || 0;\n\n      const newTex = useCustom\n        ? createMovingGroundCustomTextureFromDataUrl(dataUrl)\n        : createMovingGroundGridTexture(\n            res,\n            minorA,\n            majorA,\n            hexToRgbaCss(bg, bgA),\n            gc,\n            thickness\n          );\n\n      if (!newTex) return;\n\n      try {\n        newTex.offset.set(prevOffsetX, prevOffsetY);\n      } catch (e) {}\n\n      this.texture = newTex;\n      const mat = this.plane.material;\n      if (mat && mat.map !== newTex) {\n        mat.map = newTex;\n        mat.needsUpdate = true;\n      }\n      try {\n        oldTex?.dispose?.();\n      } catch (e) {}\n\n      this._gridBlocksPerTile = bpt;\n      this._texResPx = res;\n      this._bgColor = bg;\n      this._bgOpacity = bgA;\n      this._gridColor = gc;\n      this._gridMinorOpacity = minorA;\n      this._gridMajorOpacity = majorA;\n      this._lineThicknessMult = thickness;\n      this._useCustomTexture = useCustom;\n      this._customTextureDataUrl = dataUrl;\n    }\n\n    refresh() {\n      this.ensure();\n      if (!this.group || !this.plane) return;\n\n      const blockSize = 16;\n      const widthBlocks = Math.max(3, Number(Settings.widthBlocks || 256));\n      const lengthBlocks = Math.max(3, Number(Settings.lengthBlocks || 256));\n      const width = widthBlocks * blockSize;\n      const length = lengthBlocks * blockSize;\n\n      const opacity = Math.max(0, Math.min(1, Number(Settings.opacity ?? 1)));\n      const yBlocks = Number(Settings.yBlocks || 0);\n      const xBlocks = Number(Settings.xBlocks || 0);\n      const zBlocks = Number(Settings.zBlocks || 0);\n      const yaw = Number(Settings.yaw || 0);\n      const tilt = Number(Settings.tilt || 0);\n\n      const gridBlocksPerTile = Math.max(\n        0.25,\n        Math.min(1024, Number(Settings.gridBlocksPerTile || 16))\n      );\n      const texResPx = Math.max(\n        64,\n        Math.min(2048, Math.floor(Number(Settings.textureResolutionPx || 512)))\n      );\n\n      const bgColor = normalizeColorToHex(Settings.backgroundColor, \"#2b2b2b\");\n      const bgOpacity = Math.max(0, Math.min(1, Number(Settings.backgroundOpacity ?? 1.0)));\n      const gridColor = normalizeColorToHex(Settings.gridColor, \"#ffffff\");\n      const minorAlpha = Math.max(0, Math.min(1, Number(Settings.gridMinorOpacity ?? 1.0)));\n      const majorAlpha = Math.max(0, Math.min(1, Number(Settings.gridMajorOpacity ?? 1.0)));\n      const lineThicknessMult = Math.max(\n        0.25,\n        Math.min(6, Number(Settings.lineThicknessMult || 1))\n      );\n      const useCustomTexture = !!Settings.useCustomTexture;\n      const customTextureDataUrl = String(Settings.customTextureDataUrl || \"\");\n      const effectiveUseCustomTexture =\n        useCustomTexture && !!customTextureDataUrl;\n\n      const rot90 = Math.max(\n        0,\n        Math.min(3, Math.floor(Number(Settings.customTextureRotation90 ?? 0)))\n      );\n      const flipX = !!Settings.customTextureFlipX;\n      const flipY = !!Settings.customTextureFlipY;\n\n      this.plane.scale.set(width, length, 1);\n      if (this.depth_plane) this.depth_plane.scale.set(width, length, 1);\n\n      this.group.position.set(\n        xBlocks * blockSize,\n        yBlocks * blockSize,\n        zBlocks * blockSize\n      );\n      this.group.rotation.set(\n        THREE.MathUtils.degToRad(tilt),\n        THREE.MathUtils.degToRad(yaw),\n        0\n      );\n\n      if (\n        this._gridBlocksPerTile !== gridBlocksPerTile ||\n        this._texResPx !== texResPx ||\n        this._bgColor !== bgColor ||\n        this._bgOpacity !== bgOpacity ||\n        this._gridColor !== gridColor ||\n        this._gridMinorOpacity !== minorAlpha ||\n        this._gridMajorOpacity !== majorAlpha ||\n        this._lineThicknessMult !== lineThicknessMult ||\n        this._useCustomTexture !== effectiveUseCustomTexture ||\n        this._customTextureDataUrl !== customTextureDataUrl\n      ) {\n        this.rebuildTexture(\n          gridBlocksPerTile,\n          texResPx,\n          bgColor,\n          bgOpacity,\n          gridColor,\n          minorAlpha,\n          majorAlpha,\n          lineThicknessMult,\n          effectiveUseCustomTexture,\n          customTextureDataUrl\n        );\n      }\n\n      if (this.texture) {\n        const denom = Math.max(0.25, gridBlocksPerTile);\n        const repX = widthBlocks / denom;\n        const repY = lengthBlocks / denom;\n        // Apply custom texture transforms without regenerating textures.\n        // These controls only apply to custom textures.\n        const tRot = effectiveUseCustomTexture ? rot90 : 0;\n        const tFlipX = effectiveUseCustomTexture ? flipX : false;\n        const tFlipY = effectiveUseCustomTexture ? flipY : false;\n\n        // Cache the effective rotation so the tick() can compensate scrolling.\n        this._effectiveScrollRot90 = tRot;\n\n        // Note: rotation swaps repeat axes.\n        const oddRot = tRot % 2 === 1;\n        const baseRepU = oddRot ? repY : repX;\n        const baseRepV = oddRot ? repX : repY;\n\n        const repU = baseRepU * (tFlipX ? -1 : 1);\n        const repV = baseRepV * (tFlipY ? -1 : 1);\n\n        this.texture.repeat.set(repU, repV);\n        try {\n          this.texture.center.set(0.5, 0.5);\n          // Keep U anchored; compensate for negative repeat so tiling stays aligned.\n          this.texture.offset.x = repU < 0 ? 1 : 0;\n        } catch (e) {}\n        try {\n          this.texture.rotation = (Math.PI / 2) * tRot;\n        } catch (e) {}\n        this.texture.matrixAutoUpdate = true;\n        try {\n          this.texture.updateMatrix?.();\n        } catch (e) {}\n        // Changing offset/repeat/transform matrix does not require a texture re-upload.\n      }\n\n      // Track whether the visible plane is treated as transparent in Three's renderer.\n      // If it is, we must not keep the depth-only occluder enabled; otherwise it blocks\n      // objects behind the plane (e.g. the model above when viewing from below).\n      let nextTransparent = opacity < 0.999;\n\n      try {\n        const mat = this.plane.material;\n        if (mat) {\n          // Edge fade toggle\n          try {\n            if (Settings.edgeFadeEnabled !== false) {\n              const w = Math.max(\n                0.001,\n                Math.min(0.5, Number(Settings.edgeFadeWidthUv ?? 0.08))\n              );\n              enableEdgeFadeOnMaterial(mat, w, isGifRecordingActive());\n            } else {\n              disableEdgeFadeOnMaterial(mat);\n            }\n          } catch (e) {}\n\n          const edgeFadeActive = !!mat.userData?.__mgpEdgeFadeEnabled;\n          nextTransparent = edgeFadeActive || opacity < 0.999;\n          const nextDepthWrite = !nextTransparent;\n          const prevTransparent = !!mat.transparent;\n          const prevDepthWrite = !!mat.depthWrite;\n\n          // Transparency blending needs the plane to render after opaque meshes.\n          // The mesh is created with a negative renderOrder (so it sits \"under\" the scene),\n          // but that makes semi-transparent opacity ineffective when viewing from below.\n          try {\n            const desiredOrder = nextTransparent ? 50 : -50;\n            if (this.plane && this.plane.renderOrder !== desiredOrder) {\n              this.plane.renderOrder = desiredOrder;\n            }\n          } catch (e) {}\n\n          mat.opacity = opacity;\n          mat.transparent = nextTransparent;\n          mat.depthWrite = nextDepthWrite;\n\n          if (prevTransparent !== nextTransparent || prevDepthWrite !== nextDepthWrite) {\n            mat.needsUpdate = true;\n          }\n        }\n      } catch (e) {}\n\n      // Control whether the occluder is active.\n      // The occluder exists to make the platform behave like a solid ground plane.\n      // Only enable it when the user actually wants an opaque plane (opacity ~ 1).\n      // If opacity is lowered, the occluder would block models behind the plane.\n      try {\n        if (this.depth_plane) {\n          const maxTexAlpha = effectiveUseCustomTexture\n            ? 1\n            : Math.max(bgOpacity, minorAlpha, majorAlpha);\n          const effectiveAlpha = opacity * maxTexAlpha;\n          const wantsOpaqueOccluder = opacity >= 0.999;\n          this.depth_plane.visible = wantsOpaqueOccluder && effectiveAlpha > 1e-4;\n        }\n      } catch (e) {}\n\n      // Cache custom texture transform settings\n      this._customRot90 = rot90;\n      this._customFlipX = flipX;\n      this._customFlipY = flipY;\n\n      this.setEnabled(!!Settings.enabled);\n    }\n\n    tick() {\n      // Safety: if the user disabled the plane but something left the timer running,\n      // stop it immediately to avoid persistent lag.\n      if (!Settings?.enabled) {\n        try {\n          if (this.group) this.group.visible = false;\n        } catch (e) {}\n        this.stop();\n        return;\n      }\n\n      if (!this.group?.visible) return;\n\n      // Keep the orthographic side helper reactive to camera changes.\n      // This is very cheap (a few vector ops) and makes side views usable.\n      this._updateOrthoSideHelper();\n\n      if (!this.texture) return;\n\n      const wrap01 = (v) => {\n        let x = Number(v || 0);\n        x = x % 1;\n        if (x < 0) x += 1;\n        return x;\n      };\n\n      // Rotating the texture should not rotate the *movement direction*.\n      // Compensate by scrolling along a different UV axis depending on rotation.\n      const rot90 = Number(this._effectiveScrollRot90 || 0) & 3;\n      const scrollDeltaToUv = (deltaUv) => {\n        switch (rot90) {\n          case 1:\n            return { du: deltaUv, dv: 0 };\n          case 2:\n            return { du: 0, dv: -deltaUv };\n          case 3:\n            return { du: -deltaUv, dv: 0 };\n          default:\n            return { du: 0, dv: deltaUv };\n        }\n      };\n\n      const now =\n        typeof performance !== \"undefined\" && performance.now\n          ? performance.now()\n          : Date.now();\n\n      const speed = Number(Settings.speedBlocksPerSec || 0);\n      const gridBlocksPerTile = Math.max(\n        0.25,\n        Math.min(1024, Number(Settings.gridBlocksPerTile || 16))\n      );\n      const effectiveTileBlocks = Math.max(0.25, gridBlocksPerTile);\n\n      // Fast-path: nothing to animate.\n      if (!speed) {\n        this._lastMs = now;\n        return;\n      }\n\n      // Cache play state (and playback speed) to reduce per-tick overhead.\n      let playing = this._cachePlaying;\n      // Keep this responsive: when the user hits pause/stop, the ground should stop immediately.\n      // We still keep a tiny cache window to avoid redundant checks multiple times within the same ms.\n      if (!this._cachePlayingMs || now - this._cachePlayingMs > 16) {\n        const prevPlaying = this._cachePlaying;\n        playing = isBlockbenchAnimationPlaying();\n        this._cachePlaying = playing;\n        this._cachePlayingMs = now;\n\n        // If we just transitioned from playing -> paused, avoid any extra \"drift\".\n        if (prevPlaying && !playing) {\n          this._lastMs = now;\n          this._timelineAnchorTime = null;\n          this._timelineAnchorSpeed = null;\n          this._timelineAnchorTileBlocks = null;\n        }\n      }\n\n      if (!playing) {\n        let timelineSec = this._cacheTimelineSec;\n        if (!this._cacheTimelineMs || now - this._cacheTimelineMs > 60) {\n          timelineSec = getBlockbenchTimelineTimeSeconds();\n          this._cacheTimelineSec = timelineSec;\n          this._cacheTimelineMs = now;\n        }\n        if (Number.isFinite(timelineSec)) {\n          const t = Number(timelineSec);\n\n          if (\n            this._timelineAnchorTime === null ||\n            this._timelineAnchorSpeed !== speed ||\n            this._timelineAnchorTileBlocks !== effectiveTileBlocks\n          ) {\n            this._timelineAnchorTime = t;\n            this._timelineAnchorOffsetX = this.texture.offset?.x || 0;\n            this._timelineAnchorOffsetY = this.texture.offset?.y || 0;\n            this._timelineAnchorSpeed = speed;\n            this._timelineAnchorTileBlocks = effectiveTileBlocks;\n          }\n\n          const deltaUv =\n            ((t - this._timelineAnchorTime) * speed) / effectiveTileBlocks;\n          const { du, dv } = scrollDeltaToUv(deltaUv);\n          const nextX = wrap01(this._timelineAnchorOffsetX + du);\n          const nextY = wrap01(this._timelineAnchorOffsetY + dv);\n          const curX = Number(this.texture.offset?.x || 0);\n          const curY = Number(this.texture.offset?.y || 0);\n          if (Math.abs(nextX - curX) > 1e-6) this.texture.offset.x = nextX;\n          if (Math.abs(nextY - curY) > 1e-6) this.texture.offset.y = nextY;\n          this._lastMs = now;\n          return;\n        }\n\n        this._lastMs = now;\n        return;\n      }\n\n      this._timelineAnchorTime = null;\n      this._timelineAnchorSpeed = null;\n      this._timelineAnchorTileBlocks = null;\n\n      const dt = Math.max(0, Math.min(0.2, (now - this._lastMs) / 1000));\n      this._lastMs = now;\n\n      let playbackMult = this._cachePlaybackMult;\n      if (!this._cachePlaybackMs || now - this._cachePlaybackMs > 250) {\n        playbackMult = getBlockbenchPlaybackSpeedMult();\n        this._cachePlaybackMult = playbackMult;\n        this._cachePlaybackMs = now;\n      }\n      const effectiveSpeed = speed * playbackMult;\n\n      const deltaUv = (effectiveSpeed * dt) / effectiveTileBlocks;\n      const { du, dv } = scrollDeltaToUv(deltaUv);\n      const nextX = wrap01((this.texture.offset?.x || 0) + du);\n      const nextY = wrap01((this.texture.offset?.y || 0) + dv);\n      const curX = Number(this.texture.offset?.x || 0);\n      const curY = Number(this.texture.offset?.y || 0);\n      if (Math.abs(nextX - curX) > 1e-6) this.texture.offset.x = nextX;\n      if (Math.abs(nextY - curY) > 1e-6) this.texture.offset.y = nextY;\n    }\n  }\n\n  const rig = new MovingGroundRig();\n\n  // ============================================================\n  // Animation presets (per-project + per-animation)\n  // ============================================================\n\n  function getSelectedAnimationSafe() {\n    try {\n      if (typeof Animation !== \"undefined\" && Animation?.selected) return Animation.selected;\n      if (typeof Animator !== \"undefined\" && Animator?.animation) return Animator.animation;\n    } catch (e) {}\n    return null;\n  }\n\n  function getSelectedAnimationKey() {\n    const a = getSelectedAnimationSafe();\n    if (!a) return null;\n\n    // Prefer stable UUID when available.\n    const uuid = String(a?.uuid || a?._uuid || \"\").trim();\n    if (uuid) return `uuid:${uuid}`;\n\n    const name = String(a?.name || \"\").trim();\n    if (name) return `name:${name}`;\n\n    const id = String(a?.id || \"\").trim();\n    if (id) return `id:${id}`;\n\n    return null;\n  }\n\n  function getSelectedAnimationName() {\n    const a = getSelectedAnimationSafe();\n    const name = String(a?.name || \"\").trim();\n    return name || \"(Unnamed Animation)\";\n  }\n\n  function sanitizeStorageKeyPart(value) {\n    return String(value || \"global\")\n      .trim()\n      .replace(/[^a-z0-9._-]+/gi, \"_\")\n      .slice(0, 200);\n  }\n\n  function hashStringFNV1a(str) {\n    // Small, fast, stable hash for namespacing keys.\n    // Returns 8-hex chars (32-bit).\n    let h = 0x811c9dc5;\n    const s = String(str || \"\");\n    for (let i = 0; i < s.length; i++) {\n      h ^= s.charCodeAt(i);\n      // h *= 16777619 (but keep 32-bit)\n      h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n    }\n    return (\"00000000\" + h.toString(16)).slice(-8);\n  }\n\n  function getProjectSafe() {\n    try {\n      // Accessing an undeclared global (Project) can throw a ReferenceError.\n      if (typeof Project !== \"undefined\") return Project;\n    } catch (e) {}\n    return null;\n  }\n\n  function getProjectFilePathLike(p) {\n    // Blockbench has used different field names across builds.\n    // Prefer the real on-disk identity when available.\n    try {\n      const candidates = [\n        p?.save_path,\n        p?.savePath,\n        p?.path,\n        p?.file_path,\n        p?.filePath,\n        p?.model_path,\n        p?.modelPath,\n        p?.export_path,\n        p?.exportPath,\n      ]\n        .map((v) => String(v || \"\").trim())\n        .filter(Boolean);\n      if (candidates.length) return candidates[0];\n    } catch (e) {}\n    return \"\";\n  }\n\n  function getAnimPresetPrimaryStorageKey() {\n    try {\n      const p = getProjectSafe();\n      const filePath = getProjectFilePathLike(p);\n      const uuid = String(p?.uuid || p?._uuid || p?.id || \"\").trim();\n      const name = String(p?.name || \"\").trim();\n\n      const ident = filePath\n        ? `file:${filePath}`\n        : uuid\n          ? `uuid:${uuid}`\n          : name\n            ? `name:${name}`\n            : \"global\";\n\n      const hash = hashStringFNV1a(ident);\n      const hint = sanitizeStorageKeyPart(ident).slice(0, 32);\n      return `${PRESET_PREFIX}${hash}_${hint}`;\n    } catch (e) {}\n    return `${PRESET_PREFIX}global`;\n  }\n\n  const _mgpProjectInstanceIds = new WeakMap();\n  function getOrCreateProjectInstanceId(p) {\n    try {\n      if (!p || typeof p !== \"object\") return \"no_project\";\n      const existing = _mgpProjectInstanceIds.get(p);\n      if (existing) return existing;\n      const id =\n        \"inst_\" +\n        Date.now().toString(36) +\n        \"_\" +\n        Math.random().toString(36).slice(2, 10);\n      _mgpProjectInstanceIds.set(p, id);\n      return id;\n    } catch (e) {}\n    return \"no_project\";\n  }\n\n  function getProjectIdentityKey() {\n    // Each save must be unique to the bbmodel.\n    // Prefer a stable on-disk identity (path). If unsaved, prefer a session-unique\n    // Project uuid/id over Project name (names collide a lot across models).\n    try {\n      const p = getProjectSafe();\n      const filePath = getProjectFilePathLike(p);\n      if (filePath) return `file:${filePath}`;\n\n      const candidates = [\n        p?.uuid,\n        p?._uuid,\n        p?.id,\n        // Some builds attach a per-project UUID under different names\n        p?.project_uuid,\n        p?.projectUUID,\n      ]\n        .map((v) => String(v || \"\").trim())\n        .filter(Boolean);\n      if (candidates.length) return `uuid:${candidates[0]}`;\n\n      const name = String(p?.name || \"\").trim();\n      if (name) return `name:${name}`;\n\n      // Absolute last resort: per-project-instance identity.\n      // Ensures different open models don't collide even if Blockbench doesn't expose\n      // a path/uuid for them.\n      return `inst:${getOrCreateProjectInstanceId(p)}`;\n    } catch (e) {}\n    return \"global\";\n  }\n\n  function getProjectNamespace() {\n    // Use a hash to avoid collisions from sanitization/truncation.\n    const ident = getProjectIdentityKey();\n    const hash = hashStringFNV1a(ident);\n    // Keep a short readable hint for debugging, but don't rely on it.\n    const hint = sanitizeStorageKeyPart(ident).slice(0, 32);\n    return `p_${hash}_${hint}`;\n  }\n\n  function getAnimPresetStorageKeys() {\n    return [getAnimPresetPrimaryStorageKey()];\n  }\n\n  function getGlobalAnimPresetStorageKey() {\n    return `${PRESET_PREFIX}global`;\n  }\n\n  function loadAnimPresetMap() {\n    try {\n      const keys = getAnimPresetStorageKeys();\n      const merged = {};\n\n      for (const key of keys) {\n        const raw = localStorage.getItem(key);\n        if (!raw) continue;\n        const obj = JSON.parse(raw);\n        if (obj && typeof obj === \"object\") Object.assign(merged, obj);\n      }\n\n      return merged;\n    } catch (e) {}\n    return {};\n  }\n\n  // Cache presets in-memory to avoid JSON parse churn while animating.\n  let _presetCacheKeySig = null;\n  let _presetCacheMap = null;\n\n  function getPresetCacheKeySig() {\n    try {\n      const keys = [...getAnimPresetStorageKeys()];\n      return keys.join(\"|\");\n    } catch (e) {}\n    return \"__preset_cache_sig__\";\n  }\n\n  function loadAnimPresetMapCached() {\n    const sig = getPresetCacheKeySig();\n    if (_presetCacheMap && _presetCacheKeySig === sig) return _presetCacheMap;\n    _presetCacheKeySig = sig;\n    _presetCacheMap = loadAnimPresetMap();\n    return _presetCacheMap;\n  }\n\n  function saveAnimPresetMap(map) {\n    try {\n      const keys = getAnimPresetStorageKeys();\n      const primary = keys[0] || getGlobalAnimPresetStorageKey();\n      localStorage.setItem(primary, JSON.stringify(map || {}));\n\n      // Refresh cache immediately after saving.\n      _presetCacheKeySig = null;\n      _presetCacheMap = null;\n    } catch (e) {}\n  }\n\n  function capturePreset() {\n    return {\n      enabled: !!Settings.enabled,\n      edgeFadeEnabled: Settings.edgeFadeEnabled !== false,\n      speedBlocksPerSec: Number(Settings.speedBlocksPerSec || 0),\n      widthBlocks: Number(Settings.widthBlocks || 256),\n      lengthBlocks: Number(Settings.lengthBlocks || 256),\n      yBlocks: Number(Settings.yBlocks || 0),\n      yaw: Number(Settings.yaw || 0),\n      tilt: Number(Settings.tilt || 0),\n      opacity: Number(Settings.opacity ?? 1.0),\n\n      gridBlocksPerTile: Number(Settings.gridBlocksPerTile || 16),\n      textureResolutionPx: Number(Settings.textureResolutionPx || 512),\n      gridColor: normalizeColorToHex(Settings.gridColor, \"#ffffff\"),\n      backgroundColor: normalizeColorToHex(Settings.backgroundColor, \"#2b2b2b\"),\n      lineThicknessMult: Number(Settings.lineThicknessMult || 1.0),\n\n      useCustomTexture: !!Settings.useCustomTexture,\n      customTextureDataUrl: String(Settings.customTextureDataUrl || \"\"),\n    };\n  }\n\n  function applyPreset(preset, options = {}) {\n    if (!preset || typeof preset !== \"object\") return;\n\n    const persist = options.persist !== false;\n    const updateDialog = options.updateDialog !== false;\n\n    Settings.enabled = !!preset.enabled;\n    Settings.edgeFadeEnabled = preset.edgeFadeEnabled !== false;\n    Settings.speedBlocksPerSec = Number(preset.speedBlocksPerSec || 0);\n\n    // Backward compatibility: older presets stored sizeBlocks.\n    const legacySize = Number(preset.sizeBlocks);\n    const legacy = Number.isFinite(legacySize) ? legacySize : null;\n\n    Settings.widthBlocks = Math.max(\n      3,\n      Number(preset.widthBlocks ?? legacy ?? 256)\n    );\n    Settings.lengthBlocks = Math.max(\n      3,\n      Number(preset.lengthBlocks ?? legacy ?? 256)\n    );\n\n    Settings.yBlocks = Number(preset.yBlocks || 0);\n    Settings.yaw = Number(preset.yaw || 0);\n    Settings.tilt = Number(preset.tilt || 0);\n    Settings.opacity = Math.max(0, Math.min(1, Number(preset.opacity ?? 1.0)));\n\n    Settings.gridBlocksPerTile = Math.max(\n      0.25,\n      Math.min(1024, Number(preset.gridBlocksPerTile || 16))\n    );\n    Settings.textureResolutionPx = Math.max(\n      64,\n      Math.min(2048, Math.floor(Number(preset.textureResolutionPx || 512)))\n    );\n    Settings.gridColor = normalizeColorToHex(preset.gridColor, \"#ffffff\");\n    Settings.backgroundColor = normalizeColorToHex(\n      preset.backgroundColor,\n      \"#2b2b2b\"\n    );\n    Settings.lineThicknessMult = Math.max(\n      0.25,\n      Math.min(6, Number(preset.lineThicknessMult || 1.0))\n    );\n\n    Settings.useCustomTexture = !!preset.useCustomTexture;\n    Settings.customTextureDataUrl = String(preset.customTextureDataUrl || \"\");\n\n    if (persist) {\n      Settings.save();\n    }\n    rig.refresh();\n    if (updateDialog) refreshDialogFromSettings();\n  }\n\n  function getPresetSavedForLabel() {\n    const key = getSelectedAnimationKey();\n    if (!key) return \"No animation selected\";\n    const map = loadAnimPresetMapCached();\n\n    const a = getSelectedAnimationSafe();\n    const legacyKeys = [];\n    try {\n      const name = String(a?.name || \"\").trim();\n      if (name) {\n        legacyKeys.push(name);\n        legacyKeys.push(`name:${name}`);\n      }\n      const uuid = String(a?.uuid || a?._uuid || \"\").trim();\n      if (uuid) {\n        legacyKeys.push(uuid);\n        legacyKeys.push(`uuid:${uuid}`);\n        legacyKeys.push(`id:${uuid}`);\n      }\n      const id = String(a?.id || \"\").trim();\n      if (id) {\n        legacyKeys.push(id);\n        legacyKeys.push(`id:${id}`);\n      }\n    } catch (e) {}\n\n    if (map && (map[key] || legacyKeys.some((k) => map[k]))) {\n      return `Saved for: ${getSelectedAnimationName()}`;\n    }\n    return \"Not saved for this animation\";\n  }\n\n  function savePresetForSelectedAnimation() {\n    return savePresetForSelectedAnimationImpl({ silent: false });\n  }\n\n  function savePresetForAnimationKey(animKey, animName, options = {}) {\n    const key = String(animKey || \"\");\n    if (!key) return;\n    const name = String(animName || \"\").trim() || \"(Unnamed Animation)\";\n    const map = loadAnimPresetMapCached();\n    map[key] = {\n      name,\n      savedAt: Date.now(),\n      preset: capturePreset(),\n    };\n    saveAnimPresetMap(map);\n  }\n\n  function savePresetForSelectedAnimationImpl(options = {}) {\n    const key = getSelectedAnimationKey();\n    if (!key) {\n      if (!options.silent) Blockbench.showQuickMessage(\"No animation selected\");\n      return;\n    }\n\n    savePresetForAnimationKey(key, getSelectedAnimationName(), options);\n\n    if (!options.silent) {\n      Blockbench.showQuickMessage(`Saved for ${getSelectedAnimationName()}`);\n      refreshDialogFromSettings();\n    }\n  }\n\n  function maybeApplyPresetForSelectedAnimation() {\n    const key = getSelectedAnimationKey();\n    if (!key) return;\n    const map = loadAnimPresetMapCached();\n    let entry = map?.[key];\n\n    // Backward compatibility for older saved keys.\n    if (!entry?.preset) {\n      try {\n        const a = getSelectedAnimationSafe();\n        const name = String(a?.name || \"\").trim();\n        const uuid = String(a?.uuid || a?._uuid || \"\").trim();\n        const id = String(a?.id || \"\").trim();\n\n        const candidates = [\n          name,\n          name ? `name:${name}` : \"\",\n          uuid,\n          uuid ? `uuid:${uuid}` : \"\",\n          uuid ? `id:${uuid}` : \"\",\n          id,\n          id ? `id:${id}` : \"\",\n        ]\n          .map((v) => String(v || \"\").trim())\n          .filter(Boolean);\n        for (const k of candidates) {\n          const e = map?.[k];\n          if (e?.preset) {\n            entry = e;\n            break;\n          }\n        }\n      } catch (e) {}\n    }\n\n    if (!entry?.preset) return;\n    // Apply instantly without persisting settings to storage (fast + avoids stutter).\n    applyPreset(entry.preset, { persist: false, updateDialog: true });\n  }\n\n  // ============================================================\n  // UI\n  // ============================================================\n\n  let dialog = null;\n  let action = null;\n  let timelineToggleAction = null;\n  let timelinePanelAction = null;\n  let aboutAction = null;\n\n  function deleteBarItemIfExists(id) {\n    try {\n      if (!id) return;\n      if (typeof BarItems !== \"undefined\" && BarItems && BarItems[id]) {\n        BarItems[id]?.delete?.();\n      }\n    } catch (e) {}\n  }\n\n  function tryAddActionToToolbar(toolbar, actionToAdd) {\n    try {\n      if (!toolbar || typeof toolbar.add !== \"function\" || !actionToAdd) return false;\n      // Avoid duplicates if Blockbench already placed it.\n      try {\n        const id = String(actionToAdd?.id || \"\");\n        const candidates = [\n          toolbar?.children,\n          toolbar?.items,\n          toolbar?.actions,\n          toolbar?.buttons,\n          toolbar?.content,\n        ].filter(Array.isArray);\n        for (const arr of candidates) {\n          if (arr.some((it) => it === actionToAdd || String(it?.id || it) === id)) {\n            return true;\n          }\n        }\n      } catch (e) {}\n      // Some toolbars accept (item, index)\n      try {\n        toolbar.add(actionToAdd);\n        return true;\n      } catch (e) {\n        try {\n          toolbar.add(actionToAdd, 0);\n          return true;\n        } catch (e2) {}\n      }\n    } catch (e) {}\n    return false;\n  }\n\n  function tryAttachTimelineToolbarActionsOnce() {\n    try {\n      if (!timelineToggleAction || !timelinePanelAction) return false;\n      if (typeof Toolbars === \"undefined\" || !Toolbars) return false;\n\n      // Prefer the canonical toolbar if present.\n      const candidates = [];\n      try {\n        if (Toolbars.timeline) candidates.push(Toolbars.timeline);\n      } catch (e) {}\n\n      // Best-effort discovery across versions.\n      try {\n        for (const [key, bar] of Object.entries(Toolbars)) {\n          const k = String(key || \"\").toLowerCase();\n          if (!k.includes(\"timeline\")) continue;\n          if (bar && !candidates.includes(bar)) candidates.push(bar);\n        }\n      } catch (e) {}\n\n      let any = false;\n      for (const bar of candidates) {\n        any = tryAddActionToToolbar(bar, timelineToggleAction) || any;\n        any = tryAddActionToToolbar(bar, timelinePanelAction) || any;\n\n        // Some builds expose addAction instead of add\n        if (!any) {\n          try {\n            if (typeof bar?.addAction === \"function\") {\n              bar.addAction(timelineToggleAction);\n              bar.addAction(timelinePanelAction);\n              any = true;\n            }\n          } catch (e) {}\n        }\n      }\n      return any;\n    } catch (e) {}\n    return false;\n  }\n\n  function waitForTimelineToolbarAndAttach() {\n    // Toolbars often initialize after plugins; wait a bit and attach once.\n    try {\n      let tries = 0;\n      const maxTries = 60; // ~15s at 250ms\n      const intervalMs = 250;\n      const timer = setInterval(() => {\n        tries++;\n        let done = false;\n        try {\n          done = !!tryAttachTimelineToolbarActionsOnce();\n        } catch (e) {}\n        if (done || tries >= maxTries) {\n          try {\n            clearInterval(timer);\n          } catch (e) {}\n        }\n      }, intervalMs);\n    } catch (e) {}\n  }\n\n  function attachTimelineToolbarActions() {\n    try {\n      if (!timelineToggleAction || !timelinePanelAction) return;\n      if (typeof Toolbars === \"undefined\" || !Toolbars) return;\n\n      // Best-effort: find a toolbar that looks like the timeline toolbar.\n      const candidates = [];\n      try {\n        for (const [key, bar] of Object.entries(Toolbars)) {\n          if (!key) continue;\n          const k = String(key).toLowerCase();\n          if (!k.includes(\"timeline\")) continue;\n          candidates.push(bar);\n        }\n      } catch (e) {}\n\n      // Also try common names if present.\n      try {\n        if (Toolbars.timeline) candidates.unshift(Toolbars.timeline);\n      } catch (e) {}\n\n      let any = false;\n      for (const bar of candidates) {\n        any = tryAddActionToToolbar(bar, timelineToggleAction) || any;\n        any = tryAddActionToToolbar(bar, timelinePanelAction) || any;\n      }\n\n      // If no timeline toolbar is discoverable, we still keep the actions registered\n      // so they appear in Blockbench's action lists.\n      return any;\n    } catch (e) {}\n    return false;\n  }\n\n  // ============================================================\n  // Persistent Timeline toolbar actions\n  // ============================================================\n\n  // IMPORTANT:\n  // These actions are created at script-evaluation time (outside `onload`).\n  // Blockbench restores custom toolbar layouts early during startup.\n  // If actions are only created in `onload`, they may not exist yet when the\n  // timeline toolbar layout is restored, causing the items to be dropped.\n  //\n  // By registering them immediately with stable IDs, Blockbench can resolve\n  // them and they persist across restarts.\n\n  function ensureTimelineActionsRegistered() {\n    try {\n      // Avoid duplicates on hot-reload or duplicate script injections.\n      deleteBarItemIfExists(\"animated_platforms_toggle\");\n      deleteBarItemIfExists(\"animated_platforms_panel_timeline\");\n\n      timelineToggleAction = new Action(\"animated_platforms_toggle\", {\n        name: \"Toggle ground plane\",\n        description: \"Toggle Animated Platforms on/off\",\n        icon: \"check_box\",\n        click() {\n          Settings.enabled = !Settings.enabled;\n          Settings.save();\n          scheduleRigRefresh();\n          try {\n            refreshDialogFromSettings();\n          } catch (e) {}\n          Blockbench.showQuickMessage(\n            Settings.enabled\n              ? \"Animated Platforms enabled\"\n              : \"Animated Platforms disabled\"\n          );\n        },\n      });\n\n      timelinePanelAction = new Action(\"animated_platforms_panel_timeline\", {\n        name: \"Animated Platforms\",\n        description: \"Open Animated Platforms controls\",\n        icon: \"grid_on\",\n        click: showPanel,\n      });\n    } catch (e) {\n      console.error(\"[AnimatedPlatforms] Failed to register timeline actions\", e);\n    }\n  }\n\n  function showAbout(banner = true) {\n    const name = \"Animated Platforms\";\n    const icon = \"grid_on\";\n    const links = {\n      discord: \"https://discord.gg/KDd2rcAPqA\",\n      twitter: \"https://x.com/cazfps1\",\n      website: \"https://www.cazfps.com/links\",\n    };\n    const websiteLogoUrl = getAnimatedPlatformsAssetUrl(\"cazfps.png\");\n\n    ensureAboutStyle();\n\n    new Dialog({\n      id: \"mgp_about\",\n      title: name,\n      width: 780,\n      buttons: [],\n      lines: [],\n      component: {\n        data() {\n          return {\n            banner: !!banner,\n            name,\n            links,\n            websiteLogoUrl,\n          };\n        },\n        template: `\n          <div>\n            <div v-if=\"banner\" id=\"mgp_banner\">\n              This window can be reopened at any time from <strong>Help &gt; About Plugins &gt; {{name}}</strong>\n            </div>\n\n            <div id=\"mgp_content\">\n              <h1 style=\"margin-top:-10px\">{{name}}</h1>\n              <p>An animated ground plane for easier walk cycles and vehicle motion previews.</p>\n\n              <h4>How to use</h4>\n              <p>\n                Open the panel from <b>View &gt; Animated Platforms</b> (or add the buttons to the Timeline toolbar).\n                Enable it, then play/pause the animation to preview foot contact and motion against the scrolling ground.\n              </p>\n\n              <h4>Tips</h4>\n              <p>- Hold <b>Shift</b> while adjusting values for finer steps.</p>\n              <p>- Use <b>Texture Library</b> to quickly reuse previous custom textures.</p>\n              <p>- Use <b>Save</b> to store a preset for the selected animation.</p>\n\n              <div class=\"mgp-socials\">\n                <a :href=\"links.twitter\" class=\"open-in-browser\">\n                  <i class=\"fa-brands fa-twitter\" style=\"color:#00acee\"></i>\n                  <label>X / Twitter</label>\n                </a>\n                <a :href=\"links.website\" class=\"open-in-browser\">\n                  <img class=\"mgp-site-icon\" :src=\"websiteLogoUrl\" alt=\"Website\" />\n                  <label>Website</label>\n                </a>\n                <a :href=\"links.discord\" class=\"open-in-browser\">\n                  <i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\n                  <label>Discord</label>\n                </a>\n              </div>\n            </div>\n          </div>\n        `,\n      },\n    }).show();\n\n    try {\n      $(\"dialog#mgp_about .dialog_title\").html(`\n        <i class=\"icon material-icons\">${icon}</i>\n        ${name}\n      `);\n    } catch (e) {}\n  }\n\n  function addAboutButton() {\n    try {\n      let about = MenuBar.menus.help.structure.find((e) => e.id === \"about_plugins\");\n      if (!about) {\n        about = new Action(\"about_plugins\", {\n          name: \"About Plugins...\",\n          icon: \"info\",\n          children: [],\n        });\n        MenuBar.addAction(about, \"help\");\n      }\n      aboutAction = new Action(`about_${PLUGIN_ID}`, {\n        name: \"About Animated Platforms...\",\n        icon: \"info\",\n        click: () => showAbout(true),\n      });\n      about.children.push(aboutAction);\n    } catch (e) {}\n  }\n  let toggle_action = null;\n\n  // Watchers\n  let presetWatcher = null;\n  let lastAnimKey = null;\n  let dialogLabelWatcher = null;\n\n  // Track last dialog values so we can tell whether the slider or number field changed.\n  // (Removed) slider+number pairing; we now use Blockbench's numeric-input widget.\n\n  // Pointer-lock for numeric scrubbing (prevents cursor hitting screen edges)\n  let numericScrubPointerLockCleanup = null;\n\n  function installNumericScrubPointerLock() {\n    try {\n      // Idempotent\n      if (typeof numericScrubPointerLockCleanup === \"function\") return;\n\n      const getDialogRoot = () => {\n        // Blockbench dialog roots vary by version; try a few selectors.\n        return (\n          document.getElementById(\"animated_platforms_panel\") ||\n          document.querySelector(\".dialog#animated_platforms_panel\") ||\n          document.querySelector('.dialog[dialog_id=\"animated_platforms_panel\"]') ||\n          document.querySelector('.dialog[dialog-id=\"animated_platforms_panel\"]') ||\n          null\n        );\n      };\n\n      const getPointerLockTarget = () => {\n        try {\n          const dom = Canvas?.renderer?.domElement;\n          if (dom && typeof dom.requestPointerLock === \"function\") return dom;\n        } catch (e) {}\n        try {\n          const c = document.querySelector(\"canvas.preview\") || document.querySelector(\".preview canvas\");\n          if (c && typeof c.requestPointerLock === \"function\") return c;\n        } catch (e) {}\n        try {\n          if (document.body && typeof document.body.requestPointerLock === \"function\") return document.body;\n        } catch (e) {}\n        return null;\n      };\n\n      const parseNum = (v, fallback = 0) => {\n        const n = Number(v);\n        return Number.isFinite(n) ? n : fallback;\n      };\n      const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\n      const getStep = (input) => {\n        const s = parseNum(input?.step, 0);\n        return s > 0 ? s : 1;\n      };\n      const dispatch = (el, type) => {\n        try {\n          el?.dispatchEvent?.(new Event(type, { bubbles: true }));\n        } catch (e) {}\n      };\n\n      let active = null;\n\n      const startScrub = (input, e) => {\n        try {\n          if (!input) return false;\n\n          // Request pointer lock in the *down* event (required on some builds).\n          try {\n            // Prefer the interacted element (most consistent with Electron gesture gating)\n            const t = e?.target;\n            if (t && typeof t.requestPointerLock === \"function\") {\n              t.requestPointerLock();\n            } else if (input && typeof input.requestPointerLock === \"function\") {\n              input.requestPointerLock();\n            } else {\n              const root = getDialogRoot();\n              if (root && typeof root.requestPointerLock === \"function\") root.requestPointerLock();\n              else {\n                const lockTarget = getPointerLockTarget();\n                lockTarget?.requestPointerLock?.();\n              }\n            }\n          } catch (e) {}\n\n          const step = getStep(input);\n          const min = input?.min !== undefined ? parseNum(input.min, -Infinity) : -Infinity;\n          const max = input?.max !== undefined ? parseNum(input.max, Infinity) : Infinity;\n          const base = parseNum(input.value, 0);\n\n          active = {\n            input,\n            base,\n            value: base,\n            step,\n            min,\n            max,\n          };\n\n          // Prevent the native drag from fighting our movement-based scrub.\n          try {\n            e?.preventDefault?.();\n            e?.stopPropagation?.();\n          } catch (e) {}\n\n          return true;\n        } catch (e) {}\n        return false;\n      };\n\n      const stopScrub = () => {\n        try {\n          if (active?.input) {\n            dispatch(active.input, \"change\");\n          }\n        } catch (e) {}\n        active = null;\n        try {\n          if (document.pointerLockElement) document.exitPointerLock?.();\n        } catch (e) {}\n      };\n\n      const pickScrubbableInput = (target, root) => {\n        try {\n          // Range sliders: scrub the range itself.\n          const range = target.closest('input[type=\"range\"]');\n          if (range && root.contains(range)) return range;\n\n          // Number inputs: only scrub when the user is NOT clicking into the input text.\n          const numDirect = target.closest('input[type=\"number\"]');\n          if (numDirect && root.contains(numDirect)) {\n            // If the click is on the arrow/stepper area (usually the right edge), allow scrub.\n            try {\n              const r = numDirect.getBoundingClientRect();\n              const x = Number(target.ownerDocument?.defaultView?.event?.clientX ?? NaN);\n              // We can't reliably access the event here; fallback to always allow on modifiers.\n            } catch (e) {}\n            return null;\n          }\n\n          const row = target.closest(\n            \".form_bar,.form_line,.form_row,.form-row,.form_group,.form-group\"\n          );\n          if (!row || !root.contains(row)) return null;\n          const num = row.querySelector('input[type=\"number\"]');\n          if (num) return num;\n        } catch (e) {}\n        return null;\n      };\n\n      const onDownCapture = (e) => {\n        try {\n          if (!e) return;\n          if (typeof e.button === \"number\" && e.button !== 0) return;\n          const root = getDialogRoot();\n          if (!root) return;\n          const target = e.target;\n          if (!(target instanceof HTMLElement)) return;\n          if (!root.contains(target)) return;\n\n          // Never scrub text inputs directly.\n          if (target.matches('textarea,select,[contenteditable=\"true\"]')) return;\n\n          // Special-case: number input arrow area drag\n          let input = pickScrubbableInput(target, root);\n          if (!input) {\n            const num = target.closest('input[type=\"number\"]');\n            if (num && root.contains(num)) {\n              // If user is dragging (or intends to drag) the stepper area at the right edge,\n              // start scrubbing instead of focusing for typing.\n              const rect = num.getBoundingClientRect?.();\n              const x = Number(e.clientX ?? 0);\n              const y = Number(e.clientY ?? 0);\n              const inRect = rect && x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n              const inStepper = inRect && rect && x >= rect.right - 24;\n              if (inStepper) input = num;\n            }\n          }\n          if (!input) return;\n\n          startScrub(input, e);\n        } catch (e) {}\n      };\n\n      const onMoveCapture = (e) => {\n        try {\n          if (!active?.input) return;\n          if (!e) return;\n\n          const buttons = typeof e.buttons === \"number\" ? e.buttons : 1;\n          if ((buttons & 1) === 0) return;\n\n          // movementX works best with pointer lock; fall back to clientX diff.\n          const dx = Number.isFinite(e.movementX) ? e.movementX : 0;\n\n          const step = active.step;\n          // Shift = finer changes (smaller delta)\n          const multShift = e.shiftKey ? 0.2 : 1;\n          const multCtrl = e.ctrlKey || e.metaKey ? 0.2 : 1;\n          const scale = 0.2; // ~5px per step\n\n          const delta = dx * step * scale * multShift * multCtrl;\n          if (!delta) return;\n\n          let next = active.value + delta;\n          next = clamp(next, active.min, active.max);\n\n          // Keep reasonable precision for fractional steps.\n          const stepStr = String(active.input.step || \"\");\n          const decimals = (stepStr.split(\".\")[1] || \"\").length;\n          if (decimals > 0) {\n            const p = Math.pow(10, Math.min(8, decimals));\n            next = Math.round(next * p) / p;\n          } else {\n            next = Math.round(next);\n          }\n\n          active.value = next;\n          active.input.value = String(next);\n          dispatch(active.input, \"input\");\n        } catch (e) {}\n      };\n\n      const onUp = () => stopScrub();\n      const onKeyDown = (e) => {\n        // Escape reliably exits pointer lock.\n        try {\n          if (e?.key === \"Escape\") stopScrub();\n        } catch (e) {}\n      };\n      const onPointerLockChange = () => {\n        try {\n          // If pointer lock was denied/exited externally, keep scrubbing (without lock)\n          // until mouseup, but don't force-stop mid-drag.\n        } catch (e) {}\n      };\n\n      document.addEventListener(\"mousedown\", onDownCapture, true);\n      document.addEventListener(\"pointerdown\", onDownCapture, true);\n      document.addEventListener(\"mousemove\", onMoveCapture, true);\n      document.addEventListener(\"pointermove\", onMoveCapture, true);\n      document.addEventListener(\"mouseup\", onUp, true);\n      document.addEventListener(\"pointerup\", onUp, true);\n      document.addEventListener(\"keydown\", onKeyDown, true);\n      document.addEventListener(\"pointerlockchange\", onPointerLockChange, false);\n\n      numericScrubPointerLockCleanup = () => {\n        try {\n          document.removeEventListener(\"mousedown\", onDownCapture, true);\n          document.removeEventListener(\"pointerdown\", onDownCapture, true);\n          document.removeEventListener(\"mousemove\", onMoveCapture, true);\n          document.removeEventListener(\"pointermove\", onMoveCapture, true);\n          document.removeEventListener(\"mouseup\", onUp, true);\n          document.removeEventListener(\"pointerup\", onUp, true);\n          document.removeEventListener(\"keydown\", onKeyDown, true);\n          document.removeEventListener(\n            \"pointerlockchange\",\n            onPointerLockChange,\n            false\n          );\n        } catch (e) {}\n        stopScrub();\n        numericScrubPointerLockCleanup = null;\n      };\n    } catch (e) {\n      numericScrubPointerLockCleanup = null;\n    }\n  }\n\n  // Debounce refresh to avoid hammering the renderer while dragging sliders.\n  let refreshDebounceTimer = null;\n  function scheduleRigRefresh() {\n    try {\n      if (refreshDebounceTimer) clearTimeout(refreshDebounceTimer);\n    } catch (e) {}\n    refreshDebounceTimer = null;\n    try {\n      refreshDebounceTimer = setTimeout(() => {\n        try {\n          rig.refresh();\n        } catch (e) {}\n      }, 16);\n    } catch (e) {}\n  }\n\n  // Debounced auto-save of the current settings as the selected animation's preset.\n  let autoSaveDebounceTimer = null;\n  function scheduleAutoSaveToSelectedAnimation() {\n    // Capture the current target key at schedule time.\n    // Otherwise, if the user switches animations/models during the debounce window,\n    // the save would apply to the *new* selection and overwrite other presets.\n    let targetKey = null;\n    let targetName = \"\";\n    try {\n      if (!Settings?.autoSaveToAnimation) return;\n      targetKey = getSelectedAnimationKey();\n      if (!targetKey) return;\n      targetName = getSelectedAnimationName();\n    } catch (e) {\n      return;\n    }\n\n    try {\n      if (autoSaveDebounceTimer) clearTimeout(autoSaveDebounceTimer);\n    } catch (e) {}\n    autoSaveDebounceTimer = null;\n\n    try {\n      autoSaveDebounceTimer = setTimeout(() => {\n        try {\n          if (!Settings?.autoSaveToAnimation) return;\n          savePresetForAnimationKey(targetKey, targetName, { silent: true });\n        } catch (e) {}\n      }, 150);\n    } catch (e) {}\n  }\n\n  function wrapDialogHideToRestoreOverlay(dlg) {\n    try {\n      if (!dlg) return;\n      if (dlg.__mgpHideWrapped) return;\n      const originalHide = dlg.hide?.bind(dlg);\n      if (typeof originalHide !== \"function\") return;\n\n      dlg.hide = (...args) => {\n        try {\n          setNoOverlayEnabled(false);\n        } catch (e) {}\n        try {\n          setNoBlurEnabled(false);\n        } catch (e) {}\n        try {\n          numericScrubPointerLockCleanup?.();\n        } catch (e) {}\n        numericScrubPointerLockCleanup = null;\n        return originalHide(...args);\n      };\n      dlg.__mgpHideWrapped = true;\n    } catch (e) {}\n  }\n\n  // Cleanup: revert global side-effects + timers + UI handles.\n  // Safe to call multiple times; used both for defensive double-load and on actual unload.\n  function forceCleanup() {\n    try {\n      if (presetWatcher) clearInterval(presetWatcher);\n    } catch (e) {}\n    presetWatcher = null;\n    lastAnimKey = null;\n\n    try {\n      if (dialogLabelWatcher) clearInterval(dialogLabelWatcher);\n    } catch (e) {}\n    dialogLabelWatcher = null;\n\n    try {\n      setNoOverlayEnabled(false);\n    } catch (e) {}\n    try {\n      setNoBlurEnabled(false);\n    } catch (e) {}\n    try {\n      document.getElementById(NO_OVERLAY_STYLE_ID)?.remove?.();\n    } catch (e) {}\n    try {\n      document.getElementById(NO_BLUR_STYLE_ID)?.remove?.();\n    } catch (e) {}\n\n    try {\n      document.getElementById(PANEL_STYLE_ID)?.remove?.();\n    } catch (e) {}\n    try {\n      document.getElementById(ABOUT_STYLE_ID)?.remove?.();\n    } catch (e) {}\n\n    try {\n      dialog?.hide?.();\n    } catch (e) {}\n    dialog = null;\n\n    try {\n      textureLibraryDialog?.hide?.();\n    } catch (e) {}\n    textureLibraryDialog = null;\n\n    try {\n      numericScrubPointerLockCleanup?.();\n    } catch (e) {}\n    numericScrubPointerLockCleanup = null;\n\n    try {\n      rig.dispose();\n    } catch (e) {}\n\n    try {\n      if (refreshDebounceTimer) clearTimeout(refreshDebounceTimer);\n    } catch (e) {}\n    refreshDebounceTimer = null;\n\n    try {\n      if (autoSaveDebounceTimer) clearTimeout(autoSaveDebounceTimer);\n    } catch (e) {}\n    autoSaveDebounceTimer = null;\n\n    try {\n      if (action && typeof Preview !== \"undefined\" && Preview.prototype.menu) {\n        Preview.prototype.menu.removeAction(action);\n      }\n    } catch (e) {}\n    try {\n      if (action && typeof Blockbench !== \"undefined\" && Blockbench.menus?.preview) {\n        Blockbench.menus.preview.removeAction(action);\n      }\n    } catch (e) {}\n\n    try {\n      action?.delete?.();\n    } catch (e) {}\n    action = null;\n\n    try {\n      timelineToggleAction?.delete?.();\n    } catch (e) {}\n    timelineToggleAction = null;\n\n    try {\n      timelinePanelAction?.delete?.();\n    } catch (e) {}\n    timelinePanelAction = null;\n\n    try {\n      MenuBar.removeAction(`help.about_plugins.about_${PLUGIN_ID}`);\n    } catch (e) {}\n    try {\n      aboutAction?.delete?.();\n    } catch (e) {}\n    aboutAction = null;\n\n  }\n\n  try {\n    if (globalThis?.[INSTANCE_KEY]) {\n      globalThis[INSTANCE_KEY].cleanup = forceCleanup;\n    }\n  } catch (e) {}\n\n  function trySetDialogFormValues(dlg, values) {\n    try {\n      if (!dlg) return;\n      if (typeof dlg.setFormValues === \"function\") {\n        dlg.setFormValues(values);\n      } else if (typeof dlg.setFormValue === \"function\") {\n        for (const [k, v] of Object.entries(values || {})) {\n          dlg.setFormValue(k, v);\n        }\n      }\n    } catch (e) {}\n  }\n\n  function pickCustomTextureDataUrl(onDone) {\n    try {\n      const input = document.createElement(\"input\");\n      input.type = \"file\";\n      input.accept = \"image/*\";\n      input.onchange = () => {\n        const file = input.files && input.files[0];\n        if (!file) return;\n        const reader = new FileReader();\n        reader.onload = () => {\n          try {\n            onDone?.(String(reader.result || \"\"));\n          } catch (e) {}\n        };\n        reader.readAsDataURL(file);\n      };\n      input.click();\n    } catch (e) {}\n  }\n\n  function refreshDialogFromSettings() {\n    try {\n      const vm = dialog?.content_vue;\n      if (!vm) return;\n      if (typeof vm.syncFromSettings === \"function\") vm.syncFromSettings();\n    } catch (e) {}\n  }\n\n  function rememberCustomTexture(dataUrl) {\n    const url = String(dataUrl || \"\").trim();\n    if (!url) return;\n    try {\n      if (!Array.isArray(Settings.savedTextures)) Settings.savedTextures = [];\n      // Move to front if it already exists\n      const idx = Settings.savedTextures.indexOf(url);\n      if (idx !== -1) Settings.savedTextures.splice(idx, 1);\n      Settings.savedTextures.unshift(url);\n      Settings.savedTextures = Settings.savedTextures.slice(0, 64);\n      const ok = Settings.save();\n      if (!ok) {\n        try {\n          Blockbench.showQuickMessage(\n            \"Couldn't save texture library (storage full). Try smaller textures or delete some.\",\n            4000\n          );\n        } catch (e) {}\n      }\n    } catch (e) {}\n  }\n\n  let textureLibraryDialog = null;\n  function showTextureLibraryDialog() {\n    try {\n      if (textureLibraryDialog) {\n        textureLibraryDialog.show();\n        try {\n          textureLibraryDialog.content_vue?.refresh?.();\n        } catch (e) {}\n        return;\n      }\n    } catch (e) {\n      textureLibraryDialog = null;\n    }\n\n    textureLibraryDialog = new Dialog({\n      id: \"animated_platforms_textures\",\n      title: \"🖼️ Animated Platforms textures\",\n      width: 520,\n      buttons: [],\n      component: {\n        data() {\n          return {\n            textures: Array.isArray(Settings.savedTextures)\n              ? Settings.savedTextures.slice()\n              : [],\n          };\n        },\n        methods: {\n          refresh() {\n            this.textures = Array.isArray(Settings.savedTextures)\n              ? Settings.savedTextures.slice()\n              : [];\n          },\n          useTexture(url) {\n            const u = String(url || \"\");\n            if (!u) return;\n            Settings.customTextureDataUrl = u;\n            Settings.useCustomTexture = true;\n            rememberCustomTexture(u);\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            try {\n              refreshDialogFromSettings();\n            } catch (e) {}\n          },\n          deleteTexture(url) {\n            const u = String(url || \"\");\n            if (!u) return;\n            try {\n              const arr = Array.isArray(Settings.savedTextures)\n                ? Settings.savedTextures\n                : [];\n              const i = arr.indexOf(u);\n              if (i !== -1) arr.splice(i, 1);\n\n              if (Settings.customTextureDataUrl === u) {\n                Settings.customTextureDataUrl = \"\";\n                Settings.useCustomTexture = false;\n              }\n              Settings.save();\n              scheduleRigRefresh();\n              scheduleAutoSaveToSelectedAnimation();\n            } catch (e) {}\n            this.refresh();\n          },\n          clearAll() {\n            try {\n              Settings.savedTextures = [];\n              if (Settings.useCustomTexture) {\n                Settings.useCustomTexture = false;\n                Settings.customTextureDataUrl = \"\";\n              }\n              Settings.save();\n              scheduleRigRefresh();\n              scheduleAutoSaveToSelectedAnimation();\n            } catch (e) {}\n            this.refresh();\n          },\n          close() {\n            try {\n              textureLibraryDialog.hide();\n            } catch (e) {}\n          },\n        },\n        mounted() {\n          this.refresh();\n        },\n        template: `\n          <div id=\"mgp-texture-library\">\n            <div class=\"mgp-texture-library-header\">\n              <div class=\"mgp-subtle\">Previously used custom textures</div>\n              <div class=\"spacer\"></div>\n              <button class=\"tool\" @click=\"clearAll\" :disabled=\"!textures.length\">Clear All</button>\n            </div>\n\n            <div v-if=\"!textures.length\" class=\"mgp-empty\">\n              No textures saved yet. Use “Choose Texture” in the main panel.\n            </div>\n\n            <div v-else class=\"mgp-texture-grid\">\n              <div v-for=\"(t, idx) in textures\" :key=\"idx\" class=\"mgp-texture-card\">\n                <div class=\"mgp-thumb\">\n                  <img :src=\"t\" />\n                </div>\n                <div class=\"mgp-texture-actions\">\n                  <button class=\"tool\" @click=\"useTexture(t)\">Use</button>\n                  <button class=\"tool\" @click=\"deleteTexture(t)\">Delete</button>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"mgp-footer\">\n              <div class=\"spacer\"></div>\n              <button class=\"tool\" @click=\"close\">Close</button>\n            </div>\n          </div>\n        `,\n      },\n    });\n\n    textureLibraryDialog.show();\n  }\n\n  function showPanel() {\n    // Avoid deprecated HTML strings in Dialog.lines\n    ensurePanelStyle();\n    rig.refresh();\n\n    const startDialogLabelWatcher = () => {\n      try {\n        if (dialogLabelWatcher) clearInterval(dialogLabelWatcher);\n      } catch (e) {}\n      dialogLabelWatcher = null;\n\n      // Only needed while the dialog exists; keep it light.\n      try {\n        dialogLabelWatcher = setInterval(() => {\n          try {\n            if (!dialog) return;\n            const vm = dialog?.content_vue;\n            if (vm && typeof vm === \"object\") {\n              vm.presetSavedFor = getPresetSavedForLabel();\n            }\n          } catch (e) {}\n        }, 250);\n      } catch (e) {}\n    };\n\n    const stopDialogLabelWatcher = () => {\n      try {\n        if (dialogLabelWatcher) clearInterval(dialogLabelWatcher);\n      } catch (e) {}\n      dialogLabelWatcher = null;\n    };\n\n    if (dialog) {\n      try {\n        wrapDialogHideToRestoreOverlay(dialog);\n        // Make this dialog a hovering menu (no blackout overlay).\n        setNoOverlayEnabled(true);\n        setNoBlurEnabled(true);\n        dialog.show();\n        refreshDialogFromSettings();\n        startDialogLabelWatcher();\n        return;\n      } catch (e) {}\n    }\n\n    dialog = new Dialog({\n      id: \"animated_platforms_panel\",\n      title: \"🛝 Animated Platforms\",\n      width: 460,\n      buttons: [],\n      lines: [],\n      component: {\n        data() {\n          return {\n            _suppress: false,\n            shiftDown: false,\n\n            presetSavedFor: getPresetSavedForLabel(),\n\n            // Quick presets\n            sizePreset: \"\",\n            speedPreset: \"\",\n\n            form: {\n              enabled: !!Settings.enabled,\n              autoSaveToAnimation: !!Settings.autoSaveToAnimation,\n\n              opacity: Number(Settings.opacity ?? 1.0),\n\n              edgeFadeEnabled: Settings.edgeFadeEnabled !== false,\n              edgeFadeWidthUv: Number(Settings.edgeFadeWidthUv ?? 0.08),\n\n              speedBlocksPerSec: Number(Settings.speedBlocksPerSec || 0),\n\n              widthBlocks: Number(Settings.widthBlocks || 256),\n              lengthBlocks: Number(Settings.lengthBlocks || 256),\n              yBlocks: Number(Settings.yBlocks || 0),\n              xBlocks: Number(Settings.xBlocks || 0),\n              zBlocks: Number(Settings.zBlocks || 0),\n              yaw: Number(Settings.yaw || 0),\n              tilt: Number(Settings.tilt || 0),\n\n              gridSquareBlocks: (Number(Settings.gridBlocksPerTile || 16) || 16) / 16,\n              textureResolutionPx: Number(Settings.textureResolutionPx || 512),\n              lineThicknessMult: Number(Settings.lineThicknessMult || 1.0),\n\n              gridMinorOpacity: Number(Settings.gridMinorOpacity ?? 1.0),\n              gridMajorOpacity: Number(Settings.gridMajorOpacity ?? 1.0),\n              backgroundOpacity: Number(Settings.backgroundOpacity ?? 1.0),\n              backgroundColor: String(Settings.backgroundColor || \"#2b2b2b\"),\n              gridColor: String(Settings.gridColor || \"#ffffff\"),\n\n              useCustomTexture: !!Settings.useCustomTexture,\n              customTextureRotation90: Number(Settings.customTextureRotation90 ?? 0),\n              customTextureFlipX: !!Settings.customTextureFlipX,\n              customTextureFlipY: !!Settings.customTextureFlipY,\n            },\n          };\n        },\n        methods: {\n          syncFromSettings() {\n            try {\n              this._suppress = true;\n              this.presetSavedFor = getPresetSavedForLabel();\n\n              this.form.enabled = !!Settings.enabled;\n              this.form.autoSaveToAnimation = !!Settings.autoSaveToAnimation;\n              this.form.opacity = Number(Settings.opacity ?? 1.0);\n\n              this.form.edgeFadeEnabled = Settings.edgeFadeEnabled !== false;\n              this.form.edgeFadeWidthUv = Number(Settings.edgeFadeWidthUv ?? 0.08);\n\n              this.form.speedBlocksPerSec = Number(Settings.speedBlocksPerSec || 0);\n\n              this.form.widthBlocks = Number(Settings.widthBlocks || 256);\n              this.form.lengthBlocks = Number(Settings.lengthBlocks || 256);\n              this.form.yBlocks = Number(Settings.yBlocks || 0);\n              this.form.xBlocks = Number(Settings.xBlocks || 0);\n              this.form.zBlocks = Number(Settings.zBlocks || 0);\n              this.form.yaw = Number(Settings.yaw || 0);\n              this.form.tilt = Number(Settings.tilt || 0);\n\n              this.form.gridSquareBlocks =\n                (Number(Settings.gridBlocksPerTile || 16) || 16) / 16;\n              this.form.textureResolutionPx = Number(Settings.textureResolutionPx || 512);\n              this.form.lineThicknessMult = Number(Settings.lineThicknessMult || 1.0);\n\n              this.form.gridMinorOpacity = Number(Settings.gridMinorOpacity ?? 1.0);\n              this.form.gridMajorOpacity = Number(Settings.gridMajorOpacity ?? 1.0);\n              this.form.backgroundOpacity = Number(Settings.backgroundOpacity ?? 1.0);\n              this.form.backgroundColor = String(Settings.backgroundColor || \"#2b2b2b\");\n              this.form.gridColor = String(Settings.gridColor || \"#ffffff\");\n\n              this.form.useCustomTexture = !!Settings.useCustomTexture;\n              this.form.customTextureRotation90 = Number(Settings.customTextureRotation90 ?? 0);\n              this.form.customTextureFlipX = !!Settings.customTextureFlipX;\n              this.form.customTextureFlipY = !!Settings.customTextureFlipY;\n            } catch (e) {}\n            try {\n              this._suppress = false;\n            } catch (e) {}\n          },\n          apply() {\n            if (this._suppress) return;\n\n            Settings.enabled = !!this.form.enabled;\n            Settings.autoSaveToAnimation = !!this.form.autoSaveToAnimation;\n\n            Settings.opacity = Math.max(0, Math.min(1, Number(this.form.opacity ?? 1.0)));\n\n            Settings.edgeFadeEnabled = this.form.edgeFadeEnabled !== false;\n            Settings.edgeFadeWidthUv = Math.max(\n              0.001,\n              Math.min(0.5, Number(this.form.edgeFadeWidthUv ?? 0.08))\n            );\n\n            Settings.speedBlocksPerSec = Number(this.form.speedBlocksPerSec || 0);\n\n            Settings.widthBlocks = Math.max(3, Number(this.form.widthBlocks || 256));\n            Settings.lengthBlocks = Math.max(3, Number(this.form.lengthBlocks || 256));\n            Settings.yBlocks = Number(this.form.yBlocks || 0);\n            Settings.xBlocks = Number(this.form.xBlocks || 0);\n            Settings.zBlocks = Number(this.form.zBlocks || 0);\n            Settings.yaw = Number(this.form.yaw || 0);\n            Settings.tilt = Number(this.form.tilt || 0);\n\n            const sq = Number(this.form.gridSquareBlocks);\n            if (Number.isFinite(sq)) {\n              Settings.gridBlocksPerTile = Math.max(0.25, Math.min(1024, sq * 16));\n            }\n            Settings.textureResolutionPx = Math.max(\n              64,\n              Math.min(2048, Math.floor(Number(this.form.textureResolutionPx || 512)))\n            );\n            Settings.lineThicknessMult = Math.max(\n              0.25,\n              Math.min(6, Number(this.form.lineThicknessMult || 1.0))\n            );\n\n            Settings.gridMinorOpacity = Math.max(0, Math.min(1, Number(this.form.gridMinorOpacity ?? 1.0)));\n            Settings.gridMajorOpacity = Math.max(0, Math.min(1, Number(this.form.gridMajorOpacity ?? 1.0)));\n            Settings.backgroundOpacity = Math.max(0, Math.min(1, Number(this.form.backgroundOpacity ?? 1.0)));\n\n            Settings.backgroundColor = normalizeColorToHex(this.form.backgroundColor, \"#2b2b2b\");\n            Settings.gridColor = normalizeColorToHex(this.form.gridColor, \"#ffffff\");\n\n            Settings.useCustomTexture = !!this.form.useCustomTexture;\n            Settings.customTextureRotation90 = Math.max(\n              0,\n              Math.min(3, Math.floor(Number(this.form.customTextureRotation90 ?? 0)))\n            );\n            Settings.customTextureFlipX = !!this.form.customTextureFlipX;\n            Settings.customTextureFlipY = !!this.form.customTextureFlipY;\n\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n          },\n          chooseTexture() {\n            pickCustomTextureDataUrl((dataUrl) => {\n              (async () => {\n                const url0 = String(dataUrl || \"\");\n                if (!url0) return;\n                // Normalize to avoid localStorage quota issues (keeps pixel-art crisp)\n                const url = await normalizeTextureDataUrlForStorage(url0, 512);\n                if (!url) return;\n                Settings.customTextureDataUrl = url;\n                Settings.useCustomTexture = true;\n                rememberCustomTexture(url);\n                const ok = Settings.save();\n                if (!ok) {\n                  try {\n                    Blockbench.showQuickMessage(\n                      \"Couldn't save texture settings (storage full).\",\n                      4000\n                    );\n                  } catch (e) {}\n                }\n                scheduleRigRefresh();\n                scheduleAutoSaveToSelectedAnimation();\n                this.syncFromSettings();\n                Blockbench.showQuickMessage(\"Custom texture set\");\n              })();\n            });\n          },\n          openTextureLibrary() {\n            showTextureLibraryDialog();\n          },\n          clearTexture() {\n            Settings.customTextureDataUrl = \"\";\n            Settings.useCustomTexture = false;\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            this.syncFromSettings();\n            Blockbench.showQuickMessage(\"Custom texture cleared\");\n          },\n          savePreset() {\n            savePresetForSelectedAnimationImpl({ silent: false });\n            this.presetSavedFor = getPresetSavedForLabel();\n          },\n          resetAll() {\n            Object.assign(Settings, {\n              enabled: Settings.enabled,\n              autoSaveToAnimation: Settings.autoSaveToAnimation,\n              edgeFadeEnabled: true,\n              edgeFadeWidthUv: 0.08,\n              speedBlocksPerSec: 2.0,\n              widthBlocks: 256,\n              lengthBlocks: 256,\n              yBlocks: 0,\n              xBlocks: 0,\n              zBlocks: 0,\n              yaw: 0,\n              tilt: 0,\n              opacity: 1.0,\n              gridBlocksPerTile: 16,\n              textureResolutionPx: 512,\n              gridColor: \"#ffffff\",\n              backgroundColor: \"#2b2b2b\",\n              gridMinorOpacity: 1.0,\n              gridMajorOpacity: 1.0,\n              backgroundOpacity: 1.0,\n              lineThicknessMult: 1.0,\n              useCustomTexture: false,\n              customTextureDataUrl: \"\",\n              customTextureRotation90: 0,\n              customTextureFlipX: false,\n              customTextureFlipY: false,\n            });\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            this.syncFromSettings();\n          },\n          resetGrid() {\n            Object.assign(Settings, {\n              gridBlocksPerTile: 16,\n              textureResolutionPx: 512,\n              gridColor: \"#ffffff\",\n              backgroundColor: \"#2b2b2b\",\n              gridMinorOpacity: 1.0,\n              gridMajorOpacity: 1.0,\n              backgroundOpacity: 1.0,\n              lineThicknessMult: 1.0,\n            });\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            this.syncFromSettings();\n          },\n          resetMotion() {\n            Object.assign(Settings, {\n              speedBlocksPerSec: 2.0,\n              yaw: 0,\n              tilt: 0,\n            });\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            this.syncFromSettings();\n          },\n          resetTexture() {\n            Object.assign(Settings, {\n              useCustomTexture: false,\n              customTextureDataUrl: \"\",\n              customTextureRotation90: 0,\n              customTextureFlipX: false,\n              customTextureFlipY: false,\n            });\n            Settings.save();\n            scheduleRigRefresh();\n            scheduleAutoSaveToSelectedAnimation();\n            this.syncFromSettings();\n          },\n          applySizePreset() {\n            const v = String(this.sizePreset || \"\");\n            if (!v) return;\n            if (v === \"small\") {\n              this.form.widthBlocks = 16;\n              this.form.lengthBlocks = 16;\n            } else if (v === \"medium\") {\n              this.form.widthBlocks = 64;\n              this.form.lengthBlocks = 64;\n            } else if (v === \"large\") {\n              this.form.widthBlocks = 256;\n              this.form.lengthBlocks = 256;\n            }\n            this.sizePreset = \"\";\n          },\n          applySpeedPreset() {\n            const v = String(this.speedPreset || \"\");\n            if (!v) return;\n            if (v === \"walk\") this.form.speedBlocksPerSec = 4.0;\n            else if (v === \"run\") this.form.speedBlocksPerSec = 8.0;\n            this.speedPreset = \"\";\n          },\n          close() {\n            try {\n              dialog.hide();\n            } catch (e) {}\n          },\n        },\n        watch: {\n          form: {\n            handler() {\n              this.apply();\n            },\n            deep: true,\n          },\n        },\n        mounted() {\n          this.syncFromSettings();\n          const onDown = (e) => {\n            if (e?.key === \"Shift\") this.shiftDown = true;\n          };\n          const onUp = (e) => {\n            if (e?.key === \"Shift\") this.shiftDown = false;\n          };\n          window.addEventListener(\"keydown\", onDown);\n          window.addEventListener(\"keyup\", onUp);\n          this.$once(\"hook:beforeDestroy\", () => {\n            window.removeEventListener(\"keydown\", onDown);\n            window.removeEventListener(\"keyup\", onUp);\n          });\n        },\n        template: `\n          <div id=\"mgp-panel\">\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">General</div>\n              <div class=\"mgp-row\">\n                <label>Enable</label>\n                <div class=\"mgp-right mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.enabled\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Opacity</label>\n                <div class=\"mgp-right\">\n                  <numeric-input v-model.number=\"form.opacity\" :min=\"0\" :max=\"1\" :step=\"shiftDown ? 0.01 : 0.05\" />\n                </div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Edge Fade</label>\n                <div class=\"mgp-right\" style=\"gap: 12px;\">\n                  <div class=\"mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.edgeFadeEnabled\" /></div>\n                  <numeric-input v-model.number=\"form.edgeFadeWidthUv\" :min=\"0.001\" :max=\"0.5\" :step=\"shiftDown ? 0.002 : 0.01\" />\n                </div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Presets</div>\n              <div class=\"mgp-row\">\n                <label>Auto-save to this animation</label>\n                <div class=\"mgp-right mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.autoSaveToAnimation\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Animation preset</label>\n                <div class=\"mgp-right\"><span class=\"mgp-subtle\">Saved for: {{ presetSavedFor }}</span></div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Quick Presets</div>\n              <div class=\"mgp-row\">\n                <label>Size</label>\n                <div class=\"mgp-right\">\n                  <select class=\"mgp-select\" v-model=\"sizePreset\" @change=\"applySizePreset\">\n                    <option value=\"\">Select…</option>\n                    <option value=\"small\">Small (16×16)</option>\n                    <option value=\"medium\">Medium (64×64)</option>\n                    <option value=\"large\">Large (256×256)</option>\n                  </select>\n                </div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Speed</label>\n                <div class=\"mgp-right\">\n                  <select class=\"mgp-select\" v-model=\"speedPreset\" @change=\"applySpeedPreset\">\n                    <option value=\"\">Select…</option>\n                    <option value=\"walk\">Walk (4)</option>\n                    <option value=\"run\">Run (8)</option>\n                  </select>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Placement</div>\n              <div class=\"mgp-row\">\n                <label>Width (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.widthBlocks\" :min=\"3\" :max=\"4096\" :step=\"1\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Length (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.lengthBlocks\" :min=\"3\" :max=\"4096\" :step=\"1\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Height (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.yBlocks\" :min=\"-4096\" :max=\"4096\" :step=\"1\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Offset X (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.xBlocks\" :min=\"-4096\" :max=\"4096\" :step=\"shiftDown ? 0.1 : 1\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Offset Z (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.zBlocks\" :min=\"-4096\" :max=\"4096\" :step=\"shiftDown ? 0.1 : 1\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Rotation Y°</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.yaw\" :min=\"-180\" :max=\"180\" :step=\"shiftDown ? 1 : 5\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Tilt X°</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.tilt\" :min=\"-89\" :max=\"89\" :step=\"shiftDown ? 0.25 : 1\" /></div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Motion</div>\n              <div class=\"mgp-row\">\n                <label>Speed (blocks/sec)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.speedBlocksPerSec\" :min=\"-50\" :max=\"50\" :step=\"shiftDown ? 0.02 : 0.1\" /></div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Grid</div>\n              <div class=\"mgp-row\">\n                <label>Grid square size (blocks)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.gridSquareBlocks\" :min=\"0.0625\" :max=\"64\" :step=\"shiftDown ? 0.015625 : 0.0625\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Texture resolution (px)</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.textureResolutionPx\" :min=\"64\" :max=\"2048\" :step=\"64\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Grid line thickness</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.lineThicknessMult\" :min=\"0.25\" :max=\"6\" :step=\"shiftDown ? 0.01 : 0.05\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Grid minor opacity</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.gridMinorOpacity\" :min=\"0\" :max=\"1\" :step=\"shiftDown ? 0.01 : 0.05\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Grid major opacity</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.gridMajorOpacity\" :min=\"0\" :max=\"1\" :step=\"shiftDown ? 0.01 : 0.05\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Background opacity</label>\n                <div class=\"mgp-right\"><numeric-input v-model.number=\"form.backgroundOpacity\" :min=\"0\" :max=\"1\" :step=\"shiftDown ? 0.01 : 0.05\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Background color</label>\n                <div class=\"mgp-right\"><input class=\"tool\" type=\"color\" v-model=\"form.backgroundColor\" /></div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Grid color</label>\n                <div class=\"mgp-right\"><input class=\"tool\" type=\"color\" v-model=\"form.gridColor\" /></div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Custom Texture</div>\n              <div class=\"mgp-row\">\n                <label>Use custom texture</label>\n                <div class=\"mgp-right mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.useCustomTexture\" /></div>\n              </div>\n              <div class=\"mgp-button-row\">\n                <button class=\"tool\" @click=\"chooseTexture\">Choose Texture</button>\n                <button class=\"tool\" @click=\"openTextureLibrary\">Texture Library…</button>\n                <button class=\"tool\" @click=\"clearTexture\">Clear</button>\n              </div>\n              <div class=\"mgp-row\" style=\"margin-top: 10px;\">\n                <label>Rotate</label>\n                <div class=\"mgp-right\">\n                  <select class=\"mgp-select\" v-model.number=\"form.customTextureRotation90\">\n                    <option :value=\"0\">0°</option>\n                    <option :value=\"1\">90°</option>\n                    <option :value=\"2\">180°</option>\n                    <option :value=\"3\">270°</option>\n                  </select>\n                </div>\n              </div>\n              <div class=\"mgp-row\">\n                <label>Flip</label>\n                <div class=\"mgp-right\" style=\"gap: 12px;\">\n                  <div class=\"mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.customTextureFlipX\" /><span class=\"mgp-subtle\">X</span></div>\n                  <div class=\"mgp-checkbox\"><input type=\"checkbox\" v-model=\"form.customTextureFlipY\" /><span class=\"mgp-subtle\">Y</span></div>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"mgp-section\">\n              <div class=\"mgp-section-title\">Resets</div>\n              <div class=\"mgp-button-row\">\n                <button class=\"tool\" @click=\"resetAll\">Reset all</button>\n                <button class=\"tool\" @click=\"resetGrid\">Reset grid</button>\n                <button class=\"tool\" @click=\"resetMotion\">Reset motion</button>\n                <button class=\"tool\" @click=\"resetTexture\">Reset texture</button>\n              </div>\n            </div>\n\n            <div class=\"mgp-footer\">\n              <div class=\"mgp-author\">By Cazfps</div>\n              <div class=\"mgp-spacer\"></div>\n              <button class=\"tool\" @click=\"savePreset\">Save</button>\n              <button class=\"tool\" @click=\"close\">Close</button>\n            </div>\n          </div>\n        `,\n      },\n    });\n\n    wrapDialogHideToRestoreOverlay(dialog);\n\n    // Also stop the label watcher when the dialog is hidden via X/Esc.\n    try {\n      const originalHide = dialog.hide?.bind(dialog);\n      if (typeof originalHide === \"function\") {\n        dialog.hide = (...args) => {\n          stopDialogLabelWatcher();\n          return originalHide(...args);\n        };\n      }\n    } catch (e) {}\n\n    // Make this dialog a hovering menu (no blackout overlay).\n    setNoOverlayEnabled(true);\n    setNoBlurEnabled(true);\n\n    dialog.show();\n    refreshDialogFromSettings();\n    startDialogLabelWatcher();\n  }\n\n  // ============================================================\n  // Plugin lifecycle\n  // - onload calls forceCleanup() defensively in case Blockbench loads the file twice\n  // - onunload is the authoritative teardown for store/uninstall/disable\n  // ============================================================\n\n  const registerPlugin =\n    (typeof Plugin !== \"undefined\" && typeof Plugin.register === \"function\"\n      ? Plugin.register.bind(Plugin)\n      : null) ||\n    (typeof BBPlugin !== \"undefined\" && typeof BBPlugin.register === \"function\"\n      ? BBPlugin.register.bind(BBPlugin)\n      : null);\n\n  if (!registerPlugin) {\n    console.error(\n      `[AnimatedPlatforms] Failed to register: Plugin API not found (id=${PLUGIN_ID})`\n    );\n    return;\n  }\n\n  // Register persistent toolbar actions as early as possible.\n  ensureTimelineActionsRegistered();\n\n  registerPlugin(PLUGIN_ID, {\n    title: \"Animated Platforms\",\n    author: \"Cazfps\",\n    description:\n      \"An animated ground plane that makes it easier to animate moving entities (walk cycles, vehicles, etc.). \" +\n      \"It offers customization for size, rotation, speed, opacity, textures, and per-animation presets so you can tune it to your workflow.\",\n    icon: \"icon.svg\",\n    version: PLUGIN_VERSION,\n    min_version: \"4.8.0\",\n    variant: \"both\",\n    new_repository_format: true,\n    website: \"https://www.cazfps.com/links\",\n    tags: [\"Minecraft\", \"Animation\", \"Tools\"],\n\n    onload() {\n      try {\n        // If this script was loaded twice without a proper unload, clean up first.\n        forceCleanup();\n\n        // Migrate settings/presets from the legacy plugin id.\n        migrateLegacyStorageOnce();\n\n        Settings.load();\n        rig.refresh();\n\n        // Help > About Plugins entry\n        addAboutButton();\n\n        // Timeline-placeable actions (users can add them via the Timeline toolbar menu)\n        // Ensure the two timeline actions exist (should already be created during script eval).\n        if (!timelineToggleAction || !timelinePanelAction) {\n          ensureTimelineActionsRegistered();\n        }\n\n        // Blockbench may prune unknown toolbar items before plugins load.\n        // To make the user's Timeline toolbar setup effectively persistent, re-attach\n        // our actions once the timeline toolbar has initialized.\n        waitForTimelineToolbarAndAttach();\n\n        action = new Action(\"animated_platforms_panel\", {\n          name: \"Animated Platforms\",\n          description: \"Open Animated Platforms controls\",\n          icon: \"grid_on\",\n          click: showPanel,\n        });\n\n        MenuBar.addAction(action, \"view\");\n\n        if (typeof Preview !== \"undefined\" && Preview.prototype.menu) {\n          Preview.prototype.menu.addAction(action);\n        }\n        if (typeof Blockbench !== \"undefined\" && Blockbench.menus?.preview) {\n          Blockbench.menus.preview.addAction(action);\n        }\n\n        // Watch animation selection changes and apply presets.\n        // Important: never touch dialog form values from here (can cause persistent UI reflow lag).\n        try {\n          if (presetWatcher) clearInterval(presetWatcher);\n        } catch (e) {}\n        presetWatcher = null;\n        lastAnimKey = null;\n\n        try {\n          presetWatcher = setInterval(() => {\n            try {\n              if (!Settings?.enabled) return;\n              const key = getSelectedAnimationKey();\n              if (!key) return;\n              const scopedKey = `${getAnimPresetStorageKeys()[0]}|${key}`;\n\n              if (scopedKey !== lastAnimKey) {\n                lastAnimKey = scopedKey;\n                maybeApplyPresetForSelectedAnimation();\n              }\n            } catch (e) {}\n          }, 50);\n        } catch (e) {}\n\n        console.log(`[AnimatedPlatforms] v${PLUGIN_VERSION} loaded`);\n      } catch (e) {\n        console.error(\"[AnimatedPlatforms] Failed to load\", e);\n      }\n    },\n\n    onunload() {\n      try {\n        if (presetWatcher) clearInterval(presetWatcher);\n      } catch (e) {}\n      presetWatcher = null;\n      lastAnimKey = null;\n\n      try {\n        if (dialogLabelWatcher) clearInterval(dialogLabelWatcher);\n      } catch (e) {}\n      dialogLabelWatcher = null;\n\n      // Reset overlay changes if the plugin is unloaded mid-dialog.\n      try {\n        setNoOverlayEnabled(false);\n      } catch (e) {}\n\n      try {\n        document.getElementById(NO_OVERLAY_STYLE_ID)?.remove?.();\n      } catch (e) {}\n\n      try {\n        dialog?.hide?.();\n      } catch (e) {}\n      dialog = null;\n\n      try {\n        textureLibraryDialog?.hide?.();\n      } catch (e) {}\n      textureLibraryDialog = null;\n\n      try {\n        rig.dispose();\n      } catch (e) {}\n\n      if (action && typeof Preview !== \"undefined\" && Preview.prototype.menu) {\n        Preview.prototype.menu.removeAction(action);\n      }\n      if (action && typeof Blockbench !== \"undefined\" && Blockbench.menus?.preview) {\n        Blockbench.menus.preview.removeAction(action);\n      }\n\n      action?.delete?.();\n      action = null;\n\n      try {\n        timelineToggleAction?.delete?.();\n      } catch (e) {}\n      timelineToggleAction = null;\n\n      try {\n        timelinePanelAction?.delete?.();\n      } catch (e) {}\n      timelinePanelAction = null;\n\n      try {\n        MenuBar.removeAction(`help.about_plugins.about_${PLUGIN_ID}`);\n      } catch (e) {}\n      try {\n        aboutAction?.delete?.();\n      } catch (e) {}\n      aboutAction = null;\n\n      console.log(\"[AnimatedPlatforms] Unloaded\");\n    },\n  });\n})();\n"
  },
  {
    "path": "plugins/animation_sliders/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/animation_sliders/about.md",
    "content": "Adds sliders and other tools to modify keyframes:\n\nYou can add the sliders and tools to any of your toolbars by clicking the three dots on the right side and selecting **Customize**. Search for the slider you want to add and click to add it.\n\n- **Tween Keyframes:** Amplify the values of the selected keyframes\n- **Amplify Keyframes:** Amplify the values of the selected keyframes\n- **Ease Keyframes:** Create a curve with the selected keyframes between the adjacent keyframes\n- **Retime Keyframes:** Shift the curve in the graph editor without changing the time of the keyframe. This allows you to change the time of one axis individually\n- **Ground Speed:** For molang-driven walk animations. Use the slider to sync the animation with the ground below it. This will insert the modified_distance_moved query into the anim time update field.\n- **Keyframe Slider Axis:** Select which axis the keyframe sliders affect\n- **Normalize Keyframes:** Subtract the currently displayed value from all selected keyframes, in order to remove the base pose from the model.\n"
  },
  {
    "path": "plugins/animation_sliders/animation_sliders.js",
    "content": "/// <reference path=\"../../types/index.d.ts\" />\n\n\nvar tween_slider, amplify_slider, easing_slider, axis_selector, ground_speed_slider, normalize_keyframes, updateSliders;\n\nPlugin.register('animation_sliders', {\n\ttitle: 'Animation Sliders',\n\ticon: 'icon.png',\n\tauthor: 'JannisX11',\n\tdescription: 'Adds multiple sliders to tweak keyframes',\n\ttags: ['Animation'],\n\tversion: '0.5.0',\n\tmin_version: '4.8.0',\n\tvariant: 'both',\n\tonload() {\n\n\t\tfunction calcKeyframeValues(kf) {\n\t\t\treturn [\n\t\t\t\tkf.calc('x'),\n\t\t\t\tkf.calc('y'),\n\t\t\t\tkf.calc('z'),\n\t\t\t]\n\t\t}\n\t\tfunction getInterval(event) {\n\t\t\tif ((event.shiftKey || Pressing.overrides.shift) && (event.ctrlOrCmd || Pressing.overrides.ctrl)) {\n\t\t\t\treturn 0.1;\n\t\t\t} else if (event.shiftKey || Pressing.overrides.shift) {\n\t\t\t\treturn 1;\n\t\t\t} else if (event.ctrlOrCmd || Pressing.overrides.ctrl) {\n\t\t\t\treturn 0.5;\n\t\t\t} else {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t\tlet channels = ['rotation', 'position', 'scale'];\n\n\t\tlet selected_axes = {x: true, y: true, z: true};\n\t\taxis_selector = new Action('keyframe_slider_axis_selector', {\n\t\t\tname: 'Keyframe Slider Axis',\n\t\t\tdescription: 'Select which axis is affected by animation sliders',\n\t\t\ticon: 'merge_type',\n\t\t\tcondition: () => Animator.open,\n\t\t\tchildren() {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: () => selected_axes.x,\n\t\t\t\t\t\tname: 'X',\n\t\t\t\t\t\tclick() {selected_axes.x = !selected_axes.x},\n\t\t\t\t\t\tkeybind: axis_selector.sub_keybinds.x.keybind\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: () => selected_axes.y,\n\t\t\t\t\t\tname: 'Y',\n\t\t\t\t\t\tclick() {selected_axes.y = !selected_axes.y},\n\t\t\t\t\t\tkeybind: axis_selector.sub_keybinds.y.keybind\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: () => selected_axes.z,\n\t\t\t\t\t\tname: 'Z',\n\t\t\t\t\t\tclick() {selected_axes.z = !selected_axes.z},\n\t\t\t\t\t\tkeybind: axis_selector.sub_keybinds.z.keybind\n\t\t\t\t\t},\n\t\t\t\t\t'_',\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'clear_all',\n\t\t\t\t\t\tname: 'Enable All',\n\t\t\t\t\t\tkeybind: axis_selector.sub_keybinds.enable_all.keybind,\n\t\t\t\t\t\tcondition: () => {\n\t\t\t\t\t\t\tlet {length} = [selected_axes.x, selected_axes.y, selected_axes.z].filter(key => key);\n\t\t\t\t\t\t\treturn length != 3;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tclick() {\n\t\t\t\t\t\t\tselected_axes.x = true; selected_axes.y = true; selected_axes.z = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t},\n\t\t\tclick(event) {\n\t\t\t\tnew Menu('keyframe_slider_axis_selector', this.children(), {keep_open: true}).open(event.target);\n\t\t\t}\n\t\t});\n\t\taxis_selector.addSubKeybind('x', 'Toggle X', null, () => {\n\t\t\tselected_axes.x = !selected_axes.x\n\t\t})\n\t\taxis_selector.addSubKeybind('y', 'Toggle Y', null, () => {\n\t\t\tselected_axes.y = !selected_axes.y\n\t\t})\n\t\taxis_selector.addSubKeybind('z', 'Toggle Z', null, () => {\n\t\t\tselected_axes.z = !selected_axes.z\n\t\t})\n\t\taxis_selector.addSubKeybind('enable_all', 'Enable All', null, () => {\n\t\t\tselected_axes.x = true; selected_axes.y = true; selected_axes.z = true;\n\t\t})\n\n\n\t\tlet tween_value = 50;\n\t\ttween_slider = new NumSlider('slider_tween_keyframes', {\n\t\t\tname: 'Tween Keyframes',\n\t\t\tcategory: 'animation',\n\t\t\tcondition: () => Animator.open && Timeline.selected.length,\n\t\t\tsettings: {show_bar: true, limit: false, min: 0, max: 100},\n\t\t\tgetInterval,\n\t\t\tget: function() {\n\t\t\t\treturn tween_value;\n\t\t\t},\n\t\t\tchange: function(modify) {\n\t\t\t\tlet previous_tween = tween_value;\n\t\t\t\ttween_value = modify(previous_tween);\n\n\t\t\t\tTimeline.animators.forEach(animator => {\n\t\t\t\t\tif (animator instanceof BoneAnimator) {\n\t\t\t\t\t\tchannels.forEach(channel => {\n\t\t\t\t\t\t\tlet first_selected = animator[channel].find(kf => kf.selected);\n\t\t\t\t\t\t\tif (!first_selected) return;\n\n\t\t\t\t\t\t\tlet sorted = animator[channel].slice().sort((a, b) => a.time - b.time);\n\t\t\t\t\t\t\tlet pre, post, found_selected;\n\t\t\t\t\t\t\tsorted.forEach(kf => {\n\t\t\t\t\t\t\t\tif (kf.selected) {\n\t\t\t\t\t\t\t\t\tfound_selected = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (!found_selected) pre = kf;\n\t\t\t\t\t\t\t\t\tif (found_selected && !post) post = kf;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tlet pre_val = calcKeyframeValues(pre || post || first_selected);\n\t\t\t\t\t\t\tlet post_val = calcKeyframeValues(post || pre || first_selected);\n\t\t\t\t\t\t\tsorted.forEach(kf => {\n\t\t\t\t\t\t\t\tif (kf.selected) {\n\t\t\t\t\t\t\t\t\tlet val = calcKeyframeValues(kf);\n\t\t\t\t\t\t\t\t\tif (selected_axes.x) kf.offset('x', pre_val[0] - val[0] + ((post_val[0] - pre_val[0]) * (tween_value / 100)));\n\t\t\t\t\t\t\t\t\tif (selected_axes.y) kf.offset('y', pre_val[1] - val[1] + ((post_val[1] - pre_val[1]) * (tween_value / 100)));\n\t\t\t\t\t\t\t\t\tif (selected_axes.z) kf.offset('z', pre_val[2] - val[2] + ((post_val[2] - pre_val[2]) * (tween_value / 100)));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tAnimator.preview()\n\t\t\t},\n\t\t\tonBefore: function() {\n\t\t\t\tUndo.initEdit({keyframes: Timeline.selected})\n\t\t\t},\n\t\t\tonAfter: function() {\n\t\t\t\tUndo.finishEdit('Tween keyframes')\n\t\t\t\ttween_value = 50;\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t})\n\n\n\t\tlet amplify_value = 100;\n\t\tlet amplify_original_values = {};\n\t\tamplify_slider = new NumSlider('slider_amplify_keyframes', {\n\t\t\tname: 'Amplify Keyframes',\n\t\t\tcategory: 'animation',\n\t\t\tcondition: () => Animator.open && Timeline.selected.length,\n\t\t\tsettings: {show_bar: true, limit: false, min: 0, max: 200},\n\t\t\tgetInterval,\n\t\t\tget: function() {\n\t\t\t\treturn amplify_value;\n\t\t\t},\n\t\t\tchange: function(modify) {\n\t\t\t\tlet previous_amplify = amplify_value;\n\t\t\t\tamplify_value = modify(previous_amplify);\n\n\t\t\t\tTimeline.selected.forEach((kf) => {\n\t\t\t\t\tlet val = calcKeyframeValues(kf);\n\t\t\t\t\tif (kf.channel == 'scale') {\n\t\t\t\t\t\tif (selected_axes.x) kf.offset('x', (amplify_original_values[kf.uuid][0]-1) * (amplify_value/100) + 1 - val[0]);\n\t\t\t\t\t\tif (selected_axes.y) kf.offset('y', (amplify_original_values[kf.uuid][1]-1) * (amplify_value/100) + 1 - val[1]);\n\t\t\t\t\t\tif (selected_axes.z) kf.offset('z', (amplify_original_values[kf.uuid][2]-1) * (amplify_value/100) + 1 - val[2]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (selected_axes.x) kf.offset('x', amplify_original_values[kf.uuid][0] * (amplify_value/100) - val[0]);\n\t\t\t\t\t\tif (selected_axes.y) kf.offset('y', amplify_original_values[kf.uuid][1] * (amplify_value/100) - val[1]);\n\t\t\t\t\t\tif (selected_axes.z) kf.offset('z', amplify_original_values[kf.uuid][2] * (amplify_value/100) - val[2]);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tAnimator.preview();\n\t\t\t},\n\t\t\tonBefore: function() {\n\t\t\t\tTimeline.selected.forEach((kf) => {\n\t\t\t\t\tamplify_original_values[kf.uuid] = calcKeyframeValues(kf);\n\t\t\t\t})\n\t\t\t\tUndo.initEdit({keyframes: Timeline.selected})\n\t\t\t},\n\t\t\tonAfter: function() {\n\t\t\t\tUndo.finishEdit('Amplify keyframes')\n\t\t\t\tamplify_value = 100;\n\t\t\t\tamplify_original_values = {};\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t})\n\n\t\tlet easing_value = 50;\n\t\teasing_slider = new NumSlider('slider_easing_keyframes', {\n\t\t\tname: 'Ease Keyframes',\n\t\t\tcategory: 'animation',\n\t\t\tcondition: () => Animator.open && Timeline.selected.length,\n\t\t\tsettings: {show_bar: true, limit: false, min: 0, max: 100},\n\t\t\tgetInterval,\n\t\t\tget: function() {\n\t\t\t\treturn easing_value;\n\t\t\t},\n\t\t\tchange: function(modify) {\n\t\t\t\tlet previous_easing = easing_value;\n\t\t\t\teasing_value = modify(previous_easing);\n\n\t\t\t\tTimeline.animators.forEach(animator => {\n\t\t\t\t\tif (animator instanceof BoneAnimator) {\n\t\t\t\t\t\tchannels.forEach(channel => {\n\t\t\t\t\t\t\tlet first_selected = animator[channel].find(kf => kf.selected);\n\t\t\t\t\t\t\tif (!first_selected) return;\n\n\t\t\t\t\t\t\tlet sorted = animator[channel].slice().sort((a, b) => a.time - b.time);\n\t\t\t\t\t\t\tlet pre, post, found_selected;\n\t\t\t\t\t\t\tsorted.forEach(kf => {\n\t\t\t\t\t\t\t\tif (kf.selected) {\n\t\t\t\t\t\t\t\t\tfound_selected = true;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif (!found_selected) pre = kf;\n\t\t\t\t\t\t\t\t\tif (found_selected && !post) post = kf;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tlet pre_val = calcKeyframeValues(pre || post || first_selected);\n\t\t\t\t\t\t\tlet post_val = calcKeyframeValues(post || pre || first_selected);\n\t\t\t\t\t\t\tsorted.forEach(kf => {\n\t\t\t\t\t\t\t\tif (kf.selected) {\n\t\t\t\t\t\t\t\t\tlet val = calcKeyframeValues(kf);\n\t\t\t\t\t\t\t\t\tlet t = (kf.time - pre.time) / (post.time - pre.time);\n\t\t\t\t\t\t\t\t\tif (easing_value > 100) {\n\t\t\t\t\t\t\t\t\t\tt = Math.clamp(t * (easing_value / 100), 0, 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (easing_value < 0) {\n\t\t\t\t\t\t\t\t\t\tt = Math.clamp(1 - (1 - t) * (1 - (easing_value / 100)), 0, 1);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tlet t_2 = Math.pow(1-t, 2) * 0  +  2*(1-t)*t*(Math.clamp(easing_value, 0, 100)/100)  +  Math.pow(t, 2) * 1;\n\n\n\t\t\t\t\t\t\t\t\tfunction offsetAxis(axis) {\n\t\n\t\t\t\t\t\t\t\t\t\tlet x_p2 = pre_val[axis]  +  (post_val[axis] - pre_val[axis]) * (Math.clamp(easing_value, 0, 100)/100)\n\t\t\t\t\t\t\t\t\t\tlet x_v = Math.pow(1-t_2, 2) * pre_val[axis]  +  2*(1-t_2)*t_2*x_p2  +  Math.pow(t_2, 2) * post_val[axis];\n\t\t\t\t\t\t\t\t\t\tkf.offset(getAxisLetter(axis), -val[axis] + x_v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (selected_axes.x) offsetAxis(0);\n\t\t\t\t\t\t\t\t\tif (selected_axes.y) offsetAxis(1);\n\t\t\t\t\t\t\t\t\tif (selected_axes.z) offsetAxis(2);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tAnimator.preview()\n\t\t\t},\n\t\t\tonBefore: function() {\n\t\t\t\tUndo.initEdit({keyframes: Timeline.selected})\n\t\t\t},\n\t\t\tonAfter: function() {\n\t\t\t\tUndo.finishEdit('Ease keyframes')\n\t\t\t\teasing_value = 50;\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t})\n\n\n\t\tlet retime_offset = 0;\n\t\tlet retime_original_values = [];\n\t\tretime_slider = new NumSlider('slider_retime_keyframes', {\n\t\t\tname: 'Retime Keyframes',\n\t\t\tcategory: 'animation',\n\t\t\tcondition: () => Animator.open && Animation.selected && Timeline.selected.length,\n\t\t\tgetInterval(event) {\n\t\t\t\treturn 1 / Animation.selected.snapping;\n\t\t\t},\n\t\t\tget() {\n\t\t\t\treturn retime_offset;\n\t\t\t},\n\t\t\tchange(modify) {\n\t\t\t\tlet previous_retime = retime_offset;\n\t\t\t\tretime_offset = modify(previous_retime);\n\n\t\t\t\tTimeline.selected.forEach((kf) => {\n\t\t\t\t\tlet new_time = kf.time + retime_offset;\n\t\t\t\t\tlet index = Math.round(new_time * Animation.selected.snapping + retime_original_values.length*100) % retime_original_values.length;\n\t\t\t\t\tlet value = retime_original_values[index];\n\t\t\t\t\tif (selected_axes.x) kf.set('x', value[0]);\n\t\t\t\t\tif (selected_axes.y) kf.set('y', value[1]);\n\t\t\t\t\tif (selected_axes.z) kf.set('z', value[2]);\n\t\t\t\t})\n\t\t\t\tAnimator.preview();\n\t\t\t},\n\t\t\tonBefore() {\n\t\t\t\tlet original_time = Timeline.time;\n\t\t\t\tlet first = Timeline.selected[0];\n\t\t\t\tfor (let time = 0; time <= Animation.selected.length; time += 1 / Animation.selected.snapping) {\n\t\t\t\t\tTimeline.time = time;\n\t\t\t\t\tlet value = [\n\t\t\t\t\t\tfirst.animator.interpolate(first.channel, true, 'x'),\n\t\t\t\t\t\tfirst.animator.interpolate(first.channel, true, 'y'),\n\t\t\t\t\t\tfirst.animator.interpolate(first.channel, true, 'z'),\n\t\t\t\t\t]\n\t\t\t\t\tretime_original_values.push(value);\n\t\t\t\t}\n\t\t\t\tTimeline.time = original_time;\n\t\t\t\tUndo.initEdit({keyframes: Timeline.selected})\n\t\t\t},\n\t\t\tonAfter() {\n\t\t\t\tUndo.finishEdit('Retime keyframes')\n\t\t\t\tretime_offset = 0;\n\t\t\t\tretime_original_values = [];\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t})\n\t\t\n\t\tground_speed_slider = new NumSlider('slider_animation_ground_speed', {\n\t\t\tname: 'Ground Speed',\n\t\t\tcategory: 'animation',\n\t\t\tcondition: () => Animator.open && Animation.selected,\n\t\t\tget() {\n\t\t\t\tlet string = Animation.selected.anim_time_update;\n\t\t\t\tif (!string) return 5;\n\t\t\t\tlet parsed = Animator.MolangParser.parse(string, {'query.modified_distance_moved': 1});\n\t\t\t\tif (parsed) {\n\t\t\t\t\treturn 1 / parsed;\n\t\t\t\t}\n\t\t\t\tlet num = parseFloat(string.replace(/[^\\d]/g, ''));\n\t\t\t\tif (!isNaN(num)) return num;\n\t\t\t\treturn 5;\n\t\t\t},\n\t\t\tchange(modify) {\n\t\t\t\tlet val = ground_speed_slider.get();\n\t\t\t\tAnimation.selected.anim_time_update = 'query.modified_distance_moved / '+modify(val);\n\t\t\t\tAnimator.preview();\n\t\t\t},\n\t\t\tonBefore() {\n\t\t\t\tUndo.initEdit({animations: [Animation.selected]});\n\t\t\t\tif (settings.ground_plane.value == false) {\n\t\t\t\t\tsettings.ground_plane.set(true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tonAfter() {\n\t\t\t\tUndo.finishEdit('Change animation ground speed')\n\t\t\t}\n\t\t})\n\n\t\tnormalize_keyframes = new Action('normalize_keyframes', {\n\t\t\tname: 'Normalize Keyframes',\n\t\t\tdescription: 'Subtract the currently displayed value from all selected keyframes, in order to remove the base pose from the model.',\n\t\t\ticon: 'equalizer',\n\t\t\tclick() {\n\t\t\t\tUndo.initEdit({keyframes: Timeline.selected})\n\n\t\t\t\tTimeline.animators.forEach(animator => {\n\t\t\t\t\tif (animator instanceof BoneAnimator) {\n\t\t\t\t\t\tchannels.forEach(channel => {\n\t\t\t\t\t\t\tlet closest_selected = animator[channel].filter(kf => kf.selected).sort((a, b) => Math.abs(Timeline.time - a.time) - Math.abs(Timeline.time - b.time))[0];\n\t\t\t\t\t\t\tif (!closest_selected) return;\n\n\t\t\t\t\t\t\tlet values = calcKeyframeValues(closest_selected);\n\t\t\t\t\t\t\tanimator[channel].forEach(kf => {\n\t\t\t\t\t\t\t\tif (kf.selected) {\n\t\t\t\t\t\t\t\t\tfunction offsetAxis(axis) {\n\t\t\t\t\t\t\t\t\t\tkf.offset(getAxisLetter(axis), -values[axis]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (selected_axes.x) offsetAxis(0);\n\t\t\t\t\t\t\t\t\tif (selected_axes.y) offsetAxis(1);\n\t\t\t\t\t\t\t\t\tif (selected_axes.z) offsetAxis(2);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tAnimator.preview()\n\t\t\t\tUndo.finishEdit('Normalize keyframes')\n\t\t\t}\n\t\t})\n\t\tMenuBar.menus.keyframe.addAction(normalize_keyframes)\n\n\t\tupdateSliders = function() {\n\t\t\ttween_slider.update();\n\t\t\tamplify_slider.update();\n\t\t\teasing_slider.update();\n\t\t\tretime_slider.update();\n\t\t\tground_speed_slider.update();\n\t\t}\n\t\t\n\t\tBlockbench.on('update_keyframe_selection', updateSliders);\n\t},\n\tonunload() {\n\t\ttween_slider.delete();\n\t\tamplify_slider.delete();\n\t\teasing_slider.delete();\n\t\tretime_slider.delete();\n\t\tground_speed_slider.delete();\n\t\taxis_selector.delete();\n\t\tnormalize_keyframes.delete();\n\t\tBlockbench.removeListener('update_keyframe_selection', updateSliders);\n\t}\n});\n\n"
  },
  {
    "path": "plugins/animation_sliders/members.yml",
    "content": "maintainers:\n  - JannisX11\n"
  },
  {
    "path": "plugins/animation_to_java.js",
    "content": "(function () {\n    let menuButton;\n\n    Plugin.register(\"animation_to_java\", {\n        title: \"Animation to Java Converter\",\n        author: \"MG, Vincent_Huto(PR), DailyCraft(PR), MarcusSlover(PR)\",\n        description:\n            \"Converts Blockbench animations to Java code for the new 1.19+ keyframe system.\",\n        icon: \"fa-cube\",\n        version: \"1.2.0\",\n        max_version: \"4.12.9\",\n        variant: \"both\",\n        about:\n            \"This plugin exports your Blockbench animations as Java code to be used for the new 1.19+ keyframe system. Please note that this system does not support Molang or step interpolation.\",\n        tags: [\"Deprecated\", \"Minecraft: Java Edition\"],\n        deprecation_note: 'This feature is now built into Blockbench, the plugin is no longer required.',\n        onload() {\n            Formats.modded_entity.animation_mode = true\n            menuButton = new Action(\"export_animation_to_java\", {\n                name: \"Export Animations to Java\",\n                description: \"Exports animations to Java code\",\n                icon: \"fa-file-export\",\n                condition: () => Format.animation_mode,\n                click() {\n                    mapToExport();\n                },\n            });\n            MenuBar.addAction(menuButton, \"file.export\");\n        },\n        onunload() {\n            Formats.modded_entity.animation_mode = false\n            menuButton.delete();\n        },\n    });\n\n    /**\n     * The mappings for the mojang mappings.\n     */\n    const animation_mojang_mappings = {\n        definition: {\n            name: \"AnimationDefinition\",\n            builder: \"Builder\",\n        },\n        add: \"addAnimation\",\n        loop: \"looping\",\n        length: \"withLength\",\n        channel: {\n            name: \"AnimationChannel\",\n            targets: {\n                position: {\n                    name: \"Targets.POSITION\",\n                    vector: \"KeyframeAnimations.posVec\"\n                },\n                rotation: {\n                    name: \"Targets.ROTATION\",\n                    vector: \"KeyframeAnimations.degreeVec\"\n                },\n                scale: {\n                    name: \"Targets.SCALE\",\n                    vector: \"KeyframeAnimations.scaleVec\"\n                }\n            },\n            interpolations: {\n                linear: \"Interpolations.LINEAR\",\n                cubic: \"Interpolations.CATMULLROM\"\n            }\n        }\n    }\n\n    /**\n     * The mappings for the yarn mappings.\n     */\n    const animation_yarn_mappings = {\n        definition: {\n            name: \"Animation\",\n            builder: \"Builder\",\n        },\n        add: \"addBoneAnimation\",\n        loop: \"looping\",\n        length: \"create\",\n        channel: {\n            name: \"Transformation\",\n            targets: {\n                position: {\n                    name: \"Targets.TRANSLATE\",\n                    vector: \"AnimationHelper.createTranslationalVector\"\n                },\n                rotation: {\n                    name: \"Targets.ROTATE\",\n                    vector: \"AnimationHelper.createRotationalVector\"\n                },\n                scale: {\n                    name: \"Targets.SCALE\",\n                    vector: \"AnimationHelper.createScalingVector\"\n                }\n            },\n            interpolations: {\n                linear: \"Interpolations.LINEAR\",\n                cubic: \"Interpolations.CUBIC\"\n            }\n        }\n    }\n\n    /**\n     * Asks the user for the mappings to use and then generates the file.\n     */\n    function mapToExport() {\n        new Dialog(\"select_mappings\", {\n            id: \"select_mappings\",\n            title: \"Select Mappings\",\n            form: {\n                mappings: {\n                    label: \"Mappings\",\n                    type: \"select\",\n                    options: {\n                        mojang: \"Mojang\",\n                        yarn: \"Yarn\",\n                    },\n                    default: \"mojang\",\n                },\n            },\n            onConfirm(form) {\n                let data;\n                if (form.mappings === \"mojang\") {\n                    data = generateFile(animation_mojang_mappings);\n                } else {\n                    data = generateFile(animation_yarn_mappings);\n                }\n                Blockbench.export({\n                    type: \"Text File\",\n                    extensions: [\"txt\"],\n                    savetype: \"text\",\n                    content: data,\n                });\n                this.hide();\n            },\n        }).show();\n    }\n\n    /**\n     * Transforms the interpolation to the correct format.\n     * @param interpolation The interpolation to transform.\n     * @param mappings The mappings to use.\n     * @returns {string|*} The transformed interpolation.\n     */\n    function transformInterpolation(interpolation, mappings) {\n        if (interpolation === \"LINEAR\") {\n            return mappings.channel.interpolations.linear;\n        } else if (interpolation === \"CUBIC\" || interpolation === \"CATMULLROM\") {\n            return mappings.channel.interpolations.cubic;\n        }\n    }\n\n    /**\n     * Generates the file from the given mappings.\n     * @param mapping The mappings to use.\n     * @returns {string} The generated file.\n     */\n    function generateFile(mapping) {\n        let outfileText = \"\";\n\n        const definition = mapping.definition.name;\n        const builder = mapping.definition.builder;\n        const length = mapping.length;\n        const loop = mapping.loop;\n        const add = mapping.add;\n        const channel = mapping.channel.name;\n        const targets = mapping.channel.targets;\n\n        for (const animation of Animation.all) {\n            outfileText += `\\npublic static final ${definition} ${animation.name\n                .replaceAll(\".\", \"_\")\n                .replace(\"animation_\", \"\")\n                .toUpperCase()} = ${definition}.${builder}.${length}(${animation.length\n            }f)`;\n            if (animation.loop === \"loop\") {\n                outfileText += `.${loop}()`;\n            }\n            for (const id in animation.animators) {\n                const boneAnimator = animation.animators[id];\n                if (!(boneAnimator instanceof BoneAnimator)) continue;\n\n                let posKeyArray = [];\n                let rotKeyArray = [];\n                let scaleKeyArray = [];\n\n                // Position\n                if (boneAnimator.position.length) {\n                    outfileText += `\\n.${add}(\"${boneAnimator.name}\",\\n\\tnew ${channel}(${channel}.${targets.position.name}`;\n                    //Sorts by time to ensure ordering\n                    for (const keyFrame of boneAnimator.position) {\n                        posKeyArray.push(keyFrame);\n                    }\n                    posKeyArray.sort((a, b) => a.time - b.time)\n\n                    for (const keyFrame of posKeyArray) {\n                        const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0];\n                        const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping);\n                        outfileText += `, \\n\\t\\tnew Keyframe(${keyFrame.time\n                        }f, ${targets.position.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\\n\\t\\t\\t${channel}.${interpolation})`;\n                    }\n                    outfileText += \"))\";\n                }\n\n                // Rotation\n                if (boneAnimator.rotation.length) {\n                    outfileText += `\\n.${add}(\"${boneAnimator.name}\",\\n\\tnew ${channel}(${channel}.${targets.rotation.name}`;\n                    //Sorts by time to ensure ordering\n                    for (const keyFrame of boneAnimator.rotation) {\n                        rotKeyArray.push(keyFrame);\n                    }\n                    rotKeyArray.sort((a, b) => a.time - b.time)\n\n                    for (const keyFrame of rotKeyArray) {\n                        const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0];\n                        const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping);\n                        outfileText += `,\\n\\t\\tnew Keyframe(${keyFrame.time\n                        }f, ${targets.rotation.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\\n\\t\\t\\t${channel}.${interpolation})`;\n                    }\n                    outfileText += \"))\";\n                }\n\n                // Scale\n                if (boneAnimator.scale.length) {\n                    outfileText += `\\n.${add}(\"${boneAnimator.name}\",\\n\\tnew ${channel}(${channel}.${targets.scale.name}`;\n                    //Sorts by time to ensure ordering\n                    for (const keyFrame of boneAnimator.scale) {\n                        scaleKeyArray.push(keyFrame);\n                    }\n                    scaleKeyArray.sort((a, b) => a.time - b.time)\n\n                    for (const keyFrame of scaleKeyArray) {\n                        const {x = 0.0, y = 0.0, z = 0.0} = keyFrame.data_points[0];\n                        const interpolation = transformInterpolation(keyFrame.interpolation.toUpperCase(), mapping);\n                        outfileText += `,\\n\\t\\tnew Keyframe(${keyFrame.time\n                        }f, ${targets.scale.vector}(${round2(x)}f, ${round2(y)}f, ${round2(z)}f),\\n\\t\\t\\t${channel}.${interpolation})`;\n                    }\n                    outfileText += \"))\";\n                }\n            }\n            outfileText += \".build();\"\n        }\n        return outfileText.replaceAll(\"66666666666\", \"67\").replaceAll(\"33333333333\", \"34\");\n    }\n\n    function round2(n) {\n        return Math.round((Number(n) + Number.EPSILON) * 100) / 100;\n    }\n})();\n"
  },
  {
    "path": "plugins/animation_to_json.js",
    "content": "// Based off of https://github.com/JannisX11/blockbench-plugins/blob/master/plugins/animation_to_java.js\n(function () {\n    var menuButton;\n\n    Plugin.register(\"animation_to_json\", {\n        title: \"Animation to JSON Converter\",\n        author: \"Gaming32\",\n        description: \"Converts Blockbench animations to the JSON format for the NeoForge mod loader\",\n        icon: \"fa-cube\",\n        tags: [\"Animation\", \"Minecraft: Java Edition\"],\n        variant: \"both\",\n        version: \"1.0.1\",\n        onload() {\n            Formats.modded_entity.animation_mode = true;\n            menuButton = new Action(\"export_animation_to_json\", {\n                name: \"Export Animations to JSON\",\n                description: \"Export Animations to JSON format\",\n                icon: \"fa-file-export\",\n                condition: () => Format.animation_mode,\n                click() {\n                    const animation = Animation.selected;\n                    if (animation == null) return;\n                    Blockbench.export({\n                        type: \"Json Files\",\n                        extensions: [\"json\"],\n                        name: `${animation.name.replaceAll(\".\", \"_\").replace(\"animation_\", \"\")}.json`,\n                        resource_id: \"json_entity_animation\",\n                        savetype: \"text\",\n                        content: JSON.stringify(generateJson(animation))\n                    });\n                }\n            });\n            MenuBar.addAction(menuButton, \"file.export\");\n        },\n        onunload() {\n            menuButton.delete();\n        }\n    });\n\n    function generateJson(animation) {\n        const result = {\n            length: animation.length,\n            animations: []\n        };\n        if (animation.loop == \"loop\") {\n            result.loop = true;\n        }\n        for (const id in animation.animators) {\n            const boneAnimator = animation.animators[id];\n            if (!(boneAnimator instanceof BoneAnimator)) continue;\n            if (boneAnimator.position.length) {\n                result.animations.push(generateKeyframes(boneAnimator.name, \"position\", boneAnimator.position));\n            }\n            if (boneAnimator.rotation.length) {\n                result.animations.push(generateKeyframes(boneAnimator.name, \"rotation\", boneAnimator.rotation));\n            }\n            if (boneAnimator.scale.length) {\n                result.animations.push(generateKeyframes(boneAnimator.name, \"scale\", boneAnimator.scale));\n            }\n        }\n        return result;\n    }\n\n    function generateKeyframes(bone, target, keyframes) {\n        const animData = {\n            bone,\n            target,\n            keyframes: []\n        };\n        for (const keyframe of [...keyframes].sort((a, b) => a.time - b.time)) {\n            animData.keyframes.push({\n                timestamp: keyframe.time,\n                target: [\n                    keyframe.get(\"x\"),\n                    keyframe.get(\"y\"),\n                    keyframe.get(\"z\"),\n                ],\n                interpolation: keyframe.interpolation\n            });\n        }\n        return animData;\n    }\n})();\n"
  },
  {
    "path": "plugins/animation_utils/README.md",
    "content": "# GeckoLib Animation Utils Developer Readme\n\nThis readme is intended for developers wishing to work on the GeckoLib plugin.\n\n# Environment setup\n## Windows\nInspect the contents of [.nvmrc](./src/.nvmrc) - this specifies the recommended version of Node.JS to use for plugin development. You can [download the corresponding version of Node.JS here](https://nodejs.org/en/download/releases).\n\n\n## macOS and Unix\nIt's recommended, though not required, to install the correct version of Node.JS using the Node Version Manager script (nvm). [Follow the install guide here](https://github.com/nvm-sh/nvm/blob/master/README.md).\n\nA brief summary of how to use `nvm` once it's installed is to `cd` into the [src](./src) folder of the plugin and then run:\n```\nnvm install `cat .nvmrc`\n```\nfollowed by: \n```\nnvm use\n```\nIf you have multiple versions of node installed on your system, it may be convenient to [change the default version to the version of node you just installed](https://github.com/nvm-sh/nvm/blob/master/README.md#set-default-node-version). Otherwise you may need to run `nvm use` every time you start a new terminal session. If you are using `nvm` for other projects with other versions of node, you can also use a [shell hook script to automatically run nvm use when changing directories](https://stackoverflow.com/questions/23556330/run-nvm-use-automatically-every-time-theres-a-nvmrc-file-on-the-directory).\n\nYou can confirm the active node version by running \n```\nnode --version\n```\n\n## All Platforms\nAfter Node.JS has been installed, run:\n```\nnpm install\n```\n\nInside the `src` folder.\n\nYou should run this command any time there has been a change to `package.json`. You might see a diff on `package-lock.json`. This is usually OK and indicates an update to transient dependenices, and should be OK to commit. If you see a LOT of changes to this file it might be an indication you are using the wrong version of node/npm.\n\n# Developing the plugin\n\n## Working on the plugin\nFirst, start the development webpack bundler:\n```\nnpm start\n```\nThe development bundler will watch the filesystem for changes and automatically re-build the plugin to [animation_utils.js](./animation_utils.js).\n\nThen, you can load the plugin in Blockbench from `File` -> `Plugins` and selecting the `Load Plugin from File` button. Every time you make a change to the plugin source code, the bundler will automatically rebuild the plugin, but you still need to reload it in Blockbench in order for the changes to take effect. You can do this by selecting `Help` -> `Developer` -> `Reload Plugins`. In some cases if the global state has been messed up, you may need to reload the entire application using `Help` -> `Developer` -> `Reload Blockbench`. It's also recommended to select `Open Dev Tools` from this menu as it can be very helpful to explore the Blockbench API using the console and inspect error logs and debug breakpoints.\n\nAs every time you load the plugin, it's considered by the JS interpreter to be a different source file, any breakpoints set on the previously loaded file will be lost. You can work around this by adding a `debugger;` statement inside the source code where you want to set a breakpoint, which will force the JS interpreter to break on that line.\n\nIf a TypeScript compiler error is encountered, it will be logged to the terminal window, but the JS bundle will still be generated.\n\nTo check for errors, you can run:\n```\nnpm run test\n```\nThis will run all pretest scripts (eslint and TypeScript type check) as well as unit tests. It's also possible to run pretest separately, or the individual checks by themselves. To see all available npm scripts, run:\n```\nnpm run\n```\n\n## Building a release of the plugin\nFirst, inspect [package.json](./src/package.json) to make sure all the properties are correct. If you are making a release of the plugin, you should bump the `version` property to be one minor version up for a bugfix, minor version for new features, or major version for backwards-incompatible breaking changes.\nThen, check the `blockbenchConfig`. `min_version` should be the lowest version of Blockbench the plugin is known to work with and `max_version` should be the first version the plugin is expected to not work with that's higher than the versions it was tested on. When the metadata is ready, run:\n```\nnpm run build\n```\nThis will first run prebuild/pretest/test scripts, then build the plugin and automatically update the [plugins.json](../../plugins.json) manifest with your settings.\n\nThen, update the [changelog](./changelog.json) to add patch notes for the new version.\nNew version entries go at the bottom.\n\nDouble-check everything looks right, then commit and make a PR to [JannisX11/blockbench-plugins](https://github.com/JannisX11/blockbench-plugins) to release the plugin.\n\nNote that it is possible to skip pre-build scripts by running:\n```\nnpm run build:only\n```\nThis is dangerous and shouldn't be done to make a full release, it's better to fix any errors from tests, lint, and compiler before publishing changes.\n\n## Using TypeScript\nThe plugin is now written using a loose version of [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html). Blockbench types are supplied by the [blockbench-types](https://github.com/JannisX11/blockbench-types) package. Note that these types are hand-written and may contain errors or be missing certain APIs. So just because you see an error message in your IDE or the bundler output doesn't neccessarily mean your code is wrong, it's possible it could be an issue with the type definitions. TypeScript errors won't prevent the plugin from being built so you can always test your code manually and/or inspect the [Blockbench source code](https://github.com/JannisX11/blockbench) to confirm the code is correct. If there's an error in the types, there are a few ways of fixing it:\n1. Make a PR to `blockbench-types`. This is the best, although possibly the slowest method of fixing type errors, and will help all other plugin authors.\n    * These changes can be tested locally first using `npm link`. To do so, clone the repo and ensure the same node version is being used as the one for the plugin. Then run `npm link` inside `blockbench-types`. Finally, run `npm link blockbench-types` inside the plugin `src` folder. This will create a symbolic link inside `node_modules` so that the types are resolved from your local copy of `blockbench-types`. You need to run `npm link blockbench-types` after every time you run `npm install` because an install overwrites the symlink.\n1. Massage the types inside the plugin. There are a number of ways you can do this, such as:\n   * Use [type assertions (aka casting)](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions). Performing an `as` cast directly into the target type is the safest method. If neccessary, casting via `as unknown as <Target Type>` will cause the compiler to ignore insufficient overlap between types. It's also possible to attempt to change the type of a function parameter or inferred variable type  by adding a type annotation, such as:\n   ```typescript\n   (kf: GeckolibKeyframe) => { } // Otherwise kf would be a Keyframe\n   ```\n   or\n   ```typescript\n    let easingBar: HTMLElement = document.createElement('div'); // Otherwise this would be an HTMLDivElement\n   ```\n   * Subclassing a blockbench type (for an example of this see usage of the `GeckolibBoneAnimator` in [codec.ts](./src/codec.ts)).\n   * Performing [type narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html).\n   * There are other options, such as [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#handbook-content).\n1. The nuclear option when all else fails: slap a `// @ts-ignore` comment above the problematic line(s). This is a bit dangerous as it shuts off ALL type checking on on that line, but sometimes this is necessary if you need to just force the compiler to ignore a problematic area of the code.\n\nSome places that are good to look for help with TypeScript are the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html), [TypeScript Discord](https://discord.com/invite/typescript), or you can ping Eliot on the GeckoLib Discord.\n\n# Working with ESLint\n[ESLint](https://eslint.org) is a tool for checking the code for common errors or problematic coding styles. It can be integrated into IDEs via plugins, and can be run from the terminal like so:\n```\nnpm run lint\n```\n\nSome lint errors can be fixed automatically by running:\n```\nnpm run lint:fix\n```\n\nIt's best to fix errors by changing the source code when possible. There are some cases in which certain lint rules might get in the way of particular things we might need to do in the plugin. In this case, [the rules can be disabled for different scopes](https://eslint.org/docs/latest/use/configure/rules). It's best to keep the scope as small as possible, so disabling individual rules per-line is the best way to start, or if it's needed in a larger area, disabling individual rules for a block of code, then lastly a whole file. You can search the code for `eslint-disable` to find examples. In some cases it may be necessary to disable a rule for the entire codebase, this can be done in the `rules` block of the [.eslintrc.cjs](./src/.eslintrc.cjs) file.\n"
  },
  {
    "path": "plugins/animation_utils/about.md",
    "content": "<img src=\"https://i.imgur.com/fjDJ4jM.png\" alt=\"GeckoLib\"/>\n\nBlockbench plugin for the GeckoLib animation and rendering library mod for Minecraft: Java edition.\nThis plugin allows you to create and edit model and animation assets for GeckoLib-based mods, utilising Blockbench's live animation editor and other editing tools.\n\nUtilise native support for resourcepack-able controller-based animations, mathematical expressions, easings, and more to create armour, items, entities, blocks, and anything else you can think of!\n\nMust be paired with a Mod for Minecraft: Java utilising the GeckoLib library.\n\n<div style=\"text-align:center;\"><h2>Links:</h2></div>\n<div style=\"text-align:center; display:flex\">\n<div style=\"flex:1\">\n<a href=\"https://discord.gg/Bt3p6kA6TK\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Discord</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://github.com/bernie-g/geckolib/wiki\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Wiki</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://www.curseforge.com/minecraft/mc-mods/geckolib\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">CurseForge</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://modrinth.com/mod/geckolib\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Modrinth</p>\n</a>\n</div>\n</div>"
  },
  {
    "path": "plugins/animation_utils/animation_utils.js",
    "content": "/******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css ***!\n  \\******************************************************************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);\n// Imports\n\n\n\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;base64,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 */ \"data:font/woff2;base64,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\"), __webpack_require__.b);\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@font-face {\n    font-family: 'geckolib_icomoon';\n    font-weight: normal;\n    font-style: normal;\n    src: url(${___CSS_LOADER_URL_REPLACEMENT_0___}) format(\"woff2\");\n}\n\n[class^=\"easing-\"]:not(.fa), [class*=\" easing-\"]:not(.fa) {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: 'geckolib_icomoon' !important;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n    font-size: 1.4em;\n    max-width: 24px;\n\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.easing-linear:before {\n    content: \"\\\\e925\";\n}\n.easing-step:before {\n    content: \"\\\\e921\";\n}\n.easing-in_sine:before {\n    content: \"\\\\e915\";\n}\n.easing-out_sine:before {\n    content: \"\\\\e916\";\n}\n.easing-in_out_sine:before {\n    content: \"\\\\e917\";\n}\n.easing-in_quad:before {\n    content: \"\\\\e900\";\n}\n.easing-out_quad:before {\n    content: \"\\\\e901\";\n}\n.easing-in_out_quad:before {\n    content: \"\\\\e902\";\n}\n.easing-in_cubic:before {\n    content: \"\\\\e903\";\n}\n.easing-out_cubic:before {\n    content: \"\\\\e904\";\n}\n.easing-in_out_cubic:before {\n    content: \"\\\\e905\";\n}\n.easing-in_quart:before {\n    content: \"\\\\e906\";\n}\n.easing-out_quart:before {\n    content: \"\\\\e907\";\n}\n.easing-in_out_quart:before {\n    content: \"\\\\e908\";\n}\n.easing-in_quint:before {\n    content: \"\\\\e909\";\n}\n.easing-out_quint:before {\n    content: \"\\\\e90a\";\n}\n.easing-in_out_quint:before {\n    content: \"\\\\e90b\";\n}\n.easing-in_expo:before {\n    content: \"\\\\e90c\";\n}\n.easing-out_expo:before {\n    content: \"\\\\e90d\";\n}\n.easing-in_out_expo:before {\n    content: \"\\\\e90e\";\n}\n.easing-in_circ:before {\n    content: \"\\\\e90f\";\n}\n.easing-out_circ:before {\n    content: \"\\\\e910\";\n}\n.easing-in_out_circ:before {\n    content: \"\\\\e911\";\n}\n.easing-in_back:before {\n    content: \"\\\\e918\";\n}\n.easing-out_back:before {\n    content: \"\\\\e919\";\n}\n.easing-in_out_back:before {\n    content: \"\\\\e91a\";\n}\n.easing-in_elastic:before {\n    content: \"\\\\e91b\";\n}\n.easing-out_elastic:before {\n    content: \"\\\\e91c\";\n}\n.easing-in_out_elastic:before {\n    content: \"\\\\e91d\";\n}\n.easing-in_bounce:before {\n    content: \"\\\\e91e\";\n}\n.easing-out_bounce:before {\n    content: \"\\\\e91f\";\n}\n.easing-in_out_bounce:before {\n    content: \"\\\\e920\";\n}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/api.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/api.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n  var list = [];\n\n  // return the list of modules as css string\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = \"\";\n      var needLayer = typeof item[5] !== \"undefined\";\n      if (item[4]) {\n        content += \"@supports (\".concat(item[4], \") {\");\n      }\n      if (item[2]) {\n        content += \"@media \".concat(item[2], \" {\");\n      }\n      if (needLayer) {\n        content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n      }\n      content += cssWithMappingToString(item);\n      if (needLayer) {\n        content += \"}\";\n      }\n      if (item[2]) {\n        content += \"}\";\n      }\n      if (item[4]) {\n        content += \"}\";\n      }\n      return content;\n    }).join(\"\");\n  };\n\n  // import a list of modules into the list\n  list.i = function i(modules, media, dedupe, supports, layer) {\n    if (typeof modules === \"string\") {\n      modules = [[null, modules, undefined]];\n    }\n    var alreadyImportedModules = {};\n    if (dedupe) {\n      for (var k = 0; k < this.length; k++) {\n        var id = this[k][0];\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n    for (var _k = 0; _k < modules.length; _k++) {\n      var item = [].concat(modules[_k]);\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        continue;\n      }\n      if (typeof layer !== \"undefined\") {\n        if (typeof item[5] === \"undefined\") {\n          item[5] = layer;\n        } else {\n          item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n          item[5] = layer;\n        }\n      }\n      if (media) {\n        if (!item[2]) {\n          item[2] = media;\n        } else {\n          item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n          item[2] = media;\n        }\n      }\n      if (supports) {\n        if (!item[4]) {\n          item[4] = \"\".concat(supports);\n        } else {\n          item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n          item[4] = supports;\n        }\n      }\n      list.push(item);\n    }\n  };\n  return list;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/getUrl.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***!\n  \\********************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = function (url, options) {\n  if (!options) {\n    options = {};\n  }\n  if (!url) {\n    return url;\n  }\n  url = String(url.__esModule ? url.default : url);\n\n  // If url is already wrapped in quotes, remove them\n  if (/^['\"].*['\"]$/.test(url)) {\n    url = url.slice(1, -1);\n  }\n  if (options.hash) {\n    url += options.hash;\n  }\n\n  // Should url be wrapped?\n  // See https://drafts.csswg.org/css-values-3/#urls\n  if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n    return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n  }\n  return url;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\":\n/*!**************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***!\n  \\**************************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = function (i) {\n  return i[1];\n};\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_DataView.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_DataView.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Hash.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/_Hash.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar hashClear = __webpack_require__(/*! ./_hashClear */ \"./node_modules/lodash/_hashClear.js\"),\n    hashDelete = __webpack_require__(/*! ./_hashDelete */ \"./node_modules/lodash/_hashDelete.js\"),\n    hashGet = __webpack_require__(/*! ./_hashGet */ \"./node_modules/lodash/_hashGet.js\"),\n    hashHas = __webpack_require__(/*! ./_hashHas */ \"./node_modules/lodash/_hashHas.js\"),\n    hashSet = __webpack_require__(/*! ./_hashSet */ \"./node_modules/lodash/_hashSet.js\");\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_ListCache.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_ListCache.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar listCacheClear = __webpack_require__(/*! ./_listCacheClear */ \"./node_modules/lodash/_listCacheClear.js\"),\n    listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ \"./node_modules/lodash/_listCacheDelete.js\"),\n    listCacheGet = __webpack_require__(/*! ./_listCacheGet */ \"./node_modules/lodash/_listCacheGet.js\"),\n    listCacheHas = __webpack_require__(/*! ./_listCacheHas */ \"./node_modules/lodash/_listCacheHas.js\"),\n    listCacheSet = __webpack_require__(/*! ./_listCacheSet */ \"./node_modules/lodash/_listCacheSet.js\");\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Map.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/_Map.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_MapCache.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_MapCache.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ \"./node_modules/lodash/_mapCacheClear.js\"),\n    mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ \"./node_modules/lodash/_mapCacheDelete.js\"),\n    mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ \"./node_modules/lodash/_mapCacheGet.js\"),\n    mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ \"./node_modules/lodash/_mapCacheHas.js\"),\n    mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ \"./node_modules/lodash/_mapCacheSet.js\");\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Promise.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_Promise.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Set.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/_Set.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_SetCache.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_SetCache.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\"),\n    setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ \"./node_modules/lodash/_setCacheAdd.js\"),\n    setCacheHas = __webpack_require__(/*! ./_setCacheHas */ \"./node_modules/lodash/_setCacheHas.js\");\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Stack.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_Stack.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    stackClear = __webpack_require__(/*! ./_stackClear */ \"./node_modules/lodash/_stackClear.js\"),\n    stackDelete = __webpack_require__(/*! ./_stackDelete */ \"./node_modules/lodash/_stackDelete.js\"),\n    stackGet = __webpack_require__(/*! ./_stackGet */ \"./node_modules/lodash/_stackGet.js\"),\n    stackHas = __webpack_require__(/*! ./_stackHas */ \"./node_modules/lodash/_stackHas.js\"),\n    stackSet = __webpack_require__(/*! ./_stackSet */ \"./node_modules/lodash/_stackSet.js\");\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Symbol.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/_Symbol.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Uint8Array.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_Uint8Array.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_WeakMap.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_WeakMap.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayAggregator.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_arrayAggregator.js ***!\n  \\*************************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    var value = array[index];\n    setter(accumulator, value, iteratee(value), array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayFilter.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_arrayFilter.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayIncludes.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_arrayIncludes.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ \"./node_modules/lodash/_baseIndexOf.js\");\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayIncludesWith.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/lodash/_arrayIncludesWith.js ***!\n  \\***************************************************/\n/***/ ((module) => {\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayLikeKeys.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_arrayLikeKeys.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseTimes = __webpack_require__(/*! ./_baseTimes */ \"./node_modules/lodash/_baseTimes.js\"),\n    isArguments = __webpack_require__(/*! ./isArguments */ \"./node_modules/lodash/isArguments.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isBuffer = __webpack_require__(/*! ./isBuffer */ \"./node_modules/lodash/isBuffer.js\"),\n    isIndex = __webpack_require__(/*! ./_isIndex */ \"./node_modules/lodash/_isIndex.js\"),\n    isTypedArray = __webpack_require__(/*! ./isTypedArray */ \"./node_modules/lodash/isTypedArray.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayMap.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_arrayMap.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayPush.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_arrayPush.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arraySome.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_arraySome.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_assocIndexOf.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_assocIndexOf.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar eq = __webpack_require__(/*! ./eq */ \"./node_modules/lodash/eq.js\");\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseAggregator.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_baseAggregator.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseEach = __webpack_require__(/*! ./_baseEach */ \"./node_modules/lodash/_baseEach.js\");\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n  baseEach(collection, function(value, key, collection) {\n    setter(accumulator, value, iteratee(value), collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseAssignValue.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseAssignValue.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar defineProperty = __webpack_require__(/*! ./_defineProperty */ \"./node_modules/lodash/_defineProperty.js\");\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseEach.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseEach.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseForOwn = __webpack_require__(/*! ./_baseForOwn */ \"./node_modules/lodash/_baseForOwn.js\"),\n    createBaseEach = __webpack_require__(/*! ./_createBaseEach */ \"./node_modules/lodash/_createBaseEach.js\");\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseFindIndex.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_baseFindIndex.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseFor.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_baseFor.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar createBaseFor = __webpack_require__(/*! ./_createBaseFor */ \"./node_modules/lodash/_createBaseFor.js\");\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseForOwn.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_baseForOwn.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseFor = __webpack_require__(/*! ./_baseFor */ \"./node_modules/lodash/_baseFor.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_baseGet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar castPath = __webpack_require__(/*! ./_castPath */ \"./node_modules/lodash/_castPath.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGetAllKeys.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_baseGetAllKeys.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayPush = __webpack_require__(/*! ./_arrayPush */ \"./node_modules/lodash/_arrayPush.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\");\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGetTag.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_baseGetTag.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    getRawTag = __webpack_require__(/*! ./_getRawTag */ \"./node_modules/lodash/_getRawTag.js\"),\n    objectToString = __webpack_require__(/*! ./_objectToString */ \"./node_modules/lodash/_objectToString.js\");\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseHasIn.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseHasIn.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIndexOf.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIndexOf.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ \"./node_modules/lodash/_baseFindIndex.js\"),\n    baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ \"./node_modules/lodash/_baseIsNaN.js\"),\n    strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ \"./node_modules/lodash/_strictIndexOf.js\");\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsArguments.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsArguments.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsEqual.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsEqual.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ \"./node_modules/lodash/_baseIsEqualDeep.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsEqualDeep.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsEqualDeep.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Stack = __webpack_require__(/*! ./_Stack */ \"./node_modules/lodash/_Stack.js\"),\n    equalArrays = __webpack_require__(/*! ./_equalArrays */ \"./node_modules/lodash/_equalArrays.js\"),\n    equalByTag = __webpack_require__(/*! ./_equalByTag */ \"./node_modules/lodash/_equalByTag.js\"),\n    equalObjects = __webpack_require__(/*! ./_equalObjects */ \"./node_modules/lodash/_equalObjects.js\"),\n    getTag = __webpack_require__(/*! ./_getTag */ \"./node_modules/lodash/_getTag.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isBuffer = __webpack_require__(/*! ./isBuffer */ \"./node_modules/lodash/isBuffer.js\"),\n    isTypedArray = __webpack_require__(/*! ./isTypedArray */ \"./node_modules/lodash/isTypedArray.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsMatch.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsMatch.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Stack = __webpack_require__(/*! ./_Stack */ \"./node_modules/lodash/_Stack.js\"),\n    baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ \"./node_modules/lodash/_baseIsEqual.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsNaN.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseIsNaN.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsNative.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsNative.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isFunction = __webpack_require__(/*! ./isFunction */ \"./node_modules/lodash/isFunction.js\"),\n    isMasked = __webpack_require__(/*! ./_isMasked */ \"./node_modules/lodash/_isMasked.js\"),\n    isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\"),\n    toSource = __webpack_require__(/*! ./_toSource */ \"./node_modules/lodash/_toSource.js\");\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsTypedArray.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsTypedArray.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIteratee.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseIteratee.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseMatches = __webpack_require__(/*! ./_baseMatches */ \"./node_modules/lodash/_baseMatches.js\"),\n    baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ \"./node_modules/lodash/_baseMatchesProperty.js\"),\n    identity = __webpack_require__(/*! ./identity */ \"./node_modules/lodash/identity.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    property = __webpack_require__(/*! ./property */ \"./node_modules/lodash/property.js\");\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseKeys.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseKeys.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isPrototype = __webpack_require__(/*! ./_isPrototype */ \"./node_modules/lodash/_isPrototype.js\"),\n    nativeKeys = __webpack_require__(/*! ./_nativeKeys */ \"./node_modules/lodash/_nativeKeys.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseMatches.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseMatches.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ \"./node_modules/lodash/_baseIsMatch.js\"),\n    getMatchData = __webpack_require__(/*! ./_getMatchData */ \"./node_modules/lodash/_getMatchData.js\"),\n    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ \"./node_modules/lodash/_matchesStrictComparable.js\");\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseMatchesProperty.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/lodash/_baseMatchesProperty.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ \"./node_modules/lodash/_baseIsEqual.js\"),\n    get = __webpack_require__(/*! ./get */ \"./node_modules/lodash/get.js\"),\n    hasIn = __webpack_require__(/*! ./hasIn */ \"./node_modules/lodash/hasIn.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ \"./node_modules/lodash/_isStrictComparable.js\"),\n    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ \"./node_modules/lodash/_matchesStrictComparable.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseProperty.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseProperty.js ***!\n  \\**********************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_basePropertyDeep.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_basePropertyDeep.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGet = __webpack_require__(/*! ./_baseGet */ \"./node_modules/lodash/_baseGet.js\");\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseTimes.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseTimes.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseToString.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseToString.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    arrayMap = __webpack_require__(/*! ./_arrayMap */ \"./node_modules/lodash/_arrayMap.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseUnary.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseUnary.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseUniq.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseUniq.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar SetCache = __webpack_require__(/*! ./_SetCache */ \"./node_modules/lodash/_SetCache.js\"),\n    arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ \"./node_modules/lodash/_arrayIncludes.js\"),\n    arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ \"./node_modules/lodash/_arrayIncludesWith.js\"),\n    cacheHas = __webpack_require__(/*! ./_cacheHas */ \"./node_modules/lodash/_cacheHas.js\"),\n    createSet = __webpack_require__(/*! ./_createSet */ \"./node_modules/lodash/_createSet.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_cacheHas.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_cacheHas.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_castPath.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_castPath.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    stringToPath = __webpack_require__(/*! ./_stringToPath */ \"./node_modules/lodash/_stringToPath.js\"),\n    toString = __webpack_require__(/*! ./toString */ \"./node_modules/lodash/toString.js\");\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_coreJsData.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_coreJsData.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createAggregator.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_createAggregator.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayAggregator = __webpack_require__(/*! ./_arrayAggregator */ \"./node_modules/lodash/_arrayAggregator.js\"),\n    baseAggregator = __webpack_require__(/*! ./_baseAggregator */ \"./node_modules/lodash/_baseAggregator.js\"),\n    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\");\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n  return function(collection, iteratee) {\n    var func = isArray(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {};\n\n    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n  };\n}\n\nmodule.exports = createAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createBaseEach.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_createBaseEach.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArrayLike = __webpack_require__(/*! ./isArrayLike */ \"./node_modules/lodash/isArrayLike.js\");\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createBaseFor.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_createBaseFor.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createSet.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_createSet.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Set = __webpack_require__(/*! ./_Set */ \"./node_modules/lodash/_Set.js\"),\n    noop = __webpack_require__(/*! ./noop */ \"./node_modules/lodash/noop.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_defineProperty.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_defineProperty.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\");\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalArrays.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_equalArrays.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar SetCache = __webpack_require__(/*! ./_SetCache */ \"./node_modules/lodash/_SetCache.js\"),\n    arraySome = __webpack_require__(/*! ./_arraySome */ \"./node_modules/lodash/_arraySome.js\"),\n    cacheHas = __webpack_require__(/*! ./_cacheHas */ \"./node_modules/lodash/_cacheHas.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalByTag.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_equalByTag.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    Uint8Array = __webpack_require__(/*! ./_Uint8Array */ \"./node_modules/lodash/_Uint8Array.js\"),\n    eq = __webpack_require__(/*! ./eq */ \"./node_modules/lodash/eq.js\"),\n    equalArrays = __webpack_require__(/*! ./_equalArrays */ \"./node_modules/lodash/_equalArrays.js\"),\n    mapToArray = __webpack_require__(/*! ./_mapToArray */ \"./node_modules/lodash/_mapToArray.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalObjects.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_equalObjects.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getAllKeys = __webpack_require__(/*! ./_getAllKeys */ \"./node_modules/lodash/_getAllKeys.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_freeGlobal.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_freeGlobal.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\nmodule.exports = freeGlobal;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getAllKeys.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getAllKeys.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ \"./node_modules/lodash/_baseGetAllKeys.js\"),\n    getSymbols = __webpack_require__(/*! ./_getSymbols */ \"./node_modules/lodash/_getSymbols.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getMapData.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getMapData.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isKeyable = __webpack_require__(/*! ./_isKeyable */ \"./node_modules/lodash/_isKeyable.js\");\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getMatchData.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_getMatchData.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ \"./node_modules/lodash/_isStrictComparable.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getNative.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_getNative.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsNative = __webpack_require__(/*! ./_baseIsNative */ \"./node_modules/lodash/_baseIsNative.js\"),\n    getValue = __webpack_require__(/*! ./_getValue */ \"./node_modules/lodash/_getValue.js\");\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getRawTag.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_getRawTag.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getSymbols.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getSymbols.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayFilter = __webpack_require__(/*! ./_arrayFilter */ \"./node_modules/lodash/_arrayFilter.js\"),\n    stubArray = __webpack_require__(/*! ./stubArray */ \"./node_modules/lodash/stubArray.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getTag.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/_getTag.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DataView = __webpack_require__(/*! ./_DataView */ \"./node_modules/lodash/_DataView.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\"),\n    Promise = __webpack_require__(/*! ./_Promise */ \"./node_modules/lodash/_Promise.js\"),\n    Set = __webpack_require__(/*! ./_Set */ \"./node_modules/lodash/_Set.js\"),\n    WeakMap = __webpack_require__(/*! ./_WeakMap */ \"./node_modules/lodash/_WeakMap.js\"),\n    baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    toSource = __webpack_require__(/*! ./_toSource */ \"./node_modules/lodash/_toSource.js\");\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getValue.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_getValue.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hasPath.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hasPath.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar castPath = __webpack_require__(/*! ./_castPath */ \"./node_modules/lodash/_castPath.js\"),\n    isArguments = __webpack_require__(/*! ./isArguments */ \"./node_modules/lodash/isArguments.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isIndex = __webpack_require__(/*! ./_isIndex */ \"./node_modules/lodash/_isIndex.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashClear.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_hashClear.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashDelete.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_hashDelete.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashGet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashGet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashHas.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashHas.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashSet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashSet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isIndex.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_isIndex.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isKey.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_isKey.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isKeyable.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_isKeyable.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isMasked.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_isMasked.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar coreJsData = __webpack_require__(/*! ./_coreJsData */ \"./node_modules/lodash/_coreJsData.js\");\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isPrototype.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_isPrototype.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isStrictComparable.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/lodash/_isStrictComparable.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\");\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheClear.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_listCacheClear.js ***!\n  \\************************************************/\n/***/ ((module) => {\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheDelete.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_listCacheDelete.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheGet.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheGet.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheHas.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheHas.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheSet.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheSet.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheClear.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheClear.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Hash = __webpack_require__(/*! ./_Hash */ \"./node_modules/lodash/_Hash.js\"),\n    ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\");\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheDelete.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheDelete.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheGet.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheGet.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheHas.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheHas.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheSet.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheSet.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapToArray.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_mapToArray.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_matchesStrictComparable.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/lodash/_matchesStrictComparable.js ***!\n  \\*********************************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_memoizeCapped.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_memoizeCapped.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar memoize = __webpack_require__(/*! ./memoize */ \"./node_modules/lodash/memoize.js\");\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nativeCreate.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_nativeCreate.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\");\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nativeKeys.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_nativeKeys.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar overArg = __webpack_require__(/*! ./_overArg */ \"./node_modules/lodash/_overArg.js\");\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nodeUtil.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_nodeUtil.js ***!\n  \\******************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\n/* module decorator */ module = __webpack_require__.nmd(module);\nvar freeGlobal = __webpack_require__(/*! ./_freeGlobal */ \"./node_modules/lodash/_freeGlobal.js\");\n\n/** Detect free variable `exports`. */\nvar freeExports =  true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_objectToString.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_objectToString.js ***!\n  \\************************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_overArg.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_overArg.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_root.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/_root.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar freeGlobal = __webpack_require__(/*! ./_freeGlobal */ \"./node_modules/lodash/_freeGlobal.js\");\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setCacheAdd.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_setCacheAdd.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setCacheHas.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_setCacheHas.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setToArray.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_setToArray.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackClear.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_stackClear.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\");\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackDelete.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_stackDelete.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackGet.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackGet.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackHas.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackHas.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackSet.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackSet.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\"),\n    MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\");\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_strictIndexOf.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_strictIndexOf.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stringToPath.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_stringToPath.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ \"./node_modules/lodash/_memoizeCapped.js\");\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_toKey.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_toKey.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_toSource.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_toSource.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/eq.js\":\n/*!***********************************!*\\\n  !*** ./node_modules/lodash/eq.js ***!\n  \\***********************************/\n/***/ ((module) => {\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/get.js\":\n/*!************************************!*\\\n  !*** ./node_modules/lodash/get.js ***!\n  \\************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGet = __webpack_require__(/*! ./_baseGet */ \"./node_modules/lodash/_baseGet.js\");\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/groupBy.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/groupBy.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ \"./node_modules/lodash/_baseAssignValue.js\"),\n    createAggregator = __webpack_require__(/*! ./_createAggregator */ \"./node_modules/lodash/_createAggregator.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n  if (hasOwnProperty.call(result, key)) {\n    result[key].push(value);\n  } else {\n    baseAssignValue(result, key, [value]);\n  }\n});\n\nmodule.exports = groupBy;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/hasIn.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/hasIn.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseHasIn = __webpack_require__(/*! ./_baseHasIn */ \"./node_modules/lodash/_baseHasIn.js\"),\n    hasPath = __webpack_require__(/*! ./_hasPath */ \"./node_modules/lodash/_hasPath.js\");\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/identity.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/identity.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArguments.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/isArguments.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ \"./node_modules/lodash/_baseIsArguments.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArray.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/isArray.js ***!\n  \\****************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArrayLike.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/isArrayLike.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isFunction = __webpack_require__(/*! ./isFunction */ \"./node_modules/lodash/isFunction.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\");\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isBuffer.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isBuffer.js ***!\n  \\*****************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\n/* module decorator */ module = __webpack_require__.nmd(module);\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\"),\n    stubFalse = __webpack_require__(/*! ./stubFalse */ \"./node_modules/lodash/stubFalse.js\");\n\n/** Detect free variable `exports`. */\nvar freeExports =  true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isFunction.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/isFunction.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\");\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isLength.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isLength.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isObject.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isObject.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isObjectLike.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/isObjectLike.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isSymbol.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isSymbol.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isTypedArray.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/isTypedArray.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ \"./node_modules/lodash/_baseIsTypedArray.js\"),\n    baseUnary = __webpack_require__(/*! ./_baseUnary */ \"./node_modules/lodash/_baseUnary.js\"),\n    nodeUtil = __webpack_require__(/*! ./_nodeUtil */ \"./node_modules/lodash/_nodeUtil.js\");\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/keys.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/keys.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ \"./node_modules/lodash/_arrayLikeKeys.js\"),\n    baseKeys = __webpack_require__(/*! ./_baseKeys */ \"./node_modules/lodash/_baseKeys.js\"),\n    isArrayLike = __webpack_require__(/*! ./isArrayLike */ \"./node_modules/lodash/isArrayLike.js\");\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/mapValues.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/mapValues.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ \"./node_modules/lodash/_baseAssignValue.js\"),\n    baseForOwn = __webpack_require__(/*! ./_baseForOwn */ \"./node_modules/lodash/_baseForOwn.js\"),\n    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\");\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n *   'fred':    { 'user': 'fred',    'age': 40 },\n *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n  var result = {};\n  iteratee = baseIteratee(iteratee, 3);\n\n  baseForOwn(object, function(value, key, object) {\n    baseAssignValue(result, key, iteratee(value, key, object));\n  });\n  return result;\n}\n\nmodule.exports = mapValues;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/memoize.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/memoize.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\");\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/noop.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/noop.js ***!\n  \\*************************************/\n/***/ ((module) => {\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/property.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/property.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseProperty = __webpack_require__(/*! ./_baseProperty */ \"./node_modules/lodash/_baseProperty.js\"),\n    basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ \"./node_modules/lodash/_basePropertyDeep.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/stubArray.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/stubArray.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/stubFalse.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/stubFalse.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/toString.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/toString.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseToString = __webpack_require__(/*! ./_baseToString */ \"./node_modules/lodash/_baseToString.js\");\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/uniq.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/uniq.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseUniq = __webpack_require__(/*! ./_baseUniq */ \"./node_modules/lodash/_baseUniq.js\");\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/comparator.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/semver/classes/comparator.js ***!\n  \\***************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n  static get ANY () {\n    return ANY\n  }\n  constructor (comp, options) {\n    if (!options || typeof options !== 'object') {\n      options = {\n        loose: !!options,\n        includePrerelease: false\n      }\n    }\n\n    if (comp instanceof Comparator) {\n      if (comp.loose === !!options.loose) {\n        return comp\n      } else {\n        comp = comp.value\n      }\n    }\n\n    debug('comparator', comp, options)\n    this.options = options\n    this.loose = !!options.loose\n    this.parse(comp)\n\n    if (this.semver === ANY) {\n      this.value = ''\n    } else {\n      this.value = this.operator + this.semver.version\n    }\n\n    debug('comp', this)\n  }\n\n  parse (comp) {\n    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n    const m = comp.match(r)\n\n    if (!m) {\n      throw new TypeError(`Invalid comparator: ${comp}`)\n    }\n\n    this.operator = m[1] !== undefined ? m[1] : ''\n    if (this.operator === '=') {\n      this.operator = ''\n    }\n\n    // if it literally is just '>' or '' then allow anything.\n    if (!m[2]) {\n      this.semver = ANY\n    } else {\n      this.semver = new SemVer(m[2], this.options.loose)\n    }\n  }\n\n  toString () {\n    return this.value\n  }\n\n  test (version) {\n    debug('Comparator.test', version, this.options.loose)\n\n    if (this.semver === ANY || version === ANY) {\n      return true\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    return cmp(version, this.operator, this.semver, this.options)\n  }\n\n  intersects (comp, options) {\n    if (!(comp instanceof Comparator)) {\n      throw new TypeError('a Comparator is required')\n    }\n\n    if (!options || typeof options !== 'object') {\n      options = {\n        loose: !!options,\n        includePrerelease: false\n      }\n    }\n\n    if (this.operator === '') {\n      if (this.value === '') {\n        return true\n      }\n      return new Range(comp.value, options).test(this.value)\n    } else if (comp.operator === '') {\n      if (comp.value === '') {\n        return true\n      }\n      return new Range(this.value, options).test(comp.semver)\n    }\n\n    const sameDirectionIncreasing =\n      (this.operator === '>=' || this.operator === '>') &&\n      (comp.operator === '>=' || comp.operator === '>')\n    const sameDirectionDecreasing =\n      (this.operator === '<=' || this.operator === '<') &&\n      (comp.operator === '<=' || comp.operator === '<')\n    const sameSemVer = this.semver.version === comp.semver.version\n    const differentDirectionsInclusive =\n      (this.operator === '>=' || this.operator === '<=') &&\n      (comp.operator === '>=' || comp.operator === '<=')\n    const oppositeDirectionsLessThan =\n      cmp(this.semver, '<', comp.semver, options) &&\n      (this.operator === '>=' || this.operator === '>') &&\n        (comp.operator === '<=' || comp.operator === '<')\n    const oppositeDirectionsGreaterThan =\n      cmp(this.semver, '>', comp.semver, options) &&\n      (this.operator === '<=' || this.operator === '<') &&\n        (comp.operator === '>=' || comp.operator === '>')\n\n    return (\n      sameDirectionIncreasing ||\n      sameDirectionDecreasing ||\n      (sameSemVer && differentDirectionsInclusive) ||\n      oppositeDirectionsLessThan ||\n      oppositeDirectionsGreaterThan\n    )\n  }\n}\n\nmodule.exports = Comparator\n\nconst {re, t} = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\nconst cmp = __webpack_require__(/*! ../functions/cmp */ \"./node_modules/semver/functions/cmp.js\")\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst SemVer = __webpack_require__(/*! ./semver */ \"./node_modules/semver/classes/semver.js\")\nconst Range = __webpack_require__(/*! ./range */ \"./node_modules/semver/classes/range.js\")\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/range.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/classes/range.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n// hoisted class for cyclic dependency\nclass Range {\n  constructor (range, options) {\n    if (!options || typeof options !== 'object') {\n      options = {\n        loose: !!options,\n        includePrerelease: false\n      }\n    }\n\n    if (range instanceof Range) {\n      if (\n        range.loose === !!options.loose &&\n        range.includePrerelease === !!options.includePrerelease\n      ) {\n        return range\n      } else {\n        return new Range(range.raw, options)\n      }\n    }\n\n    if (range instanceof Comparator) {\n      // just put it in the set and return\n      this.raw = range.value\n      this.set = [[range]]\n      this.format()\n      return this\n    }\n\n    this.options = options\n    this.loose = !!options.loose\n    this.includePrerelease = !!options.includePrerelease\n\n    // First, split based on boolean or ||\n    this.raw = range\n    this.set = range\n      .split(/\\s*\\|\\|\\s*/)\n      // map the range to a 2d array of comparators\n      .map(range => this.parseRange(range.trim()))\n      // throw out any comparator lists that are empty\n      // this generally means that it was not a valid range, which is allowed\n      // in loose mode, but will still throw if the WHOLE range is invalid.\n      .filter(c => c.length)\n\n    if (!this.set.length) {\n      throw new TypeError(`Invalid SemVer Range: ${range}`)\n    }\n\n    this.format()\n  }\n\n  format () {\n    this.range = this.set\n      .map((comps) => {\n        return comps.join(' ').trim()\n      })\n      .join('||')\n      .trim()\n    return this.range\n  }\n\n  toString () {\n    return this.range\n  }\n\n  parseRange (range) {\n    const loose = this.options.loose\n    range = range.trim()\n    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n    debug('hyphen replace', range)\n    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n    debug('comparator trim', range, re[t.COMPARATORTRIM])\n\n    // `~ 1.2.3` => `~1.2.3`\n    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n\n    // `^ 1.2.3` => `^1.2.3`\n    range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n\n    // normalize spaces\n    range = range.split(/\\s+/).join(' ')\n\n    // At this point, the range is completely trimmed and\n    // ready to be split into comparators.\n\n    const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n    return range\n      .split(' ')\n      .map(comp => parseComparator(comp, this.options))\n      .join(' ')\n      .split(/\\s+/)\n      .map(comp => replaceGTE0(comp, this.options))\n      // in loose mode, throw out any that are not valid comparators\n      .filter(this.options.loose ? comp => !!comp.match(compRe) : () => true)\n      .map(comp => new Comparator(comp, this.options))\n  }\n\n  intersects (range, options) {\n    if (!(range instanceof Range)) {\n      throw new TypeError('a Range is required')\n    }\n\n    return this.set.some((thisComparators) => {\n      return (\n        isSatisfiable(thisComparators, options) &&\n        range.set.some((rangeComparators) => {\n          return (\n            isSatisfiable(rangeComparators, options) &&\n            thisComparators.every((thisComparator) => {\n              return rangeComparators.every((rangeComparator) => {\n                return thisComparator.intersects(rangeComparator, options)\n              })\n            })\n          )\n        })\n      )\n    })\n  }\n\n  // if ANY of the sets match ALL of its comparators, then pass\n  test (version) {\n    if (!version) {\n      return false\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    for (let i = 0; i < this.set.length; i++) {\n      if (testSet(this.set[i], version, this.options)) {\n        return true\n      }\n    }\n    return false\n  }\n}\nmodule.exports = Range\n\nconst Comparator = __webpack_require__(/*! ./comparator */ \"./node_modules/semver/classes/comparator.js\")\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst SemVer = __webpack_require__(/*! ./semver */ \"./node_modules/semver/classes/semver.js\")\nconst {\n  re,\n  t,\n  comparatorTrimReplace,\n  tildeTrimReplace,\n  caretTrimReplace\n} = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n  let result = true\n  const remainingComparators = comparators.slice()\n  let testComparator = remainingComparators.pop()\n\n  while (result && remainingComparators.length) {\n    result = remainingComparators.every((otherComparator) => {\n      return testComparator.intersects(otherComparator, options)\n    })\n\n    testComparator = remainingComparators.pop()\n  }\n\n  return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n  debug('comp', comp, options)\n  comp = replaceCarets(comp, options)\n  debug('caret', comp)\n  comp = replaceTildes(comp, options)\n  debug('tildes', comp)\n  comp = replaceXRanges(comp, options)\n  debug('xrange', comp)\n  comp = replaceStars(comp, options)\n  debug('stars', comp)\n  return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\nconst replaceTildes = (comp, options) =>\n  comp.trim().split(/\\s+/).map((comp) => {\n    return replaceTilde(comp, options)\n  }).join(' ')\n\nconst replaceTilde = (comp, options) => {\n  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('tilde', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      // ~1.2 == >=1.2.0 <1.3.0-0\n      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n    } else if (pr) {\n      debug('replaceTilde pr', pr)\n      ret = `>=${M}.${m}.${p}-${pr\n      } <${M}.${+m + 1}.0-0`\n    } else {\n      // ~1.2.3 == >=1.2.3 <1.3.0-0\n      ret = `>=${M}.${m}.${p\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('tilde return', ret)\n    return ret\n  })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\nconst replaceCarets = (comp, options) =>\n  comp.trim().split(/\\s+/).map((comp) => {\n    return replaceCaret(comp, options)\n  }).join(' ')\n\nconst replaceCaret = (comp, options) => {\n  debug('caret', comp, options)\n  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n  const z = options.includePrerelease ? '-0' : ''\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('caret', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      if (M === '0') {\n        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n      } else {\n        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n      }\n    } else if (pr) {\n      debug('replaceCaret pr', pr)\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p}-${pr\n        } <${+M + 1}.0.0-0`\n      }\n    } else {\n      debug('no pr')\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p\n        } <${+M + 1}.0.0-0`\n      }\n    }\n\n    debug('caret return', ret)\n    return ret\n  })\n}\n\nconst replaceXRanges = (comp, options) => {\n  debug('replaceXRanges', comp, options)\n  return comp.split(/\\s+/).map((comp) => {\n    return replaceXRange(comp, options)\n  }).join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n  comp = comp.trim()\n  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n    debug('xRange', comp, ret, gtlt, M, m, p, pr)\n    const xM = isX(M)\n    const xm = xM || isX(m)\n    const xp = xm || isX(p)\n    const anyX = xp\n\n    if (gtlt === '=' && anyX) {\n      gtlt = ''\n    }\n\n    // if we're including prereleases in the match, then we need\n    // to fix this to -0, the lowest possible prerelease value\n    pr = options.includePrerelease ? '-0' : ''\n\n    if (xM) {\n      if (gtlt === '>' || gtlt === '<') {\n        // nothing is allowed\n        ret = '<0.0.0-0'\n      } else {\n        // nothing is forbidden\n        ret = '*'\n      }\n    } else if (gtlt && anyX) {\n      // we know patch is an x, because we have any x at all.\n      // replace X with 0\n      if (xm) {\n        m = 0\n      }\n      p = 0\n\n      if (gtlt === '>') {\n        // >1 => >=2.0.0\n        // >1.2 => >=1.3.0\n        gtlt = '>='\n        if (xm) {\n          M = +M + 1\n          m = 0\n          p = 0\n        } else {\n          m = +m + 1\n          p = 0\n        }\n      } else if (gtlt === '<=') {\n        // <=0.7.x is actually <0.8.0, since any 0.7.x should\n        // pass.  Similarly, <=7.x is actually <8.0.0, etc.\n        gtlt = '<'\n        if (xm) {\n          M = +M + 1\n        } else {\n          m = +m + 1\n        }\n      }\n\n      if (gtlt === '<')\n        pr = '-0'\n\n      ret = `${gtlt + M}.${m}.${p}${pr}`\n    } else if (xm) {\n      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n    } else if (xp) {\n      ret = `>=${M}.${m}.0${pr\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('xRange return', ret)\n\n    return ret\n  })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n  debug('replaceStars', comp, options)\n  // Looseness is ignored here.  star is always as loose as it gets!\n  return comp.trim().replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n  debug('replaceGTE0', comp, options)\n  return comp.trim()\n    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\nconst hyphenReplace = incPr => ($0,\n  from, fM, fm, fp, fpr, fb,\n  to, tM, tm, tp, tpr, tb) => {\n  if (isX(fM)) {\n    from = ''\n  } else if (isX(fm)) {\n    from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n  } else if (isX(fp)) {\n    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n  } else if (fpr) {\n    from = `>=${from}`\n  } else {\n    from = `>=${from}${incPr ? '-0' : ''}`\n  }\n\n  if (isX(tM)) {\n    to = ''\n  } else if (isX(tm)) {\n    to = `<${+tM + 1}.0.0-0`\n  } else if (isX(tp)) {\n    to = `<${tM}.${+tm + 1}.0-0`\n  } else if (tpr) {\n    to = `<=${tM}.${tm}.${tp}-${tpr}`\n  } else if (incPr) {\n    to = `<${tM}.${tm}.${+tp + 1}-0`\n  } else {\n    to = `<=${to}`\n  }\n\n  return (`${from} ${to}`).trim()\n}\n\nconst testSet = (set, version, options) => {\n  for (let i = 0; i < set.length; i++) {\n    if (!set[i].test(version)) {\n      return false\n    }\n  }\n\n  if (version.prerelease.length && !options.includePrerelease) {\n    // Find the set of versions that are allowed to have prereleases\n    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n    // That should allow `1.2.3-pr.2` to pass.\n    // However, `1.2.4-alpha.notready` should NOT be allowed,\n    // even though it's within the range set by the comparators.\n    for (let i = 0; i < set.length; i++) {\n      debug(set[i].semver)\n      if (set[i].semver === Comparator.ANY) {\n        continue\n      }\n\n      if (set[i].semver.prerelease.length > 0) {\n        const allowed = set[i].semver\n        if (allowed.major === version.major &&\n            allowed.minor === version.minor &&\n            allowed.patch === version.patch) {\n          return true\n        }\n      }\n    }\n\n    // Version has a -pre, but it's not one of the ones we like.\n    return false\n  }\n\n  return true\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/semver.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/semver/classes/semver.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(/*! ../internal/constants */ \"./node_modules/semver/internal/constants.js\")\nconst { re, t } = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\n\nconst { compareIdentifiers } = __webpack_require__(/*! ../internal/identifiers */ \"./node_modules/semver/internal/identifiers.js\")\nclass SemVer {\n  constructor (version, options) {\n    if (!options || typeof options !== 'object') {\n      options = {\n        loose: !!options,\n        includePrerelease: false\n      }\n    }\n    if (version instanceof SemVer) {\n      if (version.loose === !!options.loose &&\n          version.includePrerelease === !!options.includePrerelease) {\n        return version\n      } else {\n        version = version.version\n      }\n    } else if (typeof version !== 'string') {\n      throw new TypeError(`Invalid Version: ${version}`)\n    }\n\n    if (version.length > MAX_LENGTH) {\n      throw new TypeError(\n        `version is longer than ${MAX_LENGTH} characters`\n      )\n    }\n\n    debug('SemVer', version, options)\n    this.options = options\n    this.loose = !!options.loose\n    // this isn't actually relevant for versions, but keep it so that we\n    // don't run into trouble passing this.options around.\n    this.includePrerelease = !!options.includePrerelease\n\n    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n    if (!m) {\n      throw new TypeError(`Invalid Version: ${version}`)\n    }\n\n    this.raw = version\n\n    // these are actually numbers\n    this.major = +m[1]\n    this.minor = +m[2]\n    this.patch = +m[3]\n\n    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n      throw new TypeError('Invalid major version')\n    }\n\n    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n      throw new TypeError('Invalid minor version')\n    }\n\n    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n      throw new TypeError('Invalid patch version')\n    }\n\n    // numberify any prerelease numeric ids\n    if (!m[4]) {\n      this.prerelease = []\n    } else {\n      this.prerelease = m[4].split('.').map((id) => {\n        if (/^[0-9]+$/.test(id)) {\n          const num = +id\n          if (num >= 0 && num < MAX_SAFE_INTEGER) {\n            return num\n          }\n        }\n        return id\n      })\n    }\n\n    this.build = m[5] ? m[5].split('.') : []\n    this.format()\n  }\n\n  format () {\n    this.version = `${this.major}.${this.minor}.${this.patch}`\n    if (this.prerelease.length) {\n      this.version += `-${this.prerelease.join('.')}`\n    }\n    return this.version\n  }\n\n  toString () {\n    return this.version\n  }\n\n  compare (other) {\n    debug('SemVer.compare', this.version, this.options, other)\n    if (!(other instanceof SemVer)) {\n      if (typeof other === 'string' && other === this.version) {\n        return 0\n      }\n      other = new SemVer(other, this.options)\n    }\n\n    if (other.version === this.version) {\n      return 0\n    }\n\n    return this.compareMain(other) || this.comparePre(other)\n  }\n\n  compareMain (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    return (\n      compareIdentifiers(this.major, other.major) ||\n      compareIdentifiers(this.minor, other.minor) ||\n      compareIdentifiers(this.patch, other.patch)\n    )\n  }\n\n  comparePre (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    // NOT having a prerelease is > having one\n    if (this.prerelease.length && !other.prerelease.length) {\n      return -1\n    } else if (!this.prerelease.length && other.prerelease.length) {\n      return 1\n    } else if (!this.prerelease.length && !other.prerelease.length) {\n      return 0\n    }\n\n    let i = 0\n    do {\n      const a = this.prerelease[i]\n      const b = other.prerelease[i]\n      debug('prerelease compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  compareBuild (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    let i = 0\n    do {\n      const a = this.build[i]\n      const b = other.build[i]\n      debug('prerelease compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  // preminor will bump the version up to the next minor release, and immediately\n  // down to pre-release. premajor and prepatch work the same way.\n  inc (release, identifier) {\n    switch (release) {\n      case 'premajor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor = 0\n        this.major++\n        this.inc('pre', identifier)\n        break\n      case 'preminor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor++\n        this.inc('pre', identifier)\n        break\n      case 'prepatch':\n        // If this is already a prerelease, it will bump to the next version\n        // drop any prereleases that might already exist, since they are not\n        // relevant at this point.\n        this.prerelease.length = 0\n        this.inc('patch', identifier)\n        this.inc('pre', identifier)\n        break\n      // If the input is a non-prerelease version, this acts the same as\n      // prepatch.\n      case 'prerelease':\n        if (this.prerelease.length === 0) {\n          this.inc('patch', identifier)\n        }\n        this.inc('pre', identifier)\n        break\n\n      case 'major':\n        // If this is a pre-major version, bump up to the same major version.\n        // Otherwise increment major.\n        // 1.0.0-5 bumps to 1.0.0\n        // 1.1.0 bumps to 2.0.0\n        if (\n          this.minor !== 0 ||\n          this.patch !== 0 ||\n          this.prerelease.length === 0\n        ) {\n          this.major++\n        }\n        this.minor = 0\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'minor':\n        // If this is a pre-minor version, bump up to the same minor version.\n        // Otherwise increment minor.\n        // 1.2.0-5 bumps to 1.2.0\n        // 1.2.1 bumps to 1.3.0\n        if (this.patch !== 0 || this.prerelease.length === 0) {\n          this.minor++\n        }\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'patch':\n        // If this is not a pre-release version, it will increment the patch.\n        // If it is a pre-release it will bump up to the same patch version.\n        // 1.2.0-5 patches to 1.2.0\n        // 1.2.0 patches to 1.2.1\n        if (this.prerelease.length === 0) {\n          this.patch++\n        }\n        this.prerelease = []\n        break\n      // This probably shouldn't be used publicly.\n      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n      case 'pre':\n        if (this.prerelease.length === 0) {\n          this.prerelease = [0]\n        } else {\n          let i = this.prerelease.length\n          while (--i >= 0) {\n            if (typeof this.prerelease[i] === 'number') {\n              this.prerelease[i]++\n              i = -2\n            }\n          }\n          if (i === -1) {\n            // didn't increment anything\n            this.prerelease.push(0)\n          }\n        }\n        if (identifier) {\n          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n          if (this.prerelease[0] === identifier) {\n            if (isNaN(this.prerelease[1])) {\n              this.prerelease = [identifier, 0]\n            }\n          } else {\n            this.prerelease = [identifier, 0]\n          }\n        }\n        break\n\n      default:\n        throw new Error(`invalid increment argument: ${release}`)\n    }\n    this.format()\n    this.raw = this.version\n    return this\n  }\n}\n\nmodule.exports = SemVer\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/cmp.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/cmp.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst eq = __webpack_require__(/*! ./eq */ \"./node_modules/semver/functions/eq.js\")\nconst neq = __webpack_require__(/*! ./neq */ \"./node_modules/semver/functions/neq.js\")\nconst gt = __webpack_require__(/*! ./gt */ \"./node_modules/semver/functions/gt.js\")\nconst gte = __webpack_require__(/*! ./gte */ \"./node_modules/semver/functions/gte.js\")\nconst lt = __webpack_require__(/*! ./lt */ \"./node_modules/semver/functions/lt.js\")\nconst lte = __webpack_require__(/*! ./lte */ \"./node_modules/semver/functions/lte.js\")\n\nconst cmp = (a, op, b, loose) => {\n  switch (op) {\n    case '===':\n      if (typeof a === 'object')\n        a = a.version\n      if (typeof b === 'object')\n        b = b.version\n      return a === b\n\n    case '!==':\n      if (typeof a === 'object')\n        a = a.version\n      if (typeof b === 'object')\n        b = b.version\n      return a !== b\n\n    case '':\n    case '=':\n    case '==':\n      return eq(a, b, loose)\n\n    case '!=':\n      return neq(a, b, loose)\n\n    case '>':\n      return gt(a, b, loose)\n\n    case '>=':\n      return gte(a, b, loose)\n\n    case '<':\n      return lt(a, b, loose)\n\n    case '<=':\n      return lte(a, b, loose)\n\n    default:\n      throw new TypeError(`Invalid operator: ${op}`)\n  }\n}\nmodule.exports = cmp\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/coerce.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/semver/functions/coerce.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\nconst parse = __webpack_require__(/*! ./parse */ \"./node_modules/semver/functions/parse.js\")\nconst {re, t} = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\n\nconst coerce = (version, options) => {\n  if (version instanceof SemVer) {\n    return version\n  }\n\n  if (typeof version === 'number') {\n    version = String(version)\n  }\n\n  if (typeof version !== 'string') {\n    return null\n  }\n\n  options = options || {}\n\n  let match = null\n  if (!options.rtl) {\n    match = version.match(re[t.COERCE])\n  } else {\n    // Find the right-most coercible string that does not share\n    // a terminus with a more left-ward coercible string.\n    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n    //\n    // Walk through the string checking with a /g regexp\n    // Manually set the index so as to pick up overlapping matches.\n    // Stop when we get a match that ends at the string end, since no\n    // coercible string can be more right-ward without the same terminus.\n    let next\n    while ((next = re[t.COERCERTL].exec(version)) &&\n        (!match || match.index + match[0].length !== version.length)\n    ) {\n      if (!match ||\n            next.index + next[0].length !== match.index + match[0].length) {\n        match = next\n      }\n      re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length\n    }\n    // leave it in a clean state\n    re[t.COERCERTL].lastIndex = -1\n  }\n\n  if (match === null)\n    return null\n\n  return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)\n}\nmodule.exports = coerce\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/compare.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/semver/functions/compare.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\nconst compare = (a, b, loose) =>\n  new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/eq.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/eq.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/gt.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/gt.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/gte.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/gte.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/lt.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/lt.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/lte.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/lte.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/neq.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/neq.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/parse.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/semver/functions/parse.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst {MAX_LENGTH} = __webpack_require__(/*! ../internal/constants */ \"./node_modules/semver/internal/constants.js\")\nconst { re, t } = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\n\nconst parse = (version, options) => {\n  if (!options || typeof options !== 'object') {\n    options = {\n      loose: !!options,\n      includePrerelease: false\n    }\n  }\n\n  if (version instanceof SemVer) {\n    return version\n  }\n\n  if (typeof version !== 'string') {\n    return null\n  }\n\n  if (version.length > MAX_LENGTH) {\n    return null\n  }\n\n  const r = options.loose ? re[t.LOOSE] : re[t.FULL]\n  if (!r.test(version)) {\n    return null\n  }\n\n  try {\n    return new SemVer(version, options)\n  } catch (er) {\n    return null\n  }\n}\n\nmodule.exports = parse\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/satisfies.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/semver/functions/satisfies.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nconst Range = __webpack_require__(/*! ../classes/range */ \"./node_modules/semver/classes/range.js\")\nconst satisfies = (version, range, options) => {\n  try {\n    range = new Range(range, options)\n  } catch (er) {\n    return false\n  }\n  return range.test(version)\n}\nmodule.exports = satisfies\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/constants.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/semver/internal/constants.js ***!\n  \\***************************************************/\n/***/ ((module) => {\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n  /* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\nmodule.exports = {\n  SEMVER_SPEC_VERSION,\n  MAX_LENGTH,\n  MAX_SAFE_INTEGER,\n  MAX_SAFE_COMPONENT_LENGTH\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/debug.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/semver/internal/debug.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\nconst debug = (\n  typeof process === 'object' &&\n  process.env &&\n  process.env.NODE_DEBUG &&\n  /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n  : () => {}\n\nmodule.exports = debug\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/identifiers.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/semver/internal/identifiers.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n  const anum = numeric.test(a)\n  const bnum = numeric.test(b)\n\n  if (anum && bnum) {\n    a = +a\n    b = +b\n  }\n\n  return a === b ? 0\n    : (anum && !bnum) ? -1\n    : (bnum && !anum) ? 1\n    : a < b ? -1\n    : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n  compareIdentifiers,\n  rcompareIdentifiers\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/re.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/semver/internal/re.js ***!\n  \\********************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\nconst { MAX_SAFE_COMPONENT_LENGTH } = __webpack_require__(/*! ./constants */ \"./node_modules/semver/internal/constants.js\")\nconst debug = __webpack_require__(/*! ./debug */ \"./node_modules/semver/internal/debug.js\")\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst createToken = (name, value, isGlobal) => {\n  const index = R++\n  debug(index, value)\n  t[name] = index\n  src[index] = value\n  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*')\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups.  The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:${src[t.PRERELEASE]})?${\n                     src[t.BUILD]}?` +\n                   `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:${src[t.PRERELEASELOOSE]})?${\n                          src[t.BUILD]}?` +\n                        `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n              '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n              `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s+-\\\\s+` +\n                   `(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s+-\\\\s+` +\n                        `(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\.0\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\.0\\.0-0\\\\s*$')\n\n\n/***/ }),\n\n/***/ \"./package.json\":\n/*!**********************!*\\\n  !*** ./package.json ***!\n  \\**********************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = /*#__PURE__*/JSON.parse('{\"name\":\"animation_utils\",\"version\":\"4.1.3\",\"private\":true,\"description\":\"GeckoLib (Legacy)\",\"main\":\"index.js\",\"scripts\":{\"prebuild\":\"npm run test\",\"build\":\"npm run build:only\",\"build:only\":\"webpack && npm run update_manifest\",\"update_manifest\":\"node scripts/updateManifest.mjs\",\"start\":\"webpack --watch --mode=development\",\"lint\":\"eslint .\",\"lint:fix\":\"eslint --fix .\",\"tsc\":\"tsc --noEmit\",\"pretest\":\"npm run lint && npm run tsc\",\"test\":\"npm run test:only\",\"test:only\":\"jest\"},\"author\":\"Eliot Lash, Tslat, Gecko, McHorse\",\"license\":\"MIT\",\"blockbenchConfig\":{\"title\":\"GeckoLib Animation Utils\",\"author\":\"Eliot Lash, Tslat, Gecko, McHorse\",\"icon\":\"icon.png\",\"description\":\"Replaced by new plugin for Blockbench 5.0+ - Install \\'GeckoLib Models and Animations\\'\",\"deprecation_note\":\"This plugin has been discontinued in favour of the \\\\\"GeckoLib Models and Animations\\\\\" plugin. This plugin will continue to work on Blockbench 4 and below. For Blockbench 5+, use \\'GeckoLib\\' instead.\",\"has_changelog\":true,\"min_version\":\"4.12.0\",\"max_version\":\"5.0.0\",\"variant\":\"both\",\"website\":\"https://github.com/bernie-g/geckolib/wiki\",\"repository\":\"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/animation_utils\",\"bug_tracker\":\"https://github.com/bernie-g/geckolib/issues\"},\"sideEffects\":[\"./index.js\"],\"devDependencies\":{\"@types/jest\":\"^29.5.4\",\"@types/lodash\":\"^4.14.197\",\"@typescript-eslint/eslint-plugin\":\"^6.5.0\",\"@typescript-eslint/parser\":\"^6.5.0\",\"blockbench-types\":\"^4.9.0\",\"eol\":\"0.9.1\",\"eslint\":\"^7.7.0\",\"indent-string\":\"^5.0.0\",\"jest\":\"^29.6.4\",\"ts-jest\":\"^29.1.1\",\"ts-loader\":\"^9.4.4\",\"typescript\":\"^4.9.5\",\"webpack\":\"^5.88.2\",\"webpack-cli\":\"^5.1.4\",\"css-loader\":\"^6.7.1\",\"to-string-loader\":\"^1.2.0\"},\"dependencies\":{\"lodash\":\"^4.17.21\",\"semver\":\"7.3.2\"}}');\n\n/***/ }),\n\n/***/ \"./resources/armorTemplate.json\":\n/*!**************************************!*\\\n  !*** ./resources/armorTemplate.json ***!\n  \\**************************************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = /*#__PURE__*/JSON.parse('{\"meta\":{\"format_version\":\"3.2\",\"model_format\":\"animated_entity_model\",\"box_uv\":true},\"name\":\"CustomArmor\",\"geo_name\":\"CustomArmor\",\"resolution\":{\"width\":64,\"height\":64},\"elements\":[{\"name\":\"dontTouch\",\"from\":[-4,24,-4],\"to\":[4,32,4],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,0,0],\"uuid\":\"9675593e-b27d-b70e-e1ea-1fc29f46a294\"},{\"name\":\"dontTouch\",\"from\":[-4,12,-2],\"to\":[4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,24,0],\"uuid\":\"fa43156a-2a62-948c-082f-483d525f6d1f\"},{\"name\":\"dontTouch\",\"from\":[4,12,-2],\"to\":[8,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"},{\"name\":\"dontTouch\",\"from\":[-8,12,-2],\"to\":[-4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"bf2c2539-20e3-cfcc-94c0-491734019889\"},{\"name\":\"dontTouch\",\"from\":[-4,0,-2],\"to\":[0,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"17b9bae0-356a-9bba-fad9-4672e2671191\"},{\"name\":\"dontTouch\",\"from\":[0,0,-2],\"to\":[4,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"}],\"outliner\":[{\"name\":\"bipedHead\",\"uuid\":\"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"9675593e-b27d-b70e-e1ea-1fc29f46a294\",{\"name\":\"armorHead\",\"uuid\":\"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedBody\",\"uuid\":\"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"fa43156a-2a62-948c-082f-483d525f6d1f\",{\"name\":\"armorBody\",\"uuid\":\"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedRightArm\",\"uuid\":\"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",{\"name\":\"armorRightArm\",\"uuid\":\"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[]}]},{\"name\":\"bipedLeftArm\",\"uuid\":\"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[\"bf2c2539-20e3-cfcc-94c0-491734019889\",{\"name\":\"armorLeftArm\",\"uuid\":\"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[]}]},{\"name\":\"bipedLeftLeg\",\"uuid\":\"37231be7-a8ef-22ca-7fea-40aed58003bb\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[\"17b9bae0-356a-9bba-fad9-4672e2671191\",{\"name\":\"armorLeftLeg\",\"uuid\":\"e4b19746-2d17-1f56-befe-00718165ae50\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]},{\"name\":\"armorLeftBoot\",\"uuid\":\"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]}]},{\"name\":\"bipedRightLeg\",\"uuid\":\"45c031a5-b6be-e0a7-5454-b45d07f28429\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",{\"name\":\"armorRightLeg\",\"uuid\":\"60238f18-e74b-c863-cb45-2e2f162221bd\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]},{\"name\":\"armorRightBoot\",\"uuid\":\"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]}]}],\"textures\":[]}');\n\n/***/ }),\n\n/***/ \"./resources/easing_keyframes.css\":\n/*!****************************************!*\\\n  !*** ./resources/easing_keyframes.css ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n        var result = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./easing_keyframes.css */ \"./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css\");\n\n        if (result && result.__esModule) {\n            result = result.default;\n        }\n\n        if (typeof result === \"string\") {\n            module.exports = result;\n        } else {\n            module.exports = result.toString();\n        }\n    \n\n/***/ }),\n\n/***/ \"./ts/animationUi.ts\":\n/*!***************************!*\\\n  !*** ./ts/animationUi.ts ***!\n  \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   displayAnimationFrameCallback: () => (/* binding */ displayAnimationFrameCallback),\n/* harmony export */   loadAnimationUI: () => (/* binding */ loadAnimationUI),\n/* harmony export */   renderFrameCallback: () => (/* binding */ renderFrameCallback),\n/* harmony export */   unloadAnimationUI: () => (/* binding */ unloadAnimationUI),\n/* harmony export */   updateKeyframeEasing: () => (/* binding */ updateKeyframeEasing),\n/* harmony export */   updateKeyframeEasingArg: () => (/* binding */ updateKeyframeEasingArg),\n/* harmony export */   updateKeyframeSelectionCallback: () => (/* binding */ updateKeyframeSelectionCallback)\n/* harmony export */ });\n/* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/uniq */ \"./node_modules/lodash/uniq.js\");\n/* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_uniq__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./easing */ \"./ts/easing.ts\");\n\n\n\nconst easingRegExp = /^ease(InOut|In|Out)?([\\w]+)$/;\nconst loadAnimationUI = () => {\n    Blockbench.on('display_animation_frame', displayAnimationFrameCallback);\n    Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback);\n    Blockbench.on('render_frame', renderFrameCallback);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, \"updateKeyframeEasing\", updateKeyframeEasing);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, \"updateKeyframeEasingArg\", updateKeyframeEasingArg);\n};\nconst unloadAnimationUI = () => {\n    Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback);\n    Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback);\n    Blockbench.removeListener('render_frame', renderFrameCallback);\n};\nconst displayAnimationFrameCallback = ( /*...args*/) => {\n    // const keyframe = $('#keyframe');\n    // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here\n};\nfunction renderFrameCallback() {\n    if (Format.id !== \"animated_entity_model\")\n        return;\n    Timeline.keyframes.forEach((kf) => {\n        if (kf.interpolation != \"linear\" && kf.easing != undefined) {\n            kf.easing = undefined;\n            kf.easingArgs = undefined;\n            window.updateKeyframeSelection();\n        }\n        if (kf.interpolation === \"step\") {\n            kf.interpolation = \"linear\";\n            if (kf.data_points.length == 1)\n                addDataPoint();\n            window.updateKeyframeSelection();\n        }\n        updateKeyframeIcon(kf);\n    });\n    const addPrePostButton = document.querySelector('#keyframe_type_label > div');\n    if (addPrePostButton)\n        addPrePostButton.hidden = true;\n}\nfunction updateKeyframeEasing(value) {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    // var axis = $(obj).attr('axis');\n    // const value = $(obj).val();\n    // console.log('updateKeyframeEasing value:', value, 'obj:', obj); \n    if (value === \"-\")\n        return;\n    Timeline.selected.forEach((kf) => {\n        kf.easing = value;\n        kf.easingArgs = undefined;\n        kf.interpolation = 'linear';\n    });\n    window.updateKeyframeSelection(); // Ensure easingArg display is updated\n    // Animator.preview();\n    Undo.finishEdit('edit keyframe easing');\n}\nfunction updateKeyframeEasingArg(obj) {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    if ($(obj).val() === \"-\")\n        return;\n    // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); \n    Timeline.selected.forEach((kf) => {\n        const value = (0,_easing__WEBPACK_IMPORTED_MODULE_2__.parseEasingArg)(kf, $(obj).val().trim());\n        kf.easingArgs = [value];\n        // obj.value = value;\n    });\n    Undo.finishEdit('edit keyframe easing argument');\n}\nconst updateKeyframeSelectionCallback = ( /*...args*/) => {\n    $('#keyframe_bar_easing').remove();\n    $('#keyframe_bar_easing_type').remove();\n    $('#keyframe_bar_easing_arg1').remove();\n    let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars\n    let channel = false;\n    Timeline.selected.forEach((kf) => {\n        if (channel === false) {\n            channel = kf.channel;\n        }\n        else if (channel !== kf.channel) {\n            multi_channel = true;\n        }\n    });\n    Timeline.keyframes.forEach((kf) => {\n        updateKeyframe(kf);\n    });\n    const getMultiSelectValue = (selector, defaultValue, conflictValue) => {\n        const selectorFunction = typeof selector === 'function'\n            ? selector\n            : x => (x[selector] === undefined ? defaultValue : x[selector]);\n        if (Timeline.selected.length > 1) {\n            const uniqSelected = lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected.map(selectorFunction));\n            if (uniqSelected.length === 1) {\n                return uniqSelected[0];\n            }\n            else {\n                return conflictValue;\n            }\n        }\n        else {\n            return selectorFunction(Timeline.selected[0]) || defaultValue;\n        }\n    };\n    const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => {\n        // Dear god I miss lodash\n        if (!acc.has(kf.animator))\n            acc.set(kf.animator, {});\n        const animatorChannels = acc.get(kf.animator);\n        if (!animatorChannels[kf.channel])\n            animatorChannels[kf.channel] = [];\n        animatorChannels[kf.channel].push(kf);\n        animatorChannels[kf.channel].sort((a, b) => {\n            if (a.time < b.time)\n                return -1;\n            if (a.time > b.time)\n                return 1;\n            return 0;\n        });\n        return acc;\n    }, new Map());\n    const isFirstInChannel = (kf) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1;\n    if (Timeline.selected.length && Format.id === \"animated_entity_model\") {\n        if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) {\n            const displayedEasing = getMultiSelectValue('easing', _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_DEFAULT, 'null');\n            const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => {\n                const easingTypeToTypeId = type => {\n                    let finalEasingType = \"In\";\n                    if (type === \"out\") {\n                        finalEasingType = \"Out\";\n                    }\n                    else if (type === \"inout\") {\n                        finalEasingType = \"InOut\";\n                    }\n                    return finalEasingType;\n                };\n                let finalEasing = 'ease';\n                if (inputEasingOrType === \"in\" || inputEasingOrType === \"out\" || inputEasingOrType === \"inout\") {\n                    const finalEasingType = easingTypeToTypeId(inputEasingOrType);\n                    finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1);\n                }\n                else if (inputEasingOrType === \"linear\" || inputEasingOrType == \"step\") {\n                    finalEasing = inputEasingOrType;\n                }\n                else {\n                    const finalEasingType = easingTypeToTypeId(easingType);\n                    finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1);\n                }\n                return finalEasing;\n            };\n            const addEasingTypeIcons = (bar, easingType, title) => {\n                const div = document.createElement(\"div\");\n                div.innerHTML = getIcon(easingType);\n                div.id = \"kf_easing_type_\" + easingType;\n                div.setAttribute(\"style\", \"stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px\");\n                div.setAttribute(\"title\", title);\n                div.onclick = () => {\n                    const selectedEasing = $(\".selected_kf_easing\");\n                    const selectedEasingType = $(\".selected_kf_easing_type\");\n                    const keySelectedEasing = selectedEasing.attr(\"id\").substring(15);\n                    const keySelectedEasingType = selectedEasingType.length <= 0 ? \"in\" : selectedEasingType.attr(\"id\").substring(15);\n                    const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing);\n                    const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType);\n                    if (finalEasing != currentEasing) {\n                        //   console.log(\"Changed from \" + currentEasing + \" to \" + finalEasing);\n                        updateKeyframeEasing(finalEasing);\n                    }\n                };\n                bar.appendChild(div);\n            };\n            const keyframe = document.getElementById('panel_keyframe');\n            let easingBar = document.createElement('div');\n            keyframe.appendChild(easingBar);\n            easingBar.outerHTML = `<div class=\"bar flex\" style=\"flex-wrap: wrap\" id=\"keyframe_bar_easing\">\n          <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Easing</label>\n        </div>`;\n            easingBar = document.getElementById('keyframe_bar_easing');\n            addEasingTypeIcons(easingBar, \"linear\", \"Switch to Linear easing\");\n            addEasingTypeIcons(easingBar, \"step\", \"Switch to Step easing\");\n            addEasingTypeIcons(easingBar, \"sine\", \"Switch to Sine easing\");\n            addEasingTypeIcons(easingBar, \"quad\", \"Switch to Quadratic easing\");\n            addEasingTypeIcons(easingBar, \"cubic\", \"Switch to Cubic easing\");\n            addEasingTypeIcons(easingBar, \"quart\", \"Switch to Quartic easing\");\n            addEasingTypeIcons(easingBar, \"quint\", \"Switch to Quntic easing\");\n            addEasingTypeIcons(easingBar, \"expo\", \"Switch to Exponential easing\");\n            addEasingTypeIcons(easingBar, \"circ\", \"Switch to Circle easing\");\n            addEasingTypeIcons(easingBar, \"back\", \"Switch to Back easing\");\n            addEasingTypeIcons(easingBar, \"elastic\", \"Switch to Elastic easing\");\n            addEasingTypeIcons(easingBar, \"bounce\", \"Switch to Bounce easing\");\n            const keyEasing = getEasingInterpolation(displayedEasing);\n            const keyEasingElement = document.getElementById(\"kf_easing_type_\" + keyEasing);\n            keyEasingElement.style.stroke = \"var(--color-accent)\";\n            keyEasingElement.classList.add('selected_kf_easing');\n            if (!(keyEasing === \"linear\" || keyEasing == \"step\")) {\n                let easingTypeBar = document.createElement('div');\n                keyframe.appendChild(easingTypeBar);\n                easingTypeBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_type\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Type</label>\n          </div>`;\n                easingTypeBar = document.getElementById('keyframe_bar_easing_type');\n                addEasingTypeIcons(easingTypeBar, \"in\", \"Switch to In easing type\");\n                addEasingTypeIcons(easingTypeBar, \"out\", \"Switch to Out easing type\");\n                addEasingTypeIcons(easingTypeBar, \"inout\", \"Switch to In/Out easing type\");\n                const keyEasingType = getEasingType(displayedEasing);\n                const keyEasingTypeElement = document.getElementById(\"kf_easing_type_\" + keyEasingType);\n                keyEasingTypeElement.style.stroke = \"var(--color-accent)\";\n                keyEasingTypeElement.classList.add('selected_kf_easing_type');\n            }\n            if (keyEasing !== \"linear\")\n                document.getElementById(\"panel_keyframe\").querySelector('div.tool.widget.bar_select bb-select').innerHTML = \"GeckoLib\";\n            const getEasingArgLabel = (kf) => {\n                switch (kf.easing) {\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBack:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBack:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBack:\n                        return 'Overshoot';\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInElastic:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutElastic:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutElastic:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBounce:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBounce:\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBounce:\n                        return 'Bounciness';\n                    case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.step:\n                        return 'Steps';\n                    default:\n                        return 'N/A';\n                }\n            };\n            const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null);\n            if (Timeline.selected.every((kf) => (0,_easing__WEBPACK_IMPORTED_MODULE_2__.isArgsEasing)(kf.easing)) && easingArgLabel !== null) {\n                const argDefault = getMultiSelectValue(_easing__WEBPACK_IMPORTED_MODULE_2__.getEasingArgDefault, null, null);\n                const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]);\n                let scaleBar = document.createElement('div');\n                keyframe.appendChild(scaleBar);\n                scaleBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_arg1\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 90px;\">${easingArgLabel}</label>\n            <input type=\"number\" id=\"keyframe_easing_scale\" class=\"dark_bordered code keyframe_input tab_target\" value=\"${displayedValue}\" oninput=\"updateKeyframeEasingArg(this)\" style=\"flex: 1; margin-right: 9px;\">\n          </div>`;\n                scaleBar = document.getElementById('keyframe_bar_easing_arg1');\n            }\n            // console.log('easingBar:', easingBar, 'keyframe:', keyframe);\n        }\n    }\n};\nconst getEasingInterpolation = (name) => {\n    const matches = name.match(easingRegExp);\n    if (matches) {\n        return matches[2].toLowerCase();\n    }\n    return name;\n};\nconst getEasingType = (name) => {\n    const matches = name.match(easingRegExp);\n    if (matches) {\n        return matches[1].toLowerCase();\n    }\n    return \"in\";\n};\nconst updateKeyframe = (kf) => {\n    if (kf.data_points.length != 1 && kf.interpolation !== \"linear\") {\n        removeLastDataPoint();\n    }\n};\nconst updateKeyframeIcon = (kf) => {\n    // @ts-expect-error This is needed because this plugin uses an outdated version of blockbench-types that doesn't have kf.uuid\n    const element = document.getElementById(kf.uuid);\n    if (element && element.children && kf.easing)\n        element.children[0].className = 'easing-' + kf.easing.split(/\\.?(?=[A-Z])/).join('_').toLowerCase().replace(\"ease_\", \"\");\n};\nconst addDataPoint = () => {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    Timeline.selected.forEach(kf => {\n        // @ts-expect-error needed because .channels doesn't exist in dev env\n        if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) {\n            kf.data_points.push(new KeyframeDataPoint(kf));\n            kf.data_points.last().extend(kf.data_points[0]);\n        }\n    });\n    Animator.preview();\n    Undo.finishEdit('Add keyframe data point');\n};\nconst removeLastDataPoint = () => {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    Timeline.selected.forEach(kf => {\n        if (kf.data_points.length >= 2) {\n            kf.data_points.remove(kf.data_points.last());\n        }\n    });\n    Animator.preview();\n    Undo.finishEdit('Remove keyframe data point');\n};\nconst getIcon = (name) => {\n    switch (name) {\n        case \"back\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.94165 c 3.17500003,0 4.23333333,2.91041 5.29166663,-4.7625\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"bounce\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0.26458333,-0.26458 0.52916673,-0.26458 0.79375003,0 0.5291666,-0.52916 0.5291666,-0.52916 1.0583333,0 0.79375,-2.11666 1.5875,-2.11666 2.38125,0 0.2645833,-4.23333 1.0583333,-5.29165 1.0583333,-5.29165\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"circ\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 5.8208333,295.67706 5.8208333,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"cubic\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"elastic\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.67706 c 0.79375003,0 0.79375003,-0.26458 1.32291663,-0.26458 0.5291667,0 0.79375,0.52917 1.3229167,0.52917 0.5291667,0 1.0094474,-1.83865 1.3229167,-0.79375 0.79375,2.64583 1.3229166,1.32292 1.3229166,-3.96874\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"expo\":\n        case \"in\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 4.23333333,0 5.29166663,-1.05833 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"inout\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 5.55625003,0 -0.26458334,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"out\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0,-4.23333 1.05833333,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quad\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.03123 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quart\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.17500003,0 4.23333333,-2.64583 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quint\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.43958333,0 4.23333333,-1.85208 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"sine\":\n            return '<svg width=\"24\" height=\"24\" viewBox=\"0 0 6.3499999 6.3500002\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 1.32291663,0 4.23333333,-3.43958 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"step\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 0,-1.32291 H 1.8520833 v -1.32292 H 3.175 v -1.32292 h 1.3229167 v -1.32291 l 1.3229166,1e-5\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        default: // linear\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.52916667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    }\n};\n\n\n/***/ }),\n\n/***/ \"./ts/codec.ts\":\n/*!*********************!*\\\n  !*** ./ts/codec.ts ***!\n  \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildDisplaySettingsJson: () => (/* binding */ buildDisplaySettingsJson),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   format: () => (/* binding */ format),\n/* harmony export */   openProjectSettingsDialog: () => (/* binding */ openProjectSettingsDialog)\n/* harmony export */ });\n/* harmony import */ var _resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../resources/armorTemplate.json */ \"./resources/armorTemplate.json\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\n\n\nconst codec = Codecs.bedrock;\n// This gets automatically applied by Blockbench, we don't need to do anything with it\nconst format = new ModelFormat({\n    id: _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID,\n    name: \"GeckoLib Animated Model\",\n    category: \"minecraft\",\n    description: \"Animated Model for Java mods using GeckoLib\",\n    icon: \"view_in_ar\",\n    rotate_cubes: true,\n    box_uv: true,\n    optional_box_uv: true,\n    single_texture: true,\n    bone_rig: true,\n    centered_grid: true,\n    animated_textures: true,\n    select_texture_for_particles: true,\n    animation_files: true,\n    locators: true,\n    codec: Codecs.project,\n    display_mode: false,\n    animation_mode: true,\n});\n// Override the new project panel to allow customisation\nformat.new = function () {\n    if (newProject(this))\n        return openProjectSettingsDialog();\n};\n/**\n * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item\n */\nfunction openProjectSettingsDialog() {\n    if (Project instanceof ModelProject)\n        return createProjectSettingsDialog(Project, createProjectSettingsForm(Project));\n}\n/**\n * Internal function for determining the placeholder value for the <code>model_identifier</code> form element in dialog windows\n */\nfunction getObjectIdPlaceholder(formResult) {\n    const name = formResult === null || formResult === void 0 ? void 0 : formResult['name'];\n    const modelType = formResult === null || formResult === void 0 ? void 0 : formResult[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE];\n    if (!name && !modelType)\n        return 'my_entity';\n    const invalidPathChar = new RegExp('[^_\\\\-/.a-z0-9]+', 'g');\n    const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g');\n    if (name)\n        return name.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidPathChar, \"\");\n    switch (_constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[modelType]) {\n        case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY: return 'my_entity';\n        case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.BLOCK: return 'my_block';\n        case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM: return 'my_item';\n        case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ARMOR: return 'my_armor';\n        case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.OBJECT: return 'my_object';\n        default: return 'my_entity';\n    }\n}\n/**\n * Create the Project Settings dialog form for use in both new projects and editing existing ones\n */\nfunction createProjectSettingsForm(Project) {\n    const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } };\n    const properties = ModelProject['properties'];\n    const modelType = properties[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE];\n    if (modelType) {\n        form[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] = {\n            label: modelType.label,\n            description: modelType.description,\n            default: _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY.toUpperCase(),\n            value: _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE].toUpperCase()].toUpperCase(),\n            placeholder: modelType.placeholder,\n            type: 'select',\n            options: typeof modelType.options == 'function' ? modelType.options() : modelType.options,\n        };\n    }\n    for (const key in properties) {\n        const property = properties[key];\n        if (property.exposed === false || !Condition(property.condition))\n            continue;\n        const entry = form[property.name] = {\n            label: property.label,\n            description: property.description,\n            value: Project[property.name],\n            placeholder: property.placeholder,\n            type: property.type\n        };\n        if (property.name === 'name') {\n            entry.label = 'Project Name';\n            entry.placeholder = 'My Project';\n            entry.description = 'The name of the Blockbench project';\n        }\n        else if (property.name === 'model_identifier') {\n            entry.label = 'Object ID';\n            entry.description = 'The registered id of the object this model represents, for exporting purposes';\n            entry.placeholder = getObjectIdPlaceholder();\n        }\n        switch (property.type) {\n            case 'boolean':\n                entry.type = 'checkbox';\n                break;\n            case 'string':\n                entry.type = 'text';\n                break;\n            default:\n                if (property.options) {\n                    entry['options'] = typeof property.options == 'function' ? property.options() : property.options;\n                    entry.type = 'select';\n                }\n                break;\n        }\n    }\n    if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name'])\n        delete form['name'];\n    form['uv_mode'] = {\n        label: 'dialog.project.default_uv_mode',\n        description: 'dialog.project.default_uv_mode.description',\n        type: 'select',\n        condition: Format.optional_box_uv,\n        options: {\n            face_uv: 'dialog.project.uv_mode.face_uv',\n            box_uv: 'dialog.project.uv_mode.box_uv',\n        },\n        value: Project.box_uv ? 'box_uv' : 'face_uv',\n    };\n    form['texture_size'] = {\n        label: 'dialog.project.texture_size',\n        type: 'vector',\n        dimensions: 2,\n        value: [Project.texture_width, Project.texture_height],\n        min: 1\n    };\n    return form;\n}\n/**\n * Create the 'new project' popup dialogue for GeckoLib projects.\n * <p>\n * The contents of this is mostly a copy of <code>project.js</code> \"project_window\" action declaration (Copyright Blockbench)<br>\n * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility\n * @return false if the user clicks <code>cancel</code>, otherwise true\n */\nfunction createProjectSettingsDialog(Project, form) {\n    const dialog = new Dialog({\n        id: 'project',\n        title: 'dialog.project.title',\n        width: 500,\n        form,\n        onConfirm: function (formResult) {\n            let save;\n            const box_uv = formResult['uv_mode'] == 'box_uv';\n            const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity);\n            const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity);\n            if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) {\n                // Adjust UV Mapping if resolution changed\n                if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) {\n                    save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true });\n                    Cube.all.forEach(cube => {\n                        for (const key in cube.faces) {\n                            const uv = cube.faces[key].uv;\n                            uv[0] *= texture_width / Project.texture_width;\n                            uv[2] *= texture_width / Project.texture_width;\n                            uv[1] *= texture_height / Project.texture_height;\n                            uv[3] *= texture_height / Project.texture_height;\n                        }\n                    });\n                    Mesh.all.forEach(mesh => {\n                        for (const key in mesh.faces) {\n                            const uv = mesh.faces[key].uv;\n                            for (const vkey in uv) {\n                                uv[vkey][0] *= texture_width / Project.texture_width;\n                                uv[vkey][1] *= texture_height / Project.texture_height;\n                            }\n                        }\n                    });\n                }\n                // Convert UV mode per element\n                if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) {\n                    if (!save)\n                        save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true });\n                    Cube.all.forEach(cube => cube.setUVMode(box_uv));\n                }\n                if (!save)\n                    save = Undo.initEdit({ uv_mode: true });\n                Project.texture_width = texture_width;\n                Project.texture_height = texture_height;\n                if (Format.optional_box_uv)\n                    Project.box_uv = box_uv;\n                Canvas.updateAllUVs();\n                updateSelection();\n            }\n            const properties = ModelProject['properties'];\n            for (const key in properties) {\n                properties[key].merge(Project, formResult);\n            }\n            Project.name = Project.name.trim();\n            Project.model_identifier = Project.model_identifier.trim();\n            if (save)\n                Undo.finishEdit('Change project UV settings');\n            Blockbench.dispatchEvent('update_project_settings', formResult);\n            BARS.updateConditions();\n            if (Project.EditSession) {\n                const metadata = {\n                    texture_width: Project.texture_width,\n                    texture_height: Project.texture_height,\n                    box_uv: Project.box_uv\n                };\n                for (const key in properties) {\n                    properties[key].copy(Project, metadata);\n                }\n                Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata));\n            }\n            const modelType = _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType[formResult[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE]];\n            Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] = modelType;\n            if (modelType == _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM)\n                Project.parent = 'builtin/entity';\n            if (Project.name === Format.name || Project.name === '')\n                Project.name = \"GeckoLib \" + Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE];\n            switch (modelType) {\n                case _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ARMOR:\n                    if (Outliner.root.length === 0) {\n                        Codecs.project.parse(_resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_1__, null);\n                    }\n                    else {\n                        alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.');\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n            }\n            Format.display_mode = modelType === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value;\n            dialog.hide();\n        },\n        onFormChange(formResult) {\n            try {\n                document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult);\n            } // eslint-disable-next-line no-empty\n            catch (ex) { }\n        },\n    });\n    dialog.show();\n    return true;\n}\n/**\n * Export the item display json\n * <p>\n * Only called for GeckoLib projects\n */\nfunction buildDisplaySettingsJson(options = {}) {\n    if (!Project)\n        return;\n    const modelProperties = {};\n    if (options['comment'] || settings.credit.value)\n        modelProperties.credit = settings.credit.value;\n    if (options['parent'] || Project.parent != '')\n        modelProperties.parent = Project.parent;\n    if (options['ambientocclusion'] || Project.ambientocclusion === false)\n        modelProperties.ambientocclusion = false;\n    if (Project.texture_width !== 16 || Project.texture_height !== 16)\n        modelProperties.texture_size = [Project.texture_width, Project.texture_height];\n    if (options['front_gui_light'] || Project.front_gui_light)\n        modelProperties.gui_light = 'front';\n    if (options['overrides'] || Project.overrides)\n        modelProperties.overrides = Project.overrides;\n    if (options['display'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(Project.display_settings)) {\n        const nonDefaultDisplays = {};\n        for (const slot in DisplayMode.slots) {\n            const perspective = DisplayMode.slots[slot];\n            // eslint-disable-next-line no-prototype-builtins\n            if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) {\n                const display = Project.display_settings[perspective].export();\n                if (display)\n                    nonDefaultDisplays[perspective] = display;\n            }\n        }\n        if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(nonDefaultDisplays))\n            modelProperties.display = nonDefaultDisplays;\n    }\n    if (options['textures'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isEmpty)(Project.textures)) {\n        for (const texture of Project.textures) {\n            if (texture.particle || (settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) {\n                let name = texture.name;\n                if (name.indexOf(\".png\") > 0)\n                    name = name.substring(0, name.indexOf(\".png\"));\n                if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isValidPath)(name)) {\n                    name = name.toLowerCase().replace(\" \", \"_\");\n                    if (!(0,_utils__WEBPACK_IMPORTED_MODULE_2__.isValidPath)(name))\n                        continue;\n                }\n                name = (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] == _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.BLOCK ? \"block/\" : \"item/\") + name;\n                if (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODID])\n                    name = Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODID] + \":\" + name;\n                modelProperties.textures = { 'particle': name };\n                break;\n            }\n        }\n    }\n    Blockbench.export({\n        resource_id: 'model',\n        type: Codecs.java_block.name,\n        extensions: ['json'],\n        name: Project.model_identifier ? (Project.model_identifier + \".json\") : codec.fileName().replace(\".geo\", \"\"),\n        startpath: Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display,\n        content: JSON.stringify(modelProperties, null, 2),\n    }, file_path => {\n        const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display;\n        Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display = settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n        if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_FILEPATH_CACHE].display)\n            Project.saved = false;\n    });\n    return this;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec);\n\n\n/***/ }),\n\n/***/ \"./ts/constants.ts\":\n/*!*************************!*\\\n  !*** ./ts/constants.ts ***!\n  \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BAKE_IN_BEZIER_KEYFRAMES: () => (/* binding */ BAKE_IN_BEZIER_KEYFRAMES),\n/* harmony export */   GECKOLIB_MODEL_ID: () => (/* binding */ GECKOLIB_MODEL_ID),\n/* harmony export */   GeckoModelType: () => (/* binding */ GeckoModelType),\n/* harmony export */   PROPERTY_FILEPATH_CACHE: () => (/* binding */ PROPERTY_FILEPATH_CACHE),\n/* harmony export */   PROPERTY_MODEL_TYPE: () => (/* binding */ PROPERTY_MODEL_TYPE),\n/* harmony export */   PROPERTY_MODID: () => (/* binding */ PROPERTY_MODID),\n/* harmony export */   SETTING_ALWAYS_SHOW_DISPLAY: () => (/* binding */ SETTING_ALWAYS_SHOW_DISPLAY),\n/* harmony export */   SETTING_AUTO_PARTICLE_TEXTURE: () => (/* binding */ SETTING_AUTO_PARTICLE_TEXTURE),\n/* harmony export */   SETTING_DEFAULT_MODID: () => (/* binding */ SETTING_DEFAULT_MODID),\n/* harmony export */   SETTING_REMEMBER_EXPORT_LOCATIONS: () => (/* binding */ SETTING_REMEMBER_EXPORT_LOCATIONS)\n/* harmony export */ });\n/**\n * GeckoLib plugin model format ID. Used to identify model types generated from this plugin\n */\nconst GECKOLIB_MODEL_ID = \"animated_entity_model\";\n// Setting name constants\nconst SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture';\nconst SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display';\nconst SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations';\nconst SETTING_DEFAULT_MODID = 'geckolib_default_modid';\nconst BAKE_IN_BEZIER_KEYFRAMES = \"geckolib_bake_in_bezier_keyframes\";\n// Property name constants\nconst PROPERTY_MODID = 'geckolib_modid';\nconst PROPERTY_MODEL_TYPE = 'geckolib_model_type';\nconst PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache';\n/**\n * Available GeckoLib model types\n */\nvar GeckoModelType;\n(function (GeckoModelType) {\n    GeckoModelType[\"ENTITY\"] = \"Entity\";\n    GeckoModelType[\"BLOCK\"] = \"Block\";\n    GeckoModelType[\"ITEM\"] = \"Item\";\n    GeckoModelType[\"ARMOR\"] = \"Armor\";\n    GeckoModelType[\"OBJECT\"] = \"Object\";\n})(GeckoModelType || (GeckoModelType = {}));\n\n\n/***/ }),\n\n/***/ \"./ts/easing.ts\":\n/*!**********************!*\\\n  !*** ./ts/easing.ts ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   EASING_DEFAULT: () => (/* binding */ EASING_DEFAULT),\n/* harmony export */   EASING_OPTIONS: () => (/* binding */ EASING_OPTIONS),\n/* harmony export */   easingFunctions: () => (/* binding */ easingFunctions),\n/* harmony export */   getEasingArgDefault: () => (/* binding */ getEasingArgDefault),\n/* harmony export */   isArgsEasing: () => (/* binding */ isArgsEasing),\n/* harmony export */   parseEasingArg: () => (/* binding */ parseEasingArg),\n/* harmony export */   reverseEasing: () => (/* binding */ reverseEasing)\n/* harmony export */ });\n// The MIT license notice below applies to the function findIntervalBorderIndex\n/* The MIT License (MIT)\n\nCopyright (c) 2015 Boris Chumichev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n *\n * Utilizes bisection method to search an interval to which\n * point belongs to, then returns an index of left or right\n * border of the interval\n *\n * @param {Number} point\n * @param {Array} intervals\n * @param {Boolean} useRightBorder\n * @returns {Number}\n */\nfunction findIntervalBorderIndex(point, intervals, useRightBorder) {\n    //If point is beyond given intervals\n    if (point < intervals[0])\n        return 0;\n    if (point > intervals[intervals.length - 1])\n        return intervals.length - 1;\n    //If point is inside interval\n    //Start searching on a full range of intervals\n    let indexOfNumberToCompare = 0;\n    let leftBorderIndex = 0;\n    let rightBorderIndex = intervals.length - 1;\n    //Reduce searching range till it find an interval point belongs to using binary search\n    while (rightBorderIndex - leftBorderIndex !== 1) {\n        indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2);\n        point >= intervals[indexOfNumberToCompare] ?\n            leftBorderIndex = indexOfNumberToCompare :\n            rightBorderIndex = indexOfNumberToCompare;\n    }\n    return useRightBorder ? rightBorderIndex : leftBorderIndex;\n}\nfunction stepRange(steps, stop = 1) {\n    if (steps < 2)\n        throw new Error(\"steps must be > 2, got:\" + steps);\n    const stepLength = stop / steps;\n    return Array.from({ length: steps }, (_, i) => i * stepLength);\n}\n// The MIT license notice below applies to the Easing class\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 */\nclass Easing {\n    /**\n     * A stepping function, returns 1 for any positive value of `n`.\n     */\n    static step0(n) {\n        return n > 0 ? 1 : 0;\n    }\n    /**\n     * A stepping function, returns 1 if `n` is greater than or equal to 1.\n     */\n    static step1(n) {\n        return n >= 1 ? 1 : 0;\n    }\n    /**\n     * A linear function, `f(t) = t`. Position correlates to elapsed time one to\n     * one.\n     *\n     * http://cubic-bezier.com/#0,0,1,1\n     */\n    static linear(t) {\n        return t;\n    }\n    /**\n     * A simple inertial interaction, similar to an object slowly accelerating to\n     * speed.\n     *\n     * http://cubic-bezier.com/#.42,0,1,1\n     */\n    // static ease(t) {\n    //     if (!ease) {\n    //         ease = Easing.bezier(0.42, 0, 1, 1);\n    //     }\n    //     return ease(t);\n    // }\n    /**\n     * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInQuad\n     */\n    static quad(t) {\n        return t * t;\n    }\n    /**\n     * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInCubic\n     */\n    static cubic(t) {\n        return t * t * t;\n    }\n    /**\n     * A power function. Position is equal to the Nth power of elapsed time.\n     *\n     * n = 4: http://easings.net/#easeInQuart\n     * n = 5: http://easings.net/#easeInQuint\n     */\n    static poly(n) {\n        return (t) => Math.pow(t, n);\n    }\n    /**\n     * A sinusoidal function.\n     *\n     * http://easings.net/#easeInSine\n     */\n    static sin(t) {\n        return 1 - Math.cos((t * Math.PI) / 2);\n    }\n    /**\n     * A circular function.\n     *\n     * http://easings.net/#easeInCirc\n     */\n    static circle(t) {\n        return 1 - Math.sqrt(1 - t * t);\n    }\n    /**\n     * An exponential function.\n     *\n     * http://easings.net/#easeInExpo\n     */\n    static exp(t) {\n        return Math.pow(2, 10 * (t - 1));\n    }\n    /**\n     * A simple elastic interaction, similar to a spring oscillating back and\n     * forth.\n     *\n     * Default bounciness is 1, which overshoots a little bit once. 0 bounciness\n     * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N\n     * times.\n     *\n     * http://easings.net/#easeInElastic\n     */\n    static elastic(bounciness = 1) {\n        const p = bounciness * Math.PI;\n        return (t) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p);\n    }\n    /**\n     * Use with `Animated.parallel()` to create a simple effect where the object\n     * animates back slightly as the animation starts.\n     *\n     * Wolfram Plot:\n     *\n     * - http://tiny.cc/back_default (s = 1.70158, default)\n     */\n    static back(s = 1.70158) {\n        return (t) => t * t * ((s + 1) * t - s);\n    }\n    /**\n     * Provides a simple bouncing effect.\n     *\n     * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up\n     * using min instead of ternaries\n     * http://easings.net/#easeInBounce\n     */\n    static bounce(k = 0.5) {\n        const q = (x) => (121 / 16) * x * x;\n        const w = (x) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k;\n        const r = (x) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k;\n        const t = (x) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k;\n        return (x) => Math.min(q(x), w(x), r(x), t(x));\n    }\n    /**\n     * Provides a cubic bezier curve, equivalent to CSS Transitions'\n     * `transition-timing-function`.\n     *\n     * A useful tool to visualize cubic bezier curves can be found at\n     * http://cubic-bezier.com/\n     */\n    // static bezier(x1, y1, x2, y2) {\n    //     const _bezier = require('./bezier');\n    //     return _bezier(x1, y1, x2, y2);\n    // }\n    /**\n     * Runs an easing function forwards.\n     */\n    static in(easing) {\n        return easing;\n    }\n    /**\n     * Runs an easing function backwards.\n     */\n    static out(easing) {\n        return (t) => 1 - easing(1 - t);\n    }\n    /**\n     * Makes any easing function symmetrical. The easing function will run\n     * forwards for half of the duration, then backwards for the rest of the\n     * duration.\n     */\n    static inOut(easing) {\n        return (t) => {\n            if (t < 0.5) {\n                return easing(t * 2) / 2;\n            }\n            return 1 - easing((1 - t) * 2) / 2;\n        };\n    }\n}\nconst quart = Easing.poly(4);\nconst quint = Easing.poly(5);\nconst back = (direction, scalar, t) => direction(Easing.back(1.70158 * scalar))(t);\nconst elastic = (direction, bounciness, t) => direction(Easing.elastic(bounciness))(t);\nconst bounce = (direction, bounciness, t) => direction(Easing.bounce(bounciness))(t);\nconst easingFunctions = {\n    linear: Easing.linear,\n    step(steps, x) {\n        const intervals = stepRange(steps);\n        return intervals[findIntervalBorderIndex(x, intervals, false)];\n    },\n    easeInQuad: Easing.in(Easing.quad),\n    easeOutQuad: Easing.out(Easing.quad),\n    easeInOutQuad: Easing.inOut(Easing.quad),\n    easeInCubic: Easing.in(Easing.cubic),\n    easeOutCubic: Easing.out(Easing.cubic),\n    easeInOutCubic: Easing.inOut(Easing.cubic),\n    easeInQuart: Easing.in(quart),\n    easeOutQuart: Easing.out(quart),\n    easeInOutQuart: Easing.inOut(quart),\n    easeInQuint: Easing.in(quint),\n    easeOutQuint: Easing.out(quint),\n    easeInOutQuint: Easing.inOut(quint),\n    easeInSine: Easing.in(Easing.sin),\n    easeOutSine: Easing.out(Easing.sin),\n    easeInOutSine: Easing.inOut(Easing.sin),\n    easeInExpo: Easing.in(Easing.exp),\n    easeOutExpo: Easing.out(Easing.exp),\n    easeInOutExpo: Easing.inOut(Easing.exp),\n    easeInCirc: Easing.in(Easing.circle),\n    easeOutCirc: Easing.out(Easing.circle),\n    easeInOutCirc: Easing.inOut(Easing.circle),\n    easeInBack: back.bind(null, Easing.in),\n    easeOutBack: back.bind(null, Easing.out),\n    easeInOutBack: back.bind(null, Easing.inOut),\n    easeInElastic: elastic.bind(null, Easing.in),\n    easeOutElastic: elastic.bind(null, Easing.out),\n    easeInOutElastic: elastic.bind(null, Easing.inOut),\n    easeInBounce: bounce.bind(null, Easing.in),\n    easeOutBounce: bounce.bind(null, Easing.out),\n    easeInOutBounce: bounce.bind(null, Easing.inOut),\n};\n// Object with the same keys as easingFunctions and values of the stringified key names\nconst EASING_OPTIONS = Object.freeze(Object.fromEntries(Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]]))));\nconst EASING_DEFAULT = 'linear';\nconst getEasingArgDefault = (kf) => {\n    switch (kf.easing) {\n        case EASING_OPTIONS.easeInBack:\n        case EASING_OPTIONS.easeOutBack:\n        case EASING_OPTIONS.easeInOutBack:\n        case EASING_OPTIONS.easeInElastic:\n        case EASING_OPTIONS.easeOutElastic:\n        case EASING_OPTIONS.easeInOutElastic:\n            return 1;\n        case EASING_OPTIONS.easeInBounce:\n        case EASING_OPTIONS.easeOutBounce:\n        case EASING_OPTIONS.easeInOutBounce:\n            return 0.5;\n        case EASING_OPTIONS.step:\n            return 5;\n        default:\n            return null;\n    }\n};\nconst parseEasingArg = (kf, value) => {\n    switch (kf.easing) {\n        case EASING_OPTIONS.easeInBack:\n        case EASING_OPTIONS.easeOutBack:\n        case EASING_OPTIONS.easeInOutBack:\n        case EASING_OPTIONS.easeInElastic:\n        case EASING_OPTIONS.easeOutElastic:\n        case EASING_OPTIONS.easeInOutElastic:\n        case EASING_OPTIONS.easeInBounce:\n        case EASING_OPTIONS.easeOutBounce:\n        case EASING_OPTIONS.easeInOutBounce:\n            return parseFloat(value);\n        case EASING_OPTIONS.step:\n            return Math.max(parseInt(value, 10), 2);\n        default:\n            return parseInt(value, 10);\n    }\n};\nfunction reverseEasing(easing) {\n    if (!easing)\n        return easing;\n    if (easing.startsWith(\"easeInOut\"))\n        return easing;\n    if (easing.startsWith(\"easeIn\"))\n        return easing.replace(\"easeIn\", \"easeOut\");\n    if (easing.startsWith(\"easeOut\"))\n        return easing.replace(\"easeOut\", \"easeIn\");\n    return easing;\n}\nconst isArgsEasing = (easing = \"\") => easing.includes(\"Back\") ||\n    easing.includes(\"Elastic\") ||\n    easing.includes(\"Bounce\") ||\n    easing === EASING_OPTIONS.step;\n\n\n/***/ }),\n\n/***/ \"./ts/events.ts\":\n/*!**********************!*\\\n  !*** ./ts/events.ts ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addEventListeners: () => (/* binding */ addEventListeners),\n/* harmony export */   removeEventListeners: () => (/* binding */ removeEventListeners)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keyframe */ \"./ts/keyframe.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n/* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./codec */ \"./ts/codec.ts\");\n\n\n\n\nfunction addEventListeners() {\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('save_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSave));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, \"buildFile\", monkeypatchAnimatorBuildFile);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, \"loadFile\", monkeypatchAnimatorLoadFile);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Blockbench, null, \"export\", monkeypatchBlockbenchExport);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(BarItems, 'project_window', \"click\", monkeypatchProjectWindowClick);\n}\nfunction removeEventListeners() {\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeMonkeypatches)();\n}\n/**\n * When an existing GeckoLib project is being read from file\n */\nfunction onProjectParse(e) {\n    onSettingsChanged();\n    // Because the project hasn't had its model properties applied at this stage\n    Format.display_mode = (e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] && e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_1__.GeckoModelType.ITEM) || settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_ALWAYS_SHOW_DISPLAY].value;\n}\n/**\n * When the Blockbench project is being saved\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSave(e) {\n    if (!settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value)\n        e.model[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE] = {};\n}\n/**\n * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onSettingsChanged() {\n    Modes.selected.select();\n    Format.display_mode = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.hasModelDisplaySettings)();\n    if (Project instanceof ModelProject && Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_1__.GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) {\n        Project.parent = 'builtin/entity';\n        Project.saved = false;\n    }\n}\n/**\n * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSelect() {\n    onSettingsChanged();\n}\n/**\n * When selecting edit/paint/display/animate/etc\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onModeSelect(e) {\n    // Offset the display emulator to account for GeckoLib's +0.51 manual offset\n    // This is a legacy patch as Blockbench no longer does this internally\n    if (e.mode.id == 'display')\n        Project.model_3d.position.y = 0;\n}\n/**\n * When the model geometry is being compiled for export\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onBedrockCompile(e) {\n    var _a;\n    // Remove display transforms from non-bedrock geometry\n    (_a = e.model[\"minecraft:geometry\"]) === null || _a === void 0 ? void 0 : _a.forEach((geo) => delete geo[\"item_display_transforms\"]);\n    // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established\n    switch (e.model.format_version) {\n        case \"1.14.0\":\n        case \"1.21.0\":\n        case \"1.21.20\":\n            e.model.format_version = \"1.12.0\";\n            break;\n        default:\n            break;\n    }\n}\n/**\n * When the project settings window is being opened, either via a new project or the File -> Project... menu item\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchProjectWindowClick() {\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) {\n        (0,_codec__WEBPACK_IMPORTED_MODULE_2__.openProjectSettingsDialog)();\n    }\n    else {\n        _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(BarItems).click();\n    }\n}\n/**\n * When any file is being exported to disk by Blockbench\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchBlockbenchExport(options, cb) {\n    if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) {\n        _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb);\n        return;\n    }\n    if (Project instanceof ModelProject) {\n        if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON\n            const fileName = Project.model_identifier && Project.model_identifier + \".animation\";\n            options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation;\n            const parentCallback = cb;\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n                const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation;\n                Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation = settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n                if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].animation)\n                    Project.saved = false;\n            };\n            if (fileName)\n                options.name = fileName;\n        }\n        else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo\n            const fileName = Project.model_identifier && Project.model_identifier + \".geo\";\n            options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model;\n            const parentWriter = options.custom_writer;\n            const parentCallback = cb;\n            if (parentWriter) {\n                options.custom_writer = (content, filePath, callback) => {\n                    parentWriter(content, filePath, callback);\n                    callback(filePath);\n                };\n            }\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n                const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model;\n                Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model = settings[_constants__WEBPACK_IMPORTED_MODULE_1__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n                if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_1__.PROPERTY_FILEPATH_CACHE].model)\n                    Project.saved = false;\n            };\n            if (fileName)\n                options.name = fileName;\n        }\n    }\n    _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb);\n}\n/**\n * When the animation file is being loaded into the project\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchAnimatorLoadFile(file, exportingAnims) {\n    // eslint-disable-next-line no-undef\n    const json = file.json || autoParseJSON(file.content);\n    const path = file.path;\n    const new_animations = [];\n    function geoLoopToBbLoop(jsonLoop) {\n        if (jsonLoop) {\n            if (typeof jsonLoop === 'boolean')\n                return jsonLoop ? 'loop' : 'once';\n            if (typeof jsonLoop === 'string') {\n                if (jsonLoop === \"hold_on_last_frame\")\n                    return 'hold';\n                if (jsonLoop === \"loop\" || jsonLoop === \"true\")\n                    return 'loop';\n            }\n        }\n        return 'once';\n    }\n    function getKeyframeDataPoints(source) {\n        if (source instanceof Array)\n            return [{ x: source[0], y: source[1], z: source[2], }];\n        if (['number', 'string'].includes(typeof source))\n            return [{ x: source, y: source, z: source }];\n        if (typeof source == 'object') {\n            if (source.vector)\n                return getKeyframeDataPoints(source.vector);\n            const points = [];\n            if (source.pre)\n                points.push(getKeyframeDataPoints(source.pre)[0]);\n            if (source.post)\n                points.push(getKeyframeDataPoints(source.post)[0]);\n            return points;\n        }\n    }\n    if (json && typeof json.animations === 'object') {\n        for (const animName in json.animations) {\n            if (exportingAnims && !exportingAnims.includes(animName))\n                continue;\n            //Animation\n            const animData = json.animations[animName];\n            const animation = new Blockbench.Animation({\n                name: animName,\n                path,\n                loop: geoLoopToBbLoop(animData.loop),\n                override: animData.override_previous_animation,\n                anim_time_update: (typeof animData.anim_time_update == 'string'\n                    ? animData.anim_time_update.replace(/;(?!$)/, ';\\n')\n                    : animData.anim_time_update),\n                blend_weight: (typeof animData.blend_weight == 'string'\n                    ? animData.blend_weight.replace(/;(?!$)/, ';\\n')\n                    : animData.blend_weight),\n                length: animData.animation_length\n            }).add();\n            //Bones\n            if (animData.bones) {\n                for (const boneName in animData.bones) {\n                    const bone = animData.bones[boneName];\n                    const lowercase_bone_name = boneName.toLowerCase();\n                    const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name);\n                    const uuid = group ? group.uuid : guid();\n                    let ga; // eslint-disable-line @typescript-eslint/no-unused-vars\n                    const boneAnimator = new _keyframe__WEBPACK_IMPORTED_MODULE_3__.GeckolibBoneAnimator(uuid, animation, boneName);\n                    animation.animators[uuid] = boneAnimator;\n                    //Channels\n                    for (const channel in bone) {\n                        if (Animator.possible_channels[channel]) {\n                            if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing,\n                                    easingArgs: bone[channel].easingArgs,\n                                    data_points: getKeyframeDataPoints(bone[channel]),\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object' && bone[channel].post) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing == \"bezier\" ? undefined : bone[channel].easing,\n                                    easingArgs: bone[channel].easingArgs,\n                                    interpolation: bone[channel].easing == \"bezier\" ? \"bezier\" : bone[channel].lerp_mode,\n                                    data_points: getKeyframeDataPoints(bone[channel]),\n                                    bezier_right_time: bone[channel].right_time,\n                                    bezier_left_time: bone[channel].left_time,\n                                    bezier_left_value: bone[channel].left,\n                                    bezier_right_value: bone[channel].right\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object') {\n                                for (const timestamp in bone[channel]) {\n                                    boneAnimator.addKeyframe({\n                                        time: parseFloat(timestamp),\n                                        channel,\n                                        easing: bone[channel][timestamp].easing == \"bezier\" ? undefined : bone[channel][timestamp].easing,\n                                        easingArgs: bone[channel][timestamp].easingArgs,\n                                        interpolation: bone[channel][timestamp].easing == \"bezier\" ? \"bezier\" : bone[channel][timestamp].lerp_mode,\n                                        data_points: getKeyframeDataPoints(bone[channel][timestamp]),\n                                        bezier_right_time: bone[channel][timestamp].right_time,\n                                        bezier_left_time: bone[channel][timestamp].left_time,\n                                        bezier_left_value: bone[channel][timestamp].left,\n                                        bezier_right_value: bone[channel][timestamp].right\n                                    });\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            if (animData.sound_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.sound_effects) {\n                    const sounds = animData.sound_effects[timestamp];\n                    animation.animators.effects.addKeyframe({\n                        channel: 'sound',\n                        time: parseFloat(timestamp),\n                        data_points: sounds instanceof Array ? sounds : [sounds]\n                    });\n                }\n            }\n            if (animData.particle_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.particle_effects) {\n                    let particles = animData.particle_effects[timestamp];\n                    if (!(particles instanceof Array))\n                        particles = [particles];\n                    particles.forEach(particle => {\n                        if (particle)\n                            particle.script = particle.pre_effect_script;\n                    });\n                    animation.animators.effects.addKeyframe({\n                        channel: 'particle',\n                        time: parseFloat(timestamp),\n                        data_points: particles\n                    });\n                }\n            }\n            if (animData.timeline) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.timeline) {\n                    const entry = animData.timeline[timestamp];\n                    const script = entry instanceof Array ? entry.join('\\n') : entry;\n                    animation.animators.effects.addKeyframe({\n                        channel: 'timeline',\n                        time: parseFloat(timestamp),\n                        data_points: [{ script }]\n                    });\n                }\n            }\n            animation.calculateSnappingFromKeyframes();\n            if (!Blockbench.Animation.selected && Animator.open)\n                animation.select();\n            new_animations.push(animation);\n        }\n    }\n    return new_animations;\n}\n/**\n * When the animations JSON is being compiled for export\n * <p>\n * Makes sure bezier keyframes get exported correctly rather than being baked.\n */\nfunction monkeypatchAnimatorBuildFile() {\n    var _a;\n    const bezierKeys = [];\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_1__.BAKE_IN_BEZIER_KEYFRAMES].value) {\n        let animation;\n        this.animations.forEach(a => {\n            if (a.name == arguments[1][0])\n                animation = a;\n            return;\n        });\n        if (animation) {\n            for (const uuid in animation.animators) {\n                const animator = animation.animators[uuid];\n                if (!animator.keyframes.length && !animator.rotation_global)\n                    continue;\n                if (animator.type == 'bone') {\n                    for (const channel in Animator.possible_channels) {\n                        if (!((_a = animator[channel]) === null || _a === void 0 ? void 0 : _a.length))\n                            continue;\n                        const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time);\n                        sorted_keyframes.forEach((kf) => {\n                            if (kf.interpolation == \"bezier\") {\n                                bezierKeys[bezierKeys.length] = kf;\n                                kf.interpolation = \"geckolib_bezier\";\n                            }\n                        });\n                    }\n                }\n            }\n        }\n    }\n    const result = _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Animator).buildFile.apply(this, arguments);\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_1__.BAKE_IN_BEZIER_KEYFRAMES].value) {\n        result.geckolib_format_version = 2;\n        bezierKeys.forEach((kf) => {\n            kf.interpolation = \"bezier\";\n            kf.easing = undefined;\n        });\n    }\n    return result;\n}\n\n\n/***/ }),\n\n/***/ \"./ts/keyframe.ts\":\n/*!************************!*\\\n  !*** ./ts/keyframe.ts ***!\n  \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   GeckolibBoneAnimator: () => (/* binding */ GeckolibBoneAnimator),\n/* harmony export */   loadKeyframeOverrides: () => (/* binding */ loadKeyframeOverrides),\n/* harmony export */   unloadKeyframeOverrides: () => (/* binding */ unloadKeyframeOverrides)\n/* harmony export */ });\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/groupBy */ \"./node_modules/lodash/groupBy.js\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/mapValues */ \"./node_modules/lodash/mapValues.js\");\n/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./easing */ \"./ts/easing.ts\");\n\n\n\n\nvar Keyframe = Blockbench.Keyframe;\nfunction loadKeyframeOverrides() {\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"getLerp\", keyframeGetLerp);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"compileBedrockKeyframe\", keyframeCompileBedrock);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"getUndoCopy\", keyframeGetUndoCopy);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"extend\", keyframeExtend);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(BarItems.reverse_keyframes, null, \"click\", onReverseKeyframes);\n}\nfunction unloadKeyframeOverrides() {\n    //No-op for now since monkeypatches are unloaded automatically\n}\n// This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch\nclass GeckolibBoneAnimator extends BoneAnimator {\n    addKeyframe(data, uuid) {\n        const keyframe = super.addKeyframe(data, uuid);\n        if (data.bezier_left_time)\n            keyframe.bezier_left_time = data.bezier_left_time;\n        if (data.bezier_right_time)\n            keyframe.bezier_right_time = data.bezier_right_time;\n        if (data.bezier_right_value)\n            keyframe.bezier_right_value = data.bezier_right_value;\n        if (data.bezier_left_value)\n            keyframe.bezier_left_value = data.bezier_left_value;\n        return keyframe;\n    }\n}\nfunction lerp(start, stop, amt) {\n    return amt * (stop - start) + start;\n}\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nfunction keyframeGetLerp(other, axis, amount, allow_expression) {\n    const easing = other.easing || _easing__WEBPACK_IMPORTED_MODULE_3__.EASING_DEFAULT;\n    if (Format.id !== \"animated_entity_model\") {\n        return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getLerp.apply(this, arguments);\n    }\n    let easingFunc = _easing__WEBPACK_IMPORTED_MODULE_3__.easingFunctions[easing];\n    if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) {\n        const arg1 = Array.isArray(other.easingArgs) && other.easingArgs.length > 0\n            ? other.easingArgs[0]\n            : (0,_easing__WEBPACK_IMPORTED_MODULE_3__.getEasingArgDefault)(other);\n        // console.log(`keyframeGetLerp arg1: ${arg1}`);\n        easingFunc = easingFunc.bind(null, arg1);\n    }\n    const easedAmount = easingFunc(amount);\n    const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1);\n    const stop = other.calc(axis);\n    const result = lerp(start, stop, easedAmount);\n    // console.log('keyframeGetLerp easing:', easing, 'arguments:', arguments, 'start:', start, 'stop:', stop, 'amount:', amount, 'easedAmount:', easedAmount, 'result:', result);\n    if (Number.isNaN(result)) {\n        throw new Error('batman');\n    }\n    return result;\n}\nfunction geckolibGetArray(data_point = 0) {\n    const { easing, easingArgs, getArray } = this;\n    let result = getArray.apply(this, [data_point]);\n    if (this.interpolation == \"geckolib_bezier\") {\n        result = { vector: result, easing: \"bezier\", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time };\n    }\n    else if (Format.id === \"animated_entity_model\") {\n        if (this.data_points.length != 1)\n            result = { pre: result, post: getArray.apply(this, [1]), easing };\n        else\n            result = { vector: result, easing };\n        if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing))\n            result.easingArgs = easingArgs;\n    }\n    return result;\n}\nfunction keyframeCompileBedrock() {\n    if (Format.id !== \"animated_entity_model\" || !this.transform) {\n        return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments);\n    }\n    if (this.interpolation == 'catmullrom') {\n        const previous = this.getPreviousKeyframe.apply(this);\n        const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom');\n        return {\n            pre: include_pre ? geckolibGetArray.call(this, [0]) : undefined,\n            post: geckolibGetArray.call(this, [include_pre ? 1 : 0]),\n            lerp_mode: this.interpolation,\n        };\n    }\n    else if (this.data_points.length == 1) {\n        return geckolibGetArray.call(this);\n    }\n    else {\n        return geckolibGetArray.call(this, [0]);\n    }\n}\nfunction keyframeGetUndoCopy() {\n    const { easing, easingArgs } = this;\n    const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments);\n    if (Format.id === \"animated_entity_model\") {\n        Object.assign(result, { easing });\n        if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing))\n            result.easingArgs = easingArgs;\n    }\n    //   console.log('keyframeGetUndoCopy arguments:', arguments, 'this:', this, 'result:', result);\n    return result;\n}\nfunction keyframeExtend(dataIn) {\n    const data = Object.assign({}, dataIn);\n    //   console.log('keyframeExtend 1 arguments:', arguments);\n    if (Format.id === \"animated_entity_model\") {\n        if (typeof data.values === 'object') {\n            if (data.values.easing !== undefined) {\n                Merge.string(this, data.values, 'easing');\n            }\n            if (Array.isArray(data.values.easingArgs)) {\n                this.easingArgs = data.values.easingArgs;\n            }\n            if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) {\n                // Convert data to format expected by KeyframeExtendOriginal\n                data.values = data.values.vector;\n            }\n        }\n        else {\n            if (data.easing !== undefined) {\n                Merge.string(this, data, 'easing');\n            }\n            if (Array.isArray(data.easingArgs)) {\n                this.easingArgs = data.easingArgs;\n            }\n        }\n    }\n    const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).extend.apply(this, arguments);\n    //   console.log('keyframeExtend 2 arguments:', arguments, 'this:', this, 'result:', result);\n    return result;\n}\nfunction onReverseKeyframes() {\n    _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments);\n    // console.log('@@@ onReverseKeyframes selected:', Timeline.selected);\n    // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead\n    Undo.initEdit({ keyframes: Timeline.selected });\n    const kfByAnimator = lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected, kf => kf.animator.uuid);\n    const kfByAnimatorAndChannel = lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default()(kfByAnimator, keyframesForAnimator => lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(keyframesForAnimator, kf => kf.channel));\n    Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => {\n        const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid];\n        Object.keys(animatorChannelGroups).forEach(channel => {\n            const channelKeyframes = animatorChannelGroups[channel];\n            // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt\n            channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time);\n            // Reverse easing direction\n            const easingData = channelKeyframes.map((kf) => ({\n                easing: (0,_easing__WEBPACK_IMPORTED_MODULE_3__.reverseEasing)(kf.easing),\n                easingArgs: kf.easingArgs\n            }));\n            // console.log('@@@ onReverseKeyframes PRE animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes, 'easingData:', easingData);\n            // Shift easing data to the right by one keyframe\n            channelKeyframes.forEach((kf, i) => {\n                if (i == 0) {\n                    kf.easing = undefined;\n                    kf.easingArgs = undefined;\n                    return;\n                }\n                const newEasingData = easingData[i - 1];\n                kf.easing = newEasingData.easing;\n                kf.easingArgs = newEasingData.easingArgs;\n            });\n            // console.log('@@@ onReverseKeyframes POST animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes);\n        });\n    });\n    // console.log('@@@ kfByAnimator:', kfByAnimator, \"\\nkfByAnimatorAndChannel:\", kfByAnimatorAndChannel);\n    Undo.finishEdit('Reverse keyframe easing');\n    updateKeyframeSelection();\n    Animator.preview();\n}\n\n\n/***/ }),\n\n/***/ \"./ts/utils.ts\":\n/*!*********************!*\\\n  !*** ./ts/utils.ts ***!\n  \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Monkeypatches: () => (/* binding */ Monkeypatches),\n/* harmony export */   addCodecCallback: () => (/* binding */ addCodecCallback),\n/* harmony export */   addEventListener: () => (/* binding */ addEventListener),\n/* harmony export */   addMonkeypatch: () => (/* binding */ addMonkeypatch),\n/* harmony export */   hasModelDisplaySettings: () => (/* binding */ hasModelDisplaySettings),\n/* harmony export */   isEmpty: () => (/* binding */ isEmpty),\n/* harmony export */   isGeckoLibModel: () => (/* binding */ isGeckoLibModel),\n/* harmony export */   isValidNamespace: () => (/* binding */ isValidNamespace),\n/* harmony export */   isValidPath: () => (/* binding */ isValidPath),\n/* harmony export */   make: () => (/* binding */ make),\n/* harmony export */   onlyIfGeckoLib: () => (/* binding */ onlyIfGeckoLib),\n/* harmony export */   removeCodecCallback: () => (/* binding */ removeCodecCallback),\n/* harmony export */   removeEventListener: () => (/* binding */ removeEventListener),\n/* harmony export */   removeMonkeypatches: () => (/* binding */ removeMonkeypatches)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\nconst VALID_NAMESPACE_PATTERN = new RegExp('^[_\\\\-.a-z0-9]+$');\nconst VALID_PATH_PATTERN = new RegExp('^[_\\\\-/.a-z0-9]+$');\nconst Monkeypatches = new Map();\n/**\n * Add what is effectively an override of another javascript function in a target object.\n * <p>\n * The patched function should call the original first and operate on the result to ensure compatibility\n * </p>\n *\n * @param symbol The target object\n * @param path The property of the target to access, or null to access the root target itself\n * @param functionKey The name of the function to replace\n * @param newFunction The function to patch in to replace the target\n */\nconst addMonkeypatch = (symbol, path, functionKey, newFunction) => {\n    const pathAccessor = path ? symbol[path] : symbol;\n    if (!Monkeypatches.get(symbol))\n        Monkeypatches.set(symbol, { _pathAccessor: pathAccessor });\n    Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey];\n    pathAccessor[functionKey] = newFunction;\n};\n/**\n * Remove all previously added monkeypatches, reverting their operation to prior to the patch\n */\nconst removeMonkeypatches = () => {\n    Monkeypatches.forEach(symbol => {\n        Object.keys(symbol).forEach(functionKey => {\n            if (functionKey.startsWith('_'))\n                return;\n            symbol._pathAccessor[functionKey] = symbol[functionKey];\n        });\n    });\n    Monkeypatches.clear();\n};\n/**\n * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety\n */\nconst onlyIfGeckoLib = (callback) => {\n    return e => {\n        if (isGeckoLibModel())\n            callback(e);\n    };\n};\n/**\n * Add an event listener to Blockbench's event callback system.\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nconst addEventListener = (eventName, callback) => {\n    Blockbench.on(eventName, callback);\n};\n/**\n * Remove a previously registered event listener from Blockbench's event callback system.\n * <p>\n * All registered event listeners should be removed when the plugin or codec is unloaded\n */\nconst removeEventListener = (eventName, callback) => {\n    Blockbench.removeListener(eventName, callback);\n};\n/**\n * Add a callback to a codec to be called after the task has been completed\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nconst addCodecCallback = (codec, taskName, callback) => {\n    codec.on(taskName, callback);\n};\n/**\n * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable\n */\nfunction make(obj, consumer) {\n    consumer(obj);\n    return obj;\n}\n/**\n * Remove a previously added codec task completion callback\n * <p>\n * All registered coded callbacks should be removed when the plugin or codec is unloaded\n */\nconst removeCodecCallback = (codec, taskName, callback) => {\n    codec.removeListener(taskName, callback);\n};\n/**\n * Whether a given string is a valid ResourceLocation path for Minecraft\n */\nconst isValidPath = (path) => {\n    return VALID_PATH_PATTERN.test(path);\n};\n/**\n * Whether a given string is a valid ResourceLocation namespace for Minecraft\n */\nconst isValidNamespace = (namespace) => {\n    return VALID_NAMESPACE_PATTERN.test(namespace);\n};\n/**\n * Whether a map-like object has no defined keys or values\n */\nconst isEmpty = (object = {}) => Object.keys(object).length === 0;\n/**\n * Whether the currently focussed model is a GeckoLib model\n */\nconst isGeckoLibModel = () => Format.id === _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID;\n/**\n * Whether the current project is a GeckoLib model that has or uses item render perspective transforms\n */\nconst hasModelDisplaySettings = () => isGeckoLibModel() && Project && ((Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || !isEmpty(Project.display_settings)) || settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value);\n\n\n/***/ }),\n\n/***/ \"data:font/woff2;base64,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\":\n/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\\\n  !*** data:font/woff2;base64,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 ***!\n  \\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = \"data:font/woff2;base64,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\";\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = __webpack_modules__;\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/node module decorator */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.nmd = (module) => {\n/******/ \t\t\tmodule.paths = [];\n/******/ \t\t\tif (!module.children) module.children = [];\n/******/ \t\t\treturn module;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/jsonp chunk loading */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.b = document.baseURI || self.location.href;\n/******/ \t\t\n/******/ \t\t// object to store loaded and loading chunks\n/******/ \t\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t\t// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n/******/ \t\tvar installedChunks = {\n/******/ \t\t\t\"main\": 0\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t// no chunk on demand loading\n/******/ \t\t\n/******/ \t\t// no prefetching\n/******/ \t\t\n/******/ \t\t// no preloaded\n/******/ \t\t\n/******/ \t\t// no HMR\n/******/ \t\t\n/******/ \t\t// no HMR manifest\n/******/ \t\t\n/******/ \t\t// no on chunks loaded\n/******/ \t\t\n/******/ \t\t// no jsonp function\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be in strict mode.\n(() => {\n\"use strict\";\n/*!*********************!*\\\n  !*** ./ts/index.ts ***!\n  \\*********************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! semver/functions/coerce */ \"./node_modules/semver/functions/coerce.js\");\n/* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! semver/functions/satisfies */ \"./node_modules/semver/functions/satisfies.js\");\n/* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ \"./package.json\");\n/* harmony import */ var _animationUi__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./animationUi */ \"./ts/animationUi.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keyframe */ \"./ts/keyframe.ts\");\n/* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./codec */ \"./ts/codec.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./events */ \"./ts/events.ts\");\n\n\n\n\n\n\n\n\n\nconst { version, blockbenchConfig } = _package_json__WEBPACK_IMPORTED_MODULE_2__;\nconst SUPPORTED_BB_VERSION_RANGE = `${blockbenchConfig.min_version} - ${blockbenchConfig.max_version}`;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst css = (__webpack_require__(/*! ../resources/easing_keyframes.css */ \"./resources/easing_keyframes.css\").toString)();\nif (!semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default()(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default()(Blockbench.version), SUPPORTED_BB_VERSION_RANGE))\n    alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`);\n// Register the plugin and define what it adds\n(function () {\n    let pluginSettings;\n    let pluginProperties;\n    let pluginMenuItems;\n    BBPlugin.register(\"animation_utils\", Object.assign({}, blockbenchConfig, {\n        name: blockbenchConfig.title,\n        version,\n        await_loading: true,\n        onload() {\n            Blockbench.addCSS(css);\n            (0,_events__WEBPACK_IMPORTED_MODULE_3__.addEventListeners)();\n            (0,_animationUi__WEBPACK_IMPORTED_MODULE_4__.loadAnimationUI)();\n            (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.loadKeyframeOverrides)();\n            pluginSettings = createPluginSettings();\n            pluginProperties = createPluginProperties();\n            pluginMenuItems = createPluginMenuItems();\n            for (const menuItem of pluginMenuItems) {\n                MenuBar.addAction(menuItem.action, menuItem.menuCategory);\n            }\n            console.log(\"Loaded GeckoLib plugin\");\n        },\n        onunload() {\n            for (const setting of pluginSettings) {\n                setting.delete();\n            }\n            for (const property of pluginProperties) {\n                property.delete();\n            }\n            for (const menuItem of pluginMenuItems) {\n                menuItem.action.delete();\n            }\n            (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.unloadKeyframeOverrides)();\n            (0,_animationUi__WEBPACK_IMPORTED_MODULE_4__.unloadAnimationUI)();\n            (0,_events__WEBPACK_IMPORTED_MODULE_3__.removeEventListeners)();\n            _codec__WEBPACK_IMPORTED_MODULE_6__.format.delete();\n            console.clear();\n        },\n    }));\n})();\n/**\n * Create and return the plugin's settings.\n * <p>\n * These are found in the Settings panel in the plugin info window\n */\nfunction createPluginSettings() {\n    return [\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_AUTO_PARTICLE_TEXTURE, {\n            value: true,\n            category: \"export\",\n            name: \"Auto-compute block/item particle texture\",\n            description: \"Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.BAKE_IN_BEZIER_KEYFRAMES, {\n            value: false,\n            category: \"export\",\n            name: \"Bake in bezier keyframes\",\n            description: \"When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier.\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_ALWAYS_SHOW_DISPLAY, {\n            value: false,\n            category: \"edit\",\n            name: \"Always show display tab\",\n            description: \"Force the Display tab to always show, even when not an Item type model\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_REMEMBER_EXPORT_LOCATIONS, {\n            value: true,\n            category: \"export\",\n            name: \"Remember file export locations\",\n            description: \"Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file.\"\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID, {\n            // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            type: 'text',\n            value: \"\",\n            category: \"export\",\n            name: \"Default Mod ID\",\n            description: \"Default Mod ID for models (if applicable)\"\n        }), setting => {\n            setting.onChange = function () {\n                const invalidNamespaceChar = new RegExp('[^_\\\\-.a-z0-9]+', 'g');\n                const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g');\n                this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidNamespaceChar, \"\");\n                return {};\n            };\n        })\n    ];\n}\n/**\n * Create and return the plugin's properties.\n * <p>\n * These are metadata values stored in the project, usually used in project settings windows\n */\nfunction createPluginProperties() {\n    return [\n        (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, \"string\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODID, {\n            label: \"Mod ID\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            values: [],\n            merge_validation: _utils__WEBPACK_IMPORTED_MODULE_8__.isValidNamespace\n        }), property => {\n            property['placeholder'] = 'my_modid';\n            property['description'] = 'The modid of the mod this model is for';\n            property.getDefault = function () {\n                return settings[_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID].value;\n            };\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, \"enum\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE, {\n            label: \"Model Type\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            exposed: false,\n            options: _constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType,\n            values: Object.values(_constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType)\n        }), property => {\n            property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure';\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_8__.make)(new Property(ModelProject, \"instance\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_FILEPATH_CACHE, {\n            label: \"GeckoLib Filepath Cache\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            exposed: false,\n            values: []\n        }), property => {\n            property.default = {};\n        })\n    ];\n}\n/**\n * Create and return the plugin's menu items\n * <p>\n * These are added to Blockbench's menu bar or submenus\n */\nfunction createPluginMenuItems() {\n    return [\n        {\n            action: new Action(\"export_geckolib_model\", {\n                name: \"Export GeckoLib Model\",\n                icon: \"archive\",\n                description: \"Export your model geometry as a model for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)(),\n                click: function () {\n                    _codec__WEBPACK_IMPORTED_MODULE_6__[\"default\"].export();\n                },\n            }),\n            menuCategory: 'file.export'\n        },\n        {\n            action: new Action(\"export_geckolib_display\", {\n                name: \"Export GeckoLib Display Settings\",\n                icon: \"icon-bb_interface\",\n                description: \"Export your item/block display settings for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)() && (0,_utils__WEBPACK_IMPORTED_MODULE_8__.hasModelDisplaySettings)(),\n                click: _codec__WEBPACK_IMPORTED_MODULE_6__.buildDisplaySettingsJson,\n            }),\n            menuCategory: 'file.export'\n        },\n        {\n            action: new Action(\"export_geckolib_animations\", {\n                name: \"Export GeckoLib Animations\",\n                icon: \"movie\",\n                description: \"Export your model animations for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_8__.isGeckoLibModel)() && !(0,_utils__WEBPACK_IMPORTED_MODULE_8__.isEmpty)(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object',\n                click: e => BarItems['export_animation_file'].trigger(e),\n            }),\n            menuCategory: 'file.export'\n        }\n    ];\n}\n\n})();\n\n/******/ })()\n;"
  },
  {
    "path": "plugins/animation_utils/changelog.json",
    "content": "{\n  \"3.0.7\": {\n    \"title\": \"3.0.7\",\n    \"author\": \"Eliot Lash\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Disable minification of JS bundle, fix some build errors on case sensitive filesystems, and upgrade to NodeJS v16.16\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Don't save `geckolib_format_version` in animation json for bedrock models\",\n          \"Remove hold menu hiding code that was causing issues for other plugins (regression of an old bug occurred in version 3.0.6)\"\n        ]\n      }\n    ]\n  },\n  \"3.1.0\": {\n    \"title\": \"3.1.0\",\n    \"author\": \"Eliot Lash\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added support for \\\"Reverse Keyframes\\\" action\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Update to new plugin format, bump minimum Blockbench version to 4.8.0\",\n          \"Ported plugin to TypeScript, added developer README and a few unit tests\"\n        ]\n      }\n    ]\n  },\n  \"3.1.1\": {\n    \"title\": \"3.1.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix the item display settings being cleared if saving as an entity type model\",\n          \"Fix the armour template having swapped pivot points on the legs\",\n          \"Fix incorrect importing of loop type. Closes [#591](https://github.com/bernie-g/geckolib/issues/591)\"\n        ]\n      }\n    ]\n  },\n  \"3.2\": {\n    \"title\": \"3.2\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Auto-export the particle texture entry in the textures list for block/item display jsons if not defined\",\n          \"Auto-convert bedrock animation jsons to GeckoLib-supported animation jsons when exporting\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix the particle texture entry not exporting if the name doesn't end in .png\",\n          \"Fixed item_display_transforms being shipped with .geo jsons for non-bedrock models\",\n          \"Forced known forward-compatible versions to export as 1.12.0 to maintain compatibility while we work out a better system\"\n        ]\n      }\n    ]\n  },\n  \"3.2.1\": {\n    \"title\": \"3.2.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix some animation exporting issues with specific animation setup cases\"\n        ]\n      }\n    ]\n  },\n  \"4.0\": {\n    \"title\": \"4.0\",\n    \"date\": \"2024-10-06\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Overhauled the new project window, adding new settings and a much more dynamic experience\",\n          \"Add export of animations json from File -> Export menu for GeckoLib projects\",\n          \"Add plugin setting for default modid for projects\",\n          \"Add plugin setting for forcing the Display tab to be visible\",\n          \"Add plugin setting for auto-computing the particle texture when otherwise unspecified for item display jsons\",\n          \"Add plugin setting for auto-converting Bedrock-format animations to GeckoLib-format animations when exporting to json, if relevant\",\n          \"New GeckoLib models will now state their model type in the tab name\",\n          \"Auto-apply modid and parent folder prefix to texture path in display settings\",\n          \"Remember export locations for model, animations and item display settings per-project, independently\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Allow exporting of item display settings if the model has them set, even if not in block/item mode\",\n          \"Skip auto-exporting particle entry for item display if not a valid path\",\n          \"Don't store filepath in BB project\",\n          \"Don't include .item in exported display jsons by default\",\n          \"Updated the plugin's about panel\",\n          \"Updated the plugin's icon\",\n          \"Added api-supported changelog\",\n          \"Tweaked various information and tooltip entries to be more clear\",\n          \"Large internal cleanup\",\n          \"Don't print plugin load console line until plugin is actually loaded\",\n          \"The Display tab will now disappear/reappear correctly when switching between projects\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix Geckolib item/block models not displaying properly in the display tab\",\n          \"Fix the item model parent sometimes not being applied\"\n        ]\n      }\n    ]\n  },\n  \"4.0.1\": {\n    \"title\": \"4.0.1\",\n    \"author\": \"Zigy, Squishy\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Keyframes now have different icons based on their easing.\",\n          \"Easing arguments are now reset upon choosing a new easing. Fixes [#690](https://github.com/bernie-g/geckolib/issues/690)\",\n          \"Fixed a typo where the circle easing was spelled cicle instead.\"\n        ]\n      }\n    ]\n  },\n  \"4.0.2\": {\n    \"title\": \"4.0.2\",\n    \"author\": \"Zigy\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the plugin not working on web.\"\n        ]\n      }\n    ]\n  },\n  \"4.1.0\": {\n    \"title\": \"4.1.0\",\n    \"author\": \"Zigy\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added support for bezier, step, and smooth (Catmull-Rom) keyframes!\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed incorrect armor template pivots. Fixes [#527](https://github.com/bernie-g/geckolib/issues/527)\"\n        ]\n      }\n    ]\n  },\n  \"4.1.1\": {\n    \"title\": \"4.1.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Deprecated plugin in favour of GeckoLib Models & Animations in preparation for Blockbench 5.0.0\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/animation_utils/members.yml",
    "content": "maintainers:\n  - bernie-g\n  - fadookie\n  - Tslat\n"
  },
  {
    "path": "plugins/animation_utils/src/.eslintignore",
    "content": "webpack.config.js\njest.config.js"
  },
  {
    "path": "plugins/animation_utils/src/.eslintrc.cjs",
    "content": "/* eslint-env node */\nmodule.exports = {\n  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],\n  parser: '@typescript-eslint/parser',\n  plugins: ['@typescript-eslint'],\n  root: true,\n  env: {\n    browser: true,\n    es2015: true,\n    jquery: true\n  },\n  rules: {\n    'prefer-rest-params': 'off',\n    '@typescript-eslint/no-explicit-any': 'off',\n  },\n};"
  },
  {
    "path": "plugins/animation_utils/src/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\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*.lcov\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (https://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 (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Snowpack dependency directory (https://snowpack.dev/)\nweb_modules/\n\n# TypeScript cache\n*.tsbuildinfo\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Microbundle cache\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\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.env.test\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n.parcel-cache\n\n# Next.js build output\n.next\nout\n\n# Nuxt.js build / generate output\n.nuxt\ndist\n\n# Gatsby files\n.cache/\n# Comment in the public line in if your project uses Gatsby and not Next.js\n# https://nextjs.org/blog/next-9-1#public-directory-support\n# public\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n# DynamoDB Local files\n.dynamodb/\n\n# TernJS port file\n.tern-port\n\n# Stores VSCode versions used for testing VSCode extensions\n.vscode-test\n\n# yarn v2\n.yarn/cache\n.yarn/unplugged\n.yarn/build-state.yml\n.yarn/install-state.gz\n.pnp.*\n"
  },
  {
    "path": "plugins/animation_utils/src/.nvmrc",
    "content": "v16.16\n"
  },
  {
    "path": "plugins/animation_utils/src/jest.config.js",
    "content": "/** @type {import('ts-jest').JestConfigWithTsJest} */\nmodule.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n};"
  },
  {
    "path": "plugins/animation_utils/src/package.json",
    "content": "{\n  \"name\": \"animation_utils\",\n  \"version\": \"4.1.3\",\n  \"private\": true,\n  \"description\": \"GeckoLib (Legacy)\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"prebuild\": \"npm run test\",\n    \"build\": \"npm run build:only\",\n    \"build:only\": \"webpack && npm run update_manifest\",\n    \"update_manifest\": \"node scripts/updateManifest.mjs\",\n    \"start\": \"webpack --watch --mode=development\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint --fix .\",\n    \"tsc\": \"tsc --noEmit\",\n    \"pretest\": \"npm run lint && npm run tsc\",\n    \"test\": \"npm run test:only\",\n    \"test:only\": \"jest\"\n  },\n  \"author\": \"Eliot Lash, Tslat, Gecko, McHorse\",\n  \"license\": \"MIT\",\n  \"blockbenchConfig\": {\n    \"title\": \"GeckoLib Animation Utils\",\n    \"author\": \"Eliot Lash, Tslat, Gecko, McHorse\",\n    \"icon\": \"icon.png\",\n    \"description\": \"Replaced by new plugin for Blockbench 5.0+ - Install 'GeckoLib Models and Animations'\",\n    \"deprecation_note\": \"This plugin has been discontinued in favour of the \\\"GeckoLib Models and Animations\\\" plugin. This plugin will continue to work on Blockbench 4 and below. For Blockbench 5+, use 'GeckoLib' instead.\",\n    \"has_changelog\": true,\n    \"min_version\": \"4.12.0\",\n    \"max_version\": \"5.0.0\",\n    \"variant\": \"both\",\n    \"website\": \"https://github.com/bernie-g/geckolib/wiki\",\n    \"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/animation_utils\",\n    \"bug_tracker\": \"https://github.com/bernie-g/geckolib/issues\"\n  },\n  \"sideEffects\": [\n    \"./index.js\"\n  ],\n  \"devDependencies\": {\n    \"@types/jest\": \"^29.5.4\",\n    \"@types/lodash\": \"^4.14.197\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.5.0\",\n    \"@typescript-eslint/parser\": \"^6.5.0\",\n    \"blockbench-types\": \"^4.9.0\",\n    \"eol\": \"0.9.1\",\n    \"eslint\": \"^7.7.0\",\n    \"indent-string\": \"^5.0.0\",\n    \"jest\": \"^29.6.4\",\n    \"ts-jest\": \"^29.1.1\",\n    \"ts-loader\": \"^9.4.4\",\n    \"typescript\": \"^4.9.5\",\n    \"webpack\": \"^5.88.2\",\n    \"webpack-cli\": \"^5.1.4\",\n    \"css-loader\": \"^6.7.1\",\n    \"to-string-loader\": \"^1.2.0\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.21\",\n    \"semver\": \"7.3.2\"\n  }\n}\n"
  },
  {
    "path": "plugins/animation_utils/src/resources/armorTemplate.json",
    "content": "{\n  \"meta\": {\n    \"format_version\": \"3.2\",\n    \"model_format\": \"animated_entity_model\",\n    \"box_uv\": true\n  },\n  \"name\": \"CustomArmor\",\n  \"geo_name\": \"CustomArmor\",\n  \"resolution\": {\n    \"width\": 64,\n    \"height\": 64\n  },\n  \"elements\": [\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        24,\n        -4\n      ],\n      \"to\": [\n        4,\n        32,\n        4\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        0,\n        0,\n        0\n      ],\n      \"uuid\": \"9675593e-b27d-b70e-e1ea-1fc29f46a294\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        12,\n        -2\n      ],\n      \"to\": [\n        4,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"uuid\": \"fa43156a-2a62-948c-082f-483d525f6d1f\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        4,\n        12,\n        -2\n      ],\n      \"to\": [\n        8,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -8,\n        12,\n        -2\n      ],\n      \"to\": [\n        -4,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"bf2c2539-20e3-cfcc-94c0-491734019889\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        0,\n        -2\n      ],\n      \"to\": [\n        0,\n        12,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"17b9bae0-356a-9bba-fad9-4672e2671191\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        0,\n        0,\n        -2\n      ],\n      \"to\": [\n        4,\n        12,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"\n    }\n  ],\n  \"outliner\": [\n    {\n      \"name\": \"bipedHead\",\n      \"uuid\": \"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"children\": [\n        \"9675593e-b27d-b70e-e1ea-1fc29f46a294\",\n        {\n          \"name\": \"armorHead\",\n          \"uuid\": \"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            0,\n            24,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedBody\",\n      \"uuid\": \"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"children\": [\n        \"fa43156a-2a62-948c-082f-483d525f6d1f\",\n        {\n          \"name\": \"armorBody\",\n          \"uuid\": \"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            0,\n            24,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedRightArm\",\n      \"uuid\": \"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        5,\n        22,\n        0\n      ],\n      \"children\": [\n        \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",\n        {\n          \"name\": \"armorRightArm\",\n          \"uuid\": \"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            5,\n            22,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedLeftArm\",\n      \"uuid\": \"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        -5,\n        22,\n        0\n      ],\n      \"children\": [\n        \"bf2c2539-20e3-cfcc-94c0-491734019889\",\n        {\n          \"name\": \"armorLeftArm\",\n          \"uuid\": \"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -5,\n            22,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedLeftLeg\",\n      \"uuid\": \"37231be7-a8ef-22ca-7fea-40aed58003bb\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        -2,\n        12,\n        0\n      ],\n      \"children\": [\n        \"17b9bae0-356a-9bba-fad9-4672e2671191\",\n        {\n          \"name\": \"armorLeftLeg\",\n          \"uuid\": \"e4b19746-2d17-1f56-befe-00718165ae50\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        },\n        {\n          \"name\": \"armorLeftBoot\",\n          \"uuid\": \"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedRightLeg\",\n      \"uuid\": \"45c031a5-b6be-e0a7-5454-b45d07f28429\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        2,\n        12,\n        0\n      ],\n      \"children\": [\n        \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",\n        {\n          \"name\": \"armorRightLeg\",\n          \"uuid\": \"60238f18-e74b-c863-cb45-2e2f162221bd\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        },\n        {\n          \"name\": \"armorRightBoot\",\n          \"uuid\": \"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    }\n  ],\n  \"textures\": [\n    \n  ]\n}\n"
  },
  {
    "path": "plugins/animation_utils/src/resources/easing_keyframes.css",
    "content": "@font-face {\n    font-family: 'geckolib_icomoon';\n    font-weight: normal;\n    font-style: normal;\n    src: url(\"data:font/woff2;base64,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\") format(\"woff2\");\n}\n\n[class^=\"easing-\"]:not(.fa), [class*=\" easing-\"]:not(.fa) {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: 'geckolib_icomoon' !important;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n    font-size: 1.4em;\n    max-width: 24px;\n\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.easing-linear:before {\n    content: \"\\e925\";\n}\n.easing-step:before {\n    content: \"\\e921\";\n}\n.easing-in_sine:before {\n    content: \"\\e915\";\n}\n.easing-out_sine:before {\n    content: \"\\e916\";\n}\n.easing-in_out_sine:before {\n    content: \"\\e917\";\n}\n.easing-in_quad:before {\n    content: \"\\e900\";\n}\n.easing-out_quad:before {\n    content: \"\\e901\";\n}\n.easing-in_out_quad:before {\n    content: \"\\e902\";\n}\n.easing-in_cubic:before {\n    content: \"\\e903\";\n}\n.easing-out_cubic:before {\n    content: \"\\e904\";\n}\n.easing-in_out_cubic:before {\n    content: \"\\e905\";\n}\n.easing-in_quart:before {\n    content: \"\\e906\";\n}\n.easing-out_quart:before {\n    content: \"\\e907\";\n}\n.easing-in_out_quart:before {\n    content: \"\\e908\";\n}\n.easing-in_quint:before {\n    content: \"\\e909\";\n}\n.easing-out_quint:before {\n    content: \"\\e90a\";\n}\n.easing-in_out_quint:before {\n    content: \"\\e90b\";\n}\n.easing-in_expo:before {\n    content: \"\\e90c\";\n}\n.easing-out_expo:before {\n    content: \"\\e90d\";\n}\n.easing-in_out_expo:before {\n    content: \"\\e90e\";\n}\n.easing-in_circ:before {\n    content: \"\\e90f\";\n}\n.easing-out_circ:before {\n    content: \"\\e910\";\n}\n.easing-in_out_circ:before {\n    content: \"\\e911\";\n}\n.easing-in_back:before {\n    content: \"\\e918\";\n}\n.easing-out_back:before {\n    content: \"\\e919\";\n}\n.easing-in_out_back:before {\n    content: \"\\e91a\";\n}\n.easing-in_elastic:before {\n    content: \"\\e91b\";\n}\n.easing-out_elastic:before {\n    content: \"\\e91c\";\n}\n.easing-in_out_elastic:before {\n    content: \"\\e91d\";\n}\n.easing-in_bounce:before {\n    content: \"\\e91e\";\n}\n.easing-out_bounce:before {\n    content: \"\\e91f\";\n}\n.easing-in_out_bounce:before {\n    content: \"\\e920\";\n}"
  },
  {
    "path": "plugins/animation_utils/src/scripts/updateManifest.mjs",
    "content": "// @ts-check\nimport indentString from 'indent-string';\nimport path from 'path';\nimport fs from 'fs';\nimport eol from 'eol';\nimport * as url from 'url';\n// @ts-ignore\nconst __dirname = url.fileURLToPath(new URL('.', import.meta.url));\n\nconst PACKAGE_JSON_PATH = path.join(__dirname, '../package.json');\nconst PLUGINS_MANIFEST_PATH = path.join(__dirname, '..', '..',  '..', '..', 'plugins.json');\n\nconst pluginsString = fs.readFileSync(PLUGINS_MANIFEST_PATH, { encoding: 'utf8' });\nconst pluginsObj = JSON.parse(pluginsString);\n\nconst packageJsonString = fs.readFileSync(PACKAGE_JSON_PATH, { encoding: 'utf8' });\nconst { version, blockbenchConfig } = JSON.parse(packageJsonString);\n\n// console.log({ version, blockbenchConfig });\n\nconst newAnimationUtilsManifest = Object.assign(\n  {},\n  pluginsObj.animation_utils,\n  { version },\n  blockbenchConfig,\n);\nconst newAnimationUtilsManifestString =\n  indentString(\n    JSON.stringify(newAnimationUtilsManifest, null, '\\t'),\n    1,\n    { indent: '\\t' }\n  )\n  .trimStart();\n\nconst newPluginsString = pluginsString.replace(/(\"animation_utils\":\\s*)({[\\s\\S.]*?})/, `$1${newAnimationUtilsManifestString}`);\n\nfs.writeFileSync(PLUGINS_MANIFEST_PATH, eol.lf(newPluginsString));\n\n// console.log('manifest', manifest);\n\n// console.log(`Wrote manifest to ${PACKAGE_MANIFEST_PATH}.`);"
  },
  {
    "path": "plugins/animation_utils/src/tests/easing.test.ts",
    "content": "import { reverseEasing } from '../ts/easing';\n\ndescribe('easing', () => {\n  describe('reverseEasing', () => {\n    it('should return the easing parameter if it is falsy', () => {\n      expect(reverseEasing(undefined)).toEqual(undefined);\n      expect(reverseEasing(null)).toEqual(null);\n    });\n\n    it('should not change direction of non-directional easings', () => {\n      expect(reverseEasing(\"linear\")).toEqual(\"linear\");\n      expect(reverseEasing(\"easeInOutBack\")).toEqual(\"easeInOutBack\");\n    });\n\n    it('should change easeIn to easeOut and vice versa', () => {\n      expect(reverseEasing(\"easeInBack\")).toEqual(\"easeOutBack\");\n      expect(reverseEasing(\"easeOutBack\")).toEqual(\"easeInBack\");\n    });\n  });\n});"
  },
  {
    "path": "plugins/animation_utils/src/ts/animationUi.ts",
    "content": "import uniq from 'lodash/uniq';\nimport {addMonkeypatch} from './utils';\nimport {EASING_OPTIONS, EASING_DEFAULT, getEasingArgDefault, parseEasingArg, GeckolibKeyframe, isArgsEasing} from './easing';\n\nconst easingRegExp = /^ease(InOut|In|Out)?([\\w]+)$/;\n\nexport const loadAnimationUI = () => {\n  Blockbench.on('display_animation_frame', displayAnimationFrameCallback);\n  Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback);\n  Blockbench.on('render_frame', renderFrameCallback)\n\n  addMonkeypatch(window, null, \"updateKeyframeEasing\", updateKeyframeEasing);\n  addMonkeypatch(window, null, \"updateKeyframeEasingArg\", updateKeyframeEasingArg);\n};\n\nexport const unloadAnimationUI = () => {\n  Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback);\n  Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback);\n  Blockbench.removeListener('render_frame', renderFrameCallback);\n};\n\nexport const displayAnimationFrameCallback = (/*...args*/) => {\n  // const keyframe = $('#keyframe');\n  // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here\n};\n\nexport function renderFrameCallback() {\n  if (Format.id !== \"animated_entity_model\") return\n  Timeline.keyframes.forEach((kf: GeckolibKeyframe) => {\n    if (kf.interpolation != \"linear\" && kf.easing != undefined) {\n      kf.easing = undefined\n      kf.easingArgs = undefined\n      window.updateKeyframeSelection();\n    }\n    if (kf.interpolation === \"step\") {\n      kf.interpolation = \"linear\"\n      if (kf.data_points.length == 1) addDataPoint()\n      window.updateKeyframeSelection();\n    }\n    updateKeyframeIcon(kf)\n  })\n  const addPrePostButton = document.querySelector<HTMLElement>('#keyframe_type_label > div');\n  if (addPrePostButton) addPrePostButton.hidden = true;\n}\n\nexport function updateKeyframeEasing(value) {\n  Undo.initEdit({keyframes: Timeline.selected}) \n  // var axis = $(obj).attr('axis');\n  // const value = $(obj).val();\n  // console.log('updateKeyframeEasing value:', value, 'obj:', obj); \n  if (value === \"-\") return;\n  Timeline.selected.forEach((kf: GeckolibKeyframe) => {\n    kf.easing = value;\n    kf.easingArgs = undefined;\n    kf.interpolation = 'linear';\n  })\n  window.updateKeyframeSelection(); // Ensure easingArg display is updated\n  // Animator.preview();\n  Undo.finishEdit('edit keyframe easing')\n}\n\nexport function updateKeyframeEasingArg(obj) {\n  Undo.initEdit({keyframes: Timeline.selected}) \n  if ($(obj).val() === \"-\") return;\n  // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); \n  Timeline.selected.forEach((kf: GeckolibKeyframe) => {\n    const value = parseEasingArg(kf, ($(obj).val() as string).trim());\n    kf.easingArgs = [value];\n    // obj.value = value;\n  })\n  Undo.finishEdit('edit keyframe easing argument')\n}\n\nexport const updateKeyframeSelectionCallback = (/*...args*/) => {\n    $('#keyframe_bar_easing').remove()\n    $('#keyframe_bar_easing_type').remove()\n    $('#keyframe_bar_easing_arg1').remove()\n\n    let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars\n    let channel: boolean | string | number = false;\n    Timeline.selected.forEach((kf) => {\n      if (channel === false) {\n        channel = kf.channel\n      } else if (channel !== kf.channel) {\n        multi_channel = true\n      }\n    })\n\n    Timeline.keyframes.forEach((kf: GeckolibKeyframe) => {\n      updateKeyframe(kf)\n    })\n\n    const getMultiSelectValue = (selector, defaultValue, conflictValue) => {\n      const selectorFunction = typeof selector === 'function' \n        ? selector\n        : x => (x[selector] === undefined ? defaultValue : x[selector]);\n\n      if (Timeline.selected.length > 1) {\n        const uniqSelected = uniq(Timeline.selected.map(selectorFunction));\n        if (uniqSelected.length === 1) {\n          return uniqSelected[0];\n        } else {\n          return conflictValue;\n        }\n      } else {\n        return selectorFunction(Timeline.selected[0]) || defaultValue;\n      }\n    };\n\n    const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => {\n      // Dear god I miss lodash\n      if (!acc.has(kf.animator)) acc.set(kf.animator, {});\n      const animatorChannels = acc.get(kf.animator);\n      if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = [];\n      animatorChannels[kf.channel].push(kf);\n      animatorChannels[kf.channel].sort((a, b) => {\n        if (a.time < b.time) return -1;\n        if (a.time > b.time) return 1;\n        return 0;\n      });\n      return acc;\n    }, new Map());\n\n    const isFirstInChannel = (kf: _Keyframe) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1;\n\n    if (Timeline.selected.length && Format.id === \"animated_entity_model\") {\n      if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) {\n        const displayedEasing = getMultiSelectValue('easing', EASING_DEFAULT, 'null');\n\n        const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => {\n          const easingTypeToTypeId = type => {\n            let finalEasingType = \"In\";\n\n            if (type === \"out\") {\n              finalEasingType = \"Out\";\n            } else if (type === \"inout\") {\n              finalEasingType = \"InOut\";\n            }\n\n            return finalEasingType;\n          };\n\n          let finalEasing = 'ease';\n\n          if (inputEasingOrType === \"in\" || inputEasingOrType === \"out\" || inputEasingOrType === \"inout\") {\n              const finalEasingType = easingTypeToTypeId(inputEasingOrType)\n\n              finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1);\n            } else if (inputEasingOrType === \"linear\" || inputEasingOrType == \"step\") {\n              finalEasing = inputEasingOrType;\n            } else {\n              const finalEasingType = easingTypeToTypeId(easingType);\n\n              finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1);\n            }\n\n            return finalEasing;\n        };\n\n        const addEasingTypeIcons = (bar, easingType, title) => {\n          const div = document.createElement(\"div\");\n          div.innerHTML = getIcon(easingType);\n          div.id = \"kf_easing_type_\" + easingType;\n          div.setAttribute(\"style\", \"stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px\");\n          div.setAttribute(\"title\", title);\n          div.onclick = () => {\n            const selectedEasing = $(\".selected_kf_easing\");\n            const selectedEasingType = $(\".selected_kf_easing_type\");\n\n            const keySelectedEasing = selectedEasing.attr(\"id\").substring(15);\n            const keySelectedEasingType = selectedEasingType.length <= 0 ? \"in\" : selectedEasingType.attr(\"id\").substring(15);\n\n            const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing);\n            const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType);\n\n            if (finalEasing != currentEasing) {\n            //   console.log(\"Changed from \" + currentEasing + \" to \" + finalEasing);\n              updateKeyframeEasing(finalEasing);\n            }\n          };\n          bar.appendChild(div);\n        };\n\n        const keyframe = document.getElementById('panel_keyframe');\n        let easingBar: HTMLElement = document.createElement('div');\n        keyframe.appendChild(easingBar);\n        easingBar.outerHTML = `<div class=\"bar flex\" style=\"flex-wrap: wrap\" id=\"keyframe_bar_easing\">\n          <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Easing</label>\n        </div>`;\n        easingBar = document.getElementById('keyframe_bar_easing');\n\n        addEasingTypeIcons(easingBar, \"linear\", \"Switch to Linear easing\");\n        addEasingTypeIcons(easingBar, \"step\", \"Switch to Step easing\");\n        addEasingTypeIcons(easingBar, \"sine\", \"Switch to Sine easing\");\n        addEasingTypeIcons(easingBar, \"quad\", \"Switch to Quadratic easing\");\n        addEasingTypeIcons(easingBar, \"cubic\", \"Switch to Cubic easing\");\n        addEasingTypeIcons(easingBar, \"quart\", \"Switch to Quartic easing\");\n        addEasingTypeIcons(easingBar, \"quint\", \"Switch to Quntic easing\");\n        addEasingTypeIcons(easingBar, \"expo\", \"Switch to Exponential easing\");\n        addEasingTypeIcons(easingBar, \"circ\", \"Switch to Circle easing\");\n        addEasingTypeIcons(easingBar, \"back\", \"Switch to Back easing\");\n        addEasingTypeIcons(easingBar, \"elastic\", \"Switch to Elastic easing\");\n        addEasingTypeIcons(easingBar, \"bounce\", \"Switch to Bounce easing\");\n\n        const keyEasing = getEasingInterpolation(displayedEasing);\n        const keyEasingElement = document.getElementById(\"kf_easing_type_\" + keyEasing);\n\n        keyEasingElement.style.stroke = \"var(--color-accent)\";\n        keyEasingElement.classList.add('selected_kf_easing');\n\n        if (!(keyEasing === \"linear\" || keyEasing == \"step\")) {\n          let easingTypeBar: HTMLElement = document.createElement('div');\n          keyframe.appendChild(easingTypeBar);\n          easingTypeBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_type\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Type</label>\n          </div>`;\n          easingTypeBar = document.getElementById('keyframe_bar_easing_type');\n\n          addEasingTypeIcons(easingTypeBar, \"in\", \"Switch to In easing type\");\n          addEasingTypeIcons(easingTypeBar, \"out\", \"Switch to Out easing type\");\n          addEasingTypeIcons(easingTypeBar, \"inout\", \"Switch to In/Out easing type\");\n\n          const keyEasingType = getEasingType(displayedEasing);\n          const keyEasingTypeElement = document.getElementById(\"kf_easing_type_\" + keyEasingType);\n\n          keyEasingTypeElement.style.stroke = \"var(--color-accent)\";\n          keyEasingTypeElement.classList.add('selected_kf_easing_type');\n        }\n\n        if (keyEasing !== \"linear\") document.getElementById(\"panel_keyframe\").querySelector('div.tool.widget.bar_select bb-select').innerHTML = \"GeckoLib\";\n\n        const getEasingArgLabel = (kf: GeckolibKeyframe) => {\n          switch(kf.easing) {\n            case EASING_OPTIONS.easeInBack:\n            case EASING_OPTIONS.easeOutBack:\n            case EASING_OPTIONS.easeInOutBack:\n              return 'Overshoot';\n            case EASING_OPTIONS.easeInElastic:\n            case EASING_OPTIONS.easeOutElastic:\n            case EASING_OPTIONS.easeInOutElastic:\n            case EASING_OPTIONS.easeInBounce:\n            case EASING_OPTIONS.easeOutBounce:\n            case EASING_OPTIONS.easeInOutBounce:\n              return 'Bounciness';\n            case EASING_OPTIONS.step:\n              return 'Steps';\n            default:\n              return 'N/A';\n          }\n        };\n        const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null);\n        if (Timeline.selected.every((kf: GeckolibKeyframe) => isArgsEasing(kf.easing)) && easingArgLabel !== null) {\n          const argDefault = getMultiSelectValue(getEasingArgDefault, null, null);\n          const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]);\n          let scaleBar: HTMLElement = document.createElement('div');\n          keyframe.appendChild(scaleBar);\n          scaleBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_arg1\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 90px;\">${easingArgLabel}</label>\n            <input type=\"number\" id=\"keyframe_easing_scale\" class=\"dark_bordered code keyframe_input tab_target\" value=\"${displayedValue}\" oninput=\"updateKeyframeEasingArg(this)\" style=\"flex: 1; margin-right: 9px;\">\n          </div>`;\n          scaleBar = document.getElementById('keyframe_bar_easing_arg1');\n        }\n\n        // console.log('easingBar:', easingBar, 'keyframe:', keyframe);\n    }\n  }\n};\n\nconst getEasingInterpolation = (name: string) => {\n  const matches = name.match(easingRegExp);\n\n  if (matches) {\n    return matches[2].toLowerCase();\n  }\n\n  return name;\n};\n\nconst getEasingType = (name: string) => {\n  const matches = name.match(easingRegExp);\n\n  if (matches) {\n    return matches[1].toLowerCase();\n  }\n\n  return \"in\";\n};\n\nconst updateKeyframe = (kf: GeckolibKeyframe) => {\n  if (kf.data_points.length != 1 && kf.interpolation !== \"linear\") {\n    removeLastDataPoint()\n  }\n}\n\nconst updateKeyframeIcon = (kf: GeckolibKeyframe) => {\n  // @ts-expect-error This is needed because this plugin uses an outdated version of blockbench-types that doesn't have kf.uuid\n  const element = document.getElementById(kf.uuid);\n  if (element && element.children && kf.easing)\n    element.children[0].className = 'easing-' + kf.easing.split(/\\.?(?=[A-Z])/).join('_').toLowerCase().replace(\"ease_\", \"\")\n}\n\nconst addDataPoint = () => {\n  Undo.initEdit({keyframes: Timeline.selected})\n  Timeline.selected.forEach(kf => {\n    // @ts-expect-error needed because .channels doesn't exist in dev env\n    if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) {\n      kf.data_points.push(new KeyframeDataPoint(kf))\n      kf.data_points.last().extend(kf.data_points[0])\n    }\n  })\n  Animator.preview()\n  Undo.finishEdit('Add keyframe data point')\n}\n\nconst removeLastDataPoint = () => {\n  Undo.initEdit({keyframes: Timeline.selected})\n  Timeline.selected.forEach(kf => {\n    if (kf.data_points.length >= 2) {\n      kf.data_points.remove(kf.data_points.last());\n    }\n  })\n  Animator.preview()\n  Undo.finishEdit('Remove keyframe data point')\n}\n\nconst getIcon = (name: string) => {\n  switch(name) {\n    case \"back\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.94165 c 3.17500003,0 4.23333333,2.91041 5.29166663,-4.7625\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"bounce\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0.26458333,-0.26458 0.52916673,-0.26458 0.79375003,0 0.5291666,-0.52916 0.5291666,-0.52916 1.0583333,0 0.79375,-2.11666 1.5875,-2.11666 2.38125,0 0.2645833,-4.23333 1.0583333,-5.29165 1.0583333,-5.29165\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"circ\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 5.8208333,295.67706 5.8208333,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"cubic\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"elastic\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.67706 c 0.79375003,0 0.79375003,-0.26458 1.32291663,-0.26458 0.5291667,0 0.79375,0.52917 1.3229167,0.52917 0.5291667,0 1.0094474,-1.83865 1.3229167,-0.79375 0.79375,2.64583 1.3229166,1.32292 1.3229166,-3.96874\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"expo\":\n    case \"in\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 4.23333333,0 5.29166663,-1.05833 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"inout\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 5.55625003,0 -0.26458334,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"out\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0,-4.23333 1.05833333,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quad\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.03123 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quart\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.17500003,0 4.23333333,-2.64583 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quint\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.43958333,0 4.23333333,-1.85208 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"sine\":\n      return '<svg width=\"24\" height=\"24\" viewBox=\"0 0 6.3499999 6.3500002\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 1.32291663,0 4.23333333,-3.43958 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"step\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 0,-1.32291 H 1.8520833 v -1.32292 H 3.175 v -1.32292 h 1.3229167 v -1.32291 l 1.3229166,1e-5\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    default: // linear\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.52916667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n  }\n};"
  },
  {
    "path": "plugins/animation_utils/src/ts/codec.ts",
    "content": "import armorTemplate from '../resources/armorTemplate.json';\nimport {isEmpty, isValidPath} from './utils';\nimport {\n    GECKOLIB_MODEL_ID,\n    GeckoModelType, PROPERTY_FILEPATH_CACHE,\n    PROPERTY_MODEL_TYPE,\n    PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE,\n    SETTING_REMEMBER_EXPORT_LOCATIONS\n} from \"./constants\";\n\nconst codec = Codecs.bedrock;\n\n// This gets automatically applied by Blockbench, we don't need to do anything with it\nexport const format = new ModelFormat({\n    id: GECKOLIB_MODEL_ID,\n    name: \"GeckoLib Animated Model\",\n    category: \"minecraft\",\n    description: \"Animated Model for Java mods using GeckoLib\",\n    icon: \"view_in_ar\",\n    rotate_cubes: true,\n    box_uv: true,\n    optional_box_uv: true,\n    single_texture: true,\n    bone_rig: true,\n    centered_grid: true,\n    animated_textures: true,\n    select_texture_for_particles: true,\n    animation_files: true,\n    locators: true,\n    codec: Codecs.project,\n    display_mode: false,\n    animation_mode: true,\n})\n\n// Override the new project panel to allow customisation\nformat.new = function() {\n    if (newProject(this))\n        return openProjectSettingsDialog();\n}\n\n/**\n * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item\n */\nexport function openProjectSettingsDialog() {\n    if (Project instanceof ModelProject)\n        return createProjectSettingsDialog(Project, createProjectSettingsForm(Project));\n}\n\n/**\n * Internal function for determining the placeholder value for the <code>model_identifier</code> form element in dialog windows\n */\nfunction getObjectIdPlaceholder(formResult?: {[key: string]: FormResultValue}) {\n    const name = formResult?.['name'] as string;\n    const modelType = formResult?.[PROPERTY_MODEL_TYPE] as string;\n\n    if (!name && !modelType)\n        return 'my_entity';\n\n    const invalidPathChar = new RegExp('[^_\\\\-/.a-z0-9]+', 'g')\n    const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g')\n\n    if (name)\n        return name.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidPathChar, \"\");\n\n    switch (GeckoModelType[modelType]) {\n        case GeckoModelType.ENTITY: return 'my_entity'\n        case GeckoModelType.BLOCK: return 'my_block';\n        case GeckoModelType.ITEM: return 'my_item';\n        case GeckoModelType.ARMOR: return 'my_armor';\n        case GeckoModelType.OBJECT: return 'my_object';\n        default: return 'my_entity';\n    }\n}\n\n/**\n * Create the Project Settings dialog form for use in both new projects and editing existing ones\n */\nfunction createProjectSettingsForm(Project: ModelProject) {\n    const form = {format: {type: 'info', label: 'data.format', text: Format.name||'unknown', description: Format.description} as DialogFormElement}\n    const properties = ModelProject['properties'];\n\n    const modelType = properties[PROPERTY_MODEL_TYPE];\n\n    if (modelType) {\n        form[PROPERTY_MODEL_TYPE] = {\n            label: modelType.label,\n            description: modelType.description,\n            default: GeckoModelType.ENTITY.toUpperCase(),\n            value: GeckoModelType[Project[PROPERTY_MODEL_TYPE].toUpperCase()].toUpperCase(),\n            placeholder: modelType.placeholder,\n            type: 'select',\n            options: typeof modelType.options == 'function' ? modelType.options() : modelType.options,\n        }\n    }\n\n    for (const key in properties) {\n        const property = properties[key];\n\n        if (property.exposed === false || !Condition(property.condition))\n            continue;\n\n        const entry = form[property.name] = {\n            label: property.label,\n            description: property.description,\n            value: Project[property.name],\n            placeholder: property.placeholder,\n            type: property.type\n        }\n\n        if (property.name === 'name') {\n            entry.label = 'Project Name'\n            entry.placeholder = 'My Project'\n            entry.description = 'The name of the Blockbench project'\n        }\n        else if (property.name === 'model_identifier') {\n            entry.label = 'Object ID'\n            entry.description = 'The registered id of the object this model represents, for exporting purposes'\n            entry.placeholder = getObjectIdPlaceholder()\n        }\n\n        switch (property.type) {\n            case 'boolean':\n                entry.type = 'checkbox'\n                break;\n            case 'string':\n                entry.type = 'text';\n                break;\n            default:\n                if (property.options) {\n                    entry['options'] = typeof property.options == 'function' ? property.options() : property.options;\n                    entry.type = 'select';\n                }\n                break;\n        }\n    }\n\n    if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name'])\n        delete form['name'];\n\n    form['uv_mode'] = {\n        label: 'dialog.project.default_uv_mode',\n        description: 'dialog.project.default_uv_mode.description',\n        type: 'select',\n        condition: Format.optional_box_uv,\n        options: {\n            face_uv: 'dialog.project.uv_mode.face_uv',\n            box_uv: 'dialog.project.uv_mode.box_uv',\n        },\n        value: Project.box_uv ? 'box_uv' : 'face_uv',\n    };\n\n    form['texture_size'] = {\n        label: 'dialog.project.texture_size',\n        type: 'vector',\n        dimensions: 2,\n        value: [Project.texture_width, Project.texture_height],\n        min: 1\n    };\n\n    return form;\n}\n\n/**\n * Create the 'new project' popup dialogue for GeckoLib projects.\n * <p>\n * The contents of this is mostly a copy of <code>project.js</code> \"project_window\" action declaration (Copyright Blockbench)<br>\n * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility\n * @return false if the user clicks <code>cancel</code>, otherwise true\n */\nfunction createProjectSettingsDialog(Project: ModelProject, form: {[formElement: string]: '_' | DialogFormElement}) {\n    const dialog = new Dialog({\n        id: 'project',\n        title: 'dialog.project.title',\n        width: 500,\n        form,\n        onConfirm: function(formResult) {\n            let save;\n            const box_uv = formResult['uv_mode'] == 'box_uv';\n            const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity);\n            const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity);\n\n            if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) {\n                // Adjust UV Mapping if resolution changed\n                if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) {\n                    save = Undo.initEdit({elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true} as UndoAspects)\n\n                    Cube.all.forEach(cube => {\n                        for (const key in cube.faces) {\n                            const uv = cube.faces[key].uv;\n                            uv[0] *= texture_width / Project.texture_width;\n                            uv[2] *= texture_width / Project.texture_width;\n                            uv[1] *= texture_height / Project.texture_height;\n                            uv[3] *= texture_height / Project.texture_height;\n                        }\n                    })\n                    Mesh.all.forEach(mesh => {\n                        for (const key in mesh.faces) {\n                            const uv = mesh.faces[key].uv;\n\n                            for (const vkey in uv) {\n                                uv[vkey][0] *= texture_width / Project.texture_width;\n                                uv[vkey][1] *= texture_height / Project.texture_height;\n                            }\n                        }\n                    })\n                }\n                // Convert UV mode per element\n                if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) {\n                    if (!save)\n                        save = Undo.initEdit({elements: Cube.all, uv_only: true, uv_mode: true} as UndoAspects);\n\n                    Cube.all.forEach(cube => cube.setUVMode(box_uv));\n                }\n\n                if (!save)\n                    save = Undo.initEdit({uv_mode: true});\n\n                Project.texture_width = texture_width;\n                Project.texture_height = texture_height;\n\n                if (Format.optional_box_uv)\n                    Project.box_uv = box_uv;\n\n                Canvas.updateAllUVs();\n                updateSelection();\n            }\n\n            const properties = ModelProject['properties'];\n\n            for (const key in properties) {\n                properties[key].merge(Project, formResult);\n            }\n\n            Project.name = Project.name.trim();\n            Project.model_identifier = Project.model_identifier.trim();\n\n            if (save)\n                Undo.finishEdit('Change project UV settings');\n\n            Blockbench.dispatchEvent('update_project_settings', formResult);\n            BARS.updateConditions();\n\n            if (Project.EditSession) {\n                const metadata = {\n                    texture_width: Project.texture_width,\n                    texture_height: Project.texture_height,\n                    box_uv: Project.box_uv\n                };\n\n                for (const key in properties) {\n                    properties[key].copy(Project, metadata);\n                }\n\n                Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata));\n            }\n\n            const modelType = GeckoModelType[formResult[PROPERTY_MODEL_TYPE]]\n            Project[PROPERTY_MODEL_TYPE] = modelType;\n\n            if (modelType == GeckoModelType.ITEM)\n                Project.parent = 'builtin/entity';\n\n            if (Project.name === Format.name || Project.name === '')\n                Project.name = \"GeckoLib \" + Project[PROPERTY_MODEL_TYPE];\n\n            switch (modelType) {\n                case GeckoModelType.ARMOR:\n                    if (Outliner.root.length === 0) {\n                        Codecs.project.parse(armorTemplate, null);\n                    }\n                    else {\n                        alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.')\n\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n            }\n\n            Format.display_mode = modelType === GeckoModelType.ITEM || settings[SETTING_ALWAYS_SHOW_DISPLAY].value;\n\n            dialog.hide();\n        },\n        onFormChange(formResult) {\n            try {\n                document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult)\n            }// eslint-disable-next-line no-empty\n            catch (ex) {}\n        },\n    })\n\n    dialog.show()\n\n    return true;\n}\n\n/**\n * Export the item display json\n * <p>\n * Only called for GeckoLib projects\n */\nexport function buildDisplaySettingsJson(options = {}) {\n    if (!Project)\n        return;\n\n    const modelProperties: any = {}\n\n    if (options['comment'] || settings.credit.value)\n        modelProperties.credit = settings.credit.value\n\n    if (options['parent'] || Project.parent != '')\n        modelProperties.parent = Project.parent\n\n    if (options['ambientocclusion'] || Project.ambientocclusion === false)\n        modelProperties.ambientocclusion = false\n\n    if (Project.texture_width !== 16 || Project.texture_height !== 16)\n        modelProperties.texture_size = [Project.texture_width, Project.texture_height]\n\n    if (options['front_gui_light'] || Project.front_gui_light)\n        modelProperties.gui_light = 'front';\n\n    if (options['overrides'] || Project.overrides)\n        modelProperties.overrides = Project.overrides;\n\n    if (options['display'] || !isEmpty(Project.display_settings)) {\n        const nonDefaultDisplays = {}\n\n        for (const slot in DisplayMode.slots) {\n            const perspective = DisplayMode.slots[slot]\n            // eslint-disable-next-line no-prototype-builtins\n            if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) {\n                const display: any = Project.display_settings[perspective].export();\n\n                if (display)\n                    nonDefaultDisplays[perspective] = display\n            }\n\n        }\n\n        if (!isEmpty(nonDefaultDisplays))\n            modelProperties.display = nonDefaultDisplays\n    }\n\n    if (options['textures'] || !isEmpty(Project.textures)) {\n        for (const texture of Project.textures) {\n            if (texture.particle || (settings[SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) {\n                let name = texture.name;\n\n                if (name.indexOf(\".png\") > 0)\n                    name = name.substring(0, name.indexOf(\".png\"))\n\n                if (!isValidPath(name)) {\n                    name = name.toLowerCase().replace(\" \", \"_\")\n\n                    if (!isValidPath(name))\n                        continue;\n                }\n\n                name = (Project[PROPERTY_MODEL_TYPE] == GeckoModelType.BLOCK ? \"block/\" : \"item/\") + name;\n\n                if (Project[PROPERTY_MODID])\n                    name = Project[PROPERTY_MODID] + \":\" + name\n\n                modelProperties.textures = {'particle': name};\n\n                break\n            }\n        }\n    }\n\n    Blockbench.export({\n        resource_id: 'model',\n        type: Codecs.java_block.name,\n        extensions: ['json'],\n        name: Project.model_identifier ? (Project.model_identifier + \".json\") : codec.fileName().replace(\".geo\", \"\"),\n        startpath: Project[PROPERTY_FILEPATH_CACHE].display,\n        content: JSON.stringify(modelProperties, null, 2),\n    }, file_path => {\n        const oldPath = Project[PROPERTY_FILEPATH_CACHE].display;\n        Project[PROPERTY_FILEPATH_CACHE].display = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n        if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].display)\n            Project.saved = false;\n    });\n\n    return this;\n}\n\nexport default codec;"
  },
  {
    "path": "plugins/animation_utils/src/ts/constants.ts",
    "content": "/**\n * GeckoLib plugin model format ID. Used to identify model types generated from this plugin\n */\nexport const GECKOLIB_MODEL_ID = \"animated_entity_model\"\n\n// Setting name constants\nexport const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture';\nexport const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display';\nexport const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations';\nexport const SETTING_DEFAULT_MODID = 'geckolib_default_modid';\nexport const BAKE_IN_BEZIER_KEYFRAMES = \"geckolib_bake_in_bezier_keyframes\";\n\n// Property name constants\nexport const PROPERTY_MODID = 'geckolib_modid';\nexport const PROPERTY_MODEL_TYPE = 'geckolib_model_type';\nexport const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache';\n\n/**\n * Available GeckoLib model types\n */\nexport enum GeckoModelType {\n    ENTITY = 'Entity',\n    BLOCK = 'Block',\n    ITEM = 'Item',\n    ARMOR = 'Armor',\n    OBJECT = 'Object'\n}\n\n/**\n * Statically defined type for the filepath cache property, for ease of use\n */\nexport type GeckoFilepathCache = {model?: string, animation?: string, display?: string}"
  },
  {
    "path": "plugins/animation_utils/src/ts/easing.ts",
    "content": "// The MIT license notice below applies to the function findIntervalBorderIndex\n/* The MIT License (MIT)\n\nCopyright (c) 2015 Boris Chumichev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n *\n * Utilizes bisection method to search an interval to which\n * point belongs to, then returns an index of left or right\n * border of the interval\n *\n * @param {Number} point\n * @param {Array} intervals\n * @param {Boolean} useRightBorder\n * @returns {Number}\n */\nfunction findIntervalBorderIndex(point: number, intervals: number[], useRightBorder: boolean) {\n    //If point is beyond given intervals\n    if (point < intervals[0])\n        return 0\n\n    if (point > intervals[intervals.length - 1])\n        return intervals.length - 1\n\n    //If point is inside interval\n    //Start searching on a full range of intervals\n    let indexOfNumberToCompare = 0;\n    let leftBorderIndex = 0;\n    let rightBorderIndex = intervals.length - 1\n\n    //Reduce searching range till it find an interval point belongs to using binary search\n    while (rightBorderIndex - leftBorderIndex !== 1) {\n        indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2)\n        point >= intervals[indexOfNumberToCompare] ?\n            leftBorderIndex = indexOfNumberToCompare :\n            rightBorderIndex = indexOfNumberToCompare\n  }\n\n  return useRightBorder ? rightBorderIndex : leftBorderIndex\n}\n\nfunction stepRange(steps: number, stop = 1) {\n    if (steps < 2)\n        throw new Error(\"steps must be > 2, got:\" + steps);\n\n    const stepLength = stop / steps;\n\n    return Array.from({length: steps}, (_, i) => i * stepLength);\n}\n\ntype EasingFunction = (t: number) => number;\ntype EasingDirection = (easing: EasingFunction) => EasingFunction;\n\n// The MIT license notice below applies to the Easing class\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 */\nclass Easing {\n    /**\n     * A stepping function, returns 1 for any positive value of `n`.\n     */\n    static step0(n: number) {\n        return n > 0 ? 1 : 0;\n    }\n    /**\n     * A stepping function, returns 1 if `n` is greater than or equal to 1.\n     */\n    static step1(n: number) {\n        return n >= 1 ? 1 : 0;\n    }\n    /**\n     * A linear function, `f(t) = t`. Position correlates to elapsed time one to\n     * one.\n     *\n     * http://cubic-bezier.com/#0,0,1,1\n     */\n    static linear(t: number) {\n        return t;\n    }\n    /**\n     * A simple inertial interaction, similar to an object slowly accelerating to\n     * speed.\n     *\n     * http://cubic-bezier.com/#.42,0,1,1\n     */\n    // static ease(t) {\n    //     if (!ease) {\n    //         ease = Easing.bezier(0.42, 0, 1, 1);\n    //     }\n    //     return ease(t);\n    // }\n    /**\n     * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInQuad\n     */\n    static quad(t: number) {\n        return t * t;\n    }\n    /**\n     * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInCubic\n     */\n    static cubic(t: number) {\n        return t * t * t;\n    }\n    /**\n     * A power function. Position is equal to the Nth power of elapsed time.\n     *\n     * n = 4: http://easings.net/#easeInQuart\n     * n = 5: http://easings.net/#easeInQuint\n     */\n    static poly(n: number) {\n        return (t: number) => Math.pow(t, n);\n    }\n    /**\n     * A sinusoidal function.\n     *\n     * http://easings.net/#easeInSine\n     */\n    static sin(t: number) {\n        return 1 - Math.cos((t * Math.PI) / 2);\n    }\n    /**\n     * A circular function.\n     *\n     * http://easings.net/#easeInCirc\n     */\n    static circle(t: number) {\n        return 1 - Math.sqrt(1 - t * t);\n    }\n    /**\n     * An exponential function.\n     *\n     * http://easings.net/#easeInExpo\n     */\n    static exp(t: number) {\n        return Math.pow(2, 10 * (t - 1));\n    }\n    /**\n     * A simple elastic interaction, similar to a spring oscillating back and\n     * forth.\n     *\n     * Default bounciness is 1, which overshoots a little bit once. 0 bounciness\n     * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N\n     * times.\n     *\n     * http://easings.net/#easeInElastic\n     */\n    static elastic(bounciness = 1) {\n        const p = bounciness * Math.PI;\n        return (t: number) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p);\n    }\n    /**\n     * Use with `Animated.parallel()` to create a simple effect where the object\n     * animates back slightly as the animation starts.\n     *\n     * Wolfram Plot:\n     *\n     * - http://tiny.cc/back_default (s = 1.70158, default)\n     */\n    static back(s = 1.70158) {\n        return (t: number) => t * t * ((s + 1) * t - s);\n    }\n    /**\n     * Provides a simple bouncing effect.\n     *\n     * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up\n     * using min instead of ternaries\n     * http://easings.net/#easeInBounce\n     */\n    static bounce(k = 0.5) {\n      const q = (x: number) => (121 / 16) * x * x;\n      const w = (x: number) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k;\n      const r = (x: number) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k;\n      const t = (x: number) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k;\n      return (x: number) => Math.min(q(x), w(x), r(x), t(x));\n    }\n\n    /**\n     * Provides a cubic bezier curve, equivalent to CSS Transitions'\n     * `transition-timing-function`.\n     *\n     * A useful tool to visualize cubic bezier curves can be found at\n     * http://cubic-bezier.com/\n     */\n    // static bezier(x1, y1, x2, y2) {\n    //     const _bezier = require('./bezier');\n    //     return _bezier(x1, y1, x2, y2);\n    // }\n    /**\n     * Runs an easing function forwards.\n     */\n    static in(easing: EasingFunction) {\n        return easing;\n    }\n    /**\n     * Runs an easing function backwards.\n     */\n    static out(easing: EasingFunction) {\n        return (t: number) => 1 - easing(1 - t);\n    }\n    /**\n     * Makes any easing function symmetrical. The easing function will run\n     * forwards for half of the duration, then backwards for the rest of the\n     * duration.\n     */\n    static inOut(easing: EasingFunction) {\n        return (t: number) => {\n            if (t < 0.5) {\n                return easing(t * 2) / 2;\n            }\n            return 1 - easing((1 - t) * 2) / 2;\n        };\n    }\n}\n\nconst quart = Easing.poly(4);\nconst quint = Easing.poly(5);\nconst back = (direction: EasingDirection, scalar: number, t: number) => direction(Easing.back(1.70158 * scalar))(t);\nconst elastic = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.elastic(bounciness))(t);\nconst bounce = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.bounce(bounciness))(t);\n\nexport const easingFunctions = {\n  linear: Easing.linear,\n  step(steps, x) {\n    const intervals = stepRange(steps);\n    return intervals[findIntervalBorderIndex(x, intervals, false)];\n  },\n  easeInQuad: Easing.in(Easing.quad),\n  easeOutQuad: Easing.out(Easing.quad),\n  easeInOutQuad: Easing.inOut(Easing.quad),\n  easeInCubic: Easing.in(Easing.cubic),\n  easeOutCubic: Easing.out(Easing.cubic),\n  easeInOutCubic: Easing.inOut(Easing.cubic),\n  easeInQuart: Easing.in(quart),\n  easeOutQuart: Easing.out(quart),\n  easeInOutQuart: Easing.inOut(quart),\n  easeInQuint: Easing.in(quint),\n  easeOutQuint: Easing.out(quint),\n  easeInOutQuint: Easing.inOut(quint),\n  easeInSine: Easing.in(Easing.sin),\n  easeOutSine: Easing.out(Easing.sin),\n  easeInOutSine: Easing.inOut(Easing.sin),\n  easeInExpo: Easing.in(Easing.exp),\n  easeOutExpo: Easing.out(Easing.exp),\n  easeInOutExpo: Easing.inOut(Easing.exp),\n  easeInCirc: Easing.in(Easing.circle),\n  easeOutCirc: Easing.out(Easing.circle),\n  easeInOutCirc: Easing.inOut(Easing.circle),\n  easeInBack: back.bind(null, Easing.in),\n  easeOutBack: back.bind(null, Easing.out),\n  easeInOutBack: back.bind(null, Easing.inOut),\n  easeInElastic: elastic.bind(null, Easing.in),\n  easeOutElastic: elastic.bind(null, Easing.out),\n  easeInOutElastic: elastic.bind(null, Easing.inOut),\n  easeInBounce: bounce.bind(null, Easing.in),\n  easeOutBounce: bounce.bind(null, Easing.out),\n  easeInOutBounce: bounce.bind(null, Easing.inOut),\n};\n\nexport type EasingKey = keyof typeof easingFunctions;\n\n// Object with the same keys as easingFunctions and values of the stringified key names\nexport const EASING_OPTIONS = Object.freeze(Object.fromEntries(\n  Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]]))\n) as { [Property in EasingKey]: string });\nexport const EASING_DEFAULT = 'linear';\n\nexport interface EasingProperties {\n  easing?: EasingKey | null;\n  easingArgs?: number[];\n}\n\nexport type GeckolibKeyframe = _Keyframe & EasingProperties;\n\nexport const getEasingArgDefault = (kf: GeckolibKeyframe): number => {\n  switch (kf.easing) {\n    case EASING_OPTIONS.easeInBack:\n    case EASING_OPTIONS.easeOutBack:\n    case EASING_OPTIONS.easeInOutBack:\n    case EASING_OPTIONS.easeInElastic:\n    case EASING_OPTIONS.easeOutElastic:\n    case EASING_OPTIONS.easeInOutElastic:\n      return 1;\n    case EASING_OPTIONS.easeInBounce:\n    case EASING_OPTIONS.easeOutBounce:\n    case EASING_OPTIONS.easeInOutBounce:\n      return 0.5;\n    case EASING_OPTIONS.step:\n      return 5;\n    default:\n      return null;\n  }\n};\n\nexport const parseEasingArg = (kf: GeckolibKeyframe, value: string) => {\n  switch(kf.easing) {\n    case EASING_OPTIONS.easeInBack:\n    case EASING_OPTIONS.easeOutBack:\n    case EASING_OPTIONS.easeInOutBack:\n    case EASING_OPTIONS.easeInElastic:\n    case EASING_OPTIONS.easeOutElastic:\n    case EASING_OPTIONS.easeInOutElastic:\n    case EASING_OPTIONS.easeInBounce:\n    case EASING_OPTIONS.easeOutBounce:\n    case EASING_OPTIONS.easeInOutBounce:\n      return parseFloat(value);\n    case EASING_OPTIONS.step:\n      return Math.max(parseInt(value, 10), 2);\n    default:\n      return parseInt(value, 10);\n  }\n};\n\nexport function reverseEasing(easing?: EasingKey): EasingKey {\n  if (!easing)\n      return easing;\n\n  if (easing.startsWith(\"easeInOut\"))\n      return easing;\n\n  if (easing.startsWith(\"easeIn\"))\n      return easing.replace(\"easeIn\", \"easeOut\") as EasingKey;\n\n  if (easing.startsWith(\"easeOut\"))\n      return easing.replace(\"easeOut\", \"easeIn\") as EasingKey;\n\n  return easing;\n}\n\nexport const isArgsEasing = (easing = \"\") =>\n    easing.includes(\"Back\") ||\n    easing.includes(\"Elastic\") ||\n    easing.includes(\"Bounce\") ||\n    easing === EASING_OPTIONS.step;\n"
  },
  {
    "path": "plugins/animation_utils/src/ts/events.ts",
    "content": "import {\n    addCodecCallback,\n    addEventListener,\n    addMonkeypatch, hasModelDisplaySettings, isGeckoLibModel, Monkeypatches,\n    onlyIfGeckoLib,\n    removeCodecCallback,\n    removeEventListener, removeMonkeypatches\n} from \"./utils\";\nimport {GeckolibBoneAnimator} from \"./keyframe\";\nimport {\n    BAKE_IN_BEZIER_KEYFRAMES,\n    GeckoModelType,\n    PROPERTY_FILEPATH_CACHE,\n    PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY,\n    SETTING_REMEMBER_EXPORT_LOCATIONS\n} from \"./constants\";\nimport {openProjectSettingsDialog} from \"./codec\";\nimport {GeckolibKeyframe} from \"./easing\";\n\nexport function addEventListeners() {\n    addCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse))\n    addCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile))\n    addEventListener('select_mode', onlyIfGeckoLib(onModeSelect));\n    addEventListener('select_project', onlyIfGeckoLib(onProjectSelect));\n    addEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged));\n    addEventListener('save_project', onlyIfGeckoLib(onProjectSave));\n    addMonkeypatch(Animator, null, \"buildFile\", monkeypatchAnimatorBuildFile);\n    addMonkeypatch(Animator, null, \"loadFile\", monkeypatchAnimatorLoadFile);\n    addMonkeypatch(Blockbench, null, \"export\", monkeypatchBlockbenchExport);\n    addMonkeypatch(BarItems, 'project_window', \"click\", monkeypatchProjectWindowClick);\n}\n\nexport function removeEventListeners() {\n    removeCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse))\n    removeCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile))\n    removeEventListener('select_mode', onlyIfGeckoLib(onModeSelect));\n    removeEventListener('select_project', onlyIfGeckoLib(onProjectSelect));\n    removeEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged));\n    removeMonkeypatches();\n}\n\n/**\n * When an existing GeckoLib project is being read from file\n */\nfunction onProjectParse(e: any) {\n    onSettingsChanged();\n\n    // Because the project hasn't had its model properties applied at this stage\n    Format.display_mode = (e.model[PROPERTY_MODEL_TYPE] && e.model[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value;\n}\n\n/**\n * When the Blockbench project is being saved\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSave(e: {model: object, options: any }) {\n    if (!settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value)\n        e.model[PROPERTY_FILEPATH_CACHE] = {}\n}\n\n/**\n * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onSettingsChanged() {\n    Modes.selected.select();\n\n    Format.display_mode = hasModelDisplaySettings();\n\n    if (Project instanceof ModelProject && Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) {\n        Project.parent = 'builtin/entity';\n        Project.saved = false;\n    }\n}\n\n/**\n * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSelect() {\n    onSettingsChanged()\n}\n\n/**\n * When selecting edit/paint/display/animate/etc\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onModeSelect(e: any) {\n    // Offset the display emulator to account for GeckoLib's +0.51 manual offset\n    // This is a legacy patch as Blockbench no longer does this internally\n    if (e.mode.id == 'display')\n        (Project as ModelProject).model_3d.position.y = 0;\n}\n\n/**\n * When the model geometry is being compiled for export\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onBedrockCompile(e: any) {\n    // Remove display transforms from non-bedrock geometry\n    e.model[\"minecraft:geometry\"]?.forEach((geo: Map<string, any>) => delete geo[\"item_display_transforms\"])\n\n    // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established\n    switch (e.model.format_version) {\n        case \"1.14.0\":\n        case \"1.21.0\":\n        case \"1.21.20\":\n            e.model.format_version = \"1.12.0\"\n            break;\n        default:\n            break;\n    }\n}\n\n/**\n * When the project settings window is being opened, either via a new project or the File -> Project... menu item\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchProjectWindowClick() {\n    if (isGeckoLibModel()) {\n        openProjectSettingsDialog();\n    }\n    else {\n       Monkeypatches.get(BarItems).click();\n    }\n}\n\n/**\n * When any file is being exported to disk by Blockbench\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchBlockbenchExport(options, cb) {\n    if (!isGeckoLibModel()) {\n        Monkeypatches.get(Blockbench).export(options, cb);\n\n        return;\n    }\n\n    if (Project instanceof ModelProject) {\n        if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON\n            const fileName = Project.model_identifier && Project.model_identifier + \".animation\";\n            options.startpath = Project[PROPERTY_FILEPATH_CACHE].animation;\n            const parentCallback = cb;\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n\n                const oldPath = Project[PROPERTY_FILEPATH_CACHE].animation;\n                Project[PROPERTY_FILEPATH_CACHE].animation = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n                if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].animation)\n                    Project.saved = false;\n            }\n\n            if (fileName)\n                options.name = fileName;\n        }\n        else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo\n            const fileName = Project.model_identifier && Project.model_identifier + \".geo\";\n            options.startpath = Project[PROPERTY_FILEPATH_CACHE].model;\n            const parentWriter = options.custom_writer;\n            const parentCallback = cb;\n\n            if (parentWriter) {\n                options.custom_writer = (content, filePath, callback) => {\n                    parentWriter(content, filePath, callback);\n                    callback(filePath)\n                }\n            }\n\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n\n                const oldPath = Project[PROPERTY_FILEPATH_CACHE].model;\n                Project[PROPERTY_FILEPATH_CACHE].model = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n                if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].model)\n                    Project.saved = false;\n            }\n\n            if (fileName)\n                options.name = fileName;\n        }\n    }\n\n    Monkeypatches.get(Blockbench).export(options, cb);\n}\n\n/**\n * When the animation file is being loaded into the project\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchAnimatorLoadFile(file, exportingAnims) {\n    // eslint-disable-next-line no-undef\n    const json = file.json || autoParseJSON(file.content);\n    const path = file.path;\n    const new_animations = [];\n\n    function geoLoopToBbLoop(jsonLoop) {\n        if (jsonLoop) {\n            if (typeof jsonLoop === 'boolean')\n                return jsonLoop ? 'loop' : 'once'\n\n            if (typeof jsonLoop === 'string') {\n                if (jsonLoop === \"hold_on_last_frame\")\n                    return 'hold'\n\n                if (jsonLoop === \"loop\" || jsonLoop === \"true\")\n                    return 'loop'\n            }\n        }\n\n        return 'once'\n    }\n\n    function getKeyframeDataPoints(source: any) {\n        if (source instanceof Array)\n            return [{x: source[0], y: source[1], z: source[2],}]\n\n        if (['number', 'string'].includes(typeof source))\n            return [{x: source, y: source, z: source}]\n\n        if (typeof source == 'object') {\n            if (source.vector)\n                return getKeyframeDataPoints(source.vector);\n\n            const points = [];\n\n            if (source.pre)\n                points.push(getKeyframeDataPoints(source.pre)[0])\n\n            if (source.post)\n                points.push(getKeyframeDataPoints(source.post)[0])\n\n            return points;\n        }\n    }\n\n    if (json && typeof json.animations === 'object') {\n        for (const animName in json.animations) {\n            if (exportingAnims && !exportingAnims.includes(animName))\n                continue;\n\n            //Animation\n            const animData = json.animations[animName]\n            const animation = new Blockbench.Animation({\n                name: animName,\n                path,\n                loop: geoLoopToBbLoop(animData.loop),\n                override: animData.override_previous_animation,\n                anim_time_update: (typeof animData.anim_time_update == 'string'\n                    ? animData.anim_time_update.replace(/;(?!$)/, ';\\n')\n                    : animData.anim_time_update),\n                blend_weight: (typeof animData.blend_weight == 'string'\n                    ? animData.blend_weight.replace(/;(?!$)/, ';\\n')\n                    : animData.blend_weight),\n                length: animData.animation_length\n            }).add()\n            //Bones\n            if (animData.bones) {\n                for (const boneName in animData.bones) {\n                    const bone = animData.bones[boneName]\n                    const lowercase_bone_name = boneName.toLowerCase();\n                    const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name)\n                    const uuid = group ? group.uuid : guid();\n                    let ga : GeneralAnimator; // eslint-disable-line @typescript-eslint/no-unused-vars\n\n                    const boneAnimator = new GeckolibBoneAnimator(uuid, animation, boneName);\n                    animation.animators[uuid] = boneAnimator;\n                    //Channels\n                    for (const channel in bone) {\n                        if (Animator.possible_channels[channel]) {\n                            if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing,\n                                    easingArgs: bone[channel].easingArgs,\n                                    data_points: getKeyframeDataPoints(bone[channel]),\n                                })\n                            }\n                            else if (typeof bone[channel] === 'object' && bone[channel].post) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing == \"bezier\" ? undefined : bone[channel].easing,\n                                    easingArgs: bone[channel].easingArgs,\n                                    interpolation: bone[channel].easing == \"bezier\" ? \"bezier\" : bone[channel].lerp_mode,\n                                    data_points: getKeyframeDataPoints(bone[channel]),\n                                    bezier_right_time: bone[channel].right_time,\n                                    bezier_left_time: bone[channel].left_time,\n                                    bezier_left_value: bone[channel].left,\n                                    bezier_right_value: bone[channel].right\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object') {\n                                for (const timestamp in bone[channel]) {\n                                    boneAnimator.addKeyframe({\n                                        time: parseFloat(timestamp),\n                                        channel,\n                                        easing: bone[channel][timestamp].easing == \"bezier\" ? undefined : bone[channel][timestamp].easing,\n                                        easingArgs: bone[channel][timestamp].easingArgs,\n                                        interpolation: bone[channel][timestamp].easing == \"bezier\" ? \"bezier\" : bone[channel][timestamp].lerp_mode,\n                                        data_points: getKeyframeDataPoints(bone[channel][timestamp]),\n                                        bezier_right_time: bone[channel][timestamp].right_time,\n                                        bezier_left_time: bone[channel][timestamp].left_time,\n                                        bezier_left_value: bone[channel][timestamp].left,\n                                        bezier_right_value: bone[channel][timestamp].right\n                                    });\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            if (animData.sound_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.sound_effects) {\n                    const sounds = animData.sound_effects[timestamp];\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'sound',\n                        time: parseFloat(timestamp),\n                        data_points: sounds instanceof Array ? sounds : [sounds]\n                    })\n                }\n            }\n\n            if (animData.particle_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.particle_effects) {\n                    let particles = animData.particle_effects[timestamp];\n\n                    if (!(particles instanceof Array))\n                        particles = [particles];\n\n                    particles.forEach(particle => {\n                        if (particle)\n                            particle.script = particle.pre_effect_script;\n                    })\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'particle',\n                        time: parseFloat(timestamp),\n                        data_points: particles\n                    })\n                }\n            }\n\n            if (animData.timeline) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.timeline) {\n                    const entry = animData.timeline[timestamp];\n                    const script = entry instanceof Array ? entry.join('\\n') : entry;\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'timeline',\n                        time: parseFloat(timestamp),\n                        data_points: [{script}]\n                    })\n                }\n            }\n\n            animation.calculateSnappingFromKeyframes();\n\n            if (!Blockbench.Animation.selected && Animator.open)\n                animation.select()\n\n            new_animations.push(animation)\n        }\n    }\n\n    return new_animations\n}\n\n/**\n * When the animations JSON is being compiled for export\n * <p>\n * Makes sure bezier keyframes get exported correctly rather than being baked.\n */\nfunction monkeypatchAnimatorBuildFile() {\n    const bezierKeys:GeckolibKeyframe[] = [];\n    if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) {\n        let animation;\n        this.animations.forEach(a => {\n           if (a.name == arguments[1][0]) animation = a;\n           return;\n        });\n\n        if (animation) {\n            for (const uuid in animation.animators) {\n                const animator = animation.animators[uuid];\n                if (!animator.keyframes.length && !animator.rotation_global) continue;\n                if (animator.type == 'bone') {\n                    for (const channel in Animator.possible_channels) {\n                        if (!animator[channel]?.length) continue;\n                        const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time);\n                        sorted_keyframes.forEach((kf: GeckolibKeyframe) => {\n                            if (kf.interpolation == \"bezier\") {\n                                bezierKeys[bezierKeys.length] = kf;\n                                kf.interpolation = \"geckolib_bezier\";\n                            }\n                        });\n                    }\n                }\n            }\n        }\n    }\n    const result = Monkeypatches.get(Animator).buildFile.apply(this, arguments);\n\n    if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) {\n        result.geckolib_format_version = 2\n        bezierKeys.forEach((kf) => {\n            kf.interpolation = \"bezier\";\n            kf.easing = undefined;\n        });\n    }\n\n    return result;\n}"
  },
  {
    "path": "plugins/animation_utils/src/ts/index.ts",
    "content": "import semverCoerce from 'semver/functions/coerce';\nimport semverSatisfies from 'semver/functions/satisfies';\nimport packageJson from '../package.json';\nimport { loadAnimationUI, unloadAnimationUI } from './animationUi';\nimport {hasModelDisplaySettings, isEmpty, isGeckoLibModel, isValidNamespace, make} from './utils';\nimport { loadKeyframeOverrides, unloadKeyframeOverrides } from './keyframe';\nimport codec, {buildDisplaySettingsJson, format} from './codec';\nimport {\n    GeckoFilepathCache,\n    GECKOLIB_MODEL_ID,\n    GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID,\n    SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, BAKE_IN_BEZIER_KEYFRAMES,\n    SETTING_DEFAULT_MODID,\n    SETTING_REMEMBER_EXPORT_LOCATIONS,\n} from \"./constants\";\nimport {addEventListeners, removeEventListeners} from \"./events\";\n\nconst { version, blockbenchConfig } = packageJson;\n\nconst SUPPORTED_BB_VERSION_RANGE = `${blockbenchConfig.min_version} - ${blockbenchConfig.max_version}`;\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst css = require('../resources/easing_keyframes.css').toString();\n\nif (!semverSatisfies(semverCoerce(Blockbench.version), SUPPORTED_BB_VERSION_RANGE))\n  alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`);\n\n// Register the plugin and define what it adds\n(function () {\n  let pluginSettings: Setting[];\n  let pluginProperties: Property[];\n  let pluginMenuItems: { action: Action, menuCategory: string }[];\n\n  BBPlugin.register(\"animation_utils\", Object.assign(\n      {},\n      blockbenchConfig as typeof blockbenchConfig & { variant: 'both' },\n      {\n        name: blockbenchConfig.title,\n        version,\n        await_loading: true,\n        onload() {\n          Blockbench.addCSS(css);\n\n          addEventListeners();\n          loadAnimationUI();\n          loadKeyframeOverrides();\n\n          pluginSettings = createPluginSettings();\n          pluginProperties = createPluginProperties();\n          pluginMenuItems = createPluginMenuItems();\n\n          for (const menuItem of pluginMenuItems as { action: Action, menuCategory: string }[]) {\n            MenuBar.addAction(menuItem.action, menuItem.menuCategory);\n          }\n\n          console.log(\"Loaded GeckoLib plugin\")\n        },\n        onunload() {\n          for (const setting of pluginSettings) {\n            setting.delete();\n          }\n\n          for (const property of pluginProperties) {\n            property.delete();\n          }\n\n          for (const menuItem of pluginMenuItems) {\n            menuItem.action.delete();\n          }\n\n          unloadKeyframeOverrides();\n          unloadAnimationUI();\n          removeEventListeners()\n          format.delete();\n          console.clear();\n        },\n      }\n  ));\n})();\n\n/**\n * Create and return the plugin's settings.\n * <p>\n * These are found in the Settings panel in the plugin info window\n */\nfunction createPluginSettings(): Setting[] {\n  return [\n    new Setting(SETTING_AUTO_PARTICLE_TEXTURE, {\n      value: true,\n      category: \"export\",\n      name: \"Auto-compute block/item particle texture\",\n      description: \"Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json\"\n    }),\n    new Setting(BAKE_IN_BEZIER_KEYFRAMES, {\n      value: false,\n      category: \"export\",\n      name: \"Bake in bezier keyframes\",\n      description: \"When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier.\"\n    }),\n    new Setting(SETTING_ALWAYS_SHOW_DISPLAY, {\n      value: false,\n      category: \"edit\",\n      name: \"Always show display tab\",\n      description: \"Force the Display tab to always show, even when not an Item type model\"\n    }),\n    new Setting(SETTING_REMEMBER_EXPORT_LOCATIONS, {\n      value: true,\n      category: \"export\",\n      name: \"Remember file export locations\",\n      description: \"Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file.\"\n    }),\n    make(\n        new Setting(SETTING_DEFAULT_MODID, {\n          // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          type: 'text',\n          value: \"\",\n          category: \"export\",\n          name: \"Default Mod ID\",\n          description: \"Default Mod ID for models (if applicable)\"\n        }),\n        setting => {\n          setting.onChange = function() {\n            const invalidNamespaceChar = new RegExp('[^_\\\\-.a-z0-9]+', 'g')\n            const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g')\n\n            this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidNamespaceChar, \"\")\n\n            return {};\n          }\n        }\n    )\n  ];\n}\n\n/**\n * Create and return the plugin's properties.\n * <p>\n * These are metadata values stored in the project, usually used in project settings windows\n */\nfunction createPluginProperties(): Property[] {\n  return [\n      make(\n          new Property(ModelProject, \"string\", PROPERTY_MODID, {\n              label: \"Mod ID\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              values: [],\n              merge_validation: isValidNamespace\n          }),\n          property => {\n            property['placeholder'] = 'my_modid';\n            property['description'] = 'The modid of the mod this model is for';\n            property.getDefault = function() {\n              return settings[SETTING_DEFAULT_MODID].value;\n            };\n          }\n      ),\n      make(\n          new Property(ModelProject, \"enum\", PROPERTY_MODEL_TYPE, {\n              label: \"Model Type\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              exposed: false,\n              options: GeckoModelType,\n              values: Object.values(GeckoModelType)\n          }),\n          property => {\n            property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure';\n          }\n      ),\n      make(\n          new Property(ModelProject, \"instance\", PROPERTY_FILEPATH_CACHE, {\n              label: \"GeckoLib Filepath Cache\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              exposed: false,\n              values: []\n          }),\n          property => {\n              property.default = {} as GeckoFilepathCache;\n          }\n      )\n  ];\n}\n\n/**\n * Create and return the plugin's menu items\n * <p>\n * These are added to Blockbench's menu bar or submenus\n */\nfunction createPluginMenuItems(): { action: Action, menuCategory: string }[] {\n  return [\n    {\n      action: new Action(\"export_geckolib_model\", {\n        name: \"Export GeckoLib Model\",\n        icon: \"archive\",\n        description: \"Export your model geometry as a model for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel(),\n        click: function () {\n          codec.export();\n        },\n      }),\n      menuCategory: 'file.export'\n    },\n    {\n      action: new Action(\"export_geckolib_display\", {\n        name: \"Export GeckoLib Display Settings\",\n        icon: \"icon-bb_interface\",\n        description: \"Export your item/block display settings for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel() && hasModelDisplaySettings(),\n        click: buildDisplaySettingsJson,\n      }),\n      menuCategory: 'file.export'\n    },\n    {\n      action: new Action(\"export_geckolib_animations\", {\n        name: \"Export GeckoLib Animations\",\n        icon: \"movie\",\n        description: \"Export your model animations for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel() && !isEmpty(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object',\n        click: e => (BarItems['export_animation_file'] as Action).trigger(e),\n      }),\n      menuCategory: 'file.export'\n    }\n  ];\n}\n"
  },
  {
    "path": "plugins/animation_utils/src/ts/keyframe.ts",
    "content": "import groupBy from 'lodash/groupBy';\nimport mapValues from 'lodash/mapValues';\nimport {addMonkeypatch, Monkeypatches} from './utils';\nimport {\n    EASING_DEFAULT,\n    easingFunctions, type EasingKey,\n    EasingProperties,\n    GeckolibKeyframe,\n    getEasingArgDefault, isArgsEasing,\n    reverseEasing\n} from './easing';\nimport Keyframe = Blockbench.Keyframe;\n\nexport function loadKeyframeOverrides() {\n    addMonkeypatch(Keyframe, \"prototype\", \"getLerp\", keyframeGetLerp);\n    addMonkeypatch(Keyframe, \"prototype\", \"compileBedrockKeyframe\", keyframeCompileBedrock);\n    addMonkeypatch(Keyframe, \"prototype\", \"getUndoCopy\", keyframeGetUndoCopy);\n    addMonkeypatch(Keyframe, \"prototype\", \"extend\", keyframeExtend);\n\n    addMonkeypatch(BarItems.reverse_keyframes, null, \"click\", onReverseKeyframes);\n}\n\nexport function unloadKeyframeOverrides() {\n    //No-op for now since monkeypatches are unloaded automatically\n}\n\ninterface GeckolibKeyframeOptions extends KeyframeOptions {\n    easing: EasingKey\n    easingArgs: number[] | null | undefined\n}\n\n// This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch\nexport class GeckolibBoneAnimator extends BoneAnimator {\n    public addKeyframe(data: GeckolibKeyframeOptions, uuid?: string): _Keyframe {\n        const keyframe = super.addKeyframe(data, uuid);\n        if (data.bezier_left_time)\n            keyframe.bezier_left_time = data.bezier_left_time;\n        if (data.bezier_right_time)\n            keyframe.bezier_right_time = data.bezier_right_time;\n        if (data.bezier_right_value)\n            keyframe.bezier_right_value = data.bezier_right_value;\n        if (data.bezier_left_value)\n            keyframe.bezier_left_value = data.bezier_left_value;\n        return keyframe;\n    }\n}\n\nfunction lerp(start: number, stop: number, amt: number) {\n    return amt * (stop - start) + start;\n}\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nfunction keyframeGetLerp(other, axis, amount, allow_expression) {\n    const easing = other.easing || EASING_DEFAULT;\n    if (Format.id !== \"animated_entity_model\") {\n        return Monkeypatches.get(Keyframe).getLerp.apply(this, arguments);\n    }\n    let easingFunc = easingFunctions[easing];\n    if (isArgsEasing(easing)) {\n        const arg1 = Array.isArray(other.easingArgs) && other.easingArgs.length > 0\n            ? other.easingArgs[0]\n            : getEasingArgDefault(other);\n        // console.log(`keyframeGetLerp arg1: ${arg1}`);\n        easingFunc = easingFunc.bind(null, arg1);\n    }\n    const easedAmount = easingFunc(amount);\n    const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1);\n    const stop = other.calc(axis);\n    const result = lerp(start, stop, easedAmount);\n    // console.log('keyframeGetLerp easing:', easing, 'arguments:', arguments, 'start:', start, 'stop:', stop, 'amount:', amount, 'easedAmount:', easedAmount, 'result:', result);\n    if (Number.isNaN(result)) {\n        throw new Error('batman');\n    }\n    return result;\n}\n\nfunction geckolibGetArray(data_point: number = 0) {\n    const {easing, easingArgs, getArray} = this;\n    let result = getArray.apply(this, [data_point]);\n    if (this.interpolation == \"geckolib_bezier\") {\n        result = {vector: result, easing: \"bezier\", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time};\n    } else if (Format.id === \"animated_entity_model\") {\n        if (this.data_points.length != 1)\n            result = {pre: result, post: getArray.apply(this, [1]), easing};\n        else result = {vector: result, easing};\n        if (isArgsEasing(easing)) result.easingArgs = easingArgs;\n    }\n    return result;\n}\n\n\nfunction keyframeCompileBedrock() {\n    if (Format.id !== \"animated_entity_model\" || !this.transform) {\n        return Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments);\n    }\n\n    if (this.interpolation == 'catmullrom') {\n        const previous = this.getPreviousKeyframe.apply(this)\n        const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom')\n        return {\n            pre: include_pre ? geckolibGetArray.call(this,[0]) : undefined,\n            post: geckolibGetArray.call(this,[include_pre ? 1 : 0]),\n            lerp_mode: this.interpolation,\n        }\n    } else if (this.data_points.length == 1) {\n        return geckolibGetArray.call(this)\n    } else {\n        return geckolibGetArray.call(this,[0])\n    }\n}\n\nfunction keyframeGetUndoCopy() {\n    const {easing, easingArgs} = this;\n    const result = Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments);\n    if (Format.id === \"animated_entity_model\") {\n        Object.assign(result, {easing});\n        if (isArgsEasing(easing)) result.easingArgs = easingArgs;\n    }\n//   console.log('keyframeGetUndoCopy arguments:', arguments, 'this:', this, 'result:', result);\n    return result;\n}\n\nfunction keyframeExtend(dataIn) {\n    const data = Object.assign({}, dataIn);\n//   console.log('keyframeExtend 1 arguments:', arguments);\n    if (Format.id === \"animated_entity_model\") {\n        if (typeof data.values === 'object') {\n            if (data.values.easing !== undefined) {\n                Merge.string(this, data.values, 'easing');\n            }\n            if (Array.isArray(data.values.easingArgs)) {\n                this.easingArgs = data.values.easingArgs;\n            }\n            if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) {\n                // Convert data to format expected by KeyframeExtendOriginal\n                data.values = data.values.vector;\n            }\n        } else {\n            if (data.easing !== undefined) {\n                Merge.string(this, data, 'easing');\n            }\n            if (Array.isArray(data.easingArgs)) {\n                this.easingArgs = data.easingArgs;\n            }\n        }\n    }\n    const result = Monkeypatches.get(Keyframe).extend.apply(this, arguments);\n//   console.log('keyframeExtend 2 arguments:', arguments, 'this:', this, 'result:', result);\n    return result;\n}\n\nfunction onReverseKeyframes() {\n    Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments);\n    // console.log('@@@ onReverseKeyframes selected:', Timeline.selected);\n    // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead\n    Undo.initEdit({keyframes: Timeline.selected})\n    const kfByAnimator = groupBy(Timeline.selected, kf => kf.animator.uuid);\n    const kfByAnimatorAndChannel = mapValues(\n        kfByAnimator,\n        keyframesForAnimator => groupBy(keyframesForAnimator, kf => kf.channel)\n    );\n    Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => {\n        const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid];\n        Object.keys(animatorChannelGroups).forEach(channel => {\n            const channelKeyframes = animatorChannelGroups[channel];\n            // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt\n            channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time);\n            // Reverse easing direction\n            const easingData: EasingProperties[] = channelKeyframes.map((kf: GeckolibKeyframe) => ({\n                easing: reverseEasing(kf.easing),\n                easingArgs: kf.easingArgs\n            }));\n            // console.log('@@@ onReverseKeyframes PRE animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes, 'easingData:', easingData);\n            // Shift easing data to the right by one keyframe\n            channelKeyframes.forEach((kf: GeckolibKeyframe, i: number) => {\n                if (i == 0) {\n                    kf.easing = undefined;\n                    kf.easingArgs = undefined;\n                    return;\n                }\n                const newEasingData = easingData[i - 1];\n                kf.easing = newEasingData.easing;\n                kf.easingArgs = newEasingData.easingArgs;\n            });\n            // console.log('@@@ onReverseKeyframes POST animator:', animatorUuid, 'channel:', channel, 'channelKeyframes:', channelKeyframes);\n        });\n    });\n    // console.log('@@@ kfByAnimator:', kfByAnimator, \"\\nkfByAnimatorAndChannel:\", kfByAnimatorAndChannel);\n    Undo.finishEdit('Reverse keyframe easing')\n    updateKeyframeSelection();\n    Animator.preview();\n}"
  },
  {
    "path": "plugins/animation_utils/src/ts/utils.ts",
    "content": "import {GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY} from \"./constants\";\n\nconst VALID_NAMESPACE_PATTERN = new RegExp('^[_\\\\-.a-z0-9]+$')\nconst VALID_PATH_PATTERN = new RegExp('^[_\\\\-/.a-z0-9]+$')\nexport const Monkeypatches = new Map();\n\n/**\n * Add what is effectively an override of another javascript function in a target object.\n * <p>\n * The patched function should call the original first and operate on the result to ensure compatibility\n * </p>\n *\n * @param symbol The target object\n * @param path The property of the target to access, or null to access the root target itself\n * @param functionKey The name of the function to replace\n * @param newFunction The function to patch in to replace the target\n */\nexport const addMonkeypatch = (symbol, path, functionKey, newFunction) => {\n  const pathAccessor = path ? symbol[path] : symbol;\n\n  if (!Monkeypatches.get(symbol))\n    Monkeypatches.set(symbol, { _pathAccessor: pathAccessor });\n\n  Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey];\n  pathAccessor[functionKey] = newFunction;\n};\n\n/**\n * Remove all previously added monkeypatches, reverting their operation to prior to the patch\n */\nexport const removeMonkeypatches = () => {\n  Monkeypatches.forEach(symbol => {\n    Object.keys(symbol).forEach(functionKey => {\n      if (functionKey.startsWith('_'))\n        return;\n\n      symbol._pathAccessor[functionKey] = symbol[functionKey];\n    });\n  });\n  Monkeypatches.clear();\n}\n\n/**\n * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety\n */\nexport const onlyIfGeckoLib = (callback: (data: object) => void) => {\n  return e => {\n    if (isGeckoLibModel())\n      callback(e)\n  }\n}\n\n/**\n * Add an event listener to Blockbench's event callback system.\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nexport const addEventListener = (eventName: EventName, callback: (data: object) => void) => {\n  Blockbench.on(eventName, callback)\n}\n\n/**\n * Remove a previously registered event listener from Blockbench's event callback system.\n * <p>\n * All registered event listeners should be removed when the plugin or codec is unloaded\n */\nexport const removeEventListener = (eventName: EventName, callback: (data: object) => void) => {\n  Blockbench.removeListener(eventName, callback)\n}\n\n/**\n * Add a callback to a codec to be called after the task has been completed\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nexport const addCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => {\n  codec.on(taskName, callback);\n}\n\n/**\n * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable\n */\nexport function make<T>(obj: T, consumer: (obj2: T) => void): T {\n  consumer(obj);\n\n  return obj;\n}\n\n/**\n * Remove a previously added codec task completion callback\n * <p>\n * All registered coded callbacks should be removed when the plugin or codec is unloaded\n */\nexport const removeCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => {\n  codec.removeListener(taskName, callback);\n}\n\n/**\n * Whether a given string is a valid ResourceLocation path for Minecraft\n */\nexport const isValidPath = (path: string) => {\n  return VALID_PATH_PATTERN.test(path)\n}\n\n/**\n * Whether a given string is a valid ResourceLocation namespace for Minecraft\n */\nexport const isValidNamespace = (namespace: string) => {\n  return VALID_NAMESPACE_PATTERN.test(namespace)\n}\n\n/**\n * Whether a map-like object has no defined keys or values\n */\nexport const isEmpty = (object = {}) => Object.keys(object).length === 0;\n\n/**\n * Whether the currently focussed model is a GeckoLib model\n */\nexport const isGeckoLibModel = () => Format.id === GECKOLIB_MODEL_ID;\n\n/**\n * Whether the current project is a GeckoLib model that has or uses item render perspective transforms\n */\nexport const hasModelDisplaySettings = () => isGeckoLibModel() && Project && ((Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM || !isEmpty(Project.display_settings)) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value);"
  },
  {
    "path": "plugins/animation_utils/src/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"outDir\": \"'../../plugins\",\n    // \"noImplicitAny\": true,\n    \"module\": \"es6\",\n    \"target\": \"ES2017\",\n    \"allowJs\": true,\n    \"resolveJsonModule\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"moduleResolution\": \"node\",\n    // \"typeRoots\": [\"./node_modules/@types\", \"./node_modules/blockbench-types\"]\n  }\n}"
  },
  {
    "path": "plugins/animation_utils/src/types/blockbench-types.d.ts",
    "content": "/// <reference types=\"blockbench-types\" />"
  },
  {
    "path": "plugins/animation_utils/src/webpack.config.js",
    "content": "const PathModule = require('path')\n\nmodule.exports = {\n    mode: 'development',\n    devtool: false,\n    entry: './ts/index.ts',\n    module: {\n        rules: [\n            {\n                test: /\\.tsx?$/,\n                use: 'ts-loader',\n                exclude: /node_modules/,\n            },\n            {\n                test: /\\.css$/,\n                use: [ 'to-string-loader', 'css-loader' ]\n            },\n        ],\n    },\n    resolve: {\n        extensions: ['.tsx', '.ts', '.js'],\n    },\n    output: {\n        filename: 'animation_utils.js',\n        path: PathModule.resolve(__dirname, '..')\n    }\n}\n"
  },
  {
    "path": "plugins/animator.js",
    "content": "(function() {\r\n    var button;\r\n\tvar start;\r\n\tvar expor;\r\n\r\n    Plugin.register('animator', {\r\n        title: 'Java Item Model Animator',\r\n        author: 'Command Master',\r\n        description: `Takes two java item models and outputs a zip with a resourcepack and a datapack to make a clear transaction between them in the players hand (the plugin can also work for other animations but the datapack have to be coded manually).`,\r\n        about: `The animation is activated using \"/scoreboard players set @s animation 0\".\r\nTo use click Filter -> Save starting model the save the first model, and then click on File -> Export -> Export animation to download the ZIP file of the animation`,\r\n        tags: [\"Minecraft: Java Edition\"],\r\n        icon: 'compare',\r\n        version: '1.0.1',\r\n        variant: 'both',\r\n        onload() {\r\n            types = ['thirdperson_righthand', 'thirdperson_lefthand', 'firstperson_righthand', 'firstperson_lefthand', 'gui', 'head', 'ground', 'fixed'];\r\n            button = new Action('save_start', {\r\n                name: 'Save Starting Model',\r\n                description: 'Saves the current model as the starting model for the animation',\r\n                icon: 'filter_cetner_focus',\r\n                condition: {formats: ['java_block']},\r\n                click: function() {\r\n\t\t\t\t\tstart = JSON.parse(JSON.stringify(Codecs.java_block.compile({raw: true})));\r\n                }\r\n            });\r\n            MenuBar.addAction(button, 'filter');\r\n\t\t\texpor = new Action('export_animation', {\r\n                name: 'Export Java Item Animation',\r\n                description: 'Exports the animation to a zip',\r\n                icon: 'compare',\r\n                condition: {formats: ['java_block']},\r\n                click: function() {\r\n                    if (!start) {\r\n                        Blockbench.showQuickMessage('You didn\\'t configured a starting model', 2000);\r\n                    } else\r\n                        new Dialog({\r\n                            id: 'generate_animation',\r\n                            title: 'Animation Generator',\r\n                            form: {\r\n                                ticks: {label: 'Time in ticks of the animation (20 ticks = 1 second)', type: 'number', value: 20, step: 1, min: 3, max: 1000}\r\n                            },\r\n                            onConfirm: function(formData) {\r\n                                generate_animation(start, Codecs.java_block.compile({raw: true}),+formData.ticks);\r\n                                this.hide()\r\n                            }\r\n                        }).show()\r\n                }\r\n            });\r\n            MenuBar.addAction(expor, 'file.export');\r\n        },\r\n        onunload() {\r\n            MenuBar.removeAction('file.export.export_animation')\r\n            button.delete();\r\n        }\r\n    });\r\n    \r\n    function line(y1, x1, y2, x2) {\r\n        var m = (y2-y1)/(x2-x1);\r\n        \r\n        return `${m}x+${y1-m*x1}`;\r\n    }\r\n\t\r\n    function generate_linear_arr(start, end, time) {\r\n        var linear = [];\r\n        for (var i = 0; i < start.length; i++) {\r\n            linear.push(line(start[i], 0, end[i], time-1));\r\n        }\r\n        return linear;\r\n    }\r\n    \r\n    function generate_linear(start, end, time) {\r\n        var linear = {};\r\n        for (var key of Object.keys(start)) {\r\n            linear[key] = generate_linear_arr(start[key], end[key], time);\r\n        }\r\n        return linear;\r\n    }\r\n    \r\n    function generate_element_linear(start, end, time) {\r\n        var linear = JSON.parse(JSON.stringify(start));\r\n        linear['from'] = generate_linear_arr(start['from'], end['from'], time);\r\n        linear['to'] = generate_linear_arr(start['to'], end['to'], time);\r\n        return linear;\r\n    }\r\n    \r\n    function calculate_string(string, x) {\r\n        var match = string.match(/(.+)x\\+(.+)/);\r\n        if (match) {\r\n            var a = parseFloat(match[1]);\r\n            var b = parseFloat(match[2]);\r\n            return a*x+b;\r\n        } else {\r\n            return string;\r\n        }\r\n    }\r\n    \r\n    \r\n    function calculate_model(current, x) {\r\n        if (typeof current == 'string') {\r\n            return calculate_string(current, x);\r\n        }\r\n        else if (current instanceof Array) {\r\n            for (var i = 0; i < current.length; i++) {\r\n                current[i] = calculate_model(current[i], x);\r\n            }\r\n            return current;\r\n        } else if (current instanceof Object) {\r\n            for (var key of Object.keys(current)) {\r\n                current[key] = calculate_model(current[key], x);\r\n            }\r\n            return current;\r\n        } else {\r\n            return current;\r\n        }\r\n    }\r\n\t\r\n\tfunction generate_animation(start, end, models) {\r\n        start = JSON.parse(JSON.stringify(start));\r\n        end = JSON.parse(JSON.stringify(end));\r\n\tstart['display'] = start['display']?start['display']:{};\r\n\tend['display'] = end['display']?end['display']:{};\r\n\tfor (var i = 0; i < types.length; i++) {\r\n                start['display'][types[i]] = Object.assign({\r\n                    rotation: [0, 0, 0],\r\n                    translation: [0, 0, 0],\r\n                    scale: [1, 1, 1]\r\n                }, start['display'][types[i]]);\r\n\t\tend['display'][types[i]] = Object.assign({\r\n                    rotation: [0, 0, 0],\r\n                    translation: [0, 0, 0],\r\n                    scale: [1, 1, 1]\r\n                }, start['display'][end[i]]);\r\n         }\r\n        start['display']['firstperson_righthand']['translation'][1] += 10;\r\n        end['display']['firstperson_righthand']['translation'][1] += 10;\r\n        start['display']['firstperson_lefthand']['translation'][1] += 10;\r\n        end['display']['firstperson_lefthand']['translation'][1] += 10;\r\n\t\tvar linear = JSON.parse(JSON.stringify(start));\r\n        var zip = JSZip();\r\n        zip.file(\"resourcepack/pack.mcmeta\", `{\r\n  \"pack\": {\r\n    \"pack_format\": 5,\r\n    \"description\": \"This is an animated resource pack generated using Command Master's generator.\"\r\n  }\r\n}`);\r\n        zip.file(\"datapack/pack.mcmeta\", `{\r\n  \"pack\": {\r\n    \"pack_format\": 5,\r\n    \"description\": \"This is a datapack for an animation generated using Command Master's generator.\"\r\n  }\r\n}`);\r\n        zip.file('datapack/data/minecraft/tags/functions/load.json', `{\r\n  \"replace\": false,\r\n  \"values\": [\r\n    \"anim:load\"\r\n  ]\r\n}`);\r\n        zip.file('datapack/data/minecraft/tags/functions/tick.json', `{\r\n  \"replace\": false,\r\n  \"values\": [\r\n    \"anim:tick\"\r\n  ]\r\n}`);\r\n        zip.file('datapack/data/anim/functions/load.mcfunction', \"scoreboard objectives add animation dummy\");\r\n        if (start.hasOwnProperty('display')) {\r\n            linear['display'] = {};\r\n            for (var key of Object.keys(start['display'])) {\r\n                linear['display'][key] = generate_linear(start['display'][key], end['display'][key], models);\r\n            }\r\n        }\r\n        if (start.hasOwnProperty('elements')) {\r\n            linear['elements'] = [];\r\n            for (var i = 0; i < start['elements'].length; i++) {\r\n                linear['elements'].push(generate_element_linear(start['elements'][i], end['elements'][i], models));\r\n            }\r\n        }\r\n        var overrides = [];\r\n        var tick = '';\r\n        for (var i = 0; i < models; i++) {\r\n            var model = JSON.parse(JSON.stringify(linear));\r\n            zip.file(`resourcepack/assets/minecraft/models/item/model${i}.json`, JSON.stringify(calculate_model(model, i)));\r\n            overrides.push({'predicate':{'custom_model_data': i+1}, 'model': `item/model${i}`});\r\n            tick += `replaceitem entity @p[scores={animation=${i+1}}] weapon.mainhand minecraft:knowledge_book{CustomModelData:${i+1},AttributeModifiers:[{AttributeName:\"generic.attackSpeed\",Name:\"generic.attackSpeed\",Amount:-1000000,Operation:0,UUIDLeast:255057,UUIDMost:170750}]}\r\n`;\r\n        }\r\n        zip.file('resourcepack/assets/minecraft/models/item/knowledge_book.json', JSON.stringify({\"parent\": \"item/generated\",\"textures\": {\"layer0\":\"item/knowledge_book\"},\"overrides\": overrides}));\r\n        tick += 'scoreboard players add @a animation 1';\r\n        zip.file('datapack/data/anim/functions/tick.mcfunction', tick);\r\n        zip.generateAsync({type: 'blob'}).then(content => {\r\n            Blockbench.export({\r\n                type: 'Zip Archive',\r\n                extensions: ['zip'],\r\n                name: 'animation',\r\n                startpath: Project.export_path,\r\n                content: content,\r\n                savetype: 'zip'\r\n            })\r\n        });\r\n    }\r\n\r\n})();\r\n"
  },
  {
    "path": "plugins/arcaniax_block_exporter.js",
    "content": "(function() {\n\t\n\tvar geometry_name;\n\tvar geometry_name_fancy;\n\tvar bbMinSize = 0;\n\tvar bbMaxOffset = 8;\n\tvar bbMaxSize = 16;\n\tvar color;\n\tvar folderLocation;\n\tlet options = {};\n\tlet collision = [16, 16, 16];\n\tlet collisionOffset = [0, 0, 0];\n\t\n\tconst fs = require('fs');\n\t\n\tvar preview;\n\t\n\t\n\t// SETS UP THE PREVIEW FOR THE COLLISION\n\tfunction setupPreview(){\n\t\t\n\t\tif (preview!=null){\n\t\t\tscene.remove(preview);\n\t\t}\n\t\t\n\t\tvar minY = 0.001;\n\t\t\n\t\tvar offsetX = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset);\n\t\tvar offsetY = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize);\n\t\tvar offsetZ = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset);\n\t\t\n\t\tvar x = Math.max(Math.min(collision[0],bbMaxSize-Math.abs(offsetX*2)),bbMinSize);\n\t\tvar y = Math.max(Math.min(collision[1],bbMaxSize-offsetY),bbMinSize);\n\t\tvar z = Math.max(Math.min(collision[2],bbMaxSize-Math.abs(offsetZ*2)),bbMinSize);\n\t\t\n\t\t\n\t\tconst geo = new THREE.BoxBufferGeometry( x, y, z);\n\t\tconst object = new THREE.Mesh( geo, new THREE.MeshBasicMaterial( 0x69db6d ) );\n\t\tobject.position.x += offsetX;\n\t\tobject.position.y = y/2 + minY + offsetY;\n\t\tobject.position.z += offsetZ;\n\t\tconst box = new THREE.BoxHelper( object, 0x69db6d );\n\t\tscene.add( box );\n\t\t\n\t\tpreview = box;\n\t}\n\t\n\t\n\t// ESTIMATES BOUNDING BOX\n\tfunction estimateBoundingBox(){\n\t\tconst max = {x:-Infinity,y:-Infinity,z:-Infinity};\n\t\tconst min = {x:Infinity,y:Infinity,z:Infinity};\n\t\tconst size = {x:-Infinity,y:-Infinity,z:-Infinity};\n\t\tObject.values(Canvas.meshes).map(mesh=>{\n\t\t\tconst bh = new THREE.BoxHelper(mesh,new THREE.MeshBasicMaterial())\n\t\t\tbh.geometry.computeBoundingBox();\n\t\t\tmax.x = Math.max(max.x,bh.geometry.boundingBox.max.x);\n\t\t\tmax.y = Math.max(max.y,bh.geometry.boundingBox.max.y);\n\t\t\tmax.z = Math.max(max.z,bh.geometry.boundingBox.max.z);\n\t\t\tmin.x = Math.min(min.x,bh.geometry.boundingBox.min.x);\n\t\t\tmin.y = Math.min(min.y,bh.geometry.boundingBox.min.y);\n\t\t\tmin.z = Math.min(min.z,bh.geometry.boundingBox.min.z);\n\t\t});\n\t\tmax.x = Math.min(max.x,8);\n\t\tmax.y = Math.min(max.y,16);\n\t\tmax.z = Math.min(max.z,8);\n\t\tmin.x = Math.max(min.x,-8);\n\t\tmin.y = Math.max(min.y,0);\n\t\tmin.z = Math.max(min.z,-8);\n\t\t\n\t\t\n\t\t\n\t\tsize.x = Math.abs(max.x-min.x);\n\t\tsize.y = (max.y-Math.max(min.y, 0));\n\t\tsize.z = Math.abs(max.z-min.z);\n\t\t\n\t\tcollision[0] = Math.max(Math.min(size.x, bbMaxSize),bbMinSize).toFixed(1);\n\t\tcollision[1] = Math.max(Math.min(size.y, bbMaxSize),bbMinSize).toFixed(1);\n\t\tcollision[2] = Math.max(Math.min(size.z, bbMaxSize),bbMinSize).toFixed(1);\n\t\t\n\t\tcollisionOffset[0] = Math.max(Math.min((max.x+min.x)/2, bbMaxSize),-bbMaxSize).toFixed(1);\n\t\tcollisionOffset[1] = Math.max(Math.min(min.y, bbMaxSize),bbMinSize).toFixed(1);\n\t\tcollisionOffset[2] = Math.max(Math.min((max.z+min.z)/2, bbMaxSize),-bbMaxSize).toFixed(1);\n\t}\n\t\n\t\n\t// HIDES THE PREVIEW FOR THE COLLISION\n\tfunction hidePreview(){\n\t\tif (preview!=null){\n\t\t\tscene.remove(preview);\n\t\t}\n\t\tpreview = null;\n\t}\n\t\n\t\n\tfunction getDialog(){\n\t\t\n\t\testimateBoundingBox();\n\t\t\n\t\tgeometry_name = Project.geometry_name;\n\t\tif (geometry_name!=null&&geometry_name!=\"\"){\n\t\t\tgeometry_name_fancy = geometry_name.replace(/_/g, ' ');\n\t\t    geometry_name_fancy = geometry_name_fancy[0].toUpperCase() + geometry_name_fancy.slice(1);\n\t\t}\n\t\t\n\t\t\n\t\tvar dialog = new Dialog({\n\t\t\t\t\tid: 'bedrock_block_export',\n\t\t\t\t\ttitle: 'Bedrock Block Exporter',\n\t\t\t\t\tform: {\n\t\t\t\t\t\tid: {label: 'Identifier', type: 'input', value: \"project_name:\" + geometry_name, placeholder: \"project_name:block_name\"},\n\t\t\t\t\t\tfile_name: {label: 'File name', type: 'input', value: geometry_name, placeholder: \"File name\"},\n\t\t\t\t\t\tname: {label: 'Name', type: 'input', value: geometry_name_fancy, placeholder: \"Block name\"},\n\t\t\t\t\t\talpha: {label: 'Texture options', type: 'select', options: {opaque: 'Opaque', alpha_test: 'Alpha Test (Transparent)', blend: 'Blend (Translucent)', double_sided: 'Double Sided (Mirrored)'}, default:'Opaque'},\n\t\t\t\t\t\tcollision_settings: {label: 'Collision Settings', type: 'checkbox', value: false},\n\t\t\t\t\t\tcollision: {label: 'Size', type: 'vector', value: collision, min:0, max:16, step:0.5, condition: (formData) => formData.collision_settings},\n\t\t\t\t\t\tcollisionOffset: {label: 'Offset', type: 'vector', value: collisionOffset, min:-16, max:16.0, step:0.5, condition: (formData) => formData.collision_settings},\n\t\t\t\t\t\tentity_collision: {label: 'Entity Collision', type: 'checkbox', value: true, condition: (formData) => formData.collision_settings},\n\t\t\t\t\t\texport_loc: {label: 'Export Location', value: folderLocation, type: 'folder'}\n\t\t\t\t\t\t\n\t\t\t\t\t},\n\t\t\t\t\tonConfirm: function(formData) {\n\t\t\t\t\t\thidePreview();\n\t\t\t\t\t\tif (typeof formData.export_loc != 'undefined'){\n\t\t\t\t\t\t\tfolderLocation = formData.export_loc;\n\t\t\t\t\t\t\texportBlock(formData);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: function(formData) {\n\t\t\t\t\t\thidePreview();\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\tdialog.updateFormConditions = function() {\n\t\t\tDialog.prototype.updateFormConditions.call(dialog);\n\t\t\tcollision = dialog.getFormResult().collision;\n\t\t\tcollisionOffset = dialog.getFormResult().collisionOffset;\n\t\t\tsetupPreview();\n\t\t}\n\t\treturn dialog;\n\t}\n\t\n\tfunction exportBlock(formData){\n\t\tmakeFolder(folderLocation);\n\t\t\n\t\tvar bp = PathModule.join(folderLocation, formData.name + \" BP\");\n\t\tvar rp = PathModule.join(folderLocation, formData.name + \" RP\");\n\t\t\n\t\tvar blockBehaviors = PathModule.join(bp, \"blocks\");\n\t\tvar lang = PathModule.join(rp, \"texts\");\n\t\tvar textures = PathModule.join(rp, \"textures\");\n\t\tvar models = PathModule.join(rp, \"models\");\n\t\tvar blockModels = PathModule.join(rp, \"models\", \"blocks\");\n\t\tvar blockTextures = PathModule.join(rp, \"textures\", \"blocks\");\n\t\t\n\t\tmakeFolder(bp);\n\t\tmakeFolder(rp);\n\t\tmakeFolder(blockBehaviors);\n\t\tmakeFolder(lang);\n\t\tmakeFolder(textures);\n\t\tmakeFolder(blockTextures);\n\t\tmakeFolder(models);\n\t\tmakeFolder(blockModels);\n\t\t\n\t\tcreateManifests(bp, rp, formData);\n\t\tcreateBehaviorFile(blockBehaviors, formData);\n\t\tsaveModel(blockModels, formData);\n\t\tsaveTexture(blockTextures, formData);\n\t\taddTranslation(lang, formData);\n\t\taddTextureMapping(textures, formData);\n\t\t\n\t\tBlockbench.showQuickMessage('Block was exported successfully!', 5000);\n\t}\n\t\n\tfunction makeFolder(dir){\n\t\tif (!fs.existsSync(dir)){\n\t\t\tfs.mkdirSync(dir);\n\t\t}\n\t}\n\t\n\tfunction saveModel(dir, formData){\n\t\tfs.writeFile(PathModule.join(dir, formData.file_name, \".geo.json\"), Format.codec.compile(), onError);\n\t}\n\t\n\tfunction createManifests(bp, rp, formData){\n\t\tfs.writeFile(PathModule.join(bp, \"manifest.json\"), getBehaviorManifest(formData), onError);\n\t\tfs.writeFile(PathModule.join(rp, \"manifest.json\"), getResourceManifest(formData), onError);\n\t}\n\t\n\tfunction addTranslation(dir, formData){\n\t\tvar translationPrefix = \"tile.\" + formData.id + \".name=\";\n\t\tvar translation = translationPrefix + formData.name;\n\t\t\n\t\tfs.writeFile(PathModule.join(dir, \"en_US.lang\"), translation, onError);\n\t\tfs.writeFile(PathModule.join(dir, \"languages.lang\"), getDefaultLanguages(), onError);\n\t}\n\t\n\tfunction getDefaultLanguages(){\n\t\treturn `[\"en_US\"]`;\n\t}\n\t\n\tfunction addTextureMapping(dir, formData){\n\t\tfs.writeFile(PathModule.join(dir, \"terrain_texture.json\"), getTerrainTextureFormat(formData) , onError);\n\t}\n\t\n\tfunction saveTexture(dir, formData){\n\t\tif (textures[0]){\n\t\t\tvar base64 = textures[0].getBase64();\n\t\t\tvar base64Data = base64.replace(/^data:image\\/png;base64,/, \"\");\n\n\t\t\tfs.writeFile(PathModule.join(dir, formData.file_name, \".png\"), base64Data, 'base64', onError);\n\t\t}\n\t}\n\t\n\tfunction createBehaviorFile(dir, formData){\n\t\tfs.writeFile(PathModule.join(dir, formData.file_name, '.behavior.json'), getBehaviorFormat(formData), onError);\n\t}\n\t\n\t// UNUSED\n\t// function checkFolders(dir){\n\t// \tvar bp = (dir, \"behavior_packs\");\n\t// \tvar rp = PathModule.join(dir, \"resource_packs\");\n\t// \tif (fs.existsSync(bp)&&fs.existsSync(rp)) {\n\t// \t\tif (hasDirectory(rp)){\n\t// \t\t\tif (hasDirectory(bp)){\n\t// \t\t\t  return true;\n\t// \t\t\t}\n\t// \t\t}\n\t// \t}\n\t// \treturn false;\n\t// }\n\t\n\t// UNUSED\n\t// function hasDirectory(dir){\n\t// \tvar bool = false;\n\t// \tfs.readdirSync(dir).forEach(file => {\n\t// \t  if (fs.lstatSync(PathModule.join(dir, file)).isDirectory() ){\n\t// \t\t  bool = true;\n\t// \t  }\n\t// \t});\n\t// \treturn bool;\n\t// }\n\t\n\t// UNUSED\n\t// function getFirstDirectory(dir){\n\t// \tvar returnFile = \"\";\n\t// \tfs.readdirSync(dir).forEach(file => {\n\t// \t  if (fs.lstatSync(PathModule.join(dir, file)).isDirectory() ){\n\t// \t\t  returnFile = file;\n\t// \t  }\n\t// \t});\n\t// \treturn PathModule.join(dir, returnFile);\n\t// }\n\t\n\t\n\tfunction getResourceManifest(formData){\n\t\tvar name = formData.name;\n\t\tvar uuid1 = generateUUID();\n\t\tvar uuid2 = generateUUID();\n\t\tvar json =\n`{\n  \"format_version\": 2,\n  \"header\": {\n    \"description\": \"` + name + ` Resource Pack\",\n    \"name\": \"` + name + ` RP\",\n    \"uuid\": \"` + uuid1 + `\",\n    \"version\": [1, 0, 0],\n    \"min_engine_version\": [1, 14, 0]\n  },\n  \"modules\": [{\n    \"description\": \"` + name + ` Resource Pack\",\n    \"type\": \"resources\",\n    \"uuid\": \"` + uuid2 + `\",\n    \"version\": [1, 0, 0]\n  }]\n}`;\n\t\treturn json;\n\t}\n\t\n\tfunction getBehaviorManifest(formData){\n\t\tvar name = formData.name;\n\t\tvar uuid1 = generateUUID();\n\t\tvar uuid2 = generateUUID();\n\t\tvar json =\n`{\n  \"format_version\": 1,\n  \"header\": {\n    \"description\": \"` + name + ` Behavior Pack\",\n    \"name\": \"` + name + ` BP\",\n    \"uuid\": \"` + uuid1 + `\",\n    \"version\": [1, 0, 0]\n  },\n  \"modules\": [{\n    \"description\": \"${name} Behavior Pack\",\n    \"version\": [ 1, 0, 0 ],\n    \"uuid\": \"` + uuid2 + `\",\n    \"type\": \"data\"\n  }]\n}`;\n\t\treturn json;\n\t}\n\t\n\tfunction getTerrainTextureFormat(formData){\n\t\tvar file_name = formData.file_name;\n\t\t\t\tvar json =\n`{\n  \"resource_pack_name\": \"vanilla\",\n  \"texture_name\": \"atlas.terrain\",\n  \"padding\": 8,\n  \"num_mip_levels\": 4,\n  \"texture_data\": {\n    \"` + file_name + `\": { \n\t  \"textures\": \"textures/blocks/` + file_name + `\"\n\t}\n  }\n}`;\n\t\treturn json;\n\t}\n\t\n\tfunction generateUUID() { // Public Domain/MIT\n\t\tvar d = new Date().getTime();//Timestamp\n\t\tvar d2 = (performance && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n\t\t\tvar r = Math.random() * 16;//random number between 0 and 16\n\t\t\tif(d > 0){//Use timestamp until depleted\n\t\t\t\tr = (d + r)%16 | 0;\n\t\t\t\td = Math.floor(d/16);\n\t\t\t} else {//Use microseconds since page-load if supported\n\t\t\t\tr = (d2 + r)%16 | 0;\n\t\t\t\td2 = Math.floor(d2/16);\n\t\t\t}\n\t\t\treturn (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n\t\t});\n\t}\n\t\n\tfunction getBehaviorFormat(formData){\n\t\tvar alpha = \"\";\n\t\tvar offset_entity = \"\";\n\t\tvar size_entity = \"\";\n\t\tvar offset_pick = \"\";\n\t\tvar size_pick = \"\";\n\t\t\n\t\talpha = formData.alpha;\n\t\t\n\t\tif (!formData.entity_collision){\n\t\t\toffset_entity = \"0, 0, 0\";\n\t\t\tsize_entity = \"0, 0, 0\";\n\t\t}\n\t\telse{\n\t\t\toffset_entity = getOffset();\n\t\t\tsize_entity = getSize();\n\t\t}\n\t\toffset_pick = getOffset();\n\t\tsize_pick = getSize();\n\t\t\n\t\treturn getBehaviorRaw(formData, alpha, offset_entity, size_entity, offset_pick, size_pick);\n\t}\n\t\n\tfunction getOffset(){\n\t\tvar x = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset);\n\t\tvar y = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize);\n\t\tvar z = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset);\n\t\t\n\t\tx = x - Math.max(Math.min(collision[0],bbMaxSize-Math.abs(x*2)),bbMinSize)/2;\n\t\tz = z - Math.max(Math.min(collision[2],bbMaxSize-Math.abs(z*2)),bbMinSize)/2;\n\t\t\n\t\treturn x + \", \" + y + \", \" + z;\n\t}\n\t\n\tfunction getSize(){\n\t\tvar offsetX = Math.max(Math.min(collisionOffset[0], bbMaxOffset),-bbMaxOffset);\n\t\tvar offsetY = Math.max(Math.min(collisionOffset[1], bbMaxSize), bbMinSize);\n\t\tvar offsetZ = Math.max(Math.min(collisionOffset[2], bbMaxOffset),-bbMaxOffset);\n\t\t\n\t\tvar x = Math.max(Math.min(collision[0],bbMaxSize-Math.abs(offsetX*2)),bbMinSize);\n\t\tvar y = Math.max(Math.min(collision[1],bbMaxSize-offsetY),bbMinSize);\n\t\tvar z = Math.max(Math.min(collision[2],bbMaxSize-Math.abs(offsetZ*2)),bbMinSize);\n\t\t\n\t\treturn x + \", \" + y + \", \" + z;\n\t}\n\t\n\tfunction getBehaviorRaw(formData, alpha, offset_entity, size_entity, offset_pick, size_pick){\n\t\tvar json =\n`{\n  \"format_version\": \"1.16.100\",\n  \"minecraft:block\": {\n    \"description\": {\n      \"identifier\": \"${formData.id}\"\n    },\n    \"components\": {\n      \"minecraft:destroy_time\": 4.0,\n      \"minecraft:friction\": 0.6,\n\t  \"minecraft:block_light_emission\": 0.0,\n      \"minecraft:block_light_absorption\": 0.0,\n\t  \"minecraft:entity_collision\": {\n\t\t\"origin\": [${offset_entity}],\n\t\t\"size\": [${size_entity}]\n\t  },\n\t  \"minecraft:pick_collision\": {\n\t\t\"origin\": [${offset_pick}],\n\t\t\"size\": [${size_pick}]\n\t  },\n\t  \"minecraft:geometry\": \"geometry.${formData.file_name}\",\n      \"minecraft:material_instances\" : {\n        \"*\" : {\n          \"texture\": \"${formData.file_name}\",\n          \"render_method\": \"${alpha}\"\n        }\n      }\n    }\n  }\n}`;\n\t\treturn json;\n\t}\n\t\n\tfunction onError(err)\n\t\t{\n\t\t\tif (err)\n\t\t\t{\n\t\t\t\tconsole.log('File Writing Error: ', err);\n\t\t\t}\n\t\t}\n\t\n\tvar export_action;\n\t\n\tPlugin.register('arcaniax_block_exporter', {\n\t\ttitle: 'Bedrock Block Exporter',\n\t\ticon: 'icon-format_block',\n\t\tauthor: 'Arcaniax',\n\t\tdescription: 'Helps making new Bedrock blocks (requires experimental mode)',\n\t\tversion: '0.1.1',\n\t\tvariant: 'both',\n\n\t\tonload() {\n\t\t\texport_action = new Action({\n\t\t\t\tid: 'block_exporter',\n\t\t\t\tname: 'Bedrock Block Exporter',\n\t\t\t\ticon: 'icon-format_block',\n\t\t\t\tcategory: 'filter',\n\t\t\t\tclick: function(ev) {\n\t\t\t\t\tgetDialog().show();\n\t\t\t\t\t$('#blackout').hide(0);\n\t\t\t\t\tsetupPreview();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tMenuBar.addAction(export_action, 'filter');\n\t\t},\n\t\tonunload() {\n\t\t\tthis.onuninstall();\n\t\t},\n\t\tonuninstall() {\n\t\t\texport_action.delete();\n\t\t}\n\t})\n})()\n"
  },
  {
    "path": "plugins/armor_stand_animator.js",
    "content": "// TODO Make into custom model format, allow multiple armor stands in one animation\n\n// Credit to Misode for this (I did some, you can view the wizardry he pulled over here (https://github.com/misode/vscode-nbt/blob/master/src/common/Snbt.ts))\nwindow.SNBT = (function () {\n    function SNBT() {}\n    SNBT.stringify = function (type, data) {\n        switch (type) {\n            case \"compound\": return Object.keys(data).length === 0 ? \"{}\": \n                \"{\" + Object.entries(data).map(function (_a) {\n                    let key = _a[0], value = _a[1];\n                    return (key + \": \" + SNBT.stringify(value.type, value.value));\n                }).join(',') + \"}\";\n            case \"list\": return data.value.length === 0 ? \"[]\": \n                SNBT.isCompact(data.type) ? \n                    \"[\" + SNBT.stringifyEntries(data.type, data.value, \", \") + \"]\" : \n                    \"[\" + SNBT.stringifyEntries(data.type, data.value, ',') + \"]\";\n            case \"floatList\": return \"[\" + SNBT.stringifyEntries(\"float\", data, \", \") + \"]\";\n            case \"string\": return \"\\\"\" + data.replace(/(\\\\|\")/g, \"\\\\$1\") + \"\\\"\";\n            case \"byte\": return data + \"b\";\n            case \"double\": return data + \"d\";\n            case \"float\": return data + \"f\";\n            case \"short\": return data + \"s\";\n            case \"int\": return \"\" + data;\n            case \"long\": return SNBT.stringifyLong(data) + \"L\";\n            default: return \"null\";\n        }\n    };\n    SNBT.stringifyLong = function (value) {\n        SNBT.dataView.setInt32(0, Number(value[0]));\n        SNBT.dataView.setInt32(4, Number(value[1]));\n        return \"\" + SNBT.dataView.getBigInt64(0);\n    };\n    SNBT.stringifyEntries = function (type, values, join) {\n        return values.map(function (v) {\n            return (\"\" + SNBT.stringify(type, v));\n        }).join(join);\n    };\n    SNBT.isCompact = function (type) {\n        return type === 'byte' || type === 'double' || type === 'float' || type === 'short' || type === 'int' || type === 'long';\n    };\n    SNBT.bytes = new Uint8Array(8);\n    SNBT.dataView = new DataView(SNBT.bytes.buffer);\n    return SNBT;\n}());\n\nfunction roundKeyframeTime(time) {\n    return Number((Math.ceil(time.toFixed(2) / 0.05) * 0.05).toFixed(2));\n}\n\nfunction getNextKey(dict, currentKey) {\n    let keys = Object.keys(dict);\n    return keys[keys.indexOf(String(currentKey)) + 1];\n} \n\nfunction getRootBoneNameDifferentiator(boneName, numberCheck) {\n    // Try to find an existing armor stand root bone\n    let primaryArmorStandBone = Outliner.root.find(q => (q.name === (numberCheck === 0 ? boneName : `${boneName}${numberCheck}`)));\n    // If it didn't exist, return the name (and the differentiator if it wasn't 0) as a string\n    if (!primaryArmorStandBone) {\n        return numberCheck === 0 ? boneName : `${boneName}${numberCheck}`;\n    } else {\n        // Otherwise, check the next number\n        return getRootBoneNameDifferentiator(boneName, numberCheck + 1);\n    }\n}\n\nfunction generatePackFromAnimation(animationContents, animationName, configData, loopMode) {\n    let zip = new JSZip();\n\n    // Load in config data and filter invalid characters\n    let packName = configData.packName.replace(/[^a-z0-9_.]/g, \"\");\n    animationName = animationName.replace(/[^a-zA-Z0-9_.]/g, '_');\n\n    let timerObjectiveName = `${animationName}.timer`;\n    let isPausedObjectiveName = `${animationName}.is_paused`;\n\n\n    // Set the working DIR depending on whether or not we're generating a pack namespace or a full pack\n    let workingDir;\n    if (configData.generationMode === \"namespace\") {\n        workingDir = `${packName}/functions`;\n    } else if (configData.generationMode === \"data_pack\") {\n        // Generate the extra files needed for it to be a pack\n        zip.file(`pack.mcmeta`, \n            `{\n                \"pack\": {\n                    \"pack_format\": 7,\n                    \"description\": \"Armor Stand Animation: ${packName}\"\n                }\n            }`\n        );\n\n        zip.file(`data/minecraft/tags/functions/load.json`,\n            `{\n                \"values\": [\n                    \"${packName}:init\"\n                ]\n            }`\n        );\n\n        workingDir = `data/${packName}/functions`;\n    }\n\n    // If playback control is enabled (pause/play), generate each function\n    if (configData.playbackControl) { \n        // Just invert the timer score and mark it as paused\n        zip.file(`${workingDir}/pause.mcfunction`, `scoreboard players operation @s ${timerObjectiveName} *= #-1 ${isPausedObjectiveName}\\nscoreboard players set @s ${isPausedObjectiveName} 1`);\n\n        // Re-invert the timer score, and begin the search at the correct frame\n        resumeCommands = `scoreboard players operation @s ${timerObjectiveName} *= #-1 ${isPausedObjectiveName}`;\n        Object.keys(animationContents).slice().reverse().forEach(\n            item => resumeCommands += `\\nexecute if score @s ${isPausedObjectiveName} matches 1 if score @s ${timerObjectiveName} matches ${item} run function ${packName}:search/${item}`\n        );\n\n        zip.file(`${workingDir}/resume.mcfunction`, resumeCommands); \n    }\n\n    // Stop the animation by setting it into an invalid frame number\n    zip.file(`${workingDir}/stop.mcfunction`, `scoreboard players set @s ${timerObjectiveName} -2147483646`);\n\n    // Add the necessary timer objective, plus is paused objective and -1 constant if playback control is enabled\n    initCommands = `scoreboard objectives add ${timerObjectiveName} dummy`;\n    if (configData.playbackControl) { initCommands += `\\nscoreboard players set #-1 ${isPausedObjectiveName} -1\\nscoreboard objectives add ${isPausedObjectiveName} dummy`; }\n    zip.file(`${workingDir}/init.mcfunction`, initCommands);\n    \n    // Armor stand creation function\n    zip.file(`${workingDir}/create.mcfunction`, `summon minecraft:armor_stand ~ ~ ~ {Tags:[\"${configData.entityTag}\"], NoBasePlate:1b, ShowArms:1b, Pose:{LeftArm:[0f, 0f, 0f], RightArm:[0f, 0f, 0f], LeftLeg:[0f, 0f, 0f], RightLeg:[0f, 0f, 0f]}}`);\n    \n    // This is needed since we need to create the start function if this is the first frame, and it can't be hardcoded since the start frame doesn't have to be frame 1\n    let isFirstFrame = true;\n\n    // Iterate through each keyframe in the data\n    for ([keyframeTime, keyframeContents] of Object.entries(animationContents)) {\n        // Used to calculate how long we should wait\n        let nextKeyframeTime = getNextKey(animationContents, keyframeTime);\n        let differenceBetweenNextAndCurrentKeyframe = Number(nextKeyframeTime) - Number(keyframeTime);\n\n        // Generate commands for this keyframe\n        let commands = [];\n        // Set to true if the armor stand moves that frame. Marks if we need to include \"at @s\" in the execute command\n        let includePositionalContext = false;\n        if (\"pos\" in keyframeContents) {\n            includePositionalContext = true;\n            commands.push(`teleport @s ~${keyframeContents.pos.map(q => q * configData.blockUnitScale).join(\" ~\")}`);\n        }\n        if (\"rot\" in keyframeContents) {\n            let outputNbt = {};\n            let boneNameToKey = {\n                head: \"Head\",\n                leftArm: \"LeftArm\",\n                rightArm: \"RightArm\",\n                body: \"Body\",\n                leftLeg: \"LeftLeg\",\n                rightLeg: \"RightLeg\"\n            };\n            // For every limb and its rotation, generate the NBT\n            for ([boneName, boneRotation] of Object.entries(keyframeContents.rot)) {\n                if (boneName !== \"main\") {\n                    outputNbt.Pose ??= {type: \"compound\", value: {}};\n                    outputNbt.Pose.value[boneNameToKey[boneName]] = {type: \"floatList\", value: boneRotation};\n                } else {\n                    outputNbt.Rotation = {type: \"floatList\", value: boneRotation};\n                }\n\n            }\n            commands.push(`data merge entity @s ${window.SNBT.stringify(\"compound\", outputNbt)}`);\n        }\n\n        // Make sure there are some commands to add\n        if (commands.length === 0) { continue; }\n\n        // Create the start function\n        if (isFirstFrame) {\n            zip.file(`${workingDir}/start.mcfunction`, `data merge entity @s {Pose:{Head:[0f, 0f, 0f], LeftArm:[0f, 0f, 0f], RightArm:[0f, 0f, 0f], LeftLeg:[0f, 0f, 0f], RightLeg:[0f, 0f, 0f]}}\\nscoreboard players set @s ${timerObjectiveName} ${keyframeTime}\\nschedule function ${packName}:search/${keyframeTime} ${differenceBetweenNextAndCurrentKeyframe}t append`);\n            isFirstFrame = false;\n        }\n\n        // Generates the functions needed for each frame (2 functions per frame, scheduling each other)\n        searchCommands = `execute as @e[tag=${configData.entityTag},scores={${timerObjectiveName}=${keyframeTime}}]${includePositionalContext ? \" at @s\" : \"\"} run function ${packName}:frames/${keyframeTime}`;\n        if (configData.playbackControl) { searchCommands += `\\nscoreboard players set @s ${isPausedObjectiveName} 0`; }\n        zip.file(`${workingDir}/search/${keyframeTime}.mcfunction`, searchCommands);\n        \n        // This check is needed because otherwise the last frame will have something like \"scoreboard players set ....timer undefined \" and \"schedule function ... NaNt append\". It also lets us add the loop code.\n        if (nextKeyframeTime) {\n            zip.file(`${workingDir}/frames/${keyframeTime}.mcfunction`, `${commands.join(\"\\n\")}\\nscoreboard players set @s ${timerObjectiveName} ${nextKeyframeTime}\\nschedule function ${packName}:search/${nextKeyframeTime} ${differenceBetweenNextAndCurrentKeyframe}t append`);\n        } else {\n            let extraCommands = [];\n            if (loopMode === \"loop\") {\n                extraCommands.push(`scoreboard players set @s ${timerObjectiveName} -2147483648`, `schedule function ${packName}:delay_for_loop 1t`);\n                zip.file(`${workingDir}/delay_for_loop.mcfunction`, `scoreboard players set @e[tag=${configData.entityTag},scores={${timerObjectiveName}=-2147483648}] instrument1.timer 0\\nfunction ${packName}:search/0`);\n            }\n            // \"once\" and \"hold\" loop modes are ignored since the animation stops on its own\n            zip.file(`${workingDir}/frames/${keyframeTime}.mcfunction`, `${commands.join(\"\\n\")}\\n${extraCommands.join(\"\\n\")}`);\n        }\n    }\n    \n    // Export the completed data pack\n    zip.generateAsync({type: \"blob\"}).then(content => {\n        Blockbench.export({\n            startpath: Project.export_path,\n            type: \"Zip Archive\",\n            extensions: [\"zip\"],\n            name: animationName,\n            content: content,\n            savetype: \"zip\"\n        });\n    });\n}\n\n(function() {\n    Plugin.register(\"armor_stand_animator\", {\n        title: \"Armor Stand Animator\",\n        author: \"DoubleFelix\",\n        description: \"Provides an interface to animate armor stands which is converted to a data pack\",\n        tags: [\"Minecraft: Java Edition\"],\n        icon: \"fa-forward\",\n        version: \"1.1.0\",\n        variant: \"both\",\n        onload() {\n            // Both actions are globals\n            createArmorStandAction = new Action(\"create_armor_stand\", {\n                name: \"Create Armor Stand Model\",\n                description: \"Creates an armor stand model, complete with bones and textures\",\n                icon: \"person_add\",\n                click: function() {\n                    new Dialog(\"createArmorStandOptions\", {\n                        title: \"Create Armor Stand Model\",\n                        form: {\n                            includeBasePlate: {type: \"checkbox\", label: \"Include Base Plate\", value: false},\n                            armorStandName: {type: \"text\", label: \"Armor Stand Name\", value: getRootBoneNameDifferentiator(\"armor_stand\", 0)},\n                        },\n                        onConfirm: function(formData) {\n                            // Set UV width and height\n                            Project.texture_width = 48;\n                            Project.texture_height = 25;\n\n                            // Returns undefined if it couldn't find the texture\n                            let armorStandTexture = Texture.all.find(q => (q.name === \"armor_stand\"));\n                            // If a texture with that name does not exist, create it\n                            if (!armorStandTexture) {\n                                armorStandTexture = new Texture({\n                                    name: \"armor_stand\",\n                                    mode: \"bitmap\",\n                                    source: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAZCAMAAAE3eG3dAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABCUExURQAAAMKdYriUX5+ETcagZ7SQWn5iN6+PVZZ0QWdQLKKCUamJWHNeOYeHh4CAgKioqLCwsJ2dnaOjo3h4eJKSkgAAAEcA5fkAAAAWdFJOU////////////////////////////wAB0sDkAAAACXBIWXMAAA7AAAAOwAFq1okJAAACBklEQVQoU32T7ZakIAxECYi0M6PS9OT9X3VvBe3t/bM5GsHKRyWB5G7ZPTXPOXvKPvZu6XyOcXawXMAeS8kVk70PtzR6H+dIDeSW5D++HwePW0tmvo/B42aEcC+5hHEqTZ8pqWWzXGvJxqa6y30nQFGAHgK1BKsRomh8nqfSjwG7BS/3xVazUBGXYJYL64WCCC59IUEm2JSNN1QmoYg1qO0EP8+pKT03qDRRp/Dez6ndWyuZ8tWa/Rz9HFPjgfHMgShtxL/kL12ohorfAIXs1/ofoQ7VZIUSKAm9XACbBlhqrlatVfYTkLoLu+p0/zKAb6WLEV2P5t5yItLDPca9T33VAYpLp9H9NTUexnSEulMyHZk6WlJSgaTPYTF86SBv6i45GFpXq6R1sPDQHBX6PDlTGi1Yf3YdvGWp0a4pUb6GiRfybuotnBLRus+XbNfME15zNZFb0uOxbtu2wmuWxTuVLWWxBbVc3Z5CzwsZOI0IGHhYSt7OYXlJUnRl0cXioK8Niiirc1srW+Z3mcfw7Os+qv+X+v2DHTeIoluJGnZaKOHsHp9rYfQfDrmJ0qq6w4Gu65oj++damOxkyKzDMZp3DIx4mdP+uRam3tCdxyz6yvCaNhru63MtDLNVA0iiJm/91AV7wgOr38+1MDrfMrc0QS2S6OeBvH45zccu9V4LgwWG2/YHQJY6amRT2pAAAAAASUVORK5CYII=\",\n                                    width: 48,\n                                    height: 25\n                                });\n                                armorStandTexture.add();\n                                armorStandTexture.load();\n                            }\n\n                            let armorStand = new Group({name: formData.armorStandName, origin: [0, 0, 0], isOpen: true}).init();\n\n                            let headBone = new Group({name: \"head_bone\", origin: [0, 21.5, 0], isOpen: true}).addTo(armorStand).init();\n                            let headCube = new Cube({name: \"head\", from: [-1, 23, -1], to: [1, 29, 1], uv_offset: [0, 1]}).addTo(headBone).init();\n\n                            let leftArmBone = new Group({name: \"left_arm_bone\", origin: [6.25, 21.25, 0], isOpen: true}).addTo(armorStand).init();\n                            let leftArmCube = new Cube({name: \"left_arm\", from: [5, 11, -1], to: [7, 23, 1], uv_offset: [40, 10]}).addTo(leftArmBone).init();\n                            let rightArmBone = new Group({name: \"right_arm_bone\", origin: [-6.25, 21.25, 0], isOpen: true}).addTo(armorStand).init();\n                            let rightArmCube = new Cube({name: \"right_arm\", from: [-7, 11, -1], to: [-5, 23, 1], uv_offset: [40, 10]}).addTo(rightArmBone).init();\n\n                            let bodyBone = new Group({name: \"body_bone\", origin: [0, 23.5, 0], isOpen: true}).addTo(armorStand).init();\n                            let leftRibCube = new Cube({name: \"left_rib\", from: [1, 13, -1], to: [3, 20, 1], uv_offset: [0, 1]}).addTo(bodyBone).init();\n                            let rightRibCube = new Cube({name: \"right_rib\", from: [-3, 13, -1], to: [-1, 20, 1], uv_offset: [0, 1]}).addTo(bodyBone).init();\n                            let collarCube = new Cube({name: \"collar\", from: [-6, 20, -1.5], to: [6, 23, 1.5], uv_offset: [9, 5]}).addTo(bodyBone).init();\n                            let hipCube = new Cube({name: \"hip\", from: [-4, 11, -1], to: [4, 13, 1], uv_offset: [14, 0]}).addTo(bodyBone).init();\n\n                            let leftLegBone = new Group({name: \"left_leg_bone\", origin: [2, 12, 0], isOpen: true}).addTo(armorStand).init();\n                            let leftLegCube = new Cube({name: \"left_leg\", from: [1, 0.5, -1], to: [3, 11, 1], uv_offset: [0, 11]}).addTo(leftLegBone).init();\n                            let rightLegBone = new Group({name: \"right_leg_bone\", origin: [-2, 12, 0], isOpen: true}).addTo(armorStand).init();\n                            let rightLegCube = new Cube({name: \"right_leg\", from: [-3, 0.5, -1], to: [-1, 11, 1], uv_offset: [0, 11]}).addTo(rightLegBone).init();\n\n                            let cubesToApplyTexturesTo = [headCube, leftArmCube, rightArmCube, leftRibCube, rightRibCube, collarCube, hipCube, leftLegCube, rightLegCube];\n\n                            if (formData.includeBasePlate) {\n                                let plate = new Cube({name: \"plate\", from: [-6, 0, -6], to: [6, 1, 6], uv_offset: [0, 12]}).addTo(armorStand).init();\n                                cubesToApplyTexturesTo.push(plate);\n                            }\n\n                            for (let cube of cubesToApplyTexturesTo) {\n                                cube.applyTexture(armorStandTexture, true);\n                            }\n\n                            this.hide();\n                        }\n                    }).show();\n\n                    // TODO new texture and new model\n\n                    // Hardcoded positions and sizes\n\n\n\n                }\n            });\n\n            exportAnimationAction = new Action(\"export_animation\", {\n                name: \"Export Armor Stand Animation\",\n                description: \"Exports the animation to a data pack\",\n                icon: \"file_download\",\n                click: function() {\n                    let startTime = new Date();\n\n                    // Fetch the selected animation by checking which one has the selected property \n                    let selectedAnimation = Animator.animations.find(q => (q.selected === true));\n\n                    // Set the start delay to 0 if it wasn't defined by the user\n                    let animationStartDelay = selectedAnimation.startDelay;\n                    animationStartDelay = typeof animationStartDelay === \"number\" ? animationStartDelay : 0;\n\n                    // If no animation is selected, show an error\n                    if (selectedAnimation === undefined) {\n                        Blockbench.showQuickMessage(\"You must select an animation to export\", 2000);\n                        return;\n                    }\n\n                    // Check snapping values and their validity\n                    let waitingForSnappingWarning = false;\n                    let shouldReturn = false;\n                    if (selectedAnimation.snapping > 20 || selectedAnimation.snapping % 10 !== 0) {\n                        waitingForSnappingWarning = true;\n                        Blockbench.showMessageBox({\n                            title: \"Warning\",\n                            message: \"The snapping value of this animation is 10 or 20. All keyframe times will be rounded up to the nearest 50th millisecond. Do you wish to continue?\",\n                            icon: \"warning\",\n                            buttons: [\"Yes\", \"No\"],\n                            confirm: 0,\n                            cancel: 1,\n                        }, function (buttonIndex) {\n                            if (buttonIndex === 0) {\n                                waitingForSnappingWarning = false;\n                            } else if (buttonIndex === 1) {\n                                shouldReturn = true;\n                            }\n                        });\n\n                        // Returning where the \"shouldReturn = true;\" is will cause it to exit the callback function, not this one.\n                        if (shouldReturn) { return; }\n                    }\n\n                    // Wrapper function for the warning check done below\n                    function makeAnimation() {\n                        // Bind all the bone objects to variables\n                        let bones = Object.values(selectedAnimation.animators);\n                        let parentBone = bones.find(q => (q.name === \"armor_stand\"));\n                        let headBone = bones.find(q => (q.name === \"head_bone\"));\n                        let leftArmBone = bones.find(q => (q.name === \"left_arm_bone\"));\n                        let rightArmBone = bones.find(q => (q.name === \"right_arm_bone\"));\n                        let bodyBone = bones.find(q => (q.name === \"body_bone\"));\n                        let leftLegBone = bones.find(q => (q.name === \"left_leg_bone\"));\n                        let rightLegBone = bones.find(q => (q.name === \"right_leg_bone\"));\n    \n                        // Remove the animation. prefix (it is added by blockbench by default) if it exists\n                        animationName = selectedAnimation.name.startsWith(\"animation.\") ? selectedAnimation.name.slice(10) : selectedAnimation.name;\n\n                        new Dialog(\"exportAnimationOptions\", {\n                            title: \"Export Animation\",\n                            form: {\n                                // Default value is 16 units to 1 block, minimum value is 64 units to 1 block\n                                blockUnitScale: {type: \"number\", label: \"Block/Unit Ratio\", value: 0.0625, min: 0.015625, max: 16, step: 0.1}, \n                                // How frames are turned into tick times. A time scale of 0.5 will make the exported animation play at half speed.\n                                timeScale: {type: \"number\", label: \"Time Scale\", value: 1, min: 0.1, max: 100, step: 0.1},\n                                // The name of the pack namespace, and the data pack folder (if generateMode is data_pack)\n                                packName: {type: \"text\", label: \"Pack Name\", value: animationName, height: 30},\n                                // The tag that the entity should have. Should be unique per animation.\n                                entityTag: {type: \"text\", label: \"Entity Tag\", value: animationName, height: 30},\n                                // Whether or not the behavior for pausing and resuming the animation should be added to the data pack\n                                playbackControl: {type: \"checkbox\", label: \"Enable Pause/Play Control\", value: true},\n                                // Whether or not the animation should be exported as a data pack or namespace (useful for integrating into one pack)\n                                generationMode: {type: \"select\", label: \"Generation Mode\", options: {data_pack: \"Complete Data Pack\", namespace: \"Data Pack Namespace\"}}\n                            },\n                            onConfirm: function(formData) {\n                                // Loop through each bone and construct JSON data sorted by keyframe, then by rotation or position, then by bone\n                                let animationContent = {};\n                                for ([boneObj, boneName] of [\n                                    [parentBone, \"main\"],\n                                    [headBone, \"head\"],\n                                    [leftArmBone, \"leftArm\"],\n                                    [rightArmBone, \"rightArm\"],\n                                    [bodyBone, \"body\"],\n                                    [leftLegBone, \"leftLeg\"],\n                                    [rightLegBone, \"rightLeg\"]\n                                ]) {\n                                    // Show warning if the user modifies the position of any non-parent bone\n                                    if (boneObj.position.length > 0 && boneName !== \"main\") {\n                                        let positionWarning = Blockbench.showToastNotification({\n                                            text: \"The animation includes a keyframe which modifies the position of a bone that is not \\\"armor_stand\\\". Positional animations for armor stand limbs are not supported and will not be included in the exported animation.\",\n                                            icon: \"error\",\n                                            expire: 10000,\n                                            click: function() {\n                                                positionWarning.delete();\n                                            }\n                                        });\n                                    }\n    \n                                    // Show warning if the user modifies the scale of the armor stand in any way\n                                    if (boneObj.scale.length > 0) {\n                                        let scaleWarning = Blockbench.showToastNotification({\n                                            text: \"The animation includes a keyframe which modifies the scale of a bone. Scale animations are not supported and will not be included in the exported animation.\",\n                                            icon: \"error\",\n                                            expire: 10000,\n                                            click: function() {\n                                                scaleWarning.delete();\n                                            }\n                                        });\n                                    }\n\n                                    let shouldDisplayXZRotationWarning = false;\n                                    if (boneName === \"main\") {\n                                        // Functionality is essentially the same when using .entries, but we need index for position calculation\n                                        for ([index, keyframe] of boneObj.position.entries()) {\n                                            let keyframeData = keyframe.data_points[0]; \n                                            // Round the keyframe timer up to the nearest increment of 0.05, multiply it by 20 to turn it into ticks, and implement the starting delay\n                                            keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale;\n                                            animationContent[keyframeTime] ??= {};\n                                            // If we couldn't find a previous keyframe, then set the positions to 0 so the below calculation doesn't change the current keyframe\n                                            let previousKeyframe = boneObj.position[index - 1];\n                                            let previousKeyframeData = previousKeyframe ? previousKeyframe.data_points[0] : {x: 0, y: 0, z: 0};\n                                            animationContent[keyframeTime].pos = [(keyframeData.x - previousKeyframeData.x).toString(), (keyframeData.y - previousKeyframeData.y).toString(), (keyframeData.z - previousKeyframeData.z).toString()]; \n                                        }\n\n                                        // Handle armor stand base rotation\n                                        for (keyframe of boneObj.rotation) {\n                                            let keyframeData = keyframe.data_points[0]; \n                                            if (!shouldDisplayXZRotationWarning && (keyframeData.x != 0 || keyframeData.z != 0)) {\n                                                shouldDisplayXZRotationWarning = true;\n                                            }\n                                            keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale;\n                                            animationContent[keyframeTime] ??= {};\n                                            animationContent[keyframeTime].rot ??= {};\n                                            animationContent[keyframeTime].rot.main = [keyframeData.y.toString()]; \n                                        }\n                                    } else {\n                                        for (keyframe of boneObj.rotation) {\n                                            let keyframeData = keyframe.data_points[0]; \n                                            keyframeTime = (roundKeyframeTime(keyframe.time) + animationStartDelay) * 20 * formData.timeScale;\n                                            animationContent[keyframeTime] ??= {};\n                                            animationContent[keyframeTime].rot ??= {};\n                                            // Invert X and Z rotation since minecraft is weird\n                                            animationContent[keyframeTime].rot[boneName] = [(keyframeData.x * -1).toString(), keyframeData.y.toString(), (keyframeData.z * -1).toString()]; \n                                        }\n                                    }\n\n                                    // Display a warning if the user tries to modify any non-Y axis of the main armor stand bone\n                                    if (shouldDisplayXZRotationWarning) {\n                                        let rotationWarning = Blockbench.showToastNotification({\n                                            text: \"The animation includes a keyframe which modifies the X or Z rotation of the \\\"armor_stand\\\" bone. Rotations for the \\\"armor_stand\\\" bone on the X and Z axis are not supported and will not be included in the exported animation.\",\n                                            icon: \"error\",\n                                            expire: 10000,\n                                            click: function() {\n                                                rotationWarning.delete();\n                                            }\n                                        });\n                                    }\n                                }\n                                this.hide();\n\n                                generatePackFromAnimation(animationContent, animationName, formData, selectedAnimation.loop, startTime)\n                            }\n                        }).show();\n                    }\n\n                    // Repeatedly poll to see if the snapping warning is gone, and if it is, then generate the animation.\n                    function checkSnappingWarningCompletion() {\n                        if (waitingForSnappingWarning) {\n                            setTimeout(checkSnappingWarningCompletion, 250);\n                        } else {\n                            makeAnimation();\n                        }\n                    }\n                    checkSnappingWarningCompletion();\n\n                    Blockbench.setStatusBarText(`Animation exported in ${(new Date() - startTime) / 100} seconds`);\n                }\n            });\n            MenuBar.addAction(createArmorStandAction, \"filter\");\n            MenuBar.addAction(exportAnimationAction, \"filter\");\n        },\n        onunload() {\n            createArmorStandAction.delete();\n            exportAnimationAction.delete();\n        }\n    });\n})(); "
  },
  {
    "path": "plugins/asset_browser/about.md",
    "content": "<div id=\"about-content\">\n  <p>Asset browser is a browser that lets you view, modify, export, and compare the Minecraft vanilla assets. Both Java edition and Bedrock edition are supported, as well as their respective snapshots and beta versions.</p>\n  <h3>View Assets Mode:</h3>\n  <ul>\n    <li>Used for viewing the assets from a specific game version.</li>\n    <li>Shows all the assets for the selected version.</li>\n  </ul>\n  <h3>Compare Assets Mode:</h3>\n  <ul>\n    <li>Used to compare two game versions to see what files have been added, changed, or removed.</li>\n    <li>Only shows relevant files, not all files.</li>\n  </ul>\n  <div style=\"flex: 1;\"></div>\n  <img src=\"data:image/webp;base64,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\">\n  <div style=\"flex: 1;\"></div>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n  }\n  #about-content > img {\n    width: 100%;\n    object-fit: contain;\n    margin: 10px 0 12px;\n    padding: 0 16px;\n    filter: drop-shadow(0 3px 10px #0006);\n    pointer-events: none;\n    user-select: none;\n    image-rendering: auto;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/asset_browser/asset_browser.js",
    "content": "const crypto = require(\"node:crypto\")\nconst zlib = require(\"node:zlib\")\n\nlet fs, dialog, action, storage, loader, styles, cacheDir\n\nconst id = \"asset_browser\"\nconst name = \"Asset Browser\"\nconst icon = \"folder_zip\"\nconst description = \"Browse the Minecraft assets from within Blockbench.\"\nconst links = {\n  website: {\n    text: \"By Ewan Howell\",\n    link: \"https://ewanhowell.com/\",\n    icon: \"language\",\n    colour: \"#33E38E\"\n  },\n  discord: {\n    text: \"Discord Server\",\n    link: \"https://discord.ewanhowell.com/\",\n    icon: \"fab.fa-discord\",\n    colour: \"#727FFF\"\n  }\n}\n\nconst manifest = {\n  latest: {},\n  types: {\n    release: \"Java Release\",\n    snapshot: \"Java Snapshot\",\n    bedrock: \"Bedrock Release\",\n    \"bedrock-preview\": \"Bedrock Preview\"\n  },\n  versions: []\n}\n\nconst customIcons = {\n  creeper: '<svg width=\"22\" height=\"22\" viewBox=\"0 0 2.91 2.91\" fill=\"currentColor\"><path d=\"M.397.397h2.117v2.117h-.529V1.72H1.72v-.265h.529V.926H1.72v.529h-.529V.926h-.53v.529h.529v.265H.926v.794H.397zm.794 1.852h.529v.265h-.529z\"/></svg>',\n  forge: '<svg width=\"22\" height=\"22\" viewBox=\"0 0 105 105\" fill=\"currentColor\"><path d=\"M4.45 24.8h28.22v23.1C16.09 45.93 8.7 39.17 2.72 27.62c-.67-1.29.28-2.82 1.73-2.82zm98.05 5.81v-6.14a1.94 1.94 0 0 0-1.94-1.94H38.93a1.94 1.94 0 0 0-1.94 1.94v22.61a1.94 1.94 0 0 0 1.94 1.94H77.3c.79 0 1.5-.49 1.8-1.22 3.19-7.74 11.1-13.84 21.72-15.26a1.95 1.95 0 0 0 1.68-1.93zM73.24 53.63H41.55c1.93 4.94 1.89 9.6.24 13.52h30.8c-1.79-4.13-1.72-8.94.65-13.52zM41.79 67.14l-.21.5h31.24a7.55 7.55 0 0 1-.22-.5zm33.79 4.49H38.92c-2.72 2.99-6.69 5.17-11.65 6.14v4.71h60.6v-4.91c-5.27-.72-9.45-2.92-12.29-5.94z\"/></svg>',\n  neoforge: '<svg viewBox=\"-5 -10 110 110\" width=\"22\" height=\"22\" fill-rule=\"evenodd\" fill=\"currentColor\"><path d=\"M42.914 28.332a16.67 16.67 0 0 0-12.652 5.82L14.231 52.855l34.777 29.281c.277.234.629.363.992.363a1.54 1.54 0 0 0 .992-.363l34.773-29.281-16.027-18.703a16.67 16.67 0 0 0-12.652-5.82zm-18.98.398c4.75-5.543 11.684-8.73 18.98-8.73h14.172c7.297 0 14.23 3.188 18.98 8.731l18.766 21.891a4.17 4.17 0 0 1 .988 3.051c-.09 1.105-.621 2.133-1.469 2.848L56.359 88.512a9.86 9.86 0 0 1-12.719 0L5.649 56.52c-.848-.715-1.379-1.742-1.469-2.848a4.17 4.17 0 0 1 .988-3.051z\"/><path d=\"M80.762-.516a4.17 4.17 0 0 1 2.57 3.848V38.75H75V13.395L61.281 27.114l-5.895-5.895L76.223.388c1.191-1.191 2.981-1.547 4.539-.902zm-61.524 0a4.16 4.16 0 0 0-2.57 3.848V38.75H25V13.395l13.719 13.719 5.895-5.895L23.777.388c-1.191-1.191-2.98-1.547-4.539-.902zm65.957 49.243l-14.633 7.32A14.58 14.58 0 0 0 62.5 69.09v11.328h-8.332V69.09a22.92 22.92 0 0 1 12.668-20.5l14.633-7.316zm-70.39 0l14.633 7.32a14.58 14.58 0 0 1 8.063 13.043v11.328h8.332V69.09a22.92 22.92 0 0 0-12.668-20.5l-14.633-7.316z\"/></svg>',\n  fabric: '<svg viewBox=\"-5 -10 110 110\" width=\"22\" height=\"22\" fill=\"currentColor\"><path d=\"M15.625 85.625V53.93C10.25 52.536 6.25 47.684 6.25 41.875V13.75c0-6.894 5.605-12.5 12.5-12.5h62.5c6.894 0 12.5 5.606 12.5 12.5v71.875c0 1.727-1.398 3.125-3.125 3.125H18.75c-1.727 0-3.125-1.398-3.125-3.125zM12.5 13.75v28.125a6.26 6.26 0 0 0 6.25 6.25h51.738c-1.074-1.848-1.738-3.961-1.738-6.25V13.75c0-2.289.664-4.402 1.738-6.25H18.75a6.26 6.26 0 0 0-6.25 6.25zm75 21.875V13.75a6.26 6.26 0 0 0-6.25-6.25A6.26 6.26 0 0 0 75 13.75v28.125a6.26 6.26 0 0 0 6.25 6.25 6.26 6.26 0 0 0 6.25-6.25zm0 46.875V52.637c-1.848 1.074-3.961 1.738-6.25 1.738H21.875V82.5zM81.25 45c-1.727 0-3.125-1.398-3.125-3.125V13.75c0-1.727 1.398-3.125 3.125-3.125s3.125 1.398 3.125 3.125v28.125c0 1.727-1.398 3.125-3.125 3.125z\"/></svg>'\n}\n\nlet loadedJars = {}\n\nconst ignoredExtensions = [\"class\", \"nbt\", \"mcassetsroot\", \"mf\", \"sf\", \"dsa\", \"rsa\", \"jfc\", \"xml\", \"md\", \"toml\", \"itransformationservice\", \"hex\", \"jar\"]\nconst ignoredExtensionsRoot = [\"txt\", \"cfg\"]\nconst ignoredExtensionsRegex = new RegExp(`\\\\.(${ignoredExtensions.join(\"|\")})$|(?:^|\\/)[^\\/\\\\.]+$|(?:^|\\/)\\\\.`, \"i\")\nconst ignoredExtensionsRootRegex = new RegExp(`^[^\\\\/]+\\\\.(?:${ignoredExtensionsRoot.join(\"|\")})$`, \"i\")\n\nconst javaBlock = {\n  oneOf: new Set([\"parent\", \"elements\"]),\n  items: new Set([\"parent\", \"textures\", \"elements\", \"ambientocclusion\", \"gui_light\", \"display\", \"groups\", \"texture_size\", \"overrides\"])\n}\n\nconst item_parents = [\n  \"item/generated\", \"minecraft:item/generated\",\n  \"item/handheld\", \"minecraft:item/handheld\",\n  \"item/handheld_rod\", \"minecraft:item/handheld_rod\",\n  \"builtin/generated\", \"minecraft:builtin/generated\"\n]\n\nconst titleCase = str => str.replace(/_|-/g, \" \").replace(/\\w\\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase())\nconst shaCheck = async (path, sha) => crypto.createHash(\"sha1\").update(await fs.promises.readFile(path)).digest(\"hex\") === sha\nconst save = () => localStorage.setItem(id, JSON.stringify(storage))\n\nPlugin.register(id, {\n  title: name,\n  icon: \"icon.png\",\n  author: \"Ewan Howell\",\n  description,\n  tags: [\"Minecraft\", \"Assets\", \"Browser\"],\n  version: \"1.2.2\",\n  min_version: \"5.0.0\",\n  variant: \"desktop\",\n  creation_date: \"2025-05-30\",\n  website: \"https://ewanhowell.com/plugins/asset-browser/\",\n  repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/asset-browser\",\n  bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Asset Browser]\",\n  has_changelog: true,\n  onload() {\n    fs = require(\"fs\", {\n      message: \"This permission is required to access your downloaded Minecraft versions, cache versions you open that aren’t already downloaded, and export assets to folders.\",\n      optional: false\n    })\n\n    if (!fs) {\n      throw new Error(\"fs access denied\")\n    }\n\n    cacheDir = PathModule.join(SystemInfo.user_data_directory, \"minecraft_assets_cache\")\n    if (!fs.existsSync(cacheDir)) {\n      fs.mkdirSync(cacheDir, { recursive: true })\n    }\n    storage = JSON.parse(localStorage.getItem(id) ?? \"{}\")\n    storage.recents ??= []\n    storage.recentComparisons ??= []\n    loadSidebar()\n    let directory\n    if (SystemInfo.platform === \"win32\") {\n      directory = PathModule.join(SystemInfo.appdata_directory, \".minecraft\")\n    } else if (SystemInfo.platform === \"darwin\") {\n      directory = PathModule.join(SystemInfo.home_directory, \"Library\", \"Application Support\", \"minecraft\")\n    } else {\n      directory = PathModule.join(SystemInfo.home_directory, \".minecraft\")\n    }\n    new Setting(\"ewan_minecraft_directory\", {\n      value: directory,\n      category: \"defaults\",\n      type: \"click\",\n      name: \"Ewan's Plugins - Minecraft Directory\",\n      description: \"The location of your .minecraft folder\",\n      icon: \"folder_open\",\n      click() {\n        const dir = Blockbench.pickDirectory({\n          title: \"Select your .minecraft folder\",\n          startpath: settings.ewan_minecraft_directory.value\n        })\n        if (dir) {\n          settings.ewan_minecraft_directory.value = dir\n          Settings.saveLocalStorages()\n        }\n      }\n    })\n    dialog = new Dialog({\n      id,\n      title: name,\n      width: 816,\n      resizable: true,\n      buttons: [],\n      lines: [`<style>#${id} {\n        user-select: none;\n\n        .spacer {\n          flex: 1;\n        }\n\n        .dialog_wrapper {\n          height: calc(100% - 30px);\n        }\n\n        .dialog_content {\n          height: 100%;\n          max-height: 100%;\n          margin: 0;\n        }\n\n        .dialog_resize_handle {\n          z-index: 2;\n        }\n\n        #${id}-container {\n          height: 100%;\n          position: relative;\n        }\n\n        #index,\n        #browser {\n          display: flex;\n          flex-direction: column;\n          gap: 12px;\n          height: 100%;\n          flex: 1;\n        }\n\n        #index {\n          padding: 12px 16px;\n        }\n\n        .bb-select {\n          cursor: pointer;\n        }\n\n        hr {\n          margin: 0;\n          border: none;\n          height: 1px;\n          background-color: var(--color-border);\n        }\n\n        .index-row {\n          display: flex;\n          gap: 16px;\n          overflow-y: auto;\n\n          > hr {\n            height: 100%;\n            width: 1px;\n          }\n\n          > i {\n            align-self: flex-start;\n          }\n        }\n\n        .index-column {\n          flex: 1;\n          display: flex;\n          gap: 8px;\n          flex-direction: column;\n        }\n\n        .index-heading {\n          font-size: 24px;\n        }\n\n        .version-list {\n          overflow-y: auto;\n\n          .version {\n            cursor: pointer;\n            padding: 6px 8px;\n            min-height: 30px;\n            display: flex;\n            align-items: center;\n            gap: 4px;\n            flex-wrap: wrap;\n            line-height: 1;\n\n            * {\n              cursor: pointer;\n            }\n\n            &:hover {\n              background-color: var(--color-selected);\n              color: var(--color-light);\n            }\n\n            span {\n              display: flex;\n              align-items: center\n            }\n\n            i {\n              height: 16px;\n              display: flex;\n              align-items: center;\n            }\n          }\n        }\n\n        .version-button-heading {\n          font-size: 14px;\n          font-weight: 600;\n          min-width: 100%;\n\n          &:not(:first-child) {\n            margin-top: 4px;\n          }\n        }\n\n        .no-results {\n          color: var(--color-subtle_text);\n        }\n\n        #version-search {\n          position: relative;\n\n          input {\n            width: 100%;\n            padding-right: 32px;\n          }\n\n          i {\n            position: absolute;\n            right: 6px;\n            top: 50%;\n            transform: translateY(-50%);\n            pointer-events: none;\n\n            &.active {\n              cursor: pointer;\n              pointer-events: initial;\n            }\n          }\n        }\n\n        .checkbox-row {\n          display: flex;\n          gap: 8px;\n          align-items: center;\n          cursor: pointer;\n          line-height: 1;\n\n          * {\n            cursor: pointer;\n          }\n\n          input {\n            min-width: initial;\n          }\n        }\n\n        #loading {\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          flex-direction: column;\n          height: 100%;\n          font-size: 24px;\n          gap: 16px;\n          position: absolute;\n          inset: 0;\n          z-index: 2;\n          background-color: color-mix(in srgb, var(--color-ui), transparent 25%);\n        }\n\n        #progress-bar-container {\n          width: calc(100% - 80px);\n          max-width: 512px;\n          height: 24px;\n          background-color: var(--color-back);\n          position: relative;\n        }\n\n        #progress-bar {\n          height: 100%;\n          background-color: var(--color-accent);\n          position: absolute;\n          top: 4px;\n          left: 4px;\n          height: 16px;\n          transition: width .5s ease;\n        }\n\n        #progress-bar-text {\n          margin-top: -12px;\n          font-size: 20px;\n          color: var(--color-subtle_text);\n        }\n\n        #browser {\n          flex-direction: row;\n          flex-wrap: wrap;\n          gap: 0;\n          align-content: flex-start;\n        }\n\n        #browser-header {\n          background-color: var(--color-back);\n          width: 100%;\n          display: flex;\n          position: relative;\n\n          > div:not(:first-child) {\n            border-left: 2px solid var(--color-dark);\n          }\n        }\n\n        #browser-navigation,\n        #browser-search {\n          display: flex;\n          align-items: center;\n          padding: 0 8px;\n\n          .tool {\n            margin: 0;\n          }\n\n          i {\n            display: block;\n            cursor: pointer;\n            min-width: 36px;\n            height: 32px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            position: relative;\n            margin: 0;\n\n            &:hover {\n              background-color: var(--color-selected);\n              color: var(--color-light);\n\n              &.line-through::before {\n                background-color: var(--color-selected);\n              }\n\n              &.line-through::after {\n                background-color: var(--color-light);\n              }\n            }\n\n            &.disabled {\n              opacity: 0.5;\n              pointer-events: none;\n            }\n\n            &.line-through::before {\n              content: \"\";\n              position: absolute;\n              width: 24px;\n              height: 7px;\n              background-color: var(--color-back);\n              top: 50%;\n              left: 50%;\n              transform: translate(-50%, -50%) rotate(45deg);\n            }\n\n            &.line-through::after {\n              content: \"\";\n              position: absolute;\n              width: 24px;\n              height: 2px;\n              background-color: var(--color-text);\n              top: 50%;\n              left: 50%;\n              transform: translate(-50%, -50%) rotate(45deg);\n            }\n          }\n        }          \n\n        #breadcrumbs,\n        #breadcrumbs-home {\n          display: flex;\n          padding: 8px 8px 0;\n          gap: 24px;\n          height: 48px;\n          overflow-x: auto;\n          align-items: flex-start;\n          scrollbar-width: initial;\n          scrollbar-color: initial;\n          position: relative;\n\n          &::-webkit-scrollbar {\n            height: 8px;\n          }\n\n          &::-webkit-scrollbar-thumb {\n            background: var(--color-button);\n            border-radius: 0;\n            border-top: 2px solid var(--color-back);\n            border-bottom: 2px solid var(--color-back);\n\n            &:hover {\n              background: var(--color-selected);\n            }\n          }\n\n          &::-webkit-scrollbar-track {\n            background: var(--color-back);\n          }\n\n          > div {\n            padding: 4px 8px;\n            cursor: pointer;\n            position: relative;\n            font-weight: 600;\n            white-space: nowrap;\n            display: flex;\n            align-items: center;\n            gap: 5px;\n\n            &::after {\n              font-family: \"Material Icons\";\n              position: absolute;\n              pointer-events: none;\n              top: 50%;\n              right: -12px;\n              transform: translate(50%, -50%);\n              font-size: 20px;\n              opacity: 0.5;\n              font-weight: 400;\n            }\n\n            &:not(:last-child)::after {\n              content: \"chevron_right\";\n            }\n\n            &:hover {\n              background-color: var(--color-selected);\n              color: var(--color-light);\n            }\n\n            > i {\n              display: flex;\n              margin: 0;\n              justify-content: center;\n            }\n\n            .tooltip {\n              right: initial !important;\n              left: 0;\n              bottom: -28px;\n            }\n          }\n\n          .tooltip {\n            font-weight: 400;\n          }\n        }\n\n        #breadcrumbs-home {\n          overflow-x: visible;\n          z-index: 1;\n\n          > div::after {\n            content: \"chevron_right\";\n          }\n\n          &.overflow::before {\n            content: \"\";\n            width: 64px;\n            background-image: linear-gradient(90deg, var(--color-back) 10%, transparent);\n            position: absolute;\n            top: 0;\n            right: -64px;\n            bottom: 0;\n            pointer-events: none;\n          }\n\n          .tool {\n            margin: 0;\n          }\n\n          .tooltip {\n            left: -7px !important;\n          }\n        }\n\n        #breadcrumbs {\n          border-left: none !important;\n          margin: 0 54px 0 8px;\n\n          i {\n            font-size: 12px;\n          }\n        }\n\n        #browser-search {\n          position: absolute;\n          right: 0;\n          top: 0;\n          bottom: 0;\n          background-color: var(--color-back);\n          transition: width .3s;\n          overflow: hidden;\n          z-index: 1;\n          gap: 8px;\n\n          &:not(.open) > :not(:first-child) {\n            visibility: hidden;\n          }\n\n          input {\n            height: 100%;\n            flex: 1;\n            text-overflow: ellipsis;\n          }\n        }\n\n        #browser-sidebar,\n        #files {\n          height: calc(100% - 48px - 24px);\n        }\n\n        #browser-sidebar {\n          width: 162px;\n          border-right: 2px solid var(--color-back);\n          overflow-y: auto;\n          padding: 8px 0;\n          transform: translateX(-162px);\n          transition: transform .15s;\n\n          ~ #files {\n            margin-left: -162px;\n            transition: margin-left .15s;\n          }\n\n          &.open {\n            transform: initial;\n\n            ~ #files {\n              margin-left: 0;\n            }\n          }\n        }\n\n        .saved-folder {\n          white-space: nowrap;\n          padding: 0 12px;\n          display: flex;\n          align-items: center;\n          height: 30px;\n          cursor: pointer;\n          gap: 4px;\n\n          &:hover,\n          &.active {\n            color: var(--color-light);\n            background-color: var(--color-selected);\n          }\n\n          > span {\n            text-overflow: ellipsis;\n            overflow: hidden;\n\n            &:first-child {\n              display: flex;\n              align-items: center;\n              min-width: 22px;\n            }\n          }\n        }\n\n        #files {\n          overflow-y: auto;\n          contain: strict;\n          background-color: var(--color-ui);\n          flex: 1;\n          padding: 16px;\n\n          > div {\n            min-width: 100%;\n            display: grid;\n            grid-template-columns: repeat(auto-fit, 114px);\n            gap: 10px;\n            align-content: start;\n\n            > div {\n              display: flex;\n              align-items: center;\n              text-align: center;\n              flex-direction: column;\n              padding: 0 4px 4px;\n              cursor: pointer;\n              font-size: 14px;\n              word-break: break-word;\n\n              &:hover {\n                color: var(--color-light);\n              }\n\n              &.selected {\n                background-color: var(--color-selected);\n                color: var(--color-light);\n\n                > i i {\n                  color: var(--color-selected);\n                }\n              }\n\n              * {\n                cursor: pointer;\n              }\n\n              > i, img, canvas {\n                min-width: 64px;\n                min-height: 64px;\n                max-width: 64px;\n                max-height: 64px;\n                font-size: 64px;\n                display: flex;\n                align-items: center;\n                justify-content: center;\n                margin: 8px 0 4px;\n                position: relative;\n                pointer-events: none;\n\n                i, svg {\n                  position: absolute;\n                  top: 20px;\n                  min-width: 100%;\n                  text-align: center;\n                  color: var(--color-ui);\n                  font-size: 32px;\n                  left: 0;\n\n                  &.fa {\n                    font-size: 28px;\n                  }\n                }\n\n                svg {\n                  width: 32px;\n                  height: 32px;\n                }\n              }\n\n              img, canvas {\n                object-fit: contain;\n                background-size: 16px 16px;\n                background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n              }\n\n              > .fa {\n                font-size: 52px;\n              }\n            }\n          }\n\n          &.list {\n            padding-top: 0;\n\n            > div {\n              row-gap: 4px;\n              column-gap: 0;\n              grid-template-columns: auto 1fr auto auto;\n\n              > div {\n                display: contents;\n                font-size: 16px;\n                text-align: initial;\n\n                &.selected > * {\n                  background-color: var(--color-selected);\n                }\n\n                > * {\n                  padding: 0 10px;\n                }\n\n                > i, img, canvas {\n                  box-sizing: initial;\n                  margin: 0;\n                  min-width: 22px;\n                  min-height: 100%;\n                  max-width: 22px;\n                  max-height: 100%;\n                  font-size: 22px;\n                  padding-left: 8px;\n                  align-self: center;\n\n                  i, svg {\n                    top: 50%;\n                    left: 2.5px;\n                    font-size: 12px;\n                    transform: translateY(calc(-50% + 1px));\n\n                    &.fa {\n                      font-size: 10px;\n                      transform: translateY(calc(-50% + 6px));\n                    }\n                  }\n\n                  svg {\n                    width: 12px;\n                    height: 12px;\n                  }\n                }\n\n                img, canvas {\n                  padding: 0;\n                  min-height: 22px;\n                  max-height: 22px;\n                }\n\n                > div {\n                  box-sizing: initial;\n                  display: flex;\n                  align-items: center;\n                  min-height: 30px;\n                }\n\n                > :first-child {\n                  max-width: 32px;\n                  padding: 0 3px 0 8px;\n                }\n\n                > :last-child {\n                  padding-right: 8px;\n                  text-align: right;\n                  justify-content: flex-end;\n                }\n\n                > :nth-child(2) {\n                  padding-left: 3px;\n                  display: block;\n                  white-space: nowrap;\n                  text-overflow: ellipsis;\n                  overflow: hidden;\n                  direction: rtl;\n                  text-align: left;\n                  line-height: 29px;\n                }\n              }\n            }\n          }\n\n          &.message {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            text-align: center;\n            font-size: 24px;\n            color: var(--color-subtle_text);\n          }\n        }\n\n        #browser-footer {\n          width: 100%;\n          background-color: var(--color-back);\n          height: 24px;\n          display: flex;\n          align-items: center;\n          padding: 0 24px 0 8px;\n          gap: 8px;\n        }\n\n        #display-type {\n          display: flex;\n\n          i {\n            font-size: 18px;\n            height: 24px;\n            min-width: 24px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n\n            &:hover {\n              color: var(--color-light);\n            }\n\n            &.selected {\n              background-color: var(--color-selected);\n              color: var(--color-light);\n            }\n          }\n        }\n\n        #files-header {\n          > div {\n            position: sticky;\n            top: 0;\n            background-color: var(--color-ui);\n            border-bottom: 2px solid var(--color-back);\n            text-align: left !important;\n            justify-content: space-between !important;\n            z-index: 2 !important;\n            color: var(--color-text);\n            gap: 8px;\n\n            &:hover {\n              color: var(--color-light);\n            }\n          }\n\n          > :first-child {\n            grid-column: span 2;\n            min-width: 100%;\n            box-sizing: border-box !important;\n\n            &::before {\n              content: \"\";\n              position: absolute;\n              height: 2px;\n              width: 16px;\n              left: -16px;\n              bottom: -2px;\n              background-color: var(--color-back);\n            }\n          }\n\n          > :nth-child(2) {\n            padding-left: 10px !important;\n          }\n\n          > :not(:last-child) {\n            border-right: 2px solid var(--color-back);\n          }\n\n          > :last-child::before {\n            content: \"\";\n            position: absolute;\n            height: 2px;\n            width: 16px;\n            right: -16px;\n            bottom: -2px;\n            background-color: var(--color-back);\n          }\n        }\n\n        #mode-tabs {\n          display: flex;\n          padding: 4px 4px 0;\n          background-color: var(--color-frame);\n          gap: 2px;\n          margin: -12px -16px -8px;\n\n          > div {\n            flex: 1;\n            border-top: 2px solid transparent;\n            cursor: pointer;\n            background-color: var(--color-back);\n            text-align: center;\n            padding: 4px 12px;\n\n            &.active {\n              background-color: var(--color-ui);\n              border-top: 2px solid var(--color-accent);\n              cursor: default;\n            }\n          }\n        }\n\n        #browser-comparison-sidebar {\n          border-left: 2px solid var(--color-back);\n          padding: 0 12px 12px;\n          overflow-y: auto;\n          height: calc(100% - 48px - 24px);\n          display: flex;\n          flex-direction: column;\n          gap: 10px;\n\n          > :first-child {\n            text-align: center;\n            font-weight: 600;\n            font-size: 20px;\n            position: sticky;\n            top: 0;\n            background-color: var(--color-ui);\n            padding-top: 8px;\n            margin-bottom: -4px;\n          }\n\n          img, canvas {\n            min-width: 64px;\n            min-height: 64px;\n            max-width: 64px;\n            max-height: 64px;\n            object-fit: contain;\n            display: block;\n            background-size: 16px 16px;\n            background-position: 0 0, 0 8px, 8px -8px, -8px 0px;\n          }\n\n          > .comparison {\n            text-align: center;\n            cursor: pointer;\n            padding: 4px 8px 8px;\n\n            * {\n              cursor: pointer;\n            }\n\n            &:hover {\n              background-color: var(--color-selected);\n            }\n\n            > :nth-child(3) {\n              margin-top: 2px;\n            }\n          }\n        }\n      }</style>`],\n      component: {\n        data: {\n          type: storage.type ?? \"release\",\n          manifest,\n          selectedVersions: Object.fromEntries(Object.keys(manifest.types).map(k => [k, null])),\n          version: null,\n          versionSearch: \"\",\n          recentVersions: storage.recents,\n          downloadedVersions: [],\n          objects: storage.objects,\n          jar: null,\n          loadingMessage: null,\n          path: [],\n          tree: {},\n          textureObserver: null,\n          lastInteracted: null,\n          shiftStartItem: null,\n          selected: [],\n          savedFolders: storage.savedFolders,\n          sidebarVisible: true,\n          navigationHistory: [],\n          navigationFuture: [],\n          breadcrumbsOverflowing: false,\n          breadcrumbsResizeObserver: null,\n          validSavedFolders: [],\n          activeSavedFolder: null,\n          displayType: storage.display ?? \"grid\",\n          lastArrowKeyPress: 0,\n          typeFindText: \"\",\n          typeFindLastKey: 0,\n          typeFindStart: 0,\n          sort: \"name\",\n          sortDirection: \"forwards\",\n          currentFolderData: {},\n          searchOpen: false,\n          searchText: \"\",\n          searchTimeout: null,\n          filesMessage: null,\n          itemCount: 0,\n          ready: Promise.withResolvers(),\n          lastOpenFormat: null,\n          progressDone: 0,\n          progressTotal: 0,\n          exporting: false,\n          mode: \"assets\",\n          compareType: storage.compareType ?? \"release\",\n          compareSelectedVersions: Object.fromEntries(Object.keys(manifest.types).map(k => [k, null])),\n          compareVersion: null,\n          recentComparisons: storage.recentComparisons,\n          suggestedComparisons: []\n        },\n        components: {\n          \"animated-texture\": animatedTexureComponent(),\n          \"lazy-scroller\": lazyScrollerComponent() \n        },\n        watch: {\n          loadingMessage(val) {\n            if (!val && this.jar) {\n              this.getValidSavedFolders()\n            }\n            this.$nextTick(() => {\n              if (!val && this.jar) {\n                this.setupBreadcrumbs()\n              }\n            })\n          },\n          savedFolders() {\n            this.getValidSavedFolders()\n          }\n        },\n        beforeDestroy() {\n          this.breadcrumbsResizeObserver.disconnect()\n        },\n        computed: {\n          currentFolderContents() {\n            this.currentFolderData = {}\n            let current\n            const searchText = this.searchText.trim().toLowerCase()\n\n            if (this.searchOpen && searchText) {\n              current = {}\n              const currentFolder = this.path.join(\"/\") + \"/\"\n              const folders = new Set\n              for (const k of Object.keys(this.jar.files)) {\n                folders.add(PathModule.dirname(k))\n                if (k.startsWith(currentFolder) || currentFolder === \"/\") {\n                  let relativePath = k\n                  if (currentFolder !== \"/\") {\n                    relativePath = k.slice(currentFolder.length)\n                  }\n                  if (relativePath.toLowerCase().includes(searchText)) {\n                    current[relativePath] = k\n                    this.$set(this.currentFolderData, relativePath, {\n                      label: this.getFileLabel(relativePath.split(\"/\"), relativePath, k),\n                      dimensions: this.getImageDimensions(k)\n                    })\n                  }\n                }\n              }\n              for (const folder of folders) {\n                if (folder === \".\") continue\n                if (folder.startsWith(currentFolder) || currentFolder === \"/\") {\n                  let relativePath = folder\n                  if (currentFolder !== \"/\") {\n                    relativePath = folder.slice(currentFolder.length)\n                  }\n                  if (relativePath.toLowerCase().includes(searchText)) {\n                    let content = this.tree\n                    for (const part of folder.split(\"/\")) {\n                      content = content[part]\n                    }\n                    current[relativePath] = content\n                    this.$set(this.currentFolderData, relativePath, {\n                      label: this.getFileLabel(relativePath.split(\"/\"), relativePath, content)\n                    })\n                  }\n                }\n              }\n            } else {\n              current = this.tree\n              for (const part of this.path) {\n                 current = current[part]\n              }\n              for (const [k, v] of Object.entries(current)) {\n                this.$set(this.currentFolderData, k, {\n                  label: this.getFileLabel(this.path, k, v),\n                  dimensions: typeof v === \"object\" ? undefined : this.getImageDimensions(v)\n                })\n              }\n            }\n\n            this.filesMessage = null\n            this.itemCount = Object.keys(current).length\n            if (this.itemCount > 4000) {\n              this.filesMessage = \"Too many results, try narrowing your search\"\n              return []\n            } else if (!this.itemCount) {\n              this.filesMessage = \"No results\"\n              return []\n            }\n\n            let entries\n\n            if (this.searchOpen && searchText && this.sort === \"name\") {\n              entries = Object.entries(current).sort(([ka, va], [kb, vb]) => {\n                ka = ka.toLowerCase()\n                kb = kb.toLowerCase()\n\n                const isFolderA = typeof va === \"object\"\n                const isFolderB = typeof vb === \"object\"\n\n                const extA = PathModule.extname(ka)\n                const extB = PathModule.extname(kb)\n                const baseA = PathModule.basename(ka, PathModule.extname(ka))\n                const baseB = PathModule.basename(kb, PathModule.extname(kb))\n\n                if (baseA === searchText && baseB === searchText) {\n                  if (isFolderA !== isFolderB) return isFolderA ? 1 : -1\n                  return naturalSorter(ka, kb)\n                }\n                if (baseA === searchText) return -1\n                if (baseB === searchText) return 1\n\n                const aIndex = ka.lastIndexOf(searchText)\n                const bIndex = kb.lastIndexOf(searchText)\n\n                const slashCount = (ka.slice(aIndex + searchText.length).match(/\\//g)?.length ?? 0) - (kb.slice(bIndex + searchText.length).match(/\\//g)?.length ?? 0)\n                if (slashCount !== 0) {\n                  return slashCount\n                }\n\n                const aBefore = ka.slice(0, aIndex).lastIndexOf(\"/\")\n                const aAfter = ka.slice(aIndex + searchText.length).indexOf(\"/\")\n                const aSection = PathModule.basename(ka.slice(\n                  aBefore === -1 ? 0 : aBefore + 1, \n                  aIndex + searchText.length + (aAfter === -1 ? Infinity : aAfter)\n                ), extA)\n\n                const bBefore = kb.slice(0, bIndex).lastIndexOf(\"/\")\n                const bAfter = kb.slice(bIndex + searchText.length).indexOf(\"/\")\n                const bSection = PathModule.basename(kb.slice(\n                  bBefore === -1 ? 0 : bBefore + 1, \n                  bIndex + searchText.length + (bAfter === -1 ? Infinity : bAfter)\n                ), extB)\n\n                if (aSection.startsWith(searchText)) {\n                  if (bSection.startsWith(searchText)) {\n                    const beforeSlashCount = (ka.slice(0, aIndex).match(/\\//g)?.length ?? 0) - (kb.slice(0, bIndex).match(/\\//g)?.length ?? 0)\n                    if (beforeSlashCount !== 0) return beforeSlashCount\n                    return naturalSorter(aSection, bSection)\n                  }\n                  return -1\n                }\n                if (bSection.startsWith(searchText)) return 1\n\n                return naturalSorter(aSection, bSection)\n              })\n              if (this.sortDirection === \"backwards\") {\n                entries.reverse()\n              }\n            } else {\n              entries = Object.entries(current).sort(([ka, va], [kb, vb]) => {\n                ka = ka.toLowerCase()\n                kb = kb.toLowerCase()\n\n                const isFolderA = typeof va === \"object\" || ka.endsWith(\".zip\")\n                const isFolderB = typeof vb === \"object\" || kb.endsWith(\".zip\")\n                if (this.sort === \"size\") {\n                  if (isFolderA && !isFolderB) return 1\n                  if (isFolderB && !isFolderA) return -1\n                } else {\n                  if (isFolderA && !isFolderB) return -1\n                  if (isFolderB && !isFolderA) return 1\n                }\n                if (this.sort === \"size\") {\n                  const dimsA = this.currentFolderData[ka].dimensions\n                  const dimsB = this.currentFolderData[kb].dimensions\n\n                  if (dimsA && !dimsB) return -1\n                  if (dimsB && !dimsA) return 1\n\n                  if (dimsA && dimsB) {\n                    const areaA = dimsA[0] * dimsA[1]\n                    const areaB = dimsB[0] * dimsB[1]\n                    if (areaA !== areaB) {\n                      return this.sortDirection === \"forwards\" ? areaB - areaA : areaA - areaB\n                    }\n                  }\n                } else if (this.sort === \"type\") {\n                  const labelA = this.currentFolderData[ka].label\n                  const labelB = this.currentFolderData[kb].label\n\n                  if (labelA && !labelB) return -1\n                  if (labelB && !labelA) return 1\n\n                  if (labelA && labelB) {\n                    const sort = this.sortDirection === \"forwards\" ? naturalSorter(labelA, labelB) : naturalSorter(labelB, labelA)\n                    if (sort) return sort\n                  }\n                }\n                return this.sortDirection === \"forwards\" ? naturalSorter(ka, kb) : naturalSorter(kb, ka)\n              })\n            }\n\n            this.lastInteracted = entries[0]?.[0]\n            this.selected = []\n            return entries\n          }\n        },\n        methods: {\n          updateVersion() {\n            if (this.selectedVersions[this.type]) {\n              this.version = this.selectedVersions[this.type]\n              storage.type = this.type\n              save()\n            }\n            if (this.compareSelectedVersions[this.compareType]) {\n              this.compareVersion = this.compareSelectedVersions[this.compareType]\n              storage.compareType = this.compareType\n              save()\n            }\n          },\n          async loadVersion(path = []) {\n            if (this.mode === \"assets\") {\n              this.loadingMessage = `Loading ${this.version}…`\n            } else {\n              this.loadingMessage = `Loading ${this.compareVersion} and ${this.version}…`\n            }\n            this.path = path\n            this.navigationHistory = [[]]\n            this.navigationFuture = []\n            this.searchOpen = false\n            this.searchText = \"\"\n            this.progressDone = 0\n            this.progressTotal = 0\n            if (this.mode === \"assets\") {\n              this.jar = await getVersionJar(this.version)\n            } else {\n              this.jar = await getVersionComparison(this.compareVersion, this.version)\n            }\n            if (!Object.keys(this.jar.files).length) {\n              this.jar = null\n              this.loadingMessage = null\n              Blockbench.showQuickMessage(\"Unable to load version. It may be corrupted\")\n              return\n            }\n            if (this.mode === \"assets\" && this.objects) {\n              for (const [k, v] of Object.entries(await getVersionObjects(this, this.version))) {\n                if (k.endsWith(\".png\") || k.endsWith(\".jpg\") || k.endsWith(\".jpeg\")) {\n                  v.content = await fs.promises.readFile(v.path)\n                  const img = new Image\n                  img.src = \"data:image/png;base64,\" + v.content.toString(\"base64\")\n                  v.image = img\n                }\n                this.$set(this.jar.files, k, v)\n              }\n            }\n            if (!this.jar.optifineLoaded && this.version.includes(\"OptiFine\")) {\n              const folderName = this.version.replace(\"-OptiFine\", \"\")\n              const libraryFile = PathModule.join(settings.ewan_minecraft_directory.value, \"libraries\", \"optifine\", \"OptiFine\", folderName, `OptiFine-${folderName}.jar`)\n              if (await exists(libraryFile)) {\n                const zip = parseZip(await fs.promises.readFile(libraryFile).then(e => e.buffer))\n                for (const [k, v] of Object.entries(zip.files)) {\n                  this.$set(this.jar.files, k, v)\n                }\n                this.jar.optifineLoaded = true\n              }\n            }\n            this.tree = {}\n            for (let [path, value] of Object.entries(this.jar.files)) {\n              const parts = path.split(\"/\")\n              if (parts[0] === \"optifine\") continue\n              let current = this.tree\n              const zip = parts.some(e => e.endsWith(\".zip\"))\n              for (const [index, part] of parts.entries()) {\n                if (!current[part]) {\n                  current[part] = index === parts.length - 1 ? path : {}\n                }\n                current = current[part]\n              }\n            }\n            if (this.tree.resource_pack?.textures?.[\"flipbook_textures.json\"]) {\n              this.jar.flipbook = JSON.parse(this.jar.files[this.tree.resource_pack.textures[\"flipbook_textures.json\"]].content.toString().replace(/\\/\\/.*$/gm, \"\"))\n              this.jar.flipbook.push({\n                flipbook_texture: \"textures/flame_atlas\"\n              })\n            }\n            if (this.mode === \"assets\") {\n              if (storage.recents.includes(this.version)) {\n                storage.recents.splice(storage.recents.indexOf(this.version), 1)\n              }\n              storage.recents.unshift(this.version)\n              if (storage.length > 20) {\n                storage.recents.length = 20\n              }\n            } else {\n              const index = storage.recentComparisons.findIndex(e => e[0] === this.compareVersion && e[1] === this.version)\n              if (index !== -1) {\n                storage.recentComparisons.splice(index, 1)\n              }\n              storage.recentComparisons.unshift([this.compareVersion, this.version])\n              if (storage.length > 20) {\n                storage.recentComparisons.length = 20\n              }\n            }\n            save()\n            this.loadingMessage = null\n          },\n          hasAnimation(file) {\n            if (this.jar.files[file].animation === false) return\n            if (this.jar.files[file].animation) return true\n            if (this.jar.flipbook) {\n              const split = file.split(\"/\")\n              if (split[0] === \"resource_pack\") {\n                const texture = split.slice(1).join(\"/\").slice(0, -4)\n                const anim = this.jar.flipbook.find(e => e.flipbook_texture === texture)\n                if (anim) {\n                  this.jar.files[file].animation = {\n                    animation: {\n                      frametime: anim.ticks_per_frame,\n                      interpolate: anim.blend_frames ?? true,\n                      frames: anim.frames\n                    }\n                  }\n                  return true\n                }\n              }\n              this.jar.files[file].animation = false\n              return\n            }\n            const mcmeta = this.jar.files[file + \".mcmeta\"]\n            if (mcmeta) {\n              try {\n                const data = JSON.parse(mcmeta.content)\n                if (data.animation) {\n                  this.jar.files[file].animation = data\n                  return true\n                }\n              } catch {}\n              this.jar.files[file].animation = false\n            }\n          },\n          select(file, value, event) {\n            if (event.currentTarget.dataset.lastClick) {\n              if (Date.now() - Number(event.currentTarget.dataset.lastClick) < 500) {\n                if (typeof value === \"object\") {\n                  return this.openFolder(this.path.concat(file))\n                } else {\n                  return this.openFiles()\n                }\n              }\n            }\n            event.currentTarget.dataset.lastClick = Date.now()\n\n            const keys = this.currentFolderContents.map(entry => entry[0])\n\n            if (!event.shiftKey) {\n              this.shiftStartItem = null\n            }\n            if (event.shiftKey) {\n              if (!this.shiftStartItem) {\n                this.shiftStartItem = this.lastInteracted\n              }\n              const start = keys.indexOf(this.shiftStartItem)\n              const selected = this.selected.includes(this.shiftStartItem)\n              const end = keys.indexOf(file)\n              const range = keys.slice(Math.min(start, end), Math.max(start, end) + 1)\n              if (event.ctrlKey || event.metaKey) {\n                if (selected) {\n                  this.selected = Array.from(new Set(this.selected.concat(range)))\n                } else {\n                  this.selected = this.selected.filter(e => !range.includes(e))\n                }\n              } else {\n                this.selected = range\n              }\n            } else if (event.ctrlKey || event.metaKey) {\n              const index = this.selected.indexOf(file)\n              if (index !== -1) {\n                this.selected.splice(index, 1)\n              } else {\n                this.selected.push(file)\n              }\n            } else {\n              this.selected = [file]\n            }\n\n            this.lastInteracted = file\n          },\n          async getFileContent(file) {\n            const data = this.jar.files[file] ?? this.jar.zips?.[file]\n            if (!data) return\n            if (!data.content) {\n              data.content = await fs.promises.readFile(data.path)\n            }\n            return data.content\n          },\n          getFileContentSync(file) {\n            const data = this.jar.files[file] ?? this.jar.zips?.[file]\n            if (!data) return\n            if (!data.content) {\n              data.content = fs.readFileSync(data.path)\n            }\n            return data.content\n          },\n          async openFilesCheck() {\n            if (this.selected.length <= 16) return true\n            if (!await confirm(\"Open files\", `You are about to open ${this.selected.length.toLocaleString()} files. Are you sure you want to continue?`)) return\n            if (this.selected.length > 128) {\n              if (!await confirm(\"Open files\", `Are you really sure? ${this.selected.length.toLocaleString()} files is a lot. Are you absolutely sure you want to continue?`)) return\n            }\n            return true\n          },\n          async openFiles() {\n            if (!(await this.openFilesCheck())) return\n            const files = this.selected.map(e => {\n              const path = this.path.concat(e).join(\"/\")\n              return ({\n                name: e,\n                path\n              })\n            })\n            let closeDialog\n            const blockbenchOpen = []\n            await Promise.all(files.map(async file => {\n              const content = await this.getFileContent(file.path)\n              if (!content) return\n              if (file.name.endsWith(\".png\")) {\n                Codecs.image.load([{\n                  content: \"data:image/png;base64,\" + content.toString(\"base64\")\n                }], name)\n                closeDialog = true\n              } else if (file.name.endsWith(\".zip\")) {\n                await this.loadZip(file.path)\n                this.openFolder(this.path.concat(file.name))\n              } else if (await this.blockbenchOpenable(file.path)) {\n                try {\n                  blockbenchOpen.push({\n                    content: JSON.parse(content),\n                    name: file.name,\n                    path: this.path.concat(file.name).join(\"/\"),\n                    type: this.jar.files[file.path].formatType ?? \"json\"\n                  })\n                  if (this.jar.files[file.path].formatType) {\n                    closeDialog = true\n                  }\n                } catch {\n                  blockbenchOpen.push({\n                    content: content.toString(),\n                    name: file.name,\n                    path: this.path.concat(file.name).join(\"/\")\n                  })\n                }\n              } else {\n                this.openExternally(file.path)\n              }\n            }))\n            if (closeDialog) {\n              dialog.close()\n            }\n            if (blockbenchOpen.length) {\n              for (const file of blockbenchOpen) {\n                if (file.type === \"java\") {\n                  await this.loadJavaBlockItemModel(file, blockbenchOpen.length)\n                } else if (file.type === \"bedrock\") {\n                  loadModelFile({\n                    content: JSON.stringify(file.content),\n                    path: `${Date.now()}${osfs}${file.name}`\n                  }, {\n                    externalDataLoader: data => {\n                      if (typeof data === \"string\") {\n                        return this.getFileContentSync(`resource_pack/${data}`)\n                      }\n                      const files = Object.keys(this.jar.files).filter(e => e.startsWith(`resource_pack/${data.dir}`)).filter(data.filter)\n                      for (const file of files) {\n                        const content = this.getFileContentSync(file).toString()\n                        const output = data.find(content)\n                        if (output) {\n                          if (data.return === \"find\") {\n                            return output\n                          } else {\n                            return content\n                          }\n                        }\n                      }\n                    }\n                  })\n                } else {\n                  const extension = PathModule.extname(file.name) || \".txt\"\n                  const parent = this\n                  new Dialog({\n                    id: id + \"_text_viewer\",\n                    title: file.name,\n                    width: 816,\n                    resizable: true,\n                    buttons: [],\n                    lines: [`<style>#${id}_text_viewer {\n                      max-height: calc(100vh - 60px);\n\n                      .dialog_wrapper {\n                        height: calc(100% - 30px);\n                      }\n\n                      .dialog_content {\n                        height: 100%;\n                        margin: 0;\n                        background-color: var(--color-back);\n                        max-height: calc(100vh - 90px);\n                      }\n\n                      #${id}_text_viewer_container {\n                        height: 100%;\n                      }\n\n                      #${id}_text_viewer_editor {\n                        height: calc(100% - 32px);\n                      }\n\n                      .prism-editor-wrapper {\n                        border: none;\n                        user-select: text !important;\n                      }\n\n                      .prism-editor__line-numbers {\n                        min-height: 320px !important;\n                        user-select: none;\n                        position: sticky;\n                        left: 0;\n                        overflow: visible;\n\n                        &::before {\n                          content: \"\";\n                          position: absolute;\n                          inset: 0 -8px 0 -4px;\n                          background-color: var(--color-back);\n                          z-index: -1;\n                        }\n                      }\n\n                      #${id}_toolbar {\n                        display: flex;\n                        background-color: var(--color-ui);\n\n                        > div {\n                          cursor: pointer;\n                          padding: 4px 8px;\n\n                          &:hover,\n                          &.active {\n                            background-color: var(--color-selected);\n                          }\n                        }\n                      }\n                    }`],\n                    component: {\n                      data: {\n                        content: file.type === \"json\" ? autoStringify(file.content) : file.content,\n                        type: file.type,\n                        activeToolbarItem: null,\n                        extension,\n                        name: PathModule.basename(file.name, extension)\n                      },\n                      components: {\n                        VuePrismEditor\n                      },\n                      methods: {\n                        contextMenu(event, id, menu) {\n                          this.activeToolbarItem = id\n                          const coords = event.currentTarget.getBoundingClientRect()\n                          return new Menu(`${id}_context_menu`, menu, {\n                            onClose: () => this.activeToolbarItem = null\n                          }).open({\n                            clientX: coords.left,\n                            clientY: coords.bottom - 1\n                          })\n                        },\n                        contentContextMenu(event) {\n                          const selection = window.getSelection().toString()\n                          new Menu(`${id}_context_menu`, [\n                            {\n                              id: \"copy\",\n                              name: \"Copy\",\n                              icon: \"content_copy\",\n                              click: () => navigator.clipboard.writeText(selection || this.content)\n                            }\n                          ]).open(event)\n                        },\n                        fileContextMenu(event) {\n                          this.contextMenu(event, \"file\", [\n                            {\n                              id: \"save\",\n                              name: \"Save\",\n                              icon: \"save\",\n                              click: () => Blockbench.export({\n                                extensions: [this.extension.slice(1)],\n                                type: this.extension.toUpperCase(),\n                                name: this.name,\n                                savetype: \"buffer\",\n                                content: Buffer.from(this.content)\n                              }, () => Blockbench.showQuickMessage(`Saved ${file.name}`))\n                            },\n                            {\n                              id: \"copy\",\n                              name: \"Copy\",\n                              icon: \"content_copy\",\n                              click: () => navigator.clipboard.writeText(this.content)\n                            }\n                          ])\n                        },\n                        editContextMenu(event) {\n                          this.contextMenu(event, \"edit\", [{\n                            id: \"edit_externally\",\n                            name: \"Edit Externally\",\n                            icon: \"open_in_new\",\n                            click: () => parent.openExternally(file.path)\n                          }])\n                        },\n                        languageContextMenu(event) {\n                          const menu = this.contextMenu(event, \"language\", [\n                            {\n                              id: \"text\",\n                              name: \"Text\",\n                              icon: \"text_fields\",\n                              click: () => this.type = \"plaintext\",\n                              enabled: true\n                            },\n                            {\n                              id: \"json\",\n                              name: \"JSON\",\n                              icon: \"data_object\",\n                              click: () => this.type = \"json\",\n                              enabled: true\n                            }\n                          ])\n                          if (this.type === \"json\") {\n                            menu.node.children[1].classList.add(\"enabled\")\n                          } else {\n                            menu.node.children[0].classList.add(\"enabled\")\n                          }\n                        },\n                        handleKeydown(event) {\n                          if ((event.ctrlKey || event.metaKey) && event.key === \"c\") {\n                            const selection = window.getSelection().toString()\n                            if (selection) {\n                              navigator.clipboard.writeText(selection)\n                            }\n                          }\n                        }\n                      },\n                      template: `\n                        <div id=\"${id}_text_viewer_container\" @keydown=\"handleKeydown\" tabindex=\"0\">\n                          <div id=\"${id}_toolbar\">\n                            <div @click=\"fileContextMenu\" @contextmenu=\"fileContextMenu\" :class=\"{ active: activeToolbarItem === 'file' }\">File</div>\n                            <div @click=\"editContextMenu\" @contextmenu=\"editContextMenu\" :class=\"{ active: activeToolbarItem === 'edit' }\">Edit</div>\n                            <div @click=\"languageContextMenu\" @contextmenu=\"languageContextMenu\" :class=\"{ active: activeToolbarItem === 'language' }\">Language</div>\n                          </div>\n                          <vue-prism-editor id=\"${id}_text_viewer_editor\" v-model=\"content\" :language=\"type\" line-numbers readonly @contextmenu=\"contentContextMenu\"/>\n                        </div>\n                      `\n                    },\n                    onBuild() {\n                      setTimeout(() => {\n                        this.object.style.height = this.object.clientHeight + \"px\"\n                      })\n                    }\n                  }).show()\n                }\n              }\n            }\n          },\n          async loadJavaBlockItemModel(model, loadCount = 1, importMode) {\n            const externalDataLoader = path => this.getFileContentSync(`assets/minecraft/${path}`)\n            if (importMode) {\n              Codecs.java_block.parse(model.content, model.name, {\n                import_to_current_project: true,\n                externalDataLoader\n              })\n            } else {\n              loadModelFile({\n                content: JSON.stringify(model.content),\n                path: `${Date.now()}${osfs}${model.name}`\n              }, {\n                externalDataLoader\n              })\n            }\n          },\n          async blockbenchOpenable(file) {\n            const data = this.jar.files[file]\n            if (data.blockbenchOpenable !== undefined) return data.blockbenchOpenable\n            if ([\"png\", \"zip\", \"mcmeta\", \"txt\", \"cfg\", \"glsl\", \"vsh\", \"fsh\", \"properties\"].includes(PathModule.extname(file).slice(1)) || !file.includes(\".\")) {\n              data.blockbenchOpenable = true\n              return true\n            }\n            if (!file.endsWith(\".json\")) {\n              data.blockbenchOpenable = false\n              return false\n            }\n            data.blockbenchOpenable = true\n            const content = await this.getFileContent(file)\n            try {\n              const fileData = JSON.parse(content)\n              const keys = Object.keys(fileData)\n              if (keys.every(e => javaBlock.items.has(e)) && keys.some(e => javaBlock.oneOf.has(e))) {\n                data.formatType = \"java\"\n              } else if (keys.includes(\"format_version\") && keys.some(e => e.includes(\"geometry\"))) {\n                data.formatType = \"bedrock\"\n              }\n            } catch {}\n            return true\n          },\n          async blockbenchImportable(file) {\n            const data = this.jar.files[file]\n            if (data.blockbenchImportable !== undefined) {\n              return typeof data.blockbenchImportable === \"function\" ? data.blockbenchImportable() : data.blockbenchImportable\n            }\n            if (file.endsWith(\".png\")) {\n              data.blockbenchImportable = true\n              return true\n            }\n            if (!file.endsWith(\".json\")) {\n              data.blockbenchImportable = false\n              return false\n            }\n            data.blockbenchImportable = false\n            const content = await this.getFileContent(file)\n            try {\n              const fileData = JSON.parse(content)\n              const keys = Object.keys(fileData)\n              if (keys.every(e => javaBlock.items.has(e)) && keys.some(e => javaBlock.oneOf.has(e))) {\n                data.formatType = \"java\"\n                data.blockbenchImportable = () => Format.id === \"java_block\"\n              }\n            } catch {}\n            return typeof data.blockbenchImportable === \"function\" ? data.blockbenchImportable() : data.blockbenchImportable\n          },\n          async openExternally(file) {\n            const { exec } = require(\"child_process\")\n            if (exec) {\n              const extension = PathModule.extname(file)\n              const tempPath = PathModule.join(SystemInfo.temp_directory, `${PathModule.basename(file, extension)}_${Date.now()}${extension}`)\n              fs.writeFileSync(tempPath, await this.getFileContent(file))\n              if (extension) {\n                if (SystemInfo.platform === \"win32\") {\n                  exec(`\"${tempPath}\"`)\n                } else if (SystemInfo.platform === \"darwin\") {\n                  exec(`open \"${tempPath}\"`)\n                } else {\n                  exec(`xdg-open \"${tempPath}\"`)\n                }\n              } else if (SystemInfo.platform === \"win32\") {\n                exec(`notepad.exe \"${tempPath}\"`)\n              } else if (SystemInfo.platform === \"darwin\") {\n                exec(`open -a \"TextEdit\" \"${tempPath}\"`)\n              } else {\n                exec(`xdg-open \"${tempPath}\"`)\n              }\n            }\n          },\n          async exportFiles(files) {\n            let current = this.tree\n            for (const part of this.path) {\n              current = current[part]\n            }\n            if (files.length === 1 && (this.jar.files[this.path.concat(files[0]).join(\"/\")] || files[0].endsWith(\".zip\"))) {\n              const ext = PathModule.extname(files[0]).slice(1) || \"txt\"\n              return Blockbench.export({\n                extensions: [ext],\n                type: ext.toUpperCase(),\n                name: PathModule.basename(files[0], \".\" + ext),\n                savetype: \"buffer\",\n                content: await this.getFileContent(this.path.concat(files[0]).join(\"/\"))\n              }, () => Blockbench.showQuickMessage(`Exported ${files[0]}`))\n            }\n            const dir = Blockbench.pickDirectory()\n            if (!dir) return\n            if (!(await confirm(\"Confirm Export\", `Are you sure you want to export to the following folder:<br><code>${dir}</code><br><br>Existing files with matching names will be overwritten.`))) return\n\n            this.exporting = true\n            this.loadingMessage = \"Exporting files…\"\n            this.progressDone = 0\n            this.progressTotal = 0\n            \n            const folders = new Set()\n            const exportFiles = new Set()\n\n            async function traverse(node, currentPath) {\n              let hasFiles = false\n              for (const key of Object.keys(node)) {\n                const newPath = currentPath.concat(key)\n                if (typeof node[key] === \"string\" || key.endsWith(\".zip\")) {\n                  exportFiles.add(newPath.join(\"/\"))\n                  hasFiles = true\n                } else {\n                  if (await traverse(node[key], newPath)) {\n                    folders.add(newPath.join(\"/\"))\n                  }\n                }\n              }\n              return hasFiles\n            }\n\n            const start = current\n            for (const file of files) {\n              current = start\n              const path = file.split(\"/\")\n              const name = path.pop()\n              for (const part of path) {\n                current = current[part]\n              }\n              if (typeof current[name] === \"string\" || name.endsWith(\".zip\")) {\n                exportFiles.add(file)\n                if (path.length) {\n                  folders.add(path.join(\"/\"))\n                }\n              } else {\n                folders.add(file)\n                await traverse(current[name], path.concat(name))\n              }\n            }\n\n            this.progressTotal = exportFiles.size\n\n            await Promise.all(Array.from(folders).map(folder => fs.promises.mkdir(PathModule.join(dir, folder), { recursive: true })))\n            \n            const exportFilesArray = Array.from(exportFiles)\n            for (let i = 0; i < exportFiles.size; i += 256) {\n              await Promise.all(exportFilesArray.slice(i, i + 256).map(async filePath => {\n                await fs.promises.writeFile(PathModule.join(dir, filePath), await this.getFileContent(this.path.concat(filePath).join(\"/\")))\n                this.progressDone++\n              }))\n            }\n\n            Blockbench.showQuickMessage(`Exported ${exportFiles.size} files`)\n\n            this.exporting = false\n            this.loadingMessage = null\n          },\n          getVersionIcon(id) {\n            id = id.toLowerCase()\n            let icon = \"history\"\n            if (id.includes(\"optifine\")) icon = \"icon-format_optifine\"\n            else if (id.includes(\"quilt\")) icon = \"widgets\"\n            else if (id.includes(\"forge\")) return customIcons.forge\n            else if (id.includes(\"neoforge\")) return customIcons.neoforge\n            else if (id.includes(\"fabric\")) return customIcons.fabric\n            else if (id.includes(\"preview\") || /^\\d{2}w\\d{2}[a-z]$/.test(id) || /^\\d+\\.\\d+(?:\\.\\d+)?-(?:snapshot|pre|rc)-?\\d+$/.test(id)) icon = \"update\"\n            else if (id.startsWith(\"v\")) icon = \"icon-format_bedrock\"\n            else if (/^[\\d\\.]+$/.test(id)) icon = \"icon-format_java\"\n            const element = Blockbench.getIconNode(icon)\n            if (id.includes(\"quilt\")) {\n              element.style.rotate = \"90deg\"\n            }\n            return element.outerHTML\n          },\n          async getDetailedSelection() {\n            const currentFolder = this.path.join(\"/\")\n            const selected = await Promise.all(this.selected.map(async e => {\n              const path = currentFolder ? currentFolder + \"/\" + e : e\n              const isFolder = !this.jar.files[path] || e.endsWith(\".zip\")\n              const dir = PathModule.dirname(path)\n              return {\n                name: e,\n                path: path,\n                folder: dir === \".\" ? \"\" : dir,\n                type: isFolder ? \"folder\" : \"file\",\n                openable: isFolder || await this.blockbenchOpenable(path),\n                importable: !isFolder && await this.blockbenchImportable(path)\n              }\n            }))\n            return [\n              selected,\n              selected.some(e => e.type === \"folder\") && selected.some(e => e.type === \"file\") ? \"multi\" : selected.some(e => e.type === \"folder\") ? \"folder\" : \"file\"\n            ]\n          },\n          async fileContextMenu(name, event) {\n            this.lastInteracted = name\n            if (!this.selected.includes(name)) {\n              this.selected = [name]\n            }\n            const [selected, selectionType] = await this.getDetailedSelection()\n            const currentFolder = this.path.join(\"/\")\n            new Menu(`${id}_context_menu`, [\n              {\n                id: \"open\",\n                name: \"Open\",\n                icon: selectionType === \"folder\" ? \"folder_open\" : \"file_open\",\n                condition: selectionType !== \"multi\" && (selectionType === \"folder\" && selected.length === 1 || selectionType === \"file\" && selected.some(e => e.openable)),\n                click: () => selectionType === \"folder\" ? this.path.push(selected[0].name) : this.openFiles()\n              },\n              {\n                id: \"open_externally\",\n                name: \"Open Externally\",\n                icon: \"open_in_new\",\n                condition: selected.every(e => e.type === \"file\" || e.name.endsWith(\"zip\")),\n                click: async () => {\n                  if (!(await this.openFilesCheck())) return\n                  for (const file of selected) {\n                    this.openExternally(file.path)\n                  }\n                }\n              },\n              {\n                id: \"open_file_location\",\n                name: \"Open File Location\",\n                icon: \"drive_file_move\",\n                condition: selected.every(e => e.folder === selected[0].folder) && selected[0].folder !== currentFolder,\n                click: () => this.openFolder(selected[0].folder.split(\"/\"))\n              },\n              \"_\",\n              {\n                id: \"import_to_project\",\n                name: \"Import to Project\",\n                icon: \"enable\",\n                condition: Project && selectionType === \"file\" && selected.some(e => e.importable),\n                click: async () => {\n                  if (!(await this.openFilesCheck())) return\n                  dialog.close()\n                  const filtered = selected.filter(e => e.importable)\n                  for (const file of filtered) {\n                    if (file.name.endsWith(\".png\")) {\n                      new Texture({\n                        name: PathModule.basename(file.name),\n                      }).fromDataURL(\"data:image/png;base64,\" + (await this.getFileContent(file.path)).toString(\"base64\")).add()\n                    } else {\n                      this.loadJavaBlockItemModel({\n                        content: JSON.parse(await this.getFileContent(file.path)),\n                        name: file.name\n                      }, filtered.length, true)\n                    }\n                  }\n                }\n              },\n              {\n                id: \"pin_to_sidebar\",\n                name: \"Pin to Sidebar\",\n                icon: \"push_pin\",\n                condition: selectionType === \"folder\" && selected.some(e => {\n                  let path = e.path\n                  if (this.mode === \"compare\" && this.path.length) {\n                    path = path.replace(/^[^\\/]+\\//, \"\")\n                  }\n                  return !this.savedFolders.some(saved => saved[0].join(\"/\") === path)\n                }),\n                click: () => {\n                  let path = this.path\n                  if (this.mode === \"compare\" && this.path.length) {\n                    path = path.slice(1)\n                  }\n                  for (const folder of selected) {\n                    let folderPath = folder.path\n                    if (this.mode === \"compare\" && this.path.length) {\n                      folderPath = folderPath.replace(/^[^\\/]+\\//, \"\")\n                    }\n                    if (!this.savedFolders.some(saved => saved[0].join(\"/\") === folderPath)) {\n                      storage.savedFolders.push([path.slice().concat(folder.name)])\n                    }\n                  }\n                  save()\n                }\n              },\n              {\n                id: \"unpin_from_sidebar\",\n                name: \"Unpin from Sidebar\",\n                icon: \"push_pin\",\n                condition: selectionType === \"folder\" && !selected.some(e => {\n                  let path = e.path\n                  if (this.mode === \"compare\" && this.path.length) {\n                    path = path.replace(/^[^\\/]+\\//, \"\")\n                  }\n                  return !this.savedFolders.some(saved => saved[0].join(\"/\") === path)\n                }),\n                click: () => {\n                  for (const folder of selected) {\n                    let folderPath = folder.path\n                    if (this.mode === \"compare\" && this.path.length) {\n                      folderPath = folderPath.replace(/^[^\\/]+\\//, \"\")\n                    }\n                    const index = this.savedFolders.findIndex(e => e[0].join(\"/\") === folderPath)\n                    if (index !== -1) {\n                      storage.savedFolders.splice(index, 1)\n                    }\n                  }\n                  save()\n                }\n              },\n              \"_\",\n              {\n                id: \"export\",\n                name: \"Export\",\n                icon: \"fa-file-export\",\n                click: () => this.exportFiles(this.selected)\n              }\n            ]).open(event)\n          },\n          sidebarItemContextMenu(folder, event) {\n            this.activeSavedFolder = folder\n            new Menu(`${id}_context_menu`, [\n              {\n                id: \"open\",\n                name: \"Open\",\n                icon: \"folder_open\",\n                click: () => this.path = folder.slice()\n              },\n              \"_\",\n              {\n                id: \"rename\",\n                name: \"Rename\",\n                icon: \"edit\",\n                click: () => {\n                  new Dialog({\n                    id: \"asset_browser_rename_sidebar_item\",\n                    title: \"Rename Pinned Folder\",\n                    part_order: [\"form\", \"lines\"],\n                    form: {\n                      path: {\n                        type: \"info\",\n                        text: `<div style=\"display: flex; align-items: center;\"><div style=\"min-width: 149px;\">Path:</div> ${folder[0].join(\"/\")}</div>`\n                      },\n                      name: {\n                        label: \"Name\",\n                        placeholder: \"Textures\",\n                        value: folder[1] ?? folder[0][folder[0].length - 1]\n                      },\n                      icon: {\n                        label: \"Icon\",\n                        placeholder: \"image\",\n                        value: folder[2]\n                      }\n                    },\n                    lines: [`\n                      <style>\n                        #asset_browser_rename_sidebar_item {\n                          table {\n                            width: 100%;\n                            border-collapse: collapse;\n                          }\n\n                          code {\n                            background-color: var(--color-back);\n                            border: 1px solid var(--color-border);\n                            padding: 0 4px;\n                          }\n\n                          th, td {\n                            border: 1px solid var(--color-border);\n                            padding: 4px 8px;\n                          }\n                        }\n                      </style>\n                      <p style=\"margin: 16px 0 8px;\">Icons can be from any of the following sources:</p>\n                      <table>\n                        <thead>\n                          <tr>\n                            <th>Icon Source</th>\n                            <th>Formatting</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          <tr>\n                            <td><a href=\"https://fonts.google.com/icons\">Google Material Icons</a></td>\n                            <td><code>icon_name</code></td>\n                          </tr>\n                          <tr>\n                            <td><a href=\"https://fontawesome.com/search?ic=free\">Font Awesome Free</a></td>\n                            <td><code>fa-icon-name</code></td>\n                          </tr>\n                          <tr>\n                            <td><a href=\"https://www.blockbench.net/wiki/docs/blockbench#available-icons\">Blockbench</a></td>\n                            <td><code>icon-icon_name</code></td>\n                          </tr>\n                        </tbody>\n                      </table>\n                    `],\n                    onConfirm: result => {\n                      this.$set(folder, 1, result.name.trim() || null)\n                      this.$set(folder, 2, result.icon.trim().toLowerCase().replaceAll(\" \", \"_\") || null)\n                      save()\n                    }\n                  }).show()\n                }\n              },\n              \"_\",\n              {\n                id: \"move_up\",\n                name: \"Move Up\",\n                icon: \"arrow_upward\",\n                condition: this.validSavedFolders[0] !== folder,\n                click: () => {\n                  storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1)\n                  storage.savedFolders.splice(storage.savedFolders.indexOf(this.validSavedFolders[this.validSavedFolders.indexOf(folder) - 1]), 0, folder)\n                  save()\n                }\n              },\n              {\n                id: \"move_down\",\n                name: \"Move Down\",\n                icon: \"arrow_downward\",\n                condition: this.validSavedFolders[this.validSavedFolders.length - 1] !== folder,\n                click: () => {\n                  storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1)\n                  storage.savedFolders.splice(storage.savedFolders.indexOf(this.validSavedFolders[this.validSavedFolders.indexOf(folder) + 1]) + 1, 0, folder)\n                  save()\n                }\n              },\n              \"_\",\n              {\n                id: \"unpin_from_sidebar\",\n                name: \"Unpin from Sidebar\",\n                icon: \"push_pin\",\n                click: () => {\n                  storage.savedFolders.splice(storage.savedFolders.indexOf(folder), 1)\n                  save()\n                }\n              },\n              \"_\",\n              {\n                id: \"reset\",\n                name: \"Reset Sidebar\",\n                icon: \"replay\",\n                click: () => {\n                  loadSidebar(true)\n                }\n              }\n            ], {\n              onClose: () => this.activeSavedFolder = null\n            }).open(event)\n          },\n          sidebarContextMenu(event) {\n            new Menu(`${id}_context_menu`, [\n              {\n                id: \"reset\",\n                name: \"Reset Sidebar\",\n                icon: \"replay\",\n                click: () => {\n                  loadSidebar(true)\n                }\n              }\n            ]).show(event)\n          },\n          folderContextMenu(event) {\n            new Menu(`${id}_context_menu`, [\n              {\n                id: \"export_selection\",\n                name: \"Export Selection\",\n                icon: \"fa-file-export\",\n                condition: this.selected.length,\n                click: () => this.exportFiles(this.selected)\n              },\n              {\n                id: \"export_folder\",\n                name: \"Export Folder\",\n                icon: \"fa-file-export\",\n                click: () => this.exportFiles(this.currentFolderContents.map(e => e[0]))\n              }\n            ]).open(event)\n          },\n          getFileIcon(file, value) {\n            if (file.includes(\".lang\") || value.startsWith(\"assets/minecraft/lang/\")) return \"translate\"\n            if (file.endsWith(\".json\") || file === \"pack.mcmeta\") return \"data_object\"\n            if (file.endsWith(\".fsh\") || file.endsWith(\".vsh\") || file.endsWith(\".glsl\")) return \"ev_shadow\"\n            if (file.includes(\".mcmeta\")) return \"theaters\"\n            if (file.includes(\".tga\")) return \"image\"\n            if (file.endsWith(\".ogg\") || file.endsWith(\".fsb\") || file.endsWith(\".mus\")) return \"volume_up\"\n            if (file.includes(\".zip\")) return \"folder_zip\"\n            if (file.includes(\".properties\")) return \"list_alt\"\n            if (file.includes(\".txt\")) return \"description\"\n            return \"draft\"\n          },\n          getFolderIcon(path, custom) {\n            if (custom) {\n              return Blockbench.getIconNode(custom).outerHTML\n            }\n            if (!Array.isArray(path)) {\n              path = [path]\n            }\n            let icon\n            for (let i = path.length - 1; i >= 0; i--) {\n              const part = path[i]\n              if (part === \"textures\") icon = \"image\"\n              else if (part === \"models\" || part === \"blocks\" || part === \"block\") icon = \"deployed_code\"\n              else if (part === \"items\" || part === \"item\") icon = \"swords\"\n              else if (part === \"sounds\") icon = \"volume_up\"\n              else if (part === \"shaders\") icon = \"ev_shadow\"\n              else if (part === \"lang\") icon = \"translate\"\n              else if (part === \"texts\") icon = \"text_fields\"\n              else if (part === \"particles\" || part === \"particle\") icon = \"auto_awesome\"\n              else if (part === \"atlases\" || part === \"map\") icon = \"map\"\n              else if (part === \"font\") icon = \"font_download\"\n              else if (part === \"post_effect\") icon = \"desktop_windows\"\n              else if (part === \"resourcepacks\") icon = \"folder_zip\"\n              else if (part === \"equipment\") icon = \"checkroom\"\n              else if (part === \"blockstates\") icon = \"view_in_ar\"\n              else if (part === \"entities\" || part === \"entity\" || part === \"mob\") icon = \"creeper\"\n              else if (part === \"painting\") icon = \"brush\"\n              else if (part === \"gui\" || part === \"ui\") icon = \"call_to_action\"\n              else if (part === \"environment\") icon = \"light_mode\"\n              else if (part === \"colormap\" || part === \"color_palettes\") icon = \"palette\"\n              else if (part === \"misc\") icon = \"help\"\n              else if (part === \"trims\") icon = \"fa-gem\"\n              else if (part === \"effect\" || part === \"mob_effect\") icon = \"auto_fix\"\n              else if (part === \"optifine\" || part === \"mob_effect\") icon = \"icon-format_optifine\"\n              else if (part === \"persona_thumbnails\") icon = \"groups\"\n              else if (part === \"animations\") icon = \"sync\"\n              else if (part === \"animation_controllers\") icon = \"rule_settings\"\n              else if (part === \"render_controllers\") icon = \"visibility\"\n              else if (part === \"fogs\") icon = \"foggy\"\n              else if (part === \"attachables\") icon = \"electrical_services\"\n              else if (part === \"ctm\") icon = \"extension\"\n              else if (part === \"added\") icon = \"add\"\n              else if (part === \"changed\") icon = \"edit\"\n              else if (part === \"removed\") icon = \"delete\"\n              else if (part === \"waypoint_style\") icon = \"flag\"\n              if (icon) break\n            }\n            if (icon in customIcons) return customIcons[icon]\n            return Blockbench.getIconNode(icon ?? \"folder\").outerHTML\n          },\n          openFolder(path) {\n            if (JSON.stringify(path) !== JSON.stringify(this.path)) {\n              path = path.flatMap(e => e.split(\"/\"))\n              this.changeFolder(path)\n              this.navigationHistory.push(path.slice())\n              this.navigationFuture = []\n            }\n          },\n          changeFolder(path) {\n            this.searchOpen = false\n            this.searchText = \"\"\n            this.path = path.slice()\n            this.getValidSavedFolders()\n            if (this.$refs.files) {\n              this.$refs.files.$el.scrollTop = 0\n            }\n            this.$nextTick(() => {\n              this.checkBreadcrumbsOverflow()\n              this.$refs.files.onResize()\n            })\n          },\n          navigationSearch(item) {\n            this.searchOpen = true\n            this.searchText = item.search\n            this.path = item.path.slice()\n          },\n          navigationBack() {\n            this.navigationFuture.push(this.navigationHistory.pop())\n            const prev = this.navigationHistory[this.navigationHistory.length - 1]\n            if (Array.isArray(prev)) {\n              this.changeFolder(prev)\n            } else {\n              this.navigationSearch(prev)\n            }\n          },\n          navigationForward() {\n            this.navigationHistory.push(this.navigationFuture.pop())\n            const next = this.navigationHistory[this.navigationHistory.length - 1]\n            if (Array.isArray(next)) {\n              this.changeFolder(next)\n            } else {\n              this.navigationSearch(next)\n            }\n          },\n          toggleObjects() {\n            this.objects = !this.objects\n            storage.objects = this.objects\n            if (!this.objects) {\n              loadedJars = {}\n            }\n            save()\n          },\n          setupBreadcrumbs() {\n            if (!this.breadcrumbsResizeObserver) {\n              this.breadcrumbsResizeObserver = new ResizeObserver(() => {\n                this.checkBreadcrumbsOverflow()\n              })\n            }\n\n            this.breadcrumbsResizeObserver.observe(this.$refs.breadcrumbs)\n            this.checkBreadcrumbsOverflow()\n\n            if (!this.$refs.breadcrumbs.dataset.scrollListenerAdded) {\n              this.$refs.breadcrumbs.addEventListener(\"scroll\", this.handleBreadcrumbsScroll)\n              this.$refs.breadcrumbs.dataset.scrollListenerAdded = true\n            }\n          },\n          checkBreadcrumbsOverflow() {\n            if (this.$refs.breadcrumbs) {\n              this.breadcrumbsOverflowing = this.$refs.breadcrumbs.scrollWidth > this.$refs.breadcrumbs.clientWidth\n              this.$refs.breadcrumbs.scrollLeft = this.$refs.breadcrumbs.scrollWidth\n            }\n          },\n          handleBreadcrumbsScroll() {\n            if (this.$refs.breadcrumbs.scrollLeft) {\n              this.breadcrumbsOverflowing = this.$refs.breadcrumbs.scrollWidth > this.$refs.breadcrumbs.clientWidth\n            } else {\n              this.breadcrumbsOverflowing = false\n            }\n          },\n          async loadZip(file) {\n            const content = await this.getFileContent(file)\n            const zip = parseZip(content.buffer, false)\n\n            const parts = file.split(\"/\")\n            let current = this.tree\n\n            for (let i = 0; i < parts.length - 1; i++) {\n              current = current[parts[i]]\n            }\n            const lastPart = parts[parts.length - 1]\n            this.$set(current, lastPart, {})\n            current = current[lastPart]\n\n            for (const [key, zipFile] of Object.entries(zip.files)) {\n              const fullPath = `${file}/${key}`\n              this.$set(this.jar.files, fullPath, zipFile)\n\n              const subParts = key.split(\"/\")\n              let subCurrent = current\n\n              for (const [index, subPart] of subParts.entries()) {\n                if (!subCurrent[subPart]) {\n                  this.$set(subCurrent, subPart, index === subParts.length - 1 ? fullPath : {})\n                }\n                subCurrent = subCurrent[subPart]\n              }\n            }\n\n            this.jar.zips ??= {}\n            this.jar.zips[file] = this.jar.files[file]\n            delete this.jar.files[file]\n\n            return current\n          },\n          async getValidSavedFolders() {\n            let start = this.tree\n            if (this.mode === \"compare\" && this.path.length) {\n              start = start[this.path[0]]\n            }\n            this.validSavedFolders = (await Promise.all(this.savedFolders.map(async folder => {\n              let current = start\n              for (const segment of folder[0]) {\n                if (typeof current === \"string\" && current.endsWith(\".zip\")) {\n                  current = await this.loadZip(current)\n                } else if (typeof current === \"object\" && typeof current[segment] === \"string\" && segment.endsWith(\".zip\")) {\n                  current[segment] = await this.loadZip(current[segment])\n                }\n                if (!current || typeof current !== \"object\" || !(segment in current)) {\n                  return null\n                }\n                current = current[segment]\n              }\n              return folder\n            }))).filter(Boolean)\n          },\n          async keydownHandler(event) {\n            if (this.$refs.browserSearch === document.activeElement) return\n            if (this.jar && !this.loadingMessage) {\n              if ((event.ctrlKey || event.metaKey) && event.key === \"a\") {\n                this.selected = this.currentFolderContents.map(e => e[0])\n              } else if (event.key === \"Escape\") {\n                event.stopPropagation()\n                this.selected = []\n              } else if (event.key === \"Enter\") {\n                event.stopPropagation()\n                const [selected, selectionType] = await this.getDetailedSelection()\n                if (selectionType !== \"folder\") {\n                  this.openFiles()\n                } else if (selected.length === 1) {\n                  this.path.push(selected[0].name)\n                }\n              } else if ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n                if (!this.selected.length || this.selected.length > 1) {\n                  this.selected = [this.lastInteracted]\n                } else if (this.selected.length === 1) {\n                  const container = this.$refs.files.$refs.container\n                  const index = this.currentFolderContents.findIndex(e => e[0] === this.selected[0])\n                  if (event.key === \"ArrowLeft\") {\n                    if (index > 0) {\n                      this.selected = [this.currentFolderContents[index - 1][0]]\n                    }\n                  } else if (event.key === \"ArrowRight\") {\n                    if (index < this.currentFolderContents.length - 1) {\n                      this.selected = [this.currentFolderContents[index + 1][0]]\n                    }\n                  } else if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n                    const styles = getComputedStyle(container)\n                    const gap = parseInt(styles.rowGap)\n                    let itemsPerRow = 1\n                    if (this.displayType === \"grid\") {\n                      itemsPerRow = Math.max(1, Math.floor((container.clientWidth - parseInt(styles.padding) * 2 + gap) / (container.children[1].offsetWidth + gap)))\n                    }\n                    if (event.key === \"ArrowUp\") {\n                      if (index >= itemsPerRow) {\n                        this.selected = [this.currentFolderContents[index - itemsPerRow][0]]\n                      }\n                    } else if (event.key === \"ArrowDown\") {\n                      if (index + itemsPerRow < this.currentFolderContents.length) {\n                        this.selected = [this.currentFolderContents[index + itemsPerRow][0]]\n                      }\n                    }\n                  }\n                  const selectedElement = container.children[this.currentFolderContents.findIndex(e => e[0] === this.selected[0]) + 1]\n                  const containerRect = this.$refs.files.$el.getBoundingClientRect()\n                  const elementRect = selectedElement.getBoundingClientRect()\n                  if (elementRect.top < containerRect.top || elementRect.bottom > containerRect.bottom) {\n                    const scrollTo = this.displayType === \"grid\" ? selectedElement : selectedElement.children[0]\n                    scrollTo.scrollIntoView({\n                      behavior: Date.now() - this.lastArrowKeyPress > 250 ? \"smooth\" : undefined,\n                      block: \"nearest\"\n                    })\n                  }\n                }\n                this.lastArrowKeyPress = Date.now()\n              } if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {\n                if (Date.now() - this.typeFindLastKey > 1000) {\n                  this.typeFindText = event.key.toLowerCase()\n                } else {\n                  this.typeFindText += event.key.toLowerCase()\n                }\n                this.typeFindLastKey = Date.now()\n                const index = this.currentFolderContents.findIndex(e => e[0].toLowerCase().startsWith(this.typeFindText))\n                if (index !== -1) {\n                  this.selected = [this.currentFolderContents[index][0]]\n                  const container = this.$refs.files.$refs.container\n                  let scrollTo, currentItems, newItems\n                  const compare = Date.now()\n                  this.typeFindStart = compare\n                  do {\n                    currentItems = container.children.length\n                    if (container.children[index + 1]) {\n                      scrollTo = this.displayType === \"grid\" ? container.children[index + 1] : container.children[index + 1].children[0]\n                    } else {\n                      this.$refs.files.loadMore()\n                      await this.$nextTick()\n                    }\n                    newItems = container.children.length\n                  } while (!scrollTo && currentItems !== newItems && this.typeFindStart === compare)\n                  scrollTo?.scrollIntoView({ block: \"center\" })\n                }\n              }\n            }\n          },\n          switchDisplay(type) {\n            this.displayType = type\n            storage.display = type\n            save()\n            this.$refs.files.$el.scrollTop = 0\n            this.$nextTick(() => this.$refs.files.onScroll())\n          },\n          getFileLabel(folder, file, value) {\n            if (this.mode === \"compare\" && this.path.length) {\n              folder = folder.slice(1)\n            }\n            const path = folder.concat(file).join(\"/\")\n            file = PathModule.basename(path)\n            const ext = file.includes(\".\") ? file.split(\".\").pop() : null\n            switch (path) {\n              case \"assets\": return \"Resource Pack Assets\"\n              case \"data\": return \"Data Pack Assets\"\n              case \"doc\": return \"Documentation\"\n              case \"pack.png\": return \"Pack Icon\"\n              case \"pack.mcmeta\": return \"Pack Metadata\"\n              case \"version.json\": return \"Version Information\"\n              case \"assets/icons\":\n              case \"assets/minecraft/icons\": return \"System Icons\"\n              case \"assets/icons/snapshot\": return \"Snapshot Icons\"\n              case \"assets/minecraft\": return \"Minecraft Assets\"\n              case \"assets/realms\": return \"Realms Assets\"\n              case \"assets/minecraft/atlases\": return \"Atlas Definitions\"\n              case \"assets/minecraft/equipment\": return \"Equipment Definitions\"\n              case \"assets/minecraft/font\": return \"Font Definitions\"\n              case \"assets/minecraft/items\": return \"Item Definitions\"\n              case \"assets/minecraft/particles\":\n              case \"resource_pack/particles\": return \"Particle Definitions\"\n              case \"assets/minecraft/post_effect\": return \"Post-Processing Effects\"\n              case \"assets/minecraft/resourcepacks\": return \"Built-in Resource Packs\"\n              case \"assets/minecraft/sounds\": return \"Sound Files\"\n              case \"assets/minecraft/sounds.json\":\n              case \"resource_pack/sounds_client.json\": return \"Sound Definitions\"\n              case \"assets/minecraft/shaders/core\": return \"Core Shaders\"\n              case \"assets/minecraft/shaders/include\": return \"Include Shaders\"\n              case \"assets/minecraft/shaders/post\": return \"Post Shaders\"\n              case \"assets/minecraft/shaders/program\": return \"Program Shaders\"\n              case \"assets/minecraft/optifine/ctm\": return \"Connected Textures\"\n              case \"assets/minecraft/optifine/bettergrass.properties\": return \"Better Grass Properties\"\n              case \"assets/minecraft/optifine/natural.properties\": return \"Natural Textures Properties\"\n              case \"assets/minecraft/texts/credits.json\": return \"Credits\"\n              case \"assets/minecraft/texts/splashes.txt\": return \"Splash Texts\"\n              case \"assets/minecraft/texts/postcredits.txt\": return \"Post Credits Text\"\n              case \"assets/minecraft/texts/end.txt\": return \"End Poem\"\n              case \"assets/minecraft/textures/environment\": return \"Sky & Weather\"\n              case \"assets/minecraft/textures/entity/enderdragon\": return \"Ender Dragon\"\n              case \"assets/minecraft/textures/entity/enderman\": return \"Enderman\"\n              case \"assets/minecraft/models/block\": return \"Block Models\"\n              case \"assets/minecraft/models/item\": return \"Item Models\"\n              case \"assets/minecraft/resourcepacks/programmer_art.zip\": return \"Programmer Art Resource Pack\"\n              case \"assets/minecraft/resourcepacks/high_contrast.zip\": return \"High Contrast Resource Pack\"\n              case \"assets/minecraft/lang/en_us.json\":\n              case \"assets/minecraft/lang/en_us.lang\":\n              case \"assets/minecraft/optifine/lang/en_us.lang\": return \"English (US)\"\n              case \"assets/minecraft/lang/deprecated.json\": return \"Deprecated Language Keys\"\n              case \"behaviour_pack\": return \"Behaviour Pack Assets\"\n              case \"resource_pack\": return \"Resource Pack Assets\"\n              case \"resource_pack/blocks.json\": return \"Block Definitions\"\n              case \"resource_pack/biomes_client.json\": return \"Biome Definitions\"\n              case \"resource_pack/textures/flipbook_textures.json\": return \"Texture Animation Definitions\"\n              case \"resource_pack/textures/item_texture.json\": return \"Item Texture Definitions\"\n              case \"resource_pack/textures/terrain_texture.json\": return \"Block Texture Definitions\"\n              case \"resource_pack/entity\": return \"Entity Definitions\"\n              case \"resource_pack/models/entity\":\n              case \"resource_pack/models/mobs.json\": return \"Entity Models\"\n              case \"resource_pack/texts/languages.json\": return \"Languages\"\n              case \"resource_pack/texts/language_names.json\": return \"Language Names\"\n              case \"resource_pack/texts/ja_JP\": return \"Japanese Assets\"\n              case \"resource_pack/texts/zh_TW\": return \"Chinese (Traditional) Assets\"\n            }\n            switch (PathModule.dirname(path)) {\n              case \"assets/minecraft/atlases\": return \"Atlas Definition\"\n              case \"assets/minecraft/blockstates\": return \"Blockstate\"\n              case \"assets/minecraft/equipment\": return \"Equipment Definition\"\n              case \"assets/minecraft/items\": return \"Item Definition\"\n              case \"assets/minecraft/particles\": return \"Particle Definition\"\n              case \"assets/minecraft/models/block\": return \"Block Model\"\n              case \"assets/minecraft/models/item\": return \"Item Model\"\n              case \"assets/minecraft/models/item\": return \"Item Model\"\n              case \"assets/minecraft/shaders/core\":\n              case \"assets/minecraft/shaders/program\":\n              case \"assets/minecraft/shaders/post\":\n                if (ext === \"json\") return \"Shader Program Definition\"\n              case \"doc/images\": return \"Template\"\n              case \"resource_pack/models/entity\": return \"Entity Model\"\n              case \"resource_pack/entity\": return \"Entity Definition\"\n              case \"resource_pack/animations\": return \"Animation\"\n              case \"resource_pack/animation_controllers\": return \"Animation Controller\"\n              case \"assets/minecraft/lang\":\n              case \"assets/minecraft/optifine/lang\":\n                if (this.jar.files[\"pack.mcmeta\"]) {\n                  let content = this.jar.files[\"pack.mcmeta\"].content\n                  if (!content) {\n                    content = fs.readFileSync(this.jar.files[\"pack.mcmeta\"].path)\n                    this.jar.files[\"pack.mcmeta\"].content = content\n                  }\n                  const data = JSON.parse(content)\n                  const lang = data.language?.[PathModule.basename(file, PathModule.extname(file))]\n                  if (lang) {\n                    return `${lang.name} (${lang.region})`\n                  }\n                }\n                return \"Language File\"\n              case \"resource_pack/texts\":\n                if (this.jar.files[\"resource_pack/texts/language_names.json\"]) {\n                  let content = this.jar.files[\"resource_pack/texts/language_names.json\"].content\n                  if (!content) {\n                    content = fs.readFileSync(this.jar.files[\"resource_pack/texts/language_names.json\"].path)\n                    this.jar.files[\"resource_pack/texts/language_names.json\"].content = content\n                  }\n                  const data = JSON.parse(content)\n                  const id = PathModule.basename(file, PathModule.extname(file))\n                  const lang = data.find(e => e[0] === id)\n                  if (lang) {\n                    return lang[1]\n                  }\n                }\n            }\n            switch (file) {\n              case \"lang\": return \"Language Files\"\n              case \"gui\":\n              case \"ui\": return \"User Interface\"\n              case \"equipment\": return \"Equipment\"\n              case \"fish\": return \"Fish\"\n              case \"sheep\": return \"Sheep\"\n              case \"wolf\": return \"Wolves\"\n              case \"hud\": return \"Heads Up Display\"\n              case \"documentation\": return \"Documentation\"\n              case \"metadata\": return \"Metadata\"\n              case \"manifest.json\": return \"Pack Metadata\"\n              case \"misc\": return \"Miscellaneous\"\n              case \"ambient\": return \"Ambient\"\n              case \"fire\": return \"Fire\"\n              case \"music\": return \"Music\"\n              case \"game\": return \"Game\"\n              case \"menu\": return \"Menu\"\n            }\n            switch (ext) {\n              case \"png\": return \"Texture\"\n              case \"jpg\": return \"Texture\"\n              case \"tga\": return \"Texture\"\n              case \"mcmeta\": return \"Texture Metadata\"\n              case \"json\": return \"JSON File\"\n              case \"txt\": return \"Text File\"\n              case \"properties\": return \"Properties File\"\n              case \"lang\": return \"Language File\"\n              case \"ogg\":\n              case \"fsb\": return \"Sound File\"\n              case \"vsh\": return \"Vertex Shader\"\n              case \"fsh\": return \"Fragment Shader\"\n              case \"glsl\": return \"Shader\"\n              case \"icns\": return \"Icon\"\n            }\n            if (typeof value === \"object\") {\n              let label = titleCase(file)\n              if (!label.endsWith(\"s\")) {\n                label += \"s\"\n              }\n              label = label.replaceAll(\"Json\", \"JSON\")\n                           .replaceAll(\"Entitys\", \"Entities\")\n                           .replaceAll(\"Bodys\", \"Bodies\")\n              return label\n            }\n          },\n          getImageDimensions(file) {\n            const data = this.jar.files[file]\n            if (data.image?.width) {\n              return [data.image.width, data.image.height]\n            }\n          },\n          changeSort(type) {\n            if (this.sort === type) {\n              this.sortDirection = this.sortDirection === \"forwards\" ? \"backwards\" : \"forwards\"\n            } else {\n              this.sort = type\n              this.sortDirection = \"forwards\"\n            }\n            this.$refs.files.$el.scrollTop = 0\n          },\n          openSearch() {\n            this.searchOpen = !this.searchOpen\n            this.makeSearch()\n            if (this.searchOpen) {\n              setTimeout(() => {\n                this.$refs.browserSearch.focus()\n              }, 0)\n            }\n          },\n          makeSearch() {\n            clearTimeout(this.searchTimeout)\n            this.searchTimeout = setTimeout(() => {\n              const searchText = this.searchOpen ? this.searchText.trim().toLowerCase() : \"\"\n              const prev = this.navigationHistory[this.navigationHistory.length - 1]\n              if (searchText) {\n                if (!Array.isArray(prev) && prev.search === searchText) return\n                this.navigationHistory.push({\n                  search: searchText,\n                  path: this.path.slice()\n                })\n              } else {\n                if (Array.isArray(prev) && prev.join(\"/\") === this.path.join(\"/\")) return\n                this.navigationHistory.push(this.path.slice())\n              }\n              this.navigationFuture = []\n            }, 1000)\n          },\n          truncate(file) {\n            if (this.displayType === \"grid\" && file.length > 32) {\n              if (this.searchOpen && this.searchText) {\n                file = \"…\" + file.slice(-31)\n              } else {\n                file = file.slice(0, 31) + \"…\"\n              }\n            }\n            return file.replace(/(_|\\.|\\/)/g, '$1​')\n          },\n          changeMode(mode) {\n            this.mode = mode\n            if (this.objects && mode === \"compare\") {\n              loadedJars = {}\n            }\n          },\n          openSavedFolder(folder) {\n            if (this.mode === \"assets\" || !this.path.length) {\n              this.openFolder(folder)\n            } else {\n              this.openFolder([this.path[0], ...folder])\n            }\n          },\n          textureComparison(file) {\n            const red = [238, 85, 102, 255]\n            const green = [84, 255, 135, 255]\n            const blue = [85, 136, 255, 255]\n            const width = Math.max(file.oldFile.image.width, file.image.width)\n            const height = Math.max(file.oldFile.image.height, file.image.height)\n            const buff = new Uint8ClampedArray(width * height * 4)\n            const w1 = file.oldFile.image.width\n            const w2 = file.image.width\n            const h1 = file.oldFile.image.height\n            const h2 = file.image.height\n            const length = width * height * 4\n            const tolerance = 0\n\n            for (let i = 0; i < length; i += 4) {\n              const x = i / 4 % width\n              const y = Math.floor(i / 4 / width)\n              if (x >= w1 && y >= h2 || x >= w2 && y >= h1) continue\n              else if (x >= w2 && x <= w1 || y >= h2 && y <= h1) {\n                const a = Math.floor((x + y) % 8 / 4)\n                const b = Math.lerp(0.7, 1, a)\n                buff.set([red[0] * b, red[1] * b, red[2] * b, red[3]], i)\n              }\n              else if (y >= h1 && y <= h2 || x >= w1 && x <= w2) {\n                const a = Math.floor((x + y) % 8 / 4)\n                const b = Math.lerp(0.7, 1, a)\n                buff.set([green[0] * b, green[1] * b, green[2] * b, green[3]], i)\n              }\n              else {\n                const i1 = (x + y * w1) * 4\n                const i2 = (x + y * w2) * 4\n                if (Math.max(Math.abs(file.oldFile.pixels[i1] - file.pixels[i2]), Math.abs(file.oldFile.pixels[i1 + 1] - file.pixels[i2 + 1]), Math.abs(file.oldFile.pixels[i1 + 2] - file.pixels[i2 + 2]), Math.abs(file.oldFile.pixels[i1 + 3] - file.pixels[i2 + 3])) < tolerance) {\n                  buff.set(pixels.slice(i1, i1 + 3), i)\n                  buff[i + 3] = file.oldFile.pixels[i1 + 3] / 4\n                }\n                else if (file.oldFile.pixels[i1 + 3] === 0 && file.pixels[i2 + 3] !== 0) buff.set(green, i)\n                else if (file.oldFile.pixels[i1 + 3] !== 0 && file.pixels[i2 + 3] === 0) buff.set(red, i)\n                else if (file.oldFile.pixels[i1] === file.pixels[i2] && file.oldFile.pixels[i1 + 1] === file.pixels[i2 + 1] && file.oldFile.pixels[i1 + 2] === file.pixels[i2 + 2] && file.oldFile.pixels[i1 + 3] === file.pixels[i2 + 3]) {\n                  buff.set(file.oldFile.pixels.slice(i1, i1 + 3), i)\n                  buff[i + 3] = file.oldFile.pixels[i1 + 3] / 4\n                } else buff.set(blue, i)\n              }\n            }\n\n            new Dialog({\n              id: id + \"_texture_comparison\",\n              title: `${this.compareVersion} vs ${this.version} - ${file.path}`,\n              width: 816,\n              buttons: [],\n              lines: [`<style>\n                #${id}_texture_comparison {\n                  .dialog_content {\n                    margin: 4px 16px 12px;\n                  }\n\n                  #${id}_texture_comparison_container {\n                    display: flex;\n                    gap: 16px;\n                  }\n\n                  .texture-comparison {\n                    width: calc(100% / 3 - (16px * 2) / 3);\n                  }\n\n                  .comparison-title {\n                    font-size: 32px;\n                    font-weight: 600;\n                  }\n\n                  .comparison-details {\n                    display: flex;\n                    justify-content: space-between;\n                    font-family: var(--font-code);\n                    margin-bottom: 8px;\n                  }\n\n                  .texture-comparison-image {\n                    width: 100%;\n                    cursor: pointer;\n                  }\n\n                  img, canvas {\n                    display: block;\n                    pointer-events: none;\n                    min-width: 100%;\n                    max-width: 100%;\n                    cursor: pointer;\n                  }\n\n                  .comparison-legend {\n                    display: flex;\n                    flex-direction: column;\n                    padding: 8px 8px 0;\n\n                    > div {\n                      display: flex;\n                      gap: 4px;\n                      align-items: center;\n\n                      > :first-child {\n                        width: 16px;\n                        height: 16px;\n                        border: 1px solid var(--color-border);\n                      }\n                    }\n                  }\n                }\n\n                #${id}-expanded-preview {\n                  position: absolute;\n                  inset: 26px 0 0;\n                  z-index: 29;\n                  background-color: #0004;\n                  display: flex;\n                  justify-content: center;\n                  align-items: center;\n                  backdrop-filter: blur(2px);\n                  cursor: pointer;\n\n                  > div {\n                    max-width: calc(100vw - 160px);\n                    max-height: calc(100vh - 160px);\n\n                    > canvas {\n                      box-shadow: 0 10px 10px #0004;\n                      max-width: 100%;\n                      width: 100vw;\n                      display: block;\n                      cursor: pointer;\n                    }\n                  }\n                }\n              `],\n              component: {\n                data: {\n                  file,\n                  version: this.version,\n                  oldVersion: this.compareVersion,\n                  red,\n                  green,\n                  blue\n                },\n                mounted() {\n                  this.$refs.canvas.width = width\n                  this.$refs.canvas.height = height\n                  this.$refs.canvas.getContext(\"2d\").putImageData(new ImageData(buff, width, height), 0, 0)\n                },\n                methods: {\n                  formatBytes(bytes) {\n                    if (bytes === 0) return \"0 B\"\n                    const i = Math.floor(Math.log(bytes) / Math.log(1024))\n                    return parseFloat((bytes / Math.pow(1024, i)).toFixed(1)) + \" \" + [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"][i]\n                  },\n                  expand(source) {\n                    const canvas = new CanvasFrame(source.width, source.height)\n                    canvas.canvas.classList.add(\"checkerboard\")\n                    canvas.ctx.drawImage(source, 0, 0)\n                    const overlay = document.createElement(\"div\")\n                    overlay.id = `${id}-expanded-preview`\n                    overlay.addEventListener(\"click\", e => overlay.remove())\n                    const container = document.createElement(\"div\")\n                    container.style.aspectRatio = `${source.width} / ${source.height}`\n                    container.append(canvas.canvas)\n                    overlay.append(container)\n                    document.body.append(overlay)\n                  }\n                },\n                template: `\n                  <div id=\"${id}_texture_comparison_container\">\n                    <div class=\"texture-comparison\">\n                      <div>\n                        <div class=\"comparison-title\">{{ oldVersion }}</div>\n                        <div class=\"comparison-details\" :style=\"{ color: \\`rgb(\\${red[0]}, \\${red[1]}, \\${red[2]})\\` }\">\n                          <span>{{ file.oldFile.image.width }} x {{ file.oldFile.image.height }}</span>\n                          <span>{{ formatBytes(file.oldFile.size) }}</span>\n                        </div>\n                      </div>\n                      <div class=\"texture-comparison-image\" @click=\"expand(file.oldFile.image)\">\n                        <img class=\"checkerboard\" :src=\"file.oldFile.image.src\">\n                      </div>\n                    </div>\n                    <div class=\"texture-comparison\">\n                      <div>\n                        <div class=\"comparison-title\">{{ version }}</div>\n                        <div class=\"comparison-details\" :style=\"{ color: \\`rgb(\\${green[0]}, \\${green[1]}, \\${green[2]})\\` }\">\n                          <span>{{ file.image.width }} x {{ file.image.height }}</span>\n                          <span>{{ formatBytes(file.size) }}</span>\n                        </div>\n                      </div>\n                      <div class=\"texture-comparison-image\" @click=\"expand(file.image)\">\n                        <img class=\"checkerboard\" :src=\"file.image.src\">\n                      </div>\n                    </div>\n                    <div class=\"texture-comparison\">\n                      <div>\n                        <div class=\"comparison-title\">Comparison</div>\n                        <div class=\"comparison-details\" style=\"height:24px;\"></div>\n                      </div>\n                      <div @click=\"expand($refs.canvas)\">\n                        <canvas ref=\"canvas\" class=\"texture-comparison-image checkerboard\"></canvas>\n                      </div>\n                      <div class=\"comparison-legend\">\n                        <div>\n                          <div :style=\"{ backgroundColor: \\`rgb(\\${green[0]}, \\${green[1]}, \\${green[2]})\\` }\"></div>\n                          <div>Added Pixels</div>\n                        </div>\n                        <div>\n                          <div :style=\"{ backgroundColor: \\`rgb(\\${blue[0]}, \\${blue[1]}, \\${blue[2]})\\` }\"></div>\n                          <div>Changed Pixels</div>\n                        </div>\n                        <div>\n                          <div :style=\"{ backgroundColor: \\`rgb(\\${red[0]}, \\${red[1]}, \\${red[2]})\\` }\"></div>\n                          <div>Removed Pixels</div>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                `\n              }\n            }).show()\n          }\n        },\n        template: `\n          <div id=\"${id}-container\" tabindex=\"0\" @keydown=\"keydownHandler\">\n            <div v-if=\"!jar && !loadingMessage\" id=\"index\">\n              <div id=\"mode-tabs\">\n                <div @click=\"changeMode('assets')\" :class=\"{ active: mode === 'assets' }\">View Assets</div>\n                <div @click=\"changeMode('compare')\" :class=\"{ active: mode === 'compare' }\">Compare Assets</div>\n              </div>\n              <template v-if=\"mode === 'assets'\">\n                <div class=\"index-row\">\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Release Type</div>\n                    <select-input v-model=\"type\" :options=\"manifest.types\" @input=\"updateVersion\" />\n                  </div>\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Minecraft Version</div>\n                    <template v-for=\"id in Object.keys(manifest.types)\">\n                      <select-input v-if=\"type === id\" v-model=\"selectedVersions[id]\" :options=\"Object.fromEntries(manifest.versions.filter(e => e.type === id).map(e => [e.id, e.id]))\" @input=\"updateVersion\" />\n                    </template>\n                  </div>\n                </div>\n                <button v-if=\"mode === 'assets'\" @click=\"updateVersion(); loadVersion()\">Load Assets</button>\n                <hr>\n                <div id=\"version-search\">\n                  <input type=\"text\" placeholder=\"Filter…\" class=\"dark_bordered\" v-model=\"versionSearch\" ref=\"entry\" @input=\"versionSearch = versionSearch.toLowerCase()\">\n                  <i class=\"material-icons\" :class=\"{ active: versionSearch }\" @click=\"versionSearch = ''; setTimeout(() => $refs.entry.focus(), 0)\">{{ versionSearch ? \"clear\" : \"search\" }}</i>\n                </div>\n                <div class=\"index-row\" style=\"flex: 1;\">\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Downloaded Versions</div>\n                    <div class=\"version-list\">\n                      <template v-if=\"downloadedVersions.some(data => data.id.toLowerCase().includes(versionSearch))\">\n                        <div v-for=\"data in downloadedVersions\" v-if=\"data.id.toLowerCase().includes(versionSearch)\" class=\"version\" @click=\"version = data.id; loadVersion()\">\n                          <span v-html=\"getVersionIcon(data.id)\"></span>\n                          <span>{{ data.id }}</span>\n                        </div>\n                      </template>\n                      <div v-else class=\"no-results\">No downloaded versions</div>\n                    </div>\n                  </div>\n                  <hr>\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Recently Viewed</div>\n                    <div class=\"version-list\">\n                      <template v-if=\"recentVersions.some(id => id.toLowerCase().includes(versionSearch))\">\n                        <div v-for=\"id in recentVersions\" v-if=\"id.toLowerCase().includes(versionSearch)\" class=\"version\" @click=\"version = id; loadVersion()\">\n                          <span v-html=\"getVersionIcon(id)\"></span>\n                          <span>{{ id }}</span>\n                        </div>\n                      </template>\n                      <div v-else class=\"no-results\">No recently viewed versions</div>\n                    </div>\n                  </div>\n                </div>\n                <hr>\n                <label class=\"checkbox-row\">\n                  <input type=\"checkbox\" :checked=\"objects\" @input=\"toggleObjects\">\n                  <div>Include objects (sounds, languages, panorama, etc…)</div>\n                </label>\n              </template>\n              <template v-else>\n                <div class=\"index-row\">\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Old Version</div>\n                    <select-input v-model=\"compareType\" :options=\"manifest.types\" @input=\"updateVersion\" />\n                    <template v-for=\"id in Object.keys(manifest.types)\">\n                      <select-input v-if=\"compareType === id\" v-model=\"compareSelectedVersions[id]\" :options=\"Object.fromEntries(manifest.versions.filter(e => e.type === id).map(e => [e.id, e.id]))\" @input=\"updateVersion\" />\n                    </template>\n                  </div>\n                  <i class=\"material-icons\" style=\"transform: translateY(62px); font-size: 32px; min-width: 32px;\">arrow_forward</i>\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">New Version</div>\n                    <select-input v-model=\"type\" :options=\"manifest.types\" @input=\"updateVersion\" />\n                    <template v-for=\"id in Object.keys(manifest.types)\">\n                      <select-input v-if=\"type === id\" v-model=\"selectedVersions[id]\" :options=\"Object.fromEntries(manifest.versions.filter(e => e.type === id).map(e => [e.id, e.id]))\" @input=\"updateVersion\" />\n                    </template>\n                  </div>\n                </div>\n                <button @click=\"updateVersion(); loadVersion()\">Compare Assets</button>\n                <hr>\n                <div class=\"index-row\" style=\"flex: 1;\">\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Suggested Comparisons</div>\n                    <div class=\"version-list\">\n                      <div v-for=\"id in suggestedComparisons\" class=\"version\" @click=\"compareVersion = id[1]; version = id[2]; loadVersion()\">\n                        <div class=\"version-button-heading\">{{ id[0] }}</div>\n                        <span v-html=\"getVersionIcon(id[1])\"></span>\n                        <span>{{ id[1] }}</span>\n                        <i class=\"material-icons\">arrow_forward</i>\n                        <span v-html=\"getVersionIcon(id[2])\"></span>\n                        <span>{{ id[2] }}</span>\n                      </div>\n                    </div>\n                  </div>\n                  <hr>\n                  <div class=\"index-column\">\n                    <div class=\"index-heading\">Recently Compared</div>\n                    <div id=\"version-search\">\n                      <input type=\"text\" placeholder=\"Filter…\" class=\"dark_bordered\" v-model=\"versionSearch\" ref=\"entry\" @input=\"versionSearch = versionSearch.toLowerCase()\">\n                      <i class=\"material-icons\" :class=\"{ active: versionSearch }\" @click=\"versionSearch = ''; setTimeout(() => $refs.entry.focus(), 0)\">{{ versionSearch ? \"clear\" : \"search\" }}</i>\n                    </div>\n                    <div class=\"version-list\">\n                      <template v-if=\"recentComparisons.some(e => e[0].toLowerCase().includes(versionSearch) || e[1].toLowerCase().includes(versionSearch))\">\n                        <div v-for=\"id in recentComparisons\" v-if=\"id[0].toLowerCase().includes(versionSearch) || id[1].toLowerCase().includes(versionSearch)\" class=\"version\" @click=\"compareVersion = id[0]; version = id[1]; loadVersion()\">\n                          <span v-html=\"getVersionIcon(id[0])\"></span>\n                          <span>{{ id[0] }}</span>\n                          <i class=\"material-icons\">arrow_forward</i>\n                          <span v-html=\"getVersionIcon(id[1])\"></span>\n                          <span>{{ id[1] }}</span>\n                        </div>\n                      </template>\n                      <div v-else class=\"no-results\">No recently compared versions</div>\n                    </div>\n                  </div>\n                </div>\n              </template>\n            </div>\n            <div v-else-if=\"loadingMessage\" id=\"loading\">\n              <div>{{ loadingMessage }}</div>\n              <template v-if=\"progressTotal\">\n                <div id=\"progress-bar-container\">\n                  <div id=\"progress-bar\" :style=\"{ width: 'calc(' + Math.round(progressDone / progressTotal * 100) + '% - 8px)' }\"></div>\n                </div>\n                <div id=\"progress-bar-text\">{{ progressDone }} / {{ progressTotal }} - {{ Math.round(progressDone / progressTotal * 100) }}%</div>\n              </template>\n            </div>\n            <div v-if=\"jar && (!loadingMessage || exporting)\" id=\"browser\">\n              <div id=\"browser-header\">\n                <div id=\"browser-navigation\" ref=\"navigation\">\n                  <div v-if=\"validSavedFolders.length\" class=\"tool\" @click=\"sidebarVisible = !sidebarVisible\">\n                    <div class=\"tooltip\">{{ sidebarVisible ? \"Collapse Sidebar\" : \"Open Sidebar\" }}</div>\n                    <i class=\"material-icons\">{{ sidebarVisible ? \"left_panel_close\" : \"left_panel_open\" }}</i>\n                  </div>\n                  <i class=\"material-icons\" :class=\"{ disabled: navigationHistory.length === 1 }\" @click=\"navigationBack\">arrow_back</i>\n                  <i class=\"material-icons\" :class=\"{ disabled: !navigationFuture.length }\" @click=\"navigationForward\">arrow_forward</i>\n                  <i class=\"material-icons\" :class=\"{ disabled: !path.length }\" @click=\"changeFolder(path.slice(0, -1))\">arrow_upward</i>\n                </div>\n                <div id=\"breadcrumbs-home\" ref=\"homeButton\" :class=\"{ overflow: breadcrumbsOverflowing }\">\n                  <div class=\"tool\" @click=\"jar = null\">\n                    <div class=\"tooltip\">\n                      <span>Home</span>\n                      <div class=\"tooltip_description\">Go back to the version selector</div>\n                    </div>\n                    <i class=\"material-icons\">home</i>\n                  </div>\n                </div>\n                <div id=\"breadcrumbs\" ref=\"breadcrumbs\">\n                  <div v-if=\"mode === 'assets'\" @click=\"openFolder([])\">{{ version }}</div>\n                  <div v-else @click=\"openFolder([])\">\n                    <span>{{ compareVersion }}</span>\n                    <i class=\"material-icons\">arrow_forward</i>\n                    <span>{{ version }}</span>\n                  </div>\n                  <div v-for=\"[i, part] of path.entries()\" @click=\"openFolder(path.slice(0, i + 1))\">{{ part }}</div>\n                </div>\n                <div id=\"browser-search\" :class=\"{ open: searchOpen }\" :style=\"{ width: searchOpen ? 'calc(100% - 2px - ' + ($refs.navigation.clientWidth + $refs.homeButton.clientWidth) + 'px)' : '54px' }\">\n                  <i class=\"material-icons\" @click=\"openSearch\">{{ searchOpen ? \"close\" : \"search\" }}</i>\n                  <input type=\"text\" placeholder=\"Search…\" ref=\"browserSearch\" v-model=\"searchText\" @input=\"makeSearch\">\n                </div>\n              </div>\n              <div v-if=\"validSavedFolders.length\" id=\"browser-sidebar\" :class=\"{ open: sidebarVisible }\" @contextmenu.self=\"sidebarContextMenu\">\n                <div v-for=\"folder of validSavedFolders\" :key=\"folder.join()\" class=\"saved-folder\" @click=\"openSavedFolder(folder[0])\" @contextmenu=\"sidebarItemContextMenu(folder, $event)\" :class=\"{ active: folder === activeSavedFolder }\" :title=\"folder[1] ? folder[1] + ' - ' + folder[0].join('/') : folder[0]?.join('/')\">\n                  <span v-html=\"getFolderIcon(folder[0], folder[2])\"></span>\n                  <span>{{ folder[1] ?? folder[0][folder[0].length - 1] }}</span>\n                </div>\n              </div>\n              <lazy-scroller v-if=\"currentFolderContents.length\" id=\"files\" :items=\"currentFolderContents\" @click=\"selected = []\" ref=\"files\" :class=\"displayType\" @contextmenu=\"folderContextMenu\">\n                <template #before-list>\n                  <div id=\"files-header\" :style=\"displayType === 'grid' ? { display: 'none' } : {}\">\n                    <div @click=\"changeSort('name')\">\n                      <span>Name</span>\n                      <i :style=\"sort === 'name' ? {} : { visibility: 'hidden' }\" class=\"material-icons\">{{ sortDirection === \"forwards\" ? \"arrow_upward\" : \"arrow_downward\" }}</i>\n                    </div>\n                    <div @click=\"changeSort('size')\">\n                      <span>Size</span>\n                      <i :style=\"sort === 'size' ? {} : { visibility: 'hidden' }\" class=\"material-icons\">{{ sortDirection === \"forwards\" ? \"arrow_upward\" : \"arrow_downward\" }}</i>\n                    </div>\n                    <div @click=\"changeSort('type')\">\n                      <span>Type</span>\n                      <i :style=\"sort === 'type' ? {} : { visibility: 'hidden' }\" class=\"material-icons\">{{ sortDirection === \"forwards\" ? \"arrow_upward\" : \"arrow_downward\" }}</i>\n                    </div>\n                  </div>\n                </template>\n                <template v-if=\"currentFolderContents.length\" #default=\"{ file, value }\">\n                  <div @click=\"select(file, value, $event)\" @contextmenu=\"fileContextMenu(file, $event)\" :class=\"{ selected: selected.includes(file) }\" :title=\"file\">\n                    <template v-if=\"typeof value === 'object'\">\n                      <i v-if=\"file.endsWith('.zip')\" class=\"material-icons\">folder_zip</i>\n                      <i v-else class=\"material-icons\">\n                        <span>folder</span>\n                        <span v-if=\"!getFolderIcon(file).includes('>folder<')\" v-html=\"getFolderIcon(file)\"></span>\n                      </i>\n                    </template>\n                    <template v-else-if=\"file.endsWith('.png') && hasAnimation(value)\">\n                      <animated-texture :image=\"jar.files[value].image\" :mcmeta=\"jar.files[value].animation\" />\n                    </template>\n                    <template v-else-if=\"file.endsWith('.png') || file.endsWith('.jpg') || file.endsWith('.jpeg')\">\n                      <div>\n                        <img class=\"checkerboard\" :src=\"jar.files[value].image.src\">\n                      </div>\n                    </template>\n                    <template v-else>\n                      <i class=\"material-icons\">{{ getFileIcon(file, value) }}</i>\n                    </template>\n                    <div>{{ truncate(file) }}</div>\n                    <template v-if=\"displayType === 'list'\">\n                      <div v-if=\"(file.endsWith('.png') || file.endsWith('.jpg') || file.endsWith('.jpeg'))\">{{ currentFolderData[file].dimensions?.join(\" x \") }}</div>\n                      <div v-else></div>\n                      <div>{{ currentFolderData[file].label }}</div>\n                    </template>\n                  </div>\n                </template>\n              </lazy-scroller>\n              <div v-else id=\"files\" class=\"message\">{{ filesMessage }}</div>\n              <div v-if=\"mode === 'compare' && selected.some(e => jar.files[path.concat(e).join('/')]?.oldFile.image)\" id=\"browser-comparison-sidebar\">\n                <div>Compare</div>\n                <div v-for=\"file of selected\" class=\"comparison\" @click=\"textureComparison(jar.files[path.concat(file).join('/')])\">\n                  <div>New</div>\n                  <animated-texture v-if=\"file.endsWith('.png') && jar.files[path.concat(file).join('/')].animation\" :image=\"jar.files[path.concat(file).join('/')].image\" :mcmeta=\"jar.files[path.concat(file).join('/')].animation\" />\n                  <img v-else class=\"checkerboard\" :src=\"jar.files[path.concat(file).join('/')].image.src\">\n                  <div>Old</div>\n                  <animated-texture v-if=\"file.endsWith('.png') && jar.files[path.concat(file).join('/')].oldFile.animation\" :image=\"jar.files[path.concat(file).join('/')].image\" :mcmeta=\"jar.files[path.concat(file).join('/')].oldFile.animation\" />\n                  <img v-else class=\"checkerboard\" :src=\"jar.files[path.concat(file).join('/')].oldFile.image.src\">\n                </div>\n              </div>\n              <div id=\"browser-footer\">\n                <div>{{ itemCount.toLocaleString() }} item{{ itemCount === 1 ? \"\" : \"s\" }}</div>\n                <template v-if=\"selected.length\">\n                  <div style=\"width: 1px; height: 12px; background-color: var(--color-subtle_text); opacity: 0.25;\"></div>\n                  <div>{{ selected.length.toLocaleString() }} selected</div>\n                </template>\n                <div class=\"spacer\"></div>\n                <div id=\"display-type\">\n                  <i class=\"material-icons\" :class=\"{ selected: displayType === 'list' }\" @click=\"switchDisplay('list')\">view_list</i>\n                  <i class=\"material-icons\" :class=\"{ selected: displayType === 'grid' }\" @click=\"switchDisplay('grid')\">grid_view</i>\n                </div>\n              </div>\n            </div>\n          </div>\n        `\n      },\n      async onBuild() {\n        this.object.style.height = \"512px\"\n        const [data, bedrock] = await Promise.all([\n          fetch(\"https://piston-meta.mojang.com/mc/game/version_manifest_v2.json\").then(e => e.json()),\n          fetch(\"https://api.github.com/repos/Mojang/bedrock-samples/releases\").then(e => e.ok ? e.json() : [])\n        ])\n        for (const version of bedrock) {\n          data.versions.push({\n            id: version.tag_name,\n            type: version.prerelease ? \"bedrock-preview\" : \"bedrock\",\n            data: {\n              type: version.prerelease ? \"bedrock-preview\" : \"bedrock\",\n              downloads: {\n                client: {\n                  url: `https://github.com/Mojang/bedrock-samples/archive/refs/tags/${version.tag_name}.zip`\n                }\n              }\n            }\n          })\n        }\n        for (const version of data.versions) {\n          if (!manifest.types[version.type]) {\n            this.content_vue.$set(manifest.types, version.type, titleCase(version.type))\n          }\n        }\n        for (const type of Object.keys(manifest.types)) {\n          this.content_vue.selectedVersions[type] = data.versions.find(e => e.type === type)?.id\n          this.content_vue.compareSelectedVersions[type] = data.versions.find(e => e.type === type && e.id !== this.content_vue.selectedVersions[type])?.id\n        }\n        manifest.latest = data.latest\n        manifest.versions = data.versions\n        this.content_vue.version = manifest.versions.find(e => e.type === \"release\").id\n        this.content_vue.compareVersion = manifest.versions.find((e, i) => e.type === \"release\" && e.id !== this.content_vue.version).id\n\n        const latestRelease = manifest.versions.find(e => e.type === \"release\")\n        const prevRelease = manifest.versions.slice(1).find(e => e.type === \"release\" && e.id !== latestRelease.id)\n        const currentMajorNum = manifest.versions.find(e => e.type === \"release\").id.split(\".\").slice(0, 2).join(\".\")\n        const currentMajorRelease = manifest.versions.slice(1).find(e => e.type === \"release\" && e.id === currentMajorNum)\n        const prevMajorRelease = manifest.versions.slice(1).find(e => e.type === \"release\" && !e.id.startsWith(currentMajorNum))\n\n        this.content_vue.suggestedComparisons.push([\"Latest Java Version\", manifest.versions[1].id, manifest.versions[0].id])\n        if (manifest.versions[0].type !== \"release\") {\n          this.content_vue.suggestedComparisons.push([\"Since Java Release\", latestRelease.id, manifest.versions[0].id])\n        }\n        this.content_vue.suggestedComparisons.push(\n          [\"Latest Java Release\", prevRelease.id, latestRelease.id],\n          [\"Major Java Release\", prevMajorRelease.id, latestRelease.id],\n          [\"Release Java Patches\", currentMajorRelease.id, latestRelease.id]\n        )\n\n        const latestBedrock = manifest.versions.find(e => e.type.startsWith(\"bedrock\"))\n        const latestBedrockRelease = manifest.versions.find(e => e.type === \"bedrock\")\n\n        if (latestBedrockRelease) {\n          this.content_vue.suggestedComparisons.push([\"Latest Bedrock Version\", manifest.versions.filter(e => e.type.startsWith(\"bedrock\"))[1].id, latestBedrock.id])\n          if (latestBedrock.type !== \"bedrock\") {\n            this.content_vue.suggestedComparisons.push([\"Since Bedrock Release\", latestBedrockRelease.id, latestBedrock.id])\n          }\n          this.content_vue.suggestedComparisons.push([\"Latest Bedrock Release\", manifest.versions.filter(e => e.type === \"bedrock\")[1].id, latestBedrockRelease.id])\n        }\n\n        this.content_vue.ready.resolve()\n        loadDownloadedVersions()\n      },\n      onOpen() {\n        setTimeout(async () => {\n          if (!await MinecraftEULA.promptUser(id)) return dialog.close()\n          if (!await exists(settings.ewan_minecraft_directory.value)) {\n            new Dialog({\n              title: \"The .minecraft directory was not found\",\n              lines: [`${name} can load assets from your Minecraft: Java Edition installation.<br><br>When prompted, please select your <code class=\"rpu-code\">.minecraft</code> folder.<br><br>If you do not have Minecraft: Java Edition installed, select a random folder.`],\n              width: 450,\n              buttons: [\"dialog.ok\"],\n              onClose() {\n                const dir = Blockbench.pickDirectory({\n                  title: \"Select your .minecraft folder\",\n                  startpath: settings.ewan_minecraft_directory.value\n                })\n                if (dir) {\n                  settings.ewan_minecraft_directory.value = dir\n                  Settings.saveLocalStorages()\n                  loadDownloadedVersions()\n                } else {\n                  Blockbench.showQuickMessage(\"No folder was selected\")\n                  dialog.close()\n                }\n              }\n            }).show()\n          }\n        }, 0)\n      }\n    })\n    action = new Action({\n      id,\n      name,\n      description,\n      icon,\n      click(e) {\n        dialog.show()\n        if (e.currentTarget.parentElement.parentElement.getAttribute(\"toolbar_id\") === \"texturelist\") {\n          setTimeout(async () => {\n            if (dialog.content_vue.lastOpenFormat === Format.id && dialog.content_vue.jar) return\n            dialog.content_vue.lastOpenFormat = Format.id\n            await dialog.content_vue.ready.promise\n            let type, path\n            if ([\"java_block\", \"modded_entity\", \"optifine_entity\"].includes(Format.id)) {\n              type = \"release\"\n              path = [\"assets\", \"minecraft\", \"textures\"]\n              if (Format.id !== \"java_block\") path.push(\"entity\")\n            } else if ([\"bedrock\", \"bedrock_block\"].includes(Format.id)) {\n              type = \"bedrock\"\n              path = [\"resource_pack\", \"textures\", Format.id === \"bedrock\" ? \"entity\" : \"blocks\"]\n            }\n            if (type) {\n              const latest = manifest.versions.find(e => e.type === type)\n              dialog.content_vue.type = type\n              dialog.content_vue.version = latest.id\n              dialog.content_vue.selectedVersions[type] = latest.id\n              dialog.content_vue.updateVersion()\n              dialog.content_vue.loadVersion(path)\n            }\n          }, 0)\n        }\n      }\n    })\n    MenuBar.addAction(action, \"tools\")\n    Toolbars.texturelist.add(action, 4)\n    styles = Blockbench.addCSS(`\n      #format_page_${id} {\n        padding-bottom: 0;\n      }\n      #format_page_${id} .format_target {\n        margin-bottom: 6px;\n      }\n      #format_page_${id} div:nth-child(3), #format_page_${id} content {\n        overflow-y: auto;\n      }\n      .asset-browser-links {\n        display: flex;\n        justify-content: space-around;\n        margin: 20px 40px 0;\n      }\n      .asset-browser-links > a {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 5px;\n        padding: 5px;\n        text-decoration: none;\n        flex-grow: 1;\n        flex-basis: 0;\n        color: var(--color-subtle_text);\n        text-align: center;\n      }\n      .asset-browser-links > a:hover {\n        background-color: var(--color-accent);\n        color: var(--color-light);\n      }\n      .asset-browser-links > a > i {\n        font-size: 32px;\n        width: 100%;\n        max-width: initial;\n        height: 32px;\n        text-align: center;\n      }\n      .asset-browser-links > a:hover > i {\n        color: var(--color-light) !important;\n      }\n      .asset-browser-links > a > p {\n        flex: 1;\n        display: flex;\n        align-items: center;\n      }\n    `)\n    loader = new ModelLoader(id, {\n      name,\n      description,\n      icon,\n      onStart: () => dialog.show(),\n      format_page: {\n        component: {\n          methods: {\n            open: () => dialog.show()\n          },\n          template: `\n            <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n              <p class=\"format_description\">${description}</p>\n              <p class=\"format_target\"><b>Target</b> : <span>Minecraft: Java Edition</span> <span>Minecraft: Bedrock Edition</span></p>\n              <content>\n                <p class=\"markdown\">Asset browser is a browser that lets you view, modify, export, and compare the Minecraft vanilla assets. Both Java edition and Bedrock edition are supported, as well as their respective snapshots and beta versions.</p>\n                <br>\n                <h3 class=\"markdown\">How to use:</h3>\n                <p class=\"markdown\">\n                  <ul>\n                    <li><p>Press <strong>Open Asset Browser</strong> and select version you want to load.</p></li>\n                    <li><p>If you want sound files, languages, the panorama, and other files that are not included by default, make sure to check the checkbox at the bottom.</p></li>\n                    <li><p>Use the <strong>Load Assets</strong> button to load the assets.</p></li>\n                    <li><p>Browse the assets like a normal folder directory. You can select files to open them, and right click for more options like exporting.</p></li>\n                  </ul>\n                </p>\n                <h3 class=\"markdown\">Comparison mode:</h3>\n                <p class=\"markdown\">\n                  <ul>\n                    <li><p>Comparison mode provides a quick and easy way to compare two game versions to see what files have been added, changed, or removed.</p></li>\n                    <li><p>The changes will be shown in the same file structure that the assets will normally be found in. If you would like to instead see a flat list of all the changes, i recommend using <a href=\"https://cccode.pages.dev/version-diff/\" target=\"_blank\">Version Diff</a>.</p></li>\n                  </ul>\n                </p>\n              </content>\n              <div class=\"spacer\"></div>\n              <div class=\"asset-browser-links\">${Object.values(links).map(e => `\n                <a href=\"${e.link}\">\n                  ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                  <p>${e.text}</p>\n                </a>\n              `).join(\"\")}</div>\n              <div class=\"button_bar\">\n                <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"open()\">\n                  <i class=\"material-icons\">${icon}</i>\n                  Open Asset Browser\n                </button>\n              </div>\n            </div>\n          `\n        }\n      }\n    })\n  },\n  onunload() {\n    dialog?.close()\n    action?.delete()\n    loader?.delete()\n    styles?.delete()\n  }\n})\n\nfunction animatedTexureComponent() {\n  return {\n    template: `\n      <div ref=\"container\" class=\"animated-texture\">\n        <canvas ref=\"canvas\" class=\"checkerboard\"></canvas>\n      </div>\n    `,\n    props: {\n      image: HTMLImageElement,\n      mcmeta: {\n        type: Object,\n        default: () => ({})\n      }\n    },\n    data() {\n      return {\n        ctx: null,\n        frames: [],\n        frame: 0,\n        frameTime: 0,\n        lastTick: 0,\n        playRate: 1,\n        paused: false,\n        interpolate: false,\n        boundTick: null\n      }\n    },\n    mounted() {\n      this.boundTick = this.tick.bind(this)\n      this.ctx = this.$refs.canvas.getContext(\"2d\")\n      this.$refs.canvas.width = 16\n      this.$refs.canvas.height = 16\n      if (!this.$refs.canvas) return\n      this.setMCMETA(this.mcmeta)\n      if (!this.paused && \"animation\" in this.mcmeta) {\n        this.play()\n      }\n    },\n    destroyed() {\n      this.pause()\n    },\n    methods: {\n      setMCMETA(mcmeta) {\n        this.frames = []\n        this.frame = 0\n        this.frameTime = 0\n        if (mcmeta.blur === true) {\n          this.$refs.canvas.classList.add(\"blur\")\n        }\n        if (\"animation\" in mcmeta) {\n          const dft = mcmeta.animation.frametime || 1\n          this.interpolate = mcmeta.animation.interpolate || false\n          const ar = this.image.width / this.image.height\n          let fw, fh\n          if (!mcmeta.animation.width && !mcmeta.animation.height) {\n            if (ar >= 1) {\n              fw = this.image.height\n              fh = this.image.height\n            } else {\n              fw = this.image.width\n              fh = this.image.width\n            }\n          } else {\n            fw = mcmeta.animation.width || this.image.width\n            fh = mcmeta.animation.height || this.image.height\n          }\n          this.$refs.canvas.width = fw\n          this.$refs.canvas.height = fh\n          const fcx = this.image.width / fw\n          const frames = mcmeta.animation.frames || Array(fcx * this.image.height / fh).fill(0).map((_, i) => i)\n          frames.forEach(frame => {\n            const index = typeof frame === \"number\" ? frame : frame.index\n            const duration = typeof frame === \"number\" ? dft : frame.time || dft\n            this.frames.push({\n              index,\n              duration: duration * 50,\n              x: (index % fcx) * fw,\n              y: Math.floor(index / fcx) * fh\n            })\n          })\n        } else {\n          this.paused = true\n        }\n      },\n      play() {\n        this.paused = false\n        this.lastTick = performance.now()\n        requestAnimationFrame(this.boundTick)\n      },\n      pause() {\n        this.paused = true\n      },\n      tick(now) {\n        if (this.paused || this.frames.length === 0) return\n        requestAnimationFrame(this.boundTick)\n        this.frameTime += (now - this.lastTick) * this.playRate\n        this.lastTick = now\n        while (this.frameTime >= this.frames[this.frame].duration) {\n          this.frameTime %= this.frames[this.frame].duration\n          this.frame = (this.frame + 1) % this.frames.length\n        }\n        this.draw()\n      },\n      draw() {\n        const frame = this.frames[this.frame]\n        this.ctx.globalCompositeOperation = \"copy\"\n        this.ctx.globalAlpha = 1\n        this.ctx.drawImage(this.image, frame.x, frame.y, this.$refs.canvas.width, this.$refs.canvas.height, 0, 0, this.$refs.canvas.width, this.$refs.canvas.height)\n        if (this.interpolate) {\n          const nextFrame = this.frames[(this.frame + 1) % this.frames.length]\n          this.ctx.globalCompositeOperation = \"source-atop\"\n          this.ctx.globalAlpha = this.frameTime / frame.duration\n          this.ctx.drawImage(this.image, nextFrame.x, nextFrame.y, this.$refs.canvas.width, this.$refs.canvas.height, 0, 0, this.$refs.canvas.width, this.$refs.canvas.height)\n        }\n      }\n    }\n  }\n}\n\nfunction lazyScrollerComponent() {\n  return {\n    template: `\n      <div ref=\"viewport\" @scroll=\"onScroll\" @click.self=\"$emit('click')\" @contextmenu.self=\"$emit('contextmenu', $event)\">\n        <div ref=\"container\" :style=\"{ minHeight: height + 'px' }\" @click.self=\"$emit('click')\" @contextmenu.self=\"$emit('contextmenu', $event)\">\n          <slot name=\"before-list\"></slot>\n          <template v-for=\"item of visibleItems\">\n            <slot :file=\"item[0]\" :value=\"item[1]\"></slot>\n          </template>\n        </div>\n      </div>\n    `,\n    props: {\n      items: Array\n    },\n    data() {\n      return {\n        visibleItems: [],\n        loadedCount: 0,\n        batchSize: 128,\n        height: 0\n      }\n    },\n    watch: {\n      items: {\n        handler() {\n          this.resetScroller()\n        },\n        deep: true\n      }\n    },\n    mounted() {\n      this.loadMore()\n      this.resizeObserver = new ResizeObserver(this.onResize.bind(this))\n      this.resizeObserver.observe(this.$refs.viewport)\n    },\n    beforeDestroy() {\n      if (this.resizeObserver) {\n        this.resizeObserver.disconnect()\n      }\n    },\n    methods: {\n      onResize() {\n        const container = this.$refs.container\n        let firstItem = container.children[1]\n        if (!firstItem) {\n          this.height = 0\n          return\n        }\n        const columnMode = getComputedStyle(firstItem).display === \"contents\"\n        if (columnMode) firstItem = firstItem.children[0]\n        const styles = getComputedStyle(container)\n        const gap = parseInt(styles.rowGap)\n        let itemsPerRow = 1\n        if (!columnMode) {\n          itemsPerRow = Math.max(1, Math.floor((container.clientWidth - parseInt(styles.padding) * 2 + gap) / (container.children[1].offsetWidth + gap)))\n        }\n        const loadedRows = Math.ceil((this.loadedCount) / itemsPerRow)\n        const remainingRows = Math.ceil((this.items.length - this.loadedCount - 1) / itemsPerRow)\n        let loadedHeight = 0\n        for (let i = 0; i < loadedRows; i++) {\n          let firstItemInRow = container.children[i * itemsPerRow + 1]\n          if (columnMode) firstItemInRow = firstItemInRow.children[0]\n          loadedHeight += firstItemInRow.offsetHeight\n        }\n        const remainingHeight = remainingRows * loadedHeight / loadedRows\n        this.height = loadedHeight + remainingHeight + gap * (loadedRows + remainingRows - 1)\n      },\n      onScroll() {\n        const container = this.$refs.container\n        let lastItem = container.children[container.children.length - 1]\n        if (!lastItem) return\n\n        if (getComputedStyle(lastItem).display === \"contents\") lastItem = lastItem.children[0]\n\n        const lastItemRect = lastItem.getBoundingClientRect()\n        const containerRect = this.$refs.viewport.getBoundingClientRect()\n\n        if (lastItemRect.bottom <= containerRect.bottom + 128) {\n          return this.loadMore()\n        }\n\n        this.onResize()\n      },\n      loadMore() {\n        if (this.loadedCount >= this.items.length) return this.$nextTick(() => this.onResize())\n\n        const newItems = this.items.slice(this.loadedCount, this.loadedCount + this.batchSize)\n\n        this.visibleItems.push(...newItems)\n        this.loadedCount += newItems.length\n\n        this.$nextTick(() => this.onScroll())\n      },\n      resetScroller() {\n        this.visibleItems = []\n        this.loadedCount = 0\n        this.loadMore()\n      }\n    }\n  }\n}\n\nfunction exists(path) {\n  return new Promise(async fulfil => {\n    try {\n      await fs.promises.stat(path)\n      fulfil(true)\n    } catch {\n      fulfil(false)\n    }\n  })\n}\n\nconst td = new TextDecoder\nfunction parseZip(zip, ignoreRoot = true) {\n  const ua = new Uint8Array(zip)\n  const dv = new DataView(zip)\n\n  const offEOCD = ua.findLastIndex((e, i, a) => e === 0x50 && a[i+1] === 0x4b && a[i+2] === 0x05 && a[i+3] === 0x06)\n  const offCenDir = dv.getUint32(offEOCD + 16, true)\n  const recordCount = dv.getUint16(offEOCD + 10, true)\n\n  const parsedZip = {\n    buffer: zip,\n    array: ua,\n    view: dv,\n    eocdOffset: offEOCD,\n    centralDirOffset: offCenDir,\n    fileCount: recordCount,\n    files: {}\n  }\n\n  for (let i = 0, o = offCenDir; i < recordCount; i++) {\n    const n = dv.getUint16(o + 28, true)\n    const m = dv.getUint16(o + 30, true)\n    const k = dv.getUint16(o + 32, true)\n    const encodedPath = ua.subarray(o + 46, o + 46 + n)\n    const filePath = td.decode(encodedPath)\n\n    if (!filePath.endsWith(\"/\") && !ignoredExtensionsRegex.test(filePath) && (!ignoreRoot || !ignoredExtensionsRootRegex.test(filePath))) {\n      const h = dv.getUint32(o + 42, true)\n      const q = dv.getUint16(h + 8,  true)\n      const t = dv.getUint16(h + 10, true)\n      const d = dv.getUint16(h + 12, true)\n      const s = dv.getUint32(o + 20, true)\n      const a = dv.getUint32(o + 24, true)\n      const e = dv.getUint16(h + 28, true)\n\n      parsedZip.files[filePath] = {\n        path: filePath,\n        compressedSize: s,\n        size: a,\n        crc32: dv.getUint32(o + 16, true),\n        timeValue: t,\n        dateValue: d,\n        encodedPath,\n        compressionMethod: q,\n        compressedContent: ua.subarray(h + 30 + n + e, h + 30 + n + e + s)\n      }\n\n      if (q === 0) {\n        parsedZip.files[filePath].content = Buffer.from(parsedZip.files[filePath].compressedContent)\n      } else {\n        Object.defineProperty(parsedZip.files[filePath], \"content\", {\n          configurable: true,\n          enumerable: true,\n          get() {\n            const c = zlib.inflateRawSync(this.compressedContent)\n            Object.defineProperty(this, \"content\", {\n              value: c,\n              configurable: true,\n              enumerable: true\n            })\n            return c\n          }\n        })\n      }\n\n      if (filePath.endsWith(\".png\") || filePath.endsWith(\".jpg\") || filePath.endsWith(\".jpeg\")) {\n        const img = new Image\n        img.src = \"data:image/png;base64,\" + parsedZip.files[filePath].content.toString(\"base64\")\n        parsedZip.files[filePath].image = img\n      }\n    }\n\n    o += 46 + n + m + k\n  }\n\n  return parsedZip\n}\n\nfunction getVersion(id) {\n  let version = manifest.versions.find(e => e.id === id)\n  if (!version) {\n    const dataPath = loadedJars[id].files[\"version.json\"]\n    if (dataPath) {\n      const data = JSON.parse(dataPath.content)\n      version = manifest.versions.find(e => e.id === data.id)\n    }\n  }\n  return version\n}\n\nasync function getVersionData(id) {\n  const version = getVersion(id)\n  if (version.data) {\n    return version.data\n  }\n  const vanillaDataPath = PathModule.join(settings.ewan_minecraft_directory.value, \"versions\", version.id, version.id + \".json\")\n  if (await exists(vanillaDataPath)) {\n    version.data = JSON.parse(await fs.promises.readFile(vanillaDataPath))\n    return version.data\n  }\n  const cacheDataPath = PathModule.join(cacheDir, `data_${version.id}.json`)\n  if (await exists(cacheDataPath)) {\n    version.data = JSON.parse(await fs.promises.readFile(cacheDataPath))\n    return version.data\n  }\n  version.data = await fetch(version.url).then(e => e.json())\n  await fs.promises.writeFile(cacheDataPath, JSON.stringify(version.data), \"utf-8\")\n  return version.data\n}\n\nasync function getVersionAssetsIndex(version) {\n  const vanillaAssetsIndexPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"indexes\", version.assets + \".json\")\n  if (await exists(vanillaAssetsIndexPath)) {\n    if (await shaCheck(vanillaAssetsIndexPath, version.assetIndex.sha1)) {\n      version.assetsIndex = JSON.parse(await fs.promises.readFile(vanillaAssetsIndexPath))\n      return version.assetsIndex\n    } else {\n      version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json())\n      await fs.promises.writeFile(vanillaAssetsIndexPath, JSON.stringify(version.assetsIndex), \"utf-8\")\n    }\n  }\n  const cacheAssetsIndexPath = PathModule.join(cacheDir, `assets_index_${version.assets}.json`)\n  if (await exists(cacheAssetsIndexPath) && await shaCheck(cacheAssetsIndexPath, version.assetIndex.sha1)) {\n    version.assetsIndex = JSON.parse(await fs.promises.readFile(cacheAssetsIndexPath))\n    return version.assetsIndex\n  }\n  version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json())\n  await fs.promises.writeFile(cacheAssetsIndexPath, JSON.stringify(version.assetsIndex), \"utf-8\")\n  return version.assetsIndex\n}\n\nasync function getVersionJar(id) {\n  if (loadedJars[id]) return loadedJars[id]\n  const extension = /^v\\d+\\.\\d+\\.\\d+\\.\\d+/.test(id) ? \".zip\" : \".jar\"\n  let jar\n  if (extension === \".jar\") {\n    const jarPath = PathModule.join(settings.ewan_minecraft_directory.value, \"versions\", id, id + \".jar\")\n    if (await exists(jarPath)) {\n      jar = parseZip((await fs.promises.readFile(jarPath)).buffer)\n    }\n  }\n  if (!jar) {\n    const jarPath = PathModule.join(cacheDir, id + extension)\n    if (await exists(jarPath)) {\n      jar = parseZip((await fs.promises.readFile(jarPath)).buffer)\n    } else {\n      const version = await getVersionData(id)\n      dialog.content_vue.loadingMessage = `Downloading ${id}…`\n      const client = await fetch(version.downloads.client.url).then(e => e.arrayBuffer())\n      fs.promises.writeFile(jarPath, new Uint8Array(client))\n      jar = parseZip(client)\n      loadDownloadedVersions()\n    }\n  }\n  loadedJars[id] = jar\n  if (getVersion(id).type.startsWith(\"bedrock\")) {\n    const old = jar.files\n    jar.files = {}\n    for (const [file, data] of Object.entries(old)) {\n      jar.files[file.replace(/^[^\\/]+\\//, \"\")] = data\n    }\n  }\n  return jar\n}\n\nasync function getVersionObjects(vue, id) {\n  if (!getVersion(id)) return {}\n  const version = await getVersionData(id)\n  if (version.type.includes(\"bedrock\")) return {}\n  if (version.objects) return version.objects\n  const assetsIndex = version.assetsIndex ?? await getVersionAssetsIndex(version)\n  const root = getRoot(id)\n  const objectsEntries = Object.entries(assetsIndex.objects)\n\n  version.objects = {}\n\n  dialog.content_vue.loadingMessage = `Loading ${id} objects…`\n  vue.progressTotal = objectsEntries.length\n\n  for (let i = 0; i < objectsEntries.length; i += 256) {\n    const files = []\n    for (const [file, data] of objectsEntries.slice(i, i + 256)) {\n      files.push(new Promise(async fulfil => {\n        const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n        const packPath = file === \"pack.mcmeta\" ? file : PathModule.join(root, file).replaceAll(\"\\\\\", \"/\")\n        const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n        if (await exists(vanillaObjectPath)) {\n          version.objects[packPath] = { path: vanillaObjectPath }\n        } else {\n          const cacheObjectPath = PathModule.join(cacheDir, \"objects\", objectPath)\n          if (!(await exists(cacheObjectPath))) {\n            const object = new Uint8Array(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer()))\n            await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true })\n            await fs.promises.writeFile(cacheObjectPath, object)\n          }\n          version.objects[packPath] = { path: cacheObjectPath }\n        }\n        vue.progressDone++\n        fulfil()\n      }))\n    }\n    await Promise.all(files)\n  }\n\n  return version.objects\n}\n\nfunction getRoot(id) {\n  const version = getVersion(id)\n  if (Date.parse(version.releaseTime) >= 1403106748000 || version.data.assets === \"1.7.10\") {\n    return \"assets\"\n  }\n  return \"assets/minecraft\"\n}\n\nfunction naturalSorter(as, bs) {\n  let a, b, a1, b1, i = 0, n, L,\n  rx = /(\\.\\d+)|(\\d+(\\.\\d+)?)|([^\\d.]+)|(\\.\\D+)|(\\.$)/g\n  if (as === bs) {\n    return 0\n  }\n  if (typeof as !== \"string\") {\n    a = as.toString().toLowerCase().match(rx)\n  } else {\n    a = as.toLowerCase().match(rx)\n  }\n  if (typeof bs !== \"string\") {\n    b = bs.toString().toLowerCase().match(rx)\n  } else {\n    b = bs.toLowerCase().match(rx)\n  }\n  L = a.length\n  while (i < L) {\n    if (!b[i]) return 1\n    a1 = a[i],\n    b1 = b[i++]\n    if (a1 !== b1) {\n      n = a1 - b1\n      if (!isNaN(n)) return n\n      return a1 > b1 ? 1 : -1\n    }\n  }\n  return b[i] ? -1 : 0\n}\n\nasync function loadDownloadedVersions() {\n  const downloadedVersions = []\n  const versionsFolder = PathModule.join(settings.ewan_minecraft_directory.value, \"versions\")\n  if (await exists(versionsFolder)) {\n    for (const entry of await fs.promises.readdir(versionsFolder, { withFileTypes: true })) {\n      if (!entry.isDirectory()) continue\n      const jarPath = PathModule.join(versionsFolder, entry.name, `${entry.name}.jar`)\n      if (await exists(jarPath)) {\n        downloadedVersions.push({\n          id: entry.name,\n          date: await fs.promises.stat(jarPath).then(e => e.birthtime)\n        })\n      }\n    }\n  }\n  const cacheFolder = PathModule.join(cacheDir)\n  if (await exists(cacheFolder)) {\n    for (const entry of await fs.promises.readdir(cacheFolder, { withFileTypes: true })) {\n      if (!entry.isFile() || !(entry.name.endsWith(\".jar\") || entry.name.endsWith(\".zip\"))) continue\n      downloadedVersions.push({\n        id: entry.name.slice(0, -4),\n        date: await fs.promises.stat(PathModule.join(cacheFolder, entry.name)).then(e => e.birthtime)\n      })\n    }\n  }\n  dialog.content_vue.downloadedVersions = downloadedVersions.sort((a, b) => b.date - a.date)\n}\n\nasync function loadSidebar(force) {\n  const defaults = [\n    [[\"assets\", \"minecraft\", \"textures\"], \"Textures\"],\n    [[\"assets\", \"minecraft\", \"textures\", \"block\"], \"Block Textures\"],\n    [[\"assets\", \"minecraft\", \"textures\", \"item\"], \"Item Textures\"],\n    [[\"assets\", \"minecraft\", \"textures\", \"blocks\"], \"Block Textures\"],\n    [[\"assets\", \"minecraft\", \"textures\", \"items\"], \"Item Textures\"],\n    [[\"assets\", \"minecraft\", \"textures\", \"entity\"], \"Entity Textures\"],\n    [[\"assets\", \"minecraft\", \"models\"], \"Models\"],\n    [[\"assets\", \"minecraft\", \"models\", \"block\"], \"Block Models\"],\n    [[\"assets\", \"minecraft\", \"models\", \"item\"], \"Item Models\"],\n    [[\"resource_pack\", \"textures\"], \"Textures\"],\n    [[\"resource_pack\", \"textures\", \"blocks\"], \"Block Textures\"],\n    [[\"resource_pack\", \"textures\", \"items\"], \"Item Textures\"],\n    [[\"resource_pack\", \"textures\", \"entity\"], \"Entity Textures\"],\n    [[\"resource_pack\", \"models\", \"entity\"], \"Entity Models\"],\n    [[\"item\"], \"Item Textures\"],\n    [[\"mob\"], \"Entity Textures\"],\n    [[\"assets\", \"minecraft\", \"optifine\"], \"OptiFine\"],\n    [[\"assets\", \"minecraft\", \"optifine\", \"ctm\"], \"CTM\"],\n    [[\"added\"], \"Added\"],\n    [[\"changed\"], \"Changed\"],\n    [[\"removed\"], \"Removed\"]\n  ]\n  if (force) {\n    if (await confirm(\"Reset Sidebar\", \"Are you sure you want to reset the sidebar?\")) {\n      storage.savedFolders.length = 0\n      storage.savedFolders.push(...defaults)\n      save()\n    }\n  } else {\n    storage.savedFolders ??= defaults\n  }\n}\n\nfunction confirm(title, message) {\n  return new Promise(fulfil => Blockbench.showMessageBox({\n    title,\n    message,\n    buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n  }, async button => {\n    if (button === 0) {\n      fulfil(true)\n    } else {\n      fulfil(false)\n    }\n  }))\n}\n\nconst jsonVersionPattern = /\\d+\\.\\d+\\.\\d+\\.\\d+/\nconst htmlVersionPattern = /Version: \\d+\\.\\d+\\.\\d+\\.\\d+/g\nasync function getVersionComparison(oldVersion, newVersion) {\n  const oldJar = await getVersionJar(oldVersion)\n  const newJar = await getVersionJar(newVersion)\n  const jar = { files: {} }\n  for (const [file, data] of Object.entries(oldJar.files)) {\n    if (file in newJar.files) {\n      const newData = newJar.files[file]\n      if (data.crc32 !== newData.crc32) {\n        if (file.endsWith(\".png\") || file.endsWith(\".jpg\") || file.endsWith(\".jpeg\")) {\n          data.canvas = new CanvasFrame(data.image.width, data.image.height)\n          data.canvas.ctx.drawImage(data.image, 0, 0)\n          data.pixels = data.canvas.ctx.getImageData(0, 0, data.image.width, data.image.height).data\n          newData.canvas = new CanvasFrame(newData.image.width, newData.image.height)\n          newData.canvas.ctx.drawImage(newData.image, 0, 0)\n          newData.pixels = newData.canvas.ctx.getImageData(0, 0, newData.image.width, newData.image.height).data\n          if (data.pixels.length === newData.pixels.length && Buffer.from(data.pixels).equals(Buffer.from(newData.pixels))) {\n            continue\n          }\n        } else if (file.endsWith(\".html\")) {\n          if (data.content.toString().replace(htmlVersionPattern, \"\") === newData.content.toString().replace(htmlVersionPattern, \"\")) {\n            continue\n          }\n        }\n        try {\n          const oldJSON = JSON.parse(data.content)\n          const newJSON = JSON.parse(newData.content)\n          delete oldJSON.minecraft_version\n          delete newJSON.minecraft_version\n          if (oldJSON.version && newJSON.version && jsonVersionPattern.test(oldJSON.version) && jsonVersionPattern.test(newJSON.version)) {\n            delete oldJSON.version\n            delete newJSON.version\n          }\n          if (JSON.stringify(oldJSON) === JSON.stringify(newJSON)) {\n            continue\n          }\n        } catch {}\n        const ext = PathModule.extname(file)\n        const name = file.slice(0, -ext.length)\n        jar.files[\"changed/\" + file] = newData\n        newData.oldFile = data\n        if (newJar.files[file + \".mcmeta\"]) {\n          try {\n            const anim = JSON.parse(newJar.files[file + \".mcmeta\"].content)\n            if (anim.animation) {\n              newData.animation = anim\n            }\n          } catch {}\n        }\n        if (oldJar.files[file + \".mcmeta\"]) {\n          try {\n            const anim = JSON.parse(oldJar.files[file + \".mcmeta\"].content)\n            if (anim.animation) {\n              data.animation = anim\n            }\n          } catch {}\n        }\n      }\n    } else {\n      jar.files[\"removed/\" + file] = data\n      if (oldJar.files[file + \".mcmeta\"]) {\n        try {\n          const anim = JSON.parse(oldJar.files[file + \".mcmeta\"].content)\n          if (anim.animation) {\n            data.animation = anim\n          }\n        } catch {}\n      }\n    }\n  }\n  for (const [file, data] of Object.entries(newJar.files)) {\n    if (!(file in oldJar.files)) {\n      jar.files[\"added/\" + file] = data\n      if (newJar.files[file + \".mcmeta\"]) {\n        try {\n          const anim = JSON.parse(newJar.files[file + \".mcmeta\"].content)\n          if (anim.animation) {\n            data.animation = anim\n          }\n        } catch {}\n      }\n    }\n  }\n  return jar\n}"
  },
  {
    "path": "plugins/asset_browser/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2025-05-30\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2025-06-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Renamed Java edition categories to make them more consistent with Bedrock edition categories\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed texture mesh elements showing a data URL instead of the item model name when opening generated item models\"\n        ]\n      },\n      {\n        \"title\": \"Techinical Changes\",\n        \"list\": [\n          \"The cache folder has been moved to the AppData folder and is no longer required to be specified by the user\",\n          \"The \\\"Minecraft Directory\\\" setting ID has been made more unique as to not conflict if other plugins use the same ID\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Support for Blockbench v5.0.0\"\n        ]\n      }\n    ]\n  },\n  \"1.2.1\": {\n    \"title\": \"1.2.1\",\n    \"date\": \"2025-10-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed select menu styling\"\n        ]\n      }\n    ]\n  },\n  \"1.2.2\": {\n    \"title\": \"1.2.2\",\n    \"date\": \"2026-04-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed wrong icons showing for full major version Java Edition pre-releases and release candidates\",\n          \"Fixed to support new Minecraft version numbering system\",\n          \"Fixed version select dropdowns not updating their displayed value\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/azurelib_utils/LICENSE.MD",
    "content": "MIT License\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/azurelib_utils/about.md",
    "content": "<p align=\"center\">\n<img src=\"https://www.bisecthosting.com/images/CF/AzureLib/BH_AL_header.png\" />\n<a href=\"https://discord.azuredoom.com/\"> <img src=\"https://img.shields.io/discord/1323813706286759946?color=red&label=Discord&logo=Discord&logoColor=red&style=for-the-badge\" alt=\"discord\"/> </a>\n</p>\n<p align=\"center\">\nAzureLib represents a branch derived from Geckolib 4.x, serving as an animation engine tailored for Minecraft Mods. It boasts various features, including support for intricate 3D keyframe-driven animations, over 30 different easing functions, concurrent animation capabilities, sound and particle keyframes, event-based keyframes, and numerous other functionalities.\n</br>\n\n<p align=\"center\">\nDownload the mod here on:\n</p>\n\n<p align=\"center\">\n<a href=\"https://www.curseforge.com/minecraft/mc-mods/azurelib\"> <img src=\"https://i.imgur.com/JlZqq8q.png\" width=\"128\" height=\"128\" alt=\"curseforge\"/></a>\n<a href=\"https://modrinth.com/mod/azurelib\"> <img src=\"https://i.imgur.com/oM891tg.png\" width=\"128\" height=\"128\" alt=\"modrinth\"/> </a>\n</p>\n\n</br>\n\n<p align=\"center\">\n<a href=\"https://wiki.azuredoom.com/\">Wiki found here </a>\n</p>\n\n<p align=\"center\">\nSupported Minecraft versions: \n</p>\n\n```\n- 1.17.1 Forge/Fabric\n- 1.19.2 Forge/Fabric\n- 1.19.4 Forge/Fabric\n- 1.20.1 Forge/NeoForge/Fabric\n- 1.21.1 NeoForge/Fabric\n```\n\n<p align=\"center\">\nNeed a server to play with friends? Don't know how to setup one? Just rent an already configured server from BisectHosting!\n<a href=\"https://bisecthosting.com/azuredoom\"> <img src=\"https://www.bisecthosting.com/images/CF/AzureLib/BH_AL_promo.png\" alt=\"logo\"/> </a>\n\n\n<p align=\"center\">\nClick on the picture above, select plan(at least 4GB), and use my code azuredoom to get 25% off your first month and enjoy playing with your friends!\n</p></p>\n\n<style>\n  #plugin_browser_page pre {\n    overflow-x: auto;\n  }\n</style>\n"
  },
  {
    "path": "plugins/azurelib_utils/azurelib_utils.js",
    "content": "/*! For license information please see azurelib_utils.js.LICENSE.txt */\n(()=>{var t={2:(t,e,n)=>{var r=n(2199),i=n(4664),o=n(5950);t.exports=function(t){return r(t,o,i)}},79:(t,e,n)=>{var r=n(3702),i=n(80),o=n(4739),a=n(8655),u=n(1175);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}s.prototype.clear=r,s.prototype.delete=i,s.prototype.get=o,s.prototype.has=a,s.prototype.set=u,t.exports=s},80:(t,e,n)=>{var r=n(6025),i=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0||(n==e.length-1?e.pop():i.call(e,n,1),--this.size,0))}},104:(t,e,n)=>{var r=n(3661);function i(t,e){if(\"function\"!=typeof t||null!=e&&\"function\"!=typeof e)throw new TypeError(\"Expected a function\");var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(i.Cache||r),n}i.Cache=r,t.exports=i},144:(t,e,n)=>{const r=n(3908);t.exports=(t,e,n=!1)=>{if(t instanceof r)return t;try{return new r(t,e)}catch(t){if(!n)return null;throw t}}},179:(t,e,n)=>{var r=n(4932),i=n(9999),o=n(9931),a=n(1769),u=n(1791),s=n(3138),c=n(8816),l=n(3349),f=c(function(t,e){var n={};if(null==t)return n;var c=!1;e=r(e,function(e){return e=a(e,t),c||(c=e.length>1),e}),u(t,l(t),n),c&&(n=i(n,7,s));for(var f=e.length;f--;)o(n,e[f]);return n});t.exports=f},181:t=>{t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},259:t=>{\"use strict\";t.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let t=this.head;t;t=t.next)yield t.value}}},289:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).get(t)}},294:t=>{t.exports=function(t){return\"number\"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},346:t=>{t.exports=function(t){return null!=t&&\"object\"==typeof t}},361:t=>{var e=/^(?:0|[1-9]\\d*)$/;t.exports=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&(\"number\"==r||\"symbol\"!=r&&e.test(t))&&t>-1&&t%1==0&&t<n}},392:t=>{t.exports=function(t,e){return null==t?void 0:t[e]}},560:(t,e,n)=>{const r=n(3908);t.exports=(t,e,n)=>new r(t,n).compare(new r(e,n))},659:(t,e,n)=>{var r=n(1873),i=Object.prototype,o=i.hasOwnProperty,a=i.toString,u=r?r.toStringTag:void 0;t.exports=function(t){var e=o.call(t,u),n=t[u];try{t[u]=void 0;var r=!0}catch(t){}var i=a.call(t);return r&&(e?t[u]=n:delete t[u]),i}},695:(t,e,n)=>{var r=n(8096),i=n(2428),o=n(6449),a=n(3656),u=n(361),s=n(7167),c=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=o(t),l=!n&&i(t),f=!n&&!l&&a(t),p=!n&&!l&&!f&&s(t),h=n||l||f||p,d=h?r(t.length,String):[],v=d.length;for(var g in t)!e&&!c.call(t,g)||h&&(\"length\"==g||f&&(\"offset\"==g||\"parent\"==g)||p&&(\"buffer\"==g||\"byteLength\"==g||\"byteOffset\"==g)||u(g,v))||d.push(g);return d}},938:t=>{t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},945:(t,e,n)=>{var r=n(79),i=n(8223),o=n(3661);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!i||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(a)}return n.set(t,e),this.size=n.size,this}},1033:t=>{t.exports=function(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}},1042:(t,e,n)=>{var r=n(6110)(Object,\"create\");t.exports=r},1123:t=>{const e=/^[0-9]+$/,n=(t,n)=>{const r=e.test(t),i=e.test(n);return r&&i&&(t=+t,n=+n),t===n?0:r&&!i?-1:i&&!r?1:t<n?-1:1};t.exports={compareIdentifiers:n,rcompareIdentifiers:(t,e)=>n(e,t)}},1175:(t,e,n)=>{var r=n(6025);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},1331:(t,e,n)=>{var r=n(2552),i=n(8879),o=n(346),a=Function.prototype,u=Object.prototype,s=a.toString,c=u.hasOwnProperty,l=s.call(Object);t.exports=function(t){if(!o(t)||\"[object Object]\"!=r(t))return!1;var e=i(t);if(null===e)return!0;var n=c.call(e,\"constructor\")&&e.constructor;return\"function\"==typeof n&&n instanceof n&&s.call(n)==l}},1420:(t,e,n)=>{var r=n(79);t.exports=function(){this.__data__=new r,this.size=0}},1549:(t,e,n)=>{var r=n(2032),i=n(3862),o=n(6721),a=n(2749),u=n(5749);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}s.prototype.clear=r,s.prototype.delete=i,s.prototype.get=o,s.prototype.has=a,s.prototype.set=u,t.exports=s},1769:(t,e,n)=>{var r=n(6449),i=n(8586),o=n(1802),a=n(3222);t.exports=function(t,e){return r(t)?t:i(t,e)?[t]:o(a(t))}},1791:(t,e,n)=>{var r=n(6547),i=n(3360);t.exports=function(t,e,n,o){var a=!n;n||(n={});for(var u=-1,s=e.length;++u<s;){var c=e[u],l=o?o(n[c],t[c],c,n,t):void 0;void 0===l&&(l=t[c]),a?i(n,c,l):r(n,c,l)}return n}},1802:(t,e,n)=>{var r=n(2224),i=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,o=/\\\\(\\\\)?/g,a=r(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(\"\"),t.replace(i,function(t,n,r,i){e.push(r?i.replace(o,\"$1\"):n||t)}),e});t.exports=a},1811:t=>{var e=Date.now;t.exports=function(t){var n=0,r=0;return function(){var i=e(),o=16-(i-r);if(r=i,o>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}},1873:(t,e,n)=>{var r=n(9325).Symbol;t.exports=r},1882:(t,e,n)=>{var r=n(2552),i=n(3805);t.exports=function(t){if(!i(t))return!1;var e=r(t);return\"[object Function]\"==e||\"[object GeneratorFunction]\"==e||\"[object AsyncFunction]\"==e||\"[object Proxy]\"==e}},1961:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}},2032:(t,e,n)=>{var r=n(1042);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},2111:(t,e,n)=>{const r=n(4641),i=n(3999),o=n(5580),a=n(4089),u=n(7059),s=n(5200);t.exports=(t,e,n,c)=>{switch(e){case\"===\":return\"object\"==typeof t&&(t=t.version),\"object\"==typeof n&&(n=n.version),t===n;case\"!==\":return\"object\"==typeof t&&(t=t.version),\"object\"==typeof n&&(n=n.version),t!==n;case\"\":case\"=\":case\"==\":return r(t,n,c);case\"!=\":return i(t,n,c);case\">\":return o(t,n,c);case\">=\":return a(t,n,c);case\"<\":return u(t,n,c);case\"<=\":return s(t,n,c);default:throw new TypeError(`Invalid operator: ${e}`)}}},2199:(t,e,n)=>{var r=n(4528),i=n(6449);t.exports=function(t,e,n){var o=e(t);return i(t)?o:r(o,n(t))}},2224:(t,e,n)=>{var r=n(104);t.exports=function(t){var e=r(t,function(t){return 500===n.size&&n.clear(),t}),n=e.cache;return e}},2271:(t,e,n)=>{var r=n(1791),i=n(4664);t.exports=function(t,e){return r(t,i(t),e)}},2428:(t,e,n)=>{var r=n(7534),i=n(346),o=Object.prototype,a=o.hasOwnProperty,u=o.propertyIsEnumerable,s=r(function(){return arguments}())?r:function(t){return i(t)&&a.call(t,\"callee\")&&!u.call(t,\"callee\")};t.exports=s},2543:function(t,e,n){var r;t=n.nmd(t),function(){var i,o=\"Expected a function\",a=\"__lodash_hash_undefined__\",u=\"__lodash_placeholder__\",s=32,c=128,l=1/0,f=9007199254740991,p=NaN,h=4294967295,d=[[\"ary\",c],[\"bind\",1],[\"bindKey\",2],[\"curry\",8],[\"curryRight\",16],[\"flip\",512],[\"partial\",s],[\"partialRight\",64],[\"rearg\",256]],v=\"[object Arguments]\",g=\"[object Array]\",m=\"[object Boolean]\",y=\"[object Date]\",_=\"[object Error]\",b=\"[object Function]\",x=\"[object GeneratorFunction]\",A=\"[object Map]\",w=\"[object Number]\",E=\"[object Object]\",j=\"[object Promise]\",O=\"[object RegExp]\",I=\"[object Set]\",$=\"[object String]\",k=\"[object Symbol]\",R=\"[object WeakMap]\",L=\"[object ArrayBuffer]\",N=\"[object DataView]\",z=\"[object Float32Array]\",S=\"[object Float64Array]\",T=\"[object Int8Array]\",C=\"[object Int16Array]\",B=\"[object Int32Array]\",M=\"[object Uint8Array]\",P=\"[object Uint8ClampedArray]\",F=\"[object Uint16Array]\",D=\"[object Uint32Array]\",U=/\\b__p \\+= '';/g,G=/\\b(__p \\+=) '' \\+/g,W=/(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g,K=/&(?:amp|lt|gt|quot|#39);/g,X=/[&<>\"']/g,q=RegExp(K.source),V=RegExp(X.source),H=/<%-([\\s\\S]+?)%>/g,J=/<%([\\s\\S]+?)%>/g,Z=/<%=([\\s\\S]+?)%>/g,Q=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Y=/^\\w*$/,tt=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,et=/[\\\\^$.*+?()[\\]{}|]/g,nt=RegExp(et.source),rt=/^\\s+/,it=/\\s/,ot=/\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,at=/\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,ut=/,? & /,st=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g,ct=/[()=,{}\\[\\]\\/\\s]/,lt=/\\\\(\\\\)?/g,ft=/\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g,pt=/\\w*$/,ht=/^[-+]0x[0-9a-f]+$/i,dt=/^0b[01]+$/i,vt=/^\\[object .+?Constructor\\]$/,gt=/^0o[0-7]+$/i,mt=/^(?:0|[1-9]\\d*)$/,yt=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,_t=/($^)/,bt=/['\\n\\r\\u2028\\u2029\\\\]/g,xt=\"\\\\ud800-\\\\udfff\",At=\"\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe2f\\\\u20d0-\\\\u20ff\",wt=\"\\\\u2700-\\\\u27bf\",Et=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",jt=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",Ot=\"\\\\ufe0e\\\\ufe0f\",It=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\\\\u2000-\\\\u206f \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",$t=\"[\"+xt+\"]\",kt=\"[\"+It+\"]\",Rt=\"[\"+At+\"]\",Lt=\"\\\\d+\",Nt=\"[\"+wt+\"]\",zt=\"[\"+Et+\"]\",St=\"[^\"+xt+It+Lt+wt+Et+jt+\"]\",Tt=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",Ct=\"[^\"+xt+\"]\",Bt=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",Mt=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Pt=\"[\"+jt+\"]\",Ft=\"\\\\u200d\",Dt=\"(?:\"+zt+\"|\"+St+\")\",Ut=\"(?:\"+Pt+\"|\"+St+\")\",Gt=\"(?:['’](?:d|ll|m|re|s|t|ve))?\",Wt=\"(?:['’](?:D|LL|M|RE|S|T|VE))?\",Kt=\"(?:\"+Rt+\"|\"+Tt+\")?\",Xt=\"[\"+Ot+\"]?\",qt=Xt+Kt+\"(?:\"+Ft+\"(?:\"+[Ct,Bt,Mt].join(\"|\")+\")\"+Xt+Kt+\")*\",Vt=\"(?:\"+[Nt,Bt,Mt].join(\"|\")+\")\"+qt,Ht=\"(?:\"+[Ct+Rt+\"?\",Rt,Bt,Mt,$t].join(\"|\")+\")\",Jt=RegExp(\"['’]\",\"g\"),Zt=RegExp(Rt,\"g\"),Qt=RegExp(Tt+\"(?=\"+Tt+\")|\"+Ht+qt,\"g\"),Yt=RegExp([Pt+\"?\"+zt+\"+\"+Gt+\"(?=\"+[kt,Pt,\"$\"].join(\"|\")+\")\",Ut+\"+\"+Wt+\"(?=\"+[kt,Pt+Dt,\"$\"].join(\"|\")+\")\",Pt+\"?\"+Dt+\"+\"+Gt,Pt+\"+\"+Wt,\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",Lt,Vt].join(\"|\"),\"g\"),te=RegExp(\"[\"+Ft+xt+At+Ot+\"]\"),ee=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ne=[\"Array\",\"Buffer\",\"DataView\",\"Date\",\"Error\",\"Float32Array\",\"Float64Array\",\"Function\",\"Int8Array\",\"Int16Array\",\"Int32Array\",\"Map\",\"Math\",\"Object\",\"Promise\",\"RegExp\",\"Set\",\"String\",\"Symbol\",\"TypeError\",\"Uint8Array\",\"Uint8ClampedArray\",\"Uint16Array\",\"Uint32Array\",\"WeakMap\",\"_\",\"clearTimeout\",\"isFinite\",\"parseInt\",\"setTimeout\"],re=-1,ie={};ie[z]=ie[S]=ie[T]=ie[C]=ie[B]=ie[M]=ie[P]=ie[F]=ie[D]=!0,ie[v]=ie[g]=ie[L]=ie[m]=ie[N]=ie[y]=ie[_]=ie[b]=ie[A]=ie[w]=ie[E]=ie[O]=ie[I]=ie[$]=ie[R]=!1;var oe={};oe[v]=oe[g]=oe[L]=oe[N]=oe[m]=oe[y]=oe[z]=oe[S]=oe[T]=oe[C]=oe[B]=oe[A]=oe[w]=oe[E]=oe[O]=oe[I]=oe[$]=oe[k]=oe[M]=oe[P]=oe[F]=oe[D]=!0,oe[_]=oe[b]=oe[R]=!1;var ae={\"\\\\\":\"\\\\\",\"'\":\"'\",\"\\n\":\"n\",\"\\r\":\"r\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},ue=parseFloat,se=parseInt,ce=\"object\"==typeof global&&global&&global.Object===Object&&global,le=\"object\"==typeof self&&self&&self.Object===Object&&self,fe=ce||le||Function(\"return this\")(),pe=e&&!e.nodeType&&e,he=pe&&t&&!t.nodeType&&t,de=he&&he.exports===pe,ve=de&&ce.process,ge=function(){try{return he&&he.require&&he.require(\"util\").types||ve&&ve.binding&&ve.binding(\"util\")}catch(t){}}(),me=ge&&ge.isArrayBuffer,ye=ge&&ge.isDate,_e=ge&&ge.isMap,be=ge&&ge.isRegExp,xe=ge&&ge.isSet,Ae=ge&&ge.isTypedArray;function we(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function Ee(t,e,n,r){for(var i=-1,o=null==t?0:t.length;++i<o;){var a=t[i];e(r,a,n(a),t)}return r}function je(t,e){for(var n=-1,r=null==t?0:t.length;++n<r&&!1!==e(t[n],n,t););return t}function Oe(t,e){for(var n=null==t?0:t.length;n--&&!1!==e(t[n],n,t););return t}function Ie(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(!e(t[n],n,t))return!1;return!0}function $e(t,e){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n<r;){var a=t[n];e(a,n,t)&&(o[i++]=a)}return o}function ke(t,e){return!(null==t||!t.length)&&Pe(t,e,0)>-1}function Re(t,e,n){for(var r=-1,i=null==t?0:t.length;++r<i;)if(n(e,t[r]))return!0;return!1}function Le(t,e){for(var n=-1,r=null==t?0:t.length,i=Array(r);++n<r;)i[n]=e(t[n],n,t);return i}function Ne(t,e){for(var n=-1,r=e.length,i=t.length;++n<r;)t[i+n]=e[n];return t}function ze(t,e,n,r){var i=-1,o=null==t?0:t.length;for(r&&o&&(n=t[++i]);++i<o;)n=e(n,t[i],i,t);return n}function Se(t,e,n,r){var i=null==t?0:t.length;for(r&&i&&(n=t[--i]);i--;)n=e(n,t[i],i,t);return n}function Te(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}var Ce=Ge(\"length\");function Be(t,e,n){var r;return n(t,function(t,n,i){if(e(t,n,i))return r=n,!1}),r}function Me(t,e,n,r){for(var i=t.length,o=n+(r?1:-1);r?o--:++o<i;)if(e(t[o],o,t))return o;return-1}function Pe(t,e,n){return e==e?function(t,e,n){for(var r=n-1,i=t.length;++r<i;)if(t[r]===e)return r;return-1}(t,e,n):Me(t,De,n)}function Fe(t,e,n,r){for(var i=n-1,o=t.length;++i<o;)if(r(t[i],e))return i;return-1}function De(t){return t!=t}function Ue(t,e){var n=null==t?0:t.length;return n?Xe(t,e)/n:p}function Ge(t){return function(e){return null==e?i:e[t]}}function We(t){return function(e){return null==t?i:t[e]}}function Ke(t,e,n,r,i){return i(t,function(t,i,o){n=r?(r=!1,t):e(n,t,i,o)}),n}function Xe(t,e){for(var n,r=-1,o=t.length;++r<o;){var a=e(t[r]);a!==i&&(n=n===i?a:n+a)}return n}function qe(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}function Ve(t){return t?t.slice(0,pn(t)+1).replace(rt,\"\"):t}function He(t){return function(e){return t(e)}}function Je(t,e){return Le(e,function(e){return t[e]})}function Ze(t,e){return t.has(e)}function Qe(t,e){for(var n=-1,r=t.length;++n<r&&Pe(e,t[n],0)>-1;);return n}function Ye(t,e){for(var n=t.length;n--&&Pe(e,t[n],0)>-1;);return n}var tn=We({À:\"A\",Á:\"A\",Â:\"A\",Ã:\"A\",Ä:\"A\",Å:\"A\",à:\"a\",á:\"a\",â:\"a\",ã:\"a\",ä:\"a\",å:\"a\",Ç:\"C\",ç:\"c\",Ð:\"D\",ð:\"d\",È:\"E\",É:\"E\",Ê:\"E\",Ë:\"E\",è:\"e\",é:\"e\",ê:\"e\",ë:\"e\",Ì:\"I\",Í:\"I\",Î:\"I\",Ï:\"I\",ì:\"i\",í:\"i\",î:\"i\",ï:\"i\",Ñ:\"N\",ñ:\"n\",Ò:\"O\",Ó:\"O\",Ô:\"O\",Õ:\"O\",Ö:\"O\",Ø:\"O\",ò:\"o\",ó:\"o\",ô:\"o\",õ:\"o\",ö:\"o\",ø:\"o\",Ù:\"U\",Ú:\"U\",Û:\"U\",Ü:\"U\",ù:\"u\",ú:\"u\",û:\"u\",ü:\"u\",Ý:\"Y\",ý:\"y\",ÿ:\"y\",Æ:\"Ae\",æ:\"ae\",Þ:\"Th\",þ:\"th\",ß:\"ss\",Ā:\"A\",Ă:\"A\",Ą:\"A\",ā:\"a\",ă:\"a\",ą:\"a\",Ć:\"C\",Ĉ:\"C\",Ċ:\"C\",Č:\"C\",ć:\"c\",ĉ:\"c\",ċ:\"c\",č:\"c\",Ď:\"D\",Đ:\"D\",ď:\"d\",đ:\"d\",Ē:\"E\",Ĕ:\"E\",Ė:\"E\",Ę:\"E\",Ě:\"E\",ē:\"e\",ĕ:\"e\",ė:\"e\",ę:\"e\",ě:\"e\",Ĝ:\"G\",Ğ:\"G\",Ġ:\"G\",Ģ:\"G\",ĝ:\"g\",ğ:\"g\",ġ:\"g\",ģ:\"g\",Ĥ:\"H\",Ħ:\"H\",ĥ:\"h\",ħ:\"h\",Ĩ:\"I\",Ī:\"I\",Ĭ:\"I\",Į:\"I\",İ:\"I\",ĩ:\"i\",ī:\"i\",ĭ:\"i\",į:\"i\",ı:\"i\",Ĵ:\"J\",ĵ:\"j\",Ķ:\"K\",ķ:\"k\",ĸ:\"k\",Ĺ:\"L\",Ļ:\"L\",Ľ:\"L\",Ŀ:\"L\",Ł:\"L\",ĺ:\"l\",ļ:\"l\",ľ:\"l\",ŀ:\"l\",ł:\"l\",Ń:\"N\",Ņ:\"N\",Ň:\"N\",Ŋ:\"N\",ń:\"n\",ņ:\"n\",ň:\"n\",ŋ:\"n\",Ō:\"O\",Ŏ:\"O\",Ő:\"O\",ō:\"o\",ŏ:\"o\",ő:\"o\",Ŕ:\"R\",Ŗ:\"R\",Ř:\"R\",ŕ:\"r\",ŗ:\"r\",ř:\"r\",Ś:\"S\",Ŝ:\"S\",Ş:\"S\",Š:\"S\",ś:\"s\",ŝ:\"s\",ş:\"s\",š:\"s\",Ţ:\"T\",Ť:\"T\",Ŧ:\"T\",ţ:\"t\",ť:\"t\",ŧ:\"t\",Ũ:\"U\",Ū:\"U\",Ŭ:\"U\",Ů:\"U\",Ű:\"U\",Ų:\"U\",ũ:\"u\",ū:\"u\",ŭ:\"u\",ů:\"u\",ű:\"u\",ų:\"u\",Ŵ:\"W\",ŵ:\"w\",Ŷ:\"Y\",ŷ:\"y\",Ÿ:\"Y\",Ź:\"Z\",Ż:\"Z\",Ž:\"Z\",ź:\"z\",ż:\"z\",ž:\"z\",Ĳ:\"IJ\",ĳ:\"ij\",Œ:\"Oe\",œ:\"oe\",ŉ:\"'n\",ſ:\"s\"}),en=We({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"});function nn(t){return\"\\\\\"+ae[t]}function rn(t){return te.test(t)}function on(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function an(t,e){return function(n){return t(e(n))}}function un(t,e){for(var n=-1,r=t.length,i=0,o=[];++n<r;){var a=t[n];a!==e&&a!==u||(t[n]=u,o[i++]=n)}return o}function sn(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}function cn(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=[t,t]}),n}function ln(t){return rn(t)?function(t){for(var e=Qt.lastIndex=0;Qt.test(t);)++e;return e}(t):Ce(t)}function fn(t){return rn(t)?function(t){return t.match(Qt)||[]}(t):function(t){return t.split(\"\")}(t)}function pn(t){for(var e=t.length;e--&&it.test(t.charAt(e)););return e}var hn=We({\"&amp;\":\"&\",\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&#39;\":\"'\"}),dn=function t(e){var n,r=(e=null==e?fe:dn.defaults(fe.Object(),e,dn.pick(fe,ne))).Array,it=e.Date,xt=e.Error,At=e.Function,wt=e.Math,Et=e.Object,jt=e.RegExp,Ot=e.String,It=e.TypeError,$t=r.prototype,kt=At.prototype,Rt=Et.prototype,Lt=e[\"__core-js_shared__\"],Nt=kt.toString,zt=Rt.hasOwnProperty,St=0,Tt=(n=/[^.]+$/.exec(Lt&&Lt.keys&&Lt.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+n:\"\",Ct=Rt.toString,Bt=Nt.call(Et),Mt=fe._,Pt=jt(\"^\"+Nt.call(zt).replace(et,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\"),Ft=de?e.Buffer:i,Dt=e.Symbol,Ut=e.Uint8Array,Gt=Ft?Ft.allocUnsafe:i,Wt=an(Et.getPrototypeOf,Et),Kt=Et.create,Xt=Rt.propertyIsEnumerable,qt=$t.splice,Vt=Dt?Dt.isConcatSpreadable:i,Ht=Dt?Dt.iterator:i,Qt=Dt?Dt.toStringTag:i,te=function(){try{var t=so(Et,\"defineProperty\");return t({},\"\",{}),t}catch(t){}}(),ae=e.clearTimeout!==fe.clearTimeout&&e.clearTimeout,ce=it&&it.now!==fe.Date.now&&it.now,le=e.setTimeout!==fe.setTimeout&&e.setTimeout,pe=wt.ceil,he=wt.floor,ve=Et.getOwnPropertySymbols,ge=Ft?Ft.isBuffer:i,Ce=e.isFinite,We=$t.join,vn=an(Et.keys,Et),gn=wt.max,mn=wt.min,yn=it.now,_n=e.parseInt,bn=wt.random,xn=$t.reverse,An=so(e,\"DataView\"),wn=so(e,\"Map\"),En=so(e,\"Promise\"),jn=so(e,\"Set\"),On=so(e,\"WeakMap\"),In=so(Et,\"create\"),$n=On&&new On,kn={},Rn=Bo(An),Ln=Bo(wn),Nn=Bo(En),zn=Bo(jn),Sn=Bo(On),Tn=Dt?Dt.prototype:i,Cn=Tn?Tn.valueOf:i,Bn=Tn?Tn.toString:i;function Mn(t){if(tu(t)&&!Ga(t)&&!(t instanceof Un)){if(t instanceof Dn)return t;if(zt.call(t,\"__wrapped__\"))return Mo(t)}return new Dn(t)}var Pn=function(){function t(){}return function(e){if(!Ya(e))return{};if(Kt)return Kt(e);t.prototype=e;var n=new t;return t.prototype=i,n}}();function Fn(){}function Dn(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=i}function Un(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=h,this.__views__=[]}function Gn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function Wn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function Kn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}function Xn(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new Kn;++e<n;)this.add(t[e])}function qn(t){var e=this.__data__=new Wn(t);this.size=e.size}function Vn(t,e){var n=Ga(t),r=!n&&Ua(t),i=!n&&!r&&qa(t),o=!n&&!r&&!i&&su(t),a=n||r||i||o,u=a?qe(t.length,Ot):[],s=u.length;for(var c in t)!e&&!zt.call(t,c)||a&&(\"length\"==c||i&&(\"offset\"==c||\"parent\"==c)||o&&(\"buffer\"==c||\"byteLength\"==c||\"byteOffset\"==c)||go(c,s))||u.push(c);return u}function Hn(t){var e=t.length;return e?t[Kr(0,e-1)]:i}function Jn(t,e){return No(Oi(t),or(e,0,t.length))}function Zn(t){return No(Oi(t))}function Qn(t,e,n){(n!==i&&!Pa(t[e],n)||n===i&&!(e in t))&&rr(t,e,n)}function Yn(t,e,n){var r=t[e];zt.call(t,e)&&Pa(r,n)&&(n!==i||e in t)||rr(t,e,n)}function tr(t,e){for(var n=t.length;n--;)if(Pa(t[n][0],e))return n;return-1}function er(t,e,n,r){return lr(t,function(t,i,o){e(r,t,n(t),o)}),r}function nr(t,e){return t&&Ii(e,Ru(e),t)}function rr(t,e,n){\"__proto__\"==e&&te?te(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}function ir(t,e){for(var n=-1,o=e.length,a=r(o),u=null==t;++n<o;)a[n]=u?i:ju(t,e[n]);return a}function or(t,e,n){return t==t&&(n!==i&&(t=t<=n?t:n),e!==i&&(t=t>=e?t:e)),t}function ar(t,e,n,r,o,a){var u,s=1&e,c=2&e,l=4&e;if(n&&(u=o?n(t,r,o,a):n(t)),u!==i)return u;if(!Ya(t))return t;var f=Ga(t);if(f){if(u=function(t){var e=t.length,n=new t.constructor(e);return e&&\"string\"==typeof t[0]&&zt.call(t,\"index\")&&(n.index=t.index,n.input=t.input),n}(t),!s)return Oi(t,u)}else{var p=fo(t),h=p==b||p==x;if(qa(t))return bi(t,s);if(p==E||p==v||h&&!o){if(u=c||h?{}:ho(t),!s)return c?function(t,e){return Ii(t,lo(t),e)}(t,function(t,e){return t&&Ii(e,Lu(e),t)}(u,t)):function(t,e){return Ii(t,co(t),e)}(t,nr(u,t))}else{if(!oe[p])return o?t:{};u=function(t,e,n){var r,i=t.constructor;switch(e){case L:return xi(t);case m:case y:return new i(+t);case N:return function(t,e){var n=e?xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case z:case S:case T:case C:case B:case M:case P:case F:case D:return Ai(t,n);case A:return new i;case w:case $:return new i(t);case O:return function(t){var e=new t.constructor(t.source,pt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case I:return new i;case k:return r=t,Cn?Et(Cn.call(r)):{}}}(t,p,s)}}a||(a=new qn);var d=a.get(t);if(d)return d;a.set(t,u),ou(t)?t.forEach(function(r){u.add(ar(r,e,n,r,t,a))}):eu(t)&&t.forEach(function(r,i){u.set(i,ar(r,e,n,i,t,a))});var g=f?i:(l?c?eo:to:c?Lu:Ru)(t);return je(g||t,function(r,i){g&&(r=t[i=r]),Yn(u,i,ar(r,e,n,i,t,a))}),u}function ur(t,e,n){var r=n.length;if(null==t)return!r;for(t=Et(t);r--;){var o=n[r],a=e[o],u=t[o];if(u===i&&!(o in t)||!a(u))return!1}return!0}function sr(t,e,n){if(\"function\"!=typeof t)throw new It(o);return $o(function(){t.apply(i,n)},e)}function cr(t,e,n,r){var i=-1,o=ke,a=!0,u=t.length,s=[],c=e.length;if(!u)return s;n&&(e=Le(e,He(n))),r?(o=Re,a=!1):e.length>=200&&(o=Ze,a=!1,e=new Xn(e));t:for(;++i<u;){var l=t[i],f=null==n?l:n(l);if(l=r||0!==l?l:0,a&&f==f){for(var p=c;p--;)if(e[p]===f)continue t;s.push(l)}else o(e,f,r)||s.push(l)}return s}Mn.templateSettings={escape:H,evaluate:J,interpolate:Z,variable:\"\",imports:{_:Mn}},Mn.prototype=Fn.prototype,Mn.prototype.constructor=Mn,Dn.prototype=Pn(Fn.prototype),Dn.prototype.constructor=Dn,Un.prototype=Pn(Fn.prototype),Un.prototype.constructor=Un,Gn.prototype.clear=function(){this.__data__=In?In(null):{},this.size=0},Gn.prototype.delete=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e},Gn.prototype.get=function(t){var e=this.__data__;if(In){var n=e[t];return n===a?i:n}return zt.call(e,t)?e[t]:i},Gn.prototype.has=function(t){var e=this.__data__;return In?e[t]!==i:zt.call(e,t)},Gn.prototype.set=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=In&&e===i?a:e,this},Wn.prototype.clear=function(){this.__data__=[],this.size=0},Wn.prototype.delete=function(t){var e=this.__data__,n=tr(e,t);return!(n<0||(n==e.length-1?e.pop():qt.call(e,n,1),--this.size,0))},Wn.prototype.get=function(t){var e=this.__data__,n=tr(e,t);return n<0?i:e[n][1]},Wn.prototype.has=function(t){return tr(this.__data__,t)>-1},Wn.prototype.set=function(t,e){var n=this.__data__,r=tr(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Kn.prototype.clear=function(){this.size=0,this.__data__={hash:new Gn,map:new(wn||Wn),string:new Gn}},Kn.prototype.delete=function(t){var e=ao(this,t).delete(t);return this.size-=e?1:0,e},Kn.prototype.get=function(t){return ao(this,t).get(t)},Kn.prototype.has=function(t){return ao(this,t).has(t)},Kn.prototype.set=function(t,e){var n=ao(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Xn.prototype.add=Xn.prototype.push=function(t){return this.__data__.set(t,a),this},Xn.prototype.has=function(t){return this.__data__.has(t)},qn.prototype.clear=function(){this.__data__=new Wn,this.size=0},qn.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},qn.prototype.get=function(t){return this.__data__.get(t)},qn.prototype.has=function(t){return this.__data__.has(t)},qn.prototype.set=function(t,e){var n=this.__data__;if(n instanceof Wn){var r=n.__data__;if(!wn||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new Kn(r)}return n.set(t,e),this.size=n.size,this};var lr=Ri(yr),fr=Ri(_r,!0);function pr(t,e){var n=!0;return lr(t,function(t,r,i){return n=!!e(t,r,i)}),n}function hr(t,e,n){for(var r=-1,o=t.length;++r<o;){var a=t[r],u=e(a);if(null!=u&&(s===i?u==u&&!uu(u):n(u,s)))var s=u,c=a}return c}function dr(t,e){var n=[];return lr(t,function(t,r,i){e(t,r,i)&&n.push(t)}),n}function vr(t,e,n,r,i){var o=-1,a=t.length;for(n||(n=vo),i||(i=[]);++o<a;){var u=t[o];e>0&&n(u)?e>1?vr(u,e-1,n,r,i):Ne(i,u):r||(i[i.length]=u)}return i}var gr=Li(),mr=Li(!0);function yr(t,e){return t&&gr(t,e,Ru)}function _r(t,e){return t&&mr(t,e,Ru)}function br(t,e){return $e(e,function(e){return Ja(t[e])})}function xr(t,e){for(var n=0,r=(e=gi(e,t)).length;null!=t&&n<r;)t=t[Co(e[n++])];return n&&n==r?t:i}function Ar(t,e,n){var r=e(t);return Ga(t)?r:Ne(r,n(t))}function wr(t){return null==t?t===i?\"[object Undefined]\":\"[object Null]\":Qt&&Qt in Et(t)?function(t){var e=zt.call(t,Qt),n=t[Qt];try{t[Qt]=i;var r=!0}catch(t){}var o=Ct.call(t);return r&&(e?t[Qt]=n:delete t[Qt]),o}(t):function(t){return Ct.call(t)}(t)}function Er(t,e){return t>e}function jr(t,e){return null!=t&&zt.call(t,e)}function Or(t,e){return null!=t&&e in Et(t)}function Ir(t,e,n){for(var o=n?Re:ke,a=t[0].length,u=t.length,s=u,c=r(u),l=1/0,f=[];s--;){var p=t[s];s&&e&&(p=Le(p,He(e))),l=mn(p.length,l),c[s]=!n&&(e||a>=120&&p.length>=120)?new Xn(s&&p):i}p=t[0];var h=-1,d=c[0];t:for(;++h<a&&f.length<l;){var v=p[h],g=e?e(v):v;if(v=n||0!==v?v:0,!(d?Ze(d,g):o(f,g,n))){for(s=u;--s;){var m=c[s];if(!(m?Ze(m,g):o(t[s],g,n)))continue t}d&&d.push(g),f.push(v)}}return f}function $r(t,e,n){var r=null==(t=jo(t,e=gi(e,t)))?t:t[Co(Ho(e))];return null==r?i:we(r,t,n)}function kr(t){return tu(t)&&wr(t)==v}function Rr(t,e,n,r,o){return t===e||(null==t||null==e||!tu(t)&&!tu(e)?t!=t&&e!=e:function(t,e,n,r,o,a){var u=Ga(t),s=Ga(e),c=u?g:fo(t),l=s?g:fo(e),f=(c=c==v?E:c)==E,p=(l=l==v?E:l)==E,h=c==l;if(h&&qa(t)){if(!qa(e))return!1;u=!0,f=!1}if(h&&!f)return a||(a=new qn),u||su(t)?Qi(t,e,n,r,o,a):function(t,e,n,r,i,o,a){switch(n){case N:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case L:return!(t.byteLength!=e.byteLength||!o(new Ut(t),new Ut(e)));case m:case y:case w:return Pa(+t,+e);case _:return t.name==e.name&&t.message==e.message;case O:case $:return t==e+\"\";case A:var u=on;case I:var s=1&r;if(u||(u=sn),t.size!=e.size&&!s)return!1;var c=a.get(t);if(c)return c==e;r|=2,a.set(t,e);var l=Qi(u(t),u(e),r,i,o,a);return a.delete(t),l;case k:if(Cn)return Cn.call(t)==Cn.call(e)}return!1}(t,e,c,n,r,o,a);if(!(1&n)){var d=f&&zt.call(t,\"__wrapped__\"),b=p&&zt.call(e,\"__wrapped__\");if(d||b){var x=d?t.value():t,j=b?e.value():e;return a||(a=new qn),o(x,j,n,r,a)}}return!!h&&(a||(a=new qn),function(t,e,n,r,o,a){var u=1&n,s=to(t),c=s.length;if(c!=to(e).length&&!u)return!1;for(var l=c;l--;){var f=s[l];if(!(u?f in e:zt.call(e,f)))return!1}var p=a.get(t),h=a.get(e);if(p&&h)return p==e&&h==t;var d=!0;a.set(t,e),a.set(e,t);for(var v=u;++l<c;){var g=t[f=s[l]],m=e[f];if(r)var y=u?r(m,g,f,e,t,a):r(g,m,f,t,e,a);if(!(y===i?g===m||o(g,m,n,r,a):y)){d=!1;break}v||(v=\"constructor\"==f)}if(d&&!v){var _=t.constructor,b=e.constructor;_==b||!(\"constructor\"in t)||!(\"constructor\"in e)||\"function\"==typeof _&&_ instanceof _&&\"function\"==typeof b&&b instanceof b||(d=!1)}return a.delete(t),a.delete(e),d}(t,e,n,r,o,a))}(t,e,n,r,Rr,o))}function Lr(t,e,n,r){var o=n.length,a=o,u=!r;if(null==t)return!a;for(t=Et(t);o--;){var s=n[o];if(u&&s[2]?s[1]!==t[s[0]]:!(s[0]in t))return!1}for(;++o<a;){var c=(s=n[o])[0],l=t[c],f=s[1];if(u&&s[2]){if(l===i&&!(c in t))return!1}else{var p=new qn;if(r)var h=r(l,f,c,t,e,p);if(!(h===i?Rr(f,l,3,r,p):h))return!1}}return!0}function Nr(t){return!(!Ya(t)||(e=t,Tt&&Tt in e))&&(Ja(t)?Pt:vt).test(Bo(t));var e}function zr(t){return\"function\"==typeof t?t:null==t?ns:\"object\"==typeof t?Ga(t)?Mr(t[0],t[1]):Br(t):fs(t)}function Sr(t){if(!xo(t))return vn(t);var e=[];for(var n in Et(t))zt.call(t,n)&&\"constructor\"!=n&&e.push(n);return e}function Tr(t,e){return t<e}function Cr(t,e){var n=-1,i=Ka(t)?r(t.length):[];return lr(t,function(t,r,o){i[++n]=e(t,r,o)}),i}function Br(t){var e=uo(t);return 1==e.length&&e[0][2]?wo(e[0][0],e[0][1]):function(n){return n===t||Lr(n,t,e)}}function Mr(t,e){return yo(t)&&Ao(e)?wo(Co(t),e):function(n){var r=ju(n,t);return r===i&&r===e?Ou(n,t):Rr(e,r,3)}}function Pr(t,e,n,r,o){t!==e&&gr(e,function(a,u){if(o||(o=new qn),Ya(a))!function(t,e,n,r,o,a,u){var s=Oo(t,n),c=Oo(e,n),l=u.get(c);if(l)Qn(t,n,l);else{var f=a?a(s,c,n+\"\",t,e,u):i,p=f===i;if(p){var h=Ga(c),d=!h&&qa(c),v=!h&&!d&&su(c);f=c,h||d||v?Ga(s)?f=s:Xa(s)?f=Oi(s):d?(p=!1,f=bi(c,!0)):v?(p=!1,f=Ai(c,!0)):f=[]:ru(c)||Ua(c)?(f=s,Ua(s)?f=gu(s):Ya(s)&&!Ja(s)||(f=ho(c))):p=!1}p&&(u.set(c,f),o(f,c,r,a,u),u.delete(c)),Qn(t,n,f)}}(t,e,u,n,Pr,r,o);else{var s=r?r(Oo(t,u),a,u+\"\",t,e,o):i;s===i&&(s=a),Qn(t,u,s)}},Lu)}function Fr(t,e){var n=t.length;if(n)return go(e+=e<0?n:0,n)?t[e]:i}function Dr(t,e,n){e=e.length?Le(e,function(t){return Ga(t)?function(e){return xr(e,1===t.length?t[0]:t)}:t}):[ns];var r=-1;e=Le(e,He(oo()));var i=Cr(t,function(t,n,i){var o=Le(e,function(e){return e(t)});return{criteria:o,index:++r,value:t}});return function(t){var e=t.length;for(t.sort(function(t,e){return function(t,e,n){for(var r=-1,i=t.criteria,o=e.criteria,a=i.length,u=n.length;++r<a;){var s=wi(i[r],o[r]);if(s)return r>=u?s:s*(\"desc\"==n[r]?-1:1)}return t.index-e.index}(t,e,n)});e--;)t[e]=t[e].value;return t}(i)}function Ur(t,e,n){for(var r=-1,i=e.length,o={};++r<i;){var a=e[r],u=xr(t,a);n(u,a)&&Jr(o,gi(a,t),u)}return o}function Gr(t,e,n,r){var i=r?Fe:Pe,o=-1,a=e.length,u=t;for(t===e&&(e=Oi(e)),n&&(u=Le(t,He(n)));++o<a;)for(var s=0,c=e[o],l=n?n(c):c;(s=i(u,l,s,r))>-1;)u!==t&&qt.call(u,s,1),qt.call(t,s,1);return t}function Wr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==o){var o=i;go(i)?qt.call(t,i,1):si(t,i)}}return t}function Kr(t,e){return t+he(bn()*(e-t+1))}function Xr(t,e){var n=\"\";if(!t||e<1||e>f)return n;do{e%2&&(n+=t),(e=he(e/2))&&(t+=t)}while(e);return n}function qr(t,e){return ko(Eo(t,e,ns),t+\"\")}function Vr(t){return Hn(Pu(t))}function Hr(t,e){var n=Pu(t);return No(n,or(e,0,n.length))}function Jr(t,e,n,r){if(!Ya(t))return t;for(var o=-1,a=(e=gi(e,t)).length,u=a-1,s=t;null!=s&&++o<a;){var c=Co(e[o]),l=n;if(\"__proto__\"===c||\"constructor\"===c||\"prototype\"===c)return t;if(o!=u){var f=s[c];(l=r?r(f,c,s):i)===i&&(l=Ya(f)?f:go(e[o+1])?[]:{})}Yn(s,c,l),s=s[c]}return t}var Zr=$n?function(t,e){return $n.set(t,e),t}:ns,Qr=te?function(t,e){return te(t,\"toString\",{configurable:!0,enumerable:!1,value:Yu(e),writable:!0})}:ns;function Yr(t){return No(Pu(t))}function ti(t,e,n){var i=-1,o=t.length;e<0&&(e=-e>o?0:o+e),(n=n>o?o:n)<0&&(n+=o),o=e>n?0:n-e>>>0,e>>>=0;for(var a=r(o);++i<o;)a[i]=t[i+e];return a}function ei(t,e){var n;return lr(t,function(t,r,i){return!(n=e(t,r,i))}),!!n}function ni(t,e,n){var r=0,i=null==t?r:t.length;if(\"number\"==typeof e&&e==e&&i<=2147483647){for(;r<i;){var o=r+i>>>1,a=t[o];null!==a&&!uu(a)&&(n?a<=e:a<e)?r=o+1:i=o}return i}return ri(t,e,ns,n)}function ri(t,e,n,r){var o=0,a=null==t?0:t.length;if(0===a)return 0;for(var u=(e=n(e))!=e,s=null===e,c=uu(e),l=e===i;o<a;){var f=he((o+a)/2),p=n(t[f]),h=p!==i,d=null===p,v=p==p,g=uu(p);if(u)var m=r||v;else m=l?v&&(r||h):s?v&&h&&(r||!d):c?v&&h&&!d&&(r||!g):!d&&!g&&(r?p<=e:p<e);m?o=f+1:a=f}return mn(a,4294967294)}function ii(t,e){for(var n=-1,r=t.length,i=0,o=[];++n<r;){var a=t[n],u=e?e(a):a;if(!n||!Pa(u,s)){var s=u;o[i++]=0===a?0:a}}return o}function oi(t){return\"number\"==typeof t?t:uu(t)?p:+t}function ai(t){if(\"string\"==typeof t)return t;if(Ga(t))return Le(t,ai)+\"\";if(uu(t))return Bn?Bn.call(t):\"\";var e=t+\"\";return\"0\"==e&&1/t==-1/0?\"-0\":e}function ui(t,e,n){var r=-1,i=ke,o=t.length,a=!0,u=[],s=u;if(n)a=!1,i=Re;else if(o>=200){var c=e?null:Xi(t);if(c)return sn(c);a=!1,i=Ze,s=new Xn}else s=e?[]:u;t:for(;++r<o;){var l=t[r],f=e?e(l):l;if(l=n||0!==l?l:0,a&&f==f){for(var p=s.length;p--;)if(s[p]===f)continue t;e&&s.push(f),u.push(l)}else i(s,f,n)||(s!==u&&s.push(f),u.push(l))}return u}function si(t,e){return null==(t=jo(t,e=gi(e,t)))||delete t[Co(Ho(e))]}function ci(t,e,n,r){return Jr(t,e,n(xr(t,e)),r)}function li(t,e,n,r){for(var i=t.length,o=r?i:-1;(r?o--:++o<i)&&e(t[o],o,t););return n?ti(t,r?0:o,r?o+1:i):ti(t,r?o+1:0,r?i:o)}function fi(t,e){var n=t;return n instanceof Un&&(n=n.value()),ze(e,function(t,e){return e.func.apply(e.thisArg,Ne([t],e.args))},n)}function pi(t,e,n){var i=t.length;if(i<2)return i?ui(t[0]):[];for(var o=-1,a=r(i);++o<i;)for(var u=t[o],s=-1;++s<i;)s!=o&&(a[o]=cr(a[o]||u,t[s],e,n));return ui(vr(a,1),e,n)}function hi(t,e,n){for(var r=-1,o=t.length,a=e.length,u={};++r<o;){var s=r<a?e[r]:i;n(u,t[r],s)}return u}function di(t){return Xa(t)?t:[]}function vi(t){return\"function\"==typeof t?t:ns}function gi(t,e){return Ga(t)?t:yo(t,e)?[t]:To(mu(t))}var mi=qr;function yi(t,e,n){var r=t.length;return n=n===i?r:n,!e&&n>=r?t:ti(t,e,n)}var _i=ae||function(t){return fe.clearTimeout(t)};function bi(t,e){if(e)return t.slice();var n=t.length,r=Gt?Gt(n):new t.constructor(n);return t.copy(r),r}function xi(t){var e=new t.constructor(t.byteLength);return new Ut(e).set(new Ut(t)),e}function Ai(t,e){var n=e?xi(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function wi(t,e){if(t!==e){var n=t!==i,r=null===t,o=t==t,a=uu(t),u=e!==i,s=null===e,c=e==e,l=uu(e);if(!s&&!l&&!a&&t>e||a&&u&&c&&!s&&!l||r&&u&&c||!n&&c||!o)return 1;if(!r&&!a&&!l&&t<e||l&&n&&o&&!r&&!a||s&&n&&o||!u&&o||!c)return-1}return 0}function Ei(t,e,n,i){for(var o=-1,a=t.length,u=n.length,s=-1,c=e.length,l=gn(a-u,0),f=r(c+l),p=!i;++s<c;)f[s]=e[s];for(;++o<u;)(p||o<a)&&(f[n[o]]=t[o]);for(;l--;)f[s++]=t[o++];return f}function ji(t,e,n,i){for(var o=-1,a=t.length,u=-1,s=n.length,c=-1,l=e.length,f=gn(a-s,0),p=r(f+l),h=!i;++o<f;)p[o]=t[o];for(var d=o;++c<l;)p[d+c]=e[c];for(;++u<s;)(h||o<a)&&(p[d+n[u]]=t[o++]);return p}function Oi(t,e){var n=-1,i=t.length;for(e||(e=r(i));++n<i;)e[n]=t[n];return e}function Ii(t,e,n,r){var o=!n;n||(n={});for(var a=-1,u=e.length;++a<u;){var s=e[a],c=r?r(n[s],t[s],s,n,t):i;c===i&&(c=t[s]),o?rr(n,s,c):Yn(n,s,c)}return n}function $i(t,e){return function(n,r){var i=Ga(n)?Ee:er,o=e?e():{};return i(n,t,oo(r,2),o)}}function ki(t){return qr(function(e,n){var r=-1,o=n.length,a=o>1?n[o-1]:i,u=o>2?n[2]:i;for(a=t.length>3&&\"function\"==typeof a?(o--,a):i,u&&mo(n[0],n[1],u)&&(a=o<3?i:a,o=1),e=Et(e);++r<o;){var s=n[r];s&&t(e,s,r,a)}return e})}function Ri(t,e){return function(n,r){if(null==n)return n;if(!Ka(n))return t(n,r);for(var i=n.length,o=e?i:-1,a=Et(n);(e?o--:++o<i)&&!1!==r(a[o],o,a););return n}}function Li(t){return function(e,n,r){for(var i=-1,o=Et(e),a=r(e),u=a.length;u--;){var s=a[t?u:++i];if(!1===n(o[s],s,o))break}return e}}function Ni(t){return function(e){var n=rn(e=mu(e))?fn(e):i,r=n?n[0]:e.charAt(0),o=n?yi(n,1).join(\"\"):e.slice(1);return r[t]()+o}}function zi(t){return function(e){return ze(Ju(Uu(e).replace(Jt,\"\")),t,\"\")}}function Si(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var n=Pn(t.prototype),r=t.apply(n,e);return Ya(r)?r:n}}function Ti(t){return function(e,n,r){var o=Et(e);if(!Ka(e)){var a=oo(n,3);e=Ru(e),n=function(t){return a(o[t],t,o)}}var u=t(e,n,r);return u>-1?o[a?e[u]:u]:i}}function Ci(t){return Yi(function(e){var n=e.length,r=n,a=Dn.prototype.thru;for(t&&e.reverse();r--;){var u=e[r];if(\"function\"!=typeof u)throw new It(o);if(a&&!s&&\"wrapper\"==ro(u))var s=new Dn([],!0)}for(r=s?r:n;++r<n;){var c=ro(u=e[r]),l=\"wrapper\"==c?no(u):i;s=l&&_o(l[0])&&424==l[1]&&!l[4].length&&1==l[9]?s[ro(l[0])].apply(s,l[3]):1==u.length&&_o(u)?s[c]():s.thru(u)}return function(){var t=arguments,r=t[0];if(s&&1==t.length&&Ga(r))return s.plant(r).value();for(var i=0,o=n?e[i].apply(this,t):r;++i<n;)o=e[i].call(this,o);return o}})}function Bi(t,e,n,o,a,u,s,l,f,p){var h=e&c,d=1&e,v=2&e,g=24&e,m=512&e,y=v?i:Si(t);return function c(){for(var _=arguments.length,b=r(_),x=_;x--;)b[x]=arguments[x];if(g)var A=io(c),w=function(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}(b,A);if(o&&(b=Ei(b,o,a,g)),u&&(b=ji(b,u,s,g)),_-=w,g&&_<p){var E=un(b,A);return Wi(t,e,Bi,c.placeholder,n,b,E,l,f,p-_)}var j=d?n:this,O=v?j[t]:t;return _=b.length,l?b=function(t,e){for(var n=t.length,r=mn(e.length,n),o=Oi(t);r--;){var a=e[r];t[r]=go(a,n)?o[a]:i}return t}(b,l):m&&_>1&&b.reverse(),h&&f<_&&(b.length=f),this&&this!==fe&&this instanceof c&&(O=y||Si(O)),O.apply(j,b)}}function Mi(t,e){return function(n,r){return function(t,e,n,r){return yr(t,function(t,i,o){e(r,n(t),i,o)}),r}(n,t,e(r),{})}}function Pi(t,e){return function(n,r){var o;if(n===i&&r===i)return e;if(n!==i&&(o=n),r!==i){if(o===i)return r;\"string\"==typeof n||\"string\"==typeof r?(n=ai(n),r=ai(r)):(n=oi(n),r=oi(r)),o=t(n,r)}return o}}function Fi(t){return Yi(function(e){return e=Le(e,He(oo())),qr(function(n){var r=this;return t(e,function(t){return we(t,r,n)})})})}function Di(t,e){var n=(e=e===i?\" \":ai(e)).length;if(n<2)return n?Xr(e,t):e;var r=Xr(e,pe(t/ln(e)));return rn(e)?yi(fn(r),0,t).join(\"\"):r.slice(0,t)}function Ui(t){return function(e,n,o){return o&&\"number\"!=typeof o&&mo(e,n,o)&&(n=o=i),e=pu(e),n===i?(n=e,e=0):n=pu(n),function(t,e,n,i){for(var o=-1,a=gn(pe((e-t)/(n||1)),0),u=r(a);a--;)u[i?a:++o]=t,t+=n;return u}(e,n,o=o===i?e<n?1:-1:pu(o),t)}}function Gi(t){return function(e,n){return\"string\"==typeof e&&\"string\"==typeof n||(e=vu(e),n=vu(n)),t(e,n)}}function Wi(t,e,n,r,o,a,u,c,l,f){var p=8&e;e|=p?s:64,4&(e&=~(p?64:s))||(e&=-4);var h=[t,e,o,p?a:i,p?u:i,p?i:a,p?i:u,c,l,f],d=n.apply(i,h);return _o(t)&&Io(d,h),d.placeholder=r,Ro(d,t,e)}function Ki(t){var e=wt[t];return function(t,n){if(t=vu(t),(n=null==n?0:mn(hu(n),292))&&Ce(t)){var r=(mu(t)+\"e\").split(\"e\");return+((r=(mu(e(r[0]+\"e\"+(+r[1]+n)))+\"e\").split(\"e\"))[0]+\"e\"+(+r[1]-n))}return e(t)}}var Xi=jn&&1/sn(new jn([,-0]))[1]==l?function(t){return new jn(t)}:us;function qi(t){return function(e){var n=fo(e);return n==A?on(e):n==I?cn(e):function(t,e){return Le(e,function(e){return[e,t[e]]})}(e,t(e))}}function Vi(t,e,n,a,l,f,p,h){var d=2&e;if(!d&&\"function\"!=typeof t)throw new It(o);var v=a?a.length:0;if(v||(e&=-97,a=l=i),p=p===i?p:gn(hu(p),0),h=h===i?h:hu(h),v-=l?l.length:0,64&e){var g=a,m=l;a=l=i}var y=d?i:no(t),_=[t,e,n,a,l,g,m,f,p,h];if(y&&function(t,e){var n=t[1],r=e[1],i=n|r,o=i<131,a=r==c&&8==n||r==c&&256==n&&t[7].length<=e[8]||384==r&&e[7].length<=e[8]&&8==n;if(!o&&!a)return t;1&r&&(t[2]=e[2],i|=1&n?0:4);var s=e[3];if(s){var l=t[3];t[3]=l?Ei(l,s,e[4]):s,t[4]=l?un(t[3],u):e[4]}(s=e[5])&&(l=t[5],t[5]=l?ji(l,s,e[6]):s,t[6]=l?un(t[5],u):e[6]),(s=e[7])&&(t[7]=s),r&c&&(t[8]=null==t[8]?e[8]:mn(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=i}(_,y),t=_[0],e=_[1],n=_[2],a=_[3],l=_[4],!(h=_[9]=_[9]===i?d?0:t.length:gn(_[9]-v,0))&&24&e&&(e&=-25),e&&1!=e)b=8==e||16==e?function(t,e,n){var o=Si(t);return function a(){for(var u=arguments.length,s=r(u),c=u,l=io(a);c--;)s[c]=arguments[c];var f=u<3&&s[0]!==l&&s[u-1]!==l?[]:un(s,l);return(u-=f.length)<n?Wi(t,e,Bi,a.placeholder,i,s,f,i,i,n-u):we(this&&this!==fe&&this instanceof a?o:t,this,s)}}(t,e,h):e!=s&&33!=e||l.length?Bi.apply(i,_):function(t,e,n,i){var o=1&e,a=Si(t);return function e(){for(var u=-1,s=arguments.length,c=-1,l=i.length,f=r(l+s),p=this&&this!==fe&&this instanceof e?a:t;++c<l;)f[c]=i[c];for(;s--;)f[c++]=arguments[++u];return we(p,o?n:this,f)}}(t,e,n,a);else var b=function(t,e,n){var r=1&e,i=Si(t);return function e(){return(this&&this!==fe&&this instanceof e?i:t).apply(r?n:this,arguments)}}(t,e,n);return Ro((y?Zr:Io)(b,_),t,e)}function Hi(t,e,n,r){return t===i||Pa(t,Rt[n])&&!zt.call(r,n)?e:t}function Ji(t,e,n,r,o,a){return Ya(t)&&Ya(e)&&(a.set(e,t),Pr(t,e,i,Ji,a),a.delete(e)),t}function Zi(t){return ru(t)?i:t}function Qi(t,e,n,r,o,a){var u=1&n,s=t.length,c=e.length;if(s!=c&&!(u&&c>s))return!1;var l=a.get(t),f=a.get(e);if(l&&f)return l==e&&f==t;var p=-1,h=!0,d=2&n?new Xn:i;for(a.set(t,e),a.set(e,t);++p<s;){var v=t[p],g=e[p];if(r)var m=u?r(g,v,p,e,t,a):r(v,g,p,t,e,a);if(m!==i){if(m)continue;h=!1;break}if(d){if(!Te(e,function(t,e){if(!Ze(d,e)&&(v===t||o(v,t,n,r,a)))return d.push(e)})){h=!1;break}}else if(v!==g&&!o(v,g,n,r,a)){h=!1;break}}return a.delete(t),a.delete(e),h}function Yi(t){return ko(Eo(t,i,Wo),t+\"\")}function to(t){return Ar(t,Ru,co)}function eo(t){return Ar(t,Lu,lo)}var no=$n?function(t){return $n.get(t)}:us;function ro(t){for(var e=t.name+\"\",n=kn[e],r=zt.call(kn,e)?n.length:0;r--;){var i=n[r],o=i.func;if(null==o||o==t)return i.name}return e}function io(t){return(zt.call(Mn,\"placeholder\")?Mn:t).placeholder}function oo(){var t=Mn.iteratee||rs;return t=t===rs?zr:t,arguments.length?t(arguments[0],arguments[1]):t}function ao(t,e){var n,r,i=t.__data__;return(\"string\"==(r=typeof(n=e))||\"number\"==r||\"symbol\"==r||\"boolean\"==r?\"__proto__\"!==n:null===n)?i[\"string\"==typeof e?\"string\":\"hash\"]:i.map}function uo(t){for(var e=Ru(t),n=e.length;n--;){var r=e[n],i=t[r];e[n]=[r,i,Ao(i)]}return e}function so(t,e){var n=function(t,e){return null==t?i:t[e]}(t,e);return Nr(n)?n:i}var co=ve?function(t){return null==t?[]:(t=Et(t),$e(ve(t),function(e){return Xt.call(t,e)}))}:ds,lo=ve?function(t){for(var e=[];t;)Ne(e,co(t)),t=Wt(t);return e}:ds,fo=wr;function po(t,e,n){for(var r=-1,i=(e=gi(e,t)).length,o=!1;++r<i;){var a=Co(e[r]);if(!(o=null!=t&&n(t,a)))break;t=t[a]}return o||++r!=i?o:!!(i=null==t?0:t.length)&&Qa(i)&&go(a,i)&&(Ga(t)||Ua(t))}function ho(t){return\"function\"!=typeof t.constructor||xo(t)?{}:Pn(Wt(t))}function vo(t){return Ga(t)||Ua(t)||!!(Vt&&t&&t[Vt])}function go(t,e){var n=typeof t;return!!(e=null==e?f:e)&&(\"number\"==n||\"symbol\"!=n&&mt.test(t))&&t>-1&&t%1==0&&t<e}function mo(t,e,n){if(!Ya(n))return!1;var r=typeof e;return!!(\"number\"==r?Ka(n)&&go(e,n.length):\"string\"==r&&e in n)&&Pa(n[e],t)}function yo(t,e){if(Ga(t))return!1;var n=typeof t;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=t&&!uu(t))||Y.test(t)||!Q.test(t)||null!=e&&t in Et(e)}function _o(t){var e=ro(t),n=Mn[e];if(\"function\"!=typeof n||!(e in Un.prototype))return!1;if(t===n)return!0;var r=no(n);return!!r&&t===r[0]}(An&&fo(new An(new ArrayBuffer(1)))!=N||wn&&fo(new wn)!=A||En&&fo(En.resolve())!=j||jn&&fo(new jn)!=I||On&&fo(new On)!=R)&&(fo=function(t){var e=wr(t),n=e==E?t.constructor:i,r=n?Bo(n):\"\";if(r)switch(r){case Rn:return N;case Ln:return A;case Nn:return j;case zn:return I;case Sn:return R}return e});var bo=Lt?Ja:vs;function xo(t){var e=t&&t.constructor;return t===(\"function\"==typeof e&&e.prototype||Rt)}function Ao(t){return t==t&&!Ya(t)}function wo(t,e){return function(n){return null!=n&&n[t]===e&&(e!==i||t in Et(n))}}function Eo(t,e,n){return e=gn(e===i?t.length-1:e,0),function(){for(var i=arguments,o=-1,a=gn(i.length-e,0),u=r(a);++o<a;)u[o]=i[e+o];o=-1;for(var s=r(e+1);++o<e;)s[o]=i[o];return s[e]=n(u),we(t,this,s)}}function jo(t,e){return e.length<2?t:xr(t,ti(e,0,-1))}function Oo(t,e){if((\"constructor\"!==e||\"function\"!=typeof t[e])&&\"__proto__\"!=e)return t[e]}var Io=Lo(Zr),$o=le||function(t,e){return fe.setTimeout(t,e)},ko=Lo(Qr);function Ro(t,e,n){var r=e+\"\";return ko(t,function(t,e){var n=e.length;if(!n)return t;var r=n-1;return e[r]=(n>1?\"& \":\"\")+e[r],e=e.join(n>2?\", \":\" \"),t.replace(ot,\"{\\n/* [wrapped with \"+e+\"] */\\n\")}(r,function(t,e){return je(d,function(n){var r=\"_.\"+n[0];e&n[1]&&!ke(t,r)&&t.push(r)}),t.sort()}(function(t){var e=t.match(at);return e?e[1].split(ut):[]}(r),n)))}function Lo(t){var e=0,n=0;return function(){var r=yn(),o=16-(r-n);if(n=r,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(i,arguments)}}function No(t,e){var n=-1,r=t.length,o=r-1;for(e=e===i?r:e;++n<e;){var a=Kr(n,o),u=t[a];t[a]=t[n],t[n]=u}return t.length=e,t}var zo,So,To=(zo=za(function(t){var e=[];return 46===t.charCodeAt(0)&&e.push(\"\"),t.replace(tt,function(t,n,r,i){e.push(r?i.replace(lt,\"$1\"):n||t)}),e},function(t){return 500===So.size&&So.clear(),t}),So=zo.cache,zo);function Co(t){if(\"string\"==typeof t||uu(t))return t;var e=t+\"\";return\"0\"==e&&1/t==-1/0?\"-0\":e}function Bo(t){if(null!=t){try{return Nt.call(t)}catch(t){}try{return t+\"\"}catch(t){}}return\"\"}function Mo(t){if(t instanceof Un)return t.clone();var e=new Dn(t.__wrapped__,t.__chain__);return e.__actions__=Oi(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e}var Po=qr(function(t,e){return Xa(t)?cr(t,vr(e,1,Xa,!0)):[]}),Fo=qr(function(t,e){var n=Ho(e);return Xa(n)&&(n=i),Xa(t)?cr(t,vr(e,1,Xa,!0),oo(n,2)):[]}),Do=qr(function(t,e){var n=Ho(e);return Xa(n)&&(n=i),Xa(t)?cr(t,vr(e,1,Xa,!0),i,n):[]});function Uo(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:hu(n);return i<0&&(i=gn(r+i,0)),Me(t,oo(e,3),i)}function Go(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r-1;return n!==i&&(o=hu(n),o=n<0?gn(r+o,0):mn(o,r-1)),Me(t,oo(e,3),o,!0)}function Wo(t){return null!=t&&t.length?vr(t,1):[]}function Ko(t){return t&&t.length?t[0]:i}var Xo=qr(function(t){var e=Le(t,di);return e.length&&e[0]===t[0]?Ir(e):[]}),qo=qr(function(t){var e=Ho(t),n=Le(t,di);return e===Ho(n)?e=i:n.pop(),n.length&&n[0]===t[0]?Ir(n,oo(e,2)):[]}),Vo=qr(function(t){var e=Ho(t),n=Le(t,di);return(e=\"function\"==typeof e?e:i)&&n.pop(),n.length&&n[0]===t[0]?Ir(n,i,e):[]});function Ho(t){var e=null==t?0:t.length;return e?t[e-1]:i}var Jo=qr(Zo);function Zo(t,e){return t&&t.length&&e&&e.length?Gr(t,e):t}var Qo=Yi(function(t,e){var n=null==t?0:t.length,r=ir(t,e);return Wr(t,Le(e,function(t){return go(t,n)?+t:t}).sort(wi)),r});function Yo(t){return null==t?t:xn.call(t)}var ta=qr(function(t){return ui(vr(t,1,Xa,!0))}),ea=qr(function(t){var e=Ho(t);return Xa(e)&&(e=i),ui(vr(t,1,Xa,!0),oo(e,2))}),na=qr(function(t){var e=Ho(t);return e=\"function\"==typeof e?e:i,ui(vr(t,1,Xa,!0),i,e)});function ra(t){if(!t||!t.length)return[];var e=0;return t=$e(t,function(t){if(Xa(t))return e=gn(t.length,e),!0}),qe(e,function(e){return Le(t,Ge(e))})}function ia(t,e){if(!t||!t.length)return[];var n=ra(t);return null==e?n:Le(n,function(t){return we(e,i,t)})}var oa=qr(function(t,e){return Xa(t)?cr(t,e):[]}),aa=qr(function(t){return pi($e(t,Xa))}),ua=qr(function(t){var e=Ho(t);return Xa(e)&&(e=i),pi($e(t,Xa),oo(e,2))}),sa=qr(function(t){var e=Ho(t);return e=\"function\"==typeof e?e:i,pi($e(t,Xa),i,e)}),ca=qr(ra),la=qr(function(t){var e=t.length,n=e>1?t[e-1]:i;return n=\"function\"==typeof n?(t.pop(),n):i,ia(t,n)});function fa(t){var e=Mn(t);return e.__chain__=!0,e}function pa(t,e){return e(t)}var ha=Yi(function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return ir(e,t)};return!(e>1||this.__actions__.length)&&r instanceof Un&&go(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:pa,args:[o],thisArg:i}),new Dn(r,this.__chain__).thru(function(t){return e&&!t.length&&t.push(i),t})):this.thru(o)}),da=$i(function(t,e,n){zt.call(t,n)?++t[n]:rr(t,n,1)}),va=Ti(Uo),ga=Ti(Go);function ma(t,e){return(Ga(t)?je:lr)(t,oo(e,3))}function ya(t,e){return(Ga(t)?Oe:fr)(t,oo(e,3))}var _a=$i(function(t,e,n){zt.call(t,n)?t[n].push(e):rr(t,n,[e])}),ba=qr(function(t,e,n){var i=-1,o=\"function\"==typeof e,a=Ka(t)?r(t.length):[];return lr(t,function(t){a[++i]=o?we(e,t,n):$r(t,e,n)}),a}),xa=$i(function(t,e,n){rr(t,n,e)});function Aa(t,e){return(Ga(t)?Le:Cr)(t,oo(e,3))}var wa=$i(function(t,e,n){t[n?0:1].push(e)},function(){return[[],[]]}),Ea=qr(function(t,e){if(null==t)return[];var n=e.length;return n>1&&mo(t,e[0],e[1])?e=[]:n>2&&mo(e[0],e[1],e[2])&&(e=[e[0]]),Dr(t,vr(e,1),[])}),ja=ce||function(){return fe.Date.now()};function Oa(t,e,n){return e=n?i:e,e=t&&null==e?t.length:e,Vi(t,c,i,i,i,i,e)}function Ia(t,e){var n;if(\"function\"!=typeof e)throw new It(o);return t=hu(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=i),n}}var $a=qr(function(t,e,n){var r=1;if(n.length){var i=un(n,io($a));r|=s}return Vi(t,r,e,n,i)}),ka=qr(function(t,e,n){var r=3;if(n.length){var i=un(n,io(ka));r|=s}return Vi(e,r,t,n,i)});function Ra(t,e,n){var r,a,u,s,c,l,f=0,p=!1,h=!1,d=!0;if(\"function\"!=typeof t)throw new It(o);function v(e){var n=r,o=a;return r=a=i,f=e,s=t.apply(o,n)}function g(t){var n=t-l;return l===i||n>=e||n<0||h&&t-f>=u}function m(){var t=ja();if(g(t))return y(t);c=$o(m,function(t){var n=e-(t-l);return h?mn(n,u-(t-f)):n}(t))}function y(t){return c=i,d&&r?v(t):(r=a=i,s)}function _(){var t=ja(),n=g(t);if(r=arguments,a=this,l=t,n){if(c===i)return function(t){return f=t,c=$o(m,e),p?v(t):s}(l);if(h)return _i(c),c=$o(m,e),v(l)}return c===i&&(c=$o(m,e)),s}return e=vu(e)||0,Ya(n)&&(p=!!n.leading,u=(h=\"maxWait\"in n)?gn(vu(n.maxWait)||0,e):u,d=\"trailing\"in n?!!n.trailing:d),_.cancel=function(){c!==i&&_i(c),f=0,r=l=a=c=i},_.flush=function(){return c===i?s:y(ja())},_}var La=qr(function(t,e){return sr(t,1,e)}),Na=qr(function(t,e,n){return sr(t,vu(e)||0,n)});function za(t,e){if(\"function\"!=typeof t||null!=e&&\"function\"!=typeof e)throw new It(o);var n=function(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(za.Cache||Kn),n}function Sa(t){if(\"function\"!=typeof t)throw new It(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}za.Cache=Kn;var Ta=mi(function(t,e){var n=(e=1==e.length&&Ga(e[0])?Le(e[0],He(oo())):Le(vr(e,1),He(oo()))).length;return qr(function(r){for(var i=-1,o=mn(r.length,n);++i<o;)r[i]=e[i].call(this,r[i]);return we(t,this,r)})}),Ca=qr(function(t,e){var n=un(e,io(Ca));return Vi(t,s,i,e,n)}),Ba=qr(function(t,e){var n=un(e,io(Ba));return Vi(t,64,i,e,n)}),Ma=Yi(function(t,e){return Vi(t,256,i,i,i,e)});function Pa(t,e){return t===e||t!=t&&e!=e}var Fa=Gi(Er),Da=Gi(function(t,e){return t>=e}),Ua=kr(function(){return arguments}())?kr:function(t){return tu(t)&&zt.call(t,\"callee\")&&!Xt.call(t,\"callee\")},Ga=r.isArray,Wa=me?He(me):function(t){return tu(t)&&wr(t)==L};function Ka(t){return null!=t&&Qa(t.length)&&!Ja(t)}function Xa(t){return tu(t)&&Ka(t)}var qa=ge||vs,Va=ye?He(ye):function(t){return tu(t)&&wr(t)==y};function Ha(t){if(!tu(t))return!1;var e=wr(t);return e==_||\"[object DOMException]\"==e||\"string\"==typeof t.message&&\"string\"==typeof t.name&&!ru(t)}function Ja(t){if(!Ya(t))return!1;var e=wr(t);return e==b||e==x||\"[object AsyncFunction]\"==e||\"[object Proxy]\"==e}function Za(t){return\"number\"==typeof t&&t==hu(t)}function Qa(t){return\"number\"==typeof t&&t>-1&&t%1==0&&t<=f}function Ya(t){var e=typeof t;return null!=t&&(\"object\"==e||\"function\"==e)}function tu(t){return null!=t&&\"object\"==typeof t}var eu=_e?He(_e):function(t){return tu(t)&&fo(t)==A};function nu(t){return\"number\"==typeof t||tu(t)&&wr(t)==w}function ru(t){if(!tu(t)||wr(t)!=E)return!1;var e=Wt(t);if(null===e)return!0;var n=zt.call(e,\"constructor\")&&e.constructor;return\"function\"==typeof n&&n instanceof n&&Nt.call(n)==Bt}var iu=be?He(be):function(t){return tu(t)&&wr(t)==O},ou=xe?He(xe):function(t){return tu(t)&&fo(t)==I};function au(t){return\"string\"==typeof t||!Ga(t)&&tu(t)&&wr(t)==$}function uu(t){return\"symbol\"==typeof t||tu(t)&&wr(t)==k}var su=Ae?He(Ae):function(t){return tu(t)&&Qa(t.length)&&!!ie[wr(t)]},cu=Gi(Tr),lu=Gi(function(t,e){return t<=e});function fu(t){if(!t)return[];if(Ka(t))return au(t)?fn(t):Oi(t);if(Ht&&t[Ht])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Ht]());var e=fo(t);return(e==A?on:e==I?sn:Pu)(t)}function pu(t){return t?(t=vu(t))===l||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function hu(t){var e=pu(t),n=e%1;return e==e?n?e-n:e:0}function du(t){return t?or(hu(t),0,h):0}function vu(t){if(\"number\"==typeof t)return t;if(uu(t))return p;if(Ya(t)){var e=\"function\"==typeof t.valueOf?t.valueOf():t;t=Ya(e)?e+\"\":e}if(\"string\"!=typeof t)return 0===t?t:+t;t=Ve(t);var n=dt.test(t);return n||gt.test(t)?se(t.slice(2),n?2:8):ht.test(t)?p:+t}function gu(t){return Ii(t,Lu(t))}function mu(t){return null==t?\"\":ai(t)}var yu=ki(function(t,e){if(xo(e)||Ka(e))Ii(e,Ru(e),t);else for(var n in e)zt.call(e,n)&&Yn(t,n,e[n])}),_u=ki(function(t,e){Ii(e,Lu(e),t)}),bu=ki(function(t,e,n,r){Ii(e,Lu(e),t,r)}),xu=ki(function(t,e,n,r){Ii(e,Ru(e),t,r)}),Au=Yi(ir),wu=qr(function(t,e){t=Et(t);var n=-1,r=e.length,o=r>2?e[2]:i;for(o&&mo(e[0],e[1],o)&&(r=1);++n<r;)for(var a=e[n],u=Lu(a),s=-1,c=u.length;++s<c;){var l=u[s],f=t[l];(f===i||Pa(f,Rt[l])&&!zt.call(t,l))&&(t[l]=a[l])}return t}),Eu=qr(function(t){return t.push(i,Ji),we(zu,i,t)});function ju(t,e,n){var r=null==t?i:xr(t,e);return r===i?n:r}function Ou(t,e){return null!=t&&po(t,e,Or)}var Iu=Mi(function(t,e,n){null!=e&&\"function\"!=typeof e.toString&&(e=Ct.call(e)),t[e]=n},Yu(ns)),$u=Mi(function(t,e,n){null!=e&&\"function\"!=typeof e.toString&&(e=Ct.call(e)),zt.call(t,e)?t[e].push(n):t[e]=[n]},oo),ku=qr($r);function Ru(t){return Ka(t)?Vn(t):Sr(t)}function Lu(t){return Ka(t)?Vn(t,!0):function(t){if(!Ya(t))return function(t){var e=[];if(null!=t)for(var n in Et(t))e.push(n);return e}(t);var e=xo(t),n=[];for(var r in t)(\"constructor\"!=r||!e&&zt.call(t,r))&&n.push(r);return n}(t)}var Nu=ki(function(t,e,n){Pr(t,e,n)}),zu=ki(function(t,e,n,r){Pr(t,e,n,r)}),Su=Yi(function(t,e){var n={};if(null==t)return n;var r=!1;e=Le(e,function(e){return e=gi(e,t),r||(r=e.length>1),e}),Ii(t,eo(t),n),r&&(n=ar(n,7,Zi));for(var i=e.length;i--;)si(n,e[i]);return n}),Tu=Yi(function(t,e){return null==t?{}:function(t,e){return Ur(t,e,function(e,n){return Ou(t,n)})}(t,e)});function Cu(t,e){if(null==t)return{};var n=Le(eo(t),function(t){return[t]});return e=oo(e),Ur(t,n,function(t,n){return e(t,n[0])})}var Bu=qi(Ru),Mu=qi(Lu);function Pu(t){return null==t?[]:Je(t,Ru(t))}var Fu=zi(function(t,e,n){return e=e.toLowerCase(),t+(n?Du(e):e)});function Du(t){return Hu(mu(t).toLowerCase())}function Uu(t){return(t=mu(t))&&t.replace(yt,tn).replace(Zt,\"\")}var Gu=zi(function(t,e,n){return t+(n?\"-\":\"\")+e.toLowerCase()}),Wu=zi(function(t,e,n){return t+(n?\" \":\"\")+e.toLowerCase()}),Ku=Ni(\"toLowerCase\"),Xu=zi(function(t,e,n){return t+(n?\"_\":\"\")+e.toLowerCase()}),qu=zi(function(t,e,n){return t+(n?\" \":\"\")+Hu(e)}),Vu=zi(function(t,e,n){return t+(n?\" \":\"\")+e.toUpperCase()}),Hu=Ni(\"toUpperCase\");function Ju(t,e,n){return t=mu(t),(e=n?i:e)===i?function(t){return ee.test(t)}(t)?function(t){return t.match(Yt)||[]}(t):function(t){return t.match(st)||[]}(t):t.match(e)||[]}var Zu=qr(function(t,e){try{return we(t,i,e)}catch(t){return Ha(t)?t:new xt(t)}}),Qu=Yi(function(t,e){return je(e,function(e){e=Co(e),rr(t,e,$a(t[e],t))}),t});function Yu(t){return function(){return t}}var ts=Ci(),es=Ci(!0);function ns(t){return t}function rs(t){return zr(\"function\"==typeof t?t:ar(t,1))}var is=qr(function(t,e){return function(n){return $r(n,t,e)}}),os=qr(function(t,e){return function(n){return $r(t,n,e)}});function as(t,e,n){var r=Ru(e),i=br(e,r);null!=n||Ya(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=br(e,Ru(e)));var o=!(Ya(n)&&\"chain\"in n&&!n.chain),a=Ja(t);return je(i,function(n){var r=e[n];t[n]=r,a&&(t.prototype[n]=function(){var e=this.__chain__;if(o||e){var n=t(this.__wrapped__);return(n.__actions__=Oi(this.__actions__)).push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Ne([this.value()],arguments))})}),t}function us(){}var ss=Fi(Le),cs=Fi(Ie),ls=Fi(Te);function fs(t){return yo(t)?Ge(Co(t)):function(t){return function(e){return xr(e,t)}}(t)}var ps=Ui(),hs=Ui(!0);function ds(){return[]}function vs(){return!1}var gs,ms=Pi(function(t,e){return t+e},0),ys=Ki(\"ceil\"),_s=Pi(function(t,e){return t/e},1),bs=Ki(\"floor\"),xs=Pi(function(t,e){return t*e},1),As=Ki(\"round\"),ws=Pi(function(t,e){return t-e},0);return Mn.after=function(t,e){if(\"function\"!=typeof e)throw new It(o);return t=hu(t),function(){if(--t<1)return e.apply(this,arguments)}},Mn.ary=Oa,Mn.assign=yu,Mn.assignIn=_u,Mn.assignInWith=bu,Mn.assignWith=xu,Mn.at=Au,Mn.before=Ia,Mn.bind=$a,Mn.bindAll=Qu,Mn.bindKey=ka,Mn.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Ga(t)?t:[t]},Mn.chain=fa,Mn.chunk=function(t,e,n){e=(n?mo(t,e,n):e===i)?1:gn(hu(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var a=0,u=0,s=r(pe(o/e));a<o;)s[u++]=ti(t,a,a+=e);return s},Mn.compact=function(t){for(var e=-1,n=null==t?0:t.length,r=0,i=[];++e<n;){var o=t[e];o&&(i[r++]=o)}return i},Mn.concat=function(){var t=arguments.length;if(!t)return[];for(var e=r(t-1),n=arguments[0],i=t;i--;)e[i-1]=arguments[i];return Ne(Ga(n)?Oi(n):[n],vr(e,1))},Mn.cond=function(t){var e=null==t?0:t.length,n=oo();return t=e?Le(t,function(t){if(\"function\"!=typeof t[1])throw new It(o);return[n(t[0]),t[1]]}):[],qr(function(n){for(var r=-1;++r<e;){var i=t[r];if(we(i[0],this,n))return we(i[1],this,n)}})},Mn.conforms=function(t){return function(t){var e=Ru(t);return function(n){return ur(n,t,e)}}(ar(t,1))},Mn.constant=Yu,Mn.countBy=da,Mn.create=function(t,e){var n=Pn(t);return null==e?n:nr(n,e)},Mn.curry=function t(e,n,r){var o=Vi(e,8,i,i,i,i,i,n=r?i:n);return o.placeholder=t.placeholder,o},Mn.curryRight=function t(e,n,r){var o=Vi(e,16,i,i,i,i,i,n=r?i:n);return o.placeholder=t.placeholder,o},Mn.debounce=Ra,Mn.defaults=wu,Mn.defaultsDeep=Eu,Mn.defer=La,Mn.delay=Na,Mn.difference=Po,Mn.differenceBy=Fo,Mn.differenceWith=Do,Mn.drop=function(t,e,n){var r=null==t?0:t.length;return r?ti(t,(e=n||e===i?1:hu(e))<0?0:e,r):[]},Mn.dropRight=function(t,e,n){var r=null==t?0:t.length;return r?ti(t,0,(e=r-(e=n||e===i?1:hu(e)))<0?0:e):[]},Mn.dropRightWhile=function(t,e){return t&&t.length?li(t,oo(e,3),!0,!0):[]},Mn.dropWhile=function(t,e){return t&&t.length?li(t,oo(e,3),!0):[]},Mn.fill=function(t,e,n,r){var o=null==t?0:t.length;return o?(n&&\"number\"!=typeof n&&mo(t,e,n)&&(n=0,r=o),function(t,e,n,r){var o=t.length;for((n=hu(n))<0&&(n=-n>o?0:o+n),(r=r===i||r>o?o:hu(r))<0&&(r+=o),r=n>r?0:du(r);n<r;)t[n++]=e;return t}(t,e,n,r)):[]},Mn.filter=function(t,e){return(Ga(t)?$e:dr)(t,oo(e,3))},Mn.flatMap=function(t,e){return vr(Aa(t,e),1)},Mn.flatMapDeep=function(t,e){return vr(Aa(t,e),l)},Mn.flatMapDepth=function(t,e,n){return n=n===i?1:hu(n),vr(Aa(t,e),n)},Mn.flatten=Wo,Mn.flattenDeep=function(t){return null!=t&&t.length?vr(t,l):[]},Mn.flattenDepth=function(t,e){return null!=t&&t.length?vr(t,e=e===i?1:hu(e)):[]},Mn.flip=function(t){return Vi(t,512)},Mn.flow=ts,Mn.flowRight=es,Mn.fromPairs=function(t){for(var e=-1,n=null==t?0:t.length,r={};++e<n;){var i=t[e];r[i[0]]=i[1]}return r},Mn.functions=function(t){return null==t?[]:br(t,Ru(t))},Mn.functionsIn=function(t){return null==t?[]:br(t,Lu(t))},Mn.groupBy=_a,Mn.initial=function(t){return null!=t&&t.length?ti(t,0,-1):[]},Mn.intersection=Xo,Mn.intersectionBy=qo,Mn.intersectionWith=Vo,Mn.invert=Iu,Mn.invertBy=$u,Mn.invokeMap=ba,Mn.iteratee=rs,Mn.keyBy=xa,Mn.keys=Ru,Mn.keysIn=Lu,Mn.map=Aa,Mn.mapKeys=function(t,e){var n={};return e=oo(e,3),yr(t,function(t,r,i){rr(n,e(t,r,i),t)}),n},Mn.mapValues=function(t,e){var n={};return e=oo(e,3),yr(t,function(t,r,i){rr(n,r,e(t,r,i))}),n},Mn.matches=function(t){return Br(ar(t,1))},Mn.matchesProperty=function(t,e){return Mr(t,ar(e,1))},Mn.memoize=za,Mn.merge=Nu,Mn.mergeWith=zu,Mn.method=is,Mn.methodOf=os,Mn.mixin=as,Mn.negate=Sa,Mn.nthArg=function(t){return t=hu(t),qr(function(e){return Fr(e,t)})},Mn.omit=Su,Mn.omitBy=function(t,e){return Cu(t,Sa(oo(e)))},Mn.once=function(t){return Ia(2,t)},Mn.orderBy=function(t,e,n,r){return null==t?[]:(Ga(e)||(e=null==e?[]:[e]),Ga(n=r?i:n)||(n=null==n?[]:[n]),Dr(t,e,n))},Mn.over=ss,Mn.overArgs=Ta,Mn.overEvery=cs,Mn.overSome=ls,Mn.partial=Ca,Mn.partialRight=Ba,Mn.partition=wa,Mn.pick=Tu,Mn.pickBy=Cu,Mn.property=fs,Mn.propertyOf=function(t){return function(e){return null==t?i:xr(t,e)}},Mn.pull=Jo,Mn.pullAll=Zo,Mn.pullAllBy=function(t,e,n){return t&&t.length&&e&&e.length?Gr(t,e,oo(n,2)):t},Mn.pullAllWith=function(t,e,n){return t&&t.length&&e&&e.length?Gr(t,e,i,n):t},Mn.pullAt=Qo,Mn.range=ps,Mn.rangeRight=hs,Mn.rearg=Ma,Mn.reject=function(t,e){return(Ga(t)?$e:dr)(t,Sa(oo(e,3)))},Mn.remove=function(t,e){var n=[];if(!t||!t.length)return n;var r=-1,i=[],o=t.length;for(e=oo(e,3);++r<o;){var a=t[r];e(a,r,t)&&(n.push(a),i.push(r))}return Wr(t,i),n},Mn.rest=function(t,e){if(\"function\"!=typeof t)throw new It(o);return qr(t,e=e===i?e:hu(e))},Mn.reverse=Yo,Mn.sampleSize=function(t,e,n){return e=(n?mo(t,e,n):e===i)?1:hu(e),(Ga(t)?Jn:Hr)(t,e)},Mn.set=function(t,e,n){return null==t?t:Jr(t,e,n)},Mn.setWith=function(t,e,n,r){return r=\"function\"==typeof r?r:i,null==t?t:Jr(t,e,n,r)},Mn.shuffle=function(t){return(Ga(t)?Zn:Yr)(t)},Mn.slice=function(t,e,n){var r=null==t?0:t.length;return r?(n&&\"number\"!=typeof n&&mo(t,e,n)?(e=0,n=r):(e=null==e?0:hu(e),n=n===i?r:hu(n)),ti(t,e,n)):[]},Mn.sortBy=Ea,Mn.sortedUniq=function(t){return t&&t.length?ii(t):[]},Mn.sortedUniqBy=function(t,e){return t&&t.length?ii(t,oo(e,2)):[]},Mn.split=function(t,e,n){return n&&\"number\"!=typeof n&&mo(t,e,n)&&(e=n=i),(n=n===i?h:n>>>0)?(t=mu(t))&&(\"string\"==typeof e||null!=e&&!iu(e))&&!(e=ai(e))&&rn(t)?yi(fn(t),0,n):t.split(e,n):[]},Mn.spread=function(t,e){if(\"function\"!=typeof t)throw new It(o);return e=null==e?0:gn(hu(e),0),qr(function(n){var r=n[e],i=yi(n,0,e);return r&&Ne(i,r),we(t,this,i)})},Mn.tail=function(t){var e=null==t?0:t.length;return e?ti(t,1,e):[]},Mn.take=function(t,e,n){return t&&t.length?ti(t,0,(e=n||e===i?1:hu(e))<0?0:e):[]},Mn.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?ti(t,(e=r-(e=n||e===i?1:hu(e)))<0?0:e,r):[]},Mn.takeRightWhile=function(t,e){return t&&t.length?li(t,oo(e,3),!1,!0):[]},Mn.takeWhile=function(t,e){return t&&t.length?li(t,oo(e,3)):[]},Mn.tap=function(t,e){return e(t),t},Mn.throttle=function(t,e,n){var r=!0,i=!0;if(\"function\"!=typeof t)throw new It(o);return Ya(n)&&(r=\"leading\"in n?!!n.leading:r,i=\"trailing\"in n?!!n.trailing:i),Ra(t,e,{leading:r,maxWait:e,trailing:i})},Mn.thru=pa,Mn.toArray=fu,Mn.toPairs=Bu,Mn.toPairsIn=Mu,Mn.toPath=function(t){return Ga(t)?Le(t,Co):uu(t)?[t]:Oi(To(mu(t)))},Mn.toPlainObject=gu,Mn.transform=function(t,e,n){var r=Ga(t),i=r||qa(t)||su(t);if(e=oo(e,4),null==n){var o=t&&t.constructor;n=i?r?new o:[]:Ya(t)&&Ja(o)?Pn(Wt(t)):{}}return(i?je:yr)(t,function(t,r,i){return e(n,t,r,i)}),n},Mn.unary=function(t){return Oa(t,1)},Mn.union=ta,Mn.unionBy=ea,Mn.unionWith=na,Mn.uniq=function(t){return t&&t.length?ui(t):[]},Mn.uniqBy=function(t,e){return t&&t.length?ui(t,oo(e,2)):[]},Mn.uniqWith=function(t,e){return e=\"function\"==typeof e?e:i,t&&t.length?ui(t,i,e):[]},Mn.unset=function(t,e){return null==t||si(t,e)},Mn.unzip=ra,Mn.unzipWith=ia,Mn.update=function(t,e,n){return null==t?t:ci(t,e,vi(n))},Mn.updateWith=function(t,e,n,r){return r=\"function\"==typeof r?r:i,null==t?t:ci(t,e,vi(n),r)},Mn.values=Pu,Mn.valuesIn=function(t){return null==t?[]:Je(t,Lu(t))},Mn.without=oa,Mn.words=Ju,Mn.wrap=function(t,e){return Ca(vi(e),t)},Mn.xor=aa,Mn.xorBy=ua,Mn.xorWith=sa,Mn.zip=ca,Mn.zipObject=function(t,e){return hi(t||[],e||[],Yn)},Mn.zipObjectDeep=function(t,e){return hi(t||[],e||[],Jr)},Mn.zipWith=la,Mn.entries=Bu,Mn.entriesIn=Mu,Mn.extend=_u,Mn.extendWith=bu,as(Mn,Mn),Mn.add=ms,Mn.attempt=Zu,Mn.camelCase=Fu,Mn.capitalize=Du,Mn.ceil=ys,Mn.clamp=function(t,e,n){return n===i&&(n=e,e=i),n!==i&&(n=(n=vu(n))==n?n:0),e!==i&&(e=(e=vu(e))==e?e:0),or(vu(t),e,n)},Mn.clone=function(t){return ar(t,4)},Mn.cloneDeep=function(t){return ar(t,5)},Mn.cloneDeepWith=function(t,e){return ar(t,5,e=\"function\"==typeof e?e:i)},Mn.cloneWith=function(t,e){return ar(t,4,e=\"function\"==typeof e?e:i)},Mn.conformsTo=function(t,e){return null==e||ur(t,e,Ru(e))},Mn.deburr=Uu,Mn.defaultTo=function(t,e){return null==t||t!=t?e:t},Mn.divide=_s,Mn.endsWith=function(t,e,n){t=mu(t),e=ai(e);var r=t.length,o=n=n===i?r:or(hu(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},Mn.eq=Pa,Mn.escape=function(t){return(t=mu(t))&&V.test(t)?t.replace(X,en):t},Mn.escapeRegExp=function(t){return(t=mu(t))&&nt.test(t)?t.replace(et,\"\\\\$&\"):t},Mn.every=function(t,e,n){var r=Ga(t)?Ie:pr;return n&&mo(t,e,n)&&(e=i),r(t,oo(e,3))},Mn.find=va,Mn.findIndex=Uo,Mn.findKey=function(t,e){return Be(t,oo(e,3),yr)},Mn.findLast=ga,Mn.findLastIndex=Go,Mn.findLastKey=function(t,e){return Be(t,oo(e,3),_r)},Mn.floor=bs,Mn.forEach=ma,Mn.forEachRight=ya,Mn.forIn=function(t,e){return null==t?t:gr(t,oo(e,3),Lu)},Mn.forInRight=function(t,e){return null==t?t:mr(t,oo(e,3),Lu)},Mn.forOwn=function(t,e){return t&&yr(t,oo(e,3))},Mn.forOwnRight=function(t,e){return t&&_r(t,oo(e,3))},Mn.get=ju,Mn.gt=Fa,Mn.gte=Da,Mn.has=function(t,e){return null!=t&&po(t,e,jr)},Mn.hasIn=Ou,Mn.head=Ko,Mn.identity=ns,Mn.includes=function(t,e,n,r){t=Ka(t)?t:Pu(t),n=n&&!r?hu(n):0;var i=t.length;return n<0&&(n=gn(i+n,0)),au(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&Pe(t,e,n)>-1},Mn.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:hu(n);return i<0&&(i=gn(r+i,0)),Pe(t,e,i)},Mn.inRange=function(t,e,n){return e=pu(e),n===i?(n=e,e=0):n=pu(n),function(t,e,n){return t>=mn(e,n)&&t<gn(e,n)}(t=vu(t),e,n)},Mn.invoke=ku,Mn.isArguments=Ua,Mn.isArray=Ga,Mn.isArrayBuffer=Wa,Mn.isArrayLike=Ka,Mn.isArrayLikeObject=Xa,Mn.isBoolean=function(t){return!0===t||!1===t||tu(t)&&wr(t)==m},Mn.isBuffer=qa,Mn.isDate=Va,Mn.isElement=function(t){return tu(t)&&1===t.nodeType&&!ru(t)},Mn.isEmpty=function(t){if(null==t)return!0;if(Ka(t)&&(Ga(t)||\"string\"==typeof t||\"function\"==typeof t.splice||qa(t)||su(t)||Ua(t)))return!t.length;var e=fo(t);if(e==A||e==I)return!t.size;if(xo(t))return!Sr(t).length;for(var n in t)if(zt.call(t,n))return!1;return!0},Mn.isEqual=function(t,e){return Rr(t,e)},Mn.isEqualWith=function(t,e,n){var r=(n=\"function\"==typeof n?n:i)?n(t,e):i;return r===i?Rr(t,e,i,n):!!r},Mn.isError=Ha,Mn.isFinite=function(t){return\"number\"==typeof t&&Ce(t)},Mn.isFunction=Ja,Mn.isInteger=Za,Mn.isLength=Qa,Mn.isMap=eu,Mn.isMatch=function(t,e){return t===e||Lr(t,e,uo(e))},Mn.isMatchWith=function(t,e,n){return n=\"function\"==typeof n?n:i,Lr(t,e,uo(e),n)},Mn.isNaN=function(t){return nu(t)&&t!=+t},Mn.isNative=function(t){if(bo(t))throw new xt(\"Unsupported core-js use. Try https://npms.io/search?q=ponyfill.\");return Nr(t)},Mn.isNil=function(t){return null==t},Mn.isNull=function(t){return null===t},Mn.isNumber=nu,Mn.isObject=Ya,Mn.isObjectLike=tu,Mn.isPlainObject=ru,Mn.isRegExp=iu,Mn.isSafeInteger=function(t){return Za(t)&&t>=-9007199254740991&&t<=f},Mn.isSet=ou,Mn.isString=au,Mn.isSymbol=uu,Mn.isTypedArray=su,Mn.isUndefined=function(t){return t===i},Mn.isWeakMap=function(t){return tu(t)&&fo(t)==R},Mn.isWeakSet=function(t){return tu(t)&&\"[object WeakSet]\"==wr(t)},Mn.join=function(t,e){return null==t?\"\":We.call(t,e)},Mn.kebabCase=Gu,Mn.last=Ho,Mn.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return n!==i&&(o=(o=hu(n))<0?gn(r+o,0):mn(o,r-1)),e==e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):Me(t,De,o,!0)},Mn.lowerCase=Wu,Mn.lowerFirst=Ku,Mn.lt=cu,Mn.lte=lu,Mn.max=function(t){return t&&t.length?hr(t,ns,Er):i},Mn.maxBy=function(t,e){return t&&t.length?hr(t,oo(e,2),Er):i},Mn.mean=function(t){return Ue(t,ns)},Mn.meanBy=function(t,e){return Ue(t,oo(e,2))},Mn.min=function(t){return t&&t.length?hr(t,ns,Tr):i},Mn.minBy=function(t,e){return t&&t.length?hr(t,oo(e,2),Tr):i},Mn.stubArray=ds,Mn.stubFalse=vs,Mn.stubObject=function(){return{}},Mn.stubString=function(){return\"\"},Mn.stubTrue=function(){return!0},Mn.multiply=xs,Mn.nth=function(t,e){return t&&t.length?Fr(t,hu(e)):i},Mn.noConflict=function(){return fe._===this&&(fe._=Mt),this},Mn.noop=us,Mn.now=ja,Mn.pad=function(t,e,n){t=mu(t);var r=(e=hu(e))?ln(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return Di(he(i),n)+t+Di(pe(i),n)},Mn.padEnd=function(t,e,n){t=mu(t);var r=(e=hu(e))?ln(t):0;return e&&r<e?t+Di(e-r,n):t},Mn.padStart=function(t,e,n){t=mu(t);var r=(e=hu(e))?ln(t):0;return e&&r<e?Di(e-r,n)+t:t},Mn.parseInt=function(t,e,n){return n||null==e?e=0:e&&(e=+e),_n(mu(t).replace(rt,\"\"),e||0)},Mn.random=function(t,e,n){if(n&&\"boolean\"!=typeof n&&mo(t,e,n)&&(e=n=i),n===i&&(\"boolean\"==typeof e?(n=e,e=i):\"boolean\"==typeof t&&(n=t,t=i)),t===i&&e===i?(t=0,e=1):(t=pu(t),e===i?(e=t,t=0):e=pu(e)),t>e){var r=t;t=e,e=r}if(n||t%1||e%1){var o=bn();return mn(t+o*(e-t+ue(\"1e-\"+((o+\"\").length-1))),e)}return Kr(t,e)},Mn.reduce=function(t,e,n){var r=Ga(t)?ze:Ke,i=arguments.length<3;return r(t,oo(e,4),n,i,lr)},Mn.reduceRight=function(t,e,n){var r=Ga(t)?Se:Ke,i=arguments.length<3;return r(t,oo(e,4),n,i,fr)},Mn.repeat=function(t,e,n){return e=(n?mo(t,e,n):e===i)?1:hu(e),Xr(mu(t),e)},Mn.replace=function(){var t=arguments,e=mu(t[0]);return t.length<3?e:e.replace(t[1],t[2])},Mn.result=function(t,e,n){var r=-1,o=(e=gi(e,t)).length;for(o||(o=1,t=i);++r<o;){var a=null==t?i:t[Co(e[r])];a===i&&(r=o,a=n),t=Ja(a)?a.call(t):a}return t},Mn.round=As,Mn.runInContext=t,Mn.sample=function(t){return(Ga(t)?Hn:Vr)(t)},Mn.size=function(t){if(null==t)return 0;if(Ka(t))return au(t)?ln(t):t.length;var e=fo(t);return e==A||e==I?t.size:Sr(t).length},Mn.snakeCase=Xu,Mn.some=function(t,e,n){var r=Ga(t)?Te:ei;return n&&mo(t,e,n)&&(e=i),r(t,oo(e,3))},Mn.sortedIndex=function(t,e){return ni(t,e)},Mn.sortedIndexBy=function(t,e,n){return ri(t,e,oo(n,2))},Mn.sortedIndexOf=function(t,e){var n=null==t?0:t.length;if(n){var r=ni(t,e);if(r<n&&Pa(t[r],e))return r}return-1},Mn.sortedLastIndex=function(t,e){return ni(t,e,!0)},Mn.sortedLastIndexBy=function(t,e,n){return ri(t,e,oo(n,2),!0)},Mn.sortedLastIndexOf=function(t,e){if(null!=t&&t.length){var n=ni(t,e,!0)-1;if(Pa(t[n],e))return n}return-1},Mn.startCase=qu,Mn.startsWith=function(t,e,n){return t=mu(t),n=null==n?0:or(hu(n),0,t.length),e=ai(e),t.slice(n,n+e.length)==e},Mn.subtract=ws,Mn.sum=function(t){return t&&t.length?Xe(t,ns):0},Mn.sumBy=function(t,e){return t&&t.length?Xe(t,oo(e,2)):0},Mn.template=function(t,e,n){var r=Mn.templateSettings;n&&mo(t,e,n)&&(e=i),t=mu(t),e=bu({},e,r,Hi);var o,a,u=bu({},e.imports,r.imports,Hi),s=Ru(u),c=Je(u,s),l=0,f=e.interpolate||_t,p=\"__p += '\",h=jt((e.escape||_t).source+\"|\"+f.source+\"|\"+(f===Z?ft:_t).source+\"|\"+(e.evaluate||_t).source+\"|$\",\"g\"),d=\"//# sourceURL=\"+(zt.call(e,\"sourceURL\")?(e.sourceURL+\"\").replace(/\\s/g,\" \"):\"lodash.templateSources[\"+ ++re+\"]\")+\"\\n\";t.replace(h,function(e,n,r,i,u,s){return r||(r=i),p+=t.slice(l,s).replace(bt,nn),n&&(o=!0,p+=\"' +\\n__e(\"+n+\") +\\n'\"),u&&(a=!0,p+=\"';\\n\"+u+\";\\n__p += '\"),r&&(p+=\"' +\\n((__t = (\"+r+\")) == null ? '' : __t) +\\n'\"),l=s+e.length,e}),p+=\"';\\n\";var v=zt.call(e,\"variable\")&&e.variable;if(v){if(ct.test(v))throw new xt(\"Invalid `variable` option passed into `_.template`\")}else p=\"with (obj) {\\n\"+p+\"\\n}\\n\";p=(a?p.replace(U,\"\"):p).replace(G,\"$1\").replace(W,\"$1;\"),p=\"function(\"+(v||\"obj\")+\") {\\n\"+(v?\"\":\"obj || (obj = {});\\n\")+\"var __t, __p = ''\"+(o?\", __e = _.escape\":\"\")+(a?\", __j = Array.prototype.join;\\nfunction print() { __p += __j.call(arguments, '') }\\n\":\";\\n\")+p+\"return __p\\n}\";var g=Zu(function(){return At(s,d+\"return \"+p).apply(i,c)});if(g.source=p,Ha(g))throw g;return g},Mn.times=function(t,e){if((t=hu(t))<1||t>f)return[];var n=h,r=mn(t,h);e=oo(e),t-=h;for(var i=qe(r,e);++n<t;)e(n);return i},Mn.toFinite=pu,Mn.toInteger=hu,Mn.toLength=du,Mn.toLower=function(t){return mu(t).toLowerCase()},Mn.toNumber=vu,Mn.toSafeInteger=function(t){return t?or(hu(t),-9007199254740991,f):0===t?t:0},Mn.toString=mu,Mn.toUpper=function(t){return mu(t).toUpperCase()},Mn.trim=function(t,e,n){if((t=mu(t))&&(n||e===i))return Ve(t);if(!t||!(e=ai(e)))return t;var r=fn(t),o=fn(e);return yi(r,Qe(r,o),Ye(r,o)+1).join(\"\")},Mn.trimEnd=function(t,e,n){if((t=mu(t))&&(n||e===i))return t.slice(0,pn(t)+1);if(!t||!(e=ai(e)))return t;var r=fn(t);return yi(r,0,Ye(r,fn(e))+1).join(\"\")},Mn.trimStart=function(t,e,n){if((t=mu(t))&&(n||e===i))return t.replace(rt,\"\");if(!t||!(e=ai(e)))return t;var r=fn(t);return yi(r,Qe(r,fn(e))).join(\"\")},Mn.truncate=function(t,e){var n=30,r=\"...\";if(Ya(e)){var o=\"separator\"in e?e.separator:o;n=\"length\"in e?hu(e.length):n,r=\"omission\"in e?ai(e.omission):r}var a=(t=mu(t)).length;if(rn(t)){var u=fn(t);a=u.length}if(n>=a)return t;var s=n-ln(r);if(s<1)return r;var c=u?yi(u,0,s).join(\"\"):t.slice(0,s);if(o===i)return c+r;if(u&&(s+=c.length-s),iu(o)){if(t.slice(s).search(o)){var l,f=c;for(o.global||(o=jt(o.source,mu(pt.exec(o))+\"g\")),o.lastIndex=0;l=o.exec(f);)var p=l.index;c=c.slice(0,p===i?s:p)}}else if(t.indexOf(ai(o),s)!=s){var h=c.lastIndexOf(o);h>-1&&(c=c.slice(0,h))}return c+r},Mn.unescape=function(t){return(t=mu(t))&&q.test(t)?t.replace(K,hn):t},Mn.uniqueId=function(t){var e=++St;return mu(t)+e},Mn.upperCase=Vu,Mn.upperFirst=Hu,Mn.each=ma,Mn.eachRight=ya,Mn.first=Ko,as(Mn,(gs={},yr(Mn,function(t,e){zt.call(Mn.prototype,e)||(gs[e]=t)}),gs),{chain:!1}),Mn.VERSION=\"4.17.21\",je([\"bind\",\"bindKey\",\"curry\",\"curryRight\",\"partial\",\"partialRight\"],function(t){Mn[t].placeholder=Mn}),je([\"drop\",\"take\"],function(t,e){Un.prototype[t]=function(n){n=n===i?1:gn(hu(n),0);var r=this.__filtered__&&!e?new Un(this):this.clone();return r.__filtered__?r.__takeCount__=mn(n,r.__takeCount__):r.__views__.push({size:mn(n,h),type:t+(r.__dir__<0?\"Right\":\"\")}),r},Un.prototype[t+\"Right\"]=function(e){return this.reverse()[t](e).reverse()}}),je([\"filter\",\"map\",\"takeWhile\"],function(t,e){var n=e+1,r=1==n||3==n;Un.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:oo(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}}),je([\"head\",\"last\"],function(t,e){var n=\"take\"+(e?\"Right\":\"\");Un.prototype[t]=function(){return this[n](1).value()[0]}}),je([\"initial\",\"tail\"],function(t,e){var n=\"drop\"+(e?\"\":\"Right\");Un.prototype[t]=function(){return this.__filtered__?new Un(this):this[n](1)}}),Un.prototype.compact=function(){return this.filter(ns)},Un.prototype.find=function(t){return this.filter(t).head()},Un.prototype.findLast=function(t){return this.reverse().find(t)},Un.prototype.invokeMap=qr(function(t,e){return\"function\"==typeof t?new Un(this):this.map(function(n){return $r(n,t,e)})}),Un.prototype.reject=function(t){return this.filter(Sa(oo(t)))},Un.prototype.slice=function(t,e){t=hu(t);var n=this;return n.__filtered__&&(t>0||e<0)?new Un(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==i&&(n=(e=hu(e))<0?n.dropRight(-e):n.take(e-t)),n)},Un.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Un.prototype.toArray=function(){return this.take(h)},yr(Un.prototype,function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=Mn[r?\"take\"+(\"last\"==e?\"Right\":\"\"):e],a=r||/^find/.test(e);o&&(Mn.prototype[e]=function(){var e=this.__wrapped__,u=r?[1]:arguments,s=e instanceof Un,c=u[0],l=s||Ga(e),f=function(t){var e=o.apply(Mn,Ne([t],u));return r&&p?e[0]:e};l&&n&&\"function\"==typeof c&&1!=c.length&&(s=l=!1);var p=this.__chain__,h=!!this.__actions__.length,d=a&&!p,v=s&&!h;if(!a&&l){e=v?e:new Un(this);var g=t.apply(e,u);return g.__actions__.push({func:pa,args:[f],thisArg:i}),new Dn(g,p)}return d&&v?t.apply(this,u):(g=this.thru(f),d?r?g.value()[0]:g.value():g)})}),je([\"pop\",\"push\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(t){var e=$t[t],n=/^(?:push|sort|unshift)$/.test(t)?\"tap\":\"thru\",r=/^(?:pop|shift)$/.test(t);Mn.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(Ga(i)?i:[],t)}return this[n](function(n){return e.apply(Ga(n)?n:[],t)})}}),yr(Un.prototype,function(t,e){var n=Mn[e];if(n){var r=n.name+\"\";zt.call(kn,r)||(kn[r]=[]),kn[r].push({name:e,func:n})}}),kn[Bi(i,2).name]=[{name:\"wrapper\",func:i}],Un.prototype.clone=function(){var t=new Un(this.__wrapped__);return t.__actions__=Oi(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Oi(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Oi(this.__views__),t},Un.prototype.reverse=function(){if(this.__filtered__){var t=new Un(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Un.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=Ga(t),r=e<0,i=n?t.length:0,o=function(t,e,n){for(var r=-1,i=n.length;++r<i;){var o=n[r],a=o.size;switch(o.type){case\"drop\":t+=a;break;case\"dropRight\":e-=a;break;case\"take\":e=mn(e,t+a);break;case\"takeRight\":t=gn(t,e-a)}}return{start:t,end:e}}(0,i,this.__views__),a=o.start,u=o.end,s=u-a,c=r?u:a-1,l=this.__iteratees__,f=l.length,p=0,h=mn(s,this.__takeCount__);if(!n||!r&&i==s&&h==s)return fi(t,this.__actions__);var d=[];t:for(;s--&&p<h;){for(var v=-1,g=t[c+=e];++v<f;){var m=l[v],y=m.iteratee,_=m.type,b=y(g);if(2==_)g=b;else if(!b){if(1==_)continue t;break t}}d[p++]=g}return d},Mn.prototype.at=ha,Mn.prototype.chain=function(){return fa(this)},Mn.prototype.commit=function(){return new Dn(this.value(),this.__chain__)},Mn.prototype.next=function(){this.__values__===i&&(this.__values__=fu(this.value()));var t=this.__index__>=this.__values__.length;return{done:t,value:t?i:this.__values__[this.__index__++]}},Mn.prototype.plant=function(t){for(var e,n=this;n instanceof Fn;){var r=Mo(n);r.__index__=0,r.__values__=i,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},Mn.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Un){var e=t;return this.__actions__.length&&(e=new Un(this)),(e=e.reverse()).__actions__.push({func:pa,args:[Yo],thisArg:i}),new Dn(e,this.__chain__)}return this.thru(Yo)},Mn.prototype.toJSON=Mn.prototype.valueOf=Mn.prototype.value=function(){return fi(this.__wrapped__,this.__actions__)},Mn.prototype.first=Mn.prototype.head,Ht&&(Mn.prototype[Ht]=function(){return this}),Mn}();fe._=dn,(r=function(){return dn}.call(e,n,e,t))===i||(t.exports=r)}.call(this)},2552:(t,e,n)=>{var r=n(1873),i=n(659),o=n(9350),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?\"[object Undefined]\":\"[object Null]\":a&&a in Object(t)?i(t):o(t)}},2651:(t,e,n)=>{var r=n(4218);t.exports=function(t,e){var n=t.__data__;return r(e)?n[\"string\"==typeof e?\"string\":\"hash\"]:n.map}},2749:(t,e,n)=>{var r=n(1042),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:i.call(e,t)}},2804:(t,e,n)=>{var r=n(6110)(n(9325),\"Promise\");t.exports=r},2865:(t,e,n)=>{var r=n(9570),i=n(1811)(r);t.exports=i},2903:(t,e,n)=>{var r=n(3805),i=n(5527),o=n(181),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=i(t),n=[];for(var u in t)(\"constructor\"!=u||!e&&a.call(t,u))&&n.push(u);return n}},2949:(t,e,n)=>{var r=n(2651);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},3007:t=>{t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n<r;)e[n]=t[n];return e}},3040:(t,e,n)=>{var r=n(1549),i=n(79),o=n(8223);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},3120:(t,e,n)=>{var r=n(4528),i=n(5891);t.exports=function t(e,n,o,a,u){var s=-1,c=e.length;for(o||(o=i),u||(u=[]);++s<c;){var l=e[s];n>0&&o(l)?n>1?t(l,n-1,o,a,u):r(u,l):a||(u[u.length]=l)}return u}},3138:(t,e,n)=>{var r=n(1331);t.exports=function(t){return r(t)?void 0:t}},3199:(t,e,n)=>{var r=n(6110)(n(9325),\"DataView\");t.exports=r},3201:t=>{var e=/\\w*$/;t.exports=function(t){var n=new t.constructor(t.source,e.exec(t));return n.lastIndex=t.lastIndex,n}},3222:(t,e,n)=>{var r=n(7556);t.exports=function(t){return null==t?\"\":r(t)}},3243:(t,e,n)=>{var r=n(6110),i=function(){try{var t=r(Object,\"defineProperty\");return t({},\"\",{}),t}catch(t){}}();t.exports=i},3290:(t,e,n)=>{t=n.nmd(t);var r=n(9325),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i?r.Buffer:void 0,u=a?a.allocUnsafe:void 0;t.exports=function(t,e){if(e)return t.slice();var n=t.length,r=u?u(n):new t.constructor(n);return t.copy(r),r}},3345:t=>{t.exports=function(){return[]}},3349:(t,e,n)=>{var r=n(2199),i=n(6375),o=n(7241);t.exports=function(t){return r(t,o,i)}},3360:(t,e,n)=>{var r=n(3243);t.exports=function(t,e,n){\"__proto__\"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}},3488:t=>{t.exports=function(t){return t}},3605:t=>{t.exports=function(t){return this.__data__.get(t)}},3650:(t,e,n)=>{var r=n(4335)(Object.keys,Object);t.exports=r},3656:(t,e,n)=>{t=n.nmd(t);var r=n(9325),i=n(9935),o=e&&!e.nodeType&&e,a=o&&t&&!t.nodeType&&t,u=a&&a.exports===o?r.Buffer:void 0,s=(u?u.isBuffer:void 0)||i;t.exports=s},3661:(t,e,n)=>{var r=n(3040),i=n(7670),o=n(289),a=n(4509),u=n(2949);function s(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}s.prototype.clear=r,s.prototype.delete=i,s.prototype.get=o,s.prototype.has=a,s.prototype.set=u,t.exports=s},3702:t=>{t.exports=function(){this.__data__=[],this.size=0}},3729:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n<r&&!1!==e(t[n],n,t););return t}},3736:(t,e,n)=>{var r=n(1873),i=r?r.prototype:void 0,o=i?i.valueOf:void 0;t.exports=function(t){return o?Object(o.call(t)):{}}},3805:t=>{t.exports=function(t){var e=typeof t;return null!=t&&(\"object\"==e||\"function\"==e)}},3838:(t,e,n)=>{var r=n(1791),i=n(7241);t.exports=function(t,e){return t&&r(e,i(e),t)}},3862:t=>{t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},3904:(t,e,n)=>{const r=Symbol(\"SemVer ANY\");class i{static get ANY(){return r}constructor(t,e){if(e=o(e),t instanceof i){if(t.loose===!!e.loose)return t;t=t.value}t=t.trim().split(/\\s+/).join(\" \"),c(\"comparator\",t,e),this.options=e,this.loose=!!e.loose,this.parse(t),this.semver===r?this.value=\"\":this.value=this.operator+this.semver.version,c(\"comp\",this)}parse(t){const e=this.options.loose?a[u.COMPARATORLOOSE]:a[u.COMPARATOR],n=t.match(e);if(!n)throw new TypeError(`Invalid comparator: ${t}`);this.operator=void 0!==n[1]?n[1]:\"\",\"=\"===this.operator&&(this.operator=\"\"),n[2]?this.semver=new l(n[2],this.options.loose):this.semver=r}toString(){return this.value}test(t){if(c(\"Comparator.test\",t,this.options.loose),this.semver===r||t===r)return!0;if(\"string\"==typeof t)try{t=new l(t,this.options)}catch(t){return!1}return s(t,this.operator,this.semver,this.options)}intersects(t,e){if(!(t instanceof i))throw new TypeError(\"a Comparator is required\");return\"\"===this.operator?\"\"===this.value||new f(t.value,e).test(this.value):\"\"===t.operator?\"\"===t.value||new f(this.value,e).test(t.semver):!((e=o(e)).includePrerelease&&(\"<0.0.0-0\"===this.value||\"<0.0.0-0\"===t.value)||!e.includePrerelease&&(this.value.startsWith(\"<0.0.0\")||t.value.startsWith(\"<0.0.0\"))||(!this.operator.startsWith(\">\")||!t.operator.startsWith(\">\"))&&(!this.operator.startsWith(\"<\")||!t.operator.startsWith(\"<\"))&&(this.semver.version!==t.semver.version||!this.operator.includes(\"=\")||!t.operator.includes(\"=\"))&&!(s(this.semver,\"<\",t.semver,e)&&this.operator.startsWith(\">\")&&t.operator.startsWith(\"<\"))&&!(s(this.semver,\">\",t.semver,e)&&this.operator.startsWith(\"<\")&&t.operator.startsWith(\">\")))}}t.exports=i;const o=n(8587),{safeRe:a,t:u}=n(9718),s=n(2111),c=n(7272),l=n(3908),f=n(8311)},3908:(t,e,n)=>{const r=n(7272),{MAX_LENGTH:i,MAX_SAFE_INTEGER:o}=n(6874),{safeRe:a,t:u}=n(9718),s=n(8587),{compareIdentifiers:c}=n(1123);class l{constructor(t,e){if(e=s(e),t instanceof l){if(t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease)return t;t=t.version}else if(\"string\"!=typeof t)throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof t}\".`);if(t.length>i)throw new TypeError(`version is longer than ${i} characters`);r(\"SemVer\",t,e),this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease;const n=t.trim().match(e.loose?a[u.LOOSE]:a[u.FULL]);if(!n)throw new TypeError(`Invalid Version: ${t}`);if(this.raw=t,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>o||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>o||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>o||this.patch<0)throw new TypeError(\"Invalid patch version\");n[4]?this.prerelease=n[4].split(\".\").map(t=>{if(/^[0-9]+$/.test(t)){const e=+t;if(e>=0&&e<o)return e}return t}):this.prerelease=[],this.build=n[5]?n[5].split(\".\"):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(\".\")}`),this.version}toString(){return this.version}compare(t){if(r(\"SemVer.compare\",this.version,this.options,t),!(t instanceof l)){if(\"string\"==typeof t&&t===this.version)return 0;t=new l(t,this.options)}return t.version===this.version?0:this.compareMain(t)||this.comparePre(t)}compareMain(t){return t instanceof l||(t=new l(t,this.options)),c(this.major,t.major)||c(this.minor,t.minor)||c(this.patch,t.patch)}comparePre(t){if(t instanceof l||(t=new l(t,this.options)),this.prerelease.length&&!t.prerelease.length)return-1;if(!this.prerelease.length&&t.prerelease.length)return 1;if(!this.prerelease.length&&!t.prerelease.length)return 0;let e=0;do{const n=this.prerelease[e],i=t.prerelease[e];if(r(\"prerelease compare\",e,n,i),void 0===n&&void 0===i)return 0;if(void 0===i)return 1;if(void 0===n)return-1;if(n!==i)return c(n,i)}while(++e)}compareBuild(t){t instanceof l||(t=new l(t,this.options));let e=0;do{const n=this.build[e],i=t.build[e];if(r(\"prerelease compare\",e,n,i),void 0===n&&void 0===i)return 0;if(void 0===i)return 1;if(void 0===n)return-1;if(n!==i)return c(n,i)}while(++e)}inc(t,e,n){switch(t){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",e,n);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",e,n);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",e,n),this.inc(\"pre\",e,n);break;case\"prerelease\":0===this.prerelease.length&&this.inc(\"patch\",e,n),this.inc(\"pre\",e,n);break;case\"major\":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case\"pre\":{const t=Number(n)?1:0;if(!e&&!1===n)throw new Error(\"invalid increment argument: identifier is empty\");if(0===this.prerelease.length)this.prerelease=[t];else{let r=this.prerelease.length;for(;--r>=0;)\"number\"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);if(-1===r){if(e===this.prerelease.join(\".\")&&!1===n)throw new Error(\"invalid increment argument: identifier already exists\");this.prerelease.push(t)}}if(e){let r=[e,t];!1===n&&(r=[e]),0===c(this.prerelease[0],e)?isNaN(this.prerelease[1])&&(this.prerelease=r):this.prerelease=r}break}default:throw new Error(`invalid increment argument: ${t}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(\".\")}`),this}}t.exports=l},3999:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>0!==r(t,e,n)},4089:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)>=0},4218:t=>{t.exports=function(t){var e=typeof t;return\"string\"==e||\"number\"==e||\"symbol\"==e||\"boolean\"==e?\"__proto__\"!==t:null===t}},4335:t=>{t.exports=function(t,e){return function(n){return t(e(n))}}},4394:(t,e,n)=>{var r=n(2552),i=n(346);t.exports=function(t){return\"symbol\"==typeof t||i(t)&&\"[object Symbol]\"==r(t)}},4509:(t,e,n)=>{var r=n(2651);t.exports=function(t){return r(this,t).has(t)}},4528:t=>{t.exports=function(t,e){for(var n=-1,r=e.length,i=t.length;++n<r;)t[i+n]=e[n];return t}},4641:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>0===r(t,e,n)},4664:(t,e,n)=>{var r=n(9770),i=n(3345),o=Object.prototype.propertyIsEnumerable,a=Object.getOwnPropertySymbols,u=a?function(t){return null==t?[]:(t=Object(t),r(a(t),function(e){return o.call(t,e)}))}:i;t.exports=u},4733:(t,e,n)=>{var r=n(1791),i=n(5950);t.exports=function(t,e){return t&&r(e,i(e),t)}},4739:(t,e,n)=>{var r=n(6025);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},4840:t=>{var e=\"object\"==typeof global&&global&&global.Object===Object&&global;t.exports=e},4894:(t,e,n)=>{var r=n(1882),i=n(294);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},4901:(t,e,n)=>{var r=n(2552),i=n(294),o=n(346),a={};a[\"[object Float32Array]\"]=a[\"[object Float64Array]\"]=a[\"[object Int8Array]\"]=a[\"[object Int16Array]\"]=a[\"[object Int32Array]\"]=a[\"[object Uint8Array]\"]=a[\"[object Uint8ClampedArray]\"]=a[\"[object Uint16Array]\"]=a[\"[object Uint32Array]\"]=!0,a[\"[object Arguments]\"]=a[\"[object Array]\"]=a[\"[object ArrayBuffer]\"]=a[\"[object Boolean]\"]=a[\"[object DataView]\"]=a[\"[object Date]\"]=a[\"[object Error]\"]=a[\"[object Function]\"]=a[\"[object Map]\"]=a[\"[object Number]\"]=a[\"[object Object]\"]=a[\"[object RegExp]\"]=a[\"[object Set]\"]=a[\"[object String]\"]=a[\"[object WeakMap]\"]=!1,t.exports=function(t){return o(t)&&i(t.length)&&!!a[r(t)]}},4932:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=Array(r);++n<r;)i[n]=e(t[n],n,t);return i}},5083:(t,e,n)=>{var r=n(1882),i=n(7296),o=n(3805),a=n(7473),u=/^\\[object .+?Constructor\\]$/,s=Function.prototype,c=Object.prototype,l=s.toString,f=c.hasOwnProperty,p=RegExp(\"^\"+l.call(f).replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");t.exports=function(t){return!(!o(t)||i(t))&&(r(t)?p:u).test(a(t))}},5160:t=>{t.exports=function(t,e,n){var r=-1,i=t.length;e<0&&(e=-e>i?0:i+e),(n=n>i?i:n)<0&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var o=Array(i);++r<i;)o[r]=t[r+e];return o}},5200:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)<=0},5288:t=>{t.exports=function(t,e){return t===e||t!=t&&e!=e}},5481:(t,e,n)=>{var r=n(9325)[\"__core-js_shared__\"];t.exports=r},5527:t=>{var e=Object.prototype;t.exports=function(t){var n=t&&t.constructor;return t===(\"function\"==typeof n&&n.prototype||e)}},5529:(t,e,n)=>{var r=n(9344),i=n(8879),o=n(5527);t.exports=function(t){return\"function\"!=typeof t.constructor||o(t)?{}:r(i(t))}},5580:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)>0},5749:(t,e,n)=>{var r=n(1042);t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?\"__lodash_hash_undefined__\":e,this}},5861:(t,e,n)=>{var r=n(3199),i=n(8223),o=n(2804),a=n(6545),u=n(8303),s=n(2552),c=n(7473),l=\"[object Map]\",f=\"[object Promise]\",p=\"[object Set]\",h=\"[object WeakMap]\",d=\"[object DataView]\",v=c(r),g=c(i),m=c(o),y=c(a),_=c(u),b=s;(r&&b(new r(new ArrayBuffer(1)))!=d||i&&b(new i)!=l||o&&b(o.resolve())!=f||a&&b(new a)!=p||u&&b(new u)!=h)&&(b=function(t){var e=s(t),n=\"[object Object]\"==e?t.constructor:void 0,r=n?c(n):\"\";if(r)switch(r){case v:return d;case g:return l;case m:return f;case y:return p;case _:return h}return e}),t.exports=b},5891:(t,e,n)=>{var r=n(1873),i=n(2428),o=n(6449),a=r?r.isConcatSpreadable:void 0;t.exports=function(t){return o(t)||i(t)||!!(a&&t&&t[a])}},5950:(t,e,n)=>{var r=n(695),i=n(8984),o=n(4894);t.exports=function(t){return o(t)?r(t):i(t)}},5970:(t,e,n)=>{var r=n(3120);t.exports=function(t){return null!=t&&t.length?r(t,1):[]}},6009:(t,e,n)=>{t=n.nmd(t);var r=n(4840),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i&&r.process,u=function(){try{return o&&o.require&&o.require(\"util\").types||a&&a.binding&&a.binding(\"util\")}catch(t){}}();t.exports=u},6025:(t,e,n)=>{var r=n(5288);t.exports=function(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}},6038:(t,e,n)=>{var r=n(5861),i=n(346);t.exports=function(t){return i(t)&&\"[object Set]\"==r(t)}},6110:(t,e,n)=>{var r=n(5083),i=n(392);t.exports=function(t,e){var n=i(t,e);return r(n)?n:void 0}},6169:(t,e,n)=>{var r=n(9653);t.exports=function(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}},6170:(t,e,n)=>{const r=n(3908),i=n(144),{safeRe:o,t:a}=n(9718);t.exports=(t,e)=>{if(t instanceof r)return t;if(\"number\"==typeof t&&(t=String(t)),\"string\"!=typeof t)return null;let n=null;if((e=e||{}).rtl){let e;for(;(e=o[a.COERCERTL].exec(t))&&(!n||n.index+n[0].length!==t.length);)n&&e.index+e[0].length===n.index+n[0].length||(n=e),o[a.COERCERTL].lastIndex=e.index+e[1].length+e[2].length;o[a.COERCERTL].lastIndex=-1}else n=t.match(o[a.COERCE]);return null===n?null:i(`${n[2]}.${n[3]||\"0\"}.${n[4]||\"0\"}`,e)}},6189:t=>{var e=Object.prototype.hasOwnProperty;t.exports=function(t){var n=t.length,r=new t.constructor(n);return n&&\"string\"==typeof t[0]&&e.call(t,\"index\")&&(r.index=t.index,r.input=t.input),r}},6375:(t,e,n)=>{var r=n(4528),i=n(8879),o=n(4664),a=n(3345),u=Object.getOwnPropertySymbols?function(t){for(var e=[];t;)r(e,o(t)),t=i(t);return e}:a;t.exports=u},6449:t=>{var e=Array.isArray;t.exports=e},6545:(t,e,n)=>{var r=n(6110)(n(9325),\"Set\");t.exports=r},6547:(t,e,n)=>{var r=n(3360),i=n(5288),o=Object.prototype.hasOwnProperty;t.exports=function(t,e,n){var a=t[e];o.call(t,e)&&i(a,n)&&(void 0!==n||e in t)||r(t,e,n)}},6721:(t,e,n)=>{var r=n(1042),i=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return\"__lodash_hash_undefined__\"===n?void 0:n}return i.call(e,t)?e[t]:void 0}},6757:(t,e,n)=>{var r=n(1033),i=Math.max;t.exports=function(t,e,n){return e=i(void 0===e?t.length-1:e,0),function(){for(var o=arguments,a=-1,u=i(o.length-e,0),s=Array(u);++a<u;)s[a]=o[e+a];a=-1;for(var c=Array(e+1);++a<e;)c[a]=o[a];return c[e]=n(s),r(t,this,c)}}},6874:t=>{const e=Number.MAX_SAFE_INTEGER||9007199254740991;t.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:250,MAX_SAFE_INTEGER:e,RELEASE_TYPES:[\"major\",\"premajor\",\"minor\",\"preminor\",\"patch\",\"prepatch\",\"prerelease\"],SEMVER_SPEC_VERSION:\"2.0.0\",FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}},7059:(t,e,n)=>{const r=n(560);t.exports=(t,e,n)=>r(t,e,n)<0},7167:(t,e,n)=>{var r=n(4901),i=n(7301),o=n(6009),a=o&&o.isTypedArray,u=a?i(a):r;t.exports=u},7199:(t,e,n)=>{var r=n(9653),i=n(6169),o=n(3201),a=n(3736),u=n(1961);t.exports=function(t,e,n){var s=t.constructor;switch(e){case\"[object ArrayBuffer]\":return r(t);case\"[object Boolean]\":case\"[object Date]\":return new s(+t);case\"[object DataView]\":return i(t,n);case\"[object Float32Array]\":case\"[object Float64Array]\":case\"[object Int8Array]\":case\"[object Int16Array]\":case\"[object Int32Array]\":case\"[object Uint8Array]\":case\"[object Uint8ClampedArray]\":case\"[object Uint16Array]\":case\"[object Uint32Array]\":return u(t,n);case\"[object Map]\":case\"[object Set]\":return new s;case\"[object Number]\":case\"[object String]\":return new s(t);case\"[object RegExp]\":return o(t);case\"[object Symbol]\":return a(t)}}},7217:(t,e,n)=>{var r=n(79),i=n(1420),o=n(938),a=n(3605),u=n(9817),s=n(945);function c(t){var e=this.__data__=new r(t);this.size=e.size}c.prototype.clear=i,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=u,c.prototype.set=s,t.exports=c},7241:(t,e,n)=>{var r=n(695),i=n(2903),o=n(4894);t.exports=function(t){return o(t)?r(t,!0):i(t)}},7272:t=>{const e=\"object\"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error(\"SEMVER\",...t):()=>{};t.exports=e},7296:(t,e,n)=>{var r,i=n(5481),o=(r=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||\"\"))?\"Symbol(src)_1.\"+r:\"\";t.exports=function(t){return!!o&&o in t}},7301:t=>{t.exports=function(t){return function(e){return t(e)}}},7334:t=>{t.exports=function(t){return function(){return t}}},7422:(t,e,n)=>{var r=n(1769),i=n(7797);t.exports=function(t,e){for(var n=0,o=(e=r(e,t)).length;null!=t&&n<o;)t=t[i(e[n++])];return n&&n==o?t:void 0}},7473:t=>{var e=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return e.call(t)}catch(t){}try{return t+\"\"}catch(t){}}return\"\"}},7534:(t,e,n)=>{var r=n(2552),i=n(346);t.exports=function(t){return i(t)&&\"[object Arguments]\"==r(t)}},7556:(t,e,n)=>{var r=n(1873),i=n(4932),o=n(6449),a=n(4394),u=r?r.prototype:void 0,s=u?u.toString:void 0;t.exports=function t(e){if(\"string\"==typeof e)return e;if(o(e))return i(e,t)+\"\";if(a(e))return s?s.call(e):\"\";var n=e+\"\";return\"0\"==n&&1/e==-1/0?\"-0\":n}},7638:(t,e,n)=>{const r=n(8311);t.exports=(t,e,n)=>{try{e=new r(e,n)}catch(t){return!1}return e.test(t)}},7670:(t,e,n)=>{var r=n(2651);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},7730:(t,e,n)=>{var r=n(9172),i=n(7301),o=n(6009),a=o&&o.isMap,u=a?i(a):r;t.exports=u},7797:(t,e,n)=>{var r=n(4394);t.exports=function(t){if(\"string\"==typeof t||r(t))return t;var e=t+\"\";return\"0\"==e&&1/t==-1/0?\"-0\":e}},7828:(t,e,n)=>{var r=n(9325).Uint8Array;t.exports=r},8090:t=>{t.exports=function(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}},8096:t=>{t.exports=function(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}},8223:(t,e,n)=>{var r=n(6110)(n(9325),\"Map\");t.exports=r},8303:(t,e,n)=>{var r=n(6110)(n(9325),\"WeakMap\");t.exports=r},8311:(t,e,n)=>{class r{constructor(t,e){if(e=o(e),t instanceof r)return t.loose===!!e.loose&&t.includePrerelease===!!e.includePrerelease?t:new r(t.raw,e);if(t instanceof a)return this.raw=t.value,this.set=[[t]],this.format(),this;if(this.options=e,this.loose=!!e.loose,this.includePrerelease=!!e.includePrerelease,this.raw=t.trim().split(/\\s+/).join(\" \"),this.set=this.raw.split(\"||\").map(t=>this.parseRange(t.trim())).filter(t=>t.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){const t=this.set[0];if(this.set=this.set.filter(t=>!g(t[0])),0===this.set.length)this.set=[t];else if(this.set.length>1)for(const t of this.set)if(1===t.length&&m(t[0])){this.set=[t];break}}this.format()}format(){return this.range=this.set.map(t=>t.join(\" \").trim()).join(\"||\").trim(),this.range}toString(){return this.range}parseRange(t){const e=((this.options.includePrerelease&&d)|(this.options.loose&&v))+\":\"+t,n=i.get(e);if(n)return n;const r=this.options.loose,o=r?c[l.HYPHENRANGELOOSE]:c[l.HYPHENRANGE];t=t.replace(o,k(this.options.includePrerelease)),u(\"hyphen replace\",t),t=t.replace(c[l.COMPARATORTRIM],f),u(\"comparator trim\",t),t=t.replace(c[l.TILDETRIM],p),u(\"tilde trim\",t),t=t.replace(c[l.CARETTRIM],h),u(\"caret trim\",t);let s=t.split(\" \").map(t=>_(t,this.options)).join(\" \").split(/\\s+/).map(t=>$(t,this.options));r&&(s=s.filter(t=>(u(\"loose invalid filter\",t,this.options),!!t.match(c[l.COMPARATORLOOSE])))),u(\"range list\",s);const m=new Map,y=s.map(t=>new a(t,this.options));for(const t of y){if(g(t))return[t];m.set(t.value,t)}m.size>1&&m.has(\"\")&&m.delete(\"\");const b=[...m.values()];return i.set(e,b),b}intersects(t,e){if(!(t instanceof r))throw new TypeError(\"a Range is required\");return this.set.some(n=>y(n,e)&&t.set.some(t=>y(t,e)&&n.every(n=>t.every(t=>n.intersects(t,e)))))}test(t){if(!t)return!1;if(\"string\"==typeof t)try{t=new s(t,this.options)}catch(t){return!1}for(let e=0;e<this.set.length;e++)if(R(this.set[e],t,this.options))return!0;return!1}}t.exports=r;const i=new(n(9749))({max:1e3}),o=n(8587),a=n(3904),u=n(7272),s=n(3908),{safeRe:c,t:l,comparatorTrimReplace:f,tildeTrimReplace:p,caretTrimReplace:h}=n(9718),{FLAG_INCLUDE_PRERELEASE:d,FLAG_LOOSE:v}=n(6874),g=t=>\"<0.0.0-0\"===t.value,m=t=>\"\"===t.value,y=(t,e)=>{let n=!0;const r=t.slice();let i=r.pop();for(;n&&r.length;)n=r.every(t=>i.intersects(t,e)),i=r.pop();return n},_=(t,e)=>(u(\"comp\",t,e),t=w(t,e),u(\"caret\",t),t=x(t,e),u(\"tildes\",t),t=j(t,e),u(\"xrange\",t),t=I(t,e),u(\"stars\",t),t),b=t=>!t||\"x\"===t.toLowerCase()||\"*\"===t,x=(t,e)=>t.trim().split(/\\s+/).map(t=>A(t,e)).join(\" \"),A=(t,e)=>{const n=e.loose?c[l.TILDELOOSE]:c[l.TILDE];return t.replace(n,(e,n,r,i,o)=>{let a;return u(\"tilde\",t,e,n,r,i,o),b(n)?a=\"\":b(r)?a=`>=${n}.0.0 <${+n+1}.0.0-0`:b(i)?a=`>=${n}.${r}.0 <${n}.${+r+1}.0-0`:o?(u(\"replaceTilde pr\",o),a=`>=${n}.${r}.${i}-${o} <${n}.${+r+1}.0-0`):a=`>=${n}.${r}.${i} <${n}.${+r+1}.0-0`,u(\"tilde return\",a),a})},w=(t,e)=>t.trim().split(/\\s+/).map(t=>E(t,e)).join(\" \"),E=(t,e)=>{u(\"caret\",t,e);const n=e.loose?c[l.CARETLOOSE]:c[l.CARET],r=e.includePrerelease?\"-0\":\"\";return t.replace(n,(e,n,i,o,a)=>{let s;return u(\"caret\",t,e,n,i,o,a),b(n)?s=\"\":b(i)?s=`>=${n}.0.0${r} <${+n+1}.0.0-0`:b(o)?s=\"0\"===n?`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:a?(u(\"replaceCaret pr\",a),s=\"0\"===n?\"0\"===i?`>=${n}.${i}.${o}-${a} <${n}.${i}.${+o+1}-0`:`>=${n}.${i}.${o}-${a} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${o}-${a} <${+n+1}.0.0-0`):(u(\"no pr\"),s=\"0\"===n?\"0\"===i?`>=${n}.${i}.${o}${r} <${n}.${i}.${+o+1}-0`:`>=${n}.${i}.${o}${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${o} <${+n+1}.0.0-0`),u(\"caret return\",s),s})},j=(t,e)=>(u(\"replaceXRanges\",t,e),t.split(/\\s+/).map(t=>O(t,e)).join(\" \")),O=(t,e)=>{t=t.trim();const n=e.loose?c[l.XRANGELOOSE]:c[l.XRANGE];return t.replace(n,(n,r,i,o,a,s)=>{u(\"xRange\",t,n,r,i,o,a,s);const c=b(i),l=c||b(o),f=l||b(a),p=f;return\"=\"===r&&p&&(r=\"\"),s=e.includePrerelease?\"-0\":\"\",c?n=\">\"===r||\"<\"===r?\"<0.0.0-0\":\"*\":r&&p?(l&&(o=0),a=0,\">\"===r?(r=\">=\",l?(i=+i+1,o=0,a=0):(o=+o+1,a=0)):\"<=\"===r&&(r=\"<\",l?i=+i+1:o=+o+1),\"<\"===r&&(s=\"-0\"),n=`${r+i}.${o}.${a}${s}`):l?n=`>=${i}.0.0${s} <${+i+1}.0.0-0`:f&&(n=`>=${i}.${o}.0${s} <${i}.${+o+1}.0-0`),u(\"xRange return\",n),n})},I=(t,e)=>(u(\"replaceStars\",t,e),t.trim().replace(c[l.STAR],\"\")),$=(t,e)=>(u(\"replaceGTE0\",t,e),t.trim().replace(c[e.includePrerelease?l.GTE0PRE:l.GTE0],\"\")),k=t=>(e,n,r,i,o,a,u,s,c,l,f,p,h)=>`${n=b(r)?\"\":b(i)?`>=${r}.0.0${t?\"-0\":\"\"}`:b(o)?`>=${r}.${i}.0${t?\"-0\":\"\"}`:a?`>=${n}`:`>=${n}${t?\"-0\":\"\"}`} ${s=b(c)?\"\":b(l)?`<${+c+1}.0.0-0`:b(f)?`<${c}.${+l+1}.0-0`:p?`<=${c}.${l}.${f}-${p}`:t?`<${c}.${l}.${+f+1}-0`:`<=${s}`}`.trim(),R=(t,e,n)=>{for(let n=0;n<t.length;n++)if(!t[n].test(e))return!1;if(e.prerelease.length&&!n.includePrerelease){for(let n=0;n<t.length;n++)if(u(t[n].semver),t[n].semver!==a.ANY&&t[n].semver.prerelease.length>0){const r=t[n].semver;if(r.major===e.major&&r.minor===e.minor&&r.patch===e.patch)return!0}return!1}return!0}},8440:(t,e,n)=>{var r=n(6038),i=n(7301),o=n(6009),a=o&&o.isSet,u=a?i(a):r;t.exports=u},8586:(t,e,n)=>{var r=n(6449),i=n(4394),o=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,a=/^\\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!(\"number\"!=n&&\"symbol\"!=n&&\"boolean\"!=n&&null!=t&&!i(t))||a.test(t)||!o.test(t)||null!=e&&t in Object(e)}},8587:t=>{const e=Object.freeze({loose:!0}),n=Object.freeze({});t.exports=t=>t?\"object\"!=typeof t?e:t:n},8655:(t,e,n)=>{var r=n(6025);t.exports=function(t){return r(this.__data__,t)>-1}},8799:(t,e,n)=>{\"use strict\";function r(t){var e=this;if(e instanceof r||(e=new r),e.tail=null,e.head=null,e.length=0,t&&\"function\"==typeof t.forEach)t.forEach(function(t){e.push(t)});else if(arguments.length>0)for(var n=0,i=arguments.length;n<i;n++)e.push(arguments[n]);return e}function i(t,e,n){var r=e===t.head?new u(n,null,e,t):new u(n,e,e.next,t);return null===r.next&&(t.tail=r),null===r.prev&&(t.head=r),t.length++,r}function o(t,e){t.tail=new u(e,t.tail,null,t),t.head||(t.head=t.tail),t.length++}function a(t,e){t.head=new u(e,null,t.head,t),t.tail||(t.tail=t.head),t.length++}function u(t,e,n,r){if(!(this instanceof u))return new u(t,e,n,r);this.list=r,this.value=t,e?(e.next=this,this.prev=e):this.prev=null,n?(n.prev=this,this.next=n):this.next=null}t.exports=r,r.Node=u,r.create=r,r.prototype.removeNode=function(t){if(t.list!==this)throw new Error(\"removing node which does not belong to this list\");var e=t.next,n=t.prev;return e&&(e.prev=n),n&&(n.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=n),t.list.length--,t.next=null,t.prev=null,t.list=null,e},r.prototype.unshiftNode=function(t){if(t!==this.head){t.list&&t.list.removeNode(t);var e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}},r.prototype.pushNode=function(t){if(t!==this.tail){t.list&&t.list.removeNode(t);var e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}},r.prototype.push=function(){for(var t=0,e=arguments.length;t<e;t++)o(this,arguments[t]);return this.length},r.prototype.unshift=function(){for(var t=0,e=arguments.length;t<e;t++)a(this,arguments[t]);return this.length},r.prototype.pop=function(){if(this.tail){var t=this.tail.value;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,t}},r.prototype.shift=function(){if(this.head){var t=this.head.value;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,t}},r.prototype.forEach=function(t,e){e=e||this;for(var n=this.head,r=0;null!==n;r++)t.call(e,n.value,r,this),n=n.next},r.prototype.forEachReverse=function(t,e){e=e||this;for(var n=this.tail,r=this.length-1;null!==n;r--)t.call(e,n.value,r,this),n=n.prev},r.prototype.get=function(t){for(var e=0,n=this.head;null!==n&&e<t;e++)n=n.next;if(e===t&&null!==n)return n.value},r.prototype.getReverse=function(t){for(var e=0,n=this.tail;null!==n&&e<t;e++)n=n.prev;if(e===t&&null!==n)return n.value},r.prototype.map=function(t,e){e=e||this;for(var n=new r,i=this.head;null!==i;)n.push(t.call(e,i.value,this)),i=i.next;return n},r.prototype.mapReverse=function(t,e){e=e||this;for(var n=new r,i=this.tail;null!==i;)n.push(t.call(e,i.value,this)),i=i.prev;return n},r.prototype.reduce=function(t,e){var n,r=this.head;if(arguments.length>1)n=e;else{if(!this.head)throw new TypeError(\"Reduce of empty list with no initial value\");r=this.head.next,n=this.head.value}for(var i=0;null!==r;i++)n=t(n,r.value,i),r=r.next;return n},r.prototype.reduceReverse=function(t,e){var n,r=this.tail;if(arguments.length>1)n=e;else{if(!this.tail)throw new TypeError(\"Reduce of empty list with no initial value\");r=this.tail.prev,n=this.tail.value}for(var i=this.length-1;null!==r;i--)n=t(n,r.value,i),r=r.prev;return n},r.prototype.toArray=function(){for(var t=new Array(this.length),e=0,n=this.head;null!==n;e++)t[e]=n.value,n=n.next;return t},r.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,n=this.tail;null!==n;e++)t[e]=n.value,n=n.prev;return t},r.prototype.slice=function(t,e){(e=e||this.length)<0&&(e+=this.length),(t=t||0)<0&&(t+=this.length);var n=new r;if(e<t||e<0)return n;t<0&&(t=0),e>this.length&&(e=this.length);for(var i=0,o=this.head;null!==o&&i<t;i++)o=o.next;for(;null!==o&&i<e;i++,o=o.next)n.push(o.value);return n},r.prototype.sliceReverse=function(t,e){(e=e||this.length)<0&&(e+=this.length),(t=t||0)<0&&(t+=this.length);var n=new r;if(e<t||e<0)return n;t<0&&(t=0),e>this.length&&(e=this.length);for(var i=this.length,o=this.tail;null!==o&&i>e;i--)o=o.prev;for(;null!==o&&i>t;i--,o=o.prev)n.push(o.value);return n},r.prototype.splice=function(t,e,...n){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var r=0,o=this.head;null!==o&&r<t;r++)o=o.next;var a=[];for(r=0;o&&r<e;r++)a.push(o.value),o=this.removeNode(o);for(null===o&&(o=this.tail),o!==this.head&&o!==this.tail&&(o=o.prev),r=0;r<n.length;r++)o=i(this,o,n[r]);return a},r.prototype.reverse=function(){for(var t=this.head,e=this.tail,n=t;null!==n;n=n.prev){var r=n.prev;n.prev=n.next,n.next=r}return this.head=e,this.tail=t,this};try{n(259)(r)}catch(t){}},8816:(t,e,n)=>{var r=n(5970),i=n(6757),o=n(2865);t.exports=function(t){return o(i(t,void 0,r),t+\"\")}},8879:(t,e,n)=>{var r=n(4335)(Object.getPrototypeOf,Object);t.exports=r},8948:(t,e,n)=>{var r=n(1791),i=n(6375);t.exports=function(t,e){return r(t,i(t),e)}},8969:(t,e,n)=>{var r=n(7422),i=n(5160);t.exports=function(t,e){return e.length<2?t:r(t,i(e,0,-1))}},8984:(t,e,n)=>{var r=n(5527),i=n(3650),o=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return i(t);var e=[];for(var n in Object(t))o.call(t,n)&&\"constructor\"!=n&&e.push(n);return e}},9172:(t,e,n)=>{var r=n(5861),i=n(346);t.exports=function(t){return i(t)&&\"[object Map]\"==r(t)}},9325:(t,e,n)=>{var r=n(4840),i=\"object\"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function(\"return this\")();t.exports=o},9344:(t,e,n)=>{var r=n(3805),i=Object.create,o=function(){function t(){}return function(e){if(!r(e))return{};if(i)return i(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();t.exports=o},9350:t=>{var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},9570:(t,e,n)=>{var r=n(7334),i=n(3243),o=n(3488),a=i?function(t,e){return i(t,\"toString\",{configurable:!0,enumerable:!1,value:r(e),writable:!0})}:o;t.exports=a},9653:(t,e,n)=>{var r=n(7828);t.exports=function(t){var e=new t.constructor(t.byteLength);return new r(e).set(new r(t)),e}},9718:(t,e,n)=>{const{MAX_SAFE_COMPONENT_LENGTH:r,MAX_SAFE_BUILD_LENGTH:i,MAX_LENGTH:o}=n(6874),a=n(7272),u=(e=t.exports={}).re=[],s=e.safeRe=[],c=e.src=[],l=e.t={};let f=0;const p=\"[a-zA-Z0-9-]\",h=[[\"\\\\s\",1],[\"\\\\d\",o],[p,i]],d=(t,e,n)=>{const r=(t=>{for(const[e,n]of h)t=t.split(`${e}*`).join(`${e}{0,${n}}`).split(`${e}+`).join(`${e}{1,${n}}`);return t})(e),i=f++;a(t,i,e),l[t]=i,c[i]=e,u[i]=new RegExp(e,n?\"g\":void 0),s[i]=new RegExp(r,n?\"g\":void 0)};d(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\"),d(\"NUMERICIDENTIFIERLOOSE\",\"\\\\d+\"),d(\"NONNUMERICIDENTIFIER\",`\\\\d*[a-zA-Z-]${p}*`),d(\"MAINVERSION\",`(${c[l.NUMERICIDENTIFIER]})\\\\.(${c[l.NUMERICIDENTIFIER]})\\\\.(${c[l.NUMERICIDENTIFIER]})`),d(\"MAINVERSIONLOOSE\",`(${c[l.NUMERICIDENTIFIERLOOSE]})\\\\.(${c[l.NUMERICIDENTIFIERLOOSE]})\\\\.(${c[l.NUMERICIDENTIFIERLOOSE]})`),d(\"PRERELEASEIDENTIFIER\",`(?:${c[l.NUMERICIDENTIFIER]}|${c[l.NONNUMERICIDENTIFIER]})`),d(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${c[l.NUMERICIDENTIFIERLOOSE]}|${c[l.NONNUMERICIDENTIFIER]})`),d(\"PRERELEASE\",`(?:-(${c[l.PRERELEASEIDENTIFIER]}(?:\\\\.${c[l.PRERELEASEIDENTIFIER]})*))`),d(\"PRERELEASELOOSE\",`(?:-?(${c[l.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${c[l.PRERELEASEIDENTIFIERLOOSE]})*))`),d(\"BUILDIDENTIFIER\",`${p}+`),d(\"BUILD\",`(?:\\\\+(${c[l.BUILDIDENTIFIER]}(?:\\\\.${c[l.BUILDIDENTIFIER]})*))`),d(\"FULLPLAIN\",`v?${c[l.MAINVERSION]}${c[l.PRERELEASE]}?${c[l.BUILD]}?`),d(\"FULL\",`^${c[l.FULLPLAIN]}$`),d(\"LOOSEPLAIN\",`[v=\\\\s]*${c[l.MAINVERSIONLOOSE]}${c[l.PRERELEASELOOSE]}?${c[l.BUILD]}?`),d(\"LOOSE\",`^${c[l.LOOSEPLAIN]}$`),d(\"GTLT\",\"((?:<|>)?=?)\"),d(\"XRANGEIDENTIFIERLOOSE\",`${c[l.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`),d(\"XRANGEIDENTIFIER\",`${c[l.NUMERICIDENTIFIER]}|x|X|\\\\*`),d(\"XRANGEPLAIN\",`[v=\\\\s]*(${c[l.XRANGEIDENTIFIER]})(?:\\\\.(${c[l.XRANGEIDENTIFIER]})(?:\\\\.(${c[l.XRANGEIDENTIFIER]})(?:${c[l.PRERELEASE]})?${c[l.BUILD]}?)?)?`),d(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${c[l.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${c[l.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${c[l.XRANGEIDENTIFIERLOOSE]})(?:${c[l.PRERELEASELOOSE]})?${c[l.BUILD]}?)?)?`),d(\"XRANGE\",`^${c[l.GTLT]}\\\\s*${c[l.XRANGEPLAIN]}$`),d(\"XRANGELOOSE\",`^${c[l.GTLT]}\\\\s*${c[l.XRANGEPLAINLOOSE]}$`),d(\"COERCE\",`(^|[^\\\\d])(\\\\d{1,${r}})(?:\\\\.(\\\\d{1,${r}}))?(?:\\\\.(\\\\d{1,${r}}))?(?:$|[^\\\\d])`),d(\"COERCERTL\",c[l.COERCE],!0),d(\"LONETILDE\",\"(?:~>?)\"),d(\"TILDETRIM\",`(\\\\s*)${c[l.LONETILDE]}\\\\s+`,!0),e.tildeTrimReplace=\"$1~\",d(\"TILDE\",`^${c[l.LONETILDE]}${c[l.XRANGEPLAIN]}$`),d(\"TILDELOOSE\",`^${c[l.LONETILDE]}${c[l.XRANGEPLAINLOOSE]}$`),d(\"LONECARET\",\"(?:\\\\^)\"),d(\"CARETTRIM\",`(\\\\s*)${c[l.LONECARET]}\\\\s+`,!0),e.caretTrimReplace=\"$1^\",d(\"CARET\",`^${c[l.LONECARET]}${c[l.XRANGEPLAIN]}$`),d(\"CARETLOOSE\",`^${c[l.LONECARET]}${c[l.XRANGEPLAINLOOSE]}$`),d(\"COMPARATORLOOSE\",`^${c[l.GTLT]}\\\\s*(${c[l.LOOSEPLAIN]})$|^$`),d(\"COMPARATOR\",`^${c[l.GTLT]}\\\\s*(${c[l.FULLPLAIN]})$|^$`),d(\"COMPARATORTRIM\",`(\\\\s*)${c[l.GTLT]}\\\\s*(${c[l.LOOSEPLAIN]}|${c[l.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace=\"$1$2$3\",d(\"HYPHENRANGE\",`^\\\\s*(${c[l.XRANGEPLAIN]})\\\\s+-\\\\s+(${c[l.XRANGEPLAIN]})\\\\s*$`),d(\"HYPHENRANGELOOSE\",`^\\\\s*(${c[l.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${c[l.XRANGEPLAINLOOSE]})\\\\s*$`),d(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\"),d(\"GTE0\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\"),d(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\")},9749:(t,e,n)=>{\"use strict\";const r=n(8799),i=Symbol(\"max\"),o=Symbol(\"length\"),a=Symbol(\"lengthCalculator\"),u=Symbol(\"allowStale\"),s=Symbol(\"maxAge\"),c=Symbol(\"dispose\"),l=Symbol(\"noDisposeOnSet\"),f=Symbol(\"lruList\"),p=Symbol(\"cache\"),h=Symbol(\"updateAgeOnGet\"),d=()=>1,v=(t,e,n)=>{const r=t[p].get(e);if(r){const e=r.value;if(g(t,e)){if(y(t,r),!t[u])return}else n&&(t[h]&&(r.value.now=Date.now()),t[f].unshiftNode(r));return e.value}},g=(t,e)=>{if(!e||!e.maxAge&&!t[s])return!1;const n=Date.now()-e.now;return e.maxAge?n>e.maxAge:t[s]&&n>t[s]},m=t=>{if(t[o]>t[i])for(let e=t[f].tail;t[o]>t[i]&&null!==e;){const n=e.prev;y(t,e),e=n}},y=(t,e)=>{if(e){const n=e.value;t[c]&&t[c](n.key,n.value),t[o]-=n.length,t[p].delete(n.key),t[f].removeNode(e)}};class _{constructor(t,e,n,r,i){this.key=t,this.value=e,this.length=n,this.now=r,this.maxAge=i||0}}const b=(t,e,n,r)=>{let i=n.value;g(t,i)&&(y(t,n),t[u]||(i=void 0)),i&&e.call(r,i.value,i.key,t)};t.exports=class{constructor(t){if(\"number\"==typeof t&&(t={max:t}),t||(t={}),t.max&&(\"number\"!=typeof t.max||t.max<0))throw new TypeError(\"max must be a non-negative number\");this[i]=t.max||1/0;const e=t.length||d;if(this[a]=\"function\"!=typeof e?d:e,this[u]=t.stale||!1,t.maxAge&&\"number\"!=typeof t.maxAge)throw new TypeError(\"maxAge must be a number\");this[s]=t.maxAge||0,this[c]=t.dispose,this[l]=t.noDisposeOnSet||!1,this[h]=t.updateAgeOnGet||!1,this.reset()}set max(t){if(\"number\"!=typeof t||t<0)throw new TypeError(\"max must be a non-negative number\");this[i]=t||1/0,m(this)}get max(){return this[i]}set allowStale(t){this[u]=!!t}get allowStale(){return this[u]}set maxAge(t){if(\"number\"!=typeof t)throw new TypeError(\"maxAge must be a non-negative number\");this[s]=t,m(this)}get maxAge(){return this[s]}set lengthCalculator(t){\"function\"!=typeof t&&(t=d),t!==this[a]&&(this[a]=t,this[o]=0,this[f].forEach(t=>{t.length=this[a](t.value,t.key),this[o]+=t.length})),m(this)}get lengthCalculator(){return this[a]}get length(){return this[o]}get itemCount(){return this[f].length}rforEach(t,e){e=e||this;for(let n=this[f].tail;null!==n;){const r=n.prev;b(this,t,n,e),n=r}}forEach(t,e){e=e||this;for(let n=this[f].head;null!==n;){const r=n.next;b(this,t,n,e),n=r}}keys(){return this[f].toArray().map(t=>t.key)}values(){return this[f].toArray().map(t=>t.value)}reset(){this[c]&&this[f]&&this[f].length&&this[f].forEach(t=>this[c](t.key,t.value)),this[p]=new Map,this[f]=new r,this[o]=0}dump(){return this[f].map(t=>!g(this,t)&&{k:t.key,v:t.value,e:t.now+(t.maxAge||0)}).toArray().filter(t=>t)}dumpLru(){return this[f]}set(t,e,n){if((n=n||this[s])&&\"number\"!=typeof n)throw new TypeError(\"maxAge must be a number\");const r=n?Date.now():0,u=this[a](e,t);if(this[p].has(t)){if(u>this[i])return y(this,this[p].get(t)),!1;const a=this[p].get(t).value;return this[c]&&(this[l]||this[c](t,a.value)),a.now=r,a.maxAge=n,a.value=e,this[o]+=u-a.length,a.length=u,this.get(t),m(this),!0}const h=new _(t,e,u,r,n);return h.length>this[i]?(this[c]&&this[c](t,e),!1):(this[o]+=h.length,this[f].unshift(h),this[p].set(t,this[f].head),m(this),!0)}has(t){if(!this[p].has(t))return!1;const e=this[p].get(t).value;return!g(this,e)}get(t){return v(this,t,!0)}peek(t){return v(this,t,!1)}pop(){const t=this[f].tail;return t?(y(this,t),t.value):null}del(t){y(this,this[p].get(t))}load(t){this.reset();const e=Date.now();for(let n=t.length-1;n>=0;n--){const r=t[n],i=r.e||0;if(0===i)this.set(r.k,r.v);else{const t=i-e;t>0&&this.set(r.k,r.v,t)}}}prune(){this[p].forEach((t,e)=>v(this,e,!1))}}},9770:t=>{t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n<r;){var a=t[n];e(a,n,t)&&(o[i++]=a)}return o}},9817:t=>{t.exports=function(t){return this.__data__.has(t)}},9896:t=>{\"use strict\";t.exports=require(\"fs\")},9931:(t,e,n)=>{var r=n(1769),i=n(8090),o=n(8969),a=n(7797);t.exports=function(t,e){return e=r(e,t),null==(t=o(t,e))||delete t[a(i(e))]}},9935:t=>{t.exports=function(){return!1}},9999:(t,e,n)=>{var r=n(7217),i=n(3729),o=n(6547),a=n(4733),u=n(3838),s=n(3290),c=n(3007),l=n(2271),f=n(8948),p=n(2),h=n(3349),d=n(5861),v=n(6189),g=n(7199),m=n(5529),y=n(6449),_=n(3656),b=n(7730),x=n(3805),A=n(8440),w=n(5950),E=n(7241),j=\"[object Arguments]\",O=\"[object Function]\",I=\"[object Object]\",$={};$[j]=$[\"[object Array]\"]=$[\"[object ArrayBuffer]\"]=$[\"[object DataView]\"]=$[\"[object Boolean]\"]=$[\"[object Date]\"]=$[\"[object Float32Array]\"]=$[\"[object Float64Array]\"]=$[\"[object Int8Array]\"]=$[\"[object Int16Array]\"]=$[\"[object Int32Array]\"]=$[\"[object Map]\"]=$[\"[object Number]\"]=$[I]=$[\"[object RegExp]\"]=$[\"[object Set]\"]=$[\"[object String]\"]=$[\"[object Symbol]\"]=$[\"[object Uint8Array]\"]=$[\"[object Uint8ClampedArray]\"]=$[\"[object Uint16Array]\"]=$[\"[object Uint32Array]\"]=!0,$[\"[object Error]\"]=$[O]=$[\"[object WeakMap]\"]=!1,t.exports=function t(e,n,k,R,L,N){var z,S=1&n,T=2&n,C=4&n;if(k&&(z=L?k(e,R,L,N):k(e)),void 0!==z)return z;if(!x(e))return e;var B=y(e);if(B){if(z=v(e),!S)return c(e,z)}else{var M=d(e),P=M==O||\"[object GeneratorFunction]\"==M;if(_(e))return s(e,S);if(M==I||M==j||P&&!L){if(z=T||P?{}:m(e),!S)return T?f(e,u(z,e)):l(e,a(z,e))}else{if(!$[M])return L?e:{};z=g(e,M,S)}}N||(N=new r);var F=N.get(e);if(F)return F;N.set(e,z),A(e)?e.forEach(function(r){z.add(t(r,n,k,r,e,N))}):b(e)&&e.forEach(function(r,i){z.set(i,t(r,n,k,i,e,N))});var D=B?void 0:(C?T?h:p:T?E:w)(e);return i(D||e,function(r,i){D&&(r=e[i=r]),o(z,i,t(r,n,k,i,e,N))}),z}}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var o=e[r]={id:r,loaded:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),(()=>{\"use strict\";var t=n(6170),e=n.n(t),r=n(7638),i=n.n(r);const o=JSON.parse('{\"rE\":\"2.1.2\",\"Ug\":{\"title\":\"AzureLib Animator\",\"author\":\"AzureDoom\",\"icon\":\"azureicon.png\",\"description\":\"Create models, textures, and animations for AzureLib-powered mods using Bedrock-style tools.\",\"min_version\":\"4.8.0\",\"max_version\":\"15.0.0\",\"new_repository_format\":\"true\",\"await_loading\":true,\"variant\":\"both\",\"creation_date\":\"2023-04-04\",\"contributes\":{\"formats\":[\"azure_model\"]},\"has_changelog\":true,\"website\":\"https://wiki.azuredoom.com/\",\"tags\":[\"Minecraft: Java Edition\"]}}');var a=n(2543);const u=\"linear\";function s(t){return t?.includes(\"Back\")||t?.includes(\"Elastic\")||t?.includes(\"Bounce\")||\"step\"===t}function c(t){return s(t)?t?.includes(\"Back\")?1.70158:t?.includes(\"Elastic\")||t?.includes(\"Bounce\")?1:\"step\"===t?4:1:1}function l(t,e){const n=parseFloat(e);return isNaN(n)?c(t.easing):Math.max(-9999,Math.min(9999,n))}const f=Math.PI,p=1.70158,h=1.525*p,d=p+1,v=2*f/3,g=2*f/4.5,m=t=>{const e=7.5625,n=2.75;return t<1/n?e*t*t:t<2/n?e*(t-=1.5/n)*t+.75:t<2.5/n?e*(t-=2.25/n)*t+.9375:e*(t-=2.625/n)*t+.984375},y={linear:t=>t,step:(t,e=4)=>Math.floor((0,a.clamp)(t*e,0,e-1))/(e-1),easeInSine:t=>1-Math.cos(t*f/2),easeOutSine:t=>Math.sin(t*f/2),easeInOutSine:t=>-(Math.cos(f*t)-1)/2,easeInQuad:t=>t*t,easeOutQuad:t=>1-(1-t)*(1-t),easeInOutQuad:t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,easeInCubic:t=>t*t*t,easeOutCubic:t=>1-Math.pow(1-t,3),easeInOutCubic:t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,easeInQuart:t=>t*t*t*t,easeOutQuart:t=>1-Math.pow(1-t,4),easeInOutQuart:t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>1-Math.pow(1-t,5),easeInOutQuint:t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,easeInExpo:t=>0===t?0:Math.pow(2,10*t-10),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>0===t?0:1===t?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,easeInCirc:t=>1-Math.sqrt(1-Math.pow(t,2)),easeOutCirc:t=>Math.sqrt(1-Math.pow(t-1,2)),easeInOutCirc:t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,easeInBack:(t,e=p)=>d*t*t*t-e*t*t,easeOutBack:(t,e=p)=>1+d*Math.pow(t-1,3)+e*Math.pow(t-1,2),easeInOutBack:(t,e=p)=>t<.5?Math.pow(2*t,2)*(7.189819*t-h)/2:(Math.pow(2*t-2,2)*((h+1)*(2*t-2)+h)+2)/2,easeInElastic:(t,e=1)=>0===t?0:1===t?1:-Math.pow(2,10*t-10)*Math.sin((10*t-10.75)*v*e),easeOutElastic:(t,e=1)=>0===t?0:1===t?1:Math.pow(2,-10*t)*Math.sin((10*t-.75)*v*e)+1,easeInOutElastic:(t,e=1)=>0===t?0:1===t?1:t<.5?-Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*g*e)/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*g*e)/2+1,easeInBounce:t=>1-m(1-t),easeOutBounce:m,easeInOutBounce:t=>t<.5?(1-m(1-2*t))/2:(1+m(2*t-1))/2};let _=!1;function b(){_||(Blockbench.on(\"display_animation_frame\",N),Blockbench.on(\"update_keyframe_selection\",w),window._azureApplyEasing=I,window._azureApplyEasingArg=k,window._azureToggleCatmullrom=L,window._azureSetInterpolation=R,function(){if(!BarItems.keyframe_interpolation)return;const t=BarItems.keyframe_interpolation.condition;BarItems.keyframe_interpolation.condition=function(...e){return\"azure_model\"!==Format?.id&&(\"function\"!=typeof t||t.apply(this,e))}}(),_=!0,console.log(\"[AzureLib] Animation UI initialised\"))}function x(){_&&(Blockbench.removeListener(\"display_animation_frame\",N),Blockbench.removeListener(\"update_keyframe_selection\",w),delete window._azureApplyEasing,delete window._azureApplyEasingArg,delete window._azureToggleCatmullrom,S(),_=!1)}const A=[\"azl_bar_catmullrom\",\"azl_bar_easing\",\"azl_bar_easing_azure\",\"azl_bar_easing_type\",\"azl_bar_easing_arg\"];function w(){if(S(),\"azure_model\"!==Format?.id)return;const t=document.querySelector(\"#keyframe_type_label > div\");t&&(t.hidden=!0);const e=Timeline.selected;if(!e||!e.length)return;const n=function(t){const e=new Map;for(const n of t){e.has(n.animator)||e.set(n.animator,{});const t=e.get(n.animator);t[n.channel]||(t[n.channel]=[]),t[n.channel].push(n),t[n.channel].sort((t,e)=>t.time-e.time)}return e}(Timeline.keyframes);if(!e.every(t=>t.animator instanceof BoneAnimator&&!(t=>(n.get(t.animator)?.[t.channel]||[]).indexOf(t)<1)(t)))return;const r=document.getElementById(\"panel_keyframe\");r&&(function(t,e){const n=T(e,t=>{const e=t.interpolation;return e&&\"linear\"!==e?e:null},null,\"(mixed)\"),r=z(\"azl_bar_catmullrom\",t),i=document.createElement(\"p\");i.style.cssText=\"min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);\",i.textContent=\"Interpolation\",r.appendChild(i);for(const{id:t,label:e,title:i}of E){const o=n===t,a=document.createElement(\"button\");a.id=\"azl_btn_interp_\"+(t??\"azure\"),a.className=\"dark_bordered\",a.textContent=e,a.title=i,a.style.cssText=\"padding:2px 10px;margin:1px;cursor:pointer;\"+(o?\"color:var(--color-accent);border-color:var(--color-accent);\":\"\"),a.onclick=()=>window._azureSetInterpolation(t),r.appendChild(a)}}(r,e),function(t,e){const n=e.every(t=>!!t.interpolation&&\"linear\"!==t.interpolation),r=T(e,t=>t.easing,u,\"(mixed)\"),i=function(t){if(!t||\"linear\"===t)return\"linear\";if(\"step\"===t)return\"step\";const e=String(t).match(/^ease(?:InOut|In|Out)([\\w]+)$/i);return e?e[1].toLowerCase():t.toLowerCase()}(r),o=function(t){const e=String(t).match(/^ease(InOut|In|Out)/i);if(!e)return\"in\";const n=e[1].toLowerCase();return\"inout\"===n?\"inout\":n}(r),a=z(\"azl_bar_easing\",t),l=document.createElement(\"p\");l.style.cssText=\"min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);\",l.textContent=\"AzureLib Easings\",a.appendChild(l);const f=z(\"azl_bar_easing_azure\",t);f.style.flexWrap=\"wrap\";for(const{id:t,label:e}of j){const r=!n&&t===i,a=B[t]||\"\",u=document.createElement(\"button\");u.id=`azl_kf_easing_${t}`,u.className=\"dark_bordered\",u.title=`Switch to ${e} easing`,u.style.cssText=`\\n      padding: 2px 6px;\\n      margin: 1px;\\n      cursor: pointer;\\n      display: inline-flex;\\n      align-items: center;\\n      gap: 3px;\\n      ${r?\"color:var(--color-accent);border-color:var(--color-accent);\":\"\"}\\n    `,u.innerHTML=`${a}<span>${e}</span>`,u.onclick=()=>{I(C(t,o))},f.appendChild(u)}if(!n&&\"linear\"!==i&&\"step\"!==i){const e=z(\"azl_bar_easing_type\",t),n=document.createElement(\"p\");n.style.cssText=\"min-width:100%;margin:4px 0 2px 0;padding:0;color:var(--color-text);\",n.textContent=\"Type\",e.appendChild(n);for(const{id:t,label:n}of O){const r=t===o,a=document.createElement(\"button\");a.id=`azl_kf_type_${t}`,a.className=\"dark_bordered\",a.textContent=n,a.style.cssText=`\\n        padding: 2px 10px;\\n        margin: 1px;\\n        cursor: pointer;\\n        ${r?\"color:var(--color-accent);border-color:var(--color-accent);\":\"\"}\\n      `,a.onclick=()=>{I(C(i,t))},e.appendChild(a)}}if(e.every(t=>s(t.easing))){const n=(p=e[0].easing)?p.includes(\"Back\")?\"Overshoot\":p.includes(\"Elastic\")||p.includes(\"Bounce\")?\"Bounciness\":\"step\"===p?\"Steps\":\"Arg\":\"Arg\",r=c(e[0].easing),i=T(e,t=>Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs[0]:r,r,r);z(\"azl_bar_easing_arg\",t).innerHTML=`\\n      <p style=\"margin:4px 0 2px 0;padding:0;color:var(--color-text);min-width:90px;\">${n}</p>\\n      <input\\n        type=\"number\"\\n        id=\"azl_easing_arg_input\"\\n        class=\"dark_bordered code keyframe_input tab_target\"\\n        value=\"${i}\"\\n        oninput=\"window._azureApplyEasingArg(this)\"\\n        style=\"flex:1;margin-right:9px;\">`}var p}(r,e))}const E=[{id:null,label:\"Azure Easing\",title:\"Use AzureLib custom easing (see section below)\"},{id:\"catmullrom\",label:\"Smooth\",title:\"Bedrock catmullrom spline (BB: Smooth)\"},{id:\"bezier\",label:\"Bezier\",title:\"Bezier curve interpolation (BB: Bezier)\"},{id:\"step\",label:\"Step\",title:\"Discrete step / hold (BB: Step)\"}],j=[{id:\"linear\",label:\"Linear\"},{id:\"step\",label:\"Step\"},{id:\"sine\",label:\"Sine\"},{id:\"quad\",label:\"Quad\"},{id:\"cubic\",label:\"Cubic\"},{id:\"quart\",label:\"Quart\"},{id:\"quint\",label:\"Quint\"},{id:\"expo\",label:\"Expo\"},{id:\"circ\",label:\"Circ\"},{id:\"back\",label:\"Back\"},{id:\"elastic\",label:\"Elastic\"},{id:\"bounce\",label:\"Bounce\"}],O=[{id:\"in\",label:\"In\"},{id:\"out\",label:\"Out\"},{id:\"inout\",label:\"In/Out\"}];function I(t){t&&\"-\"!==t&&(Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(e=>{e.easing=t,e.interpolation&&\"linear\"!==e.interpolation&&(e.interpolation=\"linear\")}),Undo.finishEdit(\"Set keyframe easing\"),w())}function k(t){const e=$(t).val();\"\"!==e&&\"-\"!==e&&(Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(t=>{t.easingArgs=[l(t,String(e).trim())]}),Undo.finishEdit(\"Set keyframe easing argument\"))}function R(t){Undo.initEdit({keyframes:Timeline.selected}),Timeline.selected.forEach(e=>{null==t?e.interpolation=\"linear\":(e.interpolation=t,e.easing=u,e.easingArgs=void 0)}),Undo.finishEdit(\"Set keyframe interpolation\"),w()}function L(t){R(!1===t?null:\"catmullrom\")}function N(){}function z(t,e){const n=document.createElement(\"div\");return n.id=t,n.className=\"bar flex\",n.style.flexWrap=\"wrap\",n.style.alignItems=\"center\",n.style.gap=\"2px\",n.style.marginTop=\"4px\",e.appendChild(n),n}function S(){A.forEach(t=>document.getElementById(t)?.remove());const t=document.querySelector(\"#keyframe_type_label > div\");t&&(t.hidden=!1)}function T(t,e,n,r){const i=\"function\"==typeof e?e:t=>t[e];if(0===t.length)return n;if(1===t.length)return i(t[0])??n;const o=(0,a.uniq)(t.map(i));return 1===o.length?o[0]:r}function C(t,e){return\"linear\"===t?\"linear\":\"step\"===t?\"step\":`ease${\"inout\"===e?\"InOut\":\"out\"===e?\"Out\":\"In\"}${t.charAt(0).toUpperCase()}${t.slice(1)}`}const B={linear:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',step:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 0,-1.32 H 1.85 v -1.32 H 3.17 v -1.33 h 1.32 v -1.32 l 1.33,1e-5\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',sine:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 1.85,5.82 4.76,2.38 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',quad:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 3.17,5.82 4.76,3.04 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',cubic:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 3.17,5.82 4.76,3.82 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',quart:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 3.17,0 4.23,-2.64 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',quint:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 3.44,0 4.23,-1.85 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',expo:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 4.23,0 5.29,-1.06 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',circ:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 5.82,4.97 5.82,3.17 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',back:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.29 c 3.17,0 4.23,2.91 5.29,-4.76\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',elastic:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.15 c 0.79,0 0.79,-0.26 1.32,-0.26 0.53,0 0.79,0.53 1.32,0.53 0.53,0 1.01,-1.84 1.32,-0.79 0.79,2.64 1.32,1.32 1.32,-3.97\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',bounce:'<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 0.26,-0.26 0.53,-0.26 0.79,0 0.53,-0.53 0.53,-0.53 1.06,0 0.79,-2.12 1.59,-2.12 2.38,0 0.26,-4.23 1.06,-5.29 1.06,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>'},M=new Map,P=t=>t?.includes(\"Back\")||t?.includes(\"Elastic\")||t?.includes(\"Bounce\")||\"step\"===t;function F(t){const e=[\"(\",\"[\",\"{\"],n=[\")\",\"]\",\"}\"];if(\"number\"==typeof t)return-t;if(\"\"===t||\"0\"===t)return t;if(!isNaN(parseFloat(t))&&isFinite(t))return(-parseFloat(t)).toString();let r,i=!0,o=0,a=\"\";for(let u of t){if(!o){let t;if(\"-\"===u&&\"*\"!==r&&\"/\"!==r){i||r||(a+=\"+\"),i=!1;continue}if(\"+\"===u&&\"*\"!==r&&\"/\"!==r){a+=\"-\",i=!1;continue}\"?:\".includes(u)?(i=!0,t=u):i?(a+=\"-\",i=!1):\"+-*/&|\".includes(u)&&(t=u),r=t||r}e.includes(u)&&o++,n.includes(u)&&o--,a+=u}return a}let D=null,U=null,G=!1;function W(){G||(function(){if(!D){D={getLerp:Keyframe.prototype.getLerp,compileBedrockKeyframe:Keyframe.prototype.compileBedrockKeyframe,getUndoCopy:Keyframe.prototype.getUndoCopy,extend:Keyframe.prototype.extend};try{U=BarItems.reverse_keyframes?.condition||null}catch{U=null}}}(),Keyframe.prototype._azurePatched||(Keyframe.prototype.getLerp=q,Keyframe.prototype.compileBedrockKeyframe=V,Keyframe.prototype.getUndoCopy=H,Keyframe.prototype.extend=J,Keyframe.prototype._azurePatched=!0),BarItems.reverse_keyframes&&!BarItems.reverse_keyframes._azurePatched&&(U||(U=BarItems.reverse_keyframes.condition),BarItems.reverse_keyframes.condition=Z,BarItems.reverse_keyframes._azurePatched=!0),Blockbench.on(\"interpolate_keyframes\",X),G=!0)}function K(){if(G&&D)try{Keyframe.prototype._azurePatched&&(Keyframe.prototype.getLerp=D.getLerp,Keyframe.prototype.compileBedrockKeyframe=D.compileBedrockKeyframe,Keyframe.prototype.getUndoCopy=D.getUndoCopy,Keyframe.prototype.extend=D.extend,delete Keyframe.prototype._azurePatched),BarItems.reverse_keyframes?._azurePatched&&U&&(BarItems.reverse_keyframes.condition=U,delete BarItems.reverse_keyframes._azurePatched);try{Blockbench.removeListener(\"interpolate_keyframes\",X)}catch{}}finally{G=!1}}function X(t){if(\"azure_model\"!==Format?.id)return;const e=t&&t.keyframe_before,n=t&&t.keyframe_after;if(!e||!n)return;const r=t=>!t||\"linear\"===t;if(!r(e.interpolation)||!r(n.interpolation))return;if(e.has_expressions||n.has_expressions)return;const i=n.easing||u,o=y[i]||y.linear;let a;if(P(i)){const e=Array.isArray(n.easingArgs)&&n.easingArgs.length?n.easingArgs[0]:c(i);a=o(t.t,e)}else a=o(t.t);if(\"number\"!=typeof a||Number.isNaN(a))return;const s=e.data_points.length>1?1:0;return{value:[\"x\",\"y\",\"z\"].map(t=>{const r=e.calc(t,s);return r+(n.calc(t,0)-r)*a})}}function q(t,e,n){if(\"azure_model\"!==Format?.id)return D.getLerp.apply(this,arguments);if(\"catmullrom\"===t.interpolation||\"bezier\"===t.interpolation||\"step\"===t.interpolation)return D.getLerp.apply(this,arguments);const r=t.easing||u;if(!(r!==u||t.easingArgs&&t.easingArgs.length))return D.getLerp.apply(this,arguments);let i=y[r]||y.linear;if(P(r)){const e=Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs[0]:c(r);i=i.bind(null,e)}const o=i(n),a=function(t,e,n){return t+(e-t)*n}(this.calc(e),t.calc(e),o);if(Number.isNaN(a))throw new Error(\"[AzureLib] Invalid easing result\");return a}function V(){if(\"azure_model\"!==Format?.id)return D.compileBedrockKeyframe.apply(this,arguments);const t=D.compileBedrockKeyframe.apply(this,arguments),e=t=>Array.isArray(t)?[...t]:t;if(\"catmullrom\"===this.interpolation){const n=\"catmullrom\";return t&&\"object\"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},post:e(t.post||t),lerp_mode:n}:{post:e(t),lerp_mode:n}}if(\"bezier\"===this.interpolation)return t&&\"object\"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{}}:t;const n=this.getPreviousKeyframe?.();if(1===this.data_points.length&&n&&\"step\"===n.interpolation)return t&&\"object\"==typeof t?{...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{}}:t;if(t&&\"object\"==typeof t&&!Array.isArray(t)&&(void 0!==t.pre||void 0!==t.post)){const n={...void 0!==t.pre?{pre:e(t.pre)}:{},...void 0!==t.post?{post:e(t.post)}:{},...void 0!==t.lerp_mode?{lerp_mode:t.lerp_mode}:{}};return this.easing&&this.easing!==u&&(n.easing=this.easing),P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(n.easingArgs=[...this.easingArgs]),n}return(t=>{if(t&&\"object\"==typeof t&&!Array.isArray(t)){const e={...t};return void 0===e.easing&&void 0!==this.easing&&(e.easing=this.easing),void 0===e.easingArgs&&P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(e.easingArgs=[...this.easingArgs]),e}const n={vector:e(t)};return this.easing&&this.easing!==u&&(n.easing=this.easing),P(this.easing)&&Array.isArray(this.easingArgs)&&this.easingArgs.length&&(n.easingArgs=[...this.easingArgs]),n.easing||n.easingArgs?n:n.vector})(t)}function H(){const t=D.getUndoCopy.apply(this,arguments);return\"azure_model\"===Format?.id&&(t.easing=this.easing,t.interpolation=this.interpolation,P(this.easing)&&(t.easingArgs=this.easingArgs?[...this.easingArgs]:void 0)),t}function J(t){const e=Object.assign({},t);if(\"azure_model\"!==Format?.id)return D.extend.apply(this,[e]);const n=(t,e=[0,0,0])=>Array.isArray(t)?[void 0!==t[0]?t[0]:e[0],void 0!==t[1]?t[1]:e[1],void 0!==t[2]?t[2]:e[2]]:[...e],r=t=>{if(Array.isArray(t))return{vector:n(t)};if(t&&\"object\"==typeof t){const e={};if(void 0!==t.easing&&(e.easing=t.easing),void 0!==t.interpolation&&(e.interpolation=t.interpolation),Array.isArray(t.easingArgs)&&(e.easingArgs=[...t.easingArgs]),Array.isArray(t.vector))return e.vector=n(t.vector),e;if(\"x\"in t&&\"y\"in t&&\"z\"in t)return e.vector=n([t.x,t.y,t.z]),e}return{vector:null}},i=r(e.values),o=r(e.pre),a=r(e.post),u=i.easing??e.easing??a.easing;void 0!==u&&(this.easing=u);const s=new Set([\"catmullrom\",\"bezier\",\"step\"]);let c=e.interpolation??a.interpolation;void 0!==e.lerp_mode&&\"linear\"!==e.lerp_mode&&(c=e.lerp_mode),void 0!==c&&s.has(c)?this.interpolation=c:this.interpolation=\"linear\";const l=i.easingArgs??e.easingArgs??a.easingArgs;void 0!==l&&(this.easingArgs=[...l]);const f=Object.assign({},e);[\"values\",\"pre\",\"post\"].forEach(t=>{f[t]&&\"object\"==typeof f[t]&&!Array.isArray(f[t])&&delete f[t]});const p=D.extend.apply(this,[f]),h=t=>(Array.isArray(this.data_points)||(this.data_points=[]),this.data_points[t]||(this.data_points[t]={}),this.data_points[t]),d=t=>{if(\"string\"!=typeof t)return t;const e=Number(t);return isNaN(e)?t:e},v=(t,e)=>{e&&(t.x=d(e[0]),t.y=d(e[1]),t.z=d(e[2]),delete t.vector)};return o.vector&&a.vector?(v(h(0),o.vector),v(h(1),a.vector)):o.vector?v(h(0),o.vector):!o.vector&&a.vector&&\"catmullrom\"===this.interpolation?v(h(0),a.vector):i.vector?v(h(0),i.vector):a.vector&&v(h(0),a.vector),p}function Z(){if(Z._inAzureCall)return!1;try{return Z._inAzureCall=!0,U&&\"function\"==typeof U?U.call(BarItems.reverse_keyframes)&&\"azure_model\"!==Format?.id:!1}finally{Z._inAzureCall=!1}}const Q=JSON.parse('{\"meta\":{\"format_version\":\"3.2\",\"model_format\":\"azure_model\",\"box_uv\":true},\"name\":\"CustomArmor\",\"geo_name\":\"CustomArmor\",\"resolution\":{\"width\":64,\"height\":64},\"elements\":[{\"name\":\"dontTouch\",\"from\":[-4,24,-4],\"to\":[4,32,4],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,0,0],\"uuid\":\"9675593e-b27d-b70e-e1ea-1fc29f46a294\"},{\"name\":\"dontTouch\",\"from\":[-4,12,-2],\"to\":[4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,24,0],\"uuid\":\"fa43156a-2a62-948c-082f-483d525f6d1f\"},{\"name\":\"dontTouch\",\"from\":[4,12,-2],\"to\":[8,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"},{\"name\":\"dontTouch\",\"from\":[-8,12,-2],\"to\":[-4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"bf2c2539-20e3-cfcc-94c0-491734019889\"},{\"name\":\"dontTouch\",\"from\":[-4,0,-2],\"to\":[0,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"17b9bae0-356a-9bba-fad9-4672e2671191\"},{\"name\":\"dontTouch\",\"from\":[0,0,-2],\"to\":[4,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"},{\"name\":\"dontTouch\",\"from\":[-4,12,-2],\"to\":[4,16,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,12,0],\"uuid\":\"aa51250c-8b32-fb62-71f1-58ac0b7785a8\"}],\"outliner\":[{\"name\":\"bipedHead\",\"uuid\":\"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"9675593e-b27d-b70e-e1ea-1fc29f46a294\",{\"name\":\"armorHead\",\"uuid\":\"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedBody\",\"uuid\":\"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"fa43156a-2a62-948c-082f-483d525f6d1f\",{\"name\":\"armorBody\",\"uuid\":\"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedRightArm\",\"uuid\":\"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",{\"name\":\"armorRightArm\",\"uuid\":\"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[]}]},{\"name\":\"bipedLeftArm\",\"uuid\":\"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[\"bf2c2539-20e3-cfcc-94c0-491734019889\",{\"name\":\"armorLeftArm\",\"uuid\":\"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[]}]},{\"name\":\"bipedWaist\",\"uuid\":\"d8125cc7-7e10-0930-259e-b8e4211ce9da\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,12,0],\"children\":[\"aa51250c-8b32-fb62-71f1-58ac0b7785a8\",{\"name\":\"armorWaist\",\"uuid\":\"c9000e23-fd2f-b56c-3552-45d6650e11c6\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,12,0],\"children\":[]}]},{\"name\":\"bipedLeftLeg\",\"uuid\":\"37231be7-a8ef-22ca-7fea-40aed58003bb\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[\"17b9bae0-356a-9bba-fad9-4672e2671191\",{\"name\":\"armorLeftLeg\",\"uuid\":\"e4b19746-2d17-1f56-befe-00718165ae50\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]},{\"name\":\"armorLeftBoot\",\"uuid\":\"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]}]},{\"name\":\"bipedRightLeg\",\"uuid\":\"45c031a5-b6be-e0a7-5454-b45d07f28429\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",{\"name\":\"armorRightLeg\",\"uuid\":\"60238f18-e74b-c863-cb45-2e2f162221bd\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]},{\"name\":\"armorRightBoot\",\"uuid\":\"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]}]}],\"textures\":[]}'),Y=\"Forge 1.12 - 1.16\";var tt;tt=[Y,\"Fabric 1.15 - 1.16\"],Object.fromEntries(tt.map(t=>[t,t]));const et=\"AZURE_ENTITY\",nt=\"AZURE_ARMOR\",rt={[et]:\"Entity/Block/Item\",[nt]:\"Armor\"},it=Object.freeze({formatVersion:2,modSDK:Y,objectType:et,entityType:\"Entity/Block/Item\",javaPackage:\"com.example.mod\",animFileNamespace:\"modid\",animFilePath:\"animations/animation.json\"}),ot=Object.assign({},it);function at(){Modes.selected.select(),ot.objectType===nt?0===Outliner.root.length?(Codecs.project.parse(Q),console.log(\"[AzureLib] Loaded armor template.\")):alert(\"Cannot apply Armor Template — please select Armor type in an empty project.\"):ot.objectType===et&&(Project.parent=\"builtin/entity\")}const ut=ot;var st=n(179),ct=n.n(st);const lt=\"azure_animation\",ft=\"1.8.0\",pt=new Map;function ht(t){return!(!t||\"object\"!=typeof t||Array.isArray(t)||void 0===t.lerp_mode&&void 0===t.pre&&void 0===t.post)}function dt(t){if(Array.isArray(t))return t;if(t&&\"object\"==typeof t){if(Array.isArray(t.vector))return t.vector;if(t.vector&&\"object\"==typeof t.vector&&Array.isArray(t.vector.vector))return t.vector.vector}return null}function vt(t){return String(t).replace(/^(-?\\d+)\\.0+$/,\"$1\")}function gt(t){return Array.isArray(t)&&t.length?t.filter(t=>t&&\"object\"==typeof t).map(t=>({file_id:String(t.file_id||\"\").trim(),animations:Array.isArray(t.animations)?t.animations.map(t=>String(t||\"\").trim()).filter(Boolean):[]})).filter(t=>t.file_id&&t.animations.length):[]}function mt(t){return gt(t).map(t=>({file_id:t.file_id,animations:[...t.animations]}))}function yt(t){return mt(pt.get(t||\"\")||[])}function _t(t,e){const n=t||\"\",r=gt(e);r.length?pt.set(n,r):pt.delete(n)}function bt(t,e){const n=mt(e);return n.length?t.includes=n:delete t.includes,t}function xt(t){const e={};\"loop\"===t.loop?e.loop=!0:\"hold\"===t.loop?e.loop=\"hold_on_last_frame\":t.loop&&(e.loop=t.loop),t.override&&(e.override_previous_animation=!0),t.anim_time_update&&(e.anim_time_update=t.anim_time_update.replace(/;\\n/g,\";\")),t.blend_weight&&(e.blend_weight=t.blend_weight.replace(/;\\n/g,\";\")),t.length&&(e.animation_length=Math.round(1e6*t.length)/1e6);const n={},r=t.animators.effects,i=Object.values(t.animators).filter(t=>t instanceof BoneAnimator);for(const t of i){const e=t.name,r={};for(const e of[\"position\",\"rotation\",\"scale\"]){const n=t.keyframes.filter(t=>t.channel===e);if(n.length)if(n.sort((t,e)=>t.time-e.time),1===n.length){const t=n[0],i={vector:jt(t,e,!0)},o=t.easing;o&&o!==u&&(i.easing=o),s(o)&&Array.isArray(t.easingArgs)&&t.easingArgs.length&&(i.easingArgs=[...t.easingArgs]),r[e]=i}else{const t={};for(const r of n)t[vt($t(r.time))]=At(r,e,n);r[e]=t}}Object.keys(r).length&&(n[e]=r)}if(Object.keys(n).length&&(e.bones=n),r&&Array.isArray(r.keyframes)&&r.keyframes.length){const t={},n={},i={};for(const e of r.keyframes){const r=vt($t(e.time));if(\"sound\"===e.channel){const n=(e.data_points||[]).map(t=>\"string\"==typeof t?{effect:t}:{...t}).filter(t=>t.effect);1===n.length?t[r]=n[0]:n.length>1&&(t[r]=n)}else if(\"particle\"===e.channel){const t=(e.data_points||[]).map(t=>{const e={};return t.effect&&(e.effect=t.effect),void 0!==t.locator&&(e.locator=t.locator),void 0!==t.script&&(e.script=t.script),Object.keys(e).length?e:null}).filter(Boolean);1===t.length?n[r]=t[0]:t.length>1&&(n[r]=t)}else if(\"timeline\"===e.channel){const t=e.data_points?.[0]?.script||\"\";t&&(i[r]=t)}}Object.keys(t).length&&(e.sound_effects=t),Object.keys(n).length&&(e.particle_effects=n),Object.keys(i).length&&(e.timeline=i)}return e}function At(t,e,n){const r=jt(t,e,!0),i=t.interpolation;if(\"catmullrom\"===i){const n={post:r,lerp_mode:\"catmullrom\"},i=Ot(t,e);return i&&(n.pre=i),n}if(\"bezier\"===i){const n=Ot(t,e);return n?{pre:n,post:r}:{post:r}}if(\"step\"===i){const i=It(t,n),o=Ot(t,e)||(i?jt(i,e,!0):null);return o?{pre:o,post:r}:{post:r}}const o=It(t,n);if(o&&\"step\"===o.interpolation){const n={pre:Ot(t,e)||jt(o,e,!0),post:r};return t.easing&&t.easing!==u&&(n.easing=t.easing),s(t.easing)&&Array.isArray(t.easingArgs)&&t.easingArgs.length&&(n.easingArgs=[...t.easingArgs]),n}const a=t.easing,c=r.some(t=>\"string\"==typeof t&&isNaN(Number(t))),l=a&&a!==u&&!c,f=l&&s(a)&&Array.isArray(t.easingArgs)&&t.easingArgs.length,p={vector:r};return l&&(p.easing=a),f&&(p.easingArgs=[...t.easingArgs]),p}function wt(t){return\"string\"==typeof(t=Et(t))?F(t):\"number\"==typeof t?0===t?0:-t:t}function Et(t){if(null==t)return 0;if(\"string\"==typeof t){const e=t.trim();if(\"\"===e)return 0;const n=Number(e);return Number.isNaN(n)?t:n}return t}function jt(t,e,n){const r=t.data_points?.[t.data_points.length>1?1:0]||t.data_points?.[0];if(!r)return[0,0,0];let i=Et(r.x),o=Et(r.y),a=Et(r.z);return n&&Blockbench.isNewerThan(\"4.99\")&&(\"rotation\"===e?(i=wt(i),o=wt(o)):\"position\"===e&&(i=wt(i))),[kt(i),kt(o),kt(a)]}function Ot(t,e){if(!t.data_points||t.data_points.length<2)return null;const n=t.data_points[0];let r=Et(n.x),i=Et(n.y),o=Et(n.z);return Blockbench.isNewerThan(\"4.99\")&&(\"rotation\"===e?(r=wt(r),i=wt(i)):\"position\"===e&&(r=wt(r))),[kt(r),kt(i),kt(o)]}function It(t,e){const n=e.indexOf(t);return n>0?e[n-1]:null}function $t(t){return Math.round(1e6*t)/1e6}function kt(t){return\"number\"==typeof t?Math.round(1e5*t)/1e5:t}function Rt(t,e,n){const r=new Animation({name:t,path:n,saved_name:t,loop:!0===e.loop?\"loop\":\"hold_on_last_frame\"===e.loop?\"hold\":e.loop||\"once\",override:!!e.override_previous_animation,anim_time_update:\"string\"==typeof e.anim_time_update?e.anim_time_update.replace(/;(?!$)/,\";\\n\"):e.anim_time_update||\"\",blend_weight:\"string\"==typeof e.blend_weight?e.blend_weight.replace(/;(?!$)/,\";\\n\"):e.blend_weight||\"\",length:Number(e.animation_length||0)}).add();if(e.sound_effects||e.particle_effects||e.timeline||e.instructions){const t=function(t){return t.animators.effects||(t.animators.effects=new EffectAnimator(t)),t.animators.effects}(r);!function(t,e){if(e.sound_effects)for(const n in e.sound_effects){let r=e.sound_effects[n];Array.isArray(r)||(r=[r]);const i=r.filter(Boolean).map(t=>\"string\"==typeof t?{effect:t}:{...t});t.addKeyframe({channel:\"sound\",time:parseFloat(n),data_points:i})}if(e.particle_effects)for(const n in e.particle_effects){let r=e.particle_effects[n];Array.isArray(r)||(r=[r]);const i=r.filter(Boolean).map(t=>{const e={...t};return e.pre_effect_script&&!e.script&&(e.script=e.pre_effect_script),e});t.addKeyframe({channel:\"particle\",time:parseFloat(n),data_points:i})}const n=e.timeline||e.instructions;if(n)for(const e in n){const r=n[e],i=Array.isArray(r)?r.join(\"\\n\"):r;t.addKeyframe({channel:\"timeline\",time:parseFloat(e),data_points:[{script:i}]})}}(t,e)}if(e.bones)for(const t in e.bones){const n=e.bones[t],i=Group.all.find(e=>e.name.toLowerCase()===t.toLowerCase()),o=i?i.uuid:guid(),a=new BoneAnimator(o,r,t);r.animators[o]=a;for(const t in n)Animator.possible_channels[t]&&Lt(a,t,n[t])}return r.calculateSnappingFromKeyframes?.(),!Animation.selected&&Animator.open&&r.select(),r}function Lt(t,e,n){if(!n)return;const r=(n,r)=>{const i=function(t,e){if(Array.isArray(t)){const n=St(zt(t),e);return{easing:u,easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:n[0],y:n[1],z:n[2]}]}}if(!t||\"object\"!=typeof t)return null;if((n=t)&&\"object\"==typeof n&&!Array.isArray(n)&&(void 0!==n.vector||void 0!==n.easing)&&!ht(t)){const n=St(zt(dt(t.vector||t)||[0,0,0]),e);return{easing:t.easing||u,easingArgs:Array.isArray(t.easingArgs)&&t.easingArgs.length?t.easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:n[0],y:n[1],z:n[2]}]}}var n;if(ht(t)){const n=t.lerp_mode,r=\"catmullrom\"===n?\"catmullrom\":\"linear\"===n?void 0:void 0!==t.pre||void 0!==t.post?\"bezier\":void 0,i=[],o=dt(t.post),a=dt(t.pre);if(a){const t=St(zt(a),e);i.push({x:t[0],y:t[1],z:t[2]})}const s=o?St(zt(o),e):[0,0,0];return i.push({x:s[0],y:s[1],z:s[2]}),{easing:u,easingArgs:void 0,interpolation:r,uniform:!1,data_points:i.length?i:[{x:0,y:0,z:0}]}}const r=Nt(t.x??0),i=Nt(t.y??0),o=Nt(t.z??0);return{easing:u,easingArgs:void 0,interpolation:void 0,uniform:!1,data_points:[{x:r,y:i,z:o}]}}(r,e);i&&t.addKeyframe({time:n,channel:e,easing:i.easing,easingArgs:i.easingArgs,interpolation:i.interpolation,uniform:i.uniform,data_points:i.data_points})};if(Array.isArray(n)||void 0!==n.vector&&Object.keys(n).length<=3){const t=dt(n)||n;if(Array.isArray(t))return void r(0,t)}if(void 0!==n.lerp_mode||void 0!==n.pre||void 0!==n.post||void 0!==n.vector&&\"object\"!=typeof n.vector)r(0,n);else for(const t in n)r(parseFloat(t),n[t])}function Nt(t){if(\"string\"!=typeof t)return t;const e=Number(t);return isNaN(e)?t:e}function zt(t){return t.map(Nt)}function St(t,e){if(!Blockbench.isNewerThan(\"4.99\"))return t;const n=[...t];return\"rotation\"===e?(n[0]=F(n[0]),n[1]=F(n[1])):\"position\"===e&&(n[0]=F(n[0])),n}function Tt(t){return JSON.stringify(t,null,\"\\t\").replace(/\\[\\s*([\\s\\S]*?)\\s*\\]/g,(t,e)=>{const n=e.trim();return n?/[{\\[\\]]/.test(n)?t:\"[\"+n.split(/,\\s*/).map(t=>t.trim()).join(\", \")+\"]\":\"[]\"})}new Set([\"linear\",\"catmullrom\"]);const Ct=\"undefined\"!=typeof isApp&&isApp?n(9896):null;function Bt(t){if(!Ct||!t)return null;try{if(!Ct.existsSync(t))return null;const e=Ct.readFileSync(t,\"utf-8\"),n=\"function\"==typeof autoParseJSON?autoParseJSON(e,!1):JSON.parse(e);return n&&\"object\"==typeof n.animations?n:null}catch(t){return null}}let Mt=null;function Pt(){return Mt||(\"undefined\"==typeof AnimationCodec?(console.warn(\"[AzureLib] AnimationCodec API is unavailable in this Blockbench version.\"),null):(Mt=new AnimationCodec(lt,{multiple_per_file:!0,pickFile(){Blockbench.import({resource_id:\"azure_animation\",type:\"AzureLib Animation\",extensions:[\"json\"],readtype:\"text\",multiple:!0},async t=>{if(t&&t.length)for(const e of t)await this.importFile(e)})},importFile(t,e){let n;try{n=\"function\"==typeof autoParseJSON?autoParseJSON(t.content,!1):JSON.parse(t.content)}catch(t){return console.error(\"[AzureLib] Failed to parse animation file:\",t),Blockbench.showQuickMessage(\"[AzureLib] Failed to parse animation file.\"),[]}return t.json=n,this.loadFile(t,null,e)},loadFile(t,e,n){const r=t?.json||(\"function\"==typeof autoParseJSON?autoParseJSON(t.content,!1):JSON.parse(t.content));if(!r||\"object\"!=typeof r.animations)return Blockbench.showQuickMessage(\"[AzureLib] No animations found in file.\"),[];const i=t.path||\"\";_t(i,r.includes||[]);const o=[];for(const[t,n]of Object.entries(r.animations)){if(Array.isArray(e)&&e.length&&!e.includes(t))continue;const r=Rt(t,n,i);r.saved=!0,o.push(r)}return!n&&o.length&&(Animation.selected=o[0]),o},compileFile(t=Animation.all){const e=Array.isArray(t)?t:Animation.all,n=e.length&&e[0].path||\"\",r=bt({format_version:ft,animations:{}},yt(n));for(const t of e)t?.name&&(r.animations[t.name]=xt(t));return r},write:(t,e)=>Tt(t),saveAnimation(t,e){const n=()=>bt({format_version:ft,animations:{[t.name]:xt(t)}},yt(t.path));if(!isApp||!t.path||e)return void Blockbench.export({resource_id:\"azure_animation\",type:\"AzureLib Animation\",extensions:[\"json\"],name:(Project?.geometry_name||Project?.name||\"animation\")+\".animation\",startpath:t.path,content:Tt(n())},e=>{const n=t.path||\"\";_t(e,yt(n)),e!==n&&n&&pt.delete(n),t.path=e,t.saved=!0,t.saved_name=t.name});let r=n();const i=Bt(t.path);if(i){const e=r.animations[t.name];r=i,t.saved_name&&t.saved_name!==t.name&&delete r.animations[t.saved_name],r.animations[t.name]=e,bt(r,yt(t.path));const n=Object.keys(r.animations),o=Animation.all.filter(e=>e.path===t.path).map(t=>t.name);let a=!1,u=0;for(const t of o){const e=n.indexOf(t);-1!==e&&(e<u?(n.splice(e,1),n.splice(u,0,t),a=!0):u=e)}if(a){const t={};n.forEach(e=>{t[e]=r.animations[e]}),r.animations=t}}Blockbench.writeFile(t.path,{content:Tt(r)},e=>{t.saved=!0,t.saved_name=t.name,t.path=e})},exportFile(t,e){const n=t||\"\",r=Animation.all.filter(t=>(t.path||\"\")===n);if(!e&&isApp&&t&&Ct&&Ct.existsSync(t))return void r.forEach(t=>{t.saved||t.save()});const i=Tt(this.compileFile(r));Blockbench.export({resource_id:\"azure_animation\",type:\"AzureLib Animation\",extensions:[\"json\"],name:(Project?.geometry_name||Project?.name||\"animation\")+\".animation\",startpath:t,content:i},t=>{const e=n||\"\",i=yt(e);_t(t,i),t!==e&&e&&pt.delete(e),r.forEach(e=>{e.path=t,e.saved=!0,e.saved_name=e.name})})},deleteAnimationFromFile(t){if(!Ct||!t.path)return;const e=Bt(t.path);e&&e.animations?.[t.name]&&(delete e.animations[t.name],bt(e,yt(t.path)),Blockbench.writeFile(t.path,{content:Tt(e)}))}}),Mt))}let Ft=null;const Dt=globalThis.invertMolang||F;let Ut=!1,Gt=!1,Wt=null;function Kt(){return globalThis.Codecs?.bedrock||null}function Xt(){if(Gt)return;Gt=!0;const t=globalThis.Codecs?.project,e=globalThis.Codecs?.bedrock,n=Wt||(\"undefined\"!=typeof ModelFormat&&globalThis.Codecs?.project?(Wt=new ModelFormat({id:\"azure_model\",name:\"AzureLib Animated Model\",category:\"minecraft\",description:\"Animated model for Java mods using AzureLib.\",icon:\"view_in_ar\",rotate_cubes:!0,box_uv:!0,optional_box_uv:!0,single_texture:!0,bone_rig:!0,centered_grid:!0,animated_textures:!0,select_texture_for_particles:!0,animation_mode:!0,animation_files:!0,animation_codec:void 0,locators:!0,codec:globalThis.Codecs?.project||null,display_mode:!0,onActivation(){}}),Wt):(console.warn(\"[AzureLib] ModelFormat or Codecs.project unavailable\"),null));t&&e&&n?(t.on(\"compile\",Vt),t.on(\"parse\",Ht),e.on(\"compile\",Jt),function(){const t=Pt();if(t){if(!Ft){Ft=new Action(\"azl_edit_animation_includes\",{name:\"Edit Animation Includes\",description:\"Edit AzureLib animation include entries for the current animation file\",icon:\"playlist_add\",category:\"animation\",condition:()=>\"azure_model\"===Format?.id&&Animator.open,click:()=>function(){const t=function(){const t=Animation?.selected;if(t)return t.path||\"\";const e=[...new Set(Animation.all.map(t=>t.path||\"\"))];return 1===e.length?e[0]:\"\"}(),e=yt(t),n=(r=t,Animation.all.filter(t=>(t.path||\"\")===(r||\"\")&&t.name).map(t=>t.name).sort((t,e)=>t.localeCompare(e)));var r;const i=t||\"Unsaved animation file\",o=new Dialog({id:\"azl_animation_includes_editor\",title:\"Edit Animation Includes\",width:760,component:{data:()=>({targetPath:t,fileLabel:i,rows:e.length?e.map(t=>({file_id:t.file_id,animations_text:t.animations.join(\", \")})):[{file_id:\"\",animations_text:\"\"}],animationNames:n,exampleAnimationNames:n.join(\", \")}),methods:{addRow(){this.rows.push({file_id:\"\",animations_text:\"\"})},removeRow(t){this.rows.splice(t,1),this.rows.length||this.addRow()}},template:'\\n        <div class=\"dialog_content azure_includes_dialog\" style=\"display:flex;flex-direction:column;gap:12px;min-width:0;\">\\n          <div style=\"min-width:0;\">\\n            <p style=\"margin:0;\"><strong>Editing file:</strong> <span style=\"word-break:break-all;\">{{ fileLabel }}</span></p>\\n            <p style=\"margin:6px 0 0 0;opacity:0.8;\">\\n              These entries are saved at the top level of the animation JSON as <code>includes</code>.\\n            </p>\\n            <p v-if=\"exampleAnimationNames\" style=\"margin:6px 0 0 0;opacity:0.8;line-height:1.45;\">\\n              Animations currently in this file: <code style=\"white-space:pre-wrap;word-break:break-word;\">{{ exampleAnimationNames }}</code>\\n            </p>\\n          </div>\\n\\n          <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;\">\\n            <strong>Include Entries</strong>\\n            <button\\n              type=\"button\"\\n              style=\"position:static;display:inline-flex;align-items:center;justify-content:center;padding:6px 12px;min-height:32px;white-space:nowrap;\"\\n              @click=\"addRow()\"\\n            >\\n              Add Include\\n            </button>\\n          </div>\\n          \\n          <div style=\"display:flex;flex-direction:column;gap:12px;max-height:420px;overflow:auto;padding-right:4px;min-width:0;\">\\n            <div\\n              v-for=\"(row, index) in rows\"\\n              :key=\"index\"\\n              style=\"display:block;padding:12px;border:1px solid rgba(255,255,255,0.08);border-radius:8px;background:rgba(255,255,255,0.03);box-sizing:border-box;min-width:0;\"\\n            >\\n              <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;\">\\n                <div style=\"font-weight:600;opacity:0.95;\">Include {{ index + 1 }}</div>\\n                <button\\n                  type=\"button\"\\n                  style=\"position:static;display:inline-flex;align-items:center;justify-content:center;padding:4px 10px;min-height:28px;white-space:nowrap;\"\\n                  @click=\"removeRow(index)\"\\n                >\\n                  Remove\\n                </button>\\n              </div>\\n          \\n              <div style=\"display:flex;flex-direction:column;gap:10px;min-width:0;\">\\n                <label style=\"display:flex;flex-direction:column;gap:4px;width:100%;min-width:0;\">\\n                  <span>File ID</span>\\n                  <input\\n                    type=\"text\"\\n                    class=\"dark_bordered\"\\n                    style=\"display:block;width:100%;min-width:0;max-width:100%;box-sizing:border-box;\"\\n                    v-model=\"row.file_id\"\\n                    placeholder=\"mod_id:path/to/other_animation.json\"\\n                  />\\n                </label>\\n          \\n                <label style=\"display:flex;flex-direction:column;gap:4px;width:100%;min-width:0;\">\\n                  <span>Animations (comma-separated)</span>\\n                  <textarea\\n                    class=\"dark_bordered\"\\n                    rows=\"3\"\\n                    style=\"display:block;width:100%;min-width:0;max-width:100%;resize:vertical;box-sizing:border-box;line-height:1.4;\"\\n                    v-model=\"row.animations_text\"\\n                    placeholder=\"animation_name_1, animation_name_2\"\\n                  ></textarea>\\n                </label>\\n              </div>\\n            </div>\\n          </div>\\n        </div>\\n      '},onConfirm(){const e=gt((o.content_vue?.rows||[]).map(t=>({file_id:t.file_id,animations:String(t.animations_text||\"\").split(\",\").map(t=>t.trim()).filter(Boolean)}))),n=function(t){const e=new Map,n=[];return t.forEach((t,r)=>{(t.animations||[]).forEach(t=>{const i=String(t||\"\").trim();if(!i)return;const o=e.get(i);void 0!==o?n.push({name:i,firstIndex:o,secondIndex:r}):e.set(i,r)})}),n}(e);if(n.length){const t=n.slice(0,6).map(t=>`${t.name} (entries ${t.firstIndex+1} and ${t.secondIndex+1})`).join(\"\\n\");return\"function\"==typeof Blockbench.showMessageBox?Blockbench.showMessageBox({title:\"Duplicate Included Animations\",message:\"Each included animation name must be unique across all include entries.\\n\\n\"+t+(n.length>6?`\\n…and ${n.length-6} more.`:\"\")}):Blockbench.showQuickMessage(\"Duplicate included animation names detected.\",2400),!1}_t(t,e),Blockbench.showQuickMessage(e.length?`Saved ${e.length} animation include${1===e.length?\"\":\"s\"}.`:\"Cleared animation includes.\",2e3)}});o.show()}()});try{MenuBar.menus?.animation?.addAction(Ft)}catch(t){}}Formats?.azure_animation||(Formats.azure_animation={id:lt,name:\"Azure Animation\",animation_codec:t}),console.log(\"[AzureLib] Azure animation codec registered\")}else console.warn(\"[AzureLib] AnimationCodec API is unavailable in this Blockbench version. Animation import/export will not work. Please update Blockbench.\")}(),n.animation_codec=Pt()||void 0,W(),b(),Blockbench.on(\"close_project\",qt),Blockbench.on(\"new_project\",qt),console.log(\"[AzureLib] Azure codec registered (AnimationCodec-backed)\")):console.warn(\"[AzureLib] Required codec APIs are unavailable\")}function qt(){Object.assign(ut,it),Ut=!1,console.log(\"[AzureLib] Settings reset to defaults\")}function Vt(t){\"azure_model\"===Format?.id&&(\"AZURE_ITEM_BLOCK\"===ut.objectType&&(ut.objectType=\"AZURE_ENTITY\",ut.entityType=\"Entity/Block/Item\"),t.model.azurelibSettings=ut)}function Ht(t){const e=t.model||{},n=e?.meta?.model_format||e?.model_format;if(\"azure_model\"!==n)return;const r=e.azurelibSettings;if(r&&\"object\"==typeof r){const t=\"AZURE_ITEM_BLOCK\"===r.objectType;Object.assign(ut,ct()(r,[\"formatVersion\"])),t&&(ut.objectType=\"AZURE_ENTITY\",ut.entityType=\"Entity/Block/Item\",console.warn(\"[AzureLib] Converted deprecated AZURE_ITEM_BLOCK -> AZURE_ENTITY\")),at(),t&&!Ut&&(Ut=!0,Blockbench.showMessageBox({title:\"AzureLib Conversion\",message:'This project used an older \"Block/Item\" type.\\n\\nIt has been updated to the unified \"Entity/Block/Item\" type (AZURE_ENTITY).',buttons:[\"OK\"]}))}else\"azure_model\"!==n||e.azurelibSettings||console.debug(\"[AzureLib] Azure model detected but no settings loaded yet.\");if(Blockbench.isNewerThan(\"4.99\")&&e.animations){console.log(\"[AzureLib] Applying legacy animation inversion fix for Blockbench 5.0+\");for(const[,t]of Object.entries(e.animations))for(const e of Object.values(t.bones||{}))for(const[t,n]of Object.entries(e))if(\"rotation\"===t||\"position\"===t)for(const e of Object.values(n))e?.vector&&(\"rotation\"===t?(e.vector[0]=Dt(e.vector[0]),e.vector[1]=Dt(e.vector[1])):\"position\"===t&&(e.vector[0]=Dt(e.vector[0])))}}function Jt(t){if(\"azure_model\"!==Format?.id)return;const e=t.model?.[\"minecraft:geometry\"];e&&e.forEach(t=>{delete t.item_display_transforms})}function Zt(t={},e){const n=(e,n)=>void 0===t[e]?n:t[e],r={},i=Kt();if(n(\"comment\",settings.credit.value)&&(r.credit=settings.credit.value),r.parent=\"builtin/entity\",n(\"ambientocclusion\",!1===Project.ambientocclusion)&&(r.ambientocclusion=!1),16===Project.texture_width&&16===Project.texture_height||(r.texture_size=[Project.texture_width,Project.texture_height]),n(\"front_gui_light\",Project.front_gui_light)&&(r.gui_light=\"front\"),n(\"overrides\",Project.overrides)&&(r.overrides=Project.overrides),n(\"display\",Object.keys(Project.display_settings).length>=1)){const t={};for(const e in DisplayMode.slots){const n=DisplayMode.slots[e];DisplayMode.slots.hasOwnProperty(e)&&Project.display_settings[n]?.export&&(t[n]=Project.display_settings[n].export())}if(Object.keys(t).length){r.display=t;for(const[,e]of Object.entries(t))Array.isArray(e?.translation)&&(e.translation=[e.translation[0],Math.round(100*(Number(e.translation[1]||0)-8))/100,e.translation[2]])}}if(Project.textures&&n(\"textures\",Object.keys(Project.textures).length>=1))for(const t of Object.values(Project.textures))if(t.particle||1===Object.keys(Project.textures).length){const e=t.name.replace(\".png\",\"\");if(/^[-._a-z0-9/]+$/.test(e)){r.textures={particle:e};break}}const o=JSON.stringify(r,null,2),a=ut.itemModelPath;return Blockbench.export({resource_id:\"model\",type:Codecs.java_block.name,extensions:[\"json\"],name:(i?.fileName?.()||\"model.geo\").replace(\".geo\",\".item\"),startpath:a,content:o},t=>{ut.itemModelPath=t}),this}function Qt(){Blockbench.import({resource_id:\"model\",type:\"json\",extensions:[\"json\"],readtype:\"text\",multiple:!1},t=>{if(!t?.[0])return;let e;try{e=JSON.parse(t[0].content)}catch{return Blockbench.showQuickMessage(\"[AzureLib] Invalid JSON file.\")}if(\"builtin/entity\"!==e.parent||\"object\"!=typeof e.display)return Blockbench.showQuickMessage(\"[AzureLib] Not a valid AzureLib display file.\");Project.display_settings={};for(const[t,n]of Object.entries(e.display)){if(!DisplayMode.slots.includes(t))continue;const e=Array.isArray(n.rotation)?n.rotation.slice():[0,0,0],r=Array.isArray(n.translation)?n.translation.slice():[0,0,0],i=Array.isArray(n.scale)?n.scale.slice():[1,1,1];r[1]=Math.round(100*(Number(r[1]||0)+8))/100;const o=new DisplaySlot(t);Object.assign(o,{rotation:e,translation:r,scale:i}),Project.display_settings[t]=o}Project.saved=!1,DisplayMode.vue.$forceUpdate(),DisplayMode.updateDisplayBase(),Blockbench.showQuickMessage(\"[AzureLib] Display settings imported.\")})}const Yt=Kt(),{rE:te,Ug:ee}=o,ne=`${ee.min_version} - ${ee.max_version}`;i()(e()(Blockbench.version),ne)||alert(`AzureLib Animator supports Blockbench ${ne}. Update for best results.`),function(){let t,e,n,r;Plugin.register(\"azurelib_utils\",{...ee,version:te,await_loading:!0,onload(){Xt(),b(),W(),console.log(\"[AzureLib] Animator loaded\"),Blockbench.on(\"ready\",()=>{setTimeout(()=>{Keyframe.prototype._azurePatched||(console.log(\"[AzureLib] Reattaching keyframe overrides after ready()\"),W())},0)}),Blockbench.on(\"new_project\",()=>{\"azure_model\"===Format?.id&&setTimeout(()=>{try{Interface.dialog?.close()}catch{}new Dialog({id:\"azurelib_model_settings\",title:\"AzureLib Model Settings\",width:540,lines:[`<b class=\"tl\"><a href=\"https://wiki.azuredoom.com/\">AzureLib</a> Animator v${te}</b>`,\"<p>Select your model type to begin.</p>\"],form:{objectType:{label:\"Object Type\",type:\"select\",default:ut.objectType,options:rt}},onConfirm(t){Object.assign(ut,t),at()}}).show()},150)}),t=new Action({id:\"export_AzureLib_model\",name:\"Export AzureLib .geo Model\",icon:\"archive\",description:\"Export your .geo model for AzureLib.\",category:\"file\",condition:()=>\"azure_model\"===Format.id,click:()=>Yt.export()}),MenuBar.addAction(t,\"file.export\"),e=new Action({id:\"export_AzureLib_display\",name:\"Export AzureLib Display Settings\",icon:\"icon-bb_interface\",category:\"file\",description:\"Export display settings for AzureLib.\",condition:()=>\"azure_model\"===Format.id,click:Zt}),MenuBar.addAction(e,\"file.export\"),n=new Action({id:\"import_AzureLib_display\",name:\"Import AzureLib Display Settings\",icon:\"icon-bow\",category:\"file\",condition:()=>\"azure_model\"===Format.id,click:Qt}),MenuBar.addAction(n,\"file.import\"),r=new Action(\"azurelib_settings\",{name:\"AzureLib Model Settings\",description:\"Change model type\",icon:\"info\",condition:()=>\"azure_model\"===Format.id,click:()=>{const t=new Dialog({id:\"project\",title:\"AzureLib Model Settings\",width:540,lines:[`<b class=\"tl\"><a href=\"https://wiki.azuredoom.com/\">AzureLib</a> Animator v${te}</b>`],form:{objectType:{label:\"Object Type\",type:\"select\",default:ut.objectType,options:rt}},onConfirm:e=>{Object.assign(ut,e),at(),t.hide()}});t.show()}}),MenuBar.addAction(r,\"file.1\")},onunload(){t.delete(),e.delete(),n.delete(),r.delete(),K(),x(),function(){if(!Gt)return;Gt=!1;const t=globalThis.Codecs?.project,e=globalThis.Codecs?.bedrock;t?.events?.compile?.remove?.(Vt),t?.events?.parse?.remove?.(Ht),e?.events?.compile?.remove?.(Jt),x(),K(),function(){Ft?.delete(),Ft=null;try{delete Formats?.azure_animation}catch{}Mt&&AnimationCodec?.codecs&&delete AnimationCodec.codecs[lt],Mt=null,console.log(\"[AzureLib] Azure animation codec unregistered\")}(),Wt&&(Wt.animation_codec=void 0),console.log(\"[AzureLib] Azure codec unregistered\")}(),M.forEach(t=>{Object.keys(t).forEach(e=>{e.startsWith(\"_\")||(t._target[e]=t[e])})}),M.clear(),console.log(\"[AzureLib] Animator unloaded.\")}})}()})()})();"
  },
  {
    "path": "plugins/azurelib_utils/azurelib_utils.js.LICENSE.txt",
    "content": "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n"
  },
  {
    "path": "plugins/azurelib_utils/changelog.json",
    "content": "{\n\t\"1.0.6\": {\n\t\t\"title\": \"1.0.6\",\n\t\t\"date\": \"2024-03-27\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Updates about.md for supported versions\",\n\t\t\t\t\t\"Updates about.md for NeoForge 1.20.4 vs 1.20.1 dependencies\",\n\t\t\t\t\t\"Adds bvanseg as maintainer for any bug fixes/upcoming rewrites.\",\n\t\t\t\t\t\"Bumps version to 1.0.6\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes builtin/entity not being added to display exports.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.7\": {\n\t\t\"title\": \"1.0.7\",\n\t\t\"date\": \"2024-05-21\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Makes builtin/entity always be part of the display export for AzureLib Projects\",\n\t\t\t\t\t\"Enables animated texture support for format\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.8\": {\n\t\t\"title\": \"1.0.8\",\n\t\t\"date\": \"2024-06-01\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Disables some logging that isn't needed.\",\n\t\t\t\t\t\"Now include a license with plugin info, sourced MIT\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes issue with easing and keyframes.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.9\": {\n\t\t\"title\": \"1.0.9\",\n\t\t\"date\": \"2024-06-03\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes some plugin meta data inconsistencies, thanks to ewanhowell5195\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes crash if setting steps to 0 or nothing then clicking away, as per the issue #513\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.10\": {\n\t\t\"title\": \"1.0.10\",\n\t\t\"date\": \"2024-09-28\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Auto convert bedrock format into format that works properly\",\n\t\t\t\t\t\"Remove item display transforms from geo file exported for azure_models\",\n\t\t\t\t\t\"Tweaked ArmorTemplate Names/pivots\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.11\": {\n\t\t\"title\": \"1.0.11\",\n\t\t\"date\": \"2025-10-15\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Adds particle field support for item disply exports\",\n\t\t\t\t\t\"Bump support for 5.x version of Blockbench\",\n\t\t\t\t\t\"Adds new armorWaist bone to Armor template\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes wiki links\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.12\": {\n\t\t\"title\": \"1.0.12\",\n\t\t\"date\": \"2025-10-15\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Adds popup for model type on new project creation.\",\n\t\t\t\t\t\"Adds new import option to import item display settings to the display tab\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes animation keyframe invert from 5.x changes\",\n\t\t\t\t\t\"Fixes the project object type not saving properly, causing armor to always save as entity\",\n\t\t\t\t\t\"Fixes the output offset of item display settings.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.0.0\": {\n\t\t\"title\": \"2.0.0\",\n\t\t\"date\": \"2026-01-06\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Rewrote most of the internal code to make future maintance easier.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes animation keyframe export on easings and effect keyframes\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.1.0\": {\n\t\t\"title\": \"2.1.0\",\n\t\t\"date\": \"2026-04-15\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Now support both Azurelib Easings and Bedrock easings in 1 project, allowing you to mix them\",\n\t\t\t\t\t\"Updates plugin to use the new AnimationCodec system from blockbench to help with future animation issues\",\n\t\t\t\t\t\"Adds support for animation includes as per https://moddedmc.wiki/en/project/azurelib/latest/docs/misc/animating/animation_includes\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes animation keyframe export due to BB 5.1 changes\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.1.1\": {\n\t\t\"title\": \"2.1.1\",\n\t\t\"date\": \"2026-04-27\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixes an issue that was preventing Azurelib easings from exporting.\",\n\t\t\t\t\t\"Fixes an issue with exporting display setting not being correct and incorrectly modifying the UI rendering as well.\",\n\t\t\t\t\t\"Fixes an issue that was preventing Azurelib easings as importing correctly.\",\n\t\t\t\t\t\"Fixes easings not being selected correctly when reimporting or opening old projects\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.1.2\": {\n\t\t\"title\": \"2.1.2\",\n\t\t\"date\": \"2026-05-18\",\n\t\t\"author\": \"AzureDoom\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fix blank keyframe axes exporting as newline strings.\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/azurelib_utils/members.yml",
    "content": "maintainers:\n  - AzureDoom\n  - bvanseg\n  - Collinvh"
  },
  {
    "path": "plugins/backup_viewer/about.md",
    "content": "<div id=\"about-content\">\n  <p>This plugin adds a a backup tab to the start screen that allows you to quickly and easily see your project backups.</p>\n  <h2>Usage</h2>\n  <p>On the <b>Recent Models</b> view on the start screen, a new <b>Backup</b> tab will be added. Select this tab to view your backups. Both grid view and list view are available</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/backup_viewer/backup_viewer.js",
    "content": "let loaded, styles, oldTemplate\nconst workScreenElement = document.getElementById(\"work_screen\")\nPlugin.register(\"backup_viewer\", {\n  title: \"Backup Viewer\",\n  icon: \"icon.png\",\n  author: \"Ewan Howell\",\n  description: \"View the project backups from the Blockbench start screen.\",\n  tags: [\"Backups\", \"Start screen\", \"Blockbench\"],\n  version: \"2.1.0\",\n  min_version: \"5.0.0\",\n  variant: \"desktop\",\n  creation_date: \"2022-12-28\",\n  has_changelog: true,\n  website: \"https://ewanhowell.com/plugins/backup-viewer/\",\n  repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/backup-viewer\",\n  bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Backup Viewer]\",\n  onload() {\n    const backupPath = SystemInfo.user_data_directory + osfs + \"backups\"\n\n    fs = require(\"fs\", {\n      readonly: true,\n      scope: backupPath,\n      message: \"This permission is required to read your backups directory.\",\n      optional: false\n    })\n\n    if (!fs) {\n      throw new Error(\"fs access denied\")\n    }\n\n    const backups = []\n    function getBackups() {\n      backups.length = 0\n      const backupFilePaths = fs.readdirSync(backupPath)\n      for (const file of backupFilePaths) {\n        const path = PathModule.join(backupPath, file)\n        const stats = fs.statSync(path)\n        backups.push({\n          id: file,\n          path,\n          name: file.replace(/backup_\\d+\\.\\d+\\.\\d+_\\d+\\.\\d+_?/, \"\").replace(/\\.bbmodel$/, \"\") || 'no name',\n          date: stats.mtime.toLocaleDateString(),\n          time: stats.mtime.toLocaleTimeString().replace(/:\\d+ /, \" \"),\n          size: `${separateThousands(Math.round(stats.size / 1024))} KB`,\n          timestamp: stats.mtime.getTime()\n        })\n      }\n      backups.sort((a, b) => b.timestamp - a.timestamp)\n    }\n    getBackups()\n\n    styles = Blockbench.addCSS(`\n      #start-screen-recent-tabs {\n        display: flex;\n        gap: 10px;\n        padding-bottom: 5px;\n        margin-top: -5px;\n\n        h2 {\n          cursor: pointer;\n          padding: 0 10px;\n          margin-top: -3px;\n\n          &:hover {\n            color: var(--color-light);\n          }\n        }\n\n        .selected {\n          border-bottom: 3px solid var(--color-accent);\n        }\n      }\n\n      .recent-project-list .backup .icon_wrapper {\n        padding-left: 22px;\n        height: 22px;\n        margin: 0 !important;\n      }\n\n      .recent-project-list .backup .recent_project_date {\n        display: grid;\n        grid-template-columns: 76px 56px 60px;\n        gap: 16px;\n\n        :last-child {\n          text-align: right;\n        }\n      }\n\n      .recent_list_grid .backup {\n        padding: 10px 20px 12px 20px;\n        height: initial !important;\n\n        &:hover * {\n          color: var(--color-light);\n        }\n      }\n\n      .recent_list_grid .backup .recent_project_date {\n        font-size: 14px;\n        display: flex;\n        gap: 8px;\n\n        &::before {\n          display: none;\n        }\n\n        :last-child {\n          flex: 1;\n          text-align: right;\n        }\n      }\n    `)\n\n    StartScreen.vue.$destroy()\n\n    StartScreen.vue.$data.recentsView = \"recents\"\n    StartScreen.vue.$data.backups = backups\n\n    StartScreen.vue.$options.methods.openBackup = backup => Blockbench.read([backup.path], {}, files => {\n      loadModelFile(files[0])\n    })\n    StartScreen.vue.$options.methods.getBackups = getBackups\n\n    oldTemplate = StartScreen.vue.$options.template\n\n    const newTemplate = oldTemplate.replace(\n      `<h2 v-if=\"isApp\">${tl('mode.start.recent')}</h2>`,\n      `\n        <div id=\"start-screen-recent-tabs\">\n          <h2 :class=\"{ selected: recentsView === 'recents' }\" @click=\"recentsView = 'recents'\">${tl(\"mode.start.recent\")}</h2>\n          <h2 :class=\"{ selected: recentsView === 'backups' }\" @click=\"getBackups(); recentsView = 'backups'\">Backups</h2>\n        </div>\n      `\n    ).replace(\n      `<div v-if=\"redact_names\">{{ '['+tl('generic.redacted')+']' }}</div>`,\n      `\n        <div v-if=\"redact_names\">{{ '['+tl('generic.redacted')+']' }}</div>\n        <ul v-else-if=\"recentsView === 'backups' && list_type === 'list'\" class=\"recent-project-list\">\n          <li v-for=\"backup in backups\" class=\"recent_project backup\" @click=\"openBackup(backup)\">\n            <span class=\"icon_wrapper\" v-html=\"getIconNode('fa-archive').outerHTML\"></span>\n            <span class=\"recent_project_name\">{{ backup.name }}</span>\n            <span class=\"recent_project_date\">\n              <span>{{ backup.date }}</span>\n              <span>{{ backup.time }}</span>\n              <span>{{ backup.size }}</span>\n            </span>\n          </li>\n        </ul>\n        <ul v-else-if=\"recentsView === 'backups'\" class=\"recent_list_grid\">\n          <li v-for=\"backup in backups\" class=\"recent_project thumbnail backup\" @click=\"openBackup(backup)\">\n            <h3 class=\"backup-project-name\">{{ backup.name }}</h3>\n            <span class=\"recent_project_date\">\n              <span>{{ backup.date }}</span>\n              <span>{{ backup.time }}</span>\n              <span>{{ backup.size }}</span>\n            </span>\n          </li>\n        </ul>\n      `\n    )\n\n    StartScreen.vue = new Vue({\n      el: \"#start_screen\",\n      components: StartScreen.vue.$options.components,\n      data: { ...StartScreen.vue.$data },\n      methods: StartScreen.vue.$options.methods,\n      computed: StartScreen.vue.$options.computed,\n      mounted: StartScreen.vue.$options.mounted,\n      template: newTemplate\n    })\n\n    if (workScreenElement.style.display === \"grid\") {\n      document.getElementById(\"start_screen\").style.display = \"none\"\n    }\n\n    loaded = true\n  },\n  onunload() {\n    if (loaded) {\n      StartScreen.vue.$destroy()\n\n      delete StartScreen.vue.$data.recentsView\n      delete StartScreen.vue.$data.backups\n      delete StartScreen.vue.$options.methods.openBackup\n      delete StartScreen.vue.$options.methods.getBackups\n\n      StartScreen.vue = new Vue({\n        el: \"#start_screen\",\n        components: StartScreen.vue.$options.components,\n        data: { ...StartScreen.vue.$data },\n        methods: StartScreen.vue.$options.methods,\n        computed: StartScreen.vue.$options.computed,\n        mounted: StartScreen.vue.$options.mounted,\n        template: oldTemplate\n      })\n\n      if (workScreenElement.style.display === \"grid\") {\n        document.getElementById(\"start_screen\").style.display = \"none\"\n      }\n\n      styles.delete()\n    }\n  }\n})"
  },
  {
    "path": "plugins/backup_viewer/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2022-12-28\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"2.0.0\": {\n    \"title\": \"2.0.0\",\n    \"date\": \"2025-03-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Updated for Blockbench v4.12\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"The plugin has been completely rewritten\"\n        ]\n      },\n      {\n        \"title\": \"Bug fixes\",\n        \"list\": [\n          \"The backup list no longer disappears after changing tabs\"\n        ]\n      }\n    ]\n  },\n  \"2.1.0\": {\n    \"title\": \"2.1.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/baked_ambient_occlusion/LICENSE.MD",
    "content": "MIT License\n\nCopyright (c) 2025 Kai Salmon\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 all\ncopies 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 THE\nSOFTWARE."
  },
  {
    "path": "plugins/baked_ambient_occlusion/README.md",
    "content": "# Mr Salmon's Baked Ambient Occlusion for Blockbench\n\nGenerate instant shaded textures for your models, with one click! Ambient occlusion works by working out how much light can reach each pixel on the model: areas in crevices and divots receive less light than those at the edge of the model. By exaggerating this effect, you can create depth, as crevices also often pick up dirt, becoming even darker, and the edges of hard objects (like rocks, wood, metal, etc.) often get worn, becoming even lighter.\n\n*Before*\n![](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/BenchFlat.gif)\n\n*After*\n![](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/Bench.gif)\n\n## Building and installing.\n\nTo install clone the repo, and run `npm install` and then `npm build`. This will create a file at `dist\\blockbench-baked-ao.js`. In Blockbench, you can then go to plugins, and select \"load from file\", and select the file you just created.\n\n## Using the plugin\n\nSelect your mesh, and go to Tools > Bake Ambient Occlusion\n\n<img width=\"366\" height=\"240\" alt=\"image\" src=\"https://github.com/user-attachments/assets/d43d35cb-b9e1-41ef-afa6-dbd9d960bd8e\" />\n\n\n## Settings\n<img width=\"491\" height=\"691\" alt=\"image\" src=\"https://github.com/user-attachments/assets/ba7175f1-db3d-4819-8847-5563d741502b\" />\n\n### **Highlight Color**\nColor used for areas with high ambient lighting\n\n### **Highlight Opacity** \nOpacity of the highlight color overlay\n\n### **Highlight Gamma**\nGamma correction for highlight areas (lower = more contrast)\n\n### **Shadow Color**\nColor used for occluded/shadowed areas\n\n### **Shadow Opacity**\nOpacity of the shadow color overlay\n\n### **Shadow Gamma**\nGamma correction for shadow areas (higher = softer shadows)\n\n### **Samples per pixel**\nNumber of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling.\n\n### **Sample Method**\nMethod for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts.\n\n### **Ambient Occlusion Radius**\nRadius for ambient occlusion effect (Bigger is better for larger models or higher-resolution textures)\n\n### **Simulate Ground Plane**\nSimulate a ground plane, adding shadows at the base of the model\n\n### **Retain Texture Transparency**\nPreserve the original transparency of textures\n\n### **Sample Texture Transparency**\nConsider texture transparency when calculating occlusion (slower but more accurate)\n\n# Credit and Acknowledgments\n\nCode by Kai Salmon.\n\nMassive performance gains were achieved by using [ThreeJS Bounding Volume Heiarachies \n](https://github.com/gkjohnson/three-mesh-bvh) by Garrett Johnson. \n\n"
  },
  {
    "path": "plugins/baked_ambient_occlusion/about.md",
    "content": "# Mr Salmon's Baked Ambient Occlusion\n\nGenerate instant shaded textures for your models with one click! \n\n\n![Preview](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/examples/Promo.gif?raw=true)\n\nThis plugin bakes ambient occlusion directly onto your mesh textures by calculating how much ambient light can reach each pixel on the model. Ambient, in this context, means \"equally from-all directions\". Areas in crevices and divots receive less light than those at the edges, creating natural depth and shading effects. Pixels on the sharp edge of models recieve more light, so are highlighted.\n\nTo use this plugin, select a mesh and go to `Tools > Bake Ambient Occlusion`. Configure your settings in the dialog and click `Confirm` to start the baking process.\n\n## How Ambient Occlusion Works\n\nAmbient occlusion works by casting rays from each pixel on your model's surface to determine how much ambient light can reach that point. Areas that are occluded by nearby geometry (like crevices, corners, and recessed areas) receive less light and appear darker, while exposed edges and surfaces remain bright. By exaggerating this effect, you can even simulate how dirt accumulates in crevices and how edges of hard materials like rocks, wood, and metal get worn and lightened over time.\n\n## Settings Reference\n\n### Colors and Opacity\n\n![Color Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/colors.gif?raw=true)\n![AO Strength](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/ao_strength.gif?raw=true)\n**Highlight Color & Opacity**: Sets the color and transparency used for well-lit, exposed areas of your model. These areas typically represent worn edges or surfaces that receive full ambient lighting.\n\n**Shadow Color & Opacity**: Sets the color and transparency used for occluded, shadowed areas. These areas represent crevices, corners, and recessed surfaces where dirt and grime would naturally accumulate.\n\n### Gamma Correction\n\n![Gamma Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/gamma.gif?raw=true)\n\n**Highlight Gamma**: Controls the contrast and falloff of highlight areas. Lower values create more dramatic contrast with sharper transitions, while higher values create softer, more gradual highlights.\n\n**Shadow Gamma**: Controls the contrast and falloff of shadow areas. Higher values create softer, more subtle shadows, while lower values create harder, more defined shadows.\n\n### AO Strength and Quality\n\n**Samples per pixel**: Determines the quality and accuracy of the ambient occlusion calculation. Higher values produce smoother, more accurate results but take longer to process. Recommended values:\n- 100-500 samples for quick previews, or when using uniform sampling.\n- 1000+ samples for final quality results\n\n**Sample Method**: Choose between sampling methods:\n- **Random**: Slightly more accurate but can be noisier, especially with fewer samples. Of course, noise can be desirable!\n- **Uniform**: Produces smoother results with fewer samples but may show artifacts in some cases, especailly with low samples.\n\n### Occlusion Radius\n\n![Radius Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/radius.gif?raw=true)\n\n**Ambient Occlusion Radius (Pixels)**: Controls how far the occlusion effect extends from each surface. Larger values create larger shadows that affect more distant geometry, while smaller values create tighter, more localized effects. Use larger values for bigger models or higher-resolution textures.\n\n### Ground Plane Simulation\n\n![Ground Plane](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/ground_plane.gif?raw=true)\n\n**Simulate Ground Plane**: Allows the ground beneath your model to occlude light. This creates natural contact shadows at the base of your model, making it appear more grounded. \n\n### Transparency Handling\n\n![Transparency Settings](https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion/blob/main/settings_reference_guides/transparency.gif?raw=true)\n\n**Retain Texture Transparency**: Preserves the original alpha channel of your textures. When enabled, the ambient occlusion effect will respect existing transparent areas and not overwrite them completely.\n\n**Sample Texture Transparency**: Makes the occlusion calculation consider the transparency of textures when casting rays. Semi-transparent areas will allow some light to pass through rather than casting complete shadows. This produces more accurate results in models with a lot of transparent pixels but increases processing time significantly.\n\n## Usage Tips\n\n### Getting Started\n1. Select the mesh you want to process (only one mesh at a time is supported)\n2. Go to `Tools > Bake Ambient Occlusion`\n3. Adjust settings based on your model size and desired effect\n4. Click `Confirm` to start baking\n\n### Recommended Settings\n- **For quick previews**: 100-200 samples, uniform sampling\n- **For final results**: 1000+ samples, random sampling\n- **For large models**: Increase ambient occlusion radius to 12-16\n- **For detailed textures**: Use higher sample counts and enable texture transparency sampling\n\n## Credit and Acknowledgments\n\nPlugin by Kai Salmon. \n\nMassive performance gains were achieved by using [ThreeJS Bounding Volume Hierarchies \n](https://github.com/gkjohnson/three-mesh-bvh) by  Garrett Johnson. \n\n## Source code and Contributions\n\nYou can contribute to the code and report any issues on [github](https://github.com/kaisalmon/MrsSalmonsBlockbenchBakedAmbientOcclusion/blob/main/about.md)."
  },
  {
    "path": "plugins/baked_ambient_occlusion/baked_ambient_occlusion.js",
    "content": "/*! For license information please see baked_ambient_occlusion.js.LICENSE.txt */\n!function(t,e){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var s=e();for(var i in s)(\"object\"==typeof exports?exports:t)[i]=s[i]}}(this,()=>(()=>{\"use strict\";const t=\"182\",e=2300,s=2301,i=2302,r=\"srgb\",n=\"srgb-linear\",a=\"linear\",o=\"srgb\";function h(t){return document.createElementNS(\"http://www.w3.org/1999/xhtml\",t)}Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array;const l={};function c(...t){const e=\"THREE.\"+t.shift();console.warn(e,...t)}function u(...t){const e=\"THREE.\"+t.shift();console.error(e,...t)}function d(...t){const e=t.join(\" \");e in l||(l[e]=!0,c(...t))}class p{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const s=this._listeners;void 0===s[t]&&(s[t]=[]),-1===s[t].indexOf(e)&&s[t].push(e)}hasEventListener(t,e){const s=this._listeners;return void 0!==s&&void 0!==s[t]&&-1!==s[t].indexOf(e)}removeEventListener(t,e){const s=this._listeners;if(void 0===s)return;const i=s[t];if(void 0!==i){const t=i.indexOf(e);-1!==t&&i.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const s=e[t.type];if(void 0!==s){t.target=this;const e=s.slice(0);for(let s=0,i=e.length;s<i;s++)e[s].call(this,t);t.target=null}}}const m=[\"00\",\"01\",\"02\",\"03\",\"04\",\"05\",\"06\",\"07\",\"08\",\"09\",\"0a\",\"0b\",\"0c\",\"0d\",\"0e\",\"0f\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"1a\",\"1b\",\"1c\",\"1d\",\"1e\",\"1f\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"2a\",\"2b\",\"2c\",\"2d\",\"2e\",\"2f\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"3a\",\"3b\",\"3c\",\"3d\",\"3e\",\"3f\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"4a\",\"4b\",\"4c\",\"4d\",\"4e\",\"4f\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"5a\",\"5b\",\"5c\",\"5d\",\"5e\",\"5f\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"6a\",\"6b\",\"6c\",\"6d\",\"6e\",\"6f\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"7a\",\"7b\",\"7c\",\"7d\",\"7e\",\"7f\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"8a\",\"8b\",\"8c\",\"8d\",\"8e\",\"8f\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"9a\",\"9b\",\"9c\",\"9d\",\"9e\",\"9f\",\"a0\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"a6\",\"a7\",\"a8\",\"a9\",\"aa\",\"ab\",\"ac\",\"ad\",\"ae\",\"af\",\"b0\",\"b1\",\"b2\",\"b3\",\"b4\",\"b5\",\"b6\",\"b7\",\"b8\",\"b9\",\"ba\",\"bb\",\"bc\",\"bd\",\"be\",\"bf\",\"c0\",\"c1\",\"c2\",\"c3\",\"c4\",\"c5\",\"c6\",\"c7\",\"c8\",\"c9\",\"ca\",\"cb\",\"cc\",\"cd\",\"ce\",\"cf\",\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\",\"d6\",\"d7\",\"d8\",\"d9\",\"da\",\"db\",\"dc\",\"dd\",\"de\",\"df\",\"e0\",\"e1\",\"e2\",\"e3\",\"e4\",\"e5\",\"e6\",\"e7\",\"e8\",\"e9\",\"ea\",\"eb\",\"ec\",\"ed\",\"ee\",\"ef\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"fa\",\"fb\",\"fc\",\"fd\",\"fe\",\"ff\"];function y(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,s=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(m[255&t]+m[t>>8&255]+m[t>>16&255]+m[t>>24&255]+\"-\"+m[255&e]+m[e>>8&255]+\"-\"+m[e>>16&15|64]+m[e>>24&255]+\"-\"+m[63&s|128]+m[s>>8&255]+\"-\"+m[s>>16&255]+m[s>>24&255]+m[255&i]+m[i>>8&255]+m[i>>16&255]+m[i>>24&255]).toLowerCase()}function f(t,e,s){return Math.max(e,Math.min(s,t))}function x(t,e,s){return(1-s)*t+s*e}function g(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error(\"Invalid component type.\")}}function b(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error(\"Invalid component type.\")}}Math.PI,Math.PI;class w{constructor(t=0,e=0){w.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,s=this.y,i=t.elements;return this.x=i[0]*e+i[3]*s+i[6],this.y=i[1]*e+i[4]*s+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=f(this.x,t.x,e.x),this.y=f(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=f(this.x,t,e),this.y=f(this.y,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(f(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(f(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y;return e*e+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const s=Math.cos(e),i=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*s-n*i+t.x,this.y=r*i+n*s+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class _{constructor(t=0,e=0,s=0,i=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=s,this._w=i}static slerpFlat(t,e,s,i,r,n,a){let o=s[i+0],h=s[i+1],l=s[i+2],c=s[i+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(a<=0)return t[e+0]=o,t[e+1]=h,t[e+2]=l,void(t[e+3]=c);if(a>=1)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const s=Math.acos(t),i=Math.sin(s);e=Math.sin(e*s)/i,o=o*e+u*(a=Math.sin(a*s)/i),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,s,i,r,n){const a=s[i],o=s[i+1],h=s[i+2],l=s[i+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,s,i){return this._x=t,this._y=e,this._z=s,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const s=t._x,i=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(s/2),l=a(i/2),u=a(r/2),d=o(s/2),p=o(i/2),m=o(r/2);switch(n){case\"XYZ\":this._x=d*l*u+h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u-d*p*m;break;case\"YXZ\":this._x=d*l*u+h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u+d*p*m;break;case\"ZXY\":this._x=d*l*u-h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u-d*p*m;break;case\"ZYX\":this._x=d*l*u-h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u+d*p*m;break;case\"YZX\":this._x=d*l*u+h*p*m,this._y=h*p*u+d*l*m,this._z=h*l*m-d*p*u,this._w=h*l*u-d*p*m;break;case\"XZY\":this._x=d*l*u-h*p*m,this._y=h*p*u-d*l*m,this._z=h*l*m+d*p*u,this._w=h*l*u+d*p*m;break;default:c(\"Quaternion: .setFromEuler() encountered an unknown order: \"+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const s=e/2,i=Math.sin(s);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,s=e[0],i=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=s+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-i)*t}else if(s>a&&s>c){const t=2*Math.sqrt(1+s-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(i+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-s-c);this._w=(r-h)/t,this._x=(i+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-s-a);this._w=(n-i)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let s=t.dot(e)+1;return s<1e-8?(s=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=s):(this._x=0,this._y=-t.z,this._z=t.y,this._w=s)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=s),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(f(this.dot(t),-1,1)))}rotateTowards(t,e){const s=this.angleTo(t);if(0===s)return this;const i=Math.min(1,e/s);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const s=t._x,i=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=s*l+n*a+i*h-r*o,this._y=i*l+n*o+r*a-s*h,this._z=r*l+n*h+s*o-i*a,this._w=n*l-s*a-i*o-r*h,this._onChangeCallback(),this}slerp(t,e){if(e<=0)return this;if(e>=1)return this.copy(t);let s=t._x,i=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(s=-s,i=-i,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+s*e,this._y=this._y*o+i*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+s*e,this._y=this._y*o+i*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,s){return this.copy(t).slerp(e,s)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),s=Math.random(),i=Math.sqrt(1-s),r=Math.sqrt(s);return this.set(i*Math.sin(t),i*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class M{constructor(t=0,e=0,s=0){M.prototype.isVector3=!0,this.x=t,this.y=e,this.z=s}set(t,e,s){return void 0===s&&(s=this.z),this.x=t,this.y=e,this.z=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(S.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(S.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*s+r[6]*i,this.y=r[1]*e+r[4]*s+r[7]*i,this.z=r[2]*e+r[5]*s+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=t.elements,n=1/(r[3]*e+r[7]*s+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*s+r[8]*i+r[12])*n,this.y=(r[1]*e+r[5]*s+r[9]*i+r[13])*n,this.z=(r[2]*e+r[6]*s+r[10]*i+r[14])*n,this}applyQuaternion(t){const e=this.x,s=this.y,i=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*i-a*s),l=2*(a*e-r*i),c=2*(r*s-n*e);return this.x=e+o*h+n*c-a*l,this.y=s+o*l+a*h-r*c,this.z=i+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*s+r[8]*i,this.y=r[1]*e+r[5]*s+r[9]*i,this.z=r[2]*e+r[6]*s+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=f(this.x,t.x,e.x),this.y=f(this.y,t.y,e.y),this.z=f(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=f(this.x,t,e),this.y=f(this.y,t,e),this.z=f(this.z,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(f(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const s=t.x,i=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*n-s*o,this.z=s*a-i*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const s=t.dot(this)/e;return this.copy(t).multiplyScalar(s)}projectOnPlane(t){return z.copy(this).projectOnVector(t),this.sub(z)}reflect(t){return this.sub(z.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(f(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y,i=this.z-t.z;return e*e+s*s+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,s){const i=Math.sin(e)*t;return this.x=i*Math.sin(s),this.y=Math.cos(e)*t,this.z=i*Math.cos(s),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,s){return this.x=t*Math.sin(e),this.y=s,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),s=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=s,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,s=Math.sqrt(1-e*e);return this.x=s*Math.cos(t),this.y=e,this.z=s*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const z=new M,S=new _;class A{constructor(t,e,s,i,r,n,a,o,h){A.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,a,o,h)}set(t,e,s,i,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=i,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=s,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],this}extractBasis(t,e,s){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),s.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],a=s[3],o=s[6],h=s[1],l=s[4],c=s[7],u=s[2],d=s[5],p=s[8],m=i[0],y=i[3],f=i[6],x=i[1],g=i[4],b=i[7],w=i[2],_=i[5],M=i[8];return r[0]=n*m+a*x+o*w,r[3]=n*y+a*g+o*_,r[6]=n*f+a*b+o*M,r[1]=h*m+l*x+c*w,r[4]=h*y+l*g+c*_,r[7]=h*f+l*b+c*M,r[2]=u*m+d*x+p*w,r[5]=u*y+d*g+p*_,r[8]=u*f+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-s*r*l+s*a*o+i*r*h-i*n*o}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+s*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(i*h-l*s)*m,t[2]=(a*s-i*n)*m,t[3]=u*m,t[4]=(l*e-i*o)*m,t[5]=(i*r-a*e)*m,t[6]=d*m,t[7]=(s*o-h*e)*m,t[8]=(n*e-s*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,s,i,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(s*o,s*h,-s*(o*n+h*a)+n+t,-i*h,i*o,-i*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(v.makeScale(t,e)),this}rotate(t){return this.premultiply(v.makeRotation(-t)),this}translate(t,e){return this.premultiply(v.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,s,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<9;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<9;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const v=new A,T=(new A).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),B=(new A).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function k(){const t={enabled:!0,workingColorSpace:n,spaces:{},convert:function(t,e,s){return!1!==this.enabled&&e!==s&&e&&s?(this.spaces[e].transfer===o&&(t.r=C(t.r),t.g=C(t.g),t.b=C(t.b)),this.spaces[e].primaries!==this.spaces[s].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===o&&(t.r=V(t.r),t.g=V(t.g),t.b=V(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return\"\"===t?a:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||\"standard\"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,s){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,s){return d(\"ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().\"),t.workingToColorSpace(e,s)},toWorkingColorSpace:function(e,s){return d(\"ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().\"),t.colorSpaceToWorking(e,s)}},e=[.64,.33,.3,.6,.15,.06],s=[.2126,.7152,.0722],i=[.3127,.329];return t.define({[n]:{primaries:e,whitePoint:i,transfer:a,toXYZ:T,fromXYZ:B,luminanceCoefficients:s,workingColorSpaceConfig:{unpackColorSpace:r},outputColorSpaceConfig:{drawingBufferColorSpace:r}},[r]:{primaries:e,whitePoint:i,transfer:o,toXYZ:T,fromXYZ:B,luminanceCoefficients:s,outputColorSpaceConfig:{drawingBufferColorSpace:r}}}),t}const P=k();function C(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function V(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let F;class I{static getDataURL(t,e=\"image/png\"){if(/^data:/i.test(t.src))return t.src;if(\"undefined\"==typeof HTMLCanvasElement)return t.src;let s;if(t instanceof HTMLCanvasElement)s=t;else{void 0===F&&(F=h(\"canvas\")),F.width=t.width,F.height=t.height;const e=F.getContext(\"2d\");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),s=F}return s.toDataURL(e)}static sRGBToLinear(t){if(\"undefined\"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||\"undefined\"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=h(\"canvas\");e.width=t.width,e.height=t.height;const s=e.getContext(\"2d\");s.drawImage(t,0,0,t.width,t.height);const i=s.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t<r.length;t++)r[t]=255*C(r[t]/255);return s.putImageData(i,0,0),e}if(t.data){const e=t.data.slice(0);for(let t=0;t<e.length;t++)e instanceof Uint8Array||e instanceof Uint8ClampedArray?e[t]=Math.floor(255*C(e[t]/255)):e[t]=C(e[t]);return{data:e,width:t.width,height:t.height}}return c(\"ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.\"),t}}let E=0;class U{constructor(t=null){this.isSource=!0,Object.defineProperty(this,\"id\",{value:E++}),this.uuid=y(),this.data=t,this.dataReady=!0,this.version=0}getSize(t){const e=this.data;return\"undefined\"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement?t.set(e.videoWidth,e.videoHeight,0):\"undefined\"!=typeof VideoFrame&&e instanceof VideoFrame?t.set(e.displayHeight,e.displayWidth,0):null!==e?t.set(e.width,e.height,e.depth||0):t.set(0,0,0),t}set needsUpdate(t){!0===t&&this.version++}toJSON(t){const e=void 0===t||\"string\"==typeof t;if(!e&&void 0!==t.images[this.uuid])return t.images[this.uuid];const s={uuid:this.uuid,url:\"\"},i=this.data;if(null!==i){let t;if(Array.isArray(i)){t=[];for(let e=0,s=i.length;e<s;e++)i[e].isDataTexture?t.push(N(i[e].image)):t.push(N(i[e]))}else t=N(i);s.url=t}return e||(t.images[this.uuid]=s),s}}function N(t){return\"undefined\"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||\"undefined\"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||\"undefined\"!=typeof ImageBitmap&&t instanceof ImageBitmap?I.getDataURL(t):t.data?{data:Array.from(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(c(\"Texture: Unable to serialize Texture.\"),{})}let O=0;const q=new M;class R extends p{constructor(t=R.DEFAULT_IMAGE,e=R.DEFAULT_MAPPING,s=1001,i=1001,r=1006,n=1008,a=1023,o=1009,h=R.DEFAULT_ANISOTROPY,l=\"\"){super(),this.isTexture=!0,Object.defineProperty(this,\"id\",{value:O++}),this.uuid=y(),this.name=\"\",this.source=new U(t),this.mipmaps=[],this.mapping=e,this.channel=0,this.wrapS=s,this.wrapT=i,this.magFilter=r,this.minFilter=n,this.anisotropy=h,this.format=a,this.internalFormat=null,this.type=o,this.offset=new w(0,0),this.repeat=new w(1,1),this.center=new w(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new A,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.colorSpace=l,this.userData={},this.updateRanges=[],this.version=0,this.onUpdate=null,this.renderTarget=null,this.isRenderTargetTexture=!1,this.isArrayTexture=!!(t&&t.depth&&t.depth>1),this.pmremVersion=0}get width(){return this.source.getSize(q).x}get height(){return this.source.getSize(q).y}get depth(){return this.source.getSize(q).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const s=t[e];if(void 0===s){c(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const i=this[e];void 0!==i?i&&s&&i.isVector2&&s.isVector2||i&&s&&i.isVector3&&s.isVector3||i&&s&&i.isMatrix3&&s.isMatrix3?i.copy(s):this[e]=s:c(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||\"string\"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const s={metadata:{version:4.7,type:\"Texture\",generator:\"Texture.toJSON\"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(s.userData=this.userData),e||(t.textures[this.uuid]=s),s}dispose(){this.dispatchEvent({type:\"dispose\"})}transformUv(t){if(300!==this.mapping)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case 1e3:t.x=t.x-Math.floor(t.x);break;case 1001:t.x=t.x<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case 1e3:t.y=t.y-Math.floor(t.y);break;case 1001:t.y=t.y<0?0:1;break;case 1002:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}R.DEFAULT_IMAGE=null,R.DEFAULT_MAPPING=300,R.DEFAULT_ANISOTROPY=1;class W{constructor(t=0,e=0,s=0,i=1){W.prototype.isVector4=!0,this.x=t,this.y=e,this.z=s,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*s+n[8]*i+n[12]*r,this.y=n[1]*e+n[5]*s+n[9]*i+n[13]*r,this.z=n[2]*e+n[6]*s+n[10]*i+n[14]*r,this.w=n[3]*e+n[7]*s+n[11]*i+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,s,i,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],f=o[10];if(Math.abs(l-u)<n&&Math.abs(c-m)<n&&Math.abs(p-y)<n){if(Math.abs(l+u)<a&&Math.abs(c+m)<a&&Math.abs(p+y)<a&&Math.abs(h+d+f-3)<a)return this.set(1,0,0,0),this;e=Math.PI;const t=(h+1)/2,o=(d+1)/2,x=(f+1)/2,g=(l+u)/4,b=(c+m)/4,w=(p+y)/4;return t>o&&t>x?t<n?(s=0,i=.707106781,r=.707106781):(s=Math.sqrt(t),i=g/s,r=b/s):o>x?o<n?(s=.707106781,i=0,r=.707106781):(i=Math.sqrt(o),s=g/i,r=w/i):x<n?(s=.707106781,i=.707106781,r=0):(r=Math.sqrt(x),s=b/r,i=w/r),this.set(s,i,r,e),this}let x=Math.sqrt((y-p)*(y-p)+(c-m)*(c-m)+(u-l)*(u-l));return Math.abs(x)<.001&&(x=1),this.x=(y-p)/x,this.y=(c-m)/x,this.z=(u-l)/x,this.w=Math.acos((h+d+f-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=f(this.x,t.x,e.x),this.y=f(this.y,t.y,e.y),this.z=f(this.z,t.z,e.z),this.w=f(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=f(this.x,t,e),this.y=f(this.y,t,e),this.z=f(this.z,t,e),this.w=f(this.w,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(f(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this.w=t.w+(e.w-t.w)*s,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class D{constructor(t=new M(1/0,1/0,1/0),e=new M(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,s=t.length;e<s;e+=3)this.expandByPoint(j.fromArray(t,e));return this}setFromBufferAttribute(t){this.makeEmpty();for(let e=0,s=t.count;e<s;e++)this.expandByPoint(j.fromBufferAttribute(t,e));return this}setFromPoints(t){this.makeEmpty();for(let e=0,s=t.length;e<s;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const s=j.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(s),this.max.copy(t).add(s),this}setFromObject(t,e=!1){return this.makeEmpty(),this.expandByObject(t,e)}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t,e=!1){t.updateWorldMatrix(!1,!1);const s=t.geometry;if(void 0!==s){const i=s.getAttribute(\"position\");if(!0===e&&void 0!==i&&!0!==t.isInstancedMesh)for(let e=0,s=i.count;e<s;e++)!0===t.isMesh?t.getVertexPosition(e,j):j.fromBufferAttribute(i,e),j.applyMatrix4(t.matrixWorld),this.expandByPoint(j);else void 0!==t.boundingBox?(null===t.boundingBox&&t.computeBoundingBox(),H.copy(t.boundingBox)):(null===s.boundingBox&&s.computeBoundingBox(),H.copy(s.boundingBox)),H.applyMatrix4(t.matrixWorld),this.union(H)}const i=t.children;for(let t=0,s=i.length;t<s;t++)this.expandByObject(i[t],e);return this}containsPoint(t){return t.x>=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,j),j.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,s;return t.normal.x>0?(e=t.normal.x*this.min.x,s=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,s=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,s+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,s+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,s+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,s+=t.normal.z*this.min.z),e<=-t.constant&&s>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Q),K.subVectors(this.max,Q),Y.subVectors(t.a,Q),X.subVectors(t.b,Q),G.subVectors(t.c,Q),Z.subVectors(X,Y),J.subVectors(G,X),$.subVectors(Y,G);let e=[0,-Z.z,Z.y,0,-J.z,J.y,0,-$.z,$.y,Z.z,0,-Z.x,J.z,0,-J.x,$.z,0,-$.x,-Z.y,Z.x,0,-J.y,J.x,0,-$.y,$.x,0];return!!st(e,Y,X,G,K)&&(e=[1,0,0,0,1,0,0,0,1],!!st(e,Y,X,G,K)&&(tt.crossVectors(Z,J),e=[tt.x,tt.y,tt.z],st(e,Y,X,G,K)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,j).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(j).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(L[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),L[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),L[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),L[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),L[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),L[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),L[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),L[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(L)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const L=[new M,new M,new M,new M,new M,new M,new M,new M],j=new M,H=new D,Y=new M,X=new M,G=new M,Z=new M,J=new M,$=new M,Q=new M,K=new M,tt=new M,et=new M;function st(t,e,s,i,r){for(let n=0,a=t.length-3;n<=a;n+=3){et.fromArray(t,n);const a=r.x*Math.abs(et.x)+r.y*Math.abs(et.y)+r.z*Math.abs(et.z),o=e.dot(et),h=s.dot(et),l=i.dot(et);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const it=new D,rt=new M,nt=new M;class at{constructor(t=new M,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const s=this.center;void 0!==e?s.copy(e):it.setFromPoints(t).getCenter(s);let i=0;for(let e=0,r=t.length;e<r;e++)i=Math.max(i,s.distanceToSquared(t[e]));return this.radius=Math.sqrt(i),this}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){const e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){const s=this.center.distanceToSquared(t);return e.copy(t),s>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;rt.subVectors(t,this.center);const e=rt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),s=.5*(t-this.radius);this.center.addScaledVector(rt,s/t),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(nt.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(rt.copy(t.center).add(nt)),this.expandByPoint(rt.copy(t.center).sub(nt))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}class ot{constructor(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y){ot.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,s,i,r,n,a,o,h,l,c,u,d,p,m,y){const f=this.elements;return f[0]=t,f[4]=e,f[8]=s,f[12]=i,f[1]=r,f[5]=n,f[9]=a,f[13]=o,f[2]=h,f[6]=l,f[10]=c,f[14]=u,f[3]=d,f[7]=p,f[11]=m,f[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new ot).fromArray(this.elements)}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],e[9]=s[9],e[10]=s[10],e[11]=s[11],e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],this}copyPosition(t){const e=this.elements,s=t.elements;return e[12]=s[12],e[13]=s[13],e[14]=s[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,s){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),s.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),s.setFromMatrixColumn(this,2),this)}makeBasis(t,e,s){return this.set(t.x,e.x,s.x,0,t.y,e.y,s.y,0,t.z,e.z,s.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,s=t.elements,i=1/ht.setFromMatrixColumn(t,0).length(),r=1/ht.setFromMatrixColumn(t,1).length(),n=1/ht.setFromMatrixColumn(t,2).length();return e[0]=s[0]*i,e[1]=s[1]*i,e[2]=s[2]*i,e[3]=0,e[4]=s[4]*r,e[5]=s[5]*r,e[6]=s[6]*r,e[7]=0,e[8]=s[8]*n,e[9]=s[9]*n,e[10]=s[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,s=t.x,i=t.y,r=t.z,n=Math.cos(s),a=Math.sin(s),o=Math.cos(i),h=Math.sin(i),l=Math.cos(r),c=Math.sin(r);if(\"XYZ\"===t.order){const t=n*l,s=n*c,i=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=s+i*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=i+s*h,e[10]=n*o}else if(\"YXZ\"===t.order){const t=o*l,s=o*c,i=h*l,r=h*c;e[0]=t+r*a,e[4]=i*a-s,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=s*a-i,e[6]=r+t*a,e[10]=n*o}else if(\"ZXY\"===t.order){const t=o*l,s=o*c,i=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=i+s*a,e[1]=s+i*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if(\"ZYX\"===t.order){const t=n*l,s=n*c,i=a*l,r=a*c;e[0]=o*l,e[4]=i*h-s,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=s*h-i,e[2]=-h,e[6]=a*o,e[10]=n*o}else if(\"YZX\"===t.order){const t=n*o,s=n*h,i=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=i*c+s,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=s*c+i,e[10]=t-r*c}else if(\"XZY\"===t.order){const t=n*o,s=n*h,i=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=s*c-i,e[2]=i*c-s,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(ct,t,ut)}lookAt(t,e,s){const i=this.elements;return mt.subVectors(t,e),0===mt.lengthSq()&&(mt.z=1),mt.normalize(),dt.crossVectors(s,mt),0===dt.lengthSq()&&(1===Math.abs(s.z)?mt.x+=1e-4:mt.z+=1e-4,mt.normalize(),dt.crossVectors(s,mt)),dt.normalize(),pt.crossVectors(mt,dt),i[0]=dt.x,i[4]=pt.x,i[8]=mt.x,i[1]=dt.y,i[5]=pt.y,i[9]=mt.y,i[2]=dt.z,i[6]=pt.z,i[10]=mt.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],a=s[4],o=s[8],h=s[12],l=s[1],c=s[5],u=s[9],d=s[13],p=s[2],m=s[6],y=s[10],f=s[14],x=s[3],g=s[7],b=s[11],w=s[15],_=i[0],M=i[4],z=i[8],S=i[12],A=i[1],v=i[5],T=i[9],B=i[13],k=i[2],P=i[6],C=i[10],V=i[14],F=i[3],I=i[7],E=i[11],U=i[15];return r[0]=n*_+a*A+o*k+h*F,r[4]=n*M+a*v+o*P+h*I,r[8]=n*z+a*T+o*C+h*E,r[12]=n*S+a*B+o*V+h*U,r[1]=l*_+c*A+u*k+d*F,r[5]=l*M+c*v+u*P+d*I,r[9]=l*z+c*T+u*C+d*E,r[13]=l*S+c*B+u*V+d*U,r[2]=p*_+m*A+y*k+f*F,r[6]=p*M+m*v+y*P+f*I,r[10]=p*z+m*T+y*C+f*E,r[14]=p*S+m*B+y*V+f*U,r[3]=x*_+g*A+b*k+w*F,r[7]=x*M+g*v+b*P+w*I,r[11]=x*z+g*T+b*C+w*E,r[15]=x*S+g*B+b*V+w*U,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[4],i=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],f=t[15],x=o*d-h*u,g=a*d-h*c,b=a*u-o*c,w=n*d-h*l,_=n*u-o*l,M=n*c-a*l;return e*(m*x-y*g+f*b)-s*(p*x-y*w+f*_)+i*(p*g-m*w+f*M)-r*(p*b-m*_+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,s){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=s),this}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],f=t[15],x=c*y*h-m*u*h+m*o*d-a*y*d-c*o*f+a*u*f,g=p*u*h-l*y*h-p*o*d+n*y*d+l*o*f-n*u*f,b=l*m*h-p*c*h+p*a*d-n*m*d-l*a*f+n*c*f,w=p*c*o-l*m*o-p*a*u+n*m*u+l*a*y-n*c*y,_=e*x+s*g+i*b+r*w;if(0===_)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/_;return t[0]=x*M,t[1]=(m*u*r-c*y*r-m*i*d+s*y*d+c*i*f-s*u*f)*M,t[2]=(a*y*r-m*o*r+m*i*h-s*y*h-a*i*f+s*o*f)*M,t[3]=(c*o*r-a*u*r-c*i*h+s*u*h+a*i*d-s*o*d)*M,t[4]=g*M,t[5]=(l*y*r-p*u*r+p*i*d-e*y*d-l*i*f+e*u*f)*M,t[6]=(p*o*r-n*y*r-p*i*h+e*y*h+n*i*f-e*o*f)*M,t[7]=(n*u*r-l*o*r+l*i*h-e*u*h-n*i*d+e*o*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*s*d+e*m*d+l*s*f-e*c*f)*M,t[10]=(n*m*r-p*a*r+p*s*h-e*m*h-n*s*f+e*a*f)*M,t[11]=(l*a*r-n*c*r-l*s*h+e*c*h+n*s*d-e*a*d)*M,t[12]=w*M,t[13]=(l*m*i-p*c*i+p*s*u-e*m*u-l*s*y+e*c*y)*M,t[14]=(p*a*i-n*m*i-p*s*o+e*m*o+n*s*y-e*a*y)*M,t[15]=(n*c*i-l*a*i+l*s*o-e*c*o-n*s*u+e*a*u)*M,this}scale(t){const e=this.elements,s=t.x,i=t.y,r=t.z;return e[0]*=s,e[4]*=i,e[8]*=r,e[1]*=s,e[5]*=i,e[9]*=r,e[2]*=s,e[6]*=i,e[10]*=r,e[3]*=s,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],s=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,s,i))}makeTranslation(t,e,s){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,s,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),s=Math.sin(t);return this.set(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const s=Math.cos(e),i=Math.sin(e),r=1-s,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+s,h*a-i*o,h*o+i*a,0,h*a+i*o,l*a+s,l*o-i*n,0,h*o-i*a,l*o+i*n,r*o*o+s,0,0,0,0,1),this}makeScale(t,e,s){return this.set(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1),this}makeShear(t,e,s,i,r,n){return this.set(1,s,r,0,t,1,n,0,e,i,1,0,0,0,0,1),this}compose(t,e,s){const i=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,f=a*c,x=o*h,g=o*l,b=o*c,w=s.x,_=s.y,M=s.z;return i[0]=(1-(m+f))*w,i[1]=(d+b)*w,i[2]=(p-g)*w,i[3]=0,i[4]=(d-b)*_,i[5]=(1-(u+f))*_,i[6]=(y+x)*_,i[7]=0,i[8]=(p+g)*M,i[9]=(y-x)*M,i[10]=(1-(u+m))*M,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,s){const i=this.elements;if(t.x=i[12],t.y=i[13],t.z=i[14],0===this.determinant())return s.set(1,1,1),e.identity(),this;let r=ht.set(i[0],i[1],i[2]).length();const n=ht.set(i[4],i[5],i[6]).length(),a=ht.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),lt.copy(this);const o=1/r,h=1/n,l=1/a;return lt.elements[0]*=o,lt.elements[1]*=o,lt.elements[2]*=o,lt.elements[4]*=h,lt.elements[5]*=h,lt.elements[6]*=h,lt.elements[8]*=l,lt.elements[9]*=l,lt.elements[10]*=l,e.setFromRotationMatrix(lt),s.x=r,s.y=n,s.z=a,this}makePerspective(t,e,s,i,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(s-i),u=(e+t)/(e-t),d=(s+i)/(s-i);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(2e3===a)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(2001!==a)throw new Error(\"THREE.Matrix4.makePerspective(): Invalid coordinate system: \"+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,s,i,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(s-i),u=-(e+t)/(e-t),d=-(s+i)/(s-i);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(2e3===a)p=-2/(n-r),m=-(n+r)/(n-r);else{if(2001!==a)throw new Error(\"THREE.Matrix4.makeOrthographic(): Invalid coordinate system: \"+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<16;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<16;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t[e+9]=s[9],t[e+10]=s[10],t[e+11]=s[11],t[e+12]=s[12],t[e+13]=s[13],t[e+14]=s[14],t[e+15]=s[15],t}}const ht=new M,lt=new ot,ct=new M(0,0,0),ut=new M(1,1,1),dt=new M,pt=new M,mt=new M,yt=new ot,ft=new _;class xt{constructor(t=0,e=0,s=0,i=xt.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=s,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,s,i=this._order){return this._x=t,this._y=e,this._z=s,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,s=!0){const i=t.elements,r=i[0],n=i[4],a=i[8],o=i[1],h=i[5],l=i[9],u=i[2],d=i[6],p=i[10];switch(e){case\"XYZ\":this._y=Math.asin(f(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,p),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(d,h),this._z=0);break;case\"YXZ\":this._x=Math.asin(-f(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,p),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-u,r),this._z=0);break;case\"ZXY\":this._x=Math.asin(f(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,p),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case\"ZYX\":this._y=Math.asin(-f(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case\"YZX\":this._z=Math.asin(f(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(a,p));break;case\"XZY\":this._z=Math.asin(-f(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(d,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,p),this._y=0);break;default:c(\"Euler: .setFromRotationMatrix() encountered an unknown order: \"+e)}return this._order=e,!0===s&&this._onChangeCallback(),this}setFromQuaternion(t,e,s){return yt.makeRotationFromQuaternion(t),this.setFromRotationMatrix(yt,e,s)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ft.setFromEuler(this),this.setFromQuaternion(ft,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}xt.DEFAULT_ORDER=\"XYZ\";class gt{constructor(){this.mask=1}set(t){this.mask=1<<t>>>0}enable(t){this.mask|=1<<t}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t}disable(t){this.mask&=~(1<<t)}disableAll(){this.mask=0}test(t){return 0!==(this.mask&t.mask)}isEnabled(t){return!!(this.mask&1<<t)}}let bt=0;const wt=new M,_t=new _,Mt=new ot,zt=new M,St=new M,At=new M,vt=new _,Tt=new M(1,0,0),Bt=new M(0,1,0),kt=new M(0,0,1),Pt={type:\"added\"},Ct={type:\"removed\"},Vt={type:\"childadded\",child:null},Ft={type:\"childremoved\",child:null};class It extends p{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,\"id\",{value:bt++}),this.uuid=y(),this.name=\"\",this.type=\"Object3D\",this.parent=null,this.children=[],this.up=It.DEFAULT_UP.clone();const t=new M,e=new xt,s=new _,i=new M(1,1,1);e._onChange(function(){s.setFromEuler(e,!1)}),s._onChange(function(){e.setFromQuaternion(s,void 0,!1)}),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:s},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new ot},normalMatrix:{value:new A}}),this.matrix=new ot,this.matrixWorld=new ot,this.matrixAutoUpdate=It.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=It.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new gt,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.customDepthMaterial=void 0,this.customDistanceMaterial=void 0,this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(t){return this.quaternion.premultiply(t),this}setRotationFromAxisAngle(t,e){this.quaternion.setFromAxisAngle(t,e)}setRotationFromEuler(t){this.quaternion.setFromEuler(t,!0)}setRotationFromMatrix(t){this.quaternion.setFromRotationMatrix(t)}setRotationFromQuaternion(t){this.quaternion.copy(t)}rotateOnAxis(t,e){return _t.setFromAxisAngle(t,e),this.quaternion.multiply(_t),this}rotateOnWorldAxis(t,e){return _t.setFromAxisAngle(t,e),this.quaternion.premultiply(_t),this}rotateX(t){return this.rotateOnAxis(Tt,t)}rotateY(t){return this.rotateOnAxis(Bt,t)}rotateZ(t){return this.rotateOnAxis(kt,t)}translateOnAxis(t,e){return wt.copy(t).applyQuaternion(this.quaternion),this.position.add(wt.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(Tt,t)}translateY(t){return this.translateOnAxis(Bt,t)}translateZ(t){return this.translateOnAxis(kt,t)}localToWorld(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(Mt.copy(this.matrixWorld).invert())}lookAt(t,e,s){t.isVector3?zt.copy(t):zt.set(t,e,s);const i=this.parent;this.updateWorldMatrix(!0,!1),St.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Mt.lookAt(St,zt,this.up):Mt.lookAt(zt,St,this.up),this.quaternion.setFromRotationMatrix(Mt),i&&(Mt.extractRotation(i.matrixWorld),_t.setFromRotationMatrix(Mt),this.quaternion.premultiply(_t.invert()))}add(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return t===this?(u(\"Object3D.add: object can't be added as a child of itself.\",t),this):(t&&t.isObject3D?(t.removeFromParent(),t.parent=this,this.children.push(t),t.dispatchEvent(Pt),Vt.child=t,this.dispatchEvent(Vt),Vt.child=null):u(\"Object3D.add: object not an instance of THREE.Object3D.\",t),this)}remove(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}const e=this.children.indexOf(t);return-1!==e&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(Ct),Ft.child=t,this.dispatchEvent(Ft),Ft.child=null),this}removeFromParent(){const t=this.parent;return null!==t&&t.remove(this),this}clear(){return this.remove(...this.children)}attach(t){return this.updateWorldMatrix(!0,!1),Mt.copy(this.matrixWorld).invert(),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),Mt.multiply(t.parent.matrixWorld)),t.applyMatrix4(Mt),t.removeFromParent(),t.parent=this,this.children.push(t),t.updateWorldMatrix(!1,!0),t.dispatchEvent(Pt),Vt.child=t,this.dispatchEvent(Vt),Vt.child=null,this}getObjectById(t){return this.getObjectByProperty(\"id\",t)}getObjectByName(t){return this.getObjectByProperty(\"name\",t)}getObjectByProperty(t,e){if(this[t]===e)return this;for(let s=0,i=this.children.length;s<i;s++){const i=this.children[s].getObjectByProperty(t,e);if(void 0!==i)return i}}getObjectsByProperty(t,e,s=[]){this[t]===e&&s.push(this);const i=this.children;for(let r=0,n=i.length;r<n;r++)i[r].getObjectsByProperty(t,e,s);return s}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(St,t,At),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(St,vt,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let s=0,i=e.length;s<i;s++)e[s].traverse(t)}traverseVisible(t){if(!1===this.visible)return;t(this);const e=this.children;for(let s=0,i=e.length;s<i;s++)e[s].traverseVisible(t)}traverseAncestors(t){const e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(!0===this.matrixWorldAutoUpdate&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,t=!0);const e=this.children;for(let s=0,i=e.length;s<i;s++)e[s].updateMatrixWorld(t)}updateWorldMatrix(t,e){const s=this.parent;if(!0===t&&null!==s&&s.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),!0===this.matrixWorldAutoUpdate&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),!0===e){const t=this.children;for(let e=0,s=t.length;e<s;e++)t[e].updateWorldMatrix(!1,!0)}}toJSON(t){const e=void 0===t||\"string\"==typeof t,s={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},s.metadata={version:4.7,type:\"Object\",generator:\"Object3D.toJSON\"});const i={};function r(e,s){return void 0===e[s.uuid]&&(e[s.uuid]=s.toJSON(t)),s.uuid}if(i.uuid=this.uuid,i.type=this.type,\"\"!==this.name&&(i.name=this.name),!0===this.castShadow&&(i.castShadow=!0),!0===this.receiveShadow&&(i.receiveShadow=!0),!1===this.visible&&(i.visible=!1),!1===this.frustumCulled&&(i.frustumCulled=!1),0!==this.renderOrder&&(i.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type=\"InstancedMesh\",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type=\"BatchedMesh\",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(t=>({...t})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(t),i.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(i.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(i.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(i.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const s=e.shapes;if(Array.isArray(s))for(let e=0,i=s.length;e<i;e++){const i=s[e];r(t.shapes,i)}else r(t.shapes,s)}}if(this.isSkinnedMesh&&(i.bindMode=this.bindMode,i.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(t.skeletons,this.skeleton),i.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const e=[];for(let s=0,i=this.material.length;s<i;s++)e.push(r(t.materials,this.material[s]));i.material=e}else i.material=r(t.materials,this.material);if(this.children.length>0){i.children=[];for(let e=0;e<this.children.length;e++)i.children.push(this.children[e].toJSON(t).object)}if(this.animations.length>0){i.animations=[];for(let e=0;e<this.animations.length;e++){const s=this.animations[e];i.animations.push(r(t.animations,s))}}if(e){const e=n(t.geometries),i=n(t.materials),r=n(t.textures),a=n(t.images),o=n(t.shapes),h=n(t.skeletons),l=n(t.animations),c=n(t.nodes);e.length>0&&(s.geometries=e),i.length>0&&(s.materials=i),r.length>0&&(s.textures=r),a.length>0&&(s.images=a),o.length>0&&(s.shapes=o),h.length>0&&(s.skeletons=h),l.length>0&&(s.animations=l),c.length>0&&(s.nodes=c)}return s.object=i,s;function n(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e<t.children.length;e++){const s=t.children[e];this.add(s.clone())}return this}}It.DEFAULT_UP=new M(0,1,0),It.DEFAULT_MATRIX_AUTO_UPDATE=!0,It.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;const Et=new M,Ut=new M,Nt=new M,Ot=new M,qt=new M,Rt=new M,Wt=new M,Dt=new M,Lt=new M,jt=new M,Ht=new W,Yt=new W,Xt=new W;class Gt{constructor(t=new M,e=new M,s=new M){this.a=t,this.b=e,this.c=s}static getNormal(t,e,s,i){i.subVectors(s,e),Et.subVectors(t,e),i.cross(Et);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,s,i,r){Et.subVectors(i,e),Ut.subVectors(s,e),Nt.subVectors(t,e);const n=Et.dot(Et),a=Et.dot(Ut),o=Et.dot(Nt),h=Ut.dot(Ut),l=Ut.dot(Nt),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,s,i){return null!==this.getBarycoord(t,e,s,i,Ot)&&Ot.x>=0&&Ot.y>=0&&Ot.x+Ot.y<=1}static getInterpolation(t,e,s,i,r,n,a,o){return null===this.getBarycoord(t,e,s,i,Ot)?(o.x=0,o.y=0,\"z\"in o&&(o.z=0),\"w\"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Ot.x),o.addScaledVector(n,Ot.y),o.addScaledVector(a,Ot.z),o)}static getInterpolatedAttribute(t,e,s,i,r,n){return Ht.setScalar(0),Yt.setScalar(0),Xt.setScalar(0),Ht.fromBufferAttribute(t,e),Yt.fromBufferAttribute(t,s),Xt.fromBufferAttribute(t,i),n.setScalar(0),n.addScaledVector(Ht,r.x),n.addScaledVector(Yt,r.y),n.addScaledVector(Xt,r.z),n}static isFrontFacing(t,e,s,i){return Et.subVectors(s,e),Ut.subVectors(t,e),Et.cross(Ut).dot(i)<0}set(t,e,s){return this.a.copy(t),this.b.copy(e),this.c.copy(s),this}setFromPointsAndIndices(t,e,s,i){return this.a.copy(t[e]),this.b.copy(t[s]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,s,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,s),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Et.subVectors(this.c,this.b),Ut.subVectors(this.a,this.b),.5*Et.cross(Ut).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Gt.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Gt.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,s,i,r){return Gt.getInterpolation(t,this.a,this.b,this.c,e,s,i,r)}containsPoint(t){return Gt.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Gt.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const s=this.a,i=this.b,r=this.c;let n,a;qt.subVectors(i,s),Rt.subVectors(r,s),Dt.subVectors(t,s);const o=qt.dot(Dt),h=Rt.dot(Dt);if(o<=0&&h<=0)return e.copy(s);Lt.subVectors(t,i);const l=qt.dot(Lt),c=Rt.dot(Lt);if(l>=0&&c<=l)return e.copy(i);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(s).addScaledVector(qt,n);jt.subVectors(t,r);const d=qt.dot(jt),p=Rt.dot(jt);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(s).addScaledVector(Rt,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return Wt.subVectors(r,i),a=(c-l)/(c-l+(d-p)),e.copy(i).addScaledVector(Wt,a);const f=1/(y+m+u);return n=m*f,a=u*f,e.copy(s).addScaledVector(qt,n).addScaledVector(Rt,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Zt={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Jt={h:0,s:0,l:0},$t={h:0,s:0,l:0};function Qt(t,e,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+6*(e-t)*(2/3-s):t}class Kt{constructor(t,e,s){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,s)}set(t,e,s){if(void 0===e&&void 0===s){const e=t;e&&e.isColor?this.copy(e):\"number\"==typeof e?this.setHex(e):\"string\"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,s);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=r){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,P.colorSpaceToWorking(this,e),this}setRGB(t,e,s,i=P.workingColorSpace){return this.r=t,this.g=e,this.b=s,P.colorSpaceToWorking(this,i),this}setHSL(t,e,s,i=P.workingColorSpace){if(t=(t%(r=1)+r)%r,e=f(e,0,1),s=f(s,0,1),0===e)this.r=this.g=this.b=s;else{const i=s<=.5?s*(1+e):s+e-s*e,r=2*s-i;this.r=Qt(r,i,t+1/3),this.g=Qt(r,i,t),this.b=Qt(r,i,t-1/3)}var r;return P.colorSpaceToWorking(this,i),this}setStyle(t,e=r){function s(e){void 0!==e&&parseFloat(e)<1&&c(\"Color: Alpha component of \"+t+\" will be ignored.\")}let i;if(i=/^(\\w+)\\(([^\\)]*)\\)/.exec(t)){let r;const n=i[1],a=i[2];switch(n){case\"rgb\":case\"rgba\":if(r=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return s(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return s(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case\"hsl\":case\"hsla\":if(r=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return s(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:c(\"Color: Unknown color model \"+t)}}else if(i=/^\\#([A-Fa-f\\d]+)$/.exec(t)){const s=i[1],r=s.length;if(3===r)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(s,16),e);c(\"Color: Invalid hex color \"+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=r){const s=Zt[t.toLowerCase()];return void 0!==s?this.setHex(s,e):c(\"Color: Unknown color \"+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=C(t.r),this.g=C(t.g),this.b=C(t.b),this}copyLinearToSRGB(t){return this.r=V(t.r),this.g=V(t.g),this.b=V(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=r){return P.workingToColorSpace(te.copy(this),t),65536*Math.round(f(255*te.r,0,255))+256*Math.round(f(255*te.g,0,255))+Math.round(f(255*te.b,0,255))}getHexString(t=r){return(\"000000\"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=P.workingColorSpace){P.workingToColorSpace(te.copy(this),e);const s=te.r,i=te.g,r=te.b,n=Math.max(s,i,r),a=Math.min(s,i,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case s:o=(i-r)/t+(i<r?6:0);break;case i:o=(r-s)/t+2;break;case r:o=(s-i)/t+4}o/=6}return t.h=o,t.s=h,t.l=l,t}getRGB(t,e=P.workingColorSpace){return P.workingToColorSpace(te.copy(this),e),t.r=te.r,t.g=te.g,t.b=te.b,t}getStyle(t=r){P.workingToColorSpace(te.copy(this),t);const e=te.r,s=te.g,i=te.b;return t!==r?`color(${t} ${e.toFixed(3)} ${s.toFixed(3)} ${i.toFixed(3)})`:`rgb(${Math.round(255*e)},${Math.round(255*s)},${Math.round(255*i)})`}offsetHSL(t,e,s){return this.getHSL(Jt),this.setHSL(Jt.h+t,Jt.s+e,Jt.l+s)}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,s){return this.r=t.r+(e.r-t.r)*s,this.g=t.g+(e.g-t.g)*s,this.b=t.b+(e.b-t.b)*s,this}lerpHSL(t,e){this.getHSL(Jt),t.getHSL($t);const s=x(Jt.h,$t.h,e),i=x(Jt.s,$t.s,e),r=x(Jt.l,$t.l,e);return this.setHSL(s,i,r),this}setFromVector3(t){return this.r=t.x,this.g=t.y,this.b=t.z,this}applyMatrix3(t){const e=this.r,s=this.g,i=this.b,r=t.elements;return this.r=r[0]*e+r[3]*s+r[6]*i,this.g=r[1]*e+r[4]*s+r[7]*i,this.b=r[2]*e+r[5]*s+r[8]*i,this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const te=new Kt;Kt.NAMES=Zt;const ee=new M,se=new w;let ie=0;class re{constructor(t,e,s=!1){if(Array.isArray(t))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.isBufferAttribute=!0,Object.defineProperty(this,\"id\",{value:ie++}),this.name=\"\",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=s,this.usage=35044,this.updateRanges=[],this.gpuType=1015,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,s){t*=this.itemSize,s*=e.itemSize;for(let i=0,r=this.itemSize;i<r;i++)this.array[t+i]=e.array[s+i];return this}copyArray(t){return this.array.set(t),this}applyMatrix3(t){if(2===this.itemSize)for(let e=0,s=this.count;e<s;e++)se.fromBufferAttribute(this,e),se.applyMatrix3(t),this.setXY(e,se.x,se.y);else if(3===this.itemSize)for(let e=0,s=this.count;e<s;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix3(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyMatrix4(t){for(let e=0,s=this.count;e<s;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix4(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyNormalMatrix(t){for(let e=0,s=this.count;e<s;e++)ee.fromBufferAttribute(this,e),ee.applyNormalMatrix(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}transformDirection(t){for(let e=0,s=this.count;e<s;e++)ee.fromBufferAttribute(this,e),ee.transformDirection(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}set(t,e=0){return this.array.set(t,e),this}getComponent(t,e){let s=this.array[t*this.itemSize+e];return this.normalized&&(s=g(s,this.array)),s}setComponent(t,e,s){return this.normalized&&(s=b(s,this.array)),this.array[t*this.itemSize+e]=s,this}getX(t){let e=this.array[t*this.itemSize];return this.normalized&&(e=g(e,this.array)),e}setX(t,e){return this.normalized&&(e=b(e,this.array)),this.array[t*this.itemSize]=e,this}getY(t){let e=this.array[t*this.itemSize+1];return this.normalized&&(e=g(e,this.array)),e}setY(t,e){return this.normalized&&(e=b(e,this.array)),this.array[t*this.itemSize+1]=e,this}getZ(t){let e=this.array[t*this.itemSize+2];return this.normalized&&(e=g(e,this.array)),e}setZ(t,e){return this.normalized&&(e=b(e,this.array)),this.array[t*this.itemSize+2]=e,this}getW(t){let e=this.array[t*this.itemSize+3];return this.normalized&&(e=g(e,this.array)),e}setW(t,e){return this.normalized&&(e=b(e,this.array)),this.array[t*this.itemSize+3]=e,this}setXY(t,e,s){return t*=this.itemSize,this.normalized&&(e=b(e,this.array),s=b(s,this.array)),this.array[t+0]=e,this.array[t+1]=s,this}setXYZ(t,e,s,i){return t*=this.itemSize,this.normalized&&(e=b(e,this.array),s=b(s,this.array),i=b(i,this.array)),this.array[t+0]=e,this.array[t+1]=s,this.array[t+2]=i,this}setXYZW(t,e,s,i,r){return t*=this.itemSize,this.normalized&&(e=b(e,this.array),s=b(s,this.array),i=b(i,this.array),r=b(r,this.array)),this.array[t+0]=e,this.array[t+1]=s,this.array[t+2]=i,this.array[t+3]=r,this}onUpload(t){return this.onUploadCallback=t,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const t={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return\"\"!==this.name&&(t.name=this.name),35044!==this.usage&&(t.usage=this.usage),t}}const ne=new M,ae=new M,oe=new A;class he{constructor(t=new M(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,s,i){return this.normal.set(t,e,s),this.constant=i,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,s){const i=ne.subVectors(s,e).cross(ae.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(i,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(t).addScaledVector(this.normal,-this.distanceToPoint(t))}intersectLine(t,e){const s=t.delta(ne),i=this.normal.dot(s);if(0===i)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;const r=-(t.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:e.copy(t.start).addScaledVector(s,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),s=this.distanceToPoint(t.end);return e<0&&s>0||s<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const s=e||oe.getNormalMatrix(t),i=this.coplanarPoint(ne).applyMatrix4(t),r=this.normal.applyMatrix3(s).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}function le(t,e){return t&&t.constructor!==e?\"number\"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}class ce{constructor(t,e,s,i){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==i?i:new e.constructor(s),this.sampleValues=e,this.valueSize=s,this.settings=null,this.DefaultSettings_={}}evaluate(t){const e=this.parameterPositions;let s=this._cachedIndex,i=e[s],r=e[s-1];t:{e:{let n;s:{i:if(!(t<i)){for(let n=s+2;;){if(void 0===i){if(t<r)break i;return s=e.length,this._cachedIndex=s,this.copySampleValue_(s-1)}if(s===n)break;if(r=i,i=e[++s],t<i)break e}n=e.length;break s}if(!(t>=r)){const a=e[1];t<a&&(s=2,r=a);for(let n=s-2;;){if(void 0===r)return this._cachedIndex=0,this.copySampleValue_(0);if(s===n)break;if(i=r,r=e[--s-1],t>=r)break e}n=s,s=0;break s}break t}for(;s<n;){const i=s+n>>>1;t<e[i]?n=i:s=i+1}if(i=e[s],r=e[s-1],void 0===r)return this._cachedIndex=0,this.copySampleValue_(0);if(void 0===i)return s=e.length,this._cachedIndex=s,this.copySampleValue_(s-1)}this._cachedIndex=s,this.intervalChanged_(s,r,i)}return this.interpolate_(s,r,t,i)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(t){const e=this.resultBuffer,s=this.sampleValues,i=this.valueSize,r=t*i;for(let t=0;t!==i;++t)e[t]=s[r+t];return e}interpolate_(){throw new Error(\"call to abstract method\")}intervalChanged_(){}}class ue extends ce{constructor(t,e,s,i){super(t,e,s,i),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:2400,endingEnd:2400}}intervalChanged_(t,e,s){const i=this.parameterPositions;let r=t-2,n=t+1,a=i[r],o=i[n];if(void 0===a)switch(this.getSettings_().endingStart){case 2401:r=t,a=2*e-s;break;case 2402:r=i.length-2,a=e+i[r]-i[r+1];break;default:r=t,a=s}if(void 0===o)switch(this.getSettings_().endingEnd){case 2401:n=t,o=2*s-e;break;case 2402:n=1,o=s+i[1]-i[0];break;default:n=t-1,o=e}const h=.5*(s-e),l=this.valueSize;this._weightPrev=h/(e-a),this._weightNext=h/(o-s),this._offsetPrev=r*l,this._offsetNext=n*l}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=t*a,h=o-a,l=this._offsetPrev,c=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(s-e)/(i-e),m=p*p,y=m*p,f=-u*y+2*u*m-u*p,x=(1+u)*y+(-1.5-2*u)*m+(-.5+u)*p+1,g=(-1-d)*y+(1.5+d)*m+.5*p,b=d*y-d*m;for(let t=0;t!==a;++t)r[t]=f*n[l+t]+x*n[h+t]+g*n[o+t]+b*n[c+t];return r}}class de extends ce{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=t*a,h=o-a,l=(s-e)/(i-e),c=1-l;for(let t=0;t!==a;++t)r[t]=n[h+t]*c+n[o+t]*l;return r}}class pe extends ce{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t){return this.copySampleValue_(t-1)}}class me{constructor(t,e,s,i){if(void 0===t)throw new Error(\"THREE.KeyframeTrack: track name is undefined\");if(void 0===e||0===e.length)throw new Error(\"THREE.KeyframeTrack: no keyframes in track named \"+t);this.name=t,this.times=le(e,this.TimeBufferType),this.values=le(s,this.ValueBufferType),this.setInterpolation(i||this.DefaultInterpolation)}static toJSON(t){const e=t.constructor;let s;if(e.toJSON!==this.toJSON)s=e.toJSON(t);else{s={name:t.name,times:le(t.times,Array),values:le(t.values,Array)};const e=t.getInterpolation();e!==t.DefaultInterpolation&&(s.interpolation=e)}return s.type=t.ValueTypeName,s}InterpolantFactoryMethodDiscrete(t){return new pe(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodLinear(t){return new de(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodSmooth(t){return new ue(this.times,this.values,this.getValueSize(),t)}setInterpolation(t){let r;switch(t){case e:r=this.InterpolantFactoryMethodDiscrete;break;case s:r=this.InterpolantFactoryMethodLinear;break;case i:r=this.InterpolantFactoryMethodSmooth}if(void 0===r){const e=\"unsupported interpolation for \"+this.ValueTypeName+\" keyframe track named \"+this.name;if(void 0===this.createInterpolant){if(t===this.DefaultInterpolation)throw new Error(e);this.setInterpolation(this.DefaultInterpolation)}return c(\"KeyframeTrack:\",e),this}return this.createInterpolant=r,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return e;case this.InterpolantFactoryMethodLinear:return s;case this.InterpolantFactoryMethodSmooth:return i}}getValueSize(){return this.values.length/this.times.length}shift(t){if(0!==t){const e=this.times;for(let s=0,i=e.length;s!==i;++s)e[s]+=t}return this}scale(t){if(1!==t){const e=this.times;for(let s=0,i=e.length;s!==i;++s)e[s]*=t}return this}trim(t,e){const s=this.times,i=s.length;let r=0,n=i-1;for(;r!==i&&s[r]<t;)++r;for(;-1!==n&&s[n]>e;)--n;if(++n,0!==r||n!==i){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=s.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(u(\"KeyframeTrack: Invalid value size in track.\",this),t=!1);const s=this.times,i=this.values,r=s.length;0===r&&(u(\"KeyframeTrack: Track is empty.\",this),t=!1);let n=null;for(let e=0;e!==r;e++){const i=s[e];if(\"number\"==typeof i&&isNaN(i)){u(\"KeyframeTrack: Time is not a valid number.\",this,e,i),t=!1;break}if(null!==n&&n>i){u(\"KeyframeTrack: Out of order keys.\",this,e,i,n),t=!1;break}n=i}if(void 0!==i&&(a=i,ArrayBuffer.isView(a)&&!(a instanceof DataView)))for(let e=0,s=i.length;e!==s;++e){const s=i[e];if(isNaN(s)){u(\"KeyframeTrack: Value is not a valid number.\",this,e,s),t=!1;break}}var a;return t}optimize(){const t=this.times.slice(),e=this.values.slice(),s=this.getValueSize(),r=this.getInterpolation()===i,n=t.length-1;let a=1;for(let i=1;i<n;++i){let n=!1;const o=t[i];if(o!==t[i+1]&&(1!==i||o!==t[0]))if(r)n=!0;else{const t=i*s,r=t-s,a=t+s;for(let i=0;i!==s;++i){const s=e[t+i];if(s!==e[r+i]||s!==e[a+i]){n=!0;break}}}if(n){if(i!==a){t[a]=t[i];const r=i*s,n=a*s;for(let t=0;t!==s;++t)e[n+t]=e[r+t]}++a}}if(n>0){t[a]=t[n];for(let t=n*s,i=a*s,r=0;r!==s;++r)e[i+r]=e[t+r];++a}return a!==t.length?(this.times=t.slice(0,a),this.values=e.slice(0,a*s)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),s=new(0,this.constructor)(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}}me.prototype.ValueTypeName=\"\",me.prototype.TimeBufferType=Float32Array,me.prototype.ValueBufferType=Float32Array,me.prototype.DefaultInterpolation=s;class ye extends me{constructor(t,e,s){super(t,e,s)}}ye.prototype.ValueTypeName=\"bool\",ye.prototype.ValueBufferType=Array,ye.prototype.DefaultInterpolation=e,ye.prototype.InterpolantFactoryMethodLinear=void 0,ye.prototype.InterpolantFactoryMethodSmooth=void 0;(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName=\"color\";(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName=\"number\";class fe extends ce{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(s-e)/(i-e);let h=t*a;for(let t=h+a;h!==t;h+=4)_.slerpFlat(r,0,n,h-a,n,h,o);return r}}class xe extends me{constructor(t,e,s,i){super(t,e,s,i)}InterpolantFactoryMethodLinear(t){return new fe(this.times,this.values,this.getValueSize(),t)}}xe.prototype.ValueTypeName=\"quaternion\",xe.prototype.InterpolantFactoryMethodSmooth=void 0;class ge extends me{constructor(t,e,s){super(t,e,s)}}ge.prototype.ValueTypeName=\"string\",ge.prototype.ValueBufferType=Array,ge.prototype.DefaultInterpolation=e,ge.prototype.InterpolantFactoryMethodLinear=void 0,ge.prototype.InterpolantFactoryMethodSmooth=void 0;(class extends me{constructor(t,e,s,i){super(t,e,s,i)}}).prototype.ValueTypeName=\"vector\";Error,new WeakMap,new WeakMap;const be=\"\\\\[\\\\]\\\\.:\\\\/\",we=new RegExp(\"[\"+be+\"]\",\"g\"),_e=\"[^\"+be+\"]\",Me=\"[^\"+be.replace(\"\\\\.\",\"\")+\"]\",ze=new RegExp(\"^\"+/((?:WC+[\\/:])*)/.source.replace(\"WC\",_e)+/(WCOD+)?/.source.replace(\"WCOD\",Me)+/(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace(\"WC\",_e)+/\\.(WC+)(?:\\[(.+)\\])?/.source.replace(\"WC\",_e)+\"$\"),Se=[\"material\",\"materials\",\"bones\",\"map\"];class Ae{constructor(t,e,s){this.path=e,this.parsedPath=s||Ae.parseTrackName(e),this.node=Ae.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,s){return t&&t.isAnimationObjectGroup?new Ae.Composite(t,e,s):new Ae(t,e,s)}static sanitizeNodeName(t){return t.replace(/\\s/g,\"_\").replace(we,\"\")}static parseTrackName(t){const e=ze.exec(t);if(null===e)throw new Error(\"PropertyBinding: Cannot parse trackName: \"+t);const s={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=s.nodeName&&s.nodeName.lastIndexOf(\".\");if(void 0!==i&&-1!==i){const t=s.nodeName.substring(i+1);-1!==Se.indexOf(t)&&(s.nodeName=s.nodeName.substring(0,i),s.objectName=t)}if(null===s.propertyName||0===s.propertyName.length)throw new Error(\"PropertyBinding: can not parse propertyName from trackName: \"+t);return s}static findNode(t,e){if(void 0===e||\"\"===e||\".\"===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const s=t.skeleton.getBoneByName(e);if(void 0!==s)return s}if(t.children){const s=function(t){for(let i=0;i<t.length;i++){const r=t[i];if(r.name===e||r.uuid===e)return r;const n=s(r.children);if(n)return n}return null},i=s(t.children);if(i)return i}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(t,e){t[e]=this.targetObject[this.propertyName]}_getValue_array(t,e){const s=this.resolvedProperty;for(let i=0,r=s.length;i!==r;++i)t[e++]=s[i]}_getValue_arrayElement(t,e){t[e]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(t,e){this.resolvedProperty.toArray(t,e)}_setValue_direct(t,e){this.targetObject[this.propertyName]=t[e]}_setValue_direct_setNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(t,e){const s=this.resolvedProperty;for(let i=0,r=s.length;i!==r;++i)s[i]=t[e++]}_setValue_array_setNeedsUpdate(t,e){const s=this.resolvedProperty;for(let i=0,r=s.length;i!==r;++i)s[i]=t[e++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(t,e){const s=this.resolvedProperty;for(let i=0,r=s.length;i!==r;++i)s[i]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(t,e){this.resolvedProperty[this.propertyIndex]=t[e]}_setValue_arrayElement_setNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(t,e){this.resolvedProperty.fromArray(t,e)}_setValue_fromArray_setNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(t,e){this.bind(),this.getValue(t,e)}_setValue_unbound(t,e){this.bind(),this.setValue(t,e)}bind(){let t=this.node;const e=this.parsedPath,s=e.objectName,i=e.propertyName;let r=e.propertyIndex;if(t||(t=Ae.findNode(this.rootNode,e.nodeName),this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!t)return void c(\"PropertyBinding: No target node found for track: \"+this.path+\".\");if(s){let i=e.objectIndex;switch(s){case\"materials\":if(!t.material)return void u(\"PropertyBinding: Can not bind to material as node does not have a material.\",this);if(!t.material.materials)return void u(\"PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.\",this);t=t.material.materials;break;case\"bones\":if(!t.skeleton)return void u(\"PropertyBinding: Can not bind to bones as node does not have a skeleton.\",this);t=t.skeleton.bones;for(let e=0;e<t.length;e++)if(t[e].name===i){i=e;break}break;case\"map\":if(\"map\"in t){t=t.map;break}if(!t.material)return void u(\"PropertyBinding: Can not bind to material as node does not have a material.\",this);if(!t.material.map)return void u(\"PropertyBinding: Can not bind to material.map as node.material does not have a map.\",this);t=t.material.map;break;default:if(void 0===t[s])return void u(\"PropertyBinding: Can not bind to objectName of node undefined.\",this);t=t[s]}if(void 0!==i){if(void 0===t[i])return void u(\"PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.\",this,t);t=t[i]}}const n=t[i];if(void 0===n)return void u(\"PropertyBinding: Trying to update property for track: \"+e.nodeName+\".\"+i+\" but it wasn't found.\",t);let a=this.Versioning.None;this.targetObject=t,!0===t.isMaterial?a=this.Versioning.NeedsUpdate:!0===t.isObject3D&&(a=this.Versioning.MatrixWorldNeedsUpdate);let o=this.BindingType.Direct;if(void 0!==r){if(\"morphTargetInfluences\"===i){if(!t.geometry)return void u(\"PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.\",this);if(!t.geometry.morphAttributes)return void u(\"PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.\",this);void 0!==t.morphTargetDictionary[r]&&(r=t.morphTargetDictionary[r])}o=this.BindingType.ArrayElement,this.resolvedProperty=n,this.propertyIndex=r}else void 0!==n.fromArray&&void 0!==n.toArray?(o=this.BindingType.HasFromToArray,this.resolvedProperty=n):Array.isArray(n)?(o=this.BindingType.EntireArray,this.resolvedProperty=n):this.propertyName=i;this.getValue=this.GetterByBindingType[o],this.setValue=this.SetterByBindingTypeAndVersioning[o][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}Ae.Composite=class{constructor(t,e,s){const i=s||Ae.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,i)}getValue(t,e){this.bind();const s=this._targetGroup.nCachedObjects_,i=this._bindings[s];void 0!==i&&i.getValue(t,e)}setValue(t,e){const s=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=s.length;i!==r;++i)s[i].setValue(t,e)}bind(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,s=t.length;e!==s;++e)t[e].bind()}unbind(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,s=t.length;e!==s;++e)t[e].unbind()}},Ae.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Ae.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},Ae.prototype.GetterByBindingType=[Ae.prototype._getValue_direct,Ae.prototype._getValue_array,Ae.prototype._getValue_arrayElement,Ae.prototype._getValue_toArray],Ae.prototype.SetterByBindingTypeAndVersioning=[[Ae.prototype._setValue_direct,Ae.prototype._setValue_direct_setNeedsUpdate,Ae.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[Ae.prototype._setValue_array,Ae.prototype._setValue_array_setNeedsUpdate,Ae.prototype._setValue_array_setMatrixWorldNeedsUpdate],[Ae.prototype._setValue_arrayElement,Ae.prototype._setValue_arrayElement_setNeedsUpdate,Ae.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[Ae.prototype._setValue_fromArray,Ae.prototype._setValue_fromArray_setNeedsUpdate,Ae.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]],new Float32Array(1);const ve=new M,Te=new M,Be=new M,ke=new M,Pe=new M,Ce=new M,Ve=new M;class Fe{constructor(t=new M,e=new M){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){ve.subVectors(t,this.start),Te.subVectors(this.end,this.start);const s=Te.dot(Te);let i=Te.dot(ve)/s;return e&&(i=f(i,0,1)),i}closestPointToPoint(t,e,s){const i=this.closestPointToPointParameter(t,e);return this.delta(s).multiplyScalar(i).add(this.start)}distanceSqToLine3(t,e=Ce,s=Ve){const i=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;Be.subVectors(h,a),ke.subVectors(l,o),Pe.subVectors(a,o);const c=Be.dot(Be),u=ke.dot(ke),d=ke.dot(Pe);if(c<=i&&u<=i)return e.copy(a),s.copy(o),e.sub(s),e.dot(e);if(c<=i)r=0,n=d/u,n=f(n,0,1);else{const t=Be.dot(Pe);if(u<=i)n=0,r=f(-t/c,0,1);else{const e=Be.dot(ke),s=c*u-e*e;r=0!==s?f((e*d-t*u)/s,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=f(-t/c,0,1)):n>1&&(n=1,r=f((e-t)/c,0,1))}}return e.copy(a).add(Be.multiplyScalar(r)),s.copy(o).add(ke.multiplyScalar(n)),e.sub(s),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}\"undefined\"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"register\",{detail:{revision:t}})),\"undefined\"!=typeof window&&(window.__THREE__?c(\"WARNING: Multiple instances of Three.js being imported.\"):window.__THREE__=t);const Ie=1.25,Ee=65535,Ue=Math.pow(2,-24),Ne=Symbol(\"SKIP_GENERATION\");function Oe(t){return function(t){return t.index?t.index.count:t.attributes.position.count}(t)/3}function qe(t,e){const s=Oe(t),i=e||t.drawRange,r=i.start/3,n=(i.start+i.count)/3,a=Math.max(0,r),o=Math.min(s,n)-a;return[{offset:Math.floor(a),count:Math.floor(o)}]}function Re(t,e){if(!t.groups||!t.groups.length)return qe(t,e);const s=[],i=new Set,r=e||t.drawRange,n=r.start/3,a=(r.start+r.count)/3;for(const e of t.groups){const t=e.start/3,s=(e.start+e.count)/3;i.add(Math.max(n,t)),i.add(Math.min(a,s))}const o=Array.from(i.values()).sort((t,e)=>t-e);for(let t=0;t<o.length-1;t++){const e=o[t],i=o[t+1];s.push({offset:Math.floor(e),count:Math.floor(i-e)})}return s}function We(t,e,s,i,r){let n=1/0,a=1/0,o=1/0,h=-1/0,l=-1/0,c=-1/0,u=1/0,d=1/0,p=1/0,m=-1/0,y=-1/0,f=-1/0;for(let i=6*e,r=6*(e+s);i<r;i+=6){const e=t[i+0],s=t[i+1],r=e-s,x=e+s;r<n&&(n=r),x>h&&(h=x),e<u&&(u=e),e>m&&(m=e);const g=t[i+2],b=t[i+3],w=g-b,_=g+b;w<a&&(a=w),_>l&&(l=_),g<d&&(d=g),g>y&&(y=g);const M=t[i+4],z=t[i+5],S=M-z,A=M+z;S<o&&(o=S),A>c&&(c=A),M<p&&(p=M),M>f&&(f=M)}i[0]=n,i[1]=a,i[2]=o,i[3]=h,i[4]=l,i[5]=c,r[0]=u,r[1]=d,r[2]=p,r[3]=m,r[4]=y,r[5]=f}function De(t,e,s){return s.min.x=e[t],s.min.y=e[t+1],s.min.z=e[t+2],s.max.x=e[t+3],s.max.y=e[t+4],s.max.z=e[t+5],s}function Le(t){let e=-1,s=-1/0;for(let i=0;i<3;i++){const r=t[i+3]-t[i];r>s&&(s=r,e=i)}return e}function je(t,e){e.set(t)}function He(t,e,s){let i,r;for(let n=0;n<3;n++){const a=n+3;i=t[n],r=e[n],s[n]=i<r?i:r,i=t[a],r=e[a],s[a]=i>r?i:r}}function Ye(t,e,s){for(let i=0;i<3;i++){const r=e[t+2*i],n=e[t+2*i+1],a=r-n,o=r+n;a<s[i]&&(s[i]=a),o>s[i+3]&&(s[i+3]=o)}}function Xe(t){const e=t[3]-t[0],s=t[4]-t[1],i=t[5]-t[2];return 2*(e*s+s*i+i*e)}const Ge=(t,e)=>t.candidate-e.candidate,Ze=new Array(32).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),Je=new Float32Array(6);class $e{constructor(){this.boundingData=new Float32Array(6)}}function Qe(t,e,s,i,r,n){let a=i,o=i+r-1;const h=n.pos,l=2*n.axis;for(;;){for(;a<=o&&s[6*a+l]<h;)a++;for(;a<=o&&s[6*o+l]>=h;)o--;if(!(a<o))return a;for(let t=0;t<3;t++){let s=e[3*a+t];e[3*a+t]=e[3*o+t],e[3*o+t]=s}for(let t=0;t<6;t++){let e=s[6*a+t];s[6*a+t]=s[6*o+t],s[6*o+t]=e}a++,o--}}function Ke(t,e,s,i,r,n){let a=i,o=i+r-1;const h=n.pos,l=2*n.axis;for(;;){for(;a<=o&&s[6*a+l]<h;)a++;for(;a<=o&&s[6*o+l]>=h;)o--;if(!(a<o))return a;{let e=t[a];t[a]=t[o],t[o]=e;for(let t=0;t<6;t++){let e=s[6*a+t];s[6*a+t]=s[6*o+t],s[6*o+t]=e}a++,o--}}}function ts(t,e){return 65535===e[t+15]}function es(t,e){return e[t+6]}function ss(t,e){return e[t+14]}function is(t){return t+8}function rs(t,e){return e[t+6]}function ns(t,e){return e[t+7]}function as(t){return t}let os,hs,ls,cs;const us=Math.pow(2,32);function ds(t){return\"count\"in t?1:1+ds(t.left)+ds(t.right)}function ps(t,e,s){return os=new Float32Array(s),hs=new Uint32Array(s),ls=new Uint16Array(s),cs=new Uint8Array(s),ms(t,e)}function ms(t,e){const s=t/4,i=t/2,r=\"count\"in e,n=e.boundingData;for(let t=0;t<6;t++)os[s+t]=n[t];if(r){if(e.buffer){const i=e.buffer;cs.set(new Uint8Array(i),t);for(let e=t,r=t+i.byteLength;e<r;e+=32)ts(e/2,ls)||(hs[e/4+6]+=s);return t+i.byteLength}{const r=e.offset,n=e.count;return hs[s+6]=r,ls[i+14]=n,ls[i+15]=Ee,t+32}}{const i=e.left,r=e.right,n=e.splitAxis;let a;if(a=ms(t+32,i),a/4>us)throw new Error(\"MeshBVH: Cannot store child pointer greater than 32 bits.\");return hs[s+6]=a/4,a=ms(a,r),hs[s+7]=n,a}}function ys(t,e){const s=t.geometry;e.indirect&&(t._indirectBuffer=function(t,e){const s=(t.index?t.index.count:t.attributes.position.count)/3,i=s>65536,r=i?4:2,n=e?new SharedArrayBuffer(s*r):new ArrayBuffer(s*r),a=i?new Uint32Array(n):new Uint16Array(n);for(let t=0,e=a.length;t<e;t++)a[t]=t;return a}(s,e.useSharedArrayBuffer),function(t,e){const s=Oe(t),i=Re(t,e).sort((t,e)=>t.offset-e.offset),r=i[i.length-1];r.count=Math.min(s-r.offset,r.count);let n=0;return i.forEach(({count:t})=>n+=t),s!==n}(s,e.range)&&!e.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the \"indirect\" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),t._indirectBuffer||function(t,e){if(!t.index){const s=t.attributes.position.count,i=function(t,e=ArrayBuffer){return t>65535?new Uint32Array(new e(4*t)):new Uint16Array(new e(2*t))}(s,e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer);t.setIndex(new re(i,1));for(let t=0;t<s;t++)i[t]=t}}(s,e);const i=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,r=function(t,e=null,s=null,i=null){const r=t.attributes.position,n=t.index?t.index.array:null,a=Oe(t),o=r.normalized;let h;null===e?(h=new Float32Array(6*a),s=0,i=a):(h=e,s=s||0,i=i||a);const l=r.array,c=r.offset||0;let u=3;r.isInterleavedBufferAttribute&&(u=r.data.stride);const d=[\"getX\",\"getY\",\"getZ\"];for(let t=s;t<s+i;t++){const e=3*t,s=6*t;let i=e+0,a=e+1,p=e+2;n&&(i=n[i],a=n[a],p=n[p]),o||(i=i*u+c,a=a*u+c,p=p*u+c);for(let t=0;t<3;t++){let e,n,c;o?(e=r[d[t]](i),n=r[d[t]](a),c=r[d[t]](p)):(e=l[i+t],n=l[a+t],c=l[p+t]);let u=e;n<u&&(u=n),c<u&&(u=c);let m=e;n>m&&(m=n),c>m&&(m=c);const y=(m-u)/2,f=2*t;h[s+f+0]=u+y,h[s+f+1]=y+(Math.abs(u)+y)*Ue}}return h}(s),n=e.indirect?qe(s,e.range):Re(s,e.range);t._roots=n.map(s=>{const n=function(t,e,s,i,r){const{maxDepth:n,verbose:a,maxLeafTris:o,strategy:h,onProgress:l,indirect:c}=r,u=t._indirectBuffer,d=t.geometry,p=d.index?d.index.array:null,m=c?Ke:Qe,y=Oe(d),f=new Float32Array(6);let x=!1;const g=new $e;return We(e,s,i,g.boundingData,f),function t(s,i,r,l=null,c=0){if(!x&&c>=n&&(x=!0,a&&(console.warn(`MeshBVH: Max depth of ${n} reached when generating BVH. Consider increasing maxDepth.`),console.warn(d))),r<=o||c>=n)return b(i+r),s.offset=i,s.count=r,s;const y=function(t,e,s,i,r,n){let a=-1,o=0;if(0===n)a=Le(e),-1!==a&&(o=(e[a]+e[a+3])/2);else if(1===n)a=Le(t),-1!==a&&(o=function(t,e,s,i){let r=0;for(let n=e,a=e+s;n<a;n++)r+=t[6*n+2*i];return r/s}(s,i,r,a));else if(2===n){const n=Xe(t);let h=Ie*r;const l=6*i,c=6*(i+r);for(let t=0;t<3;t++){const i=e[t],u=(e[t+3]-i)/32;if(r<8){const e=[...Ze];e.length=r;let i=0;for(let r=l;r<c;r+=6,i++){const n=e[i];n.candidate=s[r+2*t],n.count=0;const{bounds:a,leftCacheBounds:o,rightCacheBounds:h}=n;for(let t=0;t<3;t++)h[t]=1/0,h[t+3]=-1/0,o[t]=1/0,o[t+3]=-1/0,a[t]=1/0,a[t+3]=-1/0;Ye(r,s,a)}e.sort(Ge);let u=r;for(let t=0;t<u;t++){const s=e[t];for(;t+1<u&&e[t+1].candidate===s.candidate;)e.splice(t+1,1),u--}for(let i=l;i<c;i+=6){const r=s[i+2*t];for(let t=0;t<u;t++){const n=e[t];r>=n.candidate?Ye(i,s,n.rightCacheBounds):(Ye(i,s,n.leftCacheBounds),n.count++)}}for(let s=0;s<u;s++){const i=e[s],l=i.count,c=r-i.count,u=i.leftCacheBounds,d=i.rightCacheBounds;let p=0;0!==l&&(p=Xe(u)/n);let m=0;0!==c&&(m=Xe(d)/n);const y=1+Ie*(p*l+m*c);y<h&&(a=t,h=y,o=i.candidate)}}else{for(let t=0;t<32;t++){const e=Ze[t];e.count=0,e.candidate=i+u+t*u;const s=e.bounds;for(let t=0;t<3;t++)s[t]=1/0,s[t+3]=-1/0}for(let e=l;e<c;e+=6){let r=~~((s[e+2*t]-i)/u);r>=32&&(r=31);const n=Ze[r];n.count++,Ye(e,s,n.bounds)}const e=Ze[31];je(e.bounds,e.rightCacheBounds);for(let t=30;t>=0;t--){const e=Ze[t],s=Ze[t+1];He(e.bounds,s.rightCacheBounds,e.rightCacheBounds)}let d=0;for(let e=0;e<31;e++){const s=Ze[e],i=s.count,l=s.bounds,c=Ze[e+1].rightCacheBounds;0!==i&&(0===d?je(l,Je):He(l,Je,Je)),d+=i;let u=0,p=0;0!==d&&(u=Xe(Je)/n);const m=r-d;0!==m&&(p=Xe(c)/n);const y=1+Ie*(u*d+p*m);y<h&&(a=t,h=y,o=s.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${n} used.`);return{axis:a,pos:o}}(s.boundingData,l,e,i,r,h);if(-1===y.axis)return b(i+r),s.offset=i,s.count=r,s;const g=m(u,p,e,i,r,y);if(g===i||g===i+r)b(i+r),s.offset=i,s.count=r;else{s.splitAxis=y.axis;const n=new $e,a=i,o=g-i;s.left=n,We(e,a,o,n.boundingData,f),t(n,a,o,f,c+1);const h=new $e,l=g,u=r-o;s.right=h,We(e,l,u,h.boundingData,f),t(h,l,u,f,c+1)}return s}(g,s,i,f),g;function b(t){l&&l(t/y)}}(t,r,s.offset,s.count,e),a=ds(n),o=new i(32*a);return ps(0,n,o),o})}class fs{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(t,e){let s=1/0,i=-1/0;for(let r=0,n=t.length;r<n;r++){const n=t[r][e];s=n<s?n:s,i=n>i?n:i}this.min=s,this.max=i}setFromPoints(t,e){let s=1/0,i=-1/0;for(let r=0,n=e.length;r<n;r++){const n=e[r],a=t.dot(n);s=a<s?a:s,i=a>i?a:i}this.min=s,this.max=i}isSeparated(t){return this.min>t.max||t.min>this.max}}fs.prototype.setFromBox=function(){const t=new M;return function(e,s){const i=s.min,r=s.max;let n=1/0,a=-1/0;for(let s=0;s<=1;s++)for(let o=0;o<=1;o++)for(let h=0;h<=1;h++){t.x=i.x*s+r.x*(1-s),t.y=i.y*o+r.y*(1-o),t.z=i.z*h+r.z*(1-h);const l=e.dot(t);n=Math.min(l,n),a=Math.max(l,a)}this.min=n,this.max=a}}(),new fs;const xs=function(){const t=new M,e=new M,s=new M;return function(i,r,n){const a=i.start,o=t,h=r.start,l=e;s.subVectors(a,h),t.subVectors(i.end,i.start),e.subVectors(r.end,r.start);const c=s.dot(l),u=l.dot(o),d=l.dot(l),p=s.dot(o),m=o.dot(o)*d-u*u;let y,f;y=0!==m?(c*u-p*d)/m:0,f=(c+y*u)/d,n.x=y,n.y=f}}(),gs=function(){const t=new w,e=new M,s=new M;return function(i,r,n,a){xs(i,r,t);let o=t.x,h=t.y;if(o>=0&&o<=1&&h>=0&&h<=1)return i.at(o,n),void r.at(h,a);if(o>=0&&o<=1)return h<0?r.at(0,a):r.at(1,a),void i.closestPointToPoint(a,!0,n);if(h>=0&&h<=1)return o<0?i.at(0,n):i.at(1,n),void r.closestPointToPoint(n,!0,a);{let t,l;t=o<0?i.start:i.end,l=h<0?r.start:r.end;const c=e,u=s;return i.closestPointToPoint(l,!0,e),r.closestPointToPoint(t,!0,s),c.distanceToSquared(l)<=u.distanceToSquared(t)?(n.copy(c),void a.copy(l)):(n.copy(t),void a.copy(u))}}}(),bs=function(){const t=new M,e=new M,s=new he,i=new Fe;return function(r,n){const{radius:a,center:o}=r,{a:h,b:l,c}=n;if(i.start=h,i.end=l,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;if(i.start=h,i.end=c,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;if(i.start=l,i.end=c,i.closestPointToPoint(o,!0,t).distanceTo(o)<=a)return!0;const u=n.getPlane(s);if(Math.abs(u.distanceToPoint(o))<=a){const t=u.projectPoint(o,e);if(n.containsPoint(t))return!0}return!1}}();function ws(t){return Math.abs(t)<1e-15}class _s extends Gt{constructor(...t){super(...t),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new M),this.satBounds=new Array(4).fill().map(()=>new fs),this.points=[this.a,this.b,this.c],this.sphere=new at,this.plane=new he,this.needsUpdate=!0}intersectsSphere(t){return bs(t,this)}update(){const t=this.a,e=this.b,s=this.c,i=this.points,r=this.satAxes,n=this.satBounds,a=r[0],o=n[0];this.getNormal(a),o.setFromPoints(a,i);const h=r[1],l=n[1];h.subVectors(t,e),l.setFromPoints(h,i);const c=r[2],u=n[2];c.subVectors(e,s),u.setFromPoints(c,i);const d=r[3],p=n[3];d.subVectors(s,t),p.setFromPoints(d,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(a,t),this.needsUpdate=!1}}_s.prototype.closestPointToSegment=function(){const t=new M,e=new M,s=new Fe;return function(i,r=null,n=null){const{start:a,end:o}=i,h=this.points;let l,c=1/0;for(let a=0;a<3;a++){const o=(a+1)%3;s.start.copy(h[a]),s.end.copy(h[o]),gs(s,i,t,e),l=t.distanceToSquared(e),l<c&&(c=l,r&&r.copy(t),n&&n.copy(e))}return this.closestPointToPoint(a,t),l=a.distanceToSquared(t),l<c&&(c=l,r&&r.copy(t),n&&n.copy(a)),this.closestPointToPoint(o,t),l=o.distanceToSquared(t),l<c&&(c=l,r&&r.copy(t),n&&n.copy(o)),Math.sqrt(c)}}(),_s.prototype.intersectsTriangle=function(){const t=new _s,e=new Array(3),s=new Array(3),i=new fs,r=new fs,n=new M,a=new M,o=new M,h=new M,l=new M,c=new Fe,u=new Fe,d=new Fe,p=new M;function m(t,e,s){const i=t.points;let r=0,n=-1;for(let t=0;t<3;t++){const{start:o,end:h}=c;o.copy(i[t]),h.copy(i[(t+1)%3]),c.delta(a);const l=ws(e.distanceToPoint(o));if(ws(e.normal.dot(a))&&l){s.copy(c),r=2;break}const u=e.intersectLine(c,p);if(!u&&l&&p.copy(o),(u||l)&&!ws(p.distanceTo(h))){if(r<=1)(1===r?s.start:s.end).copy(p),l&&(n=r);else if(r>=2){(1===n?s.start:s.end).copy(p),r=2;break}if(r++,2===r&&-1===n)break}}return r}return function(a,c=null,p=!1){this.needsUpdate&&this.update(),a.isExtendedTriangle?a.needsUpdate&&a.update():(t.copy(a),t.update(),a=t);const y=this.plane,f=a.plane;if(Math.abs(y.normal.dot(f.normal))>1-1e-10){const t=this.satBounds,o=this.satAxes;s[0]=a.a,s[1]=a.b,s[2]=a.c;for(let e=0;e<4;e++){const r=t[e],n=o[e];if(i.setFromPoints(n,s),r.isSeparated(i))return!1}const h=a.satBounds,l=a.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let t=0;t<4;t++){const s=h[t],r=l[t];if(i.setFromPoints(r,e),s.isSeparated(i))return!1}for(let t=0;t<4;t++){const a=o[t];for(let t=0;t<4;t++){const o=l[t];if(n.crossVectors(a,o),i.setFromPoints(n,e),r.setFromPoints(n,s),i.isSeparated(r))return!1}}return c&&(p||console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"),c.start.set(0,0,0),c.end.set(0,0,0)),!0}{const t=m(this,f,u);if(1===t&&a.containsPoint(u.end))return c&&(c.start.copy(u.end),c.end.copy(u.end)),!0;if(2!==t)return!1;const e=m(a,y,d);if(1===e&&this.containsPoint(d.end))return c&&(c.start.copy(d.end),c.end.copy(d.end)),!0;if(2!==e)return!1;if(u.delta(o),d.delta(h),o.dot(h)<0){let t=d.start;d.start=d.end,d.end=t}const s=u.start.dot(o),i=u.end.dot(o),r=d.start.dot(o),n=d.end.dot(o);return(s===n||r===i||i<r!=s<n)&&(c&&(l.subVectors(u.start,d.start),l.dot(o)>0?c.start.copy(u.start):c.start.copy(d.start),l.subVectors(u.end,d.end),l.dot(o)<0?c.end.copy(u.end):c.end.copy(d.end)),!0)}}}(),_s.prototype.distanceToPoint=function(){const t=new M;return function(e){return this.closestPointToPoint(e,t),e.distanceTo(t)}}(),_s.prototype.distanceToTriangle=function(){const t=new M,e=new M,s=[\"a\",\"b\",\"c\"],i=new Fe,r=new Fe;return function(n,a=null,o=null){const h=a||o?i:null;if(this.intersectsTriangle(n,h))return(a||o)&&(a&&h.getCenter(a),o&&h.getCenter(o)),0;let l=1/0;for(let e=0;e<3;e++){let i;const r=s[e],h=n[r];this.closestPointToPoint(h,t),i=h.distanceToSquared(t),i<l&&(l=i,a&&a.copy(t),o&&o.copy(h));const c=this[r];n.closestPointToPoint(c,t),i=c.distanceToSquared(t),i<l&&(l=i,a&&a.copy(c),o&&o.copy(t))}for(let h=0;h<3;h++){const c=s[h],u=s[(h+1)%3];i.set(this[c],this[u]);for(let h=0;h<3;h++){const c=s[h],u=s[(h+1)%3];r.set(n[c],n[u]),gs(i,r,t,e);const d=t.distanceToSquared(e);d<l&&(l=d,a&&a.copy(t),o&&o.copy(e))}}return Math.sqrt(l)}}();class Ms{constructor(t,e,s){this.isOrientedBox=!0,this.min=new M,this.max=new M,this.matrix=new ot,this.invMatrix=new ot,this.points=new Array(8).fill().map(()=>new M),this.satAxes=new Array(3).fill().map(()=>new M),this.satBounds=new Array(3).fill().map(()=>new fs),this.alignedSatBounds=new Array(3).fill().map(()=>new fs),this.needsUpdate=!1,t&&this.min.copy(t),e&&this.max.copy(e),s&&this.matrix.copy(s)}set(t,e,s){this.min.copy(t),this.max.copy(e),this.matrix.copy(s),this.needsUpdate=!0}copy(t){this.min.copy(t.min),this.max.copy(t.max),this.matrix.copy(t.matrix),this.needsUpdate=!0}}Ms.prototype.update=function(){const t=this.matrix,e=this.min,s=this.max,i=this.points;for(let r=0;r<=1;r++)for(let n=0;n<=1;n++)for(let a=0;a<=1;a++){const o=i[1*r|2*n|4*a];o.x=r?s.x:e.x,o.y=n?s.y:e.y,o.z=a?s.z:e.z,o.applyMatrix4(t)}const r=this.satBounds,n=this.satAxes,a=i[0];for(let t=0;t<3;t++){const e=n[t],s=r[t],o=i[1<<t];e.subVectors(a,o),s.setFromPoints(e,i)}const o=this.alignedSatBounds;o[0].setFromPointsField(i,\"x\"),o[1].setFromPointsField(i,\"y\"),o[2].setFromPointsField(i,\"z\"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1},Ms.prototype.intersectsBox=function(){const t=new fs;return function(e){this.needsUpdate&&this.update();const s=e.min,i=e.max,r=this.satBounds,n=this.satAxes,a=this.alignedSatBounds;if(t.min=s.x,t.max=i.x,a[0].isSeparated(t))return!1;if(t.min=s.y,t.max=i.y,a[1].isSeparated(t))return!1;if(t.min=s.z,t.max=i.z,a[2].isSeparated(t))return!1;for(let s=0;s<3;s++){const i=n[s],a=r[s];if(t.setFromBox(i,e),a.isSeparated(t))return!1}return!0}}(),Ms.prototype.intersectsTriangle=function(){const t=new _s,e=new Array(3),s=new fs,i=new fs,r=new M;return function(n){this.needsUpdate&&this.update(),n.isExtendedTriangle?n.needsUpdate&&n.update():(t.copy(n),t.update(),n=t);const a=this.satBounds,o=this.satAxes;e[0]=n.a,e[1]=n.b,e[2]=n.c;for(let t=0;t<3;t++){const i=a[t],r=o[t];if(s.setFromPoints(r,e),i.isSeparated(s))return!1}const h=n.satBounds,l=n.satAxes,c=this.points;for(let t=0;t<3;t++){const e=h[t],i=l[t];if(s.setFromPoints(i,c),e.isSeparated(s))return!1}for(let t=0;t<3;t++){const n=o[t];for(let t=0;t<4;t++){const a=l[t];if(r.crossVectors(n,a),s.setFromPoints(r,e),i.setFromPoints(r,c),s.isSeparated(i))return!1}}return!0}}(),Ms.prototype.closestPointToPoint=function(t,e){return this.needsUpdate&&this.update(),e.copy(t).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),e},Ms.prototype.distanceToPoint=function(){const t=new M;return function(e){return this.closestPointToPoint(e,t),e.distanceTo(t)}}(),Ms.prototype.distanceToBox=function(){const t=[\"x\",\"y\",\"z\"],e=new Array(12).fill().map(()=>new Fe),s=new Array(12).fill().map(()=>new Fe),i=new M,r=new M;return function(n,a=0,o=null,h=null){if(this.needsUpdate&&this.update(),this.intersectsBox(n))return(o||h)&&(n.getCenter(r),this.closestPointToPoint(r,i),n.closestPointToPoint(i,r),o&&o.copy(i),h&&h.copy(r)),0;const l=a*a,c=n.min,u=n.max,d=this.points;let p=1/0;for(let t=0;t<8;t++){const e=d[t];r.copy(e).clamp(c,u);const s=e.distanceToSquared(r);if(s<p&&(p=s,o&&o.copy(e),h&&h.copy(r),s<l))return Math.sqrt(s)}let m=0;for(let i=0;i<3;i++)for(let r=0;r<=1;r++)for(let n=0;n<=1;n++){const a=(i+1)%3,o=(i+2)%3,h=1<<i|r<<a|n<<o,l=d[r<<a|n<<o],p=d[h];e[m].set(l,p);const y=t[i],f=t[a],x=t[o],g=s[m],b=g.start,w=g.end;b[y]=c[y],b[f]=r?c[f]:u[f],b[x]=n?c[x]:u[f],w[y]=u[y],w[f]=r?c[f]:u[f],w[x]=n?c[x]:u[f],m++}for(let t=0;t<=1;t++)for(let e=0;e<=1;e++)for(let s=0;s<=1;s++){r.x=t?u.x:c.x,r.y=e?u.y:c.y,r.z=s?u.z:c.z,this.closestPointToPoint(r,i);const n=r.distanceToSquared(i);if(n<p&&(p=n,o&&o.copy(i),h&&h.copy(r),n<l))return Math.sqrt(n)}for(let t=0;t<12;t++){const n=e[t];for(let t=0;t<12;t++){const e=s[t];gs(n,e,i,r);const a=i.distanceToSquared(r);if(a<p&&(p=a,o&&o.copy(i),h&&h.copy(r),a<l))return Math.sqrt(a)}}return Math.sqrt(p)}}();class zs{constructor(t){this._getNewPrimitive=t,this._primitives=[]}getPrimitive(){const t=this._primitives;return 0===t.length?this._getNewPrimitive():t.pop()}releasePrimitive(t){this._primitives.push(t)}}class Ss extends zs{constructor(){super(()=>new _s)}}const As=new Ss,vs=new class{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const t=[];let e=null;this.setBuffer=s=>{e&&t.push(e),e=s,this.float32Array=new Float32Array(s),this.uint16Array=new Uint16Array(s),this.uint32Array=new Uint32Array(s)},this.clearBuffer=()=>{e=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,0!==t.length&&this.setBuffer(t.pop())}}};let Ts,Bs;const ks=[],Ps=new zs(()=>new D);function Cs(t,e,s,i,r,n){Ts=Ps.getPrimitive(),Bs=Ps.getPrimitive(),ks.push(Ts,Bs),vs.setBuffer(t._roots[e]);const a=Vs(0,t.geometry,s,i,r,n);vs.clearBuffer(),Ps.releasePrimitive(Ts),Ps.releasePrimitive(Bs),ks.pop(),ks.pop();const o=ks.length;return o>0&&(Bs=ks[o-1],Ts=ks[o-2]),a}function Vs(t,e,s,i,r=null,n=0,a=0){const{float32Array:o,uint16Array:h,uint32Array:l}=vs;let c=2*t;if(ts(c,h)){const u=es(t,l),d=ss(c,h);return De(t,o,Ts),i(u,d,!1,a,n+t,Ts)}{const p=is(t),m=rs(t,l);let y,f,x,g,b=p,w=m;if(r&&(x=Ts,g=Bs,De(b,o,x),De(w,o,g),y=r(x),f=r(g),f<y)){b=m,w=p;const T=y;y=f,f=T,x=g}x||(x=Ts,De(b,o,x));const _=s(x,ts(2*b,h),y,a+1,n+b);let M;if(2===_){const B=A(b);M=i(B,v(b)-B,!0,a+1,n+b,x)}else M=_&&Vs(b,e,s,i,r,n,a+1);if(M)return!0;g=Bs,De(w,o,g);const z=s(g,ts(2*w,h),f,a+1,n+w);let S;if(2===z){const k=A(w);S=i(k,v(w)-k,!0,a+1,n+w,g)}else S=z&&Vs(w,e,s,i,r,n,a+1);return!!S;function A(t){const{uint16Array:e,uint32Array:s}=vs;let i=2*t;for(;!ts(i,e);)i=2*(t=is(t));return es(t,s)}function v(t){const{uint16Array:e,uint32Array:s}=vs;let i=2*t;for(;!ts(i,e);)i=2*(t=rs(t,s));return es(t,s)+ss(i,e)}}}const Fs=new M,Is=new M,Es=parseInt(t)>=169,Us=new M,Ns=new M,Os=new M,qs=new w,Rs=new w,Ws=new w,Ds=new M,Ls=new M,js=new M,Hs=new M;function Ys(t,e,s,i,r,n,a){const o=3*i;let h=o+0,l=o+1,c=o+2;const u=t.index;t.index&&(h=u.getX(h),l=u.getX(l),c=u.getX(c));const{position:d,normal:p,uv:m,uv1:y}=t.attributes,f=function(t,e,s,i,r,n,a,o,h,l,c){Us.fromBufferAttribute(e,n),Ns.fromBufferAttribute(e,a),Os.fromBufferAttribute(e,o);const u=function(t,e,s,i,r,n,a,o){let h;if(h=1===n?t.intersectTriangle(i,s,e,!0,r):t.intersectTriangle(e,s,i,2!==n,r),null===h)return null;const l=t.origin.distanceTo(r);return l<a||l>o?null:{distance:l,point:r.clone()}}(t,Us,Ns,Os,Hs,h,l,c);if(u){const e=new M;Gt.getBarycoord(Hs,Us,Ns,Os,e),i&&(qs.fromBufferAttribute(i,n),Rs.fromBufferAttribute(i,a),Ws.fromBufferAttribute(i,o),u.uv=Gt.getInterpolation(Hs,Us,Ns,Os,qs,Rs,Ws,new w)),r&&(qs.fromBufferAttribute(r,n),Rs.fromBufferAttribute(r,a),Ws.fromBufferAttribute(r,o),u.uv1=Gt.getInterpolation(Hs,Us,Ns,Os,qs,Rs,Ws,new w)),s&&(Ds.fromBufferAttribute(s,n),Ls.fromBufferAttribute(s,a),js.fromBufferAttribute(s,o),u.normal=Gt.getInterpolation(Hs,Us,Ns,Os,Ds,Ls,js,new M),u.normal.dot(t.direction)>0&&u.normal.multiplyScalar(-1));const h={a:n,b:a,c:o,normal:new M,materialIndex:0};Gt.getNormal(Us,Ns,Os,h.normal),u.face=h,u.faceIndex=n,Es&&(u.barycoord=e)}return u}(s,d,p,m,y,h,l,c,e,n,a);return f?(f.faceIndex=i,r&&r.push(f),f):null}function Xs(t,e,s,i){const r=t.a,n=t.b,a=t.c;let o=e,h=e+1,l=e+2;s&&(o=s.getX(o),h=s.getX(h),l=s.getX(l)),r.x=i.getX(o),r.y=i.getY(o),r.z=i.getZ(o),n.x=i.getX(h),n.y=i.getY(h),n.z=i.getZ(h),a.x=i.getX(l),a.y=i.getY(l),a.z=i.getZ(l)}function Gs(t,e,s,i,r,n,a){const{geometry:o}=s,{index:h}=o,l=o.attributes.position;for(let s=t,o=e+t;s<o;s++){let t;if(t=s,Xs(a,3*t,h,l),a.needsUpdate=!0,i(a,t,r,n))return!0}return!1}function Zs(t,e=null){e&&Array.isArray(e)&&(e=new Set(e));const s=t.geometry,i=s.index?s.index.array:null,r=s.attributes.position;let n,a,o,h,l=0;const c=t._roots;for(let t=0,e=c.length;t<e;t++)n=c[t],a=new Uint32Array(n),o=new Uint16Array(n),h=new Float32Array(n),u(0,l),l+=n.byteLength;function u(t,s,n=!1){const l=2*t;if(o[l+15]===Ee){const e=a[t+6];let s=1/0,n=1/0,c=1/0,u=-1/0,d=-1/0,p=-1/0;for(let t=3*e,a=3*(e+o[l+14]);t<a;t++){let e=i[t];const a=r.getX(e),o=r.getY(e),h=r.getZ(e);a<s&&(s=a),a>u&&(u=a),o<n&&(n=o),o>d&&(d=o),h<c&&(c=h),h>p&&(p=h)}return(h[t+0]!==s||h[t+1]!==n||h[t+2]!==c||h[t+3]!==u||h[t+4]!==d||h[t+5]!==p)&&(h[t+0]=s,h[t+1]=n,h[t+2]=c,h[t+3]=u,h[t+4]=d,h[t+5]=p,!0)}{const i=t+8,r=a[t+6],o=i+s,l=r+s;let c=n,d=!1,p=!1;e?c||(d=e.has(o),p=e.has(l),c=!d&&!p):(d=!0,p=!0);const m=c||p;let y=!1;(c||d)&&(y=u(i,s,c));let f=!1;m&&(f=u(r,s,c));const x=y||f;if(x)for(let e=0;e<3;e++){const s=i+e,n=r+e,a=h[s],o=h[s+3],l=h[n],c=h[n+3];h[t+e]=a<l?a:l,h[t+e+3]=o>c?o:c}return x}}}function Js(t,e,s,i,r){let n,a,o,h,l,c;const u=1/s.direction.x,d=1/s.direction.y,p=1/s.direction.z,m=s.origin.x,y=s.origin.y,f=s.origin.z;let x=e[t],g=e[t+3],b=e[t+1],w=e[t+3+1],_=e[t+2],M=e[t+3+2];return u>=0?(n=(x-m)*u,a=(g-m)*u):(n=(g-m)*u,a=(x-m)*u),d>=0?(o=(b-y)*d,h=(w-y)*d):(o=(w-y)*d,h=(b-y)*d),!(n>h||o>a)&&((o>n||isNaN(n))&&(n=o),(h<a||isNaN(a))&&(a=h),p>=0?(l=(_-f)*p,c=(M-f)*p):(l=(M-f)*p,c=(_-f)*p),!(n>c||l>a)&&((l>n||n!=n)&&(n=l),(c<a||a!=a)&&(a=c),n<=r&&a>=i))}function $s(t,e,s,i,r,n,a){vs.setBuffer(t._roots[e]),Qs(0,t,s,i,r,n,a),vs.clearBuffer()}function Qs(t,e,s,i,r,n,a){const{float32Array:o,uint16Array:h,uint32Array:l}=vs,c=2*t;if(ts(c,h))!function(t,e,s,i,r,n,a,o){const{geometry:h,_indirectBuffer:l}=t;for(let t=i,l=i+r;t<l;t++)Ys(h,e,s,t,n,a,o)}(e,s,i,es(t,l),ss(c,h),r,n,a);else{const h=is(t);Js(h,o,i,n,a)&&Qs(h,e,s,i,r,n,a);const c=rs(t,l);Js(c,o,i,n,a)&&Qs(c,e,s,i,r,n,a)}}const Ks=[\"x\",\"y\",\"z\"];function ti(t,e,s,i,r,n){vs.setBuffer(t._roots[e]);const a=ei(0,t,s,i,r,n);return vs.clearBuffer(),a}function ei(t,e,s,i,r,n){const{float32Array:a,uint16Array:o,uint32Array:h}=vs;let l=2*t;if(ts(l,o))return function(t,e,s,i,r,n,a){const{geometry:o,_indirectBuffer:h}=t;let l=1/0,c=null;for(let t=i,h=i+r;t<h;t++){let i;i=Ys(o,e,s,t,null,n,a),i&&i.distance<l&&(c=i,l=i.distance)}return c}(e,s,i,es(t,h),ss(l,o),r,n);{const o=ns(t,h),l=Ks[o],c=i.direction[l]>=0;let u,d;c?(u=is(t),d=rs(t,h)):(u=rs(t,h),d=is(t));const p=Js(u,a,i,r,n)?ei(u,e,s,i,r,n):null;if(p){const t=p.point[l];if(c?t<=a[d+o]:t>=a[d+o+3])return p}const m=Js(d,a,i,r,n)?ei(d,e,s,i,r,n):null;return p&&m?p.distance<=m.distance?p:m:p||m||null}}const si=new D,ii=new _s,ri=new _s,ni=new ot,ai=new Ms,oi=new Ms;function hi(t,e,s,i){vs.setBuffer(t._roots[e]);const r=li(0,t,s,i);return vs.clearBuffer(),r}function li(t,e,s,i,r=null){const{float32Array:n,uint16Array:a,uint32Array:o}=vs;let h=2*t;if(null===r&&(s.boundingBox||s.computeBoundingBox(),ai.set(s.boundingBox.min,s.boundingBox.max,i),r=ai),!ts(h,a)){const a=t+8,h=o[t+6];return De(a,n,si),r.intersectsBox(si)&&li(a,e,s,i,r)?!0:(De(h,n,si),!(!r.intersectsBox(si)||!li(h,e,s,i,r)))}{const r=e.geometry,l=r.index,c=r.attributes.position,u=s.index,d=s.attributes.position,p=es(t,o),m=ss(h,a);if(ni.copy(i).invert(),s.boundsTree)return De(t,n,oi),oi.matrix.copy(ni),oi.needsUpdate=!0,s.boundsTree.shapecast({intersectsBounds:t=>oi.intersectsBox(t),intersectsTriangle:t=>{t.a.applyMatrix4(i),t.b.applyMatrix4(i),t.c.applyMatrix4(i),t.needsUpdate=!0;for(let e=3*p,s=3*(m+p);e<s;e+=3)if(Xs(ri,e,l,c),ri.needsUpdate=!0,t.intersectsTriangle(ri))return!0;return!1}});for(let t=3*p,e=3*(m+p);t<e;t+=3){Xs(ii,t,l,c),ii.a.applyMatrix4(ni),ii.b.applyMatrix4(ni),ii.c.applyMatrix4(ni),ii.needsUpdate=!0;for(let t=0,e=u.count;t<e;t+=3)if(Xs(ri,t,u,d),ri.needsUpdate=!0,ii.intersectsTriangle(ri))return!0}}}const ci=new ot,ui=new Ms,di=new Ms,pi=new M,mi=new M,yi=new M,fi=new M;function xi(t,e,s,i={},r={},n=0,a=1/0){e.boundingBox||e.computeBoundingBox(),ui.set(e.boundingBox.min,e.boundingBox.max,s),ui.needsUpdate=!0;const o=t.geometry,h=o.attributes.position,l=o.index,c=e.attributes.position,u=e.index,d=As.getPrimitive(),p=As.getPrimitive();let m=pi,y=mi,f=null,x=null;r&&(f=yi,x=fi);let g=1/0,b=null,w=null;return ci.copy(s).invert(),di.matrix.copy(ci),t.shapecast({boundsTraverseOrder:t=>ui.distanceToBox(t),intersectsBounds:(t,e,s)=>s<g&&s<a&&(e&&(di.min.copy(t.min),di.max.copy(t.max),di.needsUpdate=!0),!0),intersectsRange:(t,i)=>{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:t=>di.distanceToBox(t),intersectsBounds:(t,e,s)=>s<g&&s<a,intersectsRange:(e,r)=>{for(let a=e,o=e+r;a<o;a++){Xs(p,3*a,u,c),p.a.applyMatrix4(s),p.b.applyMatrix4(s),p.c.applyMatrix4(s),p.needsUpdate=!0;for(let e=t,s=t+i;e<s;e++){Xs(d,3*e,l,h),d.needsUpdate=!0;const t=d.distanceToTriangle(p,m,f);if(t<g&&(y.copy(m),x&&x.copy(f),g=t,b=e,w=a),t<n)return!0}}}});for(let r=0,a=Oe(e);r<a;r++){Xs(p,3*r,u,c),p.a.applyMatrix4(s),p.b.applyMatrix4(s),p.c.applyMatrix4(s),p.needsUpdate=!0;for(let e=t,s=t+i;e<s;e++){Xs(d,3*e,l,h),d.needsUpdate=!0;const t=d.distanceToTriangle(p,m,f);if(t<g&&(y.copy(m),x&&x.copy(f),g=t,b=e,w=r),t<n)return!0}}}}),As.releasePrimitive(d),As.releasePrimitive(p),g===1/0?null:(i.point?i.point.copy(y):i.point=y.clone(),i.distance=g,i.faceIndex=b,r&&(r.point?r.point.copy(x):r.point=x.clone(),r.point.applyMatrix4(ci),y.applyMatrix4(ci),r.distance=y.sub(r.point).length(),r.faceIndex=w),i)}function gi(t,e,s,i,r,n,a){const{geometry:o}=s,{index:h}=o,l=o.attributes.position;for(let o=t,c=e+t;o<c;o++){let t;if(t=s.resolveTriangleIndex(o),Xs(a,3*t,h,l),a.needsUpdate=!0,i(a,t,r,n))return!0}return!1}function bi(t,e=null){e&&Array.isArray(e)&&(e=new Set(e));const s=t.geometry,i=s.index?s.index.array:null,r=s.attributes.position;let n,a,o,h,l=0;const c=t._roots;for(let t=0,e=c.length;t<e;t++)n=c[t],a=new Uint32Array(n),o=new Uint16Array(n),h=new Float32Array(n),u(0,l),l+=n.byteLength;function u(s,n,l=!1){const c=2*s;if(o[c+15]===Ee){const e=a[s+6];let n=1/0,l=1/0,u=1/0,d=-1/0,p=-1/0,m=-1/0;for(let s=e,a=e+o[c+14];s<a;s++){const e=3*t.resolveTriangleIndex(s);for(let t=0;t<3;t++){let s=e+t;s=i?i[s]:s;const a=r.getX(s),o=r.getY(s),h=r.getZ(s);a<n&&(n=a),a>d&&(d=a),o<l&&(l=o),o>p&&(p=o),h<u&&(u=h),h>m&&(m=h)}}return(h[s+0]!==n||h[s+1]!==l||h[s+2]!==u||h[s+3]!==d||h[s+4]!==p||h[s+5]!==m)&&(h[s+0]=n,h[s+1]=l,h[s+2]=u,h[s+3]=d,h[s+4]=p,h[s+5]=m,!0)}{const t=s+8,i=a[s+6],r=t+n,o=i+n;let c=l,d=!1,p=!1;e?c||(d=e.has(r),p=e.has(o),c=!d&&!p):(d=!0,p=!0);const m=c||p;let y=!1;(c||d)&&(y=u(t,n,c));let f=!1;m&&(f=u(i,n,c));const x=y||f;if(x)for(let e=0;e<3;e++){const r=t+e,n=i+e,a=h[r],o=h[r+3],l=h[n],c=h[n+3];h[s+e]=a<l?a:l,h[s+e+3]=o>c?o:c}return x}}}function wi(t,e,s,i,r,n,a){vs.setBuffer(t._roots[e]),_i(0,t,s,i,r,n,a),vs.clearBuffer()}function _i(t,e,s,i,r,n,a){const{float32Array:o,uint16Array:h,uint32Array:l}=vs,c=2*t;if(ts(c,h))!function(t,e,s,i,r,n,a,o){const{geometry:h,_indirectBuffer:l}=t;for(let t=i,c=i+r;t<c;t++)Ys(h,e,s,l?l[t]:t,n,a,o)}(e,s,i,es(t,l),ss(c,h),r,n,a);else{const h=is(t);Js(h,o,i,n,a)&&_i(h,e,s,i,r,n,a);const c=rs(t,l);Js(c,o,i,n,a)&&_i(c,e,s,i,r,n,a)}}const Mi=[\"x\",\"y\",\"z\"];function zi(t,e,s,i,r,n){vs.setBuffer(t._roots[e]);const a=Si(0,t,s,i,r,n);return vs.clearBuffer(),a}function Si(t,e,s,i,r,n){const{float32Array:a,uint16Array:o,uint32Array:h}=vs;let l=2*t;if(ts(l,o))return function(t,e,s,i,r,n,a){const{geometry:o,_indirectBuffer:h}=t;let l=1/0,c=null;for(let t=i,u=i+r;t<u;t++){let i;i=Ys(o,e,s,h?h[t]:t,null,n,a),i&&i.distance<l&&(c=i,l=i.distance)}return c}(e,s,i,es(t,h),ss(l,o),r,n);{const o=ns(t,h),l=Mi[o],c=i.direction[l]>=0;let u,d;c?(u=is(t),d=rs(t,h)):(u=rs(t,h),d=is(t));const p=Js(u,a,i,r,n)?Si(u,e,s,i,r,n):null;if(p){const t=p.point[l];if(c?t<=a[d+o]:t>=a[d+o+3])return p}const m=Js(d,a,i,r,n)?Si(d,e,s,i,r,n):null;return p&&m?p.distance<=m.distance?p:m:p||m||null}}const Ai=new D,vi=new _s,Ti=new _s,Bi=new ot,ki=new Ms,Pi=new Ms;function Ci(t,e,s,i){vs.setBuffer(t._roots[e]);const r=Vi(0,t,s,i);return vs.clearBuffer(),r}function Vi(t,e,s,i,r=null){const{float32Array:n,uint16Array:a,uint32Array:o}=vs;let h=2*t;if(null===r&&(s.boundingBox||s.computeBoundingBox(),ki.set(s.boundingBox.min,s.boundingBox.max,i),r=ki),!ts(h,a)){const a=t+8,h=o[t+6];return De(a,n,Ai),r.intersectsBox(Ai)&&Vi(a,e,s,i,r)?!0:(De(h,n,Ai),!(!r.intersectsBox(Ai)||!Vi(h,e,s,i,r)))}{const r=e.geometry,l=r.index,c=r.attributes.position,u=s.index,d=s.attributes.position,p=es(t,o),m=ss(h,a);if(Bi.copy(i).invert(),s.boundsTree)return De(t,n,Pi),Pi.matrix.copy(Bi),Pi.needsUpdate=!0,s.boundsTree.shapecast({intersectsBounds:t=>Pi.intersectsBox(t),intersectsTriangle:t=>{t.a.applyMatrix4(i),t.b.applyMatrix4(i),t.c.applyMatrix4(i),t.needsUpdate=!0;for(let s=p,i=m+p;s<i;s++)if(Xs(Ti,3*e.resolveTriangleIndex(s),l,c),Ti.needsUpdate=!0,t.intersectsTriangle(Ti))return!0;return!1}});for(let t=p,s=m+p;t<s;t++){const s=e.resolveTriangleIndex(t);Xs(vi,3*s,l,c),vi.a.applyMatrix4(Bi),vi.b.applyMatrix4(Bi),vi.c.applyMatrix4(Bi),vi.needsUpdate=!0;for(let t=0,e=u.count;t<e;t+=3)if(Xs(Ti,t,u,d),Ti.needsUpdate=!0,vi.intersectsTriangle(Ti))return!0}}}const Fi=new ot,Ii=new Ms,Ei=new Ms,Ui=new M,Ni=new M,Oi=new M,qi=new M;function Ri(t,e,s,i={},r={},n=0,a=1/0){e.boundingBox||e.computeBoundingBox(),Ii.set(e.boundingBox.min,e.boundingBox.max,s),Ii.needsUpdate=!0;const o=t.geometry,h=o.attributes.position,l=o.index,c=e.attributes.position,u=e.index,d=As.getPrimitive(),p=As.getPrimitive();let m=Ui,y=Ni,f=null,x=null;r&&(f=Oi,x=qi);let g=1/0,b=null,w=null;return Fi.copy(s).invert(),Ei.matrix.copy(Fi),t.shapecast({boundsTraverseOrder:t=>Ii.distanceToBox(t),intersectsBounds:(t,e,s)=>s<g&&s<a&&(e&&(Ei.min.copy(t.min),Ei.max.copy(t.max),Ei.needsUpdate=!0),!0),intersectsRange:(i,r)=>{if(e.boundsTree){const o=e.boundsTree;return o.shapecast({boundsTraverseOrder:t=>Ei.distanceToBox(t),intersectsBounds:(t,e,s)=>s<g&&s<a,intersectsRange:(e,a)=>{for(let _=e,M=e+a;_<M;_++){const e=o.resolveTriangleIndex(_);Xs(p,3*e,u,c),p.a.applyMatrix4(s),p.b.applyMatrix4(s),p.c.applyMatrix4(s),p.needsUpdate=!0;for(let e=i,s=i+r;e<s;e++){const s=t.resolveTriangleIndex(e);Xs(d,3*s,l,h),d.needsUpdate=!0;const i=d.distanceToTriangle(p,m,f);if(i<g&&(y.copy(m),x&&x.copy(f),g=i,b=e,w=_),i<n)return!0}}}})}for(let a=0,o=Oe(e);a<o;a++){Xs(p,3*a,u,c),p.a.applyMatrix4(s),p.b.applyMatrix4(s),p.c.applyMatrix4(s),p.needsUpdate=!0;for(let e=i,s=i+r;e<s;e++){const s=t.resolveTriangleIndex(e);Xs(d,3*s,l,h),d.needsUpdate=!0;const i=d.distanceToTriangle(p,m,f);if(i<g&&(y.copy(m),x&&x.copy(f),g=i,b=e,w=a),i<n)return!0}}}}),As.releasePrimitive(d),As.releasePrimitive(p),g===1/0?null:(i.point?i.point.copy(y):i.point=y.clone(),i.distance=g,i.faceIndex=b,r&&(r.point?r.point.copy(x):r.point=x.clone(),r.point.applyMatrix4(Fi),y.applyMatrix4(Fi),r.distance=y.sub(r.point).length(),r.faceIndex=w),i)}const Wi=new vs.constructor,Di=new vs.constructor,Li=new zs(()=>new D),ji=new D,Hi=new D,Yi=new D,Xi=new D;let Gi=!1;function Zi(t,e,s,i,r,n=0,a=0,o=0,h=0,l=null,c=!1){let u,d;c?(u=Di,d=Wi):(u=Wi,d=Di);const p=u.float32Array,m=u.uint32Array,y=u.uint16Array,f=d.float32Array,x=d.uint32Array,g=d.uint16Array,b=2*e,w=ts(2*t,y),_=ts(b,g);let M=!1;if(_&&w)M=c?r(es(e,x),ss(2*e,g),es(t,m),ss(2*t,y),h,a+e,o,n+t):r(es(t,m),ss(2*t,y),es(e,x),ss(2*e,g),o,n+t,h,a+e);else if(_){const l=Li.getPrimitive();De(e,f,l),l.applyMatrix4(s);const u=is(t),d=rs(t,m);De(u,p,ji),De(d,p,Hi);const y=l.intersectsBox(ji),x=l.intersectsBox(Hi);M=y&&Zi(e,u,i,s,r,a,n,h,o+1,l,!c)||x&&Zi(e,d,i,s,r,a,n,h,o+1,l,!c),Li.releasePrimitive(l)}else{const u=is(e),d=rs(e,x);De(u,f,Yi),De(d,f,Xi);const y=l.intersectsBox(Yi),g=l.intersectsBox(Xi);if(y&&g)M=Zi(t,u,s,i,r,n,a,o,h+1,l,c)||Zi(t,d,s,i,r,n,a,o,h+1,l,c);else if(y)if(w)M=Zi(t,u,s,i,r,n,a,o,h+1,l,c);else{const e=Li.getPrimitive();e.copy(Yi).applyMatrix4(s);const l=is(t),d=rs(t,m);De(l,p,ji),De(d,p,Hi);const y=e.intersectsBox(ji),f=e.intersectsBox(Hi);M=y&&Zi(u,l,i,s,r,a,n,h,o+1,e,!c)||f&&Zi(u,d,i,s,r,a,n,h,o+1,e,!c),Li.releasePrimitive(e)}else if(g)if(w)M=Zi(t,d,s,i,r,n,a,o,h+1,l,c);else{const e=Li.getPrimitive();e.copy(Xi).applyMatrix4(s);const l=is(t),u=rs(t,m);De(l,p,ji),De(u,p,Hi);const y=e.intersectsBox(ji),f=e.intersectsBox(Hi);M=y&&Zi(d,l,i,s,r,a,n,h,o+1,e,!c)||f&&Zi(d,u,i,s,r,a,n,h,o+1,e,!c),Li.releasePrimitive(e)}}return M}const Ji=new Ms,$i=new D,Qi={strategy:0,maxDepth:40,maxLeafTris:10,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,verbose:!0,range:null};class Ki{static serialize(t,e={}){e={cloneBuffers:!0,...e};const s=t.geometry,i=t._roots,r=t._indirectBuffer,n=s.getIndex();let a;return a=e.cloneBuffers?{roots:i.map(t=>t.slice()),index:n?n.array.slice():null,indirectBuffer:r?r.slice():null}:{roots:i,index:n?n.array:null,indirectBuffer:r},a}static deserialize(t,e,s={}){s={setIndex:!0,indirect:Boolean(t.indirectBuffer),...s};const{index:i,roots:r,indirectBuffer:n}=t,a=new Ki(e,{...s,[Ne]:!0});if(a._roots=r,a._indirectBuffer=n||null,s.setIndex){const s=e.getIndex();if(null===s){const s=new re(t.index,1,!1);e.setIndex(s)}else s.array!==i&&(s.array.set(i),s.needsUpdate=!0)}return a}get indirect(){return!!this._indirectBuffer}constructor(t,e={}){if(!t.isBufferGeometry)throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");if(t.index&&t.index.isInterleavedBufferAttribute)throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\");if((e=Object.assign({...Qi,[Ne]:!1},e)).useSharedArrayBuffer&&\"undefined\"==typeof SharedArrayBuffer)throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");this.geometry=t,this._roots=null,this._indirectBuffer=null,e[Ne]||(ys(this,e),!t.boundingBox&&e.setBoundingBox&&(t.boundingBox=this.getBoundingBox(new D))),this.resolveTriangleIndex=e.indirect?t=>this._indirectBuffer[t]:t=>t}refit(t=null){return(this.indirect?bi:Zs)(this,t)}traverse(t,e=0){const s=this._roots[e],i=new Uint32Array(s),r=new Uint16Array(s);!function e(n,a=0){const o=2*n,h=r[o+15]===Ee;if(h){const e=i[n+6],l=r[o+14];t(a,h,new Float32Array(s,4*n,6),e,l)}else{const r=n+8,o=i[n+6],l=i[n+7];t(a,h,new Float32Array(s,4*n,6),l)||(e(r,a+1),e(o,a+1))}}(0)}raycast(t,e=0,s=0,i=1/0){const r=this._roots,n=this.geometry,a=[],o=e.isMaterial,h=Array.isArray(e),l=n.groups,c=o?e.side:e,u=this.indirect?wi:$s;for(let n=0,o=r.length;n<o;n++){const r=h?e[l[n].materialIndex].side:c,o=a.length;if(u(this,n,r,t,a,s,i),h){const t=l[n].materialIndex;for(let e=o,s=a.length;e<s;e++)a[e].face.materialIndex=t}}return a}raycastFirst(t,e=0,s=0,i=1/0){const r=this._roots,n=this.geometry,a=e.isMaterial,o=Array.isArray(e);let h=null;const l=n.groups,c=a?e.side:e,u=this.indirect?zi:ti;for(let n=0,a=r.length;n<a;n++){const r=u(this,n,o?e[l[n].materialIndex].side:c,t,s,i);null!=r&&(null==h||r.distance<h.distance)&&(h=r,o&&(r.face.materialIndex=l[n].materialIndex))}return h}intersectsGeometry(t,e){let s=!1;const i=this._roots,r=this.indirect?Ci:hi;for(let n=0,a=i.length;n<a&&(s=r(this,n,t,e),!s);n++);return s}shapecast(t){const e=As.getPrimitive(),s=this.indirect?gi:Gs;let{boundsTraverseOrder:i,intersectsBounds:r,intersectsRange:n,intersectsTriangle:a}=t;if(n&&a){const t=n;n=(i,r,n,o,h)=>!!t(i,r,n,o,h)||s(i,r,this,a,n,o,e)}else n||(n=a?(t,i,r,n)=>s(t,i,this,a,r,n,e):(t,e,s)=>s);let o=!1,h=0;const l=this._roots;for(let t=0,e=l.length;t<e;t++){const e=l[t];if(o=Cs(this,t,r,n,i,h),o)break;h+=e.byteLength}return As.releasePrimitive(e),o}bvhcast(t,e,s){let{intersectsRanges:i,intersectsTriangles:r}=s;const n=As.getPrimitive(),a=this.geometry.index,o=this.geometry.attributes.position,h=this.indirect?t=>{const e=this.resolveTriangleIndex(t);Xs(n,3*e,a,o)}:t=>{Xs(n,3*t,a,o)},l=As.getPrimitive(),c=t.geometry.index,u=t.geometry.attributes.position,d=t.indirect?e=>{const s=t.resolveTriangleIndex(e);Xs(l,3*s,c,u)}:t=>{Xs(l,3*t,c,u)};if(r){const t=(t,s,i,a,o,c,u,p)=>{for(let m=i,y=i+a;m<y;m++){d(m),l.a.applyMatrix4(e),l.b.applyMatrix4(e),l.c.applyMatrix4(e),l.needsUpdate=!0;for(let e=t,i=t+s;e<i;e++)if(h(e),n.needsUpdate=!0,r(n,l,e,m,o,c,u,p))return!0}return!1};if(i){const e=i;i=function(s,i,r,n,a,o,h,l){return!!e(s,i,r,n,a,o,h,l)||t(s,i,r,n,a,o,h,l)}}else i=t}return function(t,e,s,i){if(Gi)throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");Gi=!0;const r=t._roots,n=e._roots;let a,o=0,h=0;const l=(new ot).copy(s).invert();for(let t=0,e=r.length;t<e;t++){Wi.setBuffer(r[t]),h=0;const e=Li.getPrimitive();De(as(0),Wi.float32Array,e),e.applyMatrix4(l);for(let t=0,r=n.length;t<r&&(Di.setBuffer(n[t]),a=Zi(0,0,s,l,i,o,h,0,0,e),Di.clearBuffer(),h+=n[t].length,!a);t++);if(Li.releasePrimitive(e),Wi.clearBuffer(),o+=r[t].length,a)break}return Gi=!1,a}(this,t,e,i)}intersectsBox(t,e){return Ji.set(t.min,t.max,e),Ji.needsUpdate=!0,this.shapecast({intersectsBounds:t=>Ji.intersectsBox(t),intersectsTriangle:t=>Ji.intersectsTriangle(t)})}intersectsSphere(t){return this.shapecast({intersectsBounds:e=>t.intersectsBox(e),intersectsTriangle:e=>e.intersectsSphere(t)})}closestPointToGeometry(t,e,s={},i={},r=0,n=1/0){return(this.indirect?Ri:xi)(this,t,e,s,i,r,n)}closestPointToPoint(t,e={},s=0,i=1/0){return function(t,e,s={},i=0,r=1/0){const n=i*i,a=r*r;let o=1/0,h=null;if(t.shapecast({boundsTraverseOrder:t=>(Fs.copy(e).clamp(t.min,t.max),Fs.distanceToSquared(e)),intersectsBounds:(t,e,s)=>s<o&&s<a,intersectsTriangle:(t,s)=>{t.closestPointToPoint(e,Fs);const i=e.distanceToSquared(Fs);return i<o&&(Is.copy(Fs),o=i,h=s),i<n}}),o===1/0)return null;const l=Math.sqrt(o);return s.point?s.point.copy(Is):s.point=Is.clone(),s.distance=l,s.faceIndex=h,s}(this,t,e,s,i)}getBoundingBox(t){return t.makeEmpty(),this._roots.forEach(e=>{De(0,new Float32Array(e),$i),t.union($i)}),t}}let tr;function er(t){return`#${Math.round(t.r).toString(16).padStart(2,\"0\")}${Math.round(t.g).toString(16).padStart(2,\"0\")}${Math.round(t.b).toString(16).padStart(2,\"0\")}`}function sr(t,e){return{r:parseInt(t.slice(1,3),16),g:parseInt(t.slice(3,5),16),b:parseInt(t.slice(5,7),16),a:e}}function ir(){if(0===Mesh.selected.length)return void Blockbench.showToastNotification({text:\"No meshes selected\"});if(Mesh.selected.length>1)return void Blockbench.showToastNotification({text:\"Multiple meshes selected\"});const t=function(){const t=localStorage.getItem(\"blockbench_baked_ao_settings\"),e={sampleMethod:\"random\",highlightColor:{r:231,g:230,b:184,a:.3},shadowColor:{r:36,g:11,b:55,a:.5},samples:1e3,aoShadowSize:32,aoHighlightSize:8,retainTextureTransparency:!1,sampleTextureTransparency:!1,shadowGamma:1,highlightGamma:.5,simulateGroundPlane:!0};if(t)try{return{...e,...JSON.parse(t)}}catch(t){console.warn(\"Failed to parse saved AO settings, using defaults\")}return e}();new Dialog(\"ambient_occlusion_config\",{title:\"Ambient Occlusion Settings\",form:{highlight_color:{label:\"Highlight Color\",type:\"color\",value:er(t.highlightColor),description:\"Color used for areas with high ambient lighting\"},highlight_alpha:{label:\"Highlight Opacity\",type:\"range\",min:0,max:1,step:.01,value:t.highlightColor.a,description:\"Opacity of the highlight color overlay\"},highlight_gamma:{label:\"Highlight Softness\",type:\"range\",min:.2,max:2,step:.1,value:t.highlightGamma,description:\"Gamma correction for highlight areas (lower = more contrast)\"},ao_highlight_size:{label:\"Highlight Size\",type:\"number\",min:1,max:64,step:1,value:t.aoHighlightSize,description:\"Ray distance for highlight detection (rays going into the surface)\"},shadow_color:{label:\"Shadow Color\",type:\"color\",value:er(t.shadowColor),description:\"Color used for occluded/shadowed areas\"},shadow_alpha:{label:\"Shadow Opacity\",type:\"range\",min:0,max:1,step:.01,value:t.shadowColor.a,description:\"Opacity of the shadow color overlay\"},shadow_gamma:{label:\"Shadow Softness\",type:\"range\",min:.2,max:2,step:.1,value:t.shadowGamma,description:\"Gamma correction for shadow areas (higher = softer shadows)\"},ao_shadow_size:{label:\"Shadow Size\",type:\"number\",min:1,max:64,step:1,value:t.aoShadowSize,description:\"Ray distance for shadow detection (rays going away from the surface)\"},samples:{label:\"Samples per pixel\",type:\"number\",min:10,max:1e4,step:100,value:t.samples,description:\"Number of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling.\"},sample_method:{label:\"Sample Method\",type:\"inline_select\",options:{random:\"Random\",uniform:\"Uniform\"},value:t.sampleMethod,description:\"Method for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts.\"},simulate_ground_plane:{label:\"Simulate Ground Plane\",type:\"checkbox\",value:t.simulateGroundPlane,description:\"Simulate a ground plane, adding shadows at the base of the model\"},retain_texture_transparency:{label:\"Retain Texture Transparency\",type:\"checkbox\",value:t.retainTextureTransparency,description:\"Preserve the original transparency of textures\"},sample_texture_transparency:{label:\"Sample Texture Transparency\",type:\"checkbox\",value:t.sampleTextureTransparency,description:\"Consider texture transparency when calculating occlusion (slower but more accurate)\"}},onConfirm:async function(t){const e={onProgress:t=>{Blockbench.setProgress(t),r.progress_bar.setProgress(t);const e=performance.now()-s,i=r.object.querySelector(\".dialog_title\");if(i)if(e>3e3||t>.2){const s=function(t){const e=Math.floor(t/1e3),s=Math.floor(e/60),i=e%60,r=s%60,n=Math.floor(s/60);return n>0?`${n}h ${r}m ${i}s`:r>0?`${r}m ${i}s`:`${i}s`}(e/t-e);i.textContent=`Baking Ambient Occlusion (~ ${s} remaining)`}else i.textContent=\"Baking Ambient Occlusion\"},highlightColor:sr(\"#\"+t.highlight_color.toHex(),t.highlight_alpha),shadowColor:sr(\"#\"+t.shadow_color.toHex(),t.shadow_alpha),samples:t.samples,aoShadowSize:t.ao_shadow_size,aoHighlightSize:t.ao_highlight_size,retainTextureTransparency:t.retain_texture_transparency,sampleTextureTransparency:t.sample_texture_transparency,shadowGamma:t.shadow_gamma,highlightGamma:t.highlight_gamma,simulateGroundPlane:t.simulate_ground_plane,sampleMethod:t.sample_method};!function(t){localStorage.setItem(\"blockbench_baked_ao_settings\",JSON.stringify(t))}({highlightColor:e.highlightColor,shadowColor:e.shadowColor,samples:e.samples,aoShadowSize:e.aoShadowSize,aoHighlightSize:e.aoHighlightSize,retainTextureTransparency:e.retainTextureTransparency,sampleTextureTransparency:e.sampleTextureTransparency,shadowGamma:e.shadowGamma,highlightGamma:e.highlightGamma,simulateGroundPlane:e.simulateGroundPlane,sampleMethod:e.sampleMethod});const s=performance.now(),i={cancelled:!1},r=new Dialog(\"bake_ambient_occlusion_loading\",{title:\"Baking Ambient Occlusion\",progress_bar:{progress:0},cancel_on_click_outside:!1,singleButton:!0,buttons:[\"Cancel\"],onCancel:function(){i.cancelled=!0}});r.show();try{await async function(t,e){let s=!1,i=!1,r=0,n=0;performance.mark(\"startAO\");for(const a of Mesh.selected){let o=!1,h=0;a.forAllFaces(t=>{t.isSelected()&&(o=!0),h++});const l=await rr(a,o,t,e);s=s||l.anyMissing,i=i||l.anyWithTextures,r+=l.totalPixelsProcessed,n+=l.totalFacesProcessed}performance.mark(\"endAO\");const a=performance.measure(\"AO Processing Time\",\"startAO\",\"endAO\");console.log(`AO Processing Time: ${a.duration}ms`),i?s&&Blockbench.showToastNotification({text:\"Some faces are missing textures\"}):Blockbench.showToastNotification({text:\"No textures found on selected meshes\"})}(e,i)}finally{r.hide(),Blockbench.setProgress(0)}},buttons:[\"Confirm\",\"Restore Defaults\",\"Cancel\"],onButton(t,e){1===t&&(localStorage.removeItem(\"blockbench_baked_ao_settings\"),ir())}}).show()}async function rr(t,e,s,i){let r=!1,n=!1,a=0,o=0;const h=[];t.forAllFaces(t=>h.push(t));const l=new Map;for(const t of h){const s=t.getTexture();s?e&&!t.isSelected()||(n=!0,l.has(s)||l.set(s,[]),l.get(s).push(t)):r=!0}const[c]=function(t){if(!(t.mesh&&t.mesh instanceof THREE.Mesh))throw console.log(t),new Error(\"Invalid mesh object\");const e=t.mesh.geometry;if(!e||!e.attributes||!e.attributes.position)throw console.log(e),new Error(\"Mesh does not have valid geometry attributes\");const s=e.attributes.position;let i=-1/0,r=1/0;for(let t=0;t<s.count;t++){const e=s.getY(t);e>i&&(i=e),e<r&&(r=e)}return[r,i]}(t),u=s.simulateGroundPlane?function(t){const e=new THREE.Mesh(new THREE.PlaneGeometry(1e3,1e3),new THREE.MeshBasicMaterial({color:0,side:THREE.FrontSide,transparent:!0,opacity:.5}));return e.rotation.set(-Math.PI/2,0,0),e.position.setY(t-1),e.updateMatrix(),e.updateWorldMatrix(!1,!1),e}(c):null,d=t.mesh.geometry,p=d.clone(),m=new Ki(d,{indirect:!0,maxDepth:1e3,maxLeafTris:1}),y=function(t){const e=new Map;let s=0;for(let i in t.faces){const r=t.faces[i],n=r.vertices;n.length<3||(3===n.length?(e.set(s,r),s+=1):4===n.length&&(e.set(s,r),e.set(s+1,r),s+=2))}return{faceIndexToBlockbenchFace:e}}(t);try{for(const[e,r]of l){const{pixelsProcessed:n,facesProcessed:h}=await nr(e,r,t,u,m,y,s,i);a+=n,o+=h}return{anyMissing:r,anyWithTextures:n,totalPixelsProcessed:a,totalFacesProcessed:o}}finally{t.mesh.geometry=p}}async function nr(t,e,s,i,r,n,a,o){const h=new Map;let l=0;for(const t of e){const s=t.getOccupationMatrix(),c=t.getTexture();if(!c)continue;const u=c.width/c.uv_width,d=c.height/c.uv_height;if(u!==d)throw new Error(`Non-uniform pixel density detected for texture ${c.name}`);const p=[];Object.keys(s).forEach(t=>{Object.keys(s[t]).forEach(e=>{const i=s[t][e],r=parseInt(t,10),n=parseInt(e,10);if(!0===i)for(let t=0;t<u;t++)for(let e=0;e<d;e++)p.push([Math.floor(r*u+t),Math.floor(n*d+e)])})});let m=0;for(const[e,s]of p){const l=`${e},${s}`;let{x:c,y:p,z:y}=t.UVToLocal([(e+.5)/u,(s+.5)/d]);const f=or([c,p,y],0,t,0,i,r,n,a,hr(a.samples));if(f){const[t,e]=f,s=h.get(l);(!s||e<s.backfaceRatio)&&h.set(l,{color:t,backfaceRatio:e})}if(m++,m%32==0&&await new Promise(t=>setTimeout(t,0)),o.cancelled)throw new Error(\"Job cancelled\")}l++,a?.onProgress?.(l/e.length)}let c=0;return t.edit(t=>{const e=t.getContext(\"2d\");for(const[t,s]of h){const[i,r]=t.split(\",\").map(t=>parseInt(t,10));let[n,o,h,l]=s.color;a.retainTextureTransparency&&(l*=e.getImageData(i,r,1,1).data[3]/255),e.fillStyle=`rgba(${n}, ${o}, ${h}, ${l})`,e.fillRect(i,r,1,1),c++}}),{pixelsProcessed:c,facesProcessed:e.length}}Plugin.register(\"baked_ambient_occlusion\",{title:\"Mr Salmon's Baked Ambient Occlusion\",author:\"Kai Salmon\",description:\"Baked Ambient Occlusion, creating instant shading\",icon:\"icon.png\",version:\"1.0.0\",min_version:\"4.8.0\",variant:\"both\",repository:\"https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion\",has_changelog:!1,tags:[\"Texture\",\"Shading\"],onload(){tr=new Action(\"bake_ambient_occlusion\",{name:\"Bake Ambient Occlusion\",description:\"Perform ambient occlusion baking on selected meshes\",icon:\"cake\",click:function(){ir()}}),MenuBar.addAction(tr,\"filter\")},onunload(){tr.delete()}});const ar={origin:new THREE.Vector3,direction:new THREE.Vector3,normal:new THREE.Vector3};function or(t,e,s,i,r,n,a,o,h){const[l,c,u]=t,[d,p,m]=s.getNormal(!0);ar.normal.set(d,p,m);let y=0,f=0;const x=o.samples;for(let t=0;t<x;t++){let e;ar.origin.set(l,c,u).addScaledVector(ar.normal,.5),\"random\"===o.sampleMethod?(ar.origin.x+=.5*(Math.random()-.5),ar.origin.y+=.5*(Math.random()-.5),ar.origin.z+=.5*(Math.random()-.5),ar.direction.set(2*(Math.random()-.5),2*(Math.random()-.5),2*(Math.random()-.5)).normalize(),e=ar.direction):e=h[t];const s=e.dot(ar.normal)>=0?o.aoShadowSize:o.aoHighlightSize,i=new THREE.Raycaster(ar.origin,e,.001,s),d=n.raycastFirst(i.ray,THREE.DoubleSide,.001,s);if(d){const t=d.face.normal;if(ar.direction.dot(t)>0&&(f+=1),o.sampleTextureTransparency){const t=a.faceIndexToBlockbenchFace.get(d.faceIndex);if(t){const[e,s]=t.localToUV(d.point),i=t.getTexture();y+=i?i.ctx.getImageData(e,s,1,1).data[3]/255:1}else y+=1}else y+=1}else r&&i.intersectObject(r).length>0&&(y+=1)}let g=1-y/x;const b=f/x;let w,_;return g<.5?(w=2*(.5-g),w=Math.pow(w,o.shadowGamma),_=o.shadowColor):(w=2*(g-.5),w=Math.pow(w,o.highlightGamma),_=o.highlightColor),[[_.r,_.g,_.b,_.a*w],b]}function hr(t){const e={},s=Math.PI*(3-Math.sqrt(5));for(let i=0;i<t;i++){const r=1-i/(t-1)*2,n=Math.sqrt(1-r*r),a=s*i;e[i]=new THREE.Vector3(n*Math.cos(a),r,n*Math.sin(a))}return e}return{}})());"
  },
  {
    "path": "plugins/baked_ambient_occlusion/members.yml",
    "content": "maintainers:\n  - kaisalmon\ndevelopers:\n  - kaisalmon\n"
  },
  {
    "path": "plugins/baked_ambient_occlusion/package.json",
    "content": "{\n  \"name\": \"blockbench-baked-ao\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Baked Ambient Occlusion for Blockbench\",\n  \"main\": \"dist/index.js\",\n  \"scripts\": {\n    \"build\": \"webpack --mode production\",\n    \"dev\": \"webpack --mode development\",\n    \"watch\": \"webpack --mode development --watch\"\n  },\n  \"devDependencies\": {\n    \"@types/three\": \"^0.160.0\",\n    \"blockbench-types\": \"^4.12.2\",\n    \"ts-loader\": \"^9.5.1\",\n    \"typescript\": \"^5.3.3\",\n    \"webpack\": \"^5.89.0\",\n    \"webpack-cli\": \"^5.1.4\"\n  },\n  \"dependencies\": {\n    \"three\": \"^0.160.0\",\n    \"three-mesh-bvh\": \"^0.9.1\"\n  }\n}\n"
  },
  {
    "path": "plugins/baked_ambient_occlusion/src/index.ts",
    "content": "import {\n    MeshBVH,\n} from 'three-mesh-bvh';\n\ndeclare const THREE: typeof import('three');\ninterface Color {\n    r: number;\n    g: number;\n    b: number;\n    a: number;\n}\n\ninterface VectorPool {\n    origin: THREE.Vector3;\n    direction: THREE.Vector3;\n    normal: THREE.Vector3;\n}\n\ninterface PixelResult {\n    color: [number, number, number, number];\n    backfaceRatio: number;\n}\n\n// New interface for the face mapping\ninterface FaceMapping {\n    faceIndexToBlockbenchFace: Map<number, MeshFace>;\n}\n\nlet button: Action;\n\n(Plugin as any).register('baked_ambient_occlusion', {\n    \"title\": \"Mr Salmon's Baked Ambient Occlusion\",\n    \"author\": \"Kai Salmon\",\n    \"description\": \"Baked Ambient Occlusion, creating instant shading\",\n    \"icon\": \"icon.png\",\n    \"version\": \"1.0.0\",\n    \"min_version\": \"4.8.0\",\n    \"variant\": \"both\",\n    \"repository\": \"https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion\",\n    \"has_changelog\": false,\n    \"tags\": [\n        \"Texture\",\n        \"Shading\"\n    ],\n    onload(): void {\n        button = new Action('bake_ambient_occlusion', {\n            name: 'Bake Ambient Occlusion',\n            description: 'Perform ambient occlusion baking on selected meshes',\n            icon: 'cake',\n            click: function (): void {\n                showAmbientOcclusionDialog();\n            }\n        });\n        MenuBar.addAction(button, 'filter');\n    },\n    onunload(): void {\n        button.delete();\n    }\n});\n\n/**\n * Convert RGB color object to hex string for color picker\n */\nfunction colorToHex(color: Color): string {\n    const r = Math.round(color.r).toString(16).padStart(2, '0');\n    const g = Math.round(color.g).toString(16).padStart(2, '0');\n    const b = Math.round(color.b).toString(16).padStart(2, '0');\n    return `#${r}${g}${b}`;\n}\n\n/**\n * Convert hex string to RGB color object\n */\nfunction hexToColor(hex: string, alpha: number): Color {\n    const r = parseInt(hex.slice(1, 3), 16);\n    const g = parseInt(hex.slice(3, 5), 16);\n    const b = parseInt(hex.slice(5, 7), 16);\n    return { r, g, b, a: alpha };\n}\n\nfunction showAmbientOcclusionDialog(): void {\n    if (Mesh.selected.length === 0) {\n        Blockbench.showToastNotification({\n            text: 'No meshes selected',\n        });\n        return;\n    }\n    if (Mesh.selected.length > 1) {\n        Blockbench.showToastNotification({\n            text: 'Multiple meshes selected',\n        });\n        return;\n    }\n\n\n    // Load saved settings or use defaults\n    const savedSettings = getPluginSettings();\n\n    const dialog = new Dialog('ambient_occlusion_config', {\n        title: 'Ambient Occlusion Settings',\n        // width: 400,\n        form: {\n            highlight_color: {\n                label: 'Highlight Color',\n                type: 'color',\n                value: colorToHex(savedSettings.highlightColor),\n                description: 'Color used for areas with high ambient lighting'\n            },\n            highlight_alpha: {\n                label: 'Highlight Opacity',\n                type: 'range',\n                min: 0,\n                max: 1,\n                step: 0.01,\n                value: savedSettings.highlightColor.a,\n                description: 'Opacity of the highlight color overlay'\n            },\n            highlight_gamma: {\n                label: 'Highlight Softness',\n                type: 'range',\n                min: 0.2,\n                max: 2.0,\n                step: 0.1,\n                value: savedSettings.highlightGamma,\n                description: 'Gamma correction for highlight areas (lower = more contrast)'\n            },\n            ao_highlight_size: {\n                label: 'Highlight Size',\n                type: 'number',\n                min: 1,\n                max: 64,\n                step: 1,\n                value: savedSettings.aoHighlightSize,\n                description: 'Ray distance for highlight detection (rays going into the surface)'\n            },\n            shadow_color: {\n                label: 'Shadow Color',\n                type: 'color',\n                value: colorToHex(savedSettings.shadowColor),\n                description: 'Color used for occluded/shadowed areas'\n            },\n            shadow_alpha: {\n                label: 'Shadow Opacity',\n                type: 'range',\n                min: 0,\n                max: 1,\n                step: 0.01,\n                value: savedSettings.shadowColor.a,\n                description: 'Opacity of the shadow color overlay'\n            },\n            shadow_gamma: {\n                label: 'Shadow Softness',\n                type: 'range',\n                min: 0.2,\n                max: 2.0,\n                step: 0.1,\n                value: savedSettings.shadowGamma,\n                description: 'Gamma correction for shadow areas (higher = softer shadows)'\n            },\n            ao_shadow_size: {\n                label: 'Shadow Size',\n                type: 'number',\n                min: 1,\n                max: 64,\n                step: 1,\n                value: savedSettings.aoShadowSize,\n                description: 'Ray distance for shadow detection (rays going away from the surface)'\n            },\n            samples: {\n                label: 'Samples per pixel',\n                type: 'number',\n                min: 10,\n                max: 10000,\n                step: 100,\n                value: savedSettings.samples,\n                description: 'Number of samples per pixel (higher = better quality, slower). 100 recommended for uniform sampling, 1000 for random sampling.'\n            },\n            sample_method: {\n                label: 'Sample Method',\n                type: 'inline_select',\n                options: {\n                    'random': 'Random',\n                    'uniform': 'Uniform',\n                },\n                value: savedSettings.sampleMethod,\n                description: 'Method for sampling ambient occlusion rays. Random is slightly more accurate but noisier, uniform is smoother for less samples but is more prone to artifacts.'\n            },\n            simulate_ground_plane: {\n                label: 'Simulate Ground Plane',\n                type: 'checkbox',\n                value: savedSettings.simulateGroundPlane,\n                description: 'Simulate a ground plane, adding shadows at the base of the model'\n            },\n            retain_texture_transparency: {\n                label: 'Retain Texture Transparency',\n                type: 'checkbox',\n                value: savedSettings.retainTextureTransparency,\n                description: 'Preserve the original transparency of textures'\n            },\n            sample_texture_transparency: {\n                label: 'Sample Texture Transparency',\n                type: 'checkbox',\n                value: savedSettings.sampleTextureTransparency,\n                description: 'Consider texture transparency when calculating occlusion (slower but more accurate)'\n            },\n        },\n        onConfirm: async function (formResult: any) {\n            const options: BakeAmbientOcclusionOptions = {\n                onProgress: (progress: number) => {\n                    Blockbench.setProgress(progress)\n                    loadingDialog.progress_bar!.setProgress(progress);\n                    const elapsedMs = performance.now() - startTime;\n                    const dialogObject: Element = (loadingDialog as any).object;\n                    const titleElem = dialogObject.querySelector('.dialog_title');\n                    if (titleElem) {\n                        if (elapsedMs > 3000 || progress > 0.2) {\n                            const estimatedTotalMs = elapsedMs / progress;\n                            const estimatedRemainingMs = estimatedTotalMs - elapsedMs;\n                            const formattedTime = formatMsToReadableTime(estimatedRemainingMs);\n                            titleElem.textContent = `Baking Ambient Occlusion (~ ${formattedTime} remaining)`;\n                        } else {\n                            titleElem.textContent = `Baking Ambient Occlusion`;\n                        }\n                    }\n                },\n                highlightColor: hexToColor('#' + formResult.highlight_color.toHex(), formResult.highlight_alpha),\n                shadowColor: hexToColor('#' + formResult.shadow_color.toHex(), formResult.shadow_alpha),\n                samples: formResult.samples,\n                aoShadowSize: formResult.ao_shadow_size,\n                aoHighlightSize: formResult.ao_highlight_size,\n                retainTextureTransparency: formResult.retain_texture_transparency,\n                sampleTextureTransparency: formResult.sample_texture_transparency,\n                shadowGamma: formResult.shadow_gamma,\n                highlightGamma: formResult.highlight_gamma,\n                simulateGroundPlane: formResult.simulate_ground_plane,\n                sampleMethod: formResult.sample_method\n            };\n\n            // Save settings for next session\n            savePluginSettings({\n                highlightColor: options.highlightColor,\n                shadowColor: options.shadowColor,\n                samples: options.samples,\n                aoShadowSize: options.aoShadowSize,\n                aoHighlightSize: options.aoHighlightSize,\n                retainTextureTransparency: options.retainTextureTransparency,\n                sampleTextureTransparency: options.sampleTextureTransparency,\n                shadowGamma: options.shadowGamma,\n                highlightGamma: options.highlightGamma,\n                simulateGroundPlane: options.simulateGroundPlane,\n                sampleMethod: options.sampleMethod\n            });\n\n            const startTime = performance.now();\n            const jobController = {\n                cancelled: false\n            }\n            const loadingDialog = new Dialog('bake_ambient_occlusion_loading', {\n                title: 'Baking Ambient Occlusion',\n                progress_bar: {\n                    progress: 0,\n                },\n                cancel_on_click_outside: false,\n                singleButton: true,\n                buttons: ['Cancel'],\n                onCancel: function () {\n                    jobController.cancelled = true;\n                }\n            });\n\n            loadingDialog.show();\n            try {\n                await bakeAmbientOcclusion(options, jobController);\n            } finally {\n                loadingDialog.hide();\n                Blockbench.setProgress(0);\n            }\n        },\n        buttons: ['Confirm', 'Restore Defaults', 'Cancel'],\n        onButton(button_index: number, e: Event): void {\n            if (button_index === 1) {\n                localStorage.removeItem('blockbench_baked_ao_settings');\n                showAmbientOcclusionDialog();\n            }\n        },\n    });\n\n    dialog.show();\n}\n\ninterface BakeAmbientOcclusionOptions {\n    sampleMethod: 'random' | 'uniform';\n    onProgress?: (progress: number) => void;\n    highlightColor: Color;\n    shadowColor: Color;\n    samples: number;\n    aoShadowSize: number;\n    aoHighlightSize: number;\n    retainTextureTransparency: boolean;\n    sampleTextureTransparency: boolean;\n    shadowGamma: number;\n    highlightGamma: number;\n    simulateGroundPlane: boolean;\n}\ninterface JobController {\n    cancelled: boolean;\n}\n\nasync function bakeAmbientOcclusion(opts: BakeAmbientOcclusionOptions, jobController: JobController): Promise<void> {\n    let anyMissing: boolean = false;\n    let anyWithTextures: boolean = false;\n    let pixelCount: number = 0;\n    let faceCount: number = 0;\n\n    performance.mark(\"startAO\");\n\n    for (const mesh of Mesh.selected) {\n        let hasSelectedFaces: boolean = false;\n        let facesInMesh = 0;\n        mesh.forAllFaces((face: MeshFace) => {\n            if (face.isSelected()) {\n                hasSelectedFaces = true;\n            }\n            facesInMesh++;\n        });\n\n        // Process each face\n        const result = await processMeshFaces(mesh, hasSelectedFaces, opts, jobController);\n        anyMissing = anyMissing || result.anyMissing;\n        anyWithTextures = anyWithTextures || result.anyWithTextures;\n        pixelCount += result.totalPixelsProcessed;\n        faceCount += result.totalFacesProcessed;\n    }\n\n    performance.mark(\"endAO\");\n    const measure: PerformanceMeasure = performance.measure(\"AO Processing Time\", \"startAO\", \"endAO\");\n    console.log(`AO Processing Time: ${measure.duration}ms`);\n\n    if (!anyWithTextures) {\n        Blockbench.showToastNotification({\n            text: 'No textures found on selected meshes',\n        });\n    } else if (anyMissing) {\n        Blockbench.showToastNotification({\n            text: 'Some faces are missing textures',\n        });\n    }\n\n}\n\n\nfunction buildFaceMapping(mesh: Mesh): FaceMapping {\n    // NOTE: This code duplicates some esoteric logic in from within Blockbench\n    const faceIndexToBlockbenchFace = new Map<number, MeshFace>();\n    let currentFaceIndex = 0;\n\n    for (let key in mesh.faces) {\n        const face = mesh.faces[key];\n        const vertices = face.vertices;\n\n        if (vertices.length < 3) continue;\n\n        if (vertices.length === 3) {\n            faceIndexToBlockbenchFace.set(currentFaceIndex, face);\n            currentFaceIndex += 1;\n        } else if (vertices.length === 4) {\n            faceIndexToBlockbenchFace.set(currentFaceIndex, face);\n            faceIndexToBlockbenchFace.set(currentFaceIndex + 1, face);\n            currentFaceIndex += 2;\n        }\n    }\n\n    return { faceIndexToBlockbenchFace };\n}\n\ninterface ProcessMeshFacesResult {\n    anyMissing: boolean;\n    anyWithTextures: boolean;\n    totalPixelsProcessed: number;\n    totalFacesProcessed: number;\n}\n\n\nasync function processMeshFaces(mesh: Mesh, hasSelectedFaces: boolean, opts: BakeAmbientOcclusionOptions, jobController: JobController): Promise<ProcessMeshFacesResult> {\n    let anyMissing: boolean = false;\n    let anyWithTextures: boolean = false;\n    let totalPixelsProcessed: number = 0;\n    let totalFacesProcessed = 0;\n    const faces: MeshFace[] = [];\n    mesh.forAllFaces((face: MeshFace) => faces.push(face));\n\n    // Group faces by texture\n    const facesByTexture: Map<Texture, MeshFace[]> = new Map();\n\n    for (const face of faces) {\n        const tex: Texture | undefined = face.getTexture();\n        if (!tex) {\n            anyMissing = true;\n            continue;\n        }\n\n        if (hasSelectedFaces && !face.isSelected()) continue;\n\n        anyWithTextures = true;\n\n        if (!facesByTexture.has(tex)) {\n            facesByTexture.set(tex, []);\n        }\n        facesByTexture.get(tex)!.push(face);\n    }\n\n    const [lowestY]: [number, number] = getHighestAndLowestY(mesh);\n\n    const groundPlane: THREE.Mesh | null = opts.simulateGroundPlane ? createGroundPlane(lowestY) : null;\n\n    const geometry: THREE.BufferGeometry = (mesh.mesh as THREE.Mesh).geometry;\n    const geometryBackup = geometry.clone(); // Backup as BVH mutates the geometry in a way that causes bugs in Blockbench\n    const bvh: MeshBVH = new MeshBVH(geometry, {\n        indirect: true,\n        maxDepth: 1000,\n        maxLeafTris: 1,\n    });\n\n    const faceMapping = buildFaceMapping(mesh);\n\n    try {\n        for (const [texture, textureFaces] of facesByTexture) {\n            const { pixelsProcessed, facesProcessed } = await processTextureWithFaces(\n                texture, textureFaces, mesh, groundPlane, bvh, faceMapping, opts, jobController\n            );\n            totalPixelsProcessed += pixelsProcessed;\n            totalFacesProcessed += facesProcessed;\n        }\n\n        return { anyMissing, anyWithTextures, totalPixelsProcessed, totalFacesProcessed };\n    } finally {\n        (mesh.mesh as THREE.Mesh).geometry = geometryBackup;\n    }\n}\n\nfunction createGroundPlane(lowestY: number) {\n    const groundPlane: THREE.Mesh = new THREE.Mesh(\n        new THREE.PlaneGeometry(1000, 1000),\n        new THREE.MeshBasicMaterial({\n            color: 0x000000,\n            side: THREE.FrontSide,\n            transparent: true,\n            opacity: 0.5\n        })\n    );\n    groundPlane.rotation.set(-Math.PI / 2, 0, 0); // Rotate to be horizontal\n    groundPlane.position.setY(lowestY - 1);\n    groundPlane.updateMatrix();\n    groundPlane.updateWorldMatrix(false, false);\n    return groundPlane;\n}\n\nasync function processTextureWithFaces(\n    texture: Texture,\n    faces: MeshFace[],\n    mesh: Mesh,\n    groundPlane: THREE.Mesh | null,\n    bvh: MeshBVH,\n    faceMapping: FaceMapping,\n    opts: BakeAmbientOcclusionOptions,\n    jobController: JobController\n): Promise<{\n    pixelsProcessed: number;\n    facesProcessed: number;\n}> {\n\n    const bestResults: Map<string, PixelResult> = new Map();\n\n    let facesProcessed: number = 0;\n    for (const face of faces) {\n        const occupationMatrix: Record<string, Record<string, boolean>> = face.getOccupationMatrix();\n        const texture = face.getTexture();\n        if (!texture) continue;\n        const pixelDensityU = texture.width / texture.uv_width;\n        const pixelDensityV = texture.height / texture.uv_height;\n        if (pixelDensityU !== pixelDensityV) {\n            throw new Error(`Non-uniform pixel density detected for texture ${texture.name}`);\n        }\n        const pixelCoords: [number, number][] = [];\n        Object.keys(occupationMatrix).forEach((uStr: string) => {\n            Object.keys(occupationMatrix[uStr]).forEach((vStr: string) => {\n                const value: boolean = occupationMatrix[uStr][vStr];\n                const u = parseInt(uStr, 10);\n                const v = parseInt(vStr, 10);\n                if (value === true) {\n                    for (let x = 0; x < pixelDensityU; x++) {\n                        for (let y = 0; y < pixelDensityV; y++) {\n                            pixelCoords.push([Math.floor(u * pixelDensityU + x), Math.floor(v * pixelDensityV + y)]);\n                        }\n                    }\n                }\n            });\n        });\n\n        let i = 0;\n        // Process pixels for this face\n        for (const [u, v] of pixelCoords) {\n            const key: string = `${u},${v}`;\n\n            // Get x,y,z in 3d space of the face at this u,v\n            let { x, y, z } = face.UVToLocal([(u + 0.5) / pixelDensityU, (v + 0.5) / pixelDensityV]);\n            const result = calculateAmbientOcclusion([x, y, z], [u, v], face, mesh, groundPlane, bvh, faceMapping, opts, generateFibonacciSpherePoints(opts.samples));\n\n            if (result) {\n                const [color, backfaceRatio] = result;\n\n                // Check if this is the best result for this pixel so far\n                const existing = bestResults.get(key);\n                if (!existing || backfaceRatio < existing.backfaceRatio) {\n                    bestResults.set(key, {\n                        color: color,\n                        backfaceRatio: backfaceRatio\n                    });\n                }\n            }\n\n            i++;\n            if (i % 32 === 0) {\n                // Yield to allow UI updates\n                await new Promise(resolve => setTimeout(resolve, 0));\n            }\n            if (jobController.cancelled) {\n                throw new Error('Job cancelled');\n            }\n        }\n        facesProcessed++;\n        opts?.onProgress?.(facesProcessed / faces.length);\n    }\n\n    let processedPixels: number = 0;\n    texture.edit((htmlCanvasElement: HTMLCanvasElement) => {\n        const ctx: CanvasRenderingContext2D = htmlCanvasElement.getContext('2d')!;\n\n        for (const [pixelKey, result] of bestResults) {\n            const [u, v] = pixelKey.split(',').map(x => parseInt(x, 10));\n            let [r, g, b, a] = result.color;\n\n            if (opts.retainTextureTransparency) {\n                const srcAlpha = ctx.getImageData(u, v, 1, 1).data[3];\n                a *= srcAlpha / 255;\n            }\n\n            ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`;\n            ctx.fillRect(u, v, 1, 1);\n            processedPixels++;\n        }\n    });\n\n    return {\n        pixelsProcessed: processedPixels,\n        facesProcessed: faces.length\n    };\n}\n\nconst vectorPool: VectorPool = {\n    origin: new THREE.Vector3(),\n    direction: new THREE.Vector3(),\n    normal: new THREE.Vector3()\n};\n\n\nfunction calculateAmbientOcclusion(\n    position: [number, number, number],\n    uv: [number, number],\n    face: MeshFace,\n    mesh: Mesh,\n    groundPlane: THREE.Mesh | null,\n    bvh: MeshBVH,\n    faceMapping: FaceMapping,\n    opts: BakeAmbientOcclusionOptions,\n    spherePoints: Record<number, THREE.Vector3>,\n): [[number, number, number, number], number] | null {\n    const [x, y, z]: [number, number, number] = position;\n    const [normalX, normalY, normalZ]: [number, number, number] = face.getNormal(true);\n\n    vectorPool.normal.set(normalX, normalY, normalZ);\n\n    let occlusion: number = 0;\n    let backfaceHits: number = 0;\n    const rayCount: number = opts.samples;\n\n    for (let i: number = 0; i < rayCount; i++) {\n        let direction: THREE.Vector3;\n        vectorPool.origin.set(x, y, z)\n            .addScaledVector(vectorPool.normal, 0.5);\n        if (opts.sampleMethod === 'random') {\n            vectorPool.origin.x += (Math.random() - 0.5) * 0.5\n            vectorPool.origin.y += (Math.random() - 0.5) * 0.5;\n            vectorPool.origin.z += (Math.random() - 0.5) * 0.5;\n            vectorPool.direction.set(\n                (Math.random() - 0.5) * 2,\n                (Math.random() - 0.5) * 2,\n                (Math.random() - 0.5) * 2\n            ).normalize();\n            direction = vectorPool.direction;\n        } else {\n            direction = spherePoints[i];\n        }\n        const rayDot = direction.dot(vectorPool.normal);\n        const radius = rayDot >= 0 ? opts.aoShadowSize : opts.aoHighlightSize;\n        const raycaster: THREE.Raycaster = new THREE.Raycaster(vectorPool.origin, direction, 0.001, radius);\n\n        const hit = bvh.raycastFirst(raycaster.ray, THREE.DoubleSide, 0.001, radius);\n        if (hit) {\n            const faceNormal = hit.face!.normal!;\n            const dot = vectorPool.direction.dot(faceNormal);\n            if (dot > 0) {\n                backfaceHits += 1;\n            }\n            if (!opts.sampleTextureTransparency) {\n                occlusion += 1;\n            } else {\n                // Use the optimized face lookup instead of the expensive linear search\n                const blockbenchFace = faceMapping.faceIndexToBlockbenchFace.get(hit.faceIndex!);\n                if (blockbenchFace) {\n                    const [hitU, hitV] = blockbenchFace.localToUV(hit.point!);\n                    const texture: Texture | undefined = blockbenchFace.getTexture();\n                    if (texture) {\n                        const pixelColor: ImageData = texture.ctx.getImageData(hitU, hitV, 1, 1);\n                        occlusion += pixelColor.data[3] / 255;\n                    } else {\n                        occlusion += 1;\n                    }\n                } else {\n                    // Fallback to 1 if face not found (shouldn't happen with proper mapping)\n                    occlusion += 1;\n                }\n            }\n        } else {\n            // Check if the ray intersects the ground plane\n            const groundPlaneHit = groundPlane && raycaster.intersectObject(groundPlane).length > 0;\n            if (groundPlaneHit) {\n                occlusion += 1;\n            }\n        }\n    }\n\n    let occlusionFactor: number = 1 - occlusion / rayCount;\n    const backfaceRatio = backfaceHits / rayCount;\n\n    let t: number;\n    let color: Color;\n\n    if (occlusionFactor < 0.5) {\n        t = (0.5 - occlusionFactor) * 2;\n        t = Math.pow(t, opts.shadowGamma);\n        color = opts.shadowColor;\n    } else {\n        t = (occlusionFactor - 0.5) * 2;\n        t = Math.pow(t, opts.highlightGamma);\n        color = opts.highlightColor;\n    }\n\n    return [\n        [color.r, color.g, color.b, color.a * t],\n        backfaceRatio\n    ];\n}\n\n/**\n * Get the highest and lowest Y coordinates of all vertices in a mesh\n * @param mesh - The mesh to analyze\n * @returns [lowestY, highestY]\n */\nfunction getHighestAndLowestY(mesh: Mesh): [number, number] {\n\n    if (!mesh.mesh || !(mesh.mesh instanceof THREE.Mesh)) {\n        console.log(mesh);\n        throw new Error('Invalid mesh object');\n    }\n\n    const geometry = mesh.mesh.geometry;\n\n    if (!geometry || !geometry.attributes || !geometry.attributes.position) {\n        console.log(geometry);\n        throw new Error('Mesh does not have valid geometry attributes');\n    }\n\n    const positionAttribute: THREE.BufferAttribute = geometry.attributes.position as THREE.BufferAttribute;\n    let highestY: number = -Infinity;\n    let lowestY: number = Infinity;\n\n    for (let i: number = 0; i < positionAttribute.count; i++) {\n        const y: number = positionAttribute.getY(i);\n        if (y > highestY) highestY = y;\n        if (y < lowestY) lowestY = y;\n    }\n\n    return [lowestY, highestY];\n}\n\nfunction formatMsToReadableTime(estimatedRemainingMs: number) {\n    const totalSeconds = Math.floor(estimatedRemainingMs / 1000);\n    const totalMinutes = Math.floor(totalSeconds / 60);\n    const seconds = totalSeconds % 60;\n    const minutes = totalMinutes % 60;\n    const hours = Math.floor(totalMinutes / 60);\n    if (hours > 0) {\n        return `${hours}h ${minutes}m ${seconds}s`;\n    }\n    if (minutes > 0) {\n        return `${minutes}m ${seconds}s`;\n    }\n    return `${seconds}s`;\n}\n\nfunction generateFibonacciSpherePoints(n: number): Record<number, THREE.Vector3> {\n    const points: Record<number, THREE.Vector3> = {};\n    const phi = Math.PI * (3 - Math.sqrt(5)); // Golden angle in radians\n    for (let i = 0; i < n; i++) {\n        const y = 1 - (i / (n - 1)) * 2; // y goes from 1 to -1\n        const radius = Math.sqrt(1 - y * y); // Radius at y\n        const theta = phi * i; // Golden angle increment\n        points[i] = new THREE.Vector3(\n            radius * Math.cos(theta),\n            y,\n            radius * Math.sin(theta)\n        );\n    }\n    return points;\n}\n\nfunction getPluginSettings(): BakeAmbientOcclusionOptions {\n    const savedSettings = localStorage.getItem('blockbench_baked_ao_settings');\n    const defaultSettings = {\n        sampleMethod: 'random' as 'random' | 'uniform',\n        highlightColor: { r: 231, g: 230, b: 184, a: 0.3 },\n        shadowColor: { r: 36, g: 11, b: 55, a: 0.5 },\n        samples: 1000,\n        aoShadowSize: 32,\n        aoHighlightSize: 8,\n        retainTextureTransparency: false,\n        sampleTextureTransparency: false,\n        shadowGamma: 1.0,\n        highlightGamma: 0.5,\n        simulateGroundPlane: true\n    };\n\n    if (savedSettings) {\n        try {\n            return { ...defaultSettings, ...JSON.parse(savedSettings) };\n        } catch (e) {\n            console.warn('Failed to parse saved AO settings, using defaults');\n        }\n    }\n\n    return defaultSettings;\n}\n\nfunction savePluginSettings(options: Partial<BakeAmbientOcclusionOptions>): void {\n    localStorage.setItem('blockbench_baked_ao_settings', JSON.stringify(options));\n}"
  },
  {
    "path": "plugins/baked_ambient_occlusion/src/types.d.ts",
    "content": "declare namespace Blockbench {\n    type Mesh = import('blockbench-types').Mesh;\n    type Texture = import('blockbench-types').Texture;\n    type MeshFace = import('blockbench-types').MeshFace;\n}"
  },
  {
    "path": "plugins/baked_ambient_occlusion/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"node\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"declaration\": false,\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"resolveJsonModule\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\"ES2020\", \"DOM\"],\n    \"types\": [\"blockbench-types\"]\n  },\n  \"include\": [\n    \"src/**/*\"\n  ],\n  \"exclude\": [\n    \"node_modules\",\n    \"dist\"\n  ]\n}"
  },
  {
    "path": "plugins/baked_ambient_occlusion/webpack.config.js",
    "content": "const path = require('path');\n\nmodule.exports = {\n  entry: './src/index.ts',\n  module: {\n    rules: [\n      {\n        test: /\\.tsx?$/,\n        use: 'ts-loader',\n        exclude: /node_modules/,\n      },\n    ],\n  },\n  resolve: {\n    extensions: ['.tsx', '.ts', '.js'],\n  },\n  output: {\n    filename: 'baked_ambient_occlusion.js',\n    path: path.resolve(__dirname, 'dist'),\n    library: {\n      type: 'umd',\n    },\n    globalObject: 'this',\n  },\n  externals: {\n    // These are provided by Blockbench globally\n    'blockbench': 'Blockbench',\n  },\n  optimization: {\n    minimize: true,\n  },\n};"
  },
  {
    "path": "plugins/bakery.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\n\n(function() {\n\nvar bake_action;\n\nPlugin.register('bakery', {\n\ttitle: 'Bakery',\n\ticon: 'storefront',\n\tauthor: 'JannisX11',\n\tdescription: 'Bakes complex animations into simple linear keyframes',\n\tversion: '1.1.1',\n\tmin_version: '3.7.0',\n\tvariant: 'both',\n\tonload() {\n\t\tbake_action = new Action('bake_animations', {\n\t\t    name: 'Bake Animations',\n\t\t    icon: 'storefront',\n\t\t    category: 'animation',\n\t\t    condition: {modes: ['animate']},\n\t\t    click: function(ev) {\n\t\t    \tif (Timeline.selected.length === 0) {\n\t\t\t\t\tBlockbench.showMessage('No keyframes selected', 'center')\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnew Dialog({\n\t\t\t\t\tid: 'bake_animations',\n\t\t\t\t\ttitle: 'Bake Animations',\n\t\t\t\t\ticon: 'storefront',\n\t\t\t\t\tform: {\n\t\t\t\t\t\trate: {label: 'Rate', type: 'number', value: 1},\n\t\t\t\t\t\tspherical_interpolation: {label: 'Spherical Interpolation', type: 'checkbox', value: false},\n\t\t\t\t\t},\n\t\t\t\t\tonConfirm: function(formData) {\n\t\t\t\t\t\tthis.hide()\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet target_keyframes = Timeline.selected.slice();\n\t\t\t\t\t\tlet keyframes = Timeline.selected.slice();\n\t\t\t\t\t\tUndo.initEdit({keyframes});\n\t\t\t\t\t\tlet animators = [];\n\t\t\t\t\t\tTimeline.selected.forEach(kf => animators.safePush(kf.animator));\n\t\t\t\t\t\tlet channels = ['rotation', 'position', 'scale'];\n\n\t\t\t\t\t\tanimators.forEach(animator => {\n\t\t\t\t\t\t\tlet mesh = animator.getGroup().mesh;\n\t\t\t\t\t\t\tchannels.forEach(channel => {\n\t\t\t\t\t\t\t\tif (!animator[channel]) return;\n\t\t\t\t\t\t\t\tlet kfs = animator[channel].filter(kf => target_keyframes.includes(kf));\n\t\t\t\t\t\t\t\tif (kfs.length < 2) return;\n\n\t\t\t\t\t\t\t\tkfs.sort((a, b) => a.time - b.time);\n\n\t\t\t\t\t\t\t\tlet [min, max] = [kfs[0].time, kfs.last().time];\n\t\t\t\t\t\t\t\tlet step = 1/Animation.selected.snapping*formData.rate || 0.1;\n\t\t\t\t\t\t\t\tlet new_keyframes = [];\n\n\t\t\t\t\t\t\t\tfor (let time = min; time <= max; time += step) {\n\n\t\t\t\t\t\t\t\t\tTimeline.time = time;\n\t\t\t\t\t\t\t\t\tlet keyframe = kfs.find(kf => Math.epsilon(kf.time, time, 0.006));\n\n\t\t\t\t\t\t\t\t\tif (!keyframe) {\n\t\t\t\t\t\t\t\t\t\tkeyframe = new Keyframe({\n\t\t\t\t\t\t\t\t\t\t\tchannel, time\n\t\t\t\t\t\t\t\t\t\t}, null, animator);\n\t\t\t\t\t\t\t\t\t\tif (channel == 'rotation' && formData.spherical_interpolation) {\n\t\t\t\t\t\t\t\t\t\t\tlet before = kfs.findLast(kf => kf.time < time);\n\t\t\t\t\t\t\t\t\t\t\tlet after = kfs.find(kf => kf.time > time);\n\t\t\t\t\t\t\t\t\t\t\tif (before && after) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet quat_before = before.getFixed(0, true);\n\t\t\t\t\t\t\t\t\t\t\t\tlet quat_after = after.getFixed(0, true);\n\t\t\t\t\t\t\t\t\t\t\t\tlet t = Math.getLerp(before.time, after.time, time);\n\t\t\t\t\t\t\t\t\t\t\t\tlet slerp = quat_before.slerp(quat_after, t);\n\n\t\t\t\t\t\t\t\t\t\t\t\tlet euler = new THREE.Euler().setFromQuaternion(slerp, mesh.rotation.order);\n\t\t\t\t\t\t\t\t\t\t\t\tif (Blockbench.isNewerThan('4.99')) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('x', Math.trimDeg( ( Math.radToDeg(euler.x - mesh.fix_rotation.x)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('y', Math.trimDeg( ( Math.radToDeg(euler.y - mesh.fix_rotation.y)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('z', Math.trimDeg( ( Math.radToDeg(euler.z - mesh.fix_rotation.z)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('x', Math.trimDeg( (-Math.radToDeg(euler.x - mesh.fix_rotation.x)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('y', Math.trimDeg( (-Math.radToDeg(euler.y - mesh.fix_rotation.y)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t\tkeyframe.set('z', Math.trimDeg( ( Math.radToDeg(euler.z - mesh.fix_rotation.z)) ));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tanimator.fillValues(keyframe, null, true, false);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tnew_keyframes.push(keyframe);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnew_keyframes.forEach(kf => {\n\t\t\t\t\t\t\t\t\tanimator[channel].push(kf);\n\t\t\t\t\t\t\t\t\tkeyframes.push(kf);\n\t\t\t\t\t\t\t\t\tkf.animator = animator;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\ttarget_keyframes.push(...new_keyframes);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttarget_keyframes.forEach(kf => {\n\t\t\t\t\t\t\tif (!channels.includes(kf.channel)) return;\n\t\t\t\t\t\t\tTimeline.time = kf.time;\n\t\t\t\t\t\t\tkf.animator.fillValues(kf, null, false);\n\t\t\t\t\t\t\tkf.interpolation = 'linear';\n\t\t\t\t\t\t});\n\t\t\t\t\t\tTickUpdates.keyframes = true;\n\t\t\t\t\t\tAnimator.preview();\n\n\t\t\t\t\t\tUndo.finishEdit('bake keyframes');\n\t\t\t\t\t}\n\t\t\t\t}).show()\n\t\t    }\n\t\t})\n\t\tMenuBar.addAction(bake_action, 'animation')\n\t},\n\tonunload() {\n\t\tbake_action.delete()\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/bamo/bamo.js",
    "content": "/******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&\":\n/*!********************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js& ***!\n  \\********************************************************************************************************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/OptionArrays.js */ \"./src/util/OptionArrays.js\");\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  data: function data() {\n    return {\n      step: \"start\",\n      rotationTypes: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.rotationTypes,\n      soundOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.soundOptions,\n      materialOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.materialOptions,\n      transparencyOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.transparencyOptions,\n      tabOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.tabOptions,\n      particleOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.particleOptions,\n      customTypeOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_0__.customTypeOptions,\n      parentData: this.$parent.$data\n    };\n  },\n  methods: {\n    Textures: function Textures() {\n      return Texture.all;\n    },\n    createJSON: function createJSON() {\n      this.$parent.createJSON();\n    },\n    changePage: function changePage(event, page) {\n      if (this.parentData.properties.displayName == \"\") {\n        this.parentData.error = \"name\";\n      } else {\n        if (this.step == \"types\" && page == \"physical\" || this.step == \"physical\" && page == \"types\") {\n          if (this.parentData.properties.types.block) {\n            page = \"variant\";\n          } else {\n            page = \"custom\";\n          }\n        }\n\n        this.parentData.error = \"\";\n        this.step = page;\n      }\n    },\n    toggleType: function toggleType(event, type) {\n      if (this.parentData.properties.types.custom && type == \"custom\") {\n        this.parentData.properties.types.block = false;\n        this.parentData.properties.types.stair = false;\n        this.parentData.properties.types.slab = false;\n        this.parentData.properties.types.wall = false;\n        return;\n      }\n\n      if (this.parentData.properties.types.block && type == \"block\") {\n        this.parentData.properties.types.custom = false;\n        return;\n      }\n    },\n    reset: function reset(event) {\n      this.parentData.error = \"\";\n      this.step = \"start\";\n    }\n  }\n});\n\n/***/ }),\n\n/***/ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&\":\n/*!***************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js& ***!\n  \\***************************************************************************************************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.object.keys.js */ \"./node_modules/core-js/modules/es.object.keys.js\");\n/* harmony import */ var core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_keys_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ \"./node_modules/core-js/modules/es.array.slice.js\");\n/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");\n/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ \"./node_modules/core-js/modules/es.symbol.js\");\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ \"./node_modules/core-js/modules/es.symbol.description.js\");\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../util/OptionArrays.js */ \"./src/util/OptionArrays.js\");\n/* harmony import */ var _util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../util/GenStates.js */ \"./src/util/GenStates.js\");\n/* harmony import */ var _util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../util/GenDataFiles.js */ \"./src/util/GenDataFiles.js\");\n/* harmony import */ var _util_Utils_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../util/Utils.js */ \"./src/util/Utils.js\");\n/* harmony import */ var _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../util/Settings.js */ \"./src/util/Settings.js\");\n/* harmony import */ var _BamoAdvancedProperties_vue__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./BamoAdvancedProperties.vue */ \"./src/components/BamoAdvancedProperties.vue\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  components: {\n    BamoAdvancedProperties: _BamoAdvancedProperties_vue__WEBPACK_IMPORTED_MODULE_22__[\"default\"]\n  },\n  data: function data() {\n    return {\n      step: \"start\",\n      error: \"\",\n      rotationTypes: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.rotationTypes,\n      soundOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.soundOptions,\n      materialOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.materialOptions,\n      transparencyOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.transparencyOptions,\n      tabOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.tabOptions,\n      particleOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.particleOptions,\n      customTypeOptions: _util_OptionArrays_js__WEBPACK_IMPORTED_MODULE_17__.customTypeOptions,\n      properties: _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__.BAMO_SETTINGS_DEFAULT,\n      lastID: \"\",\n      swap: false\n    };\n  },\n  methods: {\n    updateValues: function updateValues() {\n      if (Project.uuid != this.lastID) {\n        this.properties = _util_Settings_js__WEBPACK_IMPORTED_MODULE_21__[\"default\"][Project.uuid];\n        this.lastID = Project.uuid;\n        this.swap = true;\n        this.reset(null);\n      } // Initialize the textures if not done so yet\n\n\n      if (this.properties.variant[\"default\"].all == \"\") {\n        this.properties.variant[\"default\"].all = Texture.all[0].name;\n        this.properties.variant.stair.top = Texture.all[0].name;\n        this.properties.variant.stair.bottom = Texture.all[0].name;\n        this.properties.variant.stair.side = Texture.all[0].name;\n        this.properties.variant.slab.top = Texture.all[0].name;\n        this.properties.variant.slab.bottom = Texture.all[0].name;\n        this.properties.variant.slab.side = Texture.all[0].name;\n        this.properties.variant.wall.wall = Texture.all[0].name;\n      }\n    },\n    Textures: function Textures() {\n      return Texture.all;\n    },\n    changePage: function changePage(event, page) {\n      if (this.properties.displayName == \"\") {\n        this.error = \"name\";\n      } else {\n        if (this.step == \"types\" && page == \"physical\" || this.step == \"physical\" && page == \"types\") {\n          if (this.properties.types.block) {\n            page = \"variant\";\n          }\n        }\n\n        this.error = \"\";\n        this.step = page;\n      }\n    },\n    toggleType: function toggleType(event, type) {\n      if (this.properties.types.custom && type == \"custom\") {\n        this.properties.types.block = false;\n        this.properties.types.stair = false;\n        this.properties.types.slab = false;\n        this.properties.types.wall = false;\n        return;\n      }\n\n      if (this.properties.types.block && type == \"block\") {\n        this.properties.types.custom = false;\n        return;\n      }\n    },\n    reset: function reset(event) {\n      this.error = \"\";\n      this.step = \"start\";\n    },\n    createJSON: function createJSON(event) {\n      var _this = this;\n\n      // Ensure a name is set\n      if (this.properties.displayName == \"\") {\n        this.error = \"name\";\n        return;\n      } // Ensure a particle texture is set\n\n\n      var part = false;\n      Texture.all.forEach(function (tx) {\n        if (tx.particle == true) {\n          part = true;\n        }\n      });\n\n      if (part == false) {\n        Blockbench.showMessageBox({\n          buttons: [\"Ok\"],\n          title: \"Error\",\n          message: \"Please ensure you have set a particle texture\"\n        });\n        return;\n      }\n\n      var zip = new JSZip(); // Trim invalid chars from the name\n\n      var packName = (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(this.properties.displayName); // Define folder locations\n\n      var objFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\objects\\\\\";\n      var blockstatesFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\blockstates\\\\\";\n      var blockModelsFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\models\\\\block\\\\\";\n      var itemModelsFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\models\\\\item\\\\\";\n      var dataFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\data\\\\\";\n      var blockTextureFolderVersion = this.properties.version == \"1.20.1\" ? \"block\" : \"blocks\";\n      var blockTexturesFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\textures\\\\\" + blockTextureFolderVersion + \"\\\\\"; // Create the folders if they dont exist\n\n      var folderList = [objFolder, blockstatesFolder, blockModelsFolder, itemModelsFolder, blockTexturesFolder, dataFolder];\n\n      var fs = __webpack_require__(/*! fs */ \"fs\");\n\n      folderList.forEach(function (folder) {\n        if (!fs.existsSync(folder)) {\n          fs.mkdirSync(folder, {\n            recursive: true\n          });\n        }\n      }); // Create mcmeta file\n      // Format ID is 15 for 1.20.1, 8 for 1.18.2, and 6 for 1.16.5\n\n      var formatID = this.properties.version == \"1.20.1\" ? 15 : this.properties.version == \"1.18.2\" ? 8 : 6;\n      var mcmetaData = {\n        \"pack\": {\n          \"pack_format\": formatID,\n          \"description\": \"Resource Pack for BAMO test files\"\n        }\n      };\n      fs.writeFile(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\pack.mcmeta\", JSON.stringify(mcmetaData), \"utf8\", function (err) {\n        if (err != null) {\n          console.log(\"Error generating mcmeta file:\", err);\n        }\n      });\n      zip.file(\"pack.mcmeta\", JSON.stringify(mcmetaData)); // Generate block name from the displayname\n\n      var blockName = (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(this.properties.displayName); //generate the list of blocks to be exported\n\n      var blockList = [];\n      var codecData = Format.codec.compile(); // Custom Block\n\n      if (this.properties.types.custom) {\n        // Pull the model data from the codec\n        var modelData = JSON.parse(codecData);\n        modelData[\"parent\"] = \"block/block\";\n        var stateData = \"\"; // Create blockstates data\n\n        if (this.properties.rotType == \"y_axis\") {\n          stateData = JSON.stringify({\n            \"variants\": {\n              \"facing=north\": {\n                \"model\": this.properties.namespace + \":block/\" + blockName\n              },\n              \"facing=east\": {\n                \"model\": this.properties.namespace + \":block/\" + blockName,\n                \"y\": 90\n              },\n              \"facing=south\": {\n                \"model\": this.properties.namespace + \":block/\" + blockName,\n                \"y\": 180\n              },\n              \"facing=west\": {\n                \"model\": this.properties.namespace + \":block/\" + blockName,\n                \"y\": 270\n              }\n            }\n          });\n        } else {\n          stateData = JSON.stringify({\n            \"variants\": {\n              \"\": {\n                \"model\": this.properties.namespace + \":block/\" + blockName\n              }\n            }\n          });\n        }\n\n        var textureData = {}; // Setup texture dict\n\n        ns = this.properties.namespace;\n        Object.keys(modelData.textures).forEach(function (key) {\n          var comp;\n          var partCheck;\n\n          if (_typeof(modelData.textures[key]) === 'object') {\n            comp = modelData.textures[key][\"id\"];\n            partCheck = modelData.textures[key].particle;\n          } else if (typeof modelData.textures[key] === 'string') {\n            comp = key;\n            partCheck = key == \"particle\";\n          }\n\n          Texture.all.forEach(function (tx) {\n            if (tx.id == comp || partCheck && tx.particle == true) {\n              if (tx.namespace == \"\") {\n                textureData[key] = ns + \":\" + blockTextureFolderVersion + \"/\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name.split(\".\")[0]);\n              } else {\n                textureData[key] = tx.namespace + \":\" + tx.folder + \"/\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name.split(\".\")[0]);\n              }\n            }\n          });\n        }); // Looting file\n\n        var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, blockName);\n        var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + blockName + \".json\";\n        fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {\n          recursive: true\n        });\n        fs.writeFile(lootTags, lootData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing custom block looting file:\", err);\n          }\n        });\n        zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + blockName + \".json\", lootData); // Stonecutting Table Recipes\n\n        (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, blockName, dataFolder, zip);\n        modelData.textures = textureData;\n        var boxList = [];\n        modelData.elements.forEach(function (model) {\n          boxList.push([model[\"from\"], model[\"to\"]]);\n        });\n        blockList.push({\n          \"name\": blockName,\n          \"types\": [],\n          \"model\": modelData,\n          \"state\": stateData,\n          \"hitbox\": boxList\n        });\n      } // Regular Block\n\n\n      if (this.properties.types.block) {\n        var modelData = {};\n        modelData[\"credit\"] = codecData[\"credit\"];\n        modelData[\"parent\"] = \"block/cube_all\";\n        modelData[\"textures\"] = {\n          \"all\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant[\"default\"].all, this.properties.namespace),\n          \"particle\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(\"particle\", this.properties.namespace)\n        }; // Looting file\n\n        var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, blockName);\n        var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + blockName + \".json\";\n        fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {\n          recursive: true\n        });\n        fs.writeFile(lootTags, lootData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + blockName + \".json\", lootData); // Stonecutting Table Recipes\n\n        (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, blockName, dataFolder, zip);\n        var state = JSON.stringify({\n          \"variants\": {\n            \"\": {\n              \"model\": this.properties.namespace + \":block/\" + blockName\n            }\n          }\n        });\n        var typeList = [];\n        if (this.properties.types.stair) typeList.push(\"stairs\");\n        if (this.properties.types.slab) typeList.push(\"slab\");\n        if (this.properties.types.wall) typeList.push(\"wall\");\n        blockList.push({\n          \"name\": blockName,\n          \"types\": typeList,\n          \"state\": state,\n          \"model\": modelData,\n          \"hitbox\": []\n        });\n      } // Stair Block\n\n\n      if (this.properties.types.stair) {\n        var name = blockName + \"_stairs\";\n        var modelData = {};\n        modelData[\"credit\"] = codecData[\"credit\"];\n        modelData[\"parent\"] = \"minecraft:block/stairs\";\n        modelData[\"textures\"] = {\n          \"top\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.top, this.properties.namespace),\n          \"bottom\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.bottom, this.properties.namespace),\n          \"side\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.stair.side, this.properties.namespace),\n          \"particle\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(\"particle\", this.properties.namespace)\n        }; // Looting file\n\n        var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name);\n        var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\";\n        fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {\n          recursive: true\n        });\n        fs.writeFile(lootTags, lootData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + name + \".json\", lootData); // Stonecutting Table Recipes\n\n        (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write state\n\n        var state = (0,_util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__.genStairState)(this.properties.namespace, \"block/\" + name, \"block/\" + name + \"_outer\", \"block/\" + name + \"_inner\");\n        fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", state, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error generating blockstate:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", state); // write the 4 stair models\n        // Base\n\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \".json\", JSON.stringify(modelData)); // Item\n\n        fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing item model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData)); // Inner\n\n        modelData[\"parent\"] = \"minecraft:block/inner_stairs\";\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_inner.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_inner.json\", JSON.stringify(modelData)); // Outer\n\n        modelData[\"parent\"] = \"minecraft:block/outer_stairs\";\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_outer.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_outer.json\", JSON.stringify(modelData));\n      }\n\n      if (this.properties.types.slab) {\n        var name = blockName + \"_slab\";\n        var modelData = {};\n        modelData[\"credit\"] = codecData[\"credit\"];\n        modelData[\"parent\"] = \"minecraft:block/slab\";\n        modelData[\"textures\"] = {\n          \"top\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.top, this.properties.namespace),\n          \"bottom\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.bottom, this.properties.namespace),\n          \"side\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.slab.side, this.properties.namespace),\n          \"particle\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(\"particle\", this.properties.namespace)\n        }; // Looting file\n\n        var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name);\n        var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\";\n        fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {\n          recursive: true\n        });\n        fs.writeFile(lootTags, lootData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + name + \".json\", lootData); // Stonecutting Table Recipes\n\n        (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write State\n\n        var state = {\n          \"variants\": {\n            \"type=bottom\": {\n              \"model\": this.properties.namespace + \":block/\" + name\n            },\n            \"type=double\": {\n              \"model\": this.properties.namespace + \":block/\" + blockName\n            },\n            \"type=top\": {\n              \"model\": this.properties.namespace + \":block/\" + name + \"_top\"\n            }\n          }\n        };\n        fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", JSON.stringify(state), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error generating blockstate:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", JSON.stringify(state)); // Write the 3 slab models\n        // Base\n\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \".json\", JSON.stringify(modelData)); // Item\n\n        fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing item model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData)); // Top\n\n        modelData[\"parent\"] = \"minecraft:block/slab_top\";\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_top.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_top.json\", JSON.stringify(modelData));\n      }\n\n      if (this.properties.types.wall) {\n        var name = blockName + \"_wall\";\n        var modelData = {};\n        modelData[\"credit\"] = codecData[\"credit\"];\n        modelData[\"parent\"] = \"minecraft:block/template_wall_post\";\n        modelData[\"textures\"] = {\n          \"wall\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(this.properties.variant.wall.wall, this.properties.namespace),\n          \"particle\": (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.dictFromTexture)(\"particle\", this.properties.namespace)\n        }; // Looting file\n\n        var lootData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genLootTable)(this.properties.namespace, name);\n        var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\";\n        fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {\n          recursive: true\n        });\n        fs.writeFile(lootTags, lootData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + name + \".json\", lootData); // Stonecutting Table Recipes\n\n        (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genStonecuttingRecipes)(this.properties, name, dataFolder, zip); // Write State\n\n        var state = (0,_util_GenStates_js__WEBPACK_IMPORTED_MODULE_18__.genWallState)(this.properties.namespace, \"block/\" + name + \"_post\", \"block/\" + name + \"_side\", \"block/\" + name + \"_side_tall\");\n        fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", state, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error generating blockstate:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", state); // Write the 4  wall models\n        // Base\n\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_post.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_post.json\", JSON.stringify(modelData)); // Item\n\n        modelData[\"parent\"] = \"minecraft:block/wall_inventory\";\n        fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing item model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData)); // Side\n\n        modelData[\"parent\"] = \"minecraft:block/template_wall_side\";\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_side.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_side.json\", JSON.stringify(modelData)); // Side Tall\n\n        modelData[\"parent\"] = \"minecraft:block/template_wall_side_tall\";\n        fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_side_tall.json\", JSON.stringify(modelData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing item model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_side_tall.json\", JSON.stringify(modelData)); // Deal with the tags\n\n        var wallTags = dataFolder + \"minecraft\\\\tags\\\\blocks\\\\walls.json\";\n        var tagVal = this.properties.namespace + \":\" + name;\n        fs.mkdirSync(dataFolder + \"minecraft\\\\tags\\\\blocks\\\\\", {\n          recursive: true\n        });\n        var tagData = {\n          \"replace\": false,\n          \"values\": [tagVal]\n        };\n        fs.writeFile(wallTags, JSON.stringify(tagData), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/minecraft/tags/blocks/walls.json\", JSON.stringify(tagData));\n      }\n\n      var modelData = JSON.parse(codecData);\n      var ns = this.properties.namespace;\n      var animated = this.properties.animated; // Copy texture files\n\n      Texture.all.forEach(function (tx) {\n        var image;\n\n        if (tx.namespace != \"minecraft\") {\n          if (tx.img.currentSrc.slice(0, 4) == \"data\") {\n            image = nativeImage.createFromDataURL(tx.img.currentSrc).toPNG();\n          } else if (tx.img.currentSrc.slice(0, 4) == \"file\") {\n            image = nativeImage.createFromPath(tx.source.replace(/\\?\\d+$/, '')).toPNG();\n          }\n\n          fs.writeFile(blockTexturesFolder + \"\\\\\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name), image, function (err) {\n            if (err != null) {\n              console.log(\"Error Found writing texture data:\", err);\n            }\n          });\n          zip.file(\"assets/\" + ns + \"/textures/\" + blockTextureFolderVersion + \"/\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name), image);\n\n          if (animated) {\n            fs.writeFile(blockTexturesFolder + \"\\\\\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name) + \".mcmeta\", '{\"animation\" : {}}', function (err) {\n              if (err != null) {\n                console.log(\"Error Found writing animation data:\", err);\n              }\n            });\n            zip.file(\"assets/\" + ns + \"/textures/\" + blockTextureFolderVersion + \"/\" + (0,_util_Utils_js__WEBPACK_IMPORTED_MODULE_20__.cleanFileName)(tx.name) + \".mcmeta\", '{\"animation\" : {}}');\n          }\n        }\n      });\n      /*console.log(\"Block List:\")\n      console.log(blockList)*/\n\n      blockList.forEach(function (block) {\n        // Generate Mining file\n        var mineableData = (0,_util_GenDataFiles_js__WEBPACK_IMPORTED_MODULE_19__.genMineableTag)(_this.properties.namespace, block[\"name\"], block[\"types\"]);\n        var mineableTags = dataFolder + \"minecraft\\\\tags\\\\blocks\\\\mineable\\\\pickaxe.json\";\n        fs.mkdirSync(dataFolder + \"minecraft\\\\tags\\\\blocks\\\\mineable\", {\n          recursive: true\n        });\n        fs.writeFile(mineableTags, mineableData, \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error found when writing wall tags:\", err);\n          }\n        });\n        zip.file(\"data/minecraft/tags/blocks/mineable/pickaxe.json\", mineableData); // Write state file\n\n        fs.writeFile(blockstatesFolder + \"\\\\\" + block[\"name\"] + \".json\", block[\"state\"], \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error generating blockstate:\", err);\n          }\n        });\n        zip.file(\"assets/\" + _this.properties.namespace + \"/blockstates/\" + block[\"name\"] + \".json\", block[\"state\"]); // Write model files\n\n        fs.writeFile(blockModelsFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing block model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + _this.properties.namespace + \"/models/block/\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]));\n        fs.writeFile(itemModelsFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error Found writing item model data:\", err);\n          }\n        });\n        zip.file(\"assets/\" + _this.properties.namespace + \"/models/item/\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"])); // Write block properties file\n\n        var data = {\n          \"displayName\": _this.properties.displayName.replace(/[^a-zA-Z\\d\\s._]/g, ''),\n          \"typeList\": block[\"types\"],\n          \"material\": _this.properties.material,\n          \"blastRes\": _this.properties.blastRes,\n          \"slip\": _this.properties.slip,\n          \"gravity\": _this.properties.gravity,\n          \"rotType\": _this.properties.rotType,\n          \"sounds\": _this.properties.sounds,\n          \"lum\": _this.properties.lum,\n          \"maxStack\": _this.properties.maxStack,\n          \"fireproof\": _this.properties.fireproof,\n          \"creativeTab\": _this.properties.creativeTab,\n          \"transparency\": _this.properties.transparency,\n          \"hitbox\": block[\"hitbox\"],\n          \"hitboxBuffer\": _this.properties.bufferedHitbox ? _this.properties.hitboxBuffer.toString() : \"\",\n          \"blockType\": _this.properties.types.customType,\n          \"particleType\": _this.properties.particles ? _this.properties.particleType : \"\",\n          \"particlePos\": [_this.properties.particlePos.x / 16.0, _this.properties.particlePos.y / 16.0, _this.properties.particlePos.z / 16.0],\n          \"particleSpread\": [_this.properties.particleSpread.x / 8.0, _this.properties.particleSpread.y / 8.0, _this.properties.particleSpread.z / 8.0],\n          \"particleVel\": [_this.properties.particleVel.x, _this.properties.particleVel.y, _this.properties.particleVel.z],\n          \"nameGenType\": \"3.3\" // Allows for names where \" \" is replaced with \"_\" to coexist with the older \"\" system\n\n        };\n        fs.writeFile(objFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(data), \"utf8\", function (err) {\n          if (err != null) {\n            console.log(\"Error writing block properties:\", err);\n          }\n        });\n        zip.file(\"objects/\" + block[\"name\"] + \".json\", JSON.stringify(data));\n        /*console.log(\"Object File Contents:\")\n        console.log(data)*/\n      });\n      zip.generateAsync({\n        type: \"nodebuffer\"\n      }).then(function (content) {\n        fs.writeFile(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \".zip\", content, function (err) {});\n      });\n      fs.rm(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName, {\n        recursive: true\n      }, function (err) {});\n      console.log(\"BAMO data saved in folder at location \" + settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName);\n      var e = open_interface;\n      e.hide();\n    }\n  },\n  watch: {\n    properties: {\n      handler: function handler(val) {\n        if (this.swap == false) {\n          Project.saved = false;\n        } else {\n          this.swap = false;\n        }\n      },\n      deep: true\n    }\n  }\n});\n\n/***/ }),\n\n/***/ \"./src/util/Codec.js\":\n/*!***************************!*\\\n  !*** ./src/util/Codec.js ***!\n  \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   \"loadCodec\": () => (/* binding */ loadCodec),\n/* harmony export */   \"unloadCodec\": () => (/* binding */ unloadCodec)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ \"./node_modules/core-js/modules/es.object.assign.js\");\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.find.js */ \"./node_modules/core-js/modules/es.array.find.js\");\n/* harmony import */ var core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ \"./node_modules/core-js/modules/es.symbol.js\");\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ \"./node_modules/core-js/modules/es.symbol.description.js\");\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Settings */ \"./src/util/Settings.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\nfunction loadCodec() {\n  Codecs.project.on('compile', onProjectCompile);\n  Codecs.project.on('parse', onProjectParse);\n  Blockbench.on('close_project', onCloseProject);\n}\nfunction unloadCodec() {\n  Codecs.project.events.compile.remove(onProjectCompile);\n  Codecs.project.events.parse.remove(onProjectParse);\n  format[\"delete\"]();\n}\n\nfunction onProjectCompile(e) {\n  if (format.id !== \"bamo_model\") return;\n  e.model.bamoSettings = _Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid];\n}\n\nfunction onProjectParse(e) {\n  if (format.id !== \"bamo_model\") return;\n\n  if (e.model && _typeof(e.model.bamoSettings) === 'object') {\n    var placeholder = Object.assign({}, _Settings__WEBPACK_IMPORTED_MODULE_15__.BAMO_SETTINGS_DEFAULT);\n    _Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid] = Object.assign(placeholder, e.model.bamoSettings);\n  } else {\n    _Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid] = Object.assign({}, _Settings__WEBPACK_IMPORTED_MODULE_15__.BAMO_SETTINGS_DEFAULT);\n    _Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid].displayName = Project.name;\n  }\n\n  console.log(_Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid]);\n}\n\nfunction onCloseProject() {\n  if (format.id !== \"bamo_model\") return;\n  delete _Settings__WEBPACK_IMPORTED_MODULE_15__[\"default\"][Project.uuid];\n}\n\nvar codec = Codecs.java_block;\nvar format = new ModelFormat({\n  id: \"bamo_model\",\n  name: \"BAMO model\",\n  category: \"minecraft\",\n  description: \"A format for storing models to be exported for the BAMO mod\",\n  icon: \"view_in_ar\",\n  target: 'Minecraft: Java Edition',\n  format_page: {\n    content: [{\n      type: 'h3',\n      text: tl('mode.start.format.informations')\n    }, {\n      text: \"* \".concat(tl('format.java_block.info.rotation'), \"\\n\\t\\t\\t\\t\\t* \").concat(tl('format.java_block.info.size'), \"\\n\\t\\t\\t\\t\\t* \").concat(tl('format.java_block.info.animation')).replace(/\\t+/g, '')\n    }]\n  },\n  render_sides: function render_sides() {\n    if (Modes.display && ['thirdperson_righthand', 'thirdperson_lefthand', 'head'].includes(display_slot)) {\n      return 'double';\n    } else {\n      return 'front';\n    }\n  },\n  model_identifier: false,\n  parent_model_id: true,\n  vertex_color_ambient_occlusion: true,\n  rotate_cubes: true,\n  rotation_limit: true,\n  optional_box_uv: true,\n  uv_rotation: true,\n  java_face_properties: true,\n  animated_textures: true,\n  select_texture_for_particles: true,\n  display_mode: true,\n  texture_folder: true,\n  cube_size_limiter: {\n    coordinate_limits: [-16, 32],\n    test: function test(cube) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var from = values.from || cube.from;\n      var to = values.to || cube.to;\n      var inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n      return undefined !== from.find(function (v, i) {\n        return to[i] + inflate > 32 || to[i] + inflate < -16 || from[i] - inflate > 32 || from[i] - inflate < -16;\n      });\n    },\n    move: function move(cube) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var from = values.from || cube.from;\n      var to = values.to || cube.to;\n      var inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n      [0, 1, 2].forEach(function (ax) {\n        var overlap = to[ax] + inflate - 32;\n\n        if (overlap > 0) {\n          //If positive site overlaps\n          from[ax] -= overlap;\n          to[ax] -= overlap;\n\n          if (16 + from[ax] - inflate < 0) {\n            from[ax] = -16 + inflate;\n          }\n        } else {\n          overlap = from[ax] - inflate + 16;\n\n          if (overlap < 0) {\n            from[ax] -= overlap;\n            to[ax] -= overlap;\n\n            if (to[ax] + inflate > 32) {\n              to[ax] = 32 - inflate;\n            }\n          }\n        }\n      });\n    },\n    clamp: function clamp(cube) {\n      var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var from = values.from || cube.from;\n      var to = values.to || cube.to;\n      var inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n      [0, 1, 2].forEach(function (ax) {\n        from[ax] = Math.clamp(from[ax] - inflate, -16, 32) + inflate;\n        to[ax] = Math.clamp(to[ax] + inflate, -16, 32) - inflate;\n      });\n    }\n  },\n  codec: codec\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec);\n\n/***/ }),\n\n/***/ \"./src/util/GenDataFiles.js\":\n/*!**********************************!*\\\n  !*** ./src/util/GenDataFiles.js ***!\n  \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"genLootTable\": () => (/* binding */ genLootTable),\n/* harmony export */   \"genMineableTag\": () => (/* binding */ genMineableTag),\n/* harmony export */   \"genStonecuttingRecipe\": () => (/* binding */ genStonecuttingRecipe),\n/* harmony export */   \"genStonecuttingRecipes\": () => (/* binding */ genStonecuttingRecipes),\n/* harmony export */   \"genStonecuttingReverseRecipe\": () => (/* binding */ genStonecuttingReverseRecipe)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nfunction genLootTable(namespace, block) {\n  return \"{\\n    \\\"type\\\": \\\"minecraft:block\\\",\\n    \\\"pools\\\": [\\n        {\\n            \\\"rolls\\\": 1,\\n            \\\"entries\\\": [\\n                {\\n                    \\\"type\\\": \\\"minecraft:item\\\",\\n                    \\\"name\\\": \\\"\".concat(namespace, \":\").concat(block, \"\\\"\\n                }\\n            ],\\n            \\\"conditions\\\": []\\n        }\\n    ]\\n}\");\n}\nfunction genMineableTag(namespace, block, variants) {\n  if (variants.length == 0) {\n    return \"{\\n    \\\"replace\\\": false,\\n    \\\"values\\\": [\\n        \\\"\".concat(namespace, \":\").concat(block, \"\\\"\\n    ]\\n}\");\n  } else {\n    var tagValues = [\"\".concat(namespace, \":\").concat(block)];\n    variants.forEach(function (v) {\n      tagValues.push(\"\".concat(namespace, \":\").concat(block, \"_\").concat(v));\n    });\n    var data = {\n      \"replace\": false,\n      \"values\": tagValues\n    };\n    return JSON.stringify(data);\n  }\n}\nfunction genStonecuttingRecipes(properties, blockName, dataFolder, zip) {\n  console.log(properties);\n\n  if (properties.genScRecipe) {\n    var stData = genStonecuttingRecipe(properties.namespace, blockName);\n    var stDir = dataFolder + properties.namespace + \"\\\\recipes\\\\\";\n    fs.mkdirSync(stDir, {\n      recursive: true\n    });\n    fs.writeFile(stDir + blockName + \".json\", stData, \"utf8\", function (err) {\n      if (err != null) {\n        console.log(\"Error found when writing custom block stonecutting recipe:\", err);\n      }\n    });\n    zip.file(\"data/\" + properties.namespace + \"/recipes/\" + blockName + \".json\", stData);\n  }\n\n  if (properties.genReversableScRecipe) {\n    var stData = genStonecuttingReverseRecipe(properties.namespace, blockName);\n    var stDir = dataFolder + properties.namespace + \"\\\\recipes\\\\\";\n    fs.mkdirSync(stDir, {\n      recursive: true\n    });\n    fs.writeFile(stDir + blockName + \"_rv.json\", stData, \"utf8\", function (err) {\n      if (err != null) {\n        console.log(\"Error found when writing custom block stonecutting recipe:\", err);\n      }\n    });\n    zip.file(\"data/\" + properties.namespace + \"/recipes/\" + blockName + \"_rv.json\", stData);\n  }\n}\nfunction genStonecuttingRecipe(namespace, block) {\n  return \"\\n    {\\n        \\\"type\\\": \\\"minecraft:stonecutting\\\",\\n        \\\"ingredient\\\": {\\n            \\\"item\\\": \\\"bamo:bamo_crate\\\"\\n        },\\n        \\\"result\\\": \\\"\".concat(namespace, \":\").concat(block, \"\\\",\\n        \\\"count\\\": 1\\n    }\");\n}\nfunction genStonecuttingReverseRecipe(namespace, block) {\n  return \"\\n    {\\n        \\\"type\\\": \\\"minecraft:stonecutting\\\",\\n        \\\"ingredient\\\": {\\n            \\\"item\\\": \\\"\".concat(namespace, \":\").concat(block, \"\\\"\\n        },\\n        \\\"result\\\": \\\"bamo:bamo_crate\\\",\\n        \\\"count\\\": 1\\n    }\");\n}\n\n/***/ }),\n\n/***/ \"./src/util/GenStates.js\":\n/*!*******************************!*\\\n  !*** ./src/util/GenStates.js ***!\n  \\*******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"genStairState\": () => (/* binding */ genStairState),\n/* harmony export */   \"genWallState\": () => (/* binding */ genWallState)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.concat.js */ \"./node_modules/core-js/modules/es.array.concat.js\");\n/* harmony import */ var core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_concat_js__WEBPACK_IMPORTED_MODULE_0__);\n\nfunction genStairState(namespace, model, outer, inner) {\n  return \"\\n    {\\n        \\\"variants\\\": {\\n            \\\"facing=east,half=bottom,shape=straight\\\": { \\\"model\\\": \\\"\".concat(namespace, \":\").concat(model, \"\\\" },\\n            \\\"facing=west,half=bottom,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=bottom,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=bottom,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"y\\\": 270, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=top,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"x\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=top,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"x\\\": 180, \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=top,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"x\\\": 180, \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=top,shape=straight\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(model, \"\\\", \\\"x\\\": 180, \\\"y\\\": 270, \\\"uvlock\\\": true },\\n            \\n            \\\"facing=east,half=bottom,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\" },\\n            \\\"facing=west,half=bottom,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=bottom,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=bottom,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 270, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=bottom,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 270, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=bottom,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=bottom,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\" },\\n            \\\"facing=north,half=bottom,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"y\\\": 180, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=bottom,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\" },\\n            \\\"facing=west,half=bottom,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=bottom,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=bottom,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 270, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=bottom,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 270, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=bottom,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=bottom,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\" },\\n            \\\"facing=north,half=bottom,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"y\\\": 180, \\\"uvlock\\\": true },\\n           \\n            \\\"facing=east,half=top,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=top,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=top,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=top,shape=outer_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 270, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=top,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=top,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 270, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=top,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=top,shape=outer_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(outer, \"\\\", \\\"x\\\": 180, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=top,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=top,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=top,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=top,shape=inner_left\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 270, \\\"uvlock\\\": true },\\n\\n            \\\"facing=east,half=top,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 90, \\\"uvlock\\\": true },\\n            \\\"facing=west,half=top,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 270, \\\"uvlock\\\": true },\\n            \\\"facing=south,half=top,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"y\\\": 180, \\\"uvlock\\\": true },\\n            \\\"facing=north,half=top,shape=inner_right\\\": { \\\"model\\\": \\\"\").concat(namespace, \":\").concat(inner, \"\\\", \\\"x\\\": 180, \\\"uvlock\\\": true }\\n        }\\n    }\");\n}\nfunction genWallState(namespace, post, side, tall) {\n  return \"{\\n        \\\"multipart\\\":[\\n            {\\\"when\\\":{\\\"up\\\":\\\"true\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\".concat(namespace, \":\").concat(post, \"\\\"}},\\n            {\\\"when\\\":{\\\"north\\\":\\\"low\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(side, \"\\\",\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"east\\\":\\\"low\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(side, \"\\\",\\\"y\\\":90,\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"south\\\":\\\"low\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(side, \"\\\",\\\"y\\\":180,\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"west\\\":\\\"low\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(side, \"\\\",\\\"y\\\":270,\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"north\\\":\\\"tall\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(tall, \"\\\",\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"east\\\":\\\"tall\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(tall, \"\\\",\\\"y\\\":90,\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"south\\\":\\\"tall\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(tall, \"\\\",\\\"y\\\":180,\\\"uvlock\\\":true}},\\n            {\\\"when\\\":{\\\"west\\\":\\\"tall\\\"},\\\"apply\\\":{\\\"model\\\":\\\"\").concat(namespace, \":\").concat(tall, \"\\\",\\\"y\\\":270,\\\"uvlock\\\":true}}\\n        ]\\n    }\");\n}\n\n/***/ }),\n\n/***/ \"./src/util/OptionArrays.js\":\n/*!**********************************!*\\\n  !*** ./src/util/OptionArrays.js ***!\n  \\**********************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"customTypeOptions\": () => (/* binding */ customTypeOptions),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   \"materialOptions\": () => (/* binding */ materialOptions),\n/* harmony export */   \"particleOptions\": () => (/* binding */ particleOptions),\n/* harmony export */   \"rotationTypes\": () => (/* binding */ rotationTypes),\n/* harmony export */   \"soundOptions\": () => (/* binding */ soundOptions),\n/* harmony export */   \"tabOptions\": () => (/* binding */ tabOptions),\n/* harmony export */   \"transparencyOptions\": () => (/* binding */ transparencyOptions)\n/* harmony export */ });\nvar rotationTypes = [\"default\", //\"axis\",\n//\"y_axis_player\",\n\"y_axis\" //\"all_player\",\n//\"all\",\n];\nvar soundOptions = [\"Grass\", \"Glass\", \"Gravel\", \"Honey\", \"Metal\", \"Sand\", \"Snow\", \"Stone\", \"Wool\", \"Wood\", \"Ancient Debris\", \"Anvil\", \"Bamboo\", \"Bamboo Sapling\", \"Basalt\", \"Bone Brick\", \"Chain\", \"Coral Block\", \"Crop\", \"Fungus\", \"Gilded Blackstone\", \"Hard Crop\", \"Ladder\", \"Lantern\", \"Lily Pad\", \"Lodestone\", \"Netherite Block\", \"Netherrack\", \"Nether Bricks\", \"Nether Gold Ore\", \"Nether Ore\", \"Nether Sprouts\", \"Nether Wart\", \"Nylium\", \"Roots\", \"Scaffolding\", \"Shroomlight\", \"Slime Block\", \"Soul Sand\", \"Stem\", \"Sweet Berry Bush\", \"Twisting Vines\", \"Vine\", \"Wart Block\", \"Weeping Vines\", \"Wet Grass\"];\nvar materialOptions = [\"Dirt\", \"Air\", \"Bamboo\", \"Bamboo Sapling\", \"Barrier\", \"Bubble Column\", \"Buildable Glass\", \"Cactus\", \"Cake\", \"Clay\", \"Coral\", \"Cloth Decoration\", \"Decoration\", \"Egg\", \"Explosive\", \"Fire\", \"Glass\", \"Grass\", \"Heavy Metal\", \"Ice\", \"Ice Solid\", \"Lava\", \"Leaves\", \"Metal\", \"Nether Wood\", \"Piston\", \"Plant\", \"Portal\", \"Replaceable Plant\", \"Replaceable Fireproof Plant\", \"Replaceable Water Plant\", \"Sand\", \"Shulker Shell\", \"Snow\", \"Sponge\", \"Stone\", \"Structural Air\", \"Top Snow\", \"Vegetable\", \"Water\", \"Water Plant\", \"Web\", \"Wood\", \"Wool\"];\nvar transparencyOptions = [\"Solid\", \"Translucent\", \"Cutout\", \"Cutout (Mipped)\"];\nvar tabOptions = [\"Building Blocks\", \"Brewing\", \"Combat\", \"Food\", \"Decorations\", \"Misc\", \"Redstone\", \"Tools\", \"Transportation\"];\nvar particleOptions = [\"Ambient Entity Effect\", \"Angry Villager\", \"Ash\", \"Bubble\", \"Bubble Pop\", \"Campfire Smoke\", \"Cloud\", \"Composter\", \"Crimson Spore\", \"Crit\", \"Damage Indicator\", \"Dolphin\", \"Dripping Dripstone Lava\", \"Dripping Dripstone Water\", \"Dripping Honey\", \"Dripping Lava\", \"Dripping Obsidian Tear\", \"Dripping Water\", \"Elder Guardian\", \"Electric Spark\", \"Enchant\", \"Enchanted Hit\", \"End Rod\", \"Entity Effect\", \"Explosion\", \"Falling Dripstone Lava\", \"Falling Dripstone Water\", \"Falling Honey\", \"Falling Lava\", \"Falling Nectar\", \"Falling Obsidian Tear\", \"Falling Spore Blossom\", \"Falling Water\", \"Firework\", \"Fishing\", \"Flame\", \"Flash\", \"Glow\", \"Glow Squid Ink\", \"Happy Villager\", \"Heart\", \"Slime Item\", \"Snowball item\", \"Landing Honey\", \"Landing Lava\", \"Landing Obsidian Tear\", \"Lava\", \"Mycelium\", \"Nautilus\", \"Note\", \"Rain\", \"Reverse Portal\", \"Scrape\", \"Small Flame\", \"Snowflake\", \"Soul\", \"Soulfire Flame\", \"Spore Blossom Air\", \"Sweep Attack\", \"Totem of Undying\", \"Undewater\", \"Warped Spore\", \"Wax off\", \"Wax On\", \"White Ash\", \"Witch\"];\nvar customTypeOptions = [\"Default\", \"Flower\"];\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n  rotationTypes: rotationTypes,\n  soundOptions: soundOptions,\n  materialOptions: materialOptions,\n  transparencyOptions: transparencyOptions,\n  tabOptions: tabOptions,\n  customTypeOptions: customTypeOptions\n});\n\n/***/ }),\n\n/***/ \"./src/util/Settings.js\":\n/*!******************************!*\\\n  !*** ./src/util/Settings.js ***!\n  \\******************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"BAMO_SETTINGS_DEFAULT\": () => (/* binding */ BAMO_SETTINGS_DEFAULT),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.freeze.js */ \"./node_modules/core-js/modules/es.object.freeze.js\");\n/* harmony import */ var core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_freeze_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ \"./node_modules/core-js/modules/es.object.assign.js\");\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_1__);\n\n\nvar BAMO_SETTINGS_DEFAULT = {\n  displayName: \"\",\n  namespace: \"bamo\",\n  version: \"1.20.1\",\n  typeList: [],\n  material: \"Dirt\",\n  blastRes: 6,\n  slip: 0.6,\n  gravity: false,\n  rotType: \"default\",\n  sounds: \"Grass\",\n  lum: 0,\n  maxStack: 64,\n  fireproof: true,\n  creativeTab: \"Building Blocks\",\n  transparency: \"Solid\",\n  blockType: \"Default\",\n  types: {\n    custom: true,\n    customType: \"Default\",\n    block: false,\n    stair: false,\n    slab: false,\n    wall: false\n  },\n  variant: {\n    \"default\": {\n      all: \"\"\n    },\n    stair: {\n      top: \"\",\n      bottom: \"\",\n      side: \"\",\n      particle: \"\"\n    },\n    slab: {\n      top: \"\",\n      bottom: \"\",\n      side: \"\",\n      particle: \"\"\n    },\n    wall: {\n      wall: \"\",\n      particle: \"\"\n    }\n  },\n  particles: false,\n  particleType: \"Rain\",\n  particlePos: {\n    x: 8,\n    y: 8,\n    z: 8\n  },\n  particleSpread: {\n    x: 1,\n    y: 1,\n    z: 1\n  },\n  particleVel: {\n    x: 0.1,\n    y: 0.1,\n    z: 0.1\n  },\n  bufferedHitbox: true,\n  hitboxBuffer: 0.5,\n  genScRecipe: true,\n  genReversableScRecipe: true,\n  animated: false\n};\nObject.freeze(BAMO_SETTINGS_DEFAULT);\nvar bamoSettings = {};\nbamoSettings[\"\"] = Object.assign({}, BAMO_SETTINGS_DEFAULT);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (bamoSettings);\n\n/***/ }),\n\n/***/ \"./src/util/Utils.js\":\n/*!***************************!*\\\n  !*** ./src/util/Utils.js ***!\n  \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"cleanFileName\": () => (/* binding */ cleanFileName),\n/* harmony export */   \"dictFromTexture\": () => (/* binding */ dictFromTexture)\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.for-each.js */ \"./node_modules/core-js/modules/es.array.for-each.js\");\n/* harmony import */ var core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_for_each_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\n/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.string.split.js */ \"./node_modules/core-js/modules/es.string.split.js\");\n/* harmony import */ var core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_split_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\nfunction dictFromTexture(image, ns, name) {\n  var ret = \"\";\n  Texture.all.forEach(function (tx) {\n    if (tx.name == image || image == \"particle\" && tx.particle == true) {\n      if (tx.namespace == \"\") {\n        ret = ns + \":blocks/\" + name + \"_\" + cleanFileName(tx.name.split(\".\")[0]);\n      } else {\n        ret = tx.namespace + \":\" + tx.folder + \"/\" + cleanFileName(tx.name.split(\".\")[0]);\n      }\n    }\n  });\n  return ret;\n}\nfunction cleanFileName(name) {\n  return name.replace(/[^a-zA-Z\\d\\s._]/g, '').replace(/\\s+/g, \"_\").toLowerCase();\n}\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/a-callable.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/core-js/internals/a-callable.js ***!\n  \\******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar tryToString = __webpack_require__(/*! ../internals/try-to-string */ \"./node_modules/core-js/internals/try-to-string.js\");\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n  if (isCallable(argument)) return argument;\n  throw $TypeError(tryToString(argument) + ' is not a function');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/a-constructor.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/a-constructor.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isConstructor = __webpack_require__(/*! ../internals/is-constructor */ \"./node_modules/core-js/internals/is-constructor.js\");\nvar tryToString = __webpack_require__(/*! ../internals/try-to-string */ \"./node_modules/core-js/internals/try-to-string.js\");\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n  if (isConstructor(argument)) return argument;\n  throw $TypeError(tryToString(argument) + ' is not a constructor');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/a-possible-prototype.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/a-possible-prototype.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n  if (typeof argument == 'object' || isCallable(argument)) return argument;\n  throw $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/add-to-unscopables.js\":\n/*!**************************************************************!*\\\n  !*** ./node_modules/core-js/internals/add-to-unscopables.js ***!\n  \\**************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n  defineProperty(ArrayPrototype, UNSCOPABLES, {\n    configurable: true,\n    value: create(null)\n  });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n  ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/advance-string-index.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/advance-string-index.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar charAt = (__webpack_require__(/*! ../internals/string-multibyte */ \"./node_modules/core-js/internals/string-multibyte.js\").charAt);\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n  return index + (unicode ? charAt(S, index).length : 1);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/an-object.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/an-object.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n  if (isObject(argument)) return argument;\n  throw $TypeError($String(argument) + ' is not an object');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-buffer-non-extensible.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-buffer-non-extensible.js ***!\n  \\***********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n// FF26- bug: ArrayBuffers are non-extensible, but Object.isExtensible does not report it\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = fails(function () {\n  if (typeof ArrayBuffer == 'function') {\n    var buffer = new ArrayBuffer(8);\n    // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-defineproperty -- safe\n    if (Object.isExtensible(buffer)) Object.defineProperty(buffer, 'a', { value: 8 });\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-for-each.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-for-each.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $forEach = (__webpack_require__(/*! ../internals/array-iteration */ \"./node_modules/core-js/internals/array-iteration.js\").forEach);\nvar arrayMethodIsStrict = __webpack_require__(/*! ../internals/array-method-is-strict */ \"./node_modules/core-js/internals/array-method-is-strict.js\");\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\nmodule.exports = !STRICT_METHOD ? function forEach(callbackfn /* , thisArg */) {\n  return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n// eslint-disable-next-line es-x/no-array-prototype-foreach -- safe\n} : [].forEach;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-includes.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-includes.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\nvar lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ \"./node_modules/core-js/internals/length-of-array-like.js\");\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = lengthOfArrayLike(O);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare -- NaN check\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) {\n      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.includes` method\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\n  includes: createMethod(true),\n  // `Array.prototype.indexOf` method\n  // https://tc39.es/ecma262/#sec-array.prototype.indexof\n  indexOf: createMethod(false)\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-iteration.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-iteration.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar bind = __webpack_require__(/*! ../internals/function-bind-context */ \"./node_modules/core-js/internals/function-bind-context.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ \"./node_modules/core-js/internals/indexed-object.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ \"./node_modules/core-js/internals/length-of-array-like.js\");\nvar arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ \"./node_modules/core-js/internals/array-species-create.js\");\n\nvar push = uncurryThis([].push);\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation\nvar createMethod = function (TYPE) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var IS_FILTER_REJECT = TYPE == 7;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  return function ($this, callbackfn, that, specificCreate) {\n    var O = toObject($this);\n    var self = IndexedObject(O);\n    var boundFunction = bind(callbackfn, that);\n    var length = lengthOfArrayLike(self);\n    var index = 0;\n    var create = specificCreate || arraySpeciesCreate;\n    var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;\n    var value, result;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      value = self[index];\n      result = boundFunction(value, index, O);\n      if (TYPE) {\n        if (IS_MAP) target[index] = result; // map\n        else if (result) switch (TYPE) {\n          case 3: return true;              // some\n          case 5: return value;             // find\n          case 6: return index;             // findIndex\n          case 2: push(target, value);      // filter\n        } else switch (TYPE) {\n          case 4: return false;             // every\n          case 7: push(target, value);      // filterReject\n        }\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.forEach` method\n  // https://tc39.es/ecma262/#sec-array.prototype.foreach\n  forEach: createMethod(0),\n  // `Array.prototype.map` method\n  // https://tc39.es/ecma262/#sec-array.prototype.map\n  map: createMethod(1),\n  // `Array.prototype.filter` method\n  // https://tc39.es/ecma262/#sec-array.prototype.filter\n  filter: createMethod(2),\n  // `Array.prototype.some` method\n  // https://tc39.es/ecma262/#sec-array.prototype.some\n  some: createMethod(3),\n  // `Array.prototype.every` method\n  // https://tc39.es/ecma262/#sec-array.prototype.every\n  every: createMethod(4),\n  // `Array.prototype.find` method\n  // https://tc39.es/ecma262/#sec-array.prototype.find\n  find: createMethod(5),\n  // `Array.prototype.findIndex` method\n  // https://tc39.es/ecma262/#sec-array.prototype.findIndex\n  findIndex: createMethod(6),\n  // `Array.prototype.filterReject` method\n  // https://github.com/tc39/proposal-array-filtering\n  filterReject: createMethod(7)\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-method-has-species-support.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-method-has-species-support.js ***!\n  \\****************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ \"./node_modules/core-js/internals/engine-v8-version.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n  // We can't use this feature detection in V8 since it causes\n  // deoptimization and serious performance degradation\n  // https://github.com/zloirock/core-js/issues/677\n  return V8_VERSION >= 51 || !fails(function () {\n    var array = [];\n    var constructor = array.constructor = {};\n    constructor[SPECIES] = function () {\n      return { foo: 1 };\n    };\n    return array[METHOD_NAME](Boolean).foo !== 1;\n  });\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-method-is-strict.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-method-is-strict.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = function (METHOD_NAME, argument) {\n  var method = [][METHOD_NAME];\n  return !!method && fails(function () {\n    // eslint-disable-next-line no-useless-call -- required for testing\n    method.call(null, argument || function () { return 1; }, 1);\n  });\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-slice-simple.js\":\n/*!**************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-slice-simple.js ***!\n  \\**************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\nvar lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ \"./node_modules/core-js/internals/length-of-array-like.js\");\nvar createProperty = __webpack_require__(/*! ../internals/create-property */ \"./node_modules/core-js/internals/create-property.js\");\n\nvar $Array = Array;\nvar max = Math.max;\n\nmodule.exports = function (O, start, end) {\n  var length = lengthOfArrayLike(O);\n  var k = toAbsoluteIndex(start, length);\n  var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n  var result = $Array(max(fin - k, 0));\n  for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]);\n  result.length = n;\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-slice.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-slice.js ***!\n  \\*******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\n\nmodule.exports = uncurryThis([].slice);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-species-constructor.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-species-constructor.js ***!\n  \\*********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArray = __webpack_require__(/*! ../internals/is-array */ \"./node_modules/core-js/internals/is-array.js\");\nvar isConstructor = __webpack_require__(/*! ../internals/is-constructor */ \"./node_modules/core-js/internals/is-constructor.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\n\n// a part of `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray) {\n  var C;\n  if (isArray(originalArray)) {\n    C = originalArray.constructor;\n    // cross-realm fallback\n    if (isConstructor(C) && (C === $Array || isArray(C.prototype))) C = undefined;\n    else if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? $Array : C;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/array-species-create.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/array-species-create.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arraySpeciesConstructor = __webpack_require__(/*! ../internals/array-species-constructor */ \"./node_modules/core-js/internals/array-species-constructor.js\");\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.es/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n  return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/classof-raw.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/classof-raw.js ***!\n  \\*******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n  return stringSlice(toString(it), 8, -1);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/classof.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/core-js/internals/classof.js ***!\n  \\***************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ \"./node_modules/core-js/internals/to-string-tag-support.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar classofRaw = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n  var O, tag, result;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n    // builtinTag case\n    : CORRECT_ARGUMENTS ? classofRaw(O)\n    // ES3 arguments fallback\n    : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/copy-constructor-properties.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/copy-constructor-properties.js ***!\n  \\***********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar ownKeys = __webpack_require__(/*! ../internals/own-keys */ \"./node_modules/core-js/internals/own-keys.js\");\nvar getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\n\nmodule.exports = function (target, source, exceptions) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n      defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n    }\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/correct-prototype-getter.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/correct-prototype-getter.js ***!\n  \\********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !fails(function () {\n  function F() { /* empty */ }\n  F.prototype.constructor = null;\n  // eslint-disable-next-line es-x/no-object-getprototypeof -- required for testing\n  return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/create-iterator-constructor.js\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/create-iterator-constructor.js ***!\n  \\***********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar IteratorPrototype = (__webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\").IteratorPrototype);\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n  var TO_STRING_TAG = NAME + ' Iterator';\n  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n  Iterators[TO_STRING_TAG] = returnThis;\n  return IteratorConstructor;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/create-non-enumerable-property.js\":\n/*!**************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/create-non-enumerable-property.js ***!\n  \\**************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/create-property-descriptor.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/create-property-descriptor.js ***!\n  \\**********************************************************************/\n/***/ ((module) => {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/create-property.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/create-property.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ \"./node_modules/core-js/internals/to-property-key.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\n\nmodule.exports = function (object, key, value) {\n  var propertyKey = toPropertyKey(key);\n  if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n  else object[propertyKey] = value;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/define-built-in.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/define-built-in.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\nvar makeBuiltIn = __webpack_require__(/*! ../internals/make-built-in */ \"./node_modules/core-js/internals/make-built-in.js\");\nvar defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ \"./node_modules/core-js/internals/define-global-property.js\");\n\nmodule.exports = function (O, key, value, options) {\n  if (!options) options = {};\n  var simple = options.enumerable;\n  var name = options.name !== undefined ? options.name : key;\n  if (isCallable(value)) makeBuiltIn(value, name, options);\n  if (options.global) {\n    if (simple) O[key] = value;\n    else defineGlobalProperty(key, value);\n  } else {\n    if (!options.unsafe) delete O[key];\n    else if (O[key]) simple = true;\n    if (simple) O[key] = value;\n    else createNonEnumerableProperty(O, key, value);\n  } return O;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/define-global-property.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/define-global-property.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\n// eslint-disable-next-line es-x/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n  try {\n    defineProperty(global, key, { value: value, configurable: true, writable: true });\n  } catch (error) {\n    global[key] = value;\n  } return value;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/define-iterator.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/define-iterator.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar FunctionName = __webpack_require__(/*! ../internals/function-name */ \"./node_modules/core-js/internals/function-name.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar createIteratorConstructor = __webpack_require__(/*! ../internals/create-iterator-constructor */ \"./node_modules/core-js/internals/create-iterator-constructor.js\");\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar setPrototypeOf = __webpack_require__(/*! ../internals/object-set-prototype-of */ \"./node_modules/core-js/internals/object-set-prototype-of.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar IteratorsCore = __webpack_require__(/*! ../internals/iterators-core */ \"./node_modules/core-js/internals/iterators-core.js\");\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n  var getIterationMethod = function (KIND) {\n    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n    switch (KIND) {\n      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n    } return function () { return new IteratorConstructor(this); };\n  };\n\n  var TO_STRING_TAG = NAME + ' Iterator';\n  var INCORRECT_VALUES_NAME = false;\n  var IterablePrototype = Iterable.prototype;\n  var nativeIterator = IterablePrototype[ITERATOR]\n    || IterablePrototype['@@iterator']\n    || DEFAULT && IterablePrototype[DEFAULT];\n  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n  var CurrentIteratorPrototype, methods, KEY;\n\n  // fix native\n  if (anyNativeIterator) {\n    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n    if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n        if (setPrototypeOf) {\n          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n        } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n          defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n        }\n      }\n      // Set @@toStringTag to native iterators\n      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n    }\n  }\n\n  // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n  if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n    if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n      createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n    } else {\n      INCORRECT_VALUES_NAME = true;\n      defaultIterator = function values() { return call(nativeIterator, this); };\n    }\n  }\n\n  // export additional methods\n  if (DEFAULT) {\n    methods = {\n      values: getIterationMethod(VALUES),\n      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n      entries: getIterationMethod(ENTRIES)\n    };\n    if (FORCED) for (KEY in methods) {\n      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n        defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n      }\n    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n  }\n\n  // define iterator\n  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n    defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n  }\n  Iterators[NAME] = defaultIterator;\n\n  return methods;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/define-well-known-symbol.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/define-well-known-symbol.js ***!\n  \\********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar path = __webpack_require__(/*! ../internals/path */ \"./node_modules/core-js/internals/path.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ \"./node_modules/core-js/internals/well-known-symbol-wrapped.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\n\nmodule.exports = function (NAME) {\n  var Symbol = path.Symbol || (path.Symbol = {});\n  if (!hasOwn(Symbol, NAME)) defineProperty(Symbol, NAME, {\n    value: wrappedWellKnownSymbolModule.f(NAME)\n  });\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/descriptors.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/descriptors.js ***!\n  \\*******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing\n  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/document-create-element.js\":\n/*!*******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/document-create-element.js ***!\n  \\*******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return EXISTS ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/does-not-exceed-safe-integer.js\":\n/*!************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/does-not-exceed-safe-integer.js ***!\n  \\************************************************************************/\n/***/ ((module) => {\n\nvar $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n  if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/dom-iterables.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/dom-iterables.js ***!\n  \\*********************************************************/\n/***/ ((module) => {\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n  CSSRuleList: 0,\n  CSSStyleDeclaration: 0,\n  CSSValueList: 0,\n  ClientRectList: 0,\n  DOMRectList: 0,\n  DOMStringList: 0,\n  DOMTokenList: 1,\n  DataTransferItemList: 0,\n  FileList: 0,\n  HTMLAllCollection: 0,\n  HTMLCollection: 0,\n  HTMLFormElement: 0,\n  HTMLSelectElement: 0,\n  MediaList: 0,\n  MimeTypeArray: 0,\n  NamedNodeMap: 0,\n  NodeList: 1,\n  PaintRequestList: 0,\n  Plugin: 0,\n  PluginArray: 0,\n  SVGLengthList: 0,\n  SVGNumberList: 0,\n  SVGPathSegList: 0,\n  SVGPointList: 0,\n  SVGStringList: 0,\n  SVGTransformList: 0,\n  SourceBufferList: 0,\n  StyleSheetList: 0,\n  TextTrackCueList: 0,\n  TextTrackList: 0,\n  TouchList: 0\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/dom-token-list-prototype.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/dom-token-list-prototype.js ***!\n  \\********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/engine-user-agent.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/engine-user-agent.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/engine-v8-version.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/engine-v8-version.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar userAgent = __webpack_require__(/*! ../internals/engine-user-agent */ \"./node_modules/core-js/internals/engine-user-agent.js\");\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n  match = v8.split('.');\n  // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n  // but their correct versions are not interesting for us\n  version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n  match = userAgent.match(/Edge\\/(\\d+)/);\n  if (!match || match[1] >= 74) {\n    match = userAgent.match(/Chrome\\/(\\d+)/);\n    if (match) version = +match[1];\n  }\n}\n\nmodule.exports = version;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/enum-bug-keys.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/enum-bug-keys.js ***!\n  \\*********************************************************/\n/***/ ((module) => {\n\n// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/export.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/core-js/internals/export.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar getOwnPropertyDescriptor = (__webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\").f);\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ \"./node_modules/core-js/internals/define-global-property.js\");\nvar copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ \"./node_modules/core-js/internals/copy-constructor-properties.js\");\nvar isForced = __webpack_require__(/*! ../internals/is-forced */ \"./node_modules/core-js/internals/is-forced.js\");\n\n/*\n  options.target         - name of the target object\n  options.global         - target is the global object\n  options.stat           - export as static methods of target\n  options.proto          - export as prototype methods of target\n  options.real           - real prototype method for the `pure` version\n  options.forced         - export even if the native feature is available\n  options.bind           - bind methods to the target, required for the `pure` version\n  options.wrap           - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe         - use the simple assignment of property instead of delete + defineProperty\n  options.sham           - add a flag to not completely full polyfills\n  options.enumerable     - export as enumerable property\n  options.dontCallGetSet - prevent calling a getter on target\n  options.name           - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = global;\n  } else if (STATIC) {\n    target = global[TARGET] || defineGlobalProperty(TARGET, {});\n  } else {\n    target = (global[TARGET] || {}).prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.dontCallGetSet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty == typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      createNonEnumerableProperty(sourceProperty, 'sham', true);\n    }\n    defineBuiltIn(target, key, sourceProperty, options);\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/fails.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/core-js/internals/fails.js ***!\n  \\*************************************************/\n/***/ ((module) => {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js ***!\n  \\******************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n__webpack_require__(/*! ../modules/es.regexp.exec */ \"./node_modules/core-js/modules/es.regexp.exec.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n  var SYMBOL = wellKnownSymbol(KEY);\n\n  var DELEGATES_TO_SYMBOL = !fails(function () {\n    // String methods call symbol-named RegEp methods\n    var O = {};\n    O[SYMBOL] = function () { return 7; };\n    return ''[KEY](O) != 7;\n  });\n\n  var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n    // Symbol-named RegExp methods call .exec\n    var execCalled = false;\n    var re = /a/;\n\n    if (KEY === 'split') {\n      // We can't use real regex here since it causes deoptimization\n      // and serious performance degradation in V8\n      // https://github.com/zloirock/core-js/issues/306\n      re = {};\n      // RegExp[@@split] doesn't call the regex's exec method, but first creates\n      // a new one. We need to return the patched regex when creating the new one.\n      re.constructor = {};\n      re.constructor[SPECIES] = function () { return re; };\n      re.flags = '';\n      re[SYMBOL] = /./[SYMBOL];\n    }\n\n    re.exec = function () { execCalled = true; return null; };\n\n    re[SYMBOL]('');\n    return !execCalled;\n  });\n\n  if (\n    !DELEGATES_TO_SYMBOL ||\n    !DELEGATES_TO_EXEC ||\n    FORCED\n  ) {\n    var uncurriedNativeRegExpMethod = uncurryThis(/./[SYMBOL]);\n    var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n      var uncurriedNativeMethod = uncurryThis(nativeMethod);\n      var $exec = regexp.exec;\n      if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n        if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n          // The native String method already delegates to @@method (this\n          // polyfilled function), leasing to infinite recursion.\n          // We avoid it by directly calling the native @@method method.\n          return { done: true, value: uncurriedNativeRegExpMethod(regexp, str, arg2) };\n        }\n        return { done: true, value: uncurriedNativeMethod(str, regexp, arg2) };\n      }\n      return { done: false };\n    });\n\n    defineBuiltIn(String.prototype, KEY, methods[0]);\n    defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n  }\n\n  if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/freezing.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/core-js/internals/freezing.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es-x/no-object-isextensible, es-x/no-object-preventextensions -- required for testing\n  return Object.isExtensible(Object.preventExtensions({}));\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-apply.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-apply.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ \"./node_modules/core-js/internals/function-bind-native.js\");\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es-x/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n  return call.apply(apply, arguments);\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-bind-context.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-bind-context.js ***!\n  \\*****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar aCallable = __webpack_require__(/*! ../internals/a-callable */ \"./node_modules/core-js/internals/a-callable.js\");\nvar NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ \"./node_modules/core-js/internals/function-bind-native.js\");\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n  aCallable(fn);\n  return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-bind-native.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-bind-native.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es-x/no-function-prototype-bind -- safe\n  var test = (function () { /* empty */ }).bind();\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-call.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-call.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ \"./node_modules/core-js/internals/function-bind-native.js\");\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n  return call.apply(call, arguments);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-name.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-name.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n  EXISTS: EXISTS,\n  PROPER: PROPER,\n  CONFIGURABLE: CONFIGURABLE\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/function-uncurry-this.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/function-uncurry-this.js ***!\n  \\*****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar NATIVE_BIND = __webpack_require__(/*! ../internals/function-bind-native */ \"./node_modules/core-js/internals/function-bind-native.js\");\n\nvar FunctionPrototype = Function.prototype;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\nvar uncurryThis = NATIVE_BIND && bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? function (fn) {\n  return fn && uncurryThis(fn);\n} : function (fn) {\n  return fn && function () {\n    return call.apply(fn, arguments);\n  };\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/get-built-in.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/internals/get-built-in.js ***!\n  \\********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\n\nvar aFunction = function (argument) {\n  return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/get-method.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/core-js/internals/get-method.js ***!\n  \\******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar aCallable = __webpack_require__(/*! ../internals/a-callable */ \"./node_modules/core-js/internals/a-callable.js\");\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n  var func = V[P];\n  return func == null ? undefined : aCallable(func);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/get-substitution.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/internals/get-substitution.js ***!\n  \\************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n  var tailPos = position + matched.length;\n  var m = captures.length;\n  var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n  if (namedCaptures !== undefined) {\n    namedCaptures = toObject(namedCaptures);\n    symbols = SUBSTITUTION_SYMBOLS;\n  }\n  return replace(replacement, symbols, function (match, ch) {\n    var capture;\n    switch (charAt(ch, 0)) {\n      case '$': return '$';\n      case '&': return matched;\n      case '`': return stringSlice(str, 0, position);\n      case \"'\": return stringSlice(str, tailPos);\n      case '<':\n        capture = namedCaptures[stringSlice(ch, 1, -1)];\n        break;\n      default: // \\d\\d?\n        var n = +ch;\n        if (n === 0) return match;\n        if (n > m) {\n          var f = floor(n / 10);\n          if (f === 0) return match;\n          if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n          return match;\n        }\n        capture = captures[n - 1];\n    }\n    return capture === undefined ? '' : capture;\n  });\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/global.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/core-js/internals/global.js ***!\n  \\**************************************************/\n/***/ ((module) => {\n\nvar check = function (it) {\n  return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n  // eslint-disable-next-line es-x/no-global-this -- safe\n  check(typeof globalThis == 'object' && globalThis) ||\n  check(typeof window == 'object' && window) ||\n  // eslint-disable-next-line no-restricted-globals -- safe\n  check(typeof self == 'object' && self) ||\n  check(typeof global == 'object' && global) ||\n  // eslint-disable-next-line no-new-func -- fallback\n  (function () { return this; })() || Function('return this')();\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/has-own-property.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/internals/has-own-property.js ***!\n  \\************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es-x/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n  return hasOwnProperty(toObject(it), key);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/hidden-keys.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/hidden-keys.js ***!\n  \\*******************************************************/\n/***/ ((module) => {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/html.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/core-js/internals/html.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/ie8-dom-define.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/ie8-dom-define.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar createElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing\n  return Object.defineProperty(createElement('div'), 'a', {\n    get: function () { return 7; }\n  }).a != 7;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/indexed-object.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/indexed-object.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) == 'String' ? split(it, '') : $Object(it);\n} : $Object;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/inspect-source.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/inspect-source.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar store = __webpack_require__(/*! ../internals/shared-store */ \"./node_modules/core-js/internals/shared-store.js\");\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n  store.inspectSource = function (it) {\n    return functionToString(it);\n  };\n}\n\nmodule.exports = store.inspectSource;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/internal-metadata.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/internal-metadata.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\nvar getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\");\nvar getOwnPropertyNamesExternalModule = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ \"./node_modules/core-js/internals/object-get-own-property-names-external.js\");\nvar isExtensible = __webpack_require__(/*! ../internals/object-is-extensible */ \"./node_modules/core-js/internals/object-is-extensible.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\nvar FREEZING = __webpack_require__(/*! ../internals/freezing */ \"./node_modules/core-js/internals/freezing.js\");\n\nvar REQUIRED = false;\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar setMetadata = function (it) {\n  defineProperty(it, METADATA, { value: {\n    objectID: 'O' + id++, // object ID\n    weakData: {}          // weak collections IDs\n  } });\n};\n\nvar fastKey = function (it, create) {\n  // return a primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!hasOwn(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMetadata(it);\n  // return object ID\n  } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n  if (!hasOwn(it, METADATA)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMetadata(it);\n  // return the store of weak collections IDs\n  } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZING && REQUIRED && isExtensible(it) && !hasOwn(it, METADATA)) setMetadata(it);\n  return it;\n};\n\nvar enable = function () {\n  meta.enable = function () { /* empty */ };\n  REQUIRED = true;\n  var getOwnPropertyNames = getOwnPropertyNamesModule.f;\n  var splice = uncurryThis([].splice);\n  var test = {};\n  test[METADATA] = 1;\n\n  // prevent exposing of metadata key\n  if (getOwnPropertyNames(test).length) {\n    getOwnPropertyNamesModule.f = function (it) {\n      var result = getOwnPropertyNames(it);\n      for (var i = 0, length = result.length; i < length; i++) {\n        if (result[i] === METADATA) {\n          splice(result, i, 1);\n          break;\n        }\n      } return result;\n    };\n\n    $({ target: 'Object', stat: true, forced: true }, {\n      getOwnPropertyNames: getOwnPropertyNamesExternalModule.f\n    });\n  }\n};\n\nvar meta = module.exports = {\n  enable: enable,\n  fastKey: fastKey,\n  getWeakData: getWeakData,\n  onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/internal-state.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/internal-state.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar NATIVE_WEAK_MAP = __webpack_require__(/*! ../internals/native-weak-map */ \"./node_modules/core-js/internals/native-weak-map.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar shared = __webpack_require__(/*! ../internals/shared-store */ \"./node_modules/core-js/internals/shared-store.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n  var store = shared.state || (shared.state = new WeakMap());\n  var wmget = uncurryThis(store.get);\n  var wmhas = uncurryThis(store.has);\n  var wmset = uncurryThis(store.set);\n  set = function (it, metadata) {\n    if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    wmset(store, it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return wmget(store, it) || {};\n  };\n  has = function (it) {\n    return wmhas(store, it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    createNonEnumerableProperty(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return hasOwn(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return hasOwn(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-array.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-array.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es-x/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n  return classof(argument) == 'Array';\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-callable.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-callable.js ***!\n  \\*******************************************************/\n/***/ ((module) => {\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = function (argument) {\n  return typeof argument == 'function';\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-constructor.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-constructor.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar inspectSource = __webpack_require__(/*! ../internals/inspect-source */ \"./node_modules/core-js/internals/inspect-source.js\");\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n  if (!isCallable(argument)) return false;\n  try {\n    construct(noop, empty, argument);\n    return true;\n  } catch (error) {\n    return false;\n  }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n  if (!isCallable(argument)) return false;\n  switch (classof(argument)) {\n    case 'AsyncFunction':\n    case 'GeneratorFunction':\n    case 'AsyncGeneratorFunction': return false;\n  }\n  try {\n    // we can't check .prototype since constructors produced by .bind haven't it\n    // `Function#toString` throws on some built-it function in some legacy engines\n    // (for example, `DOMQuad` and similar in FF41-)\n    return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n  } catch (error) {\n    return true;\n  }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n  var called;\n  return isConstructorModern(isConstructorModern.call)\n    || !isConstructorModern(Object)\n    || !isConstructorModern(function () { called = true; })\n    || called;\n}) ? isConstructorLegacy : isConstructorModern;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-forced.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-forced.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value == POLYFILL ? true\n    : value == NATIVE ? false\n    : isCallable(detection) ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-object.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-object.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\n\nmodule.exports = function (it) {\n  return typeof it == 'object' ? it !== null : isCallable(it);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-pure.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-pure.js ***!\n  \\***************************************************/\n/***/ ((module) => {\n\nmodule.exports = false;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-regexp.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-regexp.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/is-symbol.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/is-symbol.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\nvar USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ \"./node_modules/core-js/internals/use-symbol-as-uid.js\");\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  var $Symbol = getBuiltIn('Symbol');\n  return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/iterators-core.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/internals/iterators-core.js ***!\n  \\**********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar getPrototypeOf = __webpack_require__(/*! ../internals/object-get-prototype-of */ \"./node_modules/core-js/internals/object-get-prototype-of.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es-x/no-array-prototype-keys -- safe */\nif ([].keys) {\n  arrayIterator = [].keys();\n  // Safari 8 has buggy iterators w/o `next`\n  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n  else {\n    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n  }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n  var test = {};\n  // FF44- legacy iterators case\n  return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n  defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n    return this;\n  });\n}\n\nmodule.exports = {\n  IteratorPrototype: IteratorPrototype,\n  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/iterators.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/iterators.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\nmodule.exports = {};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/length-of-array-like.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/length-of-array-like.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n  return toLength(obj.length);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/make-built-in.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/make-built-in.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar CONFIGURABLE_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ \"./node_modules/core-js/internals/function-name.js\").CONFIGURABLE);\nvar inspectSource = __webpack_require__(/*! ../internals/inspect-source */ \"./node_modules/core-js/internals/inspect-source.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\n// eslint-disable-next-line es-x/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n  return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n  if (String(name).slice(0, 7) === 'Symbol(') {\n    name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n  }\n  if (options && options.getter) name = 'get ' + name;\n  if (options && options.setter) name = 'set ' + name;\n  if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n    defineProperty(value, 'name', { value: name, configurable: true });\n  }\n  if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n    defineProperty(value, 'length', { value: options.arity });\n  }\n  try {\n    if (options && hasOwn(options, 'constructor') && options.constructor) {\n      if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n    // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n    } else if (value.prototype) value.prototype = undefined;\n  } catch (error) { /* empty */ }\n  var state = enforceInternalState(value);\n  if (!hasOwn(state, 'source')) {\n    state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n  } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n  return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/math-trunc.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/core-js/internals/math-trunc.js ***!\n  \\******************************************************/\n/***/ ((module) => {\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es-x/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n  var n = +x;\n  return (n > 0 ? floor : ceil)(n);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/native-symbol-registry.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/native-symbol-registry.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\n\n/* eslint-disable es-x/no-symbol -- safe */\nmodule.exports = NATIVE_SYMBOL && !!Symbol['for'] && !!Symbol.keyFor;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/native-symbol.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/native-symbol.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/* eslint-disable es-x/no-symbol -- required for testing */\nvar V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ \"./node_modules/core-js/internals/engine-v8-version.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// eslint-disable-next-line es-x/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n  var symbol = Symbol();\n  // Chrome 38 Symbol has incorrect toString conversion\n  // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n  return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n    // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n    !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/native-weak-map.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/native-weak-map.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar inspectSource = __webpack_require__(/*! ../internals/inspect-source */ \"./node_modules/core-js/internals/inspect-source.js\");\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-assign.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-assign.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar objectKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ \"./node_modules/core-js/internals/object-property-is-enumerable.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ \"./node_modules/core-js/internals/indexed-object.js\");\n\n// eslint-disable-next-line es-x/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es-x/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n  // should have correct order of operations (Edge bug)\n  if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n    enumerable: true,\n    get: function () {\n      defineProperty(this, 'b', {\n        value: 3,\n        enumerable: false\n      });\n    }\n  }), { b: 2 })).b !== 1) return true;\n  // should work with symbols and should have deterministic property order (V8 bug)\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line es-x/no-symbol -- safe\n  var symbol = Symbol();\n  var alphabet = 'abcdefghijklmnopqrst';\n  A[symbol] = 7;\n  alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n  return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n  var T = toObject(target);\n  var argumentsLength = arguments.length;\n  var index = 1;\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  var propertyIsEnumerable = propertyIsEnumerableModule.f;\n  while (argumentsLength > index) {\n    var S = IndexedObject(arguments[index++]);\n    var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-create.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-create.js ***!\n  \\*********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ \"./node_modules/core-js/internals/object-define-properties.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\nvar html = __webpack_require__(/*! ../internals/html */ \"./node_modules/core-js/internals/html.js\");\nvar documentCreateElement = __webpack_require__(/*! ../internals/document-create-element */ \"./node_modules/core-js/internals/document-create-element.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n  activeXDocument.write(scriptTag(''));\n  activeXDocument.close();\n  var temp = activeXDocument.parentWindow.Object;\n  activeXDocument = null; // avoid memory leak\n  return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = documentCreateElement('iframe');\n  var JS = 'java' + SCRIPT + ':';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  // https://github.com/zloirock/core-js/issues/475\n  iframe.src = String(JS);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(scriptTag('document.F=Object'));\n  iframeDocument.close();\n  return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n  try {\n    activeXDocument = new ActiveXObject('htmlfile');\n  } catch (error) { /* ignore */ }\n  NullProtoObject = typeof document != 'undefined'\n    ? document.domain && activeXDocument\n      ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n      : NullProtoObjectViaIFrame()\n    : NullProtoObjectViaActiveX(activeXDocument); // WSH\n  var length = enumBugKeys.length;\n  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n  return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es-x/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    EmptyConstructor[PROTOTYPE] = anObject(O);\n    result = new EmptyConstructor();\n    EmptyConstructor[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = NullProtoObject();\n  return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-define-properties.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-define-properties.js ***!\n  \\********************************************************************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ \"./node_modules/core-js/internals/v8-prototype-define-bug.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar objectKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es-x/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var props = toIndexedObject(Properties);\n  var keys = objectKeys(Properties);\n  var length = keys.length;\n  var index = 0;\n  var key;\n  while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-define-property.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-define-property.js ***!\n  \\******************************************************************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\nvar V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(/*! ../internals/v8-prototype-define-bug */ \"./node_modules/core-js/internals/v8-prototype-define-bug.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ \"./node_modules/core-js/internals/to-property-key.js\");\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es-x/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n    var current = $getOwnPropertyDescriptor(O, P);\n    if (current && current[WRITABLE]) {\n      O[P] = Attributes.value;\n      Attributes = {\n        configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n        enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n        writable: false\n      };\n    }\n  } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return $defineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-get-own-property-descriptor.js ***!\n  \\******************************************************************************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ \"./node_modules/core-js/internals/object-property-is-enumerable.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ \"./node_modules/core-js/internals/to-property-key.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar IE8_DOM_DEFINE = __webpack_require__(/*! ../internals/ie8-dom-define */ \"./node_modules/core-js/internals/ie8-dom-define.js\");\n\n// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPropertyKey(P);\n  if (IE8_DOM_DEFINE) try {\n    return $getOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-get-own-property-names-external.js\":\n/*!**********************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-get-own-property-names-external.js ***!\n  \\**********************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/* eslint-disable es-x/no-object-getownpropertynames -- safe */\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar $getOwnPropertyNames = (__webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\").f);\nvar arraySlice = __webpack_require__(/*! ../internals/array-slice-simple */ \"./node_modules/core-js/internals/array-slice-simple.js\");\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return $getOwnPropertyNames(it);\n  } catch (error) {\n    return arraySlice(windowNames);\n  }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && classof(it) == 'Window'\n    ? getWindowNames(it)\n    : $getOwnPropertyNames(toIndexedObject(it));\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-get-own-property-names.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-get-own-property-names.js ***!\n  \\*************************************************************************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es-x/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\":\n/*!***************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-get-own-property-symbols.js ***!\n  \\***************************************************************************/\n/***/ ((__unused_webpack_module, exports) => {\n\n// eslint-disable-next-line es-x/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-get-prototype-of.js\":\n/*!*******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-get-prototype-of.js ***!\n  \\*******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar CORRECT_PROTOTYPE_GETTER = __webpack_require__(/*! ../internals/correct-prototype-getter */ \"./node_modules/core-js/internals/correct-prototype-getter.js\");\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es-x/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n  var object = toObject(O);\n  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n  var constructor = object.constructor;\n  if (isCallable(constructor) && object instanceof constructor) {\n    return constructor.prototype;\n  } return object instanceof $Object ? ObjectPrototype : null;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-is-extensible.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-is-extensible.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar ARRAY_BUFFER_NON_EXTENSIBLE = __webpack_require__(/*! ../internals/array-buffer-non-extensible */ \"./node_modules/core-js/internals/array-buffer-non-extensible.js\");\n\n// eslint-disable-next-line es-x/no-object-isextensible -- safe\nvar $isExtensible = Object.isExtensible;\nvar FAILS_ON_PRIMITIVES = fails(function () { $isExtensible(1); });\n\n// `Object.isExtensible` method\n// https://tc39.es/ecma262/#sec-object.isextensible\nmodule.exports = (FAILS_ON_PRIMITIVES || ARRAY_BUFFER_NON_EXTENSIBLE) ? function isExtensible(it) {\n  if (!isObject(it)) return false;\n  if (ARRAY_BUFFER_NON_EXTENSIBLE && classof(it) == 'ArrayBuffer') return false;\n  return $isExtensible ? $isExtensible(it) : true;\n} : $isExtensible;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-is-prototype-of.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-is-prototype-of.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-keys-internal.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-keys-internal.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar indexOf = (__webpack_require__(/*! ../internals/array-includes */ \"./node_modules/core-js/internals/array-includes.js\").indexOf);\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (hasOwn(O, key = names[i++])) {\n    ~indexOf(result, key) || push(result, key);\n  }\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-keys.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-keys.js ***!\n  \\*******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar internalObjectKeys = __webpack_require__(/*! ../internals/object-keys-internal */ \"./node_modules/core-js/internals/object-keys-internal.js\");\nvar enumBugKeys = __webpack_require__(/*! ../internals/enum-bug-keys */ \"./node_modules/core-js/internals/enum-bug-keys.js\");\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es-x/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n  return internalObjectKeys(O, enumBugKeys);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-property-is-enumerable.js\":\n/*!*************************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-property-is-enumerable.js ***!\n  \\*************************************************************************/\n/***/ ((__unused_webpack_module, exports) => {\n\n\"use strict\";\n\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = getOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-set-prototype-of.js\":\n/*!*******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-set-prototype-of.js ***!\n  \\*******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/* eslint-disable no-proto -- safe */\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar aPossiblePrototype = __webpack_require__(/*! ../internals/a-possible-prototype */ \"./node_modules/core-js/internals/a-possible-prototype.js\");\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es-x/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n  var CORRECT_SETTER = false;\n  var test = {};\n  var setter;\n  try {\n    // eslint-disable-next-line es-x/no-object-getownpropertydescriptor -- safe\n    setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);\n    setter(test, []);\n    CORRECT_SETTER = test instanceof Array;\n  } catch (error) { /* empty */ }\n  return function setPrototypeOf(O, proto) {\n    anObject(O);\n    aPossiblePrototype(proto);\n    if (CORRECT_SETTER) setter(O, proto);\n    else O.__proto__ = proto;\n    return O;\n  };\n}() : undefined);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/object-to-string.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/internals/object-to-string.js ***!\n  \\************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ \"./node_modules/core-js/internals/to-string-tag-support.js\");\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\n\n// `Object.prototype.toString` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n  return '[object ' + classof(this) + ']';\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/ordinary-to-primitive.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/ordinary-to-primitive.js ***!\n  \\*****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n  var fn, val;\n  if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n  if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  throw $TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/own-keys.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/core-js/internals/own-keys.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/path.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/core-js/internals/path.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\nmodule.exports = global;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-exec-abstract.js\":\n/*!****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-exec-abstract.js ***!\n  \\****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar classof = __webpack_require__(/*! ../internals/classof-raw */ \"./node_modules/core-js/internals/classof-raw.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n  var exec = R.exec;\n  if (isCallable(exec)) {\n    var result = call(exec, R, S);\n    if (result !== null) anObject(result);\n    return result;\n  }\n  if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n  throw $TypeError('RegExp#exec called on incompatible receiver');\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-exec.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-exec.js ***!\n  \\*******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar regexpFlags = __webpack_require__(/*! ../internals/regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\nvar stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ \"./node_modules/core-js/internals/regexp-sticky-helpers.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar create = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar getInternalState = (__webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\").get);\nvar UNSUPPORTED_DOT_ALL = __webpack_require__(/*! ../internals/regexp-unsupported-dot-all */ \"./node_modules/core-js/internals/regexp-unsupported-dot-all.js\");\nvar UNSUPPORTED_NCG = __webpack_require__(/*! ../internals/regexp-unsupported-ncg */ \"./node_modules/core-js/internals/regexp-unsupported-ncg.js\");\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/;\n  var re2 = /b*/g;\n  call(nativeExec, re1, 'a');\n  call(nativeExec, re2, 'a');\n  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n  patchedExec = function exec(string) {\n    var re = this;\n    var state = getInternalState(re);\n    var str = toString(string);\n    var raw = state.raw;\n    var result, reCopy, lastIndex, match, i, object, group;\n\n    if (raw) {\n      raw.lastIndex = re.lastIndex;\n      result = call(patchedExec, raw, str);\n      re.lastIndex = raw.lastIndex;\n      return result;\n    }\n\n    var groups = state.groups;\n    var sticky = UNSUPPORTED_Y && re.sticky;\n    var flags = call(regexpFlags, re);\n    var source = re.source;\n    var charsAdded = 0;\n    var strCopy = str;\n\n    if (sticky) {\n      flags = replace(flags, 'y', '');\n      if (indexOf(flags, 'g') === -1) {\n        flags += 'g';\n      }\n\n      strCopy = stringSlice(str, re.lastIndex);\n      // Support anchored sticky behavior.\n      if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n        source = '(?: ' + source + ')';\n        strCopy = ' ' + strCopy;\n        charsAdded++;\n      }\n      // ^(? + rx + ) is needed, in combination with some str slicing, to\n      // simulate the 'y' flag.\n      reCopy = new RegExp('^(?:' + source + ')', flags);\n    }\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n    match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n    if (sticky) {\n      if (match) {\n        match.input = stringSlice(match.input, charsAdded);\n        match[0] = stringSlice(match[0], charsAdded);\n        match.index = re.lastIndex;\n        re.lastIndex += match[0].length;\n      } else re.lastIndex = 0;\n    } else if (UPDATES_LAST_INDEX_WRONG && match) {\n      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      call(nativeReplace, match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    if (match && groups) {\n      match.groups = object = create(null);\n      for (i = 0; i < groups.length; i++) {\n        group = groups[i];\n        object[group[0]] = match[group[1]];\n      }\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-flags.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-flags.js ***!\n  \\********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.hasIndices) result += 'd';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.dotAll) result += 's';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-get-flags.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-get-flags.js ***!\n  \\************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\nvar regExpFlags = __webpack_require__(/*! ../internals/regexp-flags */ \"./node_modules/core-js/internals/regexp-flags.js\");\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (R) {\n  var flags = R.flags;\n  return flags === undefined && !('flags' in RegExpPrototype) && !hasOwn(R, 'flags') && isPrototypeOf(RegExpPrototype, R)\n    ? call(regExpFlags, R) : flags;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-sticky-helpers.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-sticky-helpers.js ***!\n  \\*****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n  var re = $RegExp('a', 'y');\n  re.lastIndex = 2;\n  return re.exec('abcd') != null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n  return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n  var re = $RegExp('^r', 'gy');\n  re.lastIndex = 2;\n  return re.exec('str') != null;\n});\n\nmodule.exports = {\n  BROKEN_CARET: BROKEN_CARET,\n  MISSED_STICKY: MISSED_STICKY,\n  UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-unsupported-dot-all.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-unsupported-dot-all.js ***!\n  \\**********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('.', 's');\n  return !(re.dotAll && re.exec('\\n') && re.flags === 's');\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/regexp-unsupported-ncg.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/regexp-unsupported-ncg.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\n\n// babel-minify and Closure Compiler transpiles RegExp('(?<a>b)', 'g') -> /(?<a>b)/g and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('(?<a>b)', 'g');\n  return re.exec('b').groups.a !== 'b' ||\n    'b'.replace(re, '$<a>c') !== 'bc';\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/require-object-coercible.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/require-object-coercible.js ***!\n  \\********************************************************************/\n/***/ ((module) => {\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (it == undefined) throw $TypeError(\"Can't call method on \" + it);\n  return it;\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/set-to-string-tag.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/set-to-string-tag.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n  if (target && !STATIC) target = target.prototype;\n  if (target && !hasOwn(target, TO_STRING_TAG)) {\n    defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/shared-key.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/core-js/internals/shared-key.js ***!\n  \\******************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n  return keys[key] || (keys[key] = uid(key));\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/shared-store.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/internals/shared-store.js ***!\n  \\********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar defineGlobalProperty = __webpack_require__(/*! ../internals/define-global-property */ \"./node_modules/core-js/internals/define-global-property.js\");\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/shared.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/core-js/internals/shared.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar store = __webpack_require__(/*! ../internals/shared-store */ \"./node_modules/core-js/internals/shared-store.js\");\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: '3.22.8',\n  mode: IS_PURE ? 'pure' : 'global',\n  copyright: '© 2014-2022 Denis Pushkarev (zloirock.ru)',\n  license: 'https://github.com/zloirock/core-js/blob/v3.22.8/LICENSE',\n  source: 'https://github.com/zloirock/core-js'\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/species-constructor.js\":\n/*!***************************************************************!*\\\n  !*** ./node_modules/core-js/internals/species-constructor.js ***!\n  \\***************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar aConstructor = __webpack_require__(/*! ../internals/a-constructor */ \"./node_modules/core-js/internals/a-constructor.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/string-multibyte.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/internals/string-multibyte.js ***!\n  \\************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ \"./node_modules/core-js/internals/to-integer-or-infinity.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n  return function ($this, pos) {\n    var S = toString(requireObjectCoercible($this));\n    var position = toIntegerOrInfinity(pos);\n    var size = S.length;\n    var first, second;\n    if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n    first = charCodeAt(S, position);\n    return first < 0xD800 || first > 0xDBFF || position + 1 === size\n      || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n        ? CONVERT_TO_STRING\n          ? charAt(S, position)\n          : first\n        : CONVERT_TO_STRING\n          ? stringSlice(S, position, position + 2)\n          : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n  };\n};\n\nmodule.exports = {\n  // `String.prototype.codePointAt` method\n  // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n  codeAt: createMethod(false),\n  // `String.prototype.at` method\n  // https://github.com/mathiasbynens/String.prototype.at\n  charAt: createMethod(true)\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/symbol-define-to-primitive.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/symbol-define-to-primitive.js ***!\n  \\**********************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\n\nmodule.exports = function () {\n  var Symbol = getBuiltIn('Symbol');\n  var SymbolPrototype = Symbol && Symbol.prototype;\n  var valueOf = SymbolPrototype && SymbolPrototype.valueOf;\n  var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n  if (SymbolPrototype && !SymbolPrototype[TO_PRIMITIVE]) {\n    // `Symbol.prototype[@@toPrimitive]` method\n    // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive\n    // eslint-disable-next-line no-unused-vars -- required for .length\n    defineBuiltIn(SymbolPrototype, TO_PRIMITIVE, function (hint) {\n      return call(valueOf, this);\n    }, { arity: 1 });\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-absolute-index.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-absolute-index.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ \"./node_modules/core-js/internals/to-integer-or-infinity.js\");\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n  var integer = toIntegerOrInfinity(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-indexed-object.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-indexed-object.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = __webpack_require__(/*! ../internals/indexed-object */ \"./node_modules/core-js/internals/indexed-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-integer-or-infinity.js\":\n/*!******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-integer-or-infinity.js ***!\n  \\******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar trunc = __webpack_require__(/*! ../internals/math-trunc */ \"./node_modules/core-js/internals/math-trunc.js\");\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n  var number = +argument;\n  // eslint-disable-next-line no-self-compare -- NaN check\n  return number !== number || number === 0 ? 0 : trunc(number);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-length.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-length.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ \"./node_modules/core-js/internals/to-integer-or-infinity.js\");\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-object.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-object.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return $Object(requireObjectCoercible(argument));\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-primitive.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-primitive.js ***!\n  \\********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar isSymbol = __webpack_require__(/*! ../internals/is-symbol */ \"./node_modules/core-js/internals/is-symbol.js\");\nvar getMethod = __webpack_require__(/*! ../internals/get-method */ \"./node_modules/core-js/internals/get-method.js\");\nvar ordinaryToPrimitive = __webpack_require__(/*! ../internals/ordinary-to-primitive */ \"./node_modules/core-js/internals/ordinary-to-primitive.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n  if (!isObject(input) || isSymbol(input)) return input;\n  var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n  var result;\n  if (exoticToPrim) {\n    if (pref === undefined) pref = 'default';\n    result = call(exoticToPrim, input, pref);\n    if (!isObject(result) || isSymbol(result)) return result;\n    throw $TypeError(\"Can't convert object to primitive value\");\n  }\n  if (pref === undefined) pref = 'number';\n  return ordinaryToPrimitive(input, pref);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-property-key.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-property-key.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar toPrimitive = __webpack_require__(/*! ../internals/to-primitive */ \"./node_modules/core-js/internals/to-primitive.js\");\nvar isSymbol = __webpack_require__(/*! ../internals/is-symbol */ \"./node_modules/core-js/internals/is-symbol.js\");\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n  var key = toPrimitive(argument, 'string');\n  return isSymbol(key) ? key : key + '';\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-string-tag-support.js\":\n/*!*****************************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-string-tag-support.js ***!\n  \\*****************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/to-string.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/core-js/internals/to-string.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar classof = __webpack_require__(/*! ../internals/classof */ \"./node_modules/core-js/internals/classof.js\");\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n  if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n  return $String(argument);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/try-to-string.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/internals/try-to-string.js ***!\n  \\*********************************************************/\n/***/ ((module) => {\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n  try {\n    return $String(argument);\n  } catch (error) {\n    return 'Object';\n  }\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/uid.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/core-js/internals/uid.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n  return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/use-symbol-as-uid.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/use-symbol-as-uid.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/* eslint-disable es-x/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\n\nmodule.exports = NATIVE_SYMBOL\n  && !Symbol.sham\n  && typeof Symbol.iterator == 'symbol';\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/v8-prototype-define-bug.js\":\n/*!*******************************************************************!*\\\n  !*** ./node_modules/core-js/internals/v8-prototype-define-bug.js ***!\n  \\*******************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n  // eslint-disable-next-line es-x/no-object-defineproperty -- required for testing\n  return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n    value: 42,\n    writable: false\n  }).prototype != 42;\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/well-known-symbol-wrapped.js\":\n/*!*********************************************************************!*\\\n  !*** ./node_modules/core-js/internals/well-known-symbol-wrapped.js ***!\n  \\*********************************************************************/\n/***/ ((__unused_webpack_module, exports, __webpack_require__) => {\n\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nexports.f = wellKnownSymbol;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/internals/well-known-symbol.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/internals/well-known-symbol.js ***!\n  \\*************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\nvar USE_SYMBOL_AS_UID = __webpack_require__(/*! ../internals/use-symbol-as-uid */ \"./node_modules/core-js/internals/use-symbol-as-uid.js\");\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar symbolFor = Symbol && Symbol['for'];\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n  if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n    var description = 'Symbol.' + name;\n    if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {\n      WellKnownSymbolsStore[name] = Symbol[name];\n    } else if (USE_SYMBOL_AS_UID && symbolFor) {\n      WellKnownSymbolsStore[name] = symbolFor(description);\n    } else {\n      WellKnownSymbolsStore[name] = createWellKnownSymbol(description);\n    }\n  } return WellKnownSymbolsStore[name];\n};\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.concat.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.concat.js ***!\n  \\*********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isArray = __webpack_require__(/*! ../internals/is-array */ \"./node_modules/core-js/internals/is-array.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ \"./node_modules/core-js/internals/length-of-array-like.js\");\nvar doesNotExceedSafeInteger = __webpack_require__(/*! ../internals/does-not-exceed-safe-integer */ \"./node_modules/core-js/internals/does-not-exceed-safe-integer.js\");\nvar createProperty = __webpack_require__(/*! ../internals/create-property */ \"./node_modules/core-js/internals/create-property.js\");\nvar arraySpeciesCreate = __webpack_require__(/*! ../internals/array-species-create */ \"./node_modules/core-js/internals/array-species-create.js\");\nvar arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ \"./node_modules/core-js/internals/array-method-has-species-support.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar V8_VERSION = __webpack_require__(/*! ../internals/engine-v8-version */ \"./node_modules/core-js/internals/engine-v8-version.js\");\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n  var array = [];\n  array[IS_CONCAT_SPREADABLE] = false;\n  return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n  if (!isObject(O)) return false;\n  var spreadable = O[IS_CONCAT_SPREADABLE];\n  return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.es/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, arity: 1, forced: FORCED }, {\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  concat: function concat(arg) {\n    var O = toObject(this);\n    var A = arraySpeciesCreate(O, 0);\n    var n = 0;\n    var i, k, length, len, E;\n    for (i = -1, length = arguments.length; i < length; i++) {\n      E = i === -1 ? O : arguments[i];\n      if (isConcatSpreadable(E)) {\n        len = lengthOfArrayLike(E);\n        doesNotExceedSafeInteger(n + len);\n        for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n      } else {\n        doesNotExceedSafeInteger(n + 1);\n        createProperty(A, n++, E);\n      }\n    }\n    A.length = n;\n    return A;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.find.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.find.js ***!\n  \\*******************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar $find = (__webpack_require__(/*! ../internals/array-iteration */ \"./node_modules/core-js/internals/array-iteration.js\").find);\nvar addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ \"./node_modules/core-js/internals/add-to-unscopables.js\");\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.es/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n  find: function find(callbackfn /* , that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.for-each.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.for-each.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar forEach = __webpack_require__(/*! ../internals/array-for-each */ \"./node_modules/core-js/internals/array-for-each.js\");\n\n// `Array.prototype.forEach` method\n// https://tc39.es/ecma262/#sec-array.prototype.foreach\n// eslint-disable-next-line es-x/no-array-prototype-foreach -- safe\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n  forEach: forEach\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.includes.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.includes.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar $includes = (__webpack_require__(/*! ../internals/array-includes */ \"./node_modules/core-js/internals/array-includes.js\").includes);\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ \"./node_modules/core-js/internals/add-to-unscopables.js\");\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n  return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.iterator.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.iterator.js ***!\n  \\***********************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar addToUnscopables = __webpack_require__(/*! ../internals/add-to-unscopables */ \"./node_modules/core-js/internals/add-to-unscopables.js\");\nvar Iterators = __webpack_require__(/*! ../internals/iterators */ \"./node_modules/core-js/internals/iterators.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n  setInternalState(this, {\n    type: ARRAY_ITERATOR,\n    target: toIndexedObject(iterated), // target\n    index: 0,                          // next index\n    kind: kind                         // kind\n  });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n  var state = getInternalState(this);\n  var target = state.target;\n  var kind = state.kind;\n  var index = state.index++;\n  if (!target || index >= target.length) {\n    state.target = undefined;\n    return { value: undefined, done: true };\n  }\n  if (kind == 'keys') return { value: index, done: false };\n  if (kind == 'values') return { value: target[index], done: false };\n  return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n  defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.array.slice.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.array.slice.js ***!\n  \\********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar isArray = __webpack_require__(/*! ../internals/is-array */ \"./node_modules/core-js/internals/is-array.js\");\nvar isConstructor = __webpack_require__(/*! ../internals/is-constructor */ \"./node_modules/core-js/internals/is-constructor.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar toAbsoluteIndex = __webpack_require__(/*! ../internals/to-absolute-index */ \"./node_modules/core-js/internals/to-absolute-index.js\");\nvar lengthOfArrayLike = __webpack_require__(/*! ../internals/length-of-array-like */ \"./node_modules/core-js/internals/length-of-array-like.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar createProperty = __webpack_require__(/*! ../internals/create-property */ \"./node_modules/core-js/internals/create-property.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar arrayMethodHasSpeciesSupport = __webpack_require__(/*! ../internals/array-method-has-species-support */ \"./node_modules/core-js/internals/array-method-has-species-support.js\");\nvar un$Slice = __webpack_require__(/*! ../internals/array-slice */ \"./node_modules/core-js/internals/array-slice.js\");\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n\nvar SPECIES = wellKnownSymbol('species');\nvar $Array = Array;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.es/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n  slice: function slice(start, end) {\n    var O = toIndexedObject(this);\n    var length = lengthOfArrayLike(O);\n    var k = toAbsoluteIndex(start, length);\n    var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n    // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n    var Constructor, result, n;\n    if (isArray(O)) {\n      Constructor = O.constructor;\n      // cross-realm fallback\n      if (isConstructor(Constructor) && (Constructor === $Array || isArray(Constructor.prototype))) {\n        Constructor = undefined;\n      } else if (isObject(Constructor)) {\n        Constructor = Constructor[SPECIES];\n        if (Constructor === null) Constructor = undefined;\n      }\n      if (Constructor === $Array || Constructor === undefined) {\n        return un$Slice(O, k, fin);\n      }\n    }\n    result = new (Constructor === undefined ? $Array : Constructor)(max(fin - k, 0));\n    for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n    result.length = n;\n    return result;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.date.to-string.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.date.to-string.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n// TODO: Remove from `core-js@4`\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\n\nvar DatePrototype = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar un$DateToString = uncurryThis(DatePrototype[TO_STRING]);\nvar getTime = uncurryThis(DatePrototype.getTime);\n\n// `Date.prototype.toString` method\n// https://tc39.es/ecma262/#sec-date.prototype.tostring\nif (String(new Date(NaN)) != INVALID_DATE) {\n  defineBuiltIn(DatePrototype, TO_STRING, function toString() {\n    var value = getTime(this);\n    // eslint-disable-next-line no-self-compare -- NaN check\n    return value === value ? un$DateToString(this) : INVALID_DATE;\n  });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.function.name.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.function.name.js ***!\n  \\**********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar FUNCTION_NAME_EXISTS = (__webpack_require__(/*! ../internals/function-name */ \"./node_modules/core-js/internals/function-name.js\").EXISTS);\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\n\nvar FunctionPrototype = Function.prototype;\nvar functionToString = uncurryThis(FunctionPrototype.toString);\nvar nameRE = /function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/;\nvar regExpExec = uncurryThis(nameRE.exec);\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.es/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !FUNCTION_NAME_EXISTS) {\n  defineProperty(FunctionPrototype, NAME, {\n    configurable: true,\n    get: function () {\n      try {\n        return regExpExec(nameRE, functionToString(this))[1];\n      } catch (error) {\n        return '';\n      }\n    }\n  });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.json.stringify.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.json.stringify.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar apply = __webpack_require__(/*! ../internals/function-apply */ \"./node_modules/core-js/internals/function-apply.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isArray = __webpack_require__(/*! ../internals/is-array */ \"./node_modules/core-js/internals/is-array.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar isSymbol = __webpack_require__(/*! ../internals/is-symbol */ \"./node_modules/core-js/internals/is-symbol.js\");\nvar arraySlice = __webpack_require__(/*! ../internals/array-slice */ \"./node_modules/core-js/internals/array-slice.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\n\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar exec = uncurryThis(/./.exec);\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar replace = uncurryThis(''.replace);\nvar numberToString = uncurryThis(1.0.toString);\n\nvar tester = /[\\uD800-\\uDFFF]/g;\nvar low = /^[\\uD800-\\uDBFF]$/;\nvar hi = /^[\\uDC00-\\uDFFF]$/;\n\nvar WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () {\n  var symbol = getBuiltIn('Symbol')();\n  // MS Edge converts symbol values to JSON as {}\n  return $stringify([symbol]) != '[null]'\n    // WebKit converts symbol values to JSON as null\n    || $stringify({ a: symbol }) != '{}'\n    // V8 throws on boxed symbols\n    || $stringify(Object(symbol)) != '{}';\n});\n\n// https://github.com/tc39/proposal-well-formed-stringify\nvar ILL_FORMED_UNICODE = fails(function () {\n  return $stringify('\\uDF06\\uD834') !== '\"\\\\udf06\\\\ud834\"'\n    || $stringify('\\uDEAD') !== '\"\\\\udead\"';\n});\n\nvar stringifyWithSymbolsFix = function (it, replacer) {\n  var args = arraySlice(arguments);\n  var $replacer = replacer;\n  if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n  if (!isArray(replacer)) replacer = function (key, value) {\n    if (isCallable($replacer)) value = call($replacer, this, key, value);\n    if (!isSymbol(value)) return value;\n  };\n  args[1] = replacer;\n  return apply($stringify, null, args);\n};\n\nvar fixIllFormed = function (match, offset, string) {\n  var prev = charAt(string, offset - 1);\n  var next = charAt(string, offset + 1);\n  if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) {\n    return '\\\\u' + numberToString(charCodeAt(match, 0), 16);\n  } return match;\n};\n\nif ($stringify) {\n  // `JSON.stringify` method\n  // https://tc39.es/ecma262/#sec-json.stringify\n  $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, {\n    // eslint-disable-next-line no-unused-vars -- required for `.length`\n    stringify: function stringify(it, replacer, space) {\n      var args = arraySlice(arguments);\n      var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args);\n      return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result;\n    }\n  });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.object.assign.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.object.assign.js ***!\n  \\**********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar assign = __webpack_require__(/*! ../internals/object-assign */ \"./node_modules/core-js/internals/object-assign.js\");\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es-x/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, arity: 2, forced: Object.assign !== assign }, {\n  assign: assign\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.object.freeze.js\":\n/*!**********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.object.freeze.js ***!\n  \\**********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar FREEZING = __webpack_require__(/*! ../internals/freezing */ \"./node_modules/core-js/internals/freezing.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar isObject = __webpack_require__(/*! ../internals/is-object */ \"./node_modules/core-js/internals/is-object.js\");\nvar onFreeze = (__webpack_require__(/*! ../internals/internal-metadata */ \"./node_modules/core-js/internals/internal-metadata.js\").onFreeze);\n\n// eslint-disable-next-line es-x/no-object-freeze -- safe\nvar $freeze = Object.freeze;\nvar FAILS_ON_PRIMITIVES = fails(function () { $freeze(1); });\n\n// `Object.freeze` method\n// https://tc39.es/ecma262/#sec-object.freeze\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !FREEZING }, {\n  freeze: function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(onFreeze(it)) : it;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.object.get-own-property-symbols.js\":\n/*!****************************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.object.get-own-property-symbols.js ***!\n  \\****************************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\n\n// V8 ~ Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FORCED = !NATIVE_SYMBOL || fails(function () { getOwnPropertySymbolsModule.f(1); });\n\n// `Object.getOwnPropertySymbols` method\n// https://tc39.es/ecma262/#sec-object.getownpropertysymbols\n$({ target: 'Object', stat: true, forced: FORCED }, {\n  getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n    var $getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n    return $getOwnPropertySymbols ? $getOwnPropertySymbols(toObject(it)) : [];\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.object.keys.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.object.keys.js ***!\n  \\********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar toObject = __webpack_require__(/*! ../internals/to-object */ \"./node_modules/core-js/internals/to-object.js\");\nvar nativeKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n  keys: function keys(it) {\n    return nativeKeys(toObject(it));\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.object.to-string.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.object.to-string.js ***!\n  \\*************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar TO_STRING_TAG_SUPPORT = __webpack_require__(/*! ../internals/to-string-tag-support */ \"./node_modules/core-js/internals/to-string-tag-support.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar toString = __webpack_require__(/*! ../internals/object-to-string */ \"./node_modules/core-js/internals/object-to-string.js\");\n\n// `Object.prototype.toString` method\n// https://tc39.es/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n  defineBuiltIn(Object.prototype, 'toString', toString, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.regexp.exec.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.regexp.exec.js ***!\n  \\********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar exec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n  exec: exec\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.regexp.to-string.js\":\n/*!*************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.regexp.to-string.js ***!\n  \\*************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar PROPER_FUNCTION_NAME = (__webpack_require__(/*! ../internals/function-name */ \"./node_modules/core-js/internals/function-name.js\").PROPER);\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar $toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar getRegExpFlags = __webpack_require__(/*! ../internals/regexp-get-flags */ \"./node_modules/core-js/internals/regexp-get-flags.js\");\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar n$ToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = PROPER_FUNCTION_NAME && n$ToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n  defineBuiltIn(RegExp.prototype, TO_STRING, function toString() {\n    var R = anObject(this);\n    var pattern = $toString(R.source);\n    var flags = $toString(getRegExpFlags(R));\n    return '/' + pattern + '/' + flags;\n  }, { unsafe: true });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.string.iterator.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.string.iterator.js ***!\n  \\************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar charAt = (__webpack_require__(/*! ../internals/string-multibyte */ \"./node_modules/core-js/internals/string-multibyte.js\").charAt);\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar defineIterator = __webpack_require__(/*! ../internals/define-iterator */ \"./node_modules/core-js/internals/define-iterator.js\");\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n  setInternalState(this, {\n    type: STRING_ITERATOR,\n    string: toString(iterated),\n    index: 0\n  });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n  var state = getInternalState(this);\n  var string = state.string;\n  var index = state.index;\n  var point;\n  if (index >= string.length) return { value: undefined, done: true };\n  point = charAt(string, index);\n  state.index += point.length;\n  return { value: point, done: false };\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.string.replace.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.string.replace.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar apply = __webpack_require__(/*! ../internals/function-apply */ \"./node_modules/core-js/internals/function-apply.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar toIntegerOrInfinity = __webpack_require__(/*! ../internals/to-integer-or-infinity */ \"./node_modules/core-js/internals/to-integer-or-infinity.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar getMethod = __webpack_require__(/*! ../internals/get-method */ \"./node_modules/core-js/internals/get-method.js\");\nvar getSubstitution = __webpack_require__(/*! ../internals/get-substitution */ \"./node_modules/core-js/internals/get-substitution.js\");\nvar regExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n  return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n  // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n  return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n  if (/./[REPLACE]) {\n    return /./[REPLACE]('a', '$0') === '';\n  }\n  return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n  var re = /./;\n  re.exec = function () {\n    var result = [];\n    result.groups = { a: '7' };\n    return result;\n  };\n  // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n  return ''.replace(re, '$<a>') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n  var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n  return [\n    // `String.prototype.replace` method\n    // https://tc39.es/ecma262/#sec-string.prototype.replace\n    function replace(searchValue, replaceValue) {\n      var O = requireObjectCoercible(this);\n      var replacer = searchValue == undefined ? undefined : getMethod(searchValue, REPLACE);\n      return replacer\n        ? call(replacer, searchValue, O, replaceValue)\n        : call(nativeReplace, toString(O), searchValue, replaceValue);\n    },\n    // `RegExp.prototype[@@replace]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n    function (string, replaceValue) {\n      var rx = anObject(this);\n      var S = toString(string);\n\n      if (\n        typeof replaceValue == 'string' &&\n        stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n        stringIndexOf(replaceValue, '$<') === -1\n      ) {\n        var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n        if (res.done) return res.value;\n      }\n\n      var functionalReplace = isCallable(replaceValue);\n      if (!functionalReplace) replaceValue = toString(replaceValue);\n\n      var global = rx.global;\n      if (global) {\n        var fullUnicode = rx.unicode;\n        rx.lastIndex = 0;\n      }\n      var results = [];\n      while (true) {\n        var result = regExpExec(rx, S);\n        if (result === null) break;\n\n        push(results, result);\n        if (!global) break;\n\n        var matchStr = toString(result[0]);\n        if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n      }\n\n      var accumulatedResult = '';\n      var nextSourcePosition = 0;\n      for (var i = 0; i < results.length; i++) {\n        result = results[i];\n\n        var matched = toString(result[0]);\n        var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n        var captures = [];\n        // NOTE: This is equivalent to\n        //   captures = result.slice(1).map(maybeToString)\n        // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n        // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n        // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n        for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n        var namedCaptures = result.groups;\n        if (functionalReplace) {\n          var replacerArgs = concat([matched], captures, position, S);\n          if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n          var replacement = toString(apply(replaceValue, undefined, replacerArgs));\n        } else {\n          replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n        }\n        if (position >= nextSourcePosition) {\n          accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n          nextSourcePosition = position + matched.length;\n        }\n      }\n      return accumulatedResult + stringSlice(S, nextSourcePosition);\n    }\n  ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.string.split.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.string.split.js ***!\n  \\*********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar apply = __webpack_require__(/*! ../internals/function-apply */ \"./node_modules/core-js/internals/function-apply.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar fixRegExpWellKnownSymbolLogic = __webpack_require__(/*! ../internals/fix-regexp-well-known-symbol-logic */ \"./node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js\");\nvar isRegExp = __webpack_require__(/*! ../internals/is-regexp */ \"./node_modules/core-js/internals/is-regexp.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar requireObjectCoercible = __webpack_require__(/*! ../internals/require-object-coercible */ \"./node_modules/core-js/internals/require-object-coercible.js\");\nvar speciesConstructor = __webpack_require__(/*! ../internals/species-constructor */ \"./node_modules/core-js/internals/species-constructor.js\");\nvar advanceStringIndex = __webpack_require__(/*! ../internals/advance-string-index */ \"./node_modules/core-js/internals/advance-string-index.js\");\nvar toLength = __webpack_require__(/*! ../internals/to-length */ \"./node_modules/core-js/internals/to-length.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar getMethod = __webpack_require__(/*! ../internals/get-method */ \"./node_modules/core-js/internals/get-method.js\");\nvar arraySlice = __webpack_require__(/*! ../internals/array-slice-simple */ \"./node_modules/core-js/internals/array-slice-simple.js\");\nvar callRegExpExec = __webpack_require__(/*! ../internals/regexp-exec-abstract */ \"./node_modules/core-js/internals/regexp-exec-abstract.js\");\nvar regexpExec = __webpack_require__(/*! ../internals/regexp-exec */ \"./node_modules/core-js/internals/regexp-exec.js\");\nvar stickyHelpers = __webpack_require__(/*! ../internals/regexp-sticky-helpers */ \"./node_modules/core-js/internals/regexp-sticky-helpers.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\nvar MAX_UINT32 = 0xFFFFFFFF;\nvar min = Math.min;\nvar $push = [].push;\nvar exec = uncurryThis(/./.exec);\nvar push = uncurryThis($push);\nvar stringSlice = uncurryThis(''.slice);\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n  // eslint-disable-next-line regexp/no-empty-group -- required for testing\n  var re = /(?:)/;\n  var originalExec = re.exec;\n  re.exec = function () { return originalExec.apply(this, arguments); };\n  var result = 'ab'.split(re);\n  return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\n  var internalSplit;\n  if (\n    'abbc'.split(/(b)*/)[1] == 'c' ||\n    // eslint-disable-next-line regexp/no-empty-group -- required for testing\n    'test'.split(/(?:)/, -1).length != 4 ||\n    'ab'.split(/(?:ab)*/).length != 2 ||\n    '.'.split(/(.?)(.?)/).length != 4 ||\n    // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing\n    '.'.split(/()()/).length > 1 ||\n    ''.split(/.?/).length\n  ) {\n    // based on es5-shim implementation, need to rework it\n    internalSplit = function (separator, limit) {\n      var string = toString(requireObjectCoercible(this));\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (separator === undefined) return [string];\n      // If `separator` is not a regex, use native split\n      if (!isRegExp(separator)) {\n        return call(nativeSplit, string, separator, lim);\n      }\n      var output = [];\n      var flags = (separator.ignoreCase ? 'i' : '') +\n                  (separator.multiline ? 'm' : '') +\n                  (separator.unicode ? 'u' : '') +\n                  (separator.sticky ? 'y' : '');\n      var lastLastIndex = 0;\n      // Make `global` and avoid `lastIndex` issues by working with a copy\n      var separatorCopy = new RegExp(separator.source, flags + 'g');\n      var match, lastIndex, lastLength;\n      while (match = call(regexpExec, separatorCopy, string)) {\n        lastIndex = separatorCopy.lastIndex;\n        if (lastIndex > lastLastIndex) {\n          push(output, stringSlice(string, lastLastIndex, match.index));\n          if (match.length > 1 && match.index < string.length) apply($push, output, arraySlice(match, 1));\n          lastLength = match[0].length;\n          lastLastIndex = lastIndex;\n          if (output.length >= lim) break;\n        }\n        if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n      }\n      if (lastLastIndex === string.length) {\n        if (lastLength || !exec(separatorCopy, '')) push(output, '');\n      } else push(output, stringSlice(string, lastLastIndex));\n      return output.length > lim ? arraySlice(output, 0, lim) : output;\n    };\n  // Chakra, V8\n  } else if ('0'.split(undefined, 0).length) {\n    internalSplit = function (separator, limit) {\n      return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);\n    };\n  } else internalSplit = nativeSplit;\n\n  return [\n    // `String.prototype.split` method\n    // https://tc39.es/ecma262/#sec-string.prototype.split\n    function split(separator, limit) {\n      var O = requireObjectCoercible(this);\n      var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT);\n      return splitter\n        ? call(splitter, separator, O, limit)\n        : call(internalSplit, toString(O), separator, limit);\n    },\n    // `RegExp.prototype[@@split]` method\n    // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n    //\n    // NOTE: This cannot be properly polyfilled in engines that don't support\n    // the 'y' flag.\n    function (string, limit) {\n      var rx = anObject(this);\n      var S = toString(string);\n      var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\n\n      if (res.done) return res.value;\n\n      var C = speciesConstructor(rx, RegExp);\n\n      var unicodeMatching = rx.unicode;\n      var flags = (rx.ignoreCase ? 'i' : '') +\n                  (rx.multiline ? 'm' : '') +\n                  (rx.unicode ? 'u' : '') +\n                  (UNSUPPORTED_Y ? 'g' : 'y');\n\n      // ^(? + rx + ) is needed, in combination with some S slicing, to\n      // simulate the 'y' flag.\n      var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\n      var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n      if (lim === 0) return [];\n      if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n      var p = 0;\n      var q = 0;\n      var A = [];\n      while (q < S.length) {\n        splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\n        var z = callRegExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);\n        var e;\n        if (\n          z === null ||\n          (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\n        ) {\n          q = advanceStringIndex(S, q, unicodeMatching);\n        } else {\n          push(A, stringSlice(S, p, q));\n          if (A.length === lim) return A;\n          for (var i = 1; i <= z.length - 1; i++) {\n            push(A, z[i]);\n            if (A.length === lim) return A;\n          }\n          q = p = e;\n        }\n      }\n      push(A, stringSlice(S, p));\n      return A;\n    }\n  ];\n}, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.constructor.js\":\n/*!***************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.constructor.js ***!\n  \\***************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar call = __webpack_require__(/*! ../internals/function-call */ \"./node_modules/core-js/internals/function-call.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar IS_PURE = __webpack_require__(/*! ../internals/is-pure */ \"./node_modules/core-js/internals/is-pure.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar NATIVE_SYMBOL = __webpack_require__(/*! ../internals/native-symbol */ \"./node_modules/core-js/internals/native-symbol.js\");\nvar fails = __webpack_require__(/*! ../internals/fails */ \"./node_modules/core-js/internals/fails.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\nvar anObject = __webpack_require__(/*! ../internals/an-object */ \"./node_modules/core-js/internals/an-object.js\");\nvar toIndexedObject = __webpack_require__(/*! ../internals/to-indexed-object */ \"./node_modules/core-js/internals/to-indexed-object.js\");\nvar toPropertyKey = __webpack_require__(/*! ../internals/to-property-key */ \"./node_modules/core-js/internals/to-property-key.js\");\nvar $toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar createPropertyDescriptor = __webpack_require__(/*! ../internals/create-property-descriptor */ \"./node_modules/core-js/internals/create-property-descriptor.js\");\nvar nativeObjectCreate = __webpack_require__(/*! ../internals/object-create */ \"./node_modules/core-js/internals/object-create.js\");\nvar objectKeys = __webpack_require__(/*! ../internals/object-keys */ \"./node_modules/core-js/internals/object-keys.js\");\nvar getOwnPropertyNamesModule = __webpack_require__(/*! ../internals/object-get-own-property-names */ \"./node_modules/core-js/internals/object-get-own-property-names.js\");\nvar getOwnPropertyNamesExternal = __webpack_require__(/*! ../internals/object-get-own-property-names-external */ \"./node_modules/core-js/internals/object-get-own-property-names-external.js\");\nvar getOwnPropertySymbolsModule = __webpack_require__(/*! ../internals/object-get-own-property-symbols */ \"./node_modules/core-js/internals/object-get-own-property-symbols.js\");\nvar getOwnPropertyDescriptorModule = __webpack_require__(/*! ../internals/object-get-own-property-descriptor */ \"./node_modules/core-js/internals/object-get-own-property-descriptor.js\");\nvar definePropertyModule = __webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\");\nvar definePropertiesModule = __webpack_require__(/*! ../internals/object-define-properties */ \"./node_modules/core-js/internals/object-define-properties.js\");\nvar propertyIsEnumerableModule = __webpack_require__(/*! ../internals/object-property-is-enumerable */ \"./node_modules/core-js/internals/object-property-is-enumerable.js\");\nvar defineBuiltIn = __webpack_require__(/*! ../internals/define-built-in */ \"./node_modules/core-js/internals/define-built-in.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar sharedKey = __webpack_require__(/*! ../internals/shared-key */ \"./node_modules/core-js/internals/shared-key.js\");\nvar hiddenKeys = __webpack_require__(/*! ../internals/hidden-keys */ \"./node_modules/core-js/internals/hidden-keys.js\");\nvar uid = __webpack_require__(/*! ../internals/uid */ \"./node_modules/core-js/internals/uid.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\nvar wrappedWellKnownSymbolModule = __webpack_require__(/*! ../internals/well-known-symbol-wrapped */ \"./node_modules/core-js/internals/well-known-symbol-wrapped.js\");\nvar defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ \"./node_modules/core-js/internals/define-well-known-symbol.js\");\nvar defineSymbolToPrimitive = __webpack_require__(/*! ../internals/symbol-define-to-primitive */ \"./node_modules/core-js/internals/symbol-define-to-primitive.js\");\nvar setToStringTag = __webpack_require__(/*! ../internals/set-to-string-tag */ \"./node_modules/core-js/internals/set-to-string-tag.js\");\nvar InternalStateModule = __webpack_require__(/*! ../internals/internal-state */ \"./node_modules/core-js/internals/internal-state.js\");\nvar $forEach = (__webpack_require__(/*! ../internals/array-iteration */ \"./node_modules/core-js/internals/array-iteration.js\").forEach);\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\n\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar SymbolPrototype = $Symbol && $Symbol[PROTOTYPE];\nvar TypeError = global.TypeError;\nvar QObject = global.QObject;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar push = uncurryThis([].push);\n\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar WellKnownSymbolsStore = shared('wks');\n\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n  return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n    get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (O, P, Attributes) {\n  var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n  if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n  nativeDefineProperty(O, P, Attributes);\n  if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n    nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n  }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n  var symbol = AllSymbols[tag] = nativeObjectCreate(SymbolPrototype);\n  setInternalState(symbol, {\n    type: SYMBOL,\n    tag: tag,\n    description: description\n  });\n  if (!DESCRIPTORS) symbol.description = description;\n  return symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n  if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n  anObject(O);\n  var key = toPropertyKey(P);\n  anObject(Attributes);\n  if (hasOwn(AllSymbols, key)) {\n    if (!Attributes.enumerable) {\n      if (!hasOwn(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n      O[HIDDEN][key] = true;\n    } else {\n      if (hasOwn(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n      Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n    } return setSymbolDescriptor(O, key, Attributes);\n  } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n  anObject(O);\n  var properties = toIndexedObject(Properties);\n  var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n  $forEach(keys, function (key) {\n    if (!DESCRIPTORS || call($propertyIsEnumerable, properties, key)) $defineProperty(O, key, properties[key]);\n  });\n  return O;\n};\n\nvar $create = function create(O, Properties) {\n  return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n  var P = toPropertyKey(V);\n  var enumerable = call(nativePropertyIsEnumerable, this, P);\n  if (this === ObjectPrototype && hasOwn(AllSymbols, P) && !hasOwn(ObjectPrototypeSymbols, P)) return false;\n  return enumerable || !hasOwn(this, P) || !hasOwn(AllSymbols, P) || hasOwn(this, HIDDEN) && this[HIDDEN][P]\n    ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n  var it = toIndexedObject(O);\n  var key = toPropertyKey(P);\n  if (it === ObjectPrototype && hasOwn(AllSymbols, key) && !hasOwn(ObjectPrototypeSymbols, key)) return;\n  var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n  if (descriptor && hasOwn(AllSymbols, key) && !(hasOwn(it, HIDDEN) && it[HIDDEN][key])) {\n    descriptor.enumerable = true;\n  }\n  return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n  var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n  var result = [];\n  $forEach(names, function (key) {\n    if (!hasOwn(AllSymbols, key) && !hasOwn(hiddenKeys, key)) push(result, key);\n  });\n  return result;\n};\n\nvar $getOwnPropertySymbols = function (O) {\n  var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n  var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n  var result = [];\n  $forEach(names, function (key) {\n    if (hasOwn(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || hasOwn(ObjectPrototype, key))) {\n      push(result, AllSymbols[key]);\n    }\n  });\n  return result;\n};\n\n// `Symbol` constructor\n// https://tc39.es/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n  $Symbol = function Symbol() {\n    if (isPrototypeOf(SymbolPrototype, this)) throw TypeError('Symbol is not a constructor');\n    var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]);\n    var tag = uid(description);\n    var setter = function (value) {\n      if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value);\n      if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n    };\n    if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n    return wrap(tag, description);\n  };\n\n  SymbolPrototype = $Symbol[PROTOTYPE];\n\n  defineBuiltIn(SymbolPrototype, 'toString', function toString() {\n    return getInternalState(this).tag;\n  });\n\n  defineBuiltIn($Symbol, 'withoutSetter', function (description) {\n    return wrap(uid(description), description);\n  });\n\n  propertyIsEnumerableModule.f = $propertyIsEnumerable;\n  definePropertyModule.f = $defineProperty;\n  definePropertiesModule.f = $defineProperties;\n  getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n  getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n  getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n  wrappedWellKnownSymbolModule.f = function (name) {\n    return wrap(wellKnownSymbol(name), name);\n  };\n\n  if (DESCRIPTORS) {\n    // https://github.com/tc39/proposal-Symbol-description\n    nativeDefineProperty(SymbolPrototype, 'description', {\n      configurable: true,\n      get: function description() {\n        return getInternalState(this).description;\n      }\n    });\n    if (!IS_PURE) {\n      defineBuiltIn(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n    }\n  }\n}\n\n$({ global: true, constructor: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n  Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n  defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n  useSetter: function () { USE_SETTER = true; },\n  useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n  // `Object.create` method\n  // https://tc39.es/ecma262/#sec-object.create\n  create: $create,\n  // `Object.defineProperty` method\n  // https://tc39.es/ecma262/#sec-object.defineproperty\n  defineProperty: $defineProperty,\n  // `Object.defineProperties` method\n  // https://tc39.es/ecma262/#sec-object.defineproperties\n  defineProperties: $defineProperties,\n  // `Object.getOwnPropertyDescriptor` method\n  // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n  // `Object.getOwnPropertyNames` method\n  // https://tc39.es/ecma262/#sec-object.getownpropertynames\n  getOwnPropertyNames: $getOwnPropertyNames\n});\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive\ndefineSymbolToPrimitive();\n\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.description.js\":\n/*!***************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.description.js ***!\n  \\***************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n// `Symbol.prototype.description` getter\n// https://tc39.es/ecma262/#sec-symbol.prototype.description\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar DESCRIPTORS = __webpack_require__(/*! ../internals/descriptors */ \"./node_modules/core-js/internals/descriptors.js\");\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar uncurryThis = __webpack_require__(/*! ../internals/function-uncurry-this */ \"./node_modules/core-js/internals/function-uncurry-this.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar isCallable = __webpack_require__(/*! ../internals/is-callable */ \"./node_modules/core-js/internals/is-callable.js\");\nvar isPrototypeOf = __webpack_require__(/*! ../internals/object-is-prototype-of */ \"./node_modules/core-js/internals/object-is-prototype-of.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar defineProperty = (__webpack_require__(/*! ../internals/object-define-property */ \"./node_modules/core-js/internals/object-define-property.js\").f);\nvar copyConstructorProperties = __webpack_require__(/*! ../internals/copy-constructor-properties */ \"./node_modules/core-js/internals/copy-constructor-properties.js\");\n\nvar NativeSymbol = global.Symbol;\nvar SymbolPrototype = NativeSymbol && NativeSymbol.prototype;\n\nif (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) ||\n  // Safari 12 bug\n  NativeSymbol().description !== undefined\n)) {\n  var EmptyStringDescriptionStore = {};\n  // wrap Symbol constructor for correct work with undefined description\n  var SymbolWrapper = function Symbol() {\n    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]);\n    var result = isPrototypeOf(SymbolPrototype, this)\n      ? new NativeSymbol(description)\n      // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n      : description === undefined ? NativeSymbol() : NativeSymbol(description);\n    if (description === '') EmptyStringDescriptionStore[result] = true;\n    return result;\n  };\n\n  copyConstructorProperties(SymbolWrapper, NativeSymbol);\n  SymbolWrapper.prototype = SymbolPrototype;\n  SymbolPrototype.constructor = SymbolWrapper;\n\n  var NATIVE_SYMBOL = String(NativeSymbol('test')) == 'Symbol(test)';\n  var symbolToString = uncurryThis(SymbolPrototype.toString);\n  var symbolValueOf = uncurryThis(SymbolPrototype.valueOf);\n  var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n  var replace = uncurryThis(''.replace);\n  var stringSlice = uncurryThis(''.slice);\n\n  defineProperty(SymbolPrototype, 'description', {\n    configurable: true,\n    get: function description() {\n      var symbol = symbolValueOf(this);\n      var string = symbolToString(symbol);\n      if (hasOwn(EmptyStringDescriptionStore, symbol)) return '';\n      var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1');\n      return desc === '' ? undefined : desc;\n    }\n  });\n\n  $({ global: true, constructor: true, forced: true }, {\n    Symbol: SymbolWrapper\n  });\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.for.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.for.js ***!\n  \\*******************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar getBuiltIn = __webpack_require__(/*! ../internals/get-built-in */ \"./node_modules/core-js/internals/get-built-in.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar toString = __webpack_require__(/*! ../internals/to-string */ \"./node_modules/core-js/internals/to-string.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/native-symbol-registry */ \"./node_modules/core-js/internals/native-symbol-registry.js\");\n\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\n// `Symbol.for` method\n// https://tc39.es/ecma262/#sec-symbol.for\n$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {\n  'for': function (key) {\n    var string = toString(key);\n    if (hasOwn(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n    var symbol = getBuiltIn('Symbol')(string);\n    StringToSymbolRegistry[string] = symbol;\n    SymbolToStringRegistry[symbol] = string;\n    return symbol;\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.iterator.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.iterator.js ***!\n  \\************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar defineWellKnownSymbol = __webpack_require__(/*! ../internals/define-well-known-symbol */ \"./node_modules/core-js/internals/define-well-known-symbol.js\");\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.es/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.js ***!\n  \\***************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\n__webpack_require__(/*! ../modules/es.symbol.constructor */ \"./node_modules/core-js/modules/es.symbol.constructor.js\");\n__webpack_require__(/*! ../modules/es.symbol.for */ \"./node_modules/core-js/modules/es.symbol.for.js\");\n__webpack_require__(/*! ../modules/es.symbol.key-for */ \"./node_modules/core-js/modules/es.symbol.key-for.js\");\n__webpack_require__(/*! ../modules/es.json.stringify */ \"./node_modules/core-js/modules/es.json.stringify.js\");\n__webpack_require__(/*! ../modules/es.object.get-own-property-symbols */ \"./node_modules/core-js/modules/es.object.get-own-property-symbols.js\");\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/es.symbol.key-for.js\":\n/*!***********************************************************!*\\\n  !*** ./node_modules/core-js/modules/es.symbol.key-for.js ***!\n  \\***********************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar $ = __webpack_require__(/*! ../internals/export */ \"./node_modules/core-js/internals/export.js\");\nvar hasOwn = __webpack_require__(/*! ../internals/has-own-property */ \"./node_modules/core-js/internals/has-own-property.js\");\nvar isSymbol = __webpack_require__(/*! ../internals/is-symbol */ \"./node_modules/core-js/internals/is-symbol.js\");\nvar tryToString = __webpack_require__(/*! ../internals/try-to-string */ \"./node_modules/core-js/internals/try-to-string.js\");\nvar shared = __webpack_require__(/*! ../internals/shared */ \"./node_modules/core-js/internals/shared.js\");\nvar NATIVE_SYMBOL_REGISTRY = __webpack_require__(/*! ../internals/native-symbol-registry */ \"./node_modules/core-js/internals/native-symbol-registry.js\");\n\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\n// `Symbol.keyFor` method\n// https://tc39.es/ecma262/#sec-symbol.keyfor\n$({ target: 'Symbol', stat: true, forced: !NATIVE_SYMBOL_REGISTRY }, {\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(tryToString(sym) + ' is not a symbol');\n    if (hasOwn(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n  }\n});\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/web.dom-collections.for-each.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/core-js/modules/web.dom-collections.for-each.js ***!\n  \\**********************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ \"./node_modules/core-js/internals/dom-iterables.js\");\nvar DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ \"./node_modules/core-js/internals/dom-token-list-prototype.js\");\nvar forEach = __webpack_require__(/*! ../internals/array-for-each */ \"./node_modules/core-js/internals/array-for-each.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\n\nvar handlePrototype = function (CollectionPrototype) {\n  // some Chrome versions have non-configurable methods on DOMTokenList\n  if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n    createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n  } catch (error) {\n    CollectionPrototype.forEach = forEach;\n  }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n  if (DOMIterables[COLLECTION_NAME]) {\n    handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype);\n  }\n}\n\nhandlePrototype(DOMTokenListPrototype);\n\n\n/***/ }),\n\n/***/ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\":\n/*!**********************************************************************!*\\\n  !*** ./node_modules/core-js/modules/web.dom-collections.iterator.js ***!\n  \\**********************************************************************/\n/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {\n\nvar global = __webpack_require__(/*! ../internals/global */ \"./node_modules/core-js/internals/global.js\");\nvar DOMIterables = __webpack_require__(/*! ../internals/dom-iterables */ \"./node_modules/core-js/internals/dom-iterables.js\");\nvar DOMTokenListPrototype = __webpack_require__(/*! ../internals/dom-token-list-prototype */ \"./node_modules/core-js/internals/dom-token-list-prototype.js\");\nvar ArrayIteratorMethods = __webpack_require__(/*! ../modules/es.array.iterator */ \"./node_modules/core-js/modules/es.array.iterator.js\");\nvar createNonEnumerableProperty = __webpack_require__(/*! ../internals/create-non-enumerable-property */ \"./node_modules/core-js/internals/create-non-enumerable-property.js\");\nvar wellKnownSymbol = __webpack_require__(/*! ../internals/well-known-symbol */ \"./node_modules/core-js/internals/well-known-symbol.js\");\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n  if (CollectionPrototype) {\n    // some Chrome versions have non-configurable methods on DOMTokenList\n    if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n      createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n    } catch (error) {\n      CollectionPrototype[ITERATOR] = ArrayValues;\n    }\n    if (!CollectionPrototype[TO_STRING_TAG]) {\n      createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n    }\n    if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n      // some Chrome versions have non-configurable methods on DOMTokenList\n      if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n        createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n      } catch (error) {\n        CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n      }\n    }\n  }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n  handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\":\n/*!**********************************************************************************************************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***!\n  \\**********************************************************************************************************************************************************************************************************************************************************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_bamo_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../node_modules/css-loader/dist/cjs.js!./bamo.css */ \"./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css\");\n// Imports\n\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_bamo_css__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \" \", \"\",{\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css\":\n/*!***********************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css ***!\n  \\***********************************************************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n#BAMO .dialog_content {\\r\\n    margin: 0;\\r\\n} \\r\\n\\r\\n#BAMO .wizardWrapper {\\r\\n    display: flex; \\r\\n    flex-direction: row;\\r\\n    height: 100%;\\r\\n} \\r\\n\\r\\n#BAMO .wizardPage {\\r\\n    width: 100%; \\r\\n    padding: 12px 20px;\\r\\n} \\r\\n\\r\\n#BAMO .headerLabel {\\r\\n    font-size: 20px; \\r\\n    display: inline-block\\r\\n} \\r\\n\\r\\n#BAMO .headerDescription {\\r\\n    color: white;\\r\\n} \\r\\n\\r\\n#BAMO input[type='text'] {\\r\\n    display: block; \\r\\n    width: 100%; \\r\\n    height: auto; \\r\\n    padding: 4px 8px; \\r\\n    border: 1px solid black;\\r\\n} \\r\\n\\r\\n#BAMO input[type='number']{\\r\\n    display: inline-block; \\r\\n    width: 50px; \\r\\n    height: auto; \\r\\n    border: 1px solid black; \\r\\n    padding-left: 4px; \\r\\n    margin-right: 8px; \\r\\n    text-align: right;\\r\\n} \\r\\n\\r\\n#BAMO input[type='checkbox'] {\\r\\n    padding-right: 8px;\\r\\n} \\r\\n\\r\\n#BAMO select {\\r\\n    width: 100%; \\r\\n    height: auto; \\r\\n    padding: 4px 8px;\\r\\n    border: 1px solid black; \\r\\n} \\r\\n\\r\\n#BAMOsideBar {\\r\\n    border-right: 2px solid black;\\r\\n    width: 175px;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li {\\r\\n    width: 100%; \\r\\n    padding: 8px 20px; \\r\\n    cursor: pointer;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li.selected {\\r\\n    width: 100%; \\r\\n    padding: 8px 20px; \\r\\n    border-right: 4px solid green; \\r\\n    cursor: default;\\r\\n    background-color: gray;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li.sideBarHeader {\\r\\n    width: 100%;\\r\\n    padding: 2px 10px;\\r\\n    font-size: 12px;\\r\\n    cursor: default;\\r\\n}\\r\\n\\r\\nul.settingsList li {\\r\\n    padding: 8px 0;\\r\\n}\\r\\n\\t\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/bamo.css\"],\"names\":[],\"mappings\":\";AACA;IACI,SAAS;AACb;;AAEA;IACI,aAAa;IACb,mBAAmB;IACnB,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf;AACJ;;AAEA;IACI,YAAY;AAChB;;AAEA;IACI,cAAc;IACd,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;AAC3B;;AAEA;IACI,qBAAqB;IACrB,WAAW;IACX,YAAY;IACZ,uBAAuB;IACvB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;AACrB;;AAEA;IACI,kBAAkB;AACtB;;AAEA;IACI,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,uBAAuB;AAC3B;;AAEA;IACI,6BAA6B;IAC7B,YAAY;AAChB;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,eAAe;AACnB;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,6BAA6B;IAC7B,eAAe;IACf,sBAAsB;AAC1B;;AAEA;IACI,WAAW;IACX,iBAAiB;IACjB,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,cAAc;AAClB\",\"sourcesContent\":[\"\\r\\n#BAMO .dialog_content {\\r\\n    margin: 0;\\r\\n} \\r\\n\\r\\n#BAMO .wizardWrapper {\\r\\n    display: flex; \\r\\n    flex-direction: row;\\r\\n    height: 100%;\\r\\n} \\r\\n\\r\\n#BAMO .wizardPage {\\r\\n    width: 100%; \\r\\n    padding: 12px 20px;\\r\\n} \\r\\n\\r\\n#BAMO .headerLabel {\\r\\n    font-size: 20px; \\r\\n    display: inline-block\\r\\n} \\r\\n\\r\\n#BAMO .headerDescription {\\r\\n    color: white;\\r\\n} \\r\\n\\r\\n#BAMO input[type='text'] {\\r\\n    display: block; \\r\\n    width: 100%; \\r\\n    height: auto; \\r\\n    padding: 4px 8px; \\r\\n    border: 1px solid black;\\r\\n} \\r\\n\\r\\n#BAMO input[type='number']{\\r\\n    display: inline-block; \\r\\n    width: 50px; \\r\\n    height: auto; \\r\\n    border: 1px solid black; \\r\\n    padding-left: 4px; \\r\\n    margin-right: 8px; \\r\\n    text-align: right;\\r\\n} \\r\\n\\r\\n#BAMO input[type='checkbox'] {\\r\\n    padding-right: 8px;\\r\\n} \\r\\n\\r\\n#BAMO select {\\r\\n    width: 100%; \\r\\n    height: auto; \\r\\n    padding: 4px 8px;\\r\\n    border: 1px solid black; \\r\\n} \\r\\n\\r\\n#BAMOsideBar {\\r\\n    border-right: 2px solid black;\\r\\n    width: 175px;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li {\\r\\n    width: 100%; \\r\\n    padding: 8px 20px; \\r\\n    cursor: pointer;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li.selected {\\r\\n    width: 100%; \\r\\n    padding: 8px 20px; \\r\\n    border-right: 4px solid green; \\r\\n    cursor: default;\\r\\n    background-color: gray;\\r\\n} \\r\\n\\r\\n#BAMOsideBar li.sideBarHeader {\\r\\n    width: 100%;\\r\\n    padding: 2px 10px;\\r\\n    font-size: 12px;\\r\\n    cursor: default;\\r\\n}\\r\\n\\r\\nul.settingsList li {\\r\\n    padding: 8px 0;\\r\\n}\\r\\n\\t\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/api.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/api.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = \"\";\n      var needLayer = typeof item[5] !== \"undefined\";\n\n      if (item[4]) {\n        content += \"@supports (\".concat(item[4], \") {\");\n      }\n\n      if (item[2]) {\n        content += \"@media \".concat(item[2], \" {\");\n      }\n\n      if (needLayer) {\n        content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n      }\n\n      content += cssWithMappingToString(item);\n\n      if (needLayer) {\n        content += \"}\";\n      }\n\n      if (item[2]) {\n        content += \"}\";\n      }\n\n      if (item[4]) {\n        content += \"}\";\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n\n\n  list.i = function i(modules, media, dedupe, supports, layer) {\n    if (typeof modules === \"string\") {\n      modules = [[null, modules, undefined]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var k = 0; k < this.length; k++) {\n        var id = this[k][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _k = 0; _k < modules.length; _k++) {\n      var item = [].concat(modules[_k]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        continue;\n      }\n\n      if (typeof layer !== \"undefined\") {\n        if (typeof item[5] === \"undefined\") {\n          item[5] = layer;\n        } else {\n          item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n          item[5] = layer;\n        }\n      }\n\n      if (media) {\n        if (!item[2]) {\n          item[2] = media;\n        } else {\n          item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n          item[2] = media;\n        }\n      }\n\n      if (supports) {\n        if (!item[4]) {\n          item[4] = \"\".concat(supports);\n        } else {\n          item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n          item[4] = supports;\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\":\n/*!************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!\n  \\************************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = function (item) {\n  var content = item[1];\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (typeof btoa === \"function\") {\n    var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n    var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n    var sourceMapping = \"/*# \".concat(data, \" */\");\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n  }\n\n  return [content].join(\"\\n\");\n};\n\n/***/ }),\n\n/***/ \"./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\":\n/*!***********************************************************************************************************************************************************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***!\n  \\***********************************************************************************************************************************************************************************************************************************************************************************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n        var result = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ \"./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\");\n\n        if (result && result.__esModule) {\n            result = result.default;\n        }\n\n        if (typeof result === \"string\") {\n            module.exports = result;\n        } else {\n            module.exports = result.toString();\n        }\n    \n\n/***/ }),\n\n/***/ \"./src/components/bamo.css\":\n/*!*********************************!*\\\n  !*** ./src/components/bamo.css ***!\n  \\*********************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n        var result = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!./bamo.css */ \"./node_modules/css-loader/dist/cjs.js!./src/components/bamo.css\");\n\n        if (result && result.__esModule) {\n            result = result.default;\n        }\n\n        if (typeof result === \"string\") {\n            module.exports = result;\n        } else {\n            module.exports = result.toString();\n        }\n    \n\n/***/ }),\n\n/***/ \"./src/components/BamoAdvancedProperties.vue\":\n/*!***************************************************!*\\\n  !*** ./src/components/BamoAdvancedProperties.vue ***!\n  \\***************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& */ \"./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&\");\n/* harmony import */ var _BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BamoAdvancedProperties.vue?vue&type=script&lang=js& */ \"./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\nfunction injectStyles (context) {\n  \n  var style0 = __webpack_require__(/*! ./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ \"./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\")\nif (style0.__inject__) style0.__inject__(context)\n\n}\n\n/* normalize component */\n\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n  _BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render,\n  _BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n  false,\n  injectStyles,\n  \"018d13b4\",\n  \"0908dd08\"\n  \n)\n\ncomponent.options.__file = \"src/components/BamoAdvancedProperties.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n/***/ }),\n\n/***/ \"./src/components/BamoBaseComponent.vue\":\n/*!**********************************************!*\\\n  !*** ./src/components/BamoBaseComponent.vue ***!\n  \\**********************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BamoBaseComponent.vue?vue&type=template&id=2d170b0b& */ \"./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&\");\n/* harmony import */ var _BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BamoBaseComponent.vue?vue&type=script&lang=js& */ \"./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n;\nvar component = (0,_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n  _BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n  _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.render,\n  _BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns,\n  false,\n  null,\n  null,\n  \"48575ee9\"\n  \n)\n\ncomponent.options.__file = \"src/components/BamoBaseComponent.vue\"\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (component.exports);\n\n/***/ }),\n\n/***/ \"./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&\":\n/*!****************************************************************************!*\\\n  !*** ./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js& ***!\n  \\****************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n/***/ }),\n\n/***/ \"./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&\":\n/*!***********************************************************************!*\\\n  !*** ./src/components/BamoBaseComponent.vue?vue&type=script&lang=js& ***!\n  \\***********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/babel-loader/lib/index.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoBaseComponent.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=script&lang=js&\");\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_babel_loader_lib_index_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n/***/ }),\n\n/***/ \"./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\":\n/*!************************************************************************************************************!*\\\n  !*** ./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& ***!\n  \\************************************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/to-string-loader/src/to-string.js!../../node_modules/css-loader/dist/cjs.js!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css& */ \"./node_modules/to-string-loader/src/to-string.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoAdvancedProperties.vue?vue&type=style&index=0&id=018d13b4&scoped=true&lang=css&\");\n/* harmony import */ var _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _node_modules_to_string_loader_src_to_string_js_node_modules_css_loader_dist_cjs_js_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoAdvancedProperties_vue_vue_type_style_index_0_id_018d13b4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n/***/ }),\n\n/***/ \"./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&\":\n/*!*****************************************************************************!*\\\n  !*** ./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b& ***!\n  \\*****************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */   \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_BamoBaseComponent_vue_vue_type_template_id_2d170b0b___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./BamoBaseComponent.vue?vue&type=template&id=2d170b0b& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&\");\n\n\n/***/ }),\n\n/***/ \"./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&\":\n/*!*********************************************************************************************!*\\\n  !*** ./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& ***!\n  \\*********************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.render),\n/* harmony export */   \"staticRenderFns\": () => (/* reexport safe */ _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__.staticRenderFns)\n/* harmony export */ });\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_BamoAdvancedTemplate_html_vue_type_template_id_018d13b4_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&\");\n\n\n/***/ }),\n\n/***/ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b&\":\n/*!********************************************************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib/index.js??vue-loader-options!./src/components/BamoBaseComponent.vue?vue&type=template&id=2d170b0b& ***!\n  \\********************************************************************************************************************************************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render),\n/* harmony export */   \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function () {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"div\", [_c(\"BamoAdvancedProperties\")], 1)\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n/***/ }),\n\n/***/ \"./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true&\":\n/*!*************************************************************************************************************************************************************************!*\\\n  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./src/components/BamoAdvancedTemplate.html?vue&type=template&id=018d13b4&scoped=true& ***!\n  \\*************************************************************************************************************************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"render\": () => (/* binding */ render),\n/* harmony export */   \"staticRenderFns\": () => (/* binding */ staticRenderFns)\n/* harmony export */ });\nvar render = function () {\n  var _vm = this\n  var _h = _vm.$createElement\n  var _c = _vm._self._c || _h\n  return _c(\"div\", { attrs: { id: \"BAMO\" } }, [\n    _c(\"div\", { staticClass: \"wizardWrapper\" }, [\n      _c(\"ul\", { attrs: { id: \"BAMOsideBar\" } }, [\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"start\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"start\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Start\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _c(\"li\", { staticClass: \"sideBarHeader\" }, [_vm._v(\"Blocks\")]),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"types\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"types\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Block Types\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _vm.parentData.properties.types.custom\n          ? _c(\n              \"li\",\n              {\n                class: { selected: _vm.step == \"custom\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"custom\")\n                  },\n                },\n              },\n              [_vm._v(\"\\r\\n                Custom Block\\r\\n            \")]\n            )\n          : _vm._e(),\n        _vm._v(\" \"),\n        _vm.parentData.properties.types.block\n          ? _c(\n              \"li\",\n              {\n                class: { selected: _vm.step == \"variant\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"variant\")\n                  },\n                },\n              },\n              [_vm._v(\"\\r\\n                Variants\\r\\n            \")]\n            )\n          : _vm._e(),\n        _vm._v(\" \"),\n        _c(\"li\", { staticClass: \"sideBarHeader\" }, [_vm._v(\"Properties\")]),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"physical\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"physical\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Physical\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"advPhys\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"advPhys\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Adv Physical\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"particles\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"particles\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Particles\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"datapack\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"datapack\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Datapack\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n        _c(\n          \"li\",\n          {\n            class: { selected: _vm.step == \"other\" },\n            on: {\n              click: function ($event) {\n                $event.preventDefault()\n                return _vm.changePage($event, \"other\")\n              },\n            },\n          },\n          [_vm._v(\"\\r\\n                Other\\r\\n            \")]\n        ),\n        _vm._v(\" \"),\n         false\n          ? 0\n          : _vm._e(),\n        _vm._v(\" \"),\n         false\n          ? 0\n          : _vm._e(),\n      ]),\n      _vm._v(\" \"),\n      _vm.step == \"start\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"BAMO Exporter\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"p\", { attrs: { align: \"center\" } }, [\n              _vm._v(\n                'Click \"Export\" at any time to export the model. Any unmodified properties will be set to the default values for a dirt block. Changes will persist until Blockbench is closed.'\n              ),\n            ]),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Display Name\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"The (unique) name of the block as will be seen in Minecraft\"\n                  ),\n                ]),\n                _vm._v(\" \"),\n                _vm.error == \"name\"\n                  ? _c(\"p\", { staticStyle: { color: \"red\" } }, [\n                      _vm._v(\"Block display name cannot be blank\"),\n                    ])\n                  : _vm._e(),\n                _vm._v(\" \"),\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.displayName,\n                      expression: \"$parent.$data.properties.displayName\",\n                    },\n                  ],\n                  staticClass: \"dark_bordered\",\n                  attrs: { type: \"text\", placeholder: \"Name of the Block\" },\n                  domProps: { value: _vm.$parent.$data.properties.displayName },\n                  on: {\n                    input: function ($event) {\n                      if ($event.target.composing) {\n                        return\n                      }\n                      _vm.$set(\n                        _vm.$parent.$data.properties,\n                        \"displayName\",\n                        $event.target.value\n                      )\n                    },\n                  },\n                }),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Minecraft Version\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\" The version of minecraft to export for\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.version,\n                        expression: \"$parent.$data.properties.version\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"version\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  [\n                    _c(\"option\", { attrs: { disabled: \"\", value: \"\" } }, [\n                      _vm._v(\"Please select\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"option\", [_vm._v(\"1.20.1\")]),\n                    _vm._v(\" \"),\n                    _c(\"option\", [_vm._v(\"1.18.2\")]),\n                    _vm._v(\" \"),\n                    _c(\"option\", [_vm._v(\"1.16.5\")]),\n                  ]\n                ),\n              ]),\n            ]),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"types\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"types\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Block Types\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.types.custom,\n                      expression: \"$parent.$data.properties.types.custom\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.types.custom\n                    )\n                      ? _vm._i(\n                          _vm.$parent.$data.properties.types.custom,\n                          null\n                        ) > -1\n                      : _vm.$parent.$data.properties.types.custom,\n                  },\n                  on: {\n                    change: [\n                      function ($event) {\n                        var $$a = _vm.$parent.$data.properties.types.custom,\n                          $$el = $event.target,\n                          $$c = $$el.checked ? true : false\n                        if (Array.isArray($$a)) {\n                          var $$v = null,\n                            $$i = _vm._i($$a, $$v)\n                          if ($$el.checked) {\n                            $$i < 0 &&\n                              _vm.$set(\n                                _vm.$parent.$data.properties.types,\n                                \"custom\",\n                                $$a.concat([$$v])\n                              )\n                          } else {\n                            $$i > -1 &&\n                              _vm.$set(\n                                _vm.$parent.$data.properties.types,\n                                \"custom\",\n                                $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                              )\n                          }\n                        } else {\n                          _vm.$set(\n                            _vm.$parent.$data.properties.types,\n                            \"custom\",\n                            $$c\n                          )\n                        }\n                      },\n                      function ($event) {\n                        return _vm.toggleType($event, \"custom\")\n                      },\n                    ],\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Custom Block\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"Block with a custom model and hitbox\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.custom\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Custom Block Type\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.types.customType,\n                            expression:\n                              \"$parent.$data.properties.types.customType\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"customType\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.customTypeOptions, function (op) {\n                        return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.types.block,\n                      expression: \"$parent.$data.properties.types.block\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.types.block\n                    )\n                      ? _vm._i(_vm.$parent.$data.properties.types.block, null) >\n                        -1\n                      : _vm.$parent.$data.properties.types.block,\n                  },\n                  on: {\n                    change: [\n                      function ($event) {\n                        var $$a = _vm.$parent.$data.properties.types.block,\n                          $$el = $event.target,\n                          $$c = $$el.checked ? true : false\n                        if (Array.isArray($$a)) {\n                          var $$v = null,\n                            $$i = _vm._i($$a, $$v)\n                          if ($$el.checked) {\n                            $$i < 0 &&\n                              _vm.$set(\n                                _vm.$parent.$data.properties.types,\n                                \"block\",\n                                $$a.concat([$$v])\n                              )\n                          } else {\n                            $$i > -1 &&\n                              _vm.$set(\n                                _vm.$parent.$data.properties.types,\n                                \"block\",\n                                $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                              )\n                          }\n                        } else {\n                          _vm.$set(\n                            _vm.$parent.$data.properties.types,\n                            \"block\",\n                            $$c\n                          )\n                        }\n                      },\n                      function ($event) {\n                        return _vm.toggleType($event, \"block\")\n                      },\n                    ],\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Standard Block\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"1x1 block with identical textures on all faces\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.block\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.default.all,\n                            expression:\n                              \"$parent.$data.properties.variant.default.all\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.default,\n                              \"all\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n            ]),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"start\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"physical\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"custom\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Custom Block Properties\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.bufferedHitbox,\n                      expression: \"$parent.$data.properties.bufferedHitbox\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.bufferedHitbox\n                    )\n                      ? _vm._i(\n                          _vm.$parent.$data.properties.bufferedHitbox,\n                          null\n                        ) > -1\n                      : _vm.$parent.$data.properties.bufferedHitbox,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.bufferedHitbox,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"bufferedHitbox\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"bufferedHitbox\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"bufferedHitbox\",\n                          $$c\n                        )\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Simplified Hitbox\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Reduces the hitbox of the block to a single box encompasing the entire block. Use this if your model has rotated blocks, is mostly planes, or who's hitbox is otherwise messy\"\n                  ),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.bufferedHitbox\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model.number\",\n                          value: _vm.$parent.$data.properties.hitboxBuffer,\n                          expression: \"$parent.$data.properties.hitboxBuffer\",\n                          modifiers: { number: true },\n                        },\n                      ],\n                      staticClass: \"dark_bordered\",\n                      attrs: {\n                        type: \"number\",\n                        min: \"0\",\n                        max: \"16\",\n                        step: \"0.1\",\n                      },\n                      domProps: {\n                        value: _vm.$parent.$data.properties.hitboxBuffer,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.$parent.$data.properties,\n                            \"hitboxBuffer\",\n                            _vm._n($event.target.value)\n                          )\n                        },\n                        blur: function ($event) {\n                          return _vm.$forceUpdate()\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Hitbox Buffer\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"p\", { staticClass: \"headerDescription\" }, [\n                      _vm._v(\"Closest distance of hitbox to model edge\"),\n                    ]),\n                  ])\n                : _vm._e(),\n            ]),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"start\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"physical\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"variant\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Variant Blocks\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.types.stair,\n                      expression: \"$parent.$data.properties.types.stair\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.types.stair\n                    )\n                      ? _vm._i(_vm.$parent.$data.properties.types.stair, null) >\n                        -1\n                      : _vm.$parent.$data.properties.types.stair,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.types.stair,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"stair\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"stair\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(\n                          _vm.$parent.$data.properties.types,\n                          \"stair\",\n                          $$c\n                        )\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Create Stair Block\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.stair\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Top Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.stair.top,\n                            expression:\n                              \"$parent.$data.properties.variant.stair.top\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.stair,\n                              \"top\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.stair\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Bottom Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.stair.bottom,\n                            expression:\n                              \"$parent.$data.properties.variant.stair.bottom\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.stair,\n                              \"bottom\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.stair\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Side Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.stair.side,\n                            expression:\n                              \"$parent.$data.properties.variant.stair.side\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.stair,\n                              \"side\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.types.slab,\n                      expression: \"$parent.$data.properties.types.slab\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.types.slab\n                    )\n                      ? _vm._i(_vm.$parent.$data.properties.types.slab, null) >\n                        -1\n                      : _vm.$parent.$data.properties.types.slab,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.types.slab,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"slab\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"slab\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(\n                          _vm.$parent.$data.properties.types,\n                          \"slab\",\n                          $$c\n                        )\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Create Slab Block\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.slab\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Top Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.slab.top,\n                            expression:\n                              \"$parent.$data.properties.variant.slab.top\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.slab,\n                              \"top\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.slab\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Bottom Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.slab.bottom,\n                            expression:\n                              \"$parent.$data.properties.variant.slab.bottom\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.slab,\n                              \"bottom\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.slab\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Side Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.slab.side,\n                            expression:\n                              \"$parent.$data.properties.variant.slab.side\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.slab,\n                              \"side\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.types.wall,\n                      expression: \"$parent.$data.properties.types.wall\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.types.wall\n                    )\n                      ? _vm._i(_vm.$parent.$data.properties.types.wall, null) >\n                        -1\n                      : _vm.$parent.$data.properties.types.wall,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.types.wall,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"wall\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties.types,\n                              \"wall\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(\n                          _vm.$parent.$data.properties.types,\n                          \"wall\",\n                          $$c\n                        )\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Create Wall Block\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.$parent.$data.properties.types.wall\n                ? _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Wall Texture\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value:\n                              _vm.$parent.$data.properties.variant.wall.wall,\n                            expression:\n                              \"$parent.$data.properties.variant.wall.wall\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.$parent.$data.properties.variant.wall,\n                              \"wall\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.Textures(), function (op) {\n                        return _c(\"option\", { key: op }, [\n                          _vm._v(_vm._s(op.name)),\n                        ])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n            ]),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"types\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"physical\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"physical\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Physical Properties\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [_vm._v(\"Material\")]),\n                _vm._v(\" \"),\n                _vm._m(0),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.material,\n                        expression: \"$parent.$data.properties.material\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"material\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  _vm._l(_vm.materialOptions, function (op) {\n                    return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                  }),\n                  0\n                ),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Block Sounds\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Sets the sounds made when the custom block is stepped on/broken/etc to match the listed block\"\n                  ),\n                ]),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.sounds,\n                        expression: \"$parent.$data.properties.sounds\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"sounds\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  _vm._l(_vm.soundOptions, function (op) {\n                    return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                  }),\n                  0\n                ),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Transparency\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"The transparency style of the block. Models with partially transparent textures should be set to Cutout\"\n                  ),\n                ]),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.transparency,\n                        expression: \"$parent.$data.properties.transparency\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"transparency\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  _vm._l(_vm.transparencyOptions, function (tr) {\n                    return _c(\"option\", { key: tr }, [_vm._v(_vm._s(tr))])\n                  }),\n                  0\n                ),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.gravity,\n                      expression: \"$parent.$data.properties.gravity\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(_vm.$parent.$data.properties.gravity)\n                      ? _vm._i(_vm.$parent.$data.properties.gravity, null) > -1\n                      : _vm.$parent.$data.properties.gravity,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.gravity,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"gravity\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"gravity\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(_vm.$parent.$data.properties, \"gravity\", $$c)\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [_vm._v(\"Gravity\")]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Determines if the block falls due to gravity (No effect for non-default custom blocks)\"\n                  ),\n                ]),\n              ]),\n            ]),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"types\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"advPhys\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"advPhys\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Advanced Physical Properties\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model.number\",\n                      value: _vm.$parent.$data.properties.lum,\n                      expression: \"$parent.$data.properties.lum\",\n                      modifiers: { number: true },\n                    },\n                  ],\n                  staticClass: \"dark_bordered\",\n                  attrs: { type: \"number\", min: \"0\", max: \"15\" },\n                  domProps: { value: _vm.$parent.$data.properties.lum },\n                  on: {\n                    input: function ($event) {\n                      if ($event.target.composing) {\n                        return\n                      }\n                      _vm.$set(\n                        _vm.$parent.$data.properties,\n                        \"lum\",\n                        _vm._n($event.target.value)\n                      )\n                    },\n                    blur: function ($event) {\n                      return _vm.$forceUpdate()\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Luminance\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"The light level of the block. Ranges from 0 to 15. Torches default at 14\"\n                  ),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model.number\",\n                      value: _vm.$parent.$data.properties.blastRes,\n                      expression: \"$parent.$data.properties.blastRes\",\n                      modifiers: { number: true },\n                    },\n                  ],\n                  staticClass: \"dark_bordered\",\n                  attrs: { type: \"number\", min: \"0\" },\n                  domProps: { value: _vm.$parent.$data.properties.blastRes },\n                  on: {\n                    input: function ($event) {\n                      if ($event.target.composing) {\n                        return\n                      }\n                      _vm.$set(\n                        _vm.$parent.$data.properties,\n                        \"blastRes\",\n                        _vm._n($event.target.value)\n                      )\n                    },\n                    blur: function ($event) {\n                      return _vm.$forceUpdate()\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Blast Resistance\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"How resistant the block is to explosions. Most blocks fall between 0.1 and 9\"\n                  ),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model.number\",\n                      value: _vm.$parent.$data.properties.slip,\n                      expression: \"$parent.$data.properties.slip\",\n                      modifiers: { number: true },\n                    },\n                  ],\n                  staticClass: \"dark_bordered\",\n                  attrs: { type: \"number\", min: \"0\", step: \"0.1\" },\n                  domProps: { value: _vm.$parent.$data.properties.slip },\n                  on: {\n                    input: function ($event) {\n                      if ($event.target.composing) {\n                        return\n                      }\n                      _vm.$set(\n                        _vm.$parent.$data.properties,\n                        \"slip\",\n                        _vm._n($event.target.value)\n                      )\n                    },\n                    blur: function ($event) {\n                      return _vm.$forceUpdate()\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Slipperiness\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"How much you slide when crossing the block. Default is 0.6 and reaches 0.989 for blue ice\"\n                  ),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.$parent.$data.properties.fireproof,\n                      expression: \"$parent.$data.properties.fireproof\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.$parent.$data.properties.fireproof\n                    )\n                      ? _vm._i(_vm.$parent.$data.properties.fireproof, null) >\n                        -1\n                      : _vm.$parent.$data.properties.fireproof,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.$parent.$data.properties.fireproof,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"fireproof\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.$parent.$data.properties,\n                              \"fireproof\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(_vm.$parent.$data.properties, \"fireproof\", $$c)\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Fireproof\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"Determines if the block will burn\"),\n                ]),\n              ]),\n            ]),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"physical\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"particles\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"particles\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Particles\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.parentData.properties.particles,\n                      expression: \"parentData.properties.particles\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(_vm.parentData.properties.particles)\n                      ? _vm._i(_vm.parentData.properties.particles, null) > -1\n                      : _vm.parentData.properties.particles,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.parentData.properties.particles,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"particles\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"particles\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(_vm.parentData.properties, \"particles\", $$c)\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Emit Particles (WIP)\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Enables particle emission. Still in active development\"\n                  ),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _vm.parentData.properties.particles\n                ? _c(\"li\", [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Particle\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"p\", { staticClass: \"headerDescription\" }, [\n                      _vm._v(\"Which particle will be emitted\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\n                      \"select\",\n                      {\n                        directives: [\n                          {\n                            name: \"model\",\n                            rawName: \"v-model\",\n                            value: _vm.parentData.properties.particleType,\n                            expression: \"parentData.properties.particleType\",\n                          },\n                        ],\n                        staticClass: \"dark_bordered\",\n                        on: {\n                          change: function ($event) {\n                            var $$selectedVal = Array.prototype.filter\n                              .call($event.target.options, function (o) {\n                                return o.selected\n                              })\n                              .map(function (o) {\n                                var val = \"_value\" in o ? o._value : o.value\n                                return val\n                              })\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"particleType\",\n                              $event.target.multiple\n                                ? $$selectedVal\n                                : $$selectedVal[0]\n                            )\n                          },\n                        },\n                      },\n                      _vm._l(_vm.particleOptions, function (op) {\n                        return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                      }),\n                      0\n                    ),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.parentData.properties.particles\n                ? _c(\"li\", [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Particle Spawn Position\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"p\", { staticClass: \"headerDescription\" }, [\n                      _vm._v(\"Spawn point of the particles (between 0 and 16)\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particlePos.x,\n                          expression: \"parentData.properties.particlePos.x\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\", max: \"16\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particlePos.x,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particlePos,\n                            \"x\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particlePos.y,\n                          expression: \"parentData.properties.particlePos.y\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\", max: \"16\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particlePos.y,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particlePos,\n                            \"y\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particlePos.z,\n                          expression: \"parentData.properties.particlePos.z\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\", max: \"16\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particlePos.z,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particlePos,\n                            \"z\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.parentData.properties.particles\n                ? _c(\"li\", [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Particle Spread\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"p\", { staticClass: \"headerDescription\" }, [\n                      _vm._v(\"Spread of particles in blocks\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleSpread.x,\n                          expression: \"parentData.properties.particleSpread.x\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleSpread.x,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleSpread,\n                            \"x\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleSpread.y,\n                          expression: \"parentData.properties.particleSpread.y\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleSpread.y,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleSpread,\n                            \"y\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleSpread.z,\n                          expression: \"parentData.properties.particleSpread.z\",\n                        },\n                      ],\n                      attrs: { type: \"number\", min: \"0\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleSpread.z,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleSpread,\n                            \"z\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                  ])\n                : _vm._e(),\n              _vm._v(\" \"),\n              _vm.parentData.properties.particles\n                ? _c(\"li\", [\n                    _c(\"div\", { staticClass: \"headerLabel\" }, [\n                      _vm._v(\"Particle Velocity\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"p\", { staticClass: \"headerDescription\" }, [\n                      _vm._v(\"Velocity of particles in blocks per tick\"),\n                    ]),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleVel.x,\n                          expression: \"parentData.properties.particleVel.x\",\n                        },\n                      ],\n                      attrs: { type: \"number\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleVel.x,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleVel,\n                            \"x\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleVel.y,\n                          expression: \"parentData.properties.particleVel.y\",\n                        },\n                      ],\n                      attrs: { type: \"number\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleVel.y,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleVel,\n                            \"y\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                    _vm._v(\" \"),\n                    _c(\"input\", {\n                      directives: [\n                        {\n                          name: \"model\",\n                          rawName: \"v-model\",\n                          value: _vm.parentData.properties.particleVel.z,\n                          expression: \"parentData.properties.particleVel.z\",\n                        },\n                      ],\n                      attrs: { type: \"number\" },\n                      domProps: {\n                        value: _vm.parentData.properties.particleVel.z,\n                      },\n                      on: {\n                        input: function ($event) {\n                          if ($event.target.composing) {\n                            return\n                          }\n                          _vm.$set(\n                            _vm.parentData.properties.particleVel,\n                            \"z\",\n                            $event.target.value\n                          )\n                        },\n                      },\n                    }),\n                  ])\n                : _vm._e(),\n            ]),\n            _vm._v(\" \"),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"advPhys\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"datapack\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"datapack\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Datapack Properties\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.parentData.properties.genScRecipe,\n                      expression: \"parentData.properties.genScRecipe\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.parentData.properties.genScRecipe\n                    )\n                      ? _vm._i(_vm.parentData.properties.genScRecipe, null) > -1\n                      : _vm.parentData.properties.genScRecipe,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.parentData.properties.genScRecipe,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"genScRecipe\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"genScRecipe\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(_vm.parentData.properties, \"genScRecipe\", $$c)\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Generate Recipe\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"Creates a recipe for creating this block\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", { staticStyle: { \"padding-left\": \"20px\" } }, [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.parentData.properties.genReversableScRecipe,\n                      expression: \"parentData.properties.genReversableScRecipe\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(\n                      _vm.parentData.properties.genReversableScRecipe\n                    )\n                      ? _vm._i(\n                          _vm.parentData.properties.genReversableScRecipe,\n                          null\n                        ) > -1\n                      : _vm.parentData.properties.genReversableScRecipe,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.parentData.properties.genReversableScRecipe,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"genReversableScRecipe\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"genReversableScRecipe\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(\n                          _vm.parentData.properties,\n                          \"genReversableScRecipe\",\n                          $$c\n                        )\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Make recipe reverseable\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"Creates a recipe that reverse the above\"),\n                ]),\n              ]),\n            ]),\n            _vm._v(\" \"),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"particles\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"other\")\n                  },\n                },\n              },\n              [_vm._v(\"Continue\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"other\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"Other Properties\")]\n            ),\n            _vm._v(\" \"),\n            _c(\"ul\", { staticClass: \"settingsList\" }, [\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model.number\",\n                      value: _vm.$parent.$data.properties.maxStack,\n                      expression: \"$parent.$data.properties.maxStack\",\n                      modifiers: { number: true },\n                    },\n                  ],\n                  staticClass: \"dark_bordered\",\n                  attrs: { type: \"number\", min: \"0\" },\n                  domProps: { value: _vm.$parent.$data.properties.maxStack },\n                  on: {\n                    input: function ($event) {\n                      if ($event.target.composing) {\n                        return\n                      }\n                      _vm.$set(\n                        _vm.$parent.$data.properties,\n                        \"maxStack\",\n                        _vm._n($event.target.value)\n                      )\n                    },\n                    blur: function ($event) {\n                      return _vm.$forceUpdate()\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Max Stack Size\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"The maximum number the block in a stack\"),\n                ]),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Creative Tab\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Which tab on the creative inventory menu the block will be added to\"\n                  ),\n                ]),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.creativeTab,\n                        expression: \"$parent.$data.properties.creativeTab\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"creativeTab\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  _vm._l(_vm.tabOptions, function (op) {\n                    return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                  }),\n                  0\n                ),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Rotation Type\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\"if y_axis, faces the player when placed\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\n                  \"select\",\n                  {\n                    directives: [\n                      {\n                        name: \"model\",\n                        rawName: \"v-model\",\n                        value: _vm.$parent.$data.properties.rotType,\n                        expression: \"$parent.$data.properties.rotType\",\n                      },\n                    ],\n                    staticClass: \"dark_bordered\",\n                    on: {\n                      change: function ($event) {\n                        var $$selectedVal = Array.prototype.filter\n                          .call($event.target.options, function (o) {\n                            return o.selected\n                          })\n                          .map(function (o) {\n                            var val = \"_value\" in o ? o._value : o.value\n                            return val\n                          })\n                        _vm.$set(\n                          _vm.$parent.$data.properties,\n                          \"rotType\",\n                          $event.target.multiple\n                            ? $$selectedVal\n                            : $$selectedVal[0]\n                        )\n                      },\n                    },\n                  },\n                  _vm._l(_vm.rotationTypes, function (op) {\n                    return _c(\"option\", { key: op }, [_vm._v(_vm._s(op))])\n                  }),\n                  0\n                ),\n              ]),\n              _vm._v(\" \"),\n              _c(\"li\", [\n                _c(\"input\", {\n                  directives: [\n                    {\n                      name: \"model\",\n                      rawName: \"v-model\",\n                      value: _vm.parentData.properties.animated,\n                      expression: \"parentData.properties.animated\",\n                    },\n                  ],\n                  attrs: { type: \"checkbox\" },\n                  domProps: {\n                    checked: Array.isArray(_vm.parentData.properties.animated)\n                      ? _vm._i(_vm.parentData.properties.animated, null) > -1\n                      : _vm.parentData.properties.animated,\n                  },\n                  on: {\n                    change: function ($event) {\n                      var $$a = _vm.parentData.properties.animated,\n                        $$el = $event.target,\n                        $$c = $$el.checked ? true : false\n                      if (Array.isArray($$a)) {\n                        var $$v = null,\n                          $$i = _vm._i($$a, $$v)\n                        if ($$el.checked) {\n                          $$i < 0 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"animated\",\n                              $$a.concat([$$v])\n                            )\n                        } else {\n                          $$i > -1 &&\n                            _vm.$set(\n                              _vm.parentData.properties,\n                              \"animated\",\n                              $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n                            )\n                        }\n                      } else {\n                        _vm.$set(_vm.parentData.properties, \"animated\", $$c)\n                      }\n                    },\n                  },\n                }),\n                _vm._v(\" \"),\n                _c(\"div\", { staticClass: \"headerLabel\" }, [\n                  _vm._v(\"Animated Textures (WIP)\"),\n                ]),\n                _vm._v(\" \"),\n                _c(\"p\", { staticClass: \"headerDescription\" }, [\n                  _vm._v(\n                    \"Enables texture animations. Currently only recommended for single texture models\"\n                  ),\n                ]),\n              ]),\n            ]),\n            _vm._v(\" \"),\n            _c(\"br\"),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.changePage($event, \"datapack\")\n                  },\n                },\n              },\n              [_vm._v(\"Previous\")]\n            ),\n            _vm._v(\" \"),\n            _c(\n              \"button\",\n              {\n                staticStyle: { float: \"right\" },\n                on: {\n                  click: function ($event) {\n                    $event.preventDefault()\n                    return _vm.createJSON.apply(null, arguments)\n                  },\n                },\n              },\n              [_vm._v(\"Export\")]\n            ),\n          ])\n        : _vm._e(),\n      _vm._v(\" \"),\n      _vm.step == \"settings\"\n        ? _c(\"div\", { staticClass: \"wizardPage\" }, [\n            _c(\n              \"h1\",\n              { staticStyle: { padding: \"0\", \"text-align\": \"center\" } },\n              [_vm._v(\"BAMO Export Settings\")]\n            ),\n            _vm._v(\" \"),\n            _vm._m(1),\n          ])\n        : _vm._e(),\n    ]),\n  ])\n}\nvar staticRenderFns = [\n  function () {\n    var _vm = this\n    var _h = _vm.$createElement\n    var _c = _vm._self._c || _h\n    return _c(\"p\", { staticClass: \"headerDescription\" }, [\n      _vm._v(\n        \"Sets default properties to match those of the listed block. For a list of properties each block has, see the \"\n      ),\n      _c(\n        \"a\",\n        { attrs: { href: \"https://minecraft.fandom.com/wiki/Materials\" } },\n        [_vm._v(\"Minecraft wiki\")]\n      ),\n    ])\n  },\n  function () {\n    var _vm = this\n    var _h = _vm.$createElement\n    var _c = _vm._self._c || _h\n    return _c(\"ul\", { staticClass: \"settingsList\" }, [\n      _c(\"li\", [\n        _c(\"div\", { staticClass: \"headerLabel\" }, [_vm._v(\"Set Namespace\")]),\n        _vm._v(\" \"),\n        _c(\"p\", { staticClass: \"headerDescription\" }, [_vm._v(\"WIP\")]),\n      ]),\n      _vm._v(\" \"),\n      _c(\"li\", [\n        _c(\"div\", { staticClass: \"headerLabel\" }, [\n          _vm._v(\"Only export textures currently used\"),\n        ]),\n        _vm._v(\" \"),\n        _c(\"p\", { staticClass: \"headerDescription\" }, [_vm._v(\"WIP\")]),\n      ]),\n      _vm._v(\" \"),\n      _c(\"li\", [\n        _c(\"div\", { staticClass: \"headerLabel\" }, [_vm._v(\"reuse model file\")]),\n        _vm._v(\" \"),\n        _c(\"p\", { staticClass: \"headerDescription\" }, [_vm._v(\"WIP\")]),\n      ]),\n      _vm._v(\" \"),\n      _c(\"li\", [\n        _c(\"div\", { staticClass: \"headerLabel\" }, [\n          _vm._v(\"show warning if model with same name exists\"),\n        ]),\n        _vm._v(\" \"),\n        _c(\"p\", { staticClass: \"headerDescription\" }, [_vm._v(\"WIP\")]),\n        _vm._v(\" \"),\n        _c(\n          \"div\",\n          {\n            staticClass: \"headerLabel\",\n            staticStyle: { \"padding-left\": \"40px\" },\n          },\n          [_vm._v(\"Only do this if file is closed/new file loaded\")]\n        ),\n      ]),\n    ])\n  },\n]\nrender._withStripped = true\n\n\n\n/***/ }),\n\n/***/ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\":\n/*!********************************************************************!*\\\n  !*** ./node_modules/vue-loader/lib/runtime/componentNormalizer.js ***!\n  \\********************************************************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ normalizeComponent)\n/* harmony export */ });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n  scriptExports,\n  render,\n  staticRenderFns,\n  functionalTemplate,\n  injectStyles,\n  scopeId,\n  moduleIdentifier, /* server only */\n  shadowMode /* vue-cli only */\n) {\n  // Vue.extend constructor export interop\n  var options = typeof scriptExports === 'function'\n    ? scriptExports.options\n    : scriptExports\n\n  // render functions\n  if (render) {\n    options.render = render\n    options.staticRenderFns = staticRenderFns\n    options._compiled = true\n  }\n\n  // functional template\n  if (functionalTemplate) {\n    options.functional = true\n  }\n\n  // scopedId\n  if (scopeId) {\n    options._scopeId = 'data-v-' + scopeId\n  }\n\n  var hook\n  if (moduleIdentifier) { // server build\n    hook = function (context) {\n      // 2.3 injection\n      context =\n        context || // cached call\n        (this.$vnode && this.$vnode.ssrContext) || // stateful\n        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n      // 2.2 with runInNewContext: true\n      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n        context = __VUE_SSR_CONTEXT__\n      }\n      // inject component styles\n      if (injectStyles) {\n        injectStyles.call(this, context)\n      }\n      // register component module identifier for async chunk inferrence\n      if (context && context._registeredComponents) {\n        context._registeredComponents.add(moduleIdentifier)\n      }\n    }\n    // used by ssr in case component is cached and beforeCreate\n    // never gets called\n    options._ssrRegister = hook\n  } else if (injectStyles) {\n    hook = shadowMode\n      ? function () {\n        injectStyles.call(\n          this,\n          (options.functional ? this.parent : this).$root.$options.shadowRoot\n        )\n      }\n      : injectStyles\n  }\n\n  if (hook) {\n    if (options.functional) {\n      // for template-only hot-reload because in that case the render fn doesn't\n      // go through the normalizer\n      options._injectStyles = hook\n      // register for functional component in vue file\n      var originalRender = options.render\n      options.render = function renderWithStyleInjection (h, context) {\n        hook.call(context)\n        return originalRender(h, context)\n      }\n    } else {\n      // inject component registration as beforeCreate hook\n      var existing = options.beforeCreate\n      options.beforeCreate = existing\n        ? [].concat(existing, hook)\n        : [hook]\n    }\n  }\n\n  return {\n    exports: scriptExports,\n    options: options\n  }\n}\n\n\n/***/ }),\n\n/***/ \"fs\":\n/*!*********************!*\\\n  !*** external \"fs\" ***!\n  \\*********************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = require(\"fs\");\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be in strict mode.\n(() => {\n\"use strict\";\n/*!*********************!*\\\n  !*** ./src/main.js ***!\n  \\*********************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.date.to-string.js */ \"./node_modules/core-js/modules/es.date.to-string.js\");\n/* harmony import */ var core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_date_to_string_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ \"./node_modules/core-js/modules/es.object.to-string.js\");\n/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ \"./node_modules/core-js/modules/es.regexp.to-string.js\");\n/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ \"./node_modules/core-js/modules/es.function.name.js\");\n/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ \"./node_modules/core-js/modules/es.object.assign.js\");\n/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ \"./node_modules/core-js/modules/es.symbol.js\");\n/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ \"./node_modules/core-js/modules/es.symbol.description.js\");\n/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ \"./node_modules/core-js/modules/es.symbol.iterator.js\");\n/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ \"./node_modules/core-js/modules/es.array.iterator.js\");\n/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ \"./node_modules/core-js/modules/es.string.iterator.js\");\n/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _components_BamoBaseComponent_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/BamoBaseComponent.vue */ \"./src/components/BamoBaseComponent.vue\");\n/* harmony import */ var _util_Codec__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./util/Codec */ \"./src/util/Codec.js\");\n/* harmony import */ var _util_Settings__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util/Settings */ \"./src/util/Settings.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar css = (__webpack_require__(/*! ./components/bamo.css */ \"./src/components/bamo.css\").toString)();\n\nvar btn;\nvar exportWindow;\nvar cssData;\nvar minecraftFolder;\nPlugin.register('bamo', {\n  title: 'BAMO Exporter',\n  author: 'Ryytikki',\n  description: 'Create custom Minecraft blocks without having to write a single line of code when paired with the BAMO mod. https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on',\n  website: \"https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on\",\n  icon: 'icon.png',\n  tags: ['Minecraft: Java Edition'],\n  version: '0.5.1',\n  variant: 'desktop',\n  new_repository_format: true,\n  onload: function onload() {\n    (0,_util_Codec__WEBPACK_IMPORTED_MODULE_12__.loadCodec)(); // Setting that holds the resource pack folder location\n\n    minecraftFolder = new Setting('minecraftFolder', {\n      name: 'Minecraft Folder Location',\n      description: 'Location of the Minecraft folder on your PC',\n      category: 'export',\n      type: 'text',\n      value: ''\n    }); // Export button in menu\n\n    btn = new Action('bamo', {\n      name: 'BAMO Exporter',\n      description: 'Exports a block for the BAMO mod',\n      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAN6SURBVDhPJZJrTJtVGMd/b99CYUOgLTA6oKV1HWvHitwnGyZzW7INw5RIXBbjjJc598WpM+oXxz6a+JFETVzch8XEaGKcM9lCNIToqGDHTSiXAV2h5VZKW6illPb1fV/Pyck5Oec5z/O/PMKHv5yVtFotO7spIpENQMBYYSQ4HcBgMGAymViPhIlFo5ABnU5HPB5naWkJh8OBBo1ANBPDrCvBnm/GVWlnpmOUwnI9ceFf/n7kwWU8QH15NXvy84ilN9XENpuNdG4GjbPKxmzHEFXHqvhne5bJ2BOyCrIoOFhI5PISznonvpw1BEGg9dkGNt5dxpfwkyzcYfHyHMIZa4nkuPQR499+jiaZQ/2fzYy1PUIryuA0GvZ069l8aRlzn5OpE4O0nj2Ce8CPLkvkiMuEcOfjDmlsch67rZzW6krevvEDV187zvjcMjnZWoaGAghPCaRCcawXr5E99B2NLju37g1Qbd2HaCnK6xqZX6PWXsZMcJ1cXZqSIj0PBqbwr0ZIaTLUHSxDX5yP5/d7WCtMzAbWKTXkceH5GoSRL69Id3qG2N7ZJZNMYLlwk+CPN8nK3cvrZ+rZTWf45tdB9azQUs7Nhy0MjPupshQjZglSl+wdb5xr4PDTZYRHethv2kcoKjswtYgki3ffPUVR4V4WQjE240kCa1EanRWk0xLi1fbmrpXwFsOPg2rwuG8di0lPdCvBqKyDIM+2FgeSBF7fKhkpoyJ5MDBNtlZEtBbnd9UfKqdncEYOhWxZ3d88j1X+TY4KNXg2EGI5vKm+XTz1jCxeKcGlVVxVZrmR5KHwVBR99XStKkx5cQHd751XkfR5JnmrrVFd7okFxmQUD0emKeu8gXfah3D7+ouSYpmSRBElntjhVN0Bvvi+j9O1ZnrFFo4m+siI2QRWo/wx5uPNF5oYlJNMBGMIn3a2SO4JP++cP8rDUR819lI2EylO1Nj46q4bfa4GSdSxlUhSmJerAFbpXGlvVotqFPuUz57JRWS6DAdSBFc26Pf6Oeaykkhr6B2e4/orz6n79k6Kay8fp3dkHrd3AeHW++3S5JNVFdrtTzr5+ud+vAsh6ioN9HmXZS3a1ardP/VzssHOX7L/SpKGQxXqvdjWZO8KhqJ8dukk92UnzKUGtOkkxnMfYAyPEk2mZUeiaqMtrESotpWyv6iA/4vO8x8IAITQHDgPDwAAAABJRU5ErkJggg==',\n      click: function click() {\n        if (Project.name != undefined) {\n          if (Texture.all.length == 0) {\n            Blockbench.showMessageBox({\n              buttons: [\"Ok\"],\n              title: \"Error\",\n              message: \"Please create a texture\"\n            });\n            return;\n          } // If the bamoSettings for the file havent been generated, generate\n\n\n          if (_typeof(_util_Settings__WEBPACK_IMPORTED_MODULE_13__[\"default\"][Project.uuid]) !== 'object') {\n            _util_Settings__WEBPACK_IMPORTED_MODULE_13__[\"default\"][Project.uuid] = Object.assign({}, _util_Settings__WEBPACK_IMPORTED_MODULE_13__.BAMO_SETTINGS_DEFAULT);\n            _util_Settings__WEBPACK_IMPORTED_MODULE_13__[\"default\"][Project.uuid].displayName = Project.name;\n          }\n\n          if (Settings.get('minecraftFolder') != undefined && Settings.get('minecraftFolder') != '') {\n            exportWindow.show();\n            exportWindow.content_vue.updateValues();\n          } else {\n            Blockbench.showMessageBox({\n              buttons: [\"Ok\"],\n              title: \"Error\",\n              message: \"You must set your Minecraft folder location under Settings->Export\"\n            });\n          }\n        } else {\n          Blockbench.showMessageBox({\n            buttons: [\"Ok\"],\n            title: \"Error\",\n            message: \"Please ensure your file is saved before exporting. If you see this for a saved file, reload it and try again\"\n          });\n        }\n      }\n    });\n    MenuBar.addAction(btn, 'tools'); // Dialog that opens when you click the button1\n    // See the BamoComponent object for details\n\n    exportWindow = new Dialog('BAMOExportWindow', {\n      id: \"BAMO\",\n      title: 'BAMO Exporter',\n      component: _components_BamoBaseComponent_vue__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n      buttons: [],\n      padding: !1,\n      width: 720,\n      height: 620\n    });\n    cssData = Blockbench.addCSS(css);\n  },\n  onunload: function onunload() {\n    btn[\"delete\"]();\n    minecraftFolder[\"delete\"](); //cssData.delete();\n\n    (0,_util_Codec__WEBPACK_IMPORTED_MODULE_12__.unloadCodec)();\n  }\n});\n})();\n\n/******/ })()\n;\n//# sourceMappingURL=bamo.js.map"
  },
  {
    "path": "plugins/bamo/src/.gitignore",
    "content": "node_modules"
  },
  {
    "path": "plugins/bamo/src/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    [\n      \"@babel/preset-env\",\n      {\n        useBuiltIns: \"usage\",\n        corejs: 3,\n      },\n    ],\n  ],\n};"
  },
  {
    "path": "plugins/bamo/src/package.json",
    "content": "{\n  \"name\": \"plugin\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.18.2\",\n    \"@babel/preset-env\": \"^7.18.2\",\n    \"babel-loader\": \"^8.2.5\",\n    \"css-loader\": \"^6.7.1\",\n    \"to-string-loader\": \"^1.2.0\",\n    \"webpack\": \"^5.75.0\",\n    \"webpack-cli\": \"^4.9.2\",\n    \"webpack-dev-server\": \"^4.9.2\"\n  },\n  \"dependencies\": {\n    \"blockbench-types\": \"^4.2.0\",\n    \"core-js\": \"^3.22.8\",\n    \"jszip\": \"^3.10.0\",\n    \"vue\": \"^2.6.11\",\n    \"vue-loader\": \"^15.9.6\",\n    \"vue-router\": \"^3.5.4\",\n    \"vue-template-compiler\": \"^2.6.12\"\n  }\n}\n"
  },
  {
    "path": "plugins/bamo/src/src/components/BamoAdvancedProperties.vue",
    "content": "<script>\n\nimport { rotationTypes, soundOptions, materialOptions, transparencyOptions, tabOptions, particleOptions, customTypeOptions } from '../util/OptionArrays.js';\n\nexport default {\n    data() {\n        return {\n            step: \"start\",\n            rotationTypes: rotationTypes,\n            soundOptions: soundOptions,\n            materialOptions: materialOptions,\n            transparencyOptions: transparencyOptions,\n            tabOptions: tabOptions,\n            particleOptions: particleOptions,\n            customTypeOptions: customTypeOptions,\n            parentData: this.$parent.$data\n        }\n    },\n    methods: {\n\n        Textures(){\n            return Texture.all\n        },\n\n        createJSON(){\n            this.$parent.createJSON()\n        },\n\n        changePage(event, page){\n            if (this.parentData.properties.displayName == \"\"){\n                this.parentData.error = \"name\"\n            }else{\n\n                if ((this.step == \"types\" && page == \"physical\") || (this.step == \"physical\" && page == \"types\")){\n                    if (this.parentData.properties.types.block) {page = \"variant\"} else {page = \"custom\"}\n                }\n\n                this.parentData.error = \"\"\n                this.step = page\n            }\n        },\n\n        toggleType(event, type){\n            \n            if (this.parentData.properties.types.custom && type==\"custom\"){\n                this.parentData.properties.types.block = false\n                this.parentData.properties.types.stair = false\n                this.parentData.properties.types.slab = false\n                this.parentData.properties.types.wall = false\n                return\n            }\n\n            if (this.parentData.properties.types.block && type==\"block\"){\n                this.parentData.properties.types.custom = false\n                return\n            }\n        },\n\n        reset(event){\n            this.parentData.error = \"\"\n            this.step = \"start\"\n        },\n\n    }\n}\n</script>\n\n<template src=\"./BamoAdvancedTemplate.html\"></template>\n<style scoped> @import './bamo.css'; </style>"
  },
  {
    "path": "plugins/bamo/src/src/components/BamoAdvancedTemplate.html",
    "content": "<div id=\"BAMO\">\n    <div class=\"wizardWrapper\">\n        <ul id=\"BAMOsideBar\">\n            <li v-bind:class=\"{selected: step =='start'}\" @click.prevent=\"changePage($event, 'start')\">\n                Start\n            </li>\n            <li class=\"sideBarHeader\">Blocks</li>\n            <li v-bind:class=\"{selected: step =='types'}\" @click.prevent=\"changePage($event, 'types')\">\n                Block Types\n            </li>\n            <li v-bind:class=\"{selected: step =='custom'}\" v-if=\"parentData.properties.types.custom\" @click.prevent=\"changePage($event, 'custom')\">\n                Custom Block\n            </li>\n            <li v-bind:class=\"{selected: step =='variant'}\" v-if=\"parentData.properties.types.block\" @click.prevent=\"changePage($event, 'variant')\">\n                Variants\n            </li>\n            <li class=\"sideBarHeader\">Properties</li>\n            <li v-bind:class=\"{selected: step == 'physical'}\" @click.prevent=\"changePage($event, 'physical')\">\n                Physical\n            </li>\n            <li v-bind:class=\"{selected: step == 'advPhys'}\" @click.prevent=\"changePage($event, 'advPhys')\">\n                Adv Physical\n            </li>\n            <li v-bind:class=\"{selected: step == 'particles'}\" @click.prevent=\"changePage($event, 'particles')\">\n                Particles\n            </li>\n            <li v-bind:class=\"{selected: step == 'datapack'}\" @click.prevent=\"changePage($event, 'datapack')\">\n                Datapack\n            </li>\n            <li v-bind:class=\"{selected: step == 'other'}\" @click.prevent=\"changePage($event, 'other')\">\n                Other\n            </li>\n            <li class=\"sideBarHeader\" v-if=\"false\">Adv. Options</li>\n            <li v-bind:class=\"{selected: step == 'settings'}\" v-if=\"false\" @click.prevent=\"changePage($event, 'settings')\">\n                BAMO settings\n            </li>\n        </ul>\n\n        <!-- Start -->\n        <div class=\"wizardPage\" v-if=\"step=='start'\">\n            <h1 style=\"padding:0; text-align: center;\">BAMO Exporter</h1>\n            <p align=center>Click \"Export\" at any time to export the model. Any unmodified properties will be set to the default values for a dirt block. Changes will persist until Blockbench is closed.</p>\n\n            <ul class=\"settingsList\">\n                <li>\n                    <div class=\"headerLabel\">Display Name</div>\n                    <p class=\"headerDescription\">The (unique) name of the block as will be seen in Minecraft</p>\n                    <p v-if=\"error=='name'\" style=\"color:red\">Block display name cannot be blank</p>\n                    <input type=\"text\" class=\"dark_bordered\" v-model=\"$parent.$data.properties.displayName\" placeholder=\"Name of the Block\">\n                </li>\n                <li>\n                    <div class=\"headerLabel\">Minecraft Version</div>\n                    <p class=\"headerDescription\"> The version of minecraft to export for</p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.version\">\n                        <option disabled value=\"\">Please select</option>\n                        <option>1.20.1</option>\n                        <option>1.18.2</option>\n                        <option>1.16.5</option>\n                    </select>\n                </li>\n            </ul><br>\n            \n            <button @click.prevent=\"changePage($event, 'types')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Block Types -->\n        <div class=\"wizardPage\" v-if=\"step=='types'\">\n            <h1 style=\"padding:0; text-align: center;\">Block Types</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.types.custom\" v-on:change=\"toggleType($event, 'custom')\">\n                    <div class = \"headerLabel\">Custom Block</div>\n                    <p class=\"headerDescription\">Block with a custom model and hitbox</p>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.custom\">\n                    <div class = \"headerLabel\">Custom Block Type</div>\n                    <select class=\"dark_bordered\" v-model = \"$parent.$data.properties.types.customType\">\n                        <option v-for=\"op in customTypeOptions\" v-bind:key=\"op\">{{op}}</option>\n                    </select>\n                </li>\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.types.block\" v-on:change=\"toggleType($event, 'block')\">\n                    <div class = \"headerLabel\">Standard Block</div>\n                    <p class=\"headerDescription\">1x1 block with identical textures on all faces</p>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.block\">\n                    <div class = \"headerLabel\">Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.default.all\" >\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n            </ul><br>\n\n            <button @click.prevent=\"changePage($event, 'start')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'physical')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Custom Block Settings -->\n        <div class=\"wizardPage\" v-if=\"step=='custom'\">\n            <h1 style=\"padding:0; text-align: center;\">Custom Block Properties</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.bufferedHitbox\">\n                    <div class = \"headerLabel\">Simplified Hitbox</div>\n                    <p class=\"headerDescription\">Reduces the hitbox of the block to a single box encompasing the entire block. Use this if your model has rotated blocks, is mostly planes, or who's hitbox is otherwise messy</p>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.bufferedHitbox\">\n                    <input type=\"number\" class=\"dark_bordered\" v-model.number=\"$parent.$data.properties.hitboxBuffer\" min=0 max=16 step=0.1>\n                    <div class = \"headerLabel\">Hitbox Buffer</div>\n                    <p class=\"headerDescription\">Closest distance of hitbox to model edge</p>\n                </li>\n            </ul><br>\n\n            <button @click.prevent=\"changePage($event, 'start')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'physical')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Variant Block -->\n        <div class=\"wizardPage\" v-if=\"step=='variant'\">\n            <h1 style=\"padding:0; text-align: center;\">Variant Blocks</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.types.stair\">\n                    <div class = \"headerLabel\">Create Stair Block</div>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.stair\">\n                    <div class = \"headerLabel\">Top Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.stair.top\" >\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.stair\"> \n                    <div class = \"headerLabel\">Bottom Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.stair.bottom\">\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.stair\"> \n                    <div class = \"headerLabel\">Side Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.stair.side\">\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n                \n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.types.slab\">\n                    <div class = \"headerLabel\">Create Slab Block</div>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.slab\">\n                    <div class = \"headerLabel\">Top Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.slab.top\" >\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.slab\"> \n                    <div class = \"headerLabel\">Bottom Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.slab.bottom\">\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.slab\"> \n                    <div class = \"headerLabel\">Side Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.slab.side\">\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.types.wall\">\n                    <div class = \"headerLabel\">Create Wall Block</div>\n                </li>\n                <li style=\"padding-left: 20px\" v-if=\"$parent.$data.properties.types.wall\">\n                    <div class = \"headerLabel\">Wall Texture</div>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.variant.wall.wall\" >\n                        <option v-for=\"op in Textures()\" v-bind:key=\"op\">{{op.name}}</option>\n                    </select>\n                </li>\n            </ul><br>\n            <button @click.prevent=\"changePage($event, 'types')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'physical')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Physical Properties -->\n        <div class=\"wizardPage\" v-if=\"step=='physical'\">\n            <h1 style=\"padding:0; text-align: center;\">Physical Properties</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <div class = \"headerLabel\">Material</div>\n                    <p class=\"headerDescription\">Sets default properties to match those of the listed block. For a list of properties each block has, see the <a href=\"https://minecraft.fandom.com/wiki/Materials\">Minecraft wiki</a></p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.material\"><option v-for=\"op in materialOptions\" v-bind:key=\"op\">{{ op }}</option></select>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">Block Sounds</div>\n                    <p class=\"headerDescription\">Sets the sounds made when the custom block is stepped on/broken/etc to match the listed block</p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.sounds\"><option v-for=\"op in soundOptions\" v-bind:key=\"op\">{{ op }}</option></select>\n                </li>\n\n                <li>\n                    <div class=\"headerLabel\">Transparency</div>\n                    <p class=\"headerDescription\">The transparency style of the block. Models with partially transparent textures should be set to Cutout</p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.transparency\"><option v-for=\"tr in transparencyOptions\" v-bind:key=\"tr\">{{ tr }}</option></select>\n                </li>\n                \n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.gravity\">\n                    <div class = \"headerLabel\">Gravity</div>\n                    <p class=\"headerDescription\">Determines if the block falls due to gravity (No effect for non-default custom blocks)</p>\n                </li>\n            </ul>\n            <button @click.prevent=\"changePage($event, 'types')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'advPhys')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Adv Physical Properties -->\n        <div class=\"wizardPage\" v-if=\"step=='advPhys'\">\n            <h1 style=\"padding:0; text-align: center;\">Advanced Physical Properties</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"number\" class=\"dark_bordered\" v-model.number=\"$parent.$data.properties.lum\" min=0 max=15>\n                    <div class = \"headerLabel\">Luminance</div>\n                    <p class=\"headerDescription\">The light level of the block. Ranges from 0 to 15. Torches default at 14</p>\n                </li>\n\n                <li>\n                    <input type=\"number\" class=\"dark_bordered\" v-model.number=\"$parent.$data.properties.blastRes\" min=0>\n                    <div class = \"headerLabel\">Blast Resistance</div>\n                    <p class=\"headerDescription\">How resistant the block is to explosions. Most blocks fall between 0.1 and 9</p>\n                </li>\n\n                <li>\n                    <input type=\"number\" class=\"dark_bordered\" v-model.number=\"$parent.$data.properties.slip\" min=0 step=\"0.1\">\n                    <div class = \"headerLabel\">Slipperiness</div>\n                    <p class=\"headerDescription\">How much you slide when crossing the block. Default is 0.6 and reaches 0.989 for blue ice</p>\n                </li>\n\n                <li>\n                    <input type=\"checkbox\" v-model=\"$parent.$data.properties.fireproof\">\n                    <div class = \"headerLabel\">Fireproof</div>\n                    <p class=\"headerDescription\">Determines if the block will burn</p>\n                </li>\n            </ul>\n            <button @click.prevent=\"changePage($event, 'physical')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'particles')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Particles-->\n        <div class=\"wizardPage\" v-if=\"step=='particles'\">\n            <h1 style=\"padding:0; text-align: center;\">Particles</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"checkbox\" v-model=\"parentData.properties.particles\">\n                    <div class = \"headerLabel\">Emit Particles (WIP)</div>\n                    <p class=\"headerDescription\">Enables particle emission. Still in active development</p>\n                </li>\n                <li v-if= \"parentData.properties.particles\">\n                    <div class = \"headerLabel\">Particle</div>\n                    <p class=\"headerDescription\">Which particle will be emitted</p>\n                    <select class=\"dark_bordered\" v-model=\"parentData.properties.particleType\"><option v-for=\"op in particleOptions\" v-bind:key=\"op\">{{ op }}</option></select>\n                </li>\n                <li v-if= \"parentData.properties.particles\">\n                    <div class = \"headerLabel\">Particle Spawn Position</div>\n                    <p class=\"headerDescription\">Spawn point of the particles (between 0 and 16)</p>\n                    <input type=\"number\" v-model=\"parentData.properties.particlePos.x\" min=\"0\" max=\"16\">\n                    <input type=\"number\" v-model=\"parentData.properties.particlePos.y\" min=\"0\" max=\"16\">\n                    <input type=\"number\" v-model=\"parentData.properties.particlePos.z\" min=\"0\" max=\"16\">\n                </li>\n                <li v-if= \"parentData.properties.particles\">\n                    <div class = \"headerLabel\">Particle Spread</div>\n                    <p class=\"headerDescription\">Spread of particles in blocks</p>\n                    <input type=\"number\" v-model=\"parentData.properties.particleSpread.x\" min=\"0\">\n                    <input type=\"number\" v-model=\"parentData.properties.particleSpread.y\" min=\"0\">\n                    <input type=\"number\" v-model=\"parentData.properties.particleSpread.z\" min=\"0\">\n                </li>\n                <li v-if= \"parentData.properties.particles\">\n                    <div class = \"headerLabel\">Particle Velocity</div>\n                    <p class=\"headerDescription\">Velocity of particles in blocks per tick</p>\n                    <input type=\"number\" v-model=\"parentData.properties.particleVel.x\">\n                    <input type=\"number\" v-model=\"parentData.properties.particleVel.y\">\n                    <input type=\"number\" v-model=\"parentData.properties.particleVel.z\">\n                </li>\n            </ul>\n            <br>\n            <button @click.prevent=\"changePage($event, 'advPhys')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'datapack')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Datapack Settings -->\n        <div class=\"wizardPage\" v-if=\"step=='datapack'\">\n            <h1 style=\"padding:0; text-align: center;\">Datapack Properties</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"checkbox\" v-model=\"parentData.properties.genScRecipe\">\n                    <div class = \"headerLabel\">Generate Recipe</div>\n                    <p class=\"headerDescription\">Creates a recipe for creating this block</p>\n                </li>\n                <li style=\"padding-left: 20px\">\n                    <input type=\"checkbox\" v-model=\"parentData.properties.genReversableScRecipe\">\n                    <div class = \"headerLabel\">Make recipe reverseable</div>\n                    <p class=\"headerDescription\">Creates a recipe that reverse the above</p>\n                </li>\n            </ul>\n            <br>\n            <button @click.prevent=\"changePage($event, 'particles')\">Previous</button>\n            <button @click.prevent=\"changePage($event, 'other')\">Continue</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <!-- Other Properties -->\n        <div class=\"wizardPage\" v-if=\"step=='other'\">\n            <h1 style=\"padding:0; text-align: center;\">Other Properties</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <input type=\"number\" class=\"dark_bordered\" v-model.number=\"$parent.$data.properties.maxStack\" min=0>\n                    <div class = \"headerLabel\">Max Stack Size</div>\n                    <p class=\"headerDescription\">The maximum number the block in a stack</p>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">Creative Tab</div>\n                    <p class=\"headerDescription\">Which tab on the creative inventory menu the block will be added to</p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.creativeTab\"><option v-for=\"op in tabOptions\" v-bind:key=\"op\">{{ op }}</option></select>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">Rotation Type</div>\n                    <p class=\"headerDescription\">if y_axis, faces the player when placed</p>\n                    <select class=\"dark_bordered\" v-model=\"$parent.$data.properties.rotType\"><option v-for=\"op in rotationTypes\" v-bind:key=\"op\">{{ op }}</option></select>\n                </li>\n                <li>\n                    <input type=\"checkbox\" v-model=\"parentData.properties.animated\">\n                    <div class = \"headerLabel\">Animated Textures (WIP)</div>\n                    <p class = \"headerDescription\">Enables texture animations. Currently only recommended for single texture models</p>\n                </li>\n            </ul>\n            <br>\n            <button @click.prevent=\"changePage($event, 'datapack')\">Previous</button>\n            <button @click.prevent=\"createJSON\" style = \"float: right;\">Export</button>\n        </div>\n\n        <div class=\"wizardPage\" v-if=\"step=='settings'\">\n            <h1 style=\"padding:0; text-align: center;\">BAMO Export Settings</h1>\n            <ul class=\"settingsList\">\n                <li>\n                    <div class = \"headerLabel\">Set Namespace</div>\n                    <p class=\"headerDescription\">WIP</p>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">Only export textures currently used</div>\n                    <p class=\"headerDescription\">WIP</p>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">reuse model file</div>\n                    <p class=\"headerDescription\">WIP</p>\n                </li>\n\n                <li>\n                    <div class = \"headerLabel\">show warning if model with same name exists</div>\n                    <p class=\"headerDescription\">WIP</p>\n                    <div class = \"headerLabel\" style=\"padding-left: 40px;\">Only do this if file is closed/new file loaded</div>\n                </li>\n            </ul>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "plugins/bamo/src/src/components/BamoBaseComponent.vue",
    "content": "<script>\nimport { rotationTypes, soundOptions, materialOptions, transparencyOptions, tabOptions, particleOptions, customTypeOptions } from '../util/OptionArrays.js';\nimport {genWallState, genStairState} from '../util/GenStates.js'\nimport {genLootTable, genMineableTag, genStonecuttingRecipes} from '../util/GenDataFiles.js'\nimport {dictFromTexture, cleanFileName} from '../util/Utils.js'\nimport bamoSettings, { BAMO_SETTINGS_DEFAULT } from \"../util/Settings.js\";\nimport BamoAdvancedProperties from './BamoAdvancedProperties.vue';\n\nexport default {\n    components: {BamoAdvancedProperties},\n    data() {\n        return {\n            step: \"start\",\n            error: \"\",\n\n            rotationTypes: rotationTypes,\n            soundOptions: soundOptions,\n            materialOptions: materialOptions,\n            transparencyOptions: transparencyOptions,\n            tabOptions: tabOptions,\n            particleOptions: particleOptions,\n            customTypeOptions: customTypeOptions,\n            \n            properties: BAMO_SETTINGS_DEFAULT,\n\n            lastID: \"\",\n            swap: false\n        }\n    },\n    methods: {\n\n        updateValues(){\n            \n            if (Project.uuid != this.lastID){\n                this.properties = bamoSettings[Project.uuid];\n                this.lastID = Project.uuid;\n                this.swap = true;\n                this.reset(null);\n            }\n\n            // Initialize the textures if not done so yet\n            if (this.properties.variant.default.all == \"\") {\n                this.properties.variant.default.all = Texture.all[0].name;\n                this.properties.variant.stair.top = Texture.all[0].name;\n                this.properties.variant.stair.bottom = Texture.all[0].name;\n                this.properties.variant.stair.side = Texture.all[0].name;\n                this.properties.variant.slab.top = Texture.all[0].name;\n                this.properties.variant.slab.bottom = Texture.all[0].name;\n                this.properties.variant.slab.side = Texture.all[0].name;\n                this.properties.variant.wall.wall = Texture.all[0].name;\n            }\n        },\n\n        Textures(){\n            return Texture.all\n        },\n\n        changePage(event, page){\n            if (this.properties.displayName == \"\"){\n                this.error = \"name\"\n            }else{\n\n                if ((this.step == \"types\" && page == \"physical\") || (this.step == \"physical\" && page == \"types\")){\n                    if (this.properties.types.block) {page = \"variant\"}\n                }\n\n                this.error = \"\"\n                this.step = page\n            }\n        },\n\n        toggleType(event, type){\n            \n            if (this.properties.types.custom && type==\"custom\"){\n                this.properties.types.block = false\n                this.properties.types.stair = false\n                this.properties.types.slab = false\n                this.properties.types.wall = false\n                return\n            }\n\n            if (this.properties.types.block && type==\"block\"){\n                this.properties.types.custom = false\n                return\n            }\n        },\n\n        reset(event){\n            this.error = \"\"\n            this.step = \"start\"\n        },\n\n        createJSON(event){\n\n            // Ensure a name is set\n            if (this.properties.displayName == \"\"){\n                this.error = \"name\";\n                return;\n            }\n\n            // Ensure a particle texture is set\n            var part = false\n            Texture.all.forEach(function(tx){\n                if (tx.particle == true){\n                    part = true\n                }\n            })\n\n            if (part == false){\n                Blockbench.showMessageBox({buttons: [\"Ok\"], title: \"Error\", message: \"Please ensure you have set a particle texture\"});\n                return;\n            }\n\n            var zip = new JSZip();\n\n            // Trim invalid chars from the name\n            var packName = cleanFileName(this.properties.displayName);\n\n            // Define folder locations\n            var objFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\objects\\\\\";\n            var blockstatesFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\blockstates\\\\\";\n            var blockModelsFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\models\\\\block\\\\\";\n            var itemModelsFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\models\\\\item\\\\\";\n            var dataFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\data\\\\\";\n            var blockTextureFolderVersion = this.properties.version == \"1.20.1\" ? \"block\" : \"blocks\"\n            var blockTexturesFolder = settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\assets\\\\\" + this.properties.namespace + \"\\\\textures\\\\\" + blockTextureFolderVersion + \"\\\\\";\n\n            // Create the folders if they dont exist\n            var folderList = [objFolder, blockstatesFolder, blockModelsFolder, itemModelsFolder, blockTexturesFolder, dataFolder];\n            var fs = require('fs');\n\n            folderList.forEach(function(folder){\n                if (!fs.existsSync(folder)){\n                    fs.mkdirSync(folder, {recursive: true});\n                }\n            })\n\n            // Create mcmeta file\n            // Format ID is 15 for 1.20.1, 8 for 1.18.2, and 6 for 1.16.5\n            var formatID = this.properties.version == \"1.20.1\" ? 15 : this.properties.version == \"1.18.2\" ? 8 : 6\n            var mcmetaData = {\"pack\" : {\"pack_format\" : formatID, \"description\" : \"Resource Pack for BAMO test files\"}};\n            fs.writeFile(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \"\\\\pack.mcmeta\", JSON.stringify(mcmetaData), \"utf8\", (err) => {if (err != null) {console.log(\"Error generating mcmeta file:\", err);}});\n            zip.file(\"pack.mcmeta\", JSON.stringify(mcmetaData))\n\n            // Generate block name from the displayname\n            var blockName = cleanFileName(this.properties.displayName);\n\n            //generate the list of blocks to be exported\n            var blockList = [];\n\n            var codecData = Format.codec.compile();\n\n            // Custom Block\n            if (this.properties.types.custom){\n                // Pull the model data from the codec\n                var modelData = JSON.parse(codecData);\n                modelData[\"parent\"] = \"block/block\";\n\n                var stateData = \"\";\n                // Create blockstates data\n                if (this.properties.rotType == \"y_axis\"){\n                    stateData = JSON.stringify({\"variants\" : {\"facing=north\" : {\"model\" : this.properties.namespace + \":block/\" + blockName},\n                                                                \"facing=east\" : {\"model\" : this.properties.namespace + \":block/\" + blockName, \"y\": 90},\n                                                                \"facing=south\" : {\"model\" : this.properties.namespace + \":block/\" + blockName, \"y\": 180},\n                                                                \"facing=west\" : {\"model\" : this.properties.namespace + \":block/\" + blockName, \"y\": 270},\n                                                                }})\n                }else{\n                    stateData = JSON.stringify({\"variants\" : {\"\" : {\"model\" : this.properties.namespace + \":block/\" + blockName}}});\n                }\n                \n                var textureData = {}\n\n                // Setup texture dict\n                ns = this.properties.namespace\n                Object.keys(modelData.textures).forEach((key) => {\n                    var comp\n                    var partCheck\n                    if (typeof modelData.textures[key] === 'object'){\n                        comp = modelData.textures[key][\"id\"]\n                        partCheck = modelData.textures[key].particle\n                    }else if (typeof modelData.textures[key] === 'string'){\n                        comp = key\n                        partCheck = (key == \"particle\")\n                    }\n\n                    Texture.all.forEach(function(tx){\n                        if ((tx.id == comp) || (partCheck && tx.particle == true)){\n                            if (tx.namespace == \"\"){\n                                textureData[key] = ns + \":\" + blockTextureFolderVersion + \"/\" + cleanFileName(tx.name.split(\".\")[0]);\n                            }else{\n                                textureData[key] = tx.namespace + \":\" + tx.folder + \"/\" + cleanFileName(tx.name.split(\".\")[0])\n                            } \n                        }\n                    })\n                })\n\n                // Looting file\n                var lootData = genLootTable(this.properties.namespace, blockName)\n                var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + blockName + \".json\"\n\n                fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {recursive: true});\n                fs.writeFile(lootTags, lootData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing custom block looting file:\", err)}});\n                zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\"+ blockName + \".json\", lootData)\n\n                // Stonecutting Table Recipes\n                genStonecuttingRecipes(this.properties, blockName, dataFolder, zip)\n\n                modelData.textures = textureData\n\n                var boxList = [];\n                modelData.elements.forEach((model) =>{\n                    boxList.push([model[\"from\"], model[\"to\"]]);\n                });\n\n                blockList.push({\"name\": blockName, \"types\": [], \"model\": modelData, \"state\": stateData, \"hitbox\": boxList});\n            }\n\n            // Regular Block\n            if (this.properties.types.block){\n                var modelData = {};\n                modelData[\"credit\"] = codecData[\"credit\"];\n                modelData[\"parent\"] = \"block/cube_all\";\n                modelData[\"textures\"] = {\n                    \"all\": dictFromTexture(this.properties.variant.default.all, this.properties.namespace),\n                    \"particle\": dictFromTexture(\"particle\", this.properties.namespace)\n                };\n\n                // Looting file\n                var lootData = genLootTable(this.properties.namespace, blockName)\n                var lootTags = dataFolder + this.properties.namespace  + \"\\\\loot_tables\\\\blocks\\\\\" + blockName + \".json\"\n\n                fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {recursive: true});\n                fs.writeFile(lootTags, lootData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\" + blockName + \".json\", lootData)\n\n                // Stonecutting Table Recipes\n                genStonecuttingRecipes(this.properties, blockName, dataFolder, zip)\n\n                var state = JSON.stringify({\"variants\": {\"\": {\"model\": this.properties.namespace + \":block/\" + blockName}}});\n\n                var typeList = [];\n                if (this.properties.types.stair) typeList.push(\"stairs\");\n                if (this.properties.types.slab) typeList.push(\"slab\");\n                if (this.properties.types.wall) typeList.push(\"wall\");\n\n                blockList.push({\"name\": blockName, \"types\": typeList, \"state\": state, \"model\": modelData, \"hitbox\": []});\n            }\n\n            // Stair Block\n            if (this.properties.types.stair){\n\n                var name = blockName + \"_stairs\";\n\n                var modelData = {};\n                modelData[\"credit\"] = codecData[\"credit\"];\n                modelData[\"parent\"] = \"minecraft:block/stairs\";\n                modelData[\"textures\"] = {\n                    \"top\": dictFromTexture(this.properties.variant.stair.top, this.properties.namespace),\n                    \"bottom\": dictFromTexture(this.properties.variant.stair.bottom, this.properties.namespace), \n                    \"side\": dictFromTexture(this.properties.variant.stair.side, this.properties.namespace),\n                    \"particle\": dictFromTexture(\"particle\", this.properties.namespace)\n                };\n\n\n                // Looting file\n                var lootData = genLootTable(this.properties.namespace, name)\n                var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\"\n\n                fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {recursive: true});\n                fs.writeFile(lootTags, lootData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\"+ name + \".json\", lootData)\n\n                // Stonecutting Table Recipes\n                genStonecuttingRecipes(this.properties, name, dataFolder, zip)\n                \n                // Write state\n                var state = genStairState(this.properties.namespace, \"block/\" + name, \"block/\" + name + \"_outer\", \"block/\" + name + \"_inner\")\n                fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", state, \"utf8\", (err) => {if (err != null) {console.log(\"Error generating blockstate:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", state)\n                // write the 4 stair models\n                // Base\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \".json\", JSON.stringify(modelData))\n                // Item\n                fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing item model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData))\n                // Inner\n                modelData[\"parent\"] = \"minecraft:block/inner_stairs\"\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_inner.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_inner.json\", JSON.stringify(modelData))\n                // Outer\n                modelData[\"parent\"] = \"minecraft:block/outer_stairs\"\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_outer.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_outer.json\", JSON.stringify(modelData))\n            }\n\n            if (this.properties.types.slab){\n\n                var name = blockName + \"_slab\";\n\n                var modelData = {};\n                modelData[\"credit\"] = codecData[\"credit\"];\n                modelData[\"parent\"] = \"minecraft:block/slab\"\n                modelData[\"textures\"] = {\n                    \"top\": dictFromTexture(this.properties.variant.slab.top, this.properties.namespace),\n                    \"bottom\": dictFromTexture(this.properties.variant.slab.bottom, this.properties.namespace), \n                    \"side\": dictFromTexture(this.properties.variant.slab.side, this.properties.namespace),\n                    \"particle\": dictFromTexture(\"particle\", this.properties.namespace)\n                }\n\n                // Looting file\n                var lootData = genLootTable(this.properties.namespace, name)\n                var lootTags = dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\"\n\n                fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {recursive: true});\n                fs.writeFile(lootTags, lootData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\"+ name + \".json\", lootData)\n\n                // Stonecutting Table Recipes\n                genStonecuttingRecipes(this.properties, name, dataFolder, zip)\n\n                // Write State\n                var state = {\"variants\" : {\n                    \"type=bottom\" : {\"model\": this.properties.namespace + \":block/\" + name}, \n                    \"type=double\":{\"model\":this.properties.namespace + \":block/\" + blockName},\n                    \"type=top\": {\"model\": this.properties.namespace + \":block/\" + name + \"_top\"}\n                }}\n                fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", JSON.stringify(state), \"utf8\", (err) => {if (err != null) {console.log(\"Error generating blockstate:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", JSON.stringify(state))\n\n                // Write the 3 slab models\n                // Base\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \".json\", JSON.stringify(modelData))\n                // Item\n                fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing item model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData))\n                // Top\n                modelData[\"parent\"] = \"minecraft:block/slab_top\"\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_top.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_top.json\", JSON.stringify(modelData))\n            }\n\n            if (this.properties.types.wall){\n                var name = blockName + \"_wall\";\n\n                var modelData = {};\n                modelData[\"credit\"] = codecData[\"credit\"];\n                modelData[\"parent\"] = \"minecraft:block/template_wall_post\";\n                modelData[\"textures\"] = {\n                    \"wall\": dictFromTexture(this.properties.variant.wall.wall, this.properties.namespace),\n                    \"particle\": dictFromTexture(\"particle\", this.properties.namespace)\n                }\n\n                // Looting file\n                var lootData = genLootTable(this.properties.namespace, name)\n                var lootTags = dataFolder + this.properties.namespace  + \"\\\\loot_tables\\\\blocks\\\\\" + name + \".json\"\n\n                fs.mkdirSync(dataFolder + this.properties.namespace + \"\\\\loot_tables\\\\blocks\\\\\", {recursive: true});\n                fs.writeFile(lootTags, lootData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/\" + this.properties.namespace + \"/loot_tables/blocks/\"+ name + \".json\", lootData)\n\n                // Stonecutting Table Recipes\n                genStonecuttingRecipes(this.properties, name, dataFolder, zip)\n\n                // Write State\n                var state = genWallState(this.properties.namespace, \"block/\" + name + \"_post\", \"block/\" + name + \"_side\", \"block/\" + name + \"_side_tall\")\n                fs.writeFile(blockstatesFolder + \"\\\\\" + name + \".json\", state, \"utf8\", (err) => {if (err != null) {console.log(\"Error generating blockstate:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + name + \".json\", state)\n\n                // Write the 4  wall models\n                // Base\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_post.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_post.json\", JSON.stringify(modelData))\n                // Item\n                modelData[\"parent\"] = \"minecraft:block/wall_inventory\"\n                fs.writeFile(itemModelsFolder + \"\\\\\" + name + \".json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing item model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + name + \".json\", JSON.stringify(modelData))\n                // Side\n                modelData[\"parent\"] = \"minecraft:block/template_wall_side\"\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_side.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_side.json\", JSON.stringify(modelData))\n                // Side Tall\n                modelData[\"parent\"] = \"minecraft:block/template_wall_side_tall\"\n                fs.writeFile(blockModelsFolder + \"\\\\\" + name + \"_side_tall.json\", JSON.stringify(modelData), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing item model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + name + \"_side_tall.json\", JSON.stringify(modelData))\n\n                // Deal with the tags\n                var wallTags = dataFolder + \"minecraft\\\\tags\\\\blocks\\\\walls.json\"\n                var tagVal = this.properties.namespace + \":\" + name\n\n                fs.mkdirSync(dataFolder + \"minecraft\\\\tags\\\\blocks\\\\\", {recursive: true});\n                var tagData = {\"replace\" : false, \"values\": [tagVal]};\n\n                fs.writeFile(wallTags, JSON.stringify(tagData), \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/minecraft/tags/blocks/walls.json\", JSON.stringify(tagData))\n            }\n\n            var modelData = JSON.parse(codecData);\n            var ns = this.properties.namespace\n            var animated = this.properties.animated\n            // Copy texture files\n            Texture.all.forEach(function(tx){\n                var image;\n                if (tx.namespace != \"minecraft\"){\n                    if (tx.img.currentSrc.slice(0, 4) == \"data\"){\n                        image = nativeImage.createFromDataURL(tx.img.currentSrc).toPNG();\n                    }else if(tx.img.currentSrc.slice(0, 4) == \"file\"){\n                        image = nativeImage.createFromPath(tx.source.replace(/\\?\\d+$/, '')).toPNG();\n                    }\n        \n                    fs.writeFile(blockTexturesFolder + \"\\\\\" + cleanFileName(tx.name), image, (err) => {if (err != null) {console.log(\"Error Found writing texture data:\", err);}});\n                    zip.file(\"assets/\" + ns + \"/textures/\" + blockTextureFolderVersion + \"/\" + cleanFileName(tx.name), image)\n                    if (animated){\n                        fs.writeFile(blockTexturesFolder + \"\\\\\" + cleanFileName(tx.name) + \".mcmeta\", '{\"animation\" : {}}', (err) => {if (err != null) {console.log(\"Error Found writing animation data:\", err);}})\n                        zip.file(\"assets/\" + ns + \"/textures/\" + blockTextureFolderVersion + \"/\" + cleanFileName(tx.name) + \".mcmeta\", '{\"animation\" : {}}')\n                    }\n                }\n            })\n\n            /*console.log(\"Block List:\")\n            console.log(blockList)*/\n\n            blockList.forEach(block => {\n\n                // Generate Mining file\n                var mineableData = genMineableTag(this.properties.namespace, block[\"name\"], block[\"types\"])\n                var mineableTags = dataFolder + \"minecraft\\\\tags\\\\blocks\\\\mineable\\\\pickaxe.json\"\n\n                fs.mkdirSync(dataFolder + \"minecraft\\\\tags\\\\blocks\\\\mineable\", {recursive: true});\n                fs.writeFile(mineableTags, mineableData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing wall tags:\", err)}});\n                zip.file(\"data/minecraft/tags/blocks/mineable/pickaxe.json\", mineableData)\n\n                // Write state file\n                fs.writeFile(blockstatesFolder + \"\\\\\" + block[\"name\"] + \".json\", block[\"state\"], \"utf8\", (err) => {if (err != null) {console.log(\"Error generating blockstate:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/blockstates/\" + block[\"name\"] + \".json\", block[\"state\"])\n\n                // Write model files\n                fs.writeFile(blockModelsFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing block model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/block/\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]))\n                fs.writeFile(itemModelsFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]), \"utf8\", err => {if (err != null) {console.log(\"Error Found writing item model data:\", err);}});\n                zip.file(\"assets/\" + this.properties.namespace + \"/models/item/\" + block[\"name\"] + \".json\", JSON.stringify(block[\"model\"]))\n                \n                // Write block properties file\n                var data = {\n                    \"displayName\" : this.properties.displayName.replace(/[^a-zA-Z\\d\\s._]/g, ''), \n                    \"typeList\" : block[\"types\"],\n                    \"material\" : this.properties.material,\n                    \"blastRes\" : this.properties.blastRes,\n                    \"slip\" : this.properties.slip,\n                    \"gravity\" : this.properties.gravity,\n                    \"rotType\" : this.properties.rotType,\n                    \"sounds\" : this.properties.sounds,\n                    \"lum\" : this.properties.lum,\n                    \"maxStack\" : this.properties.maxStack,\n                    \"fireproof\" : this.properties.fireproof,\n                    \"creativeTab\" : this.properties.creativeTab,\n                    \"transparency\": this.properties.transparency,\n                    \"hitbox\": block[\"hitbox\"],\n                    \"hitboxBuffer\": (this.properties.bufferedHitbox ? this.properties.hitboxBuffer.toString() : \"\"),\n                    \"blockType\" : this.properties.types.customType,\n                    \"particleType\": (this.properties.particles ? this.properties.particleType : \"\"),\n                    \"particlePos\": [this.properties.particlePos.x / 16.0, this.properties.particlePos.y / 16.0, this.properties.particlePos.z / 16.0],\n                    \"particleSpread\": [this.properties.particleSpread.x / 8.0, this.properties.particleSpread.y / 8.0, this.properties.particleSpread.z / 8.0],\n                    \"particleVel\": [this.properties.particleVel.x, this.properties.particleVel.y, this.properties.particleVel.z],\n                    \"nameGenType\" : \"3.3\" // Allows for names where \" \" is replaced with \"_\" to coexist with the older \"\" system\n                };\n\n                fs.writeFile(objFolder + \"\\\\\" + block[\"name\"] + \".json\", JSON.stringify(data), \"utf8\", err => {if (err != null) {console.log(\"Error writing block properties:\", err);}});\n                zip.file(\"objects/\" + block[\"name\"] + \".json\", JSON.stringify(data))\n\n                /*console.log(\"Object File Contents:\")\n                console.log(data)*/\n            })\n\n            zip.generateAsync({type:\"nodebuffer\"})\n            .then(function (content) {\n                fs.writeFile(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName + \".zip\", content, err => {});\n            });\n\n            fs.rm(settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName, {recursive: true}, err => {});\n\n            console.log(\"BAMO data saved in folder at location \" + settings.minecraftFolder.value + \"\\\\bamopacks\\\\\" + packName)\n            \n\n            let e = open_interface;\n            e.hide();\n        },\n    },\n    watch: {\n        properties: {\n            handler: function(val){\n                if (this.swap == false){\n                    Project.saved = false;\n                }else{\n                    this.swap = false\n                }\n            },\n            deep: true\n        }\n    }\n}\n</script>\n\n<template>\n    <div>\n        <BamoAdvancedProperties></BamoAdvancedProperties>\n    </div>\n</template>\n"
  },
  {
    "path": "plugins/bamo/src/src/components/ComponentTemplate.html",
    "content": ""
  },
  {
    "path": "plugins/bamo/src/src/components/bamo.css",
    "content": "\n#BAMO .dialog_content {\n    margin: 0;\n} \n\n#BAMO .wizardWrapper {\n    display: flex; \n    flex-direction: row;\n    height: 100%;\n} \n\n#BAMO .wizardPage {\n    width: 100%; \n    padding: 12px 20px;\n} \n\n#BAMO .headerLabel {\n    font-size: 20px; \n    display: inline-block\n} \n\n#BAMO .headerDescription {\n    color: white;\n} \n\n#BAMO input[type='text'] {\n    display: block; \n    width: 100%; \n    height: auto; \n    padding: 4px 8px; \n    border: 1px solid black;\n} \n\n#BAMO input[type='number']{\n    display: inline-block; \n    width: 50px; \n    height: auto; \n    border: 1px solid black; \n    padding-left: 4px; \n    margin-right: 8px; \n    text-align: right;\n} \n\n#BAMO input[type='checkbox'] {\n    padding-right: 8px;\n} \n\n#BAMO select {\n    width: 100%; \n    height: auto; \n    padding: 4px 8px;\n    border: 1px solid black; \n} \n\n#BAMOsideBar {\n    border-right: 2px solid black;\n    width: 175px;\n} \n\n#BAMOsideBar li {\n    width: 100%; \n    padding: 8px 20px; \n    cursor: pointer;\n} \n\n#BAMOsideBar li.selected {\n    width: 100%; \n    padding: 8px 20px; \n    border-right: 4px solid green; \n    cursor: default;\n    background-color: gray;\n} \n\n#BAMOsideBar li.sideBarHeader {\n    width: 100%;\n    padding: 2px 10px;\n    font-size: 12px;\n    cursor: default;\n}\n\nul.settingsList li {\n    padding: 8px 0;\n}\n\t"
  },
  {
    "path": "plugins/bamo/src/src/main.js",
    "content": "import BamoBaseComponent from './components/BamoBaseComponent.vue';\nimport codec, { loadCodec, unloadCodec } from './util/Codec';\nimport bamoSettings, {BAMO_SETTINGS_DEFAULT} from './util/Settings';\nconst css = require('./components/bamo.css').toString();\n\nlet btn;\nlet exportWindow;\nlet cssData;\nlet minecraftFolder;\n\nPlugin.register('bamo', {\n\ttitle: 'BAMO Exporter',\n\tauthor: 'Ryytikki',\n\tdescription: 'Create custom Minecraft blocks without having to write a single line of code when paired with the BAMO mod. https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on',\n\twebsite: \"https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on\",\n\ticon: 'icon.png',\n\ttags: ['Minecraft: Java Edition'],\n\tversion: '0.5.1',\n\tvariant: 'desktop',\n\tnew_repository_format : true,\n\t\n\tonload() {\n\n\t\tloadCodec();\n\n\t\t// Setting that holds the resource pack folder location\n\t\tminecraftFolder = new Setting('minecraftFolder', {\n\t\t\tname : 'Minecraft Folder Location',\n\t\t\tdescription: 'Location of the Minecraft folder on your PC',\n\t\t\tcategory: 'export',\n\t\t\ttype: 'text',\n\t\t\tvalue: ''\n\t\t});\n\n\t\t// Export button in menu\n\t\tbtn = new Action('bamo', {\n\t\t\tname: 'BAMO Exporter',\n\t\t\tdescription: 'Exports a block for the BAMO mod',\n\t\t\ticon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAN6SURBVDhPJZJrTJtVGMd/b99CYUOgLTA6oKV1HWvHitwnGyZzW7INw5RIXBbjjJc598WpM+oXxz6a+JFETVzch8XEaGKcM9lCNIToqGDHTSiXAV2h5VZKW6illPb1fV/Pyck5Oec5z/O/PMKHv5yVtFotO7spIpENQMBYYSQ4HcBgMGAymViPhIlFo5ABnU5HPB5naWkJh8OBBo1ANBPDrCvBnm/GVWlnpmOUwnI9ceFf/n7kwWU8QH15NXvy84ilN9XENpuNdG4GjbPKxmzHEFXHqvhne5bJ2BOyCrIoOFhI5PISznonvpw1BEGg9dkGNt5dxpfwkyzcYfHyHMIZa4nkuPQR499+jiaZQ/2fzYy1PUIryuA0GvZ069l8aRlzn5OpE4O0nj2Ce8CPLkvkiMuEcOfjDmlsch67rZzW6krevvEDV187zvjcMjnZWoaGAghPCaRCcawXr5E99B2NLju37g1Qbd2HaCnK6xqZX6PWXsZMcJ1cXZqSIj0PBqbwr0ZIaTLUHSxDX5yP5/d7WCtMzAbWKTXkceH5GoSRL69Id3qG2N7ZJZNMYLlwk+CPN8nK3cvrZ+rZTWf45tdB9azQUs7Nhy0MjPupshQjZglSl+wdb5xr4PDTZYRHethv2kcoKjswtYgki3ffPUVR4V4WQjE240kCa1EanRWk0xLi1fbmrpXwFsOPg2rwuG8di0lPdCvBqKyDIM+2FgeSBF7fKhkpoyJ5MDBNtlZEtBbnd9UfKqdncEYOhWxZ3d88j1X+TY4KNXg2EGI5vKm+XTz1jCxeKcGlVVxVZrmR5KHwVBR99XStKkx5cQHd751XkfR5JnmrrVFd7okFxmQUD0emKeu8gXfah3D7+ouSYpmSRBElntjhVN0Bvvi+j9O1ZnrFFo4m+siI2QRWo/wx5uPNF5oYlJNMBGMIn3a2SO4JP++cP8rDUR819lI2EylO1Nj46q4bfa4GSdSxlUhSmJerAFbpXGlvVotqFPuUz57JRWS6DAdSBFc26Pf6Oeaykkhr6B2e4/orz6n79k6Kay8fp3dkHrd3AeHW++3S5JNVFdrtTzr5+ud+vAsh6ioN9HmXZS3a1ardP/VzssHOX7L/SpKGQxXqvdjWZO8KhqJ8dukk92UnzKUGtOkkxnMfYAyPEk2mZUeiaqMtrESotpWyv6iA/4vO8x8IAITQHDgPDwAAAABJRU5ErkJggg==',\n\t\t\tclick: function () {\n\t\t\t\tif (Project.name != undefined){\n\t\t\t\t\tif (Texture.all.length == 0){\n\t\t\t\t\t\tBlockbench.showMessageBox({buttons: [\"Ok\"], title: \"Error\", message: \"Please create a texture\"});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// If the bamoSettings for the file havent been generated, generate\n\t\t\t\t\tif (typeof bamoSettings[Project.uuid] !== 'object'){\n\t\t\t\t\t\tbamoSettings[Project.uuid] = Object.assign({}, BAMO_SETTINGS_DEFAULT);\n        \t\t\t\tbamoSettings[Project.uuid].displayName = Project.name\n\t\t\t\t\t}\n\t\t\t\t\t\n\n\t\t\t\t\tif ((Settings.get('minecraftFolder') != undefined) && (Settings.get('minecraftFolder') != '')){\n\t\t\t\t\t\texportWindow.show();\n\t\t\t\t\t\texportWindow.content_vue.updateValues()\n\t\t\t\t\t}else{\n\t\t\t\t\t\tBlockbench.showMessageBox({buttons: [\"Ok\"], title: \"Error\", message: \"You must set your Minecraft folder location under Settings->Export\"});\n\t\t\t\t\t}\n\t\t\t\t}else{\n\t\t\t\t\tBlockbench.showMessageBox({buttons: [\"Ok\"], title: \"Error\", message: \"Please ensure your file is saved before exporting. If you see this for a saved file, reload it and try again\"});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tMenuBar.addAction(btn, 'tools');\n\n\t\t// Dialog that opens when you click the button1\n\t\t// See the BamoComponent object for details\n\t\texportWindow = new Dialog('BAMOExportWindow', {\n\t\t\tid: \"BAMO\",\n\t\t\ttitle: 'BAMO Exporter',\n\t\t\tcomponent: BamoBaseComponent,\n\t\t\tbuttons: [],\n\t\t\tpadding: !1,\n\t\t\twidth: 720,\n\t\t\theight: 620,\n\t\t});\n\n\t\tcssData = Blockbench.addCSS(css);\n\t},\n\n\tonunload() {\n\t\tbtn.delete();\n\t\tminecraftFolder.delete();\n\t\t//cssData.delete();\n\t\tunloadCodec();\n\t}\n});\n"
  },
  {
    "path": "plugins/bamo/src/src/util/Codec.js",
    "content": "import bamoSettings, { BAMO_SETTINGS_DEFAULT } from \"./Settings\";\n\nexport function loadCodec(){\n    Codecs.project.on('compile', onProjectCompile);\n    Codecs.project.on('parse', onProjectParse);\n    Blockbench.on('close_project', onCloseProject);\n}\n\nexport function unloadCodec(){\n    Codecs.project.events.compile.remove(onProjectCompile)\n    Codecs.project.events.parse.remove(onProjectParse)\n    format.delete();\n}\n\nfunction onProjectCompile(e){\n    if (format.id !== \"bamo_model\") return;\n    e.model.bamoSettings = bamoSettings[Project.uuid];\n}\n\nfunction onProjectParse(e){\n\tif (format.id !== \"bamo_model\") return;\n\n    if (e.model && typeof e.model.bamoSettings === 'object'){\n        let placeholder = Object.assign({}, BAMO_SETTINGS_DEFAULT);\n        bamoSettings[Project.uuid] = Object.assign(placeholder, e.model.bamoSettings);\n    }else{\n        bamoSettings[Project.uuid] = Object.assign({}, BAMO_SETTINGS_DEFAULT);\n        bamoSettings[Project.uuid].displayName = Project.name\n    }\n    console.log(bamoSettings[Project.uuid]);\n}\n\nfunction onCloseProject(){\n\tif (format.id !== \"bamo_model\") return;\n    delete bamoSettings[Project.uuid]\n}\n\nvar codec = Codecs.java_block;\n\nvar format = new ModelFormat({\n    id: \"bamo_model\",\n    name: \"BAMO model\",\n    category: \"minecraft\",\n    description: \"A format for storing models to be exported for the BAMO mod\",\n    icon: \"view_in_ar\",\n    target: 'Minecraft: Java Edition',\n\tformat_page: {\n\t\tcontent: [\n\t\t\t{type: 'h3', text: tl('mode.start.format.informations')},\n\t\t\t{text: `* ${tl('format.java_block.info.rotation')}\n\t\t\t\t\t* ${tl('format.java_block.info.size')}\n\t\t\t\t\t* ${tl('format.java_block.info.animation')}`.replace(/\\t+/g, '')\n\t\t\t}\n\t\t]\n\t},\n\trender_sides() {\n\t\tif (Modes.display && ['thirdperson_righthand', 'thirdperson_lefthand', 'head'].includes(display_slot)) {\n\t\t\treturn 'double';\n\t\t} else {\n\t\t\treturn 'front';\n\t\t}\n\t},\n    model_identifier: false,\n\tparent_model_id: true,\n\tvertex_color_ambient_occlusion: true,\n\trotate_cubes: true,\n\trotation_limit: true,\n\toptional_box_uv: true,\n\tuv_rotation: true,\n\tjava_face_properties: true,\n\tanimated_textures: true,\n\tselect_texture_for_particles: true,\n\tdisplay_mode: true,\n\ttexture_folder: true,\n    cube_size_limiter: {\n\t\tcoordinate_limits: [-16, 32],\n\t\ttest(cube, values = 0) {\n\t\t\tlet from = values.from || cube.from;\n\t\t\tlet to = values.to || cube.to;\n\t\t\tlet inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n\n\t\t\treturn undefined !== from.find((v, i) => {\n\t\t\t\treturn (\n\t\t\t\t\tto[i] + inflate > 32 ||\n\t\t\t\t\tto[i] + inflate < -16 ||\n\t\t\t\t\tfrom[i] - inflate > 32 ||\n\t\t\t\t\tfrom[i] - inflate < -16\n\t\t\t\t)\n\t\t\t})\n\t\t},\n\t\tmove(cube, values = 0) {\n\t\t\tlet from = values.from || cube.from;\n\t\t\tlet to = values.to || cube.to;\n\t\t\tlet inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n\t\t\t\n\t\t\t[0, 1, 2].forEach((ax) => {\n\t\t\t\tvar overlap = to[ax] + inflate - 32\n\t\t\t\tif (overlap > 0) {\n\t\t\t\t\t//If positive site overlaps\n\t\t\t\t\tfrom[ax] -= overlap\n\t\t\t\t\tto[ax] -= overlap\n\n\t\t\t\t\tif (16 + from[ax] - inflate < 0) {\n\t\t\t\t\t\tfrom[ax] = -16 + inflate\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toverlap = from[ax] - inflate + 16\n\t\t\t\t\tif (overlap < 0) {\n\t\t\t\t\t\tfrom[ax] -= overlap\n\t\t\t\t\t\tto[ax] -= overlap\n\n\t\t\t\t\t\tif (to[ax] + inflate > 32) {\n\t\t\t\t\t\t\tto[ax] = 32 - inflate\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tclamp(cube, values = 0) {\n\t\t\tlet from = values.from || cube.from;\n\t\t\tlet to = values.to || cube.to;\n\t\t\tlet inflate = values.inflate == undefined ? cube.inflate : values.inflate;\n\t\t\t\n\t\t\t[0, 1, 2].forEach((ax) => {\n\t\t\t\tfrom[ax] = Math.clamp(from[ax] - inflate, -16, 32) + inflate;\n\t\t\t\tto[ax] = Math.clamp(to[ax] + inflate, -16, 32) - inflate;\n\t\t\t})\n\t\t}\n\t},\n    codec: codec\n});\n\nexport default codec"
  },
  {
    "path": "plugins/bamo/src/src/util/GenDataFiles.js",
    "content": "export function genLootTable(namespace, block){\n\n        return  `{\n    \"type\": \"minecraft:block\",\n    \"pools\": [\n        {\n            \"rolls\": 1,\n            \"entries\": [\n                {\n                    \"type\": \"minecraft:item\",\n                    \"name\": \"${namespace}:${block}\"\n                }\n            ],\n            \"conditions\": []\n        }\n    ]\n}`\n\n}\n\nexport function genMineableTag(namespace, block, variants){\n    if (variants.length == 0){\n        return `{\n    \"replace\": false,\n    \"values\": [\n        \"${namespace}:${block}\"\n    ]\n}`\n\n    }else{\n\n        var tagValues = [`${namespace}:${block}`]\n        variants.forEach(function(v){\n            tagValues.push(`${namespace}:${block}_${v}`)\n        })\n\n        var data = {\n            \"replace\": false,\n            \"values\": tagValues\n        }\n\n        return JSON.stringify(data)\n    }\n    \n}\n\nexport function genStonecuttingRecipes(properties, blockName, dataFolder, zip){\n    console.log(properties)\n    if (properties.genScRecipe){\n        var stData = genStonecuttingRecipe(properties.namespace, blockName)\n        var stDir = dataFolder + properties.namespace + \"\\\\recipes\\\\\"\n\n        fs.mkdirSync(stDir, {recursive: true})\n        fs.writeFile(stDir + blockName + \".json\", stData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing custom block stonecutting recipe:\", err)}});\n        zip.file(\"data/\" + properties.namespace + \"/recipes/\" + blockName + \".json\", stData)\n    }\n\n    if (properties.genReversableScRecipe){\n        var stData = genStonecuttingReverseRecipe(properties.namespace, blockName)\n        var stDir = dataFolder + properties.namespace + \"\\\\recipes\\\\\"\n\n        fs.mkdirSync(stDir, {recursive: true})\n        fs.writeFile(stDir + blockName + \"_rv.json\", stData, \"utf8\", err => {if (err != null) {console.log(\"Error found when writing custom block stonecutting recipe:\", err)}});\n        zip.file(\"data/\" + properties.namespace + \"/recipes/\" + blockName + \"_rv.json\", stData)\n    }\n\n\n    \n}\n\nexport function genStonecuttingRecipe(namespace, block){\n    return `\n    {\n        \"type\": \"minecraft:stonecutting\",\n        \"ingredient\": {\n            \"item\": \"bamo:bamo_crate\"\n        },\n        \"result\": \"${namespace}:${block}\",\n        \"count\": 1\n    }`\n}\n\nexport function genStonecuttingReverseRecipe(namespace, block){\n    return `\n    {\n        \"type\": \"minecraft:stonecutting\",\n        \"ingredient\": {\n            \"item\": \"${namespace}:${block}\"\n        },\n        \"result\": \"bamo:bamo_crate\",\n        \"count\": 1\n    }`\n}"
  },
  {
    "path": "plugins/bamo/src/src/util/GenStates.js",
    "content": "export function genStairState(namespace, model, outer, inner){\n    return `\n    {\n        \"variants\": {\n            \"facing=east,half=bottom,shape=straight\": { \"model\": \"${namespace}:${model}\" },\n            \"facing=west,half=bottom,shape=straight\": { \"model\": \"${namespace}:${model}\", \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=bottom,shape=straight\": { \"model\": \"${namespace}:${model}\", \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=bottom,shape=straight\": { \"model\": \"${namespace}:${model}\", \"y\": 270, \"uvlock\": true },\n\n            \"facing=east,half=top,shape=straight\": { \"model\": \"${namespace}:${model}\", \"x\": 180, \"uvlock\": true },\n            \"facing=west,half=top,shape=straight\": { \"model\": \"${namespace}:${model}\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=top,shape=straight\": { \"model\": \"${namespace}:${model}\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=top,shape=straight\": { \"model\": \"${namespace}:${model}\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n            \n            \"facing=east,half=bottom,shape=outer_right\": { \"model\": \"${namespace}:${outer}\" },\n            \"facing=west,half=bottom,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=bottom,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=bottom,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"y\": 270, \"uvlock\": true },\n\n            \"facing=east,half=bottom,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"y\": 270, \"uvlock\": true },\n            \"facing=west,half=bottom,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"y\": 90, \"uvlock\": true },\n            \"facing=south,half=bottom,shape=outer_left\": { \"model\": \"${namespace}:${outer}\" },\n            \"facing=north,half=bottom,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"y\": 180, \"uvlock\": true },\n\n            \"facing=east,half=bottom,shape=inner_right\": { \"model\": \"${namespace}:${inner}\" },\n            \"facing=west,half=bottom,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=bottom,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=bottom,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"y\": 270, \"uvlock\": true },\n\n            \"facing=east,half=bottom,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"y\": 270, \"uvlock\": true },\n            \"facing=west,half=bottom,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"y\": 90, \"uvlock\": true },\n            \"facing=south,half=bottom,shape=inner_left\": { \"model\": \"${namespace}:${inner}\" },\n            \"facing=north,half=bottom,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"y\": 180, \"uvlock\": true },\n           \n            \"facing=east,half=top,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"uvlock\": true },\n            \"facing=west,half=top,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=top,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=top,shape=outer_left\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n\n            \"facing=east,half=top,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n            \"facing=west,half=top,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n            \"facing=south,half=top,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n            \"facing=north,half=top,shape=outer_right\": { \"model\": \"${namespace}:${outer}\", \"x\": 180, \"uvlock\": true },\n\n            \"facing=east,half=top,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"uvlock\": true },\n            \"facing=west,half=top,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n            \"facing=south,half=top,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n            \"facing=north,half=top,shape=inner_left\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n\n            \"facing=east,half=top,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 90, \"uvlock\": true },\n            \"facing=west,half=top,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 270, \"uvlock\": true },\n            \"facing=south,half=top,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"y\": 180, \"uvlock\": true },\n            \"facing=north,half=top,shape=inner_right\": { \"model\": \"${namespace}:${inner}\", \"x\": 180, \"uvlock\": true }\n        }\n    }`\n}\n\nexport function genWallState(namespace, post, side, tall){\n    return `{\n        \"multipart\":[\n            {\"when\":{\"up\":\"true\"},\"apply\":{\"model\":\"${namespace}:${post}\"}},\n            {\"when\":{\"north\":\"low\"},\"apply\":{\"model\":\"${namespace}:${side}\",\"uvlock\":true}},\n            {\"when\":{\"east\":\"low\"},\"apply\":{\"model\":\"${namespace}:${side}\",\"y\":90,\"uvlock\":true}},\n            {\"when\":{\"south\":\"low\"},\"apply\":{\"model\":\"${namespace}:${side}\",\"y\":180,\"uvlock\":true}},\n            {\"when\":{\"west\":\"low\"},\"apply\":{\"model\":\"${namespace}:${side}\",\"y\":270,\"uvlock\":true}},\n            {\"when\":{\"north\":\"tall\"},\"apply\":{\"model\":\"${namespace}:${tall}\",\"uvlock\":true}},\n            {\"when\":{\"east\":\"tall\"},\"apply\":{\"model\":\"${namespace}:${tall}\",\"y\":90,\"uvlock\":true}},\n            {\"when\":{\"south\":\"tall\"},\"apply\":{\"model\":\"${namespace}:${tall}\",\"y\":180,\"uvlock\":true}},\n            {\"when\":{\"west\":\"tall\"},\"apply\":{\"model\":\"${namespace}:${tall}\",\"y\":270,\"uvlock\":true}}\n        ]\n    }`\n}"
  },
  {
    "path": "plugins/bamo/src/src/util/OptionArrays.js",
    "content": "export const rotationTypes = [\n    \"default\",\n    //\"axis\",\n    //\"y_axis_player\",\n    \"y_axis\",\n    //\"all_player\",\n    //\"all\",\n];\n\nexport const soundOptions = [\n    \"Grass\",\n    \"Glass\",\n    \"Gravel\",\n    \"Honey\",\n    \"Metal\",\n    \"Sand\",\n    \"Snow\",\n    \"Stone\",\n    \"Wool\",\n    \"Wood\",\n    \"Ancient Debris\",\n    \"Anvil\",\n    \"Bamboo\",\n    \"Bamboo Sapling\",\n    \"Basalt\",\n    \"Bone Brick\",\n    \"Chain\",\n    \"Coral Block\",\n    \"Crop\",\n    \"Fungus\",\n    \"Gilded Blackstone\",\n    \"Hard Crop\",\n    \"Ladder\",\n    \"Lantern\",\n    \"Lily Pad\",\n    \"Lodestone\",\n    \"Netherite Block\",\n    \"Netherrack\",\n    \"Nether Bricks\",\n    \"Nether Gold Ore\",\n    \"Nether Ore\",\n    \"Nether Sprouts\",\n    \"Nether Wart\",\n    \"Nylium\",\n    \"Roots\",\n    \"Scaffolding\",\n    \"Shroomlight\",\n    \"Slime Block\",\n    \"Soul Sand\",\n    \"Stem\",\n    \"Sweet Berry Bush\",\n    \"Twisting Vines\",\n    \"Vine\",\n    \"Wart Block\",\n    \"Weeping Vines\",\n    \"Wet Grass\"\n];\n\nexport const materialOptions = [\n    \"Dirt\",        \n    \"Air\",\n    \"Bamboo\",\n    \"Bamboo Sapling\",\n    \"Barrier\",\n    \"Bubble Column\",\n    \"Buildable Glass\",\n    \"Cactus\",\n    \"Cake\",\n    \"Clay\",\n    \"Coral\",\n    \"Cloth Decoration\",\n    \"Decoration\",\n    \"Egg\",\n    \"Explosive\",\n    \"Fire\",\n    \"Glass\",\n    \"Grass\",\n    \"Heavy Metal\",\n    \"Ice\",\n    \"Ice Solid\",\n    \"Lava\",\n    \"Leaves\",\n    \"Metal\",\n    \"Nether Wood\",\n    \"Piston\",\n    \"Plant\",\n    \"Portal\",\n    \"Replaceable Plant\",\n    \"Replaceable Fireproof Plant\",\n    \"Replaceable Water Plant\",\n    \"Sand\",\n    \"Shulker Shell\",\n    \"Snow\",\n    \"Sponge\",\n    \"Stone\",\n    \"Structural Air\",\n    \"Top Snow\",\n    \"Vegetable\",\n    \"Water\",\n    \"Water Plant\",\n    \"Web\",\n    \"Wood\",\n    \"Wool\"\n];\n\nexport const transparencyOptions = [\n    \"Solid\",\n    \"Translucent\",\n    \"Cutout\",\n    \"Cutout (Mipped)\"\n];\n\nexport const tabOptions = [\n    \"Building Blocks\",\n    \"Brewing\",\n    \"Combat\",\n    \"Food\",\n    \"Decorations\",\n    \"Misc\",\n    \"Redstone\",\n    \"Tools\",\n    \"Transportation\"\n];\n\nexport const particleOptions = [\n    \"Ambient Entity Effect\",\n    \"Angry Villager\",\n    \"Ash\",\n    \"Bubble\",\n    \"Bubble Pop\",\n    \"Campfire Smoke\",\n    \"Cloud\",\n    \"Composter\",\n    \"Crimson Spore\",\n    \"Crit\",\n    \"Damage Indicator\",\n    \"Dolphin\",\n    \"Dripping Dripstone Lava\",\n    \"Dripping Dripstone Water\",\n    \"Dripping Honey\",\n    \"Dripping Lava\",\n    \"Dripping Obsidian Tear\",\n    \"Dripping Water\",\n    \"Elder Guardian\",\n    \"Electric Spark\",\n    \"Enchant\",\n    \"Enchanted Hit\",\n    \"End Rod\",\n    \"Entity Effect\",\n    \"Explosion\",\n    \"Falling Dripstone Lava\",\n    \"Falling Dripstone Water\",\n    \"Falling Honey\",\n    \"Falling Lava\",\n    \"Falling Nectar\",\n    \"Falling Obsidian Tear\",\n    \"Falling Spore Blossom\",\n    \"Falling Water\",\n    \"Firework\",\n    \"Fishing\",\n    \"Flame\",\n    \"Flash\",\n    \"Glow\",\n    \"Glow Squid Ink\",\n    \"Happy Villager\",\n    \"Heart\",\n    \"Slime Item\",\n    \"Snowball item\",\n    \"Landing Honey\",\n    \"Landing Lava\",\n    \"Landing Obsidian Tear\",\n    \"Lava\",\n    \"Mycelium\",\n    \"Nautilus\",\n    \"Note\",\n    \"Rain\",\n    \"Reverse Portal\",\n    \"Scrape\",\n    \"Small Flame\",\n    \"Snowflake\",\n    \"Soul\",\n    \"Soulfire Flame\",\n    \"Spore Blossom Air\",\n    \"Sweep Attack\",\n    \"Totem of Undying\",\n    \"Undewater\",\n    \"Warped Spore\",\n    \"Wax off\",\n    \"Wax On\",\n    \"White Ash\",\n    \"Witch\",\n\n];\n\nexport const customTypeOptions = [\"Default\", \"Flower\"];\n\nexport default {rotationTypes, soundOptions, materialOptions, transparencyOptions, tabOptions, customTypeOptions};"
  },
  {
    "path": "plugins/bamo/src/src/util/Settings.js",
    "content": "export const BAMO_SETTINGS_DEFAULT = {\n    displayName: \"\",\n    namespace: \"bamo\",\n    version: \"1.20.1\",\n    typeList: [],\n    material: \"Dirt\",\n    blastRes: 6,\n    slip: 0.6,\n    gravity: false,\n    rotType: \"default\",\n    sounds: \"Grass\",\n    lum: 0,\n    maxStack: 64,\n    fireproof: true,\n    creativeTab: \"Building Blocks\",\n    transparency: \"Solid\",\n    blockType: \"Default\",\n    types: {\n        custom: true,\n        customType: \"Default\",\n        block: false,\n        stair: false,\n        slab: false,\n        wall: false,\n    },\n    variant: {\n        default:{\n            all: \"\",\n        },\n        stair: {\n            top: \"\",\n            bottom: \"\",\n            side: \"\",\n            particle: \"\"\n        },\n        slab: {\n            top: \"\",\n            bottom: \"\",\n            side: \"\",\n            particle: \"\"\n        },\n        wall: {\n            wall: \"\",\n            particle: \"\"\n        }\n    },\n    particles: false,\n    particleType: \"Rain\",\n    particlePos: {\n        x: 8,\n        y: 8,\n        z: 8\n    },\n    particleSpread:{\n        x: 1,\n        y: 1,\n        z: 1\n    },\n    particleVel: {\n        x: 0.1,\n        y: 0.1,\n        z: 0.1\n    },\n    bufferedHitbox: true,\n    hitboxBuffer: 0.5,\n    genScRecipe: true,\n    genReversableScRecipe: true,\n    animated: false\n};\n\nObject.freeze(BAMO_SETTINGS_DEFAULT);\n\nlet bamoSettings = {}\nbamoSettings[\"\"] =  Object.assign({}, BAMO_SETTINGS_DEFAULT);\n\nexport default bamoSettings\n\n"
  },
  {
    "path": "plugins/bamo/src/src/util/Utils.js",
    "content": "export function dictFromTexture(image, ns, name){\n    var ret = \"\"\n    Texture.all.forEach(function(tx){\n        if ((tx.name == image) || (image == \"particle\" && tx.particle == true)){\n            if (tx.namespace == \"\"){\n                ret = ns + \":blocks/\" + name + \"_\" + cleanFileName(tx.name.split(\".\")[0])\n            }else{\n                ret = tx.namespace + \":\" + tx.folder + \"/\" + cleanFileName(tx.name.split(\".\")[0])\n            }\n        }\n    })\n\n    return ret\n}\n\nexport function cleanFileName(name){\n    return name.replace(/[^a-zA-Z\\d\\s._]/g, '').replace(/\\s+/g, \"_\").toLowerCase()\n}"
  },
  {
    "path": "plugins/bamo/src/webpack.config.js",
    "content": "const PathModule = require('path');\nconst { VueLoaderPlugin } = require(\"vue-loader\");\nconst path = require(\"path\");\n\nmodule.exports = {\n\tmode: 'development',\n\tdevtool: 'source-map',\n\ttarget: 'node',\n\tentry: './src/main.js',\n\toutput: {\n\t\tfilename: 'bamo.js',\n\t},\n\tmodule: {\n\t\trules: [\n\t\t\t{\n\t\t\t\ttest: /\\.js$/,\n\t\t\t\texclude: /node_modules/,\n\t\t\t\tuse: {\n\t\t\t\t\tloader: \"babel-loader\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n                test: /\\.vue$/,\n                loader: 'vue-loader',\n                options: {\n                    optimizeSSR: false\n                }\n            },\n\t\t\t{\n\t\t\t\ttest: /\\.css$/,\n\t\t\t\tuse: ['to-string-loader', 'css-loader'],\n\t\t\t},\n\t\t],\n\t},\n\tplugins: [\n\t\tnew VueLoaderPlugin(),\n\t],\n\tresolve: {\n\t\talias: {\n\t\t\tvue$: \"vue/dist/vue.common.js\",\n\t\t},\n\t\textensions: [\"*\", \".js\", \".vue\", \".json\"],\n\t},\n}\n"
  },
  {
    "path": "plugins/bbs_exporter/about.md",
    "content": "**BBS Model Ex/importer** is a plugin to export models in BBS model format, which can be imported by BBS Studio dedicated application, and BBS mod."
  },
  {
    "path": "plugins/bbs_exporter/bbs_exporter.js",
    "content": "(function() {\n    var exportAction, importAction;\n    var lastOptions = {};\n    var sides = {\n        north: \"front\",\n        south: \"back\",\n        west: \"left\",\n        east: \"right\",\n        up: \"top\",\n        down: \"bottom\"\n    };\n    var sidesInverse = {\n        front: \"north\",\n        back: \"south\",\n        left: \"west\",\n        right: \"east\",\n        top: \"up\",\n        bottom: \"down\"\n    };\n\n    /* Model exporter code */\n\n    function areThereObjects(objects)\n    {\n        for (let i = 0; i < objects.length; i++) \n        {\n            if (objects[i].type === \"group\")\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    function createHierarchy(objects)\n    {\n        var groups = {};\n        var createAnchor = !areThereObjects(objects);\n\n        if (createAnchor)\n        {\n            var group = new Group();\n\n            group.children = objects;\n            groups.anchor = createModelGroup(group, groups);\n        }\n        else\n        {\n            for (let i = 0; i < objects.length; i++)\n            {\n                var object = objects[i];\n    \n                if (object.type === \"group\")\n                {\n                    groups[object.name] = createModelGroup(object, groups);\n                }\n            }\n        }\n\n        return groups;\n    }\n\n    function createModelGroup(o, groups)\n    {\n        var group = {};\n        var cubes = [];\n        var meshes = [];\n\n        group.origin = o.origin.slice();\n\n        if (!o.rotation.allEqual(0))\n        {\n            group.rotate = o.rotation.slice();\n        }\n\n        if (typeof o.parent.name === \"string\")\n        {\n            group.parent = o.parent.name;\n        }\n\n        for (let i = 0; i < o.children.length; i++)\n        {\n            var object = o.children[i];\n\n            if (object.type === \"group\")\n            {\n                groups[object.name] = createModelGroup(object, groups);\n            }\n            else if (object.type === \"cube\")\n            {\n                cubes.push(createCube(object));\n            }\n            else if (object.type === \"mesh\")\n            {\n                meshes.push(createMesh(object));\n            }\n        }\n\n        if (cubes.length > 0)\n        {\n            group.cubes = cubes;\n        }\n\n        if (meshes.length > 0)\n        {\n            group.meshes = meshes;\n        }\n\n        return group;\n    }\n\n    function createCube(c)\n    {\n        var cube = {};\n        var uvs = {};\n\n        cube.origin = c.origin.slice();\n        cube.from = c.from.slice();\n        cube.size = c.size();\n\n        if (c.inflate !== 0)\n        {\n            cube.offset = c.inflate;\n        }\n\n        if (!c.rotation.allEqual(0))\n        {\n            cube.rotate = c.rotation.slice();\n        }\n\n        Object.keys(CubeFace.opposite).forEach(key =>\n        {\n            var face = c.faces[key];\n\n            if (face && face.texture !== null)\n            {\n                var uv = face.uv.slice();\n\n                if (face.rotation !== 0)\n                {\n                    uv.push(face.rotation);\n                }\n\n                uvs[sides[key]] = uv;\n            }\n        });\n\n        if (Object.keys(uvs).length > 0)\n        {\n            cube.uvs = uvs;\n        }\n\n        return cube;\n    }\n\n    function createMesh(c)\n    {\n        var mesh = {};\n        var vertices = [];\n        var uvs = [];\n\n        var pushVertexKey = (k, f) =>\n        {\n            var v = c.vertices[k];\n            var u = f.uv[k];\n\n            vertices.push(v[0]);\n            vertices.push(v[1]);\n            vertices.push(v[2]);\n            uvs.push(u[0]);\n            uvs.push(u[1]);\n        };\n\n        mesh.origin = c.origin.slice();\n\n        if (!c.rotation.allEqual(0))\n        {\n            mesh.rotate = c.rotation.slice();\n        }\n\n        for (var key in c.faces)\n        {\n            var face = c.faces[key];\n            var vertexKeys = face.vertices;\n\n            if (vertexKeys.length == 3)\n            {\n                for (var i = 0; i < vertexKeys.length; i++)\n                {\n                    pushVertexKey(vertexKeys[i], face);\n                }\n            }\n            else if (vertexKeys.length == 4)\n            {\n                /* Triangulate a quad */\n                var sorted = face.getSortedVertices();\n                \n                pushVertexKey(sorted[0], face);\n                pushVertexKey(sorted[1], face);\n                pushVertexKey(sorted[2], face);\n\n                pushVertexKey(sorted[0], face);\n                pushVertexKey(sorted[2], face);\n                pushVertexKey(sorted[3], face);\n            }\n        }\n\n        mesh.vertices = vertices;\n        mesh.uvs = uvs;\n\n        return mesh;\n    }\n\n    /* Animation exporting code */\n\n    function createAnimation(a)\n    {\n        var animation = {\n            groups: {}\n        };\n\n        animation.duration = a.length;\n\n        for (let key in a.animators)\n        {\n            var animator = a.animators[key];\n            var group = createAnimationGroup(animator);\n\n            if (Object.keys(group).length > 0)\n            {\n                animation.groups[animator.name] = group;\n            }\n        }\n\n        return animation;\n    }\n\n    function createAnimationGroup(a)\n    {\n        var group = {};\n        var translate = createAnimationKeyframes(a.position, \"p\");\n        var scale = createAnimationKeyframes(a.scale, \"s\");\n        var rotate = createAnimationKeyframes(a.rotation, \"r\");\n\n        if (translate.length > 0) group.translate = translate;\n        if (scale.length > 0) group.scale = scale;\n        if (rotate.length > 0) group.rotate = rotate;\n\n        return group;\n    }\n\n    function createAnimationKeyframes(g, typeGroup)\n    {\n        if (!g)\n        {\n            return [];\n        }\n\n        var keyframes = [];\n\n        for (let i = 0; i < g.length; i++)\n        {\n            var keyframe = g[i];\n            var data = keyframe.data_points[0];\n            var out = [\n                keyframe.time,\n                keyframe.interpolation,\n                getExpression(data, \"x\", typeGroup === \"r\" || typeGroup === \"p\"), getExpression(data, \"y\", typeGroup === \"r\"), getExpression(data, \"z\", false)\n            ];\n\n            keyframes.push(out);\n        }\n\n        return keyframes;\n    }\n\n    function getExpression(data, component, invert)\n    {\n        var value = data[component] || 0;\n        var parsed = parseFloat(value);\n        var inverter = invert && Blockbench.isNewerThan('4.99') ? invertMolang : (v) => v;\n\n        if (!isNaN(value) && !isNaN(parsed))\n        {\n            return inverter(parsed);\n        }\n\n        if (typeof value === \"string\")\n        {\n            value = value.trim();\n\n            if (!value)\n            {\n                return 0;\n            }\n        }\n\n        return inverter(value);\n    }\n\n    function compile()\n    {\n        function findTextureSize()\n        {\n            var c = Cube.all;\n            var keys = Object.keys(sides);\n\n            for (var i = 0; i < c.length; i++)\n            {\n                var cube = c[i];\n\n                for (var j = 0; j < keys.length; j++)\n                {\n                    var face = cube.faces[keys[j]];\n\n                    if (face)\n                    {\n                        var textureUuid = face.texture;\n\n                        for (var k = 0; k < Texture.all.length; k++)\n                        {\n                            var texture = Texture.all[k];\n\n                            if (texture && texture.uuid == textureUuid)\n                            {\n                                return [texture.uv_width, texture.uv_height];\n                            }\n                        }\n                    }\n                }\n            }\n\n            return null;\n        }\n\n        var output = {\n            version: \"0.7.2\",\n            animations: {}\n        };\n\n        if (lastOptions.model)\n        {\n            var texture = [Project.texture_width, Project.texture_height];\n            var textureSize = findTextureSize();\n\n            if (textureSize)\n            {\n                texture = textureSize;\n            }\n\n            output.model = {\n                groups: createHierarchy(Outliner.root),\n                texture: texture\n            };\n        }\n\n        if (lastOptions.animations)\n        {\n            Animation.all.forEach(animation =>\n            {\n                output.animations[animation.name] = createAnimation(animation);\n            });\n        }\n\n        return output;\n    }\n\n    function compileFirstCubes()\n    {\n        var group = Group.selected;\n        var cubes = [];\n\n        if (group)\n        {\n            for (var child of group.children)\n            {\n                if (child.type === \"cube\")\n                {\n                    cubes.push(createCube(child));\n                }\n            }\n        }\n\n        return cubes;\n    }\n\n    /* Import */\n\n    function importBBS(json)\n    {\n        Undo.initEdit({\n            outliner: true,\n            animations: []\n        });\n\n        try\n        {\n            if (json.model) importModel(json.model);\n            if (json.animations) importAnimations(json.animations);\n        }\n        catch (e)\n        {\n            console.log(e);\n        }\n\n        Undo.finishEdit(\"Finished importing a BBS model\");\n        Canvas.updateAll();\n    }\n\n    function importAnimations(animations)\n    {\n        for (var key in animations)\n        {\n            var animationObject = animations[key];\n            var data = {\n                name: key,\n                length: animationObject.duration\n            };\n\n            var animation = new Animation(data).add();\n            var groupKeys = Object.keys(animationObject.groups);\n\n            groupKeys.forEach(k => importGroup(k, animationObject.groups[k], animation));\n        }\n    }\n\n    function importGroup(key, groupObject, animation)\n    {\n        var group = Group.all.find(o => o.name === key);\n\n        if (!group)\n        {\n            return;\n        }\n\n        var animator = new BoneAnimator(group.uuid, animation, key);\n\n        animation.animators[group.uuid] = animator;\n\n        if (groupObject.translate) importChannel(animator, \"position\", groupObject.translate);\n        if (groupObject.rotate) importChannel(animator, \"rotation\", groupObject.rotate);\n        if (groupObject.scale) importChannel(animator, \"scale\", groupObject.scale);\n    }\n\n    function importChannel(animator, name, channel)\n    {\n        channel.forEach(kf => \n        {\n            animator.addKeyframe({\n                channel: name,\n                time: kf[0],\n                interpolation: kf[1],\n                data_points: [{x: kf[2], y: kf[3], z: kf[4]}]\n            });\n        });\n    }\n\n    function importModel(model)\n    {\n        var texture = model.texture;\n        var relations = {};\n        var groups = {};\n\n        Project.texture_width = texture[0];\n        Project.texture_height = texture[1];\n\n        for (var key in model.groups)\n        {\n            var groupObject = model.groups[key];\n            var data = {\n                name: key\n            };\n\n            if (groupObject.rotate) data.rotation = groupObject.rotate;\n            if (groupObject.origin) data.origin = groupObject.origin;\n\n            var group = new Group(data);\n\n            group.init();\n\n            if (groupObject.parent) relations[key] = groupObject.parent;\n            if (groupObject.cubes) groupObject.cubes.forEach(v => importCube(v, group));\n            if (groupObject.meshes) groupObject.meshes.forEach(v => importMesh(v, group));\n\n            groups[key] = group;\n        }\n\n        for (var key in relations)\n        {\n            groups[key].addTo(groups[relations[key]]);\n        }\n    }\n\n    function importCube(cubeObject, group)\n    {\n        var cube = new Cube({\n            origin: cubeObject.origin || [0, 0, 0],\n            from: cubeObject.from,\n            to: [\n                cubeObject.from[0] + cubeObject.size[0],\n                cubeObject.from[1] + cubeObject.size[1],\n                cubeObject.from[2] + cubeObject.size[2]\n            ],\n            rotation: cubeObject.rotate || [0, 0, 0],\n            inflate: cubeObject.offset || 0\n        });\n\n        Object.keys(cubeObject.uvs).forEach(key =>\n        {\n            var uv = cubeObject.uvs[key];\n            var face = cube.faces[sidesInverse[key]];\n\n            face.uv = uv.slice(0, 4);\n\n            if (uv.length >= 5)\n            {\n                face.rotation = uv[4];\n            }\n        });\n\n        cube.init();\n        cube.addTo(group);\n    }\n\n    function importMesh(meshObject, group)\n    {\n        var vertices = {};\n        var faces = {};\n\n        for (var i = 0, c = meshObject.vertices.length / 9; i < c; i++)\n        {\n            var a1 = [\n                meshObject.vertices[i * 9],\n                meshObject.vertices[i * 9 + 1],\n                meshObject.vertices[i * 9 + 2]\n            ];\n            var a2 = [\n                meshObject.vertices[i * 9 + 3],\n                meshObject.vertices[i * 9 + 4],\n                meshObject.vertices[i * 9 + 5]\n            ];\n            var a3 = [\n                meshObject.vertices[i * 9 + 6],\n                meshObject.vertices[i * 9 + 7],\n                meshObject.vertices[i * 9 + 8]\n            ];\n            var key1 = bbuid(6);\n            var key2 = bbuid(6);\n            var key3 = bbuid(6);\n\n            vertices[key1] = a1;\n            vertices[key2] = a2;\n            vertices[key3] = a3;\n\n            var face = {\n                uv: {},\n                vertices: [key1, key2, key3]\n            };\n\n            face.uv[key1] = [meshObject.uvs[i * 6], meshObject.uvs[i * 6 + 1]];\n            face.uv[key2] = [meshObject.uvs[i * 6 + 2], meshObject.uvs[i * 6 + 3]];\n            face.uv[key3] = [meshObject.uvs[i * 6 + 4], meshObject.uvs[i * 6 + 5]];\n\n            faces[bbuid(6)] = face;\n        }\n\n        var mesh = new Mesh({\n            origin: meshObject.origin || [0, 0, 0],\n            rotation: meshObject.rotate || [0, 0, 0],\n            vertices: vertices,\n            faces: faces\n        });\n\n        mesh.init();\n        mesh.addTo(group);\n    }\n\n    /* Bootstrap */\n\n    var bbsCodec = new Codec(\"bbs_model\", {\n        name: \"BBS model\",\n        extension: \"json\",\n        remember: false,\n        load_filter: {\n            type: \"json\",\n            extensions: [\"json\"],\n            condition: (file) => {\n                return file && file.model && file.model.groups && file.model.texture;\n            }\n        },\n        load(content, file) {\n            if (!Undo)\n            {\n                setupProject(Formats.free);\n            }\n\n            importBBS(content);\n        },\n        compile(options) {\n            return autoStringify(compile());\n        },\n        fileName() {\n            var name = Project.name || \"model\";\n\n            return name.endsWith(\"bbs\") ? name : name + \".bbs\";\n        }\n    });\n\n    var exportDialog = new Dialog({\n        id: \"bbs_export_options\",\n        title: \"BBS model exporter\",\n        form: {\n            exportModel: {\n                label: \"Export model data\",\n                type: \"checkbox\",\n                value: true\n            },\n            exportAnimations: {\n                label: \"Export animations\",\n                type: \"checkbox\",\n                value: true\n            },\n            copyToBuffer: {\n                label: \"Copy to buffer\",\n                type: \"checkbox\",\n                value: false\n            },\n            copyOnlyFirst: {\n                label: \"Copy first selected group\",\n                description: \"When enabled, copies to the buffer only cubes from the first found group. This option is ignored when Copy to buffer option is disabled!\",\n                type: \"checkbox\",\n                value: false\n            },\n            exportAsFolder: {\n                label: \"Export to folder\",\n                description: \"When enabled, you can pick the folder where .bbs.json and the texture would be exported to.\",\n                type: \"checkbox\",\n                value: false\n            }\n        },\n        onConfirm: function(formData) {\n            this.hide();\n\n            lastOptions.model = formData.exportModel;\n            lastOptions.animations = formData.exportAnimations;\n\n            if (formData.exportAsFolder)\n            {\n                var folder = Blockbench.pickDirectory({\n                    title: \"Export destination...\"\n                });\n\n                if (folder)\n                {\n                    Blockbench.writeFile(PathModule.join(folder, \"model.bbs.json\"), {\n                        content: autoStringify(compile())\n                    });\n\n                    Texture.all.forEach((t) => \n                    {\n                        if (t.error) \n                        {\n                            return;\n                        }\n                        \n                        var name = t.name.endsWith(\".png\") ? t.name : t.name + \".png\";\n                        \n                        Blockbench.writeFile(PathModule.join(folder, name), {\n                            content: t.source,\n                            savetype: 'image'\n                        });\n                    });\n                }\n            }\n            else if (formData.copyToBuffer)\n            {\n                var data = {};\n\n                if (formData.copyOnlyFirst)\n                {\n                    data = compileFirstCubes();\n                }\n                else\n                {\n                    data = compile();\n                }\n\n                Clipbench.setText(autoStringify(data));\n            }\n            else\n            {\n                bbsCodec.export();\n            }\n        }\n    });\n\n    Plugin.register(\"bbs_exporter\", {\n        title: \"BBS Model Ex/importer\",\n        author: \"McHorse\",\n        description: \"Adds actions to export/import models in BBS format, which is used by BBS mod.\",\n        icon: \"icon.png\",\n        version: \"1.3.1\",\n        min_version: \"4.8.0\",\n        variant: \"both\",\n        has_changelog: true,\n        onload() {\n            exportAction = new Action(\"bbs_exporter\", {\n                name: \"Export BBS model\",\n                category: \"file\",\n                description: \"Export model as a BBS (.bbs.json) model\",\n                icon: \"fa-file-export\",\n                click() {\n                    exportDialog.show();\n                }\n            });\n\n            importAction = new Action(\"bbs_importer\", {\n                name: \"Import BBS model\",\n                category: \"file\",\n                description: \"Import a BBS model (.bbs.json) model\",\n                icon: \"fa-file-import\",\n                click() {\n                    Blockbench.import({\n                        extensions: ['bbs.json'],\n                        type: 'BBS model',\n                        readtype: 'text',\n                    }, (files) => {\n                        importBBS(JSON.parse(files[0].content));\n                    });\n                }\n            });\n\n            MenuBar.addAction(exportAction, \"file.export\");\n            MenuBar.addAction(importAction, \"file.import\");\n        },\n        onunload() {\n            exportAction.delete();\n            importAction.delete();\n        }\n    });\n})();"
  },
  {
    "path": "plugins/bbs_exporter/changelog.json",
    "content": "{\n\t\"1.2.2\": {\n\t\t\"title\": \"1.2.2\",\n\t\t\"date\": \"2024-05-02\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Bug fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed cube faces not exporting in one texture formats\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.3\": {\n\t\t\"title\": \"1.2.3\",\n\t\t\"date\": \"2024-05-21\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Enhancements\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"When exporting the model that has no groups, a single group called anchor will be added to successfully export the model without groups\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.4\": {\n\t\t\"title\": \"1.2.4\",\n\t\t\"date\": \"2024-12-11\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Bug fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"When exporting the model's UV is incorrectly picked from the project's texture size rather than from the active texture\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.3\": {\n\t\t\"title\": \"1.3\",\n\t\t\"date\": \"2025-01-18\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added option \\\"Export to folder\\\" to exporter to automatically export not only the .bbs.json file, but texture(s) as well!\",\n\t\t\t\t\t\"Added load filter to ease importing .bbs.json models via drag-and-dropping or by opening file with Blockbench\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Bug fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed wrong UV size being used when a texture has different UV size\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.3.1\": {\n\t\t\"title\": \"1.3.1\",\n\t\t\"date\": \"2025-10-14\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Bug fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Adapted plugin to Blockbench 5.0\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/bedrock_block_transforms/bedrock_block_transforms.js",
    "content": "(function() {\n\nlet action, style;\n\nBBPlugin.register('bedrock_block_transforms', {\n\ttitle: 'Bedrock Block Transformation Preview',\n\tauthor: 'JannisX11',\n\tversion: '1.0.0',\n\tmin_version: '4.9.0',\n\ticon: 'token',\n\tdescription: 'Edit and preview the Minecraft Bedrock Edition block transformation component',\n\tvariant: 'both',\n\ttags: ['Minecraft: Bedrock Edition'],\n\tonload() {\n\t\tlet dialog;\n\n\t\tfunction setupDialog() {\n\t\t\tlet scale_object = new THREE.Object3D();\n\t\t\tfunction updateTransformation(form_data) {\n\t\t\t\tlet object = Project.model_3d;\n\t\t\t\tif (!form_data) {\n\t\t\t\t\tobject.rotation.set(0, 0, 0);\n\t\t\t\t\tobject.position.set(0, 0, 0);\n\t\t\t\t\tobject.scale.set(1, 1, 1);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlet rotation_pivot = new THREE.Vector3(\n\t\t\t\t\t(form_data.rotation_pivot[0] * 16),\n\t\t\t\t\t(form_data.rotation_pivot[1] * 16) + 8,\n\t\t\t\t\t(form_data.rotation_pivot[2] * 16),\n\t\t\t\t);\n\t\t\t\tobject.rotation.set(\n\t\t\t\t\tMath.degToRad(form_data.rotation[0]),\n\t\t\t\t\tMath.degToRad(form_data.rotation[1]),\n\t\t\t\t\tMath.degToRad(form_data.rotation[2]),\n\t\t\t\t\t'ZYX'\n\t\t\t\t)\n\t\t\t\tlet rotated_rot_pivot = new THREE.Vector3().copy(rotation_pivot).applyEuler(object.rotation);\n\t\t\t\tobject.position.set(\n\t\t\t\t\tform_data.translation[0] * 16 + rotation_pivot.x - rotated_rot_pivot.x,\n\t\t\t\t\tform_data.translation[1] * 16 + rotation_pivot.y - rotated_rot_pivot.y,\n\t\t\t\t\tform_data.translation[2] * 16 + rotation_pivot.z - rotated_rot_pivot.z,\n\t\t\t\t)\n\t\t\t\tobject.scale.set(1, 1, 1);\n\n\t\t\t\tif (!form_data.scale.allEqual(1)) {\n\t\t\t\t\tlet scale_pivot = new THREE.Vector3(\n\t\t\t\t\t\t(form_data.scale_pivot[0] * 16),\n\t\t\t\t\t\t(form_data.scale_pivot[1] * 16) + 8,\n\t\t\t\t\t\t(form_data.scale_pivot[2] * 16),\n\t\t\t\t\t);\n\t\t\t\t\tscale_object.scale.set(\n\t\t\t\t\t\tform_data.scale[0] || 0.00002,\n\t\t\t\t\t\tform_data.scale[1] || 0.00002,\n\t\t\t\t\t\tform_data.scale[2] || 0.00002,\n\t\t\t\t\t);\n\t\t\t\t\tscale_object.position.x = scale_pivot.x - scale_pivot.x * form_data.scale[0];\n\t\t\t\t\tscale_object.position.y = scale_pivot.y - scale_pivot.y * form_data.scale[1];\n\t\t\t\t\tscale_object.position.z = scale_pivot.z - scale_pivot.z * form_data.scale[2];\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction setupPreview() {\n\t\t\t\tfor (let child of Project.model_3d.children.slice()) {\n\t\t\t\t\tscale_object.add(child);\n\t\t\t\t}\n\t\t\t\tProject.model_3d.add(scale_object);\n\t\t\t}\n\t\t\tfunction resetPreview() {\n\t\t\t\tProject.model_3d.position.set(0, 0, 0);\n\t\t\t\tProject.model_3d.rotation.set(0, 0, 0);\n\t\t\t\tProject.model_3d.scale.set(1, 1, 1);\n\t\t\t\tfor (let child of scale_object.children.slice()) {\n\t\t\t\t\tProject.model_3d.add(child);\n\t\t\t\t}\n\t\t\t\tProject.model_3d.remove(scale_object);\n\t\t\t}\n\n\t\t\tjson_output = '';\n\t\t\tlet last_form_data;\n\t\t\tdialog = new Dialog('bedrock_block_transforms', {\n\t\t\t\ttitle: 'Edit Block Transformation',\n\t\t\t\tcancel_on_click_outside: false,\n\t\t\t\tdarken: false,\n\t\t\t\tform: {\n\t\t\t\t\trotation: {label: 'Rotation', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 90, min: -270, max: 270},\n\t\t\t\t\ttranslation: {label: 'Translation', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16},\n\t\t\t\t\tscale: {label: 'Scale', type: 'vector', dimensions: 3, value: [1, 1, 1 ], step: 1/20},\n\t\t\t\t\trotation_pivot: {label: 'Rotation Pivot', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16},\n\t\t\t\t\tscale_pivot: {label: 'Scale Pivot', type: 'vector', dimensions: 3, value: [0, 0, 0], step: 1/16},\n\t\t\t\t\tjson: {type: 'textarea', share_text: true},\n\t\t\t\t\tcopy: {type: 'buttons', buttons: ['Copy'], click() {\n\t\t\t\t\t\tClipbench.setText(json_output);\n\t\t\t\t\t\tBlockbench.showQuickMessage('Copied!')\n\t\t\t\t\t}}\n\t\t\t\t},\n\t\t\t\tsingleButton: true,\n\t\t\t\tresizable: 'x',\n\t\t\t\tonOpen() {\n\t\t\t\t\tif (!scale_object.parent) {\n\t\t\t\t\t\tsetupPreview();\n\t\t\t\t\t}\n\t\t\t\t\tupdateTransformation(last_form_data);\n\t\t\t\t},\n\t\t\t\tonFormChange(form_data) {\n\t\t\t\t\tupdateTransformation(form_data);\n\t\t\t\t\tlast_form_data = form_data;\n\t\t\t\t\tlet json = {\n\t\t\t\t\t\trotation: form_data.rotation.allEqual(0) ? undefined : form_data.rotation,\n\t\t\t\t\t\ttranslation: form_data.translation.allEqual(0) ? undefined : form_data.translation,\n\t\t\t\t\t\tscale: form_data.scale.allEqual(1) ? undefined : form_data.scale,\n\t\t\t\t\t\trotation_pivot: form_data.rotation_pivot.allEqual(0) ? undefined : form_data.rotation_pivot,\n\t\t\t\t\t\tscale_pivot: form_data.scale_pivot.allEqual(0) ? undefined : form_data.scale_pivot,\n\t\t\t\t\t};\n\t\t\t\t\tjson_output = '\"minecraft:transformation\": ' + compileJSON(json);\n\t\t\t\t\tdialog.setFormValues({json: json_output}, false);\n\t\t\t\t},\n\t\t\t\tonCancel() {\n\t\t\t\t\tresetPreview();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\taction = new Action('bedrock_block_transforms', {\n\t\t\tname: 'Edit Block Transformation',\n\t\t\ticon: 'token',\n\t\t\tcondition: {formats: ['bedrock_block']},\n\t\t\tclick(event) {\n\t\t\t\tif (!dialog) setupDialog();\n\t\t\t\tdialog.show();\n\t\t\t}\n\t\t})\n\t\tMenuBar.menus.tools.addAction(action);\n\n\t\tstyle = Blockbench.addCSS(`\n\t\t\tdialog#bedrock_block_transforms textarea {\n\t\t\t\tfont-family: var(--font-code);\n\t\t\t}\n\t\t`)\n\t},\n\tonunload() {\n\t\tif (action instanceof Action) action.delete();\n\t\tstyle.delete();\n\t}\n})\n\n})()\n"
  },
  {
    "path": "plugins/block_multi_collisions/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2025 Minato\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/block_multi_collisions/about.md",
    "content": "# Block Multi-Collision\n\nBlock Multi-Collision is a Blockbench plugin that allow you to create and preview multiple collision boxes for Minecraft Bedrock blocks using the `minecraft:collision_box` component for the block format `1.21.130+`.\n\n## Overview\n\n- **Purpose**: Provide an in editor workflow to author one or more collision boxes for custom Bedrock blocks without manually editing JSON.  \n- **Target**: Minecraft Bedrock Edition blocks using the `minecraft:collision_box` component, including the multi-box format introduced in recent versions.\n\n## Features\n\n- Visual wireframe preview of up to 16 collision boxes directly in the Blockbench scene, each with its own size and offset.  \n- Form controls to edit size and offset numerically, switch the active box by index, and keep boxes clamped to valid Bedrock collision bounds.  \n- Auto-generation of collision boxes from visible cubes in the current model, speeding up setup for complex shapes.\n\n## Workflow\n\n- Open the plugin via the “Setup Block Collisions” action, available when working in the Bedrock block format.  \n- Adjust collision boxes using the numeric fields and navigation controls, previewing them in real time in the 3D viewport.  \n- Copy the generated collision JSON and paste it into the block’s behavior JSON file in a Bedrock pack."
  },
  {
    "path": "plugins/block_multi_collisions/block_multi_collisions.js",
    "content": "Blockbench.addCSS(`\ndialog#block_multi_collisions .result-code-container {\n    background-color: #181b1f;\n    border: 1px solid #101316;\n    border-radius: 4px;\n    padding: 12px;\n    font-family: 'Courier New', 'Noto Sans Mono', monospace;\n    font-size: 12px;\n    line-height: 1.5;\n    color: #d4d4d4;\n    max-height: 130px;\n    overflow-y: auto;\n    overflow-x: auto;\n    width: 100%;\n    user-select: text;\n    -webkit-user-select: text;\n    -moz-user-select: text;\n    -ms-user-select: text;\n    cursor: text;\n}\ndialog#block_multi_collisions .hljs { \n    background-color: transparent;\n    user-select: text;\n    -webkit-user-select: text;\n}\ndialog#block_multi_collisions .hljs-string { color: #ce9178; }\ndialog#block_multi_collisions .hljs-number { color: #b5cea8; }\ndialog#block_multi_collisions .hljs-attr { color: #9cdcfe; }\ndialog#block_multi_collisions .hljs-literal { color: #569cd6; }\n\n#collision_box_controls {\n    display: grid;\n    grid-template-rows: auto auto;\n    row-gap: 6px;\n    padding: 8px 0;\n    margin: 4px 0;\n    width: 80%;\n}\n\n#collision_box_controls i{\n    margin: unset;\n}\n\n#collision_box_controls_row1 {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    column-gap: 6px;\n    align-items: center;\n}\n\n#collision_box_controls_row2 {\n    display: grid;\n    grid-template-columns: 1fr 1fr auto;\n    column-gap: 6px;\n    align-items: center;\n}\n\n#collision_box_controls .tool {\n    display: inline-flex;\n    align-items: center;\n    justify-content: space-around;\n    gap: 4px;\n    padding: 4px 8px;\n    height: 28px;\n    font-size: 13px;\n    border: none;\n    border-radius: 3px;\n    cursor: pointer;\n    outline: none;\n    white-space: nowrap;\n    width: 100%;\n    line-height: 1;\n    transition: background 0.1s, filter 0.1s;\n    background: var(--color-button);\n    color: var(--color-text);\n}\n\n#collision_box_controls .tool:hover {\n    filter: brightness(1.2);\n}\n\n#collision_box_controls .tool:active {\n    filter: brightness(0.9);\n}\n\n#add_box_btn {\n    background: var(--color-accent);\n}\n#remove_box_btn {\n    background: var(--color-button);\n}\n#auto_cubes_btn {\n    background: var(--color-button);\n}\n#copy_result_btn_inline {\n    background: var(--color-button);\n}\n\n#copy_result_btn_inline.copied {\n    background: #37cf95 !important;\n    color: #18321e !important;\n}\n\n#box_count_display {\n    color: var(--color-subtle_text);\n    justify-self: end;\n    white-space: nowrap;\n    font-size: 12px;\n    padding: 0 4px;\n}\n\ndialog#block_multi_collisions textarea { tab-size: 40px; }\n#collision_box_controls i {\n    font-size: 18px;\n    width: 18px;\n    height: 18px;\n}\n`);\n\n(function () {\n\n    function highlightJSON(jsonString) {\n        jsonString = jsonString\n            .replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;');\n        return jsonString\n            .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\")(\\s*:)/g, '<span class=\"hljs-attr\">$1</span>$3')\n            .replace(/:\\s*(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\")/g, ': <span class=\"hljs-string\">$1</span>')\n            .replace(/\\b(-?\\d+\\\\.?\\\\d*)\\b/g, '<span class=\"hljs-number\">$1</span>')\n            .replace(/\\b(true|false|null)\\b/g, '<span class=\"hljs-literal\">$1</span>');\n    }\n\n    function copyToClipboard(text) {\n        return new Promise((resolve, reject) => {\n            if (navigator.clipboard && navigator.clipboard.writeText) {\n                navigator.clipboard.writeText(text).then(resolve).catch(err => fallbackCopy(text, resolve, reject));\n            } else {\n                fallbackCopy(text, resolve, reject);\n            }\n        });\n    }\n    function fallbackCopy(text, resolve, reject) {\n        const textarea = document.createElement('textarea');\n        textarea.value = text;\n        textarea.style.position = 'fixed';\n        textarea.style.left = '-999999px';\n        textarea.style.top = '-999999px';\n        document.body.appendChild(textarea);\n        textarea.focus();\n        textarea.select();\n        try {\n            const ok = document.execCommand('copy');\n            document.body.removeChild(textarea);\n            ok ? resolve() : reject(new Error('Copy command failed'));\n        } catch (err) {\n            document.body.removeChild(textarea);\n            reject(err);\n        }\n    }\n\n    function triggerCopyFeedback() {\n        const btn = $('#copy_result_btn_inline');\n        const btnText = btn.find('span');\n        const btnIcon = btn.find('i');\n\n        btn.addClass('copied');\n        btnText.text('Copied!');\n        btnIcon.text('check');\n\n        setTimeout(() => {\n            btn.removeClass('copied');\n            btnText.text('Copy');\n            btnIcon.text('content_copy');\n        }, 2000);\n    }\n\n    window.BlockCollisionManager = {\n        collisionBoxes: [],\n        colors: [0xffbd2e, 0xff5733, 0x33ff57, 0x3357ff, 0xff33f5, 0x33fff5, 0xffd700, 0xff1493],\n        objects: [],\n        currentBoxIndex: 0,\n        previousBoxIndex: 0,\n        controlsAdded: false,\n        validateBox(size, offset) {\n            const clampedSize = [\n                Math.max(0, Math.min(size[0], 16)),\n                Math.max(0, Math.min(size[1], 24)),\n                Math.max(0, Math.min(size[2], 16))\n            ];\n            const origin = [\n                offset[0] - clampedSize[0] / 2,\n                offset[1],\n                offset[2] - clampedSize[2] / 2\n            ];\n            const minOrigin = [-8, 0, -8];\n            const maxOrigin = [8, 24, 8];\n            for (let i = 0; i < 3; i++) {\n                if (origin[i] < minOrigin[i]) offset[i] += minOrigin[i] - origin[i];\n                if (origin[i] + clampedSize[i] > maxOrigin[i]) offset[i] -= (origin[i] + clampedSize[i]) - maxOrigin[i];\n            }\n            offset[0] = Math.max(-8, Math.min(8, offset[0]));\n            offset[1] = Math.max(0, Math.min(24, offset[1]));\n            offset[2] = Math.max(-8, Math.min(8, offset[2]));\n            return { size: clampedSize, offset };\n        },\n        dialog: new Dialog({\n            id: 'block_multi_collisions',\n            title: 'Block Multi-Collisions',\n            width: 540,\n            form: {\n                box_index: { label: 'Box Index', type: 'number', value: 1, min: 1, step: 1 },\n                size_block: { label: 'Size (X, Y, Z)', type: 'vector', value: [16, 16, 16], max: 24, min: 0, dimensions: 3 },\n                offset_block: { label: 'Offset (X, Y, Z)', type: 'vector', value: [0, 0, 0] },\n                result: { type: 'textarea', height: 130, readonly: true }\n            },\n            singleButton: true,\n            keyboard_actions: {\n                copy: {\n                    keybind: new Keybind({ key: 'c', ctrl: true }),\n                    run() {\n                        const textToCopy = $('dialog#block_multi_collisions textarea').val();\n                        copyToClipboard(textToCopy)\n                            .then(() => {\n                                triggerCopyFeedback();\n                                Blockbench.showQuickMessage('Copied to clipboard');\n                            })\n                            .catch(() => {\n                                Blockbench.showQuickMessage('Failed to copy', 1500);\n                            });\n                    }\n                }\n            },\n            onFormChange(form) {\n                const { size_block, offset_block, box_index } = form;\n                const clampedIndex = Math.max(1, Math.min(box_index, window.BlockCollisionManager.collisionBoxes.length));\n                if (clampedIndex !== box_index) {\n                    setTimeout(() => {\n                        window.BlockCollisionManager.dialog.setFormValues({ box_index: clampedIndex }, false);\n                    }, 0);\n                }\n                const newIndex = clampedIndex - 1;\n                if (newIndex !== window.BlockCollisionManager.previousBoxIndex) {\n                    window.BlockCollisionManager.previousBoxIndex = newIndex;\n                    window.BlockCollisionManager.currentBoxIndex = newIndex;\n                    window.BlockCollisionManager.loadBoxData(newIndex);\n                    return;\n                }\n                const validated = window.BlockCollisionManager.validateBox(size_block, offset_block);\n                if (validated.size.toString() !== size_block.toString() || validated.offset.toString() !== offset_block.toString()) {\n                    setTimeout(() => {\n                        window.BlockCollisionManager.dialog.setFormValues({\n                            size_block: validated.size,\n                            offset_block: validated.offset\n                        }, false);\n                    }, 0);\n                }\n                window.BlockCollisionManager.updateCurrentBox(validated.size, validated.offset);\n                window.BlockCollisionManager.redrawAllBoxes();\n                window.BlockCollisionManager.updateResultOutput();\n            },\n            onOpen() {\n                window.BlockCollisionManager.setupControls();\n            },\n            onConfirm() {\n                window.BlockCollisionManager.clearAllBoxes();\n                this.hide();\n            }\n        }),\n        updateResultOutput() {\n            const boxes = this.collisionBoxes;\n            let result;\n            if (boxes.length === 1 && boxes[0].size.allEqual(16) && boxes[0].offset.allEqual(0)) {\n                result = `\"minecraft:collision_box\": true`;\n            } else if (boxes.length === 1) {\n                const box = boxes[0];\n                const value = compileJSON({\n                    origin: [box.offset[0] - box.size[0] / 2, box.offset[1], box.offset[2] - box.size[2] / 2],\n                    size: box.size\n                });\n                result = `\"minecraft:collision_box\": ${value}`;\n            } else {\n                const multi = boxes.map(box => ({\n                    origin: [box.offset[0] - box.size[0] / 2, box.offset[1], box.offset[2] - box.size[2] / 2],\n                    size: box.size\n                }));\n                result = `\"minecraft:collision_box\": ${compileJSON(multi)}`;\n            }\n            const container = $('dialog#block_multi_collisions textarea');\n            const parent = container.parent();\n            container.val(result);\n            const highlighted = highlightJSON(result);\n            let codeBlock = parent.find('.result-code-container code');\n            if (!codeBlock.length) {\n                container.hide();\n                parent.append(`<pre class=\"result-code-container\"><code class=\"hljs\"></code></pre>`);\n                codeBlock = parent.find('.result-code-container code');\n            }\n            codeBlock.html(highlighted);\n        },\n        setupControls() {\n            if (this.controlsAdded) return;\n            const container = $('dialog#block_multi_collisions .dialog_content');\n            if (!container.length) return;\n            $('#collision_box_controls').remove();\n            const html = `\n        <div id=\"collision_box_controls\" class=\"form_bar\">\n            <div id=\"collision_box_controls_row1\">\n                <button id=\"add_box_btn\" class=\"tool\"><i class=\"material-icons\">add</i> Add Box</button>\n                <button id=\"remove_box_btn\" class=\"tool\"><i class=\"material-icons\">remove</i> Remove Box</button>\n            </div>\n            <div id=\"collision_box_controls_row2\">\n                <button id=\"auto_cubes_btn\" class=\"tool\" title=\"hide cubes from geometry to exclude them\"><i class=\"material-icons\">auto_fix</i> Auto-Generate</button>\n                <button id=\"copy_result_btn_inline\" class=\"tool\">\n                    <i class=\"material-icons\" style=\"font-size: 16px;\">content_copy</i>\n                    <span>Copy</span>\n                </button>\n                <span id=\"box_count_display\">Total: 1</span>\n            </div>\n        </div>\n        `;\n            container.append(html);\n            $('#add_box_btn').off('click').on('click', e => {\n                e.preventDefault(); e.stopPropagation();\n                window.BlockCollisionManager.addBox();\n            });\n            $('#remove_box_btn').off('click').on('click', e => {\n                e.preventDefault(); e.stopPropagation();\n                window.BlockCollisionManager.removeBox(window.BlockCollisionManager.currentBoxIndex);\n            });\n            $('#auto_cubes_btn').off('click').on('click', e => {\n                e.preventDefault(); e.stopPropagation();\n                window.BlockCollisionManager.autoGenerateFromCubes();\n            });\n            $('#copy_result_btn_inline').on('click', function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                const textToCopy = $('dialog#block_multi_collisions textarea').val();\n                copyToClipboard(textToCopy)\n                    .then(() => {\n                        triggerCopyFeedback();\n                    })\n                    .catch(err => {\n                        const btn = $(this);\n                        const btnText = btn.find('span');\n                        btnText.text('Failed');\n                        setTimeout(() => { btnText.text('Copy'); }, 2000);\n                    });\n            });\n            this.controlsAdded = true;\n            this.updateBoxCount();\n        },\n        updateBoxCount() {\n            $('#box_count_display').text(`Total: ${this.collisionBoxes.length}`);\n        },\n        loadBoxData(index) {\n            if (index < 0 || index >= this.collisionBoxes.length) return;\n            const box = this.collisionBoxes[index];\n            this.dialog.setFormValues({\n                size_block: [...box.size],\n                offset_block: [...box.offset],\n                box_index: index + 1\n            }, false);\n            this.previousBoxIndex = index;\n            setTimeout(() => {\n                this.redrawAllBoxes();\n                this.updateResultOutput();\n            }, 10);\n        },\n        updateCurrentBox(size, offset) {\n            const idx = this.currentBoxIndex;\n            while (this.collisionBoxes.length <= idx) {\n                this.collisionBoxes.push({ size: [16, 16, 16], offset: [0, 0, 0] });\n            }\n            this.collisionBoxes[idx] = { size: [...size], offset: [...offset] };\n        },\n        autoGenerateFromCubes() {\n            const all = Project.elements || [];\n            if (all.length === 0) {\n                Blockbench.showQuickMessage('No cubes found in the model');\n                return;\n            }\n            this.collisionBoxes = [];\n            all.forEach(elm => {\n                if (elm instanceof Cube && elm.visibility) {\n                    const sizeX = Math.abs(elm.to[0] - elm.from[0]);\n                    const sizeY = Math.abs(elm.to[1] - elm.from[1]);\n                    const sizeZ = Math.abs(elm.to[2] - elm.from[2]);\n                    const centerX = (elm.from[0] + elm.to[0]) / 2;\n                    const centerY = elm.from[1];\n                    const centerZ = (elm.from[2] + elm.to[2]) / 2;\n                    const v = this.validateBox([sizeX, sizeY, sizeZ], [centerX, centerY, centerZ]);\n                    if (this.collisionBoxes.length < 16) {\n                        this.collisionBoxes.push({ size: v.size, offset: v.offset });\n                    }\n                }\n            });\n            if (this.collisionBoxes.length === 0) {\n                Blockbench.showQuickMessage('No valid cubes to convert');\n                return;\n            }\n            this.currentBoxIndex = 0;\n            this.previousBoxIndex = 0;\n            this.updateBoxCount();\n            this.loadBoxData(0);\n            this.redrawAllBoxes();\n            this.updateResultOutput();\n            Blockbench.showQuickMessage(`Generated ${this.collisionBoxes.length} collision box`);\n        },\n        redrawAllBoxes() {\n            this.clearAllBoxes();\n            this.collisionBoxes.forEach((box, idx) => {\n                const color = this.colors[idx % this.colors.length];\n                const obj = this.createBoxObject(box.size[0], box.size[1], box.size[2], color);\n                obj.position.set(-box.offset[0], box.offset[1], box.offset[2]);\n                this.objects.push(obj);\n                scene.add(obj);\n            });\n        },\n        addBox() {\n            if (this.collisionBoxes.length === 16) return;\n            this.collisionBoxes.push({ size: [16, 16, 16], offset: [0, 0, 0] });\n            this.currentBoxIndex = this.collisionBoxes.length - 1;\n            this.updateBoxCount();\n            this.loadBoxData(this.currentBoxIndex);\n            this.redrawAllBoxes();\n            this.updateResultOutput();\n        },\n        removeBox(index) {\n            if (this.collisionBoxes.length <= 1) return;\n            this.collisionBoxes.splice(index, 1);\n            this.currentBoxIndex = Math.min(index, this.collisionBoxes.length - 1);\n            this.updateBoxCount();\n            this.loadBoxData(this.currentBoxIndex);\n            this.redrawAllBoxes();\n            this.updateResultOutput();\n        },\n        createBoxObject(w, h, d, color) {\n            const geo = new THREE.BufferGeometry();\n            const mat = new THREE.LineBasicMaterial({ color });\n            const hw = w / 2, hh = h, hd = d / 2;\n            const pos = [\n                hw, 0, hd, hw, hh, hd,\n                hw, 0, -hd, hw, hh, -hd,\n                -hw, 0, hd, -hw, hh, hd,\n                -hw, 0, -hd, -hw, hh, -hd,\n                hw, 0, hd, -hw, 0, hd,\n                hw, 0, -hd, -hw, 0, -hd,\n                hw, hh, hd, -hw, hh, hd,\n                hw, hh, -hd, -hw, hh, -hd,\n                hw, 0, hd, hw, 0, -hd,\n                -hw, 0, hd, -hw, 0, -hd,\n                hw, hh, hd, hw, hh, -hd,\n                -hw, hh, hd, -hw, hh, -hd\n            ];\n            geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(pos), 3));\n            return new THREE.LineSegments(geo, mat);\n        },\n        clearAllBoxes() {\n            this.objects.forEach(o => {\n                scene.remove(o);\n                if (o.geometry) o.geometry.dispose();\n                if (o.material) o.material.dispose();\n            });\n            this.objects = [];\n        },\n        setupObject() {\n            if (this.init) return;\n            this.collisionBoxes = [{ size: [16, 16, 16], offset: [0, 0, 0] }];\n            this.currentBoxIndex = 0;\n            this.previousBoxIndex = 0;\n            this.init = true;\n        }\n    };\n\n    let action;\n    Plugin.register('block_multi_collisions', {\n        title: 'Block Multi-Collision Editor',\n        icon: 'icon.svg',\n        author: 'minato4743',\n        description: 'This Plugin allow you to make and generate multiple collision boxes for Minecraft Bedrock blocks.',\n        about: \"<style>.collisionPrivate p{width: fit-content;display: inline;margin-left: 10px !important;}.collisionPrivate tr td:nth-child(2){padding-left:10px}.collisionPrivate2 td, .collisionPrivate2 th{padding:0 10px}</style><h1>Block Multi-Collision</h1><p>Create and preview multiple collision boxes for Minecraft Bedrock blocks using the <code>minecraft:collision_box</code> component for block format <code>1.21.130+</code>.</p><h2>Features</h2><ul><li>Visual wireframe preview of up to 16 collision boxes in the Blockbench viewport</li><li>Numeric controls for editing size and offset of each collision box</li><li>Auto-generation of collision boxes from visible cubes in your model</li><li>Real-time preview with proper clamping to valid Bedrock collision bounds</li></ul><h2>Usage</h2><table class=collisionPrivate><tr><td>Setup Block Collisions</td><td>Action: </td><td><p>Opens the collision editor dialog</p></td></tr><tr><td>Navigate Boxes</td><td>Controls: </td><td><p>Use index selector to switch between collision boxes</p></td></tr><tr><td>Edit Size/Offset</td><td>Fields: </td><td><p>Adjust X, Y, Z values numerically</p></td></tr><tr><td>Auto-Generate</td><td>Button: </td><td><p>Creates collision boxes from visible cubes</p></td></tr><tr><td>Copy JSON</td><td>Button: </td><td><p>Copies generated collision component to clipboard</p></td></tr><tr><td>Ctrl+C</td><td>Shortcut: </td><td><p>Copies generated collision component to clipboard</p></td></tr></table><h2>Requirements</h2><table class=collisionPrivate2><tr><th>Requirement</th><th>Value</th></tr><tr><td>Blockbench Format</td><td>Bedrock Block</td></tr><tr><td>Minecraft Version</td><td>1.21.130+</td></tr></table><h2>Output Format</h2><p>The plugin generates JSON compatible with the <code>minecraft:collision_box</code> component. Paste the generated JSON into your block's behavior file under the <code>components</code> section.</p>\",\n\n        \"tags\": [\n            \"Minecraft: Bedrock Edition\",\n            \"Format: Bedrock Block\"\n        ], variant: 'both',\n        version: '1.0.0',\n\t\tmin_version: \"4.12.6\",\n        onload() {\n            action = new Action('open_block_collision_editor', {\n                name: 'Setup Block Collisions',\n                icon: 'view_comfy_alt',\n                condition: _ => Format.id === 'bedrock_block',\n                click: () => {\n                    window.BlockCollisionManager.setupObject();\n                    window.BlockCollisionManager.dialog.show();\n                    $('#blackout').hide(0);\n                    window.BlockCollisionManager.redrawAllBoxes();\n                    window.BlockCollisionManager.updateResultOutput();\n                }\n            });\n            MenuBar.addAction(action, 'filter');\n        },\n        onunload() {\n            action.delete();\n        }\n    });\n\n})();"
  },
  {
    "path": "plugins/block_multi_collisions/changelog.json",
    "content": "{\n\t\"1.0.0\": {\n\t\t\"title\": \"v1.0.0\",\n\t\t\"author\": \"Minato\",\n\t\t\"date\": \"2025-12-28\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Initial release\",\n\t\t\t\t\t\"Visual wireframe preview of up to 16 collision boxes in 3D viewport\",\n\t\t\t\t\t\"Numeric controls for size/offset with automatic Bedrock bounds validation\",\n\t\t\t\t\t\"Box index navigation to edit multiple collision boxes\",\n\t\t\t\t\t\"Auto-generate collision boxes from visible model cubes\",\n\t\t\t\t\t\"Copy to clipboard with visual feedback\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/block_multi_collisions/members.yml",
    "content": "maintainers:\n    - minecraftBedrockArabic # Minato (minato4743)"
  },
  {
    "path": "plugins/blockmodels-exporter.js",
    "content": "!function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,\"a\",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p=\"\",r(r.s=1)}([function(t,e){var r;r=function(){return this}();try{r=r||Function(\"return this\")()||(0,eval)(\"this\")}catch(t){\"object\"==typeof window&&(r=window)}t.exports=r},function(t,e,r){\"use strict\";var n=function(t){return t&&t.__esModule?t:{default:t}}(r(2));(()=>{let t=null;Plugin.register(\"blockmodels-exporter\",{title:\"Export to BlockModels.com\",icon:\"web\",author:\"TheDestruc7i0n\",description:\"Export models from Blockbench directly to BlockModels.com\",version:\"1.0.2\",variant:\"both\",onload(){t=new Action(\"export-blockmodels\",{name:\"Export to BlockModels.com\",icon:\"web\",click:()=>{\"java_block\"===Format.id?(0,n.default)(t=>{$.ajax({type:\"POST\",url:\"https://blockmodels.com/api/submit\",data:t,contentType:!1,processData:!1,xhr:function(){let t=$.ajaxSettings.xhr();return t.upload&&t.upload.addEventListener(\"progress\",function(t){t.lengthComputable&&$(\"#blockmodels_upload_progress .progress_bar .progress_bar_inner\").last().css(\"width\",100*t.loaded/t.total+\"%\")},!1),t},success:t=>{t.error?alert(`An error occurred in uploading: ${t.error}`):(alert(`Model uploaded! https://blockmodels.com/model/${t.id}`),hideDialog()),window.blockmodels_confirming=!1},error:()=>{alert(\"An error occurred in uploading.\"),window.blockmodels_confirming=!1}})}):alert(\"This type of model is not supported yet!\")}}),MenuBar.addAction(t,\"filter\")},onunload(){MenuBar.removeAction(\"filter.export-blockmodels\"),$(\".blockmodels_css\").remove(),localStorage&&localStorage.getItem(\"blockmodels_api_key\")&&localStorage.removeItem(\"blockmodels_api_key\")}}),window.blockmodels_confirming=!1})()},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=a(r(3)),i=a(r(11));function a(t){return t&&t.__esModule?t:{default:t}}e.default=(t=>{const e=t=>{let e=document.createElement(\"canvas\");return e.width=t.width,e.height=t.height,e.getContext(\"2d\").drawImage(t,0,0),e.toDataURL(\"image/png\").replace(/^data:image\\/(png|jpg);base64,/,\"\")};(0,i.default)(async()=>{if(window.blockmodels_confirming)return void alert(\"Already uploading. Please wait.\");window.blockmodels_confirming=!0;const r=$(\"[name=blockmodels__creation_title]\").last().val(),i=$(\"[name=blockmodels__short]\").last().val(),a=$(\"[name=blockmodels__long]\").last().val(),s=$(\"[name=blockmodels__category]\").last().val(),o=$(\"[name=blockmodels__minecraft_version]\").last().val(),u=$(\"[name=blockmodels__api_key]\").last().val();u&&localStorage&&localStorage.setItem(\"blockmodels_api_key\",u);const l=JSON.parse(Codecs.java_block.compile());if(console.log(\"inputs: \",r,i,a,s,o,u,\"bb\",\"bb\"),r&&i&&a&&s&&o&&u){const h=(()=>{const t=Blockbench.textures,r=new n.default;for(let n of t)if(!n.error){let t=n.img;const i=e(t);let a=n.name;r.file(a,i,{base64:!0})}return r})();(t=>{Screencam.cleanCanvas({width:512,height:512},e=>{e=e.replace(/^data:image\\/(png|jpg);base64,/,\"\"),t(e)})})(async e=>{h.file(\"imagelink.png\",e,{base64:!0}),h.file(\"upload.json\",JSON.stringify(l)),console.log(\"zipped file\",h.files);let n=new FormData;n.append(\"uploadlink\",!1),n.append(\"short\",i),n.append(\"long\",a),n.append(\"title\",r),n.append(\"category\",s),n.append(\"mcver\",o),n.append(\"programused\",\"bb\"),n.append(\"source\",\"bb\"),n.append(\"api\",u),n.append(\"files\",await h.generateAsync({type:\"blob\"})),t(n)})}else alert(\"Please fill all fields.\"),window.blockmodels_confirming=!1})})},function(t,e,r){(function(e,r,n){var i;!function(e){t.exports=e()}(function(){return function t(e,r,n){function a(o,u){if(!r[o]){if(!e[o]){if(!u&&(\"function\"==typeof i&&i))return i(o,!0);if(s)return s(o,!0);var l=new Error(\"Cannot find module '\"+o+\"'\");throw l.code=\"MODULE_NOT_FOUND\",l}var h=r[o]={exports:{}};e[o][0].call(h.exports,function(t){return a(e[o][1][t]||t)},h,h.exports,t,e,r,n)}return r[o].exports}for(var s=\"function\"==typeof i&&i,o=0;o<n.length;o++)a(n[o]);return a}({1:[function(t,e,r){\"use strict\";var n=t(\"./utils\"),i=t(\"./support\"),a=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";r.encode=function(t){for(var e,r,i,s,o,u,l,h=[],f=0,c=t.length,d=c,p=\"string\"!==n.getTypeOf(t);f<t.length;)d=c-f,i=p?(e=t[f++],r=f<c?t[f++]:0,f<c?t[f++]:0):(e=t.charCodeAt(f++),r=f<c?t.charCodeAt(f++):0,f<c?t.charCodeAt(f++):0),s=e>>2,o=(3&e)<<4|r>>4,u=1<d?(15&r)<<2|i>>6:64,l=2<d?63&i:64,h.push(a.charAt(s)+a.charAt(o)+a.charAt(u)+a.charAt(l));return h.join(\"\")},r.decode=function(t){var e,r,n,s,o,u,l=0,h=0,f=\"data:\";if(t.substr(0,f.length)===f)throw new Error(\"Invalid base64 input, it looks like a data url.\");var c,d=3*(t=t.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\")).length/4;if(t.charAt(t.length-1)===a.charAt(64)&&d--,t.charAt(t.length-2)===a.charAt(64)&&d--,d%1!=0)throw new Error(\"Invalid base64 input, bad content length.\");for(c=i.uint8array?new Uint8Array(0|d):new Array(0|d);l<t.length;)e=a.indexOf(t.charAt(l++))<<2|(s=a.indexOf(t.charAt(l++)))>>4,r=(15&s)<<4|(o=a.indexOf(t.charAt(l++)))>>2,n=(3&o)<<6|(u=a.indexOf(t.charAt(l++))),c[h++]=e,64!==o&&(c[h++]=r),64!==u&&(c[h++]=n);return c}},{\"./support\":30,\"./utils\":32}],2:[function(t,e,r){\"use strict\";var n=t(\"./external\"),i=t(\"./stream/DataWorker\"),a=t(\"./stream/DataLengthProbe\"),s=t(\"./stream/Crc32Probe\");function o(t,e,r,n,i){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=n,this.compressedContent=i}a=t(\"./stream/DataLengthProbe\"),o.prototype={getContentWorker:function(){var t=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a(\"data_length\")),e=this;return t.on(\"end\",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error(\"Bug : uncompressed data size mismatch\")}),t},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\",this.compressedSize).withStreamInfo(\"uncompressedSize\",this.uncompressedSize).withStreamInfo(\"crc32\",this.crc32).withStreamInfo(\"compression\",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new s).pipe(new a(\"uncompressedSize\")).pipe(e.compressWorker(r)).pipe(new a(\"compressedSize\")).withStreamInfo(\"compression\",e)},e.exports=o},{\"./external\":6,\"./stream/Crc32Probe\":25,\"./stream/DataLengthProbe\":26,\"./stream/DataWorker\":27}],3:[function(t,e,r){\"use strict\";var n=t(\"./stream/GenericWorker\");r.STORE={magic:\"\\0\\0\",compressWorker:function(t){return new n(\"STORE compression\")},uncompressWorker:function(){return new n(\"STORE decompression\")}},r.DEFLATE=t(\"./flate\")},{\"./flate\":7,\"./stream/GenericWorker\":28}],4:[function(t,e,r){\"use strict\";var n=t(\"./utils\"),i=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?\"string\"!==n.getTypeOf(t)?function(t,e,r,n){var a=i,s=0+r;t^=-1;for(var o=0;o<s;o++)t=t>>>8^a[255&(t^e[o])];return-1^t}(0|e,t,t.length):function(t,e,r,n){var a=i,s=0+r;t^=-1;for(var o=0;o<s;o++)t=t>>>8^a[255&(t^e.charCodeAt(o))];return-1^t}(0|e,t,t.length):0}},{\"./utils\":32}],5:[function(t,e,r){\"use strict\";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){\"use strict\";var n;n=\"undefined\"!=typeof Promise?Promise:t(\"lie\"),e.exports={Promise:n}},{lie:37}],7:[function(t,e,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Uint32Array,i=t(\"pako\"),a=t(\"./utils\"),s=t(\"./stream/GenericWorker\"),o=n?\"uint8array\":\"array\";function u(t,e){s.call(this,\"FlateWorker/\"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}r.magic=\"\\b\\0\",a.inherits(u,s),u.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(a.transformTo(o,t.data),!1)},u.prototype.flush=function(){s.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},u.prototype.cleanUp=function(){s.prototype.cleanUp.call(this),this._pako=null},u.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(t){return new u(\"Deflate\",t)},r.uncompressWorker=function(){return new u(\"Inflate\",{})}},{\"./stream/GenericWorker\":28,\"./utils\":32,pako:38}],8:[function(t,e,r){\"use strict\";function n(t,e){var r,n=\"\";for(r=0;r<e;r++)n+=String.fromCharCode(255&t),t>>>=8;return n}function i(t,e,r,i,s,h){var f,c,d=t.file,p=t.compression,m=h!==o.utf8encode,_=a.transformTo(\"string\",h(d.name)),g=a.transformTo(\"string\",o.utf8encode(d.name)),v=d.comment,b=a.transformTo(\"string\",h(v)),y=a.transformTo(\"string\",o.utf8encode(v)),w=g.length!==d.name.length,k=y.length!==v.length,x=\"\",E=\"\",A=\"\",S=d.dir,C=d.date,z={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(z.crc32=t.crc32,z.compressedSize=t.compressedSize,z.uncompressedSize=t.uncompressedSize);var T=0;e&&(T|=8),m||!w&&!k||(T|=2048);var I=0,R=0;S&&(I|=16),\"UNIX\"===s?(R=798,I|=function(t,e){var r=t;return t||(r=S?16893:33204),(65535&r)<<16}(d.unixPermissions)):(R=20,I|=63&(d.dosPermissions||0)),f=C.getUTCHours(),f<<=6,f|=C.getUTCMinutes(),f<<=5,f|=C.getUTCSeconds()/2,c=C.getUTCFullYear()-1980,c<<=4,c|=C.getUTCMonth()+1,c<<=5,c|=C.getUTCDate(),w&&(x+=\"up\"+n((E=n(1,1)+n(u(_),4)+g).length,2)+E),k&&(x+=\"uc\"+n((A=n(1,1)+n(u(b),4)+y).length,2)+A);var B=\"\";return B+=\"\\n\\0\",B+=n(T,2),B+=p.magic,B+=n(f,2),B+=n(c,2),B+=n(z.crc32,4),B+=n(z.compressedSize,4),B+=n(z.uncompressedSize,4),B+=n(_.length,2),B+=n(x.length,2),{fileRecord:l.LOCAL_FILE_HEADER+B+_+x,dirRecord:l.CENTRAL_FILE_HEADER+n(R,2)+B+n(b.length,2)+\"\\0\\0\\0\\0\"+n(I,4)+n(i,4)+_+x+b}}var a=t(\"../utils\"),s=t(\"../stream/GenericWorker\"),o=t(\"../utf8\"),u=t(\"../crc32\"),l=t(\"../signature\");function h(t,e,r,n){s.call(this,\"ZipFileWorker\"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}a.inherits(h,s),h.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,s.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-n-1))/r:100}}))},h.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},h.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return l.DATA_DESCRIPTOR+n(t.crc32,4)+n(t.compressedSize,4)+n(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},h.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e<this.dirRecords.length;e++)this.push({data:this.dirRecords[e],meta:{percent:100}});var r=this.bytesWritten-t,i=function(t,e,r,i,s){var o=a.transformTo(\"string\",s(i));return l.CENTRAL_DIRECTORY_END+\"\\0\\0\\0\\0\"+n(t,2)+n(t,2)+n(e,4)+n(r,4)+n(o.length,2)+o}(this.dirRecords.length,r,t,this.zipComment,this.encodeFileName);this.push({data:i,meta:{percent:100}})},h.prototype.prepareNextSource=function(){this.previous=this._sources.shift(),this.openedSource(this.previous.streamInfo),this.isPaused?this.previous.pause():this.previous.resume()},h.prototype.registerPrevious=function(t){this._sources.push(t);var e=this;return t.on(\"data\",function(t){e.processChunk(t)}),t.on(\"end\",function(){e.closedSource(e.previous.streamInfo),e._sources.length?e.prepareNextSource():e.end()}),t.on(\"error\",function(t){e.error(t)}),this},h.prototype.resume=function(){return!!s.prototype.resume.call(this)&&(!this.previous&&this._sources.length?(this.prepareNextSource(),!0):this.previous||this._sources.length||this.generatedError?void 0:(this.end(),!0))},h.prototype.error=function(t){var e=this._sources;if(!s.prototype.error.call(this,t))return!1;for(var r=0;r<e.length;r++)try{e[r].error(t)}catch(t){}return!0},h.prototype.lock=function(){s.prototype.lock.call(this);for(var t=this._sources,e=0;e<t.length;e++)t[e].lock()},e.exports=h},{\"../crc32\":4,\"../signature\":23,\"../stream/GenericWorker\":28,\"../utf8\":31,\"../utils\":32}],9:[function(t,e,r){\"use strict\";var n=t(\"../compressions\"),i=t(\"./ZipFileWorker\");r.generateWorker=function(t,e,r){var a=new i(e.streamFiles,r,e.platform,e.encodeFileName),s=0;try{t.forEach(function(t,r){s++;var i=function(t,e){var r=t||e,i=n[r];if(!i)throw new Error(r+\" is not a valid compression method !\");return i}(r.options.compression,e.compression),o=r.options.compressionOptions||e.compressionOptions||{},u=r.dir,l=r.date;r._compressWorker(i,o).withStreamInfo(\"file\",{name:t,dir:u,date:l,comment:r.comment||\"\",unixPermissions:r.unixPermissions,dosPermissions:r.dosPermissions}).pipe(a)}),a.entriesCount=s}catch(t){a.error(t)}return a}},{\"../compressions\":3,\"./ZipFileWorker\":8}],10:[function(t,e,r){\"use strict\";function n(){if(!(this instanceof n))return new n;if(arguments.length)throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");this.files={},this.comment=null,this.root=\"\",this.clone=function(){var t=new n;for(var e in this)\"function\"!=typeof this[e]&&(t[e]=this[e]);return t}}(n.prototype=t(\"./object\")).loadAsync=t(\"./load\"),n.support=t(\"./support\"),n.defaults=t(\"./defaults\"),n.version=\"3.4.0\",n.loadAsync=function(t,e){return(new n).loadAsync(t,e)},n.external=t(\"./external\"),e.exports=n},{\"./defaults\":5,\"./external\":6,\"./load\":11,\"./object\":15,\"./support\":30}],11:[function(t,e,r){\"use strict\";var n=t(\"./utils\"),i=t(\"./external\"),a=t(\"./utf8\"),s=(n=t(\"./utils\"),t(\"./zipEntries\")),o=t(\"./stream/Crc32Probe\"),u=t(\"./nodejsUtils\");function l(t){return new i.Promise(function(e,r){var n=t.decompressed.getContentWorker().pipe(new o);n.on(\"error\",function(t){r(t)}).on(\"end\",function(){n.streamInfo.crc32!==t.decompressed.crc32?r(new Error(\"Corrupted zip : CRC32 mismatch\")):e()}).resume()})}e.exports=function(t,e){var r=this;return e=n.extend(e||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:a.utf8decode}),u.isNode&&u.isStream(t)?i.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")):n.prepareContent(\"the loaded zip file\",t,!0,e.optimizedBinaryString,e.base64).then(function(t){var r=new s(e);return r.load(t),r}).then(function(t){var r=[i.Promise.resolve(t)],n=t.files;if(e.checkCRC32)for(var a=0;a<n.length;a++)r.push(l(n[a]));return i.Promise.all(r)}).then(function(t){for(var n=t.shift(),i=n.files,a=0;a<i.length;a++){var s=i[a];r.file(s.fileNameStr,s.decompressed,{binary:!0,optimizedBinaryString:!0,date:s.date,dir:s.dir,comment:s.fileCommentStr.length?s.fileCommentStr:null,unixPermissions:s.unixPermissions,dosPermissions:s.dosPermissions,createFolders:e.createFolders})}return n.zipComment.length&&(r.comment=n.zipComment),r})}},{\"./external\":6,\"./nodejsUtils\":14,\"./stream/Crc32Probe\":25,\"./utf8\":31,\"./utils\":32,\"./zipEntries\":33}],12:[function(t,e,r){\"use strict\";var n=t(\"../utils\"),i=t(\"../stream/GenericWorker\");function a(t,e){i.call(this,\"Nodejs stream input adapter for \"+t),this._upstreamEnded=!1,this._bindStream(e)}n.inherits(a,i),a.prototype._bindStream=function(t){var e=this;(this._stream=t).pause(),t.on(\"data\",function(t){e.push({data:t,meta:{percent:0}})}).on(\"error\",function(t){e.isPaused?this.generatedError=t:e.error(t)}).on(\"end\",function(){e.isPaused?e._upstreamEnded=!0:e.end()})},a.prototype.pause=function(){return!!i.prototype.pause.call(this)&&(this._stream.pause(),!0)},a.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(this._upstreamEnded?this.end():this._stream.resume(),!0)},e.exports=a},{\"../stream/GenericWorker\":28,\"../utils\":32}],13:[function(t,e,r){\"use strict\";var n=t(\"readable-stream\").Readable;function i(t,e,r){n.call(this,e),this._helper=t;var i=this;t.on(\"data\",function(t,e){i.push(t)||i._helper.pause(),r&&r(e)}).on(\"error\",function(t){i.emit(\"error\",t)}).on(\"end\",function(){i.push(null)})}t(\"../utils\").inherits(i,n),i.prototype._read=function(){this._helper.resume()},e.exports=i},{\"../utils\":32,\"readable-stream\":16}],14:[function(t,r,n){\"use strict\";r.exports={isNode:void 0!==e,newBufferFrom:function(t,r){if(e.from&&e.from!==Uint8Array.from)return e.from(t,r);if(\"number\"==typeof t)throw new Error('The \"data\" argument must not be a number');return new e(t,r)},allocBuffer:function(t){if(e.alloc)return e.alloc(t);var r=new e(t);return r.fill(0),r},isBuffer:function(t){return e.isBuffer(t)},isStream:function(t){return t&&\"function\"==typeof t.on&&\"function\"==typeof t.pause&&\"function\"==typeof t.resume}}},{}],15:[function(t,e,r){\"use strict\";function n(t,e,r){var n,i=a.getTypeOf(e),o=a.extend(r||{},u);o.date=o.date||new Date,null!==o.compression&&(o.compression=o.compression.toUpperCase()),\"string\"==typeof o.unixPermissions&&(o.unixPermissions=parseInt(o.unixPermissions,8)),o.unixPermissions&&16384&o.unixPermissions&&(o.dir=!0),o.dosPermissions&&16&o.dosPermissions&&(o.dir=!0),o.dir&&(t=m(t)),o.createFolders&&(n=p(t))&&_.call(this,n,!0);var f=\"string\"===i&&!1===o.binary&&!1===o.base64;r&&void 0!==r.binary||(o.binary=!f),(e instanceof l&&0===e.uncompressedSize||o.dir||!e||0===e.length)&&(o.base64=!1,o.binary=!0,e=\"\",o.compression=\"STORE\",i=\"string\");var g;g=e instanceof l||e instanceof s?e:c.isNode&&c.isStream(e)?new d(t,e):a.prepareContent(t,e,o.binary,o.optimizedBinaryString,o.base64);var v=new h(t,g,o);this.files[t]=v}var i=t(\"./utf8\"),a=t(\"./utils\"),s=t(\"./stream/GenericWorker\"),o=t(\"./stream/StreamHelper\"),u=t(\"./defaults\"),l=t(\"./compressedObject\"),h=t(\"./zipObject\"),f=t(\"./generate\"),c=t(\"./nodejsUtils\"),d=t(\"./nodejs/NodejsStreamInputAdapter\"),p=function(t){\"/\"===t.slice(-1)&&(t=t.substring(0,t.length-1));var e=t.lastIndexOf(\"/\");return 0<e?t.substring(0,e):\"\"},m=function(t){return\"/\"!==t.slice(-1)&&(t+=\"/\"),t},_=function(t,e){return e=void 0!==e?e:u.createFolders,t=m(t),this.files[t]||n.call(this,t,null,{dir:!0,createFolders:e}),this.files[t]};function g(t){return\"[object RegExp]\"===Object.prototype.toString.call(t)}var v={load:function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},forEach:function(t){var e,r,n;for(e in this.files)this.files.hasOwnProperty(e)&&(n=this.files[e],(r=e.slice(this.root.length,e.length))&&e.slice(0,this.root.length)===this.root&&t(r,n))},filter:function(t){var e=[];return this.forEach(function(r,n){t(r,n)&&e.push(n)}),e},file:function(t,e,r){if(1!==arguments.length)return t=this.root+t,n.call(this,t,e,r),this;if(g(t)){var i=t;return this.filter(function(t,e){return!e.dir&&i.test(t)})}var a=this.files[this.root+t];return a&&!a.dir?a:null},folder:function(t){if(!t)return this;if(g(t))return this.filter(function(e,r){return r.dir&&t.test(e)});var e=this.root+t,r=_.call(this,e),n=this.clone();return n.root=r.name,n},remove:function(t){t=this.root+t;var e=this.files[t];if(e||(\"/\"!==t.slice(-1)&&(t+=\"/\"),e=this.files[t]),e&&!e.dir)delete this.files[t];else for(var r=this.filter(function(e,r){return r.name.slice(0,t.length)===t}),n=0;n<r.length;n++)delete this.files[r[n].name];return this},generate:function(t){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},generateInternalStream:function(t){var e,r={};try{if((r=a.extend(t||{},{streamFiles:!1,compression:\"STORE\",compressionOptions:null,type:\"\",platform:\"DOS\",comment:null,mimeType:\"application/zip\",encodeFileName:i.utf8encode})).type=r.type.toLowerCase(),r.compression=r.compression.toUpperCase(),\"binarystring\"===r.type&&(r.type=\"string\"),!r.type)throw new Error(\"No output type specified.\");a.checkSupport(r.type),\"darwin\"!==r.platform&&\"freebsd\"!==r.platform&&\"linux\"!==r.platform&&\"sunos\"!==r.platform||(r.platform=\"UNIX\"),\"win32\"===r.platform&&(r.platform=\"DOS\");var n=r.comment||this.comment||\"\";e=f.generateWorker(this,r,n)}catch(t){(e=new s(\"error\")).error(t)}return new o(e,r.type||\"string\",r.mimeType)},generateAsync:function(t,e){return this.generateInternalStream(t).accumulate(e)},generateNodeStream:function(t,e){return(t=t||{}).type||(t.type=\"nodebuffer\"),this.generateInternalStream(t).toNodejsStream(e)}};e.exports=v},{\"./compressedObject\":2,\"./defaults\":5,\"./generate\":9,\"./nodejs/NodejsStreamInputAdapter\":12,\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31,\"./utils\":32,\"./zipObject\":35}],16:[function(t,e,r){e.exports=t(\"stream\")},{stream:void 0}],17:[function(t,e,r){\"use strict\";var n=t(\"./DataReader\");function i(t){n.call(this,t);for(var e=0;e<this.data.length;e++)t[e]=255&t[e]}t(\"../utils\").inherits(i,n),i.prototype.byteAt=function(t){return this.data[this.zero+t]},i.prototype.lastIndexOfSignature=function(t){for(var e=t.charCodeAt(0),r=t.charCodeAt(1),n=t.charCodeAt(2),i=t.charCodeAt(3),a=this.length-4;0<=a;--a)if(this.data[a]===e&&this.data[a+1]===r&&this.data[a+2]===n&&this.data[a+3]===i)return a-this.zero;return-1},i.prototype.readAndCheckSignature=function(t){var e=t.charCodeAt(0),r=t.charCodeAt(1),n=t.charCodeAt(2),i=t.charCodeAt(3),a=this.readData(4);return e===a[0]&&r===a[1]&&n===a[2]&&i===a[3]},i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return[];var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{\"../utils\":32,\"./DataReader\":18}],18:[function(t,e,r){\"use strict\";var n=t(\"../utils\");function i(t){this.data=t,this.length=t.length,this.index=0,this.zero=0}i.prototype={checkOffset:function(t){this.checkIndex(this.index+t)},checkIndex:function(t){if(this.length<this.zero+t||t<0)throw new Error(\"End of data reached (data length = \"+this.length+\", asked index = \"+t+\"). Corrupted zip ?\")},setIndex:function(t){this.checkIndex(t),this.index=t},skip:function(t){this.setIndex(this.index+t)},byteAt:function(t){},readInt:function(t){var e,r=0;for(this.checkOffset(t),e=this.index+t-1;e>=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return n.transformTo(\"string\",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=i},{\"../utils\":32}],19:[function(t,e,r){\"use strict\";var n=t(\"./Uint8ArrayReader\");function i(t){n.call(this,t)}t(\"../utils\").inherits(i,n),i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{\"../utils\":32,\"./Uint8ArrayReader\":21}],20:[function(t,e,r){\"use strict\";var n=t(\"./DataReader\");function i(t){n.call(this,t)}t(\"../utils\").inherits(i,n),i.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},i.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},i.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},i.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{\"../utils\":32,\"./DataReader\":18}],21:[function(t,e,r){\"use strict\";var n=t(\"./ArrayReader\");function i(t){n.call(this,t)}t(\"../utils\").inherits(i,n),i.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=i},{\"../utils\":32,\"./ArrayReader\":17}],22:[function(t,e,r){\"use strict\";var n=t(\"../utils\"),i=t(\"../support\"),a=t(\"./ArrayReader\"),s=t(\"./StringReader\"),o=t(\"./NodeBufferReader\"),u=t(\"./Uint8ArrayReader\");e.exports=function(t){var e=n.getTypeOf(t);return n.checkSupport(e),\"string\"!==e||i.uint8array?\"nodebuffer\"===e?new o(t):i.uint8array?new u(n.transformTo(\"uint8array\",t)):new a(n.transformTo(\"array\",t)):new s(t)}},{\"../support\":30,\"../utils\":32,\"./ArrayReader\":17,\"./NodeBufferReader\":19,\"./StringReader\":20,\"./Uint8ArrayReader\":21}],23:[function(t,e,r){\"use strict\";r.LOCAL_FILE_HEADER=\"PK\u0003\u0004\",r.CENTRAL_FILE_HEADER=\"PK\u0001\u0002\",r.CENTRAL_DIRECTORY_END=\"PK\u0005\u0006\",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR=\"PK\u0006\u0007\",r.ZIP64_CENTRAL_DIRECTORY_END=\"PK\u0006\u0006\",r.DATA_DESCRIPTOR=\"PK\u0007\\b\"},{}],24:[function(t,e,r){\"use strict\";var n=t(\"./GenericWorker\"),i=t(\"../utils\");function a(t){n.call(this,\"ConvertWorker to \"+t),this.destType=t}i.inherits(a,n),a.prototype.processChunk=function(t){this.push({data:i.transformTo(this.destType,t.data),meta:t.meta})},e.exports=a},{\"../utils\":32,\"./GenericWorker\":28}],25:[function(t,e,r){\"use strict\";var n=t(\"./GenericWorker\"),i=t(\"../crc32\");function a(){n.call(this,\"Crc32Probe\"),this.withStreamInfo(\"crc32\",0)}t(\"../utils\").inherits(a,n),a.prototype.processChunk=function(t){this.streamInfo.crc32=i(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=a},{\"../crc32\":4,\"../utils\":32,\"./GenericWorker\":28}],26:[function(t,e,r){\"use strict\";var n=t(\"../utils\"),i=t(\"./GenericWorker\");function a(t){i.call(this,\"DataLengthProbe for \"+t),this.propName=t,this.withStreamInfo(t,0)}n.inherits(a,i),a.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}i.prototype.processChunk.call(this,t)},e.exports=a},{\"../utils\":32,\"./GenericWorker\":28}],27:[function(t,e,r){\"use strict\";var n=t(\"../utils\"),i=t(\"./GenericWorker\");function a(t){i.call(this,\"DataWorker\");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type=\"\",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=n.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}n.inherits(a,i),a.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},a.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},a.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},a.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case\"string\":t=this.data.substring(this.index,e);break;case\"uint8array\":t=this.data.subarray(this.index,e);break;case\"array\":case\"nodebuffer\":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=a},{\"../utils\":32,\"./GenericWorker\":28}],28:[function(t,e,r){\"use strict\";function n(t){this.name=t||\"default\",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(t){this.emit(\"data\",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit(\"end\"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit(\"error\",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit(\"error\",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r<this._listeners[t].length;r++)this._listeners[t][r].call(this,e)},pipe:function(t){return t.registerPrevious(this)},registerPrevious:function(t){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.streamInfo=t.streamInfo,this.mergeStreamInfo(),this.previous=t;var e=this;return t.on(\"data\",function(t){e.processChunk(t)}),t.on(\"end\",function(){e.end()}),t.on(\"error\",function(t){e.error(t)}),this},pause:function(){return!this.isPaused&&!this.isFinished&&(this.isPaused=!0,this.previous&&this.previous.pause(),!0)},resume:function(){if(!this.isPaused||this.isFinished)return!1;var t=this.isPaused=!1;return this.generatedError&&(this.error(this.generatedError),t=!0),this.previous&&this.previous.resume(),!t},flush:function(){},processChunk:function(t){this.push(t)},withStreamInfo:function(t,e){return this.extraStreamInfo[t]=e,this.mergeStreamInfo(),this},mergeStreamInfo:function(){for(var t in this.extraStreamInfo)this.extraStreamInfo.hasOwnProperty(t)&&(this.streamInfo[t]=this.extraStreamInfo[t])},lock:function(){if(this.isLocked)throw new Error(\"The stream '\"+this+\"' has already been used.\");this.isLocked=!0,this.previous&&this.previous.lock()},toString:function(){var t=\"Worker \"+this.name;return this.previous?this.previous+\" -> \"+t:t}},e.exports=n},{}],29:[function(t,r,n){\"use strict\";var i=t(\"../utils\"),a=t(\"./ConvertWorker\"),s=t(\"./GenericWorker\"),o=t(\"../base64\"),u=t(\"../support\"),l=t(\"../external\"),h=null;if(u.nodestream)try{h=t(\"../nodejs/NodejsStreamOutputAdapter\")}catch(t){}function f(t,e,r){var n=e;switch(e){case\"blob\":case\"arraybuffer\":n=\"uint8array\";break;case\"base64\":n=\"string\"}try{this._internalType=n,this._outputType=e,this._mimeType=r,i.checkSupport(n),this._worker=t.pipe(new a(n)),t.lock()}catch(t){this._worker=new s(\"error\"),this._worker.error(t)}}f.prototype={accumulate:function(t){return function(t,r){return new l.Promise(function(n,a){var s=[],u=t._internalType,l=t._outputType,h=t._mimeType;t.on(\"data\",function(t,e){s.push(t),r&&r(e)}).on(\"error\",function(t){s=[],a(t)}).on(\"end\",function(){try{var t=function(t,e,r){switch(t){case\"blob\":return i.newBlob(i.transformTo(\"arraybuffer\",e),r);case\"base64\":return o.encode(e);default:return i.transformTo(t,e)}}(l,function(t,r){var n,i=0,a=null,s=0;for(n=0;n<r.length;n++)s+=r[n].length;switch(t){case\"string\":return r.join(\"\");case\"array\":return Array.prototype.concat.apply([],r);case\"uint8array\":for(a=new Uint8Array(s),n=0;n<r.length;n++)a.set(r[n],i),i+=r[n].length;return a;case\"nodebuffer\":return e.concat(r);default:throw new Error(\"concat : unsupported type '\"+t+\"'\")}}(u,s),h);n(t)}catch(t){a(t)}s=[]}).resume()})}(this,t)},on:function(t,e){var r=this;return\"data\"===t?this._worker.on(t,function(t){e.call(r,t.data,t.meta)}):this._worker.on(t,function(){i.delay(e,arguments,r)}),this},resume:function(){return i.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(t){if(i.checkSupport(\"nodestream\"),\"nodebuffer\"!==this._outputType)throw new Error(this._outputType+\" is not supported by this method\");return new h(this,{objectMode:\"nodebuffer\"!==this._outputType},t)}},r.exports=f},{\"../base64\":1,\"../external\":6,\"../nodejs/NodejsStreamOutputAdapter\":13,\"../support\":30,\"../utils\":32,\"./ConvertWorker\":24,\"./GenericWorker\":28}],30:[function(t,r,n){\"use strict\";if(n.base64=!0,n.array=!0,n.string=!0,n.arraybuffer=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof Uint8Array,n.nodebuffer=void 0!==e,n.uint8array=\"undefined\"!=typeof Uint8Array,\"undefined\"==typeof ArrayBuffer)n.blob=!1;else{var i=new ArrayBuffer(0);try{n.blob=0===new Blob([i],{type:\"application/zip\"}).size}catch(t){try{var a=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);a.append(i),n.blob=0===a.getBlob(\"application/zip\").size}catch(t){n.blob=!1}}}try{n.nodestream=!!t(\"readable-stream\").Readable}catch(t){n.nodestream=!1}},{\"readable-stream\":16}],31:[function(t,e,r){\"use strict\";for(var n=t(\"./utils\"),i=t(\"./support\"),a=t(\"./nodejsUtils\"),s=t(\"./stream/GenericWorker\"),o=new Array(256),u=0;u<256;u++)o[u]=252<=u?6:248<=u?5:240<=u?4:224<=u?3:192<=u?2:1;function l(){s.call(this,\"utf-8 decode\"),this.leftOver=null}function h(){s.call(this,\"utf-8 encode\")}o[254]=o[254]=1,r.utf8encode=function(t){return i.nodebuffer?a.newBufferFrom(t,\"utf-8\"):function(t){var e,r,n,a,s,o=t.length,u=0;for(a=0;a<o;a++)55296==(64512&(r=t.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=t.charCodeAt(a+1)))&&(r=65536+(r-55296<<10)+(n-56320),a++),u+=r<128?1:r<2048?2:r<65536?3:4;for(e=i.uint8array?new Uint8Array(u):new Array(u),a=s=0;s<u;a++)55296==(64512&(r=t.charCodeAt(a)))&&a+1<o&&56320==(64512&(n=t.charCodeAt(a+1)))&&(r=65536+(r-55296<<10)+(n-56320),a++),r<128?e[s++]=r:(r<2048?e[s++]=192|r>>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},r.utf8decode=function(t){return i.nodebuffer?n.transformTo(\"nodebuffer\",t).toString(\"utf-8\"):function(t){var e,r,i,a,s=t.length,u=new Array(2*s);for(e=r=0;e<s;)if((i=t[e++])<128)u[r++]=i;else if(4<(a=o[i]))u[r++]=65533,e+=a-1;else{for(i&=2===a?31:3===a?15:7;1<a&&e<s;)i=i<<6|63&t[e++],a--;1<a?u[r++]=65533:i<65536?u[r++]=i:(i-=65536,u[r++]=55296|i>>10&1023,u[r++]=56320|1023&i)}return u.length!==r&&(u.subarray?u=u.subarray(0,r):u.length=r),n.applyFromCharCode(u)}(t=n.transformTo(i.uint8array?\"uint8array\":\"array\",t))},n.inherits(l,s),l.prototype.processChunk=function(t){var e=n.transformTo(i.uint8array?\"uint8array\":\"array\",t.data);if(this.leftOver&&this.leftOver.length){if(i.uint8array){var a=e;(e=new Uint8Array(a.length+this.leftOver.length)).set(this.leftOver,0),e.set(a,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var s=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+o[t[r]]>e?r:e}(e),u=e;s!==e.length&&(i.uint8array?(u=e.subarray(0,s),this.leftOver=e.subarray(s,e.length)):(u=e.slice(0,s),this.leftOver=e.slice(s,e.length))),this.push({data:r.utf8decode(u),meta:t.meta})},l.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=l,n.inherits(h,s),h.prototype.processChunk=function(t){this.push({data:r.utf8encode(t.data),meta:t.meta})},r.Utf8EncodeWorker=h},{\"./nodejsUtils\":14,\"./stream/GenericWorker\":28,\"./support\":30,\"./utils\":32}],32:[function(t,e,r){\"use strict\";var n=t(\"./support\"),i=t(\"./base64\"),a=t(\"./nodejsUtils\"),s=t(\"set-immediate-shim\"),o=t(\"./external\");function u(t){return t}function l(t,e){for(var r=0;r<t.length;++r)e[r]=255&t.charCodeAt(r);return e}r.newBlob=function(t,e){r.checkSupport(\"blob\");try{return new Blob([t],{type:e})}catch(r){try{var n=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);return n.append(t),n.getBlob(e)}catch(t){throw new Error(\"Bug : can't construct the Blob.\")}}};var h={stringifyByChunk:function(t,e,r){var n=[],i=0,a=t.length;if(a<=r)return String.fromCharCode.apply(null,t);for(;i<a;)\"array\"===e||\"nodebuffer\"===e?n.push(String.fromCharCode.apply(null,t.slice(i,Math.min(i+r,a)))):n.push(String.fromCharCode.apply(null,t.subarray(i,Math.min(i+r,a)))),i+=r;return n.join(\"\")},stringifyByChar:function(t){for(var e=\"\",r=0;r<t.length;r++)e+=String.fromCharCode(t[r]);return e},applyCanBeUsed:{uint8array:function(){try{return n.uint8array&&1===String.fromCharCode.apply(null,new Uint8Array(1)).length}catch(t){return!1}}(),nodebuffer:function(){try{return n.nodebuffer&&1===String.fromCharCode.apply(null,a.allocBuffer(1)).length}catch(t){return!1}}()}};function f(t){var e=65536,n=r.getTypeOf(t),i=!0;if(\"uint8array\"===n?i=h.applyCanBeUsed.uint8array:\"nodebuffer\"===n&&(i=h.applyCanBeUsed.nodebuffer),i)for(;1<e;)try{return h.stringifyByChunk(t,n,e)}catch(t){e=Math.floor(e/2)}return h.stringifyByChar(t)}function c(t,e){for(var r=0;r<t.length;r++)e[r]=t[r];return e}r.applyFromCharCode=f;var d={};d.string={string:u,array:function(t){return l(t,new Array(t.length))},arraybuffer:function(t){return d.string.uint8array(t).buffer},uint8array:function(t){return l(t,new Uint8Array(t.length))},nodebuffer:function(t){return l(t,a.allocBuffer(t.length))}},d.array={string:f,array:u,arraybuffer:function(t){return new Uint8Array(t).buffer},uint8array:function(t){return new Uint8Array(t)},nodebuffer:function(t){return a.newBufferFrom(t)}},d.arraybuffer={string:function(t){return f(new Uint8Array(t))},array:function(t){return c(new Uint8Array(t),new Array(t.byteLength))},arraybuffer:u,uint8array:function(t){return new Uint8Array(t)},nodebuffer:function(t){return a.newBufferFrom(new Uint8Array(t))}},d.uint8array={string:f,array:function(t){return c(t,new Array(t.length))},arraybuffer:function(t){return t.buffer},uint8array:u,nodebuffer:function(t){return a.newBufferFrom(t)}},d.nodebuffer={string:f,array:function(t){return c(t,new Array(t.length))},arraybuffer:function(t){return d.nodebuffer.uint8array(t).buffer},uint8array:function(t){return c(t,new Uint8Array(t.length))},nodebuffer:u},r.transformTo=function(t,e){if(e=e||\"\",!t)return e;r.checkSupport(t);var n=r.getTypeOf(e);return d[n][t](e)},r.getTypeOf=function(t){return\"string\"==typeof t?\"string\":\"[object Array]\"===Object.prototype.toString.call(t)?\"array\":n.nodebuffer&&a.isBuffer(t)?\"nodebuffer\":n.uint8array&&t instanceof Uint8Array?\"uint8array\":n.arraybuffer&&t instanceof ArrayBuffer?\"arraybuffer\":void 0},r.checkSupport=function(t){if(!n[t.toLowerCase()])throw new Error(t+\" is not supported by this platform\")},r.MAX_VALUE_16BITS=65535,r.MAX_VALUE_32BITS=-1,r.pretty=function(t){var e,r,n=\"\";for(r=0;r<(t||\"\").length;r++)n+=\"\\\\x\"+((e=t.charCodeAt(r))<16?\"0\":\"\")+e.toString(16).toUpperCase();return n},r.delay=function(t,e,r){s(function(){t.apply(r||null,e||[])})},r.inherits=function(t,e){function r(){}r.prototype=e.prototype,t.prototype=new r},r.extend=function(){var t,e,r={};for(t=0;t<arguments.length;t++)for(e in arguments[t])arguments[t].hasOwnProperty(e)&&void 0===r[e]&&(r[e]=arguments[t][e]);return r},r.prepareContent=function(t,e,a,s,u){return o.Promise.resolve(e).then(function(t){return n.blob&&(t instanceof Blob||-1!==[\"[object File]\",\"[object Blob]\"].indexOf(Object.prototype.toString.call(t)))&&\"undefined\"!=typeof FileReader?new o.Promise(function(e,r){var n=new FileReader;n.onload=function(t){e(t.target.result)},n.onerror=function(t){r(t.target.error)},n.readAsArrayBuffer(t)}):t}).then(function(e){var h=r.getTypeOf(e);return h?(\"arraybuffer\"===h?e=r.transformTo(\"uint8array\",e):\"string\"===h&&(u?e=i.decode(e):a&&!0!==s&&(e=function(t){return l(t,n.uint8array?new Uint8Array(t.length):new Array(t.length))}(e))),e):o.Promise.reject(new Error(\"Can't read the data of '\"+t+\"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"))})}},{\"./base64\":1,\"./external\":6,\"./nodejsUtils\":14,\"./support\":30,\"set-immediate-shim\":54}],33:[function(t,e,r){\"use strict\";var n=t(\"./reader/readerFor\"),i=t(\"./utils\"),a=t(\"./signature\"),s=t(\"./zipEntry\"),o=(t(\"./utf8\"),t(\"./support\"));function u(t){this.files=[],this.loadOptions=t}u.prototype={checkSignature:function(t){if(!this.reader.readAndCheckSignature(t)){this.reader.index-=4;var e=this.reader.readString(4);throw new Error(\"Corrupted zip or bug: unexpected signature (\"+i.pretty(e)+\", expected \"+i.pretty(t)+\")\")}},isSignature:function(t,e){var r=this.reader.index;this.reader.setIndex(t);var n=this.reader.readString(4)===e;return this.reader.setIndex(r),n},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var t=this.reader.readData(this.zipCommentLength),e=o.uint8array?\"uint8array\":\"array\",r=i.transformTo(e,t);this.zipComment=this.loadOptions.decodeFileName(r)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var t,e,r,n=this.zip64EndOfCentralSize-44;0<n;)t=this.reader.readInt(2),e=this.reader.readInt(4),r=this.reader.readData(e),this.zip64ExtensibleData[t]={id:t,length:e,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw new Error(\"Multi-volumes zip are not supported\")},readLocalFiles:function(){var t,e;for(t=0;t<this.files.length;t++)e=this.files[t],this.reader.setIndex(e.localHeaderOffset),this.checkSignature(a.LOCAL_FILE_HEADER),e.readLocalPart(this.reader),e.handleUTF8(),e.processAttributes()},readCentralDir:function(){var t;for(this.reader.setIndex(this.centralDirOffset);this.reader.readAndCheckSignature(a.CENTRAL_FILE_HEADER);)(t=new s({zip64:this.zip64},this.loadOptions)).readCentralPart(this.reader),this.files.push(t);if(this.centralDirRecords!==this.files.length&&0!==this.centralDirRecords&&0===this.files.length)throw new Error(\"Corrupted zip or bug: expected \"+this.centralDirRecords+\" records in central dir, got \"+this.files.length)},readEndOfCentral:function(){var t=this.reader.lastIndexOfSignature(a.CENTRAL_DIRECTORY_END);if(t<0)throw this.isSignature(0,a.LOCAL_FILE_HEADER)?new Error(\"Corrupted zip: can't find end of central directory\"):new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");this.reader.setIndex(t);var e=t;if(this.checkSignature(a.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,(t=this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR))<0)throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");if(this.reader.setIndex(t),this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,a.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var r=this.centralDirOffset+this.centralDirSize;this.zip64&&(r+=20,r+=12+this.zip64EndOfCentralSize);var n=e-r;if(0<n)this.isSignature(e,a.CENTRAL_FILE_HEADER)||(this.reader.zero=n);else if(n<0)throw new Error(\"Corrupted zip: missing \"+Math.abs(n)+\" bytes.\")},prepareReader:function(t){this.reader=n(t)},load:function(t){this.prepareReader(t),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},e.exports=u},{\"./reader/readerFor\":22,\"./signature\":23,\"./support\":30,\"./utf8\":31,\"./utils\":32,\"./zipEntry\":34}],34:[function(t,e,r){\"use strict\";var n=t(\"./reader/readerFor\"),i=t(\"./utils\"),a=t(\"./compressedObject\"),s=t(\"./crc32\"),o=t(\"./utf8\"),u=t(\"./compressions\"),l=t(\"./support\");function h(t,e){this.options=t,this.loadOptions=e}h.prototype={isEncrypted:function(){return 1==(1&this.bitFlag)},useUTF8:function(){return 2048==(2048&this.bitFlag)},readLocalPart:function(t){var e,r;if(t.skip(22),this.fileNameLength=t.readInt(2),r=t.readInt(2),this.fileName=t.readData(this.fileNameLength),t.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");if(null===(e=function(t){for(var e in u)if(u.hasOwnProperty(e)&&u[e].magic===t)return u[e];return null}(this.compressionMethod)))throw new Error(\"Corrupted zip : compression \"+i.pretty(this.compressionMethod)+\" unknown (inner file : \"+i.transformTo(\"string\",this.fileName)+\")\");this.decompressed=new a(this.compressedSize,this.uncompressedSize,this.crc32,e,t.readData(this.compressedSize))},readCentralPart:function(t){this.versionMadeBy=t.readInt(2),t.skip(2),this.bitFlag=t.readInt(2),this.compressionMethod=t.readString(2),this.date=t.readDate(),this.crc32=t.readInt(4),this.compressedSize=t.readInt(4),this.uncompressedSize=t.readInt(4);var e=t.readInt(2);if(this.extraFieldsLength=t.readInt(2),this.fileCommentLength=t.readInt(2),this.diskNumberStart=t.readInt(2),this.internalFileAttributes=t.readInt(2),this.externalFileAttributes=t.readInt(4),this.localHeaderOffset=t.readInt(4),this.isEncrypted())throw new Error(\"Encrypted zip are not supported\");t.skip(e),this.readExtraFields(t),this.parseZIP64ExtraField(t),this.fileComment=t.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var t=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||\"/\"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,n,i=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index<i;)e=t.readInt(2),r=t.readInt(2),n=t.readData(r),this.extraFields[e]={id:e,length:r,value:n}},handleUTF8:function(){var t=l.uint8array?\"uint8array\":\"array\";if(this.useUTF8())this.fileNameStr=o.utf8decode(this.fileName),this.fileCommentStr=o.utf8decode(this.fileComment);else{var e=this.findExtraFieldUnicodePath();if(null!==e)this.fileNameStr=e;else{var r=i.transformTo(t,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(r)}var n=this.findExtraFieldUnicodeComment();if(null!==n)this.fileCommentStr=n;else{var a=i.transformTo(t,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(a)}}},findExtraFieldUnicodePath:function(){var t=this.extraFields[28789];if(t){var e=n(t.value);return 1!==e.readInt(1)?null:s(this.fileName)!==e.readInt(4)?null:o.utf8decode(e.readData(t.length-5))}return null},findExtraFieldUnicodeComment:function(){var t=this.extraFields[25461];if(t){var e=n(t.value);return 1!==e.readInt(1)?null:s(this.fileComment)!==e.readInt(4)?null:o.utf8decode(e.readData(t.length-5))}return null}},e.exports=h},{\"./compressedObject\":2,\"./compressions\":3,\"./crc32\":4,\"./reader/readerFor\":22,\"./support\":30,\"./utf8\":31,\"./utils\":32}],35:[function(t,e,r){\"use strict\";function n(t,e,r){this.name=t,this.dir=r.dir,this.date=r.date,this.comment=r.comment,this.unixPermissions=r.unixPermissions,this.dosPermissions=r.dosPermissions,this._data=e,this._dataBinary=r.binary,this.options={compression:r.compression,compressionOptions:r.compressionOptions}}var i=t(\"./stream/StreamHelper\"),a=t(\"./stream/DataWorker\"),s=t(\"./utf8\"),o=t(\"./compressedObject\"),u=t(\"./stream/GenericWorker\");n.prototype={internalStream:function(t){var e=null,r=\"string\";try{if(!t)throw new Error(\"No output type specified.\");var n=\"string\"===(r=t.toLowerCase())||\"text\"===r;\"binarystring\"!==r&&\"text\"!==r||(r=\"string\"),e=this._decompressWorker();var a=!this._dataBinary;a&&!n&&(e=e.pipe(new s.Utf8EncodeWorker)),!a&&n&&(e=e.pipe(new s.Utf8DecodeWorker))}catch(t){(e=new u(\"error\")).error(t)}return new i(e,r,\"\")},async:function(t,e){return this.internalStream(t).accumulate(e)},nodeStream:function(t,e){return this.internalStream(t||\"nodebuffer\").toNodejsStream(e)},_compressWorker:function(t,e){if(this._data instanceof o&&this._data.compression.magic===t.magic)return this._data.getCompressedWorker();var r=this._decompressWorker();return this._dataBinary||(r=r.pipe(new s.Utf8EncodeWorker)),o.createWorkerFrom(r,t,e)},_decompressWorker:function(){return this._data instanceof o?this._data.getContentWorker():this._data instanceof u?this._data:new a(this._data)}};for(var l=[\"asText\",\"asBinary\",\"asNodeBuffer\",\"asUint8Array\",\"asArrayBuffer\"],h=function(){throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\")},f=0;f<l.length;f++)n.prototype[l[f]]=h;e.exports=n},{\"./compressedObject\":2,\"./stream/DataWorker\":27,\"./stream/GenericWorker\":28,\"./stream/StreamHelper\":29,\"./utf8\":31}],36:[function(t,e,n){(function(t){\"use strict\";var r,n,i=t.MutationObserver||t.WebKitMutationObserver;if(i){var a=0,s=new i(h),o=t.document.createTextNode(\"\");s.observe(o,{characterData:!0}),r=function(){o.data=a=++a%2}}else if(t.setImmediate||void 0===t.MessageChannel)r=\"document\"in t&&\"onreadystatechange\"in t.document.createElement(\"script\")?function(){var e=t.document.createElement(\"script\");e.onreadystatechange=function(){h(),e.onreadystatechange=null,e.parentNode.removeChild(e),e=null},t.document.documentElement.appendChild(e)}:function(){setTimeout(h,0)};else{var u=new t.MessageChannel;u.port1.onmessage=h,r=function(){u.port2.postMessage(0)}}var l=[];function h(){var t,e;n=!0;for(var r=l.length;r;){for(e=l,l=[],t=-1;++t<r;)e[t]();r=l.length}n=!1}e.exports=function(t){1!==l.push(t)||n||r()}}).call(this,void 0!==r?r:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{})},{}],37:[function(t,e,r){\"use strict\";var n=t(\"immediate\");function i(){}var a={},s=[\"REJECTED\"],o=[\"FULFILLED\"],u=[\"PENDING\"];function l(t){if(\"function\"!=typeof t)throw new TypeError(\"resolver must be a function\");this.state=u,this.queue=[],this.outcome=void 0,t!==i&&d(this,t)}function h(t,e,r){this.promise=t,\"function\"==typeof e&&(this.onFulfilled=e,this.callFulfilled=this.otherCallFulfilled),\"function\"==typeof r&&(this.onRejected=r,this.callRejected=this.otherCallRejected)}function f(t,e,r){n(function(){var n;try{n=e(r)}catch(n){return a.reject(t,n)}n===t?a.reject(t,new TypeError(\"Cannot resolve promise with itself\")):a.resolve(t,n)})}function c(t){var e=t&&t.then;if(t&&(\"object\"==typeof t||\"function\"==typeof t)&&\"function\"==typeof e)return function(){e.apply(t,arguments)}}function d(t,e){var r=!1;function n(e){r||(r=!0,a.reject(t,e))}function i(e){r||(r=!0,a.resolve(t,e))}var s=p(function(){e(i,n)});\"error\"===s.status&&n(s.value)}function p(t,e){var r={};try{r.value=t(e),r.status=\"success\"}catch(t){r.status=\"error\",r.value=t}return r}(e.exports=l).prototype.finally=function(t){if(\"function\"!=typeof t)return this;var e=this.constructor;return this.then(function(r){return e.resolve(t()).then(function(){return r})},function(r){return e.resolve(t()).then(function(){throw r})})},l.prototype.catch=function(t){return this.then(null,t)},l.prototype.then=function(t,e){if(\"function\"!=typeof t&&this.state===o||\"function\"!=typeof e&&this.state===s)return this;var r=new this.constructor(i);return this.state!==u?f(r,this.state===o?t:e,this.outcome):this.queue.push(new h(r,t,e)),r},h.prototype.callFulfilled=function(t){a.resolve(this.promise,t)},h.prototype.otherCallFulfilled=function(t){f(this.promise,this.onFulfilled,t)},h.prototype.callRejected=function(t){a.reject(this.promise,t)},h.prototype.otherCallRejected=function(t){f(this.promise,this.onRejected,t)},a.resolve=function(t,e){var r=p(c,e);if(\"error\"===r.status)return a.reject(t,r.value);var n=r.value;if(n)d(t,n);else{t.state=o,t.outcome=e;for(var i=-1,s=t.queue.length;++i<s;)t.queue[i].callFulfilled(e)}return t},a.reject=function(t,e){t.state=s,t.outcome=e;for(var r=-1,n=t.queue.length;++r<n;)t.queue[r].callRejected(e);return t},l.resolve=function(t){return t instanceof this?t:a.resolve(new this(i),t)},l.reject=function(t){var e=new this(i);return a.reject(e,t)},l.all=function(t){var e=this;if(\"[object Array]\"!==Object.prototype.toString.call(t))return this.reject(new TypeError(\"must be an array\"));var r=t.length,n=!1;if(!r)return this.resolve([]);for(var s=new Array(r),o=0,u=-1,l=new this(i);++u<r;)h(t[u],u);return l;function h(t,i){e.resolve(t).then(function(t){s[i]=t,++o!==r||n||(n=!0,a.resolve(l,s))},function(t){n||(n=!0,a.reject(l,t))})}},l.race=function(t){if(\"[object Array]\"!==Object.prototype.toString.call(t))return this.reject(new TypeError(\"must be an array\"));var e=t.length,r=!1;if(!e)return this.resolve([]);for(var n,s=-1,o=new this(i);++s<e;)n=t[s],this.resolve(n).then(function(t){r||(r=!0,a.resolve(o,t))},function(t){r||(r=!0,a.reject(o,t))});return o}},{immediate:36}],38:[function(t,e,r){\"use strict\";var n={};(0,t(\"./lib/utils/common\").assign)(n,t(\"./lib/deflate\"),t(\"./lib/inflate\"),t(\"./lib/zlib/constants\")),e.exports=n},{\"./lib/deflate\":39,\"./lib/inflate\":40,\"./lib/utils/common\":41,\"./lib/zlib/constants\":44}],39:[function(t,e,r){\"use strict\";var n=t(\"./zlib/deflate\"),i=t(\"./utils/common\"),a=t(\"./utils/strings\"),s=t(\"./zlib/messages\"),o=t(\"./zlib/zstream\"),u=Object.prototype.toString,l=0,h=-1,f=0,c=8;function d(t){if(!(this instanceof d))return new d(t);this.options=i.assign({level:h,method:c,chunkSize:16384,windowBits:15,memLevel:8,strategy:f,to:\"\"},t||{});var e=this.options;e.raw&&0<e.windowBits?e.windowBits=-e.windowBits:e.gzip&&0<e.windowBits&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new o,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(r!==l)throw new Error(s[r]);if(e.header&&n.deflateSetHeader(this.strm,e.header),e.dictionary){var p;if(p=\"string\"==typeof e.dictionary?a.string2buf(e.dictionary):\"[object ArrayBuffer]\"===u.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,(r=n.deflateSetDictionary(this.strm,p))!==l)throw new Error(s[r]);this._dict_set=!0}}function p(t,e){var r=new d(e);if(r.push(t,!0),r.err)throw r.msg||s[r.err];return r.result}d.prototype.push=function(t,e){var r,s,o=this.strm,h=this.options.chunkSize;if(this.ended)return!1;s=e===~~e?e:!0===e?4:0,\"string\"==typeof t?o.input=a.string2buf(t):\"[object ArrayBuffer]\"===u.call(t)?o.input=new Uint8Array(t):o.input=t,o.next_in=0,o.avail_in=o.input.length;do{if(0===o.avail_out&&(o.output=new i.Buf8(h),o.next_out=0,o.avail_out=h),1!==(r=n.deflate(o,s))&&r!==l)return this.onEnd(r),!(this.ended=!0);0!==o.avail_out&&(0!==o.avail_in||4!==s&&2!==s)||(\"string\"===this.options.to?this.onData(a.buf2binstring(i.shrinkBuf(o.output,o.next_out))):this.onData(i.shrinkBuf(o.output,o.next_out)))}while((0<o.avail_in||0===o.avail_out)&&1!==r);return 4===s?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l):2!==s||(this.onEnd(l),!(o.avail_out=0))},d.prototype.onData=function(t){this.chunks.push(t)},d.prototype.onEnd=function(t){t===l&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},r.Deflate=d,r.deflate=p,r.deflateRaw=function(t,e){return(e=e||{}).raw=!0,p(t,e)},r.gzip=function(t,e){return(e=e||{}).gzip=!0,p(t,e)}},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/deflate\":46,\"./zlib/messages\":51,\"./zlib/zstream\":53}],40:[function(t,e,r){\"use strict\";var n=t(\"./zlib/inflate\"),i=t(\"./utils/common\"),a=t(\"./utils/strings\"),s=t(\"./zlib/constants\"),o=t(\"./zlib/messages\"),u=t(\"./zlib/zstream\"),l=t(\"./zlib/gzheader\"),h=Object.prototype.toString;function f(t){if(!(this instanceof f))return new f(t);this.options=i.assign({chunkSize:16384,windowBits:0,to:\"\"},t||{});var e=this.options;e.raw&&0<=e.windowBits&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(0<=e.windowBits&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),15<e.windowBits&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new u,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,e.windowBits);if(r!==s.Z_OK)throw new Error(o[r]);this.header=new l,n.inflateGetHeader(this.strm,this.header)}function c(t,e){var r=new f(e);if(r.push(t,!0),r.err)throw r.msg||o[r.err];return r.result}f.prototype.push=function(t,e){var r,o,u,l,f,c,d=this.strm,p=this.options.chunkSize,m=this.options.dictionary,_=!1;if(this.ended)return!1;o=e===~~e?e:!0===e?s.Z_FINISH:s.Z_NO_FLUSH,\"string\"==typeof t?d.input=a.binstring2buf(t):\"[object ArrayBuffer]\"===h.call(t)?d.input=new Uint8Array(t):d.input=t,d.next_in=0,d.avail_in=d.input.length;do{if(0===d.avail_out&&(d.output=new i.Buf8(p),d.next_out=0,d.avail_out=p),(r=n.inflate(d,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&m&&(c=\"string\"==typeof m?a.string2buf(m):\"[object ArrayBuffer]\"===h.call(m)?new Uint8Array(m):m,r=n.inflateSetDictionary(this.strm,c)),r===s.Z_BUF_ERROR&&!0===_&&(r=s.Z_OK,_=!1),r!==s.Z_STREAM_END&&r!==s.Z_OK)return this.onEnd(r),!(this.ended=!0);d.next_out&&(0!==d.avail_out&&r!==s.Z_STREAM_END&&(0!==d.avail_in||o!==s.Z_FINISH&&o!==s.Z_SYNC_FLUSH)||(\"string\"===this.options.to?(u=a.utf8border(d.output,d.next_out),l=d.next_out-u,f=a.buf2string(d.output,u),d.next_out=l,d.avail_out=p-l,l&&i.arraySet(d.output,d.output,u,l,0),this.onData(f)):this.onData(i.shrinkBuf(d.output,d.next_out)))),0===d.avail_in&&0===d.avail_out&&(_=!0)}while((0<d.avail_in||0===d.avail_out)&&r!==s.Z_STREAM_END);return r===s.Z_STREAM_END&&(o=s.Z_FINISH),o===s.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===s.Z_OK):o!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),!(d.avail_out=0))},f.prototype.onData=function(t){this.chunks.push(t)},f.prototype.onEnd=function(t){t===s.Z_OK&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg},r.Inflate=f,r.inflate=c,r.inflateRaw=function(t,e){return(e=e||{}).raw=!0,c(t,e)},r.ungzip=c},{\"./utils/common\":41,\"./utils/strings\":42,\"./zlib/constants\":44,\"./zlib/gzheader\":47,\"./zlib/inflate\":49,\"./zlib/messages\":51,\"./zlib/zstream\":53}],41:[function(t,e,r){\"use strict\";var n=\"undefined\"!=typeof Uint8Array&&\"undefined\"!=typeof Uint16Array&&\"undefined\"!=typeof Int32Array;r.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var r=e.shift();if(r){if(\"object\"!=typeof r)throw new TypeError(r+\"must be non-object\");for(var n in r)r.hasOwnProperty(n)&&(t[n]=r[n])}}return t},r.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var i={arraySet:function(t,e,r,n,i){if(e.subarray&&t.subarray)t.set(e.subarray(r,r+n),i);else for(var a=0;a<n;a++)t[i+a]=e[r+a]},flattenChunks:function(t){var e,r,n,i,a,s;for(e=n=0,r=t.length;e<r;e++)n+=t[e].length;for(s=new Uint8Array(n),e=i=0,r=t.length;e<r;e++)a=t[e],s.set(a,i),i+=a.length;return s}},a={arraySet:function(t,e,r,n,i){for(var a=0;a<n;a++)t[i+a]=e[r+a]},flattenChunks:function(t){return[].concat.apply([],t)}};r.setTyped=function(t){t?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,a))},r.setTyped(n)},{}],42:[function(t,e,r){\"use strict\";var n=t(\"./common\"),i=!0,a=!0;try{String.fromCharCode.apply(null,[0])}catch(t){i=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(t){a=!1}for(var s=new n.Buf8(256),o=0;o<256;o++)s[o]=252<=o?6:248<=o?5:240<=o?4:224<=o?3:192<=o?2:1;function u(t,e){if(e<65537&&(t.subarray&&a||!t.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(t,e));for(var r=\"\",s=0;s<e;s++)r+=String.fromCharCode(t[s]);return r}s[254]=s[254]=1,r.string2buf=function(t){var e,r,i,a,s,o=t.length,u=0;for(a=0;a<o;a++)55296==(64512&(r=t.charCodeAt(a)))&&a+1<o&&56320==(64512&(i=t.charCodeAt(a+1)))&&(r=65536+(r-55296<<10)+(i-56320),a++),u+=r<128?1:r<2048?2:r<65536?3:4;for(e=new n.Buf8(u),a=s=0;s<u;a++)55296==(64512&(r=t.charCodeAt(a)))&&a+1<o&&56320==(64512&(i=t.charCodeAt(a+1)))&&(r=65536+(r-55296<<10)+(i-56320),a++),r<128?e[s++]=r:(r<2048?e[s++]=192|r>>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return u(t,t.length)},r.binstring2buf=function(t){for(var e=new n.Buf8(t.length),r=0,i=e.length;r<i;r++)e[r]=t.charCodeAt(r);return e},r.buf2string=function(t,e){var r,n,i,a,o=e||t.length,l=new Array(2*o);for(r=n=0;r<o;)if((i=t[r++])<128)l[n++]=i;else if(4<(a=s[i]))l[n++]=65533,r+=a-1;else{for(i&=2===a?31:3===a?15:7;1<a&&r<o;)i=i<<6|63&t[r++],a--;1<a?l[n++]=65533:i<65536?l[n++]=i:(i-=65536,l[n++]=55296|i>>10&1023,l[n++]=56320|1023&i)}return u(l,n)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+s[t[r]]>e?r:e}},{\"./common\":41}],43:[function(t,e,r){\"use strict\";e.exports=function(t,e,r,n){for(var i=65535&t|0,a=t>>>16&65535|0,s=0;0!==r;){for(r-=s=2e3<r?2e3:r;a=a+(i=i+e[n++]|0)|0,--s;);i%=65521,a%=65521}return i|a<<16|0}},{}],44:[function(t,e,r){\"use strict\";e.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],45:[function(t,e,r){\"use strict\";var n=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var a=n,s=i+r;t^=-1;for(var o=i;o<s;o++)t=t>>>8^a[255&(t^e[o])];return-1^t}},{}],46:[function(t,e,r){\"use strict\";var n,i=t(\"../utils/common\"),a=t(\"./trees\"),s=t(\"./adler32\"),o=t(\"./crc32\"),u=t(\"./messages\"),l=0,h=4,f=0,c=-2,d=-1,p=4,m=2,_=8,g=9,v=286,b=30,y=19,w=2*v+1,k=15,x=3,E=258,A=E+x+1,S=42,C=113,z=1,T=2,I=3,R=4;function B(t,e){return t.msg=u[e],e}function O(t){return(t<<1)-(4<t?9:0)}function P(t){for(var e=t.length;0<=--e;)t[e]=0}function D(t){var e=t.state,r=e.pending;r>t.avail_out&&(r=t.avail_out),0!==r&&(i.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function U(t,e){a._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,D(t.strm)}function F(t,e){t.pending_buf[t.pending++]=e}function L(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function N(t,e){var r,n,i=t.max_chain_length,a=t.strstart,s=t.prev_length,o=t.nice_match,u=t.strstart>t.w_size-A?t.strstart-(t.w_size-A):0,l=t.window,h=t.w_mask,f=t.prev,c=t.strstart+E,d=l[a+s-1],p=l[a+s];t.prev_length>=t.good_match&&(i>>=2),o>t.lookahead&&(o=t.lookahead);do{if(l[(r=e)+s]===p&&l[r+s-1]===d&&l[r]===l[a]&&l[++r]===l[a+1]){a+=2,r++;do{}while(l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&l[++a]===l[++r]&&a<c);if(n=E-(c-a),a=c-E,s<n){if(t.match_start=e,o<=(s=n))break;d=l[a+s-1],p=l[a+s]}}}while((e=f[e&h])>u&&0!=--i);return s<=t.lookahead?s:t.lookahead}function M(t){var e,r,n,a,u,l,h,f,c,d,p=t.w_size;do{if(a=t.window_size-t.lookahead-t.strstart,t.strstart>=p+(p-A)){for(i.arraySet(t.window,t.window,p,p,0),t.match_start-=p,t.strstart-=p,t.block_start-=p,e=r=t.hash_size;n=t.head[--e],t.head[e]=p<=n?n-p:0,--r;);for(e=r=p;n=t.prev[--e],t.prev[e]=p<=n?n-p:0,--r;);a+=p}if(0===t.strm.avail_in)break;if(l=t.strm,h=t.window,f=t.strstart+t.lookahead,d=void 0,(c=a)<(d=l.avail_in)&&(d=c),r=0===d?0:(l.avail_in-=d,i.arraySet(h,l.input,l.next_in,d,f),1===l.state.wrap?l.adler=s(l.adler,h,d,f):2===l.state.wrap&&(l.adler=o(l.adler,h,d,f)),l.next_in+=d,l.total_in+=d,d),t.lookahead+=r,t.lookahead+t.insert>=x)for(u=t.strstart-t.insert,t.ins_h=t.window[u],t.ins_h=(t.ins_h<<t.hash_shift^t.window[u+1])&t.hash_mask;t.insert&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[u+x-1])&t.hash_mask,t.prev[u&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=u,u++,t.insert--,!(t.lookahead+t.insert<x)););}while(t.lookahead<A&&0!==t.strm.avail_in)}function j(t,e){for(var r,n;;){if(t.lookahead<A){if(M(t),t.lookahead<A&&e===l)return z;if(0===t.lookahead)break}if(r=0,t.lookahead>=x&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+x-1])&t.hash_mask,r=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!==r&&t.strstart-r<=t.w_size-A&&(t.match_length=N(t,r)),t.match_length>=x)if(n=a._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+x-1])&t.hash_mask,r=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart,0!=--t.match_length;);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.ins_h=t.window[t.strstart],t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+1])&t.hash_mask;else n=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(n&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=t.strstart<x-1?t.strstart:x-1,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}function Z(t,e){for(var r,n,i;;){if(t.lookahead<A){if(M(t),t.lookahead<A&&e===l)return z;if(0===t.lookahead)break}if(r=0,t.lookahead>=x&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+x-1])&t.hash_mask,r=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=x-1,0!==r&&t.prev_length<t.max_lazy_match&&t.strstart-r<=t.w_size-A&&(t.match_length=N(t,r),t.match_length<=5&&(1===t.strategy||t.match_length===x&&4096<t.strstart-t.match_start)&&(t.match_length=x-1)),t.prev_length>=x&&t.match_length<=t.prev_length){for(i=t.strstart+t.lookahead-x,n=a._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=i&&(t.ins_h=(t.ins_h<<t.hash_shift^t.window[t.strstart+x-1])&t.hash_mask,r=t.prev[t.strstart&t.w_mask]=t.head[t.ins_h],t.head[t.ins_h]=t.strstart),0!=--t.prev_length;);if(t.match_available=0,t.match_length=x-1,t.strstart++,n&&(U(t,!1),0===t.strm.avail_out))return z}else if(t.match_available){if((n=a._tr_tally(t,0,t.window[t.strstart-1]))&&U(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return z}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(n=a._tr_tally(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<x-1?t.strstart:x-1,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}function W(t,e,r,n,i){this.good_length=t,this.max_lazy=e,this.nice_length=r,this.max_chain=n,this.func=i}function Y(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=_,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new i.Buf16(2*w),this.dyn_dtree=new i.Buf16(2*(2*b+1)),this.bl_tree=new i.Buf16(2*(2*y+1)),P(this.dyn_ltree),P(this.dyn_dtree),P(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new i.Buf16(k+1),this.heap=new i.Buf16(2*v+1),P(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new i.Buf16(2*v+1),P(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function H(t){var e;return t&&t.state?(t.total_in=t.total_out=0,t.data_type=m,(e=t.state).pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=e.wrap?S:C,t.adler=2===e.wrap?0:1,e.last_flush=l,a._tr_init(e),f):B(t,c)}function G(t){var e=H(t);return e===f&&function(t){t.window_size=2*t.w_size,P(t.head),t.max_lazy_match=n[t.level].max_lazy,t.good_match=n[t.level].good_length,t.nice_match=n[t.level].nice_length,t.max_chain_length=n[t.level].max_chain,t.strstart=0,t.block_start=0,t.lookahead=0,t.insert=0,t.match_length=t.prev_length=x-1,t.match_available=0,t.ins_h=0}(t.state),e}function K(t,e,r,n,a,s){if(!t)return c;var o=1;if(e===d&&(e=6),n<0?(o=0,n=-n):15<n&&(o=2,n-=16),a<1||g<a||r!==_||n<8||15<n||e<0||9<e||s<0||p<s)return B(t,c);8===n&&(n=9);var u=new Y;return(t.state=u).strm=t,u.wrap=o,u.gzhead=null,u.w_bits=n,u.w_size=1<<u.w_bits,u.w_mask=u.w_size-1,u.hash_bits=a+7,u.hash_size=1<<u.hash_bits,u.hash_mask=u.hash_size-1,u.hash_shift=~~((u.hash_bits+x-1)/x),u.window=new i.Buf8(2*u.w_size),u.head=new i.Buf16(u.hash_size),u.prev=new i.Buf16(u.w_size),u.lit_bufsize=1<<a+6,u.pending_buf_size=4*u.lit_bufsize,u.pending_buf=new i.Buf8(u.pending_buf_size),u.d_buf=1*u.lit_bufsize,u.l_buf=3*u.lit_bufsize,u.level=e,u.strategy=s,u.method=r,G(t)}n=[new W(0,0,0,0,function(t,e){var r=65535;for(r>t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(M(t),0===t.lookahead&&e===l)return z;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var n=t.block_start+r;if((0===t.strstart||t.strstart>=n)&&(t.lookahead=t.strstart-n,t.strstart=n,U(t,!1),0===t.strm.avail_out))return z;if(t.strstart-t.block_start>=t.w_size-A&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):(t.strstart>t.block_start&&(U(t,!1),t.strm.avail_out),z)}),new W(4,4,8,4,j),new W(4,5,16,8,j),new W(4,6,32,32,j),new W(4,4,16,16,Z),new W(8,16,32,32,Z),new W(8,16,128,128,Z),new W(8,32,128,256,Z),new W(32,128,258,1024,Z),new W(32,258,258,4096,Z)],r.deflateInit=function(t,e){return K(t,e,_,15,8,0)},r.deflateInit2=K,r.deflateReset=G,r.deflateResetKeep=H,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?c:(t.state.gzhead=e,f):c},r.deflate=function(t,e){var r,i,s,u;if(!t||!t.state||5<e||e<0)return t?B(t,c):c;if(i=t.state,!t.output||!t.input&&0!==t.avail_in||666===i.status&&e!==h)return B(t,0===t.avail_out?-5:c);if(i.strm=t,r=i.last_flush,i.last_flush=e,i.status===S)if(2===i.wrap)t.adler=0,F(i,31),F(i,139),F(i,8),i.gzhead?(F(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),F(i,255&i.gzhead.time),F(i,i.gzhead.time>>8&255),F(i,i.gzhead.time>>16&255),F(i,i.gzhead.time>>24&255),F(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),F(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(F(i,255&i.gzhead.extra.length),F(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=o(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(F(i,0),F(i,0),F(i,0),F(i,0),F(i,0),F(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),F(i,3),i.status=C);else{var d=_+(i.w_bits-8<<4)<<8;d|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(d|=32),d+=31-d%31,i.status=C,L(i,d),0!==i.strstart&&(L(i,t.adler>>>16),L(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending!==i.pending_buf_size));)F(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindex<i.gzhead.name.length?255&i.gzhead.name.charCodeAt(i.gzindex++):0,F(i,u)}while(0!==u);i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),D(t),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindex<i.gzhead.comment.length?255&i.gzhead.comment.charCodeAt(i.gzindex++):0,F(i,u)}while(0!==u);i.gzhead.hcrc&&i.pending>s&&(t.adler=o(t.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&D(t),i.pending+2<=i.pending_buf_size&&(F(i,255&t.adler),F(i,t.adler>>8&255),t.adler=0,i.status=C)):i.status=C),0!==i.pending){if(D(t),0===t.avail_out)return i.last_flush=-1,f}else if(0===t.avail_in&&O(e)<=O(r)&&e!==h)return B(t,-5);if(666===i.status&&0!==t.avail_in)return B(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var p=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(M(t),0===t.lookahead)){if(e===l)return z;break}if(t.match_length=0,r=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}(i,e):3===i.strategy?function(t,e){for(var r,n,i,s,o=t.window;;){if(t.lookahead<=E){if(M(t),t.lookahead<=E&&e===l)return z;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0<t.strstart&&(n=o[i=t.strstart-1])===o[++i]&&n===o[++i]&&n===o[++i]){s=t.strstart+E;do{}while(n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&i<s);t.match_length=E-(s-i),t.match_length>t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=a._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=a._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(U(t,!1),0===t.strm.avail_out))return z}return t.insert=0,e===h?(U(t,!0),0===t.strm.avail_out?I:R):t.last_lit&&(U(t,!1),0===t.strm.avail_out)?z:T}(i,e):n[i.level].func(i,e);if(p!==I&&p!==R||(i.status=666),p===z||p===I)return 0===t.avail_out&&(i.last_flush=-1),f;if(p===T&&(1===e?a._tr_align(i):5!==e&&(a._tr_stored_block(i,0,0,!1),3===e&&(P(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),D(t),0===t.avail_out))return i.last_flush=-1,f}return e!==h?f:i.wrap<=0?1:(2===i.wrap?(F(i,255&t.adler),F(i,t.adler>>8&255),F(i,t.adler>>16&255),F(i,t.adler>>24&255),F(i,255&t.total_in),F(i,t.total_in>>8&255),F(i,t.total_in>>16&255),F(i,t.total_in>>24&255)):(L(i,t.adler>>>16),L(i,65535&t.adler)),D(t),0<i.wrap&&(i.wrap=-i.wrap),0!==i.pending?f:1)},r.deflateEnd=function(t){var e;return t&&t.state?(e=t.state.status)!==S&&69!==e&&73!==e&&91!==e&&103!==e&&e!==C&&666!==e?B(t,c):(t.state=null,e===C?B(t,-3):f):c},r.deflateSetDictionary=function(t,e){var r,n,a,o,u,l,h,d,p=e.length;if(!t||!t.state)return c;if(2===(o=(r=t.state).wrap)||1===o&&r.status!==S||r.lookahead)return c;for(1===o&&(t.adler=s(t.adler,e,p,0)),r.wrap=0,p>=r.w_size&&(0===o&&(P(r.head),r.strstart=0,r.block_start=0,r.insert=0),d=new i.Buf8(r.w_size),i.arraySet(d,e,p-r.w_size,r.w_size,0),e=d,p=r.w_size),u=t.avail_in,l=t.next_in,h=t.input,t.avail_in=p,t.next_in=0,t.input=e,M(r);r.lookahead>=x;){for(n=r.strstart,a=r.lookahead-(x-1);r.ins_h=(r.ins_h<<r.hash_shift^r.window[n+x-1])&r.hash_mask,r.prev[n&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=n,n++,--a;);r.strstart=n,r.lookahead=x-1,M(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=x-1,r.match_available=0,t.next_in=l,t.input=h,t.avail_in=u,r.wrap=o,f},r.deflateInfo=\"pako deflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./messages\":51,\"./trees\":52}],47:[function(t,e,r){\"use strict\";e.exports=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1}},{}],48:[function(t,e,r){\"use strict\";e.exports=function(t,e){var r,n,i,a,s,o,u,l,h,f,c,d,p,m,_,g,v,b,y,w,k,x,E,A,S;r=t.state,n=t.next_in,A=t.input,i=n+(t.avail_in-5),a=t.next_out,S=t.output,s=a-(e-t.avail_out),o=a+(t.avail_out-257),u=r.dmax,l=r.wsize,h=r.whave,f=r.wnext,c=r.window,d=r.hold,p=r.bits,m=r.lencode,_=r.distcode,g=(1<<r.lenbits)-1,v=(1<<r.distbits)-1;t:do{p<15&&(d+=A[n++]<<p,p+=8,d+=A[n++]<<p,p+=8),b=m[d&g];e:for(;;){if(d>>>=y=b>>>24,p-=y,0==(y=b>>>16&255))S[a++]=65535&b;else{if(!(16&y)){if(0==(64&y)){b=m[(65535&b)+(d&(1<<y)-1)];continue e}if(32&y){r.mode=12;break t}t.msg=\"invalid literal/length code\",r.mode=30;break t}w=65535&b,(y&=15)&&(p<y&&(d+=A[n++]<<p,p+=8),w+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=A[n++]<<p,p+=8,d+=A[n++]<<p,p+=8),b=_[d&v];r:for(;;){if(d>>>=y=b>>>24,p-=y,!(16&(y=b>>>16&255))){if(0==(64&y)){b=_[(65535&b)+(d&(1<<y)-1)];continue r}t.msg=\"invalid distance code\",r.mode=30;break t}if(k=65535&b,p<(y&=15)&&(d+=A[n++]<<p,(p+=8)<y&&(d+=A[n++]<<p,p+=8)),u<(k+=d&(1<<y)-1)){t.msg=\"invalid distance too far back\",r.mode=30;break t}if(d>>>=y,p-=y,(y=a-s)<k){if(h<(y=k-y)&&r.sane){t.msg=\"invalid distance too far back\",r.mode=30;break t}if(E=c,(x=0)===f){if(x+=l-y,y<w){for(w-=y;S[a++]=c[x++],--y;);x=a-k,E=S}}else if(f<y){if(x+=l+f-y,(y-=f)<w){for(w-=y;S[a++]=c[x++],--y;);if(x=0,f<w){for(w-=y=f;S[a++]=c[x++],--y;);x=a-k,E=S}}}else if(x+=f-y,y<w){for(w-=y;S[a++]=c[x++],--y;);x=a-k,E=S}for(;2<w;)S[a++]=E[x++],S[a++]=E[x++],S[a++]=E[x++],w-=3;w&&(S[a++]=E[x++],1<w&&(S[a++]=E[x++]))}else{for(x=a-k;S[a++]=S[x++],S[a++]=S[x++],S[a++]=S[x++],2<(w-=3););w&&(S[a++]=S[x++],1<w&&(S[a++]=S[x++]))}break}}break}}while(n<i&&a<o);n-=w=p>>3,d&=(1<<(p-=w<<3))-1,t.next_in=n,t.next_out=a,t.avail_in=n<i?i-n+5:5-(n-i),t.avail_out=a<o?o-a+257:257-(a-o),r.hold=d,r.bits=p}},{}],49:[function(t,e,r){\"use strict\";var n=t(\"../utils/common\"),i=t(\"./adler32\"),a=t(\"./crc32\"),s=t(\"./inffast\"),o=t(\"./inftrees\"),u=1,l=2,h=0,f=-2,c=1,d=852,p=592;function m(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function _(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg=\"\",e.wrap&&(t.adler=1&e.wrap),e.mode=c,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new n.Buf32(d),e.distcode=e.distdyn=new n.Buf32(p),e.sane=1,e.back=-1,h):f}function g(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,_(t)):f}function v(t,e){var r,n;return t&&t.state?(n=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15<e)?f:(null!==n.window&&n.wbits!==e&&(n.window=null),n.wrap=r,n.wbits=e,g(t))):f}function b(t,e){var r,i;return t?(i=new function(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0},(t.state=i).window=null,(r=v(t,e))!==h&&(t.state=null),r):f}var y,w,k=!0;function x(t){if(k){var e;for(y=new n.Buf32(512),w=new n.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(o(u,t.lens,0,288,y,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;o(l,t.lens,0,32,w,0,t.work,{bits:5}),k=!1}t.lencode=y,t.lenbits=9,t.distcode=w,t.distbits=5}function E(t,e,r,i){var a,s=t.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new n.Buf8(s.wsize)),i>=s.wsize?(n.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(a=s.wsize-s.wnext)&&(a=i),n.arraySet(s.window,e,r-i,a,s.wnext),(i-=a)?(n.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=a,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=a))),0}r.inflateReset=g,r.inflateReset2=v,r.inflateResetKeep=_,r.inflateInit=function(t){return b(t,15)},r.inflateInit2=b,r.inflate=function(t,e){var r,d,p,_,g,v,b,y,w,k,A,S,C,z,T,I,R,B,O,P,D,U,F,L,N=0,M=new n.Buf8(4),j=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!t||!t.state||!t.output||!t.input&&0!==t.avail_in)return f;12===(r=t.state).mode&&(r.mode=13),g=t.next_out,p=t.output,b=t.avail_out,_=t.next_in,d=t.input,v=t.avail_in,y=r.hold,w=r.bits,k=v,A=b,U=h;t:for(;;)switch(r.mode){case c:if(0===r.wrap){r.mode=13;break}for(;w<16;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(2&r.wrap&&35615===y){M[r.check=0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0),w=y=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&y)<<8)+(y>>8))%31){t.msg=\"incorrect header check\",r.mode=30;break}if(8!=(15&y)){t.msg=\"unknown compression method\",r.mode=30;break}if(w-=4,D=8+(15&(y>>>=4)),0===r.wbits)r.wbits=D;else if(D>r.wbits){t.msg=\"invalid window size\",r.mode=30;break}r.dmax=1<<D,t.adler=r.check=1,r.mode=512&y?10:12,w=y=0;break;case 2:for(;w<16;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(r.flags=y,8!=(255&r.flags)){t.msg=\"unknown compression method\",r.mode=30;break}if(57344&r.flags){t.msg=\"unknown header flags set\",r.mode=30;break}r.head&&(r.head.text=y>>8&1),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0)),w=y=0,r.mode=3;case 3:for(;w<32;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.head&&(r.head.time=y),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,M[2]=y>>>16&255,M[3]=y>>>24&255,r.check=a(r.check,M,4,0)),w=y=0,r.mode=4;case 4:for(;w<16;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.head&&(r.head.xflags=255&y,r.head.os=y>>8),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0)),w=y=0,r.mode=5;case 5:if(1024&r.flags){for(;w<16;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.length=y,r.head&&(r.head.extra_len=y),512&r.flags&&(M[0]=255&y,M[1]=y>>>8&255,r.check=a(r.check,M,2,0)),w=y=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(v<(S=r.length)&&(S=v),S&&(r.head&&(D=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,d,_,S,D)),512&r.flags&&(r.check=a(r.check,d,S,_)),v-=S,_+=S,r.length-=S),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===v)break t;for(S=0;D=d[_+S++],r.head&&D&&r.length<65536&&(r.head.name+=String.fromCharCode(D)),D&&S<v;);if(512&r.flags&&(r.check=a(r.check,d,S,_)),v-=S,_+=S,D)break t}else r.head&&(r.head.name=null);r.length=0,r.mode=8;case 8:if(4096&r.flags){if(0===v)break t;for(S=0;D=d[_+S++],r.head&&D&&r.length<65536&&(r.head.comment+=String.fromCharCode(D)),D&&S<v;);if(512&r.flags&&(r.check=a(r.check,d,S,_)),v-=S,_+=S,D)break t}else r.head&&(r.head.comment=null);r.mode=9;case 9:if(512&r.flags){for(;w<16;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(y!==(65535&r.check)){t.msg=\"header crc mismatch\",r.mode=30;break}w=y=0}r.head&&(r.head.hcrc=r.flags>>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;w<32;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}t.adler=r.check=m(y),w=y=0,r.mode=11;case 11:if(0===r.havedict)return t.next_out=g,t.avail_out=b,t.next_in=_,t.avail_in=v,r.hold=y,r.bits=w,2;t.adler=r.check=1,r.mode=12;case 12:if(5===e||6===e)break t;case 13:if(r.last){y>>>=7&w,w-=7&w,r.mode=27;break}for(;w<3;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}switch(r.last=1&y,w-=1,3&(y>>>=1)){case 0:r.mode=14;break;case 1:if(x(r),r.mode=20,6!==e)break;y>>>=2,w-=2;break t;case 2:r.mode=17;break;case 3:t.msg=\"invalid block type\",r.mode=30}y>>>=2,w-=2;break;case 14:for(y>>>=7&w,w-=7&w;w<32;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if((65535&y)!=(y>>>16^65535)){t.msg=\"invalid stored block lengths\",r.mode=30;break}if(r.length=65535&y,w=y=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(S=r.length){if(v<S&&(S=v),b<S&&(S=b),0===S)break t;n.arraySet(p,d,_,S,g),v-=S,_+=S,b-=S,g+=S,r.length-=S;break}r.mode=12;break;case 17:for(;w<14;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(r.nlen=257+(31&y),y>>>=5,w-=5,r.ndist=1+(31&y),y>>>=5,w-=5,r.ncode=4+(15&y),y>>>=4,w-=4,286<r.nlen||30<r.ndist){t.msg=\"too many length or distance symbols\",r.mode=30;break}r.have=0,r.mode=18;case 18:for(;r.have<r.ncode;){for(;w<3;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.lens[j[r.have++]]=7&y,y>>>=3,w-=3}for(;r.have<19;)r.lens[j[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,F={bits:r.lenbits},U=o(0,r.lens,0,19,r.lencode,0,r.work,F),r.lenbits=F.bits,U){t.msg=\"invalid code lengths set\",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have<r.nlen+r.ndist;){for(;I=(N=r.lencode[y&(1<<r.lenbits)-1])>>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(R<16)y>>>=T,w-=T,r.lens[r.have++]=R;else{if(16===R){for(L=T+2;w<L;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(y>>>=T,w-=T,0===r.have){t.msg=\"invalid bit length repeat\",r.mode=30;break}D=r.lens[r.have-1],S=3+(3&y),y>>>=2,w-=2}else if(17===R){for(L=T+3;w<L;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}w-=T,D=0,S=3+(7&(y>>>=T)),y>>>=3,w-=3}else{for(L=T+7;w<L;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}w-=T,D=0,S=11+(127&(y>>>=T)),y>>>=7,w-=7}if(r.have+S>r.nlen+r.ndist){t.msg=\"invalid bit length repeat\",r.mode=30;break}for(;S--;)r.lens[r.have++]=D}}if(30===r.mode)break;if(0===r.lens[256]){t.msg=\"invalid code -- missing end-of-block\",r.mode=30;break}if(r.lenbits=9,F={bits:r.lenbits},U=o(u,r.lens,0,r.nlen,r.lencode,0,r.work,F),r.lenbits=F.bits,U){t.msg=\"invalid literal/lengths set\",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,F={bits:r.distbits},U=o(l,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,F),r.distbits=F.bits,U){t.msg=\"invalid distances set\",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(6<=v&&258<=b){t.next_out=g,t.avail_out=b,t.next_in=_,t.avail_in=v,r.hold=y,r.bits=w,s(t,A),g=t.next_out,p=t.output,b=t.avail_out,_=t.next_in,d=t.input,v=t.avail_in,y=r.hold,w=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;I=(N=r.lencode[y&(1<<r.lenbits)-1])>>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(I&&0==(240&I)){for(B=T,O=I,P=R;I=(N=r.lencode[P+((y&(1<<B+O)-1)>>B)])>>>16&255,R=65535&N,!(B+(T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}y>>>=B,w-=B,r.back+=B}if(y>>>=T,w-=T,r.back+=T,r.length=R,0===I){r.mode=26;break}if(32&I){r.back=-1,r.mode=12;break}if(64&I){t.msg=\"invalid literal/length code\",r.mode=30;break}r.extra=15&I,r.mode=22;case 22:if(r.extra){for(L=r.extra;w<L;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.length+=y&(1<<r.extra)-1,y>>>=r.extra,w-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;I=(N=r.distcode[y&(1<<r.distbits)-1])>>>16&255,R=65535&N,!((T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(0==(240&I)){for(B=T,O=I,P=R;I=(N=r.distcode[P+((y&(1<<B+O)-1)>>B)])>>>16&255,R=65535&N,!(B+(T=N>>>24)<=w);){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}y>>>=B,w-=B,r.back+=B}if(y>>>=T,w-=T,r.back+=T,64&I){t.msg=\"invalid distance code\",r.mode=30;break}r.offset=R,r.extra=15&I,r.mode=24;case 24:if(r.extra){for(L=r.extra;w<L;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}r.offset+=y&(1<<r.extra)-1,y>>>=r.extra,w-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg=\"invalid distance too far back\",r.mode=30;break}r.mode=25;case 25:if(0===b)break t;if(S=A-b,r.offset>S){if((S=r.offset-S)>r.whave&&r.sane){t.msg=\"invalid distance too far back\",r.mode=30;break}C=S>r.wnext?(S-=r.wnext,r.wsize-S):r.wnext-S,S>r.length&&(S=r.length),z=r.window}else z=p,C=g-r.offset,S=r.length;for(b<S&&(S=b),b-=S,r.length-=S;p[g++]=z[C++],--S;);0===r.length&&(r.mode=21);break;case 26:if(0===b)break t;p[g++]=r.length,b--,r.mode=21;break;case 27:if(r.wrap){for(;w<32;){if(0===v)break t;v--,y|=d[_++]<<w,w+=8}if(A-=b,t.total_out+=A,r.total+=A,A&&(t.adler=r.check=r.flags?a(r.check,p,A,g-A):i(r.check,p,A,g-A)),A=b,(r.flags?y:m(y))!==r.check){t.msg=\"incorrect data check\",r.mode=30;break}w=y=0}r.mode=28;case 28:if(r.wrap&&r.flags){for(;w<32;){if(0===v)break t;v--,y+=d[_++]<<w,w+=8}if(y!==(4294967295&r.total)){t.msg=\"incorrect length check\",r.mode=30;break}w=y=0}r.mode=29;case 29:U=1;break t;case 30:U=-3;break t;case 31:return-4;case 32:default:return f}return t.next_out=g,t.avail_out=b,t.next_in=_,t.avail_in=v,r.hold=y,r.bits=w,(r.wsize||A!==t.avail_out&&r.mode<30&&(r.mode<27||4!==e))&&E(t,t.output,t.next_out,A-t.avail_out)?(r.mode=31,-4):(k-=t.avail_in,A-=t.avail_out,t.total_in+=k,t.total_out+=A,r.total+=A,r.wrap&&A&&(t.adler=r.check=r.flags?a(r.check,p,A,t.next_out-A):i(r.check,p,A,t.next_out-A)),t.data_type=r.bits+(r.last?64:0)+(12===r.mode?128:0)+(20===r.mode||15===r.mode?256:0),(0==k&&0===A||4===e)&&U===h&&(U=-5),U)},r.inflateEnd=function(t){if(!t||!t.state)return f;var e=t.state;return e.window&&(e.window=null),t.state=null,h},r.inflateGetHeader=function(t,e){var r;return t&&t.state?0==(2&(r=t.state).wrap)?f:((r.head=e).done=!1,h):f},r.inflateSetDictionary=function(t,e){var r,n=e.length;return t&&t.state?0!==(r=t.state).wrap&&11!==r.mode?f:11===r.mode&&i(1,e,n,0)!==r.check?-3:E(t,e,n,n)?(r.mode=31,-4):(r.havedict=1,h):f},r.inflateInfo=\"pako inflate (from Nodeca project)\"},{\"../utils/common\":41,\"./adler32\":43,\"./crc32\":45,\"./inffast\":48,\"./inftrees\":50}],50:[function(t,e,r){\"use strict\";var n=t(\"../utils/common\"),i=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],a=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],o=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];e.exports=function(t,e,r,u,l,h,f,c){var d,p,m,_,g,v,b,y,w,k=c.bits,x=0,E=0,A=0,S=0,C=0,z=0,T=0,I=0,R=0,B=0,O=null,P=0,D=new n.Buf16(16),U=new n.Buf16(16),F=null,L=0;for(x=0;x<=15;x++)D[x]=0;for(E=0;E<u;E++)D[e[r+E]]++;for(C=k,S=15;1<=S&&0===D[S];S--);if(S<C&&(C=S),0===S)return l[h++]=20971520,l[h++]=20971520,c.bits=1,0;for(A=1;A<S&&0===D[A];A++);for(C<A&&(C=A),x=I=1;x<=15;x++)if(I<<=1,(I-=D[x])<0)return-1;if(0<I&&(0===t||1!==S))return-1;for(U[1]=0,x=1;x<15;x++)U[x+1]=U[x]+D[x];for(E=0;E<u;E++)0!==e[r+E]&&(f[U[e[r+E]]++]=E);if(v=0===t?(O=F=f,19):1===t?(O=i,P-=257,F=a,L-=257,256):(O=s,F=o,-1),x=A,g=h,T=E=B=0,m=-1,_=(R=1<<(z=C))-1,1===t&&852<R||2===t&&592<R)return 1;for(;;){for(b=x-T,w=f[E]<v?(y=0,f[E]):f[E]>v?(y=F[L+f[E]],O[P+f[E]]):(y=96,0),d=1<<x-T,A=p=1<<z;l[g+(B>>T)+(p-=d)]=b<<24|y<<16|w|0,0!==p;);for(d=1<<x-1;B&d;)d>>=1;if(0!==d?(B&=d-1,B+=d):B=0,E++,0==--D[x]){if(x===S)break;x=e[r+f[E]]}if(C<x&&(B&_)!==m){for(0===T&&(T=C),g+=A,I=1<<(z=x-T);z+T<S&&!((I-=D[z+T])<=0);)z++,I<<=1;if(R+=1<<z,1===t&&852<R||2===t&&592<R)return 1;l[m=B&_]=C<<24|z<<16|g-h|0}}return 0!==B&&(l[g+B]=x-T<<24|64<<16|0),c.bits=C,0}},{\"../utils/common\":41}],51:[function(t,e,r){\"use strict\";e.exports={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"}},{}],52:[function(t,e,r){\"use strict\";var n=t(\"../utils/common\");function i(t){for(var e=t.length;0<=--e;)t[e]=0}var a=0,s=256,o=s+1+29,u=30,l=19,h=2*o+1,f=15,c=16,d=256,p=16,m=17,_=18,g=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],v=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],b=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],y=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],w=new Array(2*(o+2));i(w);var k=new Array(2*u);i(k);var x=new Array(512);i(x);var E=new Array(256);i(E);var A=new Array(29);i(A);var S,C,z,T=new Array(u);function I(t,e,r,n,i){this.static_tree=t,this.extra_bits=e,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=t&&t.length}function R(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function B(t){return t<256?x[t]:x[256+(t>>>7)]}function O(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<<t.bi_valid&65535,O(t,t.bi_buf),t.bi_buf=e>>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<<t.bi_valid&65535,t.bi_valid+=r)}function D(t,e,r){P(t,r[2*e],r[2*e+1])}function U(t,e){for(var r=0;r|=1&t,t>>>=1,r<<=1,0<--e;);return r>>>1}function F(t,e,r){var n,i,a=new Array(f+1),s=0;for(n=1;n<=f;n++)a[n]=s=s+r[n-1]<<1;for(i=0;i<=e;i++){var o=t[2*i+1];0!==o&&(t[2*i]=U(a[o]++,o))}}function L(t){var e;for(e=0;e<o;e++)t.dyn_ltree[2*e]=0;for(e=0;e<u;e++)t.dyn_dtree[2*e]=0;for(e=0;e<l;e++)t.bl_tree[2*e]=0;t.dyn_ltree[2*d]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function N(t){8<t.bi_valid?O(t,t.bi_buf):0<t.bi_valid&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function M(t,e,r,n){var i=2*e,a=2*r;return t[i]<t[a]||t[i]===t[a]&&n[e]<=n[r]}function j(t,e,r){for(var n=t.heap[r],i=r<<1;i<=t.heap_len&&(i<t.heap_len&&M(e,t.heap[i+1],t.heap[i],t.depth)&&i++,!M(e,n,t.heap[i],t.depth));)t.heap[r]=t.heap[i],r=i,i<<=1;t.heap[r]=n}function Z(t,e,r){var n,i,a,o,u=0;if(0!==t.last_lit)for(;n=t.pending_buf[t.d_buf+2*u]<<8|t.pending_buf[t.d_buf+2*u+1],i=t.pending_buf[t.l_buf+u],u++,0===n?D(t,i,e):(D(t,(a=E[i])+s+1,e),0!==(o=g[a])&&P(t,i-=A[a],o),D(t,a=B(--n),r),0!==(o=v[a])&&P(t,n-=T[a],o)),u<t.last_lit;);D(t,d,e)}function W(t,e){var r,n,i,a=e.dyn_tree,s=e.stat_desc.static_tree,o=e.stat_desc.has_stree,u=e.stat_desc.elems,l=-1;for(t.heap_len=0,t.heap_max=h,r=0;r<u;r++)0!==a[2*r]?(t.heap[++t.heap_len]=l=r,t.depth[r]=0):a[2*r+1]=0;for(;t.heap_len<2;)a[2*(i=t.heap[++t.heap_len]=l<2?++l:0)]=1,t.depth[i]=0,t.opt_len--,o&&(t.static_len-=s[2*i+1]);for(e.max_code=l,r=t.heap_len>>1;1<=r;r--)j(t,a,r);for(i=u;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],j(t,a,1),n=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=n,a[2*i]=a[2*r]+a[2*n],t.depth[i]=(t.depth[r]>=t.depth[n]?t.depth[r]:t.depth[n])+1,a[2*r+1]=a[2*n+1]=i,t.heap[1]=i++,j(t,a,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,n,i,a,s,o,u=e.dyn_tree,l=e.max_code,c=e.stat_desc.static_tree,d=e.stat_desc.has_stree,p=e.stat_desc.extra_bits,m=e.stat_desc.extra_base,_=e.stat_desc.max_length,g=0;for(a=0;a<=f;a++)t.bl_count[a]=0;for(u[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<h;r++)_<(a=u[2*u[2*(n=t.heap[r])+1]+1]+1)&&(a=_,g++),u[2*n+1]=a,l<n||(t.bl_count[a]++,s=0,m<=n&&(s=p[n-m]),o=u[2*n],t.opt_len+=o*(a+s),d&&(t.static_len+=o*(c[2*n+1]+s)));if(0!==g){do{for(a=_-1;0===t.bl_count[a];)a--;t.bl_count[a]--,t.bl_count[a+1]+=2,t.bl_count[_]--,g-=2}while(0<g);for(a=_;0!==a;a--)for(n=t.bl_count[a];0!==n;)l<(i=t.heap[--r])||(u[2*i+1]!==a&&(t.opt_len+=(a-u[2*i+1])*u[2*i],u[2*i+1]=a),n--)}}(t,e),F(a,l,t.bl_count)}function Y(t,e,r){var n,i,a=-1,s=e[1],o=0,u=7,l=4;for(0===s&&(u=138,l=3),e[2*(r+1)+1]=65535,n=0;n<=r;n++)i=s,s=e[2*(n+1)+1],++o<u&&i===s||(o<l?t.bl_tree[2*i]+=o:0!==i?(i!==a&&t.bl_tree[2*i]++,t.bl_tree[2*p]++):o<=10?t.bl_tree[2*m]++:t.bl_tree[2*_]++,a=i,l=(o=0)===s?(u=138,3):i===s?(u=6,3):(u=7,4))}function H(t,e,r){var n,i,a=-1,s=e[1],o=0,u=7,l=4;for(0===s&&(u=138,l=3),n=0;n<=r;n++)if(i=s,s=e[2*(n+1)+1],!(++o<u&&i===s)){if(o<l)for(;D(t,i,t.bl_tree),0!=--o;);else 0!==i?(i!==a&&(D(t,i,t.bl_tree),o--),D(t,p,t.bl_tree),P(t,o-3,2)):o<=10?(D(t,m,t.bl_tree),P(t,o-3,3)):(D(t,_,t.bl_tree),P(t,o-11,7));a=i,l=(o=0)===s?(u=138,3):i===s?(u=6,3):(u=7,4)}}i(T);var G=!1;function K(t,e,r,i){P(t,(a<<1)+(i?1:0),3),function(t,e,r,i){N(t),O(t,r),O(t,~r),n.arraySet(t.pending_buf,t.window,e,r,t.pending),t.pending+=r}(t,e,r)}r._tr_init=function(t){G||(function(){var t,e,r,n,i,a=new Array(f+1);for(n=r=0;n<28;n++)for(A[n]=r,t=0;t<1<<g[n];t++)E[r++]=n;for(E[r-1]=n,n=i=0;n<16;n++)for(T[n]=i,t=0;t<1<<v[n];t++)x[i++]=n;for(i>>=7;n<u;n++)for(T[n]=i<<7,t=0;t<1<<v[n]-7;t++)x[256+i++]=n;for(e=0;e<=f;e++)a[e]=0;for(t=0;t<=143;)w[2*t+1]=8,t++,a[8]++;for(;t<=255;)w[2*t+1]=9,t++,a[9]++;for(;t<=279;)w[2*t+1]=7,t++,a[7]++;for(;t<=287;)w[2*t+1]=8,t++,a[8]++;for(F(w,o+1,a),t=0;t<u;t++)k[2*t+1]=5,k[2*t]=U(t,5);S=new I(w,g,s+1,o,f),C=new I(k,v,0,u,f),z=new I(new Array(0),b,0,l,7)}(),G=!0),t.l_desc=new R(t.dyn_ltree,S),t.d_desc=new R(t.dyn_dtree,C),t.bl_desc=new R(t.bl_tree,z),t.bi_buf=0,t.bi_valid=0,L(t)},r._tr_stored_block=K,r._tr_flush_block=function(t,e,r,n){var i,a,o=0;0<t.level?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,r=4093624447;for(e=0;e<=31;e++,r>>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<s;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0}(t)),W(t,t.l_desc),W(t,t.d_desc),o=function(t){var e;for(Y(t,t.dyn_ltree,t.l_desc.max_code),Y(t,t.dyn_dtree,t.d_desc.max_code),W(t,t.bl_desc),e=l-1;3<=e&&0===t.bl_tree[2*y[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),i=t.opt_len+3+7>>>3,(a=t.static_len+3+7>>>3)<=i&&(i=a)):i=a=r+5,r+4<=i&&-1!==e?K(t,e,r,n):4===t.strategy||a===i?(P(t,2+(n?1:0),3),Z(t,w,k)):(P(t,4+(n?1:0),3),function(t,e,r,n){var i;for(P(t,e-257,5),P(t,r-1,5),P(t,n-4,4),i=0;i<n;i++)P(t,t.bl_tree[2*y[i]+1],3);H(t,t.dyn_ltree,e-1),H(t,t.dyn_dtree,r-1)}(t,t.l_desc.max_code+1,t.d_desc.max_code+1,o+1),Z(t,t.dyn_ltree,t.dyn_dtree)),L(t),n&&N(t)},r._tr_tally=function(t,e,r){return t.pending_buf[t.d_buf+2*t.last_lit]=e>>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(E[r]+s+1)]++,t.dyn_dtree[2*B(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),D(t,d,w),function(t){16===t.bi_valid?(O(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{\"../utils/common\":41}],53:[function(t,e,r){\"use strict\";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){\"use strict\";e.exports=\"function\"==typeof n?n:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)})}).call(e,r(4).Buffer,r(0),r(8).setImmediate)},function(t,e,r){\"use strict\";(function(t){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\nvar n=r(5),i=r(6),a=r(7);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function o(t,e){if(s()<e)throw new RangeError(\"Invalid typed array length\");return u.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=u.prototype:(null===t&&(t=new u(e)),t.length=e),t}function u(t,e,r){if(!(u.TYPED_ARRAY_SUPPORT||this instanceof u))return new u(t,e,r);if(\"number\"==typeof t){if(\"string\"==typeof e)throw new Error(\"If encoding is specified then the first argument must be a string\");return f(this,t)}return l(this,t,e,r)}function l(t,e,r,n){if(\"number\"==typeof e)throw new TypeError('\"value\" argument must not be a number');return\"undefined\"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,r,n){if(e.byteLength,r<0||e.byteLength<r)throw new RangeError(\"'offset' is out of bounds\");if(e.byteLength<r+(n||0))throw new RangeError(\"'length' is out of bounds\");e=void 0===r&&void 0===n?new Uint8Array(e):void 0===n?new Uint8Array(e,r):new Uint8Array(e,r,n);u.TYPED_ARRAY_SUPPORT?(t=e).__proto__=u.prototype:t=c(t,e);return t}(t,e,r,n):\"string\"==typeof e?function(t,e,r){\"string\"==typeof r&&\"\"!==r||(r=\"utf8\");if(!u.isEncoding(r))throw new TypeError('\"encoding\" must be a valid string encoding');var n=0|p(e,r),i=(t=o(t,n)).write(e,r);i!==n&&(t=t.slice(0,i));return t}(t,e,r):function(t,e){if(u.isBuffer(e)){var r=0|d(e.length);return 0===(t=o(t,r)).length?t:(e.copy(t,0,0,r),t)}if(e){if(\"undefined\"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||\"length\"in e)return\"number\"!=typeof e.length||function(t){return t!=t}(e.length)?o(t,0):c(t,e);if(\"Buffer\"===e.type&&a(e.data))return c(t,e.data)}throw new TypeError(\"First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.\")}(t,e)}function h(t){if(\"number\"!=typeof t)throw new TypeError('\"size\" argument must be a number');if(t<0)throw new RangeError('\"size\" argument must not be negative')}function f(t,e){if(h(e),t=o(t,e<0?0:0|d(e)),!u.TYPED_ARRAY_SUPPORT)for(var r=0;r<e;++r)t[r]=0;return t}function c(t,e){var r=e.length<0?0:0|d(e.length);t=o(t,r);for(var n=0;n<r;n+=1)t[n]=255&e[n];return t}function d(t){if(t>=s())throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\"+s().toString(16)+\" bytes\");return 0|t}function p(t,e){if(u.isBuffer(t))return t.length;if(\"undefined\"!=typeof ArrayBuffer&&\"function\"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;\"string\"!=typeof t&&(t=\"\"+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case\"ascii\":case\"latin1\":case\"binary\":return r;case\"utf8\":case\"utf-8\":case void 0:return M(t).length;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return 2*r;case\"hex\":return r>>>1;case\"base64\":return j(t).length;default:if(n)return M(t).length;e=(\"\"+e).toLowerCase(),n=!0}}function m(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function _(t,e,r,n,i){if(0===t.length)return-1;if(\"string\"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if(\"string\"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:g(t,e,r,n,i);if(\"number\"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&\"function\"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):g(t,[e],r,n,i);throw new TypeError(\"val must be string, number or Buffer\")}function g(t,e,r,n,i){var a,s=1,o=t.length,u=e.length;if(void 0!==n&&(\"ucs2\"===(n=String(n).toLowerCase())||\"ucs-2\"===n||\"utf16le\"===n||\"utf-16le\"===n)){if(t.length<2||e.length<2)return-1;s=2,o/=2,u/=2,r/=2}function l(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var h=-1;for(a=r;a<o;a++)if(l(t,a)===l(e,-1===h?0:a-h)){if(-1===h&&(h=a),a-h+1===u)return h*s}else-1!==h&&(a-=a-h),h=-1}else for(r+u>o&&(r=o-u),a=r;a>=0;a--){for(var f=!0,c=0;c<u;c++)if(l(t,a+c)!==l(e,c)){f=!1;break}if(f)return a}return-1}function v(t,e,r,n){r=Number(r)||0;var i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;var a=e.length;if(a%2!=0)throw new TypeError(\"Invalid hex string\");n>a/2&&(n=a/2);for(var s=0;s<n;++s){var o=parseInt(e.substr(2*s,2),16);if(isNaN(o))return s;t[r+s]=o}return s}function b(t,e,r,n){return Z(M(e,t.length-r),t,r,n)}function y(t,e,r,n){return Z(function(t){for(var e=[],r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function w(t,e,r,n){return y(t,e,r,n)}function k(t,e,r,n){return Z(j(e),t,r,n)}function x(t,e,r,n){return Z(function(t,e){for(var r,n,i,a=[],s=0;s<t.length&&!((e-=2)<0);++s)r=t.charCodeAt(s),n=r>>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function E(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function A(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i<r;){var a,s,o,u,l=t[i],h=null,f=l>239?4:l>223?3:l>191?2:1;if(i+f<=r)switch(f){case 1:l<128&&(h=l);break;case 2:128==(192&(a=t[i+1]))&&(u=(31&l)<<6|63&a)>127&&(h=u);break;case 3:a=t[i+1],s=t[i+2],128==(192&a)&&128==(192&s)&&(u=(15&l)<<12|(63&a)<<6|63&s)>2047&&(u<55296||u>57343)&&(h=u);break;case 4:a=t[i+1],s=t[i+2],o=t[i+3],128==(192&a)&&128==(192&s)&&128==(192&o)&&(u=(15&l)<<18|(63&a)<<12|(63&s)<<6|63&o)>65535&&u<1114112&&(h=u)}null===h?(h=65533,f=1):h>65535&&(h-=65536,n.push(h>>>10&1023|55296),h=56320|1023&h),n.push(h),i+=f}return function(t){var e=t.length;if(e<=S)return String.fromCharCode.apply(String,t);var r=\"\",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=S));return r}(n)}e.Buffer=u,e.SlowBuffer=function(t){+t!=t&&(t=0);return u.alloc(+t)},e.INSPECT_MAX_BYTES=50,u.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:function(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&\"function\"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}(),e.kMaxLength=s(),u.poolSize=8192,u._augment=function(t){return t.__proto__=u.prototype,t},u.from=function(t,e,r){return l(null,t,e,r)},u.TYPED_ARRAY_SUPPORT&&(u.prototype.__proto__=Uint8Array.prototype,u.__proto__=Uint8Array,\"undefined\"!=typeof Symbol&&Symbol.species&&u[Symbol.species]===u&&Object.defineProperty(u,Symbol.species,{value:null,configurable:!0})),u.alloc=function(t,e,r){return function(t,e,r,n){return h(e),e<=0?o(t,e):void 0!==r?\"string\"==typeof n?o(t,e).fill(r,n):o(t,e).fill(r):o(t,e)}(null,t,e,r)},u.allocUnsafe=function(t){return f(null,t)},u.allocUnsafeSlow=function(t){return f(null,t)},u.isBuffer=function(t){return!(null==t||!t._isBuffer)},u.compare=function(t,e){if(!u.isBuffer(t)||!u.isBuffer(e))throw new TypeError(\"Arguments must be Buffers\");if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i<a;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},u.isEncoding=function(t){switch(String(t).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"latin1\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},u.concat=function(t,e){if(!a(t))throw new TypeError('\"list\" argument must be an Array of Buffers');if(0===t.length)return u.alloc(0);var r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;var n=u.allocUnsafe(e),i=0;for(r=0;r<t.length;++r){var s=t[r];if(!u.isBuffer(s))throw new TypeError('\"list\" argument must be an Array of Buffers');s.copy(n,i),i+=s.length}return n},u.byteLength=p,u.prototype._isBuffer=!0,u.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError(\"Buffer size must be a multiple of 16-bits\");for(var e=0;e<t;e+=2)m(this,e,e+1);return this},u.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError(\"Buffer size must be a multiple of 32-bits\");for(var e=0;e<t;e+=4)m(this,e,e+3),m(this,e+1,e+2);return this},u.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError(\"Buffer size must be a multiple of 64-bits\");for(var e=0;e<t;e+=8)m(this,e,e+7),m(this,e+1,e+6),m(this,e+2,e+5),m(this,e+3,e+4);return this},u.prototype.toString=function(){var t=0|this.length;return 0===t?\"\":0===arguments.length?A(this,0,t):function(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return\"\";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return\"\";if((r>>>=0)<=(e>>>=0))return\"\";for(t||(t=\"utf8\");;)switch(t){case\"hex\":return T(this,e,r);case\"utf8\":case\"utf-8\":return A(this,e,r);case\"ascii\":return C(this,e,r);case\"latin1\":case\"binary\":return z(this,e,r);case\"base64\":return E(this,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return I(this,e,r);default:if(n)throw new TypeError(\"Unknown encoding: \"+t);t=(t+\"\").toLowerCase(),n=!0}}.apply(this,arguments)},u.prototype.equals=function(t){if(!u.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");return this===t||0===u.compare(this,t)},u.prototype.inspect=function(){var t=\"\",r=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString(\"hex\",0,r).match(/.{2}/g).join(\" \"),this.length>r&&(t+=\" ... \")),\"<Buffer \"+t+\">\"},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError(\"Argument must be a Buffer\");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError(\"out of range index\");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var a=i-n,s=r-e,o=Math.min(a,s),l=this.slice(n,i),h=t.slice(e,r),f=0;f<o;++f)if(l[f]!==h[f]){a=l[f],s=h[f];break}return a<s?-1:s<a?1:0},u.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},u.prototype.indexOf=function(t,e,r){return _(this,t,e,r,!0)},u.prototype.lastIndexOf=function(t,e,r){return _(this,t,e,r,!1)},u.prototype.write=function(t,e,r,n){if(void 0===e)n=\"utf8\",r=this.length,e=0;else if(void 0===r&&\"string\"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");e|=0,isFinite(r)?(r|=0,void 0===n&&(n=\"utf8\")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError(\"Attempt to write outside buffer bounds\");n||(n=\"utf8\");for(var a=!1;;)switch(n){case\"hex\":return v(this,t,e,r);case\"utf8\":case\"utf-8\":return b(this,t,e,r);case\"ascii\":return y(this,t,e,r);case\"latin1\":case\"binary\":return w(this,t,e,r);case\"base64\":return k(this,t,e,r);case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return x(this,t,e,r);default:if(a)throw new TypeError(\"Unknown encoding: \"+n);n=(\"\"+n).toLowerCase(),a=!0}},u.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function C(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function z(t,e,r){var n=\"\";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function T(t,e,r){var n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);for(var i=\"\",a=e;a<r;++a)i+=N(t[a]);return i}function I(t,e,r){for(var n=t.slice(e,r),i=\"\",a=0;a<n.length;a+=2)i+=String.fromCharCode(n[a]+256*n[a+1]);return i}function R(t,e,r){if(t%1!=0||t<0)throw new RangeError(\"offset is not uint\");if(t+e>r)throw new RangeError(\"Trying to access beyond buffer length\")}function B(t,e,r,n,i,a){if(!u.isBuffer(t))throw new TypeError('\"buffer\" argument must be a Buffer instance');if(e>i||e<a)throw new RangeError('\"value\" argument is out of bounds');if(r+n>t.length)throw new RangeError(\"Index out of range\")}function O(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,a=Math.min(t.length-r,2);i<a;++i)t[r+i]=(e&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function P(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,a=Math.min(t.length-r,4);i<a;++i)t[r+i]=e>>>8*(n?i:3-i)&255}function D(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError(\"Index out of range\");if(r<0)throw new RangeError(\"Index out of range\")}function U(t,e,r,n,a){return a||D(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function F(t,e,r,n,a){return a||D(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if(t=~~t,e=void 0===e?n:~~e,t<0?(t+=n)<0&&(t=0):t>n&&(t=n),e<0?(e+=n)<0&&(e=0):e>n&&(e=n),e<t&&(e=t),u.TYPED_ARRAY_SUPPORT)(r=this.subarray(t,e)).__proto__=u.prototype;else{var i=e-t;r=new u(i,void 0);for(var a=0;a<i;++a)r[a]=this[a+t]}return r},u.prototype.readUIntLE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=this[t],i=1,a=0;++a<e&&(i*=256);)n+=this[t+a]*i;return n},u.prototype.readUIntBE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||R(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||R(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||R(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||R(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||R(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=this[t],i=1,a=0;++a<e&&(i*=256);)n+=this[t+a]*i;return n>=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||R(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},u.prototype.readInt8=function(t,e){return e||R(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||R(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||R(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||R(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||R(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||R(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||R(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||R(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||R(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a<r&&(i*=256);)this[e+a]=t/i&255;return e+r},u.prototype.writeUIntBE=function(t,e,r,n){(t=+t,e|=0,r|=0,n)||B(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):O(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):O(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):P(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=0,s=1,o=0;for(this[e]=255&t;++a<r&&(s*=256);)t<0&&0===o&&0!==this[e+a-1]&&(o=1),this[e+a]=(t/s>>0)-o&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);B(this,t,e,r,i-1,-i)}var a=r-1,s=1,o=0;for(this[e+a]=255&t;--a>=0&&(s*=256);)t<0&&0===o&&0!==this[e+a+1]&&(o=1),this[e+a]=(t/s>>0)-o&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):O(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):O(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):P(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||B(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return U(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return U(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return F(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return F(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError(\"targetStart out of bounds\");if(r<0||r>=this.length)throw new RangeError(\"sourceStart out of bounds\");if(n<0)throw new RangeError(\"sourceEnd out of bounds\");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);var i,a=n-r;if(this===t&&r<e&&e<n)for(i=a-1;i>=0;--i)t[i+e]=this[i+r];else if(a<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i<a;++i)t[i+e]=this[i+r];else Uint8Array.prototype.set.call(t,this.subarray(r,r+a),e);return a},u.prototype.fill=function(t,e,r,n){if(\"string\"==typeof t){if(\"string\"==typeof e?(n=e,e=0,r=this.length):\"string\"==typeof r&&(n=r,r=this.length),1===t.length){var i=t.charCodeAt(0);i<256&&(t=i)}if(void 0!==n&&\"string\"!=typeof n)throw new TypeError(\"encoding must be a string\");if(\"string\"==typeof n&&!u.isEncoding(n))throw new TypeError(\"Unknown encoding: \"+n)}else\"number\"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<r)throw new RangeError(\"Out of range index\");if(r<=e)return this;var a;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),\"number\"==typeof t)for(a=e;a<r;++a)this[a]=t;else{var s=u.isBuffer(t)?t:M(new u(t,n).toString()),o=s.length;for(a=0;a<r-e;++a)this[a+e]=s[a%o]}return this};var L=/[^+\\/0-9A-Za-z-_]/g;function N(t){return t<16?\"0\"+t.toString(16):t.toString(16)}function M(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],s=0;s<n;++s){if((r=t.charCodeAt(s))>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error(\"Invalid code point\");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function j(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\\s+|\\s+$/g,\"\")}(t).replace(L,\"\")).length<2)return\"\";for(;t.length%4!=0;)t+=\"=\";return t}(t))}function Z(t,e,r,n){for(var i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(e,r(0))},function(t,e,r){\"use strict\";e.byteLength=function(t){var e=l(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,n=l(t),s=n[0],o=n[1],u=new a(function(t,e,r){return 3*(e+r)/4-r}(0,s,o)),h=0,f=o>0?s-4:s;for(r=0;r<f;r+=4)e=i[t.charCodeAt(r)]<<18|i[t.charCodeAt(r+1)]<<12|i[t.charCodeAt(r+2)]<<6|i[t.charCodeAt(r+3)],u[h++]=e>>16&255,u[h++]=e>>8&255,u[h++]=255&e;2===o&&(e=i[t.charCodeAt(r)]<<2|i[t.charCodeAt(r+1)]>>4,u[h++]=255&e);1===o&&(e=i[t.charCodeAt(r)]<<10|i[t.charCodeAt(r+1)]<<4|i[t.charCodeAt(r+2)]>>2,u[h++]=e>>8&255,u[h++]=255&e);return u},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,a=[],s=0,o=r-i;s<o;s+=16383)a.push(f(t,s,s+16383>o?o:s+16383));1===i?(e=t[r-1],a.push(n[e>>2]+n[e<<4&63]+\"==\")):2===i&&(e=(t[r-2]<<8)+t[r-1],a.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+\"=\"));return a.join(\"\")};for(var n=[],i=[],a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,s=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",o=0,u=s.length;o<u;++o)n[o]=s[o],i[s.charCodeAt(o)]=o;function l(t){var e=t.length;if(e%4>0)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=t.indexOf(\"=\");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function h(t){return n[t>>18&63]+n[t>>12&63]+n[t>>6&63]+n[63&t]}function f(t,e,r){for(var n,i=[],a=e;a<r;a+=3)n=(t[a]<<16&16711680)+(t[a+1]<<8&65280)+(255&t[a+2]),i.push(h(n));return i.join(\"\")}i[\"-\".charCodeAt(0)]=62,i[\"_\".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,r,n,i){var a,s,o=8*i-n-1,u=(1<<o)-1,l=u>>1,h=-7,f=r?i-1:0,c=r?-1:1,d=t[e+f];for(f+=c,a=d&(1<<-h)-1,d>>=-h,h+=o;h>0;a=256*a+t[e+f],f+=c,h-=8);for(s=a&(1<<-h)-1,a>>=-h,h+=n;h>0;s=256*s+t[e+f],f+=c,h-=8);if(0===a)a=1-l;else{if(a===u)return s?NaN:1/0*(d?-1:1);s+=Math.pow(2,n),a-=l}return(d?-1:1)*s*Math.pow(2,a-n)},e.write=function(t,e,r,n,i,a){var s,o,u,l=8*a-i-1,h=(1<<l)-1,f=h>>1,c=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:a-1,p=n?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,s=h):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?c/u:c*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=h?(o=0,s=h):s+f>=1?(o=(e*u-1)*Math.pow(2,i),s+=f):(o=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;t[r+d]=255&o,d+=p,o/=256,i-=8);for(s=s<<i|o,l+=i;l>0;t[r+d]=255&s,d+=p,s/=256,l-=8);t[r+d-p]|=128*m}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return\"[object Array]\"==r.call(t)}},function(t,e,r){(function(t){var n=void 0!==t&&t||\"undefined\"!=typeof self&&self||window,i=Function.prototype.apply;function a(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new a(i.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new a(i.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},a.prototype.unref=a.prototype.ref=function(){},a.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},r(9),e.setImmediate=\"undefined\"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate=\"undefined\"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(e,r(0))},function(t,e,r){(function(t,e){!function(t,r){\"use strict\";if(!t.setImmediate){var n,i=1,a={},s=!1,o=t.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(t);u=u&&u.setTimeout?u:t,\"[object process]\"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){h(t)})}:function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage(\"\",\"*\"),t.onmessage=r,e}}()?function(){var e=\"setImmediate$\"+Math.random()+\"$\",r=function(r){r.source===t&&\"string\"==typeof r.data&&0===r.data.indexOf(e)&&h(+r.data.slice(e.length))};t.addEventListener?t.addEventListener(\"message\",r,!1):t.attachEvent(\"onmessage\",r),n=function(r){t.postMessage(e+r,\"*\")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){h(t.data)},n=function(e){t.port2.postMessage(e)}}():o&&\"onreadystatechange\"in o.createElement(\"script\")?function(){var t=o.documentElement;n=function(e){var r=o.createElement(\"script\");r.onreadystatechange=function(){h(e),r.onreadystatechange=null,t.removeChild(r),r=null},t.appendChild(r)}}():n=function(t){setTimeout(h,0,t)},u.setImmediate=function(t){\"function\"!=typeof t&&(t=new Function(\"\"+t));for(var e=new Array(arguments.length-1),r=0;r<e.length;r++)e[r]=arguments[r+1];var s={callback:t,args:e};return a[i]=s,n(i),i++},u.clearImmediate=l}function l(t){delete a[t]}function h(t){if(s)setTimeout(h,0,t);else{var e=a[t];if(e){s=!0;try{!function(t){var e=t.callback,n=t.args;switch(n.length){case 0:e();break;case 1:e(n[0]);break;case 2:e(n[0],n[1]);break;case 3:e(n[0],n[1],n[2]);break;default:e.apply(r,n)}}(e)}finally{l(t),s=!1}}}}}(\"undefined\"==typeof self?void 0===t?this:t:self)}).call(e,r(0),r(10))},function(t,e){var r,n,i=t.exports={};function a(){throw new Error(\"setTimeout has not been defined\")}function s(){throw new Error(\"clearTimeout has not been defined\")}function o(t){if(r===setTimeout)return setTimeout(t,0);if((r===a||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r=\"function\"==typeof setTimeout?setTimeout:a}catch(t){r=a}try{n=\"function\"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var u,l=[],h=!1,f=-1;function c(){h&&u&&(h=!1,u.length?l=u.concat(l):f=-1,l.length&&d())}function d(){if(!h){var t=o(c);h=!0;for(var e=l.length;e;){for(u=l,l=[];++f<e;)u&&u[f].run();f=-1,e=l.length}u=null,h=!1,function(t){if(n===clearTimeout)return clearTimeout(t);if((n===s||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(t);try{n(t)}catch(e){try{return n.call(null,t)}catch(e){return n.call(this,t)}}}(t)}}function p(t,e){this.fun=t,this.array=e}function m(){}i.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];l.push(new p(t,e)),1!==l.length||h||o(d)},p.prototype.run=function(){this.fun.apply(null,this.array)},i.title=\"browser\",i.browser=!0,i.env={},i.argv=[],i.version=\"\",i.versions={},i.on=m,i.addListener=m,i.once=m,i.off=m,i.removeListener=m,i.removeAllListeners=m,i.emit=m,i.prependListener=m,i.prependOnceListener=m,i.listeners=function(t){return[]},i.binding=function(t){throw new Error(\"process.binding is not supported\")},i.cwd=function(){return\"/\"},i.chdir=function(t){throw new Error(\"process.chdir is not supported\")},i.umask=function(){return 0}},function(t,e,r){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});var n=function(t){return t&&t.__esModule?t:{default:t}}(r(12));e.default=((t=(()=>null))=>{$('<style class=\"blockmodels_css\">').prop(\"type\",\"text/css\").html(\"\\n    textarea.blockmodels__textarea {\\n        font-size: 1em;\\n        width: 100%;\\n        resize: none;\\n    }\\n    \").appendTo(\"head\"),0!==Outliner.elements.length?(new Dialog({id:\"blockmodels_export\",title:\"Export Model to BlockModels.com\",lines:[n.default],draggable:!0,onConfirm:t}).show(),setTimeout(()=>{localStorage&&localStorage.getItem(\"blockmodels_api_key\")&&$(\"[name=blockmodels__api_key]\").last().val(localStorage.getItem(\"blockmodels_api_key\"))},40)):alert(\"Please have one or more element!\")})},function(t,e){t.exports='<div id=blockmodels_container style=height:500px;overflow-y:scroll> <div id=blockmodels_information> <div class=dialog_bar style=height:auto;max-width:400px> - This will export the current model, all textures, and it will take a screenshot of the model at it\\'s current rotation. <br/> - Please note that BlockModels.com doesn\\'t require the default Minecraft textures for their viewer, no need to upload them. <br/> - Animated textures aren\\'t supported. </div> </div> <hr/> <div id=blockmodels_creation_title> <div class=\"dialog_bar narrow\"> <label for=blockmodels__creation_title>Creation Title</label> </div> <div class=dialog_bar> <input type=text class=dark_bordered style=width:100% id=blockmodels__creation_title name=blockmodels__creation_title> </div> </div> <div id=blockmodels_minecraft_version> <div class=\"dialog_bar narrow\"> <label for=blockmodels__minecraft_version>Minecraft Version</label> </div> <div class=dialog_bar> <select id=blockmodels__minecraft_version name=blockmodels__minecraft_version style=width:100%> <option value=latest>Latest</option> <option value=112>1.12</option> <option value=111>1.11</option> <option value=110>1.10</option> <option value=19>1.9</option> <option value=18>1.8</option> </select> </div> <div class=\"dialog_bar narrow\"> <small>The latest option will always select the latest Minecraft version.</small> </div> </div> <div id=blockmodels_category> <div class=\"dialog_bar narrow\"> <label for=blockmodels__category>Category</label> </div> <div class=dialog_bar> <select id=blockmodels__category name=blockmodels__category style=width:100%> <option value=furniture>Furniture</option> <option value=food>Food</option> <option value=weapons>Weapons</option> <option value=animals>Animals</option> <option value=decor>Decor</option> <option value=other>Other</option> </select> </div> </div> <div id=blockmodels_short> <div class=\"dialog_bar narrow\"> <label for=blockmodels__short>Short Description</label> </div> <div class=dialog_bar style=height:70px> <textarea class=blockmodels__textarea id=blockmodels__short name=blockmodels__short rows=2 maxlength=140></textarea> </div> <div class=\"dialog_bar narrow\"> <small>Please make sure this is 140 characters or less.</small> </div> </div> <div id=blockmodels_long> <div class=\"dialog_bar narrow\"> <label for=blockmodels__long>Long Description</label> </div> <div class=dialog_bar style=height:120px> <textarea class=blockmodels__textarea id=blockmodels__long name=blockmodels__long rows=4 maxlength=1000></textarea> </div> <div class=\"dialog_bar narrow\"> <small>Please make sure this is 1000 characters or less.</small> </div> </div> <div id=blockmodels_api_key> <div class=\"dialog_bar narrow\"> <label for=blockmodels__api_key>Access Key</label> </div> <div class=dialog_bar> <input type=text class=dark_bordered style=width:100% id=blockmodels__api_key name=blockmodels__api_key> </div> <div class=\"dialog_bar narrow\" style=height:auto;max-width:400px;word-wrap:break-word> <small>To obtain this, login to BlockModels.com, click on your name at the top right of the screen, go to <code>Edit Profile</code>, and copy your <code>Access Key</code>.</small> </div> </div> <div id=blockmodels_upload_progress> <div class=\"dialog_bar narrow\"> <label for=blockmodels__api_key>Uploading Progress</label> </div> <div class=progress_bar id=blockmodels__upload_progress style=width:auto> <div class=progress_bar_inner style=width:0></div> </div> </div> </div>'}]);\n"
  },
  {
    "path": "plugins/bone_view/LICENSE.md",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>."
  },
  {
    "path": "plugins/bone_view/README.md",
    "content": "# Bone View Plugin for Blockbench\n\n![Bone View Icon](icon.png)\n\nThe Bone View plugin provides an essential toolset for animators and riggers working in Blockbench. It adds a toggleable \"Bone View\" mode that visualizes your model's armature, making it easier to understand and debug complex rigs.\n\n## Features\n\n-   **Clear Armature Visualization**: Toggling Bone View makes your model's geometry semi-transparent and displays the underlying bone structure.\n-   **Bone and Pivot Representation**: Each group is represented by a bone and an axis helper, clearly marking its pivot point and orientation.\n-   **Customizable Hotkey**: Quickly toggle the view with a hotkey (default: `Shift+B`), which can be customized in the settings.\n-   **Seamless Integration**: The plugin adds a \"Toggle Bone View\" button to the \"View\" menu for easy access.\n\n![Example](animation.gif)\n\n## Usage\n\n1.  **Toggling the View**: \n    * Go to the \"View\" menu and click \"Toggle Bone View\".\n    * Use the hotkey `Shift+B` to toggle the view instantly.\n2.  **Customization**:\n    * To change the hotkey, go to `File > Settings > Keybindings` and modify the \"Bone View Hotkey\" field.\n\n---\n\n## Acknowledgements\n\nThis plugin was developed to enhance the asset creation workflow for the game **[Vintage Story](https://www.vintagestory.at/)**.\n\nThe plugin's icon is provided by [game-icons.net](https://game-icons.net/) under the CC BY 3.0 license.\n"
  },
  {
    "path": "plugins/bone_view/about.md",
    "content": "# About Bone View\n\nThe Bone View plugin is designed to simplify the process of rigging and animating in Blockbench by providing a clear, visual representation of the model's armature.\n\n### How it Works\n\nWhen Bone View is enabled, the plugin:\n1.  Makes all the model's geometry semi-transparent.\n2.  Draws a \"bone\" for each group, originating from its pivot point.\n3.  Orients the bone to point towards the first child group, clearly indicating the hierarchical relationship.\n4.  Places an axis helper at each group's pivot point, showing its orientation in 3D space.\n\nThis allows you to see the exact pivot points and connections of your model's rig without the model's geometry obscuring your view, making it an indispensable tool for debugging and fine-tuning animations."
  },
  {
    "path": "plugins/bone_view/bone_view.js",
    "content": "(function () {\n    let pluginAction;\n    let hotkeySetting;\n\n    const RENDER_ORDER_BONE = 500;\n    const RENDER_ORDER_HELPER = 400;\n\n    // Visual constants\n    const BONE_RADIUS = 0.3;          // bone thickness\n    const AXES_HELPER_SIZE = 3;        // axis helper size\n    const JOINT_RADIUS = 0.3;         // joint sphere radius\n\n    // --- RESOURCE MANAGER ---\n\n    const ResourceManager = {\n        boneMaterial: new THREE.MeshBasicMaterial({ depthTest: false, depthWrite: false }),\n        jointMaterial: new THREE.MeshBasicMaterial({ depthTest: false, depthWrite: false }),\n        transparentMaterial: new THREE.MeshPhongMaterial({ transparent: true, opacity: 0.25, side: THREE.DoubleSide }),\n\n        boneGeometry: new THREE.CylinderGeometry(0, 1, 1, 8),\n        jointGeometry: new THREE.SphereGeometry(JOINT_RADIUS, 12, 12),\n\n        lastAccentColor: null,\n        lastTextColor: null,\n\n        init() { this.updateColors(); },\n        updateColors() {\n            try {\n                const styles = getComputedStyle(document.documentElement);\n                const accentColor = (styles.getPropertyValue('--color-accent') || '#74c7f7').trim();\n                const textColor = (styles.getPropertyValue('--color-text') || '#E0E0E0').trim();\n\n                if (accentColor !== this.lastAccentColor || textColor !== this.lastTextColor) {\n                    this.boneMaterial.color.set(accentColor);\n                    this.jointMaterial.color.set(accentColor);\n                    this.transparentMaterial.color.set(textColor);\n                    this.lastAccentColor = accentColor;\n                    this.lastTextColor = textColor;\n                }\n            } catch (err) { console.error(\"Bone View: Could not update theme colors.\", err); }\n        },\n        dispose() {\n            this.boneMaterial.dispose();\n            this.jointMaterial.dispose();\n            this.transparentMaterial.dispose();\n            this.boneGeometry.dispose();\n            this.jointGeometry.dispose();\n        }\n    };\n\n    // --- INDICATOR MANAGER ---\n\n    const IndicatorManager = (function () {\n        const pool = new Map(); // group.uuid -> {arrow, axes, joint}\n\n        function makeIndicators() {\n            const arrow = new THREE.Mesh(ResourceManager.boneGeometry, ResourceManager.boneMaterial);\n            arrow.isBoneIndicator = true;\n            arrow.renderOrder = RENDER_ORDER_BONE;\n\n            const axes = new THREE.AxesHelper(AXES_HELPER_SIZE);\n            axes.isBoneIndicator = true;\n            axes.renderOrder = RENDER_ORDER_HELPER;\n\n            const joint = new THREE.Mesh(ResourceManager.jointGeometry, ResourceManager.jointMaterial);\n            joint.isBoneIndicator = true;\n            joint.renderOrder = RENDER_ORDER_BONE;\n\n            three_grid.add(arrow, axes, joint);\n            return { arrow, axes, joint };\n        }\n\n        function disposeIndicators(entry) {\n            if (!entry) return;\n            three_grid.remove(entry.arrow, entry.axes, entry.joint);\n        }\n\n        function ensureFor(group) {\n            let entry = pool.get(group.uuid);\n            if (!entry) {\n                entry = makeIndicators();\n                pool.set(group.uuid, entry);\n            }\n            return entry;\n        }\n\n        function removeMissing() {\n            const alive = new Set(Group.all.map(g => g.uuid));\n            for (const [id, entry] of pool) {\n                if (!alive.has(id)) {\n                    disposeIndicators(entry);\n                    pool.delete(id);\n                }\n            }\n        }\n\n        // Compute transforms for bone that connects child pivot -> parent pivot\n        function computeBone(group) {\n            if (!group.visibility || !group.mesh) return null;\n\n            const worldPos = new THREE.Vector3();\n            const worldQuat = new THREE.Quaternion();\n            group.mesh.getWorldPosition(worldPos);\n            group.mesh.getWorldQuaternion(worldQuat);\n\n            const parentGroup = (group.parent && group.parent.type === 'group' && group.parent.mesh) ? group.parent : null;\n\n            if (!parentGroup) {\n                return { worldPos, worldQuat, valid: false };\n            }\n\n            const parentName = parentGroup.name?.toLowerCase();\n            if (parentName === 'root') {\n                return { worldPos, worldQuat, valid: false };\n            }\n\n            const parentPos = new THREE.Vector3();\n            parentGroup.mesh.getWorldPosition(parentPos);\n            \n            return { worldPos, worldQuat, parentPos, valid: true };\n        }\n\n        function updateTransforms() {\n            ResourceManager.updateColors();\n            const active = pluginAction && pluginAction.value;\n\n            const inverseParentMatrix = new THREE.Matrix4();\n            three_grid.updateWorldMatrix(true, false);\n            inverseParentMatrix.copy(three_grid.matrixWorld).invert();\n\n            const parentWorldQuat = new THREE.Quaternion();\n            three_grid.getWorldQuaternion(parentWorldQuat);\n            const inverseParentQuat = parentWorldQuat.clone().invert();\n\n            for (const group of Group.all) {\n                const entry = ensureFor(group);\n\n                if (!active) {\n                    entry.arrow.visible = false;\n                    entry.axes.visible = false;\n                    entry.joint.visible = false;\n                    continue;\n                }\n\n                const data = computeBone(group);\n                if (!data || !data.valid) {\n                    entry.arrow.visible = false;\n                    entry.axes.visible = false;\n                    entry.joint.visible = false;\n                    continue;\n                }\n                \n                const localPos = data.worldPos.clone().applyMatrix4(inverseParentMatrix);\n                const parentLocalPos = data.parentPos.clone().applyMatrix4(inverseParentMatrix);\n                const localQuat = inverseParentQuat.clone().multiply(data.worldQuat);\n\n                const length = localPos.distanceTo(parentLocalPos);\n                 if (length <= 0.001) {\n                    entry.arrow.visible = false;\n                    entry.axes.visible = false;\n                    entry.joint.visible = false;\n                    continue;\n                }\n                const dir = new THREE.Vector3().subVectors(parentLocalPos, localPos).normalize();\n\n                entry.axes.visible = true;\n                entry.axes.position.copy(localPos);\n                entry.axes.quaternion.copy(localQuat);\n\n                entry.joint.visible = true;\n                entry.joint.position.copy(localPos);\n\n                entry.arrow.visible = true;\n                const qToDir = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), dir);\n                entry.arrow.quaternion.copy(qToDir);\n\n                const mid = new THREE.Vector3().copy(localPos).addScaledVector(dir, length / 2);\n                entry.arrow.position.copy(mid);\n\n                entry.arrow.scale.set(BONE_RADIUS, length, BONE_RADIUS);\n            }\n        }\n\n        return {\n            refresh() { for (const g of Group.all) ensureFor(g); removeMissing(); updateTransforms(); },\n            refreshPerFrame() { updateTransforms(); },\n            hideAll() {\n                for (const [, entry] of pool) {\n                    entry.arrow.visible = false;\n                    entry.axes.visible = false;\n                    entry.joint.visible = false;\n                }\n            },\n            removeAll() { for (const [, entry] of pool) disposeIndicators(entry); pool.clear(); }\n        };\n    })();\n\n    // --- VIEW MANAGER ---\n\n    const ViewManager = {\n        enable() {\n            for (const el of Outliner.elements) {\n                el.hidden = true;\n                el.unselect();\n                if (el.faces || el instanceof TextureMesh) {\n                    el.mesh.material = ResourceManager.transparentMaterial;\n                    if (el.preview_controller?.updateUV) el.preview_controller.updateUV(el);\n                }\n            }\n            Canvas.updateVisibility();\n            IndicatorManager.refresh();\n        },\n        disable() {\n            for (const el of Outliner.elements) el.hidden = false;\n            Canvas.updateAllFaces();\n            IndicatorManager.hideAll();\n        }\n    };\n\n    // --- HOTKEY MANAGER ---\n\n    const HotkeyManager = {\n        hotkeyDesc: null,\n        init() { this.update(); document.addEventListener('keydown', this.handler, true); },\n        update() {\n            const hotkeyStr = hotkeySetting ? hotkeySetting.value : 'Shift+B';\n            this.hotkeyDesc = this.parse(hotkeyStr);\n            this.updateActionLabel(hotkeyStr);\n        },\n        parse(str) {\n            const desc = { ctrl: false, alt: false, shift: false, key: '' };\n            const parts = str.toLowerCase().split('+').map(p => p.trim());\n            desc.ctrl = parts.includes('ctrl');\n            desc.alt = parts.includes('alt');\n            desc.shift = parts.includes('shift');\n            desc.key = parts.pop() || '';\n            return desc;\n        },\n        handler(e) {\n            if (document.activeElement?.matches('input, textarea')) return;\n            const eventDesc = { ctrl: e.ctrlKey, alt: e.altKey, shift: e.shiftKey, key: e.key.toLowerCase() };\n            if (eventDesc.ctrl === HotkeyManager.hotkeyDesc.ctrl &&\n                eventDesc.alt === HotkeyManager.hotkeyDesc.alt &&\n                eventDesc.shift === HotkeyManager.hotkeyDesc.shift &&\n                eventDesc.key === HotkeyManager.hotkeyDesc.key) {\n                pluginAction.click();\n            }\n        },\n        updateActionLabel(hotkeyStr) {\n            if (pluginAction) { pluginAction.name = `Toggle Bone View (${hotkeyStr})`; MenuBar.update(); }\n        },\n        dispose() { document.removeEventListener('keydown', this.handler, true); }\n    };\n\n    // --- PLUGIN ---\n\n    BBPlugin.register('bone_view', {\n        title: 'Bone View',\n        author: 'codename-B',\n        description: 'Toggleable view to visualize group pivots and their connections as bones (Blender-like).',\n        icon: 'icon.png',\n        tags: [\"Animation\", \"Rigging\", \"Viewport\"],\n        version: '1.0.0',\n        min_version: '4.12.6',\n        variant: 'both',\n        has_changelog: true,\n        creation_date: \"2025-09-17\",\n        repository: \"https://github.com/codename-B/bone-view\",\n\n        onload() {\n            ResourceManager.init();\n\n            hotkeySetting = new Setting('bone_view_hotkey', {\n                name: 'Bone View Hotkey',\n                description: 'Set the hotkey (e.g., \"Ctrl+B\", \"Shift+Alt+V\").',\n                category: 'keybindings',\n                value: 'Shift+B', type: 'string',\n                onChange: () => HotkeyManager.update(),\n            });\n\n            pluginAction = new Toggle('toggle_bone_view', {\n                name: 'Toggle Bone View (Shift+B)',\n                icon: 'fa-bone',\n                category: 'view',\n                condition: () => !Project.box_uv,\n                onChange: (is_enabled) => { is_enabled ? ViewManager.enable() : ViewManager.disable(); }\n            });\n\n            MenuBar.addAction(pluginAction, 'view');\n            HotkeyManager.init();\n\n            const hierarchyEvents = 'add_group remove_group undo redo update_outliner update_properties';\n            Blockbench.on(hierarchyEvents, () => IndicatorManager.refresh());\n            Blockbench.on('render_frame', () => IndicatorManager.refreshPerFrame());\n        },\n\n        onunload() {\n            if (pluginAction && pluginAction.value) pluginAction.click();\n            IndicatorManager.removeAll();\n            pluginAction?.delete();\n            hotkeySetting?.delete();\n            HotkeyManager.dispose();\n            ResourceManager.dispose();\n        }\n    });\n})();"
  },
  {
    "path": "plugins/bone_view/changelog.json",
    "content": "{\n    \"1.0.0\": {\n        \"release_date\": \"2025-09-17\",\n        \"changes\": [\n            \"Initial release of the Bone View plugin.\",\n            \"Added toggleable view to visualize model armatures.\",\n            \"Implemented rendering of bones and axis helpers for each group.\",\n            \"Integrated the plugin with the Blockbench UI by adding a button to the 'View' menu.\",\n            \"Added a customizable hotkey (default: Shift+B) to toggle the Bone View.\",\n            \"Added a setting in 'Keybindings' to change the hotkey.\"\n        ]\n    }\n}"
  },
  {
    "path": "plugins/bone_view/members.yml",
    "content": "maintainers:\n  - tyronx\n  - codename-B"
  },
  {
    "path": "plugins/brush.js",
    "content": ";(function () {\r\n// \r\n//\r\n\r\nconst { PI } = Math;\r\nconst TWO_PI = PI * 2;\r\nconst QUARTER_NINETY_DEGREES = PI / 8;\r\n\r\n/* Widgets */\r\nconst style = Blockbench.addCSS(\r\n`#panel_mtbrush_settings .toolbar > .content {\r\n\tpadding: 10px;\r\n}\r\n.bvoption {\r\n\twidth: 100%;\r\n\tposition: relative;\r\n\tcursor: pointer;\r\n\ttransition: 100ms;\r\n\tdisplay: flex;\r\n\tborder-bottom: 3px solid transparent;\r\n}\r\n.bvoption img {\r\n\twidth: 100%;\r\n\timage-rendering: pixelated;\r\n\tobject-fit: contain;\r\n\taspect-ratio: 1 / 1;\r\n}\r\n.bvoption:hover {\r\n\tfilter: brightness(110%);\r\n}\r\n.bvoption.selected {\r\n\tfilter: brightness(120%);\r\n\tborder-bottom: 3px solid var(--color-accent);\r\n\t/*background: var(--color-ui);\r\n\toutline: 5px solid var(--color-ui);*/\r\n}\r\n.brushviewer {\r\n\twidth: 100%;\r\n\tpadding-bottom: 10px;\r\n}\r\n.bvoptions {\r\n\tdisplay: grid;\r\n\tgrid-template-columns: repeat(auto-fill, minmax(30px, 1fr));\r\n\t\r\n\tbackground: var(--color-back);\r\n\tborder: 1px solid var(--color-bright_ui);\r\n\tborder-radius: 5px;\r\n\t\r\n\tmargin-top: 5px;\r\n\tpadding: 10px;\r\n\tgap: 10px;\r\n\t\r\n\twidth: 90%;\r\n\tmargin-left: 5%;\r\n\tz-index: 9;\r\n}\r\n/*  */\r\n.checklist {\r\n\twidth: 100%;\r\n\tgap: 10px;\r\n}\r\n.checklist > div {\r\n\tdisplay: flex;\r\n\tgap: 10px;\r\n\tpadding-inline: 15px;\r\n\talign-items: center;\r\n}\r\n.checklist > div > label {\r\n\tline-height: 30px;\r\n}\r\n.checklist > div > input:not(:checked) ~ i {\r\n\tdisplay: none;\r\n}\r\n.checklist > div > i {\r\n\tfont-size: 20px;\r\n\tmargin-left: auto;\r\n\ttransition: 100ms color; \r\n}\r\n.checklist > div > i:hover {\r\n\ttext-decoration: underline;\r\n\tcolor: var(--color-subtle_text)\r\n}\r\n\r\n/*  */\r\n.mt-tool-settings {\r\n\twidth: 95%;\r\n\tdisplay: grid;\r\n\tgap: 1px 15px;\r\n\tgrid-template-columns: max-content auto min-content;\r\n}\r\n.mt-tool-settings i:hover {\r\n\tcolor: var(--color-light);\r\n    transition: color 750ms linear;\r\n}\r\n.mt-tool-settings i {\r\n\tmargin-left: auto;\r\n    padding-top: 8px;\r\n    font-size: 13px;\r\n    height: 28px;\r\n    color: var(--color-subtle_text);\r\n    display: block;\r\n    width: 16px;\r\n    text-align: center;\r\n}\r\n\r\n.bvoption::before {\r\n\tcontent: attr(flag);\r\n\tfont-family: 'Material Icons';\r\n\tposition: absolute;\r\n\ttop: -5px;\r\n\tright: -5px;\r\n\tcolor: var(--color-accent);\r\n\ttext-shadow: -1px 1px 0 black;\r\n}\r\n.mt-dynamics summary {\r\n\tcolor: var(--color-subtle_text);\r\n\ttransition: color 100ms ease;\r\n}\r\n.mt-dynamics summary:hover, .mt-dynamics[open] summary { color: inherit }\r\n.mt-dynamics summary::before {\r\n\tcontent: 'chevron_right';\r\n\tfont-family: 'Material Icons';\r\n\tpadding-inline: 3px;\r\n}\r\n.mt-dynamics[open] summary::before {\r\n\tcontent: 'expand_more';\r\n}\r\n</style>`)\r\n\r\nfunction idToTitle(string) {\r\n\tlet str = '';\r\n\r\n\tconst stringLength = string.length\r\n\tfor (let i = 0; i < stringLength; i++) {\r\n\t\tconst c = i == 0 ? string[i].toUpperCase(): string[i];\r\n\t\r\n\t\tif (c.match(/[_\\-\\ ]/)) {\t\t\t\r\n\t\t\ti++;\r\n\t\t\tstr += ' ' + (string[i] ?? '').toUpperCase();\r\n\t\t\t\r\n\t\t\tcontinue;\r\n\t\t} else if (c.match(/\\d/) && string[i - 1]?.match?.(/\\D/)) {\r\n\t\t\tstr += ' #';\r\n\t\t}\r\n\r\n\t\tstr += c;\r\n\t}\r\n\treturn str;\r\n}\r\n/* Types */\r\nconst drawOpts = {\r\n\t// texture coordinates\r\n\tx: 0,\r\n\ty: 0,\r\n\t// texture coordinates\r\n\tpx: 0,\r\n\tpy: 0,\r\n\t/** @type {MouseEvent} */\r\n\tevent: null,\r\n\t// local\r\n\tlocalX: 0,\r\n\tlocalY: 0,\r\n\t// local. relative to the 'origin'\r\n\tgridX: 0,\r\n\tgridY: 0,\r\n\t// local. between [0-1]\r\n\tuvX: 0,\r\n\tuvY: 0,\r\n}\r\n/* API */\r\nclass BrushViewerOption {\r\n\tconstructor(data) {\r\n\t\tthis.id = data.id;\r\n\t\tthis.src = data.src;\r\n\t\tthis.condition = data.condition;\r\n\t\tthis.node = Interface.createElement('div', {class: 'bvoption'});\r\n\t\tthis.node.title = idToTitle(this.id);\r\n\t\tthis.image = new Image();\r\n\t\tthis.image.src = this.src;\r\n\t\tthis.image.draggable = false;\r\n\r\n\t\tthis.node.append(this.image);\r\n\t}\r\n\tselect() {\r\n\t\tthis.node.classList.add('selected');\r\n\t}\r\n\tunselect() {\r\n\t\tthis.node.classList.remove('selected');\r\n\t}\r\n}\r\nconst BrushViewer = {\r\n\t/** @type {BrushViewerOption[]} */\r\n\tchildren: null,\r\n\tnode: Interface.createElement('div', {class: 'brushviewer'}),\r\n\toptionsnode: Interface.createElement('div', {class: 'bvoptions'}),\r\n\tvalue: null,\r\n\tinit() {\r\n\t\tthis.children = Object.keys(Brushes).map(id => Brushes[id].brushview);\r\n\t\tthis.node.append(\r\n\t\t\tInterface.createElement('p', {class: 'panel_toolbar_label'}, 'Tool Shape'), \r\n\t\t\tthis.optionsnode\r\n\t\t);\r\n\t\tthis.val(this.children[0]);\r\n\t\tthis.build();\r\n\t},\r\n\tval(item) {\r\n\t\tconst selected = this.children.find(e => e.id === this.value);\r\n\t\tif (!item) return selected;\r\n\r\n\t\tselected?.unselect();\r\n\t\titem.select()\r\n\t\tthis.value = item.id;\r\n\t},\r\n\tbuild() {\r\n\t\tthis.optionsnode.innerText = '';\r\n\t\t\r\n\t\tthis.children.forEach(child => {\r\n\t\t\tchild.node.onclick = () => {\r\n\t\t\t\tthis.val(child);\r\n\t\t\t}\r\n\t\t\tthis.optionsnode.append(child.node);\r\n\t\t})\r\n\t},\r\n\tadd(item) {\r\n\t\tthis.children.push(item);\r\n\t\tthis.build();\r\n\t\tthis.val(this.children[0]);\r\n\t},\r\n\tremove(key) {\r\n\t\tthis.children.remove(this.children.find(e => e.id == key));\r\n\t\tthis.build();\r\n\t\tthis.val(this.children[0]);\r\n\t}\r\n}\r\n\r\nconst MTMath = {\r\n\trotatePoint(point, theta) {\r\n\t\tconst x = point[0] * Math.cos(theta) - point[1] * Math.sin(theta);\r\n\t\tconst y = point[0] * Math.sin(theta) + point[1] * Math.cos(theta);\r\n\r\n\t\treturn [x, y];\r\n\t},\r\n\trotatePointAroundTarget(point, target, theta) {\r\n\t\tlet newPoint = point.map((a, i) => a - target[i]);\r\n\t\tnewPoint = MTMath.rotatePoint(newPoint, theta);\r\n\r\n\t\treturn newPoint.map((a, i) => a + target[i]);\r\n\t}\r\n}\r\n\r\nconst dummyCanvas = document.createElement('canvas');\r\nconst dummyCtx = dummyCanvas.getContext('2d');\r\n\r\n/** @type {{[id: string]: Brush}}*/\r\nconst Brushes = {}\r\nclass Brush {\r\n\tconstructor(data) {\r\n\t\tBrushes[data.id] = this;\r\n\t\tthis.icon = data.icon;\r\n\t\tthis.id = data.id;\r\n\t\tthis.custom = data.custom;\r\n\r\n\t\tthis.brushview = new BrushViewerOption({\r\n\t\t\tid: this.id,\r\n\t\t\tsrc: this.icon\r\n\t\t})\r\n\t\tthis.brushview.node.title += ' - ' + this.constructor.name.replace('Brush', ' Based');\r\n\t\tthis.brushview.node.setAttribute('flag', this.constructor.flag)\r\n\t}\r\n\t/**\r\n\t * @param {typeof drawOpts} data \r\n\t * @returns {Number}\r\n\t */\r\n\tget(data) {\r\n\t\treturn 1;\r\n\t}\r\n}\r\nclass MathBrush extends Brush {\r\n\tstatic flag = \"functions\";\r\n\tconstructor(data) {\r\n\t\tsuper(data);\r\n\t\tthis.func = data.func;\r\n\t}\r\n\t/**\r\n\t * @param {typeof drawOpts} data \r\n\t * @returns {Number}\r\n\t */\r\n\tget(data) {\r\n\t\treturn this.func(data);\r\n\t}\r\n}\r\nclass ImageBrush extends Brush {\r\n\tstatic flag = \"image\";\r\n\tconstructor(data) {\r\n\t\tsuper(data);\r\n\t\tthis.image = new Image();\r\n\r\n\t\t/** @type {Uint8ClampedArray} */\r\n\t\tthis.data = null;\r\n\r\n\t\tthis.image.onload = () => {\r\n\t\t\tdummyCanvas.width = this.width;\r\n\t\t\tdummyCanvas.height = this.height;\r\n\t\t\tdummyCtx.drawImage(this.image, 0, 0, this.width, this.height);\r\n\t\t\t\r\n\t\t\tthis.data = dummyCtx.getImageData(0,0, this.width, this.height).data;\r\n\t\t\tif (!data.save) return;\r\n\r\n\t\t\tthis.custom = true;\r\n\t\t\tconst base64 = dummyCanvas.toDataURL();\r\n\t\t\taddBrush(this.id, base64);\r\n\t\t\tBrushViewer.add(this.brushview)\r\n\t\t}\r\n\t\tthis.image.src = this.icon;\r\n\t}\r\n\tget width() {\r\n\t\treturn Math.clamp(this.image.width, 0, 50);\r\n\t}\r\n\tget height() {\r\n\t\treturn Math.clamp(this.image.height, 0, 50);\r\n\t}\r\n\t/**\r\n\t * @param {typeof drawOpts} data \r\n\t * @returns {Number}\r\n\t */\r\n\tget({uvX, uvY}) {\r\n\t\tif (uvX < 0 || uvX > 1 || uvY < 0 || uvY > 1) return 0;\r\n\r\n\t\tconst x = Math.floor(uvX * this.width);\r\n\t\tconst y = Math.floor(uvY * this.height);\r\n\t\tconst i = (x + y * this.width) * 4;\r\n\r\n\t\tconst r = this.data[i + 0];\r\n\t\tconst g = this.data[i + 1];\r\n\t\tconst b = this.data[i + 2];\r\n\t\tconst a = this.data[i + 3];\r\n\t\tconst luminance = (0.2126*r + 0.7152*g + 0.0722*b) / 255;\r\n\r\n\t\treturn luminance * (a / 255);\r\n\t}\r\n}\r\n/** @type {{[id: string]: Dynamic}}*/\r\nconst Dynamics = {}\r\nclass Dynamic {\r\n\t/**\r\n\t * @param {String} id \r\n\t * @param {{\r\n\t * onBefore: (data: typeof drawOpts) => void,\r\n\t * onAfter: (result_color: {a: number}, data: typeof drawOpts) => void,\r\n\t * settings: Object,\r\n\t * description: string,\r\n\t * }} data \r\n\t */\r\n\tconstructor(id, data) {\r\n\t\tDynamics[id] = this;\r\n\t\tthis.id = id;\r\n\r\n\t\tthis.settings = data.settings;\r\n\t\tthis.description = data.description;\r\n\t\tthis.onBefore = data.onBefore;\r\n\t\tthis.onAfter = data.onAfter;\r\n\t}\r\n\tget(settingKey) {\r\n\t\treturn this.settings[settingKey][0];\r\n\t}\r\n}\r\n\r\n// const radify = r => (r + TWO_PI) % TWO_PI;\r\nconst diff = (a,b) => Math.abs(a - b);\r\n;(function() {\r\n\t\r\n\tlet rotation = 0;\r\n\tlet lastEvent, lastPos;\r\n\tnew Dynamic('follow_rotation', {\r\n\t\tdescription: 'Rotates The Brush following the cursor',\r\n\t\tonBefore(data) {\r\n\t\t\tif (lastEvent != data.event && lastPos) {\r\n\t\t\t\tconst direction = [data.x, data.y].V2_subtract(lastPos);\r\n\t\t\t\tconst facArcPart = Math.atan2(direction[0], direction[1]) + PI;\r\n\t\t\t\tconst oppArcPart = TWO_PI - facArcPart;\r\n\t\t\t\tconst closest = diff(facArcPart, rotation) < diff(oppArcPart, rotation) ? facArcPart: oppArcPart;\r\n\r\n\t\t\t\trotation = closest;\r\n\t\t\t}\r\n\t\t\tlastEvent = data.event;\r\n\t\t\tlastPos = [data.x, data.y];\r\n\t\r\n\t\t\tconst p = [data.px, data.py];\r\n\t\t\tconst t = [data.x, data.y];\r\n\t\t\tconst newp = MTMath.rotatePointAroundTarget(p, t, rotation);\r\n\t\t\tdata.px = Math.floor(newp[0]);\r\n\t\t\tdata.py = Math.floor(newp[1]);\r\n\t\t}\r\n\t})\r\n\t\r\n})();\r\n\r\n;(function() {\r\n\r\n\tlet lastrotation = 0;\r\n\tlet lastEvent;\r\n\tnew Dynamic('randomized_rotation', {\r\n\t\tdescription: 'Rotates The Brush randomly',\r\n\t\tonBefore(data) {\r\n\t\t\tif (lastEvent != data.event) {\r\n\t\t\t\tlastrotation = floorTo(Math.random() * PI * 2, QUARTER_NINETY_DEGREES);\r\n\t\t\t}\r\n\t\t\tlastEvent = data.event;\r\n\t\r\n\t\t\tconst p = [data.px, data.py];\r\n\t\t\tconst t = [data.x, data.y];\r\n\t\t\tconst newp = MTMath.rotatePointAroundTarget(p, t, lastrotation);\r\n\t\t\tdata.px = Math.floor(newp[0]);\r\n\t\t\tdata.py = Math.floor(newp[1]);\r\n\t\t}\r\n\t})\r\n\t\r\n})();\r\nnew Dynamic('velocity_opacity', {\r\n\tdescription: 'Transparentizes Color based on movement velocity',\r\n\tsettings: {\r\n\t\tminimum_opacity: [30, 0, 100],\r\n\t\tmaximum_opacity: [100, 1, 100],\r\n\t},\r\n\tonAfter(result, {event}) {\r\n\t\tresult.a *= eventVelocity(event, 30, this.get('minimum_opacity')/100, this.get('maximum_opacity')/100);\r\n\t}\r\n})\r\n\r\nnew Dynamic('velocity_tapering', {\r\n\tdescription: 'Tapers The Stroke based on movement velocity',\r\n\tsettings: {\r\n\t\tminimum_tapering: [10, 0, 100],\r\n\t\tmaximum_tapering: [100, 1, 100],\r\n\t},\r\n\tonAfter(result, {event, uvX, uvY}) {\r\n\t\tconst factor = (0.9 - (eventVelocity(event, 25, this.get('minimum_tapering')/100, this.get('maximum_tapering')/100) - .1)) + .1;\r\n\r\n\t\tconst radialFactor = Math.sqrt(radialGrad(uvX, uvY)) / Math.SQRT2;\r\n\r\n\t\tresult.a = radialFactor < factor ? result.a: 0;\r\n\t}\r\n})\r\n\r\nlet lastStrokeStartEvent;\r\n\r\n;(function() {\r\n\tlet lastEvent, lastStrokeEvent;\r\n\t\r\n\tlet indexOfSharpening = 1;\r\n\t\r\n\tnew Dynamic('sharpen_start', {\r\n\t\tdescription: 'Sharpens The Stroke at its tail',\r\n\t\tsettings: {\r\n\t\t\tsharpen_length: [25, 10, 100],\r\n\t\t},\r\n\t\tonAfter(result, {event, uvX, uvY}) {\r\n\t\t\tif (lastEvent != event) {\r\n\t\t\t\tif (lastStrokeEvent != lastStrokeStartEvent) \r\n\t\t\t\t\tindexOfSharpening = 1;\r\n\t\t\t\telse if (indexOfSharpening < this.get('sharpen_length'))\r\n\t\t\t\t\tindexOfSharpening ++;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tconst factor = indexOfSharpening / this.get('sharpen_length');\r\n\t\t\tconst radialFactor = Math.sqrt(radialGrad(uvX, uvY)) / Math.SQRT2;\r\n\t\t\t\r\n\t\t\tresult.a = radialFactor < factor ? result.a: 0;\r\n\t\r\n\t\t\tlastStrokeEvent = lastStrokeStartEvent;\r\n\t\t\tlastEvent = event;\r\n\t\t}\r\n\t})\r\n})();\r\n;(function() {\r\n\tlet lastEvent, lastStrokeEvent;\r\n\t\r\n\tlet indexOfFading = 1;\r\n\t\r\n\tnew Dynamic('fade_start', {\r\n\t\tdescription: 'fades The Stroke at its tail',\r\n\t\tsettings: {\r\n\t\t\tfading_length: [25, 10, 250],\r\n\t\t},\r\n\t\tonAfter(result, {event, uvX, uvY}) {\r\n\t\t\tif (lastEvent != event) {\r\n\t\t\t\tif (lastStrokeEvent != lastStrokeStartEvent) \r\n\t\t\t\t\tindexOfFading = 1;\r\n\t\t\t\telse if (indexOfFading < this.get('fading_length'))\r\n\t\t\t\t\tindexOfFading ++;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tresult.a *=  indexOfFading / this.get('fading_length');\r\n\t\r\n\t\t\tlastStrokeEvent = lastStrokeStartEvent;\r\n\t\t\tlastEvent = event;\r\n\t\t}\r\n\t})\r\n})();\r\n\r\n/* https://easings.net/#easeInOutSine */\r\nfunction easeInOutSine(x) {\r\n\treturn -0.5*Math.cos(PI * x) + 0.5;\r\n}\r\nconst eventVelocity = (e, scalar = 30, min = 0, max = 0.9) => {\r\n\tconst velocity = Math.sqrt(e.movementX**2 + e.movementY**2);\r\n\treturn easeInOutSine(Math.clamp(velocity / scalar, min, max));\r\n}\r\nconst radialGrad = (x , y) => {\r\n\tReusable.vec1.set(x, y, 0);\r\n\tReusable.vec2.set(0.5, 0.5, 0);\r\n\treturn Reusable.vec1.distanceToSquared(Reusable.vec2);\r\n}\r\nfunction floorTo(x, factor) {\r\n\treturn Math.floor(x / factor) * factor;\r\n}\r\n\r\nnew MathBrush({\r\n\tid: 'circle',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50' cy='50' r='50' fill='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({uvX, uvY}) => Math.sqrt(radialGrad(uvX, uvY)) >= .5 ? 0: 1  \r\n})\r\nnew MathBrush({\r\n\tid: 'circle_outline',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='50' cy='50' r='46' fill='transparent' stroke-width='4px' stroke='white' /%3E%3C/svg%3E\",\r\n\tfunc({uvX, uvY}) {\r\n\t\tconst v = Math.sqrt(radialGrad(uvX, uvY));\r\n\t\treturn v >= .3 && v < .5 ? 1 : 0;\r\n\t}\r\n})\r\nnew MathBrush({\r\n\tid: 'square',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100' height='100' fill='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({uvX, uvY}) => uvX >= 0 && uvX <= 1 && uvY >= 0 && uvY <= 1 ? 1: 0\r\n})\r\nnew MathBrush({\r\n\tid: 'line',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 50 l 100 0' stroke-width='4px' stroke='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({localY}) => localY == 0 || Math.abs(localY) == 0.5\r\n})\r\nnew MathBrush({\r\n\tid: 'line2',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 50 0 l 0 100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({localX}) => localX == 0 || Math.abs(localX) == 0.5\r\n})\r\nnew MathBrush({\r\n\tid: 'line3',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 0 l 100 100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({localX, localY}) => localX == localY\r\n})\r\nnew MathBrush({\r\n\tid: 'line4',\r\n\ticon: \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m 0 100 l 100 -100' stroke-width='4px' stroke='white' /%3E%3C/svg%3E\",\r\n\tfunc: ({localX, localY}) => -localX == localY\r\n})\r\nnew ImageBrush({\r\n\tid: 'benchblock', // my favorite 😘\r\n\ticon: 'assets/logo_cutout.svg'\r\n})\r\n\r\nnew ImageBrush({\r\n\tid: 'choak',\r\n\ticon: 'data:image/png;base64,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'\r\n})\r\nnew ImageBrush({\r\n\tid: 'bristles',\r\n\ticon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSqVgnYQEcxQxcGCqIijVLEIFkpboVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoIgh8gjk5Oii5S4v+SQotYD4778e7e4+4dINRKTDU7JgBVs4xENCKmM6ui7xXdCKAPwxiTmKnHkosptB1f9/Dw9S7Ms9qf+3P0KlmTAR6ReI7phkW8QTyzaemc94mDrCApxOfE4wZdkPiR67LLb5zzDgs8M2ikEvPEQWIx38JyC7OCoRJPE4cUVaN8Ie2ywnmLs1qqsMY9+Qv9WW0lyXWaQ4hiCTHEIUJGBUWUYCFMq0aKiQTtR9r4Bx1/nFwyuYpg5FhAGSokxw/+B7+7NXNTk26SPwJ0vtj2xwjg2wXqVdv+Prbt+gngfQautKa/XANmP0mvNrXQERDYBi6um5q8B1zuAANPumRIjuSlKeRywPsZfVMG6L8Fetbc3hr7OH0AUtTV8g1wcAiM5il7vc27u1p7+/dMo78fqZNyvZb8BScAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmCQ8SKSA5MOglAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAA7FJREFUeNrtmcFrXFUUxn/nZZzU2ohGy9SCWEFQbJGqG1FrxZWCoqBL6cL/oFulC3En3RRXLoRacOfCuigIughWUapGoRtFkNaaok1NTWKSTmfyucg39BlE0r47M6+Z+8HlzZzL3Hnnu+d899x7ISMjIyMjIyMjI2MkEXV9MUkBNICtNi0BnYhQnrZRiID/iIYW8IQbwBduv2/6qJDUkPSspFOSum6nbGtUGbu4QTjYAuwG9vqdC3/e7b5NT0AHmAXmS7Z52zpVBm70MWebwARwGVgGuhVytQ1MAx8AL9n2kW3tWomgpAK4H3gOeBg4D3wKfAUsXC8Jkm4GdgL32vQLMBMRy7VSa0n3SToqaUFXcULSQyanErmSbnKrV/ra+ZakdyTNW6l7WJD0oqTxuolLSha3Ac8DLwPrHf0DuAR060ZAI2He7wFeA24FZGdXgRXgY+DnTUuAx9kLPGCnewR0gE+Ad+tasaUiYMwpUNj5tp9fA28DP0XEah0LjFQacBn4HvjRjsshfwT4tq7OJ60DJN0BPA7ss+lz4MuIuJh4tZkA7gRmI2KhbkthIWmrW9GH8SckHfLSelhSa6T27pIe1L/xlqRbRmEzVMZ5P7vAqy6PR4aAGeCEV5mua44dVdKtH3kaksbcUm+25oH3gb9MQBN4gavnhsMjwI6PA5PADrdJSeOpiPByeg646IIL4BlHwlBL4fAs7ATuAba76wJwBpiRtJSoErwEnAbu8ve/q5TYqSrBpp3fB+z3vgC/6JRrgrMumFKkwXvAU47gXa5Eh0OAZ3+bZ34/cKDU/YifZ4E/JbWrRkFEdCX9YB24zZutzjA1oGDtYHJ7aebL2OO+LQk1ZxZ43UviG8DcsFNgsPV7xBVJx4HPgMWIuDLMCOjt+S8459fjtPtWSsqdhISImKvifJIIiAhJWrTaT5XCviyCZzxTtTsPSLI+b2QZBJY2LQElEppeEXq3NSvAInBd6u8xxz3uctVw7ysB6166py2rFe4BArgdeBp4FDgOTPeDhLpufRuSHpN0zlvfo5ImU/9PwYgjEsxU0wK4FBHta/hdUSphu+vPDQeVApHA+SeBV4APgZMbIcH3fC3gbpt+Ze3YfHnQIlh19luSppyjUxs5o/O54S5JByVNux20beApOYxSeMwzf4C1y5QevgF+S1ktDoKAOeDNUgrMcYOhEgER0ZZ0EvjuGkSw65w/VrIds23gd4cxQL0oq37T5fL/imBGRkZGRkZGRkZGRka/8A+72wegq5KyQAAAAABJRU5ErkJggg=='\r\n})\r\nnew ImageBrush({\r\n\tid: 'marker',\r\n\ticon: 'data:image/png;base64,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'\r\n})\r\n\r\nconst save = JSON.parse(localStorage.getItem('brp_settings') ?? '{}');\r\nconst savedata = save;\r\nfunction saveItem(name, value) {\r\n\tif (name) {\r\n\t\tsavedata[name] = value;\r\n\t}\r\n\tlocalStorage.setItem('brp_settings', JSON.stringify(savedata));\r\n}\r\n\r\nconst requestStorage = ({success = null, fail = null}) => {\r\n\tconst request = indexedDB.open(\"brush_plus_settings\", 2);\r\n\trequest.onerror = fail;\r\n\trequest.onblocked = fail;\r\n\trequest.onupgradeneeded = () => {\r\n\t\tconst brushDB = request.result;\r\n\t\tif (!brushDB.objectStoreNames.contains('data')) {\r\n\t\t\tbrushDB.createObjectStore('data', {keyPath: 'id'});\r\n\t\t}\r\n\t}\r\n\r\n\trequest.onsuccess = () => {\r\n\t\tif (!success) return;\r\n\t\tconst brushDB = request.result;\r\n\r\n\t\tconst transaction = brushDB.transaction(\"data\", \"readwrite\");\r\n\t\tconst data = transaction.objectStore(\"data\");\r\n\t\tsuccess(data);\r\n\t}\r\n}\r\n// Load Brushes\r\nrequestStorage({\r\n\tfail: console.warn,\r\n\tasync success(data) {\t\t\t\r\n\t\tif (savedata.brushes) {\r\n\t\t\t// migration from localStorage to indexedDB\r\n\t\t\tfor (const brushId in savedata.brushes) {\r\n\t\t\t\tlet brushData = savedata.brushes[brushId];\r\n\t\t\t\tif (isApp && !brushData.startsWith('data:image/')) {\r\n\t\t\t\t\tbrushData = `data:image/${pathToExtension(brushData)};base64,` + fs.readFileSync(brushData, {encoding: 'base64'});\r\n\t\t\t\t}\r\n\t\t\t\tawait addBrush(brushId, brushData);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tdelete savedata.brushes;\r\n\t\t\tsaveItem();\r\n\t\t}\r\n\r\n\t\tconst allBrushes = data.getAll();\r\n\t\tallBrushes.onsuccess = () => \r\n\t\t\tallBrushes.result.forEach(datapoint => BrushViewer.add( new ImageBrush({...datapoint, custom: true}).brushview ));\r\n\t\t\r\n\t\tallBrushes.onerror = () => \r\n\t\t\tBlockbench.showMessageBox('Failed to load saved brushes!');\r\n\t}\r\n});\r\nconst addBrush = (id, icon) => new Promise((resolve, reject) => \r\n\trequestStorage({\r\n\t\tfail: reject,\r\n\t\tsuccess(data) {\r\n\t\t\tconst addRequest = data.add({id, icon});\r\n\t\t\taddRequest.onsuccess = resolve;\r\n\t\t\taddRequest.onerror = reject;\r\n\t\t}\r\n}));\r\nconst deleteBrush = (id) => new Promise((resolve, reject) => \r\n\trequestStorage({\r\n\t\tfail: reject,\r\n\t\tsuccess(data) {\r\n\t\t\tconst addRequest = data.delete(id);\r\n\t\t\taddRequest.onsuccess = resolve;\r\n\t\t\taddRequest.onerror = reject;\r\n\t\t}\r\n}));\r\n\r\nconst DynamicsCheckList = {\r\n\tstructure: Object.entries(Dynamics),\r\n\tchecked: [],\r\n\tnode: Interface.createElement('div', { class: 'checklist' }),\r\n\r\n\tbuild() {\r\n\t\tthis.structure.forEach(([key, dynamic]) => {\r\n\t\t\tconst id = bbuid(6);\r\n\t\t\tconst inode = Interface.createElement('div');\r\n\t\t\tconst checkbox = Interface.createElement('input', {id, type:'checkbox'});\r\n\t\t\t\r\n\t\t\tinode.append(\r\n\t\t\t\tcheckbox, \r\n\t\t\t\tInterface.createElement('label', {for: id, title: dynamic.description}, idToTitle(key))\r\n\t\t\t);\r\n\t\t\tif (dynamic.settings) {\r\n\t\t\t\tconst editButton = Blockbench.getIconNode('edit');\r\n\t\t\t\tconst form = {}\r\n\t\t\t\tfor (const settingKey in dynamic.settings) {\r\n\t\t\t\t\tconst setting = dynamic.settings[settingKey];\r\n\t\t\t\t\t\r\n\t\t\t\t\tform[settingKey] = {label: idToTitle(settingKey), type: Blockbench.isNewerThan('4.5.0-beta.1') ? 'range': 'number', value: setting[0]};\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (1 in setting)\r\n\t\t\t\t\t\tform[settingKey].min = setting[1];\r\n\t\t\t\t\tif (2 in setting)\r\n\t\t\t\t\t\tform[settingKey].max = setting[2];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst editDialog = new Dialog({\r\n\t\t\t\t\ttitle: 'Edit Dynamic Settings',\r\n\t\t\t\t\tform,\r\n\t\t\t\t\tonConfirm(formData) {\r\n\t\t\t\t\t\tfor (const settingKey in formData) {\r\n\t\t\t\t\t\t\tconst newSettingValue = formData[settingKey];\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tdynamic.settings[settingKey][0] = newSettingValue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t\r\n\t\t\t\teditButton.addEventListener('click', () => editDialog.show())\r\n\r\n\t\t\t\tinode.append(editButton);\r\n\t\t\t}\r\n\r\n\t\t\tinode.addEventListener('input', () => {\r\n\t\t\t\tif (checkbox.checked) {\r\n\t\t\t\t\tthis.checked.safePush(key);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.checked.remove(key);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tthis.node.append(inode);\r\n\t\t})\r\n\t}\r\n}\r\nDynamicsCheckList.build();\r\nBrushViewer.init()\r\n\r\n/**\r\n * @param {String} message\r\n * @throws {Error}\r\n */\r\nconst showErrorInDialog = message => {\r\n\tBlockbench.showQuickMessage(message, 2000);\r\n\tthrow new Error(message)\r\n}\r\nlet brushp;\r\nBBPlugin.register('brush', {\r\n\ttitle: \"Brush Plus\",\r\n\ticon: \"fa-brush\",\r\n\tauthor: \"Malik12tree\",\r\n\tdescription: \"Create/Use custom brushes with dynamic behavior!\",\r\n\tversion: \"1.0.1\",\r\n\tmin_version: \"4.4.0\",\r\n\tvariant: \"both\",\r\n\ttags: [\"Paint\", \"Customization\", \"Interface\"],\r\n\tonload() {\r\n\t\tPanels?.mtbrush_settings?.delete();\r\n\t\t\r\n\t\t/* Utils */\r\n\t\tconst settingsMap = {\r\n\t\t\tsize: BarItems.slider_brush_size,\r\n\t\t\topacity: BarItems.slider_brush_opacity,\r\n\t\t\tsoftness: BarItems.slider_brush_softness,\r\n\t\t\taspect: (save.aspect ?? 100) / 100,\r\n\t\t\tspacing: (save.spacing ?? 0) / 10,\r\n\t\t\tpreservePixels: save.preservePixels ?? false,\r\n\t\t\tget brush() {\r\n\t\t\t\treturn Brushes[BrushViewer.value];\r\n\t\t\t}\r\n\t\t}\r\n\t\t/**\r\n\t\t * @param {keyof settingsMap} name \r\n\t\t */\r\n\t\tfunction setting(name) {\r\n\t\t\treturn settingsMap[name]?.value ?? settingsMap[name] ?? 0;\r\n\t\t}\r\n\t\t/*  */\r\n\t\t\r\n\t\tconst customBrushDialog = new Dialog({\r\n\t\t\ttitle: 'Custom Brush',\r\n\t\t\tform: {\r\n\t\t\t\tname: {\r\n\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\tlabel: 'Name',\r\n\t\t\t\t\tvalue: 'New Brush',\r\n\t\t\t\t},\r\n\t\t\t\tfile: {\r\n\t\t\t\t\ttype: 'file',\r\n\t\t\t\t\textensions: ['png', 'jpg', 'jpeg', 'bmp', 'tiff', 'tif', 'gif'],\r\n\t\t\t\t\tlabel: \"Texture\",\r\n\t\t\t\t\treadtype: \"image\",\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tlines: ['<span class=\"subtle\" >Blockbench\\'s maximum brush size is 50 meaning images with dimensions greater than 50x50 would lose detail.<br>Black/Transparent -> White/Opaque represents base opacity of the brush.</span>'],\r\n\t\t\tform_first: true,\r\n\t\t\tonConfirm({file, name})  {\r\n\t\t\t\tif (!name || name in Brushes) {\r\n\t\t\t\t\tshowErrorInDialog('Please provide a unique name!');\r\n\t\t\t\t}\r\n\t\t\t\telse if (!file) {\r\n\t\t\t\t\tshowErrorInDialog('Please provide an image file!');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tBrushViewer.add(\r\n\t\t\t\t\tnew ImageBrush({\r\n\t\t\t\t\t\tid: name,\r\n\t\t\t\t\t\ticon: file,\r\n\t\t\t\t\t\tsave: true\r\n\t\t\t\t\t}).brushview\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t})\r\n\t\tnew Panel ({\r\n\t\t\tid: 'mtbrush_settings',\r\n\t\t\tname: 'Brush Settings',\r\n\t\t\ticon: 'fa-brush',\r\n\t\t\tcondition: { modes: ['paint'], /* method: () => Toolbars.tools.selected && Toolbars.tools.selected.id == 'brushplus' */ },\r\n\t\t\tdefault_position: {\r\n\t\t\t\tslot: 'right_bar',\r\n\t\t\t\tfloat_position: [0, 0],\r\n\t\t\t\tfloat_size: [300, 400],\r\n\t\t\t\theight: 400,\r\n\t\t\t},\r\n\t\t\tcomponent: {\r\n\t\t\t\tmethods: {\r\n\t\t\t\t\tsetAspect(event) {\r\n\t\t\t\t\t\tconst x = event.target.value;\r\n\t\t\t\t\t\tthis.aspect = x;\r\n\t\t\t\t\t\tsettingsMap.aspect = x / 100;\r\n\t\t\t\t\t\tsaveItem('aspect', x);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsetSpacing(event) {\r\n\t\t\t\t\t\tconst x = event.target.value;\r\n\t\t\t\t\t\tthis.spacing = x;\r\n\t\t\t\t\t\tsettingsMap.spacing = 0.1 * x;\r\n\t\t\t\t\t\tsaveItem('spacing', x);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsetPreservePixels(event) {\r\n\t\t\t\t\t\tconst x = event.target.checked;\r\n\t\t\t\t\t\tthis.preservePixels = x;\r\n\t\t\t\t\t\tsettingsMap.preservePixels = x;\r\n\t\t\t\t\t\tsaveItem('preservePixels', x);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tshowPreservePixelsInfo() {\r\n\t\t\t\t\t\tBlockbench.showMessageBox({\r\n\t\t\t\t\t\t\ttitle: 'Preserve Pixels ?',\r\n\t\t\t\t\t\t\tmessage: 'When enabled, overlapping pixels of opacity in the same stroke remain intact; resulting in a flat stroke color.<br/>Blockbench\\'s default brush uses this behavior.',\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\taddCustomBrush() {\r\n\t\t\t\t\t\tcustomBrushDialog.show();\r\n\t\t\t\t\t},\r\n\t\t\t\t\tremoveCustomBrush() {\r\n\t\t\t\t\t\tconst selected = BrushViewer.value;\r\n\t\t\t\t\t\tif (!Brushes[selected].custom) return;\r\n\r\n\t\t\t\t\t\tdeleteBrush(selected)\r\n\t\t\t\t\t\t.then(() => {\r\n\t\t\t\t\t\t\tBrushViewer.remove(selected);\r\n\t\t\t\t\t\t\tBrushViewer.remove(selected);\r\n\t\t\t\t\t\t\tdelete Brushes[selected];\r\n\t\t\t\t\t\t\tBlockbench.showQuickMessage(`Succesfully removed '${selected}'!`, 2000)\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(() => Blockbench.showQuickMessage('Failed to remove brush!', 2000));\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tdata() {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\taspect: save.aspect ?? 100,\r\n\t\t\t\t\t\tspacing: save.spacing ?? 0,\r\n\t\t\t\t\t\tpreservePixels: save.preservePixels ?? false,\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\ttemplate: `\r\n\t\t\t\t<div style=\"overflow-y:auto;\">\r\n\t\t\t\t\t<div class=\"toolbar\">\r\n\t\t\t\t\t\t<div @click=\"addCustomBrush\" class=\"tool add_custom_brush\"><div class=\"tooltip\">Add Custom Brush<label class=\"keybinding_label\"></label></div><i class=\"fa_big icon fa fa-plus-circle\"></i></div>\r\n\t\t\t\t\t\t<div @click=\"removeCustomBrush\" class=\"tool remove_custom_brush\"><div class=\"tooltip\" style=\"margin-left: 0px;\">Remove Custom Brush<label class=\"keybinding_label\"></label></div><i class=\"fa_big icon fa fa-circle-minus\"></i></div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class='mt-tool-settings' id='mt-brushshape-target'>\r\n\t\t\t\t\t\t<p class=\"panel_toolbar_label\">Aspect</p>\r\n\t\t\t\t\t\t<input type='range'  @input=\"setAspect\" min=\"0\" max=\"100\" :value=\"aspect\" />\r\n\t\t\t\t\t\t<input type='number' @input=\"setAspect\" min=\"0\" max=\"100\" :value=\"aspect\" class=\"dark_bordered\"/>\r\n\t\t\t\t\t\t<p class=\"panel_toolbar_label\">Spacing</p>\r\n\t\t\t\t\t\t<input type='range'  @input=\"setSpacing\" min=\"0\" max=\"100\" :value=\"spacing\" />\r\n\t\t\t\t\t\t<input type='number' @input=\"setSpacing\" min=\"0\" max=\"100\" :value=\"spacing\" class=\"dark_bordered\"/>\r\n\t\t\t\t\t\t<p class=\"panel_toolbar_label\"><label for=\"_preserve_pixels\">Preserve Pixels</label></p>\r\n\t\t\t\t\t\t<input type='checkbox' id=\"_preserve_pixels\" @input=\"setPreservePixels\" :checked=\"preservePixels\" />\r\n\t\t\t\t\t\t<i class=\"fa fa-question\" @click=\"showPreservePixelsInfo\"></i>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<hr>\r\n\t\t\t\t\t<details class=\"mt-dynamics\"><summary>Dynamics</summary></details>\r\n\t\t\t\t</div>\r\n\t\t\t\t`\r\n\t\t\t}\r\n\t\t});\r\n\t\t$(BrushViewer.node).insertBefore(document.getElementById('mt-brushshape-target'));\r\n\t\t\r\n\t\tPanels.mtbrush_settings.node.querySelector('details').append(DynamicsCheckList.node);\r\n\r\n\t\t/* Intalized on load for better performness */\r\n\t\tconst drawOptions = {\r\n\t\t\tx: 0, y: 0, px: 0, py: 0, event: null, // Changable in dynamics\r\n\t\t\t// Calculated once on `Brush.get` if the paramater was destructed.\r\n\t\t\tget localX() { return this.px - this.x },\r\n\t\t\tget localY() { return this.py - this.y },\r\n\t\t\tget gridX()  { return this.localX + this.radius },\r\n\t\t\tget gridY()  { return this.localY + this.radius },\r\n\t\t\tget uvX()    { return this.gridX / this.size },\r\n\t\t\tget uvY()    { return this.gridY / this.size },\r\n\t\t\tsize: 0,\r\n\t\t\tradius: 0,\r\n\t\t}\r\n\t\tconst pointBefore = {x: 0, y: 0, z: 0}\r\n\t\tbrushp?.delete?.();\r\n\r\n\t\tconst resultHolder = {a: 0}\r\n\t\tbrushp = new Tool('brushplus', {\r\n\t\t\tname: 'Brush Plus',\r\n\t\t\ticon: 'fa-brush',\r\n\t\t\tcategory: 'tools',\r\n\t\t\ttoolbar: 'brush',\r\n\t\t\talt_tool: 'color_picker',\r\n\t\t\tcursor: 'crosshair',\r\n\t\t\tselectFace: true,\r\n\t\t\ttransformerMode: 'hidden',\r\n\t\t\tpaintTool: true,\r\n\t\t\tallowed_view_modes: ['textured'],\r\n\t\t\tkeybind: new Keybind({key: 'b', shift: true}),\r\n\t\t\tmodes: ['paint'],\r\n\t\t\tonCanvasClick(data) { Painter.startPaintToolCanvas(data, data.event); },\r\n\t\t\tonSelect() {\r\n\t\t\t\tBarItems.brush_shape.set('square');\r\n\t\t\t\tUVEditor.vue.brush_type = 'square';\r\n\r\n\t\t\t\tPainter.updateNslideValues();\r\n\t\t\t},\r\n\t\t\tbrush: {\r\n\t\t\t\tblend_modes: false,\r\n\t\t\t\tshapes: false,\r\n\t\t\t\tsize: true,\r\n\t\t\t\tsoftness: true,\r\n\t\t\t\topacity: true,\r\n\t\t\t\toffset_even_radius: true,\r\n\t\t\t\tfloor_coordinates: true, //() => BarItems.slider_brush_softness.get() == 0,\r\n\r\n\t\t\t\tonStrokeStart(data) {\r\n\t\t\t\t\tlastStrokeStartEvent = data.event;\r\n\t\t\t\t\tpointBefore.x = mouse_pos.x;\r\n\t\t\t\t\tpointBefore.y = mouse_pos.y;\r\n\t\t\t\t},\r\n\t\t\t\tchangePixel(px, py, pxcolor, local_opacity, {color, texture, opacity, x, y, event}) {\r\n\t\t\t\t\t/* Aspect */\r\n\t\t\t\t\tconst height = setting('size') * setting('aspect');\r\n\t\t\t\t\tconst alocalY = Math.abs(py - y);\r\n\t\t\t\t\tif (alocalY * 2 > height) return pxcolor;\r\n\r\n\t\t\t\t\t/* Spacing */\r\n\t\t\t\t\tconst { vec1 } = Reusable;\r\n\t\t\t\t\tvec1.set(event.offsetX, event.offsetY, 0);\r\n\r\n\t\t\t\t\tconst spacing = setting('spacing') * setting('size') ;\r\n\t\t\t\t\t\r\n\t\t\t\t\tconst dstToBefore = vec1.distanceToSquared(pointBefore);\r\n\t\t\t\t\tif (dstToBefore != 0 && dstToBefore < spacing*spacing) return pxcolor;\r\n\t\t\t\t\t\r\n\t\t\t\t\tpointBefore.x = event.offsetX;\r\n\t\t\t\t\tpointBefore.y = event.offsetY;\r\n\r\n\t\t\t\t\t/*  */\r\n\t\t\t\t\tconst size = setting('size');\r\n\t\t\t\t\tconst radius = size / 2;\r\n\t\t\t\t\tif (size % 2 == 0) {\r\n\t\t\t\t\t\tx -= 0.5;\r\n\t\t\t\t\t\ty -= 0.5;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdrawOptions.x = x;\r\n\t\t\t\t\tdrawOptions.y = y;\r\n\t\t\t\t\tdrawOptions.px = px;\r\n\t\t\t\t\tdrawOptions.py = py;\r\n\t\t\t\t\tdrawOptions.event = event;\r\n\t\t\t\t\tdrawOptions.size = size;\r\n\t\t\t\t\tdrawOptions.radius = radius;\r\n\r\n\t\t\t\t\tDynamicsCheckList.checked.forEach(dynamic => Dynamics[dynamic]?.onBefore?.(drawOptions)); /* Apply Before Dynamics */\r\n\r\n\t\t\t\t\tconst brushfactor = setting('brush').get(drawOptions);\r\n\t\t\t\t\tlet a = opacity * local_opacity * brushfactor;\r\n\t\t\t\t\t\r\n\t\t\t\t\tresultHolder.a = a;\r\n\t\t\t\t\tDynamicsCheckList.checked.forEach(dynamic => Dynamics[dynamic]?.onAfter?.(resultHolder, drawOptions)); /* Apply After Dynamics */\r\n\t\t\t\t\ta = resultHolder.a;\r\n\r\n\t\t\t\t\tif (setting('preservePixels')) {\r\n\t\t\t\t\t\tlet before = Painter.getAlphaMatrix(texture, px, py);\r\n\t\t\t\t\t\tPainter.setAlphaMatrix(texture, px, py, a);\r\n\t\t\t\t\t\tif (a > before) {\r\n\t\t\t\t\t\t\ta = (a - before) / (1 - before);\r\n\t\t\t\t\t\t} else if (before) {\r\n\t\t\t\t\t\t\ta = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!isFinite(a)) a = 0;\r\n\r\n\t\t\t\t\tconst result_color = Painter.combineColors(pxcolor, color, a);\r\n\r\n\t\t\t\t\tif (Painter.lock_alpha) result_color.a = pxcolor.a;\r\n\t\t\t\t\treturn result_color;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\tToolbars.tools.add(brushp);\r\n\t},\r\n\tonunload(){\r\n\t\tPanels?.mtbrush_settings?.delete();\r\n\r\n\t\tbrushp?.delete?.();\r\n\t\tToolbars.tools.children.forEach(tool => {\r\n\t\t\tif (tool.id === 'brushplus') tool.delete();\r\n\t\t})\r\n\t\t\r\n\t\tstyle.delete();\r\n\t},\r\n\tonuninstall() {\r\n\t\tlocalStorage.removeItem('brp_settings');\r\n\t\tindexedDB.deleteDatabase('brush_plus_settings');\r\n\t}\r\n});\r\n\r\n})();\r\n"
  },
  {
    "path": "plugins/brush_randomizer.js",
    "content": "(function () {\n\tvar button;\n\tvar options_dialog;\n\tvar amount = 5;\n\tvar stroke = false;\n\tvar original_color;\n\tPlugin.register(\"brush_randomizer\", {\n\t\ttitle: \"Brush Color Randomizer\",\n\t\tauthor: \"Anniken(YT)\",\n\t\tdescription:\n\t\t\t\"Randomize the Brush Color with each stroke to give your artwork more variation\",\n\n\t\tversion: \"1.0.0\",\n\t\ticon: \"brush\",\n\t\tvariant: \"both\",\n\t\tonload() {\n\t\t\toptions_dialog = new Dialog(\"brush_randomizer_options\", {\n\t\t\t\ttitle: \"Brush Randomizer Options\",\n\t\t\t\tform: {\n\t\t\t\t\tamount: {\n\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\tlabel: \"Amount (percent)\",\n\t\t\t\t\t\tvalue: amount,\n\t\t\t\t\t\tstep: 1,\n\t\t\t\t\t\tmin: 1,\n\t\t\t\t\t\tmax: 100,\n\t\t\t\t\t},\n\t\t\t\t\tstroke: {\n\t\t\t\t\t\ttype: \"checkbox\",\n\t\t\t\t\t\tlabel: \"Randomize Stroke\",\n\t\t\t\t\t\tvalue: stroke,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tonConfirm: function (values) {\n\t\t\t\t\tamount = values.amount;\n\t\t\t\t\tstroke = values.stroke;\n\t\t\t\t\trel_to_original = values.rel_to_original;\n\t\t\t\t\tthis.hide();\n\t\t\t\t},\n\t\t\t});\n\t\t\tbutton = new Action(\"randomize_brush\", {\n\t\t\t\tname: \"Randomize Brush\",\n\t\t\t\ticon: \"shuffle\",\n\t\t\t\tid: \"randomize_brush\",\n\t\t\t\tdescription: \"Randomizes the brush color\",\n\t\t\t\tclick: function () {\n\t\t\t\t\trandomize_color();\n\t\t\t\t},\n\t\t\t});\n\t\t\toptions = new Action(\"randomize_brush_options\", {\n\t\t\t\tname: \"Randomize Brush Options\",\n\t\t\t\ticon: \"settings\",\n\t\t\t\tid: \"randomize_brush_options\",\n\t\t\t\tdescription: \"Opens Brush Randomizer options\",\n\t\t\t\tclick: function () {\n\t\t\t\t\toptions_dialog.show();\n\t\t\t\t},\n\t\t\t});\n\t\t\ttoggle_stroke = new Action(\"toggle_randomize_brush_stroke\", {\n\t\t\t\tname: \"Toggle Random Brush Stroke\",\n\t\t\t\ticon: \"toggle_off\",\n\t\t\t\tdescription: \"Toggles randomizing the brush stroke\",\n\t\t\t\tclick: function () {\n\t\t\t\t\tstroke = !stroke;\n\t\t\t\t\tBlockbench.showToastNotification({\n\t\t\t\t\t\ttext: stroke\n\t\t\t\t\t\t\t? \"Toggled randomizing brush stroke on\"\n\t\t\t\t\t\t\t: \"Toggled randomizing brush stroke off\",\n\t\t\t\t\t\texpire: 5000,\n\t\t\t\t\t\ticon: \"info\",\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t\tMenuBar.addAction(toggle_stroke, \"filter\");\n\t\t\tMenuBar.addAction(button, \"filter\");\n\t\t\tMenuBar.addAction(options, \"filter\");\n\t\t\t$(\".preview\").on(\"click\", function (e) {\n\t\t\t\t// if the alt button is pressed, we don't want to randomize the color, instead set it to the original color\n\t\t\t\tif (e.altKey) {\n\t\t\t\t\toriginal_color = ColorPanel.get();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (stroke) {\n\t\t\t\t\trandomize_color();\n\t\t\t\t}\n\t\t\t});\n\t\t\t$(\".sp-val\").on(\"click\", (e) => {\n\t\t\t\toriginal_color = ColorPanel.get();\n\t\t\t});\n\n\t\t\tfunction randomize_color() {\n\t\t\t\tif (original_color == null) {\n\t\t\t\t\toriginal_color = ColorPanel.get();\n\t\t\t\t\tBlockbench.showToastNotification({\n\t\t\t\t\t\ttext: \"Original color was 0, using current\",\n\t\t\t\t\t\texpire: 5000,\n\t\t\t\t\t\ticon: \"info\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvar curr_color = original_color;\n\t\t\t\tvar new_color = LightenDarkenColor(\n\t\t\t\t\tcurr_color,\n\t\t\t\t\tgetRandomArbitrary(amount * -1, amount)\n\t\t\t\t);\n\t\t\t\tColorPanel.set(new_color);\n\t\t\t}\n\t\t},\n\t\tonunload() {\n\t\t\tbutton.delete();\n\t\t\toptions.delete();\n\t\t\ttoggle_stroke.delete();\n\t\t\t$(\".preview\").off(\"click\");\n\t\t\t$(\".sp-val\").off(\"click\");\n\t\t},\n\t});\n})();\n\nfunction LightenDarkenColor(col, percent) {\n\tvar num = parseInt(col.replace(\"#\", \"\"), 16),\n\t\tamt = Math.round(2.55 * percent),\n\t\tR = (num >> 16) + amt,\n\t\tB = ((num >> 8) & 0x00ff) + amt,\n\t\tG = (num & 0x0000ff) + amt;\n\treturn (\n\t\t\"#\" +\n\t\t(\n\t\t\t0x1000000 +\n\t\t\t(R < 255 ? (R < 1 ? 0 : R) : 255) * 0x10000 +\n\t\t\t(B < 255 ? (B < 1 ? 0 : B) : 255) * 0x100 +\n\t\t\t(G < 255 ? (G < 1 ? 0 : G) : 255)\n\t\t)\n\t\t\t.toString(16)\n\t\t\t.slice(1)\n\t);\n}\n\nfunction getRandomArbitrary(min, max) {\n\treturn Math.random() * (max - min) + min;\n}\n"
  },
  {
    "path": "plugins/brush_tuna/about.md",
    "content": "<div><h2>About Brush Tuna</h2> <p>Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several\n\t\tnew features.</p> <h3>Features</h3> <ul><li>Per-preset pen pressure configuration</li> <li>Customizable pen pressure curves</li> <li>Keybinds for quickly switching between presets using <code>[</code> and <code>]</code></li> <li>Improved preset list in Brush Presets menu</li></ul></div> <img src=\"data:image/png;base64,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\" alt=\"\"/>"
  },
  {
    "path": "plugins/brush_tuna/brush_tuna.js",
    "content": "\n//?? ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────╮\n//?? │                                           [ brush_tuna v1.0.6 ]                                           │\n//?? │                                                                                                           │\n//?? │ Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features. │\n//?? │                                                                                                           │\n//?? │                                   Created by SnaveSutit & Embody Games                                    │\n//?? │                          (snavesutit@gmail.com) [https://snavesutit.github.io/]                           │\n//?? │                                                                                                           │\n//?? │                                                [ SOURCE ]                                                 │\n//?? │                                 https://github.com/SnaveSutit/brush-tuna                                  │\n//?? │                                                                                                           │\n//?? │                                                [ LICENSE ]                                                │\n//?? │                                                MIT License                                                │\n//?? │                                                                                                           │\n//?? │                                       Copyright (c) 2022 SnaveSutit                                       │\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//?? │                                                                                                           │\n//?? ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n\"use strict\";(()=>{var af=Object.create;var Ln=Object.defineProperty;var lf=Object.getOwnPropertyDescriptor;var cf=Object.getOwnPropertyNames;var uf=Object.getPrototypeOf,ff=Object.prototype.hasOwnProperty;var df=(e,t,r)=>t in e?Ln(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var i=(e,t)=>Ln(e,\"name\",{value:t,configurable:!0});var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var Wt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),pf=(e,t)=>{for(var r in t)Ln(e,r,{get:t[r],enumerable:!0})},Va=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let o of cf(t))!ff.call(e,o)&&o!==r&&Ln(e,o,{get:()=>t[o],enumerable:!(n=lf(t,o))||n.enumerable});return e};var gs=(e,t,r)=>(r=e!=null?af(uf(e)):{},Va(t||!e||!e.__esModule?Ln(r,\"default\",{value:e,enumerable:!0}):r,e)),Ha=e=>Va(Ln({},\"__esModule\",{value:!0}),e);var ai=(e,t,r)=>(df(e,typeof t!=\"symbol\"?t+\"\":t,r),r),bs=(e,t,r)=>{if(!t.has(e))throw TypeError(\"Cannot \"+r)};var Tr=(e,t,r)=>(bs(e,t,\"read from private field\"),r?r.call(e):t.get(e)),fo=(e,t,r)=>{if(t.has(e))throw TypeError(\"Cannot add the same private member more than once\");t instanceof WeakSet?t.add(e):t.set(e,r)},$s=(e,t,r,n)=>(bs(e,t,\"write to private field\"),n?n.call(e,r):t.set(e,r),r);var za=(e,t,r)=>(bs(e,t,\"access private method\"),r);var c=w(()=>{\"use strict\"});var ys=Wt(Ft=>{\"use strict\";c();Object.defineProperty(Ft,\"__esModule\",{value:!0});Ft.prettyWarn=Ft.prettyError=Ft.prettyGroup=Ft.prettyGroupCollapsed=Ft.prettyLog=void 0;var _f=\"%c[%cBlockbench Patch Manager%c]%c \",hf=[\"color: #aaaaaa\",\"color: #00aced;\",\"color: #aaaaaa\",\"color: white\"];function po(e){return(t,r=!0)=>{let n=(r?_f:\"\")+\"%c\"+Object.keys(t).join(\"%c\"),o=[...r?hf:[],...Object.values(t)];e(n,...o)}}i(po,\"prettyLogFactory\");Ft.prettyLog=po(console.log);Ft.prettyGroupCollapsed=po(console.groupCollapsed);Ft.prettyGroup=po(console.group);Ft.prettyError=po(console.error);Ft.prettyWarn=po(console.warn)});var xs=Wt(Fn=>{\"use strict\";c();Object.defineProperty(Fn,\"__esModule\",{value:!0});Fn.ERROR_MESSAGE=void 0;Fn.subscribable=Ua;var _o;(function(e){e.RecursivePublish=\"Subscribable callbacks cannot publish to the same subscribable, ignoring nested publish.\",e.InvalidCount=\"Count must be a positive number.\",e.NonIntegerCount=\"Count must be an integer.\"})(_o||(Fn.ERROR_MESSAGE=_o={}));function Ua(){let e=new Set,t=!1,r=i((l,f=!1)=>{let _={callback:l,once:f};return e.add(_),()=>e.delete(_)},\"subscribe\");return{subscribe:r,subscribeOnce:l=>r(l,!0),publish:i(l=>{if(t)throw new Error(_o.RecursivePublish);t=!0;try{for(let f of e)f.callback(l),f.once&&e.delete(f)}finally{t=!1}},\"publish\"),unsubscribe:i((l,f=1/0)=>{if(f<=0)throw new Error(_o.InvalidCount);if(Number.isFinite(f)&&!Number.isInteger(f))throw new Error(_o.NonIntegerCount);let _=0;for(let p of e)if(p.callback===l&&(e.delete(p),++_>=f))return!0;return _>0},\"unsubscribe\"),unsubscribeAll:()=>e.clear(),has:i(l=>{for(let f of e)if(f.callback===l)return!0;return!1},\"has\"),count:i(l=>{let f=0;for(let _ of e)_.callback===l&&f++;return f},\"count\"),get subscriberCount(){return e.size}}}i(Ua,\"subscribable\");Fn.default=Ua});var Ga=Wt(Yn=>{\"use strict\";c();Object.defineProperty(Yn,\"__esModule\",{value:!0});Yn.PatchRevertError=Yn.PatchApplyError=void 0;var li=class extends Error{constructor(t,r){super(`'${t}' failed to apply: ${r.message}`+(r.stack?`\n`+r.stack:\"\"))}};i(li,\"PatchApplyError\");Yn.PatchApplyError=li;var ci=class extends Error{constructor(t,r){super(`'${t}' failed to revert: ${r.message}`+(r.stack?`\n`+r.stack:\"\"))}};i(ci,\"PatchRevertError\");Yn.PatchRevertError=ci});var ws=Wt(kr=>{\"use strict\";c();var vf=kr&&kr.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(kr,\"__esModule\",{value:!0});kr.registerPatch=ho;kr.registerProjectPatch=mf;kr.registerPluginPatch=gf;kr.registerDeletableHandlerPatch=bf;kr.registerPropertyOverridePatch=$f;Es();var Xa=vf(xs()),Ka=Ga(),jn=ys();function ho(e){if(!BlockbenchPatchManager.validatePatchId(e.id))throw new Error(`Failed to register patch with invalid ID '${e.id}'. See previous warnings for more details.`);let t,r=!1,n={id:e.id,dependencies:e.dependencies,priority:e.priority??0,enabled:!0,isApplied(){return r},apply(){if(this.enabled){(0,jn.prettyLog)({\"Applying \":\"color: #55ff55;\",[e.id]:\"color: #ffff55;\"});try{if(r)throw new Error(`Attempted to apply '${e.id}' while it was already applied.`);t=e.apply(),r=!0}catch(o){throw new Ka.PatchApplyError(e.id,o)}}},revert(){if(!(!this.enabled&&!r)){(0,jn.prettyLog)({\"Reverting \":\"color: #ff5555;\",[e.id]:\"color: #ffff55;\"});try{if(!r)throw new Error(`Attempted to revert '${e.id}' before it was applied.`);e.revert(t),r=!1}catch(o){throw new Ka.PatchRevertError(e.id,o)}}}};return BlockbenchPatchManager.addPatch(n),n}i(ho,\"registerPatch\");function mf(e){let t=null,r;e.alwaysRevertOnProjectChange??=!1;let n=!1,o=i(a=>{n||Condition(e.condition,{project:a})&&((0,jn.prettyLog)({\"Applying project patch \":\"color: #55ff55;\",[e.id]:\"color: #ffff55;\"}),t=e.apply(),n=!0)},\"onPreSelectProject\"),s=i(()=>{n&&((0,jn.prettyLog)({\"Reverting project patch \":\"color: #ff5555;\",[e.id]:\"color: #ffff55;\"}),e.revert(t),t=null,n=!1)},\"onUnselectProject\");return r=ho({...e,apply:()=>{Blockbench.on(\"blockbench-patch-manager:pre_select_project\",o),Blockbench.on(\"unselect_project\",s)},revert:()=>{Blockbench.removeListener(\"blockbench-patch-manager:pre_select_project\",o),Blockbench.removeListener(\"unselect_project\",s)}}),r}i(mf,\"registerProjectPatch\");function gf(e){let t,r=i(({plugin:o})=>{Condition(e.condition,o)&&((0,jn.prettyLog)({\"Applying plugin patch \":\"color: #55ff55;\",[e.id]:\"color: #ffff55;\"}),t=e.apply())},\"onLoadedPlugin\"),n=i(()=>{t!==void 0&&((0,jn.prettyLog)({\"Reverting plugin patch \":\"color: #ff5555;\",[e.id]:\"color: #ffff55;\"}),e.revert(t),t=void 0)},\"onUnloadedPlugin\");return ho({...e,apply:()=>{Blockbench.on(\"loaded_plugin\",r),Blockbench.on(\"unloaded_plugin\",n)},revert:()=>{Blockbench.removeListener(\"loaded_plugin\",r),Blockbench.removeListener(\"unloaded_plugin\",n)}})}i(gf,\"registerPluginPatch\");function bf(e){let t=null,r=(0,Xa.default)(),n=(0,Xa.default)(),o={get:()=>t,onCreated:r.subscribe,onDeleted:n.subscribe};return ho({...e,apply:()=>(t=e.create(),r.publish(t),t),revert:s=>{s.delete(),t=null,n.publish(s)}}),o}i(bf,\"registerDeletableHandlerPatch\");function $f(e){if(!e.get&&!e.set)throw new Error(\"At least one of 'get' or 'set' must be provided in a PropertyOverridePatch.\");ho({...e,apply:()=>{if(e.target==null)throw new Error(\"Cannot override property on undefined object.\");let t;try{t=e.target[e.key]}catch{throw new Error(`Failed to get initial value of property '${String(e.key)}' for PropertyOverridePatch ${String(e.id)}.`)}let r=Object.getOwnPropertyDescriptor(e.target,e.key)??{value:t,writable:!0,configurable:!0};if(r.configurable===!1)throw new Error(`Cannot override property '${String(e.key)}' on object because it is not configurable.`);let n={configurable:!0,enumerable:r.enumerable};if(e.get){let o;e.condition&&e.getCondition?o=i(s=>Condition(e.condition,s)&&Condition(e.getCondition,s),\"getCondition\"):o=e.getCondition??e.condition,o?n.get=function(){return Condition(o,{target:this,value:t})?e.get.call(this,t):t}:n.get=function(){return e.get.call(this,t)}}if(e.set){let o;e.condition&&e.setCondition?o=i(s=>Condition(e.condition,s)&&Condition(e.setCondition,s),\"setCondition\"):o=e.setCondition??e.condition,o?n.set=function(s){Condition(o,{target:this,value:s})?t=e.set.call(this,s):t=s}:n.set=function(s){t=e.set.call(this,s)}}return Object.defineProperty(e.target,e.key,n),{originalDescriptor:r}},revert:({originalDescriptor:t})=>{Object.defineProperty(e.target,e.key,t)}})}i($f,\"registerPropertyOverridePatch\")});var Wa=Wt((Rp,yf)=>{yf.exports={name:\"blockbench-patch-manager\",version:\"1.1.0\",author:{name:\"SnaveSutit\",email:\"snavesutit@gmail.com\",url:\"https://snavesutit.github.io\"},repository:{type:\"git\",url:\"git+https://github.com/SnaveSutit/blockbench-patch-manager.git\"},files:[\"dist\"],main:\"./dist/index.js\",types:\"./dist/index.d.ts\",scripts:{build:\"tsc\",dev:\"tsc --watch\",prepublishOnly:\"bun run build\"},exports:{\".\":{default:\"./dist/index.js\",types:\"./dist/index.d.ts\"}},peerDependencies:{typescript:\"^5\"},dependencies:{\"blockbench-types\":\"^5.1.0-beta.1\",\"simple-subpub\":\"^1.2.0\",svelte:\"^5.46.3\",\"svelte-observable-store\":\"^1.0.1\",\"svelte-preprocess\":\"^6.0.3\",\"svelte-preprocess-esbuild\":\"^3.0.1\"},devDependencies:{\"@types/node\":\"^25.0.8\",esbuild:\"^0.27.2\",\"eslint-plugin-check-file\":\"^3.3.1\",\"eslint-plugin-svelte\":\"^3.14.0\",jiti:\"^2.6.1\",\"svelte-eslint-parser\":\"^1.4.1\",typescript:\"^5.9.3\",\"typescript-eslint\":\"^8.53.0\"}}});var Es=Wt(ui=>{\"use strict\";c();var xf=ui&&ui.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(ui,\"__esModule\",{value:!0});var Qt=ys(),wf=ws(),Qa=xf(Wa()),Ts=class{version=Qa.default.version;registered=new Map;installOrder=[];static upgrade(t){t.delete();let r=new Ts;r.installOrder=[...t.installOrder];for(let[n,o]of t.registered)r.registered.set(n,o);return r}constructor(){Blockbench.addListener(\"loaded_plugin\",this.onLoadedPlugin),Blockbench.addListener(\"unloaded_plugin\",this.onUnloadedPlugin),window.BlockbenchPatchManager=this,(0,wf.registerPropertyOverridePatch)({id:\"blockbench-patch-manager:event-hook/pre-select-project\",priority:-1/0,target:ModelProject.prototype,key:\"loadEditorState\",get(t){return function(){return Blockbench.dispatchEvent(\"blockbench-patch-manager:pre_select_project\",this),t.apply(this)}}})}delete(){Blockbench.removeListener(\"loaded_plugin\",this.onLoadedPlugin),Blockbench.removeListener(\"unloaded_plugin\",this.onUnloadedPlugin);let t=this.registered.get(\"blockbench-patch-manager:event-hook/pre-select-project\");t?(t.revert(),this.registered.delete(t.id)):(0,Qt.prettyWarn)({[\"Failed to find event hook patch when deleting PatchManager. This may cause issues if the plugin is reloaded without restarting Blockbench.\"]:\"color: #ff5555;\"})}onLoadedPlugin=({plugin:t})=>{(0,Qt.prettyLog)({[`Plugin '${t.name}' loaded, enabling its patches...`]:\"\"}),this.setPluginPatchesEnabled(t,!0),this.updatePatches()};onUnloadedPlugin=({plugin:t})=>{(0,Qt.prettyLog)({[`Plugin '${t.name}' unloaded, disabling its patches...`]:\"\"}),this.setPluginPatchesEnabled(t,!1),this.updatePatches()};addPatch(t){this.registered.has(t.id)&&((0,Qt.prettyWarn)({[`A Patch with the ID '${t.id}' is already registered! The old patch will be overwritten.`]:\"color: #ff5555;\"}),this.removePatch(t.id)),this.registered.set(t.id,t),this.installOrder.push(t.id),this.updatePatchApplicationOrder()}removePatch(t){let r=this.registered.get(t);if(!r){(0,Qt.prettyWarn)({[`Attempted to remove unknown patch '${t}'!`]:\"color: #ff5555;\"});return}if(r.isApplied())throw new Error(`Attempted to remove patch '${t}' while it is still applied! This indicates a patch has been improperly managed by a plugin developer.`);this.registered.delete(t);let n=this.installOrder.indexOf(t);n!==-1&&this.installOrder.splice(n,1)}checkPatchDependencies(t){if(t.dependencies===void 0)return!0;for(let r of t.dependencies){let n=this.registered.get(r);if(!n)return(0,Qt.prettyWarn)({[`Patch '${t.id}' depends on unknown patch '${r}'.`]:\"\"}),!1;if(!n.isApplied())throw new Error(`Patch '${t.id}' depends on patch '${r}', but it is not applied. This is a bug!`)}return!0}updatePatches(){(0,Qt.prettyGroupCollapsed)({\"Updating Patches...\":\"color: #aaaaaa;\"});try{(0,Qt.prettyLog)({\"Reverting patches...\":\"color: #ff5555; font-weight: bold;\"});for(let t of this.installOrder.slice().reverse()){let r=this.registered.get(t);r.isApplied()&&r.revert()}(0,Qt.prettyLog)({\"Applying enabled patches...\":\"color: #55ff55; font-weight: bold;\"});for(let t of this.installOrder){let r=this.registered.get(t);if(!r.isApplied()&&r.enabled){if(!this.checkPatchDependencies(r)){(0,Qt.prettyWarn)({[`Skipping patch '${r.id}' due to missing dependencies.`]:\"\"});continue}r.apply()}}}catch(t){throw console.groupEnd(),t}console.groupEnd()}getPatchOwner(t){let[r]=t.split(\":\");return Plugins.registered[r]}validatePatchId(t){let[r]=t.split(\":\");return r===\"blockbench-patch-manager\"||Plugins.registered[r]?!0:((0,Qt.prettyError)({[`Patch '${t}' depends on an unknown plugin '${r}' which is not installed.`]:\"\"}),!1)}setPluginPatchesEnabled(t,r){for(let n of this.registered.values())this.getPatchOwner(n.id)?.id===t.id&&(n.enabled=r)}updatePatchApplicationOrder(){this.installOrder.sort((t,r)=>{let n=this.registered.get(t);return this.registered.get(r).priority-n.priority});for(let t of this.installOrder){let r=this.registered.get(t);if(r.dependencies!==void 0)for(let n of r.dependencies){let o=this.installOrder.indexOf(n);if(o===-1)throw new Error(`Patch '${t}' depends on unknown patch '${n}'`);let s=this.installOrder.indexOf(t);o>s&&(this.installOrder.splice(o,1),this.installOrder.splice(s,0,n))}}}},qr=Ts;i(qr,\"PatchManager\"),ai(qr,\"latestVersion\",Qa.default.version);window.BlockbenchPatchManager==null?new qr:VersionUtil.compare(window.BlockbenchPatchManager.version,\"<\",qr.latestVersion)&&(console.warn(`A newer version of Blockbench Patch Mangager (${qr.latestVersion}) is installed alongside an old version ${window.BlockbenchPatchManager.version}. Attempting to upgrade the old version...`),qr.upgrade(window.BlockbenchPatchManager))});var Ja=Wt(ks=>{\"use strict\";c();Object.defineProperty(ks,\"__esModule\",{value:!0});ks.overrideAccessors=Ef;var Za=xs(),vo=Symbol(\"accessors\");function Ef(e){let{target:t,key:r,get:n,set:o,restoreOriginalValue:s=!1}=e;if(n==null&&o==null)throw new TypeError(\"At least one of get or set callbacks must be provided\");if(t==null)throw new TypeError(\"Target is undefined\");let a=t[r],l=Object.getOwnPropertyDescriptor(t,r)??{value:a,writable:!0,configurable:!0};if(l.configurable===!1)throw new Error(`Cannot redefine property: ${String(r)} as it is not configurable`);let f=i(()=>{t[vo]??=new Map;let x={onGet:(0,Za.subscribable)(),onSet:(0,Za.subscribable)()};return t[vo].set(r,x),x},\"createEntry\"),{onGet:_,onSet:p}=t[vo]?.get(r)??f(),v=t[r],d,b=v;n&&(d=_.subscribe(x=>{b=n.call(t,b,x)}));let y,m=v;o&&(y=p.subscribe(x=>{m=o.call(t,m,x)}));let h={configurable:!0,enumerable:l.enumerable,get(){return b=v,_.publish(v),b},set(x){m=x,p.publish(x),v=m}};try{Object.defineProperty(t,r,h)}catch(x){throw new Error(`Failed to override property: ${String(r)}. ${x instanceof Error?x.message:String(x)}`)}return()=>{d?.(),y?.();try{Object.defineProperty(t,r,l)}catch(C){throw new Error(`Failed to restore original property: ${String(r)}. ${C instanceof Error?C.message:String(C)}`)}s&&(t[r]=a);let x=t[vo];if(x){let C=x.get(r);C?.onGet.subscriberCount===0&&C.onSet.subscriberCount===0&&(x.delete(r),x.size===0&&delete t[vo])}}}i(Ef,\"overrideAccessors\")});var As=Wt(Vr=>{\"use strict\";c();var Tf=Vr&&Vr.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||(\"get\"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),el=Vr&&Vr.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Tf(t,e,r)};Object.defineProperty(Vr,\"__esModule\",{value:!0});Es();el(ws(),Vr);el(Ja(),Vr)});var dl=w(()=>{c()});var pl,$,_l=w(()=>{c();pl=globalThis.process?.env?.NODE_ENV,$=pl&&!pl.toLowerCase().startsWith(\"prod\")});var hl=w(()=>{c()});var J=w(()=>{c();dl();_l();hl()});function hi(e){for(var t=0;t<e.length;t++)e[t]()}function vi(){var e,t,r=new Promise((n,o)=>{e=n,t=o});return{promise:r,resolve:e,reject:t}}function Rs(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let r=[];for(let n of e)if(r.push(n),r.length===t)break;return r}var _r,vl,Jt,qn,Ps,tt,xt,_i,Ns,ml,cn,Os,Re,ee=w(()=>{c();_r=Array.isArray,vl=Array.prototype.indexOf,Jt=Array.prototype.includes,qn=Array.from,Ps=Object.keys,tt=Object.defineProperty,xt=Object.getOwnPropertyDescriptor,_i=Object.getOwnPropertyDescriptors,Ns=Object.prototype,ml=Array.prototype,cn=Object.getPrototypeOf,Os=Object.isExtensible,Re=i(()=>{},\"noop\");i(hi,\"run_all\");i(vi,\"deferred\");i(Rs,\"to_array\")});var Ie,go,gl,mi,Is,Ot,Ds,gi,Vn,Yt,X=w(()=>{c();Ie=Symbol(\"$state\"),go=Symbol(\"legacy props\"),gl=Symbol(\"\"),mi=Symbol(\"proxy path\"),Is=Symbol(\"hmr anchor\"),Ot=new(i(class extends Error{name=\"StaleReactionError\";message=\"The reaction that called `getAbortSignal()` was re-run or destroyed\"},\"StaleReactionError\")),Ds=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(\"xml\"),gi=1,Vn=3,Yt=8});function bi(e){if($){let t=new Error(`experimental_async_required\nCannot use \\`${e}(...)\\` unless the \\`experimental.async\\` compiler option is \\`true\\`\nhttps://svelte.dev/e/experimental_async_required`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/experimental_async_required\")}function bl(e){if($){let t=new Error(`invariant_violation\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app \\u2014 please open an issue at https://github.com/sveltejs/svelte, citing the following message: \"${e}\"\nhttps://svelte.dev/e/invariant_violation`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/invariant_violation\")}function Cr(e){if($){let t=new Error(`lifecycle_outside_component\n\\`${e}(...)\\` can only be used during component initialisation\nhttps://svelte.dev/e/lifecycle_outside_component`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/lifecycle_outside_component\")}function $l(){if($){let e=new Error(`missing_context\nContext was not set in a parent component\nhttps://svelte.dev/e/missing_context`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/missing_context\")}var bo=w(()=>{c();J();i(bi,\"experimental_async_required\");i(bl,\"invariant_violation\");i(Cr,\"lifecycle_outside_component\");i($l,\"missing_context\")});function xl(){if($){let e=new Error(\"async_derived_orphan\\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\\nhttps://svelte.dev/e/async_derived_orphan\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/async_derived_orphan\")}function Ms(){if($){let e=new Error(\"bind_invalid_checkbox_value\\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\\nhttps://svelte.dev/e/bind_invalid_checkbox_value\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/bind_invalid_checkbox_value\")}function wl(){if($){let e=new Error(`derived_references_self\nA derived value cannot reference itself recursively\nhttps://svelte.dev/e/derived_references_self`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/derived_references_self\")}function Bs(e,t,r){if($){let n=new Error(`each_key_duplicate\n${r?`Keyed each block has duplicate key \\`${r}\\` at indexes ${e} and ${t}`:`Keyed each block has duplicate key at indexes ${e} and ${t}`}\nhttps://svelte.dev/e/each_key_duplicate`);throw n.name=\"Svelte error\",n}else throw new Error(\"https://svelte.dev/e/each_key_duplicate\")}function El(e,t,r){if($){let n=new Error(`each_key_volatile\nKeyed each block has key that is not idempotent \\u2014 the key for item at index ${e} was \\`${t}\\` but is now \\`${r}\\`. Keys must be the same each time for a given item\nhttps://svelte.dev/e/each_key_volatile`);throw n.name=\"Svelte error\",n}else throw new Error(\"https://svelte.dev/e/each_key_volatile\")}function Tl(e){if($){let t=new Error(`effect_in_teardown\n\\`${e}\\` cannot be used inside an effect cleanup function\nhttps://svelte.dev/e/effect_in_teardown`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/effect_in_teardown\")}function kl(){if($){let e=new Error(\"effect_in_unowned_derived\\nEffect cannot be created inside a `$derived` value that was not itself created inside an effect\\nhttps://svelte.dev/e/effect_in_unowned_derived\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/effect_in_unowned_derived\")}function Al(e){if($){let t=new Error(`effect_orphan\n\\`${e}\\` can only be used inside an effect (e.g. during component initialisation)\nhttps://svelte.dev/e/effect_orphan`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/effect_orphan\")}function Cl(){if($){let e=new Error(`effect_update_depth_exceeded\nMaximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state\nhttps://svelte.dev/e/effect_update_depth_exceeded`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/effect_update_depth_exceeded\")}function Sl(){if($){let e=new Error(`fork_discarded\nCannot commit a fork that was already discarded\nhttps://svelte.dev/e/fork_discarded`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/fork_discarded\")}function Pl(){if($){let e=new Error(`fork_timing\nCannot create a fork inside an effect or when state changes are pending\nhttps://svelte.dev/e/fork_timing`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/fork_timing\")}function Nl(){if($){let e=new Error(\"get_abort_signal_outside_reaction\\n`getAbortSignal()` can only be called inside an effect or derived\\nhttps://svelte.dev/e/get_abort_signal_outside_reaction\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/get_abort_signal_outside_reaction\")}function Ol(e){if($){let t=new Error(`hydratable_missing_but_required\nExpected to find a hydratable with key \\`${e}\\` during hydration, but did not.\nhttps://svelte.dev/e/hydratable_missing_but_required`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/hydratable_missing_but_required\")}function Rl(){if($){let e=new Error(`hydration_failed\nFailed to hydrate the application\nhttps://svelte.dev/e/hydration_failed`);throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/hydration_failed\")}function Il(){if($){let e=new Error(\"invalid_snippet\\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\\nhttps://svelte.dev/e/invalid_snippet\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/invalid_snippet\")}function Ls(e){if($){let t=new Error(`lifecycle_legacy_only\n\\`${e}(...)\\` cannot be used in runes mode\nhttps://svelte.dev/e/lifecycle_legacy_only`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/lifecycle_legacy_only\")}function Dl(e){if($){let t=new Error(`props_invalid_value\nCannot do \\`bind:${e}={undefined}\\` when \\`${e}\\` has a fallback value\nhttps://svelte.dev/e/props_invalid_value`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/props_invalid_value\")}function Ml(e){if($){let t=new Error(`rune_outside_svelte\nThe \\`${e}\\` rune is only available inside \\`.svelte\\` and \\`.svelte.js/ts\\` files\nhttps://svelte.dev/e/rune_outside_svelte`);throw t.name=\"Svelte error\",t}else throw new Error(\"https://svelte.dev/e/rune_outside_svelte\")}function Bl(){if($){let e=new Error(\"set_context_after_init\\n`setContext` must be called when a component first initializes, not in a subsequent effect or after an `await` expression\\nhttps://svelte.dev/e/set_context_after_init\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/set_context_after_init\")}function Ll(){if($){let e=new Error(\"state_descriptors_fixed\\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\\nhttps://svelte.dev/e/state_descriptors_fixed\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/state_descriptors_fixed\")}function Fl(){if($){let e=new Error(\"state_prototype_fixed\\nCannot set prototype of `$state` object\\nhttps://svelte.dev/e/state_prototype_fixed\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/state_prototype_fixed\")}function Yl(){if($){let e=new Error(\"state_unsafe_mutation\\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\\nhttps://svelte.dev/e/state_unsafe_mutation\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/state_unsafe_mutation\")}function jl(){if($){let e=new Error(\"svelte_boundary_reset_onerror\\nA `<svelte:boundary>` `reset` function cannot be called while an error is still being handled\\nhttps://svelte.dev/e/svelte_boundary_reset_onerror\");throw e.name=\"Svelte error\",e}else throw new Error(\"https://svelte.dev/e/svelte_boundary_reset_onerror\")}var Ge=w(()=>{c();J();bo();i(xl,\"async_derived_orphan\");i(Ms,\"bind_invalid_checkbox_value\");i(wl,\"derived_references_self\");i(Bs,\"each_key_duplicate\");i(El,\"each_key_volatile\");i(Tl,\"effect_in_teardown\");i(kl,\"effect_in_unowned_derived\");i(Al,\"effect_orphan\");i(Cl,\"effect_update_depth_exceeded\");i(Sl,\"fork_discarded\");i(Pl,\"fork_timing\");i(Nl,\"get_abort_signal_outside_reaction\");i(Ol,\"hydratable_missing_but_required\");i(Rl,\"hydration_failed\");i(Il,\"invalid_snippet\");i(Ls,\"lifecycle_legacy_only\");i(Dl,\"props_invalid_value\");i(Ml,\"rune_outside_svelte\");i(Bl,\"set_context_after_init\");i(Ll,\"state_descriptors_fixed\");i(Fl,\"state_prototype_fixed\");i(Yl,\"state_unsafe_mutation\");i(jl,\"svelte_boundary_reset_onerror\")});var Hn,un,Fs,fn,Sr,me,jt,ql,$i,re=w(()=>{c();Hn=\"[\",un=\"[!\",Fs=\"[?\",fn=\"]\",Sr={},me=Symbol(),jt=Symbol(\"filename\"),ql=Symbol(\"hmr\"),$i=\"http://www.w3.org/1999/xhtml\"});function Vl(e){$?console.warn(`%c[svelte] await_reactivity_loss\n%cDetected reactivity loss when reading \\`${e}\\`. This happens when state is read in an async function after an earlier \\`await\\`\nhttps://svelte.dev/e/await_reactivity_loss`,er,tr):console.warn(\"https://svelte.dev/e/await_reactivity_loss\")}function Hl(e,t){$?console.warn(`%c[svelte] await_waterfall\n%cAn async derived, \\`${e}\\` (${t}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\nhttps://svelte.dev/e/await_waterfall`,er,tr):console.warn(\"https://svelte.dev/e/await_waterfall\")}function zl(){$?console.warn(`%c[svelte] derived_inert\n%cReading a derived belonging to a now-destroyed effect may result in stale values\nhttps://svelte.dev/e/derived_inert`,er,tr):console.warn(\"https://svelte.dev/e/derived_inert\")}function Ul(e){$?console.warn(`%c[svelte] hydratable_missing_but_expected\n%cExpected to find a hydratable with key \\`${e}\\` during hydration, but did not.\nhttps://svelte.dev/e/hydratable_missing_but_expected`,er,tr):console.warn(\"https://svelte.dev/e/hydratable_missing_but_expected\")}function Gl(e,t,r){$?console.warn(`%c[svelte] hydration_attribute_changed\n%cThe \\`${e}\\` attribute on \\`${t}\\` changed its value between server and client renders. The client value, \\`${r}\\`, will be ignored in favour of the server value\nhttps://svelte.dev/e/hydration_attribute_changed`,er,tr):console.warn(\"https://svelte.dev/e/hydration_attribute_changed\")}function dn(e){$?console.warn(`%c[svelte] hydration_mismatch\n%c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:\"Hydration failed because the initial UI does not match what was rendered on the server\"}\nhttps://svelte.dev/e/hydration_mismatch`,er,tr):console.warn(\"https://svelte.dev/e/hydration_mismatch\")}function Xl(){$?console.warn(\"%c[svelte] invalid_raw_snippet_render\\n%cThe `render` function passed to `createRawSnippet` should return HTML for a single element\\nhttps://svelte.dev/e/invalid_raw_snippet_render\",er,tr):console.warn(\"https://svelte.dev/e/invalid_raw_snippet_render\")}function Kl(){$?console.warn(`%c[svelte] lifecycle_double_unmount\n%cTried to unmount a component that was not mounted\nhttps://svelte.dev/e/lifecycle_double_unmount`,er,tr):console.warn(\"https://svelte.dev/e/lifecycle_double_unmount\")}function yi(e){$?console.warn(`%c[svelte] state_proxy_equality_mismatch\n%cReactive \\`$state(...)\\` proxies and the values they proxy have different identities. Because of this, comparisons with \\`${e}\\` will produce unexpected results\nhttps://svelte.dev/e/state_proxy_equality_mismatch`,er,tr):console.warn(\"https://svelte.dev/e/state_proxy_equality_mismatch\")}function Wl(){$?console.warn(`%c[svelte] state_proxy_unmount\n%cTried to unmount a state proxy, rather than a component\nhttps://svelte.dev/e/state_proxy_unmount`,er,tr):console.warn(\"https://svelte.dev/e/state_proxy_unmount\")}function Ql(){$?console.warn(\"%c[svelte] svelte_boundary_reset_noop\\n%cA `<svelte:boundary>` `reset` function only resets the boundary the first time it is called\\nhttps://svelte.dev/e/svelte_boundary_reset_noop\",er,tr):console.warn(\"https://svelte.dev/e/svelte_boundary_reset_noop\")}var er,tr,Xe=w(()=>{c();J();er=\"font-weight: bold\",tr=\"font-weight: normal\";i(Vl,\"await_reactivity_loss\");i(Hl,\"await_waterfall\");i(zl,\"derived_inert\");i(Ul,\"hydratable_missing_but_expected\");i(Gl,\"hydration_attribute_changed\");i(dn,\"hydration_mismatch\");i(Xl,\"invalid_raw_snippet_render\");i(Kl,\"lifecycle_double_unmount\");i(yi,\"state_proxy_equality_mismatch\");i(Wl,\"state_proxy_unmount\");i(Ql,\"svelte_boundary_reset_noop\")});function De(e){P=e}function pe(e){if(e===null)throw dn(),Sr;return Y=e}function Ke(){return pe(We(Y))}function F(e){if(P){if(We(Y)!==null)throw dn(),Sr;Y=e}}function $o(e=1){if(P){for(var t=e,r=Y;t--;)r=We(r);Y=r}}function hr(e=!0){for(var t=0,r=Y;;){if(r.nodeType===Yt){var n=r.data;if(n===fn){if(t===0)return r;t-=1}else(n===Hn||n===un||n[0]===\"[\"&&!isNaN(Number(n.slice(1))))&&(t+=1)}var o=We(r);e&&r.remove(),r=o}}function yo(e){if(!e||e.nodeType!==Yt)throw dn(),Sr;return e.data}var P,Y,ce=w(()=>{c();X();re();Xe();Pe();P=!1;i(De,\"set_hydrating\");i(pe,\"set_hydrate_node\");i(Ke,\"hydrate_next\");i(F,\"reset\");i($o,\"next\");i(hr,\"skip_nodes\");i(yo,\"read_hydration_instruction\")});function xi(e){return e===this.v}function wi(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e==\"object\"||typeof e==\"function\"}function Ei(e){return!wi(e,this.v)}var xo=w(()=>{c();i(xi,\"equals\");i(wi,\"safe_not_equal\");i(Ei,\"safe_equals\")});function Zl(){vr=!0}var Te,vr,rr,mt=w(()=>{c();Te=!1,vr=!1,rr=!1;i(Zl,\"enable_legacy_mode_flag\")});var Ys=w(()=>{c();J()});var zn=w(()=>{c();J();Ys();ee()});function ct(e,t){return e.label=t,ki(e.v,t),e}function ki(e,t){return e?.[mi]?.(t),e}var wo,Hr=w(()=>{c();re();zn();X();j();H();wo=null;i(ct,\"tag\");i(ki,\"tag_proxy\")});function or(e){let t=new Error,r=Nf();return r.length===0?null:(r.unshift(`\n`),tt(t,\"stack\",{value:r.join(`\n`)}),tt(t,\"name\",{value:e}),t)}function Nf(){let e=Error.stackTraceLimit;Error.stackTraceLimit=1/0;let t=new Error().stack;if(Error.stackTraceLimit=e,!t)return[];let r=t.split(`\n`),n=[];for(let o=0;o<r.length;o++){let s=r[o],a=s.replaceAll(\"\\\\\",\"/\");if(s.trim()!==\"Error\"){if(s.includes(\"validate_each_keys\"))return[];a.includes(\"svelte/src/internal\")||a.includes(\"node_modules/.vite\")||n.push(s)}}return n}function ec(e,t){if(!$)throw new Error(\"invariant(...) was not guarded by if (DEV)\");e||bl(t)}var pn=w(()=>{c();J();ee();bo();i(or,\"get_error\");i(Nf,\"get_stack\");i(ec,\"invariant\")});function Pr(e){L=e}function Un(e){ir=e}function Ai(e){sr=e}function tc(){let e={};return[()=>(Vs(e)||$l(),js(e)),t=>qs(e,t)]}function js(e){return Ci(\"getContext\").get(e)}function qs(e,t){let r=Ci(\"setContext\");if(Te){var n=S.f,o=!I&&(n&32)!==0&&!L.i;o||Bl()}return r.set(e,t),t}function Vs(e){return Ci(\"hasContext\").has(e)}function rc(){return Ci(\"getAllContexts\")}function ne(e,t=!1,r){L={p:L,i:!1,c:null,e:null,s:e,x:null,r:S,l:vr&&!t?{s:null,u:null,$:[]}:null},$&&(L.function=r,sr=r)}function oe(e){var t=L,r=t.e;if(r!==null){t.e=null;for(var n of r)Hs(n)}return e!==void 0&&(t.x=e),t.i=!0,L=t.p,$&&(sr=L?.function??null),e??{}}function ar(){return!vr||L!==null&&L.l===null}function Ci(e){return L===null&&Cr(e),L.c??=new Map(Of(L)||void 0)}function Of(e){let t=e.p;for(;t!==null;){let r=t.c;if(r!==null)return r;t=t.p}return null}var L,ir,sr,ye=w(()=>{c();J();Ge();H();j();mt();re();X();L=null;i(Pr,\"set_component_context\");ir=null;i(Un,\"set_dev_stack\");sr=null;i(Ai,\"set_dev_current_component_function\");i(tc,\"createContext\");i(js,\"getContext\");i(qs,\"setContext\");i(Vs,\"hasContext\");i(rc,\"getAllContexts\");i(ne,\"push\");i(oe,\"pop\");i(ar,\"is_runes\");i(Ci,\"get_or_init_context_map\");i(Of,\"get_parent_context\")});function nc(){var e=_n;_n=[],hi(e)}function Ze(e){if(_n.length===0&&!hn){var t=_n;queueMicrotask(()=>{t===_n&&nc()})}_n.push(e)}function oc(){for(;_n.length>0;)nc()}var _n,lr=w(()=>{c();ee();ot();_n=[];i(nc,\"run_micro_tasks\");i(Ze,\"queue_micro_task\");i(oc,\"flush_tasks\")});function Si(e){var t=S;if(t===null)return I.f|=8388608,e;if($&&e instanceof Error&&!zs.has(e)&&zs.set(e,Rf(e,t)),!(t.f&32768)&&!(t.f&4))throw $&&!t.parent&&e instanceof Error&&ic(e),e;qt(e,t)}function qt(e,t){for(;t!==null;){if(t.f&128){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(r){e=r}}t=t.parent}throw $&&e instanceof Error&&ic(e),e}function Rf(e,t){let r=xt(e,\"message\");if(!(r&&!r.configurable)){for(var n=To?\"  \":\"\t\",o=`\n${n}in ${t.fn?.name||\"<unknown>\"}`,s=t.ctx;s!==null;)o+=`\n${n}in ${s.function?.[jt].split(\"/\").pop()}`,s=s.p;return{message:e.message+`\n${o}\n`,stack:e.stack?.split(`\n`).filter(a=>!a.includes(\"svelte/src/internal\")).join(`\n`)}}}function ic(e){let t=zs.get(e);t&&(tt(e,\"message\",{value:t.message}),tt(e,\"stack\",{value:t.stack}))}var zs,Gn=w(()=>{c();J();re();Pe();X();ee();H();zs=new WeakMap;i(Si,\"handle_error\");i(qt,\"invoke_error_boundary\");i(Rf,\"get_adjustments\");i(ic,\"apply_adjustments\")});function ue(e,t){e.f=e.f&If|t}function Xn(e){e.f&512||e.deps===null?ue(e,1024):ue(e,4096)}var If,Or=w(()=>{c();X();If=-7169;i(ue,\"set_signal_status\");i(Xn,\"update_derived_status\")});function sc(e){if(e!==null)for(let t of e)!(t.f&2)||!(t.f&65536)||(t.f^=65536,sc(t.deps))}function Pi(e,t,r){e.f&2048?t.add(e):e.f&4096&&r.add(e),sc(e.deps),ue(e,1024)}var Us=w(()=>{c();X();Or();i(sc,\"clear_marked\");i(Pi,\"defer_effect\")});var Gs=w(()=>{c();H();ee()});var ac=w(()=>{c();ee();xo();Gs()});function Xs(e){var t=Ni;try{return Ni=!1,[e(),Ni]}finally{Ni=t}}var lc,Ni,hv,ko=w(()=>{c();Gs();ac();ee();H();j();dt();J();lc=!1,Ni=!1,hv=Symbol();i(Xs,\"capture_store_binding\")});var cc=w(()=>{c();X();zn();H()});function E(e){var t=hn;hn=!0;try{var r;for(e&&(D!==null&&!D.is_fork&&D.flush(),r=e());;){if(oc(),D===null)return r;D.flush()}}finally{hn=t}}function Lf(){if($){var e=new Map;for(let r of D.current.keys())for(let[n,o]of r.updated??[]){var t=e.get(n);t||(t={error:o.error,count:0},e.set(n,t)),t.count+=o.count}for(let r of e.values())r.error&&console.error(r.error)}try{Cl()}catch(r){$&&tt(r,\"stack\",{value:\"\"}),qt(r,Ws)}}function fc(e){var t=e.length;if(t!==0){for(var r=0;r<t;){var n=e[r++];if(!(n.f&24576)&&Kr(n)&&(zt=new Set,mr(n),n.deps===null&&n.first===null&&n.nodes===null&&n.teardown===null&&n.ac===null&&Zs(n),zt?.size>0)){Rr.clear();for(let o of zt){if(o.f&24576)continue;let s=[o],a=o.parent;for(;a!==null;)zt.has(a)&&(zt.delete(a),s.push(a)),a=a.parent;for(let l=s.length-1;l>=0;l--){let f=s[l];f.f&24576||mr(f)}}zt.clear()}}zt=null}}function dc(e,t,r,n){if(!r.has(e)&&(r.add(e),e.reactions!==null))for(let o of e.reactions){let s=o.f;s&2?dc(o,t,r,n):s&4194320&&!(s&2048)&&Qs(o,t,n)&&(ue(o,2048),So(o))}}function pc(e,t){if(e.reactions!==null)for(let r of e.reactions){let n=r.f;n&2?pc(r,t):n&131072&&(ue(r,2048),t.add(r))}}function Qs(e,t,r){let n=r.get(e);if(n!==void 0)return n;if(e.deps!==null)for(let o of e.deps){if(Jt.call(t,o))return!0;if(o.f&2&&Qs(o,t,r))return r.set(o,!0),!0}return r.set(e,!1),!1}function So(e){D.schedule(e)}function _c(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),ue(e,1024);for(var r=e.first;r!==null;)_c(r,t),r=r.next}}function hc(e){ue(e,1024);for(var t=e.first;t!==null;)hc(t),t=t.next}function vc(e){Te||bi(\"fork\"),D!==null&&Pl();var t=Le.ensure();t.is_fork=!0,Be=new Map;var r=!1,n=t.settled();return E(e),{commit:async()=>{if(r){await n;return}Ht.has(t)||Sl(),r=!0,t.is_fork=!1;for(var[o,[s]]of t.current)o.v=s,o.wv=Gr();t.activate(),t.run_fork_commit_callbacks(),t.deactivate(),E(()=>{var a=new Set;for(var l of t.current.keys())pc(l,a);Po(a),No()}),t.flush(),await n},discard:()=>{for(var o of t.current.keys())o.wv=Gr();!r&&Ht.has(t)&&t.discard()}}}var Ht,D,Co,Be,Ws,hn,Ks,gn,Ao,uc,Mf,Bf,Le,zt,ot=w(()=>{c();X();mt();ee();H();Ge();lr();J();Gn();dt();j();Us();re();Or();ko();pn();cc();Ht=new Set,D=null,Co=null,Be=null,Ws=null,hn=!1,Ks=!1,gn=null,Ao=null,uc=0,Mf=$?new Set:null,Bf=1,Le=class{id=Bf++;current=new Map;previous=new Map;#e=new Set;#n=new Set;#r=new Set;#i=new Map;#o=new Map;#s=null;#t=[];#a=[];#c=new Set;#u=new Set;#l=new Map;#p=new Set;is_fork=!1;#_=!1;#d=new Set;#f(){return this.is_fork||this.#o.size>0}#b(){for(let n of this.#d)for(let o of n.#o.keys()){for(var t=!1,r=o;r.parent!==null;){if(this.#l.has(r)){t=!0;break}r=r.parent}if(!t)return!0}return!1}skip_effect(t){this.#l.has(t)||this.#l.set(t,{d:[],m:[]}),this.#p.delete(t)}unskip_effect(t,r=n=>this.schedule(n)){var n=this.#l.get(t);if(n){this.#l.delete(t);for(var o of n.d)ue(o,2048),r(o);for(o of n.m)ue(o,4096),r(o)}this.#p.add(t)}#h(){if(uc++>1e3&&(Ht.delete(this),Lf()),!this.#f()){for(let l of this.#c)this.#u.delete(l),ue(l,2048),this.schedule(l);for(let l of this.#u)ue(l,4096),this.schedule(l)}let t=this.#t;this.#t=[],this.apply();var r=gn=[],n=[],o=Ao=[];for(let l of t)try{this.#m(l,r,n)}catch(f){throw hc(l),f}if(D=null,o.length>0){var s=Le.ensure();for(let l of o)s.schedule(l)}if(gn=null,Ao=null,this.#f()||this.#b()){this.#v(n),this.#v(r);for(let[l,f]of this.#l)_c(l,f)}else{this.#i.size===0&&Ht.delete(this),this.#c.clear(),this.#u.clear();for(let l of this.#e)l(this);this.#e.clear(),Co=this,fc(n),fc(r),Co=null,this.#s?.resolve()}var a=D;if(this.#t.length>0){let l=a??=this;l.#t.push(...this.#t.filter(f=>!l.#t.includes(f)))}if(a!==null){if(Ht.add(a),$)for(let l of this.current.keys())Mf.add(l);a.#h()}Te&&!Ht.has(this)&&this.#g()}#m(t,r,n){t.f^=1024;for(var o=t.first;o!==null;){var s=o.f,a=(s&96)!==0,l=a&&(s&1024)!==0,f=l||(s&8192)!==0||this.#l.has(o);if(!f&&o.fn!==null){a?o.f^=1024:s&4?r.push(o):Te&&s&16777224?n.push(o):Kr(o)&&(s&16&&this.#u.add(o),mr(o));var _=o.first;if(_!==null){o=_;continue}}for(;o!==null;){var p=o.next;if(p!==null){o=p;break}o=o.parent}}}#v(t){for(var r=0;r<t.length;r+=1)Pi(t[r],this.#c,this.#u)}capture(t,r,n=!1){t.v!==me&&!this.previous.has(t)&&this.previous.set(t,t.v),t.f&8388608||(this.current.set(t,[r,n]),Be?.set(t,r)),this.is_fork||(t.v=r)}activate(){D=this}deactivate(){D=null,Be=null}flush(){var t=$?new Set:null;try{Ks=!0,D=this,this.#h()}finally{if(uc=0,Ws=null,gn=null,Ao=null,Ks=!1,D=null,Be=null,Rr.clear(),$)for(let r of t)r.updated=null}}discard(){for(let t of this.#n)t(this);this.#n.clear(),this.#r.clear(),Ht.delete(this)}register_created_effect(t){this.#a.push(t)}#g(){for(let p of Ht){var t=p.id<this.id,r=[];for(let[v,[d,b]]of this.current){if(p.current.has(v)){var n=p.current.get(v)[0];if(t&&d!==n)p.current.set(v,[d,b]);else continue}r.push(v)}var o=[...p.current.keys()].filter(v=>!this.current.has(v));if(o.length===0)t&&p.discard();else if(r.length>0){if($&&ec(p.#t.length===0,\"Batch has scheduled roots\"),t)for(let v of this.#p)p.unskip_effect(v,d=>{d.f&4194320?p.schedule(d):p.#v([d])});p.activate();var s=new Set,a=new Map;for(var l of r)dc(l,o,s,a);a=new Map;var f=[...p.current.keys()].filter(v=>this.current.has(v)?this.current.get(v)[0]!==v:!0);for(let v of this.#a)!(v.f&155648)&&Qs(v,f,a)&&(v.f&4194320?(ue(v,2048),p.schedule(v)):p.#c.add(v));if(p.#t.length>0){p.apply();for(var _ of p.#t)p.#m(_,[],[]);p.#t=[]}p.deactivate()}}for(let p of Ht)p.#d.has(this)&&(p.#d.delete(this),p.#d.size===0&&!p.#f()&&(p.activate(),p.#h()))}increment(t,r){let n=this.#i.get(r)??0;if(this.#i.set(r,n+1),t){let o=this.#o.get(r)??0;this.#o.set(r,o+1)}}decrement(t,r,n){let o=this.#i.get(r)??0;if(o===1?this.#i.delete(r):this.#i.set(r,o-1),t){let s=this.#o.get(r)??0;s===1?this.#o.delete(r):this.#o.set(r,s-1)}this.#_||n||(this.#_=!0,Ze(()=>{this.#_=!1,this.flush()}))}transfer_effects(t,r){for(let n of t)this.#c.add(n);for(let n of r)this.#u.add(n);t.clear(),r.clear()}oncommit(t){this.#e.add(t)}ondiscard(t){this.#n.add(t)}on_fork_commit(t){this.#r.add(t)}run_fork_commit_callbacks(){for(let t of this.#r)t(this);this.#r.clear()}settled(){return(this.#s??=vi()).promise}static ensure(){if(D===null){let t=D=new Le;Ks||(Ht.add(D),hn||Ze(()=>{D===t&&t.flush()}))}return D}apply(){if(!Te||!this.is_fork&&Ht.size===1){Be=null;return}Be=new Map;for(let[n,[o]]of this.current)Be.set(n,o);for(let n of Ht)if(!(n===this||n.is_fork)){var t=!1,r=!1;if(n.id<this.id)for(let[o,[,s]]of n.current)s||(t||=this.current.has(o),r||=!this.current.has(o));if(t&&r)this.#d.add(n);else for(let[o,s]of n.previous)Be.has(o)||Be.set(o,s)}}schedule(t){if(Ws=t,t.b?.is_pending&&t.f&16777228&&!(t.f&32768)){t.b.defer_effect(t);return}for(var r=t;r.parent!==null;){r=r.parent;var n=r.f;if(gn!==null&&r===S&&(Te||(I===null||!(I.f&2))&&!lc))return;if(n&96){if(!(n&1024))return;r.f^=1024}}this.#t.push(r)}};i(Le,\"Batch\");i(E,\"flushSync\");i(Lf,\"infinite_loop_guard\");zt=null;i(fc,\"flush_queued_effects\");i(dc,\"mark_effects\");i(pc,\"mark_eager_effects\");i(Qs,\"depends_on\");i(So,\"schedule_effect\");i(_c,\"reset_branch\");i(hc,\"reset_all\");i(vc,\"fork\")});function gc(e){let t=0,r=_t(0),n;return $&&ct(r,\"createSubscriber version\"),()=>{zr()&&(u(r),Fe(()=>(t===0&&(n=ae(()=>e(()=>bn(r)))),t+=1,()=>{Ze(()=>{t-=1,t===0&&(n?.(),n=void 0,bn(r))})})))}}var bc=w(()=>{c();H();j();dt();Hr();J();lr();i(gc,\"createSubscriber\")});function Js(e,t,r,n){new Oi(e,t,r,n)}var Yf,Oi,Ri=w(()=>{c();X();re();ye();Gn();j();H();ce();lr();Ge();Xe();J();ot();dt();Hr();bc();Pe();Us();Or();Yf=589824;i(Js,\"boundary\");Oi=class{parent;is_pending=!1;transform_error;#e;#n=P?Y:null;#r;#i;#o;#s=null;#t=null;#a=null;#c=null;#u=0;#l=0;#p=!1;#_=new Set;#d=new Set;#f=null;#b=gc(()=>(this.#f=_t(this.#u),$&&ct(this.#f,\"$effect.pending()\"),()=>{this.#f=null}));constructor(t,r,n,o){this.#e=t,this.#r=r,this.#i=s=>{var a=S;a.b=this,a.f|=128,n(s)},this.parent=S.b,this.transform_error=o??this.parent?.transform_error??(s=>s),this.#o=bt(()=>{if(P){let s=this.#n;Ke();let a=s.data===un;if(s.data.startsWith(Fs)){let f=JSON.parse(s.data.slice(Fs.length));this.#m(f)}else a?this.#v():this.#h()}else this.#g()},Yf),P&&(this.#e=Y)}#h(){try{this.#s=Ye(()=>this.#i(this.#e))}catch(t){this.error(t)}}#m(t){let r=this.#r.failed;r&&(this.#a=Ye(()=>{r(this.#e,()=>t,()=>()=>{})}))}#v(){let t=this.#r.pending;t&&(this.is_pending=!0,this.#t=Ye(()=>t(this.#e)),Ze(()=>{var r=this.#c=document.createDocumentFragment(),n=Ve();r.append(n),this.#s=this.#y(()=>Ye(()=>this.#i(n))),this.#l===0&&(this.#e.before(r),this.#c=null,gr(this.#t,()=>{this.#t=null}),this.#$(D))}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#l=0,this.#u=0,this.#s=Ye(()=>{this.#i(this.#e)}),this.#l>0){var t=this.#c=document.createDocumentFragment();Kn(this.#s,t);let r=this.#r.pending;this.#t=Ye(()=>r(this.#e))}else this.#$(D)}catch(r){this.error(r)}}#$(t){this.is_pending=!1,t.transfer_effects(this.#_,this.#d)}defer_effect(t){Pi(t,this.#_,this.#d)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#r.pending}#y(t){var r=S,n=I,o=L;qe(this.#o),je(this.#o),Pr(this.#o.ctx);try{return Le.ensure(),t()}catch(s){return Si(s),null}finally{qe(r),je(n),Pr(o)}}#x(t,r){if(!this.has_pending_snippet()){this.parent&&this.parent.#x(t,r);return}this.#l+=t,this.#l===0&&(this.#$(r),this.#t&&gr(this.#t,()=>{this.#t=null}),this.#c&&(this.#e.before(this.#c),this.#c=null))}update_pending_count(t,r){this.#x(t,r),this.#u+=t,!(!this.#f||this.#p)&&(this.#p=!0,Ze(()=>{this.#p=!1,this.#f&&ur(this.#f,this.#u)}))}get_effect_pending(){return this.#b(),u(this.#f)}error(t){if(!this.#r.onerror&&!this.#r.failed)throw t;D?.is_fork?(this.#s&&D.skip_effect(this.#s),this.#t&&D.skip_effect(this.#t),this.#a&&D.skip_effect(this.#a),D.on_fork_commit(()=>{this.#w(t)})):this.#w(t)}#w(t){this.#s&&(ke(this.#s),this.#s=null),this.#t&&(ke(this.#t),this.#t=null),this.#a&&(ke(this.#a),this.#a=null),P&&(pe(this.#n),$o(),pe(hr()));var r=this.#r.onerror;let n=this.#r.failed;var o=!1,s=!1;let a=i(()=>{if(o){Ql();return}o=!0,s&&jl(),this.#a!==null&&gr(this.#a,()=>{this.#a=null}),this.#y(()=>{this.#g()})},\"reset\"),l=i(f=>{try{s=!0,r?.(f,a),s=!1}catch(_){qt(_,this.#o&&this.#o.parent)}n&&(this.#a=this.#y(()=>{try{return Ye(()=>{var _=S;_.b=this,_.f|=128,n(this.#e,()=>f,()=>a)})}catch(_){return qt(_,this.#o.parent),null}}))},\"handle_error_result\");Ze(()=>{var f;try{f=this.transform_error(t)}catch(_){qt(_,this.#o&&this.#o.parent);return}f!==null&&typeof f==\"object\"&&typeof f.then==\"function\"?f.then(l,_=>qt(_,this.#o&&this.#o.parent)):l(f)})}};i(Oi,\"Boundary\")});function Ii(e,t,r,n){let o=ar()?$n:yn;var s=e.filter(d=>!d.settled);if(r.length===0&&s.length===0){n(t.map(o));return}var a=S,l=$c(),f=s.length===1?s[0].promise:s.length>1?Promise.all(s.map(d=>d.promise)):null;function _(d){l();try{n(d)}catch(b){a.f&16384||qt(b,a)}Wn()}if(i(_,\"finish\"),r.length===0){f.then(()=>_(t.map(o)));return}var p=Oo();function v(){Promise.all(r.map(d=>ta(d))).then(d=>_([...t.map(o),...d])).catch(d=>qt(d,a)).finally(()=>p())}i(v,\"run\"),f?f.then(()=>{l(),v(),Wn()}):v()}function $c(){var e=S,t=I,r=L,n=D;if($)var o=ir;return i(function(a=!0){qe(e),je(t),Pr(r),a&&!(e.f&16384)&&(n?.activate(),n?.apply()),$&&(ea(null),Un(o))},\"restore\")}function Wn(e=!0){qe(null),je(null),Pr(null),e&&D?.deactivate(),$&&(ea(null),Un(null))}function Oo(){var e=S,t=e.b,r=D,n=t.is_rendered();return t.update_pending_count(1,r),r.increment(n,e),(o=!1)=>{t.update_pending_count(-1,r),r.decrement(n,e,o)}}var Wr=w(()=>{c();X();J();ye();Ri();Gn();H();ot();Qr();j();i(Ii,\"flatten\");i($c,\"capture\");i(Wn,\"unset_context\");i(Oo,\"increment_pending\")});function ea(e){Et=e}function $n(e){var t=2050;S!==null&&(S.f|=524288);let r={ctx:L,deps:null,effects:null,equals:xi,f:t,fn:e,reactions:null,rv:0,v:me,wv:0,parent:S,ac:null};return $&&rr&&(r.created=or(\"created at\")),r}function ta(e,t,r){let n=S;n===null&&xl();var o=void 0,s=_t(me);$&&(s.label=t);var a=!I,l=new Map;return wc(()=>{var f=S;$&&(Et={effect:f,effect_deps:new Set,warned:!1});var _=vi();o=_.promise;try{Promise.resolve(e()).then(_.resolve,_.reject).finally(Wn)}catch(b){_.reject(b),Wn()}if($){if(Et){if(f.deps!==null)for(let b=0;b<$t;b+=1)Et.effect_deps.add(f.deps[b]);if(et!==null)for(let b=0;b<et.length;b+=1)Et.effect_deps.add(et[b])}Et=null}var p=D;if(a){if(f.f&32768)var v=Oo();if(n.b.is_rendered())l.get(p)?.reject(Ot),l.delete(p);else{for(let b of l.values())b.reject(Ot);l.clear()}l.set(p,_)}let d=i((b,y=void 0)=>{if($&&(Et=null),v){var m=y===Ot;v(m)}if(!(y===Ot||f.f&16384)){if(p.activate(),y)s.f|=8388608,ur(s,y);else{s.f&8388608&&(s.f^=8388608),ur(s,b);for(let[h,x]of l){if(l.delete(h),h===p)break;x.reject(Ot)}$&&r!==void 0&&(Ro.add(s),setTimeout(()=>{Ro.has(s)&&(Hl(s.label,r),Ro.delete(s))}))}p.deactivate()}},\"handler\");_.promise.then(d,b=>d(null,b||\"unknown\"))}),pt(()=>{for(let f of l.values())f.reject(Ot)}),$&&(s.f|=4194304),new Promise(f=>{function _(p){function v(){p===o?f(s):_(o)}i(v,\"go\"),p.then(v,v)}i(_,\"next\"),_(o)})}function R(e){let t=$n(e);return Te||Mi(t),t}function yn(e){let t=$n(e);return t.equals=Ei,t}function yc(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;r<t.length;r+=1)ke(t[r])}}function Io(e){var t,r=S,n=e.parent;if(!It&&n!==null&&n.f&24576)return zl(),e.v;if(qe(n),$){let o=xn;Po(new Set);try{Jt.call(ra,e)&&wl(),ra.push(e),e.f&=-65537,yc(e),t=Di(e)}finally{qe(r),Po(o),ra.pop()}}else try{e.f&=-65537,yc(e),t=Di(e)}finally{qe(r)}return t}function na(e){var t=Io(e);if(!e.equals(t)&&(e.wv=Gr(),(!D?.is_fork||e.deps===null)&&(D!==null?D.capture(e,t,!0):e.v=t,e.deps===null))){ue(e,1024);return}It||(Be!==null?(zr()||D?.is_fork)&&Be.set(e,t):Xn(e))}function xc(e){if(e.effects!==null)for(let t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(Ot),t.teardown=Re,t.ac=null,wn(t,0),Do(t))}function oa(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&mr(t)}var Et,Ro,ra,Qr=w(()=>{c();J();X();H();xo();Ge();Xe();j();dt();pn();mt();ye();re();ot();Wr();ee();Or();Et=null;i(ea,\"set_reactivity_loss_tracker\");Ro=new Set;i($n,\"derived\");i(ta,\"async_derived\");i(R,\"user_derived\");i(yn,\"derived_safe_equal\");i(yc,\"destroy_derived_effects\");ra=[];i(Io,\"execute_derived\");i(na,\"update_derived\");i(xc,\"freeze_derived_effects\");i(oa,\"unfreeze_derived_effects\")});function Po(e){xn=e}function Ec(){ia=!0}function _t(e,t){var r={f:0,v:e,reactions:null,equals:xi,rv:0,wv:0};return $&&rr&&(r.created=t??or(\"created at\"),r.updated=null,r.set_during_effect=!1,r.trace=null),r}function xe(e,t){let r=_t(e,t);return Mi(r),r}function vn(e,t=!1,r=!0){let n=_t(e);return t||(n.equals=Ei),vr&&r&&L!==null&&L.l!==null&&(L.l.s??=[]).push(n),n}function T(e,t,r=!1){I!==null&&(!yt||I.f&131072)&&ar()&&I.f&4325394&&(Dt===null||!Jt.call(Dt,e))&&Yl();let n=r?Ir(t):t;return $&&ki(n,e.label),ur(e,n,Ao)}function ur(e,t,r=null){if(!e.equals(t)){Rr.set(e,It?t:e.v);var n=Le.ensure();if(n.capture(e,t),$){if(rr||S!==null){e.updated??=new Map;let o=(e.updated.get(\"\")?.count??0)+1;if(e.updated.set(\"\",{error:null,count:o}),rr||o>5){let s=or(\"updated at\");if(s!==null){let a=e.updated.get(s.stack);a||(a={error:s,count:0},e.updated.set(s.stack,a)),a.count++}}}S!==null&&(e.set_during_effect=!0)}if(e.f&2){let o=e;e.f&2048&&Io(o),Be===null&&Xn(o)}e.wv=Gr(),Tc(e,2048,r),ar()&&S!==null&&S.f&1024&&!(S.f&96)&&(Mt===null?kc([e]):Mt.push(e)),!n.is_fork&&xn.size>0&&!ia&&No()}return t}function No(){ia=!1;for(let e of xn)e.f&1024&&ue(e,4096),Kr(e)&&mr(e);xn.clear()}function bn(e){T(e,e.v+1)}function Tc(e,t,r){var n=e.reactions;if(n!==null)for(var o=ar(),s=n.length,a=0;a<s;a++){var l=n[a],f=l.f;if(!(!o&&l===S)){if($&&f&131072){xn.add(l);continue}var _=(f&2048)===0;if(_&&ue(l,t),f&2){var p=l;Be?.delete(p),f&65536||(f&512&&(S===null||!(S.f&2097152))&&(l.f|=65536),Tc(p,4096,r))}else if(_){var v=l;f&16&&zt!==null&&zt.add(v),r!==null?r.push(v):So(v)}}}}var xn,Rr,ia,dt=w(()=>{c();J();H();xo();X();Ge();mt();ee();Hr();pn();ye();ot();En();Qr();Or();xn=new Set,Rr=new Map;i(Po,\"set_eager_effects\");ia=!1;i(Ec,\"set_eager_effects_deferred\");i(_t,\"source\");i(xe,\"state\");i(vn,\"mutable_source\");i(T,\"set\");i(ur,\"internal_set\");i(No,\"flush_eager_effects\");i(bn,\"increment\");i(Tc,\"mark_reactions\")});function Ir(e){if(typeof e!=\"object\"||e===null||Ie in e)return e;let t=cn(e);if(t!==Ns&&t!==ml)return e;var r=new Map,n=_r(e),o=xe(0),s=$&&rr?or(\"created at\"):null,a=Zr,l=i(v=>{if(Zr===a)return v();var d=I,b=Zr;je(null),sa(a);var y=v();return je(d),sa(b),y},\"with_parent\");n&&(r.set(\"length\",xe(e.length,s)),$&&(e=Hf(e)));var f=\"\";let _=!1;function p(v){if(!_){_=!0,f=v,ct(o,`${f} version`);for(let[d,b]of r)ct(b,Tn(f,d));_=!1}}return i(p,\"update_path\"),new Proxy(e,{defineProperty(v,d,b){(!(\"value\"in b)||b.configurable===!1||b.enumerable===!1||b.writable===!1)&&Ll();var y=r.get(d);return y===void 0?l(()=>{var m=xe(b.value,s);return r.set(d,m),$&&typeof d==\"string\"&&ct(m,Tn(f,d)),m}):T(y,b.value,!0),!0},deleteProperty(v,d){var b=r.get(d);if(b===void 0){if(d in v){let y=l(()=>xe(me,s));r.set(d,y),bn(o),$&&ct(y,Tn(f,d))}}else T(b,me),bn(o);return!0},get(v,d,b){if(d===Ie)return e;if($&&d===mi)return p;var y=r.get(d),m=d in v;if(y===void 0&&(!m||xt(v,d)?.writable)&&(y=l(()=>{var x=Ir(m?v[d]:me),C=xe(x,s);return $&&ct(C,Tn(f,d)),C}),r.set(d,y)),y!==void 0){var h=u(y);return h===me?void 0:h}return Reflect.get(v,d,b)},getOwnPropertyDescriptor(v,d){var b=Reflect.getOwnPropertyDescriptor(v,d);if(b&&\"value\"in b){var y=r.get(d);y&&(b.value=u(y))}else if(b===void 0){var m=r.get(d),h=m?.v;if(m!==void 0&&h!==me)return{enumerable:!0,configurable:!0,value:h,writable:!0}}return b},has(v,d){if(d===Ie)return!0;var b=r.get(d),y=b!==void 0&&b.v!==me||Reflect.has(v,d);if(b!==void 0||S!==null&&(!y||xt(v,d)?.writable)){b===void 0&&(b=l(()=>{var h=y?Ir(v[d]):me,x=xe(h,s);return $&&ct(x,Tn(f,d)),x}),r.set(d,b));var m=u(b);if(m===me)return!1}return y},set(v,d,b,y){var m=r.get(d),h=d in v;if(n&&d===\"length\")for(var x=b;x<m.v;x+=1){var C=r.get(x+\"\");C!==void 0?T(C,me):x in v&&(C=l(()=>xe(me,s)),r.set(x+\"\",C),$&&ct(C,Tn(f,x)))}if(m===void 0)(!h||xt(v,d)?.writable)&&(m=l(()=>xe(void 0,s)),$&&ct(m,Tn(f,d)),T(m,Ir(b)),r.set(d,m));else{h=m.v!==me;var k=l(()=>Ir(b));T(m,k)}var V=Reflect.getOwnPropertyDescriptor(v,d);if(V?.set&&V.set.call(y,b),!h){if(n&&typeof d==\"string\"){var Z=r.get(\"length\"),U=Number(d);Number.isInteger(U)&&U>=Z.v&&T(Z,U+1)}bn(o)}return!0},ownKeys(v){u(o);var d=Reflect.ownKeys(v).filter(m=>{var h=r.get(m);return h===void 0||h.v!==me});for(var[b,y]of r)y.v!==me&&!(b in v)&&d.push(b);return d},setPrototypeOf(){Fl()}})}function Tn(e,t){return typeof t==\"symbol\"?`${e}[Symbol(${t.description??\"\"})]`:qf.test(t)?`${e}.${t}`:/^\\d+$/.test(t)?`${e}[${t}]`:`${e}['${t}']`}function Bi(e){try{if(e!==null&&typeof e==\"object\"&&Ie in e)return e[Ie]}catch{}return e}function Hf(e){return new Proxy(e,{get(t,r,n){var o=Reflect.get(t,r,n);return Vf.has(r)?function(...s){Ec();var a=o.apply(this,s);return No(),a}:o}})}var qf,Vf,En=w(()=>{c();J();H();ee();dt();X();re();Ge();Hr();pn();mt();qf=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;i(Ir,\"proxy\");i(Tn,\"get_label\");i(Bi,\"get_proxied_value\");Vf=new Set([\"copyWithin\",\"fill\",\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"]);i(Hf,\"inspectable_array\")});function Ac(){let e=Array.prototype,t=Array.__svelte_cleanup;t&&t();let{indexOf:r,lastIndexOf:n,includes:o}=e;e.indexOf=function(s,a){let l=r.call(this,s,a);if(l===-1){for(let f=a??0;f<this.length;f+=1)if(Bi(this[f])===s){yi(\"array.indexOf(...)\");break}}return l},e.lastIndexOf=function(s,a){let l=n.call(this,s,a??this.length-1);if(l===-1){for(let f=0;f<=(a??this.length-1);f+=1)if(Bi(this[f])===s){yi(\"array.lastIndexOf(...)\");break}}return l},e.includes=function(s,a){let l=o.call(this,s,a);if(!l){for(let f=0;f<this.length;f+=1)if(Bi(this[f])===s){yi(\"array.includes(...)\");break}}return l},Array.__svelte_cleanup=()=>{e.indexOf=r,e.lastIndexOf=n,e.includes=o}}var aa=w(()=>{c();Xe();En();i(Ac,\"init_array_prototype_warnings\")});function Li(){if(la===void 0){la=window,Cc=document,To=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,r=Text.prototype;Sc=xt(t,\"firstChild\").get,Pc=xt(t,\"nextSibling\").get,Os(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),Os(r)&&(r.__t=void 0),$&&(e.__svelte_meta=null,Ac())}}function Ve(e=\"\"){return document.createTextNode(e)}function it(e){return Sc.call(e)}function We(e){return Pc.call(e)}function q(e,t){if(!P)return it(e);var r=it(Y);if(r===null)r=Y.appendChild(Ve());else if(t&&r.nodeType!==Vn){var n=Ve();return r?.before(n),pe(n),n}return t&&Yi(r),pe(r),r}function st(e,t=!1){if(!P){var r=it(e);return r instanceof Comment&&r.data===\"\"?We(r):r}if(t){if(Y?.nodeType!==Vn){var n=Ve();return Y?.before(n),pe(n),n}Yi(Y)}return Y}function N(e,t=1,r=!1){let n=P?Y:e;for(var o;t--;)o=n,n=We(n);if(!P)return n;if(r){if(n?.nodeType!==Vn){var s=Ve();return n===null?o?.after(s):n.before(s),pe(s),s}Yi(n)}return pe(n),n}function Mo(e){e.textContent=\"\"}function Fi(){if(!Te||zt!==null)return!1;var e=S.f;return(e&32768)!==0}function Dr(e,t,r){let n=r?{is:r}:void 0;return document.createElementNS(t??$i,e,n)}function Yi(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Vn;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}var la,Cc,To,Sc,Pc,Pe=w(()=>{c();ce();J();aa();ee();H();mt();X();ot();re();i(Li,\"init_operations\");i(Ve,\"create_text\");i(it,\"get_first_child\");i(We,\"get_next_sibling\");i(q,\"child\");i(st,\"first_child\");i(N,\"sibling\");i(Mo,\"clear_text_content\");i(Fi,\"should_defer_append\");i(Dr,\"create_element\");i(Yi,\"merge_text_nodes\")});function ji(){Nc||(Nc=!0,document.addEventListener(\"reset\",e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t.__on_r?.()})},{capture:!0}))}var Nc,qi=w(()=>{c();ce();Pe();lr();Nc=!1;i(ji,\"add_form_reset_listener\")});function Jr(e){var t=I,r=S;je(null),qe(null);try{return e()}finally{je(t),qe(r)}}function Vi(e,t,r,n=r){e.addEventListener(t,()=>Jr(r));let o=e.__on_r;o?e.__on_r=()=>{o(),n(!0)}:e.__on_r=()=>n(!0),ji()}var Ut=w(()=>{c();j();H();qi();i(Jr,\"without_reactive_context\");i(Vi,\"listen_to_event_and_reset_event\")});function ua(e){S===null&&(I===null&&Al(e),kl()),It&&Tl(e)}function zf(e,t){var r=t.last;r===null?t.last=t.first=e:(r.next=e,e.prev=r,t.last=e)}function Gt(e,t){var r=S;if($)for(;r!==null&&r.f&131072;)r=r.parent;r!==null&&r.f&8192&&(e|=8192);var n={ctx:L,deps:null,nodes:null,f:e|2048|512,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};$&&(n.component_function=sr),D?.register_created_effect(n);var o=n;if(e&4)gn!==null?gn.push(n):Le.ensure().schedule(n);else if(t!==null){try{mr(n)}catch(a){throw ke(n),a}o.deps===null&&o.teardown===null&&o.nodes===null&&o.first===o.last&&!(o.f&524288)&&(o=o.first,e&16&&e&65536&&o!==null&&(o.f|=65536))}if(o!==null&&(o.parent=r,r!==null&&zf(o,r),I!==null&&I.f&2&&!(e&64))){var s=I;(s.effects??=[]).push(o)}return n}function zr(){return I!==null&&!yt}function pt(e){let t=Gt(8,null);return ue(t,1024),t.teardown=e,t}function $r(e){ua(\"$effect\"),$&&tt(e,\"name\",{value:\"$effect\"});var t=S.f,r=!I&&(t&32)!==0&&(t&32768)===0;if(r){var n=L;(n.e??=[]).push(e)}else return Hs(e)}function Hs(e){return Gt(1048580,e)}function yr(e){return ua(\"$effect.pre\"),$&&tt(e,\"name\",{value:\"$effect.pre\"}),Gt(1048584,e)}function fa(e){Le.ensure();let t=Gt(524352,e);return()=>{ke(t)}}function Ic(e){Le.ensure();let t=Gt(524352,e);return(r={})=>new Promise(n=>{r.outro?gr(t,()=>{ke(t),n(void 0)}):(ke(t),n(void 0))})}function Tt(e){return Gt(4,e)}function wc(e){return Gt(4718592,e)}function Fe(e,t=0){return Gt(8|t,e)}function ge(e,t=[],r=[],n=[]){Ii(n,t,r,o=>{Gt(8,()=>e(...o.map(u)))})}function bt(e,t=0){var r=Gt(16|t,e);return $&&(r.dev_stack=ir),r}function da(e,t=0){var r=Gt(16777216|t,e);return $&&(r.dev_stack=ir),r}function Ye(e){return Gt(524320,e)}function pa(e){var t=e.teardown;if(t!==null){let r=It,n=I;ca(!0),je(null);try{t.call(null)}finally{ca(r),je(n)}}}function Do(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){let o=r.ac;o!==null&&Jr(()=>{o.abort(Ot)});var n=r.next;r.f&64?r.parent=null:ke(r,t),r=n}}function Dc(e){for(var t=e.first;t!==null;){var r=t.next;t.f&32||ke(t),t=r}}function ke(e,t=!0){var r=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Mc(e.nodes.start,e.nodes.end),r=!0),ue(e,33554432),Do(e,t&&!r),wn(e,0);var n=e.nodes&&e.nodes.t;if(n!==null)for(let s of n)s.stop();pa(e),e.f^=33554432,e.f|=16384;var o=e.parent;o!==null&&o.first!==null&&Zs(e),$&&(e.component_function=null),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Mc(e,t){for(;e!==null;){var r=e===t?null:We(e);e.remove(),e=r}}function Zs(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function gr(e,t,r=!0){var n=[];Bc(e,n,!0);var o=i(()=>{r&&ke(e),t&&t()},\"fn\"),s=n.length;if(s>0){var a=i(()=>--s||o(),\"check\");for(var l of n)l.out(a)}else o()}function Bc(e,t,r){if(!(e.f&8192)){e.f^=8192;var n=e.nodes&&e.nodes.t;if(n!==null)for(let l of n)(l.is_global||r)&&t.push(l);for(var o=e.first;o!==null;){var s=o.next;if(!(o.f&64)){var a=(o.f&65536)!==0||(o.f&32)!==0&&(e.f&16)!==0;Bc(o,t,a?r:!1)}o=s}}}function Bo(e){Lc(e,!0)}function Lc(e,t){if(e.f&8192){e.f^=8192,e.f&1024||(ue(e,2048),Le.ensure().schedule(e));for(var r=e.first;r!==null;){var n=r.next,o=(r.f&65536)!==0||(r.f&32)!==0;Lc(r,o?t:!1),r=n}var s=e.nodes&&e.nodes.t;if(s!==null)for(let a of s)(a.is_global||t)&&a.in()}}function Kn(e,t){if(e.nodes)for(var r=e.nodes.start,n=e.nodes.end;r!==null;){var o=r===n?null:We(r);t.append(r),r=o}}var j=w(()=>{c();H();X();Ge();J();ee();Pe();ye();ot();Wr();Ut();Or();i(ua,\"validate_effect\");i(zf,\"push_effect\");i(Gt,\"create_effect\");i(zr,\"effect_tracking\");i(pt,\"teardown\");i($r,\"user_effect\");i(Hs,\"create_user_effect\");i(yr,\"user_pre_effect\");i(fa,\"effect_root\");i(Ic,\"component_root\");i(Tt,\"effect\");i(wc,\"async_effect\");i(Fe,\"render_effect\");i(ge,\"template_effect\");i(bt,\"block\");i(da,\"managed\");i(Ye,\"branch\");i(pa,\"execute_effect_teardown\");i(Do,\"destroy_effect_children\");i(Dc,\"destroy_block_effect_children\");i(ke,\"destroy_effect\");i(Mc,\"remove_effect_dom\");i(Zs,\"unlink_effect\");i(gr,\"pause_effect\");i(Bc,\"pause_children\");i(Bo,\"resume_effect\");i(Lc,\"resume_children\");i(Kn,\"move_effect\")});var Fc,_a=w(()=>{c();dt();H();Fc=null});function ca(e){It=e}function je(e){I=e}function qe(e){S=e}function Mi(e){I!==null&&(!Te||I.f&2)&&(Dt===null?Dt=[e]:Dt.push(e))}function kc(e){Mt=e}function sa(e){Zr=e}function Gr(){return++Yc}function Kr(e){var t=e.f;if(t&2048)return!0;if(t&2&&(e.f&=-65537),t&4096){for(var r=e.deps,n=r.length,o=0;o<n;o++){var s=r[o];if(Kr(s)&&na(s),s.wv>e.wv)return!0}t&512&&Be===null&&ue(e,1024)}return!1}function jc(e,t,r=!0){var n=e.reactions;if(n!==null&&!(!Te&&Dt!==null&&Jt.call(Dt,e)))for(var o=0;o<n.length;o++){var s=n[o];s.f&2?jc(s,t,!1):t===s&&(r?ue(s,2048):s.f&1024&&ue(s,4096),So(s))}}function Di(e){var t=et,r=$t,n=Mt,o=I,s=Dt,a=L,l=yt,f=Zr,_=e.f;et=null,$t=0,Mt=null,I=_&96?null:e,Dt=null,Pr(e.ctx),yt=!1,Zr=++kn,e.ac!==null&&(Jr(()=>{e.ac.abort(Ot)}),e.ac=null);try{e.f|=2097152;var p=e.fn,v=p();e.f|=32768;var d=e.deps,b=D?.is_fork;if(et!==null){var y;if(b||wn(e,$t),d!==null&&$t>0)for(d.length=$t+et.length,y=0;y<et.length;y++)d[$t+y]=et[y];else e.deps=d=et;if(zr()&&e.f&512)for(y=$t;y<d.length;y++)(d[y].reactions??=[]).push(e)}else!b&&d!==null&&$t<d.length&&(wn(e,$t),d.length=$t);if(ar()&&Mt!==null&&!yt&&d!==null&&!(e.f&6146))for(y=0;y<Mt.length;y++)jc(Mt[y],e);if(o!==null&&o!==e){if(kn++,o.deps!==null)for(let m=0;m<r;m+=1)o.deps[m].rv=kn;if(t!==null)for(let m of t)m.rv=kn;Mt!==null&&(n===null?n=Mt:n.push(...Mt))}return e.f&8388608&&(e.f^=8388608),v}catch(m){return Si(m)}finally{e.f^=2097152,et=t,$t=r,Mt=n,I=o,Dt=s,Pr(a),yt=l,Zr=f}}function Uf(e,t){let r=t.reactions;if(r!==null){var n=vl.call(r,e);if(n!==-1){var o=r.length-1;o===0?r=t.reactions=null:(r[n]=r[o],r.pop())}}if(r===null&&t.f&2&&(et===null||!Jt.call(et,t))){var s=t;s.f&512&&(s.f^=512,s.f&=-65537),s.v!==me&&Xn(s),xc(s),wn(s,0)}}function wn(e,t){var r=e.deps;if(r!==null)for(var n=t;n<r.length;n++)Uf(e,r[n])}function mr(e){var t=e.f;if(!(t&16384)){ue(e,1024);var r=S,n=zi;if(S=e,zi=!0,$){var o=sr;Ai(e.component_function);var s=ir;Un(e.dev_stack??ir)}try{t&16777232?Dc(e):Do(e),pa(e);var a=Di(e);if(e.teardown=typeof a==\"function\"?a:null,e.wv=Yc,$&&rr&&e.f&2048&&e.deps!==null)for(var l of e.deps)l.set_during_effect&&(l.wv=Gr(),l.set_during_effect=!1)}finally{zi=n,S=r,$&&(Ai(o),Un(s))}}}async function Lo(){if(Te)return new Promise(e=>{requestAnimationFrame(()=>e()),setTimeout(()=>e())});await Promise.resolve(),E()}function qc(){return Le.ensure().settled()}function u(e){var t=e.f,r=(t&2)!==0;if(Fc?.add(e),I!==null&&!yt){var n=S!==null&&(S.f&16384)!==0;if(!n&&(Dt===null||!Jt.call(Dt,e))){var o=I.deps;if(I.f&2097152)e.rv<kn&&(e.rv=kn,et===null&&o!==null&&o[$t]===e?$t++:et===null?et=[e]:et.push(e));else{(I.deps??=[]).push(e);var s=e.reactions;s===null?e.reactions=[I]:Jt.call(s,I)||s.push(I)}}}if($){if(!yt&&Et&&!Et.warned&&!(Et.effect.f&2097152)&&!Et.effect_deps.has(e)){Et.warned=!0,Vl(e.label);var a=or(\"traced at\");a&&console.warn(a)}if(Ro.delete(e),rr&&!yt&&wo!==null&&I!==null&&wo.reaction===I){if(e.trace)e.trace();else if(a=or(\"traced at\"),a){var l=wo.entries.get(e);l===void 0&&(l={traces:[]},wo.entries.set(e,l));var f=l.traces[l.traces.length-1];a.stack!==f?.stack&&l.traces.push(a)}}}if(It&&Rr.has(e))return Rr.get(e);if(r){var _=e;if(It){var p=_.v;return(!(_.f&1024)&&_.reactions!==null||Hc(_))&&(p=Io(_)),Rr.set(_,p),p}var v=(_.f&512)===0&&!yt&&I!==null&&(zi||(I.f&512)!==0),d=(_.f&32768)===0;Kr(_)&&(v&&(_.f|=512),na(_)),v&&!d&&(oa(_),Vc(_))}if(Be?.has(e))return Be.get(e);if(e.f&8388608)throw e.v;return e.v}function Vc(e){if(e.f|=512,e.deps!==null)for(let t of e.deps)(t.reactions??=[]).push(e),t.f&2&&!(t.f&512)&&(oa(t),Vc(t))}function Hc(e){if(e.v===me)return!0;if(e.deps===null)return!1;for(let t of e.deps)if(Rr.has(t)||t.f&2&&Hc(t))return!0;return!1}function ae(e){var t=yt;try{return yt=!0,e()}finally{yt=t}}function Gi(e){if(!(typeof e!=\"object\"||!e||e instanceof EventTarget)){if(Ie in e)Ui(e);else if(!Array.isArray(e))for(let t in e){let r=e[t];typeof r==\"object\"&&r&&Ie in r&&Ui(r)}}}function Ui(e,t=new Set){if(typeof e==\"object\"&&e!==null&&!(e instanceof EventTarget)&&!t.has(e)){t.add(e),e instanceof Date&&e.getTime();for(let n in e)try{Ui(e[n],t)}catch{}let r=cn(e);if(r!==Object.prototype&&r!==Array.prototype&&r!==Map.prototype&&r!==Set.prototype&&r!==Date.prototype){let n=_i(r);for(let o in n){let s=n[o].get;if(s)try{s.call(e)}catch{}}}}}var zi,It,I,yt,S,Dt,et,$t,Mt,Yc,kn,Zr,H=w(()=>{c();J();ee();j();X();dt();Qr();mt();Hr();pn();ye();ot();Gn();re();_a();Ut();Or();Xe();zi=!1,It=!1;i(ca,\"set_is_destroying_effect\");I=null,yt=!1;i(je,\"set_active_reaction\");S=null;i(qe,\"set_active_effect\");Dt=null;i(Mi,\"push_reaction_value\");et=null,$t=0,Mt=null;i(kc,\"set_untracked_writes\");Yc=1,kn=0,Zr=kn;i(sa,\"set_update_version\");i(Gr,\"increment_write_version\");i(Kr,\"is_dirty\");i(jc,\"schedule_possible_effect_self_invalidation\");i(Di,\"update_reaction\");i(Uf,\"remove_reaction\");i(wn,\"remove_reactions\");i(mr,\"update_effect\");i(Lo,\"tick\");i(qc,\"settled\");i(u,\"get\");i(Vc,\"reconnect\");i(Hc,\"depends_on_old_values\");i(ae,\"untrack\");i(Gi,\"deep_read_state\");i(Ui,\"deep_read\")});var zc=w(()=>{c();at();re();en();j()});function Uc(e){return Kf.includes(e)}var Xf,Xb,Kf,Wf,Kb,tn=w(()=>{c();Xf=[\"allowfullscreen\",\"async\",\"autofocus\",\"autoplay\",\"checked\",\"controls\",\"default\",\"disabled\",\"formnovalidate\",\"indeterminate\",\"inert\",\"ismap\",\"loop\",\"multiple\",\"muted\",\"nomodule\",\"novalidate\",\"open\",\"playsinline\",\"readonly\",\"required\",\"reversed\",\"seamless\",\"selected\",\"webkitdirectory\",\"defer\",\"disablepictureinpicture\",\"disableremoteplayback\"],Xb=[...Xf,\"formNoValidate\",\"isMap\",\"noModule\",\"playsInline\",\"readOnly\",\"value\",\"volume\",\"defaultValue\",\"defaultChecked\",\"srcObject\",\"noValidate\",\"allowFullscreen\",\"disablePictureInPicture\",\"disableRemotePlayback\"],Kf=[\"touchstart\",\"touchmove\"];i(Uc,\"is_passive_event\");Wf=[\"$state\",\"$state.raw\",\"$derived\",\"$derived.by\"],Kb=[...Wf,\"$state.eager\",\"$state.snapshot\",\"$props\",\"$props.id\",\"$bindable\",\"$effect\",\"$effect.pre\",\"$effect.tracking\",\"$effect.root\",\"$effect.pending\",\"$inspect\",\"$inspect().with\",\"$inspect.trace\",\"$host\"]});var Xc=w(()=>{c();X();tn();H();Xe()});var ha=w(()=>{c()});var Kc=w(()=>{c();X();re();ce();ye()});function Q(e,t,r){(t[Fo]??={})[e]=r}function kt(e){for(var t=0;t<e.length;t++)va.add(e[t]);for(var r of Xi)r(e)}function ma(e){var t=this,r=t.ownerDocument,n=e.type,o=e.composedPath?.()||[],s=o[0]||e.target;Wc=e;var a=0,l=Wc===e&&e[Fo];if(l){var f=o.indexOf(l);if(f!==-1&&(t===document||t===window)){e[Fo]=t;return}var _=o.indexOf(t);if(_===-1)return;f<=_&&(a=f)}if(s=o[a]||e.target,s!==t){tt(e,\"currentTarget\",{configurable:!0,get(){return s||r}});var p=I,v=S;je(null),qe(null);try{for(var d,b=[];s!==null;){var y=s.assignedSlot||s.parentNode||s.host||null;try{var m=s[Fo]?.[n];m!=null&&(!s.disabled||e.target===s)&&m.call(s,e)}catch(h){d?b.push(h):d=h}if(e.cancelBubble||y===t||y===null)break;s=y}if(d){for(let h of b)queueMicrotask(()=>{throw h});throw d}}finally{e[Fo]=t,delete e.currentTarget,je(p),qe(v)}}}var Fo,va,Xi,Wc,Yo=w(()=>{c();j();ee();ce();lr();re();Xe();H();Ut();Fo=Symbol(\"events\"),va=new Set,Xi=new Set;i(Q,\"delegated\");i(kt,\"delegate\");Wc=null;i(ma,\"handle_event_propagation\")});function Qc(e){return Zf?.createHTML(e)??e}function Ki(e){var t=Dr(\"template\");return t.innerHTML=Qc(e.replaceAll(\"<!>\",\"<!---->\")),t.content}var Zf,Wi=w(()=>{c();Pe();Zf=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(\"svelte-trusted-html\",{createHTML:e=>e});i(Qc,\"create_trusted_html\");i(Ki,\"create_fragment_from_html\")});function fr(e,t){var r=S;r.nodes===null&&(r.nodes={start:e,end:t,a:null,t:null})}function W(e,t){var r=(t&1)!==0,n=(t&2)!==0,o,s=!e.startsWith(\"<!>\");return()=>{if(P)return fr(Y,null),Y;o===void 0&&(o=Ki(s?e:\"<!>\"+e),r||(o=it(o)));var a=n||To?document.importNode(o,!0):o.cloneNode(!0);if(r){var l=it(a),f=a.lastChild;fr(l,f)}else fr(a,a);return a}}function Zn(){if(P)return fr(Y,null),Y;var e=document.createDocumentFragment(),t=document.createComment(\"\"),r=Ve();return e.append(t,r),fr(t,r),e}function z(e,t){if(P){var r=S;(!(r.f&32768)||r.nodes.end===null)&&(r.nodes.end=Y),Ke();return}e!==null&&e.before(t)}var An=w(()=>{c();ce();Pe();Wi();H();re();X();i(fr,\"assign_nodes\");i(W,\"from_html\");i(Zn,\"comment\");i(z,\"append\")});function we(e,t){var r=t==null?\"\":typeof t==\"object\"?`${t}`:t;r!==(e.__t??=e.nodeValue)&&(e.__t=r,e.nodeValue=`${r}`)}function Cn(e,t){return Zc(e,t)}function Zi(e,t){Li(),t.intro=t.intro??!1;let r=t.target,n=P,o=Y;try{for(var s=it(r);s&&(s.nodeType!==Yt||s.data!==Hn);)s=We(s);if(!s)throw Sr;De(!0),pe(s);let a=Zc(e,{...t,anchor:s});return De(!1),a}catch(a){if(a instanceof Error&&a.message.split(`\n`).some(l=>l.startsWith(\"https://svelte.dev/e/\")))throw a;return a!==Sr&&console.warn(\"Failed to hydrate: \",a),t.recover===!1&&Rl(),Li(),Mo(r),De(!1),Cn(e,t)}finally{De(n),pe(o)}}function Zc(e,{target:t,anchor:r,props:n={},events:o,context:s,intro:a=!0,transformError:l}){Li();var f=void 0,_=Ic(()=>{var p=r??t.appendChild(Ve());Js(p,{pending:()=>{}},b=>{ne({});var y=L;if(s&&(y.c=s),o&&(n.$$events=o),P&&fr(b,null),ba=a,f=e(b,n)||{},ba=!0,P&&(S.nodes.end=Y,Y===null||Y.nodeType!==Yt||Y.data!==fn))throw dn(),Sr;oe()},l);var v=new Set,d=i(b=>{for(var y=0;y<b.length;y++){var m=b[y];if(!v.has(m)){v.add(m);var h=Uc(m);for(let k of[t,document]){var x=Qi.get(k);x===void 0&&(x=new Map,Qi.set(k,x));var C=x.get(m);C===void 0?(k.addEventListener(m,ma,{passive:h}),x.set(m,1)):x.set(m,C+1)}}}},\"event_handle\");return d(qn(va)),Xi.add(d),()=>{for(var b of v)for(let h of[t,document]){var y=Qi.get(h),m=y.get(b);--m==0?(h.removeEventListener(b,ma),y.delete(b),y.size===0&&Qi.delete(h)):y.set(b,m)}Xi.delete(d),p!==r&&p.parentNode?.removeChild(p)}});return $a.set(f,_),f}function Ji(e,t){let r=$a.get(e);return r?($a.delete(e),r(t)):($&&(Ie in e?Wl():Kl()),Promise.resolve())}var ba,Qi,$a,Sn=w(()=>{c();J();Pe();re();H();ye();j();ce();ee();Yo();Xe();Ge();An();tn();X();Ri();ba=!0;i(we,\"set_text\");i(Cn,\"mount\");i(Zi,\"hydrate\");Qi=new Map;i(Zc,\"_mount\");$a=new WeakMap;i(Ji,\"unmount\")});var Jc=w(()=>{c();re();X();ce();j();dt();Sn();H()});var eu=w(()=>{c();ee();X();re();ye();Xe();tn()});var tu=w(()=>{c();Ge();ye();re()});var ru=w(()=>{c();re();zn();j();H();pn()});var nu=w(()=>{c();Wr();H();ce()});var ou=w(()=>{c();Ge()});var Xt,Pn=w(()=>{c();ot();j();X();ce();Pe();J();Xt=class{anchor;#e=new Map;#n=new Map;#r=new Map;#i=new Set;#o=!0;constructor(t,r=!0){this.anchor=t,this.#o=r}#s=t=>{if(this.#e.has(t)){var r=this.#e.get(t),n=this.#n.get(r);if(n)Bo(n),this.#i.delete(r);else{var o=this.#r.get(r);o&&(this.#n.set(r,o.effect),this.#r.delete(r),$&&(o.fragment.lastChild[Is]=this.anchor),o.fragment.lastChild.remove(),this.anchor.before(o.fragment),n=o.effect)}for(let[s,a]of this.#e){if(this.#e.delete(s),s===t)break;let l=this.#r.get(a);l&&(ke(l.effect),this.#r.delete(a))}for(let[s,a]of this.#n){if(s===r||this.#i.has(s))continue;let l=i(()=>{if(Array.from(this.#e.values()).includes(s)){var _=document.createDocumentFragment();Kn(a,_),_.append(Ve()),this.#r.set(s,{effect:a,fragment:_})}else ke(a);this.#i.delete(s),this.#n.delete(s)},\"on_destroy\");this.#o||!n?(this.#i.add(s),gr(a,l,!1)):l()}}};#t=t=>{this.#e.delete(t);let r=Array.from(this.#e.values());for(let[n,o]of this.#r)r.includes(n)||(ke(o.effect),this.#r.delete(n))};ensure(t,r){var n=D,o=Fi();if(r&&!this.#n.has(t)&&!this.#r.has(t))if(o){var s=document.createDocumentFragment(),a=Ve();s.append(a),this.#r.set(t,{effect:Ye(()=>r(a)),fragment:s})}else this.#n.set(t,Ye(()=>r(this.anchor)));if(this.#e.set(n,t),o){for(let[l,f]of this.#n)l===t?n.unskip_effect(f):n.skip_effect(f);for(let[l,f]of this.#r)l===t?n.unskip_effect(f.effect):n.skip_effect(f.effect);n.oncommit(this.#s),n.ondiscard(this.#t)}else P&&(this.anchor=Y),this.#s(n)}};i(Xt,\"BranchManager\")});var iu=w(()=>{c();ee();j();dt();ce();lr();re();ye();ot();Pn();Wr()});function At(e,t,r=!1){var n;P&&(n=Y,Ke());var o=new Xt(e),s=r?65536:0;function a(l,f){if(P){var _=yo(n);if(l!==parseInt(_.substring(1))){var p=hr();pe(p),o.anchor=p,De(!1),o.ensure(l,f),De(!0);return}}o.ensure(l,f)}i(a,\"update_branch\"),bt(()=>{var l=!1;t((f,_=0)=>{l=!0,a(_,f)}),l||a(-1,null)},s)}var su=w(()=>{c();X();ce();j();Pn();i(At,\"if_block\")});function ya(e,t,r){P&&Ke();var n=new Xt(e),o=!ar();bt(()=>{var s=t();s!==s&&(s=od),o&&s!==null&&typeof s==\"object\"&&(s={}),n.ensure(s,r)})}var od,au=w(()=>{c();ye();j();ce();Pn();od=Symbol(\"NaN\");i(ya,\"key\")});var lu=w(()=>{c();j();ce();Pe()});function cd(e,t,r){for(var n=[],o=t.length,s,a=t.length,l=0;l<o;l++){let v=t[l];gr(v,()=>{if(s){if(s.pending.delete(v),s.done.add(v),s.pending.size===0){var d=e.outrogroups;xa(e,qn(s.done)),d.delete(s),d.size===0&&(e.outrogroups=null)}}else a-=1},!1)}if(a===0){var f=n.length===0&&r!==null;if(f){var _=r,p=_.parentNode;Mo(p),p.append(_),e.items.clear()}xa(e,t,!f)}else s={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(s)}function xa(e,t,r=!0){var n;if(e.pending.size>0){n=new Set;for(let a of e.pending.values())for(let l of a)n.add(e.items.get(l).e)}for(var o=0;o<t.length;o++){var s=t[o];if(n?.has(s)){s.f|=33554432;let a=document.createDocumentFragment();Kn(s,a)}else ke(t[o],r)}}function wa(e,t,r,n,o,s=null){var a=e,l=new Map,f=(t&4)!==0;if(f){var _=e;a=P?pe(it(_)):_.appendChild(Ve())}P&&Ke();var p=null,v=yn(()=>{var k=r();return _r(k)?k:k==null?[]:qn(k)});$&&ct(v,\"{#each ...}\");var d,b=new Map,y=!0;function m(k){C.effect.f&16384||(C.pending.delete(k),C.fallback=p,ud(C,d,a,t,n),p!==null&&(d.length===0?p.f&33554432?(p.f^=33554432,qo(p,null,a)):Bo(p):gr(p,()=>{p=null})))}i(m,\"commit\");function h(k){C.pending.delete(k)}i(h,\"discard\");var x=bt(()=>{d=u(v);var k=d.length;let V=!1;if(P){var Z=yo(a)===un;Z!==(k===0)&&(a=hr(),pe(a),De(!1),V=!0)}for(var U=new Set,G=D,Ce=Fi(),te=0;te<k;te+=1){P&&Y.nodeType===Yt&&Y.data===fn&&(a=Y,V=!0,De(!1));var He=d[te],M=n(He,te);if($){var _e=n(He,te);M!==_e&&El(String(te),String(M),String(_e))}var be=y?null:l.get(M);be?(be.v&&ur(be.v,He),be.i&&ur(be.i,te),Ce&&G.unskip_effect(be.e)):(be=fd(l,y?a:cu??=Ve(),He,M,te,o,t,r),y||(be.e.f|=33554432),l.set(M,be)),U.add(M)}if(k===0&&s&&!p&&(y?p=Ye(()=>s(a)):(p=Ye(()=>s(cu??=Ve())),p.f|=33554432)),k>U.size&&($?dd(d,n):Bs(\"\",\"\",\"\")),P&&k>0&&pe(hr()),!y)if(b.set(G,U),Ce){for(let[ze,lt]of l)U.has(ze)||G.skip_effect(lt.e);G.oncommit(m),G.ondiscard(h)}else m(G);V&&De(!0),u(v)}),C={effect:x,flags:t,items:l,pending:b,outrogroups:null,fallback:p};y=!1,P&&(a=Y)}function jo(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function ud(e,t,r,n,o){var s=(n&8)!==0,a=t.length,l=e.items,f=jo(e.effect.first),_,p=null,v,d=[],b=[],y,m,h,x;if(s)for(x=0;x<a;x+=1)y=t[x],m=o(y,x),h=l.get(m).e,h.f&33554432||(h.nodes?.a?.measure(),(v??=new Set).add(h));for(x=0;x<a;x+=1){if(y=t[x],m=o(y,x),h=l.get(m).e,e.outrogroups!==null)for(let He of e.outrogroups)He.pending.delete(h),He.done.delete(h);if(h.f&8192&&(Bo(h),s&&(h.nodes?.a?.unfix(),(v??=new Set).delete(h))),h.f&33554432)if(h.f^=33554432,h===f)qo(h,null,r);else{var C=p?p.next:f;h===e.effect.last&&(e.effect.last=h.prev),h.prev&&(h.prev.next=h.next),h.next&&(h.next.prev=h.prev),rn(e,p,h),rn(e,h,C),qo(h,C,r),p=h,d=[],b=[],f=jo(p.next);continue}if(h!==f){if(_!==void 0&&_.has(h)){if(d.length<b.length){var k=b[0],V;p=k.prev;var Z=d[0],U=d[d.length-1];for(V=0;V<d.length;V+=1)qo(d[V],k,r);for(V=0;V<b.length;V+=1)_.delete(b[V]);rn(e,Z.prev,U.next),rn(e,p,Z),rn(e,U,k),f=k,p=U,x-=1,d=[],b=[]}else _.delete(h),qo(h,f,r),rn(e,h.prev,h.next),rn(e,h,p===null?e.effect.first:p.next),rn(e,p,h),p=h;continue}for(d=[],b=[];f!==null&&f!==h;)(_??=new Set).add(f),b.push(f),f=jo(f.next);if(f===null)continue}h.f&33554432||d.push(h),p=h,f=jo(h.next)}if(e.outrogroups!==null){for(let He of e.outrogroups)He.pending.size===0&&(xa(e,qn(He.done)),e.outrogroups?.delete(He));e.outrogroups.size===0&&(e.outrogroups=null)}if(f!==null||_!==void 0){var G=[];if(_!==void 0)for(h of _)h.f&8192||G.push(h);for(;f!==null;)!(f.f&8192)&&f!==e.fallback&&G.push(f),f=jo(f.next);var Ce=G.length;if(Ce>0){var te=n&4&&a===0?r:null;if(s){for(x=0;x<Ce;x+=1)G[x].nodes?.a?.measure();for(x=0;x<Ce;x+=1)G[x].nodes?.a?.fix()}cd(e,G,te)}}s&&Ze(()=>{if(v!==void 0)for(h of v)h.nodes?.a?.apply()})}function fd(e,t,r,n,o,s,a,l){var f=a&1?a&16?_t(r):vn(r,!1,!1):null,_=a&2?_t(o):null;return $&&f&&(f.trace=()=>{l()[_?.v??o]}),{v:f,i:_,e:Ye(()=>(s(t,f??r,_??o,l),()=>{e.delete(n)}))}}function qo(e,t,r){if(e.nodes)for(var n=e.nodes.start,o=e.nodes.end,s=t&&!(t.f&33554432)?t.nodes.start:r;n!==null;){var a=We(n);if(s.before(n),n===o)return;n=a}}function rn(e,t,r){t===null?e.effect.first=r:t.next=r,r===null?e.effect.last=t:r.prev=t}function dd(e,t){let r=new Map,n=e.length;for(let o=0;o<n;o++){let s=t(e[o],o);if(r.has(s)){let a=String(r.get(s)),l=String(o),f=String(s);f.startsWith(\"[object \")&&(f=null),Bs(a,l,f)}r.set(s,o)}}var cu,fu=w(()=>{c();re();ce();Pe();j();dt();ee();X();lr();H();J();Qr();ot();Ge();Hr();i(cd,\"pause_effects\");i(xa,\"destroy_effects\");i(wa,\"each\");i(jo,\"skip_to_branch\");i(ud,\"reconcile\");i(fd,\"create_item\");i(qo,\"move\");i(rn,\"link\");i(dd,\"validate_each_keys\")});var du=w(()=>{c();re();j();ce();An();Xe();tn();J();ye();Pe();H();X()});var pu=w(()=>{c();ce()});var Ea=w(()=>{c();tn();Ys();bo();bo()});function Mr(e,t,...r){var n=new Xt(e);bt(()=>{let o=t()??null;$&&o==null&&Il(),n.ensure(o,o&&(s=>o(s,...r)))},65536)}function _u(e){return(t,...r)=>{var n=e(...r),o;if(P)o=Y,Ke();else{var s=n.render().trim(),a=Ki(s);o=it(a),$&&(We(o)!==null||o.nodeType!==gi)&&Xl(),t.before(o)}let l=n.setup?.(o);fr(o,o),typeof l==\"function\"&&pt(l)}}var Ta=w(()=>{c();X();j();ye();ce();Wi();An();Xe();Ge();J();Pe();Ea();Pn();i(Mr,\"snippet\");i(_u,\"createRawSnippet\")});var hu=w(()=>{c();X();j();ce();Pn();re()});var ka=w(()=>{c();ee();J()});var vu=w(()=>{c();ka()});var Aa=w(()=>{c();ee();j();H();vu();Sn();re();X();lr();Ut()});var mu=w(()=>{c();re();ce();Pe();j();Sn();H();ye();J();X();An();tn();Pn();Aa()});var gu=w(()=>{c();ce();Pe();j();X()});var bu=w(()=>{c();J();ha();j();Pe()});function Vo(e,t,r){Tt(()=>{var n=ae(()=>t(e,r?.())||{});if(r&&n?.update){var o=!1,s={};Fe(()=>{var a=r();Gi(a),o&&wi(s,a)&&(s=a,n.update(a))}),o=!0}if(n?.destroy)return()=>n.destroy()})}var $u=w(()=>{c();j();xo();H();i(Vo,\"action\")});function Ho(e,t){var r=void 0,n;da(()=>{r!==(r=t())&&(n&&(ke(n),n=null),r&&(n=Ye(()=>{Tt(()=>r(e))})))})}var es=w(()=>{c();j();i(Ho,\"attach\")});var yu=w(()=>{c()});function xu(e){var t,r,n=\"\";if(typeof e==\"string\"||typeof e==\"number\")n+=e;else if(typeof e==\"object\")if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(r=xu(e[t]))&&(n&&(n+=\" \"),n+=r)}else for(r in e)e[r]&&(n&&(n+=\" \"),n+=r);return n}function wu(){for(var e,t,r=0,n=\"\",o=arguments.length;r<o;r++)(e=arguments[r])&&(t=xu(e))&&(n&&(n+=\" \"),n+=t);return n}var Eu=w(()=>{c();i(xu,\"r\");i(wu,\"clsx\")});function Br(e){return typeof e==\"object\"?wu(e):e??\"\"}function Au(e,t,r){var n=e==null?\"\":\"\"+e;if(t&&(n=n?n+\" \"+t:t),r){for(var o of Object.keys(r))if(r[o])n=n?n+\" \"+o:o;else if(n.length)for(var s=o.length,a=0;(a=n.indexOf(o,a))>=0;){var l=a+s;(a===0||Tu.includes(n[a-1]))&&(l===n.length||Tu.includes(n[l]))?n=(a===0?\"\":n.substring(0,a))+n.substring(l+1):a=l}}return n===\"\"?null:n}function ku(e,t=!1){var r=t?\" !important;\":\";\",n=\"\";for(var o of Object.keys(e)){var s=e[o];s!=null&&s!==\"\"&&(n+=\" \"+o+\": \"+s+r)}return n}function Ca(e){return e[0]!==\"-\"||e[1]!==\"-\"?e.toLowerCase():e}function Cu(e,t){if(t){var r=\"\",n,o;if(Array.isArray(t)?(n=t[0],o=t[1]):n=t,e){e=String(e).replaceAll(/\\s*\\/\\*.*?\\*\\/\\s*/g,\"\").trim();var s=!1,a=0,l=!1,f=[];n&&f.push(...Object.keys(n).map(Ca)),o&&f.push(...Object.keys(o).map(Ca));var _=0,p=-1;let m=e.length;for(var v=0;v<m;v++){var d=e[v];if(l?d===\"/\"&&e[v-1]===\"*\"&&(l=!1):s?s===d&&(s=!1):d===\"/\"&&e[v+1]===\"*\"?l=!0:d==='\"'||d===\"'\"?s=d:d===\"(\"?a++:d===\")\"&&a--,!l&&s===!1&&a===0){if(d===\":\"&&p===-1)p=v;else if(d===\";\"||v===m-1){if(p!==-1){var b=Ca(e.substring(_,p).trim());if(!f.includes(b)){d!==\";\"&&v++;var y=e.substring(_,v).trim();r+=\" \"+y+\";\"}}_=v+1,p=-1}}}}return n&&(r+=ku(n)),o&&(r+=ku(o,!0)),r=r.trim(),r===\"\"?null:r}return e==null?null:String(e)}var Tu,zo=w(()=>{c();yu();Eu();ee();i(Br,\"clsx\");Tu=[...` \t\n\\r\\f\\xA0\\v\\uFEFF`];i(Au,\"to_class\");i(ku,\"append_styles\");i(Ca,\"to_css_name\");i(Cu,\"to_style\")});function Ae(e,t,r,n,o,s){var a=e.__className;if(P||a!==r||a===void 0){var l=Au(r,n,s);(!P||l!==e.getAttribute(\"class\"))&&(l==null?e.removeAttribute(\"class\"):t?e.className=l:e.setAttribute(\"class\",l)),e.__className=r}else if(s&&o!==s)for(var f in s){var _=!!s[f];(o==null||_!==!!o[f])&&e.classList.toggle(f,_)}return s}var Sa=w(()=>{c();zo();ce();i(Ae,\"set_class\")});function Pa(e,t={},r,n){for(var o in r){var s=r[o];t[o]!==s&&(r[o]==null?e.style.removeProperty(o):e.style.setProperty(o,s,n))}}function Nn(e,t,r,n){var o=e.__style;if(P||o!==t){var s=Cu(t,n);(!P||s!==e.getAttribute(\"style\"))&&(s==null?e.removeAttribute(\"style\"):e.style.cssText=s),e.__style=t}else n&&(Array.isArray(n)?(Pa(e,r?.[0],n[0]),Pa(e,r?.[1],n[1],\"important\")):Pa(e,r,n));return n}var Na=w(()=>{c();zo();ce();i(Pa,\"update_styles\");i(Nn,\"set_style\")});var Oa=w(()=>{c();j();Ut();En();ee();Xe();ot();mt()});function Ct(e){if(P){var t=!1,r=i(()=>{if(!t){if(t=!0,e.hasAttribute(\"value\")){var n=e.value;Ee(e,\"value\",null),e.value=n}if(e.hasAttribute(\"checked\")){var o=e.checked;Ee(e,\"checked\",null),e.checked=o}}},\"remove_defaults\");e.__on_r=r,Ze(r),ji()}}function Ee(e,t,r,n){var o=kd(e);if(P&&(o[t]=e.getAttribute(t),t===\"src\"||t===\"srcset\"||t===\"href\"&&e.nodeName===Td)){n||Cd(e,t,r??\"\");return}o[t]!==(o[t]=r)&&(t===\"loading\"&&(e[gl]=r),r==null?e.removeAttribute(t):typeof r!=\"string\"&&Ad(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function kd(e){return e.__attributes??={[wd]:e.nodeName.includes(\"-\"),[Ed]:e.namespaceURI===$i}}function Ad(e){var t=e.getAttribute(\"is\")||e.nodeName,r=Su.get(t);if(r)return r;Su.set(t,r=[]);for(var n,o=e,s=Element.prototype;s!==o;){n=_i(o);for(var a in n)n[a].set&&r.push(a);o=cn(o)}return r}function Cd(e,t,r){$&&(t===\"srcset\"&&Sd(e,r)||Ra(e.getAttribute(t)??\"\",r)||Gl(t,e.outerHTML.replace(e.innerHTML,e.innerHTML&&\"...\"),String(r)))}function Ra(e,t){return e===t?!0:new URL(e,document.baseURI).href===new URL(t,document.baseURI).href}function Pu(e){return e.split(\",\").map(t=>t.trim().split(\" \").filter(Boolean))}function Sd(e,t){var r=Pu(e.srcset),n=Pu(t);return n.length===r.length&&n.every(([o,s],a)=>s===r[a][1]&&(Ra(r[a][0],o)||Ra(o,r[a][0])))}var yd,xd,wd,Ed,Td,Su,Nu=w(()=>{c();J();ce();ee();Yo();qi();Xe();X();lr();tn();H();es();zo();Sa();Na();re();j();Oa();Wr();yd=Symbol(\"class\"),xd=Symbol(\"style\"),wd=Symbol(\"is custom element\"),Ed=Symbol(\"is html\"),Td=Ds?\"link\":\"LINK\";i(Ct,\"remove_input_defaults\");i(Ee,\"set_attribute\");i(kd,\"get_attributes\");Su=new Map;i(Ad,\"get_setters\");i(Cd,\"check_src_in_dev_hydration\");i(Ra,\"src_url_equal\");i(Pu,\"split_srcset\");i(Sd,\"srcset_url_equal\")});var Ou=w(()=>{c();ce();Pe();Wi();es()});var Ru=w(()=>{c();Ut()});function On(e,t,r=t){var n=new WeakSet;Vi(e,\"input\",async o=>{$&&e.type===\"checkbox\"&&Ms();var s=o?e.defaultValue:e.value;if(s=Ia(e)?Da(s):s,r(s),D!==null&&n.add(D),await Lo(),s!==(s=t())){var a=e.selectionStart,l=e.selectionEnd,f=e.value.length;if(e.value=s??\"\",l!==null){var _=e.value.length;a===l&&l===f&&_>f?(e.selectionStart=_,e.selectionEnd=_):(e.selectionStart=a,e.selectionEnd=Math.min(l,_))}}}),(P&&e.defaultValue!==e.value||ae(t)==null&&e.value)&&(r(Ia(e)?Da(e.value):e.value),D!==null&&n.add(D)),Fe(()=>{$&&e.type===\"checkbox\"&&Ms();var o=t();if(e===document.activeElement){var s=Te?Co:D;if(n.has(s))return}Ia(e)&&o===Da(e.value)||e.type===\"date\"&&!o&&!e.value||o!==e.value&&(e.value=o??\"\")})}function nn(e,t,r=t){Vi(e,\"change\",n=>{var o=n?e.defaultChecked:e.checked;r(o)}),(P&&e.defaultChecked!==e.checked||ae(t)==null)&&r(e.checked),Fe(()=>{var n=t();e.checked=!!n})}function Ia(e){var t=e.type;return t===\"number\"||t===\"range\"}function Da(e){return e===\"\"?null:+e}var Iu=w(()=>{c();J();j();Ut();Ge();En();lr();ce();H();ye();ot();mt();i(On,\"bind_value\");i(nn,\"bind_checked\");i(Ia,\"is_numberlike_input\");i(Da,\"to_number\")});var Du=w(()=>{c();j();Ut()});var Mu=w(()=>{c();Ut()});var Bu=w(()=>{c();j();ee()});var on,Jn,Uo,ns,Lu,Ma,rs,Fu=w(()=>{c();j();H();Ma=class{constructor(t){fo(this,ns);fo(this,on,new WeakMap);fo(this,Jn,void 0);fo(this,Uo,void 0);$s(this,Uo,t)}observe(t,r){var n=Tr(this,on).get(t)||new Set;return n.add(r),Tr(this,on).set(t,n),za(this,ns,Lu).call(this).observe(t,Tr(this,Uo)),()=>{var o=Tr(this,on).get(t);o.delete(r),o.size===0&&(Tr(this,on).delete(t),Tr(this,Jn).unobserve(t))}}},rs=Ma;i(rs,\"ResizeObserverSingleton\"),on=new WeakMap,Jn=new WeakMap,Uo=new WeakMap,ns=new WeakSet,Lu=i(function(){return Tr(this,Jn)??$s(this,Jn,new ResizeObserver(t=>{for(var r of t){Ma.entries.set(r.target,r);for(var n of Tr(this,on).get(r.target)||[])n(r)}}))},\"#getObserver\"),ai(rs,\"entries\",new WeakMap)});function Yu(e,t){return e===t||e?.[Ie]===t}function dr(e={},t,r,n){var o=L.r,s=S;return Tt(()=>{var a,l;return Fe(()=>{a=l,l=n?.()||[],ae(()=>{e!==r(...l)&&(t(e,...l),a&&Yu(r(...a),e)&&t(null,...a))})}),()=>{let f=s;for(;f!==o&&f.parent!==null&&f.parent.f&33554432;)f=f.parent;let _=i(()=>{l&&Yu(r(...l),e)&&t(null,...l)},\"teardown\"),p=f.teardown;f.teardown=()=>{_(),p?.()}}}),e}var ju=w(()=>{c();X();ye();j();H();i(Yu,\"is_bound_this\");i(dr,\"bind_this\")});var qu=w(()=>{c();j();Ut()});var Vu=w(()=>{c();j();Ut()});var Ba=w(()=>{c();ee();j();Yo()});var Hu=w(()=>{c();ee();ye();Qr();j();H()});function fe(e,t,r){e.$$events||={},e.$$events[t]||=[],e.$$events[t].push(r)}function de(e){for(var t in e)t in this&&(this[t]=e[t])}var zu=w(()=>{c();dt();H();ee();i(fe,\"add_legacy_event_listener\");i(de,\"update_legacy_props\")});function A(e,t,r,n){var o=!vr||(r&2)!==0,s=(r&8)!==0,a=(r&16)!==0,l=n,f=!0,_=i(()=>(f&&(f=!1,l=a?ae(n):n),l),\"get_fallback\");let p;if(s){var v=Ie in e||go in e;p=xt(e,t)?.set??(v&&t in e?k=>e[t]=k:void 0)}var d,b=!1;s?[d,b]=Xs(()=>e[t]):d=e[t],d===void 0&&n!==void 0&&(d=_(),p&&(o&&Dl(t),p(d)));var y;if(o?y=i(()=>{var k=e[t];return k===void 0?_():(f=!0,k)},\"getter\"):y=i(()=>{var k=e[t];return k!==void 0&&(l=void 0),k===void 0?l:k},\"getter\"),o&&!(r&4))return y;if(p){var m=e.$$legacy;return function(k,V){return arguments.length>0?((!o||!V||m||b)&&p(V?y():k),k):y()}}var h=!1,x=(r&1?$n:yn)(()=>(h=!1,y()));$&&(x.label=t),s&&u(x);var C=S;return function(k,V){if(arguments.length>0){let Z=V?u(x):o&&s?Ir(k):k;return T(x,Z),h=!0,l!==void 0&&(l=Z),k}return It&&h||C.f&16384?x.v:u(x)}}var Uu=w(()=>{c();J();re();ee();dt();Qr();H();Ge();X();En();ko();mt();j();i(A,\"prop\")});var Gu=w(()=>{c();ye();re();j();Xe();ko();Wr()});function le(e){return new os(e)}var os,ht=w(()=>{c();X();j();dt();Sn();H();ot();ee();Ge();Xe();J();re();ye();mt();Or();Ba();i(le,\"createClassComponent\");os=class{#e;#n;constructor(t){var r=new Map,n=i((s,a)=>{var l=vn(a,!1,!1);return r.set(s,l),l},\"add_source\");let o=new Proxy({...t.props||{},$$events:{}},{get(s,a){return u(r.get(a)??n(a,Reflect.get(s,a)))},has(s,a){return a===go?!0:(u(r.get(a)??n(a,Reflect.get(s,a))),Reflect.has(s,a))},set(s,a,l){return T(r.get(a)??n(a,l),l),Reflect.set(s,a,l)}});this.#n=(t.hydrate?Zi:Cn)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),!Te&&(!t?.props?.$$host||t.sync===!1)&&E(),this.#e=o.$$events;for(let s of Object.keys(this.#n))s===\"$set\"||s===\"$destroy\"||s===\"$on\"||tt(this,s,{get(){return this.#n[s]},set(a){this.#n[s]=a},enumerable:!0});this.#n.$set=s=>{Object.assign(o,s)},this.#n.$destroy=()=>{Ji(this.#n)}}$set(t){this.#n.$set(t)}$on(t,r){this.#e[t]=this.#e[t]||[];let n=i((...o)=>r.call(this,...o),\"cb\");return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(o=>o!==n)}}$destroy(){this.#n.$destroy()}};i(os,\"Svelte4Component\")});function La(e,t,r,n){let o=r[e]?.type;if(t=o===\"Boolean\"&&typeof t!=\"boolean\"?t!=null:t,!n||!r[e])return t;if(n===\"toAttribute\")switch(o){case\"Object\":case\"Array\":return t==null?null:JSON.stringify(t);case\"Boolean\":return t?\"\":null;case\"Number\":return t??null;default:return t}else switch(o){case\"Object\":case\"Array\":return t&&JSON.parse(t);case\"Boolean\":return t;case\"Number\":return t!=null?+t:t;default:return t}}function Vd(e){let t={};return e.childNodes.forEach(r=>{t[r.slot||\"default\"]=!0}),t}var qd,Xu=w(()=>{c();ht();j();An();ee();Pe();typeof HTMLElement==\"function\"&&(qd=i(class extends HTMLElement{$$ctor;$$s;$$c;$$cn=!1;$$d={};$$r=!1;$$p_d={};$$l={};$$l_u=new Map;$$me;$$shadowRoot=null;constructor(e,t,r){super(),this.$$ctor=e,this.$$s=t,r&&(this.$$shadowRoot=this.attachShadow(r))}addEventListener(e,t,r){if(this.$$l[e]=this.$$l[e]||[],this.$$l[e].push(t),this.$$c){let n=this.$$c.$on(e,t);this.$$l_u.set(t,n)}super.addEventListener(e,t,r)}removeEventListener(e,t,r){if(super.removeEventListener(e,t,r),this.$$c){let n=this.$$l_u.get(t);n&&(n(),this.$$l_u.delete(t))}}async connectedCallback(){if(this.$$cn=!0,!this.$$c){let e=function(n){return o=>{let s=Dr(\"slot\");n!==\"default\"&&(s.name=n),z(o,s)}};if(i(e,\"create_slot\"),await Promise.resolve(),!this.$$cn||this.$$c)return;let t={},r=Vd(this);for(let n of this.$$s)n in r&&(n===\"default\"&&!this.$$d.children?(this.$$d.children=e(n),t.default=!0):t[n]=e(n));for(let n of this.attributes){let o=this.$$g_p(n.name);o in this.$$d||(this.$$d[o]=La(o,n.value,this.$$p_d,\"toProp\"))}for(let n in this.$$p_d)!(n in this.$$d)&&this[n]!==void 0&&(this.$$d[n]=this[n],delete this[n]);this.$$c=le({component:this.$$ctor,target:this.$$shadowRoot||this,props:{...this.$$d,$$slots:t,$$host:this}}),this.$$me=fa(()=>{Fe(()=>{this.$$r=!0;for(let n of Ps(this.$$c)){if(!this.$$p_d[n]?.reflect)continue;this.$$d[n]=this.$$c[n];let o=La(n,this.$$d[n],this.$$p_d,\"toAttribute\");o==null?this.removeAttribute(this.$$p_d[n].attribute||n):this.setAttribute(this.$$p_d[n].attribute||n,o)}this.$$r=!1})});for(let n in this.$$l)for(let o of this.$$l[n]){let s=this.$$c.$on(n,o);this.$$l_u.set(o,s)}this.$$l={}}}attributeChangedCallback(e,t,r){this.$$r||(e=this.$$g_p(e),this.$$d[e]=La(e,r,this.$$p_d,\"toProp\"),this.$$c?.$set({[e]:this.$$d[e]}))}disconnectedCallback(){this.$$cn=!1,Promise.resolve().then(()=>{!this.$$cn&&this.$$c&&(this.$$c.$destroy(),this.$$me(),this.$$c=void 0)})}$$g_p(e){return Ps(this.$$p_d).find(t=>this.$$p_d[t].attribute===e||!this.$$p_d[t].attribute&&t.toLowerCase()===e)||e}},\"SvelteElement\"));i(La,\"get_custom_element_value\");i(Vd,\"get_custom_elements_slots\")});var Ku=w(()=>{c();X();zn();Xe();H()});var at=w(()=>{c();zc();re();ye();Xc();ha();Kc();Jc();eu();tu();Hr();ru();nu();ou();iu();su();au();lu();fu();du();pu();Ta();hu();mu();gu();bu();$u();es();Nu();Sa();Yo();qi();Ou();Na();Aa();Ru();Iu();Du();Mu();Bu();Oa();Fu();ju();qu();Vu();ce();Ba();Hu();zu();An();Wr();ot();Qr();j();dt();Uu();ko();Ri();_a();Sn();H();Gu();ka();En();Xu();Pe();zo();zn();ee();Ea();aa();Ku();Gn()});function Wu(e,t){if(Te||bi(\"hydratable\"),P){let r=window.__svelte?.h;if(r?.has(e))return r.get(e);$?Ol(e):Ul(e)}return t()}var Qu=w(()=>{c();mt();ce();Xe();Ge();J();i(Wu,\"hydratable\")});var Ya={};pf(Ya,{afterUpdate:()=>Xd,beforeUpdate:()=>Gd,createContext:()=>tc,createEventDispatcher:()=>Ud,createRawSnippet:()=>_u,flushSync:()=>E,fork:()=>vc,getAbortSignal:()=>Hd,getAllContexts:()=>rc,getContext:()=>js,hasContext:()=>Vs,hydratable:()=>Wu,hydrate:()=>Zi,mount:()=>Cn,onDestroy:()=>Go,onMount:()=>is,setContext:()=>qs,settled:()=>qc,tick:()=>Lo,unmount:()=>Ji,untrack:()=>ae});function Hd(){return I===null&&Nl(),(I.ac??=new AbortController).signal}function is(e){L===null&&Cr(\"onMount\"),vr&&L.l!==null?Fa(L).m.push(e):$r(()=>{let t=ae(e);if(typeof t==\"function\")return t})}function Go(e){L===null&&Cr(\"onDestroy\"),is(()=>()=>ae(e))}function zd(e,t,{bubbles:r=!1,cancelable:n=!1}={}){return new CustomEvent(e,{detail:t,bubbles:r,cancelable:n})}function Ud(){let e=L;return e===null&&Cr(\"createEventDispatcher\"),(t,r,n)=>{let o=e.s.$$events?.[t];if(o){let s=_r(o)?o.slice():[o],a=zd(t,r,n);for(let l of s)l.call(e.x,a);return!a.defaultPrevented}return!0}}function Gd(e){L===null&&Cr(\"beforeUpdate\"),L.l===null&&Ls(\"beforeUpdate\"),Fa(L).b.push(e)}function Xd(e){L===null&&Cr(\"afterUpdate\"),L.l===null&&Ls(\"afterUpdate\"),Fa(L).a.push(e)}function Fa(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}var en=w(()=>{c();H();ee();at();Ge();mt();ye();J();ot();ye();Qu();Sn();H();Ta();if($){let e=function(t){if(!(t in globalThis)){let r;Object.defineProperty(globalThis,t,{configurable:!0,get:()=>{if(r!==void 0)return r;Ml(t)},set:n=>{r=n}})}};i(e,\"throw_rune_error\"),e(\"$state\"),e(\"$effect\"),e(\"$derived\"),e(\"$inspect\"),e(\"$props\"),e(\"$bindable\")}i(Hd,\"getAbortSignal\");i(is,\"onMount\");i(Go,\"onDestroy\");i(zd,\"create_custom_event\");i(Ud,\"createEventDispatcher\");i(Gd,\"beforeUpdate\");i(Xd,\"afterUpdate\");i(Fa,\"init_update_callbacks\")});var Zu=Wt(to=>{\"use strict\";c();Object.defineProperty(to,\"__esModule\",{value:!0});to.SvelteDialogSidebar=to.SvelteDialog=void 0;var eo=(en(),Ha(Ya)),ss=new Map,Xo=class extends Dialog{instance;anchor;titleInstance;footerInstance;constructor(t){let r=document.createComment(\"svelte-dialog-\"+t.id),n={...t};typeof t.title!=\"string\"&&(n.title=t.id),super({...n,lines:[r],component:void 0}),this.anchor=r,this.onBuild=()=>{this.dialogContentElement.appendChild(this.anchor)},this.onOpen=()=>{t.stackable||(ss.forEach(l=>l.cancel()),ss.clear());let s=ss.get(this.id);s&&(console.warn(`An existing instance of dialog \"${this.id}\" was found and will be closed before opening a new one.`),s.cancel()),ss.set(this.id,this);let a=this.dialogContentElement;if(a.style.overflow=\"visible\",this.instance=(0,eo.mount)(t.component,{target:a,anchor:this.anchor,props:t.props??{},intro:t.intro,context:t.context}),console.log(\"Mounted Svelte component for dialog\",this),typeof t.title!=\"string\"){let l=this.dialogHandleElement;for(let _ of Array.from(l.childNodes))_.remove();let f=document.createComment(\"svelte-dialog-handle-\"+guid());l.prepend(f),l.style.height=\"auto\",l.style.minHeight=\"30px\",this.titleInstance=(0,eo.mount)(t.title.component,{target:l,anchor:f,props:t.title.props??{},intro:t.intro,context:t.context})}if(t.footer){let l=this.dialogButtonBarElement,f=document.createComment(\"svelte-dialog-footer-\"+guid());l.prepend(f),this.footerInstance=(0,eo.mount)(t.footer.component,{target:l,anchor:f,props:t.footer.props??{},intro:t.intro,context:t.context})}t.onOpen?.()};let o=i(()=>this.instance?((0,eo.unmount)(this.instance,{outro:t.outro??!1}),this.instance=void 0,!0):!1,\"unmountSvelteComponent\");this.confirm=s=>{if(s instanceof KeyboardEvent)switch(!0){case t.disableKeybinds:case(t.disableConfirmKeybind&&s.key===Keybinds.extra.confirm.keybind.getCode()):case(t.disableCancelKeybind&&s.key===Keybinds.extra.cancel.keybind.getCode()):s.preventDefault(),s.stopPropagation();return}this.close(this.confirmIndex,s)},this.onButton=(...s)=>{o()&&(t.onButton?.(...s),t.onClose?.())},this.onCancel=(...s)=>{o()&&(t.onCancel?.(...s),t.onClose?.())}}get dialogContentElement(){let t=this.object?.querySelector(\".dialog_content\");if(!t)throw new Error(\"Failed to find .dialog_content element\");return t}get dialogHandleElement(){let t=this.object?.querySelector(\".dialog_handle\");if(!t)throw new Error(\"Failed to find .dialog_handle element\");return t}get dialogButtonBarElement(){let t=this.object?.querySelector(\".button_bar\");if(!t)throw new Error(\"Failed to find .button_bar element\");return t}};i(Xo,\"SvelteDialog\");to.SvelteDialog=Xo;var as=class extends Xo{pages;defaultPage;constructor(t){let r=t.onPageSwitch,n=i(l=>{let f=this.dialogContentElement;f.style.overflow=\"visible\";let _=this.pages?.[l];if(!_){console.error(`Attempted to switch pages to unknown page \"${l}\" in \"${t.id}\" dialog`);return}this.instance&&(0,eo.unmount)(this.instance,{outro:!1}),this.instance=(0,eo.mount)(_.component,{target:f,anchor:this.anchor,props:_.props,intro:!1,context:_.context}),r?.(l)},\"switchPage\");if(Object.keys(t.pages).length===0)throw new Error(\"Attempted to create a sidebar dialog with no pages\");let o=t.defaultPage??Object.keys(t.pages)[0],s=omitKeys({...t},[\"sidebar\"]),a=setInterval(()=>{for(let[l,f]of Object.entries(this.pages))f.condition!==void 0&&(this.sidebar.page_menu[l].style.display=Condition(f.condition)?\"\":\"none\")},1e3/60);super({...s,sidebar:{pages:t.pages,page:o,onPageSwitch:n,actions:t.pageSwitchActions},component:t.pages[o].component,props:t.pages[o].props,onButton(...l){clearInterval(a),t.onButton?.(...l)},onCancel(...l){clearInterval(a),t.onCancel?.(...l)}}),this.pages=t.pages,this.defaultPage=o}};i(as,\"SvelteDialogSidebar\");to.SvelteDialogSidebar=as});var Ju=Wt(cs=>{\"use strict\";c();Object.defineProperty(cs,\"__esModule\",{value:!0});cs.SveltePanel=void 0;var ja=(en(),Ha(Ya)),ls=class extends Panel{instance;deleted=!1;constructor(t){let r=i(()=>this,\"getScope\");super(t.id,{...t,component:{template:\"<div></div>\",mounted(){r().instance=(0,ja.mount)(t.component,{target:this.$el.parentElement,props:t.props,intro:t.intro,context:t.context})},beforeDestroy(){let n=r();n.instance&&(0,ja.unmount)(n.instance).then(()=>{n.instance=void 0})}}})}delete(){this.instance&&(this.deleted=!0,(0,ja.unmount)(this.instance).then(()=>{this.instance=void 0})),super.delete()}};i(ls,\"SveltePanel\");cs.SveltePanel=ls});var tf=Wt(sn=>{\"use strict\";c();var Kd=sn&&sn.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||(\"get\"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,o)}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),ef=sn&&sn.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Kd(t,e,r)};Object.defineProperty(sn,\"__esModule\",{value:!0});ef(Zu(),sn);ef(Ju(),sn)});c();c();c();var Cs=gs(As());var rl=\"brush_tuna\",nl=\"Brush Tuna\",ol=\"1.0.6\",il=[\"Texture\",\"Paint\",\"Tool\"],sl=\"5.1.4\",al={name:\"SnaveSutit & Embody Games\",email:\"snavesutit@gmail.com\",url:\"https://snavesutit.github.io/\"},ll={type:\"github\",url:\"https://github.com/SnaveSutit/brush-tuna\"},cl=\"Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features.\";var Zt={name:rl,title:nl,version:ol,tags:il,min_blockbench_version:sl,author:al,repository:ll,description:cl,main:\"./dist/index.js\",types:\"./dist/src/index.d.ts\",private:!0,scripts:{dev:\"bun .scripts/esbuild.ts --mode=dev\",build:\"bun .scripts/esbuild.ts\",test:\"vitest\",format:\"prettier --write .\"},devDependencies:{\"@types/eslint\":\"^8.21.1\",\"@types/fs-extra\":\"^11.0.4\",\"@types/js-yaml\":\"^4.0.9\",\"@types/node\":\"^17.0.21\",\"@typescript-eslint/eslint-plugin\":\"^5.54.0\",\"@typescript-eslint/parser\":\"^5.54.0\",\"blockbench-patch-manager\":\"^1.1.0\",\"blockbench-types\":\"^5.1.0-beta.1\",esbuild:\"^0.17.10\",\"esbuild-plugin-import-folder\":\"^1.0.1\",\"esbuild-plugin-import-glob\":\"^0.1.1\",\"esbuild-plugin-inline-image\":\"^0.0.9\",\"esbuild-plugin-svelte\":\"^0.1.1\",eslint:\"^8.35.0\",\"eslint-plugin-svelte\":\"^3.17.1\",\"js-yaml\":\"^4.1.0\",\"node-modules-vscode-problems-patch\":\"^1.0.9\",prettier:\"^3.8.3\",\"simple-subpub\":\"^1.2.0\",svelte:\"^5.55.5\",\"svelte-eslint-parser\":\"^1.6.0\",\"svelte-observable-store\":\"^1.0.1\",\"svelte-patching-tools\":\"^1.0.14\",\"svelte-preprocess\":\"^5.0.1\",\"svelte-preprocess-esbuild\":\"^3.0.1\",\"ts-loader\":\"^9.2.6\",typescript:\"^5.5.3\",\"typescript-eslint\":\"^8.59.1\",vitest:\"^4.1.5\",vue:\"2.7.14\"},license:\"MIT\"};c();c();var fi={en:{name:\"en\",structured:{brush_tuna:{curve_edit:{test_area:\"Test pen pressure here\",start:\"Start\",end:\"End\",ctrl_a:\"Ctrl A\",ctrl_b:\"Ctrl B\",copy:\"Copy\",copied:\"Curve copied to clipboard\",paste:\"Paste\",pasted:\"Curve pasted from clipboard\",clipboard_empty:\"Clipboard is empty\"},message:{brush_preset_switched:'Switched to brush preset \"%s\"'},action:{pressure_curve:\"Pressure Curve\",next_brush_preset:\"Next Brush Preset\",previous_brush_preset:\"Previous Brush Preset\"}}},flattened:{\"brush_tuna.curve_edit.test_area\":\"Test pen pressure here\",\"brush_tuna.curve_edit.start\":\"Start\",\"brush_tuna.curve_edit.end\":\"End\",\"brush_tuna.curve_edit.ctrl_a\":\"Ctrl A\",\"brush_tuna.curve_edit.ctrl_b\":\"Ctrl B\",\"brush_tuna.curve_edit.copy\":\"Copy\",\"brush_tuna.curve_edit.copied\":\"Curve copied to clipboard\",\"brush_tuna.curve_edit.paste\":\"Paste\",\"brush_tuna.curve_edit.pasted\":\"Curve pasted from clipboard\",\"brush_tuna.curve_edit.clipboard_empty\":\"Clipboard is empty\",\"brush_tuna.message.brush_preset_switched\":'Switched to brush preset \"%s\"',\"brush_tuna.action.pressure_curve\":\"Pressure Curve\",\"brush_tuna.action.next_brush_preset\":\"Next Brush Preset\",\"brush_tuna.action.previous_brush_preset\":\"Previous Brush Preset\"}}};function Af(){let e=settings.language.value,t=fi[e];return t||(console.warn(`Unknown language '${e}'`),t=fi.en),t}i(Af,\"getCurrentLanguage\");function Cf(e,...t){return e.replace(/%s/g,()=>t.shift()??\"\")}i(Cf,\"replaceLocalizationPlaceholders\");function Oe(e,...t){let r=Af(),n=r.flattened[e];return n??=fi.en.flattened[e],n?(t.length>0&&(n=Cf(n,...t)),n.startsWith(\"[Markdown]\")?pureMarked(n.replace(\"[Markdown]\",\"\").trim()):n):(console.warn(`Could not find translation for '${e}' in language '${r.name}'`),e)}i(Oe,\"localize\");function ul(e){let t=StateMemory.brush_presets;if(!t.length)return;BrushTuna.brushPreset||(BrushTuna.brushPreset=t[0]);let r=e===\"next\"?1:-1,o=(t.indexOf(BrushTuna.brushPreset)+r+t.length)%t.length;Painter.loadBrushPreset(t[o]),Blockbench.showQuickMessage(Oe(\"brush_tuna.message.brush_preset_switched\",BrushTuna.brushPreset.name))}i(ul,\"switchBrushPreset\");(0,Cs.registerDeletableHandlerPatch)({id:`${Zt.name}:actions/next_brush_preset`,create(){return new Action(`${Zt.name}:next_brush_preset`,{name:Oe(\"brush_tuna.action.next_brush_preset\"),icon:\"fa-forward\",category:\"paint\",click:()=>ul(\"next\"),keybind:new Keybind({key:221})})}});(0,Cs.registerDeletableHandlerPatch)({id:`${Zt.name}:actions/previous_brush_preset`,create(){return new Action(`${Zt.name}:previous_brush_preset`,{name:Oe(\"brush_tuna.action.previous_brush_preset\"),icon:\"fa-backward\",category:\"paint\",click:()=>ul(\"previous\"),keybind:new Keybind({key:219})})}});c();c();var ms=gs(As());c();var di=i((e,t,r)=>e+(t-e)*r,\"lerp\"),Ss=i((e,t,r)=>(e-t)/(r-t),\"scale\"),Sf=i((e,[t,r,n,o,s,a,l,f])=>e<=t?di(0,t,e/t):e>l?di(l,1,Ss(e,l,1)):(e=di(0,1,Ss(e,t,l)),Math.pow(1-e,3)*t+3*e*Math.pow(1-e,2)*n+3*e*e*(1-e)*s+e*e*e*l),\"getCurveX\"),mo=i((e,[t,r,n,o,s,a,l,f])=>e<=t?r:e>l?f:(e=di(0,1,Ss(e,t,l)),Math.pow(1-e,3)*r+3*e*Math.pow(1-e,2)*o+3*e*e*(1-e)*a+e*e*e*f),\"getCurveY\"),fl=i((e,t)=>({x:Sf(e,t),y:mo(e,t)}),\"getCurveXY\");c();function pi(e){let t,r;return e instanceof TouchEvent&&e.touches&&e.touches[0]&&e.touches[0]?.touchType===\"stylus\"&&e.touches[0]?.force!==void 0?(t=e.touches[0].force,r=e.touches[0].altitudeAngle):e.pressure>=0&&e.pressure<=1&&(e.pressure<1||e.pointerType!==\"touch\")&&e.pressure!==.5&&(t=e.pressure,r=e.altitudeAngle),{pressure:t,angle:r}}i(pi,\"getPressureDataFromEvent\");c();en();var of=gs(tf());c();ht();c();c();var rf=\"5\";typeof window<\"u\"&&((window.__svelte??={}).v??=new Set).add(rf);at();c();ht();at();c();ht();at();c();ht();at();function vt(e,t){if(new.target)return le({component:vt,...e});ne(t,!0);let r=A(t,\"children\",7);var n={get children(){return r()},set children(a){r(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)},o=Zn(),s=st(o);return Mr(s,()=>r()??Re),z(e,o),oe(n)}i(vt,\"DialogItem\");var Wd=W('<button class=\"svelte-1ythftc\"><i></i> </button>');function us(e,t){if(new.target)return le({component:us,...e});ne(t,!0);let r=A(t,\"icon\",7),n=A(t,\"label\",7),o=A(t,\"onclick\",7);var s={get icon(){return r()},set icon(a){r(a),E()},get label(){return n()},set label(a){n(a),E()},get onclick(){return o()},set onclick(a){o(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)};return vt(e,{children:(a,l)=>{var f=Wd(),_=q(f),p=N(_);F(f),ge(()=>{Ae(_,1,\"fa fa-\"+r()),we(p,` ${n()??\"\"}`)}),Q(\"click\",f,function(...v){o()?.apply(this,v)}),z(a,f)},$$slots:{default:!0}}),oe(s)}i(us,\"Button\");kt([\"click\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\tbutton.svelte-1ythftc {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: -webkit-fill-available;\n\t\tgap: 4px;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();at();var Qd=W('<div class=\"dialog_bar form_bar checkbox_bar svelte-1tphw2x\"><label class=\"name_space_left\"> </label> <div class=\"checkbox-line svelte-1tphw2x\"><div class=\"spacer svelte-1tphw2x\"></div> <input type=\"checkbox\" class=\"focusable_input\"/></div></div>');function Ko(e,t){if(new.target)return le({component:Ko,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"checked\",15);var s={get id(){return r()},set id(a){r(a),E()},get label(){return n()},set label(a){n(a),E()},get checked(){return o()},set checked(a){o(a),E()},$set:de,$on:(a,l)=>fe(t,a,l)};return vt(e,{children:(a,l)=>{var f=Qd(),_=q(f),p=q(_,!0);F(_);var v=N(_,2),d=N(q(v),2);Ct(d),F(v),F(f),ge(()=>{Ee(_,\"for\",r()),we(p,n()),Ee(d,\"id\",r())}),nn(d,o),z(a,f)},$$slots:{default:!0}}),oe(s)}i(Ko,\"Checkbox\");Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.checkbox_bar.svelte-1tphw2x {\n\t\tflex-direction: row;\n\t}\n\t.checkbox-line.svelte-1tphw2x {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\theight: min-content;\n\t\tflex-grow: 1;\n\t}\n\t.spacer.svelte-1tphw2x {\n\t\tflex-grow: 1;\n\t\tborder-bottom: 2px dashed var(--color-button);\n\t\theight: 0px;\n\t\tmargin: 8px;\n\t\tmargin-left: 0px;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();at();en();var Zd=W('<div class=\"spacer svelte-1tzmvuz\"></div> <!>',1),Jd=W('<div class=\"dialog_bar form_bar\"><label> </label> <div></div> <!></div>');function fs(e,t){if(new.target)return le({component:fs,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"value\",15),s=A(t,\"disabled\",7,!1),a=A(t,\"children\",7),l;yr(()=>{l=new ColorPicker(`color-picker-${guid()}`,{onChange(){let p=l.get();o(p.toHexString())}})}),$r(()=>{l.set(o())});function f(p){l.toElement(p),l.set(o())}i(f,\"mountColorPicker\"),Go(()=>{l.delete()});var _={get id(){return r()},set id(p){r(p),E()},get label(){return n()},set label(p){n(p),E()},get value(){return o()},set value(p){o(p),E()},get disabled(){return s()},set disabled(p=!1){s(p),E()},get children(){return a()},set children(p){a(p),E()},$set:de,$on:(p,v)=>fe(t,p,v)};return vt(e,{children:(p,v)=>{var d=Jd(),b=q(d),y=q(b,!0);F(b);var m=N(b,2);Vo(m,C=>f?.(C));var h=N(m,2);{var x=i(C=>{var k=Zd(),V=N(st(k),2);Mr(V,a),z(C,k)},\"consequent\");At(h,C=>{a()&&C(x)})}F(d),ge(()=>{Ae(b,1,`name_space_left ${s()?\"disabled\":\"\"}`,\"svelte-1tzmvuz\"),Ee(b,\"for\",r()),we(y,n()),Ae(m,1,Br(s()?\"disabled\":\"\"),\"svelte-1tzmvuz\")}),z(p,d)},$$slots:{default:!0}}),oe(_)}i(fs,\"ColorPicker_1\");Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.spacer.svelte-1tzmvuz {\n\t\tflex-grow: 1;\n\t\tborder-bottom: 2px dashed var(--color-button);\n\t\theight: 0px;\n\t\tmargin: 8px;\n\t\tmargin-left: 0px;\n\t}\n\t.disabled.svelte-1tzmvuz {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();en();c();ht();at();var ep=W('<div><input inputmode=\"decimal\" class=\"dark_bordered focusable_input svelte-17ahl0s\"/> <div class=\"tool numaric_input_slider slider-fix svelte-17ahl0s\"><i class=\"material-icons icon\">code</i></div></div>');function pr(e,t){if(new.target)return le({component:pr,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"step\",7),o=A(t,\"value\",15),s=A(t,\"min\",15),a=A(t,\"max\",15),l=A(t,\"disabled\",7),f=xe(void 0);function _(h){let x=1/(n()??1);return Math.round(Math.clamp(Animator.MolangParser.parse(h),s()??-1/0,a()??1/0)*x)/x}i(_,\"setValue\");function p(h,x){x.preventDefault(),convertTouchEvent(x);let C=0;function k(Z){convertTouchEvent(Z);let U=Math.trunc((Z.clientX-x.clientX)/10)*(n()??1);U!=C&&(o(_(parseFloat(h.value)+(U-C))),h.value=o().toString(),C=U)}i(k,\"move\");function V(){removeEventListeners(document,\"mousemove touchmove\",k),removeEventListeners(document,\"mouseup touchend\",V)}i(V,\"stop\"),addEventListeners(document,\"mousemove touchmove\",k),addEventListeners(document,\"mouseup touchend\",V)}i(p,\"onMousedown\");function v(h,x,C){o(_(parseFloat(h.value))),h.value=o().toString()}i(v,\"onFocusOut\");var d={get id(){return r()},set id(h){r(h),E()},get step(){return n()},set step(h){n(h),E()},get value(){return o()},set value(h){o(h),E()},get min(){return s()},set min(h){s(h),E()},get max(){return a()},set max(h){a(h),E()},get disabled(){return l()},set disabled(h){l(h),E()},$set:de,$on:(h,x)=>fe(t,h,x)},b=ep(),y=q(b);Ct(y),dr(y,h=>T(f,h),()=>u(f));var m=N(y,2);return F(b),ge(()=>{Ae(b,1,`numeric_input ${l()?\"disabled\":\"\"}`,\"svelte-17ahl0s\"),y.disabled=l()}),Q(\"focusout\",y,()=>v(u(f),s(),a())),On(y,o),Q(\"mousedown\",m,h=>p(u(f),h)),Q(\"touchstart\",m,h=>p(u(f),h),void 0,!0),z(e,b),oe(d)}i(pr,\"NumberSlider\");kt([\"focusout\",\"mousedown\",\"touchstart\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\tinput.svelte-17ahl0s {\n\t\tpadding: 0 6px !important;\n\t}\n\t.slider-fix.svelte-17ahl0s {\n\t\tright: 8px !important;\n\t}\n\t.disabled.svelte-17ahl0s {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});at();var qa=null,tp=W('<div class=\"control-point start svelte-ybvjn5\"></div> <div class=\"control-point end svelte-ybvjn5\"></div> <div class=\"control-point a svelte-ybvjn5\"></div> <div class=\"control-point b svelte-ybvjn5\"></div>',1),rp=W('<div class=\"spacer svelte-ybvjn5\"></div> <!>',1),np=W('<div class=\"dialog_bar form_bar\"><div class=\"group svelte-ybvjn5\"><div class=\"canvas-container svelte-ybvjn5\"><canvas width=\"128\" height=\"128\"></canvas> <!></div></div> <div class=\"sliders svelte-ybvjn5\"><label for=\"start\" style=\"color: var(--color-axis-x);\"> </label> <!> <!> <label for=\"end\" style=\"color: var(--color-axis-w);\"> </label> <!> <!> <label for=\"point-a\" style=\"color: var(--color-axis-y);\"> </label> <!> <!> <label for=\"point-b\" style=\"color: var(--color-axis-z);\"> </label> <!> <!></div> <!></div> <div class=\"button-bar svelte-ybvjn5\"><div class=\"test-area svelte-ybvjn5\"> </div> <div><button> </button> <button> </button></div></div>',1);function ro(e,t){if(new.target)return le({component:ro,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"startX\",15),s=A(t,\"startY\",15),a=A(t,\"pointAX\",15),l=A(t,\"pointAY\",15),f=A(t,\"pointBX\",15),_=A(t,\"pointBY\",15),p=A(t,\"endX\",15),v=A(t,\"endY\",15),d=A(t,\"disabled\",7,!1),b=A(t,\"children\",7),y=xe(void 0),m,h=xe(void 0),x=xe(void 0),C=xe(void 0),k=xe(void 0),V=xe(0),Z=i(M=>{T(V,pi(M).pressure??0,!0)},\"readTestAreaPressure\");function U(){qa=[o(),s(),a(),l(),f(),_(),p(),v()],Blockbench.showQuickMessage(Oe(\"brush_tuna.curve_edit.copied\"))}i(U,\"copyCurve\");function G(){qa?((M=>{var _e=Rs(M,8);o(_e[0]),s(_e[1]),a(_e[2]),l(_e[3]),f(_e[4]),_(_e[5]),p(_e[6]),v(_e[7])})(qa),Blockbench.showQuickMessage(Oe(\"brush_tuna.curve_edit.pasted\"))):Blockbench.showQuickMessage(Oe(\"brush_tuna.curve_edit.clipboard_empty\"))}i(G,\"pasteCurve\");let Ce=i(()=>{if(!m)return;let M=o()*u(y).width,_e=(1-s())*u(y).height,be=p()*u(y).width,ze=(1-v())*u(y).height,lt=a()*u(y).width,Bt=(1-l())*u(y).height,Pt=f()*u(y).width,Se=(1-_())*u(y).height;if(m.clearRect(0,0,u(y).width,u(y).height),m.lineWidth=2,m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue(\"--color-subtle_text\"),m.moveTo(M,_e),m.lineTo(lt,Bt),m.moveTo(be,ze),m.lineTo(Pt,Se),m.stroke(),m.closePath(),be==M?(m.beginPath(),m.moveTo(M,_e),m.strokeStyle=getComputedStyle(document.body).getPropertyValue(\"--color-accent\"),m.lineTo(be,ze),m.stroke(),m.closePath()):(m.beginPath(),m.moveTo(M,_e),m.strokeStyle=getComputedStyle(document.body).getPropertyValue(\"--color-accent\"),m.bezierCurveTo(lt,Bt,Pt,Se,be,ze),m.stroke(),m.closePath()),m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue(\"--color-accent\"),m.moveTo(M,_e),m.lineTo(0,_e),m.stroke(),m.closePath(),m.beginPath(),m.strokeStyle=getComputedStyle(document.body).getPropertyValue(\"--color-accent\"),m.moveTo(be,ze),m.lineTo(u(y).width,ze),m.stroke(),m.closePath(),u(V)>0){let{x:Nt,y:Lr}=fl(u(V),[o(),s(),a(),l(),f(),_(),p(),v()]);m.beginPath(),m.strokeStyle=\"red\",m.arc(Nt*u(y).width,(1-Lr)*u(y).height,5,0,Math.PI*2),m.stroke(),m.closePath()}},\"updateCurve\");$r(()=>{T(V,u(V),!0),o()>p()&&(o(Math.min(o(),p())),p(Math.max(o(),p()))),u(h)&&(u(h).style.left=`${o()*u(y).width-5}px`,u(h).style.bottom=`${s()*u(y).height-5}px`),u(C)&&(u(C).style.left=`${a()*u(y).width-5}px`,u(C).style.bottom=`${l()*u(y).height-5}px`),u(k)&&(u(k).style.left=`${f()*u(y).width-5}px`,u(k).style.bottom=`${_()*u(y).height-5}px`),u(x)&&(u(x).style.left=`${p()*u(y).width-5}px`,u(x).style.bottom=`${v()*u(y).height-5}px`),Ce()});let te=i((M,_e)=>{_e.preventDefault(),convertTouchEvent(_e);let be=i(lt=>{convertTouchEvent(lt);let Bt=lt,Pt=u(y).getBoundingClientRect(),Se=Math.roundTo(Math.clamp((Bt.clientX-Pt.left)/u(y).width,0,1),2),Nt=Math.roundTo(Math.clamp(1-(Bt.clientY-Pt.top)/u(y).height,0,1),2);switch(M){case\"start\":o(Se),s(Nt),Se>p()&&p(Se);break;case\"end\":p(Se),v(Nt),Se<o()&&o(Se);break;case\"A\":a(Se),l(Nt);break;case\"B\":f(Se),_(Nt);break}},\"move\"),ze=i(()=>{removeEventListeners(document,\"mousemove touchmove\",be),removeEventListeners(document,\"mouseup touchend\",ze)},\"stop\");addEventListeners(document,\"mousemove touchmove\",be),addEventListeners(document,\"mouseup touchend\",ze)},\"onmousedown\");is(()=>{m=u(y).getContext(\"2d\"),Ce()});var He={get id(){return r()},set id(M){r(M),E()},get label(){return n()},set label(M){n(M),E()},get startX(){return o()},set startX(M){o(M),E()},get startY(){return s()},set startY(M){s(M),E()},get pointAX(){return a()},set pointAX(M){a(M),E()},get pointAY(){return l()},set pointAY(M){l(M),E()},get pointBX(){return f()},set pointBX(M){f(M),E()},get pointBY(){return _()},set pointBY(M){_(M),E()},get endX(){return p()},set endX(M){p(M),E()},get endY(){return v()},set endY(M){v(M),E()},get disabled(){return d()},set disabled(M=!1){d(M),E()},get children(){return b()},set children(M){b(M),E()},$set:de,$on:(M,_e)=>fe(t,M,_e)};return vt(e,{children:(M,_e)=>{var be=np(),ze=st(be),lt=q(ze),Bt=q(lt),Pt=q(Bt);dr(Pt,ie=>T(y,ie),()=>u(y));var Se=N(Pt,2);{var Nt=i(ie=>{var Er=tp(),B=st(Er);dr(B,K=>T(C,K),()=>u(C));var se=N(B,2);dr(se,K=>T(x,K),()=>u(x));var O=N(se,2);dr(O,K=>T(C,K),()=>u(C));var Ue=N(O,2);dr(Ue,K=>T(k,K),()=>u(k)),ge(()=>Nn(B,`left: ${o()*128-5}px; bottom: ${s()*128-5}px;`)),Q(\"mousedown\",B,K=>!d()&&te(\"start\",K)),Q(\"touchstart\",B,K=>!d()&&te(\"start\",K),void 0,!0),Q(\"mousedown\",se,K=>!d()&&te(\"end\",K)),Q(\"touchstart\",se,K=>!d()&&te(\"end\",K),void 0,!0),Q(\"mousedown\",O,K=>!d()&&te(\"A\",K)),Q(\"touchstart\",O,K=>!d()&&te(\"A\",K),void 0,!0),Q(\"mousedown\",Ue,K=>!d()&&te(\"B\",K)),Q(\"touchstart\",Ue,K=>!d()&&te(\"B\",K),void 0,!0),z(ie,Er)},\"consequent\");At(Se,ie=>{u(y)&&ie(Nt)})}F(Bt),F(lt);var Lr=N(lt,2),wr=q(Lr),io=q(wr,!0);F(wr);var Rn=N(wr,2);pr(Rn,{id:\"start-x\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return o()},set value(ie){o(ie)}});var In=N(Rn,2);pr(In,{id:\"start-y\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return s()},set value(ie){s(ie)}});var Fr=N(In,2),so=q(Fr,!0);F(Fr);var Dn=N(Fr,2);pr(Dn,{id:\"end-x\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return p()},set value(ie){p(ie)}});var Mn=N(Dn,2);pr(Mn,{id:\"end-y\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return v()},set value(ie){v(ie)}});var Yr=N(Mn,2),Bn=q(Yr,!0);F(Yr);var Qo=N(Yr,2);pr(Qo,{id:\"point-ax\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return a()},set value(ie){a(ie)}});var ao=N(Qo,2);pr(ao,{id:\"point-ay\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return l()},set value(ie){l(ie)}});var an=N(ao,2),Zo=q(an,!0);F(an);var lo=N(an,2);pr(lo,{id:\"point-bx\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return f()},set value(ie){f(ie)}});var Jo=N(lo,2);pr(Jo,{id:\"point-by\",min:0,max:1,step:.01,get disabled(){return d()},get value(){return _()},set value(ie){_(ie)}}),F(Lr);var ei=N(Lr,2);{var ti=i(ie=>{var Er=rp(),B=N(st(Er),2);Mr(B,()=>b()??Re),z(ie,Er)},\"consequent_1\");At(ei,ie=>{b()&&ie(ti)})}F(ze);var ri=N(ze,2),Lt=q(ri),ni=q(Lt,!0);F(Lt);var oi=N(Lt,2),ln=q(oi),ii=q(ln,!0);F(ln);var co=N(ln,2),si=q(co,!0);F(co),F(oi),F(ri),ge((ie,Er,B,se,O,Ue,K)=>{Nn(lt,d()?\"display: none;\":\"\"),Ee(Pt,\"id\",r()),Ae(wr,1,Br(d()?\"disabled\":\"\"),\"svelte-ybvjn5\"),we(io,ie),Ae(Fr,1,Br(d()?\"disabled\":\"\"),\"svelte-ybvjn5\"),we(so,Er),Ae(Yr,1,Br(d()?\"disabled\":\"\"),\"svelte-ybvjn5\"),we(Bn,B),Ae(an,1,Br(d()?\"disabled\":\"\"),\"svelte-ybvjn5\"),we(Zo,se),we(ni,O),we(ii,Ue),we(si,K)},[()=>Oe(\"brush_tuna.curve_edit.start\"),()=>Oe(\"brush_tuna.curve_edit.end\"),()=>Oe(\"brush_tuna.curve_edit.ctrl_a\"),()=>Oe(\"brush_tuna.curve_edit.ctrl_b\"),()=>Oe(\"brush_tuna.curve_edit.test_area\"),()=>Oe(\"brush_tuna.curve_edit.copy\"),()=>Oe(\"brush_tuna.curve_edit.paste\")]),Q(\"pointerdown\",Lt,Z),Q(\"pointermove\",Lt,Z),Q(\"pointerup\",Lt,Z),Q(\"touchstart\",Lt,Z,void 0,!0),Q(\"touchmove\",Lt,Z,void 0,!0),Q(\"touchend\",Lt,Z),Q(\"click\",ln,U),Q(\"click\",co,G),z(M,be)},$$slots:{default:!0}}),oe(He)}i(ro,\"CurveEdit\");kt([\"mousedown\",\"touchstart\",\"pointerdown\",\"pointermove\",\"pointerup\",\"touchmove\",\"touchend\",\"click\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.sliders.svelte-ybvjn5 {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 0.4fr 1fr 1fr;\n\t\tmargin-left: 24px;\n\t\trow-gap: 6px;\n\t\tcolumn-gap: 8px;\n\t}\n\n\t.sliders.svelte-ybvjn5 label:where(.svelte-ybvjn5) {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t.disabled.svelte-ybvjn5 {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t.group.svelte-ybvjn5 {\n\t\tborder: 2px solid var(--color-border);\n\t\tpadding: 10px;\n\t\tborder-radius: 8px;\n\t}\n\n\t.canvas-container.svelte-ybvjn5 {\n\t\tposition: relative;\n\t\twidth: 128px;\n\t\theight: 128px;\n\t\tbox-shadow: 0px 0px 0px 10px var(--color-back);\n\t\tborder-radius: 2px;\n\t}\n\t.control-point.svelte-ybvjn5 {\n\t\tposition: absolute;\n\t\twidth: 10px;\n\t\theight: 10px;\n\t\tborder-radius: 5px;\n\t\tcursor: pointer;\n\t}\n\n\t.start.svelte-ybvjn5 {\n\t\tbackground-color: var(--color-axis-x);\n\t}\n\n\t.a.svelte-ybvjn5 {\n\t\tbackground-color: var(--color-axis-y);\n\t}\n\n\t.b.svelte-ybvjn5 {\n\t\tbackground-color: var(--color-axis-z);\n\t}\n\n\t.end.svelte-ybvjn5 {\n\t\tbackground-color: var(--color-axis-w);\n\t}\n\n\t.spacer.svelte-ybvjn5 {\n\t\tflex-grow: 1;\n\t\tborder-bottom: 2px dashed var(--color-button);\n\t\theight: 0px;\n\t\tmargin: 8px;\n\t}\n\n\t.test-area.svelte-ybvjn5 {\n\t\tfont-size: small;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\theight: 32px;\n\t\tmargin-bottom: 16px;\n\t\tborder-radius: 6px;\n\t\twidth: 152px;\n\n\t\tborder: none;\n\t\tbackground: var(--color-button);\n\t\ttext-align: center;\n\t\tvertical-align: middle;\n\t\toutline: none;\n\t\theight: 32px;\n\t\tmin-width: 100px;\n\t\tcolor: var(--color-text);\n\t\tfont-weight: normal;\n\t\tcursor: pointer;\n\t\tborder-radius: 5px;\n\t\tbox-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\n\t}\n\n\t.button-bar.svelte-ybvjn5 {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tgap: 8px;\n\t\tjustify-content: space-between;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();at();var op=W('<div class=\"dialog_bar form_bar\"><label class=\"name_space_left\"> </label> <input type=\"text\" class=\"dark_bordered half focusable_input\"/></div>');function ds(e,t){if(new.target)return le({component:ds,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"value\",15),s=A(t,\"disabled\",7,!1);var a={get id(){return r()},set id(l){r(l),E()},get label(){return n()},set label(l){n(l),E()},get value(){return o()},set value(l){o(l),E()},get disabled(){return s()},set disabled(l=!1){s(l),E()},$set:de,$on:(l,f)=>fe(t,l,f)};return vt(e,{children:(l,f)=>{var _=op(),p=q(_),v=q(p,!0);F(p);var d=N(p,2);Ct(d),F(_),ge(()=>{Ee(p,\"for\",r()),we(v,n()),Ee(d,\"id\",r()),d.disabled=s(),Nn(d,s()?\"color: var(--color-subtle_text);\":\"\")}),On(d,o),z(l,_)},$$slots:{default:!0}}),oe(a)}i(ds,\"LineEdit\");c();ht();at();var ip=W('<div class=\"dialog_bar form_bar\"><label> </label> <div><input inputmode=\"decimal\" class=\"dark_bordered focusable_input svelte-17ahl0s\"/> <div class=\"tool numaric_input_slider slider-fix svelte-17ahl0s\"><i class=\"material-icons icon\">code</i></div></div> <!></div>');function no(e,t){if(new.target)return le({component:no,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"description\",7),s=A(t,\"step\",7),a=A(t,\"value\",15),l=A(t,\"min\",15),f=A(t,\"max\",15),_=A(t,\"disabled\",7),p=A(t,\"children\",7),v=xe(void 0);function d(h){let x=1/(s()??1);return Math.round(Math.clamp(Animator.MolangParser.parse(h),l()??-1/0,f()??1/0)*x)/x}i(d,\"setValue\");function b(h,x){x.preventDefault(),convertTouchEvent(x);let C=0;function k(Z){convertTouchEvent(Z);let U=Math.trunc((Z.clientX-x.clientX)/10)*(s()??1);U!=C&&(a(d(parseFloat(h.value)+(U-C))),h.value=a().toString(),C=U)}i(k,\"move\");function V(){removeEventListeners(document,\"mousemove touchmove\",k),removeEventListeners(document,\"mouseup touchend\",V)}i(V,\"stop\"),addEventListeners(document,\"mousemove touchmove\",k),addEventListeners(document,\"mouseup touchend\",V)}i(b,\"onMousedown\");function y(h,x,C){a(d(parseFloat(h.value))),h.value=a().toString()}i(y,\"onFocusOut\");var m={get id(){return r()},set id(h){r(h),E()},get label(){return n()},set label(h){n(h),E()},get description(){return o()},set description(h){o(h),E()},get step(){return s()},set step(h){s(h),E()},get value(){return a()},set value(h){a(h),E()},get min(){return l()},set min(h){l(h),E()},get max(){return f()},set max(h){f(h),E()},get disabled(){return _()},set disabled(h){_(h),E()},get children(){return p()},set children(h){p(h),E()},$set:de,$on:(h,x)=>fe(t,h,x)};return vt(e,{children:(h,x)=>{var C=ip(),k=q(C),V=q(k,!0);F(k);var Z=N(k,2),U=q(Z);Ct(U),dr(U,te=>T(v,te),()=>u(v));var G=N(U,2);F(Z);var Ce=N(Z,2);Mr(Ce,()=>p()??Re),F(C),ge(()=>{Ae(k,1,`name_space_left ${_()?\"disabled\":\"\"}`,\"svelte-17ahl0s\"),Ee(k,\"for\",r()),we(V,n()),Ae(Z,1,`numeric_input ${_()?\"disabled\":\"\"}`,\"svelte-17ahl0s\"),U.disabled=_()}),Q(\"focusout\",U,()=>y(u(v),l(),f())),On(U,a),Q(\"mousedown\",G,te=>b(u(v),te)),Q(\"touchstart\",G,te=>b(u(v),te),void 0,!0),z(h,C)},$$slots:{default:!0}}),oe(m)}i(no,\"NumberSlider\");kt([\"focusout\",\"mousedown\",\"touchstart\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\tinput.svelte-17ahl0s {\n\t\tpadding: 0 6px !important;\n\t}\n\t.slider-fix.svelte-17ahl0s {\n\t\tright: 8px !important;\n\t}\n\t.disabled.svelte-17ahl0s {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();at();var sp=W('<div class=\"dialog_bar form_bar\"><label class=\"name_space_left\"> </label></div>');function Wo(e,t){if(new.target)return le({component:Wo,...e});ne(t,!0);let r=A(t,\"id\",7),n=A(t,\"label\",7),o=A(t,\"options\",7),s=A(t,\"value\",15),a=R(()=>Object.keys(o())[0]),l;yr(()=>{s()||o()[s()]||s(u(a))}),$r(()=>{l.set(s())});let f=i(p=>{l=new Interface.CustomElements.SelectInput(\"dialog-select\",{options:o(),value:s(),onChange(){let v=l?.node.getAttribute(\"value\");if(v==null){console.warn(\"Select value is undefined\");return}s(v)}}),p.appendChild(l.node)},\"mountSelect\");var _={get id(){return r()},set id(p){r(p),E()},get label(){return n()},set label(p){n(p),E()},get options(){return o()},set options(p){o(p),E()},get value(){return s()},set value(p){s(p),E()},$set:de,$on:(p,v)=>fe(t,p,v)};return vt(e,{children:(p,v)=>{var d=sp(),b=q(d),y=q(b,!0);F(b),F(d),Vo(d,m=>f?.(m)),ge(()=>{Ee(b,\"for\",r()),we(y,n())}),z(p,d)},$$slots:{default:!0}}),oe(_)}i(Wo,\"Select\");c();ht();at();var ap=W(\"<div><i></i></div>\");function oo(e,t){if(new.target)return le({component:oo,...e});ne(t,!0);let r=A(t,\"icon\",7),n=A(t,\"description\",7),o=A(t,\"checked\",15),s=A(t,\"disabled\",7,!1);var a={get icon(){return r()},set icon(_){r(_),E()},get description(){return n()},set description(_){n(_),E()},get checked(){return o()},set checked(_){o(_),E()},get disabled(){return s()},set disabled(_=!1){s(_),E()},$set:de,$on:(_,p)=>fe(t,_,p)},l=ap(),f=q(l);return F(l),ge(()=>{Ae(l,1,`tool toggle-icon-button ${o()?\"enabled\":\"\"} ${s()?\"disabled\":\"\"}`,\"svelte-nuhod1\"),Ee(l,\"title\",n()),Ae(f,1,`fa fa-${r()??\"\"}`,\"svelte-nuhod1\")}),Q(\"click\",l,()=>{o(s()?o():!o())}),z(e,l),oe(a)}i(oo,\"ToggleIconButton\");kt([\"click\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.toggle-icon-button.svelte-nuhod1 {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tmargin-left: 4px;\n\t}\n\t.toggle-icon-button.disabled.svelte-nuhod1 {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});var lp=W('<!> <input type=\"checkbox\"/>',1),cp=W('<!> <input type=\"checkbox\"/>',1),up=W('<!> <input type=\"checkbox\"/>',1),fp=W('<input type=\"checkbox\"/>'),dp=W('<!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <!> <div class=\"spacer svelte-1jc80ge\"></div> <!>',1);function ps(e,t){if(new.target)return le({component:ps,...e});ne(t,!0);let r=A(t,\"presets\",7),n=A(t,\"presetIndex\",15),o=A(t,\"updatePresetHash\",7),s=A(t,\"deletePreset\",7),a=R(()=>r()[n()]),l=R(()=>u(a).name),f=R(()=>u(a).shape),_=R(()=>u(a).blend_mode),p=R(()=>u(a).lock_alpha),v=R(()=>u(a).size),d=R(()=>u(a).size!=null),b=R(()=>u(a).size_pressure_curve!=null),y=R(()=>u(a).size_pressure_curve?.[0]??0),m=R(()=>u(a).size_pressure_curve?.[1]??0),h=R(()=>u(a).size_pressure_curve?.[2]??.25),x=R(()=>u(a).size_pressure_curve?.[3]??.25),C=R(()=>u(a).size_pressure_curve?.[4]??.75),k=R(()=>u(a).size_pressure_curve?.[5]??.75),V=R(()=>u(a).size_pressure_curve?.[6]??1),Z=R(()=>u(a).size_pressure_curve?.[7]??1),U=R(()=>u(a).softness),G=R(()=>u(a).softness!=null),Ce=R(()=>u(a).softness_pressure_curve!=null),te=R(()=>u(a).softness_pressure_curve?.[0]??0),He=R(()=>u(a).softness_pressure_curve?.[1]??0),M=R(()=>u(a).softness_pressure_curve?.[2]??.25),_e=R(()=>u(a).softness_pressure_curve?.[3]??.25),be=R(()=>u(a).softness_pressure_curve?.[4]??.75),ze=R(()=>u(a).softness_pressure_curve?.[5]??.75),lt=R(()=>u(a).softness_pressure_curve?.[6]??1),Bt=R(()=>u(a).softness_pressure_curve?.[7]??1),Pt=R(()=>u(a).opacity),Se=R(()=>u(a).opacity!=null),Nt=R(()=>u(a).opacity_pressure_curve!=null),Lr=R(()=>u(a).opacity_pressure_curve?.[0]??0),wr=R(()=>u(a).opacity_pressure_curve?.[1]??0),io=R(()=>u(a).opacity_pressure_curve?.[2]??.25),Rn=R(()=>u(a).opacity_pressure_curve?.[3]??.25),In=R(()=>u(a).opacity_pressure_curve?.[4]??.75),Fr=R(()=>u(a).opacity_pressure_curve?.[5]??.75),so=R(()=>u(a).opacity_pressure_curve?.[6]??1),Dn=R(()=>u(a).opacity_pressure_curve?.[7]??1),Mn=R(()=>u(a).pixel_perfect??!1),Yr=R(()=>u(a).color),Bn=R(()=>u(a).color!=null);yr(()=>{u(a).name=u(l),u(a).shape=u(f),u(a).blend_mode=u(_),u(a).lock_alpha=u(p),u(a).size=u(d)?u(v):null,u(a).size_pressure_curve=u(b)?[u(m),u(m),u(h),u(x),u(C),u(k),u(V),u(Z)]:null,u(a).softness=u(G)?u(U):null,u(a).softness_pressure_curve=u(Ce)?[u(He),u(He),u(M),u(_e),u(be),u(ze),u(lt),u(Bt)]:null,u(a).opacity=u(Se)?u(Pt):null,u(a).opacity_pressure_curve=u(Nt)?[u(wr),u(wr),u(io),u(Rn),u(In),u(Fr),u(so),u(Dn)]:null,u(a).pixel_perfect=u(Mn),u(a).color=u(Bn)?u(Yr):null,o()()});var Qo={get presets(){return r()},set presets(B){r(B),E()},get presetIndex(){return n()},set presetIndex(B){n(B),E()},get updatePresetHash(){return o()},set updatePresetHash(B){o(B),E()},get deletePreset(){return s()},set deletePreset(B){s(B),E()},$set:de,$on:(B,se)=>fe(t,B,se)},ao=dp(),an=st(ao);ds(an,{id:\"brush-name\",label:tl(\"generic.name\"),get value(){return u(l)},set value(B){T(l,B)}});var Zo=N(an,2);Wo(Zo,{id:\"brush-shape\",label:tl(\"action.brush_shape\"),options:{circle:tl(\"action.brush_shape.circle\"),square:tl(\"action.brush_shape.square\")},get value(){return u(f)},set value(B){T(f,B)}});var lo=N(Zo,2);Wo(lo,{id:\"brush-blend-mode\",label:tl(\"action.blend_mode\"),options:{unset:tl(\"generic.unset\"),default:tl(\"action.blend_mode.default\"),set_opacity:tl(\"action.blend_mode.set_opacity\"),color:tl(\"action.blend_mode.color\"),behind:tl(\"action.blend_mode.behind\"),multiply:tl(\"action.blend_mode.multiply\"),add:tl(\"action.blend_mode.add\"),lighten:tl(\"action.blend_mode.lighten\"),darken:tl(\"action.blend_mode.darken\"),screen:tl(\"action.blend_mode.screen\"),overlay:tl(\"action.blend_mode.overlay\"),difference:tl(\"action.blend_mode.difference\")},get value(){return u(_)},set value(B){T(_,B)}});var Jo=N(lo,2);Ko(Jo,{id:\"lock-alpha\",label:tl(\"action.lock_alpha\"),get checked(){return u(p)},set checked(B){T(p,B)}});var ei=N(Jo,2);{let B=R(()=>!u(d));no(ei,{id:\"size\",label:tl(\"action.slider_brush_size\"),min:1,get disabled(){return u(B)},get value(){return u(v)},set value(se){T(v,se)},children:(se,O)=>{var Ue=lp(),K=st(Ue);{let Kt=R(()=>!u(d));oo(K,{icon:\"weight-hanging\",get disabled(){return u(Kt)},get checked(){return u(b)},set checked(uo){T(b,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(d),Kt=>T(d,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ti=N(ei,2);{var ri=i(B=>{{let se=R(()=>tl(\"action.slider_brush_size\")+\" \"+Oe(\"brush_tuna.action.pressure_curve\"));ro(B,{id:\"pressure-curve\",get label(){return u(se)},get startX(){return u(y)},set startX(O){T(y,O)},get startY(){return u(m)},set startY(O){T(m,O)},get endX(){return u(V)},set endX(O){T(V,O)},get endY(){return u(Z)},set endY(O){T(Z,O)},get pointAX(){return u(h)},set pointAX(O){T(h,O)},get pointAY(){return u(x)},set pointAY(O){T(x,O)},get pointBX(){return u(C)},set pointBX(O){T(C,O)},get pointBY(){return u(k)},set pointBY(O){T(k,O)}})}},\"consequent\");At(ti,B=>{u(b)&&u(d)&&B(ri)})}var Lt=N(ti,2);{let B=R(()=>!u(Se));no(Lt,{id:\"opacity\",label:tl(\"action.slider_brush_opacity\"),min:0,max:255,get disabled(){return u(B)},get value(){return u(Pt)},set value(se){T(Pt,se)},children:(se,O)=>{var Ue=cp(),K=st(Ue);{let Kt=R(()=>!u(Se));oo(K,{icon:\"weight-hanging\",get disabled(){return u(Kt)},get checked(){return u(Nt)},set checked(uo){T(Nt,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(Se),Kt=>T(Se,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ni=N(Lt,2);{var oi=i(B=>{{let se=R(()=>tl(\"action.slider_brush_opacity\")+\" \"+Oe(\"brush_tuna.action.pressure_curve\"));ro(B,{id:\"pressure-curve\",get label(){return u(se)},get startX(){return u(Lr)},set startX(O){T(Lr,O)},get startY(){return u(wr)},set startY(O){T(wr,O)},get endX(){return u(so)},set endX(O){T(so,O)},get endY(){return u(Dn)},set endY(O){T(Dn,O)},get pointAX(){return u(io)},set pointAX(O){T(io,O)},get pointAY(){return u(Rn)},set pointAY(O){T(Rn,O)},get pointBX(){return u(In)},set pointBX(O){T(In,O)},get pointBY(){return u(Fr)},set pointBY(O){T(Fr,O)}})}},\"consequent_1\");At(ni,B=>{u(Nt)&&u(Se)&&B(oi)})}var ln=N(ni,2);{let B=R(()=>!u(G));no(ln,{id:\"softness\",label:tl(\"action.slider_brush_softness\"),min:0,max:100,get disabled(){return u(B)},get value(){return u(U)},set value(se){T(U,se)},children:(se,O)=>{var Ue=up(),K=st(Ue);{let Kt=R(()=>!u(G));oo(K,{icon:\"weight-hanging\",get disabled(){return u(Kt)},get checked(){return u(Ce)},set checked(uo){T(Ce,uo)}})}var jr=N(K,2);Ct(jr),nn(jr,()=>u(G),Kt=>T(G,Kt)),z(se,Ue)},$$slots:{default:!0}})}var ii=N(ln,2);{var co=i(B=>{{let se=R(()=>tl(\"action.slider_brush_softness\")+\" \"+Oe(\"brush_tuna.action.pressure_curve\"));ro(B,{id:\"pressure-curve\",get label(){return u(se)},get startX(){return u(te)},set startX(O){T(te,O)},get startY(){return u(He)},set startY(O){T(He,O)},get endX(){return u(lt)},set endX(O){T(lt,O)},get endY(){return u(Bt)},set endY(O){T(Bt,O)},get pointAX(){return u(M)},set pointAX(O){T(M,O)},get pointAY(){return u(_e)},set pointAY(O){T(_e,O)},get pointBX(){return u(be)},set pointBX(O){T(be,O)},get pointBY(){return u(ze)},set pointBY(O){T(ze,O)}})}},\"consequent_2\");At(ii,B=>{u(Ce)&&u(G)&&B(co)})}var si=N(ii,2);Ko(si,{id:\"pixel-perfect\",label:tl(\"action.pixel_perfect_drawing\"),get checked(){return u(Mn)},set checked(B){T(Mn,B)}});var ie=N(si,2);{let B=R(()=>!u(Bn));fs(ie,{id:\"color\",label:tl(\"data.color\"),get disabled(){return u(B)},get value(){return u(Yr)},set value(se){T(Yr,se)},children:(se,O)=>{var Ue=fp();Ct(Ue),nn(Ue,()=>u(Bn),K=>T(Bn,K)),z(se,Ue)},$$slots:{default:!0}})}var Er=N(ie,4);return us(Er,{icon:\"trash\",label:tl(\"generic.delete\"),get onclick(){return s()}}),z(e,ao),oe(Qo)}i(ps,\"BrushOptions\");Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.spacer.svelte-1jc80ge {\n\t\theight: 16px;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();at();en();var pp=W('<div class=\"brush-preset-item selected svelte-1qfyl2h\"><i></i> </div>'),_p=W('<div class=\"brush-preset-item svelte-1qfyl2h\"><i></i> </div>'),hp=W('<div class=\"brush-preset-list svelte-1qfyl2h\"><!> <div class=\"add-preset-button svelte-1qfyl2h\"><i class=\"fa fa-plus svelte-1qfyl2h\"></i></div></div>');function _s(e,t){if(new.target)return le({component:_s,...e});ne(t,!0);let r=i((m,h=Re,x=Re)=>{var C=Zn(),k=st(C);{var V=i(U=>{var G=pp(),Ce=q(G),te=N(Ce);F(G),Ho(G,()=>_),ge(()=>{Ee(G,\"title\",h().name),Ae(Ce,1,`fa fa-${h().shape===\"circle\"?\"circle\":\"square\"}`),we(te,` ${h().name??\"\"}`)}),Q(\"click\",G,()=>f(x())),z(U,G)},\"consequent\"),Z=i(U=>{var G=_p(),Ce=q(G),te=N(Ce);F(G),ge(()=>{Ee(G,\"title\",h().name),Ae(Ce,1,`fa fa-${h().shape===\"circle\"?\"circle\":\"square\"}`),we(te,` ${h().name??\"\"}`)}),Q(\"click\",G,()=>f(x())),z(U,G)},\"alternate\");At(k,U=>{n()===x()?U(V):U(Z,-1)})}z(m,C)},\"brushPresetItem\"),n=A(t,\"presetIndex\",15),o=A(t,\"presetHash\",15),s=A(t,\"presets\",7),a=A(t,\"updatePresetHash\",7);function l(){let m={name:`Preset ${s().length+1}`,shape:\"circle\",lock_alpha:!1,size:16,size_pressure_curve:null,softness:.5,softness_pressure_curve:null,opacity:1,opacity_pressure_curve:null,color:null,blend_mode:\"default\"};s().push(m),f(s().length-1),a()()}i(l,\"createPreset\");function f(m){n(m),a()()}i(f,\"selectPreset\");let _=i(m=>{m.scrollIntoView({behavior:\"instant\",block:\"center\"})},\"scrollSelectedIntoView\");Go(()=>{StateMemory.save(\"brush_presets\")});var p={get presetIndex(){return n()},set presetIndex(m){n(m),E()},get presetHash(){return o()},set presetHash(m){o(m),E()},get presets(){return s()},set presets(m){s(m),E()},get updatePresetHash(){return a()},set updatePresetHash(m){a(m),E()},$set:de,$on:(m,h)=>fe(t,m,h)},v=hp(),d=q(v);ya(d,o,m=>{var h=Zn(),x=st(h);wa(x,19,s,(C,k)=>k+C.name+C.shape,(C,k,V)=>{r(C,()=>u(k),()=>u(V))}),z(m,h)});var b=N(d,2),y=q(b);return F(b),F(v),Q(\"click\",y,l),z(e,v),oe(p)}i(_s,\"BrushPresetList\");kt([\"click\"]);Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.brush-preset-list.svelte-1qfyl2h {\n\t\tdisplay: flex;\n\t\tpadding: 8px;\n\t\tborder-radius: 8px;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tgap: 8px;\n\t\tbackground: var(--color-back);\n\t\tmargin-bottom: 24px;\n\t\tmax-height: 128px;\n\t\toverflow-y: auto;\n\t}\n\n\t.brush-preset-item.svelte-1qfyl2h {\n\t\tgap: 4px;\n\t\tbackground: var(--color-button);\n\t\tborder-radius: 8px;\n\t\tpadding: 4px 8px;\n\t\theight: 32px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tcursor: pointer;\n\t}\n\n\t.selected.svelte-1qfyl2h {\n\t\tbox-shadow: 0px 3px 0px 0px var(--color-accent);\n\t}\n\n\t.add-preset-button.svelte-1qfyl2h {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t}\n\n\t.add-preset-button.svelte-1qfyl2h i:where(.svelte-1qfyl2h) {\n\t\tcursor: pointer;\n\t}\n\n\t.add-preset-button.svelte-1qfyl2h:hover {\n\t\tbackground-color: var(--color-secondary);\n\t\tborder-radius: 4px;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});var vp=W('<div class=\"brush-options-dialog svelte-1tjprz0\"><!> <!></div>');function hs(e,t){if(new.target)return le({component:hs,...e});ne(t,!0);let r=StateMemory.brush_presets,n=xe(0),o=xe(\"\"),s=i(()=>{let d=r[u(n)];d?T(o,JSON.stringify(d),!0):T(o,\"\")},\"updatePresetHash\"),a=i(()=>{r.length!==0&&(r.splice(u(n),1),u(n)>=r.length&&T(n,r.length-1),s())},\"deletePreset\");var l={$set:de,$on:(d,b)=>fe(t,d,b)},f=vp(),_=q(f);_s(_,{get presets(){return r},updatePresetHash:s,get presetIndex(){return u(n)},set presetIndex(d){T(n,d,!0)},get presetHash(){return u(o)},set presetHash(d){T(o,d,!0)}});var p=N(_,2);{var v=i(d=>{ps(d,{get presets(){return r},deletePreset:a,updatePresetHash:s,get presetIndex(){return u(n)},set presetIndex(b){T(n,b,!0)}})},\"consequent\");At(p,d=>{r[u(n)]&&d(v)})}return F(f),z(e,f),oe(l)}i(hs,\"BrushPresetsDialog\");Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.brush-options-dialog.svelte-1tjprz0 {\n\t\tmax-height: 75vh;\n\t\toverflow-y: auto;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});c();ht();c();mt();Zl();var nf=\"data:image/png;base64,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\";at();var gp=W('<div class=\"dialog_title brush-tuna-brush-options-title svelte-4q4isa\"><img alt=\"Brush Options\" class=\"svelte-4q4isa\"/> Brush Options</div>');function vs(e,t){if(new.target)return le({component:vs,...e});ne(t,!1);var r={$set:de,$on:(s,a)=>fe(t,s,a)},n=gp(),o=q(n);return $o(),F(n),ge(()=>Ee(o,\"src\",nf)),z(e,n),oe(r)}i(vs,\"Title\");Blockbench.on(\"loaded_plugin\",e=>{if(e?.plugin?.id===\"brush_tuna\"){let t=Blockbench.addCSS(`\n\t.brush-tuna-brush-options-title.svelte-4q4isa {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tpadding-left: 0px;\n\t}\n\timg.svelte-4q4isa {\n\t\timage-rendering: initial;\n\t\twidth: 24px;\n\t\theight: 24px;\n\t\tmargin-right: 8px;\n\t}\n`);Blockbench.once(\"unloaded_plugin\",r=>{r?.plugin?.id===\"brush_tuna\"&&t?.delete()})}});function sf(){new of.SvelteDialog({id:`${Zt.name}:brush_options`,title:\"menu.brush_presets.dialog\",component:hs,singleButton:!0,onOpen(){let t=jQuery('dialog[id=\"brush_tuna:brush_options\"] .dialog_title')[0];t&&(Cn(vs,{target:t.parentElement}),t.remove())}}).show()}i(sf,\"openPenPusherBrushOptions\");(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/openBrushOptions`,target:Painter,key:\"openBrushOptions\",get(e){return function(){sf()}}});(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/loadBrushPreset`,target:Painter,key:\"loadBrushPreset\",get(e){return function(t){e.call(this,t),BarItems.lock_alpha.set(t.lock_alpha),BrushTuna.brushPreset=t}}});(0,ms.registerPropertyOverridePatch)({id:`${Zt.name}:painter/useBrush`,target:Painter,key:\"useBrush\",get(e){return function(t,r,n,o,s){let a=BarItems.slider_brush_size,l=BarItems.slider_brush_softness,f=BarItems.slider_brush_opacity,_=a.get(),p=l.get(),v=f.get();if(BrushTuna.brushPreset){let d=BrushTuna.brushPreset,{pressure:b,angle:y}=pi(s);b!==void 0&&(d.size_pressure_curve&&a.setValue(_*mo(b,d.size_pressure_curve)),d.softness_pressure_curve&&l.setValue(p*mo(b,d.softness_pressure_curve)),d.opacity_pressure_curve&&f.setValue(v*mo(b,d.opacity_pressure_curve)))}e.call(this,t,r,n,o,s),a.setValue(_),l.setValue(p),f.setValue(v)}}});c();BBPlugin.register(rl,{title:nl,author:al.name,description:cl,icon:\"icon.png\",variant:\"both\",version:ol,min_version:sl,tags:il,bug_tracker:ll.url+\"/issues\",has_changelog:!0,onload(){},onunload(){},oninstall(){},onuninstall(){}});window.BrushTuna={brushPreset:null};})();\n"
  },
  {
    "path": "plugins/brush_tuna/changelog.json",
    "content": "{\n\t\"1.0.4\": {\n\t\t\"title\": \"v1.0.4\",\n\t\t\"author\": \"SnaveSutit & Embody Games\",\n\t\t\"date\": \"2025-05-05\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\"Released the plugin!\"]\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "plugins/brush_tuna/members.yml",
    "content": "maintainers:\n  - SnaveSutit\n"
  },
  {
    "path": "plugins/cameras.js",
    "content": "let deletables = [];\n\nBBPlugin.register('cameras', {\n\ttitle: 'Cameras',\n\ticon: 'videocam',\n\tauthor: 'JannisX11',\n\tdescription: 'Adds cameras to Blockbench. Cameras allow you to view the model from different angles, and can be animated to create camera paths.',\n\tabout: 'Cameras can be added through the Edit menu. Enabling Split Screen from View > Split Screen is recommended to preview what the camera can see while editing it. Right-click the camera in the viewport to link or unlink it to the viewport.',\n\tversion: '1.2.2',\n\tmin_version: '4.3.0',\n\tvariant: 'both',\n\tonload() {\n\t\t\n\t\tclass CameraElement extends OutlinerElement {\n\t\t\tconstructor(data, uuid) {\n\t\t\t\tsuper(data, uuid)\n\t\t\t\t\n\t\t\t\tfor (var key in CameraElement.properties) {\n\t\t\t\t\tCameraElement.properties[key].reset(this);\n\t\t\t\t}\n\t\t\t\tif (data && typeof data === 'object') {\n\t\t\t\t\tthis.extend(data)\n\t\t\t\t}\n\t\t\t}\n\t\t\tget origin() {\n\t\t\t\treturn this.position;\n\t\t\t}\n\t\t\tgetWorldCenter() {\n\t\t\t\treturn THREE.fastWorldPosition(this.mesh, Reusable.vec2);\n\t\t\t}\n\t\t\textend(object) {\n\t\t\t\tfor (var key in CameraElement.properties) {\n\t\t\t\t\tCameraElement.properties[key].merge(this, object)\n\t\t\t\t}\n\t\t\t\tif (typeof object.vertices == 'object') {\n\t\t\t\t\tfor (let key in object.vertices) {\n\t\t\t\t\t\tthis.vertices[key] = object.vertices[key].slice();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.sanitizeName();\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tgetUndoCopy() {\n\t\t\t\tvar copy = new CameraElement(this)\n\t\t\t\tcopy.uuid = this.uuid;\n\t\t\t\tdelete copy.parent;\n\t\t\t\treturn copy;\n\t\t\t}\n\t\t\tgetSaveCopy() {\n\t\t\t\tvar el = {}\n\t\t\t\tfor (var key in CameraElement.properties) {\n\t\t\t\t\tCameraElement.properties[key].copy(this, el)\n\t\t\t\t}\n\t\t\t\tel.type = 'camera';\n\t\t\t\tel.uuid = this.uuid\n\t\t\t\treturn el;\n\t\t\t}\n\t\t\tselect(event, isOutlinerClick) {\n\t\t\t\tsuper.select(event, isOutlinerClick);\n\t\t\t\tif (Animator.open && Animation.selected) {\n\t\t\t\t\tAnimation.selected.getBoneAnimator(this).select(true);\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tunselect(...args) {\n\t\t\t\tsuper.unselect(...args);\n\t\t\t\tif (Animator.open && Timeline.selected_animator && Timeline.selected_animator.element == this) {\n\t\t\t\t\tTimeline.selected_animator.selected = false;\n\t\t\t\t}\n\t\t\t}\t\t\n\t\t\tupdatePreviewCamera(fov) {\n\t\t\t\tif (this.linked_preview) {\n\t\t\t\t\tlet preview = Preview.all.find(preview => preview.id == this.linked_preview);\n\t\t\t\t\tif (!preview) return;\n\n\t\t\t\t\tif (preview.isOrtho) preview.setProjectionMode(false);\n\t\t\t\t\tpreview.controls.unlinked = true;\n\n\t\t\t\t\tpreview.camera.position.copy(this.getWorldCenter());\n\t\t\t\t\tthis.mesh.getWorldQuaternion(preview.camera.quaternion);\n\t\t\t\t\t// Update controls target in case camera is controlled by controls\n\t\t\t\t\tpreview.controls.target.copy(preview.camera.position);\n\t\t\t\t\tlet offset = Reusable.vec1.set(0, 0, -16).applyQuaternion(preview.camera.quaternion);\n\t\t\t\t\tpreview.controls.target.add(offset);\n\n\t\t\t\t\tlet preview_fov = (fov || this.fov) * 1.001; // padding to fix flickering with viewport border\n\t\t\t\t\tpreview.setFOV(preview_fov);\n\t\t\t\t}\n\t\t\t}\n\t\t\tstatic behavior = {\n\t\t\t\tunique_name: true,\n\t\t\t\tmovable: true,\n\t\t\t\trotatable: true,\n\t\t\t}\n\t\t}\n\t\twindow.CameraElement = CameraElement;\n\t\t\n\t\t/*Outliner.buttons.camera_linked = {\n\t\t\tid: 'camera_linked',\n\t\t\ttitle: 'Camera Active',\n\t\t\ticon: ' fas fa-link-slash',\n\t\t\ticon_off: ' fas fa-link',\n\t\t\tadvanced_option: false\n\t\t};*/\n\t\t\tCameraElement.prototype.title = 'Camera';\n\t\t\tCameraElement.prototype.type = 'camera';\n\t\t\tCameraElement.prototype.icon = 'fas fa-video';\n\t\t\tCameraElement.prototype.movable = true;\n\t\t\tCameraElement.prototype.rotatable = true;\n\t\t\tCameraElement.prototype.needsUniqueName = true;\n\t\t\tCameraElement.prototype.menu = new Menu([\n\t\t\t\t'link_camera_to_preview',\n\t\t\t\t'camera_to_view',\n\t\t\t\t'edit_camera_properties',\n\t\t\t\t'_',\n\t\t\t\t...Outliner.control_menu_group,\n\t\t\t\t'_',\n\t\t\t\t'rename',\n\t\t\t\t'delete'\n\t\t\t]);\n\t\t\tCameraElement.prototype.buttons = [\n\t\t\t\t//Outliner.buttons.camera_linked,\n\t\t\t\tOutliner.buttons.export,\n\t\t\t\tOutliner.buttons.locked,\n\t\t\t\tOutliner.buttons.visibility,\n\t\t\t];\n\t\t\n\t\tnew Property(CameraElement, 'string', 'name', {default: 'camera'})\n\t\tnew Property(CameraElement, 'vector', 'position');\n\t\tnew Property(CameraElement, 'vector', 'rotation');\n\t\tnew Property(CameraElement, 'number', 'fov', {\n\t\t\tdefault: 70,\n\t\t\tinputs: {\n\t\t\t\telement_panel: {\n\t\t\t\t\tinput: {label: 'FOV', type: 'number', min: 1, max: 160},\n\t\t\t\t\tonChange() {\n\t\t\t\t\t\tCanvas.updateView({elements: CameraElement.selected, element_aspects: {transform: true}});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tnew Property(CameraElement, 'vector2', 'aspect_ratio', {\n\t\t\tdefault: [16, 9],\n\t\t\tinputs: {\n\t\t\t\telement_panel: {\n\t\t\t\t\tinput: {label: 'Aspect Ratio', type: 'vector', dimensions: 2},\n\t\t\t\t\tonChange() {\n\t\t\t\t\t\tCanvas.updateView({elements: CameraElement.selected, element_aspects: {transform: true}});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tnew Property(CameraElement, 'string', 'linked_preview');\n\t\tnew Property(CameraElement, 'boolean', 'camera_linked');\n\t\tnew Property(CameraElement, 'boolean', 'visibility', {default: true});\n\t\t\n\t\tOutlinerElement.registerType(CameraElement, 'camera');\n\n\t\tfunction getFrameVertices(camera, fov) {\n\t\t\tlet r = 6;\n\t\t\tlet deg = Math.degToRad(fov ?? camera.fov) / 2;\n\t\t\tlet ratio = camera.aspect_ratio[0] / camera.aspect_ratio[1];\n\t\t\tlet h = r * Math.sin(deg);\n\t\t\tlet d = r * Math.cos(deg);\n\t\t\tlet w = h * ratio;\n\n\t\t\tlet vertices = [\n\t\t\t\t0, 0, 0, -w, -h, -d,\n\t\t\t\t0, 0, 0,  w, -h, -d,\n\t\t\t\t0, 0, 0, -w,  h, -d,\n\t\t\t\t0, 0, 0,  w,  h, -d,\n\t\t\t\t-w, -h, -d,  w, -h, -d,\n\t\t\t\t-w,  h, -d,  w,  h, -d,\n\t\t\t\t-w,  h, -d, -w, -h, -d,\n\t\t\t\t w,  h, -d,  w, -h, -d,\n\t\t\t];\n\t\t\treturn vertices;\n\t\t}\n\t\t\n\t\tnew NodePreviewController(CameraElement, {\n\t\t\tsetup(element) {\n\t\t\t\tvar mesh = new THREE.Mesh(\n\t\t\t\t\tnew THREE.BoxBufferGeometry(2.4, 1.3, 1.0),\n\t\t\t\t\tnew THREE.MeshBasicMaterial({color: gizmo_colors.grid})\n\t\t\t\t);\n\t\t\t\tProject.nodes_3d[element.uuid] = mesh;\n\t\t\t\tmesh.name = element.uuid;\n\t\t\t\tmesh.type = element.type;\n\t\t\t\tmesh.isElement = true;\n\t\t\t\tmesh.visible = element.visibility;\n\t\t\t\tmesh.rotation.order = 'ZYX';\n\t\t\t\tmesh.geometry.translate(0, 0, -0.5)\n\t\t\n\t\t\t\tlet vertices = getFrameVertices(element, element.fov);\n\t\t\t\tlet geometry = new THREE.BufferGeometry();\n\t\t\t\tgeometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n\t\t\t\tmesh.line_material = new THREE.LineBasicMaterial({color: gizmo_colors.grid});\n\t\t\t\t\n\t\t\t\tlet frame = new THREE.LineSegments(geometry, mesh.material);\n\t\t\t\tframe.no_export = true;\n\t\t\t\tmesh.add(frame)\n\t\t\t\tmesh.outline = frame;\n\n\n\t\t\t\tmesh.fix_position = new THREE.Vector3();\n\t\t\t\tmesh.fix_rotation = new THREE.Euler();\n\n\t\t\t\tthis.updateTransform(element);\n\n\t\t\t\tthis.dispatchEvent('setup', {element});\n\t\t\t},\n\t\t\tupdateTransform(element) {\n\t\t\t\tNodePreviewController.prototype.updateTransform.call(this, element);\n\t\t\t\telement.mesh.fix_position.copy(element.mesh.position);\n\t\t\t\telement.mesh.fix_rotation.copy(element.mesh.rotation);\n\n\t\t\t\tthis.updateGeometry(element);\n\n\t\t\t\telement.updatePreviewCamera();\n\t\n\t\t\t\tthis.dispatchEvent('update_transform', {element});\n\t\t\t},\n\t\t\tupdateGeometry(element) {\n\t\t\t\tlet vertices = getFrameVertices(element, element.mesh.fov ?? element.fov);\n\t\t\t\telement.mesh.outline.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));\n\t\t\t\tthis.dispatchEvent('update_geometry', {element});\n\t\t\t},\n\t\t\tupdateSelection(element) {\n\t\t\t\tlet {mesh} = element;\n\t\t\t\tmesh.material.color.set(element.selected ? gizmo_colors.outline : gizmo_colors.grid)\n\t\t\t\tmesh.line_material.color.set(element.selected ? gizmo_colors.outline : gizmo_colors.grid)\n\t\t\n\t\t\t\tthis.dispatchEvent('update_selection', {element});\n\t\t\t}\n\t\t})\n\n\t\tlet old_y_condition = KeyframeDataPoint.properties.y.condition;\n\t\tlet old_z_condition = KeyframeDataPoint.properties.z.condition;\n\t\tKeyframeDataPoint.properties.y.condition = (point) => {\n\t\t\treturn point.keyframe.channel == 'fov' ? false : old_y_condition(point);\n\t\t}\n\t\tKeyframeDataPoint.properties.z.condition = (point) => {\n\t\t\treturn point.keyframe.channel == 'fov' ? false : old_z_condition(point);\n\t\t}\n\t\tlet old_x_default = KeyframeDataPoint.properties.x.default;\n\t\tKeyframeDataPoint.properties.x.default = (point) => {\n\t\t\treturn point.keyframe.channel == 'fov' ? (point.keyframe.animator.element?.fov || 70) : old_x_default(point);\n\t\t}\n\n\t\tlet add_action = new Action('add_camera', {\n\t\t\tname: 'Add Camera',\n\t\t\ticon: 'fas.fa-video',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => Modes.edit,\n\t\t\tclick() {\n\n\t\t\t\tUndo.initEdit({outliner: true, elements: [], selection: true});\n\t\t\t\tvar base_camera = new CameraElement().init()\n\t\t\t\tvar group = getCurrentGroup();\n\t\t\t\tbase_camera.addTo(group)\n\t\n\t\t\t\tif (Format.bone_rig && group) {\n\t\t\t\t\tvar pos1 = group.origin.slice()\n\t\t\t\t\tbase_camera.extend({\n\t\t\t\t\t\tposition: pos1\n\t\t\t\t\t})\n\t\t\t\t}\n\t\n\t\t\t\tunselectAll();\n\t\t\t\tbase_camera.select()\n\t\t\t\tUndo.finishEdit('Add camera', {outliner: true, elements: selected, selection: true});\n\t\t\t\tBlockbench.dispatchEvent( 'add_camera', {object: base_camera} )\n\t\n\n\t\t\t\treturn base_camera\n\t\t\t}\n\t\t})\n\t\tInterface.Panels.outliner.menu.addAction(add_action, '3')\n\t\tMenuBar.menus.edit.addAction(add_action, '8')\n\t\tdeletables.push(add_action);\n\n\t\tlet link_action = new Toggle('link_camera_to_preview', {\n\t\t\tname: 'Link Camera to Preview',\n\t\t\ticon: 'emergency_recording',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => CameraElement.all.length && Preview.selected,\n\t\t\tonChange() {\n\t\t\t\tlet should_have_preview = !(CameraElement.selected[0] || CameraElement.all[0]).linked_preview;\n\t\t\t\tif (!CameraElement.selected[0]) CameraElement.all[0].select();\n\n\t\t\t\tUndo.initEdit({elements: CameraElement.selected})\n\t\t\t\tCameraElement.selected.forEach(camera => {\n\t\t\t\t\tcamera.linked_preview = should_have_preview ? Preview.selected.id : '';\n\t\t\t\t\tif (should_have_preview) {\n\t\t\t\t\t\tcamera.updatePreviewCamera();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tUndo.finishEdit('Link camera to preview')\n\t\t\t}\n\t\t})\n\t\tdeletables.push(link_action);\n\t\tBlockbench.on('update_selection', () => {\n\t\t\tif (CameraElement.selected[0]) {\n\t\t\t\tlink_action.value = !!CameraElement.selected[0].linked_preview;\n\t\t\t\tlink_action.updateEnabledState();\n\t\t\t}\n\t\t\tPreview.all.forEach(preview => {\n\t\t\t\tlet is_linked = CameraElement.all.find(camera => camera.linked_preview == preview.id);\n\t\t\t\tpreview.controls.unlinked = !!is_linked;\n\t\t\t})\n\t\t})\n\t\tPreview.prototype.menu.addAction(link_action, -3);\n\n\t\t\n\t\tlet set_fov_action = new Action('edit_camera_properties', {\n\t\t\tname: 'Camera Properties...',\n\t\t\ticon: 'settings_photo_camera',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => CameraElement.selected.length,\n\t\t\tclick() {\n\t\t\t\tnew Dialog('edit_camera_properties', {\n\t\t\t\t\ttitle: 'Edit Camera Properties',\n\t\t\t\t\tform: {\n\t\t\t\t\t\tfov: {label: 'FOV', value: CameraElement.selected[0]?.fov, type: 'number', min: 1, max: 160},\n\t\t\t\t\t\taspect_ratio: {label: 'Aspect Ratio', value: CameraElement.selected[0]?.aspect_ratio, type: 'vector', dimensions: 2, min: 1},\n\t\t\t\t\t},\n\t\t\t\t\tonConfirm(form) {\n\t\t\t\t\t\tUndo.initEdit({elements: CameraElement.selected})\n\t\t\t\t\t\tCameraElement.selected.forEach(camera => {\n\t\t\t\t\t\t\tcamera.fov = form.fov;\n\t\t\t\t\t\t\tcamera.aspect_ratio.replace(form.aspect_ratio);\n\t\t\t\t\t\t\tCameraElement.preview_controller.updateTransform(camera);\n\t\t\t\t\t\t})\n\t\t\t\t\t\tUndo.finishEdit('Change camera FOV')\n\t\t\t\t\t}\n\t\t\t\t}).show();\n\t\t\t}\n\t\t})\n\t\tdeletables.push(set_fov_action);\n\n\t\tlet snap_action = new Action('camera_to_view', {\n\t\t\tname: 'Move Camera to View',\n\t\t\ticon: 'fas.fa-video',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => CameraElement.selected.length && Modes.edit,\n\t\t\tclick() {\n\t\t\t\tlet position = Preview.selected.camera.position.toArray();\n\t\t\t\tlet rotation_euler = new THREE.Euler().copy(Preview.selected.camera.rotation).reorder('ZYX');\n\t\t\t\tlet rotation = rotation_euler.toArray().map(v => Math.radToDeg(v));\n\t\t\t\tUndo.initEdit({elements: CameraElement.selected});\n\t\t\t\tCameraElement.selected.forEach(cam => {\n\t\t\t\t\tcam.position.V3_set(position);\n\t\t\t\t\tcam.rotation.V3_set(rotation);\n\t\t\t\t\tcam.preview_controller.updateTransform(cam);\n\t\t\t\t})\n\t\t\t\tUndo.finishEdit('Move camera to view')\n\t\t\t\tupdateSelection();\n\t\t\t}\n\t\t})\n\t\tdeletables.push(snap_action);\n\n\t\tconst anim_sign = Blockbench.isNewerThan('4.99') ? 1 : -1;\n\t\tclass CameraAnimator extends BoneAnimator {\n\t\t\tconstructor(uuid, animation, name) {\n\t\t\t\tsuper(uuid, animation);\n\t\t\t\tthis.uuid = uuid;\n\t\t\t\tthis._name = name;\n\t\t\n\t\t\t\tthis.position = [];\n\t\t\t\tthis.rotation = [];\n\t\t\t\tthis.fov = [];\n\t\t\t}\n\t\t\tget name() {\n\t\t\t\tvar element = this.getElement();\n\t\t\t\tif (element) return element.name;\n\t\t\t\treturn this._name;\n\t\t\t}\n\t\t\tset name(name) {\n\t\t\t\tthis._name = name;\n\t\t\t}\n\t\t\tgetElement() {\n\t\t\t\tthis.element = OutlinerNode.uuids[this.uuid];\n\t\t\t\treturn this.element\n\t\t\t}\n\t\t\tselect(element_is_selected) {\n\t\t\t\tif (!this.getElement()) {\n\t\t\t\t\tunselectAll();\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tif (this.getElement().locked) return;\n\t\t\n\t\t\t\tif (element_is_selected !== true && this.element) {\n\t\t\t\t\tthis.element.select();\n\t\t\t\t}\n\t\t\t\tGeneralAnimator.prototype.select.call(this);\n\t\t\t\t\n\t\t\t\tif (this[Toolbox.selected.animation_channel] && (Timeline.selected.length == 0 || Timeline.selected[0].animator != this)) {\n\t\t\t\t\tvar nearest;\n\t\t\t\t\tthis[Toolbox.selected.animation_channel].forEach(kf => {\n\t\t\t\t\t\tif (Math.abs(kf.time - Timeline.time) < 0.002) {\n\t\t\t\t\t\t\tnearest = kf;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tif (nearest) {\n\t\t\t\t\t\tnearest.select();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\n\t\t\t\tif (this.element && this.element.parent && this.element.parent !== 'root') {\n\t\t\t\t\tthis.element.parent.openUp();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tdoRender() {\n\t\t\t\tthis.getElement()\n\t\t\t\treturn (this.element && this.element && this.element.mesh);\n\t\t\t}\n\t\t\tdisplayPosition(arr, multiplier = 1) {\n\t\t\t\tvar bone = this.element.mesh\n\t\t\t\tif (arr) {\n\t\t\t\t\tbone.position.x += arr[0] * multiplier * anim_sign;\n\t\t\t\t\tbone.position.y += arr[1] * multiplier;\n\t\t\t\t\tbone.position.z += arr[2] * multiplier;\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tdisplayRotation(arr, multiplier = 1) {\n\t\t\t\tvar bone = this.element.mesh\n\t\t\t\tif (arr) {\n\t\t\t\t\tif (anim_sign == 1) {\n\t\t\t\t\t\tif (arr.length === 4) {\n\t\t\t\t\t\t\tvar added_rotation = new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(arr), 'ZYX')\n\t\t\t\t\t\t\tbone.rotation.x += added_rotation.x * multiplier\n\t\t\t\t\t\t\tbone.rotation.y += added_rotation.y * multiplier\n\t\t\t\t\t\t\tbone.rotation.z += added_rotation.z * multiplier\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbone.rotation.x += Math.degToRad(arr[0]) * multiplier\n\t\t\t\t\t\t\tbone.rotation.y += Math.degToRad(arr[1]) * multiplier\n\t\t\t\t\t\t\tbone.rotation.z += Math.degToRad(arr[2]) * multiplier\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarr.forEach((n, i) => {\n\t\t\t\t\t\t\tbone.rotation[getAxisLetter(i)] += Math.degToRad(n) * (i == 2 ? 1 : -1) * multiplier\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tdisplayFrame(multiplier = 1) {\n\t\t\t\tif (!this.doRender()) return;\n\t\t\t\tthis.getElement()\n\t\t\t\tlet fov;\n\t\t\n\t\t\t\tif (!this.muted.position) {\n\t\t\t\t\tthis.displayPosition(this.interpolate('position'), multiplier);\n\t\t\t\t}\n\t\t\t\tif (!this.muted.rotation) {\n\t\t\t\t\tthis.displayRotation(this.interpolate('rotation'), multiplier);\n\t\t\t\t}\n\t\t\t\tif (!this.muted.fov) {\n\t\t\t\t\tfov = this.interpolate('fov')[0];\n\t\t\t\t}\n\t\t\t\tthis.element.mesh.updateMatrixWorld()\n\t\t\t\tthis.element.mesh.fov = fov;\n\t\t\t\tthis.element.preview_controller.updateGeometry(this.element);\n\t\t\t\tthis.element.updatePreviewCamera(fov);\n\t\t\t}\n\t\t}\n\t\t\tCameraAnimator.prototype.type = 'camera';\n\t\t\tCameraAnimator.prototype.channels = {\n\t\t\t\tposition: {name: tl('timeline.position'), mutable: true, transform: true, max_data_points: 2},\n\t\t\t\trotation: {name: tl('timeline.rotation'), mutable: true, transform: true, max_data_points: 2},\n\t\t\t\tfov: {name: 'FOV', mutable: true, transform: true, max_data_points: 2},\n\t\t\t}\n\t\tCameraElement.animator = CameraAnimator;\n\n\t\tBlockbench.on('select_mode', (arg) => {\n\t\t\tif (arg.mode.id == 'animate') return;\n\t\t\tfor (let camera of CameraElement.all) {\n\t\t\t\tcamera.mesh.fov = camera.fov;\n\t\t\t\tCameraElement.preview_controller.updateGeometry(camera);\n\t\t\t}\n\t\t})\n\n\t},\n\tonunload() {\n\t\tdeletables.forEach(action => {\n\t\t\taction.delete();\n\t\t})\n\t}\n});\n\n"
  },
  {
    "path": "plugins/cardinal.js",
    "content": "(function() {\n\n\tlet images = {\n\t\t\tnorth: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABVJREFUCNdjSGxgAKJKMEoHo0QEAgCIGwkHoSKsGQAAAABJRU5ErkJggg\",\n\t\t\teast : \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFAQMAAAC3obSmAAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABBJREFUCNdjKGBwYEgA4gIACMoBwSwi6WsAAAAASUVORK5CYII\",\n\t\t\tsouth: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFAQMAAAC3obSmAAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABJJREFUCNdjKGBwYChgEGAoAAAIigGhv1KChwAAAABJRU5ErkJggg\",\n\t\t\twest : \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABlBMVEVHcEz///+flKJDAAAAAXRSTlMAQObYZgAAABhJREFUCNdjYGBgOHAAhM4gIWMGEGJgAACnnQmX+CnbdwAAAABJRU5ErkJggg\"\n\t\t},\n\t\tbuildGridCopy = Canvas.buildGrid;\n\n\tPlugin.register(\"cardinal\", {\n\t\ttitle: \"Cardinal\",\n\t\tauthor: \"Bug1312\",\n\t\tdescription: \"Adds in all cardinal directions on the grid and renders them on-top of everything while facing the camera.\",\n\t\tabout: \"If you wish to change the color, use custom CSS to set the variable 'cardinal' to any color! The scale can be changed from within the settings.\",\n\t\ticon: \"border_outer\",\n\t\tversion: \"1.1.0\",\n\t\tvariant: \"both\",\n\t\tonload() {\n\t\t\tnew Setting(\"cardinal_scale\", {\n\t\t\t\tvalue: 1,\n\t\t\t\tcategory: \"preview\",\n\t\t\t\tname: \"Cardinal Scale\",\n\t\t\t\tdescription: \"Change the scale of the cardinals\",\n\t\t\t\ttype: \"number\",\n\t\t\t\tonChange: build\n\t\t\t});\n\t\t\tbuild();\n\t\t},\n\t\tonunload() { \n\t\t\tCanvas.buildGrid = buildGridCopy;\n\t\t\twindow.buildGrid = Canvas.buildGrid;\n\t\t},\n\t\tonuninstall() { Canvas.buildGrid() }\n\t});\n\n\tfunction build() {\n\t\tCanvas.buildGrid = function() {\n\t\t\t// Default grid\n\t\t\tbuildGridCopy();\n\n\t\t\t// Hide default north mark\n\t\t\tlet north_mark = three_grid.children.find(c => c.material === Canvas.northMarkMaterial);\n\t\t\tif (north_mark) north_mark.visible = false;\n\n\t\t\t// Generate other marks\n\t\t\taddMark(images.north, [ 0.0, -9.5 ]);\n\t\t\taddMark(images.east,  [ 9.5,  0.0 ]);\n\t\t\taddMark(images.south, [ 0.0,  9.5 ]);\n\t\t\taddMark(images.west,  [-9.5,  0.0 ]);\n\t\t};\n\t\twindow.buildGrid = Canvas.buildGrid;\n\t\tCanvas.buildGrid();\n\t}\n\n\tfunction addMark(src, pos) {\n\t\tlet img = new Image(),\n\t\t\ttex = new THREE.Texture(img),\n\t\t\tcolor = getComputedStyle(document.body).getPropertyValue(\"--cardinal\").replace(/^\\s*/, \"\");\n\n\t\tif (color === \"\") color = \"#FFF\";\n\n\t\t// Set textures to src\n\t\timg.src = src;\n\t\timg.tex = tex;\n\n\t\t// Render pixelated\n\t\timg.tex.magFilter = THREE.NearestFilter;\n\t\timg.tex.minFilter = THREE.NearestFilter;\n\n\t\t// When loaded, render texture but only do so after onBeforeRender()\n\t\t//\tResults in less flashing\n\t\timg.onload = function() { this.tex.needsUpdate = true };\n\n\t\t// Setup cardinal mark\n\t\tlet geometry = new THREE.PlaneGeometry(2.4 * settings.cardinal_scale.value, 2.4 * settings.cardinal_scale.value),\n\t\t\tmaterial = new THREE.MeshBasicMaterial({\n\t\t\t\tmap: tex,\n\t\t\t\ttransparent: true,\n\t\t\t\tcolor: new THREE.Color(color)\n\t\t\t}),\n\t\t\tmark = new THREE.Mesh(geometry, material);\n\n\t\t// Render on top\n\t\tmark.renderOrder = 10;\n\t\tmark.material.depthTest  = false;\n\t\tmark.material.depthWrite = false;\n\n\t\t// Look at camera\n\t\tmark.onBeforeRender = function() { this.rotation.set(main_preview.camera.rotation.x, main_preview.camera.rotation.y, main_preview.camera.rotation.z) };\n\n\t\t// Move marks based on grid positioning\n\t\tif (Format.centered_grid) mark.position.set(pos[0], 0, pos[1]);\n\t\telse mark.position.set(pos[0] + 8, 0, pos[1] + 8);\n\n\t\t// Add to grid\n\t\tthree_grid.add(mark);\n\t}\n\n})();\n"
  },
  {
    "path": "plugins/cem_template_loader/about.md",
    "content": "<div id=\"about-content\">\n  <img src=\"https://ewanhowell.com/assets/images/plugins/cem-template-loader/logo.webp\" />\n  <p>CEM Template Loader can be used to load the vanilla entity models for Minecraft: Java Edition, so you can use them in OptiFine CEM, or as texturing templates.</p>\n  <p>To use this plugin, head to the <strong>Tools</strong> menu and select <strong>CEM Template Loader</strong>. From here, select the model that you would like to edit and load it.</p>\n  <p>After editing your model, export it as an <strong>OptiFine JEM</strong> to the folder <code>assets/minecraft/optifine/cem</code>. If a texture is used in the model, make sure it saves with a valid file path.</p>\n  <img style=\"height: 300px; margin: 10px 0 12px; image-rendering: auto;\" src=\"https://ewanhowell.com/assets/images/plugins/cem-template-loader/images/dialog.webp\" />\n  <h2>Important</h2>\n  <p>When editing an entity model, you cannot rotate root groups (top level folders), or move the pivot points of root groups, as this can break your model. If you need to rotate a root group, use a subgroup. If you need to change a root group's pivot point, use CEM animations.</p>\n  <h2>Animation Editor</h2>\n  <p>CEM Template Loader also includes an animation editor, so that you can create custom entity animations.</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 128px;\n    object-fit: contain;\n    margin: 16px 0 24px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n  <a href=\"https://youtu.be/arj2eim42KI\">\n    <i class=\"fa_big icon fab fa-youtube\" style=\"color: #FF4444;\"></i>\n    <p>CEM Modelling Tutorial</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/cem_template_loader/cem_template_loader.js",
    "content": "(() => {\n  let plugin\n  const connection = {\n    roots: [\n      `https://wynem.com/assets`,\n      `https://raw.githubusercontent.com/ewanhowell5195/wynem/main/src/assets`,\n      `https://cdn.jsdelivr.net/gh/ewanhowell5195/wynem/src/assets`\n    ],\n    rootIndex: 0\n  }\n  let root = connection.roots[0]\n  const id = \"cem_template_loader\"\n  const name = \"CEM Template Loader\"\n  const icon = \"keyboard_capslock\"\n  const description = \"Load template Java Edition entity models for use with OptiFine CEM.\"\n  const links = {\n    website: {\n      text: \"By Ewan Howell\",\n      link: \"https://ewanhowell.com/\",\n      icon: \"language\",\n      colour: \"#33E38E\"\n    },\n    discord: {\n      text: \"Discord Server\",\n      link: \"https://discord.ewanhowell.com/\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    },\n    tutorial: {\n      text: \"CEM Modelling Tutorial\",\n      link: \"https://youtu.be/arj2eim42KI\",\n      icon: \"fab.fa-youtube\",\n      colour: \"#FF4444\"\n    }\n  }\n\n  function loadPlugin() {\n    plugin = Plugin.register(id, {\n      title: name,\n      icon: \"icon.png\",\n      author: \"Ewan Howell\",\n      description: description + \" Also includes an animation editor, so that you can create custom entity animations.\",\n      tags: [\"Minecraft: Java Edition\", \"OptiFine\", \"Templates\"],\n      version: \"9.1.1\",\n      min_version: \"5.0.0\",\n      variant: \"both\",\n      creation_date: \"2020-02-02\",\n      has_changelog: true,\n      website: \"https://ewanhowell.com/plugins/cem-template-loader/\",\n      repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/cem_template_loader\",\n      bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[CEM Template Loader]\",\n      onload() {\n        loadCEMTemplateLoader()\n        loadOptiFineEntityRestrictions()\n        loadOptiFineAnimationEditor()\n      },\n      onunload() {\n        unloadCEMTemplateLoader()\n        unloadOptiFineEntityRestrictions()\n        unloadOptiFineAnimationEditor()\n      }\n    })\n  }\n\n  async function fetchData(path, fallback) {\n    // if (path === \"json/cem_template_models.json\") {\n    //   const fs = require(\"fs\")\n    //   return JSON.parse(fs.readFileSync(\"E:/Programming/GitHub/wynem/src/assets/json/cem_template_models.json\"))\n    // }\n    const currentRoot = connection.rootIndex\n    try {\n      const r = await fetch(`${root}/${path}`)\n      if (!r.ok) throw new Error\n      if (r.headers.get(\"Content-Type\")?.startsWith(\"text/html\")) {\n        return\n      }\n      if (r.headers.get(\"Content-Type\")?.startsWith(\"text/plain\") || r.headers.get(\"Content-Type\")?.startsWith(\"application/json\")) {\n        return r.json()\n      }\n      return r\n    } catch {\n      for (let x = currentRoot + 1; x < connection.roots.length; x++) {\n        try {\n          const r = await fetch(`${connection.roots[x]}/${path}`)\n          if (r.status !== 200) {\n            throw new Error\n          }\n          root = connection.roots[x]\n          connection.rootIndex = x\n          if (r.headers.get(\"Content-Type\")?.startsWith(\"text/plain\") || r.headers.get(\"Content-Type\")?.startsWith(\"application/json\")) {\n            return r.json()\n          }\n          return r\n        } catch {}\n      }\n      connection.failed = true\n      return fallback ? fallback() : {}\n    }\n  }\n\n  // CEM TEMPLATE LOADER\n\n  let styles, loader, loaderDialog, modelData, loadingPromise\n\n  const loaderData = {\n    connection: null,\n    loading: true,\n    categories: {},\n    category: null,\n    loadTexture: true,\n    entity: null,\n    subentity: null,\n    search: \"\",\n    entities: [],\n    built: false\n  }\n\n  async function loadCEMTemplateLoader() {\n    styles = Blockbench.addCSS(`\n      .spacer {\n        flex: 1;\n      }\n      .cem-template-loader-links {\n        display: flex;\n        justify-content: space-around;\n        margin: 20px 40px 0;\n      }\n      .cem-template-loader-links > a {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 5px;\n        padding: 5px;\n        text-decoration: none;\n        flex-grow: 1;\n        flex-basis: 0;\n        color: var(--color-subtle_text);\n        text-align: center;\n      }\n      .cem-template-loader-links > a:hover {\n        background-color: var(--color-accent);\n        color: var(--color-light);\n      }\n      .cem-template-loader-links > a > i {\n        font-size: 32px;\n        width: 100%;\n        max-width: initial;\n        height: 32px;\n        text-align: center;\n      }\n      .cem-template-loader-links > a:hover > i {\n        color: var(--color-light) !important;\n      }\n      .cem-template-loader-links > a > p {\n        flex: 1;\n        display: flex;\n        align-items: center;\n      }\n      #format_page_cem_template_loader {\n        padding-bottom: 0;\n      }\n      #format_page_cem_template_loader .format_target {\n        margin-bottom: 6px;\n      }\n      #format_page_cem_template_loader div:nth-child(3), #format_page_cem_template_loader content {\n        overflow-y: auto;\n      }\n      #cem-container {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n      }\n      .cem-overlay {\n        position: absolute;\n        inset: 0;\n        z-index: 2;\n        background-color: var(--color-ui);\n        display: flex;\n        flex-direction: column;\n        padding: 40px;\n        text-align: center;\n        gap: 16px;\n        overflow-y: auto;\n\n        > * {\n          max-width: 512px;\n          margin: 0 auto !important;\n        }\n\n        > :first-child {\n          margin-top: auto !important;\n        }\n\n        > :last-child {\n          margin-bottom: auto !important;\n        }\n      }\n    `)\n    loader = new ModelLoader(id, {\n      name,\n      description,\n      icon,\n      onStart: openLoader,\n      format_page: {\n        component: {\n          methods: {\n            openLoader\n          },\n          template: `\n            <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n              <p class=\"format_description\">${description}</p>\n              <p class=\"format_target\"><b>Target</b> : <span>Minecraft: Java Edition with OptiFine</span> <span>Texturing Templates</span></p>\n              <content>\n                <h3 class=\"markdown\">How to use:</h3>\n                <p class=\"markdown\">\n                  <ul>\n                    <li><p>Press <strong>Load CEM Template</strong> and select a model.</p></li>\n                    <li><p>Select your load settings, load the model, then edit the model.</p></li>\n                    <li><p>Export your model as an <strong>OptiFine JEM</strong> to <code>assets/minecraft/optifine/cem</code>, using the provided name.</p></li>\n                  </ul>\n                </p>\n                <h3 class=\"markdown\">Do:</h3>\n                <p class=\"markdown\">\n                  <ul>\n                    <li><p>Edit any of the cubes that were loaded with the template, add your own cubes, and create your own subgroups.</p></li>\n                  </ul>\n                </p>\n                <h3 class=\"markdown\">Do not:</h3>\n                <p class=\"markdown\">\n                  <ul>\n                    <li><p>Edit any of the groups that were loaded with the template, add your own root groups, or remove any built in animations.</p></li>\n                  </ul>\n                </p>\n              </content>\n              <div class=\"spacer\"></div>\n              <div class=\"cem-template-loader-links\">${Object.values(links).map(e => `\n                <a href=\"${e.link}\">\n                  ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                  <p>${e.text}</p>\n                </a>\n              `).join(\"\")}</div>\n              <div class=\"button_bar\">\n                <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"openLoader()\">\n                  <i class=\"material-icons\">${icon}</i>\n                  Load CEM Template\n                </button>\n              </div>\n            </div>\n          `\n        }\n      }\n    })\n    loaderDialog = new Dialog({\n      id,\n      title: name,\n      width: 980,\n      buttons: [],\n      sidebar: {\n        pages: {},\n        onPageSwitch(page) {\n          loaderDialog.content_vue.category = page\n          loaderDialog.content_vue.$refs.entry.focus()\n        }\n      },\n      lines: [`<style>\n        #cem_template_loader > .dialog_wrapper {\n          grid-template-rows: auto 0px;\n          grid-template-columns: 160px auto;\n          overflow: hidden;\n          height: 512px;\n          display: grid;\n\n          &:not(.has_sidebar) {\n            grid-template-columns: auto;\n          }\n        }\n        #cem_template_loader .dialog_sidebar_pages {\n          margin-bottom: 66px;\n          overflow-y: auto;\n        }\n        #cem_template_loader .dialog_sidebar_pages::-webkit-scrollbar-track, .cem-models::-webkit-scrollbar-track {\n          background-color: var(--color-back);\n        }\n        #cem_template_loader .dialog_content {\n          margin: 0;\n          max-height: initial;\n        }\n        #cem_template_loader h1 {\n          margin: 0;\n        }\n        #cem_template_loader .hidden {\n          display: none !important;\n        }\n        #cem-report-issues {\n          position: absolute;\n          width: 160px;\n          left: 0;\n          bottom: 0;\n          padding: 12px 0;\n          border-top: 2px solid var(--color-border);\n          z-index: 1;\n          display: none;\n        }\n        #cem-report-issues * {\n          cursor: pointer\n        }\n        .has_sidebar #cem-report-issues {\n          display: initial;\n        }\n        #cem-report-issues > a {\n          display: flex;\n          text-decoration: none;\n          justify-content: center;\n          align-items: center;\n          gap: 10px;\n        }\n        #cem-report-issues > a > div {\n          text-decoration: underline;\n        }\n        #cem-footer {\n          display: flex;\n          padding: 8px;\n          gap: 10px;\n          flex-wrap: wrap;\n        }\n        #load-texture {\n          display: flex;\n          align-items: center;\n          gap: 5px;\n          cursor: pointer;\n        }\n        #load-texture * {\n          cursor: pointer;\n        }\n        #cem-buttons {\n          display: flex;\n          flex: 1;\n          justify-content: end;\n          gap: 4px;\n        }\n        #cem-buttons > :disabled {\n          opacity: 0.5;\n          cursor: not-allowed;\n          background: var(--color-button);\n          color: var(--color-text) !important;\n        }\n        #cem-buttons > :first-child:not(:disabled) {\n          background-color: var(--color-accent);\n        }\n        #cem-header {\n          padding: 0 8px 8px 16px;\n        }\n        #cem-details {\n          display: flex;\n          gap: 8px;\n          flex-wrap: wrap;\n        }\n        #cem-search {\n          position: relative;\n          min-width: min(100%, 256px);\n          display: flex;\n          justify-content: end;\n          margin-left: auto;\n          height: 30px;\n\n          > input {\n            width: min(100%, 256px);\n            padding-right: 32px;\n          }\n\n          > i {\n            position: absolute;\n            right: 6px;\n            top: 50%;\n            transform: translateY(-50%);\n            pointer-events: none;\n\n            &.active {\n              cursor: pointer;\n              pointer-events: initial;\n            }\n          }\n        }\n        #cem-description {\n          min-width: min(100%, 256px);\n          flex: 1 1 0px;\n        }\n        .cem-models {\n          display: flex;\n          flex-wrap: wrap;\n          gap: 10px;\n          overflow-y: auto;\n          padding: 0 8px 0 16px;\n          margin-right: 8px;\n          scrollbar-width: initial;\n          scrollbar-color: initial;\n        }\n        .cem-model {\n          min-width: 128px;\n          border: 2px solid transparent;\n          flex: 1;\n          background-color: var(--color-back);\n          cursor: pointer;\n          padding: 2px;\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          position: relative;\n\n          &.cem-variant {\n            background-color: color-mix(in srgb, var(--color-back), black 15%);\n          }\n\n          &:hover {\n            background-color: var(--color-button);\n          }\n\n          &.selected {\n            border: 2px solid var(--color-accent);\n            background-color: var(--color-selected);\n          }\n\n          &.child-selected {\n            border: 2px solid transparent;\n          }\n\n          > img {\n            height: 66px;\n            width: 100%;\n            object-fit: contain;\n            pointer-events: none;\n          }\n\n          > div {\n            text-align: center;\n            flex: 1;\n            display: flex;\n            align-items: center;\n            max-height: 24px;\n            min-height: 24px;\n            line-height: 16px;\n            margin: -2px 0 2px;\n            pointer-events: none;\n          }\n\n          > i {\n            position: absolute;\n            top: 4px;\n            right: 4px;\n          }\n        }\n\n        .cem-spacer {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          flex: 1;\n        }\n\n        .cem-model-heading {\n          min-width: 100%;\n          font-size: 24px;\n        }\n      </style>`],\n      component: {\n        data: loaderData,\n        methods: {\n          async load() {\n            this.loading = true\n            await loadModel(this.subentity ?? this.entity, this.loadTexture)\n            loaderDialog.close()\n          },\n          reload() {\n            window.cemTemplateLoaderReloaded = true\n            plugin.reload()\n          },\n          close: () => loaderDialog.close(),\n          selectEntity(model) {\n            if (this.entity !== model.id) {\n              this.entity = model.id\n            } else if (!this.subentity) {\n              this.entity = null\n            }\n            this.subentity = null\n          },\n          selectSubentity(model, submodel) {\n            if (this.search && this.subentity === submodel.id) {\n              this.entity = null\n              this.subentity = null\n            } else if (this.subentity !== submodel.id) {\n              this.entity = model.id\n              this.subentity = submodel.id\n            } else {\n              this.subentity = null\n            }\n          },\n          areAllNextItemsHidden(entities, heading) {\n            const index = entities.indexOf(heading)\n            for (let i = index + 1; i < entities.length; i++) {\n              if (entities[i].type === \"heading\") break\n              if (entities[i].id.includes(this.search)) return false\n            }\n            return true\n          }\n        },\n        template: `\n          <div id=\"cem-container\">\n            <div v-if=\"loading\" class=\"cem-overlay\">\n              <h1>Loading...</h1>\n            </div>\n            <div v-if=\"connection?.failed\" class=\"cem-overlay\">\n              <h1>Connection Failed</h1>\n              <p>Failed to load CEM Template data.</p>\n              <p>Please make sure you are connected to the internet, and can access this <a href=\"${root}/json/cem_template_models.json\">cem_template_models.json</a> file.</p>\n              <p>If you are unable to access the cem_template_models.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is <a href=\"https://1.1.1.1/\">Cloudflare WARP</a>, which is a free program that commonly resolves this issue.</p>\n              <button @click=\"reload\">Retry connection</button>\n            </div>\n            <div id=\"cem-header\">\n              <h1>{{ category }}</h1>\n              <div id=\"cem-details\">\n                <div id=\"cem-description\">{{ categories[category]?.description }}</div>\n                <div id=\"cem-search\">\n                  <input type=\"text\" placeholder=\"Search…\" class=\"dark_bordered\" v-model=\"search\" ref=\"entry\" @input=\"search = search.toLowerCase()\">\n                  <i class=\"material-icons\" :class=\"{ active: search }\" @click=\"search = ''; $refs.entry.focus()\">{{ search ? \"clear\" : \"search\" }}</i>\n                </div>\n              </div>\n            </div>\n            <div v-if=\"connection\" v-for=\"[name, c] of Object.entries(categories)\" class=\"cem-models\" :class=\"{ hidden: category !== name }\">\n              <template v-for=\"model of c.entities\">\n                <div v-if=\"model.type === 'heading'\" class=\"cem-model-heading\" :class=\"{ hidden: areAllNextItemsHidden(c.entities, model) }\">{{ model.text }}</div>\n                <template v-else>\n                  <div class=\"cem-model\" :class=\"{ selected: entity === model.id && (!subentity || !search), 'child-selected': entity === model.id && subentity, hidden: !model.id.includes(search) }\" @click=\"selectEntity(model)\">\n                    <img :src=\"connection.roots[connection.rootIndex] + '/images/minecraft/renders/' + model.id + '.webp'\" loading=\"lazy\">\n                    <i v-if=\"model.variants && entity !== model.id && !search\" class=\"material-icons\">add</i>\n                    <i v-if=\"model.variants && entity === model.id && !search\" class=\"material-icons\">remove</i>\n                    <div :style=\"{ textTransform: model.name ? null : 'capitalize' }\">{{ model.name ?? (model.file ?? model.id).replace(/_/g, \" \") }}</div>\n                  </div>\n                  <div v-if=\"model.variants\" v-for=\"submodel of model.variants\" class=\"cem-model\" :class=\"{ 'cem-variant': !search, selected: subentity === submodel.id, hidden: search ? !submodel.id.includes(search) : entity !== model.id }\" @click=\"selectSubentity(model, submodel)\">\n                    <img :src=\"connection.roots[connection.rootIndex] + '/images/minecraft/renders/' + submodel.id + '.webp'\" loading=\"lazy\">\n                    <div :style=\"{ textTransform: submodel.name ? null : 'capitalize' }\">{{ submodel.name ?? (submodel.file ?? submodel.id).replace(/_/g, \" \") }}</div>\n                  </div>\n                </template>\n              </template>\n            </div>\n            <div class=\"cem-spacer\">\n              <h3 v-if=\"!entities.filter(e => e[0] === category && e[1]?.includes(search)).length\">No results</h3>\n            </div>\n            <div id=\"cem-footer\">\n              <label id=\"load-texture\">\n                <input type=\"checkbox\" :checked=\"loadTexture\" v-model=\"loadTexture\">\n                <div>Load vanilla texture</div>\n              </label>\n              <div id=\"cem-buttons\">\n                <button :disabled=\"!entity\" @click=\"load\">Load</button>\n                <button @click=\"close\">Cancel</button>\n              </div>\n            </div>\n            <div id=\"cem-report-issues\">\n              <a href=\"https://github.com/ewanhowell5195/cemTemplateModels/issues\">\n                <i class=\"material-icons\">bug_report</i>\n                <div>Report issues</div>\n              </a>\n            </div>\n          </div>\n        `\n      },\n      async onBuild() {\n        loaderData.connection = connection\n        await loadCEMTemplateModels()\n        this.sidebar.build()\n        if (!modelData.categories) {\n          return this.content_vue.$forceUpdate()\n        }\n        const categories = modelData.categories.filter(e => !e.type).map(e => [e.name, e])\n        loaderData.categories = Object.fromEntries(categories)\n        loaderData.entities = categories.flatMap(c => c[1].entities.map(e => [c[0], e.id]))\n        loaderData.loading = false\n        loaderData.built = true\n      },\n      onOpen() {\n        this.content_vue.$refs.entry.focus()\n        if (loaderData.built) {\n          loaderData.loading = false\n          this.content_vue.$forceUpdate()\n        }\n      }\n    })\n    MenuBar.addAction(new Action(id, {\n      name,\n      description,\n      children: [\n        new Action(\"cem_template_loader_placeholder\", {\n          name: `All Entities`,\n          description: \"All entities\",\n          icon: \"icon-player\",\n          click: () => openLoader()\n        })\n      ],\n      icon\n    }), \"tools\")\n    const script = document.createElement(\"script\")\n    script.innerHTML = `\n      if (!window.cemTemplateModelsLoaded) {\n        loadCEMTemplateModels()\n      }\n    `\n    BarItems.cem_template_loader.menu_node.append(script)\n    if (window.cemTemplateLoaderReloaded) {\n      delete window.cemTemplateLoaderReloaded\n      openLoader()\n    } else if (Blockbench.isWeb) {\n      const params = (new URL(location.href)).searchParams\n      if (params.get(\"plugins\")?.split(\",\").includes(id) && params.get(\"model\") !== \"\") {\n        if (!await MinecraftEULA.promptUser(id)) return\n        await loadCEMTemplateModels()\n        loadModel(params.get(\"model\"), params.has(\"texture\"))\n      }\n    }\n  }\n\n  function unloadCEMTemplateLoader() {\n    styles.delete()\n    loader.delete()\n    loaderDialog.close()\n    for (const child of BarItems.cem_template_loader.children) {\n      child.delete?.()\n    }\n    BarItems.cem_template_loader.delete()\n    delete window.loadCEMTemplateModels\n    delete window.cemTemplateModelsLoaded\n  }\n\n  function resolvePopup(node, popups) {\n    const popup = node.popup\n    if (!popup) return undefined\n    const master = node.file ?? node.id\n    const display = node.name ?? String(master).split(\"_\").filter(Boolean).map(p => p[0].toUpperCase() + p.slice(1)).join(\" \")\n    if (Array.isArray(popup)) {\n      const [popupId, ...extra] = popup\n      const template = popups[popupId]\n      if (!template) return popupId\n      return template.replace(/\\{(\\d+)\\}/g, (_, n) => [display, ...extra][Number(n)] ?? `{${n}}`)\n    }\n    if (typeof popup === \"object\") return popup\n    if (typeof popup === \"string\") {\n      const template = popups[popup]\n      if (template) return template.replace(/\\{(\\d+)\\}/g, (_, n) => [display][Number(n)] ?? `{${n}}`)\n      return popup\n    }\n    return undefined\n  }\n\n  window.loadCEMTemplateModels = async () => {\n    if (window.cemTemplateModelsLoaded) return loadingPromise\n    loadingPromise = fetchData(\"json/cem_template_models.json\")\n    modelData = await loadingPromise\n    window.cemTemplateModelsLoaded = true\n    if (!modelData.categories) return\n    const firstCategory = modelData.categories.find(c => !c.type)\n    loaderDialog.sidebar.page = firstCategory.name\n    loaderData.category = firstCategory.name\n    modelData.entities = []\n    for (const category of modelData.categories) {\n      if (category.type === \"heading\") {\n        loaderDialog.sidebar.pages[\"_\" + category.text] = new MenuSeparator(category.text, category.text)\n        continue\n      }\n      loaderDialog.sidebar.pages[category.name] = {\n        label: category.name,\n        icon: category.icon\n      }\n      for (let i = 0; i < category.entities.length; i++) {\n        if (category.entities[i].type) continue\n        category.entities[i].popup = resolvePopup(category.entities[i], modelData.popups)\n        modelData.entities.push(category.entities[i])\n        if (category.entities[i].variants) {\n          for (let j = 0; j < category.entities[i].variants.length; j++) {\n            if (!category.entities[i].variants[j].model) {\n              category.entities[i].variants[j].model = category.entities[i].model ?? category.entities[i].id\n            }\n            category.entities[i].variants[j].popup = resolvePopup(category.entities[i].variants[j], modelData.popups)\n            modelData.entities.push(category.entities[i].variants[j])\n          }\n        }\n      }\n    }\n    BarItems.cem_template_loader_placeholder.delete()\n    BarItems.cem_template_loader.children = []\n    for (let i = 0; i < modelData.categories.length; i++) {\n      const e = modelData.categories[i]\n      if (e.type === \"heading\") {\n        if (i > 0 && i < modelData.categories.length - 1) {\n          BarItems.cem_template_loader.children.push(\"_\")\n        }\n        continue\n      }\n      BarItems.cem_template_loader.children.push(new Action(`cem_template_loader_${e.name.replace(/ /g, \"_\")}`, {\n        plugin: id,\n        name: `${e.name} Entities`,\n        description: e.description,\n        icon: e.icon,\n        click: () => openLoader(e.name)\n      }))\n    }\n    BarItems.cem_template_loader.children.push(\"_\", {\n      name: `Models v${modelData.version}`,\n      id: \"cem_template_loader_models_version\",\n      icon: \"info\",\n      click: () => openLoader()\n    })\n    if (MenuBar.menus.tools.label.classList.contains(\"opened\")) {\n      MenuBar.menus.tools.show()\n    }\n  }\n\n  async function openLoader(category) {\n    if (!await MinecraftEULA.promptUser(id)) return\n    if (category) {\n      loaderData.category = category\n      loaderDialog.sidebar.page = category\n      if (loaderDialog.content_vue) loaderDialog.sidebar.build()\n    }\n    loaderDialog.show()\n  }\n\n  const getBase64FromBlob = blob => new Promise(async fulfil => {\n    const reader = new FileReader()\n    reader.onloadend = () => fulfil(reader.result)\n    reader.readAsDataURL(blob)\n  })\n\n  async function loadModel(entity, loadTexture) {\n    const data = modelData.entities.find(e => e.id === entity)\n    if (!data) return Blockbench.showQuickMessage(\"Unknown CEM template model\", 2000)\n    const model = modelData.models[data.model ?? data.id]\n    newProject(Formats.optifine_entity)\n    Project.name = data.file ?? data.id\n    Blockbench.setStatusBarText(data.id)\n    Formats.optifine_entity.codec.parse(JSON.parse(model.model), \"\")\n    let textureLoaded\n    if (loadTexture && !data.textureless) {\n      try {\n        const textures = Array.isArray(data.vanilla_textures) ? data.vanilla_textures : [data.vanilla_textures ?? data.id]\n        for (const [i, name] of textures.entries()) {\n          const texture = await fetchData(`images/minecraft/entities/${entity}${i ? `_${i}` : \"\"}.png`, () => null)\n          if (!texture) throw Error\n          const tex = new Texture({ name }).fromDataURL(await getBase64FromBlob(await texture.blob())).add()\n          if (!i && textures.length === 1) {\n            tex.use_as_default =  true\n          }\n        }\n        textureLoaded = true\n      } catch {\n        Blockbench.showQuickMessage(\"Unable to load vanilla texture\", 2000)\n        loaderDialog.content_vue?.$forceUpdate()\n      }\n    }\n    if (!textureLoaded && !data.textureless) {\n      const textureData = Array.isArray(model.texture_data) ? model.texture_data : [model.texture_data]\n      const textureNames = Array.isArray(data.texture) ? data.texture : [data.texture ?? data.id]\n      const length = Math.max(textureData.length, textureNames.length)\n      for (const cube of Cube.all) {\n        cube.markAsSelected()\n      }\n      for (let i = 0; i < length; i++) {\n        if (textureData[i]) {\n          new Texture({ name: textureNames[i] ?? data.id }).fromDataURL(\"data:image/png;base64,\" + textureData[i]).add()\n        } else {\n          TextureGenerator.addBitmap({\n            name: textureNames[i] ?? data.id,\n            color: new tinycolor(\"#00000000\"),\n            type: \"template\",\n            rearrange_uv: false,\n            resolution: \"16\"\n          })\n        }\n      }\n      for (const cube of Cube.all) {\n        cube.unselect()\n      }\n      if (length.length > 1) {\n        Texture.all.forEach(t => t.use_as_default = false)\n      }\n    }\n    if (data.popup) {\n      Blockbench.showMessageBox({\n        title: data.popup.title ?? \"Before you start...\",\n        message: data.popup.message ?? data.popup,\n        width: data.popup.width\n      })\n    }\n  }\n\n  // OPTIFINE ENTITY RESTRICTIONS\n\n  let editCheck, jemRestrictionsDialog, originalJEMFormat, restrictionStyles\n\n  function loadOptiFineEntityRestrictions() {\n    restrictionStyles = Blockbench.addCSS(`\n      #format_page_optifine_entity h3.markdown {\n        margin-bottom: -10px;\n      }\n    `)\n    new Setting(\"jem_restrictions\", {\n      value: false,\n      category: \"edit\",\n      name: \"Remove OptiFine Entity Restrictions\",\n      description: \"Remove the root group restrictions on the OptiFine Entity format. WARNING: You can easily break models with restrictions removed.\"\n    })\n    new Setting(\"dialog_jem_restrictions\", {\n      value: true,\n      category: \"dialogs\",\n      name: \"OptiFine Entity Restrictions Dialog\",\n      description: 'Show the \"OptiFine Entity Restrictions\" dialog'\n    })\n    jemRestrictionsDialog = new Dialog({\n      id: \"jem_restrictions_dialog\",\n      title: \"Unsupported Edit\",\n      buttons: [],\n      lines: [`<style>\n        #jem_restrictions_dialog label {\n          display: flex;\n          align-items: center;\n          cursor: pointer;\n          gap: 5px;\n        }\n        #jem_restrictions_dialog label * {\n          cursor: pointer;\n        }\n        #cem-buttons {\n          display: flex;\n          justify-content: space-between;\n        }\n        #jem_restrictions_dialog button:not(:hover) {\n          background-color: var(--color-selected);\n        }\n      </style>`],\n      component: {\n        data: {\n          message: \"\",\n          removeRestrictions: false,\n          dontShowAgain: false\n        },\n        methods: {\n          finish() {\n            if (this.removeRestrictions) {\n              settings.jem_restrictions.set(true)\n            }\n            if (this.dontShowAgain) {\n              settings.dialog_jem_restrictions.set(false)\n            }\n            jemRestrictionsDialog.close()\n          }\n        },\n        template: `\n          <div>\n            <h2 style=\"margin-bottom: 10px;\">{{ message }}</h2>\n            <p>The OptiFine Entity format has limitations for the top level groups.<br>You cannot:</p>\n            <p class=\"markdown\">\n              <ul>\n                <li>Add new root groups</li>\n                <li>Remove root groups</li>\n                <li>Rename root groups</li>\n                <li>Move root groups</li>\n                <li>Rotate root groups</li>\n                <li>Move root group pivots</li>\n                <li>Have cubes or attachment points at root level</li>\n              </ul>\n            </p>\n            <p>Doing any of the above can, and will, create broken/invalid models.</p>\n            <p>All elements added to OptiFine Entities must be placed within one of the existing groups. If you need to rotate something, create a subgroup and rotate that instead.</p>\n            <br>\n            <label>\n              <input type=\"checkbox\" :checked=\"removeRestrictions\" v-model=\"removeRestrictions\">\n              <div>Remove OptiFine Entity Restrictions</div>\n            </label>\n            <p><strong>WARNING:</strong> It is highly recommended to leave restrictions enabled. This setting can be changed later in settings.</p>\n            <br>\n            <div id=\"jem-restrictions-footer\">\n              <div id=\"cem-buttons\">\n                <label>\n                  <input type=\"checkbox\" :checked=\"dontShowAgain\" v-model=\"dontShowAgain\">\n                  <div>Don't Show Again</div>\n                </label>\n                <button @click=\"finish\">OK</button>\n              </div>\n            </div>\n          </div>\n        `\n      }\n    })\n    editCheck = () => {\n      if (Format.id === \"optifine_entity\") {\n        if (!settings.jem_restrictions.value) {\n          const entry = Undo.history[Undo.history.length - 1]\n          const check = editCheckProcess(entry)\n          if (check) {\n            if (settings.dialog_jem_restrictions.value) {\n              jemRestrictionsDialog.show()\n              jemRestrictionsDialog.content_vue.message = check\n            } else {\n              Blockbench.showQuickMessage(check, 1200)\n            }\n            Undo.loadSave(entry.before, entry.post)\n            Undo.history.pop()\n            Undo.index = Undo.history.length\n          }\n        }\n      }\n    }\n    Blockbench.on(\"finished_edit\", editCheck)\n    originalJEMFormat = {\n      new: Formats.optifine_entity.new,\n      format_page: Formats.optifine_entity.format_page,\n      convertTo: Formats.optifine_entity.convertTo\n    }\n    Formats.optifine_entity.new = () => {\n      if (settings.jem_restrictions.value) originalJEMFormat.new.bind(Formats.optifine_entity)()\n      else openLoader()\n    }\n    Formats.optifine_entity.format_page = JSON.parse(JSON.stringify(Formats.optifine_entity.format_page))\n    Formats.optifine_entity.format_page.content.push({ type: \"h3\", text: \"CEM Template Loader\" }, { text: \"Creating an OptiFine entity will open CEM Template Loader. It is extremely rare to need a blank OptiFine entity model. You can disable this behavour with **File > Preferences > Settings > Edit > Remove OptiFine Entity Restrictions**, however, this is not recommended.\" })\n    Formats.optifine_entity.convertTo = () => {\n      originalJEMFormat.convertTo.bind(Formats.optifine_entity)()\n      if (!settings.jem_restrictions.value) {\n        Blockbench.showMessageBox({\n          title: \"Conversion Warning\",\n          message: \"Models converted into OptiFine entities are not valid entity models. If you are converting a model into an OptiFine entity to use it in game, expect it to be broken. Instead load a new template entity model, and copy your elements across into that.\",\n          buttons: [\"Load Template\", \"Continue\"],\n          icon: \"warning\"\n        }, button => {\n          if (button === 0) openLoader()\n        })\n      }\n    }\n  }\n\n  function unloadOptiFineEntityRestrictions() {\n    restrictionStyles.delete()\n    Blockbench.removeListener(\"finished_edit\", editCheck)\n    jemRestrictionsDialog.close()\n    Formats.optifine_entity.new = originalJEMFormat.new\n    Formats.optifine_entity.format_page = originalJEMFormat.format_page\n    Formats.optifine_entity.convertTo = originalJEMFormat.convertTo\n  }\n\n  function editCheckProcess(entry) {\n    if (entry.before.outliner) {\n      for (const group of entry.before.outliner) {\n        const postGroup = entry.post.outliner.find(e => e.uuid === group.uuid)\n        if (!postGroup) return \"You cannot remove root cubes/groups!\"\n        if (!group.origin.reduce((a, e, x) => a && e === postGroup.origin[x], true)) {\n          return \"You cannot move root groups!\"\n        } else if (group.name !== postGroup.name) {\n          return \"You cannot rename root groups!\"\n        }\n      }\n    }\n    if (entry.post.outliner) {\n      for (const group of entry.post.outliner) {\n        const beforeGroup = entry.before.outliner.find(e => e.uuid === group.uuid)\n        if (!beforeGroup) return \"You cannot add new root cubes/groups!\"\n      }\n    }\n    if (entry.before.groups && entry.post.groups) {\n      for (const beforeGroup of entry.before.groups) {\n        const postGroup = entry.post.groups.find(e => e.uuid === beforeGroup.uuid)\n        if (postGroup && Outliner.root.find(node => node instanceof Group && node.uuid == beforeGroup.uuid)) {\n          if (!beforeGroup.rotation.reduce((a, e, x) => a && e === postGroup.rotation[x], true)) {\n            return \"You cannot rotate root groups!\"\n          } else if (!beforeGroup.origin.reduce((a, e, x) => a && e === postGroup.origin[x], true)) {\n            return \"You cannot move root group pivots!\"\n          }\n        }\n      }\n    }\n  }\n\n  // OPTIFINE ANIMATION EDITOR\n\n  let animationStyles, groupObserver, animationEditorPanel, animationControlPanel, context, boolMap, rangeMap, specialMap, stopAnimations, updateSelection, docShown, documentation, editorKeybinds, tabChange, renameGroup\n  const E = s => $(document.createElement(s))\n  let frameCount\n  const constants = {\n    pi: Math.PI,\n    sin: Math.sin,\n    cos: Math.cos,\n    asin: Math.asin,\n    acos: Math.acos,\n    tan: Math.tan,\n    atan: Math.atan,\n    atan2: Math.atan2,\n    torad: deg => deg / 180 * Math.PI,\n    todeg: rad => rad / Math.PI * 180,\n    min: Math.min,\n    max: Math.max,\n    clamp: (x, min, max) => Math.min(max, Math.max(min, x)),\n    abs: Math.abs,\n    floor: Math.floor,\n    ceil: Math.ceil,\n    exp: Math.exp,\n    frac: x => x - Math.floor(x),\n    log: Math.log,\n    pow: Math.pow,\n    random: seed => {\n      if (!seed) return Math.random()\n      seed = constants.frac(seed * 123.34)\n      seed += seed * (seed + 45.32)\n      return constants.frac(seed * seed)\n    },\n    round: Math.round,\n    signum: Math.sign,\n    sqrt: x => {\n      if (x >= 0) return Math.sqrt(x)\n      return 0\n    },\n    fmod: (x, y) => ((x % y) + y) % y,\n    if: (...args) => {\n      if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== \"boolean\") throw Error\n      for (let i = 0; i < args.length; i += 2) {\n        if (i === args.length - 1) {\n          if (typeof args[i] === \"boolean\") throw Error(\"<strong>if</strong> can only return numbers, use <strong>ifb</strong> instead\")\n          return args[i]\n        } else if (args[i]) {\n          if (typeof args[i + 1] === \"boolean\") throw Error(\"<strong>if</strong> can only return numbers, use <strong>ifb</strong> instead\")\n          return args[i + 1]\n        }\n      }\n    },\n    ifb: (...args) => {\n      if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== \"boolean\") throw Error\n      for (let i = 0; i < args.length; i += 2) {\n        if (i === args.length - 1) {\n          if (typeof args[i] !== \"boolean\") throw Error(\"<strong>ifb</strong> can only return booleans, use <strong>if</strong> instead\")\n          return args[i]\n        } else if (args[i]) {\n          if (typeof args[i + 1] !== \"boolean\") throw Error(\"<strong>ifb</strong> can only return booleans, use <strong>if</strong> instead\")\n          return args[i + 1]\n        }\n      }\n    },\n    between: (x, min, max) => x >= min && x <= max,\n    equals: (x, y, epsilon) => Math.abs(x - y) <= epsilon,\n    in: (x, ...vals) => vals.includes(x),\n    print: (id, int, val) => {\n      if (val === undefined) throw Error(\"Not enough arguments. <strong>print</strong> requires <strong>3</strong> arguments\")\n      if ((settings.ignore_unkown_optifine_animations.value && !(typeof val === \"number\" || typeof val === \"function\")) || (!settings.ignore_unkown_optifine_animations.value && typeof val !== \"number\")) throw Error(\"<strong>print</strong> can only print numbers, use <strong>printb</strong> instead\")\n      if (frameCount % int === 0) console.log(`CEM print(${id}) = ${Number(val)}`)\n      return val\n    },\n    printb: (id, int, val) => {\n      if (val === undefined) throw Error(\"Not enough arguments. <strong>printb</strong> requires <strong>3</strong> arguments\")\n      if (typeof val !== \"boolean\") throw Error(\"<strong>printb</strong> can only print booleans, use <strong>print</strong> instead\")\n      if (frameCount % int === 0) console.log(`CEM print(${id}) = ${val}`)\n      return val\n    },\n    smooth: (id, val) => {\n      return val ?? id\n    },\n    lerp: (a, b, c) => b * (1 - a) + c * a,\n    frame_time: 0\n  }\n  const rangesObj = {\n    pos_x: [-128, 0, 128, 0.1],\n    pos_y: [-64, 64, 320, 0.1],\n    pos_z: [-128, 0, 128, 0.1],\n    rot_x: [0, 0, 2 * Math.PI, 0.01],\n    rot_y: [0, 0, 2 * Math.PI, 0.01],\n    player_pos_x: [-128, 0, 128, 0.1],\n    player_pos_y: [-64, 64, 320, 0.1],\n    player_pos_z: [-128, 0, 128, 0.1],\n    player_rot_x: [0, 0, 2 * Math.PI, 0.01],\n    player_rot_y: [0, 0, 2 * Math.PI, 0.01],\n    health: [0, 20, 20],\n    max_health: [1, 20, 500],\n    limb_speed: [0, 0, 1, 0.01],\n    head_yaw: [-90, 0, 90],\n    head_pitch: [-90, 0, 90],\n    dimension: [-1, 0, 1],\n    rule_index: [0, 0, 256]\n  }\n  const specialsObj = {\n    limb_swing: [0, false],\n    hurt_time: [10, false],\n    death_time: [0, false],\n    swing_progress: [0, false],\n    anger_time: [0, false, 0, 0]\n  }\n  const boolList = new Set([\n    \"is_aggressive\",\n    \"is_alive\",\n    \"is_burning\",\n    \"is_child\",\n    \"is_glowing\",\n    \"is_hurt\",\n    \"is_in_hand\",\n    \"is_in_item_frame\",\n    \"is_in_ground\",\n    \"is_in_gui\",\n    \"is_in_lava\",\n    \"is_in_water\",\n    \"is_invisible\",\n    \"is_on_ground\",\n    \"is_on_head\",\n    \"is_on_shoulder\",\n    \"is_ridden\",\n    \"is_riding\",\n    \"is_sitting\",\n    \"is_sneaking\",\n    \"is_sprinting\",\n    \"is_tamed\",\n    \"is_wet\"\n  ])\n  const enabledBooleans = new Set([\n    \"is_alive\", \"is_on_ground\"\n  ])\n  const boneVars = [\"tx\", \"ty\", \"tz\", \"rx\", \"ry\", \"rz\", \"sx\", \"sy\", \"sz\", \"visible\", \"visible_boxes\"]\n  const renderVars = [\"shadow_size\", \"shadow_opacity\", \"shadow_offset_x\", \"shadow_offset_z\", \"leash_offset_x\", \"leash_offset_y\", \"leash_offset_z\"]\n  const vars = [\n    \"pi\",\n    \"true\",\n    \"false\",\n    \"time\",\n    \"day_time\",\n    \"day_count\",\n    \"limb_swing\",\n    \"limb_speed\",\n    \"age\",\n    \"head_pitch\",\n    \"head_yaw\",\n    \"player_pos_x\",\n    \"player_pos_y\",\n    \"player_pos_z\",\n    \"player_rot_x\",\n    \"player_rot_y\",\n    \"frame_time\",\n    \"frame_counter\",\n    \"dimension\",\n    \"rule_index\",\n    \"health\",\n    \"hurt_time\",\n    \"death_time\",\n    \"anger_time\",\n    \"anger_time_start\",\n    \"max_health\",\n    \"pos_x\",\n    \"pos_y\",\n    \"pos_z\",\n    \"rot_x\",\n    \"rot_y\",\n    \"swing_progress\",\n    \"id\",\n    \"sin()\",\n    \"cos()\",\n    \"asin()\",\n    \"acos()\",\n    \"tan()\",\n    \"atan()\",\n    \"atan2()\",\n    \"torad()\",\n    \"todeg()\",\n    \"min()\",\n    \"max()\",\n    \"clamp()\",\n    \"abs()\",\n    \"floor()\",\n    \"ceil()\",\n    \"exp()\",\n    \"frac()\",\n    \"log()\",\n    \"pow()\",\n    \"random()\",\n    \"round()\",\n    \"signum()\",\n    \"sqrt()\",\n    \"fmod()\",\n    \"lerp()\",\n    \"if()\",\n    \"ifb()\",\n    \"print()\",\n    \"printb()\",\n    \"between()\",\n    \"equals()\",\n    \"in()\",\n    ...boolList\n  ]\n  const varLabels = {\n    \"sin()\": \"sin(x)\",\n    \"cos()\": \"cos(x)\",\n    \"asin()\": \"asin(x)\",\n    \"acos()\": \"acos(x)\",\n    \"tan()\": \"tan(x)\",\n    \"atan()\": \"atan(x)\",\n    \"atan2()\": \"atan2(y, x)\",\n    \"torad()\": \"torad(deg)\",\n    \"todeg()\": \"todeg(rad)\",\n    \"min()\": \"min(x, y, …)\",\n    \"max()\": \"max(x, y, …)\",\n    \"clamp()\": \"clamp(x, min, max)\",\n    \"abs()\": \"abs(x)\",\n    \"floor()\": \"floor(x)\",\n    \"ceil()\": \"ceil(x)\",\n    \"exp()\": \"exp(x)\",\n    \"frac()\": \"frac(x)\",\n    \"log()\": \"log(x)\",\n    \"pow()\": \"pow(x, y)\",\n    \"random()\": \"random(seed)\",\n    \"round()\": \"round(x)\",\n    \"signum()\": \"signum(x)\",\n    \"sqrt()\": \"sqrt(x)\",\n    \"fmod()\": \"fmod(x, y)\",\n    \"lerp()\": \"lerp(t, x, y)\",\n    \"if()\": \"if(c, v, [c2, v2, …,] v_else)\",\n    \"ifb()\": \"ifb(c, v, [c2, v2, …,] v_else)\",\n    \"print()\": \"print(id, n, x)\",\n    \"printb()\": \"printb(id, n, x)\",\n    \"between()\": \"between(x, min, max)\",\n    \"equals()\": \"equals(x, y, epsilon)\",\n    \"in()\": \"in(x, val1, val2, …)\"\n  }\n  globalThis.optifineAnimationVariables = {\n    constants,\n    ranges: rangesObj,\n    booleans: boolList,\n    enabledBooleans: enabledBooleans,\n    autocomplete: vars,\n    autocompleteLabels: varLabels\n  }\n  let bools = new Map()\n  let ranges = new Map()\n  let specials = new Map()\n  const parseCEMA = js => {\n    try {\n      return Function(`\"use strict\";return (function(ctx) {\n        try {\n          return (${js})\n        } catch (err) {\n          return err\n        }\n      })`)()(context)\n    } catch (err) {\n      return err\n    }\n  }\n  const reInnerGroups = /(?<!\\w)\\([^(),]*\\)/g\n  const reInnerFuncArgs = /(?<=\\w\\()[^()]*(?=\\))/g\n  function preprocessCEMA(anim, group) {\n    if (typeof anim === \"number\") return anim\n    if (typeof anim !== \"string\") throw [\"Expression must be a string/number\"]\n    anim = anim.trim()\n    if (anim.length === 0) return \"\"\n    const boolsMatch = anim.matchAll(/(?<=[\\s\\n(!&|=,]|^)is_[a-z_]+(?=[\\s\\n)!&|=,]|$)/g)\n    for (const bool of boolsMatch) {\n      if (!boolList.has(bool[0])) {\n        if (settings.ignore_unkown_optifine_animations.value) {\n          boolMap.set(bool[0], false)\n        } else {\n          if (!boolList.has(bool[0])) throw [`Unknown boolean: \"<span style=\"font-weight:600\">${bool[0]}</span>\" is not a supported boolean`]\n        }\n      } else {\n        boolMap.set(bool[0], bools.get(bool[0]) ?? enabledBooleans.has(bool[0]) ? true : false)\n      }\n    }\n    const check = anim.match(/[^a-z0-9_,\\+\\-\\*\\/%!&\\|>=<\\(\\)\\[\\]:\\.\\s]/gi)\n    if (check) throw [`Unsupported character \"<span style=\"font-weight:600\">${check[0]}</span>\" in animation \"<span style=\"font-weight:600\">${anim.replace(/</g, \"&lt;\")}</span>\"`]\n    const check2 = anim.match(/[\\)\\]]\\s*\\(|=>|(?<!\\b(?:varb|visible)?)\\.(?![trs][xyz]\\b|\\d+)[a-z]+|[^a-z0-9_]\\[|(?!==)(?<=[^=!><]|^)=|<<=|>>>=|>>=|[!=]==|\\+\\+|--|\\.\\.\\.|(?<![$\\u200c\\u200d\\p{ID_Continue}])\\d+n|[$\\u200c\\u200d\\p{ID_Continue}]+\\.[$\\u200c\\u200d\\p{ID_Continue}]+[\\.\\(]|(?<!&)&(?!&)|(?<!\\|)\\|(?!\\|)|<<|>>>?|\\*\\*/ui)\n    if (check2) throw [`Invalid syntax \"<span style=\"font-weight:600\">${check2[0].replace(/</g, \"&lt;\")}</span>\" in animation \"<span style=\"font-weight:600\">${anim.replace(/</g, \"&lt;\")}</span>\"`]\n    const check3 = anim.match(/(?<![a-z0-9_])([0-9_]+[a-z0-9_]*)\\.[a-z_]+/i)\n    if (check3) throw [`Unsupported bone name \"<span style=\"font-weight:600\">${check3[0]}</span>\": Bone names cannot start with numbers or underscores`]\n    const check4 = anim.matchAll(/(?<![a-z0-9_])([a-z0-9_]+[a-z0-9_]*)\\.([a-z_]+)/gi)\n    for (const m of check4) {\n      if (m[1] === \"render\") {\n        if (!renderVars.includes(m[2])) throw [`Invalid \"<span style=\"font-weight:600\">render</span>\" variable: \"<span style=\"font-weight:600\">${m[2]}</span>\" is not a render variable`]\n      } else if (![\"this\", \"part\", \"var\", \"varb\", \"root\"].includes(m[1]) && !Group.all.find(e => e.name === m[1])) {\n        throw [`Unknown group \"<span style=\"font-weight:600\">${m[1]}</span>\" in animation \"<span style=\"font-weight:600\">${anim.replace(/</g, \"&lt;\")}</span>\"`]\n      }\n    }\n    const check5 = anim.match(/(?<![a-z0-9_])(?:\\.[0-9]+|[0-9]+\\.(?![0-9]))/i)\n    if (check5) throw [`Invalid number \"<span style=\"font-weight:600\">${check5[0]}</span>\": Numbers must have digits before and after the decimal point`]\n    if (anim.match(/\\(/g)?.length !== anim.match(/\\)/g)?.length) throw [`Invalid syntax in animation \"<span style=\"font-weight:600\">${anim.replace(/</g, \"&lt;\")}</span>\": Number of opening and closing brackets do not match`]\n    let s = anim, allArgs = \"\"\n    while (reInnerGroups.test(s)) s = s.replace(reInnerGroups, \"\")\n    while (reInnerFuncArgs.test(s)) {\n      allArgs += s.match(reInnerFuncArgs).join(\"\")\n      s = s.replace(/\\w\\([^()]*\\)/g, \"\")\n      while (reInnerGroups.test(s)) s = s.replace(reInnerGroups, \"\")\n    }\n    if (allArgs.match(/,/g)?.length !== anim.match(/,/g)?.length) throw [`Invalid syntax in animation \"<span style=\"font-weight:600\">${anim.replace(/</g, \"&lt;\")}</span>\": Commas are not allowed outside of functions`]\n    return anim\n      .replace(/:[a-z_]([a-z0-9_]+)?/gi, m => `.children[\"${m.slice(1)}\"]`)\n      .replace(/(?<=[\\s\\n(+*\\/%!&|=<>,-]|^)[a-z_]([a-z0-9_]+)?/gi, (m, g, o, s) => {\n        if (m === \"render\") return `ctx[\"${m}\"]`\n        if ([\"this\", \"part\"].includes(m)) m = group\n        if (s[o + m.length] === \".\") return `ctx[Symbol.for(\"${m}\")]`\n        if (m in rangesObj && !rangeMap.has(m)) rangeMap.set(m, ranges.get(m) ?? [rangesObj[m], rangesObj[m]?.[1] ?? rangesObj[m]])\n        if (m in specialsObj && !specialMap.has(m)) specialMap.set(m, specials.get(m) ?? specialsObj[m])\n        return m === \"true\" || m === \"false\" ? m : `ctx[\"${m}\"]`\n      })\n  }\n  let timescale = 1\n  function loadOptiFineAnimationEditor() {\n    let steps, playing, paused, currentGroups\n    new Setting(\"ignore_unkown_optifine_animations\", {\n      value: false,\n      category: \"edit\",\n      name: \"Ignore Unknown OptiFine Animations\",\n      description: \"If an OptiFine animation contains unknown animations, they will be ignored, allowing the animation to play and the model to be exported. WARNING: Unknown animations will cause the model to fail to load when using OptiFine.\"\n    })\n    animationStyles = Blockbench.addCSS(`\n      #panel_cem_animation .panel_vue_wrapper {\n        flex: 1;\n        padding: 8px;\n        overflow: auto !important;\n        display: flex;\n        flex-direction: column;\n        max-height: 100%;\n      }\n      #panel_cem_animation .prism-editor-wrapper {\n        background-color: var(--color-back);\n        padding-top: 0;\n      }\n      #panel_cem_animation .prism-editor-wrapper::-webkit-scrollbar-track, #panel_cem_animation .prism-editor-wrapper::-webkit-scrollbar-corner {\n        background-color: var(--color-back);\n      }\n      #panel_cem_animation .prism-editor__line-numbers {\n        overflow: visible;\n        min-height: 100% !important;\n        position: sticky;\n        left: 0;\n      }\n      #panel_cem_animation .prism-editor__line-number {\n        background-color: var(--color-back);\n        translate: -4px 0;\n        padding: 0 4px;\n      }\n      #panel_cem_animation .prism-editor__code {\n        overflow: visible !important;\n      }\n      #cem_animation_editor_container {\n        overflow: hidden;\n        flex: 1;\n        max-height: calc(100% - 40px);\n        min-height: 37px;\n        display: flex;\n        position: relative;\n      }\n      #cem_animation_controller_container {\n        flex: 1;\n        padding: 8px;\n        display: flex;\n        flex-direction: column;\n        max-height: 100%;\n        overflow-y: auto;\n\n        .cem_animation_button {\n          height: initial;\n          min-width: max-content;\n          flex: 1;\n\n          button {\n            width: 100%;\n            position: relative;\n            overflow: hidden;\n\n            &::before {\n              content: \"\";\n              position: absolute;\n              bottom: 0;\n              left: 0;\n              right: var(--progress, 100%);\n              height: 3px;\n              background-color: var(--color-accent);\n            }\n\n            &:not(.cem_animation_button_disabled):hover::before {\n              background-color: var(--color-light);\n            }\n          }\n        }\n      }\n      #cem_animation_editor {\n        cursor: text;\n        flex: 1;\n      }\n      #cem_animation_title {\n        margin-left: 0;\n      }\n      #cem_animation_content {\n        flex-direction: column;\n        flex: 1;\n        max-height: 100%;\n      }\n      .cem_animation_bar {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n      .cem_animation_bar span {\n        display: flex;\n        gap: 8px;\n        align-items: center;\n      }\n      #cem_animation_part_name {\n        display: inline !important;\n      }\n      .cem_animation_bar i, #cem_doc > div.selected {\n        display: block;\n      }\n      .cem_animation_status {\n        min-width: 25px;\n        height: 25px;\n        border-radius: 50%;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n      }\n      #cem_animation_status_success {\n        background-color: var(--color-confirm);\n        color: var(--color-dark);\n      }\n      #cem_animation_status_error {\n        background-color: var(--color-error);\n        color: var(--color-light);\n        display: none;\n      }\n      #cem_animation_status_warning {\n        background-color: transparent;\n        fill: #FFA500;\n        display: none;\n        position: relative;\n      }\n      #cem_animation_status_warning:after {\n        content: \"!\";\n        position: absolute;\n        font-weight: 600;\n        font-size: 20px;\n        color: var(--color-dark);\n      }\n      #cem_animation_error_message {\n        display: flex;\n        margin-left: 8px;\n        gap: 3px;\n        overflow-x: auto;\n        white-space: nowrap;\n      }\n      #cem_animation_error_message span {\n        font-family: var(--font-code);\n        color: #a6e22e;\n      }\n      .cem_animation_error_line {\n        background-color: var(--color-error) !important;\n        color: var(--color-light) !important;\n        position: relative;\n        padding-right: 4px;\n        margin-right: -4px;\n      }\n      .cem_animation_error_line::after {\n        content: \"\";\n        position: absolute;\n        left: 100%;\n        border-top: 12px solid transparent;\n        border-bottom: 12px solid transparent;\n        border-left: 12px solid var(--color-error);\n      }\n      .spacer {\n        flex: 1;\n      }\n      .cem_animation_bool {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex: 1 1 50%;\n        padding-right: 8px;\n      }\n      .cem_animation_range {\n        display: flex;\n        align-items: center;\n        margin: 0 !important;\n        height: 30px;\n        box-sizing: content-box;\n      }\n      .cem_animation_range > input:first-of-type {\n        flex: 1 1 0px;\n        min-width: 40px;\n      }\n      .cem_animation_range p {\n        margin: 0 8px 0 0;\n      }\n      .cem_animation_range_number {\n        width: 2em;\n        margin-left: 2px;\n        cursor: text;\n        min-width: 44px;\n      }\n      .cem_animation_button {\n        height: 25px;\n        min-width: 30px;\n        cursor: pointer;\n        position: relative;\n      }\n      .cem_animation_button:hover, #cem_animation_doc_button:hover {\n        color: var(--color-light);\n      }\n      .cem_animation_button i {\n        position: absolute;\n        top: -3px;\n        font-size: 30px;\n        min-width: 30px;\n      }\n      .cem_animation_button_small {\n        height: 15px;\n        min-width: 20px;\n      }\n      .cem_animation_button_small i {\n        font-size: 20px;\n        min-width: 20px;\n      }\n      .cem_animation_button_disabled, .cem_animation_button_disabled div {\n        color: var(--color-subtle_text) !important;\n        cursor: default;\n      }\n      button.cem_animation_button_disabled {\n        text-decoration: none;\n        opacity: 0.5;\n      }\n      button.cem_animation_button_disabled:hover {\n        background-color: var(--color-button);\n        color: var(--color-subtle_text) !important;\n      }\n      #panel_cem_animation > h3 > label, #panel_cem_animation_controller > h3 > label {\n        white-space: nowrap;\n        text-overflow: ellipsis;\n      }\n      #cem_animation_controller_variables {\n        position: relative;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n      #cem_animation_controller_variables:not(:empty) {\n        margin-top: 24px;\n      }\n      #cem_animation_controller_variables:not(:empty)::before {\n        content: \"\";\n        position: absolute;\n        bottom: calc(100% + 10px);\n        left: 0;\n        right: 0;\n        height: 1px;\n        background-color: var(--color-border);\n      }\n      #cem_animation_range_labels div {\n        height: 30px;\n        display: flex;\n        align-items: center;\n      }\n      #cem_animation_range_sliders {\n        min-width: 0;\n        flex: 1;\n      }\n      #cem_animation_ranges > div{\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n      }\n      #cem_animation_bools {\n        display: flex;\n        flex-wrap: wrap;\n      }\n      #cem_animation_buttons {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n      #cem_animation_doc_button {\n        cursor: pointer;\n      }\n      #cem_animation_format_button {\n        position: absolute;\n        top: 12px;\n        right: 12px;\n      }\n    `)\n    animationControlPanel = new Panel(\"cem_animation_controller\", {\n      name: \"Animation Controller\",\n      condition: {\n        formats: [\"optifine_entity\"],\n        modes: [\"edit\"]\n      },\n      default_position: {\n        folded: true,\n        slot: \"left_bar\",\n        sidebar_index: 99\n      },\n      component: {\n        template: `\n          <div id=\"cem_animation_controller_container\">\n            <div class=\"cem_animation_range bar slider_input_combo\">\n              <p>Timescale</p>\n              <input id=\"cem_animation_timescale_slider\" type=\"range\" min=0 max=4 step=0.05 value=1></input>\n              <input id=\"cem_animation_timescale_text\" class=\"tool cem_animation_range_number\" type=\"number\" min=0 max=4 step=0.05 value=1>\n            </div>\n            <div id=\"cem_animation_controller_variables\">\n            </div>\n          </div>\n        `\n      }\n    })\n    let timescaleTimeout\n    const timescaleSlider = $(\"#cem_animation_timescale_slider\")\n    const timescaleText = $(\"#cem_animation_timescale_text\")\n    timescaleSlider.on(\"input\", () => {\n      timescaleText.val(timescaleSlider.val())\n      timescale = parseFloat(timescaleSlider.val())\n    })\n    timescaleText.on(\"input\", () => {\n      timescaleSlider.val(timescaleText.val())\n      const clamped = Math.min(4, Math.max(0, parseFloat(timescaleText.val())))\n      clearTimeout(timescaleTimeout)\n      timescaleTimeout = setTimeout(() => timescaleText.val(isNaN(clamped) ? 1 : clamped), 1000)\n      timescale = clamped\n    })\n    animationEditorPanel = new Panel(\"cem_animation\", {\n      name: \"Animation Editor\",\n      growable: true,\n      condition: {\n        formats: [\"optifine_entity\"],\n        modes: [\"edit\"]\n      },\n      default_position: {\n        folded: true,\n        slot: \"bottom\"\n      },\n      component: {\n        components: {\n          VuePrismEditor\n        },\n        data: {\n          text: \"\"\n        },\n        methods: {\n          change() {\n            stopAnimations()\n            const text = this.text.trim()\n            if (text === \"\") {\n              animationErrorToggle()\n              return group.cem_animations = []\n            }\n            const parsed = parseAnimations(text)\n            if (parsed) group.cem_animations = parsed\n          },\n          format() {\n            if (formatButton.hasClass(\"cem_animation_button_disabled\")) return\n            this.text = JSON.stringify(JSON.parse(this.text), null, 2)\n          },\n          play() {\n            if (playButton.hasClass(\"cem_animation_button_disabled\")) return\n            currentGroups = Group.all.filter(e => e.parent === \"root\")\n            setupAnimations(currentGroups)\n          },\n          stop: () => stopAnimations(),\n          pause() {\n            if (paused) {\n              paused = false\n              prevTime = Date.now()\n              Blockbench.on(\"render_frame\", playAnimations)\n              pauseButton.text(\"pause\").attr(\"title\", \"Pause the animations\")\n            } else {\n              paused = true\n              Blockbench.removeListener(\"render_frame\", playAnimations)\n              pauseButton.text(\"play_arrow\").attr(\"title\", \"Resume the animations\")\n            }\n          },\n          showDoc: () => showDocumentation(),\n          autocomplete(text, position) {\n            const before = text.substring(0, position)\n            if (before.match(/\"/g)?.length % 2 !== 1) return []\n            const beginning = text.substring(0, position).split(/[^a-zA-Z0-9_.]\\.*/g).last()\n            if (reInValue.test(before)) {\n              if (beginning.includes(\".\")) {\n                const [prefix, str] = beginning.split(\".\")\n                if (!prefix.match(/^\\d+$/)) {\n                  if ([\"var\", \"varb\"].includes(prefix)) return []\n                  return filterAndSortList(boneVars, str)\n                }\n                return []\n              }\n              const groups = Group.all.map(e => e.name).concat(\"var\", \"varb\")\n              return filterAndSortList(groups.map(e => `${e}.`).concat(vars), beginning, null, Object.assign(Object.fromEntries(groups.map(e => [`${e}.`, e])), varLabels))\n            }\n            if (beginning.includes(\".\")) {\n              const [prefix, str] = beginning.split(\".\")\n              if (!prefix.match(/^\\d+$/)) {\n                if ([\"var\", \"varb\"].includes(prefix)) return []\n                if (prefix === \"render\") return filterAndSortList(renderVars, str)\n                return filterAndSortList(boneVars, str)\n              }\n              return []\n            }\n            const groups = Group.all.map(e => e.name).concat(\"var\", \"varb\", \"render\")\n            return filterAndSortList(groups.map(e => `${e}.`), beginning, null, Object.fromEntries(groups.map(e => [`${e}.`, e])))\n          }\n        },\n        template: `\n          <div id=\"cem_animation_content\">\n            <div class=\"cem_animation_bar\" style=\"margin-bottom:8px\">\n              <p id=\"cem_animation_title\" class=\"panel_toolbar_label\">Editing animations for part: <span id=\"cem_animation_part_name\" style=\"font-weight:600\"></span></p>\n              <span class=\"spacer\"></span>\n              <span id=\"cem_animation_doc_button\" @click=\"showDoc()\" title=\"Animation documentation\">\n                <p>Documentation</p>\n                <div class=\"cem_animation_button cem_animation_button_small\"><i class=\"material-icons\">description</i></div>\n              </span>\n            </div>\n            <div id=\"cem_animation_editor_container\">\n              <vue-prism-editor id=\"cem_animation_editor\" class=\"capture_tab_key\" v-model=\"text\" language=\"json\" line-numbers @change=\"change()\" :autocomplete=\"autocomplete\"/>\n              <div id=\"cem_animation_format_button\" class=\"cem_animation_button\"><i class=\"material-icons\" @click=\"format()\" title=\"Pretty print the animation code\">code</i></div>\n            </div>\n            <div class=\"cem_animation_bar\" style=\"margin-top:8px\">\n              <div id=\"cem_animation_status_success\" class=\"cem_animation_status\">\n                <i class=\"fa fa-check\"></i>\n              </div>\n              <div id=\"cem_animation_status_error\" class=\"cem_animation_status\">\n                <i class=\"material-icons\">clear</i>\n              </div>\n              <div id=\"cem_animation_status_warning\" class=\"cem_animation_status\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 122.88 111.54\"><path d=\"M2.35 84.42L45.28 10.2l.17-.27h0a23 23 0 0 1 7.05-7.24A17 17 0 0 1 61.57 0a16.7 16.7 0 0 1 9.11 2.69 22.79 22.79 0 0 1 7 7.26q.19.32.36.63l42.23 73.34.24.44h0a22.48 22.48 0 0 1 2.37 10.19 17.63 17.63 0 0 1-2.17 8.35 15.94 15.94 0 0 1-6.93 6.6c-.19.1-.39.18-.58.26a21.19 21.19 0 0 1-9.11 1.75h0-86.48-.65a18.07 18.07 0 0 1-6.2-1.15A16.42 16.42 0 0 1 3 104.24a17.53 17.53 0 0 1-3-9.57 23 23 0 0 1 1.57-8.74 7.66 7.66 0 0 1 .77-1.51z\"/></svg>\n              </div>\n              <div id=\"cem_animation_error_message\"></div>\n              <span class=\"spacer\"></span>\n              <span id=\"cem_animation_play_button\">\n                <div class=\"cem_animation_button\"><i class=\"material-icons\" @click=\"play()\" title=\"Play animations\">play_arrow</i></div>\n              </span>\n              <span id=\"cem_animation_stop_button\" style=\"display:none\">\n                <div class=\"cem_animation_button\"><i class=\"material-icons\" @click=\"stop()\" title=\"Stop the animations\">stop</i></div>\n                <div class=\"cem_animation_button\"><i id=\"cem_animation_pause_button\" class=\"material-icons\" @click=\"pause()\" title=\"Pause the animations\">pause</i></div>\n              </span>\n            </div>\n          </div>\n        `\n      }\n    })\n    const reInValue = /:[\\s\\n]*\"[^\"]*$/\n    function filterAndSortList(list, match, blacklist, labels) {\n      const result = list.filter(f => f.startsWith(match) && f.length !== match.length)\n      list.forEach(f => {\n        if (!result.includes(f) && f.includes(match) && f.length !== match.length) result.push(f)\n      })\n      if (blacklist) blacklist.forEach(black => result.remove(black))\n      return result.map(text => ({text, label: labels && labels[text], overlap: match.length}))\n    }\n    const partName = $(\"#cem_animation_part_name\")\n    const statusSuccess = $(\"#cem_animation_status_success\")\n    const statusError = $(\"#cem_animation_status_error\")\n    const statusWarning = $(\"#cem_animation_status_warning\")\n    const errorMessage = $(\"#cem_animation_error_message\")\n    const playButton = $(\"#cem_animation_play_button\")\n    const stopButton = $(\"#cem_animation_stop_button\")\n    const pauseButton = $(\"#cem_animation_pause_button\")\n    const formatButton = $(\"#cem_animation_format_button\")\n    const editor = $(\"#cem_animation_editor code\")\n    const controller = $(\"#cem_animation_controller_variables\")\n    const editorWrapper = $(\"#cem_animation_editor\")\n    let time = 0\n    let prevTime\n    const invertions = new Set([\"tx\", \"rx\", \"ry\"])\n    function setupAnimations(groups, keepTime) {\n      playing = true\n      playButton.css(\"display\", \"none\")\n      stopButton.css(\"display\", \"flex\")\n      if (!keepTime) time = 0\n      constants.id = Math.random()\n      constants[Symbol.for(\"var\")] = new Proxy({}, {\n        get(target, name, receiver) {\n          if (Reflect.has(target, name)) {\n            return Reflect.get(target, name, receiver)\n          } else {\n            return 0\n          }\n        },\n        set(target, name, value, receiver) {\n          if (typeof value !== \"number\") throw Error(\"A <strong>var</strong> must be set to a number\")\n          return Reflect.set(target, name, value, receiver)\n        }\n      })\n      constants[Symbol.for(\"varb\")] = new Proxy({}, {\n        get(target, name, receiver) {\n          if (Reflect.has(target, name)) {\n            return Reflect.get(target, name, receiver)\n          } else {\n            return false\n          }\n        },\n        set(target, name, value, receiver) {\n          if (typeof value !== \"boolean\") throw Error(\"A <strong>varb</strong> must be set to a boolean\")\n          return Reflect.set(target, name, value, receiver)\n        }\n      })\n      frameCount = 0\n      steps = []\n      boolMap = new Map()\n      rangeMap = new Map()\n      specialMap = new Map()\n      for (const group of groups) for (const section of group.cem_animations) for (const [key, val] of Object.entries(section)) {\n        const split = key.split(\".\")\n        if (split[0] === \"render\") continue\n        else if (split[0] === \"var\") {\n          steps.push({\n            type: \"variable\",\n            key,\n            raw: val,\n            anim: `ctx[Symbol.for(\"var\")].${split[1]} = ${preprocessCEMA(val, group.name)}`\n          })\n        } else if (split[0] === \"varb\") {\n          steps.push({\n            type: \"variableBoolean\",\n            key,\n            raw: val,\n            anim: `ctx[Symbol.for(\"varb\")].${split[1]} = ${preprocessCEMA(val, group.name)}`\n          })\n        } else if (split[1] === \"visible\") {\n          const part = [\"this\", \"part\"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0])\n          steps.push({\n            type: \"visible\",\n            part,\n            key,\n            raw: val,\n            anim: preprocessCEMA(val, group.name)\n          })\n        } else if (split[1] === \"visible_boxes\") {\n          const part = [\"this\", \"part\"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0])\n          steps.push({\n            type: \"visible_boxes\",\n            part,\n            key,\n            raw: val,\n            anim: split[0] === group.name || split[0] === \"part\" ? true : preprocessCEMA(val, group.name)\n          })\n        } else {\n          const part = [\"this\", \"part\"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0])\n          if (!part || part.cemAnimationDisableRotation && split[1][0] === \"r\") continue\n          let anim\n          try {\n            anim = split[1] === \"ty\" ? `${part.parent === \"root\" ? \"24-\" : part.parent?.parent === \"root\" ? `- ${part.mesh.parent.position.y}-` : \"-\"}(${preprocessCEMA(val, group.name)})` : split[1] === \"tz\" && part.parent?.parent === \"root\" ? `(${preprocessCEMA(val, group.name)}) - ${part.mesh.parent.position.z}` : split[1] === \"tx\" && part.parent?.parent === \"root\" ? `(${preprocessCEMA(val, group.name)}) + ${part.mesh.parent.position.x}` : preprocessCEMA(val, group.name)\n          } catch (err) {\n            return animationErrorToggle(err)\n          }\n          steps.push({\n            type: \"animation\",\n            part,\n            mode: split[1][0] === \"t\" ? \"position\" : split[1][0] === \"r\" ? \"rotation\" : \"scale\",\n            axis: split[1][1],\n            transform: split[1],\n            key,\n            raw: val,\n            anim,\n            invert: invertions.has(split[1]) ? -1 : 1\n          })\n        }\n      }\n      controller.empty()\n      bools = new Map(boolMap)\n      if (bools.size) {\n        const boolsSorted = [...bools.entries()]\n        boolsSorted.sort(((a, b) => b[0] - a[0]))\n        const boolContainer = E(\"div\").attr(\"id\", \"cem_animation_bools\").appendTo(controller)\n        for (const bool of boolsSorted) {\n          boolContainer.append(E(\"div\").addClass(\"cem_animation_bool\").append(\n            E(\"input\").attr({\n              id: `cem_animation_${bool[0]}_bool`,\n              type: \"checkbox\",\n              name: bool[0],\n              checked: bool[1]\n            }).on(\"change\", evt => bools.set(bool[0], evt.target.checked)),\n            E(\"label\").attr(\"for\", bool[0]).text(bool[0]),\n          ))\n        }\n      }\n      specials = new Map(specialMap)\n      if (specials.has(\"limb_swing\")) {\n        let container = $(\"#cem_animation_bools\")\n        if (!container.length) container = E(\"div\").attr(\"id\", \"cem_animation_bools\").appendTo(controller)\n        specials.get(\"limb_swing\")[0] = 0\n        container.prepend(E(\"div\").addClass(\"cem_animation_bool\").append(\n          E(\"input\").attr({\n            type: \"checkbox\",\n            name: \"limb_swing\",\n            checked: specials.get(\"limb_swing\")[1]\n          }).on(\"change\", evt => specials.get(\"limb_swing\")[1] = evt.target.checked),\n          E(\"label\").attr(\"for\", \"limb_swing\").text(\"limb_swing\")\n        ))\n      }\n      ranges = new Map(rangeMap)\n      let rangesSorted\n      function updateHealth(num) {\n        if (ranges.has(\"health\")) {\n          const health = ranges.get(\"health\")\n          health[0][2] = num\n          const slider = $(\"#cem_animation_range_health_slider\")\n          const number = $(\"#cem_animation_range_health_text\")\n          const current = parseInt(slider.val())\n          const val = current > num ? num : current\n          const attr = {\n            max: num,\n            value: val\n          }\n          slider.attr(attr)\n          number.attr(attr)\n          slider.val(val)\n          number.val(val)\n        }\n      }\n      if (ranges.size) {\n        rangesSorted = [...ranges.entries()]\n        rangesSorted.sort(((a, b) => b[0] - a[0]))\n        const rangeContainer = E(\"div\").attr(\"id\", \"cem_animation_ranges\").append(E(\"div\").attr(\"id\", \"cem_animation_range_labels\"), E(\"div\").attr(\"id\", \"cem_animation_range_sliders\")).css({\n          display: \"flex\",\n          gap: \"8px\"\n        }).appendTo(controller)\n        for (const range of rangesSorted) {\n          rangeContainer.children().first().append(E(\"div\").text(range[0]))\n          let timeout\n          rangeContainer.children().eq(1).append(E(\"div\").addClass(\"cem_animation_range bar slider_input_combo\").append(\n            E(\"input\").attr({\n              id: `cem_animation_range_${range[0]}_slider`,\n              type: \"range\",\n              min: range[1][0][0],\n              max: range[1][0][2],\n              step: range[1][0][3] ?? 1,\n              value: range[1][1],\n            }).on(\"input\", evt => {\n              const num = parseFloat(evt.target.value)\n              text.val(evt.target.value)\n              ranges.set(range[0], [range[1][0], num])\n              if (range[0] === \"max_health\") updateHealth(num)\n            }),\n            E(\"input\").addClass(\"tool cem_animation_range_number\").attr({\n              id: `cem_animation_range_${range[0]}_text`,\n              type: \"number\",\n              min: range[1][0][0],\n              max: range[1][0][2],\n              step: range[1][0][3] ?? 1,\n              value: range[1][1],\n            }).on(\"input\", evt => {\n              slider.val(evt.target.value)\n              const clamped = Math.min(range[1][0][2], Math.max(range[1][0][0], parseFloat(evt.target.value)))\n              clearTimeout(timeout)\n              timeout = setTimeout(() => text.val(isNaN(clamped) ? range[1][1] : clamped), 1000)\n              const num = Math.max(range[1][0][0], clamped)\n              ranges.set(range[0], [range[1][0], num])\n              if (range[0] === \"max_health\") updateHealth(num)\n            })\n          ))\n          const slider = $(`#cem_animation_range_${range[0]}_slider`)\n          const text = $(`#cem_animation_range_${range[0]}_text`)\n        }\n      }\n      if (specials.has(\"hurt_time\")) {\n        let container = $(\"#cem_animation_buttons\")\n        if (!container.length) container = E(\"div\").attr(\"id\", \"cem_animation_buttons\").appendTo(controller)\n        const button = E(\"div\").addClass(\"cem_animation_button\").append(\n          E(\"button\").attr({\n            id: \"cem_animation_hurt_time_button\",\n            title: 'Simulate the entity taking damage. Runs \"hurt_time\"'\n          }).text(\"Hurt entity\").on(\"click\", evt => {\n            if ($(evt.target).hasClass(\"cem_animation_button_disabled\")) return\n            specials.set(\"hurt_time\", [10, true])\n            button.children().first().addClass(\"cem_animation_button_disabled\")\n            const hurtTimeBool = $(\"#cem_animation_is_hurt_bool\")\n            if (hurtTimeBool) {\n              hurtTimeBool.prop(\"checked\", true)\n              bools.set(\"is_hurt\", true)\n            }\n          })\n        ).appendTo(container)\n        if (specials.get(\"hurt_time\")[1] === true) button.children().first().addClass(\"cem_animation_button_disabled\")\n      }\n      if (specials.has(\"death_time\")) {\n        let container = $(\"#cem_animation_buttons\")\n        if (!container.length) container = E(\"div\").attr(\"id\", \"cem_animation_buttons\").appendTo(controller)\n        const button = E(\"div\").addClass(\"cem_animation_button\").append(\n          E(\"button\").attr({\n            id: \"cem_animation_death_time_button\",\n            title: 'Simulate the entity getting killed. Runs \"death_time\"'\n          }).text(\"Kill entity\").on(\"click\", evt => {\n            if ($(evt.target).hasClass(\"cem_animation_button_disabled\")) return\n            specials.set(\"death_time\", [0, true])\n            button.children().first().addClass(\"cem_animation_button_disabled\")\n          })\n        ).appendTo(container)\n        if (specials.get(\"death_time\")[1] === true) button.children().first().addClass(\"cem_animation_button_disabled\")\n      }\n      if (specials.has(\"swing_progress\")) {\n        let container = $(\"#cem_animation_buttons\")\n        if (!container.length) container = E(\"div\").attr(\"id\", \"cem_animation_buttons\").appendTo(controller)\n        const button = E(\"div\").addClass(\"cem_animation_button\").append(\n          E(\"button\").attr({\n            id: \"cem_animation_swing_progress_button\",\n            title: 'Simulate the entity attacking. Runs \"swing_progress\"'\n          }).text(\"Perform attack\").on(\"click\", evt => {\n            if ($(evt.target).hasClass(\"cem_animation_button_disabled\")) return\n            specials.set(\"swing_progress\", [0, true])\n            button.children().first().addClass(\"cem_animation_button_disabled\")\n          })\n        ).appendTo(container)\n        if (specials.get(\"swing_progress\")[1] === true) button.children().first().addClass(\"cem_animation_button_disabled\")\n      }\n      if (specials.has(\"anger_time\")) {\n        let container = $(\"#cem_animation_buttons\")\n        if (!container.length) container = E(\"div\").attr(\"id\", \"cem_animation_buttons\").appendTo(controller)\n        const button = E(\"div\").addClass(\"cem_animation_button\").append(\n          E(\"button\").attr({\n            id: \"cem_animation_anger_time_button\",\n            title: 'Simulate the entity becoming angry. Runs \"anger_time\"'\n          }).text(\"Anger entity\").on(\"click\", evt => {\n            const start = Math.floor(Math.random() * 381) + 400\n            const delay = (Math.random() * 2 + 1) * 20\n            specials.set(\"anger_time\", [start, true, start, delay])\n            button.children().first().removeClass(\"cem_animation_button_disabled\")\n            const aggressiveBool = $(\"#cem_animation_is_aggressive_bool\")\n            if (aggressiveBool) {\n              aggressiveBool.prop(\"checked\", true)\n              bools.set(\"is_aggressive\", true)\n            }\n          })\n        ).appendTo(container)\n      }\n      prevTime = Date.now()\n      Blockbench.on(\"render_frame\", playAnimations)\n    }\n    function parseAnimations(text) {\n      animationErrorToggle()\n      let animations\n      try {\n        animations = JSON.parse(text)\n        if (!Array.isArray(animations)) throw [\"The top level must be an array\"]\n        for (const [i, animation] of animations.entries()) if (animation === null || typeof animation !== \"object\" || Array.isArray(animation)) {\n          throw [`Unexpected item of type \"${animation === null ? \"null\" : Array.isArray(animation) ? \"array\" : typeof animation}\" at position ${i}`]\n        }\n        animations = animations.filter(e => Object.keys(e).length > 0)\n        for (const section of animations) for (const [key, val] of Object.entries(section)) {\n          if (val.trim?.() === \"\") throw [\"Animations cannot be empty\", key, val]\n          const split = key.split(\".\")\n          if (split[0] === \"render\") {\n            if (!renderVars.includes(split[1])) throw [`Invalid \"<span style=\"font-weight:600\">render</span>\" variable: \"<span style=\"font-weight:600\">${split[1]}</span>\" is not a render variable`]\n            continue\n          }\n          if (split[1] === \"visible_boxes\") continue\n          if (split.length < 2 || split[1] === \"\") throw [`Missing transformation type in animation \"<span style=\"font-weight:600\">${key}</span>\"`, key, val]\n          if (!([\"var\", \"varb\"].includes(split[0]) || split[1] === \"visible\")) {\n            if (split[1].length > 2) throw [`Invalid transformation type in animation \"<span style=\"font-weight:600\">${key}</span>\"`, key, val]\n            if (![\"r\", \"t\", \"s\"].includes(split[1][0])) throw [`Unknown transform type \"<span style=\"font-weight:600\">${split[1][0]}</span>\"`, key, val]\n            if (!split[1][1]) throw [`Missing axis in animation \"<span style=\"font-weight:600\">${key}<span>\"`, key, val]\n            if (![\"x\", \"y\", \"z\"].includes(split[1][1])) throw [`Unknown axis \"<span style=\"font-weight:600\">${split[1][1]}</span>\"`, key, val]\n          }\n          boolMap = new Map()\n          rangeMap = new Map()\n          specialMap = new Map()\n          preprocessCEMA(val, group.name)\n          if (![\"var\", \"varb\"].includes(split[0])) {\n            const part = [\"this\", \"part\", \"root\"].includes(split[0]) ? group : Group.all.find(e => e.name === split[0])\n            if (!part) animationErrorToggle(`Unknown group \"<span style=\"font-weight:600\">${split[0]}</span>\"`, null, true)\n          }\n        }\n      } catch (err) {\n        if (err instanceof SyntaxError) {\n          const numbers = err.message.match(/\\d+/g)\n          if (numbers?.length > 0) {\n            let lineNum, colNum\n            if (numbers.length === 1) {\n              const split = text.substring(0, numbers[0]).split(\"\\n\")\n              lineNum = split.length\n              colNum = split[split.length - 1].length + 1\n            } else {\n              lineNum = parseInt(numbers[0])\n              colNum = parseInt(numbers[1])\n            }\n            return animationErrorToggle(`Unexpected character at line ${lineNum} column ${colNum}`, lineNum)\n          } else {\n            return animationErrorToggle(err)\n          }\n        } else {\n          const split = text.split(\"\\n\")\n          animationErrorToggle(err[0], split.indexOf(split.find(e => e.includes(`\"${err[1]}\"`) && e.includes(`\"${err[2]}\"`))) + 1)\n        }\n      }\n      return animations\n    }\n    function animationErrorToggle(err, lineNum, warning) {\n      $(\".cem_animation_error_line\").removeClass(\"cem_animation_error_line\")\n      if (err) {\n        errorMessage.html(err)\n        statusSuccess.css(\"display\", \"none\")\n        if (!warning) {\n          statusWarning.css(\"display\", \"none\")\n          statusError.css(\"display\", \"flex\")\n          formatButton.addClass(\"cem_animation_button_disabled\")\n          playButton.addClass(\"cem_animation_button_disabled\")\n        } else {\n          statusError.css(\"display\", \"none\")\n          statusWarning.css(\"display\", \"flex\")\n        }\n        if (typeof lineNum === \"number\") {\n          const line = $(`.prism-editor__line-numbers>:nth-child(${lineNum + 1})`)\n          line.addClass(\"cem_animation_error_line\")\n        }\n      } else {\n        statusSuccess.css(\"display\", \"flex\")\n        statusError.css(\"display\", \"none\")\n        statusWarning.css(\"display\", \"none\")\n        errorMessage.text(\"\")\n        formatButton.removeClass(\"cem_animation_button_disabled\")\n        playButton.removeClass(\"cem_animation_button_disabled\")\n      }\n    }\n    let parents\n    function playAnimations() {\n      try {\n        frameCount++\n        const now = Date.now()\n        const dt = (now - prevTime) / 1000\n        constants.frame_time = dt * timescale\n        prevTime = now\n        const difference = 20 * timescale * dt\n        time += difference\n        if (specials.get(\"hurt_time\")?.[0] <= 0) {\n          specials.set(\"hurt_time\", [10, false])\n          $(\"#cem_animation_hurt_time_button\").removeClass(\"cem_animation_button_disabled\")\n          const hurtTimeBool = $(\"#cem_animation_is_hurt_bool\")\n          if (hurtTimeBool) {\n            hurtTimeBool.prop(\"checked\", false)\n            bools.set(\"is_hurt\", false)\n          }\n        }\n        if (specials.get(\"death_time\")?.[0] >= 20) {\n          specials.set(\"death_time\", [0, false])\n          $(\"#cem_animation_death_time_button\").removeClass(\"cem_animation_button_disabled\")\n        }\n        if (specials.get(\"swing_progress\")?.[0] >= 1) {\n          specials.set(\"swing_progress\", [0, false])\n          $(\"#cem_animation_swing_progress_button\").removeClass(\"cem_animation_button_disabled\")\n        }\n        if (specials.get(\"anger_time\")?.[1] && specials.get(\"anger_time\")[0] <= 0) {\n          specials.set(\"anger_time\", [0, false, 0])\n          const aggressiveBool = $(\"#cem_animation_is_aggressive_bool\")\n          if (aggressiveBool) {\n            aggressiveBool.prop(\"checked\", false)\n            bools.set(\"is_aggressive\", false)\n          }\n        }\n        if (specials.has(\"hurt_time\")) {\n          const progress = specials.get(\"hurt_time\")[1] ? (1 - specials.get(\"hurt_time\")[0] / 10) * 100 : 100\n          document.getElementById(\"cem_animation_hurt_time_button\")?.style.setProperty(\"--progress\", progress + \"%\")\n        }\n        if (specials.has(\"death_time\")) {\n          const progress = specials.get(\"death_time\")[1] ? (specials.get(\"death_time\")[0] / 20) * 100 : 100\n          document.getElementById(\"cem_animation_death_time_button\")?.style.setProperty(\"--progress\", progress + \"%\")\n        }\n        if (specials.has(\"swing_progress\")) {\n          const progress = specials.get(\"swing_progress\")[1] ? specials.get(\"swing_progress\")[0] * 100 : 100\n          document.getElementById(\"cem_animation_swing_progress_button\")?.style.setProperty(\"--progress\", progress + \"%\")\n        }\n        if (specials.has(\"anger_time\")) {\n          const a = specials.get(\"anger_time\")\n          const progress = a[1] && a[2] ? (a[3] > 0 ? 0 : (1 - a[0] / a[2]) * 100) : 100\n          document.getElementById(\"cem_animation_anger_time_button\")?.style.setProperty(\"--progress\", progress + \"%\")\n        }\n        if (frameCount === 1) {\n          parents = {}\n          for (const part of Group.all.filter(e => e.parent === \"root\")) {\n            parents[part.name] = {\n              tx: -((part.parent?.parent === \"root\") * part.mesh.parent.position.x + part.mesh.position.x),\n              ty: (part.parent === \"root\") * 24 + (part.parent?.parent === \"root\") * -part.mesh.parent.position.y - part.mesh.position.y,\n              tz: (part.parent?.parent === \"root\") * part.mesh.parent.position.z + part.mesh.position.z,\n              rx: -part.mesh.rotation.x,\n              ry: -part.mesh.rotation.y,\n              rz: part.mesh.rotation.z,\n              sx: part.mesh.scale.x,\n              sy: part.mesh.scale.y,\n              sz: part.mesh.scale.z,\n              visible: true\n            }\n          }\n        }\n        context = Object.assign({\n          time: time,\n          day_time: time % 24000,\n          day_count: Math.floor(time / 24000),\n          age: time,\n          limb_swing: specials.get(\"limb_swing\")?.[1] ? specials.get(\"limb_swing\")[0] += difference / 1.666 : specials.get(\"limb_swing\")?.[0] ?? 0,\n          hurt_time: specials.get(\"hurt_time\")?.[1] ? specials.get(\"hurt_time\")[0] -= difference : 0,\n          death_time: specials.get(\"death_time\")?.[1] ? specials.get(\"death_time\")[0] += difference : 0,\n          swing_progress: specials.get(\"swing_progress\")?.[1] ? specials.get(\"swing_progress\")[0] += difference / 4 : 0,\n          anger_time: specials.get(\"anger_time\")?.[1] ? (specials.get(\"anger_time\")[3] > 0 ? (specials.get(\"anger_time\")[3] -= difference, specials.get(\"anger_time\")[0]) : specials.get(\"anger_time\")[0] -= difference) : 0,\n          anger_time_start: specials.get(\"anger_time\")?.[2] ?? 0,\n          frame_counter: frameCount % 720719,\n          render: Object.fromEntries(renderVars.map(e => [e, 0]))\n        }, constants, Object.fromEntries(bools), Object.fromEntries(Array.from(ranges.entries()).map(e => [e[0], e[1][1]])))\n        if (settings.ignore_unkown_optifine_animations.value) {\n          context = new Proxy(context, {\n            get(target, prop) {\n              if (prop in target) return target[prop]\n              const num = e => e ?? 0\n              num.valueOf = () => 0\n              return num\n            }\n          })\n        } else {\n          context = new Proxy(context, {\n            get(target, prop) {\n              if (prop in target) return target[prop]\n              throw new Error(`Unknown variable / function<div style=\"padding-right:10px\">:</div> \" <span style=\"font-weight:600\">${prop}</span> \"`)\n            }\n          })\n        }\n        const parts = new Map()\n        for (const part of Group.all) {\n          const partObj = {\n            children: {},\n            tx: -((part.parent?.parent === \"root\") * part.mesh.parent.position.x + part.mesh.position.x),\n            ty: (part.parent === \"root\") * 24 + (part.parent?.parent === \"root\") * -part.mesh.parent.position.y - part.mesh.position.y,\n            tz: (part.parent?.parent === \"root\") * part.mesh.parent.position.z + part.mesh.position.z,\n            rx: -part.mesh.rotation.x,\n            ry: -part.mesh.rotation.y,\n            rz: part.mesh.rotation.z,\n            sx: part.mesh.scale.x,\n            sy: part.mesh.scale.y,\n            sz: part.mesh.scale.z,\n            visible: true\n          }\n          parts.set(part, partObj)\n          context[Symbol.for(part.name)] = partObj\n        }\n        for (const part of Group.all.filter(e => e.parent !== \"root\")) {\n          const partObj = parts.get(part)\n          for (const child of part.children) partObj.children[child.name] = parts.get(child)\n        }\n        for (const step of steps) {\n          if (step.type === \"animation\" && typeof anim === \"string\" && step.part.name in parents) {\n            step.anim = step.anim.replace(`ctx[\"Symbol.for(${step.part.name})\"].${step.transform}`, parents[step.part.name][step.transform])\n          }\n          let parsed = parseCEMA(step.anim)\n          if (isNaN(parsed)) {\n            if (typeof parsed === \"number\") parsed = 0\n            else {\n              if (parsed?.message) throw `Invalid animation for \"<span style=\"font-weight:600\">${step.key}</span>\"<div style=\"padding-right:10px\">:</div> ${parsed.message}`\n              throw `Unable to parse animation \"<span style=\"font-weight:600\">${step.raw.replace(/</g, \"&lt;\")}</span>\" for \"<span style=\"font-weight:600\">${step.key}</span>\"`\n            }\n          } else if (step.type === \"animation\") {\n            if (parsed === true || parsed === false) throw `Unable to play animation \"<span style=\"font-weight:600\">${step.raw.replace(/</g, \"&lt;\")}</span>\" as it retuned a <strong>boolean</strong> instead of a <strong>number</strong>`\n            step.part.mesh[step.mode][step.axis] = parsed * step.invert\n            context[Symbol.for(step.part.name)][step.transform] = step.transform === \"ty\" ? (step.part.parent === \"root\") * 24 + (step.part.parent?.parent === \"root\") * -step.part.mesh.parent.position.y - step.part.mesh.position.y : step.transform === \"tx\" ? -((step.part.parent?.parent === \"root\") * step.part.mesh.parent.position.x + step.part.mesh.position.x) : step.transform === \"tz\" ? (step.part.parent?.parent === \"root\") * step.part.mesh.parent.position.z + step.part.mesh.position.z : invertions.has(step.transform) ? - step.part.mesh[step.mode][step.axis] : step.part.mesh[step.mode][step.axis]\n          } else if (step.type === \"visible\") {\n            if (typeof parsed !== \"boolean\") throw `Invalid animation for \"<span style=\"font-weight:600\">${step.key}</span>\"<div style=\"padding-right:10px\">:</div> <strong>visible</strong> must be set to a boolean`\n            step.part.mesh.visible = parsed\n            context[Symbol.for(step.part.name)].visible = parsed\n          } else if (step.type === \"visible_boxes\") {\n            if (typeof parsed !== \"boolean\") throw `Invalid animation for \"<span style=\"font-weight:600\">${step.key}</span>\"<div style=\"padding-right:10px\">:</div> <strong>visible_boxes</strong> must be set to a boolean`\n            step.part.mesh.children.filter(e => e.type === \"cube\").forEach(e => e.visible = parsed)\n            context[Symbol.for(step.part.name)].visible_boxes = parsed\n          }\n        }\n      } catch (err) {\n        stopAnimations()\n        animationErrorToggle(err.toString().replace(/ctx\\./g, \"\"))\n      }\n    }\n    stopAnimations = resetGroups => {\n      Blockbench.removeListener(\"render_frame\", playAnimations)\n      if (resetGroups) for (const group of Group.all.filter(e => e.cemAnimationDisableRotation)) group.cemAnimationDisableRotation = false\n      for (const group of Group.all) {\n        group.mesh.visible = true\n        group.mesh.children.filter(e => e.type === \"cube\").forEach(e => e.visible = true)\n        for (const cube of Cube.all) {\n          if (!cube.visibility) {\n            cube.mesh.visible = false\n          }\n        }\n      }\n      Canvas.updateView({groups: Group.all})\n      playButton.css(\"display\", \"flex\")\n      stopButton.css(\"display\", \"none\")\n      pauseButton.text(\"pause\").attr(\"title\", \"Pause the animations\")\n      if (specials.has(\"hurt_time\")) specials.set(\"hurt_time\", [10, false])\n      if (specials.has(\"death_time\")) specials.set(\"death_time\", [0, false])\n      if (specials.has(\"swing_progress\")) specials.set(\"swing_progress\", [0, false])\n      if (specials.has(\"anger_time\")) specials.set(\"anger_time\", [0, false, 0])\n      $(\"#cem_animation_hurt_time_button\").removeClass(\"cem_animation_button_disabled\").css(\"--progress\", \"100%\")\n      $(\"#cem_animation_death_time_button\").removeClass(\"cem_animation_button_disabled\").css(\"--progress\", \"100%\")\n      $(\"#cem_animation_swing_progress_button\").removeClass(\"cem_animation_button_disabled\").css(\"--progress\", \"100%\")\n      $(\"#cem_animation_anger_time_button\").css(\"--progress\", \"100%\")\n      const aggressiveBool = $(\"#cem_animation_is_aggressive_bool\")\n      if (aggressiveBool.length) {\n        aggressiveBool.prop(\"checked\", false)\n        bools.set(\"is_aggressive\", false)\n      }\n      const hurtBool = $(\"#cem_animation_is_hurt_bool\")\n      if (hurtBool.length) {\n        hurtBool.prop(\"checked\", false)\n        bools.set(\"is_hurt\", false)\n      }\n      playing = false\n      paused = false\n    }\n    let group\n    function selectGroup(parse = true) {\n      partName.text(group.name)\n      const animation = JSON.stringify(group.cem_animations?.length === 0 ? [{}] : group.cem_animations, null, 2)\n      if (animation) {\n        if (parse) parseAnimations(animation)\n        animationEditorPanel.vue.text = animation\n        editorWrapper[0].__vue__._data.undoStack = [{ plain: animation }]\n        editorWrapper[0].__vue__._data.undoOffset = 0\n      }\n    }\n    renameGroup = evt => {\n      if (Project.format?.id === \"optifine_entity\") {\n        const entry = Undo.history[Undo.history.length - 1]\n        if (entry?.action === \"Rename element\") {\n          const animation = JSON.stringify(group.cem_animations?.length === 0 ? [{}] : group.cem_animations, null, 2)\n          if (animation) {\n            parseAnimations(animation)\n          }\n        }\n      }\n    }\n    Blockbench.on(\"finished_edit\", renameGroup)\n    updateSelection = () => {\n      if (Project.format?.id === \"optifine_entity\") {\n        resizeWindow()\n        stopAnimations()\n        let selected = Group.first_selected ?? Cube.selected?.[0]\n        if (selected) {\n          while (selected.parent !== \"root\") selected = selected.parent\n          if (group !== selected) {\n            group = selected\n            selectGroup(false)\n          }\n        }\n        const animation = JSON.stringify(group?.cem_animations?.length === 0 ? [{}] : group?.cem_animations, null, 2)\n        if (animation) {\n          parseAnimations(animation)\n        }\n      }\n    }\n    Blockbench.on(\"update_selection\", updateSelection)\n    tabChange = () => {\n      setTimeout(() => {\n        group = Group.all[0]\n        if (Format.id === \"optifine_entity\" && group && !Group.first_selected) {\n          selectGroup()\n        }\n      }, 0)\n    }\n    Blockbench.on(\"select_project\", tabChange)\n    tabChange()\n    updateSelection()\n    editorKeybinds = evt => {\n      if (evt.key === \"s\" && evt.ctrlKey && !evt.shiftKey && !evt.altKey) {\n        BarItems.export_over.trigger()\n        evt.stopImmediatePropagation()\n      }\n    }\n    animationEditorPanel.node.querySelector(\"#cem_animation_editor_container > div\").addEventListener(\"keydown\", editorKeybinds, true)\n    resizeWindow()\n    function addAnimationToggles() {\n      if (Project.format?.id === \"optifine_entity\") {\n        const toggle = $(\"[toolbar_id='outliner'] > div > [toolbar_item='outliner_toggle']\")\n        if (toggle.hasClass(\"enabled\")) {\n          const toggles = $(\"#cubes_list .group [toggle='autouv']\")\n          if (toggles.length) {\n            groupObserver.disconnect()\n            toggles.each((i, e) => {\n              const toggle = $(e)\n              const partName = toggle.parent().find(\"input\").val()\n              const part = Project.groups.find(e => e.name === partName)\n              if (!part) return\n              if (!toggle.parent().find(\"[toggle='cem_animation_disable_rotations']\").length) {\n                const rotateToggle = E(\"i\").attr({\n                  title: \"Disable this group rotating while playing animations\",\n                  toggle: \"cem_animation_disable_rotations\"\n                }).addClass(\"outliner_toggle material-icons icon_off\").text(\"sync_disabled\").on(\"click\", evt => {\n                  evt.stopPropagation()\n                  const partName = toggle.parent().find(\"input\").val()\n                  const part = Project.groups.find(e => e.name === partName)\n                  const rotateToggle = $(evt.target)\n                  if (rotateToggle.hasClass(\"icon_off\")) {\n                    rotateToggle.removeClass(\"icon_off\")\n                    part.cemAnimationDisableRotation = true\n                  } else {\n                    rotateToggle.addClass(\"icon_off\")\n                    part.cemAnimationDisableRotation = false\n                  }\n                  if (playing) {\n                    stopAnimations()\n                    setupAnimations(currentGroups, true)\n                  }\n                }).insertBefore(toggle)\n                if (part.cemAnimationDisableRotation) rotateToggle.removeClass(\"icon_off\")\n              }\n            })\n            groupObserver.observe(document.body, {\n              childList: true,\n              subtree: true\n            })\n          }\n        } else $(\"[toggle='cem_animation_disable_rotations']\").remove()\n      }\n    }\n    groupObserver = new MutationObserver(() => {\n      addAnimationToggles()\n    })\n    groupObserver.observe(document.body, {\n      childList: true,\n      subtree: true\n    })\n    addAnimationToggles()\n    globalThis.optifineAnimationDocumentation = {\n      custom: []\n    }\n    async function showDocumentation() {\n      if (optifineAnimationDocumentation.shown) {\n        optifineAnimationDocumentation.dialog.show()\n      } else {\n        if (!optifineAnimationDocumentation.data) {\n          optifineAnimationDocumentation.data = await fetchData(\"json/cem_animation_doc.json\")\n          optifineAnimationDocumentation.data.tabs ??= []\n        }\n        optifineAnimationDocumentation.shown = true\n        const tabs = [...optifineAnimationDocumentation.data.tabs, ...optifineAnimationDocumentation.custom]\n        optifineAnimationDocumentation.dialog = new Dialog({\n          id: \"cem_animation_documentation\",\n          title: \"CEM Animation Documentation\",\n          width: 980,\n          buttons: [],\n          sidebar: {\n            pages: Object.fromEntries(tabs.map(e => [e.name, {\n              label: e.name,\n              icon: e.icon\n            }])),\n            onPageSwitch(page) {\n              optifineAnimationDocumentation.dialog.content_vue.page = page\n              optifineAnimationDocumentation.dialog.content_vue.scrollToTop()\n            }\n          },\n          lines: [`<style>\n            #cem_animation_documentation {\n              .dialog_wrapper {\n                grid-template-rows: auto 0px;\n                min-height: min(100vh - 120px, 512px);\n                max-height: calc(100vh - 120px);\n              }\n\n              .dialog_content {\n                margin: 0;\n                max-height: initial;\n                overflow-x: hidden;\n                max-height: calc(100vh - 120px);\n              }\n\n              .page {\n                padding: 16px;\n                display: flex;\n                flex-direction: column;\n                align-items: flex-start;\n                gap: 16px;\n                user-select: text;\n              }\n\n              h1 {\n                margin: 0;\n                line-height: 100%;\n                font-size: 30px;\n                padding-bottom: 8px;\n\n                &:not(:first-child) {\n                  padding-top: 24px;\n                }\n              }\n\n              :is(code, pre) {\n                background-color: var(--color-back);\n                padding: 0 4px;\n                border: 1px solid var(--color-border);\n                cursor: text;\n                font-family: var(--font-code);\n              }\n\n              pre {\n                width: 100%;\n                text-wrap: initial;\n                word-break: break-word;\n              }\n\n              .cem-doc-table-list td:first-child {\n                font-weight: 600;\n                white-space: nowrap !important;\n                display: list-item;\n                list-style: inside;\n                font-family: var(--font-code);\n              }\n\n              .cem-doc-tab-link {\n                text-decoration: underline;\n                cursor: pointer;\n                color: var(--color-accent);\n              }\n\n              td:not(:last-child) {\n                padding-right: 16px;\n              }\n\n               img {\n                margin: 8px;\n                box-shadow: 0 3px 10px #0006;\n              }\n\n              p {\n                white-space: pre-wrap;\n              }\n\n              hr {\n                width: 100%;\n                margin-bottom: 0;\n              }\n            }\n          </style>`],\n          component: {\n            data: {\n              version: optifineAnimationDocumentation.data.version,\n              optifineVersion: optifineAnimationDocumentation.data.optifineVersion,\n              tabs,\n              connection,\n              page: tabs[0]?.name\n            },\n            methods: {\n              scrollToTop() {\n                this.container.scrollTop = 0\n              },\n              reload() {\n                window.cemTemplateAnimationDocReloaded = true\n                plugin.reload()\n              }\n            },\n            template: `\n              <div id=\"cem-container\" ref=\"page\">\n                <div v-if=\"connection?.failed\" class=\"cem-overlay\">\n                  <h1>Connection Failed</h1>\n                  <p>Failed to load CEM Animation documentation.</p>\n                  <p>Please make sure you are connected to the internet, and can access this <a href=\"${root}/json/cem_animation_doc.json\">cem_animation_doc.json</a> file.</p>\n                  <p>If you are unable to access the cem_animation_doc.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is <a href=\"https://1.1.1.1/\">Cloudflare WARP</a>, which is a free program that commonly resolves this issue.</p>\n                  <button @click=\"reload\">Retry connection</button>\n                </div>\n                <div v-for=\"tab of tabs\" v-if=\"page === tab.name\" class=\"page\">\n                  <template v-for=\"element of tab.elements\">\n                    <h1 v-if=\"element.type === 'heading'\">{{ element.text }}</h1>\n                    <p v-else-if=\"element.type === 'text'\" v-html=\"element.text\"></p>\n                    <pre v-else-if=\"element.type === 'code'\">{{ element.text }}</pre>\n                    <img v-else-if=\"element.type === 'image'\" :src=\"element.url\" :width=\"element.width\" :height=\"element.height\">\n                    <table v-else-if=\"element.type === 'table'\" :class=\"{ 'cem-doc-table-list': element.tableType === 'list' }\">\n                      <tr v-for=\"row of element.rows\">\n                        <td v-for=\"cell of row\" v-html=\"cell\"></td>\n                      </tr>\n                    </table>\n                  </template>\n                  <hr>\n                  <p style=\"display: grid; grid-template-columns: auto auto; column-gap: 8px;\">\n                    <span>Documentation version:</span>\n                    <span style=\"font-family: var(--font-code);\">v{{ version }}</span>\n                    <span>Updated to:</span>\n                    <span style=\"font-family:var(--font-code);\">OptiFine {{ optifineVersion }}</span>\n                  </p>\n                </div>\n              </div>\n            `\n          },\n          onBuild() {\n            this.content_vue.container = this.object.querySelector(\".dialog_content\")\n            this.object.querySelector(\"#cem-container\").addEventListener(\"click\", e => {\n              if (e.target.classList.contains(\"cem-doc-tab-link\")) {\n                this.content_vue.page = e.target.textContent\n                this.sidebar.page = e.target.textContent\n                this.sidebar.build()\n                this.content_vue.scrollToTop()\n              }\n            })\n          }\n        }).show()\n      }\n    }\n    if (window.cemTemplateAnimationDocReloaded) {\n      delete window.cemTemplateAnimationDocReloaded\n      showDocumentation()\n    }\n  }\n\n  function unloadOptiFineAnimationEditor() {\n    stopAnimations?.(true)\n    Blockbench.removeListener(\"update_selection\", updateSelection)\n    Blockbench.removeListener(\"select_project\", tabChange)\n    Blockbench.removeListener(\"finished_edit\", renameGroup)\n    animationEditorPanel.node.querySelector(\"#cem_animation_editor_container > div\").removeEventListener(\"keydown\", editorKeybinds)\n    groupObserver.disconnect()\n    $(\"[toggle='cem_animation_disable_rotations']\").remove()\n    animationEditorPanel.delete()\n    animationControlPanel.delete()\n    animationStyles.delete()\n    optifineAnimationDocumentation.dialog?.close()\n    resizeWindow()\n    delete globalThis.optifineAnimationVariables\n    delete globalThis.optifineAnimationDocumentation\n  }\n\n  // PLUGIN\n\n  loadPlugin()\n})()"
  },
  {
    "path": "plugins/cem_template_loader/changelog.json",
    "content": "{\n  \"0.1.0\": {\n    \"title\": \"0.1.0\",\n    \"date\": \"2020-02-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"0.2.0\": {\n    \"title\": \"0.2.0\",\n    \"date\": \"2020-02-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added 1.15 and 1.16 template models\"\n        ]\n      }\n    ]\n  },\n  \"0.3.0\": {\n    \"title\": \"0.3.0\",\n    \"date\": \"2020-02-23\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"minecart\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"0.4.0\": {\n    \"title\": \"0.4.0\",\n    \"date\": \"2020-02-26\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Added missing \\\"hat\\\" bone to the \\\"illusioner\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"0.5.0\": {\n    \"title\": \"0.5.0\",\n    \"date\": \"2020-03-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"pufferfish_small\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"0.6.0\": {\n    \"title\": \"0.6.0\",\n    \"date\": \"2020-03-19\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added new \\\"player\\\", \\\"player_slim\\\", \\\"elytra\\\", \\\"trident\\\", \\\"shield\\\", and \\\"arrow\\\" template models\",\n          \"Added new \\\"melon_golem\\\", \\\"furnace_golem\\\", and \\\"tropical_slime\\\" Minecraft Earth template models\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Modified the \\\"banner\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"0.7.0\": {\n    \"title\": \"0.7.0\",\n    \"date\": \"2020-04-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added new Minecraft Earth template models\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"wolf\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"0.8.0\": {\n    \"title\": \"0.8.0\",\n    \"date\": \"2020-05-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Removed Minecraft Earth template models\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added \\\"strider\\\", \\\"zoglin\\\", and \\\"zombified_piglin\\\" template models to the unsupported category\"\n        ]\n      }\n    ]\n  },\n  \"0.9.0\": {\n    \"title\": \"0.9.0\",\n    \"date\": \"2020-05-20\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added a section showing what template models are currently compatible with 1.15\"\n        ]\n      }\n    ]\n  },\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2020-06-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added a new \\\"Legacy\\\" section which now contains the 1.14 chest template models\",\n          \"Replaced the chest template models with the 1.15 versions\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"villager\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"2.0.0\": {\n    \"title\": \"2.0.0\",\n    \"date\": \"2020-07-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Complete revamp of all template models\"\n        ]\n      }\n    ]\n  },\n  \"2.1.0\": {\n    \"title\": \"2.1.0\",\n    \"date\": \"2020-07-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed \\\"player\\\" and \\\"player_slim\\\" template models\"\n        ]\n      }\n    ]\n  },\n  \"2.2.0\": {\n    \"title\": \"2.2.0\",\n    \"date\": \"2020-07-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"villager\\\" template model failing to load\"\n        ]\n      }\n    ]\n  },\n  \"2.3.0\": {\n    \"title\": \"2.3.0\",\n    \"date\": \"2020-08-28\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added the \\\"piglin\\\", \\\"piglin_brute\\\", and \\\"zombified_piglin\\\" template models to the supported category\"\n        ]\n      }\n    ]\n  },\n  \"2.4.0\": {\n    \"title\": \"2.4.0\",\n    \"date\": \"2020-10-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added unofficial \\\"axolotl\\\", \\\"goat\\\", and \\\"warden\\\" template models\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Minor bug fixes to various template models\"\n        ]\n      }\n    ]\n  },\n  \"2.5.0\": {\n    \"title\": \"2.5.0\",\n    \"date\": \"2020-10-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added an unofficial \\\"glow_squid\\\" template model\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed issues with the \\\"dolphin\\\", \\\"squid\\\", \\\"axolotl\\\", and \\\"warden\\\" template models\"\n        ]\n      }\n    ]\n  },\n  \"2.6.0\": {\n    \"title\": \"2.6.0\",\n    \"date\": \"2020-10-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added template textures to lots of template models\",\n          \"Improved the unofficial \\\"goat\\\" template model\"\n        ]\n      }\n    ]\n  },\n  \"2.7.0\": {\n    \"title\": \"2.7.0\",\n    \"date\": \"2020-10-31\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed issues with the \\\"wither\\\" and \\\"parrot\\\" template models\"\n        ]\n      }\n    ]\n  },\n  \"2.8.0\": {\n    \"title\": \"2.8.0\",\n    \"date\": \"2020-12-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Replaced the unofficial \\\"axolotl\\\", \\\"goat\\\", and \\\"glow_squid\\\" model templates with the official models\"\n        ]\n      }\n    ]\n  },\n  \"2.9.0\": {\n    \"title\": \"2.9.0\",\n    \"date\": \"2021-01-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed a typo in the \\\"chest_large\\\" model\"\n        ]\n      }\n    ]\n  },\n  \"2.10.0\": {\n    \"title\": \"2.10.0\",\n    \"date\": \"2021-02-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed issues with the \\\"wither\\\", \\\"wither skull\\\", and \\\"rabbit\\\" models\"\n        ]\n      }\n    ]\n  },\n  \"3.0.0\": {\n    \"title\": \"3.0.0\",\n    \"date\": \"2021-03-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Template models are now loaded from an external model JSON file\"\n        ]\n      }\n    ]\n  },\n  \"3.1.0\": {\n    \"title\": \"3.1.0\",\n    \"date\": \"2021-03-27\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added the ability to reload the external external model JSON file\",\n          \"Added external model JSON version number\"\n        ]\n      }\n    ]\n  },\n  \"4.0.0\": {\n    \"title\": \"4.0.0\",\n    \"date\": \"2021-05-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Restructured the external model JSON file to reduce it's file size\"\n        ]\n      }\n    ]\n  },\n  \"5.0.0\": {\n    \"title\": \"5.0.0\",\n    \"date\": \"2021-08-07\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added a brand new interface for selecting template models\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Rewritten most of the plugin\"\n        ]\n      }\n    ]\n  },\n  \"5.0.1\": {\n    \"title\": \"5.0.1\",\n    \"date\": \"2021-08-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Add plugin about details\"\n        ]\n      }\n    ]\n  },\n  \"5.3.0\": {\n    \"title\": \"5.3.0\",\n    \"date\": \"2021-10-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Support for Blockbench v4.0.0\"\n        ]\n      }\n    ]\n  },\n  \"5.4.1\": {\n    \"title\": \"5.4.1\",\n    \"date\": \"2021-12-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Updated unable to connect dialog\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed a bug with reloading template models\"\n        ]\n      }\n    ]\n  },\n  \"5.10.2\": {\n    \"title\": \"5.10.2\",\n    \"date\": \"2022-10-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added info dialog that is shown when the plugin is first installed\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added bug report button to the loader interface\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed \\\"CEM Template Loader\\\" not appeaing in the start screen\"\n        ]\n      }\n    ]\n  },\n  \"5.11.0\": {\n    \"title\": \"5.11.0\",\n    \"date\": \"2022-03-24\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Models can now be automatically loaded from URL queries in the webapp\"\n        ]\n      }\n    ]\n  },\n  \"6.0.0\": {\n    \"title\": \"6.0.0\",\n    \"date\": \"2022-05-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added an OptiFine animation editor with support for editing and previewing animations from OptiFine CEM\"\n        ]\n      }\n    ]\n  },\n  \"6.0.1\": {\n    \"title\": \"6.0.1\",\n    \"date\": \"2022-05-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Only try to read OptiFine animations when the current format is an \\\"OptiFine Entity\\\"\"\n        ]\n      }\n    ]\n  },\n  \"6.0.2\": {\n    \"title\": \"6.0.2\",\n    \"date\": \"2022-05-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed switching project tabs breaking the OptiFine animation editor\"\n        ]\n      }\n    ]\n  },\n  \"6.0.3\": {\n    \"title\": \"6.0.3\",\n    \"date\": \"2022-05-09\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Only try to stop OptiFine animations when the current format is an \\\"OptiFine Entity\\\"\"\n        ]\n      }\n    ]\n  },\n  \"6.0.4\": {\n    \"title\": \"6.0.4\",\n    \"date\": \"2022-05-10\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed selection update event listener when no format is loaded\"\n        ]\n      }\n    ]\n  },\n  \"6.1.0\": {\n    \"title\": \"6.1.0\",\n    \"date\": \"2022-05-29\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Restructured the plugin's info dialog and renamed it to the about dialog\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Changed all references to the \\\"Filter\\\" menu to the new \\\"Tools\\\" menu\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed \\\"CEM Template Loader\\\" not appeaing in the start screen\"\n        ]\n      }\n    ]\n  },\n  \"6.2.0\": {\n    \"title\": \"6.2.0\",\n    \"date\": \"2022-06-4\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Small edits to the plugin's structure\"\n        ]\n      }\n    ]\n  },\n  \"6.2.1\": {\n    \"title\": \"6.2.1\",\n    \"date\": \"2022-07-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Replaced tutorials playlist link with a single tutorial video\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed playing animations when a non root group is selected\"\n        ]\n      }\n    ]\n  },\n  \"6.5.0\": {\n    \"title\": \"6.5.0\",\n    \"date\": \"2022-07-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added seeded randomness support to the \\\"random\\\" OptiFine animation function\",\n          \"Added new OptiFine animation variables: \\\"id\\\", \\\"rot_x/y\\\", \\\"player_pos_x/y/z\\\", \\\"player_rot_x/y\\\", \\\"death_time\\\", \\\"dimension\\\", \\\"frame_time\\\"\",\n          \"Added new OptiFine animation functions: \\\"printb\\\", \\\"lerp\\\"\",\n          \"Added support for OptiFine animation \\\"var.\\\" and \\\"varb.\\\" entity variables\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The \\\"print\\\" function has been updated to match the officially supported one\"\n        ]\n      },\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Removed internal support for the \\\"idle_time\\\" and \\\"revenge_time\\\" OptiFine animation variables\",\n          \"Removed \\\"Invert this groups pivot point while playing animations\\\" group option\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Switched to using the new ModelLoaders\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"sqrt\\\" OptiFine animation function when used with numbers that are zero or below\",\n          \"Fixed the \\\"if\\\" OptiFine animation function allowing non boolean inputs\",\n          \"Fixed OptiFine animations crashing if a cube is selected\",\n          \"Fixed having groups named the same as functions causing issues\"\n        ]\n      }\n    ]\n  },\n  \"6.5.1\": {\n    \"title\": \"6.5.1\",\n    \"date\": \"2022-07-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed a gap appearing between the OptiFine animation editor and the viewport\"\n        ]\n      }\n    ]\n  },\n  \"6.6.0\": {\n    \"title\": \"6.6.0\",\n    \"date\": \"2022-10-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added \\\"rule_index\\\" OptiFine animation variable\",\n          \"Added \\\".visible\\\" OptiFine animation property\"\n        ]\n      }\n    ]\n  },\n  \"6.6.1\": {\n    \"title\": \"6.6.1\",\n    \"date\": \"2022-10-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed issues with OptiFine animation validation\",\n          \"Fixed broken \\\".visible\\\" references\"\n        ]\n      }\n    ]\n  },\n  \"6.6.2\": {\n    \"title\": \"6.6.2\",\n    \"date\": \"2022-10-24\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed \\\"print\\\" and \\\"lerp\\\" functions\"\n        ]\n      }\n    ]\n  },\n  \"6.6.3\": {\n    \"title\": \"6.6.3\",\n    \"date\": \"2022-10-26\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"\\\"rule_index\\\" animation variable is now defaulted to \\\"0\\\"\",\n          \"\\\"frame_time\\\" is now affected by the animation timescale\"\n        ]\n      }\n    ]\n  },\n  \"6.6.4\": {\n    \"title\": \"6.6.4\",\n    \"date\": \"2022-11-07\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed issues with OptiFine animation validation\"\n        ]\n      }\n    ]\n  },\n  \"6.6.5\": {\n    \"title\": \"6.6.5\",\n    \"date\": \"2022-11-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Updated model source URL\"\n        ]\n      }\n    ]\n  },\n  \"6.11.0\": {\n    \"title\": \"6.11.0\",\n    \"date\": \"2023-01-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added autocomplete support to the OptiFine animation editor\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed about action not being removed on unload\"\n        ]\n      }\n    ]\n  },\n  \"6.11.1\": {\n    \"title\": \"6.11.1\",\n    \"date\": \"2023-01-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed autocomplete for bones with numbers in the name\"\n        ]\n      }\n    ]\n  },\n  \"7.0.0\": {\n    \"title\": \"7.0.0\",\n    \"date\": \"2023-02-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added JEM format restrictions\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed disable rotation toggles appearing on cubes\",\n          \"Fixed broken styles\"\n        ]\n      }\n    ]\n  },\n  \"7.1.0\": {\n    \"title\": \"7.1.0\",\n    \"date\": \"2023-9-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed tab key in OptiFine animation editor\",\n          \"Fixed OptiFine animation editor autocomplete\"\n        ]\n      }\n    ]\n  },\n  \"7.8.0\": {\n    \"title\": \"7.8.0\",\n    \"date\": \"2023-10-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Removed the ability to reload the template models\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Update to new plugin repository format\"\n        ]\n      }\n    ]\n  },\n  \"8.0.0\": {\n    \"title\": \"8.0.0\",\n    \"date\": \"2024-05-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added a new dialog that shows when invalid operations are performed\",\n          \"Added an option to ignore unknown OptiFine animations\",\n          \"Loaded textures are now set as the default texture. This does not apply for models that load multiple textures\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"\\\"Load vanilla texture\\\" will now be selected by default\",\n          \"Moved the pretty print button\",\n          \"The OptiFine animation editor will now always have a group selected\",\n          \"Changed the play animaions button's icon to be the regular play icon\"\n        ]\n      },\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Removed \\\"Load into current project\\\"\",\n          \"Removed the ability to play only the current group's animations\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Rewritten most of the plugin\",\n          \"The CEM Animation Editor can now be extended by other plugins\",\n          \"The CEM Animation Documentation can now be extended by other plugins\",\n          \"Added CDN url fallback system\",\n          \"The external model JSON file's version number will now be separated from the plugin's version number. I have reset that version number to 2.0.0 and it will increase separately from the plugin's version number from now on\",\n          \"Added a class to the format page so it can be easily targetted by themes\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the page links in the CEM Animation Documentation\"\n        ]\n      }\n    ]\n  },\n  \"8.0.1\": {\n    \"title\": \"8.0.1\",\n    \"date\": \"2024-06-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed Vue.js warnings\"\n        ]\n      }\n    ]\n  },\n  \"8.1.0\": {\n    \"title\": \"8.1.0\",\n    \"date\": \"2024-06-08\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The CEM model search bar can now be cleared with a button\",\n          \"CEM animation errors now use the \\\"error\\\" colour instead of the \\\"close\\\" colour\",\n          \"CEM animation documentation scroll will now reset back to the top when changing tab\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed animation controller sliders going off the edge of the panel\",\n          \"Fixed project not getting entity name\",\n          \"Fixed codeblocks overflowing in the CEM Animation Documentation\"\n        ]\n      }\n    ]\n  },\n  \"8.2.0\": {\n    \"title\": \"8.2.0\",\n    \"date\": \"2024-07-26\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Invalid animations can now be saved instead of reverting to the last valid animation\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed loading models without a vanilla texture\"\n        ]\n      }\n    ]\n  },\n  \"8.2.1\": {\n    \"title\": \"8.2.1\",\n    \"date\": \"2024-08-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Loading a template model that is missing its vanilla texture will no longer trigger the connction error state\"\n        ]\n      }\n    ]\n  },\n  \"8.3.0\": {\n    \"title\": \"8.3.0\",\n    \"date\": \"2024-09-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added support for the \\\"ifb()\\\" animation function\",\n          \"Added support for the \\\"frame_counter\\\" animation variable\",\n          \"Added more error checks to provide better animation error descriptions\",\n          \"Added support for \\\"visible_boxes\\\"\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"The animation editor will now no longer accept incorrectly formatted numbers\",\n          \"Fixed \\\"render\\\" variables throwing errors when used in animations\",\n          \"Fixed \\\"part\\\" and \\\"this\\\" variables throwing errors when used in animations\",\n          \"Fixed animations not being re-parsed when you add, remove, or rename a group\"\n        ]\n      }\n    ]\n  },\n  \"8.4.0\": {\n    \"title\": \"8.4.0\",\n    \"date\": \"2024-11-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added support for entity list groups\",\n          \"Added support for entity list headings\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The root bone will no longer cause animation errors when not present in the model\"\n        ]\n      }\n    ]\n  },\n  \"8.5.0\": {\n    \"title\": \"8.5.0\",\n    \"date\": \"2025-02-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Support for Blockbench v4.12.0\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed opening the loader through the \\\"File > New\\\" menu, and when double clicking it on the start screen\",\n          \"Category subheadings will now be hidden when searching and nothing from that subcategory matches the search\"\n        ]\n      }\n    ]\n  },\n  \"8.5.1\": {\n    \"title\": \"8.5.1\",\n    \"date\": \"2025-10-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed previewing CEM animations on mobile devices\"\n        ]\n      }\n    ]\n  },\n  \"8.6.0\": {\n    \"title\": \"8.6.0\",\n    \"date\": \"2026-04-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Support for Blockbench v5.0.0\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed template texture generation when loading models\"\n        ]\n      }\n    ]\n  },\n  \"9.0.0\": {\n    \"title\": \"9.0.0\",\n    \"date\": \"2026-04-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Updated to the new template model data format\",\n          \"Added category headings to the sidebar\"\n        ]\n      }\n    ]\n  },\n  \"9.0.1\": {\n    \"title\": \"9.0.1\",\n    \"date\": \"2026-04-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed vanilla texture loading for entities with multiple textures\"\n        ]\n      }\n    ]\n  },\n  \"9.0.2\": {\n    \"title\": \"9.0.2\",\n    \"date\": \"2026-04-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed display names falling back to the ID instead of the file name\"\n        ]\n      }\n    ]\n  },\n  \"9.1.0\": {\n    \"title\": \"9.1.0\",\n    \"date\": \"2026-04-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added support for the \\\"day_time\\\" and \\\"day_count\\\" animation variables\",\n          \"Added support for the \\\"anger_time_start\\\" animation variable\",\n          \"Added the \\\"Anger entity\\\" button to simulate \\\"anger_time\\\" countdown with delay\",\n          \"Added progress bars to animation buttons (hurt, death, attack, anger)\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the default location of the \\\"Animation Controller\\\" panel\",\n          \"Fixed stop button not resetting animation buttons\"\n        ]\n      }\n    ]\n  },\n  \"9.1.1\": {\n    \"title\": \"9.1.1\",\n    \"date\": \"2026-04-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the connection warning showing when the fallback URL loaded successfully\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/clone_brush.js",
    "content": "(function() {\r\n\r\nvar brush_template, clone_brush_tool;\r\n\r\nPlugin.register('clone_brush', {\r\n\ttitle: 'Clone Brush',\r\n\tauthor: 'JannisX11',\r\n\ticon: 'account_balance_wallet',\r\n\tdescription: 'Clone Cubes',\r\n\tversion: '1.1.1',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\t\tclone_brush_tool = new Tool({\r\n\t\t\tid: 'clone_brush',\r\n\t\t\tname: 'Clone Brush',\r\n\t\t\tdescription: 'Tool to clone and place cubes against other cubes',\r\n\t\t\ticon: 'fa-edit',\r\n\t\t\ttransformerMode: 'hidden',\r\n\t    \tcategory: 'tools',\r\n\t\t\tselectFace: true,\r\n\t\t\talt_tool: 'move_tool',\r\n\t\t\tmodes: ['edit'],\r\n\t\t\tonSelect: function() {\r\n\t\t\t\tbrush_template = 'select'\r\n\t\t\t},\r\n\t\t\tonCanvasClick: function(data) {\r\n\t\t\t\tif (data.event.shiftKey === false) {\r\n\t\t            if (brush_template == 'select' && data.element instanceof Cube) {\r\n\t\t                brush_template = data.element\r\n\t\t                $('#preview').css('cursor', 'url(assets/brush.png), auto')\r\n\t\t            } else if (brush_template instanceof Cube) {\r\n\r\n\t\t            \tvar new_cubes = []\r\n\t\t            \tUndo.initEdit({elements: new_cubes})\r\n\r\n\t\t                var from = [\r\n\t\t\t\t\t        Cube.selected[0].from[0]+0,\r\n\t\t\t\t\t        Cube.selected[0].from[1]+0,\r\n\t\t\t\t\t        Cube.selected[0].from[2]+0\r\n\t\t\t\t\t    ]\r\n\t\t\t\t\t    var canvas_grid = canvasGridSize()\r\n\t\t\t\t\t    var sizes = [canvas_grid, canvas_grid, canvas_grid]\r\n\t\t\t\t\t    if (brush_template && brush_template.type === 'cube') {\r\n\t\t\t\t\t        sizes = brush_template.size()\r\n\t\t\t\t\t    }\r\n\t\t\t\t\t    switch (data.face) {\r\n\t\t\t\t\t        case 'north':   from[2] -= sizes[2] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\t\t\t\t\t        case 'south': \tfrom[2] += sizes[2] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\t\t\t\t\t        case 'west': \tfrom[0] -= sizes[0] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\t\t\t\t\t        case 'east': \tfrom[0] += sizes[0] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\r\n\t\t\t\t\t        case 'up': \t\tfrom[1] += sizes[1] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\t\t\t\t\t        case 'down': \tfrom[1] -= sizes[1] + Cube.selected[0].inflate + brush_template.inflate; break;\r\n\t\t\t\t\t    }\r\n\r\n\t\t\t\t\t    var base_cube = new Cube(brush_template)\r\n\r\n\t\t\t\t\t    base_cube.to = [\r\n\t\t\t\t\t        from[0]+base_cube.size(0),\r\n\t\t\t\t\t        from[1]+base_cube.size(1),\r\n\t\t\t\t\t        from[2]+base_cube.size(2)\r\n\t\t\t\t\t    ]\r\n\t\t\t\t\t    if (Format.canvas_limit) {\r\n\t\t\t\t\t        var i = 0\r\n\t\t\t\t\t        while (i < 3) {\r\n\t\t\t\t\t            if (base_cube.to[i] > 32 || from[i] < -16) return;\r\n\t\t\t\t\t            i++;\r\n\t\t\t\t\t        }\r\n\t\t\t\t\t    }\r\n\t\t\t\t\t    var number = base_cube.name.match(/[0-9]+$/)\r\n\t\t\t\t\t    if (number) {\r\n\t\t\t\t\t        number = parseInt(number[0])\r\n\t\t\t\t\t        base_cube.name = base_cube.name.split(number).join(number+1)\r\n\t\t\t\t\t    }\r\n\t\t\t\t\t    base_cube.from = from\r\n\t\t\t\t\t    base_cube.addTo(brush_template.parent).init()\r\n\t\t\t\t\t    new_cubes.push(base_cube);\r\n\t\t\t\t\t    base_cube.select()\r\n\t\t\t\t\t    Undo.finishEdit('clone_brush')\r\n\t\t            }\r\n\t\t        }\r\n\t\t\t}\r\n\t\t});\r\n\t\tToolbox.add(clone_brush_tool);\r\n\t},\r\n\tonunload() {\r\n\t\tclone_brush_tool.delete();\r\n\t}\r\n})\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/code_view.js",
    "content": "var codeViewVue;\n\n(function() {\n\nvar openCodeViewAction;\nvar codeViewDialog;\n    \nPlugin.register('code_view', {\n\ttitle: 'Code View',\n\ticon: 'developer_mode',\n\tauthor: 'Wither',\n\tdescription: 'View the model you are currently editing in the raw format',\n\tversion: '1.0.1',\n\tvariant: 'both',\n\tonload() {\n        codeViewDialog = new Dialog({\n\t\t\ttitle: 'Code View',\n\t\t\tid: 'code_view',\n\t\t\tresizable: true,\n\t\t\twidth: 650,\n\t\t\tcomponent: {\n\t\t\t\tcomponents: {VuePrismEditor},\n\t\t\t\tdata: {\n\t\t\t\t\ttext: ''\n\t\t\t\t},\n\t\t\t\tmethods: {\n\t\t\t\t\tcopyText() {\n\t\t\t\t\t\tnavigator.clipboard.writeText(this.text);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<vue-prism-editor id=\"code-view-output\" v-model=\"text\" language=\"json\" style=\"height: 25em;\" :line-numbers=\"true\" />\n\t\t\t\t\t\t<button @click=\"copyText()\" style=\"width: 100%;\">Copy</button>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t}\n        });\n\n        openCodeViewAction = new Action('open_code_view', {\n\t\t\tname: 'Open Code View',\n\t\t\tdescription: '',\n\t\t\ticon: 'developer_mode',\n\t\t\tclick() {\n\t\t\t\tcodeViewDialog.show();\n\t\t\t\tcodeViewDialog.content_vue.text = Format ? Format.codec.compile() : '';\n\t\t\t}\n\t\t})\n\n\t\tMenuBar.addAction(openCodeViewAction, 'filter')\n\n\t},\n\tonunload() {\n\t\topenCodeViewAction.delete();\n\t}\n});\n\n})()"
  },
  {
    "path": "plugins/collapsible_start_screen_categories.js",
    "content": "(async function () {\r\n  let aboutAction, styles, collapsed\r\n  const id = \"collapsible_start_screen_categories\"\r\n  const name = \"Collapsible Start Screen Categories\"\r\n  const icon = \"chevron_right\"\r\n  const author = \"Ewan Howell\"\r\n  const about = \"This plugin adds a small dropdown arrow next to each category on the start screen, allowing you to collapse each category and hide their respective formats.\"\r\n  const links = {\r\n    website: \"https://ewanhowell.com/\",\r\n    discord: \"https://discord.com/invite/pkRxtGw\"\r\n  }\r\n  const E = s => $(document.createElement(s))\r\n  Plugin.register(id, {\r\n    title: name,\r\n    icon,\r\n    author,\r\n    description: \"Add the ability to collapse the start screen categories.\",\r\n    about,\r\n    tags: [\"Start screen\", \"Menu\", \"Formats\"],\r\n    version: \"1.0.0\",\r\n    min_version: \"4.4.1\",\r\n    variant: \"both\",\r\n    oninstall: () => showAbout(true),\r\n    onuninstall: () => localStorage.removeItem(\"format_category_collapsed\"),\r\n    onload() {\r\n      addAbout()\r\n      styles = Blockbench.addCSS(`\r\n        .format_category {\r\n          position: relative;\r\n        }\r\n        .format_category_dropdown {\r\n          position: absolute;\r\n          top: 2px;\r\n          right: 8px;\r\n          cursor: pointer;\r\n          color: var(--color-subtle_text);\r\n        }\r\n        .format_category_dropdown:hover {\r\n          color: var(--color-text);\r\n        }\r\n        .format_category_collapsed ul {\r\n          display: none;\r\n        }\r\n        .format_category i {\r\n          transition: transform .15s;\r\n        }\r\n        .format_category_collapsed i {\r\n          transform: rotateZ(-90deg);\r\n        }\r\n      `)\r\n      collapsed = JSON.parse(localStorage.getItem(\"format_category_collapsed\") ?? \"[]\")\r\n      addDropDowns()\r\n      Blockbench.on(\"construct_format\", addDropDowns)\r\n      Blockbench.on(\"construct_model_loader\", addDropDowns)\r\n    },\r\n    onunload() {\r\n      Blockbench.removeListener(\"construct_format\", addDropDowns)\r\n      Blockbench.removeListener(\"construct_model_loader\", addDropDowns)\r\n      aboutAction.delete()\r\n      MenuBar.removeAction(`help.about_plugins.about_${id}`)\r\n      styles.delete()\r\n      $(\".format_category\").removeClass(\"format_category_collapsed\")\r\n      $(\".format_category_dropdown\").remove()\r\n    }\r\n  })\r\n  function addDropDowns() {\r\n    setTimeout(() => {\r\n      $(\".format_category\").each(function() {\r\n        const category = $(this)\r\n        if (category.children().length === 2) {\r\n          const text = category.find(\"label\").first().text()\r\n          const icon = E(\"i\").addClass(\"format_category_dropdown material-icons\").text(\"expand_more\").appendTo(category)\r\n          icon.on(\"click\", e => {\r\n            if (collapsed.includes(text)) {\r\n              collapsed.splice(collapsed.indexOf(text), 1)\r\n              icon.parent().removeClass(\"format_category_collapsed\")\r\n            } else {\r\n              collapsed.push(text)\r\n              icon.parent().addClass(\"format_category_collapsed\")\r\n            }\r\n            localStorage.setItem(\"format_category_collapsed\", JSON.stringify(collapsed))\r\n          })\r\n          if (collapsed.includes(text)) category.addClass(\"format_category_collapsed\")\r\n        }\r\n      })\r\n    }, 0)\r\n  }\r\n  function addAbout() {\r\n    let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\r\n    if (!about) {\r\n      about = new Action(\"about_plugins\", {\r\n        name: \"About Plugins...\",\r\n        icon: \"info\",\r\n        children: []\r\n      })\r\n      MenuBar.addAction(about, \"help\")\r\n    }\r\n    aboutAction = new Action(`about_${id}`, {\r\n      name: `About ${name}...`,\r\n      icon,\r\n      click: () => showAbout()\r\n    })\r\n    about.children.push(aboutAction)\r\n  }\r\n  function showAbout(banner) {\r\n    const infoBox = new Dialog({\r\n      id: \"about\",\r\n      title: name,\r\n      width: 780,\r\n      buttons: [],\r\n      lines: [`\r\n        <style>\r\n          dialog#about .dialog_title {\r\n            padding-left: 0;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 10px;\r\n          }\r\n          dialog#about .dialog_content {\r\n            text-align: left!important;\r\n            margin: 0!important;\r\n          }\r\n          dialog#about .socials {\r\n            padding: 0!important;\r\n          }\r\n          dialog#about #banner {\r\n            background-color: var(--color-accent);\r\n            color: var(--color-accent_text);\r\n            width: 100%;\r\n            padding: 0 8px\r\n          }\r\n          dialog#about #content {\r\n            margin: 24px;\r\n          }\r\n        </style>\r\n        ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\r\n        <div id=\"content\">\r\n          <h1 style=\"margin-top:-10px\">${name}</h1>\r\n          <p style=\"padding-bottom:10px\">${about}</p>\r\n          <div class=\"socials\">\r\n            <a href=\"${links[\"website\"]}\" class=\"open-in-browser\">\r\n              <i class=\"icon material-icons\" style=\"color:#33E38E\">language</i>\r\n              <label>By ${author}</label>\r\n            </a>\r\n            <a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\r\n              <i class=\"icon fab fa-discord\" style=\"color:#727FFF\"></i>\r\n              <label>Discord Server</label>\r\n            </a>\r\n          </div>\r\n        </div>\r\n      `]\r\n    }).show()\r\n    $(\"dialog#about .dialog_title\").html(`\r\n      <i class=\"icon material-icons\">${icon}</i>\r\n      ${name}\r\n    `)\r\n  }\r\n})()"
  },
  {
    "path": "plugins/colour_gradient_generator/about.md",
    "content": "<div id=\"about-content\">\n  <img src=\"https://ewanhowell.com/assets/images/plugins/colour-gradient-generator/logo.webp\" />\n  <p>This plugin generates hue shifted colour gradient palettes from a single colour.</p>\n  <h2>Example</h2>\n  <h3>Input Colour</h3>\n  <div class=\"about-colour-gradient\">\n    <div style=\"background-color: #C14D34;\"></div>\n    <div></div>\n  </div>\n  <h3>Output Gradient Palette</h3>\n  <div class=\"about-colour-gradient\">\n    <div style=\"background-color: #260A11;\"></div>\n    <div style=\"background-color: #4D151C;\"></div>\n    <div style=\"background-color: #741F21;\"></div>\n    <div style=\"background-color: #9A312A;\"></div>\n    <div style=\"background-color: #C14D34;\"></div>\n    <div style=\"background-color: #D27A58;\"></div>\n    <div style=\"background-color: #DDA482;\"></div>\n    <div style=\"background-color: #E9C9AB;\"></div>\n    <div style=\"background-color: #F4E7D5;\"></div>\n  </div>\n  <h2>How to use</h2>\n  <p>To use this plugin, go into paint mode and change the colour palette mode to <strong>Palette</strong> or <strong>Both</strong>. You can then select the <strong>Generate Colour Gradient</strong> button <i class=\"icon material-icons\" style=\"translate:0 5px;\">gradient</i> to start creating your gradient palette.</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 128px;\n    object-fit: contain;\n    margin: 16px 0 24px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  .about-colour-gradient {\n    display: flex;\n    filter: drop-shadow(0 3px 10px #0006);\n    padding: 0 20px;\n  }\n  .about-colour-gradient > div {\n    flex: 1;\n    aspect-ratio: 1;\n    position: relative;\n  }\n  .about-colour-gradient > div:nth-child(2):last-child {\n    flex: 8;\n    aspect-ratio: 0;\n  }\n  .about-colour-gradient > div:nth-child(5)::before {\n    content: \"\";\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: -8px;\n    height: 4px;\n    background-color: var(--color-accent);\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/colour_gradient_generator/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2022-06-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2022-06-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Updated the plugin about\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2022-10-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Stored data is now removed when uninstalling the plugin\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2023-01-19\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Updated for Blockbench 4.6\"\n        ]\n      }\n    ]\n  },\n  \"2.0.0\": {\n    \"title\": \"2.0.0\",\n    \"date\": \"2024-06-13\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added a live colour palette preview\",\n          \"Added a new \\\"Brightness Range\\\" slider\",\n          \"Added a new \\\"Colour Offset\\\" slider\",\n          \"Added a toggle to limit the ranges to smaller ones, making it easier to be more precise\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Rewritten from the ground up\"\n        ]\n      }\n    ]\n  },\n  \"2.1.0\": {\n    \"title\": \"2.1.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/colour_gradient_generator/colour_gradient_generator.js",
    "content": "(() => {\n  let action, dialog, data\n  const id = \"colour_gradient_generator\"\n  const defaults = {\n    steps: 9,\n    angle: 45,\n    replace: false,\n    smallRanges: true,\n    brightnessRange: 1,\n    brightnessOffset: 0\n  }\n  Plugin.register(id, {\n    title: \"Colour Gradient Generator\",\n    icon: \"icon.png\",\n    author: \"Ewan Howell\",\n    description: \"Generate hue shifted gradient palettes from a single colour.\",\n    tags: [\"Paint\", \"Palette\", \"Color\"],\n    version: \"2.1.0\",\n    min_version: \"5.0.0\",\n    variant: \"both\",\n    website: \"https://ewanhowell.com/plugins/colour-gradient-generator/\",\n    repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/colour_gradient_generator\",\n    bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Colour Gradient Generator]\",\n    creation_date: \"2022-06-02\",\n    has_changelog: true,\n    onload() {\n      const storage = JSON.parse(localStorage.getItem(id) ?? \"{}\")\n      data = {\n        steps: storage.steps ?? defaults.steps,\n        angle: storage.angle ?? defaults.angle,\n        replace: storage.replace ?? defaults.replace,\n        smallRanges: storage.smallRanges ?? defaults.smallRanges,\n        brightnessRange: storage.brightnessRange ?? defaults.brightnessRange,\n        brightnessOffset: storage.brightnessOffset ?? defaults.brightnessOffset\n      }\n      dialog = new Dialog({\n        id,\n        title: \"Generate Gradient Palette\",\n        width: 780,\n        buttons: [\"Generate\", \"Cancel\"],\n        lines: [`<style>\n          #colour-gradient-preview {\n            display: flex;\n            overflow-x: hidden;\n            filter: drop-shadow(0 3px 10px #0006);\n            padding: 0 20px 8px;\n\n            > div {\n              background-color: red;\n              flex: 1;\n              height: 80px;\n              position: relative;\n\n              &.primary::before {\n                content: \"\";\n                position: absolute;\n                bottom: -8px;\n                height: 4px;\n                left: 0;\n                right: 0;\n                background-color: var(--color-accent);\n              }\n            }\n          }\n\n          #colour_gradient_generator {\n            .header-bar {\n              display: flex;\n              justify-content: space-between;\n              align-items: flex-end;\n\n              > i {\n                cursor: pointer;\n\n                &:hover {\n                  color: var(--color-light);\n                }\n              }\n            }\n\n            .sp-replacer {\n              width: 100%;\n              display: flex;\n\n              .sp-preview {\n                flex: 1;\n              }\n            }\n\n            .checkbox-row {\n              display: flex;\n              cursor: pointer;\n\n              div {\n                margin: 3px 0 0 5px;\n              }\n\n              * {\n                cursor: pointer;\n              }\n            }\n\n            .disabled {\n              opacity: .5;\n              position: relative;\n              cursor: not-allowed;\n\n              > * {\n                pointer-events: none;\n              }\n            }\n          }\n        </style>`],\n        component: {\n          data: {\n            data,\n            defaults,\n            colour: ColorPanel.get(),\n            minBrightnessOffset: Math.min(0, data.brightnessOffset),\n            maxBrightnessOffset: Math.max(0, data.brightnessOffset)\n          },\n          methods: {\n            save() {\n              localStorage.setItem(id, JSON.stringify(this.data))\n            },\n            clamp() {\n              this.data.steps = Math.min(32, this.data.steps)\n              this.data.angle = Math.max(-120, Math.min(120, this.data.angle))\n            },\n            reset() {\n              this.data.steps = defaults.steps\n              this.data.angle = defaults.angle\n              this.data.replace = defaults.replace\n              this.data.smallRanges = defaults.smallRanges\n              this.data.brightnessRange = defaults.brightnessRange\n              this.data.brightnessOffset = defaults.brightnessOffset\n            }\n          },\n          computed: {\n            palette() {\n              const colour = tinycolor(this.colour)\n              const hsl = colour.toHsl()\n              let angle = this.data.angle\n\n              if (hsl.h >= 100 && hsl.h < 260) angle *= -1\n\n              let minLightness = Math.max(0, hsl.l - this.data.brightnessRange * hsl.l)\n              let maxLightness = Math.min(1, hsl.l + this.data.brightnessRange * (1 - hsl.l))\n\n              let darker = Math.min(this.data.steps - 1, Math.floor((this.data.steps * (hsl.l - minLightness) / (maxLightness - minLightness)).toFixed(10)))\n              let lighter = this.data.steps - darker - 1\n\n              this.minBrightnessOffset = darker > 0 && lighter > 0 ? -lighter : 0\n              this.maxBrightnessOffset = darker > 0 && lighter > 0 ? darker : 0\n              this.data.brightnessOffset = Math.max(this.minBrightnessOffset, Math.min(this.maxBrightnessOffset, this.data.brightnessOffset))\n\n              if (isNaN(darker)) {\n                darker = Math.floor(this.data.steps / 2)\n                lighter = this.data.steps - darker - 1\n              }\n\n              const position = (darker + 1) / (this.data.steps + 1)\n\n              let darkFraction = 1\n              let lightFraction = 1\n\n              if (darker > 0 && lighter > 0) {\n                if (this.data.brightnessOffset < 0) {\n                  const inside = lighter - Math.abs(this.data.brightnessOffset)\n                  const ratio = (darker - this.data.brightnessOffset) / darker\n                  lightFraction = inside / (ratio * lighter)\n                  maxLightness = Math.min(1, hsl.l + this.data.brightnessRange * lightFraction * (1 - hsl.l))\n                } else {\n                  const inside = darker - Math.abs(this.data.brightnessOffset)\n                  const ratio = (lighter + this.data.brightnessOffset) / lighter\n                  darkFraction = inside / (ratio * darker)\n                  minLightness = Math.max(0, hsl.l - this.data.brightnessRange * darkFraction * hsl.l)\n                }\n              }\n\n              darker = darker - this.data.brightnessOffset\n              lighter = lighter + this.data.brightnessOffset\n\n              const colours = []\n\n              for (let x = darker - 1; x >= 0; x--) {\n                const col = colour.toHsl()\n                col.l = Math.lerp(hsl.l, minLightness, (x + 1) / (darker + 1))\n                col.h = toPositiveAngle(col.h + Math.lerp(0, -angle * position * darkFraction, (x + 1) / (darker + 1)))\n                colours.push(tinycolor(col).toHexString())\n              }\n\n              colours.push(tinycolor(colour).toHexString())\n\n              for (let x = lighter - 1; x >= 0; x--) {\n                const col = colour.toHsl()\n                col.l = Math.lerp(maxLightness, hsl.l, (x + 1) / (lighter + 1))\n                col.h = toPositiveAngle(col.h + Math.lerp(angle * (1 - position) * lightFraction, 0, (x + 1) / (lighter + 1)))\n                colours.push(tinycolor(col).toHexString())\n              }\n\n              this.save()\n\n              return new Set(colours)\n            }\n          },\n          mounted() {\n            $(this.$refs.colour).spectrum({\n              preferredFormat: \"hex\",\n              color: dialog.component.data.colour,\n              showAlpha: false,\n              showInput: true,\n              move: c => dialog.content_vue.colour = c.toHexString(),\n              change: c => dialog.content_vue.colour = c.toHexString(),\n              hide: c => dialog.content_vue.colour = c.toHexString()\n            })\n          },\n          template: `\n            <div>\n              <div title=\"Reset values back to their defaults\" class=\"dialog_close_button\" style=\"right: 33px; z-index: 3; border-radius: 6px;\" @click=\"reset\"><i class=\"material-icons\">replay</i></div>\n              <h2>Colour</h2>\n              <input ref=\"colour\" />\n              <br>\n              <div class=\"header-bar\">\n                <h2>Colour Count</h2>\n                <i title=\"Reset\" class=\"material-icons\" @click=\"data.steps = defaults.steps\">replay</i>\n              </div>\n              <p>The number of colours to include in the gradient</p>\n              <div class=\"bar slider_input_combo\">\n                <input type=\"range\" class=\"tool disp_range\" v-model.number=\"data.steps\" min=\"3\" :max=\"data.smallRanges ? 32 : 256\" step=\"1\" />\n                <numeric-input class=\"tool disp_text\" v-model.number=\"data.steps\" :min=\"3\" :max=\"data.smallRanges ? 32 : 256\" :step=\"1\" />\n              </div>\n              <br>\n              <div class=\"header-bar\">\n                <h2>Hue Shifting Angle</h2>\n                <i title=\"Reset\" class=\"material-icons\" @click=\"data.angle = defaults.angle\">replay</i>\n              </div>\n              <p>The amount of degrees over which the hue shifting occurs</p>\n              <div class=\"bar slider_input_combo\">\n                <input type=\"range\" class=\"tool disp_range\" v-model.number=\"data.angle\" :min=\"data.smallRanges ? -120 : -360\" :max=\"data.smallRanges ? 120 : 360\" step=\"1\" />\n                <numeric-input class=\"tool disp_text\" v-model.number=\"data.angle\" :min=\"data.smallRanges ? -120 : -360\" :max=\"data.smallRanges ? 120 : 360\" :step=\"1\" />\n              </div>\n              <br>\n              <div class=\"header-bar\">\n                <h2>Brightness Range</h2>\n                <i title=\"Reset\" class=\"material-icons\" @click=\"data.brightnessRange = defaults.brightnessRange\">replay</i>\n              </div>\n              <p>The range of the brightness included in the gradient</p>\n              <div class=\"bar slider_input_combo\">\n                <input type=\"range\" class=\"tool disp_range\" v-model.number=\"data.brightnessRange\" min=\"0\" :max=\"1\" step=\"0.001\" />\n                <numeric-input class=\"tool disp_text\" v-model.number=\"data.brightnessRange\" :min=\"0\" :max=\"1\" :step=\"0.001\" />\n              </div>\n              <br>\n              <div :class=\"{ disabled: !minBrightnessOffset && !maxBrightnessOffset }\">\n                <div class=\"header-bar\">\n                  <h2>Colour Offset</h2>\n                  <i title=\"Reset\" class=\"material-icons\" @click=\"data.brightnessOffset = defaults.brightnessOffset\">replay</i>\n                </div>\n                <p>Adjust the position of the selected colour within the gradient spectrum</p>\n                <div class=\"bar slider_input_combo\">\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"data.brightnessOffset\" :min=\"minBrightnessOffset\" :max=\"maxBrightnessOffset\" step=\"1\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"data.brightnessOffset\" :min=\"minBrightnessOffset\" :max=\"maxBrightnessOffset\" :step=\"1\" />\n                </div>\n              </div>\n              <br>\n              <div id=\"colour-gradient-preview\">\n                <div v-for=\"col in palette\" :class=\"{ primary: col === colour }\" :style=\"{ backgroundColor: col }\"></div>\n              </div>\n              <br>\n              <label class=\"checkbox-row\">\n                <input type=\"checkbox\" :checked=\"data.smallRanges\" v-model=\"data.smallRanges\" @input=\"clamp(); save()\">\n                <div>Use smaller ranges</div>\n              </label>\n              <label class=\"checkbox-row\">\n                <input type=\"checkbox\" :checked=\"data.replace\" v-model=\"data.replace\" @input=\"save\">\n                <div>Replace existing palette</div>\n              </label>\n            </div>\n          `\n        },\n        onOpen() {\n          this.content_vue.colour = ColorPanel.get()\n          $(this.content_vue.$refs.colour).spectrum(\"set\", this.content_vue.colour)\n        },\n        onConfirm() {\n          if (data.replace) ColorPanel.palette.length = 0\n          for (const colour of this.content_vue.palette) {\n            if (ColorPanel.palette.includes(colour)) ColorPanel.palette.splice(ColorPanel.palette.indexOf(colour), 1)\n            ColorPanel.palette.push(colour)\n          }\n        }\n      })\n      action = new Action(id, {\n        name: \"Generate Gradient Palette\",\n        icon: \"gradient\",\n        click: () => dialog.show()\n      })\n      Toolbars.palette.add(action)\n    },\n    onuninstall() {\n      localStorage.removeItem(\"colour_gradient_steps\")\n      localStorage.removeItem(\"colour_gradient_angle\")\n    },\n    onunload() {\n      dialog.close()\n      action.delete()\n    }\n  })\n\n  function toPositiveAngle(angle) {\n    angle = ((angle % 360) + 360) % 360\n    if (angle < 0) angle += 360\n    return angle\n  }\n})()"
  },
  {
    "path": "plugins/cosmic_reach_model_editor/about.md",
    "content": "# Cosmic Reach Model Editor\r\nSimple plugin that allows editing models that were created for the game [Cosmic Reach](https://finalforeach.itch.io/cosmic-reach).\r\n<br>\r\nIf any bugs founds, make sure to report it to the plugin's [Github](https://github.com/zHoeshin/CosmicReachModelEditor)."
  },
  {
    "path": "plugins/cosmic_reach_model_editor/changelog.json",
    "content": "{\r\n    \"1.0.0\": {\r\n        \"title\": \"1.0.0\",\r\n        \"date\": \"2024-03-09\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Features\",\r\n                \"list\": [\r\n                    \"Plugin created\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"1.1.1\": {\r\n        \"title\": \"1.1.1\",\r\n        \"date\": \"2024-04-19\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Bug Fixes\",\r\n                \"list\": [\r\n                    \"Fixed the bug that would cause Cosmic Reach models be loaded as Java Block Models\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"1.2.0\": {\r\n        \"title\": \"1.2.0\",\r\n        \"date\": \"2024-05-25\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Features\",\r\n                \"list\": [\r\n                    \"Added control over whether the output JSON file is minimized or not\",\r\n                    \"Added option to export model as a child of another model (saves only textures and the name of the parent model specified\",\r\n                    \"Made it possible to load a child model (parent model will be loaded too)\"\r\n                ]\r\n            },\r\n            {\r\n                \"title\": \"Bug Fixes\",\r\n                \"list\": [\r\n                    \"Texture names now load properly\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"1.3.0\": {\r\n        \"title\": \"1.3.0\",\r\n        \"date\": \"2024-06-30\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Features\",\r\n                \"list\": [\r\n                    \"Added Cosmic Reach Entity Model format, export and import\",\r\n                    \"Added Cosmic Reach Entity Animation export and import tools\",\r\n                    \"Improved the menu import/export items\",\r\n                    \"Changed JSON output format to suit the original Cosmic Reach JSON files more\"\r\n                ]\r\n            },\r\n            {\r\n                \"title\": \"Removed\",\r\n                \"list\": [\r\n                    \"Possibility to import either a maximized or a minimized JSON file. All of JSON files exported are now maximized\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"1.3.1\": {\r\n        \"title\": \"1.3.1\",\r\n        \"date\": \"2024-07-22\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Bug Fixes\",\r\n                \"list\": [\r\n                    \"Fixed Entity Model Exporting Bug\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"1.3.2\": {\r\n        \"title\": \"1.3.2\",\r\n        \"date\": \"2024-08-01\",\r\n        \"author\":\"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\":\"Bug Fixes\",\r\n                \"list\": [\r\n                    \"Fixed face culling always set to true bug\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"2.0.0\": {\r\n        \"title\": \"2.0.0\",\r\n        \"date\": \"2024-09-16\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Features\",\r\n                \"list\": [\r\n                    \"Textureless faces now do not require empty.png(instead they are not exported)\",\r\n                    \"Added model properties(Tools>Edit Model Properties)(used for cullsSelf and isTransparent block properties)(they aren't stored when saved as .bbmodel due to BB restrictions)\",\r\n                    \"New assets hyerarchy format replaced the old one\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"2.1.0\": {\r\n        \"title\": \"2.1.0\",\r\n        \"date\": \"2024-11-07\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Bug Fixes\",\r\n                \"list\": [\r\n                    \"UV Rotation is now exported\",\r\n                    \"UV is exported properly\",\r\n                    \"Textures export properly\"\r\n                ]\r\n            }\r\n        ]\r\n    },\r\n    \"2.2.0\": {\r\n        \"title\": \"2.2.0\",\r\n        \"date\": \"2024-03-03\",\r\n        \"author\": \"Z. Hoeshin\",\r\n        \"categories\": [\r\n            {\r\n                \"title\": \"Bug Fixes\",\r\n                \"list\": [\r\n                    \"Various bug fixes and improvements\"\r\n                ]\r\n            }\r\n        ]\r\n    }\r\n}"
  },
  {
    "path": "plugins/cosmic_reach_model_editor/cosmic_reach_model_editor.js",
    "content": "(() => {\n    let codec, export_action_block_minimized, export_action_block_maximized, import_action_block, dialog, propertiesDialog, originalJavaBlockCond, lastOccuranceOfSequenceInArray\n    const id = \"cosmic_reach_model_editor\"\n    const name = \"Cosmic Reach Model Editor\"\n    const icon = \"icon.png\"\n    const icon64 = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAATxJREFUWIXtV6EOwjAQvREUAYFCowlBIkhm2LegMXwFho/gM8DMTS/T0ygEBDvE8pL1saNlWdIKnlmvaa+9d+/WNlqtd5WIyHgSSxPTUSJ94v66GPbzkYqIyKDXVTog2iTnqtnBkS/mM8OOl98dprlpF+XNsJkJ7wwM0UDkiBiRrrftE48n0z7s28dn19ofmCnKeh0w4Z8BqBEM2CIHbFoA2E9RirGefwbQQO55x8i1LeLsatrIOWsjzet1UB3hMKDBVRNdEQ4DrqrWNME514B5qIZwGABsqv9VE6gOMMR+vTPw38CHBljF2h+OgX7WBmx82V84DGgRMLQ6d60KZjAcBjRoOXedZ2MmHAZwPuMOh51rOWc1a+rn8XxL9s8Av4g451oOXcfxWQAEcyv+v4wi7XWM90Jf0Px7Z+ANxOF3G0qPE9EAAAAASUVORK5CYII=\"\n    Plugin.register(id, {\n      title: name,\n      icon: \"icon.png\",\n      author: \"Z. Hoeshin\",\n      description: \"Allows creating, editing, importing and exporting Cosmic Reach block models.\",\n      tags: [\"Cosmic Reach\"],\n      version: \"2.2.0\",\n      min_version: \"4.8.0\",\n      creation_date: \"2024-04-19\",\n      variant: \"both\",\n      new_repository_format: true,\n      has_changelog: true,\n      onload() {\n\toriginalJavaBlockCond = Codecs.java_block.load_filter.condition\n        const blockPropertiesForm = {\n            cullsSelf: {\n                label: \"Culls Self\",\n                type: \"checkbox\",\n                value: true\n            },\n            isTransparent: {\n                label: \"Is transparent\",\n                type: \"checkbox\",\n                value: false\n            }\n        }\n\n\n        Codecs.java_block.load_filter.condition = (model) => {\n\t\t\treturn !model.cuboids && originalJavaBlockCond(model);\n\t\t}\n\n        dialog = new Dialog(\"cosmic_reach_model_errormessage\", {\n            id: \"cosmic_reach_model_dialog_error\",\n            title: \"Something went wrong...\",\n            buttons: [],\n            lines: [],\n        })\n\n        propertiesDialog = new Dialog(\"cosmic_reach_model_properties_dialog\", {\n            id: \"cosmic_reach_model_properties_dialog\",\n            totle: \"Properties\",\n            lines: [],\n            onConfirm: (b, e) => {\n                let res = propertiesDialog.getFormResult()\n                Project.properties = res\n            },\n            onCancel: (b, e) => {},\n        })\n\n        codec = new Codec(\"cosmic_reach_block_model_codec\", {\n            name: \"Cosmic Reach\",\n            extension: \"json\",\n            remember: false,\n            load_filter: {type: \"json\", extensions: [\"json\"],\n              condition: (model) => {\n                  return model.cuboids || model.textures;\n              }\n            },\n            format: new ModelFormat(\"cosmic_reach_model\", {\n                id: \"cosmic_reach_model\",\n                icon: icon64,\n                name: \"Cosmic Reach Model\",\n                description: \"Model format used by the game Cosmic Reach\",\n                show_on_start_screen: true,\n                target: [\"json\"],\n    \n                vertex_color_ambient_occlusion: true,\n                /*rotate_cubes: true,\n                rotation_limit: true,\n                rotation_snap: true,*/\n                uv_rotation: true,\n                java_face_properties: true,\n                \n                edit_mode: true,\n    \n                new() {\n                    newProject(this)\n                    Project.texture_width = 16\n                    Project.texture_height = 16\n                }\n            }),\n            compile(){\n                let replacePostProcess = []\n\n                let facenamesbb = [\"up\", \"down\", \"north\", \"south\", \"east\", \"west\"]\n                let facenamescr = [\"localPosY\", \"localNegY\", \"localNegZ\", \"localPosZ\", \"localPosX\", \"localNegX\"]\n            \n                cuboids = []\n                texturesUsed = []\n                texturesFilesUsed = []\n                textures = {}\n\n                function compileCube(obj){\n                    let uvs = {}\n                    for(let f of Object.keys(obj.faces)){\n                        let uv = obj.faces[f].uv\n                        \n                        let t = obj.faces[f].texture\n                        let textures = Texture.all.filter((x) => {\n                            if (x === undefined) {\n                                return false\n                            }\n                            if (t instanceof Texture) {\n                                return x.uuid == t.uuid\n                            }\n                            if (typeof(t) === 'string') {\n                                return x.uuid == t\n                            }\n                        })\n                        let texture = textures[0]\n                        //if (texture == undefined) console.error(obj.faces)\n                        if (texture !== undefined) texture = texture.name\n                        //texture = (texture === undefined) ? \"empty.png\" : texture.name\n\n                        let face = obj.faces[f]\n\n                        uvs[f] = [uv[0], uv[1], uv[2], uv[3], face.cullface, texture, face.rotation]\n\n                        texturesUsed.push(texture)\n                    }\n                    \n                    let cube = {\n                        \"localBounds\": [...obj.from, ...obj.to],\n                        \"faces\":\n                        {\n                            /*\"localNegX\": {\"uv\": uvs.west.slice(0, 4), \"ambientocclusion\": uvs.west[4].tint === 0,\n                            \"cullFace\": uvs.west[4].cullFace !== \"\", \"texture\": uvs.west[5]},\n                            \"localPosX\": {\"uv\": uvs.east.slice(0, 4), \"ambientocclusion\":  uvs.east[4].tint === 0,\n                            \"cullFace\": uvs.east[4].cullFace !== \"\", \"texture\": uvs.east[5]},\n\n                            \"localNegY\": {\"uv\": uvs.down.slice(0, 4), \"ambientocclusion\":  uvs.down[4].tint === 0,\n                            \"cullFace\": uvs.down[4].cullFace !== \"\", \"texture\": uvs.down[5]},\n                            \"localPosY\": {\"uv\": uvs.up.slice(0, 4), \"ambientocclusion\":  uvs.up[4].tint === 0,\n                            \"cullFace\": uvs.up[4].cullFace !== \"\", \"texture\": uvs.up[5]},\n\n                            \"localNegZ\": {\"uv\": uvs.north.slice(0, 4), \"ambientocclusion\":  uvs.north[4].tint === 0,\n                            \"cullFace\": uvs.north[4].cullFace !== \"\", \"texture\": uvs.north[5]},\n                            \"localPosZ\": {\"uv\": uvs.south.slice(0, 4), \"ambientocclusion\":  uvs.south[4].tint === 0,\n                            \"cullFace\": uvs.south[4].cullFace !== \"\", \"texture\": uvs.south[5]}*/\n                        }\n                    }\n                    \n                    for(let i = 0; i < 6; i++){\n                        if ((uvs[facenamesbb[i]][5] === undefined) || (uvs[facenamesbb[i]][5] === \"empty.png\")){\n                            continue\n                        }\n                        cube.faces[facenamescr[i]] = {\n                            \"uv\": uvs[facenamesbb[i]].slice(0, 4),\n                            \"ambientocclusion\": uvs[facenamesbb[i]][4].tint === 0,\n                            \"cullFace\": uvs[facenamesbb[i]][4].length > 0,\n                            \"texture\": uvs[facenamesbb[i]][5],\n                            \"uvRotation\": uvs[facenamesbb[i]][6],\n                        }\n                    }\n\n                    replacePostProcess.push(\n                        cube.localBounds, \n                        cube.faces.localNegX,\n                        cube.faces.localPosX,\n                        cube.faces.localNegY,\n                        cube.faces.localPosY,\n                        cube.faces.localNegZ,\n                        cube.faces.localPosZ,\n                    )\n                    \n                    for(let f = 0; f < 6; f++){\n                        if(uvs[facenamesbb[f]][4].rotation > 0){\n                            cube.faces[facenamescr[f]].uvRotation = uvs[facenamesbb[f]][4].rotation\n                        }\n                    }\n\n                    cuboids.push(cube)\n                }\n                function compileGroup(group){\n                    group.children.forEach(obj => {\n\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\tcompileGroup(obj);\n\t\t\t\t\t} else if (obj instanceof Cube) {\n\t\t\t\t\t\tcompileCube(obj)\n\t\t\t\t\t}\n\t\t\t\t})\n                }\n\n                Outliner.root.forEach(obj => {\n\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\tcompileGroup(obj);\n\t\t\t\t\t} else if (obj instanceof Cube) {\n\t\t\t\t\t\tcompileCube(obj)\n\t\t\t\t\t}\n\t\t\t\t})\n\n                for(let i = 0; i < texturesUsed.length; i++){\n                    if(texturesUsed[i] == null){\n                        continue\n                    }\n                    const name = texturesUsed[i]\n                    textures[name] = { \"fileName\": name }\n                }\n\n                //JSON.stringify({\"textures\": textures, \"cuboids\": cuboids}, undefined, options.maximize ? 4 : undefined)\n\n                \n                let r = {\"textures\": textures, \"cuboids\": cuboids}\n                if (Project.properties){\n                    if (Project.properties.isTransparent !== undefined){\n                        r.isTransparent = Project.properties.isTransparent\n                    }\n                    if (!Project.properties.cullsSelf !== undefined){\n                        r.cullsSelf = Project.properties.cullsSelf\n                    }\n                }\n                return stringifyJSON(r)\n            },\n\n            parse(rawJSONstring, path, cuboidsOnly = false){\n                let loadedTextures = {}\n\n                let patharr = path.split(/[\\\\\\/]/g)\n                patharr = patharr.slice(0, patharr.length - 1)\n\n                let root = lastOccuranceOfSequenceInArray(patharr, [\"models\", \"blocks\"])\n\n                let facenamesbb = [\"up\", \"down\", \"north\", \"south\", \"east\", \"west\"]\n                let facenamescr = [\"localPosY\", \"localNegY\", \"localNegZ\", \"localPosZ\", \"localPosX\", \"localNegX\"]\n\n                let allTexturesSpecified = false\n\n                let data\n                if(typeof rawJSONstring === 'string'){\n                    data = JSON.parse(rawJSONstring)\n                }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){\n                    data = rawJSONstring\n                }else{\n                    throw \"Unable to convert file data to Object\"\n                }\n\n                if(cuboidsOnly){\n                    if(data.cuboids === undefined){\n                        if(data.parent === undefined){\n                            return []\n                        }else{\n                            let p = data.parent\n                            Blockbench.read([...patharr.slice(undefined, patharr.length - 3), p.replace(\":\", \"/\")].join(\"/\"), {\n                                extensions: ['json'],\n                                type: 'Cosmic Reach Model',\n                                readtype: 'text',\n                                resource_id: 'json'\n                            }, files => {\n                                try{\n                                    let cuboids = codec.parse(files[0].content, files[0].path, true);\n                                    if(data.cuboids === undefined){\n                                        data.cuboids = []\n                                    }\n                                    if(cuboids !== undefined){\n                                        for(let c of cuboids){\n                                            data.cuboids.push(c)\n                                        }\n                                    }\n                                    return data.cuboids\n                                }catch(error){\n                                    return []\n                                }\n                            })\n                        }\n                    }\n                    return data.cuboids\n                }\n\n                if(data.textures === undefined){\n                    data.textures = {}\n                }\n\n                for(let t of Object.keys(data.textures)){\n                    let newtexture = new Texture().fromPath([...patharr.slice(undefined, patharr.length - 3), data.textures[t].fileName.replace(\":\", \"/\")].join(\"/\"))\n                    newtexture.name = data.textures[t].fileName\n                    loadedTextures[t] = newtexture.add()\n                }\n                \n                if(Texture.all.length > 0) {\n                    setTimeout(() => {\n                        Project.texture_width = Texture.all[0].width\n                        Project.texture_height = Texture.all[0].height\n                    }, 50);\n                }\n\n                if(data.cuboids === undefined){\n                    if(data.parent === undefined){\n                        throw Error(`No cuboids found in file ${path}`)\n                    }else{\n                        let p = data.parent\n                        Blockbench.read([...patharr.slice(undefined, patharr.length - 3), p.replace(\":\", \"/\")].join(\"/\"), {\n                            extensions: ['json'],\n                            type: 'Cosmic Reach Model',\n                            readtype: 'text',\n                            resource_id: 'json'\n                        }, files => {\n                            try{\n                                let cuboids = codec.parse(files[0].content, files[0].path, true);\n                                if(data.cuboids === undefined){\n                                    data.cuboids = []\n                                }\n                                if(cuboids !== undefined){\n                                    for(let c of cuboids){\n                                        data.cuboids.push(c)\n                                    }\n                                }\n                                dialog.lines = `<div>\n                                    <h1>Model is a child of '${p}'.</h1>\n                                    <p>Loaded parent with textures from the model file</p>\n                                </div>`.split(\"\\n\")\n                                dialog.show()\n                            }catch(error){\n                                dialog.lines = `<div>\n                                    <h1>Unable to import parent of the model.</h1>\n                                    <p>${error}</p>\n                                </div>`.split(\"\\n\")\n                                dialog.show()\n                            }\n                        })\n                    }\n                }\n\n                if(data.textures[\"all\"] != undefined){\n                    allTexturesSpecified = true\n                }\n\n                function getFaceUV(cuboid, face, uv){\n                    return cuboid.faces[face].uv[uv]\n                }\n\n                function setUVforFace(cube, cuboid, facenamebb, facenamecr){\n                    texture = allTexturesSpecified ? data.textures[\"all\"] : data.textures[cuboid.faces[facenamecr].texture]\n                    cube.faces[facenamebb].uv =[getFaceUV(cuboid, facenamecr, 0),\n                                                getFaceUV(cuboid, facenamecr, 1),\n                                                getFaceUV(cuboid, facenamecr, 2),\n                                                getFaceUV(cuboid, facenamecr, 3)]\n                    cube.faces[facenamebb].rotation = cuboid.faces[facenamecr][\"uvRotation\"] ?? 0\n                    cube.faces[facenamebb].texture = Texture.all.filter((x) => {return x.name == texture.fileName})[0]\n                }\n\n                for(let cuboid of data.cuboids){\n                    let from = cuboid.localBounds.slice(0, 3)\n                    let to = cuboid.localBounds.slice(3, 6)\n\n                    let cube = new Cube({from: from, to: to})\n                    for(let i = 0; i < 6; i++){\n                        try{\n                            let texture = loadedTextures[allTexturesSpecified ? \"all\" : cuboid.faces[facenamescr[i]].texture]\n                            setUVforFace(cube, cuboid, facenamesbb[i], facenamescr[i])\n                            cube.faces[facenamesbb[i]].texture = texture\n                        }catch(error){\n                            \n                        }\n                        if(cuboid.faces[facenamescr[i]] !== undefined){\n                            cube.faces[facenamesbb[i]].cullface = cuboid.faces[facenamescr[i]].cullFace ? facenamesbb[i] : \"\"\n                            cube.faces[facenamesbb[i]].tint = cuboid.faces[facenamescr[i]].ambientocclusion ? 0 : -1\n                        }else{\n                            cube.faces[facenamesbb[i]].enabled = false\n                        }\n                    }\n                    cube.addTo(Group.all.last()).init()\n                }\n                \n                setTimeout(() => {\n                    Canvas.updateAll()\n                }, 50);\n\n                properties = {isTransparent: false, cullsSelf: true}\n                if (data.isTransparent !== undefined){\n                    properties.isTransparent = data.isTransparent\n                }\n                if (data.cullsSelf !== undefined){\n                    properties.cullsSelf = data.cullsSelf\n                }\n                Project.properties = properties\n\n                return true;\n            }\n        })\n\n        codec_animation = new Codec(\"cosmic_reach_entity_animation_codec\", {\n            name: \"Cosmic Reach Entity Animation\",\n            extension: \"json\",\n            load_filter: {type: \"json\", extensions: [\"json\"]},\n            parse(rawJSONstring, path){\n                let contents\n                if(typeof rawJSONstring === 'string'){\n                    contents = JSON.parse(rawJSONstring)\n                }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){\n                    contents = rawJSONstring\n                }else{\n                    throw \"Unable to convert file data to Object\"\n                }\n\n                let bones = []\n                function compileGroup(obj){\n                    bones[obj.name] = {\n                        self: obj,\n                        parent: null\n                    }\n                    for(let child of obj.children){\n                        if(child instanceof Group){\n                            compileGroup(child)\n                        }\n                    }\n                }\n                Outliner.root.forEach(obj => {\n\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\tcompileGroup(obj);\n\t\t\t\t\t} else if (obj instanceof Cube) {\n\t\t\t\t\t\t//compileCube(obj)\n\t\t\t\t\t}\n\t\t\t\t})\n\n                \n                for(let animation_name of Object.keys(contents.animations)){\n                    let animation = contents.animations[animation_name]\n                    let animationobj = new Animation({\n                        name: animation_name,\n                        loop: animation.loop ? \"loop\" : \"once\",\n                        length: animation.animation_length\n                    })\n                    for(let bone_name of Object.keys(animation.bones)){\n                        let bone = animation.bones[bone_name]\n                        if (!(bone_name in bones)) continue\n                        let animator = animationobj.getBoneAnimator(bones[bone_name].self)\n                        for(let channel_name of Object.keys(bone)){\n                            let channel = bone[channel_name]\n                            if(channel instanceof Array){\n                                animator.addKeyframe({time: 0, channel: channel_name, data_points: [\n                                    vectorFromArrayToObject(channel, true)\n                                ]})\n                            }else if(channel instanceof Object){\n                                for(let timekey of Object.keys(channel)){\n                                    let time = Number(timekey)\n                                    let keyframedata = channel[timekey]\n                                    \n                                    if(Array.isArray(keyframedata)){\n                                        animator.addKeyframe({time: time, channel: channel_name, interpolation: \"linear\", data_points: [\n                                            vectorFromArrayToObject(keyframedata, true)\n                                        ]})\n                                    }else if(keyframedata instanceof Object){\n                                        \n                                        if(keyframedata.pre){\n                                            animator.addKeyframe({time: time, channel: channel_name, interpolation: \"bezier\", data_points: [\n                                                vectorFromArrayToObject(keyframedata.pre, true)\n                                            ]})\n                                        }\n                                        if(keyframedata.post){\n                                            animator.addKeyframe({time: time, channel: channel_name, interpolation: \"bezier\", data_points: [\n                                                vectorFromArrayToObject(keyframedata.post, true)\n                                            ]})\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    \n                    animationobj.add()\n                }\n\n            },\n\n            compile(){\n                let animations = {}\n                for(let anim of Project.animations){\n                    let animation = {\n                        loop: anim.loop === \"loop\",\n                        animation_length: anim.length\n                    }\n                    let bones = {}\n                    for(let animatorEntry of Object.entries(anim.animators)){\n                        let animator = animatorEntry[1]\n                        let bone = {}\n                        if(animator.position.length == 1){\n                            if(animator.position[0].data_points.length == 1){\n                                if(animator.position[0].time == 0){\n                                    let data_point = animator.position[0].data_points[0]\n                                    bone.position = [data_point.x, data_point.y, data_point.z].map((n) => Number(n))\n                                }\n                            }\n                        }else if(animator.position.length > 0){\n                            bone.position = {}\n                            for(let keyframe of animator.position){\n                                if(!keyframe.data_points.length) continue\n                                if(keyframe.interpolation === \"bezier\"){\n                                    bone.position[keyframe.time.toString()] = {\n                                        \"post\": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)),\n                                        \"lerp_mode\": \"catmullrom\"\n                                    }\n                                }else{\n                                    bone.position[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n))\n                                }\n                            }\n                        }\n                        if(animator.rotation.length == 1){\n                            if(animator.rotation[0].data_points.length == 1){\n                                if(animator.rotation[0].time == 0){\n                                    let data_point = animator.rotation[0].data_points[0]\n                                    bone.rotation = [data_point.x, data_point.y, data_point.z].map((n) => Number(n))\n                                }\n                            }\n                        }else if(animator.rotation.length > 0){\n                            bone.rotation = {}\n                            for(let keyframe of animator.rotation){\n                                if(!keyframe.data_points.length) continue\n                                if(keyframe.interpolation === \"bezier\"){\n                                    bone.rotation[keyframe.time.toString()] = {\n                                        \"post\": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)),\n                                        \"lerp_mode\": \"catmullrom\"\n                                    }\n                                }else{\n                                    bone.rotation[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n))\n                                }\n                            }\n                        }\n                        if(animator.scale.length == 1){\n                            if(animator.scale[0].data_points.length == 1){\n                                if(animator.scale[0].time == 0){\n                                    let data_point = animator.scale[0].data_points[0]\n                                    bone.scale = [data_point.x, data_point.y, data_point.z].map((n) => Number(n))\n                                }\n                            }\n                        }else if(animator.scale.length > 0){\n                            bone.scale = {}\n                            for(let keyframe of animator.scale){\n                                if(!keyframe.data_points.length) continue\n                                if(keyframe.interpolation === \"bezier\"){\n                                    bone.scale[keyframe.time.toString()] = {\n                                        \"post\": [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n)),\n                                        \"lerp_mode\": \"catmullrom\"\n                                    }\n                                }else{\n                                    bone.scale[keyframe.time.toString()] = [keyframe.data_points[0].x, keyframe.data_points[0].y, keyframe.data_points[0].z].map((n) => Number(n))\n                                }\n                            }\n                        }\n                        if(bone.position){\n                            bones[animator.group.name] = {position: bone.position}\n                        }\n                        if(bone.rotation){\n                            if(bones[animator.group.name] === undefined){\n                                bones[animator.group.name] = {}\n                            }\n                            if(bones[animator.group.name].rotation === undefined){\n                                bones[animator.group.name].rotation = null\n                            }\n                            bones[animator.group.name].rotation = bone.rotation\n                        }\n                        if(bone.scale){\n                            if(bones[animator.group.name] === undefined){\n                                bones[animator.group.name] = {}\n                            }\n                            if(bones[animator.group.name].scale === undefined){\n                                bones[animator.group.name].scale = null\n                            }\n                            bones[animator.group.name].scale = bone.scale\n                        }\n                    }\n                    animation.bones = bones\n                    animations[anim.name] = animation\n                }\n                return stringifyJSON({animations: animations})\n            }\n        })\n        \n        codec_entity = new Codec(\"cosmic_reach_entity_model_codec\", {\n            name: \"Cosmic Reach Entity\",\n            extension: \"json\",\n            remember: false,\n            load_filter: {type: \"json\", extensions: [\"json\"],\n            condition: (model) => {\n                return model.id && model.texture_width && model.texture_height && model.bones\n            }},\n            format: new ModelFormat(\"cosmic_reach_entity_model\", {\n                id: \"cosmic_reach_entity_model\",\n                icon: icon64,\n                name: \"Cosmic Reach Entity Model\",\n                description: \"Entiy model format used by the game Cosmic Reach\",\n                show_on_start_screen: true,\n                target: [\"json\"],\n    \n                vertex_color_ambient_occlusion: true,\n                rotate_cubes: true,\n                rotation_limit: false,\n                rotation_snap: true,\n                uv_rotation: false,\n                box_uv: true,\n                java_face_properties: true,\n                centered_grid: true,\n                edit_mode: true,\n                rotate_cubes: true,\n                box_uv: true,\n                single_texture: true,\n                bone_rig: true,\n                centered_grid: true,\n                animated_textures: true,\n                animation_files: true,\n                animation_mode: true,\n                animation_controllers: true,\n                bone_binding_expression: true,\n                locators: true,\n    \n                new() {\n                    newProject(this)\n                }\n            }),\n            compile(){\n                let bones = []\n                \n                function compileCube(obj){\n                    let cube = {\n                        origin: obj.from,\n                        size: [obj.to[0] - obj.from[0], obj.to[1] - obj.from[1], obj.to[2] - obj.from[2]],\n                        uv: obj.uv_offset\n                    }\n                    if(!vectorIsEqualToVector(obj.origin, [0, 0, 0])){\n                        cube.pivot = obj.origin\n                    }\n                    if(!vectorIsEqualToVector(obj.rotation, [0, 0, 0])){\n                        cube.rotation = obj.rotation\n                    }\n                    if(obj.inflate != 0){\n                        cube.inflate = obj.inflate\n                    }\n                    return cube\n                }\n                function compileGroup(obj){\n                    /*group.children.forEach(obj => {\n                        if (obj instanceof Group) {\n                            compileGroup(obj);\n                            } else if (obj instanceof Cube) {\n                                compileCube(obj)\n                                }\n                                })*/\n                    let newBone = {\n                        name: obj.name,\n                        pivot: obj.origin\n                    }\n                    if((obj.rotation[0] !== 0)||(obj.rotation[1] !== 0)||(obj.rotation[2] !== 0)){\n                        newBone.rotation = obj.rotation\n                    }\n\n                    if(obj.parent != \"root\"){\n                        newBone.parent = obj.parent.name\n                    }\n                    for(let child of obj.children){\n                        if(child instanceof Group){\n                            compileGroup(child)\n                        }else if(child instanceof Cube){\n                            if(newBone.cubes === undefined){\n                                newBone.cubes = []\n                            }\n                            newBone.cubes.push(compileCube(child))\n                        }\n                    }\n                    bones.push(newBone)\n                }\n\n                Outliner.root.forEach(obj => {\n\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\tcompileGroup(obj);\n\t\t\t\t\t} else if (obj instanceof Cube) {\n\t\t\t\t\t\t//compileCube(obj)\n\t\t\t\t\t}\n\t\t\t\t})\n\n                //\n                return stringifyJSON({id: name, texture_width: Project.texture_width, texture_height: Project.texture_height, bones: bones})\n            },\n\n            parse(rawJSONstring, path, cuboidsOnly = false){\n                let data\n                if(typeof rawJSONstring === 'string'){\n                    data = JSON.parse(rawJSONstring)\n                }else if(rawJSONstring instanceof Object && !(rawJSONstring instanceof Array)){\n                    data = rawJSONstring\n                }else{\n                    throw \"Unable to convert file data to Object\"\n                }\n\n                Project.texture_width = data.texture_width || 16\n                Project.texture_height = data.texture_height || 16\n\n                Project.name = data.id || \"\"\n\n                bones = {}\n                for(let bone of data.bones){\n                    let group = new Group((({ cubes, parent, ...o }) => o)(bone)).init()\n                    group.origin = bone.pivot\n                    if(bone.cubes){\n                        for(let cube of bone.cubes){\n                            let newCube = new Cube({\n                                uv_offset: cube.uv,\n                                from: cube.origin,\n                                size: cube.size,\n                                rotation: cube.rotation,\n                                origin: cube.pivot,\n                                inflate: cube.inflate\n                            })\n                            newCube.addTo(group).init()\n                        }\n                    }\n                    bones[bone.name] = {\"self\": group, \"parent\": bone.parent}\n                }\n                for(let bone of Object.keys(bones)){\n                    let b = bones[bone]\n                    if(b.parent){\n                        b.self.addTo(bones[b.parent].self)\n                    }else{\n                        b.self.addTo(\"root\")\n                    }\n                }\n\n                let patharr = path.split(/[\\\\\\/]/g)\n\n                let loadedTextures = {}\n                const b = patharr.slice(undefined, patharr.length - 4)\n                for(let t of Object.keys(data.textures ?? {})){\n                    let newtexture = new Texture().fromPath([...b, data.textures[t].replace(\":\", \"/\")].join(\"/\"))\n                    newtexture.name = data.textures[t].fileName\n                    loadedTextures[t] = newtexture.add()\n                }\n                \n                //patharr = patharr.slice(0, patharr.length - 1)\n\n                //\n                \n                let root = lastOccuranceOfSequenceInArray(patharr, [\"models\", \"entities\"])\n\n                let animpatharr = [...patharr.slice(undefined, root - 1), \"animations\", ...patharr.slice(root)]\n                animpatharr[animpatharr.length - 1] = animpatharr[animpatharr.length - 1].replace(/\\.json$/gi, \".animation.json\").replace(/^model_/gi, \"\")\n                let animpath = animpatharr.join(\"/\")\n                Blockbench.read(animpath, {\n                    extensions: ['json'],\n                    type: 'Cosmic Reach Entity Model',\n                    readtype: 'text',\n                    resource_id: 'json'\n                }, files => {\n                    try{\n                        let contents = JSON.parse(files[0].content)\n                        codec_animation.parse(contents, animpath)\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to import animations of the model.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                })\n\n            }\n        })\n        \n        import_action_block = new Action('import_cosmic_reach_model', {\n            name: 'Import Cosmic Reach Block Model',\n            description: '',\n            icon: icon64,\n            category: 'file',\n            click() {\n                Blockbench.import({\n                    extensions: ['json'],\n                    type: 'Cosmic Reach Model',\n                    readtype: 'text',\n                    resource_id: 'json'\n                }, files => {\n                    try{\n                        codec.parse(files[0].content, files[0].path);\n                        Canvas.updateAll()\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to import file.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                })\n            }\n        })\n\n        export_action_block = new Action('export_cosmic_reach_model', {\n                    name: 'Export Cosmic Reach Block Model',\n                    description: '',\n                    icon: icon64,\n                    category: 'file',\n                    /*side_menu: new Menu(\"export_cosmic_reach_model_sidemenu\", [\n                        new Action('export_cosmic_reach_model', {\n                        name: 'Export minimized',\n                        description: '',\n                        icon: icon64,\n                        category: 'file',\n                        structure: [\n                            \n                        ],\n                        click() {\n                            try{\n                                codec.export();\n                            }catch(error){\n                                dialog.lines = `<div>\n                                    <h1>Unable to export file.</h1>\n                                    <p>${error}</p>\n                                </div>`.split(\"\\n\")\n                                dialog.show()\n                            }\n                        }\n                    }),\n                    new Action('export_cosmic_reach_model_maximized', {\n                        name: 'Export maximized',\n                        description: '',\n                        icon: icon64,\n                        category: 'file',\n                        click() {\n                            try{\n                                codec.export();\n                            }catch(error){\n                                dialog.lines = `<div>\n                                    <h1>Unable to export file.</h1>\n                                    <p>${error}</p>\n                                </div>`.split(\"\\n\")\n                                dialog.show()\n                            }\n                        }\n                    }),\n                    \n                        \n                    ]),*/\n                    click() {\n                        try{\n                            codec.export({parent: undefined});\n                        }catch(error){\n                            dialog.lines = `<div>\n                                <h1>Unable to export file.</h1>\n                                <p>${error}</p>\n                            </div>`.split(\"\\n\")\n                            dialog.show()\n                        }\n                    }\n                })\n        //export_action_block_maximized = \n        export_action_block_aschild = new Action('export_cosmic_reach_model_aschild', {\n                        name: 'Export Cosmic Reach Block Child Model',\n                        description: '',\n                        icon: icon64,\n                        category: 'file',\n                        click() {\n                            try{\n                                new Dialog(\"cosmic_reach_model_exportaschildmodeldialog\", {\n                                    id: \"cosmic_reach_model_dialog_aschild\",\n                                    title: \"Export model as a child\",\n                                    form: {\n                                        name: {\n                                            label: \"Parent name\",\n                                            value: Project._name\n                                        }\n                                    },\n                                    onConfirm: result => {\n                                        codec.export({parent: result.name});\n                                    }\n                                }).show()\n                            }catch(error){\n                                dialog.lines = `<div>\n                                    <h1>Unable to export file.</h1>\n                                    <p>${error}</p>\n                                </div>`.split(\"\\n\")\n                                dialog.show()\n                            }\n                        }\n                    })\n\n        MenuBar.addAction(import_action_block, 'file.import')\n        MenuBar.addAction(export_action_block, 'file.export')\n        /*MenuBar.addAction(export_action_block_minimized, 'file.export')\n        MenuBar.addAction(export_action_block_maximized, 'file.export')*/\n        MenuBar.addAction(export_action_block_aschild, 'file.export')\n\n        import_action_entity = new Action('import_cosmic_reach_entity_model', {\n            name: 'Import Cosmic Reach Entity Model',\n            description: '',\n            icon: icon64,\n            category: 'file',\n            click() {\n                Blockbench.import({\n                    extensions: ['json'],\n                    type: 'Cosmic Reach Model',\n                    readtype: 'text',\n                    resource_id: 'json'\n                }, files => {\n                    try{\n                        codec_entity.parse(files[0].content, files[0].path);\n                        Canvas.updateAll()\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to import file.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                })\n            }\n        })\n        export_action_entity = new Action('export_cosmic_reach_entity_model', {\n            name: 'Export Cosmic Reach Entity Model',\n            description: '',\n            icon: icon64,\n            category: 'file',\n            /*children: side_menu: new Menu(\"export_cosmic_reach_entity_model_side_menu\",[new Action('export_cosmic_reach_entity_model_minimized', {\n                name: 'Export minimized',\n                description: '',\n                icon: icon64,\n                category: 'file',\n                side_menu: new Menu(\"export_cosmic_reach_entity_model_side_menu\",[]),\n                click() {\n                    try{\n                        codec_entity.export();\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to export file.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                }\n            }),new Action('export_cosmic_reach_entity_model_maximized', {\n                name: 'Export maximized',\n                description: '',\n                icon: icon64,\n                category: 'file',\n                side_menu: new Menu(\"export_cosmic_reach_entity_model_side_menu\",[]),\n                click() {\n                    try{\n                        codec_entity.export();\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to export file.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                }\n            }),]),*/\n            click() {\n                try{\n                    codec_entity.export();\n                }catch(error){\n                    dialog.lines = `<div>\n                        <h1>Unable to export file.</h1>\n                        <p>${error}</p>\n                    </div>`.split(\"\\n\")\n                    dialog.show()\n                }\n            }\n        })\n\n        MenuBar.addAction(import_action_entity, 'file.import')\n        MenuBar.addAction(export_action_entity, 'file.export')\n\n        import_action_entity_animation = new Action('import_cosmic_reach_entity_animation', {\n            name: 'Import Cosmic Reach Entity Animation',\n            description: '',\n            icon: icon64,\n            category: 'file',\n            click() {\n                Blockbench.import({\n                    extensions: ['json'],\n                    type: 'Cosmic Reach Animation',\n                    readtype: 'text',\n                    resource_id: 'json'\n                }, files => {\n                    try{\n                        codec_animation.parse(files[0].content, files[0].path);\n                        Canvas.updateAll()\n                    }catch(error){\n                        dialog.lines = `<div>\n                            <h1>Unable to import file.</h1>\n                            <p>${error}</p>\n                        </div>`.split(\"\\n\")\n                        dialog.show()\n                    }\n                })\n            }\n        })\n        export_action_entity_animation = new Action('export_cosmic_reach_entity_animation', {\n            name: 'Export Cosmic Reach Entity Animation',\n            description: '',\n            icon: icon64,\n            category: 'file',\n            click() {\n                try{\n                    codec_animation.export();\n                }catch(error){\n                    dialog.lines = `<div>\n                        <h1>Unable to export file.</h1>\n                        <p>${error}</p>\n                    </div>`.split(\"\\n\")\n                    dialog.show()\n                }\n            }\n        })\n\n        show_properties_dialog = new Action(\"cosmic_reach_show_properties_dialog\", {\n            id: \"cosmic_reach_show_properties_dialog\",\n            icon: icon64,\n            description: \"\",\n            name: \"Edit model properties\",\n            category: \"Tools\",\n            click() {\n                switch (Project.format.id){\n                    default:\n                        propertiesDialog.form = {}\n                        propertiesDialog.show()\n                    case \"cosmic_reach_model\":\n                        propertiesDialog.form = blockPropertiesForm\n                        propertiesDialog.show()\n                        propertiesDialog.setFormValues(Project.properties)\n                }\n            }\n        })\n\n        \n        MenuBar.addAction(import_action_entity_animation, 'file.import')\n        MenuBar.addAction(export_action_entity_animation, 'file.export')\n\n        MenuBar.addAction(show_properties_dialog, 'tools')\n\n        lastOccuranceOfSequenceInArray = (array, sequence) => {\n            let count = 0\n            \n            for(let i = array.length - 1; i >= 0; i--) {\n                if(array[i] === sequence[sequence.length - count - 1]){\n                    count ++\n                    if(count === sequence.length - 1){\n                        return i\n                    }\n                }\n            }\n            return -1\n        }\n        vectorFromArrayToObject = (vectorArray, isString = false) => {\n            return isString ? {x: vectorArray[0].toString(), y: vectorArray[1].toString(), z: vectorArray[2].toString()} : {x: vectorArray[0], y: vectorArray[1], z: vectorArray[2]}\n        }\n\n        vectorIsEqualToVector = (vectorA, vectorB) => {\n            return (vectorA[0] == vectorB[0]) && (vectorA[1] == vectorB[1]) && (vectorA[2] == vectorB[2])\n        }\n\n        function stringifyJSON(obj, exclude = [], space = \"\\t\", excluder = (obj) => {\n            if(Array.isArray(obj)){\n                return obj.every(Number.isFinite)\n            }else if(obj instanceof Object){\n                return obj.uv !== undefined\n            }\n            return false\n          }) {\n            let recur = (obj, spacing, inarray, islastinarray = false) => {\n              let txt = '';\n          \n              if (inarray) {\n                if (Array.isArray(obj)) {        \n                  txt += '[';\n          \n                  for(let i=0;i<obj.length;i++) {\n                    var islast = i === (obj.length - 1)\n                    \n                    txt += recur(obj[i], spacing + space, true, islast);\n                  };\n          \n                  txt = txt.substr(0, Math.max(1,txt.length - 2)) + ']';\n                  \n                } else if (typeof obj === 'object' && obj !== null) {\n                    if(excluder(obj)){\n                        txt += JSON.stringify(obj)\n                    }else{\n                        txt += '{' + recur(obj, spacing + space, false) + '\\n' + spacing + '}';\n                    }\n                } else if (typeof obj === 'string') {\n                  txt += obj.replaceAll(/\\\"/g, '\\\\\"') + '\"';\n                } else {\n                  txt += obj;\n                };\n                \n                \n                return txt + (islastinarray ? '  ' : \", \") + (excluder(obj) ? \"\\n\" + spacing : \"\");\n                \n              } else {\n                for (let key of Object.keys(obj)) {\n                  if ((exclude.indexOf(key) !== -1)||(excluder(obj[key]))) {\n                    txt += '\\n' + spacing + '\"' + key + '\": ' + JSON.stringify(obj[key]);\n                  } else if (Array.isArray(obj[key])) {\n                    txt += '\\n' + spacing + '\"' + key + '\": [';\n                    \n                    for(let i=0;i<obj[key].length;i++) {\n                        var islast = i === (obj[key].length - 1)\n                        \n                      txt += recur(obj[key][i], spacing + space, true, islast);\n                    };\n                    \n                    txt = txt.substr(0, Math.max(1,txt.length - 2)) + ']';\n                    \n                  } else if (typeof obj[key] === 'object' && obj[key] !== null) {\n                    txt += '\\n' + spacing + '\"' + key + '\": {' + recur(obj[key], spacing + space, false) + '\\n' + spacing + '}';\n                  } else if (typeof obj[key] === 'string') {\n                    txt += '\\n' + spacing + '\"' + key + '\": \"' + obj[key].replaceAll(/\\\"/g, '\\\\\"') + '\"';\n                  } else {\n                    txt += '\\n' + spacing + '\"' + key + '\": ' + obj[key];\n                  };\n                  \n                  txt += ',';\n                };\n                \n                return txt.substr(0, txt.length - 1);\n              };\n          \n            };\n            return (Array.isArray(obj) ? '[' + recur(obj, space, true) + '\\n' + ']' : '{' + recur(obj, space, false) + '\\n' + '}');\n          };\n      },\n\n\n      onunload() {\n\t\timport_action_block.delete();\n\t\texport_action_block.delete();\n\t\t/*export_action_block_maximized.delete();\n\t\texport_action_block_minimized.delete();*/\n\t\texport_action_block_aschild.delete();\n\t\timport_action_entity.delete();\n\t\texport_action_entity.delete();\n\n        import_action_entity_animation.delete();\n        export_action_entity_animation.delete();\n        Codecs.java_block.load_filter.condition = originalJavaBlockCond\n\n        show_properties_dialog.delete()\n      }\n    })\n  })()\n"
  },
  {
    "path": "plugins/creative_mode/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/creative_mode/about.md",
    "content": "### Fly like in creative Minecraft\n- From 'WASD Control plugin': Use AWSD to move around, E to go up, Q to go down (keybinds are configurable).\n- Use Shift to fly faster or Alt to fly slower (keybinds are configurable).\n- You can change the sensitivity of the camera, speed of flight, speed modifier for \"go faster (shift)\" and \"go slower (alt)\".\n\n### Painting the world\n- Select a \"brush\" (Cube).\n- Press T or click the icon to toggle the tool.\n- Start painting by clicking with the Right Mouse Button on other cubes.\n- Use Left Click to remove blocks, or Ctrl + Z to undo.\n- If you want to select a different brush, or customize the current one, just press T again to deactivate the tool and select a different brush (Cube).\n- Differently from Minecraft there's no limit distance to place blocks, so you can remove or place a block from really far away.\n\n\n### Demo\n- Checkout this discord thread with some videos (https://discord.com/channels/314078526104141834/1264973145681559674), I'll need to join the Blockbench discord server to see it.\n\n\n### Known issues\n- The plugin may act weirdly when placing blocks with rotations or scales that differ from each other.\n- The Outliner can flicker up and down when placing lots of blocks. Selecting something in the outliner usually fixes that.\n- The performance can be a little weird when placing thousands of blocks in the same scene. However, that fixes itself when restarting the app, it's inconsistent what triggers the frame drops in this case.\n\n### Limitations\n- It's not supported to place a cube in a Mesh or in the \"void\".\n- While placing a tiny block in a huge block, that placement can be weird and offset to some corner. That's tough to fix, so there's no planning for that.\n- It's not possible to Ctrl + S to save the project while the tool is active. That's due to the WASD movement for the navigation.\n- It's not possible to position multiple blocks at the same time.\n\n\n### Future ideas\n- The plugin no longer implements a simple tool, but a new \"edit mode\" called 'Creative', placed next to Edit / Paint / Animate. This new tab will not show any Gizmo or selection; it will only be for 'placing and removing cubes'. \n - This new tab would have its own group system to help group the new cubes created; I've been using the plugin for creating a level design for my game, and I got 1000+ cubes in the scene, so it's important to have some group organization.\n - A new interface in this new tab, that would take the UV place, displaying the current selected cube (aka. the current Sample Cube used for painting the world).\n- A system that lets the user place cubes in an empty grid. The current state only lets the user place a cube next to another cube, so that can be a bit annoying at times.\n- Add middle click to pick blocks like in Minecraft (Suggested by Jannis)."
  },
  {
    "path": "plugins/creative_mode/creative_mode.js",
    "content": "(function() {\n\nlet cubeSample = undefined;\nlet cubeSample_normals = {};\nconst faceNormals = {\n    north: { x: 0, y: 0, z: -1 },\n    south: { x: 0, y: 0, z: 1 },\n    west: { x: -1, y: 0, z: 0 },\n    east: { x: 1, y: 0, z: 0 },\n    up: { x: 0, y: 1, z: 0 },\n    down: { x: 0, y: -1, z: 0 }\n};\n\nlet old_animate;\n\nlet just_enabled = false;\n\nBBPlugin.register('creative_mode', {\n    title: 'Creative Mode',\n    author: 'Caio Raphael',\n    icon: 'icon.png',\n    description: 'Place and remove cubes just like in Minecraft creative mode',\n    version: '1.0.0',\n    min_version: '4.8.0',\n\tvariant: 'both',\n    onload() {\n        let canvas = document.querySelector('canvas');\n\n        // SETTINGS\n        new Setting('creative_mode_camera_sensitivity', {\n\t\t\tname: 'Creative Mode: Camera Sensitivity',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 1,\n\t\t\tmax: 5.0,\n\t\t\tmin: 0.1\n\t\t});\n        new Setting('creative_mode_base_speed', {\n\t\t\tname: 'Creative Mode: Base Speed',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 50,\n\t\t\tmin: 1\n\t\t});\n\t\tnew Setting('creative_mode_move_faster_mult', {\n\t\t\tname: 'Creative Mode: Move Faster Multiplier',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 2.5,\n\t\t\tmax: 10,\n\t\t\tmin: 1\n\t\t});\n\t\tnew Setting('creative_mode_move_slower_mult', {\n\t\t\tname: 'Creative Mode: Move Slower Multiplier',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 0.5,\n\t\t\tmax: 1,\n\t\t\tmin: 0.1\n\t\t});\n        new Setting('creative_mode_wasd_y_level', {\n\t\t\tname: 'Creative Mode: Navigate at Y Level',\n\t\t\tdescription: 'Navigate using WASD at consistent Y level rather than on camera plane',\n\t\t\tcategory: 'preview',\n\t\t\tvalue: true\n\t\t});\n\n\n        // FUNCTIONS: Behavior\n        function manageActions(event) {   \n            let intersection = Canvas.raycast(event);\n\n            if (intersection && intersection.element instanceof Mesh) {\n                if (event.button === 0 || event.button == 2) {\n                    Blockbench.showQuickMessage('Meshes are not supported.', 2000);\n                }\n                return;\n            }\n\n            if (intersection && intersection.element instanceof Cube) {\n                // Delete \n                if (event.button === 0) {\n                    let cube = intersection.element;\n                    removeCube(cube);\n                    return;\n                }\n                if (cubeSample) {\n                    // Add\n                    if (event.button === 2) {\n                        if (intersection && intersection.element instanceof Cube) {\n                            let cube = intersection.element;\n                            let clicked_face = intersection.face;\n                            const cube_normals = {\n                                north: getRotatedVector(faceNormals['north'], cube.rotation),\n                                up: getRotatedVector(faceNormals['up'], cube.rotation),\n                                east: getRotatedVector(faceNormals['east'], cube.rotation),\n                                south: getRotatedVector(faceNormals['south'], cube.rotation),\n                                west: getRotatedVector(faceNormals['west'], cube.rotation),\n                                down: getRotatedVector(faceNormals['down'], cube.rotation)\n                            };\n                            let face_normal = cube_normals[clicked_face];\n                            placeAdjacentCube(cube, face_normal);\n                            return;\n                        }\n                    } else {\n                        return;\n                    }\n                } else {\n                    Blockbench.showQuickMessage('Cube Sample not selected.', 2000);\n                    return;\n                }\n            }\n        }\n        function placeAdjacentCube(cubeTarget, face_normal) {\n            Undo.initEdit({outliner: true, elements: []});\n\n            // 'cubeSample' and 'cubeTarget' transforms.\n            apply_origin_to_geometry(cubeSample);\n            apply_origin_to_geometry(cubeTarget);\n\n            // Location spawn for the 'newCube'.\n            let size_cubeSample = cubeSample.size();\n            let size_cubeTarget = cubeTarget.size();\n            \n            let from_newCube_location = [...cubeTarget.from];\n            let to_newCube_location = [\n                from_newCube_location[0] + size_cubeSample[0],\n                from_newCube_location[1] + size_cubeSample[1],\n                from_newCube_location[2] + size_cubeSample[2]\n            ];\n\n            // >>>> Testes para fix do bug 'scale + rotation'.\n            let size_cubeTarget_converted = {\n                x: size_cubeTarget[0],\n                y: size_cubeTarget[1],\n                z: size_cubeTarget[2],\n            };\n            let rotated_size_cubeTarget = getRotatedVector(size_cubeTarget_converted, cubeTarget.rotation);\n            // let translation = [\n            //     face_normal.x * rotated_size_cubeTarget.x,\n            //     face_normal.y * rotated_size_cubeTarget.y,\n            //     face_normal.z * rotated_size_cubeTarget.z\n            // ];\n            // <<<<\n\n            let translation = [\n                face_normal.x * size_cubeTarget[0],\n                face_normal.y * size_cubeTarget[1],\n                face_normal.z * size_cubeTarget[2],\n            ];\n\n            let newCube = cubeSample.duplicate();\n\n            // 'newCube' transforms.\n            let old_newCube_rotation = newCube.rotation;\n            newCube.rotation = [0,0,0];\n            newCube.from = [\n                from_newCube_location[0] + translation[0],\n                from_newCube_location[1] + translation[1],\n                from_newCube_location[2] + translation[2]\n            ];\n            newCube.to = [\n                to_newCube_location[0] + translation[0],\n                to_newCube_location[1] + translation[1],\n                to_newCube_location[2] + translation[2]\n            ];\n            move_pivot_to_geometry(newCube);\n            newCube.rotation = old_newCube_rotation;\n            \n            // Finish.\n            Cube.all.push(newCube);\n            Undo.finishEdit('Add cube', {outliner: true, elements: [newCube]});\n            Canvas.updateAll();\n\n        }\n        function removeCube(cube) {\n            Undo.initEdit({outliner: true, elements: [cube]});\n            cube.remove();\n            // Atualizar somehow no outliner. Tive bugs ao apagar o objeto selecionado.\n            if (cube === cubeSample) {\n                cubeSample = undefined;\n                cubeSample_normals = [];\n            }\n            Undo.finishEdit('Remove cube', {outliner: true, elements: []});\n        }\n        function isCreativeModeEnabled() {\n\t\t\t// return Preview.selected && BarItems.creative_tool && BarItems.creative_tool.value;\n            return Preview.selected && (BarItems.creative_tool === BarItems[Toolbox.selected.id]);\n\t\t}\n        function setupWASDMovement(preview, length = 1) {\n\t\t\tlet pos = new THREE.Vector3().copy(preview.camera.position);\n\t\t\tpos.add(preview.camera.getWorldDirection(new THREE.Vector3()).normalize().multiplyScalar(length));\n\t\t\tpreview.controls.target.copy(pos);\n\t\t}\n        function move_camera(event) {\n\t\t\tlet movementX = event.movementX || 0;\n\t\t\tlet movementY = event.movementY || 0;\n\n\t\t\t// Rotate the camera\n\t\t\tPreview.selected.controls.rotateLeft(movementX * 0.004 * settings.creative_mode_camera_sensitivity.value);\n\t\t\tPreview.selected.controls.rotateUp(movementY * 0.004 * settings.creative_mode_camera_sensitivity.value);\n\t\t}\n        function helper_hide_context_menu() {\n\t\t\t// Event trigger to hide the context_menu.\n\t\t\tlet rect = canvas.getBoundingClientRect();\n\t\t\tlet centerX = rect.left + window.innerWidth / 2;\n\t\t\tlet centerY = rect.top + window.innerHeight / 2;\n\t\t\tlet mousedown_event = new MouseEvent('mousedown', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tview: window,\n\t\t\t\tclientX: centerX,\n\t\t\t\tclientY: centerY,\n\t\t\t\tbutton: 1\n\t\t\t});\n\t\t\tlet mouseup_event = new MouseEvent('mouseup', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tview: window,\n\t\t\t\tclientX: centerX,\n\t\t\t\tclientY: centerY,\n\t\t\t\tbutton: 1\n\t\t\t});\n\t\t\tmousedown_event.selection_helper = true;\n\t\t\tmouseup_event.selection_helper = true;\n\t\t\tcanvas.dispatchEvent(mousedown_event);\n\t\t\tcanvas.dispatchEvent(mouseup_event);\n\t\t}\n        function click_on_center(b) {\n            // Event trigger to hide the context_menu.\n\t\t\tlet rect = canvas.getBoundingClientRect();\n\t\t\tlet centerX = window.innerWidth / 2;\n\t\t\tlet centerY = window.innerHeight / 2;\n\t\t\tlet mousedown_event = new MouseEvent('mousedown', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tview: window,\n\t\t\t\tclientX: centerX,\n\t\t\t\tclientY: centerY,\n\t\t\t\tbutton: b\n\t\t\t});\n\t\t\tlet mouseup_event = new MouseEvent('mouseup', {\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tview: window,\n\t\t\t\tclientX: centerX,\n\t\t\t\tclientY: centerY,\n\t\t\t\tbutton: b\n\t\t\t});\n\t\t\tmousedown_event.click_on_center = true;\n\t\t\tmouseup_event.click_on_center = true;\n\t\t\tcanvas.dispatchEvent(mousedown_event);\n\t\t\tcanvas.dispatchEvent(mouseup_event);\n        }\n\n        // FUNCTIONS: Geometry\n        function getRotatedVector(vector, rotation) {\n            let radX = rotation[0] * Math.PI / 180;\n            let radY = rotation[1] * Math.PI / 180;\n            let radZ = rotation[2] * Math.PI / 180;\n\n            let cosX = Math.cos(radX);\n            let sinX = Math.sin(radX);\n            let cosY = Math.cos(radY);\n            let sinY = Math.sin(radY);\n            let cosZ = Math.cos(radZ);\n            let sinZ = Math.sin(radZ);\n\n            let rotatedNormal = {...vector};\n            // Apply rotation around X axis\n            let tempY = rotatedNormal.y;\n            rotatedNormal.y = tempY * cosX - rotatedNormal.z * sinX;\n            rotatedNormal.z = tempY * sinX + rotatedNormal.z * cosX;\n            // Apply rotation around Y axis\n            let tempZ = rotatedNormal.z;\n            rotatedNormal.z = tempZ * cosY - rotatedNormal.x * sinY;\n            rotatedNormal.x = tempZ * sinY + rotatedNormal.x * cosY;\n            // Apply rotation around Z axis\n            let tempX = rotatedNormal.x;\n            rotatedNormal.x = tempX * cosZ - rotatedNormal.y * sinZ;\n            rotatedNormal.y = tempX * sinZ + rotatedNormal.y * cosZ;\n\n            return rotatedNormal;\n        }\n        function getCubeGhostCenter(cube) {\n            let max = [-Infinity, -Infinity, -Infinity];\n            let min = [ Infinity,  Infinity,  Infinity];\n\n            if (cube.getWorldCenter) {\n                var pos = cube.getWorldCenter();\n                min[0] = Math.min(pos.x, min[0]);\tmax[0] = Math.max(pos.x, max[0]);\n                min[1] = Math.min(pos.y, min[1]);\tmax[1] = Math.max(pos.y, max[1]);\n                min[2] = Math.min(pos.z, min[2]);\tmax[2] = Math.max(pos.z, max[2]);\n            }\n            let center = (min[0] == Infinity) ? [0, 0, 0] : max.V3_add(min).V3_divide(2);\n            \n            if (!Format.centered_grid) {\n                center.V3_add(8, 8, 8);\n            }\n            return center;\n        }\n        function apply_origin_to_geometry(cube) {\n            var center = getCubeGhostCenter(cube);\n            if (!cube.transferOrigin) return;\n            cube.transferOrigin(center);\n        }\n        function getCubeCenter(cube) {\n            return [\n                cube.from[0] + cube.size(0)/2,\n                cube.from[1] + cube.size(1)/2,\n                cube.from[2] + cube.size(2)/2\n            ]\n        }\n        function move_pivot_to_geometry(cube) {\n            cube.origin = getCubeCenter(cube);\n        }\n\n        // FUNCTIONS: Draw\n        const crosshair_size = 10;\n        const crosshair_linewidth = 2;\n        const crosshair_color = 'white';\n\n        const custom_canvas = document.createElement('canvas');\n        custom_canvas.width = window.innerWidth;\n        custom_canvas.height = window.innerHeight;\n        custom_canvas.style.position = 'absolute';\n        custom_canvas.style.top = '0';\n        custom_canvas.style.left = '0';\n        custom_canvas.style.pointerEvents = 'none'; // Ensure the canvas doesn't block interactions\n        custom_canvas.style.zIndex = '9999';\n        document.body.appendChild(custom_canvas);\n        const ctx = custom_canvas.getContext('2d');\n        function drawCrosshair() {\n            const centerX = custom_canvas.width / 2;\n            const centerY = custom_canvas.height / 2;\n            clearDrawing();\n            ctx.beginPath();\n            ctx.moveTo(centerX - crosshair_size, centerY);\n            ctx.lineTo(centerX + crosshair_size, centerY);\n            ctx.moveTo(centerX, centerY - crosshair_size);\n            ctx.lineTo(centerX, centerY + crosshair_size);\n            ctx.strokeStyle = crosshair_color;\n            ctx.lineWidth = crosshair_linewidth;\n            ctx.stroke();\n        }\n        function clearDrawing() {\n            ctx.clearRect(0, 0, custom_canvas.width, custom_canvas.height); // Clear the custom_canvas\n        }\n        // Adjust the custom_canvas size when the window is resized\n        window.addEventListener('resize', () => {\n            custom_canvas.width = window.innerWidth;\n            custom_canvas.height = window.innerHeight;\n            if (isCreativeModeEnabled()) {\n                drawCrosshair();\n            }\n        });\n\n\n        // INPUT: Keybinds\n        let navigate_forward = new KeybindItem('creative_mode_navigate_forward', {\n\t\t\tname: 'Creative Mode: Move Forward',\n\t\t\ticon: 'arrow_upward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'w', ctrl: null})\n\t\t});\n\t\tlet navigate_backward = new KeybindItem('creative_mode_navigate_backward', {\n\t\t\tname: 'Creative Mode: Move Backward',\n\t\t\ticon: 'arrow_downward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 's', ctrl: null})\n\t\t});\n\t\tlet navigate_left = new KeybindItem('creative_mode_navigate_left', {\n\t\t\tname: 'Creative Mode: Move Left',\n\t\t\ticon: 'arrow_back',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'a', ctrl: null})\n\t\t});\n\t\tlet navigate_right = new KeybindItem('creative_mode_navigate_right', {\n\t\t\tname: 'Creative Mode: Move Right',\n\t\t\ticon: 'arrow_forward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'd', ctrl: null})\n\t\t});\n\t\tlet navigate_down = new KeybindItem('creative_mode_navigate_down', {\n\t\t\tname: 'Creative Mode: Move Down',\n\t\t\ticon: 'expand_more',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'q', ctrl: null})\n\t\t});\n\t\tlet navigate_up = new KeybindItem('creative_mode_navigate_up', {\n\t\t\tname: 'Creative Mode: Move Up',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'e', ctrl: null})\n\t\t});\n\t\tlet navigate_faster = new KeybindItem('creative_mode_navigate_faster', {\n\t\t\tname: 'Creative Mode: Move Faster',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 16, ctrl: null})\n\t\t});\n\t\tlet navigate_slower = new KeybindItem('creative_mode_navigate_slower', {\n\t\t\tname: 'Creative Mode: Move Slower',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 18, ctrl: null})\n\t\t});\n        let plugin_keybinds = [navigate_forward, navigate_backward, navigate_left, navigate_right, navigate_down, navigate_up, navigate_faster, navigate_slower];\n\n\n        // INPUT: Check\n        let pressed_keys = [];\n        Blockbench.on('press_key', data => {\n\t\t\tlet key = data.event.which;\n\t\t\tif (plugin_keybinds.find(k => k.keybind.key == key) && !getFocusedTextInput()) {\n\t\t\t\tpressed_keys.safePush(key);\n\t\t\t\tif (isCreativeModeEnabled()) {\n\t\t\t\t\tdata.capture();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n        document.addEventListener('keydown', event => {\n            if (isCreativeModeEnabled()) {\n                if (!just_enabled) {\n                    if (event.keyCode == creativeToolAction.keybind.key || event.key === 'Escape') {\n                        BarItems['move_tool'].select();\n                    }\n                }\n                just_enabled = false;\n            }\n\t\t});\n        document.addEventListener('keyup', event => {\n\t\t\tpressed_keys.remove(event.which);\n\t\t});\n        document.addEventListener('mousedown', event => {\n            if (isCreativeModeEnabled()) {\n                if (event.click_on_center) {\n                    manageActions(event);\n                } else {\n                    if (event.button == 0) {\n                        event.preventDefault();\n                        click_on_center(0);\n                    }\n                    if (event.button == 2) {\n                        event.preventDefault();\n                        click_on_center(2);\n                    }\n                }\n            }\n        });\n        document.addEventListener('mouseup', function(event) {\n            if (isCreativeModeEnabled()) {\n                if (event.click_on_center) {\n                }\n                if (event.button === 2) {\n                    event.preventDefault();  // I'm not sure about this.\n                    helper_hide_context_menu();\n                }\n                unselectAllElements();\n                if (cubeSample) cubeSample.select();\n            }\n\t\t});\n        document.addEventListener('mousemove', function(event) {\n\t\t\tif (isCreativeModeEnabled()) {\n\t\t\t\tmove_camera(event);\n\t\t\t}\n\t\t});\n\n\n        // TOOLS\n        let creativeToolAction = new Tool('creative_tool', {\n            name: 'Creative Tool',\n            icon: 'fa-cube',\n            category: 'tools',\n            keybind: new Keybind({key: 't'}),\n            modes: ['edit'],\n            condition: {modes: ['edit']},\n            onSelect: function() {\n                drawCrosshair();\n                setupWASDMovement(Preview.selected, 1);\n                Preview.all.forEach(preview => {\n                    preview.controls.enableZoom = false;\n                });\n                canvas.requestPointerLock();\n                cubeSample = Cube.selected[0];\n                if (cubeSample) {\n                    cubeSample.select();\n                    cubeSample_normals = {\n                        north: getRotatedVector(faceNormals['north'], cubeSample.rotation),\n                        up: getRotatedVector(faceNormals['up'], cubeSample.rotation),\n                        east: getRotatedVector(faceNormals['east'], cubeSample.rotation),\n                        south: getRotatedVector(faceNormals['south'], cubeSample.rotation),\n                        west: getRotatedVector(faceNormals['west'], cubeSample.rotation),\n                        down: getRotatedVector(faceNormals['down'], cubeSample.rotation)\n                    };\n                }\n                just_enabled = true;\n            },\n            onUnselect: function() {\n                clearDrawing();\n                setupWASDMovement(Preview.selected, 16);\n                Preview.all.forEach(preview => {\n                    preview.controls.enableZoom = true;\n                });\n                document.exitPointerLock();\n                cubeSample = undefined;\n                cubeSample_normals = [];\n            }\n        });       \n        MenuBar.addAction(creativeToolAction, 'tools');\n\n\n        // PROCESS\n\t\tfunction doWASDMovement() {\n\t\t\tlet movement = new THREE.Vector3(0, 0, 0);\n\n\t\t\tlet uses_wasd_movement = false;\n\t\t\tfunction add(x, y, z) {\n\t\t\t\tmovement.x += x;\n\t\t\t\tmovement.y += y;\n\t\t\t\tmovement.z += z;\n\t\t\t\tuses_wasd_movement = true;\n\t\t\t}\n\t\t\tif (pressed_keys.includes(navigate_forward.keybind.key)) add(0, 0, -1);\n\t\t\tif (pressed_keys.includes(navigate_backward.keybind.key)) add(0, 0, 1);\n\t\t\tif (pressed_keys.includes(navigate_left.keybind.key)) add(-1, 0, 0);\n\t\t\tif (pressed_keys.includes(navigate_right.keybind.key)) add(1, 0, 0);\n\t\t\tif (pressed_keys.includes(navigate_down.keybind.key)) add(0, -1, 0);\n\t\t\tif (pressed_keys.includes(navigate_up.keybind.key)) add(0, 1, 0);\n\t\t\t\n\t\t\t\n\t\t\tif (uses_wasd_movement) {\n\t\t\t\tsetupWASDMovement(Preview.selected);\n\t\t\t\t\n\t\t\t\tlet speedMultiplier = 1.0;\n\t\t\t\tif (pressed_keys.includes(navigate_faster.keybind.key)) speedMultiplier *= settings.creative_mode_move_faster_mult.value;\n\t\t\t\telse if (pressed_keys.includes(navigate_slower.keybind.key)) speedMultiplier *= settings.creative_mode_move_slower_mult.value;\n\n\t\t\t\tif (settings.creative_mode_wasd_y_level.value) {\n\t\t\t\t\tlet vec = Preview.selected.controls.object.getWorldDirection(new THREE.Vector3()).normalize();\n\t\t\t\t\tlet angle = Math.atan2(-vec.x, -vec.z);\n\t\t\t\t\tmovement.applyAxisAngle(THREE.NormalY, angle);\n\t\t\t\t} else {\n\t\t\t\t\tmovement.applyEuler(Preview.selected.controls.object.rotation);\n\t\t\t\t}\n\n\t\t\t\tmovement.multiplyScalar(Settings.get('creative_mode_base_speed') * speedMultiplier / 100);\n\t\t\t\tPreview.selected.camera.position.add(movement);\n\t\t\t\tPreview.selected.controls.target.add(movement);\n\t\t\t}\n\t\t}\n\t\told_animate = window.animate;\n\t\twindow.animate = function(...args) {\n\t\t\told_animate(...args);\n\n\t\t\tif (isCreativeModeEnabled() && pressed_keys.length) {\n\t\t\t\tdoWASDMovement();\n\t\t\t}\n\t\t};\n\n    },\n    onunload() {\n        MenuBar.removeAction('creative_tool');\n    }\n\n});\n})();\n"
  },
  {
    "path": "plugins/csmodel.js",
    "content": "(function() {\n\nvar import_action, export_action;\n\n\nPlugin.register('csmodel', {\n\ttitle: 'CraftStudio Model Format',\n\ticon: 'star',\n\tauthor: 'JannisX11',\n\tdescription: 'Allows to import and export CraftStudio Models (.csmodel).',\n\tabout: `To **import** a model from CraftStudio, go to the CraftStudio project settings and export a cspack file.\n\t\tOpen this file in an archive manager (like 7zip) and extract the model file.\n\t\tImport the file into Blockbench using the import menu.\n\t\t\\nTo **export** a file, export a .csmodel file from Blockbench and drop it into an existing .cspack file into the Models folder.\n\t\tMake sure it is using the same file name as the old model in the pack. Import the .cspack into CraftStudio and select the models you want to import.`,\n\ttags: [\"CraftStudio\"],\n\tversion: '0.1.3',\n\tmin_version: '3.8.0',\n\tvariant: 'both',\n\tonload() {\n\n\t\tfunction toArrayBuffer(buf) {\n\t\t\tvar ab = new ArrayBuffer(buf.length);\n\t\t\tvar view = new Uint8Array(ab);\n\t\t\tfor (var i = 0; i < buf.length; ++i) {\n\t\t\t\tview[i] = buf[i];\n\t\t\t}\n\t\t\treturn ab;\n\t\t}\n\t\tlet getNativeSize = function(cube, face) {\n\t\t\tvar side = face.direction;\n\t\t\tvar size = {};\n\t\t\tif (side == 'north' || side == 'south') {\n\t\t\t\treturn [cube.size('0'),\n\t\t\t\t\tcube.size('1')]\n\t\t\t} else if (side == 'east' || side == 'west') {\n\t\t\t\treturn [cube.size('2'),\n\t\t\t\t\tcube.size('1')]\n\t\t\t} else if (side == 'up' || side == 'down') {\n\t\t\t\treturn [cube.size('0'),\n\t\t\t\t\tcube.size('2')]\n\t\t\t}\n\t\t}\n\t\tvar textDecoder;\n\n\t\tclass BinaryReader {\n\t\t\tconstructor(buffer) {\n\t\t\t\tthis.view = new DataView(buffer);\n\t\t\t\tthis.cursor = 0;\n\t\t\t\tthis.textDecoder = new TextDecoder();\n\t\t\t}\n\t\t\tReadUInt8() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getUint8(this.cursor);\n\t\t\t\tthis.cursor += 1;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadUInt16() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getUint16(this.cursor, true);\n\t\t\t\tthis.cursor += 2;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadInt32() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getInt32(this.cursor, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadUInt32() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getUint32(this.cursor, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadFloat32() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getFloat32(this.cursor, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadFloat64() {\n\t\t\t\tvar val;\n\t\t\t\tval = this.view.getFloat64(this.cursor, true);\n\t\t\t\tthis.cursor += 8;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadBoolean() {\n\t\t\t\treturn this.ReadUInt8() !== 0;\n\t\t\t}\n\t\t\tRead7BitEncodedInt() {\n\t\t\t\tvar bitIndex, num, returnValue;\n\t\t\t\treturnValue = 0;\n\t\t\t\tbitIndex = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (bitIndex !== 35) {\n\t\t\t\t\t\tnum = this.ReadUInt8();\n\t\t\t\t\t\treturnValue |= (num & 127) << bitIndex;\n\t\t\t\t\t\tbitIndex += 7;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"Invalid 7-bit encoded int\");\n\t\t\t\t\t}\n\t\t\t\t\tif ((num & 128) === 0) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn returnValue;\n\t\t\t}\n\t\t\tReadString() {\n\t\t\t\tvar length, val;\n\t\t\t\tlength = this.Read7BitEncodedInt();\n\t\t\t\tval = this.DecodeString(new Uint8Array(this.view.buffer.slice(this.cursor, this.cursor + length)));\n\t\t\t\tthis.cursor += length;\n\t\t\t\treturn val;\n\t\t\t}\n\t\t\tReadPoint() {\n\t\t\t\treturn {\n\t\t\t\t\tx: this.ReadInt32(),\n\t\t\t\t\ty: this.ReadInt32()\n\t\t\t\t};\n\t\t\t}\n\t\t\tReadVector2() {\n\t\t\t\treturn new THREE.Vector2(this.ReadFloat32(), this.ReadFloat32());\n\t\t\t}\n\t\t\tReadVector3() {\n\t\t\t\treturn new THREE.Vector3(this.ReadFloat32(), this.ReadFloat32(), this.ReadFloat32());\n\t\t\t}\n\t\t\tReadIntVector3() {\n\t\t\t\treturn new THREE.Vector3(this.ReadInt32(), this.ReadInt32(), this.ReadInt32());\n\t\t\t}\n\t\t\tReadQuaternion() {\n\t\t\t\tvar w;\n\t\t\t\tw = this.ReadFloat32();\n\t\t\t\treturn new THREE.Quaternion(this.ReadFloat32(), this.ReadFloat32(), this.ReadFloat32(), w);\n\t\t\t}\n\t\t\tReadBytes(length) {\n\t\t\t\tvar bytes;\n\t\t\t\tbytes = new Uint8Array(this.view.buffer.slice(this.cursor, this.cursor + length));\n\t\t\t\tthis.cursor += length;\n\t\t\t\treturn bytes;\n\t\t\t}\n\t\t\tDecodeString(array) {\n\t\t\t\treturn this.textDecoder.decode(array);\n\t\t\t};\n\t\t};\n\t\tclass BinaryWriter {\n\t\t\tconstructor(minimal_length) {\n\t\t\t\tthis.array = new Uint8Array(minimal_length);\n\t\t\t\tthis.buffer = this.array.buffer;\n\t\t\t\tthis.view = new DataView(this.buffer);\n\t\t\t\tthis.cursor = 0;\n\t\t\t\tthis.textEncoder = new TextEncoder();\n\t\t\t}\n\t\t\texpand(n) {\n\t\t\t\tvar new_length = this.cursor+1+n;\n\t\t\t\tif (new_length > this.buffer.byteLength) {\n\t\t\t\t\tvar oldArray = this.array;\n\t\t\t\t\tthis.array = new Uint8Array(new_length);\n\t\t\t\t\tthis.buffer = this.array.buffer;\n\t\t\t\t\tthis.array.set(oldArray);\n\t\t\t\t\tthis.view = new DataView(this.buffer)\n\t\t\t\t}\n\t\t\t}\n\t\t\tWriteUInt8(value) {\n\t\t\t\tthis.expand(1);\n\t\t\t\tthis.view.setUint8(this.cursor, value);\n\t\t\t\tthis.cursor += 1;\n\t\t\t}\n\t\t\tWriteUInt16(value) {\n\t\t\t\tthis.expand(2);\n\t\t\t\tthis.view.setUint16(this.cursor, value, true);\n\t\t\t\tthis.cursor += 2;\n\t\t\t}\n\t\t\tWriteInt32(value) {\n\t\t\t\tthis.expand(4);\n\t\t\t\tthis.view.setInt32(this.cursor, value, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteUInt32(value) {\n\t\t\t\tthis.expand(4);\n\t\t\t\tthis.view.setUint32(this.cursor, value, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteFloat32(value) {\n\t\t\t\tthis.expand(4);\n\t\t\t\tthis.view.setFloat32(this.cursor, value, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteFloat64(value) {\n\t\t\t\tthis.expand(8);\n\t\t\t\tthis.view.setFloat64(this.cursor, value, true);\n\t\t\t\tthis.cursor += 8;\n\t\t\t}\n\t\t\tWriteBoolean(value) {\n\t\t\t\tthis.WriteUInt8(value ? 1 : 0)\n\t\t\t}\n\t\t\tWrite7BitEncodedInt(value) {\n\t\t\t\twhile (value >= 0x80) {\n\t\t\t\t\tthis.WriteUInt8(value | 0x80);\n\t\t\t\t\tvalue = value >> 7;\n\t\t\t\t}\n\t\t\t\tthis.WriteUInt8(value);\n\t\t\t}\n\t\t\tWriteString(string) {\n\t\t\t\tvar array = this.EncodeString(string);\n\t\t\t\tthis.Write7BitEncodedInt(array.byteLength);\n\t\t\t\tthis.WriteBytes(array);\n\t\t\t}\n\t\t\tWritePoint(point) {\n\t\t\t\tthis.expand(8);\n\t\t\t\tthis.view.setInt32(this.cursor, point.x, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setInt32(this.cursor, point.y, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteVector2(vector) {\n\t\t\t\tthis.expand(8);\n\t\t\t\tthis.view.setFloat32(this.cursor, vector.x, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, vector.y, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteVector3(vector) {\n\t\t\t\tthis.expand(12);\n\t\t\t\tthis.view.setFloat32(this.cursor, vector.x, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, vector.y, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, vector.z, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteIntVector3(vector) {\n\t\t\t\tthis.expand(12);\n\t\t\t\tthis.view.setInt32(this.cursor, vector.x, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setInt32(this.cursor, vector.y, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setInt32(this.cursor, vector.z, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteQuaternion(quat) {\n\t\t\t\tthis.expand(16);\n\t\t\t\tthis.view.setFloat32(this.cursor, quat.w, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, quat.x, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, quat.y, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t\tthis.view.setFloat32(this.cursor, quat.z, true);\n\t\t\t\tthis.cursor += 4;\n\t\t\t}\n\t\t\tWriteBytes(array) {\n\t\t\t\tthis.expand(array.byteLength);\n\t\t\t\tthis.array.set(array, this.cursor);\n\t\t\t\tthis.cursor += array.byteLength;\n\t\t\t}\n\t\t\tEncodeString(string) {\n\t\t\t\treturn this.textEncoder.encode(string);\n\t\t\t}\n\t\t};\n\n\n\t\tvar oppositeFaces = {\n\t\t\t'south': 'north',\n\t\t\t'north': 'south',\n\t\t\t'east': 'west',\n\t\t\t'down': 'up',\n\t\t\t'west': 'east',\n\t\t\t'up': 'down',\n\t\t}\n\t\tvar faceAxes = {\n\t\t\t'north': 2,\n\t\t\t'east': 0,\n\t\t\t'up': 1,\n\t\t\t'south': 2,\n\t\t\t'west': 0,\n\t\t\t'down': 1,\n\t\t}\n\n\n\t\tvar codec = new Codec('csmodel', {\n\t\t\tname: 'CraftStudio',\n\t\t\textension: 'csmodel',\n\t\t\tremember: false,\n\t\t\tcompile(options) {\n\n\t\t\t\tvar writer = new BinaryWriter(100);\n\t\t\t\tvar fake_cube = new Cube({\n\t\t\t\t\tfrom: [0, 0, 0],\n\t\t\t\t\tto: [0, 0, 0],\n\t\t\t\t})\n\n\t\t\t\tvar ids = {};\n\t\t\t\tvar id = -1;\n\t\t\t\tvar offsets = {};\n\n\t\t\t\twriter.WriteUInt8(0);//asset type\n\t\t\t\twriter.WriteUInt16(5);//format version\n\t\t\t\twriter.WriteUInt16(0);//next unused node id\n\t\t\t\twriter.WriteUInt16(0);//node count\n\n\t\t\t\tfunction processGroup(group, parent) {\n\t\t\t\t\t//get main cube\n\t\t\t\t\tvar main_cube;\n\t\t\t\t\tfor (var child of group.children) {\n\t\t\t\t\t\tif (child instanceof Cube && child.rotation.allEqual(0)) {\n\t\t\t\t\t\t\tmain_cube = child;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!main_cube) {\n\t\t\t\t\t\t//add fake 0x0x0 cube\n\t\t\t\t\t\tprocessCube(group, parent);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprocessCube(main_cube, parent, group)\n\t\t\t\t\t}\n\t\t\t\t\tids[group.uuid] = id;\n\n\t\t\t\t\tfor (var child of group.children) {\n\t\t\t\t\t\tif (child instanceof Cube && child != main_cube) {\n\t\t\t\t\t\t\tprocessCube(child, group, false)\n\t\t\t\t\t\t} else if (child instanceof Group) {\n\t\t\t\t\t\t\tprocessGroup(child, group)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction processCube(obj, parent, group) {\n\t\t\t\t\tid++;\n\t\t\t\t\tvar cube = (obj instanceof Cube) ? obj : fake_cube;\n\t\t\t\t\tif (group) obj = group\n\n\t\t\t\t\twriter.WriteUInt16(id);\n\t\t\t\t\tif (parent && ids[parent.uuid] !== undefined) {\n\t\t\t\t\t\twriter.WriteUInt16(ids[parent.uuid]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twriter.WriteUInt16(-1);\n\t\t\t\t\t}\n\t\t\t\t\twriter.WriteString(obj.name);\n\t\t\t\t\tvar size = cube.size(undefined, true);\n\t\t\t\t\tvar center = [\n\t\t\t\t\t\tcube.from[0] + size[0]/2,\n\t\t\t\t\t\tcube.from[1] + size[1]/2,\n\t\t\t\t\t\tcube.from[2] + size[2]/2,\n\t\t\t\t\t]\n\t\t\t\t\tvar pivot = obj.origin\n\t\t\t\t\tvar pos = new THREE.Vector3().fromArray(pivot);\n\t\t\t\t\tif (parent) {\n\t\t\t\t\t\tpos.sub(new THREE.Vector3().fromArray(parent.origin));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpos.add(new THREE.Vector3().fromArray(obj.origin));\n\t\t\t\t\t}\n\t\t\t\t\tif (parent && ids[parent.uuid]) {\n\t\t\t\t\t\tpos.sub(offsets[ids[parent.uuid]]);\n\t\t\t\t\t}\n\t\t\t\t\tvar offset = new THREE.Vector3(center[0] - pivot[0], center[1] - pivot[1], center[2] - pivot[2]);\n\t\t\t\t\tvar euler = new THREE.Euler().setFromDegreeArray(obj.rotation);\n\t\t\t\t\tvar rotation = new THREE.Quaternion().setFromEuler(euler);\n\t\t\t\t\tvar scale = new THREE.Vector3(\n\t\t\t\t\t\t((size[0]+2*cube.inflate) / size[0]) * (size[0] < 0 ?-1:1),\n\t\t\t\t\t\t((size[1]+2*cube.inflate) / size[1]) * (size[1] < 0 ?-1:1),\n\t\t\t\t\t\t((size[2]+2*cube.inflate) / size[2]) * (size[2] < 0 ?-1:1)\n\t\t\t\t\t);\n\t\t\t\t\toffsets[id] = new THREE.Vector3().copy(offset);\n\n\t\t\t\t\twriter.WriteVector3(pos.divideScalar(16));\n\t\t\t\t\twriter.WriteVector3(offset.divideScalar(16));\n\t\t\t\t\twriter.WriteVector3(scale);\n\t\t\t\t\twriter.WriteQuaternion(rotation);\n\t\t\t\t\twriter.WriteUInt16(Math.abs(size[0]));\n\t\t\t\t\twriter.WriteUInt16(Math.abs(size[1]));\n\t\t\t\t\twriter.WriteUInt16(Math.abs(size[2]));\n\n\t\t\t\t\twriter.WriteUInt8(2);\n\n\t\t\t\t\tfor (var face_key in oppositeFaces) {\n\t\t\t\t\t\tvar face = cube.faces[face_key];\n\t\t\t\t\t\twriter.WritePoint({\n\t\t\t\t\t\t\tx: face.uv[0],\n\t\t\t\t\t\t\ty: face.uv[1]\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tfor (var face_key in oppositeFaces) {\n\t\t\t\t\t\tvar code = 0;\n\t\t\t\t\t\tvar x_m = face_key != 'up' && face_key != 'down';\n\t\t\t\t\t\tvar y_m = face_key != 'up';\n\n\t\t\t\t\t\tif (face.rotation == 90) code += 1;\n\t\t\t\t\t\tif (face.rotation == 180) code += 2;\n\t\t\t\t\t\tif (face.rotation == 270) code += 4;\n\t\t\t\t\t\tif (face.uv[0] > face.uv[2] != x_m) code += 8;\n\t\t\t\t\t\tif (face.uv[1] > face.uv[3] != y_m) code += 16;\n\n\t\t\t\t\t\twriter.WriteUInt8(code);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tOutliner.root.forEach(obj => {\n\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\tprocessGroup(obj);\n\t\t\t\t\t} else if (obj instanceof Cube) {\n\t\t\t\t\t\tprocessCube(obj)\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\twriter.view.setUint16(5, id+1, true);\n\n\t\t\t\tif (Texture.getDefault()) {\n\t\t\t\t\tvar src = Texture.getDefault().getBase64();\n\t\t\t\t} else {\n\t\t\t\t\tvar src = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHklEQVQ4T2P8////fwYKAOOoAQyjYcAwGgYMwyIMACUfP9Eb4ExuAAAAAElFTkSuQmCC'\n\t\t\t\t}\n\t\t\t\tvar array = Uint8Array.from(atob(src), c => c.charCodeAt(0));\n\t\t\t\twriter.WriteUInt32(array.length);\n\t\t\t\twriter.WriteBytes(array);\n\t\t\t\twriter.WriteUInt16(0);\n\n\n\t\t\t\treturn writer.array;\n\t\t\t},\n\t\t\tparse(arraybuffer) {\n\n\t\t\t\tnewProject(Formats.bedrock)\n\n\t\t\t\tvar reader = new BinaryReader(arraybuffer);\n\n\t\t\t\tvar nodes = {};\n\t\t\t\tvar face_info = {};\n\t\t\t\tvar node_data = {};\n\n\t\t\t\treader.ReadUInt8();//asset type\n\t\t\t\treader.ReadUInt16();//format version\n\t\t\t\treader.ReadUInt16();//next unused node id\n\n\t\t\t\tvar node_count = reader.ReadUInt16();\n\t\t\t\tfor (var i = 0; i < node_count; i++) {\n\t\t\t\t\t(function() {\n\t\t\t\t\t\tvar id = reader.ReadUInt16();\n\t\t\t\t\t\tvar parent_id = reader.ReadUInt16();\n\t\t\t\t\t\tvar name = reader.ReadString();\n\t\t\t\t\t\tvar pos = reader.ReadVector3().multiplyScalar(16);\n\t\t\t\t\t\tvar offset = reader.ReadVector3().multiplyScalar(16);\n\t\t\t\t\t\tnode_data[id] = {\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tpos: new THREE.Vector3().copy(pos),\n\t\t\t\t\t\t\toffset: new THREE.Vector3().copy(offset)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar scale = reader.ReadVector3();\n\t\t\t\t\t\tvar rotation = new THREE.Euler().setFromQuaternion(reader.ReadQuaternion(), 'ZYX').toArray();\n\t\t\t\t\t\trotation.forEach((n, i) =>  {\n\t\t\t\t\t\t\trotation[i] = Math.radToDeg(n);\n\t\t\t\t\t\t})\n\t\t\t\t\t\tvar size = [\n\t\t\t\t\t\t\treader.ReadUInt16() * scale.x,\n\t\t\t\t\t\t\treader.ReadUInt16() * scale.y,\n\t\t\t\t\t\t\treader.ReadUInt16() * scale.z\n\t\t\t\t\t\t]\n\t\t\t\t\t\tvar uv_mode = reader.ReadUInt8();\n\t\t\t\t\t\tvar faces = {\n\t\t\t\t\t\t\tsouth: \t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t\tnorth: \t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t\teast: \t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t\tdown: \t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t\twest:\t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t\tup: \t{offset: reader.ReadPoint()},\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfaces.south.transform\t= reader.ReadUInt8();\n\t\t\t\t\t\tfaces.north.transform\t= reader.ReadUInt8();\n\t\t\t\t\t\tfaces.east.transform\t= reader.ReadUInt8();\n\t\t\t\t\t\tfaces.down.transform\t= reader.ReadUInt8();\n\t\t\t\t\t\tfaces.west.transform\t= reader.ReadUInt8();\n\t\t\t\t\t\tfaces.up.transform\t\t= reader.ReadUInt8();\n\n\t\t\t\t\t\tif (nodes[parent_id]) {\n\t\t\t\t\t\t\tpos.add(new THREE.Vector3().fromArray(nodes[parent_id].origin))\n\t\t\t\t\t\t\tpos.add(node_data[parent_id].offset)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar from = [\n\t\t\t\t\t\t\tpos.x + offset.x - size[0]/2,\n\t\t\t\t\t\t\tpos.y + offset.y - size[1]/2,\n\t\t\t\t\t\t\tpos.z + offset.z - size[2]/2,\n\t\t\t\t\t\t]\n\t\t\t\t\t\tvar to = [\n\t\t\t\t\t\t\tfrom[0] + size[0],\n\t\t\t\t\t\t\tfrom[1] + size[1],\n\t\t\t\t\t\t\tfrom[2] + size[2],\n\t\t\t\t\t\t]\n\n\t\t\t\t\t\tvar cube = new Cube({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\torigin: pos.toArray(),\n\t\t\t\t\t\t\tfrom, to,\n\t\t\t\t\t\t\trotation,\n\t\t\t\t\t\t\tbox_uv: false\n\t\t\t\t\t\t}).init();\n\t\t\t\t\t\tnodes[id] = cube;\n\t\t\t\t\t\tface_info[cube.uuid] = faces;\n\t\t\t\t\t\tfaces.scale = scale;\n\t\t\t\t\t\tfaces.cube = cube;\n\n\t\t\t\t\t\tif (nodes[parent_id]) {\n\t\t\t\t\t\t\tvar parent = nodes[parent_id];\n\t\t\t\t\t\t\tif (parent instanceof Cube) {\n\t\t\t\t\t\t\t\tvar parent_cube = parent;\n\t\t\t\t\t\t\t\tparent = nodes[parent_id] = new Group({\n\t\t\t\t\t\t\t\t\tname: parent_cube.name, \n\t\t\t\t\t\t\t\t\torigin: parent_cube.origin,\n\t\t\t\t\t\t\t\t\trotation: parent_cube.rotation\n\t\t\t\t\t\t\t\t}).addTo(parent_cube).init();\n\t\t\t\t\t\t\t\tparent.createUniqueName();\n\t\t\t\t\t\t\t\tparent_cube.addTo(parent);\n\t\t\t\t\t\t\t\tparent_cube.extend({rotation: [0, 0, 0]})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcube.addTo(parent);\n\t\t\t\t\t\t}\n\t\t\t\t\t})()\n\t\t\t\t}\n\n\t\t\t\tvar image = reader.ReadBytes(reader.ReadUInt32());\n\t\t\t\tvar i = 0;\n\t\t\t\tlet txt = '';\n\t\t\t\twhile (i < image.length) {\n\t\t\t\t\tlet sub = image.subarray(i, Math.clamp(i+1024, 0, image.length));\n\t\t\t\t\tlet substr = String.fromCharCode.apply(null, sub);\n\t\t\t\t\ttxt += substr;\n\t\t\t\t\ti += 1024;\n\t\t\t\t}\n\t\t\t\tlet url = 'data:image/png;base64,' + btoa(txt);\n\n\t\t\t\tvar tex = new Texture({name: 'texture'}).fromDataURL(url).add();\n\t\t\t\ttex.load_callback = function() {\n\t\t\t\t\tProject.texture_width = tex.width;\n\t\t\t\t\tProject.texture_height = tex.height;\n\n\t\t\t\t\tProject.box_uv = false;\n\n\t\t\t\t\tfor (var uuid in face_info) {\n\t\t\t\t\t\tvar info = face_info[uuid];\n\t\t\t\t\t\tvar cube = info.cube;\n\t\t\t\t\t\tfor (var face_key in cube.faces) {\n\t\t\t\t\t\t\tvar face = cube.faces[face_key];\n\t\t\t\t\t\t\tface.extend({uv: [\n\t\t\t\t\t\t\t\tinfo[face_key].offset.x,\n\t\t\t\t\t\t\t\tinfo[face_key].offset.y,\n\t\t\t\t\t\t\t\t0,0\n\t\t\t\t\t\t\t]});\n\t\t\t\t\t\t\tvar native_size = getNativeSize(cube, face);\n\n\t\t\t\t\t\t\tif (face.direction == 'south' || face.direction == 'north') {\n\t\t\t\t\t\t\t\tface.uv_size = [\n\t\t\t\t\t\t\t\t\tnative_size[0]/info.scale.x,\n\t\t\t\t\t\t\t\t\tnative_size[1]/info.scale.y\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t} else if (face.direction == 'up' || face.direction == 'down') {\n\t\t\t\t\t\t\t\tface.uv_size = [\n\t\t\t\t\t\t\t\t\tnative_size[0]/info.scale.x,\n\t\t\t\t\t\t\t\t\tnative_size[1]/info.scale.z\n\t\t\t\t\t\t\t\t]\t\t\t\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tface.uv_size = [\n\t\t\t\t\t\t\t\t\tnative_size[0]/info.scale.z,\n\t\t\t\t\t\t\t\t\tnative_size[1]/info.scale.y\n\t\t\t\t\t\t\t\t]\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar code = info[face_key].transform;\n\t\t\t\t\t\t\tif (code >= 16) {\n\t\t\t\t\t\t\t\tvar size = face.uv[3] - face.uv[1];\n\t\t\t\t\t\t\t\tface.uv[3] -= size*2;\n\t\t\t\t\t\t\t\tcode -= 16;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (code >= 8) {\n\t\t\t\t\t\t\t\tvar size = face.uv[2] - face.uv[0];\n\t\t\t\t\t\t\t\tface.uv[2] -= size*2;\n\t\t\t\t\t\t\t\tcode -= 8;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswitch (code) {\n\t\t\t\t\t\t\t\tcase 4: face.rotation = 270; break;\n\t\t\t\t\t\t\t\tcase 2: face.rotation = 180; break;\n\t\t\t\t\t\t\t\tcase 1: face.rotation = 90; break;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tCanvas.updateAll()\n\t\t\t\t}\n\n\t\t\t}\n\t\t})\n\n\t\timport_action = new Action('import_csmodel', {\n\t\t\tname: 'Import CraftStudio Model',\n\t\t\tdescription: '',\n\t\t\ticon: 'star',\n\t\t\tcategory: 'file',\n\t\t\tclick() {\n\t\t\t\tBlockbench.import({\n\t\t\t\t\textensions: ['csmodel'],\n\t\t\t\t\ttype: 'CraftStudio Model',\n\t\t\t\t\treadtype: 'binary',\n\t\t\t\t\tresource_id: 'craftstudio_files'\n\t\t\t\t}, files => {\n\t\t\t\t\tcodec.parse(files[0].content);\n\t\t\t\t\tcsname = files[0].name.replace(\".csmodel\",\"\").replace(/\\s+/g, \"_\").toLowerCase();\n\t\t\t\t\tProject.name = csname;\n\t\t\t\t\tProject.model_identifier = csname;\n\t\t\t\t\tTexture.all.last().name = csname;\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\texport_action = new Action('export_csmodel', {\n\t\t\tname: 'Export CraftStudio Model',\n\t\t\tdescription: '',\n\t\t\ticon: 'star',\n\t\t\tcategory: 'file',\n\t\t\tclick() {\n\t\t\t\tcodec.export();\n\t\t\t}\n\t\t})\n\n\t\tMenuBar.addAction(import_action, 'file.import')\n\t\tMenuBar.addAction(export_action, 'file.export')\n\n\t},\n\tonunload() {\n\t\timport_action.delete();\n\t\texport_action.delete();\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/cube_inverter.js",
    "content": "(async function() {\n        let aboutAction, cubeInverterAction\n        const id = \"cube_inverter\"\n        const name = \"Cube Inverter\"\n        const icon = \"swap_horiz\"\n        const author = \"SirJain\"\n\n        // Used for about dialog\n        const links = {\n                website: \"https://sirjain0.github.io/\",\n                twitter: \"https://twitter.com/SirJain2\",\n                discord: \"https://discord.gg/wM4CKTbFVN\"\n        }\n\n        // Registers plugin data\n        Plugin.register(id, {\n                title: name,\n                icon,\n                author,\n                description: \"Adds a button that inverts selected cube sizes.\",\n                about: \"This plugin adds a button that inverts the size values of each selected cube.\\n## How to use\\nTo use this plugin, go to the toolbar at the top of the screen (the one with the move, resize, and rotation tools) and click the `Invert Cubes` button. If you don't see the button, make sure to select some cubes. The button is also keybinded with a default of `Shift + I`.\\n\\nPlease report any bugs or suggestions you may have.\",\n\t\ttags: [\"Deprecated\"],\n                version: \"1.0.0\",\n                min_version: \"4.2.0\",\n                variant: \"both\",\n                oninstall: () => showAbout(true),\n                onload() {\n                        addAbout()\n\n                        cubeInverterAction = new Action(\"cube_inverter_action\", {\n                                name: \"Invert Cubes\",\n                                icon: icon,\n                                description: \"Invert the values of all axes of selected cubes.\",\n                                keybind: new Keybind({key: 'i', shift: true}),\n                                condition: () => Cube.selected.length,\n                                click: () => invertCubes()\n                        })\n\n                        Toolbars.main_tools.add(cubeInverterAction);\n                },\n                onunload() {\n                        aboutAction.delete()\n                        cubeInverterAction.delete()\n                        MenuBar.removeAction(`help.about_plugins.about_${id}`)\n                        Blockbench.showQuickMessage(\"Uninstalled Cube Inverter plugin\")\n                }\n        })\n\n        function invertCubes() {\n                Undo.initEdit({elements: Cube.selected, outliner: true});\n\n                for (const cube of Cube.selected) {\n\n                        // Handles size dimensions\n                        [cube.from, cube.to] = [cube.to, cube.from]\n\n                        // UV handling\n                        cube.faces.north.uv = cube.faces.south.uv\n                        cube.faces.south.uv = cube.faces.north.uv\n                        cube.faces.north.texture = cube.faces.south.texture \n                        cube.faces.south.texture = cube.faces.north.texture\n                        cube.faces.north.cullface = cube.faces.south.cullface \n                        cube.faces.south.cullface = cube.faces.north.cullface\n                        cube.faces.north.rotation = (cube.faces.north.rotation + 180) % 360\n                        cube.faces.south.rotation = (cube.faces.south.rotation + 180) % 360\n\n                        cube.faces.east.uv = cube.faces.west.uv\n                        cube.faces.west.uv = cube.faces.east.uv\n                        cube.faces.east.texture = cube.faces.west.texture \n                        cube.faces.west.texture = cube.faces.east.texture\n                        cube.faces.east.cullface = cube.faces.west.cullface \n                        cube.faces.west.cullface = cube.faces.east.cullface\n                        cube.faces.east.rotation = (cube.faces.east.rotation + 180) % 360\n                        cube.faces.west.rotation = (cube.faces.west.rotation + 180) % 360\n\n                        cube.faces.up.uv = cube.faces.down.uv\n                        cube.faces.down.uv = cube.faces.up.uv\n                        cube.faces.up.texture = cube.faces.down.texture \n                        cube.faces.down.texture = cube.faces.up.texture\n                        cube.faces.up.cullface = cube.faces.down.cullface \n                        cube.faces.down.cullface = cube.faces.up.cullface\n                        cube.faces.up.rotation = (cube.faces.up.rotation + 180) % 360\n                        cube.faces.down.rotation = (cube.faces.down.rotation + 180) % 360\n                }\n\n                Canvas.updateView({\n                        elements: Cube.selected,\n                        element_aspects: {transform: true, geometry: true},\n                })\n\n                Undo.finishEdit(\"Inverted cube values\", {elements: Cube.selected, outliner: true});\n        }\n\n        function addAbout() {\n                let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\n\n                if (!about) {\n                        about = new Action(\"about_plugins\", {\n                                name: \"About Plugins...\",\n                                icon: \"info\",\n                                children: []\n                        })\n                        MenuBar.addAction(about, \"help\")\n                }\n\n                aboutAction = new Action(`about_${id}`, {\n                        name: `About ${name}...`,\n                        icon,\n                        click: () => showAbout()\n                })\n\n                about.children.push(aboutAction)\n        }\n\n        function showAbout(banner) {\n                const infoBox = new Dialog({\n                        id: \"about\",\n                        title: name,\n                        width: 780,\n                        buttons: [],\n                        lines: [`\n                                <style>\n                                        dialog#about .dialog_title {\n                                                padding-left: 0;\n                                                display: flex;\n                                                align-items: center;\n                                                gap: 10px;\n                                        }\n                                        dialog#about .dialog_content {\n                                                text-align: left!important;\n                                                margin: 0!important;\n                                        }\n                                        dialog#about .socials {\n                                                padding: 0!important;\n                                        }\n                                        dialog#about #banner {\n                                                background-color: var(--color-accent);\n                                                color: var(--color-accent_text);\n                                                width: 100%;\n                                                padding: 0 8px\n                                        }\n                                        dialog#about #content {\n                                                margin: 24px;\n                                        }\n                                </style>\n                                ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\n                                <div id=\"content\">\n                                        <h1 style=\"margin-top:-10px\">${name}</h1>\n                                        <p>Adds a button that inverts selected cube sizes.</p>\n                                        <h4>Worth noting:</h4>\n                                        <p>- The plugin inverts each value of all the cubes selected - Positive to Negative or Negative to Positive.</p>\n                                        <p>- This plugin logically works on cubes - no meshes or other outliner elements.</p>\n                                        <p>- Like all other keybindings, the keybind tied to the 'Invert Cube' action can be changed in the settings.</p>\n                                        <h4>How to use:</h4>\n                                        <p>To use this plugin, press the <b>Invert Cubes</b> button which is located next to the Inflation number in the edit tab.</p>\n                                        <br>\n                                        <div class=\"socials\">\n                                                <a href=\"${links[\"website\"]}\" class=\"open-in-browser\">\n                                                        <i class=\"icon material-icons\" style=\"color:#33E38E\">language</i>\n                                                        <label>Website</label>\n                                                </a>\n                                                <a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\n                                                        <i class=\"icon fab fa-discord\" style=\"color:#727FFF\"></i>\n                                                        <label>Discord Server</label>\n                                                </a>\n                                                <a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\n                                                        <i class=\"fa-brands fa-twitter\" style=\"color:#1DA1F2\"></i>\n                                                        <label>Twitter</label>\n                                                </a>\n                                        </div>\n                                </div>\n                        `]\n                }).show()\n                $(\"dialog#about .dialog_title\").html(`\n                        <i class=\"icon material-icons\">${icon}</i>\n                        ${name}\n                `)\n        }\n})()\n"
  },
  {
    "path": "plugins/custom_marker_colors.js",
    "content": "(async function() {\r\n    let aboutAction, defaultColourFunction\r\n\r\n    const E = s => $(document.createElement(s))\r\n    const defaultMarkerArray = markerColors.map(e => e.id)\r\n    const errorTitle = \"Invalid Marker!\"\r\n    const duplicateIDErrorTitle = \"This ID already exists!\"\r\n    const errorMessage = \"You have made an invalid marker color because you have empty fields. Make sure that you leave no fields blank.\"\r\n    const duplicateIDErrorMessage = \"The ID of your marker color is already taken by a default marker color. Please enter a name which does not have the same ID as the default colors\\n\\nNote: Marker color IDs are derived from your marker color name but lowercase and with `_` instead of spaces.\"\r\n\r\n    const id = \"custom_marker_colors\"\r\n    const name = \"Custom Marker Colors\"\r\n    const icon = \"colorize\"\r\n    const author = \"SirJain and Geode\"\r\n\r\n    // Local Storage\r\n    const customMarkers = JSON.parse(localStorage.getItem(\"customMarkers\") ?? \"{}\")\r\n\r\n    // Used in about dialog\r\n    const links = {\r\n        twitter: \"https://www.twitter.com/SirJain2\",\r\n        twittergeode: \"https://twitter.com/GeodeModels\",\r\n        discord: \"https://discord.gg/wM4CKTbFVN\"\r\n    }\r\n\r\n    Plugin.register(id, {\r\n        title: name,\r\n        icon,\r\n        author,\r\n        description: \"Allows users to add their own marker colors.\",\r\n        about: \"To make a new custom marker, go to <b>Tools > Marker Colors > Add Custom Color</b> to get started with making your own custom marker color. Once you are done, click Confirm. You will now see your marker color in the default color list. And finally, if you ever choose to view or edit your marker colors, you can use <b>Tools > Marker Colors > Manage Marker Colors</b>\",\r\n        tags: [\"Marker Color\", \"Customize\", \"UX\"],\r\n        version: \"1.1.0\",\r\n        min_version: \"4.2.0\",\r\n        variant: \"both\",\r\n        oninstall() {\r\n            showAbout(true)\r\n            Blockbench.showQuickMessage(\"Installed Custom Marker Colors!\", 3000)\r\n        },\r\n        onload() {\r\n            addAboutButton()\r\n\r\n            actions = [\r\n                new Action(\"add_marker_color\", {\r\n                    name: \"Add Marker Color\",\r\n                    description: \"Add a custom marker color\",\r\n                    icon: \"fa-plus\",\r\n                    click: () => createMarkers()\r\n                }),\r\n\r\n                new Action(\"edit_marker_colors\", {\r\n                    name: \"Manage Marker Colors\",\r\n                    description: \"Manage your custom marker colors\",\r\n                    icon: \"settings\",\r\n                    click: () => editMarkers()\r\n                })\r\n            ]\r\n\r\n            // Update list\r\n            for (const [name, hex] of Object.entries(customMarkers)) {\r\n                markerColors.push({\r\n                    id: name.toLowerCase().replace(/ /g, \"_\"),\r\n                    name: name,\r\n                    standard: hex,\r\n                    pastel: hex\r\n                })\r\n            }\r\n\r\n            Canvas.updateMarkerColorMaterials()\r\n            defaultColourFunction = Cube.prototype.menu.structure.find(e => e.name === \"menu.cube.color\").children\r\n\r\n            MenuBar.addAction({\r\n                id: \"marker_colors\",\r\n                name: \"Marker Colors\",\r\n                children: actions,\r\n                icon: icon,\r\n                condition: () => Format?.id != \"image\"\r\n            }, \"tools\")\r\n        },\r\n        onunload() {\r\n            aboutAction.delete()\r\n            Blockbench.showQuickMessage(\"Uninstalled Custom Marker Colors\", 3000)\r\n            MenuBar.removeAction(`help.about_plugins.about_${id}`)\r\n            MenuBar.removeAction(\"tools.marker_colors\")\r\n            Cube.prototype.menu.structure.find(e => e.name === \"menu.cube.color\").children = defaultColourFunction\r\n\r\n            for (const name of Object.keys(customMarkers)) {\r\n                const index = markerColors.indexOf(markerColors.find(e => e.name === name))\r\n                markerColors.splice(index, 1)\r\n                Canvas.emptyMaterials.splice(index, 1)\r\n            }\r\n\r\n            Canvas.updateMarkerColorMaterials()\r\n            localStorage.removeItem(\"customMarkers\")\r\n        }\r\n    })\r\n\r\n    // Function that creates markers\r\n    function createMarkers() {\r\n        const createMarkersDialog = new Blockbench.Dialog({\r\n            id: \"add_custom_marker\",\r\n            title: \"Add Marker Color\",\r\n            buttons: [\"Add Marker\", \"Cancel\"],\r\n            lines: [`\r\n                <style>\r\n                    input#id {\r\n                        text-transform: lowercase;\r\n                    }\r\n                </style>\r\n            `],\r\n            form: {\r\n                name: {\r\n                    label: \"Enter Name\",\r\n                    type: \"text\",\r\n                    value: \"\"\r\n                },\r\n                color: {\r\n                    label: \"Choose Color\",\r\n                    type: \"color\",\r\n                    value: \"#6E6E6E\"\r\n                }\r\n            },\r\n            onConfirm(formData) {\r\n                const hexStr = formData.color.toHexString();\r\n                const rawID = formData.name;\r\n                const FormID = rawID.toLowerCase().replace(/ /g, \"_\");\r\n\r\n                // case 1 - ID and name are not blank\r\n                if ((FormID && formData.name) && !(defaultMarkerArray.includes(FormID))) {\r\n                    Blockbench.showQuickMessage(`Added marker color \"${formData.name}\"`, 3000)\r\n\r\n                    // update marker colors\r\n                    markerColors.push({\r\n                        id: FormID,\r\n                        name: formData.name,\r\n                        standard: hexStr,\r\n                        pastel: hexStr\r\n                    })\r\n\r\n                    // update local storage\r\n                    customMarkers[formData.name] = hexStr\r\n                    localStorage.setItem(\"customMarkers\", JSON.stringify(customMarkers))\r\n\r\n                    Canvas.updateMarkerColorMaterials()\r\n                }\r\n\r\n                // case 2 - Duplicate ID\r\n                if (defaultMarkerArray.includes(FormID)) {\r\n                    Blockbench.showMessageBox({\r\n                        title: duplicateIDErrorTitle,\r\n                        message: duplicateIDErrorMessage\r\n                    })\r\n                }\r\n\r\n                // case 3 - ID and name are blank\r\n                if (FormID === \"\" || formData.name === \"\") {\r\n                    Blockbench.showMessageBox({\r\n                        title: errorTitle,\r\n                        message: errorMessage\r\n                    })\r\n                }\r\n            },\r\n            onCancel: () => createMarkersDialog.hide()\r\n        }).show()\r\n    }\r\n\r\n    function editMarkers() {\r\n        const editMarkersDialog = new Dialog({\r\n            id: \"edit_marker_colors_dialog\",\r\n            title: \"Manage Marker Colors\",\r\n            buttons: [],\r\n            lines: [`\r\n                <style>\r\n                    dialog#edit_marker_colors_dialog #marker-colors {\r\n                        display: flex;\r\n                        flex-direction: column;\r\n                        gap: 10px;\r\n                        padding-bottom: 20px;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .dialog_wrapper {\r\n                        position: relative;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .marker-color {\r\n                        display: flex;\r\n                        gap: 10px;\r\n                        align-items: center;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .marker-color-display {\r\n                        width: 24px;\r\n                        height: 24px;\r\n                        border-radius: 5px;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .marker-color-hex {\r\n                        color: grey;\r\n                        font-size: 14px;\r\n                        padding: 3px 0;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .marker-color-name {\r\n                        font-weight: bold;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .marker-color-remove {\r\n                        padding: 2px 0;\r\n                        display: flex;\r\n                        align-items: center;\r\n                        cursor: pointer;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .spacer {\r\n                        flex: 1;\r\n                        height: 2px;\r\n                        background-color: var(--color-button);\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog #delete_warning {\r\n                        position: absolute;\r\n                        top: 30;\r\n                        left: 0;\r\n                        right: 0;\r\n                        bottom: 0;\r\n                        display: flex;\r\n                        justify-content: center;\r\n                        align-items: center;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog #delete_warning_darken {\r\n                        position: absolute;\r\n                        width: 100%;\r\n                        height: 100%;\r\n                        background-color: var(--color-dark);\r\n                        opacity: 0.9;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog #delete_warning_container {\r\n                        z-index: 1;\r\n                        display: flex;\r\n                        gap: 24px;\r\n                        flex-direction: column;\r\n                        align-items: center;\r\n                        filter: drop-shadow(0 0 10px var(--color-dark))\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog #delete_warning_container h2 {\r\n                        text-align: center;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog #delete_warning_buttons {\r\n                        display: flex;\r\n                        gap: 24px;\r\n                    }\r\n\r\n                    dialog#edit_marker_colors_dialog .danger-button:hover {\r\n                        background-color: var(--color-close);\r\n                        color: var(--color-text)!important;\r\n                    }\r\n                </style>\r\n                <div id=\"marker-colors\"></div>\r\n            `],\r\n            component: {\r\n                template: `\r\n                    <div>\r\n                        <div style=\"display:flex;gap:8px\">\r\n                            <button @click=\"create()\">Add New Color</button>\r\n                            <button @click=\"exportMarkers()\">Export Marker Colors</button>\r\n                            <span style=\"flex-grow:1\"></span>\r\n                            <button @click=\"close()\">Close</button>\r\n                        </div>\r\n                    </div>\r\n                `,\r\n                methods: {\r\n                    create: () => createMarkers(),\r\n                    exportMarkers: () => exportMarkerColors(),\r\n                    close: () => editMarkersDialog.close()\r\n                }\r\n            },\r\n        }).show()\r\n        const container = $(\"dialog#edit_marker_colors_dialog #marker-colors\")\r\n\r\n        // Iterate through marker colors and display them in dialog\r\n        for (const color of markerColors) {\r\n            if (defaultMarkerArray.includes(color.id)) continue;\r\n            let deleteWarningContainer\r\n            const name = tl(`cube.color.${color.id}`)\r\n\r\n            const markerDisplay = E(\"div\").addClass(\"marker-color\").append(\r\n                E(\"div\").addClass(\"marker-color-display\").css(\"background-color\", color.standard),\r\n                E(\"div\").addClass(\"marker-color-name\").text(color.name),\r\n                E(\"div\").addClass(\"marker-color-hex\").text(color.standard),\r\n                E(\"div\").addClass(\"spacer\"),\r\n                E(\"i\").addClass(\"marker-color-remove material-icons icon tool\").attr(\"title\", \"Delete marker\").text(\"delete\").on(\"click\", e => {\r\n                    $(\"dialog#edit_marker_colors_dialog .dialog_wrapper\").append(\r\n                        deleteWarningContainer = E(\"div\").attr(\"id\", \"delete_warning\").append(\r\n                            E(\"div\").attr(\"id\", \"delete_warning_darken\"),\r\n                            E(\"div\").attr(\"id\", \"delete_warning_container\").append(\r\n                                E(\"h2\").html(`Are you sure you want to delete marker color <br><strong>${color.name}</strong>?<br><p>This action cannot be undone!</p>`),\r\n                                E(\"div\").attr(\"id\", \"delete_warning_buttons\").append(\r\n                                    E(\"button\").text(\"Cancel\").on(\"click\", e => $(\"dialog#edit_marker_colors_dialog #delete_warning\").remove()),\r\n                                    E(\"button\").addClass(\"danger-button\").text(\"Delete\").on(\"click\", e => {\r\n                                        Blockbench.showQuickMessage(`Removed \"${color.name}\" marker`, 3000)\r\n                                        const index = markerColors.indexOf(color)\r\n                                        markerColors.splice(index, 1)\r\n                                        Canvas.emptyMaterials.splice(index, 1)\r\n                                        markerDisplay.remove()\r\n\r\n                                        // Edit local storage\r\n                                        delete customMarkers[color.name]\r\n                                        localStorage.setItem(\"customMarkers\", JSON.stringify(customMarkers))\r\n\r\n                                        deleteWarningContainer.hide()\r\n                                    })\r\n                                )\r\n                            )\r\n                        )\r\n                    )\r\n                })\r\n            ).appendTo(container)\r\n        }\r\n        if (!container.children().length) container.append(\r\n            E(\"p\").text(\"No custom marker colors. Please add a new custom marker color before trying to edit them.\")\r\n        )\r\n    }\r\n\r\n    function exportMarkerColors() {\r\n        if (localStorage.getItem(\"customMarkers\")) {\r\n            Blockbench.export({\r\n                resource_id: 'custom_marker_colors',\r\n                type: 'JSON File',\r\n                extensions: ['json'],\r\n                name: 'custom_marker_colors',\r\n                content: getMarkerColorString(),\r\n                savetype: 'json'\r\n            });\r\n        } else {\r\n            Blockbench.showQuickMessage(\"Nothing to export!\")\r\n        }\r\n    }\r\n\r\n    function getMarkerColorString() {\r\n        return localStorage.getItem(\"customMarkers\")\r\n    }\r\n\r\n    function addAboutButton() {\r\n        let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\r\n        if (!about) {\r\n            about = new Action(\"about_plugins\", {\r\n                name: \"About Plugins...\",\r\n                icon: \"info\",\r\n                children: []\r\n            })\r\n            MenuBar.addAction(about, \"help\")\r\n        }\r\n        aboutAction = new Action(`about_${id}`, {\r\n            name: `About ${name}...`,\r\n            icon,\r\n            click: () => showAbout()\r\n        })\r\n        about.children.push(aboutAction)\r\n    }\r\n\r\n    function showAbout(banner) {\r\n        const infoBox = new Dialog({\r\n            id: \"about\",\r\n            title: name,\r\n            width: 780,\r\n            buttons: [],\r\n            lines: [`\r\n                <li></li>\r\n                <style>\r\n                    dialog#about .dialog_title {\r\n                        padding-left: 0;\r\n                        display: flex;\r\n                        align-items: center;\r\n                        gap: 10px;\r\n                    }\r\n\r\n                    dialog#about .dialog_content {\r\n                        text-align: left!important;\r\n                        margin: 0!important;\r\n                    }\r\n\r\n                    dialog#about .socials {\r\n                        padding: 0!important;\r\n                    }\r\n\r\n                    dialog#about #banner {\r\n                        background-color: var(--color-accent);\r\n                        color: var(--color-accent_text);\r\n                        width: 100%;\r\n                        padding: 0 8px\r\n                    }\r\n\r\n                    dialog#about #content {\r\n                        margin: 24px;\r\n                    }\r\n                </style>\r\n                ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\r\n                <div id=\"content\">\r\n                    <h1 style=\"margin-top:-10px\">${name}</h1>\r\n                    <p>Allows users to add their own marker colors.</p>\r\n                    <h4>Worth noting:</h4>\r\n                    <p>- Currently, the only way to get rid of your custom markers altogether is to uninstall the plugin and restart Blockbench.</p>\r\n                    <p>- You can use these marker colors for meshes and keyframes too!\r\n                    <h4>How to use:</h4>\r\n                    <p>To make a new custom marker, go to <b>Tools > Marker Colors > Add Custom Color</b> to get started with making your own custom marker color. Once you are done, click Confirm. You will now see your marker color in the default color list. And finally, if you ever choose to view or edit your marker colors, you can use <b>Tools > Marker Colors > Manage Marker Colors</b>.</p>\r\n                    <p>Please report any bugs or suggestions you may have to make this plugin more enjoyable for everyone.</p>\r\n                    <br>\r\n                    <div class=\"socials\">\r\n                        <a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\r\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#00acee\"></i>\r\n                            <label>SirJain</label>\r\n                        </a>\r\n                        <a href=\"${links[\"twittergeode\"]}\" class=\"open-in-browser\">\r\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#00acee\"></i>\r\n                            <label>Geode</label>\r\n                        </a>\r\n                        <a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\r\n                            <i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\r\n                            <label>Discord Server</label>\r\n                        </a>\r\n                    </div>\r\n                </div>\r\n            `]\r\n        }).show()\r\n        $(\"dialog#about .dialog_title\").html(`\r\n            <i class=\"icon material-icons\">${icon}</i>\r\n            ${name}\r\n        `)\r\n    }\r\n})()\r\n"
  },
  {
    "path": "plugins/datagen_export.js",
    "content": "(function () {\n  var codec = new Codec(\"datagen\", {\n    name: \"Datagen\",\n    remember: true,\n    extension: \"java\",\n    compile(options) {\n      if (options === undefined) options = {};\n      let clear_elements = [];\n      let textures_used = [];\n      let overflow_cubes = [];\n\n      function computeCube(s) {\n        if (s.export == false) return;\n        //Create Element\n        let text = \".element()\";\n        let element = {};\n        element.from = s.from.slice();\n        element.to = s.to.slice();\n        if (s.inflate) {\n          for (let i = 0; i < 3; i++) {\n            element.from[i] -= s.inflate;\n            element.to[i] += s.inflate;\n          }\n        }\n        text += `.from(${element.from[0]}F, ${element.from[1]}F, ${element.from[2]}F)`;\n        text += `.to(${element.to[0]}F, ${element.to[1]}F, ${element.to[2]}F)`;\n        if (s.shade === false) {\n          text += `.shade(false)`;\n        }\n\n        let nonOrigin = !s.rotation.allEqual(0) || !s.origin.allEqual(8);\n        let axis = (nonOrigin ? s.rotationAxis() : s.rotation_axis) || \"y\";\n        text += `.rotation().angle(${\n          nonOrigin ? getAxisNumber(axis) : 0\n        }F).axis(Axis.${axis.toUpperCase()}).origin(${s.origin[0]}F, ${\n          s.origin[1]\n        }F, ${s.origin[2]}F)`;\n        if (s.rescale) {\n          text += `.rescale(true)`;\n        }\n        text += `.end()`;\n\n        let faces = \"\";\n        for (let face in s.faces) {\n          if (s.faces.hasOwnProperty(face)) {\n            if (s.faces[face].texture !== null) {\n              faces += `.face(Direction.${face.toUpperCase()})`;\n              if (s.faces[face].enabled !== false) {\n                let temp = {};\n                temp.uv = s.faces[face].uv.slice();\n                temp.uv.forEach((n, i) => {\n                  temp.uv[i] = (n * 16) / UVEditor.getResolution(i % 2);\n                });\n                faces += `.uvs(${temp.uv[0]}F, ${temp.uv[1]}F, ${temp.uv[2]}F, ${temp.uv[3]}F)`;\n              }\n              if (s.faces[face].rotation) {\n                let rotString = \"\";\n                switch (s.faces[face].rotation) {\n                  case 0:\n                    rotString = \"ZERO\";\n                    break;\n                  case 90:\n                    rotString = \"CLOCKWISE_90\";\n                    break;\n                  case 180:\n                    rotString = \"UPSIDE_DOWN\";\n                    break;\n                  case 270:\n                    rotString = \"COUNTERCLOCKWISE_90\";\n                    break;\n                  default:\n                    rotString = \"ZERO\";\n                    break;\n                }\n                faces += `.rotation(FaceRotation.${rotString})`;\n              }\n\n              if (s.faces[face].texture) {\n                let tex = s.faces[face].getTexture();\n                let texOut = \"\";\n                if (tex) {\n                  texOut = \"#\" + tex.id;\n                  textures_used.safePush(tex);\n                } else {\n                  texOut = \"#missing\";\n                }\n                faces += `.texture(\"${texOut}\")`;\n              }\n\n              if (s.faces[face].cullface) {\n                faces += `.cullface(Direction.${s.faces[\n                  face\n                ].cullface.toUpperCase()})`;\n              }\n              if (s.faces[face].tint >= 0) {\n                faces += `.tintindex(${s.faces[face].tint})`;\n              }\n              faces += `.end()`;\n            }\n          }\n        }\n        text += faces;\n        text += `.end()`;\n\n        function inVd(n) {\n          return n < -16 || n > 32;\n        }\n        if (\n          inVd(element.from[0]) ||\n          inVd(element.from[1]) ||\n          inVd(element.from[2]) ||\n          inVd(element.to[0]) ||\n          inVd(element.to[1]) ||\n          inVd(element.to[2])\n        ) {\n          overflow_cubes.push(s);\n        }\n        if (Object.keys(s.faces).length) {\n          clear_elements.push(text);\n        }\n      }\n      function iterate(arr) {\n        let i = 0;\n        if (!arr || !arr.length) {\n          return;\n        }\n        for (i = 0; i < arr.length; i++) {\n          if (arr[i].type === \"cube\") {\n            computeCube(arr[i]);\n          } else if (arr[i].type === \"group\") {\n            iterate(arr[i].children);\n          }\n        }\n      }\n      iterate(Outliner.root);\n\n      function checkExport(key, condition) {\n        key = options[key];\n        if (key === undefined) {\n          return condition;\n        } else {\n          return key;\n        }\n      }\n      let isTexturesOnlyModel =\n        clear_elements.length === 0 &&\n        checkExport(\"parent\", Project.parent != \"\");\n      let texturesObj = {};\n      textures.forEach(function (t, i) {\n        let link = t.javaTextureLink();\n        if (t.particle) {\n          texturesObj.particle = link;\n        }\n        if (!textures_used.includes(t) && !isTexturesOnlyModel) return;\n        if (t.id !== link.replace(/^#/, \"\")) {\n          texturesObj[t.id] = link;\n        }\n      });\n\n      if (\n        options.prevent_dialog !== true &&\n        overflow_cubes.length > 0 &&\n        settings.dialog_larger_cubes.value\n      ) {\n        Blockbench.showMessageBox(\n          {\n            translateKey: \"model_clipping\",\n            icon: \"settings_overscan\",\n            message: tl(\"message.model_clipping.message\", [\n              overflow_cubes.length,\n            ]),\n            buttons: [\"dialog.scale.select_overflow\", \"dialog.ok\"],\n            confirm: 1,\n            cancel: 1,\n          },\n          (result) => {\n            if (result == 0) {\n              selected.splice(0, Infinity, ...overflow_cubes);\n              updateSelection();\n            }\n          }\n        );\n      }\n      if (\n        options.prevent_dialog !== true &&\n        clear_elements.length &&\n        [\"item/generated\", \"item/handheld\"].includes(Project.parent)\n      ) {\n        Blockbench.showMessageBox({\n          translateKey: \"invalid_builtin_parent\",\n          icon: \"info\",\n          message: tl(\"message.invalid_builtin_parent.message\", [\n            Project.parent,\n          ]),\n        });\n        Project.parent = \"\";\n      }\n\n      let text = `this.models()`;\n      if (checkExport(\"parent\", Project.parent != \"\")) {\n        text += `.withExistingParent(\"blockbench_export\", \"${Project.parent.replace(\n          \" \",\n          \"\"\n        )}\")`;\n      } else {\n        text += `.getBuilder(\"blockbench_export\")`;\n      }\n      if (checkExport(\"ambientocclusion\", Project.ambientocclusion === false)) {\n        text += \".ao(false)\";\n      }\n      if (checkExport(\"textures\", Object.keys(texturesObj).length >= 1)) {\n        for (let texture of Object.keys(texturesObj)) {\n          text += `.texture(\"${texture}\", new ResourceLocation(\"${texturesObj[texture]}\"))`;\n        }\n      }\n      if (checkExport(\"elements\", clear_elements.length >= 1)) {\n        for (let element of clear_elements) {\n          text += element;\n        }\n      }\n      if (checkExport(\"front_gui_light\", Project.front_gui_light)) {\n        text += \".guiLight(GuiLight.FRONT)\";\n      }\n      if (checkExport(\"display\", Object.keys(display).length >= 1)) {\n        let new_display = {};\n        let entries = 0;\n        for (let i in DisplayMode.slots) {\n          let key = DisplayMode.slots[i];\n          if (\n            DisplayMode.slots.hasOwnProperty(i) &&\n            display[key] &&\n            display[key].export\n          ) {\n            new_display[key] = display[key].export();\n            entries++;\n          }\n        }\n        if (entries) {\n          for (let key of Object.keys(new_display)) {\n            let val = new_display[key];\n            text += `.transform(Perspective.${key\n              .toUpperCase()\n              .replace(/PERSON/g, \"_PERSON\")\n              .replace(/HAND/g, \"_HAND\")})`;\n            if (val.rotation) {\n              text += `.rotation(${val.rotation[0]}F, ${val.rotation[1]}F, ${val.rotation[2]}F)`;\n            }\n            if (val.translation) {\n              text += `.translation(${val.translation[0]}F, ${val.translation[1]}F, ${val.translation[2]}F)`;\n            }\n            if (val.scale) {\n              text += `.scale(${val.scale[0]}F, ${val.scale[1]}F, ${val.scale[2]}F)`;\n            }\n            text += `.end()`;\n          }\n        }\n      }\n      this.dispatchEvent(\"compile\", { model: text, options });\n      return text;\n    },\n  });\n  Plugin.register(\"datagen_export\", {\n    title: \"Datagen Exporter\",\n    icon: \"code\",\n    author: \"itsmeow\",\n    description: \"Allows exporting to BlockStateProvider datagen code\",\n    version: \"1.0.0\",\n    variant: \"both\",\n    onload() {\n      let action = new Action({\n        id: \"export_datagen\",\n        name: \"Export Datagen Code\",\n        icon: \"code\",\n        description: \"Exports a model to BlockStateProvider datagen code.\",\n        category: \"file\",\n        condition: (_) => Format.id === \"java_block\",\n        click: () => {\n          codec.export();\n        },\n      });\n      MenuBar.addAction(action, \"file.export\");\n    },\n    onunload() {\n      action.delete();\n    },\n  });\n})();\n"
  },
  {
    "path": "plugins/discord-rpc.js",
    "content": "! function(e) {\n    var t = {};\n\n    function n(i) {\n        if (t[i]) return t[i].exports;\n        var s = t[i] = {\n            i: i,\n            l: !1,\n            exports: {}\n        };\n        return e[i].call(s.exports, s, s.exports, n), s.l = !0, s.exports\n    }\n    n.m = e, n.c = t, n.d = function(e, t, i) {\n        n.o(e, t) || Object.defineProperty(e, t, {\n            enumerable: !0,\n            get: i\n        })\n    }, n.r = function(e) {\n        \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n            value: \"Module\"\n        }), Object.defineProperty(e, \"__esModule\", {\n            value: !0\n        })\n    }, n.t = function(e, t) {\n        if (1 & t && (e = n(e)), 8 & t) return e;\n        if (4 & t && \"object\" == typeof e && e && e.__esModule) return e;\n        var i = Object.create(null);\n        if (n.r(i), Object.defineProperty(i, \"default\", {\n                enumerable: !0,\n                value: e\n            }), 2 & t && \"string\" != typeof e)\n            for (var s in e) n.d(i, s, function(t) {\n                return e[t]\n            }.bind(null, s));\n        return i\n    }, n.n = function(e) {\n        var t = e && e.__esModule ? function() {\n            return e.default\n        } : function() {\n            return e\n        };\n        return n.d(t, \"a\", t), t\n    }, n.o = function(e, t) {\n        return Object.prototype.hasOwnProperty.call(e, t)\n    }, n.p = \"/\", n(n.s = 4)\n}([function(e, t, n) {\n    \"use strict\";\n    let i;\n    try {\n        const {\n            app: e\n        } = n(6);\n        i = e.setAsDefaultProtocolClient.bind(e)\n    } catch (e) {\n        try {\n            i = n(7)\n        } catch (e) {}\n    }\n    \"function\" != typeof i && (i = () => !1);\n    e.exports = {\n        pid: function() {\n            return \"undefined\" != typeof process ? process.pid : require('process')?.pid\n        },\n        register: i,\n        uuid: () => {\n            let e = \"\";\n            for (let t = 0; t < 32; t += 1) {\n                let n;\n                if (8 !== t && 12 !== t && 16 !== t && 20 !== t || (e += \"-\"), 12 === t) n = 4;\n                else {\n                    const e = 16 * Math.random() | 0;\n                    n = 16 === t ? 3 & e | 0 : e\n                }\n                e += n.toString(16)\n            }\n            return e\n        }\n    }\n}, function(e, t) {\n    e.exports = require(\"events\")\n}, function(e, t, n) {\n    \"use strict\";\n    var i = function() {\n        if (\"undefined\" != typeof self) return self;\n        if (\"undefined\" != typeof window) return window;\n        if (void 0 !== i) return i;\n        throw new Error(\"unable to locate global object\")\n    }();\n    e.exports = t = i.fetch, t.default = i.fetch.bind(i), t.Headers = i.Headers, t.Request = i.Request, t.Response = i.Response\n}, function(e, t, n) {\n    \"use strict\";\n\n    function i(e) {\n        const t = {};\n        for (const n of e) t[n] = n;\n        return t\n    }\n    t.browser = \"undefined\" != typeof window, t.RPCCommands = i([\"DISPATCH\", \"AUTHORIZE\", \"AUTHENTICATE\", \"GET_GUILD\", \"GET_GUILDS\", \"GET_CHANNEL\", \"GET_CHANNELS\", \"GET_RELATIONSHIPS\", \"GET_USER\", \"SUBSCRIBE\", \"UNSUBSCRIBE\", \"SET_USER_VOICE_SETTINGS\", \"SET_USER_VOICE_SETTINGS_2\", \"SELECT_VOICE_CHANNEL\", \"GET_SELECTED_VOICE_CHANNEL\", \"SELECT_TEXT_CHANNEL\", \"GET_VOICE_SETTINGS\", \"SET_VOICE_SETTINGS_2\", \"SET_VOICE_SETTINGS\", \"CAPTURE_SHORTCUT\", \"SET_ACTIVITY\", \"SEND_ACTIVITY_JOIN_INVITE\", \"CLOSE_ACTIVITY_JOIN_REQUEST\", \"ACTIVITY_INVITE_USER\", \"ACCEPT_ACTIVITY_INVITE\", \"INVITE_BROWSER\", \"DEEP_LINK\", \"CONNECTIONS_CALLBACK\", \"BRAINTREE_POPUP_BRIDGE_CALLBACK\", \"GIFT_CODE_BROWSER\", \"OVERLAY\", \"BROWSER_HANDOFF\", \"SET_CERTIFIED_DEVICES\", \"GET_IMAGE\", \"CREATE_LOBBY\", \"UPDATE_LOBBY\", \"DELETE_LOBBY\", \"UPDATE_LOBBY_MEMBER\", \"CONNECT_TO_LOBBY\", \"DISCONNECT_FROM_LOBBY\", \"SEND_TO_LOBBY\", \"SEARCH_LOBBIES\", \"CONNECT_TO_LOBBY_VOICE\", \"DISCONNECT_FROM_LOBBY_VOICE\", \"SET_OVERLAY_LOCKED\", \"OPEN_OVERLAY_ACTIVITY_INVITE\", \"OPEN_OVERLAY_GUILD_INVITE\", \"OPEN_OVERLAY_VOICE_SETTINGS\", \"VALIDATE_APPLICATION\", \"GET_ENTITLEMENT_TICKET\", \"GET_APPLICATION_TICKET\", \"START_PURCHASE\", \"GET_SKUS\", \"GET_ENTITLEMENTS\", \"GET_NETWORKING_CONFIG\", \"NETWORKING_SYSTEM_METRICS\", \"NETWORKING_PEER_METRICS\", \"NETWORKING_CREATE_TOKEN\", \"SET_USER_ACHIEVEMENT\", \"GET_USER_ACHIEVEMENTS\"]), t.RPCEvents = i([\"CURRENT_USER_UPDATE\", \"GUILD_STATUS\", \"GUILD_CREATE\", \"CHANNEL_CREATE\", \"RELATIONSHIP_UPDATE\", \"VOICE_CHANNEL_SELECT\", \"VOICE_STATE_CREATE\", \"VOICE_STATE_DELETE\", \"VOICE_STATE_UPDATE\", \"VOICE_SETTINGS_UPDATE\", \"VOICE_SETTINGS_UPDATE_2\", \"VOICE_CONNECTION_STATUS\", \"SPEAKING_START\", \"SPEAKING_STOP\", \"GAME_JOIN\", \"GAME_SPECTATE\", \"ACTIVITY_JOIN\", \"ACTIVITY_JOIN_REQUEST\", \"ACTIVITY_SPECTATE\", \"ACTIVITY_INVITE\", \"NOTIFICATION_CREATE\", \"MESSAGE_CREATE\", \"MESSAGE_UPDATE\", \"MESSAGE_DELETE\", \"LOBBY_DELETE\", \"LOBBY_UPDATE\", \"LOBBY_MEMBER_CONNECT\", \"LOBBY_MEMBER_DISCONNECT\", \"LOBBY_MEMBER_UPDATE\", \"LOBBY_MESSAGE\", \"CAPTURE_SHORTCUT_CHANGE\", \"OVERLAY\", \"OVERLAY_UPDATE\", \"ENTITLEMENT_CREATE\", \"ENTITLEMENT_DELETE\", \"USER_ACHIEVEMENT_UPDATE\", \"READY\", \"ERROR\"]), t.RPCErrors = {\n        CAPTURE_SHORTCUT_ALREADY_LISTENING: 5004,\n        GET_GUILD_TIMED_OUT: 5002,\n        INVALID_ACTIVITY_JOIN_REQUEST: 4012,\n        INVALID_ACTIVITY_SECRET: 5005,\n        INVALID_CHANNEL: 4005,\n        INVALID_CLIENTID: 4007,\n        INVALID_COMMAND: 4002,\n        INVALID_ENTITLEMENT: 4015,\n        INVALID_EVENT: 4004,\n        INVALID_GIFT_CODE: 4016,\n        INVALID_GUILD: 4003,\n        INVALID_INVITE: 4011,\n        INVALID_LOBBY: 4013,\n        INVALID_LOBBY_SECRET: 4014,\n        INVALID_ORIGIN: 4008,\n        INVALID_PAYLOAD: 4e3,\n        INVALID_PERMISSIONS: 4006,\n        INVALID_TOKEN: 4009,\n        INVALID_USER: 4010,\n        LOBBY_FULL: 5007,\n        NO_ELIGIBLE_ACTIVITY: 5006,\n        OAUTH2_ERROR: 5e3,\n        PURCHASE_CANCELED: 5008,\n        PURCHASE_ERROR: 5009,\n        RATE_LIMITED: 5011,\n        SELECT_CHANNEL_TIMED_OUT: 5001,\n        SELECT_VOICE_FORCE_REQUIRED: 5003,\n        SERVICE_UNAVAILABLE: 1001,\n        TRANSACTION_ABORTED: 1002,\n        UNAUTHORIZED_FOR_ACHIEVEMENT: 5010,\n        UNKNOWN_ERROR: 1e3\n    }, t.RPCCloseCodes = {\n        CLOSE_NORMAL: 1e3,\n        CLOSE_UNSUPPORTED: 1003,\n        CLOSE_ABNORMAL: 1006,\n        INVALID_CLIENTID: 4e3,\n        INVALID_ORIGIN: 4001,\n        RATELIMITED: 4002,\n        TOKEN_REVOKED: 4003,\n        INVALID_VERSION: 4004,\n        INVALID_ENCODING: 4005\n    }, t.LobbyTypes = {\n        PRIVATE: 1,\n        PUBLIC: 2\n    }, t.RelationshipTypes = {\n        NONE: 0,\n        FRIEND: 1,\n        BLOCKED: 2,\n        PENDING_INCOMING: 3,\n        PENDING_OUTGOING: 4,\n        IMPLICIT: 5\n    }\n}, function(e, t, n) {\n    const i = n(5),\n        s = new i.Client({\n            transport: \"ipc\"\n        });\n    var o = new Date;\n    ! function() {\n        let e, t, n = !0,\n            i = \"\";\n        Plugin.register(\"discord-rpc\", {\n            title: \"Discord RPC\",\n            author: \"strajabot, Kastle, & simplyme\",\n            icon: \"announcement\",\n            version: \"1.1.4\",\n            description: \"Show a rich presence status in Discord\",\n            variant: \"desktop\",\n            onload() {\n                async function r() {\n                    if (!s) return;\n                    i !== Project.name && (i = Project.name, o = new Date);\n                    var e = Settings.get(\"obfuscaterpc\") ? \"Unknown Model\" : i + \".bbmodel\";\n                    const t = {\n                            edit: \"Editing\",\n                            paint: \"Painting\",\n                            animate: \"Animating\",\n                            pose: \"Posing\"\n                        } [Modes.selected.id] || \"Making\",\n                        n = {\n                            free: \"a Generic Model\",\n                            java_block: \"a Java Block/Item\",\n                            bedrock: \"a Bedrock Model\",\n                            bedrock_block: \"a Bedrock Block Model\",\n                            bedrock_old: \"a Bedrock Legacy Model\",\n                            modded_entity: \"a Modded Entity\",\n                            optifine_entity: \"an OptiFine Entity\",\n                            optifine_part: \"an OptiFine Part\",\n                            skin: \"a Skin\",\n                        } [Format.id] || \"a \" + Format.name;\n                    s.setActivity({\n                        largeImageKey: \"icon\",\n                        largeImageText: \"Blockbench \" + Blockbench.version,\n                        smallImageKey: \"\" + Format.id,\n                        details: `${t} ${n}`,\n                        state: \"\" + e,\n                        startTimestamp: o,\n                        instance: !1\n                    })\n                }\n                e = new Setting(\"obfuscaterpc\", {\n                    value: !0,\n                    name: \"Hide Project Name in Discord\",\n                    description: \"Display \\\"Unknown Model\\\" instead of revealing the project name in Discord activity\"\n                });\n                const c = Modes.options;\n                Object.keys(c).forEach(e => {\n                    const t = Modes.options[e];\n                    if (t.onSelect && \"function\" == typeof t.onSelect) {\n                        let e = t.onSelect;\n                        t.onSelect = () => {\n                            e.apply(this, arguments), n && r()\n                        }\n                    }\n                }), s.on(\"ready\", () => {\n                    r(), t = setInterval(() => {\n                        r()\n                    }, 15e3)\n                }), s.login({\n                    clientId: \"642126871177199617\"\n                }).catch(console.error)\n            },\n            onunload() {\n                n = !1, e.delete(), clearInterval(t)\n            }\n        })\n    }()\n}, function(e, t, n) {\n    \"use strict\";\n    const i = n(0);\n    e.exports = {\n        Client: n(8),\n        register: e => i.register(\"discord-\" + e)\n    }\n}, function(e, t) {\n    if (\"undefined\" == typeof electron) {\n        var n = new Error(\"Cannot find module 'electron'\");\n        throw n.code = \"MODULE_NOT_FOUND\", n\n    }\n    e.exports = electron\n}, function(e, t) {}, function(e, t, n) {\n    \"use strict\";\n    const i = n(1),\n        {\n            setTimeout: s,\n            clearTimeout: o\n        } = n(9),\n        r = n(2),\n        c = n(10),\n        {\n            RPCCommands: a,\n            RPCEvents: E,\n            RelationshipTypes: _\n        } = n(3),\n        {\n            pid: u,\n            uuid: T\n        } = n(0);\n\n    function d(e, t) {\n        return `${e}${JSON.stringify(t)}`\n    }\n    e.exports = class extends i {\n        constructor(e = {}) {\n            super(), this.options = e, this.accessToken = null, this.clientId = null, this.application = null, this.user = null;\n            const t = c[e.transport];\n            if (!t) throw new TypeError(\"RPC_INVALID_TRANSPORT\", e.transport);\n            this.fetch = (e, t, {\n                data: n,\n                query: i\n            } = {}) => r(`${this.fetch.endpoint}${t}${i?new URLSearchParams(i):\"\"}`, {\n                method: e,\n                body: n,\n                headers: {\n                    Authorization: \"Bearer \" + this.accessToken\n                }\n            }).then(e => e.json()), this.fetch.endpoint = \"https://discord.com/api\", this.transport = new t(this), this.transport.on(\"message\", this._onRpcMessage.bind(this)), this._expecting = new Map, this._subscriptions = new Map, this._connectPromise = void 0\n        }\n        connect(e) {\n            return this._connectPromise || (this._connectPromise = new Promise((t, n) => {\n                this.clientId = e;\n                const i = s(() => n(new Error(\"RPC_CONNECTION_TIMEOUT\")), 1e4);\n                i.unref(), this.once(\"connected\", () => {\n                    o(i), t(this)\n                }), this.transport.once(\"close\", () => {\n                    this._expecting.forEach(e => {\n                        e.reject(new Error(\"connection closed\"))\n                    }), this.emit(\"disconnected\"), n(new Error(\"connection closed\"))\n                }), this.transport.connect().catch(n)\n            })), this._connectPromise\n        }\n        async login(e = {}) {\n            let {\n                clientId: t,\n                accessToken: n\n            } = e;\n            return await this.connect(t), e.scopes ? (n || (n = await this.authorize(e)), this.authenticate(n)) : (this.emit(\"ready\"), this)\n        }\n        request(e, t, n) {\n            return new Promise((i, s) => {\n                const o = T();\n                this.transport.send({\n                    cmd: e,\n                    args: t,\n                    evt: n,\n                    nonce: o\n                }), this._expecting.set(o, {\n                    resolve: i,\n                    reject: s\n                })\n            })\n        }\n        _onRpcMessage(e) {\n            if (e.cmd === a.DISPATCH && e.evt === E.READY) e.data.user && (this.user = e.data.user), this.emit(\"connected\");\n            else if (this._expecting.has(e.nonce)) {\n                const {\n                    resolve: t,\n                    reject: n\n                } = this._expecting.get(e.nonce);\n                if (\"ERROR\" === e.evt) {\n                    const t = new Error(e.data.message);\n                    t.code = e.data.code, t.data = e.data, n(t)\n                } else t(e.data);\n                this._expecting.delete(e.nonce)\n            } else {\n                const t = d(e.evt, e.args);\n                if (!this._subscriptions.has(t)) return;\n                this._subscriptions.get(t)(e.data)\n            }\n        }\n        async authorize({\n            scopes: e,\n            clientSecret: t,\n            rpcToken: n,\n            redirectUri: i\n        } = {}) {\n            if (t && !0 === n) {\n                n = (await this.fetch(\"POST\", \"/oauth2/token/rpc\", {\n                    data: new URLSearchParams({\n                        client_id: this.clientId,\n                        client_secret: t\n                    })\n                })).rpc_token\n            }\n            const {\n                code: s\n            } = await this.request(\"AUTHORIZE\", {\n                scopes: e,\n                client_id: this.clientId,\n                rpc_token: n,\n                redirect_uri: i\n            });\n            return (await this.fetch(\"POST\", \"/oauth2/token\", {\n                data: new URLSearchParams({\n                    client_id: this.clientId,\n                    client_secret: t,\n                    code: s,\n                    grant_type: \"authorization_code\",\n                    redirect_uri: i\n                })\n            })).access_token\n        }\n        authenticate(e) {\n            return this.request(\"AUTHENTICATE\", {\n                access_token: e\n            }).then(({\n                application: t,\n                user: n\n            }) => (this.accessToken = e, this.application = t, this.user = n, this.emit(\"ready\"), this))\n        }\n        getGuild(e, t) {\n            return this.request(a.GET_GUILD, {\n                guild_id: e,\n                timeout: t\n            })\n        }\n        getGuilds(e) {\n            return this.request(a.GET_GUILDS, {\n                timeout: e\n            })\n        }\n        getChannel(e, t) {\n            return this.request(a.GET_CHANNEL, {\n                channel_id: e,\n                timeout: t\n            })\n        }\n        async getChannels(e, t) {\n            const {\n                channels: n\n            } = await this.request(a.GET_CHANNELS, {\n                timeout: t,\n                guild_id: e\n            });\n            return n\n        }\n        setCertifiedDevices(e) {\n            return this.request(a.SET_CERTIFIED_DEVICES, {\n                devices: e.map(e => ({\n                    type: e.type,\n                    id: e.uuid,\n                    vendor: e.vendor,\n                    model: e.model,\n                    related: e.related,\n                    echo_cancellation: e.echoCancellation,\n                    noise_suppression: e.noiseSuppression,\n                    automatic_gain_control: e.automaticGainControl,\n                    hardware_mute: e.hardwareMute\n                }))\n            })\n        }\n        setUserVoiceSettings(e, t) {\n            return this.request(a.SET_USER_VOICE_SETTINGS, {\n                user_id: e,\n                pan: t.pan,\n                mute: t.mute,\n                volume: t.volume\n            })\n        }\n        selectVoiceChannel(e, {\n            timeout: t,\n            force: n = !1\n        } = {}) {\n            return this.request(a.SELECT_VOICE_CHANNEL, {\n                channel_id: e,\n                timeout: t,\n                force: n\n            })\n        }\n        selectTextChannel(e, {\n            timeout: t,\n            force: n = !1\n        } = {}) {\n            return this.request(a.SELECT_TEXT_CHANNEL, {\n                channel_id: e,\n                timeout: t,\n                force: n\n            })\n        }\n        getVoiceSettings() {\n            return this.request(a.GET_VOICE_SETTINGS).then(e => ({\n                automaticGainControl: e.automatic_gain_control,\n                echoCancellation: e.echo_cancellation,\n                noiseSuppression: e.noise_suppression,\n                qos: e.qos,\n                silenceWarning: e.silence_warning,\n                deaf: e.deaf,\n                mute: e.mute,\n                input: {\n                    availableDevices: e.input.available_devices,\n                    device: e.input.device_id,\n                    volume: e.input.volume\n                },\n                output: {\n                    availableDevices: e.output.available_devices,\n                    device: e.output.device_id,\n                    volume: e.output.volume\n                },\n                mode: {\n                    type: e.mode.type,\n                    autoThreshold: e.mode.auto_threshold,\n                    threshold: e.mode.threshold,\n                    shortcut: e.mode.shortcut,\n                    delay: e.mode.delay\n                }\n            }))\n        }\n        setVoiceSettings(e) {\n            return this.request(a.SET_VOICE_SETTINGS, {\n                automatic_gain_control: e.automaticGainControl,\n                echo_cancellation: e.echoCancellation,\n                noise_suppression: e.noiseSuppression,\n                qos: e.qos,\n                silence_warning: e.silenceWarning,\n                deaf: e.deaf,\n                mute: e.mute,\n                input: e.input ? {\n                    device_id: e.input.device,\n                    volume: e.input.volume\n                } : void 0,\n                output: e.output ? {\n                    device_id: e.output.device,\n                    volume: e.output.volume\n                } : void 0,\n                mode: e.mode ? {\n                    mode: e.mode.type,\n                    auto_threshold: e.mode.autoThreshold,\n                    threshold: e.mode.threshold,\n                    shortcut: e.mode.shortcut,\n                    delay: e.mode.delay\n                } : void 0\n            })\n        }\n        captureShortcut(e) {\n            const t = d(E.CAPTURE_SHORTCUT_CHANGE),\n                n = () => (this._subscriptions.delete(t), this.request(a.CAPTURE_SHORTCUT, {\n                    action: \"STOP\"\n                }));\n            return this._subscriptions.set(t, ({\n                shortcut: t\n            }) => {\n                e(t, n)\n            }), this.request(a.CAPTURE_SHORTCUT, {\n                action: \"START\"\n            }).then(() => n)\n        }\n        setActivity(e = {}, t = u()) {\n            let n, i, s, o;\n            if (e.startTimestamp || e.endTimestamp) {\n                if (n = {\n                        start: e.startTimestamp,\n                        end: e.endTimestamp\n                    }, n.start instanceof Date && (n.start = Math.round(n.start.getTime())), n.end instanceof Date && (n.end = Math.round(n.end.getTime())), n.start > 2147483647e3) throw new RangeError(\"timestamps.start must fit into a unix timestamp\");\n                if (n.end > 2147483647e3) throw new RangeError(\"timestamps.end must fit into a unix timestamp\")\n            }\n            return (e.largeImageKey || e.largeImageText || e.smallImageKey || e.smallImageText) && (i = {\n                large_image: e.largeImageKey,\n                large_text: e.largeImageText,\n                small_image: e.smallImageKey,\n                small_text: e.smallImageText\n            }), (e.partySize || e.partyId || e.partyMax) && (s = {\n                id: e.partyId\n            }, (e.partySize || e.partyMax) && (s.size = [e.partySize, e.partyMax])), (e.matchSecret || e.joinSecret || e.spectateSecret) && (o = {\n                match: e.matchSecret,\n                join: e.joinSecret,\n                spectate: e.spectateSecret\n            }), this.request(a.SET_ACTIVITY, {\n                pid: t,\n                activity: {\n                    state: e.state,\n                    details: e.details,\n                    timestamps: n,\n                    assets: i,\n                    party: s,\n                    secrets: o,\n                    instance: !!e.instance\n                }\n            })\n        }\n        clearActivity(e = u()) {\n            return this.request(a.SET_ACTIVITY, {\n                pid: e\n            })\n        }\n        sendJoinInvite(e) {\n            return this.request(a.SEND_ACTIVITY_JOIN_INVITE, {\n                user_id: e.id || e\n            })\n        }\n        sendJoinRequest(e) {\n            return this.request(a.SEND_ACTIVITY_JOIN_REQUEST, {\n                user_id: e.id || e\n            })\n        }\n        closeJoinRequest(e) {\n            return this.request(a.CLOSE_ACTIVITY_JOIN_REQUEST, {\n                user_id: e.id || e\n            })\n        }\n        createLobby(e, t, n) {\n            return this.request(a.CREATE_LOBBY, {\n                type: e,\n                capacity: t,\n                metadata: n\n            })\n        }\n        updateLobby(e, {\n            type: t,\n            owner: n,\n            capacity: i,\n            metadata: s\n        } = {}) {\n            return this.request(a.UPDATE_LOBBY, {\n                id: e.id || e,\n                type: t,\n                owner_id: n && n.id || n,\n                capacity: i,\n                metadata: s\n            })\n        }\n        deleteLobby(e) {\n            return this.request(a.DELETE_LOBBY, {\n                id: e.id || e\n            })\n        }\n        connectToLobby(e, t) {\n            return this.request(a.CONNECT_TO_LOBBY, {\n                id: e,\n                secret: t\n            })\n        }\n        sendToLobby(e, t) {\n            return this.request(a.SEND_TO_LOBBY, {\n                id: e.id || e,\n                data: t\n            })\n        }\n        disconnectFromLobby(e) {\n            return this.request(a.DISCONNECT_FROM_LOBBY, {\n                id: e.id || e\n            })\n        }\n        updateLobbyMember(e, t, n) {\n            return this.request(a.UPDATE_LOBBY_MEMBER, {\n                lobby_id: e.id || e,\n                user_id: t.id || t,\n                metadata: n\n            })\n        }\n        getRelationships() {\n            const e = Object.keys(_);\n            return this.request(a.GET_RELATIONSHIPS).then(t => t.relationships.map(t => ({\n                ...t,\n                type: e[t.type]\n            })))\n        }\n        subscribe(e, t, n) {\n            return n || \"function\" != typeof t || (n = t, t = void 0), this.request(a.SUBSCRIBE, t, e).then(() => {\n                const i = d(e, t);\n                return this._subscriptions.set(i, n), {\n                    unsubscribe: () => this.request(a.UNSUBSCRIBE, t, e).then(() => this._subscriptions.delete(i))\n                }\n            })\n        }\n        async destroy() {\n            this.transport.close()\n        }\n    }\n}, function(e, t) {\n    e.exports = require(\"timers\")\n}, function(e, t, n) {\n    \"use strict\";\n    e.exports = {\n        ipc: n(11),\n        websocket: n(13)\n    }\n}, function(e, t, n) {\n    \"use strict\";\n    const i = n(12),\n        s = n(1),\n        o = n(2),\n        {\n            uuid: r\n        } = n(0),\n        c = 0,\n        a = 1,\n        E = 2,\n        _ = 3,\n        u = 4;\n\n    function T(e = 0) {\n        return new Promise((t, n) => {\n            const s = function(e) {\n                    if (\"win32\" === Blockbench.platform) return \"\\\\\\\\?\\\\pipe\\\\discord-ipc-\" + e;\n                    const {\n                        env: {\n                            XDG_RUNTIME_DIR: t,\n                            TMPDIR: n,\n                            TMP: i,\n                            TEMP: s\n                        }\n                    } = process;\n                    return `${(t||n||i||s||\"/tmp\").replace(/\\/$/,\"\")}/discord-ipc-${e}`\n                }(e),\n                o = () => {\n                    e < 10 ? t(T(e + 1)) : n(new Error(\"Could not connect\"))\n                },\n                r = i.createConnection(s, () => {\n                    r.removeListener(\"error\", o), t(r)\n                });\n            r.once(\"error\", o)\n        })\n    }\n\n    function d(e, t) {\n        t = JSON.stringify(t);\n        const n = Buffer.byteLength(t),\n            i = Buffer.alloc(8 + n);\n        return i.writeInt32LE(e, 0), i.writeInt32LE(n, 4), i.write(t, 8, n), i\n    }\n    const I = {\n        full: \"\",\n        op: void 0\n    };\n\n    function l(e, t) {\n        const n = e.read();\n        if (!n) return;\n        let i, {\n            op: s\n        } = I;\n        if (\"\" === I.full) {\n            s = I.op = n.readInt32LE(0);\n            const e = n.readInt32LE(4);\n            i = n.slice(8, e + 8)\n        } else i = n.toString();\n        try {\n            t({\n                op: s,\n                data: JSON.parse(I.full + i)\n            }), I.full = \"\", I.op = void 0\n        } catch (e) {\n            I.full += i\n        }\n        l(e, t)\n    }\n    e.exports = class extends s {\n        constructor(e) {\n            super(), this.client = e, this.socket = null\n        }\n        async connect() {\n            const e = this.socket = await T();\n            e.on(\"close\", this.onClose.bind(this)), e.on(\"error\", this.onClose.bind(this)), this.emit(\"open\"), e.write(d(c, {\n                v: 1,\n                client_id: this.client.clientId\n            })), e.pause(), e.on(\"readable\", () => {\n                l(e, ({\n                    op: e,\n                    data: t\n                }) => {\n                    switch (e) {\n                        case _:\n                            this.send(t, u);\n                            break;\n                        case a:\n                            if (!t) return;\n                            \"AUTHORIZE\" === t.cmd && \"ERROR\" !== t.evt && async function e(t = 0) {\n                                if (t > 30) throw new Error(\"Could not find endpoint\");\n                                const n = \"http://127.0.0.1:\" + (6463 + t % 10);\n                                try {\n                                    return 401 !== (await o(n)).status ? e(t + 1) : n\n                                } catch (n) {\n                                    return e(t + 1)\n                                }\n                            }().then(e => {\n                                this.client.request.endpoint = e\n                            }), this.emit(\"message\", t);\n                            break;\n                        case E:\n                            this.emit(\"close\", t)\n                    }\n                })\n            })\n        }\n        onClose(e) {\n            this.emit(\"close\", e)\n        }\n        send(e, t = a) {\n            this.socket.write(d(t, e))\n        }\n        close() {\n            this.send({}, E), this.socket.end()\n        }\n        ping() {\n            this.send(r(), _)\n        }\n    }, e.exports.encode = d, e.exports.decode = l\n}, function(e, t) {\n    e.exports = require(\"net\")\n}, function(e, t, n) {\n    \"use strict\";\n    const i = n(1),\n        {\n            browser: s\n        } = n(3),\n        o = s ? window.WebSocket : n(14);\n    e.exports = class extends i {\n        constructor(e) {\n            super(), this.client = e, this.ws = null, this.tries = 0\n        }\n        async connect(e, t = this.tries) {\n            if (this.connected) return;\n            const n = 6463 + t % 10;\n            this.hostAndPort = \"127.0.0.1:\" + n;\n            const i = this.ws = new o(`ws://${this.hostAndPort}/?v=1&client_id=${this.client.clientId}`);\n            i.onopen = this.onOpen.bind(this), i.onclose = i.onerror = this.onClose.bind(this), i.onmessage = this.onMessage.bind(this)\n        }\n        send(e) {\n            var t;\n            this.ws && this.ws.send((t = e, JSON.stringify(t)))\n        }\n        close() {\n            this.ws && this.ws.close()\n        }\n        ping() {}\n        onMessage(e) {\n            var t;\n            this.emit(\"message\", (t = e.data, JSON.parse(t)))\n        }\n        onOpen() {\n            this.emit(\"open\")\n        }\n        onClose(e) {\n            try {\n                this.ws.close()\n            } catch (e) {}\n            const t = e.code >= 4e3 && e.code < 5e3;\n            e.code && !t || this.emit(\"close\", e), t || setTimeout(() => this.connect(void 0, 1006 === e.code ? ++this.tries : 0), 250)\n        }\n    }\n}, function(e, t) {}]);\n"
  },
  {
    "path": "plugins/double_sided_cubes.js",
    "content": "(()=> {\n\n\tlet cube_action;\n\n\tPlugin.register('double_sided_cubes', {\n\t\ttitle: 'Double Sided Cubes',\n\t\tauthor: 'SnaveSutit',\n\t\tdescription: 'Creates inverted duplicates of the selected cube(s) to allow double-sided rendering in java edition.',\n        tags: [\"Minecraft: Java Edition\"],\n\t\ticon: 'flip_to_back',\n\t\tversion: '1.0.1',\n\t\tvariant: 'both',\n\t\tonload() {\n\t\t\tcube_action = new Action({\n\t\t\t\tid:\"create_double_sided_cubes\",\n\t\t\t\tname: 'Create Double Sided Cube',\n\t\t\t\ticon: 'flip_to_back',\n\t\t\t\tcategory: 'edit',\n\t\t\t\tcondition: () => !Project.box_uv,\n\t\t\t\tclick: function(ev) {\n\t\t\t\t\tif (selected.length === 0) {\n\t\t\t\t\t\tBlockbench.showMessage('No cubes selected', 'center')\n\t\t\t\t\t\treturn;\n\t\t\t\t\t};\n\t\t\t\t\tUndo.initEdit({elements:[]});\n\t\t\t\t\tlet cubes = [];\n\t\t\t\t\tCube.selected.forEach((cube) => {\n\t\t\t\t\t\tconst new_cube = cube.duplicate();\n\t\t\t\t\t\tnew_cube.name = new_cube.name + \" inverted\";\n\t\t\t\t\t\tif (cube.parent !== \"root\") {\n\t\t\t\t\t\t\tnew_cube.addTo(cube.parent);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tfor (i=0; i<3; i++){\n\t\t\t\t\t\t\tnew_cube.flip(i, 0, false)\n\t\t\t\t\t\t};\n\t\t\t\t\t\tnew_cube.from = [...cube.to];\n\t\t\t\t\t\tnew_cube.to = [...cube.from];\n\t\t\t\t\t\tnew_cube.inflate = -new_cube.inflate;\n\t\t\t\t\t\tnew_cube.origin = [-new_cube.origin[0],-new_cube.origin[1],-new_cube.origin[2]];\n\t\t\t\t\t\tCanvas.adaptObjectPosition(new_cube);\n\t\t\t\t\t\tCanvas.updateUV(new_cube);\n\t\t\t\t\t\tcubes.push(new_cube);\n\t\t\t\t\t});\n\t\t\t\t\tUndo.finishEdit('create_double_sided_cube', {elements:cubes});\n\t\t\t\t}\n\t\t\t});\n\t\t\tMenuBar.addAction(cube_action, 'filter');\n\t\t},\n\t\tonunload() {\n\t\t\tcube_action.delete();\n\t\t}\n\t});\n})();\n"
  },
  {
    "path": "plugins/duplicate_renamer.js",
    "content": "(function () {\n    // Register plugin\n    Plugin.register('duplicate_renamer', {\n        title: 'Duplicate Bone Renamer',\n        author: 'Gecko',\n        icon: 'fa-font',\n        description: 'This plugin renames duplicate bones so they work in bedrock and GeckoLib',\n        about: 'Simply go to Edit -> Rename Duplicates. All duplicate bones will get renamed to {bone}_{number}',\n        version: '1.0.0',\n        variant: 'both',\n        onload() {\n            button = new Action('rename_duplicates', {\n                name: 'Rename Duplicates',\n                description: 'Rename all duplicate bone names',\n                icon: 'fa-font',\n                click: function () {\n                    Undo.initEdit({outliner: true});\n                    const duplicates = []\n                    Group.all.forEach(x => {\n                        if (duplicates.some(group => group.name === x.name)) {\n                            let duplicate = duplicates.find(group => group.name === x.name);\n                            x.name += \"_\" + duplicate.number;\n                            duplicate.number++;\n                        }\n                        else {\n                            duplicates.push({\n                                name: x.name,\n                                number: 1\n                            })\n                        }\n                    })\n                    Undo.finishEdit('rename duplicates', {outliner: true});\n                }\n            });\n            MenuBar.addAction(button, 'edit.-1');\n        },\n        onunload() {\n            button.delete();\n        }\n    });\n})();\n"
  },
  {
    "path": "plugins/easings/about.md",
    "content": "# Easings\n\nApply easing to Minecraft: Bedrock Edition animations by utilizing `anim_time_update`.\n\n> Easing can only be applied to animations with a default or empty anim time update and a defined animation length.\n\n> You must reapply or re-run the easing if you change the animation duration or loop mode.\n\n> Blockbench might not be able to preview bounce easings properly.\n\n## Supported Easings\n\n- Sine\n- Quad\n- Cubic\n- Quart\n- Quint\n- Expo\n- Circ\n- Bounce\n\n## Unsupported Easings\n\n- Back\n- Elastic\n\nThese are unsupported because Bedrock animations clamp values within the animation length while these easings can extend beyond that range.\n"
  },
  {
    "path": "plugins/easings/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"author\": \"Svdex\",\n    \"date\": \"2026-02-28\",\n    \"categories\": [\n      {\n        \"title\": \"Features\",\n        \"list\": [\"Initial Release\"]\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "plugins/easings/easings.js",
    "content": "\"use strict\";(()=>{var u={name:\"easings\",private:!0,version:\"1.0.0\",module:\"src/index.ts\",type:\"module\",author:{name:\"Svdex\",url:\"http://svdex.moe\"},scripts:{watch:\"esbuild src/index.ts --bundle --watch --minify --outfile=../../plugins/easings/easings.js --format=iife\",build:\"esbuild src/index.ts --bundle --minify --outfile=../../plugins/easings/easings.js --format=iife\"},devDependencies:{esbuild:\"^0.25.6\",eslint:\"^9.37.0\",prettier:\"^3.6.2\",\"prettier-plugin-multiline-arrays\":\"^4.0.3\",\"prettier-plugin-organize-imports\":\"^4.1.0\",\"typescript-eslint\":\"^8.36.0\"}};function $(i){let t=0;for(let n=0;n<i.length;n++)t=t*31+i.charCodeAt(n)|0;return t^3405695742}var f=\"abcdefghijklmnopqrstuvwxyz\";function A(i){let t=$(i),n=\"\",o=Math.abs(t);do n=f[o%f.length]+n,o=Math.floor(o/f.length);while(o>0);return\"v.__e\"+n}var b={inSine:\"math.ease_in_sine(_t)\",outSine:\"math.ease_out_sine(_t)\",inOutSine:\"math.ease_in_out_sine(_t)\",inQuad:\"math.ease_in_quad(_t)\",outQuad:\"math.ease_out_quad(_t)\",inOutQuad:\"math.ease_in_out_quad(_t)\",inCubic:\"math.ease_in_cubic(_t)\",outCubic:\"math.ease_out_cubic(_t)\",inOutCubic:\"math.ease_in_out_cubic(_t)\",inQuart:\"math.ease_in_quart(_t)\",outQuart:\"math.ease_out_quart(_t)\",inOutQuart:\"math.ease_in_out_quart(_t)\",inQuint:\"math.ease_in_quint(_t)\",outQuint:\"math.ease_out_quint(_t)\",inOutQuint:\"math.ease_in_out_quint(_t)\",inExpo:\"math.ease_in_expo(_t)\",outExpo:\"math.ease_out_expo(_t)\",inOutExpo:\"math.ease_in_out_expo(_t)\",inCirc:\"math.ease_in_circ(_t)\",outCirc:\"math.ease_out_circ(_t)\",inOutCirc:\"math.ease_in_out_circ(_t)\",inBounce:\"math.ease_in_bounce(_t)\",outBounce:\"math.ease_out_bounce(_t)\",inOutBounce:\"math.ease_in_out_bounce(_t)\"},m=Object.keys(b);function O(i){let{easing:t,duration:n,animationName:o,loop:c=!1}=i,s=A(o),r=A(o+\"_orig\"),a=b[t].replace(/_t/g,`0,${n},${s}`).replace(/\\s+/g,\"\"),e;return c===\"loop\"?e=`${r}=(${r}??0)+q.delta_time;${r}>${n}?{${r}=${r}-${n};};`:e=`(${r}??0)>${n}?{return${n+.1};}:{${r}=(${r}??0)+q.delta_time;};`,`q.anim_time==0?{${r}=0;};${e}${s}=${r}/${n};return${a};`}var p=`'${u.name}=${u.version}';`;function y(i,t){let n=i.name,o=m.indexOf(t),c=p+`'i=${o}';`+O({animationName:n,duration:i.length,easing:t,loop:i.loop});i.anim_time_update=c}function g(i){let t=i.anim_time_update;if(!t.startsWith(p))return;let o=t.slice(p.length).match(/'i=(\\d+)'/)?.[1];if(!o)return;let c=+o,s=m[c];if(s)return{easing:s,index:c}}function h(i){let t=i.anim_time_update;return t.startsWith(p)||!t&&i.length>0}var k={on:\"far.fa-dot-circle\",off:\"far.fa-circle\"},E=class{id=u.name;title=\"Easings\";author=u.author.name;version=u.version;description=\"Apply easing functions to Minecraft: Bedrock Edition animations.\";icon=\"stacked_line_chart\";variant=\"both\";tags=[\"Minecraft: Bedrock Edition\",\"Animation\"];website=u.author.url;min_version=\"4.8.0\";has_changelog=!0;actions=[];formats=new Set([\"bedrock\",\"bedrock_old\"]);constructor(){this.onload=this.onload.bind(this),this.onunload=this.onunload.bind(this)}onload(){this.actionApplyEasing(),this.actionManageEasings()}onunload(){for(let t of this.actions)t.delete();this.actions=[]}isBedrockAnimation(t){return\"anim_time_update\"in t&&typeof t.anim_time_update==\"string\"}getSelectedAnimation(){if(Animator.open&&Blockbench.Animation&&Animation.selected!==null){let t=Animation.selected;if(this.isBedrockAnimation(t))return t}}actionApplyEasing(){let t=new Action(\"easings.apply_easing\",{icon:this.icon,name:\"Apply Easing\",description:\"Apply the easing function of the selected animation.\",condition:()=>{if(!this.formats.has(Format.id))return!1;let n=this.getSelectedAnimation();return Animator.open&&n&&h(n)},click(n){typeof this.children==\"function\"&&n?.target instanceof HTMLElement&&new Menu(this.children()).open(n.target)},children:()=>{let n=this.getSelectedAnimation();if(!n)return[];let o=[\"None\",...m],c=g(n)?.easing??\"None\";return o.map(s=>({name:s,icon:s===c?k.on:k.off,click:()=>{Undo.initEdit({animations:[n]}),s===\"None\"?n.anim_time_update=\"\":y(n,s),Undo.finishEdit(\"Apply Easing\")}}))}});this.actions.push(t)}actionManageEasings(){let t=new Action(\"easings.manage_easings\",{icon:this.icon,name:\"Manage Easings\",description:\"Manage easing functions for all animations in the current file.\",condition:()=>this.formats.has(Format.id)&&Animator.open&&this.allAnimations.some(h),click:()=>this.easingsDialog.show()});this.actions.push(t),MenuBar.addAction(t,\"animation\")}get allAnimations(){return Animator.open?AnimationItem.all.filter(this.isBedrockAnimation):[]}get easingsDialog(){let t=this.allAnimations,n=t.reduce((a,e)=>(a[e.name.replaceAll(\".\",\"_tkn_\")]=e,a),{}),o=[\"None\",...m],c=Object.fromEntries(o.map((a,e)=>[e,a])),s=t.reduce((a,e)=>{if(!h(e))return a;let l=g(e),_=e.name.replaceAll(\".\",\"_tkn_\"),d=1+(l?.index??-1);return a[_]={type:\"select\",label:e.name,options:c,value:d},a},{}),r=new Dialog({id:this.id,title:this.title,form:{...s,buttonBar:{type:\"buttons\",buttons:[\"Reset All\"],click(){r.setFormValues(Object.keys(s).reduce((a,e)=>(a[e]=0,a),{}),!0)}}},onConfirm:a=>{Undo.initEdit({animations:t});for(let e of Object.keys(a)){let l=n[e];if(!l)continue;let _=+a[e],d=!1;_?(y(l,o[_]),d=!0):g(l)&&(l.anim_time_update=\"\",d=!0),d&&(l.saved=!1)}Undo.finishEdit(\"Apply Easing\")}});return r}},B=new E;BBPlugin.register(B.id,B);})();\n"
  },
  {
    "path": "plugins/emf_animation_addon/about.md",
    "content": "# EMF Animation Addon\n\nThis is an addon plugin for Ewan Howell's `CEM Template Loader` plugin <span style=\"color:dodgerblue\">https://ewanhowell.com/plugins/cem-template-loader</span>\n\nThis plugin adds support for the extra animation functions and variables used in the Entity Model Features (**EMF**) Mod \n- <span style=\"color:dodgerblue\">https://www.curseforge.com/minecraft/mc-mods/entity-model-features</span>\n- <span style=\"color:dodgerblue\">https://modrinth.com/mod/entity-model-features</span>\n\nThese extra features will not work when using these models in OptiFine.\n\n>*Tip: you can have both EMF & OptiFine models in the same resource-pack by putting the EMF only models in the EMF override directory `assets/minecraft/emf/cem/`. If you don't use EMF only features then `assets/minecraft/optifine/cem` is recommended.*\n\nA full list of all EMF animation functions and variables can be found <span style=\"color:dodgerblue\">[**here**](https://github.com/Traben-0/Entity_Model_Features/blob/master/.github/emf_animation.txt)</span>  \nyou can also see them in the EMF mod's in-game config screen under models -> Animation math details.\n\nFor **all** EMF features, including how to export modded entity models for use in blockbench, see the <span style=\"color:dodgerblue\">[**EMF Feature Guide**](https://github.com/Traben-0/Entity_Model_Features/blob/master/FEATURES.md)</span>\n\n### Plugin is current for EMF v2.2"
  },
  {
    "path": "plugins/emf_animation_addon/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2024-06-05\",\n    \"author\": \"Traben & Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Plugin\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2024-06-23\",\n    \"author\": \"Traben\",\n    \"categories\": [\n      {\n        \"title\": \"Doc update\",\n        \"list\": [\n          \"minor icon change in doc where the cem template loader icon was used\"\n        ]\n      }\n    ]\n  },\n  \"1.0.2\": {\n    \"title\": \"1.0.2\",\n    \"date\": \"2024-07-01\",\n    \"author\": \"Traben\",\n    \"categories\": [\n      {\n        \"title\": \"fixed setting\",\n        \"list\": [\n          \"Fixed the EMF enable/disable setting not appearing in the plugins screen\"\n        ]\n      }\n    ]\n  },\n  \"1.0.3\": {\n    \"title\": \"1.0.3\",\n    \"date\": \"2024-08-20\",\n    \"author\": \"Traben\",\n    \"categories\": [\n      {\n        \"title\": \"updated for EMF 2.2\",\n        \"list\": [\n          \"Added functions, variables, and changes, from Entity Model Features update 2.2\"\n        ]\n      }\n    ]\n  },\n  \"1.0.4\": {\n    \"title\": \"1.0.4\",\n    \"date\": \"2024-08-25\",\n    \"author\": \"Traben\",\n    \"categories\": [\n      {\n        \"title\": \"fixed keyframe method bug\",\n        \"list\": [\n          \"Fixed a bug in the keyframe methods\"\n        ]\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "plugins/emf_animation_addon/emf_animation_addon.js",
    "content": "(() => {\n    let constants, ranges, booleans, enabledBooleans, functionHints, animDocs\n    Plugin.register(\"emf_animation_addon\", {\n        title: \"EMF Animation Addon\",\n        icon: \"icon.png\",\n        author: \"Traben & Ewan Howell\",\n        description: \"Adds extra animation support to CEM Template Loader so that it is compatible with the Entity Model Features mod.\",\n        tags: [\"Minecraft: Java Edition\", \"Entity Models\", \"Animation\"],\n        version: \"1.0.4\",\n        min_version: \"4.9.0\",\n        variant: \"both\",\n        dependencies: [\"cem_template_loader\"],\n        onload() {\n            new Setting(\"emf_features\", {\n                value: true,\n                category: \"edit\",\n                plugin: \"emf_animation_addon\",\n                name: \"Enable EMF only animation features\",\n                description: \"Enable animation features that are only compatible with the Entity Model Features mod. WARNING: These animations will cause the model to fail to load when using OptiFine.\",\n                onChange() {\n                    unload()\n                    load()\n                }\n            })\n\n\n            constants = {\n                e: 2.718281828459045,\n                nan: NaN,\n                //add: (...args) => args.reduce((a, e) => a + e, 0)\n                catch: (x, c, id) => {\n                    if (x === undefined || typeof x !== 'number') {\n                        console.log(`catch print(${id}) = x was undefined or not a number type`)\n                        return c\n                    }\n                    if (!Number.isNaN(x)) return x\n                    console.log(`catch print(${id}) = x was NaN`)\n                    return c\n                },\n                wrapdeg: wrapDegrees,\n                wraprad: (r) => Math.degToRad(wrapDegrees(Math.radToDeg(r))),\n                degdiff: angleBetween,\n                raddiff: (a, b) => Math.degToRad(angleBetween(Math.radToDeg(a), Math.radToDeg(b))),\n                randomb: (seed) => {\n                    if (!seed) return Math.random() >= 0.5\n                    seed = optifineAnimationVariables.constants.frac(seed * 123.34)\n                    seed += seed * (seed + 45.32)\n                    return optifineAnimationVariables.constants.frac(seed * seed) >= 0.5\n                },\n                // ifb: (...args) => {\n                //     if (args.length < 3 || args.length % 2 !== 1 || typeof args[0] !== \"boolean\") throw Error\n                //     for (let i = 0; i < args.length; i += 2) {\n                //         if (i === args.length - 1) {\n                //             if (typeof args[i] === \"number\") throw Error(\"Ifb statements cannot return a <strong>number</strong>\")\n                //             return args[i]\n                //         } else if (args[i]) {\n                //             if (typeof args[i + 1] === \"number\") throw Error(\"Ifb statements cannot return a <strong>number</strong>\")\n                //             return args[i + 1]\n                //         }\n                //     }\n                // },\n                easeinquad: easeInQuad,\n                easeoutquad: easeOutQuad,\n                easeinoutquad: easeInOutQuad,\n                easeincubic: easeInCubic,\n                easeoutcubic: easeOutCubic,\n                easeinoutcubic: easeInOutCubic,\n                easeinquart: easeInQuart,\n                easeoutquart: easeOutQuart,\n                easeinoutquart: easeInOutQuart,\n                easeinquint: easeInQuint,\n                easeoutquint: easeOutQuint,\n                easeinoutquint: easeInOutQuint,\n                easeinsine: easeInSine,\n                easeoutsine: easeOutSine,\n                easeinoutsine: easeInOutSine,\n                easeinexpo: easeInExpo,\n                easeoutexpo: easeOutExpo,\n                easeinoutexpo: easeInOutExpo,\n                easeincirc: easeInCirc,\n                easeoutcirc: easeOutCirc,\n                easeinoutcirc: easeInOutCirc,\n                easeinelastic: easeInElastic,\n                easeoutelastic: easeOutElastic,\n                easeinoutelastic: easeInOutElastic,\n                easeinbounce: easeInBounce,\n                easeoutbounce: easeOutBounce,\n                easeinoutbounce: easeInOutBounce,\n                easeinback: easeInBack,\n                easeoutback: easeOutBack,\n                easeinoutback: easeInOutBack,\n                quadbezier: quadraticBezier,\n                cubicbezier: cubicBezier,\n                hermite: hermiteInterpolation,\n                catmullrom: catmullrom,\n                keyframe: (k, ...args) => {\n                    //skip if outside of scope\n                    let frameEnd = args.length - 1;\n                    let deltaFloor = Math.floor(k);\n\n                    if(deltaFloor >= frameEnd){\n                        return args[frameEnd];\n                    }else if(deltaFloor <= 0){\n                        return args[0];\n                    }\n\n                    return keyframeLoop(k, ...args);\n                },\n                keyframeloop: keyframeLoop,\n                nbt: (key, test) => {\n                    //todo no real functionality here\n                    return false\n                }\n            }\n            ranges = {\n                // zeroToHundred: [0, 50, 100],\n                // start30Jump15: [0, 30, 90, 15]\n                move_forward: [-1, 0, 1, 0.01],\n                move_strafing: [-1, 0, 1, 0.01],\n                height_above_ground: [0, 0, 128, 0.25],\n                fluid_depth: [0, 0, 64],\n                fluid_depth_up: [0, 0, 64],\n                fluid_depth_down: [0, 0, 64],\n                distance: [0, 0, 128, 0.25],\n            }\n            booleans = [\"is_climbing\", \"is_crawling\", \"is_swimming\", \"is_gliding\", \"is_blocking\",\"is_first_person_hand\",\"is_swinging_right_arm\", \"is_swinging_left_arm\", \"is_using_item\", \"is_holding_item_right\", \"is_holding_item_left\", \"is_paused\", \"is_hovered\"]\n            enabledBooleans = [\"is_right_handed\"]\n\n\n            functionHints = {\n                \"catch()\": \"catch(x, c, id)\",\n                \"wrapdeg()\": \"wrapdeg(x)\",\n                \"wraprad()\": \"wraprad(x)\",\n                \"degdiff()\": \"degdiff(x, y)\",\n                \"raddiff()\": \"raddiff(x, y)\",\n                \"easeinquad()\": \"easeinquad(k, x, y)\",\n                \"easeoutquad()\": \"easeoutquad(k, x, y)\",\n                \"easeinoutquad()\": \"easeinoutquad(k, x, y)\",\n                \"easeincubic()\": \"easeincubic(k, x, y)\",\n                \"easeoutcubic()\": \"easeoutcubic(k, x, y)\",\n                \"easeinoutcubic()\": \"easeinoutcubic(k, x, y)\",\n                \"easeinquart()\": \"easeinquart(k, x, y)\",\n                \"easeoutquart()\": \"easeoutquart(k, x, y)\",\n                \"easeinoutquart()\": \"easeinoutquart(k, x, y)\",\n                \"easeinquint()\": \"easeinquint(k, x, y)\",\n                \"easeoutquint()\": \"easeoutquint(k, x, y)\",\n                \"easeinoutquint()\": \"easeinoutquint(k, x, y)\",\n                \"easeinsine()\": \"easeinsine(k, x, y)\",\n                \"easeoutsine()\": \"easeoutsine(k, x, y)\",\n                \"easeinoutsine()\": \"easeinoutsine(k, x, y)\",\n                \"easeinexpo()\": \"easeinexpo(k, x, y)\",\n                \"easeoutexpo()\": \"easeoutexpo(k, x, y)\",\n                \"easeinoutexpo()\": \"easeinoutexpo(k, x, y)\",\n                \"easeincirc()\": \"easeincirc(k, x, y)\",\n                \"easeoutcirc()\": \"easeoutcirc(k, x, y)\",\n                \"easeinoutcirc()\": \"easeinoutcirc(k, x, y)\",\n                \"easeinelastic()\": \"easeinelastic(k, x, y)\",\n                \"easeoutelastic()\": \"easeoutelastic(k, x, y)\",\n                \"easeinoutelastic()\": \"easeinoutelastic(k, x, y)\",\n                \"easeinbounce()\": \"easeinbounce(k, x, y)\",\n                \"easeoutbounce()\": \"easeoutbounce(k, x, y)\",\n                \"easeinoutbounce()\": \"easeinoutbounce(k, x, y)\",\n                \"easeinback()\": \"easeinback(k, x, y)\",\n                \"easeoutback()\": \"easeoutback(k, x, y)\",\n                \"easeinoutback()\": \"easeinoutback(k, x, y)\",\n                \"quadbezier()\": \"quadbezier(k, x, y, z)\",\n                \"cubicbezier()\": \"cubicbezier(k, x, y, z, w)\",\n                \"hermite()\": \"hermite(k, x, y, z, w)\",\n                \"catmullrom()\": \"catmullrom(k, x, y, z, w)\",\n                \"keyframe()\": \"keyframe(k, a, b, c,...)\",\n                \"keyframeloop()\": \"keyframeloop(k, a, b, c,...)\",\n                \"randomb()\": \"randomb(seed)\",\n                \"nbt()\": \"nbt(leave empty) - breaks in editor!\"\n            }\n\n            animDocs = {\n                name: \"EMF addon\",\n                icon: \"difference\",\n                elements: [\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Entity Model Features (EMF) Addon Docs\"\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"The EMF Addon adds extra functions and variables to the CEM Template Loader that are only compatible with the Entity Model Features mod. These features will cause the model to fail to load when using OptiFine. You may choose to put such breaking models into the emf/cem/ folder rather than optifine/cem/ if you wish to use both in the same pack.\"\n                    },\n                    // todo not supported in template loader\n                    // {\n                    // \"type\": \"heading\",\n                    // \"text\": \"Global variables\"\n                    // },\n                    // {\n                    //     \"type\": \"text\",\n                    //     \"text\": \"Global variables are a way of storing data between entities. You can then use these variables inside any other animations.\"\n                    // },\n                    // {\n                    //     \"type\": \"table\",\n                    //     \"tableType\": \"list\",\n                    //     \"rows\": [\n                    //         [\n                    //             \"global_var.&lt;name&gt;\",\n                    //             \"Store a value in a named variable\"\n                    //         ],\n                    //         [\n                    //             \"global_varb.&lt;name&gt;\",\n                    //             \"Store a boolean in a named variable\"\n                    //         ]\n                    //     ]\n                    // },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Constants\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": [\n                            [\n                                \"e\",\n                                \"Euler's number 2.718281.....\"\n                            ],\n                            [\n                                \"nan\",\n                                \"throws an error, used for debugging, bypasses the initial validation checks\"\n                            ]\n                        ]\n                    },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Entity parameters (float)\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": [\n                            [\n                                \"move_forward\",\n                                    \"The entity's current movement in the direction they are facing. Ranges from -1 to 1 denoting the Y axis intercept of a unit circle of the players current movement vector.\"\n                            ],\n                            [\n                                \"move_strafing\",\n                                    \"The entity's current movement in the direction 90 degrees to the right of their facing direction. Ranges from -1 to 1 denoting the X axis intercept of a unit circle of the players current movement vector.\"\n                            ],\n                            // [\n                            //     \"distance\",\n                            //     \"silently deprecate\"\n                            // ],\n                            [\n                                \"height_above_ground\",\n                                    \"The distance the entity is above the ground, ground being the highest point below the entity with a collidable block\"\n                            ],\n                            [   \"fluid_depth\",\n                                    \"The depth of the fluid above and below a submerged entity, 0 if not submerged\"\n                            ],\n                            [   \"fluid_depth_down\",\n                                    \"The depth of the fluid below a submerged entity, 0 if not submerged\"\n                            ],\n                            [   \"fluid_depth_up\",\n                                    \"The depth of the fluid above a submerged entity, 0 if not submerged\"\n                            ]\n\n                        ]\n                    },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Entity parameters (boolean)\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": [\n                            [\n                                \"is_climbing\",\n                                \"If the entity is climbing a climbable block or is a spider on a wall.\"\n                            ],\n                            [\n                                \"is_blocking\",\n                                \"If the entity is blocking with a shield.\"\n                            ],\n                            [\n                                \"is_crawling\",\n                                \"If the entity is crawling.\"\n                            ],\n                            [\n                                \"is_jumping\",\n                                \"If the entity is jumping.\"\n                            ],\n                            [\n                                \"is_swimming\",\n                                \"If the entity is in its swimming pose.\"\n                            ],\n                            [\n                                \"is_right_handed\",\n                                \"If the biped entity is right handed.\"\n                            ],\n                            [\n                                \"is_swinging_right_arm\",\n                                \"If the biped entity is swinging it's right arm.\"\n                            ],\n                            [\n                                \"is_swinging_left_arm\",\n                                \"If the biped entity is swinging it's left arm.\"\n                            ],\n                            [\n                                \"is_first_person_hand\",\n                                \"If the model part being rendered is the first person player hand.\"\n                            ],\n                            [\n                                \"is_using_item\",\n                                \"If the entity is using an item.\"\n                            ],\n                            [\n                                \"is_holding_item_right\",\n                                \"If the entity is holding an item in its right hand.\"\n                            ],\n                            [\n                                \"is_holding_item_left\",\n                                \"If the entity is holding an item in its left hand.\"\n                            ],\n                            [\n                                \"is_paused\",\n                                \"If the game is paused.\"\n                            ],\n                            [\n                                \"is_hovered\",\n                                \"If the entity is being hovered over.\"\n                            ]\n                        ]\n                    },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Functions\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": [\n                            [\n                                \"catch(x, c, id)\",\n                                \"Returns x if x is not NaN or has an Error, otherwise returns c. id is optional, if it is added the catch function will print the reason c was used to the game log with this id.\"\n                            ],\n                            [\n                                \"wrapdeg(x)\",\n                                \"Wraps the degree value x to the range -180 to 180 that it matches.\"\n                            ],\n                            [\n                                \"wraprad(x)\",\n                                \"Wraps the radian value x to the range -pi to pi that it matches.\"\n                            ],\n                            [\n                                \"degdiff(x, y)\",\n                                \"Returns the shortest angular degree difference between two degree values x and y.\"\n                            ],\n                            [\n                                \"raddiff(x, y)\",\n                                \"Returns the shortest angular radian difference between two radian values x and y.\"\n                            ],\n                            [\n                                \"keyframe(k, a, b, c,...)\",\n                                \"Smoothly interpolates between values based on the current frame 'k' and the keyframes. 'a' is 'k=0', 'b' is 'k=1', 'c' is 'k=2' etc.\"\n                            ],\n                            [\n                                \"keyframeloop(k, a, b, c,...)\",\n                                \"Smoothly interpolates between values based on the current frame 'k' and the keyframes. 'a' is 'k=0', 'b' is 'k=1', 'c' is 'k=2' etc. The keyframes will loop back around from the start and end values.\"\n                            ]\n                        ]\n                    },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Boolean functions\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": [\n                            [\n                                \"randomb(seed)\",\n                                \"Random boolean true|false. Providing a seed will always return the same result. The seed is optional.\"\n                            ],\n                            [\n                                \"nbt(key, test)\",\n                                \"Works exactly like the nbt random property such that `models.1.SaddleItem=exits:false` will be `nbt(SaddleItem,exists:false)`. THIS IS BROKEN IN THE CEM TEMPLATE LOADER EDITOR. Always leave the function empty here!\"\n                            ]\n                        ]\n                    },\n                    {\n                        \"type\": \"heading\",\n                        \"text\": \"Interpolation functions\"\n                    },\n                    {\n                        \"type\": \"text\",\n                        \"text\": \"EMF adds multiple variations of the <strong>lerp(k, x, y)</strong> interpolation function, most of these can be seen in more detail, and with interactive graphs, on <span style=\\\"color:dodgerblue\\\"><a href=\\\"https://easings.net/\\\">this website</a></span>\"\n                    },\n                    {\n                        \"type\": \"table\",\n                        \"tableType\": \"list\",\n                        \"rows\": getEaseFuncs()\n                    },\n                ]\n            }\n\n            setTimeout(load, 0)\n        },\n        onunload : unload\n    })\n\n    function getEaseFuncs() {\n        let easeFuncs = []\n        for (const val of Object.values(functionHints)) {\n            if (val.startsWith(\"ease\")) {\n                easeFuncs.push([\n                    val,\n                    \"\"\n                ])\n            }\n        }\n\n        easeFuncs.push([\n            \"quadbezier(k, x, y, z)\",\n            \"\"\n        ])\n        easeFuncs.push([\n            \"cubicbezier(k, x, y, z, w)\",\n            \"\"\n        ])\n        easeFuncs.push([\n            \"hermite(k, x, y, z, w)\",\n            \"\"\n        ])\n        easeFuncs.push([\n            \"catmullrom(k, x, y, z, w)\",\n            \"\"\n        ])\n\n        return easeFuncs\n    }\n\n    function load() {\n        if (settings.emf_features.value) {\n            //add autocompletes - auto generated\n            for (const key of Object.keys(ranges)) optifineAnimationVariables.autocomplete.push(key)\n            for (const key of Object.keys(constants)) optifineAnimationVariables.autocomplete.push(typeof constants[key] === \"function\" ? `${key}()` : key)\n            //add autocompletes - manual\n            Object.assign(optifineAnimationVariables.autocompleteLabels, functionHints)\n\n            //add variables and functions\n            Object.assign(optifineAnimationVariables.constants, constants)\n            Object.assign(optifineAnimationVariables.ranges, ranges)\n\n            //add booleans\n            for (const boolean of booleans) {\n                optifineAnimationVariables.booleans.add(boolean)\n                //add autocomplete\n                optifineAnimationVariables.autocomplete.push(boolean)\n            }\n            for (const boolean of enabledBooleans) {\n                optifineAnimationVariables.booleans.add(boolean)\n                optifineAnimationVariables.enabledBooleans.add(boolean)\n                //add autocomplete\n                optifineAnimationVariables.autocomplete.push(boolean)\n            }\n            //add  animation documentation\n            optifineAnimationDocumentation.custom.push(animDocs)\n            optifineAnimationDocumentation.shown = false\n        }\n        setTimeout(() => {\n            if (Format.id === \"optifine_entity\") {\n                Panels.cem_animation.inside_vue.change()\n            }\n        }, 0)\n    }\n\n    function unload() {\n\n        //remove auto completes\n        for (const key of Object.keys(ranges))\n            globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(key), 1)\n        for (const key of Object.keys(constants)) {\n            globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(typeof constants[key] === \"function\" ? `${key}()` : key), 1)\n        }\n        for (const key of Object.keys(functionHints)) delete globalThis.optifineAnimationVariables?.autocompleteLabels[key]\n\n        //remove functions and variables\n        for (const key of Object.keys(constants)) delete globalThis.optifineAnimationVariables?.constants[key]\n        for (const key of Object.keys(ranges)) delete globalThis.optifineAnimationVariables?.ranges[key]\n\n        //remove booleans\n        for (const boolean of booleans) {\n            globalThis.optifineAnimationVariables?.booleans.delete(boolean)\n            //remove auto complete\n            globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(boolean), 1)\n        }\n        for (const boolean of enabledBooleans) {\n            globalThis.optifineAnimationVariables?.booleans.delete(boolean)\n            globalThis.optifineAnimationVariables?.enabledBooleans.delete(boolean)\n            //remove auto complete\n            globalThis.optifineAnimationVariables?.autocomplete.splice(globalThis.optifineAnimationVariables?.autocomplete.indexOf(boolean), 1)\n        }\n\n        //remove docs //todo needed?\n        globalThis.optifineAnimationDocumentation?.custom.splice(globalThis.optifineAnimationDocumentation?.custom.indexOf(animDocs), 1)\n        globalThis.optifineAnimationDocumentation.shown = false\n    }\n\n    function keyframeLoop(k, ...args) {\n        if (args.length < 2) throw Error\n        if (typeof k !== \"number\") throw Error\n\n        let frameCount = args.length;\n\n        let deltaFloor = Math.floor(k);\n\n        let baseFrame =     args[(deltaFloor       % frameCount + frameCount) % frameCount];\n        let beforeFrame =   args[((deltaFloor - 1) % frameCount + frameCount) % frameCount];\n        let nextFrame =     args[((deltaFloor + 1) % frameCount + frameCount) % frameCount];\n        let afterFrame =    args[((deltaFloor + 2) % frameCount + frameCount) % frameCount];\n\n        let individualFrameDelta = optifineAnimationVariables.constants.frac(k);\n\n        return catmullrom(individualFrameDelta, beforeFrame, baseFrame, nextFrame, afterFrame);\n    }\n\n    function catmullrom(f, g, h, i, j) {\n        return 0.5 * (2.0 * h + (i - g) * f + (2.0 * g - 5.0 * h + 4.0 * i - j) * f * f + (3.0 * h - g - 3.0 * i + j) * f * f * f);\n    }\n\n\n    function wrapDegrees(degrees) {\n        let d = degrees % 360.0;\n        if (d >= 180.0) {\n            d -= 360.0;\n        }\n        if (d < -180.0) {\n            d += 360.0;\n        }\n        return d;\n    }\n\n\n    function angleBetween(first, second) {\n        let v = wrapDegrees(second - first);\n        return v < 0 ? -v : v\n    }\n\n    function easeInQuad(t, start, end) {\n        let delta = end - start;\n        return start + delta * t * t;\n    }\n\n    function easeOutQuad(t, start, end) {\n        let delta = end - start;\n        return start + delta * -t * (t - 2);\n    }\n\n    function easeInOutQuad(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * (2 * t * t);\n        } else {\n            return start + delta * (-2 * t * (t - 2) - 1);\n        }\n    }\n\n    function easeInCubic(t, start, end) {\n        let delta = end - start;\n        return start + delta * t * t * t;\n    }\n\n    function easeOutCubic(t, start, end) {\n        let delta = end - start;\n        return start + delta * ((t = t - 1) * t * t + 1);\n    }\n\n    function easeInOutCubic(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * 4 * t * t * t;\n        } else {\n            return start + delta * ((t = t - 1) * (2 * t * t + 2) + 1);\n        }\n    }\n\n    function easeInQuart(t, start, end) {\n        let delta = end - start;\n        return start + delta * t * t * t * t;\n    }\n\n    function easeOutQuart(t, start, end) {\n        let delta = end - start;\n        return start + delta * ((t = t - 1) * t * t * t + 1);\n    }\n\n    function easeInOutQuart(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * 8 * t * t * t * t;\n        } else {\n            return start + delta * ((t = t - 1) * (8 * t * t * t + 1) + 1);\n        }\n    }\n\n    function easeInQuint(t, start, end) {\n        let delta = end - start;\n        return start + delta * t * t * t * t * t;\n    }\n\n    function easeOutQuint(t, start, end) {\n        let delta = end - start;\n        return start + delta * ((t = t - 1) * t * t * t * t + 1);\n    }\n\n    function easeInOutQuint(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * 16 * t * t * t * t * t;\n        } else {\n            return start + delta * ((t = t - 1) * (16 * t * t * t * t + 1) + 1);\n        }\n    }\n\n    function easeInSine(t, start, end) {\n        let delta = end - start;\n        return start + delta * (1 - Math.cos(t * Math.PI / 2));\n    }\n\n    function easeOutSine(t, start, end) {\n        let delta = end - start;\n        return start + delta * Math.sin(t * Math.PI / 2);\n    }\n\n    function easeInOutSine(t, start, end) {\n        let delta = end - start;\n        return start + delta * (-0.5 * (Math.cos(Math.PI * t) - 1));\n    }\n\n    function easeInExpo(t, start, end) {\n        let delta = end - start;\n        return start + delta * Math.pow(2, 10 * (t - 1));\n    }\n\n    function easeOutExpo(t, start, end) {\n        let delta = end - start;\n        return start + delta * (-Math.pow(2, -10 * t) + 1);\n    }\n\n    function easeInOutExpo(t, start, end) {\n        let delta = end - start;\n        if (t < 1) {\n            return start + delta * (0.5 * Math.pow(2, 10 * (t - 1)));\n        } else {\n            return start + delta * (0.5 * (-Math.pow(2, -10 * --t) + 2));\n        }\n    }\n\n    function easeInCirc(t, start, end) {\n        let delta = end - start;\n        return start + delta * -(Math.sqrt(1 - t * t) - 1);\n    }\n\n    function easeOutCirc(t, start, end) {\n        let delta = end - start;\n        let tMinus1 = t - 1;\n        return start + delta * Math.sqrt(1 - tMinus1 * tMinus1);\n    }\n\n    function easeInOutCirc(t, start, end) {\n        let delta = end - start;\n        let tTimes2 = t * 2;\n        if (tTimes2 < 1) {\n            return start + delta * (-0.5 * (Math.sqrt(1 - tTimes2 * tTimes2) - 1));\n        } else {\n            let tTimes2Minus2 = tTimes2 - 2;\n            return start + delta * (0.5 * (Math.sqrt(1 - tTimes2Minus2 * tTimes2Minus2) + 1));\n        }\n    }\n\n    function easeInElastic(t, start, end) {\n        let delta = end - start;\n        return start + delta * (-Math.pow(2, 10 * (t -= 1)) * Math.sin((t - 0.3 / 4) * (2 * Math.PI) / 0.3));\n    }\n\n    function easeOutElastic(t, start, end) {\n        let delta = end - start;\n        return start + delta * (Math.pow(2, -10 * t) * Math.sin((t - 0.3 / 4) * (2 * Math.PI) / 0.3) + 1);\n    }\n\n    function easeInOutElastic(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * (-0.5 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - 0.225 / 4) * (2 * Math.PI) / 0.45));\n        } else {\n            return start + delta * (0.5 * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - 0.225 / 4) * (2 * Math.PI) / 0.45) + 1);\n        }\n    }\n\n    function easeInBounce(t, start, end) {\n        let delta = end - start;\n        return start + delta * (1 - easeOutBounce(1 - t, 0, 1));\n    }\n\n    function easeOutBounce(t, start, end) {\n        let delta = end - start;\n        if (t < (1 / 2.75)) {\n            return start + delta * (7.5625 * t * t);\n        } else if (t < (2 / 2.75)) {\n            return start + delta * (7.5625 * (t -= (1.5 / 2.75)) * t + .75);\n        } else if (t < (2.5 / 2.75)) {\n            return start + delta * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375);\n        } else {\n            return start + delta * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375);\n        }\n    }\n\n    function easeInOutBounce(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * (0.5 * easeInBounce(t * 2, 0, 1));\n        } else {\n            return start + delta * (0.5 * easeOutBounce(t * 2 - 1, 0, 1) + 0.5);\n        }\n    }\n\n    function easeInBack(t, start, end) {\n        let delta = end - start;\n        return start + delta * (t * t * (2.70158 * t - 1.70158));\n    }\n\n    function easeOutBack(t, start, end) {\n        let delta = end - start;\n        return start + delta * ((--t) * t * (2.70158 * t + 1.70158) + 1);\n    }\n\n    function easeInOutBack(t, start, end) {\n        let delta = end - start;\n        if (t < 0.5) {\n            return start + delta * (t * t * (7 * t - 2.5) * 2);\n        } else {\n            return start + delta * ((--t) * t * (7 * t + 2.5) + 2);\n        }\n    }\n\n    function quadraticBezier(t, p0, p1, p2) {\n        let oneMinusT = 1 - t;\n        return oneMinusT * oneMinusT * p0 + 2 * oneMinusT * t * p1 + t * t * p2;\n    }\n\n    function cubicBezier(t, p0, p1, p2, p3) {\n        let oneMinusT = 1 - t;\n        let oneMinusTSquared = oneMinusT * oneMinusT;\n        let tSquared = t * t;\n        return oneMinusTSquared * oneMinusT * p0 + 3 * oneMinusTSquared * t * p1 + 3 * oneMinusT * tSquared * p2 + tSquared * t * p3;\n    }\n\n    function hermiteInterpolation(t, p0, p1, m0, m1) {\n        let tSquared = t * t;\n        let tCubed = tSquared * t;\n\n        let h00 = 2 * tCubed - 3 * tSquared + 1;\n        let h10 = tCubed - 2 * tSquared + t;\n        let h01 = -2 * tCubed + 3 * tSquared;\n        let h11 = tCubed - tSquared;\n\n        return h00 * p0 + h10 * m0 + h01 * p1 + h11 * m1;\n    }\n\n})()\n\n\n"
  },
  {
    "path": "plugins/emf_animation_addon/members.yml",
    "content": "maintainers:\n  - Traben-0\n  - ewanhowell5195\ndevelopers:\n  - Traben-0\n  - ewanhowell5195"
  },
  {
    "path": "plugins/endimations_exporter.js",
    "content": "(function () {\n\tlet exportEndimations;\n\n\tPlugin.register('endimations_exporter', {\n\t\ttitle: 'Endimator Animations Exporter',\n\t\tauthor: 'SmellyModder',\n\t\ticon: 'icon-format_java',\n\t\tdescription: 'Exports Blockbench animations as the JSON format for Endimator animations from the Blueprint Mod Library. https://github.com/team-abnormals/blueprint',\n\t\tabout: 'Go to Animation -> Export Endimations...',\n\t\ttags: [\"Minecraft: Java Edition\"],\n\t\tversion: '1.0.0',\n\t\tmin_version: '4.0.0',\n\t\tvariant: 'both',\n\t\tonload() {\n\t\t\texportEndimations = new Action('export_endimations', {\n\t\t\t\tname: 'Export Endimations...',\n\t\t\t\tdescription: 'Export a selection of animations as endimations',\n\t\t\t\ticon: 'movie',\n\t\t\t\tclick: function () {\n\t\t\t\t\tconst animations = Animation.all.slice()\n\t\t\t\t\tlet keys = [];\n\t\t\t\t\tconst form = {};\n\t\t\t\t\tif (Format.animation_files) {\n\t\t\t\t\t\tanimations.sort((a1, a2) => a1.path.hashCode() - a2.path.hashCode())\n\t\t\t\t\t}\n\t\t\t\t\tanimations.forEach(animation => {\n\t\t\t\t\t\tconst key = animation.name;\n\t\t\t\t\t\tkeys.push(key)\n\t\t\t\t\t\tform[key.hashCode()] = {label: key, type: 'checkbox', value: true};\n\t\t\t\t\t})\n\t\t\t\t\tconst singleFile = \"single_file\".hashCode();\n\t\t\t\t\tform[singleFile] = {label: \"Single File\", type: 'checkbox', value: false}\n\t\t\t\t\tconst dialog = new Dialog({\n\t\t\t\t\t\tid: 'animation_export',\n\t\t\t\t\t\ttitle: 'dialog.animation_export.title',\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tonConfirm(form_result) {\n\t\t\t\t\t\t\tdialog.hide();\n\t\t\t\t\t\t\tkeys = keys.filter(key => form_result[key.hashCode()])\n\t\t\t\t\t\t\tif (form_result[singleFile]) {\n\t\t\t\t\t\t\t\tconst endimations = {};\n\t\t\t\t\t\t\t\tAnimator.animations.forEach(function (animation) {\n\t\t\t\t\t\t\t\t\tif (!keys || !keys.length || keys.includes(animation.name)) {\n\t\t\t\t\t\t\t\t\t\tendimations[animation.name] = compileEndimation(animation);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tBlockbench.export({\n\t\t\t\t\t\t\t\t\tresource_id: 'animation',\n\t\t\t\t\t\t\t\t\ttype: 'JSON Animation',\n\t\t\t\t\t\t\t\t\textensions: ['json'],\n\t\t\t\t\t\t\t\t\tname: (Project.geometry_name || 'endimations'),\n\t\t\t\t\t\t\t\t\tcontent: autoStringify(endimations),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tAnimator.animations.forEach(function (animation) {\n\t\t\t\t\t\t\t\t\tif (!keys || !keys.length || keys.includes(animation.name)) {\n\t\t\t\t\t\t\t\t\t\tBlockbench.export({\n\t\t\t\t\t\t\t\t\t\t\tresource_id: 'animation',\n\t\t\t\t\t\t\t\t\t\t\ttype: 'JSON Animation',\n\t\t\t\t\t\t\t\t\t\t\textensions: ['json'],\n\t\t\t\t\t\t\t\t\t\t\tname: animation.name,\n\t\t\t\t\t\t\t\t\t\t\tcontent: autoStringify(compileEndimation(animation)),\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tdialog.show();\n\t\t\t\t}\n\t\t\t});\n\t\t\tMenuBar.addAction(exportEndimations, 'animation');\n\t\t},\n\t\tonunload() {\n\t\t\texportEndimations.delete();\n\t\t}\n\t});\n\n\tfunction compileEndimation(animation) {\n\t\tconst endimation = {};\n\t\tconst length = animation.length;\n\t\tif (length) {\n\t\t\tendimation.length = length;\n\t\t}\n\t\tconst blendWeight = animation.blend_weight;\n\t\tif (blendWeight) {\n\t\t\tendimation.blend_weight = parseFloat(blendWeight);\n\t\t}\n\t\tconst animators = animation.animators;\n\t\tconst parts = {};\n\t\tfor (const uuid in animators) {\n\t\t\tconst animator = animators[uuid];\n\t\t\tif (animator instanceof BoneAnimator) {\n\t\t\t\tconst keyframes = animator.keyframes;\n\t\t\t\tif (keyframes.length) {\n\t\t\t\t\tconst group = animator.getGroup();\n\t\t\t\t\tconst part = parts[group ? group.name : animator.name] = {};\n\t\t\t\t\tconst channels = {};\n\t\t\t\t\tkeyframes.forEach(function (kf) {\n\t\t\t\t\t\tconst channel = kf.channel;\n\t\t\t\t\t\tif (!channels[channel]) {\n\t\t\t\t\t\t\tchannels[channel] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (kf.transform) {\n\t\t\t\t\t\t\tlet endimatorKeyframe;\n\t\t\t\t\t\t\tconst timecodeString = kf.getTimecodeString();\n\t\t\t\t\t\t\tif (kf.data_points.length === 1) {\n\t\t\t\t\t\t\t\tendimatorKeyframe = {\n\t\t\t\t\t\t\t\t\ttime: parseFloat(timecodeString),\n\t\t\t\t\t\t\t\t\ttransform: kf.getArray(),\n\t\t\t\t\t\t\t\t\tinterpolation: {\n\t\t\t\t\t\t\t\t\t\ttype: kf.interpolation\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tendimatorKeyframe = {\n\t\t\t\t\t\t\t\t\ttime: parseFloat(timecodeString),\n\t\t\t\t\t\t\t\t\ttransform: {\n\t\t\t\t\t\t\t\t\t\tpre: kf.getArray(0),\n\t\t\t\t\t\t\t\t\t\tpost: kf.getArray(1),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tinterpolation: {\n\t\t\t\t\t\t\t\t\t\ttype: kf.interpolation\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tchannels[channel][timecodeString] = endimatorKeyframe;\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tfor (const channel in Animator.possible_channels) {\n\t\t\t\t\t\tconst timecodes = channels[channel];\n\t\t\t\t\t\tif (timecodes) {\n\t\t\t\t\t\t\tObject.keys(timecodes).sort((a, b) => parseFloat(a) - parseFloat(b)).forEach((timecode) => {\n\t\t\t\t\t\t\t\tif (!part[channel]) {\n\t\t\t\t\t\t\t\t\tpart[channel] = [];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tpart[channel].push(timecodes[timecode]);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(parts).length > 0) {\n\t\t\tendimation.parts = parts;\n\t\t}\n\t\treturn endimation;\n\t}\n})();"
  },
  {
    "path": "plugins/expand_bone_timeline/about.md",
    "content": "# Expand Bone Timeline\n\nA Blockbench plugin that speeds up animation workflow by adding or removing a bone and all its descendant bone animators from the Timeline with a single click.\n\n## What it does\n\nIn Animate mode, right-click a bone group in the Outliner to reveal two new context menu options under the **Settings** section (alongside *Add All to Timeline*):\n\n- **Show Child Animators** — Adds the selected bone and all of its descendant bones (children, grandchildren, etc.) that have keyframe data in the current animation to the Timeline.\n- **Hide Child Animators** — Removes the selected bone and all of its descendants from the Timeline.\n\nThis makes it much easier to work with complex rigs where related bones are grouped under a parent, such as an arm chain, finger hierarchy, or a multi-part tail.\n\nBoth actions also work as keybindings or toolbar buttons. To bind a shortcut, go to **File → Preferences → Keybindings** and search for *Show Child Animators* or *Hide Child Animators*.\n\n## Installation\n\n1. Open Blockbench\n2. Go to **File → Plugins**\n3. Switch to the **Available** tab\n4. Search for **Expand Bone Timeline**\n5. Click **Install**\n\n## Usage\n\n1. Open a model with animations\n2. Switch to **Animate** mode\n3. Select an animation\n4. Right-click a bone group in the **Outliner**\n5. Click **Show Child Animators** or **Hide Child Animators**\n\n## Notes\n\n- Only descendant bones that have actual keyframe data in the currently selected animation will be shown. Empty bones are skipped.\n- The menu options only appear when in Animate mode with an animation selected.\n- Works with both Blockbench Desktop and Web versions.\n\n## License\n\nMIT\n"
  },
  {
    "path": "plugins/expand_bone_timeline/expand_bone_timeline.js",
    "content": "(function () {\n\tlet expandAction, collapseAction;\n\n\tBBPlugin.register('expand_bone_timeline', {\n\t\ttitle: 'Expand Bone Timeline',\n\t\tauthor: 'zzz1999',\n\t\tdescription: 'Show or hide a bone and all its child bone animators in the timeline from the outliner context menu.',\n\t\ticon: 'account_tree',\n\t\ttags: ['Animation', 'Timeline'],\n\t\tversion: '2.2.0',\n\t\tmin_version: '4.8.0',\n\t\tvariant: 'both',\n\t\tcreation_date: '2026-03-21',\n\t\thas_changelog: false,\n\t\trepository: 'https://github.com/zzz1999/expand_bone_timeline',\n\t\tbug_tracker: 'https://github.com/zzz1999/expand_bone_timeline/issues',\n\n\t\tonload() {\n\t\t\texpandAction = new Action('expand_bone_animators', {\n\t\t\t\tname: 'Show Child Animators',\n\t\t\t\tdescription: 'Show this bone and all child bone animators in the timeline',\n\t\t\t\ticon: 'unfold_more',\n\t\t\t\tcategory: 'animation',\n\t\t\t\tcondition: {modes: ['animate'], selected: {animation: true}},\n\t\t\t\tclick() {\n\t\t\t\t\tconst groups = Group.multi_selected;\n\t\t\t\t\tif (!groups.length) return;\n\t\t\t\t\tfor (const group of groups) {\n\t\t\t\t\t\texpandDescendantAnimators(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcollapseAction = new Action('collapse_bone_animators', {\n\t\t\t\tname: 'Hide Child Animators',\n\t\t\t\tdescription: 'Remove this bone and all child bone animators from the timeline',\n\t\t\t\ticon: 'unfold_less',\n\t\t\t\tcategory: 'animation',\n\t\t\t\tcondition: {modes: ['animate'], selected: {animation: true}},\n\t\t\t\tclick() {\n\t\t\t\t\tconst groups = Group.multi_selected;\n\t\t\t\t\tif (!groups.length) return;\n\t\t\t\t\tfor (const group of groups) {\n\t\t\t\t\t\tcollapseGroup(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tGroup.prototype.menu.addAction(expandAction, '#settings');\n\t\t\tGroup.prototype.menu.addAction(collapseAction, '#settings');\n\t\t},\n\n\t\tonunload() {\n\t\t\texpandAction.delete();\n\t\t\tcollapseAction.delete();\n\t\t}\n\t});\n\n\tfunction getAllDescendantGroups(group) {\n\t\tconst result = [];\n\t\tif (!group.children) return result;\n\t\tfor (const child of group.children) {\n\t\t\tif (child instanceof Group) {\n\t\t\t\tresult.push(child);\n\t\t\t\tresult.push(...getAllDescendantGroups(child));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction expandDescendantAnimators(parentGroup) {\n\t\tconst animation = Animation.selected;\n\t\tif (!animation) return;\n\n\t\tconst allGroups = [parentGroup, ...getAllDescendantGroups(parentGroup)];\n\n\t\tfor (const group of allGroups) {\n\t\t\tconst animator = animation.getBoneAnimator(group);\n\t\t\tif (animator && animator.keyframes && animator.keyframes.length > 0) {\n\t\t\t\tanimator.addToTimeline();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction collapseGroup(parentGroup) {\n\t\tconst allGroups = [parentGroup, ...getAllDescendantGroups(parentGroup)];\n\t\tconst uuidsToRemove = new Set(allGroups.map(g => g.uuid));\n\n\t\tTimeline.animators.slice().forEach(animator => {\n\t\t\tif (uuidsToRemove.has(animator.uuid)) {\n\t\t\t\tTimeline.animators.remove(animator);\n\t\t\t}\n\t\t});\n\n\t\tTickUpdates.keyframe_selection = true;\n\t}\n\n})();\n"
  },
  {
    "path": "plugins/explorer/about.md",
    "content": "Use the folder icon in the left corner of the tab bar to open the explorer.\n\nClick files to peak into them, double click to jump into the file.\n\nRight click a file to bring up the context menu."
  },
  {
    "path": "plugins/explorer/changelog.json",
    "content": "{\n\t\"1.0.0\": {\n\t\t\"title\": \"1.0.0\",\n\t\t\"date\": \"2023-01-17\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Initial release\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.1.0\": {\n\t\t\"title\": \"1.1.0\",\n\t\t\"date\": \"2026-04-15\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added support for deep search (can be turned off in settings)\",\n\t\t\t\t\t\"Updated design\",\n\t\t\t\t\t\"Added Favorites list\",\n\t\t\t\t\t\"Replaced Back button with Back to and Up to buttons\",\n\t\t\t\t\t\"Added Drop In option to file context menu, which is the equivalent of drag-and-dropping the file into Blockbench\",\n\t\t\t\t\t\"Added Open File Location option in file context menu\",\n\t\t\t\t\t\"Display loading status and errors messages\",\n\t\t\t\t\t\"Added support for more image extensions\",\n\t\t\t\t\t\"Added Hytale icons\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed broken context menu options which require shell access\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "plugins/explorer/explorer.js",
    "content": "(function() {\n\nlet deletables = [];\nlet resize_line;\nlet sidebar_button;\n\nconst FAV_KEY = 'explorer.favorites';\n\nBBPlugin.register('explorer', {\n\ttitle: 'Explorer',\n\ticon: 'fas.fa-folder-open',\n\tauthor: 'JannisX11',\n\tdescription: 'Navigate the files in your project from the sidebar in Blockbench!',\n\ttags: [\"Files\"],\n\tversion: '1.1.0',\n\tmin_version: '5.1.0',\n\tvariant: 'desktop',\n\thas_changelog: true,\n\tonload() {\n\n\t\tStateMemory.init(FAV_KEY, 'array');\n\n\t\tfunction getFileIcon(dirent) {\n\t\t\tlet ext = dirent.name.split('.').last().toLowerCase();\n\t\t\tlet icon_name = 'insert_drive_file';\n\t\t\tlet color;\n\t\t\tswitch (ext) {\n\t\t\t\tcase 'bbmodel': icon_name = 'icon-blockbench_inverted'; color = '#a3cad9'; break;\n\t\t\t\tcase 'json': icon_name = 'icon-format_block'; color = '#62a5df'; break;\n\t\t\t\tcase 'jem': icon_name = 'icon-optifine_file'; color = '#df628a'; break;\n\t\t\t\tcase 'jpm': icon_name = 'icon-optifine_file'; color = '#df628a'; break;\n\t\t\t\tcase 'java': icon_name = 'icon-format_java'; color = '#dfd022'; break;\n\t\t\t\tcase 'blockymodel': icon_name = 'icon-format_hytale'; color = '#aea0ffff'; break;\n\t\t\t\tcase 'blockyanim': icon_name = 'movie'; color = '#97eaf5ff'; break;\n\t\t\t\tcase 'png': icon_name = 'image'; color = '#42ab8d'; break;\n\t\t\t}\n\t\t\tif (dirent.isDirectory()) {\n\t\t\t\ticon_name = 'folder';\n\t\t\t\tcolor = '#c3a670';\n\t\t\t}\n\t\t\tif (dirent.name.endsWith('.geo.json')) {\n\t\t\t\ticon_name = 'icon-format_bedrock';\n\t\t\t\tcolor = '#e3815b';\n\t\t\t}\n\t\t\tif (icon_name == 'insert_drive_file' && Codec.getAllExtensions().includes(ext)) {\n\t\t\t\ticon_name = 'description';\n\t\t\t}\n\n\t\t\treturn Blockbench.getIconNode(icon_name, color);\n\t\t}\n\n\t\tfunction getDragHandler(file) {\n\t\t\tlet lower_case_name = file.name.toLowerCase();\n\t\t\tfor (let key in Filesystem.drag_handlers) {\n\t\t\t\tif (key == 'model') continue;\n\t\t\t\tlet handler = Filesystem.drag_handlers[key];\n\t\t\t\tif (!Condition(handler.condition)) continue;\n\t\t\t\tlet extensions = typeof handler.extensions == 'function' ? handler.extensions() : handler.extensions;\n\t\t\t\tif (extensions && !extensions.some(ext => lower_case_name.endsWith(ext))) continue;\n\t\t\t\tif (handler.element) continue;\n\t\t\t\treturn handler;\n\t\t\t}\n\t\t}\n\n\t\tlet css = Blockbench.addCSS(`\n\t\t\t.sidebar_explorer_open_button {\n\t\t\t\theight: 100%;\n\t\t\t\tpadding-top: 2px;\n\t\t\t}\n\t\t\t#sidebar_explorer {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\twidth: 350px;\n\t\t\t\tbottom: 0;\n\t\t\t\ttop: 25px;\n\t\t\t\tleft: 0;\n\t\t\t\tbackground-color: var(--color-ui);\n\t\t\t\tbox-shadow: 10px 4px 44px rgb(0 0 0 / 42%), 500px 0px 500px 2000px rgb(0 0 0 / 15%);\n\t\t\t\ttransition: left 120ms ease-out, box-shadow 120ms linear;\n\t\t\t\twidth: var(--width);\n\t\t\t\tborder-radius: 7px;\n\t\t\t}\n\t\t\t#sidebar_explorer:not(.visible) {\n\t\t\t\tbox-shadow: none;\n\t\t\t\tleft: calc(var(--width) * -1);\n\t\t\t}\n\t\t\t#sidebar_explorer .bar {\n\t\t\t\tpadding: 0px 4px;\n\t\t\t\tmargin-top: 9px;\n\t\t\t}\n\t\t\t#sidebar_explorer ul.list {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tpadding: 5px;\n\t\t\t}\n\t\t\tli.sidebar_explorer_file {\n\t\t\t\tdisplay: flex;\n\t\t\t\theight: 30px;\n\t\t\t\tpadding: 1px 10px;\n\t\t\t\tgap: 5px;\n\t\t\t\talign-items: center;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: 5px;\n\t\t\t}\n\t\t\tli.sidebar_explorer_file.unsupported {\n\t\t\t\tcolor: var(--color-subtle_text);\n\t\t\t}\n\t\t\tli.sidebar_explorer_file:hover {\n\t\t\t\tbackground-color: var(--color-ui);\n\t\t\t\tcolor: var(--color-light);\n\t\t\t}\n\t\t\tli.sidebar_explorer_file.selected {\n\t\t\t\tbackground-color: var(--color-selected);\n\t\t\t}\n\t\t\tli.sidebar_explorer_file span {\n\t\t\t\tflex-grow: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tcursor: inherit;\n\t\t\t\tdirection: initial;\n\t\t\t}\n\t\t\tli.sidebar_explorer_file i {\n\t\t\t\theight: 24px;\n\t\t\t}\n\t\t\t.sidebar_explorer_is_open_icon {\n\t\t\t\tcolor: var(--color-subtle_text);\n\t\t\t\tfont-size: 13px;\n\t\t\t\tpadding: 5px;\n\t\t\t\twidth: 20px;\n\t\t\t}\n\n\t\t\t#sidebar_explorer .sidebar_explorer_location {\n\t\t\t\toverflow: hidden;\n\t\t\t\tjustify-content: right;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\toverflow-x: scroll;\n\t\t\t\tdirection: rtl;\n\t\t\t\theight: 32px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tpadding-left: 6px;\n\t\t\t\tpadding-right: 6px;\n\t\t\t}\n\t\t\t.sidebar_explorer_location::-webkit-scrollbar {\n\t\t\t\theight: 7px;\n\t\t\t}\n\t\t\t.sidebar_explorer_location > span {\n\t\t\t\tpadding: 3px 0;\n\t\t\t\tcursor: pointer;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\t\t\t.sidebar_explorer_location > span:first-child {\n\t\t\t\tmargin-right: auto;\n\t\t\t}\n\t\t\t.sidebar_explorer_location > span:hover {\n\t\t\t\tcolor: var(--color-light);\n\t\t\t\tbackground-color: var(--color-ui);\n\t\t\t}\n\t\t\t.sidebar_explorer_location > span::after {\n\t\t\t\tcontent: \"\\\\f105\";\n\t\t\t\tfont-family: 'Font Awesome 6 Free';\n\t\t\t\tfont-weight: 900;\n\t\t\t\tcolor: var(--color-subtle_text);\n\t\t\t\tmargin: 0 7px;\n\t\t\t\tvertical-align: baseline;\n\t\t\t}\n\t\t\t.sidebar_explorer_location > span:first-child::after {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t`);\n\t\tdeletables.push(css);\n\n\t\tconst setting_search_deep = new Setting('explorer_search_deep', {\n\t\t\tname: 'Explorer: Search Deep',\n\t\t\tdescription: 'Include all sub folders of the current directory when using the search bar',\n\t\t\ttype: 'toggle',\n\t\t\tvalue: true,\n\t\t\tcategory: 'application',\n\t\t\tplugin: 'explorer'\n\t\t});\n\t\tdeletables.push(setting_search_deep);\n\t\t\n\t\tlet temp_tab = null;\n\t\tlet open_timeout = '';\n\t\tlet explorer = new ShapelessDialog('sidebar_explorer', {\n\t\t\tdarken: false,\n\t\t\tkeyboard_actions: {\n\t\t\t\tenter: {\n\t\t\t\t\tkeybind: new Keybind({key: 13}),\n\t\t\t\t\trun(event) {\n\t\t\t\t\t\tlet vue = this.content_vue;\n\t\t\t\t\t\tlet path = vue.selected[0];\n\t\t\t\t\t\tlet file = path && vue.files.find(file => file.path == path);\n\t\t\t\t\t\tif (file) {\n\t\t\t\t\t\t\tvue.dblClickFile(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tcomponent: {\n\t\t\t\tdata() {return {\n\t\t\t\t\tpath: '',\n\t\t\t\t\tdirectory: [],\n\t\t\t\t\tdirectory_recursive: null,\n\t\t\t\t\tselected: [],\n\t\t\t\t\thistory: [],\n\t\t\t\t\tsearch_term: '',\n\t\t\t\t\twidth: 350,\n\t\t\t\t\tmax_files: 500,\n\t\t\t\t\tscan_error: false,\n\t\t\t\t\tloading: true,\n\t\t\t\t\trecursive_cached: false,\n\n\t\t\t\t\tfile_menu: new Menu([\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'open',\n\t\t\t\t\t\t\tname: 'Open',\n\t\t\t\t\t\t\ticon: 'open_in_browser',\n\t\t\t\t\t\t\tclick: (file, a) => {\n\t\t\t\t\t\t\t\tthis.clickFile(file);\n\t\t\t\t\t\t\t\tthis.dblClickFile(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'load_as',\n\t\t\t\t\t\t\tname: 'Load As...',\n\t\t\t\t\t\t\ticon: 'add_photo_alternate',\n\t\t\t\t\t\t\tcondition: (file) => {\n\t\t\t\t\t\t\t\tlet name = file.name.toLowerCase();\n\t\t\t\t\t\t\t\tif (!name || !Texture.getAllExtensions) return false;\n\t\t\t\t\t\t\t\treturn Texture.getAllExtensions().some(ext => name.endsWith('.'+ext));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tclick(file) {\n\t\t\t\t\t\t\t\tloadImages([{path: file.path, name: file.name}])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'drop_in',\n\t\t\t\t\t\t\tname: 'Drop In',\n\t\t\t\t\t\t\ticon: 'system_update_alt',\n\t\t\t\t\t\t\tcondition: file => file.type == 'file' && getDragHandler(file),\n\t\t\t\t\t\t\tclick(file) {\n\t\t\t\t\t\t\t\tlet handler = getDragHandler(file);\n\t\t\t\t\t\t\t\tFilesystem.readFile([file.path], {extensions: handler.extensions, readtype: handler.readtype}, files => {\n\t\t\t\t\t\t\t\t\thandler.cb(files);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'_',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'open_externally',\n\t\t\t\t\t\t\tname: 'Open in Default Program',\n\t\t\t\t\t\t\ticon: 'open_in_new',\n\t\t\t\t\t\t\tcondition: (file) => file.type == 'file',\n\t\t\t\t\t\t\tclick(file) {\n\t\t\t\t\t\t\t\trequireNativeModule('shell').openPath(file.path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'open_folder',\n\t\t\t\t\t\t\tname: 'menu.texture.folder',\n\t\t\t\t\t\t\ticon: 'folder',\n\t\t\t\t\t\t\tclick(file) {\n\t\t\t\t\t\t\t\trequireNativeModule('shell').showItemInFolder(file.path);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'go_to_location',\n\t\t\t\t\t\t\tname: 'Open File Location',\n\t\t\t\t\t\t\ticon: 'snippet_folder',\n\t\t\t\t\t\t\tcondition: (file) => this.recursive,\n\t\t\t\t\t\t\tclick: (file) => {\n\t\t\t\t\t\t\t\tthis.goTo(PathModule.dirname(file.path));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: 'delete',\n\t\t\t\t\t\t\tname: 'generic.delete',\n\t\t\t\t\t\t\ticon: 'delete',\n\t\t\t\t\t\t\tcondition: (file) => file.type == 'file',\n\t\t\t\t\t\t\tclick: (file) => {\n\t\t\t\t\t\t\t\tlet result = confirm(`Are you sure you want to move '${file.name}' to trash?`);\n\t\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\t\trequireNativeModule('shell').trashItem(file.path);\n\t\t\t\t\t\t\t\t\tthis.updateList();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t])\n\t\t\t\t}},\n\t\t\t\tmethods: {\n\t\t\t\t\tasync updateList() {\n\t\t\t\t\t\tlet list = this.directory;\n\t\t\t\t\t\tlet deep = this.recursive;\n\t\t\t\t\t\tif (this.recursive) {\n\t\t\t\t\t\t\tif (!this.directory_recursive) this.directory_recursive = [];\n\t\t\t\t\t\t\tlist = this.directory_recursive;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlist.empty();\n\t\t\t\t\t\tthis.scan_error = false;\n\t\t\t\t\t\tif (!this.path) return;\n\n\t\t\t\t\t\tlet folders = [];\n\t\t\t\t\t\tif (deep) {\n\t\t\t\t\t\t\tthis.recursive_cached = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.loading = true;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet fs = require('fs');\n\t\t\t\t\t\t\tlet dirents = await fs.promises.readdir(this.path, {withFileTypes: true, recursive: deep});\n\t\t\t\t\t\t\tif (!dirents) return;\n\t\t\t\t\t\t\tdirents.forEach(dirent => {\n\t\t\t\t\t\t\t\tlet {name} = dirent;\n\t\t\t\t\t\t\t\tlet path = PathModule.join(dirent.parentPath, name);\n\t\t\t\t\t\t\t\tlet is_folder = dirent.isDirectory();\n\t\t\t\t\t\t\t\tlet file = {\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\ttype: is_folder ? 'folder' : 'file',\n\t\t\t\t\t\t\t\t\ticon: getFileIcon(dirent),\n\t\t\t\t\t\t\t\t\tis_open: ModelProject.all.findIndex(project => project.save_path == path || project.export_path == path) !== -1,\n\t\t\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tif (file.type == 'folder') {\n\t\t\t\t\t\t\t\t\tfolders.push(file);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlist.push(file);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (folders.length) {\n\t\t\t\t\t\t\t\tlist.splice(0, 0, ...folders);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tthis.scan_error = err.code;\n\t\t\t\t\t\t\tif (err.code == 'EPERM') this.scan_error = 'Not permitted';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.selected.empty();\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t},\n\t\t\t\t\tclickFile(file) {\n\t\t\t\t\t\tif (open_timeout == file.path) return;\n\t\t\t\t\t\topen_timeout = file.path;\n\t\t\t\t\t\tsetTimeout(() => (open_timeout = ''), 360);\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.selected.replace([file.path]);\n\n\t\t\t\t\t\tif (file.type != 'folder') {\n\t\t\t\t\t\t\tif (Project?.save_path == file.path || Project?.export_path == file.path) return;\n\n\t\t\t\t\t\t\tlet project_before = Project;\n\t\t\t\t\t\t\tBlockbench.read([file.path], {}, async files => {\n\t\t\t\t\t\t\t\tloadModelFile(files[0]);\n\t\t\t\t\t\t\t\tlet to_close = temp_tab;\n\t\t\t\t\t\t\t\tif (Project !== project_before) temp_tab = Project;\n\t\t\t\t\t\t\t\tif (to_close) {\n\t\t\t\t\t\t\t\t\tawait to_close.close();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdblClickFile(file) {\n\t\t\t\t\t\tif (file.type == 'folder') {\n\t\t\t\t\t\t\tthis.goTo(file.path);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttemp_tab = null;\n\t\t\t\t\t\t\texplorer.confirm();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\topenContextMenu(file, event) {\n\t\t\t\t\t\tthis.selected.replace([file.path]);\n\t\t\t\t\t\tthis.file_menu.open(event, file);\n\t\t\t\t\t},\n\n\t\t\t\t\tgoTo(path) {\n\t\t\t\t\t\tif (this.path) this.history.push(this.path);\n\t\t\t\t\t\tthis.path = path;\n\t\t\t\t\t\tthis.search_term = '';\n\t\t\t\t\t\tthis.recursive_cached = false;\n\t\t\t\t\t\tthis.directory_recursive = null;\n\t\t\t\t\t\tthis.directory.empty();\n\t\t\t\t\t\tthis.updateList();\n\t\t\t\t\t},\n\t\t\t\t\tdirectoryBack() {\n\t\t\t\t\t\tlet last = this.history.pop();\n\t\t\t\t\t\tif (!last) return;\n\t\t\t\t\t\tthis.goTo(last);\n\t\t\t\t\t\tthis.history.pop();\n\t\t\t\t\t},\n\t\t\t\t\tdirectoryUp() {\n\t\t\t\t\t\tthis.goTo(PathModule.dirname(this.path));\n\t\t\t\t\t},\n\t\t\t\t\tnavigateBackTo(index) {\n\t\t\t\t\t\tif (!index) return;\n\t\t\t\t\t\tlet arr = this.path.split(/[/\\\\]+/)\n\t\t\t\t\t\tarr = arr.slice(0, -Math.min(index, arr.length-2));\n\t\t\t\t\t\tif (!arr[0]) return;\n\t\t\t\t\t\tif (arr[0].length === 0) arr[0] = PathModule.sep;\n\t\t\t\t\t\tthis.goTo(PathModule.join(...arr));\n\t\t\t\t\t},\n\t\t\t\t\tcreateFile(event) {\n\t\t\t\t\t\tlet arr = [];\n\t\t\t\t\t\tlet arr_bbmodel = [];\n\t\t\t\t\t\tlet redact = settings.streamer_mode.value;\n\t\t\t\t\t\tfor (let key in Formats) {\n\t\t\t\t\t\t\tlet format = Formats[key];\n\t\t\t\t\t\t\tif (format.show_in_new_list == false) continue;\n\t\t\t\t\t\t\tif (key == 'image') continue;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (format.codec && format.codec.remember) {\n\t\t\t\t\t\t\t\tarr.push({\n\t\t\t\t\t\t\t\t\tid: format.id,\n\t\t\t\t\t\t\t\t\tname: (redact && format.confidential) ? `[${tl('generic.redacted')}]` : format.name,\n\t\t\t\t\t\t\t\t\ticon: format.icon,\n\t\t\t\t\t\t\t\t\tdescription: format.description,\n\t\t\t\t\t\t\t\t\tclick: (e) => {\n\t\t\t\t\t\t\t\t\t\texplorer.hide();\n\t\t\t\t\t\t\t\t\t\tformat.new();\n\t\t\t\t\t\t\t\t\t\tlet project = Project;\n\t\t\t\t\t\t\t\t\t\tlet update = () => {\n\t\t\t\t\t\t\t\t\t\t\tBlockbench.removeListener('update_project_settings', update);\n\t\t\t\t\t\t\t\t\t\t\tif (project == Project) {\n\t\t\t\t\t\t\t\t\t\t\t\tproject.export_path = PathModule.join(this.path, (project.name||'new') + `.${format.codec.extension || 'txt'}`);\n\t\t\t\t\t\t\t\t\t\t\t\tFormat.codec.write(Format.codec.compile(), Project.export_path);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tBlockbench.on('update_project_settings', update);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (true && (!format.codec || format.codec.id !== 'project') && key !== 'skin') {\n\t\t\t\t\t\t\t\tarr_bbmodel.push({\n\t\t\t\t\t\t\t\t\tid: format.id,\n\t\t\t\t\t\t\t\t\tname: ((redact && format.confidential) ? `[${tl('generic.redacted')}]` : format.name) + ' (bbmodel)',\n\t\t\t\t\t\t\t\t\ticon: format.icon,\n\t\t\t\t\t\t\t\t\tdescription: format.description,\n\t\t\t\t\t\t\t\t\tclick: (e) => {\n\t\t\t\t\t\t\t\t\t\texplorer.hide();\n\t\t\t\t\t\t\t\t\t\tformat.new();\n\t\t\t\t\t\t\t\t\t\tlet project = Project;\n\t\t\t\t\t\t\t\t\t\tlet update = () => {\n\t\t\t\t\t\t\t\t\t\t\tBlockbench.removeListener('update_project_settings', update);\n\t\t\t\t\t\t\t\t\t\t\tif (project == Project) {\n\t\t\t\t\t\t\t\t\t\t\t\tproject.save_path = PathModule.join(this.path, (project.name||'new') + '.bbmodel')\n\t\t\t\t\t\t\t\t\t\t\t\tCodecs.project.write(Codecs.project.compile(), Project.save_path);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tBlockbench.on('update_project_settings', update);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tarr.push('_', ...arr_bbmodel);\n\t\t\t\t\t\tnew Menu('sidebar_explorer_new_file', arr).show(event.target);\n\t\t\t\t\t},\n\t\t\t\t\tgetFolderName(path) {\n\t\t\t\t\t\treturn PathModule.basename(path);\n\t\t\t\t\t},\n\t\t\t\t\tgetFolderUpName(path) {\n\t\t\t\t\t\treturn PathModule.basename(PathModule.dirname(path));\n\t\t\t\t\t},\n\t\t\t\t\topenSettings() {\n\t\t\t\t\t\tSettings.openDialog({search_term: 'Explorer'});\n\t\t\t\t\t},\n\t\t\t\t\topenFavoritesMenu(event) {\n\t\t\t\t\t\tlet options = [];\n\n\t\t\t\t\t\tStateMemory[FAV_KEY].forEach((path, i) => {\n\t\t\t\t\t\t\tlet option = {\n\t\t\t\t\t\t\t\tname: PathModule.basename(path),\n\t\t\t\t\t\t\t\tdescription: path,\n\t\t\t\t\t\t\t\ticon: 'folder',\n\t\t\t\t\t\t\t\tid: path,\n\t\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\t\tthis.goTo(path);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tchildren: [\n\t\t\t\t\t\t\t\t\t{icon: 'delete', name: 'generic.delete', click() {\n\t\t\t\t\t\t\t\t\t\tStateMemory[FAV_KEY].remove(path);\n\t\t\t\t\t\t\t\t\t\tStateMemory.save(FAV_KEY);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\toptions.push(option);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (this.path) {\n\t\t\t\t\t\t\toptions.push(\n\t\t\t\t\t\t\t\t'_',\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: `Save \"${PathModule.basename(this.path)}\" to Favorites`,\n\t\t\t\t\t\t\t\t\ticon: 'star',\n\t\t\t\t\t\t\t\t\tid: 'save',\n\t\t\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\t\t\tStateMemory[FAV_KEY].push(this.path);\n\t\t\t\t\t\t\t\t\t\tStateMemory.save(FAV_KEY);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnew Menu(options).open(event.target);\n\t\t\t\t\t},\n\t\t\t\t\tclose(e) {\n\t\t\t\t\t\texplorer.cancel();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcomputed: {\n\t\t\t\t\trecursive() {\n\t\t\t\t\t\treturn setting_search_deep.value && !!this.search_term;\n\t\t\t\t\t},\n\t\t\t\t\tfiles() {\n\t\t\t\t\t\tlet list = this.recursive ? this.directory_recursive : this.directory;\n\t\t\t\t\t\tif (!this.search_term) return list.slice(0, this.max_files);\n\t\t\t\t\t\tlet terms = this.search_term.toLowerCase().split(/\\s/);\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet i = 0;\n\t\t\t\t\t\treturn list.filter(file => {\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\tif (i > this.max_files) return false;\n\t\t\t\t\t\t\treturn !terms.find(term => (\n\t\t\t\t\t\t\t\t!file.name.toLowerCase().includes(term)\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\tpath_array() {\n\t\t\t\t\t\treturn this.path.split(/[/\\\\]+/).reverse();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\twatch: {\n\t\t\t\t\tsearch_term() {\n\t\t\t\t\t\tif (this.recursive && !this.directory_recursive) {\n\t\t\t\t\t\t\tthis.updateList();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div id=\"sidebar_explorer\" :style=\"{'--width': width + 'px'}\">\n\t\t\t\t\t\t<div class=\"dialog_handle\"><div class=\"dialog_title\">Explorer</div></div>\n\t\t\t\t\t\t<div class=\"dialog_close_button\" @click=\"close($event)\"><i class=\"material-icons\">clear</i></div>\n\n\t\t\t\t\t\t<div class=\"bar flex\">\n\t\t\t\t\t\t\t<search-bar id=\"sidebar_explorer_search_bar\" v-model=\"search_term\" style=\"flex-grow: 1; margin-left: 6px;\" />\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"openSettings()\" title=\"Explorer Settings\"><i class=\"material-icons\">settings</i></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"bar flex sidebar_explorer_location\">\n\t\t\t\t\t\t\t<span v-for=\"(folder, i) in path_array\" @click=\"navigateBackTo(i)\">{{ folder }}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"bar flex\">\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"directoryBack()\" :title=\"'Back to ' + getFolderName(history.at(-1))\" v-if=\"history.length\"><i class=\"material-icons\">arrow_back</i></div>\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"directoryUp()\" :title=\"'Up to ' + getFolderUpName(path)\" v-if=\"path\"><i class=\"material-icons\">arrow_upward</i></div>\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"updateList()\" title=\"Refresh\"><i class=\"material-icons\">refresh</i></div>\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"createFile($event)\" title=\"New File\"><i class=\"material-icons\">note_add</i></div>\n\t\t\t\t\t\t\t<div class=\"tool\" @click=\"openFavoritesMenu($event)\" title=\"Favorites\" style=\"margin-left: auto;\"><i class=\"material-icons\">star</i></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<ul class=\"list\">\n\t\t\t\t\t\t\t<li v-for=\"file in files\" :key=\"file.path\"\n\t\t\t\t\t\t\t\tclass=\"sidebar_explorer_file\" :class=\"{selected: selected.includes(file.path), unsupported: file.icon.textContent == 'insert_drive_file'}\"\n\t\t\t\t\t\t\t\t@click=\"clickFile(file)\" @dblclick=\"dblClickFile(file)\" @contextmenu.stop=\"openContextMenu(file, $event)\"\n\t\t\t\t\t\t\t\t:title=\"file.path\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<i v-html=\"file.icon.outerHTML\" />\n\t\t\t\t\t\t\t\t<span>{{ file.name }}</span>\n\t\t\t\t\t\t\t\t<i class=\"material-icons sidebar_explorer_is_open_icon\" v-if=\"file.is_open\">fiber_manual_record</i>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<template v-if=\"files.length == max_files && directory.length > max_files\">More files are hidden. Search to reveal them.</template>\n\t\t\t\t\t\t\t<template v-if=\"scan_error\">Failed to scan directory directory: {{ scan_error }}</template>\n\t\t\t\t\t\t\t<template v-if=\"loading\">Loading...</template>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t},\n\t\t\tonOpen() {\n\t\t\t\ttemp_tab = null;\n\t\t\t\tlet current_file = Project && (Project.export_path || Project.save_path);\n\t\t\t\tif (current_file) {\n\t\t\t\t\tthis.content_vue.goTo(PathModule.dirname(current_file));\n\t\t\t\t} else if (!this.content_vue.path) {\n\t\t\t\t\tif (\"SystemInfo\" in window) {\n\t\t\t\t\t\tthis.content_vue.goTo(SystemInfo.home_directory);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.content_vue.goTo(electron.app.getPath('desktop'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.content_vue.selected.replace(current_file ? [current_file] : []);\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.object.classList.add('visible');\n\t\t\t\t\tresize_line.update();\n\t\t\t\t}, 1);\n\t\t\t},\n\t\t\tonCancel() {\n\t\t\t\tthis.object.classList.remove('visible');\n\t\t\t\tsetTimeout(() => resize_line.update(), 0);\n\t\t\t},\n\t\t\tonConfirm() {\n\t\t\t\tthis.object.classList.remove('visible');\n\t\t\t\tsetTimeout(() => resize_line.update(), 0);\n\t\t\t}\n\t\t})\n\t\t//deletables.push(explorer);\n\n\t\tsidebar_button = Interface.createElement('div', {class: 'tool sidebar_explorer_open_button', title: 'Open Explorer'}, Blockbench.getIconNode('fas.fa-folder-open'));\n\t\tsidebar_button.addEventListener('click', event => {\n\t\t\texplorer.show();\n\t\t})\n\t\tlet tab_bar = document.getElementById('tab_bar');\n\t\ttab_bar.prepend(sidebar_button);\n\n\t\tresize_line = new ResizeLine('sidebar_explorer', {\n\t\t\tcondition() {\n\t\t\t\treturn Dialog.open == explorer\n\t\t\t},\n\t\t\tget() {return explorer.content_vue.width},\n\t\t\tset(o, diff) {\n\t\t\t\tlet calculated = Math.clamp(o + diff, 120, 800);\n\t\t\t\texplorer.content_vue.width = Math.snapToValues(calculated, [350], 16);\n\t\t\t},\n\t\t\tposition() {\n\t\t\t\tthis.setPosition({\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tleft: explorer.content_vue.width+2\n\t\t\t\t})\n\t\t\t}\n\t\t});\n\t\tInterface.page_wrapper.append(resize_line.node);\n\t\tresize_line.node.style.zIndex = 40;\n\n\t\tlet action = new Action('open_explorer_sidebar', {\n\t\t\tname: 'Open Explorer Sidebar',\n\t\t\ticon: 'fas.fa-folder-open',\n\t\t\tclick() {\n\t\t\t\texplorer.show();\n\t\t\t}\n\t\t})\n\t\tdeletables.push(action);\n\t},\n\tonunload() {\n\t\tsidebar_button.remove();\n\t\tdeletables.forEach(action => {\n\t\t\taction.delete();\n\t\t})\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/export_to_3mf/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/export_to_3mf/about.md",
    "content": "# Export to 3MF\n\n**Export to 3MF** is a Blockbench plugin that allows you to directly export your models to .3mf files (3D Manufacturing Format). This allows you to easily slice your Blockbench models for 3D printing.\n\n## How to use\nAccess the export via `File > Export > Export 3MF Model`.\n\nYou are able to choose what unit a pixel represents, which decides the scale of the model in the real world:\n- Micrometres\n- Millimetres (Default)\n- Centimetres\n- Metres\n- Inches\n- Feet\n\nThe model by default will export as one object, but you can choose to divide it into separate objects by \"group/bone\" or \"marker colour\". This gives more control over reorganizing and material in your slicer.\n\n## Valid models\n\n**Note:** Many Blockbench models are not suitable for printing without modification.\n\nYour model will have invalid aspects if you have zero thickness planes, or it is not manifold (watertight/solid).\n\nThis conversion process is barebones and does not validate the printability of the exported 3MF file.\n\n"
  },
  {
    "path": "plugins/export_to_3mf/export_to_3mf.js",
    "content": "/// <reference path=\"../node_modules/blockbench-types/types/plugin.d.ts\" />\nconst contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" /><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\" /></Types>`;\nconst rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\" /></Relationships>`;\nconst colourHexes = [\n    { hex: \"#6EC9F4\", name: \"Light Blue\" },\n    { hex: \"#F7D84A\", name: \"Yellow\" },\n    { hex: \"#F4A428\", name: \"Orange\" },\n    { hex: \"#E64545\", name: \"Red\" },\n    { hex: \"#AD4ED2\", name: \"Purple\" },\n    { hex: \"#5B89E5\", name: \"Blue\" },\n    { hex: \"#30B75B\", name: \"Green\" },\n    { hex: \"#7CF38C\", name: \"Lime\" },\n    { hex: \"#F874D6\", name: \"Pink\" },\n    { hex: \"#D8D8D8\", name: \"Silver\" },\n];\nasync function compile(units, splitGroups) {\n    // @ts-ignore\n    const zip = new JSZip();\n    // Basic stuff\n    zip.file(\"[Content_Types].xml\", contentTypes);\n    zip.folder(\"_rels\")?.file(\".rels\", rels);\n    // Geometry\n    const trianglesRaw = [];\n    const objects = {};\n    let objectIndex = 1000;\n    function addGeometry(geometry, mesh, cube, object) {\n        const position = geometry.attributes.position;\n        const index = geometry.index;\n        const positions = position.array;\n        const indices = index.array;\n        const matrix = mesh.matrixWorld;\n        for (let i = 0; i < indices.length; i += 3) {\n            const v = [];\n            for (let j = 0; j < 3; j++) {\n                const idx = indices[i + j] * 3;\n                const x = positions[idx];\n                const y = positions[idx + 1];\n                const z = positions[idx + 2];\n                const vec = new THREE.Vector3(x, y, z).applyMatrix4(matrix);\n                v.push([vec.x, vec.z, vec.y]);\n            }\n            trianglesRaw.push({ vertices: v, colour: +cube.color - 1, object });\n        }\n    }\n    function addCube(cube, object) {\n        const mesh = cube.mesh;\n        mesh.updateMatrixWorld();\n        const geometry = mesh.geometry;\n        addGeometry(geometry, mesh, cube, object);\n    }\n    function addMesh(meshObj, object) {\n        const mesh = meshObj.mesh;\n        mesh.updateMatrixWorld();\n        mesh.traverse(child => {\n            if (!child.isMesh) {\n                return;\n            }\n            const childMesh = child;\n            const geometry = childMesh.geometry;\n            addGeometry(geometry, mesh, meshObj, object);\n        });\n    }\n    function addGroup(group) {\n        objects[++objectIndex] ??= { name: group.name ?? \"Group\", vertices: [], triangles: [] };\n        addChildren(group.children, objectIndex);\n    }\n    function addChildren(children, objectIndex) {\n        for (const child of children) {\n            if (child instanceof Cube)\n                addCube(child, objectIndex);\n            else if (child instanceof Mesh)\n                addMesh(child, objectIndex);\n            else if (child instanceof Group)\n                addGroup(child);\n        }\n    }\n    if (splitGroups !== \"marker\")\n        objects[objectIndex] ??= { name: Project?.name && Project.name.length > 0 ? Project.name : \"BBRoot\", vertices: [], triangles: [] };\n    addChildren(splitGroups === \"group\" ? Outliner.root : [...Cube.all, ...Mesh.all], objectIndex);\n    for (const triangle of trianglesRaw) {\n        const indexes = [];\n        if (splitGroups === \"marker\")\n            objects[triangle.colour] ??= { name: colourHexes[triangle.colour].name, vertices: [], triangles: [] };\n        const object = objects[splitGroups === \"marker\" ? triangle.colour : triangle.object];\n        for (const vertex of triangle.vertices) {\n            const [x, y, z] = vertex;\n            let index = object.vertices.findIndex(d => d[0] === x && d[1] === y && d[2] === z);\n            if (index === -1) {\n                index = object.vertices.length;\n                object.vertices.push(vertex);\n            }\n            indexes.push(index);\n        }\n        object.triangles.push({ indexes });\n    }\n    const filteredObjects = Object.values(objects).filter(({ vertices }) => vertices.length > 0);\n    const model = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<model unit=\"${units}\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">\n    <resources>\n${filteredObjects.map(({ name, vertices, triangles }, index) => `\n        <object id=\"${index}\" type=\"model\" name=\"${name}\">\n        <mesh>\n            <vertices>${vertices.map(([x, y, z]) => `<vertex x=\"${x}\" y=\"${y}\" z=\"${z}\" />`).join(\"\")}</vertices>\n            <triangles>${triangles.map(({ indexes }) => `<triangle v1='${indexes[0]}' v2='${indexes[1]}' v3='${indexes[2]}' />`)}</triangles>\n        </mesh>\n        </object>`).join(\"\\n\")}\n    </resources>\n    <build>\n${filteredObjects.map(({ vertices }, index) => vertices.length > 0 ? `<item objectid=\"${index}\" />` : \"\").join(\"\\n\")}\n    </build>\n</model>\n`;\n    for (const object of filteredObjects) {\n        continue;\n    }\n    zip.folder(\"3D\")?.file(\"3dmodel.model\", model);\n    return zip.generateAsync({ type: \"arraybuffer\", compression: \"DEFLATE\" });\n}\n\n/// <reference path=\"../node_modules/blockbench-types/types/plugin.d.ts\" />\nlet exportButton;\nlet exportDialog = new Dialog(\"export-to-3mf-dialog\", {\n    title: \"3MF Model Exporter\",\n    form: {\n        exportUnits: {\n            label: \"Unit\",\n            description: \"Convert pixels into the selected unit\",\n            type: \"select\",\n            default: \"millimeter\",\n            options: {\n                micron: {\n                    name: \"Micrometres\"\n                },\n                millimeter: {\n                    name: \"Millimetres\"\n                },\n                centimeter: {\n                    name: \"Centimetres\"\n                },\n                meter: {\n                    name: \"Metres\"\n                },\n                inch: {\n                    name: \"Inches\"\n                },\n                foot: {\n                    name: \"Feet\"\n                }\n            }\n        },\n        exportGroups: {\n            label: \"Split\",\n            description: \"Export model as multiple objects (useful for multi material printing)\",\n            type: \"select\",\n            toggle_default: false,\n            toggle_enabled: true,\n            options: {\n                group: {\n                    name: \"By group\"\n                },\n                marker: {\n                    name: \"By marker colour\"\n                }\n            }\n        },\n    },\n    lines: [\n        \"<p>Some models may result in an invalid 3MF file during export. To ensure a successful export, make sure all parts of your model have actual thickness and form enclosed, printable volumes.<p/><br/>\"\n    ],\n    async onConfirm({ exportUnits, exportGroups }) {\n        const content = await compile(exportUnits, exportGroups);\n        Blockbench.export({\n            resource_id: \"CAD\",\n            extensions: [\"3mf\"],\n            type: \"3D Manufacturing Format\",\n            name: `${Project?.name ?? \"unknown\"}.3mf`,\n            content\n        });\n    }\n});\nfunction load() {\n    exportButton = new Action(\"export-to-3mf-button\", {\n        click() {\n            exportDialog.show();\n        },\n        icon: \"fa-file-export\",\n        name: \"Export 3MF Model\"\n    });\n    MenuBar.addAction(exportButton, \"file.export\");\n}\nfunction unload() {\n    exportButton.delete();\n    exportDialog.delete();\n}\nBBPlugin.register(\"export_to_3mf\", {\n    \"title\": \"Export to 3MF\",\n    \"author\": \"Ayden Hodgins-de Jonge\",\n    \"description\": \"Export geometry as 3MF for 3D printing\",\n    \"tags\": [\"Exporter\", \"3D Printing\", \"3MF\"],\n    \"icon\": \"icon.png\",\n    \"variant\": \"both\",\n    \"version\": \"0.0.1\",\n    \"min_version\": \"4.12.5\",\n    \"has_changelog\": false,\n    \"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_to_3mf\",\n    onload: load,\n    onunload: unload\n});\n"
  },
  {
    "path": "plugins/export_to_3mf/members.yml",
    "content": "maintainers:\n  - Ayden Hodgins-de Jonge\n"
  },
  {
    "path": "plugins/export_to_3mf/src/compile.ts",
    "content": "/// <reference path=\"../node_modules/blockbench-types/types/plugin.d.ts\" />\n\nimport {isObjectManifold} from \"./validation\";\n\n\ndeclare const THREE: typeof import('three');\n\nconst contentTypes = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" /><Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\" /></Types>`\nconst rels = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Target=\"/3D/3dmodel.model\" Id=\"rel0\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\" /></Relationships>`\n\nconst colourHexes = [\n    { hex: \"#6EC9F4\", name: \"Light Blue\" },\n    { hex: \"#F7D84A\", name: \"Yellow\" },\n    { hex: \"#F4A428\", name: \"Orange\" },\n    { hex: \"#E64545\", name: \"Red\" },\n    { hex: \"#AD4ED2\", name: \"Purple\" },\n    { hex: \"#5B89E5\", name: \"Blue\" },\n    { hex: \"#30B75B\", name: \"Green\" },\n    { hex: \"#7CF38C\", name: \"Lime\" },\n    { hex: \"#F874D6\", name: \"Pink\" },\n    { hex: \"#D8D8D8\", name: \"Silver\" },\n];\n\n\nexport type MFObject = {name: string, vertices: Vertex[], triangles: IndexedTriangle[]}\nexport type Vertex = [number, number, number]\nexport type RawTriangle = {vertices: Vertex[], colour: number, object: number}\nexport type IndexedTriangle = {indexes: [number, number, number]}\n\nexport async function compile(units: string, splitGroups: undefined|\"group\"|\"marker\"): Promise<ArrayBuffer> {\n    // @ts-ignore\n    const zip = new JSZip()\n\n    // Basic stuff\n    zip.file(\"[Content_Types].xml\", contentTypes)\n    zip.folder(\"_rels\")?.file(\".rels\", rels)\n\n\n    // Geometry\n    const trianglesRaw: RawTriangle[] = []\n\n    const objects: {[key: number]: MFObject} = {}\n\n    let objectIndex = 1000\n\n    function addGeometry(geometry: THREE.BufferGeometry, mesh: {matrixWorld: THREE.Matrix4}, cube: {color: number}, object: number) {\n        const position = geometry.attributes.position\n        const index = geometry.index!\n\n        const positions = position.array\n        const indices = index.array\n\n        const matrix = mesh.matrixWorld\n\n\n        for (let i = 0; i < indices.length; i += 3) {\n            const v: [number, number, number][] = [];\n\n            for (let j = 0; j < 3; j++) {\n                const idx = indices[i + j] * 3;\n                const x = positions[idx];\n                const y = positions[idx + 1];\n                const z = positions[idx + 2];\n\n                const vec = new THREE.Vector3(x, y, z).applyMatrix4(matrix);\n                v.push([vec.x, vec.z, vec.y]);\n            }\n\n            trianglesRaw.push({vertices: v, colour: +cube.color - 1, object});\n        }\n    }\n\n    function addCube(cube: Cube, object: number) {\n        const mesh = cube.mesh\n\n        mesh.updateMatrixWorld()\n\n        const geometry = mesh.geometry\n        addGeometry(geometry, mesh, cube, object);\n    }\n\n    function addMesh(meshObj: Mesh, object: number) {\n        const mesh = meshObj.mesh\n\n        mesh.updateMatrixWorld()\n\n        mesh.traverse(child => {\n            if (!(child as THREE.Mesh).isMesh) {\n                return\n            }\n\n\n            const childMesh = child as THREE.Mesh\n\n            const geometry = childMesh.geometry\n            addGeometry(geometry, mesh, meshObj, object);\n\n        })\n    }\n\n    function addGroup(group: Group) {\n        objects[++objectIndex] ??= {name: group.name ?? \"Group\", vertices: [], triangles: []}\n\n        addChildren(group.children, objectIndex)\n    }\n\n    function addChildren(children: OutlinerNode[], objectIndex: number) {\n        for (const child of children) {\n            if (child instanceof Cube)\n                addCube(child, objectIndex)\n            else if (child instanceof Mesh)\n                addMesh(child, objectIndex)\n            else if (child instanceof Group)\n                addGroup(child)\n        }\n    }\n\n    if (splitGroups !== \"marker\")\n        objects[objectIndex] ??= {name: Project?.name && Project.name.length > 0 ? Project.name : \"BBRoot\", vertices: [], triangles: []}\n    addChildren(splitGroups === \"group\" ? Outliner.root : [...Cube.all, ...Mesh.all], objectIndex)\n\n    for (const triangle of trianglesRaw) {\n        const indexes = []\n\n        if (splitGroups === \"marker\")\n            objects[triangle.colour] ??= {name: colourHexes[triangle.colour].name, vertices: [], triangles: []}\n\n\n        const object = objects[splitGroups === \"marker\" ? triangle.colour : triangle.object]\n\n        for (const vertex of triangle.vertices) {\n\n            const [x, y, z] = vertex\n            let index = object.vertices.findIndex(d => d[0] === x && d[1] === y && d[2] === z)\n\n            if (index === -1) {\n                index = object.vertices.length\n                object.vertices.push(vertex)\n            }\n\n            indexes.push(index)\n        }\n\n        object.triangles.push({indexes} as IndexedTriangle)\n    }\n\n    const filteredObjects = Object.values(objects).filter(({vertices}) => vertices.length > 0)\n\n    const model = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<model unit=\"${units}\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\">\n    <resources>\n${filteredObjects.map(({name, vertices, triangles}, index) => `\n        <object id=\"${index}\" type=\"model\" name=\"${name}\">\n        <mesh>\n            <vertices>${vertices.map(([x, y, z]) => `<vertex x=\"${x}\" y=\"${y}\" z=\"${z}\" />`).join(\"\")}</vertices>\n            <triangles>${triangles.map(({indexes}) => `<triangle v1='${indexes[0]}' v2='${indexes[1]}' v3='${indexes[2]}' />`)}</triangles>\n        </mesh>\n        </object>`).join(\"\\n\")}\n    </resources>\n    <build>\n${filteredObjects.map(({vertices}, index) => vertices.length > 0 ? `<item objectid=\"${index}\" />` : \"\").join(\"\\n\")}\n    </build>\n</model>\n`\n\n    for (const object of filteredObjects) {\n        if (isObjectManifold(object))\n            continue\n\n        console.error(object, \"Object failed validation\")\n    }\n\n    zip.folder(\"3D\")?.file(\"3dmodel.model\", model)\n\n\n    return zip.generateAsync({type: \"arraybuffer\", compression: \"DEFLATE\"})\n}"
  },
  {
    "path": "plugins/export_to_3mf/src/export_to_3mf.ts",
    "content": "/// <reference path=\"../node_modules/blockbench-types/types/plugin.d.ts\" />\n\nimport {compile} from \"./compile\";\n\n\nlet exportButton: Action\nlet exportDialog = new Dialog(\"export-to-3mf-dialog\", {\n    title: \"3MF Model Exporter\",\n\n    form: {\n        exportUnits: {\n            label: \"Unit\",\n            description: \"Convert pixels into the selected unit\",\n            type: \"select\",\n            default: \"millimeter\",\n            options: {\n                micron: {\n                    name: \"Micrometres\"\n                },\n                millimeter: {\n                    name: \"Millimetres\"\n                },\n                centimeter: {\n                    name: \"Centimetres\"\n                },\n                meter: {\n                    name: \"Metres\"\n                },\n                inch: {\n                    name: \"Inches\"\n                },\n                foot: {\n                    name: \"Feet\"\n                }\n            }\n        },\n        exportGroups: {\n            label: \"Split\",\n            description: \"Export model as multiple objects (useful for multi material printing)\",\n            type: \"select\",\n            toggle_default: false,\n            toggle_enabled: true,\n            options: {\n                group: {\n                    name: \"By group\"\n                },\n                marker: {\n                    name: \"By marker colour\"\n                }\n            }\n        },\n    },\n    lines: [\n        \"<p>Some models may result in an invalid 3MF file during export. To ensure a successful export, make sure all parts of your model have actual thickness and form enclosed, printable volumes.<p/><br/>\"\n    ],\n    async onConfirm({exportUnits, exportGroups}: { exportUnits: string, exportGroups: undefined|\"group\"|\"marker\" }) {\n\n        const content = await compile(exportUnits, exportGroups)\n\n\n        Blockbench.export({\n            resource_id: \"CAD\",\n            extensions: [\"3mf\"],\n            type: \"3D Manufacturing Format\",\n            name: `${Project?.name ?? \"unknown\"}.3mf`,\n            content\n        })\n\n    }\n})\n\nfunction load() {\n    exportButton = new Action(\"export-to-3mf-button\", {\n        click(): void {\n            exportDialog.show()\n        },\n        icon: \"fa-file-export\",\n        name: \"Export 3MF Model\"\n    })\n\n    MenuBar.addAction(exportButton, \"file.export\")\n}\n\n\n\nfunction unload() {\n    exportButton.delete()\n    exportDialog.delete()\n}\n\n\nBBPlugin.register(\"export_to_3mf\", {\n    \"title\": \"Export to 3MF\",\n    \"author\": \"Ayden Hodgins-de Jonge\",\n    \"description\": \"Export geometry as 3MF for 3D printing\",\n    \"tags\": [\"Exporter\", \"3D Printing\", \"3MF\"],\n    \"icon\": \"icon.png\",\n    \"variant\": \"both\",\n    \"version\": \"0.0.1\",\n    \"min_version\": \"4.12.5\",\n    \"has_changelog\": false,\n    \"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_to_3mf\",\n    onload: load,\n    onunload: unload\n})"
  },
  {
    "path": "plugins/export_to_3mf/src/validation.ts",
    "content": "import {MFObject} from \"./compile\";\n\n\n\n\nexport function isObjectManifold(object: MFObject): boolean {\n    // TODO: Future error checking\n    return true\n}\n\n"
  },
  {
    "path": "plugins/export_to_blender/LICENSE.MD",
    "content": "MIT License\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/export_to_blender/about.md",
    "content": "**Requires Blender to be installed!** \n\nThis plugin adds the option to export your project as a Blender scene file (.blend). \nIt works by first exporting the project as GLTF, then importing that GLTF into Blender using a Python script.\nYou may need to specify the path to your Blender installation upon first use.\n"
  },
  {
    "path": "plugins/export_to_blender/export_to_blender.js",
    "content": "(function() {\n\nconst windows = Blockbench.operating_system === 'Windows';\nconst linux   = Blockbench.operating_system === 'macOS';\nconst macos   = Blockbench.operating_system === 'Linux';\n\nconst requireUserPermission = Blockbench.isNewerThan('4.99');\nlet fsModule           = requireUserPermission ? undefined : require('fs');\nlet childProcessModule = requireUserPermission ? undefined : require('child_process');\n\n// Python code to be run by Blender\n// 1. Imports a GLTF file\n// 2. Adds the file to a root node and a collection\n// 3. Saves the blend file\nconst blenderScript = [\n    'import bpy                                             ',\n    'import sys                                             ',\n    '                                                       ',\n    'args = sys.argv[sys.argv.index(\"--\") + 1:]             ',\n    'name = args[0]                                         ',\n    'gltf_path = args[1]                                    ',\n    'blend_path = args[2]                                   ',\n    '                                                       ',\n    'print(\"Creating blend...\")                             ',\n    'bpy.ops.wm.read_factory_settings(use_empty=True)       ',\n    '                                                       ',\n    '# Create collections                                   ',\n    'collection = bpy.data.collections.new(name)            ',\n    'bpy.context.scene.collection.children.link(collection) ',\n    '                                                       ',\n    '# Import gltf                                          ',\n    'print(\"Importing gltf...\")                             ',\n    'bpy.ops.import_scene.gltf(filepath=gltf_path)          ',\n    '                                                       ',\n    '# Root node                                            ',\n    'root_node = bpy.data.objects.new(name, None)           ',\n    'bpy.context.collection.objects.link(root_node)         ',\n    'collection.objects.link(root_node)                     ',\n    'bpy.context.scene.collection.objects.unlink(root_node) ',\n    '                                                       ',\n    '# Add imported objects to collection and root node     ',\n    'for obj in bpy.context.selected_objects:               ',\n    '    # Add to collection                                ',\n    '    collection.objects.link(obj)                       ',\n    '    bpy.context.scene.collection.objects.unlink(obj)   ',\n    '    # Add root object to prop node                     ',\n    '    if obj.parent == None:                             ',\n    '        obj.parent = root_node                         ',\n    '                                                       ',\n    '# Save blend file                                      ',\n    'bpy.ops.wm.save_as_mainfile(filepath=blend_path)       ',\n    'print(f\"Saved blend file: {blend_path}\")               ',\n].join('\\n');\n\n// Because we need to send the code through a command line argument,\n// It's very hard to encode double quotes and newlines\n// We cheat by base-64 encoding the script,\n// Then having Python decode it and run it\nconst encodedBlenderScript = `import base64; exec(base64.b64decode('${btoa(blenderScript)}'))`;\n\nlet deferred = [];\n\nPlugin.register('export_to_blender', {\n    title:         'Export to Blender',\n    author:        '0x13F',\n    description:   'Export your project as a Blender scene (.blend)',\n    icon:          'icon.png',\n    creation_date: '2025-04-16',\n    version:       '2.0.0',\n    variant:       'desktop',\n    min_version:   '4.12.4',\n    has_changelog: false,\n    tags:          [ 'Exporter' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_as_blender',\n\n    onload() {\n\n        deferDelete(new Setting('blender_path', {\n            name: 'Blender path',\n            description: 'Path to the Blender executable',\n            category: 'export',\n            type: 'text',\n        }));\n\n        let blenderSetPathDialog = deferDelete(new Dialog('blender_set_path', {\n            title: 'Set Blender path',\n            form: {\n                ['info']: {\n                    type: 'info',\n                    text: 'The Blender installation could not be located. Please choose the path to the Blender executable.',\n                },\n                ['path']: {\n                    type: 'file',\n                    label: 'Blender path',\n                    extensions: windows ? [ 'exe' ] : [],\n                },\n            },\n            async onConfirm(form_result) {\n\n                let blenderPath = form_result['path'];\n\n                if (blenderPath != null && blenderPath != ''\n                  && getFs().existsSync(blenderPath) && await validateBlender(blenderPath)) {\n                    // New path is valid!\n                    Settings.structure.export.items['blender_path'].value = blenderPath;\n                    blenderCodec.export_action.trigger();\n\n                } else {\n                    // New path is not valid, show message box and try again\n                    Blockbench.showMessageBox({\n                        title:   'Blender path',\n                        message: 'Provided path does not point to a valid Blender executable, please try again.',\n                        icon:    'error',\n                    }, () => blenderCodec.export_action.trigger());\n                }\n            },\n        }));\n\n        let blenderPatienceDialog = deferDelete(new Dialog('blender_patience', {\n            title: 'Exporting as Blender Scene...',\n            progress_bar: {},\n            buttons: [],\n            cancel_on_click_outside: false,\n            onOpen() {\n                // Forcefully remove the close button\n                let closeButton = this.object.querySelector('.dialog_close_button');\n                if (closeButton != undefined)\n                    this.object.removeChild(closeButton);\n\n                // Keep increasing the progress bar\n                // speed keeps decreasing\n                this.progress_bar.setProgress(0);\n                let progressUpdateFramerate = 60;\n                let dt = 1/progressUpdateFramerate;\n\n                this.updateProgressInterval = setInterval(() => {\n                    let remainingProgress = 1 - this.progress_bar.progress;\n                    let addProgress = remainingProgress * remainingProgress * dt;\n                    let newProgress = Math.min(this.progress_bar.progress + addProgress, 0.95);\n                    this.progress_bar.setProgress(newProgress);\n                }, 1000/progressUpdateFramerate);\n            },\n            onClose() {\n                clearInterval(this.updateProgressInterval);\n            },\n        }));\n\n        let blenderCodec = deferDelete(new Codec('blender', {\n            name: 'Blender Scene',\n            extension: 'blend',\n            export_action: deferDelete(new Action({\n                id: 'export_blender',\n                name: 'Export Blender Scene',\n                icon: 'blender',\n                category: 'file',\n                click() {\n\n                    let blenderPath = Settings.get('blender_path');\n                    if (blenderPath == undefined || blenderPath == '') {\n                        setBlenderPath(this, blenderSetPathDialog);\n                    } else {\n                        blenderCodec.export();\n                    }\n                },\n            })),\n            export_options: {\n                ['scale']: {\n                    label: 'settings.model_export_scale',\n                    type: 'number',\n                    value: Settings.get('model_export_scale'),\n                },\n                ['embed_textures']: {\n                    type: 'checkbox',\n                    label: 'codec.common.embed_textures',\n                    value: true,\n                },\n                ['armature']: {\n                    type: 'checkbox',\n                    label: 'codec.common.armature',\n                    value: false,\n                },\n                ['animations']: {\n                    label: 'codec.common.export_animations',\n                    type: 'checkbox',\n                    value: true,\n                },\n            },\n            async compile(options) {\n                return await compileBlend(options);\n            },\n            async export() {\n                let options = await this.promptExportOptions();\n                if (options === null) return;\n\n                await exportBlend(this, options, blenderPatienceDialog);\n            },\n        }));\n\n        // Insert into export menu after last item with id 'export_...'\n        let exportMenu = MenuBar.menus.file.structure.find(x => x.id === 'export');\n        let lastExportItem = exportMenu.children\n            .filter(x => (typeof x === 'string' ? x : x.id).startsWith('export_'))\n            .last();\n        let lastExportItemIndex = exportMenu.children.indexOf(lastExportItem);\n        let blenderExportIndex = lastExportItemIndex + 1;\n        exportMenu.children.splice(blenderExportIndex, 0, 'export_blender');\n        defer(() => exportMenu.children.splice(exportMenu.children.indexOf('export_blender'), 1));\n    },\n    onunload() {\n\n        for (let lambda of deferred)\n            lambda();\n        \n    },\n});\n\nasync function compileBlend(options) {\n\n    let tempPathPrefix = `${PathModule.dirname(Project.save_path)}/.${PathModule.basename(Project.save_path)}`;\n    let tempGlbPath    = tempPathPrefix + '.TEMP_BLEND_EXPORT.glb';\n    let tempBlendPath  = tempPathPrefix + '.TEMP_BLEND_EXPORT.blend';\n\n    // Export to .glb\n    let glbContent = await Codecs.gltf.compile({\n        encoding: 'binary',\n        ...options,\n    });\n    getFs().writeFileSync(tempGlbPath, Buffer.from(glbContent));\n    \n    // Run Blender script\n    let blender = Settings.get('blender_path');\n    let blenderLogs = await executeCommand(blender, [\n        '--background',\n        '--python-expr',\n        encodedBlenderScript,\n        '--',\n        Project.name,\n        tempGlbPath,\n        tempBlendPath,\n    ]);\n\n    console.log(`Blender: ${blenderLogs}`);\n\n    if (!getFs().existsSync(tempBlendPath)) {\n        getFs().unlinkSync(tempGlbPath);\n        return new Error('Blender didn\\'t create blend file for some reason. Please verify your Blender path in your settings.');\n    }\n\n    // Read Blender scene content\n    let blendContent = getFs().readFileSync(tempBlendPath);\n\n    // Clean up\n    getFs().unlinkSync(tempGlbPath);\n    getFs().unlinkSync(tempBlendPath);\n\n    return blendContent;\n\n}\n\nasync function exportBlend(codec, options, blenderPatienceDialog) {\n\n    blenderPatienceDialog.show();\n\n    let content = await codec.compile(options);\n\n    blenderPatienceDialog.close();\n\n    // Wait for the patience dialog to close\n    await new Promise(r => setTimeout(r, 20));\n\n    // Something went wrong...\n    if (content == undefined || content instanceof Error) {\n        Blockbench.showMessageBox({\n            title: 'Blender export error',\n            message: 'Exporting as Blender Scene failed for an unknown reason.\\n'\n                + 'Please verify that the Blender Path in your settings is correct.',\n            icon: 'error',\n        });\n        return;\n    }\n\n    // Export dialog\n    Blockbench.export({\n        type: 'Blender Scene File',\n        startpath: Project.save_path,\n        extensions: ['blend'],\n        savetype: 'binary',\n        content: content,\n        \n    }, (exportPath) => {\n        Blockbench.showQuickMessage(`Exported as ${PathModule.basename(exportPath)}`, 1000);\n    });\n\n}\n\n// Either find Blender path and retrigger the export action,\n// or open the dialog\nasync function setBlenderPath(exportAction, pathDialog) {\n    \n    let foundPath = await findBlender();\n\n    if (foundPath == null) {\n        pathDialog.show();\n    } else {\n        Settings.structure.export.items['blender_path'].value = foundPath;\n        exportAction.trigger();\n    }\n}\n    \n// Try to find the path to Blender, if it can't be found, return null\nasync function findBlender() {\n    try {\n        // Try just running the command\n        if (await validateBlender('blender'))\n            return 'blender';\n    \n        // Try running `where blender`\n        try {\n            let whereCommand = windows ? 'where' : 'which';\n            let pathFromWhere = await executeCommand(whereCommand, ['blender']);\n            if (getFs().existsSync(pathFromWhere) && await validateBlender(pathFromWhere))\n                return pathFromWhere;\n        } catch { }\n\n        // Try obvious paths\n        // wildcards should be resolved, but only one wildcard is allowed\n        let obviousPaths = \n            windows ? ['C','D','E'].flatMap(drive => [\n                `${drive}:/Program Files/Blender Foundation/Blender */blender.exe`,\n                `${drive}:/Program Files/WindowsApps/BlenderFoundation.Blender*/Blender/blender.exe`,\n                `${drive}:/Program Files (x86)/Steam/steamapps/common/Blender/blender.exe`,\n                `${drive}:/SteamLibrary/steamapps/common/Blender/blender.exe`,\n            ])\n          : linux ? [`/usr/share/blender/*/Blender`]\n          : macos ? [`/Applications/Blender.app/Contents/Resources/Blender`]\n          : [];\n\n        for (let obviousPath of obviousPaths) {\n            // Resolve wildcard\n            if (obviousPath.indexOf('*') !== -1) {\n                let segments = obviousPath.split('/');\n                let wildcardSegmentIndex = segments.findIndex(s => s.includes('*'));\n                let segmentsUntilWildcard = segments.slice(0, wildcardSegmentIndex);\n                // Stop early if the the wildcard's parent doesn't exist\n                if (!getFs().existsSync(segmentsUntilWildcard.join('/')))\n                    continue;\n                \n                let wildcardSegment = segments[wildcardSegmentIndex];\n                let wildcardIndex = wildcardSegment.indexOf('*');\n                let beforeWildcard = wildcardSegment.slice(0, wildcardIndex);\n                let afterWildcard = wildcardSegment.slice(wildcardIndex + 1);\n                let matchingDirItems = getFs().readdirSync(segmentsUntilWildcard.join('/'))\n                    .filter(i => i.startsWith(beforeWildcard))\n                    .filter(i => i.endsWith(afterWildcard));\n                let existingPaths = matchingDirItems\n                    .map(i => obviousPath.replace(wildcardSegment, i))\n                    .filter(p => getFs().existsSync(p));\n\n                // Nothing matches or matches don't contain Blender exe\n                if (existingPaths.length === 0)\n                    continue;\n\n                // Just one existing match, go validate it!\n                if (matchingDirItems.length === 1) {\n                    obviousPath = existingPaths[0];\n                    \n                } else {\n\n                    // Multiple versions of Blender\n                    // Find whichever file has the most recent write time\n                    let newestPath = existingPaths\n                        .map(existingPath => ({\n                            existingPath,\n                            writeTime: getFs().statSync(existingPath).mtime.getTime()\n                        }))\n                        .sort((a, b) => b.writeTime - a.writeTime)\n                        .map(entry => entry.existingPath)\n                        [0];\n                    obviousPath = newestPath;\n                }\n\n            }\n\n            // Check to make sure we resolved the wildcard\n            if (obviousPath.indexOf('*') !== -1) {\n                console.warn('Two wildcards in Blender path?');\n                continue;\n            }\n\n            // Make sure the file exists and and can be called with --version\n            if (getFs().existsSync(obviousPath) && await validateBlender(obviousPath))\n                return obviousPath; \n        }\n\n    } catch {\n        // Give up, just prompt the user\n        return null;\n    }\n}\n\n// Runs a command as a Promise\nfunction executeCommand(command, args) {\n    return new Promise((resolve, reject) => {\n        try {\n            let process = getChildProcess().spawn(command, args, { shell: false });\n            let stdout = '';\n            let stderr = '';\n            process.stdout.on('data', (data) => {\n                stdout += data.toString();\n            });\n            process.stderr.on('data', (data) => {\n                stderr += data.toString();\n            });\n            process.on('close', (code) => {\n                if (code === 0) {\n                    resolve(stdout.trim());\n                } else {\n                    reject(new Error(stderr.trim() || `Command failed with exit code ${code}`));\n                }\n            });\n            process.on('error', (err) => {\n                reject(err);\n            });\n        } catch (error) {\n            reject(error);\n        }\n    });\n}\n\n// Tries to run blender with the provided path\n// Returns the same path on success, otherwise null\nasync function validateBlender(blender) {\n    try {\n        let result = await executeCommand(blender, ['--version']);\n        if (result?.startsWith(\"Blender \"))\n            return blender;\n    } catch { }\n    return null;\n}\n\nfunction defer(lambda) {\n    deferred.push(lambda);\n}\n\nfunction deferDelete(deletable) {\n    if (deletable.delete == undefined) {\n        console.warn('deferDelete() called with object that isn\\'t deletable: ', deletable);\n        return;\n    }\n    defer(() => deletable.delete());\n    return deletable;\n}\n\nfunction getFs() {\n    if (fsModule == undefined)\n        fsModule = requireNativeModule('fs', {\n            message: 'This permission is required to locate Blender and convert your model.',\n        });\n\n    return fsModule;\n}\n\nfunction getChildProcess() {\n    if (childProcessModule == undefined)\n        childProcessModule = requireNativeModule('child_process', {\n            message: 'This permission is required to communicate with Blender to convert your model.',\n        });\n\n    return childProcessModule;\n}\n\n})();\n"
  },
  {
    "path": "plugins/export_to_blender/members.yml",
    "content": "maintainers:\n  - mr0x13f\ndevelopers:\n  - mr0x13f"
  },
  {
    "path": "plugins/farsight/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2026 Luth3r\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/farsight/README.md",
    "content": "# 👁️ Farsight\nFarsight is a Blockbench Plugin that increases the culling distance. Perfect for creating whole worlds.\n\n![alt text](<Images/Farsight_Banner.png>)\n\n## ⚙️ Farsight can be Configured\nUse this option under the Tools Menu to increase the Clipping Limit.\n\n![alt text](<Images/Farsight_Image.png>)\n\n## ⛰️ Understanding of Scale\n*The map of Final Fantasy XV's playable area is around 128000m. Or 64km².*\n\n*That is also the size of the purple plane.*\n\n*If you somehow need to craft a world that's bigger than 1,000,000m, you can increase the cap manually. Check:* `Line 64 in farsight.js`\n\n## ⚠️ Warning!\nBlockbench was not built to work with meshes and textures at this size.\n\n`Creating a Texture` is a very dangerous choice. I recommend always importing textures when working with large meshes.\n\nAnd playing on this, no matter your game engine, without splitting and chunking it into pieces won't be an easy thing to do. Consider how you can break your world apart into pieces, or even better, into seperate levels.\n\n## 🖥️🌐 Install\nInstallation is the same as every other Blockbench Plugin. Simply grab it from the Plugin Store, or Load the Plugin from the Javascript (`farsightjs`) file."
  },
  {
    "path": "plugins/farsight/farsight.js",
    "content": "Plugin.register(\"farsight\", {\n  title: \"Farsight\",\n  author: \"Luther Gray\",\n  icon: \"visibility\",\n  description:\n    \"Increases the Clipping Distance of Blockbench to see much larger maps & levels (configurable).\",\n  version: \"1.0.1\",\n  min_version: \"4.8.0\",\n  variant: \"both\",\n\n  onload() {\n    // Check to activate Farsight in new Tabs.\n    this.onPreviewAdded = (data) => {\n      setTimeout(() => this.applySettings(), 50);\n    };\n    Blockbench.on('view_restored', this.onPreviewAdded);\n\n    // Main Variable (If there's a setting in localStorage, use that.)\n    this.clipDistance =\n      parseFloat(localStorage.getItem(\"farsight_clipDistance\")) || 200000;\n    // Side Effect to fix the small Zoom Distance\n    this.maxDistance = 300000;\n    // Create the Apply Settings Function\n    this.applySettings = () => {\n      // Safety\n      if (!Preview.all) return;\n\n      Preview.all.forEach((preview) => {\n        // Perspective\n        preview.camPers.far = this.clipDistance;\n        preview.camPers.updateProjectionMatrix();\n\n        // Check Controls\n        if (preview.controls) {\n          preview.controls.maxDistance = this.maxDistance;\n        }\n\n        // Ortho\n        preview.camOrtho.far = this.clipDistance;\n        preview.camOrtho.updateProjectionMatrix();\n\n        preview.render();\n      });\n    };\n\n    // Apply Settings\n    this.applySettings();\n\n    //----------------------------------------\n    // Farsight Configure Window\n    this.configureAction = new Action(\"configure_farsight\", {\n      name: \"Configure Farsight\",\n      description: \"Adjust the Clipping Distance.\",\n      icon: \"settings\",\n      click: () => {\n        let dialog = new Dialog({\n          id: \"farsight_config\",\n          title: \"Farsight Settings\",\n          form: {\n            clipDistance: {\n              label: \"Maximum Clipping Distance (1,000,000 is current cap)\",\n              type: \"number\",\n              value: this.clipDistance,\n              min: 10000,\n              max: 1000000,\n              step: 10000,\n            },\n            info: {\n              type: \"info\",\n              text: \"Higher values allow for larger viewing distances, but be aware of performance impact. Especially with Textures applied.\",\n            },\n          },\n          onConfirm: (formData) => {\n            this.clipDistance = formData.clipDistance;\n\n            // Apply Config Settings\n            localStorage.setItem(\"farsight_clipDistance\", this.clipDistance);\n\n            this.applySettings();\n            Blockbench.showQuickMessage(\"Farsight Settings Updated!\");\n            dialog.hide();\n          },\n        });\n        dialog.show();\n      },\n    });\n    MenuBar.addAction(this.configureAction, \"tools\");\n  },\n\n  onunload() {\n    // Clean Up\n    let defaultFarPers = 10000;\n    let defaultFarOrtho = 6000;\n    let defaultMaxDistance = Infinity;\n\n    Preview.all.forEach((preview) => {\n      preview.camPers.far = defaultFarPers;\n      preview.camPers.updateProjectionMatrix();\n      if (preview.controls) preview.controls.maxDistance = defaultMaxDistance;\n\n      preview.camOrtho.far = defaultFarOrtho;\n      preview.camOrtho.updateProjectionMatrix();\n      preview.render();\n    });\n\n    if (this.applyAction) this.applyAction.delete();\n    if (this.configureAction) this.configureAction.delete();\n  },\n});\n"
  },
  {
    "path": "plugins/figura_format/about.md",
    "content": "Figura uses Blockbench for it's modeling, but some features of Blockbench will not be parsed by Figura.\n\nThis Plugin adds a Project Format that will make the following changes to Blockbench:\n* New Animations will be named `new` instead of `animation.model.new`.\n* The \"Anim Time Update\" Animation property has been renamed to \"Start Offset\" to reflect how the property is parsed by Figura.\n* The \"Override\" Animation property has been renamed to \"Override Vanilla Animations\" to better reflect how the property is used by Figura.\n* Added \"Copy X Path\" under the Right Click context menu for Cubes, Groups, Meshes, Animations, and Textures.\n  * Copies the full script path as dictated by Figura's scripting API.\n  * Assumes the bbmodel is at the root of the avatar.\n* Added \"Add Animations from .bbmodel...\" under Animation.\n  * Allows you to select a bbmodel and imports all animations you select, replacing old animations.\n  * Intended to replace \"Export Animations to file, then import file\" workflow.\n* Added \"Allow Duplicate Names\" which can be found in the Figura Plugin Settings (File->Plugins->Figura Format->Settings)\n  * Enabling this bypasses the group name restrictions, such as duplicate group names and special characters in group names.\n  * Will break certain Blockbench Animation features. Use at own risk.\n* Added \"Recalculate UVs\" under UV.\n  * Scales an entire texture's uvs to match a new texture size.\n  * Useful for fixing Texture Size related issues.\n* Added \"Optimize Model\" under Tools.\n  * Provides batch operations related to optimizing a bbmodel for filesize when compressed to a Figura Avatar.\n* Removed Blockbench Animated Textures.\n* Removed File Name textbox.\n* Removed Model Identifier.\n* Removed Molang Errors.\n* Removed Texture Render Mode from the Texture Properties.\n* Removed Particle and Sound keyframes.\n\n<i style=\"pointer-events: none;color: black;opacity: 0.1;font-size: 700px;height: 614px;width: 584px;position: absolute;bottom: 0;right: 0;\noverflow: hidden;max-width: unset;\" class=\"material-icons\">change_history</i>"
  },
  {
    "path": "plugins/figura_format/figura_format.js",
    "content": "(function () {\n\tconst toDelete = []\n\n\tfunction isValidLuaIdentifier(str) {\n\t\tconst keywords = [\n\t\t\t\"and\",\n\t\t\t\"break\",\n\t\t\t\"do\",\n\t\t\t\"else\",\n\t\t\t\"elseif\",\n\t\t\t\"end\",\n\t\t\t\"false\",\n\t\t\t\"for\",\n\t\t\t\"function\",\n\t\t\t\"if\",\n\t\t\t\"in\",\n\t\t\t\"local\",\n\t\t\t\"nil\",\n\t\t\t\"not\",\n\t\t\t\"or\",\n\t\t\t\"repeat\",\n\t\t\t\"return\",\n\t\t\t\"then\",\n\t\t\t\"true\",\n\t\t\t\"until\",\n\t\t\t\"while\",\n\t\t]\n\t\treturn (\n\t\t\ttypeof str == \"string\"\n\t\t\t&& str.search(/^[a-zA-Z0-9_]+$/) !== -1\n\t\t\t&& str.search(/^[0-9]/) === -1\n\t\t\t&& !keywords.includes(str)\n\t\t)\n\t}\n\tfunction getValidLuaIndex(str) {\n\t\treturn isValidLuaIdentifier(str) ? `.${str}` : `[\"${str}\"]`\n\t}\n\n\tBBPlugin.register('figura_format', {\n\t\ttitle: \"Figura Model Format\",\n\t\tauthor: \"Katt (KitCat962)\",\n\t\ticon: \"icon.svg\",\n\t\tdescription: \"Create models for the Figura mod in a custom format that optimizes Blockbench to work with Figura models.\",\n\t\ttags: [\"Minecraft: Java Edition\", \"Figura\"],\n\t\tversion: \"0.1.3\",\n\t\tmin_version: \"4.8.0\",\n\t\tvariant: \"both\",\n\t\tawait_loading: true,\n\t\tcreation_date: \"2023-07-22\",\n\t\tonload() {\n\t\t\tconst particle = EffectAnimator.prototype.channels.particle, sound = EffectAnimator.prototype.channels.sound\n\t\t\tconst format = new ModelFormat('figura', {\n\t\t\t\ticon: 'change_history',\n\t\t\t\tname: 'Figura Model',\n\t\t\t\tdescription: 'Model for the Figura mod.',\n\t\t\t\tcategory: 'minecraft',\n\t\t\t\ttarget: ['Figura'],\n\t\t\t\tshow_on_start_screen: true,\n\t\t\t\tbox_uv: false,\n\t\t\t\toptional_box_uv: true,\n\t\t\t\tsingle_texture: false,\n\t\t\t\tper_texture_uv_size: true,\n\t\t\t\tmodel_identifier: false,\n\t\t\t\tparent_model_id: false,\n\t\t\t\tvertex_color_ambient_occlusion: false,\n\t\t\t\tanimated_textures: false,\n\t\t\t\tbone_rig: true,\n\t\t\t\tcentered_grid: true,\n\t\t\t\trotate_cubes: true,\n\t\t\t\tinteger_size: false,\n\t\t\t\tmeshes: true,\n\t\t\t\ttexture_meshes: false,\n\t\t\t\tlocators: true,\n\t\t\t\trotation_limit: false,\n\t\t\t\tuv_rotation: true,\n\t\t\t\tjava_face_properties: false,\n\t\t\t\tselect_texture_for_particles: false,\n\t\t\t\tbone_binding_expression: false,\n\t\t\t\tanimation_files: false,\n\t\t\t\ttexture_folder: false,\n\t\t\t\timage_editor: false,\n\t\t\t\tedit_mode: true,\n\t\t\t\tpaint_mode: true,\n\t\t\t\tdisplay_mode: false,\n\t\t\t\tanimation_mode: true,\n\t\t\t\tpose_mode: false,\n\t\t\t\tonActivation() {\n\t\t\t\t\tLanguage.addTranslations('en', {\n\t\t\t\t\t\t['menu.animation.anim_time_update']: \"Start Offset\",\n\t\t\t\t\t\t['menu.animation.override']: \"Override Vanilla Animations\",\n\t\t\t\t\t})\n\t\t\t\t\tdelete EffectAnimator.prototype.channels.particle\n\t\t\t\t\tdelete EffectAnimator.prototype.channels.sound\n\t\t\t\t\tEffectAnimator.prototype.channels.timeline.name = \"Instruction (Lua Script)\"\n\t\t\t\t},\n\t\t\t\tonDeactivation() {\n\t\t\t\t\tLanguage.addTranslations('en', {\n\t\t\t\t\t\t['menu.animation.anim_time_update']: \"Anim Time Update\",\n\t\t\t\t\t\t['menu.animation.override']: \"Override\",\n\t\t\t\t\t})\n\t\t\t\t\tEffectAnimator.prototype.channels.particle = particle\n\t\t\t\t\tEffectAnimator.prototype.channels.sound = sound\n\t\t\t\t\tEffectAnimator.prototype.channels.timeline.name = tl('timeline.timeline')\n\t\t\t\t},\n\t\t\t})\n\n\t\t\ttoDelete.push(format)\n\n\t\t\tconst copyPathModelPart = new Action('figura_copy_path_modelpart', {\n\t\t\t\tname: \"Copy ModelPart Path\",\n\t\t\t\tdescription: \"Calculates the scripting path to this ModelPart and copies it to the clipboard.\",\n\t\t\t\ticon: \"fa-clipboard\",\n\t\t\t\tcondition: () => Format === format && (Group.selected != null || Outliner.selected.length === 1),\n\t\t\t\tclick() {\n\t\t\t\t\tlet path = []\n\t\t\t\t\tlet element = Group.selected || Outliner.selected[0]\n\t\t\t\t\twhile (element !== \"root\") {\n\t\t\t\t\t\tpath.unshift(element.name)\n\t\t\t\t\t\telement = element.parent;\n\t\t\t\t\t}\n\t\t\t\t\tpath.unshift(Project.name || \"modelName\")\n\t\t\t\t\tpath = path.map(getValidLuaIndex)\n\t\t\t\t\tpath.unshift('models')\n\t\t\t\t\tlet pathString = path.join(\"\")\n\t\t\t\t\tnavigator.clipboard.writeText(pathString)\n\t\t\t\t\tBlockbench.showQuickMessage(`Coppied \"${pathString}\" to the clipboard`)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst copyPathAnimation = new Action('figura_copy_path_animation', {\n\t\t\t\tname: \"Copy Animation Path\",\n\t\t\t\tdescription: \"Calculates the scripting path to this Animation and copies it to the clipboard.\",\n\t\t\t\ticon: \"fa-clipboard\",\n\t\t\t\tcondition: () => Format === format && (Animation.selected !== null),\n\t\t\t\tclick() {\n\t\t\t\t\tlet path = [Project.name || \"modelName\", Animation.selected.name]\n\t\t\t\t\tpath = path.map(getValidLuaIndex)\n\t\t\t\t\tpath.unshift('animations')\n\t\t\t\t\tlet pathString = path.join(\"\")\n\t\t\t\t\tnavigator.clipboard.writeText(pathString)\n\t\t\t\t\tBlockbench.showQuickMessage(`Coppied \"${pathString}\" to the clipboard`)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst copyPathTextures = new Action('figura_copy_path_texture', {\n\t\t\t\tname: \"Copy Texture Path\",\n\t\t\t\tdescription: \"Calculates the scripting path to this Texture and copies it to the clipboard. Results may vary.\",\n\t\t\t\ticon: \"fa-clipboard\",\n\t\t\t\tcondition: () => Format === format && (Texture.selected !== null),\n\t\t\t\tclick() {\n\t\t\t\t\tlet path\n\t\t\t\t\tif (!isApp)\n\t\t\t\t\t\tpath = `textures[\"${Project.name}.${Texture.selected.name.replace(/\\.png$/, \"\")}\"]`\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet texture = PathModule.parse(Texture.selected.path)\n\t\t\t\t\t\tlet project = PathModule.parse(Project.save_path)\n\t\t\t\t\t\tlet relative = PathModule.relative(project.dir, texture.dir)\n\t\t\t\t\t\tif (texture.dir == '' || relative.startsWith(`..`))\n\t\t\t\t\t\t\tpath = `textures[\"${Project.name}.${Texture.selected.name.replace(/\\.png$/, \"\")}\"]`\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpath = `textures[\"${relative.replace(`\\\\${PathModule.sep}`, '.')}${relative == '' ? '' : '.'}${texture.name}\"]`\n\t\t\t\t\t}\n\t\t\t\t\tnavigator.clipboard.writeText(path)\n\t\t\t\t\tBlockbench.showQuickMessage(`Coppied \"${path}\" to the clipboard`)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst recalculateUV = new Action('figura_recalculate_uv', {\n\t\t\t\tname: \"Recalculate UVs\",\n\t\t\t\tdescription: \"Calculate the uvs for all of a texture's parts\",\n\t\t\t\ticon: \"fa-expand\",\n\t\t\t\tcondition: { method: () => Format === format },\n\t\t\t\tclick() {\n\t\t\t\t\tif (Texture.all.length == 0) {\n\t\t\t\t\t\tBlockbench.showQuickMessage('No textures in bbmodel');\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tlet _texture = null;\n\t\t\t\t\tlet _width = 0, _height = 0;\n\t\t\t\t\tlet dialog = new Dialog({\n\t\t\t\t\t\tid: 'figura_recalculate_uv',\n\t\t\t\t\t\ttitle: 'Recalculate UVs',\n\t\t\t\t\t\tform: {\n\t\t\t\t\t\t\ttexture: {\n\t\t\t\t\t\t\t\tlabel: 'Texture',\n\t\t\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\t\t\toptions: Texture.all.reduce((o, t) => { o[t.uuid] = t.name; return o }, {})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tprev_width: {\n\t\t\t\t\t\t\t\tlabel: 'Current Width',\n\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tprev_height: {\n\t\t\t\t\t\t\t\tlabel: 'Current Height',\n\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t_: \"_\",\n\t\t\t\t\t\t\tnew_width: {\n\t\t\t\t\t\t\t\tlabel: 'New Width',\n\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t\tmin: 1,\n\t\t\t\t\t\t\t\tstep: 1\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tnew_height: {\n\t\t\t\t\t\t\t\tlabel: 'New Height',\n\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t\tmin: 1,\n\t\t\t\t\t\t\t\tstep: 1\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonFormChange(form_result) {\n\t\t\t\t\t\t\tlet texture = Texture.all.find(t => t.uuid === form_result.texture)\n\t\t\t\t\t\t\tif (form_result.texture != _texture) {\n\t\t\t\t\t\t\t\t_texture = form_result.texture\n\t\t\t\t\t\t\t\t_width = texture.width\n\t\t\t\t\t\t\t\t_height = texture.height\n\t\t\t\t\t\t\t\tdialog.setFormValues({\n\t\t\t\t\t\t\t\t\tprev_width: texture.width,\n\t\t\t\t\t\t\t\t\tprev_height: texture.height,\n\t\t\t\t\t\t\t\t\tnew_width: texture.width,\n\t\t\t\t\t\t\t\t\tnew_height: texture.height\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tdialog.updateFormValues(false)\n\t\t\t\t\t\t\t} else if (form_result.prev_width != _width || form_result.prev_height != _height) {\n\t\t\t\t\t\t\t\tdialog.setFormValues({\n\t\t\t\t\t\t\t\t\tprev_width: _width,\n\t\t\t\t\t\t\t\t\tprev_height: _height,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tdialog.updateFormValues(false)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonConfirm(form_result) {\n\t\t\t\t\t\t\tconsole.log(\"?\")\n\t\t\t\t\t\t\tconsole.log(Cube.all.filter(c => !c.box_uv))\n\t\t\t\t\t\t\tUndo.initEdit({ elements: [...Cube.all, ...Mesh.all] })\n\t\t\t\t\t\t\tCube.all.filter(c => !c.box_uv).forEach(cube => {\n\t\t\t\t\t\t\t\tfor (var key in cube.faces) {\n\t\t\t\t\t\t\t\t\tif (cube.faces[key].texture != form_result.texture) continue\n\t\t\t\t\t\t\t\t\tvar uv = cube.faces[key].uv;\n\t\t\t\t\t\t\t\t\tuv[0] *= form_result.new_width / form_result.prev_width;\n\t\t\t\t\t\t\t\t\tuv[2] *= form_result.new_width / form_result.prev_width;\n\t\t\t\t\t\t\t\t\tuv[1] *= form_result.new_height / form_result.prev_height;\n\t\t\t\t\t\t\t\t\tuv[3] *= form_result.new_height / form_result.prev_height;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tMesh.all.forEach(mesh => {\n\t\t\t\t\t\t\t\tfor (var key in mesh.faces) {\n\t\t\t\t\t\t\t\t\tif (mesh.faces[key].texture != form_result.texture) continue\n\t\t\t\t\t\t\t\t\tvar uv = mesh.faces[key].uv;\n\t\t\t\t\t\t\t\t\tfor (let vkey in uv) {\n\t\t\t\t\t\t\t\t\t\tuv[vkey][0] *= form_result.new_width / form_result.prev_width;\n\t\t\t\t\t\t\t\t\t\tuv[vkey][1] *= form_result.new_height / form_result.prev_height;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tCanvas.updateAllUVs()\n\t\t\t\t\t\t\tInterface.Panels.textures.inside_vue.$forceUpdate();\n\t\t\t\t\t\t\tCanvas.updateLayeredTextures();\n\t\t\t\t\t\t\tUVEditor.vue.$forceUpdate();\n\t\t\t\t\t\t\tUndo.finishEdit('Recalculated UVs')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonCancel() {\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tdialog.show();\n\t\t\t\t\tdialog.updateFormValues(false)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst importAnimations = new Action('figura_import_animations', {\n\t\t\t\tname: \"Import Animations from .bbmodel...\",\n\t\t\t\tdescription: \"Import animations from another bbmodel\",\n\t\t\t\ticon: \"fa-file-import\",\n\t\t\t\tcondition: { modes: ['animate'], method: () => Format === format },\n\t\t\t\tclick() {\n\t\t\t\t\tBlockbench.import({\n\t\t\t\t\t\tresource_id: 'model',\n\t\t\t\t\t\textensions: ['bbmodel'],\n\t\t\t\t\t\ttype: 'Model',\n\t\t\t\t\t\treadtype: 'text',\n\t\t\t\t\t\tmultiple: false\n\t\t\t\t\t}, function (files) {\n\t\t\t\t\t\tlet file = files[0]\n\t\t\t\t\t\tif (!file) return\n\n\t\t\t\t\t\t// get the animation data in JSON form via opening the project file and generating the json from the current file.\n\t\t\t\t\t\tlet currentProject = Project\n\t\t\t\t\t\tlet close = !(isApp && ModelProject.all.find(project => (\n\t\t\t\t\t\t\tproject.save_path == file.path || project.export_path == file.path\n\t\t\t\t\t\t)))\n\t\t\t\t\t\tloadModelFile(file);\n\t\t\t\t\t\tlet loadedProject = Project\n\t\t\t\t\t\tlet animJson = Animator.buildFile()\n\t\t\t\t\t\tcurrentProject.select()\n\t\t\t\t\t\tif (close) loadedProject.close()\n\n\t\t\t\t\t\t// load the animations into the current project, deleting the originals if desired.\n\t\t\t\t\t\t// stolen from function importFile at line 1525 of animation.js\n\t\t\t\t\t\tlet form = {};\n\t\t\t\t\t\tlet keys = [];\n\t\t\t\t\t\tfor (var key in animJson.animations) {\n\t\t\t\t\t\t\tform[key.hashCode()] = { label: key, type: 'checkbox', value: true, nocolon: true };\n\t\t\t\t\t\t\tkeys.push(key)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (keys.length == 0) {\n\t\t\t\t\t\t\tBlockbench.showQuickMessage('message.no_animation_to_import');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlet dialog = new Dialog({\n\t\t\t\t\t\t\t\tid: 'figura_animation_import',\n\t\t\t\t\t\t\t\ttitle: 'dialog.animation_import.title',\n\t\t\t\t\t\t\t\tform,\n\t\t\t\t\t\t\t\tonConfirm(form_result) {\n\t\t\t\t\t\t\t\t\tlet names = [];\n\t\t\t\t\t\t\t\t\tlet animsToRemove = [];\n\t\t\t\t\t\t\t\t\tfor (var key of keys) {\n\t\t\t\t\t\t\t\t\t\tif (form_result[key.hashCode()]) {\n\t\t\t\t\t\t\t\t\t\t\tnames.push(key);\n\t\t\t\t\t\t\t\t\t\t\tlet a = Animation.all.find(anim => anim.name == key)\n\t\t\t\t\t\t\t\t\t\t\tif (a) animsToRemove.push(a)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tUndo.initEdit({ animations: animsToRemove })\n\t\t\t\t\t\t\t\t\tif (form_result.replace_animations)\n\t\t\t\t\t\t\t\t\t\tanimsToRemove.forEach(anim => anim.remove(false))\n\t\t\t\t\t\t\t\t\tlet new_animations = Animator.loadFile({ json: animJson, path: null }, names);\n\t\t\t\t\t\t\t\t\tUndo.finishEdit('Figura Import animations', { animations: new_animations })\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tonCancel() {\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tform.select_all_none = {\n\t\t\t\t\t\t\t\ttype: 'buttons',\n\t\t\t\t\t\t\t\tbuttons: ['generic.select_all', 'generic.select_none'],\n\t\t\t\t\t\t\t\tclick(index) {\n\t\t\t\t\t\t\t\t\tlet values = {};\n\t\t\t\t\t\t\t\t\tkeys.forEach(key => values[key.hashCode()] = (index == 0));\n\t\t\t\t\t\t\t\t\tdialog.setFormValues(values);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tform.properties_break = '_'\n\t\t\t\t\t\t\tform.replace_animations = {\n\t\t\t\t\t\t\t\tlabel: \"Replace Animations?\",\n\t\t\t\t\t\t\t\tdescription: \"If enabled, the imported animations will replace the old ones\",\n\t\t\t\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\t\t\t\tvalue: true,\n\t\t\t\t\t\t\t\tnocolon: true\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tdialog.show();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst optimizeModel = new Action('figura_optimize_model', {\n\t\t\t\tname: 'Optimize Model',\n\t\t\t\ticon: 'fa-gear',\n\t\t\t\tcondition: { method: () => Format == format },\n\t\t\t\tclick() {\n\t\t\t\t\tnew Dialog('figura_optimize_model_dialog', {\n\t\t\t\t\t\ttitle: \"Optimize Model\",\n\t\t\t\t\t\tform: {\n\t\t\t\t\t\t\tclear_unused_pivots: {\n\t\t\t\t\t\t\t\ttype: \"checkbox\",\n\t\t\t\t\t\t\t\tlabel: \"Clear Unused Pivot Data\",\n\t\t\t\t\t\t\t\tdescription: \"If a cube does not have a rotation, set the pivot point to the origin.\\nFigura does not store pivot points at the origin, resulting in saved bytes\",\n\t\t\t\t\t\t\t\tvalue: true,\n\t\t\t\t\t\t\t\tnocolon: true,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonConfirm(form_result) {\n\t\t\t\t\t\t\tUndo.initEdit({ elements: Cube.all })\n\t\t\t\t\t\t\tif (form_result.clear_unused_pivots) {\n\t\t\t\t\t\t\t\tCube.all.forEach((cube) => {\n\t\t\t\t\t\t\t\t\tif (cube.rotation.allEqual(0)) {\n\t\t\t\t\t\t\t\t\t\tcube.origin.V3_set(0, 0, 0)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tCanvas.updatePositions(Cube.all)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tUndo.finishEdit('Optimize Model');\n\t\t\t\t\t\t}\n\t\t\t\t\t}).show()\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst validateFaces = new ValidatorCheck('figura_mesh_face_rule', {\n\t\t\t\tupdate_triggers: ['update_selection'],\n\t\t\t\tcondition: {\n\t\t\t\t\tmethod: (context) => Format === format && Mesh.hasAny()\n\t\t\t\t},\n\t\t\t\trun() {\n\t\t\t\t\tMesh.all.forEach(mesh => {\n\t\t\t\t\t\tmesh.forAllFaces(face => {\n\t\t\t\t\t\t\tif (![3, 4].includes(face.vertices.length)) {\n\t\t\t\t\t\t\t\tthis.fail({\n\t\t\t\t\t\t\t\t\tmessage: `Mesh ${mesh.name} has invalid face ${face.getFaceKey()} with ${face.vertices.length} vertices`,\n\t\t\t\t\t\t\t\t\tbuttons: [{\n\t\t\t\t\t\t\t\t\t\tname: \"Select Mesh\",\n\t\t\t\t\t\t\t\t\t\ticon: \"fa-gem\",\n\t\t\t\t\t\t\t\t\t\tclick() {\n\t\t\t\t\t\t\t\t\t\t\tmesh.select()\n\t\t\t\t\t\t\t\t\t\t\tBarItems.selection_mode.change('face')\n\n\t\t\t\t\t\t\t\t\t\t\t// It works best when I select all possible selections, even though I only need to select faces.\n\t\t\t\t\t\t\t\t\t\t\tlet selectedVertices = mesh.getSelectedVertices(true)\n\t\t\t\t\t\t\t\t\t\t\tselectedVertices.empty()\n\t\t\t\t\t\t\t\t\t\t\tselectedVertices.push(...face.vertices)\n\n\t\t\t\t\t\t\t\t\t\t\tlet selectedEdges = mesh.getSelectedEdges(true)\n\t\t\t\t\t\t\t\t\t\t\tselectedEdges.empty()\n\t\t\t\t\t\t\t\t\t\t\tfor (i = 0; i < face.vertices.length; i++)\n\t\t\t\t\t\t\t\t\t\t\t\tselectedEdges.push([face.vertices[i], face.vertices[(i + 1) % face.vertices.length]])\n\n\t\t\t\t\t\t\t\t\t\t\tlet selectedFaces = mesh.getSelectedFaces(true)\n\t\t\t\t\t\t\t\t\t\t\tselectedFaces.empty()\n\t\t\t\t\t\t\t\t\t\t\tselectedFaces.push(face.getFaceKey())\n\n\t\t\t\t\t\t\t\t\t\t\t// UV Editor for completeness\n\t\t\t\t\t\t\t\t\t\t\tUVEditor.vue.selected_faces.empty();\n\t\t\t\t\t\t\t\t\t\t\tUVEditor.vue.selected_faces.safePush(face.getFaceKey());\n\t\t\t\t\t\t\t\t\t\t\tupdateSelection()\n\t\t\t\t\t\t\t\t\t\t\tValidator.dialog.hide()\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst validateTextureNames = new ValidatorCheck('figura_duplicate_texture_name_rule', {\n\t\t\t\tupdate_triggers: ['add_texture', 'update_selection'],\n\t\t\t\tcondition: {\n\t\t\t\t\tmethod: (context) => Format === format && Texture.all.length > 0\n\t\t\t\t},\n\t\t\t\trun() {\n\t\t\t\t\tlet textureCount = Texture.all.reduce((arr, t) => {\n\t\t\t\t\t\tif (arr[t.name])\n\t\t\t\t\t\t\tarr[t.name]++\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tarr[t.name] = 1\n\t\t\t\t\t\treturn arr\n\t\t\t\t\t}, {})\n\t\t\t\t\tfor (const [name, cnt] of Object.entries(textureCount))\n\t\t\t\t\t\tif (cnt > 1)\n\t\t\t\t\t\t\tthis.fail({\n\t\t\t\t\t\t\t\tmessage: `${cnt} textures have the name \"${name}\". Figura does not support textures with duplicate names`\n\t\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst arbitraryGroupNames = new Setting('figura_allow_duplicate_names', {\n\t\t\t\tname: \"Allow arbitrary group names\",\n\t\t\t\tdescription: \"Enabling this removes the group name restrictions imposed by Blockbench. This can break Animations. Figura Model Format is not liable for any harm caused by this setting. You have been warned.\",\n\t\t\t\tcategory: 'edit',\n\t\t\t\ttype: 'toggle',\n\t\t\t\tvalue: false\n\t\t\t})\n\n\t\t\tCube.prototype.menu.addAction(copyPathModelPart, '#manage');\n\t\t\tMesh.prototype.menu.addAction(copyPathModelPart, '#manage');\n\t\t\tGroup.prototype.menu.addAction(copyPathModelPart, '#manage');\n\t\t\tAnimation.prototype.menu.addAction(copyPathAnimation, '#properties');\n\t\t\tTexture.prototype.menu.addAction(copyPathTextures, '#properties');\n\t\t\tMenuBar.menus.uv.addAction(recalculateUV)\n\t\t\tMenuBar.menus.animation.addAction(importAnimations, '#file')\n\t\t\tMenuBar.menus.tools.addAction(optimizeModel)\n\n\t\t\ttoDelete.push(\n\t\t\t\tcopyPathModelPart,\n\t\t\t\tcopyPathAnimation,\n\t\t\t\tcopyPathTextures,\n\t\t\t\trecalculateUV,\n\t\t\t\timportAnimations,\n\t\t\t\tvalidateFaces,\n\t\t\t\tvalidateTextureNames,\n\t\t\t\tarbitraryGroupNames,\n\t\t\t\toptimizeModel,\n\t\t\t)\n\n\t\t\t// Removes the FileName in the Project dialog\n\t\t\tModelProject.properties.name.condition = () => Format != format\n\n\t\t\t// Removed the Render Order field from the Right Click context menu.\n\t\t\tconst elementRenderOrderCondition = BarItems.element_render_order.condition\n\t\t\tBarItems['element_render_order'].condition = () => Format === format ? false : elementRenderOrderCondition()\n\n\t\t\t// Change the default name of new Animations from `animation.model.new` to just `new`\n\t\t\tconst addAnimationClick = BarItems['add_animation'].click\n\t\t\tBarItems['add_animation'].click = function () {\n\t\t\t\tif (Format !== format) addAnimationClick.call(this)\n\t\t\t\telse\n\t\t\t\t\tnew Animation({\n\t\t\t\t\t\tname: 'new',\n\t\t\t\t\t\tsaved: false\n\t\t\t\t\t}).add(true).propertiesDialog()\n\t\t\t}\n\t\t\t// Add a popup when clicking on Export Textures to notify new users\n\t\t\tconst exportAnimationClick = BarItems['export_animation_file'].click\n\t\t\tBarItems['export_animation_file'].click = function (...args) {\n\t\t\t\tlet button = this\n\t\t\t\tif (Format !== format) {\n\t\t\t\t\texportAnimationClick.call(button, ...args)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tnew Dialog({\n\t\t\t\t\tid: \"figura_confirm_export_animation\",\n\t\t\t\t\ttitle: \"Confirm Export Animations\",\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t\"<p><strong>Figura does not read these exported Animation files.</strong></p>\",\n\t\t\t\t\t\t\"<p>Figura reads animations directly from the Blockbench file itself.</p>\",\n\t\t\t\t\t\t\"<p>The Export Animmations button should only be used when transfering animations from one bbmodel to another.</p>\",\n\t\t\t\t\t\t\"<p>Otherwise, do not touch this button.</p>\",\n\t\t\t\t\t\t\"<p>Do you understand, and want the exported animations anyways?</p>\"\n\t\t\t\t\t],\n\t\t\t\t\tonConfirm() {\n\t\t\t\t\t\texportAnimationClick.call(button, ...args)\n\t\t\t\t\t}\n\t\t\t\t}).show()\n\t\t\t}\n\n\t\t\tconst name_regex = Group.prototype.name_regex, needsUniqueName = Group.prototype.needsUniqueName\n\t\t\tGroup.prototype.name_regex = () => (Format === format && arbitraryGroupNames.value) ? false : name_regex();\n\t\t\tGroup.prototype.needsUniqueName = () => (Format === format && arbitraryGroupNames.value) ? false : needsUniqueName();\n\t\t\tconst showMessageBox = Blockbench.showMessageBox\n\t\t\tBlockbench.showMessageBox = function (options, callback) {\n\t\t\t\tif (Format === format && arbitraryGroupNames.value && options.translateKey == \"duplicate_groups\") return\n\t\t\t\tshowMessageBox.apply(this, [options, callback])\n\t\t\t}\n\n\t\t\t// Remove the Texture Render Mode field from the Right Click context menu.\n\t\t\tTexture.prototype.menu.structure.find(v => v.name == 'menu.texture.render_mode').condition = () => Format !== format\n\t\t\t// In the Texture Properties Dialog specifically, remove the Render Mode field\n\t\t\tconst DialogBuild = Dialog.prototype.build\n\t\t\tDialog.prototype.build = function () {\n\t\t\t\tif (Format === format && this.id == 'texture_edit') delete this.form.render_mode\n\t\t\t\tDialogBuild.call(this)\n\t\t\t}\n\n\t\t\t// Prevents the Timeline from erroring when Sound and Particle channels are removed\n\t\t\tconst displayFrame = EffectAnimator.prototype.displayFrame\n\t\t\tEffectAnimator.prototype.displayFrame = function () {\n\t\t\t\tif (Format === format) return\n\t\t\t\tdisplayFrame.call(this)\n\t\t\t}\n\n\t\t\t// Remove molang validation, as Figura uses Lua not molang\n\t\t\tconst molangSyntax = Validator.checks.find(element => element.id == 'molang_syntax')\n\t\t\tif (molangSyntax) {\n\t\t\t\tlet method = molangSyntax.condition.method\n\t\t\t\tmolangSyntax.condition.method = (context) => Format === format ? false : (method ? method(context) : false)\n\t\t\t}\n\t\t},\n\t\tonunload() {\n\t\t\tfor (const deletable of toDelete)\n\t\t\t\tdeletable.delete()\n\t\t}\n\t});\n\n})()"
  },
  {
    "path": "plugins/free_rotation/about.md",
    "content": "<div id=\"about-content\">\n  <p>This format is designed to create <strong>Minecraft: Java Edition</strong> item models without the rotation limitations imposed by the game.</p>\n  <p>These models cannot be re-imported, so make sure to save your project as a <strong>bbmodel</strong>.</p>\n  <p>This format requires <strong>Minecraft 1.21.4</strong> or later.</p>\n  <h2 class=\"markdown\">Usage:</h2>\n  <p>To use this plugin, start by creating a new model, or converting an existing cube based project into this format.</p>\n  <p>Configure the display settings. These will be respected as long as the size limits are not reached.</p>\n  <p>Use <strong>File > Export > Free Rotation Item</strong> to export your model into your resource pack.</p>\n  <p>When exporting, select which display slots you would like to export. The more you export, the larger the file size, so only export what you need.</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 128px;\n    object-fit: contain;\n    margin: 16px 0 24px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://github.com/Godlander\">\n    <i class=\"fa_big icon fab fa-github\" style=\"color: #6E40C9;\"></i>\n    <p>By Godlander</p>\n  </a>\n  <a href=\"https://discord.gg/2s6th9SvZd\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Godlander's Discord</p>\n  </a>\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Ewan's Discord</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/free_rotation/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2024-12-20\",\n    \"author\": \"Godlander & Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2025-01-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed changelog tab not showing up on the plugin page\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2025-03-25\",\n    \"author\": \"Godlander & Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"GUI Light is now supported\",\n          \"Changing namespace is now supported\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed rotations not being exported when display settings were not customised\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  },\n  \"1.2.1\": {\n    \"title\": \"1.2.1\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the export dialog failing to open\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/free_rotation/free_rotation.js",
    "content": "(() => {\n  const path = require(\"node:path\")\n\n  let fs, codec, format, action, properties, styles, oldGUILightCondition\n\n  const id = \"free_rotation\"\n  const name = \"Free Rotation\"\n  const icon = \"3d_rotation\"\n  const description = \"Create Java Item models without any rotation limitations.\"\n\n  const links = {\n    websiteGodlander: {\n      text: \"By Godlander\",\n      link: \"https://github.com/Godlander\",\n      icon: \"fab.fa-github\",\n      colour: \"#6E40C9\"\n    },\n    discordGodlander: {\n      text: \"Godlander's Discord\",\n      link: \"https://discord.gg/2s6th9SvZd\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    },\n    websiteEwan: {\n      text: \"By Ewan Howell\",\n      link: \"https://ewanhowell.com/\",\n      icon: \"language\",\n      colour: \"#33E38E\"\n    },\n    discordEwan: {\n      text: \"Ewan's Discord\",\n      link: \"https://discord.ewanhowell.com/\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    }\n  }\n\n  let directory\n  if (SystemInfo.platform === \"win32\") {\n    directory = PathModule.join(SystemInfo.appdata_directory, \".minecraft\")\n  } else if (SystemInfo.platform === \"darwin\") {\n    directory = PathModule.join(SystemInfo.home_directory, \"Library\", \"Application Support\", \"minecraft\")\n  } else {\n    directory = PathModule.join(SystemInfo.home_directory, \".minecraft\")\n  }\n\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author: \"Godlander & Ewan Howell\",\n    description,\n    tags: [\"Minecraft: Java Edition\", \"Items\", \"Rotation\"],\n    version: \"1.2.1\",\n    min_version: \"5.0.0\",\n    variant: \"desktop\",\n    await_loading: true,\n    website: \"https://ewanhowell.com/plugins/free-rotation/\",\n    repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/free_rotation\",\n    bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Free Rotation]\",\n    creation_date: \"2024-12-20\",\n    has_changelog: true,\n    onload() {\n      fs = require(\"fs\", {\n        message: \"This permission is required for exporting your free rotation models.\",\n        optional: false\n      })\n\n      if (!fs) {\n        throw new Error(\"fs access denied\")\n      }\n\n      styles = Blockbench.addCSS(`\n        #format_page_free_rotation {\n          padding-bottom: 0;\n        }\n        #format_page_free_rotation .format_target {\n          margin-bottom: 6px;\n        }\n        #format_page_free_rotation div:nth-child(3),\n        #format_page_free_rotation content {\n          overflow-y: auto;\n        }\n        .format_entry[format=\"free_rotation\"] i {\n          overflow: visible;\n        }\n        .free-rotation-links {\n          display: flex;\n          justify-content: space-around;\n          margin: 20px 35px 0;\n        }\n        .free-rotation-links * {\n          cursor: pointer;\n        }\n        .free-rotation-links > a {\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          gap: 5px;\n          padding: 5px;\n          text-decoration: none;\n          flex-grow: 1;\n          flex-basis: 0;\n          color: var(--color-subtle_text);\n          text-align: center;\n        }\n        .free-rotation-links > a:hover {\n          background-color: var(--color-accent);\n          color: var(--color-light);\n        }\n        .free-rotation-links > a > i {\n          font-size: 32px;\n          width: 100%;\n          max-width: initial;\n          height: 32px;\n          text-align: center;\n        }\n        .free-rotation-links > a:hover > i {\n          color: var(--color-light) !important;\n        }\n        .free-rotation-links > a > p {\n          flex: 1;\n          display: flex;\n          align-items: center;\n        }\n      `)\n\n      codec = new Codec(\"free_rotation_codec\", {\n        name: \"Free Rotation Codec\",\n        remember: true,\n        export() {\n          const project = Project\n          for (const texture of Texture.all) {\n            if (!texture.saved) texture.save()\n          }\n          const dialog = new Dialog({\n            id: \"free_rotation_export_prompt\",\n            title: \"Free Rotation Export\",\n            buttons: [],\n            lines: [`<style>\n              #free_rotation_export_prompt h2 {\n                margin-bottom: 8px;\n              }\n              #free_rotation_export_prompt .button-row {\n                display: flex;\n                justify-content: flex-end;\n                width: 100%;\n                margin-top: 16px;\n              }\n              #free_rotation_export_prompt button:disabled {\n                cursor: not-allowed;\n                opacity: 0.5;\n                background-color: var(--color-button);\n                color: var(--color-text) !important;\n              }\n              #free_rotation_export_prompt .dialog_content {\n                margin: 0;\n                padding: 16px;\n              }\n              .free-rotation-export-error {\n                color: var(--color-error);\n                font-weight: 600;\n              }\n              .free-rotation-export-error code {\n                background-color: var(--color-back);\n                border: 1px solid var(--color-border);\n                padding: 0 2px;\n              }\n              #free_rotation_display_exports {\n                display: flex;\n                gap: 8px;\n              }\n              #free_rotation_display_exports > * {\n                cursor: pointer;\n              }\n            </style>`],\n            component: {\n              data: {\n                ModelProject,\n                project,\n                exportAllowed: false,\n                idError: \"\",\n                nameError: \"\",\n                displayIcons: {\n                  thirdperson_lefthand: { icon: \"accessibility\" },\n                  thirdperson_righthand: { icon: \"accessibility\" },\n                  firstperson_lefthand: { icon: \"person\" },\n                  firstperson_righthand: { icon: \"person\" },\n                  head: { icon: \"sentiment_satisfied\" },\n                  ground: { icon: \"icon-ground\", iconType: \"custom\" },\n                  fixed: { icon: \"filter_frames\" },\n                  gui: { name: \"GUI\", icon: \"border_style\" }\n                }\n              },\n              methods: {\n                check() {\n                  if (project.free_rotation_namespace.match(/[^a-z0-9\\._-]/)) {\n                    this.namespaceError = \"The Namespace can only include the following characters:<br><code>a-z</code>, <code>0-9</code>, <code>_</code>, <code>-</code>, <code>.</code>\"\n                  } else {\n                    this.namespaceError = \"\"\n                  }\n                  if (!project.free_rotation_item) {\n                    this.idError = \"The Item ID is required\"\n                  } else if (project.free_rotation_item.match(/[^a-z0-9\\._-]/)) {\n                    this.idError = \"The Item ID can only include the following characters:<br><code>a-z</code>, <code>0-9</code>, <code>_</code>, <code>-</code>, <code>.</code>\"\n                  } else {\n                    this.idError = \"\"\n                  }\n                  if (!project.free_rotation_name) {\n                    this.nameError = \"The Model Name is required\"\n                  } else if (project.free_rotation_name.match(/[^a-z0-9\\._-]/)) {\n                    this.nameError = \"The Model Name can only include the following characters:<br><code>a-z</code>, <code>0-9</code>, <code>_</code>, <code>-</code>, <code>.</code>\"\n                  } else {\n                    this.nameError = \"\"\n                  }\n                  if (this.namespaceError || this.idError || this.nameError) {\n                    this.exportAllowed = false\n                    return\n                  }\n                  this.exportAllowed = true\n                },\n                async exportModel() {\n                  dialog.close()\n\n                  const dir = Blockbench.pickDirectory({\n                    title: \"Select resource pack to export to\",\n                    startpath: project.free_rotation_path\n                  })\n                  if (!dir) return\n\n                  const namespace = Project.free_rotation_namespace || \"minecraft\"\n\n                  const definitionDir = path.join(dir, \"assets\", namespace, \"items\")\n                  const definitionFile = path.join(definitionDir, project.free_rotation_item + \".json\")\n                  const modelDir = path.join(dir, \"assets\", namespace, \"models\", project.free_rotation_name)\n\n                  if (fs.existsSync(definitionFile)) {\n                    const check = await new Promise(fulfil => {\n                      Blockbench.showMessageBox({\n                        title: \"Item definition already exists\",\n                        message: `The item definition <code>assets/${namespace}/items/${project.free_rotation_item}.json</code> already exists. Are you sure you want to continue and overwrite it?`,\n                        buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n                      }, button => {\n                        if (button === 0) fulfil(true)\n                        else fulfil()\n                      })\n                    })\n                    if (!check) return\n                  }\n\n                  if (fs.existsSync(modelDir)) {\n                    const check = await new Promise(fulfil => {\n                      Blockbench.showMessageBox({\n                        title: \"Model already exists\",\n                        message: `The the model folder <code>assets/${namespace}/models/${project.free_rotation_name}</code> already exists. Are you sure you want to continue and possibly overwrite files inside it?`,\n                        buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n                      }, button => {\n                        if (button === 0) fulfil(true)\n                        else fulfil()\n                      })\n                    })\n                    if (!check) return\n                  }\n\n                  const processing = new Dialog(\"exporting\", {\n                    title: \"Exporting...\",\n                    lines: [\n                      `<style>\n                        #exporting .dialog_close_button {\n                          display: none;\n                        }\n                        #exporting h1 {\n                          margin: 0;\n                        }\n                      </style>`,\n                      \"<h1>Exporting...</h1>\"\n                    ],\n                    buttons: [],\n                    cancel_on_click_outside: false,\n                    onConfirm: () => false\n                  }).show()\n                  const close = processing.close\n                  processing.close = () => {}\n\n                  fs.mkdirSync(definitionDir, { recursive: true })\n                  fs.mkdirSync(modelDir, { recursive: true })\n\n                  const models = await codec.compile(project)\n\n                  const definition = {\n                    model: {\n                      type: \"composite\",\n                      models: new Array(models.length).fill().map((e, i) => ({\n                        type: \"model\",\n                        model: `${namespace}:${project.free_rotation_name}/${i}`\n                      }))\n                    }\n                  }\n\n                  fs.writeFileSync(definitionFile, autoStringify(definition))\n                  for (const [i, model] of models.entries()) {\n                    fs.writeFileSync(path.join(modelDir, `${i}.json`), model)\n                  }\n\n                  Blockbench.showQuickMessage(\"Exported free rotation model\")\n                  close.bind(processing)()\n                }\n              },\n              template: `\n                <div>\n                  <h2>Model Details</h2>\n                  <div class=\"dialog_bar bar form_bar form_bar_item\" :title=\"ModelProject.properties.free_rotation_namespace.description\">\n                    <label class=\"name_space_left\" for=\"item\">Namespace:</label>\n                    <input type=\"text\" class=\"dark_bordered half focusable_input\" id=\"item\" placeholder=\"minecraft\" v-model=\"project.free_rotation_namespace\" @input=\"check\">\n                    <i class=\"fa fa-question dialog_form_description\" @click=\"Blockbench.showQuickMessage(ModelProject.properties.free_rotation_namespace.description)\"></i>\n                  </div>\n                  <div class=\"dialog_bar bar form_bar form_bar_item\" :title=\"ModelProject.properties.free_rotation_item.description\">\n                    <label class=\"name_space_left\" for=\"item\">Item ID:</label>\n                    <input type=\"text\" class=\"dark_bordered half focusable_input\" id=\"item\" placeholder=\"diamond_sword\" v-model=\"project.free_rotation_item\" @input=\"check\">\n                    <i class=\"fa fa-question dialog_form_description\" @click=\"Blockbench.showQuickMessage(ModelProject.properties.free_rotation_item.description)\"></i>\n                  </div>\n                  <div v-if=\"idError\" class=\"free-rotation-export-error\" v-html=\"idError\"></div>\n                  <div class=\"dialog_bar bar form_bar form_bar_name\" :title=\"ModelProject.properties.free_rotation_name.description\">\n                    <label class=\"name_space_left\" for=\"name\">Model Name:</label>\n                    <input type=\"text\" class=\"dark_bordered half focusable_input\" id=\"name\" placeholder=\"diamond_katana\" v-model=\"project.free_rotation_name\" @input=\"check\">\n                    <i class=\"fa fa-question dialog_form_description\" @click=\"Blockbench.showQuickMessage(ModelProject.properties.free_rotation_name.description)\"></i>\n                  </div>\n                  <div v-if=\"nameError\" class=\"free-rotation-export-error\" v-html=\"nameError\"></div>\n                  <h2 style=\"margin-top: 32px;\">Display Settings to Export</h2>\n                  <p style=\"margin: -8px 0 16px;\">Free Rotation models can be quite large in file size. Select only the display settings you need in order to reduce this file size.</p>\n                  <div id=\"free_rotation_display_exports\">\n                    <div v-for=\"(value, key) in project.free_rotation_display\" class=\"tool\" :class=\"{ enabled: value }\" @click=\"project.free_rotation_display[key] = !value\">\n                      <div class=\"tooltip\">{{ displayIcons[key]?.name || key.replace(/_/g, \" \").split(\" \").map(e => e.slice(0, 1).toUpperCase() + e.slice(1)).join(\" \") }}</div>\n                      <i v-if=\"displayIcons[key]?.iconType === 'custom'\" :class=\"displayIcons[key].icon\"></i>\n                      <i v-else class=\"material-icons icon\">{{ displayIcons[key]?.icon || 'desktop_windows' }}</i>\n                    </div>\n                  </div>\n                  <div class=\"button-row\">\n                    <button @click=\"exportModel\" :disabled=\"!exportAllowed\">Export</button>\n                  </div>\n                </div>\n              `\n            },\n            onOpen() {\n              if (project.free_rotation_item || project.free_rotation_name) {\n                this.content_vue.check()\n              }\n            }\n          }).show()\n        },\n        async compile(project) {\n          project ??= Project\n\n          project.select()\n\n          const mode = Modes.selected\n          Modes.options.edit.select()\n\n          let maxcoord = 24\n\n          const cubes = Cube.all.filter(e => e.export)\n\n          for (const cube of cubes) {\n            for (const position of cube.getGlobalVertexPositions()) {\n              for (const coord of position) {\n                maxcoord = Math.max(maxcoord, Math.abs(coord - 8))\n              }\n            }\n          }\n          const downscale = Math.min(4, maxcoord / 24)\n\n          const models = []\n          for (const cube of cubes) {\n            const element = {}\n            const model = {\n              textures: {},\n              elements: [element],\n              display: {}\n            }\n            if (project.front_gui_light) model.gui_light = \"front\"\n            let size = [\n              (cube.to[0] - cube.from[0]) / downscale,\n              (cube.to[1] - cube.from[1]) / downscale,\n              (cube.to[2] - cube.from[2]) / downscale\n            ]\n            element.from = [\n              8 - (size[0] / 2),\n              8 - (size[1] / 2),\n              8 - (size[2] / 2)\n            ]\n            element.to = [\n              8 + (size[0] / 2),\n              8 + (size[1] / 2),\n              8 + (size[2] / 2)\n            ]\n            element.light_emission = cube.light_emission\n            element.faces = {}\n            for (const [face, data] of Object.entries(cube.faces)) {\n              if (!data || !data.texture) continue\n              const renderedFace = {}\n              if (data.enabled) {\n                renderedFace.uv = data.uv\n                  .slice()\n                  .map((v, i) => (v * 16) / UVEditor.getResolution(i % 2))\n              }\n              if (data.rotation) renderedFace.rotation = data.rotation\n              if (data.texture) {\n                const texture = project.textures.find(e => e.uuid == data.texture)\n                if (!texture) {\n                  console.error(\"Texture not found... skipping\")\n                } else {\n                  renderedFace.texture = \"#\" + texture.id\n                  const path = texture.source.replaceAll(/\\\\/g, \"/\")\n                  const parts = path.split(\"/\")\n                  const assetsIndex = parts.indexOf(\"assets\")\n                  if (assetsIndex === -1) model.textures[texture.id] = \"unknown\"\n                  else {\n                    const namespace = parts[assetsIndex + 1]\n                    const resourcePath = parts.slice(assetsIndex + 3, -1).join(\"/\")\n                    model.textures[texture.id] = namespace + \":\" + resourcePath + \"/\" + texture.name.slice(0, -4)\n                  }\n                }\n              }\n              if (data.tint >= 0) renderedFace.tintindex = data.tint\n              element.faces[face] = renderedFace\n            }\n\n            const quat = new THREE.Quaternion()\n            cube.mesh.getWorldQuaternion(quat)\n            const rotation = new THREE.Quaternion()\n\n            for (const slot of DisplayMode.slots) {\n              if (project.free_rotation_display[slot]) {\n                const scale = new THREE.Vector3(downscale, downscale, downscale)\n                const translation = cube.getWorldCenter()\n                translation.y -= 8\n\n                const display = project.display_settings[slot]\n                if (display) {\n                  const dscale = new THREE.Vector3().fromArray(display.scale)\n                  const dtranslation = new THREE.Vector3().fromArray(display.translation)\n                  const drotation = new THREE.Quaternion().setFromEuler(\n                    new THREE.Euler().fromArray([\n                      Math.degToRad(display.rotation[0]),\n                      Math.degToRad(display.rotation[1]),\n                      Math.degToRad(display.rotation[2])\n                    ], \"XYZ\")\n                  )\n                  scale.multiply(dscale)\n                  rotation.multiplyQuaternions(drotation, quat)\n                  translation.multiply(dscale)\n                  translation.applyQuaternion(drotation)\n                  translation.add(dtranslation)\n                } else {\n                  rotation.copy(quat)\n                }\n\n                model.display[slot] = {\n                  rotation: (new THREE.Euler()).setFromQuaternion(rotation, \"XYZ\").toArray().slice(0,3).map(e => Math.radToDeg(e)),\n                  translation: translation.toArray(),\n                  scale: scale.toArray()\n                }\n              }\n            }\n\n            models.push(autoStringify(model))\n          }\n\n          mode.select()\n          return models\n        }\n      })\n\n      format = new ModelFormat({\n        id: \"free_rotation\",\n        name: \"Free Rotation Item\",\n        extension: \"json\",\n        icon: \"3d_rotation\",\n        category: \"minecraft\",\n        format_page: {\n          component: {\n            methods: {\n              create: () => format.new()\n            },\n            template: `\n              <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n                <p class=\"format_description\">${description}</p>\n                <p class=\"format_target\"><b>Target</b> : <span>Minecraft: Java Edition</span></p>\n                <content>\n                  <h3 class=\"markdown\">About:</h3>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li>This format is designed to create <strong>Minecraft: Java Edition</strong> item models without the rotation limitations imposed by the game.</li>\n                      <li>These models cannot be re-imported, so make sure to save your project as a <strong>bbmodel</strong>.</li>\n                      <li>This format requires <strong>Minecraft 1.21.4</strong> or later.</li>\n                    </ul>\n                  </p>\n                  <h3 class=\"markdown\">Usage:</h3>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li>Create a new model, or convert an existing cube based project into this format.</li>\n                      <li>Configure the display settings. These will be respected as long as the size limits are not reached.</li>\n                      <li>Use <strong>File > Export > Free Rotation Item</strong> to export your model into your resource pack.</li>\n                      <li>When exporting, select which display slots you would like to export. The more you export, the larger the file size, so only export what you need.</li>\n                    </ul>\n                  </p>\n                </content>\n                <div class=\"spacer\"></div>\n                <div class=\"free-rotation-links\">${Object.values(links).map(e => `\n                  <a href=\"${e.link}\">\n                    ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                    <p>${e.text}</p>\n                  </a>\n                `).join(\"\")}</div>\n                <div class=\"button_bar\">\n                  <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"create\">\n                    <i class=\"material-icons icon\">${icon}</i>\n                    Create New Free Rotation Item\n                  </button>\n                </div>\n              </div>\n            `\n          }\n        },\n        render_sides: \"front\",\n        model_identifier: false,\n        parent_model_id: true,\n        vertex_color_ambient_occlusion: true,\n        bone_rig: true,\n        rotate_cubes: true,\n        optional_box_uv: true,\n        uv_rotation: true,\n        java_cube_shading_properties: true,\n        java_face_properties: true,\n        cullfaces: true,\n        animated_textures: true,\n        select_texture_for_particles: true,\n        texture_mcmeta: true,\n        display_mode: true,\n        texture_folder: true,\n        codec\n      })\n      codec.format = format\n\n      action = new Action(\"free_rotation_export\", {\n        name: \"Export Free Rotation Item\",\n        icon: \"3d_rotation\",\n        condition: { formats: [format.id] },\n        click: () => codec.export()\n      })\n      MenuBar.addAction(action, \"file.export.0\")\n\n      properties = [\n        new Property(ModelProject, \"string\", \"free_rotation_namespace\", {\n          label: \"Namespace\",\n          description: \"The namespace the model will be exported to\",\n          default: \"minecraft\",\n          condition: { formats: [format.id] }\n        }),\n        new Property(ModelProject, \"string\", \"free_rotation_item\", {\n          label: \"Item ID\",\n          description: \"The item ID of the item that the model should apply to\",\n          condition: { formats: [format.id] }\n        }),\n        new Property(ModelProject, \"string\", \"free_rotation_name\", {\n          label: \"Model Name\",\n          description: \"The name of the model file that is output\",\n          condition: { formats: [format.id] }\n        }),\n        new Property(ModelProject, \"string\", \"free_rotation_path\", {\n          label: \"Export Path\",\n          default: directory,\n          condition: { formats: [format.id] },\n          exposed: false\n        }),\n        new Property(ModelProject, \"object\", \"free_rotation_display\", {\n          default: {\n            thirdperson_lefthand: true,\n            thirdperson_righthand: true,\n            firstperson_lefthand: true,\n            firstperson_righthand: true,\n            head: true,\n            ground: true,\n            fixed: true,\n            gui: true\n          },\n          label: \"Display Settings\",\n          condition: { formats: [format.id] },\n          exposed: false\n        })\n      ]\n      oldGUILightCondition = BarItems.gui_light.condition\n      BarItems.gui_light.condition = () => Format.id === id || oldGUILightCondition()\n    },\n    onunload() {\n      if (oldGUILightCondition) {\n        BarItems.gui_light.condition = oldGUILightCondition\n        codec.delete()\n        format.delete()\n        action.delete()\n        styles.delete()\n        properties.forEach(e => e.delete())\n      }\n    }\n  })\n})()"
  },
  {
    "path": "plugins/free_rotation/members.yml",
    "content": "maintainers:\n  - ewanhowell5195\n  - Godlander"
  },
  {
    "path": "plugins/geckolib/README.md",
    "content": "# GeckoLib Animation Utils Developer Readme\n\nThis readme is intended for developers wishing to work on the GeckoLib plugin.\n\n# Environment setup\n## Windows\nInspect the contents of [.nvmrc](./src/.nvmrc) - this specifies the recommended version of Node.JS to use for plugin development. You can [download the corresponding version of Node.JS here](https://nodejs.org/en/download/releases).\n\n\n## macOS and Unix\nIt's recommended, though not required, to install the correct version of Node.JS using the Node Version Manager script (nvm). [Follow the install guide here](https://github.com/nvm-sh/nvm/blob/master/README.md).\n\nA brief summary of how to use `nvm` once it's installed is to `cd` into the [src](./src) folder of the plugin and then run:\n```\nnvm install `cat .nvmrc`\n```\nfollowed by: \n```\nnvm use\n```\nIf you have multiple versions of node installed on your system, it may be convenient to [change the default version to the version of node you just installed](https://github.com/nvm-sh/nvm/blob/master/README.md#set-default-node-version). Otherwise you may need to run `nvm use` every time you start a new terminal session. If you are using `nvm` for other projects with other versions of node, you can also use a [shell hook script to automatically run nvm use when changing directories](https://stackoverflow.com/questions/23556330/run-nvm-use-automatically-every-time-theres-a-nvmrc-file-on-the-directory).\n\nYou can confirm the active node version by running \n```\nnode --version\n```\n\n## All Platforms\nAfter Node.JS has been installed, run:\n```\nnpm install\n```\n\nInside the `src` folder.\n\nYou should run this command any time there has been a change to `package.json`. You might see a diff on `package-lock.json`. This is usually OK and indicates an update to transient dependenices, and should be OK to commit. If you see a LOT of changes to this file it might be an indication you are using the wrong version of node/npm.\n\n# Developing the plugin\n\n## Working on the plugin\nFirst, start the development webpack bundler:\n```\nnpm start\n```\nThe development bundler will watch the filesystem for changes and automatically re-build the plugin to [geckolib.js](./geckolib.js).\n\nThen, you can load the plugin in Blockbench from `File` -> `Plugins` and selecting the `Load Plugin from File` button. Every time you make a change to the plugin source code, the bundler will automatically rebuild the plugin, but you still need to reload it in Blockbench in order for the changes to take effect. You can do this by selecting `Help` -> `Developer` -> `Reload Plugins`. In some cases if the global state has been messed up, you may need to reload the entire application using `Help` -> `Developer` -> `Reload Blockbench`. It's also recommended to select `Open Dev Tools` from this menu as it can be very helpful to explore the Blockbench API using the console and inspect error logs and debug breakpoints.\n\nAs every time you load the plugin, it's considered by the JS interpreter to be a different source file, any breakpoints set on the previously loaded file will be lost. You can work around this by adding a `debugger;` statement inside the source code where you want to set a breakpoint, which will force the JS interpreter to break on that line.\n\nIf a TypeScript compiler error is encountered, it will be logged to the terminal window, but the JS bundle will still be generated.\n\nTo check for errors, you can run:\n```\nnpm run test\n```\nThis will run all pretest scripts (eslint and TypeScript type check) as well as unit tests. It's also possible to run pretest separately, or the individual checks by themselves. To see all available npm scripts, run:\n```\nnpm run\n```\n\n## Building a release of the plugin\nFirst, inspect [package.json](./src/package.json) to make sure all the properties are correct. If you are making a release of the plugin, you should bump the `version` property to be one minor version up for a bugfix, minor version for new features, or major version for backwards-incompatible breaking changes.\nThen, check the `pluginOptions` section. `min_version` should be the lowest version of Blockbench the plugin is known to work with and `max_version` should be the first version the plugin is expected to not work with that's higher than the versions it was tested on. When the metadata is ready, run:\n```\nnpm run build\n```\nThis will first run prebuild/pretest/test scripts, then build the plugin and automatically update the [plugins.json](../../plugins.json) manifest with your settings.\n\nThen, update the [changelog](./changelog.json) to add patch notes for the new version.\nNew version entries go at the bottom.\n\nDouble-check everything looks right, then commit and make a PR to [JannisX11/blockbench-plugins](https://github.com/JannisX11/blockbench-plugins) to release the plugin.\n\nNote that it is possible to skip pre-build scripts by running:\n```\nnpm run build:only\n```\nThis is dangerous and shouldn't be done to make a full release, it's better to fix any errors from tests, lint, and compiler before publishing changes.\n\n## Using TypeScript\nThe plugin is now written using a loose version of [TypeScript](https://www.typescriptlang.org/docs/handbook/intro.html). Blockbench types are supplied by the [blockbench-types](https://github.com/JannisX11/blockbench-types) package. Note that these types are hand-written and may contain errors or be missing certain APIs. So just because you see an error message in your IDE or the bundler output doesn't neccessarily mean your code is wrong, it's possible it could be an issue with the type definitions. TypeScript errors won't prevent the plugin from being built so you can always test your code manually and/or inspect the [Blockbench source code](https://github.com/JannisX11/blockbench) to confirm the code is correct. If there's an error in the types, there are a few ways of fixing it:\n1. Make a PR to `blockbench-types`. This is the best, although possibly the slowest method of fixing type errors, and will help all other plugin authors.\n    * These changes can be tested locally first using `npm link`. To do so, clone the repo and ensure the same node version is being used as the one for the plugin. Then run `npm link` inside `blockbench-types`. Finally, run `npm link blockbench-types` inside the plugin `src` folder. This will create a symbolic link inside `node_modules` so that the types are resolved from your local copy of `blockbench-types`. You need to run `npm link blockbench-types` after every time you run `npm install` because an install overwrites the symlink.\n1. Massage the types inside the plugin. There are a number of ways you can do this, such as:\n   * Use [type assertions (aka casting)](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions). Performing an `as` cast directly into the target type is the safest method. If neccessary, casting via `as unknown as <Target Type>` will cause the compiler to ignore insufficient overlap between types. It's also possible to attempt to change the type of a function parameter or inferred variable type  by adding a type annotation, such as:\n   ```typescript\n   (kf: GeckolibKeyframe) => { } // Otherwise kf would be a Keyframe\n   ```\n   or\n   ```typescript\n    let easingBar: HTMLElement = document.createElement('div'); // Otherwise this would be an HTMLDivElement\n   ```\n   * Subclassing a blockbench type (for an example of this see usage of the `GeckolibBoneAnimator` in [codec.ts](./src/codec.ts)).\n   * Performing [type narrowing](https://www.typescriptlang.org/docs/handbook/2/narrowing.html).\n   * There are other options, such as [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#handbook-content).\n1. The nuclear option when all else fails: slap a `// @ts-ignore` comment above the problematic line(s). This is a bit dangerous as it shuts off ALL type checking on on that line, but sometimes this is necessary if you need to just force the compiler to ignore a problematic area of the code.\n\nSome places that are good to look for help with TypeScript are the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html), [TypeScript Discord](https://discord.com/invite/typescript), or you can ping Eliot on the GeckoLib Discord.\n\n# Working with ESLint\n[ESLint](https://eslint.org) is a tool for checking the code for common errors or problematic coding styles. It can be integrated into IDEs via plugins, and can be run from the terminal like so:\n```\nnpm run lint\n```\n\nSome lint errors can be fixed automatically by running:\n```\nnpm run lint:fix\n```\n\nIt's best to fix errors by changing the source code when possible. There are some cases in which certain lint rules might get in the way of particular things we might need to do in the plugin. In this case, [the rules can be disabled for different scopes](https://eslint.org/docs/latest/use/configure/rules). It's best to keep the scope as small as possible, so disabling individual rules per-line is the best way to start, or if it's needed in a larger area, disabling individual rules for a block of code, then lastly a whole file. You can search the code for `eslint-disable` to find examples. In some cases it may be necessary to disable a rule for the entire codebase, this can be done in the `rules` block of the [.eslintrc.cjs](./src/.eslintrc.cjs) file.\n"
  },
  {
    "path": "plugins/geckolib/about.md",
    "content": "<img src=\"https://github.com/user-attachments/assets/77a85ba0-86c0-41ee-b06d-4cc265a4a2a0\" alt=\"GeckoLib\"/>\n\nBlockbench plugin for the GeckoLib animation and rendering library mod for Minecraft: Java edition.\nThis plugin allows you to create and edit model and animation assets for GeckoLib-based mods, utilising Blockbench's live animation editor and other editing tools.\n\nUtilise native support for resourcepack-able controller-based animations, mathematical expressions, easings, and more to create armour, items, entities, blocks, and anything else you can think of!\n\nMust be paired with a Mod for Minecraft: Java utilising the GeckoLib library.\n\n<div style=\"text-align:center;\"><h2>Links:</h2></div>\n<div style=\"text-align:center; display:flex\">\n<div style=\"flex:1\">\n<a href=\"https://discord.gg/Bt3p6kA6TK\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Discord</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://github.com/bernie-g/geckolib/wiki\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Wiki</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://www.curseforge.com/minecraft/mc-mods/geckolib\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">CurseForge</p>\n</a>\n</div>\n<div style=\"flex:1\">\n<a href=\"https://modrinth.com/mod/geckolib\">\n<p style=\"font-size:1.25em; color:#AAAAAA\">Modrinth</p>\n</a>\n</div>\n</div>"
  },
  {
    "path": "plugins/geckolib/changelog.json",
    "content": "{\n  \"3.0.7\": {\n    \"title\": \"3.0.7\",\n    \"author\": \"Eliot Lash\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Disable minification of JS bundle, fix some build errors on case sensitive filesystems, and upgrade to NodeJS v16.16\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Don't save `geckolib_format_version` in animation json for bedrock models\",\n          \"Remove hold menu hiding code that was causing issues for other plugins (regression of an old bug occurred in version 3.0.6)\"\n        ]\n      }\n    ]\n  },\n  \"3.1.0\": {\n    \"title\": \"3.1.0\",\n    \"author\": \"Eliot Lash\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added support for \\\"Reverse Keyframes\\\" action\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Update to new plugin format, bump minimum Blockbench version to 4.8.0\",\n          \"Ported plugin to TypeScript, added developer README and a few unit tests\"\n        ]\n      }\n    ]\n  },\n  \"3.1.1\": {\n    \"title\": \"3.1.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix the item display settings being cleared if saving as an entity type model\",\n          \"Fix the armour template having swapped pivot points on the legs\",\n          \"Fix incorrect importing of loop type. Closes [#591](https://github.com/bernie-g/geckolib/issues/591)\"\n        ]\n      }\n    ]\n  },\n  \"3.2\": {\n    \"title\": \"3.2\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Auto-export the particle texture entry in the textures list for block/item display jsons if not defined\",\n          \"Auto-convert bedrock animation jsons to GeckoLib-supported animation jsons when exporting\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix the particle texture entry not exporting if the name doesn't end in .png\",\n          \"Fixed item_display_transforms being shipped with .geo jsons for non-bedrock models\",\n          \"Forced known forward-compatible versions to export as 1.12.0 to maintain compatibility while we work out a better system\"\n        ]\n      }\n    ]\n  },\n  \"3.2.1\": {\n    \"title\": \"3.2.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix some animation exporting issues with specific animation setup cases\"\n        ]\n      }\n    ]\n  },\n  \"4.0\": {\n    \"title\": \"4.0\",\n    \"date\": \"2024-10-06\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Overhauled the new project window, adding new settings and a much more dynamic experience\",\n          \"Add export of animations json from File -> Export menu for GeckoLib projects\",\n          \"Add plugin setting for default modid for projects\",\n          \"Add plugin setting for forcing the Display tab to be visible\",\n          \"Add plugin setting for auto-computing the particle texture when otherwise unspecified for item display jsons\",\n          \"Add plugin setting for auto-converting Bedrock-format animations to GeckoLib-format animations when exporting to json, if relevant\",\n          \"New GeckoLib models will now state their model type in the tab name\",\n          \"Auto-apply modid and parent folder prefix to texture path in display settings\",\n          \"Remember export locations for model, animations and item display settings per-project, independently\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Allow exporting of item display settings if the model has them set, even if not in block/item mode\",\n          \"Skip auto-exporting particle entry for item display if not a valid path\",\n          \"Don't store filepath in BB project\",\n          \"Don't include .item in exported display jsons by default\",\n          \"Updated the plugin's about panel\",\n          \"Updated the plugin's icon\",\n          \"Added api-supported changelog\",\n          \"Tweaked various information and tooltip entries to be more clear\",\n          \"Large internal cleanup\",\n          \"Don't print plugin load console line until plugin is actually loaded\",\n          \"The Display tab will now disappear/reappear correctly when switching between projects\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix Geckolib item/block models not displaying properly in the display tab\",\n          \"Fix the item model parent sometimes not being applied\"\n        ]\n      }\n    ]\n  },\n  \"4.0.1\": {\n    \"title\": \"4.0.1\",\n    \"author\": \"Zigy, Squishy\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Keyframes now have different icons based on their easing.\",\n          \"Easing arguments are now reset upon choosing a new easing. Fixes [#690](https://github.com/bernie-g/geckolib/issues/690)\",\n          \"Fixed a typo where the circle easing was spelled cicle instead.\"\n        ]\n      }\n    ]\n  },\n  \"4.0.2\": {\n    \"title\": \"4.0.2\",\n    \"author\": \"Zigy\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the plugin not working on web.\"\n        ]\n      }\n    ]\n  },\n  \"4.1.0\": {\n    \"title\": \"4.1.0\",\n    \"author\": \"Zigy\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added support for bezier, step, and smooth (Catmull-Rom) keyframes!\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed incorrect armor template pivots. Fixes [#527](https://github.com/bernie-g/geckolib/issues/527)\"\n        ]\n      }\n    ]\n  },\n  \"4.2.0\": {\n    \"title\": \"4.2.0\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Rename to GeckoLib\",\n          \"Update to support Blockbench 5.0.0\",\n          \"General internal cleanup\",\n          \"Skip `Auto-compute block/item particle texture` at export time if no mod-id set\",\n          \"Default the `Auto-compute block/item particle texture` to false to reduce runtime errors from unaware devs\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Require Blockbench to fully load the plugin before running, preventing race conditions on format availability\",\n          \"Fixed GeckoLib item display settings sometimes not exporting with the parent set\"\n        ]\n      }\n    ]\n  },\n  \"4.2.1\": {\n    \"title\": \"4.2.1\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix Blockbench exporting empty quotes instead of keyframe values some keyframes\",\n          \"Fix Blockbench failing to export animations files for some specific models\",\n          \"Fix the keyframe panel selector not updating properly\"\n        ]\n      }\n    ]\n  },\n  \"4.2.2\": {\n    \"title\": \"4.2.2\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added support for auto-creating the .png.mcmeta file for animated textures\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the model type property not saving/loading/applying properly\",\n          \"Fixed the broken plugin description page image for UK users\",\n          \"Fixed UV face rotation not showing when editing textures\"\n        ]\n      }\n    ]\n  },\n  \"4.2.3\": {\n    \"title\": \"4.2.3\",\n    \"author\": \"Tslat\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Further fix situations where the model type property would not save properly\",\n          \"Fixed an issue with importing animations with sound keyframes\",\n          \"Properly update the project's settings when converting from another format to GeckoLib\"\n        ]\n      }\n    ]\n  },\n  \"4.2.4\": {\n    \"title\": \"4.2.4\",\n    \"author\": \"Zigy\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed an issue where some keyframe icons displayed incorrectly.\"\n        ]\n      }\n    ]\n  },\n  \"4.2.5\": {\n    \"title\": \"4.2.5\",\n    \"author\": \"matmat37000\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed an issue where importing an existing animation.json file will cause GeckoLib frame keys to be reset.\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/geckolib/geckolib.js",
    "content": "/******/ (() => { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css\":\n/*!******************************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css ***!\n  \\******************************************************************************/\n/***/ ((module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/getUrl.js */ \"./node_modules/css-loader/dist/runtime/getUrl.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);\n// Imports\n\n\n\nvar ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(/*! data:font/woff2;base64,d09GRgABAAAAAC+EAAsAAAAALzgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIGQ2NtYXAAAAFoAAAAXAAAAFzpYun4Z2FzcAAAAcQAAAAIAAAACAAAABBnbHlmAAABzAAAKigAACoonylLumhlYWQAACv0AAAANgAAADYrGAMRaGhlYQAALCwAAAAkAAAAJAfEA+1obXR4AAAsUAAAAKgAAACongAAAGxvY2EAACz4AAAAVgAAAFbckNGqbWF4cAAALVAAAAAgAAAAIAAvAMhuYW1lAAAtcAAAAfIAAAHyIjDgSnBvc3QAAC9kAAAAIAAAACAAAwAAAAMD8wGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6SYDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAEAAAAAMAAgAAgAEAAEAIOkj6Sb//f//AAAAAAAg6QDpJf/9//8AAf/jFwQXAwADAAEAAAAAAAAAAAAAAAAAAQAB//8ADwABAAD/wAAAA8AAAgAANzkBAAAAAAEAAP/AAAADwAACAAA3OQEAAAAAAQAA/8AAAAPAAAIAADc5AQAAAAACAAD/wAQAA8AAHQB4AAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEkwzXCIfIhcXFkgyfxslJRv+hxslFxQWQC0qNwsKCAQEAwwQDAwHBAcCAiQaTBolBCYiIlkxA8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasLDp4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJhoBAwEvVB8fHwACAAD/wAQAA8AAIAB7AAABIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgASHwz+VgwNDQwBqgwfEmpdXYsoKSkoi11dal8zXCEgIRcXFkcyfxomJhr+hhomFxUVQS0qNgsKCQQEBAwQCwwHBQcBAiUZTBslBCchIloxA8AOC/5VCx8SEh8L/lUMDSgpi11damleXYspKJ4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJRsBAwEvVB8fHwAAAgAA/8AEAAPAABwAeAAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMXMzIWFx4BFRQGBzgBMTgBOQEOAQczMhYVOAE5ARU4ATEUBiMhIiY1OAE5ATQ2Nz4BNz4BNz4BNTQmJzAiOQEuASMiBgcOAQcOASM4ATEjIiY1PAE1FT4BNz4BMwIAal1diykoKCmLXV1qal1diygpKSiLXV1qCQEzWyIfIhcXFkczgBomJhr+hhomFxUVQSwqNwsKCQUDAQMMEAsMBwUHAgElGUwbJQQmIiJZMQPAKCmLXV1qal1diykoKCmLXV1qal1diykonh8iH1MtKEwgHkQqJhpEGiYmGiRFHx8/JCI0Dg0aEA8KBAMGBQcEDxIZIiYaAQMCAS9UHx8fAAAAAwAA/8AEAAPAAB0AfwCbAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnJjQ1NDY7ATIWFTgBOQEUFhceATMyNjcwNDMxPgE1NCYnOAE5AS4BKwEiJj0BNDY3MSIGIzEjIiY1PAE1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCAGpdXYspKCgpi11dahIfCwGrCw4OC/5VCx8SVS5WICAiDw4CCQIHEgUUFSckJFwxMVoiIycCASYaTBomBQYEDRIPDQYBBgcGBQUVFxwbJQYEAgQDSxslBSgiIFAsAQ0JAgIGAQIFBAIFAxETEAECBAMBAQcNA8AoKYtdXWpqXV2LKSgOCwGrCx8SEh8LAasLDp4dHh1RKxs1FwMEBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAwAA/8AEAAPAAB0AiACkAAABIgYHAQ4BFRQWFwEeATMxMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMzgBMTIWFTgBOQEUFhceATMyNjc0MDkBPgE1NCYnOAEjMS4BKwE4ATEiJj0BNDY3MSIGIzEjIiY1NDY1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVS9VISAiDw4DCAMHEwUUFCYkJFwxMVojIicDJRtMGiYEBwQNEg8NBgcHBgUBBBUXHBslBQUCBQJMGiYBBSciIVArAg4JAQIGAgEFBAIFAxETDwICBAMBAgcMA8AOC/5VCx8SEh8L/lULDigpi11dampdXYspKJ4dHh1RKxs1FwQDBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAAAAAwAA/8AEAAPAABwAhwCjAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxUyFhceARUUBgcOAQceARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzMhYVOAE5ARQWFx4BMzI2NzA0OQE+ATU0JicwIjkBLgErATAiMSImPQE+ATcxIgYjMSM4ATEiJjU8ATUxPgE3PgEzFyIGBw4BBw4BBzEyNjsCMjY3PgE1NCYnLgEjAgBqXV2LKSgoKYtdXWpqXV2LKCkpKItdXWovVSEgIhAOAggDBxIGFBQmJCRcMjFZIyMnAiUbSxslBQcEDREPDgYHBgUFAQQWFxsBGiYBBQUCBQJMGyUGJyIhUCsCDgkCAQYCAQYDAgUCARAUDwIBBQQBAQcMA8AoKYtdXWpqXV2LKSgoKYtdXWpqXV2LKSieHR4dUSsbNRcDBAQGBwgcQiMyXCIgIh4eHlQvAQIBGiYmGgsLBwQGBgYBBxIREQ0FBAgmGjkKEQcBJRsCAwItUBwaGroEAQILEAcOBQEGAgEJEA0HAQEDAAIAAP/ABAADwAAdAFcAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQczMhYVETM4ATMyFhU4ATkBFRQGIyIwMSMVFAYrATgBMSImNTE1IyIwMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SGzkbJQ0BGiYmGgENJRtJGyWzARomBgYBAwkbEQPAKCmLXV1qaV5diykoDgsBqwsfEhIfCwGrDA2gJhr+xyYaQRomSBomJhpIJhpBChMHAXkNDwAAAAIAAP/ABAADwAAgAFEAAAE4ATEiBgcBDgEVFBYXAR4BMzEyNz4BNzY1NCcuAScmIxczMhYVETMyFhU4ATkBFRQGKwEVFAYrATgBMSImNTE1IyImPQE4ATE0NjcVAT4BMzECABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qjzoaJg0bJSUbDSYaShomsxomBgUBBAgcEAPADQz+VQsfEhIfC/5VCw4oKYtdXmlqXV2LKSigJhr+xyYaQRomSBomJhpIJhpBChMIAQF5DQ8AAAACAAD/wAQAA8AAHABWAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxczMhYVETM4ATEyFhU4ATkBFRQGIzgBMSMVFAYrATgBMSImNTE1IzgBMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaWpdXYspKCgpi11dajo6GiYNGiYmGg0mGkoaJrMbJQYFAQQIHBADwCgpi11damleXYspKCgpi11eaWpdXYspKKAmGv7HJhpBGiZIGiYmGkgmGkEKEwcBeQ0PAAAABAAA/8AEAAPAAB0AUwBYAHoAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQchMhYVOAE5ARUUBisBHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMy4BJzETPgEzOAE5ARcVPgEzByIGBw4BBzEeARcxHgEXHgEzMjY3OAE5AT4BNTQmJy4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxLcATEbJSUbiyxSICQkIyMjYzYtVCIlKgUlGwEUGAEZAiQaeQYKBgcSGA0JFQ0VHwQCCAQGDQsODggJCQgHCBARA8AoKYtdXWppXl2LKSgNDAGrCx8SEh8LAasMDaglG0QaJQMfHyJeNDZhJicoGxsdVTECAwIaJgYhFQEtGSLDCAEGugoPCQoBAhsUEg8DBgQGCwsbFBUWBwgHAAAAAAQAAP/ABAADwAAjAFYAWwB9AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMHITIWFTgBOQEVFAYHIx4BFx4BFRQGBw4BIyImJy4BJzQmNTQ2OwEuATUxEz4BMzgBOQEXBz4BMwciBgcOAQcxHgEXMR4BFx4BMzI2NzAyOQE+ATU0JicuASMCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qMgEyGiYmGowsUiAkJSMjJGI3LVMiJSoFASYaARMZGAIlGXoBBgsGBxIYDggWDBQfBQIIAwcMCw8NCAEJCQgIBxEQA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKKglG0QaJQECHx8iXjQ2YSYnKBsbHVUxAgMCGiYGIRUBLRkiwwgBBroKDwkKAQIbFBIPAwYEBgsLGxQVFgcIBwAABAAA/8AEAAPAABwAUgBXAHkAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjByEyFhUwIjkBFRQGKwEeARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzLgE1MRM+ATM4ATkBFwc+ATMHIgYHDgEHMR4BFzMeARceATMyNjcwMjEjPgE1NCYnLgEjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWqHATIaJgElGowsUiAkJSQiJGI3LVQiJSoFJhoBExkYAiUZegEGCgcHEhgOCBYMFB8EAQIIAwcMCw8NCAEBCgkJBwgQEAPAKCmLXV1qaV5diykoKCmLXV5pal1diykoqCUbRBolAx8fIl40NmEmJygbGx1VMQIDAhomBiEVAS0ZIsMIAQa6Cg8JCgECGxQSDwMGBAYLCxsUFRYHCAcAAwAA/8AEAAPAAB0AcQCRAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEXMhYXHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQ5AS4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MiYxMDIxPgE1NCYnMCI1MS4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxIHJkEYGhg7NC1+SQECCAQEEhQVJA8RKBUGDwkJEAYjBQYFBhw8ICFLKS9RHRwaCwwLJRgYPCIjSicUESYWDBEJDB0LFyEJAQEBCAkEAgEBAwkDwCgpi11damleXYspKA0MAasLHxISHwsBqwwNwxAVFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUQfHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAAAAwAA/8AEAAPAACMAegCaAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXMDQVHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQxIy4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MDQxOAExPgE1NCYnIjA1MS4BIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWqyJUEZGhg8NC1+SAEDCQQDEhUVIxARJxYFEAkJEAYiBgYGBR08ICBMKS5RHQEcGgwLDCQYGTsjIksnFRElFgwRCg0dChggCgkJBAIBAgMJA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKMMQFQEBFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUUeHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAADAAD/wAQAA8AAHABwAJAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjFzIWFx4BFRQGBw4BBw4BFRQWFx4BMzI2NzgBMTgBOQE+ATc+ATMyFh8BHgEVFAYHMQ4BBw4BIyImJzA0IzEuATU0Njc4ATEwNDkBPgE3PgE3PgEzByIGBw4BBz4BNz4BNzA0MTgBMT4BNTQmJyI0OQEuASMCAGleXYspKCgpi11eaWpdXYspKCgpi11dalwmQRkZGDs0LX5IAQMJBAMSFRQkEBEnFQYQCQkQBiIFBwYFHTwgIUspLlIcARwaDAsMJBgZOyIjSyYUESUXCxEKDR0KGCAKCQgEAQECAwkDwCgpi11damleXYspKCgpi11eaWpdXYspKMMQFRQ/IzleHBgSAwkSChkbBAQICAkJHxUGBwgGJAYPCAkOBh8yERIRHx8BIFQxIkYkASVEHx4wERERgRIZDSoTAgECBhEJAQgXEwwLAgEBAgAAAwAA/8AEAAPAAB0AOgBHAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SVUY+Pl0bGxsbXT4+RkY/Pl0bGxsbXT4/Rj5VVT49VVU9A8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasMDasbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAAAAwAA/8AEAAPAACMAQABNAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVUc+Pl0bGxsbXT4+R0Y+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKKsbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAMAAP/ABAADwAAcADkARgAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMVMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaWpdXYspKCgpi11dakY/PlwbGxsbXD4/RkY+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8AoKYtdXmlqXV2LKSgoKYtdXWppXl2LKSirGxtdPj5GRj8+XBsbGxtcPj9GRj4+XRsbw1U9PlRUPj1VAAABAAD/wAQAA8AAHQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEgPAKCmLXV5pal1diykoDQwBqwsfEhIfCwGrDA0AAQAA/8AEAAPAACMAAAE4ATEiBgcBDgEVFBYXAR4BMzgBOQEyNz4BNzY1NCcuAScmIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWoDwA0M/lULHxISHwv+VQwNKCmLXV1qaV5diykoAAAAAQAA/8AEAAPAABwAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWoDwCgpi11eaWpdXYspKCgpi11damleXYspKAAAAgAA/8AEAAPAAB0AYQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyceARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFy4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SghEjETdBFxMlAQIEESJHCygXDBUKARQYBgVRSSVuNjdCFhMlAQIEESJHCygXDBUKARQYBgYBUUkZRSYDwCgpi11eaWpdXYspKA0MAasLHxISHwsBqwwN9QkIHXJVRTIBAQEMGWcTGAUGAQwnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAgAA/8AEAAPAACMAZwAAATgBMSIGBwEOARUUFhcBHgEzOAE5ATI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFzEeARUUBgczMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFS4BNTQ2NzEwNjc+ARcCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qghIiETdCFhMlAQEFESJHCycYDBUJFBgGBgFRSSVuNzZCFxIlAQEFESJHCycYDBUJFBgGBVFJGUUmA8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAAIAAP/ABAADwAAcAGAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyMeARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnMS4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaWpdXYspKCgpi11daoISIhE3QRcTJQECBBEiRwsoFwwVCgEUGAYFUUklbjY3QRcTJQEBBREiRwsnGAwVCRQYBgYBUUkZRSYDwCgpi11eaWpdXYspKCgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGCycYCxYJgTUSGwIAAAABAAD/wAQAA8AAMwAAASIGBw4BBw4BFRQWFx4BFx4BFRQGBw4BBw4BFRQWFx4BFx4BMzI2NwE+ATU0JicBLgEjMQIAQJxJJEUfHzQgExMlEB8fHSAQJhQUHjMgH0YlSZs/Eh8LAasMDQ0M/lULHxIDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUNDAGrCx8SEh8LAasMDQAAAAEAAP/ABAADwAA5AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgASHwz+VgwNDQwBqgwfEj+bSiRGICAyHhQUJhAgHR8fECUTFB80HyBEJEmcQAPADQz+VQsfEhIfC/5VDA0FDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAEAAP/ABAADwABIAAABIgYHDgEHDgEVFBYXHgEXHgEVFAYHDgEHDgEVFBYXHgEXHgEzMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgBAnEkkRB8gNCATEyUQHyAeIBAmFBQeMyAgRSVJmz8/nEklRSAgMh4UEycQHx4fHxAlFBMfNB8fRSRJm0EDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUFDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAABAAD/wAP9A8AAhAAAAQ4BBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGBw4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFx4BFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BFzI2NzI2MyM+ATc+ATcxAT4BNTQmJwEuAScjLgEnIiYrAS4BIwH3GhQHEBcNDBgJBAgEAgQDCRkODhwPDyMXGAkDBAMBAgICAQEBAwIGEAkIEggJEhIJCBIICRAGAgMBAQECAgIBAwQDCRgXIw8PHA4OGQkDBAIDCQQJGAwNFxAHFBoFDAYBAgEBAwYDCQ8GAakMDQ0M/lcGDggBAwYDAQEBAQYMBQPAAQsFCRMKChQIAwYCAQEDAQEEAwMJFxgiDw8dDQ4ZCQQFAwEFAggTCwoXDQ0fISIeDQwXCwoUBwMEAgMFBAkZDQ4dDw4jFxgIBAMDAgECAgECBQQIFAoKEwkFCwEBAgEBAgEDCQYBqgwfERIfCwGqBgkDAQIBAQIBAAAAAQAA/8AD/wPAAKAAAAEiBgciBiMzDgEHDgEHMRQiBw4BBzEBDgEVFBYXAR4BFzMWMjM+ATc+ATc+ATc+ATcyNjM+ATc+ATc+ATc+ATc+ATc+ATc0Njc+ATc+ATc+ATc+ATU0JicuAScuAScuAScuATUuAScuAScuASc4ATE4ATkBMDQxOAE5ATgBMTgBOQE4ATE4ATkBLgEnLgEnLgEnIiYnLgEnLgEnLgEnLgEnAgcFDAYBAgEBBAcDBgoEAQECAwH+VgwNDQwBqgoaDwEECAQaEwgPGQwMGAkECQMCBAMJGg0OHQ8PIhgXCQQDBAECAgEBAQEDAgYQCQkSCAkSEgkIEgkJEAYCAwEBAQECAgEEAwQJFxgiDw8dDg0aCQMFAgMIBAkYDAwZDwgTGgPAAQIBAQICAgYDAQEBAgH+VgwfEhEfDP5WCgwCAQELBQkTCgoUCAMGAgEBAwEBBAMDCRcYIw4PHQ4NGQkDBgICBQMHEwsKFw0NHyEiHg0NFgsLEwcDBAIDBQQJGQ4NHQ8PIhcBFwkDAwQBAgIBAQEBBgMIFAoKEwkFCwEAAAABAAD/wAQAA8AAwAAAASIGBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGFQ4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFxQWFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BMzI2Nz4BNz4BNz4BNzI2Mz4BNz4BNz4BNz4BNz4BNz4BNzQ2NT4BNz4BNz4BNz4BNTQmJy4BJy4BJy4BJzQmNS4BJy4BJy4BJy4BJy4BJy4BJyImIy4BJy4BJy4BJy4BIwIAIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAkDAwQBAgIBAgEEAgYQCQgSCAkSEgkIEggJEAYDAwECAQICAQQDAwkYGCIPDx0ODhkJBAUDAgUDBxQKCxcNDR8hIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAgEAwQBAgIBAgEEAgYQCAkSCAkSEgkIEgkIEAYCBAECAQICAQQDBAgYGCIPDx0ODhkJBAYCAgUDBxQKCxcNDR8hA8ASCQgSCAkQBgMDAQIBAgIBBAMDCRgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCAQDBAEBAwECAQQCBhAJCBIICRISCQgSCAkQBgIEAQIBAwEBBAMECBgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCQMDBAECAgECAQMDBhAJCBIICRIAAAEAAP/ABAEDwACiAAABIgYjMQ4BBzMOASMzDgE5AQ4BBzEOAQcxIgYjMQYHDgEHBiMiBhUUFjMxMhYXHgEVFAYHDgEjDgEVFBYzMTIXHgEXFhcyFjkBHgEXMx4BFxUeARczHgE7ARYyMzoBMzE6ATcjMjY3MTI2NxU+ATcxPgE3MT4BMzEBPgE1NCYnASImJzEuAScjLgEnIzAmNSMiJicjLgEnMSImIyoBOQEqASMxAfgBAgEDBwQBAgQCAQECBAYDAgQCAQIBHSgnXzU2OSMyMiMqMQ8QERIQEDEoIjExIjw3N14nJhoBAQMHAwEBBAIDCAQBAQQCAQIHAwEDAQIEAgEFCAQCBAIEBwMCAwIBAgEBqwwNDQz+VQECAQIDAgEDBgMBAgEBBAEBAwYEAgYCAQECBQIDwAEBAQEBAQEBAgMCAgMCAh4gITcSEjIkIzIXEREwGhkxERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIFAgEDAQECAawLHxISHwsBrAIBAQMBAgQCAQEBAQEBAQEAAAAAAQAA/8AEAgPAAKUAAAEiBiMzDgEHMQ4BIzEOASMxDgEHMQ4BBzEOASMxAQ4BFRQWFwEeARczHgEXMR4BFxUyFhcxHgE7ARYyMzAyMzEwMjM6ATcxMjY3Iz4BNwc+ATcjPgE3MT4BNzE2Nz4BNzYzPgE1NCYjMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImJyMuAScjIiYjKgE5ASoBIzEB+AECAQEEBwMCBAEBAQEEBgMCBAECAgH+VQwNDQwBqwECAQEBBAIDBgQCBQMDBwMBAgUDAQEBAQMFAgQHAwEDBgIBBAcDAQMDAgECARsmJl83NzsjMTEjKDEQEBIREBAxKSMzMyM5NTZeKCceAQIBAgMCAwcDAQEBAQEDAgECBwMBAgUDAQECBAMDwAEBAQEBAQEBAgQCAQMBAQL+VAsgERIfDP5VAQEBAQMCAgQBAQIBAQIBAQIBAQIBAQIEAgIDAQEBARohIDgTEwEyIyMyFxIRMBoaMBERFzIjJDISEjchIB4CAQEDAQIEAgEBAQEBAQEBAAEAAP/ABAEDwADFAAABIgYjMw4BBzEOASMzDgEjMQ4BBzEOAQcxDgEHNQYHDgEHBiMiBhUUFjMxMhYXHgEVDgEHDgEjDgEVFBYzMTIXHgEXFhcyFjEzHgEXMR4BFxUeARcxHgE7ARYyMzoBMzE6ATcxMjY3IzI2Nwc+ATcxPgE3MT4BMzE2Nz4BNzYzMjY1NCYnMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImIzEuAScxIiYjMCI5ASoBIzAiOQEB+AEDAQEDBgMCBQIBAQIBAwUDAgUCAQIBHSgnXzU2OSMyMiMqMRAQEQESEBAxKCIxMSI8NzdeJyYaAQEBAwYEAgMCBAcFAgMCAQMGBAECAQIEAgQJBAECBQIBBAcDAgQBAQIBGyYmXzc2PCMwMCMoMRAQEhEQEDEpIzIyIzk1Nl4oJx4BAgECAwIDBwMBAQEBAQMCAwcEAwQDAQIFAgEDwAEBAQEBAQEBAgMCAgMCAQEBAR4hIDcSEjIkIzIXEREwGhowERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIEAwEDAQECGyAgORMTMiMjMgEWEhEwGhowEREXMiMkMhISNyAhHgIBAQICAgQCAQEBAgEBAQADAAD/wAQAA8AAKgBIAGUAAAE4ATEiBhU4ATkBETgBMRQWMzgBMTM4ATEyNjU4ATkBETgBMTQmIzgBOQEFJiIjIgYHAQ4BFRQWFwEeATMyNjURNCYnMS4BKwEBOAExIgYVERQWMzgBMTM4ATEyNjURNCYjOAE5AQNBHy0tH3MgLCwg/lQBBQISHwv+VQwNDQwBqwsfEiMyHRcGDAYBATkfLS0fcyAsLCADwCwg/u0fLS0fARMgLAEBDgv+VQsfEhIfC/5VDA0yIwNWGioKAwP9qywf/u0gLCwgARMfLAAAAAEAAP/ABAADwAAkAAATIgYVFBYXCQEOARUUFjMhOAExMjY1NCYnCQE+ATU0JiM4ATkBVSMyDQwBbv6SDA0yIwNWIzINDP6SAW4MDTIjA8AyIxIfDP6S/pIMHxIjMjIjEh8MAW4BbgwfEiMyAAIAAP/ABAADwAAWADcAAAE4ATEiBhURFBYzOAExMzI2NRE0JiMxISoBIyIGBwEOARUUFhcBHgEzMjY1ETgBMTQmJzUuAScjA0EfLS0fcyAsLCD+VAIEAhIfC/5VDA0NDAGrCx8SIzIdFwYMBgEDwCwg/JggLCwgA2ggLA0M/lULHxISHwv+VQwNMiMDVhorCQECAwEAAAAAAQAA/8AEAAPAACAAAAEOAQcBDgEVFBYXAR4BMzI2NwE+ATU0JicBLgEjIgYjMwHzDhgJ/lUMDQ0MAasLHxISHwsBqwwNDQz+VQsfEgQGBAEDvwINCf5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNAQAAAAACAAD/wAQAA8AAIAAjAAABIgYHAQ4BFRQWFwEeATMyNjcBPgE1NCYnAS4BIzgBOQEVCQECABIfC/5VDA0NDAGrCx8SEh8LAasMDQ0M/lULHxIBMv7OA8ANDP5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNzv7O/s4AAAAAAQAAAAEAAG9Y4W9fDzz1AAsEAAAAAADj+19KAAAAAOP7X0oAAP/ABAIDwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAgAAAAAEAgABAAAAAAAAAAAAAAAAAAAAKgQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAD/QAAA/8AAAQAAAAEAQAABAIAAAQBAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AtAFMAeICrgOABE4EugUiBYoGLgbUB3YINgj6CbYKIgqQCvgLKgtgC5AMIAyyDT4NkA3kDlIPGg/wEQ4R3hKyE6oUGhRQFJwU1hUUAAAAAQAAACoAxgAEAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAAcAsQABAAAAAAADABAAUQABAAAAAAAEABAAxgABAAAAAAAFAAsAMAABAAAAAAAGABAAgQABAAAAAAAKABoA9gADAAEECQABACAAEAADAAEECQACAA4AuAADAAEECQADACAAYQADAAEECQAEACAA1gADAAEECQAFABYAOwADAAEECQAGACAAkQADAAEECQAKADQBEGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= */ \"data:font/woff2;base64,d09GRgABAAAAAC+EAAsAAAAALzgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIGQ2NtYXAAAAFoAAAAXAAAAFzpYun4Z2FzcAAAAcQAAAAIAAAACAAAABBnbHlmAAABzAAAKigAACoonylLumhlYWQAACv0AAAANgAAADYrGAMRaGhlYQAALCwAAAAkAAAAJAfEA+1obXR4AAAsUAAAAKgAAACongAAAGxvY2EAACz4AAAAVgAAAFbckNGqbWF4cAAALVAAAAAgAAAAIAAvAMhuYW1lAAAtcAAAAfIAAAHyIjDgSnBvc3QAAC9kAAAAIAAAACAAAwAAAAMD8wGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6SYDwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAEAAAAAMAAgAAgAEAAEAIOkj6Sb//f//AAAAAAAg6QDpJf/9//8AAf/jFwQXAwADAAEAAAAAAAAAAAAAAAAAAQAB//8ADwABAAD/wAAAA8AAAgAANzkBAAAAAAEAAP/AAAADwAACAAA3OQEAAAAAAQAA/8AAAAPAAAIAADc5AQAAAAACAAD/wAQAA8AAHQB4AAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEkwzXCIfIhcXFkgyfxslJRv+hxslFxQWQC0qNwsKCAQEAwwQDAwHBAcCAiQaTBolBCYiIlkxA8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasLDp4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJhoBAwEvVB8fHwACAAD/wAQAA8AAIAB7AAABIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHOAExOAE5AQ4BBzMyFhUwFDkBFTgBMRQGIyEiJjU4ATkBNDY3PgE3PgE3PgE1NCYnOAE5AS4BIyIGBw4BBw4BIzgBMSMiJjU8ATUxPgE3PgEzAgASHwz+VgwNDQwBqgwfEmpdXYsoKSkoi11dal8zXCEgIRcXFkcyfxomJhr+hhomFxUVQS0qNgsKCQQEBAwQCwwHBQcBAiUZTBslBCchIloxA8AOC/5VCx8SEh8L/lUMDSgpi11damleXYspKJ4fIh9TLShMIB5EKiYaAUMbJSUbJEUeID8kIjQODRoQDgsEAwUFBgQPEhkiJRsBAwEvVB8fHwAAAgAA/8AEAAPAABwAeAAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMXMzIWFx4BFRQGBzgBMTgBOQEOAQczMhYVOAE5ARU4ATEUBiMhIiY1OAE5ATQ2Nz4BNz4BNz4BNTQmJzAiOQEuASMiBgcOAQcOASM4ATEjIiY1PAE1FT4BNz4BMwIAal1diykoKCmLXV1qal1diygpKSiLXV1qCQEzWyIfIhcXFkczgBomJhr+hhomFxUVQSwqNwsKCQUDAQMMEAsMBwUHAgElGUwbJQQmIiJZMQPAKCmLXV1qal1diykoKCmLXV1qal1diykonh8iH1MtKEwgHkQqJhpEGiYmGiRFHx8/JCI0Dg0aEA8KBAMGBQcEDxIZIiYaAQMCAS9UHx8fAAAAAwAA/8AEAAPAAB0AfwCbAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnJjQ1NDY7ATIWFTgBOQEUFhceATMyNjcwNDMxPgE1NCYnOAE5AS4BKwEiJj0BNDY3MSIGIzEjIiY1PAE1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCAGpdXYspKCgpi11dahIfCwGrCw4OC/5VCx8SVS5WICAiDw4CCQIHEgUUFSckJFwxMVoiIycCASYaTBomBQYEDRIPDQYBBgcGBQUVFxwbJQYEAgQDSxslBSgiIFAsAQ0JAgIGAQIFBAIFAxETEAECBAMBAQcNA8AoKYtdXWpqXV2LKSgOCwGrCx8SEh8LAasLDp4dHh1RKxs1FwMEBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAwAA/8AEAAPAAB0AiACkAAABIgYHAQ4BFRQWFwEeATMxMjc+ATc2NTQnLgEnJiMXMhYXHgEVFAYHDgEHHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMzgBMTIWFTgBOQEUFhceATMyNjc0MDkBPgE1NCYnOAEjMS4BKwE4ATEiJj0BNDY3MSIGIzEjIiY1NDY1MT4BNz4BMxciBgcOAQcOAQcxMjYzMTMyNjc+ATU0JicuASMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVS9VISAiDw4DCAMHEwUUFCYkJFwxMVojIicDJRtMGiYEBwQNEg8NBgcHBgUBBBUXHBslBQUCBQJMGiYBBSciIVArAg4JAQIGAgEFBAIFAxETDwICBAMBAgcMA8AOC/5VCx8SEh8L/lULDigpi11dampdXYspKJ4dHh1RKxs1FwQDBAYHCBxCIzJcIiAiHh4eVC8BAgEaJiYaCwsHBAYGBgEHEhERDQUECCYaOQoRBwElGwIDAi1QHBoaugQBAgsQBw4FAQYCAQkQDQcBAQMAAAAAAwAA/8AEAAPAABwAhwCjAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxUyFhceARUUBgcOAQceARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzMhYVOAE5ARQWFx4BMzI2NzA0OQE+ATU0JicwIjkBLgErATAiMSImPQE+ATcxIgYjMSM4ATEiJjU8ATUxPgE3PgEzFyIGBw4BBw4BBzEyNjsCMjY3PgE1NCYnLgEjAgBqXV2LKSgoKYtdXWpqXV2LKCkpKItdXWovVSEgIhAOAggDBxIGFBQmJCRcMjFZIyMnAiUbSxslBQcEDREPDgYHBgUFAQQWFxsBGiYBBQUCBQJMGyUGJyIhUCsCDgkCAQYCAQYDAgUCARAUDwIBBQQBAQcMA8AoKYtdXWpqXV2LKSgoKYtdXWpqXV2LKSieHR4dUSsbNRcDBAQGBwgcQiMyXCIgIh4eHlQvAQIBGiYmGgsLBwQGBgYBBxIREQ0FBAgmGjkKEQcBJRsCAwItUBwaGroEAQILEAcOBQEGAgEJEA0HAQEDAAIAAP/ABAADwAAdAFcAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQczMhYVETM4ATMyFhU4ATkBFRQGIyIwMSMVFAYrATgBMSImNTE1IyIwMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SGzkbJQ0BGiYmGgENJRtJGyWzARomBgYBAwkbEQPAKCmLXV1qaV5diykoDgsBqwsfEhIfCwGrDA2gJhr+xyYaQRomSBomJhpIJhpBChMHAXkNDwAAAAIAAP/ABAADwAAgAFEAAAE4ATEiBgcBDgEVFBYXAR4BMzEyNz4BNzY1NCcuAScmIxczMhYVETMyFhU4ATkBFRQGKwEVFAYrATgBMSImNTE1IyImPQE4ATE0NjcVAT4BMzECABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qjzoaJg0bJSUbDSYaShomsxomBgUBBAgcEAPADQz+VQsfEhIfC/5VCw4oKYtdXmlqXV2LKSigJhr+xyYaQRomSBomJhpIJhpBChMIAQF5DQ8AAAACAAD/wAQAA8AAHABWAAABIgcOAQcGFRQXHgEXFjMyNz4BNzY1NCcuAScmIxczMhYVETM4ATEyFhU4ATkBFRQGIzgBMSMVFAYrATgBMSImNTE1IzgBMSImPQE4ATE0NjcxAT4BMzECAGleXYspKCgpi11eaWpdXYspKCgpi11dajo6GiYNGiYmGg0mGkoaJrMbJQYFAQQIHBADwCgpi11damleXYspKCgpi11eaWpdXYspKKAmGv7HJhpBGiZIGiYmGkgmGkEKEwcBeQ0PAAAABAAA/8AEAAPAAB0AUwBYAHoAAAEiBw4BBwYVFBceARcWMzI2NwE+ATU0JicBLgEjMQchMhYVOAE5ARUUBisBHgEXHgEVFAYHDgEjIiYnLgEnPAE1NDYzOAExMy4BJzETPgEzOAE5ARcVPgEzByIGBw4BBzEeARcxHgEXHgEzMjY3OAE5AT4BNTQmJy4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxLcATEbJSUbiyxSICQkIyMjYzYtVCIlKgUlGwEUGAEZAiQaeQYKBgcSGA0JFQ0VHwQCCAQGDQsODggJCQgHCBARA8AoKYtdXWppXl2LKSgNDAGrCx8SEh8LAasMDaglG0QaJQMfHyJeNDZhJicoGxsdVTECAwIaJgYhFQEtGSLDCAEGugoPCQoBAhsUEg8DBgQGCwsbFBUWBwgHAAAAAAQAAP/ABAADwAAjAFYAWwB9AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMHITIWFTgBOQEVFAYHIx4BFx4BFRQGBw4BIyImJy4BJzQmNTQ2OwEuATUxEz4BMzgBOQEXBz4BMwciBgcOAQcxHgEXMR4BFx4BMzI2NzAyOQE+ATU0JicuASMCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qMgEyGiYmGowsUiAkJSMjJGI3LVMiJSoFASYaARMZGAIlGXoBBgsGBxIYDggWDBQfBQIIAwcMCw8NCAEJCQgIBxEQA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKKglG0QaJQECHx8iXjQ2YSYnKBsbHVUxAgMCGiYGIRUBLRkiwwgBBroKDwkKAQIbFBIPAwYEBgsLGxQVFgcIBwAABAAA/8AEAAPAABwAUgBXAHkAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjByEyFhUwIjkBFRQGKwEeARceARUUBgcOASMiJicuASc8ATU0NjM4ATEzLgE1MRM+ATM4ATkBFwc+ATMHIgYHDgEHMR4BFzMeARceATMyNjcwMjEjPgE1NCYnLgEjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWqHATIaJgElGowsUiAkJSQiJGI3LVQiJSoFJhoBExkYAiUZegEGCgcHEhgOCBYMFB8EAQIIAwcMCw8NCAEBCgkJBwgQEAPAKCmLXV1qaV5diykoKCmLXV5pal1diykoqCUbRBolAx8fIl40NmEmJygbGx1VMQIDAhomBiEVAS0ZIsMIAQa6Cg8JCgECGxQSDwMGBAYLCxsUFRYHCAcAAwAA/8AEAAPAAB0AcQCRAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEXMhYXHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQ5AS4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MiYxMDIxPgE1NCYnMCI1MS4BIwIAaV5diykoKCmLXV5pEh8LAasMDQ0M/lULHxIHJkEYGhg7NC1+SQECCAQEEhQVJA8RKBUGDwkJEAYjBQYFBhw8ICFLKS9RHRwaCwwLJRgYPCIjSicUESYWDBEJDB0LFyEJAQEBCAkEAgEBAwkDwCgpi11damleXYspKA0MAasLHxISHwsBqwwNwxAVFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUQfHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAAAAwAA/8AEAAPAACMAegCaAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhYXMDQVHgEVFAYHDgEHDgEVFBYXHgEzMjY3OAExOAE5AT4BNz4BMzIWHwEeARUUBgcxDgEHDgEjIiYnMDQxIy4BNTQ2NzgBMTA0OQE+ATc+ATc+ATMHIgYHDgEHPgE3PgE3MDQxOAExPgE1NCYnIjA1MS4BIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWqyJUEZGhg8NC1+SAEDCQQDEhUVIxARJxYFEAkJEAYiBgYGBR08ICBMKS5RHQEcGgwLDCQYGTsjIksnFRElFgwRCg0dChggCgkJBAIBAgMJA8ANDP5VCx8SEh8L/lUMDSgpi11eaWpdXYspKMMQFQEBFD8jOV4cGBIDCRIKGRsEBAgICQkfFQYHCAYkBg8ICQ4GHzIREhEfHwEgVDEiRiQBJUUeHjARERGBEhkNKhMCAQIGEQkBCBcTDAsCAQECAAADAAD/wAQAA8AAHABwAJAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjFzIWFx4BFRQGBw4BBw4BFRQWFx4BMzI2NzgBMTgBOQE+ATc+ATMyFh8BHgEVFAYHMQ4BBw4BIyImJzA0IzEuATU0Njc4ATEwNDkBPgE3PgE3PgEzByIGBw4BBz4BNz4BNzA0MTgBMT4BNTQmJyI0OQEuASMCAGleXYspKCgpi11eaWpdXYspKCgpi11dalwmQRkZGDs0LX5IAQMJBAMSFRQkEBEnFQYQCQkQBiIFBwYFHTwgIUspLlIcARwaDAsMJBgZOyIjSyYUESUXCxEKDR0KGCAKCQgEAQECAwkDwCgpi11damleXYspKCgpi11eaWpdXYspKMMQFRQ/IzleHBgSAwkSChkbBAQICAkJHxUGBwgGJAYPCAkOBh8yERIRHx8BIFQxIkYkASVEHx4wERERgRIZDSoTAgECBhEJAQgXEwwLAgEBAgAAAwAA/8AEAAPAAB0AOgBHAAABIgcOAQcGFRQXHgEXFjMyNjcBPgE1NCYnAS4BIzEHMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SVUY+Pl0bGxsbXT4+RkY/Pl0bGxsbXT4/Rj5VVT49VVU9A8AoKYtdXmlqXV2LKSgNDAGrCx8SEh8LAasMDasbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAAAAwAA/8AEAAPAACMAQABNAAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjc+ATc2NTQnLgEnJiMXMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCABIfC/5VDA0NDAGrCx8Sal1diygpKSiLXV1qVUc+Pl0bGxsbXT4+R0Y+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKKsbG10+PkZGPz5cGxsbG1w+P0ZGPj5dGxvDVT0+VFQ+PVUAAAMAAP/ABAADwAAcADkARgAAASIHDgEHBhUUFx4BFxYzMjc+ATc2NTQnLgEnJiMVMhceARcWFRQHDgEHBiMiJy4BJyY1NDc+ATc2MxUiBhUUFjMyNjU0JiMCAGleXYspKCgpi11eaWpdXYspKCgpi11dakY/PlwbGxsbXD4/RkY+Pl0bGxsbXT4+Rj1VVT0+VFQ+A8AoKYtdXmlqXV2LKSgoKYtdXWppXl2LKSirGxtdPj5GRj8+XBsbGxtcPj9GRj4+XRsbw1U9PlRUPj1VAAABAAD/wAQAA8AAHQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxAgBpXl2LKSgoKYtdXmkSHwsBqwwNDQz+VQsfEgPAKCmLXV5pal1diykoDQwBqwsfEhIfCwGrDA0AAQAA/8AEAAPAACMAAAE4ATEiBgcBDgEVFBYXAR4BMzgBOQEyNz4BNzY1NCcuAScmIwIAEh8M/lYMDQ0MAaoMHxJqXV2LKCkpKItdXWoDwA0M/lULHxISHwv+VQwNKCmLXV1qaV5diykoAAAAAQAA/8AEAAPAABwAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjAgBpXl2LKSgoKYtdXmlqXV2LKSgoKYtdXWoDwCgpi11eaWpdXYspKCgpi11damleXYspKAAAAgAA/8AEAAPAAB0AYQAAASIHDgEHBhUUFx4BFxYzMjY3AT4BNTQmJwEuASMxBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyceARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFy4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaRIfCwGrDA0NDP5VCx8SghEjETdBFxMlAQIEESJHCygXDBUKARQYBgVRSSVuNjdCFhMlAQIEESJHCygXDBUKARQYBgYBUUkZRSYDwCgpi11eaWpdXYspKA0MAasLHxISHwsBqwwN9QkIHXJVRTIBAQEMGWcTGAUGAQwnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAgAA/8AEAAPAACMAZwAAATgBMSIGBwEOARUUFhcBHgEzOAE5ATI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFzEeARUUBgczMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnFS4BNTQ2NzEwNjc+ARcCABIfDP5WDA0NDAGqDB8Sal1diygpKSiLXV1qghIiETdCFhMlAQEFESJHCycYDBUJFBgGBgFRSSVuNzZCFxIlAQEFESJHCycYDBUJFBgGBVFJGUUmA8ANDP5VCx8SEh8L/lUMDSgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGAQwnGAsWCYE1EhsCAAAAAAIAAP/ABAADwAAcAGAAAAEiBw4BBwYVFBceARcWMzI3PgE3NjU0Jy4BJyYjBzIWFx4BFx4BFxY2Nz4BMT4BMzIWFyMeARUUBgcxMAYHDgEnLgEnLgEnJgYHDgExDgEjIiYnMS4BNTQ2NyMwNjc+ARcCAGleXYspKCgpi11eaWpdXYspKCgpi11daoISIhE3QRcTJQECBBEiRwsoFwwVCgEUGAYFUUklbjY3QRcTJQEBBREiRwsnGAwVCRQYBgYBUUkZRSYDwCgpi11eaWpdXYspKCgpi11damleXYspKPUJCB1yVUUyAQEBDBlnExgFBgsnGAsWCYE1GhwcHXJVRTIBAQIMGGcTGAUGCycYCxYJgTUSGwIAAAABAAD/wAQAA8AAMwAAASIGBw4BBw4BFRQWFx4BFx4BFRQGBw4BBw4BFRQWFx4BFx4BMzI2NwE+ATU0JicBLgEjMQIAQJxJJEUfHzQgExMlEB8fHSAQJhQUHjMgH0YlSZs/Eh8LAasMDQ0M/lULHxIDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUNDAGrCx8SEh8LAasMDQAAAAEAAP/ABAADwAA5AAABOAExIgYHAQ4BFRQWFwEeATM4ATkBMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgASHwz+VgwNDQwBqgwfEj+bSiRGICAyHhQUJhAgHR8fECUTFB80HyBEJEmcQAPADQz+VQsfEhIfC/5VDA0FDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAEAAP/ABAADwABIAAABIgYHDgEHDgEVFBYXHgEXHgEVFAYHDgEHDgEVFBYXHgEXHgEzMjY3PgE3PgE1NCYnLgEnLgE1NDY3PgE3PgE1NCYnLgEnLgEjAgBAnEkkRB8gNCATEyUQHyAeIBAmFBQeMyAgRSVJmz8/nEklRSAgMh4UEycQHx4fHxAlFBMfNB8fRSRJm0EDwAgPBxYUE0otJ0EWFR4OGigtLSQaDR4XFkQnLUwVFRYGDgUFDgYWFRVMLSdEFhceDRokLS0oGg4eFRZBJy1KExQWBw8IAAABAAD/wAP9A8AAhAAAAQ4BBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGBw4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFx4BFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BFzI2NzI2MyM+ATc+ATcxAT4BNTQmJwEuAScjLgEnIiYrAS4BIwH3GhQHEBcNDBgJBAgEAgQDCRkODhwPDyMXGAkDBAMBAgICAQEBAwIGEAkIEggJEhIJCBIICRAGAgMBAQECAgIBAwQDCRgXIw8PHA4OGQkDBAIDCQQJGAwNFxAHFBoFDAYBAgEBAwYDCQ8GAakMDQ0M/lcGDggBAwYDAQEBAQYMBQPAAQsFCRMKChQIAwYCAQEDAQEEAwMJFxgiDw8dDQ4ZCQQFAwEFAggTCwoXDQ0fISIeDQwXCwoUBwMEAgMFBAkZDQ4dDw4jFxgIBAMDAgECAgECBQQIFAoKEwkFCwEBAgEBAgEDCQYBqgwfERIfCwGqBgkDAQIBAQIBAAAAAQAA/8AD/wPAAKAAAAEiBgciBiMzDgEHDgEHMRQiBw4BBzEBDgEVFBYXAR4BFzMWMjM+ATc+ATc+ATc+ATcyNjM+ATc+ATc+ATc+ATc+ATc+ATc0Njc+ATc+ATc+ATc+ATU0JicuAScuAScuAScuATUuAScuAScuASc4ATE4ATkBMDQxOAE5ATgBMTgBOQE4ATE4ATkBLgEnLgEnLgEnIiYnLgEnLgEnLgEnLgEnAgcFDAYBAgEBBAcDBgoEAQECAwH+VgwNDQwBqgoaDwEECAQaEwgPGQwMGAkECQMCBAMJGg0OHQ8PIhgXCQQDBAECAgEBAQEDAgYQCQkSCAkSEgkIEgkJEAYCAwEBAQECAgEEAwQJFxgiDw8dDg0aCQMFAgMIBAkYDAwZDwgTGgPAAQIBAQICAgYDAQEBAgH+VgwfEhEfDP5WCgwCAQELBQkTCgoUCAMGAgEBAwEBBAMDCRcYIw4PHQ4NGQkDBgICBQMHEwsKFw0NHyEiHg0NFgsLEwcDBAIDBQQJGQ4NHQ8PIhcBFwkDAwQBAgIBAQEBBgMIFAoKEwkFCwEAAAABAAD/wAQAA8AAwAAAASIGBw4BBw4BBw4BByIGIw4BBw4BBw4BBw4BBw4BBw4BBxQGFQ4BBw4BBw4BBw4BFRQWFx4BFx4BFx4BFxQWFR4BFx4BFx4BFx4BFx4BFx4BFzIWMx4BFx4BFx4BFx4BMzI2Nz4BNz4BNz4BNzI2Mz4BNz4BNz4BNz4BNz4BNz4BNzQ2NT4BNz4BNz4BNz4BNTQmJy4BJy4BJy4BJzQmNS4BJy4BJy4BJy4BJy4BJy4BJyImIy4BJy4BJy4BJy4BIwIAIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAkDAwQBAgIBAgEEAgYQCQgSCAkSEgkIEggJEAYDAwECAQICAQQDAwkYGCIPDx0ODhkJBAUDAgUDBxQKCxcNDR8hIR8NDRcLChQHAwUCAgYECRkODh0PDyIYGAgEAwQBAgIBAgEEAgYQCAkSCAkSEgkIEgkIEAYCBAECAQICAQQDBAgYGCIPDx0ODhkJBAYCAgUDBxQKCxcNDR8hA8ASCQgSCAkQBgMDAQIBAgIBBAMDCRgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCAQDBAEBAwECAQQCBhAJCBIICRISCQgSCAkQBgIEAQIBAwEBBAMECBgYIg8PHQ4OGQkEBgICBQMHFAoLFw0NHyEhHw0NFwsKFAcDBQICBgQJGQ4OHQ8PIhgYCQMDBAECAgECAQMDBhAJCBIICRIAAAEAAP/ABAEDwACiAAABIgYjMQ4BBzMOASMzDgE5AQ4BBzEOAQcxIgYjMQYHDgEHBiMiBhUUFjMxMhYXHgEVFAYHDgEjDgEVFBYzMTIXHgEXFhcyFjkBHgEXMx4BFxUeARczHgE7ARYyMzoBMzE6ATcjMjY3MTI2NxU+ATcxPgE3MT4BMzEBPgE1NCYnASImJzEuAScjLgEnIzAmNSMiJicjLgEnMSImIyoBOQEqASMxAfgBAgEDBwQBAgQCAQECBAYDAgQCAQIBHSgnXzU2OSMyMiMqMQ8QERIQEDEoIjExIjw3N14nJhoBAQMHAwEBBAIDCAQBAQQCAQIHAwEDAQIEAgEFCAQCBAIEBwMCAwIBAgEBqwwNDQz+VQECAQIDAgEDBgMBAgEBBAEBAwYEAgYCAQECBQIDwAEBAQEBAQEBAgMCAgMCAh4gITcSEjIkIzIXEREwGhkxERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIFAgEDAQECAawLHxISHwsBrAIBAQMBAgQCAQEBAQEBAQEAAAAAAQAA/8AEAgPAAKUAAAEiBiMzDgEHMQ4BIzEOASMxDgEHMQ4BBzEOASMxAQ4BFRQWFwEeARczHgEXMR4BFxUyFhcxHgE7ARYyMzAyMzEwMjM6ATcxMjY3Iz4BNwc+ATcjPgE3MT4BNzE2Nz4BNzYzPgE1NCYjMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImJyMuAScjIiYjKgE5ASoBIzEB+AECAQEEBwMCBAEBAQEEBgMCBAECAgH+VQwNDQwBqwECAQEBBAIDBgQCBQMDBwMBAgUDAQEBAQMFAgQHAwEDBgIBBAcDAQMDAgECARsmJl83NzsjMTEjKDEQEBIREBAxKSMzMyM5NTZeKCceAQIBAgMCAwcDAQEBAQEDAgECBwMBAgUDAQECBAMDwAEBAQEBAQEBAgQCAQMBAQL+VAsgERIfDP5VAQEBAQMCAgQBAQIBAQIBAQIBAQIBAQIEAgIDAQEBARohIDgTEwEyIyMyFxIRMBoaMBERFzIjJDISEjchIB4CAQEDAQIEAgEBAQEBAQEBAAEAAP/ABAEDwADFAAABIgYjMw4BBzEOASMzDgEjMQ4BBzEOAQcxDgEHNQYHDgEHBiMiBhUUFjMxMhYXHgEVDgEHDgEjDgEVFBYzMTIXHgEXFhcyFjEzHgEXMR4BFxUeARcxHgE7ARYyMzoBMzE6ATcxMjY3IzI2Nwc+ATcxPgE3MT4BMzE2Nz4BNzYzMjY1NCYnMSImJy4BNTQ2Nz4BMzI2NTQmIzEiJy4BJyYnIiYnMS4BJzEuAScjMCYnIyImIzEuAScxIiYjMCI5ASoBIzAiOQEB+AEDAQEDBgMCBQIBAQIBAwUDAgUCAQIBHSgnXzU2OSMyMiMqMRAQEQESEBAxKCIxMSI8NzdeJyYaAQEBAwYEAgMCBAcFAgMCAQMGBAECAQIEAgQJBAECBQIBBAcDAgQBAQIBGyYmXzc2PCMwMCMoMRAQEhEQEDEpIzIyIzk1Nl4oJx4BAgECAwIDBwMBAQEBAQMCAwcEAwQDAQIFAgEDwAEBAQEBAQEBAgMCAgMCAQEBAR4hIDcSEjIkIzIXEREwGhowERIWATIjIzITEzkgIBsBAwUCAQIBAQEDAQEBAQECAgIBAQIEAwEDAQECGyAgORMTMiMjMgEWEhEwGhowEREXMiMkMhISNyAhHgIBAQICAgQCAQEBAgEBAQADAAD/wAQAA8AAKgBIAGUAAAE4ATEiBhU4ATkBETgBMRQWMzgBMTM4ATEyNjU4ATkBETgBMTQmIzgBOQEFJiIjIgYHAQ4BFRQWFwEeATMyNjURNCYnMS4BKwEBOAExIgYVERQWMzgBMTM4ATEyNjURNCYjOAE5AQNBHy0tH3MgLCwg/lQBBQISHwv+VQwNDQwBqwsfEiMyHRcGDAYBATkfLS0fcyAsLCADwCwg/u0fLS0fARMgLAEBDgv+VQsfEhIfC/5VDA0yIwNWGioKAwP9qywf/u0gLCwgARMfLAAAAAEAAP/ABAADwAAkAAATIgYVFBYXCQEOARUUFjMhOAExMjY1NCYnCQE+ATU0JiM4ATkBVSMyDQwBbv6SDA0yIwNWIzINDP6SAW4MDTIjA8AyIxIfDP6S/pIMHxIjMjIjEh8MAW4BbgwfEiMyAAIAAP/ABAADwAAWADcAAAE4ATEiBhURFBYzOAExMzI2NRE0JiMxISoBIyIGBwEOARUUFhcBHgEzMjY1ETgBMTQmJzUuAScjA0EfLS0fcyAsLCD+VAIEAhIfC/5VDA0NDAGrCx8SIzIdFwYMBgEDwCwg/JggLCwgA2ggLA0M/lULHxISHwv+VQwNMiMDVhorCQECAwEAAAAAAQAA/8AEAAPAACAAAAEOAQcBDgEVFBYXAR4BMzI2NwE+ATU0JicBLgEjIgYjMwHzDhgJ/lUMDQ0MAasLHxISHwsBqwwNDQz+VQsfEgQGBAEDvwINCf5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNAQAAAAACAAD/wAQAA8AAIAAjAAABIgYHAQ4BFRQWFwEeATMyNjcBPgE1NCYnAS4BIzgBOQEVCQECABIfC/5VDA0NDAGrCx8SEh8LAasMDQ0M/lULHxIBMv7OA8ANDP5VCx8SEh8L/lUMDQ0MAasLHxISHwsBqwwNzv7O/s4AAAAAAQAAAAEAAG9Y4W9fDzz1AAsEAAAAAADj+19KAAAAAOP7X0oAAP/ABAIDwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAgAAAAAEAgABAAAAAAAAAAAAAAAAAAAAKgQAAAAAAAAAAAAAAAIAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAD/QAAA/8AAAQAAAAEAQAABAIAAAQBAAAEAAAABAAAAAQAAAAEAAAABAAAAAAAAAAACgAUAB4AtAFMAeICrgOABE4EugUiBYoGLgbUB3YINgj6CbYKIgqQCvgLKgtgC5AMIAyyDT4NkA3kDlIPGg/wEQ4R3hKyE6oUGhRQFJwU1hUUAAAAAQAAACoAxgAEAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABAAAAABAAAAAAACAAcAsQABAAAAAAADABAAUQABAAAAAAAEABAAxgABAAAAAAAFAAsAMAABAAAAAAAGABAAgQABAAAAAAAKABoA9gADAAEECQABACAAEAADAAEECQACAA4AuAADAAEECQADACAAYQADAAEECQAEACAA1gADAAEECQAFABYAOwADAAEECQAGACAAkQADAAEECQAKADQBEGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AblJlZ3VsYXIAUgBlAGcAdQBsAGEAcmdlY2tvbGliX2ljb21vb24AZwBlAGMAawBvAGwAaQBiAF8AaQBjAG8AbQBvAG8AbkZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"), __webpack_require__.b);\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\nvar ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `@font-face {\n    font-family: 'geckolib_icomoon';\n    font-weight: normal;\n    font-style: normal;\n    src: url(${___CSS_LOADER_URL_REPLACEMENT_0___}) format(\"woff2\");\n}\n\n[class^=\"easing-\"]:not(.fa), [class*=\" easing-\"]:not(.fa) {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: 'geckolib_icomoon' !important;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n    max-width: 24px;\n    margin-top: 4px;\n    font-size: 14px;\n    margin-left: -1px;\n    pointer-events: none;\n    display: block;\n\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.easing-linear:before {\n    content: \"\\\\e925\";\n}\n.easing-step:before {\n    content: \"\\\\e921\";\n}\n.easing-in_sine:before {\n    content: \"\\\\e915\";\n}\n.easing-out_sine:before {\n    content: \"\\\\e916\";\n}\n.easing-in_out_sine:before {\n    content: \"\\\\e917\";\n}\n.easing-in_quad:before {\n    content: \"\\\\e900\";\n}\n.easing-out_quad:before {\n    content: \"\\\\e901\";\n}\n.easing-in_out_quad:before {\n    content: \"\\\\e902\";\n}\n.easing-in_cubic:before {\n    content: \"\\\\e903\";\n}\n.easing-out_cubic:before {\n    content: \"\\\\e904\";\n}\n.easing-in_out_cubic:before {\n    content: \"\\\\e905\";\n}\n.easing-in_quart:before {\n    content: \"\\\\e906\";\n}\n.easing-out_quart:before {\n    content: \"\\\\e907\";\n}\n.easing-in_out_quart:before {\n    content: \"\\\\e908\";\n}\n.easing-in_quint:before {\n    content: \"\\\\e909\";\n}\n.easing-out_quint:before {\n    content: \"\\\\e90a\";\n}\n.easing-in_out_quint:before {\n    content: \"\\\\e90b\";\n}\n.easing-in_expo:before {\n    content: \"\\\\e90c\";\n}\n.easing-out_expo:before {\n    content: \"\\\\e90d\";\n}\n.easing-in_out_expo:before {\n    content: \"\\\\e90e\";\n}\n.easing-in_circ:before {\n    content: \"\\\\e90f\";\n}\n.easing-out_circ:before {\n    content: \"\\\\e910\";\n}\n.easing-in_out_circ:before {\n    content: \"\\\\e911\";\n}\n.easing-in_back:before {\n    content: \"\\\\e918\";\n}\n.easing-out_back:before {\n    content: \"\\\\e919\";\n}\n.easing-in_out_back:before {\n    content: \"\\\\e91a\";\n}\n.easing-in_elastic:before {\n    content: \"\\\\e91b\";\n}\n.easing-out_elastic:before {\n    content: \"\\\\e91c\";\n}\n.easing-in_out_elastic:before {\n    content: \"\\\\e91d\";\n}\n.easing-in_bounce:before {\n    content: \"\\\\e91e\";\n}\n.easing-out_bounce:before {\n    content: \"\\\\e91f\";\n}\n.easing-in_out_bounce:before {\n    content: \"\\\\e920\";\n}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/api.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/api.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n  var list = [];\n\n  // return the list of modules as css string\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = \"\";\n      var needLayer = typeof item[5] !== \"undefined\";\n      if (item[4]) {\n        content += \"@supports (\".concat(item[4], \") {\");\n      }\n      if (item[2]) {\n        content += \"@media \".concat(item[2], \" {\");\n      }\n      if (needLayer) {\n        content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n      }\n      content += cssWithMappingToString(item);\n      if (needLayer) {\n        content += \"}\";\n      }\n      if (item[2]) {\n        content += \"}\";\n      }\n      if (item[4]) {\n        content += \"}\";\n      }\n      return content;\n    }).join(\"\");\n  };\n\n  // import a list of modules into the list\n  list.i = function i(modules, media, dedupe, supports, layer) {\n    if (typeof modules === \"string\") {\n      modules = [[null, modules, undefined]];\n    }\n    var alreadyImportedModules = {};\n    if (dedupe) {\n      for (var k = 0; k < this.length; k++) {\n        var id = this[k][0];\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n    for (var _k = 0; _k < modules.length; _k++) {\n      var item = [].concat(modules[_k]);\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        continue;\n      }\n      if (typeof layer !== \"undefined\") {\n        if (typeof item[5] === \"undefined\") {\n          item[5] = layer;\n        } else {\n          item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n          item[5] = layer;\n        }\n      }\n      if (media) {\n        if (!item[2]) {\n          item[2] = media;\n        } else {\n          item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n          item[2] = media;\n        }\n      }\n      if (supports) {\n        if (!item[4]) {\n          item[4] = \"\".concat(supports);\n        } else {\n          item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n          item[4] = supports;\n        }\n      }\n      list.push(item);\n    }\n  };\n  return list;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/getUrl.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/getUrl.js ***!\n  \\********************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = function (url, options) {\n  if (!options) {\n    options = {};\n  }\n  if (!url) {\n    return url;\n  }\n  url = String(url.__esModule ? url.default : url);\n\n  // If url is already wrapped in quotes, remove them\n  if (/^['\"].*['\"]$/.test(url)) {\n    url = url.slice(1, -1);\n  }\n  if (options.hash) {\n    url += options.hash;\n  }\n\n  // Should url be wrapped?\n  // See https://drafts.csswg.org/css-values-3/#urls\n  if (/[\"'() \\t\\n]|(%20)/.test(url) || options.needQuotes) {\n    return \"\\\"\".concat(url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\"), \"\\\"\");\n  }\n  return url;\n};\n\n/***/ }),\n\n/***/ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\":\n/*!**************************************************************!*\\\n  !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***!\n  \\**************************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nmodule.exports = function (i) {\n  return i[1];\n};\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_DataView.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_DataView.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Hash.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/_Hash.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar hashClear = __webpack_require__(/*! ./_hashClear */ \"./node_modules/lodash/_hashClear.js\"),\n    hashDelete = __webpack_require__(/*! ./_hashDelete */ \"./node_modules/lodash/_hashDelete.js\"),\n    hashGet = __webpack_require__(/*! ./_hashGet */ \"./node_modules/lodash/_hashGet.js\"),\n    hashHas = __webpack_require__(/*! ./_hashHas */ \"./node_modules/lodash/_hashHas.js\"),\n    hashSet = __webpack_require__(/*! ./_hashSet */ \"./node_modules/lodash/_hashSet.js\");\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_ListCache.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_ListCache.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar listCacheClear = __webpack_require__(/*! ./_listCacheClear */ \"./node_modules/lodash/_listCacheClear.js\"),\n    listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ \"./node_modules/lodash/_listCacheDelete.js\"),\n    listCacheGet = __webpack_require__(/*! ./_listCacheGet */ \"./node_modules/lodash/_listCacheGet.js\"),\n    listCacheHas = __webpack_require__(/*! ./_listCacheHas */ \"./node_modules/lodash/_listCacheHas.js\"),\n    listCacheSet = __webpack_require__(/*! ./_listCacheSet */ \"./node_modules/lodash/_listCacheSet.js\");\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Map.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/_Map.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_MapCache.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_MapCache.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ \"./node_modules/lodash/_mapCacheClear.js\"),\n    mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ \"./node_modules/lodash/_mapCacheDelete.js\"),\n    mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ \"./node_modules/lodash/_mapCacheGet.js\"),\n    mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ \"./node_modules/lodash/_mapCacheHas.js\"),\n    mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ \"./node_modules/lodash/_mapCacheSet.js\");\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Promise.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_Promise.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Set.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/_Set.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_SetCache.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_SetCache.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\"),\n    setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ \"./node_modules/lodash/_setCacheAdd.js\"),\n    setCacheHas = __webpack_require__(/*! ./_setCacheHas */ \"./node_modules/lodash/_setCacheHas.js\");\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Stack.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_Stack.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    stackClear = __webpack_require__(/*! ./_stackClear */ \"./node_modules/lodash/_stackClear.js\"),\n    stackDelete = __webpack_require__(/*! ./_stackDelete */ \"./node_modules/lodash/_stackDelete.js\"),\n    stackGet = __webpack_require__(/*! ./_stackGet */ \"./node_modules/lodash/_stackGet.js\"),\n    stackHas = __webpack_require__(/*! ./_stackHas */ \"./node_modules/lodash/_stackHas.js\"),\n    stackSet = __webpack_require__(/*! ./_stackSet */ \"./node_modules/lodash/_stackSet.js\");\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Symbol.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/_Symbol.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_Uint8Array.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_Uint8Array.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_WeakMap.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_WeakMap.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\"),\n    root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayAggregator.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_arrayAggregator.js ***!\n  \\*************************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    var value = array[index];\n    setter(accumulator, value, iteratee(value), array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayFilter.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_arrayFilter.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayIncludes.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_arrayIncludes.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ \"./node_modules/lodash/_baseIndexOf.js\");\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayIncludesWith.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/lodash/_arrayIncludesWith.js ***!\n  \\***************************************************/\n/***/ ((module) => {\n\n/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayLikeKeys.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_arrayLikeKeys.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseTimes = __webpack_require__(/*! ./_baseTimes */ \"./node_modules/lodash/_baseTimes.js\"),\n    isArguments = __webpack_require__(/*! ./isArguments */ \"./node_modules/lodash/isArguments.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isBuffer = __webpack_require__(/*! ./isBuffer */ \"./node_modules/lodash/isBuffer.js\"),\n    isIndex = __webpack_require__(/*! ./_isIndex */ \"./node_modules/lodash/_isIndex.js\"),\n    isTypedArray = __webpack_require__(/*! ./isTypedArray */ \"./node_modules/lodash/isTypedArray.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayMap.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_arrayMap.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arrayPush.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_arrayPush.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_arraySome.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_arraySome.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_assocIndexOf.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_assocIndexOf.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar eq = __webpack_require__(/*! ./eq */ \"./node_modules/lodash/eq.js\");\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseAggregator.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_baseAggregator.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseEach = __webpack_require__(/*! ./_baseEach */ \"./node_modules/lodash/_baseEach.js\");\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n  baseEach(collection, function(value, key, collection) {\n    setter(accumulator, value, iteratee(value), collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseAssignValue.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseAssignValue.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar defineProperty = __webpack_require__(/*! ./_defineProperty */ \"./node_modules/lodash/_defineProperty.js\");\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseEach.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseEach.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseForOwn = __webpack_require__(/*! ./_baseForOwn */ \"./node_modules/lodash/_baseForOwn.js\"),\n    createBaseEach = __webpack_require__(/*! ./_createBaseEach */ \"./node_modules/lodash/_createBaseEach.js\");\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseFindIndex.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_baseFindIndex.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseFor.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_baseFor.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar createBaseFor = __webpack_require__(/*! ./_createBaseFor */ \"./node_modules/lodash/_createBaseFor.js\");\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseForOwn.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_baseForOwn.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseFor = __webpack_require__(/*! ./_baseFor */ \"./node_modules/lodash/_baseFor.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_baseGet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar castPath = __webpack_require__(/*! ./_castPath */ \"./node_modules/lodash/_castPath.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGetAllKeys.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_baseGetAllKeys.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayPush = __webpack_require__(/*! ./_arrayPush */ \"./node_modules/lodash/_arrayPush.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\");\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseGetTag.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_baseGetTag.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    getRawTag = __webpack_require__(/*! ./_getRawTag */ \"./node_modules/lodash/_getRawTag.js\"),\n    objectToString = __webpack_require__(/*! ./_objectToString */ \"./node_modules/lodash/_objectToString.js\");\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseHasIn.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseHasIn.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIndexOf.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIndexOf.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ \"./node_modules/lodash/_baseFindIndex.js\"),\n    baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ \"./node_modules/lodash/_baseIsNaN.js\"),\n    strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ \"./node_modules/lodash/_strictIndexOf.js\");\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsArguments.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsArguments.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsEqual.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsEqual.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ \"./node_modules/lodash/_baseIsEqualDeep.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsEqualDeep.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsEqualDeep.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Stack = __webpack_require__(/*! ./_Stack */ \"./node_modules/lodash/_Stack.js\"),\n    equalArrays = __webpack_require__(/*! ./_equalArrays */ \"./node_modules/lodash/_equalArrays.js\"),\n    equalByTag = __webpack_require__(/*! ./_equalByTag */ \"./node_modules/lodash/_equalByTag.js\"),\n    equalObjects = __webpack_require__(/*! ./_equalObjects */ \"./node_modules/lodash/_equalObjects.js\"),\n    getTag = __webpack_require__(/*! ./_getTag */ \"./node_modules/lodash/_getTag.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isBuffer = __webpack_require__(/*! ./isBuffer */ \"./node_modules/lodash/isBuffer.js\"),\n    isTypedArray = __webpack_require__(/*! ./isTypedArray */ \"./node_modules/lodash/isTypedArray.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsMatch.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsMatch.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Stack = __webpack_require__(/*! ./_Stack */ \"./node_modules/lodash/_Stack.js\"),\n    baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ \"./node_modules/lodash/_baseIsEqual.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsNaN.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseIsNaN.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsNative.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseIsNative.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isFunction = __webpack_require__(/*! ./isFunction */ \"./node_modules/lodash/isFunction.js\"),\n    isMasked = __webpack_require__(/*! ./_isMasked */ \"./node_modules/lodash/_isMasked.js\"),\n    isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\"),\n    toSource = __webpack_require__(/*! ./_toSource */ \"./node_modules/lodash/_toSource.js\");\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIsTypedArray.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_baseIsTypedArray.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseIteratee.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseIteratee.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseMatches = __webpack_require__(/*! ./_baseMatches */ \"./node_modules/lodash/_baseMatches.js\"),\n    baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ \"./node_modules/lodash/_baseMatchesProperty.js\"),\n    identity = __webpack_require__(/*! ./identity */ \"./node_modules/lodash/identity.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    property = __webpack_require__(/*! ./property */ \"./node_modules/lodash/property.js\");\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseKeys.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseKeys.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isPrototype = __webpack_require__(/*! ./_isPrototype */ \"./node_modules/lodash/_isPrototype.js\"),\n    nativeKeys = __webpack_require__(/*! ./_nativeKeys */ \"./node_modules/lodash/_nativeKeys.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseMatches.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_baseMatches.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ \"./node_modules/lodash/_baseIsMatch.js\"),\n    getMatchData = __webpack_require__(/*! ./_getMatchData */ \"./node_modules/lodash/_getMatchData.js\"),\n    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ \"./node_modules/lodash/_matchesStrictComparable.js\");\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseMatchesProperty.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/lodash/_baseMatchesProperty.js ***!\n  \\*****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ \"./node_modules/lodash/_baseIsEqual.js\"),\n    get = __webpack_require__(/*! ./get */ \"./node_modules/lodash/get.js\"),\n    hasIn = __webpack_require__(/*! ./hasIn */ \"./node_modules/lodash/hasIn.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ \"./node_modules/lodash/_isStrictComparable.js\"),\n    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ \"./node_modules/lodash/_matchesStrictComparable.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseProperty.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseProperty.js ***!\n  \\**********************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_basePropertyDeep.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_basePropertyDeep.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGet = __webpack_require__(/*! ./_baseGet */ \"./node_modules/lodash/_baseGet.js\");\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseTimes.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseTimes.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseToString.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_baseToString.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    arrayMap = __webpack_require__(/*! ./_arrayMap */ \"./node_modules/lodash/_arrayMap.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseUnary.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_baseUnary.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_baseUniq.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_baseUniq.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar SetCache = __webpack_require__(/*! ./_SetCache */ \"./node_modules/lodash/_SetCache.js\"),\n    arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ \"./node_modules/lodash/_arrayIncludes.js\"),\n    arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ \"./node_modules/lodash/_arrayIncludesWith.js\"),\n    cacheHas = __webpack_require__(/*! ./_cacheHas */ \"./node_modules/lodash/_cacheHas.js\"),\n    createSet = __webpack_require__(/*! ./_createSet */ \"./node_modules/lodash/_createSet.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_cacheHas.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_cacheHas.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_castPath.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_castPath.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    stringToPath = __webpack_require__(/*! ./_stringToPath */ \"./node_modules/lodash/_stringToPath.js\"),\n    toString = __webpack_require__(/*! ./toString */ \"./node_modules/lodash/toString.js\");\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_coreJsData.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_coreJsData.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\");\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createAggregator.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/lodash/_createAggregator.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayAggregator = __webpack_require__(/*! ./_arrayAggregator */ \"./node_modules/lodash/_arrayAggregator.js\"),\n    baseAggregator = __webpack_require__(/*! ./_baseAggregator */ \"./node_modules/lodash/_baseAggregator.js\"),\n    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\");\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n  return function(collection, iteratee) {\n    var func = isArray(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {};\n\n    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n  };\n}\n\nmodule.exports = createAggregator;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createBaseEach.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_createBaseEach.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArrayLike = __webpack_require__(/*! ./isArrayLike */ \"./node_modules/lodash/isArrayLike.js\");\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createBaseFor.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_createBaseFor.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_createSet.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_createSet.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Set = __webpack_require__(/*! ./_Set */ \"./node_modules/lodash/_Set.js\"),\n    noop = __webpack_require__(/*! ./noop */ \"./node_modules/lodash/noop.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_defineProperty.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_defineProperty.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\");\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalArrays.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_equalArrays.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar SetCache = __webpack_require__(/*! ./_SetCache */ \"./node_modules/lodash/_SetCache.js\"),\n    arraySome = __webpack_require__(/*! ./_arraySome */ \"./node_modules/lodash/_arraySome.js\"),\n    cacheHas = __webpack_require__(/*! ./_cacheHas */ \"./node_modules/lodash/_cacheHas.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalByTag.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_equalByTag.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\"),\n    Uint8Array = __webpack_require__(/*! ./_Uint8Array */ \"./node_modules/lodash/_Uint8Array.js\"),\n    eq = __webpack_require__(/*! ./eq */ \"./node_modules/lodash/eq.js\"),\n    equalArrays = __webpack_require__(/*! ./_equalArrays */ \"./node_modules/lodash/_equalArrays.js\"),\n    mapToArray = __webpack_require__(/*! ./_mapToArray */ \"./node_modules/lodash/_mapToArray.js\"),\n    setToArray = __webpack_require__(/*! ./_setToArray */ \"./node_modules/lodash/_setToArray.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_equalObjects.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_equalObjects.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getAllKeys = __webpack_require__(/*! ./_getAllKeys */ \"./node_modules/lodash/_getAllKeys.js\");\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_freeGlobal.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_freeGlobal.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;\n\nmodule.exports = freeGlobal;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getAllKeys.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getAllKeys.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ \"./node_modules/lodash/_baseGetAllKeys.js\"),\n    getSymbols = __webpack_require__(/*! ./_getSymbols */ \"./node_modules/lodash/_getSymbols.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getMapData.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getMapData.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isKeyable = __webpack_require__(/*! ./_isKeyable */ \"./node_modules/lodash/_isKeyable.js\");\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getMatchData.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_getMatchData.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ \"./node_modules/lodash/_isStrictComparable.js\"),\n    keys = __webpack_require__(/*! ./keys */ \"./node_modules/lodash/keys.js\");\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getNative.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_getNative.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsNative = __webpack_require__(/*! ./_baseIsNative */ \"./node_modules/lodash/_baseIsNative.js\"),\n    getValue = __webpack_require__(/*! ./_getValue */ \"./node_modules/lodash/_getValue.js\");\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getRawTag.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_getRawTag.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Symbol = __webpack_require__(/*! ./_Symbol */ \"./node_modules/lodash/_Symbol.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getSymbols.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_getSymbols.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayFilter = __webpack_require__(/*! ./_arrayFilter */ \"./node_modules/lodash/_arrayFilter.js\"),\n    stubArray = __webpack_require__(/*! ./stubArray */ \"./node_modules/lodash/stubArray.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getTag.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/_getTag.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar DataView = __webpack_require__(/*! ./_DataView */ \"./node_modules/lodash/_DataView.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\"),\n    Promise = __webpack_require__(/*! ./_Promise */ \"./node_modules/lodash/_Promise.js\"),\n    Set = __webpack_require__(/*! ./_Set */ \"./node_modules/lodash/_Set.js\"),\n    WeakMap = __webpack_require__(/*! ./_WeakMap */ \"./node_modules/lodash/_WeakMap.js\"),\n    baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    toSource = __webpack_require__(/*! ./_toSource */ \"./node_modules/lodash/_toSource.js\");\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_getValue.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_getValue.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hasPath.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hasPath.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar castPath = __webpack_require__(/*! ./_castPath */ \"./node_modules/lodash/_castPath.js\"),\n    isArguments = __webpack_require__(/*! ./isArguments */ \"./node_modules/lodash/isArguments.js\"),\n    isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isIndex = __webpack_require__(/*! ./_isIndex */ \"./node_modules/lodash/_isIndex.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashClear.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_hashClear.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashDelete.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_hashDelete.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashGet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashGet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashHas.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashHas.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_hashSet.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_hashSet.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar nativeCreate = __webpack_require__(/*! ./_nativeCreate */ \"./node_modules/lodash/_nativeCreate.js\");\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isIndex.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_isIndex.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isKey.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_isKey.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isArray = __webpack_require__(/*! ./isArray */ \"./node_modules/lodash/isArray.js\"),\n    isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isKeyable.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/_isKeyable.js ***!\n  \\*******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isMasked.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_isMasked.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar coreJsData = __webpack_require__(/*! ./_coreJsData */ \"./node_modules/lodash/_coreJsData.js\");\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isPrototype.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_isPrototype.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_isStrictComparable.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/lodash/_isStrictComparable.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\");\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheClear.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_listCacheClear.js ***!\n  \\************************************************/\n/***/ ((module) => {\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheDelete.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/lodash/_listCacheDelete.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheGet.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheGet.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheHas.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheHas.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_listCacheSet.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_listCacheSet.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ \"./node_modules/lodash/_assocIndexOf.js\");\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheClear.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheClear.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar Hash = __webpack_require__(/*! ./_Hash */ \"./node_modules/lodash/_Hash.js\"),\n    ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\");\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheDelete.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheDelete.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheGet.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheGet.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheHas.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheHas.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapCacheSet.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_mapCacheSet.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getMapData = __webpack_require__(/*! ./_getMapData */ \"./node_modules/lodash/_getMapData.js\");\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_mapToArray.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_mapToArray.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_matchesStrictComparable.js\":\n/*!*********************************************************!*\\\n  !*** ./node_modules/lodash/_matchesStrictComparable.js ***!\n  \\*********************************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_memoizeCapped.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_memoizeCapped.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar memoize = __webpack_require__(/*! ./memoize */ \"./node_modules/lodash/memoize.js\");\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nativeCreate.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_nativeCreate.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar getNative = __webpack_require__(/*! ./_getNative */ \"./node_modules/lodash/_getNative.js\");\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nativeKeys.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_nativeKeys.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar overArg = __webpack_require__(/*! ./_overArg */ \"./node_modules/lodash/_overArg.js\");\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_nodeUtil.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_nodeUtil.js ***!\n  \\******************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\n/* module decorator */ module = __webpack_require__.nmd(module);\nvar freeGlobal = __webpack_require__(/*! ./_freeGlobal */ \"./node_modules/lodash/_freeGlobal.js\");\n\n/** Detect free variable `exports`. */\nvar freeExports =  true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_objectToString.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/lodash/_objectToString.js ***!\n  \\************************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_overArg.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/_overArg.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_root.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/_root.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar freeGlobal = __webpack_require__(/*! ./_freeGlobal */ \"./node_modules/lodash/_freeGlobal.js\");\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setCacheAdd.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_setCacheAdd.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setCacheHas.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_setCacheHas.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_setToArray.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_setToArray.js ***!\n  \\********************************************/\n/***/ ((module) => {\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackClear.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/_stackClear.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\");\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackDelete.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/_stackDelete.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackGet.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackGet.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackHas.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackHas.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stackSet.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_stackSet.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar ListCache = __webpack_require__(/*! ./_ListCache */ \"./node_modules/lodash/_ListCache.js\"),\n    Map = __webpack_require__(/*! ./_Map */ \"./node_modules/lodash/_Map.js\"),\n    MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\");\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_strictIndexOf.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/lodash/_strictIndexOf.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_stringToPath.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/lodash/_stringToPath.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ \"./node_modules/lodash/_memoizeCapped.js\");\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_toKey.js\":\n/*!***************************************!*\\\n  !*** ./node_modules/lodash/_toKey.js ***!\n  \\***************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isSymbol = __webpack_require__(/*! ./isSymbol */ \"./node_modules/lodash/isSymbol.js\");\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/_toSource.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/_toSource.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/eq.js\":\n/*!***********************************!*\\\n  !*** ./node_modules/lodash/eq.js ***!\n  \\***********************************/\n/***/ ((module) => {\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/get.js\":\n/*!************************************!*\\\n  !*** ./node_modules/lodash/get.js ***!\n  \\************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGet = __webpack_require__(/*! ./_baseGet */ \"./node_modules/lodash/_baseGet.js\");\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/groupBy.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/groupBy.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ \"./node_modules/lodash/_baseAssignValue.js\"),\n    createAggregator = __webpack_require__(/*! ./_createAggregator */ \"./node_modules/lodash/_createAggregator.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n  if (hasOwnProperty.call(result, key)) {\n    result[key].push(value);\n  } else {\n    baseAssignValue(result, key, [value]);\n  }\n});\n\nmodule.exports = groupBy;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/hasIn.js\":\n/*!**************************************!*\\\n  !*** ./node_modules/lodash/hasIn.js ***!\n  \\**************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseHasIn = __webpack_require__(/*! ./_baseHasIn */ \"./node_modules/lodash/_baseHasIn.js\"),\n    hasPath = __webpack_require__(/*! ./_hasPath */ \"./node_modules/lodash/_hasPath.js\");\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/identity.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/identity.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArguments.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/isArguments.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ \"./node_modules/lodash/_baseIsArguments.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArray.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/isArray.js ***!\n  \\****************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isArrayLike.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/lodash/isArrayLike.js ***!\n  \\********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar isFunction = __webpack_require__(/*! ./isFunction */ \"./node_modules/lodash/isFunction.js\"),\n    isLength = __webpack_require__(/*! ./isLength */ \"./node_modules/lodash/isLength.js\");\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isBuffer.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isBuffer.js ***!\n  \\*****************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\n/* module decorator */ module = __webpack_require__.nmd(module);\nvar root = __webpack_require__(/*! ./_root */ \"./node_modules/lodash/_root.js\"),\n    stubFalse = __webpack_require__(/*! ./stubFalse */ \"./node_modules/lodash/stubFalse.js\");\n\n/** Detect free variable `exports`. */\nvar freeExports =  true && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && \"object\" == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isFunction.js\":\n/*!*******************************************!*\\\n  !*** ./node_modules/lodash/isFunction.js ***!\n  \\*******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObject = __webpack_require__(/*! ./isObject */ \"./node_modules/lodash/isObject.js\");\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isLength.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isLength.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isObject.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isObject.js ***!\n  \\*****************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isObjectLike.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/isObjectLike.js ***!\n  \\*********************************************/\n/***/ ((module) => {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isSymbol.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/isSymbol.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseGetTag = __webpack_require__(/*! ./_baseGetTag */ \"./node_modules/lodash/_baseGetTag.js\"),\n    isObjectLike = __webpack_require__(/*! ./isObjectLike */ \"./node_modules/lodash/isObjectLike.js\");\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/isTypedArray.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/lodash/isTypedArray.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ \"./node_modules/lodash/_baseIsTypedArray.js\"),\n    baseUnary = __webpack_require__(/*! ./_baseUnary */ \"./node_modules/lodash/_baseUnary.js\"),\n    nodeUtil = __webpack_require__(/*! ./_nodeUtil */ \"./node_modules/lodash/_nodeUtil.js\");\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/keys.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/keys.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ \"./node_modules/lodash/_arrayLikeKeys.js\"),\n    baseKeys = __webpack_require__(/*! ./_baseKeys */ \"./node_modules/lodash/_baseKeys.js\"),\n    isArrayLike = __webpack_require__(/*! ./isArrayLike */ \"./node_modules/lodash/isArrayLike.js\");\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/mapValues.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/mapValues.js ***!\n  \\******************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ \"./node_modules/lodash/_baseAssignValue.js\"),\n    baseForOwn = __webpack_require__(/*! ./_baseForOwn */ \"./node_modules/lodash/_baseForOwn.js\"),\n    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ \"./node_modules/lodash/_baseIteratee.js\");\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n *   'fred':    { 'user': 'fred',    'age': 40 },\n *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n  var result = {};\n  iteratee = baseIteratee(iteratee, 3);\n\n  baseForOwn(object, function(value, key, object) {\n    baseAssignValue(result, key, iteratee(value, key, object));\n  });\n  return result;\n}\n\nmodule.exports = mapValues;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/memoize.js\":\n/*!****************************************!*\\\n  !*** ./node_modules/lodash/memoize.js ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar MapCache = __webpack_require__(/*! ./_MapCache */ \"./node_modules/lodash/_MapCache.js\");\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/noop.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/noop.js ***!\n  \\*************************************/\n/***/ ((module) => {\n\n/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/property.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/property.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseProperty = __webpack_require__(/*! ./_baseProperty */ \"./node_modules/lodash/_baseProperty.js\"),\n    basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ \"./node_modules/lodash/_basePropertyDeep.js\"),\n    isKey = __webpack_require__(/*! ./_isKey */ \"./node_modules/lodash/_isKey.js\"),\n    toKey = __webpack_require__(/*! ./_toKey */ \"./node_modules/lodash/_toKey.js\");\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/stubArray.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/stubArray.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/stubFalse.js\":\n/*!******************************************!*\\\n  !*** ./node_modules/lodash/stubFalse.js ***!\n  \\******************************************/\n/***/ ((module) => {\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/toString.js\":\n/*!*****************************************!*\\\n  !*** ./node_modules/lodash/toString.js ***!\n  \\*****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseToString = __webpack_require__(/*! ./_baseToString */ \"./node_modules/lodash/_baseToString.js\");\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n\n\n/***/ }),\n\n/***/ \"./node_modules/lodash/uniq.js\":\n/*!*************************************!*\\\n  !*** ./node_modules/lodash/uniq.js ***!\n  \\*************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\nvar baseUniq = __webpack_require__(/*! ./_baseUniq */ \"./node_modules/lodash/_baseUniq.js\");\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/comparator.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/semver/classes/comparator.js ***!\n  \\***************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n  static get ANY () {\n    return ANY\n  }\n\n  constructor (comp, options) {\n    options = parseOptions(options)\n\n    if (comp instanceof Comparator) {\n      if (comp.loose === !!options.loose) {\n        return comp\n      } else {\n        comp = comp.value\n      }\n    }\n\n    comp = comp.trim().split(/\\s+/).join(' ')\n    debug('comparator', comp, options)\n    this.options = options\n    this.loose = !!options.loose\n    this.parse(comp)\n\n    if (this.semver === ANY) {\n      this.value = ''\n    } else {\n      this.value = this.operator + this.semver.version\n    }\n\n    debug('comp', this)\n  }\n\n  parse (comp) {\n    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n    const m = comp.match(r)\n\n    if (!m) {\n      throw new TypeError(`Invalid comparator: ${comp}`)\n    }\n\n    this.operator = m[1] !== undefined ? m[1] : ''\n    if (this.operator === '=') {\n      this.operator = ''\n    }\n\n    // if it literally is just '>' or '' then allow anything.\n    if (!m[2]) {\n      this.semver = ANY\n    } else {\n      this.semver = new SemVer(m[2], this.options.loose)\n    }\n  }\n\n  toString () {\n    return this.value\n  }\n\n  test (version) {\n    debug('Comparator.test', version, this.options.loose)\n\n    if (this.semver === ANY || version === ANY) {\n      return true\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    return cmp(version, this.operator, this.semver, this.options)\n  }\n\n  intersects (comp, options) {\n    if (!(comp instanceof Comparator)) {\n      throw new TypeError('a Comparator is required')\n    }\n\n    if (this.operator === '') {\n      if (this.value === '') {\n        return true\n      }\n      return new Range(comp.value, options).test(this.value)\n    } else if (comp.operator === '') {\n      if (comp.value === '') {\n        return true\n      }\n      return new Range(this.value, options).test(comp.semver)\n    }\n\n    options = parseOptions(options)\n\n    // Special cases where nothing can possibly be lower\n    if (options.includePrerelease &&\n      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n      return false\n    }\n    if (!options.includePrerelease &&\n      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n      return false\n    }\n\n    // Same direction increasing (> or >=)\n    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n      return true\n    }\n    // Same direction decreasing (< or <=)\n    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n      return true\n    }\n    // same SemVer and both sides are inclusive (<= or >=)\n    if (\n      (this.semver.version === comp.semver.version) &&\n      this.operator.includes('=') && comp.operator.includes('=')) {\n      return true\n    }\n    // opposite directions less than\n    if (cmp(this.semver, '<', comp.semver, options) &&\n      this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n      return true\n    }\n    // opposite directions greater than\n    if (cmp(this.semver, '>', comp.semver, options) &&\n      this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n      return true\n    }\n    return false\n  }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = __webpack_require__(/*! ../internal/parse-options */ \"./node_modules/semver/internal/parse-options.js\")\nconst { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\nconst cmp = __webpack_require__(/*! ../functions/cmp */ \"./node_modules/semver/functions/cmp.js\")\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst SemVer = __webpack_require__(/*! ./semver */ \"./node_modules/semver/classes/semver.js\")\nconst Range = __webpack_require__(/*! ./range */ \"./node_modules/semver/classes/range.js\")\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/range.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/classes/range.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n  constructor (range, options) {\n    options = parseOptions(options)\n\n    if (range instanceof Range) {\n      if (\n        range.loose === !!options.loose &&\n        range.includePrerelease === !!options.includePrerelease\n      ) {\n        return range\n      } else {\n        return new Range(range.raw, options)\n      }\n    }\n\n    if (range instanceof Comparator) {\n      // just put it in the set and return\n      this.raw = range.value\n      this.set = [[range]]\n      this.formatted = undefined\n      return this\n    }\n\n    this.options = options\n    this.loose = !!options.loose\n    this.includePrerelease = !!options.includePrerelease\n\n    // First reduce all whitespace as much as possible so we do not have to rely\n    // on potentially slow regexes like \\s*. This is then stored and used for\n    // future error messages as well.\n    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n    // First, split on ||\n    this.set = this.raw\n      .split('||')\n      // map the range to a 2d array of comparators\n      .map(r => this.parseRange(r.trim()))\n      // throw out any comparator lists that are empty\n      // this generally means that it was not a valid range, which is allowed\n      // in loose mode, but will still throw if the WHOLE range is invalid.\n      .filter(c => c.length)\n\n    if (!this.set.length) {\n      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n    }\n\n    // if we have any that are not the null set, throw out null sets.\n    if (this.set.length > 1) {\n      // keep the first one, in case they're all null sets\n      const first = this.set[0]\n      this.set = this.set.filter(c => !isNullSet(c[0]))\n      if (this.set.length === 0) {\n        this.set = [first]\n      } else if (this.set.length > 1) {\n        // if we have any that are *, then the range is just *\n        for (const c of this.set) {\n          if (c.length === 1 && isAny(c[0])) {\n            this.set = [c]\n            break\n          }\n        }\n      }\n    }\n\n    this.formatted = undefined\n  }\n\n  get range () {\n    if (this.formatted === undefined) {\n      this.formatted = ''\n      for (let i = 0; i < this.set.length; i++) {\n        if (i > 0) {\n          this.formatted += '||'\n        }\n        const comps = this.set[i]\n        for (let k = 0; k < comps.length; k++) {\n          if (k > 0) {\n            this.formatted += ' '\n          }\n          this.formatted += comps[k].toString().trim()\n        }\n      }\n    }\n    return this.formatted\n  }\n\n  format () {\n    return this.range\n  }\n\n  toString () {\n    return this.range\n  }\n\n  parseRange (range) {\n    // memoize range parsing for performance.\n    // this is a very hot path, and fully deterministic.\n    const memoOpts =\n      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n      (this.options.loose && FLAG_LOOSE)\n    const memoKey = memoOpts + ':' + range\n    const cached = cache.get(memoKey)\n    if (cached) {\n      return cached\n    }\n\n    const loose = this.options.loose\n    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n    debug('hyphen replace', range)\n\n    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n    debug('comparator trim', range)\n\n    // `~ 1.2.3` => `~1.2.3`\n    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n    debug('tilde trim', range)\n\n    // `^ 1.2.3` => `^1.2.3`\n    range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n    debug('caret trim', range)\n\n    // At this point, the range is completely trimmed and\n    // ready to be split into comparators.\n\n    let rangeList = range\n      .split(' ')\n      .map(comp => parseComparator(comp, this.options))\n      .join(' ')\n      .split(/\\s+/)\n      // >=0.0.0 is equivalent to *\n      .map(comp => replaceGTE0(comp, this.options))\n\n    if (loose) {\n      // in loose mode, throw out any that are not valid comparators\n      rangeList = rangeList.filter(comp => {\n        debug('loose invalid filter', comp, this.options)\n        return !!comp.match(re[t.COMPARATORLOOSE])\n      })\n    }\n    debug('range list', rangeList)\n\n    // if any comparators are the null set, then replace with JUST null set\n    // if more than one comparator, remove any * comparators\n    // also, don't include the same comparator more than once\n    const rangeMap = new Map()\n    const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n    for (const comp of comparators) {\n      if (isNullSet(comp)) {\n        return [comp]\n      }\n      rangeMap.set(comp.value, comp)\n    }\n    if (rangeMap.size > 1 && rangeMap.has('')) {\n      rangeMap.delete('')\n    }\n\n    const result = [...rangeMap.values()]\n    cache.set(memoKey, result)\n    return result\n  }\n\n  intersects (range, options) {\n    if (!(range instanceof Range)) {\n      throw new TypeError('a Range is required')\n    }\n\n    return this.set.some((thisComparators) => {\n      return (\n        isSatisfiable(thisComparators, options) &&\n        range.set.some((rangeComparators) => {\n          return (\n            isSatisfiable(rangeComparators, options) &&\n            thisComparators.every((thisComparator) => {\n              return rangeComparators.every((rangeComparator) => {\n                return thisComparator.intersects(rangeComparator, options)\n              })\n            })\n          )\n        })\n      )\n    })\n  }\n\n  // if ANY of the sets match ALL of its comparators, then pass\n  test (version) {\n    if (!version) {\n      return false\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    for (let i = 0; i < this.set.length; i++) {\n      if (testSet(this.set[i], version, this.options)) {\n        return true\n      }\n    }\n    return false\n  }\n}\n\nmodule.exports = Range\n\nconst LRU = __webpack_require__(/*! ../internal/lrucache */ \"./node_modules/semver/internal/lrucache.js\")\nconst cache = new LRU()\n\nconst parseOptions = __webpack_require__(/*! ../internal/parse-options */ \"./node_modules/semver/internal/parse-options.js\")\nconst Comparator = __webpack_require__(/*! ./comparator */ \"./node_modules/semver/classes/comparator.js\")\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst SemVer = __webpack_require__(/*! ./semver */ \"./node_modules/semver/classes/semver.js\")\nconst {\n  safeRe: re,\n  t,\n  comparatorTrimReplace,\n  tildeTrimReplace,\n  caretTrimReplace,\n} = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = __webpack_require__(/*! ../internal/constants */ \"./node_modules/semver/internal/constants.js\")\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n  let result = true\n  const remainingComparators = comparators.slice()\n  let testComparator = remainingComparators.pop()\n\n  while (result && remainingComparators.length) {\n    result = remainingComparators.every((otherComparator) => {\n      return testComparator.intersects(otherComparator, options)\n    })\n\n    testComparator = remainingComparators.pop()\n  }\n\n  return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n  debug('comp', comp, options)\n  comp = replaceCarets(comp, options)\n  debug('caret', comp)\n  comp = replaceTildes(comp, options)\n  debug('tildes', comp)\n  comp = replaceXRanges(comp, options)\n  debug('xrange', comp)\n  comp = replaceStars(comp, options)\n  debug('stars', comp)\n  return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n  return comp\n    .trim()\n    .split(/\\s+/)\n    .map((c) => replaceTilde(c, options))\n    .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('tilde', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      // ~1.2 == >=1.2.0 <1.3.0-0\n      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n    } else if (pr) {\n      debug('replaceTilde pr', pr)\n      ret = `>=${M}.${m}.${p}-${pr\n      } <${M}.${+m + 1}.0-0`\n    } else {\n      // ~1.2.3 == >=1.2.3 <1.3.0-0\n      ret = `>=${M}.${m}.${p\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('tilde return', ret)\n    return ret\n  })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n  return comp\n    .trim()\n    .split(/\\s+/)\n    .map((c) => replaceCaret(c, options))\n    .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n  debug('caret', comp, options)\n  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n  const z = options.includePrerelease ? '-0' : ''\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('caret', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      if (M === '0') {\n        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n      } else {\n        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n      }\n    } else if (pr) {\n      debug('replaceCaret pr', pr)\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p}-${pr\n        } <${+M + 1}.0.0-0`\n      }\n    } else {\n      debug('no pr')\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p\n        } <${+M + 1}.0.0-0`\n      }\n    }\n\n    debug('caret return', ret)\n    return ret\n  })\n}\n\nconst replaceXRanges = (comp, options) => {\n  debug('replaceXRanges', comp, options)\n  return comp\n    .split(/\\s+/)\n    .map((c) => replaceXRange(c, options))\n    .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n  comp = comp.trim()\n  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n    debug('xRange', comp, ret, gtlt, M, m, p, pr)\n    const xM = isX(M)\n    const xm = xM || isX(m)\n    const xp = xm || isX(p)\n    const anyX = xp\n\n    if (gtlt === '=' && anyX) {\n      gtlt = ''\n    }\n\n    // if we're including prereleases in the match, then we need\n    // to fix this to -0, the lowest possible prerelease value\n    pr = options.includePrerelease ? '-0' : ''\n\n    if (xM) {\n      if (gtlt === '>' || gtlt === '<') {\n        // nothing is allowed\n        ret = '<0.0.0-0'\n      } else {\n        // nothing is forbidden\n        ret = '*'\n      }\n    } else if (gtlt && anyX) {\n      // we know patch is an x, because we have any x at all.\n      // replace X with 0\n      if (xm) {\n        m = 0\n      }\n      p = 0\n\n      if (gtlt === '>') {\n        // >1 => >=2.0.0\n        // >1.2 => >=1.3.0\n        gtlt = '>='\n        if (xm) {\n          M = +M + 1\n          m = 0\n          p = 0\n        } else {\n          m = +m + 1\n          p = 0\n        }\n      } else if (gtlt === '<=') {\n        // <=0.7.x is actually <0.8.0, since any 0.7.x should\n        // pass.  Similarly, <=7.x is actually <8.0.0, etc.\n        gtlt = '<'\n        if (xm) {\n          M = +M + 1\n        } else {\n          m = +m + 1\n        }\n      }\n\n      if (gtlt === '<') {\n        pr = '-0'\n      }\n\n      ret = `${gtlt + M}.${m}.${p}${pr}`\n    } else if (xm) {\n      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n    } else if (xp) {\n      ret = `>=${M}.${m}.0${pr\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('xRange return', ret)\n\n    return ret\n  })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n  debug('replaceStars', comp, options)\n  // Looseness is ignored here.  star is always as loose as it gets!\n  return comp\n    .trim()\n    .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n  debug('replaceGTE0', comp, options)\n  return comp\n    .trim()\n    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n  from, fM, fm, fp, fpr, fb,\n  to, tM, tm, tp, tpr) => {\n  if (isX(fM)) {\n    from = ''\n  } else if (isX(fm)) {\n    from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n  } else if (isX(fp)) {\n    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n  } else if (fpr) {\n    from = `>=${from}`\n  } else {\n    from = `>=${from}${incPr ? '-0' : ''}`\n  }\n\n  if (isX(tM)) {\n    to = ''\n  } else if (isX(tm)) {\n    to = `<${+tM + 1}.0.0-0`\n  } else if (isX(tp)) {\n    to = `<${tM}.${+tm + 1}.0-0`\n  } else if (tpr) {\n    to = `<=${tM}.${tm}.${tp}-${tpr}`\n  } else if (incPr) {\n    to = `<${tM}.${tm}.${+tp + 1}-0`\n  } else {\n    to = `<=${to}`\n  }\n\n  return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n  for (let i = 0; i < set.length; i++) {\n    if (!set[i].test(version)) {\n      return false\n    }\n  }\n\n  if (version.prerelease.length && !options.includePrerelease) {\n    // Find the set of versions that are allowed to have prereleases\n    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n    // That should allow `1.2.3-pr.2` to pass.\n    // However, `1.2.4-alpha.notready` should NOT be allowed,\n    // even though it's within the range set by the comparators.\n    for (let i = 0; i < set.length; i++) {\n      debug(set[i].semver)\n      if (set[i].semver === Comparator.ANY) {\n        continue\n      }\n\n      if (set[i].semver.prerelease.length > 0) {\n        const allowed = set[i].semver\n        if (allowed.major === version.major &&\n            allowed.minor === version.minor &&\n            allowed.patch === version.patch) {\n          return true\n        }\n      }\n    }\n\n    // Version has a -pre, but it's not one of the ones we like.\n    return false\n  }\n\n  return true\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/classes/semver.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/semver/classes/semver.js ***!\n  \\***********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst debug = __webpack_require__(/*! ../internal/debug */ \"./node_modules/semver/internal/debug.js\")\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(/*! ../internal/constants */ \"./node_modules/semver/internal/constants.js\")\nconst { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\n\nconst parseOptions = __webpack_require__(/*! ../internal/parse-options */ \"./node_modules/semver/internal/parse-options.js\")\nconst { compareIdentifiers } = __webpack_require__(/*! ../internal/identifiers */ \"./node_modules/semver/internal/identifiers.js\")\nclass SemVer {\n  constructor (version, options) {\n    options = parseOptions(options)\n\n    if (version instanceof SemVer) {\n      if (version.loose === !!options.loose &&\n        version.includePrerelease === !!options.includePrerelease) {\n        return version\n      } else {\n        version = version.version\n      }\n    } else if (typeof version !== 'string') {\n      throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n    }\n\n    if (version.length > MAX_LENGTH) {\n      throw new TypeError(\n        `version is longer than ${MAX_LENGTH} characters`\n      )\n    }\n\n    debug('SemVer', version, options)\n    this.options = options\n    this.loose = !!options.loose\n    // this isn't actually relevant for versions, but keep it so that we\n    // don't run into trouble passing this.options around.\n    this.includePrerelease = !!options.includePrerelease\n\n    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n    if (!m) {\n      throw new TypeError(`Invalid Version: ${version}`)\n    }\n\n    this.raw = version\n\n    // these are actually numbers\n    this.major = +m[1]\n    this.minor = +m[2]\n    this.patch = +m[3]\n\n    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n      throw new TypeError('Invalid major version')\n    }\n\n    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n      throw new TypeError('Invalid minor version')\n    }\n\n    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n      throw new TypeError('Invalid patch version')\n    }\n\n    // numberify any prerelease numeric ids\n    if (!m[4]) {\n      this.prerelease = []\n    } else {\n      this.prerelease = m[4].split('.').map((id) => {\n        if (/^[0-9]+$/.test(id)) {\n          const num = +id\n          if (num >= 0 && num < MAX_SAFE_INTEGER) {\n            return num\n          }\n        }\n        return id\n      })\n    }\n\n    this.build = m[5] ? m[5].split('.') : []\n    this.format()\n  }\n\n  format () {\n    this.version = `${this.major}.${this.minor}.${this.patch}`\n    if (this.prerelease.length) {\n      this.version += `-${this.prerelease.join('.')}`\n    }\n    return this.version\n  }\n\n  toString () {\n    return this.version\n  }\n\n  compare (other) {\n    debug('SemVer.compare', this.version, this.options, other)\n    if (!(other instanceof SemVer)) {\n      if (typeof other === 'string' && other === this.version) {\n        return 0\n      }\n      other = new SemVer(other, this.options)\n    }\n\n    if (other.version === this.version) {\n      return 0\n    }\n\n    return this.compareMain(other) || this.comparePre(other)\n  }\n\n  compareMain (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    return (\n      compareIdentifiers(this.major, other.major) ||\n      compareIdentifiers(this.minor, other.minor) ||\n      compareIdentifiers(this.patch, other.patch)\n    )\n  }\n\n  comparePre (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    // NOT having a prerelease is > having one\n    if (this.prerelease.length && !other.prerelease.length) {\n      return -1\n    } else if (!this.prerelease.length && other.prerelease.length) {\n      return 1\n    } else if (!this.prerelease.length && !other.prerelease.length) {\n      return 0\n    }\n\n    let i = 0\n    do {\n      const a = this.prerelease[i]\n      const b = other.prerelease[i]\n      debug('prerelease compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  compareBuild (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    let i = 0\n    do {\n      const a = this.build[i]\n      const b = other.build[i]\n      debug('build compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  // preminor will bump the version up to the next minor release, and immediately\n  // down to pre-release. premajor and prepatch work the same way.\n  inc (release, identifier, identifierBase) {\n    if (release.startsWith('pre')) {\n      if (!identifier && identifierBase === false) {\n        throw new Error('invalid increment argument: identifier is empty')\n      }\n      // Avoid an invalid semver results\n      if (identifier) {\n        const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n        if (!match || match[1] !== identifier) {\n          throw new Error(`invalid identifier: ${identifier}`)\n        }\n      }\n    }\n\n    switch (release) {\n      case 'premajor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor = 0\n        this.major++\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'preminor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor++\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'prepatch':\n        // If this is already a prerelease, it will bump to the next version\n        // drop any prereleases that might already exist, since they are not\n        // relevant at this point.\n        this.prerelease.length = 0\n        this.inc('patch', identifier, identifierBase)\n        this.inc('pre', identifier, identifierBase)\n        break\n      // If the input is a non-prerelease version, this acts the same as\n      // prepatch.\n      case 'prerelease':\n        if (this.prerelease.length === 0) {\n          this.inc('patch', identifier, identifierBase)\n        }\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'release':\n        if (this.prerelease.length === 0) {\n          throw new Error(`version ${this.raw} is not a prerelease`)\n        }\n        this.prerelease.length = 0\n        break\n\n      case 'major':\n        // If this is a pre-major version, bump up to the same major version.\n        // Otherwise increment major.\n        // 1.0.0-5 bumps to 1.0.0\n        // 1.1.0 bumps to 2.0.0\n        if (\n          this.minor !== 0 ||\n          this.patch !== 0 ||\n          this.prerelease.length === 0\n        ) {\n          this.major++\n        }\n        this.minor = 0\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'minor':\n        // If this is a pre-minor version, bump up to the same minor version.\n        // Otherwise increment minor.\n        // 1.2.0-5 bumps to 1.2.0\n        // 1.2.1 bumps to 1.3.0\n        if (this.patch !== 0 || this.prerelease.length === 0) {\n          this.minor++\n        }\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'patch':\n        // If this is not a pre-release version, it will increment the patch.\n        // If it is a pre-release it will bump up to the same patch version.\n        // 1.2.0-5 patches to 1.2.0\n        // 1.2.0 patches to 1.2.1\n        if (this.prerelease.length === 0) {\n          this.patch++\n        }\n        this.prerelease = []\n        break\n      // This probably shouldn't be used publicly.\n      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n      case 'pre': {\n        const base = Number(identifierBase) ? 1 : 0\n\n        if (this.prerelease.length === 0) {\n          this.prerelease = [base]\n        } else {\n          let i = this.prerelease.length\n          while (--i >= 0) {\n            if (typeof this.prerelease[i] === 'number') {\n              this.prerelease[i]++\n              i = -2\n            }\n          }\n          if (i === -1) {\n            // didn't increment anything\n            if (identifier === this.prerelease.join('.') && identifierBase === false) {\n              throw new Error('invalid increment argument: identifier already exists')\n            }\n            this.prerelease.push(base)\n          }\n        }\n        if (identifier) {\n          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n          let prerelease = [identifier, base]\n          if (identifierBase === false) {\n            prerelease = [identifier]\n          }\n          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n            if (isNaN(this.prerelease[1])) {\n              this.prerelease = prerelease\n            }\n          } else {\n            this.prerelease = prerelease\n          }\n        }\n        break\n      }\n      default:\n        throw new Error(`invalid increment argument: ${release}`)\n    }\n    this.raw = this.format()\n    if (this.build.length) {\n      this.raw += `+${this.build.join('.')}`\n    }\n    return this\n  }\n}\n\nmodule.exports = SemVer\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/cmp.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/cmp.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst eq = __webpack_require__(/*! ./eq */ \"./node_modules/semver/functions/eq.js\")\nconst neq = __webpack_require__(/*! ./neq */ \"./node_modules/semver/functions/neq.js\")\nconst gt = __webpack_require__(/*! ./gt */ \"./node_modules/semver/functions/gt.js\")\nconst gte = __webpack_require__(/*! ./gte */ \"./node_modules/semver/functions/gte.js\")\nconst lt = __webpack_require__(/*! ./lt */ \"./node_modules/semver/functions/lt.js\")\nconst lte = __webpack_require__(/*! ./lte */ \"./node_modules/semver/functions/lte.js\")\n\nconst cmp = (a, op, b, loose) => {\n  switch (op) {\n    case '===':\n      if (typeof a === 'object') {\n        a = a.version\n      }\n      if (typeof b === 'object') {\n        b = b.version\n      }\n      return a === b\n\n    case '!==':\n      if (typeof a === 'object') {\n        a = a.version\n      }\n      if (typeof b === 'object') {\n        b = b.version\n      }\n      return a !== b\n\n    case '':\n    case '=':\n    case '==':\n      return eq(a, b, loose)\n\n    case '!=':\n      return neq(a, b, loose)\n\n    case '>':\n      return gt(a, b, loose)\n\n    case '>=':\n      return gte(a, b, loose)\n\n    case '<':\n      return lt(a, b, loose)\n\n    case '<=':\n      return lte(a, b, loose)\n\n    default:\n      throw new TypeError(`Invalid operator: ${op}`)\n  }\n}\nmodule.exports = cmp\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/coerce.js\":\n/*!*************************************************!*\\\n  !*** ./node_modules/semver/functions/coerce.js ***!\n  \\*************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\nconst parse = __webpack_require__(/*! ./parse */ \"./node_modules/semver/functions/parse.js\")\nconst { safeRe: re, t } = __webpack_require__(/*! ../internal/re */ \"./node_modules/semver/internal/re.js\")\n\nconst coerce = (version, options) => {\n  if (version instanceof SemVer) {\n    return version\n  }\n\n  if (typeof version === 'number') {\n    version = String(version)\n  }\n\n  if (typeof version !== 'string') {\n    return null\n  }\n\n  options = options || {}\n\n  let match = null\n  if (!options.rtl) {\n    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n  } else {\n    // Find the right-most coercible string that does not share\n    // a terminus with a more left-ward coercible string.\n    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n    //\n    // Walk through the string checking with a /g regexp\n    // Manually set the index so as to pick up overlapping matches.\n    // Stop when we get a match that ends at the string end, since no\n    // coercible string can be more right-ward without the same terminus.\n    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n    let next\n    while ((next = coerceRtlRegex.exec(version)) &&\n        (!match || match.index + match[0].length !== version.length)\n    ) {\n      if (!match ||\n            next.index + next[0].length !== match.index + match[0].length) {\n        match = next\n      }\n      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n    }\n    // leave it in a clean state\n    coerceRtlRegex.lastIndex = -1\n  }\n\n  if (match === null) {\n    return null\n  }\n\n  const major = match[2]\n  const minor = match[3] || '0'\n  const patch = match[4] || '0'\n  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n  const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/compare.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/semver/functions/compare.js ***!\n  \\**************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\nconst compare = (a, b, loose) =>\n  new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/eq.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/eq.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/gt.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/gt.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/gte.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/gte.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/lt.js\":\n/*!*********************************************!*\\\n  !*** ./node_modules/semver/functions/lt.js ***!\n  \\*********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/lte.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/lte.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/neq.js\":\n/*!**********************************************!*\\\n  !*** ./node_modules/semver/functions/neq.js ***!\n  \\**********************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst compare = __webpack_require__(/*! ./compare */ \"./node_modules/semver/functions/compare.js\")\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/parse.js\":\n/*!************************************************!*\\\n  !*** ./node_modules/semver/functions/parse.js ***!\n  \\************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst SemVer = __webpack_require__(/*! ../classes/semver */ \"./node_modules/semver/classes/semver.js\")\nconst parse = (version, options, throwErrors = false) => {\n  if (version instanceof SemVer) {\n    return version\n  }\n  try {\n    return new SemVer(version, options)\n  } catch (er) {\n    if (!throwErrors) {\n      return null\n    }\n    throw er\n  }\n}\n\nmodule.exports = parse\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/functions/satisfies.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/semver/functions/satisfies.js ***!\n  \\****************************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst Range = __webpack_require__(/*! ../classes/range */ \"./node_modules/semver/classes/range.js\")\nconst satisfies = (version, range, options) => {\n  try {\n    range = new Range(range, options)\n  } catch (er) {\n    return false\n  }\n  return range.test(version)\n}\nmodule.exports = satisfies\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/constants.js\":\n/*!***************************************************!*\\\n  !*** ./node_modules/semver/internal/constants.js ***!\n  \\***************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n  'major',\n  'premajor',\n  'minor',\n  'preminor',\n  'patch',\n  'prepatch',\n  'prerelease',\n]\n\nmodule.exports = {\n  MAX_LENGTH,\n  MAX_SAFE_COMPONENT_LENGTH,\n  MAX_SAFE_BUILD_LENGTH,\n  MAX_SAFE_INTEGER,\n  RELEASE_TYPES,\n  SEMVER_SPEC_VERSION,\n  FLAG_INCLUDE_PRERELEASE: 0b001,\n  FLAG_LOOSE: 0b010,\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/debug.js\":\n/*!***********************************************!*\\\n  !*** ./node_modules/semver/internal/debug.js ***!\n  \\***********************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nconst debug = (\n  typeof process === 'object' &&\n  process.env &&\n  process.env.NODE_DEBUG &&\n  /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n  : () => {}\n\nmodule.exports = debug\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/identifiers.js\":\n/*!*****************************************************!*\\\n  !*** ./node_modules/semver/internal/identifiers.js ***!\n  \\*****************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n  const anum = numeric.test(a)\n  const bnum = numeric.test(b)\n\n  if (anum && bnum) {\n    a = +a\n    b = +b\n  }\n\n  return a === b ? 0\n    : (anum && !bnum) ? -1\n    : (bnum && !anum) ? 1\n    : a < b ? -1\n    : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n  compareIdentifiers,\n  rcompareIdentifiers,\n}\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/lrucache.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/semver/internal/lrucache.js ***!\n  \\**************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\nclass LRUCache {\n  constructor () {\n    this.max = 1000\n    this.map = new Map()\n  }\n\n  get (key) {\n    const value = this.map.get(key)\n    if (value === undefined) {\n      return undefined\n    } else {\n      // Remove the key from the map and add it to the end\n      this.map.delete(key)\n      this.map.set(key, value)\n      return value\n    }\n  }\n\n  delete (key) {\n    return this.map.delete(key)\n  }\n\n  set (key, value) {\n    const deleted = this.delete(key)\n\n    if (!deleted && value !== undefined) {\n      // If cache is full, delete the least recently used item\n      if (this.map.size >= this.max) {\n        const firstKey = this.map.keys().next().value\n        this.delete(firstKey)\n      }\n\n      this.map.set(key, value)\n    }\n\n    return this\n  }\n}\n\nmodule.exports = LRUCache\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/parse-options.js\":\n/*!*******************************************************!*\\\n  !*** ./node_modules/semver/internal/parse-options.js ***!\n  \\*******************************************************/\n/***/ ((module) => {\n\n\"use strict\";\n\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n  if (!options) {\n    return emptyOpts\n  }\n\n  if (typeof options !== 'object') {\n    return looseOption\n  }\n\n  return options\n}\nmodule.exports = parseOptions\n\n\n/***/ }),\n\n/***/ \"./node_modules/semver/internal/re.js\":\n/*!********************************************!*\\\n  !*** ./node_modules/semver/internal/re.js ***!\n  \\********************************************/\n/***/ ((module, exports, __webpack_require__) => {\n\n\"use strict\";\n\n\nconst {\n  MAX_SAFE_COMPONENT_LENGTH,\n  MAX_SAFE_BUILD_LENGTH,\n  MAX_LENGTH,\n} = __webpack_require__(/*! ./constants */ \"./node_modules/semver/internal/constants.js\")\nconst debug = __webpack_require__(/*! ./debug */ \"./node_modules/semver/internal/debug.js\")\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n  ['\\\\s', 1],\n  ['\\\\d', MAX_LENGTH],\n  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n  for (const [token, max] of safeRegexReplacements) {\n    value = value\n      .split(`${token}*`).join(`${token}{0,${max}}`)\n      .split(`${token}+`).join(`${token}{1,${max}}`)\n  }\n  return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n  const safe = makeSafeRegex(value)\n  const index = R++\n  debug(name, index, value)\n  t[name] = index\n  src[index] = value\n  safeSrc[index] = safe\n  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups.  The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:${src[t.PRERELEASE]})?${\n                     src[t.BUILD]}?` +\n                   `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:${src[t.PRERELEASELOOSE]})?${\n                          src[t.BUILD]}?` +\n                        `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n              '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n              `(?:${src[t.PRERELEASE]})?` +\n              `(?:${src[t.BUILD]})?` +\n              `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s+-\\\\s+` +\n                   `(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s+-\\\\s+` +\n                        `(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n\n\n/***/ }),\n\n/***/ \"./package.json\":\n/*!**********************!*\\\n  !*** ./package.json ***!\n  \\**********************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = /*#__PURE__*/JSON.parse('{\"name\":\"geckolib\",\"version\":\"4.2.5\",\"private\":true,\"description\":\"GeckoLib Models & Animations\",\"main\":\"index.js\",\"scripts\":{\"prebuild\":\"npm run test\",\"build\":\"npm run build:only\",\"build:only\":\"webpack && npm run update_manifest\",\"update_manifest\":\"node scripts/updateManifest.mjs\",\"start\":\"webpack --watch --mode=development\",\"lint\":\"eslint .\",\"lint:fix\":\"eslint --fix .\",\"tsc\":\"tsc --noEmit\",\"pretest\":\"npm run lint && npm run tsc\",\"test\":\"npm run test:only\",\"test:only\":\"jest\"},\"author\":\"Eliot Lash, Tslat, Gecko, McHorse, matmat37000\",\"license\":\"MIT\",\"pluginOptions\":{\"title\":\"GeckoLib Models & Animations\",\"description\":\"Create animated blocks, items, entities, and armor for the GeckoLib java mod library.\",\"icon\":\"icon.png\",\"tags\":[\"Minecraft: Java Edition\"],\"variant\":\"both\",\"min_version\":\"5.0.0\",\"max_version\":\"6.0.0\",\"await_loading\":true,\"has_changelog\":true,\"website\":\"https://github.com/bernie-g/geckolib/wiki\",\"repository\":\"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/geckolib\",\"bug_tracker\":\"https://github.com/bernie-g/geckolib/issues\"},\"sideEffects\":[\"./index.js\"],\"devDependencies\":{\"@types/jest\":\"^30.0.0\",\"@types/lodash\":\"^4.17.20\",\"@typescript-eslint/eslint-plugin\":\"^8.41.0\",\"@typescript-eslint/parser\":\"^8.41.0\",\"blockbench-types\":\"^5.0.6\",\"css-loader\":\"^7.1.2\",\"eol\":\"0.10.0\",\"eslint\":\"^9.34.0\",\"indent-string\":\"^5.0.0\",\"jest\":\"^30.1.1\",\"to-string-loader\":\"^1.2.0\",\"ts-jest\":\"^29.4.1\",\"ts-loader\":\"^9.5.4\",\"typescript\":\"^5.9.2\",\"webpack\":\"^5.101.3\",\"webpack-cli\":\"^6.0.1\"},\"dependencies\":{\"lodash\":\"^4.17.21\",\"semver\":\"7.7.2\"}}');\n\n/***/ }),\n\n/***/ \"./resources/armorTemplate.json\":\n/*!**************************************!*\\\n  !*** ./resources/armorTemplate.json ***!\n  \\**************************************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = /*#__PURE__*/JSON.parse('{\"meta\":{\"format_version\":\"3.2\",\"model_format\":\"geckolib_model\",\"box_uv\":true},\"name\":\"CustomArmor\",\"geo_name\":\"CustomArmor\",\"resolution\":{\"width\":64,\"height\":64},\"elements\":[{\"name\":\"dontTouch\",\"from\":[-4,24,-4],\"to\":[4,32,4],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,0,0],\"uuid\":\"9675593e-b27d-b70e-e1ea-1fc29f46a294\"},{\"name\":\"dontTouch\",\"from\":[-4,12,-2],\"to\":[4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[0,24,0],\"uuid\":\"fa43156a-2a62-948c-082f-483d525f6d1f\"},{\"name\":\"dontTouch\",\"from\":[4,12,-2],\"to\":[8,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"},{\"name\":\"dontTouch\",\"from\":[-8,12,-2],\"to\":[-4,24,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"bf2c2539-20e3-cfcc-94c0-491734019889\"},{\"name\":\"dontTouch\",\"from\":[-4,0,-2],\"to\":[0,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"17b9bae0-356a-9bba-fad9-4672e2671191\"},{\"name\":\"dontTouch\",\"from\":[0,0,-2],\"to\":[4,12,2],\"autouv\":1,\"color\":0,\"export\":false,\"locked\":true,\"origin\":[4,22,0],\"uuid\":\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"}],\"outliner\":[{\"name\":\"bipedHead\",\"uuid\":\"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"9675593e-b27d-b70e-e1ea-1fc29f46a294\",{\"name\":\"armorHead\",\"uuid\":\"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedBody\",\"uuid\":\"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[\"fa43156a-2a62-948c-082f-483d525f6d1f\",{\"name\":\"armorBody\",\"uuid\":\"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[0,24,0],\"children\":[]}]},{\"name\":\"bipedRightArm\",\"uuid\":\"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[\"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",{\"name\":\"armorRightArm\",\"uuid\":\"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[5,22,0],\"children\":[]}]},{\"name\":\"bipedLeftArm\",\"uuid\":\"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[\"bf2c2539-20e3-cfcc-94c0-491734019889\",{\"name\":\"armorLeftArm\",\"uuid\":\"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-5,22,0],\"children\":[]}]},{\"name\":\"bipedLeftLeg\",\"uuid\":\"37231be7-a8ef-22ca-7fea-40aed58003bb\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[\"17b9bae0-356a-9bba-fad9-4672e2671191\",{\"name\":\"armorLeftLeg\",\"uuid\":\"e4b19746-2d17-1f56-befe-00718165ae50\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]},{\"name\":\"armorLeftBoot\",\"uuid\":\"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[-2,12,0],\"children\":[]}]},{\"name\":\"bipedRightLeg\",\"uuid\":\"45c031a5-b6be-e0a7-5454-b45d07f28429\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[\"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",{\"name\":\"armorRightLeg\",\"uuid\":\"60238f18-e74b-c863-cb45-2e2f162221bd\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]},{\"name\":\"armorRightBoot\",\"uuid\":\"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\"export\":true,\"isOpen\":true,\"visibility\":true,\"autouv\":0,\"origin\":[2,12,0],\"children\":[]}]}],\"textures\":[]}');\n\n/***/ }),\n\n/***/ \"./resources/easing_keyframes.css\":\n/*!****************************************!*\\\n  !*** ./resources/easing_keyframes.css ***!\n  \\****************************************/\n/***/ ((module, __unused_webpack_exports, __webpack_require__) => {\n\n\n        var result = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./easing_keyframes.css */ \"./node_modules/css-loader/dist/cjs.js!./resources/easing_keyframes.css\");\n\n        if (result && result.__esModule) {\n            result = result.default;\n        }\n\n        if (typeof result === \"string\") {\n            module.exports = result;\n        } else {\n            module.exports = result.toString();\n        }\n    \n\n/***/ }),\n\n/***/ \"./ts/animationUi.ts\":\n/*!***************************!*\\\n  !*** ./ts/animationUi.ts ***!\n  \\***************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   displayAnimationFrameCallback: () => (/* binding */ displayAnimationFrameCallback),\n/* harmony export */   loadAnimationUI: () => (/* binding */ loadAnimationUI),\n/* harmony export */   renderFrameCallback: () => (/* binding */ renderFrameCallback),\n/* harmony export */   unloadAnimationUI: () => (/* binding */ unloadAnimationUI),\n/* harmony export */   updateKeyframeEasing: () => (/* binding */ updateKeyframeEasing),\n/* harmony export */   updateKeyframeEasingArg: () => (/* binding */ updateKeyframeEasingArg),\n/* harmony export */   updateKeyframeSelectionCallback: () => (/* binding */ updateKeyframeSelectionCallback)\n/* harmony export */ });\n/* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/uniq */ \"./node_modules/lodash/uniq.js\");\n/* harmony import */ var lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_uniq__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./easing */ \"./ts/easing.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\n\n\n\nconst easingRegExp = /^ease(InOut|In|Out)?([\\w]+)$/;\nconst loadAnimationUI = () => {\n    Blockbench.on('display_animation_frame', displayAnimationFrameCallback);\n    Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback);\n    Blockbench.on('render_frame', renderFrameCallback);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, \"updateKeyframeEasing\", updateKeyframeEasing);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_1__.addMonkeypatch)(window, null, \"updateKeyframeEasingArg\", updateKeyframeEasingArg);\n};\nconst unloadAnimationUI = () => {\n    Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback);\n    Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback);\n    Blockbench.removeListener('render_frame', renderFrameCallback);\n};\nconst displayAnimationFrameCallback = ( /*...args*/) => {\n    // const keyframe = $('#keyframe');\n    // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here\n};\nfunction renderFrameCallback() {\n    if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_3__.GECKOLIB_MODEL_ID)\n        return;\n    Timeline.keyframes.forEach((kf) => {\n        if (kf.interpolation != \"linear\" && kf.easing != undefined) {\n            kf.easing = undefined;\n            kf.easingArgs = undefined;\n            window.updateKeyframeSelection();\n        }\n        if (kf.interpolation === \"step\") {\n            kf.interpolation = \"linear\";\n            if (kf.data_points.length == 1)\n                addDataPoint();\n            window.updateKeyframeSelection();\n        }\n        updateKeyframeIcon(kf);\n    });\n    const addPrePostButton = document.querySelector('#keyframe_type_label > div');\n    if (addPrePostButton)\n        addPrePostButton.hidden = true;\n}\nfunction updateKeyframeEasing(value) {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    // var axis = $(obj).attr('axis');\n    // const value = $(obj).val();\n    // console.log('updateKeyframeEasing value:', value, 'obj:', obj); \n    if (value === \"-\")\n        return;\n    Timeline.selected.forEach((kf) => {\n        kf.easing = value;\n        kf.easingArgs = undefined;\n        kf.interpolation = 'linear';\n    });\n    window.updateKeyframeSelection(); // Ensure easingArg display is updated\n    // Animator.preview();\n    Undo.finishEdit('edit keyframe easing');\n}\nfunction updateKeyframeEasingArg(obj) {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    if ($(obj).val() === \"-\")\n        return;\n    // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); \n    Timeline.selected.forEach((kf) => {\n        const value = (0,_easing__WEBPACK_IMPORTED_MODULE_2__.parseEasingArg)(kf, $(obj).val().trim());\n        kf.easingArgs = [value];\n        // obj.value = value;\n    });\n    Undo.finishEdit('edit keyframe easing argument');\n}\nconst updateKeyframeSelectionCallback = ( /*...args*/) => {\n    $('#keyframe_bar_easing').remove();\n    $('#keyframe_bar_easing_type').remove();\n    $('#keyframe_bar_easing_arg1').remove();\n    let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars\n    let channel = false;\n    Timeline.selected.forEach((kf) => {\n        if (channel === false) {\n            channel = kf.channel;\n        }\n        else if (channel !== kf.channel) {\n            multi_channel = true;\n        }\n    });\n    Timeline.keyframes.forEach((kf) => {\n        updateKeyframe(kf);\n    });\n    const getMultiSelectValue = (selector, defaultValue, conflictValue) => {\n        const selectorFunction = typeof selector === 'function'\n            ? selector\n            : x => (x[selector] === undefined ? defaultValue : x[selector]);\n        if (Timeline.selected.length > 1) {\n            const uniqSelected = lodash_uniq__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected.map(selectorFunction));\n            if (uniqSelected.length === 1) {\n                return uniqSelected[0];\n            }\n            else {\n                return conflictValue;\n            }\n        }\n        else {\n            return selectorFunction(Timeline.selected[0]) || defaultValue;\n        }\n    };\n    const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => {\n        // Dear god I miss lodash\n        if (!acc.has(kf.animator))\n            acc.set(kf.animator, {});\n        const animatorChannels = acc.get(kf.animator);\n        if (!animatorChannels[kf.channel])\n            animatorChannels[kf.channel] = [];\n        animatorChannels[kf.channel].push(kf);\n        animatorChannels[kf.channel].sort((a, b) => {\n            if (a.time < b.time)\n                return -1;\n            if (a.time > b.time)\n                return 1;\n            return 0;\n        });\n        return acc;\n    }, new Map());\n    const isFirstInChannel = (kf) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1;\n    if (Timeline.selected.length && Format.id === _constants__WEBPACK_IMPORTED_MODULE_3__.GECKOLIB_MODEL_ID) {\n        if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) {\n            const displayedEasing = getMultiSelectValue('easing', _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_DEFAULT, 'null');\n            const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => {\n                const easingTypeToTypeId = type => {\n                    let finalEasingType = \"In\";\n                    if (type === \"out\") {\n                        finalEasingType = \"Out\";\n                    }\n                    else if (type === \"inout\") {\n                        finalEasingType = \"InOut\";\n                    }\n                    return finalEasingType;\n                };\n                let finalEasing = 'ease';\n                if (inputEasingOrType === \"in\" || inputEasingOrType === \"out\" || inputEasingOrType === \"inout\") {\n                    const finalEasingType = easingTypeToTypeId(inputEasingOrType);\n                    finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1);\n                }\n                else if (inputEasingOrType === \"linear\" || inputEasingOrType == \"step\") {\n                    finalEasing = inputEasingOrType;\n                }\n                else {\n                    const finalEasingType = easingTypeToTypeId(easingType);\n                    finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1);\n                }\n                return finalEasing;\n            };\n            const addEasingTypeIcons = (bar, easingType, title) => {\n                const div = document.createElement(\"div\");\n                div.innerHTML = getIcon(easingType);\n                div.id = \"kf_easing_type_\" + easingType;\n                div.setAttribute(\"style\", \"stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px\");\n                div.setAttribute(\"title\", title);\n                div.onclick = () => {\n                    const selectedEasing = $(\".selected_kf_easing\");\n                    const selectedEasingType = $(\".selected_kf_easing_type\");\n                    const keySelectedEasing = selectedEasing.attr(\"id\").substring(15);\n                    const keySelectedEasingType = selectedEasingType.length <= 0 ? \"in\" : selectedEasingType.attr(\"id\").substring(15);\n                    const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing);\n                    const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType);\n                    if (finalEasing != currentEasing) {\n                        //   console.log(\"Changed from \" + currentEasing + \" to \" + finalEasing);\n                        updateKeyframeEasing(finalEasing);\n                    }\n                };\n                bar.appendChild(div);\n            };\n            const keyframePanel = document.getElementById('panel_keyframe');\n            if (keyframePanel) {\n                let easingBar = document.createElement('div');\n                keyframePanel.appendChild(easingBar);\n                easingBar.outerHTML = `<div class=\"bar flex\" style=\"flex-wrap: wrap\" id=\"keyframe_bar_easing\">\n                <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Easing</label>\n            </div>`;\n                easingBar = document.getElementById('keyframe_bar_easing');\n                addEasingTypeIcons(easingBar, \"linear\", \"Switch to Linear easing\");\n                addEasingTypeIcons(easingBar, \"step\", \"Switch to Step easing\");\n                addEasingTypeIcons(easingBar, \"sine\", \"Switch to Sine easing\");\n                addEasingTypeIcons(easingBar, \"quad\", \"Switch to Quadratic easing\");\n                addEasingTypeIcons(easingBar, \"cubic\", \"Switch to Cubic easing\");\n                addEasingTypeIcons(easingBar, \"quart\", \"Switch to Quartic easing\");\n                addEasingTypeIcons(easingBar, \"quint\", \"Switch to Quntic easing\");\n                addEasingTypeIcons(easingBar, \"expo\", \"Switch to Exponential easing\");\n                addEasingTypeIcons(easingBar, \"circ\", \"Switch to Circle easing\");\n                addEasingTypeIcons(easingBar, \"back\", \"Switch to Back easing\");\n                addEasingTypeIcons(easingBar, \"elastic\", \"Switch to Elastic easing\");\n                addEasingTypeIcons(easingBar, \"bounce\", \"Switch to Bounce easing\");\n                const keyEasing = getEasingInterpolation(displayedEasing);\n                const keyEasingElement = document.getElementById(\"kf_easing_type_\" + keyEasing);\n                keyEasingElement.style.stroke = \"var(--color-accent)\";\n                keyEasingElement.classList.add('selected_kf_easing');\n                if (!(keyEasing === \"linear\" || keyEasing == \"step\")) {\n                    let easingTypeBar = document.createElement('div');\n                    keyframePanel.appendChild(easingTypeBar);\n                    easingTypeBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_type\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Type</label>\n          </div>`;\n                    easingTypeBar = document.getElementById('keyframe_bar_easing_type');\n                    addEasingTypeIcons(easingTypeBar, \"in\", \"Switch to In easing type\");\n                    addEasingTypeIcons(easingTypeBar, \"out\", \"Switch to Out easing type\");\n                    addEasingTypeIcons(easingTypeBar, \"inout\", \"Switch to In/Out easing type\");\n                    const keyEasingType = getEasingType(displayedEasing);\n                    const keyEasingTypeElement = document.getElementById(\"kf_easing_type_\" + keyEasingType);\n                    keyEasingTypeElement.style.stroke = \"var(--color-accent)\";\n                    keyEasingTypeElement.classList.add('selected_kf_easing_type');\n                }\n                if (keyEasing !== \"linear\")\n                    document.getElementById('panel_keyframe').querySelector('div.bb-select').textContent = \"GeckoLib\";\n                const getEasingArgLabel = (kf) => {\n                    switch (kf.easing) {\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBack:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBack:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBack:\n                            return 'Overshoot';\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInElastic:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutElastic:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutElastic:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInBounce:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeOutBounce:\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.easeInOutBounce:\n                            return 'Bounciness';\n                        case _easing__WEBPACK_IMPORTED_MODULE_2__.EASING_OPTIONS.step:\n                            return 'Steps';\n                        default:\n                            return 'N/A';\n                    }\n                };\n                const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null);\n                if (Timeline.selected.every((kf) => (0,_easing__WEBPACK_IMPORTED_MODULE_2__.isArgsEasing)(kf.easing)) && easingArgLabel !== null) {\n                    const argDefault = getMultiSelectValue(_easing__WEBPACK_IMPORTED_MODULE_2__.getEasingArgDefault, null, null);\n                    const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]);\n                    let scaleBar = document.createElement('div');\n                    keyframePanel.appendChild(scaleBar);\n                    scaleBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_arg1\">\n                  <label class=\"tl\" style=\"font-weight: bolder; min-width: 90px;\">${easingArgLabel}</label>\n                  <input type=\"number\" id=\"keyframe_easing_scale\" class=\"dark_bordered code keyframe_input tab_target\" value=\"${displayedValue}\" oninput=\"updateKeyframeEasingArg(this)\" style=\"flex: 1; margin-right: 9px;\">\n                </div>`;\n                    scaleBar = document.getElementById('keyframe_bar_easing_arg1');\n                }\n            }\n        }\n    }\n};\nconst getEasingInterpolation = (name) => {\n    const matches = name.match(easingRegExp);\n    if (matches) {\n        return matches[2].toLowerCase();\n    }\n    return name;\n};\nconst getEasingType = (name) => {\n    const matches = name.match(easingRegExp);\n    if (matches) {\n        return matches[1].toLowerCase();\n    }\n    return \"in\";\n};\nconst updateKeyframe = (kf) => {\n    if (kf.data_points.length != 1 && kf.interpolation !== \"linear\") {\n        removeLastDataPoint();\n    }\n};\nconst updateKeyframeIcon = (kf) => {\n    const element = document.getElementById(kf.uuid);\n    if (element && element.children && kf.easing)\n        element.children[0].className = 'easing-' + kf.easing.split(/\\.?(?=[A-Z])/).join('_').toLowerCase().replace(\"ease_\", \"\");\n};\nconst addDataPoint = () => {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    Timeline.selected.forEach(kf => {\n        if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) {\n            kf.data_points.push(new KeyframeDataPoint(kf));\n            kf.data_points.last().extend(kf.data_points[0]);\n        }\n    });\n    Animator.preview();\n    Undo.finishEdit('Add keyframe data point');\n};\nconst removeLastDataPoint = () => {\n    Undo.initEdit({ keyframes: Timeline.selected });\n    Timeline.selected.forEach(kf => {\n        if (kf.data_points.length >= 2) {\n            kf.data_points.remove(kf.data_points.last());\n        }\n    });\n    Animator.preview();\n    Undo.finishEdit('Remove keyframe data point');\n};\nconst getIcon = (name) => {\n    switch (name) {\n        case \"back\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.94165 c 3.17500003,0 4.23333333,2.91041 5.29166663,-4.7625\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"bounce\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0.26458333,-0.26458 0.52916673,-0.26458 0.79375003,0 0.5291666,-0.52916 0.5291666,-0.52916 1.0583333,0 0.79375,-2.11666 1.5875,-2.11666 2.38125,0 0.2645833,-4.23333 1.0583333,-5.29165 1.0583333,-5.29165\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"circ\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 5.8208333,295.67706 5.8208333,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"cubic\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"elastic\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.67706 c 0.79375003,0 0.79375003,-0.26458 1.32291663,-0.26458 0.5291667,0 0.79375,0.52917 1.3229167,0.52917 0.5291667,0 1.0094474,-1.83865 1.3229167,-0.79375 0.79375,2.64583 1.3229166,1.32292 1.3229166,-3.96874\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"expo\":\n        case \"in\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 4.23333333,0 5.29166663,-1.05833 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"inout\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 5.55625003,0 -0.26458334,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"out\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0,-4.23333 1.05833333,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quad\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.03123 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quart\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.17500003,0 4.23333333,-2.64583 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"quint\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.43958333,0 4.23333333,-1.85208 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"sine\":\n            return '<svg width=\"24\" height=\"24\" viewBox=\"0 0 6.3499999 6.3500002\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 1.32291663,0 4.23333333,-3.43958 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        case \"step\":\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 0,-1.32291 H 1.8520833 v -1.32292 H 3.175 v -1.32292 h 1.3229167 v -1.32291 l 1.3229166,1e-5\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n        default: // linear\n            return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.52916667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    }\n};\n\n\n/***/ }),\n\n/***/ \"./ts/codec.ts\":\n/*!*********************!*\\\n  !*** ./ts/codec.ts ***!\n  \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   buildDisplaySettingsJson: () => (/* binding */ buildDisplaySettingsJson),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   format: () => (/* binding */ format),\n/* harmony export */   openProjectSettingsDialog: () => (/* binding */ openProjectSettingsDialog)\n/* harmony export */ });\n/* harmony import */ var _resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../resources/armorTemplate.json */ \"./resources/armorTemplate.json\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\n\n\nconst codec = Codecs.bedrock;\n// This gets automatically applied by Blockbench, we don't need to do anything with it\nconst format = new ModelFormat(_constants__WEBPACK_IMPORTED_MODULE_2__.GECKOLIB_MODEL_ID, {\n    id: _constants__WEBPACK_IMPORTED_MODULE_2__.GECKOLIB_MODEL_ID,\n    icon: \"view_in_ar\",\n    name: \"GeckoLib Animated Model\",\n    description: \"Animated Model for Java mods using GeckoLib\",\n    category: \"minecraft\",\n    box_uv: true,\n    optional_box_uv: true,\n    single_texture: true,\n    animated_textures: true,\n    bone_rig: true,\n    centered_grid: true,\n    rotate_cubes: true,\n    locators: true,\n    uv_rotation: true,\n    select_texture_for_particles: true,\n    texture_mcmeta: true,\n    animation_files: true,\n    display_mode: false,\n    animation_mode: true,\n    codec: Codecs.project,\n    animation_codec: Codecs.bedrock.format.animation_codec,\n});\n// Override the new project panel to allow customisation\nformat.new = function () {\n    if (newProject(this))\n        return openProjectSettingsDialog();\n};\n/**\n * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item\n */\nfunction openProjectSettingsDialog() {\n    if (Project instanceof ModelProject)\n        return createProjectSettingsDialog(Project, createProjectSettingsForm(Project));\n}\n/**\n * Internal function for determining the placeholder value for the <code>model_identifier</code> form element in dialog windows\n */\nfunction getObjectIdPlaceholder(formResult) {\n    const name = formResult?.['name'];\n    const modelType = formResult?.[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE];\n    if (!name && !modelType)\n        return 'my_entity';\n    const invalidPathChar = new RegExp('[^_\\\\-/.a-z0-9]+', 'g');\n    const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g');\n    if (name)\n        return name.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidPathChar, \"\");\n    switch (_constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[modelType]) {\n        case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY: return 'my_entity';\n        case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.BLOCK: return 'my_block';\n        case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM: return 'my_item';\n        case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ARMOR: return 'my_armor';\n        case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.OBJECT: return 'my_object';\n        default: return 'my_entity';\n    }\n}\n/**\n * Create the Project Settings dialog form for use in both new projects and editing existing ones\n */\nfunction createProjectSettingsForm(Project) {\n    const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } };\n    const properties = ModelProject['properties'];\n    const modelType = properties[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE];\n    if (modelType) {\n        const currentType = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE];\n        form[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = {\n            label: modelType.label,\n            description: modelType[\"description\"],\n            default: _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY.toUpperCase(),\n            value: typeof (currentType) === 'string' ?\n                _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[currentType.toUpperCase()].toUpperCase() :\n                _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ENTITY.toUpperCase(),\n            placeholder: modelType[\"placeholder\"],\n            type: 'select',\n            options: modelType[\"options\"],\n        };\n    }\n    for (const key in properties) {\n        const property = properties[key];\n        if (property.exposed === false || !Condition(property.condition))\n            continue;\n        const entry = form[property.name] = {\n            label: property.label,\n            description: property[\"description\"],\n            value: Project[property.name],\n            placeholder: property[\"placeholder\"],\n            type: property.type\n        };\n        if (property.name === 'name') {\n            entry.label = 'Project Name';\n            entry.placeholder = 'My Project';\n            entry.description = 'The name of the Blockbench project';\n        }\n        else if (property.name === 'model_identifier') {\n            entry.label = 'Object ID';\n            entry.description = 'The registered id of the object this model represents, for exporting purposes';\n            entry.placeholder = getObjectIdPlaceholder();\n        }\n        switch (property.type) {\n            case 'boolean':\n                entry.type = 'checkbox';\n                break;\n            case 'string':\n                entry.type = 'text';\n                break;\n            default:\n                if (property[\"options\"]) {\n                    entry['options'] = property[\"options\"];\n                    entry.type = 'select';\n                }\n                break;\n        }\n    }\n    if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name'])\n        delete form['name'];\n    form['uv_mode'] = {\n        label: 'dialog.project.default_uv_mode',\n        description: 'dialog.project.default_uv_mode.description',\n        type: 'select',\n        condition: Format.optional_box_uv,\n        options: {\n            face_uv: 'dialog.project.uv_mode.face_uv',\n            box_uv: 'dialog.project.uv_mode.box_uv',\n        },\n        value: Project.box_uv ? 'box_uv' : 'face_uv',\n    };\n    form['texture_size'] = {\n        label: 'dialog.project.texture_size',\n        type: 'vector',\n        dimensions: 2,\n        value: [Project.texture_width, Project.texture_height],\n        min: 1\n    };\n    return form;\n}\n/**\n * Create the 'new project' popup dialogue for GeckoLib projects.\n * <p>\n * The contents of this is mostly a copy of <code>project.js</code> \"project_window\" action declaration (Copyright Blockbench)<br>\n * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility\n * @return false if the user clicks <code>cancel</code>, otherwise true\n */\nfunction createProjectSettingsDialog(Project, form) {\n    const dialog = new Dialog({\n        id: 'project',\n        title: 'dialog.project.title',\n        width: 500,\n        form,\n        onConfirm: function (formResult) {\n            let save;\n            const box_uv = formResult['uv_mode'] == 'box_uv';\n            const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity);\n            const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity);\n            if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) {\n                // Adjust UV Mapping if resolution changed\n                if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) {\n                    save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true });\n                    Cube.all.forEach(cube => {\n                        for (const key in cube.faces) {\n                            const uv = cube.faces[key].uv;\n                            uv[0] *= texture_width / Project.texture_width;\n                            uv[2] *= texture_width / Project.texture_width;\n                            uv[1] *= texture_height / Project.texture_height;\n                            uv[3] *= texture_height / Project.texture_height;\n                        }\n                    });\n                    Mesh.all.forEach(mesh => {\n                        for (const key in mesh.faces) {\n                            const uv = mesh.faces[key].uv;\n                            for (const vkey in uv) {\n                                uv[vkey][0] *= texture_width / Project.texture_width;\n                                uv[vkey][1] *= texture_height / Project.texture_height;\n                            }\n                        }\n                    });\n                }\n                // Convert UV mode per element\n                if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) {\n                    if (!save)\n                        save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true });\n                    Cube.all.forEach(cube => cube.setUVMode(box_uv));\n                }\n                if (!save)\n                    save = Undo.initEdit({ uv_mode: true });\n                Project.texture_width = texture_width;\n                Project.texture_height = texture_height;\n                if (Format.optional_box_uv)\n                    Project.box_uv = box_uv;\n                Canvas.updateAllUVs();\n                updateSelection();\n            }\n            const properties = ModelProject['properties'];\n            for (const key in properties) {\n                properties[key].merge(Project, formResult);\n            }\n            Project.name = Project.name.trim();\n            Project.model_identifier = Project.model_identifier.trim();\n            if (save)\n                Undo.finishEdit('Change project UV settings');\n            Blockbench.dispatchEvent('update_project_settings', formResult);\n            BARS.updateConditions();\n            if (Project.EditSession) {\n                const metadata = {\n                    texture_width: Project.texture_width,\n                    texture_height: Project.texture_height,\n                    box_uv: Project.box_uv\n                };\n                for (const key in properties) {\n                    properties[key].copy(Project, metadata);\n                }\n                Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata));\n            }\n            const modelType = _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType[formResult[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]];\n            Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = modelType;\n            if (modelType == _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM)\n                Project.parent = 'builtin/entity';\n            if (Project.name === Format.name || Project.name === '')\n                Project.name = \"GeckoLib \" + Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE];\n            switch (modelType) {\n                case _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ARMOR:\n                    if (Outliner.root.length === 0) {\n                        Codecs.project.parse(_resources_armorTemplate_json__WEBPACK_IMPORTED_MODULE_0__, null);\n                    }\n                    else {\n                        alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.');\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n            }\n            Format.display_mode = modelType === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM || settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_ALWAYS_SHOW_DISPLAY].value;\n            dialog.hide();\n        },\n        onFormChange(formResult) {\n            try {\n                document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult);\n            } // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            catch (ex) { /* empty */ }\n        },\n    });\n    dialog.show();\n    return true;\n}\n/**\n * Export the item display json\n * <p>\n * Only called for GeckoLib projects\n */\nfunction buildDisplaySettingsJson(options = {}) {\n    if (!Project)\n        return;\n    const modelProperties = {};\n    if (options['comment'] || settings.credit.value)\n        modelProperties.credit = settings.credit.value;\n    modelProperties.parent = !Project.parent ? 'builtin/entity' : Project.parent;\n    if (options['ambientocclusion'] || Project.ambientocclusion === false)\n        modelProperties.ambientocclusion = false;\n    if (Project.texture_width !== 16 || Project.texture_height !== 16)\n        modelProperties.texture_size = [Project.texture_width, Project.texture_height];\n    if (options['front_gui_light'] || Project.front_gui_light)\n        modelProperties.gui_light = 'front';\n    if (options['overrides'] || Project.overrides)\n        modelProperties.overrides = Project.overrides;\n    if (options['display'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(Project.display_settings)) {\n        const nonDefaultDisplays = {};\n        for (const slot in DisplayMode.slots) {\n            const perspective = DisplayMode.slots[slot];\n            // eslint-disable-next-line no-prototype-builtins\n            if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) {\n                const display = Project.display_settings[perspective].export();\n                if (display)\n                    nonDefaultDisplays[perspective] = display;\n            }\n        }\n        if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(nonDefaultDisplays))\n            modelProperties.display = nonDefaultDisplays;\n    }\n    if ((options['textures'] || !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isEmpty)(Project.textures)) && Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODID]) {\n        for (const texture of Project.textures) {\n            if (texture.particle || (settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) {\n                let name = texture.name;\n                if (name.indexOf(\".png\") > 0)\n                    name = name.substring(0, name.indexOf(\".png\"));\n                if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isValidPath)(name)) {\n                    name = name.toLowerCase().replace(\" \", \"_\");\n                    if (!(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isValidPath)(name))\n                        continue;\n                }\n                name = (Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] == _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.BLOCK ? \"block/\" : \"item/\") + name;\n                name = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODID] + \":\" + name;\n                modelProperties.textures = { 'particle': name };\n                break;\n            }\n        }\n    }\n    Blockbench.export({\n        resource_id: 'model',\n        type: Codecs.java_block.name,\n        extensions: ['json'],\n        name: Project.model_identifier ? (Project.model_identifier + \".json\") : codec.fileName().replace(\".geo\", \"\"),\n        startpath: Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display,\n        content: JSON.stringify(modelProperties, null, 2),\n    }, file_path => {\n        const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display;\n        Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n        if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].display)\n            Project.saved = false;\n    });\n    return this;\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (codec);\n\n\n/***/ }),\n\n/***/ \"./ts/constants.ts\":\n/*!*************************!*\\\n  !*** ./ts/constants.ts ***!\n  \\*************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BAKE_IN_BEZIER_KEYFRAMES: () => (/* binding */ BAKE_IN_BEZIER_KEYFRAMES),\n/* harmony export */   GECKOLIB_MODEL_ID: () => (/* binding */ GECKOLIB_MODEL_ID),\n/* harmony export */   GeckoModelType: () => (/* binding */ GeckoModelType),\n/* harmony export */   PROPERTY_FILEPATH_CACHE: () => (/* binding */ PROPERTY_FILEPATH_CACHE),\n/* harmony export */   PROPERTY_MODEL_TYPE: () => (/* binding */ PROPERTY_MODEL_TYPE),\n/* harmony export */   PROPERTY_MODID: () => (/* binding */ PROPERTY_MODID),\n/* harmony export */   SETTING_ALWAYS_SHOW_DISPLAY: () => (/* binding */ SETTING_ALWAYS_SHOW_DISPLAY),\n/* harmony export */   SETTING_AUTO_PARTICLE_TEXTURE: () => (/* binding */ SETTING_AUTO_PARTICLE_TEXTURE),\n/* harmony export */   SETTING_DEFAULT_MODID: () => (/* binding */ SETTING_DEFAULT_MODID),\n/* harmony export */   SETTING_REMEMBER_EXPORT_LOCATIONS: () => (/* binding */ SETTING_REMEMBER_EXPORT_LOCATIONS)\n/* harmony export */ });\n/**\n * GeckoLib plugin model format ID. Used to identify model types generated from this plugin\n */\nconst GECKOLIB_MODEL_ID = \"geckolib_model\";\n// Setting name constants\nconst SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture';\nconst SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display';\nconst SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations';\nconst SETTING_DEFAULT_MODID = 'geckolib_default_modid';\nconst BAKE_IN_BEZIER_KEYFRAMES = \"geckolib_bake_in_bezier_keyframes\";\n// Property name constants\nconst PROPERTY_MODID = 'geckolib_modid';\nconst PROPERTY_MODEL_TYPE = 'geckolib_model_type';\nconst PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache';\n/**\n * Available GeckoLib model types\n */\nvar GeckoModelType;\n(function (GeckoModelType) {\n    GeckoModelType[\"ENTITY\"] = \"Entity\";\n    GeckoModelType[\"BLOCK\"] = \"Block\";\n    GeckoModelType[\"ITEM\"] = \"Item\";\n    GeckoModelType[\"ARMOR\"] = \"Armor\";\n    GeckoModelType[\"OBJECT\"] = \"Object\";\n})(GeckoModelType || (GeckoModelType = {}));\n\n\n/***/ }),\n\n/***/ \"./ts/easing.ts\":\n/*!**********************!*\\\n  !*** ./ts/easing.ts ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   EASING_DEFAULT: () => (/* binding */ EASING_DEFAULT),\n/* harmony export */   EASING_OPTIONS: () => (/* binding */ EASING_OPTIONS),\n/* harmony export */   easingFunctions: () => (/* binding */ easingFunctions),\n/* harmony export */   getEasingArgDefault: () => (/* binding */ getEasingArgDefault),\n/* harmony export */   isArgsEasing: () => (/* binding */ isArgsEasing),\n/* harmony export */   parseEasingArg: () => (/* binding */ parseEasingArg),\n/* harmony export */   reverseEasing: () => (/* binding */ reverseEasing)\n/* harmony export */ });\n// The MIT license notice below applies to the function findIntervalBorderIndex\n/* The MIT License (MIT)\n\nCopyright (c) 2015 Boris Chumichev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n *\n * Utilizes bisection method to search an interval to which\n * point belongs to, then returns an index of left or right\n * border of the interval\n *\n * @param {Number} point\n * @param {Array} intervals\n * @param {Boolean} useRightBorder\n * @returns {Number}\n */\nfunction findIntervalBorderIndex(point, intervals, useRightBorder) {\n    //If point is beyond given intervals\n    if (point < intervals[0])\n        return 0;\n    if (point > intervals[intervals.length - 1])\n        return intervals.length - 1;\n    //If point is inside interval\n    //Start searching on a full range of intervals\n    let indexOfNumberToCompare = 0;\n    let leftBorderIndex = 0;\n    let rightBorderIndex = intervals.length - 1;\n    //Reduce searching range till it find an interval point belongs to using binary search\n    while (rightBorderIndex - leftBorderIndex !== 1) {\n        indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2);\n        point >= intervals[indexOfNumberToCompare] ?\n            leftBorderIndex = indexOfNumberToCompare :\n            rightBorderIndex = indexOfNumberToCompare;\n    }\n    return useRightBorder ? rightBorderIndex : leftBorderIndex;\n}\nfunction stepRange(steps, stop = 1) {\n    if (steps < 2)\n        throw new Error(\"steps must be > 2, got:\" + steps);\n    const stepLength = stop / steps;\n    return Array.from({ length: steps }, (_, i) => i * stepLength);\n}\n// The MIT license notice below applies to the Easing class\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 */\nclass Easing {\n    /**\n     * A stepping function, returns 1 for any positive value of `n`.\n     */\n    static step0(n) {\n        return n > 0 ? 1 : 0;\n    }\n    /**\n     * A stepping function, returns 1 if `n` is greater than or equal to 1.\n     */\n    static step1(n) {\n        return n >= 1 ? 1 : 0;\n    }\n    /**\n     * A linear function, `f(t) = t`. Position correlates to elapsed time one to\n     * one.\n     *\n     * http://cubic-bezier.com/#0,0,1,1\n     */\n    static linear(t) {\n        return t;\n    }\n    /**\n     * A simple inertial interaction, similar to an object slowly accelerating to\n     * speed.\n     *\n     * http://cubic-bezier.com/#.42,0,1,1\n     */\n    // static ease(t) {\n    //     if (!ease) {\n    //         ease = Easing.bezier(0.42, 0, 1, 1);\n    //     }\n    //     return ease(t);\n    // }\n    /**\n     * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInQuad\n     */\n    static quad(t) {\n        return t * t;\n    }\n    /**\n     * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInCubic\n     */\n    static cubic(t) {\n        return t * t * t;\n    }\n    /**\n     * A power function. Position is equal to the Nth power of elapsed time.\n     *\n     * n = 4: http://easings.net/#easeInQuart\n     * n = 5: http://easings.net/#easeInQuint\n     */\n    static poly(n) {\n        return (t) => Math.pow(t, n);\n    }\n    /**\n     * A sinusoidal function.\n     *\n     * http://easings.net/#easeInSine\n     */\n    static sin(t) {\n        return 1 - Math.cos((t * Math.PI) / 2);\n    }\n    /**\n     * A circular function.\n     *\n     * http://easings.net/#easeInCirc\n     */\n    static circle(t) {\n        return 1 - Math.sqrt(1 - t * t);\n    }\n    /**\n     * An exponential function.\n     *\n     * http://easings.net/#easeInExpo\n     */\n    static exp(t) {\n        return Math.pow(2, 10 * (t - 1));\n    }\n    /**\n     * A simple elastic interaction, similar to a spring oscillating back and\n     * forth.\n     *\n     * Default bounciness is 1, which overshoots a little bit once. 0 bounciness\n     * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N\n     * times.\n     *\n     * http://easings.net/#easeInElastic\n     */\n    static elastic(bounciness = 1) {\n        const p = bounciness * Math.PI;\n        return (t) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p);\n    }\n    /**\n     * Use with `Animated.parallel()` to create a simple effect where the object\n     * animates back slightly as the animation starts.\n     *\n     * Wolfram Plot:\n     *\n     * - http://tiny.cc/back_default (s = 1.70158, default)\n     */\n    static back(s = 1.70158) {\n        return (t) => t * t * ((s + 1) * t - s);\n    }\n    /**\n     * Provides a simple bouncing effect.\n     *\n     * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up\n     * using min instead of ternaries\n     * http://easings.net/#easeInBounce\n     */\n    static bounce(k = 0.5) {\n        const q = (x) => (121 / 16) * x * x;\n        const w = (x) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k;\n        const r = (x) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k;\n        const t = (x) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k;\n        return (x) => Math.min(q(x), w(x), r(x), t(x));\n    }\n    /**\n     * Provides a cubic bezier curve, equivalent to CSS Transitions'\n     * `transition-timing-function`.\n     *\n     * A useful tool to visualize cubic bezier curves can be found at\n     * http://cubic-bezier.com/\n     */\n    // static bezier(x1, y1, x2, y2) {\n    //     const _bezier = require('./bezier');\n    //     return _bezier(x1, y1, x2, y2);\n    // }\n    /**\n     * Runs an easing function forwards.\n     */\n    static in(easing) {\n        return easing;\n    }\n    /**\n     * Runs an easing function backwards.\n     */\n    static out(easing) {\n        return (t) => 1 - easing(1 - t);\n    }\n    /**\n     * Makes any easing function symmetrical. The easing function will run\n     * forwards for half of the duration, then backwards for the rest of the\n     * duration.\n     */\n    static inOut(easing) {\n        return (t) => {\n            if (t < 0.5) {\n                return easing(t * 2) / 2;\n            }\n            return 1 - easing((1 - t) * 2) / 2;\n        };\n    }\n}\nconst quart = Easing.poly(4);\nconst quint = Easing.poly(5);\nconst back = (direction, scalar, t) => direction(Easing.back(1.70158 * scalar))(t);\nconst elastic = (direction, bounciness, t) => direction(Easing.elastic(bounciness))(t);\nconst bounce = (direction, bounciness, t) => direction(Easing.bounce(bounciness))(t);\nconst easingFunctions = {\n    linear: Easing.linear,\n    step(steps, x) {\n        const intervals = stepRange(steps);\n        return intervals[findIntervalBorderIndex(x, intervals, false)];\n    },\n    easeInQuad: Easing.in(Easing.quad),\n    easeOutQuad: Easing.out(Easing.quad),\n    easeInOutQuad: Easing.inOut(Easing.quad),\n    easeInCubic: Easing.in(Easing.cubic),\n    easeOutCubic: Easing.out(Easing.cubic),\n    easeInOutCubic: Easing.inOut(Easing.cubic),\n    easeInQuart: Easing.in(quart),\n    easeOutQuart: Easing.out(quart),\n    easeInOutQuart: Easing.inOut(quart),\n    easeInQuint: Easing.in(quint),\n    easeOutQuint: Easing.out(quint),\n    easeInOutQuint: Easing.inOut(quint),\n    easeInSine: Easing.in(Easing.sin),\n    easeOutSine: Easing.out(Easing.sin),\n    easeInOutSine: Easing.inOut(Easing.sin),\n    easeInExpo: Easing.in(Easing.exp),\n    easeOutExpo: Easing.out(Easing.exp),\n    easeInOutExpo: Easing.inOut(Easing.exp),\n    easeInCirc: Easing.in(Easing.circle),\n    easeOutCirc: Easing.out(Easing.circle),\n    easeInOutCirc: Easing.inOut(Easing.circle),\n    easeInBack: back.bind(null, Easing.in),\n    easeOutBack: back.bind(null, Easing.out),\n    easeInOutBack: back.bind(null, Easing.inOut),\n    easeInElastic: elastic.bind(null, Easing.in),\n    easeOutElastic: elastic.bind(null, Easing.out),\n    easeInOutElastic: elastic.bind(null, Easing.inOut),\n    easeInBounce: bounce.bind(null, Easing.in),\n    easeOutBounce: bounce.bind(null, Easing.out),\n    easeInOutBounce: bounce.bind(null, Easing.inOut),\n};\n// Object with the same keys as easingFunctions and values of the stringified key names\nconst EASING_OPTIONS = Object.freeze(Object.fromEntries(Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]]))));\nconst EASING_DEFAULT = 'linear';\nconst getEasingArgDefault = (kf) => {\n    switch (kf.easing) {\n        case EASING_OPTIONS.easeInBack:\n        case EASING_OPTIONS.easeOutBack:\n        case EASING_OPTIONS.easeInOutBack:\n        case EASING_OPTIONS.easeInElastic:\n        case EASING_OPTIONS.easeOutElastic:\n        case EASING_OPTIONS.easeInOutElastic:\n            return 1;\n        case EASING_OPTIONS.easeInBounce:\n        case EASING_OPTIONS.easeOutBounce:\n        case EASING_OPTIONS.easeInOutBounce:\n            return 0.5;\n        case EASING_OPTIONS.step:\n            return 5;\n        default:\n            return null;\n    }\n};\nconst parseEasingArg = (kf, value) => {\n    switch (kf.easing) {\n        case EASING_OPTIONS.easeInBack:\n        case EASING_OPTIONS.easeOutBack:\n        case EASING_OPTIONS.easeInOutBack:\n        case EASING_OPTIONS.easeInElastic:\n        case EASING_OPTIONS.easeOutElastic:\n        case EASING_OPTIONS.easeInOutElastic:\n        case EASING_OPTIONS.easeInBounce:\n        case EASING_OPTIONS.easeOutBounce:\n        case EASING_OPTIONS.easeInOutBounce:\n            return parseFloat(value);\n        case EASING_OPTIONS.step:\n            return Math.max(parseInt(value, 10), 2);\n        default:\n            return parseInt(value, 10);\n    }\n};\nfunction reverseEasing(easing) {\n    if (!easing)\n        return easing;\n    if (easing.startsWith(\"easeInOut\"))\n        return easing;\n    if (easing.startsWith(\"easeIn\"))\n        return easing.replace(\"easeIn\", \"easeOut\");\n    if (easing.startsWith(\"easeOut\"))\n        return easing.replace(\"easeOut\", \"easeIn\");\n    return easing;\n}\nconst isArgsEasing = (easing = \"\") => easing.includes(\"Back\") ||\n    easing.includes(\"Elastic\") ||\n    easing.includes(\"Bounce\") ||\n    easing === EASING_OPTIONS.step;\n\n\n/***/ }),\n\n/***/ \"./ts/events.ts\":\n/*!**********************!*\\\n  !*** ./ts/events.ts ***!\n  \\**********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addEventListeners: () => (/* binding */ addEventListeners),\n/* harmony export */   removeEventListeners: () => (/* binding */ removeEventListeners)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keyframe */ \"./ts/keyframe.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n/* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./codec */ \"./ts/codec.ts\");\n\n\n\n\nfunction addEventListeners() {\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('save_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSave));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addEventListener)('convert_format', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectConvert));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Animator, null, \"buildFile\", monkeypatchAnimatorBuildFile);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Codecs.bedrock.format.animation_codec, null, \"loadFile\", monkeypatchAnimatorLoadFile);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(Blockbench, null, \"export\", monkeypatchBlockbenchExport);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.addMonkeypatch)(BarItems, 'project_window', \"click\", monkeypatchProjectWindowClick);\n}\nfunction removeEventListeners() {\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.project, 'parse', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectParse));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeCodecCallback)(Codecs.bedrock, 'compile', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onBedrockCompile));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_mode', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onModeSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('select_project', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onProjectSelect));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeEventListener)('update_project_settings', (0,_utils__WEBPACK_IMPORTED_MODULE_0__.onlyIfGeckoLib)(onSettingsChanged));\n    (0,_utils__WEBPACK_IMPORTED_MODULE_0__.removeMonkeypatches)();\n}\n/**\n * When an existing GeckoLib project is being read from file\n */\nfunction onProjectParse(e) {\n    onSettingsChanged();\n    if (!e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]) {\n        e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)(e.model);\n        Project.saved = false;\n    }\n    // Because the project hasn't had its model properties applied at this stage\n    Format.display_mode = (e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] && e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM) || settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_ALWAYS_SHOW_DISPLAY].value;\n}\n/**\n * When the Blockbench project is being saved\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSave(e) {\n    if (!e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE])\n        e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)(e.model);\n    // Explicitly checked for undefined here because Blockbench attempts a save when removing the plugin\n    if (settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS] && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value)\n        e.model[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE] = {};\n}\n/**\n * When a project is being converted from another format to a GeckoLib model\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectConvert(e) {\n    onSettingsChanged();\n}\n/**\n * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onSettingsChanged() {\n    if (Modes.selected instanceof Mode)\n        Modes.selected.select();\n    if (Project instanceof ModelProject) {\n        if (!Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE]) {\n            Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.determineModelType)();\n            Project.saved = false;\n        }\n        if (Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_2__.GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) {\n            Project.parent = 'builtin/entity';\n            Project.saved = false;\n        }\n    }\n    Format.display_mode = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.shouldShowDisplayPanel)();\n}\n/**\n * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSelect() {\n    onSettingsChanged();\n}\n/**\n * When selecting edit/paint/display/animate/etc\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onModeSelect(e) {\n    // Offset the display emulator to account for GeckoLib's +0.51 manual offset\n    // This is a legacy patch as Blockbench no longer does this internally\n    if (e.mode.id == 'display')\n        Project.model_3d.position.y = 0;\n}\n/**\n * When the model geometry is being compiled for export\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onBedrockCompile(e) {\n    // Remove display transforms from non-bedrock geometry\n    e.model[\"minecraft:geometry\"]?.forEach((geo) => delete geo[\"item_display_transforms\"]);\n    // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established\n    switch (e.model.format_version) {\n        case \"1.14.0\":\n        case \"1.21.0\":\n        case \"1.21.20\":\n            e.model.format_version = \"1.12.0\";\n            break;\n        default:\n            break;\n    }\n}\n/**\n * When the project settings window is being opened, either via a new project or the File -> Project... menu item\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchProjectWindowClick() {\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) {\n        (0,_codec__WEBPACK_IMPORTED_MODULE_3__.openProjectSettingsDialog)();\n    }\n    else {\n        _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(BarItems).click();\n    }\n}\n/**\n * When any file is being exported to disk by Blockbench\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchBlockbenchExport(options, cb) {\n    if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)()) {\n        _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb);\n        return;\n    }\n    if (Project instanceof ModelProject) {\n        if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON\n            const fileName = Project.model_identifier && Project.model_identifier + \".animation\";\n            options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation;\n            const parentCallback = cb;\n            cb = (file_path) => {\n                if (parentCallback)\n                    parentCallback(file_path);\n                const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation;\n                Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n                if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].animation)\n                    Project.saved = false;\n            };\n            if (fileName)\n                options.name = fileName;\n        }\n        else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo\n            const fileName = Project.model_identifier && Project.model_identifier + \".geo\";\n            options.startpath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model;\n            const parentWriter = options.custom_writer;\n            const parentCallback = cb;\n            if (parentWriter) {\n                options.custom_writer = (content, filePath, callback) => {\n                    parentWriter(content, filePath, callback);\n                    callback(filePath);\n                };\n            }\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n                const oldPath = Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model;\n                Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model = settings[_constants__WEBPACK_IMPORTED_MODULE_2__.SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n                if (oldPath !== Project[_constants__WEBPACK_IMPORTED_MODULE_2__.PROPERTY_FILEPATH_CACHE].model)\n                    Project.saved = false;\n            };\n            if (fileName)\n                options.name = fileName;\n        }\n    }\n    _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Blockbench).export(options, cb);\n}\n/**\n * When the animation file is being loaded into the project\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchAnimatorLoadFile(file, exportingAnims) {\n    // eslint-disable-next-line no-undef\n    const json = file.json || autoParseJSON(file.content);\n    const path = file.path;\n    const new_animations = [];\n    function geoLoopToBbLoop(jsonLoop) {\n        if (jsonLoop) {\n            if (typeof jsonLoop === 'boolean')\n                return jsonLoop ? 'loop' : 'once';\n            if (typeof jsonLoop === 'string') {\n                if (jsonLoop === \"hold_on_last_frame\")\n                    return 'hold';\n                if (jsonLoop === \"loop\" || jsonLoop === \"true\")\n                    return 'loop';\n            }\n        }\n        return 'once';\n    }\n    function getKeyframeDataPoints(channel, source) {\n        if (source instanceof Array)\n            return invertAnimKeyframe(channel, [{ x: source[0], y: source[1], z: source[2] }]);\n        if (['number', 'string'].includes(typeof source))\n            return invertAnimKeyframe(channel, [{ x: source, y: source, z: source }]);\n        if (typeof source == 'object') {\n            if (source.vector)\n                return getKeyframeDataPoints(channel, source.vector);\n            const points = [];\n            if (source.pre)\n                points.push(getKeyframeDataPoints(channel, source.pre)[0]);\n            if (source.post)\n                points.push(getKeyframeDataPoints(channel, source.post)[0]);\n            return points;\n        }\n    }\n    // Because Blockbench now implicitly inverts rotation and position keyframes on export and import (??)\n    function invertAnimKeyframe(channel, value) {\n        if (channel != 'position' && channel != 'rotation')\n            return value;\n        if (value instanceof Array) {\n            switch (value.length) {\n                case 1: return [invertAnimKeyframe(channel, value[0])];\n                case 3: return [invertAnimKeyframe(channel, value[0]), channel == 'rotation' ? invertAnimKeyframe(channel, value[1]) : value[1], value[2]];\n                default: return value;\n            }\n        }\n        else if (typeof value == 'object') {\n            if (value.x)\n                value.x = invertMolang(value.x);\n            if (value.y && channel == 'rotation')\n                value.y = invertMolang(value.y);\n            return value;\n        }\n        return invertMolang(value);\n    }\n    if (json && typeof json.animations === 'object') {\n        for (const animName in json.animations) {\n            if (exportingAnims && !exportingAnims.includes(animName))\n                continue;\n            //Animation\n            const animData = json.animations[animName];\n            let animation = new Animation({\n                name: animName,\n                path,\n                loop: geoLoopToBbLoop(animData.loop),\n                override: animData.override_previous_animation,\n                anim_time_update: (typeof animData.anim_time_update == 'string'\n                    ? animData.anim_time_update.replace(/;(?!$)/, ';\\n')\n                    : animData.anim_time_update),\n                blend_weight: (typeof animData.blend_weight == 'string'\n                    ? animData.blend_weight.replace(/;(?!$)/, ';\\n')\n                    : animData.blend_weight),\n                length: animData.animation_length\n            });\n            animation = animation.add();\n            //Bones\n            if (animData.bones) {\n                for (const boneName in animData.bones) {\n                    const bone = animData.bones[boneName];\n                    const lowercase_bone_name = boneName.toLowerCase();\n                    const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name);\n                    const uuid = group ? group.uuid : guid();\n                    const boneAnimator = new _keyframe__WEBPACK_IMPORTED_MODULE_1__.GeckolibBoneAnimator(uuid, animation, boneName);\n                    animation.animators[uuid] = boneAnimator;\n                    //Channels\n                    for (const channel in bone) {\n                        if (Animator.possible_channels[channel]) {\n                            if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel][\"easing\"],\n                                    easingArgs: bone[channel][\"easingArgs\"],\n                                    data_points: getKeyframeDataPoints(channel, bone[channel]),\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object' && bone[channel].post) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing == \"bezier\" ? undefined : bone[channel].easing,\n                                    easingArgs: bone[channel][\"easingArgs\"],\n                                    interpolation: bone[channel].easing == \"bezier\" ? \"bezier\" : bone[channel].lerp_mode,\n                                    data_points: getKeyframeDataPoints(channel, bone[channel]),\n                                    bezier_right_time: bone[channel].right_time,\n                                    bezier_left_time: bone[channel].left_time,\n                                    bezier_left_value: bone[channel].left,\n                                    bezier_right_value: bone[channel].right\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object') {\n                                for (const timestamp in bone[channel]) {\n                                    boneAnimator.addKeyframe({\n                                        time: parseFloat(timestamp),\n                                        channel,\n                                        easing: bone[channel][timestamp].easing == \"bezier\" ? undefined : bone[channel][timestamp].easing,\n                                        easingArgs: bone[channel][timestamp].easingArgs,\n                                        interpolation: bone[channel][timestamp].easing == \"bezier\" ? \"bezier\" : bone[channel][timestamp].lerp_mode,\n                                        data_points: getKeyframeDataPoints(channel, bone[channel][timestamp]),\n                                        bezier_right_time: bone[channel][timestamp].right_time,\n                                        bezier_left_time: bone[channel][timestamp].left_time,\n                                        bezier_left_value: bone[channel][timestamp].left,\n                                        bezier_right_value: bone[channel][timestamp].right\n                                    });\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n            if (animData.sound_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.sound_effects) {\n                    const sounds = animData.sound_effects[timestamp];\n                    animation.animators.effects.addKeyframe({\n                        channel: 'sound',\n                        time: parseFloat(timestamp),\n                        data_points: sounds instanceof Array ? sounds : [sounds]\n                    });\n                }\n            }\n            if (animData.particle_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.particle_effects) {\n                    let particles = animData.particle_effects[timestamp];\n                    if (!(particles instanceof Array))\n                        particles = [particles];\n                    particles.forEach(particle => {\n                        if (particle)\n                            particle.script = particle.pre_effect_script;\n                    });\n                    animation.animators.effects.addKeyframe({\n                        channel: 'particle',\n                        time: parseFloat(timestamp),\n                        data_points: particles\n                    });\n                }\n            }\n            if (animData.timeline) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n                for (const timestamp in animData.timeline) {\n                    const entry = animData.timeline[timestamp];\n                    const script = entry instanceof Array ? entry.join('\\n') : entry;\n                    animation.animators.effects.addKeyframe({\n                        channel: 'timeline',\n                        time: parseFloat(timestamp),\n                        data_points: [{ script }]\n                    });\n                }\n            }\n            animation.calculateSnappingFromKeyframes();\n            if (!Animator.selected && Animator.open)\n                animation.select();\n            new_animations.push(animation);\n        }\n    }\n    return new_animations;\n}\n/**\n * When the animations JSON is being compiled for export\n * <p>\n * Makes sure bezier keyframes get exported correctly rather than being baked.\n */\nfunction monkeypatchAnimatorBuildFile() {\n    const bezierKeys = [];\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.BAKE_IN_BEZIER_KEYFRAMES].value) {\n        const arg = arguments[1][0];\n        const animation = this.animations.find(anim => anim.name == arg);\n        if (animation) {\n            for (const uuid in animation.animators) {\n                const animator = animation.animators[uuid];\n                if (!animator.keyframes.length && !animator.rotation_global)\n                    continue;\n                if (animator.type == 'bone') {\n                    for (const channel in Animator.possible_channels) {\n                        if (!animator[channel]?.length)\n                            continue;\n                        const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time);\n                        sorted_keyframes.forEach((kf) => {\n                            if (kf.interpolation == \"bezier\") {\n                                bezierKeys[bezierKeys.length] = kf;\n                                kf.bezier = true;\n                            }\n                        });\n                    }\n                }\n            }\n        }\n    }\n    const result = _utils__WEBPACK_IMPORTED_MODULE_0__.Monkeypatches.get(Animator).buildFile.apply(this, arguments);\n    if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isGeckoLibModel)() && !settings[_constants__WEBPACK_IMPORTED_MODULE_2__.BAKE_IN_BEZIER_KEYFRAMES].value) {\n        result.geckolib_format_version = 2;\n        bezierKeys.forEach((kf) => {\n            kf.bezier = false;\n            kf.easing = undefined;\n        });\n    }\n    return result;\n}\n\n\n/***/ }),\n\n/***/ \"./ts/keyframe.ts\":\n/*!************************!*\\\n  !*** ./ts/keyframe.ts ***!\n  \\************************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   GeckolibBoneAnimator: () => (/* binding */ GeckolibBoneAnimator),\n/* harmony export */   loadKeyframeOverrides: () => (/* binding */ loadKeyframeOverrides),\n/* harmony export */   unloadKeyframeOverrides: () => (/* binding */ unloadKeyframeOverrides)\n/* harmony export */ });\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/groupBy */ \"./node_modules/lodash/groupBy.js\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash/mapValues */ \"./node_modules/lodash/mapValues.js\");\n/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _easing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./easing */ \"./ts/easing.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\n\n\n\n\nfunction loadKeyframeOverrides() {\n    // @ts-ignore\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"getLerp\", keyframeGetLerp);\n    // @ts-ignore\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"compileBedrockKeyframe\", keyframeCompileBedrock);\n    // @ts-ignore\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"getUndoCopy\", keyframeGetUndoCopy);\n    // @ts-ignore\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(Keyframe, \"prototype\", \"extend\", keyframeExtend);\n    (0,_utils__WEBPACK_IMPORTED_MODULE_2__.addMonkeypatch)(BarItems.reverse_keyframes, null, \"click\", onReverseKeyframes);\n}\nfunction unloadKeyframeOverrides() {\n    //No-op for now since monkeypatches are unloaded automatically\n}\n// This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch\nclass GeckolibBoneAnimator extends BoneAnimator {\n    addKeyframe(data, uuid) {\n        const keyframe = super.addKeyframe(data, uuid);\n        if (data.bezier_left_time)\n            keyframe.bezier_left_time = data.bezier_left_time;\n        if (data.bezier_right_time)\n            keyframe.bezier_right_time = data.bezier_right_time;\n        if (data.bezier_right_value)\n            keyframe.bezier_right_value = data.bezier_right_value;\n        if (data.bezier_left_value)\n            keyframe.bezier_left_value = data.bezier_left_value;\n        return keyframe;\n    }\n}\nfunction lerp(start, stop, amt) {\n    return amt * (stop - start) + start;\n}\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nfunction keyframeGetLerp(other, axis, amount, allow_expression) {\n    if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID)\n        // @ts-ignore\n        return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getLerp.apply(this, arguments);\n    const easing = other.easing || _easing__WEBPACK_IMPORTED_MODULE_3__.EASING_DEFAULT;\n    let easingFunc = _easing__WEBPACK_IMPORTED_MODULE_3__.easingFunctions[easing];\n    if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing)) {\n        const easingValue = Array.isArray(other.easingArgs) && other.easingArgs.length > 0\n            ? other.easingArgs[0]\n            : (0,_easing__WEBPACK_IMPORTED_MODULE_3__.getEasingArgDefault)(other);\n        easingFunc = easingFunc.bind(null, easingValue);\n    }\n    const easedAmount = easingFunc(amount);\n    const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1);\n    const stop = other.calc(axis);\n    const result = lerp(start, stop, easedAmount);\n    if (Number.isNaN(result))\n        throw new Error('batman');\n    return result;\n}\n// Calculate GeckoLib's keyframe values in place of the built-in Bedrock compiler.\n// Additionally, invert the keyframe to match Blockbench's internal handling\nfunction geckolibGetArray(data_point, channel) {\n    const { easing, easingArgs, getArray } = this;\n    let result = getArray.apply(this, [data_point]);\n    if (this.bezier) {\n        result = { vector: result, easing: \"bezier\", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time };\n    }\n    else if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) {\n        if (this.data_points.length != 1) {\n            const postResult = getArray.apply(this, [1]);\n            if (!easing && result[0] === postResult[0] && result[1] === postResult[1] && result[2] === postResult[2]) {\n                result = { vector: result, easing };\n            }\n            else {\n                result = {\n                    pre: checkAndPatchKeyframeValues(result, channel),\n                    post: checkAndPatchKeyframeValues(getArray.apply(this, [1]), channel), easing\n                };\n            }\n        }\n        else {\n            result = { vector: result, easing };\n        }\n        if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing))\n            result.easingArgs = easingArgs;\n    }\n    if (result.vector)\n        result.vector = checkAndPatchKeyframeValues(result.vector, channel);\n    return result;\n}\n// Invert the molang value to match Blockbench's internal handling\n// Also swap out empty molang queries because Blockbench now sends them as empty quotes for some reason\nfunction checkAndPatchKeyframeValues(vector, channel) {\n    for (let i = 0; i <= 2; i++) {\n        if (vector[i] === \"\")\n            vector[i] = 0;\n    }\n    if (channel === 'rotation' || channel === 'position') {\n        vector[0] = invertMolang(vector[0]);\n        if (channel === 'rotation')\n            vector[1] = invertMolang(vector[1]);\n    }\n    return vector;\n}\n// Replace the bedrock keyframe compilation with a custom handler\nfunction keyframeCompileBedrock() {\n    if (Format.id !== _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID || !this.transform)\n        // @ts-ignore\n        return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments);\n    if (this.interpolation == 'catmullrom') {\n        const previous = this.getPreviousKeyframe.apply(this);\n        const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom');\n        return {\n            pre: include_pre ? geckolibGetArray.call(this, [0], this.channel) : undefined,\n            post: geckolibGetArray.call(this, [include_pre ? 1 : 0], this.channel),\n            lerp_mode: this.interpolation,\n        };\n    }\n    if (this.data_points.length == 1)\n        return geckolibGetArray.call(this, 0, this.channel);\n    return geckolibGetArray.call(this, [0], this.channel);\n}\nfunction keyframeGetUndoCopy() {\n    const { easing, easingArgs } = this;\n    // @ts-ignore\n    const result = _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments);\n    if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) {\n        Object.assign(result, { easing });\n        if ((0,_easing__WEBPACK_IMPORTED_MODULE_3__.isArgsEasing)(easing))\n            result.easingArgs = easingArgs;\n    }\n    return result;\n}\n// Append GeckoLib data to Keyframes when constructed\nfunction keyframeExtend(dataIn) {\n    const data = Object.assign({}, dataIn);\n    if (Format.id === _constants__WEBPACK_IMPORTED_MODULE_4__.GECKOLIB_MODEL_ID) {\n        if (typeof data.values === 'object') {\n            if (data.values.easing !== undefined)\n                Merge.string(this, data.values, 'easing');\n            if (Array.isArray(data.values.easingArgs))\n                this.easingArgs = data.values.easingArgs;\n            if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) {\n                // Convert data to format expected by KeyframeExtendOriginal\n                data.values = data.values.vector;\n            }\n        }\n        else {\n            if (data.easing !== undefined)\n                Merge.string(this, data, 'easing');\n            if (Array.isArray(data.easingArgs))\n                this.easingArgs = data.easingArgs;\n        }\n    }\n    // @ts-ignore\n    return _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(Keyframe).extend.apply(this, arguments);\n}\n// Inject GeckoLib support for the reverse keyframes feature\nfunction onReverseKeyframes() {\n    _utils__WEBPACK_IMPORTED_MODULE_2__.Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments);\n    // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead\n    Undo.initEdit({ keyframes: Timeline.selected });\n    const kfByAnimator = lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(Timeline.selected, kf => kf.animator.uuid);\n    const kfByAnimatorAndChannel = lodash_mapValues__WEBPACK_IMPORTED_MODULE_1___default()(kfByAnimator, keyframesForAnimator => lodash_groupBy__WEBPACK_IMPORTED_MODULE_0___default()(keyframesForAnimator, kf => kf.channel));\n    Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => {\n        const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid];\n        Object.keys(animatorChannelGroups).forEach(channel => {\n            const channelKeyframes = animatorChannelGroups[channel];\n            // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt\n            channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time);\n            // Reverse easing direction\n            const easingData = channelKeyframes.map((kf) => ({\n                easing: (0,_easing__WEBPACK_IMPORTED_MODULE_3__.reverseEasing)(kf.easing),\n                easingArgs: kf.easingArgs\n            }));\n            // Shift easing data to the right by one keyframe\n            channelKeyframes.forEach((kf, i) => {\n                if (i == 0) {\n                    kf.easing = undefined;\n                    kf.easingArgs = undefined;\n                    return;\n                }\n                const newEasingData = easingData[i - 1];\n                kf.easing = newEasingData.easing;\n                kf.easingArgs = newEasingData.easingArgs;\n            });\n        });\n    });\n    Undo.finishEdit('Reverse keyframe easing');\n    updateKeyframeSelection();\n    Animator.preview();\n}\n\n\n/***/ }),\n\n/***/ \"./ts/utils.ts\":\n/*!*********************!*\\\n  !*** ./ts/utils.ts ***!\n  \\*********************/\n/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Monkeypatches: () => (/* binding */ Monkeypatches),\n/* harmony export */   addCodecCallback: () => (/* binding */ addCodecCallback),\n/* harmony export */   addEventListener: () => (/* binding */ addEventListener),\n/* harmony export */   addMonkeypatch: () => (/* binding */ addMonkeypatch),\n/* harmony export */   determineModelType: () => (/* binding */ determineModelType),\n/* harmony export */   isEmpty: () => (/* binding */ isEmpty),\n/* harmony export */   isGeckoLibModel: () => (/* binding */ isGeckoLibModel),\n/* harmony export */   isValidNamespace: () => (/* binding */ isValidNamespace),\n/* harmony export */   isValidPath: () => (/* binding */ isValidPath),\n/* harmony export */   make: () => (/* binding */ make),\n/* harmony export */   onlyIfGeckoLib: () => (/* binding */ onlyIfGeckoLib),\n/* harmony export */   removeCodecCallback: () => (/* binding */ removeCodecCallback),\n/* harmony export */   removeEventListener: () => (/* binding */ removeEventListener),\n/* harmony export */   removeMonkeypatches: () => (/* binding */ removeMonkeypatches),\n/* harmony export */   shouldShowDisplayPanel: () => (/* binding */ shouldShowDisplayPanel)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n\nconst VALID_NAMESPACE_PATTERN = new RegExp('^[_\\\\-.a-z0-9]+$');\nconst VALID_PATH_PATTERN = new RegExp('^[_\\\\-/.a-z0-9]+$');\nconst Monkeypatches = new Map();\n/**\n * Add what is effectively an override of another javascript function in a target object.\n * <p>\n * The patched function should call the original first and operate on the result to ensure compatibility\n * </p>\n *\n * @param symbol The target object\n * @param path The property of the target to access, or null to access the root target itself\n * @param functionKey The name of the function to replace\n * @param newFunction The function to patch in to replace the target\n */\nconst addMonkeypatch = (symbol, path, functionKey, newFunction) => {\n    const pathAccessor = path ? symbol[path] : symbol;\n    if (!Monkeypatches.get(symbol))\n        Monkeypatches.set(symbol, { _pathAccessor: pathAccessor });\n    Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey];\n    pathAccessor[functionKey] = newFunction;\n};\n/**\n * Remove all previously added monkeypatches, reverting their operation to prior to the patch\n */\nconst removeMonkeypatches = () => {\n    Monkeypatches.forEach(symbol => {\n        Object.keys(symbol).forEach(functionKey => {\n            if (functionKey.startsWith('_'))\n                return;\n            symbol._pathAccessor[functionKey] = symbol[functionKey];\n        });\n    });\n    Monkeypatches.clear();\n};\n/**\n * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety\n */\nconst onlyIfGeckoLib = (callback) => {\n    return (e) => {\n        if (isGeckoLibModel())\n            callback(e);\n    };\n};\n/**\n * Add an event listener to Blockbench's event callback system.\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nconst addEventListener = (eventName, callback) => {\n    Blockbench.on(eventName, callback);\n};\n/**\n * Remove a previously registered event listener from Blockbench's event callback system.\n * <p>\n * All registered event listeners should be removed when the plugin or codec is unloaded\n */\nconst removeEventListener = (eventName, callback) => {\n    Blockbench.removeListener(eventName, callback);\n};\n/**\n * Add a callback to a codec to be called after the task has been completed\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nconst addCodecCallback = (codec, taskName, callback) => {\n    codec.on(taskName, callback);\n};\n/**\n * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable\n */\nfunction make(obj, consumer) {\n    consumer(obj);\n    return obj;\n}\n/**\n * Remove a previously added codec task completion callback\n * <p>\n * All registered coded callbacks should be removed when the plugin or codec is unloaded\n */\nconst removeCodecCallback = (codec, taskName, callback) => {\n    codec.removeListener(taskName, callback);\n};\n/**\n * Whether a given string is a valid ResourceLocation path for Minecraft\n */\nconst isValidPath = (path) => {\n    return VALID_PATH_PATTERN.test(path);\n};\n/**\n * Whether a given string is a valid ResourceLocation namespace for Minecraft\n */\nconst isValidNamespace = (namespace) => {\n    return VALID_NAMESPACE_PATTERN.test(namespace);\n};\n/**\n * Whether a map-like object has no defined keys or values\n */\nconst isEmpty = (object = {}) => !object || Object.keys(object).length === 0;\n/**\n * Whether the currently focussed model is a GeckoLib model\n */\nconst isGeckoLibModel = () => Format.id === _constants__WEBPACK_IMPORTED_MODULE_0__.GECKOLIB_MODEL_ID;\n/**\n * Whether the current project is a GeckoLib model that has or uses item render perspective transforms\n */\nconst shouldShowDisplayPanel = () => {\n    if (!isGeckoLibModel() || !Project)\n        return false;\n    if (settings[_constants__WEBPACK_IMPORTED_MODULE_0__.SETTING_ALWAYS_SHOW_DISPLAY].value)\n        return true;\n    return Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM || !isEmpty(Project.display_settings);\n};\n/**\n * Determine the GeckoModelType of the current project (as best as possible), or null if it is not a GeckoLib model.\n */\nconst determineModelType = (optionalModel) => {\n    if (!isGeckoLibModel() || !Project)\n        return null;\n    if (Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] && typeof Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE] === 'string')\n        return Project[_constants__WEBPACK_IMPORTED_MODULE_0__.PROPERTY_MODEL_TYPE];\n    if (optionalModel && !isEmpty(optionalModel.display))\n        return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM;\n    if (!isEmpty(Project.display_settings))\n        return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ITEM;\n    return _constants__WEBPACK_IMPORTED_MODULE_0__.GeckoModelType.ENTITY;\n};\n\n\n/***/ }),\n\n/***/ \"data:font/woff2;base64,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\":\n/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\\\n  !*** data:font/woff2;base64,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 ***!\n  \\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/\n/***/ ((module) => {\n\n\"use strict\";\nmodule.exports = \"data:font/woff2;base64,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\";\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = __webpack_modules__;\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t(() => {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = (module) => {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\t() => (module['default']) :\n/******/ \t\t\t\t() => (module);\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t(() => {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = (exports, definition) => {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t(() => {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = (exports) => {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/node module decorator */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.nmd = (module) => {\n/******/ \t\t\tmodule.paths = [];\n/******/ \t\t\tif (!module.children) module.children = [];\n/******/ \t\t\treturn module;\n/******/ \t\t};\n/******/ \t})();\n/******/ \t\n/******/ \t/* webpack/runtime/jsonp chunk loading */\n/******/ \t(() => {\n/******/ \t\t__webpack_require__.b = document.baseURI || self.location.href;\n/******/ \t\t\n/******/ \t\t// object to store loaded and loading chunks\n/******/ \t\t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t\t// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n/******/ \t\tvar installedChunks = {\n/******/ \t\t\t\"main\": 0\n/******/ \t\t};\n/******/ \t\t\n/******/ \t\t// no chunk on demand loading\n/******/ \t\t\n/******/ \t\t// no prefetching\n/******/ \t\t\n/******/ \t\t// no preloaded\n/******/ \t\t\n/******/ \t\t// no HMR\n/******/ \t\t\n/******/ \t\t// no HMR manifest\n/******/ \t\t\n/******/ \t\t// no on chunks loaded\n/******/ \t\t\n/******/ \t\t// no jsonp function\n/******/ \t})();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be in strict mode.\n(() => {\n\"use strict\";\n/*!*********************!*\\\n  !*** ./ts/index.ts ***!\n  \\*********************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! semver/functions/coerce */ \"./node_modules/semver/functions/coerce.js\");\n/* harmony import */ var semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! semver/functions/satisfies */ \"./node_modules/semver/functions/satisfies.js\");\n/* harmony import */ var semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ \"./package.json\");\n/* harmony import */ var _animationUi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./animationUi */ \"./ts/animationUi.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ \"./ts/utils.ts\");\n/* harmony import */ var _keyframe__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./keyframe */ \"./ts/keyframe.ts\");\n/* harmony import */ var _codec__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./codec */ \"./ts/codec.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ \"./ts/constants.ts\");\n/* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./events */ \"./ts/events.ts\");\n\n\n\n\n\n\n\n\n\nconst { version, author, pluginOptions } = _package_json__WEBPACK_IMPORTED_MODULE_2__;\nconst SUPPORTED_BB_VERSION_RANGE = `${pluginOptions.min_version} - ${pluginOptions.max_version}`;\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst css = (__webpack_require__(/*! ../resources/easing_keyframes.css */ \"./resources/easing_keyframes.css\").toString)();\nif (!semver_functions_satisfies__WEBPACK_IMPORTED_MODULE_1___default()(semver_functions_coerce__WEBPACK_IMPORTED_MODULE_0___default()(Blockbench.version), SUPPORTED_BB_VERSION_RANGE))\n    alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`);\n// Register the plugin and define what it adds\n(function () {\n    let pluginSettings;\n    let pluginProperties;\n    let pluginMenuItems;\n    // @ts-expect-error - Typescript doesn't like that the \"Tags\" collection could be empty instead of implicitly non-empty\n    BBPlugin.register(\"geckolib\", Object.assign({}, pluginOptions, {\n        name: pluginOptions.title,\n        version,\n        author,\n        onload() {\n            Blockbench.addCSS(css);\n            (0,_events__WEBPACK_IMPORTED_MODULE_8__.addEventListeners)();\n            (0,_animationUi__WEBPACK_IMPORTED_MODULE_3__.loadAnimationUI)();\n            (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.loadKeyframeOverrides)();\n            pluginSettings = createPluginSettings();\n            pluginProperties = createPluginProperties();\n            pluginMenuItems = createPluginMenuItems();\n            for (const menuItem of pluginMenuItems) {\n                MenuBar.addAction(menuItem.action, menuItem.menuCategory);\n            }\n            console.log(\"Loaded GeckoLib plugin\");\n        },\n        onunload() {\n            for (const setting of pluginSettings) {\n                setting.delete();\n            }\n            for (const property of pluginProperties) {\n                property.delete();\n            }\n            for (const menuItem of pluginMenuItems) {\n                menuItem.action.delete();\n            }\n            (0,_keyframe__WEBPACK_IMPORTED_MODULE_5__.unloadKeyframeOverrides)();\n            (0,_animationUi__WEBPACK_IMPORTED_MODULE_3__.unloadAnimationUI)();\n            (0,_events__WEBPACK_IMPORTED_MODULE_8__.removeEventListeners)();\n            _codec__WEBPACK_IMPORTED_MODULE_6__.format.delete();\n            console.clear();\n        },\n    }));\n})();\n/**\n * Create and return the plugin's settings.\n * <p>\n * These are found in the Settings panel in the plugin info window\n */\nfunction createPluginSettings() {\n    return [\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_AUTO_PARTICLE_TEXTURE, {\n            value: false,\n            category: \"export\",\n            name: \"Auto-compute block/item particle texture\",\n            description: \"Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.BAKE_IN_BEZIER_KEYFRAMES, {\n            value: false,\n            category: \"export\",\n            name: \"Bake in bezier keyframes\",\n            description: \"When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier.\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_ALWAYS_SHOW_DISPLAY, {\n            value: false,\n            category: \"edit\",\n            name: \"Always show display tab\",\n            description: \"Force the Display tab to always show, even when not an Item type model\"\n        }),\n        new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_REMEMBER_EXPORT_LOCATIONS, {\n            value: true,\n            category: \"export\",\n            name: \"Remember file export locations\",\n            description: \"Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file.\"\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Setting(_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID, {\n            // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            type: 'text',\n            value: \"\",\n            category: \"export\",\n            name: \"Default Mod ID\",\n            description: \"Default Mod ID for models (if applicable)\"\n        }), setting => {\n            setting.onChange = function () {\n                const invalidNamespaceChar = new RegExp('[^_\\\\-.a-z0-9]+', 'g');\n                const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g');\n                this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidNamespaceChar, \"\");\n                return {};\n            };\n        })\n    ];\n}\n/**\n * Create and return the plugin's properties.\n * <p>\n * These are metadata values stored in the project, usually used in project settings windows\n */\nfunction createPluginProperties() {\n    return [\n        (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, \"string\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODID, {\n            label: \"Mod ID\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            values: [],\n            merge_validation: _utils__WEBPACK_IMPORTED_MODULE_4__.isValidNamespace\n        }), property => {\n            property['placeholder'] = 'my_modid';\n            property['description'] = 'The modid of the mod this model is for';\n            property.getDefault = function () {\n                return settings[_constants__WEBPACK_IMPORTED_MODULE_7__.SETTING_DEFAULT_MODID].value;\n            };\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, \"object\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE, {\n            label: \"Model Type\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            exposed: false,\n            options: _constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType,\n            values: Object.values(_constants__WEBPACK_IMPORTED_MODULE_7__.GeckoModelType)\n        }), property => {\n            property.merge = (instance, data) => {\n                instance[_constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE] = data[_constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_MODEL_TYPE];\n            };\n            property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure';\n        }),\n        (0,_utils__WEBPACK_IMPORTED_MODULE_4__.make)(new Property(ModelProject, \"instance\", _constants__WEBPACK_IMPORTED_MODULE_7__.PROPERTY_FILEPATH_CACHE, {\n            label: \"GeckoLib Filepath Cache\",\n            condition: {\n                formats: [_constants__WEBPACK_IMPORTED_MODULE_7__.GECKOLIB_MODEL_ID]\n            },\n            exposed: false,\n            values: []\n        }), property => {\n            property.default = {};\n        })\n    ];\n}\n/**\n * Create and return the plugin's menu items\n * <p>\n * These are added to Blockbench's menu bar or submenus\n */\nfunction createPluginMenuItems() {\n    return [\n        {\n            action: new Action(\"export_geckolib_model\", {\n                name: \"Export GeckoLib Model\",\n                icon: \"archive\",\n                description: \"Export your model geometry as a model for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)(),\n                click: function () {\n                    _codec__WEBPACK_IMPORTED_MODULE_6__[\"default\"].export();\n                },\n            }),\n            menuCategory: 'file.export'\n        },\n        {\n            action: new Action(\"export_geckolib_display\", {\n                name: \"Export GeckoLib Display Settings\",\n                icon: \"icon-bb_interface\",\n                description: \"Export your item/block display settings for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)() && (0,_utils__WEBPACK_IMPORTED_MODULE_4__.shouldShowDisplayPanel)(),\n                click: _codec__WEBPACK_IMPORTED_MODULE_6__.buildDisplaySettingsJson,\n            }),\n            menuCategory: 'file.export'\n        },\n        {\n            action: new Action(\"export_geckolib_animations\", {\n                name: \"Export GeckoLib Animations\",\n                icon: \"movie\",\n                description: \"Export your model animations for GeckoLib.\",\n                category: \"file\",\n                condition: () => (0,_utils__WEBPACK_IMPORTED_MODULE_4__.isGeckoLibModel)() && !(0,_utils__WEBPACK_IMPORTED_MODULE_4__.isEmpty)(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object',\n                click: e => BarItems['export_animation_file'].trigger(e),\n            }),\n            menuCategory: 'file.export'\n        }\n    ];\n}\n\n})();\n\n/******/ })()\n;"
  },
  {
    "path": "plugins/geckolib/members.yml",
    "content": "maintainers:\n  - bernie-g\n  - fadookie\n  - Tslat\n"
  },
  {
    "path": "plugins/geckolib/src/.eslintrc.cjs",
    "content": "/* eslint-env node */\nmodule.exports = {\n  extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],\n  parser: '@typescript-eslint/parser',\n  plugins: ['@typescript-eslint'],\n  root: true,\n  env: {\n    browser: true,\n    es2015: true,\n    jquery: true\n  },\n  rules: {\n    'prefer-rest-params': 'off',\n    '@typescript-eslint/no-explicit-any': 'off',\n  },\n};"
  },
  {
    "path": "plugins/geckolib/src/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Diagnostic reports (https://nodejs.org/api/report.html)\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\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*.lcov\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (https://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 (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Snowpack dependency directory (https://snowpack.dev/)\nweb_modules/\n\n# TypeScript cache\n*.tsbuildinfo\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Microbundle cache\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\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.env.test\n\n# parcel-bundler cache (https://parceljs.org/)\n.cache\n.parcel-cache\n\n# Next.js build output\n.next\nout\n\n# Nuxt.js build / generate output\n.nuxt\ndist\n\n# Gatsby files\n.cache/\n# Comment in the public line in if your project uses Gatsby and not Next.js\n# https://nextjs.org/blog/next-9-1#public-directory-support\n# public\n\n# vuepress build output\n.vuepress/dist\n\n# Serverless directories\n.serverless/\n\n# FuseBox cache\n.fusebox/\n\n# DynamoDB Local files\n.dynamodb/\n\n# TernJS port file\n.tern-port\n\n# Stores VSCode versions used for testing VSCode extensions\n.vscode-test\n\n# yarn v2\n.yarn/cache\n.yarn/unplugged\n.yarn/build-state.yml\n.yarn/install-state.gz\n.pnp.*\n"
  },
  {
    "path": "plugins/geckolib/src/.nvmrc",
    "content": "v24.7.0\n"
  },
  {
    "path": "plugins/geckolib/src/eslint.config.js",
    "content": "module.exports = {\n    ignores: [\"webpack.config.js\", \"jest.config.js\"],\n}"
  },
  {
    "path": "plugins/geckolib/src/jest.config.js",
    "content": "/** @type {import('ts-jest').JestConfigWithTsJest} */\nmodule.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n};"
  },
  {
    "path": "plugins/geckolib/src/package.json",
    "content": "{\n  \"name\": \"geckolib\",\n  \"version\": \"4.2.5\",\n  \"private\": true,\n  \"description\": \"GeckoLib Models & Animations\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"prebuild\": \"npm run test\",\n    \"build\": \"npm run build:only\",\n    \"build:only\": \"webpack && npm run update_manifest\",\n    \"update_manifest\": \"node scripts/updateManifest.mjs\",\n    \"start\": \"webpack --watch --mode=development\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint --fix .\",\n    \"tsc\": \"tsc --noEmit\",\n    \"pretest\": \"npm run lint && npm run tsc\",\n    \"test\": \"npm run test:only\",\n    \"test:only\": \"jest\"\n  },\n  \"author\": \"Eliot Lash, Tslat, Gecko, McHorse, matmat37000\",\n  \"license\": \"MIT\",\n  \"pluginOptions\": {\n    \"title\": \"GeckoLib Models & Animations\",\n    \"description\": \"Create animated blocks, items, entities, and armor for the GeckoLib java mod library.\",\n    \"icon\": \"icon.png\",\n    \"tags\": [\n      \"Minecraft: Java Edition\"\n    ],\n    \"variant\": \"both\",\n    \"min_version\": \"5.0.0\",\n    \"max_version\": \"6.0.0\",\n    \"await_loading\": true,\n    \"has_changelog\": true,\n    \"website\": \"https://github.com/bernie-g/geckolib/wiki\",\n    \"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/geckolib\",\n    \"bug_tracker\": \"https://github.com/bernie-g/geckolib/issues\"\n  },\n  \"sideEffects\": [\n    \"./index.js\"\n  ],\n  \"devDependencies\": {\n    \"@types/jest\": \"^30.0.0\",\n    \"@types/lodash\": \"^4.17.20\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.41.0\",\n    \"@typescript-eslint/parser\": \"^8.41.0\",\n    \"blockbench-types\": \"^5.0.6\",\n    \"css-loader\": \"^7.1.2\",\n    \"eol\": \"0.10.0\",\n    \"eslint\": \"^9.34.0\",\n    \"indent-string\": \"^5.0.0\",\n    \"jest\": \"^30.1.1\",\n    \"to-string-loader\": \"^1.2.0\",\n    \"ts-jest\": \"^29.4.1\",\n    \"ts-loader\": \"^9.5.4\",\n    \"typescript\": \"^5.9.2\",\n    \"webpack\": \"^5.101.3\",\n    \"webpack-cli\": \"^6.0.1\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.21\",\n    \"semver\": \"7.7.2\"\n  }\n}"
  },
  {
    "path": "plugins/geckolib/src/resources/armorTemplate.json",
    "content": "{\n  \"meta\": {\n    \"format_version\": \"3.2\",\n    \"model_format\": \"geckolib_model\",\n    \"box_uv\": true\n  },\n  \"name\": \"CustomArmor\",\n  \"geo_name\": \"CustomArmor\",\n  \"resolution\": {\n    \"width\": 64,\n    \"height\": 64\n  },\n  \"elements\": [\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        24,\n        -4\n      ],\n      \"to\": [\n        4,\n        32,\n        4\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        0,\n        0,\n        0\n      ],\n      \"uuid\": \"9675593e-b27d-b70e-e1ea-1fc29f46a294\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        12,\n        -2\n      ],\n      \"to\": [\n        4,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"uuid\": \"fa43156a-2a62-948c-082f-483d525f6d1f\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        4,\n        12,\n        -2\n      ],\n      \"to\": [\n        8,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -8,\n        12,\n        -2\n      ],\n      \"to\": [\n        -4,\n        24,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"bf2c2539-20e3-cfcc-94c0-491734019889\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        -4,\n        0,\n        -2\n      ],\n      \"to\": [\n        0,\n        12,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"17b9bae0-356a-9bba-fad9-4672e2671191\"\n    },\n    {\n      \"name\": \"dontTouch\",\n      \"from\": [\n        0,\n        0,\n        -2\n      ],\n      \"to\": [\n        4,\n        12,\n        2\n      ],\n      \"autouv\": 1,\n      \"color\": 0,\n      \"export\": false,\n      \"locked\": true,\n      \"origin\": [\n        4,\n        22,\n        0\n      ],\n      \"uuid\": \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"\n    }\n  ],\n  \"outliner\": [\n    {\n      \"name\": \"bipedHead\",\n      \"uuid\": \"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"children\": [\n        \"9675593e-b27d-b70e-e1ea-1fc29f46a294\",\n        {\n          \"name\": \"armorHead\",\n          \"uuid\": \"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            0,\n            24,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedBody\",\n      \"uuid\": \"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        0,\n        24,\n        0\n      ],\n      \"children\": [\n        \"fa43156a-2a62-948c-082f-483d525f6d1f\",\n        {\n          \"name\": \"armorBody\",\n          \"uuid\": \"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            0,\n            24,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedRightArm\",\n      \"uuid\": \"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        5,\n        22,\n        0\n      ],\n      \"children\": [\n        \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",\n        {\n          \"name\": \"armorRightArm\",\n          \"uuid\": \"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            5,\n            22,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedLeftArm\",\n      \"uuid\": \"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        -5,\n        22,\n        0\n      ],\n      \"children\": [\n        \"bf2c2539-20e3-cfcc-94c0-491734019889\",\n        {\n          \"name\": \"armorLeftArm\",\n          \"uuid\": \"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -5,\n            22,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedLeftLeg\",\n      \"uuid\": \"37231be7-a8ef-22ca-7fea-40aed58003bb\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        -2,\n        12,\n        0\n      ],\n      \"children\": [\n        \"17b9bae0-356a-9bba-fad9-4672e2671191\",\n        {\n          \"name\": \"armorLeftLeg\",\n          \"uuid\": \"e4b19746-2d17-1f56-befe-00718165ae50\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        },\n        {\n          \"name\": \"armorLeftBoot\",\n          \"uuid\": \"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            -2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    },\n    {\n      \"name\": \"bipedRightLeg\",\n      \"uuid\": \"45c031a5-b6be-e0a7-5454-b45d07f28429\",\n      \"export\": true,\n      \"isOpen\": true,\n      \"visibility\": true,\n      \"autouv\": 0,\n      \"origin\": [\n        2,\n        12,\n        0\n      ],\n      \"children\": [\n        \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",\n        {\n          \"name\": \"armorRightLeg\",\n          \"uuid\": \"60238f18-e74b-c863-cb45-2e2f162221bd\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        },\n        {\n          \"name\": \"armorRightBoot\",\n          \"uuid\": \"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\n          \"export\": true,\n          \"isOpen\": true,\n          \"visibility\": true,\n          \"autouv\": 0,\n          \"origin\": [\n            2,\n            12,\n            0\n          ],\n          \"children\": [\n            \n          ]\n        }\n      ]\n    }\n  ],\n  \"textures\": [\n    \n  ]\n}\n"
  },
  {
    "path": "plugins/geckolib/src/resources/easing_keyframes.css",
    "content": "@font-face {\n    font-family: 'geckolib_icomoon';\n    font-weight: normal;\n    font-style: normal;\n    src: url(\"data:font/woff2;base64,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\") format(\"woff2\");\n}\n\n[class^=\"easing-\"]:not(.fa), [class*=\" easing-\"]:not(.fa) {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: 'geckolib_icomoon' !important;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n    max-width: 24px;\n    margin-top: 4px;\n    font-size: 14px;\n    margin-left: -1px;\n    pointer-events: none;\n    display: block;\n\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n.easing-linear:before {\n    content: \"\\e925\";\n}\n.easing-step:before {\n    content: \"\\e921\";\n}\n.easing-in_sine:before {\n    content: \"\\e915\";\n}\n.easing-out_sine:before {\n    content: \"\\e916\";\n}\n.easing-in_out_sine:before {\n    content: \"\\e917\";\n}\n.easing-in_quad:before {\n    content: \"\\e900\";\n}\n.easing-out_quad:before {\n    content: \"\\e901\";\n}\n.easing-in_out_quad:before {\n    content: \"\\e902\";\n}\n.easing-in_cubic:before {\n    content: \"\\e903\";\n}\n.easing-out_cubic:before {\n    content: \"\\e904\";\n}\n.easing-in_out_cubic:before {\n    content: \"\\e905\";\n}\n.easing-in_quart:before {\n    content: \"\\e906\";\n}\n.easing-out_quart:before {\n    content: \"\\e907\";\n}\n.easing-in_out_quart:before {\n    content: \"\\e908\";\n}\n.easing-in_quint:before {\n    content: \"\\e909\";\n}\n.easing-out_quint:before {\n    content: \"\\e90a\";\n}\n.easing-in_out_quint:before {\n    content: \"\\e90b\";\n}\n.easing-in_expo:before {\n    content: \"\\e90c\";\n}\n.easing-out_expo:before {\n    content: \"\\e90d\";\n}\n.easing-in_out_expo:before {\n    content: \"\\e90e\";\n}\n.easing-in_circ:before {\n    content: \"\\e90f\";\n}\n.easing-out_circ:before {\n    content: \"\\e910\";\n}\n.easing-in_out_circ:before {\n    content: \"\\e911\";\n}\n.easing-in_back:before {\n    content: \"\\e918\";\n}\n.easing-out_back:before {\n    content: \"\\e919\";\n}\n.easing-in_out_back:before {\n    content: \"\\e91a\";\n}\n.easing-in_elastic:before {\n    content: \"\\e91b\";\n}\n.easing-out_elastic:before {\n    content: \"\\e91c\";\n}\n.easing-in_out_elastic:before {\n    content: \"\\e91d\";\n}\n.easing-in_bounce:before {\n    content: \"\\e91e\";\n}\n.easing-out_bounce:before {\n    content: \"\\e91f\";\n}\n.easing-in_out_bounce:before {\n    content: \"\\e920\";\n}"
  },
  {
    "path": "plugins/geckolib/src/scripts/updateManifest.mjs",
    "content": "// @ts-check\nimport indentString from 'indent-string';\nimport path from 'path';\nimport fs from 'fs';\nimport eol from 'eol';\nimport * as url from 'url';\n\n// Identify key file paths\n// @ts-ignore\nconst PLUGIN_SRC_PATH = url.fileURLToPath(new URL('.', import.meta.url));\nconst PACKAGE_JSON_PATH = path.join(PLUGIN_SRC_PATH, '../package.json');\nconst PLUGINS_MANIFEST_PATH = path.join(PLUGIN_SRC_PATH, '..', '..',  '..', '..', 'plugins.json');\n\n// Extract plugins.json contents\nconst pluginsJsonRaw = fs.readFileSync(PLUGINS_MANIFEST_PATH, { encoding: 'utf8' });\nconst pluginsJson = JSON.parse(pluginsJsonRaw);\n\n// Extract package.json\nconst packageJsonRaw = fs.readFileSync(PACKAGE_JSON_PATH, { encoding: 'utf8' });\nconst packageJson = JSON.parse(packageJsonRaw);\n\n// Update plugins.json manifest entry for plugin\npackageJson.pluginOptions.version = packageJson.version;\nconst newManifest = Object.assign({},\n  pluginsJson.geckolib,\n  packageJson.pluginOptions\n);\nconst newManifestString =\n  indentString(\n    JSON.stringify(newManifest, null, '\\t'),\n    1,\n    { indent: '\\t' }\n  )\n  .trimStart();\n\n// Write updated plugins.json\nconst newPluginsString = pluginsJsonRaw.replace(/(\"geckolib\":\\s*)({[\\s\\S.]*?})/, `$1${newManifestString}`);\n\nfs.writeFileSync(PLUGINS_MANIFEST_PATH, eol.lf(newPluginsString));"
  },
  {
    "path": "plugins/geckolib/src/tests/easing.test.ts",
    "content": "import { reverseEasing } from '../ts/easing';\n\ndescribe('easing', () => {\n  describe('reverseEasing', () => {\n    it('should return the easing parameter if it is falsy', () => {\n      expect(reverseEasing(undefined)).toEqual(undefined);\n      expect(reverseEasing(null)).toEqual(null);\n    });\n\n    it('should not change direction of non-directional easings', () => {\n      expect(reverseEasing(\"linear\")).toEqual(\"linear\");\n      expect(reverseEasing(\"easeInOutBack\")).toEqual(\"easeInOutBack\");\n    });\n\n    it('should change easeIn to easeOut and vice versa', () => {\n      expect(reverseEasing(\"easeInBack\")).toEqual(\"easeOutBack\");\n      expect(reverseEasing(\"easeOutBack\")).toEqual(\"easeInBack\");\n    });\n  });\n});"
  },
  {
    "path": "plugins/geckolib/src/ts/animationUi.ts",
    "content": "import uniq from 'lodash/uniq';\nimport {addMonkeypatch} from './utils';\nimport {EASING_OPTIONS, EASING_DEFAULT, getEasingArgDefault, parseEasingArg, GeckolibKeyframe, isArgsEasing} from './easing';\nimport {GECKOLIB_MODEL_ID} from \"./constants\";\n\nconst easingRegExp = /^ease(InOut|In|Out)?([\\w]+)$/;\n\nexport const loadAnimationUI = () => {\n  Blockbench.on('display_animation_frame', displayAnimationFrameCallback);\n  Blockbench.on('update_keyframe_selection', updateKeyframeSelectionCallback);\n  Blockbench.on('render_frame', renderFrameCallback)\n\n  addMonkeypatch(window, null, \"updateKeyframeEasing\", updateKeyframeEasing);\n  addMonkeypatch(window, null, \"updateKeyframeEasingArg\", updateKeyframeEasingArg);\n};\n\nexport const unloadAnimationUI = () => {\n  Blockbench.removeListener('display_animation_frame', displayAnimationFrameCallback);\n  Blockbench.removeListener('update_keyframe_selection', updateKeyframeSelectionCallback);\n  Blockbench.removeListener('render_frame', renderFrameCallback);\n};\n\nexport const displayAnimationFrameCallback = (/*...args*/) => {\n  // const keyframe = $('#keyframe');\n  // console.log('displayAnimationFrameCallback:', args, 'keyframe:', keyframe); // keyframe is null here\n};\n\nexport function renderFrameCallback() {\n  if (Format.id !== GECKOLIB_MODEL_ID) return\n  Timeline.keyframes.forEach((kf: GeckolibKeyframe) => {\n    if (kf.interpolation != \"linear\" && kf.easing != undefined) {\n      kf.easing = undefined\n      kf.easingArgs = undefined\n      window.updateKeyframeSelection();\n    }\n    if (kf.interpolation === \"step\") {\n      kf.interpolation = \"linear\"\n      if (kf.data_points.length == 1) addDataPoint()\n      window.updateKeyframeSelection();\n    }\n    updateKeyframeIcon(kf)\n  })\n  const addPrePostButton = document.querySelector<HTMLElement>('#keyframe_type_label > div');\n  if (addPrePostButton) addPrePostButton.hidden = true;\n}\n\nexport function updateKeyframeEasing(value) {\n  Undo.initEdit({keyframes: Timeline.selected}) \n  // var axis = $(obj).attr('axis');\n  // const value = $(obj).val();\n  // console.log('updateKeyframeEasing value:', value, 'obj:', obj); \n  if (value === \"-\") return;\n  Timeline.selected.forEach((kf: GeckolibKeyframe) => {\n    kf.easing = value;\n    kf.easingArgs = undefined;\n    kf.interpolation = 'linear';\n  })\n  window.updateKeyframeSelection(); // Ensure easingArg display is updated\n  // Animator.preview();\n  Undo.finishEdit('edit keyframe easing')\n}\n\nexport function updateKeyframeEasingArg(obj) {\n  Undo.initEdit({keyframes: Timeline.selected}) \n  if ($(obj).val() === \"-\") return;\n  // console.log('updateKeyframeEasingArg value:', $(obj).val(), 'obj:', obj); \n  Timeline.selected.forEach((kf: GeckolibKeyframe) => {\n    const value = parseEasingArg(kf, ($(obj).val() as string).trim());\n    kf.easingArgs = [value];\n    // obj.value = value;\n  })\n  Undo.finishEdit('edit keyframe easing argument')\n}\n\nexport const updateKeyframeSelectionCallback = (/*...args*/) => {\n    $('#keyframe_bar_easing').remove()\n    $('#keyframe_bar_easing_type').remove()\n    $('#keyframe_bar_easing_arg1').remove()\n\n    let multi_channel = false; //eslint-disable-line @typescript-eslint/no-unused-vars\n    let channel: boolean | string | number = false;\n    Timeline.selected.forEach((kf) => {\n      if (channel === false) {\n        channel = kf.channel\n      } else if (channel !== kf.channel) {\n        multi_channel = true\n      }\n    })\n\n    Timeline.keyframes.forEach((kf: GeckolibKeyframe) => {\n      updateKeyframe(kf)\n    })\n\n    const getMultiSelectValue = (selector, defaultValue, conflictValue) => {\n      const selectorFunction = typeof selector === 'function' \n        ? selector\n        : x => (x[selector] === undefined ? defaultValue : x[selector]);\n\n      if (Timeline.selected.length > 1) {\n        const uniqSelected = uniq(Timeline.selected.map(selectorFunction));\n        if (uniqSelected.length === 1) {\n          return uniqSelected[0];\n        } else {\n          return conflictValue;\n        }\n      } else {\n        return selectorFunction(Timeline.selected[0]) || defaultValue;\n      }\n    };\n\n    const keyframesByChannel = Timeline.keyframes.reduce((acc, kf) => {\n      // Dear god I miss lodash\n      if (!acc.has(kf.animator)) acc.set(kf.animator, {});\n      const animatorChannels = acc.get(kf.animator);\n      if (!animatorChannels[kf.channel]) animatorChannels[kf.channel] = [];\n      animatorChannels[kf.channel].push(kf);\n      animatorChannels[kf.channel].sort((a, b) => {\n        if (a.time < b.time) return -1;\n        if (a.time > b.time) return 1;\n        return 0;\n      });\n      return acc;\n    }, new Map());\n\n    const isFirstInChannel = (kf: _Keyframe) => keyframesByChannel.get(kf.animator)[kf.channel].indexOf(kf) < 1;\n\n    if (Timeline.selected.length && Format.id === GECKOLIB_MODEL_ID) {\n      if (Timeline.selected.every(kf => kf.animator instanceof BoneAnimator && !isFirstInChannel(kf))) {\n        const displayedEasing = getMultiSelectValue('easing', EASING_DEFAULT, 'null');\n\n        const convertEasingTypeToId = (easing, easingType, inputEasingOrType) => {\n          const easingTypeToTypeId = type => {\n            let finalEasingType = \"In\";\n\n            if (type === \"out\") {\n              finalEasingType = \"Out\";\n            } else if (type === \"inout\") {\n              finalEasingType = \"InOut\";\n            }\n\n            return finalEasingType;\n          };\n\n          let finalEasing = 'ease';\n\n          if (inputEasingOrType === \"in\" || inputEasingOrType === \"out\" || inputEasingOrType === \"inout\") {\n              const finalEasingType = easingTypeToTypeId(inputEasingOrType)\n\n              finalEasing += finalEasingType + easing.substring(0, 1).toUpperCase() + easing.substring(1);\n            } else if (inputEasingOrType === \"linear\" || inputEasingOrType == \"step\") {\n              finalEasing = inputEasingOrType;\n            } else {\n              const finalEasingType = easingTypeToTypeId(easingType);\n\n              finalEasing += finalEasingType + inputEasingOrType.substring(0, 1).toUpperCase() + inputEasingOrType.substring(1);\n            }\n\n            return finalEasing;\n        };\n\n        const addEasingTypeIcons = (bar, easingType, title) => {\n          const div = document.createElement(\"div\");\n          div.innerHTML = getIcon(easingType);\n          div.id = \"kf_easing_type_\" + easingType;\n          div.setAttribute(\"style\", \"stroke:var(--color-text);margin:0px;padding:3px;width:30px;height:30px\");\n          div.setAttribute(\"title\", title);\n          div.onclick = () => {\n            const selectedEasing = $(\".selected_kf_easing\");\n            const selectedEasingType = $(\".selected_kf_easing_type\");\n\n            const keySelectedEasing = selectedEasing.attr(\"id\").substring(15);\n            const keySelectedEasingType = selectedEasingType.length <= 0 ? \"in\" : selectedEasingType.attr(\"id\").substring(15);\n\n            const currentEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, keySelectedEasing);\n            const finalEasing = convertEasingTypeToId(keySelectedEasing, keySelectedEasingType, easingType);\n\n            if (finalEasing != currentEasing) {\n            //   console.log(\"Changed from \" + currentEasing + \" to \" + finalEasing);\n              updateKeyframeEasing(finalEasing);\n            }\n          };\n          bar.appendChild(div);\n        };\n\n        const keyframePanel = document.getElementById('panel_keyframe');\n\n        if (keyframePanel) {\n            let easingBar: HTMLElement = document.createElement('div');\n\n\n            keyframePanel.appendChild(easingBar);\n            easingBar.outerHTML = `<div class=\"bar flex\" style=\"flex-wrap: wrap\" id=\"keyframe_bar_easing\">\n                <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Easing</label>\n            </div>`;\n            easingBar = document.getElementById('keyframe_bar_easing');\n\n            addEasingTypeIcons(easingBar, \"linear\", \"Switch to Linear easing\");\n            addEasingTypeIcons(easingBar, \"step\", \"Switch to Step easing\");\n            addEasingTypeIcons(easingBar, \"sine\", \"Switch to Sine easing\");\n            addEasingTypeIcons(easingBar, \"quad\", \"Switch to Quadratic easing\");\n            addEasingTypeIcons(easingBar, \"cubic\", \"Switch to Cubic easing\");\n            addEasingTypeIcons(easingBar, \"quart\", \"Switch to Quartic easing\");\n            addEasingTypeIcons(easingBar, \"quint\", \"Switch to Quntic easing\");\n            addEasingTypeIcons(easingBar, \"expo\", \"Switch to Exponential easing\");\n            addEasingTypeIcons(easingBar, \"circ\", \"Switch to Circle easing\");\n            addEasingTypeIcons(easingBar, \"back\", \"Switch to Back easing\");\n            addEasingTypeIcons(easingBar, \"elastic\", \"Switch to Elastic easing\");\n            addEasingTypeIcons(easingBar, \"bounce\", \"Switch to Bounce easing\");\n\n\n            const keyEasing = getEasingInterpolation(displayedEasing);\n            const keyEasingElement = document.getElementById(\"kf_easing_type_\" + keyEasing);\n\n            keyEasingElement.style.stroke = \"var(--color-accent)\";\n            keyEasingElement.classList.add('selected_kf_easing');\n\n            if (!(keyEasing === \"linear\" || keyEasing == \"step\")) {\n                let easingTypeBar: HTMLElement = document.createElement('div');\n                keyframePanel.appendChild(easingTypeBar);\n                easingTypeBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_type\">\n            <label class=\"tl\" style=\"font-weight: bolder; min-width: 47px;\">Type</label>\n          </div>`;\n                easingTypeBar = document.getElementById('keyframe_bar_easing_type');\n\n                addEasingTypeIcons(easingTypeBar, \"in\", \"Switch to In easing type\");\n                addEasingTypeIcons(easingTypeBar, \"out\", \"Switch to Out easing type\");\n                addEasingTypeIcons(easingTypeBar, \"inout\", \"Switch to In/Out easing type\");\n\n                const keyEasingType = getEasingType(displayedEasing);\n                const keyEasingTypeElement = document.getElementById(\"kf_easing_type_\" + keyEasingType);\n\n                keyEasingTypeElement.style.stroke = \"var(--color-accent)\";\n                keyEasingTypeElement.classList.add('selected_kf_easing_type');\n            }\n\n            if (keyEasing !== \"linear\")\n                document.getElementById('panel_keyframe').querySelector('div.bb-select').textContent = \"GeckoLib\"\n\n            const getEasingArgLabel = (kf: GeckolibKeyframe) => {\n                switch(kf.easing) {\n                    case EASING_OPTIONS.easeInBack:\n                    case EASING_OPTIONS.easeOutBack:\n                    case EASING_OPTIONS.easeInOutBack:\n                        return 'Overshoot';\n                    case EASING_OPTIONS.easeInElastic:\n                    case EASING_OPTIONS.easeOutElastic:\n                    case EASING_OPTIONS.easeInOutElastic:\n                    case EASING_OPTIONS.easeInBounce:\n                    case EASING_OPTIONS.easeOutBounce:\n                    case EASING_OPTIONS.easeInOutBounce:\n                        return 'Bounciness';\n                    case EASING_OPTIONS.step:\n                        return 'Steps';\n                    default:\n                        return 'N/A';\n                }\n            };\n            const easingArgLabel = getMultiSelectValue(getEasingArgLabel, null, null);\n            if (Timeline.selected.every((kf: GeckolibKeyframe) => isArgsEasing(kf.easing)) && easingArgLabel !== null) {\n                const argDefault = getMultiSelectValue(getEasingArgDefault, null, null);\n                const [displayedValue] = getMultiSelectValue('easingArgs', [argDefault], [argDefault]);\n                let scaleBar: HTMLElement = document.createElement('div');\n                keyframePanel.appendChild(scaleBar);\n                scaleBar.outerHTML = `<div class=\"bar flex\" id=\"keyframe_bar_easing_arg1\">\n                  <label class=\"tl\" style=\"font-weight: bolder; min-width: 90px;\">${easingArgLabel}</label>\n                  <input type=\"number\" id=\"keyframe_easing_scale\" class=\"dark_bordered code keyframe_input tab_target\" value=\"${displayedValue}\" oninput=\"updateKeyframeEasingArg(this)\" style=\"flex: 1; margin-right: 9px;\">\n                </div>`;\n                scaleBar = document.getElementById('keyframe_bar_easing_arg1');\n            }\n        }\n    }\n  }\n};\n\nconst getEasingInterpolation = (name: string) => {\n  const matches = name.match(easingRegExp);\n\n  if (matches) {\n    return matches[2].toLowerCase();\n  }\n\n  return name;\n};\n\nconst getEasingType = (name: string) => {\n  const matches = name.match(easingRegExp);\n\n  if (matches) {\n    return matches[1].toLowerCase();\n  }\n\n  return \"in\";\n};\n\nconst updateKeyframe = (kf: GeckolibKeyframe) => {\n  if (kf.data_points.length != 1 && kf.interpolation !== \"linear\") {\n    removeLastDataPoint()\n  }\n}\n\nconst updateKeyframeIcon = (kf: GeckolibKeyframe) => {\n  const element = document.getElementById(kf.uuid);\n\n  if (element && element.children && kf.easing)\n    element.children[0].className = 'easing-' + kf.easing.split(/\\.?(?=[A-Z])/).join('_').toLowerCase().replace(\"ease_\", \"\")\n}\n\nconst addDataPoint = () => {\n  Undo.initEdit({keyframes: Timeline.selected})\n  Timeline.selected.forEach(kf => {\n    if (kf.data_points.length < kf.animator.channels[kf.channel].max_data_points) {\n      kf.data_points.push(new KeyframeDataPoint(kf))\n      kf.data_points.last().extend(kf.data_points[0])\n    }\n  })\n  Animator.preview()\n  Undo.finishEdit('Add keyframe data point')\n}\n\nconst removeLastDataPoint = () => {\n  Undo.initEdit({keyframes: Timeline.selected})\n  Timeline.selected.forEach(kf => {\n    if (kf.data_points.length >= 2) {\n      kf.data_points.remove(kf.data_points.last());\n    }\n  })\n  Animator.preview()\n  Undo.finishEdit('Remove keyframe data point')\n}\n\nconst getIcon = (name: string) => {\n  switch(name) {\n    case \"back\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.94165 c 3.17500003,0 4.23333333,2.91041 5.29166663,-4.7625\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"bounce\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0.26458333,-0.26458 0.52916673,-0.26458 0.79375003,0 0.5291666,-0.52916 0.5291666,-0.52916 1.0583333,0 0.79375,-2.11666 1.5875,-2.11666 2.38125,0 0.2645833,-4.23333 1.0583333,-5.29165 1.0583333,-5.29165\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"circ\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 5.8208333,295.67706 5.8208333,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"cubic\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.82498 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"elastic\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,295.67706 c 0.79375003,0 0.79375003,-0.26458 1.32291663,-0.26458 0.5291667,0 0.79375,0.52917 1.3229167,0.52917 0.5291667,0 1.0094474,-1.83865 1.3229167,-0.79375 0.79375,2.64583 1.3229166,1.32292 1.3229166,-3.96874\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"expo\":\n    case \"in\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 4.23333333,0 5.29166663,-1.05833 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"inout\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 5.55625003,0 -0.26458334,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"out\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 0,-4.23333 1.05833333,-5.29166 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quad\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 C 3.175,296.47081 4.7625,293.03123 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quart\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.17500003,0 4.23333333,-2.64583 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"quint\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 3.43958333,0 4.23333333,-1.85208 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"sine\":\n      return '<svg width=\"24\" height=\"24\" viewBox=\"0 0 6.3499999 6.3500002\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 c 1.32291663,0 4.23333333,-3.43958 5.29166663,-5.29166\" style=\"fill:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    case \"step\":\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"m 0.52916667,296.47081 0,-1.32291 H 1.8520833 v -1.32292 H 3.175 v -1.32292 h 1.3229167 v -1.32291 l 1.3229166,1e-5\" style=\"fill:none;stroke-width:0.52899998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n    default: // linear\n      return '<svg viewBox=\"0 0 6.3499999 6.3500002\" height=\"24\" width=\"24\"><g transform=\"translate(0,-290.64998)\"><path d=\"M 0.52916667,296.47081 5.8208333,291.17915\" style=\"fill:none;stroke-width:0.52916667;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\"/></g></svg>';\n  }\n};"
  },
  {
    "path": "plugins/geckolib/src/ts/codec.ts",
    "content": "import armorTemplate from '../resources/armorTemplate.json';\nimport { isEmpty, isValidPath } from './utils';\nimport {\n    GECKOLIB_MODEL_ID,\n    GeckoModelType, PROPERTY_FILEPATH_CACHE,\n    PROPERTY_MODEL_TYPE,\n    PROPERTY_MODID, SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE,\n    SETTING_REMEMBER_EXPORT_LOCATIONS\n} from \"./constants\";\nimport { FormResultValue } from 'blockbench-types/generated/interface/form';\n\nconst codec = Codecs.bedrock;\n\n// This gets automatically applied by Blockbench, we don't need to do anything with it\nexport const format = new ModelFormat(GECKOLIB_MODEL_ID, {\n    id: GECKOLIB_MODEL_ID,\n    icon: \"view_in_ar\",\n    name: \"GeckoLib Animated Model\",\n    description: \"Animated Model for Java mods using GeckoLib\",\n    category: \"minecraft\",\n    box_uv: true,\n    optional_box_uv: true,\n    single_texture: true,\n    animated_textures: true,\n    bone_rig: true,\n    centered_grid: true,\n    rotate_cubes: true,\n    locators: true,\n    uv_rotation: true,\n    select_texture_for_particles: true,\n    texture_mcmeta: true,\n    animation_files: true,\n    display_mode: false,\n    animation_mode: true,\n    codec: Codecs.project,\n    animation_codec: Codecs.bedrock.format.animation_codec,\n});\n\n// Override the new project panel to allow customisation\nformat.new = function () {\n    if (newProject(this))\n        return openProjectSettingsDialog();\n}\n\n/**\n * Open a GeckoLib-customised project settings dialog (usually found when creating a new project, or via the File -> Project... menu item\n */\nexport function openProjectSettingsDialog() {\n    if (Project instanceof ModelProject)\n        return createProjectSettingsDialog(Project, createProjectSettingsForm(Project));\n}\n\n/**\n * Internal function for determining the placeholder value for the <code>model_identifier</code> form element in dialog windows\n */\nfunction getObjectIdPlaceholder(formResult?: { [key: string]: FormResultValue }) {\n    const name = formResult?.['name'] as string;\n    const modelType = formResult?.[PROPERTY_MODEL_TYPE] as string;\n\n    if (!name && !modelType)\n        return 'my_entity';\n\n    const invalidPathChar = new RegExp('[^_\\\\-/.a-z0-9]+', 'g')\n    const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g')\n\n    if (name)\n        return name.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidPathChar, \"\");\n\n    switch (GeckoModelType[modelType]) {\n        case GeckoModelType.ENTITY: return 'my_entity'\n        case GeckoModelType.BLOCK: return 'my_block';\n        case GeckoModelType.ITEM: return 'my_item';\n        case GeckoModelType.ARMOR: return 'my_armor';\n        case GeckoModelType.OBJECT: return 'my_object';\n        default: return 'my_entity';\n    }\n}\n\n/**\n * Create the Project Settings dialog form for use in both new projects and editing existing ones\n */\nfunction createProjectSettingsForm(Project: ModelProject) {\n    const form = { format: { type: 'info', label: 'data.format', text: Format.name || 'unknown', description: Format.description } as FormElementOptions }\n    const properties = ModelProject['properties'];\n\n    const modelType = properties[PROPERTY_MODEL_TYPE];\n\n    if (modelType) {\n        const currentType = Project[PROPERTY_MODEL_TYPE];\n        form[PROPERTY_MODEL_TYPE] = {\n            label: modelType.label,\n            description: modelType[\"description\"],\n            default: GeckoModelType.ENTITY.toUpperCase(),\n            value: typeof (currentType) === 'string' ?\n                GeckoModelType[currentType.toUpperCase()].toUpperCase() :\n                GeckoModelType.ENTITY.toUpperCase(),\n            placeholder: modelType[\"placeholder\"],\n            type: 'select',\n            options: modelType[\"options\"],\n        }\n    }\n\n    for (const key in properties) {\n        const property = properties[key];\n\n        if (property.exposed === false || !Condition(property.condition))\n            continue;\n\n        const entry = form[property.name] = {\n            label: property.label,\n            description: property[\"description\"],\n            value: Project[property.name],\n            placeholder: property[\"placeholder\"],\n            type: property.type\n        }\n\n        if (property.name === 'name') {\n            entry.label = 'Project Name'\n            entry.placeholder = 'My Project'\n            entry.description = 'The name of the Blockbench project'\n        }\n        else if (property.name === 'model_identifier') {\n            entry.label = 'Object ID'\n            entry.description = 'The registered id of the object this model represents, for exporting purposes'\n            entry.placeholder = getObjectIdPlaceholder()\n        }\n\n        switch (property.type) {\n            case 'boolean':\n                entry.type = 'checkbox'\n                break;\n            case 'string':\n                entry.type = 'text';\n                break;\n            default:\n                if (property[\"options\"]) {\n                    entry['options'] = property[\"options\"];\n                    entry.type = 'select';\n                }\n                break;\n        }\n    }\n\n    if (form['name'] && (Project.save_path || Project.export_path || Format.image_editor) && !Format['legacy_editable_file_name'])\n        delete form['name'];\n\n    form['uv_mode'] = {\n        label: 'dialog.project.default_uv_mode',\n        description: 'dialog.project.default_uv_mode.description',\n        type: 'select',\n        condition: Format.optional_box_uv,\n        options: {\n            face_uv: 'dialog.project.uv_mode.face_uv',\n            box_uv: 'dialog.project.uv_mode.box_uv',\n        },\n        value: Project.box_uv ? 'box_uv' : 'face_uv',\n    };\n\n    form['texture_size'] = {\n        label: 'dialog.project.texture_size',\n        type: 'vector',\n        dimensions: 2,\n        value: [Project.texture_width, Project.texture_height],\n        min: 1\n    };\n\n    return form;\n}\n\n/**\n * Create the 'new project' popup dialogue for GeckoLib projects.\n * <p>\n * The contents of this is mostly a copy of <code>project.js</code> \"project_window\" action declaration (Copyright Blockbench)<br>\n * Periodically check this is up-to-date with Blockbench to ensure ongoing compatibility\n * @return false if the user clicks <code>cancel</code>, otherwise true\n */\nfunction createProjectSettingsDialog(Project: ModelProject, form: { [formElement: string]: '_' | FormElementOptions }) {\n    const dialog = new Dialog({\n        id: 'project',\n        title: 'dialog.project.title',\n        width: 500,\n        form,\n        onConfirm: function (formResult) {\n            let save;\n            const box_uv = formResult['uv_mode'] == 'box_uv';\n            const texture_width = Math.clamp(formResult['texture_size'][0], 1, Infinity);\n            const texture_height = Math.clamp(formResult['texture_size'][1], 1, Infinity);\n\n            if (Project.box_uv != box_uv || Project.texture_width != texture_width || Project.texture_height != texture_height) {\n                // Adjust UV Mapping if resolution changed\n                if (!Project.box_uv && !box_uv && !Format['per_texture_uv_size'] && (Project.texture_width != texture_width || Project.texture_height != texture_height)) {\n                    save = Undo.initEdit({ elements: [...Cube.all, ...Mesh.all], uv_only: true, uv_mode: true } as UndoAspects)\n\n                    Cube.all.forEach(cube => {\n                        for (const key in cube.faces) {\n                            const uv = cube.faces[key].uv;\n                            uv[0] *= texture_width / Project.texture_width;\n                            uv[2] *= texture_width / Project.texture_width;\n                            uv[1] *= texture_height / Project.texture_height;\n                            uv[3] *= texture_height / Project.texture_height;\n                        }\n                    })\n                    Mesh.all.forEach(mesh => {\n                        for (const key in mesh.faces) {\n                            const uv = mesh.faces[key].uv;\n\n                            for (const vkey in uv) {\n                                uv[vkey][0] *= texture_width / Project.texture_width;\n                                uv[vkey][1] *= texture_height / Project.texture_height;\n                            }\n                        }\n                    })\n                }\n                // Convert UV mode per element\n                if (Project.box_uv != box_uv && ((box_uv && !Cube.all.find(cube => cube['box_uv'])) || (!box_uv && !Cube.all.find(cube => !cube['box_uv'])))) {\n                    if (!save)\n                        save = Undo.initEdit({ elements: Cube.all, uv_only: true, uv_mode: true } as UndoAspects);\n\n                    Cube.all.forEach(cube => cube.setUVMode(box_uv));\n                }\n\n                if (!save)\n                    save = Undo.initEdit({ uv_mode: true });\n\n                Project.texture_width = texture_width;\n                Project.texture_height = texture_height;\n\n                if (Format.optional_box_uv)\n                    Project.box_uv = box_uv;\n\n                Canvas.updateAllUVs();\n                updateSelection();\n            }\n\n            const properties = ModelProject['properties'];\n\n            for (const key in properties) {\n                properties[key].merge(Project, formResult);\n            }\n\n            Project.name = Project.name.trim();\n            Project.model_identifier = Project.model_identifier.trim();\n\n            if (save)\n                Undo.finishEdit('Change project UV settings');\n\n            Blockbench.dispatchEvent('update_project_settings', formResult);\n            BARS.updateConditions();\n\n            if (Project.EditSession) {\n                const metadata = {\n                    texture_width: Project.texture_width,\n                    texture_height: Project.texture_height,\n                    box_uv: Project.box_uv\n                };\n\n                for (const key in properties) {\n                    properties[key].copy(Project, metadata);\n                }\n\n                Project.EditSession.sendAll('change_project_meta', JSON.stringify(metadata));\n            }\n\n            const modelType = GeckoModelType[formResult[PROPERTY_MODEL_TYPE]]\n            Project[PROPERTY_MODEL_TYPE] = modelType;\n\n            if (modelType == GeckoModelType.ITEM)\n                Project.parent = 'builtin/entity';\n\n            if (Project.name === Format.name || Project.name === '')\n                Project.name = \"GeckoLib \" + Project[PROPERTY_MODEL_TYPE];\n\n            switch (modelType) {\n                case GeckoModelType.ARMOR:\n                    if (Outliner.root.length === 0) {\n                        Codecs.project.parse(armorTemplate, null);\n                    }\n                    else {\n                        alert('Unable to generate Armor Template over an existing model. Please select Armor on a new or empty project to use this model type.')\n\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n            }\n\n            Format.display_mode = modelType === GeckoModelType.ITEM || settings[SETTING_ALWAYS_SHOW_DISPLAY].value as boolean;\n\n            dialog.hide();\n        },\n        onFormChange(formResult) {\n            try {\n                document.getElementById('model_identifier')['placeholder'] = getObjectIdPlaceholder(formResult)\n            } // eslint-disable-next-line @typescript-eslint/no-unused-vars\n            catch (ex) { /* empty */ }\n        },\n    })\n\n    dialog.show()\n\n    return true;\n}\n\n/**\n * Export the item display json\n * <p>\n * Only called for GeckoLib projects\n */\nexport function buildDisplaySettingsJson(options = {}) {\n    if (!Project)\n        return;\n\n    const modelProperties: any = {}\n\n    if (options['comment'] || settings.credit.value)\n        modelProperties.credit = settings.credit.value\n\n    modelProperties.parent = !Project.parent ? 'builtin/entity' : Project.parent;\n\n    if (options['ambientocclusion'] || Project.ambientocclusion === false)\n        modelProperties.ambientocclusion = false\n\n    if (Project.texture_width !== 16 || Project.texture_height !== 16)\n        modelProperties.texture_size = [Project.texture_width, Project.texture_height]\n\n    if (options['front_gui_light'] || Project.front_gui_light)\n        modelProperties.gui_light = 'front';\n\n    if (options['overrides'] || Project.overrides)\n        modelProperties.overrides = Project.overrides;\n\n    if (options['display'] || !isEmpty(Project.display_settings)) {\n        const nonDefaultDisplays = {}\n\n        for (const slot in DisplayMode.slots) {\n            const perspective = DisplayMode.slots[slot]\n            // eslint-disable-next-line no-prototype-builtins\n            if (DisplayMode.slots.hasOwnProperty(slot) && Project.display_settings[perspective]) {\n                const display: any = Project.display_settings[perspective].export();\n\n                if (display)\n                    nonDefaultDisplays[perspective] = display\n            }\n\n        }\n\n        if (!isEmpty(nonDefaultDisplays))\n            modelProperties.display = nonDefaultDisplays\n    }\n\n    if ((options['textures'] || !isEmpty(Project.textures)) && Project[PROPERTY_MODID]) {\n        for (const texture of Project.textures) {\n            if (texture.particle || (settings[SETTING_AUTO_PARTICLE_TEXTURE].value && Object.keys(Project.textures).length === 1)) {\n                let name = texture.name;\n\n                if (name.indexOf(\".png\") > 0)\n                    name = name.substring(0, name.indexOf(\".png\"))\n\n                if (!isValidPath(name)) {\n                    name = name.toLowerCase().replace(\" \", \"_\")\n\n                    if (!isValidPath(name))\n                        continue;\n                }\n\n                name = (Project[PROPERTY_MODEL_TYPE] == GeckoModelType.BLOCK ? \"block/\" : \"item/\") + name;\n                name = Project[PROPERTY_MODID] + \":\" + name\n\n                modelProperties.textures = { 'particle': name };\n\n                break\n            }\n        }\n    }\n\n    Blockbench.export({\n        resource_id: 'model',\n        type: Codecs.java_block.name,\n        extensions: ['json'],\n        name: Project.model_identifier ? (Project.model_identifier + \".json\") : codec.fileName().replace(\".geo\", \"\"),\n        startpath: Project[PROPERTY_FILEPATH_CACHE].display,\n        content: JSON.stringify(modelProperties, null, 2),\n    }, file_path => {\n        const oldPath = Project[PROPERTY_FILEPATH_CACHE].display;\n        Project[PROPERTY_FILEPATH_CACHE].display = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n        if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].display)\n            Project.saved = false;\n    });\n\n    return this;\n}\n\n\nexport default codec;\n"
  },
  {
    "path": "plugins/geckolib/src/ts/constants.ts",
    "content": "/**\n * GeckoLib plugin model format ID. Used to identify model types generated from this plugin\n */\nexport const GECKOLIB_MODEL_ID = \"geckolib_model\"\n\n// Setting name constants\nexport const SETTING_AUTO_PARTICLE_TEXTURE = 'geckolib_auto_particle_texture';\nexport const SETTING_ALWAYS_SHOW_DISPLAY = 'geckolib_always_show_display';\nexport const SETTING_REMEMBER_EXPORT_LOCATIONS = 'geckolib_remember_export_locations';\nexport const SETTING_DEFAULT_MODID = 'geckolib_default_modid';\nexport const BAKE_IN_BEZIER_KEYFRAMES = \"geckolib_bake_in_bezier_keyframes\";\n\n// Property name constants\nexport const PROPERTY_MODID = 'geckolib_modid';\nexport const PROPERTY_MODEL_TYPE = 'geckolib_model_type';\nexport const PROPERTY_FILEPATH_CACHE = 'geckolib_filepath_cache';\n\n/**\n * Available GeckoLib model types\n */\nexport enum GeckoModelType {\n    ENTITY = 'Entity',\n    BLOCK = 'Block',\n    ITEM = 'Item',\n    ARMOR = 'Armor',\n    OBJECT = 'Object'\n}\n\n/**\n * Statically defined type for the filepath cache property, for ease of use\n */\nexport type GeckoFilepathCache = {model?: string, animation?: string, display?: string}"
  },
  {
    "path": "plugins/geckolib/src/ts/easing.ts",
    "content": "// The MIT license notice below applies to the function findIntervalBorderIndex\n/* The MIT License (MIT)\n\nCopyright (c) 2015 Boris Chumichev\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/**\n *\n * Utilizes bisection method to search an interval to which\n * point belongs to, then returns an index of left or right\n * border of the interval\n *\n * @param {Number} point\n * @param {Array} intervals\n * @param {Boolean} useRightBorder\n * @returns {Number}\n */\nfunction findIntervalBorderIndex(point: number, intervals: number[], useRightBorder: boolean) {\n    //If point is beyond given intervals\n    if (point < intervals[0])\n        return 0\n\n    if (point > intervals[intervals.length - 1])\n        return intervals.length - 1\n\n    //If point is inside interval\n    //Start searching on a full range of intervals\n    let indexOfNumberToCompare = 0;\n    let leftBorderIndex = 0;\n    let rightBorderIndex = intervals.length - 1\n\n    //Reduce searching range till it find an interval point belongs to using binary search\n    while (rightBorderIndex - leftBorderIndex !== 1) {\n        indexOfNumberToCompare = leftBorderIndex + Math.floor((rightBorderIndex - leftBorderIndex) / 2)\n        point >= intervals[indexOfNumberToCompare] ?\n            leftBorderIndex = indexOfNumberToCompare :\n            rightBorderIndex = indexOfNumberToCompare\n  }\n\n  return useRightBorder ? rightBorderIndex : leftBorderIndex\n}\n\nfunction stepRange(steps: number, stop = 1) {\n    if (steps < 2)\n        throw new Error(\"steps must be > 2, got:\" + steps);\n\n    const stepLength = stop / steps;\n\n    return Array.from({length: steps}, (_, i) => i * stepLength);\n}\n\ntype EasingFunction = (t: number) => number;\ntype EasingDirection = (easing: EasingFunction) => EasingFunction;\n\n// The MIT license notice below applies to the Easing class\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 */\nclass Easing {\n    /**\n     * A stepping function, returns 1 for any positive value of `n`.\n     */\n    static step0(n: number) {\n        return n > 0 ? 1 : 0;\n    }\n    /**\n     * A stepping function, returns 1 if `n` is greater than or equal to 1.\n     */\n    static step1(n: number) {\n        return n >= 1 ? 1 : 0;\n    }\n    /**\n     * A linear function, `f(t) = t`. Position correlates to elapsed time one to\n     * one.\n     *\n     * http://cubic-bezier.com/#0,0,1,1\n     */\n    static linear(t: number) {\n        return t;\n    }\n    /**\n     * A simple inertial interaction, similar to an object slowly accelerating to\n     * speed.\n     *\n     * http://cubic-bezier.com/#.42,0,1,1\n     */\n    // static ease(t) {\n    //     if (!ease) {\n    //         ease = Easing.bezier(0.42, 0, 1, 1);\n    //     }\n    //     return ease(t);\n    // }\n    /**\n     * A quadratic function, `f(t) = t * t`. Position equals the square of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInQuad\n     */\n    static quad(t: number) {\n        return t * t;\n    }\n    /**\n     * A cubic function, `f(t) = t * t * t`. Position equals the cube of elapsed\n     * time.\n     *\n     * http://easings.net/#easeInCubic\n     */\n    static cubic(t: number) {\n        return t * t * t;\n    }\n    /**\n     * A power function. Position is equal to the Nth power of elapsed time.\n     *\n     * n = 4: http://easings.net/#easeInQuart\n     * n = 5: http://easings.net/#easeInQuint\n     */\n    static poly(n: number) {\n        return (t: number) => Math.pow(t, n);\n    }\n    /**\n     * A sinusoidal function.\n     *\n     * http://easings.net/#easeInSine\n     */\n    static sin(t: number) {\n        return 1 - Math.cos((t * Math.PI) / 2);\n    }\n    /**\n     * A circular function.\n     *\n     * http://easings.net/#easeInCirc\n     */\n    static circle(t: number) {\n        return 1 - Math.sqrt(1 - t * t);\n    }\n    /**\n     * An exponential function.\n     *\n     * http://easings.net/#easeInExpo\n     */\n    static exp(t: number) {\n        return Math.pow(2, 10 * (t - 1));\n    }\n    /**\n     * A simple elastic interaction, similar to a spring oscillating back and\n     * forth.\n     *\n     * Default bounciness is 1, which overshoots a little bit once. 0 bounciness\n     * doesn't overshoot at all, and bounciness of N > 1 will overshoot about N\n     * times.\n     *\n     * http://easings.net/#easeInElastic\n     */\n    static elastic(bounciness = 1) {\n        const p = bounciness * Math.PI;\n        return (t: number) => 1 - Math.pow(Math.cos((t * Math.PI) / 2), 3) * Math.cos(t * p);\n    }\n    /**\n     * Use with `Animated.parallel()` to create a simple effect where the object\n     * animates back slightly as the animation starts.\n     *\n     * Wolfram Plot:\n     *\n     * - http://tiny.cc/back_default (s = 1.70158, default)\n     */\n    static back(s = 1.70158) {\n        return (t: number) => t * t * ((s + 1) * t - s);\n    }\n    /**\n     * Provides a simple bouncing effect.\n     *\n     * Props to Waterded#6455 for making the bounce adjustable and GiantLuigi4#6616 for helping clean it up\n     * using min instead of ternaries\n     * http://easings.net/#easeInBounce\n     */\n    static bounce(k = 0.5) {\n      const q = (x: number) => (121 / 16) * x * x;\n      const w = (x: number) => ((121 / 4) * k) * Math.pow(x - (6 / 11), 2) + 1 - k;\n      const r = (x: number) => 121 * k * k * Math.pow(x - (9 / 11), 2) + 1 - k * k;\n      const t = (x: number) => 484 * k * k * k * Math.pow(x - (10.5 / 11), 2) + 1 - k * k * k;\n      return (x: number) => Math.min(q(x), w(x), r(x), t(x));\n    }\n\n    /**\n     * Provides a cubic bezier curve, equivalent to CSS Transitions'\n     * `transition-timing-function`.\n     *\n     * A useful tool to visualize cubic bezier curves can be found at\n     * http://cubic-bezier.com/\n     */\n    // static bezier(x1, y1, x2, y2) {\n    //     const _bezier = require('./bezier');\n    //     return _bezier(x1, y1, x2, y2);\n    // }\n    /**\n     * Runs an easing function forwards.\n     */\n    static in(easing: EasingFunction) {\n        return easing;\n    }\n    /**\n     * Runs an easing function backwards.\n     */\n    static out(easing: EasingFunction) {\n        return (t: number) => 1 - easing(1 - t);\n    }\n    /**\n     * Makes any easing function symmetrical. The easing function will run\n     * forwards for half of the duration, then backwards for the rest of the\n     * duration.\n     */\n    static inOut(easing: EasingFunction) {\n        return (t: number) => {\n            if (t < 0.5) {\n                return easing(t * 2) / 2;\n            }\n            return 1 - easing((1 - t) * 2) / 2;\n        };\n    }\n}\n\nconst quart = Easing.poly(4);\nconst quint = Easing.poly(5);\nconst back = (direction: EasingDirection, scalar: number, t: number) => direction(Easing.back(1.70158 * scalar))(t);\nconst elastic = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.elastic(bounciness))(t);\nconst bounce = (direction: EasingDirection, bounciness: number, t: number) => direction(Easing.bounce(bounciness))(t);\n\nexport const easingFunctions = {\n  linear: Easing.linear,\n  step(steps, x) {\n    const intervals = stepRange(steps);\n    return intervals[findIntervalBorderIndex(x, intervals, false)];\n  },\n  easeInQuad: Easing.in(Easing.quad),\n  easeOutQuad: Easing.out(Easing.quad),\n  easeInOutQuad: Easing.inOut(Easing.quad),\n  easeInCubic: Easing.in(Easing.cubic),\n  easeOutCubic: Easing.out(Easing.cubic),\n  easeInOutCubic: Easing.inOut(Easing.cubic),\n  easeInQuart: Easing.in(quart),\n  easeOutQuart: Easing.out(quart),\n  easeInOutQuart: Easing.inOut(quart),\n  easeInQuint: Easing.in(quint),\n  easeOutQuint: Easing.out(quint),\n  easeInOutQuint: Easing.inOut(quint),\n  easeInSine: Easing.in(Easing.sin),\n  easeOutSine: Easing.out(Easing.sin),\n  easeInOutSine: Easing.inOut(Easing.sin),\n  easeInExpo: Easing.in(Easing.exp),\n  easeOutExpo: Easing.out(Easing.exp),\n  easeInOutExpo: Easing.inOut(Easing.exp),\n  easeInCirc: Easing.in(Easing.circle),\n  easeOutCirc: Easing.out(Easing.circle),\n  easeInOutCirc: Easing.inOut(Easing.circle),\n  easeInBack: back.bind(null, Easing.in),\n  easeOutBack: back.bind(null, Easing.out),\n  easeInOutBack: back.bind(null, Easing.inOut),\n  easeInElastic: elastic.bind(null, Easing.in),\n  easeOutElastic: elastic.bind(null, Easing.out),\n  easeInOutElastic: elastic.bind(null, Easing.inOut),\n  easeInBounce: bounce.bind(null, Easing.in),\n  easeOutBounce: bounce.bind(null, Easing.out),\n  easeInOutBounce: bounce.bind(null, Easing.inOut),\n};\n\nexport type EasingKey = keyof typeof easingFunctions;\n\n// Object with the same keys as easingFunctions and values of the stringified key names\nexport const EASING_OPTIONS = Object.freeze(Object.fromEntries(\n  Object.entries(easingFunctions).map(entry => ([entry[0], entry[0]]))\n) as { [Property in EasingKey]: string });\nexport const EASING_DEFAULT = 'linear';\n\nexport interface EasingProperties {\n  easing?: EasingKey | null;\n  easingArgs?: number[];\n\n}\n\nexport type GeckolibKeyframe = _Keyframe & EasingProperties & {bezier: boolean};\n\nexport const getEasingArgDefault = (kf: GeckolibKeyframe): number => {\n  switch (kf.easing) {\n    case EASING_OPTIONS.easeInBack:\n    case EASING_OPTIONS.easeOutBack:\n    case EASING_OPTIONS.easeInOutBack:\n    case EASING_OPTIONS.easeInElastic:\n    case EASING_OPTIONS.easeOutElastic:\n    case EASING_OPTIONS.easeInOutElastic:\n      return 1;\n    case EASING_OPTIONS.easeInBounce:\n    case EASING_OPTIONS.easeOutBounce:\n    case EASING_OPTIONS.easeInOutBounce:\n      return 0.5;\n    case EASING_OPTIONS.step:\n      return 5;\n    default:\n      return null;\n  }\n};\n\nexport const parseEasingArg = (kf: GeckolibKeyframe, value: string) => {\n  switch(kf.easing) {\n    case EASING_OPTIONS.easeInBack:\n    case EASING_OPTIONS.easeOutBack:\n    case EASING_OPTIONS.easeInOutBack:\n    case EASING_OPTIONS.easeInElastic:\n    case EASING_OPTIONS.easeOutElastic:\n    case EASING_OPTIONS.easeInOutElastic:\n    case EASING_OPTIONS.easeInBounce:\n    case EASING_OPTIONS.easeOutBounce:\n    case EASING_OPTIONS.easeInOutBounce:\n      return parseFloat(value);\n    case EASING_OPTIONS.step:\n      return Math.max(parseInt(value, 10), 2);\n    default:\n      return parseInt(value, 10);\n  }\n};\n\nexport function reverseEasing(easing?: EasingKey): EasingKey {\n  if (!easing)\n      return easing;\n\n  if (easing.startsWith(\"easeInOut\"))\n      return easing;\n\n  if (easing.startsWith(\"easeIn\"))\n      return easing.replace(\"easeIn\", \"easeOut\") as EasingKey;\n\n  if (easing.startsWith(\"easeOut\"))\n      return easing.replace(\"easeOut\", \"easeIn\") as EasingKey;\n\n  return easing;\n}\n\nexport const isArgsEasing = (easing = \"\") =>\n    easing.includes(\"Back\") ||\n    easing.includes(\"Elastic\") ||\n    easing.includes(\"Bounce\") ||\n    easing === EASING_OPTIONS.step;\n"
  },
  {
    "path": "plugins/geckolib/src/ts/events.ts",
    "content": "import {\n    addCodecCallback,\n    addEventListener,\n    addMonkeypatch, shouldShowDisplayPanel, isGeckoLibModel, Monkeypatches,\n    onlyIfGeckoLib,\n    removeCodecCallback,\n    removeEventListener, removeMonkeypatches, determineModelType\n} from \"./utils\";\nimport {GeckolibBoneAnimator} from \"./keyframe\";\nimport {\n    BAKE_IN_BEZIER_KEYFRAMES,\n    GeckoModelType,\n    PROPERTY_FILEPATH_CACHE,\n    PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY,\n    SETTING_REMEMBER_EXPORT_LOCATIONS\n} from \"./constants\";\nimport {openProjectSettingsDialog} from \"./codec\";\nimport {GeckolibKeyframe} from \"./easing\";\nimport * as molang from \"blockbench-types/generated/util/molang\";\n\nexport function addEventListeners() {\n    addCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse))\n    addCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile))\n    addEventListener('select_mode', onlyIfGeckoLib(onModeSelect));\n    addEventListener('select_project', onlyIfGeckoLib(onProjectSelect));\n    addEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged));\n    addEventListener('save_project', onlyIfGeckoLib(onProjectSave));\n    addEventListener('convert_format', onlyIfGeckoLib(onProjectConvert));\n    addMonkeypatch(Animator, null, \"buildFile\", monkeypatchAnimatorBuildFile);\n    addMonkeypatch(Codecs.bedrock.format.animation_codec, null, \"loadFile\", monkeypatchAnimatorLoadFile);\n    addMonkeypatch(Blockbench, null, \"export\", monkeypatchBlockbenchExport);\n    addMonkeypatch(BarItems, 'project_window', \"click\", monkeypatchProjectWindowClick);\n}\n\nexport function removeEventListeners() {\n    removeCodecCallback(Codecs.project, 'parse', onlyIfGeckoLib(onProjectParse))\n    removeCodecCallback(Codecs.bedrock, 'compile', onlyIfGeckoLib(onBedrockCompile))\n    removeEventListener('select_mode', onlyIfGeckoLib(onModeSelect));\n    removeEventListener('select_project', onlyIfGeckoLib(onProjectSelect));\n    removeEventListener('update_project_settings', onlyIfGeckoLib(onSettingsChanged));\n    removeMonkeypatches();\n}\n\n/**\n * When an existing GeckoLib project is being read from file\n */\nfunction onProjectParse(e: any) {\n    onSettingsChanged();\n\n    if (!e.model[PROPERTY_MODEL_TYPE]) {\n        e.model[PROPERTY_MODEL_TYPE] = determineModelType(e.model);\n        Project.saved = false;\n    }\n\n    // Because the project hasn't had its model properties applied at this stage\n    Format.display_mode = (e.model[PROPERTY_MODEL_TYPE] && e.model[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM) || settings[SETTING_ALWAYS_SHOW_DISPLAY].value as boolean;\n}\n\n/**\n * When the Blockbench project is being saved\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSave(e: {model: object, options: any }) {\n    if (!e.model[PROPERTY_MODEL_TYPE])\n        e.model[PROPERTY_MODEL_TYPE] = determineModelType(e.model);\n\n    // Explicitly checked for undefined here because Blockbench attempts a save when removing the plugin\n    if (settings[SETTING_REMEMBER_EXPORT_LOCATIONS] && !settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value)\n        e.model[PROPERTY_FILEPATH_CACHE] = {}\n}\n\n/**\n * When a project is being converted from another format to a GeckoLib model\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectConvert(e: any) {\n    onSettingsChanged();\n}\n\n/**\n * When the GeckoLib project settings are changed, or a GeckoLib project is being opened or swapped to\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onSettingsChanged() {\n    if (Modes.selected instanceof Mode)\n        Modes.selected.select()\n\n    if (Project instanceof ModelProject) {\n        if (!Project[PROPERTY_MODEL_TYPE]) {\n            Project[PROPERTY_MODEL_TYPE] = determineModelType();\n            Project.saved = false;\n        }\n\n        if (Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM && (!Project.parent || Project.parent !== 'builtin/entity')) {\n            Project.parent = 'builtin/entity';\n            Project.saved = false;\n        }\n    }\n\n    Format.display_mode = shouldShowDisplayPanel();\n}\n\n/**\n * When opening a project tab, whether from an existing project, creating a new one, or swapping open tabs\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onProjectSelect() {\n    onSettingsChanged()\n}\n\n/**\n * When selecting edit/paint/display/animate/etc\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onModeSelect(e: any) {\n    // Offset the display emulator to account for GeckoLib's +0.51 manual offset\n    // This is a legacy patch as Blockbench no longer does this internally\n    if (e.mode.id == 'display')\n        (Project as ModelProject).model_3d.position.y = 0;\n}\n\n/**\n * When the model geometry is being compiled for export\n * <p>\n * Only called for GeckoLib projects\n */\nfunction onBedrockCompile(e: any) {\n    // Remove display transforms from non-bedrock geometry\n    e.model[\"minecraft:geometry\"]?.forEach((geo: Map<string, any>) => delete geo[\"item_display_transforms\"])\n\n    // Force-suppress specific version advancement for non-bedrock models to prevent legacy version crashes until a better system is established\n    switch (e.model.format_version) {\n        case \"1.14.0\":\n        case \"1.21.0\":\n        case \"1.21.20\":\n            e.model.format_version = \"1.12.0\"\n            break;\n        default:\n            break;\n    }\n}\n\n/**\n * When the project settings window is being opened, either via a new project or the File -> Project... menu item\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchProjectWindowClick() {\n    if (isGeckoLibModel()) {\n        openProjectSettingsDialog();\n    }\n    else {\n       Monkeypatches.get(BarItems).click();\n    }\n}\n\n/**\n * When any file is being exported to disk by Blockbench\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchBlockbenchExport(options, cb) {\n    if (!isGeckoLibModel()) {\n        Monkeypatches.get(Blockbench).export(options, cb);\n\n        return;\n    }\n\n    if (Project instanceof ModelProject) {\n        if (options.resource_id === 'animation' && options.type === 'JSON Animation') { // Animation JSON\n            const fileName = Project.model_identifier && Project.model_identifier + \".animation\";\n            options.startpath = Project[PROPERTY_FILEPATH_CACHE].animation;\n            const parentCallback = cb;\n            cb = (file_path: string) => {\n                if (parentCallback)\n                    parentCallback(file_path);\n\n                const oldPath = Project[PROPERTY_FILEPATH_CACHE].animation;\n                Project[PROPERTY_FILEPATH_CACHE].animation = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n                if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].animation)\n                    Project.saved = false;\n            }\n\n            if (fileName)\n                options.name = fileName;\n        }\n        else if (options.resource_id === 'model' && options.type === 'Bedrock Model') { // Geo\n            const fileName = Project.model_identifier && Project.model_identifier + \".geo\";\n            options.startpath = Project[PROPERTY_FILEPATH_CACHE].model;\n            const parentWriter = options.custom_writer;\n            const parentCallback = cb;\n\n            if (parentWriter) {\n                options.custom_writer = (content, filePath, callback) => {\n                    parentWriter(content, filePath, callback);\n                    callback(filePath)\n                }\n            }\n\n            cb = file_path => {\n                if (parentCallback)\n                    parentCallback(file_path);\n\n                const oldPath = Project[PROPERTY_FILEPATH_CACHE].model;\n                Project[PROPERTY_FILEPATH_CACHE].model = settings[SETTING_REMEMBER_EXPORT_LOCATIONS].value ? file_path : undefined;\n\n                if (oldPath !== Project[PROPERTY_FILEPATH_CACHE].model)\n                    Project.saved = false;\n            }\n\n            if (fileName)\n                options.name = fileName;\n        }\n    }\n\n    Monkeypatches.get(Blockbench).export(options, cb);\n}\n\n/**\n * When the animation file is being loaded into the project\n * <p>\n * The project <b><u>may not</u></b> be a GeckoLib project, so check it as necessary\n */\nfunction monkeypatchAnimatorLoadFile(file, exportingAnims) {\n    // eslint-disable-next-line no-undef\n    const json = file.json || autoParseJSON(file.content);\n    const path = file.path;\n    const new_animations = [];\n\n    function geoLoopToBbLoop(jsonLoop) {\n        if (jsonLoop) {\n            if (typeof jsonLoop === 'boolean')\n                return jsonLoop ? 'loop' : 'once'\n\n            if (typeof jsonLoop === 'string') {\n                if (jsonLoop === \"hold_on_last_frame\")\n                    return 'hold'\n\n                if (jsonLoop === \"loop\" || jsonLoop === \"true\")\n                    return 'loop'\n            }\n        }\n\n        return 'once'\n    }\n\n    function getKeyframeDataPoints(channel: string, source: any) {\n        if (source instanceof Array)\n            return invertAnimKeyframe(channel, [{x: source[0], y: source[1], z: source[2]}])\n\n        if (['number', 'string'].includes(typeof source))\n            return invertAnimKeyframe(channel, [{x: source, y: source, z: source}])\n\n        if (typeof source == 'object') {\n            if (source.vector)\n                return getKeyframeDataPoints(channel, source.vector);\n\n            const points = [];\n\n            if (source.pre)\n                points.push(getKeyframeDataPoints(channel, source.pre)[0])\n\n            if (source.post)\n                points.push(getKeyframeDataPoints(channel, source.post)[0])\n\n            return points;\n        }\n    }\n\n    // Because Blockbench now implicitly inverts rotation and position keyframes on export and import (??)\n    function invertAnimKeyframe(channel: string, value: any) {\n        if (channel != 'position' && channel != 'rotation')\n            return value;\n\n        if (value instanceof Array) {\n            switch (value.length) {\n                case 1: return [invertAnimKeyframe(channel, value[0])];\n                case 3: return [invertAnimKeyframe(channel, value[0]), channel == 'rotation' ? invertAnimKeyframe(channel, value[1]) : value[1], value[2]];\n                default: return value;\n            }\n        }\n        else if (typeof value == 'object') {\n            if (value.x)\n                value.x = invertMolang(value.x);\n\n            if (value.y && channel == 'rotation')\n                value.y = invertMolang(value.y);\n\n            return value;\n        }\n\n        return invertMolang(value);\n    }\n\n    if (json && typeof json.animations === 'object') {\n        for (const animName in json.animations) {\n            if (exportingAnims && !exportingAnims.includes(animName))\n                continue;\n\n            //Animation\n            const animData = json.animations[animName]\n            let animation: any = new Animation({\n                name: animName,\n                path,\n                loop: geoLoopToBbLoop(animData.loop),\n                override: animData.override_previous_animation,\n                anim_time_update: (typeof animData.anim_time_update == 'string'\n                    ? animData.anim_time_update.replace(/;(?!$)/, ';\\n')\n                    : animData.anim_time_update),\n                blend_weight: (typeof animData.blend_weight == 'string'\n                    ? animData.blend_weight.replace(/;(?!$)/, ';\\n')\n                    : animData.blend_weight),\n                length: animData.animation_length\n            } as any)\n\n            animation = animation.add()\n\n            //Bones\n            if (animData.bones) {\n                for (const boneName in animData.bones) {\n                    const bone = animData.bones[boneName]\n                    const lowercase_bone_name = boneName.toLowerCase();\n                    const group = Group.all.find(group => group.name.toLowerCase() == lowercase_bone_name)\n                    const uuid = group ? group.uuid : guid();\n\n                    const boneAnimator = new GeckolibBoneAnimator(uuid, animation, boneName);\n                    animation.animators[uuid] = boneAnimator;\n                    //Channels\n                    for (const channel in bone) {\n                        if (Animator.possible_channels[channel]) {\n                            if (typeof bone[channel] === 'string' || typeof bone[channel] === 'number' || bone[channel] instanceof Array) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel][\"easing\"],\n                                    easingArgs: bone[channel][\"easingArgs\"],\n                                    data_points: getKeyframeDataPoints(channel, bone[channel]),\n                                })\n                            }\n                            else if (typeof bone[channel] === 'object' && bone[channel].post) {\n                                boneAnimator.addKeyframe({\n                                    time: 0,\n                                    channel,\n                                    easing: bone[channel].easing == \"bezier\" ? undefined : bone[channel].easing,\n                                    easingArgs: bone[channel][\"easingArgs\"],\n                                    interpolation: bone[channel].easing == \"bezier\" ? \"bezier\" : bone[channel].lerp_mode,\n                                    data_points: getKeyframeDataPoints(channel, bone[channel]),\n                                    bezier_right_time: bone[channel].right_time,\n                                    bezier_left_time: bone[channel].left_time,\n                                    bezier_left_value: bone[channel].left,\n                                    bezier_right_value: bone[channel].right\n                                });\n                            }\n                            else if (typeof bone[channel] === 'object') {\n                                for (const timestamp in bone[channel]) {\n                                    boneAnimator.addKeyframe({\n                                        time: parseFloat(timestamp),\n                                        channel,\n                                        easing: bone[channel][timestamp].easing == \"bezier\" ? undefined : bone[channel][timestamp].easing,\n                                        easingArgs: bone[channel][timestamp].easingArgs,\n                                        interpolation: bone[channel][timestamp].easing == \"bezier\" ? \"bezier\" : bone[channel][timestamp].lerp_mode,\n                                        data_points: getKeyframeDataPoints(channel, bone[channel][timestamp]),\n                                        bezier_right_time: bone[channel][timestamp].right_time,\n                                        bezier_left_time: bone[channel][timestamp].left_time,\n                                        bezier_left_value: bone[channel][timestamp].left,\n                                        bezier_right_value: bone[channel][timestamp].right\n                                    });\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n            if (animData.sound_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.sound_effects) {\n                    const sounds = animData.sound_effects[timestamp];\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'sound',\n                        time: parseFloat(timestamp),\n                        data_points: sounds instanceof Array ? sounds : [sounds]\n                    })\n                }\n            }\n\n            if (animData.particle_effects) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.particle_effects) {\n                    let particles = animData.particle_effects[timestamp];\n\n                    if (!(particles instanceof Array))\n                        particles = [particles];\n\n                    particles.forEach(particle => {\n                        if (particle)\n                            particle.script = particle.pre_effect_script;\n                    })\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'particle',\n                        time: parseFloat(timestamp),\n                        data_points: particles\n                    })\n                }\n            }\n\n            if (animData.timeline) {\n                if (!animation.animators.effects)\n                    animation.animators.effects = new EffectAnimator(animation);\n\n                for (const timestamp in animData.timeline) {\n                    const entry = animData.timeline[timestamp];\n                    const script = entry instanceof Array ? entry.join('\\n') : entry;\n\n                    animation.animators.effects.addKeyframe({\n                        channel: 'timeline',\n                        time: parseFloat(timestamp),\n                        data_points: [{script}]\n                    })\n                }\n            }\n\n            animation.calculateSnappingFromKeyframes();\n\n            if (!Animator.selected && Animator.open)\n                animation.select()\n\n            new_animations.push(animation)\n        }\n    }\n\n    return new_animations\n}\n\n/**\n * When the animations JSON is being compiled for export\n * <p>\n * Makes sure bezier keyframes get exported correctly rather than being baked.\n */\nfunction monkeypatchAnimatorBuildFile() {\n    const bezierKeys:GeckolibKeyframe[] = [];\n\n    if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) {\n        const arg = arguments[1][0];\n        const animation = this.animations.find(anim => anim.name == arg);\n\n        if (animation) {\n            for (const uuid in animation.animators) {\n                const animator = animation.animators[uuid];\n\n                if (!animator.keyframes.length && !animator.rotation_global)\n                    continue;\n\n                if (animator.type == 'bone') {\n                    for (const channel in Animator.possible_channels) {\n                        if (!animator[channel]?.length)\n                            continue;\n\n                        const sorted_keyframes = animator[channel].slice().sort((a, b) => a.time - b.time);\n\n                        sorted_keyframes.forEach((kf: GeckolibKeyframe) => {\n                            if (kf.interpolation == \"bezier\") {\n                                bezierKeys[bezierKeys.length] = kf;\n                                kf.bezier = true;\n                            }\n                        });\n                    }\n                }\n            }\n        }\n    }\n\n    const result = Monkeypatches.get(Animator).buildFile.apply(this, arguments);\n\n    if (isGeckoLibModel() && !settings[BAKE_IN_BEZIER_KEYFRAMES].value) {\n        result.geckolib_format_version = 2\n\n        bezierKeys.forEach((kf) => {\n            kf.bezier = false;\n            kf.easing = undefined;\n        });\n    }\n\n    return result;\n}"
  },
  {
    "path": "plugins/geckolib/src/ts/index.ts",
    "content": "import semverCoerce from 'semver/functions/coerce';\nimport semverSatisfies from 'semver/functions/satisfies';\nimport packageJson from '../package.json';\nimport { loadAnimationUI, unloadAnimationUI } from './animationUi';\nimport {shouldShowDisplayPanel, isEmpty, isGeckoLibModel, isValidNamespace, make} from './utils';\nimport { loadKeyframeOverrides, unloadKeyframeOverrides } from './keyframe';\nimport codec, {buildDisplaySettingsJson, format} from './codec';\nimport {\n    GeckoFilepathCache,\n    GECKOLIB_MODEL_ID,\n    GeckoModelType, PROPERTY_FILEPATH_CACHE, PROPERTY_MODEL_TYPE, PROPERTY_MODID,\n    SETTING_ALWAYS_SHOW_DISPLAY, SETTING_AUTO_PARTICLE_TEXTURE, BAKE_IN_BEZIER_KEYFRAMES,\n    SETTING_DEFAULT_MODID,\n    SETTING_REMEMBER_EXPORT_LOCATIONS,\n} from \"./constants\";\nimport {addEventListeners, removeEventListeners} from \"./events\";\n\nconst { version, author, pluginOptions } = packageJson;\nconst SUPPORTED_BB_VERSION_RANGE = `${pluginOptions.min_version} - ${pluginOptions.max_version}`;\n// eslint-disable-next-line @typescript-eslint/no-require-imports\nconst css = require('../resources/easing_keyframes.css').toString();\n\nif (!semverSatisfies(semverCoerce(Blockbench.version), SUPPORTED_BB_VERSION_RANGE))\n  alert(`GeckoLib Animation Utils currently only supports Blockbench ${SUPPORTED_BB_VERSION_RANGE}. Please ensure you are using this version of Blockbench to avoid bugs and undefined behavior.`);\n\n// Register the plugin and define what it adds\n(function () {\n  let pluginSettings: Setting[];\n  let pluginProperties: Property[];\n  let pluginMenuItems: { action: Action, menuCategory: string }[];\n\n    // @ts-expect-error - Typescript doesn't like that the \"Tags\" collection could be empty instead of implicitly non-empty\n    BBPlugin.register(\"geckolib\", Object.assign(\n      {},\n      pluginOptions,\n      {\n        name: pluginOptions.title,\n        version,\n        author,\n        onload() {\n          Blockbench.addCSS(css);\n\n          addEventListeners();\n          loadAnimationUI();\n          loadKeyframeOverrides();\n\n          pluginSettings = createPluginSettings();\n          pluginProperties = createPluginProperties();\n          pluginMenuItems = createPluginMenuItems();\n\n          for (const menuItem of pluginMenuItems as { action: Action, menuCategory: string }[]) {\n            MenuBar.addAction(menuItem.action, menuItem.menuCategory);\n          }\n\n          console.log(\"Loaded GeckoLib plugin\")\n        },\n        onunload() {\n          for (const setting of pluginSettings) {\n            setting.delete();\n          }\n\n          for (const property of pluginProperties) {\n            property.delete();\n          }\n\n          for (const menuItem of pluginMenuItems) {\n            menuItem.action.delete();\n          }\n\n          unloadKeyframeOverrides();\n          unloadAnimationUI();\n          removeEventListeners()\n          format.delete();\n          console.clear();\n        },\n      }\n  ));\n})();\n\n/**\n * Create and return the plugin's settings.\n * <p>\n * These are found in the Settings panel in the plugin info window\n */\nfunction createPluginSettings(): Setting[] {\n  return [\n    new Setting(SETTING_AUTO_PARTICLE_TEXTURE, {\n      value: false,\n      category: \"export\",\n      name: \"Auto-compute block/item particle texture\",\n      description: \"Attempt to auto-compute the particle texture for a GeckoLib block/item model if one isn't already specified when exporting the display settings json\"\n    }),\n    new Setting(BAKE_IN_BEZIER_KEYFRAMES, {\n      value: false,\n      category: \"export\",\n      name: \"Bake in bezier keyframes\",\n      description: \"When true Blockbench makes a ton of linear keyframes to form the illusion of a bezier easing, rather than properly setting the easing to bezier.\"\n    }),\n    new Setting(SETTING_ALWAYS_SHOW_DISPLAY, {\n      value: false,\n      category: \"edit\",\n      name: \"Always show display tab\",\n      description: \"Force the Display tab to always show, even when not an Item type model\"\n    }),\n    new Setting(SETTING_REMEMBER_EXPORT_LOCATIONS, {\n      value: true,\n      category: \"export\",\n      name: \"Remember file export locations\",\n      description: \"Remember where you export model/display/animation files to for re-use. Stores the file paths in the bbmodel project file.\"\n    }),\n    make(\n        new Setting(SETTING_DEFAULT_MODID, {\n          // The below is absolutely disgusting, but I have no choice because this is a bug in Blockbench's API\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          type: 'text',\n          value: \"\",\n          category: \"export\",\n          name: \"Default Mod ID\",\n          description: \"Default Mod ID for models (if applicable)\"\n        }),\n        setting => {\n          setting.onChange = function() {\n            const invalidNamespaceChar = new RegExp('[^_\\\\-.a-z0-9]+', 'g')\n            const pseudoWhitepaceChar = new RegExp('[\\\\s&-]+', 'g')\n\n            this.master_value = this.master_value.toLowerCase().replace(pseudoWhitepaceChar, \"_\").replace(invalidNamespaceChar, \"\")\n\n            return {};\n          }\n        }\n    )\n  ];\n}\n\n/**\n * Create and return the plugin's properties.\n * <p>\n * These are metadata values stored in the project, usually used in project settings windows\n */\nfunction createPluginProperties(): Property[] {\n  return [\n      make(\n          new Property(ModelProject, \"string\", PROPERTY_MODID, {\n              label: \"Mod ID\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              values: [],\n              merge_validation: isValidNamespace\n          }),\n          property => {\n            property['placeholder'] = 'my_modid';\n            property['description'] = 'The modid of the mod this model is for';\n            property.getDefault = function() {\n              return settings[SETTING_DEFAULT_MODID].value as string;\n            };\n          }\n      ),\n      make(\n          new Property(ModelProject, \"object\", PROPERTY_MODEL_TYPE, {\n              label: \"Model Type\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              exposed: false,\n              options: GeckoModelType,\n              values: Object.values(GeckoModelType)\n          }),\n          property => {\n              property.merge = (instance, data) => {\n                  instance[PROPERTY_MODEL_TYPE] = data[PROPERTY_MODEL_TYPE] as string;\n              }\n              property['description'] = 'The type of GeckoLib object this model is for. Leave as the default value if unsure';\n          }\n      ),\n      make(\n          new Property(ModelProject, \"instance\", PROPERTY_FILEPATH_CACHE, {\n              label: \"GeckoLib Filepath Cache\",\n              condition: {\n                  formats: [GECKOLIB_MODEL_ID]\n              },\n              exposed: false,\n              values: []\n          }),\n          property => {\n              property.default = {} as GeckoFilepathCache;\n          }\n      )\n  ];\n}\n\n/**\n * Create and return the plugin's menu items\n * <p>\n * These are added to Blockbench's menu bar or submenus\n */\nfunction createPluginMenuItems(): { action: Action, menuCategory: string }[] {\n  return [\n    {\n      action: new Action(\"export_geckolib_model\", {\n        name: \"Export GeckoLib Model\",\n        icon: \"archive\",\n        description: \"Export your model geometry as a model for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel(),\n        click: function () {\n          codec.export();\n        },\n      }),\n      menuCategory: 'file.export'\n    },\n    {\n      action: new Action(\"export_geckolib_display\", {\n        name: \"Export GeckoLib Display Settings\",\n        icon: \"icon-bb_interface\",\n        description: \"Export your item/block display settings for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel() && shouldShowDisplayPanel(),\n        click: buildDisplaySettingsJson,\n      }),\n      menuCategory: 'file.export'\n    },\n    {\n      action: new Action(\"export_geckolib_animations\", {\n        name: \"Export GeckoLib Animations\",\n        icon: \"movie\",\n        description: \"Export your model animations for GeckoLib.\",\n        category: \"file\",\n        condition: () => isGeckoLibModel() && !isEmpty(AnimationItem.all) && typeof BarItems['export_animation_file'] === 'object',\n        click: e => (BarItems['export_animation_file'] as Action).trigger(e),\n      }),\n      menuCategory: 'file.export'\n    }\n  ];\n}\n"
  },
  {
    "path": "plugins/geckolib/src/ts/keyframe.ts",
    "content": "import groupBy from 'lodash/groupBy';\nimport mapValues from 'lodash/mapValues';\nimport {addMonkeypatch, Monkeypatches} from './utils';\nimport {\n    EASING_DEFAULT,\n    easingFunctions,\n    type EasingKey,\n    EasingProperties,\n    GeckolibKeyframe,\n    getEasingArgDefault,\n    isArgsEasing,\n    reverseEasing\n} from './easing';\nimport {GECKOLIB_MODEL_ID} from \"./constants\";\n\nexport function loadKeyframeOverrides() {\n    // @ts-ignore\n    addMonkeypatch(Keyframe, \"prototype\", \"getLerp\", keyframeGetLerp);\n    // @ts-ignore\n    addMonkeypatch(Keyframe, \"prototype\", \"compileBedrockKeyframe\", keyframeCompileBedrock);\n    // @ts-ignore\n    addMonkeypatch(Keyframe, \"prototype\", \"getUndoCopy\", keyframeGetUndoCopy);\n    // @ts-ignore\n    addMonkeypatch(Keyframe, \"prototype\", \"extend\", keyframeExtend);\n\n    addMonkeypatch(BarItems.reverse_keyframes, null, \"click\", onReverseKeyframes);\n}\n\nexport function unloadKeyframeOverrides() {\n    //No-op for now since monkeypatches are unloaded automatically\n}\n\ninterface GeckolibKeyframeOptions extends KeyframeOptions {\n    easing: EasingKey\n    easingArgs: number[] | null | undefined\n}\n\n// This subclass isn't strictly needed at runtime but was required to appease the compiler due to our monkeypatch\nexport class GeckolibBoneAnimator extends BoneAnimator {\n    public addKeyframe(data: GeckolibKeyframeOptions, uuid?: string): _Keyframe {\n        const keyframe = super.addKeyframe(data, uuid);\n\n        if (data.bezier_left_time)\n            keyframe.bezier_left_time = data.bezier_left_time;\n\n        if (data.bezier_right_time)\n            keyframe.bezier_right_time = data.bezier_right_time;\n\n        if (data.bezier_right_value)\n            keyframe.bezier_right_value = data.bezier_right_value;\n\n        if (data.bezier_left_value)\n            keyframe.bezier_left_value = data.bezier_left_value;\n\n        return keyframe;\n    }\n}\n\nfunction lerp(start: number, stop: number, amt: number) {\n    return amt * (stop - start) + start;\n}\n\n// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\nfunction keyframeGetLerp(other, axis, amount, allow_expression) {\n    if (Format.id !== GECKOLIB_MODEL_ID)\n        // @ts-ignore\n        return Monkeypatches.get(Keyframe).getLerp.apply(this, arguments);\n\n    const easing = other.easing || EASING_DEFAULT;\n    let easingFunc = easingFunctions[easing];\n\n    if (isArgsEasing(easing)) {\n        const easingValue = Array.isArray(other.easingArgs) && other.easingArgs.length > 0\n            ? other.easingArgs[0]\n            : getEasingArgDefault(other);\n        easingFunc = easingFunc.bind(null, easingValue);\n    }\n\n    const easedAmount = easingFunc(amount);\n    const start = this.data_points.length == 1 ? this.calc(axis) : this.calc(axis, 1);\n    const stop = other.calc(axis);\n    const result = lerp(start, stop, easedAmount);\n\n    if (Number.isNaN(result))\n        throw new Error('batman');\n\n    return result;\n}\n\n// Calculate GeckoLib's keyframe values in place of the built-in Bedrock compiler.\n// Additionally, invert the keyframe to match Blockbench's internal handling\nfunction geckolibGetArray(data_point: number, channel: string) {\n    const {easing, easingArgs, getArray} = this;\n    let result = getArray.apply(this, [data_point]);\n\n    if ((this as GeckolibKeyframe).bezier) {\n        result = {vector: result, easing: \"bezier\", left: this.bezier_left_value, left_time: this.bezier_left_time, right: this.bezier_right_value, right_time: this.bezier_right_time};\n    }\n    else if (Format.id === GECKOLIB_MODEL_ID) {\n        if (this.data_points.length != 1) {\n            const postResult = getArray.apply(this, [1]);\n\n            if (!easing && result[0] === postResult[0] && result[1] === postResult[1] && result[2] === postResult[2]) {\n                result = {vector: result, easing};\n            }\n            else {\n                result = {\n                    pre: checkAndPatchKeyframeValues(result, channel),\n                    post: checkAndPatchKeyframeValues(getArray.apply(this, [1]), channel), easing\n                };\n            }\n        }\n        else {\n            result = {vector: result, easing};\n        }\n\n        if (isArgsEasing(easing))\n            result.easingArgs = easingArgs;\n    }\n\n    if (result.vector)\n        result.vector = checkAndPatchKeyframeValues(result.vector, channel);\n\n    return result;\n}\n\n// Invert the molang value to match Blockbench's internal handling\n// Also swap out empty molang queries because Blockbench now sends them as empty quotes for some reason\nfunction checkAndPatchKeyframeValues(vector: any[], channel: string) {\n    for (let i = 0; i <= 2; i++) {\n        if (vector[i] === \"\")\n            vector[i] = 0;\n    }\n    \n    if (channel === 'rotation' || channel === 'position') {\n        vector[0] = invertMolang(vector[0]);\n\n        if (channel === 'rotation')\n            vector[1] = invertMolang(vector[1]);\n    }\n    \n    return vector;\n}\n\n// Replace the bedrock keyframe compilation with a custom handler\nfunction keyframeCompileBedrock() {\n    if (Format.id !== GECKOLIB_MODEL_ID || !this.transform)\n        // @ts-ignore\n        return Monkeypatches.get(Keyframe).compileBedrockKeyframe.apply(this, arguments);\n\n    if (this.interpolation == 'catmullrom') {\n        const previous = this.getPreviousKeyframe.apply(this);\n        const include_pre = (!previous && this.time > 0) || (previous && previous.interpolation != 'catmullrom');\n\n        return {\n            pre: include_pre ? geckolibGetArray.call(this, [0], this.channel) : undefined,\n            post: geckolibGetArray.call(this, [include_pre ? 1 : 0], this.channel),\n            lerp_mode: this.interpolation,\n        }\n    }\n\n    if (this.data_points.length == 1)\n        return geckolibGetArray.call(this, 0, this.channel);\n\n    return geckolibGetArray.call(this, [0], this.channel);\n}\n\nfunction keyframeGetUndoCopy() {\n    const {easing, easingArgs} = this;\n    // @ts-ignore\n    const result = Monkeypatches.get(Keyframe).getUndoCopy.apply(this, arguments);\n\n    if (Format.id === GECKOLIB_MODEL_ID) {\n        Object.assign(result, {easing});\n\n        if (isArgsEasing(easing))\n            result.easingArgs = easingArgs;\n    }\n\n    return result;\n}\n\n// Append GeckoLib data to Keyframes when constructed\nfunction keyframeExtend(dataIn) {\n    const data = Object.assign({}, dataIn);\n\n    if (Format.id === GECKOLIB_MODEL_ID) {\n        if (typeof data.values === 'object') {\n            if (data.values.easing !== undefined)\n                Merge.string(this, data.values, 'easing');\n\n            if (Array.isArray(data.values.easingArgs))\n                this.easingArgs = data.values.easingArgs;\n\n            if (!Array.isArray(data.values) && Array.isArray(data.values.vector)) {\n                // Convert data to format expected by KeyframeExtendOriginal\n                data.values = data.values.vector;\n            }\n        }\n        else {\n            if (data.easing !== undefined)\n                Merge.string(this, data, 'easing');\n\n            if (Array.isArray(data.easingArgs))\n                this.easingArgs = data.easingArgs;\n        }\n    }\n\n    // @ts-ignore\n    return Monkeypatches.get(Keyframe).extend.apply(this, arguments);\n}\n\n// Inject GeckoLib support for the reverse keyframes feature\nfunction onReverseKeyframes() {\n    Monkeypatches.get(BarItems.reverse_keyframes).click.apply(this, arguments);\n\n    // There's not really an easy way to merge our undo operation with the original one so we'll make a new one instead\n    Undo.initEdit({keyframes: Timeline.selected})\n\n    const kfByAnimator = groupBy(Timeline.selected, kf => kf.animator.uuid);\n    const kfByAnimatorAndChannel = mapValues(\n        kfByAnimator,\n        keyframesForAnimator => groupBy(keyframesForAnimator, kf => kf.channel)\n    );\n\n    Object.keys(kfByAnimatorAndChannel).forEach(animatorUuid => {\n        const animatorChannelGroups = kfByAnimatorAndChannel[animatorUuid];\n\n        Object.keys(animatorChannelGroups).forEach(channel => {\n            const channelKeyframes = animatorChannelGroups[channel];\n            // Ensure keyframes are in temporal order. Not sure if this is already the case, but it couldn't hurt\n            channelKeyframes.sort((kfA, kfB) => kfA.time - kfB.time);\n            // Reverse easing direction\n            const easingData: EasingProperties[] = channelKeyframes.map((kf: GeckolibKeyframe) => ({\n                easing: reverseEasing(kf.easing),\n                easingArgs: kf.easingArgs\n            }));\n\n            // Shift easing data to the right by one keyframe\n            channelKeyframes.forEach((kf: GeckolibKeyframe, i: number) => {\n                if (i == 0) {\n                    kf.easing = undefined;\n                    kf.easingArgs = undefined;\n\n                    return;\n                }\n\n                const newEasingData = easingData[i - 1];\n                kf.easing = newEasingData.easing;\n                kf.easingArgs = newEasingData.easingArgs;\n            });\n        });\n    });\n\n    Undo.finishEdit('Reverse keyframe easing')\n    updateKeyframeSelection();\n    Animator.preview();\n}"
  },
  {
    "path": "plugins/geckolib/src/ts/utils.ts",
    "content": "import {GECKOLIB_MODEL_ID, GeckoModelType, PROPERTY_MODEL_TYPE, SETTING_ALWAYS_SHOW_DISPLAY} from \"./constants\";\n\nconst VALID_NAMESPACE_PATTERN = new RegExp('^[_\\\\-.a-z0-9]+$')\nconst VALID_PATH_PATTERN = new RegExp('^[_\\\\-/.a-z0-9]+$')\nexport const Monkeypatches = new Map();\n\n/**\n * Add what is effectively an override of another javascript function in a target object.\n * <p>\n * The patched function should call the original first and operate on the result to ensure compatibility\n * </p>\n *\n * @param symbol The target object\n * @param path The property of the target to access, or null to access the root target itself\n * @param functionKey The name of the function to replace\n * @param newFunction The function to patch in to replace the target\n */\nexport const addMonkeypatch = (symbol: any, path: string | null, functionKey: string, newFunction) => {\n  const pathAccessor = path ? symbol[path] : symbol;\n\n  if (!Monkeypatches.get(symbol))\n    Monkeypatches.set(symbol, { _pathAccessor: pathAccessor });\n\n  Monkeypatches.get(symbol)[functionKey] = pathAccessor[functionKey];\n  pathAccessor[functionKey] = newFunction;\n};\n\n/**\n * Remove all previously added monkeypatches, reverting their operation to prior to the patch\n */\nexport const removeMonkeypatches = () => {\n  Monkeypatches.forEach(symbol => {\n    Object.keys(symbol).forEach(functionKey => {\n      if (functionKey.startsWith('_'))\n        return;\n\n      symbol._pathAccessor[functionKey] = symbol[functionKey];\n    });\n  });\n  Monkeypatches.clear();\n}\n\n/**\n * Wrap a callback object with a conditional check on the project being a GeckoLib project, for safety\n */\nexport const onlyIfGeckoLib = (callback: (data: object) => void) => {\n  return (e: any) => {\n    if (isGeckoLibModel())\n      callback(e)\n  }\n}\n\n/**\n * Add an event listener to Blockbench's event callback system.\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nexport const addEventListener = (eventName: BlockbenchEventName, callback: (data: object) => void) => {\n  Blockbench.on(eventName, callback)\n}\n\n/**\n * Remove a previously registered event listener from Blockbench's event callback system.\n * <p>\n * All registered event listeners should be removed when the plugin or codec is unloaded\n */\nexport const removeEventListener = (eventName: BlockbenchEventName, callback: (data: object) => void) => {\n  Blockbench.removeListener(eventName, callback)\n}\n\n/**\n * Add a callback to a codec to be called after the task has been completed\n * <p>\n * This should be done in <code>codec.ts#loadCodec</code> or in the plugin creation in <code>index.ts</code>\n */\nexport const addCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => {\n  codec.on(taskName, callback);\n}\n\n/**\n * Helper function that allows instantiation of an object and simultaneous property-modification without needing a local variable\n */\nexport function make<T>(obj: T, consumer: (obj2: T) => void): T {\n  consumer(obj);\n\n  return obj;\n}\n\n/**\n * Remove a previously added codec task completion callback\n * <p>\n * All registered coded callbacks should be removed when the plugin or codec is unloaded\n */\nexport const removeCodecCallback = (codec: Codec, taskName: string, callback: (data: object) => void) => {\n  codec.removeListener(taskName, callback);\n}\n\n/**\n * Whether a given string is a valid ResourceLocation path for Minecraft\n */\nexport const isValidPath = (path: string) => {\n  return VALID_PATH_PATTERN.test(path)\n}\n\n/**\n * Whether a given string is a valid ResourceLocation namespace for Minecraft\n */\nexport const isValidNamespace = (namespace: string) => {\n  return VALID_NAMESPACE_PATTERN.test(namespace)\n}\n\n/**\n * Whether a map-like object has no defined keys or values\n */\nexport const isEmpty = (object = {}) => !object || Object.keys(object).length === 0;\n\n/**\n * Whether the currently focussed model is a GeckoLib model\n */\nexport const isGeckoLibModel = () => Format.id === GECKOLIB_MODEL_ID;\n\n/**\n * Whether the current project is a GeckoLib model that has or uses item render perspective transforms\n */\nexport const shouldShowDisplayPanel = () => {\n  if (!isGeckoLibModel() || !Project)\n    return false;\n\n  if (settings[SETTING_ALWAYS_SHOW_DISPLAY].value)\n    return true;\n\n  return Project[PROPERTY_MODEL_TYPE] === GeckoModelType.ITEM || !isEmpty(Project.display_settings);\n}\n\n/**\n * Determine the GeckoModelType of the current project (as best as possible), or null if it is not a GeckoLib model.\n */\nexport const determineModelType = (optionalModel?: any) => {\n  if (!isGeckoLibModel() || !Project)\n    return null;\n\n  if (Project[PROPERTY_MODEL_TYPE] && typeof Project[PROPERTY_MODEL_TYPE] === 'string')\n    return Project[PROPERTY_MODEL_TYPE];\n\n  if (optionalModel && !isEmpty(optionalModel.display))\n    return GeckoModelType.ITEM;\n\n  if (!isEmpty(Project.display_settings))\n    return GeckoModelType.ITEM;\n\n  return GeckoModelType.ENTITY;\n}"
  },
  {
    "path": "plugins/geckolib/src/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"outDir\": \"'../../plugins\",\n    // \"noImplicitAny\": true,\n    \"module\": \"es2022\",\n    \"target\": \"es2023\",\n    \"allowJs\": true,\n    \"resolveJsonModule\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"skipLibCheck\": true,\n    \"moduleResolution\": \"node\",\n    \"types\": [\"blockbench-types\", \"jest\"]\n    // \"typeRoots\": [\"./node_modules/@types\", \"./node_modules/blockbench-types\"]\n  },\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}"
  },
  {
    "path": "plugins/geckolib/src/types/blockbench-types.d.ts",
    "content": "/// <reference types=\"blockbench-types\" />"
  },
  {
    "path": "plugins/geckolib/src/webpack.config.js",
    "content": "const PathModule = require('path')\n\nmodule.exports = {\n    mode: 'development',\n    devtool: false,\n    entry: './ts/index.ts',\n    module: {\n        rules: [\n            {\n                test: /\\.tsx?$/,\n                use: 'ts-loader',\n                exclude: /node_modules/,\n            },\n            {\n                test: /\\.css$/,\n                use: [ 'to-string-loader', 'css-loader' ]\n            },\n        ],\n    },\n    resolve: {\n        extensions: ['.tsx', '.ts', '.js'],\n    },\n    output: {\n        filename: 'geckolib.js',\n        path: PathModule.resolve(__dirname, '..')\n    }\n}\n"
  },
  {
    "path": "plugins/geenium_bedrock_entity_helper.js",
    "content": "/***********************************\\\n|            PLUGIN DATA            |\n\\***********************************/\n\nvar plugin_data = {\n\tid: 'geenium_bedrock_entity_helper',\n\ttitle: 'Bedrock Entity Model Presets',\n\ticon: 'pets',\n\tauthor: 'Geenium',\n\tdescription: 'Loads Bedrock vanilla entity models up to version 1.13',\n\tdeprecation_note: \"This plugin is no longer updated. To get models for texturing, use File > New > Minecraft Skin. To get Minecraft Bedrock Edition models, use the plugin 'Minecraft Entity Wizard'. To get template models for OptiFine CEM, use the plugin 'CEM Template Loader'.\",\n\ttags: ['Minecraft: Bedrock Edition'],\n\tversion: '0.3.0',\n\tvariant: 'both'\n}\n\n/***********************************\\\n|        ADDING NEW FUNCTIONS       |\n\\***********************************/\n\n//New addCube function allows you to specify the name and position properties of the cube\naddEntityCube = function(name, from, to, uv, inflate, mirror) {\n\tvar added_cube = new Cube({name: name, from: from, to: to, uv_offset: uv, shade: (mirror != undefined)}).addTo(Group.all.last()).init()\n\n\tif (inflate) {\n\t\tadded_cube.inflate = inflate\n\t}\n}\n\ngetEntityName = function(entity, parent) {\n\tvar parentEntity = ''\n\tswitch (entity) {\n\t\tcase 'enderman':\n\t\tcase 'zombie':\n\t\tcase 'pigzombie':\n\t\tcase 'zombie.villager':\n\t\tcase 'vex':\n\t\t\tparentEntity = ':geometry.humanoid'\n\t\t\tbreak\n\t\tcase 'cow':\n\t\tcase 'sheep.sheared':\n\t\tcase 'pig':\n\t\t\tparentEntity = ':geometry.quadruped'\n\t\t\tbreak\n\t\tcase 'evoker':\n\t\tcase 'villager.witch':\n\t\t\tparentEntity = ':geometry.villager'\n\t\t\tbreak\n\t\tcase 'zombie.husk':\n\t\tcase 'skeleton':\n\t\t\tparentEntity = ':geometry.zombie'\n\t\t\tbreak\n\t\tcase 'skeleton.wither':\n\t\tcase 'skeleton.stray':\n\t\t\tparentEntity = ':geometry.skeleton'\n\t\t\tbreak\n\t\tcase 'creeper.charged':\n\t\t\tparentEntity = ':geometry.creeper'\n\t\t\tbreak\n\t\tcase 'pigzombie.baby':\n\t\t\tparentEntity = ':geometry.pigzombie'\n\t\t\tbreak\n\t\tcase 'mooshroom':\n\t\t\tparentEntity = ':geometry.cow'\n\t\t\tbreak\n\t\tcase 'sheep':\n\t\t\tparentEntity = ':geometry.sheep.sheared'\n\t\t\tbreak\n\t\tcase 'witherBoss.armor':\n\t\t\tparentEntity = ':geometry.witherBoss'\n\t}\n\tentity = 'geometry.' + entity\n\n\tif (parent) return entity + parentEntity\n\treturn entity\n}\n\n//Sets the base texture size for the project for the default entity texture\n//This is used in calculating the UVs of the entity\nchangeTextureSizes = function(entity) {\n\tswitch (entity) {\n\t\tcase 'dragon':\n\t\tcase 'dragon_head':\n\t\t\tProject.texture_width = 256\n\t\t\tProject.texture_height = 256\n\t\t\tbreak\n\t\tcase 'horse':\n\t\tcase 'irongolem':\n\t\t\tProject.texture_width = 128\n\t\t\tProject.texture_height = 128\n\t\t\tbreak\n\t\tcase 'llama':\n\t\tcase 'polarbear':\n\t\tcase 'boat':\n\t\t\tProject.texture_width = 128\n\t\t\tProject.texture_height = 64\n\t\t\tbreak\n\t\tcase 'villager.witch':\n\t\t\tProject.texture_width = 64\n\t\t\tProject.texture_height = 128\n\t\t\tbreak\n\t\tcase 'llamaspit':\n\t\tcase 'shulker':\n\t\tcase 'zombie.villager':\n\t\tcase 'evoker':\n\t\tcase 'vex':\n\t\tcase 'vindicator':\n\t\tcase 'guardian':\n\t\tcase 'witherBoss':\n\t\tcase 'armor_stand':\n\t\tcase 'bed':\n\t\tcase 'player_head':\n\t\tcase 'villager':\n\t\tcase 'snowgolem':\n\t\tcase 'sheep':\n\t\tcase 'sheep.sheared':\n\t\tcase 'bat':\n\t\tcase 'dolphin':\n\t\tcase 'horse.v2':\n\t\tcase 'zombie.drowned':\n\t\t\tProject.texture_width = 64\n\t\t\tProject.texture_height = 64\n\t\t\tbreak\n\t\tcase 'parrot':\n\t\tcase 'tropicalfish_a':\n\t\tcase 'tropicalfish_b':\n\t\tcase 'trident':\n\t\tcase 'cod':\n\t\tcase 'pufferfish.small':\n\t\tcase 'pufferfish.mid':\n\t\tcase 'pufferfish.large':\n\t\tcase 'salmon':\n\t\t\tProject.texture_width = 32\n\t\t\tProject.texture_height = 32\n\t\t\tbreak\n\t\tdefault:\n\t\t\tProject.texture_width = 64\n\t\t\tProject.texture_height = 32\n\t}\n}\n\ncreateBones = function(entity, add_cubes) {\n\t//These entities parent all their bones from other entities\n\t//Means I don't have to define the exact same entity repeatedly\n\tswitch (entity) {\n\t\tcase 'zombie':\n\t\tcase 'zombie.husk':\n\t\tcase 'pigzombie.baby':\n\t\t\tentity = 'humanoid'\n\t\t\tbreak\n\t\tcase 'skeleton.wither':\n\t\tcase 'skeleton.stray':\n\t\t\tentity = 'skeleton'\n\t\t\tbreak\n\t\tcase 'mooshroom':\n\t\t\tentity = 'cow'\n\t\t\tbreak\n\t\tcase 'mob_head':\n\t\t\tentity = 'player_head'\n\t\t\tbreak\n\t}\n\n\tvar bones = entity_bones[entity]\n\t//Iterates over each bone from the entity defined in entity_bones\n\tObject.keys(bones).forEach(function(bone_name) {\n\t\t//Copies the list to a new variable so the original list is not altered\n\t\tcubeValues = bones[bone_name].slice()\n\t\t//Removes the first element from the list, which is the rotation values\n\t\trotationValues = cubeValues.shift()\n\n\t\t//Creates a new group for the bone\n\t\tbone_group = new Group(bone_name).init();\n\t\tbone_group.origin = rotationValues[0]\n\t\tbone_group.shade = false\n\t\t//Sets the selected group to the newly created bone\n\t\tselected_group = bone_group\n\n\t\t//Cubes are added first, so all added cubes can be instantly added to a group\n\t\tif (add_cubes) {\n\t\t\tcubeValues.forEach(function(cubes) {\n\t\t\t\taddEntityCube(bone_name, ...cubes)\n\t\t\t})\n\t\t}\n\n\t\tif (rotationValues.length > 1) {\n\t\t\tbone_group.rotation = rotationValues[1]\n\t\t}\n\t})\n}\n\n/***********************************\\\n|            BONE VALUES            |\n\\***********************************/\n\n//Defines bones that are repeated multiple times\nvar repeat={blazeRod:[[[0,24,0]],[[0,16,0],[2,24,2],[0,16]]],dragon:{wingtip:[[[-56,24,0]],[[-112,22,-2],[-56,26,2],[112,136]],[[-112,24,2],[-56,24,58],[-56,144]]],rearlegtip:[[[0,-8,-4]],[[-6,-38,-4],[6,-6,8],[196,0]]],frontlegtip:[[[0,4,-1]],[[-3,-19,-4],[3,5,2],[226,138]]],rearfoot:[[[0,-7,4]],[[-9,-13,-16],[9,-7,8],[112,0]]],frontfoot:[[[0,1,0]],[[-4,-3,-12],[4,1,4],[144,104]]],jaw:[[[0,20,-8]],[[-6,16,-24],[6,20,-8],[176,65]]]},slime:{eye0:[[[0,24,0]],[[-3.3,4,-3.5],[-1.3,6,-1.5],[32,0]]],eye1:[[[0,24,0]],[[1.3,4,-3.5],[3.3,6,-1.5],[32,4]]],mouth:[[[0,24,0]],[[0,2,-3.5],[1,3,-2.5],[32,8]]]},humanoid:{head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0]]],body:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,16]]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,16],0,1]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,16]]],leftLeg:[[[1.9,12,0]],[[-0.1,0,-2],[3.9,12,2],[0,16],0,1]],rightLeg:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16]]]},snowgolemArm:[[[0,18,0]],[[-1,16,-1],[11,18,1],[32,0],-0.5]],guardianSpike:[[[0,24,0]],[[-1,19.5,-1],[1,28.5,1],[0,0]]],villager:{head:[[[0,24,0]],[[-4,24,-4],[4,34,4],[0,0]]],nose:[[[0,26,0]],[[-1,23,-6],[1,27,-4],[24,0]]],body:[[[0,24,0]],[[-4,12,-3],[4,24,3],[16,20]],[[-4,6,-3],[4,24,3],[0,38],0.5]],leg0:[[[-2,12,0]],[[-4,0,-2],[0,12,2],[0,22]]],leg1:[[[2,12,0]],[[0,0,-2],[4,12,2],[0,22]]],arms:[[[0,22,0]],[[-4,16,-2],[4,20,2],[40,38]],[[-8,16,-2],[-4,24,2],[44,22]],[[4,16,-2],[8,24,2],[44,22]]]},zombieVillagerLeftLeg:[[[2,12,0]],[[0,0,-2],[4,12,2],[0,22],0,1]],illager:{rightarm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,46]]],leftarm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,46],0,1]]}}\n\n//These are all the hard coded entity bone values\nvar entity_bones={chicken:{head:[[[0,9,-4]],[[-2,9,-6],[2,15,-3],[0,0]]],beak:[[[0,9,-4]],[[-2,11,-8],[2,13,-6],[14,0]]],comb:[[[0,9,-4]],[[-1,9,-7],[1,11,-5],[14,4]]],body:[[[0,8,0]],[[-3,4,-3],[3,12,3],[0,9]]],leg0:[[[-2,5,1]],[[-3,0,-2],[0,5,1],[26,0]]],leg1:[[[1,5,1]],[[0,0,-2],[3,5,1],[26,0]]],wing0:[[[-3,11,0]],[[-4,7,-3],[-3,11,3],[24,13]]],wing1:[[[3,11,0]],[[3,7,-3],[4,11,3],[24,13]]]},blaze:{upperBodyParts0:repeat.blazeRod,upperBodyParts1:repeat.blazeRod,upperBodyParts2:repeat.blazeRod,upperBodyParts3:repeat.blazeRod,upperBodyParts4:repeat.blazeRod,upperBodyParts5:repeat.blazeRod,upperBodyParts6:repeat.blazeRod,upperBodyParts7:repeat.blazeRod,upperBodyParts8:repeat.blazeRod,upperBodyParts9:repeat.blazeRod,upperBodyParts10:repeat.blazeRod,upperBodyParts11:repeat.blazeRod,head:[[[0,24,0]],[[-4,20,-4],[4,28,4],[0,0]]]},llamaspit:{body:[[[0,24,0]],[[-4,22,0],[-2,24,2],[0,0]],[[0,26,0],[2,28,2],[0,0]],[[0,22,-4],[2,24,-2],[0,0]],[[0,22,0],[2,24,2],[0,0]],[[2,22,0],[4,24,2],[0,0]],[[0,20,0],[2,22,2],[0,0]],[[0,22,2],[2,24,4],[0,0]]]},llama:{head:[[[0,17,-6]],[[-2,27,-16],[2,31,-7],[0,0]],[[-4,15,-12],[4,33,-6],[0,14]],[[-4,33,-10],[-1,36,-8],[17,0]],[[1,33,-10],[4,36,-8],[17,0]]],chest1:[[[-8.5,21,3],[0,90,0]],[[-11.5,13,3],[-3.5,21,6],[45,28]]],chest2:[[[5.5,21,3],[0,90,0]],[[2.5,13,3],[10.5,21,6],[45,41]]],body:[[[0,19,2]],[[-6,11,-5],[6,29,5],[29,0]]],leg0:[[[-3.5,14,6]],[[-5.5,0,4],[-1.5,14,8],[29,29]]],leg1:[[[3.5,14,6]],[[1.5,0,4],[5.5,14,8],[29,29]]],leg2:[[[-3.5,14,-5]],[[-5.5,0,-7],[-1.5,14,-3],[29,29]]],leg3:[[[3.5,14,-5]],[[1.5,0,-7],[5.5,14,-3],[29,29]]]},dragon:{head:[[[0,24,0]],[[-6,20,-24],[6,25,-8],[176,44]],[[-8,16,-10],[8,32,6],[112,30]],[[-5,32,-4],[-3,36,2],[0,0]],[[-5,25,-22],[-3,27,-18],[112,0]],[[3,32,-4],[5,36,2],[0,0]],[[3,25,-22],[5,27,-18],[112,0],0,1]],jaw:repeat.dragon.jaw,neck:[[[0,24,0]],[[-5,19,-5],[5,29,5],[192,104]],[[-1,29,-3],[1,33,3],[48,0]]],body:[[[0,20,8]],[[-12,-4,-8],[12,20,56],[0,0]],[[-1,20,-2],[1,26,10],[220,53]],[[-1,20,18],[1,26,30],[220,53]],[[-1,20,38],[1,26,50],[220,53]]],wing:[[[-12,19,2]],[[-68,15,-2],[-12,23,6],[112,88]],[[-68,19,4],[-12,19,60],[-56,88]]],wingtip:repeat.dragon.wingtip,wing1:[[[12,19,2]],[[-44,15,-2],[12,23,6],[112,88]],[[-44,19,4],[12,19,60],[-56,88]]],wingtip1:repeat.dragon.wingtip,rearleg:[[[-16,8,42]],[[-24,-20,34],[-8,12,50],[0,0]]],rearleg1:[[[16,8,42]],[[8,-20,34],[24,12,50],[0,0]]],frontleg:[[[-12,4,2]],[[-16,-16,-2],[-8,8,6],[112,104]]],frontleg1:[[[12,4,2]],[[8,-16,-2],[16,8,6],[112,104]]],rearlegtip:repeat.dragon.rearlegtip,rearlegtip1:repeat.dragon.rearlegtip,frontlegtip:repeat.dragon.frontlegtip,frontlegtip1:repeat.dragon.frontlegtip,rearfoot:repeat.dragon.rearfoot,rearfoot1:repeat.dragon.rearfoot,frontfoot:repeat.dragon.frontfoot,frontfoot1:repeat.dragon.frontfoot},ghast:{tentacles_0:[[[-3.8,1,-5]],[[-4.8,-8,-6],[-2.8,1,-4],[0,0]]],tentacles_1:[[[1.3,1,-5]],[[0.3,-10,-6],[2.3,1,-4],[0,0]]],tentacles_2:[[[6.3,1,-5]],[[5.3,-7,-6],[7.3,1,-4],[0,0]]],tentacles_3:[[[-6.3,1,0]],[[-7.3,-8,-1],[-5.3,1,1],[0,0]]],tentacles_4:[[[-1.3,1,0]],[[-2.3,-12,-1],[-0.3,1,1],[0,0]]],tentacles_5:[[[3.8,1,0]],[[2.8,-10,-1],[4.8,1,1],[0,0]]],tentacles_6:[[[-3.8,1,5]],[[-4.8,-11,4],[-2.8,1,6],[0,0]]],tentacles_7:[[[1.3,1,5]],[[0.3,-11,4],[2.3,1,6],[0,0]]],tentacles_8:[[[6.3,1,5]],[[5.3,-12,4],[7.3,1,6],[0,0]]],body:[[[0,8,0]],[[-8,0,-8],[8,16,8],[0,0]]]},slime:{cube:[[[0,24,0]],[[-3,1,-3],[3,7,3],[0,16]]],eye0:repeat.slime.eye0,eye1:repeat.slime.eye1,mouth:repeat.slime.mouth},'slime.armor':{cube:[[[0,24,0]],[[-4,0,-4],[4,8,4],[0,0]]],eye0:repeat.slime.eye0,eye1:repeat.slime.eye1,mouth:repeat.slime.mouth},lavaslime:{bodyCube_0:[[[0,24,0]],[[-4,7,-4],[4,8,4],[0,0]]],bodyCube_1:[[[0,24,0]],[[-4,6,-4],[4,7,4],[0,1]]],bodyCube_2:[[[0,24,0]],[[-4,5,-4],[4,6,4],[24,10]]],bodyCube_3:[[[0,24,0]],[[-4,4,-4],[4,5,4],[24,19]]],bodyCube_4:[[[0,24,0]],[[-4,3,-4],[4,4,4],[0,4]]],bodyCube_5:[[[0,24,0]],[[-4,2,-4],[4,3,4],[0,5]]],bodyCube_6:[[[0,24,0]],[[-4,1,-4],[4,2,4],[0,6]]],bodyCube_7:[[[0,24,0]],[[-4,0,-4],[4,1,4],[0,7]]],insideCube:[[[0,24,0]],[[-2,2,-2],[2,6,2],[0,16]]]},silverfish:{bodyPart_0:[[[0,2,-3.5]],[[-1.5,0,-4.5],[1.5,2,-2.5],[0,0]]],bodyPart_1:[[[0,3,-1.5]],[[-2,0,-2.5],[2,3,-0.5],[0,4]]],bodyPart_2:[[[0,4,1]],[[-3,0,-0.5],[3,4,2.5],[0,9]]],bodyPart_3:[[[0,3,4]],[[-1.5,0,2.5],[1.5,3,5.5],[0,16]]],bodyPart_4:[[[0,2,7]],[[-1,0,5.5],[1,2,8.5],[0,22]]],bodyPart_5:[[[0,1,9.5]],[[-1,0,8.5],[1,1,10.5],[11,0]]],bodyPart_6:[[[0,1,11.5]],[[-0.5,0,10.5],[0.5,1,12.5],[13,4]]],bodyLayer_0:[[[0,8,1]],[[-5,0,-0.5],[5,8,2.5],[20,0]]],bodyLayer_1:[[[0,4,7]],[[-3,0,5.5],[3,4,8.5],[20,11]]],bodyLayer_2:[[[0,5,-1.5]],[[-3,0,-3],[3,5,-1],[20,18]]]},shulker:{lid:[[[0,0,0]],[[-8,4,-8],[8,16,8],[0,0]]],base:[[[0,0,0]],[[-8,0,-8],[8,8,8],[0,28]]],head:[[[0,12,0]],[[-3,6,-3],[3,12,3],[0,52]]]},rabbit:{rearFootLeft:[[[3,6.5,3.7]],[[2,0,0],[4,1,7],[8,24],0,1]],rearFootRight:[[[-3,6.5,3.7]],[[-4,0,0],[-2,1,7],[26,24],0,1]],haunchLeft:[[[3,6.5,3.7],[20,0,0]],[[2,2.5,3.7],[4,6.5,8.7],[16,15],0,1]],haunchRight:[[[-3,6.5,3.7],[20,0,0]],[[-4,2.5,3.7],[-2,6.5,8.7],[30,15],0,1]],body:[[[0,5,8],[20,0,0]],[[-3,2,-2],[3,7,8],[0,0],0,1]],frontLegLeft:[[[3,7,-1],[10,0,0]],[[2,0,-2],[4,7,0],[8,15],0,1]],frontLegRight:[[[-3,7,-1],[10,0,0]],[[-4,0,-2],[-2,7,0],[0,15],0,1]],head:[[[0,8,-1]],[[-2.5,8,-6],[2.5,12,-1],[32,0],0,1]],earRight:[[[0,8,-1],[0,-15,0]],[[-2.5,12,-2],[-0.5,17,-1],[52,0],0,1]],earLeft:[[[0,8,-1],[0,15,0]],[[0.5,12,-2],[2.5,17,-1],[58,0],0,1]],tail:[[[0,4,7],[20,0,0]],[[-1.5,2.5,7],[1.5,5.5,9],[52,6],0,1]],nose:[[[0,8,-1]],[[-0.5,9.5,-6.5],[0.5,10.5,-5.5],[32,9],0,1]]},'horse.v2':{Body:[[[0,13,9]],[[-5,11,-11],[5,21,11],[0,32]]],TailA:[[[0,20,11],[-30,0,0]],[[-1.5,6,9],[1.5,20,13],[42,36]]],Leg1A:[[[3,11,9]],[[1,0,7],[5,11,11],[48,21],0,1]],Leg2A:[[[-3,11,9]],[[-5,0,7],[-1,11,11],[48,21]]],Leg3A:[[[3,11,-9]],[[1,0,-11],[5,11,-7],[48,21],0,1]],Leg4A:[[[-3,11,-9]],[[-5,0,-11],[-1,11,-7],[48,21]]],Head:[[[0,28,-11],[-30,0,0]],[[-3,28,-11],[3,33,-4],[0,13]]],UMouth:[[[0,28,-11],[-30,0,0]],[[-2,28,-16],[2,33,-11],[0,25]]],Ear1:[[[0,17,-8],[-30,0,5]],[[-0.5,32,-5.01],[1.5,35,-4.01],[19,16],0,1]],Ear2:[[[0,17,-8],[-30,0,-5]],[[-1.5,32,-5.01],[0.5,35,-4.01],[19,16]]],MuleEarL:[[[0,17,-8],[-30,0,15]],[[-3,32,-5.01],[-1,39,-4.01],[0,12],0,1]],MuleEarR:[[[0,17,-8],[-30,0,-15]],[[1,32,-5.01],[3,39,-4.01],[0,12]]],Neck:[[[0,17,-8],[-30,0,0]],[[-2,16,-11],[2,28,-4],[0,35]]],Bag1:[[[-5,21,11],[0,-90,0]],[[-14,13,11],[-6,21,14],[26,21]]],Bag2:[[[5,21,11],[0,90,0]],[[6,13,11],[14,21,14],[26,21],0,1]],Saddle:[[[0,22,2]],[[-5,12,-3.5],[5,21,5.5],[26,0],0.5]],SaddleMouthL:[[[0,17,-8],[-30,0,0]],[[2,29,-14],[3,31,-12],[29,5]]],SaddleMouthR:[[[0,17,-8],[-30,0,0]],[[-3,29,-14],[-2,31,-12],[29,5]]],SaddleMouthLine:[[[0,17,-8]],[[3.1,24,-19.5],[3.1,27,-3.5],[32,2]]],SaddleMouthLineR:[[[0,17,-8]],[[-3.1,24,-19.5],[-3.1,27,-3.5],[32,2]]],Mane:[[[0,17,-8],[-30,0,0]],[[-1,17,-4],[1,33,-2],[56,36]]],HeadSaddle:[[[0,17,-8],[-30,0,0]],[[-2,28,-13],[2,33,-11],[19,0]],[[-3,28,-11],[3,33,-4],[0,0],0.25]]},horse:{Body:[[[0,13,9]],[[-5,11,-10],[5,21,14],[0,34]]],TailA:[[[0,21,14],[65,0,0]],[[-1,20,14],[1,22,17],[44,0]]],TailB:[[[0,21,14],[65,0,0]],[[-1.5,19,17],[1.5,23,24],[38,7]]],TailC:[[[0,21,14],[80.34,0,0]],[[-1.5,21.5,23],[1.5,25.5,30],[24,3]]],Leg1A:[[[4,15,11]],[[1.5,8,8.5],[5.5,17,13.5],[78,29]]],Leg1B:[[[4,8,11]],[[2,3,9.5],[5,8,12.5],[78,43]]],Leg1C:[[[4,8,11]],[[1.5,-0.1,9],[5.5,2.9,13],[78,51]]],Leg2A:[[[-4,15,11]],[[-5.5,8,8.5],[-1.5,17,13.5],[96,29]]],Leg2B:[[[-4,8,11]],[[-5,3,9.5],[-2,8,12.5],[96,43]]],Leg2C:[[[-4,8,11]],[[-5.5,-0.1,9],[-1.5,2.9,13],[96,51]]],Leg3A:[[[4,15,-8]],[[2.1,8,-10.1],[5.1,16,-6.1],[44,29]]],Leg3B:[[[4,8,-8]],[[2.1,3,-9.6],[5.1,8,-6.6],[44,41]]],Leg3C:[[[4,8,-8]],[[1.6,-0.1,-10.1],[5.6,2.9,-6.1],[44,51]]],Leg4A:[[[-4,15,-8]],[[-5.1,8,-10.1],[-2.1,16,-6.1],[60,29]]],Leg4B:[[[-4,8,-8]],[[-5.1,3,-9.6],[-2.1,8,-6.6],[60,41]]],Leg4C:[[[-4,8,-8]],[[-5.6,-0.1,-10.1],[-1.6,2.9,-6.1],[60,51]]],Head:[[[0,20,-10],[-30,0,0]],[[-2.5,25,-11.5],[2.5,30,-4.5],[0,0]]],UMouth:[[[0,20.05,-10],[-30,0,0]],[[-2,27.05,-17],[2,30.05,-11],[24,18]]],LMouth:[[[0,20,-10],[-30,0,0]],[[-2,25,-16.5],[2,27,-11.5],[24,27]]],Ear1:[[[0,20,-10],[-30,0,0]],[[0.45,29,-6],[2.45,32,-5],[0,0]]],Ear2:[[[0,20,-10],[-30,0,0]],[[-2.45,29,-6],[-0.45,32,-5],[0,0]]],MuleEarL:[[[0,20,-10],[-30,0,15]],[[-2,29,-6],[0,36,-5],[0,12]]],MuleEarR:[[[0,20,-10],[-30,0,-15]],[[0,29,-6],[2,36,-5],[0,12]]],Neck:[[[0,20,-10],[-30,0,0]],[[-2.05,15.8,-12],[1.95,29.8,-4],[0,12]]],Bag1:[[[-7.5,21,10],[0,-90,0]],[[-10.5,13,10],[-2.5,21,13],[0,34]]],Bag2:[[[4.5,21,10],[0,90,0]],[[1.5,13,10],[9.5,21,13],[0,47]]],Saddle:[[[0,22,2]],[[-5,21,-1],[5,22,7],[80,0]]],SaddleB:[[[0,22,2]],[[-1.5,22,-1],[1.5,23,1],[106,9]]],SaddleC:[[[0,22,2]],[[-4,22,5],[4,23,7],[80,9]]],SaddleL2:[[[5,21,2]],[[4.5,13,1],[5.5,15,3],[74,0]]],SaddleL:[[[5,21,2]],[[4.5,15,1.5],[5.5,21,2.5],[70,0]]],SaddleR2:[[[-5,21,2]],[[-5.5,13,1],[-4.5,15,3],[74,4]]],SaddleR:[[[-5,21,2]],[[-5.5,15,1.5],[-4.5,21,2.5],[80,0]]],SaddleMouthL:[[[0,20,-10],[-30,0,0]],[[1.5,26,-14],[2.5,28,-12],[74,13]]],SaddleMouthR:[[[0,20,-10],[-30,0,0]],[[-2.5,26,-14],[-1.5,28,-12],[74,13]]],SaddleMouthLine:[[[0,20,-10]],[[2.6,23,-16],[2.6,26,0],[44,10]]],SaddleMouthLineR:[[[0,20,-10]],[[-2.6,23,-16],[-2.6,26,0],[44,5]]],Mane:[[[0,20,-10],[-30,0,0]],[[-1,15.5,-5],[1,31.5,-1],[58,0]]],HeadSaddle:[[[0,20,-10],[-30,0,0]],[[-2.5,25.1,-17],[2.5,30.1,-5],[80,12],0.05]]},humanoid:repeat.humanoid,creeper:{body:[[[0,0,0]],[[-4,6,-2],[4,18,2],[16,16]]],head:[[[0,18,0]],[[-4,18,-4],[4,26,4],[0,0]]],leg0:[[[-2,6,4]],[[-4,0,2],[0,6,6],[0,16]]],leg1:[[[2,6,4]],[[0,0,2],[4,6,6],[0,16]]],leg2:[[[-2,6,-4]],[[-4,0,-6],[0,6,-2],[0,16]]],leg3:[[[2,6,-4]],[[0,0,-6],[4,6,-2],[0,16]]]},'zombie.drowned':{body:repeat.humanoid.body,jacket:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,32],0.5]],head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0],0.5]],hat:[[[0,24,0]],[[-4,24,-4],[4,32,4],[32,0],1]],rightArm:[[[-5,22,0]],[[-7,12,-2],[-3,24,2],[0,16]]],leftArm:repeat.humanoid.leftArm,rightSleeve:[[[-5,22,0]],[[-7,12,-2],[-3,24,2],[48,48],0.5]],leftSleeve:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,32],0.5,1]],rightLeg:[[[-1.9,12,0]],[[-4.05,0,-2],[-0.05,12,2],[16,48]]],leftLeg:[[[1.9,12,0]],[[0.05,0,-2],[4.05,12,2],[32,48],0,1]],rightPants:[[[-1.9,12,0]],[[-4.25,0,-2],[-0.25,12,2],[0,48],0.25]],leftPants:[[[1.9,12,0]],[[0.25,0,-2],[4.25,12,2],[0,32],0.25,1]]},squid:{body:[[[0,0,0]],[[-6,-8,-6],[6,8,6],[0,0]]],tentacle1:[[[5,-7,0],[0,90,0]],[[4,-25,-1],[6,-7,1],[48,0]]],tentacle2:[[[3.5,-7,3.5],[0,45,0]],[[2.5,-25,2.5],[4.5,-7,4.5],[48,0]]],tentacle3:[[[0,-7,5]],[[-1,-25,4],[1,-7,6],[48,0]]],tentacle4:[[[-3.5,-7,3.5],[0,-45,0]],[[-4.5,-25,2.5],[-2.5,-7,4.5],[48,0]]],tentacle5:[[[-5,-7,0],[0,-90,0]],[[-6,-25,-1],[-4,-7,1],[48,0]]],tentacle6:[[[-3.5,-7,-3.5],[0,-135,0]],[[-4.5,-25,-4.5],[-2.5,-7,-2.5],[48,0]]],tentacle7:[[[0,-7,-5],[0,-180,0]],[[-1,-25,-6],[1,-7,-4],[48,0]]],tentacle8:[[[3.5,-7,-3.5],[0,-225,0]],[[2.5,-25,-4.5],[4.5,-7,-2.5],[48,0]]]},spider:{head:[[[0,9,-3]],[[-4,5,-11],[4,13,-3],[32,4]]],body0:[[[0,9,0]],[[-3,6,-3],[3,12,3],[0,0]]],body1:[[[0,9,9]],[[-5,5,3],[5,13,15],[0,12]]],leg0:[[[-4,9,2]],[[-19,8,1],[-3,10,3],[18,0]]],leg1:[[[4,9,2]],[[3,8,1],[19,10,3],[18,0]]],leg2:[[[-4,9,1]],[[-19,8,0],[-3,10,2],[18,0]]],leg3:[[[4,9,1]],[[3,8,0],[19,10,2],[18,0]]],leg4:[[[-4,9,0]],[[-19,8,-1],[-3,10,1],[18,0]]],leg5:[[[4,9,0]],[[3,8,-1],[19,10,1],[18,0]]],leg6:[[[-4,9,-1]],[[-19,8,-2],[-3,10,0],[18,0]]],leg7:[[[4,9,-1]],[[3,8,-2],[19,10,0],[18,0]]]},cow:{body:[[[0,19,2]],[[-6,11,-5],[6,29,5],[18,4]],[[-2,11,-6],[2,17,-5],[52,0]]],head:[[[0,20,-8]],[[-4,16,-14],[4,24,-8],[0,0]],[[-5,22,-12],[-4,25,-11],[22,0]],[[4,22,-12],[5,25,-11],[22,0]]],leg0:[[[-4,12,7]],[[-6,0,5],[-2,12,9],[0,16]]],leg1:[[[4,12,7]],[[2,0,5],[6,12,9],[0,16]]],leg2:[[[-4,12,-6]],[[-6,0,-7],[-2,12,-3],[0,16]]],leg3:[[[4,12,-6]],[[2,0,-7],[6,12,-3],[0,16]]]},bat:{head:[[[0,24,0]],[[-3,21,-3],[3,27,3],[0,0]]],rightEar:[[[0,24,0]],[[-4,26,-2],[-1,30,-1],[24,0]]],leftEar:[[[0,24,0]],[[1,26,-2],[4,30,-1],[24,0],0,1]],body:[[[0,24,0]],[[-3,8,-3],[3,20,3],[0,16]],[[-5,-8,0],[5,8,1],[0,34]]],rightWing:[[[0,24,0]],[[-12,7,1.5],[-2,23,2.5],[42,0]]],rightWingTip:[[[-12,23,1.5]],[[-20,10,1.5],[-12,22,2.5],[24,16]]],leftWing:[[[0,24,0]],[[2,7,1.5],[12,23,2.5],[42,0],0,1]],leftWingTip:[[[12,23,1.5]],[[12,10,1.5],[20,22,2.5],[24,16],0,1]]},dolphin:{head:[[[0,0,-3]],[[-4,0,-9],[4,7,-3],[0,0]]],body:[[[0,0,-3]],[[-4,0,-3],[4,7,10],[0,13]]],tail:[[[0,2.5,11]],[[-2,0,10],[2,5,21],[0,33]]],tail_fin:[[[0,2.5,20]],[[-5,2,19],[5,3,25],[0,49]]],back_fin:[[[0,7,4]],[[-0.5,7,3],[0.5,12,7],[29,0]]],left_fin:[[[3,1,-1]],[[3,1,-2],[11,2,2],[40,0]]],right_fin:[[[-3,1,-1]],[[-11,1,-2],[-3,2,2],[40,6]]],nose:[[[0,0,-13]],[[-1,0,-13],[1,2,-9],[0,13]]]},irongolem:{body:[[[0,31,0]],[[-9,21,-6],[9,33,5],[0,40]],[[-4.5,16,-3],[4.5,21,3],[0,70],0.5]],head:[[[0,31,-2]],[[-4,33,-7.5],[4,43,0.5],[0,0]],[[-1,32,-9.5],[1,36,-7.5],[24,0]]],arm0:[[[0,31,0]],[[-13,3.5,-3],[-9,33.5,3],[60,21]]],arm1:[[[0,31,0]],[[9,3.5,-3],[13,33.5,3],[60,58]]],leg0:[[[-4,13,0]],[[-7.5,0,-3],[-1.5,16,2],[37,0]]],leg1:[[[5,13,0]],[[1.5,0,-3],[7.5,16,2],[60,0],0,1]]},snowgolem:{head:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0],-0.5]],arm1:repeat.snowgolemArm,arm2:repeat.snowgolemArm,piece1:[[[0,11,0]],[[-5,11,-5],[5,21,5],[0,16],-0.5]],piece2:[[[0,0,0]],[[-6,0,-6],[6,12,6],[0,36],-0.5]]},vindicator:{head:repeat.villager.head,nose:repeat.villager.nose,body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,rightarm:repeat.illager.rightarm,leftarm:repeat.illager.leftarm},wolf:{head:[[[-1,10.5,-7]],[[-4,7.5,-9],[2,13.5,-5],[0,0]],[[-4,13.5,-7],[-2,15.5,-6],[16,14]],[[0,13.5,-7],[2,15.5,-6],[16,14]],[[-2.5,7.52,-12],[0.5,10.52,-8],[0,10]]],body:[[[0,10,2]],[[-4,3,-1],[2,12,5],[18,14]]],upperBody:[[[-1,10,2]],[[-5,7,-1],[3,13,6],[21,0]]],leg0:[[[-2.5,8,7]],[[-3.5,0,6],[-1.5,8,8],[0,18]]],leg1:[[[0.5,8,7]],[[-0.5,0,6],[1.5,8,8],[0,18]]],leg2:[[[-2.5,8,-4]],[[-3.5,0,-5],[-1.5,8,-3],[0,18]]],leg3:[[[0.5,8,-4]],[[-0.5,0,-5],[1.5,8,-3],[0,18]]],tail:[[[-1,12,8]],[[-2,4,7],[0,12,9],[9,18]]]},ocelot:{head:[[[0,9,-9]],[[-2.5,7,-12],[2.5,11,-7],[0,0]],[[-1.5,7.02,-13],[1.5,9.02,-11],[0,24]],[[-2,11,-9],[-1,12,-7],[0,10]],[[1,11,-9],[2,12,-7],[6,10]]],body:[[[0,12,-10]],[[-2,-7,-18],[2,9,-12],[20,0]]],tail1:[[[0,9,8],[-50,0,0]],[[-0.5,1,8],[0.5,9,9],[0,15]]],tail2:[[[0,4,13]],[[-0.5,-4,13],[0.5,4,14],[4,15]]],backLegL:[[[1.1,6,5]],[[0.1,0,6],[2.1,6,8],[8,13]]],backLegR:[[[-1.1,6,5]],[[-2.1,0,6],[-0.1,6,8],[8,13]]],frontLegL:[[[1.2,10.2,-5]],[[0.2,0.2,-5],[2.2,10.2,-3],[40,0]]],frontLegR:[[[-1.2,10.2,-5]],[[-2.2,0.2,-5],[-0.2,10.2,-3],[40,0]]]},trident:{pole:[[[0,24,0]],[[-0.5,-3,-0.5],[0.5,28,0.5],[0,0],0.01],[[-1.5,22,-0.5],[1.5,24,0.5],[4,0]],[[-2.5,23,-0.5],[-1.5,27,0.5],[4,3]]],rDent:[[[0,24,0]],[[1.5,23,-0.5],[2.5,27,0.5],[4,3],0,1]]},guardian:{head:[[[0,24,0]],[[-6,2,-8],[6,14,8],[0,0]],[[-8,2,-6],[-6,14,6],[0,28]],[[6,2,-6],[8,14,6],[0,28],0,1],[[-6,14,-6],[6,16,6],[16,40],0,1],[[-6,0,-6],[6,2,6],[16,40],0,1]],eye:[[[0,24,0]],[[-1,7,0],[1,9,1],[8,0]]],tailpart0:[[[0,24,0]],[[-2,6,7],[2,10,15],[40,0]]],tailpart1:[[[0,24,0]],[[0,7,0],[3,10,7],[0,54]]],tailpart2:[[[0,24,0]],[[0,8,0],[2,10,6],[41,32]],[[1,4.5,3],[2,13.5,12],[25,19]]],spikepart0:repeat.guardianSpike,spikepart1:repeat.guardianSpike,spikepart2:repeat.guardianSpike,spikepart3:repeat.guardianSpike,spikepart4:repeat.guardianSpike,spikepart5:repeat.guardianSpike,spikepart6:repeat.guardianSpike,spikepart7:repeat.guardianSpike,spikepart8:repeat.guardianSpike,spikepart9:repeat.guardianSpike,spikepart10:repeat.guardianSpike,spikepart11:repeat.guardianSpike},polarbear:{head:[[[0,14,-16]],[[-3.5,10,-19],[3.5,17,-12],[0,0]],[[-2.5,10,-22],[2.5,13,-19],[0,44]],[[-4.5,16,-17],[-2.5,18,-16],[26,0]],[[2.5,16,-17],[4.5,18,-16],[26,0]]],body:[[[-2,15,12]],[[-7,14,5],[7,28,16],[0,19]],[[-6,28,5],[6,40,15],[39,0]]],leg0:[[[-4.5,10,6]],[[-6.5,0,4],[-2.5,10,12],[50,22]]],leg1:[[[4.5,10,6]],[[2.5,0,4],[6.5,10,12],[50,22]]],leg2:[[[-3.5,10,-8]],[[-5.5,0,-10],[-1.5,10,-4],[50,40]]],leg3:[[[3.5,10,-8]],[[1.5,0,-10],[5.5,10,-4],[50,40]]]},villager:repeat.villager,witherBoss:{upperBodyPart1:[[[0,24,0]],[[-10,17.1,-0.5],[10,20.1,2.5],[0,16]]],upperBodyPart2:[[[-2,17.1,-0.5]],[[-2,7.1,-0.5],[1,17.1,2.5],[0,22]],[[-6,13.6,0],[5,15.6,2],[24,22]],[[-6,11.1,0],[5,13.1,2],[24,22]],[[-6,8.6,0],[5,10.6,2],[24,22]]],upperBodyPart3:[[[0,24,0]],[[0,18,0],[3,24,3],[12,22]]],head1:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0]]],head2:[[[-9,18,-1]],[[-12,18,-4],[-6,24,2],[32,0]]],head3:[[[9,18,-1]],[[6,18,-4],[12,24,2],[32,0]]]},armor_stand:{head:[[[0,24,0]],[[-1,24,-1],[1,31,1],[0,0]]],body:[[[0,24,0]],[[-6,21,-1.5],[6,24,1.5],[0,26]],[[-3,14,-1],[-1,21,1],[16,0]],[[1,14,-1],[3,21,1],[48,16]],[[-4,12,-1],[4,14,1],[0,48]]],rightArm:[[[-5,22,0]],[[-7,12,-1],[-5,24,1],[24,0]]],leftArm:[[[5,22,0]],[[5,12,-1],[7,24,1],[32,16],0,1]],rightLeg:[[[-1.9,12,0]],[[-2.9,1,-1],[-0.9,12,1],[8,0]]],leftLeg:[[[1.9,12,0]],[[0.9,1,-1],[2.9,12,1],[40,16],0,1]],basePlate:[[[0,0,0]],[[-6,0,-6],[6,1,6],[0,32]]]},parrot:{head:[[[0,8.3,-2.8]],[[-1,6.8,-3.8],[1,9.8,-1.8],[2,2]]],head2:[[[0,26,-1]],[[-1,25.5,-3],[1,26.5,1],[10,0]]],beak1:[[[0,24.5,-1.5]],[[-0.5,23.5,-2],[0.5,25.5,-1],[11,7]]],beak2:[[[0,25.8,-2.5]],[[-0.5,23.8,-3],[0.5,25.5,-2],[16,7]]],body:[[[0,7.5,-3]],[[-1.5,1.5,-4.5],[1.5,7.5,-1.5],[2,8]]],tail:[[[0,2.9,1.2]],[[-1.5,-0.1,0.2],[1.5,3.9,1.2],[22,1]]],wing0:[[[1.5,7.1,-2.8]],[[1,2.1,-4.3],[2,7.1,-1.3],[19,8]]],wing1:[[[-1.5,7.1,-2.8]],[[-2,2.1,-4.3],[-1,7.1,-1.3],[19,8]]],feather:[[[0,26.1,0.2]],[[0,25.1,-1.9],[0,30.1,2.1],[2,18]]],leg0:[[[1,2,-1]],[[0.5,0,-0.5],[1.5,2,0.5],[14,18]]],leg1:[[[-1,2,-1]],[[-1.5,0,-0.5],[-0.5,2,0.5],[14,18]]]},bed:{bed:[[[0,24,0]],[[0,0,0],[16,32,6],[0,0]],[[3,31,6],[13,32,9],[38,2]],[[3,0,6],[13,1,9],[38,38]],[[15,3,6],[16,29,9],[52,6]],[[0,3,6],[1,29,9],[44,6]]],leg1:[[[5,22,0]],[[13,29,6],[16,32,9],[12,38]]],leg0:[[[-5,22,0]],[[0,29,6],[3,32,9],[0,38]]],leg3:[[[2,12,0]],[[13,0,6],[16,3,9],[12,44]]],leg2:[[[-2,12,0]],[[0,0,6],[3,3,9],[0,44]]]},player_head:{head:repeat.humanoid.head},dragon_head:{head:[[[0,24,0]],[[-8,16,-10],[8,32,6],[112,30]],[[-5,32,-4],[-3,36,2],[0,0]],[[3,32,-4],[5,36,2],[0,0],0,1]],snout:[[[0,24,0]],[[-6,20,-24],[6,25,-8],[176,44]],[[-5,25,-22],[-3,27,-18],[112,0]],[[3,25,-22],[5,27,-18],[112,0],0,1]],jaw:repeat.dragon.jaw},cod:{body:[[[0,0,0]],[[-1,0,1],[1,4,8],[0,0]],[[0.0,4.0,0],[0,5,6],[20,-6]],[[-0.0,-1,3.0],[0,0,5],[24,-2]]],head:[[[0,2,0]],[[-1.0,1.0,-3],[1,4,-2],[0,0]],[[-1,0,-2],[1,4,1],[11,0]]],leftFin:[[[1,1,0],[0,0,35]],[[1,0,0],[3,1,2],[24,4]]],rightFin:[[[-1,1,0],[0,0,-35]],[[-3,0,0],[-1,1,2],[24,1]]],tailfin:[[[0,0,8]],[[0,0,8],[0,4,14],[20,1]]]},'pufferfish.small':{body:[[[0,0,0]],[[-1.5,0,-1.5],[1.5,2,1.5],[0,27]],[[0.5,2,-1.5],[1.5,3,-0.5],[24,6]],[[-1.5,2,-1.5],[-0.5,3,-0.5],[28,6]]],tailfin:[[[0,0,0]],[[-1.5,1,1.5],[1.5,1,4.5],[-3,0]]],leftFin:[[[4,7,3]],[[1.5,0,-1.49],[2.5,1,0.51],[25,0]]],rightFin:[[[-4,7,1]],[[-2.5,0,-1.49],[-1.5,1,0.51],[25,0]]]},'pufferfish.mid':{body:[[[0,0,0]],[[-2.5,1,-2.5],[2.5,6,2.5],[12,22]]],leftFin:[[[4,7,3]],[[2.5,5,-1.49],[4.5,6,0.51],[24,3]]],rightFin:[[[-4,7,1]],[[-4,6,1],[-2,7,3],[24,0]]],spines_top_front:[[[-2.5,6,-2.5],[45,0,0]],[[-2.5,6,-2.5],[1.5,7,-1.5],[18,16]]],spines_top_back:[[[-2.5,6,2.5],[-45,0,0]],[[-1.5,6,1.5],[2.5,7,2.5],[10,16]]],spines_bottom_front:[[[-2.5,0,-2.5],[-45,0,0]],[[-2.5,0.5,-2.5],[2.5,1.5,-1.5],[17,19]]],spines_bottom_back:[[[0,1,2.5],[-45,0,0]],[[-2.5,0,2.5],[2.5,1,3.5],[17,20]]],spines_left_front:[[[2.5,0,-2.5],[0,45,0]],[[2.5,1,-2.5],[3.5,6,-1.5],[4,16]]],spines_left_back:[[[2.5,0,2.5],[0,-45,0]],[[2.5,1,2.5],[3.5,6,3.5],[4,16]]],spines_right_front:[[[-2.5,0,-2.5],[0,-45,0]],[[-3.5,1,-2.5],[-2.5,6,-1.5],[4,16]]],spines_right_back:[[[-2.5,0,2.5],[0,45,0]],[[-3.5,1,2.5],[-2.5,6,3.5],[8,16]]]},'pufferfish.large':{body:[[[0,0,0]],[[-4,0,-4],[4,8,4],[0,0]]],leftFin:[[[4,7,3]],[[4,6,-2.99],[6,7,-0.99],[24,3]]],rightFin:[[[-4,7,1]],[[-6.0,6,-2.99],[-4,7,-0.99],[24,0]]],spines_top_front:[[[-4,8,-4],[45,0,0]],[[-4,8,-4],[4,9,-3],[14,16]]],spines_top_mid:[[[0,8,0]],[[-4,8,0],[4,9,1],[14,16]]],spines_top_back:[[[0,8,4],[-45,0,0]],[[-4,8,4],[4,9,5],[14,16]]],spines_bottom_front:[[[0,0,-4],[-45,0,0]],[[-4,-1,-4],[4,0,-3],[14,19]]],spines_bottom_mid:[[[0,-1,0]],[[-4,-1,0],[4,0,1],[14,19]]],spines_bottom_back:[[[0,0,4],[-45,0,0]],[[-4,-1,4],[4,0,5],[14,20]]],spines_left_front:[[[4,0,-4],[0,45,0]],[[4,0,-4],[5,8,-3],[0,16]]],spines_left_mid:[[[4,0,0]],[[4,0,0],[5,8,1],[4,16]]],spines_left_back:[[[4,0,4],[0,-45,0]],[[4,0,4],[5,8,5],[8,16]]],spines_right_front:[[[-4,0,-4],[0,-45,0]],[[-5,0,-4],[-4,8,-3],[4,16]]],spines_right_mid:[[[-4,0,0]],[[-5,0,0],[-4,8,1],[8,16]]],spines_right_back:[[[-4,0,4],[0,45,0]],[[-5,0,4],[-4,8,5],[8,16]]]},salmon:{body_front:[[[0,0,-4]],[[-1.5,3.5,-4],[1.5,8.5,4],[0,0]]],body_back:[[[0,0,4]],[[-1.5,3.5,4],[1.5,8.5,12],[0,13]]],dorsal_front:[[[0,5,2]],[[0,8.5,2],[0,10.5,4],[4,2]]],dorsal_back:[[[0,5,4]],[[0,8.5,4],[0,10.5,7],[2,3]]],tailfin:[[[0,0,12]],[[0,3.5,12],[0,8.5,18],[20,10]]],head:[[[0,3,-4]],[[-1,4.5,-7],[1,8.5,-4],[22,0]]],leftFin:[[[1.5,1,-4],[0,0,35]],[[-0.51,3.87,-4],[1.49,3.87,-2],[2,0]]],rightFin:[[[-1.5,1,-4],[0,0,-35]],[[-1.49,3.87,-4],[0.51,3.87,-2],[-2,0]]]},tropicalfish_a:{body:[[[-0.5,0,0]],[[-1,0,-3],[1,3,3],[0,0]],[[0,3,-3.0],[0,7,3],[10,-6]]],tailfin:[[[0,0,3]],[[0,0,3],[0,3,7],[24,-4]]],leftFin:[[[0.5,0,1],[0,-35,0]],[[0.34,0,-0.11],[2.34,2,-0.11],[2,12]]],rightFin:[[[-0.5,0,1],[0,35,0]],[[-2.34,0,-0.11],[-0.34,2,-0.11],[2,16]]]},tropicalfish_b:{body:[[[-0.5,0,0]],[[-1,0,-0.0],[1,6,6],[0,20]],[[0,-5,-0.0],[0,0,6],[20,21]],[[0,6,-0.0],[0,11,6],[20,10]]],tailfin:[[[0,0,6]],[[0,0.0,6],[0,6,11],[21,16]]],leftFin:[[[0.5,0,1],[0,-35,0]],[[2.06,0,2.35],[4.06,2,2.35],[2,12]]],rightFin:[[[-0.5,0,1],[0,35,0]],[[-4.06,0,2.35],[-2.06,2,2.35],[2,16]]]},'creeper.charged':{body:[[[0,0,0]],[[-4,6,-2],[4,18,2],[16,16],2]],head:[[[0,18,0]],[[-4,18,-4],[4,26,4],[0,0],2]],leg0:[[[-2,6,4]],[[-4,0,2],[0,6,6],[0,16],2]],leg1:[[[2,6,4]],[[0,0,2],[4,6,6],[0,16],2]],leg2:[[[-2,6,-4]],[[-4,0,-6],[0,6,-2],[0,16],2]],leg3:[[[2,6,-4]],[[0,0,-6],[4,6,-2],[0,16],2]]},enderman:{body:[[[0,38,0]],[[-4,26,-2],[4,38,2],[32,16]]],head:repeat.humanoid.head,hat:[[[0,38,0]],[[-4,38,-4],[4,46,4],[0,16],-0.5]],rightArm:[[[-3,36,0]],[[-4,8,-1],[-2,38,1],[56,0]]],leftArm:[[[5,36,0]],[[4,8,-1],[6,38,1],[56,0],0,1]],rightLeg:[[[-2,26,0]],[[-3,-4,-1],[-1,26,1],[56,0]]],leftLeg:[[[2,26,0]],[[1,-4,-1],[3,26,1],[56,0],0,1]]},'sheep.sheared':{body:[[[0,19,2]],[[-4,13,-5],[4,29,1],[28,8]]],head:[[[0,18,-8]],[[-3,16,-14],[3,22,-6],[0,0]]],leg0:[[[-3,12,7]],[[-5,0,5],[-1,12,9],[0,16]]],leg1:[[[3,12,7]],[[1,0,5],[5,12,9],[0,16]]],leg2:[[[-3,12,-5]],[[-5,0,-7],[-1,12,-3],[0,16]]],leg3:[[[3,12,-5]],[[1,0,-7],[5,12,-3],[0,16]]]},pig:{body:[[[0,13,2]],[[-5,7,-5],[5,23,3],[28,8]]],head:[[[0,12,-6]],[[-4,8,-14],[4,16,-6],[0,0]],[[-2,9,-15],[2,12,-14],[16,16]]],leg0:[[[-3,6,7]],[[-5,0,5],[-1,6,9],[0,16]]],leg1:[[[3,6,7]],[[1,0,5],[5,6,9],[0,16]]],leg2:[[[-3,6,-5]],[[-5,0,-7],[-1,6,-3],[0,16]]],leg3:[[[3,6,-5]],[[1,0,-7],[5,6,-3],[0,16]]]},'zombie.villager':{body:repeat.villager.body,head:[[[0,24,0]],[[-4,24,-4],[4,34,4],[0,0]],[[-1,23,-6],[1,27,-4],[24,0],0.25]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[44,38]]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[44,38],0,1]],rightLeg:repeat.villager.leg0,leftLeg:repeat.zombieVillagerLeftLeg},evoker:{head:repeat.villager.head,nose:repeat.villager.nose,body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,rightarm:repeat.illager.rightarm,leftarm:repeat.illager.leftarm},vex:{body:repeat.humanoid.body,head:repeat.humanoid.head,rightarm:repeat.humanoid.rightArm,leftarm:repeat.humanoid.leftArm,leg0:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16]],[[-2.9,3,-2],[3.1,13,2],[32,0]]],leftwing:[[[0,24,0]],[[0,12,0],[20,24,1],[0,32],0,1]],rightwing:[[[0,24,0]],[[-20,12,0],[0,24,1],[0,32]]]},'villager.witch':{head:repeat.villager.head,nose:[[[0,26,0]],[[0,25,-6.75],[1,26,-5.75],[0,0],-0.25],[[-1,23,-6],[1,27,-4],[24,0]]],body:repeat.villager.body,arms:repeat.villager.arms,leg0:repeat.villager.leg0,leg1:repeat.zombieVillagerLeftLeg,hat:[[[-5,32.03,-5]],[[-5,32.05,-5],[5,34.05,5],[0,64]]],hat2:[[[1.75,32,2],[-3,0,1.5]],[[-3.25,33.5,-3],[3.75,37.5,4],[0,76]]],hat3:[[[1.75,35,2],[-6,0,3]],[[-1.5,36.5,-1],[2.5,40.5,3],[0,87]]],hat4:[[[1.75,38,2],[-12,0,6]],[[0.25,40,1],[1.25,42,2],[0,95],0.25]]},'witherBoss.armor':{upperBodyPart1:[[[0,24,0]],[[-10,17.1,-0.5],[10,20.1,2.5],[0,16],2]],upperBodyPart2:[[[-2,17.1,-0.5]],[[-2,7.1,-0.5],[1,17.1,2.5],[0,22],2],[[-6,13.6,0],[5,15.6,2],[24,22],2],[[-6,11.1,0],[5,13.1,2],[24,22],2],[[-6,8.6,0],[5,10.6,2],[24,22],2]],upperBodyPart3:[[[0,24,0]],[[0,18,0],[3,24,3],[12,22],2]],head1:[[[0,20,0]],[[-4,20,-4],[4,28,4],[0,0],2]],head2:[[[-9,18,-1]],[[-12,18,-4],[-6,24,2],[32,0],2]],head3:[[[9,18,-1]],[[6,18,-4],[12,24,2],[32,0],2]]},skeleton:{body:repeat.humanoid.body,head:repeat.humanoid.head,rightArm:[[[-5,22,0]],[[-6,12,-1],[-4,24,1],[40,16]]],leftArm:[[[5,22,0]],[[4,12,-1],[6,24,1],[40,16],0,1]],rightLeg:[[[-2,12,0]],[[-3,0,-1],[-1,12,1],[0,16]]],leftLeg:[[[2,12,0]],[[1,0,-1],[3,12,1],[0,16],0,1]]},'stray.armor':{body:[[[0,24,0]],[[-4,12,-2],[4,24,2],[16,16],0.25]],head:[[[0,24,0]],[[-4,24,-4],[4,32,4],[0,0],0.25]],rightArm:[[[-5,22,0]],[[-8,12,-2],[-4,24,2],[40,16],0.25]],leftArm:[[[5,22,0]],[[4,12,-2],[8,24,2],[40,16],0.25,1]],rightLeg:[[[-1.9,12,0]],[[-3.9,0,-2],[0.1,12,2],[0,16],0.25]],leftLeg:[[[1.9,12,0]],[[-0.1,0,-2],[3.9,12,2],[0,16],0.25,1]]},sheep:{body:[[[0,19,2]],[[-4,13,-5],[4,29,1],[28,40],1.75]],head:[[[0,18,-8]],[[-3,16,-12],[3,22,-6],[0,32],0.6]],leg0:[[[-3,12,7]],[[-5,6,5],[-1,12,9],[0,48],0.5]],leg1:[[[3,12,7]],[[1,6,5],[5,12,9],[0,48],0.5]],leg2:[[[-3,12,-5]],[[-5,6,-7],[-1,12,-3],[0,48],0.5]],leg3:[[[3,12,-5]],[[1,6,-7],[5,12,-3],[0,48],0.5]]},boat:{bottom:[[[0,18,0],[-90,0,0]],[[-14,10,0],[14,26,3],[0,0]]],front:[[[-15,24,0],[0,-90,0]],[[-23,21,-1],[-7,27,1],[0,27]]],back:[[[15,24,0],[0,90,0]],[[6,21,-1],[24,27,1],[0,19]]],right:[[[0,24,-9],[0,180,0]],[[-14,21,-10],[14,27,-8],[0,35]]],left:[[[0,24,9]],[[-14,21,8],[14,27,10],[0,43]]],paddle_left:[[[2.5,28,9]],[[1.5,27,3.5],[3.5,29,21.5],[62,0]],[[1.51,26,17.5],[2.51,32,24.5],[62,0]]],paddle_right:[[[2.5,28,-9]],[[1.5,27,-14.5],[3.5,29,3.5],[62,20]],[[2.49,26,-0.5],[3.49,32,6.5],[62,20]]]},minecart:{bottom:[[[0,20,0],[-90,0,0]],[[-10,12,-1],[10,28,1],[0,10]]],front:[[[9,25,0],[0,90,0]],[[1,21,-1],[17,29,1],[0,0]]],back:[[[-9,25,0],[0,-90,0]],[[-17,21,-1],[-1,29,1],[0,0]]],right:[[[0,25,-7],[0,180,0]],[[-8,21,-8],[8,29,-6],[0,0]]],left:[[[0,25,7]],[[-8,21,6],[8,29,8],[0,0]]]},endermite:{bodyPart_0:[[[0,0,-3.5]],[[-2,0,-4.5],[2,3,-2.5],[0,0]]],bodyPart_1:[[[0,0,0]],[[-3,0,-2.5],[3,4,2.5],[0,5]]],bodyPart_2:[[[0,0,3]],[[-1.5,0,2.5],[1.5,3,3.5],[0,14]]],bodyPart_3:[[[0,0,4]],[[-0.5,0,3.5],[0.5,2,4.5],[0,18]]]}}\n\n//Copies humanoid bones so the hat isn't added to 'humanoid' as well\nentity_bones.pigzombie = Object.assign({},repeat.humanoid)\n//Adds in zombie pigmans hat layer\n//Everything else is the same as 'humanoid'\nentity_bones.pigzombie.hat = [[[0,24,0]],[[-4,24,-4],[4,32,4],[32,0],0.5]]\n\n/***********************************\\\n|           DIALOG WINDOW           |\n\\***********************************/\n\n//Dropdown selection used in the dialog window\nvar bedrock_entity_list = `Select an entity: \n<select style=\"color:var(--color-text)\" id=\"bedrock_entity_list\">\n<option value=\"armor_stand\">Armor Stand</option>\n<option value=\"bat\">Bat</option>\n<option value=\"bed\">Bed</option>\n<option value=\"blaze\">Blaze</option>\n<option value=\"boat\">Boat</option>\n<option value=\"ocelot\">Cat</option>\n<option value=\"chicken\">Chicken</option>\n<option value=\"cod\">Cod</option>\n<option value=\"cow\">Cow</option>\n<option value=\"creeper\">Creeper</option>\n<option value=\"creeper.charged\">Charged Creeper Armor</option>\n<option value=\"dolphin\">Dolphin</option>\n<option value=\"zombie.drowned\">Drowned</option>\n<option value=\"enderman\">Enderman</option>\n<option value=\"endermite\">Endermite</option>\n<option value=\"dragon\">Ender Dragon</option>\n<option value=\"dragon_head\">Ender Dragon Head</option>\n<option value=\"evoker\">Evoker</option>\n<option value=\"ghast\">Ghast</option>\n<option value=\"guardian\">Guardian</option>\n<option value=\"horse\">Horse (Old)</option>\n<option value=\"horse.v2\">Horse (New)</option>\n<option value=\"humanoid\">Humanoid</option>\n<option value=\"zombie.husk\">Husk</option>\n<option value=\"irongolem\">Iron Golem</option>\n<option value=\"llama\">Llama</option>\n<option value=\"llamaspit\">Llama Spit</option>\n<option value=\"lavaslime\">Magma Cube</option>\n<option value=\"minecart\">Minecart</option>\n<option value=\"mob_head\">Mob Head</option>\n<option value=\"mooshroom\">Mooshroom Cow</option>\n<option value=\"parrot\">Parrot</option>\n<option value=\"pig\">Pig</option>\n<option value=\"player_head\">Player Head</option>\n<option value=\"polarbear\">Polarbear</option>\n<option value=\"pufferfish.small\">Pufferfish (Small)</option>\n<option value=\"pufferfish.mid\">Pufferfish (Medium)</option>\n<option value=\"pufferfish.large\">Pufferfish (Large)</option>\n<option value=\"rabbit\">Rabbit</option>\n<option value=\"salmon\">Salmon</option>\n<option value=\"sheep.sheared\">Sheep (Sheared)</option>\n<option value=\"sheep\">Sheep (Wool)</option>\n<option value=\"shulker\">Shulker</option>\n<option value=\"silverfish\">Silverfish</option>\n<option value=\"skeleton\">Skeleton</option>\n<option value=\"slime\">Slime (Inner Cube)</option>\n<option value=\"slime.armor\">Slime (Outer Cube)</option>\n<option value=\"snowgolem\">Snow Golem</option>\n<option value=\"spider\">Spider</option>\n<option value=\"squid\">Squid</option>\n<option value=\"skeleton.stray\">Stray</option>\n<option value=\"stray.armor\">Stray (Robes)</option>\n<option value=\"trident\">Trident</option>\n<option value=\"tropicalfish_a\">Tropical Fish (A)</option>\n<option value=\"tropicalfish_b\">Tropical Fish (B)</option>\n<option value=\"vex\">Vex</option>\n<option value=\"villager\">Villager</option>\n<option value=\"vindicator\">Vindicator</option>\n<option value=\"villager.witch\">Witch</option>\n<option value=\"witherBoss\">Wither Boss</option>\n<option value=\"witherBoss.armor\">Wither Boss Armor</option>\n<option value=\"skeleton.wither\">Wither Skeleton</option>\n<option value=\"wolf\">Wolf</option>\n<option value=\"zombie\">Zombie</option>\n<option value=\"pigzombie\">Zombie Pigman</option>\n<option value=\"pigzombie.baby\">Zombie Pigman (Baby)</option>\n<option value=\"zombie.villager\">Zombie Villager</option>\n</select>`\n\n//Dialog window\nvar bedrock_entity_selector = new Dialog({title:'Entity Selector', id:'entity_selector', lines:[bedrock_entity_list + '<br/><p>Create entity model  <input type=\"checkbox\" id=\"mob_model\"></p>', '<p>Add default entity parent  <input type=\"checkbox\" id=\"mob_parent\"></p>', '<br>']})\n\n//Runs when 'confirm' is clicked on the dialog window\nbedrock_entity_selector.onConfirm = function() {\n\n\t//Gets the entity from the dropdown list selected in the dialog window\n\tentity = $('#bedrock_entity_list')[0].value\n\n\t//Changes the project texture size to the default texture size of the chosen entity\n\tchangeTextureSizes(entity)\n\n\t//Passes whether 'Create entity model' is checked to the function\n\tcreateBones(entity, $('#mob_model')[0].checked)\n\t//Changes the project name to the correct value for the entity selected\n\tProject.geometry_name = getEntityName(entity, $('#mob_parent')[0].checked)\n\t//Sets the file name to the default mobs.json, if there isn't a file name\n\tif (Project.name == '') Project.name = 'mobs.json'\n\n\tCanvas.updateAll()\n\n\t//Hides the dialog window\n\tbedrock_entity_selector.hide()\n}\n\n/***********************************\\\n|            MENU ENTRY             |\n\\***********************************/\n\n//Adds an entry to the plugin menu\nBlockbench.addMenuEntry('Bedrock Entity Generator', 'pets', function() {\n\tbedrock_entity_selector.show()\n})\n\n/***********************************\\\n|         UNINSTALL PLUGIN          |\n\\***********************************/\n\nonUninstall = function() {\n\t//Removes the menu entry\n\tBlockbench.removeMenuEntry('Bedrock Entity Generator')\n}"
  },
  {
    "path": "plugins/gltf_importer/LICENSE.MD",
    "content": "## License for glTF Importer\n\nMIT License\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 all\ncopies 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 THE\nSOFTWARE.\n\n--------------------------------------------------------------------------------\n\n## Third-Party License for GLTFLoader.js\n\nThree.js glTF Model Loader\nhttps://github.com/mrdoob/three.js\n\nCopyright © 2010-2021 three.js authors\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\n--------------------------------------------------------------------------------\n\n## Trademark Notice for glTF\n\nglTF and the glTF logo are trademarks of the Khronos Group Inc.\n"
  },
  {
    "path": "plugins/gltf_importer/about.md",
    "content": "Adds the options to import a glTF (.GLTF or .GLB) model as a generic model.\nCurrently only imports meshes, textures and groups.\nArmatures and animations are not supported as of this version.\n\n<!-- // TODO: - Blockbench 5.0 or newer is required to import armatures. -->\n<!-- // TODO: - The \"Cameras\" plugin *(by JannisX11)* is required to import cameras. -->\n\n--------------------------------------------------------------------------------\n\n*This plugin is not affiliated with, endorsed by, or officially certified by the Khronos Group.*\n\n*glTF and the glTF logo are trademarks of the Khronos Group Inc.*\n"
  },
  {
    "path": "plugins/gltf_importer/gltf_importer.js",
    "content": "(() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __esm = (fn, res) => function __init() {\n    return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // plugin/GLTFLoader.js\n  var GLTFLoader_exports = {};\n  var init_GLTFLoader = __esm({\n    \"plugin/GLTFLoader.js\"() {\n      (function() {\n        class GLTFLoader extends THREE.Loader {\n          constructor(manager) {\n            super(manager);\n            this.dracoLoader = null;\n            this.ktx2Loader = null;\n            this.meshoptDecoder = null;\n            this.pluginCallbacks = [];\n            this.register(function(parser) {\n              return new GLTFMaterialsClearcoatExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFTextureBasisUExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFTextureWebPExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFMaterialsTransmissionExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFMaterialsVolumeExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFMaterialsIorExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFMaterialsSpecularExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFLightsExtension(parser);\n            });\n            this.register(function(parser) {\n              return new GLTFMeshoptCompression(parser);\n            });\n          }\n          load(url, onLoad, onProgress, onError) {\n            const scope = this;\n            let resourcePath;\n            if (this.resourcePath !== \"\") {\n              resourcePath = this.resourcePath;\n            } else if (this.path !== \"\") {\n              resourcePath = this.path;\n            } else {\n              resourcePath = THREE.LoaderUtils.extractUrlBase(url);\n            }\n            this.manager.itemStart(url);\n            const _onError = function(e) {\n              if (onError) {\n                onError(e);\n              } else {\n                console.error(e);\n              }\n              scope.manager.itemError(url);\n              scope.manager.itemEnd(url);\n            };\n            const loader = new THREE.FileLoader(this.manager);\n            loader.setPath(this.path);\n            loader.setResponseType(\"arraybuffer\");\n            loader.setRequestHeader(this.requestHeader);\n            loader.setWithCredentials(this.withCredentials);\n            loader.load(url, function(data) {\n              try {\n                scope.parse(data, resourcePath, function(gltf) {\n                  onLoad(gltf);\n                  scope.manager.itemEnd(url);\n                }, _onError);\n              } catch (e) {\n                _onError(e);\n              }\n            }, onProgress, _onError);\n          }\n          setDRACOLoader(dracoLoader) {\n            this.dracoLoader = dracoLoader;\n            return this;\n          }\n          setDDSLoader() {\n            throw new Error('THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".');\n          }\n          setKTX2Loader(ktx2Loader) {\n            this.ktx2Loader = ktx2Loader;\n            return this;\n          }\n          setMeshoptDecoder(meshoptDecoder) {\n            this.meshoptDecoder = meshoptDecoder;\n            return this;\n          }\n          register(callback) {\n            if (this.pluginCallbacks.indexOf(callback) === -1) {\n              this.pluginCallbacks.push(callback);\n            }\n            return this;\n          }\n          unregister(callback) {\n            if (this.pluginCallbacks.indexOf(callback) !== -1) {\n              this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(callback), 1);\n            }\n            return this;\n          }\n          parse(data, path, onLoad, onError) {\n            let content;\n            const extensions = {};\n            const plugins = {};\n            if (typeof data === \"string\") {\n              content = data;\n            } else {\n              const magic = THREE.LoaderUtils.decodeText(new Uint8Array(data, 0, 4));\n              if (magic === BINARY_EXTENSION_HEADER_MAGIC) {\n                try {\n                  extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data);\n                } catch (error) {\n                  if (onError) onError(error);\n                  return;\n                }\n                content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content;\n              } else {\n                content = THREE.LoaderUtils.decodeText(new Uint8Array(data));\n              }\n            }\n            const json = JSON.parse(content);\n            if (json.asset === void 0 || json.asset.version[0] < 2) {\n              if (onError) onError(new Error(\"THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.\"));\n              return;\n            }\n            const parser = new GLTFParser(json, {\n              path: path || this.resourcePath || \"\",\n              crossOrigin: this.crossOrigin,\n              requestHeader: this.requestHeader,\n              manager: this.manager,\n              ktx2Loader: this.ktx2Loader,\n              meshoptDecoder: this.meshoptDecoder\n            });\n            parser.fileLoader.setRequestHeader(this.requestHeader);\n            for (let i = 0; i < this.pluginCallbacks.length; i++) {\n              const plugin = this.pluginCallbacks[i](parser);\n              plugins[plugin.name] = plugin;\n              extensions[plugin.name] = true;\n            }\n            if (json.extensionsUsed) {\n              for (let i = 0; i < json.extensionsUsed.length; ++i) {\n                const extensionName = json.extensionsUsed[i];\n                const extensionsRequired = json.extensionsRequired || [];\n                switch (extensionName) {\n                  case EXTENSIONS.KHR_MATERIALS_UNLIT:\n                    extensions[extensionName] = new GLTFMaterialsUnlitExtension();\n                    break;\n                  case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n                    extensions[extensionName] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n                    break;\n                  case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n                    extensions[extensionName] = new GLTFDracoMeshCompressionExtension(json, this.dracoLoader);\n                    break;\n                  case EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n                    extensions[extensionName] = new GLTFTextureTransformExtension();\n                    break;\n                  case EXTENSIONS.KHR_MESH_QUANTIZATION:\n                    extensions[extensionName] = new GLTFMeshQuantizationExtension();\n                    break;\n                  default:\n                    if (extensionsRequired.indexOf(extensionName) >= 0 && plugins[extensionName] === void 0) {\n                      console.warn('THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".');\n                    }\n                }\n              }\n            }\n            parser.setExtensions(extensions);\n            parser.setPlugins(plugins);\n            parser.parse(onLoad, onError);\n          }\n        }\n        function GLTFRegistry() {\n          let objects = {};\n          return {\n            get: function(key) {\n              return objects[key];\n            },\n            add: function(key, object) {\n              objects[key] = object;\n            },\n            remove: function(key) {\n              delete objects[key];\n            },\n            removeAll: function() {\n              objects = {};\n            }\n          };\n        }\n        const EXTENSIONS = {\n          KHR_BINARY_GLTF: \"KHR_binary_glTF\",\n          KHR_DRACO_MESH_COMPRESSION: \"KHR_draco_mesh_compression\",\n          KHR_LIGHTS_PUNCTUAL: \"KHR_lights_punctual\",\n          KHR_MATERIALS_CLEARCOAT: \"KHR_materials_clearcoat\",\n          KHR_MATERIALS_IOR: \"KHR_materials_ior\",\n          KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: \"KHR_materials_pbrSpecularGlossiness\",\n          KHR_MATERIALS_SPECULAR: \"KHR_materials_specular\",\n          KHR_MATERIALS_TRANSMISSION: \"KHR_materials_transmission\",\n          KHR_MATERIALS_UNLIT: \"KHR_materials_unlit\",\n          KHR_MATERIALS_VOLUME: \"KHR_materials_volume\",\n          KHR_TEXTURE_BASISU: \"KHR_texture_basisu\",\n          KHR_TEXTURE_TRANSFORM: \"KHR_texture_transform\",\n          KHR_MESH_QUANTIZATION: \"KHR_mesh_quantization\",\n          EXT_TEXTURE_WEBP: \"EXT_texture_webp\",\n          EXT_MESHOPT_COMPRESSION: \"EXT_meshopt_compression\"\n        };\n        class GLTFLightsExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n            this.cache = {\n              refs: {},\n              uses: {}\n            };\n          }\n          _markDefs() {\n            const parser = this.parser;\n            const nodeDefs = this.parser.json.nodes || [];\n            for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) {\n              const nodeDef = nodeDefs[nodeIndex];\n              if (nodeDef.extensions && nodeDef.extensions[this.name] && nodeDef.extensions[this.name].light !== void 0) {\n                parser._addNodeRef(this.cache, nodeDef.extensions[this.name].light);\n              }\n            }\n          }\n          _loadLight(lightIndex) {\n            const parser = this.parser;\n            const cacheKey = \"light:\" + lightIndex;\n            let dependency = parser.cache.get(cacheKey);\n            if (dependency) return dependency;\n            const json = parser.json;\n            const extensions = json.extensions && json.extensions[this.name] || {};\n            const lightDefs = extensions.lights || [];\n            const lightDef = lightDefs[lightIndex];\n            let lightNode;\n            const color = new THREE.Color(16777215);\n            if (lightDef.color !== void 0) color.fromArray(lightDef.color);\n            const range = lightDef.range !== void 0 ? lightDef.range : 0;\n            switch (lightDef.type) {\n              case \"directional\":\n                lightNode = new THREE.DirectionalLight(color);\n                lightNode.target.position.set(0, 0, -1);\n                lightNode.add(lightNode.target);\n                break;\n              case \"point\":\n                lightNode = new THREE.PointLight(color);\n                lightNode.distance = range;\n                break;\n              case \"spot\":\n                lightNode = new THREE.SpotLight(color);\n                lightNode.distance = range;\n                lightDef.spot = lightDef.spot || {};\n                lightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== void 0 ? lightDef.spot.innerConeAngle : 0;\n                lightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== void 0 ? lightDef.spot.outerConeAngle : Math.PI / 4;\n                lightNode.angle = lightDef.spot.outerConeAngle;\n                lightNode.penumbra = 1 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n                lightNode.target.position.set(0, 0, -1);\n                lightNode.add(lightNode.target);\n                break;\n              default:\n                throw new Error(\"THREE.GLTFLoader: Unexpected light type: \" + lightDef.type);\n            }\n            lightNode.position.set(0, 0, 0);\n            lightNode.decay = 2;\n            if (lightDef.intensity !== void 0) lightNode.intensity = lightDef.intensity;\n            lightNode.name = parser.createUniqueName(lightDef.name || \"light_\" + lightIndex);\n            dependency = Promise.resolve(lightNode);\n            parser.cache.add(cacheKey, dependency);\n            return dependency;\n          }\n          createNodeAttachment(nodeIndex) {\n            const self2 = this;\n            const parser = this.parser;\n            const json = parser.json;\n            const nodeDef = json.nodes[nodeIndex];\n            const lightDef = nodeDef.extensions && nodeDef.extensions[this.name] || {};\n            const lightIndex = lightDef.light;\n            if (lightIndex === void 0) return null;\n            return this._loadLight(lightIndex).then(function(light) {\n              return parser._getNodeRef(self2.cache, lightIndex, light);\n            });\n          }\n        }\n        class GLTFMaterialsUnlitExtension {\n          constructor() {\n            this.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n          }\n          getMaterialType() {\n            return THREE.MeshBasicMaterial;\n          }\n          extendParams(materialParams, materialDef, parser) {\n            const pending = [];\n            materialParams.color = new THREE.Color(1, 1, 1);\n            materialParams.opacity = 1;\n            const metallicRoughness = materialDef.pbrMetallicRoughness;\n            if (metallicRoughness) {\n              if (Array.isArray(metallicRoughness.baseColorFactor)) {\n                const array = metallicRoughness.baseColorFactor;\n                materialParams.color.fromArray(array);\n                materialParams.opacity = array[3];\n              }\n              if (metallicRoughness.baseColorTexture !== void 0) {\n                pending.push(parser.assignTexture(materialParams, \"map\", metallicRoughness.baseColorTexture));\n              }\n            }\n            return Promise.all(pending);\n          }\n        }\n        class GLTFMaterialsClearcoatExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n          }\n          getMaterialType(materialIndex) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;\n            return THREE.MeshPhysicalMaterial;\n          }\n          extendMaterialParams(materialIndex, materialParams) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) {\n              return Promise.resolve();\n            }\n            const pending = [];\n            const extension = materialDef.extensions[this.name];\n            if (extension.clearcoatFactor !== void 0) {\n              materialParams.clearcoat = extension.clearcoatFactor;\n            }\n            if (extension.clearcoatTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"clearcoatMap\", extension.clearcoatTexture));\n            }\n            if (extension.clearcoatRoughnessFactor !== void 0) {\n              materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n            }\n            if (extension.clearcoatRoughnessTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"clearcoatRoughnessMap\", extension.clearcoatRoughnessTexture));\n            }\n            if (extension.clearcoatNormalTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"clearcoatNormalMap\", extension.clearcoatNormalTexture));\n              if (extension.clearcoatNormalTexture.scale !== void 0) {\n                const scale = extension.clearcoatNormalTexture.scale;\n                materialParams.clearcoatNormalScale = new THREE.Vector2(scale, -scale);\n              }\n            }\n            return Promise.all(pending);\n          }\n        }\n        class GLTFMaterialsTransmissionExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n          }\n          getMaterialType(materialIndex) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;\n            return THREE.MeshPhysicalMaterial;\n          }\n          extendMaterialParams(materialIndex, materialParams) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) {\n              return Promise.resolve();\n            }\n            const pending = [];\n            const extension = materialDef.extensions[this.name];\n            if (extension.transmissionFactor !== void 0) {\n              materialParams.transmission = extension.transmissionFactor;\n            }\n            if (extension.transmissionTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"transmissionMap\", extension.transmissionTexture));\n            }\n            return Promise.all(pending);\n          }\n        }\n        class GLTFMaterialsVolumeExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n          }\n          getMaterialType(materialIndex) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;\n            return THREE.MeshPhysicalMaterial;\n          }\n          extendMaterialParams(materialIndex, materialParams) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) {\n              return Promise.resolve();\n            }\n            const pending = [];\n            const extension = materialDef.extensions[this.name];\n            materialParams.thickness = extension.thicknessFactor !== void 0 ? extension.thicknessFactor : 0;\n            if (extension.thicknessTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"thicknessMap\", extension.thicknessTexture));\n            }\n            materialParams.attenuationDistance = extension.attenuationDistance || 0;\n            const colorArray = extension.attenuationColor || [1, 1, 1];\n            materialParams.attenuationTint = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]);\n            return Promise.all(pending);\n          }\n        }\n        class GLTFMaterialsIorExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_MATERIALS_IOR;\n          }\n          getMaterialType(materialIndex) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;\n            return THREE.MeshPhysicalMaterial;\n          }\n          extendMaterialParams(materialIndex, materialParams) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) {\n              return Promise.resolve();\n            }\n            const extension = materialDef.extensions[this.name];\n            materialParams.ior = extension.ior !== void 0 ? extension.ior : 1.5;\n            return Promise.resolve();\n          }\n        }\n        class GLTFMaterialsSpecularExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n          }\n          getMaterialType(materialIndex) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) return null;\n            return THREE.MeshPhysicalMaterial;\n          }\n          extendMaterialParams(materialIndex, materialParams) {\n            const parser = this.parser;\n            const materialDef = parser.json.materials[materialIndex];\n            if (!materialDef.extensions || !materialDef.extensions[this.name]) {\n              return Promise.resolve();\n            }\n            const pending = [];\n            const extension = materialDef.extensions[this.name];\n            materialParams.specularIntensity = extension.specularFactor !== void 0 ? extension.specularFactor : 1;\n            if (extension.specularTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"specularIntensityMap\", extension.specularTexture));\n            }\n            const colorArray = extension.specularColorFactor || [1, 1, 1];\n            materialParams.specularTint = new THREE.Color(colorArray[0], colorArray[1], colorArray[2]);\n            if (extension.specularColorTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"specularTintMap\", extension.specularColorTexture).then(function(texture) {\n                texture.encoding = THREE.sRGBEncoding;\n              }));\n            }\n            return Promise.all(pending);\n          }\n        }\n        class GLTFTextureBasisUExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n          }\n          loadTexture(textureIndex) {\n            const parser = this.parser;\n            const json = parser.json;\n            const textureDef = json.textures[textureIndex];\n            if (!textureDef.extensions || !textureDef.extensions[this.name]) {\n              return null;\n            }\n            const extension = textureDef.extensions[this.name];\n            const source = json.images[extension.source];\n            const loader = parser.options.ktx2Loader;\n            if (!loader) {\n              if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) {\n                throw new Error(\"THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures\");\n              } else {\n                return null;\n              }\n            }\n            return parser.loadTextureImage(textureIndex, source, loader);\n          }\n        }\n        class GLTFTextureWebPExtension {\n          constructor(parser) {\n            this.parser = parser;\n            this.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n            this.isSupported = null;\n          }\n          loadTexture(textureIndex) {\n            const name = this.name;\n            const parser = this.parser;\n            const json = parser.json;\n            const textureDef = json.textures[textureIndex];\n            if (!textureDef.extensions || !textureDef.extensions[name]) {\n              return null;\n            }\n            const extension = textureDef.extensions[name];\n            const source = json.images[extension.source];\n            let loader = parser.textureLoader;\n            if (source.uri) {\n              const handler = parser.options.manager.getHandler(source.uri);\n              if (handler !== null) loader = handler;\n            }\n            return this.detectSupport().then(function(isSupported) {\n              if (isSupported) return parser.loadTextureImage(textureIndex, source, loader);\n              if (json.extensionsRequired && json.extensionsRequired.indexOf(name) >= 0) {\n                throw new Error(\"THREE.GLTFLoader: WebP required by asset but unsupported.\");\n              }\n              return parser.loadTexture(textureIndex);\n            });\n          }\n          detectSupport() {\n            if (!this.isSupported) {\n              this.isSupported = new Promise(function(resolve) {\n                const image = new Image();\n                image.src = \"data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA\";\n                image.onload = image.onerror = function() {\n                  resolve(image.height === 1);\n                };\n              });\n            }\n            return this.isSupported;\n          }\n        }\n        class GLTFMeshoptCompression {\n          constructor(parser) {\n            this.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n            this.parser = parser;\n          }\n          loadBufferView(index) {\n            const json = this.parser.json;\n            const bufferView = json.bufferViews[index];\n            if (bufferView.extensions && bufferView.extensions[this.name]) {\n              const extensionDef = bufferView.extensions[this.name];\n              const buffer = this.parser.getDependency(\"buffer\", extensionDef.buffer);\n              const decoder = this.parser.options.meshoptDecoder;\n              if (!decoder || !decoder.supported) {\n                if (json.extensionsRequired && json.extensionsRequired.indexOf(this.name) >= 0) {\n                  throw new Error(\"THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files\");\n                } else {\n                  return null;\n                }\n              }\n              return Promise.all([buffer, decoder.ready]).then(function(res) {\n                const byteOffset = extensionDef.byteOffset || 0;\n                const byteLength = extensionDef.byteLength || 0;\n                const count = extensionDef.count;\n                const stride = extensionDef.byteStride;\n                const result = new ArrayBuffer(count * stride);\n                const source = new Uint8Array(res[0], byteOffset, byteLength);\n                decoder.decodeGltfBuffer(new Uint8Array(result), count, stride, source, extensionDef.mode, extensionDef.filter);\n                return result;\n              });\n            } else {\n              return null;\n            }\n          }\n        }\n        const BINARY_EXTENSION_HEADER_MAGIC = \"glTF\";\n        const BINARY_EXTENSION_HEADER_LENGTH = 12;\n        const BINARY_EXTENSION_CHUNK_TYPES = {\n          JSON: 1313821514,\n          BIN: 5130562\n        };\n        class GLTFBinaryExtension {\n          constructor(data) {\n            this.name = EXTENSIONS.KHR_BINARY_GLTF;\n            this.content = null;\n            this.body = null;\n            const headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH);\n            this.header = {\n              magic: THREE.LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))),\n              version: headerView.getUint32(4, true),\n              length: headerView.getUint32(8, true)\n            };\n            if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) {\n              throw new Error(\"THREE.GLTFLoader: Unsupported glTF-Binary header.\");\n            } else if (this.header.version < 2) {\n              throw new Error(\"THREE.GLTFLoader: Legacy binary file detected.\");\n            }\n            const chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n            const chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH);\n            let chunkIndex = 0;\n            while (chunkIndex < chunkContentsLength) {\n              const chunkLength = chunkView.getUint32(chunkIndex, true);\n              chunkIndex += 4;\n              const chunkType = chunkView.getUint32(chunkIndex, true);\n              chunkIndex += 4;\n              if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) {\n                const contentArray = new Uint8Array(data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength);\n                this.content = THREE.LoaderUtils.decodeText(contentArray);\n              } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) {\n                const byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n                this.body = data.slice(byteOffset, byteOffset + chunkLength);\n              }\n              chunkIndex += chunkLength;\n            }\n            if (this.content === null) {\n              throw new Error(\"THREE.GLTFLoader: JSON content not found.\");\n            }\n          }\n        }\n        class GLTFDracoMeshCompressionExtension {\n          constructor(json, dracoLoader) {\n            if (!dracoLoader) {\n              throw new Error(\"THREE.GLTFLoader: No DRACOLoader instance provided.\");\n            }\n            this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n            this.json = json;\n            this.dracoLoader = dracoLoader;\n            this.dracoLoader.preload();\n          }\n          decodePrimitive(primitive, parser) {\n            const json = this.json;\n            const dracoLoader = this.dracoLoader;\n            const bufferViewIndex = primitive.extensions[this.name].bufferView;\n            const gltfAttributeMap = primitive.extensions[this.name].attributes;\n            const threeAttributeMap = {};\n            const attributeNormalizedMap = {};\n            const attributeTypeMap = {};\n            for (const attributeName in gltfAttributeMap) {\n              const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase();\n              threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName];\n            }\n            for (const attributeName in primitive.attributes) {\n              const threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase();\n              if (gltfAttributeMap[attributeName] !== void 0) {\n                const accessorDef = json.accessors[primitive.attributes[attributeName]];\n                const componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType];\n                attributeTypeMap[threeAttributeName] = componentType;\n                attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true;\n              }\n            }\n            return parser.getDependency(\"bufferView\", bufferViewIndex).then(function(bufferView) {\n              return new Promise(function(resolve) {\n                dracoLoader.decodeDracoFile(bufferView, function(geometry) {\n                  for (const attributeName in geometry.attributes) {\n                    const attribute = geometry.attributes[attributeName];\n                    const normalized = attributeNormalizedMap[attributeName];\n                    if (normalized !== void 0) attribute.normalized = normalized;\n                  }\n                  resolve(geometry);\n                }, threeAttributeMap, attributeTypeMap);\n              });\n            });\n          }\n        }\n        class GLTFTextureTransformExtension {\n          constructor() {\n            this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n          }\n          extendTexture(texture, transform) {\n            if (transform.texCoord !== void 0) {\n              console.warn('THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.');\n            }\n            if (transform.offset === void 0 && transform.rotation === void 0 && transform.scale === void 0) {\n              return texture;\n            }\n            texture = texture.clone();\n            if (transform.offset !== void 0) {\n              texture.offset.fromArray(transform.offset);\n            }\n            if (transform.rotation !== void 0) {\n              texture.rotation = transform.rotation;\n            }\n            if (transform.scale !== void 0) {\n              texture.repeat.fromArray(transform.scale);\n            }\n            texture.needsUpdate = true;\n            return texture;\n          }\n        }\n        class GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial {\n          constructor(params) {\n            super();\n            this.isGLTFSpecularGlossinessMaterial = true;\n            const specularMapParsFragmentChunk = [\"#ifdef USE_SPECULARMAP\", \"\tuniform sampler2D specularMap;\", \"#endif\"].join(\"\\n\");\n            const glossinessMapParsFragmentChunk = [\"#ifdef USE_GLOSSINESSMAP\", \"\tuniform sampler2D glossinessMap;\", \"#endif\"].join(\"\\n\");\n            const specularMapFragmentChunk = [\"vec3 specularFactor = specular;\", \"#ifdef USE_SPECULARMAP\", \"\tvec4 texelSpecular = texture2D( specularMap, vUv );\", \"\ttexelSpecular = sRGBToLinear( texelSpecular );\", \"\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture\", \"\tspecularFactor *= texelSpecular.rgb;\", \"#endif\"].join(\"\\n\");\n            const glossinessMapFragmentChunk = [\"float glossinessFactor = glossiness;\", \"#ifdef USE_GLOSSINESSMAP\", \"\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );\", \"\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture\", \"\tglossinessFactor *= texelGlossiness.a;\", \"#endif\"].join(\"\\n\");\n            const lightPhysicalFragmentChunk = [\"PhysicalMaterial material;\", \"material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );\", \"vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\", \"float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\", \"material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.\", \"material.roughness += geometryRoughness;\", \"material.roughness = min( material.roughness, 1.0 );\", \"material.specularColor = specularFactor;\"].join(\"\\n\");\n            const uniforms = {\n              specular: {\n                value: new THREE.Color().setHex(16777215)\n              },\n              glossiness: {\n                value: 1\n              },\n              specularMap: {\n                value: null\n              },\n              glossinessMap: {\n                value: null\n              }\n            };\n            this._extraUniforms = uniforms;\n            this.onBeforeCompile = function(shader) {\n              for (const uniformName in uniforms) {\n                shader.uniforms[uniformName] = uniforms[uniformName];\n              }\n              shader.fragmentShader = shader.fragmentShader.replace(\"uniform float roughness;\", \"uniform vec3 specular;\").replace(\"uniform float metalness;\", \"uniform float glossiness;\").replace(\"#include <roughnessmap_pars_fragment>\", specularMapParsFragmentChunk).replace(\"#include <metalnessmap_pars_fragment>\", glossinessMapParsFragmentChunk).replace(\"#include <roughnessmap_fragment>\", specularMapFragmentChunk).replace(\"#include <metalnessmap_fragment>\", glossinessMapFragmentChunk).replace(\"#include <lights_physical_fragment>\", lightPhysicalFragmentChunk);\n            };\n            Object.defineProperties(this, {\n              specular: {\n                get: function() {\n                  return uniforms.specular.value;\n                },\n                set: function(v) {\n                  uniforms.specular.value = v;\n                }\n              },\n              specularMap: {\n                get: function() {\n                  return uniforms.specularMap.value;\n                },\n                set: function(v) {\n                  uniforms.specularMap.value = v;\n                  if (v) {\n                    this.defines.USE_SPECULARMAP = \"\";\n                  } else {\n                    delete this.defines.USE_SPECULARMAP;\n                  }\n                }\n              },\n              glossiness: {\n                get: function() {\n                  return uniforms.glossiness.value;\n                },\n                set: function(v) {\n                  uniforms.glossiness.value = v;\n                }\n              },\n              glossinessMap: {\n                get: function() {\n                  return uniforms.glossinessMap.value;\n                },\n                set: function(v) {\n                  uniforms.glossinessMap.value = v;\n                  if (v) {\n                    this.defines.USE_GLOSSINESSMAP = \"\";\n                    this.defines.USE_UV = \"\";\n                  } else {\n                    delete this.defines.USE_GLOSSINESSMAP;\n                    delete this.defines.USE_UV;\n                  }\n                }\n              }\n            });\n            delete this.metalness;\n            delete this.roughness;\n            delete this.metalnessMap;\n            delete this.roughnessMap;\n            this.setValues(params);\n          }\n          copy(source) {\n            super.copy(source);\n            this.specularMap = source.specularMap;\n            this.specular.copy(source.specular);\n            this.glossinessMap = source.glossinessMap;\n            this.glossiness = source.glossiness;\n            delete this.metalness;\n            delete this.roughness;\n            delete this.metalnessMap;\n            delete this.roughnessMap;\n            return this;\n          }\n        }\n        class GLTFMaterialsPbrSpecularGlossinessExtension {\n          constructor() {\n            this.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n            this.specularGlossinessParams = [\"color\", \"map\", \"lightMap\", \"lightMapIntensity\", \"aoMap\", \"aoMapIntensity\", \"emissive\", \"emissiveIntensity\", \"emissiveMap\", \"bumpMap\", \"bumpScale\", \"normalMap\", \"normalMapType\", \"displacementMap\", \"displacementScale\", \"displacementBias\", \"specularMap\", \"specular\", \"glossinessMap\", \"glossiness\", \"alphaMap\", \"envMap\", \"envMapIntensity\", \"refractionRatio\"];\n          }\n          getMaterialType() {\n            return GLTFMeshStandardSGMaterial;\n          }\n          extendParams(materialParams, materialDef, parser) {\n            const pbrSpecularGlossiness = materialDef.extensions[this.name];\n            materialParams.color = new THREE.Color(1, 1, 1);\n            materialParams.opacity = 1;\n            const pending = [];\n            if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) {\n              const array = pbrSpecularGlossiness.diffuseFactor;\n              materialParams.color.fromArray(array);\n              materialParams.opacity = array[3];\n            }\n            if (pbrSpecularGlossiness.diffuseTexture !== void 0) {\n              pending.push(parser.assignTexture(materialParams, \"map\", pbrSpecularGlossiness.diffuseTexture));\n            }\n            materialParams.emissive = new THREE.Color(0, 0, 0);\n            materialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== void 0 ? pbrSpecularGlossiness.glossinessFactor : 1;\n            materialParams.specular = new THREE.Color(1, 1, 1);\n            if (Array.isArray(pbrSpecularGlossiness.specularFactor)) {\n              materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor);\n            }\n            if (pbrSpecularGlossiness.specularGlossinessTexture !== void 0) {\n              const specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n              pending.push(parser.assignTexture(materialParams, \"glossinessMap\", specGlossMapDef));\n              pending.push(parser.assignTexture(materialParams, \"specularMap\", specGlossMapDef));\n            }\n            return Promise.all(pending);\n          }\n          createMaterial(materialParams) {\n            const material = new GLTFMeshStandardSGMaterial(materialParams);\n            material.fog = true;\n            material.color = materialParams.color;\n            material.map = materialParams.map === void 0 ? null : materialParams.map;\n            material.lightMap = null;\n            material.lightMapIntensity = 1;\n            material.aoMap = materialParams.aoMap === void 0 ? null : materialParams.aoMap;\n            material.aoMapIntensity = 1;\n            material.emissive = materialParams.emissive;\n            material.emissiveIntensity = 1;\n            material.emissiveMap = materialParams.emissiveMap === void 0 ? null : materialParams.emissiveMap;\n            material.bumpMap = materialParams.bumpMap === void 0 ? null : materialParams.bumpMap;\n            material.bumpScale = 1;\n            material.normalMap = materialParams.normalMap === void 0 ? null : materialParams.normalMap;\n            material.normalMapType = THREE.TangentSpaceNormalMap;\n            if (materialParams.normalScale) material.normalScale = materialParams.normalScale;\n            material.displacementMap = null;\n            material.displacementScale = 1;\n            material.displacementBias = 0;\n            material.specularMap = materialParams.specularMap === void 0 ? null : materialParams.specularMap;\n            material.specular = materialParams.specular;\n            material.glossinessMap = materialParams.glossinessMap === void 0 ? null : materialParams.glossinessMap;\n            material.glossiness = materialParams.glossiness;\n            material.alphaMap = null;\n            material.envMap = materialParams.envMap === void 0 ? null : materialParams.envMap;\n            material.envMapIntensity = 1;\n            material.refractionRatio = 0.98;\n            return material;\n          }\n        }\n        class GLTFMeshQuantizationExtension {\n          constructor() {\n            this.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n          }\n        }\n        class GLTFCubicSplineInterpolant extends THREE.Interpolant {\n          constructor(parameterPositions, sampleValues, sampleSize, resultBuffer) {\n            super(parameterPositions, sampleValues, sampleSize, resultBuffer);\n          }\n          copySampleValue_(index) {\n            const result = this.resultBuffer, values = this.sampleValues, valueSize = this.valueSize, offset = index * valueSize * 3 + valueSize;\n            for (let i = 0; i !== valueSize; i++) {\n              result[i] = values[offset + i];\n            }\n            return result;\n          }\n        }\n        GLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n        GLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n        GLTFCubicSplineInterpolant.prototype.interpolate_ = function(i1, t0, t, t1) {\n          const result = this.resultBuffer;\n          const values = this.sampleValues;\n          const stride = this.valueSize;\n          const stride2 = stride * 2;\n          const stride3 = stride * 3;\n          const td = t1 - t0;\n          const p = (t - t0) / td;\n          const pp = p * p;\n          const ppp = pp * p;\n          const offset1 = i1 * stride3;\n          const offset0 = offset1 - stride3;\n          const s2 = -2 * ppp + 3 * pp;\n          const s3 = ppp - pp;\n          const s0 = 1 - s2;\n          const s1 = s3 - pp + p;\n          for (let i = 0; i !== stride; i++) {\n            const p0 = values[offset0 + i + stride];\n            const m0 = values[offset0 + i + stride2] * td;\n            const p1 = values[offset1 + i + stride];\n            const m1 = values[offset1 + i] * td;\n            result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n          }\n          return result;\n        };\n        const _q = new THREE.Quaternion();\n        class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n          interpolate_(i1, t0, t, t1) {\n            const result = super.interpolate_(i1, t0, t, t1);\n            _q.fromArray(result).normalize().toArray(result);\n            return result;\n          }\n        }\n        const WEBGL_CONSTANTS = {\n          FLOAT: 5126,\n          //FLOAT_MAT2: 35674,\n          FLOAT_MAT3: 35675,\n          FLOAT_MAT4: 35676,\n          FLOAT_VEC2: 35664,\n          FLOAT_VEC3: 35665,\n          FLOAT_VEC4: 35666,\n          LINEAR: 9729,\n          REPEAT: 10497,\n          SAMPLER_2D: 35678,\n          POINTS: 0,\n          LINES: 1,\n          LINE_LOOP: 2,\n          LINE_STRIP: 3,\n          TRIANGLES: 4,\n          TRIANGLE_STRIP: 5,\n          TRIANGLE_FAN: 6,\n          UNSIGNED_BYTE: 5121,\n          UNSIGNED_SHORT: 5123\n        };\n        const WEBGL_COMPONENT_TYPES = {\n          5120: Int8Array,\n          5121: Uint8Array,\n          5122: Int16Array,\n          5123: Uint16Array,\n          5125: Uint32Array,\n          5126: Float32Array\n        };\n        const WEBGL_FILTERS = {\n          9728: THREE.NearestFilter,\n          9729: THREE.LinearFilter,\n          9984: THREE.NearestMipmapNearestFilter,\n          9985: THREE.LinearMipmapNearestFilter,\n          9986: THREE.NearestMipmapLinearFilter,\n          9987: THREE.LinearMipmapLinearFilter\n        };\n        const WEBGL_WRAPPINGS = {\n          33071: THREE.ClampToEdgeWrapping,\n          33648: THREE.MirroredRepeatWrapping,\n          10497: THREE.RepeatWrapping\n        };\n        const WEBGL_TYPE_SIZES = {\n          \"SCALAR\": 1,\n          \"VEC2\": 2,\n          \"VEC3\": 3,\n          \"VEC4\": 4,\n          \"MAT2\": 4,\n          \"MAT3\": 9,\n          \"MAT4\": 16\n        };\n        const ATTRIBUTES = {\n          POSITION: \"position\",\n          NORMAL: \"normal\",\n          TANGENT: \"tangent\",\n          TEXCOORD_0: \"uv\",\n          TEXCOORD_1: \"uv2\",\n          COLOR_0: \"color\",\n          WEIGHTS_0: \"skinWeight\",\n          JOINTS_0: \"skinIndex\"\n        };\n        const PATH_PROPERTIES = {\n          scale: \"scale\",\n          translation: \"position\",\n          rotation: \"quaternion\",\n          weights: \"morphTargetInfluences\"\n        };\n        const INTERPOLATION = {\n          CUBICSPLINE: void 0,\n          // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n          // keyframe track will be initialized with a default interpolation type, then modified.\n          LINEAR: THREE.InterpolateLinear,\n          STEP: THREE.InterpolateDiscrete\n        };\n        const ALPHA_MODES = {\n          OPAQUE: \"OPAQUE\",\n          MASK: \"MASK\",\n          BLEND: \"BLEND\"\n        };\n        function resolveURL(url, path) {\n          if (typeof url !== \"string\" || url === \"\") return \"\";\n          if (/^https?:\\/\\//i.test(path) && /^\\//.test(url)) {\n            path = path.replace(/(^https?:\\/\\/[^\\/]+).*/i, \"$1\");\n          }\n          if (/^(https?:)?\\/\\//i.test(url)) return url;\n          if (/^data:.*,.*$/i.test(url)) return url;\n          if (/^blob:.*$/i.test(url)) return url;\n          return path + url;\n        }\n        function createDefaultMaterial(cache) {\n          if (cache[\"DefaultMaterial\"] === void 0) {\n            cache[\"DefaultMaterial\"] = new THREE.MeshStandardMaterial({\n              color: 16777215,\n              emissive: 0,\n              metalness: 1,\n              roughness: 1,\n              transparent: false,\n              depthTest: true,\n              side: THREE.FrontSide\n            });\n          }\n          return cache[\"DefaultMaterial\"];\n        }\n        function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) {\n          for (const name in objectDef.extensions) {\n            if (knownExtensions[name] === void 0) {\n              object.userData.gltfExtensions = object.userData.gltfExtensions || {};\n              object.userData.gltfExtensions[name] = objectDef.extensions[name];\n            }\n          }\n        }\n        function assignExtrasToUserData(object, gltfDef) {\n          if (gltfDef.extras !== void 0) {\n            if (typeof gltfDef.extras === \"object\") {\n              Object.assign(object.userData, gltfDef.extras);\n            } else {\n              console.warn(\"THREE.GLTFLoader: Ignoring primitive type .extras, \" + gltfDef.extras);\n            }\n          }\n        }\n        function addMorphTargets(geometry, targets, parser) {\n          let hasMorphPosition = false;\n          let hasMorphNormal = false;\n          for (let i = 0, il = targets.length; i < il; i++) {\n            const target = targets[i];\n            if (target.POSITION !== void 0) hasMorphPosition = true;\n            if (target.NORMAL !== void 0) hasMorphNormal = true;\n            if (hasMorphPosition && hasMorphNormal) break;\n          }\n          if (!hasMorphPosition && !hasMorphNormal) return Promise.resolve(geometry);\n          const pendingPositionAccessors = [];\n          const pendingNormalAccessors = [];\n          for (let i = 0, il = targets.length; i < il; i++) {\n            const target = targets[i];\n            if (hasMorphPosition) {\n              const pendingAccessor = target.POSITION !== void 0 ? parser.getDependency(\"accessor\", target.POSITION) : geometry.attributes.position;\n              pendingPositionAccessors.push(pendingAccessor);\n            }\n            if (hasMorphNormal) {\n              const pendingAccessor = target.NORMAL !== void 0 ? parser.getDependency(\"accessor\", target.NORMAL) : geometry.attributes.normal;\n              pendingNormalAccessors.push(pendingAccessor);\n            }\n          }\n          return Promise.all([Promise.all(pendingPositionAccessors), Promise.all(pendingNormalAccessors)]).then(function(accessors) {\n            const morphPositions = accessors[0];\n            const morphNormals = accessors[1];\n            if (hasMorphPosition) geometry.morphAttributes.position = morphPositions;\n            if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals;\n            geometry.morphTargetsRelative = true;\n            return geometry;\n          });\n        }\n        function updateMorphTargets(mesh, meshDef) {\n          mesh.updateMorphTargets();\n          if (meshDef.weights !== void 0) {\n            for (let i = 0, il = meshDef.weights.length; i < il; i++) {\n              mesh.morphTargetInfluences[i] = meshDef.weights[i];\n            }\n          }\n          if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) {\n            const targetNames = meshDef.extras.targetNames;\n            if (mesh.morphTargetInfluences.length === targetNames.length) {\n              mesh.morphTargetDictionary = {};\n              for (let i = 0, il = targetNames.length; i < il; i++) {\n                mesh.morphTargetDictionary[targetNames[i]] = i;\n              }\n            } else {\n              console.warn(\"THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.\");\n            }\n          }\n        }\n        function createPrimitiveKey(primitiveDef) {\n          const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];\n          let geometryKey;\n          if (dracoExtension) {\n            geometryKey = \"draco:\" + dracoExtension.bufferView + \":\" + dracoExtension.indices + \":\" + createAttributesKey(dracoExtension.attributes);\n          } else {\n            geometryKey = primitiveDef.indices + \":\" + createAttributesKey(primitiveDef.attributes) + \":\" + primitiveDef.mode;\n          }\n          return geometryKey;\n        }\n        function createAttributesKey(attributes) {\n          let attributesKey = \"\";\n          const keys = Object.keys(attributes).sort();\n          for (let i = 0, il = keys.length; i < il; i++) {\n            attributesKey += keys[i] + \":\" + attributes[keys[i]] + \";\";\n          }\n          return attributesKey;\n        }\n        function getNormalizedComponentScale(constructor) {\n          switch (constructor) {\n            case Int8Array:\n              return 1 / 127;\n            case Uint8Array:\n              return 1 / 255;\n            case Int16Array:\n              return 1 / 32767;\n            case Uint16Array:\n              return 1 / 65535;\n            default:\n              throw new Error(\"THREE.GLTFLoader: Unsupported normalized accessor component type.\");\n          }\n        }\n        class GLTFParser {\n          constructor(json = {}, options = {}) {\n            this.json = json;\n            this.extensions = {};\n            this.plugins = {};\n            this.options = options;\n            this.cache = new GLTFRegistry();\n            this.associations = /* @__PURE__ */ new Map();\n            this.primitiveCache = {};\n            this.meshCache = {\n              refs: {},\n              uses: {}\n            };\n            this.cameraCache = {\n              refs: {},\n              uses: {}\n            };\n            this.lightCache = {\n              refs: {},\n              uses: {}\n            };\n            this.textureCache = {};\n            this.nodeNamesUsed = {};\n            if (typeof createImageBitmap !== \"undefined\" && /Firefox/.test(navigator.userAgent) === false) {\n              this.textureLoader = new THREE.ImageBitmapLoader(this.options.manager);\n            } else {\n              this.textureLoader = new THREE.TextureLoader(this.options.manager);\n            }\n            this.textureLoader.setCrossOrigin(this.options.crossOrigin);\n            this.textureLoader.setRequestHeader(this.options.requestHeader);\n            this.fileLoader = new THREE.FileLoader(this.options.manager);\n            this.fileLoader.setResponseType(\"arraybuffer\");\n            if (this.options.crossOrigin === \"use-credentials\") {\n              this.fileLoader.setWithCredentials(true);\n            }\n          }\n          setExtensions(extensions) {\n            this.extensions = extensions;\n          }\n          setPlugins(plugins) {\n            this.plugins = plugins;\n          }\n          parse(onLoad, onError) {\n            const parser = this;\n            const json = this.json;\n            const extensions = this.extensions;\n            this.cache.removeAll();\n            this._invokeAll(function(ext) {\n              return ext._markDefs && ext._markDefs();\n            });\n            Promise.all(this._invokeAll(function(ext) {\n              return ext.beforeRoot && ext.beforeRoot();\n            })).then(function() {\n              return Promise.all([parser.getDependencies(\"scene\"), parser.getDependencies(\"animation\"), parser.getDependencies(\"camera\")]);\n            }).then(function(dependencies) {\n              const result = {\n                scene: dependencies[0][json.scene || 0],\n                scenes: dependencies[0],\n                animations: dependencies[1],\n                cameras: dependencies[2],\n                asset: json.asset,\n                parser,\n                userData: {}\n              };\n              addUnknownExtensionsToUserData(extensions, result, json);\n              assignExtrasToUserData(result, json);\n              Promise.all(parser._invokeAll(function(ext) {\n                return ext.afterRoot && ext.afterRoot(result);\n              })).then(function() {\n                onLoad(result);\n              });\n            }).catch(onError);\n          }\n          /**\n           * Marks the special nodes/meshes in json for efficient parse.\n           */\n          _markDefs() {\n            const nodeDefs = this.json.nodes || [];\n            const skinDefs = this.json.skins || [];\n            const meshDefs = this.json.meshes || [];\n            for (let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) {\n              const joints = skinDefs[skinIndex].joints;\n              for (let i = 0, il = joints.length; i < il; i++) {\n                nodeDefs[joints[i]].isBone = true;\n              }\n            }\n            for (let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) {\n              const nodeDef = nodeDefs[nodeIndex];\n              if (nodeDef.mesh !== void 0) {\n                this._addNodeRef(this.meshCache, nodeDef.mesh);\n                if (nodeDef.skin !== void 0) {\n                  meshDefs[nodeDef.mesh].isSkinnedMesh = true;\n                }\n              }\n              if (nodeDef.camera !== void 0) {\n                this._addNodeRef(this.cameraCache, nodeDef.camera);\n              }\n            }\n          }\n          /**\n           * Counts references to shared node / THREE.Object3D resources. These resources\n           * can be reused, or \"instantiated\", at multiple nodes in the scene\n           * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must\n           * be marked. Non-scenegraph resources (like Materials, Geometries, and\n           * Textures) can be reused directly and are not marked here.\n           *\n           * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n           */\n          _addNodeRef(cache, index) {\n            if (index === void 0) return;\n            if (cache.refs[index] === void 0) {\n              cache.refs[index] = cache.uses[index] = 0;\n            }\n            cache.refs[index]++;\n          }\n          /** Returns a reference to a shared resource, cloning it if necessary. */\n          _getNodeRef(cache, index, object) {\n            if (cache.refs[index] <= 1) return object;\n            const ref = object.clone();\n            ref.name += \"_instance_\" + cache.uses[index]++;\n            return ref;\n          }\n          _invokeOne(func) {\n            const extensions = Object.values(this.plugins);\n            extensions.push(this);\n            for (let i = 0; i < extensions.length; i++) {\n              const result = func(extensions[i]);\n              if (result) return result;\n            }\n            return null;\n          }\n          _invokeAll(func) {\n            const extensions = Object.values(this.plugins);\n            extensions.unshift(this);\n            const pending = [];\n            for (let i = 0; i < extensions.length; i++) {\n              const result = func(extensions[i]);\n              if (result) pending.push(result);\n            }\n            return pending;\n          }\n          /**\n           * Requests the specified dependency asynchronously, with caching.\n           * @param {string} type\n           * @param {number} index\n           * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n           */\n          getDependency(type, index) {\n            const cacheKey = type + \":\" + index;\n            let dependency = this.cache.get(cacheKey);\n            if (!dependency) {\n              switch (type) {\n                case \"scene\":\n                  dependency = this.loadScene(index);\n                  break;\n                case \"node\":\n                  dependency = this.loadNode(index);\n                  break;\n                case \"mesh\":\n                  dependency = this._invokeOne(function(ext) {\n                    return ext.loadMesh && ext.loadMesh(index);\n                  });\n                  break;\n                case \"accessor\":\n                  dependency = this.loadAccessor(index);\n                  break;\n                case \"bufferView\":\n                  dependency = this._invokeOne(function(ext) {\n                    return ext.loadBufferView && ext.loadBufferView(index);\n                  });\n                  break;\n                case \"buffer\":\n                  dependency = this.loadBuffer(index);\n                  break;\n                case \"material\":\n                  dependency = this._invokeOne(function(ext) {\n                    return ext.loadMaterial && ext.loadMaterial(index);\n                  });\n                  break;\n                case \"texture\":\n                  dependency = this._invokeOne(function(ext) {\n                    return ext.loadTexture && ext.loadTexture(index);\n                  });\n                  break;\n                case \"skin\":\n                  dependency = this.loadSkin(index);\n                  break;\n                case \"animation\":\n                  dependency = this.loadAnimation(index);\n                  break;\n                case \"camera\":\n                  dependency = this.loadCamera(index);\n                  break;\n                default:\n                  throw new Error(\"Unknown type: \" + type);\n              }\n              this.cache.add(cacheKey, dependency);\n            }\n            return dependency;\n          }\n          /**\n           * Requests all dependencies of the specified type asynchronously, with caching.\n           * @param {string} type\n           * @return {Promise<Array<Object>>}\n           */\n          getDependencies(type) {\n            let dependencies = this.cache.get(type);\n            if (!dependencies) {\n              const parser = this;\n              const defs = this.json[type + (type === \"mesh\" ? \"es\" : \"s\")] || [];\n              dependencies = Promise.all(defs.map(function(def, index) {\n                return parser.getDependency(type, index);\n              }));\n              this.cache.add(type, dependencies);\n            }\n            return dependencies;\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n           * @param {number} bufferIndex\n           * @return {Promise<ArrayBuffer>}\n           */\n          loadBuffer(bufferIndex) {\n            const bufferDef = this.json.buffers[bufferIndex];\n            const loader = this.fileLoader;\n            if (bufferDef.type && bufferDef.type !== \"arraybuffer\") {\n              throw new Error(\"THREE.GLTFLoader: \" + bufferDef.type + \" buffer type is not supported.\");\n            }\n            if (bufferDef.uri === void 0 && bufferIndex === 0) {\n              return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body);\n            }\n            const options = this.options;\n            return new Promise(function(resolve, reject) {\n              loader.load(resolveURL(bufferDef.uri, options.path), resolve, void 0, function() {\n                reject(new Error('THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".'));\n              });\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n           * @param {number} bufferViewIndex\n           * @return {Promise<ArrayBuffer>}\n           */\n          loadBufferView(bufferViewIndex) {\n            const bufferViewDef = this.json.bufferViews[bufferViewIndex];\n            return this.getDependency(\"buffer\", bufferViewDef.buffer).then(function(buffer) {\n              const byteLength = bufferViewDef.byteLength || 0;\n              const byteOffset = bufferViewDef.byteOffset || 0;\n              return buffer.slice(byteOffset, byteOffset + byteLength);\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n           * @param {number} accessorIndex\n           * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n           */\n          loadAccessor(accessorIndex) {\n            const parser = this;\n            const json = this.json;\n            const accessorDef = this.json.accessors[accessorIndex];\n            if (accessorDef.bufferView === void 0 && accessorDef.sparse === void 0) {\n              return Promise.resolve(null);\n            }\n            const pendingBufferViews = [];\n            if (accessorDef.bufferView !== void 0) {\n              pendingBufferViews.push(this.getDependency(\"bufferView\", accessorDef.bufferView));\n            } else {\n              pendingBufferViews.push(null);\n            }\n            if (accessorDef.sparse !== void 0) {\n              pendingBufferViews.push(this.getDependency(\"bufferView\", accessorDef.sparse.indices.bufferView));\n              pendingBufferViews.push(this.getDependency(\"bufferView\", accessorDef.sparse.values.bufferView));\n            }\n            return Promise.all(pendingBufferViews).then(function(bufferViews) {\n              const bufferView = bufferViews[0];\n              const itemSize = WEBGL_TYPE_SIZES[accessorDef.type];\n              const TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType];\n              const elementBytes = TypedArray.BYTES_PER_ELEMENT;\n              const itemBytes = elementBytes * itemSize;\n              const byteOffset = accessorDef.byteOffset || 0;\n              const byteStride = accessorDef.bufferView !== void 0 ? json.bufferViews[accessorDef.bufferView].byteStride : void 0;\n              const normalized = accessorDef.normalized === true;\n              let array, bufferAttribute;\n              if (byteStride && byteStride !== itemBytes) {\n                const ibSlice = Math.floor(byteOffset / byteStride);\n                const ibCacheKey = \"InterleavedBuffer:\" + accessorDef.bufferView + \":\" + accessorDef.componentType + \":\" + ibSlice + \":\" + accessorDef.count;\n                let ib = parser.cache.get(ibCacheKey);\n                if (!ib) {\n                  array = new TypedArray(bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes);\n                  ib = new THREE.InterleavedBuffer(array, byteStride / elementBytes);\n                  parser.cache.add(ibCacheKey, ib);\n                }\n                bufferAttribute = new THREE.InterleavedBufferAttribute(ib, itemSize, byteOffset % byteStride / elementBytes, normalized);\n              } else {\n                if (bufferView === null) {\n                  array = new TypedArray(accessorDef.count * itemSize);\n                } else {\n                  array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize);\n                }\n                bufferAttribute = new THREE.BufferAttribute(array, itemSize, normalized);\n              }\n              if (accessorDef.sparse !== void 0) {\n                const itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n                const TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType];\n                const byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n                const byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n                const sparseIndices = new TypedArrayIndices(bufferViews[1], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices);\n                const sparseValues = new TypedArray(bufferViews[2], byteOffsetValues, accessorDef.sparse.count * itemSize);\n                if (bufferView !== null) {\n                  bufferAttribute = new THREE.BufferAttribute(bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized);\n                }\n                for (let i = 0, il = sparseIndices.length; i < il; i++) {\n                  const index = sparseIndices[i];\n                  bufferAttribute.setX(index, sparseValues[i * itemSize]);\n                  if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]);\n                  if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]);\n                  if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]);\n                  if (itemSize >= 5) throw new Error(\"THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.\");\n                }\n              }\n              return bufferAttribute;\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n           * @param {number} textureIndex\n           * @return {Promise<THREE.Texture>}\n           */\n          loadTexture(textureIndex) {\n            const json = this.json;\n            const options = this.options;\n            const textureDef = json.textures[textureIndex];\n            const source = json.images[textureDef.source];\n            let loader = this.textureLoader;\n            if (source.uri) {\n              const handler = options.manager.getHandler(source.uri);\n              if (handler !== null) loader = handler;\n            }\n            return this.loadTextureImage(textureIndex, source, loader);\n          }\n          loadTextureImage(textureIndex, source, loader) {\n            const parser = this;\n            const json = this.json;\n            const options = this.options;\n            const textureDef = json.textures[textureIndex];\n            const cacheKey = (source.uri || source.bufferView) + \":\" + textureDef.sampler;\n            if (this.textureCache[cacheKey]) {\n              return this.textureCache[cacheKey];\n            }\n            const URL = self.URL || self.webkitURL;\n            let sourceURI = source.uri || \"\";\n            let isObjectURL = false;\n            let hasAlpha = true;\n            const isJPEG = sourceURI.search(/\\.jpe?g($|\\?)/i) > 0 || sourceURI.search(/^data\\:image\\/jpeg/) === 0;\n            if (source.mimeType === \"image/jpeg\" || isJPEG) hasAlpha = false;\n            if (source.bufferView !== void 0) {\n              sourceURI = parser.getDependency(\"bufferView\", source.bufferView).then(function(bufferView) {\n                if (source.mimeType === \"image/png\") {\n                  const colorType = new DataView(bufferView, 25, 1).getUint8(0, false);\n                  hasAlpha = colorType === 6 || colorType === 4 || colorType === 3;\n                }\n                isObjectURL = true;\n                const blob = new Blob([bufferView], {\n                  type: source.mimeType\n                });\n                sourceURI = URL.createObjectURL(blob);\n                return sourceURI;\n              });\n            } else if (source.uri === void 0) {\n              throw new Error(\"THREE.GLTFLoader: Image \" + textureIndex + \" is missing URI and bufferView\");\n            }\n            const promise = Promise.resolve(sourceURI).then(function(sourceURI2) {\n              return new Promise(function(resolve, reject) {\n                let onLoad = resolve;\n                if (loader.isImageBitmapLoader === true) {\n                  onLoad = function(imageBitmap) {\n                    const texture = new THREE.Texture(imageBitmap);\n                    texture.needsUpdate = true;\n                    resolve(texture);\n                  };\n                }\n                loader.load(resolveURL(sourceURI2, options.path), onLoad, void 0, reject);\n              });\n            }).then(function(texture) {\n              if (isObjectURL === true) {\n                URL.revokeObjectURL(sourceURI);\n              }\n              texture.flipY = false;\n              if (textureDef.name) texture.name = textureDef.name;\n              if (!hasAlpha) texture.format = THREE.RGBFormat;\n              const samplers = json.samplers || {};\n              const sampler = samplers[textureDef.sampler] || {};\n              texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || THREE.LinearFilter;\n              texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || THREE.LinearMipmapLinearFilter;\n              texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || THREE.RepeatWrapping;\n              texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || THREE.RepeatWrapping;\n              parser.associations.set(texture, {\n                type: \"textures\",\n                index: textureIndex\n              });\n              return texture;\n            }).catch(function() {\n              console.error(\"THREE.GLTFLoader: Couldn't load texture\", sourceURI);\n              return null;\n            });\n            this.textureCache[cacheKey] = promise;\n            return promise;\n          }\n          /**\n           * Asynchronously assigns a texture to the given material parameters.\n           * @param {Object} materialParams\n           * @param {string} mapName\n           * @param {Object} mapDef\n           * @return {Promise<Texture>}\n           */\n          assignTexture(materialParams, mapName, mapDef) {\n            const parser = this;\n            return this.getDependency(\"texture\", mapDef.index).then(function(texture) {\n              if (mapDef.texCoord !== void 0 && mapDef.texCoord != 0 && !(mapName === \"aoMap\" && mapDef.texCoord == 1)) {\n                console.warn(\"THREE.GLTFLoader: Custom UV set \" + mapDef.texCoord + \" for texture \" + mapName + \" not yet supported.\");\n              }\n              if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) {\n                const transform = mapDef.extensions !== void 0 ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM] : void 0;\n                if (transform) {\n                  const gltfReference = parser.associations.get(texture);\n                  texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(texture, transform);\n                  parser.associations.set(texture, gltfReference);\n                }\n              }\n              materialParams[mapName] = texture;\n              return texture;\n            });\n          }\n          /**\n           * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance\n           * already has a material (generated from the glTF material options alone)\n           * but reuse of the same glTF material may require multiple threejs materials\n           * to accommodate different primitive types, defines, etc. New materials will\n           * be created if necessary, and reused from a cache.\n           * @param  {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance.\n           */\n          assignFinalMaterial(mesh) {\n            const geometry = mesh.geometry;\n            let material = mesh.material;\n            const useVertexTangents = geometry.attributes.tangent !== void 0;\n            const useVertexColors = geometry.attributes.color !== void 0;\n            const useFlatShading = geometry.attributes.normal === void 0;\n            if (mesh.isPoints) {\n              const cacheKey = \"PointsMaterial:\" + material.uuid;\n              let pointsMaterial = this.cache.get(cacheKey);\n              if (!pointsMaterial) {\n                pointsMaterial = new THREE.PointsMaterial();\n                THREE.Material.prototype.copy.call(pointsMaterial, material);\n                pointsMaterial.color.copy(material.color);\n                pointsMaterial.map = material.map;\n                pointsMaterial.sizeAttenuation = false;\n                this.cache.add(cacheKey, pointsMaterial);\n              }\n              material = pointsMaterial;\n            } else if (mesh.isLine) {\n              const cacheKey = \"LineBasicMaterial:\" + material.uuid;\n              let lineMaterial = this.cache.get(cacheKey);\n              if (!lineMaterial) {\n                lineMaterial = new THREE.LineBasicMaterial();\n                THREE.Material.prototype.copy.call(lineMaterial, material);\n                lineMaterial.color.copy(material.color);\n                this.cache.add(cacheKey, lineMaterial);\n              }\n              material = lineMaterial;\n            }\n            if (useVertexTangents || useVertexColors || useFlatShading) {\n              let cacheKey = \"ClonedMaterial:\" + material.uuid + \":\";\n              if (material.isGLTFSpecularGlossinessMaterial) cacheKey += \"specular-glossiness:\";\n              if (useVertexTangents) cacheKey += \"vertex-tangents:\";\n              if (useVertexColors) cacheKey += \"vertex-colors:\";\n              if (useFlatShading) cacheKey += \"flat-shading:\";\n              let cachedMaterial = this.cache.get(cacheKey);\n              if (!cachedMaterial) {\n                cachedMaterial = material.clone();\n                if (useVertexColors) cachedMaterial.vertexColors = true;\n                if (useFlatShading) cachedMaterial.flatShading = true;\n                if (useVertexTangents) {\n                  if (cachedMaterial.normalScale) cachedMaterial.normalScale.y *= -1;\n                  if (cachedMaterial.clearcoatNormalScale) cachedMaterial.clearcoatNormalScale.y *= -1;\n                }\n                this.cache.add(cacheKey, cachedMaterial);\n                this.associations.set(cachedMaterial, this.associations.get(material));\n              }\n              material = cachedMaterial;\n            }\n            if (material.aoMap && geometry.attributes.uv2 === void 0 && geometry.attributes.uv !== void 0) {\n              geometry.setAttribute(\"uv2\", geometry.attributes.uv);\n            }\n            mesh.material = material;\n          }\n          getMaterialType() {\n            return THREE.MeshStandardMaterial;\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n           * @param {number} materialIndex\n           * @return {Promise<Material>}\n           */\n          loadMaterial(materialIndex) {\n            const parser = this;\n            const json = this.json;\n            const extensions = this.extensions;\n            const materialDef = json.materials[materialIndex];\n            let materialType;\n            const materialParams = {};\n            const materialExtensions = materialDef.extensions || {};\n            const pending = [];\n            if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) {\n              const sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];\n              materialType = sgExtension.getMaterialType();\n              pending.push(sgExtension.extendParams(materialParams, materialDef, parser));\n            } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) {\n              const kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT];\n              materialType = kmuExtension.getMaterialType();\n              pending.push(kmuExtension.extendParams(materialParams, materialDef, parser));\n            } else {\n              const metallicRoughness = materialDef.pbrMetallicRoughness || {};\n              materialParams.color = new THREE.Color(1, 1, 1);\n              materialParams.opacity = 1;\n              if (Array.isArray(metallicRoughness.baseColorFactor)) {\n                const array = metallicRoughness.baseColorFactor;\n                materialParams.color.fromArray(array);\n                materialParams.opacity = array[3];\n              }\n              if (metallicRoughness.baseColorTexture !== void 0) {\n                pending.push(parser.assignTexture(materialParams, \"map\", metallicRoughness.baseColorTexture));\n              }\n              materialParams.metalness = metallicRoughness.metallicFactor !== void 0 ? metallicRoughness.metallicFactor : 1;\n              materialParams.roughness = metallicRoughness.roughnessFactor !== void 0 ? metallicRoughness.roughnessFactor : 1;\n              if (metallicRoughness.metallicRoughnessTexture !== void 0) {\n                pending.push(parser.assignTexture(materialParams, \"metalnessMap\", metallicRoughness.metallicRoughnessTexture));\n                pending.push(parser.assignTexture(materialParams, \"roughnessMap\", metallicRoughness.metallicRoughnessTexture));\n              }\n              materialType = this._invokeOne(function(ext) {\n                return ext.getMaterialType && ext.getMaterialType(materialIndex);\n              });\n              pending.push(Promise.all(this._invokeAll(function(ext) {\n                return ext.extendMaterialParams && ext.extendMaterialParams(materialIndex, materialParams);\n              })));\n            }\n            if (materialDef.doubleSided === true) {\n              materialParams.side = THREE.DoubleSide;\n            }\n            const alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n            if (alphaMode === ALPHA_MODES.BLEND) {\n              materialParams.transparent = true;\n              materialParams.depthWrite = false;\n            } else {\n              materialParams.format = THREE.RGBFormat;\n              materialParams.transparent = false;\n              if (alphaMode === ALPHA_MODES.MASK) {\n                materialParams.alphaTest = materialDef.alphaCutoff !== void 0 ? materialDef.alphaCutoff : 0.5;\n              }\n            }\n            if (materialDef.normalTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) {\n              pending.push(parser.assignTexture(materialParams, \"normalMap\", materialDef.normalTexture));\n              materialParams.normalScale = new THREE.Vector2(1, -1);\n              if (materialDef.normalTexture.scale !== void 0) {\n                materialParams.normalScale.set(materialDef.normalTexture.scale, -materialDef.normalTexture.scale);\n              }\n            }\n            if (materialDef.occlusionTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) {\n              pending.push(parser.assignTexture(materialParams, \"aoMap\", materialDef.occlusionTexture));\n              if (materialDef.occlusionTexture.strength !== void 0) {\n                materialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n              }\n            }\n            if (materialDef.emissiveFactor !== void 0 && materialType !== THREE.MeshBasicMaterial) {\n              materialParams.emissive = new THREE.Color().fromArray(materialDef.emissiveFactor);\n            }\n            if (materialDef.emissiveTexture !== void 0 && materialType !== THREE.MeshBasicMaterial) {\n              pending.push(parser.assignTexture(materialParams, \"emissiveMap\", materialDef.emissiveTexture));\n            }\n            return Promise.all(pending).then(function() {\n              let material;\n              if (materialType === GLTFMeshStandardSGMaterial) {\n                material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(materialParams);\n              } else {\n                material = new materialType(materialParams);\n              }\n              if (materialDef.name) material.name = materialDef.name;\n              if (material.map) material.map.encoding = THREE.sRGBEncoding;\n              if (material.emissiveMap) material.emissiveMap.encoding = THREE.sRGBEncoding;\n              assignExtrasToUserData(material, materialDef);\n              parser.associations.set(material, {\n                type: \"materials\",\n                index: materialIndex\n              });\n              if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef);\n              return material;\n            });\n          }\n          /** When THREE.Object3D instances are targeted by animation, they need unique names. */\n          createUniqueName(originalName) {\n            const sanitizedName = THREE.PropertyBinding.sanitizeNodeName(originalName || \"\");\n            let name = sanitizedName;\n            for (let i = 1; this.nodeNamesUsed[name]; ++i) {\n              name = sanitizedName + \"_\" + i;\n            }\n            this.nodeNamesUsed[name] = true;\n            return name;\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n           *\n           * Creates BufferGeometries from primitives.\n           *\n           * @param {Array<GLTF.Primitive>} primitives\n           * @return {Promise<Array<BufferGeometry>>}\n           */\n          loadGeometries(primitives) {\n            const parser = this;\n            const extensions = this.extensions;\n            const cache = this.primitiveCache;\n            function createDracoPrimitive(primitive) {\n              return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(primitive, parser).then(function(geometry) {\n                return addPrimitiveAttributes(geometry, primitive, parser);\n              });\n            }\n            const pending = [];\n            for (let i = 0, il = primitives.length; i < il; i++) {\n              const primitive = primitives[i];\n              const cacheKey = createPrimitiveKey(primitive);\n              const cached = cache[cacheKey];\n              if (cached) {\n                pending.push(cached.promise);\n              } else {\n                let geometryPromise;\n                if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) {\n                  geometryPromise = createDracoPrimitive(primitive);\n                } else {\n                  geometryPromise = addPrimitiveAttributes(new THREE.BufferGeometry(), primitive, parser);\n                }\n                cache[cacheKey] = {\n                  primitive,\n                  promise: geometryPromise\n                };\n                pending.push(geometryPromise);\n              }\n            }\n            return Promise.all(pending);\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n           * @param {number} meshIndex\n           * @return {Promise<Group|Mesh|SkinnedMesh>}\n           */\n          loadMesh(meshIndex) {\n            const parser = this;\n            const json = this.json;\n            const extensions = this.extensions;\n            const meshDef = json.meshes[meshIndex];\n            const primitives = meshDef.primitives;\n            const pending = [];\n            for (let i = 0, il = primitives.length; i < il; i++) {\n              const material = primitives[i].material === void 0 ? createDefaultMaterial(this.cache) : this.getDependency(\"material\", primitives[i].material);\n              pending.push(material);\n            }\n            pending.push(parser.loadGeometries(primitives));\n            return Promise.all(pending).then(function(results) {\n              const materials = results.slice(0, results.length - 1);\n              const geometries = results[results.length - 1];\n              const meshes = [];\n              for (let i = 0, il = geometries.length; i < il; i++) {\n                const geometry = geometries[i];\n                const primitive = primitives[i];\n                let mesh;\n                const material = materials[i];\n                if (primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === void 0) {\n                  mesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh(geometry, material) : new THREE.Mesh(geometry, material);\n                  if (mesh.isSkinnedMesh === true && !mesh.geometry.attributes.skinWeight.normalized) {\n                    mesh.normalizeSkinWeights();\n                  }\n                  if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) {\n                    mesh.geometry = toTrianglesDrawMode(mesh.geometry, THREE.TriangleStripDrawMode);\n                  } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) {\n                    mesh.geometry = toTrianglesDrawMode(mesh.geometry, THREE.TriangleFanDrawMode);\n                  }\n                } else if (primitive.mode === WEBGL_CONSTANTS.LINES) {\n                  mesh = new THREE.LineSegments(geometry, material);\n                } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) {\n                  mesh = new THREE.Line(geometry, material);\n                } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) {\n                  mesh = new THREE.LineLoop(geometry, material);\n                } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) {\n                  mesh = new THREE.Points(geometry, material);\n                } else {\n                  throw new Error(\"THREE.GLTFLoader: Primitive mode unsupported: \" + primitive.mode);\n                }\n                if (Object.keys(mesh.geometry.morphAttributes).length > 0) {\n                  updateMorphTargets(mesh, meshDef);\n                }\n                mesh.name = parser.createUniqueName(meshDef.name || \"mesh_\" + meshIndex);\n                assignExtrasToUserData(mesh, meshDef);\n                if (primitive.extensions) addUnknownExtensionsToUserData(extensions, mesh, primitive);\n                parser.assignFinalMaterial(mesh);\n                meshes.push(mesh);\n              }\n              if (meshes.length === 1) {\n                return meshes[0];\n              }\n              const group = new THREE.Group();\n              for (let i = 0, il = meshes.length; i < il; i++) {\n                group.add(meshes[i]);\n              }\n              return group;\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n           * @param {number} cameraIndex\n           * @return {Promise<THREE.Camera>}\n           */\n          loadCamera(cameraIndex) {\n            let camera;\n            const cameraDef = this.json.cameras[cameraIndex];\n            const params = cameraDef[cameraDef.type];\n            if (!params) {\n              console.warn(\"THREE.GLTFLoader: Missing camera parameters.\");\n              return;\n            }\n            if (cameraDef.type === \"perspective\") {\n              camera = new THREE.PerspectiveCamera(THREE.MathUtils.radToDeg(params.yfov), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6);\n            } else if (cameraDef.type === \"orthographic\") {\n              camera = new THREE.OrthographicCamera(-params.xmag, params.xmag, params.ymag, -params.ymag, params.znear, params.zfar);\n            }\n            if (cameraDef.name) camera.name = this.createUniqueName(cameraDef.name);\n            assignExtrasToUserData(camera, cameraDef);\n            return Promise.resolve(camera);\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n           * @param {number} skinIndex\n           * @return {Promise<Object>}\n           */\n          loadSkin(skinIndex) {\n            const skinDef = this.json.skins[skinIndex];\n            const skinEntry = {\n              joints: skinDef.joints\n            };\n            if (skinDef.inverseBindMatrices === void 0) {\n              return Promise.resolve(skinEntry);\n            }\n            return this.getDependency(\"accessor\", skinDef.inverseBindMatrices).then(function(accessor) {\n              skinEntry.inverseBindMatrices = accessor;\n              return skinEntry;\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n           * @param {number} animationIndex\n           * @return {Promise<AnimationClip>}\n           */\n          loadAnimation(animationIndex) {\n            const json = this.json;\n            const animationDef = json.animations[animationIndex];\n            const pendingNodes = [];\n            const pendingInputAccessors = [];\n            const pendingOutputAccessors = [];\n            const pendingSamplers = [];\n            const pendingTargets = [];\n            for (let i = 0, il = animationDef.channels.length; i < il; i++) {\n              const channel = animationDef.channels[i];\n              const sampler = animationDef.samplers[channel.sampler];\n              const target = channel.target;\n              const name = target.node !== void 0 ? target.node : target.id;\n              const input = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.input] : sampler.input;\n              const output = animationDef.parameters !== void 0 ? animationDef.parameters[sampler.output] : sampler.output;\n              pendingNodes.push(this.getDependency(\"node\", name));\n              pendingInputAccessors.push(this.getDependency(\"accessor\", input));\n              pendingOutputAccessors.push(this.getDependency(\"accessor\", output));\n              pendingSamplers.push(sampler);\n              pendingTargets.push(target);\n            }\n            return Promise.all([Promise.all(pendingNodes), Promise.all(pendingInputAccessors), Promise.all(pendingOutputAccessors), Promise.all(pendingSamplers), Promise.all(pendingTargets)]).then(function(dependencies) {\n              const nodes = dependencies[0];\n              const inputAccessors = dependencies[1];\n              const outputAccessors = dependencies[2];\n              const samplers = dependencies[3];\n              const targets = dependencies[4];\n              const tracks = [];\n              for (let i = 0, il = nodes.length; i < il; i++) {\n                const node = nodes[i];\n                const inputAccessor = inputAccessors[i];\n                const outputAccessor = outputAccessors[i];\n                const sampler = samplers[i];\n                const target = targets[i];\n                if (node === void 0) continue;\n                node.updateMatrix();\n                node.matrixAutoUpdate = true;\n                let TypedKeyframeTrack;\n                switch (PATH_PROPERTIES[target.path]) {\n                  case PATH_PROPERTIES.weights:\n                    TypedKeyframeTrack = THREE.NumberKeyframeTrack;\n                    break;\n                  case PATH_PROPERTIES.rotation:\n                    TypedKeyframeTrack = THREE.QuaternionKeyframeTrack;\n                    break;\n                  case PATH_PROPERTIES.position:\n                  case PATH_PROPERTIES.scale:\n                  default:\n                    TypedKeyframeTrack = THREE.VectorKeyframeTrack;\n                    break;\n                }\n                const targetName = node.name ? node.name : node.uuid;\n                const interpolation = sampler.interpolation !== void 0 ? INTERPOLATION[sampler.interpolation] : THREE.InterpolateLinear;\n                const targetNames = [];\n                if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {\n                  node.traverse(function(object) {\n                    if (object.isMesh === true && object.morphTargetInfluences) {\n                      targetNames.push(object.name ? object.name : object.uuid);\n                    }\n                  });\n                } else {\n                  targetNames.push(targetName);\n                }\n                let outputArray = outputAccessor.array;\n                if (outputAccessor.normalized) {\n                  const scale = getNormalizedComponentScale(outputArray.constructor);\n                  const scaled = new Float32Array(outputArray.length);\n                  for (let j = 0, jl = outputArray.length; j < jl; j++) {\n                    scaled[j] = outputArray[j] * scale;\n                  }\n                  outputArray = scaled;\n                }\n                for (let j = 0, jl = targetNames.length; j < jl; j++) {\n                  const track = new TypedKeyframeTrack(targetNames[j] + \".\" + PATH_PROPERTIES[target.path], inputAccessor.array, outputArray, interpolation);\n                  if (sampler.interpolation === \"CUBICSPLINE\") {\n                    track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {\n                      const interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n                      return new interpolantType(this.times, this.values, this.getValueSize() / 3, result);\n                    };\n                    track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n                  }\n                  tracks.push(track);\n                }\n              }\n              const name = animationDef.name ? animationDef.name : \"animation_\" + animationIndex;\n              return new THREE.AnimationClip(name, void 0, tracks);\n            });\n          }\n          createNodeMesh(nodeIndex) {\n            const json = this.json;\n            const parser = this;\n            const nodeDef = json.nodes[nodeIndex];\n            if (nodeDef.mesh === void 0) return null;\n            return parser.getDependency(\"mesh\", nodeDef.mesh).then(function(mesh) {\n              const node = parser._getNodeRef(parser.meshCache, nodeDef.mesh, mesh);\n              if (nodeDef.weights !== void 0) {\n                node.traverse(function(o) {\n                  if (!o.isMesh) return;\n                  for (let i = 0, il = nodeDef.weights.length; i < il; i++) {\n                    o.morphTargetInfluences[i] = nodeDef.weights[i];\n                  }\n                });\n              }\n              return node;\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n           * @param {number} nodeIndex\n           * @return {Promise<Object3D>}\n           */\n          loadNode(nodeIndex) {\n            const json = this.json;\n            const extensions = this.extensions;\n            const parser = this;\n            const nodeDef = json.nodes[nodeIndex];\n            const nodeName = nodeDef.name ? parser.createUniqueName(nodeDef.name) : \"\";\n            return (function() {\n              const pending = [];\n              const meshPromise = parser._invokeOne(function(ext) {\n                return ext.createNodeMesh && ext.createNodeMesh(nodeIndex);\n              });\n              if (meshPromise) {\n                pending.push(meshPromise);\n              }\n              if (nodeDef.camera !== void 0) {\n                pending.push(parser.getDependency(\"camera\", nodeDef.camera).then(function(camera) {\n                  return parser._getNodeRef(parser.cameraCache, nodeDef.camera, camera);\n                }));\n              }\n              parser._invokeAll(function(ext) {\n                return ext.createNodeAttachment && ext.createNodeAttachment(nodeIndex);\n              }).forEach(function(promise) {\n                pending.push(promise);\n              });\n              return Promise.all(pending);\n            })().then(function(objects) {\n              let node;\n              if (nodeDef.isBone === true) {\n                node = new THREE.Bone();\n              } else if (objects.length > 1) {\n                node = new THREE.Group();\n              } else if (objects.length === 1) {\n                node = objects[0];\n              } else {\n                node = new THREE.Object3D();\n              }\n              if (node !== objects[0]) {\n                for (let i = 0, il = objects.length; i < il; i++) {\n                  node.add(objects[i]);\n                }\n              }\n              if (nodeDef.name) {\n                node.userData.name = nodeDef.name;\n                node.name = nodeName;\n              }\n              assignExtrasToUserData(node, nodeDef);\n              if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef);\n              if (nodeDef.matrix !== void 0) {\n                const matrix = new THREE.Matrix4();\n                matrix.fromArray(nodeDef.matrix);\n                node.applyMatrix4(matrix);\n              } else {\n                if (nodeDef.translation !== void 0) {\n                  node.position.fromArray(nodeDef.translation);\n                }\n                if (nodeDef.rotation !== void 0) {\n                  node.quaternion.fromArray(nodeDef.rotation);\n                }\n                if (nodeDef.scale !== void 0) {\n                  node.scale.fromArray(nodeDef.scale);\n                }\n              }\n              parser.associations.set(node, {\n                type: \"nodes\",\n                index: nodeIndex\n              });\n              return node;\n            });\n          }\n          /**\n           * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n           * @param {number} sceneIndex\n           * @return {Promise<Group>}\n           */\n          loadScene(sceneIndex) {\n            const json = this.json;\n            const extensions = this.extensions;\n            const sceneDef = this.json.scenes[sceneIndex];\n            const parser = this;\n            const scene = new THREE.Group();\n            if (sceneDef.name) scene.name = parser.createUniqueName(sceneDef.name);\n            assignExtrasToUserData(scene, sceneDef);\n            if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef);\n            const nodeIds = sceneDef.nodes || [];\n            const pending = [];\n            for (let i = 0, il = nodeIds.length; i < il; i++) {\n              pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser));\n            }\n            return Promise.all(pending).then(function() {\n              return scene;\n            });\n          }\n        }\n        function buildNodeHierachy(nodeId, parentObject, json, parser) {\n          const nodeDef = json.nodes[nodeId];\n          return parser.getDependency(\"node\", nodeId).then(function(node) {\n            if (nodeDef.skin === void 0) return node;\n            let skinEntry;\n            return parser.getDependency(\"skin\", nodeDef.skin).then(function(skin) {\n              skinEntry = skin;\n              const pendingJoints = [];\n              for (let i = 0, il = skinEntry.joints.length; i < il; i++) {\n                pendingJoints.push(parser.getDependency(\"node\", skinEntry.joints[i]));\n              }\n              return Promise.all(pendingJoints);\n            }).then(function(jointNodes) {\n              node.traverse(function(mesh) {\n                if (!mesh.isMesh) return;\n                const bones = [];\n                const boneInverses = [];\n                for (let j = 0, jl = jointNodes.length; j < jl; j++) {\n                  const jointNode = jointNodes[j];\n                  if (jointNode) {\n                    bones.push(jointNode);\n                    const mat = new THREE.Matrix4();\n                    if (skinEntry.inverseBindMatrices !== void 0) {\n                      mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16);\n                    }\n                    boneInverses.push(mat);\n                  } else {\n                    console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[j]);\n                  }\n                }\n                mesh.bind(new THREE.Skeleton(bones, boneInverses), mesh.matrixWorld);\n              });\n              return node;\n            });\n          }).then(function(node) {\n            parentObject.add(node);\n            const pending = [];\n            if (nodeDef.children) {\n              const children = nodeDef.children;\n              for (let i = 0, il = children.length; i < il; i++) {\n                const child = children[i];\n                pending.push(buildNodeHierachy(child, node, json, parser));\n              }\n            }\n            return Promise.all(pending);\n          });\n        }\n        function computeBounds(geometry, primitiveDef, parser) {\n          const attributes = primitiveDef.attributes;\n          const box = new THREE.Box3();\n          if (attributes.POSITION !== void 0) {\n            const accessor = parser.json.accessors[attributes.POSITION];\n            const min = accessor.min;\n            const max = accessor.max;\n            if (min !== void 0 && max !== void 0) {\n              box.set(new THREE.Vector3(min[0], min[1], min[2]), new THREE.Vector3(max[0], max[1], max[2]));\n              if (accessor.normalized) {\n                const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]);\n                box.min.multiplyScalar(boxScale);\n                box.max.multiplyScalar(boxScale);\n              }\n            } else {\n              console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n              return;\n            }\n          } else {\n            return;\n          }\n          const targets = primitiveDef.targets;\n          if (targets !== void 0) {\n            const maxDisplacement = new THREE.Vector3();\n            const vector = new THREE.Vector3();\n            for (let i = 0, il = targets.length; i < il; i++) {\n              const target = targets[i];\n              if (target.POSITION !== void 0) {\n                const accessor = parser.json.accessors[target.POSITION];\n                const min = accessor.min;\n                const max = accessor.max;\n                if (min !== void 0 && max !== void 0) {\n                  vector.setX(Math.max(Math.abs(min[0]), Math.abs(max[0])));\n                  vector.setY(Math.max(Math.abs(min[1]), Math.abs(max[1])));\n                  vector.setZ(Math.max(Math.abs(min[2]), Math.abs(max[2])));\n                  if (accessor.normalized) {\n                    const boxScale = getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[accessor.componentType]);\n                    vector.multiplyScalar(boxScale);\n                  }\n                  maxDisplacement.max(vector);\n                } else {\n                  console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n                }\n              }\n            }\n            box.expandByVector(maxDisplacement);\n          }\n          geometry.boundingBox = box;\n          const sphere = new THREE.Sphere();\n          box.getCenter(sphere.center);\n          sphere.radius = box.min.distanceTo(box.max) / 2;\n          geometry.boundingSphere = sphere;\n        }\n        function addPrimitiveAttributes(geometry, primitiveDef, parser) {\n          const attributes = primitiveDef.attributes;\n          const pending = [];\n          function assignAttributeAccessor(accessorIndex, attributeName) {\n            return parser.getDependency(\"accessor\", accessorIndex).then(function(accessor) {\n              geometry.setAttribute(attributeName, accessor);\n            });\n          }\n          for (const gltfAttributeName in attributes) {\n            const threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase();\n            if (threeAttributeName in geometry.attributes) continue;\n            pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName));\n          }\n          if (primitiveDef.indices !== void 0 && !geometry.index) {\n            const accessor = parser.getDependency(\"accessor\", primitiveDef.indices).then(function(accessor2) {\n              geometry.setIndex(accessor2);\n            });\n            pending.push(accessor);\n          }\n          assignExtrasToUserData(geometry, primitiveDef);\n          computeBounds(geometry, primitiveDef, parser);\n          return Promise.all(pending).then(function() {\n            return primitiveDef.targets !== void 0 ? addMorphTargets(geometry, primitiveDef.targets, parser) : geometry;\n          });\n        }\n        function toTrianglesDrawMode(geometry, drawMode) {\n          let index = geometry.getIndex();\n          if (index === null) {\n            const indices = [];\n            const position = geometry.getAttribute(\"position\");\n            if (position !== void 0) {\n              for (let i = 0; i < position.count; i++) {\n                indices.push(i);\n              }\n              geometry.setIndex(indices);\n              index = geometry.getIndex();\n            } else {\n              console.error(\"THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\");\n              return geometry;\n            }\n          }\n          const numberOfTriangles = index.count - 2;\n          const newIndices = [];\n          if (drawMode === THREE.TriangleFanDrawMode) {\n            for (let i = 1; i <= numberOfTriangles; i++) {\n              newIndices.push(index.getX(0));\n              newIndices.push(index.getX(i));\n              newIndices.push(index.getX(i + 1));\n            }\n          } else {\n            for (let i = 0; i < numberOfTriangles; i++) {\n              if (i % 2 === 0) {\n                newIndices.push(index.getX(i));\n                newIndices.push(index.getX(i + 1));\n                newIndices.push(index.getX(i + 2));\n              } else {\n                newIndices.push(index.getX(i + 2));\n                newIndices.push(index.getX(i + 1));\n                newIndices.push(index.getX(i));\n              }\n            }\n          }\n          if (newIndices.length / 3 !== numberOfTriangles) {\n            console.error(\"THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n          }\n          const newGeometry = geometry.clone();\n          newGeometry.setIndex(newIndices);\n          return newGeometry;\n        }\n        THREE.GLTFLoader = GLTFLoader;\n      })();\n    }\n  });\n\n  // plugin/defer.ts\n  var deferred = [];\n  function defer(lambda) {\n    deferred.push(lambda);\n  }\n  function deferDelete(deletable) {\n    defer(() => deletable.delete());\n    return deletable;\n  }\n  function runDeferred() {\n    for (let lambda of deferred.reverse())\n      lambda();\n  }\n\n  // plugin/parse_gltf.ts\n  if (THREE[\"GLTFLoader\"] == void 0)\n    init_GLTFLoader();\n  async function parseGltf(file) {\n    let loadingManager = new THREE.LoadingManager();\n    let gltfLoader = createGltfLoader(loadingManager);\n    let gltf = await parseGltfWithLoader(gltfLoader, file);\n    return gltf;\n  }\n  function createGltfLoader(loadingManager = void 0) {\n    let _GLTFLoaderClass = THREE[\"GLTFLoader\"];\n    let loader = new _GLTFLoaderClass(loadingManager);\n    return loader;\n  }\n  function parseGltfWithLoader(loader, file) {\n    return new Promise((resolve, reject) => loader.parse(file.content, PathModule.dirname(file.path) + PathModule.sep, resolve, reject));\n  }\n\n  // plugin/util.ts\n  function isPluginInstalled(pluginId) {\n    return Plugins.installed.some((p) => p.id === pluginId && p.disabled !== true);\n  }\n  function showPlugin(pluginId) {\n    Plugins.dialog.component.data.selected_plugin = Plugins.all.find((p) => p.id === pluginId);\n    Plugins.dialog.show();\n  }\n  function valuesAndIndices(array) {\n    return array.map((v, i) => [v, i]);\n  }\n  function imageBitmapToDataUri(imageBitmap, type = \"image/png\", quality) {\n    let canvas = document.createElement(\"canvas\");\n    canvas.width = imageBitmap.width;\n    canvas.height = imageBitmap.height;\n    let ctx = canvas.getContext(\"2d\");\n    if (ctx == void 0)\n      throw new Error(\"Failed to get 2D context\");\n    ctx.drawImage(imageBitmap, 0, 0);\n    return canvas.toDataURL(type, quality);\n  }\n  function arrayEquals(a, b) {\n    return !a.some((v, i) => b[i] !== v);\n  }\n  function modulo(a, b) {\n    return (a % b + b) % b;\n  }\n  function eulerDegreesFromQuat(quat) {\n    return new THREE.Euler().setFromQuaternion(quat).toVector3().multiplyScalar(180 / Math.PI);\n  }\n\n  // plugin/vector_hash_map.ts\n  var VectorHashMap = class {\n    backingMap;\n    constructor() {\n      this.backingMap = {};\n    }\n    has(key) {\n      return this.getKeyValuePair(key) != void 0;\n    }\n    get(key) {\n      return this.getKeyValuePair(key)?.[1];\n    }\n    set(key, value) {\n      let bucket = this.getBucket(key);\n      if (bucket == void 0) {\n        this.backingMap[this.getHashCode(key)] = [[key, value]];\n        return;\n      }\n      let keyValuePair = this.getKeyValuePair(key);\n      if (keyValuePair == void 0) {\n        bucket.push([key, value]);\n        return;\n      }\n      keyValuePair[1] = value;\n    }\n    remove(key) {\n      this.getBucket(key)?.remove(this.getKeyValuePair(key));\n    }\n    getHashCode(key) {\n      let hash = 2166136261;\n      for (let component of key) {\n        let component32 = component | 0;\n        for (let i = 0; i < 4; i++) {\n          let byte = component32 >>> i * 8 & 255;\n          hash ^= byte;\n          hash = Math.imul(hash, 16777619);\n        }\n      }\n      return hash >>> 0;\n    }\n    getBucket(key) {\n      return this.backingMap[this.getHashCode(key)];\n    }\n    getKeyValuePair(key) {\n      return this.getBucket(key)?.find(([k, v]) => k.every((c, i) => c === key[i]));\n    }\n  };\n\n  // plugin/import_gltf.ts\n  async function importGltf(options) {\n    let gltf = await parseGltf(options.file);\n    if (options.cameras === \"NOT_INSTALLED\" && gltf.cameras.length !== 0)\n      return \"UNSUPPORTED_CAMERAS\";\n    let content = {\n      groups: [],\n      elements: [],\n      textures: [],\n      animations: [],\n      uvOutOfBounds: false,\n      usesRepeatingWrapMode: false,\n      unsupportedArmatures: false,\n      texturesById: {},\n      textureCacheKeys: await prepareTextureCacheKeys(gltf)\n    };\n    if (options.undoable) {\n      let rootGroup = Outliner.root.find((n) => n instanceof Group);\n      Undo.initEdit({\n        outliner: true,\n        selection: true,\n        group: rootGroup,\n        elements: content.elements,\n        textures: content.textures,\n        animations: content.animations\n      });\n    }\n    let sceneRoot = gltf.scene;\n    importNode(sceneRoot, options, content);\n    content.usesRepeatingWrapMode = gltf.parser.json.samplers?.some((s) => s.wrapS == void 0 || s.wrapT == void 0 || s.wrapS === 10497 || s.wrapT === 10497) ?? false;\n    if (options.selectResult) {\n      Outliner.selected.empty();\n      Outliner.selected.push(...content.elements);\n      Group.all.forEach((g) => g.unselect());\n      content.groups.forEach((g) => g.multiSelect());\n    }\n    if (options.undoable)\n      Undo.finishEdit(\"Import glTF\");\n    return content;\n  }\n  function importNode(node, options, content) {\n    switch (node.type) {\n      case \"Group\":\n        if (node.parent != void 0)\n          return importMeshPrimitives(node, node.children, options, content);\n      // else it's the root, treat as group\n      // fall through...\n      case \"Object3D\":\n        return importGroup(node, options, content);\n      case \"Mesh\":\n      case \"SkinnedMesh\":\n        return importSingleMesh(node, options, content);\n      default:\n        console.warn(`[gltf_importer]: Skipping unknown node type \"${node.type}\"`);\n        return null;\n    }\n  }\n  function importGroup(node, options, content) {\n    let isRoot = node.parent == void 0;\n    let group = null;\n    if (options.groups && !isRoot) {\n      group = new Group({\n        name: node.userData.name || node.name || \"group\",\n        origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(),\n        rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray()\n      });\n      group.init();\n      group.createUniqueName();\n      group.openUp();\n      content.groups.push(group);\n    }\n    for (let child of node.children) {\n      let result = importNode(child, options, content);\n      result?.addTo(group ?? \"root\");\n    }\n    return group;\n  }\n  function importSingleMesh(node, options, content) {\n    return importMeshPrimitives(node, [node], options, content);\n  }\n  function importMeshPrimitives(node, primitives, options, content) {\n    let mesh = new Mesh({\n      name: node.userData.name || node.name || \"mesh\",\n      origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(),\n      rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray(),\n      vertices: {}\n    });\n    content.elements.push(mesh);\n    let scale = node.getWorldScale(new THREE.Vector3()).multiplyScalar(options.scale);\n    let primitiveTextures = primitives.map((p) => importTexture(p.material, options, content));\n    let uniqueVertices = [];\n    let uniqueVertexIndices = new VectorHashMap();\n    let primitiveToUniqueVertexIndices = [];\n    for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) {\n      primitiveToUniqueVertexIndices[primitiveIndex] = [];\n      for (let vertexIndex = 0; vertexIndex < primitive.geometry.attributes.position.count; vertexIndex++) {\n        let x = primitive.geometry.attributes.position.array[vertexIndex * 3];\n        let y = primitive.geometry.attributes.position.array[vertexIndex * 3 + 1];\n        let z = primitive.geometry.attributes.position.array[vertexIndex * 3 + 2];\n        let vertex = [\n          x * scale.x,\n          y * scale.y,\n          z * scale.z\n        ];\n        if (!uniqueVertexIndices.has(vertex)) {\n          let newUniqueVertexIndex = uniqueVertices.push(vertex) - 1;\n          uniqueVertexIndices.set(vertex, newUniqueVertexIndex);\n        }\n        primitiveToUniqueVertexIndices[primitiveIndex].push(uniqueVertexIndices.get(vertex));\n      }\n    }\n    let vertexKeys = Array.from({ length: uniqueVertices.length }, () => bbuid(4));\n    mesh.vertices = Object.fromEntries(uniqueVertices.map((v, i) => [vertexKeys[i], v]));\n    let faces = [];\n    for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) {\n      if (primitive.geometry.index == void 0)\n        continue;\n      for (let faceIndex = 0; faceIndex < primitive.geometry.index.count / 3; faceIndex++) {\n        let texture = primitiveTextures[primitiveIndex];\n        let uvWidth = texture?.uv_width ?? Project?.texture_width ?? 16;\n        let uvHeight = texture?.uv_height ?? Project?.texture_height ?? 16;\n        let v1Uv, v2Uv, v3Uv;\n        let v1Idx = primitive.geometry.index.array[faceIndex * 3];\n        let v2Idx = primitive.geometry.index.array[faceIndex * 3 + 1];\n        let v3Idx = primitive.geometry.index.array[faceIndex * 3 + 2];\n        let v1Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v1Idx]];\n        let v2Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v2Idx]];\n        let v3Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v3Idx]];\n        let faceVertexKeys = [v1Key, v2Key, v3Key];\n        if (primitive.geometry.attributes.uv != void 0) {\n          let uvComponents = primitive.geometry.attributes.uv.array;\n          v1Uv = [uvComponents[v1Idx * 2], uvComponents[v1Idx * 2 + 1]];\n          v2Uv = [uvComponents[v2Idx * 2], uvComponents[v2Idx * 2 + 1]];\n          v3Uv = [uvComponents[v3Idx * 2], uvComponents[v3Idx * 2 + 1]];\n        } else {\n          v1Uv = [0, 0];\n          v2Uv = [1, 0];\n          v3Uv = [0, 1];\n        }\n        let v1UvScaled = [v1Uv[0] * uvWidth, v1Uv[1] * uvHeight];\n        let v2UvScaled = [v2Uv[0] * uvWidth, v2Uv[1] * uvHeight];\n        let v3UvScaled = [v3Uv[0] * uvWidth, v3Uv[1] * uvHeight];\n        let uv = {\n          [v1Key]: v1UvScaled,\n          [v2Key]: v2UvScaled,\n          [v3Key]: v3UvScaled\n        };\n        content.uvOutOfBounds ||= [...v1Uv, ...v2Uv, ...v3Uv].some((x) => x < 0 || x > 1);\n        let facesMergedIntoQuad = options.mergeQuads && (() => {\n          if (faces.length < 1)\n            return false;\n          let lastFace = faces[faces.length - 1];\n          if (lastFace.vertices.length !== 3)\n            return false;\n          let nonSharedVertexKeys = [];\n          let sharedVertexKeys = [];\n          for (let vertKey of lastFace.vertices)\n            (faceVertexKeys.includes(vertKey) ? sharedVertexKeys : nonSharedVertexKeys).push(vertKey);\n          if (sharedVertexKeys.length !== 2 || nonSharedVertexKeys.length !== 1)\n            return false;\n          if (sharedVertexKeys.some((vk) => !arrayEquals(uv[vk], lastFace.uv[vk])))\n            return false;\n          let face1VertAafterB = (faceVertexKeys.indexOf(sharedVertexKeys[0]) + 1) % 3 === faceVertexKeys.indexOf(sharedVertexKeys[1]);\n          let face2VertAafterB = (lastFace.vertices.indexOf(sharedVertexKeys[0]) + 1) % 3 === lastFace.vertices.indexOf(sharedVertexKeys[1]);\n          if (face1VertAafterB === face2VertAafterB)\n            return false;\n          let newVertexKey = nonSharedVertexKeys[0];\n          let face2VertBeforeNewVert = faceVertexKeys[modulo(faceVertexKeys.indexOf(newVertexKey) - 1, 3)];\n          let face1VertBeforeNewVertIndex = lastFace.vertices.indexOf(face2VertBeforeNewVert);\n          lastFace.vertices.splice(face1VertBeforeNewVertIndex, 0, newVertexKey);\n          lastFace.uv[newVertexKey] = uv[newVertexKey];\n          return true;\n        })();\n        if (!facesMergedIntoQuad) {\n          faces.push(new MeshFace(mesh, {\n            vertices: faceVertexKeys,\n            uv,\n            texture\n          }));\n        }\n      }\n    }\n    mesh.addFaces(...faces);\n    mesh.init();\n    return mesh;\n  }\n  async function prepareTextureCacheKeys(gltf) {\n    let textureCache = gltf.parser.textureCache;\n    let textures = await Promise.all(Object.values(textureCache));\n    let cacheKeys = Object.keys(textureCache).map((key) => key.substring(0, key.lastIndexOf(\":\")));\n    let textureCacheKeys = Object.fromEntries(cacheKeys.map((key, i) => [textures[i].uuid, key]));\n    return textureCacheKeys;\n  }\n  function importTexture(threeMaterial, options, content) {\n    let threeTexture = threeMaterial?.map;\n    if (threeTexture == void 0)\n      return void 0;\n    if (content.texturesById[threeTexture.uuid] !== void 0) {\n      let bbTexture2 = content.texturesById[threeTexture.uuid] ?? void 0;\n      if (threeMaterial?.side !== THREE.FrontSide && bbTexture2 != void 0)\n        bbTexture2.render_sides = \"double\";\n      return bbTexture2;\n    }\n    let cacheKey = content.textureCacheKeys[threeTexture.uuid];\n    let bbTexture = null;\n    if (cacheKey == void 0) {\n    } else if (isStringNumber(cacheKey)) {\n      if (!(threeTexture.image instanceof ImageBitmap)) {\n        console.warn(\"Imported texture has unknown format: \", threeTexture.image);\n      } else {\n        let dataUri = imageBitmapToDataUri(threeTexture.image, \"image/png\", 1);\n        bbTexture = new Texture().fromDataURL(dataUri);\n      }\n    } else if (cacheKey.startsWith(\"data:\")) {\n      bbTexture = new Texture().fromDataURL(cacheKey);\n    } else {\n      let absoluteTexturePath = PathModule.join(PathModule.dirname(options.file.path), cacheKey);\n      bbTexture = new Texture().fromPath(absoluteTexturePath);\n    }\n    if (bbTexture != void 0) {\n      bbTexture.name = threeTexture.name || \"texture\", bbTexture.add(false);\n      content.textures.push(bbTexture);\n      if (threeMaterial?.side !== THREE.FrontSide && bbTexture != void 0)\n        bbTexture.render_sides = \"double\";\n    }\n    content.texturesById[threeTexture.uuid] = bbTexture;\n    return bbTexture ?? void 0;\n  }\n\n  // plugin/plugin.ts\n  BBPlugin.register(\"gltf_importer\", {\n    title: \"glTF Importer\",\n    author: \"0x13F\",\n    description: \"Import .GLTF and .GLB models\",\n    icon: \"icon.png\",\n    creation_date: \"2025-09-25\",\n    version: \"1.1.0\",\n    variant: \"desktop\",\n    min_version: \"4.12.6\",\n    has_changelog: false,\n    tags: [\"Format: Generic Model\", \"Importer\"],\n    repository: \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/gltf_importer\",\n    onload() {\n      deferDelete(new Action(\"import_gltf\", {\n        name: \"Import glTF Model\",\n        icon: \"icon-gltf\",\n        category: \"file\",\n        condition: {\n          modes: [\"edit\"],\n          method: () => Format?.meshes\n        },\n        click() {\n          importGltfDialog.show();\n        }\n      }));\n      let importMenu = MenuBar.menus.file.structure.find((x) => x[\"id\"] === \"import\");\n      let importMenuChildren = importMenu.children;\n      let objImportItemIndex = importMenuChildren.findIndex((x) => (typeof x === \"string\" ? x : x[\"id\"]).startsWith(\"import_obj\"));\n      importMenuChildren.splice(objImportItemIndex, 0, \"import_gltf\");\n      defer(() => importMenuChildren.splice(importMenuChildren.indexOf(\"import_gltf\"), 1));\n      let importGltfDialog = deferDelete(new Dialog(\"import_gltf_dialog\", {\n        title: \"Import glTF\",\n        form: {\n          [\"file\"]: {\n            type: \"file\",\n            label: \"glTF File\",\n            return_as: \"file\",\n            extensions: [\"gltf\", \"glb\"],\n            resource_id: \"gltf\",\n            filetype: \"glTF Model\",\n            readtype: \"buffer\"\n          },\n          [\"scale\"]: {\n            type: \"number\",\n            label: \"Scale\",\n            value: Settings.get(\"model_export_scale\")\n          },\n          [\"groups\"]: {\n            type: \"checkbox\",\n            label: \"Import Groups\",\n            value: false\n          },\n          // TODO: enable\n          // ['cameras']: {\n          //     type: 'checkbox',\n          //     label: 'Import Cameras',\n          //     value: isPluginInstalled('cameras'),\n          // },\n          // ['animations']: {\n          //     type: 'checkbox',\n          //     label: 'Import Animations',\n          //     value: true,\n          // },\n          // ['quads']: {\n          //     type: 'checkbox',\n          //     label: 'Merge Quads',\n          //     value: true,\n          // },\n          [\"info_sep\"]: \"_\",\n          [\"info\"]: {\n            type: \"info\",\n            text: \"It is currently not possible to import armatures, animations or cameras.\"\n          }\n        },\n        onConfirm(formOptions) {\n          if (formOptions.file == void 0)\n            return false;\n          let importOptions = {\n            file: formOptions.file,\n            scale: formOptions.scale,\n            groups: formOptions.groups,\n            cameras: formOptions.cameras,\n            animations: formOptions.animations,\n            mergeQuads: formOptions.quads,\n            undoable: true,\n            selectResult: true\n          };\n          if (formOptions.cameras && !isPluginInstalled(\"cameras\"))\n            importOptions.cameras = \"NOT_INSTALLED\";\n          importGltf(importOptions).then(async (content) => {\n            if (content === \"UNSUPPORTED_CAMERAS\") {\n              importGltfDialog.show();\n              warnAboutCameras();\n              return;\n            }\n            if (content.unsupportedArmatures)\n              await warnAboutUnsupportedArmatures();\n            if (content.usesRepeatingWrapMode && content.uvOutOfBounds)\n              warnAboutRepeatingTextures();\n          });\n        }\n      }));\n      window[\"importGltf\"] = importGltf;\n      defer(() => delete window[\"importGltf\"]);\n    },\n    onunload() {\n      runDeferred();\n    }\n  });\n  function warnAboutUnsupportedArmatures() {\n    return new Promise((resolve, reject) => {\n      Blockbench.showMessageBox({\n        title: \"Armatures not supported\",\n        message: \"The imported glTF model makes use of armatures. The version of Blockbench you are currently using does not support armatures. If you want to import armatures from models, please update to the lastest version of Blockbench.\",\n        icon: \"warning\",\n        width: 520\n      }, () => resolve());\n    });\n  }\n  function warnAboutRepeatingTextures() {\n    if (isPluginInstalled(\"repeating_textures\")) {\n      if (!Settings.get(\"repeating_textures\")) {\n        Blockbench.showMessageBox({\n          title: \"Repeating Textures not enabled\",\n          message: \"The imported glTF model makes use of repeating textures. Repeating textures is are currently disabled. Would you like to enable them now?\",\n          icon: \"warning\",\n          width: 520,\n          buttons: [\"dialog.yes\", \"dialog.no\"]\n        }, (result) => {\n          if (result === 0) {\n            BarItems[\"toggle_repeating_textures\"].trigger();\n            Blockbench.showQuickMessage(\"Repeating Textures enabled\");\n          }\n        });\n      }\n    } else {\n      Blockbench.showMessageBox({\n        title: \"Repeating Textures plugin not installed\",\n        message: 'The imported glTF model makes use of repeating textures. Blockbench does not support this by default, so the model may appear incorrect. Would you like to install the \"Repeating Textures\" plugin to fix this?',\n        icon: \"warning\",\n        width: 520,\n        buttons: [\"dialog.yes\", \"dialog.no\"]\n      }, (result) => {\n        if (result === 0)\n          showPlugin(\"repeating_textures\");\n      });\n    }\n  }\n  function warnAboutCameras() {\n    Blockbench.showMessageBox({\n      title: \"Cameras plugin not installed\",\n      message: 'The imported glTF model contains cameras which you have chosen to import, but the \"Cameras\" plugin is not currently installed. Would you like to install the \"Cameras\" plugin now?',\n      icon: \"warning\",\n      width: 520,\n      buttons: [\"dialog.yes\", \"dialog.no\"]\n    }, (result) => {\n      if (result === 0)\n        showPlugin(\"cameras\");\n    });\n  }\n})();\n"
  },
  {
    "path": "plugins/gltf_importer/members.yml",
    "content": "maintainers:\n  - mr0x13f\ndevelopers:\n  - mr0x13f\n"
  },
  {
    "path": "plugins/gltf_importer/src/.gitignore",
    "content": "node_modules\n"
  },
  {
    "path": "plugins/gltf_importer/src/README.md",
    "content": "# glTF Importer\n\nA plugin to import glTF models into Blockbench.\nThe approach is to use THREE.js GLTFLoader to import the glTF into\na THREE.js scene, which we then use to create new objects in Blockbench.\n\n## Development\n\n### Local development setup\n\nFrom `plugins/gltf_importer/src/` run:\n```sh\nnpm install\nnpm run build\n```\n\nWatch for changes using `npm run dev`.\n\nIn Blockbench install from file `../gltf_importer.js`.\n\n### Package patches\n\nThis project uses `patch-package` to add fixes to the `blockbench-types` package.\nThese should be applied automatically when running `npm install`, but you can apply the patch manually by running `npx patch-package`.\nThe patch file is located at `patches/blockbench-types+5.0.0-beta.0.patch`.\nTo change the patch file, make changes in your `node_modules/blockbench-types` directory, then run `npm run patch` to regenerate the patch file.\n"
  },
  {
    "path": "plugins/gltf_importer/src/package.json",
    "content": "{\n  \"name\": \"gltf_importer\",\n  \"main\": \"plugin/plugin.ts\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"esbuild plugin/plugin.ts --bundle --outfile=../gltf_importer.js\",\n    \"dev\": \"esbuild plugin/plugin.ts --bundle --outfile=../gltf_importer.js --watch\",\n    \"patch\": \"patch-package blockbench-types\",\n    \"postinstall\": \"patch-package\"\n  },\n  \"dependencies\": {\n    \"blockbench-types\": \"5.0.0-beta.0\"\n  },\n  \"devDependencies\": {\n    \"@types/three\": \"^0.179.0\",\n    \"esbuild\": \"^0.25.9\",\n    \"patch-package\": \"^8.0.0\"\n  }\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/patches/blockbench-types+5.0.0-beta.0.patch",
    "content": "diff --git a/node_modules/blockbench-types/custom/mesh.d.ts b/node_modules/blockbench-types/custom/mesh.d.ts\nindex fb315a5..98c1dcb 100644\n--- a/node_modules/blockbench-types/custom/mesh.d.ts\n+++ b/node_modules/blockbench-types/custom/mesh.d.ts\n@@ -20,7 +20,7 @@ interface MeshOptions {\n \n interface MeshFaceOptions extends FaceOptions {\n \tvertices: string[]\n-\tuv: { [vkey: string]: ArrayVector2 }\n+\tuv?: { [vkey: string]: ArrayVector2 }\n }\n declare class MeshFace extends Face {\n \tconstructor(mesh: Mesh, data: MeshFaceOptions)\ndiff --git a/node_modules/blockbench-types/generated/plugin_loader.d.ts b/node_modules/blockbench-types/generated/plugin_loader.d.ts\nindex 33ea480..ae9db47 100644\n--- a/node_modules/blockbench-types/generated/plugin_loader.d.ts\n+++ b/node_modules/blockbench-types/generated/plugin_loader.d.ts\n@@ -126,6 +126,7 @@ interface PluginOptions {\n     bug_tracker?: string;\n     contributors?: string[];\n     disabled?: boolean;\n+    creation_date: string | number;\n     /**\n      * Runs when the plugin loads\n      */\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/GLTFLoader.js",
    "content": "\n/*\nThree.js glTF Model Loader\nhttps://github.com/mrdoob/three.js\n\nCopyright © 2010-2021 three.js authors\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*/\n\n( function () {\n\n\tclass GLTFLoader extends THREE.Loader {\n\n\t\tconstructor( manager ) {\n\n\t\t\tsuper( manager );\n\t\t\tthis.dracoLoader = null;\n\t\t\tthis.ktx2Loader = null;\n\t\t\tthis.meshoptDecoder = null;\n\t\t\tthis.pluginCallbacks = [];\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tload( url, onLoad, onProgress, onError ) {\n\n\t\t\tconst scope = this;\n\t\t\tlet resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = THREE.LoaderUtils.extractUrlBase( url );\n\n\t\t\t} // Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tconst _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tconst loader = new THREE.FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( this.requestHeader );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t}\n\n\t\tsetDRACOLoader( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetDDSLoader() {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".' );\n\n\t\t}\n\n\t\tsetKTX2Loader( ktx2Loader ) {\n\n\t\t\tthis.ktx2Loader = ktx2Loader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tunregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tparse( data, path, onLoad, onError ) {\n\n\t\t\tlet content;\n\t\t\tconst extensions = {};\n\t\t\tconst plugins = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tconst magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = THREE.LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst parser = new GLTFParser( json, {\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\trequestHeader: this.requestHeader,\n\t\t\t\tmanager: this.manager,\n\t\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\t\tmeshoptDecoder: this.meshoptDecoder\n\t\t\t} );\n\t\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\t\tplugins[ plugin.name ] = plugin; // Workaround to avoid determining as unknown extension\n\t\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t\t// Remove this workaround if we move all the existing\n\t\t\t\t// extension handlers to plugin system\n\n\t\t\t\textensions[ plugin.name ] = true;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.setExtensions( extensions );\n\t\t\tparser.setPlugins( plugins );\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t}\n\t/* GLTFREGISTRY */\n\n\n\tfunction GLTFRegistry() {\n\n\t\tlet objects = {};\n\t\treturn {\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\t\t};\n\n\t}\n\t/*********************************/\n\n\t/********** EXTENSIONS ***********/\n\n\t/*********************************/\n\n\n\tconst EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\t\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\t\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\t\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\t\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\t\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression'\n\t};\n\t/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\n\n\tclass GLTFLightsExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; // THREE.Object3D instance caches\n\n\t\t\tthis.cache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\n\t\t}\n\n\t\t_markDefs() {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.extensions && nodeDef.extensions[ this.name ] && nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_loadLight( lightIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst cacheKey = 'light:' + lightIndex;\n\t\t\tlet dependency = parser.cache.get( cacheKey );\n\t\t\tif ( dependency ) return dependency;\n\t\t\tconst json = parser.json;\n\t\t\tconst extensions = json.extensions && json.extensions[ this.name ] || {};\n\t\t\tconst lightDefs = extensions.lights || [];\n\t\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\t\tlet lightNode;\n\t\t\tconst color = new THREE.Color( 0xffffff );\n\t\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\t\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\t\tswitch ( lightDef.type ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlightNode = new THREE.DirectionalLight( color );\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlightNode = new THREE.PointLight( color );\n\t\t\t\t\tlightNode.distance = range;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlightNode = new THREE.SpotLight( color );\n\t\t\t\t\tlightNode.distance = range; // Handle spotlight properties.\n\n\t\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t\t} // Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t\t// here, because node-level parsing will only override position if explicitly specified.\n\n\n\t\t\tlightNode.position.set( 0, 0, 0 );\n\t\t\tlightNode.decay = 2;\n\t\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\t\t\tlightNode.name = parser.createUniqueName( lightDef.name || 'light_' + lightIndex );\n\t\t\tdependency = Promise.resolve( lightNode );\n\t\t\tparser.cache.add( cacheKey, dependency );\n\t\t\treturn dependency;\n\n\t\t}\n\n\t\tcreateNodeAttachment( nodeIndex ) {\n\n\t\t\tconst self = this;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tconst lightDef = nodeDef.extensions && nodeDef.extensions[ this.name ] || {};\n\t\t\tconst lightIndex = lightDef.light;\n\t\t\tif ( lightIndex === undefined ) return null;\n\t\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\n\n\n\tclass GLTFMaterialsUnlitExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshBasicMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pending = [];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\t\tif ( metallicRoughness ) {\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\n\n\n\tclass GLTFMaterialsClearcoatExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale; // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\n\t\t\t\t\tmaterialParams.clearcoatNormalScale = new THREE.Vector2( scale, - scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\n\n\n\tclass GLTFMaterialsTransmissionExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\n\n\n\tclass GLTFMaterialsVolumeExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || 0;\n\t\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.attenuationTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\n\n\n\tclass GLTFMaterialsIorExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t}\n\t/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\n\n\n\tclass GLTFMaterialsSpecularExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t\t}\n\n\t\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.specularTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularTintMap', extension.specularColorTexture ).then( function ( texture ) {\n\n\t\t\t\t\ttexture.encoding = THREE.sRGBEncoding;\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * BasisU THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\n\n\n\tclass GLTFTextureBasisUExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ this.name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tconst loader = parser.options.ktx2Loader;\n\n\t\t\tif ( ! loader ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t}\n\t/**\n * WebP THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\n\n\n\tclass GLTFTextureWebPExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\t\tthis.isSupported = null;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst name = this.name;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tlet loader = parser.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t\t} // Fall back to PNG or JPEG.\n\n\n\t\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tdetectSupport() {\n\n\t\t\tif ( ! this.isSupported ) {\n\n\t\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\t\tconst image = new Image(); // Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t\t// WebP images, unfortunately.\n\n\t\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn this.isSupported;\n\n\t\t}\n\n\t}\n\t/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\n\n\n\tclass GLTFMeshoptCompression {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\t\tthis.parser = parser;\n\n\t\t}\n\n\t\tloadBufferView( index ) {\n\n\t\t\tconst json = this.parser.json;\n\t\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\t\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) {\n\n\t\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\t\t\t\t\tconst count = extensionDef.count;\n\t\t\t\t\tconst stride = extensionDef.byteStride;\n\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\tconst source = new Uint8Array( res[ 0 ], byteOffset, byteLength );\n\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/* BINARY EXTENSION */\n\n\n\tconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tconst BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tconst BINARY_EXTENSION_CHUNK_TYPES = {\n\t\tJSON: 0x4E4F534A,\n\t\tBIN: 0x004E4942\n\t};\n\n\tclass GLTFBinaryExtension {\n\n\t\tconstructor( data ) {\n\n\t\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\t\tthis.content = null;\n\t\t\tthis.body = null;\n\t\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tthis.header = {\n\t\t\t\tmagic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\t\tlength: headerView.getUint32( 8, true )\n\t\t\t};\n\n\t\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t\t}\n\n\t\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tlet chunkIndex = 0;\n\n\t\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\t\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\n\t\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\t\tthis.content = THREE.LoaderUtils.decodeText( contentArray );\n\n\t\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t\t} // Clients must ignore chunks with unknown types.\n\n\n\t\t\t\tchunkIndex += chunkLength;\n\n\t\t\t}\n\n\t\t\tif ( this.content === null ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * DRACO THREE.Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\n\n\n\tclass GLTFDracoMeshCompressionExtension {\n\n\t\tconstructor( json, dracoLoader ) {\n\n\t\t\tif ( ! dracoLoader ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t\t}\n\n\t\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\t\tthis.json = json;\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\tthis.dracoLoader.preload();\n\n\t\t}\n\n\t\tdecodePrimitive( primitive, parser ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst dracoLoader = this.dracoLoader;\n\t\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\t\tconst threeAttributeMap = {};\n\t\t\tconst attributeNormalizedMap = {};\n\t\t\tconst attributeTypeMap = {};\n\n\t\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\t\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t\t}\n\n\t\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\t\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\n\n\n\tclass GLTFTextureTransformExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t\t}\n\n\t\textendTexture( texture, transform ) {\n\n\t\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\t\treturn texture;\n\n\t\t\t}\n\n\t\t\ttexture = texture.clone();\n\n\t\t\tif ( transform.offset !== undefined ) {\n\n\t\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t\t}\n\n\t\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\t\ttexture.rotation = transform.rotation;\n\n\t\t\t}\n\n\t\t\tif ( transform.scale !== undefined ) {\n\n\t\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\t\t\treturn texture;\n\n\t\t}\n\n\t}\n\t/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\n\n\t/**\n * A sub class of StandardMaterial with some of the functionality\n * changed via the `onBeforeCompile` callback\n * @pailhead\n */\n\n\n\tclass GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial {\n\n\t\tconstructor( params ) {\n\n\t\t\tsuper();\n\t\t\tthis.isGLTFSpecularGlossinessMaterial = true; //various chunks that need replacing\n\n\t\t\tconst specularMapParsFragmentChunk = [ '#ifdef USE_SPECULARMAP', '\tuniform sampler2D specularMap;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapParsFragmentChunk = [ '#ifdef USE_GLOSSINESSMAP', '\tuniform sampler2D glossinessMap;', '#endif' ].join( '\\n' );\n\t\t\tconst specularMapFragmentChunk = [ 'vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', '\tvec4 texelSpecular = texture2D( specularMap, vUv );', '\ttexelSpecular = sRGBToLinear( texelSpecular );', '\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tspecularFactor *= texelSpecular.rgb;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapFragmentChunk = [ 'float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', '\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );', '\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tglossinessFactor *= texelGlossiness.a;', '#endif' ].join( '\\n' );\n\t\t\tconst lightPhysicalFragmentChunk = [ 'PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;' ].join( '\\n' );\n\t\t\tconst uniforms = {\n\t\t\t\tspecular: {\n\t\t\t\t\tvalue: new THREE.Color().setHex( 0xffffff )\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tvalue: 1\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis._extraUniforms = uniforms;\n\n\t\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\t\tfor ( const uniformName in uniforms ) {\n\n\t\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t\t}\n\n\t\t\t\tshader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ).replace( 'uniform float metalness;', 'uniform float glossiness;' ).replace( '#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk ).replace( '#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk ).replace( '#include <roughnessmap_fragment>', specularMapFragmentChunk ).replace( '#include <metalnessmap_fragment>', glossinessMapFragmentChunk ).replace( '#include <lights_physical_fragment>', lightPhysicalFragmentChunk );\n\n\t\t\t};\n\n\t\t\tObject.defineProperties( this, {\n\t\t\t\tspecular: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specular.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specular.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specularMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specularMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_SPECULARMAP;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossiness.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossiness.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossinessMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossinessMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\t\tthis.defines.USE_UV = '';\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\t\t\t\t\t\t\tdelete this.defines.USE_UV;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\tthis.setValues( params );\n\n\t\t}\n\n\t\tcopy( source ) {\n\n\t\t\tsuper.copy( source );\n\t\t\tthis.specularMap = source.specularMap;\n\t\t\tthis.specular.copy( source.specular );\n\t\t\tthis.glossinessMap = source.glossinessMap;\n\t\t\tthis.glossiness = source.glossiness;\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\treturn this;\n\n\t\t}\n\n\t}\n\n\tclass GLTFMaterialsPbrSpecularGlossinessExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n\t\t\tthis.specularGlossinessParams = [ 'color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalMapType', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio' ];\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn GLTFMeshStandardSGMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst pending = [];\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\tconst array = pbrSpecularGlossiness.diffuseFactor;\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 );\n\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\tmaterialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 );\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\tconst specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t\tcreateMaterial( materialParams ) {\n\n\t\t\tconst material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\t\tmaterial.fog = true;\n\t\t\tmaterial.color = materialParams.color;\n\t\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\t\t\tmaterial.lightMap = null;\n\t\t\tmaterial.lightMapIntensity = 1.0;\n\t\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\t\tmaterial.aoMapIntensity = 1.0;\n\t\t\tmaterial.emissive = materialParams.emissive;\n\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\t\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\t\tmaterial.bumpScale = 1;\n\t\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\t\tmaterial.normalMapType = THREE.TangentSpaceNormalMap;\n\t\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\t\t\tmaterial.displacementMap = null;\n\t\t\tmaterial.displacementScale = 1;\n\t\t\tmaterial.displacementBias = 0;\n\t\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\t\tmaterial.specular = materialParams.specular;\n\t\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\t\tmaterial.glossiness = materialParams.glossiness;\n\t\t\tmaterial.alphaMap = null;\n\t\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\t\tmaterial.envMapIntensity = 1.0;\n\t\t\tmaterial.refractionRatio = 0.98;\n\t\t\treturn material;\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\n\n\n\tclass GLTFMeshQuantizationExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERPOLATION ********/\n\n\t/*********************************/\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\n\n\tclass GLTFCubicSplineInterpolant extends THREE.Interpolant {\n\n\t\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\t}\n\n\t\tcopySampleValue_( index ) {\n\n\t\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\t\t\tconst result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\t\tconst td = t1 - t0;\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p; // Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tconst _q = new THREE.Quaternion();\n\n\tclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\t\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERNALS ************/\n\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\n\tconst WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\tconst WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\tconst WEBGL_FILTERS = {\n\t\t9728: THREE.NearestFilter,\n\t\t9729: THREE.LinearFilter,\n\t\t9984: THREE.NearestMipmapNearestFilter,\n\t\t9985: THREE.LinearMipmapNearestFilter,\n\t\t9986: THREE.NearestMipmapLinearFilter,\n\t\t9987: THREE.LinearMipmapLinearFilter\n\t};\n\tconst WEBGL_WRAPPINGS = {\n\t\t33071: THREE.ClampToEdgeWrapping,\n\t\t33648: THREE.MirroredRepeatWrapping,\n\t\t10497: THREE.RepeatWrapping\n\t};\n\tconst WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\tconst ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex'\n\t};\n\tconst PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\tconst INTERPOLATION = {\n\t\tCUBICSPLINE: undefined,\n\t\t// We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t// keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: THREE.InterpolateLinear,\n\t\tSTEP: THREE.InterpolateDiscrete\n\t};\n\tconst ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\t/* UTILITY FUNCTIONS */\n\n\tfunction resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return ''; // Host Relative URL\n\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t} // Absolute URL http://,https://,//\n\n\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url; // Data URI\n\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url; // Blob URL\n\n\t\tif ( /^blob:.*$/i.test( url ) ) return url; // Relative URL\n\n\t\treturn path + url;\n\n\t}\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\n\n\n\tfunction createDefaultMaterial( cache ) {\n\n\t\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\t\tcache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( {\n\t\t\t\tcolor: 0xFFFFFF,\n\t\t\t\temissive: 0x000000,\n\t\t\t\tmetalness: 1,\n\t\t\t\troughness: 1,\n\t\t\t\ttransparent: false,\n\t\t\t\tdepthTest: true,\n\t\t\t\tside: THREE.FrontSide\n\t\t\t} );\n\n\t\t}\n\n\t\treturn cache[ 'DefaultMaterial' ];\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\t\tfor ( const name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\n\n\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tlet hasMorphPosition = false;\n\t\tlet hasMorphNormal = false;\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\t\tconst pendingPositionAccessors = [];\n\t\tconst pendingNormalAccessors = [];\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tconst pendingAccessor = target.POSITION !== undefined ? parser.getDependency( 'accessor', target.POSITION ) : geometry.attributes.position;\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tconst pendingAccessor = target.NORMAL !== undefined ? parser.getDependency( 'accessor', target.NORMAL ) : geometry.attributes.normal;\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [ Promise.all( pendingPositionAccessors ), Promise.all( pendingNormalAccessors ) ] ).then( function ( accessors ) {\n\n\t\t\tconst morphPositions = accessors[ 0 ];\n\t\t\tconst morphNormals = accessors[ 1 ];\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\t\tgeometry.morphTargetsRelative = true;\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\n\n\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t} // .extras has user-defined data, so check that .extras.targetNames is an array.\n\n\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tlet geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tlet attributesKey = '';\n\t\tconst keys = Object.keys( attributes ).sort();\n\n\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\tfunction getNormalizedComponentScale( constructor ) {\n\n\t\t// Reference:\n\t\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\t\tswitch ( constructor ) {\n\n\t\t\tcase Int8Array:\n\t\t\t\treturn 1 / 127;\n\n\t\t\tcase Uint8Array:\n\t\t\t\treturn 1 / 255;\n\n\t\t\tcase Int16Array:\n\t\t\t\treturn 1 / 32767;\n\n\t\t\tcase Uint16Array:\n\t\t\t\treturn 1 / 65535;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t\t}\n\n\t}\n\t/* GLTF PARSER */\n\n\n\tclass GLTFParser {\n\n\t\tconstructor( json = {}, options = {} ) {\n\n\t\t\tthis.json = json;\n\t\t\tthis.extensions = {};\n\t\t\tthis.plugins = {};\n\t\t\tthis.options = options; // loader object cache\n\n\t\t\tthis.cache = new GLTFRegistry(); // associations between Three.js objects and glTF elements\n\n\t\t\tthis.associations = new Map(); // THREE.BufferGeometry caching\n\n\t\t\tthis.primitiveCache = {}; // THREE.Object3D instance caches\n\n\t\t\tthis.meshCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.cameraCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.lightCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.textureCache = {}; // Track node names, to ensure no duplicates\n\n\t\t\tthis.nodeNamesUsed = {}; // Use an THREE.ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\t\tif ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) {\n\n\t\t\t\tthis.textureLoader = new THREE.ImageBitmapLoader( this.options.manager );\n\n\t\t\t} else {\n\n\t\t\t\tthis.textureLoader = new THREE.TextureLoader( this.options.manager );\n\n\t\t\t}\n\n\t\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\t\t\tthis.fileLoader = new THREE.FileLoader( this.options.manager );\n\t\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetExtensions( extensions ) {\n\n\t\t\tthis.extensions = extensions;\n\n\t\t}\n\n\t\tsetPlugins( plugins ) {\n\n\t\t\tthis.plugins = plugins;\n\n\t\t}\n\n\t\tparse( onLoad, onError ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions; // Clear the loader cache\n\n\t\t\tthis.cache.removeAll(); // Mark the special nodes/meshes in json for efficient parse\n\n\t\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t\t} );\n\n\t\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\treturn Promise.all( [ parser.getDependencies( 'scene' ), parser.getDependencies( 'animation' ), parser.getDependencies( 'camera' ) ] );\n\n\t\t\t} ).then( function ( dependencies ) {\n\n\t\t\t\tconst result = {\n\t\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\t\tasset: json.asset,\n\t\t\t\t\tparser: parser,\n\t\t\t\t\tuserData: {}\n\t\t\t\t};\n\t\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\t\t\t\tassignExtrasToUserData( result, json );\n\t\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t\t} ) ).then( function () {\n\n\t\t\t\t\tonLoad( result );\n\n\t\t\t\t} );\n\n\t\t\t} ).catch( onError );\n\n\t\t}\n\t\t/**\n   * Marks the special nodes/meshes in json for efficient parse.\n   */\n\n\n\t\t_markDefs() {\n\n\t\t\tconst nodeDefs = this.json.nodes || [];\n\t\t\tconst skinDefs = this.json.skins || [];\n\t\t\tconst meshDefs = this.json.meshes || []; // Nothing in the node definition indicates whether it is a THREE.Bone or an\n\t\t\t// THREE.Object3D. Use the skins' joint references to mark bones.\n\n\t\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t\t}\n\n\t\t\t} // Iterate over all nodes, marking references to shared resources,\n\t\t\t// as well as skeleton joints.\n\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh ); // Nothing in the mesh definition indicates whether it is\n\t\t\t\t\t// a THREE.SkinnedMesh or THREE.Mesh. Use the node's mesh reference\n\t\t\t\t\t// to mark THREE.SkinnedMesh if node has skin.\n\n\n\t\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\t/**\n   * Counts references to shared node / THREE.Object3D resources. These resources\n   * can be reused, or \"instantiated\", at multiple nodes in the scene\n   * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must\n   * be marked. Non-scenegraph resources (like Materials, Geometries, and\n   * Textures) can be reused directly and are not marked here.\n   *\n   * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n   */\n\n\n\t\t_addNodeRef( cache, index ) {\n\n\t\t\tif ( index === undefined ) return;\n\n\t\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t\t}\n\n\t\t\tcache.refs[ index ] ++;\n\n\t\t}\n\t\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\n\n\t\t_getNodeRef( cache, index, object ) {\n\n\t\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\t\t\tconst ref = object.clone();\n\t\t\tref.name += '_instance_' + cache.uses[ index ] ++;\n\t\t\treturn ref;\n\n\t\t}\n\n\t\t_invokeOne( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.push( this );\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) return result;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_invokeAll( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.unshift( this );\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) pending.push( result );\n\n\t\t\t}\n\n\t\t\treturn pending;\n\n\t\t}\n\t\t/**\n   * Requests the specified dependency asynchronously, with caching.\n   * @param {string} type\n   * @param {number} index\n   * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n   */\n\n\n\t\tgetDependency( type, index ) {\n\n\t\t\tconst cacheKey = type + ':' + index;\n\t\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\t\tif ( ! dependency ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'scene':\n\t\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mesh':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'accessor':\n\t\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bufferView':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'buffer':\n\t\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'material':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skin':\n\t\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'animation':\n\t\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'camera':\n\t\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t\t}\n\n\t\t\treturn dependency;\n\n\t\t}\n\t\t/**\n   * Requests all dependencies of the specified type asynchronously, with caching.\n   * @param {string} type\n   * @return {Promise<Array<Object>>}\n   */\n\n\n\t\tgetDependencies( type ) {\n\n\t\t\tlet dependencies = this.cache.get( type );\n\n\t\t\tif ( ! dependencies ) {\n\n\t\t\t\tconst parser = this;\n\t\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\t\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t\t} ) );\n\t\t\t\tthis.cache.add( type, dependencies );\n\n\t\t\t}\n\n\t\t\treturn dependencies;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBuffer( bufferIndex ) {\n\n\t\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\t\tconst loader = this.fileLoader;\n\n\t\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t\t} // If present, GLB container is required to be the first buffer.\n\n\n\t\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t\t}\n\n\t\t\tconst options = this.options;\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tloader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferViewIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBufferView( bufferViewIndex ) {\n\n\t\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\t\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n   * @param {number} accessorIndex\n   * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n   */\n\n\n\t\tloadAccessor( accessorIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t\t// compression extension).\n\t\t\t\treturn Promise.resolve( null );\n\n\t\t\t}\n\n\t\t\tconst pendingBufferViews = [];\n\n\t\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t\t} else {\n\n\t\t\t\tpendingBufferViews.push( null );\n\n\t\t\t}\n\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\t\tconst bufferView = bufferViews[ 0 ];\n\t\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\n\t\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\t\tlet array, bufferAttribute; // The buffer is not interleaved if the stride is the item size in bytes.\n\n\t\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own THREE.InterleavedBuffer\n\t\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); // Integer parameters to IB/IBA are in array elements, not bytes.\n\n\t\t\t\t\t\tib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );\n\t\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset % byteStride / elementBytes, normalized );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized );\n\n\t\t\t\t} // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\n\n\t\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\t\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\t\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst index = sparseIndices[ i ];\n\t\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn bufferAttribute;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n   * @param {number} textureIndex\n   * @return {Promise<THREE.Texture>}\n   */\n\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst source = json.images[ textureDef.source ];\n\t\t\tlet loader = this.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t\tloadTextureImage( textureIndex, source, loader ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler;\n\n\t\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t\t}\n\n\t\t\tconst URL = self.URL || self.webkitURL;\n\t\t\tlet sourceURI = source.uri || '';\n\t\t\tlet isObjectURL = false;\n\t\t\tlet hasAlpha = true;\n\t\t\tconst isJPEG = sourceURI.search( /\\.jpe?g($|\\?)/i ) > 0 || sourceURI.search( /^data\\:image\\/jpeg/ ) === 0;\n\t\t\tif ( source.mimeType === 'image/jpeg' || isJPEG ) hasAlpha = false;\n\n\t\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t\t// Load binary image data from bufferView, if provided.\n\t\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\t\tif ( source.mimeType === 'image/png' ) {\n\n\t\t\t\t\t\t// Inspect the PNG 'IHDR' chunk to determine whether the image could have an\n\t\t\t\t\t\t// alpha channel. This check is conservative — the image could have an alpha\n\t\t\t\t\t\t// channel with all values == 1, and the indexed type (colorType == 3) only\n\t\t\t\t\t\t// sometimes contains alpha.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n\t\t\t\t\t\tconst colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false );\n\t\t\t\t\t\thasAlpha = colorType === 6 || colorType === 4 || colorType === 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisObjectURL = true;\n\t\t\t\t\tconst blob = new Blob( [ bufferView ], {\n\t\t\t\t\t\ttype: source.mimeType\n\t\t\t\t\t} );\n\t\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\t\treturn sourceURI;\n\n\t\t\t\t} );\n\n\t\t\t} else if ( source.uri === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' );\n\n\t\t\t}\n\n\t\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\t\tconst texture = new THREE.Texture( imageBitmap );\n\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tloader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( texture ) {\n\n\t\t\t\t// Clean up resources and configure THREE.Texture.\n\t\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.flipY = false;\n\t\t\t\tif ( textureDef.name ) texture.name = textureDef.name; // When there is definitely no alpha channel in the texture, set THREE.RGBFormat to save space.\n\n\t\t\t\tif ( ! hasAlpha ) texture.format = THREE.RGBFormat;\n\t\t\t\tconst samplers = json.samplers || {};\n\t\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\t\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;\n\t\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter;\n\t\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;\n\t\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;\n\t\t\t\tparser.associations.set( texture, {\n\t\t\t\t\ttype: 'textures',\n\t\t\t\t\tindex: textureIndex\n\t\t\t\t} );\n\t\t\t\treturn texture;\n\n\t\t\t} ).catch( function () {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\t\treturn null;\n\n\t\t\t} );\n\t\t\tthis.textureCache[ cacheKey ] = promise;\n\t\t\treturn promise;\n\n\t\t}\n\t\t/**\n   * Asynchronously assigns a texture to the given material parameters.\n   * @param {Object} materialParams\n   * @param {string} mapName\n   * @param {Object} mapDef\n   * @return {Promise<Texture>}\n   */\n\n\n\t\tassignTexture( materialParams, mapName, mapDef ) {\n\n\t\t\tconst parser = this;\n\t\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\t\tif ( transform ) {\n\n\t\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams[ mapName ] = texture;\n\t\t\t\treturn texture;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance\n   * already has a material (generated from the glTF material options alone)\n   * but reuse of the same glTF material may require multiple threejs materials\n   * to accommodate different primitive types, defines, etc. New materials will\n   * be created if necessary, and reused from a cache.\n   * @param  {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance.\n   */\n\n\n\t\tassignFinalMaterial( mesh ) {\n\n\t\t\tconst geometry = mesh.geometry;\n\t\t\tlet material = mesh.material;\n\t\t\tconst useVertexTangents = geometry.attributes.tangent !== undefined;\n\t\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\t\tif ( mesh.isPoints ) {\n\n\t\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\t\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\t\tpointsMaterial = new THREE.PointsMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( pointsMaterial, material );\n\t\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = pointsMaterial;\n\n\t\t\t} else if ( mesh.isLine ) {\n\n\t\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\t\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\t\tlineMaterial = new THREE.LineBasicMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( lineMaterial, material );\n\t\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = lineMaterial;\n\n\t\t\t} // Clone the material if it will be modified\n\n\n\t\t\tif ( useVertexTangents || useVertexColors || useFlatShading ) {\n\n\t\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\t\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\t\tif ( useVertexTangents ) cacheKey += 'vertex-tangents:';\n\t\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\t\tcachedMaterial = material.clone();\n\t\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\t\tif ( useVertexTangents ) {\n\n\t\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\t\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = cachedMaterial;\n\n\t\t\t} // workarounds for mesh and geometry\n\n\n\t\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t\t}\n\n\t\t\tmesh.material = material;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshStandardMaterial;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n   * @param {number} materialIndex\n   * @return {Promise<Material>}\n   */\n\n\n\t\tloadMaterial( materialIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst materialDef = json.materials[ materialIndex ];\n\t\t\tlet materialType;\n\t\t\tconst materialParams = {};\n\t\t\tconst materialExtensions = materialDef.extensions || {};\n\t\t\tconst pending = [];\n\n\t\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\t\tconst sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else {\n\n\t\t\t\t// Specification:\n\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\t\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\t\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t\t} );\n\t\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t\t} ) ) );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\t\tmaterialParams.side = THREE.DoubleSide;\n\n\t\t\t}\n\n\t\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\t\tmaterialParams.transparent = true; // See: https://github.com/mrdoob/three.js/issues/17706\n\n\t\t\t\tmaterialParams.depthWrite = false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterialParams.format = THREE.RGBFormat;\n\t\t\t\tmaterialParams.transparent = false;\n\n\t\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\n\t\t\t\tmaterialParams.normalScale = new THREE.Vector2( 1, - 1 );\n\n\t\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\t\tmaterialParams.normalScale.set( materialDef.normalTexture.scale, - materialDef.normalTexture.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tmaterialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\tlet material;\n\n\t\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t\t}\n\n\t\t\t\tif ( materialDef.name ) material.name = materialDef.name; // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\n\t\t\t\tif ( material.map ) material.map.encoding = THREE.sRGBEncoding;\n\t\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\t\tassignExtrasToUserData( material, materialDef );\n\t\t\t\tparser.associations.set( material, {\n\t\t\t\t\ttype: 'materials',\n\t\t\t\t\tindex: materialIndex\n\t\t\t\t} );\n\t\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\t\t\t\treturn material;\n\n\t\t\t} );\n\n\t\t}\n\t\t/** When THREE.Object3D instances are targeted by animation, they need unique names. */\n\n\n\t\tcreateUniqueName( originalName ) {\n\n\t\t\tconst sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' );\n\t\t\tlet name = sanitizedName;\n\n\t\t\tfor ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\t\tname = sanitizedName + '_' + i;\n\n\t\t\t}\n\n\t\t\tthis.nodeNamesUsed[ name ] = true;\n\t\t\treturn name;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n   *\n   * Creates BufferGeometries from primitives.\n   *\n   * @param {Array<GLTF.Primitive>} primitives\n   * @return {Promise<Array<BufferGeometry>>}\n   */\n\n\n\t\tloadGeometries( primitives ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst cache = this.primitiveCache;\n\n\t\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ].decodePrimitive( primitive, parser ).then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst primitive = primitives[ i ];\n\t\t\t\tconst cacheKey = createPrimitiveKey( primitive ); // See if we've already created this geometry\n\n\t\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\t\tif ( cached ) {\n\n\t\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\t\tpending.push( cached.promise );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet geometryPromise;\n\n\t\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser );\n\n\t\t\t\t\t} // Cache this geometry\n\n\n\t\t\t\t\tcache[ cacheKey ] = {\n\t\t\t\t\t\tprimitive: primitive,\n\t\t\t\t\t\tpromise: geometryPromise\n\t\t\t\t\t};\n\t\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n   * @param {number} meshIndex\n   * @return {Promise<Group|Mesh|SkinnedMesh>}\n   */\n\n\n\t\tloadMesh( meshIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\t\tconst primitives = meshDef.primitives;\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst material = primitives[ i ].material === undefined ? createDefaultMaterial( this.cache ) : this.getDependency( 'material', primitives[ i ].material );\n\t\t\t\tpending.push( material );\n\n\t\t\t}\n\n\t\t\tpending.push( parser.loadGeometries( primitives ) );\n\t\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\t\tconst geometries = results[ results.length - 1 ];\n\t\t\t\tconst meshes = [];\n\n\t\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\t\tconst primitive = primitives[ i ]; // 1. create THREE.Mesh\n\n\t\t\t\t\tlet mesh;\n\t\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined ) {\n\n\t\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh( geometry, material ) : new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode );\n\n\t\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\t\tmesh = new THREE.Line( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineLoop( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( geometry, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || 'mesh_' + meshIndex );\n\t\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\t\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\t\t\t\t\tparser.assignFinalMaterial( mesh );\n\t\t\t\t\tmeshes.push( mesh );\n\n\t\t\t\t}\n\n\t\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst group = new THREE.Group();\n\n\t\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn group;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n   * @param {number} cameraIndex\n   * @return {Promise<THREE.Camera>}\n   */\n\n\n\t\tloadCamera( cameraIndex ) {\n\n\t\t\tlet camera;\n\t\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\t\tif ( ! params ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\t\tcamera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\t\tcamera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\t\t\tassignExtrasToUserData( camera, cameraDef );\n\t\t\treturn Promise.resolve( camera );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n   * @param {number} skinIndex\n   * @return {Promise<Object>}\n   */\n\n\n\t\tloadSkin( skinIndex ) {\n\n\t\t\tconst skinDef = this.json.skins[ skinIndex ];\n\t\t\tconst skinEntry = {\n\t\t\t\tjoints: skinDef.joints\n\t\t\t};\n\n\t\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t\t}\n\n\t\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\t\tskinEntry.inverseBindMatrices = accessor;\n\t\t\t\treturn skinEntry;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n   * @param {number} animationIndex\n   * @return {Promise<AnimationClip>}\n   */\n\n\n\t\tloadAnimation( animationIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst animationDef = json.animations[ animationIndex ];\n\t\t\tconst pendingNodes = [];\n\t\t\tconst pendingInputAccessors = [];\n\t\t\tconst pendingOutputAccessors = [];\n\t\t\tconst pendingSamplers = [];\n\t\t\tconst pendingTargets = [];\n\n\t\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\t\tconst target = channel.target;\n\t\t\t\tconst name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\n\t\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\t\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\t\tpendingSamplers.push( sampler );\n\t\t\t\tpendingTargets.push( target );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( [ Promise.all( pendingNodes ), Promise.all( pendingInputAccessors ), Promise.all( pendingOutputAccessors ), Promise.all( pendingSamplers ), Promise.all( pendingTargets ) ] ).then( function ( dependencies ) {\n\n\t\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\t\tconst targets = dependencies[ 4 ];\n\t\t\t\tconst tracks = [];\n\n\t\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst node = nodes[ i ];\n\t\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\t\tconst target = targets[ i ];\n\t\t\t\t\tif ( node === undefined ) continue;\n\t\t\t\t\tnode.updateMatrix();\n\t\t\t\t\tnode.matrixAutoUpdate = true;\n\t\t\t\t\tlet TypedKeyframeTrack;\n\n\t\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.NumberKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.QuaternionKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.VectorKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\t\t\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;\n\t\t\t\t\tconst targetNames = [];\n\n\t\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t\t// Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh.\n\t\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputArray = outputAccessor.array;\n\n\t\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\t\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst track = new TypedKeyframeTrack( targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], inputAccessor.array, outputArray, interpolation ); // Override interpolation with custom factory method.\n\n\t\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\t\t\t\t\t\t\t\tconst interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\t\t\t\t\t\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t\t}; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\n\n\t\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\t\t\t\treturn new THREE.AnimationClip( name, undefined, tracks );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tcreateNodeMesh( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tif ( nodeDef.mesh === undefined ) return null;\n\t\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); // if weights are provided on the node, override weights on the mesh.\n\n\n\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n   * @param {number} nodeIndex\n   * @return {Promise<Object3D>}\n   */\n\n\n\t\tloadNode( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ]; // reserve node's name before its dependencies, so the root has the intended name.\n\n\t\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\t\t\treturn function () {\n\n\t\t\t\tconst pending = [];\n\n\t\t\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( meshPromise ) {\n\n\t\t\t\t\tpending.push( meshPromise );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t\t} ) );\n\n\t\t\t\t}\n\n\t\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\t\tpending.push( promise );\n\n\t\t\t\t} );\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t}().then( function ( objects ) {\n\n\t\t\t\tlet node; // .isBone isn't in glTF spec. See ._markDefs\n\n\t\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\t\tnode = new THREE.Bone();\n\n\t\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\t\tnode = new THREE.Group();\n\n\t\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode = new THREE.Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\t\tnode.name = nodeName;\n\n\t\t\t\t}\n\n\t\t\t\tassignExtrasToUserData( node, nodeDef );\n\t\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\t\tconst matrix = new THREE.Matrix4();\n\t\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tparser.associations.set( node, {\n\t\t\t\t\ttype: 'nodes',\n\t\t\t\t\tindex: nodeIndex\n\t\t\t\t} );\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n   * @param {number} sceneIndex\n   * @return {Promise<Group>}\n   */\n\n\n\t\tloadScene( sceneIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tconst parser = this; // THREE.Loader returns THREE.Group, not Scene.\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\n\t\t\tconst scene = new THREE.Group();\n\t\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\t\t\tconst nodeIds = sceneDef.nodes || [];\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tfunction buildNodeHierachy( nodeId, parentObject, json, parser ) {\n\n\t\tconst nodeDef = json.nodes[ nodeId ];\n\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\tif ( nodeDef.skin === undefined ) return node; // build skeleton here as well\n\n\t\t\tlet skinEntry;\n\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\tskinEntry = skin;\n\t\t\t\tconst pendingJoints = [];\n\n\t\t\t\tfor ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isMesh ) return;\n\t\t\t\t\tconst bones = [];\n\t\t\t\t\tconst boneInverses = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\tbones.push( jointNode );\n\t\t\t\t\t\t\tconst mat = new THREE.Matrix4();\n\n\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t} );\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t} ).then( function ( node ) {\n\n\t\t\t// build node hierachy\n\t\t\tparentObject.add( node );\n\t\t\tconst pending = [];\n\n\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\tconst children = nodeDef.children;\n\n\t\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst child = children[ i ];\n\t\t\t\t\tpending.push( buildNodeHierachy( child, node, json, parser ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\n\n\n\tfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst box = new THREE.Box3();\n\n\t\tif ( attributes.POSITION !== undefined ) {\n\n\t\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\t\t\tconst min = accessor.min;\n\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\tbox.set( new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) );\n\n\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst targets = primitiveDef.targets;\n\n\t\tif ( targets !== undefined ) {\n\n\t\t\tconst maxDisplacement = new THREE.Vector3();\n\t\t\tconst vector = new THREE.Vector3();\n\n\t\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\t\tconst min = accessor.min;\n\t\t\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\t\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t\t} // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\n\n\t\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\n\n\t\t\tbox.expandByVector( maxDisplacement );\n\n\t\t}\n\n\t\tgeometry.boundingBox = box;\n\t\tconst sphere = new THREE.Sphere();\n\t\tbox.getCenter( sphere.center );\n\t\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\t\tgeometry.boundingSphere = sphere;\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfor ( const gltfAttributeName in attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); // Skip attributes already provided by e.g. Draco extension.\n\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\t\tcomputeBounds( geometry, primitiveDef, parser );\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {Number} drawMode\n * @return {BufferGeometry}\n */\n\n\n\tfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\t\tlet index = geometry.getIndex(); // generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t} //\n\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === THREE.TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( newIndices.length / 3 !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t} // build final geometry\n\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\treturn newGeometry;\n\n\t}\n\n\tTHREE.GLTFLoader = GLTFLoader;\n\n} )();\n\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/defer.ts",
    "content": "let deferred: (()=>void)[] = [];\n\n// Runs a lambda when the plugin is unloaded\nexport function defer(lambda: ()=>void) {\n    deferred.push(lambda);\n}\n\n// Deletes a Deletable when the plugin is unloaded\nexport function deferDelete<T extends Deletable>(deletable: T): T {\n    defer(() => deletable.delete());\n    return deletable;\n}\n\n// Call this when the plugin is unloaded\nexport function runDeferred() {\n    for (let lambda of deferred.reverse())\n        lambda();\n}\n\n// Removes a HTML element once the plugin is unloaded\nexport function deferRemoveElement(element: HTMLElement): HTMLElement {\n    defer(() => element.parentElement?.removeChild(element));\n    return element;\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/global.d.ts",
    "content": "import 'blockbench-types';\nimport * as THREE_ from 'three';\n\ndeclare global {\n    \n    type BBAnimation = _Animation;\n\n    // Fix THREE\n    declare namespace THREE {\n        export type * from 'three';\n    }\n    const THREE: typeof THREE_;\n\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/import_gltf.ts",
    "content": "import { GLTF, parseGltf } from './parse_gltf';\nimport { arrayEquals, eulerDegreesFromQuat, imageBitmapToDataUri, modulo, valuesAndIndices } from './util';\nimport { VectorHashMap } from './vector_hash_map';\n\nexport type ImportOptions = {\n    file: Filesystem.FileResult,\n    scale:        number,\n    groups:       boolean,\n    cameras:      boolean|'NOT_INSTALLED',\n    animations:   boolean,\n    mergeQuads:   boolean,\n    undoable:     boolean,\n    selectResult: boolean,\n};\n\nexport type ImportedContent = {\n    // Used for undo system\n    groups:     Group[],\n    elements:   OutlinerElement[],\n    textures:   Texture[],\n    animations: BBAnimation[],\n    // Used for displaying warnings\n    uvOutOfBounds:         boolean,\n    usesRepeatingWrapMode: boolean,\n    unsupportedArmatures:  boolean,\n    // To keep track of which THREE texture corresponds to which Blockbench texture\n    texturesById: {[textureId: string]: Texture|null};\n    // Each THREE texture's cache key, containing source information\n    textureCacheKeys: {[textureId: string]: string};\n};\n\n\n// MARK: 🟥 gltf\nexport async function importGltf(options: ImportOptions): Promise<ImportedContent|'UNSUPPORTED_CAMERAS'> {\n\n    // TODO: cameras!\n    // TODO: animations!\n    // TODO: armatures!\n\n    let gltf = await parseGltf(options.file);\n\n    // console.log('gltf', gltf); // TODO: remove\n\n    // Stop early if cameras are enabled, but not installed, and the model does include cameras\n    if (options.cameras === 'NOT_INSTALLED' && gltf.cameras.length !== 0)\n        return 'UNSUPPORTED_CAMERAS';\n\n    // Keep track of all the things we importeNd\n    let content: ImportedContent = {\n        groups:     [],\n        elements:   [],\n        textures:   [],\n        animations: [],\n        uvOutOfBounds:         false,\n        usesRepeatingWrapMode: false,\n        unsupportedArmatures:  false,\n        texturesById: {},\n        textureCacheKeys: await prepareTextureCacheKeys(gltf),\n    };\n\n    if (options.undoable) {\n        let rootGroup = Outliner.root.find(n => n instanceof Group);\n        Undo.initEdit({\n            outliner: true,\n            selection: true,\n            group: rootGroup,\n            elements: content.elements,\n            textures: content.textures,\n            animations: content.animations,\n        });\n    }\n\n    // Navigate node tree and import what we find\n    let sceneRoot = gltf.scene as unknown as THREE.Group;\n    importNode(sceneRoot, options, content);\n\n    // Check if any samplers use the repeating wrap mode\n    content.usesRepeatingWrapMode = gltf.parser.json.samplers?.some((s: any) =>\n        s.wrapS == undefined || s.wrapT == undefined || s.wrapS === 10497 || s.wrapT === 10497 )\n        ?? false;\n\n    // Select all the elements we imported\n    if (options.selectResult) {\n        Outliner.selected.empty();\n        Outliner.selected.push(...content.elements);\n        Group.all.forEach(g => g.unselect());\n        content.groups.forEach(g => g.multiSelect());\n    }\n\n    if (options.undoable)\n        Undo.finishEdit('Import glTF');\n\n    return content;\n}\n\n// MARK: 🟥 node\nfunction importNode(node: THREE.Object3D, options: ImportOptions, content: ImportedContent): Group|Mesh|null {\n    switch (node.type) {\n        case 'Group':\n            // If this is not the root, it's representing one mesh with multiple primitives\n            if (node.parent != undefined)\n                return importMeshPrimitives(node as THREE.Group, node.children as THREE.Mesh[], options, content);\n            // else it's the root, treat as group\n            // fall through...\n        case 'Object3D':\n            return importGroup(node, options, content);\n        case 'Mesh':\n        case 'SkinnedMesh':\n            return importSingleMesh(node as THREE.Mesh, options, content);\n        default:\n            console.warn(`[gltf_importer]: Skipping unknown node type \"${node.type}\"`);\n            return null;\n    }\n}\n\n// MARK: 🟥 group\nfunction importGroup(node: THREE.Object3D, options: ImportOptions, content: ImportedContent): Group|null {\n    let isRoot = node.parent == undefined;\n    let group: Group|null = null;\n\n    // Only create outliner group if the option is enabled and if the current node is not the root\n    if (options.groups && !isRoot) {\n        group = new Group({\n            name: node.userData.name || node.name || 'group',\n            origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(),\n            rotation: eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray() as ArrayVector3,\n        });\n        group.init();\n        group.createUniqueName();\n        group.openUp();\n        content.groups.push(group);\n    }\n\n    // Child nodes\n    for (let child of node.children) {\n        let result = importNode(child, options, content);\n        result?.addTo(group ?? 'root');\n    }\n    \n    return group;\n}\n\n// MARK: 🟥 mesh\n\nfunction importSingleMesh(node: THREE.Mesh, options: ImportOptions, content: ImportedContent): Mesh {\n    return importMeshPrimitives(node, [node], options, content);\n}\n\n// Meshes in glTFs are made of one or more primitives which can have different materials\n// THREE.js turns this into a Group with multiple meshes\n// In Blockbench we would like this to be one mesh again, and just set the different textures on the faces\n// We also de-duplicate vertices across primitives\nfunction importMeshPrimitives(node: THREE.Object3D, primitives: THREE.Mesh[], options: ImportOptions, content: ImportedContent): Mesh {\n\n    // Take info like name and origin from the encompassing group\n    let mesh = new Mesh({\n        name: node.userData.name || node.name || 'mesh',\n        origin: node.getWorldPosition(new THREE.Vector3()).multiplyScalar(options.scale).toArray(),\n        rotation:  eulerDegreesFromQuat(node.getWorldQuaternion(new THREE.Quaternion())).toArray() as ArrayVector3,\n        vertices: {},\n    });\n    content.elements.push(mesh);\n\n    let scale = node.getWorldScale(new THREE.Vector3()).multiplyScalar(options.scale);\n\n    // Lookup of primitive to texture\n    let primitiveTextures = primitives.map(p => importTexture((p.material as any), options, content));\n\n    // Potentially confusing terms:\n    // Original Vertex:      Vertex from incoming glTF vertex buffer\n    // Unique Vertex:        Vertex with unique position, to be used for the Blockbench mesh result\n    // Vertex Index/Indices: Index of a vertex, either from the vertex buffer, or in the unique vertices list\n    // Unique Vertex Key:    The string key that Blockbench came up with for a *unique* vertex\n\n    // Unique vertex positions\n    let uniqueVertices: ArrayVector3[] = [];\n    // Hash map of position to index into uniqueVertices\n    // i.e. uniqueVertexIndices.get([x,y,z]) -> index into uniqueVertices\n    let uniqueVertexIndices = new VectorHashMap<ArrayVector3, number>();\n    // Lookup of primitive's original vertex index to index into uniqueVertices\n    // i.e. primitiveToUniqueVertexIndices[primitiveIndex][vertexIndex] -> index into uniqueVertices\n    let primitiveToUniqueVertexIndices: number[][] = [];\n\n    // TODO: also de-duplicate on vertex weights! Probably make the key [x,y,z, bone0,... weight0...]\n\n    // De-duplicate, scale and merge primitives\n    for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) {\n        primitiveToUniqueVertexIndices[primitiveIndex] = [];\n\n        for (let vertexIndex = 0; vertexIndex < primitive.geometry.attributes.position.count; vertexIndex++ ) {\n            let x = primitive.geometry.attributes.position.array[vertexIndex*3];\n            let y = primitive.geometry.attributes.position.array[vertexIndex*3 + 1];\n            let z = primitive.geometry.attributes.position.array[vertexIndex*3 + 2];\n\n            // Apply scale\n            let vertex: ArrayVector3 = [\n                x * scale.x,\n                y * scale.y,\n                z * scale.z,\n            ];\n\n            // If this is a new position, add it to unique vertices\n            if (!uniqueVertexIndices.has(vertex)) {\n                let newUniqueVertexIndex = uniqueVertices.push(vertex) - 1;\n                uniqueVertexIndices.set(vertex, newUniqueVertexIndex);\n            }\n\n            // Remember the unique vertex index for the original vertex index into this primitive\n            primitiveToUniqueVertexIndices[primitiveIndex].push(uniqueVertexIndices.get(vertex)!);\n        }\n    }\n\n    // Blockbench seems to like to reorder vertices randomly if we give it vertices with Mesh.addVertices()\n    // So we create vertex keys and add them ourselves\n    let vertexKeys = Array.from({ length: uniqueVertices.length }, () => bbuid(4));\n    mesh.vertices = Object.fromEntries(uniqueVertices.map((v,i) => [vertexKeys[i], v]));\n    let faces: MeshFace[] = [];\n\n    // TODO: auto uv if not present somehow?\n    \n    // Construct faces by using the primitive's original vertex index to look up UV and unique vertex key\n    for (let [primitive, primitiveIndex] of valuesAndIndices(primitives)) {\n        if (primitive.geometry.index == undefined)\n            continue; // I guess indices are optional? seems weird\n\n        for (let faceIndex = 0; faceIndex < primitive.geometry.index.count/3; faceIndex++ ) {\n            let texture = primitiveTextures[primitiveIndex];\n            let uvWidth  = texture?.uv_width  ?? Project?.texture_width  ?? 16;\n            let uvHeight = texture?.uv_height ?? Project?.texture_height ?? 16;\n            let v1Uv: ArrayVector2, v2Uv: ArrayVector2, v3Uv: ArrayVector2;\n            \n            // Original vertex index\n            let v1Idx = primitive.geometry.index.array[faceIndex*3];\n            let v2Idx = primitive.geometry.index.array[faceIndex*3 + 1];\n            let v3Idx = primitive.geometry.index.array[faceIndex*3 + 2];\n            // Unique vertex keys\n            let v1Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v1Idx]];\n            let v2Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v2Idx]];\n            let v3Key = vertexKeys[primitiveToUniqueVertexIndices[primitiveIndex][v3Idx]];\n            let faceVertexKeys = [v1Key, v2Key, v3Key]\n\n            // UV (optional apparently)\n            if (primitive.geometry.attributes.uv != undefined) {\n                let uvComponents = primitive.geometry.attributes.uv.array;\n                v1Uv = [ uvComponents[v1Idx*2] , uvComponents[v1Idx*2 + 1] ];\n                v2Uv = [ uvComponents[v2Idx*2] , uvComponents[v2Idx*2 + 1] ];\n                v3Uv = [ uvComponents[v3Idx*2] , uvComponents[v3Idx*2 + 1] ];\n            } else {\n                // TODO: this currently doesn't allow for merging into quad\n                // maybe fill missing uvs after creating primitive\n                // then the quads are already created\n                // or find Blockbench auto uv function\n                v1Uv = [0,0];\n                v2Uv = [1,0];\n                v3Uv = [0,1];\n            }\n            let v1UvScaled: ArrayVector2 = [ v1Uv[0] * uvWidth, v1Uv[1] * uvHeight ];\n            let v2UvScaled: ArrayVector2 = [ v2Uv[0] * uvWidth, v2Uv[1] * uvHeight ];\n            let v3UvScaled: ArrayVector2 = [ v3Uv[0] * uvWidth, v3Uv[1] * uvHeight ];\n            let uv = {\n                [v1Key]: v1UvScaled,\n                [v2Key]: v2UvScaled,\n                [v3Key]: v3UvScaled,\n            };\n\n            // Remember whether any UV component is outside 0..1\n            content.uvOutOfBounds ||= [ ...v1Uv, ...v2Uv, ...v3Uv ].some(x => x < 0 || x > 1);\n\n            // TODO: Improvement for quad merging:\n            // Currently we only merge quads of subsequent faces.\n            // We could allow non-subsequent faces by having a map of\n            // vertex keys to faces that use that vertex key.\n            // Then for any triangle, we look up all the faces that use any of its vertices\n            // to get a set of candidate triangles for merging into a quad\n\n            // TODO: the option to merge quads is currently commented out in the import form\n            // Try merging into quad with previous face\n            let facesMergedIntoQuad = options.mergeQuads && (() => {\n                if (faces.length < 1)\n                    return false; // Can't be first face\n                \n                let lastFace = faces[faces.length - 1];\n                if (lastFace.vertices.length !== 3)\n                    return false; // Previous face must be a tri\n                // because Blockbench doesn't support n-gons\n\n                let nonSharedVertexKeys: string[] = [];\n                let sharedVertexKeys: string[] = [];\n                for (let vertKey of lastFace.vertices)\n                    (faceVertexKeys.includes(vertKey) ? sharedVertexKeys : nonSharedVertexKeys).push(vertKey);\n\n                if (sharedVertexKeys.length !== 2 || nonSharedVertexKeys.length !== 1)\n                    return false; // Faces must share exactly 2 vertices\n\n                if (sharedVertexKeys.some(vk => !arrayEquals(uv[vk], lastFace.uv[vk])))\n                    return false; // UVs of shared vertices must be identical\n\n                let face1VertAafterB = (   faceVertexKeys.indexOf(sharedVertexKeys[0]) + 1) % 3 ===    faceVertexKeys.indexOf(sharedVertexKeys[1]);\n                let face2VertAafterB = (lastFace.vertices.indexOf(sharedVertexKeys[0]) + 1) % 3 === lastFace.vertices.indexOf(sharedVertexKeys[1]);\n                if (face1VertAafterB === face2VertAafterB)\n                    return false; // The order of the shared vertices should be reversed\n                \n                let newVertexKey = nonSharedVertexKeys[0];\n\n                // TODO:\n                // Validate normals are (roughly) the same (coplanar)\n                // by finding the first face's normal and projecting the new vertex onto it (dot product)\n                // If the resulting projected length is greater than 0, the two faces are not coplanar\n\n                // TODO: consider checking rough shape, could eliminate n-gon fans\n                // TODO: if a third triangle in a row is connect, maybe consider it an n-gon fan and dont merge?\n\n                // Find where in the last face to insert the new vertex\n                let face2VertBeforeNewVert = faceVertexKeys[modulo(faceVertexKeys.indexOf(newVertexKey) - 1, 3)];\n                let face1VertBeforeNewVertIndex = lastFace.vertices.indexOf(face2VertBeforeNewVert);\n\n                // Expand previous face into quad\n                lastFace.vertices.splice(face1VertBeforeNewVertIndex, 0, newVertexKey);\n                lastFace.uv[newVertexKey] = uv[newVertexKey];\n\n                return true;\n            })();\n\n            // If not quad, create new face\n            if (!facesMergedIntoQuad) {\n                faces.push(new MeshFace(mesh, {\n                    vertices: faceVertexKeys,\n                    uv: uv,\n                    texture: texture,\n                }));\n            }\n        }\n    }\n\n    mesh.addFaces(...faces);\n    mesh.init();\n\n    return mesh;\n}\n\n// MARK: 🟥 textures\nasync function prepareTextureCacheKeys(gltf: GLTF): Promise<{[textureId: string]: string}> {\n    \n    // The GLTF loader's internal texture cache holds information \n    // on texture's sources inside the cache keys\n    // We extract these keys so we can later use it to load the textures ourselves\n    let textureCache = (gltf.parser as any).textureCache as {[textureCacheKey: string]: Promise<THREE.Texture>};\n\n    // Await all the texture promises\n    let textures = await Promise.all(Object.values(textureCache));\n    \n    // Strip suffix (probably the sampler index or something, don't care)\n    let cacheKeys = Object.keys(textureCache).map(key => key.substring(0, key.lastIndexOf(':')));\n\n    let textureCacheKeys = Object.fromEntries(cacheKeys.map((key, i) => [textures[i].uuid, key]));\n    return textureCacheKeys;\n}\n\nfunction importTexture(threeMaterial: THREE.MeshStandardMaterial|undefined, options: ImportOptions, content: ImportedContent): Texture|undefined {\n    let threeTexture = threeMaterial?.map;\n\n    // No texture\n    if (threeTexture == undefined)\n        return undefined;\n\n    // Already imported\n    if (content.texturesById[threeTexture.uuid] !== undefined) {\n        let bbTexture = content.texturesById[threeTexture.uuid] ?? undefined;\n        // Make double-sided if necesary\n        if (threeMaterial?.side !== THREE.FrontSide && bbTexture != undefined)\n            bbTexture.render_sides = 'double';\n        return bbTexture;\n    }\n\n    let cacheKey = content.textureCacheKeys[threeTexture.uuid];\n    let bbTexture: Texture|null = null;\n\n    // No cache key means no texture\n    if (cacheKey == undefined) {\n\n    // If the cache key is a number, that means the texture is embedded in a buffer\n    } else if (isStringNumber(cacheKey)) {\n        if (!(threeTexture.image instanceof ImageBitmap)) {\n            console.warn('Imported texture has unknown format: ', threeTexture.image);\n        } else {\n            let dataUri = imageBitmapToDataUri(threeTexture.image, 'image/png', 1);\n            bbTexture = new Texture().fromDataURL(dataUri);\n        }\n\n    // Embededd data uri\n    } else if (cacheKey.startsWith('data:')) {\n        bbTexture = new Texture().fromDataURL(cacheKey);\n\n    // Otherwise the texture is from a file\n    } else {\n        let absoluteTexturePath = PathModule.join(PathModule.dirname(options.file.path), cacheKey);\n        bbTexture = new Texture().fromPath(absoluteTexturePath);\n    }\n    // TODO: are we sure it cant still be some other stupid thing?\n\n    if (bbTexture != undefined) {\n        bbTexture.name = threeTexture.name || 'texture',\n        bbTexture.add(false);\n        content.textures.push(bbTexture);\n\n        // Make double-sided if necesary\n        if (threeMaterial?.side !== THREE.FrontSide && bbTexture != undefined)\n            bbTexture.render_sides = 'double';\n    }\n\n    content.texturesById[threeTexture.uuid] = bbTexture;\n\n    return bbTexture ?? undefined;\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/parse_gltf.ts",
    "content": "// Import ONLY the types\nimport type { GLTFLoader as _GLTFLoader, GLTF as _GLTF } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\n// Import the actual loader, unless something else already did\nif (THREE['GLTFLoader'] == undefined)\n    require('./GLTFLoader.js');\n\ntype GLTFLoaderConstructor = { new (loadingManager: THREE.LoadingManager|undefined): GLTFLoader; };\n\nexport type GLTFLoader = _GLTFLoader;\nexport type GLTF = _GLTF;\n\nexport async function parseGltf(file: Filesystem.FileResult): Promise<GLTF> {\n    \n    let loadingManager = new THREE.LoadingManager();\n    let gltfLoader = createGltfLoader(loadingManager);\n    let gltf = await parseGltfWithLoader(gltfLoader, file);\n\n    return gltf;\n}\n\nexport function createGltfLoader(loadingManager: THREE.LoadingManager|undefined = undefined): GLTFLoader {\n    let _GLTFLoaderClass = THREE['GLTFLoader'] as GLTFLoaderConstructor;\n    let loader = new _GLTFLoaderClass(loadingManager);\n    return loader;\n}\n\nexport function parseGltfWithLoader(loader: _GLTFLoader, file: Filesystem.FileResult): Promise<GLTF> {\n    return new Promise((resolve, reject) =>\n        loader.parse(file.content!, PathModule.dirname(file.path) + PathModule.sep, resolve, reject));\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/plugin.ts",
    "content": "import { defer, deferDelete, runDeferred } from './defer';\nimport { importGltf, ImportOptions } from './import_gltf';\nimport { isPluginInstalled, showPlugin } from './util';\n\n// MARK: 🟥 plugin\nBBPlugin.register('gltf_importer', {\n\n    title:         'glTF Importer',\n    author:        '0x13F',\n    description:   'Import .GLTF and .GLB models',\n    icon:          'icon.png',\n    creation_date: '2025-09-25',\n    version:       '1.1.0',\n    variant:       'desktop',\n    min_version:   '4.12.6',\n    has_changelog: false,   \n    tags:          [ 'Format: Generic Model', 'Importer' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/gltf_importer',\n\n    onload() {\n        \n        // MARK: 🟩   action\n        deferDelete(new Action('import_gltf', {\n            name: 'Import glTF Model',\n            icon: 'icon-gltf',\n            category: 'file',\n            condition: {\n                modes: ['edit'],\n                method: () => Format?.meshes,\n            },\n            click() {\n                importGltfDialog.show();\n            },\n        }));\n        // Insert import action into import menu before OBJ\n        let importMenu = MenuBar.menus.file.structure.find(x => x['id'] === 'import') as CustomMenuItem;\n        let importMenuChildren = importMenu.children as MenuItem[];\n        let objImportItemIndex = importMenuChildren.findIndex(x => (typeof x === 'string' ? x : x['id']).startsWith('import_obj'));\n        importMenuChildren.splice(objImportItemIndex, 0, 'import_gltf');\n        defer(() => importMenuChildren.splice(importMenuChildren.indexOf('import_gltf'), 1));\n\n        // MARK: 🟩   dialog\n\n        type ImportGltfFormResult = {\n            file?: Filesystem.FileResult,\n            scale: number,\n            groups: boolean,\n            cameras: boolean,\n            animations: boolean,\n            quads: boolean,\n        };\n        let importGltfDialog = deferDelete(new Dialog('import_gltf_dialog', {\n            title: 'Import glTF',\n    \n            form: {\n                ['file']: {\n                    type: 'file',\n                    label: 'glTF File',\n                    return_as: 'file',\n                    extensions: ['gltf', 'glb'],\n                    resource_id: 'gltf',\n                    filetype: 'glTF Model',\n                    readtype: 'buffer',\n                },\n                ['scale']: {\n                    type: 'number',\n                    label: 'Scale',\n                    value: Settings.get('model_export_scale'),\n                },\n                ['groups']: {\n                    type: 'checkbox',\n                    label: 'Import Groups',\n                    value: false,\n                },\n                // TODO: enable\n                // ['cameras']: {\n                //     type: 'checkbox',\n                //     label: 'Import Cameras',\n                //     value: isPluginInstalled('cameras'),\n                // },\n                // ['animations']: {\n                //     type: 'checkbox',\n                //     label: 'Import Animations',\n                //     value: true,\n                // },\n                // ['quads']: {\n                //     type: 'checkbox',\n                //     label: 'Merge Quads',\n                //     value: true,\n                // },\n                ['info_sep']: '_',\n                ['info']: {\n                    type: 'info',\n                    text: 'It is currently not possible to import armatures, animations or cameras.',\n                },\n            },\n    \n            onConfirm(formOptions: ImportGltfFormResult) {\n                if (formOptions.file == undefined)\n                    return false;\n\n                let importOptions: ImportOptions = {\n                    file: formOptions.file!,\n                    scale: formOptions.scale,\n                    groups: formOptions.groups,\n                    cameras: formOptions.cameras,\n                    animations: formOptions.animations,\n                    mergeQuads: formOptions.quads,\n                    undoable: true,\n                    selectResult: true,\n                }\n\n                // Return early if the model contains cameras to import but it's not installed\n                if (formOptions.cameras && !isPluginInstalled('cameras'))\n                    importOptions.cameras = 'NOT_INSTALLED';\n\n                importGltf(importOptions)\n                    .then(async content => {\n\n                        if (content === 'UNSUPPORTED_CAMERAS') {\n                            importGltfDialog.show();\n                            warnAboutCameras();\n                            return;\n                        } \n\n                        if (content.unsupportedArmatures)\n                            await warnAboutUnsupportedArmatures();\n\n                        if (content.usesRepeatingWrapMode && content.uvOutOfBounds)\n                            warnAboutRepeatingTextures();\n                    });\n\n            },\n        }));\n\n        // Allow other plugins to access the import function\n        window['importGltf'] = importGltf;\n        defer(() => delete window['importGltf']);\n\n    },\n\n    onunload() {\n        runDeferred();\n    },\n});\n\n// MARK: 🟥 warnings\n\nfunction warnAboutUnsupportedArmatures(): Promise<void> {\n    return new Promise<void>((resolve, reject) => {\n        Blockbench.showMessageBox({\n            title: 'Armatures not supported',\n            message: 'The imported glTF model makes use of armatures. '\n                + 'The version of Blockbench you are currently using does not support armatures. '\n                + 'If you want to import armatures from models, please update to the lastest version of Blockbench.',\n            icon: 'warning',\n            width: 520,\n        }, () => resolve());\n    });\n}\n\nfunction warnAboutRepeatingTextures() {\n    if (isPluginInstalled('repeating_textures')) {\n        if (!Settings.get('repeating_textures')) {\n            // Installed but disabled, suggest enabling\n            Blockbench.showMessageBox({\n                title: 'Repeating Textures not enabled',\n                message: 'The imported glTF model makes use of repeating textures. '\n                    + 'Repeating textures is are currently disabled. '\n                    + 'Would you like to enable them now?',\n                icon: 'warning',\n                width: 520,\n                buttons: ['dialog.yes', 'dialog.no'],\n            }, (result: number) => {\n                if (result === 0) {\n                    (BarItems['toggle_repeating_textures'] as Action).trigger();\n                    Blockbench.showQuickMessage('Repeating Textures enabled');\n                }\n            });\n        }\n    // Not installed, suggest installing\n    } else {\n        Blockbench.showMessageBox({\n            title: 'Repeating Textures plugin not installed',\n            message: 'The imported glTF model makes use of repeating textures. '\n                + 'Blockbench does not support this by default, so the model may appear incorrect. '\n                + 'Would you like to install the \"Repeating Textures\" plugin to fix this?',\n            icon: 'warning',\n            width: 520,\n            buttons: ['dialog.yes', 'dialog.no'],\n        }, (result: number) => {\n            if (result === 0)\n                showPlugin('repeating_textures');\n        });\n    }\n}\n\nfunction warnAboutCameras() {\n    Blockbench.showMessageBox({\n        title: 'Cameras plugin not installed',\n        message: 'The imported glTF model contains cameras which you have chosen to import, '\n            + 'but the \"Cameras\" plugin is not currently installed. '\n            + 'Would you like to install the \"Cameras\" plugin now?',\n        icon: 'warning',\n        width: 520,\n        buttons: ['dialog.yes', 'dialog.no'],\n    }, (result: number) => {\n        if (result === 0)\n            showPlugin('cameras');\n    });\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/util.ts",
    "content": "export function isPluginInstalled(pluginId: string): boolean {\n    return Plugins.installed.some(p => p.id === pluginId && p.disabled !== true);\n}\n\nexport function showPlugin(pluginId: string) {\n    Plugins.dialog.component.data.selected_plugin = Plugins.all.find(p => p.id === pluginId);\n    Plugins.dialog.show();\n}\n\nexport function valuesAndIndices<T>(array: T[]): [T, number][] {\n    return array.map((v, i) => [v, i] as [T, number]);\n}\n\nexport function imageBitmapToDataUri(imageBitmap: ImageBitmap, type = 'image/png', quality?: number): string {\n    let canvas = document.createElement('canvas');\n    canvas.width = imageBitmap.width;\n    canvas.height = imageBitmap.height;\n\n    let ctx = canvas.getContext('2d');\n    if (ctx == undefined)\n        throw new Error('Failed to get 2D context');\n    ctx.drawImage(imageBitmap, 0, 0);\n\n    return canvas.toDataURL(type, quality);\n}\n\nexport function arrayEquals(a: any[], b: any[]): boolean {\n    return !a.some((v, i) => b[i] !== v);\n}\n\n// Actual proper modulo, not the fake % remainder bs\n// Allows negative values of 'a' to wrap correctly\nexport function modulo(a: number, b: number): number {\n    return ((a % b) + b) % b;\n}\n\nexport function eulerDegreesFromQuat(quat: THREE.Quaternion): THREE.Vector3 {\n    return new THREE.Euler().setFromQuaternion(quat).toVector3().multiplyScalar(180/Math.PI);\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/plugin/vector_hash_map.ts",
    "content": "// Hash map that hashes lists of numbers by their components instead of their object reference\n// Used for de-duplicating vertices\nexport class VectorHashMap<TKey extends number[], TValue> {\n\n    backingMap: {[hash: number]: [TKey, TValue][]};\n\n    constructor() {\n        this.backingMap = {};\n    }\n\n    has(key: TKey): boolean {\n        return this.getKeyValuePair(key) != undefined;\n    }\n\n    get(key: TKey): TValue|undefined {\n        return this.getKeyValuePair(key)?.[1];\n    }\n\n    set(key: TKey, value: TValue) {\n        let bucket = this.getBucket(key);\n\n        if (bucket == undefined) {\n            this.backingMap[this.getHashCode(key)] = [ [key, value] ];\n            return;\n        }\n\n        let keyValuePair = this.getKeyValuePair(key);\n\n        if (keyValuePair == undefined) {\n            bucket.push([key, value]);\n            return;\n        }\n\n        keyValuePair[1] = value;\n    }\n\n    remove(key: TKey) {\n        this.getBucket(key)?.remove(this.getKeyValuePair(key));\n    }\n\n    getHashCode(key: TKey): number {\n        // FNV-1a hash\n        let hash = 2166136261; // 32-bit FNV offset basis\n        for (let component of key) {\n            // Break number into 4 bytes to ensure uniqueness\n            let component32 = component | 0; // force to 32-bit int\n            for (let i = 0; i < 4; i++) {\n                let byte = (component32 >>> (i * 8)) & 0xff;\n                hash ^= byte;\n                hash = Math.imul(hash, 16777619); // FNV prime\n            }\n        }\n\n        return hash >>> 0; // Return as unsigned 32-bit int\n    }\n\n    getBucket(key: TKey): [TKey, TValue][]|undefined {\n        return this.backingMap[this.getHashCode(key)];\n    }\n\n    getKeyValuePair(key: TKey): [TKey, TValue]|undefined {\n        return this.getBucket(key)?.find(([k,v]) => k.every((c,i) => c === key[i]));\n    }\n\n}\n"
  },
  {
    "path": "plugins/gltf_importer/src/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"types\": [\"blockbench-types\"],\n        \"target\": \"es2023\",\n        \"module\": \"es2022\",\n        \"moduleResolution\": \"node\",\n        \"lib\": [\"ES2023\", \"DOM\", \"DOM.Iterable\"],\n        \"rootDir\": \"plugin\",\n        \"strictNullChecks\": true,\n    },\n    \"exclude\": [\n        \"node_modules\"\n    ]\n}"
  },
  {
    "path": "plugins/grayscale_preview.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\n\n(function() {\n\nlet toggle, css;\n\nPlugin.register('grayscale_preview', {\n\ttitle: 'Grayscale Preview',\n\ticon: 'filter_b_and_w',\n\tauthor: 'JannisX11',\n\tdescription: 'Adds a Grayscale preview mode. The mode can be toggled from the View menu.',\n\ttags: ['Viewport'],\n\tversion: '1.0.0',\n\tmin_version: '4.3.0',\n\tvariant: 'both',\n\tonload() {\n\t\ttoggle = new Toggle('grayscale_preview', {\n\t\t\tname: 'Grayscale Preview',\n\t\t\ticon: 'filter_b_and_w',\n\t\t\tcategory: 'view',\n\t\t\tonChange(value) {\n\t\t\t\tInterface.work_screen.classList.toggle('grayscale_view', value)\n\t\t\t}\n\t\t})\n\t\tMenuBar.addAction(toggle, 'view.5')\n\t\tcss = Blockbench.addCSS(`\n\t\t\t#work_screen.grayscale_view #preview canvas {\n\t\t\t\tfilter: grayscale(1);\n\t\t\t}\n\t\t\t#work_screen.grayscale_view #uv_frame img {\n\t\t\t\tfilter: grayscale(1);\n\t\t\t}\n\t\t`)\n\t},\n\tonunload() {\n\t\ttoggle.delete()\n\t\tcss.delete()\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/ground_plane_editor.js",
    "content": "(async function() {\n    let aboutAction, groundPlaneAction, groundPlaneDialog;\n    const id = \"ground_plane_editor\"\n    const name = \"Ground Plane Editor\"\n    const icon = \"icon-format_free\"\n    const author = \"SirJain\"\n\n    // Store the ground plane material in a dialog\n    let groundPlane = Canvas.ground_plane.material\n\n    // localStorage variables\n    let localStorageColor = localStorage.getItem(\"groundPlaneColor\")\n    let localStorageOpacity = localStorage.getItem(\"groundPlaneOpacity\")\n\n    const links = {\n        twitter: \"https://www.twitter.com/SirJain2\",\n        discordlink: \"https://discord.gg/wM4CKTbFVN\"\n    }\n\n    // Register plugin\n    Plugin.register(id, {\n        title: name,\n        icon,\n        author,\n        description: \"Edits the opacity and color of the ground plane feature in Blockbench.\",\n        about: \"This simple plugin allows you to customize the ground plane feature in Blockbench; more specifically, the opacity and color.\\n## How to use\\nTo use this plugin, simply go to `Tools > Ground Plane Editor`, fill out the appropriate categories, and hit `Done`. You can choose to edit either the color, the opacity, or both!\\n\\nPlease report any bugs or suggestions you may have.\",\n        tags: [\"Ground Plane\", \"Animation\", \"Customization\"],\n        version: \"1.1.1\",\n        min_version: \"4.2.0\",\n        variant: \"both\",\n\n        oninstall() {\n            showAbout(true)\n            Blockbench.showQuickMessage(\"Successfully Installed Ground Plane Editor!\");\n        },\n        onuninstall() {\n            Blockbench.showQuickMessage(\"Uninstalled Ground Plane Editor\");\n        },\n        onload() {\n            addAbout()\n\n            // Handles the ground plane on loading the plugin\n            groundPlane.transparent = true;\n\n            if (localStorageColor) groundPlane.color.setHex(JSON.parse(localStorageColor))\n            else groundPlane.color.setHex(parseInt(\"#21252B\".substring(1), 16))\n\n            if (localStorageOpacity) groundPlane.opacity = localStorageOpacity / 255\n            else groundPlane.opacity = 1\n    \n            groundPlaneAction = new Action({\n                name: \"Edit Ground Plane\",\n                id: \"edit_ground_plane_action\",\n                icon: icon,\n                condition: () => Format?.id !== \"image\",\n                click: () => openDialog()\n            })\n\n            MenuBar.addAction(groundPlaneAction, \"tools\")\n        },\n\n        onunload() {\n            aboutAction.delete()\n            groundPlaneAction.delete()\n\n            // Reset values if plugin is uninstalled\n            localStorage.removeItem(\"groundPlaneColor\")\n            localStorage.removeItem(\"groundPlaneOpacity\")\n            groundPlane.color.setHex(parseInt(\"#21252B\".substring(1), 16))\n            groundPlane.opacity = 1\n\n            MenuBar.removeAction(`help.about_plugins.about_${id}`)\n        }\n    })\n\n    function openDialog() {\n        groundPlaneDialog = new Dialog(\"ground_plane_dialog\", {\n            name: \"Edit Ground Plane\",\n            part_order: [\"form\", \"lines\", \"component\"],\n\n            form: {\n                color: {\n                    label: \"Color\",\n                    value: getPlaneColor(),\n                    type: \"color\"\n                },\n                opacity: {\n                    label: \"Opacity\", \n                    value: getPlaneOpacity(),\n                    type: \"range\",\n                    min: 60,\n                    max: 255,\n                    step: 1\n                },\n                actions: {\n                    type: 'buttons', \n                    buttons: ['Reset Values'], \n                    click() {\n                        groundPlane.color.setHex(parseInt(\"#21252B\".substring(1), 16))\n                        groundPlane.opacity = 1\n                        groundPlaneDialog.hide()\n\n                        localStorage.setItem(\"groundPlaneColor\", groundPlane.color)\n                        localStorage.setItem(\"groundPlaneOpacity\", groundPlane.opacity)\n\n                        Blockbench.showQuickMessage(\"Reset ground plane values!\", 1500)\n                    }\n                }\n            },\n\n            onConfirm(formData) {\n                const planeColor = parseInt(formData.color.toHexString().substring(1), 16)\n\n                groundPlane.color.setHex(planeColor)\n                groundPlane.opacity = formData.opacity / 255\n\n                localStorage.setItem(\"groundPlaneColor\", planeColor)\n                localStorage.setItem(\"groundPlaneOpacity\", formData.opacity)\n\n                console.log(groundPlane.color)\n                Blockbench.showQuickMessage(\"Updated ground plane values!\", 1500)\n            }\n        }).show()\n    }\n\n    function getPlaneColor() {\n        return '#' + groundPlane.color.getHexString()\n    }\n\n    function getPlaneOpacity() {\n        return groundPlane.opacity * 255;\n    }\n\n    // Adds about dialog\n    function addAbout() {\n        let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\n\n        if (!about) {\n            about = new Action(\"about_plugins\", {\n                name: \"About Plugins...\",\n                icon: \"info\",\n                children: []\n            })\n            MenuBar.addAction(about, \"help\")\n        }\n\n        aboutAction = new Action(`about_${id}`, {\n            name: `About ${name}...`,\n            icon,\n            click: () => showAbout()\n        })\n\n        about.children.push(aboutAction)\n    }\n\n    function showAbout(banner) {\n        const infoBox = new Dialog({\n            id: \"about\",\n            title: name,\n            width: 780,\n            buttons: [],\n            lines: [`\n                <li></li>\n                <style>\n                    dialog#about .dialog_title {\n                        padding-left: 0;\n                        display: flex;\n                        align-items: center;\n                        gap: 10px;\n                    }\n\n                    dialog#about .dialog_content {\n                        text-align: left!important;\n                        margin: 0!important;\n                    }\n\n                    dialog#about .socials {\n                        padding: 0!important;\n                    }\n\n                    dialog#about #banner {\n                        background-color: var(--color-accent);\n                        color: var(--color-accent_text);\n                        width: 100%;\n                        padding: 0 8px\n                    }\n\n                    dialog#about #content {\n                        margin: 24px;\n                    }\n                </style>\n                ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\n                <div id=\"content\">\n                    <h1 style=\"margin-top:-10px\">${name}</h1>\n                    <p>This plugin is used for changing the opacity and color of the ground plane feature in Blockbench.</p>\n                    <h4>Worth noting:</h4>\n                    <p>- There is currently no way to revert back to the default ground plane. However, adding this feature is planned. For now you'll have to uninstall the plugin and restart Blockbench to revert back to the default.</p>\n                    <p>- Just like the default ground plane, changing it's properties in one tab will update in other tabs as well.</p>\n                    <h4>How to use:</h4>\n                    <p>To use this plugin, simply go to <b>Tools > Ground Plane Editor</b>, fill out the appropriate categories, and hit <b>Done</b>. You can choose to edit either the color, the opacity, or both!</p>\n                    <p>Please report any bugs or suggestions you may have to make this plugin more enjoyable for everyone.</p>\n                    <br>\n                    <div class=\"socials\">\n                        <a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#00acee\"></i>\n                            <label>By ${author}</label>\n                        </a>\n                        <a href=\"${links[\"discordlink\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\n                            <label>Discord Server</label>\n                        </a>\n                    </div>\n                </div>\n            `]\n        }).show()\n        $(\"dialog#about .dialog_title\").html(`\n            <i class=\"icon material-icons\">${icon}</i>\n            ${name}\n        `)\n    }\n})()\n"
  },
  {
    "path": "plugins/guessing_game.js",
    "content": "(function() {\r\n\r\nvar Game;\r\n\r\nPlugin.register('guessing_game', {\r\n\ttitle: 'The Guessing Game',\r\n\ticon: 'casino',\r\n\tauthor: 'JannisX11',\r\n\tdescription: 'Play the guessing game in Blockbench with your friends',\r\n\tversion: '1.0.0',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\r\n\t\t//Patch\r\n\t\tChat.processMessage = function(data) {\r\n\t\t\tif (!EditSession.hosting) {\r\n\t\t\t\tEditSession.host.send({\r\n\t\t\t\t\ttype: 'chat_input',\r\n\t\t\t\t\tdata,\r\n\t\t\t\t\tsender: EditSession.peer.id\r\n\t\t\t\t})\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t//Host Only\r\n\t\t\tBlockbench.dispatchEvent('process_chat_message', data)\r\n\r\n\t\t\tEditSession.sendAll('chat_message', data)\r\n\t\t\tChat.addMessage(data)\r\n\t\t}\r\n\t\tChat.addMessage = function(message) {\r\n\t\t\tif (!(message instanceof Chat.Message)) {\r\n\t\t\t\tmessage = new Chat.Message(message)\r\n\t\t\t}\r\n\t\t\tif (!message.text) return;\r\n\t\t\t\r\n\t\t\tChat.history.push(message)\r\n\t\t\tVue.nextTick(() => {\r\n\t\t\t\t$('#chat_history').scrollTop(10000)\r\n\t\t\t})\r\n\t\t\tif (!document.hasFocus() && !message.self) {\r\n\t\t\t\tBlockbench.notification(message.author ? message.author+':' : 'Chat', message.text)\r\n\t\t\t}\r\n\t\t\treturn message;\r\n\t\t}\r\n\r\n\t\t//Setup\r\n\t\tvar GameClient = {\r\n\t\t\tis_creator: false,\r\n\t\t}\r\n\t\tvar keywords = [\r\n\t\t\t'Blockbench', 'Fire', 'Volcano', 'Traveling', 'Batman', 'Gun', 'Folder',\r\n\t\t\t//Tech\r\n\t\t\t'Computer', 'Monitor', 'Camera', 'Laptop', 'Tripod', 'Lamp', 'Lever', 'Floppy Disk',  'Playstation', 'Cable', 'Fire Extinguisher', 'Electric Guitar', 'Cinema',\r\n\t\t\t//Food\r\n\t\t\t'Cake', 'Apple', 'Plate', 'Fork', 'Knive', 'Cup', 'Pizza', 'Vending Machine', 'Avocado', 'Sausage', 'Cheeseburger', 'Hot Dog', 'Ketchup', 'Pumpkin',\r\n\t\t\t//Vehicles\r\n\t\t\t'Car', 'Pickup Truck', 'Forklift', 'Tractor', 'Plane', 'Crane', 'Excavator', 'Bus', 'Wheelchair', 'Bulldozer', 'Golf Cart', 'Bicycle', 'Monster Truck', 'Roller Coaster', 'Helicopter', 'Motorbike', 'Spaceship', 'Train', 'Delivery Truck',\r\n\t\t\t//Buildings\r\n\t\t\t'House', 'Castle', 'Eiffel Tower', 'Barn', 'Cabin', 'Bridge', 'Tower Bridge',\r\n\t\t\t//Pop Culture\r\n\t\t\t'R2D2', 'Tardis', 'T-Rex', 'Ring', 'Portal Gun', 'Mario', 'DeLorean', 'X Wing',\r\n\t\t\t//Nature\r\n\t\t\t'Tree', 'Mountain', 'Snowflake', 'Cactus', 'Bug', 'Cloud', 'Bone',\r\n\t\t\t//Items\r\n\t\t\t'Eraser', 'Pen', 'Compass', 'Toilet Paper', 'Phone', 'Gift', 'Ball', 'Ziptie', 'Candle', 'Traffic Cone', 'Key', 'Candy', 'Suitcase', 'Cheese Grater',\r\n\t\t\t//Tools\r\n\t\t\t'Bucket', 'Hammer', 'Brush', 'Knive', 'Tape Measure', 'Sickle', 'Scissors', 'Crescent Wrench',\r\n\t\t\t//Minecraft\r\n\t\t\t'Creeper', 'Zombie', 'Ghast', 'Beacon', 'Ravager', 'Pickage', 'Sword', 'Battle Axe', 'Axe', \r\n\t\t\t//Animals\r\n\t\t\t'Cow', 'Fox', 'Scarecrow', 'Bird', 'Parrot', 'Bee', 'Bear', 'Cat', 'Human', 'Eagle', 'Hedgehog', 'Snail', 'Giraffe',\r\n\t\t\t//Body\r\n\t\t\t'Mustache', 'Head', 'Hand', 'Foot', 'Tooth', 'Mouth', 'Heart',\r\n\t\t\t//Cloths\r\n\t\t\t'Pants', 'Jacket', 'Backpack', 'Hat', 'Baseball Cap', 'Sneakers', 'Boots', 'Umbrella', 'Mask', 'Glasses',\r\n\t\t]\r\n\t\tGame = {};\r\n\t\tGame.interface = {\r\n\t\t\tsetup: function() {\r\n\t\t\t\tvar GI = Game.interface;\r\n\t\t\t\tvar body = $('#page_wrapper');\r\n\r\n\t\t\t\tif (GI.isSetup) return;\r\n\r\n\t\t\t\tbody.append(`<style>\r\n\r\n\t\t\t\t\t.scoreboard_points {\r\n\t\t\t\t\t\tdisplay: inline-block;\r\n\t\t\t\t\t\tmargin-left: 8px;\r\n\t\t\t\t\t\tmargin-right: 10px;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t.guessing_game_word {\r\n\t\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\t\tpointer-events: none;\r\n\t\t\t\t\t\theight: 40px;\r\n\t\t\t\t\t\twidth: 100%;\r\n\t\t\t\t\t\tmargin-top: 30px;\r\n\t\t\t\t\t\tcolor: var(--color-text);\r\n\t\t\t\t\t\topacity: 0.75;\r\n\t\t\t\t\t\tfont-family: monospace;\r\n\t\t\t\t\t\tfont-size: 28pt;\r\n\t\t\t\t\t\tletter-spacing: 2px;\r\n\t\t\t\t\t\tz-index: 16;\r\n\t\t\t\t\t\ttext-align: center;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t</style>`)\r\n\t\t\t\t//WordDisplay\r\n\t\t\t\tGI.word = $(`<div class=\"guessing_game_word\"></div>`)\r\n\t\t\t\tbody.append(GI.word)\r\n\t\t\t\t//Sounds\r\n\t\t\t\tGI.bling = document.createElement('AUDIO')\r\n\t\t\t\tGI.bling.src = 'https://blockbench.net/api/guessing_game/bling.mp3';\r\n\t\t\t\tGI.tada = document.createElement('AUDIO')\r\n\t\t\t\tGI.tada.src = 'https://blockbench.net/api/guessing_game/tada.mp3';\r\n\r\n\t\t\t\t//Scoreboard\r\n\t\t\t\tGI.scoreboard = $(`<ul style=\"\r\n\t\t\t\t\tposition: absolute;\r\n\t\t\t\t\tpointer-events: none;\r\n\t\t\t\t\twidth: 120px;\r\n\t\t\t\t\tbottom: 26px;\r\n\t\t\t\t\tcolor: var(--color-text);\r\n\t\t\t\t\topacity: 0.75;\r\n\t\t\t\t\tz-index: 16;\r\n\t\t\t\t\">\r\n\t\t\t\t\t<li></li>\r\n\t\t\t\t</ul>`)\r\n\t\t\t\t$('#status_bar').append(GI.scoreboard)\r\n\t\t\t\tGI.isSetup = true;\r\n\t\t\t},\r\n\t\t\tupdateScoreboard: function(data) {\r\n\t\t\t\tGame.interface.scoreboard.empty()\r\n\t\t\t\tdata.forEach(tag => {\r\n\t\t\t\t\tGame.interface.scoreboard.append(`<li>\r\n\t\t\t\t\t\t<div class=\"scoreboard_points\">${tag.score}</div>${tag.name}\r\n\t\t\t\t\t</li>`)\r\n\t\t\t\t})\r\n\t\t\t},\r\n\t\t\tdisplayWord: function(word) {\r\n\t\t\t\tGame.interface.word.text(word)\r\n\t\t\t},\r\n\t\t\tprogress: function(data) {\r\n\t\t\t\tclearInterval(Game.interface.interval)\r\n\t\t\t\tif (data.progress !== undefined) {\r\n\t\t\t\t\tBlockbench.setProgress(data.progress)\r\n\t\t\t\t}\r\n\t\t\t\tif (data.time) {\r\n\t\t\t\t\tvar progress = data.progress;\r\n\t\t\t\t\tif (progress === undefined) progress = 1;\r\n\t\t\t\t\tvar increment = (progress ? -1 : 1) / (data.time/(100/6))\r\n\t\t\t\t\tGame.interface.interval = setInterval(function() {\r\n\t\t\t\t\t\tprogress += increment;\r\n\t\t\t\t\t\tif (progress < 0 || progress > 1) {\r\n\t\t\t\t\t\t\tprogress = Math.clamp(progress, 0, 1);\r\n\t\t\t\t\t\t\tclearInterval(Game.interface.interval)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tBlockbench.setProgress(progress)\r\n\t\t\t\t\t}, 100/6)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tBlockbench.on('create_session', (d1) => {\r\n\r\n\t\t\t//Host\r\n\r\n\t\t\tGame.interface.setup()\r\n\t\t\tvar timeout;\r\n\r\n\t\t\tGame.users = {};\r\n\t\t\tGame.creator = false;\r\n\t\t\tGame.round = 0;\r\n\t\t\tGame.rounds = 0;\r\n\t\t\tGame.rightGuesses = 0;\r\n\t\t\t\r\n\t\t\tvar GameTiming = {}\r\n\t\t\tvar completed_characters = 0;\r\n\t\t\tvar completed_word;\r\n\t\t\tvar complete_interval;\r\n\t\t\t//window.Game = Game;\r\n\r\n\t\t\t//User\r\n\t\t\tclass GameUser {\r\n\t\t\t\tconstructor(data) {\r\n\t\t\t\t\tthis.id = data.id;\r\n\t\t\t\t\tthis.score = 0;\r\n\t\t\t\t\tthis.isCreating = false;\r\n\t\t\t\t\tthis.isHost = !!data.isHost;\r\n\t\t\t\t\tthis.conn = data.conn;\r\n\t\t\t\t\tthis.name = data.name;\r\n\t\t\t\t\tthis.client = data.client\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t*/\r\n\t\t\t\t}\r\n\t\t\t\ttoString() {\r\n\t\t\t\t\treturn this.name;\r\n\t\t\t\t}\r\n\t\t\t\tstartTurn() {\r\n\t\t\t\t\tGame.creator = this;\r\n\t\t\t\t\tChat.processMessage({text: `${this.name} is now modeling!`, color: 'blue', author: 'GAME'})\r\n\t\t\t\t\tthis.sendData('start_turn', {word: Game.word})\r\n\t\t\t\t\tif (!this.hasEverCreated) {\r\n\t\t\t\t\t\tthis.sendChatMessage({text: 'You will get 4 points if your model is guessed', color: 'yellow', author: 'GAME'})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.hasEverCreated = true\r\n\t\t\t\t\tthis.isCreating = true\r\n\t\t\t\t\tthis.hasCreated = true\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t\tsendData(key, data) {\r\n\t\t\t\t\t//Host to User\r\n\t\t\t\t\tif (this.isHost) {\r\n\t\t\t\t\t\tclientAction(key, data)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.conn.send({\r\n\t\t\t\t\t\t\ttype: key,\r\n\t\t\t\t\t\t\tfromHost: EditSession.hosting,\r\n\t\t\t\t\t\t\thostOnly: true,\r\n\t\t\t\t\t\t\tsender: EditSession.peer.id,\r\n\t\t\t\t\t\t\tdata: data\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tsendChatMessage(data) {\r\n\t\t\t\t\tthis.sendData('chat_message', data)\r\n\t\t\t\t}\r\n\t\t\t\tguess() {\r\n\t\t\t\t\tif (this.isCreating) {\r\n\t\t\t\t\t\tthis.sendChatMessage({text: 'You cannot guess your own word', author: 'GAME'})\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.hasGuessed) {\r\n\t\t\t\t\t\tthis.sendChatMessage({text: 'You have already guessed the word', author: 'GAME'})\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tChat.processMessage({text: this.name + ' guessed the word!', color: 'green', author: 'GAME'})\r\n\t\t\t\t\tthis.sendChatMessage({text: 'The correct word was: ' + Game.word, author: 'GAME'});\r\n\t\t\t\t\tthis.sendData('sound', {sound: 'bling'});\r\n\r\n\t\t\t\t\tthis.hasGuessed = true;\r\n\t\t\t\t\tGame.rightGuesses++;\r\n\r\n\t\t\t\t\tif (Game.rightGuesses === 1) {\r\n\t\t\t\t\t\tthis.score += 11;\r\n\t\t\t\t\t\tGame.creator.score += 4;\r\n\t\t\t\t\t} else if (Game.rightGuesses <= 3) {\r\n\t\t\t\t\t\tthis.score += 8;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.score += 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGame.updateScoreboard()\r\n\r\n\t\t\t\t\tvar user_left;\r\n\t\t\t\t\tGame.perUser(user => {\r\n\t\t\t\t\t\tif (!user.hasGuessed && !user.isCreating) {\r\n\t\t\t\t\t\t\tuser_left = user;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif (!user_left) {\r\n\t\t\t\t\t\tstopCreation()\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\tquit() {\r\n\t\t\t\t\tdelete Game.users[this.id];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//Rounds\r\n\t\t\tfunction startGame(formData) {\r\n\t\t\t\tGame.guessing_time = formData.guessing_time*60\r\n\t\t\t\tGame.rounds = formData.rounds\r\n\t\t\t\tGame.running = true;\r\n\t\t\t\tGame.round = 0;\r\n\t\t\t\tGame.allClients('setup_game', {})\r\n\t\t\t\tstartRound()\r\n\t\t\t}\r\n\t\t\tfunction startRound() {\r\n\t\t\t\tGame.round++;\r\n\t\t\t\tif (Game.round == 1) {\r\n\t\t\t\t\tChat.processMessage({text: `Be the first player to guess the word and get 11 points! The second and third player get 8 points, everyone else 5.`, color: 'yellow', author: 'GAME'});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tChat.processMessage({text: `Starting round number ${Game.round}!`, color: 'blue', author: 'GAME'});\r\n\t\t\t\t}\r\n\t\t\t\tGame.perUser(user => {\r\n\t\t\t\t\tdelete user.hasCreated;\r\n\t\t\t\t})\r\n\t\t\t\tstartCreation()\r\n\t\t\t}\r\n\r\n\t\t\tfunction startCreation() {\r\n\t\t\t\t//Reset\r\n\t\t\t\tGame.rightGuesses = 0;\r\n\t\t\t\t//Randomize\r\n\t\t\t\tvar free = [];\r\n\t\t\t\tvar user_nr = 1;\r\n\t\t\t\tGame.perUser(user => {\r\n\t\t\t\t\tdelete user.hasGuessed;\r\n\t\t\t\t\tif (user.hasCreated) {\r\n\t\t\t\t\t\tuser_nr++;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfree.push(user);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tif (free.length === 0) return false;\r\n\t\t\t\tvar next = free.random()\r\n\r\n\t\t\t\tnewProject(Formats.free, true);\r\n\t\t\t\tProp.file_name = Project.name = `The Guessing Game - Round ${Game.round} of ${Game.rounds}, Player ${user_nr} (${next.name})`\r\n\t\t\t\tEditSession.initNewModel(true)\r\n\r\n\t\t\t\tvar word = keywords.random()\r\n\t\t\t\tGame.word = word\r\n\t\t\t\tcompleted_word = word.replace(/[A-Za-z0-9]/g, '_')\r\n\t\t\t\tcompleted_characters = 0;\r\n\t\t\t\tGame.allClients('display_word', completed_word)\r\n\t\t\t\tnext.startTurn(word)\r\n\r\n\t\t\t\tGame.allClients('display_progress', {progress: 1, time: Game.guessing_time*1000})\r\n\r\n\t\t\t\tvar interval_time = (Game.guessing_time*2) / word.length\r\n\t\t\t\tGameTiming.completing = setInterval(completeWord, interval_time*1000)\r\n\t\t\t\tGameTiming.timeout = setTimeout(stopCreation, Game.guessing_time*1000)\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tfunction completeWord() {\r\n\t\t\t\tcompleted_characters++;\r\n\t\t\t\tvar index = Math.floor(Math.random()*Game.word.length);\r\n\t\t\t\tcompleted_word = completed_word.substr(0, index) + Game.word[index] + completed_word.substr(index+1)\r\n\t\t\t\tGame.allClients('display_word', completed_word)\r\n\t\t\t}\r\n\t\t\tfunction stopCreation() {\r\n\t\t\t\tclearTimeout(GameTiming.timeout)\r\n\t\t\t\tclearInterval(GameTiming.completing)\r\n\t\t\t\tGame.allClients('display_progress', {progress: 0})\r\n\r\n\t\t\t\tGame.allClients('end_turn', {word: Game.word})\r\n\t\t\t\tdelete Game.word;\r\n\t\t\t\tGame.creator.isCreating = false;\r\n\t\t\t\tdelete Game.creator;\r\n\r\n\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\tif (!startCreation()) {\r\n\t\t\t\t\t\tif (Game.round < Game.rounds) {\r\n\t\t\t\t\t\t\tstartRound()\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tendGame()\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 5000)\r\n\t\t\t\tGame.allClients('display_progress', {progress: 0, time: 5000})\r\n\r\n\t\t\t}\r\n\t\t\tfunction endGame() {\r\n\t\t\t\tvar highscore = 0;\r\n\t\t\t\tvar winner;\r\n\t\t\t\tGame.perUser(user => {\r\n\t\t\t\t\tif (user.score >= highscore) {\r\n\t\t\t\t\t\thighscore = user.score;\r\n\t\t\t\t\t\twinner = user;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdelete user.hasGuessed;\r\n\t\t\t\t\tdelete user.hasCreated;\r\n\t\t\t\t\tdelete user.isCreating;\r\n\t\t\t\t})\r\n\t\t\t\tGame.allClients('sound', {sound: 'tada'});\r\n\t\t\t\tChat.processMessage({text: `The game ended. The winner is \"${winner}\" with ${highscore} points. Congratulations!`, color: 'orange', author: 'GAME'})\r\n\t\t\t\tsetTimeout(function() {\r\n\r\n\t\t\t\t\tnewProject(Formats.free, true);\r\n\t\t\t\t\tEditSession.initNewModel(true)\r\n\t\t\t\t\tGame.allClients('display_progress', {progress: 0})\r\n\t\t\t\t\tdialog.show()\r\n\t\t\t\t\tGame.perUser(user => {\r\n\t\t\t\t\t\tuser.score = 0;\r\n\t\t\t\t\t})\r\n\t\t\t\t\tGame.updateScoreboard()\r\n\t\t\t\t\tGame.running = false;\r\n\t\t\t\t}, 6000)\r\n\t\t\t\tGame.allClients('display_progress', {progress: 1, time: 6000})\r\n\t\t\t}\r\n\r\n\r\n\t\t\t//Dist\r\n\t\t\tGame.perUser = function(cb) {\r\n\t\t\t\tvar i = 0;\r\n\t\t\t\tfor (var id in Game.users) {\r\n\t\t\t\t\tvar user = Game.users[id]\r\n\t\t\t\t\tcb(user, i)\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tGame.allClients = function(key, data) {\r\n\t\t\t\tEditSession.sendAll(key, data)\r\n\t\t\t\tclientAction(key, data)\r\n\t\t\t}\r\n\t\t\tGame.wordMatches = function(word) {\r\n\t\t\t\tif (!Game.word || typeof word !== 'string') return;\r\n\r\n\t\t\t\tword = word.trim().toLowerCase().replace(/[-_]{1}/g, ' ')\r\n\t\t\t\treturn word && Game.word.toLowerCase() === word\r\n\t\t\t}\r\n\t\t\tBlockbench.on('process_chat_message', message => {\r\n\t\t\t\tif (!Game.running) return;\r\n\t\t\t\tvar user = Game.users[message.sender]\r\n\t\t\t\t\r\n\t\t\t\tif (Game.wordMatches(message.text)) {\r\n\t\t\t\t\tmessage.text = '';\r\n\t\t\t\t\tGame.users[message.sender].guess()\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tGame.displayWord = function(word) {\r\n\t\t\t\tGame.allClients('display_word', word)\r\n\t\t\t}\r\n\t\t\tGame.updateScoreboard = function() {\r\n\t\t\t\tvar data = []\r\n\t\t\t\tGame.perUser((user) => {\r\n\t\t\t\t\tdata.push({name: user.name, score: user.score})\r\n\t\t\t\t})\r\n\t\t\t\tdata.sort((a, b) => b.score - a.score);\r\n\t\t\t\tGame.allClients('update_scoreboard', data)\r\n\t\t\t};\r\n\r\n\t\t\t//Users\r\n\t\t\tGame.users[EditSession.peer.id] = EditSession.clients[EditSession.peer.id].game_user = new GameUser({\r\n\t\t\t\tid: EditSession.peer.id,\r\n\t\t\t\tname: EditSession.username,\r\n\t\t\t\tisHost: true,\r\n\t\t\t\tclient: EditSession.clients[EditSession.peer.id]\r\n\t\t\t})\r\n\t\t\tGame.updateScoreboard()\r\n\t\t\tBlockbench.on('user_joins_session', (client) => {\r\n\t\t\t\tif (Game.running) {\r\n\t\t\t\t\tclient.conn.send({\r\n\t\t\t\t\t\ttype: 'add_chat_message',\r\n\t\t\t\t\t\tfromHost: true,\r\n\t\t\t\t\t\tsender: EditSession.peer.id,\r\n\t\t\t\t\t\tdata: {content: 'You cannot join this session', color: 'red'}\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tGame.users[client.conn.peer] = client.game_user = new GameUser({\r\n\t\t\t\t\t\tid: client.id,\r\n\t\t\t\t\t\tname: client.name,\r\n\t\t\t\t\t\tconn: client.conn,\r\n\t\t\t\t\t\tclient\r\n\t\t\t\t\t})\r\n\t\t\t\t\tGame.updateScoreboard()\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tBlockbench.on('user_leaves_session', (d2) => {\r\n\t\t\t\tif (Game.users[d2.conn.peer]) {\r\n\t\t\t\t\tGame.users[d2.conn.peer].quit()\r\n\t\t\t\t\tGame.updateScoreboard()\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tvar dialog = new Dialog({\r\n\t\t\t\tid: 'guessing_game',\r\n\t\t\t\ttitle: 'Guessing Game Controls',\r\n\t\t\t\tbuttons: ['Start Game', 'Cancel'],\r\n\t\t\t\tform: {\r\n\t\t\t\t\ttoken: {label: 'Session Token', value: d1.token, readonly: true},\r\n\t\t\t\t\tguessing_time: {label: 'Guess Time (m)', type: 'number', value: 2, min: 0.4, max: 8, step: 0.1},\r\n\t\t\t\t\trounds: {label: 'Rounds', type: 'number', value: 3, min: 1, max: 12},\r\n\t\t\t\t},\r\n\t\t\t    onConfirm: function(formData) {\r\n\t\t\t    \tstartGame(formData)\r\n\t\t\t        this.hide()\r\n\t\t\t    },\r\n\t\t\t    onCancel: function() {\r\n\t\t\t        EditSession.quit()\r\n\t\t\t        this.hide()\r\n\t\t\t    }\r\n\t\t\t}).show()\r\n\t\t\t$('#blackout').css('z-index', '15');\r\n\t\t})\r\n\r\n\t\tBlockbench.on('join_session', () => {\r\n\t\t\tGame.interface.setup()\r\n\t\t})\r\n\r\n\t\tfunction clientAction(key, data) {\r\n\t\t\tif (key === 'setup_game') {\r\n\t\t\t\tGameClient.isPlaying = true;\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'update_scoreboard') {\r\n\t\t\t\tGame.interface.updateScoreboard(data)\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'init_model') {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tProp.file_name = data.name;\r\n\t\t\t\t}, 12)\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'display_progress') {\r\n\t\t\t\tGame.interface.progress(data)\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'display_word') {\r\n\t\t\t\tif (!GameClient.is_creator || !data.includes('_')) {\r\n\t\t\t\t\tGame.interface.displayWord(data)\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'start_turn') {\r\n\t\t\t\tGameClient.is_creator = true;\r\n\t\t\t\tGame.interface.displayWord(data.word)\r\n\t\t\t\tBlockbench.showQuickMessage(`It's your turn! Build \"${data.word}\"`, 1600)\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'end_turn') {\r\n\t\t\t\tGameClient.is_creator = false;\r\n\t\t\t\tBlockbench.showQuickMessage(`The round has ended! The word was \"${data.word}\"`, 1800)\r\n\t\t\t\tGame.interface.displayWord('')\r\n\t\t\t\t\r\n\t\t\t} else if (key === 'sound') {\r\n\t\t\t\tswitch (data.sound) {\r\n\t\t\t\t\tcase 'bling': Game.interface.bling.play(); break;\r\n\t\t\t\t\tcase 'tada': Game.interface.tada.play(); break;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tBlockbench.on('send_session_data', (tag) => {\r\n\t\t\tif (GameClient.isPlaying && ['edit', 'undo', 'redo'].includes(tag.type)) {\r\n\t\t\t\tif (!GameClient.is_creator) {\r\n\t\t\t\t\ttag.type = 'intervened';\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tBlockbench.on('finished_edit', tag => {\r\n\t\t\tif (!tag.remote && GameClient.isPlaying && !GameClient.is_creator) {\r\n\t\t\t\tvar entry = Undo.history[Undo.history.length-1]\r\n\t\t\t\tUndo.loadSave(entry.before, entry.post)\r\n\t\t\t\tBlockbench.showQuickMessage(`It's not your turn!`, 1200)\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tBlockbench.on('receive_session_data', (tag) => {\r\n\t\t\tif (tag.fromHost && !EditSession.hosting) {\r\n\t\t\t\tclientAction(tag.type, tag.data)\r\n\t\t\t} else if (!tag.fromHost && EditSession.hosting) {\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tBlockbench.on('quit_session', (tag) => {\r\n\t\t\tGame.interface.updateScoreboard([])\r\n\t\t})\r\n\r\n\r\n\t},\r\n\tonunload() {\r\n\t\tif (Game.interface.isSetup) {\r\n\t\t\tGame.interface.scoreboard.detach();\r\n\t\t\tGame.interface.word.detach();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n})()\r\n\r\n\r\n/*\r\n\tTimer schneller ablaufen wenn erraten wurde\r\n\tOpen window again when clicking edit session\r\n\tdima didnt get a word\r\n\tshow word after round in chat as well\r\n\r\n*/"
  },
  {
    "path": "plugins/highlight_generator.js",
    "content": "(function(){\n    let button;\n\n    Plugin.register('highlight_generator', {\n        title: 'Highlight Mod Shape Generator',\n        author: 'ThatGravyBoat',\n        description: 'Generates Shape JSONs for the Highlight mod. Mod can be found at: https://links.resourcefulbees.com/highlight',\n        icon: 'fa-cube',\n        version: '1.0.0',\n        variant: 'both',\n        tags: [\"Minecraft: Java Edition\"],\n        onload(){\n            button = new Action(\"export_highlight\", {\n                name : 'Export Highlight',\n                description : 'Exports Highlight mod shape JSON',\n                icon : 'fa-file-export',\n                click: function(){\n                    Blockbench.export({\n                        type : 'Highlight Shape Export',\n                        extensions: ['json'],\n                        savetype: 'text',\n                        content: generateFile()\n                    });\n                }\n            });\n\n            MenuBar.addAction(button, \"file.export\");\n        },\n        onunload(){\n            button.delete();\n        }\n    });\n\n    function generateFile(){\n        let data = [];\n        for (let cube of Cube.all) {\n            const formattedLines = cube.getGlobalVertexPositions().map(point => point.map(value => value / 16.0));\n            const convertedVertices = [\n                [formattedLines[2], formattedLines[3], formattedLines[6], formattedLines[7]],\n                [formattedLines[0], formattedLines[1], formattedLines[4], formattedLines[5]]\n            ]\n\n            for (let convertedVertex of convertedVertices) {\n                for (let edge of createHorizontalEdges(convertedVertex)) {\n                    let topFace = []\n                    topFace.push(...edge[0])\n                    topFace.push(...edge[1])\n                    if (!data.includes(topFace)) {\n                        data.push(topFace)\n                    }\n                }\n                data.push(null)\n            }\n\n            for (let edge of createVerticalEdges(convertedVertices[0], convertedVertices[1])) {\n                let topFace = []\n                topFace.push(...edge[0])\n                topFace.push(...edge[1])\n                if (!data.includes(topFace)) {\n                    data.push(topFace)\n                }\n            }\n            data.push(null)\n        }\n        data.pop()\n        // The json is formatted below like this so its easier to read as each \"section\" will be seperated by a newline.\n        let output = `{\\n    \"lines\": [\\n`\n        for (let datum of data) {\n            if (datum == null) {\n                output += `\\n`\n            } else {\n                output += `        [${datum[0]}, ${datum[1]}, ${datum[2]}, ${datum[3]}, ${datum[4]}, ${datum[5]}],\\n`\n            }\n        }\n        return output.substr(0, output.length - 2) + `\\n    ]\\n}`;\n    }\n\n    function createHorizontalEdges(vertices) {\n        return [[vertices[2], vertices[3]], [vertices[2], vertices[1]], [vertices[1], vertices[0]], [vertices[3], vertices[0]]]\n    }\n\n    function createVerticalEdges(top, bottom) {\n        return [[bottom[3], top[3]], [bottom[2], top[2]], [bottom[1], top[1]], [bottom[0], top[0]]]\n    }\n\n})();"
  },
  {
    "path": "plugins/hytale_avatar_loader/LICENSE.MD",
    "content": "MIT License\n\nCopyright (c) 2026 PasteDev\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/hytale_avatar_loader/about.md",
    "content": "<div id=\"about-content\">\n  <p>A Blockbench plugin for <strong>Hytale</strong> that loads complete avatar models with automatic texture processing and gradient map application.</p>\n  <h3>Features:</h3>\n  <ul>\n    <li>Automatic avatar loading from local Hytale JSON files or crafthead.net</li>\n    <li>Automatic gradient map application to grayscale textures</li>\n    <li>Preserves existing colors (like gold details) while applying gradients only to grayscale areas</li>\n    <li>Processes all avatar components (skin, hair, eyes, clothing, accessories) in one operation</li>\n    <li>Automatic import of default Hytale character animations</li>\n  </ul>\n  <h3>Usage:</h3>\n  <ol>\n    <li>Open Blockbench and ensure you're using the Hytale Character format</li>\n    <li>Go to <strong>File → Import → Load Hytale Avatar</strong></li>\n    <li>Select your avatar JSON file from the CachedPlayerSkins folder</li>\n    <li>Or <strong>File → Import → Load Hytale Avatar from URL</strong></li>\n    <li>Select the extracted Assets folder when prompted</li>\n    <li>To change the Assets folder locations:</li>\n    <li>Go to <strong>File → Preferences → Change Hytale Assets Folder</li>\n  </ol>\n  <p><strong>Note:</strong> The plugin requires file system access permissions to function properly.</p>\n  <div style=\"flex: 1;\"></div>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n  }\n  #about-content > img {\n    width: 100%;\n    object-fit: contain;\n    margin: 10px 0 12px;\n    padding: 0 16px;\n    filter: drop-shadow(0 3px 10px #0006);\n    pointer-events: none;\n    user-select: none;\n    image-rendering: auto;\n  }\n  .author-links {\n    display: flex;\n    gap: 16px;\n    padding: 20px;\n    border-top: 1px solid var(--color-border);\n    background: var(--color-background);\n  }\n  .author-link {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    padding: 12px 20px;\n    background: var(--color-background);\n    border: 1px solid var(--color-border);\n    border-radius: 8px;\n    text-decoration: none;\n    flex: 1;\n    justify-content: center;\n    outline: none !important;\n    box-shadow: none !important;\n  }\n  .author-link:focus,\n  .author-link:active,\n  .author-link:focus-visible {\n    outline: none !important;\n    box-shadow: none !important;\n    border-color: var(--color-border) !important;\n  }\n  .author-link i {\n    font-size: 24px;\n    width: 24px;\n    height: 24px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  .author-link.website i {\n    color: #33E38E;\n  }\n  .author-link.twitter i {\n    color: #1DA1F2;\n  }\n  .author-link span {\n    font-size: 14px;\n    color: var(--color-text);\n    font-weight: 500;\n  }\n</style>\n<div class=\"author-links\">\n  <a href=\"https://pastelito.dev/\" class=\"author-link website\">\n    <i class=\"fa_big icon fa-regular fa-copy\"></i>\n    <span>Website</span>\n  </a>\n  <a href=\"https://x.com/MrPastelitoo_\" class=\"author-link twitter\">\n    <i class=\"fa_big icon fa-brands fa-x-twitter\"></i>\n    <span>X (Twitter)</span>\n  </a>\n</div>\n"
  },
  {
    "path": "plugins/hytale_avatar_loader/changelog.json",
    "content": "{\n    \"1.0.0\": {\n        \"title\": \"1.0.0\",\n        \"date\": \"2026-01-16\",\n        \"author\": \"PasteDev\",\n        \"categories\": [\n            {\n                \"title\": \"Features\",\n                \"list\": [\n                    \"Initial release of Hytale Avatar Loader\",\n                    \"Load complete Hytale avatars from JSON files\",\n                    \"Automatic gradient map processing for greyscale textures\",\n                    \"Smart color preservation - maintains existing colors (like gold accents) while applying gradient maps\",\n                    \"Batch processing of all avatar components (skin, hair, eyes, clothing, accessories)\",\n                    \"Timestamped temporary folders to prevent overwriting when loading multiple avatars\",\n                    \"Support for all Hytale avatar components including body characteristics, haircuts, eyes, facial features, clothing, and accessories\",\n                    \"Automatic detection of material types and appropriate gradient set application\",\n                    \"Face and ear textures automatically use body characteristic skin color\"\n                ]\n            }\n        ]\n    },\n    \"1.1.0\": {\n        \"title\": \"1.1.0\",\n        \"date\": \"2026-01-18\",\n        \"author\": \"PasteDev\",\n        \"categories\": [\n            {\n                \"title\": \"Features\",\n                \"list\": [\n                    \"Automatic animation import from Assets\\\\Common\\\\Characters\\\\Animations\\\\Default\",\n                    \"Imports all default Hytale character animations (excluding FPS variants)\"\n                ]\n            }\n        ]\n    },\n    \"1.1.1\": {\n        \"title\": \"1.1.1\",\n        \"date\": \"2026-01-22\",\n        \"author\": \"PasteDev\",\n        \"categories\": [\n            {\n                \"title\": \"Improvements\",\n                \"list\": [\n                    \"Added Resolve Textures action for texture groups tied to avatar collections\",\n                    \"Resolve button now appears only when groups exist and hides after resolving\",\n                    \"UI and texture handling refactors to reduce duplicated logic\"\n                ]\n            }\n        ]\n    },\n    \"1.1.2\": {\n        \"title\": \"1.1.2\",\n        \"date\": \"2026-02-04\",\n        \"author\": \"PasteDev\",\n        \"categories\": [\n            {\n                \"title\": \"Fixes\",\n                \"list\": [\n                    \"Ensure avatar collections always show in the outliner\",\n                    \"Prevent duplicate Resolve Textures buttons in the textures toolbar\",\n                    \"Normalize bone offsets on attachment import for correct positioning\",\n                    \"Support for Hytale Models plugin v0.7.0\"\n                ]\n            }\n        ]\n    },\n    \"1.2.0\": {\n        \"title\": \"1.2.0\",\n        \"date\": \"2026-02-04\",\n        \"author\": \"KevinLWorthington\",\n        \"categories\": [\n            {\n                \"title\": \"Download Avatar from crafthead.net\",\n                \"list\": [\n                    \"Added ability to fetch avatars directly from crafthead.net by username\",\n                    \"Asset path is now saved using LocalStorage\",\n                    \"Asset path can be changed in File > Preferences > Change Hytale Assets Folder\"\n                ]\n            }\n        ]\n    }\n}"
  },
  {
    "path": "plugins/hytale_avatar_loader/hytale_avatar_loader.js",
    "content": "let loadAction;\nlet loadFromUrlAction;\nlet changeAssetsFolderAction;\nlet resolveTexturesAction;\n\nconst links = {\n  website: {\n    text: \"By Pastelito\",\n    link: \"https://pastelito.dev/\",\n    icon: \"far.fa-copy\",\n    colour: \"#33E38E\"\n  },\n  twitter: {\n    text: \"Twitter\",\n    link: \"https://x.com/MrPastelitoo_\",\n    icon: \"fab.fa-x-twitter\",\n    colour: \"#1DA1F2\"\n  }\n}\n\nPlugin.register('hytale_avatar_loader', {\n    title: 'Hytale Avatar Loader',\n    author: 'PasteDev',\n    description: 'Loads Hytale avatar models with textures and colors from local JSON files or from crafthead.net',\n    icon: 'icon.png',\n    version: '1.2.0',\n    min_version: '5.0.7',\n    variant: 'desktop',\n    tags: ['Hytale'],\n    website: \"https://pastelito.dev\",\n    creation_date: \"2026-01-16\",\n    onload() {\n        if (window.hytaleAvatarLoaderInitialized) return;\n        window.hytaleAvatarLoaderInitialized = true;\n\n        Blockbench.addCSS(`\n            .action_load_avatar .icon {\n                filter: brightness(1.2) contrast(1.1) !important;\n            }\n        `);\n        \n        const loadAvatarIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwAQMAAABtzGvEAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAAZQTFRFAAAAAAAApWe5zwAAAAJ0Uk5TAP9bkSK1AAAAj0lEQVR4nI3PQQ6CUAwE0KkkskRPwE3waOrN0HuY2Bv8sCAujDjTSkBX/s1Lmml/a+DrrgZUt9ZIPWzPK8bNhTQFon6sYVGRQx9MENUT4BQmRHuPIhPieIL6GCT2CpSHG/O74taUab/AbhXVjV806z+++7QR9MP8rfgsEZsRreZ5ClHU8xTPUzxPWRqSuMjfxpJZMWa9gqsAAAAASUVORK5CYII=';\n        \n        loadAction = new Action('load_avatar', {\n            name: 'Load Hytale Avatar',\n            description: 'Loads a complete Hytale avatar from a JSON file',\n            icon: loadAvatarIcon,\n            condition: {formats: ['hytale_character']},\n            click: function() {\n                \n                function expandPath(path) {\n                    if (path.includes('%appdata%')) {\n                        try {\n                            const appDataPath = SystemInfo.appdata_directory || '';\n                            return path.replace(/%appdata%/gi, appDataPath);\n                        } catch (err) {\n                            return path;\n                        }\n                    }\n                    return path;\n                }\n                \n                function getPathModule() {\n                    try {\n                        return requireNativeModule('path');\n                    } catch (err) {\n                        try {\n                            return require('path');\n                        } catch (e) {\n                            return null;\n                        }\n                    }\n                }\n                \n                const pathModule = getPathModule();\n                if (!pathModule) {\n                    Blockbench.showMessageBox({\n                        title: 'Error',\n                        message: 'Could not load path module. This plugin requires the desktop version of Blockbench.',\n                        buttons: ['OK']\n                    });\n                    return;\n                }\n                \n                const pathJoin = pathModule.join;\n                const skinFolderPath = expandPath('%appdata%\\\\Hytale\\\\UserData\\\\CachedPlayerSkins');\n                \n                Blockbench.showMessageBox({\n                    title: 'Select Avatar JSON File',\n                    message: '**Step 1: Select your avatar JSON file**\\n\\n' +\n                             'Navigate to the following folder and select your avatar JSON file:\\n\\n' +\n                             '📁 `%appdata%\\\\Hytale\\\\UserData\\\\CachedPlayerSkins`\\n\\n' +\n                             'The JSON file contains all your avatar customizations.',\n                    buttons: ['OK']\n                }, () => {\n                    Blockbench.import({\n                        type: 'json',\n                        extensions: ['json'],\n                        multiple: false,\n                        title: 'Select Avatar JSON File',\n                        startpath: skinFolderPath\n                    }, async (files) => {\n                        if (!files || files.length === 0) return;\n                        \n                        const jsonFile = files[0];\n                        let avatarData;\n                        \n                        try {\n                            if (jsonFile.content) {\n                                avatarData = JSON.parse(jsonFile.content);\n                            } else {\n                                throw new Error('Could not read file content');\n                            }\n                        } catch (err) {\n                            Blockbench.showMessageBox({\n                                title: 'Error',\n                                message: `Error reading JSON file: ${err.message}`,\n                                buttons: ['OK']\n                            });\n                            return;\n                        }\n                        \n                        const cachedAssetsPath = localStorage.getItem('hytale_assets_path');\n                        \n                        if (cachedAssetsPath) {\n                            loadAvatar(avatarData, cachedAssetsPath).catch((err) => {\n                                Blockbench.showMessageBox({\n                                    title: 'Error',\n                                    message: `Error loading avatar: ${err.message}`,\n                                    buttons: ['OK']\n                                });\n                            });\n                        } else {\n                            const assetsZipPath = expandPath('%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest');\n                            \n                            Blockbench.showMessageBox({\n                                title: 'Select Assets Folder',\n                                message: '**Step 2: Select the extracted Assets folder**\\n\\n' +\n                                         '**Instructions:**\\n\\n' +\n                                         '1. Extract `Assets.zip` from:\\n' +\n                                         '   📁 `%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest`\\n\\n' +\n                                         '2. Navigate to the extracted Assets folder\\n\\n' +\n                                         '3. Select the Assets folder when prompted\\n\\n' +\n                                         '⚠️ **Important:** You must extract Assets.zip first before selecting the folder.\\n\\n' +\n                                         'This path will be saved for future use.',\n                                buttons: ['OK']\n                            }, () => {\n                                if (typeof Blockbench.pickDirectory === 'function') {\n                                    const assetsDir = Blockbench.pickDirectory({\n                                        title: 'Select Assets Folder (extracted)',\n                                        resource_id: 'avatar_assets_folder'\n                                    });\n                                    \n                                    if (!assetsDir) {\n                                        Blockbench.showMessageBox({\n                                            title: 'Error',\n                                            message: 'You must select the Assets folder',\n                                            buttons: ['OK']\n                                        });\n                                        return;\n                                    }\n                                    \n                                    localStorage.setItem('hytale_assets_path', assetsDir);\n                                    \n                                    loadAvatar(avatarData, assetsDir).catch((err) => {\n                                        Blockbench.showMessageBox({\n                                            title: 'Error',\n                                            message: `Error loading avatar: ${err.message}`,\n                                            buttons: ['OK']\n                                        });\n                                    });\n                                }\n                            });\n                        }\n                    });\n                });\n            }\n        });\n        \n        loadFromUrlAction = new Action('load_avatar_from_url', {\n            name: 'Load Hytale Avatar with Username',\n            description: 'Loads a Hytale avatar from crafthead.net',\n            icon: 'cloud_download',\n            condition: {formats: ['hytale_character']},\n            click: async function() {\n                function expandPath(path) {\n                    if (path.includes('%appdata%')) {\n                        try {\n                            const appDataPath = SystemInfo.appdata_directory || '';\n                            return path.replace(/%appdata%/gi, appDataPath);\n                        } catch (err) {\n                            return path;\n                        }\n                    }\n                    return path;\n                }\n                \n                const username = await new Promise((resolve) => {\n                    const dialog = new Dialog({\n                        id: 'hytale_username_dialog',\n                        title: 'Load Avatar from Crafthead',\n                        form: {\n                            username: {label: 'Username', type: 'text', value: ''}\n                        },\n                        onConfirm(formData) {\n                            dialog.hide();\n                            resolve(formData.username);\n                        },\n                        onCancel() {\n                            dialog.hide();\n                            resolve(null);\n                        }\n                    });\n                    dialog.show();\n                });\n                \n                if (!username || !username.trim()) {\n                    Blockbench.showMessageBox({\n                        title: 'No Username',\n                        message: 'Please enter a username to load.',\n                        buttons: ['OK']\n                    });\n                    return;\n                }\n                \n                try {\n                    Blockbench.showStatusMessage('Fetching avatar data...', 2000);\n                    const url = `https://crafthead.net/hytale/profile/${encodeURIComponent(username.trim())}`;\n                    \n                    const response = await fetch(url);\n                    if (!response.ok) {\n                        throw new Error(`Failed to fetch avatar: ${response.status} ${response.statusText}`);\n                    }\n                    \n                    const data = await response.json();\n                    \n                    // Extract the skin data from the crafthead response\n                    const avatarData = data.skin || data;\n                    \n                    if (!avatarData || typeof avatarData !== 'object') {\n                        throw new Error('Invalid avatar data received from server');\n                    }\n                    \n                    const cachedAssetsPath = localStorage.getItem('hytale_assets_path');\n                    \n                    if (cachedAssetsPath) {\n                        loadAvatar(avatarData, cachedAssetsPath).catch((err) => {\n                            Blockbench.showMessageBox({\n                                title: 'Error',\n                                message: `Error loading avatar: ${err.message}`,\n                                buttons: ['OK']\n                            });\n                        });\n                    } else {\n                        const assetsZipPath = expandPath('%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest');\n                        \n                        Blockbench.showMessageBox({\n                            title: 'Select Assets Folder',\n                            message: '**Select the extracted Assets folder**\\n\\n' +\n                                     '**Instructions:**\\n\\n' +\n                                     '1. Extract `Assets.zip` from:\\n' +\n                                     '   📁 `%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest`\\n\\n' +\n                                     '2. Navigate to the extracted Assets folder\\n\\n' +\n                                     '3. Select the Assets folder when prompted\\n\\n' +\n                                     '⚠️ **Important:** You must extract Assets.zip first before selecting the folder.\\n\\n' +\n                                     'This path will be saved for future use.',\n                            buttons: ['OK']\n                        }, () => {\n                            if (typeof Blockbench.pickDirectory === 'function') {\n                                const assetsDir = Blockbench.pickDirectory({\n                                    title: 'Select Assets Folder (extracted)',\n                                    resource_id: 'avatar_assets_folder'\n                                });\n                                \n                                if (!assetsDir) {\n                                    Blockbench.showMessageBox({\n                                        title: 'Error',\n                                        message: 'You must select the Assets folder',\n                                        buttons: ['OK']\n                                    });\n                                    return;\n                                }\n                                \n                                localStorage.setItem('hytale_assets_path', assetsDir);\n                                \n                                loadAvatar(avatarData, assetsDir).catch((err) => {\n                                    Blockbench.showMessageBox({\n                                        title: 'Error',\n                                        message: `Error loading avatar: ${err.message}`,\n                                        buttons: ['OK']\n                                    });\n                                });\n                            }\n                        });\n                    }\n                } catch (err) {\n                    Blockbench.showMessageBox({\n                        title: 'Error Loading Avatar',\n                        message: `Failed to load avatar from URL: ${err.message}`,\n                        buttons: ['OK']\n                    });\n                    console.error('Error loading avatar from URL:', err);\n                }\n            }\n        });\n        \n        changeAssetsFolderAction = new Action('change_hytale_assets_folder', {\n            name: 'Change Hytale Assets Folder',\n            description: 'Change the location of the Hytale assets folder',\n            icon: 'folder_open',\n            condition: {formats: ['hytale_character']},\n            click: function() {\n                function expandPath(path) {\n                    if (path.includes('%appdata%')) {\n                        try {\n                            const appDataPath = SystemInfo.appdata_directory || '';\n                            return path.replace(/%appdata%/gi, appDataPath);\n                        } catch (err) {\n                            return path;\n                        }\n                    }\n                    return path;\n                }\n                function wrapPathForMessage(path, maxLength) {\n                    if (!path || !maxLength) return path;\n                    const parts = path.split('\\\\');\n                    const lines = [];\n                    let currentLine = '';\n                    for (const part of parts) {\n                        const nextLine = currentLine ? `${currentLine}\\\\${part}` : part;\n                        if (nextLine.length > maxLength && currentLine) {\n                            lines.push(currentLine);\n                            currentLine = part;\n                        } else {\n                            currentLine = nextLine;\n                        }\n                    }\n                    if (currentLine) lines.push(currentLine);\n                    return lines.join('\\n');\n                }\n                \n                const currentPath = localStorage.getItem('hytale_assets_path');\n                const assetsZipPath = expandPath('%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest');\n                const displayCurrentPath = currentPath ? wrapPathForMessage(currentPath, 48) : '';\n                \n                const message = currentPath \n                    ? `**Current Assets Folder:**\\n${displayCurrentPath}\\n\\n**Instructions:**\\n\\n1. Extract \\`Assets.zip\\` from:\\n   📁 \\`%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest\\`\\n\\n2. Select the extracted Assets folder when prompted`\n                    : '**Instructions:**\\n\\n1. Extract `Assets.zip` from:\\n   📁 `%appdata%\\\\Hytale\\\\install\\\\release\\\\package\\\\game\\\\latest`\\n\\n2. Select the extracted Assets folder when prompted';\n                \n                Blockbench.showMessageBox({\n                    title: 'Change Assets Folder',\n                    message: message,\n                    buttons: ['OK']\n                }, () => {\n                    if (typeof Blockbench.pickDirectory === 'function') {\n                        const assetsDir = Blockbench.pickDirectory({\n                            title: 'Select Assets Folder (extracted)',\n                            resource_id: 'avatar_assets_folder'\n                        });\n                        \n                        if (!assetsDir) {\n                            return;\n                        }\n                        \n                        localStorage.setItem('hytale_assets_path', assetsDir);\n                        \n                        Blockbench.showMessageBox({\n                            title: 'Success',\n                            message: `Assets folder updated to:\\n${wrapPathForMessage(assetsDir, 48)}`,\n                            buttons: ['OK']\n                        });\n                    }\n                });\n            }\n        });\n        \n        MenuBar.addAction(loadAction, 'file.import');\n        MenuBar.addAction(loadFromUrlAction, 'file.import');\n        MenuBar.addAction(changeAssetsFolderAction, 'file.preferences');\n        \n        function getTextureGroupsFromCollections() {\n            if (typeof Collection === 'undefined' || !Collection.all || typeof TextureGroup === 'undefined' || !TextureGroup.all) return [];\n            const groups = [];\n            for (const collection of Collection.all) {\n                const group = TextureGroup.all.find(tg => tg.name === collection.name);\n                if (group) groups.push(group);\n            }\n            return groups;\n        }\n        \n        function getTexturesFromGroups(groups) {\n            if (!groups || groups.length === 0) return [];\n            const textures = [];\n            for (const group of groups) {\n                const groupTextures = typeof group.getTextures === 'function'\n                    ? group.getTextures()\n                    : Texture.all.filter(t => t.group === group.uuid);\n                textures.push(...groupTextures);\n            }\n            return textures.filter(Boolean);\n        }\n        \n        function resolveMissingTextures() {\n            const collectionGroups = getTextureGroupsFromCollections();\n            if (!collectionGroups || collectionGroups.length === 0) {\n                Blockbench.showMessageBox({\n                    title: 'Resolve Textures',\n                    message: 'No texture groups were found.',\n                    buttons: ['OK']\n                });\n                return;\n            }\n            const groupTextures = getTexturesFromGroups(collectionGroups);\n            Undo.initEdit({ textures: groupTextures, texture_groups: collectionGroups });\n            for (const group of collectionGroups) {\n                const textures = typeof group.getTextures === 'function'\n                    ? group.getTextures()\n                    : Texture.all.filter(t => t.group === group.uuid);\n                group.remove();\n                for (const texture of textures) {\n                    texture.group = '';\n                }\n            }\n            Undo.finishEdit('Resolve texture groups');\n            Blockbench.showStatusMessage('Resolved texture groups', 3000);\n            if (typeof BARS !== 'undefined' && typeof BARS.updateConditions === 'function') {\n                BARS.updateConditions();\n            }\n        }\n        \n        if (typeof BarItems !== 'undefined' && BarItems.resolve_textures_hytale_avatar) {\n            BarItems.resolve_textures_hytale_avatar.delete();\n        }\n        resolveTexturesAction = new Action('resolve_textures_hytale_avatar', {\n            name: 'Resolve Textures',\n            description: 'Resolve missing texture paths',\n            icon: 'fa-leaf',\n            category: 'textures',\n            condition: () => getTextureGroupsFromCollections().length > 0,\n            click: resolveMissingTextures\n        });\n        resolveTexturesAction.uniqueNode = true;\n        \n        function addResolveButtonToTexturesToolbar() {\n            const texturesPanel = Panels.textures || Interface?.Panels?.textures;\n            const panelToolbar = texturesPanel?.toolbars?.[0];\n            const listToolbar = (typeof Toolbars !== 'undefined' && Toolbars.texturelist) ? Toolbars.texturelist : null;\n            const toolbar = panelToolbar || listToolbar;\n            if (!toolbar) return false;\n            const actionId = resolveTexturesAction?.id || 'resolve_textures_hytale_avatar';\n            const removeDuplicates = (tb) => {\n                if (!tb || !tb.children) return;\n                const dupes = tb.children.filter(child => child && child.id === actionId);\n                for (const child of dupes) {\n                    tb.remove(child, false);\n                }\n                tb.remove(resolveTexturesAction, false);\n            };\n            removeDuplicates(panelToolbar);\n            removeDuplicates(listToolbar);\n            if (!toolbar.children.includes(resolveTexturesAction)) {\n                toolbar.add(resolveTexturesAction, 3);\n            }\n            return true;\n        }\n        \n        let resolveToolbarAttempts = 0;\n        const resolveToolbarInterval = setInterval(() => {\n            if (addResolveButtonToTexturesToolbar() || resolveToolbarAttempts > 50) {\n                clearInterval(resolveToolbarInterval);\n            }\n            resolveToolbarAttempts++;\n        }, 200);\n    },\n    onunload() {\n        if (loadAction) loadAction.delete();\n        if (loadFromUrlAction) loadFromUrlAction.delete();\n        if (changeAssetsFolderAction) changeAssetsFolderAction.delete();\n        if (resolveTexturesAction) resolveTexturesAction.delete();\n        window.hytaleAvatarLoaderInitialized = false;\n    }\n});\n\nfunction getPath() {\n    if (typeof require !== 'undefined') {\n        try {\n            return require('path');\n        } catch (err) {\n        }\n    }\n    return null;\n}\n\nfunction parseJsonFile(file) {\n    if (file && file.content) {\n        try {\n            return JSON.parse(file.content);\n        } catch (err) {\n        }\n    }\n    return null;\n}\n\nfunction ensureDir(fsSync, dir) {\n    if (!fsSync.existsSync(dir)) {\n        fsSync.mkdirSync(dir, { recursive: true });\n    }\n}\n\nfunction getRelativePathFromCommon(texturePath, commonPath) {\n    let relativePath = texturePath;\n    if (relativePath.startsWith(commonPath)) {\n        relativePath = relativePath.substring(commonPath.length);\n        if (relativePath.startsWith('/') || relativePath.startsWith('\\\\')) {\n            relativePath = relativePath.substring(1);\n        }\n    }\n    return relativePath;\n}\n\nfunction getOutputPathFromTexture(texturePath, commonPath, tempDir, pathJoin) {\n    const normalizedPath = getRelativePathFromCommon(texturePath, commonPath).replace(/\\\\/g, '/');\n    const pathParts = normalizedPath.split('/').filter(p => p);\n    const fileName = pathParts.pop();\n    const outputDir = pathJoin(tempDir, ...pathParts);\n    const outputPath = pathJoin(outputDir, fileName);\n    return { outputDir, outputPath };\n}\n\nfunction updateTextureUv(texture) {\n    if (!texture) return;\n    let width = texture.width;\n    let height = texture.height;\n    if ((!width || !height) && texture.img && texture.img.width && texture.img.height) {\n        width = texture.img.width;\n        height = texture.img.height;\n        texture.width = width;\n        texture.height = height;\n    }\n    if (width && height) {\n        if (texture.uv_width !== width || texture.uv_height !== height) {\n            texture.uv_width = width;\n            texture.uv_height = height;\n        }\n    }\n}\n\nfunction scheduleTextureUvUpdates(textures, delays, postUpdate) {\n    const run = () => {\n        for (const tex of textures) {\n            updateTextureUv(tex);\n        }\n        if (postUpdate) postUpdate();\n    };\n    for (const delay of delays) {\n        setTimeout(run, delay);\n    }\n}\n\nasync function loadAvatar(avatarData, assetsBasePath) {\n    try {\n        Blockbench.showStatusMessage('Loading avatar...', 2000);\n        \n        if (Format.id !== 'hytale_character') {\n            if (typeof Format.select === 'function') {\n                Format.select('hytale_character');\n                await new Promise(resolve => setTimeout(resolve, 500));\n            }\n        }\n        \n        if (typeof Project.newProject === 'function') {\n            Project.newProject('hytale_character');\n            await new Promise(resolve => setTimeout(resolve, 300));\n        }\n        \n        if (Project.name !== undefined) {\n            Project.name = 'Avatar';\n        }\n        \n        const path = getPath();\n        if (!path) {\n            Blockbench.showMessageBox({\n                title: 'Error',\n                message: 'Path module is not available. This plugin requires the desktop version of Blockbench.',\n                buttons: ['OK']\n            });\n            return;\n        }\n        \n        const pathJoin = path.join;\n        const fs = requireNativeModule('fs');\n        \n        function findAssetsPath(basePath) {\n            const normalizedPath = basePath.replace(/\\\\/g, '/');\n            \n            if (normalizedPath.endsWith('Assets') || normalizedPath.endsWith('Assets/')) {\n                return basePath;\n            }\n            \n            if (normalizedPath.includes('Assets/') || normalizedPath.includes('Assets\\\\')) {\n                const assetsIndex = Math.max(normalizedPath.lastIndexOf('Assets/'), normalizedPath.lastIndexOf('Assets\\\\'));\n                if (assetsIndex !== -1) {\n                    const assetsPath = basePath.substring(0, assetsIndex + 'Assets'.length);\n                    const cosmeticsPath = pathJoin(assetsPath, 'Cosmetics', 'CharacterCreator');\n                    if (fs.existsSync(cosmeticsPath)) {\n                        return assetsPath;\n                    }\n                }\n            }\n            \n            const possiblePaths = [\n                pathJoin(basePath, 'Assets'),\n                pathJoin(basePath, '..', 'Assets'),\n                pathJoin(basePath, '..', '..', 'Assets'),\n                pathJoin(basePath, '..', '..', '..', 'Assets')\n            ];\n            \n            for (const possiblePath of possiblePaths) {\n                if (fs.existsSync(possiblePath)) {\n                    const cosmeticsPath = pathJoin(possiblePath, 'Cosmetics', 'CharacterCreator');\n                    if (fs.existsSync(cosmeticsPath)) {\n                        return possiblePath;\n                    }\n                }\n            }\n            \n            return null;\n        }\n        \n        const actualAssetsPath = findAssetsPath(assetsBasePath);\n        if (!actualAssetsPath) {\n            Blockbench.showMessageBox({\n                title: 'Error: Assets Folder Not Found',\n                message: `**Could not find the Assets folder**\\n\\n` +\n                         `**Selected path:**\\n\\`${assetsBasePath}\\`\\n\\n` +\n                         `**Please verify:**\\n\\n` +\n                         `• You selected the extracted Assets folder (not the zip file)\\n` +\n                         `• The folder contains: \\`Cosmetics\\\\CharacterCreator\\\\\\`\\n` +\n                         `• The folder contains: \\`Common\\\\\\`\\n\\n` +\n                         `The Assets folder should be extracted from Assets.zip.`,\n                buttons: ['OK']\n            });\n            return;\n        }\n        \n        const characterCreatorPath = pathJoin(actualAssetsPath, 'Cosmetics', 'CharacterCreator');\n        \n        if (!fs.existsSync(characterCreatorPath)) {\n            Blockbench.showMessageBox({\n                title: 'Error: CharacterCreator Folder Not Found',\n                message: `**Could not find CharacterCreator folder**\\n\\n` +\n                         `**Assets path:**\\n\\`${actualAssetsPath}\\`\\n\\n` +\n                         `**Expected path:**\\n\\`${characterCreatorPath}\\`\\n\\n` +\n                         `Please verify that the Assets folder is correctly extracted from Assets.zip.`,\n                buttons: ['OK']\n            });\n            return;\n        }\n        \n        const mappingFiles = {\n            'haircut': 'Haircuts.json',\n            'pants': 'Pants.json',\n            'overpants': 'Overpants.json',\n            'undertop': 'Undertops.json',\n            'overtop': 'Overtops.json',\n            'shoes': 'Shoes.json',\n            'headAccessory': 'HeadAccessory.json',\n            'faceAccessory': 'FaceAccessory.json',\n            'earAccessory': 'EarAccessory.json',\n            'gloves': 'Gloves.json',\n            'cape': 'Capes.json',\n            'face': 'Faces.json',\n            'eyes': 'Eyes.json',\n            'eyebrows': 'Eyebrows.json',\n            'facialHair': 'FacialHair.json',\n            'bodyCharacteristic': 'BodyCharacteristics.json',\n            'ears': 'Ears.json',\n            'mouth': 'Mouths.json',\n            'underwear': 'Underwear.json'\n        };\n        \n        const mappingFilePaths = [];\n        for (const [key, fileName] of Object.entries(mappingFiles)) {\n            const filePath = pathJoin(characterCreatorPath, fileName);\n            mappingFilePaths.push(filePath);\n        }\n        \n        const hairColorsPath = pathJoin(characterCreatorPath, 'HairColors.json');\n        const eyeColorsPath = pathJoin(characterCreatorPath, 'EyeColors.json');\n        const genericColorsPath = pathJoin(characterCreatorPath, 'GenericColors.json');\n        const gradientSetsPath = pathJoin(characterCreatorPath, 'GradientSets.json');\n        \n        Blockbench.read([hairColorsPath, eyeColorsPath, genericColorsPath, gradientSetsPath, ...mappingFilePaths], { readtype: 'text' }, (files) => {\n            const mappings = {};\n            const parsedFiles = files.map(parseJsonFile);\n            const hairColors = parsedFiles[0];\n            const eyeColors = parsedFiles[1];\n            const genericColors = parsedFiles[2];\n            const gradientSets = parsedFiles[3];\n            \n            const mappingKeys = Object.keys(mappingFiles);\n            for (let i = 0; i < mappingKeys.length; i++) {\n                const mappingData = parsedFiles[i + 4];\n                if (mappingData) {\n                    mappings[mappingKeys[i]] = mappingData;\n                }\n            }\n            \n            if (Object.keys(mappings).length === 0) {\n                Blockbench.showMessageBox({\n                    title: 'Error: Mapping Files Not Found',\n                    message: `**Could not load mapping files**\\n\\n` +\n                             `**Searched path:**\\n\\`${characterCreatorPath}\\`\\n\\n` +\n                             `**Please verify:**\\n\\n` +\n                             `• The Assets folder contains \\`Cosmetics\\\\CharacterCreator\\\\\\`\\n` +\n                             `• The CharacterCreator folder contains JSON mapping files\\n` +\n                             `• The Assets folder was correctly extracted from Assets.zip`,\n                    buttons: ['OK']\n                });\n                return;\n            }\n            \n            continueLoadingAvatar(avatarData, actualAssetsPath, mappings, pathJoin, hairColors, eyeColors, genericColors, gradientSets);\n        });\n    } catch (err) {\n        throw err;\n    }\n}\n\nfunction getGradientSetForField(field, item, gradientSets, variantItem = null, itemId = null) {\n    if (!gradientSets || !Array.isArray(gradientSets)) {\n        return null;\n    }\n    const findSet = (id) => gradientSets.find(gs => gs.Id === id);\n    \n    const fieldToGradientSet = {\n        'bodyCharacteristic': 'Skin',\n        'haircut': 'Hair',\n        'eyebrows': 'Hair',\n        'eyes': 'Eyes_Gradient',\n        'facialHair': 'Hair'\n    };\n    \n    const gradientSetId = fieldToGradientSet[field];\n    if (gradientSetId) {\n        const found = findSet(gradientSetId);\n        if (found) return found;\n    }\n    \n    const itemToUse = variantItem || item;\n    \n    if (itemToUse && itemToUse.GradientSet) {\n        const found = findSet(itemToUse.GradientSet);\n        if (found) return found;\n    }\n    \n    if (itemToUse && itemToUse.MaterialType) {\n        const found = findSet(itemToUse.MaterialType);\n        if (found) return found;\n    }\n    \n    const clothingFields = new Set([\n        'undertop', 'overtop', 'pants', 'overpants', 'shoes', 'gloves', 'cape',\n        'headAccessory', 'faceAccessory', 'earAccessory', 'underwear'\n    ]);\n    \n    if (clothingFields.has(field)) {\n        \n        const checkGradientSet = (searchText) => {\n            const lowerText = searchText.toLowerCase();\n            const matchers = [\n                ['Colored_Cotton', (t) => t.includes('colored_cotton') || t.includes('coloredcotton') || t.includes('colored_')],\n                ['Shiny_Fabric', (t) => t.includes('shiny_fabric') || t.includes('shinyfabric')],\n                ['Fantasy_Cotton', (t) => t.includes('fantasy_cotton') || t.includes('fantasycotton') || (t.includes('fantasy') && !t.includes('dark'))],\n                ['Pastel_Cotton', (t) => t.includes('pastel_cotton') || t.includes('pastelcotton') || t.includes('pastel')],\n                ['Faded_Leather', (t) => t.includes('faded_leather') || t.includes('fadedleather') || t.includes('leather')],\n                ['Flashy_Synthetic', (t) => t.includes('flashy_synthetic') || t.includes('flashysynthetic') || t.includes('synthetic')],\n                ['Jean_Generic', (t) => t.includes('jean') || t.includes('jeans') || t.includes('denim')],\n                ['Fantasy_Cotton_Dark', (t) => t.includes('dark_fantasy') || t.includes('darkfantasy')],\n                ['Ornamented_Metal', (t) => t.includes('ornamented_metal') || t.includes('ornamentedmetal') || t.includes('metal')],\n                ['Rotten_Fabric', (t) => t.includes('rotten_fabric') || t.includes('rottenfabric')]\n            ];\n            for (const [id, test] of matchers) {\n                if (test(lowerText)) return findSet(id);\n            }\n            return null;\n        };\n        \n        const greyscaleTexture = itemToUse ? itemToUse.GreyscaleTexture : null;\n        const itemIdToCheck = itemId || (item ? item.Id : null);\n        \n        if (greyscaleTexture) {\n            const textureGradient = checkGradientSet(greyscaleTexture);\n            if (textureGradient) {\n                return textureGradient;\n            }\n        }\n        \n        if (itemIdToCheck) {\n            const itemGradient = checkGradientSet(itemIdToCheck);\n            if (itemGradient) {\n                return itemGradient;\n            }\n        }\n        \n        const defaultGradientSet = gradientSets.find(gs => gs.Id === 'Colored_Cotton');\n        if (defaultGradientSet) {\n            return defaultGradientSet;\n        }\n    }\n    \n    return null;\n}\n\nfunction applyGradientMap(baseImagePath, gradientMapPath, outputPath, fs, pathJoin) {\n    return new Promise((resolve, reject) => {\n        try {\n            const fsSync = requireNativeModule('fs');\n            const baseBuffer = fsSync.readFileSync(baseImagePath);\n            const gradientBuffer = fsSync.readFileSync(gradientMapPath);\n            \n            const baseBlob = new Blob([baseBuffer], { type: 'image/png' });\n            const gradientBlob = new Blob([gradientBuffer], { type: 'image/png' });\n            \n            const baseUrl = URL.createObjectURL(baseBlob);\n            const gradientUrl = URL.createObjectURL(gradientBlob);\n            \n            const baseCanvas = document.createElement('canvas');\n            const baseCtx = baseCanvas.getContext('2d');\n            const baseImg = new Image();\n            \n            baseImg.onload = () => {\n                baseCanvas.width = baseImg.width;\n                baseCanvas.height = baseImg.height;\n                baseCtx.drawImage(baseImg, 0, 0);\n                const baseImageData = baseCtx.getImageData(0, 0, baseCanvas.width, baseCanvas.height);\n                \n                const gradientCanvas = document.createElement('canvas');\n                const gradientCtx = gradientCanvas.getContext('2d');\n                const gradientImg = new Image();\n                \n                gradientImg.onload = () => {\n                    gradientCanvas.width = 256;\n                    gradientCanvas.height = 1;\n                    gradientCtx.drawImage(gradientImg, 0, 0, 256, 1);\n                    const gradientMapData = gradientCtx.getImageData(0, 0, 256, 1);\n                    \n                    const outputCanvas = document.createElement('canvas');\n                    const outputCtx = outputCanvas.getContext('2d');\n                    outputCanvas.width = baseCanvas.width;\n                    outputCanvas.height = baseCanvas.height;\n                    const outputImageData = outputCtx.createImageData(baseCanvas.width, baseCanvas.height);\n                    \n                    const isColorfulTexture = baseImagePath.toLowerCase().includes('colorful.png');\n                    const basePathLower = baseImagePath.toLowerCase().replace(/\\\\/g, '/');\n                    const isSkinTexture = basePathLower.includes('player_textures') || \n                                         basePathLower.includes('faces') || \n                                         basePathLower.includes('ears') ||\n                                         basePathLower.includes('mouths') ||\n                                         basePathLower.includes('makeup') ||\n                                         basePathLower.includes('cosmetics/head') ||\n                                         basePathLower.includes('earring');\n                    const grayscaleThreshold = 1;\n                    const whiteThreshold = 255;\n                    \n                    for (let i = 0; i < baseImageData.data.length; i += 4) {\n                        const r = baseImageData.data[i];\n                        const g = baseImageData.data[i + 1];\n                        const b = baseImageData.data[i + 2];\n                        const a = baseImageData.data[i + 3];\n                        \n                        const minChannel = Math.min(r, g, b);\n                        const maxChannel = Math.max(r, g, b);\n                        const avgChannel = (r + g + b) / 3;\n                        const isWhite = minChannel >= whiteThreshold && avgChannel >= whiteThreshold;\n                        \n                        if (isColorfulTexture) {\n                            const luminance = Math.round(\n                                r * 0.299 + \n                                g * 0.587 + \n                                b * 0.114\n                            );\n                            \n                            if (luminance >= whiteThreshold) {\n                                outputImageData.data[i] = 255;\n                                outputImageData.data[i + 1] = 255;\n                                outputImageData.data[i + 2] = 255;\n                                outputImageData.data[i + 3] = a;\n                            } else {\n                            const gradientIndex = Math.min(255, Math.max(0, luminance)) * 4;\n                            \n                            outputImageData.data[i] = gradientMapData.data[gradientIndex];\n                            outputImageData.data[i + 1] = gradientMapData.data[gradientIndex + 1];\n                            outputImageData.data[i + 2] = gradientMapData.data[gradientIndex + 2];\n                            outputImageData.data[i + 3] = a;\n                            }\n                        } else {\n                            if (isWhite && !isSkinTexture) {\n                                outputImageData.data[i] = r;\n                                outputImageData.data[i + 1] = g;\n                                outputImageData.data[i + 2] = b;\n                                outputImageData.data[i + 3] = a;\n                            } else {\n                            const isGrayscale = (maxChannel - minChannel) <= grayscaleThreshold;\n                            \n                            if (isGrayscale) {\n                                const luminance = Math.round(\n                                    r * 0.299 + \n                                    g * 0.587 + \n                                    b * 0.114\n                                );\n                                \n                                const gradientIndex = Math.min(255, Math.max(0, luminance)) * 4;\n                                \n                                outputImageData.data[i] = gradientMapData.data[gradientIndex];\n                                outputImageData.data[i + 1] = gradientMapData.data[gradientIndex + 1];\n                                outputImageData.data[i + 2] = gradientMapData.data[gradientIndex + 2];\n                                outputImageData.data[i + 3] = a;\n                            } else {\n                                outputImageData.data[i] = r;\n                                outputImageData.data[i + 1] = g;\n                                outputImageData.data[i + 2] = b;\n                                outputImageData.data[i + 3] = a;\n                                }\n                            }\n                        }\n                    }\n                    \n                    outputCtx.putImageData(outputImageData, 0, 0);\n                    \n                    outputCanvas.toBlob((blob) => {\n                        URL.revokeObjectURL(baseUrl);\n                        URL.revokeObjectURL(gradientUrl);\n                        \n                        if (!blob) {\n                            reject(new Error('Failed to create blob from canvas'));\n                            return;\n                        }\n                        \n                        const reader = new FileReader();\n                        reader.onload = () => {\n                            try {\n                                const pathModule = requireNativeModule('path');\n                                const outputDir = pathModule.dirname(outputPath);\n                                \n                                if (!fsSync.existsSync(outputDir)) {\n                                    fsSync.mkdirSync(outputDir, { recursive: true });\n                                }\n                                \n                                const buffer = Buffer.from(reader.result);\n                                fsSync.writeFileSync(outputPath, buffer);\n                                resolve();\n                            } catch (err) {\n                                reject(err);\n                            }\n                        };\n                        reader.onerror = () => {\n                            reject(new Error('Failed to read blob'));\n                        };\n                        reader.readAsArrayBuffer(blob);\n                    }, 'image/png');\n                };\n                \n                gradientImg.onerror = () => {\n                    URL.revokeObjectURL(baseUrl);\n                    URL.revokeObjectURL(gradientUrl);\n                    reject(new Error('Failed to load gradient image'));\n                };\n                \n                gradientImg.src = gradientUrl;\n            };\n            \n            baseImg.onerror = () => {\n                URL.revokeObjectURL(baseUrl);\n                URL.revokeObjectURL(gradientUrl);\n                reject(new Error('Failed to load base image'));\n            };\n            \n            baseImg.src = baseUrl;\n        } catch (err) {\n            reject(err);\n        }\n    });\n}\n\nasync function processTexturesWithGradientMaps(itemInfo, assetsBasePath, gradientSets, mappings, pathJoin, fs) {\n    const parentDir = pathJoin(assetsBasePath, '..');\n    const baseTempDir = pathJoin(parentDir, 'temp_avatar_loader');\n    \n    const timestamp = new Date().toISOString().replace(/[:.]/g, '-').replace('T', '_').substring(0, 19);\n    const tempDir = pathJoin(baseTempDir, timestamp);\n    \n    try {\n        ensureDir(fs, baseTempDir);\n        ensureDir(fs, tempDir);\n    } catch (err) {\n        throw new Error(`Failed to create temp directory: ${err.message}`);\n    }\n    \n    const processedTextures = new Map();\n    let processedCount = 0;\n    let skippedCount = 0;\n    let bodyCharacteristicColor = null;\n    \n    for (const info of itemInfo) {\n        if (info.field === 'bodyCharacteristic' && info.color) {\n            bodyCharacteristicColor = info.color;\n        }\n        \n        if (!info.texturePath) {\n            skippedCount++;\n            continue;\n        }\n        \n        if (!fs.existsSync(info.texturePath)) {\n            skippedCount++;\n            continue;\n        }\n        \n        if (!info.color) {\n            const item = info.item || (info.field !== 'bodyCharacteristic' && mappings[info.field] ? mappings[info.field].find(i => i.Id === info.itemId) : null);\n            const variantItem = info.variantItem;\n            const itemToUse = variantItem || item;\n            \n            let gradientSetToUse = null;\n            let colorToUse = null;\n            \n            if (itemToUse && itemToUse.GradientSet) {\n                gradientSetToUse = gradientSets.find(gs => gs.Id === itemToUse.GradientSet);\n                if (gradientSetToUse && bodyCharacteristicColor) {\n                    colorToUse = bodyCharacteristicColor;\n                }\n            } else if ((info.field === 'face' || info.field === 'ears') && bodyCharacteristicColor) {\n                gradientSetToUse = gradientSets.find(gs => gs.Id === 'Skin');\n                colorToUse = bodyCharacteristicColor;\n            }\n            \n            if (gradientSetToUse && colorToUse && gradientSetToUse.Gradients && gradientSetToUse.Gradients[colorToUse]) {\n                const gradient = gradientSetToUse.Gradients[colorToUse];\n                const gradientMapPath = pathJoin(assetsBasePath, 'Common', gradient.Texture);\n                \n                if (fs.existsSync(gradientMapPath) && fs.existsSync(info.texturePath)) {\n                    const commonPath = pathJoin(assetsBasePath, 'Common');\n                    const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin);\n                    \n                        try {\n                        ensureDir(fs, outputDir);\n                        await applyGradientMap(info.texturePath, gradientMapPath, outputPath, fs, pathJoin);\n                        info.texturePath = outputPath;\n                        processedTextures.set(info.texturePath, outputPath);\n                        processedCount++;\n                    } catch (err) {\n                    }\n                    continue;\n                }\n            }\n            \n            const commonPath = pathJoin(assetsBasePath, 'Common');\n            const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin);\n            \n            try {\n                ensureDir(fs, outputDir);\n                const fsSync = requireNativeModule('fs');\n                fsSync.copyFileSync(info.texturePath, outputPath);\n                info.texturePath = outputPath;\n                processedTextures.set(info.texturePath, outputPath);\n                processedCount++;\n            } catch (err) {\n            }\n            continue;\n        }\n        \n        const item = info.item || (info.field !== 'bodyCharacteristic' && mappings[info.field] ? mappings[info.field].find(i => i.Id === info.itemId) : null);\n        const variantItem = info.variantItem;\n        \n        const gradientSet = getGradientSetForField(info.field, item, gradientSets, variantItem, info.itemId);\n        if (!gradientSet || !gradientSet.Gradients) {\n            skippedCount++;\n            continue;\n        }\n        \n        const gradient = gradientSet.Gradients[info.color];\n        if (!gradient || !gradient.Texture) {\n            skippedCount++;\n            continue;\n        }\n        \n        const gradientMapPath = pathJoin(assetsBasePath, 'Common', gradient.Texture);\n        \n        if (!fs.existsSync(gradientMapPath)) {\n            skippedCount++;\n            continue;\n        }\n        \n        if (!fs.existsSync(info.texturePath)) {\n            skippedCount++;\n            continue;\n        }\n        \n        const commonPath = pathJoin(assetsBasePath, 'Common');\n        const { outputDir, outputPath } = getOutputPathFromTexture(info.texturePath, commonPath, tempDir, pathJoin);\n        \n        try {\n            ensureDir(fs, outputDir);\n            await applyGradientMap(info.texturePath, gradientMapPath, outputPath, fs, pathJoin);\n            \n            info.texturePath = outputPath;\n            processedTextures.set(info.texturePath, outputPath);\n            processedCount++;\n        } catch (err) {\n            if (err.message && err.message.includes('No image processing library')) {\n                throw err;\n            }\n        }\n    }\n    \n    return processedTextures;\n}\n\nasync function continueLoadingAvatar(avatarData, assetsBasePath, mappings, pathJoin, hairColors, eyeColors, genericColors, gradientSets) {\n    try {\n        const loadOrder = [\n            'bodyCharacteristic',\n            'underwear',\n            'pants',\n            'undertop',\n            'overtop',\n            'overpants',\n            'shoes',\n            'face',\n            'eyes',\n            'eyebrows',\n            'mouth',\n            'ears',\n            'haircut',\n            'facialHair',\n            'headAccessory',\n            'faceAccessory',\n            'earAccessory',\n            'gloves',\n            'cape'\n        ];\n        \n        const modelPaths = [];\n        const texturePaths = [];\n        const itemInfo = [];\n        \n        for (const field of loadOrder) {\n            const value = avatarData[field];\n            if (!value) continue;\n            \n            const { itemId, color, variant } = parseValue(value);\n            \n            if (field === 'bodyCharacteristic') {\n                const commonPath = pathJoin(assetsBasePath, 'Common');\n                \n                const modelPath = pathJoin(commonPath, 'Characters', 'Player.blockymodel');\n                modelPaths.push(modelPath);\n                \n                let texturePath = null;\n                \n                if (itemId === 'Muscular') {\n                    texturePath = pathJoin(commonPath, 'Characters', 'Player_Textures', 'Player_Muscular_Greyscale.png');\n                } else if (itemId === 'Default') {\n                    texturePath = pathJoin(commonPath, 'Characters', 'Player_Textures', 'Player_Greyscale.png');\n                }\n                \n                itemInfo.push({ field, itemId, color, variant, modelPath, texturePath, item: null, variantItem: null });\n                if (texturePath) {\n                    texturePaths.push(texturePath);\n                }\n                continue;\n            }\n            \n            const mapping = mappings[field];\n            if (!mapping) {\n                continue;\n            }\n            \n            const item = mapping.find(i => i.Id === itemId);\n            if (!item) {\n                continue;\n            }\n            \n            let modelPath = null;\n            let texturePath = null;\n            \n            if (variant && item.Variants && item.Variants[variant]) {\n                const variantItem = item.Variants[variant];\n                modelPath = variantItem.Model;\n                \n                if (variantItem.Textures && typeof variantItem.Textures === 'object' && !Array.isArray(variantItem.Textures) && color) {\n                    if (variantItem.Textures[color]) {\n                        texturePath = variantItem.Textures[color].Texture;\n                    } else {\n                        const availableColors = Object.keys(variantItem.Textures);\n                        if (availableColors.length > 0) {\n                            texturePath = variantItem.Textures[availableColors[0]].Texture;\n                        }\n                    }\n                }\n                if (!texturePath && variantItem.GreyscaleTexture) {\n                    texturePath = variantItem.GreyscaleTexture;\n                }\n            } else {\n                modelPath = item.Model;\n                \n                if (item.Textures && typeof item.Textures === 'object' && !Array.isArray(item.Textures) && color) {\n                    if (item.Textures[color]) {\n                        texturePath = item.Textures[color].Texture;\n                    } else {\n                        const availableColors = Object.keys(item.Textures);\n                        if (availableColors.length > 0) {\n                            texturePath = item.Textures[availableColors[0]].Texture;\n                        }\n                    }\n                }\n                if (!texturePath && item.GreyscaleTexture) {\n                    texturePath = item.GreyscaleTexture;\n                }\n            }\n            \n            if (modelPath) {\n                const commonPath = pathJoin(assetsBasePath, 'Common');\n                \n                const fullModelPath = pathJoin(commonPath, modelPath);\n                modelPaths.push(fullModelPath);\n                const fullTexturePath = texturePath ? pathJoin(commonPath, texturePath) : null;\n                let variantItem = null;\n                if (variant && item.Variants && item.Variants[variant]) {\n                    variantItem = item.Variants[variant];\n                }\n                \n                itemInfo.push({ \n                    field, \n                    itemId, \n                    color, \n                    variant, \n                    modelPath: fullModelPath, \n                    texturePath: fullTexturePath,\n                    item: item,\n                    variantItem: variantItem\n                });\n                if (texturePath) {\n                    texturePaths.push(fullTexturePath);\n                }\n            }\n        }\n        \n        const fs = requireNativeModule('fs');\n        \n        if (gradientSets && fs) {\n            try {\n                await processTexturesWithGradientMaps(itemInfo, assetsBasePath, gradientSets, mappings, pathJoin, fs);\n                Blockbench.showStatusMessage('Gradientmaps processed successfully', 2000);\n            } catch (err) {\n                Blockbench.showStatusMessage(`Error processing gradientmaps: ${err.message}`, 3000);\n            }\n        }\n        \n        Blockbench.read(modelPaths, { readtype: 'text' }, async (modelFiles) => {\n            await loadAllModels(modelFiles, itemInfo, pathJoin, assetsBasePath);\n        });\n    } catch (err) {\n        throw err;\n    }\n}\n\nfunction parseValue(value) {\n    const parts = value.split('.');\n    const itemId = parts[0];\n    let color = null;\n    let variant = null;\n    \n    if (parts.length === 2) {\n        color = parts[1];\n    } else if (parts.length === 3) {\n        color = parts[1];\n        variant = parts[2];\n    } else if (parts.length > 3) {\n        color = parts[1];\n        variant = parts.slice(2).join('.');\n    }\n    \n    return { itemId, color, variant };\n}\n\nfunction normalizeBoneOffsets(nodes) {\n    if (!Array.isArray(nodes)) return;\n    for (const node of nodes) {\n        if (!node) continue;\n        if (node.shape && node.shape.type === 'none' && node.shape.offset) {\n            node.shape.offset = { x: 0, y: 0, z: 0 };\n        }\n        if (node.children && Array.isArray(node.children)) {\n            normalizeBoneOffsets(node.children);\n        }\n    }\n}\n\nasync function loadAllModels(modelFiles, itemInfo, pathJoin, assetsBasePath) {\n    const isMainModel = (field) => field === 'bodyCharacteristic';\n    \n    for (let i = 0; i < modelFiles.length && i < itemInfo.length; i++) {\n        const modelFile = modelFiles[i];\n        const info = itemInfo[i];\n        \n        if (!modelFile || !modelFile.content) {\n            continue;\n        }\n        \n        try {\n            const modelData = JSON.parse(modelFile.content);\n            const texturePath = info.texturePath;\n            \n            if (isMainModel(info.field)) {\n                await loadMainModel(modelData, texturePath, modelFile.path, info);\n            } else {\n                await loadAttachmentModel(modelData, texturePath, modelFile.path, info);\n            }\n        } catch (err) {\n        }\n    }\n    \n    try {\n        if (typeof Canvas.updateView === 'function' && Project.root) {\n            Canvas.updateView();\n        }\n        await loadAnimations(pathJoin, assetsBasePath);\n        Blockbench.showStatusMessage('Avatar loaded successfully', 3000);\n    } catch (err) {\n        Blockbench.showStatusMessage('Avatar processed', 3000);\n    }\n}\n\nasync function loadAnimations(pathJoin, assetsBasePath) {\n    try {\n        const fs = requireNativeModule('fs');\n        if (!fs) return;\n        \n        const animationsPath = pathJoin(assetsBasePath, 'Common', 'Characters', 'Animations', 'Default');\n        \n        if (!fs.existsSync(animationsPath)) {\n            return;\n        }\n        \n        const files = fs.readdirSync(animationsPath);\n        const animationFiles = files.filter(file => \n            file.endsWith('.blockyanim') && !file.endsWith('_FPS.blockyanim')\n        );\n        \n        if (animationFiles.length === 0) {\n            return;\n        }\n        \n        const animationPaths = animationFiles.map(file => pathJoin(animationsPath, file));\n        \n        Blockbench.read(animationPaths, { readtype: 'text' }, (files) => {\n            for (const file of files) {\n                if (!file || !file.content) continue;\n                try {\n                    const content = JSON.parse(file.content);\n                    parseAnimationFile(file, content);\n                } catch (err) {\n                    console.error(`Error parsing animation ${file.path}:`, err);\n                }\n            }\n        });\n    } catch (err) {\n        console.error('Error loading animations:', err);\n    }\n}\n\nfunction parseAnimationFile(file, content) {\n    const FPS = 60;\n    const Animation = window.Animation;\n    \n    if (!Animation) {\n        console.error('Animation class not available');\n        return;\n    }\n    \n    function pathToName(path, includeExtension) {\n        if (typeof window.pathToName === 'function') {\n            return window.pathToName(path, includeExtension);\n        }\n        const parts = (path || '').split(/[/\\\\]/);\n        const fileName = parts[parts.length - 1] || '';\n        if (includeExtension) {\n            return fileName;\n        }\n        return fileName.replace(/\\.[^.]*$/, '');\n    }\n    \n    const animation = new Animation({\n        name: pathToName(file.name || file.path, false),\n        length: content.duration / FPS,\n        loop: content.holdLastKeyframe ? \"hold\" : \"loop\",\n        path: file.path,\n        snapping: FPS\n    });\n    \n    const quaternion = new THREE.Quaternion();\n    const euler = new THREE.Euler(0, 0, 0, \"ZYX\");\n    \n    for (const name in content.nodeAnimations) {\n        const anim_data = content.nodeAnimations[name];\n        const group_name = name;\n        const group = Group.all.find((g) => g.name == group_name);\n        const uuid = group ? group.uuid : guid();\n        const ba = new BoneAnimator(uuid, animation, group_name);\n        animation.animators[uuid] = ba;\n        \n        const anim_channels = [\n            { channel: \"rotation\", keyframes: anim_data.orientation },\n            { channel: \"position\", keyframes: anim_data.position },\n            { channel: \"scale\", keyframes: anim_data.shapeStretch },\n            { channel: \"visibility\", keyframes: anim_data.shapeVisible }\n        ];\n        \n        for (const { channel, keyframes } of anim_channels) {\n            if (!keyframes || keyframes.length == 0) continue;\n            for (const kf_data of keyframes) {\n                let data_point;\n                if (channel == \"visibility\") {\n                    data_point = {\n                        visibility: kf_data.delta\n                    };\n                } else {\n                    const delta = kf_data.delta;\n                    if (channel == \"rotation\") {\n                        quaternion.set(delta.x, delta.y, delta.z, delta.w);\n                        euler.setFromQuaternion(quaternion.normalize(), \"ZYX\");\n                        data_point = {\n                            x: Math.radToDeg(euler.x),\n                            y: Math.radToDeg(euler.y),\n                            z: Math.radToDeg(euler.z)\n                        };\n                    } else {\n                        data_point = {\n                            x: delta.x,\n                            y: delta.y,\n                            z: delta.z\n                        };\n                    }\n                }\n                ba.addKeyframe({\n                    time: kf_data.time / FPS,\n                    channel,\n                    interpolation: kf_data.interpolationType == \"smooth\" ? \"catmullrom\" : \"linear\",\n                    data_points: [data_point]\n                });\n            }\n        }\n    }\n    \n    animation.add(false);\n    if (!Animation.selected && Animator.open) {\n        animation.select();\n    }\n}\n\nfunction loadMainModel(modelData, texturePath, filePath, info) {\n    if (!modelData || !modelData.nodes || !Array.isArray(modelData.nodes)) {\n        return;\n    }\n    \n    if (typeof Codecs === 'undefined' || !Codecs.blockymodel) {\n        return;\n    }\n    \n    try {\n        const content = Codecs.blockymodel.parse(modelData, filePath, {});\n        \n        if (!content || !content.new_groups) {\n            return;\n        }\n        \n        let texturesToUse = [];\n        \n        if (texturePath) {\n            try {\n                let existingTexture = Texture.all.find(t => t.path === texturePath);\n                if (existingTexture) {\n                    updateTextureUv(existingTexture);\n                    texturesToUse.push(existingTexture);\n                } else {\n                    const texture = new Texture().fromPath(texturePath).add(false, true);\n                    scheduleTextureUvUpdates([texture], [100, 300, 500, 1000], () => {\n                        if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') {\n                            Canvas.updateAllFaces();\n                        }\n                    });\n                    texturesToUse.push(texture);\n                }\n            } catch (err) {\n            }\n        }\n        \n        if (content.new_textures && content.new_textures.length > 0) {\n            if (texturePath) {\n                for (const tex of content.new_textures) {\n                    if (tex.path !== texturePath && typeof tex.remove === 'function') {\n                        tex.remove(true);\n                    } else if (tex.path === texturePath) {\n                        updateTextureUv(tex);\n                        if (texturesToUse.length === 0) {\n                            texturesToUse.push(tex);\n                        }\n                    }\n                }\n            } else {\n                for (const tex of content.new_textures) {\n                    updateTextureUv(tex);\n                }\n                if (texturesToUse.length === 0) {\n                    texturesToUse = content.new_textures;\n                }\n            }\n        }\n        \n        scheduleTextureUvUpdates(texturesToUse, [300, 600, 1000], () => {\n            if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') {\n                Canvas.updateAllFaces();\n            }\n        });\n        \n        if (texturesToUse.length > 0) {\n            const primaryTexture = texturesToUse[0];\n            \n            const existingDefault = Texture.all.find(t => t.use_as_default);\n            if (existingDefault && existingDefault !== primaryTexture) {\n                existingDefault.use_as_default = false;\n            }\n            \n            primaryTexture.use_as_default = true;\n            if (typeof primaryTexture.setAsDefaultTexture === 'function') {\n                primaryTexture.setAsDefaultTexture();\n            }\n            \n            if (typeof Cube !== 'undefined' && Cube.all) {\n                const primaryTextureUuid = primaryTexture.uuid;\n                for (const cube of Cube.all) {\n                    for (const faceKey of ['north', 'south', 'east', 'west', 'up', 'down']) {\n                        if (cube.faces && cube.faces[faceKey]) {\n                            const face = cube.faces[faceKey];\n                            if (face.texture === null || face.texture === undefined) {\n                                face.texture = primaryTextureUuid;\n                            }\n                        }\n                    }\n                }\n            }\n            \n            setTimeout(() => {\n                try {\n                    if (typeof Canvas !== 'undefined' && Canvas) {\n                    if (typeof Canvas.updateAllFaces === 'function') {\n                        Canvas.updateAllFaces(primaryTexture);\n                    }\n                        if (typeof Canvas.updateView === 'function' && Canvas.viewport) {\n                        Canvas.updateView();\n                    }\n                    if (typeof Canvas.updateSelection === 'function') {\n                        Canvas.updateSelection();\n                    }\n                    }\n                } catch (err) {\n                }\n            }, 300);\n        }\n    } catch (err) {\n    }\n}\n\nfunction loadAttachmentModel(modelData, texturePath, filePath, info) {\n    if (!modelData || !modelData.nodes || !Array.isArray(modelData.nodes)) {\n        return;\n    }\n    \n    if (typeof Codecs === 'undefined' || !Codecs.blockymodel) {\n        return;\n    }\n    \n    const collectionName = info.itemId;\n    const attachmentName = collectionName;\n    \n    try {\n        normalizeBoneOffsets(modelData.nodes);\n        const content = Codecs.blockymodel.parse(modelData, filePath, {attachment: attachmentName});\n        \n        if (!content || !content.new_groups) {\n            return;\n        }\n        \n        const newGroups = content.new_groups;\n        const rootGroups = newGroups.filter(group => !newGroups.includes(group.parent));\n        \n        if (rootGroups.length === 0) {\n            return;\n        }\n        \n        if (content.new_textures && content.new_textures.length > 0) {\n            for (const tex of content.new_textures) {\n                if (texturePath && tex.path !== texturePath && typeof tex.remove === 'function') {\n                    tex.remove(true);\n                }\n            }\n        }\n        \n        const collection = new Collection({\n            name: collectionName,\n            children: rootGroups.map(g => g.uuid),\n            export_codec: 'blockymodel',\n            visibility: true\n        });\n        collection.add();\n        collection.export_path = filePath;\n        \n        let texturesToProcess = [];\n        \n        if (texturePath) {\n            try {\n                let existingTexture = Texture.all.find(t => t.path === texturePath);\n                if (existingTexture) {\n                    updateTextureUv(existingTexture);\n                    texturesToProcess.push(existingTexture);\n                } else {\n                    const texture = new Texture().fromPath(texturePath).add(false);\n                    scheduleTextureUvUpdates([texture], [100, 300, 500, 1000], () => {\n                        if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') {\n                            Canvas.updateAllFaces();\n                        }\n                    });\n                    texturesToProcess.push(texture);\n                }\n            } catch (err) {\n            }\n        } else if (content.new_textures && content.new_textures.length > 0) {\n            const matchingTexture = content.new_textures.find(t => t.path === texturePath);\n            if (matchingTexture) {\n                updateTextureUv(matchingTexture);\n                texturesToProcess = [matchingTexture];\n            } else {\n                const firstTexture = content.new_textures[0];\n                updateTextureUv(firstTexture);\n                texturesToProcess = [firstTexture];\n            }\n        }\n        \n        if (texturesToProcess.length > 0) {\n            let textureGroup = TextureGroup.all.find(tg => tg.name === attachmentName);\n            if (!textureGroup) {\n                textureGroup = new TextureGroup({ name: attachmentName });\n                textureGroup.folded = true;\n                textureGroup.add();\n            }\n            \n            for (const tex of texturesToProcess) {\n                tex.group = textureGroup.uuid;\n                updateTextureUv(tex);\n            }\n            \n            scheduleTextureUvUpdates(texturesToProcess, [300, 600, 1000], () => {\n                if (typeof Canvas !== 'undefined' && typeof Canvas.updateAllFaces === 'function') {\n                    Canvas.updateAllFaces();\n                }\n            });\n            \n            let texture = texturesToProcess.find(t => t.name && t.name.startsWith(attachmentName)) || texturesToProcess[0];\n            if (texture && texture.uuid) {\n                collection.texture = texture.uuid;\n            }\n        }\n        \n        Canvas.updateAllFaces();\n    } catch (err) {\n    }\n}\n"
  },
  {
    "path": "plugins/hytale_bridge/about.md",
    "content": "<span style=\"color:#ba372a\"><strong>This plugin is intended to be used with the <em>Blockbench Bridge</em> Hytale plugin installed. You cannot connect to Hytale without it. You can install it [here on CurseForge](https://www.curseforge.com/hytale/mods/bbb).</strong></span>\n\nHytale Bridge allows to edit Hytale's Common assets (`.blockymodel` & `.png` files specifically) without leaving Blockbench, even on remote servers!\n\nYou can connect to Hytale by running `/blockbench` in the console or as a player with the correct permissions in your server. You will receive an authorisation key which you can input alongside the server's connection address to form a bridge and sync all files!\n\nOnce connected, you'll see all of the asset packs installed on your world, including all of their Common files. You're then free to open any model/texture into blockbench or save any of your creations into your own asset packs. Folder creation/management is also supported, so just Blockbench can manage your entire Common directory!\n\n<sup>Note this plugin is still in beta and some minor bugs are to be expected. I have many more ideas on how to further improve this project, and I'd love to hear all of your thoughts and feedback.</sup>\n\n### Usage\n1. Go to the Hytale File Browser Panel > click on Connect to Hytale\n2. Input the server address and the key provided by Hytale to connect.\n3. Left/Right click folders and files to interact\n4. Request files at any time by going to File > Request Hytale Files"
  },
  {
    "path": "plugins/hytale_bridge/changelog.json",
    "content": "{\n    \"0.1.0\": {\n        \"title\": \"0.1.0\",\n        \"date\": \"2026-02-10\",\n        \"author\": \"Tazer\",\n        \"categories\": [\n            {\n                \"title\": \"Features\",\n                \"list\": [\n                    \"Initial release!\"\n                ]\n            }\n        ]\n    },\n    \"0.1.1\": {\n        \"title\": \"0.1.1\",\n        \"date\": \"2026-02-22\",\n        \"author\": \"Tazer\",\n        \"categories\": [\n            {\n                \"title\": \"Changes\",\n                \"list\": [\n                    \"Changed default port in connection dialog to 5520, to match Hytale's\",\n                    \"Updated some descriptions to match the Hytale plugin better\"\n                ]\n            }\n        ]\n    }\n}"
  },
  {
    "path": "plugins/hytale_bridge/hytale_bridge.js",
    "content": "let net, fs;\nlet requestFileTreeAction, connectToHytaleAction;\nlet panel, menu;\nlet usedAddress = 'localhost:5520';\n\nconst bridgeState = {\n    client: null,\n    uuid: null,\n    buffer: ''\n};\n\nconst MESSAGES = {\n    CREATE: 'create',\n    COMMAND: 'command',\n    CREATED: 'created',\n    FILE_TREE: 'fileTree',\n    FILE: 'file',\n    UPDATE: 'update'\n};\n\nconst COMMANDS = {\n    FILE_TREE: 'fileTree',\n    FILE: 'file',\n    SAVE: 'save',\n    RENAME_FOLDER: 'renameFolder',\n    DELETE_FOLDER: 'deleteFolder',\n    RENAME_FILE: 'renameFile',\n    DELETE_FILE: 'deleteFile',\n    DISCONNECT: 'disconnect'\n};\n\nconst EXTENSIONS = {\n    MODEL: '.blockymodel',\n    TEXTURE: '.png'\n}\n\nfunction is(name, extension) {\n    return name.endsWith(extension);\n}\n\nBBPlugin.register(\"hytale_bridge\", {\n    title: \"Hytale Bridge\",\n    author: \"Tazer\",\n    icon: \"icon.png\",\n    version: \"0.1.1\",\n    description: \"A Hytale/Blockbench plugin that bridges the two together seamlessly and effortlessly\",\n    tags: [\"Hytale\"],\n    dependencies: [\"hytale_plugin\"],\n    variant: \"desktop\",\n    min_version: \"5.0.7\",\n    creation_date: \"2026-02-10\",\n    await_loading: true,\n    has_changelog: true,\n    repository: \"https://github.com/tazercopter/Hytale-Blockbench-Bridge\",\n    bug_tracker: \"https://github.com/tazercopter/Hytale-Blockbench-Bridge/issues\",\n    onload() {\n        createPanel();\n\n        net = require('net', {\n            message: \"This permission is required to connect to the remote Hytale server socket.\",\n            optional: false\n        })\n\n        fs = require('fs', {\n            message: \"This permission is required to access stored files and encode their data when uploading.\",\n            optional: false\n        })\n\n        requestFileTreeAction = new Action('request_file_tree', {\n            name: 'Request Hytale Files',\n            icon: 'cloud_download',\n            click() {\n                if (bridgeState.client) requestFileTree();\n            }\n        });\n        MenuBar.addAction(requestFileTreeAction, 'file');\n        connectToHytaleAction = new Action('connect_to_hytale', {\n            name: 'Connect to Hytale',\n            icon: 'add',\n            click() {\n                menu.connect();\n            }\n        });\n        MenuBar.addAction(connectToHytaleAction, 'file');\n    },\n    onunload() {\n        if (panel) panel.delete();\n        if (requestFileTreeAction) requestFileTreeAction.delete();\n        if (connectToHytaleAction) connectToHytaleAction.delete();\n        if (bridgeState.client) {\n            sendDisconnect();\n            bridgeState.client.end();\n        }\n    }\n});\n\nfunction createPanel() {\n    panel = new Panel({\n        id: 'hytale_file_browser',\n        name: 'Hytale File Browser',\n        icon: 'folder_open',\n        resizable: true,\n        growable: true,\n        expand_button: true, \n        default_side: 'left',\n        default_position: {\n            slot: 'left_bar',\n            float_position: [0, 0],\n            float_size: [300, 800],\n            height: 400,\n        },\n        component: {\n            template: `\n            <div ref=\"treeScroll\"\n                style=\"padding:8px;overflow-y:auto;height:100%\"\n                @click=\"hideContextMenu\"\n                @scroll=\"saveScrollPosition\"\n                @contextmenu.prevent=\"onPanelRightClick($event)\">\n\n                <button @click=\"toggleConnection\" style=\"width:100%;margin-bottom:8px\">\n                    {{ connected ? 'Disconnect from Hytale' : 'Connect to Hytale' }}\n                </button>\n\n                <select v-if=\"packNames.length\"\n                        v-model=\"selectedPack\"\n                        @change=\"onPackChange\"\n                        style=\"width:100%;margin-bottom:8px\">\n                    <option v-for=\"p in packNames\" :value=\"p\">{{ p }}</option>\n                </select>\n\n                <div v-for=\"n in renderNodes\"\n                    :key=\"n.path\"\n                    @click.stop=\"onNodeClick(n)\"\n                    @contextmenu.prevent.stop=\"onNodeRightClick(n,$event)\"\n                    :style=\"{\n                        paddingLeft:(n.level*16)+'px',\n                        fontWeight:n.type==='folder'?'bold':'normal',\n                        cursor:'pointer'\n                    }\">\n                    {{ n.type==='folder'\n                        ? (n.expanded ? '📂' : '📁')\n                        : (n.fileType==='png'\n                            ? '🖼️'\n                            : n.fileType==='blockymodel'\n                                ? '🧊'\n                                : '📄')\n                    }}\n                    {{ n.name }}\n                </div>\n\n                <div v-if=\"contextMenu.visible\"\n                    :style=\"{\n                        position:'fixed',\n                        top:contextMenu.y+'px',\n                        left:contextMenu.x+'px',\n                        background:'#2b2b2b',\n                        border:'1px solid #444',\n                        borderRadius:'4px',\n                        zIndex:9999,\n                        minWidth:'160px'\n                    }\">\n\n                    <div v-for=\"item in contextMenu.options\"\n                        @click.stop=\"item.action(); hideContextMenu()\"\n                        :style=\"{\n                            padding:'6px 12px',\n                            cursor:'pointer',\n                            whiteSpace:'nowrap'\n                        }\"\n                        @mouseenter=\"$event.target.style.background='#3a3a3a'\"\n                        @mouseleave=\"$event.target.style.background='transparent'\">\n                        {{ item.label }}\n                    </div>\n                </div>\n            </div>\n            `,\n            data() {\n                return {\n                    connected: false,\n                    packs: {},\n                    packNames: [],\n                    selectedPack: null,\n                    renderNodes: [],\n                    packData: {},\n                    contextMenu: {}\n                };\n            },\n            methods: {\n                toggleConnection() {\n                    if (this.connected) {\n                        sendDisconnect();\n                        bridgeState.client.end();\n                    } else {\n                        this.connect();\n                    }\n                },\n                connect() {\n                    new Dialog({\n                        title: 'Connect',\n                        form: {\n                            address: { label: 'Address', type: 'text', value: usedAddress },\n                            key: { label: 'Key', type: 'text', value: '' }\n                        },\n                        onConfirm: (formData) => {\n                            usedAddress = formData.address;\n                            connectToSocket(formData);\n                        }\n                    }).show();\n                },\n                getPackState(pack) {\n                    if (!this.packData[pack]) {\n                        this.packData[pack] = {\n                            expanded: new Set(),\n                            scroll: 0\n                        };\n                    }\n                    return this.packData[pack];\n                },\n                saveScrollPosition() {\n                    const el = this.$refs.treeScroll;\n                    if (!el || !this.selectedPack) return;\n                    this.getPackState(this.selectedPack).scroll = el.scrollTop;\n                },\n                restoreScrollPosition() {\n                    const el = this.$refs.treeScroll;\n                    if (!el || !this.selectedPack) return;\n                    el.scrollTop = this.getPackState(this.selectedPack).scroll || 0;\n                },\n                onPackChange() {\n                    this.rebuildTree();\n                },\n                updateFileTrees(newPacks) {\n                    this.packs = newPacks;\n                    this.packNames = Object.keys(newPacks);\n                    // mark disconnected when no packs\n                    this.connected = this.packNames.length > 0;\n\n                    if (!this.packNames.includes(this.selectedPack)) {\n                        this.selectedPack = this.packNames[0];\n                    }\n\n                    this.rebuildTree();\n                },\n                rebuildTree() {\n                    this.renderNodes = [];\n                    const pack = this.packs[this.selectedPack];\n                    if (!pack || !pack.entries) return;\n\n                    this.walkEntries(pack.entries, 0, '');\n                    this.$nextTick(this.restoreScrollPosition);\n                },\n                walkEntries(entries, level, basePath) {\n                    const state = this.getPackState(this.selectedPack);\n\n                    const names = Object.keys(entries);\n\n                    names.sort((a, b) => {\n                        const aIsFile = entries[a] === true;\n                        const bIsFile = entries[b] === true;\n\n                        if (aIsFile !== bIsFile) {\n                            return aIsFile ? 1 : -1;\n                        }\n\n                        return a.localeCompare(b);\n                    });\n\n                    for (const name of names) {\n                        const value = entries[name];\n                        const path = basePath ? basePath + '/' + name : name;\n                        const isFile = value === true;\n\n                        let fileType = '';\n                        if (isFile) {\n                            if (is(name, EXTENSIONS.TEXTURE)) fileType = 'png';\n                            else if (is(name, EXTENSIONS.MODEL)) fileType = 'blockymodel';\n                        }\n\n                        const expanded = state.expanded.has(path);\n\n                        this.renderNodes.push({\n                            name,\n                            path,\n                            level,\n                            type: isFile ? 'file' : 'folder',\n                            expanded,\n                            fileType,\n                            packImmutable: this.packs[this.selectedPack].immutable === true\n                        });\n\n                        if (!isFile && expanded) {\n                            this.walkEntries(value, level + 1, path);\n                        }\n                    }\n                },\n                onNodeClick(node) {\n                    this.hideContextMenu();\n\n                    if (node.type === 'folder') {\n                        const state = this.getPackState(this.selectedPack);\n\n                        node.expanded = !node.expanded;\n\n                        if (node.expanded) {\n                            state.expanded.add(node.path);\n                        } else {\n                            state.expanded.delete(node.path);\n                        }\n\n                        this.rebuildTree();\n                    } else {\n                        requestFile(node.path, this.selectedPack);\n                    }\n                },\n                hideContextMenu() {\n                    this.contextMenu.visible = false;\n                },\n                onNodeRightClick(node, event) {\n                    // TODO: override asset option?\n                    if (node.packImmutable) return;\n\n                    const options = [];\n\n                    if (node.type === 'folder') {\n                        options.push(\n                            { label: 'Save Model', action: () => this.rightClickFolderSaveModel(node) },\n                            { label: 'Save Texture', action: () => this.rightClickFolderSaveTexture(node) },\n                            { label: 'Rename Folder', action: () => this.rightClickFolderRename(node) },\n                            { label: 'Delete Folder', action: () => this.rightClickFolderDelete(node) }\n                        );\n                    } else {\n                        options.push(\n                            { label: 'Rename File', action: () => this.rightClickFileRename(node) },\n                            { label: 'Delete File', action: () => this.rightClickFileDelete(node) }\n                        );\n                    }\n\n                    this.contextMenu = {\n                        visible: true,\n                        x: event.clientX,\n                        y: event.clientY,\n                        options\n                    };\n                },\n                onPanelRightClick(event) {\n                    if (!this.connected || this.packs[this.selectedPack].immutable) return;\n\n                    const options = [\n                        { label: 'Save Model', action: () => this.rightClickFolderSaveModel({ path: '' }) },\n                        { label: 'Save Texture', action: () => this.rightClickFolderSaveTexture({ path: '' }) }\n                    ];\n\n                    this.contextMenu = {\n                        visible: true,\n                        x: event.clientX,\n                        y: event.clientY,\n                        options\n                    };\n                },\n                rightClickFolderSaveModel({ path }) {\n                    const filePath = (path === '' ? '' : path + '/') + Project.name + '.blockymodel';\n                    const nameDialog = new Dialog({\n                        title: 'Save Model',\n                        width: 150,\n                        form: {\n                            file: { label: 'File', type: 'text', value: filePath }\n                        },\n                        onConfirm: (formData) => {\n                            if (!is(formData.file, EXTENSIONS.MODEL)) {\n                                Blockbench.showMessageBox({\n                                    title: 'Error',\n                                    message: 'Invalid file name given'\n                                });\n                                return;\n                            }\n\n                            sendCommand(COMMANDS.SAVE, {\n                                path: formData.file,\n                                pack: this.selectedPack,\n                                // json blockymodel data\n                                data: Codecs.blockymodel.compile()\n                            });\n\n                            this.applyUpdate(this.selectedPack, [formData.file], [])\n\n                        }\n                    });\n\n                    nameDialog.show();\n                },\n                rightClickFolderSaveTexture({ path }) {\n                    const texture = Texture.selected;\n                    if (!texture) {\n                        Blockbench.showMessageBox({\n                            title: 'No Texture Selected',\n                            message: 'Please select a texture to save.'\n                        });\n                        return;\n                    }\n\n                    const filePath = (path === '' ? '' : path + '/') + texture.name;\n                    const nameDialog = new Dialog({\n                        title: 'Save Texture',\n                        width: 150,\n                        form: {\n                            file: { label: 'File', type: 'text', value: filePath }\n                        },\n                        onConfirm: (formData) => {\n                            if (!is(formData.file, EXTENSIONS.TEXTURE)) {\n                                Blockbench.showMessageBox({\n                                    title: 'Error',\n                                    message: 'Invalid file name given'\n                                });\n                                return;\n                            }\n\n                            const source = texture.source;\n                            let data;\n\n                            if (source.startsWith(\"data\")) {\n                                data = source.split(',')[1];\n                            } else {\n                                data = fs.readFileSync(source.split('?')[0]).toString('base64');\n                            }\n\n                            sendCommand(COMMANDS.SAVE, {\n                                path: formData.file,\n                                pack: this.selectedPack,\n                                // base64 png data\n                                data: data\n                            });\n\n                            this.applyUpdate(this.selectedPack, [formData.file], [])\n                        }\n                    });\n\n                    nameDialog.show();\n                },\n                rightClickFolderRename(node) {\n                    const nameDialog = new Dialog({\n                        title: 'Rename Folder',\n                        width: 150,\n                        form: {\n                            name: { label: 'Name', type: 'text', value: node.name }\n                        },\n                        onConfirm: (formData) => {\n                            sendCommand(COMMANDS.RENAME_FOLDER, {\n                                path: node.path,\n                                pack: this.selectedPack,\n                                name: formData.name\n                            });\n\n                            // move all nodes inside?\n                        }\n                    });\n\n                    nameDialog.show();\n                },\n                rightClickFolderDelete(node) {\n                    sendCommand(COMMANDS.DELETE_FOLDER, {\n                        path: node.path,\n                        pack: this.selectedPack\n                    });\n\n                    // delete all nodes inside?\n                },\n                rightClickFileRename(node) {\n                    const nameDialog = new Dialog({\n                        title: 'Rename File',\n                        width: 150,\n                        form: {\n                            name: { label: 'Name', type: 'text', value: node.name }\n                        },\n                        onConfirm: (formData) => {\n                            sendCommand(COMMANDS.RENAME_FILE, {\n                                path: node.path,\n                                pack: this.selectedPack,\n                                name: formData.name\n                            });\n\n                            const newPath = node.path.split('/').slice(0, -1).concat(formData.name).join('/');\n                            this.applyUpdate(this.selectedPack, [newPath], [node.path])\n                        }\n                    });\n\n                    nameDialog.show();\n                },\n                rightClickFileDelete(node) {\n                    sendCommand(COMMANDS.DELETE_FILE, {\n                        path: node.path,\n                        pack: this.selectedPack\n                    });\n\n                    this.applyUpdate(this.selectedPack, [], [node.path])\n                },\n                addFile(pack, path) {\n                    const parts = path.split('/');\n                    const name = parts.pop();\n\n                    let current = pack.entries;\n\n                    for (const part of parts) {\n                        if (!current[part] || current[part] === true) {\n                            current[part] = {};\n                        }\n                        current = current[part];\n                    }\n\n                    current[name] = true;\n                },\n                deleteFile(pack, path) {\n                    const parts = path.split('/');\n                    const name = parts.pop();\n\n                    let current = pack.entries;\n\n                    for (const part of parts) {\n                        if (!current[part] || current[part] === true) return;\n                        current = current[part];\n                    }\n\n                    delete current[name];\n                },\n                applyUpdate(pack, added, deleted) {\n                    pack = this.packs[pack];\n                    if (!pack) return;\n\n                    added?.forEach(path => {\n                        this.addFile(pack, path);\n                    });\n\n                    deleted?.forEach(path => {\n                        this.deleteFile(pack, path);\n                    });\n\n                    this.rebuildTree();\n                }\n            },\n            created() {\n                menu = this;\n            }\n        }\n    });\n}\n\nfunction connectToSocket({ address, key }) {\n    if (bridgeState.client) bridgeState.client.end();\n    bridgeState.client = new net.Socket();\n\n    const ip = address.split(\":\")[0];\n    const port = address.split(\":\")[1];\n    bridgeState.client.connect(port, ip, () => {\n        bridgeState.client.write(JSON.stringify({ type: MESSAGES.CREATE, key }) + '\\n');\n    });\n\n    bridgeState.client.on('close', () => {\n        Blockbench.showMessageBox({\n            title: 'Disconnected!',\n            message: 'The Hytale bridge was closed.'\n        });\n\n        menu.updateFileTrees({});\n    });\n\n    bridgeState.client.on('error', (err) => {\n        Blockbench.showMessageBox({\n            title: 'Error!',\n            message: 'An error occurred with the bridge.'\n        });\n    });\n\n    bridgeState.client.on('data', data => {\n        bridgeState.buffer += data.toString();\n        let i;\n        while ((i = bridgeState.buffer.indexOf('\\n')) !== -1) {\n            const raw = bridgeState.buffer.slice(0, i);\n            bridgeState.buffer = bridgeState.buffer.slice(i + 1);\n            if (!raw.trim()) continue;\n            const message = JSON.parse(raw);\n\n            switch (message.type) {\n                case MESSAGES.CREATED: {\n                    bridgeState.uuid = message.uuid;\n                    requestFileTree();\n                    // POPUP\n                    break;\n                }\n                case MESSAGES.FILE_TREE: {\n                    menu.updateFileTrees(message.packs);\n                    break;\n                }\n                case MESSAGES.FILE: {\n                    openFile(message);\n                    break;\n                }\n                case MESSAGES.UPDATE: {\n                    menu.applyUpdate(message.pack, message.added, message.deleted);\n                    break;\n                }\n                default: console.log(\"Unknown message type received from server\", message.type);\n            }\n        }\n    });\n}\n\nfunction sendCommand(command, data = {}) {\n    if (!bridgeState.client) return;\n    bridgeState.client.write(JSON.stringify({\n        type: MESSAGES.COMMAND,\n        uuid: bridgeState.uuid,\n        command,\n        ...data\n    }) + '\\n');\n}\n\nfunction sendDisconnect() {\n    sendCommand(COMMANDS.DISCONNECT);\n}\n\nfunction requestFileTree() {\n    sendCommand(COMMANDS.FILE_TREE);\n}\n\nfunction requestFile(path, pack) {\n    sendCommand(COMMANDS.FILE, { path, pack });\n}\n\nfunction openFile(message) {\n    if (is(message.path, EXTENSIONS.MODEL)) {\n        try {\n            Codecs.blockymodel.load(message.data, {\n                path: message.path,\n                origin: 'Hytale Bridge'\n            });\n        } catch {\n            // POPUP\n        }\n    } else if (is(message.path, EXTENSIONS.TEXTURE)) {\n        try {\n            if (!Project) return;\n\n            const name = message.path.split('/').pop();\n            const dataUrl = 'data:image/png;base64,' + message.data;\n\n            // get or create texture\n            let texture = Texture.all.find(t => t.name === name);\n            if (!texture) {\n                texture = new Texture({ name });\n                texture.add(false);\n            }\n\n            texture.fromDataURL(dataUrl);\n\n            texture.load(() => {\n                // update uv size\n                let size = [texture.width, texture.display_height];\n                let frames = texture.frameCount;\n                if (settings.detect_flipbook_textures.value == false || frames <= 2 || frames % 1) {\n                    size[1] = texture.height;\n                }\n                texture.uv_width = size[0];\n                texture.uv_height = size[1];\n\n                texture.select();\n                Canvas.updateAll();\n\n                // POPUP\n            });\n\n            Canvas.updateAll();\n        } catch {\n\n        }\n    }\n}"
  },
  {
    "path": "plugins/hytale_hitbox_helper/about.md",
    "content": "**Hytale Hitbox Helper** is a dedicated plugin for Blockbench designed to streamline the creation and export of collision hitboxes for Hytale.\n\n## Features\n\n* **Dedicated Format:** Adds a new \"Hytale Hitbox\" project type.\n* **Quick Add:** One-click button to add a standard 32x32x32 hitbox.\n* **Multiple Hitboxes:** It supports adding multiple Hitboxes.\n* **Smart Export:** * Exports strictly to Hytale's `.json` format.\n    * Only exports elements named \"hitbox\" (case insensitive).\n    * Automatic coordinate conversion (32 BB units = 1.0 Hytale unit).\n* **References:** You can import other reference block mode models; they do not interfere with the hitbox.\n\n## References Models\n\nIf you go to **File > Import** you can Import a model to use it as reference, it has to be (.blockymodel)\nIt wont be imported.\n\n## How to Use\n\n1.  Go to **File > New** and select **Hytale Hitbox**.\n2.  Use the **Add Hitbox** button in the \"Add Element\" menu (sidebar).\n3.  Resize and position your hitboxes as needed. \n    * *Note: Ensure the elements are named \"hitbox\" in the outliner.*\n4.  Go to **File > Export > Export Hytale Hitbox (.json)**\n"
  },
  {
    "path": "plugins/hytale_hitbox_helper/hytale_hitbox_helper.js",
    "content": "(function() {\r\n    let export_action;\r\n    let add_hitbox_action;\r\n    let import_reference_action;\r\n    let original_conditions = {};\r\n\r\n    const HITBOX_FORMAT_ID = 'hytale_hitbox';\r\n\r\n    const actions_to_hide = [\r\n        'import_project',\r\n        'import_bbmodel',\r\n        'import_obj',\r\n        'import_gltf',\r\n        'import_image',\r\n        'extrude_texture'\r\n    ];\r\n\r\n    function generateHitboxTexture() {\r\n        const canvas = document.createElement('canvas');\r\n        const size = 128;\r\n        canvas.width = size;\r\n        canvas.height = size;\r\n        const ctx = canvas.getContext('2d');\r\n\r\n        ctx.clearRect(0, 0, size, size);\r\n\r\n        ctx.strokeStyle = '#ff0000';\r\n        const lineWidth = 2;\r\n        ctx.lineWidth = lineWidth;\r\n\r\n        const offset = lineWidth / 2;\r\n        ctx.strokeRect(offset, offset, size - lineWidth, size - lineWidth);\r\n\r\n        return canvas.toDataURL('image/png');\r\n    }\r\n\r\n    BBPlugin.register('hytale_hitbox_helper', {\r\n        title: 'Hytale Hitbox Helper',\r\n        author: 'Marck.A.A',\r\n        icon: 'icon.png',\r\n        description: 'Tool to create easy Hytale hitboxes exportable to JSON.',\r\n        min_version: '4.8.0',\r\n        version: '1.0.1',\r\n        variant: 'both',\r\n        onload() {\r\n            const format = new ModelFormat(HITBOX_FORMAT_ID, {\r\n                name: 'Hytale Hitbox',\r\n                description: 'A simple format for creating Hytale hitboxes, exportable to JSON.',\r\n                icon: 'icon-format_hytale',\r\n                category: 'hytale',\r\n                target: 'Hytale',\r\n                block_size: 32,\r\n                centered_grid: true,\r\n\r\n                optional_box_uv: true,\r\n                box_uv: false,\r\n                single_texture: false,\r\n                uv_rotation: true,\r\n                per_texture_uv_size: true,\r\n\r\n                bone_rig: true,\r\n                rotate_cubes: false,\r\n\r\n                onActivation() {\r\n                    document.body.classList.add('hytale_hitbox_mode');\r\n                    let existing_tex = Texture.all.find(t => t.id === 'hitbox_wireframe_tex');\r\n                    if (existing_tex) {\r\n                        existing_tex.fromDataURL(generateHitboxTexture());\r\n                    }\r\n                    Blockbench.showQuickMessage(\"Hytale Hitbox Mode Active\");\r\n                },\r\n                onDeactivation() {\r\n                    document.body.classList.remove('hytale_hitbox_mode');\r\n                }\r\n            });\r\n\r\n            Blockbench.addCSS(`\r\n                body.hytale_hitbox_mode #panel_textures,\r\n                body.hytale_hitbox_mode #panel_uv {\r\n                    display: none !important;\r\n                }\r\n            `);\r\n\r\n            actions_to_hide.forEach(action_id => {\r\n                if (BarItems[action_id]) {\r\n                    original_conditions[action_id] = BarItems[action_id].condition;\r\n                    BarItems[action_id].condition = () => {\r\n                        if (Format.id === HITBOX_FORMAT_ID) return false;\r\n                        return Condition(original_conditions[action_id]);\r\n                    };\r\n                }\r\n            });\r\n\r\n            import_reference_action = new Action('import_hytale_reference', {\r\n                name: 'Import Reference (.blockymodel)',\r\n                icon: 'fa-file-import',\r\n                category: 'file',\r\n                condition: () => Format.id === HITBOX_FORMAT_ID,\r\n                click: function() {\r\n                    Blockbench.import({\r\n                        extensions: ['blockymodel'],\r\n                        type: 'Blockymodel Reference',\r\n                        readtype: 'text',\r\n                        multiple: true\r\n                    }, function(files) {\r\n                        if (!files || files.length === 0) return;\r\n\r\n                        if (!Codecs.blockymodel) {\r\n                            Blockbench.showMessageBox({\r\n                                title: 'Missing Plugin',\r\n                                message: 'The official Hytale plugin is required to read .blockymodel files.'\r\n                            });\r\n                            return;\r\n                        }\r\n\r\n                        let imported_root_groups = [];\r\n                        let original_id = Format.id;\r\n\r\n                        Undo.initEdit({outliner: true});\r\n\r\n                        Format.id = 'hytale_prop';\r\n\r\n                        files.forEach(file => {\r\n                            try {\r\n                                let json = JSON.parse(file.content);\r\n                                let content = Codecs.blockymodel.parse(json, file.path, { import_to_current_project: true });\r\n\r\n                                if (content && content.new_groups) {\r\n                                    let new_groups = content.new_groups;\r\n                                    let imported_tex = content.new_textures && content.new_textures.length > 0 ? content.new_textures[0] : null;\r\n\r\n                                    new_groups.forEach(g => {\r\n                                        if (!new_groups.includes(g.parent)) {\r\n                                            imported_root_groups.push(g);\r\n                                        }\r\n\r\n                                        if (imported_tex) {\r\n                                            g.children.forEach(child => {\r\n                                                if (child instanceof Cube) {\r\n                                                    for (const key in child.faces) {\r\n                                                        child.faces[key].texture = imported_tex.uuid;\r\n                                                    }\r\n                                                }\r\n                                            });\r\n                                        }\r\n                                    });\r\n                                }\r\n                            } catch (err) {\r\n                                console.error(\"Error importing file:\", file.name, err);\r\n                            }\r\n                        });\r\n\r\n                        Format.id = original_id;\r\n\r\n                        if (imported_root_groups.length > 0) {\r\n                            Undo.finishEdit('Import Reference (Base)');\r\n\r\n                            setTimeout(() => {\r\n                                Undo.initEdit({outliner: true, elements: [], groups: []});\r\n                                unselectAll();\r\n\r\n                                let ref_group = Group.all.find(g => g.name.toLowerCase() === 'reference');\r\n                                if (!ref_group) {\r\n                                    ref_group = new Group({\r\n                                        name: 'reference',\r\n                                        isOpen: true\r\n                                    }).init();\r\n                                }\r\n\r\n                                imported_root_groups.forEach(g => {\r\n                                    g.addTo(ref_group);\r\n                                });\r\n\r\n                                unselectAll();\r\n                                Undo.finishEdit('Format Reference');\r\n                                Canvas.updateAllFaces();\r\n                                Blockbench.showQuickMessage('Reference imported, textured and grouped!');\r\n                            }, 50);\r\n                        } else {\r\n                            Undo.cancelEdit();\r\n                        }\r\n                    });\r\n                }\r\n            });\r\n\r\n            add_hitbox_action = new Action('add_hytale_hitbox', {\r\n                name: 'Add Hitbox',\r\n                icon: 'fa-cube',\r\n                category: 'edit',\r\n                condition: () => Format.id === HITBOX_FORMAT_ID,\r\n                click: function() {\r\n                    let hitbox_texture = Texture.all.find(t => t.id === 'hitbox_wireframe_tex');\r\n\r\n                    if (!hitbox_texture) {\r\n                        hitbox_texture = new Texture({\r\n                            id: 'hitbox_wireframe_tex',\r\n                            name: 'Hitbox Wireframe'\r\n                        }).add();\r\n\r\n                        hitbox_texture.fromDataURL(generateHitboxTexture());\r\n                    }\r\n\r\n                    const mesh = new Cube({\r\n                        name: 'hitbox',\r\n                        color: 2,\r\n                        from: [-16, 0, -16],\r\n                        to: [16, 32, 16],\r\n                        autouv: 0\r\n                    });\r\n\r\n                    for (const key in mesh.faces) {\r\n                        mesh.faces[key].texture = hitbox_texture.uuid;\r\n                        mesh.faces[key].uv = [0, 0, 16, 16];\r\n                    }\r\n\r\n                    mesh.init();\r\n\r\n                    Undo.initEdit({elements: [mesh], textures: [hitbox_texture], outliner: true});\r\n                    Undo.finishEdit('Add Hytale Hitbox');\r\n\r\n                    Canvas.updateAllFaces();\r\n                }\r\n            });\r\n\r\n            BarItems.add_element.side_menu.addAction(add_hitbox_action);\r\n            MenuBar.menus.file.addAction(import_reference_action, 'import');\r\n\r\n            export_action = new Action('export_hytale_hitbox', {\r\n                name: 'Export Hytale Hitbox (.json)',\r\n                icon: 'fa-file-export',\r\n                category: 'file',\r\n                condition: () => Format.id === HITBOX_FORMAT_ID,\r\n                click: function() {\r\n                    exportHytaleHitbox();\r\n                }\r\n            });\r\n\r\n            MenuBar.menus.file.addAction(export_action, 'export');\r\n        },\r\n        onunload() {\r\n            actions_to_hide.forEach(action_id => {\r\n                if (BarItems[action_id] && original_conditions[action_id] !== undefined) {\r\n                    BarItems[action_id].condition = original_conditions[action_id];\r\n                }\r\n            });\r\n\r\n            export_action.delete();\r\n            add_hitbox_action.delete();\r\n            import_reference_action.delete();\r\n        }\r\n    });\r\n\r\n    function exportHytaleHitbox() {\r\n        const hitboxes = Cube.all.filter(cube =>\r\n            cube.name.toLowerCase() === 'hitbox' && cube.export\r\n        );\r\n\r\n        if (hitboxes.length === 0) {\r\n            Blockbench.showMessageBox({\r\n                title: 'No Hitboxes found',\r\n                message: 'No elements called \"hitbox\" were found to export.'\r\n            });\r\n            return;\r\n        }\r\n\r\n        let json_output = {\r\n            \"Boxes\": []\r\n        };\r\n\r\n        hitboxes.forEach(cube => {\r\n            json_output.Boxes.push({\r\n                \"Min\": {\r\n                    \"X\": (cube.from[0] + 16) / 32,\r\n                    \"Y\": cube.from[1] / 32,\r\n                    \"Z\": (cube.from[2] + 16) / 32\r\n                },\r\n                \"Max\": {\r\n                    \"X\": (cube.to[0] + 16) / 32,\r\n                    \"Y\": cube.to[1] / 32,\r\n                    \"Z\": (cube.to[2] + 16) / 32\r\n                }\r\n            });\r\n        });\r\n\r\n        const content = JSON.stringify(json_output, null, 2);\r\n\r\n        Blockbench.export({\r\n            type: 'JSON Model',\r\n            extensions: ['json'],\r\n            name: Project.name || 'hitbox',\r\n            content: content,\r\n            resource_id: 'hytale_hitbox'\r\n        });\r\n    }\r\n\r\n})();"
  },
  {
    "path": "plugins/hytale_plugin/about.md",
    "content": "This plugin adds support for the `.blockymodel` and `.blockyanim` file formats that can be used to create and edit models for Hytale.\n\nSelect a Hytale format from the start screen and click Create New Model to get started!\n\n## Features\n\n### Hytale modeling support\n* Support for opening, editing, and saving models for Hytale\n* A customized workspace and validation to ensure models are created in a compatible way\n* Automatic UV sizes that are locked to face dimensions to ensure UV consistency\n* The stretch tool and sliders can be used to adjust cube sizes without affecting UV\n* Attachment support built on collections. Attachments are anything from hairstyles to clothing items and weapons that can alter the design of a character.\n\n### Hytale animation support\n* Support for animations for Hytale models\n* Visibility keyframes\n* UV Offset keyframes\n* Quaternion-based interpolation\n* Keyframe-wrapping for looping animations\n\n### Quality-of-life features that the Hytale team uses!\n* Hytale preview scene and player reference model, to use as a size reference\n* UV Cycling: Click in the UV editor multiple times to cycle between overlapping faces at that spot\n* Hold Alt while moving elements to duplicate them\n* A thicker and always visible pivot marker to ensure the pivot point is well visible. The group pivot is also shown when editing child cubes, so you always know where geometry will rotate from when animating.\n* Clear, outline-only UV editor mode to make it easier to work with overlapping UVs. Enable UV Outline Only in the settings\n* Copy-Paste with Magenta Alpha setting, to improve copy-pasting from and to Photoshop (which doesn't support copy pasting with transparency)\n* Toggle to lock attachments from editing, hiding them from the outliner and viewport selection\n* Reload all attachments action to quickly refresh attachment geometry from disk\n\n## Usage tips\n\n### Guidelines\n* As a size reference, the center grid in a new Hytale project represents one block in-game. This measures either 32 pixels for props and blocks or 64 pixels for characters and attachments. Hytale preview scene and player model reference can be enabled from the Preview Options menu and are another useful size reference.\n* Models should not have more than 255 nodes. Nodes are a concept in the Hytale model format, each group counts as a node, and each cube/quad counts except if it's the first cube in a respective group. The number of nodes can be seen by clicking on the element counter above the outliner.\n* Scale keyframes animate the stretch value of the attached cube. When animating scale, counter-animate the position if you want to scale from the side, and keep in mind that child bones and other cubes are not affected by the scale.\n* UVs must always match the dimensions of their face, the format does not consider custom UV sizes.\n\n### Notes about nodes and shapes\nHytale's Blockymodel format works slightly different from how Blockbench usually works. In Edit mode this difference is not noticable and hidden by the importer and exporter. However, in animations, some features may behave differently due to this.\nHytale uses \"Nodes\", which are a combination of a group (for the transformation and hierarchy) and a cube (for the visual part). Position and Rotation animations target the group, so all child groups and cubes inherit it. However, Scale, Visibility and UV Offset only target the Shape itself, so it only applies to the cube. In practice, in your Blockbench project, this cube is the first cube that is a direct child of the group and does not have its own rotation. This cube gets exported as the shape of a node and is targeted by its animations and not counted as an extra node towards the node count limit. If there are more cubes or they have their own rotation, they will get exported as separate nodes.\n"
  },
  {
    "path": "plugins/hytale_plugin/changelog.json",
    "content": "{\n\t\"0.1.0\": {\n\t\t\"title\": \"0.1.0\",\n\t\t\"date\": \"2025-10-20\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Initial release!\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed plugin not existing\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.2.0\": {\n\t\t\"title\": \"0.2.0\",\n\t\t\"date\": \"2025-11-16\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Blockymodel file format support (.blockymodel)\",\n\t\t\t\t\t\"Animation import and export with 60 FPS support (.blockyanim)\",\n\t\t\t\t\t\"Auto import textures and animations when opening models\",\n\t\t\t\t\t\"Attachment loading system\",\n\t\t\t\t\t\"Quad support in blockymodel import\",\n\t\t\t\t\t\"Action to create quads\",\n\t\t\t\t\t\"Cube properties support (shading mode, double-sided)\",\n\t\t\t\t\t\"Smooth quaternion interpolation for animations\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Improvements\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Auto UV always enabled for consistent texture mapping\",\n\t\t\t\t\t\"Block size set to 32 to match Hytale coordinates\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed animation export format issues\",\n\t\t\t\t\t\"Fixed importing of removed faces\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.3.0\": {\n\t\t\"title\": \"0.3.0\",\n\t\t\"date\": \"2025-12-16\",\n\t\t\"author\": \"JannisX11 & Kanno\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added multiple model formats (Hytale Character, Hytale Prop)\",\n\t\t\t\t\t\"Added visibility keyframe support for animating element visibility\",\n\t\t\t\t\t\"Added node count validation with 255 node limit warning\",\n\t\t\t\t\t\"Added custom always-visible pivot marker\",\n\t\t\t\t\t\"Added setting to preview texture when selected\",\n\t\t\t\t\t\"Added UV face cycling - click overlapping faces to cycle through them\",\n\t\t\t\t\t\"Added isPiece flag on folders\",\n\t\t\t\t\t\"Added workaround setting for transparency issues in Photoshop\",\n\t\t\t\t\t\"Display node count in model stats\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Improvements\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Auto find textures for models\",\n\t\t\t\t\t\"Improved animation import and saving workflow\",\n\t\t\t\t\t\"Attachment system improvements - export, quick save, and reload actions\",\n\t\t\t\t\t\"Format auto-detection based on file path\",\n\t\t\t\t\t\"Removed separate attachment format - now integrated into main formats\",\n\t\t\t\t\t\"Keep auto UV on to ensure consistent pixel ratio\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed attachment root bone offset\",\n\t\t\t\t\t\"Fixed attachment texture loading issues\",\n\t\t\t\t\t\"Fixed attachment export issue\",\n\t\t\t\t\t\"Fixed stretch animations displaying incorrectly\",\n\t\t\t\t\t\"Fixed UV cycle not working with fast texture switching\",\n\t\t\t\t\t\"Fixed forced auto UV applying in other formats\",\n\t\t\t\t\t\"Fixed texture selection issue on import\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.3.1\": {\n\t\t\"title\": \"0.3.1\",\n\t\t\"date\": \"2025-12-16\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed handling of transparent faces in bbmodel export\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.3.2\": {\n\t\t\"title\": \"0.3.2\",\n\t\t\"date\": \"2025-12-19\",\n\t\t\"author\": \"JannisX11 & Kanno\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Group pivot is now visible when editing cubes underneath it\",\n\t\t\t\t\t\"Added settings to customize the group pivot indicator\",\n\t\t\t\t\t\"Support for duplicate node names in animations\",\n\t\t\t\t\t\"Collection panel can now default to open via settings\",\n\t\t\t\t\t\"Added format page note with UV size information\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Improvements\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Clarity and visibility improvements in UV editor\",\n\t\t\t\t\t\"Improved import, export, and counting of main shapes\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed animation saving bug\",\n\t\t\t\t\t\"Fixed UV cycling issue when editing UV\",\n\t\t\t\t\t\"Fixed stretched cube resize drift\",\n\t\t\t\t\t\"Fixed Auto UV issues\",\n\t\t\t\t\t\"Temporarily disabled stretch resize code to fix UV issue\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.4.0\": {\n\t\t\"title\": \"0.4.0 - Early Access\",\n\t\t\"date\": \"2025-12-22\",\n\t\t\"author\": \"JannisX11 & Kanno\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"This plugin is now Open Source and in Early Access 🎉\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Licensed under the GNU General Public License\",\n\t\t\t\t\t\"Copyright © 2025 Hypixel Studios Canada inc.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Toggle to lock attachments from editing\",\n\t\t\t\t\t\"Reload all attachments action\",\n\t\t\t\t\t\"Deleting a collection now removes its attachment\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Improvements\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Hide pivot marker in paint mode\",\n\t\t\t\t\t\"UV outline only now defaults to off\",\n\t\t\t\t\t\"Static box naming to avoid duplicate animations\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed UV export rounding issue\",\n\t\t\t\t\t\"Fixed Auto UV boundary clamping\",\n\t\t\t\t\t\"Fixed unique name handling when grouping\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.4.1\": {\n\t\t\"title\": \"0.4.1\",\n\t\t\"date\": \"2025-12-31\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue with cubes that are not in a group not being exported\",\n\t\t\t\t\t\"Fixed import and export of quads\",\n\t\t\t\t\t\"Disabled inflate slider in Hytale projects\",\n\t\t\t\t\t\"Fixed issue where project name changes to attachment name when saving collection\",\n\t\t\t\t\t\"Improved rotation euler rounding\",\n\t\t\t\t\t\"Fixed textures assigned per face having an effect on the model. Textures can only be assigned per model or attachment.\",\n\t\t\t\t\t\"Added metadata to let Blockbench recommend the plugin for specific file types\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.5.0\": {\n\t\t\"title\": \"0.5.0\",\n\t\t\"date\": \"2026-01-03\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Hytale preview scene, can be selected from Preview Options\",\n\t\t\t\t\t\"Added Hytale Player as a size reference, can be switched on from Preview Options\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fix missing resize handles for transforming layers\",\n\t\t\t\t\t\"Update tutorial links on format page\",\n\t\t\t\t\t\"Fix typo in about page\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.6.0\": {\n\t\t\"title\": \"0.6.0\",\n\t\t\"date\": \"2026-01-11\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Cube sizes are now limited to full integers by default. This can be disabled in the settings, however it is recommended to leave it on and use stretch instead.\",\n\t\t\t\t\t\"Added a validator to flag textures with the wrong pixel density. In the future, UV size will automatically adapt to texture size.\",\n\t\t\t\t\t\"Added info about scale keyframes to about page\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Unless attachments are loaded, UI will now adapt single-texture workflow\",\n\t\t\t\t\t\"Fixed a preview issue with rotation keyframes\",\n\t\t\t\t\t\"Quads are no longer created with Box UV enabled if Box UV is the project default, and can no longer be set to Box UV\",\n\t\t\t\t\t\"Fixed settings categories\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.6.1\": {\n\t\t\"title\": \"0.6.1\",\n\t\t\"date\": \"2026-01-12\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue with pixel density when generating a template\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.6.2\": {\n\t\t\"title\": \"0.6.2\",\n\t\t\"date\": \"2026-01-25\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed issue with saving multiple animations at once\",\n\t\t\t\t\t\"Fixed visibility keyframe applying to child nodes\",\n\t\t\t\t\t\"Fixed broken UV when importing attachment with default UV mode set to Box UV\",\n\t\t\t\t\t\"Fixed texture update issue in UV editor when switching textures\",\n\t\t\t\t\t\"Fixed animation length rounding issue in export\",\n\t\t\t\t\t\"Fixed Hytale formats being hidden in Streamer Mode\",\n\t\t\t\t\t\"Fixed group pivot marker appearing in screenshots\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.7.0\": {\n\t\t\"title\": \"0.7.0\",\n\t\t\"date\": \"2026-02-02\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added UV Offset animation channel\",\n\t\t\t\t\t\"Groups now share the same marker color as their main cube when opening blockymodel\",\n\t\t\t\t\t\"Node visibility is now exported to and imported from blockymodels\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue where some attachment models imported with incorrect node offsets\",\n\t\t\t\t\t\"Fixed export toggle not affecting which nodes are exported\",\n\t\t\t\t\t\"Fixed pivot marker appearing at the pivot of the wrong group in some scenarios\",\n\t\t\t\t\t\"Improved compatibility with Code View plugin\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.0\": {\n\t\t\"title\": \"0.8.0\",\n\t\t\"date\": \"2026-02-07\",\n\t\t\"author\": \"Kanno & JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added shortcut to hold Alt while moving elements to duplicate them\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue with the import offset of hairstyle attachments\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.1\": {\n\t\t\"title\": \"0.8.1\",\n\t\t\"date\": \"2026-02-16\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Float values are no longer allowed in UV offset keyframes and are now rounded to fix compatibility\",\n\t\t\t\t\t\"Fixed offset issues in saving attachment models\",\n\t\t\t\t\t\"Fixed duplicated rotation when importing attachments\",\n\t\t\t\t\t\"Fixed Alt + drag to duplicate still being active with no keybinding set\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.2\": {\n\t\t\"title\": \"0.8.2\",\n\t\t\"date\": \"2026-02-26\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added setting 'Auto-load Hytale Animations'\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed stretch keyframes always importing with uniform toggle enabled\",\n\t\t\t\t\t\"Fixed issue where saving an animation would omit nodes that are missing in the current model\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.3\": {\n\t\t\"title\": \"0.8.3\",\n\t\t\"date\": \"2026-03-08\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added toast notification to explain per-shape keyframes not applying.\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed Alt + drag to duplicate activating when not in edit mode\",\n\t\t\t\t\t\"Fixed blockymodel export failing in certain configurations\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.4\": {\n\t\t\"title\": \"0.8.4\",\n\t\t\"date\": \"2026-03-24\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Utilize new Blockbench 5.1 feature to mark collections as saved or unsaved\",\n\t\t\t\t\t\"Added Import Attachment option to File > Import menu\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Compatibility with Blockbench 5.1 changes to quaternions\",\n\t\t\t\t\t\"Fixed issue with importing animations in models with duplicate bone names\",\n\t\t\t\t\t\"Fixed Reload Attachment option showing up in unrelated formats\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.5\": {\n\t\t\"title\": \"0.8.5\",\n\t\t\"date\": \"2026-03-24\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed 5.1 compatibility issue\",\n\t\t\t\t\t\"Fixed compile animation issue\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.8.6\": {\n\t\t\"title\": \"0.8.6 (internal-only)\",\n\t\t\"date\": \"2026-04-02\",\n\t\t\"author\": \"Kanno\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added UV Canvas Resize tool to crop and resize texture canvas\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.9.0\": {\n\t\t\"title\": \"0.9.0\",\n\t\t\"date\": \"2026-04-12\",\n\t\t\"author\": \"Kanno, JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added UV Canvas Resize tool to crop and resize texture canvas\",\n\t\t\t\t\t\"Added tool to change cube orientation while remaining static\",\n\t\t\t\t\t\"Pressing the Brush Tool keybinding repeatedly now cycles through brush presets\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed copy-pasting texture with magenta Photoshop fix using the selected texture instead of UV editor texture\",\n\t\t\t\t\t\"Fixed NaN export in animation if position or scale keyframe has non-numeric value\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"0.9.1\": {\n\t\t\"title\": \"0.9.1\",\n\t\t\"date\": \"2026-04-15\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Switching brush presets is no longer assigned to the brush key by default, but can be reassigned in the keybinding settings\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "plugins/hytale_plugin/hytale_plugin.js",
    "content": "(() => {\n  // src/cleanup.ts\n  var list = [];\n  function track(...items) {\n    list.push(...items);\n  }\n  function cleanup() {\n    for (let deletable of list) {\n      try {\n        deletable.delete();\n      } catch (error) {\n        console.error(error);\n      }\n    }\n    list.empty();\n  }\n\n  // src/config.ts\n  var Config = {\n    json_compile_options: {\n      indentation: \"  \",\n      final_newline: false\n    }\n  };\n\n  // src/util.ts\n  function qualifiesAsMainShape(object) {\n    return object instanceof Cube && object.rotation.allEqual(0);\n  }\n  function cubeIsQuad(cube) {\n    if (!cube.size().some((val) => val == 0)) return false;\n    let faces = Object.keys(cube.faces).filter((fkey) => cube.faces[fkey].texture !== null);\n    if (faces.length > 1) return false;\n    return true;\n  }\n  function getMainShape(group) {\n    return group.children.find(qualifiesAsMainShape);\n  }\n\n  // src/blockymodel.ts\n  function discoverTexturePaths(dirname, modelName) {\n    let fs = requireNativeModule(\"fs\");\n    let paths = [];\n    let dirFiles = fs.readdirSync(dirname);\n    for (let fileName of dirFiles) {\n      if (fileName.match(/\\.png$/i) && (fileName.startsWith(modelName) || fileName == \"Texture.png\")) {\n        paths.push(PathModule.join(dirname, fileName));\n      }\n    }\n    let texturesFolderPath = PathModule.join(dirname, `${modelName}_Textures`);\n    if (fs.existsSync(texturesFolderPath) && fs.statSync(texturesFolderPath).isDirectory()) {\n      let folderFiles = fs.readdirSync(texturesFolderPath);\n      for (let fileName of folderFiles) {\n        if (fileName.match(/\\.png$/i)) {\n          paths.push(PathModule.join(texturesFolderPath, fileName));\n        }\n      }\n    }\n    return [...new Set(paths)];\n  }\n  function loadTexturesFromPaths(paths, preferredName) {\n    const textures = [];\n    for (let texturePath of paths) {\n      let texture = Texture.all.find((t) => t.path == texturePath);\n      if (!texture) {\n        texture = new Texture().fromPath(texturePath).add(false, true);\n      }\n      textures.push(texture);\n    }\n    if (textures.length > 0) {\n      let primary = preferredName && textures.find((t) => t.name.startsWith(preferredName)) || textures[0];\n      if (!Texture.all.find((t) => t.use_as_default)) {\n        primary.use_as_default = true;\n      }\n    }\n    return textures;\n  }\n  function promptForTextures(dirname) {\n    Blockbench.showMessageBox({\n      title: \"Import Textures\",\n      message: \"No textures were found for this model. How would you like to import textures?\",\n      buttons: [\"Select Files\", \"Select Folder\", \"Skip\"]\n    }, (choice) => {\n      let project = Project;\n      if (choice === 2 || !project) return;\n      if (choice === 0) {\n        Blockbench.import({\n          resource_id: \"texture\",\n          extensions: [\"png\"],\n          type: \"PNG Textures\",\n          multiple: true,\n          readtype: \"image\",\n          startpath: dirname\n        }, (files) => {\n          if (Project !== project || files.length === 0) return;\n          let paths = files.map((f) => f.path).filter((p) => !!p);\n          loadTexturesFromPaths(paths);\n        });\n      } else if (choice === 1) {\n        let folderPath = Blockbench.pickDirectory({\n          title: \"Select Texture Folder\",\n          startpath: dirname,\n          resource_id: \"texture\"\n        });\n        if (folderPath && Project === project) {\n          let fs = requireNativeModule(\"fs\");\n          let files = fs.readdirSync(folderPath);\n          let pngFiles = files.filter((f) => f.match(/\\.png$/i));\n          if (pngFiles.length === 0) {\n            Blockbench.showQuickMessage(\"No PNG files found in selected folder\");\n            return;\n          }\n          let paths = pngFiles.map((f) => PathModule.join(folderPath, f));\n          loadTexturesFromPaths(paths);\n        }\n      }\n    });\n  }\n  function setupBlockymodelCodec() {\n    let codec = new Codec(\"blockymodel\", {\n      name: \"Hytale Blockymodel\",\n      extension: \"blockymodel\",\n      remember: true,\n      support_partial_export: true,\n      load_filter: {\n        type: \"json\",\n        extensions: [\"blockymodel\"]\n      },\n      load(model, file, args = {}) {\n        let path_segments = file.path && file.path.split(/[\\\\\\/]/);\n        let format = this.format;\n        if (model.format) {\n          if (model.format == \"prop\") {\n            format = Formats.hytale_prop;\n          }\n        } else {\n          if (path_segments && path_segments.includes(\"Blocks\")) {\n            format = Formats.hytale_prop;\n          }\n        }\n        if (!args.import_to_current_project) {\n          setupProject(format);\n        }\n        if (path_segments && isApp && this.remember && !file.no_file) {\n          path_segments[path_segments.length - 1] = path_segments.last().split(\".\")[0];\n          Project.name = path_segments.findLast((p) => p != \"Model\" && p != \"Models\" && p != \"Attachments\") ?? \"Model\";\n          Project.export_path = file.path;\n        }\n        this.parse(model, file.path, args);\n        if (file.path && isApp && this.remember && !file.no_file) {\n          addRecentProject({\n            name: Project.name,\n            path: Project.export_path,\n            icon: Format.icon\n          });\n          let project = Project;\n          setTimeout(() => {\n            if (Project == project) updateRecentProjectThumbnail();\n          }, 500);\n        }\n        Settings.updateSettingsInProfiles();\n      },\n      // MARK: Compile\n      compile(options = {}) {\n        let model = {\n          nodes: [],\n          format: Format.id == \"hytale_prop\" ? \"prop\" : \"character\",\n          lod: \"auto\"\n        };\n        let node_id = 1;\n        let formatVector = (input) => {\n          return new oneLiner({\n            x: input[0],\n            y: input[1],\n            z: input[2]\n          });\n        };\n        function turnNodeIntoBox(node, cube, original_element) {\n          let size = cube.size();\n          let stretch = cube.stretch.slice();\n          let offset = [\n            Math.lerp(cube.from[0], cube.to[0], 0.5) - original_element.origin[0],\n            Math.lerp(cube.from[1], cube.to[1], 0.5) - original_element.origin[1],\n            Math.lerp(cube.from[2], cube.to[2], 0.5) - original_element.origin[2]\n          ];\n          node.shape.type = \"box\";\n          node.shape.settings.size = formatVector(size);\n          node.shape.offset = formatVector(offset);\n          if (cubeIsQuad(cube)) {\n            node.shape.type = \"quad\";\n            let used_face = Object.keys(cube.faces).find((fkey) => cube.faces[fkey].texture != null);\n            let normal = \"+Z\";\n            switch (used_face) {\n              case \"west\":\n                normal = \"-X\";\n                break;\n              case \"east\":\n                normal = \"+X\";\n                break;\n              case \"down\":\n                normal = \"-Y\";\n                break;\n              case \"up\":\n                normal = \"+Y\";\n                break;\n              case \"north\":\n                normal = \"-Z\";\n                break;\n              case \"south\":\n                normal = \"+Z\";\n                break;\n            }\n            node.shape.settings.normal = normal;\n            delete node.shape.settings.size.z;\n            if (normal.endsWith(\"X\")) {\n              node.shape.settings.size.x = size[2];\n            } else if (normal.endsWith(\"Y\")) {\n              node.shape.settings.size.y = size[2];\n            }\n          }\n          node.shape.stretch = formatVector(stretch);\n          node.shape.visible = cube.visibility;\n          node.shape.doubleSided = cube.double_sided == true;\n          node.shape.shadingMode = cube.shading_mode;\n          node.shape.unwrapMode = \"custom\";\n          if (cube == original_element) {\n            node.shape.settings.isStaticBox = true;\n          }\n          const BBToHytaleDirection = {\n            north: \"back\",\n            south: \"front\",\n            west: \"left\",\n            east: \"right\",\n            up: \"top\",\n            down: \"bottom\"\n          };\n          for (let fkey in cube.faces) {\n            let flipMinMax = function(axis) {\n              if (axis == 0 /* X */) {\n                flip_x = !flip_x;\n                if (flip_x) {\n                  uv_x = Math.max(face.uv[0], face.uv[2]);\n                } else {\n                  uv_x = Math.min(face.uv[0], face.uv[2]);\n                }\n              } else {\n                flip_y = !flip_y;\n                if (flip_y) {\n                  uv_y = Math.max(face.uv[1], face.uv[3]);\n                } else {\n                  uv_y = Math.min(face.uv[1], face.uv[3]);\n                }\n              }\n            };\n            let face = cube.faces[fkey];\n            if (face.texture == null) continue;\n            let direction = BBToHytaleDirection[fkey];\n            if (node.shape.type == \"quad\") direction = \"front\";\n            let flip_x = false;\n            let flip_y = false;\n            let uv_x = Math.min(face.uv[0], face.uv[2]);\n            let uv_y = Math.min(face.uv[1], face.uv[3]);\n            let UVAxis;\n            ((UVAxis2) => {\n              UVAxis2[UVAxis2[\"X\"] = 0] = \"X\";\n              UVAxis2[UVAxis2[\"Y\"] = 1] = \"Y\";\n            })(UVAxis || (UVAxis = {}));\n            let mirror_x = false;\n            let mirror_y = false;\n            if (face.uv[0] > face.uv[2]) {\n              mirror_x = true;\n              flipMinMax(0 /* X */);\n            }\n            if (face.uv[1] > face.uv[3]) {\n              mirror_y = true;\n              flipMinMax(1 /* Y */);\n            }\n            let uv_rot = 0;\n            switch (face.rotation) {\n              case 90: {\n                uv_rot = 270;\n                if ((mirror_x || mirror_y) && !(mirror_x && mirror_y)) {\n                  uv_rot = 90;\n                }\n                flipMinMax(1 /* Y */);\n                break;\n              }\n              case 180: {\n                uv_rot = 180;\n                flipMinMax(1 /* Y */);\n                flipMinMax(0 /* X */);\n                break;\n              }\n              case 270: {\n                uv_rot = 90;\n                if ((mirror_x || mirror_y) && !(mirror_x && mirror_y)) {\n                  uv_rot = 270;\n                }\n                flipMinMax(0 /* X */);\n                break;\n              }\n            }\n            let layout_face = {\n              offset: new oneLiner({ x: Math.round(uv_x), y: Math.round(uv_y) }),\n              mirror: new oneLiner({ x: mirror_x, y: mirror_y }),\n              angle: uv_rot\n            };\n            node.shape.textureLayout[direction] = layout_face;\n          }\n        }\n        function getNodeOffset(group, include_original_offset = true) {\n          let cube = getMainShape(group);\n          if (cube) {\n            let center_pos = cube.from.slice().V3_add(cube.to).V3_divide(2, 2, 2);\n            center_pos.V3_subtract(group.origin);\n            return center_pos;\n          } else if (include_original_offset) {\n            return group.original_offset;\n          } else {\n            return [0, 0, 0];\n          }\n        }\n        function compileNode(element, name = element.name) {\n          if (!element.export) return void 0;\n          if (!options.attachment) {\n            let collection = Collection.all.find((c) => c.contains(element));\n            if (collection) return;\n          }\n          let euler = Reusable.euler1.set(\n            Math.degToRad(element.rotation[0]),\n            Math.degToRad(element.rotation[1]),\n            Math.degToRad(element.rotation[2]),\n            element.scene_object.rotation.order\n          );\n          let quaternion = Reusable.quat1.setFromEuler(euler);\n          let orientation = new oneLiner({\n            x: quaternion.x,\n            y: quaternion.y,\n            z: quaternion.z,\n            w: quaternion.w\n          });\n          let origin = element.origin.slice();\n          let offset = element instanceof Group ? getNodeOffset(element) : [0, 0, 0];\n          if (element.parent instanceof Group) {\n            origin.V3_subtract(element.parent.origin);\n            let parent_offset = getNodeOffset(element.parent, !options.attachment);\n            if (parent_offset) {\n              origin.V3_subtract(parent_offset);\n            }\n          }\n          if (options.attachment && element instanceof Group && element.is_piece && element.original_position?.some((v) => v)) {\n            origin = element.original_position;\n          }\n          let node = {\n            id: node_id.toString(),\n            name: name.replace(/^.+:/, \"\"),\n            position: formatVector(origin),\n            orientation,\n            shape: {\n              type: \"none\",\n              offset: formatVector(offset),\n              stretch: formatVector([1, 1, 1]),\n              settings: {\n                isPiece: element instanceof Group && element.is_piece || false\n              },\n              textureLayout: {},\n              unwrapMode: \"custom\",\n              visible: element.visibility,\n              doubleSided: false,\n              shadingMode: \"flat\"\n            }\n          };\n          node_id++;\n          if (element instanceof Cube) {\n            turnNodeIntoBox(node, element, element);\n          } else if (\"children\" in element) {\n            let shape_count = 0;\n            let child_cube_count = 0;\n            for (let child of element.children ?? []) {\n              if (!child.export) continue;\n              let result;\n              if (qualifiesAsMainShape(child) && shape_count == 0) {\n                turnNodeIntoBox(node, child, element);\n                shape_count++;\n              } else if (child instanceof Cube) {\n                child_cube_count++;\n                result = compileNode(child, child.name + \"--C\" + child_cube_count);\n              } else if (child instanceof Group) {\n                result = compileNode(child);\n              }\n              if (result) {\n                if (!node.children) node.children = [];\n                node.children.push(result);\n              }\n            }\n          }\n          return node;\n        }\n        let nodes = Outliner.root.filter((node) => node instanceof Group || node instanceof Cube);\n        if (options.attachment instanceof Collection) {\n          let in_collection = options.attachment.getChildren();\n          nodes = in_collection.filter((g) => {\n            return g instanceof Group;\n          });\n        }\n        for (let node of nodes) {\n          let compiled = compileNode(node);\n          if (compiled) model.nodes.push(compiled);\n        }\n        if (options.raw) {\n          return model;\n        } else {\n          return compileJSON(model, Config.json_compile_options);\n        }\n      },\n      // MARK: Parse\n      parse(model, path, args = {}) {\n        function parseVector(vec, fallback = [0, 0, 0]) {\n          if (!vec) return fallback;\n          return Object.values(vec).slice(0, 3);\n        }\n        const new_groups = [];\n        const existing_groups = Group.all.slice();\n        function parseNode(node, parent_node, parent_group = \"root\", parent_offset) {\n          if (args.attachment) {\n            let attachment_node;\n            if (args.attachment && node.shape?.settings?.isPiece === true && existing_groups.length) {\n              let node_name = node.name;\n              attachment_node = existing_groups.find((g) => g.name == node_name);\n            }\n            if (attachment_node) {\n              parent_group = attachment_node;\n              parent_node = null;\n            }\n          }\n          let quaternion = new THREE.Quaternion();\n          quaternion.set(node.orientation.x, node.orientation.y, node.orientation.z, node.orientation.w);\n          let rotation_euler = new THREE.Euler().setFromQuaternion(quaternion.normalize(), \"ZYX\");\n          let name = node.name;\n          let offset = node.shape?.offset ? parseVector(node.shape?.offset) : [0, 0, 0];\n          let origin = parseVector(node.position);\n          let original_position;\n          let rotation = [\n            Math.roundTo(Math.radToDeg(rotation_euler.x), 3),\n            Math.roundTo(Math.radToDeg(rotation_euler.y), 3),\n            Math.roundTo(Math.radToDeg(rotation_euler.z), 3)\n          ];\n          if (args.attachment && !parent_node && parent_group instanceof Group) {\n            let reference_node = getMainShape(parent_group) ?? parent_group;\n            original_position = origin;\n            origin = reference_node.origin.slice();\n          } else if (parent_offset && parent_group instanceof Group) {\n            origin.V3_add(parent_offset);\n            origin.V3_add(parent_group.origin);\n          }\n          let group = null;\n          if (!node.shape?.settings?.isStaticBox) {\n            group = new Group({\n              name,\n              autouv: 1,\n              origin,\n              rotation,\n              visibility: node.shape?.visible != false\n            });\n            new_groups.push(group);\n            group.addTo(parent_group);\n            if (!parent_node && args.attachment) {\n              group.name = args.attachment + \":\" + group.name;\n              group.color = 1;\n              group.rotation.V3_set(0, 0, 0);\n            }\n            group.init();\n            let custom_data = {\n              is_piece: node.shape?.settings?.isPiece ?? false,\n              original_position,\n              original_offset: offset\n            };\n            group.extend(custom_data);\n          } else {\n            name = name.replace(/--C\\d+$/, \"\");\n          }\n          if (node.shape.type != \"none\") {\n            let switchIndices = function(arr, i1, i2) {\n              temp = arr[i1];\n              arr[i1] = arr[i2];\n              arr[i2] = temp;\n            }, resetFace = function(face_name) {\n              cube.faces[face_name].texture = null;\n              cube.faces[face_name].uv = [0, 0, 0, 0];\n            };\n            let size = parseVector(node.shape.settings.size);\n            let stretch = parseVector(node.shape.stretch, [1, 1, 1]);\n            if (node.shape.type == \"quad\") {\n              let axis = node.shape.settings.normal?.substring(1) ?? \"Z\";\n              if (axis == \"X\") {\n                size = [0, size[1], size[0]];\n              } else if (axis == \"Y\") {\n                size.splice(\"XYZ\".indexOf(axis), 0, 0);\n              } else if (axis == \"Z\") {\n                size[2] = 0;\n              }\n            }\n            let cube = new Cube({\n              name,\n              autouv: 1,\n              box_uv: false,\n              visibility: node.shape.visible != false,\n              rotation: [0, 0, 0],\n              stretch,\n              from: [\n                -size[0] / 2 + origin[0] + offset[0],\n                -size[1] / 2 + origin[1] + offset[1],\n                -size[2] / 2 + origin[2] + offset[2]\n              ],\n              to: [\n                size[0] / 2 + origin[0] + offset[0],\n                size[1] / 2 + origin[1] + offset[1],\n                size[2] / 2 + origin[2] + offset[2]\n              ]\n            });\n            if (group) {\n              group.color = cube.color;\n              cube.origin.V3_set(\n                Math.lerp(cube.from[0], cube.to[0], 0.5),\n                Math.lerp(cube.from[1], cube.to[1], 0.5),\n                Math.lerp(cube.from[2], cube.to[2], 0.5)\n              );\n            } else {\n              cube.extend({\n                origin,\n                rotation\n              });\n            }\n            cube.extend({\n              // @ts-ignore\n              shading_mode: node.shape.shadingMode,\n              double_sided: node.shape.doubleSided\n            });\n            let temp;\n            let HytaleDirection;\n            ((HytaleDirection2) => {\n              HytaleDirection2[\"back\"] = \"back\";\n              HytaleDirection2[\"front\"] = \"front\";\n              HytaleDirection2[\"left\"] = \"left\";\n              HytaleDirection2[\"right\"] = \"right\";\n              HytaleDirection2[\"top\"] = \"top\";\n              HytaleDirection2[\"bottom\"] = \"bottom\";\n            })(HytaleDirection || (HytaleDirection = {}));\n            const HytaleToBBDirection = {\n              back: \"north\",\n              front: \"south\",\n              left: \"west\",\n              right: \"east\",\n              top: \"up\",\n              bottom: \"down\"\n            };\n            const normal_faces = {\n              \"-X\": \"west\",\n              \"+X\": \"east\",\n              \"-Y\": \"down\",\n              \"+Y\": \"up\",\n              \"-Z\": \"north\",\n              \"+Z\": \"south\"\n            };\n            if (node.shape.settings.size) {\n              let parseUVVector = function(vec, fallback = [0, 0]) {\n                if (!vec) return fallback;\n                return Object.values(vec).slice(0, 2);\n              };\n              let normal_face = node.shape.type == \"quad\" && normal_faces[node.shape.settings.normal];\n              for (let key in HytaleDirection) {\n                let face_name = HytaleToBBDirection[key];\n                let uv_source = node.shape.textureLayout[key];\n                if (normal_face == face_name) {\n                  if (face_name != \"south\") resetFace(\"south\");\n                  uv_source = node.shape.textureLayout[\"front\"];\n                }\n                if (!uv_source) {\n                  resetFace(face_name);\n                  continue;\n                }\n                let uv_offset = parseUVVector(uv_source.offset);\n                let uv_size = [\n                  size[0],\n                  size[1]\n                ];\n                let uv_mirror = [\n                  uv_source.mirror.x ? -1 : 1,\n                  uv_source.mirror.y ? -1 : 1\n                ];\n                let uv_rotation = uv_source.angle;\n                switch (key) {\n                  case \"left\": {\n                    uv_size[0] = size[2];\n                    break;\n                  }\n                  case \"right\": {\n                    uv_size[0] = size[2];\n                    break;\n                  }\n                  case \"top\": {\n                    uv_size[1] = size[2];\n                    break;\n                  }\n                  case \"bottom\": {\n                    uv_size[1] = size[2];\n                    break;\n                  }\n                }\n                let result = [0, 0, 0, 0];\n                switch (uv_rotation) {\n                  case 90: {\n                    switchIndices(uv_size, 0, 1);\n                    switchIndices(uv_mirror, 0, 1);\n                    uv_mirror[0] *= -1;\n                    result = [\n                      uv_offset[0],\n                      uv_offset[1] + uv_size[1] * uv_mirror[1],\n                      uv_offset[0] + uv_size[0] * uv_mirror[0],\n                      uv_offset[1]\n                    ];\n                    break;\n                  }\n                  case 270: {\n                    switchIndices(uv_size, 0, 1);\n                    switchIndices(uv_mirror, 0, 1);\n                    uv_mirror[1] *= -1;\n                    result = [\n                      uv_offset[0] + uv_size[0] * uv_mirror[0],\n                      uv_offset[1],\n                      uv_offset[0],\n                      uv_offset[1] + uv_size[1] * uv_mirror[1]\n                    ];\n                    break;\n                  }\n                  case 180: {\n                    uv_mirror[0] *= -1;\n                    uv_mirror[1] *= -1;\n                    result = [\n                      uv_offset[0] + uv_size[0] * uv_mirror[0],\n                      uv_offset[1] + uv_size[1] * uv_mirror[1],\n                      uv_offset[0],\n                      uv_offset[1]\n                    ];\n                    break;\n                  }\n                  case 0: {\n                    result = [\n                      uv_offset[0],\n                      uv_offset[1],\n                      uv_offset[0] + uv_size[0] * uv_mirror[0],\n                      uv_offset[1] + uv_size[1] * uv_mirror[1]\n                    ];\n                    break;\n                  }\n                }\n                cube.faces[face_name].rotation = uv_rotation;\n                cube.faces[face_name].uv = result;\n              }\n            }\n            cube.addTo(group || parent_group).init();\n          }\n          if (node.children?.length && group instanceof Group) {\n            if (args.attachment && node.shape.settings.isPiece) {\n              offset = [0, 0, 0];\n            }\n            for (let child of node.children) {\n              parseNode(child, node, group, offset);\n            }\n          }\n        }\n        for (let node of model.nodes) {\n          parseNode(node, null);\n        }\n        let new_textures = [];\n        if (isApp && path) {\n          let project = Project;\n          let dirname = PathModule.dirname(path);\n          let model_file_name = pathToName(path, false);\n          let fs = requireNativeModule(\"fs\");\n          let texture_paths = discoverTexturePaths(dirname, model_file_name);\n          if (texture_paths.length > 0 && !args.attachment) {\n            new_textures = loadTexturesFromPaths(texture_paths, Project.name);\n          } else if (texture_paths.length > 0) {\n            new_textures = loadTexturesFromPaths(texture_paths);\n          }\n          if (new_textures.length === 0 && !args.attachment) {\n            setTimeout(() => {\n              if (Project !== project) return;\n              promptForTextures(dirname);\n            }, 100);\n          }\n          if (!args?.attachment && settings.auto_load_hytale_animations.value) {\n            let listener = Blockbench.on(\"select_mode\", ({ mode }) => {\n              if (mode.id != \"animate\" || project != Project) return;\n              listener.delete();\n              let anim_path = PathModule.resolve(dirname, \"../Animations/\");\n              try {\n                let anim_folders = fs.existsSync(anim_path) ? fs.readdirSync(anim_path) : [];\n                for (let folder of anim_folders) {\n                  if (folder.includes(\".\")) continue;\n                  let path2 = PathModule.resolve(anim_path, folder);\n                  let anim_files = fs.readdirSync(path2);\n                  for (let file_name of anim_files) {\n                    if (file_name.match(/\\.blockyanim$/i)) {\n                      let file_path = PathModule.resolve(path2, file_name);\n                      let content = fs.readFileSync(file_path, \"utf-8\");\n                      let json = autoParseJSON(content);\n                      parseAnimationFile({ name: file_name, path: file_path }, json);\n                    }\n                  }\n                }\n              } catch (err) {\n                console.error(err);\n              }\n            });\n          }\n        }\n        return { new_groups, new_textures };\n      },\n      // MARK: Other\n      async export(options) {\n        if (Object.keys(this.export_options).length) {\n          let result = await this.promptExportOptions();\n          if (result === null) return;\n        }\n        Blockbench.export({\n          resource_id: \"model\",\n          type: this.name,\n          extensions: [this.extension],\n          name: this.fileName(),\n          startpath: this.startPath(),\n          content: this.compile(options),\n          custom_writer: isApp ? (a, b) => this.write(a, b) : null\n        }, (path) => this.afterDownload(path));\n      },\n      async exportCollection(collection) {\n        this.context = collection;\n        await this.export({ attachment: collection });\n        if (\"saved\" in collection) collection.saved = true;\n        this.context = null;\n      },\n      async writeCollection(collection) {\n        this.context = collection;\n        this.write(this.compile({ attachment: collection }), collection.export_path);\n        if (\"saved\" in collection) collection.saved = true;\n        this.context = null;\n      }\n    });\n    let export_action = new Action(\"export_blockymodel\", {\n      name: \"Export Hytale Blockymodel\",\n      description: \"Export a blockymodel file\",\n      icon: \"icon-format_hytale\",\n      category: \"file\",\n      condition: { formats: FORMAT_IDS },\n      click: function() {\n        codec.export();\n      }\n    });\n    codec.export_action = export_action;\n    track(codec, export_action);\n    MenuBar.menus.file.addAction(export_action, \"export.1\");\n    let hook = Blockbench.on(\"quick_save_model\", () => {\n      if (FORMAT_IDS.includes(Format.id) == false) return;\n      for (let collection of Collection.all) {\n        if (collection.export_codec != codec.id) continue;\n        codec.writeCollection(collection);\n      }\n    });\n    track(hook);\n    return codec;\n  }\n\n  // src/formats.ts\n  var FORMAT_IDS = [\n    \"hytale_character\",\n    \"hytale_prop\"\n  ];\n  function setupFormats() {\n    let codec = setupBlockymodelCodec();\n    let common = {\n      category: \"hytale\",\n      target: \"Hytale\",\n      codec,\n      forward_direction: \"+z\",\n      single_texture_default: true,\n      animation_files: true,\n      animation_grouping: \"custom\",\n      animation_mode: true,\n      bone_rig: true,\n      centered_grid: true,\n      box_uv: false,\n      optional_box_uv: true,\n      box_uv_float_size: true,\n      integer_size: true,\n      uv_rotation: true,\n      rotate_cubes: true,\n      per_texture_uv_size: true,\n      texture_wrap_default: \"clamp\",\n      stretch_cubes: true,\n      model_identifier: false,\n      animation_loop_wrapping: true,\n      quaternion_interpolation: true,\n      onActivation() {\n        settings.shading.set(false);\n        Panels.animations.inside_vue.$data.group_animations_by_file = false;\n      }\n    };\n    let format_page = {\n      content: [\n        { type: \"h3\", text: tl(\"mode.start.format.informations\") },\n        {\n          text: `* One texture can be applied to a model at a time\n                    * UV sizes are linked to the size of each cube and cannot be modified, except by stretching the cube\n                    * Models can have a maximum of 255 nodes`.replace(/(\\t| {4,4})+/g, \"\")\n        },\n        { type: \"h3\", text: tl(\"mode.start.format.resources\") },\n        {\n          text: [\n            \"* [Modeling Overview and Style Guide](https://hytale.com/news/2025/12/an-introduction-to-making-models-for-hytale)\",\n            \"* [Modeling Tutorial](https://youtu.be/Q07i3wmGy0Y)\"\n          ].join(\"\\n\")\n        }\n      ]\n    };\n    let format_character = new ModelFormat(\"hytale_character\", {\n      name: \"Hytale Character\",\n      description: \"Create character and attachment models using Hytale's blockymodel format\",\n      icon: \"icon-format_hytale\",\n      format_page,\n      block_size: 64,\n      ...common\n      // TODO: Auto-reload attachments on tab switch. Needs dirty tracking and setting toggle to avoid losing unsaved changes\n      /*\n      onActivation() {\n          common.onActivation?.();\n          setTimeout(() => reload_all_attachments?.click(), 0);\n      }\n      */\n    });\n    let format_prop = new ModelFormat(\"hytale_prop\", {\n      name: \"Hytale Prop\",\n      description: \"Create prop models using Hytale's blockymodel format\",\n      icon: \"icon-format_hytale\",\n      format_page,\n      block_size: 32,\n      ...common\n    });\n    let int_setting = new Setting(\"hytale_integer_size\", {\n      name: \"Hytale Integer Size\",\n      category: \"edit\",\n      description: \"Restrict cube sizes in hytale formats to full integers. Float values are technically supported but make UV mapping more difficult. Using stretch is recommended instead.\",\n      type: \"toggle\",\n      value: true\n    });\n    track(int_setting);\n    const integer_size = { get: () => int_setting.value };\n    Object.defineProperty(format_character, \"integer_size\", integer_size);\n    Object.defineProperty(format_prop, \"integer_size\", integer_size);\n    const single_texture = { get: () => Collection.all.length == 0 };\n    Object.defineProperty(format_character, \"single_texture\", single_texture);\n    Object.defineProperty(format_prop, \"single_texture\", single_texture);\n    codec.format = format_character;\n    format_character.codec = codec;\n    format_prop.codec = codec;\n    track(format_character);\n    track(format_prop);\n    Language.addTranslations(\"en\", {\n      \"format_category.hytale\": \"Hytale\"\n    });\n  }\n  function isHytaleFormat() {\n    return Format && FORMAT_IDS.includes(Format.id);\n  }\n\n  // src/name_overlap.ts\n  var Animation = window.Animation;\n  function copyAnimationToGroupsWithSameName(animation, source_group) {\n    let source_animator = animation.getBoneAnimator(source_group);\n    let other_groups = Group.all.filter((g) => g.name == source_group.name && g != source_group);\n    for (let group2 of other_groups) {\n      let animator2 = animation.getBoneAnimator(group2);\n      for (let channel in animator2.channels) {\n        if (animator2[channel] instanceof Array) animator2[channel].empty();\n      }\n      source_animator.keyframes.forEach((kf) => {\n        animator2.addKeyframe(kf, guid());\n      });\n    }\n  }\n  function setupNameOverlap() {\n    Blockbench.on(\"finish_edit\", (arg) => {\n      if (isHytaleFormat() && arg.aspects.keyframes && Animation.selected) {\n        let changes = false;\n        let groups = {};\n        if (Timeline.selected_animator) {\n          groups[Timeline.selected_animator.name] = [\n            Timeline.selected_animator.group\n          ];\n        }\n        for (let group of Group.all) {\n          if (!groups[group.name]) groups[group.name] = [];\n          groups[group.name].push(group);\n        }\n        for (let name in groups) {\n          if (groups[name].length >= 2) {\n            copyAnimationToGroupsWithSameName(Animation.selected, groups[name][0]);\n            if (!changes && groups[name].find((g) => g.selected)) changes = true;\n          }\n        }\n        if (changes) {\n          Animator.preview();\n        }\n      }\n    });\n    let bone_animator_select_original = BoneAnimator.prototype.select;\n    BoneAnimator.prototype.select = function select(group_is_selected) {\n      if (!this.getGroup()) {\n        unselectAllElements();\n        return this;\n      }\n      if (this.group.locked) return;\n      for (var key in this.animation.animators) {\n        this.animation.animators[key].selected = false;\n      }\n      if (group_is_selected !== true && this.group) {\n        this.group.select();\n      }\n      GeneralAnimator.prototype.select.call(this);\n      if (this[Toolbox.selected.animation_channel] && (Timeline.selected.length == 0 || Timeline.selected[0].animator != this) && !Blockbench.hasFlag(\"loading_selection_save\")) {\n        var nearest;\n        this[Toolbox.selected.animation_channel].forEach((kf) => {\n          if (Math.abs(kf.time - Timeline.time) < 2e-3) {\n            nearest = kf;\n          }\n        });\n        if (nearest) {\n          nearest.select();\n        }\n      }\n      if (this.group && this.group.parent && this.group.parent !== \"root\") {\n        this.group.parent.openUp();\n      }\n      return this;\n    };\n    track({\n      delete() {\n        BoneAnimator.prototype.select = bone_animator_select_original;\n      }\n    });\n    let setting = new Setting(\"hytale_duplicate_bone_names\", {\n      name: \"Duplicate Bone Names\",\n      category: \"edit\",\n      description: \"Allow creating duplicate groups names in Hytale formats. Multiple groups with the same name can be used to apply animations to multiple nodes at once.\",\n      type: \"toggle\",\n      value: false\n    });\n    let override = Group.addBehaviorOverride({\n      condition: () => isHytaleFormat() && setting.value == true,\n      priority: 2,\n      behavior: {\n        unique_name: false\n      }\n    });\n    track(override, setting);\n  }\n\n  // src/blockyanim.ts\n  var FPS = 60;\n  var Animation2 = window.Animation;\n  function parseAnimationFile(file, content) {\n    let animation = new Animation2({\n      name: pathToName(file.name, false),\n      length: content.duration / FPS,\n      loop: content.holdLastKeyframe ? \"hold\" : \"loop\",\n      path: file.path,\n      snapping: FPS\n    });\n    let quaternion = new THREE.Quaternion();\n    let euler = new THREE.Euler(0, 0, 0, \"ZYX\");\n    for (let name in content.nodeAnimations) {\n      let anim_data = content.nodeAnimations[name];\n      let group_name = name;\n      let group = Group.all.find((g) => g.name == group_name);\n      let uuid = group ? group.uuid : guid();\n      let ba = new BoneAnimator(uuid, animation, group_name);\n      animation.animators[uuid] = ba;\n      ba.group = group;\n      const anim_channels = [\n        { channel: \"rotation\", keyframes: anim_data.orientation },\n        { channel: \"position\", keyframes: anim_data.position },\n        { channel: \"scale\", keyframes: anim_data.shapeStretch },\n        { channel: \"visibility\", keyframes: anim_data.shapeVisible },\n        { channel: \"uv_offset\", keyframes: anim_data.shapeUvOffset }\n      ];\n      for (let { channel, keyframes } of anim_channels) {\n        if (!keyframes || keyframes.length == 0) continue;\n        for (let kf_data of keyframes) {\n          let data_point;\n          if (channel == \"visibility\") {\n            data_point = {\n              visibility: kf_data.delta\n            };\n          } else if (channel == \"uv_offset\") {\n            let delta = kf_data.delta;\n            data_point = {\n              x: delta.x,\n              y: -delta.y\n            };\n          } else {\n            let delta = kf_data.delta;\n            if (channel == \"rotation\") {\n              quaternion.set(delta.x, delta.y, delta.z, delta.w);\n              euler.setFromQuaternion(quaternion.normalize(), \"ZYX\");\n              data_point = {\n                x: Math.radToDeg(euler.x),\n                y: Math.radToDeg(euler.y),\n                z: Math.radToDeg(euler.z)\n              };\n            } else {\n              data_point = {\n                x: delta.x,\n                y: delta.y,\n                z: delta.z\n              };\n            }\n          }\n          let kf = ba.addKeyframe({\n            time: kf_data.time / FPS,\n            channel,\n            interpolation: kf_data.interpolationType == \"smooth\" ? \"catmullrom\" : \"linear\",\n            data_points: [data_point]\n          });\n          if (channel == \"scale\") {\n            kf.uniform = data_point.x == data_point.y && data_point.x == data_point.z;\n          }\n        }\n      }\n      if (group) copyAnimationToGroupsWithSameName(animation, group);\n    }\n    animation.add(false);\n    if (!Animation2.selected && Animator.open) {\n      animation.select();\n    }\n  }\n  function compileAnimationFile(animation) {\n    const nodeAnimations = {};\n    const file = {\n      formatVersion: 1,\n      duration: Math.round(animation.length * FPS) || FPS * 2,\n      holdLastKeyframe: animation.loop == \"hold\",\n      nodeAnimations\n    };\n    const channels = {\n      position: \"position\",\n      rotation: \"orientation\",\n      scale: \"shapeStretch\",\n      visibility: \"shapeVisible\",\n      uv_offset: \"shapeUvOffset\"\n    };\n    for (let uuid in animation.animators) {\n      let animator = animation.animators[uuid];\n      let name = animator.name;\n      let node_data = {};\n      let has_data = false;\n      for (let channel in channels) {\n        let timeline;\n        let hytale_channel_key = channels[channel];\n        timeline = timeline = node_data[hytale_channel_key] = [];\n        let keyframe_list = animator[channel] && Array.isArray(animator[channel]) ? animator[channel].slice() : [];\n        keyframe_list.sort((a, b) => a.time - b.time);\n        for (let kf of keyframe_list) {\n          let data_point = kf.data_points[0];\n          let delta;\n          if (channel == \"visibility\") {\n            delta = data_point.visibility;\n          } else if (channel == \"uv_offset\") {\n            delta = {\n              x: Math.round(parseFloat(data_point.x)),\n              y: -Math.round(parseFloat(data_point.y))\n            };\n            delta = new oneLiner(delta);\n          } else {\n            if (channel == \"rotation\") {\n              let euler = new THREE.Euler(\n                Math.degToRad(kf.calc(\"x\")),\n                Math.degToRad(kf.calc(\"y\")),\n                Math.degToRad(kf.calc(\"z\")),\n                Format.euler_order\n              );\n              let quaternion = new THREE.Quaternion().setFromEuler(euler);\n              delta = {\n                x: quaternion.x,\n                y: quaternion.y,\n                z: quaternion.z,\n                w: quaternion.w\n              };\n            } else {\n              delta = {\n                x: kf.calc(\"x\"),\n                y: kf.calc(\"y\"),\n                z: kf.calc(\"z\")\n              };\n            }\n            delta = new oneLiner(delta);\n          }\n          let kf_output = {\n            time: Math.round(kf.time * FPS),\n            delta,\n            interpolationType: kf.interpolation == \"catmullrom\" ? \"smooth\" : \"linear\"\n          };\n          if (channel == \"uv_offset\") console.log(kf_output);\n          timeline.push(kf_output);\n          has_data = true;\n        }\n      }\n      if (has_data) {\n        if (!node_data.shapeUvOffset) {\n          node_data.shapeUvOffset = [];\n        }\n        nodeAnimations[name] = node_data;\n      }\n    }\n    return file;\n  }\n  function setupAnimationCodec() {\n    BarItems.load_animation_file.click = function(...args) {\n      if (FORMAT_IDS.includes(Format.id)) {\n        Filesystem.importFile({\n          resource_id: \"blockyanim\",\n          extensions: [\"blockyanim\"],\n          type: \"Blockyanim\",\n          multiple: true\n        }, async function(files) {\n          for (let file of files) {\n            let content = autoParseJSON(file.content);\n            parseAnimationFile(file, content);\n          }\n        });\n        return;\n      } else {\n        this.dispatchEvent(\"use\");\n        this.onClick(...args);\n        this.dispatchEvent(\"used\");\n      }\n    };\n    let export_anim = new Action(\"export_blockyanim\", {\n      name: \"Export Blockyanim\",\n      icon: \"cinematic_blur\",\n      condition: { formats: FORMAT_IDS, selected: { animation: true } },\n      click() {\n        let animation;\n        animation = Animation2.selected;\n        let content = compileJSON(compileAnimationFile(animation), Config.json_compile_options);\n        Filesystem.exportFile({\n          resource_id: \"blockyanim\",\n          type: \"Blockyanim\",\n          extensions: [\"blockyanim\"],\n          name: animation.name,\n          content\n        });\n      }\n    });\n    track(export_anim);\n    MenuBar.menus.animation.addAction(export_anim);\n    Panels.animations.toolbars[0].add(export_anim, \"4\");\n    let handler = Filesystem.addDragHandler(\"blockyanim\", {\n      extensions: [\"blockyanim\"],\n      readtype: \"text\",\n      condition: { modes: [\"animate\"] }\n    }, async function(files) {\n      for (let file of files) {\n        let content = autoParseJSON(file.content);\n        parseAnimationFile(file, content);\n      }\n    });\n    track(handler);\n    let original_save = Animation2.prototype.save;\n    Animation2.prototype.save = function(...args) {\n      if (!FORMAT_IDS.includes(Format.id)) {\n        return original_save.call(this, ...args);\n      }\n      let animation;\n      animation = this;\n      let content = compileJSON(compileAnimationFile(animation), Config.json_compile_options);\n      if (isApp && this.path) {\n        Blockbench.writeFile(this.path, { content }, (real_path) => {\n          this.saved = true;\n          this.saved_name = this.name;\n          this.path = real_path;\n        });\n      } else {\n        Blockbench.export({\n          resource_id: \"blockyanim\",\n          type: \"Blockyanim\",\n          extensions: [\"blockyanim\"],\n          name: animation.name,\n          startpath: this.path,\n          content\n        }, (real_path) => {\n          if (isApp) this.path == real_path;\n          this.saved = true;\n        });\n      }\n      return this;\n    };\n    track({\n      delete() {\n        Animation2.prototype.save = original_save;\n      }\n    });\n    let save_all_listener = BarItems.save_all_animations.on(\"use\", () => {\n      if (!isHytaleFormat()) return;\n      Animation2.all.forEach((animation) => {\n        if (!animation.saved) animation.save();\n      });\n      return false;\n    });\n    track(save_all_listener);\n    let original_condition = BarItems.export_animation_file.condition;\n    BarItems.export_animation_file.condition = () => {\n      return Condition(original_condition) && !FORMAT_IDS.includes(Format.id);\n    };\n    track({\n      delete() {\n        BarItems.export_animation_file.condition = original_condition;\n      }\n    });\n    let setting = new Setting(\"auto_load_hytale_animations\", {\n      name: \"Auto-load Hytale Animations\",\n      description: \"Automatically load blockyanim files when opening a Hytale model\",\n      category: \"edit\",\n      type: \"toggle\",\n      value: true\n    });\n    track(setting);\n  }\n\n  // src/texture.ts\n  function updateUVSize(texture) {\n    let size = [texture.width, texture.display_height];\n    let frames = texture.frameCount;\n    if (settings.detect_flipbook_textures.value == false || frames <= 2 || frames % 1) {\n      size[1] = texture.height;\n    }\n    texture.uv_width = size[0];\n    texture.uv_height = size[1];\n  }\n  function setupTextureHandling() {\n    let setting = new Setting(\"preview_selected_texture\", {\n      name: \"Preview Selected Texture\",\n      description: \"When selecting a texture in a Hytale format, preview the texture on the model instantly\",\n      category: \"preview\",\n      type: \"toggle\",\n      value: true\n    });\n    track(setting);\n    let handler = Blockbench.on(\"select_texture\", (arg) => {\n      if (!isHytaleFormat()) return;\n      if (setting.value == false) return;\n      let texture = arg.texture;\n      let texture_group = texture.getGroup();\n      if (texture_group) {\n        let collection = Collection.all.find((c) => c.name == texture_group.name);\n        if (collection) {\n          collection.texture = texture.uuid;\n          Canvas.updateAllFaces(texture);\n        }\n      } else {\n        texture.setAsDefaultTexture();\n      }\n      UVEditor.vue.updateTexture();\n    });\n    track(handler);\n  }\n\n  // src/attachment_texture.ts\n  function getCollection(cube) {\n    return Collection.all.find((c) => c.contains(cube));\n  }\n  function processAttachmentTextures(attachmentName, newTextures) {\n    let textureGroup = new TextureGroup({ name: attachmentName });\n    textureGroup.folded = true;\n    textureGroup.add();\n    if (newTextures.length === 0) return \"\";\n    for (let tex of newTextures) {\n      tex.group = textureGroup.uuid;\n      updateUVSize(tex);\n    }\n    let texture = newTextures.find((t) => t.name.startsWith(attachmentName)) ?? newTextures[0];\n    return texture.uuid;\n  }\n  function setupAttachmentTextures() {\n    let textureProperty = new Property(Collection, \"string\", \"texture\", {\n      condition: { formats: FORMAT_IDS }\n    });\n    track(textureProperty);\n    let originalGetTexture = CubeFace.prototype.getTexture;\n    CubeFace.prototype.getTexture = function(...args) {\n      if (isHytaleFormat()) {\n        if (this.texture == null) return null;\n        let collection = getCollection(this.cube);\n        if (collection && \"texture\" in collection) {\n          if (collection.texture) {\n            let texture = Texture.all.find((t) => t.uuid == collection.texture);\n            if (texture) return texture;\n          }\n          return null;\n        }\n        return Texture.getDefault();\n      }\n      return originalGetTexture.call(this, ...args);\n    };\n    track({\n      delete() {\n        CubeFace.prototype.getTexture = originalGetTexture;\n      }\n    });\n    let assignTexture = {\n      id: \"set_texture\",\n      name: \"menu.cube.texture\",\n      icon: \"collections\",\n      condition: { formats: FORMAT_IDS },\n      children(context) {\n        function applyTexture(textureValue, undoMessage) {\n          Undo.initEdit({ collections: Collection.selected });\n          for (let collection of Collection.selected) {\n            collection.texture = textureValue;\n          }\n          Undo.finishEdit(undoMessage);\n          Canvas.updateAllFaces();\n        }\n        let arr = [\n          {\n            icon: \"crop_square\",\n            name: Format.single_texture_default ? \"menu.cube.texture.default\" : \"menu.cube.texture.blank\",\n            click() {\n              applyTexture(\"\", \"Unassign texture from collection\");\n            }\n          }\n        ];\n        Texture.all.forEach((t) => {\n          arr.push({\n            name: t.name,\n            // @ts-expect-error\n            icon: t.img,\n            marked: t.uuid == context.texture,\n            click() {\n              applyTexture(t.uuid, \"Apply texture to collection\");\n            }\n          });\n        });\n        return arr;\n      }\n    };\n    Collection.menu.addAction(assignTexture);\n    track({\n      delete() {\n        Collection.menu.removeAction(\"set_texture\");\n      }\n    });\n  }\n\n  // src/attachments.ts\n  var reload_all_attachments;\n  function setupAttachments() {\n    setupAttachmentTextures();\n    let shared_delete = SharedActions.add(\"delete\", {\n      subject: \"collection\",\n      priority: 1,\n      condition: () => Prop.active_panel == \"collections\" && isHytaleFormat() && Collection.selected.some((c) => c.export_codec === \"blockymodel\"),\n      run() {\n        let collections = Collection.selected.slice();\n        let remove_elements = [];\n        let remove_groups = [];\n        let textures = [];\n        let texture_groups = [];\n        for (let collection of collections) {\n          if (collection.export_codec === \"blockymodel\") {\n            for (let child of collection.getAllChildren()) {\n              child = child;\n              (child instanceof Group ? remove_groups : remove_elements).safePush(child);\n            }\n            let texture_group = TextureGroup.all.find((tg) => tg.name === collection.name);\n            if (texture_group) {\n              let textures2 = Texture.all.filter((t) => t.group === texture_group.uuid);\n              textures.safePush(...textures2);\n              texture_groups.push(texture_group);\n            }\n          }\n        }\n        Undo.initEdit({\n          collections,\n          groups: remove_groups,\n          elements: remove_elements,\n          outliner: true,\n          // @ts-expect-error\n          texture_groups,\n          textures\n        });\n        collections.forEach((c) => Collection.all.remove(c));\n        collections.empty();\n        textures.forEach((t) => t.remove(true));\n        textures.empty();\n        texture_groups.forEach((t) => t.remove());\n        texture_groups.empty();\n        remove_groups.forEach((group) => group.remove());\n        remove_groups.empty();\n        remove_elements.forEach((element) => element.remove());\n        remove_elements.empty();\n        updateSelection();\n        Undo.finishEdit(\"Remove attachment\");\n      }\n    });\n    track(shared_delete);\n    let import_as_attachment = new Action(\"import_as_hytale_attachment\", {\n      name: \"Import Attachment\",\n      icon: \"fa-hat-cowboy\",\n      condition: { formats: FORMAT_IDS },\n      click() {\n        Filesystem.importFile({\n          extensions: [\"blockymodel\"],\n          type: \"Blockymodel\",\n          multiple: true,\n          startpath: Project.export_path.replace(/[\\\\\\/]\\w+.\\w+$/, \"\") + osfs + \"Attachments\"\n        }, (files) => {\n          for (let file of files) {\n            let json = autoParseJSON(file.content);\n            let attachment_name = file.name.replace(/\\.\\w+$/, \"\");\n            let content = Codecs.blockymodel.parse(json, file.path, { attachment: attachment_name });\n            let name = file.name.split(\".\")[0];\n            let new_groups = content.new_groups;\n            let root_groups = new_groups.filter((group) => !new_groups.includes(group.parent));\n            let collection = new Collection({\n              name,\n              children: root_groups.map((g) => g.uuid),\n              export_codec: \"blockymodel\",\n              visibility: true\n            }).add();\n            collection.export_path = file.path;\n            let texturesToProcess = content.new_textures;\n            if (texturesToProcess.length === 0) {\n              let dirname = PathModule.dirname(file.path);\n              let texturePaths = discoverTexturePaths(dirname, attachment_name);\n              for (let texPath of texturePaths) {\n                let tex = new Texture().fromPath(texPath).add(false);\n                texturesToProcess.push(tex);\n              }\n            }\n            let textureUuid = processAttachmentTextures(attachment_name, texturesToProcess);\n            if (textureUuid) {\n              collection.texture = textureUuid;\n            }\n            Canvas.updateAllFaces();\n          }\n        });\n      }\n    });\n    track(import_as_attachment);\n    let toolbar = Panels.collections.toolbars[0];\n    toolbar.add(import_as_attachment);\n    MenuBar.menus.file.addAction(import_as_attachment, \"import\");\n    function reloadAttachment(collection) {\n      for (let child of collection.getChildren()) {\n        child.remove();\n      }\n      Filesystem.readFile([collection.export_path], {}, ([file]) => {\n        let json = autoParseJSON(file.content);\n        let content = Codecs.blockymodel.parse(json, file.path, { attachment: collection.name });\n        let new_groups = content.new_groups;\n        let root_groups = new_groups.filter((group) => !new_groups.includes(group.parent));\n        collection.extend({\n          children: root_groups.map((g) => g.uuid)\n        }).add();\n        Canvas.updateAllFaces();\n      });\n    }\n    let reload_attachment_action = new Action(\"reload_hytale_attachment\", {\n      name: \"Reload Attachment\",\n      icon: \"refresh\",\n      condition: () => Collection.selected.length && Modes.edit && isHytaleFormat(),\n      click() {\n        for (let collection of Collection.selected) {\n          reloadAttachment(collection);\n        }\n      }\n    });\n    Collection.menu.addAction(reload_attachment_action, 10);\n    track(reload_attachment_action);\n    reload_all_attachments = new Action(\"reload_all_hytale_attachments\", {\n      name: \"Reload All Attachments\",\n      icon: \"sync\",\n      condition: { formats: FORMAT_IDS },\n      click() {\n        for (let collection of Collection.all.filter((c) => c.export_path)) {\n          reloadAttachment(collection);\n        }\n      }\n    });\n    track(reload_all_attachments);\n    toolbar.add(reload_all_attachments);\n  }\n\n  // src/animations.ts\n  function setupAnimation() {\n    function displayVisibility(animator) {\n      let group = animator.getGroup();\n      let main_shape = getMainShape(group);\n      if (!main_shape) return;\n      let scene_object = main_shape.scene_object;\n      if (animator.muted.visibility) {\n        scene_object.visible = group.visibility;\n        return;\n      }\n      let previous_keyframe;\n      let previous_time = -Infinity;\n      for (let keyframe of animator.visibility) {\n        if (keyframe.time <= Timeline.time && keyframe.time > previous_time) {\n          previous_keyframe = keyframe;\n          previous_time = keyframe.time;\n        }\n      }\n      if (previous_keyframe && scene_object) {\n        scene_object.visible = previous_keyframe.data_points[0]?.visibility != false;\n      } else if (scene_object) {\n        scene_object.visible = group.visibility;\n      }\n    }\n    BoneAnimator.addChannel(\"visibility\", {\n      name: \"Visibility\",\n      mutable: true,\n      transform: false,\n      max_data_points: 1,\n      condition: { formats: FORMAT_IDS },\n      displayFrame(animator, multiplier) {\n        displayVisibility(animator);\n      }\n    });\n    let vis_property = new Property(KeyframeDataPoint, \"boolean\", \"visibility\", {\n      label: \"Visibility\",\n      condition: (point) => point.keyframe.channel == \"visibility\",\n      default: true\n    });\n    track(vis_property);\n    let on_exit_anim_mode = Blockbench.on(\"unselect_mode\", (arg) => {\n      if (isHytaleFormat() && arg.mode?.id == \"animate\") {\n        Canvas.updateVisibility();\n      }\n    });\n    track(vis_property, on_exit_anim_mode);\n    function displayUVOffset(animator) {\n      let group = animator.getGroup();\n      let cube = getMainShape(group);\n      if (!cube) return;\n      let updateUV = (offset) => {\n        if (offset) {\n          offset = offset.map((v) => Math.round(v));\n        }\n        if (!offset || !offset[0] && !offset[1]) {\n          if (!cube.mesh.userData.uv_anim_offset) {\n            return;\n          } else {\n            cube.mesh.userData.uv_anim_offset = false;\n          }\n        } else {\n          cube.mesh.userData.uv_anim_offset = true;\n        }\n        offset = offset ?? [0, 0];\n        let fix_uvs = {};\n        for (let fkey in cube.faces) {\n          fix_uvs[fkey] = cube.faces[fkey].uv.slice();\n          cube.faces[fkey].uv[0] += offset[0];\n          cube.faces[fkey].uv[1] += offset[1];\n          cube.faces[fkey].uv[2] += offset[0];\n          cube.faces[fkey].uv[3] += offset[1];\n        }\n        Cube.preview_controller.updateUV(cube);\n        for (let fkey in cube.faces) {\n          cube.faces[fkey].uv.replace(fix_uvs[fkey]);\n        }\n      };\n      if (animator.muted.uv_offset) {\n        updateUV();\n        return;\n      }\n      let previous_keyframe;\n      let previous_time = -Infinity;\n      for (let keyframe of animator.uv_offset) {\n        if (keyframe.time <= Timeline.time && keyframe.time > previous_time) {\n          previous_keyframe = keyframe;\n          previous_time = keyframe.time;\n        }\n      }\n      if (previous_keyframe) {\n        updateUV(previous_keyframe.getArray());\n      } else if (true) {\n        updateUV();\n      }\n    }\n    BoneAnimator.addChannel(\"uv_offset\", {\n      name: \"UV Offset\",\n      mutable: true,\n      transform: true,\n      max_data_points: 1,\n      condition: { formats: FORMAT_IDS },\n      displayFrame(animator, multiplier) {\n        displayUVOffset(animator);\n      }\n    });\n    let original_condition = KeyframeDataPoint.properties.z.condition;\n    KeyframeDataPoint.properties.z.condition = (point) => {\n      if (point.keyframe.channel == \"uv_offset\") return false;\n      return Condition(original_condition, point);\n    };\n    function weightedCubicBezier(t) {\n      let P0 = 0, P1 = 0.05, P2 = 0.95, P3 = 1;\n      let W0 = 2, W1 = 1, W2 = 2, W3 = 1;\n      let b0 = (1 - t) ** 3;\n      let b1 = 3 * (1 - t) ** 2 * t;\n      let b2 = 3 * (1 - t) * t ** 2;\n      let b3 = t ** 3;\n      let w0 = b0 * W0;\n      let w1 = b1 * W1;\n      let w2 = b2 * W2;\n      let w3 = b3 * W3;\n      let numerator = w0 * P0 + w1 * P1 + w2 * P2 + w3 * P3;\n      let denominator = w0 + w1 + w2 + w3;\n      return numerator / denominator;\n    }\n    let on_interpolate = Blockbench.on(\"interpolate_keyframes\", (arg) => {\n      if (!isHytaleFormat()) return;\n      if (!arg.use_quaternions || !arg.t || arg.t == 1) return;\n      if (arg.keyframe_before.interpolation != \"catmullrom\" || arg.keyframe_after.interpolation != \"catmullrom\") return;\n      return {\n        t: weightedCubicBezier(arg.t)\n      };\n    });\n    track(on_interpolate);\n    let original_display_scale = BoneAnimator.prototype.displayScale;\n    let original_display_rotation = BoneAnimator.prototype.displayRotation;\n    let original_show_default_pose = Animator.showDefaultPose;\n    BoneAnimator.prototype.displayScale = function displayScale(array, multiplier = 1) {\n      if (!array) return this;\n      if (isHytaleFormat()) {\n        let target_shape = getMainShape(this.group);\n        if (target_shape) {\n          let initial_stretch = target_shape.stretch.slice();\n          target_shape.stretch.V3_set([\n            initial_stretch[0] * (1 + (array[0] - 1) * multiplier),\n            initial_stretch[1] * (1 + (array[1] - 1) * multiplier),\n            initial_stretch[2] * (1 + (array[2] - 1) * multiplier)\n          ]);\n          Cube.preview_controller.updateGeometry(target_shape);\n          target_shape.stretch.V3_set(initial_stretch);\n        }\n        return this;\n      }\n      return original_display_scale.call(this, array, multiplier);\n    };\n    if (Blockbench.isOlderThan(\"5.1.0\")) {\n      BoneAnimator.prototype.displayRotation = function displayRotation(array, multiplier = 1) {\n        if (isHytaleFormat() && array) {\n          let bone = this.group.scene_object;\n          let euler = Reusable.euler1.set(\n            Math.degToRad(array[0]) * multiplier,\n            Math.degToRad(array[1]) * multiplier,\n            Math.degToRad(array[2]) * multiplier,\n            bone.rotation.order\n          );\n          let q2 = Reusable.quat2.setFromEuler(euler);\n          bone.quaternion.multiply(q2);\n          return this;\n        }\n        return original_display_rotation.call(this, array, multiplier);\n      };\n    }\n    Animator.showDefaultPose = function(reduced_updates, ...args) {\n      original_show_default_pose(reduced_updates, ...args);\n      if (isHytaleFormat()) {\n        for (let cube of Cube.all) {\n          Cube.preview_controller.updateGeometry(cube);\n        }\n      }\n    };\n    track({\n      delete() {\n        BoneAnimator.prototype.displayScale = original_display_scale;\n        if (Blockbench.isOlderThan(\"5.1.0-beta.4\")) {\n          BoneAnimator.prototype.displayRotation = original_display_rotation;\n        }\n        Animator.showDefaultPose = original_show_default_pose;\n      }\n    });\n    const per_shape_channels = /* @__PURE__ */ new Set([\"scale\", \"visibility\", \"uv_offset\"]);\n    const on_init_edit = Blockbench.on(\"init_edit\", (arg) => {\n      if (arg.aspects.keyframes?.length == 1 && per_shape_channels.has(arg.aspects.keyframes[0].channel)) {\n        let kf = arg.aspects.keyframes[0];\n        let group = kf.animator.group;\n        if (!group.name) return;\n        let shape = getMainShape(group);\n        if (shape) return;\n        if (document.getElementById(\"toast_notification_list\").children.length) return;\n        Blockbench.showToastNotification({\n          // @ts-expect-error\n          id: \"hytale_no_connected_shape_toast\",\n          text: `The group \"${group.name}\" has no connected shape, so the ${kf.channel} animation will not apply. Click to learn more.`,\n          icon: \"fa-cube\",\n          expire: 20 * 1e3,\n          click: () => {\n            Blockbench.showMessageBox({\n              title: \"No connected shape\",\n              icon: \"info\",\n              width: 500,\n              message: `Scale, visibility, and UV animations only apply to one cube that's directly connected to the group. No shape is directly connected to this group.\n\nFor Hytale, the first cube inside a group qualifies as directly connected if it matches the following criteria:\n* The cube must be directly parented to the group\n* The rotation value of the cube itself must be 0`\n            });\n            return true;\n          }\n        });\n      }\n    });\n    track(on_init_edit);\n  }\n\n  // src/element.ts\n  function setupElements() {\n    let property_shading_mode = new Property(Cube, \"enum\", \"shading_mode\", {\n      default: \"flat\",\n      values: [\"flat\", \"standard\", \"fullbright\", \"reflective\"],\n      condition: { formats: FORMAT_IDS },\n      inputs: {\n        element_panel: {\n          input: { label: \"Shading Mode\", type: \"select\", options: {\n            flat: \"Flat\",\n            standard: \"Standard\",\n            fullbright: \"Always Lit\",\n            reflective: \"Reflective\"\n          } },\n          onChange() {\n          }\n        }\n      }\n    });\n    track(property_shading_mode);\n    let property_double_sided = new Property(Cube, \"boolean\", \"double_sided\", {\n      condition: { formats: FORMAT_IDS },\n      inputs: {\n        element_panel: {\n          input: { label: \"Double Sided\", type: \"checkbox\" },\n          onChange() {\n            Canvas.updateView({ elements: Cube.all, element_aspects: { transform: true } });\n          }\n        }\n      }\n    });\n    track(property_double_sided);\n    let is_piece_property = new Property(Group, \"boolean\", \"is_piece\", {\n      condition: { formats: FORMAT_IDS },\n      inputs: {\n        element_panel: {\n          input: {\n            label: \"Attachment Piece\",\n            type: \"checkbox\",\n            description: \"When checked, the node will be attached to a node of the same name when displayed as an attachment in-game.\"\n          }\n        }\n      }\n    });\n    track(is_piece_property);\n    let original_position_property = new Property(Group, \"vector\", \"original_position\", {\n      condition: { formats: FORMAT_IDS }\n    });\n    track(original_position_property);\n    let original_offset_property = new Property(Group, \"vector\", \"original_offset\", {\n      condition: { formats: FORMAT_IDS }\n    });\n    track(original_offset_property);\n    let add_quad_action = new Action(\"hytale_add_quad\", {\n      name: \"Add Quad\",\n      icon: \"highlighter_size_5\",\n      category: \"edit\",\n      condition: { formats: FORMAT_IDS, modes: [\"edit\"] },\n      click() {\n        let color = Math.floor(Math.random() * markerColors.length);\n        let initial = \"pos_z\";\n        function runEdit(amended, normal) {\n          Undo.initEdit({ outliner: true, elements: [], selection: true }, amended);\n          let base_quad = new Cube({\n            autouv: settings.autouv.value ? 1 : 0,\n            // @ts-ignore\n            double_sided: true,\n            box_uv: false,\n            color\n          }).init();\n          base_quad.mapAutoUV();\n          let group = getCurrentGroup();\n          if (group) {\n            base_quad.addTo(group);\n            if (settings.inherit_parent_color.value) base_quad.color = group.color;\n          }\n          let texture = Texture.all.length && Format.single_texture ? Texture.getDefault().uuid : false;\n          for (let face in base_quad.faces) {\n            base_quad.faces[face].texture = null;\n          }\n          let size = [8, 8, 8];\n          let positive = normal.startsWith(\"pos\");\n          switch (normal[4]) {\n            case \"x\": {\n              base_quad.faces.west.texture = positive ? null : texture;\n              base_quad.faces.east.texture = positive ? texture : null;\n              size[0] = 0;\n              break;\n            }\n            case \"y\": {\n              base_quad.faces.down.texture = positive ? null : texture;\n              base_quad.faces.up.texture = positive ? texture : null;\n              size[1] = 0;\n              break;\n            }\n            case \"z\": {\n              base_quad.faces.north.texture = positive ? null : texture;\n              base_quad.faces.south.texture = positive ? texture : null;\n              size[2] = 0;\n              break;\n            }\n          }\n          base_quad.extend({\n            from: [-size[0] / 2, 0, -size[2] / 2],\n            to: [size[0] / 2, size[1], size[2] / 2]\n          });\n          let fkey = Object.keys(base_quad.faces).find((fkey2) => base_quad.faces[fkey2].texture != null);\n          UVEditor.getSelectedFaces(base_quad, true).replace([fkey]);\n          base_quad.select();\n          Canvas.updateView({ elements: [base_quad], element_aspects: { transform: true, geometry: true, faces: true } });\n          Undo.finishEdit(\"Add quad\", { outliner: true, elements: selected, selection: true });\n          Vue.nextTick(function() {\n            if (settings.create_rename.value) {\n              base_quad.rename();\n            }\n          });\n        }\n        runEdit(false, initial);\n        Undo.amendEdit({\n          normal: {\n            type: \"inline_select\",\n            value: initial,\n            label: \"Normal\",\n            options: {\n              \"pos_x\": \"+X\",\n              \"neg_x\": \"-X\",\n              \"pos_y\": \"+Y\",\n              \"neg_y\": \"-Y\",\n              \"pos_z\": \"+Z\",\n              \"neg_z\": \"-Z\"\n            }\n          }\n        }, (form) => {\n          runEdit(true, form.normal);\n        });\n      }\n    });\n    track(add_quad_action);\n    let add_element_menu = BarItems.add_element.side_menu;\n    add_element_menu.addAction(add_quad_action);\n    let set_uv_mode_original = Cube.prototype.setUVMode;\n    Cube.prototype.setUVMode = function(box_uv, ...args) {\n      if (isHytaleFormat()) {\n        if (cubeIsQuad(this) && box_uv) return;\n      }\n      return set_uv_mode_original.call(this, box_uv, ...args);\n    };\n    track({\n      delete() {\n        Cube.prototype.setUVMode = set_uv_mode_original;\n      }\n    });\n    let inflate_condition_original = BarItems.slider_inflate.condition;\n    BarItems.slider_inflate.condition = () => {\n      if (isHytaleFormat()) return false;\n      return Condition(inflate_condition_original);\n    };\n    track({\n      delete() {\n        BarItems.slider_inflate.condition = inflate_condition_original;\n      }\n    });\n    Blockbench.on(\"finish_edit\", (arg) => {\n      if (!FORMAT_IDS.includes(Format.id)) return;\n      if (arg.aspects?.elements) {\n        let uv_changes = false;\n        for (let element of arg.aspects.elements) {\n          if (element instanceof Cube == false) continue;\n          if (!element.autouv) {\n            element.autouv = 1;\n            element.mapAutoUV();\n            element.preview_controller.updateUV(element);\n            uv_changes = true;\n          }\n          if (element.inflate) {\n            element.inflate = 0;\n            element.preview_controller.updateGeometry(element);\n            TickUpdates.selection = true;\n          }\n        }\n        if (uv_changes) {\n          UVEditor.vue.$forceUpdate();\n        }\n      }\n    });\n  }\n\n  // src/uv_cycling.ts\n  var cycleState = null;\n  var CLICK_THRESHOLD = 0;\n  function screenToUV(event) {\n    return UVEditor.getBrushCoordinates(event, UVEditor.texture);\n  }\n  function isPointInRect(x, y, rect) {\n    const minX = Math.min(rect.ax, rect.bx);\n    const maxX = Math.max(rect.ax, rect.bx);\n    const minY = Math.min(rect.ay, rect.by);\n    const maxY = Math.max(rect.ay, rect.by);\n    return x >= minX && x <= maxX && y >= minY && y <= maxY;\n  }\n  function getFacesAtUVPosition(uvX, uvY) {\n    const faces = [];\n    for (const cube of Cube.all) {\n      if (!cube.visibility) continue;\n      for (const faceKey in cube.faces) {\n        const face = cube.faces[faceKey];\n        if (face.enabled === false) continue;\n        const rect = face.getBoundingRect();\n        if (isPointInRect(uvX, uvY, rect)) {\n          faces.push({ cube, faceKey });\n        }\n      }\n    }\n    faces.sort((a, b) => {\n      if (a.cube.name !== b.cube.name) {\n        return a.cube.name.localeCompare(b.cube.name);\n      }\n      return a.faceKey.localeCompare(b.faceKey);\n    });\n    const currentSelectedFaces = UVEditor.selected_faces || [];\n    const currentCube = Cube.selected[0];\n    if (currentCube && currentSelectedFaces.length > 0) {\n      const currentFaceKey = currentSelectedFaces[0];\n      const currentIndex = faces.findIndex(\n        (f) => f.cube.uuid === currentCube.uuid && f.faceKey === currentFaceKey\n      );\n      if (currentIndex > 0) {\n        return [...faces.slice(currentIndex), ...faces.slice(0, currentIndex)];\n      }\n    }\n    return faces;\n  }\n  function selectFace(cube, faceKey) {\n    cube.select();\n    UVEditor.getSelectedFaces(cube, true).replace([faceKey]);\n    UVEditor.vue.$forceUpdate();\n    Canvas.updateView({\n      elements: [cube],\n      element_aspects: { faces: true }\n    });\n  }\n  function setupUVCycling() {\n    const uvPanel = Panels.uv;\n    if (!uvPanel) return;\n    function initializeClickHandler() {\n      const uv_viewport = uvPanel.node?.querySelector(\"#uv_viewport\");\n      if (!uv_viewport) return false;\n      let pendingClick = null;\n      function handleMouseDown(event) {\n        if (!FORMAT_IDS.includes(Format.id)) return;\n        if (Modes.paint) return;\n        if (event.button !== 0) return;\n        pendingClick = { uvPos: screenToUV(event) };\n      }\n      function handleMouseUp(event) {\n        if (!pendingClick) return;\n        if (event.button !== 0) return;\n        const uvPos = screenToUV(event);\n        pendingClick = null;\n        const isSamePosition = cycleState !== null && Math.abs(uvPos.x - cycleState.lastClickX) <= CLICK_THRESHOLD && Math.abs(uvPos.y - cycleState.lastClickY) <= CLICK_THRESHOLD;\n        if (isSamePosition && cycleState) {\n          cycleState.currentIndex = (cycleState.currentIndex + 1) % cycleState.facesAtPosition.length;\n          const { cube, faceKey } = cycleState.facesAtPosition[cycleState.currentIndex];\n          setTimeout(() => selectFace(cube, faceKey), 50);\n        } else {\n          const faces = getFacesAtUVPosition(uvPos.x, uvPos.y);\n          if (faces.length > 1) {\n            cycleState = {\n              lastClickX: uvPos.x,\n              lastClickY: uvPos.y,\n              currentIndex: 0,\n              facesAtPosition: faces\n            };\n          } else {\n            cycleState = null;\n          }\n        }\n      }\n      uv_viewport.addEventListener(\"mousedown\", handleMouseDown);\n      uv_viewport.addEventListener(\"mouseup\", handleMouseUp);\n      track({\n        delete() {\n          uv_viewport.removeEventListener(\"mousedown\", handleMouseDown);\n          uv_viewport.removeEventListener(\"mouseup\", handleMouseUp);\n        }\n      });\n      return true;\n    }\n    if (uvPanel.node && initializeClickHandler()) return;\n    let attempts = 0;\n    const interval = setInterval(() => {\n      attempts++;\n      if (uvPanel.node && initializeClickHandler()) {\n        clearInterval(interval);\n      } else if (attempts >= 50) {\n        clearInterval(interval);\n      }\n    }, 100);\n    track({ delete() {\n      clearInterval(interval);\n    } });\n  }\n\n  // src/validation.ts\n  var MAX_NODE_COUNT = 255;\n  function getNodeCount() {\n    let node_count = 0;\n    for (let group of Group.all) {\n      if (group.export == false) return;\n      if (Collection.all.find((c) => c.contains(group))) continue;\n      node_count++;\n      let main_shape = getMainShape(group);\n      for (let cube of group.children) {\n        if (cube instanceof Cube == false || cube.export == false) continue;\n        if (cube == main_shape) continue;\n        node_count++;\n      }\n    }\n    return node_count;\n  }\n  function setupChecks() {\n    let check = new ValidatorCheck(\"hytale_node_count\", {\n      update_triggers: [\"update_selection\"],\n      condition: { formats: FORMAT_IDS },\n      run() {\n        let node_count = getNodeCount();\n        if (node_count > MAX_NODE_COUNT) {\n          this.fail({\n            message: `The model contains ${node_count} nodes, which exceeds the maximum of ${MAX_NODE_COUNT} that Hytale will display.`\n          });\n        }\n      }\n    });\n    check.name = \"Hytale Node Count\";\n    track(check);\n    let uv_check = new ValidatorCheck(\"hytale_uv_size\", {\n      update_triggers: [\"update_selection\"],\n      condition: { formats: FORMAT_IDS },\n      run() {\n        for (let texture of Texture.all) {\n          if (texture.uv_width != texture.width || texture.uv_height != texture.height) {\n            this.fail({\n              message: `The texture ${texture.name} has a resolution (${texture.width}x${texture.height}) that does not match its UV size (${texture.uv_width}x${texture.uv_height}). Ensure that your pixel density is 64 for characters and 32 for props.`,\n              buttons: [\n                {\n                  name: \"Fix UV Size\",\n                  icon: \"build\",\n                  click() {\n                    updateUVSize(texture);\n                    texture.select();\n                  }\n                }\n              ]\n            });\n          }\n        }\n      }\n    });\n    uv_check.name = \"Hytale UV Size\";\n    track(uv_check);\n    let listener = Blockbench.on(\"display_model_stats\", ({ stats }) => {\n      if (!FORMAT_IDS.includes(Format.id)) return;\n      let node_count = getNodeCount();\n      stats.splice(0, 0, { label: \"Nodes\", value: node_count + \" / \" + MAX_NODE_COUNT });\n    });\n    track(listener);\n  }\n\n  // package.json\n  var package_default = {\n    name: \"hytale-blockbench-plugin\",\n    version: \"0.9.1\",\n    description: \"Create models and animations for Hytale\",\n    main: \"src/plugin.ts\",\n    type: \"module\",\n    scripts: {\n      build: \"esbuild src/plugin.ts --bundle --loader:.png=dataurl --outfile=dist/hytale_plugin.js\",\n      dev: \"esbuild src/plugin.ts --bundle --loader:.png=dataurl --outfile=dist/hytale_plugin.js --watch\"\n    },\n    author: \"JannisX11, Kanno\",\n    license: \"GPL-3.0\",\n    dependencies: {\n      \"blockbench-types\": \"^5.1.0\"\n    },\n    devDependencies: {\n      esbuild: \"^0.25.9\"\n    }\n  };\n\n  // src/photoshop_copy_paste.ts\n  function setupPhotoshopTools() {\n    let setting = new Setting(\"copy_paste_magenta_alpha\", {\n      name: \"Copy-Paste with Magenta Alpha\",\n      description: \"Copy image selections with magenta background and remove magenta when pasting to help transfer transparency to Photoshop\",\n      type: \"toggle\",\n      category: \"paint\",\n      value: false\n    });\n    track(setting);\n    let shared_copy = SharedActions.add(\"copy\", {\n      subject: \"image_content_photoshop\",\n      condition: () => Prop.active_panel == \"uv\" && Modes.paint && UVEditor.texture && FORMAT_IDS.includes(Format.id) && setting.value == true,\n      priority: 2,\n      run(event, cut) {\n        let texture = UVEditor.texture;\n        let selection = texture.selection;\n        let { canvas, ctx, offset } = texture.getActiveCanvas();\n        if (selection.override != null) {\n          Clipbench.image = {\n            x: offset[0],\n            y: offset[1],\n            frame: texture.currentFrame,\n            data: \"\"\n          };\n        } else {\n          let rect = selection.getBoundingRect();\n          let copy_canvas = document.createElement(\"canvas\");\n          let copy_ctx = copy_canvas.getContext(\"2d\");\n          copy_canvas.width = rect.width;\n          copy_canvas.height = rect.height;\n          selection.maskCanvas(copy_ctx, [rect.start_x, rect.start_y]);\n          copy_ctx.drawImage(canvas, -rect.start_x + offset[0], -rect.start_y + offset[1]);\n          Clipbench.image = {\n            x: rect.start_x,\n            y: rect.start_y,\n            frame: texture.currentFrame,\n            data: \"\"\n          };\n          canvas = copy_canvas;\n        }\n        let canvas_copy_magenta = document.createElement(\"canvas\");\n        let copy_ctx_magenta = canvas_copy_magenta.getContext(\"2d\");\n        canvas_copy_magenta.width = canvas.width;\n        canvas_copy_magenta.height = canvas.height;\n        copy_ctx_magenta.fillStyle = \"#ff00ff\";\n        copy_ctx_magenta.fillRect(0, 0, canvas.width, canvas.height);\n        copy_ctx_magenta.drawImage(canvas, 0, 0);\n        canvas = canvas_copy_magenta;\n        Clipbench.image.data = canvas.toDataURL(\"image/png\", 1);\n        if (isApp) {\n          let clipboard = requireNativeModule(\"clipboard\");\n          let img = nativeImage.createFromDataURL(Clipbench.image.data);\n          clipboard.writeImage(img);\n        } else {\n          canvas.toBlob((blob) => {\n            navigator.clipboard.write([\n              new ClipboardItem({\n                [blob.type]: blob\n              })\n            ]);\n          });\n        }\n        if (cut) {\n          SharedActions.runSpecific(\"delete\", \"image_content\", event, { message: \"Cut texture selection\" });\n        }\n      }\n    });\n    track(shared_copy);\n    let shared_paste = SharedActions.add(\"paste\", {\n      subject: \"image_content_photoshop\",\n      condition: () => Prop.active_panel == \"uv\" && Modes.paint && UVEditor.texture && FORMAT_IDS.includes(Format.id) && setting.value == true,\n      priority: 2,\n      run(event) {\n        let texture = UVEditor.texture;\n        async function loadFromDataUrl(data_url) {\n          let frame = new CanvasFrame();\n          await frame.loadFromURL(data_url);\n          Undo.initEdit({ textures: [texture], bitmap: true });\n          if (!texture.layers_enabled) {\n            texture.flags.add(\"temporary_layers\");\n            texture.activateLayers(false);\n          }\n          let offset;\n          if (Clipbench.image) {\n            offset = [Math.clamp(Clipbench.image.x, 0, texture.width), Math.clamp(Clipbench.image.y, 0, texture.height)];\n            offset[0] = Math.clamp(offset[0], 0, texture.width - frame.width);\n            offset[1] = Math.clamp(offset[1], 0, texture.height - frame.height);\n          }\n          let old_frame = Clipbench.image?.frame || 0;\n          if (old_frame || texture.currentFrame) {\n            offset[1] += texture.display_height * ((texture.currentFrame || 0) - old_frame);\n          }\n          let layer = new TextureLayer({ name: \"pasted\", offset }, texture);\n          let image_data = frame.ctx.getImageData(0, 0, frame.width, frame.height);\n          for (let i = 0; i < image_data.data.length; i += 4) {\n            if (image_data.data[i] == 255 && image_data.data[i + 1] == 0 && image_data.data[i + 2] == 255) {\n              image_data.data[i + 0] = 0;\n              image_data.data[i + 1] = 0;\n              image_data.data[i + 2] = 0;\n              image_data.data[i + 3] = 0;\n            }\n          }\n          layer.setSize(frame.width, frame.height);\n          layer.ctx.putImageData(image_data, 0, 0);\n          if (!offset) layer.center();\n          layer.addForEditing();\n          layer.setLimbo();\n          texture.updateChangesAfterEdit();\n          Undo.finishEdit(\"Paste into texture\");\n          if (Toolbox.selected.id != \"selection_tool\") BarItems.move_layer_tool.select();\n          updateInterfacePanels();\n          BARS.updateConditions();\n        }\n        if (isApp) {\n          let clipboard = requireNativeModule(\"clipboard\");\n          var image = clipboard.readImage().toDataURL();\n          loadFromDataUrl(image);\n        } else {\n          navigator.clipboard.read().then((content) => {\n            if (content && content[0] && content[0].types.includes(\"image/png\")) {\n              content[0].getType(\"image/png\").then((blob) => {\n                let url = URL.createObjectURL(blob);\n                loadFromDataUrl(url);\n              });\n            }\n          }).catch(() => {\n          });\n        }\n      }\n    });\n    track(shared_paste);\n  }\n\n  // src/pivot_marker.ts\n  var ThickLineAxisHelper = class ThickLineAxisHelper2 extends THREE.LineSegments {\n    constructor(size = 1) {\n      let a = 0.04, b = 0.025;\n      let vertices = [\n        0,\n        a,\n        0,\n        size,\n        a,\n        0,\n        0,\n        0,\n        b,\n        size,\n        0,\n        b,\n        0,\n        0,\n        -b,\n        size,\n        0,\n        -b,\n        0,\n        0,\n        a,\n        0,\n        size,\n        a,\n        b,\n        0,\n        0,\n        b,\n        size,\n        0,\n        -b,\n        0,\n        0,\n        -b,\n        size,\n        0,\n        a,\n        0,\n        0,\n        a,\n        0,\n        size,\n        0,\n        b,\n        0,\n        0,\n        b,\n        size,\n        0,\n        -b,\n        0,\n        0,\n        -b,\n        size\n      ];\n      let geometry = new THREE.BufferGeometry();\n      geometry.setAttribute(\"position\", new THREE.Float32BufferAttribute(vertices, 3));\n      let material = new THREE.LineBasicMaterial({ vertexColors: true });\n      super(geometry, material);\n      this.updateColors();\n      material.transparent = true;\n      material.depthTest = false;\n      this.renderOrder = 800;\n    }\n    updateColors() {\n      let colors = [\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.r.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.g.toArray(),\n        ...gizmo_colors.b.toArray(),\n        ...gizmo_colors.b.toArray(),\n        ...gizmo_colors.b.toArray(),\n        ...gizmo_colors.b.toArray(),\n        ...gizmo_colors.b.toArray(),\n        ...gizmo_colors.b.toArray()\n      ];\n      this.geometry.setAttribute(\"color\", new THREE.Float32BufferAttribute(colors, 3));\n    }\n  };\n  ThickLineAxisHelper.prototype.constructor = ThickLineAxisHelper;\n  var CustomPivotMarker = class {\n    original_helpers;\n    constructor() {\n      this.original_helpers = Canvas.pivot_marker.children.slice();\n      let [helper1, helper2] = this.original_helpers;\n      let helper1_new = new ThickLineAxisHelper(1);\n      let helper2_new = new ThickLineAxisHelper(1);\n      helper1_new.rotation.copy(helper1.rotation);\n      helper2_new.rotation.copy(helper2.rotation);\n      Canvas.pivot_marker.children.empty();\n      Canvas.pivot_marker.add(helper1_new, helper2_new);\n    }\n    delete() {\n      Canvas.pivot_marker.children.empty();\n      Canvas.pivot_marker.add(...this.original_helpers);\n    }\n  };\n  var GroupPivotIndicator = class {\n    dot;\n    listener;\n    cameraListener;\n    setting;\n    constructor() {\n      this.setting = new Setting(\"show_group_pivot_indicator\", {\n        name: \"Show Group Pivot Indicator\",\n        description: \"Show a dot in Edit mode indicating the rotation pivot point for animations\",\n        category: \"preview\",\n        type: \"toggle\",\n        value: true\n      });\n      let geometry = new THREE.SphereGeometry(0.65, 12, 12);\n      let material = new THREE.MeshBasicMaterial({\n        color: this.getAccentColor(),\n        transparent: true,\n        opacity: 0.9,\n        depthTest: false\n      });\n      this.dot = new THREE.Mesh(geometry, material);\n      this.dot.renderOrder = 900;\n      this.dot.visible = false;\n      Canvas.scene.add(this.dot);\n      Canvas.gizmos.push(this.dot);\n      this.listener = Blockbench.on(\"update_selection\", () => this.update());\n      this.cameraListener = Blockbench.on(\"update_camera_position\", () => this.updateScale());\n      this.update();\n    }\n    updateScale() {\n      if (!this.dot.visible) return;\n      let scale = Preview.selected.calculateControlScale(this.dot.position) || 0.8;\n      this.dot.scale.setScalar(scale * 0.7);\n    }\n    getAccentColor() {\n      let cssColor = getComputedStyle(document.body).getPropertyValue(\"--color-accent\").trim();\n      return new THREE.Color(cssColor || \"#3e90ff\");\n    }\n    update() {\n      if (!this.setting.value) {\n        this.dot.visible = false;\n        return;\n      }\n      if (Modes.paint) {\n        this.dot.visible = false;\n        return;\n      }\n      let group = this.getRelevantGroup();\n      if (!group) {\n        this.dot.visible = false;\n        return;\n      }\n      this.dot.material.color.copy(this.getAccentColor());\n      let mesh = group.mesh;\n      if (mesh) {\n        let worldPos = new THREE.Vector3();\n        mesh.getWorldPosition(worldPos);\n        this.dot.position.copy(worldPos);\n        this.dot.visible = true;\n        this.updateScale();\n      } else {\n        this.dot.visible = false;\n      }\n    }\n    getRelevantGroup() {\n      let sel = Outliner.selected[0];\n      if (!sel) return null;\n      while (sel.parent instanceof OutlinerNode && sel.parent.selected) {\n        sel = sel.parent;\n      }\n      if (sel instanceof Group) {\n        return sel;\n      }\n      if (sel.parent instanceof Group) {\n        return sel.parent;\n      }\n      return null;\n    }\n    delete() {\n      Canvas.scene.remove(this.dot);\n      this.dot.geometry.dispose();\n      this.dot.material.dispose();\n      this.listener.delete();\n      this.cameraListener.delete();\n      this.setting.delete();\n    }\n  };\n\n  // src/outliner_filter.ts\n  var HIDDEN_CLASS = \"hytale_attachment_hidden\";\n  var attachmentsHidden = false;\n  var visibilityUpdatePending = false;\n  function scheduleVisibilityUpdate() {\n    if (!attachmentsHidden || visibilityUpdatePending) return;\n    visibilityUpdatePending = true;\n    requestAnimationFrame(() => {\n      visibilityUpdatePending = false;\n      applyOutlinerVisibility();\n    });\n  }\n  function getAttachmentUUIDs() {\n    let uuids = [];\n    if (!Collection.all?.length) return uuids;\n    for (let collection of Collection.all) {\n      for (let child of collection.getChildren()) {\n        uuids.push(child.uuid);\n        if (\"children\" in child && Array.isArray(child.children)) {\n          collectChildUUIDs(child, uuids);\n        }\n      }\n    }\n    return uuids;\n  }\n  function collectChildUUIDs(parent, uuids) {\n    for (let child of parent.children) {\n      if (child instanceof OutlinerNode) {\n        uuids.push(child.uuid);\n        if (\"children\" in child && Array.isArray(child.children)) {\n          collectChildUUIDs(child, uuids);\n        }\n      }\n    }\n  }\n  function applyOutlinerVisibility() {\n    if (!isHytaleFormat()) return;\n    const outlinerNode = Panels.outliner?.node;\n    if (!outlinerNode) return;\n    if (!attachmentsHidden) {\n      outlinerNode.querySelectorAll(`.${HIDDEN_CLASS}`).forEach((el) => {\n        el.classList.remove(HIDDEN_CLASS);\n      });\n      for (let collection of Collection.all ?? []) {\n        for (let child of collection.getChildren()) {\n          unlockRecursive(child);\n        }\n      }\n      return;\n    }\n    const uuids = getAttachmentUUIDs();\n    for (let uuid of uuids) {\n      let node = outlinerNode.querySelector(`[id=\"${uuid}\"]`);\n      if (node) {\n        node.classList.add(HIDDEN_CLASS);\n      }\n      let element = OutlinerNode.uuids[uuid];\n      if (element) {\n        element.locked = true;\n      }\n    }\n  }\n  function unlockRecursive(node) {\n    node.locked = false;\n    if (\"children\" in node && Array.isArray(node.children)) {\n      for (let child of node.children) {\n        if (child instanceof OutlinerNode) {\n          unlockRecursive(child);\n        }\n      }\n    }\n  }\n  function setupOutlinerFilter() {\n    let style = Blockbench.addCSS(`\n\t\t.outliner_node.${HIDDEN_CLASS} {\n\t\t\tdisplay: none !important;\n\t\t}\n\t\t/* Lock overlay on attachment toggle when active */\n\t\t.tool[toolbar_item=\"toggle_attachment_editing\"].enabled .fa-paperclip::after {\n\t\t\tcontent: \"lock\";\n\t\t\tfont-family: \"Material Icons\";\n\t\t\tfont-size: 14px;\n\t\t\tposition: absolute;\n\t\t\tbottom: -1px;\n\t\t\tright: -3px;\n\t\t\ttext-shadow:\n\t\t\t\t-1.5px -1.5px 0 var(--color-accent),\n\t\t\t\t1.5px -1.5px 0 var(--color-accent),\n\t\t\t\t-1.5px 1.5px 0 var(--color-accent),\n\t\t\t\t1.5px 1.5px 0 var(--color-accent),\n\t\t\t\t0px -1.5px 0 var(--color-accent),\n\t\t\t\t0px 1.5px 0 var(--color-accent),\n\t\t\t\t-1.5px 0px 0 var(--color-accent),\n\t\t\t\t1.5px 0px 0 var(--color-accent);\n\t\t}\n\t\t.tool[toolbar_item=\"toggle_attachment_editing\"] .fa-paperclip {\n\t\t\tposition: relative;\n\t\t}\n\t`);\n    StateMemory.init(\"hytale_attachments_hidden\", \"boolean\");\n    attachmentsHidden = StateMemory.get(\"hytale_attachments_hidden\") ?? false;\n    let toggle = new Toggle(\"toggle_attachment_editing\", {\n      name: \"Toggle Attachment Editing\",\n      description: \"Lock or unlock attachment elements for editing\",\n      icon: \"fa-paperclip\",\n      category: \"view\",\n      condition: { formats: FORMAT_IDS },\n      default: attachmentsHidden,\n      onChange(value) {\n        attachmentsHidden = value;\n        StateMemory.set(\"hytale_attachments_hidden\", value);\n        applyOutlinerVisibility();\n      }\n    });\n    let outlinerPanel = Panels.outliner;\n    if (outlinerPanel && outlinerPanel.toolbars.length > 0) {\n      outlinerPanel.toolbars[0].add(toggle, -1);\n    }\n    let hookFinishedEdit = Blockbench.on(\"finished_edit\", scheduleVisibilityUpdate);\n    let hookSelectMode = Blockbench.on(\"select_mode\", scheduleVisibilityUpdate);\n    let hookSelection = Blockbench.on(\"update_selection\", scheduleVisibilityUpdate);\n    if (attachmentsHidden) {\n      setTimeout(applyOutlinerVisibility, 100);\n    }\n    track(toggle, hookFinishedEdit, hookSelectMode, hookSelection, style, {\n      delete() {\n        Panels.outliner?.node?.querySelectorAll(`.${HIDDEN_CLASS}`).forEach((el) => {\n          el.classList.remove(HIDDEN_CLASS);\n        });\n      }\n    });\n  }\n\n  // src/uv_outline.ts\n  var UV_OUTLINE_CSS = `\nbody.hytale-format[mode=edit] #uv_frame .uv_resize_corner,\nbody.hytale-format[mode=edit] #uv_frame .uv_resize_side,\nbody.hytale-format[mode=edit] #uv_frame #uv_scale_handle,\nbody.hytale-format[mode=edit] #uv_frame #uv_selection_frame {\n    display: none;\n}\n\nbody.hytale-format #uv_frame.overlay_mode {\n    --uv-line-width: 2px;\n}\nbody.hytale-format #uv_frame.overlay_mode .cube_uv_face {\n    border-color: transparent !important;\n}\nbody.hytale-format #uv_frame.overlay_mode .cube_uv_face::before {\n    content: '';\n    position: absolute;\n    top: -1px;\n    left: -1px;\n    right: -1px;\n    bottom: -1px;\n    border: 1px solid var(--color-text);\n    pointer-events: none;\n}\nbody.hytale-format #uv_frame.overlay_mode .cube_uv_face.selected:not(.unselected) {\n    outline: none;\n}\n\nbody.hytale-uv-outline-only #uv_frame {\n    --color-uv-background: transparent;\n    --color-uv-background-hover: transparent;\n}\nbody.hytale-uv-outline-only #uv_frame .cube_uv_face {\n    border-color: transparent !important;\n}\nbody.hytale-uv-outline-only #uv_frame .cube_uv_face::before {\n    content: '';\n    position: absolute;\n    top: -1px;\n    left: -1px;\n    right: -1px;\n    bottom: -1px;\n    border: 1px solid var(--color-text);\n    pointer-events: none;\n}\nbody.hytale-uv-outline-only #uv_frame .cube_uv_face:hover::before {\n    border-color: var(--color-accent);\n}\nbody.hytale-uv-outline-only #uv_frame:not(.overlay_mode) .cube_uv_face.selected:not(.unselected)::before {\n    top: -2px;\n    left: -2px;\n    right: -2px;\n    bottom: -2px;\n    border-width: 2px;\n    border-color: var(--color-accent);\n}\nbody.hytale-uv-outline-only #uv_frame .mesh_uv_face polygon {\n    stroke-width: 1px;\n}\nbody.hytale-uv-outline-only #uv_frame:not(.overlay_mode) .mesh_uv_face.selected polygon {\n    stroke-width: 2px;\n}\nbody.hytale-uv-outline-only #uv_frame .selection_rectangle {\n    background-color: transparent;\n}\n`;\n  function updateHytaleFormatClass() {\n    document.body.classList.toggle(\"hytale-format\", isHytaleFormat());\n  }\n  function setupUVOutline() {\n    const style = Blockbench.addCSS(UV_OUTLINE_CSS);\n    track(style);\n    const setting = new Setting(\"uv_outline_only\", {\n      name: \"UV Outline Only\",\n      description: \"Show only outlines for UV faces instead of filled overlays\",\n      category: \"edit\",\n      value: false,\n      onChange(value) {\n        document.body.classList.toggle(\"hytale-uv-outline-only\", value);\n      }\n    });\n    track(setting);\n    const selectProjectListener = Blockbench.on(\"select_project\", updateHytaleFormatClass);\n    track(selectProjectListener);\n    document.body.classList.toggle(\"hytale-uv-outline-only\", settings.uv_outline_only?.value ?? true);\n    updateHytaleFormatClass();\n  }\n\n  // src/temp_fixes.js\n  function setupTempFixes() {\n    if (!Blockbench.isOlderThan(\"5.0.7\")) return;\n    Cube.prototype.mapAutoUV = function(options = {}) {\n      if (this.box_uv) return;\n      var scope = this;\n      if (scope.autouv === 2) {\n        var all_faces = [\"north\", \"south\", \"west\", \"east\", \"up\", \"down\"];\n        let offset = Format.centered_grid ? 8 : 0;\n        all_faces.forEach(function(side) {\n          var uv = scope.faces[side].uv.slice();\n          let texture = scope.faces[side].getTexture();\n          let uv_width = Project.getUVWidth(texture);\n          let uv_height = Project.getUVHeight(texture);\n          switch (side) {\n            case \"north\":\n              uv = [\n                uv_width - (scope.to[0] + offset),\n                uv_height - scope.to[1],\n                uv_width - (scope.from[0] + offset),\n                uv_height - scope.from[1]\n              ];\n              break;\n            case \"south\":\n              uv = [\n                scope.from[0] + offset,\n                uv_height - scope.to[1],\n                scope.to[0] + offset,\n                uv_height - scope.from[1]\n              ];\n              break;\n            case \"west\":\n              uv = [\n                scope.from[2] + offset,\n                uv_height - scope.to[1],\n                scope.to[2] + offset,\n                uv_height - scope.from[1]\n              ];\n              break;\n            case \"east\":\n              uv = [\n                uv_width - (scope.to[2] + offset),\n                uv_height - scope.to[1],\n                uv_width - (scope.from[2] + offset),\n                uv_height - scope.from[1]\n              ];\n              break;\n            case \"up\":\n              uv = [\n                scope.from[0] + offset,\n                scope.from[2] + offset,\n                scope.to[0] + offset,\n                scope.to[2] + offset\n              ];\n              break;\n            case \"down\":\n              uv = [\n                scope.from[0] + offset,\n                uv_height - (scope.to[2] + offset),\n                scope.to[0] + offset,\n                uv_height - (scope.from[2] + offset)\n              ];\n              break;\n          }\n          if (Math.max(uv[0], uv[2]) > uv_width) {\n            let offset2 = Math.max(uv[0], uv[2]) - uv_width;\n            uv[0] -= offset2;\n            uv[2] -= offset2;\n          }\n          if (Math.min(uv[0], uv[2]) < 0) {\n            let offset2 = Math.min(uv[0], uv[2]);\n            uv[0] = Math.clamp(uv[0] - offset2, 0, uv_width);\n            uv[2] = Math.clamp(uv[2] - offset2, 0, uv_width);\n          }\n          if (Math.max(uv[1], uv[3]) > uv_height) {\n            let offset2 = Math.max(uv[1], uv[3]) - uv_height;\n            uv[1] -= offset2;\n            uv[3] -= offset2;\n          }\n          if (Math.min(uv[1], uv[3]) < 0) {\n            let offset2 = Math.min(uv[1], uv[3]);\n            uv[1] = Math.clamp(uv[1] - offset2, 0, uv_height);\n            uv[3] = Math.clamp(uv[3] - offset2, 0, uv_height);\n          }\n          scope.faces[side].uv = uv;\n        });\n        scope.preview_controller.updateUV(scope);\n      } else if (scope.autouv === 1) {\n        let calcAutoUV = function(fkey, dimension_axes, world_directions) {\n          let size = dimension_axes.map((axis) => scope.size(axis));\n          let face = scope.faces[fkey];\n          size[0] = Math.abs(size[0]);\n          size[1] = Math.abs(size[1]);\n          let sx = face.uv[0];\n          let sy = face.uv[1];\n          let previous_size = face.uv_size;\n          let rot = face.rotation;\n          let texture = face.getTexture();\n          let uv_width = Project.getUVWidth(texture);\n          let uv_height = Project.getUVHeight(texture);\n          if (rot === 90 || rot === 270) {\n            size.reverse();\n            dimension_axes.reverse();\n            world_directions.reverse();\n          }\n          if (rot == 180) {\n            world_directions[0] *= -1;\n            world_directions[1] *= -1;\n          }\n          size[0] = Math.clamp(size[0], -uv_width, uv_width) * (Math.sign(previous_size[0]) || 1);\n          size[1] = Math.clamp(size[1], -uv_height, uv_height) * (Math.sign(previous_size[1]) || 1);\n          if (options && typeof options.axis == \"number\") {\n            if (options.axis == dimension_axes[0] && options.direction == world_directions[0]) {\n              sx += previous_size[0] - size[0];\n            }\n            if (options.axis == dimension_axes[1] && options.direction == world_directions[1]) {\n              sy += previous_size[1] - size[1];\n            }\n          }\n          if (sx < 0) sx = 0;\n          if (sy < 0) sy = 0;\n          let endx = sx + size[0];\n          let endy = sy + size[1];\n          if (endx > uv_width) {\n            sx = uv_width - (endx - sx);\n            endx = uv_width;\n          }\n          if (endy > uv_height) {\n            sy = uv_height - (endy - sy);\n            endy = uv_height;\n          }\n          return [sx, sy, endx, endy];\n        };\n        scope.faces.north.uv = calcAutoUV(\"north\", [0, 1], [1, 1]);\n        scope.faces.east.uv = calcAutoUV(\"east\", [2, 1], [1, 1]);\n        scope.faces.south.uv = calcAutoUV(\"south\", [0, 1], [-1, 1]);\n        scope.faces.west.uv = calcAutoUV(\"west\", [2, 1], [-1, 1]);\n        scope.faces.up.uv = calcAutoUV(\"up\", [0, 2], [-1, -1]);\n        scope.faces.down.uv = calcAutoUV(\"down\", [0, 2], [-1, 1]);\n        scope.preview_controller.updateUV(scope);\n      }\n    };\n    BarItems.group_elements.click = function() {\n      Undo.initEdit({ outliner: true, groups: [] });\n      let add_group = Group.first_selected;\n      if (!add_group && Outliner.selected.length) {\n        add_group = Outliner.selected.last();\n      }\n      let new_name = add_group?.name;\n      let base_group = new Group({\n        origin: add_group ? add_group.origin : void 0,\n        name: [\"cube\", \"mesh\"].includes(new_name) ? void 0 : new_name\n      });\n      base_group.sortInBefore(add_group);\n      base_group.isOpen = true;\n      base_group.init();\n      if (base_group.getTypeBehavior(\"unique_name\")) {\n        base_group.createUniqueName();\n      }\n      Outliner.selected.concat(Group.multi_selected).forEach((s) => {\n        if (s.parent?.selected) return;\n        s.addTo(base_group);\n        s.preview_controller.updateTransform(s);\n      });\n      base_group.select();\n      Undo.finishEdit(\"Add group\", { outliner: true, groups: [base_group] });\n      Vue.nextTick(function() {\n        updateSelection();\n        if (settings.create_rename.value) {\n          base_group.rename();\n        }\n        base_group.showInOutliner();\n        Blockbench.dispatchEvent(\"group_elements\", { object: base_group });\n      });\n    };\n  }\n\n  // src/references/player.json\n  var player_default = {\n    texture_size: [256, 128],\n    cubes: [\n      {\n        position: [-12.74, 45.10128, -8.82],\n        size: [25.48, 11.79744, 17.64],\n        faces: {\n          north: { uv: [68, 115, 94, 127] },\n          east: { uv: [50, 115, 68, 127] },\n          south: { uv: [24, 115, 50, 127] },\n          west: { uv: [6, 115, 24, 127] },\n          up: { uv: [216, 83, 242, 101] },\n          down: { uv: [216, 101, 242, 119] }\n        }\n      },\n      {\n        position: [-13, 55, -9],\n        size: [26, 16, 18],\n        faces: {\n          north: { uv: [68, 99, 94, 115] },\n          east: { uv: [50, 99, 68, 115] },\n          south: { uv: [24, 99, 50, 115] },\n          west: { uv: [6, 99, 24, 115] },\n          up: { uv: [52, 58, 78, 76] },\n          down: { uv: [52, 58, 78, 76] }\n        }\n      },\n      {\n        position: [-13.72, 68.22, -9.5],\n        size: [27.44, 21.56, 19],\n        faces: {\n          north: { uv: [71, 77, 99, 99] },\n          east: { uv: [51, 77, 71, 99] },\n          south: { uv: [23, 77, 51, 99] },\n          west: { uv: [3, 77, 23, 99] },\n          up: { uv: [23, 57, 51, 77] },\n          down: { uv: [51, 57, 79, 77] }\n        }\n      },\n      {\n        position: [-15, 93, -13],\n        size: [30, 28, 28],\n        faces: {\n          north: { uv: [86, 28, 116, 56] },\n          east: { uv: [58, 28, 86, 56] },\n          south: { uv: [28, 28, 58, 56] },\n          west: { uv: [0, 28, 28, 56] },\n          up: { uv: [28, 0, 58, 28] },\n          down: { uv: [58, 0, 88, 28] }\n        }\n      },\n      {\n        position: [-7.5, 85.04378, -5.5],\n        size: [15, 17.91244, 11],\n        faces: {\n          north: { uv: [106, 63, 121, 76] },\n          east: { uv: [95, 63, 106, 76] },\n          south: { uv: [80, 63, 95, 76] },\n          west: { uv: [95, 63, 106, 76] },\n          down: { uv: [30, 63, 45, 74] }\n        }\n      },\n      {\n        position: [-20.10255, 68.71157, -7.1452],\n        size: [7.84, 20, 12],\n        origin: [-16.18255, 78.71157, -1.1452],\n        rotation: [0.6131, -6.9732, -5.0374],\n        faces: {\n          north: { uv: [149, 12, 157, 32] },\n          east: { uv: [137, 12, 149, 32] },\n          south: { uv: [129, 12, 137, 32] },\n          west: { uv: [117, 12, 129, 32] },\n          up: { uv: [129, 12, 117, 4] },\n          down: { uv: [137, 0, 145, 12] }\n        }\n      },\n      {\n        position: [-21.73964, 52.77981, -7.33636],\n        size: [8, 16, 12],\n        origin: [-17.73964, 60.77981, -1.33636],\n        rotation: [0.6131, -6.9732, -5.0374],\n        faces: {\n          north: { uv: [149, 32, 157, 48] },\n          east: { uv: [137, 32, 149, 48] },\n          south: { uv: [129, 32, 137, 48] },\n          west: { uv: [117, 32, 129, 48] },\n          up: { uv: [149, 26, 157, 38] },\n          down: { uv: [129, 26, 137, 38] }\n        }\n      },\n      {\n        position: [-23.86423, 41.82928, -8.47444],\n        size: [10, 12, 14],\n        origin: [-18.86423, 47.82928, -1.47444],\n        rotation: [0.6131, -6.9732, -5.0374],\n        faces: {\n          north: { uv: [165, 48, 155, 60] },\n          east: { uv: [141, 48, 155, 60] },\n          south: { uv: [131, 48, 141, 60] },\n          west: { uv: [117, 48, 131, 60] },\n          up: { uv: [118, 33, 128, 47] },\n          down: { uv: [155, 70, 141, 60] }\n        }\n      },\n      {\n        position: [20.10255, 68.71157, -7.1452],\n        size: [-7.84, 20, 12],\n        origin: [16.18255, 78.71157, -1.1452],\n        rotation: [0.6131, 6.9732, 5.0374],\n        faces: {\n          north: { uv: [149, 12, 157, 32] },\n          east: { uv: [137, 12, 149, 32] },\n          south: { uv: [129, 12, 137, 32] },\n          west: { uv: [117, 12, 129, 32] },\n          up: { uv: [129, 12, 117, 4] },\n          down: { uv: [137, 0, 145, 12] }\n        }\n      },\n      {\n        position: [21.73964, 52.77982, -7.33636],\n        size: [-8, 16, 12],\n        origin: [17.73964, 60.77982, -1.33636],\n        rotation: [0.6131, 6.9732, 5.0374],\n        faces: {\n          north: { uv: [149, 32, 157, 48] },\n          east: { uv: [137, 32, 149, 48] },\n          south: { uv: [129, 32, 137, 48] },\n          west: { uv: [117, 32, 129, 48] },\n          up: { uv: [149, 26, 157, 38] },\n          down: { uv: [129, 26, 137, 38] }\n        }\n      },\n      {\n        position: [23.86423, 41.82928, -8.47444],\n        size: [-10, 12, 14],\n        origin: [18.86423, 47.82928, -1.47444],\n        rotation: [0.6131, 6.9732, 5.0374],\n        faces: {\n          north: { uv: [165, 48, 155, 60] },\n          east: { uv: [141, 48, 155, 60] },\n          south: { uv: [131, 48, 141, 60] },\n          west: { uv: [117, 48, 131, 60] },\n          up: { uv: [118, 33, 128, 47] },\n          down: { uv: [155, 70, 141, 60] }\n        }\n      },\n      {\n        position: [-12.40001, 29, -5],\n        size: [9.8, 20, 12],\n        origin: [-7.50001, 39, 1],\n        rotation: [0, -2.1999, 0],\n        faces: {\n          north: { uv: [155, 77, 145, 97] },\n          east: { uv: [133, 77, 145, 97] },\n          south: { uv: [123, 77, 133, 97] },\n          west: { uv: [111, 77, 123, 97] },\n          down: { uv: [123, 93, 133, 105] }\n        }\n      },\n      {\n        position: [-12.50001, 5, -5],\n        size: [10, 24, 12],\n        origin: [-7.50001, 17, 1],\n        rotation: [0, -2.1999, 0],\n        faces: {\n          north: { uv: [145, 97, 155, 121] },\n          east: { uv: [133, 97, 145, 121] },\n          south: { uv: [123, 97, 133, 121] },\n          west: { uv: [111, 97, 123, 121] },\n          up: { uv: [123, 85, 133, 97] },\n          down: { uv: [221, 37, 209, 27] }\n        }\n      },\n      {\n        position: [-14.22678, 0.2, -6.50147],\n        size: [13.3, 7.6, 19],\n        origin: [-7.57678, 4, 2.99853],\n        rotation: [0, -2.1999, 0],\n        faces: {\n          north: { uv: [215, 55, 223, 41] },\n          east: { uv: [223, 33, 243, 41] },\n          south: { uv: [251, 55, 243, 41] },\n          west: { uv: [223, 55, 243, 63] },\n          up: { uv: [243, 55, 223, 41] },\n          down: { uv: [223, 77, 243, 63] }\n        }\n      },\n      {\n        position: [12.4, 29, -5],\n        size: [-9.8, 20, 12],\n        origin: [7.5, 39, 1],\n        rotation: [0, 2.1999, 0],\n        faces: {\n          north: { uv: [190, 77, 200, 97] },\n          east: { uv: [178, 77, 190, 97] },\n          south: { uv: [168, 77, 178, 97] },\n          west: { uv: [156, 77, 168, 97] },\n          down: { uv: [168, 105, 178, 93] }\n        }\n      },\n      {\n        position: [12.5, 5, -5],\n        size: [-10, 24, 12],\n        origin: [7.5, 17, 1],\n        rotation: [0, 2.1999, 0],\n        faces: {\n          north: { uv: [190, 97, 200, 121] },\n          east: { uv: [178, 97, 190, 121] },\n          south: { uv: [178, 97, 168, 121] },\n          west: { uv: [156, 97, 168, 121] },\n          up: { uv: [178, 86, 168, 98] },\n          down: { uv: [221, 37, 209, 27] }\n        }\n      },\n      {\n        position: [14.22677, 0.2, -6.50147],\n        size: [-13.3, 7.6, 19],\n        origin: [7.57677, 4, 2.99853],\n        rotation: [0, 2.1999, 0],\n        faces: {\n          north: { uv: [215, 24, 223, 10] },\n          east: { uv: [223, 2, 243, 10] },\n          south: { uv: [251, 24, 243, 10] },\n          west: { uv: [223, 24, 243, 32] },\n          up: { uv: [243, 24, 223, 10] },\n          down: { uv: [223, 77, 243, 63] }\n        }\n      }\n    ]\n  };\n\n  // src/references/player.png\n  var player_default2 = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAACACAYAAADktbcKAAADDElEQVR4nOzdMW7TUBzH8YfUC3TqkqEbC1eAjYtE4gBRzhHlAJVyChbW9AZMIDEwREKwWOICoCAVqRKlcWw/2/l9PkuntnFTffMS+/19VSpbr9e/ygiapilj2O12L8rMbbfb/z5nq9Vq9seY6qoAsQQARtL3aniz2bReiQkABBOAC9T2leWcVw4ugwBAMAGAYAIAwQQAggkABBMAGMhzV1DW/n3/umJTACCYAND5lart99s7MB0CAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAYyHN7HkwFBkYlABBMAKCjOW+Hvqp9r77FYlESPBxn7akw9trThhUABBMACCYAEEwAYCRTuCejAMBIXAgEjEoAIJgAQDABgI7mfPGVAEAwAYBgAgDBBAAG4vbgwKQJAAQTAAgmABBMACCYAEAwAaAcDoc/X2vNazzndBXDEAAIJgAQTAAgmABAMAGAYAIAwQQABjKL24NPYTY5MI5BVwCXfuNRF6wwd94CQDABgGACcIGG/lxnuVye9dZut9t5yzQxAgDBBACCCUBHXSa/PmzDPUWXMxzOVkxT0zRlbAIAwQQAggkABBMACCYAEEwAIJgA0Jor+i6HAEAwAYBgAgDBBACCCQAEE4CObLRhzh798/Y9w6/2jL42u+tOMfUZg22fr1OPp+3f8dSfezy+OT7mcsGsACCYAEAwAYBgAgDBBACCCQAM6PWbd1XujnW/vzvrbIUAQDABgGACAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQ7FEANpvN3z3FfUwIPk5qrTVZt6+JwLUer3HiTIEVAAQTABjQl0/7MmUCAMEEAIIJAAQTAAgmABBMACCYAEAwAYBgAgDBBACCCQAEEwAIJgAQ7MkAfHj/sfTh+uZnqaH5/rX0odbjhSmwAoBgAgDBBACCCQAM6NuPz5Oe/SgAEOzJOr16+bbzVOCj65vbUkN/ZwFuSw33+ztTgRmdFQAEEwAIJgAQTAAgmABAMJ9EQ7DfAAAA//+uHsCBAAAABklEQVQDADCBnIyfROhlAAAAAElFTkSuQmCC\";\n\n  // src/references/default.json\n  var default_default = {\n    fov: 70,\n    preview_models: [\n      {\n        id: \"hytale_default\",\n        texture: \"hytale/default/default.png\",\n        texture_size: [32, 32],\n        prefabs: {\n          grass_block: {\n            position: [-8, 0, -8],\n            size: [16, 16, 16],\n            faces: {\n              north: { uv: [0, 16, 16, 32] },\n              south: { uv: [0, 16, 16, 32] },\n              east: { uv: [0, 16, 16, 32] },\n              west: { uv: [0, 16, 16, 32] },\n              up: { uv: [0, 0, 16, 16] },\n              down: { uv: [16, 16, 32, 32] }\n            }\n          }\n        },\n        cubes: [\n          {\n            prefab: \"grass_block\",\n            offset: [0, -1, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -1, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -1, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -1, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -1, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -1, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -1, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -1, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -1, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [2, -1, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [2, -1, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [2, -1, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-2, -1, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-2, -1, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-2, -1, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -1, -2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -1, -2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -1, -2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -1, 2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -1, 2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -1, 2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [3, -2, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [3, -2, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [3, -2, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-3, -2, -1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-3, -2, 0],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-3, -2, 1],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -2, -3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -2, -3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -2, -3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-1, -2, 3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [1, -2, 3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [0, -2, 3],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [2, -2, -2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-2, -2, 2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [2, -2, 2],\n            offset_space: \"block\"\n          },\n          {\n            prefab: \"grass_block\",\n            offset: [-2, -2, -2],\n            offset_space: \"block\"\n          }\n        ]\n      }\n    ]\n  };\n\n  // src/references/default/default.png\n  var default_default2 = \"data:image/png;base64,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\";\n\n  // src/preview_scenes.ts\n  function setupPreviewScenes() {\n    PreviewScene.menu_categories.hytale = {\n      _label: \"Hytale\"\n    };\n    let base_path = \"https://cdn.jsdelivr.net/gh/JannisX11/hytale-blockbench-plugin/src/references/default/\";\n    default_default.preview_models.forEach((model) => model.texture = default_default2);\n    new PreviewScene(\"hytale_default\", {\n      ...default_default,\n      name: \"Hytale\",\n      category: \"hytale\",\n      cubemap: [\n        base_path + \"skybox_0.webp\",\n        base_path + \"skybox_1.webp\",\n        base_path + \"skybox_2.webp\",\n        base_path + \"skybox_3.webp\",\n        base_path + \"skybox_4.webp\",\n        base_path + \"skybox_5.webp\"\n      ]\n    });\n    let player_model = new PreviewModel(\"hytale_player\", {\n      ...player_default,\n      texture: player_default2\n    });\n    ViewOptionsDialog.form_config.hytale_player = {\n      label: \"Hytale Player\",\n      type: \"checkbox\",\n      style: \"toggle_switch\",\n      condition: { formats: FORMAT_IDS }\n    };\n    if (!ViewOptionsDialog.form) {\n      ViewOptionsDialog.build();\n    } else {\n      ViewOptionsDialog.form.buildForm();\n    }\n    ViewOptionsDialog.form.on(\"change\", (arg) => {\n      if (arg.result.hytale_player) {\n        player_model.enable();\n        updateSizes();\n      } else {\n        player_model.disable();\n      }\n    });\n    function updateSizes() {\n      let block_size = Format?.block_size ?? 64;\n      player_model.model_3d.scale.set(block_size / 64, block_size / 64, block_size / 64);\n      player_model.model_3d.position.x = -block_size;\n      let model = PreviewModel.models.hytale_default;\n      model.model_3d.scale.set(block_size / 16, block_size / 16, block_size / 16);\n    }\n    track(Blockbench.on(\"select_format\", updateSizes));\n  }\n\n  // src/uv_canvas_resize.ts\n  var CROP_CSS = `\n.uv_crop_overlay {\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n    z-index: 20;\n}\n.uv_crop_box {\n    position: absolute;\n    border: 2px dashed var(--color-accent);\n    box-sizing: border-box;\n    pointer-events: auto;\n    cursor: move;\n}\n.uv_crop_shade {\n    position: absolute;\n    background: rgba(0, 0, 0, 0.5);\n    pointer-events: none;\n}\n.uv_crop_handle {\n    position: absolute;\n    width: 10px;\n    height: 10px;\n    background: var(--color-accent);\n    border: 1px solid var(--color-light);\n    box-sizing: border-box;\n    pointer-events: auto;\n}\n.uv_crop_handle.corner { width: 12px; height: 12px; }\n.uv_crop_handle.nw { top: -6px; left: -6px; cursor: nwse-resize; }\n.uv_crop_handle.n { top: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }\n.uv_crop_handle.ne { top: -6px; right: -6px; cursor: nesw-resize; }\n.uv_crop_handle.e { top: 50%; right: -5px; transform: translateY(-50%); cursor: ew-resize; }\n.uv_crop_handle.se { bottom: -6px; right: -6px; cursor: nwse-resize; }\n.uv_crop_handle.s { bottom: -5px; left: 50%; transform: translateX(-50%); cursor: ns-resize; }\n.uv_crop_handle.sw { bottom: -6px; left: -6px; cursor: nesw-resize; }\n.uv_crop_handle.w { top: 50%; left: -5px; transform: translateY(-50%); cursor: ew-resize; }\n.uv_crop_grid {\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n    overflow: hidden;\n}\n.uv_crop_grid_line {\n    position: absolute;\n    background: rgba(255, 255, 255, 0.2);\n}\n.uv_crop_grid_line.h { left: 0; right: 0; height: 1px; }\n.uv_crop_grid_line.v { top: 0; bottom: 0; width: 1px; }\n.uv_crop_width {\n    position: absolute;\n    top: -4%;\n    left: 50%;\n    color: var(--color-light);\n    font-size: 24px;\n    font-weight: 500;\n    white-space: nowrap;\n    pointer-events: none;\n    transform-origin: center bottom;\n}\n.uv_crop_height {\n    position: absolute;\n    left: -4%;\n    top: 50%;\n    color: var(--color-light);\n    font-size: 24px;\n    font-weight: 500;\n    white-space: nowrap;\n    pointer-events: none;\n    transform-origin: right center;\n}\n`;\n  var UVCropTool = class {\n    overlay = null;\n    cropBox = null;\n    uvFrame = null;\n    bounds = { left: 0, top: 0, right: 64, bottom: 64 };\n    dragging = null;\n    dragStart = { x: 0, y: 0 };\n    boundsStart = { left: 0, top: 0, right: 0, bottom: 0 };\n    texture = null;\n    active = false;\n    unwatchers = [];\n    onDeactivate = null;\n    constructor(onDeactivate) {\n      this.onDeactivate = onDeactivate || null;\n    }\n    activate() {\n      const uvVue = UVEditor.vue;\n      this.texture = uvVue?.texture || Texture.getDefault();\n      if (!this.texture) {\n        Blockbench.showQuickMessage(\"No texture selected\", 2e3);\n        return;\n      }\n      this.uvFrame = Panels.uv?.node?.querySelector(\"#uv_frame\");\n      if (!this.uvFrame) {\n        Blockbench.showQuickMessage(\"UV panel not found\", 2e3);\n        return;\n      }\n      this.active = true;\n      this.bounds = { left: 0, top: 0, right: this.texture.uv_width, bottom: this.texture.uv_height };\n      this.createOverlay();\n      this.updateDisplay();\n      this.addEventListeners();\n    }\n    deactivate() {\n      if (!this.active) return;\n      this.active = false;\n      this.removeOverlay();\n      this.removeEventListeners();\n      this.hideQuickMessage();\n      this.onDeactivate?.();\n    }\n    createOverlay() {\n      if (!this.uvFrame) return;\n      this.overlay = document.createElement(\"div\");\n      this.overlay.className = \"uv_crop_overlay\";\n      for (const pos of [\"top\", \"right\", \"bottom\", \"left\"]) {\n        const shade = document.createElement(\"div\");\n        shade.className = `uv_crop_shade shade_${pos}`;\n        this.overlay.appendChild(shade);\n      }\n      this.cropBox = document.createElement(\"div\");\n      this.cropBox.className = \"uv_crop_box\";\n      this.cropBox.innerHTML = `\n            <div class=\"uv_crop_grid\"></div>\n            <div class=\"uv_crop_handle corner nw\" data-handle=\"nw\"></div>\n            <div class=\"uv_crop_handle n\" data-handle=\"n\"></div>\n            <div class=\"uv_crop_handle corner ne\" data-handle=\"ne\"></div>\n            <div class=\"uv_crop_handle e\" data-handle=\"e\"></div>\n            <div class=\"uv_crop_handle corner se\" data-handle=\"se\"></div>\n            <div class=\"uv_crop_handle s\" data-handle=\"s\"></div>\n            <div class=\"uv_crop_handle corner sw\" data-handle=\"sw\"></div>\n            <div class=\"uv_crop_handle w\" data-handle=\"w\"></div>\n            <div class=\"uv_crop_width\"></div>\n            <div class=\"uv_crop_height\"></div>\n        `;\n      this.overlay.appendChild(this.cropBox);\n      this.uvFrame.appendChild(this.overlay);\n      Blockbench.showQuickMessage(\"Enter to apply, Esc to cancel, Shift for fine control\", 36e5);\n    }\n    hideQuickMessage() {\n      const el = document.getElementById(\"quick_message_box\");\n      if (el) el.remove();\n    }\n    removeOverlay() {\n      this.overlay?.remove();\n      this.overlay = null;\n      this.cropBox = null;\n    }\n    getScale() {\n      const vue = UVEditor.vue;\n      return vue?.inner_width / (this.texture?.uv_width || 64) || 1;\n    }\n    getInnerOffset() {\n      const vue = UVEditor.vue;\n      return { x: vue?.inner_left || 0, y: vue?.inner_top || 0 };\n    }\n    uvToScreen(uvX, uvY) {\n      const scale = this.getScale();\n      const offset = this.getInnerOffset();\n      return { x: offset.x + uvX * scale, y: offset.y + uvY * scale };\n    }\n    updateDisplay() {\n      if (!this.overlay || !this.cropBox || !this.uvFrame) return;\n      const topLeft = this.uvToScreen(this.bounds.left, this.bounds.top);\n      const bottomRight = this.uvToScreen(this.bounds.right, this.bounds.bottom);\n      const left = topLeft.x, top = topLeft.y;\n      const width = bottomRight.x - topLeft.x, height = bottomRight.y - topLeft.y;\n      Object.assign(this.cropBox.style, {\n        left: `${left}px`,\n        top: `${top}px`,\n        width: `${width}px`,\n        height: `${height}px`\n      });\n      const frameWidth = this.uvFrame.clientWidth;\n      const frameHeight = this.uvFrame.clientHeight;\n      const shades = {\n        top: { left: \"0\", top: \"0\", right: \"0\", height: `${Math.max(0, top)}px` },\n        bottom: { left: \"0\", bottom: \"0\", right: \"0\", height: `${Math.max(0, frameHeight - top - height)}px` },\n        left: { left: \"0\", top: `${Math.max(0, top)}px`, width: `${Math.max(0, left)}px`, height: `${height}px` },\n        right: { right: \"0\", top: `${Math.max(0, top)}px`, width: `${Math.max(0, frameWidth - left - width)}px`, height: `${height}px` }\n      };\n      for (const [pos, styles] of Object.entries(shades)) {\n        const el = this.overlay.querySelector(`.shade_${pos}`);\n        if (el) Object.assign(el.style, styles);\n      }\n      const uvFactor = this.texture ? this.texture.width / this.texture.uv_width : 1;\n      const pixelWidth = Math.round((this.bounds.right - this.bounds.left) * uvFactor);\n      const pixelHeight = Math.round((this.bounds.bottom - this.bounds.top) * uvFactor);\n      const widthEl = this.cropBox.querySelector(\".uv_crop_width\");\n      if (widthEl) {\n        widthEl.textContent = `${pixelWidth}px`;\n        widthEl.style.fontSize = \"14px\";\n        widthEl.style.transform = `translateX(-50%) translateY(calc(-100% - 4px))`;\n      }\n      const heightEl = this.cropBox.querySelector(\".uv_crop_height\");\n      if (heightEl) {\n        heightEl.textContent = `${pixelHeight}px`;\n        heightEl.style.fontSize = \"14px\";\n        heightEl.style.transform = `translateX(calc(-100% - 4px)) translateY(-50%)`;\n      }\n      this.updateGrid(width, height);\n    }\n    updateGrid(boxWidth, boxHeight) {\n      if (!this.cropBox || !this.texture) return;\n      const grid = this.cropBox.querySelector(\".uv_crop_grid\");\n      if (!grid) return;\n      grid.innerHTML = \"\";\n      const uvFactor = this.texture.width / this.texture.uv_width;\n      const gridStep = 32 / uvFactor;\n      const scale = this.getScale();\n      const cropWidth = this.bounds.right - this.bounds.left;\n      const cropHeight = this.bounds.bottom - this.bounds.top;\n      const firstV = Math.ceil(this.bounds.left / gridStep) * gridStep;\n      for (let uv = firstV; uv < this.bounds.right; uv += gridStep) {\n        if (uv <= this.bounds.left) continue;\n        const pct = (uv - this.bounds.left) / cropWidth * 100;\n        const line = document.createElement(\"div\");\n        line.className = \"uv_crop_grid_line v\";\n        line.style.left = `${pct}%`;\n        grid.appendChild(line);\n      }\n      const firstH = Math.ceil(this.bounds.top / gridStep) * gridStep;\n      for (let uv = firstH; uv < this.bounds.bottom; uv += gridStep) {\n        if (uv <= this.bounds.top) continue;\n        const pct = (uv - this.bounds.top) / cropHeight * 100;\n        const line = document.createElement(\"div\");\n        line.className = \"uv_crop_grid_line h\";\n        line.style.top = `${pct}%`;\n        grid.appendChild(line);\n      }\n    }\n    handleMouseDown = (e) => {\n      if (!this.active) return;\n      if (e.button === 1) return;\n      const target = e.target;\n      if (target.classList.contains(\"uv_crop_handle\")) {\n        this.dragging = target.dataset.handle;\n      } else if (target.classList.contains(\"uv_crop_box\") || target.closest(\".uv_crop_box\")) {\n        if (target.tagName === \"BUTTON\") return;\n        this.dragging = \"move\";\n      } else {\n        return;\n      }\n      e.preventDefault();\n      e.stopPropagation();\n      this.dragStart = { x: e.clientX, y: e.clientY };\n      this.boundsStart = { ...this.bounds };\n      document.addEventListener(\"mousemove\", this.handleMouseMove);\n      document.addEventListener(\"mouseup\", this.handleMouseUp);\n    };\n    handleMouseMove = (e) => {\n      if (!this.dragging || !this.texture) return;\n      const scale = this.getScale();\n      const dx = (e.clientX - this.dragStart.x) / scale;\n      const dy = (e.clientY - this.dragStart.y) / scale;\n      const minSize = 1;\n      const b = this.boundsStart;\n      const handlers = {\n        move: () => {\n          this.bounds = { left: b.left + dx, right: b.right + dx, top: b.top + dy, bottom: b.bottom + dy };\n        },\n        nw: () => {\n          this.bounds.left = Math.min(b.left + dx, b.right - minSize);\n          this.bounds.top = Math.min(b.top + dy, b.bottom - minSize);\n        },\n        n: () => {\n          this.bounds.top = Math.min(b.top + dy, b.bottom - minSize);\n        },\n        ne: () => {\n          this.bounds.right = Math.max(b.right + dx, b.left + minSize);\n          this.bounds.top = Math.min(b.top + dy, b.bottom - minSize);\n        },\n        e: () => {\n          this.bounds.right = Math.max(b.right + dx, b.left + minSize);\n        },\n        se: () => {\n          this.bounds.right = Math.max(b.right + dx, b.left + minSize);\n          this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize);\n        },\n        s: () => {\n          this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize);\n        },\n        sw: () => {\n          this.bounds.left = Math.min(b.left + dx, b.right - minSize);\n          this.bounds.bottom = Math.max(b.bottom + dy, b.top + minSize);\n        },\n        w: () => {\n          this.bounds.left = Math.min(b.left + dx, b.right - minSize);\n        }\n      };\n      handlers[this.dragging]();\n      if (!e.shiftKey) {\n        this.snapToGrid();\n      }\n      this.snapToEdges();\n      this.updateDisplay();\n    };\n    // Snap bounds to 32px grid increments\n    snapToGrid() {\n      if (!this.texture) return;\n      const uvFactor = this.texture.width / this.texture.uv_width;\n      const gridStep = 32 / uvFactor;\n      const snap = (val) => Math.round(val / gridStep) * gridStep;\n      this.bounds.left = snap(this.bounds.left);\n      this.bounds.right = snap(this.bounds.right);\n      this.bounds.top = snap(this.bounds.top);\n      this.bounds.bottom = snap(this.bounds.bottom);\n    }\n    // Magnetic snap to original canvas edges\n    snapToEdges() {\n      if (!this.texture) return;\n      const snapThreshold = 3;\n      const edges = { left: 0, top: 0, right: this.texture.uv_width, bottom: this.texture.uv_height };\n      if (Math.abs(this.bounds.left - edges.left) < snapThreshold) this.bounds.left = edges.left;\n      if (Math.abs(this.bounds.left - edges.right) < snapThreshold) this.bounds.left = edges.right;\n      if (Math.abs(this.bounds.right - edges.left) < snapThreshold) this.bounds.right = edges.left;\n      if (Math.abs(this.bounds.right - edges.right) < snapThreshold) this.bounds.right = edges.right;\n      if (Math.abs(this.bounds.top - edges.top) < snapThreshold) this.bounds.top = edges.top;\n      if (Math.abs(this.bounds.top - edges.bottom) < snapThreshold) this.bounds.top = edges.bottom;\n      if (Math.abs(this.bounds.bottom - edges.top) < snapThreshold) this.bounds.bottom = edges.top;\n      if (Math.abs(this.bounds.bottom - edges.bottom) < snapThreshold) this.bounds.bottom = edges.bottom;\n    }\n    handleMouseUp = () => {\n      this.dragging = null;\n      document.removeEventListener(\"mousemove\", this.handleMouseMove);\n      document.removeEventListener(\"mouseup\", this.handleMouseUp);\n    };\n    handleKeyDown = (e) => {\n      if (!this.active) return;\n      if (e.key === \"Enter\") {\n        e.preventDefault();\n        e.stopPropagation();\n        this.apply();\n      } else if (e.key === \"Escape\") {\n        e.preventDefault();\n        e.stopPropagation();\n        this.deactivate();\n      }\n    };\n    addEventListeners() {\n      this.overlay?.addEventListener(\"mousedown\", this.handleMouseDown);\n      this.uvFrame?.addEventListener(\"wheel\", () => this.updateDisplay());\n      document.addEventListener(\"keydown\", this.handleKeyDown);\n      Blockbench.on(\"resize_window\", this.updateDisplay.bind(this));\n      const vue = UVEditor.vue;\n      if (vue?.$watch) {\n        for (const prop of [\"zoom\", \"inner_left\", \"inner_top\"]) {\n          this.unwatchers.push(vue.$watch(prop, () => this.updateDisplay()));\n        }\n        this.unwatchers.push(vue.$watch(\"texture\", () => this.deactivate()));\n      }\n    }\n    removeEventListeners() {\n      this.overlay?.removeEventListener(\"mousedown\", this.handleMouseDown);\n      document.removeEventListener(\"mousemove\", this.handleMouseMove);\n      document.removeEventListener(\"mouseup\", this.handleMouseUp);\n      document.removeEventListener(\"keydown\", this.handleKeyDown);\n      Blockbench.removeListener(\"resize_window\", this.updateDisplay);\n      this.unwatchers.forEach((fn) => fn());\n      this.unwatchers = [];\n    }\n    // Crops textures and adjusts UVs based on context (attachment vs main model)\n    apply() {\n      if (!this.texture) return;\n      const selectedTexture = this.texture;\n      const textureGroupUuid = selectedTexture.group;\n      const isAttachmentTexture = !!textureGroupUuid;\n      let texturesToCrop;\n      let elementsToAffect;\n      if (isAttachmentTexture) {\n        texturesToCrop = Texture.all.filter((t) => t.group === textureGroupUuid);\n        const relatedCollections = Collection.all.filter((c) => {\n          const collectionTexUuid = c.texture;\n          return texturesToCrop.some((t) => t.uuid === collectionTexUuid);\n        });\n        elementsToAffect = Outliner.elements.filter(\n          (el) => relatedCollections.some((c) => c.contains(el))\n        );\n      } else {\n        const collectionTextureUuids = new Set(\n          Collection.all.map((c) => c.texture).filter(Boolean)\n        );\n        texturesToCrop = Texture.all.filter(\n          (t) => !t.group && !collectionTextureUuids.has(t.uuid)\n        );\n        elementsToAffect = Outliner.elements.filter(\n          (el) => !Collection.all.some((c) => c.contains(el))\n        );\n      }\n      if (texturesToCrop.length === 0) {\n        Blockbench.showQuickMessage(\"No textures to crop\", 2e3);\n        return;\n      }\n      const refUvFactor = selectedTexture.width / selectedTexture.uv_width;\n      const newWidth = Math.round((this.bounds.right - this.bounds.left) * refUvFactor);\n      const newHeight = Math.round((this.bounds.bottom - this.bounds.top) * refUvFactor);\n      if (newWidth < 1 || newHeight < 1) {\n        Blockbench.showQuickMessage(\"Invalid crop size\", 2e3);\n        return;\n      }\n      Undo.initEdit({ textures: texturesToCrop, bitmap: true });\n      for (const texture of texturesToCrop) {\n        const uvFactor = texture.width / texture.uv_width;\n        const pixelLeft = Math.round(this.bounds.left * uvFactor);\n        const pixelTop = Math.round(this.bounds.top * uvFactor);\n        const pixelWidth = Math.round((this.bounds.right - this.bounds.left) * uvFactor);\n        const pixelHeight = Math.round((this.bounds.bottom - this.bounds.top) * uvFactor);\n        const tempCanvas = document.createElement(\"canvas\");\n        tempCanvas.width = texture.width;\n        tempCanvas.height = texture.height;\n        tempCanvas.getContext(\"2d\").drawImage(texture.img, 0, 0);\n        texture.width = texture.canvas.width = pixelWidth;\n        texture.height = texture.canvas.height = pixelHeight;\n        const ctx = texture.ctx;\n        ctx.clearRect(0, 0, pixelWidth, pixelHeight);\n        ctx.imageSmoothingEnabled = false;\n        ctx.drawImage(tempCanvas, -pixelLeft, -pixelTop);\n        texture.uv_width = pixelWidth / uvFactor;\n        texture.uv_height = pixelHeight / uvFactor;\n        texture.updateChangesAfterEdit();\n      }\n      Undo.finishEdit(isAttachmentTexture ? \"Crop attachment texture\" : \"Crop model textures\");\n      const cubes = elementsToAffect.filter((el) => el instanceof Cube && !!el.faces);\n      if (cubes.length && (this.bounds.left || this.bounds.top)) {\n        Undo.initEdit({ elements: cubes });\n        const offsetX = this.bounds.left;\n        const offsetY = this.bounds.top;\n        for (const cube of cubes) {\n          if (cube.box_uv) {\n            cube.uv_offset[0] -= offsetX;\n            cube.uv_offset[1] -= offsetY;\n          } else {\n            for (const key in cube.faces) {\n              const uv = cube.faces[key].uv;\n              uv[0] -= offsetX;\n              uv[1] -= offsetY;\n              uv[2] -= offsetX;\n              uv[3] -= offsetY;\n            }\n          }\n        }\n        Canvas.updateView({ elements: cubes, element_aspects: { uv: true } });\n        Undo.finishEdit(\"Adjust UV after cropping\");\n      }\n      UVEditor.vue.$forceUpdate();\n      this.deactivate();\n    }\n  };\n  var cropTool = null;\n  var resizeToggle = null;\n  function setupUVCanvasResize() {\n    const style = Blockbench.addCSS(CROP_CSS);\n    track(style);\n    cropTool = new UVCropTool(() => {\n      resizeToggle?.set(false);\n    });\n    let originalReverseSelect = UVEditor.reverseSelect;\n    UVEditor.reverseSelect = function(...args) {\n      if (cropTool.active) return;\n      originalReverseSelect.call(UVEditor, ...args);\n    };\n    track({\n      delete() {\n        UVEditor.reverseSelect = originalReverseSelect;\n      }\n    });\n    resizeToggle = new Toggle(\"hytale_resize_uv_canvas\", {\n      name: \"Resize UV Canvas\",\n      icon: \"crop\",\n      category: \"uv\",\n      condition: { formats: FORMAT_IDS, modes: [\"edit\"] },\n      onChange: (value) => {\n        if (value) {\n          cropTool?.activate();\n        } else {\n          cropTool?.deactivate();\n        }\n      }\n    });\n    track(resizeToggle);\n    Toolbars.uv_editor?.add(resizeToggle, 1);\n    track(Blockbench.on(\"select_mode\", () => {\n      cropTool?.deactivate();\n      resizeToggle?.set(false);\n    }));\n    track({ delete: () => {\n      cropTool?.deactivate();\n      cropTool = null;\n      resizeToggle = null;\n    } });\n  }\n\n  // src/alt_duplicate.ts\n  function setupAltDuplicate() {\n    const keybindItem = new KeybindItem(\"hytale_duplicate_drag_modifier\", {\n      name: \"Duplicate While Dragging\",\n      description: \"Hold this key while dragging the gizmo to duplicate\",\n      keybind: new Keybind({ key: 18 }),\n      category: \"edit\"\n    });\n    track(keybindItem);\n    let isDragging = false;\n    let modifierWasPressed = false;\n    let isCombinedUndoActive = false;\n    let combinedUndoCubesBefore = 0;\n    let combinedUndoGroups = [];\n    let originalInitEdit = null;\n    let originalFinishEdit = null;\n    function isModifierPressed(event) {\n      const kb = keybindItem.keybind;\n      if (kb.key === 18 || kb.alt) return event.altKey || Pressing.overrides.alt;\n      if (kb.key === 17 || kb.ctrl) return event.ctrlKey || Pressing.overrides.ctrl;\n      if (kb.key === 16 || kb.shift) return event.shiftKey || Pressing.overrides.shift;\n      if (kb.key === 91 || kb.ctrl) return event.metaKey || Pressing.overrides.ctrl;\n    }\n    function isModifierKey(event) {\n      const kb = keybindItem.keybind;\n      return event.keyCode === kb.key || event.key === \"Alt\" && (kb.key === 18 || kb.alt) || event.key === \"Control\" && (kb.key === 17 || kb.ctrl) || event.key === \"Shift\" && (kb.key === 16 || kb.shift);\n    }\n    function duplicateGroups() {\n      const allNewGroups = [];\n      const oldSelectedGroups = Group.multi_selected.slice();\n      Group.multi_selected.empty();\n      for (const group of oldSelectedGroups) {\n        group.selected = false;\n        const newGroup = group.duplicate();\n        newGroup.forEachChild((g) => allNewGroups.push(g), Group, true);\n        newGroup.multiSelect();\n        allNewGroups.push(newGroup);\n      }\n      return allNewGroups;\n    }\n    function duplicateElements() {\n      Outliner.selected.slice().forEach((obj, i) => {\n        if (obj.parent instanceof OutlinerElement && obj.parent.selected) return;\n        Outliner.selected[i] = obj.duplicate();\n      });\n    }\n    function performDuplicationForCombinedUndo(shouldInitEdit) {\n      const hasGroups = Group.all.some((g) => g.selected);\n      const hasElements = Outliner.selected.length > 0;\n      if (!hasGroups && !hasElements) return false;\n      combinedUndoCubesBefore = Outliner.elements.length;\n      combinedUndoGroups = [];\n      originalInitEdit = Undo.initEdit.bind(Undo);\n      originalFinishEdit = Undo.finishEdit.bind(Undo);\n      if (shouldInitEdit) {\n        originalInitEdit({ outliner: true, elements: [], groups: [], selection: true });\n      }\n      Undo.initEdit = () => {\n      };\n      Undo.finishEdit = () => {\n      };\n      if (hasGroups) {\n        combinedUndoGroups = duplicateGroups();\n      } else {\n        duplicateElements();\n      }\n      updateSelection();\n      isCombinedUndoActive = true;\n      return true;\n    }\n    function finishCombinedUndo() {\n      if (!isCombinedUndoActive) return;\n      isCombinedUndoActive = false;\n      if (originalInitEdit) Undo.initEdit = originalInitEdit;\n      if (originalFinishEdit) Undo.finishEdit = originalFinishEdit;\n      originalInitEdit = null;\n      originalFinishEdit = null;\n      Undo.finishEdit(\"Duplicate and move\", {\n        outliner: true,\n        elements: Outliner.elements.slice(combinedUndoCubesBefore),\n        groups: combinedUndoGroups,\n        selection: true\n      });\n    }\n    function onMouseDown(event) {\n      if (isCombinedUndoActive) return;\n      const axis = Transformer?.axis;\n      const hasSelection = Outliner.selected.length > 0 || Group.all.some((g) => g.selected);\n      const isTransformTool = Toolbox.selected?.id === \"move_tool\" || Toolbox.selected?.id === \"rotate_tool\";\n      if (!axis || !hasSelection || !isTransformTool || !Modes.edit) return;\n      if (isModifierPressed(event)) {\n        event.stopImmediatePropagation();\n        if (!performDuplicationForCombinedUndo(true)) return;\n        isDragging = true;\n        modifierWasPressed = true;\n        setTimeout(() => {\n          event.target?.dispatchEvent(new PointerEvent(\"pointerdown\", {\n            bubbles: true,\n            cancelable: true,\n            clientX: event.clientX,\n            clientY: event.clientY,\n            button: event.button,\n            buttons: event.buttons,\n            view: window,\n            pointerId: 1,\n            pointerType: \"mouse\"\n          }));\n        }, 0);\n      } else {\n        isDragging = true;\n        modifierWasPressed = false;\n      }\n    }\n    function onKeyDown(event) {\n      if (!isDragging || !isModifierKey(event) || modifierWasPressed) return;\n      const isTransformTool = Toolbox.selected?.id === \"move_tool\" || Toolbox.selected?.id === \"rotate_tool\";\n      if (!isTransformTool || !Modes.edit) return;\n      modifierWasPressed = true;\n      const shouldInitEdit = isCombinedUndoActive;\n      if (isCombinedUndoActive) finishCombinedUndo();\n      performDuplicationForCombinedUndo(shouldInitEdit);\n    }\n    function onKeyUp(event) {\n      if (isModifierKey(event)) modifierWasPressed = false;\n    }\n    function onMouseUp() {\n      isDragging = false;\n      modifierWasPressed = false;\n      if (isCombinedUndoActive) setTimeout(finishCombinedUndo, 0);\n    }\n    const events = [\n      [\"pointerdown\", onMouseDown],\n      [\"pointerup\", onMouseUp],\n      [\"mouseup\", onMouseUp],\n      [\"keydown\", onKeyDown],\n      [\"keyup\", onKeyUp]\n    ];\n    events.forEach(([type, handler]) => document.addEventListener(type, handler, true));\n    track({ delete: () => events.forEach(([type, handler]) => document.removeEventListener(type, handler, true)) });\n  }\n\n  // src/change_orientation.ts\n  function canChangeParentGroup(cube) {\n    let parent = cube.parent;\n    if (parent instanceof Group == false || !parent.selected) return false;\n    if (parent.children.find((c) => c instanceof Cube == false || !c.selected)) return false;\n    return true;\n  }\n  function changeCubeOrientation(axis, direction) {\n    let affected_groups = [];\n    let changed_groups = [];\n    for (let cube of Cube.selected) {\n      if (canChangeParentGroup(cube)) affected_groups.safePush(cube.parent);\n    }\n    Undo.initEdit({ elements: Cube.selected, groups: affected_groups });\n    for (let cube of Cube.selected) {\n      let flip_direction = direction == -1;\n      if (axis == 1) flip_direction = !flip_direction;\n      let node_to_rotate = canChangeParentGroup(cube) ? cube.parent : cube;\n      let quat_initial = Reusable.quat2.copy(node_to_rotate.mesh.quaternion);\n      cube.roll(axis, flip_direction ? 3 : 1, node_to_rotate.origin);\n      if (changed_groups.includes(node_to_rotate)) {\n        continue;\n      } else if (node_to_rotate instanceof Group) {\n        changed_groups.push(node_to_rotate);\n      }\n      let change_euler = Reusable.euler1.set(0, 0, 0);\n      change_euler[getAxisLetter(axis)] = Math.degToRad(-direction * 90);\n      node_to_rotate.mesh.quaternion.multiplyQuaternions(quat_initial, Reusable.quat1.setFromEuler(change_euler));\n      let new_rotation = node_to_rotate.mesh.rotation.toArray().slice(0, 3).map((r) => Math.radToDeg(r));\n      node_to_rotate.rotation.V3_set(new_rotation.map((r) => Math.roundTo(r, 2)));\n      node_to_rotate.preview_controller.updateTransform(node_to_rotate);\n    }\n    ;\n    Undo.finishEdit(\"Change cube orientation\");\n    updateSelection();\n  }\n  function setupChangeOrientation() {\n    let action = new Action(\"change_cube_orientation\", {\n      name: \"Change Orientation\",\n      icon: \"screen_rotation_up\",\n      condition: { modes: [\"edit\"], selected: { cube: true } },\n      children: [\n        {\n          id: \"x_plus\",\n          name: \"X+\",\n          icon: \"rotate_right\",\n          color: \"x\",\n          click() {\n            changeCubeOrientation(0, 1);\n          }\n        },\n        {\n          id: \"x_minus\",\n          name: \"X-\",\n          icon: \"rotate_left\",\n          color: \"x\",\n          click() {\n            changeCubeOrientation(0, -1);\n          }\n        },\n        {\n          id: \"y_plus\",\n          name: \"Y+\",\n          icon: \"rotate_right\",\n          color: \"y\",\n          click() {\n            changeCubeOrientation(1, 1);\n          }\n        },\n        {\n          id: \"y_minus\",\n          name: \"Y-\",\n          icon: \"rotate_left\",\n          color: \"y\",\n          click() {\n            changeCubeOrientation(1, -1);\n          }\n        },\n        {\n          id: \"z_plus\",\n          name: \"Z+\",\n          icon: \"rotate_right\",\n          color: \"z\",\n          click() {\n            changeCubeOrientation(2, 1);\n          }\n        },\n        {\n          id: \"z_minus\",\n          name: \"Z-\",\n          icon: \"rotate_left\",\n          color: \"z\",\n          click() {\n            changeCubeOrientation(2, -1);\n          }\n        }\n      ],\n      click(e) {\n        new Menu(\"change_cube_orientation\", this.children, {}).open(e.target);\n      }\n    });\n    for (let item of action.children) {\n      action.addSubKeybind(item.id, item.name, null, item.click);\n    }\n    MenuBar.menus.transform.addAction(action);\n    track(action);\n  }\n\n  // src/shortcuts.ts\n  function setupShortcuts() {\n    const brush_tool = BarItems.brush_tool;\n    let last_brush_preset = Painter.default_brush_presets[0];\n    let selecting = false;\n    brush_tool.addSubKeybind(\"switch_preset\", \"Switch Preset\", null, (event) => {\n      if (Toolbox.selected == brush_tool && !selecting) {\n        let options = brush_tool.side_menu.structure();\n        options = options.slice(0, -2);\n        let index = options.findIndex((option) => option.name == last_brush_preset?.name);\n        let next_index = (index + 1) % options.length;\n        let next_option = options[next_index];\n        next_option.click(null, event);\n        Blockbench.showQuickMessage(`Brush ${next_index + 1}: ${tl(next_option.name)}`);\n      }\n    });\n    let select_listener = brush_tool.on(\"select\", () => {\n      selecting = true;\n      setTimeout(() => selecting = false, 60);\n    });\n    let originalApplyBrushPreset = Painter.loadBrushPreset;\n    Painter.loadBrushPreset = function(preset) {\n      last_brush_preset = preset;\n      originalApplyBrushPreset.call(Painter, preset);\n    };\n    track({\n      delete() {\n        select_listener.delete();\n        delete brush_tool.sub_keybinds.switch_preset;\n        Painter.loadBrushPreset = originalApplyBrushPreset;\n      }\n    });\n  }\n\n  // src/plugin.ts\n  BBPlugin.register(\"hytale_plugin\", {\n    title: \"Hytale Models\",\n    author: \"JannisX11, Kanno\",\n    icon: \"icon.png\",\n    version: package_default.version,\n    description: \"Create models and animations for Hytale\",\n    tags: [\"Hytale\"],\n    variant: \"both\",\n    min_version: \"5.0.5\",\n    await_loading: true,\n    has_changelog: true,\n    creation_date: \"2025-12-22\",\n    contributes: {\n      formats: FORMAT_IDS,\n      open_extensions: [\"blockymodel\"]\n    },\n    repository: \"https://github.com/JannisX11/hytale-blockbench-plugin\",\n    bug_tracker: \"https://github.com/JannisX11/hytale-blockbench-plugin/issues\",\n    contributors: [\"Hedaox\", \"MelodicAlbuild\"],\n    onload() {\n      setupFormats();\n      setupElements();\n      setupAnimation();\n      setupAnimationCodec();\n      setupAttachments();\n      setupOutlinerFilter();\n      setupChecks();\n      setupPhotoshopTools();\n      setupUVCycling();\n      setupTextureHandling();\n      setupAltDuplicate();\n      setupNameOverlap();\n      setupUVOutline();\n      setupTempFixes();\n      setupChangeOrientation();\n      setupPreviewScenes();\n      setupUVCanvasResize();\n      setupShortcuts();\n      let panel_setup_listener;\n      function showCollectionPanel() {\n        const local_storage_key = \"hytale_plugin:collection_panel_setup\";\n        if (localStorage.getItem(local_storage_key)) return true;\n        if (!Modes.edit) return false;\n        if (Panels.collections.slot == \"hidden\") {\n          Panels.collections.moveTo(\"right_bar\");\n        }\n        if (Panels.collections.folded) {\n          Panels.collections.fold();\n        }\n        if (panel_setup_listener) {\n          panel_setup_listener.delete();\n          panel_setup_listener = void 0;\n        }\n        localStorage.setItem(local_storage_key, \"true\");\n        return true;\n      }\n      if (!showCollectionPanel()) {\n        panel_setup_listener = Blockbench.on(\"select_mode\", showCollectionPanel);\n      }\n      let on_finish_edit = Blockbench.on(\"generate_texture_template\", (arg) => {\n        for (let element of arg.elements) {\n          if (typeof element.autouv != \"number\") continue;\n          element.autouv = 1;\n        }\n      });\n      track(on_finish_edit);\n      let pivot_marker = new CustomPivotMarker();\n      track(pivot_marker);\n      let group_pivot_indicator = new GroupPivotIndicator();\n      track(group_pivot_indicator);\n    },\n    onunload() {\n      cleanup();\n    }\n  });\n})();\n//! Copyright (C) 2025 Hypixel Studios Canada inc.\n//! Licensed under the GNU General Public License, see LICENSE.MD\n"
  },
  {
    "path": "plugins/image_centering.js",
    "content": "(async function() {\r\n\tlet aboutAction;\r\n\tconst id = \"image_centering\";\r\n\tconst name = \"Image Centering\";\r\n\tconst icon = \"center_focus_strong\";\r\n\tconst author = \"SirJain\";\r\n\tlet button;\r\n\tconst links = {\r\n\t\ttwitter: \"https://twitter.com/SirJain2\",\r\n\t\tdiscord: \"https://discord.gg/wM4CKTbFVN\"\r\n\t}\r\n\r\n\tPlugin.register(id, {\r\n\t\ttitle: name,\r\n\t\ticon,\r\n\t\tauthor,\r\n\t\tdescription: \"Adds a button and a keybind that centers the image viewport in an Image format.\",\r\n\t\tabout: \"This plugin adds a button that allows you to reset your viewport in the Image format.\\n## How to use\\nTo use this plugin, go to the brush toolbar (top of the image mode) and click the `Center Image Viewport` button. If it doesn't show up, make sure you are in the Image format. If you are, you can add the tool using the `Customize Toolbar` option. There will be a confirmation message displayed on-screen once you center the viewport.\\n\\nPlease report any bugs or suggestions you may have.\",\r\n\t\ttags: [\"Format: Image\", \"UX\"],\r\n\t\tversion: \"1.1.1\",\r\n\t\tmin_version: \"4.4.0\",\r\n\t\tvariant: \"both\",\r\n\t\toninstall: () => showAbout(true),\r\n\t\tonload() {\r\n\t\t\taddAboutButton();\r\n\t\t\t\r\n\t\t\tbutton = new Action(\"image_center_button\", {\r\n\t\t\t\tname: \"Center Image Viewport\",\r\n\t\t\t\ticon: icon,\r\n\t\t\t\tdescription: \"Center the viewport of your image\",\r\n\t\t\t\tcondition: () => Format?.id == \"image\",\r\n\t\t\t\tclick: () => center(),\r\n\t\t\t\tkeybind: new Keybind({key: 'c', shift: false})\r\n\t\t\t})\r\n\r\n\t\t\tToolbars.brush.add(button);\r\n\t\t},\r\n\t\tonunload() {\r\n\t\t\taboutAction.delete();\r\n\t\t\tbutton.delete();\r\n\t\t\tMenuBar.removeAction(`help.about_plugins.about_${id}`);\r\n\t\t\tBlockbench.showQuickMessage(\"Uninstalled Image Centering plugin\", 2000);\r\n\t\t}\r\n\t})\r\n\r\n\t// Resets everything - calls the function that resets the position and the zoom\r\n\tfunction center() {\r\n\t\tsetViewport();\r\n\t\tsetZoom();\t\t\t\r\n\t\tBlockbench.showQuickMessage(\"Centered viewport!\", 1500);\r\n\t}\r\n\r\n\t// Resets the viewport position\r\n\tfunction setViewport() {\r\n\t\tlet uv_viewport = UVEditor.vue.$refs.viewport;\r\n\t\tif (!uv_viewport) return;\r\n\t\tUVEditor.setZoom(Project.uv_viewport.zoom);\r\n\t\tVue.nextTick(() => {\r\n\t\t\tuv_viewport.scrollLeft = Project.uv_viewport.offset[0] * UVEditor.vue.inner_width + UVEditor.width/2;\r\n\t\t\tuv_viewport.scrollTop = Project.uv_viewport.offset[1] * UVEditor.vue.inner_height + UVEditor.height/2;\r\n\t\t})\r\n\t}\r\n\r\n\t// Resets the zoom of the viewport\r\n\tfunction setZoom(zoom) {\r\n\t\tlet max_zoom = Math.round((UVEditor.vue.texture ? UVEditor.vue.texture.height : Project.texture_width) * 32 / UVEditor.width);\r\n\t\tzoom = Math.clamp(zoom, 0.85, Math.clamp(max_zoom, 16, 64));\r\n\t\tUVEditor.vue.zoom = zoom;\r\n\t\tProject.uv_viewport.zoom = UVEditor.zoom;\r\n\t\tVue.nextTick(() => {\r\n\t\t\tif (Painter.selection.overlay) UVEditor.updatePastingOverlay();\r\n\t\t})\r\n\t}\r\n\r\n\t// Adds an about button for more plugin information\r\n\tfunction addAboutButton() {\r\n\t\tlet about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\");\r\n\t\tif (!about) {\r\n\t\t\tabout = new Action(\"about_plugins\", {\r\n\t\t\t\tname: \"About Plugins...\",\r\n\t\t\t\ticon: \"info\",\r\n\t\t\t\tchildren: []\r\n\t\t\t})\r\n\t\t\tMenuBar.addAction(about, \"help\");\r\n\t\t}\r\n\r\n\t\taboutAction = new Action(`about_${id}`, {\r\n\t\t\tname: `About ${name}...`,\r\n\t\t\ticon,\r\n\t\t\tclick: () => showAbout()\r\n\t\t})\r\n\r\n\t\tabout.children.push(aboutAction);\r\n\t}\r\n\r\n\t// Shows the about dialog\r\n\tfunction showAbout(banner) {\r\n\t\tconst infoBox = new Dialog({\r\n\t\t\tid: \"about\",\r\n\t\t\ttitle: name,\r\n\t\t\twidth: 780,\r\n\t\t\tbuttons: [],\r\n\t\t\tlines: [`\r\n\t\t\t    <li></li>\r\n\t\t\t\t<style>\r\n\t\t\t\t\tdialog#about .dialog_title {\r\n\t\t\t\t\t\tpadding-left: 0;\r\n\t\t\t\t\t\tdisplay: flex;\r\n\t\t\t\t\t\talign-items: center;\r\n\t\t\t\t\t\tgap: 10px;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdialog#about .dialog_content {\r\n\t\t\t\t\t\ttext-align: left!important;\r\n\t\t\t\t\t\tmargin: 0!important;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdialog#about .socials {\r\n\t\t\t\t\t\tpadding: 0!important;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdialog#about #banner {\r\n\t\t\t\t\t\tbackground-color: var(--color-accent);\r\n\t\t\t\t\t\tcolor: var(--color-accent_text);\r\n\t\t\t\t\t\twidth: 100%;\r\n\t\t\t\t\t\tpadding: 0 8px\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdialog#about #content {\r\n\t\t\t\t\t\tmargin: 24px;\r\n\t\t\t\t\t}\r\n\t\t\t\t</style>\r\n\t\t\t\t${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\r\n\t\t\t\t<div id=\"content\">\r\n\t\t\t\t\t<h1 style=\"margin-top:-10px\">${name}</h1>\r\n\t\t\t\t\t<p>Adds a button that centers the image viewport in an Image format.</p>\r\n\t\t\t\t\t<h4>Worth noting:</h4>\r\n\t\t\t\t\t<p>- You need to be in the Image format for this plugin to work.</p>\r\n\t\t\t\t\t<p>- You can add or remove the button from the toolbar using the<b> Customize Toolbar</b> button.</p>\r\n\t\t\t\t\t<h4>How to use:</h4>\r\n\t\t\t\t\t<p>To use this plugin, go to the brush toolbar (top of the image mode) and click the <b>Center Image Viewport</b> button. There will be a confirmation message displayed on-screen once you center the viewport. You can also use the <b>c</b> keybind.</p>\r\n\t\t\t\t\t<br>\r\n\t\t\t\t\t<div class=\"socials\">\r\n\t\t\t\t\t\t<a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\r\n\t\t\t\t\t\t\t<i class=\"fa-brands fa-twitter\" style=\"color:#1DA1F2\"></i>\r\n\t\t\t\t\t\t\t<label>By ${author}</label>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t<a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\r\n\t\t\t\t\t\t\t<i class=\"icon fab fa-discord\" style=\"color:#727FFF\"></i>\r\n\t\t\t\t\t\t\t<label>Discord Server</label>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n            \t\t`]\r\n\t\t}).show()\r\n\t\t$(\"dialog#about .dialog_title\").html(`\r\n    \t\t\t<i class=\"icon material-icons\">${icon}</i>\r\n    \t\t\t${name}\r\n    \t\t`)\r\n\t}\r\n})()\r\n"
  },
  {
    "path": "plugins/java_block_sequencer/about.md",
    "content": "# Java Block Sequencer v1.0.0\n\nAdds the option to turn animation keyframes into a sequence of Minecraft block/item models.\nThis will not export any item definition files for the exported models, so these must be referenced manually in a resource pack.\nRequires Minecraft 1.21.11 or later.\n\n## How it works\nThe Java Block Sequencer (JBS) introduces a format which adds the `Java Block Sequence` button to the Animate tab. The JBS exports Java Block models similar to how the OBJ Animation Exporter tool by JannisX11 exports OBJ models. \nWhenever an animation is exported with JBS, each frame goes through 6 stages: \n- create undo state for model\n- resolve model tree into cubes\n- bake transforms into outliner\n- save model to zip archive under the selected animation name\n- undo changes\n\n## How to use\nStart by creating a new model or converting an existing cube-based project into a **Java Block Sequence**. Create an animation. Right-click your animation. Click **Export Java Block Sequence** from the drop-down menu. Each model will be displayed in-game based on settings in the Display tab.\n\n## Troubleshooting\n- If the exported models aren't getting rotated or positioned properly, make sure the groups/bones used in your animation have been checked (`Export: On`) in the outliner.\n"
  },
  {
    "path": "plugins/java_block_sequencer/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2025-12-14\",\n    \"author\": \"Jatzylap\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/java_block_sequencer/java_block_sequencer.js",
    "content": "(function() {\n\n\tlet codec, format, export_action;\n\t\n\tconst description = 'Exports an animation into a sequence of Minecraft block/item models.'\n\tconst icon = 'icon.png'\n\t\n\tBBPlugin.register('java_block_sequencer', {\n\t\ttitle: 'Java Block Sequencer',\n\t\ticon,\n\t\tauthor: 'Jatzylap',\n\t\tdescription,\n    \ttags: [\"Minecraft: Java Edition\", \"Exporter\", \"Animation\"],\n\t\tversion: '1.0.0',\n\t\tmin_version: '5.0.5',\n\t\tvariant: 'both',\n\t\tcreation_date: \"2025-12-27\",\n\t\thas_changelog: true,\n\t\trepository: \"https://github.com/Jatzylap/Java-Block-Sequencer\",\n\t\tonload() {\n\n\t\t\tcodec = Codecs.java_block;\t// Defaults to 1.21.11+ format\n\t\t\t\n\t\t\tformat = new ModelFormat({\n\t\t        id: \"java_block_sequence\",\n\t\t        name: \"Java Block Sequence\",\n\t\t        extension: \"json\",\n\t\t        icon: \"icon-objects\",\n\t\t        category: \"minecraft\",\n\t\t        format_page: {\n\t\t          component: {\n\t\t            methods: {\n\t\t              create: () => format.new()\n\t\t            },\n\t\t            template: `\n\t\t              <div class=\"format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n\t\t                <p class=\"format_description\">${description}</p>\n\t\t                <p class=\"format_target\"><b>Target</b> : <span>Minecraft: Java Edition</span></p>\n\t\t                <content>\n\t\t                  <h3 class=\"markdown\">About:</h3>\n\t\t                  <p class=\"markdown\">\n\t\t                    <ul>\n\t\t            \t\t  <li>Adds the option to turn an animation into a sequence of Minecraft block/item models.</li>\n\t\t                      <li>This will not export any item definition files for the exported models, so these must be referenced manually in a resource pack.</li>\n\t\t                      <li>Requires <strong>Minecraft 1.21.11</strong> or later.</li>\n\t\t                    </ul>\n\t\t                  </p>\n\t\t                  <h3 class=\"markdown\">How to use:</h3>\n\t\t                  <p class=\"markdown\">\n\t\t                    <ul>\n\t\t                      <li>Create a new model or convert an existing cube-based project into a <strong>Java Block Sequence</strong>.</li>\n\t\t                      <li>Create an animation.</li>\n\t\t                      <li>Right-click your animation.</li>\n\t\t                      <li>Click <strong>Export Java Block Sequence</strong> from the drop-down menu.</li>\n\t\t            \t\t  <li>Each model will be displayed in-game based on settings in the Display tab.</li>\n\t\t                    </ul>\n\t\t                  </p>\n\t\t                  <h3 class=\"markdown\">Troubleshooting:</h3>\n\t\t                  <p class=\"markdown\">\n\t\t                    <ul>\n\t\t                      <li>If the exported models aren't getting rotated or positioned properly, make sure the groups/bones used in your Java Block Sequence have been checked (Export: On) in the outliner.</li>\n\t\t                    </ul>\n\t\t                  </p>\n\t\t                </content>\n\t\t                <div class=\"spacer\"></div>\n\t\t                <div class=\"button_bar\">\n\t\t                  <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"create\">\n\t\t                    <i class=\"material-icons icon\">arrow_forward</i>\n\t\t                    Create New Model\n\t\t                  </button>\n\t\t                </div>\n\t\t              </div>\n\t\t            `\n\t\t          }\n\t\t        },\n\t\t        render_sides: \"front\",\n\t\t        model_identifier: false,\n\t\t        parent_model_id: true,\n\t\t        vertex_color_ambient_occlusion: true,\n\t\t        bone_rig: true,\n\t\t        rotate_cubes: true,\n\t\t        optional_box_uv: true,\n\t\t        uv_rotation: true,\n\t\t        java_cube_shading_properties: true,\n\t\t        java_face_properties: true,\n\t\t        cullfaces: true,\n\t\t        animated_textures: true,\n\t\t        select_texture_for_particles: true,\n\t\t        texture_mcmeta: true,\n\t\t        display_mode: true,\n\t\t        animation_mode: true,\n\t\t        texture_folder: true,\n\t\t        animation_controllers: true,\n\t\t        animation_files: true,\n\t\t        codec\n\t\t      })\n\n\t\t\tcodec.format = format;\n\n\t\t\texport_anim_action = new Action('export_java_block_sequence', {\n\t\t\t\tname: 'Export Java Block sequence',\n\t\t\t\tdescription: 'Export animation into Java Block models',\n\t\t\t\ticon: 'icon-objects',\n\t\t\t\tcategory: 'animation',\n\t\t\t\tcondition: () => Modes.animate && Animation.selected,\n\t\t\t\tclick() {\n\t\t\t\t\tnew Dialog({\n\t\t\t\t\t\tid: 'export_java_block_sequence',\n\t\t\t\t\t\ttitle: 'Export Java Block Sequence',\n\t\t\t\t\t\tform: {\n\t\t\t\t\t\t\tlength: {label: 'Length', type: 'number', value: Animation.selected.length, min: 0, max: 10000},\n\t\t\t\t\t\t\tfps: {label: 'FPS', type: 'number', value: Animation.selected.snapping, min: 1, max: 1000},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonConfirm({length, fps}) {\n\n\t\t\t\t\t\t\tlet archive = new JSZip();\n\t\t\t\t\t\t\tTimeline.setTime(0);\n\n\t\t\t\t\t\t\tfor (let frame = 0; frame <= length * fps; frame++) {\n\t\t\t\t\t\t\t\tTimeline.setTime(frame / fps);\n\t\t\t\t\t\t\t\tAnimator.preview();\n\t\t\t\t\t\t\t\tlet elements = Outliner.elements;\n\t\t\t\t\t\t\t\tUndo.initEdit({elements, outliner: true, groups: Group.all});\n\t\t\t\t\t\t\t\tlet animatable_elements = Outliner.elements.filter(el => el.constructor.animator);\n\n\t\t\t\t\t\t\t\t[...Group.all, ...animatable_elements].forEach(node => {\n\t\t\t\t\t\t\t\t\tlet offset_rotation = [0, 0, 0];\n\t\t\t\t\t\t\t\t\tlet offset_position = [0, 0, 0];\n\t\t\t\t\t\t\t\t\tlet offset_scale = [1, 1, 1];\n\t\t\t\t\t\t\t\t\tAnimator.animations.forEach(animation => {\n\t\t\t\t\t\t\t\t\t\tif (animation.playing) {\n\t\t\t\t\t\t\t\t\t\t\tlet animator = animation.getBoneAnimator(node);\n\t\t\t\t\t\t\t\t\t\t\tlet multiplier = animation.blend_weight ? Math.clamp(Animator.MolangParser.parse(animation.blend_weight), 0, Infinity) : 1;\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif (node instanceof Group) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (animator.channels.rotation) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet rotation = animator.interpolate('rotation');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (rotation instanceof Array) offset_rotation.V3_add(rotation.map(v => v * multiplier));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif (animator.channels.position) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet position = animator.interpolate('position');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (position instanceof Array) offset_position.V3_add(position.map(v => v * multiplier));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif (animator.channels.scale) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tlet scale = animator.interpolate('scale');\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (scale instanceof Array) offset_scale.V3_multiply(scale.map(v => v * multiplier));\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t// Rotation\n\t\t\t\t\t\t\t\t\tif (node.getTypeBehavior('rotatable')) {\n\t\t\t\t\t\t\t\t\t\tnode.rotation[0] += offset_rotation[0];\n\t\t\t\t\t\t\t\t\t\tnode.rotation[1] += offset_rotation[1];\n\t\t\t\t\t\t\t\t\t\tnode.rotation[2] += offset_rotation[2];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t// Position, Scale\n\t\t\t\t\t\t\t\t\tfunction offset(node) {\n\t\t\t\t\t\t\t\t\t\tif (node instanceof Group) {\n\t\t\t\t\t\t\t\t\t\t\tnode.origin.V3_add(offset_position);\n\t\t\t\t\t\t\t\t\t\t\tnode.children.forEach(offset);\n\t\t\t\t\t\t\t\t\t\t} else {\t\n\t\t\t\t\t\t\t\t\t\t\tif (node.from) node.from.V3_add(offset_position);\n\t\t\t\t\t\t\t\t\t\t\tif (node.to) node.to.V3_add(offset_position);\n\t\t\t\t\t\t\t\t\t\t\tif (node.origin && node.origin !== node.from) node.origin.V3_add(offset_position);\n\n\t\t\t\t\t\t\t\t\t\t\t// Scale\n\t\t\t\t\t\t\t\t\t\t\tlet before_from = node.from;\n\t\t\t\t\t\t\t\t\t\t\tlet before_to = node.to;\n\t\t\t\t\t\t\t\t\t\t\tlet before_origin = node.origin;\n\t\t\t\t\t\t\t\t\t\t\tlet new_origin = node.parent.origin;\n\n\t\t\t\t\t\t\t\t\t\t\tnew_origin.forEach(function(ogn, i) {\n\t\t\t\t\t\t\t\t\t\t\t\tif (node.from) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.from[i] = (before_from[i] - node.inflate - ogn) * offset_scale[i];\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.from[i] = node.from[i] + node.inflate + ogn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif (node.to) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.to[i] = (before_to[i] + node.inflate - ogn) * offset_scale[i];\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.to[i] = node.to[i] - node.inflate + ogn;\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (Format.integer_size) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnode.to[i] = node.from[i] + Math.round(node.to[i] - node.from[i])\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif (node.origin) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.origin[i] = (before_origin[i] - ogn) * offset_scale[i];\n\t\t\t\t\t\t\t\t\t\t\t\t\tnode.origin[i] = node.origin[i] + ogn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Resolve mesh positions from bones\n\t\t\t\t\t\t\t\t\tfunction resolve(node) {\n\t\t\t\t\t\t\t\t\t\tvar array = node.children.slice();\n\t\t\t\t\t\t\t\t\t\tvar index = node.getParentArray().indexOf(node)\n\t\t\t\t\t\t\t\t\t\tlet all_elements = [];\n\t\t\t\t\t\t\t\t\t\tlet all_groups = [node];\n\t\t\t\t\t\t\t\t\t\tnode.forEachChild(obj => {\n\t\t\t\t\t\t\t\t\t\t\tif (obj instanceof Group == false) {\n\t\t\t\t\t\t\t\t\t\t\t\tall_elements.push(obj);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tall_groups.push(obj);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tarray.forEach((obj) => {\n\t\t\t\t\t\t\t\t\t\t\tobj.addTo(node.parent, index)\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tif ((obj instanceof Cube && Format.rotate_cubes) || (obj instanceof OutlinerElement && obj.getTypeBehavior('rotatable')) || (obj instanceof Group && Format.bone_rig)) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet quat = new THREE.Quaternion().copy(obj.mesh.quaternion);\n\t\t\t\t\t\t\t\t\t\t\t\tquat.premultiply(obj.mesh.parent.quaternion);\n\t\t\t\t\t\t\t\t\t\t\t\tlet e = new THREE.Euler().setFromQuaternion(quat, obj.mesh.rotation.order);\n\t\t\t\t\t\t\t\t\t\t\t\tobj.extend({\n\t\t\t\t\t\t\t\t\t\t\t\t\trotation: [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMath.roundTo(Math.radToDeg(e.x), 4),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMath.roundTo(Math.radToDeg(e.y), 4),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMath.roundTo(Math.radToDeg(e.z), 4),\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif (obj.mesh) {\n\t\t\t\t\t\t\t\t\t\t\t\tlet pos = new THREE.Vector3().copy(obj.mesh.position);\n\t\t\t\t\t\t\t\t\t\t\t\tpos.applyQuaternion(node.mesh.quaternion).sub(obj.mesh.position);\n\t\t\t\t\t\t\t\t\t\t\t\tlet diff = pos.toArray();\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (obj.from) obj.from.V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\tif (obj.to) obj.to.V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\tif (obj.getTypeBehavior('rotatable') || obj instanceof Group) obj.origin.V3_add(diff);\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (obj instanceof Group) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.forEachChild(child => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (child instanceof Mesh) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfor (let vkey in child.vertices) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tchild.vertices[vkey].V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (child instanceof Cube) child.from.V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (child.to) child.to.V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (child.origin) child.origin.V3_add(diff);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\tCanvas.updateView({elements: array, element_aspects: {transform: true}});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\toffset(node);\n\t\t\t\t\t\t\t\t\tresolve(node);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tlet javablockmodel = codec.compile(Project);\n\t\t\t\t\t\t\t\tarchive.file(`${frame}.json`, javablockmodel);\n\t\t\t\t\t\t\t\tUndo.finishEdit(`Java Block Sequence Cache`);\n\t\t\t\t\t\t\t\tUndo.undo();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tarchive.generateAsync({type: 'blob'}).then(content => {\n\t\t\t\t\t\t\t\tBlockbench.export({\n\t\t\t\t\t\t\t\t\tresource_id: 'model',\n\t\t\t\t\t\t\t\t\ttype: 'Zip Archive',\n\t\t\t\t\t\t\t\t\textensions: ['zip'],\n\t\t\t\t\t\t\t\t\tname: Animation.selected.name,\n\t\t\t\t\t\t\t\t\tcontent: content,\n\t\t\t\t\t\t\t\t\tsavetype: 'zip'\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}).show();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\texport_model_action = new Action({\n\t\t\t\tid: 'export_blockmodel',\n\t\t\t\ticon: 'icon-format_block',\n\t\t\t\tcategory: 'file',\n\t\t\t\tcondition: () => Format == format,\n\t\t\t\tclick: function () {\n\t\t\t\t\tcodec.export();\n\t\t\t\t}\n\t\t\t})\n\t\t\timport_model_action = new Action('import_java_block_model', {\n\t\t\t\ticon: 'assessment',\n\t\t\t\tcategory: 'file',\n\t\t\t\tcondition: () => Format == format,\n\t\t\t\tclick: function () {\n\t\t\t\t\tBlockbench.import({\n\t\t\t\t\t\tresource_id: 'model',\n\t\t\t\t\t\textensions: ['json'],\n\t\t\t\t\t\ttype: codec.name,\n\t\t\t\t\t\tmultiple: true,\n\t\t\t\t\t}, function(files) {\n\t\t\t\t\t\tfiles.forEach(file => {\n\t\t\t\t\t\t\tvar model = autoParseJSON(file.content, {file_path: file.path})\n\t\t\t\t\t\t\tcodec.parse(model, file.path, {\n\t\t\t\t\t\t\t\timport_to_current_project: true\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tAnimation.prototype.menu.addAction(export_anim_action, '-1');\n\t\t\tMenuBar.addAction(export_model_action, \"file.export.0\")\n\t\t\tMenuBar.addAction(import_model_action, \"file.import.0\")\n\n\t\t},\n\t\tonunload() {\n\t\t\tcodec.delete();\n\t\t\tformat.delete();\n\t\t\texport_action.delete();\n\t\t}\n\t});\n})()\n"
  },
  {
    "path": "plugins/java_block_sequencer/members.yml",
    "content": "maintainers:\n- Jatzylap"
  },
  {
    "path": "plugins/let_there_be_noise/about.md",
    "content": "## How to use Let There Be Noise\n\n1. Select a texture in the textures panel in Paint Mode\n2. Click the Image dropdown in the toolbar\n3. Adjust the settings:\n - **Amount** = Strength of the noise applied\n - **Coverage** = Percentage of pixels affected in the image or selection\n - **Seed** = The seed for the noise applied allows for deterministic noise across texture variants\n - **Mode** = Uniform by default, provides additional options. Selecting **per channel** allows you to **apply/filter** noise to targeted colour channels\n\n4: Click **Confirm** to apply the changes to the texture/selection\n\n### Per Channel Mode\n- As listed above in mode, **per channel** applies noise to specific RGBA channels individually. This is intended for editing packed textures like MERS without affecting other colour channels.\n\n### Additional features\n- Supports selections, select an area first to apply noise within that region"
  },
  {
    "path": "plugins/let_there_be_noise/let_there_be_noise.js",
    "content": "(function() {\n    let dialog = null;\n    let preview = null;\n    let previewCtx = null;\n    let original = null;\n\n    Plugin.register('let_there_be_noise', {\n    title: 'Let there Be Noise',\n    author: 'Momoko',\n    icon: 'grain',\n    description: 'Adds a noise adding function to BlockBench, supports selections and colour channels',\n    version: '1.0.0',\n    min_version: '4.8.0',\n    variant: 'both',\n    tags: ['Texture', 'Paint', 'Tool'],\n    creation_date: '2026-03-25',\n    onload() {\n    this.action = new Action('add_noise.apply', {\n    name: 'Add Noise',\n    description: 'Apply noise to the currently selected texture',\n    icon: 'grain',\n    category: 'textures',\n\n    click: () => {\n    const tex = Texture.getDefault() || Texture.all[0];\n    if(!tex) {\n    Blockbench.showQuickMessage('No texture Selected or Found', 2000);\n    return;\n    }\n\n    //guard for versions of BlockBench that may not have getActiveCanvas() 4 ctx\n    const active = tex.getActiveCanvas ? tex.getActiveCanvas() : tex;\n    const canvas = active.canvas || tex.canvas;\n    const ctx = active.ctx || tex.ctx;\n    original = ctx.getImageData(0,0, tex.width, tex.height);\n\n    if(dialog) dialog.hide();\n    dialog = new Dialog({\n    id: 'add_noise.dialog',\n    title: 'Add Noise',\n    width: 500,\n     form: { //source used for checkerboard via https://css-tricks.com/\n          preview_box: { type: 'info', text: '<div style=\"margin-bottom:15px;text-align:center;background:repeating-conic-gradient(#222 0% 25%,#333 0% 50%) 50%/16px 16px;padding:10px;border-radius:4px\"><canvas id=\"add_noise_preview\" style=\"border:2px solid #555;image-rendering:pixelated;width:400px;height:auto\"></canvas></div>' },\n          amount: { label: 'Amount', type: 'range', min: 0, max: 100, value: 20, step: 1, full_width: true },\n          coverage: { label: 'Coverage', type: 'range', min: 0, max: 100, value: 100, step: 1, full_width: true },\n          seed: { label: 'Seed', type: 'number', value: 1, step: 1, min: 0 },\n          mode_separator: { type: 'info', text: '<hr>' },\n          channel_mode: { label: 'Mode', type: 'select', options: { 'uniform': 'Uniform (All Channels)', 'individual': 'Per-Channel Control' }, value: 'uniform' },\n          channel_separator: { type: 'info', text: '<h4>Channel Control</h4>', condition: (form) => form.channel_mode === 'individual' },\n          red_channel: { label: 'Red Channel (Metalness)', type: 'checkbox', value: true, condition: (form) => form.channel_mode === 'individual' },\n          green_channel: { label: 'Green Channel (Emissive)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' },\n          blue_channel: { label: 'Blue Channel (Roughness)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' },\n          alpha_channel: { label: 'Alpha Channel (Subsurface)', type: 'checkbox', value: false, condition: (form) => form.channel_mode === 'individual' }\n    },\n    onFormChange: function(data) {\n    refreshPreview(tex, data);\n    },\n    onConfirm: function(data) {\n    applyNoise(tex, data);\n    dialog.hide();\n    },\n    onCancel: function() {\n    dialog.hide();\n    },\n    onOpen: function() {\n    setTimeout(function() {\n    preview = document.getElementById('add_noise_preview');\n    if(preview) {\n    previewCtx = preview.getContext('2d');\n    preview.width = tex.width;\n    preview.height = tex.height;\n    preview.style.width = '400px';\n    preview.style.height = 'auto';\n    preview.style.aspectRatio = preview.width + ' / ' + preview.height;\n    refreshPreview(tex, dialog.getFormResult());\n    }}, 100);}});dialog.show();}});\n\n    MenuBar.addAction(this.action, 'image');\n    },\n\n    onunload() {\n    if (this.action) this.action.delete();\n    if(dialog) dialog.hide();\n    }});\n\n    function getSelectedBounds(tex){\n    if(!tex.selection || tex.selection.override === true) return null;\n    const arr = tex.selection.array;\n    const width = tex.width;\n    const height = tex.height;\n    if(!arr || arr.length !== width * height) return null;\n\n    let minX = width, minY = height, maxX = -1, maxY = -1;\n\n    for(let i = 0; i < arr.length; i++) {\n    if(arr[i] > 0){\n    const x = i % width;\n    const y = (i / width) | 0;\n\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    if(maxX < 0) return null;\n    return{x:minX, y:minY, w:(maxX - minX + 1), h:(maxY - minY + 1)};\n    }\n\n    function refreshPreview(tex, data){\n    if(!previewCtx || !original) return;\n    const result = processNoise(tex, data, original, true);\n    previewCtx.putImageData(result, 0, 0);\n    }\n\n\n    function applyNoise(tex, data) {\n    const active = tex.getActiveCanvas ? tex.getActiveCanvas() : tex;\n    const canvas = active.canvas || tex.canvas;\n    const ctx = canvas.getContext('2d');\n\n    Undo.initEdit({ textures: [tex], bitmap: true });\n\n    const src = ctx.getImageData(0,0,tex.width,tex.height);\n    const result = processNoise(tex, data, src, true);\n\n    ctx.putImageData(result, 0, 0);\n    tex.updateChangesAfterEdit();\n    Undo.finishEdit('Add noise');\n    }\n\n    function processNoise(tex, data, srcData, useSelect) {\n    const rng = mulberry32(seedTo32(data.seed));\n    const out = new Uint8ClampedArray(srcData.data);\n    const amount = Number(data.amount) || 0;\n    const coverage = (Number(data.coverage) || 0) / 100;\n\n    const isIndividualMode = data.channel_mode === 'individual';\n    const channels = {\n    r: isIndividualMode ? (data.red_channel === true) : true,\n    g: isIndividualMode ? (data.green_channel === true) : true,\n    b: isIndividualMode ? (data.blue_channel === true) : true,\n    a: isIndividualMode ? (data.alpha_channel === true) : false\n    };\n\n    let select = (tex.selection && tex.selection.override !== true) ? tex.selection.array : null;\n    if(select && select.length !== srcData.width * srcData.height) select = null;\n    const tex_w = srcData.width;\n\n    let x0 = 0, y0 = 0, w0 = srcData.width, h0 = srcData.height;\n    const bounds = getSelectedBounds(tex);\n    if(!bounds) select = null;\n    if(bounds) { x0 = bounds.x; y0 = bounds.y; w0 = bounds.w; h0 = bounds.h; }\n\n    for(let y = 0; y < srcData.height; y++){\n    for(let x = 0; x < srcData.width; x++){\n    const p = (y * srcData.width + x) * 4;\n\n    const coverageVal = rng();\n    const nr = (rng() * 2 - 1) * amount;\n    const ng = (rng() * 2 - 1) * amount;\n    const nb = (rng() * 2 - 1) * amount;\n    const na = (rng() * 2 - 1) * amount;\n\n    if(useSelect && bounds){\n    if(x < x0 || y < y0 || x >= (x0 + w0) || y >= (y0 + h0)) continue;\n    }\n\n    if(select && useSelect) {\n    const gi = y * tex_w + x;\n    if(select[gi] <= 0) continue;}\n    if(coverageVal > coverage) continue;\n\n    if(isIndividualMode) {\n    if(channels.r) out[p] = clamp(out[p] + nr);\n    if(channels.g) out[p + 1] = clamp(out[p + 1] + ng);\n    if(channels.b) out[p + 2] = clamp(out[p + 2] + nb);\n    if(channels.a) out[p + 3] = clamp(out[p + 3] + na);\n    } else {\n    out[p] = clamp(out[p] + nr);\n    out[p + 1] = clamp(out[p + 1] + nr);\n    out[p + 2] = clamp(out[p + 2] + nr);\n    }\n    }}\n    return new ImageData(out, srcData.width, srcData.height);\n    }\n\n    function clamp(v){\n    return v < 0 ? 0 : (v > 255 ? 255 : v);\n    }\n\n    function seedTo32(seed){\n    seed = Number(seed) || 0;\n    seed = seed | 0;\n    return seed >>> 0;\n    }\n\n    //mulberry function rng https://github.com/cprosche/mulberry32\n    function mulberry32(a){\n    return function() {\n    a |= 0;\n    a = (a + 0x6D2B79F5) | 0;\n    let t = Math.imul(a ^ (a >>> 15), 1 | a);\n    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n    }\n    }\n})();"
  },
  {
    "path": "plugins/light_tracer_uploader.js",
    "content": "(function() {\n\n\tlet action, setting_login;\n\n\tasync function getToken(login, password) {\n\n\t\tvar data = new FormData()\n\t\tdata.append('login', login)\n\t\tdata.append('password', password)\n\n\t\tlet result = await $.ajax({\n\t\t\turl: 'https://lighttracer.org/app/generate/',\n\t\t\tdata: data,\n\t\t\tcache: false,\n\t\t\tcontentType: false,\n\t\t\tprocessData: false,\n\t\t\ttype: 'POST'\n\t\t})\n\n\t\tif (result && result.message && result.message.token) {\n\t\t\tsettings.light_tracer_login.value = login;\n\t\t\treturn result.message.token;\n\t\t} else {\n\t\t\tBlockbench.showMessageBox({\n\t\t\t\ttitle: 'Failed to Upload Model',\n\t\t\t\ticon: 'error',\n\t\t\t\tmessage: (result && result.message) ? result.message : 'Cannot connect to server',\n\t\t\t})\n\t\t\tconsole.error(result)\n\t\t}\n\t}\n\n\tasync function uploadLightTracerModel() {\n\t\tif (Cube.all.length === 0) return;\n\n\t\tlet login = Settings.get('light_tracer_login');\n\t\t\n\t\tvar dialog = new Dialog({\n\t\t\tid: 'light_tracer_uploader',\n\t\t\ttitle: 'Upload To Light Tracer',\n\t\t\twidth: 540,\n\t\t\tform: {\n\t\t\t\tlogin: {label: 'Email', value: login},\n\t\t\t\tpassword: {label: 'Password', value: '', type: 'password'},\n\t\t\t\tinfo: {label: ' ', nocolon: true, type: 'info', text: 'Don\\'t have an account? [Sign up](https://lighttracer.org/accounts/signup/)'},\n\t\t\t\tname: {label: 'Name', value: Project.name},\n\t\t\t\tdescription: {label: 'Description', type: 'textarea'},\n\t\t\t\tpublic: {label: 'Public', type: 'checkbox'},\n\t\t\t},\n\t\t\tonConfirm: async function(formResult) {\n\n\t\t\t\tif (!formResult.login || !formResult.password) {\n\t\t\t\t\tBlockbench.showQuickMessage('Email and password are required')\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdialog.hide();\n\t\t\t\tBlockbench.showQuickMessage('Uploading... this may take a few moments...', 3000)\n\n\t\t\t\tlet token = await getToken(formResult.login, formResult.password);\n\n\t\t\t\tif (!token) return;\n\n\t\t\t\tvar data = new FormData()\n\t\t\t\tdata.append('login', formResult.login);\n\t\t\t\tdata.append('token', token);\n\t\t\t\tdata.append('name', formResult.name);\n\t\t\t\tdata.append('description', formResult.description);\n\t\t\t\tdata.append('public', formResult.public);\n\t\n\t\t\t\tCodecs.gltf.compile({animations: false}, (content) => {\n\t\n\t\t\t\t\tvar blob = new Blob([content], {type: \"text/plain;charset=utf-8\"});\n\t\t\t\t\tvar file = new File([blob], 'model.gltf');\n\t\t\t\t\tdata.append('file', file);\n\n\t\t\t\t\t$.ajax({\n\t\t\t\t\t\turl: 'https://lighttracer.org/app/model/',\n\t\t\t\t\t\tdata: data,\n\t\t\t\t\t\tcache: false,\n\t\t\t\t\t\tcontentType: false,\n\t\t\t\t\t\tprocessData: false,\n\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\tsuccess: function(response) {\n\n\t\t\t\t\t\t\tlet link = `https://lighttracer.org/dash/model/${response.id}`;\n\t\t\t\t\t\t\tBlockbench.showMessageBox({\n\t\t\t\t\t\t\t\ttitle: 'Model uploaded to Light Tracer',\n\t\t\t\t\t\t\t\tmessage: `[${formResult.name}](${link})`,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function(response) {\n\n\t\t\t\t\t\t\tBlockbench.showMessageBox({\n\t\t\t\t\t\t\t\ttitle: 'Failed to Upload Model',\n\t\t\t\t\t\t\t\ticon: 'error',\n\t\t\t\t\t\t\t\tmessage: `Unable to upload model`,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tconsole.error(response);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tdialog.show();\n\t}\n\n\tPlugin.register('light_tracer_uploader', {\n\t\ttitle: 'Light Tracer Uploader',\n\t\ticon: 'fas.fa-feather',\n\t\tauthor: 'JannisX11',\n\t\tdescription: 'Upload models to Light Tracer to share them or to create renders',\n\t\tversion: '0.0.1',\n\t\tvariant: 'both',\n\t\tonload() {\n\n\t\t\taction = new Action({\n\t\t\t\tid: 'upload_light_tracer',\n\t\t\t\tname: 'Upload to Light Tracer',\n\t\t\t\ticon: 'fas.fa-feather',\n\t\t\t\tcategory: 'file',\n\t\t\t\tclick: () => {\n\t\t\t\t\tuploadLightTracerModel();\n\t\t\t\t}\n\t\t\t});\n\t\t\tMenuBar.addAction(action, 'file.export');\n\t\t\t\n\t\t\tsetting_login = new Setting('light_tracer_login', {\n\t\t\t\tname: 'Light Tracer Email',\n\t\t\t\tdescription: 'Light Tracer login email address',\n\t\t\t\tcategory: 'export',\n\t\t\t\tvalue: '',\n\t\t\t\ttype: 'text'\n\t\t\t});\n\t\t},\n\t\tonunload() {\n\t\t\taction.delete();\n\t\t\tsetting_login.delete();\n\t\t}\n\t})\n\n})()\n"
  },
  {
    "path": "plugins/live_dev_reloader/about.md",
    "content": "<div id=\"about-content\">\n  <p>This plugin adds a way to edit both plugin and theme files in a text editor of your choice, and have them automatically update inside Blockbench upon you saving the file.</p>\n  <p>When a plugin file is being watched for changes, it's <strong>about.md</strong> file will be automatically watched for changes too.</p>\n  <p>Theme files support both <strong>.bbtheme</strong> and <strong>.css</strong> files being watched.</p>\n  <h2>How to use</h2>\n  <h3>Watching files</h3>\n  <p>To watch a file, have a theme or plugin file ready, then go to <strong>Help > Developer > Live Dev Reloader</strong>. From here, select <strong>Watch plugin or theme file</strong>, then select your plugin or theme file.</p>\n  <h3>Unwatching files</h3>\n  <p>To stop watching a file, go to <strong>Help > Developer > Live Dev Reloader</strong> and select <strong>Stop watching plugin or theme file</strong>.</p>\n  <h3>Persistent mode</h3>\n  <p>To have a plugin or theme continue to be watched next time Blockbench is loaded, enable persistent mode. This can be found at <strong>Help > Developer > Live Dev Reloader > Persist after restart</strong>.</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/live_dev_reloader/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2024-01-20\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2024-06-08\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed reloading themes that change the viewport size causing the viewport to render incorrectly\",\n          \"Fixed theme name in theme reload logging\"\n        ]\n      }\n    ]\n  },\n  \"1.0.2\": {\n    \"title\": \"1.0.2\",\n    \"date\": \"2025-06-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed \\\"Plugin not installed\\\" when Live Dev Reloader loads before the watched plugin\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/live_dev_reloader/live_dev_reloader.js",
    "content": "let fs, actions, watching, message, styles, unwatchAction, rewatchAction\n\nconst id = \"live_dev_reloader\"\nconst name = \"Live Dev Reloader\"\nconst icon = \"refresh\"\n\nPlugin.register(id, {\n  title: name,\n  icon: \"icon.png\",\n  author: \"Ewan Howell\",\n  description: \"Edit plugins and themes live in any text editor and have them automatically update in Blockbench.\",\n  tags: [\"Plugins\", \"Themes\", \"Blockbench\"],\n  version: \"1.1.0\",\n  min_version: \"5.0.0\",\n  variant: \"desktop\",\n  website: \"https://ewanhowell.com/plugins/live-dev-reloader/\",\n  repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/live_dev_reloader\",\n  bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Live Dev Reloader]\",\n  creation_date: \"2024-01-20\",\n  has_changelog: true,\n  onload() {\n    let toggle\n    actions = [\n      new Action(\"live_dev_reloader_watch\", {\n        plugin: id,\n        name: \"Watch plugin or theme file\",\n        icon: \"visibility\",\n        description: \"Watch a plugin or theme file and reload it in Blockbench when changes are made\",\n        condition: () => !watching,\n        click() {\n          Blockbench.import({\n            extensions: [\"js\", \"bbtheme\", \"css\"],\n            type: \"Plugin or Theme\",\n          }, files => watch(files[0].path))\n        }\n      }),\n      toggle = new Toggle(\"live_dev_reloader_persist\", {\n        name: \"Persist after restart\",\n        description: \"The file should continue being watched after a Blockbench restart\",\n        icon,\n        onChange(state) {\n          localStorage.setItem(\"live_dev_reloader_persist\", state)\n        }\n      })\n    ]\n    setTimeout(() => {\n      const file = localStorage.getItem(\"live_dev_reloader_file\")\n      if (localStorage.getItem(\"live_dev_reloader_file\") && localStorage.getItem(\"live_dev_reloader_persist\") === \"true\") {\n        toggle.set(true)\n        if (localStorage.getItem(\"live_dev_reloader_stopped\") === \"true\") rewatch()\n        else watch(file, true)\n      } else if (localStorage.getItem(\"live_dev_reloader_stopped\") === \"true\") rewatch()\n    }, 0)\n    MenuBar.addAction({\n      name,\n      id,\n      children: actions,\n      icon,\n    }, \"help.developer.1\")\n  },\n  onunload() {\n    actions.forEach(e => e.delete())\n    if (fs) {\n      unwatch(\"reload\")\n    }\n    MenuBar.removeAction(`help.developer.${id}`)\n  }\n})\n\nfunction getFS() {\n  fs = require(\"fs\", {\n    message: \"This permission is required to load and detect changes in plugin and theme files on your computer.\",\n    optional: false\n  })\n  if (!fs) {\n    throw new Error(\"fs access denied\")\n  }\n}\n\nfunction watch(file, first) {\n  getFS()\n  if (!fs.existsSync(file)) {\n    localStorage.removeItem(\"live_dev_reloader_file\")\n    unwatch(\"force\")\n    return Blockbench.showQuickMessage(`Stopped watching. File not found: ${PathModule.basename(file)}`, 3000)\n  }\n  fs.watchFile(file, { interval: 100 }, (...args) => update(...args, true))\n  fs.watchFile(PathModule.join(PathModule.dirname(file), \"about.md\"), { interval: 100 }, update)\n  watching = file\n  update({ mtime: 1 }, { mtime: 0 }, true, true)\n  localStorage.setItem(\"live_dev_reloader_file\", file)\n  Blockbench.showQuickMessage(`Watching file: ${PathModule.basename(file)}`, 3000)\n  if (unwatchAction) {\n    unwatchAction.delete()\n    actions.splice(actions.indexOf(unwatchAction), 1)\n  }\n  unwatchAction = new Action(\"live_dev_reloader_unwatch\", {\n    plugin: id,\n    name: \"Stop watching plugin or theme file\",\n    icon: \"visibility_off\",\n    description: `Currently watching: ${file}`,\n    condition: () => watching,\n    click: () => unwatch(\"manual\")\n  })\n  actions.unshift(unwatchAction)\n  localStorage.setItem(\"live_dev_reloader_stopped\", false)\n}\n\nfunction unwatch(type) {\n  getFS()\n  if (watching) {\n    fs.unwatchFile(watching)\n    fs.unwatchFile(PathModule.join(PathModule.dirname(watching), \"about.md\"))\n  }\n  styles?.delete()\n  message?.close()\n  if (type === \"force\") localStorage.removeItem(\"live_dev_reloader_file\")\n  else if (type === \"manual\") {\n    localStorage.setItem(\"live_dev_reloader_stopped\", true)\n    rewatch()\n    Blockbench.showQuickMessage(`Stopped watching ${PathModule.basename(watching)}`, 3000)\n  } else if (type === \"reload\") {\n    if (watching && localStorage.getItem(\"live_dev_reloader_persist\") === \"true\") localStorage.setItem(\"live_dev_reloader_stopped\", false)\n    else localStorage.setItem(\"live_dev_reloader_stopped\", true)\n  }\n  watching = false\n}\n\nfunction rewatch() {\n  getFS()\n  if (rewatchAction) {\n    rewatchAction.delete()\n    actions.splice(actions.indexOf(rewatchAction), 1)\n  }\n  const file = localStorage.getItem(\"live_dev_reloader_file\")\n  if (fs.existsSync(file)) {\n    rewatchAction = new Action(\"live_dev_reloader_rewatch\", {\n      plugin: id,\n      name: `Rewatch ${PathModule.basename(file)}`,\n      description: `Rewatch the file: ${file}`,\n      icon,\n      condition: () => !watching && localStorage.getItem(\"live_dev_reloader_stopped\") === \"true\" && localStorage.getItem(\"live_dev_reloader_file\"),\n      click: () => watch(file)\n    })\n    actions.push(rewatchAction)\n  }\n}\n\nasync function update(curr, prev, main, first) {\n  getFS()\n  if (main && curr.mtimeMs === 0) {\n    Blockbench.showQuickMessage(`Stopped watching. File not found: ${PathModule.basename(watching)}`, 3000)\n    return unwatch(\"force\")\n  } else if (curr.mtime > prev.mtime) {\n    message?.close()\n    styles?.delete()\n    if (watching.endsWith(\".js\")) {\n      const id = PathModule.basename(watching, \".js\")\n      const plugin = Plugins.all.find(e => e.id === id && e.source === \"file\")\n      if (!plugin) return message = Blockbench.showMessageBox({\n        title: \"Plugin not installed\",\n        message: `Please install the <code>${id}</code> plugin so that it can be watched for live changes.\\n\\nPlugin location: <code>${watching}</code>`,\n        buttons: [\"Install Plugin\", \"Stop Watching\", \"dialog.close\"]\n      }, button => {\n        if (button === 0) Blockbench.read(watching, {}, f => new Plugin().loadFromFile(f[0], true))\n        else if (button === 1) unwatch(\"force\")\n      })\n      if (first) return\n      plugin.reload()\n      console.log(`Plugin reloaded: ${id}`)\n    } else {\n      let css = fs.readFileSync(watching)\n      let name\n      if (watching.endsWith(\".bbtheme\")) {\n        try {\n          const data = JSON.parse(css)\n          name = data.name\n          css = `body{`\n          if (data.main_font) css += `--font-custom-main: ${data.main_font};`\n          if (data.headline_font) css += `--font-custom-headline: ${data.headline_font};`\n          if (data.code_font) css += `--font-custom-code: ${data.code_font};`\n          if (data.colors) for (const [id, col] of Object.entries(data.colors)) {\n            css += `--color-${id}: ${col} !important;`\n          }\n          css += \"}\"\n          if (data.borders) {\n            const borders = (await fetch(\"css/general.css\").then(e => e.text()).catch(() => \"\")).match(/(?<=\\/\\* Theme Borders \\*\\/)(?:.|\\r\\n|\\r)*?(?=\\/\\*|$)/)\n            if (borders) css += borders[0].replace(/([\\n\\r\\t]|\\.theme_borders)/g, \"\")\n            css += \"body #plugin_list > li {border: 1px solid var(--color-border);margin: 0;\"\n          }\n          css += data.css ?? \"\"\n        } catch (err) {\n          return message = Blockbench.showMessageBox({\n            title: \"Invalid JSON\",\n            message: `Invalid JSON in theme <code>${PathModule.basename(watching)}</code>:\\n<code>${err.message}</code>\\n\\nTheme location: <code>${watching}</code>`,\n            buttons: [\"Stop Watching\", \"dialog.close\"]\n          }, button => {\n            if (button === 0) unwatch(\"force\")\n          })\n        }\n      }\n      styles = Blockbench.addCSS(css)\n      resizeWindow()\n      console.log(`Theme reloaded: ${name ?? PathModule.basename(watching).split(\".\").slice(0, -1).join(\".\")}`)\n    }\n  }\n}"
  },
  {
    "path": "plugins/mc_text_generator.js",
    "content": "(async function() {\n\n    // Global variables\n    let aboutAction\n    let textLength, textGroup, randNum, letterGroup, yOffset, numLines\n\n    // Plugin information variables\n    const id = \"mc_text_generator\"\n    const name = \"Text Generator\"\n    const icon = \"text_format\"\n    const author = \"SirJain\"\n\n    // Links used in about dialog\n    const links = {\n        twitter: \"https://twitter.com/SirJain2\",\n        discord: \"https://discord.gg/wM4CKTbFVN\",\n        website: \"https://sirjain0.github.io/\"\n    }\n\n    // Register the plugin\n    Plugin.register(id, {\n        title: name,\n        icon,\n        author,\n        description: \"Generates blocky text in cubes.\",\n        about: \"This plugin adds a button under the `Tools` menu that allows you to generate Minecraft-like text.\\n## How to use\\nTo use this plugin, go to `Tools > Generate Text`. Simply enter some text, configure your settings how you like, and press `Generate`!\\n\\nPlease report any bugs or suggestions you may have.\",\n        tags: [\"Deprecated\", \"Minecraft\", \"Font\"],\n        version: \"2.0.1\",\n        min_version: \"4.2.0\",\n        variant: \"both\",\n\n        oninstall: () => showAbout(true),\n        onload() {\n            addAboutButton()\n\n            // Define the dialog\n            const generateTextDialog = new Blockbench.Dialog(\"generate_text_dialog\", {\n                name: \"Generate Text\",\n                icon: icon,\n                buttons: [\"Generate\", \"Cancel\"],\n                lines: [`\n                    <style>\n                        input#input {\n                            text-transform: uppercase;\n                        }\n                    </style>\n                `],\n                form: {\n                    input: {\n                        label: \"Enter Text\",\n                        type: \"text\",\n                        full_width: true,\n                        value: \"\",\n                        description: \"The text that will be converted into 3D geometry.\"\n                    },\n                    divider: \"_\",\n                    letterSpace: {\n                        label: \"Letter Spacing\",\n                        type: \"number\",\n                        min: 0,\n                        value: 0.3,\n                        description: \"The amount of space between each letter.\"\n                    },\n                    wordSpace: {\n                        label: \"Word Spacing\",\n                        type: \"number\",\n                        value: 1,\n                        min: 0,\n                        description: \"The amount of space between words.\"\n                    },\n                    depth: {\n                        label: \"Depth\",\n                        type: \"number\",\n                        min: 0,\n                        value: 4,\n                        description: \"The thickness of the letters. If 0, the letters will appear flat.\"\n                    },\n                    rotation: {\n                        label: \"Rotation\",\n                        type: \"range\",\n                        min: -45,\n                        value: 0,\n                        max: 45,\n                        step: 22.5,\n                        description: \"The rotation of the text.\"\n                    },\n                    generateLayer: {\n                        label: \"Generate Layer\",\n                        type: \"checkbox\",\n                        value: false,\n                        condition: formData => formData.depth === 0,\n                        description: \"Generates a second layer to the text which can be used for stuff like dropshadows.\"\n                    },\n                    checkboxSpacer: \"_\",\n                    javaCheckbox: {\n                        label: \"Show Java Block/Item Warnings\",\n                        type: \"checkbox\",\n                        value: true,\n                        description: \"If enabled, Blockbench will show an error box if text exceeds the 48x48x48 pixel limit in the Java Block/Item format. It is highly recommended to leave this on.\"\n                    },\n                    bedrockCheckbox: {\n                        label: \"Show Bedrock Block Warnings\",\n                        type: \"checkbox\",\n                        value: true,\n                        description: \"If enabled, Blockbench will show an error box if text exceeds the 30x30x30 pixel limit in the Bedrock Block format. It is highly recommended to leave this on.\"\n                    }\n                },\n    \n                onConfirm(formData) {\n\n                    // Check - Did the user leave fields blank?\n                    if (formData.input == \"\") {\n                        Blockbench.showMessageBox({\n                            title: \"No valid text\",\n                            message: \"Make sure you don't leave the text field blank.\"\n                        })\n\n                        generateTextDialog.hide()\n                    }\n\n                    // Run if everything is okay\n                    else {\n                        generateTextDialog.hide()\n                        \n                        // Character maps - each array in the 'cubes' component represents a cube.\n                        const charMap = {\n                            a: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth]\n                                ]\n                            },\n                            b: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [2, 0, 0, 3, 2, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth],\n                                    [3, 3.5, 0, 4, 4.5, formData.depth],\n                                    [3, 0, 0, 5, 3.5, formData.depth],\n                                    [3, 4.5, 0, 5, 8, formData.depth],\n                                ]\n                            },\n                            c: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 5, 8, formData.depth],\n                                    [2, 0, 0, 5, 2, formData.depth]\n                                ]\n                            },\n                            d: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 0, 0, 4, 2, formData.depth],\n                                    [2, 6, 0, 4, 8, formData.depth],\n                                    [3, 2, 0, 4, 6, formData.depth],\n                                    [4, 1, 0, 5, 7, formData.depth],\n                                ]\n                            },\n                            e: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 5, 8, formData.depth],\n                                    [2, 3, 0, 4, 5, formData.depth],\n                                    [2, 0, 0, 5, 2, formData.depth]\n                                ]\n                            },\n                            f: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 5, 8, formData.depth],\n                                    [2, 3, 0, 4, 5, formData.depth]\n                                ]\n                            },\n                            g: {\n                                width: 5,\n                                cubes: [\n                                    [0, 2, 0, 2, 8, formData.depth],\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [3, 2, 0, 5, 4, formData.depth],\n                                    [2, 6, 0, 5, 8, formData.depth],\n                                ]\n                            },\n                            h: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth]\n                                ]\n                            },\n                            i: {\n                                width: 2,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth]\n                                ]\n                            },\n                            j: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [3, 2, 0, 5, 8, formData.depth],\n                                    [1, 6, 0, 3, 8, formData.depth]\n                                ]\n                            },\n                            k: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 2.5, 0, 3, 5.5, formData.depth],\n                                    [3, 0, 0, 4, 8, formData.depth],\n                                    [4, 5, 0, 5, 8, formData.depth],\n                                    [4, 0, 0, 5, 3, formData.depth],\n                                ]\n                            },\n                            l: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 0, 0, 5, 2, formData.depth]\n                                ]\n                            },\n                            m: {\n                                width: 7,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 3, 0, 3, 7, formData.depth],\n                                    [3, 2, 0, 4, 6, formData.depth],\n                                    [4, 3, 0, 5, 7, formData.depth],\n                                    [5, 0, 0, 7, 8, formData.depth],\n                                ]\n                            },\n                            n: {\n                                width: 6,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [4, 0, 0, 6, 8, formData.depth],\n                                    [2, 3, 0, 3, 6, formData.depth],\n                                    [3, 2, 0, 4, 5, formData.depth],\n                                ]\n                            },\n                            o: {\n                                width: 6,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 4, 8, formData.depth],\n                                    [4, 0, 0, 6, 8, formData.depth],\n                                    [2, 0, 0, 4, 2, formData.depth]\n                                ]\n                            },\n                            p: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [3, 3, 0, 5, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth]\n                                ]\n                            },\n                            q: {\n                                width: 5.5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                    [2, 0, 0, 3, 2, formData.depth],\n                                    [3.5, -0.5, 0, 5.5, 3.5, formData.depth]\n                                ]\n                            },\n                            r: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth],\n                                    [3, 4, 0, 5, 8, formData.depth],\n                                    [3, 0, 0, 5, 3, formData.depth],\n                                    [3, 3, 0, 4, 4, formData.depth],\n                                ]\n                            },\n                            s: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 3, 0, 5, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [3, 2, 0, 5, 3, formData.depth],\n                                    [0, 5, 0, 2, 6, formData.depth],\n                                ]\n                            },\n                            \"$\": {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 3, 0, 5, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [1.5, 8, 0, 3.5, 9, formData.depth],\n                                    [1.5, -1, 0, 3.5, 0, formData.depth],\n                                    [3, 2, 0, 5, 3, formData.depth],\n                                    [0, 5, 0, 2, 6, formData.depth],\n                                ]\n                            },\n                            t: {\n                                width: 5,\n                                cubes: [\n                                    [1.5, 0, 0, 3.5, 6, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                ]\n                            },\n                            u: {\n                                width: 6,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [4, 0, 0, 6, 8, formData.depth],\n                                    [2, 0, 0, 4, 2, formData.depth]\n                                ]\n                            },\n                            v: {\n                                width: 5.75,\n                                cubes: [\n                                    [0, 4, 0, 2, 8, formData.depth],\n                                    [3.75, 4, 0, 5.75, 8, formData.depth],\n                                    [0.75, 2, 0, 5, 4, formData.depth],\n                                    [1.75, 0, 0, 3.75, 2, formData.depth],\n                                ]\n                            },\n                            w: {\n                                width: 6.5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [4.5, 0, 0, 6.5, 8, formData.depth],\n                                    [2, 1, 0, 2.5, 4, formData.depth],\n                                    [4, 1, 0, 4.5, 4, formData.depth],\n                                    [2.5, 2, 0, 4, 6, formData.depth],\n                                ]\n                            },\n                            x: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 2.75, formData.depth],\n                                    [0, 5.25, 0, 2, 8, formData.depth],\n                                    [3, 5.25, 0, 5, 8, formData.depth],\n                                    [3, 0, 0, 5, 2.75, formData.depth],\n                                    [1.25, 2.25, 0, 3.75, 5.75, formData.depth],\n                                ]\n                            },\n                            y: {\n                                width: 5,\n                                cubes: [\n                                    [0, 4, 0, 2, 8, formData.depth],\n                                    [3, 4, 0, 5, 8, formData.depth],\n                                    [1.25, 0, 0, 3.75, 5, formData.depth],\n                                ]\n                            },\n                            z: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [0, 2, 0, 2, 3, formData.depth],\n                                    [1, 3, 0, 3, 4, formData.depth],\n                                    [2, 4, 0, 4, 5, formData.depth],\n                                    [3, 5, 0, 5, 6, formData.depth],\n                                ]\n                            },\n                            0: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                    [2, 0, 0, 3, 2, formData.depth]\n                                ]\n                            },\n                            1: {\n                                width: 3,\n                                cubes: [\n                                    [0, 5, 0, 1, 7, formData.depth],\n                                    [1, 0, 0, 3, 8, formData.depth],\n                                ]\n                            },\n                            2: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 3, 0, 5, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [0, 2, 0, 2, 3, formData.depth],\n                                    [3, 5, 0, 5, 6, formData.depth],\n                                ]\n                            },\n                            3: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 3, 0, 5, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [3, 2, 0, 5, 3, formData.depth],\n                                    [3, 5, 0, 5, 6, formData.depth],\n                                ]\n                            },\n                            4: {\n                                width: 5,\n                                cubes: [\n                                    [0, 3, 0, 2, 8, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                ]\n                            },\n                            5: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 4.25, 2, formData.depth],\n                                    [0, 3, 0, 4.25, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [3, 2, 0, 4.25, 3, formData.depth],\n                                    [0, 5, 0, 2, 6, formData.depth],\n                                    [4.25, 0.5, 0, 5, 4.5, formData.depth],\n                                ]\n                            },\n                            6: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 5, 2, formData.depth],\n                                    [0, 3, 0, 5, 5, formData.depth],\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [3, 2, 0, 5, 3, formData.depth],\n                                    [0, 2, 0, 2, 3, formData.depth],\n                                    [0, 5, 0, 2, 6, formData.depth],\n                                ]\n                            },\n                            7: {\n                                width: 5,\n                                cubes: [\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [3, 0, 0, 5, 6, formData.depth],\n                                ]\n                            },\n                            8: {\n                                width: 5,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [3, 0, 0, 5, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [2, 0, 0, 3, 2, formData.depth],\n                                    [2, 3, 0, 3, 5, formData.depth],\n                                ]\n                            },\n                            9: {\n                                width: 5,\n                                cubes: [\n                                    [0, 6, 0, 5, 8, formData.depth],\n                                    [0, 3, 0, 3, 5, formData.depth],\n                                    [0, 0, 0, 3, 2, formData.depth],\n                                    [0, 5, 0, 2, 6, formData.depth],\n                                    [3, 0, 0, 5, 6, formData.depth],\n                                ]\n                            },\n                            \".\": {\n                                width: 3,\n                                cubes: [\n                                    [0, 0, 0, 2, 2, formData.depth]\n                                ]\n                            },\n                            \"!\": {\n                                width: 2,\n                                cubes: [\n                                    [0, 0, 0, 2, 2, formData.depth],\n                                    [0, 4, 0, 2, 8, formData.depth]\n                                ]\n                            },\n                            \"-\": {\n                                width: 4,\n                                cubes: [\n                                    [0, 3, 0, 4, 5, formData.depth]\n                                ]\n                            },\n                            \"+\": {\n                                width: 4,\n                                cubes: [\n                                    [0, 3.25, 0, 4, 4.75, formData.depth],\n                                    [1.25, 2, 0, 2.75, 6, formData.depth]\n                                ]\n                            },\n                            \":\": {\n                                width: 2,\n                                cubes: [\n                                    [0, 0, 0, 2, 2, formData.depth],\n                                    [0, 4, 0, 2, 6, formData.depth]\n                                ]\n                            },\n                            \";\": {\n                                width: 2,\n                                cubes: [\n                                    [0, 4, 0, 2, 6, formData.depth],\n                                    [0, -1, 0, 2, 2, formData.depth]\n                                ]\n                            },\n                            \",\": {\n                                width: 2,\n                                cubes: [\n                                    [0, -1, 0, 2, 2, formData.depth]\n                                ]\n                            },\n                            \"'\": {\n                                width: 2,\n                                cubes: [\n                                    [0, 6, 0, 2, 9, formData.depth]\n                                ]\n                            },\n                            \"?\": {\n                                width: 4,\n                                cubes: [\n                                    [1, 0, 0, 3, 2, formData.depth],\n                                    [1, 3, 0, 3, 5, formData.depth],\n                                    [0, 6, 0, 4, 8, formData.depth],\n                                    [2, 5, 0, 4, 6, formData.depth]\n                                ]\n                            },\n                            \"[\": {\n                                width: 3,\n                                cubes: [\n                                    [0, 0, 0, 2, 8, formData.depth],\n                                    [2, 6, 0, 3, 8, formData.depth],\n                                    [2, 0, 0, 3, 2, formData.depth]\n                                ]\n                            },\n                            \"(\": {\n                                width: 3,\n                                cubes: [\n                                    [0, 1, 0, 2, 7, formData.depth],\n                                    [1, 6, 0, 3, 8, formData.depth],\n                                    [1, 0, 0, 3, 2, formData.depth]\n                                ]\n                            },\n                            \"]\": {\n                                width: 3,\n                                cubes: [\n                                    [1, 0, 0, 3, 8, formData.depth],\n                                    [0, 6, 0, 1, 8, formData.depth],\n                                    [0, 0, 0, 1, 2, formData.depth]\n                                ]\n                            },\n                            \")\": {\n                                width: 3,\n                                cubes: [\n                                    [1, 1, 0, 3, 7, formData.depth],\n                                    [0, 6, 0, 2, 8, formData.depth],\n                                    [0, 0, 0, 2, 2, formData.depth]\n                                ]\n                            },\n                            \"/\": {\n                                width: 6,\n                                cubes: [\n                                    [0, 0, 0, 3, 2, formData.depth],\n                                    [1, 2, 0, 4, 4, formData.depth],\n                                    [2, 4, 0, 5, 6, formData.depth],\n                                    [3, 6, 0, 6, 8, formData.depth],\n                                ]\n                            },\n                            \" \": {\n                                width: formData.wordSpace,\n                                cubes: []\n                            }\n                        }\n                        \n                        let offset = 0\n                        yOffset = 0\n                        let textCube, layerCube\n                        textLength = 0\n                        let invalidCubeCount = 0\n                        numLines = 1\n    \n                        Undo.initEdit({group: textGroup, elements: [], outliner: true})\n                        textGroup = new Group({name: 'text_' + formData.input}).init()\n                        layerBaseGroup = new Group('layer_base')\n\n                        /*\n                        Double for-loop that handles the generation of text.\n                        Outer for loop iterates through each character.\n                        Inner for loop iterates through each cube array in the char map.\n                        */\n\n                        for (const char of formData.input.toLowerCase()) {\n\n                            // Check for an invalid character\n                            if (!charMap.hasOwnProperty(char) && char !== \"\\\\\") {\n                                Blockbench.showQuickMessage(\"Invalid Character(s) Detected\", 1300)\n                                invalidCubeCount++\n                                continue\n                            }\n\n                            if (char === \"\\\\\") {\n                                yOffset += 10\n                                offset = 0\n                                numLines++\n                                continue\n                            }\n\n                            letterGroup = new Group('character_' + char).init()\n                            layerGroup = new Group('layer_character_' + char)\n\n                            randNum = getRandomInt(8)\n\n                            for (const cube of charMap[char].cubes) {\n                                textCube = new Cube({\n                                    name: \"text_\" + formData.input,\n                                    from: [cube[0] + offset, cube[1] - yOffset, cube[2]],\n                                    to: [cube[3] + offset, cube[4] - yOffset, cube[5]],\n                                    rotation: [formData.rotation, 0, 0],\n                                    color: randNum\n                                }).addTo(letterGroup).init()\n\n                                textCube.flip(0, 2.0, true)\n\n                                // Generate layer if user checked the box\n                                if (formData.generateLayer == true && formData.depth == 0) {\n                                    layerGroup.init()\n                                    layerBaseGroup.init()\n\n                                    layerCube = new Cube({\n                                        name: \"text_\" + formData.input + \"_layer\",\n                                        from: [cube[0] + 0.2 + offset, cube[1] - 0.2 - yOffset, cube[2] + 0.2],\n                                        to: [cube[3] + offset + 0.2, cube[4] - 0.2 - yOffset, cube[5] + 0.2],\n                                        rotation: [formData.rotation, 0, 0],\n                                        color: randNum\n                                    }).addTo(layerGroup).init()\n\n                                    layerCube.flip(0, 2.0, true)\n                                    layerGroup.addTo(layerBaseGroup)\n                                    layerBaseGroup.addTo(textGroup)\n                                }\n                            }\n\n                            offset += charMap[char].width + formData.letterSpace\n                            textLength += charMap[char].width + formData.letterSpace\n\n                            letterGroup.addTo(textGroup)\n                        }\n                        \n                        textGroup.openUp().select()\n                        centerText()\n\n                        Canvas.updateView({groups: [textGroup, Group.selected], transform: true});\n                        Undo.finishEdit(\"Generated Text\", {elements: selected, group: textGroup, outliner: true});\n\n                        // Alter quick message based on if there are invalid cubes\n                        if (invalidCubeCount == 0) {\n                            Blockbench.showQuickMessage(\"Generated text: '\" + formData.input + \"'\")\n                        } else {\n                            Blockbench.showQuickMessage(\"Generated text: '\" + formData.input + \"'. Skipped over invalid character(s).\")\n                        }\n                    }\n\n                    // Check for format restrictions\n                    if (\n                        Format?.id === \"java_block\" && \n                        formData.javaCheckbox == true && \n                        (textLength - formData.letterSpace >= 48 || 9*numLines >= 48)\n                    ) showRestrictionWarning(\"`48x48x48`\")\n\n                    else if (\n                        Format?.id === \"bedrock_block\" && \n                        formData.bedrockCheckbox == true && \n                        (textLength - formData.letterSpace >= 30 || 9*numLines >= 30)\n                    ) showRestrictionWarning(\"`30x30x30`\")\n                }\n            })\n\n            const textAction = new Action({\n                id: \"generate_text_action\",\n                name: \"Generate Text\",\n                icon: icon,\n                description: \"Input some text and let Blockbench generate the letters.\",\n                condition: () => Format?.id !== \"image\" && Format?.id !== \"skin\",\n                click: () => generateTextDialog.show()\n            })\n\n            MenuBar.addAction(textAction, \"tools\")\n        },\n        onunload() {\n            Blockbench.showQuickMessage(\"Uninstalled \" + name, 2000)\n            aboutAction.delete()\n            MenuBar.removeAction(`help.about_plugins.about_${id}`)\n            MenuBar.removeAction(\"tools.generate_text_action\")\n        }\n    })\n\n    // Generate random int (called for marker colors)\n    function getRandomInt(max) {\n        return Math.floor(Math.random() * max);\n    }\n\n    // Center selected elements on all axes\n    function centerText() {\n        centerElements(0)\n        centerElements(1)\n        centerElements(2)\n    }\n\n    // Add about button\n    function addAboutButton() {\n        let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\n\n        if (!about) {\n            about = new Action(\"about_plugins\", {\n                name: \"About Plugins...\",\n                icon: \"info\",\n                children: []\n            })\n\n            MenuBar.addAction(about, \"help\")\n        }\n\n        aboutAction = new Action(`about_${id}`, {\n            name: `About ${name}...`,\n            icon,\n            click: () => showAbout()\n        })\n\n        about.children.push(aboutAction)\n    }\n\n    // Show a message box if the format has size restrictions\n    function showRestrictionWarning(units) {\n        Blockbench.showMessageBox({\n            title: \"Format restrictions\",\n            message: \"The format you are in restricts all models to \" + units + \" units. Your text exceeds that limit. Please make your text smaller using `Transform -> Scale`, otherwise it will break in-game.<br><br>Your text has still been generated.\"\n        })\n    }\n\n    // Show about dialog\n    function showAbout(banner) {\n        const infoBox = new Dialog({\n            id: \"about\",\n            title: name,\n            width: 780,\n            buttons: [],\n            lines: [`\n                <li></li>\n                <style>\n                    dialog#about .dialog_title {\n                        padding-left: 0;\n                        display: flex;\n                        align-items: center;\n                        gap: 10px;\n                    }\n\n                    dialog#about .dialog_content {\n                        text-align: left!important;\n                        margin: 0!important;\n                    }\n\n                    dialog#about .socials {\n                        padding: 0!important;\n                    }\n\n                    dialog#about #banner {\n                        background-color: var(--color-accent);\n                        color: var(--color-accent_text);\n                        width: 100%;\n                        padding: 0 8px\n                    }\n                    \n                    dialog#about #content {\n                        margin: 24px;\n                    }\n                </style>\n                ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\n                <div id=\"content\">\n                    <h1 style=\"margin-top:-10px\">${name}</h1>\n                    <p>Generates blocky text in cubes.</p>\n                    <h4>Worth noting:</h4>\n                    <p>- Some formats may break the look of the text because of size restrictions.</p>\n                    <p>- Text generated by this plugin is NOT from official Minecraft font files, but simply a replica. Fonts may not be completely accurate to the original Minecraft font.</p>\n                    <p>- <b>To make new lines:</b> Type <b>\\\\</b></p>\n                    <h4>How to use:</h4>\n                    <p>To use this plugin, go to <b>Tools > Generate Text</b>. Simply enter some text, configure your settings how you like, and press <b>Generate</b>!</p>\n                    <br>\n                    <div class=\"socials\">\n                        <a href=\"${links[\"website\"]}\" class=\"open-in-browser\">\n                            <i class=\"icon material-icons\" style=\"color:#33E38E\">language</i>\n                            <label>More By SirJain</label>\n                        </a>\n                        <a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#1DA1F2\"></i>\n                            <label>Twitter</label>\n                        </a>\n                        <a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\n                            <label>Discord Server</label>\n                        </a>\n                    </div>\n                </div>\n            `]\n        }).show()\n        $(\"dialog#about .dialog_title\").html(`\n            <i class=\"icon material-icons\">${icon}</i>\n            ${name}\n        `)\n    }\n})()\n"
  },
  {
    "path": "plugins/menu_icon_exporter/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2025 NET\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/menu_icon_exporter/about.md",
    "content": "# Menu Icon Exporter\n\nExport Blockbench models as PNG icons with stable camera framing, live preview, and full manual camera controls.\n\n![Menu Icon Exporter Preview](https://raw.githubusercontent.com/HMC-Studios/Menu-Icon-Exporter/main/images/plugin_example.png)\n\n## Highlights\n\n- Auto-frame model with stable reset behavior\n- Manual camera controls: zoom, rotate X/Y/Z, pan X/Y\n- Size presets: 16, 32, 48, 64, 128, plus custom\n- Background options: transparent, white, black, gray, custom color\n- Export quality options: Standard (4x), High (8x), Ultra (16x)\n- Save mode options for ask-each-time or auto-save folder\n- Workspace-aware auto-save folder defaults when using the Workspaces plugin\n- Workspace rename-safe preferences so renamed workspaces keep the same saved default folder\n- Two view modes: Float (dialog window) and Panel (sidebar)\n\n## Usage\n\n- Float: File -> Export -> Export Menu Icon\n- Panel: File -> Export -> Icon Exporter Panel\n- Switch between Float and Panel using the mode bar at the top of any view\n\n## Notes\n\nPNG output works across Blockbench formats and platforms.\nPlatform-specific size, naming, and folder rules still apply.\nWhen Workspaces is installed, save mode and output folder preferences are remembered per active workspace, including workspace renames.\n\nby NET\n"
  },
  {
    "path": "plugins/menu_icon_exporter/menu_icon_exporter.js",
    "content": "// =========================\n// Plugin state\n// =========================\nlet iconExporterAction;\nlet iconExporterPanel = null;\nlet iconExporterPanelVue = null;\nlet iconExporterPanelRequestedMode = 'panel';\nconst PLUGIN_BROWSER_ICON = 'icon.svg';\nconst ACTION_ICON = 'data:image/png;base64,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';\nlet activeResetButton = null;\nlet cachedToolbarIconDataUrl = null;\nlet toolbarIconDataUrlPromise = null;\nconst WORLD_UP = new THREE.Vector3(0, 1, 0);\nlet dialogCameraRestoreState = null;\nlet dialogDefaultFramedCameraState = null;\nlet isolatedDialogPreview = null;\nconst EXPORT_PREFS_KEY = 'menu_icon_exporter_export_prefs_v2';\nconst DEFAULT_EXPORT_PREFS = Object.freeze({\n    save_mode: 'ask_dialog',\n    output_folder: '',\n    icon_size: '',\n    custom_size: 48,\n    background: 'transparent',\n    custom_color: '#ff0000',\n    quality: 'high'\n});\nlet cachedExportPrefsText = '';\nconst EXPORT_PREFS_LAST_WORKSPACE_KEY = 'menu_icon_exporter_last_workspace_v1';\nconst EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY = 'menu_icon_exporter_workspaces_snapshot_v1';\n\nfunction getWorkspaceState() {\n    if (typeof localStorage === 'undefined') return null;\n    try {\n        let raw = localStorage.getItem('workspaces');\n        if (!raw) return [];\n        let parsed = JSON.parse(raw);\n        if (!Array.isArray(parsed)) return [];\n        return parsed\n            .map((workspace, index) => {\n                let name = workspace && typeof workspace.name === 'string' ? workspace.name.trim() : '';\n                let projects = workspace && Array.isArray(workspace.projects) ? workspace.projects : [];\n                let projectSignature = '[]';\n                try {\n                    projectSignature = JSON.stringify(projects);\n                } catch (error) {\n                    projectSignature = '[]';\n                }\n                return {\n                    name: name,\n                    active: workspace && workspace.active === true,\n                    index: index,\n                    projectSignature: projectSignature\n                };\n            })\n            .filter(workspace => !!workspace.name);\n    } catch (error) {\n        return [];\n    }\n}\n\nfunction getActiveWorkspaceName(workspaceState = null) {\n    let state = Array.isArray(workspaceState) ? workspaceState : getWorkspaceState();\n    if (!Array.isArray(state) || !state.length) return null;\n    let activeWorkspace = state.find(workspace => workspace.active === true);\n    if (!activeWorkspace) return null;\n    if (activeWorkspace.name === 'Default') return null;\n    return activeWorkspace.name;\n}\n\nfunction loadWorkspaceSnapshot() {\n    if (typeof localStorage === 'undefined') return [];\n    try {\n        let raw = localStorage.getItem(EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY);\n        if (!raw) return [];\n        let parsed = JSON.parse(raw);\n        if (!Array.isArray(parsed)) return [];\n        return parsed\n            .filter(workspace => workspace && typeof workspace.name === 'string' && typeof workspace.index === 'number')\n            .map(workspace => ({\n                name: workspace.name,\n                index: workspace.index,\n                projectSignature: typeof workspace.projectSignature === 'string' ? workspace.projectSignature : '[]'\n            }));\n    } catch (error) {\n        return [];\n    }\n}\n\nfunction saveWorkspaceSnapshot(workspaceState = []) {\n    if (typeof localStorage === 'undefined') return;\n    try {\n        let snapshot = workspaceState.map(workspace => ({\n            name: workspace.name,\n            index: workspace.index,\n            projectSignature: workspace.projectSignature\n        }));\n        localStorage.setItem(EXPORT_PREFS_WORKSPACES_SNAPSHOT_KEY, JSON.stringify(snapshot));\n    } catch (error) {\n    }\n}\n\nfunction migrateWorkspacePrefsOnRename(workspaceState = []) {\n    if (typeof localStorage === 'undefined') return;\n    if (!Array.isArray(workspaceState) || !workspaceState.length) return;\n\n    let previousState = loadWorkspaceSnapshot();\n    if (!previousState.length) return;\n\n    let currentNames = new Set(workspaceState.map(workspace => workspace.name));\n    let previousNames = new Set(previousState.map(workspace => workspace.name));\n\n    let removed = previousState.filter(workspace => workspace.name !== 'Default' && !currentNames.has(workspace.name));\n    let added = workspaceState.filter(workspace => workspace.name !== 'Default' && !previousNames.has(workspace.name));\n\n    if (removed.length !== 1 || added.length !== 1) return;\n\n    let previousWorkspace = removed[0];\n    let currentWorkspace = added[0];\n\n    if (previousWorkspace.index !== currentWorkspace.index) return;\n    if (previousWorkspace.projectSignature !== currentWorkspace.projectSignature) return;\n\n    let previousKey = `${EXPORT_PREFS_KEY}::${previousWorkspace.name}`;\n    let currentKey = `${EXPORT_PREFS_KEY}::${currentWorkspace.name}`;\n    if (localStorage.getItem(currentKey) !== null) return;\n\n    let previousValue = localStorage.getItem(previousKey);\n    if (typeof previousValue === 'string') {\n        localStorage.setItem(currentKey, previousValue);\n    }\n}\n\nfunction getExportPrefsKey() {\n    let workspaceState = getWorkspaceState();\n    let workspaceName = getActiveWorkspaceName(workspaceState);\n\n    if (typeof localStorage !== 'undefined') {\n        try {\n            migrateWorkspacePrefsOnRename(workspaceState);\n            let previousActiveWorkspace = localStorage.getItem(EXPORT_PREFS_LAST_WORKSPACE_KEY) || '';\n            if (workspaceName && previousActiveWorkspace && workspaceName !== previousActiveWorkspace) {\n                let previousStillExists = Array.isArray(workspaceState) && workspaceState.some(workspace => workspace.name === previousActiveWorkspace);\n                if (!previousStillExists) {\n                    let previousKey = `${EXPORT_PREFS_KEY}::${previousActiveWorkspace}`;\n                    let currentKey = `${EXPORT_PREFS_KEY}::${workspaceName}`;\n                    if (localStorage.getItem(currentKey) === null) {\n                        let previousValue = localStorage.getItem(previousKey);\n                        if (typeof previousValue === 'string') {\n                            localStorage.setItem(currentKey, previousValue);\n                        }\n                    }\n                }\n            }\n            localStorage.setItem(EXPORT_PREFS_LAST_WORKSPACE_KEY, workspaceName || '');\n            saveWorkspaceSnapshot(Array.isArray(workspaceState) ? workspaceState : []);\n        } catch (error) {\n        }\n    }\n\n    if (!workspaceName) return EXPORT_PREFS_KEY;\n    return `${EXPORT_PREFS_KEY}::${workspaceName}`;\n}\nconst PLUGIN_REPOSITORY = 'https://github.com/HMC-Studios/Menu-Icon-Exporter';\nconst PLUGIN_BUG_TRACKER = 'https://github.com/HMC-Studios/Menu-Icon-Exporter/issues';\nconst PLUGIN_ABOUT = `Export Blockbench models as PNG icons with stable camera framing.\n\n![Menu Icon Exporter Preview](https://raw.githubusercontent.com/HMC-Studios/Menu-Icon-Exporter/main/images/plugin_example.png)\n\n### Highlights\n- Auto-frame model with stable reset behavior\n- Manual camera controls (zoom, pan, rotate X/Y/Z)\n- Live preview while adjusting controls\n- 16/32/48/64/128 presets plus custom size\n- Transparent, solid, or custom background color\n- Export quality multipliers (4x, 8x, 16x)\n- Save mode options (ask each time or auto-save folder)\n- Two view modes: Float (dialog), Panel (sidebar)\n\nPNG output works across Blockbench formats and platforms.\nPlatform-specific size, naming, and folder rules still apply.`;\n\n// =========================\n// Export preferences\n// =========================\nfunction canUseAppFileSystem() {\n    return typeof require === 'function' || typeof requireNativeModule === 'function';\n}\n\nlet _pluginDialog = null;\nfunction _getDialog() {\n    if (_pluginDialog) return _pluginDialog;\n    try { _pluginDialog = require('dialog'); } catch (e) {}\n    return _pluginDialog;\n}\n\nfunction isBlockbench5OrNewer() {\n    return typeof Blockbench !== 'undefined' &&\n        typeof Blockbench.isNewerThan === 'function' &&\n        Blockbench.isNewerThan('4.99');\n}\n\nfunction getNativeModule(moduleName, options = null) {\n    let moduleRef = null;\n\n    if (typeof requireNativeModule === 'function') {\n        try {\n            moduleRef = options ? requireNativeModule(moduleName, options) : requireNativeModule(moduleName);\n        } catch (error) {\n        }\n    }\n\n    if (!moduleRef && typeof require === 'function') {\n        try {\n            moduleRef = require(moduleName);\n        } catch (error) {\n        }\n    }\n\n    return moduleRef;\n}\n\nfunction normalizeExportPrefs(source = {}) {\n    let s = source || {};\n    let saveMode = s.save_mode === 'auto_folder' ? 'auto_folder' : 'ask_dialog';\n    let outputFolder = typeof s.output_folder === 'string' ? s.output_folder.trim() : '';\n    if (!canUseAppFileSystem()) {\n        saveMode = 'ask_dialog';\n        outputFolder = '';\n    }\n    let validSizes = ['16', '32', '48', '64', '128', 'custom'];\n    let iconSize = validSizes.includes(String(s.icon_size)) ? String(s.icon_size) : '';\n    let customSize = (typeof s.custom_size === 'number' && s.custom_size >= 8 && s.custom_size <= 512) ? s.custom_size : 48;\n    let validBgs = ['transparent', 'white', 'black', 'gray', 'custom'];\n    let background = validBgs.includes(s.background) ? s.background : 'transparent';\n    let customColor = (typeof s.custom_color === 'string' && /^#[0-9a-fA-F]{6}$/.test(s.custom_color)) ? s.custom_color : '#ff0000';\n    let validQualities = ['standard', 'high', 'ultra'];\n    let quality = validQualities.includes(s.quality) ? s.quality : 'high';\n    return {\n        save_mode: saveMode,\n        output_folder: outputFolder,\n        icon_size: iconSize,\n        custom_size: customSize,\n        background: background,\n        custom_color: customColor,\n        quality: quality\n    };\n}\n\nfunction loadExportPrefs() {\n    try {\n        let prefsKey = getExportPrefsKey();\n        let raw = localStorage.getItem(prefsKey);\n        let normalized = normalizeExportPrefs(raw ? JSON.parse(raw) : DEFAULT_EXPORT_PREFS);\n        cachedExportPrefsText = JSON.stringify(normalized);\n        return normalized;\n    } catch (error) {\n        let normalized = normalizeExportPrefs(DEFAULT_EXPORT_PREFS);\n        cachedExportPrefsText = JSON.stringify(normalized);\n        return normalized;\n    }\n}\n\nfunction saveExportPrefs(source = {}) {\n    let normalized = normalizeExportPrefs(source);\n    let serialized = JSON.stringify(normalized);\n    if (serialized === cachedExportPrefsText) return;\n    cachedExportPrefsText = serialized;\n    try {\n        let prefsKey = getExportPrefsKey();\n        localStorage.setItem(prefsKey, serialized);\n    } catch (error) {\n    }\n}\n\n// =========================\n// Plugin registration\n// =========================\nPlugin.register('menu_icon_exporter', {\n    title: 'Menu Icon Exporter',\n    author: 'NET',\n    description: 'Export perfect menu/item icons with advanced camera controls',\n    icon: PLUGIN_BROWSER_ICON,\n    about: PLUGIN_ABOUT,\n    repository: PLUGIN_REPOSITORY,\n    bug_tracker: PLUGIN_BUG_TRACKER,\n    version: '1.0.0',\n    min_version: '4.8.0',\n    variant: 'both',\n    tags: ['Minecraft', 'Utility', 'Export'],\n    \n    onload() {\n        this.iconExporterAction = new Action('export_menu_icon', {\n            name: 'Export Menu Icon',\n            description: 'Export model as a menu/item icon with automatic framing',\n            icon: ACTION_ICON,\n            category: 'file',\n            click: openIconExporterDialog\n        });\n\n        this.openPanelAction = new Action('open_icon_exporter_panel', {\n            name: 'Icon Exporter Panel',\n            description: 'Open the icon exporter as a sidebar panel',\n            icon: ACTION_ICON,\n            category: 'file',\n            click: () => switchToPanel()\n        });\n\n        MenuBar.addAction(this.iconExporterAction, 'file.export');\n        MenuBar.addAction(this.openPanelAction, 'file.export');\n\n        applyToolbarActionIcon(this.iconExporterAction);\n    },\n    \n    onunload() {\n        stopCameraWatcher();\n        activeResetButton = null;\n        restoreDialogCameraState();\n        disposeIsolatedDialogPreview();\n        clearDialogCameraState();\n        this.iconExporterAction?.delete();\n        this.openPanelAction?.delete();\n        destroyIconExporterPanel();\n    }\n});\n\n// =========================\n// Panel helpers\n// =========================\nfunction getIconExporterPanel() {\n    if (iconExporterPanel) return iconExporterPanel;\n    if (Interface && Interface.Panels && Interface.Panels.menu_icon_exporter_panel) {\n        return Interface.Panels.menu_icon_exporter_panel;\n    }\n    return null;\n}\n\nfunction panelIsFloating(panel) {\n    if (!panel) return false;\n    try {\n        if (typeof panel.isInSidebar === 'function') return !panel.isInSidebar();\n    } catch (e) {}\n    try {\n        if (panel.position_data && panel.position_data.slot) {\n            return String(panel.position_data.slot).toLowerCase().includes('float');\n        }\n    } catch (e) {}\n    return false;\n}\n\nfunction refreshPanelLayout() {\n    try {\n        if (typeof Interface.updateSidebars === 'function') {\n            Interface.updateSidebars();\n        } else if (typeof updateInterfacePanels === 'function') {\n            updateInterfacePanels();\n        }\n    } catch (e) {}\n    applyResponsivePanelFill();\n    setTimeout(applyResponsivePanelFill, 0);\n}\n\nlet miePanelResizeObserver = null;\nlet miePanelObservedNode = null;\nlet isApplyingMiePanelFill = false;\n\nfunction disconnectMiePanelResizeObserver() {\n    if (miePanelResizeObserver) {\n        try { miePanelResizeObserver.disconnect(); } catch (e) {}\n    }\n    miePanelResizeObserver = null;\n    miePanelObservedNode = null;\n}\n\nfunction ensureMiePanelResizeObserver(panel) {\n    if (typeof ResizeObserver !== 'function' || !panel || !panel.node) return;\n    if (miePanelObservedNode === panel.node && miePanelResizeObserver) return;\n    disconnectMiePanelResizeObserver();\n    try {\n        miePanelObservedNode = panel.node;\n        miePanelResizeObserver = new ResizeObserver(() => {\n            if (typeof requestAnimationFrame === 'function') {\n                requestAnimationFrame(applyResponsivePanelFill);\n            } else {\n                applyResponsivePanelFill();\n            }\n        });\n        miePanelResizeObserver.observe(panel.node);\n    } catch (e) {}\n}\n\nfunction applyResponsivePanelFill() {\n    if (isApplyingMiePanelFill) return;\n    isApplyingMiePanelFill = true;\n    let panel = getIconExporterPanel();\n    if (!panel) { isApplyingMiePanelFill = false; return; }\n\n    try {\n        ensureMiePanelResizeObserver(panel);\n\n        let panelNode = panel.node;\n        if (!panelNode) return;\n\n        let bodyNode = panelNode.querySelector('.mie_panel_body');\n        if (!bodyNode) return;\n\n        let panelRect = panelNode.getBoundingClientRect();\n        let bodyRect = bodyNode.getBoundingClientRect();\n        if (!panelRect || !bodyRect) return;\n\n        let topOffset = Math.max(0, bodyRect.top - panelRect.top);\n        let availableHeight = Math.floor(panelRect.height - topOffset - 2);\n\n        if (Number.isFinite(availableHeight) && availableHeight > 80) {\n            bodyNode.style.height = availableHeight + 'px';\n            bodyNode.style.maxHeight = availableHeight + 'px';\n            bodyNode.style.overflowY = 'auto';\n            bodyNode.style.overflowX = 'hidden';\n        }\n    } catch (e) {\n    } finally {\n        isApplyingMiePanelFill = false;\n    }\n}\n\nfunction movePanelToSlot(targetSlot) {\n    let panel = getIconExporterPanel();\n    if (!panel) return false;\n\n    let slotNames = [targetSlot];\n    if (targetSlot === 'right_bar') slotNames.push('right');\n    if (targetSlot === 'left_bar') slotNames.push('left');\n    if (targetSlot === 'float') slotNames.push('floating');\n\n    let done = false;\n\n    for (let slot of slotNames) {\n        if (done) break;\n        try {\n            if (typeof panel.moveTo === 'function') {\n                panel.moveTo(slot);\n                done = true;\n            }\n        } catch (e) {}\n    }\n\n    if (!done) {\n        for (let slot of slotNames) {\n            if (done) break;\n            try {\n                if (typeof panel.customizePosition === 'function') {\n                    let opts = { slot: slot, folded: false };\n                    if (slot === 'float' || slot === 'floating') {\n                        opts.float_position = [120, 80];\n                        opts.float_size = [400, 700];\n                    }\n                    panel.customizePosition(opts);\n                    done = true;\n                }\n            } catch (e) {}\n        }\n    }\n\n    try { if (typeof panel.setupFloatHandles === 'function') panel.setupFloatHandles(); } catch (e) {}\n    try {\n        if (typeof panel.updateSlot === 'function') panel.updateSlot();\n        if (typeof panel.update === 'function') panel.update();\n    } catch (e) {}\n    try {\n        if (typeof panel.show === 'function') panel.show();\n        if (typeof panel.select === 'function') panel.select();\n        else if (typeof panel.selectTab === 'function') panel.selectTab(panel);\n    } catch (e) {}\n    refreshPanelLayout();\n    return done;\n}\n\nfunction destroyIconExporterPanel() {\n    disconnectMiePanelResizeObserver();\n    if (iconExporterPanelVue) {\n        iconExporterPanelVue = null;\n    }\n    let panel = getIconExporterPanel();\n    if (panel) {\n        try { if (typeof panel.delete === 'function') panel.delete(); } catch (e) {}\n    }\n    iconExporterPanel = null;\n}\n\nfunction collectCurrentFormState() {\n    let prefs = loadExportPrefs();\n    return {\n        auto_frame: true,\n        zoom_level: 1.0,\n        rotate_x: 0, rotate_y: 0, rotate_z: 0,\n        pan_x: 0, pan_y: 0,\n        icon_size: prefs.icon_size || getRecommendedSize(),\n        custom_size: prefs.custom_size,\n        background: prefs.background,\n        custom_color: prefs.custom_color,\n        quality: prefs.quality,\n        save_mode: prefs.save_mode,\n        output_folder: prefs.output_folder,\n        filename: getDefaultFilename()\n    };\n}\n\nfunction getDefaultFilename() {\n    if (!Project || !Project.name) return 'icon';\n    let name = Project.name;\n    name = name.replace(/\\.geo\\.json$/i, '').replace(/\\.geo$/i, '');\n    name = name.replace(/\\.[^.]+$/, '');\n    name = name.replace(/[^a-zA-Z0-9_-]/g, '_');\n    return name + '_icon';\n}\n\nfunction switchToFloat() {\n    destroyIconExporterPanel();\n    openIconExporterDialog();\n}\n\nfunction switchToPanel() {\n    createIconExporterPanel('panel');\n}\n\nfunction getSlotForMode(mode) {\n    return 'right_bar';\n}\n\nfunction createIconExporterPanel(mode) {\n    iconExporterPanelRequestedMode = mode;\n    let targetSlot = getSlotForMode(mode);\n\n    if (iconExporterPanel) {\n        let panel = getIconExporterPanel();\n        if (panel) {\n            movePanelToSlot(targetSlot);\n            if (iconExporterPanelVue) {\n                iconExporterPanelVue.currentMode = mode;\n            }\n            return;\n        }\n    }\n\n    let panelStyle = document.getElementById('menu_icon_exporter_panel_style');\n    if (panelStyle) panelStyle.remove();\n    panelStyle = document.createElement('style');\n    panelStyle.id = 'menu_icon_exporter_panel_style';\n    panelStyle.textContent = `\n        .mie_panel_body { padding: 4px 6px; font-size: 12px; width: 100%; box-sizing: border-box; overflow-y: auto !important; overflow-x: hidden !important; }\n        .mie_section_header { display: flex; align-items: center; justify-content: space-between; padding: 6px 8px; cursor: pointer; background: rgba(255,255,255,0.03); user-select: none; border: 1px solid rgba(255,255,255,0.08); border-radius: 6px; margin-bottom: 2px; }\n        .mie_section_header:hover { background: rgba(255,255,255,0.06); }\n        .mie_section_header h4 { margin: 0; font-size: 12px; font-weight: 600; }\n        .mie_section_body { padding: 4px 6px 6px; width: 100%; box-sizing: border-box; }\n        .mie_row { display: flex; align-items: center; min-height: 28px; margin-bottom: 4px; gap: 6px; width: 100%; box-sizing: border-box; }\n        .mie_row label { flex: 0 0 auto; min-width: 55px; font-size: 11px; color: var(--color-subtle_text); white-space: nowrap; line-height: 28px; }\n        .mie_row select, .mie_row input[type=\"text\"], .mie_row input[type=\"number\"] { flex: 1 1 0; min-width: 0; width: 0; background: var(--color-back); border: 1px solid var(--color-border); color: var(--color-text); padding: 5px 6px; border-radius: 5px; font-size: 11px; box-sizing: border-box; height: 28px; }\n        .mie_row input[type=\"checkbox\"] { flex: 0 0 auto; width: 16px; height: 16px; margin: 0; }\n        .mie_row input[type=\"range\"] { flex: 1 1 0; min-width: 0; width: 0; height: 18px; }\n        .mie_row .mie_range_val { flex: 0 0 24px; text-align: right; font-size: 11px; font-variant-numeric: tabular-nums; line-height: 28px; }\n        .mie_preview_canvas { display: block; width: 128px; height: 128px; border: 1px solid rgba(255,255,255,0.12); border-radius: 6px; image-rendering: pixelated; margin: 0 auto 4px; box-sizing: border-box; }\n        .mie_btn { display: block; width: 100%; padding: 6px 8px; border: 1px solid rgba(255,255,255,0.14); border-radius: 6px; cursor: pointer; font-size: 11px; font-weight: 600; text-align: center; background: var(--color-button); color: var(--color-text); box-sizing: border-box; margin-bottom: 2px; }\n        .mie_btn:hover { background: var(--color-accent); color: #fff; }\n        .mie_btn_primary { background: linear-gradient(180deg, #4f95f7, #3e7ad6); color: #fff; }\n        .mie_btn_primary:hover { background: linear-gradient(180deg, #5fa3ff, #4a88e8); }\n        .mie_mode_bar { display: flex; gap: 3px; margin-bottom: 4px; width: 100%; box-sizing: border-box; }\n        .mie_mode_btn { flex: 1 1 0; padding: 4px 3px; border: 1px solid rgba(255,255,255,0.1); border-radius: 5px; cursor: pointer; font-size: 10px; font-weight: 600; text-align: center; background: rgba(255,255,255,0.04); color: var(--color-subtle_text); min-width: 0; }\n        .mie_mode_btn:hover { background: rgba(255,255,255,0.08); color: var(--color-text); }\n        .mie_mode_btn.active { background: var(--color-accent); color: #fff; border-color: var(--color-accent); }\n        .mie_arrow { transition: transform 0.15s; font-size: 14px; }\n        .mie_arrow.collapsed { transform: rotate(-90deg); }\n        .mie_folder_row { display: flex; align-items: center; min-height: 28px; gap: 6px; margin-bottom: 4px; width: 100%; box-sizing: border-box; }\n        .mie_folder_row label { flex: 0 0 auto; min-width: 55px; font-size: 11px; color: var(--color-subtle_text); white-space: nowrap; line-height: 28px; }\n        .mie_folder_row input { flex: 1 1 0; min-width: 0; width: 0; background: var(--color-back); border: 1px solid var(--color-border); color: var(--color-text); padding: 5px 6px; border-radius: 5px; font-size: 11px; box-sizing: border-box; height: 28px; }\n        .mie_folder_row i { flex: 0 0 auto; cursor: pointer; font-size: 18px; opacity: 0.7; line-height: 28px; padding: 4px; pointer-events: auto; position: relative; z-index: 2; }\n        .mie_folder_row i:hover { opacity: 1; }\n    `;\n    document.head.appendChild(panelStyle);\n\n    iconExporterPanel = new Panel({\n        id: 'menu_icon_exporter_panel',\n        name: 'Icon Exporter',\n        icon: 'photo_camera',\n        default_side: 'right',\n        expand_button: true,\n        folded: false,\n        resizable: true,\n        growable: true,\n        min_height: 300,\n        onResize() {\n            applyResponsivePanelFill();\n            if (iconExporterPanelVue) {\n                if (typeof iconExporterPanelVue.layoutPanel === 'function') iconExporterPanelVue.layoutPanel();\n                else if (typeof iconExporterPanelVue.refreshPreview === 'function') iconExporterPanelVue.refreshPreview();\n            }\n        },\n        onFold() {\n            applyResponsivePanelFill();\n        },\n        component: {\n            name: 'icon-exporter-panel',\n            template: `\n                <div class=\"mie_panel_body\" style=\"overflow-y:auto !important; overflow-x:hidden !important; width:100%; box-sizing:border-box;\">\n                    <div class=\"mie_mode_bar\">\n                        <div class=\"mie_mode_btn\" @click=\"switchToFloat\" title=\"Floating window\">Float</div>\n                        <div class=\"mie_mode_btn\" :class=\"{ active: currentMode === 'panel' }\" @click=\"switchToPanel\" title=\"Sidebar panel\">Panel</div>\n                    </div>\n\n                    <div class=\"mie_section_header\" @click=\"sections.preview = !sections.preview; $nextTick(() => layoutPanel())\">\n                        <h4>Preview</h4>\n                        <i class=\"material-icons mie_arrow\" :class=\"{ collapsed: !sections.preview }\">expand_more</i>\n                    </div>\n                    <div class=\"mie_section_body\" v-if=\"sections.preview\">\n                        <canvas ref=\"panelPreviewCanvas\" class=\"mie_preview_canvas\" width=\"256\" height=\"256\"></canvas>\n                        <div style=\"text-align:center;font-size:11px;color:var(--color-subtle_text);margin-bottom:4px;\">{{ previewSizeText }}</div>\n                        <button class=\"mie_btn mie_btn_primary\" @click=\"resetCamera\" :disabled=\"!hasManualAdjustments\" :style=\"{ opacity: hasManualAdjustments ? 1 : 0.5 }\">Reset Camera to Auto-Frame</button>\n                    </div>\n\n                    <div class=\"mie_section_header\" @click=\"sections.camera = !sections.camera; $nextTick(() => layoutPanel())\">\n                        <h4>Camera Controls</h4>\n                        <i class=\"material-icons mie_arrow\" :class=\"{ collapsed: !sections.camera }\">expand_more</i>\n                    </div>\n                    <div class=\"mie_section_body\" v-if=\"sections.camera\">\n                        <div class=\"mie_row\"><label>Auto-frame</label><input type=\"checkbox\" v-model=\"auto_frame\" @change=\"onCameraChange\"></div>\n                        <div class=\"mie_row\"><label>Zoom</label><input type=\"range\" min=\"0.5\" max=\"3.0\" step=\"0.1\" v-model.number=\"zoom_level\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ formatVal(zoom_level) }}</span></div>\n                        <div class=\"mie_row\"><label>Rotate X</label><input type=\"range\" min=\"-180\" max=\"180\" step=\"5\" v-model.number=\"rotate_x\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ rotate_x }}</span></div>\n                        <div class=\"mie_row\"><label>Rotate Y</label><input type=\"range\" min=\"-180\" max=\"180\" step=\"5\" v-model.number=\"rotate_y\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ rotate_y }}</span></div>\n                        <div class=\"mie_row\"><label>Rotate Z</label><input type=\"range\" min=\"-180\" max=\"180\" step=\"5\" v-model.number=\"rotate_z\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ rotate_z }}</span></div>\n                        <div class=\"mie_row\"><label>Pan X</label><input type=\"range\" min=\"-50\" max=\"50\" step=\"1\" v-model.number=\"pan_x\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ pan_x }}</span></div>\n                        <div class=\"mie_row\"><label>Pan Y</label><input type=\"range\" min=\"-50\" max=\"50\" step=\"1\" v-model.number=\"pan_y\" @input=\"onCameraChange\"><span class=\"mie_range_val\">{{ pan_y }}</span></div>\n                    </div>\n\n                    <div class=\"mie_section_header\" @click=\"sections.export = !sections.export; $nextTick(() => layoutPanel())\">\n                        <h4>Export Settings</h4>\n                        <i class=\"material-icons mie_arrow\" :class=\"{ collapsed: !sections.export }\">expand_more</i>\n                    </div>\n                    <div class=\"mie_section_body\" v-if=\"sections.export\">\n                        <div class=\"mie_row\"><label>Icon Size</label><select v-model=\"icon_size\" @change=\"onSettingChange\"><option value=\"16\">16×16 - Tiny</option><option value=\"32\">32×32 - Small</option><option value=\"48\">48×48 - Medium</option><option value=\"64\">64×64 - Large</option><option value=\"128\">128×128 - XL</option><option value=\"custom\">Custom...</option></select></div>\n                        <div class=\"mie_row\" v-if=\"icon_size === 'custom'\"><label>Custom Size</label><input type=\"number\" min=\"8\" max=\"512\" v-model.number=\"custom_size\" @input=\"onSettingChange\"></div>\n                        <div class=\"mie_row\"><label>Background</label><select v-model=\"background\" @change=\"onSettingChange\"><option value=\"transparent\">Transparent</option><option value=\"white\">White</option><option value=\"black\">Black</option><option value=\"gray\">Gray</option><option value=\"custom\">Custom Color</option></select></div>\n                        <div class=\"mie_row\" v-if=\"background === 'custom'\"><label>Color</label><input type=\"color\" v-model=\"custom_color\" @input=\"onSettingChange\"></div>\n                        <div class=\"mie_row\"><label>Quality</label><select v-model=\"quality\" @change=\"onSettingChange\"><option value=\"standard\">Standard (4x)</option><option value=\"high\">High (8x)</option><option value=\"ultra\">Ultra (16x)</option></select></div>\n                        <div class=\"mie_row\"><label>Save Mode</label><select v-model=\"save_mode\" @change=\"onSaveModeChange\"><option value=\"ask_dialog\">Ask every export</option><option v-if=\"canAutoSave\" value=\"auto_folder\">Auto-save to folder</option></select></div>\n                        <div class=\"mie_folder_row\" v-if=\"save_mode === 'auto_folder'\"><label>Folder</label><input type=\"text\" :value=\"output_folder\" readonly><i class=\"material-icons\" @click.stop.prevent=\"browseFolder\" title=\"Browse\" role=\"button\">folder</i><i class=\"material-icons\" @click.stop.prevent=\"output_folder = ''\" title=\"Clear\" role=\"button\">clear</i></div>\n                        <div class=\"mie_row\"><label>Filename</label><input type=\"text\" v-model=\"filename\"></div>\n                        <button class=\"mie_btn mie_btn_primary\" @click=\"doExport\" style=\"margin-top:4px;\">Export Icon</button>\n                    </div>\n                </div>\n            `,\n            data() {\n                let state = collectCurrentFormState();\n                return {\n                    sections: { preview: true, camera: true, export: true },\n                    currentMode: iconExporterPanelRequestedMode || 'panel',\n                    auto_frame: state.auto_frame,\n                    zoom_level: state.zoom_level,\n                    rotate_x: state.rotate_x,\n                    rotate_y: state.rotate_y,\n                    rotate_z: state.rotate_z,\n                    pan_x: state.pan_x,\n                    pan_y: state.pan_y,\n                    icon_size: state.icon_size,\n                    custom_size: state.custom_size,\n                    background: state.background,\n                    custom_color: state.custom_color,\n                    quality: state.quality,\n                    save_mode: state.save_mode,\n                    output_folder: state.output_folder,\n                    filename: state.filename,\n                    panelPreviewIsolated: null,\n                    panelBaseCameraPosition: null,\n                    panelBaseCameraTarget: null,\n                    panelBaseCameraUp: null,\n                    panelDefaultFramedState: null\n                };\n            },\n            computed: {\n                previewSizeText() {\n                    let s = this.icon_size === 'custom' ? this.custom_size : parseInt(this.icon_size);\n                    return s + '×' + s + ' pixels';\n                },\n                hasManualAdjustments() {\n                    return this.zoom_level !== 1.0 || this.rotate_x !== 0 || this.rotate_y !== 0 || this.rotate_z !== 0 || this.pan_x !== 0 || this.pan_y !== 0;\n                },\n                canAutoSave() {\n                    return canUseAppFileSystem();\n                }\n            },\n            methods: {\n                formatVal(v) {\n                    let n = Number(v);\n                    if (Math.abs(n - Math.round(n)) < 0.0001) return String(Math.round(n));\n                    return String(Math.round(n * 100) / 100);\n                },\n                switchToFloat() { switchToFloat(); },\n                switchToPanel() {\n                    this.currentMode = 'panel';\n                    movePanelToSlot(getSlotForMode('panel'));\n                },\n                getFormData() {\n                    return {\n                        icon_size: this.icon_size,\n                        custom_size: this.custom_size,\n                        background: this.background,\n                        custom_color: this.custom_color,\n                        auto_frame: this.auto_frame,\n                        zoom_level: this.zoom_level,\n                        rotate_x: this.rotate_x,\n                        rotate_y: this.rotate_y,\n                        rotate_z: this.rotate_z,\n                        pan_x: this.pan_x,\n                        pan_y: this.pan_y,\n                        quality: this.quality,\n                        save_mode: this.save_mode,\n                        output_folder: this.output_folder,\n                        filename: this.filename\n                    };\n                },\n                onCameraChange() {\n                    this.applyCameraFromState();\n                    this.refreshPreview();\n                },\n                onSettingChange() {\n                    saveExportPrefs(this.getFormData());\n                    this.refreshPreview();\n                },\n                onSaveModeChange() {\n                    saveExportPrefs(this.getFormData());\n                },\n                applyCameraFromState() {\n                    let preview = this.panelPreviewIsolated || getSelectedPreview();\n                    if (!preview || !preview.camera) return;\n\n                    if (!this.panelBaseCameraPosition || !this.panelBaseCameraTarget || !this.panelBaseCameraUp) {\n                        this.captureBaseCamera();\n                    }\n\n                    let camera = preview.camera;\n                    let values = {\n                        zoom_level: this.zoom_level,\n                        rotate_x: this.rotate_x,\n                        rotate_y: this.rotate_y,\n                        rotate_z: this.rotate_z,\n                        pan_x: this.pan_x,\n                        pan_y: this.pan_y\n                    };\n\n                    let newTarget = this.panelBaseCameraTarget.clone();\n                    let baseOffset = this.panelBaseCameraPosition.clone().sub(this.panelBaseCameraTarget);\n                    let baseUpNormal = this.panelBaseCameraUp.clone().normalize();\n                    let forward = this.panelBaseCameraTarget.clone().sub(this.panelBaseCameraPosition).normalize();\n                    let right = forward.clone().cross(baseUpNormal);\n                    if (right.lengthSq() === 0) right.set(1, 0, 0); else right.normalize();\n                    newTarget.add(right.multiplyScalar(values.pan_x * 2.0));\n                    newTarget.add(baseUpNormal.clone().multiplyScalar(values.pan_y * 2.0));\n\n                    let rotatedOffset = baseOffset.clone();\n                    let rotY = THREE.MathUtils.degToRad(values.rotate_y);\n                    let rotX = THREE.MathUtils.degToRad(values.rotate_x);\n                    let rotZ = THREE.MathUtils.degToRad(values.rotate_z);\n                    if (rotY !== 0) rotatedOffset.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(baseUpNormal, rotY));\n                    if (rotX !== 0) {\n                        let pitchAxis = baseUpNormal.clone().cross(rotatedOffset).normalize();\n                        if (pitchAxis.lengthSq() > 0) rotatedOffset.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(pitchAxis, rotX));\n                    }\n                    rotatedOffset.multiplyScalar(values.zoom_level);\n\n                    let newPos = newTarget.clone().add(rotatedOffset);\n                    camera.position.copy(newPos);\n                    let upVec = baseUpNormal.clone();\n                    if (rotZ !== 0) {\n                        let fwdAxis = newTarget.clone().sub(newPos).normalize();\n                        if (fwdAxis.lengthSq() > 0) upVec.applyQuaternion(new THREE.Quaternion().setFromAxisAngle(fwdAxis, rotZ));\n                    }\n                    camera.up.copy(upVec);\n                    if (preview.controls && preview.controls.target) preview.controls.target.copy(newTarget);\n                    camera.lookAt(newTarget);\n                    if (camera.updateProjectionMatrix) camera.updateProjectionMatrix();\n                    if (preview.controls && preview.controls.update) preview.controls.update();\n                    if (typeof preview.render === 'function') preview.render();\n                },\n                captureBaseCamera() {\n                    let preview = this.panelPreviewIsolated || getSelectedPreview();\n                    if (!preview || !preview.camera) return;\n                    let camera = preview.camera;\n                    this.panelBaseCameraPosition = camera.position.clone();\n                    this.panelBaseCameraTarget = getCurrentPreviewTarget(camera, preview);\n                    camera.up.copy(WORLD_UP);\n                    if (preview.controls && preview.controls.target) preview.controls.target.copy(this.panelBaseCameraTarget);\n                    camera.lookAt(this.panelBaseCameraTarget);\n                    if (camera.updateProjectionMatrix) camera.updateProjectionMatrix();\n                    if (preview.controls && preview.controls.update) preview.controls.update();\n                    if (typeof preview.render === 'function') preview.render();\n                    this.panelBaseCameraUp = WORLD_UP.clone();\n                },\n                resetCamera() {\n                    this.zoom_level = 1.0;\n                    this.rotate_x = 0;\n                    this.rotate_y = 0;\n                    this.rotate_z = 0;\n                    this.pan_x = 0;\n                    this.pan_y = 0;\n                    this.auto_frame = true;\n                    this.panelBaseCameraPosition = null;\n                    this.panelBaseCameraTarget = null;\n                    this.panelBaseCameraUp = null;\n\n                    let preview = this.panelPreviewIsolated || getSelectedPreview();\n                    let mainPreview = Preview.selected || getSelectedPreview();\n                    if (mainPreview && preview && mainPreview !== preview) {\n                        let freshState = captureCameraState(mainPreview);\n                        if (freshState) applyCameraState(freshState, preview);\n                    }\n                    frameModelForIcon(this.getFormData()).then(() => {\n                        this.panelDefaultFramedState = captureCameraState(preview);\n                        this.captureBaseCamera();\n                        this.refreshPreview();\n                    });\n                },\n                refreshPreview() {\n                    this.$nextTick(() => {\n                        let canvas = this.$refs.panelPreviewCanvas;\n                        if (!canvas) return;\n                        let formData = this.getFormData();\n                        generateLivePreview(canvas, formData, this.panelPreviewIsolated);\n                    });\n                },\n                layoutPanel() {\n                    this.$nextTick(() => {\n                        let canvas = this.$refs.panelPreviewCanvas;\n                        if (!canvas || !this.sections.preview) {\n                            return;\n                        }\n                        let body = this.$el;\n                        if (!body) return;\n                        let bodyHeight = body.clientHeight;\n                        let bodyWidth = body.clientWidth;\n                        if (!bodyHeight || !bodyWidth) return;\n\n                        let otherHeight = 0;\n                        let children = body.children;\n                        for (let i = 0; i < children.length; i++) {\n                            let child = children[i];\n                            if (child === canvas) continue;\n                            if (child.contains && child.contains(canvas)) {\n                                continue;\n                            }\n                            otherHeight += child.offsetHeight + 2;\n                        }\n\n                        let previewTextAndBtn = 0;\n                        let canvasParent = canvas.parentElement;\n                        if (canvasParent) {\n                            let siblings = canvasParent.children;\n                            for (let i = 0; i < siblings.length; i++) {\n                                if (siblings[i] !== canvas) {\n                                    previewTextAndBtn += siblings[i].offsetHeight + 2;\n                                }\n                            }\n                        }\n\n                        let available = bodyHeight - otherHeight - previewTextAndBtn - 16;\n                        let maxByWidth = bodyWidth - 24;\n                        let size = Math.max(64, Math.min(available, maxByWidth, 400));\n                        canvas.style.width = size + 'px';\n                        canvas.style.height = size + 'px';\n                        this.refreshPreview();\n                    });\n                },\n                browseFolder() {\n                    if (!isApp) return;\n                    let dlg = _getDialog();\n                    if (!dlg) return;\n                    let result = dlg.showOpenDialogSync({ properties: ['openDirectory'], title: 'Select Output Folder' });\n                    if (result && result[0]) {\n                        this.output_folder = result[0];\n                        saveExportPrefs(this.getFormData());\n                    }\n                },\n                doExport() {\n                    if (!Format || !Project || !Project.elements || Project.elements.length === 0) {\n                        Blockbench.showMessageBox({ title: 'No Model', message: 'Please load a model first before exporting an icon.', icon: 'warning' });\n                        return;\n                    }\n                    let formData = this.getFormData();\n                    saveExportPrefs(formData);\n                    generateIcon(formData, null, false);\n                },\n                initPreview() {\n                    let mainPreview = Preview.selected;\n                    if (!mainPreview) return;\n\n                    try {\n                        this.panelPreviewIsolated = new Preview({\n                            id: 'menu_icon_exporter_panel_live_' + Date.now(),\n                            antialias: true,\n                            offscreen: true\n                        });\n                    } catch (e) {\n                        this.panelPreviewIsolated = null;\n                        return;\n                    }\n\n                    if (Preview.selected !== mainPreview) {\n                        mainPreview.select();\n                    }\n\n                    if (typeof this.panelPreviewIsolated.resize === 'function') {\n                        this.panelPreviewIsolated.resize(1024, 1024);\n                    } else if (this.panelPreviewIsolated.canvas) {\n                        this.panelPreviewIsolated.canvas.width = 1024;\n                        this.panelPreviewIsolated.canvas.height = 1024;\n                    }\n\n                    if (typeof this.panelPreviewIsolated.setProjectionMode === 'function' && typeof mainPreview.isOrtho === 'boolean') {\n                        this.panelPreviewIsolated.setProjectionMode(mainPreview.isOrtho);\n                    }\n                    if (mainPreview.camera && typeof this.panelPreviewIsolated.setFOV === 'function' && mainPreview.camera.fov) {\n                        this.panelPreviewIsolated.setFOV(mainPreview.camera.fov);\n                    }\n                    if (this.panelPreviewIsolated.camera && this.panelPreviewIsolated.camera.isPerspectiveCamera) {\n                        this.panelPreviewIsolated.camera.aspect = 1;\n                        if (this.panelPreviewIsolated.camera.updateProjectionMatrix) this.panelPreviewIsolated.camera.updateProjectionMatrix();\n                    }\n\n                    let initialState = captureCameraState(mainPreview);\n                    if (initialState) applyCameraState(initialState, this.panelPreviewIsolated);\n                    if (typeof this.panelPreviewIsolated.render === 'function') this.panelPreviewIsolated.render();\n\n                    this.captureBaseCamera();\n                    this.panelDefaultFramedState = captureCameraState(this.panelPreviewIsolated);\n                    this.applyCameraFromState();\n                    this.refreshPreview();\n                },\n                disposePreview() {\n                    if (this.panelPreviewIsolated) {\n                        try { this.panelPreviewIsolated.delete(); } catch (e) {}\n                        this.panelPreviewIsolated = null;\n                    }\n                }\n            },\n            mounted() {\n                iconExporterPanelVue = this;\n                this._mieResizeHandler = () => {\n                    applyResponsivePanelFill();\n                    if (iconExporterPanelVue) iconExporterPanelVue.layoutPanel();\n                };\n                window.addEventListener('resize', this._mieResizeHandler, true);\n                this.$nextTick(() => {\n                    this.initPreview();\n                    applyResponsivePanelFill();\n                    setTimeout(() => { applyResponsivePanelFill(); this.layoutPanel(); }, 50);\n                    setTimeout(() => { applyResponsivePanelFill(); this.layoutPanel(); }, 200);\n                    setTimeout(() => this.layoutPanel(), 500);\n                });\n            },\n            beforeDestroy() {\n                if (this._mieResizeHandler) {\n                    window.removeEventListener('resize', this._mieResizeHandler, true);\n                    this._mieResizeHandler = null;\n                }\n                this.disposePreview();\n                iconExporterPanelVue = null;\n            }\n        }\n    });\n\n    setTimeout(() => {\n        let panel = getIconExporterPanel();\n        if (panel) {\n            if (panel.folded !== undefined) panel.folded = false;\n            movePanelToSlot(targetSlot);\n            applyResponsivePanelFill();\n        }\n    }, 100);\n    setTimeout(() => {\n        movePanelToSlot(targetSlot);\n        applyResponsivePanelFill();\n    }, 300);\n    setTimeout(applyResponsivePanelFill, 500);\n}\n\n// =========================\n// Preview and camera utilities\n// =========================\nfunction getToolbarIconDataUrl() {\n    if (cachedToolbarIconDataUrl) {\n        return cachedToolbarIconDataUrl;\n    }\n\n    if (isBlockbench5OrNewer()) {\n        return null;\n    }\n\n    let iconPath = getPluginRuntimeIconPath();\n    if (!iconPath || typeof iconPath !== 'string' || iconPath.startsWith('http')) {\n        return null;\n    }\n\n    let cleanPath = iconPath.split('?')[0];\n    let fsModule = getNativeModule('fs');\n    if (!fsModule || !fsModule.existsSync(cleanPath)) {\n        return null;\n    }\n\n    let mimeType = cleanPath.toLowerCase().endsWith('.svg') ? 'image/svg+xml' : 'image/png';\n    let encoded = fsModule.readFileSync(cleanPath).toString('base64');\n    cachedToolbarIconDataUrl = `data:${mimeType};base64,${encoded}`;\n    return cachedToolbarIconDataUrl;\n}\n\nfunction readBlobAsDataUrl(blob) {\n    return new Promise((resolve) => {\n        if (typeof FileReader === 'undefined' || !blob) {\n            resolve(null);\n            return;\n        }\n        let reader = new FileReader();\n        reader.onload = function() {\n            resolve(typeof reader.result === 'string' ? reader.result : null);\n        };\n        reader.onerror = function() {\n            resolve(null);\n        };\n        try {\n            reader.readAsDataURL(blob);\n        } catch (error) {\n            resolve(null);\n        }\n    });\n}\n\nfunction getToolbarIconDataUrlAsync() {\n    if (cachedToolbarIconDataUrl) {\n        return Promise.resolve(cachedToolbarIconDataUrl);\n    }\n    if (toolbarIconDataUrlPromise) {\n        return toolbarIconDataUrlPromise;\n    }\n\n    let syncIcon = getToolbarIconDataUrl();\n    if (syncIcon) {\n        return Promise.resolve(syncIcon);\n    }\n\n    let iconPath = getPluginRuntimeIconPath();\n    if (!iconPath || typeof iconPath !== 'string' || !/^https?:\\/\\//i.test(iconPath) || typeof fetch !== 'function') {\n        return Promise.resolve(null);\n    }\n\n    toolbarIconDataUrlPromise = fetch(iconPath, {cache: 'no-store'})\n        .then(response => {\n            if (!response || !response.ok || typeof response.blob !== 'function') {\n                return null;\n            }\n            return response.blob();\n        })\n        .then(blob => readBlobAsDataUrl(blob))\n        .then(dataUrl => {\n            if (typeof dataUrl === 'string' && dataUrl.startsWith('data:image/')) {\n                cachedToolbarIconDataUrl = dataUrl;\n                return dataUrl;\n            }\n            return null;\n        })\n        .catch(() => null)\n        .finally(() => {\n            toolbarIconDataUrlPromise = null;\n        });\n\n    return toolbarIconDataUrlPromise;\n}\n\nfunction applyToolbarActionIcon(action) {\n    if (!action || typeof action.setIcon !== 'function') {\n        return;\n    }\n\n    let syncIcon = getToolbarIconDataUrl();\n    if (syncIcon) {\n        action.setIcon(syncIcon);\n        return;\n    }\n\n    getToolbarIconDataUrlAsync().then(dataUrl => {\n        if (dataUrl) {\n            action.setIcon(dataUrl);\n        }\n    });\n}\n\nfunction getPluginRuntimeIconPath() {\n    if (typeof Plugins === 'undefined' || !Plugins || !Array.isArray(Plugins.all)) {\n        return null;\n    }\n\n    let pluginInstance = Plugins.all.find(plugin => plugin && plugin.id === 'menu_icon_exporter');\n    if (!pluginInstance || typeof pluginInstance.getIcon !== 'function') {\n        return null;\n    }\n\n    let iconPath = pluginInstance.getIcon();\n    if (!iconPath || typeof iconPath !== 'string') {\n        return null;\n    }\n\n    if (!/^https?:\\/\\//i.test(iconPath) && typeof pluginInstance.path === 'string' && /^https?:\\/\\//i.test(pluginInstance.path)) {\n        try {\n            iconPath = new URL(iconPath, pluginInstance.path).toString();\n        } catch (error) {\n        }\n    }\n\n    return iconPath;\n}\n\nfunction getSelectedPreview() {\n    if (typeof Preview === 'undefined') return null;\n    return Preview.selected || null;\n}\n\nfunction getActiveCameraPreview() {\n    return isolatedDialogPreview || getSelectedPreview();\n}\n\nfunction disposeIsolatedDialogPreview() {\n    if (!isolatedDialogPreview) return;\n    try {\n        isolatedDialogPreview.delete();\n    } catch (error) {\n    }\n    isolatedDialogPreview = null;\n}\n\nfunction getCurrentPreviewTarget(camera, previewRef = null) {\n    let preview = previewRef || getSelectedPreview();\n    if (preview && preview.controls && preview.controls.target) {\n        return preview.controls.target.clone();\n    }\n    let direction = new THREE.Vector3(0, 0, -1);\n    if (typeof camera.getWorldDirection === 'function') {\n        camera.getWorldDirection(direction);\n    }\n    return camera.position.clone().add(direction.multiplyScalar(16));\n}\n\nfunction captureCameraState(previewRef = null) {\n    let preview = previewRef || getSelectedPreview();\n    if (!preview || !preview.camera) {\n        return null;\n    }\n    let camera = preview.camera;\n    return {\n        position: camera.position.clone(),\n        target: getCurrentPreviewTarget(camera, preview),\n        up: WORLD_UP.clone()\n    };\n}\n\nfunction cloneCameraState(state) {\n    if (!state) return null;\n    return {\n        position: state.position.clone(),\n        target: state.target.clone(),\n        up: state.up.clone()\n    };\n}\n\nfunction applyCameraState(state, previewRef = null) {\n    let preview = previewRef || getSelectedPreview();\n    if (!state || !preview || !preview.camera) {\n        return;\n    }\n    let camera = preview.camera;\n    camera.position.copy(state.position);\n    camera.up.copy(state.up);\n    if (preview.controls && preview.controls.target) {\n        preview.controls.target.copy(state.target);\n    }\n    camera.lookAt(state.target);\n    if (camera.updateProjectionMatrix) {\n        camera.updateProjectionMatrix();\n    }\n    if (preview.controls && preview.controls.update) {\n        preview.controls.update();\n    }\n    if (typeof preview.render === 'function') {\n        preview.render();\n    }\n}\n\nfunction flattenCameraUp(previewRef = null) {\n    let preview = previewRef || getSelectedPreview();\n    if (!preview || !preview.camera) {\n        return;\n    }\n    let camera = preview.camera;\n    let target = getCurrentPreviewTarget(camera, preview);\n    camera.up.copy(WORLD_UP);\n    if (preview.controls && preview.controls.target) {\n        preview.controls.target.copy(target);\n    }\n    camera.lookAt(target);\n    if (camera.updateProjectionMatrix) {\n        camera.updateProjectionMatrix();\n    }\n    if (preview.controls && preview.controls.update) {\n        preview.controls.update();\n    }\n    if (typeof preview.render === 'function') {\n        preview.render();\n    }\n}\n\nfunction createIsolatedDialogPreview() {\n    disposeIsolatedDialogPreview();\n    let selectedPreview = getSelectedPreview();\n    if (!selectedPreview) return null;\n    try {\n        isolatedDialogPreview = new Preview({\n            id: `menu_icon_exporter_live_${Date.now()}`,\n            antialias: true,\n            offscreen: true\n        });\n    } catch (error) {\n        isolatedDialogPreview = null;\n        return null;\n    }\n\n    if (typeof isolatedDialogPreview.resize === 'function') {\n        isolatedDialogPreview.resize(1024, 1024);\n    } else if (isolatedDialogPreview.canvas) {\n        isolatedDialogPreview.canvas.width = 1024;\n        isolatedDialogPreview.canvas.height = 1024;\n    }\n\n    if (typeof isolatedDialogPreview.setProjectionMode === 'function' && typeof selectedPreview.isOrtho === 'boolean') {\n        isolatedDialogPreview.setProjectionMode(selectedPreview.isOrtho);\n    }\n\n    if (selectedPreview.camera && typeof isolatedDialogPreview.setFOV === 'function' && selectedPreview.camera.fov) {\n        isolatedDialogPreview.setFOV(selectedPreview.camera.fov);\n    }\n\n    if (isolatedDialogPreview.camera && isolatedDialogPreview.camera.isPerspectiveCamera) {\n        isolatedDialogPreview.camera.aspect = 1;\n        if (isolatedDialogPreview.camera.updateProjectionMatrix) {\n            isolatedDialogPreview.camera.updateProjectionMatrix();\n        }\n    }\n\n    let initialState = captureCameraState(selectedPreview);\n    if (initialState) {\n        applyCameraState(initialState, isolatedDialogPreview);\n    }\n    if (typeof isolatedDialogPreview.render === 'function') {\n        isolatedDialogPreview.render();\n    }\n    return isolatedDialogPreview;\n}\n\nfunction clearDialogCameraState() {\n    dialogCameraRestoreState = null;\n    dialogDefaultFramedCameraState = null;\n}\n\nfunction restoreDialogCameraState() {\n    if (!dialogCameraRestoreState) return;\n    applyCameraState(dialogCameraRestoreState);\n    dialogCameraRestoreState = null;\n}\n\n// =========================\n// Dialog geometry helpers\n// =========================\nfunction clampNumber(value, min, max) {\n    return Math.min(Math.max(value, min), max);\n}\n\nfunction getDialogElement(dialog) {\n    if (!dialog) return null;\n    return dialog.object || null;\n}\n\nfunction getDialogReferenceBox(dialogEl) {\n    if (!dialogEl) return null;\n    return dialogEl.querySelector('.dialog_content') || dialogEl;\n}\n\nfunction getElementRectSafe(element) {\n    if (!element || !element.isConnected) return null;\n    return element.getBoundingClientRect();\n}\n\nfunction getNumericStyleValue(element, propertyName) {\n    if (!element) return 0;\n    let computed = window.getComputedStyle(element);\n    let value = parseFloat(computed.getPropertyValue(propertyName));\n    return Number.isFinite(value) ? value : 0;\n}\n\nfunction getDialogViewportBox(dialogEl) {\n    if (!dialogEl) return null;\n\n    let content = dialogEl.querySelector('.dialog_content') || dialogEl;\n    let rect = getElementRectSafe(content);\n    if (!rect) return null;\n\n    let paddingTop = getNumericStyleValue(content, 'padding-top');\n    let paddingRight = getNumericStyleValue(content, 'padding-right');\n    let paddingBottom = getNumericStyleValue(content, 'padding-bottom');\n    let paddingLeft = getNumericStyleValue(content, 'padding-left');\n\n    return {\n        element: content,\n        rect,\n        innerTop: rect.top + paddingTop,\n        innerRight: rect.right - paddingRight,\n        innerBottom: rect.bottom - paddingBottom,\n        innerLeft: rect.left + paddingLeft,\n        innerWidth: Math.max(0, rect.width - paddingLeft - paddingRight),\n        innerHeight: Math.max(0, rect.height - paddingTop - paddingBottom)\n    };\n}\n\n\n// =========================\n// Dialog normalization\n// =========================\nfunction normalizeDialogInnerWidth(dialog, selector, options = {}) {\n    let dialogEl = getDialogElement(dialog);\n    if (!dialogEl) return;\n\n    let target = dialogEl.querySelector(selector);\n    if (!target) return;\n\n    let {\n        minWidth = 200,\n        maxPasses = 4,\n        tolerance = 1,\n        mode = 'balance',\n        debug = false\n    } = options;\n\n    let pass = 0;\n\n    function log(...args) {\n        if (debug) {\n            console.log('[normalizeDialogInnerWidth]', ...args);\n        }\n    }\n\n    function measureAndApply() {\n        let refBox = getDialogReferenceBox(dialogEl);\n        if (!refBox || !target.isConnected) return;\n\n        let refRect = refBox.getBoundingClientRect();\n        let targetRect = target.getBoundingClientRect();\n\n        let leftGap = targetRect.left - refRect.left;\n        let rightGap = refRect.right - targetRect.right;\n\n        log('pass', pass + 1, {\n            leftGap,\n            rightGap,\n            targetWidth: targetRect.width,\n            refWidth: refRect.width\n        });\n\n        let shrinkAmount = 0;\n\n        if (mode === 'balance') {\n            shrinkAmount = leftGap - rightGap;\n        } else if (mode === 'contain') {\n            if (targetRect.right > refRect.right) {\n                shrinkAmount = targetRect.right - refRect.right;\n            }\n        } else if (typeof mode === 'function') {\n            shrinkAmount = Number(mode({\n                dialog,\n                dialogEl,\n                target,\n                refRect,\n                targetRect,\n                leftGap,\n                rightGap\n            })) || 0;\n        }\n\n        if (shrinkAmount > tolerance) {\n            let newWidth = clampNumber(targetRect.width - shrinkAmount, minWidth, refRect.width);\n            target.style.setProperty('width', `${newWidth}px`, 'important');\n            target.style.setProperty('max-width', `${newWidth}px`, 'important');\n            log('applied width', newWidth);\n\n            pass++;\n            if (pass < maxPasses) {\n                requestAnimationFrame(measureAndApply);\n            }\n        } else {\n            log('no adjustment needed');\n        }\n    }\n\n    requestAnimationFrame(measureAndApply);\n}\n\nfunction clearNormalizedDialogInnerWidth(dialog, selector) {\n    let dialogEl = getDialogElement(dialog);\n    if (!dialogEl) return;\n\n    let target = dialogEl.querySelector(selector);\n    if (!target) return;\n\n    target.style.removeProperty('width');\n    target.style.removeProperty('max-width');\n}\n\nfunction normalizeDialogInnerHeight(dialog, selector, options = {}) {\n    let dialogEl = getDialogElement(dialog);\n    if (!dialogEl) return;\n\n    let target = dialogEl.querySelector(selector);\n    if (!target) return;\n\n    let {\n        minHeight = 120,\n        maxPasses = 4,\n        tolerance = 1,\n        mode = 'contain',\n        debug = false\n    } = options;\n\n    let pass = 0;\n\n    function log(...args) {\n        if (debug) {\n            console.log('[normalizeDialogInnerHeight]', ...args);\n        }\n    }\n\n    function measureAndApply() {\n        if (!target.isConnected) return;\n\n        let viewport = getDialogViewportBox(dialogEl);\n        let targetRect = getElementRectSafe(target);\n        if (!viewport || !targetRect) return;\n\n        let topGap = targetRect.top - viewport.innerTop;\n        let bottomGap = viewport.innerBottom - targetRect.bottom;\n\n        log('pass', pass + 1, {\n            topGap,\n            bottomGap,\n            targetHeight: targetRect.height,\n            viewportHeight: viewport.innerHeight\n        });\n\n        let shrinkAmount = 0;\n\n        if (mode === 'balance') {\n            shrinkAmount = topGap - bottomGap;\n        } else if (mode === 'contain') {\n            if (targetRect.bottom > viewport.innerBottom) {\n                shrinkAmount = targetRect.bottom - viewport.innerBottom;\n            }\n        } else if (typeof mode === 'function') {\n            shrinkAmount = Number(mode({\n                dialog,\n                dialogEl,\n                target,\n                viewport,\n                targetRect,\n                topGap,\n                bottomGap\n            })) || 0;\n        }\n\n        if (shrinkAmount > tolerance) {\n            let newHeight = clampNumber(targetRect.height - shrinkAmount, minHeight, viewport.innerHeight);\n            target.style.setProperty('height', `${newHeight}px`, 'important');\n            target.style.setProperty('max-height', `${newHeight}px`, 'important');\n            target.style.setProperty('overflow', 'auto', 'important');\n            log('applied height', newHeight);\n\n            pass++;\n            if (pass < maxPasses) {\n                requestAnimationFrame(measureAndApply);\n            }\n        } else {\n            log('no adjustment needed');\n        }\n    }\n\n    requestAnimationFrame(measureAndApply);\n}\n\nfunction clearNormalizedDialogInnerHeight(dialog, selector) {\n    let dialogEl = getDialogElement(dialog);\n    if (!dialogEl) return;\n\n    let target = dialogEl.querySelector(selector);\n    if (!target) return;\n\n    target.style.removeProperty('height');\n    target.style.removeProperty('max-height');\n    target.style.removeProperty('overflow');\n}\n\nfunction normalizeDialogInnerSize(dialog, selector, options = {}) {\n    let {\n        width = null,\n        height = null\n    } = options;\n\n    if (width) {\n        normalizeDialogInnerWidth(dialog, selector, width);\n    }\n    if (height) {\n        normalizeDialogInnerHeight(dialog, selector, height);\n    }\n}\n\nfunction clearNormalizedDialogInnerSize(dialog, selector) {\n    clearNormalizedDialogInnerWidth(dialog, selector);\n    clearNormalizedDialogInnerHeight(dialog, selector);\n}\n\n\nfunction syncConditionalBars(dialog) {\n    if (!dialog || !dialog.object) return;\n    let formResult = {};\n    try { formResult = dialog.getFormResult(); } catch (e) { return; }\n    let csBar = dialog.object.querySelector('.form_bar_custom_size');\n    if (csBar) csBar.classList.toggle('mie_show', formResult.icon_size === 'custom');\n    let ccBar = dialog.object.querySelector('.form_bar_custom_color');\n    if (ccBar) ccBar.classList.toggle('mie_show', formResult.background === 'custom');\n}\n\nfunction alignAutoFrameWithZoom(dialog) {\n    if (!dialog || !dialog.object) return;\n    let zoomInput = dialog.object.querySelector('.form_bar_zoom_level input[type=\"range\"]');\n    let autoBar = dialog.object.querySelector('.form_bar_auto_frame');\n    let autoCheckbox = dialog.object.querySelector('.form_bar_auto_frame input[type=\"checkbox\"]');\n    if (!zoomInput || !autoBar || !autoCheckbox) return;\n    autoCheckbox.style.removeProperty('transform');\n    let zoomRect = zoomInput.getBoundingClientRect();\n    let autoBarRect = autoBar.getBoundingClientRect();\n    let checkRect = autoCheckbox.getBoundingClientRect();\n    let deltaX = zoomRect.left - checkRect.left;\n    let zoomCenterY = autoBarRect.top + autoBarRect.height / 2;\n    let checkCenterY = checkRect.top + checkRect.height / 2;\n    let deltaY = (zoomCenterY - checkCenterY) - 14;\n    if (!isFinite(deltaX) || !isFinite(deltaY)) return;\n    deltaX = clampNumber(Math.round(deltaX), -120, 120);\n    deltaY = clampNumber(Math.round(deltaY), -24, 24);\n    autoCheckbox.style.setProperty('transform', `translate(${deltaX}px, ${deltaY}px)`);\n}\n\n// =========================\n// Plugin-specific wrappers\n// =========================\nfunction normalizeIconExporterDialog(dialog) {\n    normalizeDialogInnerSize(dialog, '.icon_exporter_layout_container', {\n        width: {\n            minWidth: 320,\n            maxPasses: 5,\n            tolerance: 1,\n            mode: 'balance'\n        },\n        height: {\n            minHeight: 220,\n            maxPasses: 4,\n            tolerance: 1,\n            mode: 'contain'\n        }\n    });\n}\n\nfunction clearNormalizedIconExporterDialog(dialog) {\n    clearNormalizedDialogInnerSize(dialog, '.icon_exporter_layout_container');\n}\n\n// =========================\n// Dialog layout and lifecycle\n// =========================\nfunction applyDialogBottomLayout(dialog, bottomContainer = null) {\n    if (!dialog || !dialog.object) return;\n    let targetContainer = bottomContainer || dialog.object.querySelector('.export_bottom_section');\n    if (!targetContainer) return;\n    function moveToBottomSection(settingKey) {\n        let formNode = dialog.object.querySelector(`.form_bar_${settingKey}`);\n        if (!formNode) {\n            let settingNode = dialog.object.querySelector(`[data-setting=\"${settingKey}\"]`);\n            if (settingNode) {\n                formNode = settingNode.closest('.form_element') || settingNode.closest('.form_bar') || settingNode.closest('.form_group') || settingNode;\n            }\n        }\n        if (!formNode || !formNode.parentNode) return;\n        if (formNode.parentNode !== targetContainer) {\n            targetContainer.appendChild(formNode);\n        }\n    }\n    moveToBottomSection('icon_size');\n    moveToBottomSection('custom_size');\n    moveToBottomSection('background');\n    moveToBottomSection('custom_color');\n    moveToBottomSection('quality');\n    moveToBottomSection('save_mode');\n    moveToBottomSection('output_folder');\n    moveToBottomSection('filename');\n}\n\nfunction openIconExporterDialog() {\n    if (!Format || !Project || !Project.elements || Project.elements.length === 0) {\n        Blockbench.showMessageBox({\n            title: 'No Model',\n            message: 'Please load a model first before exporting an icon.',\n            icon: 'warning'\n        });\n        return;\n    }\n\n    dialogCameraRestoreState = captureCameraState();\n    dialogDefaultFramedCameraState = null;\n    createIsolatedDialogPreview();\n    if (isolatedDialogPreview) {\n        dialogDefaultFramedCameraState = captureCameraState(isolatedDialogPreview);\n    }\n    let previewSize = 256;\n    activeResetButton = null;\n    baseCameraPosition = null;\n    baseCameraTarget = null;\n    baseCameraUp = null;\n    lastAutoFrameState = true;\n    lastCameraValues = { zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0 };\n    let outputPrefs = loadExportPrefs();\n    let bottomMetaSection = null;\n    let previewCanvas = document.createElement('canvas');\n    previewCanvas.id = 'live_icon_preview_canvas';\n    previewCanvas.width = previewSize;\n    previewCanvas.height = previewSize;\n    previewCanvas.style.display = 'block';\n    previewCanvas.style.border = '1px solid rgba(255, 255, 255, 0.12)';\n    previewCanvas.style.borderRadius = '10px';\n\n    let previewSection = Interface.createElement('div', {\n        class: 'preview_section',\n        style: 'text-align: center;'\n    }, [\n        Interface.createElement('h3', {\n            class: 'preview_title',\n            style: 'margin: 0 0 12px 0; color: var(--color-text);'\n        }, 'Live Preview'),\n        previewCanvas,\n        Interface.createElement('div', {\n            id: 'preview_info_text',\n            style: 'margin-top: 10px; color: var(--color-subtle_text); font-size: 12px; letter-spacing: 0.2px;'\n        }, '64×64 pixels')\n    ]);\n\n    let dialog = new Dialog({\n        id: 'icon_exporter_dialog',\n        title: 'Menu Icon Exporter',\n        width: 1120,\n        form: {\n            layout_wrapper: {\n                type: 'info',\n                text: ''\n            },\n            \n            settings_column: {\n                type: 'info',\n                text: getFormatSpecificInfo()\n            },\n            \n            icon_size: {\n                label: 'Icon Size',\n                type: 'select',\n                options: {\n                    '16': '16×16 - Tiny (UI elements)',\n                    '32': '32×32 - Small (inventory icons)',\n                    '48': '48×48 - Medium (item icons)',\n                    '64': '64×64 - Large (block icons)',\n                    '128': '128×128 - Extra Large (detailed icons)',\n                    'custom': 'Custom Size...'\n                },\n                value: outputPrefs.icon_size || getRecommendedSize(),\n                onChange(formResult) {\n                    updateLivePreview(dialog, formResult);\n                }\n            },\n            \n            custom_size: {\n                label: 'Custom Size (pixels)',\n                type: 'number',\n                value: outputPrefs.custom_size,\n                min: 8,\n                max: 512,\n                onChange(formResult) {\n                    updateLivePreview(dialog, formResult);\n                }\n            },\n            \n            background: {\n                label: 'Background',\n                type: 'select',\n                options: {\n                    'transparent': 'Transparent',\n                    'white': 'White (#FFFFFF)',\n                    'black': 'Black (#000000)',\n                    'gray': 'Gray (#808080)',\n                    'custom': 'Custom Color'\n                },\n                value: outputPrefs.background,\n                description: 'Background color for the exported icon',\n                onChange(formResult) {\n                    updateLivePreview(dialog, formResult);\n                }\n            },\n            \n            custom_color: {\n                label: 'Custom Background Color',\n                type: 'color',\n                value: outputPrefs.custom_color,\n                description: 'Pick any color from the gradient spectrum'\n            },\n            \n\n            \n            auto_frame: {\n                label: 'Auto-frame Model',\n                type: 'checkbox',\n                value: true,\n                description: 'Automatically center and zoom to fit the model perfectly'\n            },\n            \n            zoom_level: {\n                label: 'Zoom Level',\n                type: 'range',\n                min: 0.5,\n                max: 3.0,\n                step: 0.1,\n                value: 1.0,\n                description: 'Manually adjust zoom (0.5 = close, 3.0 = far)'\n            },\n            \n                        rotate_x: {\n                label: 'X-Axis Rotation',\n                type: 'range',\n                min: -180,\n                max: 180,\n                step: 5,\n                value: 0,\n                description: 'Rotate model around X-axis'\n            },\n            \n            rotate_y: {\n                label: 'Y-Axis Rotation',\n                type: 'range',\n                min: -180,\n                max: 180,\n                step: 5,\n                value: 0,\n                description: 'Rotate model around Y-axis'\n            },\n            \n            rotate_z: {\n                label: 'Z-Axis Rotation',\n                type: 'range',\n                min: -180,\n                max: 180,\n                step: 5,\n                value: 0,\n                description: 'Rotate model around Z-axis'\n            },\n            \n            pan_x: {\n                label: 'Pan Left/Right',\n                type: 'range',\n                min: -50,\n                max: 50,\n                step: 1,\n                value: 0,\n                description: 'Pan view horizontally in orthographic mode'\n            },\n            \n            pan_y: {\n                label: 'Pan Up/Down',\n                type: 'range',\n                min: -50,\n                max: 50,\n                step: 1,\n                value: 0,\n                description: 'Pan view vertically in orthographic mode'\n            },\n            \n\n            \n            quality: {\n                label: 'Export Quality',\n                type: 'select',\n                options: {\n                    'standard': 'Standard (4x render)',\n                    'high': 'High Quality (8x render)',\n                    'ultra': 'Ultra Quality (16x render)'\n                },\n                value: outputPrefs.quality,\n                description: 'Higher quality takes longer but produces sharper icons'\n            },\n\n            save_mode: {\n                label: 'Save Mode',\n                type: 'select',\n                options: canUseAppFileSystem() ? {\n                    'ask_dialog': 'Ask every export',\n                    'auto_folder': 'Auto-save to folder'\n                } : {\n                    'ask_dialog': 'Ask every export'\n                },\n                value: outputPrefs.save_mode,\n                description: 'Choose whether to use the save dialog or save directly'\n            },\n\n            output_folder: {\n                label: 'Output Folder',\n                type: 'folder',\n                value: outputPrefs.output_folder,\n                condition: (formResult) => formResult.save_mode === 'auto_folder',\n                description: 'Used when Save Mode is set to Auto-save to folder'\n            },\n            \n            filename: {\n                label: 'Filename (without .png)',\n                type: 'text',\n                value: function() {\n                    let name = Project.name || 'model';\n                    name = name.replace(/\\.geo\\.json$/i, '').replace(/\\.geo$/i, '');\n                    name = name.replace(/\\.[^.]+$/, '');\n                    name = name.replace(/[^a-zA-Z0-9_-]/g, '_');\n                    return name + '_icon';\n                }()\n            }\n        },\n        \n        buttons: ['dialog.confirm', 'dialog.cancel'],\n        \n        onConfirm(formData) {\n            stopCameraWatcher();\n            activeResetButton = null;\n            clearNormalizedIconExporterDialog(dialog);\n            let resolvedFormData = resolveFormData(dialog, formData);\n            saveExportPrefs(resolvedFormData);\n            let restoreState = cloneCameraState(dialogCameraRestoreState);\n            generateIcon(resolvedFormData, restoreState, true);\n            return true;\n        },\n        \n        onCancel() {\n            stopCameraWatcher();\n            activeResetButton = null;\n            clearNormalizedIconExporterDialog(dialog);\n            restoreDialogCameraState();\n            disposeIsolatedDialogPreview();\n            clearDialogCameraState();\n            return true;\n        },\n\n        onFormChange(formData) {\n            syncConditionalBars(dialog);\n            let resolvedFormData = resolveFormData(dialog, dialog.getFormResult());\n            saveExportPrefs(resolvedFormData);\n            applyDialogBottomLayout(dialog, bottomMetaSection);\n            handleFormCameraChange(dialog, resolvedFormData);\n            requestAnimationFrame(() => {\n                normalizeIconExporterDialog(dialog);\n                requestAnimationFrame(() => {\n                    alignAutoFrameWithZoom(dialog);\n                });\n            });\n        }\n    });\n\n    let preLayoutHideStyle = document.getElementById('menu_icon_exporter_dialog_prehide');\n    if (preLayoutHideStyle) {\n        preLayoutHideStyle.remove();\n    }\n    preLayoutHideStyle = document.createElement('style');\n    preLayoutHideStyle.id = 'menu_icon_exporter_dialog_prehide';\n    preLayoutHideStyle.textContent = '#icon_exporter_dialog { opacity: 0 !important; }';\n    document.head.appendChild(preLayoutHideStyle);\n\n    dialog.show();\n\n    setTimeout(() => {\n        try {\n            let existingStyle = document.getElementById('menu_icon_exporter_dialog_style');\n            if (existingStyle) {\n                existingStyle.remove();\n            }\n            let style = document.createElement('style');\n            style.id = 'menu_icon_exporter_dialog_style';\n            style.textContent = `\n                #icon_exporter_dialog .form_bar.form_bar_custom_size:not(.mie_show) { display: none !important; }\n                #icon_exporter_dialog .export_bottom_section .form_bar.form_bar_custom_size:not(.mie_show) { display: none !important; }\n                #icon_exporter_dialog .form_bar.form_bar_custom_color:not(.mie_show) { display: none !important; }\n                #icon_exporter_dialog .export_bottom_section .form_bar.form_bar_custom_color:not(.mie_show) { display: none !important; }\n                #icon_exporter_dialog,\n                #icon_exporter_dialog .dialog_content,\n                #icon_exporter_dialog .form_wrapper,\n                #icon_exporter_dialog .form {\n                    box-sizing: border-box !important;\n                    max-width: 100% !important;\n                }\n                #icon_exporter_dialog .dialog_content {\n                    padding: 10px 12px !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .icon_exporter_layout_container {\n                    display: flex !important;\n                    flex-direction: column !important;\n                    gap: 10px !important;\n                    box-sizing: border-box !important;\n                    padding: 0 !important;\n                    overflow: hidden !important;\n                }\n                #icon_exporter_dialog .icon_exporter_top_section {\n                    display: flex !important;\n                    flex-direction: row !important;\n                    align-items: flex-start !important;\n                    gap: 14px !important;\n                    width: 100% !important;\n                    min-width: 0 !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .icon_exporter_left_column {\n                    flex: 1 1 0 !important;\n                    min-width: 0 !important;\n                    display: flex !important;\n                    flex-direction: column !important;\n                    gap: 4px !important;\n                    box-sizing: border-box !important;\n                    overflow: hidden !important;\n                }\n                #icon_exporter_dialog .form_part,\n                #icon_exporter_dialog .form_element:not(.preview_section),\n                #icon_exporter_dialog .form_bar:not(.preview_section),\n                #icon_exporter_dialog .form_group:not(.preview_section) {\n                    box-sizing: border-box !important;\n                    border-radius: 10px !important;\n                    background: rgba(255, 255, 255, 0.02) !important;\n                    border: 1px solid rgba(255, 255, 255, 0.06) !important;\n                    padding: 5px 9px !important;\n                    margin: 0 !important;\n                    width: 100% !important;\n                    min-width: 0 !important;\n                }\n                #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame {\n                    display: flex !important;\n                    flex-flow: row nowrap !important;\n                    align-items: center !important;\n                }\n                #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > label.name_space_left {\n                    float: none !important;\n                    flex: 0 0 auto !important;\n                    width: var(--max_label_width, 180px) !important;\n                    box-sizing: content-box !important;\n                }\n                #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > input[type=\"checkbox\"] {\n                    flex: 0 0 auto !important;\n                }\n                #icon_exporter_dialog .icon_exporter_left_column .form_bar.form_bar_auto_frame > .dialog_form_description {\n                    flex: 0 0 auto !important;\n                    margin-left: auto !important;\n                    padding-top: 0 !important;\n                    height: auto !important;\n                    align-self: center !important;\n                }\n                #icon_exporter_dialog .preview_section {\n                    flex: 0 0 300px !important;\n                    width: 300px !important;\n                    box-sizing: border-box !important;\n                    background: rgba(255, 255, 255, 0.02) !important;\n                    border: 1px solid rgba(255, 255, 255, 0.08) !important;\n                    border-radius: 12px !important;\n                    padding: 10px !important;\n                    margin: 0 !important;\n                }\n                #icon_exporter_dialog .preview_section canvas,\n                #icon_exporter_dialog #live_icon_preview_canvas {\n                    display: block !important;\n                    width: 100% !important;\n                    height: auto !important;\n                    margin: 0 auto !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .export_bottom_section {\n                    width: 100% !important;\n                    min-width: 0 !important;\n                    display: flex !important;\n                    flex-direction: column !important;\n                    gap: 4px !important;\n                    box-sizing: border-box !important;\n                    margin: 0 !important;\n                    overflow: hidden !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_part,\n                #icon_exporter_dialog .export_bottom_section .form_element,\n                #icon_exporter_dialog .export_bottom_section .form_bar,\n                #icon_exporter_dialog .export_bottom_section .form_group {\n                    margin: 0 !important;\n                    width: 100% !important;\n                    min-width: 0 !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) {\n                    display: grid !important;\n                    grid-template-columns: minmax(0, var(--max_label_width, 180px)) minmax(0, 1fr) auto !important;\n                    align-items: center !important;\n                    column-gap: 10px !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) > .name_space_left {\n                    grid-column: 1 !important;\n                    min-width: 0 !important;\n                    overflow: hidden !important;\n                    text-overflow: ellipsis !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) > .dialog_form_description {\n                    grid-column: 3 !important;\n                    justify-self: start !important;\n                    margin-left: 4px !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) select,\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) input[type=\"text\"],\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) input[type=\"number\"],\n                #icon_exporter_dialog .export_bottom_section .form_bar:not(.form_bar_output_folder) .dark_bordered {\n                    grid-column: 2 !important;\n                    width: 100% !important;\n                    min-width: 0 !important;\n                    box-sizing: border-box !important;\n                }\n                \n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder {\n                    display: flex !important;\n                    align-items: center !important;\n                    gap: 6px !important;\n                    min-width: 0 !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > * {\n                    flex: 0 0 auto !important;\n                    align-self: center !important;\n                    margin: 0 !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > .name_space_left {\n                    flex: 0 0 var(--max_label_width, 180px) !important;\n                    min-width: 0 !important;\n                    overflow: hidden !important;\n                    text-overflow: ellipsis !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > input,\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder > .input_wrapper {\n                    flex: 1 1 0 !important;\n                    min-width: 0 !important;\n                    width: 100% !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder input[type=\"text\"],\n                #icon_exporter_dialog .export_bottom_section .form_bar_output_folder .dark_bordered {\n                    width: 100% !important;\n                    min-width: 0 !important;\n                    box-sizing: border-box !important;\n                }\n                #icon_exporter_dialog .dialog_form_description {\n                    flex: 0 0 auto !important;\n                    margin-right: 0 !important;\n                }\n                #icon_exporter_dialog .form_bar_layout_wrapper {\n                    display: none !important;\n                }\n                #icon_exporter_dialog .preview_title {\n                    font-size: 18px !important;\n                    font-weight: 600 !important;\n                    letter-spacing: 0.2px !important;\n                }\n                #icon_exporter_dialog .range_input_label {\n                    min-width: 34px !important;\n                    text-align: right !important;\n                    font-variant-numeric: tabular-nums !important;\n                    opacity: 0.9 !important;\n                }\n                #icon_exporter_dialog .form_element input[type=\"text\"],\n                #icon_exporter_dialog .form_element input[type=\"number\"],\n                #icon_exporter_dialog .form_element .dark_bordered,\n                #icon_exporter_dialog .form_element select {\n                    border-radius: 10px !important;\n                }\n                @media (max-width: 980px) {\n                    #icon_exporter_dialog .icon_exporter_top_section {\n                        flex-direction: column !important;\n                    }\n                    #icon_exporter_dialog .preview_section {\n                        flex: 0 1 auto !important;\n                        max-width: 100% !important;\n                        min-width: 0 !important;\n                    }\n                }\n            `;\n            document.head.appendChild(style);\n\n            let formContainer = dialog.object.querySelector('.form_wrapper') || \n                               dialog.object.querySelector('.dialog_content') ||\n                               dialog.object.querySelector('form') ||\n                               dialog.object.querySelector('.dialog_wrapper');\n\n            if (formContainer) {\n                formContainer.classList.add('icon_exporter_layout_container');\n\n                let modeBar = document.createElement('div');\n                modeBar.className = 'mie_dialog_mode_bar';\n                modeBar.style.cssText = 'display:flex;gap:4px;margin-bottom:8px;';\n                let floatBtn = document.createElement('div');\n                floatBtn.textContent = 'Float';\n                floatBtn.className = 'mie_mode_btn active';\n                floatBtn.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:var(--color-accent);color:#fff;border-color:var(--color-accent);';\n                let panelBtn = document.createElement('div');\n                panelBtn.textContent = 'Panel';\n                panelBtn.className = 'mie_mode_btn';\n                panelBtn.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:rgba(255,255,255,0.04);color:var(--color-subtle_text);';\n                panelBtn.addEventListener('click', () => { dialog.cancel(); switchToPanel(); });\n                modeBar.appendChild(floatBtn);\n                modeBar.appendChild(panelBtn);\n                formContainer.appendChild(modeBar);\n\n                let topSection = Interface.createElement('div', {\n                    class: 'icon_exporter_top_section'\n                });\n                let leftColumn = Interface.createElement('div', {\n                    class: 'icon_exporter_left_column'\n                });\n                previewSection.className = 'preview_section';\n\n                let formElements = Array.from(\n                    formContainer.querySelectorAll('.form_element, .form_bar, .form_group')\n                );\n                formElements.forEach(element => {\n                    if (!element.classList.contains('preview_section')) {\n                        element.classList.add('form_part');\n                        leftColumn.appendChild(element);\n                    }\n                });\n\n                topSection.appendChild(leftColumn);\n                topSection.appendChild(previewSection);\n                formContainer.appendChild(topSection);\n\n                bottomMetaSection = Interface.createElement('div', {\n                    class: 'export_bottom_section'\n                });\n                formContainer.appendChild(bottomMetaSection);\n                applyDialogBottomLayout(dialog, bottomMetaSection);\n                normalizeIconExporterDialog(dialog);\n            } else {\n                let dialogContent = dialog.object.querySelector('.dialog_content');\n                if (dialogContent) {\n                    dialogContent.classList.add('icon_exporter_layout_container');\n\n                    let modeBar2 = document.createElement('div');\n                    modeBar2.className = 'mie_dialog_mode_bar';\n                    modeBar2.style.cssText = 'display:flex;gap:4px;margin-bottom:8px;';\n                    let floatBtn2 = document.createElement('div');\n                    floatBtn2.textContent = 'Float';\n                    floatBtn2.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:var(--color-accent);color:#fff;border-color:var(--color-accent);';\n                    let panelBtn2 = document.createElement('div');\n                    panelBtn2.textContent = 'Panel';\n                    panelBtn2.style.cssText = 'flex:1;padding:5px 4px;border:1px solid rgba(255,255,255,0.1);border-radius:6px;cursor:pointer;font-size:10px;font-weight:600;text-align:center;background:rgba(255,255,255,0.04);color:var(--color-subtle_text);';\n                    panelBtn2.addEventListener('click', () => { dialog.cancel(); switchToPanel(); });\n                    modeBar2.appendChild(floatBtn2);\n                    modeBar2.appendChild(panelBtn2);\n                    dialogContent.appendChild(modeBar2);\n\n                    let topSection = Interface.createElement('div', {\n                        class: 'icon_exporter_top_section'\n                    });\n                    let leftColumn = Interface.createElement('div', {\n                        class: 'icon_exporter_left_column'\n                    });\n                    previewSection.className = 'preview_section';\n                    let formElements = Array.from(\n                        dialogContent.querySelectorAll('.form_element, .form_bar, .form_group')\n                    );\n                    formElements.forEach(element => {\n                        if (!element.classList.contains('preview_section')) {\n                            element.classList.add('form_part');\n                            leftColumn.appendChild(element);\n                        }\n                    });\n                    topSection.appendChild(leftColumn);\n                    topSection.appendChild(previewSection);\n                    dialogContent.appendChild(topSection);\n                    bottomMetaSection = Interface.createElement('div', {\n                        class: 'export_bottom_section'\n                    });\n                    dialogContent.appendChild(bottomMetaSection);\n                    applyDialogBottomLayout(dialog, bottomMetaSection);\n                    normalizeIconExporterDialog(dialog);\n                }\n            }\n\n            (function fixFolderBrowseButton() {\n                let folderBar = dialog.object.querySelector('.form_bar_output_folder');\n                if (!folderBar) return;\n                let inputWrapper = folderBar.querySelector('.input_wrapper');\n                if (!inputWrapper) return;\n                let folderIcon = inputWrapper.querySelector('i.material-icons');\n                if (!folderIcon) return;\n                folderBar.insertBefore(folderIcon, inputWrapper.nextSibling);\n                folderIcon.style.cursor = 'pointer';\n                folderIcon.addEventListener('click', function(e) {\n                    e.stopPropagation();\n                    inputWrapper.click();\n                });\n            })();\n\n            let resetButton = document.createElement('button');\n            resetButton.type = 'button';\n            resetButton.textContent = 'Reset Camera to Auto-Frame';\n            resetButton.style.cssText = 'margin: 8px 0 12px 0; padding: 8px 14px; background: linear-gradient(180deg, #4f95f7, #3e7ad6); color: white; border: 1px solid rgba(255,255,255,0.14); border-radius: 999px; font-size: 12px; font-weight: 600; letter-spacing: 0.2px; cursor: pointer;';\n            resetButton.disabled = true;\n            resetButton.style.opacity = '0.5';\n            resetButton.style.cursor = 'not-allowed';\n            activeResetButton = resetButton;\n            resetButton.onclick = function(event) {\n                if (event && typeof event.preventDefault === 'function') {\n                    event.preventDefault();\n                }\n                if (event && typeof event.stopPropagation === 'function') {\n                    event.stopPropagation();\n                }\n                stopCameraWatcher();\n                let formData = resolveFormData(dialog, dialog.getFormResult());\n                let resetValues = {\n                    ...formData,\n                    auto_frame: true,\n                    zoom_level: 1.0,\n                    rotate_x: 0,\n                    rotate_y: 0,\n                    rotate_z: 0,\n                    pan_x: 0,\n                    pan_y: 0\n                };\n                dialog.setFormValues(resetValues, false);\n                syncRangeLabels(dialog, resetValues);\n                let appliedValues = resolveFormData(dialog, resetValues);\n                baseCameraPosition = null;\n                baseCameraTarget = null;\n                baseCameraUp = null;\n                lastAutoFrameState = appliedValues.auto_frame;\n\n                function finalizeReset() {\n                    adjustCameraManually(appliedValues);\n                    lastCameraValues = getCameraValues(appliedValues);\n                    updateResetButtonState(appliedValues);\n                    updateLivePreview(dialog, appliedValues);\n                }\n\n                if (dialogDefaultFramedCameraState) {\n                    applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), getActiveCameraPreview());\n                    captureBaseCameraState();\n                    finalizeReset();\n                } else {\n                    frameModelForIcon(appliedValues).then(() => {\n                        dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview());\n                        finalizeReset();\n                    });\n                }\n            };\n\n            let panUpBar = dialog.object.querySelector('.form_bar_pan_y');\n            let leftColumnContainer = panUpBar && panUpBar.parentNode ? panUpBar.parentNode : (\n                dialog.object.querySelector('.form') || formContainer\n            );\n            if (leftColumnContainer) {\n                let buttonContainer = document.createElement('div');\n                buttonContainer.style.cssText = 'margin: 15px 0; text-align: center;';\n                buttonContainer.appendChild(resetButton);\n\n                if (panUpBar) {\n                    if (panUpBar.parentNode === leftColumnContainer && panUpBar.nextSibling) {\n                        leftColumnContainer.insertBefore(buttonContainer, panUpBar.nextSibling);\n                    } else {\n                        leftColumnContainer.appendChild(buttonContainer);\n                    }\n                } else {\n                    leftColumnContainer.appendChild(buttonContainer);\n                }\n            }\n        } finally {\n            requestAnimationFrame(() => {\n                normalizeIconExporterDialog(dialog);\n                syncConditionalBars(dialog);\n                requestAnimationFrame(() => {\n                    alignAutoFrameWithZoom(dialog);\n                    if (preLayoutHideStyle && preLayoutHideStyle.parentNode) {\n                        preLayoutHideStyle.parentNode.removeChild(preLayoutHideStyle);\n                    }\n                    if (dialog.object) {\n                        dialog.object.style.opacity = '1';\n                    }\n                });\n            });\n        }\n\n        (async () => {\n            let formData = resolveFormData(dialog, dialog.getFormResult());\n            if (formData.auto_frame) {\n                if (isolatedDialogPreview && dialogDefaultFramedCameraState) {\n                    applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), isolatedDialogPreview);\n                    captureBaseCameraState();\n                } else {\n                    await frameModelForIcon(formData);\n                    dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview());\n                }\n            }\n            adjustCameraManually(formData);\n            if (!dialogDefaultFramedCameraState) {\n                dialogDefaultFramedCameraState = captureCameraState(getActiveCameraPreview());\n            }\n            lastCameraValues = getCameraValues(formData);\n            updateResetButtonState(formData);\n            await updateLivePreview(dialog, formData);\n            syncConditionalBars(dialog);\n            requestAnimationFrame(() => {\n                alignAutoFrameWithZoom(dialog);\n            });\n        })();\n    }, 0);\n}\n\n// =========================\n// Dialog form and preview helpers\n// =========================\nfunction getFormatSpecificInfo() {\n    if (!Format) return 'Compatible with all model formats';\n    \n    switch(Format.id) {\n        case 'bedrock':\n        case 'bedrock_block':\n            return '💡 Perfect for Bedrock item textures (16×16 recommended for game compatibility)';\n        case 'java_block':\n            return '💡 Ideal for Java item models (16×16 standard, 32×32 for detailed items)';\n        case 'skin':\n            return '💡 Great for skin previews (64×64 recommended for face icons)';\n        case 'free':\n            return '💡 Generic model export (any size works, 64×64+ recommended)';\n        default:\n            return '💡 Compatible with all model formats (choose size based on intended use)';\n    }\n}\n\nfunction getRecommendedSize() {\n    if (!Format) return '48';\n    \n    switch(Format.id) {\n        case 'bedrock':\n        case 'bedrock_block':\n        case 'java_block':\n            return '16';\n        case 'skin':\n            return '64';\n        default:\n            return '48';\n    }\n}\n\nfunction resolveFormData(dialog, formData = {}) {\n    let fromDialog = {};\n    if (dialog && typeof dialog.getFormResult === 'function') {\n        try {\n            fromDialog = dialog.getFormResult() || {};\n        } catch (error) {\n            fromDialog = {};\n        }\n    }\n    function value(key, fallback) {\n        if (Object.prototype.hasOwnProperty.call(formData, key) && formData[key] !== undefined) {\n            return formData[key];\n        }\n        if (Object.prototype.hasOwnProperty.call(fromDialog, key) && fromDialog[key] !== undefined) {\n            return fromDialog[key];\n        }\n        return fallback;\n    }\n    return {\n        icon_size: value('icon_size', getRecommendedSize()),\n        custom_size: value('custom_size', 48),\n        background: value('background', 'transparent'),\n        custom_color: value('custom_color', '#ff0000'),\n        auto_frame: value('auto_frame', true),\n        zoom_level: value('zoom_level', 1.0),\n        rotate_x: value('rotate_x', 0),\n        rotate_y: value('rotate_y', 0),\n        rotate_z: value('rotate_z', 0),\n        pan_x: value('pan_x', 0),\n        pan_y: value('pan_y', 0),\n        quality: value('quality', 'high'),\n        save_mode: value('save_mode', 'ask_dialog'),\n        output_folder: value('output_folder', ''),\n        filename: value('filename', 'icon')\n    };\n}\n\nfunction formatRangeDisplayValue(value) {\n    let number = Number(value);\n    if (!Number.isFinite(number)) return '0';\n    if (Math.abs(number - Math.round(number)) < 0.000001) {\n        return String(Math.round(number));\n    }\n    return String(Math.round(number * 100) / 100);\n}\n\nfunction syncRangeLabels(dialog, values) {\n    if (!dialog || !dialog.object) return;\n    let rangeKeys = ['zoom_level', 'rotate_x', 'rotate_y', 'rotate_z', 'pan_x', 'pan_y'];\n    rangeKeys.forEach(key => {\n        let container = dialog.object.querySelector(`.form_bar_${key}`);\n        if (!container) {\n            let settingNode = dialog.object.querySelector(`[data-setting=\"${key}\"]`);\n            if (!settingNode) return;\n            container = settingNode.closest('.form_element') || settingNode.closest('.form_bar') || settingNode;\n        }\n        let labelNode = container.querySelector('.range_input_label');\n        if (labelNode) {\n            labelNode.textContent = formatRangeDisplayValue(values[key]);\n        }\n    });\n}\n\nasync function updateLivePreview(dialog, formData) {\n    let resolvedFormData = resolveFormData(dialog, formData);\n    let iconSize = resolvedFormData.icon_size === 'custom' ? \n        parseInt(resolvedFormData.custom_size) : \n        parseInt(resolvedFormData.icon_size);\n    if (!Number.isFinite(iconSize) || iconSize <= 0) {\n        iconSize = 48;\n    }\n        \n    let infoElement = document.getElementById('preview_info_text');\n    if (infoElement) {\n        infoElement.textContent = `${iconSize}×${iconSize} pixels`;\n    }\n    \n    let canvas = document.getElementById('live_icon_preview_canvas');\n    if (canvas) {\n        generateLivePreview(canvas, resolvedFormData);\n    }\n}\n\nfunction hideSceneHelpers() {\n    let hidden = {};\n    if (typeof three_grid !== 'undefined' && three_grid) {\n        hidden.gridWasVisible = three_grid.visible;\n        three_grid.visible = false;\n    }\n    if (typeof Transformer !== 'undefined' && Transformer) {\n        hidden.transformerWasVisible = Transformer.visible;\n        Transformer.visible = false;\n    }\n    if (typeof Canvas !== 'undefined' && Canvas.outlines) {\n        hidden.outlinesWasVisible = Canvas.outlines.visible;\n        Canvas.outlines.visible = false;\n    }\n    return hidden;\n}\n\nfunction restoreSceneHelpers(hidden) {\n    if (!hidden) return;\n    if (hidden.gridWasVisible !== undefined && typeof three_grid !== 'undefined' && three_grid) {\n        three_grid.visible = hidden.gridWasVisible;\n    }\n    if (hidden.transformerWasVisible !== undefined && typeof Transformer !== 'undefined' && Transformer) {\n        Transformer.visible = hidden.transformerWasVisible;\n    }\n    if (hidden.outlinesWasVisible !== undefined && typeof Canvas !== 'undefined' && Canvas.outlines) {\n        Canvas.outlines.visible = hidden.outlinesWasVisible;\n    }\n}\n\nfunction getPreviewSourceCanvas(overridePreview) {\n    let hidden = hideSceneHelpers();\n    try {\n        if (overridePreview && overridePreview.canvas) {\n            if (typeof overridePreview.render === 'function') overridePreview.render();\n            return overridePreview.canvas;\n        }\n        if (isolatedDialogPreview && isolatedDialogPreview.canvas) {\n            if (typeof isolatedDialogPreview.render === 'function') {\n                isolatedDialogPreview.render();\n            }\n            return isolatedDialogPreview.canvas;\n        }\n        if (typeof Preview !== 'undefined' && Preview.selected) {\n            if (typeof Preview.selected.render === 'function') {\n                Preview.selected.render();\n            }\n            return Preview.selected.canvas;\n        }\n        let sourceCanvas = document.querySelector('#preview canvas');\n        if (!sourceCanvas) {\n            sourceCanvas = document.querySelector('.preview canvas');\n        }\n        return sourceCanvas;\n    } finally {\n        restoreSceneHelpers(hidden);\n    }\n}\n\nfunction getBackgroundStyle(background) {\n    switch(background) {\n        case 'white': return '#FFFFFF';\n        case 'black': return '#000000';\n        case 'gray': return '#808080';\n        case 'transparent': \n        default: \n            return 'repeating-conic-gradient(#CCC 0% 25%, #FFF 0% 50%) 50% / 10px 10px';\n    }\n}\n\nfunction generateLivePreview(canvas, formData, overridePreview) {\n    if (!canvas) return;\n    \n    let ctx = canvas.getContext('2d');\n    let previewSize = canvas.width;\n    \n    let iconSize = formData.icon_size === 'custom' ? \n        parseInt(formData.custom_size) : \n        parseInt(formData.icon_size);\n    if (!Number.isFinite(iconSize) || iconSize <= 0) {\n        iconSize = 48;\n    }\n    \n    let qualityMultiplier;\n    switch(formData.quality) {\n        case 'standard': qualityMultiplier = 4; break;\n        case 'high': qualityMultiplier = 8; break;\n        case 'ultra': qualityMultiplier = 16; break;\n        default: qualityMultiplier = 8;\n    }\n    \n\n\n    \n    ctx.clearRect(0, 0, previewSize, previewSize);\n    \n    if (formData.background === 'transparent') {\n        let checkerSize = Math.max(8, iconSize / 8);\n        ctx.fillStyle = '#f0f0f0';\n        ctx.fillRect(0, 0, previewSize, previewSize);\n        ctx.fillStyle = '#e0e0e0';\n        for (let x = 0; x < previewSize; x += checkerSize) {\n            for (let y = 0; y < previewSize; y += checkerSize) {\n                if ((x / checkerSize + y / checkerSize) % 2) {\n                    ctx.fillRect(x, y, checkerSize, checkerSize);\n                }\n            }\n        }\n    } else if (formData.background === 'custom') {\n        ctx.fillStyle = formData.custom_color || '#ff0000';\n        ctx.fillRect(0, 0, previewSize, previewSize);\n    } else {\n        ctx.fillStyle = getBackgroundColor(formData.background);\n        ctx.fillRect(0, 0, previewSize, previewSize);\n    }\n    \n    let sourceCanvas = getPreviewSourceCanvas(overridePreview);\n    \n    if (sourceCanvas) {\n        let tempCanvas = document.createElement('canvas');\n        let tempCtx = tempCanvas.getContext('2d');\n        \n        let renderSize = Math.max(1, Math.floor(iconSize * qualityMultiplier));\n        tempCanvas.width = renderSize;\n        tempCanvas.height = renderSize;\n        \n        tempCtx.imageSmoothingEnabled = true;\n        tempCtx.imageSmoothingQuality = formData.quality === 'ultra' ? 'high' : 'medium';\n        \n        let sourceWidth = sourceCanvas.width;\n        let sourceHeight = sourceCanvas.height;\n        let sourceSize = Math.min(sourceWidth, sourceHeight);\n        let sourceX = (sourceWidth - sourceSize) / 2;\n        let sourceY = (sourceHeight - sourceSize) / 2;\n        \n        try {\n            tempCtx.drawImage(sourceCanvas, sourceX, sourceY, sourceSize, sourceSize, 0, 0, renderSize, renderSize);\n            \n            ctx.imageSmoothingEnabled = true;\n            ctx.imageSmoothingQuality = 'high';\n            ctx.drawImage(tempCanvas, 0, 0, previewSize, previewSize);\n        } catch (error) {\n            ctx.fillStyle = '#333';\n            ctx.fillRect(0, 0, previewSize, previewSize);\n            ctx.fillStyle = '#fff';\n            ctx.font = '12px Arial';\n            ctx.textAlign = 'center';\n            ctx.fillText('Error rendering preview', previewSize/2, previewSize/2 - 10);\n            ctx.fillText(error.message, previewSize/2, previewSize/2 + 10);\n        }\n    } else {\n        ctx.fillStyle = '#333';\n        ctx.fillRect(0, 0, previewSize, previewSize);\n        ctx.fillStyle = '#fff';\n        ctx.font = '14px Arial';\n        ctx.textAlign = 'center';\n        ctx.fillText('No preview available', previewSize/2, previewSize/2 - 10);\n        ctx.font = '10px Arial';\n        ctx.fillText('Make sure model is visible', previewSize/2, previewSize/2 + 10);\n    }\n}\n\n// =========================\n// Icon generation orchestration\n// =========================\nasync function generateIcon(formData, restoreState = null, cleanupDialogPreview = false) {\n    try {\n        let iconSize = formData.icon_size === 'custom' ? \n            parseInt(formData.custom_size) : \n            parseInt(formData.icon_size);\n        let filename = formData.filename || 'icon';\n\n        if (!filename.endsWith('.png')) {\n            filename += '.png';\n        }\n\n        Blockbench.setStatusBarText('Preparing camera view...');\n        Blockbench.setProgress(0.1);\n\n        if (formData.auto_frame) {\n            await frameModelForIcon(formData);\n        }\n        \n        Blockbench.setStatusBarText('Adjusting camera settings...');\n        Blockbench.setProgress(0.3);\n        \n        await new Promise(resolve => setTimeout(resolve, 200));\n        \n        Blockbench.setStatusBarText('Capturing high-quality screenshot...');\n        Blockbench.setProgress(0.5);\n        \n        await captureIcon(formData, iconSize, filename);\n        \n        Blockbench.setStatusBarText('Export complete!');\n        Blockbench.setProgress(1);\n        \n        setTimeout(() => {\n            Blockbench.setProgress();\n            Blockbench.setStatusBarText();\n        }, 1000);\n\n    } catch (error) {\n        Blockbench.setProgress();\n        Blockbench.setStatusBarText();\n\n        Blockbench.showMessageBox({\n            title: 'Export Failed',\n            message: 'Failed to generate icon: ' + error.message,\n            icon: 'error'\n        });\n    } finally {\n        if (restoreState) {\n            applyCameraState(restoreState);\n        }\n        if (cleanupDialogPreview) {\n            disposeIsolatedDialogPreview();\n            clearDialogCameraState();\n        }\n    }\n}\n\n// =========================\n// Camera interaction controls\n// =========================\nlet baseCameraPosition = null;\nlet baseCameraTarget = null;\nlet baseCameraUp = null;\nlet lastAutoFrameState = true;\nlet lastCameraValues = { zoom_level: 1.0, rotate_x: 0, rotate_y: 0, rotate_z: 0, pan_x: 0, pan_y: 0 };\nlet cameraWatchInterval = null;\n\nfunction getCameraValues(cameraData) {\n    return {\n        zoom_level: parseFloat(cameraData.zoom_level) || 1.0,\n        rotate_x: parseFloat(cameraData.rotate_x) || 0,\n        rotate_y: parseFloat(cameraData.rotate_y) || 0,\n        rotate_z: parseFloat(cameraData.rotate_z) || 0,\n        pan_x: parseFloat(cameraData.pan_x) || 0,\n        pan_y: parseFloat(cameraData.pan_y) || 0\n    };\n}\n\nfunction cameraValuesChanged(a, b) {\n    return a.zoom_level !== b.zoom_level ||\n        a.rotate_x !== b.rotate_x ||\n        a.rotate_y !== b.rotate_y ||\n        a.rotate_z !== b.rotate_z ||\n        a.pan_x !== b.pan_x ||\n        a.pan_y !== b.pan_y;\n}\n\nfunction hasManualCameraAdjustments(values) {\n    return values.zoom_level !== 1.0 ||\n        values.rotate_x !== 0 ||\n        values.rotate_y !== 0 ||\n        values.rotate_z !== 0 ||\n        values.pan_x !== 0 ||\n        values.pan_y !== 0;\n}\n\nfunction updateResetButtonState(cameraData) {\n    if (!activeResetButton) return;\n    let values = getCameraValues(cameraData);\n    let isActive = hasManualCameraAdjustments(values);\n    activeResetButton.disabled = !isActive;\n    activeResetButton.style.opacity = isActive ? '1' : '0.5';\n    activeResetButton.style.cursor = isActive ? 'pointer' : 'not-allowed';\n}\n\nfunction captureBaseCameraState() {\n    let preview = getActiveCameraPreview();\n    if (!preview || !preview.camera) {\n        return false;\n    }\n    let camera = preview.camera;\n    baseCameraPosition = camera.position.clone();\n    baseCameraTarget = getCurrentPreviewTarget(camera, preview);\n    camera.up.copy(WORLD_UP);\n    if (preview.controls && preview.controls.target) {\n        preview.controls.target.copy(baseCameraTarget);\n    }\n    camera.lookAt(baseCameraTarget);\n    if (camera.updateProjectionMatrix) {\n        camera.updateProjectionMatrix();\n    }\n    if (preview.controls && preview.controls.update) {\n        preview.controls.update();\n    }\n    if (typeof preview.render === 'function') {\n        preview.render();\n    }\n    baseCameraUp = WORLD_UP.clone();\n    return true;\n}\n\nfunction handleFormCameraChange(dialog, formData) {\n    let resolvedFormData = resolveFormData(dialog, formData);\n    let currentValues = getCameraValues(resolvedFormData);\n    let autoFrameChanged = resolvedFormData.auto_frame !== lastAutoFrameState;\n    lastAutoFrameState = resolvedFormData.auto_frame;\n\n    if (autoFrameChanged && resolvedFormData.auto_frame) {\n        let activePreview = getActiveCameraPreview();\n        function applyAutoFramedState() {\n            baseCameraPosition = null;\n            baseCameraTarget = null;\n            baseCameraUp = null;\n            captureBaseCameraState();\n            adjustCameraManually(currentValues);\n            lastCameraValues = currentValues;\n            updateResetButtonState(currentValues);\n            updateLivePreview(dialog, resolvedFormData);\n        }\n\n        if (dialogDefaultFramedCameraState) {\n            applyCameraState(cloneCameraState(dialogDefaultFramedCameraState), activePreview);\n            applyAutoFramedState();\n        } else if (isolatedDialogPreview) {\n            dialogDefaultFramedCameraState = captureCameraState(activePreview);\n            applyAutoFramedState();\n        } else {\n            frameModelForIcon(resolvedFormData).then(() => {\n                dialogDefaultFramedCameraState = captureCameraState(activePreview);\n                applyAutoFramedState();\n            });\n        }\n        return;\n    }\n\n    if (cameraValuesChanged(currentValues, lastCameraValues)) {\n        adjustCameraManually(currentValues);\n        lastCameraValues = currentValues;\n    }\n    updateResetButtonState(currentValues);\n    updateLivePreview(dialog, resolvedFormData);\n}\n\nfunction startCameraWatcher() {\n    if (cameraWatchInterval) {\n        clearInterval(cameraWatchInterval);\n        cameraWatchInterval = null;\n    }\n}\n\nfunction stopCameraWatcher() {\n    if (cameraWatchInterval) {\n        clearInterval(cameraWatchInterval);\n        cameraWatchInterval = null;\n    }\n}\n\nfunction adjustCameraManually(cameraData) {\n    let preview = getActiveCameraPreview();\n    if (preview && preview.camera) {\n        let camera = preview.camera;\n        if (!baseCameraPosition || !baseCameraTarget || !baseCameraUp) {\n            if (!captureBaseCameraState()) {\n                return;\n            }\n        }\n        \n        let values = getCameraValues(cameraData);\n        let zoomLevel = values.zoom_level;\n        let rotateX = THREE.MathUtils.degToRad(values.rotate_x);\n        let rotateY = THREE.MathUtils.degToRad(values.rotate_y);\n        let rotateZ = THREE.MathUtils.degToRad(values.rotate_z);\n\n        let newTarget = baseCameraTarget.clone();\n        let baseOffset = baseCameraPosition.clone().sub(baseCameraTarget);\n        let baseUpNormal = baseCameraUp.clone().normalize();\n        let forward = baseCameraTarget.clone().sub(baseCameraPosition).normalize();\n        let right = forward.clone().cross(baseUpNormal);\n        if (right.lengthSq() === 0) {\n            right.set(1, 0, 0);\n        } else {\n            right.normalize();\n        }\n        let panScale = 2.0;\n        newTarget.add(right.multiplyScalar(values.pan_x * panScale));\n        newTarget.add(baseUpNormal.clone().multiplyScalar(values.pan_y * panScale));\n\n        let rotatedOffset = baseOffset.clone();\n        if (rotateY !== 0) {\n            let yawQuaternion = new THREE.Quaternion().setFromAxisAngle(baseUpNormal, rotateY);\n            rotatedOffset.applyQuaternion(yawQuaternion);\n        }\n        if (rotateX !== 0) {\n            let pitchAxis = baseUpNormal.clone().cross(rotatedOffset).normalize();\n            if (pitchAxis.lengthSq() > 0) {\n                let pitchQuaternion = new THREE.Quaternion().setFromAxisAngle(pitchAxis, rotateX);\n                rotatedOffset.applyQuaternion(pitchQuaternion);\n            }\n        }\n        rotatedOffset.multiplyScalar(zoomLevel);\n\n        let newPosition = newTarget.clone().add(rotatedOffset);\n        camera.position.copy(newPosition);\n\n        let upVector = baseUpNormal.clone();\n        if (rotateZ !== 0) {\n            let forwardAxis = newTarget.clone().sub(newPosition).normalize();\n            if (forwardAxis.lengthSq() > 0) {\n                let rollQuaternion = new THREE.Quaternion().setFromAxisAngle(forwardAxis, rotateZ);\n                upVector.applyQuaternion(rollQuaternion);\n            }\n        }\n        camera.up.copy(upVector);\n        \n        if (preview.controls && preview.controls.target) {\n            preview.controls.target.copy(newTarget);\n        }\n        camera.lookAt(newTarget);\n        \n        if (camera.updateProjectionMatrix) {\n            camera.updateProjectionMatrix();\n        }\n        \n        \n        if (preview.controls && preview.controls.update) {\n            preview.controls.update();\n        }\n        \n        if (typeof preview.render === 'function') {\n            preview.render();\n            \n            setTimeout(() => {\n                let canvas = document.getElementById('live_icon_preview_canvas');\n                if (canvas) {\n                    generateLivePreview(canvas, cameraData);\n                }\n            }, 100);\n        }\n    } else {\n\n    }\n}\n\nfunction frameModelForIcon(formData = {}, skipZoom = false) {\n    return new Promise((resolve) => {\n        if (isolatedDialogPreview) {\n            baseCameraPosition = null;\n            baseCameraTarget = null;\n            baseCameraUp = null;\n            captureBaseCameraState();\n            if (typeof isolatedDialogPreview.render === 'function') {\n                isolatedDialogPreview.render();\n            }\n            resolve();\n            return;\n        }\n        let originalSelection = null;\n        try {\n            let allElements = Project.elements.filter(element => element.visibility !== false);\n            \n            if (allElements.length === 0) {\n                resolve();\n                return;\n            }\n\n            if (typeof Outliner !== 'undefined' && Outliner.selected) {\n                originalSelection = Outliner.selected.slice();\n                Outliner.selected.splice(0);\n                allElements.forEach(element => {\n                    Outliner.selected.push(element);\n                });\n            }\n            \n            if (typeof BarItems !== 'undefined' && BarItems.focus_on_selection) {\n                let mockEvent = { ctrlKey: false, type: 'click' };\n                if (typeof BarItems.focus_on_selection.click === 'function') {\n                    BarItems.focus_on_selection.click(mockEvent);\n                }\n            }\n            \n            setTimeout(() => {\n                if (getSelectedPreview() && getSelectedPreview().camera) {\n                    captureBaseCameraState();\n                    \n                    if (typeof getSelectedPreview().render === 'function') {\n                        getSelectedPreview().render();\n                    }\n                }\n                \n                if (originalSelection && typeof Outliner !== 'undefined' && Outliner.selected) {\n                    Outliner.selected.splice(0);\n                    originalSelection.forEach(element => {\n                        Outliner.selected.push(element);\n                    });\n                }\n                resolve();\n            }, 200);\n\n        } catch (error) {\n            if (originalSelection && typeof Outliner !== 'undefined' && Outliner.selected) {\n                Outliner.selected.splice(0);\n                originalSelection.forEach(element => {\n                    Outliner.selected.push(element);\n                });\n            }\n            resolve();\n        }\n    });\n}\n\n// =========================\n// Capture and export pipeline\n// =========================\nfunction getBackgroundColor(background) {\n    switch(background) {\n        case 'white': return '#FFFFFF';\n        case 'black': return '#000000';\n        case 'gray': return '#808080';\n        case 'transparent': \n        default: \n            return null;\n    }\n}\n\nasync function captureIcon(formData, iconSize, filename) {\n    return new Promise((resolve, reject) => {\n        try {\n            let multiplier;\n            switch(formData.quality) {\n                case 'standard': multiplier = 4; break;\n                case 'high': multiplier = 8; break;\n                case 'ultra': multiplier = 16; break;\n                default: multiplier = 8;\n            }\n            \n            let captureSize = iconSize * multiplier;\n            let captureCompleted = false;\n            let fallbackTimer = null;\n            \n            if (isolatedDialogPreview) {\n                captureFromCanvas(formData, iconSize, filename);\n                resolve();\n                return;\n            }\n        \n            function finishCapture(fn) {\n                if (captureCompleted) return;\n                captureCompleted = true;\n                if (fallbackTimer) {\n                    clearTimeout(fallbackTimer);\n                }\n                fn();\n                resolve();\n            }\n        \n        if (typeof MediaRecorder !== 'undefined' && typeof MediaRecorder.capture === 'function') {\n                fallbackTimer = setTimeout(() => {\n                    finishCapture(() => {\n                        captureFromCanvas(formData, iconSize, filename);\n                    });\n                }, 3000);\n\n                MediaRecorder.capture({\n                    type: 'image',\n                    width: captureSize,\n                    height: captureSize,\n                    callback: function(blob) {\n                        if (blob && blob.size > 0) {\n                            finishCapture(() => {\n                                processImageBlob(blob, formData, iconSize, filename);\n                            });\n                        } else {\n                            finishCapture(() => {\n                                captureFromCanvas(formData, iconSize, filename);\n                            });\n                        }\n                    }\n                });\n\n            } else {\n                captureFromCanvas(formData, iconSize, filename);\n                resolve();\n            }\n\n        } catch (error) {\n            reject(error);\n        }\n    });\n}\n\nfunction captureFromCanvas(formData, iconSize, filename) {\n    try {\n        let sourceCanvas = getPreviewSourceCanvas();\n        \n        if (!sourceCanvas) {\n            throw new Error('Could not find preview canvas');\n        }\n        \n        let multiplier;\n        switch(formData.quality) {\n            case 'standard': multiplier = 4; break;\n            case 'high': multiplier = 8; break;\n            case 'ultra': multiplier = 16; break;\n            default: multiplier = 8;\n        }\n        \n        let captureSize = iconSize * multiplier;\n            let tempCanvas = document.createElement('canvas');\n            tempCanvas.width = captureSize;\n            tempCanvas.height = captureSize;\n            let ctx = tempCanvas.getContext('2d');\n        \n        if (formData.background === 'custom') {\n            ctx.fillStyle = formData.custom_color || '#ff0000';\n            ctx.fillRect(0, 0, captureSize, captureSize);\n        } else {\n            let bgColor = getBackgroundColor(formData.background);\n            if (bgColor) {\n                ctx.fillStyle = bgColor;\n                ctx.fillRect(0, 0, captureSize, captureSize);\n            }\n        }\n            \n            ctx.imageSmoothingEnabled = true;\n        ctx.imageSmoothingQuality = formData.quality === 'ultra' ? 'high' : 'medium';\n            \n        let sourceWidth = sourceCanvas.width;\n        let sourceHeight = sourceCanvas.height;\n        let sourceSize = Math.min(sourceWidth, sourceHeight);\n        let sourceX = (sourceWidth - sourceSize) / 2;\n        let sourceY = (sourceHeight - sourceSize) / 2;\n        \n            ctx.drawImage(sourceCanvas, sourceX, sourceY, sourceSize, sourceSize, 0, 0, captureSize, captureSize);\n            \n        resizeAndExport(tempCanvas, iconSize, filename, formData);\n        \n    } catch (error) {\n\n        Blockbench.showMessageBox({\n            title: 'Capture Failed',\n            message: 'Could not capture the model view. Please ensure a model is loaded and visible.',\n            icon: 'error'\n        });\n    }\n}\n\nfunction processImageBlob(blob, formData, iconSize, filename) {\n    let img = new Image();\n    img.onload = function() {\n        let canvas = document.createElement('canvas');\n        canvas.width = img.width;\n        canvas.height = img.height;\n        let ctx = canvas.getContext('2d');\n        \n        if (formData.background === 'custom') {\n            ctx.fillStyle = formData.custom_color || '#ff0000';\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n        } else {\n            let bgColor = getBackgroundColor(formData.background);\n            if (bgColor) {\n                ctx.fillStyle = bgColor;\n                ctx.fillRect(0, 0, canvas.width, canvas.height);\n            }\n        }\n        \n        ctx.drawImage(img, 0, 0);\n        resizeAndExport(canvas, iconSize, filename, formData);\n        \n        URL.revokeObjectURL(img.src);\n    };\n    img.onerror = function() {\n\n        captureFromCanvas(formData, iconSize, filename);\n    };\n    img.src = URL.createObjectURL(blob);\n}\n\nfunction resizeAndExport(sourceCanvas, targetSize, filename, formData = {}) {\n    try {\n        let currentCanvas = sourceCanvas;\n        let currentSize = Math.max(sourceCanvas.width, sourceCanvas.height);\n        \n        while (currentSize > targetSize * 2) {\n            let nextSize = Math.max(Math.floor(currentSize * 0.5), targetSize);\n            let stepCanvas = document.createElement('canvas');\n            stepCanvas.width = nextSize;\n            stepCanvas.height = nextSize;\n            let stepCtx = stepCanvas.getContext('2d');\n            \n            stepCtx.imageSmoothingEnabled = true;\n            stepCtx.imageSmoothingQuality = 'high';\n            stepCtx.drawImage(currentCanvas, 0, 0, nextSize, nextSize);\n            \n            currentCanvas = stepCanvas;\n            currentSize = nextSize;\n        }\n        \n        let finalCanvas = document.createElement('canvas');\n        finalCanvas.width = targetSize;\n        finalCanvas.height = targetSize;\n        let ctx = finalCanvas.getContext('2d');\n        \n        if (targetSize <= 32) {\n            ctx.imageSmoothingEnabled = false;\n        } else {\n            ctx.imageSmoothingEnabled = true;\n            ctx.imageSmoothingQuality = 'high';\n        }\n        \n        ctx.drawImage(currentCanvas, 0, 0, targetSize, targetSize);\n        \n        finalCanvas.toBlob(function(blob) {\n            exportFinalImage(blob, filename, targetSize, formData);\n        }, 'image/png');\n        \n    } catch (error) {\n\n        Blockbench.showMessageBox({\n            title: 'Resize Error',\n            message: 'Failed to resize image: ' + error.message,\n            icon: 'error'\n        });\n    }\n}\n\nfunction getNormalizedExportName(filename) {\n    let name = typeof filename === 'string' ? filename.trim() : 'icon';\n    if (!name) {\n        name = 'icon';\n    }\n    name = name.replace(/[/\\\\:*?\"<>|]/g, '_');\n    if (!name.toLowerCase().endsWith('.png')) {\n        name += '.png';\n    }\n    return name;\n}\n\nfunction writeDataUrlToOutputFolder(dataURL, outputFolder, filename) {\n    if (!canUseAppFileSystem()) {\n        throw new Error('Auto-save is only available in the desktop app');\n    }\n\n    let folderPath = typeof outputFolder === 'string' ? outputFolder.trim() : '';\n    if (!folderPath) {\n        throw new Error('No output folder selected');\n    }\n    let fsModule = getNativeModule('fs', {\n        scope: folderPath,\n        message: 'This permission is required to save exported icons to your selected output folder.'\n    });\n    let pathModule = getNativeModule('path');\n    if (!fsModule) {\n        throw new Error('File system permission was denied');\n    }\n    if (!pathModule) {\n        throw new Error('Path module is unavailable');\n    }\n    if (!fsModule.existsSync(folderPath)) {\n        throw new Error('Selected output folder does not exist');\n    }\n\n    let folderStats = fsModule.statSync(folderPath);\n    if (!folderStats || !folderStats.isDirectory()) {\n        throw new Error('Selected output path is not a folder');\n    }\n\n    let fileName = getNormalizedExportName(filename);\n    let fullPath = pathModule.join(folderPath, fileName);\n    let commaIndex = typeof dataURL === 'string' ? dataURL.indexOf(',') : -1;\n    if (commaIndex === -1) {\n        throw new Error('Invalid image data');\n    }\n\n    let base64Data = dataURL.slice(commaIndex + 1);\n    fsModule.writeFileSync(fullPath, base64Data, 'base64');\n    return fullPath;\n}\n\nfunction exportFinalImage(blob, filename, iconSize, formData = {}) {\n    try {\n        if (!blob) {\n            throw new Error('No image data generated');\n        }\n\n        let reader = new FileReader();\n        reader.onload = function() {\n            let dataURL = reader.result;\n            let exportPrefs = normalizeExportPrefs(formData);\n            let fileNameWithExtension = getNormalizedExportName(filename);\n            let baseName = fileNameWithExtension.replace(/\\.png$/i, '');\n            let preferredFolder = exportPrefs.output_folder;\n            let shouldAutoSave = exportPrefs.save_mode === 'auto_folder' && !!preferredFolder;\n\n            if (shouldAutoSave) {\n                try {\n                    let savedPath = writeDataUrlToOutputFolder(dataURL, preferredFolder, fileNameWithExtension);\n                    Blockbench.showMessageBox({\n                        title: 'Export Complete',\n                        message: `${iconSize}×${iconSize} icon exported successfully.`,\n                        icon: 'check'\n                    });\n                    Blockbench.showQuickMessage('Saved to: ' + savedPath, 3000);\n                    return;\n                } catch (error) {\n                    Blockbench.showQuickMessage('Auto-save failed, opening save dialog');\n                }\n            }\n            \n            let startPath = undefined;\n            if (preferredFolder) {\n                let sep = preferredFolder.includes('\\\\') ? '\\\\' : '/';\n                startPath = preferredFolder + sep + fileNameWithExtension;\n            }\n            Blockbench.export({\n                type: 'PNG Image',\n                extensions: ['png'],\n                name: baseName,\n                content: dataURL,\n                savetype: 'image',\n                startpath: startPath\n            }, function(path) {\n                if (path) {\n                    Blockbench.showMessageBox({\n                        title: 'Export Complete',\n                        message: `${iconSize}×${iconSize} icon exported successfully.`,\n                        icon: 'check'\n                    });\n                } else {\n                    Blockbench.showQuickMessage('Export cancelled');\n                }\n            });\n        };\n        reader.onerror = function() {\n            throw new Error('Failed to read image data');\n        };\n        reader.readAsDataURL(blob);\n\n    } catch (error) {\n\n        Blockbench.showMessageBox({\n            title: 'Export Error',\n            message: 'Failed to export icon: ' + error.message,\n            icon: 'error'\n        });\n    }\n}\n"
  },
  {
    "path": "plugins/mesh_tools/about.md",
    "content": "\n<div>\n\nThis plugin adds **powerful** mesh modeling tools, operators, and generators into to your Blockbench.\nBy installing the plugin, you get:\n<div style=\"display: flex;flex-direction: column;\">\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">hub</i> <b>Bridge Edge Loops</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-confirm);\n\tcolor: var(--color-confirm);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">NEW</span>\n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">change_circle</i> <b>To Sphere</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">blur_on</i> <b>Laplacian Smooth</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">control_camera</i> <b>Poke Faces</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-external-link-square-alt\"></i> <b>Triangles To Quadrilaterals</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">pie_chart_outline</i> <b>Triangulate Faces</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">map</i> <b>UV Mapping</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 24px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">view_in_ar</i> <b>Project From View</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-error);\n\tcolor: var(--color-error);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">DEPRECATED</span>\n  </div></div>\n<div\n        style=\"padding-inline-start: 24px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">open_with</i> <b>Cubic Projection</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">unfold_more_double</i> <b>Expand Selection</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">unfold_less_double</i> <b>Shrink Selection</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">content_cut</i> <b>Subdivide</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">vertical_split</i> <b>Split Edges</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">scatter_plot</i> <b>Scatter</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-layer-group\"></i> <b>Array</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-object-group\"></i> <b>Boolean</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-confirm);\n\tcolor: var(--color-confirm);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">NEW</span>\n<span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-warning);\n\tcolor: var(--color-warning);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">EXPERIMENTAL</span>\n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">terrain</i> <b>Terrain</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">draw</i> <b>Terrain Style Editor</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">format_size</i> <b>Text Mesh</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-brain\"></i> <b>XYZ Math Surface</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 0px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-shapes\"></i> <b>Quick Primitives</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 24px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">offline_bolt</i> <b>Polyhedron</b>\n  \n  </div></div>\n<div\n        style=\"padding-inline-start: 24px\" ><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">offline_bolt</i> <b>Torus Knot</b>\n  \n  </div></div>\n</div>\n\n### Modeling Tools\nFor applying modifications on selected vertices, edges or faces.\n\n<section id=\"mesh_tools-action-bridge_edge_loops\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">hub</i> <b>Bridge Edge Loops</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-confirm);\n\tcolor: var(--color-confirm);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">NEW</span>\n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Connects multiple edge loops with faces.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/bridge_edge_loops_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/bridge_edge_loops_1_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\nResults with Blend Path enabled.\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/bridge_edge_loops_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/bridge_edge_loops_2_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-to_sphere\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">change_circle</i> <b>To Sphere</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Casts selected vertices into a smooth, spherical shape with adjustable influence.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/to_sphere_1_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/to_sphere_1_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/to_sphere_2_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/to_sphere_2_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-laplacian_smooth\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">blur_on</i> <b>Laplacian Smooth</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Smoothens selected vertices by averaging the position of neighboring vertices.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/laplacian_smooth_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/laplacian_smooth_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-poke\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">control_camera</i> <b>Poke Faces</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Generates a fan out of a face.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/poke_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/poke_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-tris_to_quad\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-external-link-square-alt\"></i> <b>Triangles To Quadrilaterals</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Attempts to merge adjacent triangles into quadrilaterals.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/tris_to_quad_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/tris_to_quad_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-triangulate\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">pie_chart_outline</i> <b>Triangulate Faces</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Splits selected faces into triangles.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/triangulate_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/triangulate_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-uv_project_view\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">view_in_ar</i> <b>Project From View</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-error);\n\tcolor: var(--color-error);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">DEPRECATED</span>\n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div><i class=\"fa_big fas fa-chevron-right\"></i><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">map</i> <b>UV Mapping</b>\n  \n  </div>\n</span>\n<p>Projects the selected faces to the UV map from the camera. Use built-in under UV > UV Project from View</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/uv_project_view_solid.png?raw=true\" />\n  <figcaption>Mesh</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/uv_project_view_uv.png?raw=true\" />\n  <figcaption>UV</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-uv_turnaround_projection\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">open_with</i> <b>Cubic Projection</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div><i class=\"fa_big fas fa-chevron-right\"></i><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">map</i> <b>UV Mapping</b>\n  \n  </div>\n</span>\n<p>Unwraps the UV map from the 6 sides of a cube.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/uv_turnaround_projection_solid.png?raw=true\" />\n  <figcaption>Mesh</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/uv_turnaround_projection_uv.png?raw=true\" />\n  <figcaption>UV</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-expand_selection\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">unfold_more_double</i> <b>Expand Selection</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Expands the selection with neighboring vertices.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-shrink_selection\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">unfold_less_double</i> <b>Shrink Selection</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools</b>\n  \n  </div>\n</span>\n<p>Shrinks the selection with neighboring vertices.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n\n</div>\n</section>\n\n\n### Modeling Operators\nFor applying modifications on selected meshes.\n\n<section id=\"mesh_tools-action-subdivide\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">content_cut</i> <b>Subdivide</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Operators</b>\n  \n  </div>\n</span>\n<p>Splits the faces of a mesh into smaller faces, giving it a smooth appearance.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/subdivide_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/subdivide_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-split_edges\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">vertical_split</i> <b>Split Edges</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Operators</b>\n  \n  </div>\n</span>\n<p>Splits and duplicates edges within a mesh, breaking 'links' between faces around those split edges.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/split_edges.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-scatter\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">scatter_plot</i> <b>Scatter</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Operators</b>\n  \n  </div>\n</span>\n<p>Scatters selected meshes on the active mesh.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/scatter.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-array_elements\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-layer-group\"></i> <b>Array</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Operators</b>\n  \n  </div>\n</span>\n<p>Generates an array of copies of the base object, with each copy being offset from the previous one.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/array.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-boolean\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-object-group\"></i> <b>Boolean</b>\n  <span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-confirm);\n\tcolor: var(--color-confirm);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">NEW</span>\n<span style=\"\n\tborder: max(1px, 0.0625rem) solid var(--color-warning);\n\tcolor: var(--color-warning);\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">EXPERIMENTAL</span>\n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Operators</b>\n  \n  </div>\n</span>\n<p>Performs a boolean operation on two selected meshes.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\nResult with boolean operation \"Subtraction (A - B)\".\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/boolean_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/boolean_1_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\nResult with boolean operation \"Intersection (A ∩ B)\".\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/boolean_before.png?raw=true\" />\n  <figcaption>Input</figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/boolean_2_after.png?raw=true\" />\n  <figcaption>Result</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n### Mesh Generators\nFor procedural mesh generation\n\n<section id=\"mesh_tools-action-terrain_action\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">terrain</i> <b>Terrain</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div>\n</span>\n<p>Generates terrains procedurally with fully customized settings.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/terrain_solid.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/terrain_wire.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-terrainse\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">draw</i> <b>Terrain Style Editor</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div>\n</span>\n<p>Configure the Custom color gradient style of the terrain generator.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-textmesh\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">format_size</i> <b>Text Mesh</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div>\n</span>\n<p>Converts text into a 3D object, ideal for creating signs or logos.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/text.png?raw=true\" />\n  <figcaption>\"Butcher\" expressed in Chinese</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-xyzmathsurfacefunction\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-brain\"></i> <b>XYZ Math Surface</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div>\n</span>\n<p>Generates an xyz surface based on mathematical equations containing 23 pre-built presets!</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/xyz.png?raw=true\" />\n  <figcaption>Twisted Torus Preset</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-polyhedron\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">offline_bolt</i> <b>Polyhedron</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div><i class=\"fa_big fas fa-chevron-right\"></i><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-shapes\"></i> <b>Quick Primitives</b>\n  \n  </div>\n</span>\n<p>Generate a polyhedron such as an Icosahedron, a Dodecahedron, an Octahedron or a Tetrahedron.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/polyhedron.png?raw=true\" />\n  <figcaption>Icosahedron</figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<section id=\"mesh_tools-action-torusknot\" style=\"margin-top: 10px;\"> \n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"material-icons notranslate icon\">offline_bolt</i> <b>Torus Knot</b>\n  \n  </div>\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-vector-square\"></i> <b>MTools Generate</b>\n  \n  </div><i class=\"fa_big fas fa-chevron-right\"></i><div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  <i class=\"fa_big fas fa-shapes\"></i> <b>Quick Primitives</b>\n  \n  </div>\n</span>\n<p>Generate a Torus Knot with fully customized settings.</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/assets/actions/torus_knot.png?raw=true\" />\n  <figcaption></figcaption>\n  </figure>\n  </div>\n\t</div>\n\t\n</div>\n</section>\n\n\n<div style=\"display: flex; gap: 5px;padding-top:10px\">\n  &minus; &nbsp; <img width=\"25\" src=\"https://avatars.githubusercontent.com/u/82341209\"> Malik12tree\n</div>\n</div>\n"
  },
  {
    "path": "plugins/mesh_tools/changelog.json",
    "content": "{\n\t\"2.0.0\": {\n\t\t\"title\": \"2.0.0\",\n\t\t\"date\": \"2024-03-21\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added new Bridge Edge Loops action\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Triangles To Quadrilaterals: Improved algorithm\",\n\t\t\t\t\t\"Scatter: Scattered elements more accurately follow surface rotation\",\n\t\t\t\t\t\"Expand/Shrink Selection: Extend functionality in face and edge selection modes\",\n\t\t\t\t\t\"Text Mesh: Support loading OpenType font files\",\n\t\t\t\t\t\"XYZ Surface Generator: Include variables as sliders\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.0.1\": {\n\t\t\"title\": \"2.0.1\",\n\t\t\"date\": \"2024-05-10\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Scatter: Added additional scatter settings\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Scatter: Fixed issue with undoing group creation\",\n\t\t\t\t\t\"Bridge Edge Loops: Fix issue with choosing best followup twist offset\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.0.2\": {\n\t\t\"title\": \"2.0.2\",\n\t\t\"date\": \"2024-05-11\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Text Mesh: Fixed issue where fonts wouldn't load\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.1.0\": {\n\t\t\"title\": \"2.1.0\",\n\t\t\"date\": \"2025-03-16\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added new Boolean operations action\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Enhance amend edit menus\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed amend edits for Poke and Triangles To Quadrilaterals actions\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Deprecations\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"UV Project From View: Deprecated in favor of UV > UV Project from View\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/mesh_tools/mesh_tools.js",
    "content": "(()=>{var C0=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ui=C0(()=>{});var _o={bevel:{docs:{private:!0},name:\"Bevel\",icon:\"rounded_corner\",description:\"Chamfers selected edges\",selection_mode:[\"edge\"]},laplacian_smooth:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"laplacian_smooth_before.png\",caption:\"word.before\"},{type:\"image\",src:\"laplacian_smooth_after.png\",caption:\"word.after\"}]}]},name:\"Laplacian Smooth\",icon:\"blur_on\",description:\"Smoothens selected vertices by averaging the position of neighboring vertices.\"},to_sphere:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"to_sphere_1_before.png\",caption:\"word.before\"},{type:\"image\",src:\"to_sphere_1_after.png\",caption:\"word.after\"}]},{type:\"inset_row\",items:[{type:\"image\",src:\"to_sphere_2_before.png\",caption:\"word.before\"},{type:\"image\",src:\"to_sphere_2_after.png\",caption:\"word.after\"}]}]},name:\"To Sphere\",icon:\"change_circle\",description:\"Casts selected vertices into a smooth, spherical shape with adjustable influence.\"},bridge_edge_loops:{docs:{flags:{new:!0},lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"bridge_edge_loops_before.png\",caption:\"word.before\"},{type:\"image\",src:\"bridge_edge_loops_1_after.png\",caption:\"word.after\"}]},\"Results with Blend Path enabled.\",{type:\"inset_row\",items:[{type:\"image\",src:\"bridge_edge_loops_before.png\",caption:\"word.before\"},{type:\"image\",src:\"bridge_edge_loops_2_after.png\",caption:\"word.after\"}]}]},name:\"Bridge Edge Loops\",icon:\"hub\",description:\"Connects multiple edge loops with faces.\",selection_mode:[\"edge\",\"face\"]},poke:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"poke_before.png\",caption:\"word.before\"},{type:\"image\",src:\"poke_after.png\",caption:\"word.after\"}]}]},name:\"Poke Faces\",icon:\"control_camera\",description:\"Generates a fan out of a face.\",selection_mode:\"face\"},tris_to_quad:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"tris_to_quad_before.png\",caption:\"word.before\"},{type:\"image\",src:\"tris_to_quad_after.png\",caption:\"word.after\"}]}]},name:\"Triangles To Quadrilaterals\",icon:\"fas.fa-external-link-square-alt\",description:\"Attempts to merge adjacent triangles into quadrilaterals.\",selection_mode:\"face\"},triangulate:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"triangulate_before.png\",caption:\"word.before\"},{type:\"image\",src:\"triangulate_after.png\",caption:\"word.after\"}]}]},name:\"Triangulate Faces\",icon:\"pie_chart_outline\",description:\"Splits selected faces into triangles.\",selection_mode:\"face\"},uv_project_view:{docs:{flags:{deprecated:!0},lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"uv_project_view_solid.png\",caption:\"word.mesh\"},{type:\"image\",src:\"uv_project_view_uv.png\",caption:\"word.uv\"}]}]},name:\"Project From View\",icon:\"view_in_ar\",description:\"Projects the selected faces to the UV map from the camera. Use built-in under UV > UV Project from View\"},uv_turnaround_projection:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"uv_turnaround_projection_solid.png\",caption:\"word.mesh\"},{type:\"image\",src:\"uv_turnaround_projection_uv.png\",caption:\"word.uv\"}]}]},name:\"Cubic Projection\",icon:\"open_with\",description:\"Unwraps the UV map from the 6 sides of a cube.\"},uv_mapping:{name:\"UV Mapping\",icon:\"map\",children:[\"uv_project_view\",\"uv_turnaround_projection\"]},expand_selection:{name:\"Expand Selection\",icon:\"unfold_more_double\",description:\"Expands the selection with neighboring vertices.\",keybind:{key:\"l\",ctrl:!0}},shrink_selection:{name:\"Shrink Selection\",icon:\"unfold_less_double\",description:\"Shrinks the selection with neighboring vertices.\",keybind:{key:\"k\",ctrl:!0}},tools:{name:\"MTools\",icon:\"fas.fa-vector-square\",condition:\"NON_OBJECT_MODE\",children:[\"bridge_edge_loops\",\"to_sphere\",\"laplacian_smooth\",\"_\",\"poke\",\"tris_to_quad\",\"triangulate\",\"_\",\"uv_mapping\",\"_\",\"expand_selection\",\"shrink_selection\"]},operators:{name:\"MTools Operators\",icon:\"fas.fa-vector-square\",condition:\"OBJECT_MODE\",children:[\"subdivide\",\"split_edges\",\"_\",\"scatter\",\"array_elements\",\"_\",\"boolean\"]},subdivide:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"subdivide_before.png\",caption:\"word.before\"},{type:\"image\",src:\"subdivide_after.png\",caption:\"word.after\"}]}]},name:\"Subdivide\",icon:\"content_cut\",description:\"Splits the faces of a mesh into smaller faces, giving it a smooth appearance.\"},split_edges:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"split_edges.png\"}]}]},name:\"Split Edges\",icon:\"vertical_split\",description:\"Splits and duplicates edges within a mesh, breaking 'links' between faces around those split edges.\"},scatter:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"scatter.png\"}]}]},name:\"Scatter\",description:\"Scatters selected meshes on the active mesh.\",icon:\"scatter_plot\"},array_elements:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"array.png\"}]}]},name:\"Array\",icon:\"fas.fa-layer-group\",description:\"Generates an array of copies of the base object, with each copy being offset from the previous one.\"},boolean:{name:\"Boolean\",icon:\"fas.fa-object-group\",description:\"Performs a boolean operation on two selected meshes.\",docs:{flags:{new:!0,experimental:!0},lines:['Result with boolean operation \"Subtraction (A - B)\".',{type:\"inset_row\",items:[{type:\"image\",src:\"boolean_before.png\",caption:\"word.before\"},{type:\"image\",src:\"boolean_1_after.png\",caption:\"word.after\"}]},'Result with boolean operation \"Intersection (A \\u2229 B)\".',{type:\"inset_row\",items:[{type:\"image\",src:\"boolean_before.png\",caption:\"word.before\"},{type:\"image\",src:\"boolean_2_after.png\",caption:\"word.after\"}]}]}},generators:{name:\"MTools Generate\",icon:\"fas.fa-vector-square\",condition:\"MESH\",children:[\"terrain_action\",\"terrainse\",\"_\",\"textmesh\",\"xyzmathsurfacefunction\",\"quickprimitives\"]},terrain_action:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"terrain_solid.png\"},{type:\"image\",src:\"terrain_wire.png\"}]}]},name:\"Terrain\",icon:\"terrain\",description:\"Generates terrains procedurally with fully customized settings.\"},terrainse:{name:\"Terrain Style Editor\",icon:\"draw\",description:\"Configure the Custom color gradient style of the terrain generator.\"},textmesh:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"text.png\",caption:'\"Butcher\" expressed in Chinese'}]}]},name:\"Text Mesh\",icon:\"format_size\",description:\"Converts text into a 3D object, ideal for creating signs or logos.\"},xyzmathsurfacefunction:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"xyz.png\",caption:\"Twisted Torus Preset\"}]}]},name:\"XYZ Math Surface\",icon:\"fas.fa-brain\",description:\"Generates an xyz surface based on mathematical equations containing 23 pre-built presets!\"},quickprimitives:{name:\"Quick Primitives\",icon:\"fas.fa-shapes\",children:[\"polyhedron\",\"torusknot\"]},polyhedron:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"polyhedron.png\",caption:\"Icosahedron\"}]}]},name:\"Polyhedron\",icon:\"offline_bolt\",description:\"Generate a polyhedron such as an Icosahedron, a Dodecahedron, an Octahedron or a Tetrahedron.\"},torusknot:{docs:{lines:[{type:\"inset_row\",items:[{type:\"image\",src:\"torus_knot.png\"}]}]},name:\"Torus Knot\",icon:\"offline_bolt\",description:\"Generate a Torus Knot with fully customized settings.\"}};var Ri=\"<keys>\",M0=\"<subs>\",_r=class{constructor(t){this.id=t}#e(){return this.id.startsWith(\"@\")}qualifyKey(t){return this.#e()?`${this.id}/${t}`:`@${this.id}/${t}`}set(t,r){t=this.qualifyKey(t),localStorage.setItem(t,JSON.stringify(r))}delete(t){t=this.qualifyKey(t),localStorage.removeItem(t)}has(t){return t=this.qualifyKey(t),localStorage.hasOwnProperty(t)}get(t){t=this.qualifyKey(t);let r=localStorage.getItem(t);return r!=null?JSON.parse(r):null}update(t,r,n){let i=this.get(t)??n,s=r(i);return this.set(t,s)}},ln=new _r(Ri),Bi=new _r(M0),cn=class e extends _r{in(t){return Bi.update(this.id,r=>(r.safePush(t),r),[]),new e(this.qualifyKey(t))}constructor(t){console.assert(t!=Ri,`QualifiedStorage: id cannot be equal to ${JSON.stringify(Ri)}`),super(t)}set(t,r){ln.update(this.id,n=>(n.safePush(t),n),[]),super.set(t,r)}delete(t){ln.update(this.id,r=>{let n=r.indexOf(t);return n!=-1&&r.splice(n,1),r},[]),super.delete(t)}getAllKeys(){return ln.get(this.id)??[]}clear(){for(let r of this.getAllKeys())super.delete(r);let t=Bi.get(this.id)??[];for(let r of t)new e(this.qualifyKey(r)).clear();ln.delete(this.id),Bi.delete(this.id)}};var Xt=\"mesh_tools\",un=new cn(Xt);var qn=_o,k0={MESH:{modes:[\"edit\"],features:[\"meshes\"]},OBJECT_MODE:{modes:[\"edit\"],features:[\"meshes\"],method:()=>Mesh.selected.length&&BarItems.selection_mode.value==\"object\"},NON_OBJECT_MODE:{modes:[\"edit\"],features:[\"meshes\"],method:()=>Mesh.selected.length&&BarItems.selection_mode.value!=\"object\"}},Et=e=>e==\"_\"?e:`@${Xt}/${e}`;function P(e,t){console.assert(e in qn,e);let r=Object.assign({click:t},qn[e]);if(r.plugin=Xt,r.children&&(r.children=r.children.map(Et)),typeof r.condition==\"string\"&&(r.condition=k0[r.condition]),r.selection_mode){let n=r.condition;r.condition=()=>Mesh.selected.length&&(r.selection_mode instanceof Array?r.selection_mode.includes(BarItems.selection_mode.value):BarItems.selection_mode.value==r.selection_mode)&&Condition(n)}return r.keybind&&(r.keybind=new Keybind(r.keybind)),new Action(Et(e),r)}function wo(e){let t=-1,r=1/0;for(let n=0;n<e.length;n++){let i=e[n];i<=r&&(r=i,t=n)}return t}function Ui(e,t=r=>r){if(e.length==1)return e[0];if(e.length==0)return null;let r=null,n=1/0;for(let i of e){let s=t(i);s<=n&&(r=i,n=s)}return r}function fn(e,t,r){return e.map((n,i)=>Math.lerp(n,t[i],r))}function Oi(e,t=2){let r=[];for(let n=0;n<e.length;n++){let i=[];for(let s=0;s<t;s++){let o=e[(n+s)%e.length];i.push(o)}r.push(i)}return r}function jt(e,t){for(;t<0;)t+=e.length;for(;t>=e.length;)t-=e.length;let r=[];for(let n=0;n<e.length;n++)r[(n+t)%e.length]=e[n];e.splice(0,1/0,...r)}var Me=class{static VertexVertices(t){let r={};for(let n in t.faces){let i=t.faces[n];i.vertices.forEach(s=>{s in r||(r[s]=[]),i.vertices.forEach(o=>{o!=s&&r[s].safePush(o)})})}return r}static VertexFaces(t){let r={};for(let n in t.faces){let i=t.faces[n];for(let s of i.vertices)r[s]??=[],r[s].safePush(i)}return r}static EdgeFaces(t){let r={};for(let n in t.faces){let i=t.faces[n],s=i.getSortedVertices();for(let o=0;o<s.length;o++){let a=s[o],l=s[(o+1)%s.length],u=wr(a,l);r[u]??=[],r[u].safePush(i)}}return r}static VertexEdges(t){let r={};for(let n in t.faces){let s=t.faces[n].getSortedVertices();for(let o=0;o<s.length;o++){let a=s[o],l=s[(o+1)%s.length],u=wr(a,l);r[a]??=[],r[l]??=[],r[a].safePush(u),r[l].safePush(u)}}return r}};function Er(e){return e instanceof THREE.Vector3||e instanceof THREE.Vector2?\"x\":e instanceof Array?0:null}function Ar(e){return e instanceof THREE.Vector3||e instanceof THREE.Vector2?\"y\":e instanceof Array?1:null}function Cr(e){return e instanceof THREE.Vector3?\"z\":e instanceof Array?2:null}function Ke(e){return e[Er(e)]}function Ze(e){return e[Ar(e)]}function At(e){return e[Cr(e)]??0}function pn(e,t){return e[Er(e)]+=t[Er(t)],e[Ar(e)]+=t[Ar(t)],e[Cr(e)]+=t[Cr(t)],e}function Eo(e,t){return e[Er(e)]-=t[Er(t)],e[Ar(e)]-=t[Ar(t)],e[Cr(e)]-=t[Cr(t)],e}function Fr(e,t){return Math.hypot(Ke(e)-Ke(t),Ze(e)-Ze(t),At(e)-At(t))}function Ao(e){return Ke(e)===0&&Ze(e)===0&&At(e)===0}var I0=new THREE.Euler,B0=new THREE.Quaternion,Di=new THREE.Vector3,Co=new THREE.Vector3,Fo=new THREE.Vector3,R0=new THREE.Vector3,ut=new THREE.Vector3,cu=new THREE.Vector2,uu=new THREE.Vector2(1,0),Pi={};for(let e=0;e<256;e++)Pi[[e,0]]=e/255;var Ct=new THREE.Object3D;Ct.rotation.order=\"XYZ\";function Ni(e,t=new THREE.Euler,{rotateX:r=0,rotateY:n=0,rotateZ:i=0}={}){return Ct.lookAt(e),Ct.rotateX(Math.degToRad(90)),Ct.rotateX(r),Ct.rotateY(n),Ct.rotateZ(i),t.copy(Ct.rotation),t}function Mr(e,t,r){return Di.set(Ke(e),Ze(e),At(e)),Co.set(Ke(t),Ze(t),At(t)),Fo.set(Ke(r),Ze(r),At(r)),R0.crossVectors(Co.sub(Di),Fo.sub(Di)).clone()}function hn(e){let t=\"\";for(let r=4;r<e.length-1;r++)t+=e[r];return t=t.split(\",\"),new THREE.Color(t[0]/255,t[1]/255,t[2]/255)}function U0(e){let t=3,r=2.7;return Math.pow(e,t)/(Math.pow(e,t)+Math.pow(r-r*e,t))}function Mo(e,t,r,n,i){let s=e/r*2-1,o=t/n*2-1;return U0(Math.max(Math.abs(s),Math.abs(o)))}function ko(e){return-(Math.cos(Math.PI*e)-1)/2}function O0(e,t){return[e[(t+1+e.length)%e.length],e[t],e[(t-1+e.length)%e.length]]}function Li(e,t,r){return Math.sign((e.x-r.x)*(t.y-r.y)-(t.x-r.x)*(e.y-r.y))}function D0(e,t,r,n){let i=Li(e,t,r),s=Li(e,r,n),o=Li(e,n,t),a=i<0||s<0||o<0,l=i>0||s>0||o>0;return!(a&&l)}function L0(e){if(e.length<=2)return!0;let t=0;for(let r=0;r<e.length;r++){let n=e[r],i=e[(r+1)%e.length];t+=(Ke(i)-Ke(n))*(Ze(i)-Ze(n))}return t>=0}function P0(e){if(e.length<3)throw new Error(\"projectIntoOwnPlane(): Polygon should have 3 or more vertices!\");let t=new THREE.Plane;return t.setFromCoplanarPoints(e[0],e[1],e[2]),N0(e,t)}function N0(e,t){let r=Ni(t.normal,I0),n=B0.setFromEuler(r);return n.invert(),e instanceof Array?e.map(i=>(ut.copy(i),ut.applyQuaternion(n),new THREE.Vector2(ut.x,ut.z))):(ut.copy(e),ut.applyQuaternion(n),new THREE.Vector2(ut.x,ut.z))}function Io(e){let t=e.map(l=>l.V3_toThree()),r=Array.from(Array(t.length).keys()),n=[],i=P0(t),s=L0(i),o=100,a=0;for(;r.length>3&&a<=o;){for(let l=0;l<r.length;l++){let[u,c,f]=O0(r,l),q=i[f].clone().sub(i[u]),p=i[c].clone().sub(i[u]),d=q.x*p.z-q.z*p.x;if(s?d<=0:d>=0)continue;let m=!1;for(let h=0;h<i.length&&!(!(h===u||h===c||h===f)&&(m=D0(i[h],i[u],i[c],i[f]),m));h++);if(!m){n.push([u,c,f].sort((h,g)=>g-h)),r.splice(l,1);break}}a++}return n.push(r.sort((l,u)=>u-l)),n}function Bo(e,t,r,n){let i=e.project(t);return i.x=(i.x+1)/2*r,i.y=-(i.y-1)/2*n,i}function Ro(){return Math.min(Project._texture_width,Project._texture_height)}function dn(e){return[e[0],e[1]]}function mn(e){let t=e.uv,r=[0,0,0],n=0;for(let i in t){let s=t[i];r.V3_add(s),n++}return r.V3_divide(n+1e-5),dn(r)}function Yt(e,t){return Object.defineProperty(e,t,{configurable:!1,writable:!1}),e}function Uo(e){return e.split(/[_\\s]+/g).map(t=>t[0].toUpperCase()+t.slice(1)).join(\" \")}function Oo(e){for(let r=0;r<e.length;r++)for(let n=r+1;n<e.length;n++)if(e[r][0]===e[n][0]&&e[r][1]===e[n][1]&&e[r][2]===e[n][2])return!1;let t;for(let r=0;r<e.length;r++){let n=e[(r-1+e.length)%e.length],i=e[r],s=e[(r+1)%e.length],o=n.V3_toThree().sub(i.V3_toThree()),a=s.V3_toThree().sub(i.V3_toThree()),l=o.cross(a),u=l.x-l.y-l.z>0;if(t!==void 0&&u!==t)return!1;t=u}return!0}function vn(e,t){let r=[],n=[],i=new Set;for(let s in e.faces){let o=e.faces[s];if(o.vertices.length<2)continue;!o.vertices.some(u=>!t.has(u))&&r.push(s);let l=o.getSortedVertices();for(let u=0;u<l.length;u++){let c=l[u],f=l[(u+1)%l.length];if(c==f)continue;let q=wr(c,f);i.has(q)||(i.add(q),t.has(c)&&t.has(f)&&n.push([c,f]))}}return{edges:n,faces:r}}function Kt(e,t){if(!Project)throw new Error(\"selectFacesAndEdgesByVertices(): An open project is required before calling!\");let{edges:r,faces:n}=vn(e,t),i=Array.from(t);switch(e.getSelectedVertices().splice(0,1/0,...i),BarItems.selection_mode.value){case\"vertex\":break;case\"edge\":e.getSelectedEdges().splice(0,1/0,...r),e.getSelectedFaces().splice(0,1/0);break;case\"cluster\":case\"face\":e.getSelectedFaces().splice(0,1/0,...n),e.getSelectedEdges().splice(0,1/0);break}}function wr(e,t){if(t<e){let r=e;e=t,t=r}return`${e}_${t}`}function Do(e){return e.split(\"_\")}function Lo(e){let{edges:t}=vn(e,new Set(e.getSelectedVertices())),r={},n={},i=Me.EdgeFaces(e);for(let[s,o]of t){let a=wr(s,o);if(r[a]??=0,n[a]??=0,a in i){n[a]=i[a].length;for(let l of i[a])l.isSelected()&&(r[a]+=1)}}return{connectedCount:n,selectedConnectedCount:r}}function zi(e,t={}){let n=Object.assign({},{fontSize:50,fontFamily:\"Arial\",fillStyle:\"red\",textAlign:\"center\"},t),i=document.createElement(\"canvas\"),s=i.getContext(\"2d\"),o=`${n.fontSize}px ${n.fontFamily}`,a=n.fontSize;s.font=o,i.width=s.measureText(e).width+a*.2,i.height=a*1.5,s.font=o,s.fillStyle=n.fillStyle,s.textAlign=n.textAlign,s.fillText(e,i.width/2,i.height/2+a/3);let l=new THREE.Texture(i);l.needsUpdate=!0;let u=new THREE.SpriteMaterial({map:l}),c=new THREE.Sprite(u);return c.scale.set(i.width/100,i.height/100,1),c}function z0(e,t){let r=[];for(let n in e.faces){let i=e.faces[n];i.vertices.includes(t)&&r.push(i)}return r}function Po(e,t){let r=z0(e,t);if(r.length==0)return null;let n=new THREE.Vector3;for(let i of r){let s=i.getNormal(!0);n.x+=s[0],n.y+=s[1],n.z+=s[2]}return n.divideScalar(r.length),n}function No(e){let t=new THREE.Vector3;for(let r of e)pn(t,r);return t.divideScalar(e.length),t}function G0(e,t,r,n){if(Ao(n))return e.copy(r),0;let i=new THREE.Vector3;i.subVectors(t,r);let s=i.dot(n)/n.dot(n);return e.copy(r).addScaledVector(n,s),s}function zo(e,t,r,n){let i=new THREE.Vector3;return i.subVectors(n,r),G0(e,t,r,i)}function gn(e,t,r,n,i){return e=Math.clamp(e,0,1),(1-e)**3*t+3*(1-e)**2*e*r+3*(1-e)*e**2*n+e**3*i}function V0(e,t,r,n){let i=t.dot(n),s=1.333333,o;if(i<0){let a=1+i;s=s*a+.75*(1-a)}{let a=new THREE.Vector3().crossVectors(t,n);a.lengthSq()>Number.MIN_VALUE?(a.add(e),zo(a,r,e,a)):a.copy(e),o=a.distanceTo(r)}return o*.5*s}function H0(e,t,r){for(let n=0;n<t.length;n++){let i=t[n],s=r[Math.min(n,r.length-1)],o=i[0],a=i[1],l=s[1],u=s[0],c=Fr(e.vertices[a],e.vertices[o]),f=Fr(e.vertices[o],e.vertices[u]),q=new MeshFace(e,{vertices:[a,o,u,l],uv:{[a]:[0,0],[o]:[c,0],[u]:[c,f],[l]:[0,f]}});e.addFaces(q)}}function W0(e,t,r,n,i,{twist:s,numberOfCuts:o,blendPath:a,blendInfluence:l,reverse:u}){if(t.length<3||r.length<3)return;t=t.map(h=>h.slice()),r=r.map(h=>h.slice());let c=Ho(t,r,e);jt(r,c);let f=r.map(h=>h.slice().reverse()).reverse(),q=Ho(t,f,e);jt(f,q),Vo(e,t,u?r:f)<Vo(e,t,u?f:r)&&(r=f);let p,d,v;if(a){v=new THREE.Vector3().subVectors(i,n);let h=Mr(e.vertices[t[0][0]],e.vertices[t[1][0]],e.vertices[t[2][0]]).normalize(),g=Mr(e.vertices[r[0][0]],e.vertices[r[1][0]],e.vertices[r[2][0]]).normalize();v.dot(h)<0&&h.negate(),v.dot(g)>0&&g.negate();let x=V0(n,h,i,g)*l;p=h.clone(),p.setLength(x),p.add(n),d=g.clone(),d.setLength(x),d.add(i)}let m=[];jt(r,s);for(let h=0;h<o;h++){let g=h/(o-1),x=[],b=fn(n.toArray(),i.toArray(),g),y=fn(n.toArray(),i.toArray(),g);for(let _=0;_<t.length;_++){let T=t[_],S=r[Math.min(_,r.length-1)];if(h==0)x.push(T[0]);else if(h==o-1)x.push(S[0]);else{let E=fn(e.vertices[T[0]],e.vertices[S[0]],g);if(p&&d){let w=E.V3_toThree();Eo(w,b);let F=[gn(g,n.x,p.x,d.x,i.x),gn(g,n.y,p.y,d.y,i.y),gn(g,n.z,p.z,d.z,i.z)];pn(w,F),E[0]=w.x,E[1]=w.y,E[2]=w.z}x.push(e.addVertices(E)[0])}}m.push(Oi(x,2))}for(let h=0;h<m.length-1;h++){let g=m[h],x=m[h+1];H0(e,g,x)}}function Go(e,t,r,n,i,s,o){Undo.initEdit({elements:Mesh.selected,selection:!0},e);for(let a of Mesh.selected){let l;if(BarItems.selection_mode.value==\"face\"){l=new Set;let d=new Set,{selectedConnectedCount:v,connectedCount:m}=Lo(a);for(let h in v){let[g,x]=Do(h),b=v[h],y=m[h];b==1&&(d.add(h),l.add(g),l.add(x),y==1&&n&&a.addFaces(new MeshFace(a,{vertices:[g,x]})))}if(n){let h=new Set;for(let g of a.getSelectedVertices())l.has(g)||h.add(g);for(let g of h)delete a.vertices[g];for(let g of a.getSelectedFaces())delete a.faces[g]}Kt(a,l)}else l=new Set(a.getSelectedVertices());let u=[],{edges:c}=vn(a,l),f=new Set;for(let d of c){if(f.has(d))continue;f.add(d);let v=[d];for(;;){let m=v.last(),h;for(let g of c)if(!v.includes(g)&&(g[0]==m[0]||g[1]==m[0]||g[1]==m[1]||g[0]==m[1])){h=g;break}if(!h||f.has(h))break;f.add(h),v.push(h)}for(let m=0;m<v.length;m++){let h=v[m],g=v[(m+1)%v.length];h[1]!=g[0]&&g.reverse()}u.push(v)}if(u.length<2)continue;for(let d=0;d<u.length;d++)u[d]={loop:u[d],centroid:No(u[d].map(v=>a.vertices[v[0]]))};let q=Ui(u,d=>d.centroid.length());u.remove(q);let p=[q];for(a.addVertices(p[0].centroid.toArray());u.length;){let d=p.last(),v=Ui(u,m=>m.centroid.distanceToSquared(d.centroid));p.push(v),u.remove(v)}for(let d=0;d<p.length-1;d++){let{centroid:v,loop:m}=p[d],{centroid:h,loop:g}=p[d+1];W0(a,m,g,v,h,{twist:r,numberOfCuts:t,blendPath:i,blendInfluence:s,reverse:o})}}Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0}}),Undo.finishEdit(\"MTools: Bridged Edge Loops.\")}var mu=P(\"bridge_edge_loops\",()=>{Go(!1,2,0,!0,!0,1,!1),Undo.amendEdit({num_cuts:{type:\"number\",label:\"Number Of Cuts\",min:1,value:1},twist:{type:\"number\",label:\"Twist\",value:0},blend_influence:{type:\"range\",label:\"Smoothness\",value:100,min:-200,max:200},blend_path:{type:\"checkbox\",label:\"Blend Path\",value:!0},cut_holes:{type:\"checkbox\",label:\"Cut Holes\",value:!0,condition:()=>BarItems.selection_mode.value==\"face\"}},e=>{Go(!0,e.num_cuts+1,e.twist,e.cut_holes,e.blend_path,e.blend_influence/100,e.reverse)})});function Vo(e,t,r){let n=0;for(let i=0;i<t.length;i++){let[s]=t[i],[o]=r[Math.min(i,r.length-1)];n+=Fr(e.vertices[s],e.vertices[o])}return n}function Ho(e,t,r){let n=0,i=1/0;e:for(let s=0;s<t.length;s++){let o=0;for(let a=0;a<e.length;a++){let[l]=e[a],[u]=t[Math.min(a,t.length-1)];if(o+=Fr(r.vertices[l],r.vertices[u]),o>i){jt(t,1);continue e}}o<=i&&(n=s,i=o),jt(t,1)}return n}var yu=P(\"expand_selection\",()=>{Mesh.selected.forEach(e=>{let t=Me.VertexVertices(e),r=e.getSelectedVertices(),n=new Set(r);for(let i of r){let s=t[i];if(s)for(let o of s)n.add(o)}Kt(e,n)}),Canvas.updateView({elements:Mesh.selected,selection:!0})});function Wo(e=!1,t=1,r=1){Undo.initEdit({elements:Mesh.selected,selection:!0},e),Mesh.selected.forEach(n=>{if(!t||!r)return;let{vertices:i}=n,s=Me.VertexVertices(n),o=n.getSelectedVertices(),a={};for(let l=0;l<r;l++){for(let u of o)a[u]=n.vertices[u].slice();for(let u of o){let c=s[u],f=[0,0,0];for(let q of c){let p=a[q];f.V3_add(p)}f.V3_divide(c.length),i[u]=i[u].map((q,p)=>Math.lerp(q,f[p],t))}}}),Undo.finishEdit(\"MTools: Laplacian Smooth selected vertices\"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Tu=P(\"laplacian_smooth\",()=>{Wo(),Undo.amendEdit({influence:{type:\"range\",value:100,label:\"Influence\",min:0,max:100},iterations:{type:\"range\",value:1,label:\"Iterations\",min:1,max:10}},e=>Wo(!0,e.influence/100,e.iterations))});function Xo(e,t,r,n){Undo.initEdit({elements:e,selection:!0},r),e.forEach((i,s)=>{t[s].forEach(a=>{let l=i.faces[a],u=l.getNormal(!0).V3_multiply(n),c=i.addVertices(l.getCenter().V3_add(u))[0],f=l.getSortedVertices();for(let q=0;q<f.length;q++){let p=f[q],d=f[(q+1)%f.length],v=new MeshFace(i,l).extend({vertices:[p,d,c]});v.uv[c]=mn(l),i.addFaces(v)}delete i.faces[a]})}),Undo.finishEdit(\"MTools: Poke mesh face selection\"),Canvas.updateView({elements:e,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Eu=P(\"poke\",()=>{let e=Mesh.selected.slice(),t=e.map(r=>r.getSelectedFaces().slice());Xo(e,t,!1,0),Undo.amendEdit({depth:{type:\"number\",value:0,label:\"Depth\"}},r=>{Xo(e,t,!0,r.depth)})});var Mu=P(\"shrink_selection\",()=>{Mesh.selected.forEach(e=>{let t=Me.VertexVertices(e),r=e.getSelectedVertices(),n=new Set(r);for(let i of r){let s=t[i];for(let o of s)if(!n.has(o)){n.delete(i);break}}Kt(e,n)}),Canvas.updateView({elements:Mesh.selected,selection:!0})});function jo(e,t=100){t/=100,Undo.initEdit({elements:Mesh.selected,selection:!0},e),Mesh.selected.forEach(r=>{let n=[0,0,0],i=r.getSelectedVertices(),s=[],o=[0,0,0];i.forEach(a=>{s.push(r.vertices[a]),n.V3_add(r.vertices[a])}),n.V3_divide(i.length);for(let a=0;a<3;a++)s.sort((l,u)=>l[a]-u[a]),o[a]=s.last()[a]-s[0][a];o.V3_divide(2),i.forEach(a=>{let l=r.vertices[a],u=l.V3_subtract(n).V3_toThree().normalize().toArray().V3_multiply(o).V3_add(n).V3_toThree(),c=l.V3_add(n).V3_toThree().lerp(u,t).toArray();r.vertices[a]=c})}),Undo.finishEdit(\"MTools: Spherize mesh selection\"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Iu=P(\"to_sphere\",()=>{jo(!1,100),Undo.amendEdit({influence:{type:\"range\",value:100,label:\"Influence\",min:0,max:100}},e=>{jo(!0,e.influence)})});var Uu=P(\"triangulate\",()=>{Undo.initEdit({elements:Mesh.selected,selection:!0}),Mesh.selected.forEach(e=>{e.getSelectedFaces().forEach(t=>{let r=e.faces[t],n=r.getSortedVertices();if(!(n.length<=3)){let i=Io(n.map(s=>e.vertices[s]),r.getNormal(!0));for(let s=0;s<i.length;s++){let o=new MeshFace(e,r).extend({vertices:[n[i[s][0]],n[i[s][2]],n[i[s][1]]]});e.addFaces(o)}delete e.faces[t]}})}),Undo.finishEdit(\"MTools: Triangulate mesh face selection\"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})});function Yo(e,t,r,n,i){Undo.initEdit({elements:e,selection:!0},i),e.forEach((s,o)=>{let a=t[o];a.forEach(l=>{let u=s.faces[l];if(!u||u.vertices.length!=3)return;let c=u.getSortedVertices().slice(),f=u.getNormal(!0),q=[],p=[],d=[],v=[];for(let w=0;w<3;w++){let F=u.getAdjacentFace(w);if(!F)continue;let C=F.face,M=F.key,k=F.edge;if(C.vertices.length==3){if(p.length>1&&p.last()==p[w])break;a.includes(M)&&(p.push(C),q.push(k),d.push(M),v.push(w))}}let m=p.map(w=>u.getAngleTo(w)),h=wo(m);if(h==-1)return;let g=m[h],x=p[h],b=d[h],y=q[h];if(g>r)return;let _=x.getSortedVertices().slice(),T=c.find(w=>!_.includes(w));if(!T)return;_.splice(v[h]+1,0,T);let S=new MeshFace(s,{vertices:_}),E=S.getNormal(!0);if(Oo(S.getSortedVertices().map(w=>s.vertices[w]))){if(E.V3_toThree().dot(f.V3_toThree())<0&&S.invert(),n){for(let w of y)if(!(Math.roundTo(u.uv[w][0],5)==Math.roundTo(x.uv[w][0],5)&&Math.roundTo(u.uv[w][1],5)==Math.roundTo(x.uv[w][1],5)))return}S.uv=x.uv,u.uv[T]instanceof Array&&(S.uv[T]=u.uv[T]);for(let w of S.vertices)S.uv[w]??=[0,0];S.texture=u.texture,s.addFaces(S),delete s.faces[b],delete s.faces[l]}})}),Undo.finishEdit(\"MTools: Convert selected Triangles to Quads\"),Canvas.updateView({elements:e,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var Pu=P(\"tris_to_quad\",()=>{let e=Mesh.selected.slice(),t=e.map(r=>r.getSelectedFaces().slice());Yo(e,t,45,!0,!1),Undo.amendEdit({max_angle:{label:\"Max Angle\",value:45,min:0,max:180,type:\"range\"},ignore_disjoint_uvs:{label:\"Ignore Disjoint UVs\",value:!0,type:\"checkbox\"}},r=>Yo(e,t,r.max_angle,r.ignore_disjoint_uvs,!0))});var zu=P(\"uv_mapping\");var xn=un.in(\"dont_show_again_info_storage\");function yn(e,t,r){if(xn.has(e))return;let n=Blockbench.showMessageBox({title:t,message:r,icon:\"info\",checkboxes:{dont_show_again:{value:!1,text:\"dialog.dontshowagain\"}},buttons:[\"dialog.ok\"]},(i,{dont_show_again:s})=>{s&&xn.set(e,!0)})}function Ko(e,t,r){return xn.has(e)?!0:new Promise(n=>{Blockbench.showMessageBox({title:t,message:r,icon:\"warning\",checkboxes:{dont_show_again:{value:!1,text:\"dialog.dontshowagain\"}},buttons:[\"dialog.ok\",\"dialog.cancel\"]},(i,{dont_show_again:s})=>{s&&xn.set(e,!0),n(i===0)})})}function bn(e,t=2e3){throw Blockbench.showQuickMessage(e,t),e}function Zo(e,t,r){let{width:n,height:i,camera:s}=e;Undo.initEdit({elements:Mesh.selected,selection:!0,uv_only:!0,uv_mode:!0},r);let o=t?i/n:Math.max(n,i)/Math.min(n,i);Mesh.selected.forEach(a=>{a.getSelectedFaces().forEach(l=>{let u=a.faces[l];u.vertices.forEach(c=>{let f=a.mesh.localToWorld(a.vertices[c].V3_toThree()),q=Bo(f,s,n,i);u.uv[c]=[q.x/n*Project.texture_width,q.y/i*Project.texture_height*o]})})}),Undo.finishEdit(\"MTools: Unwrap mesh face selection uv from view\",{uv_only:!0,uv_mode:!0}),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0}),updateSelection()}var ju=P(\"uv_project_view\",()=>{let e=Canvas.getHoveredPreview();Zo(e,!0,!1),yn(\"uv_project_view\",\"Deprecation Notice\",\"UV Project View is deprecated and will be removed from MTools. It's now built into Blockbench under <br> <code>UV > UV Project from View</code>.\"),Undo.amendEdit({preserve_aspect:{type:\"checkbox\",value:!0,label:\"Preserve Aspect\"}},t=>Zo(e,t.preserve_aspect,!0))});function Qo(e,t,r){Undo.initEdit({elements:Mesh.selected,selection:!0,uv_only:!0,uv_mode:!0},r),Mesh.selected.forEach(n=>{if(n.getSelectedFaces().length){let i=[],s={min:[0,0,0],max:[0,0,0]},o={\"1,0,0\":[],\"-1,0,0\":[],\"0,1,0\":[],\"0,-1,0\":[],\"0,0,1\":[],\"0,0,-1\":[]};n.getSelectedFaces().forEach(c=>{let f=n.faces[c],q=f.getNormal(!0);f.vertices.forEach(g=>{i.push(n.vertices[g])});let p=q[0],d=q[1],v=q[2],m=[0,0,0],h=Math.max(Math.abs(q[0]),Math.abs(q[1]),Math.abs(q[2]));h==p*Math.sign(q[0])?m=[Math.sign(p),0,0]:h==d*Math.sign(q[1])?m=[0,Math.sign(d),0]:h==v*Math.sign(q[2])&&(m=[0,0,Math.sign(v)]),f.vertices.length>=3&&o[m.toString()].push(c)});for(let c=0;c<3;c++)i.sort((f,q)=>q[c]-f[c]),s.max[c]=i[0][c]+1e-4,s.min[c]=i.last()[c]-i[0][c]+1e-4;let a=0,l=Ro(),u=1-e/100;for(let c in o)a++,o[c].forEach(f=>{let q=n.faces[f],p=c.replace(\"-\",\"\").replaceAll(\",\",\"\");p=p==\"100\"?[2,1]:p==\"010\"?[0,2]:[0,1],q.vertices.forEach(d=>{let v=[(s.max[p[0]]-n.vertices[d][p[0]]+1e-4)*u/-s.min[p[0]],(s.max[p[1]]-n.vertices[d][p[1]]+1e-4)*u/-s.min[p[1]]];t&&(v[0]*=.33,v[1]*=.33,v[0]-=1e-4,v[1]-=1e-4,v[0]+=a%3*.33,v[1]+=a>3?.33:0),v[0]*=l,v[1]*=l,n.faces[f].uv[d]=v})})}}),Undo.finishEdit(\"MTools: Unwrap mesh face selection (cubic projection)\",{uv_only:!0,uv_mode:!0}),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0}),updateSelection()}var Zu=P(\"uv_turnaround_projection\",()=>{Qo(.1,!0,!1),Undo.amendEdit({margin:{type:\"number\",value:0,label:\"Margin\",min:0,max:100},split:{type:\"checkbox\",label:\"Split\",value:!0}},e=>{Qo(e.margin,e.split,!0)})});var e9=P(\"tools\");function Jo(e,t=[1,0,0],r=1,n=!1){t=t.V3_toThree();let i=[];Undo.initEdit({elements:i,selection:!0},n),e.forEach(s=>{let o=new THREE.Vector3;s.mesh.geometry.boundingBox.getSize(o);for(let a=0;a<r;a++){let l=s.duplicate();l.moveVector(t.clone().multiplyScalar(a+1).multiply(o)),i.push(l)}}),Undo.finishEdit(\"MTools: Array selected meshes\")}var n9=P(\"array_elements\",()=>{let e=Mesh.selected;e.forEach(t=>{t.mesh.geometry.computeBoundingBox()}),Jo(e),Undo.amendEdit({x:{type:\"number\",value:1,label:\"OffsetX\",step:.1},y:{type:\"number\",value:0,label:\"OffsetY\",step:.1},z:{type:\"number\",value:0,label:\"OffsetZ\",step:.1},count:{type:\"number\",value:1,label:\"Count\",min:0,max:50}},t=>{Jo(e,[t.x,t.y,t.z],t.count,!0)})});var $o={\"word.before\":\"Input\",\"word.after\":\"Result\",\"word.mesh\":\"Mesh\",\"word.uv\":\"UV\"};function i3(){return $o}function s3(e){return e.replace(/[a-zA-Z_][a-zA-Z0-9_\\.]+/g,t=>i3($o)[t]??t)}var o3=e=>`https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/${e}?raw=true`;function a3({src:e,caption:t=\"\"}){return`\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"${o3(`assets/actions/${e}`)}\" />\n  <figcaption>${s3(t)}</figcaption>\n  </figure>\n  `}function l3(e){return`<content>${e}</content>`}function c3({items:e}){return`<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t${e.map(t=>`<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">${Gi(t)}</div>`).join(`\n`)}\n\t</div>\n\t`}function Gi(e){if(typeof e==\"string\")return e;switch(e.type){case\"image\":return a3(e);case\"overflow\":return l3(e);case\"inset_row\":return c3(e);default:throw new Error(`Unknown line type: ${e.type}`)}}var u3=new THREE.Euler,q3=new THREE.Vector3,f3=new THREE.Vector3,p3=new THREE.Vector3,h3=new THREE.Vector3,d3=new THREE.Vector3;function e1(e,t,{density:r=3,min_distance:n=0,scale:i=100,min_scale:s=100,scale_factor:o=50,rotation:a=0,rotation_factor:l=0},u=!1){let c=[];i/=100,s/=100,o/=100,l/=100;let f=n**2;Undo.initEdit({outliner:!0,elements:[],selection:!0},u);let q=e.mesh,p=q.geometry.getIndex(),d=q.geometry.getAttribute(\"position\"),v=p.count,m=[];for(let g=0;g<r;g++){let x=Math.floor(Math.random()*v/3)*3,b=q3.set(d.getX(p.getX(x)),d.getY(p.getX(x)),d.getZ(p.getX(x))),y=f3.set(d.getX(p.getY(x)),d.getY(p.getY(x)),d.getZ(p.getY(x))),_=p3.set(d.getX(p.getZ(x)),d.getY(p.getZ(x)),d.getZ(p.getZ(x)));q.localToWorld(b),q.localToWorld(y),q.localToWorld(_);let T=h3.lerpVectors(b,y,Math.random()),S=d3.lerpVectors(b,_,Math.random()),E=new THREE.Vector3().lerpVectors(T,S,Math.random());if(m.find(I=>I.distanceToSquared(E)<f))continue;m.push(E);let w=t[Math.floor(t.length*Math.random())].duplicate();w.removeFromParent(),w.parent=\"root\";let F=Math.lerp(i,Math.lerp(s,1,Math.random())*i,o),C=l*(Math.random()*2-1)*a;for(let I in w.vertices)w.vertices[I].V3_multiply(F);let M=Mr(b,y,_),k=Ni(M,u3,{rotateY:Math.degToRad(C)});w.rotation[0]=Math.radToDeg(k.x),w.rotation[1]=Math.radToDeg(k.y),w.rotation[2]=Math.radToDeg(k.z),w.origin=E.toArray(),c.push(w)}let h=new Group({name:\"instances_on_\"+e.name});c.forEach(g=>{g.addTo(h)}),h.init(),Undo.finishEdit(\"MTools: Scatter meshes\",{outliner:!0,elements:c,selection:!0}),Canvas.updateAll()}var c9=P(\"scatter\",function(){if(Mesh.selected.length<2){Blockbench.showQuickMessage(\"At least two meshes must be selected\");return}yn(\"scatter_pivot\",\"Good To Know\",[\"Scattered meshes are <b>relative</b> to their <u>pivot points</u> on the target surface.\",Gi({type:\"inset_row\",items:[{type:\"image\",src:\"scatter_pivot_1.png\",caption:\"Pivot point located on the bottom\"},{type:\"image\",src:\"scatter_pivot_2.png\",caption:\"Pivot point located far down\"}]})].join(`\n`));let e=Mesh.selected.last();e.unselect();let t=Mesh.selected.slice();e1(e,t,{}),Undo.amendEdit({density:{type:\"number\",value:3,label:\"Max Density\",min:0,max:256},min_distance:{type:\"number\",value:0,label:\"Min Distance\",min:0},scale:{type:\"range\",value:100,label:\"Scale\",min:0,max:100},min_scale:{type:\"range\",value:100,label:\"Min Scale\",min:0,max:100},scale_factor:{type:\"range\",value:50,label:\"Scale Randomness\",min:0,max:100},rotation:{type:\"range\",value:0,label:\"Max Rotation\",min:0,max:180},rotation_factor:{type:\"range\",value:0,label:\"Rotation Randomness\",min:0,max:100}},r=>{e1(e,t,r,!0)})});var ke=class e{static all=[];constructor(t,r){this.key=r,this.bbFace=t,this.facePoint=t.getCenter(),this.uuid=guid(),this.facePointKey=t.mesh.addVertices(this.facePoint)[0],this.edgePoints=[],this.vertices=[],e.all.push(this)}for(t){return this.bbFace.vertices.includes(t)}},Ve=class e{static all=[];constructor(t,r,n,i){this.vertexA=t,this.vertexB=r,this.uuid=guid(),this.center=i,this.edgePoint=n,e.all.push(this)}equals(t){return t.vertexA==this.vertexA&&t.vertexB==this.vertexB||t.vertexA==this.vertexB&&t.vertexB==this.vertexA}equalsV(t,r){return t==this.vertexA&&r==this.vertexB||t==this.vertexB&&r==this.vertexA}equalsU(t){return this.uuid==t.uuid}for(t){return this.vertexA==t||this.vertexB==t}},qt=class e{static all=[];static reset(){e.all=[]}constructor(t,r,n){this.vertexA=t,this.vertexB=r,this.faces=[],this.indices=n.indices,this.center=n?n.center:null,e.all.push(this)}equals(t){return t.vertexA==this.vertexA&&t.vertexB==this.vertexB||t.vertexA==this.vertexB&&t.vertexB==this.vertexA}equalsV(t,r){return t==this.vertexA&&r==this.vertexB||t==this.vertexB&&r==this.vertexA}};function t1(e=30,t=!1){e=Math.degToRad(e),Undo.initEdit({elements:Mesh.selected,selection:!0},t),Mesh.selected.forEach(r=>{qt.reset();let n=r.faces;for(let s in n){let o=n[s],a=o.getSortedVertices(),l=a.length;if(!(l<=2))for(let u=0;u<l;u++){let c=a[u],f=a[(u+1)%l],q=r.vertices[c].slice().V3_add(r.vertices[f]).V3_divide(2),p=qt.all.find(m=>m.equalsV(c,f));if(p){if(p.faces.length>=2)throw Blockbench.showQuickMessage(\"Error: non-manifold meshes are not allowed\",2e3),new Error(\"non-manifold meshes are not allowed\");p.faces.push(o);continue}let d=[];d[0]=o.vertices.findIndex(m=>m==c),d[1]=o.vertices.findIndex(m=>m==f);let v=new qt(c,f,{center:q,indices:d});v.faces=[o]}}let i=qt.all.length;for(let s=0;s<i;s++){let o=qt.all[s];if(o.faces.length<2)continue;let[a,l]=o.faces,u=l.getCenter().V3_subtract(o.center).V3_toThree(),c=l.getCenter().V3_subtract(o.center).V3_toThree();if(u.angleTo(c)<=e){let q=r.addVertices(r.vertices[o.vertexA],r.vertices[o.vertexB]),p=o.indices[0],d=o.indices[1];a.uv[q[0]]=a.uv[o.vertexA],a.uv[q[1]]=a.uv[o.vertexB],a.vertices[p]=q[0],a.vertices[d]=q[1]}}}),Undo.finishEdit(\"MTools: Split edges\"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})}var p9=P(\"split_edges\",()=>{t1(180),Undo.amendEdit({angle:{label:\"Angle\",type:\"range\",value:180,min:0,max:180}},e=>{t1(e.angle,!0)})});var v9=P(\"subdivide\",()=>{Undo.initEdit({elements:Mesh.selected,selection:!0}),Mesh.selected.forEach(e=>{Ve.all=[],ke.all=[];let t=Object.keys(e.vertices),{faces:r}=e;for(let o in r){let a=r[o],l=a.getSortedVertices(),u=l.length;if(u<3)continue;let c=new ke(a,o);c.vertices=l;for(let f=0;f<u;f++){let q=l[f],p=l[(f+1)%u],d=e.vertices[q].slice().V3_add(e.vertices[p]).V3_divide(2),v=Ve.all.find(m=>m.equalsV(q,p))??new Ve(q,p,null,d);c.edgePoints.push(v)}}let n=Ve.all.length;for(let o=0;o<n;o++){let a=Ve.all[o],l=[0,0,0],u=ke.all.length,c=0;for(let f=0;f<u;f++){let q=ke.all[f];q.edgePoints.find(p=>a.equalsU(p))&&(l.V3_add(q.facePoint),c++)}c<2?a.edgePoint=a.center:(a.edgePoint=l.V3_divide(c),a.edgePoint.V3_add(a.center).V3_divide(2)),a.edgePointKey=e.addVertices(a.edgePoint)[0]}let i=t.length;for(let o=0;o<i;o++){let a=t[o],l=e.vertices[a],u=[0,0,0],c=ke.all.length,f=0,q=!1;for(let v=0;v<c;v++){let m=ke.all[v];m.for(a)&&(u.V3_add(m.facePoint),q=!0,f++)}if(!q)continue;u.V3_divide(f);let p=[0,0,0];c=Ve.all.length;let d=0;for(let v=0;v<c;v++){let m=Ve.all[v];m.for(a)&&(p.V3_add(m.center),d++)}if(p.V3_divide(d),d!=f)l.V3_add(p).V3_divide(2);else for(let v=0;v<3;v++)l[v]=(u[v]+2*p[v]+(f-3)*l[v])/f;e.vertices[a]=l}let s=ke.all.length;for(let o=0;o<s;o++){let a=ke.all[o],l=a.bbFace,u=a.vertices,c=u.length;for(let f=0;f<c;f++){let q=u[f],p=u[(f+1)%c],d=u[(f-1+c)%c],v=a.facePointKey,m=a.edgePoints.find(_=>_.equalsV(q,p)).edgePointKey,h=q,g=a.edgePoints.find(_=>_.equalsV(q,d)).edgePointKey,x=new MeshFace(e,l).extend({vertices:[g,h,m,v]});x.uv[a.facePointKey]=mn(l);let b=[0,0,0].V3_add(l.uv[q]).V3_add(l.uv[p]);b.V3_divide(2);let y=[0,0,0].V3_add(l.uv[q]).V3_add(l.uv[d]);y.V3_divide(2),x.uv[m]=dn(b),x.uv[g]=dn(y),e.addFaces(x)}delete e.faces[a.key]}}),Undo.finishEdit(\"MTools: Subdivide selected meshes\"),Canvas.updateView({elements:Mesh.selected,element_aspects:{geometry:!0,uv:!0,faces:!0},selection:!0})});var Sn=new THREE.Vector3;Object.assign(THREE.Triangle,{getInterpolation(e,t,r,n,i,s,o,a){return THREE.Triangle.getBarycoord(e,t,r,n,Sn)===null?(a.x=0,a.y=0,\"z\"in a&&(a.z=0),\"w\"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(i,Sn.x),a.addScaledVector(s,Sn.y),a.addScaledVector(o,Sn.z),a)}});var{BufferAttribute:Qe,BufferGeometry:x3,Matrix3:r1,Matrix4:qe,Mesh:Vi,Vector3:B,ACESFilmicToneMapping:I9,AddEquation:B9,AddOperation:R9,AdditiveAnimationBlendMode:U9,AdditiveBlending:O9,AlphaFormat:D9,AlwaysDepth:L9,AlwaysStencilFunc:P9,AmbientLight:N9,AmbientLightProbe:z9,AnimationClip:G9,AnimationLoader:V9,AnimationMixer:H9,AnimationObjectGroup:W9,AnimationUtils:X9,ArcCurve:j9,ArrayCamera:Y9,ArrowHelper:K9,Audio:Z9,AudioAnalyser:Q9,AudioContext:J9,AudioListener:$9,AudioLoader:e8,AxesHelper:t8,BackSide:n1,BasicDepthPacking:r8,BasicShadowMap:n8,Bone:i8,BooleanKeyframeTrack:s8,Box2:o8,Box3:xe,Box3Helper:a8,BoxGeometry:l8,BoxHelper:c8,BufferGeometryLoader:u8,ByteType:q8,Cache:f8,Camera:p8,CameraHelper:h8,CanvasTexture:d8,CatmullRomCurve3:m8,CineonToneMapping:v8,CircleGeometry:g8,ClampToEdgeWrapping:x8,Clock:y8,Color:y3,ColorKeyframeTrack:b8,CompressedTexture:S8,CompressedTextureLoader:T8,ConeGeometry:_8,CubeCamera:w8,CubeReflectionMapping:E8,CubeRefractionMapping:A8,CubeTexture:C8,CubeTextureLoader:F8,CubeUVReflectionMapping:M8,CubicBezierCurve:k8,CubicBezierCurve3:I8,CubicInterpolant:B8,CullFaceBack:R8,CullFaceFront:U8,CullFaceFrontBack:O8,CullFaceNone:D8,Curve:L8,CurvePath:P8,CustomBlending:N8,CylinderGeometry:z8,Cylindrical:G8,DataTexture:b3,DataTextureLoader:V8,DataUtils:H8,DecrementStencilOp:W8,DecrementWrapStencilOp:X8,DefaultLoadingManager:j8,DepthFormat:Y8,DepthStencilFormat:K8,DepthTexture:Z8,DirectionalLight:Q8,DirectionalLightHelper:J8,DiscreteInterpolant:$8,DodecahedronGeometry:eq,DoubleSide:kr,DstAlphaFactor:tq,DstColorFactor:rq,DynamicCopyUsage:nq,DynamicDrawUsage:iq,DynamicReadUsage:sq,EdgesGeometry:oq,EllipseCurve:aq,EqualDepth:lq,EqualStencilFunc:cq,EquirectangularReflectionMapping:uq,EquirectangularRefractionMapping:qq,Euler:fq,EventDispatcher:pq,ExtrudeGeometry:hq,FileLoader:dq,Float16BufferAttribute:mq,Float32BufferAttribute:vq,Float64BufferAttribute:gq,FloatType:S3,Fog:xq,FogExp2:yq,FrontSide:Wi,Frustum:T3,GLBufferAttribute:bq,GLSL1:Sq,GLSL3:Tq,GreaterDepth:_q,GreaterEqualDepth:wq,GreaterEqualStencilFunc:Eq,GreaterStencilFunc:Aq,GridHelper:Cq,Group:Fq,HalfFloatType:Mq,HemisphereLight:kq,HemisphereLightHelper:Iq,HemisphereLightProbe:Bq,IcosahedronGeometry:Rq,ImageBitmapLoader:Uq,ImageLoader:Oq,ImageUtils:Dq,IncrementStencilOp:Lq,IncrementWrapStencilOp:Pq,InstancedBufferAttribute:Nq,InstancedBufferGeometry:zq,InstancedInterleavedBuffer:Gq,InstancedMesh:Vq,Int16BufferAttribute:Hq,Int32BufferAttribute:Wq,Int8BufferAttribute:Xq,IntType:jq,InterleavedBuffer:Yq,InterleavedBufferAttribute:Kq,Interpolant:Zq,InterpolateDiscrete:Qq,InterpolateLinear:Jq,InterpolateSmooth:$q,InvertStencilOp:ef,KeepStencilOp:tf,KeyframeTrack:rf,LOD:nf,LatheGeometry:sf,Layers:of,LessDepth:af,LessEqualDepth:lf,LessEqualStencilFunc:cf,LessStencilFunc:uf,Light:qf,LightProbe:ff,Line:pf,Line3:ge,LineBasicMaterial:hf,LineCurve:df,LineCurve3:mf,LineDashedMaterial:vf,LineLoop:gf,LineSegments:xf,LinearEncoding:yf,LinearFilter:bf,LinearInterpolant:Sf,LinearMipMapLinearFilter:Tf,LinearMipMapNearestFilter:_f,LinearMipmapLinearFilter:wf,LinearMipmapNearestFilter:Ef,LinearToneMapping:Af,Loader:Cf,LoaderUtils:Ff,LoadingManager:Mf,LoopOnce:kf,LoopPingPong:If,LoopRepeat:Bf,LuminanceAlphaFormat:Rf,LuminanceFormat:Uf,MOUSE:Of,Material:Df,MaterialLoader:Lf,MathUtils:Pf,MaxEquation:Nf,MeshBasicMaterial:zf,MeshDepthMaterial:Gf,MeshDistanceMaterial:Vf,MeshLambertMaterial:Hf,MeshMatcapMaterial:Wf,MeshNormalMaterial:Xf,MeshPhongMaterial:jf,MeshPhysicalMaterial:Yf,MeshStandardMaterial:Kf,MeshToonMaterial:Zf,MinEquation:Qf,MirroredRepeatWrapping:Jf,MixOperation:$f,MultiplyBlending:ep,MultiplyOperation:tp,NearestFilter:rp,NearestMipMapLinearFilter:np,NearestMipMapNearestFilter:ip,NearestMipmapLinearFilter:sp,NearestMipmapNearestFilter:op,NeverDepth:ap,NeverStencilFunc:lp,NoBlending:cp,NoToneMapping:up,NormalAnimationBlendMode:qp,NormalBlending:fp,NotEqualDepth:pp,NotEqualStencilFunc:hp,NumberKeyframeTrack:dp,Object3D:mp,ObjectLoader:vp,ObjectSpaceNormalMap:gp,OctahedronGeometry:xp,OneFactor:yp,OneMinusDstAlphaFactor:bp,OneMinusDstColorFactor:Sp,OneMinusSrcAlphaFactor:Tp,OneMinusSrcColorFactor:_p,OrthographicCamera:wp,PCFShadowMap:Ep,PCFSoftShadowMap:Ap,PMREMGenerator:Cp,Path:Fp,PerspectiveCamera:Mp,Plane:Zt,PlaneGeometry:kp,PlaneHelper:Ip,PointLight:Bp,PointLightHelper:Rp,Points:Up,PointsMaterial:Op,PolarGridHelper:Dp,PolyhedronGeometry:Lp,PositionalAudio:Pp,PropertyBinding:Np,PropertyMixer:zp,QuadraticBezierCurve:Gp,QuadraticBezierCurve3:Vp,Quaternion:Hp,QuaternionKeyframeTrack:Wp,QuaternionLinearInterpolant:Xp,REVISION:i1,RGBADepthPacking:jp,RGBAFormat:_3,RGBAIntegerFormat:Yp,RGBA_ASTC_10x10_Format:Kp,RGBA_ASTC_10x5_Format:Zp,RGBA_ASTC_10x6_Format:Qp,RGBA_ASTC_10x8_Format:Jp,RGBA_ASTC_12x10_Format:$p,RGBA_ASTC_12x12_Format:eh,RGBA_ASTC_4x4_Format:th,RGBA_ASTC_5x4_Format:rh,RGBA_ASTC_5x5_Format:nh,RGBA_ASTC_6x5_Format:ih,RGBA_ASTC_6x6_Format:sh,RGBA_ASTC_8x5_Format:oh,RGBA_ASTC_8x6_Format:ah,RGBA_ASTC_8x8_Format:lh,RGBA_BPTC_Format:ch,RGBA_ETC2_EAC_Format:uh,RGBA_PVRTC_2BPPV1_Format:qh,RGBA_PVRTC_4BPPV1_Format:fh,RGBA_S3TC_DXT1_Format:ph,RGBA_S3TC_DXT3_Format:hh,RGBA_S3TC_DXT5_Format:dh,RGB_ETC1_Format:mh,RGB_ETC2_Format:vh,RGB_PVRTC_2BPPV1_Format:gh,RGB_PVRTC_4BPPV1_Format:xh,RGB_S3TC_DXT1_Format:yh,RGFormat:bh,RGIntegerFormat:Sh,RawShaderMaterial:Th,Ray:Tn,Raycaster:_h,RectAreaLight:wh,RedFormat:Eh,RedIntegerFormat:w3,ReinhardToneMapping:Ah,RepeatWrapping:Ch,ReplaceStencilOp:Fh,ReverseSubtractEquation:Mh,RingGeometry:kh,Scene:Ih,ShaderChunk:Bh,ShaderLib:Rh,ShaderMaterial:Uh,ShadowMaterial:Oh,Shape:Dh,ShapeGeometry:Lh,ShapePath:Ph,ShapeUtils:Nh,ShortType:zh,Skeleton:Gh,SkeletonHelper:Vh,SkinnedMesh:Hh,Sphere:Hi,SphereGeometry:Wh,Spherical:Xh,SphericalHarmonics3:jh,SplineCurve:Yh,SpotLight:Kh,SpotLightHelper:Zh,Sprite:Qh,SpriteMaterial:Jh,SrcAlphaFactor:$h,SrcAlphaSaturateFactor:ed,SrcColorFactor:td,StaticCopyUsage:rd,StaticDrawUsage:nd,StaticReadUsage:id,StereoCamera:sd,StreamCopyUsage:od,StreamDrawUsage:ad,StreamReadUsage:ld,StringKeyframeTrack:cd,SubtractEquation:ud,SubtractiveBlending:qd,TOUCH:fd,TangentSpaceNormalMap:pd,TetrahedronGeometry:hd,Texture:dd,TextureLoader:md,TorusGeometry:vd,TorusKnotGeometry:gd,Triangle:oe,TriangleFanDrawMode:xd,TriangleStripDrawMode:yd,TrianglesDrawMode:bd,TubeGeometry:Sd,UVMapping:Td,Uint16BufferAttribute:_d,Uint32BufferAttribute:wd,Uint8BufferAttribute:Ed,Uint8ClampedBufferAttribute:Ad,Uniform:Cd,UniformsLib:Fd,UniformsUtils:Md,UnsignedByteType:kd,UnsignedInt248Type:Id,UnsignedIntType:E3,UnsignedShort4444Type:Bd,UnsignedShort5551Type:Rd,UnsignedShortType:Ud,VSMShadowMap:Od,Vector2:Ie,Vector4:Je,VectorKeyframeTrack:Dd,VideoTexture:Ld,WebGL1Renderer:Pd,WebGLCubeRenderTarget:Nd,WebGLMultipleRenderTargets:zd,WebGLRenderTarget:Gd,WebGLRenderer:Vd,WireframeGeometry:Hd,ZeroCurvatureEnding:Wd,ZeroFactor:Xd,ZeroSlopeEnding:jd,ZeroStencilOp:Yd,sRGBEncoding:Kd}=window.THREE;var s1=Math.pow(2,-24),_n=Symbol(\"SKIP_GENERATION\");function A3(e){return e.index?e.index.count:e.attributes.position.count}function He(e){return A3(e)/3}function C3(e,t=ArrayBuffer){return e>65535?new Uint32Array(new t(4*e)):new Uint16Array(new t(2*e))}function o1(e,t){if(!e.index){let r=e.attributes.position.count,n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=C3(r,n);e.setIndex(new Qe(i,1));for(let s=0;s<r;s++)i[s]=s}}function Xi(e,t){let r=He(e),n=t||e.drawRange,i=n.start/3,s=(n.start+n.count)/3,o=Math.max(0,i),a=Math.min(r,s)-o;return[{offset:Math.floor(o),count:Math.floor(a)}]}function ji(e,t){if(!e.groups||!e.groups.length)return Xi(e,t);let r=[],n=new Set,i=t||e.drawRange,s=i.start/3,o=(i.start+i.count)/3;for(let l of e.groups){let u=l.start/3,c=(l.start+l.count)/3;n.add(Math.max(s,u)),n.add(Math.min(o,c))}let a=Array.from(n.values()).sort((l,u)=>l-u);for(let l=0;l<a.length-1;l++){let u=a[l],c=a[l+1];r.push({offset:Math.floor(u),count:Math.floor(c-u)})}return r}function a1(e,t){let r=He(e),n=ji(e,t).sort((o,a)=>o.offset-a.offset),i=n[n.length-1];i.count=Math.min(r-i.offset,i.count);let s=0;return n.forEach(({count:o})=>s+=o),r!==s}function wn(e,t,r,n,i){let s=1/0,o=1/0,a=1/0,l=-1/0,u=-1/0,c=-1/0,f=1/0,q=1/0,p=1/0,d=-1/0,v=-1/0,m=-1/0;for(let h=t*6,g=(t+r)*6;h<g;h+=6){let x=e[h+0],b=e[h+1],y=x-b,_=x+b;y<s&&(s=y),_>l&&(l=_),x<f&&(f=x),x>d&&(d=x);let T=e[h+2],S=e[h+3],E=T-S,w=T+S;E<o&&(o=E),w>u&&(u=w),T<q&&(q=T),T>v&&(v=T);let F=e[h+4],C=e[h+5],M=F-C,k=F+C;M<a&&(a=M),k>c&&(c=k),F<p&&(p=F),F>m&&(m=F)}n[0]=s,n[1]=o,n[2]=a,n[3]=l,n[4]=u,n[5]=c,i[0]=f,i[1]=q,i[2]=p,i[3]=d,i[4]=v,i[5]=m}function l1(e,t=null,r=null,n=null){let i=e.attributes.position,s=e.index?e.index.array:null,o=He(e),a=i.normalized,l;t===null?(l=new Float32Array(o*6),r=0,n=o):(l=t,r=r||0,n=n||o);let u=i.array,c=i.offset||0,f=3;i.isInterleavedBufferAttribute&&(f=i.data.stride);let q=[\"getX\",\"getY\",\"getZ\"];for(let p=r;p<r+n;p++){let d=p*3,v=p*6,m=d+0,h=d+1,g=d+2;s&&(m=s[m],h=s[h],g=s[g]),a||(m=m*f+c,h=h*f+c,g=g*f+c);for(let x=0;x<3;x++){let b,y,_;a?(b=i[q[x]](m),y=i[q[x]](h),_=i[q[x]](g)):(b=u[m+x],y=u[h+x],_=u[g+x]);let T=b;y<T&&(T=y),_<T&&(T=_);let S=b;y>S&&(S=y),_>S&&(S=_);let E=(S-T)/2,w=x*2;l[v+w+0]=T+E,l[v+w+1]=E+(Math.abs(T)+E)*s1}}return l}function Z(e,t,r){return r.min.x=t[e],r.min.y=t[e+1],r.min.z=t[e+2],r.max.x=t[e+3],r.max.y=t[e+4],r.max.z=t[e+5],r}function Yi(e){let t=-1,r=-1/0;for(let n=0;n<3;n++){let i=e[n+3]-e[n];i>r&&(r=i,t=n)}return t}function Ki(e,t){t.set(e)}function Zi(e,t,r){let n,i;for(let s=0;s<3;s++){let o=s+3;n=e[s],i=t[s],r[s]=n<i?n:i,n=e[o],i=t[o],r[o]=n>i?n:i}}function Ir(e,t,r){for(let n=0;n<3;n++){let i=t[e+2*n],s=t[e+2*n+1],o=i-s,a=i+s;o<r[n]&&(r[n]=o),a>r[n+3]&&(r[n+3]=a)}}function Qt(e){let t=e[3]-e[0],r=e[4]-e[1],n=e[5]-e[2];return 2*(t*r+r*n+n*t)}var $e=32,M3=(e,t)=>e.candidate-t.candidate,ft=new Array($e).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),En=new Float32Array(6);function q1(e,t,r,n,i,s){let o=-1,a=0;if(s===0)o=Yi(t),o!==-1&&(a=(t[o]+t[o+3])/2);else if(s===1)o=Yi(e),o!==-1&&(a=k3(r,n,i,o));else if(s===2){let l=Qt(e),u=1.25*i,c=n*6,f=(n+i)*6;for(let q=0;q<3;q++){let p=t[q],m=(t[q+3]-p)/$e;if(i<$e/4){let h=[...ft];h.length=i;let g=0;for(let b=c;b<f;b+=6,g++){let y=h[g];y.candidate=r[b+2*q],y.count=0;let{bounds:_,leftCacheBounds:T,rightCacheBounds:S}=y;for(let E=0;E<3;E++)S[E]=1/0,S[E+3]=-1/0,T[E]=1/0,T[E+3]=-1/0,_[E]=1/0,_[E+3]=-1/0;Ir(b,r,_)}h.sort(M3);let x=i;for(let b=0;b<x;b++){let y=h[b];for(;b+1<x&&h[b+1].candidate===y.candidate;)h.splice(b+1,1),x--}for(let b=c;b<f;b+=6){let y=r[b+2*q];for(let _=0;_<x;_++){let T=h[_];y>=T.candidate?Ir(b,r,T.rightCacheBounds):(Ir(b,r,T.leftCacheBounds),T.count++)}}for(let b=0;b<x;b++){let y=h[b],_=y.count,T=i-y.count,S=y.leftCacheBounds,E=y.rightCacheBounds,w=0;_!==0&&(w=Qt(S)/l);let F=0;T!==0&&(F=Qt(E)/l);let C=1+1.25*(w*_+F*T);C<u&&(o=q,u=C,a=y.candidate)}}else{for(let x=0;x<$e;x++){let b=ft[x];b.count=0,b.candidate=p+m+x*m;let y=b.bounds;for(let _=0;_<3;_++)y[_]=1/0,y[_+3]=-1/0}for(let x=c;x<f;x+=6){let _=~~((r[x+2*q]-p)/m);_>=$e&&(_=$e-1);let T=ft[_];T.count++,Ir(x,r,T.bounds)}let h=ft[$e-1];Ki(h.bounds,h.rightCacheBounds);for(let x=$e-2;x>=0;x--){let b=ft[x],y=ft[x+1];Zi(b.bounds,y.rightCacheBounds,b.rightCacheBounds)}let g=0;for(let x=0;x<$e-1;x++){let b=ft[x],y=b.count,_=b.bounds,S=ft[x+1].rightCacheBounds;y!==0&&(g===0?Ki(_,En):Zi(_,En,En)),g+=y;let E=0,w=0;g!==0&&(E=Qt(En)/l);let F=i-g;F!==0&&(w=Qt(S)/l);let C=1+1.25*(E*g+w*F);C<u&&(o=q,u=C,a=b.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${s} used.`);return{axis:o,pos:a}}function k3(e,t,r,n){let i=0;for(let s=t,o=t+r;s<o;s++)i+=e[s*6+n*2];return i/r}var Jt=class{constructor(){this.boundingData=new Float32Array(6)}};function f1(e,t,r,n,i,s){let o=n,a=n+i-1,l=s.pos,u=s.axis*2;for(;;){for(;o<=a&&r[o*6+u]<l;)o++;for(;o<=a&&r[a*6+u]>=l;)a--;if(o<a){for(let c=0;c<3;c++){let f=t[o*3+c];t[o*3+c]=t[a*3+c],t[a*3+c]=f}for(let c=0;c<6;c++){let f=r[o*6+c];r[o*6+c]=r[a*6+c],r[a*6+c]=f}o++,a--}else return o}}function p1(e,t,r,n,i,s){let o=n,a=n+i-1,l=s.pos,u=s.axis*2;for(;;){for(;o<=a&&r[o*6+u]<l;)o++;for(;o<=a&&r[a*6+u]>=l;)a--;if(o<a){let c=e[o];e[o]=e[a],e[a]=c;for(let f=0;f<6;f++){let q=r[o*6+f];r[o*6+f]=r[a*6+f],r[a*6+f]=q}o++,a--}else return o}}function re(e,t){return t[e+15]===65535}function ae(e,t){return t[e+6]}function fe(e,t){return t[e+14]}function de(e){return e+8}function me(e,t){return t[e+6]}function An(e,t){return t[e+7]}var h1,Br,Cn,d1,I3=Math.pow(2,32);function Fn(e){return\"count\"in e?1:1+Fn(e.left)+Fn(e.right)}function m1(e,t,r){return h1=new Float32Array(r),Br=new Uint32Array(r),Cn=new Uint16Array(r),d1=new Uint8Array(r),Qi(e,t)}function Qi(e,t){let r=e/4,n=e/2,i=\"count\"in t,s=t.boundingData;for(let o=0;o<6;o++)h1[r+o]=s[o];if(i)if(t.buffer){let o=t.buffer;d1.set(new Uint8Array(o),e);for(let a=e,l=e+o.byteLength;a<l;a+=32){let u=a/2;re(u,Cn)||(Br[a/4+6]+=r)}return e+o.byteLength}else{let o=t.offset,a=t.count;return Br[r+6]=o,Cn[n+14]=a,Cn[n+15]=65535,e+32}else{let o=t.left,a=t.right,l=t.splitAxis,u;if(u=Qi(e+32,o),u/4>I3)throw new Error(\"MeshBVH: Cannot store child pointer greater than 32 bits.\");return Br[r+6]=u/4,u=Qi(u,a),Br[r+7]=l,u}}function B3(e,t){let r=(e.index?e.index.count:e.attributes.position.count)/3,n=r>2**16,i=n?4:2,s=t?new SharedArrayBuffer(r*i):new ArrayBuffer(r*i),o=n?new Uint32Array(s):new Uint16Array(s);for(let a=0,l=o.length;a<l;a++)o[a]=a;return o}function R3(e,t,r,n,i){let{maxDepth:s,verbose:o,maxLeafTris:a,strategy:l,onProgress:u,indirect:c}=i,f=e._indirectBuffer,q=e.geometry,p=q.index?q.index.array:null,d=c?p1:f1,v=He(q),m=new Float32Array(6),h=!1,g=new Jt;return wn(t,r,n,g.boundingData,m),b(g,r,n,m),g;function x(y){u&&u(y/v)}function b(y,_,T,S=null,E=0){if(!h&&E>=s&&(h=!0,o&&(console.warn(`MeshBVH: Max depth of ${s} reached when generating BVH. Consider increasing maxDepth.`),console.warn(q))),T<=a||E>=s)return x(_+T),y.offset=_,y.count=T,y;let w=q1(y.boundingData,S,t,_,T,l);if(w.axis===-1)return x(_+T),y.offset=_,y.count=T,y;let F=d(f,p,t,_,T,w);if(F===_||F===_+T)x(_+T),y.offset=_,y.count=T;else{y.splitAxis=w.axis;let C=new Jt,M=_,k=F-_;y.left=C,wn(t,M,k,C.boundingData,m),b(C,M,k,m,E+1);let I=new Jt,L=F,V=T-k;y.right=I,wn(t,L,V,I.boundingData,m),b(I,L,V,m,E+1)}return y}}function v1(e,t){let r=e.geometry;t.indirect&&(e._indirectBuffer=B3(r,t.useSharedArrayBuffer),a1(r,t.range)&&!t.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the \"indirect\" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),e._indirectBuffer||o1(r,t);let n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=l1(r),s=t.indirect?Xi(r,t.range):ji(r,t.range);e._roots=s.map(o=>{let a=R3(e,i,o.offset,o.count,t),l=Fn(a),u=new n(32*l);return m1(0,a,u),u})}var Se=class{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(t,r){let n=1/0,i=-1/0;for(let s=0,o=t.length;s<o;s++){let l=t[s][r];n=l<n?l:n,i=l>i?l:i}this.min=n,this.max=i}setFromPoints(t,r){let n=1/0,i=-1/0;for(let s=0,o=r.length;s<o;s++){let a=r[s],l=t.dot(a);n=l<n?l:n,i=l>i?l:i}this.min=n,this.max=i}isSeparated(t){return this.min>t.max||t.min>this.max}};Se.prototype.setFromBox=function(){let e=new B;return function(r,n){let i=n.min,s=n.max,o=1/0,a=-1/0;for(let l=0;l<=1;l++)for(let u=0;u<=1;u++)for(let c=0;c<=1;c++){e.x=i.x*l+s.x*(1-l),e.y=i.y*u+s.y*(1-u),e.z=i.z*c+s.z*(1-c);let f=r.dot(e);o=Math.min(f,o),a=Math.max(f,a)}this.min=o,this.max=a}}();var _m=function(){let e=new Se;return function(r,n){let i=r.points,s=r.satAxes,o=r.satBounds,a=n.points,l=n.satAxes,u=n.satBounds;for(let c=0;c<3;c++){let f=o[c],q=s[c];if(e.setFromPoints(q,a),f.isSeparated(e))return!1}for(let c=0;c<3;c++){let f=u[c],q=l[c];if(e.setFromPoints(q,i),f.isSeparated(e))return!1}}}();var U3=function(){let e=new B,t=new B,r=new B;return function(i,s,o){let a=i.start,l=e,u=s.start,c=t;r.subVectors(a,u),e.subVectors(i.end,i.start),t.subVectors(s.end,s.start);let f=r.dot(c),q=c.dot(l),p=c.dot(c),d=r.dot(l),m=l.dot(l)*p-q*q,h,g;m!==0?h=(f*q-d*p)/m:h=0,g=(f+h*q)/p,o.x=h,o.y=g}}(),Ur=function(){let e=new Ie,t=new B,r=new B;return function(i,s,o,a){U3(i,s,e);let l=e.x,u=e.y;if(l>=0&&l<=1&&u>=0&&u<=1){i.at(l,o),s.at(u,a);return}else if(l>=0&&l<=1){u<0?s.at(0,a):s.at(1,a),i.closestPointToPoint(a,!0,o);return}else if(u>=0&&u<=1){l<0?i.at(0,o):i.at(1,o),s.closestPointToPoint(o,!0,a);return}else{let c;l<0?c=i.start:c=i.end;let f;u<0?f=s.start:f=s.end;let q=t,p=r;if(i.closestPointToPoint(f,!0,t),s.closestPointToPoint(c,!0,r),q.distanceToSquared(f)<=p.distanceToSquared(c)){o.copy(q),a.copy(f);return}else{o.copy(c),a.copy(p);return}}}}(),g1=function(){let e=new B,t=new B,r=new Zt,n=new ge;return function(s,o){let{radius:a,center:l}=s,{a:u,b:c,c:f}=o;if(n.start=u,n.end=c,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a||(n.start=u,n.end=f,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a)||(n.start=c,n.end=f,n.closestPointToPoint(l,!0,e).distanceTo(l)<=a))return!0;let v=o.getPlane(r);if(Math.abs(v.distanceToPoint(l))<=a){let h=v.projectPoint(l,t);if(o.containsPoint(h))return!0}return!1}}();var O3=1e-15;function Ji(e){return Math.abs(e)<O3}var he=class extends oe{constructor(...t){super(...t),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new B),this.satBounds=new Array(4).fill().map(()=>new Se),this.points=[this.a,this.b,this.c],this.sphere=new Hi,this.plane=new Zt,this.needsUpdate=!0}intersectsSphere(t){return g1(t,this)}update(){let t=this.a,r=this.b,n=this.c,i=this.points,s=this.satAxes,o=this.satBounds,a=s[0],l=o[0];this.getNormal(a),l.setFromPoints(a,i);let u=s[1],c=o[1];u.subVectors(t,r),c.setFromPoints(u,i);let f=s[2],q=o[2];f.subVectors(r,n),q.setFromPoints(f,i);let p=s[3],d=o[3];p.subVectors(n,t),d.setFromPoints(p,i),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(a,t),this.needsUpdate=!1}};he.prototype.closestPointToSegment=function(){let e=new B,t=new B,r=new ge;return function(i,s=null,o=null){let{start:a,end:l}=i,u=this.points,c,f=1/0;for(let q=0;q<3;q++){let p=(q+1)%3;r.start.copy(u[q]),r.end.copy(u[p]),Ur(r,i,e,t),c=e.distanceToSquared(t),c<f&&(f=c,s&&s.copy(e),o&&o.copy(t))}return this.closestPointToPoint(a,e),c=a.distanceToSquared(e),c<f&&(f=c,s&&s.copy(e),o&&o.copy(a)),this.closestPointToPoint(l,e),c=l.distanceToSquared(e),c<f&&(f=c,s&&s.copy(e),o&&o.copy(l)),Math.sqrt(f)}}();he.prototype.intersectsTriangle=function(){let e=new he,t=new Array(3),r=new Array(3),n=new Se,i=new Se,s=new B,o=new B,a=new B,l=new B,u=new B,c=new ge,f=new ge,q=new ge,p=new B;function d(v,m,h){let g=v.points,x=0,b=-1;for(let y=0;y<3;y++){let{start:_,end:T}=c;_.copy(g[y]),T.copy(g[(y+1)%3]),c.delta(o);let S=Ji(m.distanceToPoint(_));if(Ji(m.normal.dot(o))&&S){h.copy(c),x=2;break}let E=m.intersectLine(c,p);if(!E&&S&&p.copy(_),(E||S)&&!Ji(p.distanceTo(T))){if(x<=1)(x===1?h.start:h.end).copy(p),S&&(b=x);else if(x>=2){(b===1?h.start:h.end).copy(p),x=2;break}if(x++,x===2&&b===-1)break}}return x}return function(m,h=null,g=!1){this.needsUpdate&&this.update(),m.isExtendedTriangle?m.needsUpdate&&m.update():(e.copy(m),e.update(),m=e);let x=this.plane,b=m.plane;if(Math.abs(x.normal.dot(b.normal))>1-1e-10){let y=this.satBounds,_=this.satAxes;r[0]=m.a,r[1]=m.b,r[2]=m.c;for(let E=0;E<4;E++){let w=y[E],F=_[E];if(n.setFromPoints(F,r),w.isSeparated(n))return!1}let T=m.satBounds,S=m.satAxes;t[0]=this.a,t[1]=this.b,t[2]=this.c;for(let E=0;E<4;E++){let w=T[E],F=S[E];if(n.setFromPoints(F,t),w.isSeparated(n))return!1}for(let E=0;E<4;E++){let w=_[E];for(let F=0;F<4;F++){let C=S[F];if(s.crossVectors(w,C),n.setFromPoints(s,t),i.setFromPoints(s,r),n.isSeparated(i))return!1}}return h&&(g||console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"),h.start.set(0,0,0),h.end.set(0,0,0)),!0}else{let y=d(this,b,f);if(y===1&&m.containsPoint(f.end))return h&&(h.start.copy(f.end),h.end.copy(f.end)),!0;if(y!==2)return!1;let _=d(m,x,q);if(_===1&&this.containsPoint(q.end))return h&&(h.start.copy(q.end),h.end.copy(q.end)),!0;if(_!==2)return!1;if(f.delta(a),q.delta(l),a.dot(l)<0){let M=q.start;q.start=q.end,q.end=M}let T=f.start.dot(a),S=f.end.dot(a),E=q.start.dot(a),w=q.end.dot(a),F=S<E,C=T<w;return T!==w&&E!==S&&F===C?!1:(h&&(u.subVectors(f.start,q.start),u.dot(a)>0?h.start.copy(f.start):h.start.copy(q.start),u.subVectors(f.end,q.end),u.dot(a)<0?h.end.copy(f.end):h.end.copy(q.end)),!0)}}}();he.prototype.distanceToPoint=function(){let e=new B;return function(r){return this.closestPointToPoint(r,e),r.distanceTo(e)}}();he.prototype.distanceToTriangle=function(){let e=new B,t=new B,r=[\"a\",\"b\",\"c\"],n=new ge,i=new ge;return function(o,a=null,l=null){let u=a||l?n:null;if(this.intersectsTriangle(o,u))return(a||l)&&(a&&u.getCenter(a),l&&u.getCenter(l)),0;let c=1/0;for(let f=0;f<3;f++){let q,p=r[f],d=o[p];this.closestPointToPoint(d,e),q=d.distanceToSquared(e),q<c&&(c=q,a&&a.copy(e),l&&l.copy(d));let v=this[p];o.closestPointToPoint(v,e),q=v.distanceToSquared(e),q<c&&(c=q,a&&a.copy(v),l&&l.copy(e))}for(let f=0;f<3;f++){let q=r[f],p=r[(f+1)%3];n.set(this[q],this[p]);for(let d=0;d<3;d++){let v=r[d],m=r[(d+1)%3];i.set(o[v],o[m]),Ur(n,i,e,t);let h=e.distanceToSquared(t);h<c&&(c=h,a&&a.copy(e),l&&l.copy(t))}}return Math.sqrt(c)}}();var ne=class{constructor(t,r,n){this.isOrientedBox=!0,this.min=new B,this.max=new B,this.matrix=new qe,this.invMatrix=new qe,this.points=new Array(8).fill().map(()=>new B),this.satAxes=new Array(3).fill().map(()=>new B),this.satBounds=new Array(3).fill().map(()=>new Se),this.alignedSatBounds=new Array(3).fill().map(()=>new Se),this.needsUpdate=!1,t&&this.min.copy(t),r&&this.max.copy(r),n&&this.matrix.copy(n)}set(t,r,n){this.min.copy(t),this.max.copy(r),this.matrix.copy(n),this.needsUpdate=!0}copy(t){this.min.copy(t.min),this.max.copy(t.max),this.matrix.copy(t.matrix),this.needsUpdate=!0}};ne.prototype.update=function(){return function(){let t=this.matrix,r=this.min,n=this.max,i=this.points;for(let u=0;u<=1;u++)for(let c=0;c<=1;c++)for(let f=0;f<=1;f++){let q=1*u|2*c|4*f,p=i[q];p.x=u?n.x:r.x,p.y=c?n.y:r.y,p.z=f?n.z:r.z,p.applyMatrix4(t)}let s=this.satBounds,o=this.satAxes,a=i[0];for(let u=0;u<3;u++){let c=o[u],f=s[u],q=1<<u,p=i[q];c.subVectors(a,p),f.setFromPoints(c,i)}let l=this.alignedSatBounds;l[0].setFromPointsField(i,\"x\"),l[1].setFromPointsField(i,\"y\"),l[2].setFromPointsField(i,\"z\"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1}}();ne.prototype.intersectsBox=function(){let e=new Se;return function(r){this.needsUpdate&&this.update();let n=r.min,i=r.max,s=this.satBounds,o=this.satAxes,a=this.alignedSatBounds;if(e.min=n.x,e.max=i.x,a[0].isSeparated(e)||(e.min=n.y,e.max=i.y,a[1].isSeparated(e))||(e.min=n.z,e.max=i.z,a[2].isSeparated(e)))return!1;for(let l=0;l<3;l++){let u=o[l],c=s[l];if(e.setFromBox(u,r),c.isSeparated(e))return!1}return!0}}();ne.prototype.intersectsTriangle=function(){let e=new he,t=new Array(3),r=new Se,n=new Se,i=new B;return function(o){this.needsUpdate&&this.update(),o.isExtendedTriangle?o.needsUpdate&&o.update():(e.copy(o),e.update(),o=e);let a=this.satBounds,l=this.satAxes;t[0]=o.a,t[1]=o.b,t[2]=o.c;for(let q=0;q<3;q++){let p=a[q],d=l[q];if(r.setFromPoints(d,t),p.isSeparated(r))return!1}let u=o.satBounds,c=o.satAxes,f=this.points;for(let q=0;q<3;q++){let p=u[q],d=c[q];if(r.setFromPoints(d,f),p.isSeparated(r))return!1}for(let q=0;q<3;q++){let p=l[q];for(let d=0;d<4;d++){let v=c[d];if(i.crossVectors(p,v),r.setFromPoints(i,t),n.setFromPoints(i,f),r.isSeparated(n))return!1}}return!0}}();ne.prototype.closestPointToPoint=function(){return function(t,r){return this.needsUpdate&&this.update(),r.copy(t).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),r}}();ne.prototype.distanceToPoint=function(){let e=new B;return function(r){return this.closestPointToPoint(r,e),r.distanceTo(e)}}();ne.prototype.distanceToBox=function(){let e=[\"x\",\"y\",\"z\"],t=new Array(12).fill().map(()=>new ge),r=new Array(12).fill().map(()=>new ge),n=new B,i=new B;return function(o,a=0,l=null,u=null){if(this.needsUpdate&&this.update(),this.intersectsBox(o))return(l||u)&&(o.getCenter(i),this.closestPointToPoint(i,n),o.closestPointToPoint(n,i),l&&l.copy(n),u&&u.copy(i)),0;let c=a*a,f=o.min,q=o.max,p=this.points,d=1/0;for(let m=0;m<8;m++){let h=p[m];i.copy(h).clamp(f,q);let g=h.distanceToSquared(i);if(g<d&&(d=g,l&&l.copy(h),u&&u.copy(i),g<c))return Math.sqrt(g)}let v=0;for(let m=0;m<3;m++)for(let h=0;h<=1;h++)for(let g=0;g<=1;g++){let x=(m+1)%3,b=(m+2)%3,y=h<<x|g<<b,_=1<<m|h<<x|g<<b,T=p[y],S=p[_];t[v].set(T,S);let w=e[m],F=e[x],C=e[b],M=r[v],k=M.start,I=M.end;k[w]=f[w],k[F]=h?f[F]:q[F],k[C]=g?f[C]:q[F],I[w]=q[w],I[F]=h?f[F]:q[F],I[C]=g?f[C]:q[F],v++}for(let m=0;m<=1;m++)for(let h=0;h<=1;h++)for(let g=0;g<=1;g++){i.x=m?q.x:f.x,i.y=h?q.y:f.y,i.z=g?q.z:f.z,this.closestPointToPoint(i,n);let x=i.distanceToSquared(n);if(x<d&&(d=x,l&&l.copy(n),u&&u.copy(i),x<c))return Math.sqrt(x)}for(let m=0;m<12;m++){let h=t[m];for(let g=0;g<12;g++){let x=r[g];Ur(h,x,n,i);let b=n.distanceToSquared(i);if(b<d&&(d=b,l&&l.copy(n),u&&u.copy(i),b<c))return Math.sqrt(b)}}return Math.sqrt(d)}}();var pt=class{constructor(t){this._getNewPrimitive=t,this._primitives=[]}getPrimitive(){let t=this._primitives;return t.length===0?this._getNewPrimitive():t.pop()}releasePrimitive(t){this._primitives.push(t)}};var $i=class extends pt{constructor(){super(()=>new he)}},ye=new $i;var es=class{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;let t=[],r=null;this.setBuffer=n=>{r&&t.push(r),r=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{r=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,t.length!==0&&this.setBuffer(t.pop())}}},W=new es;var ht,er,$t=[],kn=new pt(()=>new xe);function x1(e,t,r,n,i,s){ht=kn.getPrimitive(),er=kn.getPrimitive(),$t.push(ht,er),W.setBuffer(e._roots[t]);let o=ts(0,e.geometry,r,n,i,s);W.clearBuffer(),kn.releasePrimitive(ht),kn.releasePrimitive(er),$t.pop(),$t.pop();let a=$t.length;return a>0&&(er=$t[a-1],ht=$t[a-2]),o}function ts(e,t,r,n,i=null,s=0,o=0){let{float32Array:a,uint16Array:l,uint32Array:u}=W,c=e*2;if(re(c,l)){let q=ae(e,u),p=fe(c,l);return Z(e,a,ht),n(q,p,!1,o,s+e,ht)}else{let w=function(C){let{uint16Array:M,uint32Array:k}=W,I=C*2;for(;!re(I,M);)C=de(C),I=C*2;return ae(C,k)},F=function(C){let{uint16Array:M,uint32Array:k}=W,I=C*2;for(;!re(I,M);)C=me(C,k),I=C*2;return ae(C,k)+fe(I,M)},q=de(e),p=me(e,u),d=q,v=p,m,h,g,x;if(i&&(g=ht,x=er,Z(d,a,g),Z(v,a,x),m=i(g),h=i(x),h<m)){d=p,v=q;let C=m;m=h,h=C,g=x}g||(g=ht,Z(d,a,g));let b=re(d*2,l),y=r(g,b,m,o+1,s+d),_;if(y===2){let C=w(d),k=F(d)-C;_=n(C,k,!0,o+1,s+d,g)}else _=y&&ts(d,t,r,n,i,s,o+1);if(_)return!0;x=er,Z(v,a,x);let T=re(v*2,l),S=r(x,T,h,o+1,s+v),E;if(S===2){let C=w(v),k=F(v)-C;E=n(C,k,!0,o+1,s+v,x)}else E=S&&ts(v,t,r,n,i,s,o+1);return!!E}}var Or=new B,ns=new B;function y1(e,t,r={},n=0,i=1/0){let s=n*n,o=i*i,a=1/0,l=null;if(e.shapecast({boundsTraverseOrder:c=>(Or.copy(t).clamp(c.min,c.max),Or.distanceToSquared(t)),intersectsBounds:(c,f,q)=>q<a&&q<o,intersectsTriangle:(c,f)=>{c.closestPointToPoint(t,Or);let q=t.distanceToSquared(Or);return q<a&&(ns.copy(Or),a=q,l=f),q<s}}),a===1/0)return null;let u=Math.sqrt(a);return r.point?r.point.copy(ns):r.point=ns.clone(),r.distance=u,r.faceIndex=l,r}var L3=parseInt(i1)>=169,Ft=new B,Mt=new B,kt=new B,In=new Ie,Bn=new Ie,Rn=new Ie,b1=new B,S1=new B,T1=new B,Dr=new B;function P3(e,t,r,n,i,s,o,a){let l;if(s===n1?l=e.intersectTriangle(n,r,t,!0,i):l=e.intersectTriangle(t,r,n,s!==kr,i),l===null)return null;let u=e.origin.distanceTo(i);return u<o||u>a?null:{distance:u,point:i.clone()}}function N3(e,t,r,n,i,s,o,a,l,u,c){Ft.fromBufferAttribute(t,s),Mt.fromBufferAttribute(t,o),kt.fromBufferAttribute(t,a);let f=P3(e,Ft,Mt,kt,Dr,l,u,c);if(f){let q=new B;oe.getBarycoord(Dr,Ft,Mt,kt,q),n&&(In.fromBufferAttribute(n,s),Bn.fromBufferAttribute(n,o),Rn.fromBufferAttribute(n,a),f.uv=oe.getInterpolation(Dr,Ft,Mt,kt,In,Bn,Rn,new Ie)),i&&(In.fromBufferAttribute(i,s),Bn.fromBufferAttribute(i,o),Rn.fromBufferAttribute(i,a),f.uv1=oe.getInterpolation(Dr,Ft,Mt,kt,In,Bn,Rn,new Ie)),r&&(b1.fromBufferAttribute(r,s),S1.fromBufferAttribute(r,o),T1.fromBufferAttribute(r,a),f.normal=oe.getInterpolation(Dr,Ft,Mt,kt,b1,S1,T1,new B),f.normal.dot(e.direction)>0&&f.normal.multiplyScalar(-1));let p={a:s,b:o,c:a,normal:new B,materialIndex:0};oe.getNormal(Ft,Mt,kt,p.normal),f.face=p,f.faceIndex=s,L3&&(f.barycoord=q)}return f}function tr(e,t,r,n,i,s,o){let a=n*3,l=a+0,u=a+1,c=a+2,f=e.index;e.index&&(l=f.getX(l),u=f.getX(u),c=f.getX(c));let{position:q,normal:p,uv:d,uv1:v}=e.attributes,m=N3(r,q,p,d,v,l,u,c,t,s,o);return m?(m.faceIndex=n,i&&i.push(m),m):null}function Q(e,t,r,n){let i=e.a,s=e.b,o=e.c,a=t,l=t+1,u=t+2;r&&(a=r.getX(a),l=r.getX(l),u=r.getX(u)),i.x=n.getX(a),i.y=n.getY(a),i.z=n.getZ(a),s.x=n.getX(l),s.y=n.getY(l),s.z=n.getZ(l),o.x=n.getX(u),o.y=n.getY(u),o.z=n.getZ(u)}function _1(e,t,r,n,i,s,o,a){let{geometry:l,_indirectBuffer:u}=e;for(let c=n,f=n+i;c<f;c++)tr(l,t,r,c,s,o,a)}function w1(e,t,r,n,i,s,o){let{geometry:a,_indirectBuffer:l}=e,u=1/0,c=null;for(let f=n,q=n+i;f<q;f++){let p;p=tr(a,t,r,f,null,s,o),p&&p.distance<u&&(c=p,u=p.distance)}return c}function E1(e,t,r,n,i,s,o){let{geometry:a}=r,{index:l}=a,u=a.attributes.position;for(let c=e,f=t+e;c<f;c++){let q;if(q=c,Q(o,q*3,l,u),o.needsUpdate=!0,n(o,q,i,s))return!0}return!1}function A1(e,t=null){t&&Array.isArray(t)&&(t=new Set(t));let r=e.geometry,n=r.index?r.index.array:null,i=r.attributes.position,s,o,a,l,u=0,c=e._roots;for(let q=0,p=c.length;q<p;q++)s=c[q],o=new Uint32Array(s),a=new Uint16Array(s),l=new Float32Array(s),f(0,u),u+=s.byteLength;function f(q,p,d=!1){let v=q*2;if(a[v+15]===65535){let h=o[q+6],g=a[v+14],x=1/0,b=1/0,y=1/0,_=-1/0,T=-1/0,S=-1/0;for(let E=3*h,w=3*(h+g);E<w;E++){let F=n[E],C=i.getX(F),M=i.getY(F),k=i.getZ(F);C<x&&(x=C),C>_&&(_=C),M<b&&(b=M),M>T&&(T=M),k<y&&(y=k),k>S&&(S=k)}return l[q+0]!==x||l[q+1]!==b||l[q+2]!==y||l[q+3]!==_||l[q+4]!==T||l[q+5]!==S?(l[q+0]=x,l[q+1]=b,l[q+2]=y,l[q+3]=_,l[q+4]=T,l[q+5]=S,!0):!1}else{let h=q+8,g=o[q+6],x=h+p,b=g+p,y=d,_=!1,T=!1;t?y||(_=t.has(x),T=t.has(b),y=!_&&!T):(_=!0,T=!0);let S=y||_,E=y||T,w=!1;S&&(w=f(h,p,y));let F=!1;E&&(F=f(g,p,y));let C=w||F;if(C)for(let M=0;M<3;M++){let k=h+M,I=g+M,L=l[k],V=l[k+3],G=l[I],H=l[I+3];l[q+M]=L<G?L:G,l[q+M+3]=V>H?V:H}return C}}}function Ae(e,t,r,n,i){let s,o,a,l,u,c,f=1/r.direction.x,q=1/r.direction.y,p=1/r.direction.z,d=r.origin.x,v=r.origin.y,m=r.origin.z,h=t[e],g=t[e+3],x=t[e+1],b=t[e+3+1],y=t[e+2],_=t[e+3+2];return f>=0?(s=(h-d)*f,o=(g-d)*f):(s=(g-d)*f,o=(h-d)*f),q>=0?(a=(x-v)*q,l=(b-v)*q):(a=(b-v)*q,l=(x-v)*q),s>l||a>o||((a>s||isNaN(s))&&(s=a),(l<o||isNaN(o))&&(o=l),p>=0?(u=(y-m)*p,c=(_-m)*p):(u=(_-m)*p,c=(y-m)*p),s>c||u>o)?!1:((u>s||s!==s)&&(s=u),(c<o||o!==o)&&(o=c),s<=i&&o>=n)}function C1(e,t,r,n,i,s,o,a){let{geometry:l,_indirectBuffer:u}=e;for(let c=n,f=n+i;c<f;c++){let q=u?u[c]:c;tr(l,t,r,q,s,o,a)}}function F1(e,t,r,n,i,s,o){let{geometry:a,_indirectBuffer:l}=e,u=1/0,c=null;for(let f=n,q=n+i;f<q;f++){let p;p=tr(a,t,r,l?l[f]:f,null,s,o),p&&p.distance<u&&(c=p,u=p.distance)}return c}function M1(e,t,r,n,i,s,o){let{geometry:a}=r,{index:l}=a,u=a.attributes.position;for(let c=e,f=t+e;c<f;c++){let q;if(q=r.resolveTriangleIndex(c),Q(o,q*3,l,u),o.needsUpdate=!0,n(o,q,i,s))return!0}return!1}function k1(e,t,r,n,i,s,o){W.setBuffer(e._roots[t]),is(0,e,r,n,i,s,o),W.clearBuffer()}function is(e,t,r,n,i,s,o){let{float32Array:a,uint16Array:l,uint32Array:u}=W,c=e*2;if(re(c,l)){let q=ae(e,u),p=fe(c,l);_1(t,r,n,q,p,i,s,o)}else{let q=de(e);Ae(q,a,n,s,o)&&is(q,t,r,n,i,s,o);let p=me(e,u);Ae(p,a,n,s,o)&&is(p,t,r,n,i,s,o)}}var z3=[\"x\",\"y\",\"z\"];function I1(e,t,r,n,i,s){W.setBuffer(e._roots[t]);let o=ss(0,e,r,n,i,s);return W.clearBuffer(),o}function ss(e,t,r,n,i,s){let{float32Array:o,uint16Array:a,uint32Array:l}=W,u=e*2;if(re(u,a)){let f=ae(e,l),q=fe(u,a);return w1(t,r,n,f,q,i,s)}else{let f=An(e,l),q=z3[f],d=n.direction[q]>=0,v,m;d?(v=de(e),m=me(e,l)):(v=me(e,l),m=de(e));let g=Ae(v,o,n,i,s)?ss(v,t,r,n,i,s):null;if(g){let y=g.point[q];if(d?y<=o[m+f]:y>=o[m+f+3])return g}let b=Ae(m,o,n,i,s)?ss(m,t,r,n,i,s):null;return g&&b?g.distance<=b.distance?g:b:g||b||null}}var Un=new xe,rr=new he,nr=new he,Lr=new qe,B1=new ne,On=new ne;function R1(e,t,r,n){W.setBuffer(e._roots[t]);let i=os(0,e,r,n);return W.clearBuffer(),i}function os(e,t,r,n,i=null){let{float32Array:s,uint16Array:o,uint32Array:a}=W,l=e*2;if(i===null&&(r.boundingBox||r.computeBoundingBox(),B1.set(r.boundingBox.min,r.boundingBox.max,n),i=B1),re(l,o)){let c=t.geometry,f=c.index,q=c.attributes.position,p=r.index,d=r.attributes.position,v=ae(e,a),m=fe(l,o);if(Lr.copy(n).invert(),r.boundsTree)return Z(e,s,On),On.matrix.copy(Lr),On.needsUpdate=!0,r.boundsTree.shapecast({intersectsBounds:g=>On.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(n),g.b.applyMatrix4(n),g.c.applyMatrix4(n),g.needsUpdate=!0;for(let x=v*3,b=(m+v)*3;x<b;x+=3)if(Q(nr,x,f,q),nr.needsUpdate=!0,g.intersectsTriangle(nr))return!0;return!1}});for(let h=v*3,g=(m+v)*3;h<g;h+=3){Q(rr,h,f,q),rr.a.applyMatrix4(Lr),rr.b.applyMatrix4(Lr),rr.c.applyMatrix4(Lr),rr.needsUpdate=!0;for(let x=0,b=p.count;x<b;x+=3)if(Q(nr,x,p,d),nr.needsUpdate=!0,rr.intersectsTriangle(nr))return!0}}else{let c=e+8,f=a[e+6];return Z(c,s,Un),!!(i.intersectsBox(Un)&&os(c,t,r,n,i)||(Z(f,s,Un),i.intersectsBox(Un)&&os(f,t,r,n,i)))}}var Dn=new qe,as=new ne,Pr=new ne,G3=new B,V3=new B,H3=new B,W3=new B;function U1(e,t,r,n={},i={},s=0,o=1/0){t.boundingBox||t.computeBoundingBox(),as.set(t.boundingBox.min,t.boundingBox.max,r),as.needsUpdate=!0;let a=e.geometry,l=a.attributes.position,u=a.index,c=t.attributes.position,f=t.index,q=ye.getPrimitive(),p=ye.getPrimitive(),d=G3,v=V3,m=null,h=null;i&&(m=H3,h=W3);let g=1/0,x=null,b=null;return Dn.copy(r).invert(),Pr.matrix.copy(Dn),e.shapecast({boundsTraverseOrder:y=>as.distanceToBox(y),intersectsBounds:(y,_,T)=>T<g&&T<o?(_&&(Pr.min.copy(y.min),Pr.max.copy(y.max),Pr.needsUpdate=!0),!0):!1,intersectsRange:(y,_)=>{if(t.boundsTree)return t.boundsTree.shapecast({boundsTraverseOrder:S=>Pr.distanceToBox(S),intersectsBounds:(S,E,w)=>w<g&&w<o,intersectsRange:(S,E)=>{for(let w=S,F=S+E;w<F;w++){Q(p,3*w,f,c),p.a.applyMatrix4(r),p.b.applyMatrix4(r),p.c.applyMatrix4(r),p.needsUpdate=!0;for(let C=y,M=y+_;C<M;C++){Q(q,3*C,u,l),q.needsUpdate=!0;let k=q.distanceToTriangle(p,d,m);if(k<g&&(v.copy(d),h&&h.copy(m),g=k,x=C,b=w),k<s)return!0}}}});{let T=He(t);for(let S=0,E=T;S<E;S++){Q(p,3*S,f,c),p.a.applyMatrix4(r),p.b.applyMatrix4(r),p.c.applyMatrix4(r),p.needsUpdate=!0;for(let w=y,F=y+_;w<F;w++){Q(q,3*w,u,l),q.needsUpdate=!0;let C=q.distanceToTriangle(p,d,m);if(C<g&&(v.copy(d),h&&h.copy(m),g=C,x=w,b=S),C<s)return!0}}}}}),ye.releasePrimitive(q),ye.releasePrimitive(p),g===1/0?null:(n.point?n.point.copy(v):n.point=v.clone(),n.distance=g,n.faceIndex=x,i&&(i.point?i.point.copy(h):i.point=h.clone(),i.point.applyMatrix4(Dn),v.applyMatrix4(Dn),i.distance=v.sub(i.point).length(),i.faceIndex=b),n)}function O1(e,t=null){t&&Array.isArray(t)&&(t=new Set(t));let r=e.geometry,n=r.index?r.index.array:null,i=r.attributes.position,s,o,a,l,u=0,c=e._roots;for(let q=0,p=c.length;q<p;q++)s=c[q],o=new Uint32Array(s),a=new Uint16Array(s),l=new Float32Array(s),f(0,u),u+=s.byteLength;function f(q,p,d=!1){let v=q*2;if(a[v+15]===65535){let h=o[q+6],g=a[v+14],x=1/0,b=1/0,y=1/0,_=-1/0,T=-1/0,S=-1/0;for(let E=h,w=h+g;E<w;E++){let F=3*e.resolveTriangleIndex(E);for(let C=0;C<3;C++){let M=F+C;M=n?n[M]:M;let k=i.getX(M),I=i.getY(M),L=i.getZ(M);k<x&&(x=k),k>_&&(_=k),I<b&&(b=I),I>T&&(T=I),L<y&&(y=L),L>S&&(S=L)}}return l[q+0]!==x||l[q+1]!==b||l[q+2]!==y||l[q+3]!==_||l[q+4]!==T||l[q+5]!==S?(l[q+0]=x,l[q+1]=b,l[q+2]=y,l[q+3]=_,l[q+4]=T,l[q+5]=S,!0):!1}else{let h=q+8,g=o[q+6],x=h+p,b=g+p,y=d,_=!1,T=!1;t?y||(_=t.has(x),T=t.has(b),y=!_&&!T):(_=!0,T=!0);let S=y||_,E=y||T,w=!1;S&&(w=f(h,p,y));let F=!1;E&&(F=f(g,p,y));let C=w||F;if(C)for(let M=0;M<3;M++){let k=h+M,I=g+M,L=l[k],V=l[k+3],G=l[I],H=l[I+3];l[q+M]=L<G?L:G,l[q+M+3]=V>H?V:H}return C}}}function D1(e,t,r,n,i,s,o){W.setBuffer(e._roots[t]),ls(0,e,r,n,i,s,o),W.clearBuffer()}function ls(e,t,r,n,i,s,o){let{float32Array:a,uint16Array:l,uint32Array:u}=W,c=e*2;if(re(c,l)){let q=ae(e,u),p=fe(c,l);C1(t,r,n,q,p,i,s,o)}else{let q=de(e);Ae(q,a,n,s,o)&&ls(q,t,r,n,i,s,o);let p=me(e,u);Ae(p,a,n,s,o)&&ls(p,t,r,n,i,s,o)}}var X3=[\"x\",\"y\",\"z\"];function L1(e,t,r,n,i,s){W.setBuffer(e._roots[t]);let o=cs(0,e,r,n,i,s);return W.clearBuffer(),o}function cs(e,t,r,n,i,s){let{float32Array:o,uint16Array:a,uint32Array:l}=W,u=e*2;if(re(u,a)){let f=ae(e,l),q=fe(u,a);return F1(t,r,n,f,q,i,s)}else{let f=An(e,l),q=X3[f],d=n.direction[q]>=0,v,m;d?(v=de(e),m=me(e,l)):(v=me(e,l),m=de(e));let g=Ae(v,o,n,i,s)?cs(v,t,r,n,i,s):null;if(g){let y=g.point[q];if(d?y<=o[m+f]:y>=o[m+f+3])return g}let b=Ae(m,o,n,i,s)?cs(m,t,r,n,i,s):null;return g&&b?g.distance<=b.distance?g:b:g||b||null}}var Ln=new xe,ir=new he,sr=new he,Nr=new qe,P1=new ne,Pn=new ne;function N1(e,t,r,n){W.setBuffer(e._roots[t]);let i=us(0,e,r,n);return W.clearBuffer(),i}function us(e,t,r,n,i=null){let{float32Array:s,uint16Array:o,uint32Array:a}=W,l=e*2;if(i===null&&(r.boundingBox||r.computeBoundingBox(),P1.set(r.boundingBox.min,r.boundingBox.max,n),i=P1),re(l,o)){let c=t.geometry,f=c.index,q=c.attributes.position,p=r.index,d=r.attributes.position,v=ae(e,a),m=fe(l,o);if(Nr.copy(n).invert(),r.boundsTree)return Z(e,s,Pn),Pn.matrix.copy(Nr),Pn.needsUpdate=!0,r.boundsTree.shapecast({intersectsBounds:g=>Pn.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(n),g.b.applyMatrix4(n),g.c.applyMatrix4(n),g.needsUpdate=!0;for(let x=v,b=m+v;x<b;x++)if(Q(sr,3*t.resolveTriangleIndex(x),f,q),sr.needsUpdate=!0,g.intersectsTriangle(sr))return!0;return!1}});for(let h=v,g=m+v;h<g;h++){let x=t.resolveTriangleIndex(h);Q(ir,3*x,f,q),ir.a.applyMatrix4(Nr),ir.b.applyMatrix4(Nr),ir.c.applyMatrix4(Nr),ir.needsUpdate=!0;for(let b=0,y=p.count;b<y;b+=3)if(Q(sr,b,p,d),sr.needsUpdate=!0,ir.intersectsTriangle(sr))return!0}}else{let c=e+8,f=a[e+6];return Z(c,s,Ln),!!(i.intersectsBox(Ln)&&us(c,t,r,n,i)||(Z(f,s,Ln),i.intersectsBox(Ln)&&us(f,t,r,n,i)))}}var Nn=new qe,qs=new ne,zr=new ne,j3=new B,Y3=new B,K3=new B,Z3=new B;function z1(e,t,r,n={},i={},s=0,o=1/0){t.boundingBox||t.computeBoundingBox(),qs.set(t.boundingBox.min,t.boundingBox.max,r),qs.needsUpdate=!0;let a=e.geometry,l=a.attributes.position,u=a.index,c=t.attributes.position,f=t.index,q=ye.getPrimitive(),p=ye.getPrimitive(),d=j3,v=Y3,m=null,h=null;i&&(m=K3,h=Z3);let g=1/0,x=null,b=null;return Nn.copy(r).invert(),zr.matrix.copy(Nn),e.shapecast({boundsTraverseOrder:y=>qs.distanceToBox(y),intersectsBounds:(y,_,T)=>T<g&&T<o?(_&&(zr.min.copy(y.min),zr.max.copy(y.max),zr.needsUpdate=!0),!0):!1,intersectsRange:(y,_)=>{if(t.boundsTree){let T=t.boundsTree;return T.shapecast({boundsTraverseOrder:S=>zr.distanceToBox(S),intersectsBounds:(S,E,w)=>w<g&&w<o,intersectsRange:(S,E)=>{for(let w=S,F=S+E;w<F;w++){let C=T.resolveTriangleIndex(w);Q(p,3*C,f,c),p.a.applyMatrix4(r),p.b.applyMatrix4(r),p.c.applyMatrix4(r),p.needsUpdate=!0;for(let M=y,k=y+_;M<k;M++){let I=e.resolveTriangleIndex(M);Q(q,3*I,u,l),q.needsUpdate=!0;let L=q.distanceToTriangle(p,d,m);if(L<g&&(v.copy(d),h&&h.copy(m),g=L,x=M,b=w),L<s)return!0}}}})}else{let T=He(t);for(let S=0,E=T;S<E;S++){Q(p,3*S,f,c),p.a.applyMatrix4(r),p.b.applyMatrix4(r),p.c.applyMatrix4(r),p.needsUpdate=!0;for(let w=y,F=y+_;w<F;w++){let C=e.resolveTriangleIndex(w);Q(q,3*C,u,l),q.needsUpdate=!0;let M=q.distanceToTriangle(p,d,m);if(M<g&&(v.copy(d),h&&h.copy(m),g=M,x=w,b=S),M<s)return!0}}}}}),ye.releasePrimitive(q),ye.releasePrimitive(p),g===1/0?null:(n.point?n.point.copy(v):n.point=v.clone(),n.distance=g,n.faceIndex=x,i&&(i.point?i.point.copy(h):i.point=h.clone(),i.point.applyMatrix4(Nn),v.applyMatrix4(Nn),i.distance=v.sub(i.point).length(),i.faceIndex=b),n)}function G1(){return typeof SharedArrayBuffer<\"u\"}var Gr=new W.constructor,zn=new W.constructor,dt=new pt(()=>new xe),or=new xe,ar=new xe,fs=new xe,ps=new xe,hs=!1;function V1(e,t,r,n){if(hs)throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");hs=!0;let i=e._roots,s=t._roots,o,a=0,l=0,u=new qe().copy(r).invert();for(let c=0,f=i.length;c<f;c++){Gr.setBuffer(i[c]),l=0;let q=dt.getPrimitive();Z(0,Gr.float32Array,q),q.applyMatrix4(u);for(let p=0,d=s.length;p<d&&(zn.setBuffer(s[p]),o=Be(0,0,r,u,n,a,l,0,0,q),zn.clearBuffer(),l+=s[p].length,!o);p++);if(dt.releasePrimitive(q),Gr.clearBuffer(),a+=i[c].length,o)break}return hs=!1,o}function Be(e,t,r,n,i,s=0,o=0,a=0,l=0,u=null,c=!1){let f,q;c?(f=zn,q=Gr):(f=Gr,q=zn);let p=f.float32Array,d=f.uint32Array,v=f.uint16Array,m=q.float32Array,h=q.uint32Array,g=q.uint16Array,x=e*2,b=t*2,y=re(x,v),_=re(b,g),T=!1;if(_&&y)c?T=i(ae(t,h),fe(t*2,g),ae(e,d),fe(e*2,v),l,o+t,a,s+e):T=i(ae(e,d),fe(e*2,v),ae(t,h),fe(t*2,g),a,s+e,l,o+t);else if(_){let S=dt.getPrimitive();Z(t,m,S),S.applyMatrix4(r);let E=de(e),w=me(e,d);Z(E,p,or),Z(w,p,ar);let F=S.intersectsBox(or),C=S.intersectsBox(ar);T=F&&Be(t,E,n,r,i,o,s,l,a+1,S,!c)||C&&Be(t,w,n,r,i,o,s,l,a+1,S,!c),dt.releasePrimitive(S)}else{let S=de(t),E=me(t,h);Z(S,m,fs),Z(E,m,ps);let w=u.intersectsBox(fs),F=u.intersectsBox(ps);if(w&&F)T=Be(e,S,r,n,i,s,o,a,l+1,u,c)||Be(e,E,r,n,i,s,o,a,l+1,u,c);else if(w)if(y)T=Be(e,S,r,n,i,s,o,a,l+1,u,c);else{let C=dt.getPrimitive();C.copy(fs).applyMatrix4(r);let M=de(e),k=me(e,d);Z(M,p,or),Z(k,p,ar);let I=C.intersectsBox(or),L=C.intersectsBox(ar);T=I&&Be(S,M,n,r,i,o,s,l,a+1,C,!c)||L&&Be(S,k,n,r,i,o,s,l,a+1,C,!c),dt.releasePrimitive(C)}else if(F)if(y)T=Be(e,E,r,n,i,s,o,a,l+1,u,c);else{let C=dt.getPrimitive();C.copy(ps).applyMatrix4(r);let M=de(e),k=me(e,d);Z(M,p,or),Z(k,p,ar);let I=C.intersectsBox(or),L=C.intersectsBox(ar);T=I&&Be(E,M,n,r,i,o,s,l,a+1,C,!c)||L&&Be(E,k,n,r,i,o,s,l,a+1,C,!c),dt.releasePrimitive(C)}}return T}var Gn=new ne,H1=new xe,Q3={strategy:0,maxDepth:40,maxLeafTris:10,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,verbose:!0,range:null},Vr=class e{static serialize(t,r={}){r={cloneBuffers:!0,...r};let n=t.geometry,i=t._roots,s=t._indirectBuffer,o=n.getIndex(),a;return r.cloneBuffers?a={roots:i.map(l=>l.slice()),index:o?o.array.slice():null,indirectBuffer:s?s.slice():null}:a={roots:i,index:o?o.array:null,indirectBuffer:s},a}static deserialize(t,r,n={}){n={setIndex:!0,indirect:!!t.indirectBuffer,...n};let{index:i,roots:s,indirectBuffer:o}=t,a=new e(r,{...n,[_n]:!0});if(a._roots=s,a._indirectBuffer=o||null,n.setIndex){let l=r.getIndex();if(l===null){let u=new Qe(t.index,1,!1);r.setIndex(u)}else l.array!==i&&(l.array.set(i),l.needsUpdate=!0)}return a}get indirect(){return!!this._indirectBuffer}constructor(t,r={}){if(t.isBufferGeometry){if(t.index&&t.index.isInterleavedBufferAttribute)throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\")}else throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");if(r=Object.assign({...Q3,[_n]:!1},r),r.useSharedArrayBuffer&&!G1())throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");this.geometry=t,this._roots=null,this._indirectBuffer=null,r[_n]||(v1(this,r),!t.boundingBox&&r.setBoundingBox&&(t.boundingBox=this.getBoundingBox(new xe))),this.resolveTriangleIndex=r.indirect?n=>this._indirectBuffer[n]:n=>n}refit(t=null){return(this.indirect?O1:A1)(this,t)}traverse(t,r=0){let n=this._roots[r],i=new Uint32Array(n),s=new Uint16Array(n);o(0);function o(a,l=0){let u=a*2,c=s[u+15]===65535;if(c){let f=i[a+6],q=s[u+14];t(l,c,new Float32Array(n,a*4,6),f,q)}else{let f=a+32/4,q=i[a+6],p=i[a+7];t(l,c,new Float32Array(n,a*4,6),p)||(o(f,l+1),o(q,l+1))}}}raycast(t,r=Wi,n=0,i=1/0){let s=this._roots,o=this.geometry,a=[],l=r.isMaterial,u=Array.isArray(r),c=o.groups,f=l?r.side:r,q=this.indirect?D1:k1;for(let p=0,d=s.length;p<d;p++){let v=u?r[c[p].materialIndex].side:f,m=a.length;if(q(this,p,v,t,a,n,i),u){let h=c[p].materialIndex;for(let g=m,x=a.length;g<x;g++)a[g].face.materialIndex=h}}return a}raycastFirst(t,r=Wi,n=0,i=1/0){let s=this._roots,o=this.geometry,a=r.isMaterial,l=Array.isArray(r),u=null,c=o.groups,f=a?r.side:r,q=this.indirect?L1:I1;for(let p=0,d=s.length;p<d;p++){let v=l?r[c[p].materialIndex].side:f,m=q(this,p,v,t,n,i);m!=null&&(u==null||m.distance<u.distance)&&(u=m,l&&(m.face.materialIndex=c[p].materialIndex))}return u}intersectsGeometry(t,r){let n=!1,i=this._roots,s=this.indirect?N1:R1;for(let o=0,a=i.length;o<a&&(n=s(this,o,t,r),!n);o++);return n}shapecast(t){let r=ye.getPrimitive(),n=this.indirect?M1:E1,{boundsTraverseOrder:i,intersectsBounds:s,intersectsRange:o,intersectsTriangle:a}=t;if(o&&a){let f=o;o=(q,p,d,v,m)=>f(q,p,d,v,m)?!0:n(q,p,this,a,d,v,r)}else o||(a?o=(f,q,p,d)=>n(f,q,this,a,p,d,r):o=(f,q,p)=>p);let l=!1,u=0,c=this._roots;for(let f=0,q=c.length;f<q;f++){let p=c[f];if(l=x1(this,f,s,o,i,u),l)break;u+=p.byteLength}return ye.releasePrimitive(r),l}bvhcast(t,r,n){let{intersectsRanges:i,intersectsTriangles:s}=n,o=ye.getPrimitive(),a=this.geometry.index,l=this.geometry.attributes.position,u=this.indirect?d=>{let v=this.resolveTriangleIndex(d);Q(o,v*3,a,l)}:d=>{Q(o,d*3,a,l)},c=ye.getPrimitive(),f=t.geometry.index,q=t.geometry.attributes.position,p=t.indirect?d=>{let v=t.resolveTriangleIndex(d);Q(c,v*3,f,q)}:d=>{Q(c,d*3,f,q)};if(s){let d=(v,m,h,g,x,b,y,_)=>{for(let T=h,S=h+g;T<S;T++){p(T),c.a.applyMatrix4(r),c.b.applyMatrix4(r),c.c.applyMatrix4(r),c.needsUpdate=!0;for(let E=v,w=v+m;E<w;E++)if(u(E),o.needsUpdate=!0,s(o,c,E,T,x,b,y,_))return!0}return!1};if(i){let v=i;i=function(m,h,g,x,b,y,_,T){return v(m,h,g,x,b,y,_,T)?!0:d(m,h,g,x,b,y,_,T)}}else i=d}return V1(this,t,r,i)}intersectsBox(t,r){return Gn.set(t.min,t.max,r),Gn.needsUpdate=!0,this.shapecast({intersectsBounds:n=>Gn.intersectsBox(n),intersectsTriangle:n=>Gn.intersectsTriangle(n)})}intersectsSphere(t){return this.shapecast({intersectsBounds:r=>t.intersectsBox(r),intersectsTriangle:r=>r.intersectsSphere(t)})}closestPointToGeometry(t,r,n={},i={},s=0,o=1/0){return(this.indirect?z1:U1)(this,t,r,n,i,s,o)}closestPointToPoint(t,r={},n=0,i=1/0){return y1(this,t,r,n,i)}getBoundingBox(t){return t.makeEmpty(),this._roots.forEach(n=>{Z(0,new Float32Array(n),H1),t.union(H1)}),t}};var W1=`\n\n// A stack of uint32 indices can can store the indices for\n// a perfectly balanced tree with a depth up to 31. Lower stack\n// depth gets higher performance.\n//\n// However not all trees are balanced. Best value to set this to\n// is the trees max depth.\n#ifndef BVH_STACK_DEPTH\n#define BVH_STACK_DEPTH 60\n#endif\n\n#ifndef INFINITY\n#define INFINITY 1e20\n#endif\n\n// Utilities\nuvec4 uTexelFetch1D( usampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nivec4 iTexelFetch1D( isampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nvec4 texelFetch1D( sampler2D tex, uint index ) {\n\n\tuint width = uint( textureSize( tex, 0 ).x );\n\tuvec2 uv;\n\tuv.x = index % width;\n\tuv.y = index / width;\n\n\treturn texelFetch( tex, ivec2( uv ), 0 );\n\n}\n\nvec4 textureSampleBarycoord( sampler2D tex, vec3 barycoord, uvec3 faceIndices ) {\n\n\treturn\n\t\tbarycoord.x * texelFetch1D( tex, faceIndices.x ) +\n\t\tbarycoord.y * texelFetch1D( tex, faceIndices.y ) +\n\t\tbarycoord.z * texelFetch1D( tex, faceIndices.z );\n\n}\n\nvoid ndcToCameraRay(\n\tvec2 coord, mat4 cameraWorld, mat4 invProjectionMatrix,\n\tout vec3 rayOrigin, out vec3 rayDirection\n) {\n\n\t// get camera look direction and near plane for camera clipping\n\tvec4 lookDirection = cameraWorld * vec4( 0.0, 0.0, - 1.0, 0.0 );\n\tvec4 nearVector = invProjectionMatrix * vec4( 0.0, 0.0, - 1.0, 1.0 );\n\tfloat near = abs( nearVector.z / nearVector.w );\n\n\t// get the camera direction and position from camera matrices\n\tvec4 origin = cameraWorld * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec4 direction = invProjectionMatrix * vec4( coord, 0.5, 1.0 );\n\tdirection /= direction.w;\n\tdirection = cameraWorld * direction - origin;\n\n\t// slide the origin along the ray until it sits at the near clip plane position\n\torigin.xyz += direction.xyz * near / dot( direction, lookDirection );\n\n\trayOrigin = origin.xyz;\n\trayDirection = direction.xyz;\n\n}\n`;var X1=`\n\n#ifndef TRI_INTERSECT_EPSILON\n#define TRI_INTERSECT_EPSILON 1e-5\n#endif\n\n// Raycasting\nbool intersectsBounds( vec3 rayOrigin, vec3 rayDirection, vec3 boundsMin, vec3 boundsMax, out float dist ) {\n\n\t// https://www.reddit.com/r/opengl/comments/8ntzz5/fast_glsl_ray_box_intersection/\n\t// https://tavianator.com/2011/ray_box.html\n\tvec3 invDir = 1.0 / rayDirection;\n\n\t// find intersection distances for each plane\n\tvec3 tMinPlane = invDir * ( boundsMin - rayOrigin );\n\tvec3 tMaxPlane = invDir * ( boundsMax - rayOrigin );\n\n\t// get the min and max distances from each intersection\n\tvec3 tMinHit = min( tMaxPlane, tMinPlane );\n\tvec3 tMaxHit = max( tMaxPlane, tMinPlane );\n\n\t// get the furthest hit distance\n\tvec2 t = max( tMinHit.xx, tMinHit.yz );\n\tfloat t0 = max( t.x, t.y );\n\n\t// get the minimum hit distance\n\tt = min( tMaxHit.xx, tMaxHit.yz );\n\tfloat t1 = min( t.x, t.y );\n\n\t// set distance to 0.0 if the ray starts inside the box\n\tdist = max( t0, 0.0 );\n\n\treturn t1 >= dist;\n\n}\n\nbool intersectsTriangle(\n\tvec3 rayOrigin, vec3 rayDirection, vec3 a, vec3 b, vec3 c,\n\tout vec3 barycoord, out vec3 norm, out float dist, out float side\n) {\n\n\t// https://stackoverflow.com/questions/42740765/intersection-between-line-and-triangle-in-3d\n\tvec3 edge1 = b - a;\n\tvec3 edge2 = c - a;\n\tnorm = cross( edge1, edge2 );\n\n\tfloat det = - dot( rayDirection, norm );\n\tfloat invdet = 1.0 / det;\n\n\tvec3 AO = rayOrigin - a;\n\tvec3 DAO = cross( AO, rayDirection );\n\n\tvec4 uvt;\n\tuvt.x = dot( edge2, DAO ) * invdet;\n\tuvt.y = - dot( edge1, DAO ) * invdet;\n\tuvt.z = dot( AO, norm ) * invdet;\n\tuvt.w = 1.0 - uvt.x - uvt.y;\n\n\t// set the hit information\n\tbarycoord = uvt.wxy; // arranged in A, B, C order\n\tdist = uvt.z;\n\tside = sign( det );\n\tnorm = side * normalize( norm );\n\n\t// add an epsilon to avoid misses between triangles\n\tuvt += vec4( TRI_INTERSECT_EPSILON );\n\n\treturn all( greaterThanEqual( uvt, vec4( 0.0 ) ) );\n\n}\n\nbool intersectTriangles(\n\t// geometry info and triangle range\n\tsampler2D positionAttr, usampler2D indexAttr, uint offset, uint count,\n\n\t// ray\n\tvec3 rayOrigin, vec3 rayDirection,\n\n\t// outputs\n\tinout float minDistance, inout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord,\n\tinout float side, inout float dist\n) {\n\n\tbool found = false;\n\tvec3 localBarycoord, localNormal;\n\tfloat localDist, localSide;\n\tfor ( uint i = offset, l = offset + count; i < l; i ++ ) {\n\n\t\tuvec3 indices = uTexelFetch1D( indexAttr, i ).xyz;\n\t\tvec3 a = texelFetch1D( positionAttr, indices.x ).rgb;\n\t\tvec3 b = texelFetch1D( positionAttr, indices.y ).rgb;\n\t\tvec3 c = texelFetch1D( positionAttr, indices.z ).rgb;\n\n\t\tif (\n\t\t\tintersectsTriangle( rayOrigin, rayDirection, a, b, c, localBarycoord, localNormal, localDist, localSide )\n\t\t\t&& localDist < minDistance\n\t\t) {\n\n\t\t\tfound = true;\n\t\t\tminDistance = localDist;\n\n\t\t\tfaceIndices = uvec4( indices.xyz, i );\n\t\t\tfaceNormal = localNormal;\n\n\t\t\tside = localSide;\n\t\t\tbarycoord = localBarycoord;\n\t\t\tdist = localDist;\n\n\t\t}\n\n\t}\n\n\treturn found;\n\n}\n\nbool intersectsBVHNodeBounds( vec3 rayOrigin, vec3 rayDirection, sampler2D bvhBounds, uint currNodeIndex, out float dist ) {\n\n\tuint cni2 = currNodeIndex * 2u;\n\tvec3 boundsMin = texelFetch1D( bvhBounds, cni2 ).xyz;\n\tvec3 boundsMax = texelFetch1D( bvhBounds, cni2 + 1u ).xyz;\n\treturn intersectsBounds( rayOrigin, rayDirection, boundsMin, boundsMax, dist );\n\n}\n\n// use a macro to hide the fact that we need to expand the struct into separate fields\n#define\tbvhIntersectFirstHit(\t\tbvh,\t\trayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist\t)\t_bvhIntersectFirstHit(\t\tbvh.position, bvh.index, bvh.bvhBounds, bvh.bvhContents,\t\trayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist\t)\n\nbool _bvhIntersectFirstHit(\n\t// bvh info\n\tsampler2D bvh_position, usampler2D bvh_index, sampler2D bvh_bvhBounds, usampler2D bvh_bvhContents,\n\n\t// ray\n\tvec3 rayOrigin, vec3 rayDirection,\n\n\t// output variables split into separate variables due to output precision\n\tinout uvec4 faceIndices, inout vec3 faceNormal, inout vec3 barycoord,\n\tinout float side, inout float dist\n) {\n\n\t// stack needs to be twice as long as the deepest tree we expect because\n\t// we push both the left and right child onto the stack every traversal\n\tint ptr = 0;\n\tuint stack[ BVH_STACK_DEPTH ];\n\tstack[ 0 ] = 0u;\n\n\tfloat triangleDistance = INFINITY;\n\tbool found = false;\n\twhile ( ptr > - 1 && ptr < BVH_STACK_DEPTH ) {\n\n\t\tuint currNodeIndex = stack[ ptr ];\n\t\tptr --;\n\n\t\t// check if we intersect the current bounds\n\t\tfloat boundsHitDistance;\n\t\tif (\n\t\t\t! intersectsBVHNodeBounds( rayOrigin, rayDirection, bvh_bvhBounds, currNodeIndex, boundsHitDistance )\n\t\t\t|| boundsHitDistance > triangleDistance\n\t\t) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tuvec2 boundsInfo = uTexelFetch1D( bvh_bvhContents, currNodeIndex ).xy;\n\t\tbool isLeaf = bool( boundsInfo.x & 0xffff0000u );\n\n\t\tif ( isLeaf ) {\n\n\t\t\tuint count = boundsInfo.x & 0x0000ffffu;\n\t\t\tuint offset = boundsInfo.y;\n\n\t\t\tfound = intersectTriangles(\n\t\t\t\tbvh_position, bvh_index, offset, count,\n\t\t\t\trayOrigin, rayDirection, triangleDistance,\n\t\t\t\tfaceIndices, faceNormal, barycoord, side, dist\n\t\t\t) || found;\n\n\t\t} else {\n\n\t\t\tuint leftIndex = currNodeIndex + 1u;\n\t\t\tuint splitAxis = boundsInfo.x & 0x0000ffffu;\n\t\t\tuint rightIndex = boundsInfo.y;\n\n\t\t\tbool leftToRight = rayDirection[ splitAxis ] >= 0.0;\n\t\t\tuint c1 = leftToRight ? leftIndex : rightIndex;\n\t\t\tuint c2 = leftToRight ? rightIndex : leftIndex;\n\n\t\t\t// set c2 in the stack so we traverse it later. We need to keep track of a pointer in\n\t\t\t// the stack while we traverse. The second pointer added is the one that will be\n\t\t\t// traversed first\n\t\t\tptr ++;\n\t\t\tstack[ ptr ] = c2;\n\n\t\t\tptr ++;\n\t\t\tstack[ ptr ] = c1;\n\n\t\t}\n\n\t}\n\n\treturn found;\n\n}\n`;var Lg=`\n\t${W1}\n\t${X1}\n`;var j1=Math.pow(10,-Math.log10(1e-6)),$3=5e-7*j1;function Re(e){return~~(e*j1+$3)}function Y1(e){return`${Re(e.x)},${Re(e.y)}`}function ds(e){return`${Re(e.x)},${Re(e.y)},${Re(e.z)}`}function K1(e){return`${Re(e.x)},${Re(e.y)},${Re(e.z)},${Re(e.w)}`}function Z1(e,t,r){r.direction.subVectors(t,e).normalize();let n=e.dot(r.direction);return r.origin.copy(e).addScaledVector(r.direction,-n),r}function Vn(){return typeof SharedArrayBuffer<\"u\"}function Q1(e){if(e.buffer instanceof SharedArrayBuffer)return e;let t=e.constructor,r=e.buffer,n=new SharedArrayBuffer(r.byteLength),i=new Uint8Array(r);return new Uint8Array(n).set(i,0),new t(n)}function e5(e,t=ArrayBuffer){return e>65535?new Uint32Array(new t(4*e)):new Uint16Array(new t(2*e))}function J1(e,t){if(!e.index){let r=e.attributes.position.count,n=t.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=e5(r,n);e.setIndex(new Qe(i,1));for(let s=0;s<r;s++)i[s]=s}}function t5(e){return e.index?e.index.count:e.attributes.position.count}function lr(e){return t5(e)/3}var r5=1e-8,n5=new B;function ea(e){return~~(e/3)}function ta(e){return e%3}function $1(e,t){return e.start-t.start}function ms(e,t){return n5.subVectors(t,e.origin).dot(e.direction)}function ra(e,t,r,n=r5){e.sort($1),t.sort($1);for(let a=0;a<e.length;a++){let l=e[a];for(let u=0;u<t.length;u++){let c=t[u];if(!(c.start>l.end)){if(l.end<c.start||c.end<l.start)continue;if(l.start<=c.start&&l.end>=c.end)s(c.end,l.end)||e.splice(a+1,0,{start:c.end,end:l.end,index:l.index}),l.end=c.start,c.start=0,c.end=0;else if(l.start>=c.start&&l.end<=c.end)s(l.end,c.end)||t.splice(u+1,0,{start:l.end,end:c.end,index:c.index}),c.end=l.start,l.start=0,l.end=0;else if(l.start<=c.start&&l.end<=c.end){let f=l.end;l.end=c.start,c.start=f}else if(l.start>=c.start&&l.end>=c.end){let f=c.end;c.end=l.start,l.start=f}else throw new Error}if(r.has(l.index)||r.set(l.index,[]),r.has(c.index)||r.set(c.index,[]),r.get(l.index).push(c.index),r.get(c.index).push(l.index),o(c)&&(t.splice(u,1),u--),o(l)){e.splice(a,1),a--;break}}}i(e),i(t);function i(a){for(let l=0;l<a.length;l++)o(a[l])&&(a.splice(l,1),l--)}function s(a,l){return Math.abs(l-a)<n}function o(a){return Math.abs(a.end-a.start)<n}}var Hn=class{constructor(){this._rays=[]}addRay(t){this._rays.push(t)}findClosestRay(t){let r=this._rays,n=t.clone();n.direction.multiplyScalar(-1);let i=1/0,s=null;for(let l=0,u=r.length;l<u;l++){let c=r[l];if(o(c,t)&&o(c,n))continue;let f=a(c,t),q=a(c,n),p=Math.min(f,q);p<i&&(i=p,s=c)}return s;function o(l,u){let c=l.origin.distanceTo(u.origin)>1e-5;return l.direction.angleTo(u.direction)>1e-4||c}function a(l,u){let c=l.origin.distanceTo(u.origin),f=l.direction.angleTo(u.direction);return c/1e-5+f/1e-4}}};var vs=new B,gs=new B,Wn=new Tn;function na(e,t,r){let n=e.attributes,i=e.index,s=n.position,o=new Map,a=new Map,l=Array.from(t),u=new Hn;for(let c=0,f=l.length;c<f;c++){let q=l[c],p=ea(q),d=ta(q),v=3*p+d,m=3*p+(d+1)%3;i&&(v=i.getX(v),m=i.getX(m)),vs.fromBufferAttribute(s,v),gs.fromBufferAttribute(s,m),Z1(vs,gs,Wn);let h,g=u.findClosestRay(Wn);g===null&&(g=Wn.clone(),u.addRay(g)),a.has(g)||a.set(g,{forward:[],reverse:[],ray:g}),h=a.get(g);let x=ms(g,vs),b=ms(g,gs);x>b&&([x,b]=[b,x]),Wn.direction.dot(g.direction)<0?h.reverse.push({start:x,end:b,index:q}):h.forward.push({start:x,end:b,index:q})}return a.forEach(({forward:c,reverse:f},q)=>{ra(c,f,o,r),c.length===0&&f.length===0&&a.delete(q)}),{disjointConnectivityMap:o,fragmentMap:a}}var i5=new Ie,xs=new B,s5=new Je,ys=[\"\",\"\",\"\"],Xn=class{constructor(t=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,t&&this.updateFrom(t)}getSiblingTriangleIndex(t,r){let n=this.data[t*3+r];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(t,r){let n=this.data[t*3+r];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(t,r){let n=t*3+r,i=this.disjointConnections.get(n);return i?i.map(s=>~~(s/3)):[]}getDisjointSiblingEdgeIndices(t,r){let n=t*3+r,i=this.disjointConnections.get(n);return i?i.map(s=>s%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(t){let{useAllAttributes:r,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:s}=this,o=r?x:g,a=new Map,{attributes:l}=t,u=r?Object.keys(l):null,c=t.index,f=l.position,q=lr(t),p=q,d=0;n&&(d=t.drawRange.start,t.drawRange.count!==1/0&&(q=~~(t.drawRange.count/3)));let v=this.data;(!v||v.length<3*p)&&(v=new Int32Array(3*p)),v.fill(-1);let m=0,h=new Set;for(let b=d,y=q*3+d;b<y;b+=3){let _=b;for(let T=0;T<3;T++){let S=_+T;c&&(S=c.getX(S)),ys[T]=o(S)}for(let T=0;T<3;T++){let S=(T+1)%3,E=ys[T],w=ys[S],F=`${w}_${E}`;if(a.has(F)){let C=_+T,M=a.get(F);v[C]=M,v[M]=C,a.delete(F),m+=2,h.delete(M)}else{let C=`${E}_${w}`,M=_+T;a.set(C,M),h.add(M)}}}if(i){let{fragmentMap:b,disjointConnectivityMap:y}=na(t,h,s);h.clear(),b.forEach(({forward:_,reverse:T})=>{_.forEach(({index:S})=>h.add(S)),T.forEach(({index:S})=>h.add(S))}),this.unmatchedDisjointEdges=b,this.disjointConnections=y,m=q*3-h.size}this.matchedEdges=m,this.unmatchedEdges=h.size,this.data=v;function g(b){return xs.fromBufferAttribute(f,b),ds(xs)}function x(b){let y=\"\";for(let _=0,T=u.length;_<T;_++){let S=l[u[_]],E;switch(S.itemSize){case 1:E=Re(S.getX(b));break;case 2:E=Y1(i5.fromBufferAttribute(S,b));break;case 3:E=ds(xs.fromBufferAttribute(S,b));break;case 4:E=K1(s5.fromBufferAttribute(S,b));break}y!==\"\"&&(y+=\"|\"),y+=E}return y}}};var mt=class extends Vi{constructor(...t){super(...t),this.isBrush=!0,this._previousMatrix=new qe,this._previousMatrix.elements.fill(0)}markUpdated(){this._previousMatrix.copy(this.matrix)}isDirty(){let{matrix:t,_previousMatrix:r}=this,n=t.elements,i=r.elements;for(let s=0;s<16;s++)if(n[s]!==i[s])return!0;return!1}prepareGeometry(){let t=this.geometry,r=t.attributes,n=Vn();if(n)for(let i in r){let s=r[i];if(s.isInterleavedBufferAttribute)throw new Error(\"Brush: InterleavedBufferAttributes are not supported.\");s.array=Q1(s.array)}if(t.boundsTree||(J1(t,{useSharedArrayBuffer:n}),t.boundsTree=new Vr(t,{maxLeafTris:3,indirect:!0,useSharedArrayBuffer:n})),t.halfEdges||(t.halfEdges=new Xn(t)),!t.groupIndices){let i=lr(t),s=new Uint16Array(i),o=t.groups;for(let a=0,l=o.length;a<l;a++){let{start:u,count:c}=o[a];for(let f=u/3,q=(u+c)/3;f<q;f++)s[f]=a}t.groupIndices=s}}disposeCacheData(){let{geometry:t}=this;t.halfEdges=null,t.boundsTree=null,t.groupIndices=null}};var o5=1e-14,bs=new B,ia=new B,sa=new B;function Ue(e,t=o5){bs.subVectors(e.b,e.a),ia.subVectors(e.c,e.a),sa.subVectors(e.b,e.c);let r=bs.angleTo(ia),n=bs.angleTo(sa),i=Math.PI-r-n;return Math.abs(r)<t||Math.abs(n)<t||Math.abs(i)<t||e.a.distanceToSquared(e.b)<t||e.a.distanceToSquared(e.c)<t||e.b.distanceToSquared(e.c)<t}var Ss=1e-10,Hr=1e-10,a5=1e-10,et=new ge,le=new ge,tt=new B,Ts=new B,oa=new B,jn=new Zt,_s=new he,ws=class{constructor(){this._pool=[],this._index=0}getTriangle(){return this._index>=this._pool.length&&this._pool.push(new oe),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}},Yn=class{constructor(){this.trianglePool=new ws,this.triangles=[],this.normal=new B,this.coplanarTriangleUsed=!1}initialize(t){this.reset();let{triangles:r,trianglePool:n,normal:i}=this;if(Array.isArray(t))for(let s=0,o=t.length;s<o;s++){let a=t[s];if(s===0)a.getNormal(i);else if(Math.abs(1-a.getNormal(tt).dot(i))>Ss)throw new Error(\"Triangle Splitter: Cannot initialize with triangles that have different normals.\");let l=n.getTriangle();l.copy(a),r.push(l)}else{t.getNormal(i);let s=n.getTriangle();s.copy(t),r.push(s)}}splitByTriangle(t){let{normal:r,triangles:n}=this;if(t.getNormal(Ts).normalize(),Math.abs(1-Math.abs(Ts.dot(r)))<a5){this.coplanarTriangleUsed=!0;for(let s=0,o=n.length;s<o;s++){let a=n[s];a.coplanarCount=0}let i=[t.a,t.b,t.c];for(let s=0;s<3;s++){let o=(s+1)%3,a=i[s],l=i[o];tt.subVectors(l,a).normalize(),oa.crossVectors(Ts,tt),jn.setFromNormalAndCoplanarPoint(oa,a),this.splitByPlane(jn,t)}}else t.getPlane(jn),this.splitByPlane(jn,t)}splitByPlane(t,r){let{triangles:n,trianglePool:i}=this;_s.copy(r),_s.needsUpdate=!0;for(let s=0,o=n.length;s<o;s++){let a=n[s];if(!_s.intersectsTriangle(a,et,!0))continue;let{a:l,b:u,c}=a,f=0,q=-1,p=!1,d=[],v=[],m=[l,u,c];for(let h=0;h<3;h++){let g=(h+1)%3;et.start.copy(m[h]),et.end.copy(m[g]);let x=t.distanceToPoint(et.start),b=t.distanceToPoint(et.end);if(Math.abs(x)<Hr&&Math.abs(b)<Hr){p=!0;break}if(x>0?d.push(h):v.push(h),Math.abs(x)<Hr)continue;let y=!!t.intersectLine(et,tt);!y&&Math.abs(b)<Hr&&(tt.copy(et.end),y=!0),y&&!(tt.distanceTo(et.start)<Ss)&&(tt.distanceTo(et.end)<Ss&&(q=h),f===0?le.start.copy(tt):le.end.copy(tt),f++)}if(!p&&f===2&&le.distance()>Hr)if(q!==-1){q=(q+1)%3;let h=0;h===q&&(h=(h+1)%3);let g=h+1;g===q&&(g=(g+1)%3);let x=i.getTriangle();x.a.copy(m[g]),x.b.copy(le.end),x.c.copy(le.start),Ue(x)||n.push(x),a.a.copy(m[h]),a.b.copy(le.start),a.c.copy(le.end),Ue(a)&&(n.splice(s,1),s--,o--)}else{let h=d.length>=2?v[0]:d[0];if(h===0){let _=le.start;le.start=le.end,le.end=_}let g=(h+1)%3,x=(h+2)%3,b=i.getTriangle(),y=i.getTriangle();m[g].distanceToSquared(le.start)<m[x].distanceToSquared(le.end)?(b.a.copy(m[g]),b.b.copy(le.start),b.c.copy(le.end),y.a.copy(m[g]),y.b.copy(m[x]),y.c.copy(le.start)):(b.a.copy(m[x]),b.b.copy(le.start),b.c.copy(le.end),y.a.copy(m[g]),y.b.copy(m[x]),y.c.copy(le.end)),a.a.copy(m[h]),a.b.copy(le.end),a.c.copy(le.start),Ue(b)||n.push(b),Ue(y)||n.push(y),Ue(a)&&(n.splice(s,1),s--,o--)}else f===3&&console.warn(\"TriangleClipper: Coplanar clip not handled\")}}reset(){this.triangles.length=0,this.trianglePool.clear(),this.coplanarTriangleUsed=!1}};function l5(e){return e=~~e,e+4-e%4}var Wr=class{constructor(t,r=500){this.expansionFactor=1.5,this.type=t,this.length=0,this.array=null,this.setSize(r)}setType(t){if(this.length!==0)throw new Error(\"TypeBackedArray: Cannot change the type while there is used data in the buffer.\");let r=this.array.buffer;this.array=new t(r),this.type=t}setSize(t){if(this.array&&t===this.array.length)return;let r=this.type,n=Vn()?SharedArrayBuffer:ArrayBuffer,i=new r(new n(l5(t*r.BYTES_PER_ELEMENT)));this.array&&i.set(this.array,0),this.array=i}expand(){let{array:t,expansionFactor:r}=this;this.setSize(t.length*r)}push(...t){let{array:r,length:n}=this;n+t.length>r.length&&(this.expand(),r=this.array);for(let i=0,s=t.length;i<s;i++)r[n+i]=t[i];this.length+=t.length}clear(){this.length=0}};var Kn=class{constructor(){this.groupAttributes=[{}],this.groupCount=0}getType(t){return this.groupAttributes[0][t].type}getItemSize(t){return this.groupAttributes[0][t].itemSize}getNormalized(t){return this.groupAttributes[0][t].normalized}getCount(t){if(this.groupCount<=t)return 0;let r=this.getGroupAttrArray(\"position\",t);return r.length/r.itemSize}getTotalLength(t){let{groupCount:r,groupAttributes:n}=this,i=0;for(let s=0;s<r;s++){let o=n[s];i+=o[t].length}return i}getGroupAttrSet(t=0){let{groupAttributes:r}=this;if(r[t])return this.groupCount=Math.max(this.groupCount,t+1),r[t];let n=r[0];for(this.groupCount=Math.max(this.groupCount,t+1);t>=r.length;){let i={};r.push(i);for(let s in n){let o=n[s],a=new Wr(o.type);a.itemSize=o.itemSize,a.normalized=o.normalized,i[s]=a}}return r[t]}getGroupAttrArray(t,r=0){let{groupAttributes:n}=this;if(!n[0][t])throw new Error(`TypedAttributeData: Attribute with \"${t}\" has not been initialized`);return this.getGroupAttrSet(r)[t]}initializeArray(t,r,n,i){let{groupAttributes:s}=this,a=s[0][t];if(a){if(a.type!==r)for(let l=0,u=s.length;l<u;l++){let c=s[l][t];c.setType(r),c.itemSize=n,c.normalized=i}}else for(let l=0,u=s.length;l<u;l++){let c=new Wr(r);c.itemSize=n,c.normalized=i,s[l][t]=c}}clear(){this.groupCount=0;let{groupAttributes:t}=this;t.forEach(r=>{for(let n in r)r[n].clear()})}delete(t){this.groupAttributes.forEach(r=>{delete r[t]})}reset(){this.groupAttributes=[],this.groupCount=0}};var Xr=class{constructor(){this.intersectionSet={},this.ids=[]}add(t,r){let{intersectionSet:n,ids:i}=this;n[t]||(n[t]=[],i.push(t)),n[t].push(r)}};var Ce=new Tn,aa=new qe,be=new oe,rt=new B,la=new Je,ca=new Je,ua=new Je,Es=new Je,Zn=new Je,Qn=new Je,qa=new ge,As=new B,Cs=1e-8,q5=1e-15,Bt=-1,Rt=1,Jn=-2,$n=2,cr=0,It=1,ti=2,f5=1e-14,ei=null;function ks(e){ei=e}function Is(e,t){e.getMidpoint(Ce.origin),e.getNormal(Ce.direction);let r=t.raycastFirst(Ce,kr);return!!(r&&Ce.direction.dot(r.face.normal)>0)?Bt:Rt}function va(e,t){function r(){return Math.random()-.5}e.getNormal(As),Ce.direction.copy(As),e.getMidpoint(Ce.origin);let n=3,i=0,s=1/0;for(let o=0;o<n;o++){Ce.direction.x+=r()*Cs,Ce.direction.y+=r()*Cs,Ce.direction.z+=r()*Cs,Ce.direction.multiplyScalar(-1);let a=t.raycastFirst(Ce,kr);if(!!(a&&Ce.direction.dot(a.face.normal)>0)&&i++,a!==null&&(s=Math.min(s,a.distance)),s<=q5)return a.face.normal.dot(As)>0?$n:Jn;if(i/n>.5||(o-i+1)/n>.5)break}return i/n>.5?Bt:Rt}function ga(e,t){let r=new Xr,n=new Xr;return aa.copy(e.matrixWorld).invert().multiply(t.matrixWorld),e.geometry.boundsTree.bvhcast(t.geometry.boundsTree,aa,{intersectsTriangles(i,s,o,a){if(!Ue(i)&&!Ue(s)){let l=i.intersectsTriangle(s,qa,!0);if(!l){let u=i.plane,c=s.plane,f=u.normal,q=c.normal;f.dot(q)===1&&Math.abs(u.constant-c.constant)<f5&&(l=!0)}if(l){let u=e.geometry.boundsTree.resolveTriangleIndex(o),c=t.geometry.boundsTree.resolveTriangleIndex(a);r.add(u,c),n.add(c,u),ei&&(ei.addEdge(qa),ei.addIntersectingTriangles(o,i,a,s))}}return!1}}),{aIntersections:r,bIntersections:n}}function xa(e,t,r,n,i,s,o=!1){let a=r.attributes,l=r.index,u=e*3,c=l.getX(u+0),f=l.getX(u+1),q=l.getX(u+2);for(let p in s){let d=a[p],v=s[p];if(!(p in a))throw new Error(`CSG Operations: Attribute ${p} not available on geometry.`);let m=d.itemSize;p===\"position\"?(be.a.fromBufferAttribute(d,c).applyMatrix4(n),be.b.fromBufferAttribute(d,f).applyMatrix4(n),be.c.fromBufferAttribute(d,q).applyMatrix4(n),Fs(be.a,be.b,be.c,t,3,v,o)):p===\"normal\"?(be.a.fromBufferAttribute(d,c).applyNormalMatrix(i),be.b.fromBufferAttribute(d,f).applyNormalMatrix(i),be.c.fromBufferAttribute(d,q).applyNormalMatrix(i),o&&(be.a.multiplyScalar(-1),be.b.multiplyScalar(-1),be.c.multiplyScalar(-1)),Fs(be.a,be.b,be.c,t,3,v,o,!0)):(la.fromBufferAttribute(d,c),ca.fromBufferAttribute(d,f),ua.fromBufferAttribute(d,q),Fs(la,ca,ua,t,m,v,o))}}function ya(e,t,r,n,i,s,o,a=!1){Ms(e,n,i,s,o,a),Ms(a?r:t,n,i,s,o,a),Ms(a?t:r,n,i,s,o,a)}function Bs(e,t,r=!1){switch(e){case 0:if(t===Rt||t===$n&&!r)return It;break;case 1:if(r){if(t===Bt)return cr}else if(t===Rt||t===Jn)return It;break;case 2:if(r){if(t===Rt||t===Jn)return It}else if(t===Bt)return cr;break;case 4:if(t===Bt)return cr;if(t===Rt)return It;break;case 3:if(t===Bt||t===$n&&!r)return It;break;case 5:if(!r&&(t===Rt||t===Jn))return It;break;case 6:if(!r&&(t===Bt||t===$n))return It;break;default:throw new Error(`Unrecognized CSG operation enum \"${e}\".`)}return ti}function Fs(e,t,r,n,i,s,o=!1,a=!1){let l=u=>{s.push(u.x),i>1&&s.push(u.y),i>2&&s.push(u.z),i>3&&s.push(u.w)};Es.set(0,0,0,0).addScaledVector(e,n.a.x).addScaledVector(t,n.a.y).addScaledVector(r,n.a.z),Zn.set(0,0,0,0).addScaledVector(e,n.b.x).addScaledVector(t,n.b.y).addScaledVector(r,n.b.z),Qn.set(0,0,0,0).addScaledVector(e,n.c.x).addScaledVector(t,n.c.y).addScaledVector(r,n.c.z),a&&(Es.normalize(),Zn.normalize(),Qn.normalize()),l(Es),o?(l(Qn),l(Zn)):(l(Zn),l(Qn))}function Ms(e,t,r,n,i,s=!1){for(let o in i){let a=t[o],l=i[o];if(!(o in t))throw new Error(`CSG Operations: Attribute ${o} no available on geometry.`);let u=a.itemSize;o===\"position\"?(rt.fromBufferAttribute(a,e).applyMatrix4(r),l.push(rt.x,rt.y,rt.z)):o===\"normal\"?(rt.fromBufferAttribute(a,e).applyNormalMatrix(n),s&&rt.multiplyScalar(-1),l.push(rt.x,rt.y,rt.z)):(l.push(a.getX(e)),u>1&&l.push(a.getY(e)),u>2&&l.push(a.getZ(e)),u>3&&l.push(a.getW(e)))}}var Rs=class{constructor(t){this.triangle=new oe().copy(t),this.intersects={}}addTriangle(t,r){this.intersects[t]=new oe().copy(r)}getIntersectArray(){let t=[],{intersects:r}=this;for(let n in r)t.push(r[n]);return t}},ri=class{constructor(){this.data={}}addTriangleIntersection(t,r,n,i){let{data:s}=this;s[t]||(s[t]=new Rs(r)),s[t].addTriangle(n,i)}getTrianglesAsArray(t=null){let{data:r}=this,n=[];if(t!==null)t in r&&n.push(r[t].triangle);else for(let i in r)n.push(r[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(t=>parseInt(t))}getIntersectionIndices(t){let{data:r}=this;return r[t]?Object.keys(r[t].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(t=null,r=null){let{data:n}=this,i=new Set,s=[],o=a=>{if(n[a])if(r!==null)n[a].intersects[r]&&s.push(n[a].intersects[r]);else{let l=n[a].intersects;for(let u in l)i.has(u)||(i.add(u),s.push(l[u]))}};if(t!==null)o(t);else for(let a in n)o(a);return s}reset(){this.data={}}},ni=class{constructor(){this.enabled=!1,this.triangleIntersectsA=new ri,this.triangleIntersectsB=new ri,this.intersectionEdges=[]}addIntersectingTriangles(t,r,n,i){let{triangleIntersectsA:s,triangleIntersectsB:o}=this;s.addTriangleIntersection(t,r,n,i),o.addTriangleIntersection(n,i,t,r)}addEdge(t){this.intersectionEdges.push(t.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),ks(this))}complete(){this.enabled&&ks(null)}};var gt=new qe,oi=new r1,Ut=new oe,ii=new oe,vt=new oe,si=new oe,Oe=[],Ot=[];function p5(e){for(let t of e)return t}function Ta(e,t,r,n,i,s={}){let{useGroups:o=!0}=s,{aIntersections:a,bIntersections:l}=ga(e,t),u=[],c=null,f;return f=o?0:-1,ba(e,t,a,r,!1,n,i,f),Sa(e,t,a,r,!1,i,f),r.findIndex(p=>p!==6&&p!==5)!==-1&&(f=o?e.geometry.groups.length||1:-1,ba(t,e,l,r,!0,n,i,f),Sa(t,e,l,r,!0,i,f)),Oe.length=0,Ot.length=0,{groups:u,materials:c}}function ba(e,t,r,n,i,s,o,a=0){let l=e.matrixWorld.determinant()<0;gt.copy(t.matrixWorld).invert().multiply(e.matrixWorld),oi.getNormalMatrix(e.matrixWorld).multiplyScalar(l?-1:1);let u=e.geometry.groupIndices,c=e.geometry.index,f=e.geometry.attributes.position,q=t.geometry.boundsTree,p=t.geometry.index,d=t.geometry.attributes.position,v=r.ids,m=r.intersectionSet;for(let h=0,g=v.length;h<g;h++){let x=v[h],b=a===-1?0:u[x]+a,y=3*x,_=c.getX(y+0),T=c.getX(y+1),S=c.getX(y+2);Ut.a.fromBufferAttribute(f,_).applyMatrix4(gt),Ut.b.fromBufferAttribute(f,T).applyMatrix4(gt),Ut.c.fromBufferAttribute(f,S).applyMatrix4(gt),s.reset(),s.initialize(Ut);let E=m[x];for(let F=0,C=E.length;F<C;F++){let M=3*E[F],k=p.getX(M+0),I=p.getX(M+1),L=p.getX(M+2);ii.a.fromBufferAttribute(d,k),ii.b.fromBufferAttribute(d,I),ii.c.fromBufferAttribute(d,L),s.splitByTriangle(ii)}let w=s.triangles;for(let F=0,C=w.length;F<C;F++){let M=w[F],k=s.coplanarTriangleUsed?va(M,q):Is(M,q);Oe.length=0,Ot.length=0;for(let I=0,L=n.length;I<L;I++){let V=Bs(n[I],k,i);V!==ti&&(Ot.push(V),Oe.push(o[I].getGroupAttrSet(b)))}if(Oe.length!==0){Ut.getBarycoord(M.a,si.a),Ut.getBarycoord(M.b,si.b),Ut.getBarycoord(M.c,si.c);for(let I=0,L=Oe.length;I<L;I++){let V=Oe[I],H=Ot[I]===cr;xa(x,si,e.geometry,e.matrixWorld,oi,V,l!==H)}}}}return v.length}function Sa(e,t,r,n,i,s,o=0){let a=e.matrixWorld.determinant()<0;gt.copy(t.matrixWorld).invert().multiply(e.matrixWorld),oi.getNormalMatrix(e.matrixWorld).multiplyScalar(a?-1:1);let l=t.geometry.boundsTree,u=e.geometry.groupIndices,c=e.geometry.index,f=e.geometry.attributes,q=f.position,p=[],d=e.geometry.halfEdges,v=new Set,m=lr(e.geometry);for(let h=0,g=m;h<g;h++)h in r.intersectionSet||v.add(h);for(;v.size>0;){let h=p5(v);v.delete(h),p.push(h);let g=3*h,x=c.getX(g+0),b=c.getX(g+1),y=c.getX(g+2);vt.a.fromBufferAttribute(q,x).applyMatrix4(gt),vt.b.fromBufferAttribute(q,b).applyMatrix4(gt),vt.c.fromBufferAttribute(q,y).applyMatrix4(gt);let _=Is(vt,l);Ot.length=0,Oe.length=0;for(let T=0,S=n.length;T<S;T++){let E=Bs(n[T],_,i);E!==ti&&(Ot.push(E),Oe.push(s[T]))}for(;p.length>0;){let T=p.pop();for(let S=0;S<3;S++){let E=d.getSiblingTriangleIndex(T,S);E!==-1&&v.has(E)&&(p.push(E),v.delete(E))}if(Oe.length!==0){let S=3*T,E=c.getX(S+0),w=c.getX(S+1),F=c.getX(S+2),C=o===-1?0:u[T]+o;if(vt.a.fromBufferAttribute(q,E),vt.b.fromBufferAttribute(q,w),vt.c.fromBufferAttribute(q,F),!Ue(vt))for(let M=0,k=Oe.length;M<k;M++){let I=Ot[M],L=Oe[M].getGroupAttrSet(C),V=I===cr;ya(E,w,F,f,e.matrixWorld,oi,L,V!==a)}}}}}function h5(e){for(let t=0;t<e.length-1;t++){let r=e[t],n=e[t+1];if(r.materialIndex===n.materialIndex){let i=r.start,s=n.start+n.count;n.start=i,n.count=s-i,e.splice(t,1),t--}}}function d5(e,t,r,n){r.clear();let i=e.attributes;for(let s=0,o=n.length;s<o;s++){let a=n[s],l=i[a];r.initializeArray(a,l.array.constructor,l.itemSize,l.normalized)}for(let s in r.attributes)n.includes(s)||r.delete(s);for(let s in t.attributes)n.includes(s)||(t.deleteAttribute(s),t.dispose())}function m5(e,t,r){let n=!1,i=-1,s=e.attributes,o=t.groupAttributes[0];for(let l in o){let u=t.getTotalLength(l),c=t.getType(l),f=t.getItemSize(l),q=t.getNormalized(l),p=s[l];(!p||p.array.length<u)&&(p=new Qe(new c(u),f,q),e.setAttribute(l,p),n=!0);let d=0;for(let v=0,m=Math.min(r.length,t.groupCount);v<m;v++){let h=r[v].index,{array:g,type:x,length:b}=t.groupAttributes[h][l],y=new x(g.buffer,0,b);p.array.set(y,d),d+=y.length}p.needsUpdate=!0,i=u/p.itemSize}if(e.index){let l=e.index.array;if(l.length<i)e.index=null,n=!0;else for(let u=0,c=l.length;u<c;u++)l[u]=u}let a=0;e.clearGroups();for(let l=0,u=Math.min(r.length,t.groupCount);l<u;l++){let{index:c,materialIndex:f}=r[l],q=t.getCount(c);q!==0&&(e.addGroup(a,q,f),a+=q)}e.setDrawRange(0,i),e.boundsTree=null,n&&e.dispose()}function _a(e,t){let r=t;return Array.isArray(t)||(r=[],e.forEach(n=>{r[n.materialIndex]=t})),r}var ai=class{constructor(){this.triangleSplitter=new Yn,this.attributeData=[],this.attributes=[\"position\",\"uv\",\"normal\"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new ni}getGroupRanges(t){return!this.useGroups||t.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:t.groups.map(r=>({...r}))}evaluate(t,r,n,i=new mt){let s=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],s=!1),i.length!==n.length)throw new Error(\"Evaluator: operations and target array passed as different sizes.\");t.prepareGeometry(),r.prepareGeometry();let{triangleSplitter:o,attributeData:a,attributes:l,useGroups:u,consolidateGroups:c,debug:f}=this;for(;a.length<i.length;)a.push(new Kn);i.forEach((h,g)=>{d5(t.geometry,h.geometry,a[g],l)}),f.init(),Ta(t,r,n,o,a,{useGroups:u}),f.complete();let q=this.getGroupRanges(t.geometry),p=_a(q,t.material),d=this.getGroupRanges(r.geometry),v=_a(d,r.material);d.forEach(h=>h.materialIndex+=p.length);let m=[...q,...d].map((h,g)=>({...h,index:g}));if(u){let h=[...p,...v];c&&(m=m.map(x=>{let b=h[x.materialIndex];return x.materialIndex=h.indexOf(b),x}).sort((x,b)=>x.materialIndex-b.materialIndex));let g=[];for(let x=0,b=h.length;x<b;x++){let y=!1;for(let _=0,T=m.length;_<T;_++){let S=m[_];S.materialIndex===x&&(y=!0,S.materialIndex=g.length)}y&&g.push(h[x])}i.forEach(x=>{x.material=g})}else m=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(h=>{h.material=p[0]});return i.forEach((h,g)=>{let x=h.geometry;m5(x,a[g],m),c&&h5(x.groups)}),s?i:i[0]}evaluateHierarchy(t,r=new mt){t.updateMatrixWorld(!0);let n=(s,o)=>{let a=s.children;for(let l=0,u=a.length;l<u;l++){let c=a[l];c.isOperationGroup?n(c,o):o(c)}},i=s=>{let o=s.children,a=!1;for(let u=0,c=o.length;u<c;u++){let f=o[u];a=i(f)||a}let l=s.isDirty();if(l&&s.markUpdated(),a&&!s.isOperationGroup){let u;return n(s,c=>{u?u=this.evaluate(u,c,c.operation):u=this.evaluate(s,c,c.operation)}),s._cachedGeometry=u.geometry,s._cachedMaterials=u.material,!0}else return a||l};return i(t),r.geometry=t._cachedGeometry,r.material=t._cachedMaterials,r}reset(){this.triangleSplitter.reset()}};function ur(e){let t=new Mesh({vertices:{}}),r=e.getAttribute(\"position\"),n=r.count,i=[],s={};for(let o=0;o<n;o++){let a=[r.getX(o),r.getY(o),r.getZ(o)];s[a]?i.push(s[a].key):(i.push(t.addVertices(a)[0]),s[a]={v:a,key:i.last()})}for(let o=0;o<n;o+=3){let a=new MeshFace(t,{vertices:[i[o+0],i[o+1],i[o+2]]});t.addFaces(a)}return t}function wa(e,t){let r=new Mesh({vertices:{}}),n=e.getAttribute(\"position\"),i=e.getIndex(),s=n.count,o=i.count;i=i.array;let a=[];for(let l=0;l<s;l++){let u=[n.getX(l),n.getY(l),n.getZ(l)];a.push(r.addVertices(u)[0])}if(t)for(let l=0;l<o;l+=6){let u=new MeshFace(r,{vertices:[a[i[l+0]],a[i[l+1]],a[i[l+4]],a[i[l+2]]]});r.addFaces(u)}else for(let l=0;l<o;l+=3){let u=new MeshFace(r,{vertices:[a[i[l+0]],a[i[l+1]],a[i[l+2]]]});r.addFaces(u)}return r}var Us={addition:{name:\"Union (A \\u222A B)\",operator:0},intersection:{name:\"Intersection (A \\u2229 B)\",operator:3},subtraction:{name:\"Subtraction (A - B)\",operator:1},reverse_subtraction:{name:\"Reverse Subtraction (B - A)\",operator:2},difference:{name:\"Difference (A \\u2295 B)\",operator:4},hollow_intersection:{name:\"Hollow Intersection (A \\u2229 B)\",operator:5},hollow_subtraction:{name:\"Hollow Subtraction (A - B)\",operator:6}},v5=new ai;function Ea(e,t,{operation:r,hideMeshes:n}){e.length!==2&&bn(\"Exactly 2 meshes must be selected.\");let[i,s]=e,o=[i,s];Undo.initEdit({elements:o,selection:!0},t);let a=new mt(i.mesh.geometry.clone());i.mesh.getWorldPosition(a.position),i.mesh.getWorldQuaternion(a.quaternion),i.mesh.getWorldScale(a.scale),a.updateMatrixWorld();let l=new mt(s.mesh.geometry.clone());s.mesh.getWorldPosition(l.position),s.mesh.getWorldQuaternion(l.quaternion),s.mesh.getWorldScale(l.scale),l.updateMatrixWorld();let u=v5.evaluate(a,l,Us[r].operator),c=ur(u.geometry);c.init(),o.push(c),c.select(),n&&(i.visibility=!1,s.visibility=!1),Undo.finishEdit(`MTools: Boolean Operation: ${Us[r].name}`),Canvas.updateVisibility()}var jx=P(\"boolean\",async()=>{if(!await Ko(\"boolean\",\"Heads Up!\",\"This feature is experimental and may cause unexpected behavior. Are you sure you want to continue?\"))return;let t=Mesh.selected.slice();Ea(t,!1,{operation:\"addition\",hideMeshes:!0}),Undo.amendEdit({operation:{label:\"Operation\",type:\"select\",options:Us,value:\"addition\"},hideMeshes:{label:\"Hide Meshes\",type:\"checkbox\",value:!0}},r=>{Ea(t,!0,r)})});var Jx=P(\"operators\");function Aa(e,t,r=!1){let n=[];Undo.initEdit({elements:n,selection:!0},r);let i=new THREE[e+\"BufferGeometry\"](t.radius,t.detail-1),s=ur(i);s.init(),n.push(s),s.select(),UVEditor.setAutoSize(null,!0,Object.keys(s.faces)),Undo.finishEdit(\"MTools: Generate Mesh\")}var x5=new Dialog({title:\"Quick Primitive [ Polyhedron ]\",form:{select:{label:\"Hedron\",type:\"select\",options:{Icosahedron:\"Icosahedron\",Dodecahedron:\"Dodecahedron\",Octahedron:\"Octahedron\",Tetrahedron:\"Tetrahedron\"}},radius:{label:\"Radius\",value:8,type:\"number\"},detail:{label:\"Detail\",value:2,min:1,max:6,type:\"number\"}},onConfirm(e){Aa(e.select,e),Undo.amendEdit({radius:{label:\"Radius\",value:e.radius,type:\"number\",min:1},detail:{label:\"Detail\",value:e.detail,type:\"range\",min:1,max:6}},t=>{Aa(e.select,t,!0)})}}),ty=P(\"polyhedron\",()=>{x5.show()});var ny=P(\"quickprimitives\");function Ca(e,t=!1){let r=[];Undo.initEdit({elements:r,selection:!0},t);let n=new THREE.TorusKnotBufferGeometry(e.r,e.t,e.ts,e.rs,e.p,e.q),i=wa(n,!0);i.init(),r.push(i),i.select(),UVEditor.setAutoSize(null,!0,Object.keys(i.faces)),Undo.finishEdit(\"MTools: Generate Mesh\")}var S5=new Dialog({title:\"Quick Primitive [ Torus Knot ]\",lines:['<p class=\"small_text subtle\" style=\"display: inline;\">P and Q should be coprime integers meaning non should be divisible by the other.</p>'],form:{r:{label:\"Torus Radius\",type:\"number\",value:8},t:{label:\"Tube Radius\",type:\"number\",value:3.4,step:.2},ts:{label:\"Tubular Segments\",type:\"number\",value:25},rs:{label:\"Radial Segments\",type:\"number\",value:5},p:{label:\"P\",type:\"number\",value:2},q:{label:\"Q\",type:\"number\",value:3}},onConfirm(e){Ca(e);let t=e;Undo.amendEdit({r:{label:\"Torus Radius\",type:\"number\",value:t.r},t:{label:\"Tube Radius\",type:\"number\",value:t.t,step:.2},ts:{label:\"Tubular Segments\",type:\"number\",value:t.ts},rs:{label:\"Radial Segments\",type:\"number\",value:t.rs},p:{label:\"P\",type:\"number\",value:t.p},q:{label:\"Q\",type:\"number\",value:t.q}},r=>{Ca(r,!0)})}}),sy=P(\"torusknot\",()=>{S5.show()});var ce=class e{static styles={Earth:[{blend:.5,height:.2,color:new THREE.Color(.13,.36,.89)},{blend:.2,height:.375,color:new THREE.Color(.9,.86,.36)},{blend:.3,height:.5,color:new THREE.Color(.15,.87,.113)},{blend:1,height:1,color:new THREE.Color(.113,.87,.137)}],EarthMountains:[{blend:.5,height:.2,color:new THREE.Color(.13,.36,.89)},{blend:.2,height:.375,color:new THREE.Color(.9,.86,.36)},{blend:.3,height:.5,color:new THREE.Color(.15,.87,.113)},{blend:1,height:.6,color:new THREE.Color(.113,.87,.137)},{blend:.1,height:1,color:new THREE.Color(.39,.28,.12)}],Grass:[{blend:1,height:.2,color:new THREE.Color(.69,1,.11)},{blend:1,height:.375,color:new THREE.Color(.51,1,.14)},{blend:1,height:.375,color:new THREE.Color(.17,.63,.054)}],Desert:[{blend:0,height:0,color:new THREE.Color(.54,.42,.17)},{blend:.9,height:1,color:new THREE.Color(.79,.56,.25)}],Ice:[{blend:0,height:0,color:new THREE.Color(.45,.68,.86)},{blend:1,height:.5,color:new THREE.Color(.58,.77,.89)},{blend:1,height:.75,color:new THREE.Color(.83,.94,.97)},{blend:1,height:1,color:new THREE.Color(.61,.84,.94)}],Mask:[{blend:0,height:0,color:new THREE.Color(0,0,0)},{blend:1,height:1,color:new THREE.Color(1,1,1)}]};static all=[];static timeWhenDialogWasOpened=0;static genTexture(t,r,n,i=this.styles.Earth,s=!0){let o=document.createElement(\"canvas\");o.width=t,o.height=r;let a=o.getContext(\"2d\");for(let u=r-1;u>=0;u--)for(let c=t-1;c>=0;c--){let f=Math.clamp(n[[c,u]],0,i.last().height);for(let q=0;q<i.length;q++)if(f<=i[q].height){let p=i[Math.clamp(q-1,0,1/0)],d=1-THREE.Math.inverseLerp(p.height,i[q].height,f),v=i[q].color.clone().lerp(p.color,d*i[q].blend);a.fillStyle=`rgb(${v.r*255},${v.g*255},${v.b*255})`,a.fillRect(c,u,1,1);break}}if(!s)return o.toDataURL();let l=new Texture({saved:!1}).fromDataURL(o.toDataURL());return l.add(),l}constructor(t){this.name=t.name,this.codeName=t.name.toLowerCase().replaceAll(\" \",\"_\"),this.settings=t.settings,this.suggested=t.suggested||{},this.noise=t.noise,e.all.push(this)}};var Fa={reusableVec3:new THREE.Vector3,perlinVectorSeed:new THREE.Vector3(12.9898,78.233,190.124),randomAt(e,t,r){let n=this.reusableVec3.set(e,t,r);return Math.sin(this.perlinVectorSeed.dot(n))*43758.5453%1},interpolate(e,t,r){return 0>=r?e:1<=r?t:(t-e)*(3-r*2)*r*r+e},grad(e,t,r){let n=this.randomAt(e,t,r)*Math.PI*2,i=Math.sin(n),s=Math.cos(n),o=i*s,a=s*s;return{x:o,y:a,z:i}},dotgrad(e,t,r,n,i,s){let o=this.grad(e,t,r),a=n-e,l=i-t,u=s-r;return a*o.x+l*o.y+u*o.z},get(e=0,t=0,r=0){e=(e+128)%128,t=(t+128)%128,r=(r+128)%128;let n=Math.floor(e),i=n+1,s=Math.floor(t),o=s+1,a=Math.floor(r),l=a+1,u=e%1,c=t%1,f=r%1,q,p,d,v;q=this.dotgrad(n,s,a,e,t,r),p=this.dotgrad(i,s,a,e,t,r);let m=this.interpolate(q,p,u);q=this.dotgrad(n,o,a,e,t,r),p=this.dotgrad(i,o,a,e,t,r);let h=this.interpolate(q,p,u),g=this.interpolate(m,h,c);d=this.dotgrad(n,s,l,e,t,r),v=this.dotgrad(i,s,l,e,t,r);let x=this.interpolate(d,v,u);d=this.dotgrad(n,o,l,e,t,r),v=this.dotgrad(i,o,l,e,t,r);let b=this.interpolate(d,v,u),y=this.interpolate(x,b,c);return this.interpolate(g,y,f)}};new ce({name:\"Open Terrain\",settings:{time:{label:\"Time\",type:\"number\",min:0,value:0,step:1},scale:{label:\"Noise Scale\",type:\"number\",min:0,value:25},octaves:{label:\"Octaves\",type:\"number\",min:0,value:2},persistance:{label:\"Persistancy\",type:\"number\",min:0,max:1,step:.1,value:.4},lacunarity:{label:\"lacunarity\",type:\"number\",min:0,value:3},min:{label:\"Min Level\",type:\"number\",min:0,max:.9,step:.1,value:.1}},noise(e,t){e.scale<=0&&(e.scale=1e-6);let r=e.time+ce.timeWhenDialogWasOpened,n={};for(let i=e.height-1;i>=0;i--)for(let s=e.width-1;s>=0;s--){let o=Math.pow(2,-e.persistance),a=1,l=1,u=0,c=0;for(let f=0;f<e.octaves;f++){let q=s/e.scale*l,p=i/e.scale*l,d=Fa.get(q,p,r/e.scale*l)+.4;u+=d*a,c+=a,a*=o,l*=e.lacunarity}if(u/=c,t&&(u=t(u,s,i)),e.falloff){let f=Mo(s,i,e.width,e.height);u=Math.clamp(u-f,0,1)}if(e.min||e.max){let f=e.min??0,q=e.max??1;u=Math.clamp(THREE.MathUtils.mapLinear(ko(u),f,q,0,1),0,1)}n[s+\",\"+i]=u}return n}});new ce({name:\"Valley\",settings:{time:{label:\"Time\",type:\"number\",min:0,value:0,step:1},scale:{label:\"Noise Scale\",type:\"number\",min:0,value:25},octaves:{label:\"Octaves\",type:\"number\",min:0,value:2},persistance:{label:\"Persistancy\",type:\"number\",min:0,max:1,step:.1,value:.4},lacunarity:{label:\"lacunarity\",type:\"number\",min:0,value:3}},suggested:{style:\"EarthMountains\"},noise:function(e){return e.min=.7,ce.all[0].noise(e,r=>1-Math.abs(r*2-1))}});new ce({name:\"Mesa\",settings:{time:{label:\"Time\",type:\"number\",min:0,value:0,step:1},scale:{label:\"Noise Scale\",type:\"number\",min:0,value:25},octaves:{label:\"Octaves\",type:\"number\",min:0,value:2},persistance:{label:\"Persistancy\",type:\"number\",min:0,max:1,step:.1,value:.4},lacunarity:{label:\"lacunarity\",type:\"number\",min:0,value:3}},suggested:{falloff:!0,style:\"Desert\"},noise:function(e){return e.max=.7,e.min=0,ce.all[0].noise(e)}});new ce({name:\"River\",settings:{time:{label:\"Time\",type:\"number\",min:0,value:0,step:1},scale:{label:\"Noise Scale\",type:\"number\",min:0,value:25},octaves:{label:\"Octaves\",type:\"number\",min:0,value:2},persistance:{label:\"Persistancy\",type:\"number\",min:0,max:1,step:.1,value:.4},lacunarity:{label:\"lacunarity\",type:\"number\",min:0,value:3},turbpower:{label:\"Turb-Power\",type:\"number\",min:0,value:1.3,step:.1}},suggested:{style:\"Ice\",multiplier:3,lacunarity:2,octaves:4},noise:function(e){return ce.all[0].noise(e,function(r,n,i){let s=n/e.width+i/e.height+e.turbpower*r;return Math.abs(Math.cos(s*Math.PI))})}});var Os={};for(let e in ce.styles)Os[e]=e;var ci={},Dt={style:{label:\"Style\",type:\"select\",options:Os},terrain:{label:\"Terrain Type\",type:\"select\"},width:{label:\"Resolution X\",type:\"number\",value:32,min:1,max:255},height:{label:\"Resolution Y\",type:\"number\",value:32,min:1,max:255},size:{label:\"Size\",type:\"number\",value:16,min:16},suggested:{label:\"Update Suggested Settings\",type:\"checkbox\",value:!0},_:\"_\",multiplier:{label:\"Height Multiplier\",type:\"number\",value:5,max:1/0},falloff:{label:\"FallOff Map\",type:\"checkbox\",value:!1},__:\"_\"};Os.custom=\"Custom\";var Ma={};for(let e=0;e<ce.all.length;e++){let{codeName:t,name:r,settings:n}=ce.all[e];Ma[t]=r;for(let i in n){let s=n[i];i in ci?ci[i].push(t):ci[i]=[t],s.condition=({terrain:o}={})=>ci[i].includes(o),Dt[i]=s}}Dt.terrain.options=Ma;var hy=P(\"terrain_action\",()=>{let e;ce.timeWhenDialogWasOpened=Date.now(),new Dialog({title:\"Terrain Settings\",id:\"terrain_settings\",form:Dt,onConfirm(t){let r=ce.styles[t.style];if(t.style==\"custom\"){let o=localStorage.mt_customStyle;o||Blockbench.showQuickMessage(\"No Custom Style found, 'Earth' is used instead.\",2e3);let a=JSON.parse(o);a.forEach(l=>l.color=hn(l.col)),r=a}let n=ce.all.find(o=>o.codeName==t.terrain);function i(o,a){let{width:l,height:u}=o;o.falloff=t.falloff;let c=[],f=[];Undo.initEdit({elements:c,textures:f,selection:!0},a);let q=n.noise(o),p=.5-l/2,d=.5-u/2,v=new Mesh({vertices:{}}),m=ce.genTexture(l,u,q,r,o.blending),h=[],g=0;for(let x=u-1;x>=0;x--)for(let b=l-1;b>=0;b--){let y=o.size*(b+p)/l,_=o.size*(x+d)/u,T=q[[b,x]]*o.multiplier+1,S=[y,T,_];h[g]=v.addVertices(S)[0],g++}g=0;for(let x=u-1;x>=0;x--)for(let b=l-1;b>=0;b--){if(b>0&&x>0){let y=[g,g+1,g+l+1,g+l],_={};_[h[y[0]]]=[(b-1)/l*Project._texture_width,(x-1)/u*Project._texture_height],_[h[y[1]]]=[b/l*Project._texture_width,(x-1)/u*Project._texture_height],_[h[y[2]]]=[b/l*Project._texture_width,x/u*Project._texture_height],_[h[y[3]]]=[(b-1)/l*Project._texture_width,x/u*Project._texture_height];let T=new MeshFace(v,{vertices:[h[y[3]],h[y[2]],h[y[1]],h[y[0]]],uv:_,texture:m.uuid}),S=v.addFaces(T),E=T.getSortedVertices();for(let w=0;w<4;w++){let F=v.vertices[E[w]],C=v.vertices[E[(w+1)%4]],M=[C[0]-F[0],C[2]-F[2]];if(M[0]&&M[1]==0||M[1]&&M[0]==0)continue;delete v.faces[S];let I=new MeshFace(v,{vertices:[h[y[3]],h[y[2]],h[y[0]]],uv:_,texture:m.uuid}),L=new MeshFace(v,{vertices:[h[y[1]],h[y[0]],h[y[2]]],uv:_,texture:m.uuid});v.addFaces(I),v.addFaces(L);break}}g++}v.init(),c.push(v),v.select(),f.push(m),Undo.finishEdit(\"MTools: Generate Terrain Mesh\")}i(t,!1);let s={};s.width=Dt.width,s.height=Dt.height,s.size=Dt.size,s.multiplier=Dt.multiplier;for(let o in n.settings){let a={};for(let l in n.settings[o])l==\"value\"?a[l]=t[o]:l!=\"condition\"&&(a[l]=n.settings[o][l]);s[o]=a}Undo.amendEdit(s,o=>{i(o,!0)})},onFormChange(t){if(!t.suggested||t.terrain==e)return;let r=ce.all.find(n=>n.codeName==t.terrain);e=t.terrain,this.setFormValues(r.suggested)}}).show()});var gy=P(\"terrainse\",()=>{let e;new Dialog({title:\"Terrain Generator Style Editor\",buttons:[\"Save\",\"Cancel\"],confirmEnabled:!1,cancelIndex:1,width:650,onButton(o){o==0&&localStorage.setItem(\"mt_customStyle\",JSON.stringify(e))},lines:[`\n\t\t\t\t\t\t  <style>\n\t\t\t\t\t\t\t  .tgseLevel {\n\t\t\t\t\t\t\t\t  background-color: var(--color-back);\n\t\t\t\t\t\t\t\t  border-top: 2px solid var(--color-ui);\n\t\t\t\t\t\t\t\t  cursor: move;\n\t\t\t\t\t\t\t\t  padding: 5px;\n\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t  #tgse_levels{\n\t\t\t\t\t\t\t\t  max-height: 250px;\n\t\t\t\t\t\t\t\t  overflow-y: auto;\n\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t  </style>\n\t\t\t\t\t\t  <div class=\"dialog_bar form_bar form_bar_t\">\n\t\t\t\t\t\t\t  <label class=\"name_space_left\">Result: </label>\n\t\t\t\t\t\t\t  <canvas id=\"tgseCanvas\" style=\"background:white\" width=\"256\", height=\"25\"></canvas>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <div class=\"dialog_bar form_bar form_bar_t\"> <button id=\"tgse_addlevel\"><b>+</b> Add level</button> </div>\n\t\t\t\t\t\t  <ul id=\"tgse_levels\" class=\"ui-sortable\">\n\t\t\t\t\t\t  </ul>\n\t\t\t\t\t\t  `]}).show();let r=$(\"#tgseCanvas\")[0].getContext(\"2d\"),n=function(o){return $(document.createElement(o))};$(\"#tgse_levels\").sortable({stop(){s()}}),$(\"#tgse_addlevel\")[0].onclick=function(o,a,l,u=!0){let c=n(\"li\"),f=n(\"span\").append('<i class=\"material-icons icon tool\" style=\"float:right\">delete</i>'),q=new ColorPicker({label:!1,name:\"Color\",private:!0,color:a||\"#fff\"});q.jq.spectrum({preferredFormat:\"hex\",color:a||\"#fff\",showinput:!0,maxSelectionSize:128,resetText:tl(\"generic.reset\"),cancelText:tl(\"dialog.cancel\"),chooseText:tl(\"dialog.confirm\"),hide:function(){s()},change:function(){s()},move:function(){s()}});let p=n(\"input\").attr({type:\"number\",min:0,max:100,step:.5,value:typeof o==\"number\"?o:100}).addClass(\"dark_bordered focusable_input\"),d=n(\"input\").attr({type:\"number\",min:0,max:100,step:.5,value:typeof l==\"number\"?l:100}).addClass(\"dark_bordered focusable_input\");p[0].oninput=function(){s()},d[0].oninput=function(){s()},f[0].onclick=function(){r.clearRect(0,0,256,25),c.remove(),s()},c.addClass(\"tgseLevel\").append(f).append(q.getNode()).append(\"&nbsp;&nbsp;\").append(n(\"label\").text(\"At height percent of: \")).append(\"&nbsp;&nbsp;\").append(p).append(\"&nbsp;&nbsp;\").append(n(\"label\").text(\"With blending as: \")).append(\"&nbsp;&nbsp;\").append(d),$(\"#tgse_levels\").append(c[0]),u&&s()};let i=localStorage.mt_customStyle;i?JSON.parse(i).forEach(a=>{$(\"#tgse_addlevel\")[0].onclick(a.height*100,a.col,a.blend*100)}):($(\"#tgse_addlevel\")[0].onclick(0,\"#f00\",0,!1),$(\"#tgse_addlevel\")[0].onclick(50,\"#0f0\",100,!1),$(\"#tgse_addlevel\")[0].onclick(100,\"#00f\",100));function s(){let o=$(\"#tgse_levels\").children();e=[];let a=o.length;for(let u=0;u<a;u++){let f=o.eq(u).children(),q=f.eq(3).val()*1,p=f.eq(5).val()*1,d=f.find(\".sp-preview-inner\").css(\"background-color\");e.push({height:q/100,col:d,color:hn(d),blend:p/100})}let l=new Image(256,1);l.src=ce.genTexture(256,1,Pi,e,!1),l.onload=function(){r.drawImage(l,0,0,256,25)}}});var ka={glyphs:{\"0\":{ha:829,x_min:37,x_max:790,o:\"m 790 408 q 689 114 790 237 q 414 -18 581 -18 q 139 114 247 -18 q 37 408 37 238 q 139 701 37 578 q 414 832 247 832 q 689 702 581 832 q 790 408 790 579 m 631 408 q 576 589 631 513 q 414 672 515 672 q 252 589 313 672 q 199 408 199 514 q 253 227 199 304 q 414 142 314 142 q 574 229 510 142 q 631 408 631 309 z \"},\"1\":{ha:389,x_min:15,x_max:312,o:\"m 312 802 q 311 790 312 799 q 296 387 296 667 q 297 208 296 328 q 298 28 298 87 q 276 1 298 1 q 212 0 254 1 q 149 -1 170 -1 q 127 16 127 -1 q 136 265 127 30 q 140 597 140 379 q 134 613 140 613 q 82 602 117 613 q 31 591 47 591 q 15 600 15 591 q 17 624 15 608 q 18 648 18 640 q 17 671 18 656 q 16 693 16 686 q 31 708 16 702 q 114 764 70 724 q 151 804 116 766 q 185 838 182 838 q 241 825 184 838 q 302 815 262 823 q 312 802 312 812 z \"},\"2\":{ha:673,x_min:8,x_max:656,o:\"m 656 125 q 654 64 656 105 q 652 3 652 23 q 629 -12 652 -12 q 565 -7 637 -12 q 353 -1 494 -1 q 207 -3 304 -1 q 61 -5 110 -5 q 41 8 45 -5 l 24 106 q 71 122 24 114 q 138 143 124 132 q 323 337 232 225 q 440 558 440 483 q 390 660 440 620 q 281 697 343 697 q 160 673 220 697 q 77 630 119 657 q 42 606 42 606 q 35 607 37 606 q 26 631 28 610 q 22 677 26 647 q 8 728 8 739 q 18 741 8 733 q 158 808 73 782 q 313 833 240 833 q 518 775 437 833 q 610 589 610 709 q 371 220 610 457 q 288 131 345 189 q 332 130 305 130 q 636 146 465 130 l 642 146 q 656 125 656 146 z \"},\"3\":{ha:654,x_min:23,x_max:619,o:\"m 619 232 q 526 41 619 107 q 314 -17 444 -17 q 36 40 160 -17 q 23 52 23 46 q 56 158 23 50 q 68 173 60 173 q 267 111 189 111 q 452 245 452 111 q 388 361 452 329 q 252 385 342 385 q 199 384 233 385 q 151 382 165 382 q 111 399 111 382 q 132 491 111 491 q 221 484 161 491 q 311 477 281 477 q 384 507 356 477 q 412 582 412 537 q 250 707 412 707 q 79 667 155 707 q 73 665 77 665 q 56 766 56 665 q 165 819 56 800 q 301 832 240 832 q 494 783 414 832 q 590 618 590 724 q 560 508 590 563 q 479 429 528 450 q 619 232 619 382 z \"},\"4\":{ha:694,x_min:11,x_max:669,o:\"m 669 184 q 654 172 669 172 q 585 174 630 174 q 566 172 569 174 q 561 153 561 168 q 565 81 561 129 q 568 9 568 33 q 551 -8 568 -5 q 472 -12 528 -12 q 377 3 377 -12 q 385 77 377 22 q 392 158 392 132 q 380 174 392 174 q 216 170 326 174 q 52 167 106 167 q 11 250 11 167 q 24 332 11 316 q 158 496 71 385 q 328 741 267 649 q 386 829 347 770 q 407 844 397 844 q 550 808 454 844 q 571 783 571 801 q 566 679 571 749 q 561 575 561 610 q 560 468 561 544 q 559 361 559 399 l 559 306 q 611 309 577 306 q 663 311 646 311 q 668 300 668 311 q 669 242 668 281 q 669 184 669 204 m 416 668 q 412 676 416 673 q 395 653 406 676 q 380 624 388 638 q 146 307 263 467 q 201 299 149 299 l 229 299 q 397 302 342 299 q 399 469 398 386 q 411 632 402 576 q 416 668 416 665 z \"},\"5\":{ha:661,x_min:12,x_max:607,o:\"m 607 275 q 511 52 607 128 q 273 -18 424 -18 q 130 -1 225 -18 q 12 46 12 21 q 22 124 12 70 q 45 186 34 186 q 105 150 35 186 q 237 113 176 113 q 375 146 322 113 q 437 267 437 187 q 242 399 437 399 q 166 392 216 399 q 97 385 117 385 q 78 393 82 385 q 77 406 77 397 q 77 446 76 420 q 78 486 78 475 q 77 634 78 535 q 75 783 75 734 q 91 807 75 793 q 115 821 106 821 q 222 818 151 821 q 329 814 293 814 q 432 818 363 814 q 535 821 500 821 q 551 808 551 821 q 544 756 551 794 q 538 699 538 718 q 527 683 538 691 q 509 675 517 675 q 403 679 473 675 q 298 683 333 683 q 210 681 248 683 q 203 510 210 625 q 264 515 223 510 q 326 519 305 519 q 525 462 451 519 q 607 275 607 397 z \"},\"6\":{ha:713,x_min:46,x_max:676,o:\"m 676 296 q 593 67 676 152 q 366 -18 509 -18 q 124 92 210 -18 q 46 351 46 191 q 185 691 46 547 q 519 835 324 835 q 538 821 532 835 q 572 724 572 725 q 547 704 572 704 q 378 665 452 704 q 244 533 281 615 q 239 516 239 522 q 246 509 239 508 q 327 540 287 524 q 412 554 370 554 q 602 483 528 554 q 676 296 676 412 m 530 293 q 487 406 530 361 q 375 450 444 450 q 203 311 203 450 q 243 173 203 233 q 364 106 289 106 q 530 293 530 106 z \"},\"7\":{ha:612,x_min:9,x_max:593,o:\"m 593 751 q 591 721 593 728 q 564 681 591 717 q 406 359 473 559 q 321 26 340 167 q 316 5 319 10 q 298 -8 311 -5 q 218 -14 279 -14 q 140 -8 155 -14 q 132 8 132 -5 q 201 258 132 92 q 328 529 246 368 q 397 667 397 663 q 379 677 397 677 q 203 668 321 677 q 28 659 86 659 q 9 671 9 659 q 14 705 9 684 q 20 739 19 732 q 21 814 21 751 q 40 828 21 828 q 195 819 85 828 q 567 814 265 814 q 593 751 593 814 z \"},\"8\":{ha:636,x_min:11,x_max:610,o:\"m 610 224 q 523 43 610 111 q 319 -20 442 -20 q 104 39 184 -20 q 11 242 11 106 q 117 425 11 366 q 60 502 82 452 q 39 604 39 553 q 125 783 39 719 q 322 840 203 840 q 509 779 429 840 q 597 608 597 712 q 571 502 597 555 q 501 417 545 446 q 610 224 610 355 m 458 600 q 420 681 458 647 q 326 715 382 715 q 224 689 262 715 q 187 622 187 663 q 265 528 187 568 q 397 477 300 509 q 458 600 458 529 m 448 214 q 366 316 448 276 q 234 367 300 342 q 159 233 159 316 q 197 141 159 176 q 314 102 239 102 q 448 214 448 102 z \"},\"9\":{ha:713,x_min:36,x_max:667,o:\"m 667 456 q 524 104 667 248 q 172 -39 380 -39 q 154 -26 159 -39 q 121 77 121 58 q 147 92 121 92 q 334 135 249 92 q 425 209 380 159 q 476 312 476 266 q 471 318 476 318 q 456 311 467 318 q 300 268 384 268 q 109 341 182 268 q 36 532 36 414 q 121 754 36 674 q 347 832 204 832 q 591 720 506 832 q 667 456 667 619 m 510 513 q 470 646 510 591 q 350 707 426 707 q 184 532 184 707 q 228 418 184 463 q 339 372 271 372 q 456 407 408 372 q 510 513 510 446 z \"},\" \":{ha:347,x_min:0,x_max:0,o:\"\"},\"!\":{ha:322,x_min:79,x_max:256,o:\"m 253 779 q 228 465 253 608 q 201 304 218 412 q 165 278 199 278 q 139 281 146 278 q 125 301 128 284 q 83 561 83 505 l 83 926 q 92 953 83 953 q 129 949 104 953 q 167 946 154 946 q 205 949 180 946 q 243 953 231 953 q 252 927 252 953 q 252 853 252 902 q 253 779 253 804 m 256 79 q 231 10 256 39 q 167 -18 207 -18 q 102 12 127 -18 q 79 79 79 39 q 103 146 79 119 q 167 174 127 174 q 231 146 206 174 q 256 79 256 119 z \"},'\"':{ha:421,x_min:47,x_max:375,o:\"m 375 937 l 375 869 q 343 663 375 751 q 311 650 338 650 q 272 660 276 650 q 259 718 270 666 q 248 777 248 770 l 248 937 q 252 950 248 942 q 313 954 269 954 q 371 950 329 954 q 375 937 375 942 m 175 777 q 163 718 175 770 q 150 660 152 666 q 111 650 146 650 q 79 663 83 650 q 47 856 47 750 l 47 941 q 110 954 47 954 q 164 951 155 954 q 176 926 176 946 q 175 896 176 920 q 174 850 174 871 q 174 813 174 838 q 175 777 175 789 z \"},\"#\":{ha:922,x_min:35,x_max:887,o:\"m 887 625 q 881 576 887 606 q 863 538 873 538 q 857 539 861 538 q 672 549 829 543 q 623 357 656 484 q 829 359 764 359 q 844 348 844 359 q 832 265 844 308 q 820 253 829 253 q 814 254 820 253 q 595 264 786 258 q 544 56 578 197 q 518 -53 537 18 q 500 -69 513 -69 q 490 -66 496 -69 q 461 -50 481 -61 q 433 -40 447 -45 q 415 -22 415 -33 q 494 265 415 -8 l 440 265 q 323 264 359 265 q 248 -47 300 159 q 231 -62 243 -62 q 182 -43 219 -62 q 144 -15 144 -24 q 221 261 144 1 q 135 257 196 260 q 50 254 81 254 q 35 272 35 254 q 39 296 35 280 q 45 318 43 312 q 47 350 45 330 q 65 363 51 363 q 159 360 100 363 q 253 357 227 357 l 300 547 q 197 543 269 547 q 93 539 130 539 q 80 553 80 539 q 90 627 80 593 q 109 639 94 639 q 215 637 148 639 q 322 633 294 634 l 382 861 q 406 958 389 894 q 423 973 410 973 q 445 964 431 973 q 467 950 463 951 q 492 943 479 947 q 509 926 509 938 q 425 632 509 906 l 595 632 q 654 856 614 707 q 676 951 661 888 q 694 968 681 968 q 704 965 699 968 q 739 946 715 958 q 772 933 752 942 q 779 920 779 928 q 696 633 779 916 q 872 636 810 636 q 887 625 887 636 m 572 549 q 510 550 543 550 l 401 550 q 351 355 389 507 l 524 355 q 572 549 541 420 z \"},$:{ha:597,x_min:50,x_max:568,o:\"m 568 747 q 566 737 568 743 q 546 690 559 722 q 536 650 543 677 q 524 641 533 641 q 462 675 525 641 q 351 711 399 709 q 346 595 346 671 q 346 476 346 536 q 479 382 449 412 q 545 240 545 321 q 431 53 545 114 q 335 20 370 20 q 336 -90 336 -38 q 333 -110 336 -110 q 314 -109 327 -110 q 294 -107 301 -107 q 276 -109 288 -107 q 258 -111 263 -111 q 252 -92 252 -111 q 253 5 252 -46 q 78 26 141 5 q 65 43 66 31 q 61 97 64 61 q 54 127 60 104 q 50 157 50 146 q 60 168 50 168 q 66 168 64 168 q 100 155 79 163 q 208 134 154 134 l 218 133 q 254 135 236 133 q 260 367 256 212 q 125 463 157 433 q 58 607 58 528 q 120 754 58 694 q 267 827 176 808 q 267 919 267 838 q 273 928 267 928 l 349 928 q 355 829 357 928 q 473 801 391 828 q 568 747 568 770 m 268 701 q 214 671 237 694 q 187 615 187 645 q 265 517 187 563 q 268 701 268 627 m 411 216 q 342 315 411 273 l 338 147 q 411 216 411 170 z \"},\"% \":{ha:1022,x_min:32,x_max:990,o:\"m 990 253 q 933 76 990 153 q 774 -8 871 -8 q 613 76 676 -8 q 555 253 555 153 q 613 431 555 353 q 774 515 677 515 q 933 431 871 515 q 990 253 990 353 m 718 812 q 713 796 718 806 q 533 412 652 669 q 370 -1 479 292 q 356 -20 362 -20 q 321 -4 347 -20 q 296 20 296 12 q 302 40 296 27 q 397 233 342 113 q 489 428 469 388 q 572 627 524 498 q 648 833 610 730 q 662 850 655 850 q 694 836 671 850 q 718 812 718 821 m 467 583 q 410 406 467 483 q 250 322 347 322 q 90 406 153 322 q 32 583 32 483 q 90 761 32 684 q 250 846 153 846 q 410 761 347 846 q 467 583 467 684 m 878 253 q 854 351 878 308 q 774 403 825 403 q 693 351 722 403 q 668 253 668 308 q 694 157 668 201 q 774 104 725 104 q 853 155 824 104 q 878 253 878 198 m 354 583 q 330 682 354 638 q 250 733 301 733 q 170 681 199 733 q 144 583 144 637 q 171 487 144 532 q 250 435 202 435 q 330 486 300 435 q 354 583 354 529 z \"},\"& \":{ha:956,x_min:53,x_max:928,o:\"m 928 113 q 927 90 928 106 q 925 66 925 75 q 926 47 925 60 q 928 28 928 35 q 896 0 928 0 q 842 -1 878 0 q 787 -3 806 -3 q 664 40 731 -3 q 566 129 606 78 q 441 18 496 50 q 279 -24 372 -24 q 113 48 176 -24 q 53 221 53 117 q 116 411 53 333 q 278 538 165 473 q 239 713 239 640 q 299 894 239 827 q 475 962 362 962 q 627 918 565 962 q 697 781 697 867 q 617 610 697 684 q 453 501 574 570 q 578 325 515 398 q 697 451 654 421 q 863 497 763 497 q 901 494 892 497 q 918 464 918 487 q 886 357 918 404 q 825 352 855 354 q 765 338 787 348 q 653 240 699 307 q 750 157 708 178 q 873 132 798 132 q 907 132 907 132 q 928 113 928 129 m 571 777 q 545 840 571 817 q 479 863 519 863 q 367 749 367 863 q 396 600 367 690 q 507 670 479 646 q 571 777 571 721 m 496 212 q 330 433 380 347 q 201 237 201 351 q 233 146 201 182 q 321 109 267 109 q 496 212 404 109 z \"},\"'\":{ha:239,x_min:47,x_max:189,o:\"m 189 850 q 158 642 189 758 q 149 629 157 636 q 122 627 138 627 q 94 629 106 627 q 60 740 75 634 q 47 871 47 824 l 47 932 q 117 951 47 951 q 182 947 168 951 q 189 850 189 945 z \"},\"(\":{ha:488,x_min:75,x_max:492,o:\"m 492 876 q 471 850 492 862 q 323 728 372 794 q 256 566 281 668 q 235 390 235 476 q 260 208 235 308 q 329 40 288 99 q 469 -86 382 -35 q 485 -103 485 -96 q 465 -172 485 -116 q 438 -228 444 -228 q 415 -220 432 -228 q 75 389 75 -50 q 161 739 75 583 q 421 983 254 905 q 442 991 437 991 q 471 939 450 991 q 492 876 492 886 z \"},\")\":{ha:488,x_min:-5,x_max:411,o:\"m 411 389 q 71 -220 411 -50 q 48 -228 54 -228 q 22 -172 42 -228 q 1 -103 1 -116 q 17 -86 1 -96 q 157 40 104 -34 q 227 208 199 100 q 252 390 252 308 q 230 566 252 476 q 163 728 205 668 q 16 850 115 794 q -5 876 -5 862 q 16 939 -5 886 q 44 991 37 991 q 65 983 49 991 q 324 739 233 905 q 411 389 411 583 z \"},\"*\":{ha:494,x_min:26,x_max:463,o:\"m 463 724 q 402 674 463 709 q 342 631 342 640 q 368 563 342 620 q 394 483 394 505 q 382 465 394 473 q 360 457 370 457 q 302 509 347 457 q 248 560 257 560 q 198 509 241 560 q 143 457 154 457 q 118 467 130 457 q 107 489 107 477 q 131 564 107 500 q 155 626 155 627 q 91 675 155 640 q 26 727 26 710 q 47 758 26 758 q 110 753 68 758 q 172 749 151 749 q 202 817 194 749 q 212 904 208 860 q 249 921 218 921 q 282 905 277 921 q 292 817 287 861 q 321 750 300 750 q 382 753 341 750 q 444 755 424 755 q 457 744 451 755 q 463 724 463 732 z \"},\"+\":{ha:561,x_min:23,x_max:532,o:\"m 532 467 q 522 354 532 456 q 513 349 520 349 q 424 351 479 349 q 335 353 357 353 q 337 249 335 318 q 339 146 339 180 q 271 119 339 119 q 211 127 226 119 q 204 144 205 132 q 205 248 203 183 q 207 353 207 328 q 121 351 189 353 q 35 349 68 349 q 23 358 23 349 q 29 412 23 363 q 32 471 29 439 q 47 478 37 478 q 207 473 28 478 q 206 574 207 507 q 205 676 205 642 q 218 688 205 688 q 270 689 235 688 q 322 690 305 690 q 339 671 339 690 q 337 572 339 638 q 335 473 335 507 q 427 474 366 473 q 519 475 489 475 q 532 467 532 475 z \"},\",\":{ha:298,x_min:-5,x_max:257,o:\"m 257 161 q 233 39 257 92 q 152 -68 218 5 q 54 -149 81 -149 q 22 -117 48 -149 q -5 -78 -5 -86 q 31 -31 -5 -79 q 69 50 66 18 q 69 121 69 45 q 143 167 69 148 q 242 182 202 182 q 257 161 257 182 z \"},\"-\":{ha:536,x_min:37,x_max:500,o:\"m 499 490 l 498 484 q 482 414 492 460 q 473 349 480 391 q 435 340 472 342 q 361 340 409 339 q 304 342 300 342 q 180 334 262 342 q 56 326 97 326 q 37 349 37 326 q 77 478 37 380 q 96 488 80 488 q 165 486 119 488 q 235 484 212 484 q 360 493 277 484 q 485 501 444 501 q 499 490 500 501 z \"},\".\":{ha:298,x_min:46,x_max:253,o:\"m 253 100 q 223 21 253 55 q 149 -12 193 -12 q 75 22 104 -12 q 46 100 46 55 q 75 177 46 145 q 149 210 104 210 q 223 177 193 210 q 253 100 253 144 z \"},\"/\":{ha:397,x_min:22,x_max:375,o:\"m 375 908 q 372 892 375 905 q 248 410 330 731 q 169 87 221 305 q 132 -66 158 35 q 121 -80 127 -80 q 25 -40 31 -44 q 22 -33 22 -39 q 26 -14 22 -26 q 155 484 73 145 q 267 942 191 637 q 277 956 271 956 q 329 935 282 956 q 375 908 375 914 z \"},\":\":{ha:278,x_min:46,x_max:231,o:\"m 231 452 q 203 383 231 411 q 136 355 176 355 q 72 384 98 355 q 46 452 46 412 q 72 520 46 492 q 138 549 98 549 q 204 520 177 549 q 231 452 231 492 m 231 89 q 204 19 231 49 q 138 -11 177 -11 q 72 19 98 -11 q 46 89 46 49 q 72 159 46 132 q 139 186 97 186 q 205 158 179 186 q 231 89 231 130 z \"},\";\":{ha:278,x_min:-14,x_max:236,o:\"m 236 452 q 209 382 236 412 q 143 353 182 353 q 78 382 104 353 q 52 452 52 411 q 77 520 52 492 q 143 549 103 549 q 210 520 183 549 q 236 452 236 492 m 231 138 q 136 -75 231 27 q 56 -144 88 -127 q 44 -149 48 -149 q 12 -123 39 -149 q -14 -92 -14 -98 q 22 -43 -14 -88 q 61 41 58 2 q 61 103 61 41 q 78 132 61 125 q 143 146 100 136 q 177 156 146 146 q 212 163 199 163 q 231 138 231 163 z \"},\"<\":{ha:494,x_min:36,x_max:467,o:\"m 467 623 q 460 610 467 618 q 325 494 418 557 q 168 408 238 435 q 152 399 161 406 q 167 389 155 394 q 321 298 238 355 q 456 183 412 235 q 465 167 465 172 q 444 127 465 166 q 421 80 424 87 q 414 73 418 73 q 399 82 410 73 q 234 216 275 185 q 52 323 151 277 q 36 347 36 331 l 36 440 q 54 464 36 457 q 225 564 95 479 q 315 634 260 587 q 404 705 378 686 q 419 713 414 713 q 467 623 430 713 z \"},\"=\":{ha:606,x_min:43,x_max:563,o:\"m 562 569 q 554 465 562 515 q 547 456 553 456 q 413 460 502 456 q 279 464 323 464 q 168 461 242 464 q 57 458 94 458 q 43 473 43 458 q 50 572 43 545 q 64 583 52 583 q 182 580 103 583 q 301 576 262 576 q 426 578 343 576 q 550 581 509 581 q 562 569 562 581 m 563 363 q 555 262 563 354 q 547 255 553 255 l 541 256 q 279 262 404 262 q 168 259 242 262 q 57 256 94 256 q 44 266 44 256 q 50 366 44 341 q 62 375 52 375 q 182 372 102 375 q 301 370 262 370 q 427 372 343 370 q 553 374 511 374 q 563 363 563 374 z \"},\">\":{ha:494,x_min:29,x_max:460,o:\"m 460 347 q 444 323 460 331 q 97 82 271 239 q 82 73 93 77 q 31 167 31 161 q 163 288 31 197 q 329 389 278 367 q 344 399 336 391 q 328 408 340 403 q 36 610 129 494 q 29 623 29 618 q 49 662 29 625 q 71 707 68 699 q 76 714 73 714 q 92 705 79 714 q 271 564 149 656 q 355 509 342 517 q 441 464 410 476 q 460 440 460 457 l 460 347 z \"},\"?\":{ha:553,x_min:20,x_max:524,o:\"m 524 692 q 465 517 524 593 q 354 406 458 509 q 286 288 292 346 q 283 258 285 273 q 264 240 281 246 q 233 233 244 233 q 193 235 199 233 q 176 268 176 241 q 204 397 176 349 q 293 515 249 456 q 346 650 346 585 q 310 751 346 713 q 211 790 273 790 q 99 755 161 790 q 41 720 38 720 q 20 850 20 720 q 40 873 20 859 q 264 947 146 947 q 451 877 378 947 q 524 692 524 806 m 330 77 q 305 10 330 39 q 243 -18 280 -18 q 181 10 206 -18 q 157 77 157 39 q 181 142 157 115 q 243 170 205 170 q 306 142 281 170 q 330 77 330 115 z \"},\"@\":{ha:863,x_min:39,x_max:790,o:\"m 790 510 q 755 347 790 452 q 673 224 715 224 q 610 258 618 224 q 597 285 604 285 q 557 260 598 285 q 476 235 517 235 q 333 301 386 235 q 283 456 283 363 q 338 622 283 556 q 496 692 397 692 q 603 659 553 692 q 654 627 654 627 q 669 647 669 627 q 612 800 669 732 q 469 869 553 869 q 229 742 323 869 q 144 475 144 627 q 228 206 144 318 q 472 82 321 82 q 490 71 490 82 l 490 -7 q 472 -21 490 -21 q 153 132 277 -21 q 39 475 39 275 q 157 811 39 662 q 467 971 284 971 q 725 820 642 971 q 790 510 790 701 m 652 472 q 617 555 652 522 q 532 589 582 589 q 445 553 479 589 q 411 465 411 517 q 435 379 411 415 q 509 337 462 337 q 610 376 568 337 q 652 472 652 415 z \"},A:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z \"},B:{ha:848,x_min:71,x_max:803,o:\"m 803 293 q 732 90 803 175 q 541 1 656 1 q 410 3 497 1 q 279 5 323 5 q 183 3 248 5 q 87 0 119 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 269 951 148 951 q 452 950 391 950 q 679 897 594 950 q 782 697 782 833 q 755 600 782 650 q 689 524 728 549 q 669 507 669 511 q 689 492 669 503 q 772 408 741 463 q 803 293 803 353 m 612 682 q 527 811 612 778 q 358 831 475 831 q 244 814 244 831 q 242 747 244 791 q 240 679 240 702 q 241 631 240 663 q 241 582 241 598 q 395 562 241 562 q 612 682 612 562 m 631 300 q 557 412 631 382 q 411 431 510 431 q 240 412 240 431 l 240 301 q 241 227 240 277 q 243 151 243 176 q 286 141 243 144 q 415 138 330 138 q 569 165 522 138 q 631 300 631 202 z \"},C:{ha:823,x_min:39,x_max:819,o:\"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 z \"},D:{ha:945,x_min:73,x_max:905,o:\"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 z \"},E:{ha:747,x_min:68,x_max:713,o:\"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 z \"},F:{ha:741,x_min:68,x_max:722,o:\"m 722 812 q 708 800 722 800 q 534 806 655 800 q 361 810 422 811 l 311 809 q 261 807 264 808 q 248 764 248 802 l 248 601 q 267 555 248 555 q 466 561 333 555 q 664 567 598 567 q 678 556 678 567 q 676 522 678 545 q 675 488 675 499 q 676 451 675 475 q 677 414 677 426 q 663 406 677 406 q 521 408 616 406 q 378 411 426 411 q 279 410 291 411 q 249 385 249 406 q 252 201 249 323 q 256 18 256 79 q 239 -2 256 -2 q 199 1 226 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 15 71 0 q 77 241 71 90 q 83 468 83 393 q 69 922 83 538 l 69 931 q 86 947 68 945 q 172 945 92 947 q 370 945 279 943 q 682 958 492 946 q 711 936 708 960 q 714 880 711 918 q 722 812 722 828 z \"},G:{ha:937,x_min:39,x_max:902,o:\"m 901 33 q 884 18 902 18 q 834 38 873 18 q 785 65 795 57 q 489 -20 660 -20 q 161 130 290 -20 q 39 473 39 271 q 159 822 39 681 q 489 971 286 971 q 690 922 593 971 q 844 787 787 873 q 853 768 853 774 q 805 705 853 758 q 749 652 756 652 q 707 693 743 652 q 625 770 664 743 q 496 811 563 811 q 286 704 368 811 q 211 473 211 606 q 288 244 211 344 q 497 136 371 136 q 725 204 621 136 q 713 333 724 222 q 705 461 705 412 q 720 473 705 473 q 759 471 733 473 q 798 469 785 469 q 837 471 810 469 q 876 472 863 472 q 890 450 890 472 q 889 379 890 427 q 887 307 887 331 q 900 43 887 210 l 901 33 z \"},H:{ha:994,x_min:71,x_max:926,o:\"m 926 16 q 905 0 926 0 q 870 2 894 0 q 833 4 846 4 q 794 2 821 4 q 755 0 768 0 q 740 16 740 0 q 744 199 740 77 q 747 382 747 321 q 732 412 747 408 q 497 418 711 418 q 262 412 283 418 q 248 382 248 408 q 251 202 248 322 q 254 22 254 82 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 201 949 175 947 q 239 951 227 951 q 254 939 254 951 q 249 764 254 881 q 244 589 244 647 q 258 566 244 570 q 497 559 275 559 q 734 566 714 559 q 750 595 750 570 q 746 766 750 652 q 743 938 743 881 q 758 951 743 951 q 796 949 771 951 q 833 947 821 947 q 870 949 846 947 q 907 951 895 951 q 924 937 924 951 q 918 700 924 858 q 911 464 911 543 q 918 240 911 389 q 926 16 926 90 z \"},I:{ha:329,x_min:71,x_max:257,o:\"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 z \"},J:{ha:371,x_min:5,x_max:302,o:\"m 302 937 q 297 737 302 870 q 292 537 292 604 q 292 441 292 505 q 293 345 293 377 q 266 104 293 197 q 135 -96 229 -20 q 117 -106 122 -106 q 106 -98 112 -106 q 11 -1 58 -44 q 5 9 5 4 q 12 21 5 14 q 75 81 58 61 q 113 160 100 113 q 130 417 130 222 l 129 519 q 121 725 129 583 q 113 930 113 861 q 132 950 113 950 q 171 948 145 950 q 210 946 197 946 q 248 948 222 946 q 285 950 273 950 q 302 937 302 950 z \"},K:{ha:828,x_min:71,x_max:821,o:\"m 821 32 q 802 0 821 0 l 646 0 q 543 144 626 0 q 450 321 473 267 q 424 379 427 373 q 376 415 404 413 q 331 416 368 416 q 245 395 245 416 q 250 208 245 332 q 254 22 254 84 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 199 949 175 947 q 236 951 224 951 q 252 939 252 951 q 248 766 252 882 q 244 591 244 650 q 248 558 244 565 q 275 546 253 546 q 468 595 407 546 q 567 754 520 638 q 635 936 601 845 q 656 951 640 947 q 728 954 667 954 q 802 933 802 954 q 771 823 802 921 q 676 623 734 709 q 574 504 637 564 q 557 478 557 490 q 612 357 557 466 q 699 205 660 262 q 818 45 741 153 q 821 32 821 39 z \"},L:{ha:718,x_min:71,x_max:710,o:\"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 z \"},M:{ha:1097,x_min:71,x_max:1024,o:\"m 1024 17 q 1007 0 1024 0 q 970 2 995 0 q 933 4 945 4 q 896 2 921 4 q 859 0 871 0 q 842 22 842 0 q 847 281 842 109 q 852 539 852 453 q 847 552 852 552 q 838 545 841 552 q 674 150 803 471 q 614 -4 653 88 q 565 -13 609 -13 q 494 -1 501 -13 q 429 153 471 54 q 256 553 372 287 q 247 562 254 557 q 241 547 241 558 q 244 285 241 460 q 248 22 248 110 q 231 0 248 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 13 71 0 q 78 238 71 88 q 85 464 85 389 q 78 698 85 542 q 71 932 71 854 q 86 947 71 945 q 225 960 178 960 q 244 932 232 960 q 526 288 408 571 q 559 221 554 221 q 589 275 566 221 q 844 928 681 495 q 867 954 854 954 q 936 951 890 954 q 1006 949 983 949 q 1023 932 1023 949 q 1018 698 1023 854 q 1013 464 1013 542 q 1018 240 1013 389 q 1024 17 1024 91 z \"},N:{ha:997,x_min:71,x_max:924,o:\"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 z \"},O:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z \"},P:{ha:867,x_min:68,x_max:839,o:\"m 839 600 q 753 345 839 441 q 507 247 664 247 q 390 250 468 247 q 272 253 311 253 q 250 225 250 253 q 255 117 250 189 q 259 9 259 45 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 680 l 68 932 q 86 947 68 947 q 196 947 123 947 q 307 946 270 946 q 403 949 339 946 q 498 951 467 951 q 745 850 648 951 q 839 600 839 750 m 668 590 q 613 753 668 692 q 456 817 556 817 q 345 811 425 817 q 250 800 253 806 q 245 567 245 792 q 247 481 245 538 q 249 396 249 425 q 264 387 249 390 q 471 379 301 379 q 618 438 566 379 q 668 590 668 494 z \"},Q:{ha:1007,x_min:41,x_max:966,o:\"m 966 478 q 859 159 966 298 q 571 -8 745 14 q 660 -144 596 -83 q 664 -153 664 -149 q 618 -175 664 -172 q 557 -175 618 -175 q 463 -172 475 -175 q 424 -7 428 -164 q 145 165 251 27 q 41 478 41 300 q 172 823 41 677 q 504 974 307 974 q 836 823 701 974 q 966 478 966 677 m 804 478 q 721 709 804 611 q 503 811 633 811 q 286 707 374 811 q 204 476 204 608 q 286 245 204 345 q 503 140 373 140 q 722 245 634 140 q 804 478 804 344 z \"},R:{ha:825,x_min:68,x_max:804,o:\"m 804 5 q 793 0 804 0 q 753 2 780 0 q 714 4 727 4 q 672 2 700 4 q 629 0 644 0 q 606 17 614 0 q 482 302 584 63 q 433 332 472 327 q 371 333 424 333 q 260 330 277 333 q 245 296 245 328 q 250 154 245 248 q 254 12 254 59 q 241 -2 254 -2 q 200 1 227 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 16 71 0 q 78 242 71 91 q 85 468 85 393 q 69 925 85 682 l 68 936 q 97 949 68 949 q 272 952 155 949 q 446 956 388 956 q 687 884 596 956 q 787 659 787 804 q 760 500 787 558 q 654 385 732 439 q 642 368 642 376 q 723 187 642 358 q 804 5 804 16 m 618 621 q 547 785 618 743 q 359 815 495 815 q 248 798 250 815 q 243 602 243 761 l 243 472 q 252 469 245 471 q 292 466 264 468 q 431 463 356 463 q 618 621 618 463 z \"},S:{ha:648,x_min:75,x_max:614,o:\"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 z \"},T:{ha:713,x_min:9,x_max:701,o:\"m 701 823 q 689 806 701 806 q 449 814 670 806 q 443 482 443 607 q 449 248 443 404 q 454 14 454 92 q 435 0 454 0 q 397 2 422 0 q 359 4 372 4 q 322 2 347 4 q 285 0 297 0 q 268 17 268 0 q 274 249 268 94 q 281 482 281 404 q 273 814 281 603 q 17 803 98 803 q 9 810 9 803 q 15 845 9 822 q 24 880 22 875 q 33 946 25 904 q 45 955 37 955 l 53 954 q 370 940 293 940 q 591 950 437 940 q 679 957 696 957 q 699 945 696 957 q 697 879 697 952 q 699 851 697 870 q 701 823 701 833 z \"},U:{ha:917,x_min:68,x_max:848,o:\"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 z \"},V:{ha:860,x_min:41,x_max:818,o:\"m 818 612 q 685 333 818 584 q 517 20 601 176 q 494 0 507 0 l 358 0 q 339 20 349 0 q 178 323 337 24 q 41 604 41 581 q 45 765 41 658 q 49 926 49 873 q 65 951 49 951 q 103 949 78 951 q 140 947 127 947 q 178 949 153 947 q 215 951 203 951 q 231 939 231 951 q 223 773 231 884 q 216 607 216 663 q 427 196 216 561 q 547 414 482 291 q 642 623 642 591 q 638 781 642 675 q 635 938 635 886 q 650 951 635 951 q 688 949 663 951 q 725 947 713 947 q 762 949 737 947 q 799 951 787 951 q 816 939 814 951 q 815 913 815 943 q 817 763 815 863 q 818 612 818 663 z \"},W:{ha:1239,x_min:41,x_max:1198,o:\"m 1198 604 q 1063 314 1198 599 q 924 18 1017 215 q 905 0 915 0 l 783 0 q 762 18 770 0 q 618 390 712 136 q 472 18 571 265 q 452 0 465 0 l 330 0 q 311 18 320 0 q 171 314 264 117 q 41 604 41 584 q 45 772 41 660 q 48 939 48 884 q 65 951 48 951 q 102 949 77 951 q 139 947 127 947 q 174 949 151 947 q 208 950 197 950 q 222 940 222 950 q 216 774 222 885 q 210 608 210 663 q 347 295 210 574 q 396 203 392 203 q 399 208 397 203 q 434 294 408 223 q 534 595 483 427 q 536 702 536 612 q 534 822 536 742 q 532 941 532 901 q 546 951 532 951 q 585 949 559 951 q 624 947 610 947 q 659 949 635 947 q 693 951 682 951 q 709 941 709 951 q 706 812 709 898 q 703 684 703 726 q 704 599 703 614 q 806 301 706 565 q 842 216 817 271 q 844 211 842 213 q 892 301 848 211 q 1026 610 1026 574 q 1020 776 1026 665 q 1014 941 1014 886 q 1019 951 1014 951 q 1060 949 1033 951 q 1100 947 1086 947 q 1137 949 1112 947 q 1175 951 1162 951 q 1192 943 1190 951 q 1192 924 1192 944 q 1195 764 1192 871 q 1198 604 1198 658 z \"},X:{ha:796,x_min:39,x_max:761,o:\"m 761 8 q 746 0 761 0 l 637 -1 q 628 0 629 -1 q 511 169 618 3 q 401 335 404 334 q 281 161 389 326 q 167 0 177 0 l 54 0 q 39 11 39 0 l 39 109 q 166 291 39 121 q 294 473 294 460 q 167 659 294 488 q 40 840 40 830 l 40 945 q 58 954 40 954 q 115 953 77 954 q 172 951 153 951 q 197 920 176 951 q 390 621 261 820 q 401 610 393 616 q 519 785 411 615 q 635 951 625 951 l 742 951 q 760 942 760 951 l 760 838 q 633 652 760 821 q 507 475 507 484 q 634 291 507 465 q 761 106 761 118 l 761 8 z \"},Y:{ha:815,x_min:24,x_max:794,o:\"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 z \"},Z:{ha:701,x_min:26,x_max:662,o:\"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 z \"},\"[\":{ha:498,x_min:86,x_max:481,o:\"m 481 -118 q 479 -161 481 -132 q 478 -203 478 -190 q 464 -216 478 -216 q 370 -214 433 -216 q 277 -211 308 -211 q 193 -213 249 -211 q 110 -215 138 -215 q 90 -189 90 -215 q 97 73 90 -102 q 103 336 103 248 q 95 635 103 435 q 86 934 86 834 q 107 960 86 960 q 192 958 135 960 q 277 956 248 956 q 370 958 308 956 q 464 960 433 960 q 479 946 479 960 q 480 906 479 932 q 481 865 481 879 q 467 850 481 850 q 382 854 439 850 q 296 859 325 859 q 281 859 285 859 q 261 835 263 856 q 254 637 259 811 q 249 336 249 404 q 252 64 249 230 q 258 -93 253 12 q 269 -115 260 -111 q 294 -117 273 -117 q 381 -112 323 -117 q 467 -107 438 -107 q 481 -118 481 -107 z \"},\"\\\\\":{ha:397,x_min:26,x_max:370,o:\"m 370 -22 q 331 -56 370 -35 q 281 -75 295 -75 l 273 -75 q 221 97 258 -42 q 103 564 206 153 q 26 895 74 674 q 68 929 34 907 q 115 950 102 951 l 122 950 q 256 454 144 891 q 370 -22 370 14 z \"},\"]\":{ha:498,x_min:18,x_max:412,o:\"m 412 934 q 404 635 412 834 q 396 336 396 435 q 402 73 396 248 q 408 -189 408 -102 q 389 -215 408 -215 q 306 -213 361 -215 q 222 -211 250 -211 q 129 -214 191 -211 q 35 -216 66 -216 q 21 -203 21 -216 q 20 -161 21 -190 q 18 -118 18 -132 q 32 -107 18 -107 q 118 -112 60 -107 q 205 -117 176 -117 q 221 -117 217 -117 q 240 -93 238 -114 q 246 64 243 -66 q 250 336 250 230 q 244 637 250 404 q 237 835 244 703 q 227 857 236 852 q 202 859 223 859 q 117 854 174 859 q 32 850 60 850 q 18 865 18 850 q 19 906 18 879 q 20 946 20 932 q 35 960 20 960 q 129 958 66 960 q 222 956 191 956 q 307 958 250 956 q 392 960 363 960 q 412 934 412 960 z \"},\"^\":{ha:648,x_min:26,x_max:618,o:\"m 618 246 q 570 218 616 240 q 541 201 566 216 q 517 187 519 187 q 317 450 494 187 q 224 313 312 445 q 125 193 144 193 q 72 225 129 193 q 26 252 26 250 q 174 478 94 353 q 257 675 214 550 q 266 688 261 688 l 373 688 q 382 675 378 688 q 463 485 404 591 q 618 246 474 464 z \"},_:{ha:604,x_min:-14,x_max:609,o:\"m 609 -159 q 604 -271 609 -246 q 587 -282 602 -282 q 431 -279 535 -282 q 273 -275 326 -275 q 139 -279 229 -275 q 4 -282 49 -282 q -14 -267 -14 -282 q -7 -160 -14 -211 q 4 -147 -5 -147 q 151 -151 53 -147 q 298 -154 250 -154 q 449 -152 349 -154 q 599 -150 549 -150 q 609 -159 609 -150 z \"},\"`\":{ha:485,x_min:36,x_max:392,o:\"m 391 809 q 381 774 391 803 q 368 745 372 745 q 357 744 353 745 q 43 907 119 855 q 36 915 40 909 q 76 957 42 927 q 120 987 109 987 q 245 918 136 987 q 387 822 345 855 q 391 809 392 818 z \"},a:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 z \"},b:{ha:770,x_min:50,x_max:742,o:\"m 742 328 q 659 94 742 193 q 437 -12 570 -12 q 282 33 349 -12 q 228 78 255 56 q 218 37 220 76 q 207 -1 216 -1 l 64 -1 q 56 7 56 -1 q 57 20 56 7 q 68 435 68 128 q 57 803 68 560 q 50 939 50 958 q 68 958 50 956 q 140 961 92 959 q 179 966 150 962 q 218 970 203 970 q 229 954 229 970 q 226 884 229 931 q 222 812 222 836 q 219 706 222 777 q 216 600 216 635 q 226 574 216 574 q 236 582 231 574 q 433 675 311 675 q 661 570 574 675 q 742 328 742 471 m 589 334 q 538 476 589 414 q 404 542 484 542 q 269 477 323 542 q 216 334 216 416 q 269 189 216 250 q 406 125 323 125 q 539 191 486 125 q 589 334 589 252 z \"},c:{ha:558,x_min:26,x_max:543,o:\"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 z \"},d:{ha:772,x_min:28,x_max:721,o:\"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 z \"},e:{ha:669,x_min:26,x_max:644,o:\"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 z \"},f:{ha:408,x_min:12,x_max:419,o:\"m 419 869 q 407 860 419 861 q 341 854 374 857 q 282 827 302 848 q 249 644 249 791 q 319 643 271 644 q 392 642 368 642 q 408 629 408 642 q 410 573 408 610 q 411 517 411 535 q 397 504 411 504 q 326 506 374 504 q 254 509 277 509 l 254 306 q 258 162 254 258 q 261 18 261 66 q 248 0 261 0 l 123 0 q 106 21 106 0 l 106 488 q 64 505 106 506 q 17 509 20 505 q 15 534 15 511 q 14 578 15 549 q 12 623 12 608 q 98 642 12 637 q 96 712 96 685 q 139 888 96 832 q 250 966 177 938 q 387 992 316 992 q 396 985 393 992 q 408 927 397 983 q 419 869 419 871 z \"},g:{ha:722,x_min:26,x_max:667,o:\"m 667 632 q 665 388 667 551 q 664 143 664 224 q 595 -95 664 -18 q 363 -176 522 -176 q 114 -118 209 -176 q 99 -102 99 -109 q 119 -1 99 -109 q 129 10 121 10 q 138 7 132 10 q 342 -52 239 -52 q 453 -22 409 -52 q 504 77 504 12 q 501 140 504 91 q 310 49 426 49 q 104 139 184 49 q 26 353 26 226 q 101 572 26 481 q 307 668 180 668 q 485 582 419 668 q 500 568 496 568 q 506 580 506 568 q 505 608 506 589 q 503 637 503 627 q 511 677 503 677 q 585 665 518 677 q 657 650 651 652 q 667 632 667 646 m 504 353 q 463 481 504 429 q 343 539 417 539 q 224 481 270 539 q 183 353 183 428 q 225 225 183 279 q 343 167 271 167 q 461 225 415 167 q 504 353 504 279 z \"},h:{ha:722,x_min:47,x_max:661,o:\"m 661 24 q 647 -1 661 -1 q 583 -1 626 -1 q 519 0 541 0 q 503 22 503 0 q 505 121 503 55 q 507 220 507 186 q 505 314 507 251 q 503 410 503 378 q 387 532 503 532 q 290 494 350 532 q 225 421 225 454 l 225 18 q 211 -1 225 -1 q 148 -1 190 -1 q 85 0 106 0 q 69 18 69 0 l 69 346 q 60 686 69 426 q 49 925 59 767 q 47 936 47 933 q 56 950 47 947 q 132 954 67 954 q 175 959 146 954 q 216 964 203 964 q 225 951 225 964 q 220 760 225 888 q 215 568 215 632 q 220 552 215 553 q 310 623 255 581 q 450 664 376 664 q 626 588 578 664 q 661 412 661 532 q 660 347 661 391 q 659 282 659 303 q 660 153 659 239 q 661 24 661 66 z \"},i:{ha:306,x_min:58,x_max:245,o:\"m 245 811 q 153 728 245 728 q 58 811 58 728 q 87 873 58 848 q 153 896 115 896 q 218 872 191 896 q 245 811 245 848 m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z \"},j:{ha:307,x_min:-31,x_max:250,o:\"m 250 812 q 155 730 250 730 q 90 751 115 730 q 61 812 61 773 q 90 875 61 850 q 155 897 117 897 q 221 875 194 897 q 250 812 250 850 m 241 629 q 237 495 241 585 q 233 359 233 405 q 235 211 233 310 q 236 61 236 111 q 60 -185 236 -134 q -14 -200 9 -200 q -27 -186 -24 -200 q -28 -157 -30 -176 q -26 -135 -26 -132 q -29 -108 -26 -126 q -31 -82 -31 -90 q -22 -68 -31 -70 q 64 -37 45 -56 q 87 54 87 -14 q 85 200 87 103 q 82 346 82 297 q 66 615 82 442 l 66 623 q 78 635 66 632 q 152 642 82 636 q 231 647 222 647 q 241 629 241 647 z \"},k:{ha:760,x_min:68,x_max:736,o:\"m 736 465 q 572 229 736 289 q 640 104 572 195 q 708 14 708 14 q 640 0 708 3 q 573 -2 595 -2 q 513 18 525 -2 q 412 176 481 73 q 265 186 404 189 l 239 186 l 239 18 q 224 -3 239 -3 q 160 -2 202 -3 q 96 -1 117 -1 q 81 25 81 -1 l 81 447 q 74 694 81 530 q 68 942 68 859 q 81 956 68 954 q 149 958 103 956 q 189 963 158 959 q 228 966 213 966 q 237 950 237 966 q 234 841 237 913 q 231 732 231 768 l 231 557 q 237 543 231 543 q 286 583 253 556 q 503 671 399 671 q 667 619 603 671 q 736 465 736 563 m 572 433 q 447 530 572 530 q 236 406 353 530 l 236 304 q 369 294 291 294 q 503 324 448 294 q 572 433 572 361 z \"},l:{ha:306,x_min:66,x_max:241,o:\"m 241 941 l 240 932 q 225 498 225 680 q 228 257 225 418 q 231 16 231 96 q 220 0 231 0 l 90 0 q 78 16 78 0 q 79 257 78 96 q 81 498 81 418 q 74 719 81 572 q 66 938 66 865 q 81 951 66 951 q 117 949 93 951 q 154 947 142 947 q 192 949 167 947 q 229 951 217 951 q 241 941 241 951 z \"},m:{ha:1165,x_min:47,x_max:1100,o:\"m 1100 25 q 1084 -1 1100 -1 q 1054 1 1074 -1 q 1022 3 1033 3 q 987 1 1010 3 q 953 0 964 0 q 939 32 939 0 q 941 125 939 63 q 943 218 943 187 q 942 410 943 390 q 913 506 937 479 q 819 534 887 534 q 723 494 777 534 q 665 410 667 451 q 663 216 663 357 q 665 117 663 183 q 668 17 668 50 q 656 -1 668 -1 q 620 1 644 -1 q 585 3 597 3 q 553 1 574 3 q 521 0 532 0 q 507 20 507 0 q 509 118 507 52 q 511 216 511 183 l 511 379 q 493 488 511 456 q 395 534 467 534 q 293 498 352 534 q 228 419 228 459 l 228 221 q 229 120 228 187 q 229 20 229 53 q 214 0 229 0 l 87 0 q 74 18 74 0 q 75 183 74 73 q 75 349 75 294 q 49 596 75 473 q 47 610 47 605 q 53 621 47 619 q 126 631 78 623 q 193 646 149 637 l 199 646 q 214 598 207 646 q 227 551 221 551 q 260 581 227 551 q 340 635 300 615 q 456 665 398 665 q 654 538 612 665 q 759 627 696 592 q 890 665 825 665 q 1064 592 1016 665 q 1099 420 1099 538 q 1097 351 1099 398 q 1096 282 1096 304 q 1098 154 1096 239 q 1100 25 1100 68 z \"},n:{ha:726,x_min:43,x_max:667,o:\"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 z \"},o:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 z \"},p:{ha:783,x_min:50,x_max:747,o:\"m 747 326 q 661 88 747 189 q 435 -18 570 -18 q 288 34 351 -18 q 231 87 259 60 q 225 77 227 85 q 224 1 224 73 l 224 -191 q 208 -212 224 -212 q 85 -210 104 -212 q 69 -192 69 -208 q 71 68 69 -105 q 72 329 72 242 q 52 628 72 488 q 50 639 50 636 q 57 648 50 646 q 132 656 83 650 q 207 668 199 668 q 222 627 218 668 q 225 574 224 600 q 229 563 225 568 q 240 572 234 566 q 432 669 335 669 q 659 564 566 669 q 747 326 747 463 m 589 329 q 538 472 589 410 q 404 538 484 538 q 275 470 326 538 q 229 328 229 409 q 277 184 229 245 q 410 118 329 118 q 540 186 487 118 q 589 329 589 250 z \"},q:{ha:778,x_min:37,x_max:728,o:\"m 728 642 q 726 629 728 640 q 701 241 701 500 q 706 27 701 170 q 710 -187 710 -116 q 696 -204 710 -204 q 629 -207 673 -204 q 563 -209 585 -209 q 555 -193 555 -209 l 555 75 q 551 86 555 86 q 538 75 545 83 q 340 -17 460 -17 q 121 92 210 -17 q 37 326 37 193 q 118 566 37 466 q 340 673 204 673 q 502 624 437 673 q 555 572 528 598 q 559 663 559 574 q 571 669 559 669 q 720 652 626 669 q 728 642 728 650 m 557 330 q 510 477 557 417 q 375 542 459 542 q 241 477 294 542 q 191 334 191 416 q 242 189 191 249 q 379 125 296 125 q 513 186 464 125 q 557 330 557 243 z \"},r:{ha:463,x_min:41,x_max:457,o:\"m 457 637 q 447 501 457 562 q 433 486 445 486 q 390 489 419 486 q 347 492 361 492 q 237 444 261 492 q 223 322 223 414 l 223 248 q 226 132 223 210 q 229 17 229 55 q 214 -1 229 -1 q 150 -1 193 -1 q 86 0 107 0 q 71 17 71 0 q 72 182 71 72 q 74 349 74 293 q 43 618 74 516 q 41 626 41 623 q 50 637 41 634 q 121 646 75 640 q 189 659 194 659 q 203 619 199 659 q 215 579 206 579 q 218 581 216 579 q 274 616 246 598 q 336 643 304 634 q 404 651 363 651 q 457 637 457 651 z \"},s:{ha:415,x_min:31,x_max:387,o:\"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 z \"},t:{ha:475,x_min:5,x_max:447,o:\"m 447 125 q 444 84 447 110 q 440 43 441 52 q 438 28 439 31 q 425 18 435 23 q 250 -8 370 -8 q 92 136 92 -8 q 94 309 92 193 q 97 482 97 425 q 69 512 97 510 q 20 513 44 512 q 5 568 5 516 q 8 610 5 588 q 30 629 10 626 q 63 630 47 629 q 94 658 94 631 q 93 741 94 685 q 91 824 91 796 q 110 873 91 873 q 237 852 116 873 q 253 838 253 850 q 249 748 253 808 q 244 659 244 688 q 262 639 244 639 l 425 639 q 437 631 437 639 q 434 605 437 623 q 432 578 432 587 q 433 547 432 568 q 433 515 433 526 q 414 503 433 503 q 332 506 387 503 q 250 510 277 510 q 242 471 245 510 q 239 336 239 423 l 239 235 q 250 154 239 177 q 317 119 266 119 q 378 128 338 119 q 439 137 419 137 q 447 125 447 137 z \"},u:{ha:766,x_min:65,x_max:697,o:\"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 z \"},v:{ha:703,x_min:45,x_max:654,o:\"m 654 449 q 648 338 654 353 q 538 159 638 307 q 416 0 436 8 q 359 -4 407 -4 q 300 0 314 -4 q 176 153 281 6 q 61 328 73 296 q 45 460 45 370 q 46 543 45 488 q 47 627 47 599 q 62 642 47 642 q 129 640 85 642 q 196 637 174 637 q 208 624 208 637 q 205 560 208 602 q 203 496 203 517 q 210 382 203 433 q 278 256 213 356 q 359 155 344 155 q 433 254 374 155 q 496 375 492 350 q 501 492 501 409 q 497 559 501 514 q 492 626 492 604 q 503 636 492 636 q 568 638 525 636 q 633 641 612 641 q 654 449 654 641 z \"},w:{ha:1013,x_min:35,x_max:979,o:\"m 979 486 q 965 326 979 359 q 865 148 946 281 q 758 -1 777 3 q 704 -3 753 -3 q 665 -1 671 -3 q 504 232 644 4 q 426 104 465 168 q 345 -1 362 3 q 300 -3 339 -3 q 254 -1 260 -3 q 148 146 233 3 q 50 326 67 281 q 35 486 35 367 q 41 623 35 586 q 58 637 45 637 q 119 636 79 637 q 180 635 160 635 q 193 614 193 635 q 192 569 193 599 q 191 524 191 538 q 197 357 191 406 q 304 178 203 314 q 318 161 316 161 q 330 176 320 161 q 431 351 418 304 q 439 497 439 384 q 436 566 439 520 q 433 633 433 611 q 446 648 433 648 l 575 648 q 586 631 586 648 q 584 565 586 609 q 582 500 582 522 q 586 361 582 380 q 650 255 590 342 q 718 167 709 167 q 730 183 720 167 q 823 358 817 314 q 829 482 829 395 q 825 556 829 508 q 821 626 821 605 q 835 636 821 636 q 895 637 855 636 q 956 639 935 639 q 974 625 970 639 q 979 486 979 599 z \"},x:{ha:603,x_min:26,x_max:578,o:\"m 578 12 q 564 -1 578 3 q 534 -1 553 -3 q 510 0 507 0 q 446 12 456 0 q 319 193 404 74 q 301 215 303 215 q 225 111 295 215 q 139 3 154 5 q 43 0 124 0 q 26 12 26 0 l 26 86 q 117 203 26 94 q 207 323 207 312 q 117 441 207 333 q 26 561 26 550 l 26 633 q 43 647 26 647 q 94 644 60 647 q 144 642 127 642 q 161 632 154 642 q 283 450 201 570 q 301 428 300 428 q 316 446 303 428 q 446 635 355 499 q 461 644 452 644 q 511 646 478 644 q 561 647 545 647 q 578 633 578 647 l 578 562 q 487 441 578 550 q 397 322 397 333 q 487 206 397 315 q 578 85 578 97 l 578 12 z \"},y:{ha:661,x_min:24,x_max:640,o:\"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 z \"},z:{ha:585,x_min:21,x_max:572,o:\"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 z \"},\"{\":{ha:473,x_min:33,x_max:457,o:\"m 457 -204 q 447 -210 457 -207 q 336 -221 410 -221 q 179 -198 231 -221 q 102 -71 102 -163 q 123 31 102 -37 q 151 136 148 105 q 155 201 155 174 q 114 298 155 276 q 46 315 83 315 q 33 329 33 315 q 36 351 33 336 q 39 372 39 365 q 36 393 39 379 q 33 414 33 407 q 62 431 33 425 q 114 444 102 437 q 155 544 155 469 q 128 681 155 591 q 102 814 102 770 q 179 941 102 906 q 336 964 231 964 q 447 954 422 964 q 457 940 457 950 q 454 894 457 926 q 450 846 450 863 q 437 833 450 833 q 383 840 425 833 q 318 847 341 847 q 258 791 258 847 q 277 685 258 755 q 297 579 297 615 q 263 438 297 492 q 140 372 222 372 q 297 174 297 372 q 277 57 297 135 q 257 -56 257 -22 q 326 -111 257 -111 q 437 -93 376 -111 q 444 -92 441 -92 q 452 -106 450 -92 q 453 -135 454 -117 q 452 -157 452 -159 q 454 -180 452 -165 q 457 -204 457 -196 z \"},\"|\":{ha:340,x_min:107,x_max:232,o:\"m 232 -64 q 224 -79 232 -77 q 119 -95 150 -95 q 114 -82 114 -95 l 114 439 q 111 685 114 521 q 107 930 107 849 q 181 963 107 965 l 211 962 q 225 945 224 962 q 225 873 227 918 q 223 802 223 813 l 224 456 q 228 196 224 380 q 232 -64 232 25 z \"},\"}\":{ha:473,x_min:21,x_max:444,o:\"m 444 329 q 432 315 444 315 q 364 298 394 315 q 323 201 323 276 q 326 136 323 174 q 354 31 330 105 q 376 -71 376 -37 q 298 -198 376 -163 q 142 -221 247 -221 q 31 -210 68 -221 q 21 -204 21 -207 q 24 -180 21 -196 q 26 -157 26 -165 q 26 -131 26 -148 q 25 -104 25 -113 q 34 -92 25 -92 q 40 -93 35 -92 q 151 -111 117 -111 q 220 -56 220 -111 q 200 57 220 -22 q 180 174 180 135 q 338 372 180 372 q 215 438 256 372 q 180 579 180 492 q 200 685 180 615 q 220 791 220 755 q 160 847 220 847 q 95 840 137 847 q 40 833 54 833 q 28 846 28 833 q 24 894 28 863 q 21 940 21 926 q 31 954 21 950 q 142 964 56 964 q 298 941 246 964 q 376 814 376 906 q 350 681 376 770 q 323 544 323 591 q 364 444 323 469 q 415 431 376 437 q 444 414 444 425 q 441 393 444 407 q 439 372 439 379 q 441 351 439 365 q 444 329 444 336 z \"},\"~\":{ha:676,x_min:22,x_max:665,o:\"m 665 419 q 570 350 665 405 q 440 309 496 309 q 342 334 398 309 q 258 359 286 359 q 177 325 232 359 q 119 290 123 290 q 77 336 115 290 q 27 390 33 385 q 22 399 22 395 q 125 472 22 411 q 246 515 197 515 q 334 488 284 515 q 416 461 384 461 q 515 498 454 461 q 576 535 576 535 q 624 480 582 535 q 665 419 665 426 z \"},\\u00C4:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 668 1017 q 644 1005 668 1005 q 583 1004 623 1005 q 524 1004 543 1004 q 507 1023 507 1004 l 506 1161 q 519 1178 506 1178 q 555 1176 531 1178 q 591 1174 579 1174 q 621 1175 602 1174 q 650 1175 641 1175 q 667 1164 667 1175 q 664 1126 667 1152 q 661 1088 661 1101 q 665 1052 661 1076 q 668 1017 668 1028 m 391 1013 q 371 1004 391 1006 q 332 1004 357 1002 q 304 1006 302 1006 q 273 1004 294 1006 q 242 1003 252 1003 q 229 1016 229 1003 q 231 1048 229 1027 q 232 1080 232 1069 q 230 1121 232 1093 q 228 1162 228 1148 q 244 1177 228 1177 q 306 1176 264 1177 q 369 1175 348 1175 q 389 1161 389 1175 q 387 1124 389 1149 q 385 1086 385 1099 q 388 1050 385 1074 q 391 1013 391 1025 z \"},\\u00C5:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 721 0 q 632 207 663 205 q 493 208 608 208 l 399 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 310 819 231 606 q 267 930 267 873 q 320 1058 267 1006 q 449 1111 373 1111 q 577 1058 524 1111 q 631 930 631 1006 q 590 827 631 879 q 766 382 635 716 q 909 8 909 15 m 522 930 q 501 986 522 963 q 449 1010 480 1010 q 396 986 417 1010 q 375 930 375 963 q 397 879 375 901 q 447 857 418 857 q 500 878 478 857 q 522 930 522 899 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z \"},\\u00C7:{ha:823,x_min:39,x_max:819,o:\"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 m 565 -77 q 516 -219 565 -165 q 377 -275 465 -275 q 309 -254 352 -275 q 264 -213 264 -233 q 298 -170 264 -211 q 336 -128 333 -128 q 338 -129 337 -128 q 399 -158 368 -158 q 443 -138 424 -158 q 461 -93 461 -117 q 430 -18 461 -52 l 522 -20 q 565 -77 536 -38 z \"},\\u00C9:{ha:747,x_min:68,x_max:713,o:\"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 584 1151 q 434 1048 574 1123 q 265 974 298 974 q 244 1008 253 974 q 237 1053 237 1034 q 250 1065 237 1059 q 482 1213 362 1121 q 492 1219 485 1215 q 501 1213 496 1217 q 576 1160 530 1188 q 584 1151 580 1158 z \"},\\u00D1:{ha:997,x_min:71,x_max:924,o:\"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 m 725 1037 q 667 989 725 1021 q 581 957 608 957 q 500 981 541 957 q 439 1004 459 1004 q 391 982 416 1004 q 362 960 366 960 q 349 966 354 960 q 289 1024 289 1025 q 290 1029 289 1026 q 348 1084 300 1057 q 425 1109 393 1109 q 508 1086 458 1109 q 579 1064 558 1064 q 627 1088 592 1064 q 668 1112 663 1112 l 675 1109 q 725 1037 725 1058 z \"},\\u00D6:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 713 1032 q 688 1021 713 1021 q 628 1020 668 1021 q 568 1019 588 1019 q 551 1038 551 1019 l 551 1177 q 564 1194 551 1194 q 600 1192 576 1194 q 636 1190 624 1190 q 666 1190 646 1190 q 695 1191 686 1191 q 711 1180 711 1191 q 709 1142 711 1167 q 706 1103 706 1116 q 709 1067 706 1091 q 713 1032 713 1044 m 435 1029 q 416 1019 435 1021 q 376 1019 401 1018 q 349 1021 347 1021 q 318 1020 338 1021 q 287 1019 297 1019 q 274 1031 274 1019 q 275 1063 274 1042 q 277 1095 277 1084 q 275 1136 277 1109 q 273 1177 273 1164 q 289 1192 273 1192 q 351 1192 309 1192 q 413 1191 393 1191 q 434 1177 434 1191 q 432 1139 434 1164 q 429 1102 429 1114 q 432 1065 429 1090 q 435 1029 435 1041 z \"},\\u00DC:{ha:917,x_min:68,x_max:848,o:\"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 675 1032 q 650 1021 675 1021 q 590 1020 630 1021 q 530 1019 550 1019 q 513 1038 513 1019 l 513 1177 q 526 1194 513 1194 q 562 1192 538 1194 q 598 1190 586 1190 q 628 1190 608 1190 q 657 1191 648 1191 q 673 1180 673 1191 q 671 1142 673 1167 q 668 1103 668 1116 q 671 1067 668 1091 q 675 1032 675 1044 m 397 1029 q 378 1019 397 1021 q 338 1019 363 1018 q 311 1021 309 1021 q 280 1020 300 1021 q 249 1019 259 1019 q 236 1031 236 1019 q 237 1063 236 1042 q 239 1095 239 1084 q 237 1136 239 1109 q 235 1177 235 1164 q 251 1192 235 1192 q 313 1192 271 1192 q 375 1191 355 1191 q 396 1177 396 1191 q 394 1139 396 1164 q 391 1102 391 1114 q 394 1065 391 1090 q 397 1029 397 1041 z \"},\\u00E1:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 608 897 q 458 793 597 869 q 289 720 321 720 q 268 753 277 720 q 261 798 261 780 q 274 811 261 805 q 506 958 386 867 q 516 964 509 961 q 525 958 519 963 q 600 905 554 934 q 608 897 604 903 z \"},\\u00E0:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 532 797 q 523 762 532 791 q 510 733 513 733 q 498 732 495 733 q 184 895 261 843 q 178 903 182 897 q 217 945 184 915 q 262 975 251 975 q 387 906 278 975 q 528 810 486 843 q 532 797 534 806 z \"},\\u00E2:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 568 768 q 533 749 566 765 q 495 733 501 733 q 368 844 475 733 q 311 783 361 840 q 250 734 269 734 q 211 750 244 734 q 177 769 177 767 q 268 878 215 812 q 322 970 307 936 q 337 981 327 981 l 408 981 q 420 970 417 981 q 473 878 431 935 q 568 768 520 824 z \"},\\u00E4:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 581 747 q 556 735 581 735 q 496 734 536 735 q 436 734 456 734 q 419 753 419 734 l 418 891 q 432 908 418 908 q 468 906 444 908 q 504 904 492 904 q 534 905 514 904 q 563 905 553 905 q 579 895 579 905 q 576 856 579 882 q 574 818 574 831 q 577 782 574 806 q 581 747 581 758 m 303 743 q 283 734 303 736 q 244 734 269 732 q 216 736 214 736 q 185 734 206 736 q 155 733 165 733 q 142 746 142 733 q 143 778 142 757 q 144 810 144 799 q 142 851 144 823 q 140 892 140 878 q 157 907 140 907 q 219 906 177 907 q 281 905 260 905 q 302 891 302 905 q 299 854 302 879 q 297 817 297 829 q 300 780 297 804 q 303 743 303 755 z \"},\\u00E3:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 590 817 q 532 769 590 801 q 446 737 473 737 q 365 761 406 737 q 304 785 324 785 q 256 762 281 785 q 227 740 231 740 q 214 746 219 740 q 154 804 154 806 q 155 810 154 806 q 213 864 165 838 q 290 889 258 889 q 373 867 323 889 q 444 844 423 844 q 492 868 457 844 q 533 892 528 892 l 540 889 q 590 817 590 838 z \"},\\u00E5:{ha:770,x_min:29,x_max:728,o:\"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 542 884 q 494 771 542 818 q 379 725 446 725 q 266 771 313 725 q 218 884 218 818 q 265 998 218 951 q 379 1046 312 1046 q 494 998 447 1046 q 542 884 542 951 m 461 884 q 438 945 461 920 q 379 971 415 971 q 320 945 344 971 q 297 884 297 920 q 321 826 297 851 q 378 802 346 802 q 436 826 412 802 q 461 884 461 850 z \"},\\u00E7:{ha:558,x_min:26,x_max:543,o:\"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 m 427 -68 q 378 -211 427 -157 q 239 -267 327 -267 q 171 -246 214 -267 q 125 -205 125 -224 q 160 -161 125 -203 q 198 -120 195 -120 q 200 -121 199 -120 q 261 -150 230 -150 q 304 -130 286 -150 q 323 -85 323 -109 q 292 -10 323 -44 l 383 -12 q 427 -68 398 -30 z \"},\\u00E9:{ha:669,x_min:26,x_max:644,o:\"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 548 897 q 398 793 538 869 q 229 720 262 720 q 208 753 217 720 q 201 798 201 780 q 214 811 201 805 q 446 958 326 867 q 456 964 449 961 q 465 958 460 963 q 541 905 494 934 q 548 897 544 903 z \"},\\u00E8:{ha:669,x_min:26,x_max:644,o:\"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 496 797 q 487 762 496 791 q 474 733 477 733 q 463 732 459 733 q 149 895 225 843 q 142 903 146 897 q 181 945 148 915 q 226 975 215 975 q 351 906 242 975 q 492 810 450 843 q 496 797 498 806 z \"},\\u00EA:{ha:669,x_min:26,x_max:644,o:\"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 528 768 q 493 749 526 765 q 455 733 461 733 q 328 844 435 733 q 271 783 321 840 q 210 734 229 734 q 171 750 204 734 q 137 769 137 767 q 228 878 175 812 q 282 970 267 936 q 297 981 287 981 l 368 981 q 380 970 377 981 q 433 878 391 935 q 528 768 480 824 z \"},\\u00EB:{ha:669,x_min:26,x_max:644,o:\"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 558 747 q 534 735 558 735 q 473 734 513 735 q 414 734 433 734 q 397 753 397 734 l 396 891 q 410 908 396 908 q 445 906 421 908 q 481 904 469 904 q 511 905 492 904 q 541 905 531 905 q 557 895 557 905 q 554 856 557 882 q 551 818 551 831 q 555 782 551 806 q 558 747 558 758 m 281 743 q 261 734 281 736 q 222 734 247 732 q 194 736 192 736 q 163 734 184 736 q 132 733 142 733 q 119 746 119 733 q 121 778 119 757 q 122 810 122 799 q 120 851 122 823 q 118 892 118 878 q 134 907 118 907 q 196 906 155 907 q 259 905 238 905 q 279 891 279 905 q 277 854 279 879 q 275 817 275 829 q 278 780 275 804 q 281 743 281 755 z \"},\\u00ED:{ha:306,x_min:15,x_max:361,o:\"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 361 897 q 212 793 351 869 q 43 720 75 720 q 22 753 31 720 q 15 798 15 780 q 28 811 15 805 q 260 958 140 867 q 270 964 262 961 q 279 958 273 963 q 354 905 308 934 q 361 897 357 903 z \"},\\u00EC:{ha:306,x_min:-66,x_max:290,o:\"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 289 797 q 279 762 289 791 q 267 733 270 733 q 255 732 252 733 q -59 895 18 843 q -66 903 -62 897 q -26 945 -60 915 q 18 975 7 975 q 143 906 35 975 q 285 810 243 843 q 289 797 290 806 z \"},\\u00EE:{ha:306,x_min:-45,x_max:346,o:\"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 346 764 q 312 745 344 761 q 273 729 279 729 q 146 840 254 729 q 90 779 140 836 q 28 730 47 730 q -11 746 22 730 q -45 765 -45 763 q 46 873 -7 808 q 100 966 85 932 q 115 977 105 977 l 186 977 q 199 966 195 977 q 252 873 210 931 q 346 764 298 820 z \"},\\u00EF:{ha:306,x_min:-71,x_max:370,o:\"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 370 760 q 345 748 370 748 q 285 747 325 748 q 225 747 245 747 q 208 766 208 747 l 208 904 q 221 921 208 921 q 257 919 233 921 q 293 917 281 917 q 323 918 303 917 q 352 918 342 918 q 368 907 368 918 q 366 869 368 895 q 363 831 363 844 q 366 795 363 819 q 370 760 370 771 m 92 756 q 73 747 92 749 q 33 747 58 745 q 5 749 3 749 q -25 747 -5 749 q -56 746 -46 746 q -69 759 -69 746 q -68 791 -69 770 q -66 823 -66 812 q -68 864 -66 836 q -71 905 -71 891 q -54 920 -71 920 q 8 919 -34 920 q 70 918 50 918 q 91 904 91 918 q 89 867 91 892 q 86 829 86 842 q 89 793 86 817 q 92 756 92 768 z \"},\\u00F1:{ha:726,x_min:43,x_max:667,o:\"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 m 581 810 q 522 762 581 794 q 436 730 464 730 q 355 754 396 730 q 294 778 315 778 q 246 755 271 778 q 218 733 221 733 q 204 739 210 733 q 144 798 144 799 q 146 803 144 800 q 203 857 156 831 q 281 882 249 882 q 364 860 314 882 q 435 838 414 838 q 483 861 448 838 q 524 885 518 885 l 530 882 q 581 810 581 831 z \"},\\u00F3:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 562 897 q 412 793 551 869 q 243 720 275 720 q 222 753 231 720 q 215 798 215 780 q 228 811 215 805 q 460 958 340 867 q 470 964 463 961 q 479 958 473 963 q 554 905 508 934 q 562 897 557 903 z \"},\\u00F2:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 471 797 q 462 762 471 791 q 449 733 452 733 q 437 732 434 733 q 123 895 200 843 q 117 903 121 897 q 156 945 123 915 q 201 975 190 975 q 326 906 217 975 q 467 810 425 843 q 471 797 473 806 z \"},\\u00F4:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 547 768 q 513 749 545 765 q 475 733 481 733 q 348 844 455 733 q 291 783 341 840 q 229 734 248 734 q 190 750 224 734 q 157 769 157 767 q 248 878 195 812 q 302 970 286 936 q 317 981 307 981 l 388 981 q 400 970 397 981 q 453 878 411 935 q 547 768 500 824 z \"},\\u00F6:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 574 747 q 549 735 574 735 q 489 734 529 735 q 429 734 449 734 q 412 753 412 734 l 412 891 q 425 908 412 908 q 461 906 437 908 q 497 904 485 904 q 527 905 507 904 q 556 905 547 905 q 572 895 572 905 q 570 856 572 882 q 567 818 567 831 q 570 782 567 806 q 574 747 574 758 m 296 743 q 277 734 296 736 q 237 734 262 732 q 210 736 208 736 q 179 734 199 736 q 148 733 158 733 q 135 746 135 733 q 136 778 135 757 q 138 810 138 799 q 136 851 138 823 q 134 892 134 878 q 150 907 134 907 q 212 906 170 907 q 274 905 254 905 q 295 891 295 905 q 293 854 295 879 q 290 817 290 829 q 293 780 290 804 q 296 743 296 755 z \"},\\u00F5:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 571 817 q 513 769 571 801 q 427 737 454 737 q 346 761 387 737 q 285 785 305 785 q 237 762 262 785 q 208 740 212 740 q 195 746 200 740 q 135 804 135 806 q 136 810 135 806 q 194 864 146 838 q 271 889 239 889 q 354 867 304 889 q 425 844 404 844 q 473 868 438 844 q 514 892 509 892 l 521 889 q 571 817 571 838 z \"},\\u00FA:{ha:766,x_min:65,x_max:697,o:\"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 604 897 q 454 793 593 869 q 285 720 317 720 q 264 753 273 720 q 257 798 257 780 q 270 811 257 805 q 502 958 382 867 q 512 964 505 961 q 521 958 515 963 q 596 905 550 934 q 604 897 600 903 z \"},\\u00F9:{ha:766,x_min:65,x_max:697,o:\"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 526 797 q 516 762 526 791 q 503 733 507 733 q 492 732 488 733 q 178 895 254 843 q 171 903 175 897 q 211 945 177 915 q 255 975 244 975 q 380 906 271 975 q 522 810 479 843 q 526 797 527 806 z \"},\\u00FB:{ha:766,x_min:65,x_max:697,o:\"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 587 768 q 553 749 585 765 q 515 733 521 733 q 388 844 495 733 q 331 783 381 840 q 269 734 288 734 q 230 750 264 734 q 197 769 197 767 q 288 878 235 812 q 342 970 326 936 q 357 981 347 981 l 428 981 q 440 970 437 981 q 493 878 451 935 q 587 768 540 824 z \"},\\u00FC:{ha:766,x_min:65,x_max:697,o:\"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 612 747 q 588 735 612 735 q 528 734 568 735 q 468 734 488 734 q 451 753 451 734 l 450 891 q 464 908 450 908 q 499 906 475 908 q 536 904 524 904 q 566 905 546 904 q 595 905 585 905 q 611 895 611 905 q 608 856 611 882 q 606 818 606 831 q 609 782 606 806 q 612 747 612 758 m 335 743 q 315 734 335 736 q 276 734 301 732 q 248 736 246 736 q 217 734 238 736 q 186 733 197 733 q 174 746 174 733 q 175 778 174 757 q 176 810 176 799 q 174 851 176 823 q 172 892 172 878 q 189 907 172 907 q 251 906 209 907 q 313 905 292 905 q 334 891 334 905 q 331 854 334 879 q 329 817 329 829 q 332 780 329 804 q 335 743 335 755 z \"},\"\\u2020\":{ha:581,x_min:25,x_max:557,o:\"m 557 637 q 556 579 557 618 q 555 521 555 541 q 534 504 555 504 q 364 513 533 504 q 363 455 364 494 q 363 397 363 416 q 364 164 363 319 q 366 -68 366 9 q 351 -127 366 -127 l 227 -127 q 210 -118 212 -127 q 210 -96 210 -117 q 213 147 210 -15 q 216 389 216 309 l 216 511 q 132 507 203 511 q 46 504 79 504 q 26 519 26 504 q 26 578 26 539 q 25 636 25 616 q 39 652 25 652 q 125 650 71 652 q 211 647 190 648 l 208 946 q 224 971 208 971 l 359 971 q 372 949 372 971 q 368 647 372 810 q 454 650 389 648 q 539 652 507 652 q 557 637 557 652 z \"},\"\\xB0\":{ha:545,x_min:50,x_max:492,o:\"m 492 713 q 431 542 492 614 q 271 465 367 465 q 111 543 175 465 q 50 713 50 615 q 111 883 50 810 q 271 960 175 960 q 431 883 368 960 q 492 713 492 811 m 396 713 q 366 817 396 775 q 271 864 332 864 q 177 817 212 864 q 146 713 146 774 q 179 611 146 654 q 271 562 215 562 q 365 609 330 562 q 396 713 396 651 z \"},\"\\xA2\":{ha:481,x_min:37,x_max:450,o:\"m 450 661 q 428 570 450 646 q 422 562 425 562 q 415 566 419 562 q 339 597 375 594 q 289 271 322 488 q 318 267 302 267 q 389 285 355 267 q 419 303 404 294 q 436 255 427 299 q 444 199 444 216 q 382 167 444 179 q 287 157 335 157 q 271 158 276 157 q 252 11 260 60 q 245 -1 249 -1 q 225 2 239 -1 q 203 5 211 5 q 191 13 191 5 q 216 172 191 25 q 85 272 133 203 q 37 432 37 342 q 110 628 37 549 q 300 710 184 710 q 317 818 304 746 q 322 831 319 831 l 372 811 q 374 802 374 808 q 364 752 374 787 q 357 704 355 720 q 409 689 378 701 q 450 661 450 674 m 282 593 q 199 534 230 582 q 171 434 171 490 q 235 294 171 344 q 282 593 241 333 z \"},\"\\xA3\":{ha:648,x_min:35,x_max:671,o:\"m 671 132 q 668 121 671 130 q 650 14 668 121 q 631 0 648 0 q 466 2 576 0 q 302 5 357 5 q 146 -3 178 5 q 75 -16 87 -16 q 61 -4 64 -16 q 35 117 35 85 q 60 132 35 132 q 172 168 115 132 q 235 261 235 209 q 222 315 235 286 q 114 312 195 312 q 62 313 65 312 q 52 360 52 319 q 79 454 52 454 q 110 454 90 454 q 140 453 130 453 q 80 618 80 558 q 176 783 80 724 q 369 833 257 833 q 501 810 420 833 q 600 749 600 783 q 591 701 600 745 q 579 643 581 654 q 571 618 578 631 q 566 617 569 617 q 494 656 572 617 q 354 694 416 694 q 274 676 307 694 q 233 610 233 654 q 264 526 233 579 q 313 447 288 486 q 513 444 372 444 q 526 432 523 444 q 527 406 528 423 q 525 385 525 383 q 527 352 525 374 q 530 319 530 330 q 517 313 530 313 q 382 315 391 313 q 391 262 391 288 q 335 138 391 193 q 493 139 387 138 q 653 140 600 140 q 671 132 671 140 z \"},\"\\xA7\":{ha:564,x_min:40,x_max:518,o:\"m 518 123 q 439 -35 518 24 q 264 -89 367 -89 q 52 -7 125 -89 q 40 11 40 5 q 92 106 40 8 q 99 111 94 111 q 152 68 96 111 q 254 25 208 25 q 332 46 302 25 q 368 115 368 71 q 286 205 368 161 q 134 286 134 285 q 52 421 52 342 q 86 534 52 483 q 121 587 121 586 q 102 617 121 594 q 66 671 77 646 q 46 760 46 711 q 115 913 46 859 q 281 962 178 962 q 461 897 404 962 q 470 880 470 887 l 425 791 q 419 787 422 787 q 373 821 420 787 q 282 856 326 856 q 186 782 186 856 q 216 707 186 738 q 286 660 234 690 q 425 575 402 592 q 511 450 511 511 q 472 343 511 397 q 432 292 432 290 q 454 266 432 285 q 496 219 482 243 q 518 123 518 180 m 371 409 q 319 494 371 448 q 229 541 267 541 q 199 512 215 541 q 184 471 184 486 q 239 389 184 433 q 326 349 290 349 q 355 373 339 349 q 371 409 371 395 z \"},\"\\u2022\":{ha:627,x_min:52,x_max:572,o:\"m 572 403 q 503 202 572 283 q 311 118 429 118 q 121 203 193 118 q 52 403 52 283 q 121 602 52 522 q 311 686 193 686 q 503 602 429 686 q 572 403 572 522 z \"},\"\\xB6\":{ha:754,x_min:52,x_max:677,o:\"m 677 890 q 677 697 677 826 q 676 504 676 568 q 397 7 676 121 q 192 -34 298 -34 q 168 -21 174 -34 q 153 32 153 12 q 170 45 153 43 q 272 52 221 48 q 372 77 330 57 q 557 292 511 140 q 587 585 587 387 q 585 793 587 732 q 509 819 568 819 q 520 568 520 755 q 494 333 520 418 q 355 149 457 208 q 184 105 281 105 q 130 132 144 105 q 119 197 119 151 q 132 216 119 216 q 182 207 142 216 q 248 197 223 197 q 376 256 327 197 q 422 394 422 312 q 418 413 422 413 q 368 392 421 413 q 275 371 314 371 q 111 446 174 371 q 52 619 52 517 q 143 866 52 773 q 389 960 235 960 q 642 922 494 960 q 668 914 665 916 q 677 890 677 908 m 440 578 q 439 700 440 618 q 437 822 437 781 q 401 836 437 836 q 229 629 229 836 q 336 470 229 470 q 435 501 391 470 q 440 578 440 529 z \"},\\u00DF:{ha:694,x_min:77,x_max:659,o:\"m 659 330 q 389 -4 659 111 q 371 -9 377 -9 q 334 36 362 -9 q 307 93 307 82 q 326 107 307 98 q 504 318 504 191 q 464 427 504 385 q 357 469 423 469 q 320 461 343 469 q 288 454 296 454 q 273 561 273 454 q 288 574 273 568 q 415 729 415 628 q 336 832 415 832 q 252 787 283 832 q 224 693 224 748 q 232 353 224 580 q 240 12 240 126 q 228 -3 240 -3 q 192 0 216 -3 q 155 3 168 3 q 125 1 145 3 q 94 0 104 0 q 77 21 77 0 q 80 202 77 81 q 83 383 83 323 q 80 528 83 431 q 77 672 77 624 q 146 869 77 787 q 334 954 220 954 q 486 903 426 954 q 549 757 549 848 q 526 669 549 713 q 486 607 511 639 q 463 580 463 581 q 489 562 463 572 q 659 330 659 503 z \"},\"\\xAE\":{ha:859,x_min:52,x_max:807,o:\"m 807 528 q 703 237 807 361 q 429 107 593 107 q 156 238 267 107 q 52 528 52 362 q 155 819 52 695 q 429 949 265 949 q 703 819 593 949 q 807 528 807 695 m 742 528 q 657 773 742 669 q 429 885 568 885 q 331 867 393 885 q 255 817 256 844 l 258 812 q 435 821 330 821 q 654 643 654 821 q 633 536 654 581 q 593 482 619 508 q 571 454 571 461 q 652 278 571 448 q 742 528 742 377 m 526 621 q 393 733 526 733 q 335 725 366 733 q 332 631 332 694 l 332 555 q 433 550 389 550 q 526 621 526 550 m 623 249 q 581 247 608 249 q 539 245 553 245 q 525 254 529 245 q 497 343 515 275 q 465 429 481 404 q 406 439 459 439 q 367 439 357 439 q 340 422 340 437 q 350 337 340 394 q 359 253 359 281 q 273 250 359 250 q 236 249 245 250 q 429 174 317 174 q 623 249 538 174 m 227 492 q 218 635 227 537 q 197 771 208 747 q 117 528 117 655 q 199 288 117 385 q 211 282 203 282 q 220 289 218 282 q 227 492 227 333 z \"},\"\\xA9\":{ha:859,x_min:53,x_max:808,o:\"m 808 528 q 704 237 808 361 q 431 107 594 107 q 157 237 267 107 q 53 528 53 361 q 156 819 53 696 q 431 949 264 949 q 705 819 595 949 q 808 528 808 695 m 736 529 q 652 768 736 665 q 431 878 563 878 q 207 769 295 878 q 125 529 125 668 q 208 290 125 391 q 431 180 296 180 q 653 290 564 180 q 736 529 736 393 m 603 753 q 582 713 603 749 q 557 670 559 675 q 553 659 555 665 q 550 661 552 659 q 456 694 504 694 q 328 533 328 694 q 464 372 328 372 q 520 385 492 372 q 549 399 534 392 l 554 392 q 577 350 559 385 q 596 310 596 314 q 534 273 596 288 q 454 260 486 260 q 266 337 338 260 q 193 532 193 414 q 264 726 193 648 q 453 806 338 806 q 538 793 486 806 q 603 753 603 776 z \"},\"\\u2122\":{ha:871,x_min:5,x_max:837,o:\"m 836 542 q 833 533 837 533 l 730 533 q 722 545 722 533 q 724 638 722 576 q 725 730 725 700 q 722 739 725 739 q 692 645 711 734 q 664 536 672 549 q 651 534 663 534 l 578 534 q 564 536 570 534 q 537 635 551 567 q 510 734 523 704 q 506 739 509 737 q 503 730 503 737 q 505 637 503 699 q 507 545 507 576 q 497 533 507 533 q 474 535 490 533 q 452 536 459 536 q 424 535 442 536 q 395 533 405 533 q 392 542 392 533 q 395 640 392 574 q 397 739 397 706 q 395 842 397 773 q 393 945 393 910 q 401 954 393 954 q 455 957 419 954 q 507 960 490 960 q 555 889 517 960 q 597 804 590 825 q 615 761 604 783 q 666 871 640 816 q 726 959 709 959 q 776 957 742 959 q 827 956 810 956 q 835 952 835 956 q 833 846 835 917 q 832 739 832 774 q 834 640 832 706 q 836 542 836 574 m 359 914 q 347 824 359 824 q 299 823 334 823 q 252 822 269 822 q 250 750 250 798 l 250 699 q 253 620 250 672 q 256 542 256 568 q 245 533 256 533 l 112 533 q 109 536 110 534 q 112 620 109 564 q 115 703 115 675 l 115 818 q 9 812 45 812 q 5 816 5 812 q 9 879 5 827 q 17 939 15 934 q 32 944 19 944 q 187 949 83 944 q 342 954 290 954 q 359 914 359 954 z \"},\"\\xB4\":{ha:485,x_min:32,x_max:378,o:\"m 378 918 q 229 814 368 890 q 60 741 92 741 q 39 774 47 741 q 32 819 32 801 q 45 832 32 826 q 277 979 157 888 q 287 985 279 982 q 296 979 290 984 q 371 926 325 955 q 378 918 374 924 z \"},\"\\xA8\":{ha:485,x_min:24,x_max:464,o:\"m 464 825 q 439 813 464 813 q 379 812 419 813 q 319 812 339 812 q 302 831 302 812 l 302 969 q 315 986 302 986 q 351 984 327 986 q 387 982 375 982 q 417 983 397 982 q 446 983 437 983 q 463 972 463 983 q 460 934 463 960 q 457 896 457 909 q 460 860 457 884 q 464 825 464 836 m 186 821 q 167 812 186 814 q 127 812 153 810 q 100 814 98 814 q 69 812 90 814 q 38 811 48 811 q 25 824 25 811 q 26 856 25 835 q 28 888 28 877 q 26 929 28 901 q 24 970 24 956 q 40 985 24 985 q 102 984 60 985 q 164 983 144 983 q 185 969 185 983 q 183 932 185 957 q 180 895 180 907 q 183 858 180 882 q 186 821 186 833 z \"},\"\\u2260\":{ha:612,x_min:69,x_max:543,o:\"m 543 265 l 308 265 l 254 47 l 174 66 l 223 265 l 69 265 l 69 346 l 243 346 l 285 513 l 69 513 l 69 595 l 305 595 l 359 812 l 438 792 l 389 595 l 543 595 l 543 513 l 369 513 l 328 346 l 543 346 l 543 265 z \"},\\u00C6:{ha:1149,x_min:43,x_max:1112,o:\"m 1112 143 q 1100 77 1112 122 q 1089 9 1089 32 q 1072 -2 1089 -2 q 928 2 1024 -2 q 783 5 831 5 q 674 3 747 5 q 566 0 602 0 q 545 20 545 0 q 546 117 545 56 q 549 214 548 191 q 467 218 513 218 q 298 212 348 218 q 273 196 281 210 q 229 87 252 142 q 183 0 193 0 l 61 0 q 45 9 49 0 q 44 28 43 15 q 46 47 46 47 q 45 66 46 54 q 45 86 45 79 q 65 132 45 87 q 232 488 123 250 q 424 916 340 747 q 431 932 427 924 q 446 942 435 940 q 641 953 502 953 q 784 956 688 953 q 926 960 879 960 q 989 962 947 960 q 1053 965 1031 965 q 1082 946 1078 965 q 1097 831 1097 873 q 1061 821 1097 821 q 770 814 930 821 q 728 810 754 814 q 701 696 701 802 l 701 667 q 703 589 701 597 q 758 553 713 553 q 1060 566 855 553 l 1066 566 q 1079 554 1079 566 q 1074 492 1079 535 q 1068 428 1068 450 q 1055 417 1068 417 q 1028 421 1050 417 q 810 429 979 429 q 716 416 731 429 q 701 331 701 404 l 701 289 q 702 210 701 217 q 730 141 707 152 q 787 135 744 135 q 1088 153 929 135 q 1099 154 1095 154 q 1112 143 1112 154 m 549 395 q 548 530 549 440 q 546 666 546 621 q 545 751 546 733 q 536 783 542 783 q 513 749 529 783 q 340 352 340 387 q 364 338 340 338 q 549 350 487 338 q 549 395 549 367 z \"},\\u00D8:{ha:1007,x_min:41,x_max:966,o:\"m 893 876 q 880 852 893 867 q 498 429 871 841 q 107 -4 370 282 q 94 -13 98 -13 q 70 14 87 -13 q 52 49 56 38 q 417 458 56 59 q 842 929 819 904 q 854 939 846 934 q 878 910 863 934 q 893 876 893 886 m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z \"},\"\\u221E\":{ha:861,x_min:24,x_max:838,o:\"m 838 171 q 762 94 838 94 l 591 94 q 498 171 548 94 l 431 273 l 364 170 q 321 113 336 125 q 273 94 302 95 l 101 94 q 24 171 24 94 l 24 515 q 101 592 24 592 l 273 592 q 366 515 317 591 l 432 413 l 498 515 q 591 592 548 592 l 762 592 q 838 515 838 592 l 838 171 m 747 174 l 747 513 l 586 513 l 477 344 l 587 174 l 747 174 m 386 342 l 274 513 l 115 513 l 115 174 l 277 174 l 386 342 z \"},\"\\xB1\":{ha:568,x_min:46,x_max:524,o:\"m 521 441 l 325 441 l 325 269 l 244 269 l 244 441 l 47 441 l 47 518 l 244 518 l 244 697 l 325 697 l 325 518 l 521 518 l 521 441 m 524 129 l 46 129 l 46 212 l 524 212 l 524 129 z \"},\"\\u2264\":{ha:473,x_min:52,x_max:396,o:\"m 396 205 l 392 205 l 52 439 l 52 488 l 396 725 l 396 631 l 144 465 l 396 299 l 396 205 m 396 98 l 52 98 l 52 179 l 396 179 l 396 98 z \"},\"\\u2265\":{ha:473,x_min:65,x_max:410,o:\"m 410 439 l 65 205 l 65 299 l 316 465 l 65 631 l 65 725 l 69 725 l 410 488 l 410 439 m 409 98 l 65 98 l 65 179 l 409 179 l 409 98 z \"},\"\\xA5\":{ha:914,x_min:9,x_max:889,o:\"m 889 646 q 888 593 889 628 q 886 541 886 558 q 834 530 886 530 q 771 533 802 532 q 643 361 732 472 q 742 370 665 362 q 840 375 804 375 q 852 366 852 375 l 852 306 q 855 286 852 299 q 858 264 858 272 q 840 243 858 246 q 764 241 839 243 q 545 237 645 239 q 536 12 536 222 q 528 0 536 0 q 487 1 514 0 q 447 3 460 3 q 410 1 435 3 q 372 0 385 0 q 358 20 359 0 q 359 117 357 56 q 361 214 361 189 q 357 239 361 224 q 60 243 57 243 q 40 294 40 243 q 42 366 40 357 q 56 375 43 375 q 258 361 44 375 q 131 532 214 416 q 29 530 94 530 q 11 568 11 530 q 9 621 11 679 q 25 656 9 656 q 90 652 32 656 q 87 739 90 669 q 86 825 86 791 q 102 840 86 840 q 174 837 125 840 q 248 833 223 833 q 258 827 258 833 q 257 736 258 797 q 256 644 256 675 q 447 642 374 642 q 644 644 523 642 q 641 731 644 665 q 639 818 639 785 q 653 833 639 831 q 803 840 700 840 q 819 821 819 840 q 818 736 819 789 q 815 652 816 671 q 876 656 871 656 q 889 646 889 656 m 603 538 q 490 539 555 539 l 437 539 q 371 538 416 539 q 306 538 327 538 q 463 361 399 426 q 603 538 524 425 z \"},\\u00B5:{ha:532,x_min:74,x_max:458,o:\"m 458 0 l 370 0 l 370 19 q 245 -1 323 -1 q 163 26 181 -1 l 163 -250 l 74 -250 l 74 660 l 163 660 l 163 172 q 256 77 163 77 q 369 88 321 77 l 369 660 l 458 660 l 458 0 z \"},\"\\u2202\":{ha:589,x_min:84,x_max:505,o:\"m 505 583 l 505 75 q 484 21 505 42 q 430 0 463 0 l 159 0 q 105 21 126 0 q 84 75 84 42 l 84 510 q 105 564 84 543 q 159 585 126 585 l 401 585 l 180 1061 l 282 1061 l 505 583 m 410 83 l 410 503 l 178 503 l 178 83 l 410 83 z \"},\"\\u2211\":{ha:496,x_min:58,x_max:440,o:\"m 440 0 l 58 0 l 58 73 l 317 540 l 58 977 l 58 1061 l 436 1061 l 436 978 l 151 978 l 393 580 l 393 499 l 152 83 l 440 83 l 440 0 z \"},\"\\u220F\":{ha:545,x_min:26,x_max:518,o:\"m 518 978 l 418 978 l 418 0 l 326 0 l 326 978 l 216 978 l 216 0 l 124 0 l 124 978 l 26 978 l 26 1061 l 518 1061 l 518 978 z \"},\\u03C0:{ha:545,x_min:26,x_max:518,o:\"m 518 522 l 418 522 l 418 0 l 326 0 l 326 522 l 216 522 l 216 0 l 124 0 l 124 522 l 26 522 l 26 606 l 518 606 l 518 522 z \"},\"\\u222B\":{ha:330,x_min:-22,x_max:323,o:\"m 323 982 l 196 982 l 196 -196 q 178 -247 196 -226 q 123 -271 158 -271 l -22 -272 l -22 -193 l 106 -193 l 107 985 q 183 1061 107 1061 l 323 1061 l 323 982 z \"},\\u00AA:{ha:639,x_min:35,x_max:594,o:\"m 594 922 q 593 911 594 920 q 572 681 572 775 q 580 494 572 604 q 586 412 586 397 q 574 395 586 395 q 521 392 556 395 q 468 390 486 390 q 453 432 457 390 q 446 475 450 473 q 432 463 440 471 q 269 382 357 382 q 96 477 163 382 q 35 672 35 562 q 101 872 35 791 q 289 958 172 958 q 382 929 334 958 q 456 861 431 901 q 462 878 459 859 q 468 922 464 892 q 479 950 469 935 q 543 941 503 949 q 594 922 594 932 m 587 318 q 579 218 587 310 q 571 211 577 210 l 564 211 q 302 218 428 218 q 192 215 266 218 q 81 211 117 211 q 68 221 68 211 q 74 321 68 297 q 86 330 76 330 q 205 328 126 330 q 325 325 285 325 q 451 327 367 325 q 576 329 534 329 q 587 318 587 329 m 436 679 q 404 788 436 740 q 310 843 368 843 q 208 789 247 843 q 174 675 174 741 q 206 555 174 603 q 313 501 243 501 q 407 564 372 501 q 436 679 436 614 z \"},\\u00BA:{ha:639,x_min:57,x_max:575,o:\"m 575 676 q 504 475 575 562 q 317 383 429 383 q 128 475 204 383 q 57 676 57 562 q 129 877 57 791 q 317 968 205 968 q 504 876 428 968 q 575 676 575 790 m 552 318 q 547 265 552 307 q 545 218 548 248 q 536 211 542 210 l 529 211 q 310 218 393 218 q 205 215 275 218 q 102 211 136 211 q 89 221 89 211 q 94 321 89 298 q 107 330 97 330 q 219 328 144 330 q 332 325 294 325 q 437 327 367 325 q 542 329 507 329 q 552 318 552 329 m 449 676 q 417 791 449 741 q 319 848 380 848 q 218 791 258 848 q 183 676 183 741 q 216 558 183 607 q 319 503 253 503 q 418 561 382 503 q 449 676 449 610 z \"},\\u03A9:{ha:716,x_min:40,x_max:678,o:\"m 678 -1 l 415 -1 l 415 332 l 540 332 l 540 978 l 180 977 l 179 332 l 304 332 l 304 -1 l 40 -1 l 40 87 l 224 87 l 224 248 l 160 248 q 106 269 127 248 q 85 323 85 290 l 85 986 q 106 1040 85 1019 q 160 1061 127 1061 l 557 1061 q 612 1040 590 1061 q 634 986 634 1019 l 634 323 q 613 269 634 290 q 559 248 592 248 l 494 248 l 494 87 l 678 87 l 678 -1 z \"},\\u00E6:{ha:1192,x_min:29,x_max:1168,o:\"m 1168 362 q 1157 322 1168 341 q 1125 297 1144 300 q 986 283 1078 292 l 711 256 q 785 152 720 193 q 911 115 844 115 q 1015 138 966 115 q 1080 180 1048 153 q 1107 203 1107 203 q 1112 201 1110 203 q 1137 146 1123 178 q 1162 104 1162 103 q 1152 89 1162 100 q 895 -9 1061 -9 q 705 69 753 -9 q 709 22 709 49 q 708 1 709 10 q 626 -5 671 -5 q 575 0 598 -5 q 572 89 572 33 q 571 113 572 105 q 470 18 517 46 q 335 -16 413 -16 q 111 87 197 -16 q 29 323 29 184 q 115 571 29 473 q 351 673 205 673 q 581 553 465 673 q 604 646 586 585 l 607 646 q 721 623 616 646 q 868 672 786 672 q 1083 583 998 672 q 1168 362 1168 494 m 1008 411 q 962 506 1008 463 q 863 549 915 549 q 753 504 799 549 q 708 395 708 458 q 726 372 708 372 q 970 390 768 372 q 1008 411 1008 394 m 558 330 q 509 475 558 415 q 374 539 456 539 q 234 475 286 539 q 186 326 186 416 q 236 183 186 241 q 372 121 289 121 q 509 185 455 121 q 558 330 558 245 z \"},\\u00F8:{ha:710,x_min:26,x_max:684,o:\"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 650 650 q 640 631 650 642 q 302 238 527 500 q 96 -3 234 157 q 82 -14 92 -8 q 61 11 77 -12 q 46 39 46 34 q 302 345 46 44 q 602 692 548 632 q 613 701 605 696 q 633 676 617 699 q 650 650 650 653 z \"},\"\\xBF\":{ha:553,x_min:31,x_max:536,o:\"m 399 860 q 374 794 399 821 q 311 766 349 766 q 249 794 273 766 q 224 860 224 822 q 249 926 224 897 q 311 954 274 954 q 374 926 349 954 q 399 860 399 898 m 536 111 q 534 86 536 92 q 426 18 528 52 q 290 -11 337 -11 q 103 60 176 -11 q 31 244 31 130 q 70 387 31 316 q 167 500 107 454 q 269 648 264 574 q 271 680 270 664 q 290 696 274 696 q 327 699 302 696 q 362 703 351 703 q 379 668 379 703 q 335 517 379 586 q 253 412 294 465 q 208 286 208 350 q 245 185 208 224 q 345 146 282 146 q 464 182 406 146 q 515 218 522 218 q 536 111 536 218 z \"},\"\\xA1\":{ha:322,x_min:79,x_max:256,o:\"m 256 857 q 231 789 256 817 q 167 762 206 762 q 103 789 127 762 q 79 857 79 817 q 103 926 79 897 q 167 954 127 954 q 231 926 207 954 q 256 857 256 898 m 253 157 q 252 83 253 132 q 252 9 252 35 q 243 -17 252 -17 q 205 -13 231 -17 q 167 -9 180 -9 q 129 -13 154 -9 q 92 -17 104 -17 q 83 9 83 -17 l 83 415 q 125 675 83 467 q 129 688 127 684 q 139 696 132 696 l 191 696 q 201 672 198 696 q 228 511 207 631 q 253 157 253 369 z \"},\"\\xAC\":{ha:639,x_min:81,x_max:558,o:\"m 558 225 l 474 225 l 474 423 l 81 423 l 81 507 l 558 507 l 558 225 z \"},\"\\u221A\":{ha:1320,x_min:107,x_max:1310,o:\"m 1305 920 q 1310 896 1310 903 q 1297 883 1310 886 q 1253 875 1256 876 q 1137 802 1213 864 q 1013 682 1060 741 q 833 395 923 571 q 708 69 736 205 q 692 -52 707 60 q 668 -118 684 -111 q 583 -143 612 -143 q 568 -117 572 -143 q 553 -50 560 -70 q 343 243 495 110 q 235 326 271 306 q 132 366 216 336 q 107 399 107 375 q 116 420 107 412 q 188 507 138 448 q 246 566 218 542 q 272 578 261 578 q 302 568 279 578 q 458 456 375 532 q 570 316 541 380 q 602 277 588 277 q 642 335 618 277 q 755 527 664 390 q 908 734 847 664 q 1225 1047 1124 984 q 1244 1054 1236 1054 q 1278 1013 1261 1054 q 1305 920 1287 989 z \"},\\u0192:{ha:530,x_min:50,x_max:492,o:\"m 492 781 q 469 689 492 785 q 458 670 465 670 q 411 686 455 670 q 342 701 367 701 q 290 678 302 701 q 283 616 283 663 q 286 547 283 589 q 452 534 398 547 q 465 524 465 532 q 457 461 465 511 q 446 404 450 408 q 370 401 418 399 q 293 404 290 404 q 323 73 323 197 q 192 -142 323 -88 q 182 -144 186 -144 q 172 -134 178 -144 q 111 -26 140 -67 q 104 -16 108 -22 q 142 21 123 3 q 171 103 171 51 q 144 403 171 282 q 77 399 115 399 q 62 407 65 399 q 50 536 50 530 q 61 546 50 546 q 98 545 73 546 q 135 545 123 545 q 127 653 127 673 q 177 791 127 736 q 309 846 227 846 q 412 829 347 846 q 492 781 492 807 z \"},\"\\u2248\":{ha:701,x_min:115,x_max:586,o:\"m 586 545 q 530 487 586 487 q 460 500 496 487 l 204 598 l 204 491 l 115 491 l 115 633 q 171 691 115 691 q 241 677 205 691 l 497 580 l 497 687 l 586 687 l 586 545 m 586 277 q 530 219 586 219 q 460 233 496 219 l 204 330 l 204 223 l 115 223 l 115 365 q 171 423 115 423 q 241 409 205 423 l 497 312 l 497 419 l 586 419 l 586 277 z \"},\\u0394:{ha:555,x_min:31,x_max:526,o:\"m 526 0 l 31 0 l 31 83 l 232 1064 l 325 1064 q 431 547 332 1025 q 526 80 526 81 l 526 0 m 432 90 l 277 895 l 122 90 l 432 90 z \"},\"\\xAB\":{ha:699,x_min:36,x_max:663,o:\"m 663 528 q 585 456 663 509 q 485 396 517 410 q 473 388 479 394 q 570 327 473 388 q 661 248 661 270 q 659 241 661 246 q 618 149 645 216 q 610 139 615 139 q 473 243 553 184 q 349 317 408 286 q 336 338 336 323 q 336 387 336 354 q 335 436 335 420 q 347 457 335 450 q 484 536 418 494 q 552 589 490 541 q 612 634 611 634 q 619 625 617 634 q 663 528 621 619 m 364 527 q 270 447 364 508 q 175 387 222 417 q 273 327 176 387 q 362 249 362 271 q 359 241 362 247 q 319 149 345 212 q 312 139 316 139 q 174 244 253 185 q 50 317 118 281 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 186 536 134 503 q 254 589 193 541 q 314 634 312 634 q 322 626 319 634 q 364 527 324 618 z \"},\"\\xBB\":{ha:699,x_min:40,x_max:667,o:\"m 667 436 q 666 387 667 420 q 665 339 665 354 q 653 317 665 323 q 406 149 498 235 q 391 139 401 144 q 383 149 387 142 q 343 241 372 180 q 340 249 340 246 q 418 319 340 267 q 517 379 486 366 q 528 387 522 381 q 431 447 479 417 q 338 528 338 506 q 382 625 358 568 q 389 634 385 634 q 449 589 391 634 q 518 536 511 541 q 654 457 583 494 q 667 436 667 450 m 368 338 q 355 317 368 323 q 107 149 186 227 q 94 140 103 144 q 86 149 89 142 q 45 241 73 180 q 43 248 43 245 q 57 269 43 256 q 220 379 138 347 q 231 387 224 380 q 134 447 182 417 q 40 528 40 506 q 45 538 40 530 q 83 625 73 593 q 91 634 86 634 q 220 536 149 590 q 355 457 281 496 q 368 436 368 450 l 368 338 z \"},\"\\u2026\":{ha:896,x_min:46,x_max:850,o:\"m 850 100 q 820 21 850 55 q 746 -12 790 -12 q 671 22 702 -12 q 643 100 643 55 q 672 177 643 145 q 746 210 701 210 q 820 177 790 210 q 850 100 850 144 m 551 100 q 522 21 551 55 q 447 -12 492 -12 q 373 22 403 -12 q 345 100 345 55 q 374 177 345 145 q 447 210 403 210 q 522 177 492 210 q 551 100 551 144 m 253 100 q 223 21 253 55 q 149 -12 193 -12 q 75 22 104 -12 q 46 100 46 55 q 75 177 46 145 q 149 210 104 210 q 223 177 193 210 q 253 100 253 144 z \"},\"\\xA0\":{ha:174,x_min:0,x_max:0,o:\"\"},\\u00C0:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 578 1058 q 568 1023 578 1052 q 555 994 559 994 q 544 993 541 994 q 230 1156 307 1104 q 223 1164 227 1158 q 263 1206 229 1176 q 307 1236 296 1236 q 432 1167 323 1236 q 574 1071 532 1104 q 578 1058 579 1067 z \"},\\u00C3:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 661 1101 q 603 1053 661 1084 q 517 1021 545 1021 q 436 1044 477 1021 q 375 1068 395 1068 q 327 1046 352 1068 q 298 1023 302 1023 q 285 1029 290 1023 q 225 1088 225 1089 q 227 1093 225 1090 q 284 1147 237 1121 q 361 1173 330 1173 q 445 1150 395 1173 q 515 1128 494 1128 q 564 1152 528 1128 q 604 1175 599 1175 l 611 1173 q 661 1101 661 1122 z \"},\\u00D5:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 711 1094 q 653 1046 711 1078 q 567 1014 595 1014 q 486 1038 527 1014 q 425 1061 446 1061 q 377 1039 402 1061 q 349 1017 352 1017 q 335 1023 340 1017 q 275 1081 275 1082 q 277 1086 275 1083 q 334 1141 287 1114 q 412 1166 380 1166 q 495 1143 445 1166 q 566 1121 545 1121 q 614 1145 578 1121 q 654 1168 649 1168 l 661 1166 q 711 1094 711 1115 z \"},\\u0152:{ha:1303,x_min:40,x_max:1259,o:\"m 1259 136 q 1249 75 1259 119 q 1238 7 1238 30 q 1224 -5 1238 -5 l 1211 -4 q 875 1 1196 -3 q 822 2 848 2 q 791 35 791 7 q 795 88 791 54 q 799 142 798 126 q 671 26 753 70 q 503 -17 589 -17 q 171 132 307 -17 q 40 475 40 277 q 170 819 40 675 q 503 966 304 966 q 673 924 591 966 q 807 809 754 881 q 811 803 811 803 q 813 830 813 803 l 813 885 q 818 951 812 949 q 831 951 819 952 q 906 949 856 951 q 981 947 956 947 q 1099 949 1020 947 q 1217 951 1177 951 q 1240 932 1236 951 q 1255 817 1255 857 q 1240 807 1255 807 q 1120 811 1200 807 q 1000 815 1040 815 q 949 762 958 815 q 947 673 947 753 q 946 648 947 665 q 945 622 945 630 q 1000 553 945 553 q 1115 556 1038 553 q 1231 559 1192 559 q 1249 543 1249 559 q 1247 510 1249 532 q 1246 477 1246 488 q 1247 456 1246 470 q 1249 435 1249 441 q 1240 421 1249 421 q 1155 424 1212 421 q 1070 427 1099 427 q 958 405 974 427 q 949 281 949 390 q 958 168 949 186 q 1053 135 975 135 q 1152 141 1086 135 q 1249 146 1217 146 q 1259 136 1259 146 m 804 475 q 719 709 804 609 q 497 815 629 815 q 282 707 371 815 q 199 475 199 604 q 283 245 199 347 q 497 136 372 136 q 720 240 631 136 q 804 475 804 340 z \"},\\u0153:{ha:1196,x_min:26,x_max:1173,o:\"m 1173 357 q 1129 294 1173 304 q 1000 283 1126 294 l 714 257 q 779 156 722 198 q 893 117 831 117 q 1089 182 1015 117 q 1109 200 1109 200 q 1117 199 1116 200 q 1141 143 1127 175 q 1166 102 1166 100 q 1156 86 1166 98 q 900 -16 1061 -16 q 736 23 816 -16 q 614 135 650 66 q 505 27 583 69 q 355 -12 432 -12 q 117 88 211 -12 q 26 332 26 186 q 118 575 26 477 q 355 676 212 676 q 603 547 513 676 l 615 529 q 725 637 652 596 q 873 678 796 678 q 1091 584 1007 678 q 1173 357 1173 493 m 1013 411 q 966 505 1013 463 q 867 546 920 546 q 753 500 802 546 q 705 390 705 455 q 734 372 705 372 q 974 390 774 372 q 1013 411 1013 394 m 543 332 q 493 476 543 418 q 355 538 440 538 q 218 477 271 538 q 170 332 170 419 q 219 188 170 245 q 355 126 271 126 q 493 188 440 126 q 543 332 543 245 z \"},\"\\u2013\":{ha:785,x_min:32,x_max:753,o:\"m 753 467 q 747 400 753 465 q 741 334 741 336 q 728 325 739 325 q 565 326 674 325 q 401 328 456 328 q 225 323 342 328 q 50 319 109 319 q 32 338 32 319 q 45 401 32 356 q 53 465 45 425 q 74 476 57 476 q 220 474 123 476 q 367 472 318 472 q 553 476 429 472 q 739 479 677 479 q 753 467 753 479 z \"},\"\\u2014\":{ha:1104,x_min:39,x_max:1069,o:\"m 1069 466 q 1061 401 1069 464 q 1053 334 1054 338 q 1039 325 1051 325 q 806 326 961 325 q 572 328 650 328 q 315 323 486 328 q 58 319 144 319 q 39 338 39 319 q 61 465 39 339 q 83 476 66 476 q 310 474 159 476 q 536 472 460 472 q 794 476 622 472 q 1051 479 966 479 q 1069 466 1069 479 z \"},\"\\u201C\":{ha:526,x_min:47,x_max:486,o:\"m 486 629 q 439 577 486 621 q 385 533 392 533 q 370 543 379 533 q 287 713 287 627 q 317 846 287 776 q 392 961 347 916 q 408 972 402 972 q 415 966 411 972 q 465 916 465 911 q 435 869 465 922 q 406 774 406 817 q 446 674 406 719 q 486 629 486 629 m 243 646 q 196 595 243 639 q 145 551 149 551 q 74 627 127 551 q 47 730 47 664 q 158 991 47 876 q 174 1002 168 1002 q 202 977 176 1002 q 229 949 229 953 q 197 901 229 957 q 165 793 165 844 q 185 716 165 751 q 223 671 198 695 q 243 646 243 652 z \"},\"\\u201D\":{ha:526,x_min:39,x_max:478,o:\"m 478 817 q 367 555 478 672 q 352 546 357 546 q 323 570 350 546 q 297 598 297 595 q 328 647 297 591 q 359 754 359 703 q 340 831 359 797 q 302 876 328 852 q 282 901 282 895 q 329 952 282 909 q 380 996 376 996 q 452 921 398 996 q 478 817 478 883 m 238 779 q 208 646 238 715 q 134 530 178 576 q 117 520 123 520 q 110 525 114 520 q 60 576 60 581 q 90 623 60 570 q 119 718 119 675 q 79 818 119 773 q 39 863 39 863 q 86 915 39 871 q 140 958 133 958 q 155 949 146 958 q 238 779 238 865 z \"},\"\\u2018\":{ha:288,x_min:54,x_max:254,o:\"m 254 633 q 205 582 254 627 q 153 538 157 538 q 138 546 146 538 q 54 718 54 618 q 87 859 54 782 q 165 979 119 936 q 181 987 174 987 q 210 963 184 987 q 237 936 237 939 q 233 929 237 933 q 180 779 180 861 q 217 677 180 722 q 254 633 254 633 z \"},\"\\u2019\":{ha:288,x_min:32,x_max:233,o:\"m 233 803 q 121 542 233 661 q 106 532 111 532 q 97 538 103 532 q 50 583 50 583 q 54 591 50 586 q 103 741 103 659 q 84 820 103 785 q 50 865 73 842 q 32 887 32 883 q 72 926 32 889 q 121 974 115 964 q 133 983 127 983 q 150 974 139 983 q 233 803 233 900 z \"},\"\\xF7\":{ha:568,x_min:47,x_max:521,o:\"m 355 640 q 334 589 355 610 q 283 568 313 568 q 234 589 254 568 q 213 640 213 610 q 234 691 213 670 q 283 712 254 712 q 334 691 313 712 q 355 640 355 670 m 521 424 l 47 424 l 47 509 l 521 509 l 521 424 m 355 292 q 334 241 355 262 q 283 220 313 220 q 234 241 254 220 q 213 292 213 262 q 234 343 213 321 q 283 364 254 364 q 334 343 313 364 q 355 292 355 321 z \"},\"\\u25CA\":{ha:560,x_min:20,x_max:541,o:\"m 541 389 l 306 45 l 257 45 l 20 389 l 257 734 l 306 734 l 541 389 m 447 389 l 281 641 l 115 389 l 281 138 l 447 389 z \"},\\u00FF:{ha:661,x_min:24,x_max:640,o:\"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 558 697 q 534 686 558 686 q 473 685 513 686 q 414 684 433 684 q 397 703 397 684 l 396 842 q 410 859 396 859 q 445 857 421 859 q 481 854 469 854 q 511 855 492 854 q 541 856 531 856 q 557 845 557 856 q 554 807 557 832 q 551 768 551 781 q 555 732 551 756 q 558 697 558 709 m 281 694 q 261 684 281 686 q 222 684 247 683 q 194 686 192 686 q 163 685 184 686 q 132 684 142 684 q 119 696 119 684 q 121 728 119 707 q 122 760 122 749 q 120 801 122 774 q 118 842 118 829 q 134 857 118 857 q 196 857 155 857 q 259 856 238 856 q 279 842 279 856 q 277 804 279 829 q 275 767 275 779 q 278 730 275 755 q 281 694 281 706 z \"},\\u0178:{ha:815,x_min:24,x_max:794,o:\"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 638 1000 q 614 988 638 988 q 553 987 593 988 q 494 987 513 987 q 477 1006 477 987 l 476 1144 q 490 1161 476 1161 q 525 1159 501 1161 q 562 1157 549 1157 q 591 1158 572 1157 q 621 1158 611 1158 q 637 1147 637 1158 q 634 1109 637 1135 q 631 1071 631 1084 q 635 1035 631 1059 q 638 1000 638 1011 m 361 996 q 341 987 361 989 q 302 987 327 985 q 274 989 272 989 q 243 987 264 989 q 212 986 222 986 q 199 999 199 986 q 201 1031 199 1010 q 202 1063 202 1052 q 200 1104 202 1076 q 198 1145 198 1131 q 214 1160 198 1160 q 276 1159 235 1160 q 339 1158 318 1158 q 359 1144 359 1158 q 357 1107 359 1132 q 355 1069 355 1082 q 358 1033 355 1057 q 361 996 361 1008 z \"},\"\\u2044\":{ha:424,x_min:-61,x_max:495,o:\"m 495 789 q 490 777 495 786 q 264 380 413 646 q 44 -41 193 238 q 32 -53 37 -53 q -16 -18 28 -53 q -61 22 -61 18 q -58 32 -61 26 q 395 851 231 525 q 404 860 399 860 q 455 829 414 860 q 495 789 495 798 z \"},\"\\xA4\":{ha:828,x_min:96,x_max:743,o:\"m 743 745 l 623 625 l 623 357 l 743 237 l 663 157 l 531 288 l 307 288 l 176 157 l 96 237 l 216 357 l 216 625 l 96 745 l 176 825 l 308 694 l 532 694 l 663 825 l 743 745 m 511 389 l 511 594 l 328 594 l 328 389 l 511 389 z \"},\"\\u2039\":{ha:406,x_min:36,x_max:380,o:\"m 380 524 q 207 388 380 500 q 296 330 208 386 q 374 256 374 281 q 355 205 374 252 q 332 149 334 155 q 325 139 331 144 q 191 239 268 182 q 50 317 155 262 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 315 628 182 528 q 328 634 319 631 q 335 625 332 632 q 376 534 347 595 q 380 524 380 528 z \"},\"\\u203A\":{ha:406,x_min:24,x_max:370,o:\"m 370 338 q 357 317 370 323 q 96 149 194 231 q 81 139 91 144 q 74 149 77 142 q 29 245 60 181 q 26 252 26 250 q 104 324 26 274 q 203 379 170 367 q 213 387 208 380 q 117 446 165 416 q 24 524 24 503 q 47 569 24 525 q 72 625 69 613 q 79 634 75 634 q 92 628 83 634 q 214 538 132 597 q 357 457 264 505 q 370 436 370 450 l 370 338 z \"},\"\\uF001\":{ha:705,x_min:12,x_max:644,o:\"m 644 630 q 637 471 644 577 q 631 311 631 364 q 634 164 631 262 q 637 17 637 66 q 625 1 637 1 l 496 1 q 479 24 479 1 q 482 143 479 64 q 485 261 485 222 q 484 372 485 298 q 484 484 484 446 q 463 505 484 504 q 250 510 391 505 q 255 265 250 429 q 260 18 260 100 q 245 0 260 0 l 123 0 q 106 21 106 0 l 106 489 q 92 504 106 500 q 65 505 83 507 q 43 503 41 503 q 17 510 18 503 q 12 619 12 525 q 50 635 12 630 q 98 637 75 636 q 96 715 96 689 q 369 983 96 983 q 555 940 463 983 q 566 929 566 936 q 555 863 566 910 q 533 807 544 807 q 472 831 528 807 q 385 854 416 854 q 269 809 301 854 q 243 684 243 772 q 244 640 243 664 q 365 638 281 640 q 485 636 444 636 q 557 637 533 636 q 595 642 567 638 q 633 645 620 645 q 644 630 644 645 z \"},\"\\uF002\":{ha:721,x_min:16,x_max:669,o:\"m 669 934 q 665 922 669 930 q 649 683 650 892 q 650 436 650 852 q 652 232 650 368 q 654 28 654 96 q 643 0 654 0 l 513 0 q 500 16 500 0 q 502 226 500 85 q 504 436 504 366 l 504 521 q 252 514 420 521 q 257 266 252 433 q 262 18 262 101 q 249 0 262 0 l 126 0 q 109 21 109 0 l 109 492 q 95 507 109 503 q 68 508 86 509 q 45 505 43 505 q 20 513 22 505 q 16 621 16 524 q 54 636 16 632 q 102 639 77 637 q 96 705 96 671 q 173 916 96 840 q 387 992 251 992 q 652 949 517 992 q 669 934 669 943 m 509 852 q 376 867 422 867 q 273 810 311 867 q 240 692 240 760 q 244 643 240 668 l 503 643 q 509 852 503 805 z \"},\"\\u2021\":{ha:607,x_min:35,x_max:570,o:\"m 570 637 q 569 582 570 619 q 568 527 568 545 q 549 509 568 509 q 372 517 541 509 q 370 446 372 494 q 368 374 368 397 q 371 235 368 393 q 550 240 532 240 q 567 226 563 240 q 569 196 570 216 q 567 171 567 167 q 569 144 567 174 q 568 113 570 123 q 549 98 563 98 q 375 104 536 98 q 378 -45 376 62 q 380 -195 380 -140 q 367 -227 380 -227 l 236 -227 q 220 -220 223 -227 q 219 -201 219 -217 q 222 -48 219 -142 q 227 104 226 76 q 142 101 203 104 q 57 98 88 98 q 38 113 43 98 q 37 144 35 123 q 39 171 39 173 q 37 196 39 168 q 38 226 36 216 q 52 240 41 240 q 142 237 83 240 q 232 233 205 234 q 233 298 232 245 q 235 361 235 337 l 235 515 q 147 511 221 515 q 60 509 94 509 q 39 524 39 509 q 38 580 39 543 q 37 636 37 617 q 52 652 37 652 q 139 650 84 652 q 227 647 205 648 q 223 797 226 684 q 221 946 221 890 q 236 971 221 971 l 372 971 q 385 956 385 971 q 379 647 385 865 q 466 650 400 648 q 553 652 520 652 q 570 637 570 652 z \"},\"\\xB7\":{ha:298,x_min:46,x_max:253,o:\"m 253 501 q 223 423 253 456 q 149 390 193 390 q 75 423 104 390 q 46 501 46 456 q 75 579 46 547 q 149 611 104 611 q 223 578 193 611 q 253 501 253 546 z \"},\"\\u201A\":{ha:288,x_min:33,x_max:232,o:\"m 232 48 q 198 -85 232 -11 q 121 -201 165 -160 q 105 -210 112 -210 q 77 -186 103 -210 q 51 -159 51 -161 q 82 -110 51 -167 q 114 -1 114 -52 q 73 98 114 52 q 33 143 33 144 q 83 196 33 151 q 135 240 131 240 q 150 232 140 240 q 232 48 232 158 z \"},\"\\u201E\":{ha:526,x_min:28,x_max:448,o:\"m 448 113 q 336 -149 448 -33 q 321 -159 327 -159 q 293 -134 319 -159 q 267 -106 267 -110 q 298 -58 267 -114 q 329 50 329 -1 q 309 127 329 93 q 271 172 297 148 q 252 197 252 191 q 298 248 252 204 q 349 292 345 292 q 421 216 368 292 q 448 113 448 179 m 227 59 q 197 -75 227 -5 q 121 -189 168 -141 q 105 -199 111 -199 q 97 -195 102 -199 q 50 -143 50 -140 q 79 -97 50 -150 q 109 -1 109 -44 q 68 99 109 54 q 28 144 28 144 q 75 195 28 151 q 129 239 122 239 q 144 229 135 239 q 227 59 227 146 z \"},\"\\u2030\":{ha:1522,x_min:32,x_max:1491,o:\"m 1491 253 q 1433 76 1491 153 q 1274 -8 1371 -8 q 1114 76 1177 -8 q 1055 253 1055 153 q 1114 431 1055 353 q 1274 515 1177 515 q 1433 431 1371 515 q 1491 253 1491 353 m 990 253 q 933 76 990 153 q 774 -8 871 -8 q 613 76 676 -8 q 555 253 555 153 q 613 431 555 353 q 774 515 677 515 q 933 431 871 515 q 990 253 990 353 m 718 812 q 713 796 718 806 q 533 412 652 669 q 370 -1 479 292 q 356 -20 362 -20 q 321 -4 347 -20 q 296 20 296 12 q 302 40 296 27 q 397 233 342 113 q 489 428 469 388 q 572 627 524 498 q 648 833 610 730 q 662 850 655 850 q 694 836 671 850 q 718 812 718 821 m 467 583 q 410 406 467 483 q 250 322 347 322 q 90 406 153 322 q 32 583 32 483 q 90 761 32 684 q 250 846 153 846 q 410 761 347 846 q 467 583 467 684 m 1378 253 q 1354 351 1378 308 q 1274 403 1324 403 q 1193 351 1223 403 q 1168 253 1168 308 q 1194 157 1168 201 q 1274 104 1225 104 q 1354 155 1324 104 q 1378 253 1378 198 m 878 253 q 854 351 878 308 q 774 403 825 403 q 693 351 722 403 q 668 253 668 308 q 694 157 668 201 q 774 104 725 104 q 853 155 824 104 q 878 253 878 198 m 354 583 q 330 682 354 638 q 250 733 301 733 q 170 681 199 733 q 144 583 144 637 q 171 487 144 532 q 250 435 202 435 q 330 486 300 435 q 354 583 354 529 z \"},\\u00C2:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 644 1020 q 610 1001 642 1017 q 572 985 578 985 q 445 1096 552 985 q 388 1034 438 1092 q 326 985 345 985 q 287 1002 321 985 q 254 1021 254 1019 q 345 1129 292 1064 q 399 1221 383 1187 q 414 1232 404 1232 l 485 1232 q 497 1221 494 1232 q 550 1129 508 1187 q 644 1020 597 1076 z \"},\\u00CA:{ha:747,x_min:68,x_max:713,o:\"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 576 1025 q 542 1006 574 1022 q 504 990 510 990 q 377 1101 484 990 q 320 1040 370 1097 q 258 991 277 991 q 219 1007 253 991 q 186 1026 186 1024 q 277 1135 224 1069 q 331 1227 315 1193 q 346 1238 336 1238 l 417 1238 q 429 1227 426 1238 q 482 1135 440 1192 q 576 1025 529 1081 z \"},\\u00C1:{ha:916,x_min:6,x_max:909,o:\"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 642 1166 q 492 1063 632 1139 q 323 989 356 989 q 302 1023 311 989 q 296 1068 296 1050 q 309 1081 296 1075 q 541 1228 420 1137 q 551 1234 543 1231 q 559 1228 554 1233 q 635 1175 589 1204 q 642 1166 638 1173 z \"},\\u00CB:{ha:747,x_min:68,x_max:713,o:\"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 595 1008 q 570 996 595 996 q 510 996 550 996 q 450 995 470 995 q 433 1014 433 995 l 433 1152 q 446 1169 433 1169 q 482 1167 458 1169 q 518 1165 506 1165 q 548 1166 528 1165 q 577 1166 568 1166 q 593 1156 593 1166 q 591 1117 593 1143 q 588 1079 588 1092 q 591 1043 588 1067 q 595 1008 595 1019 m 317 1004 q 298 995 317 997 q 258 995 283 994 q 231 997 229 997 q 200 996 220 997 q 169 994 179 994 q 156 1007 156 994 q 157 1039 156 1018 q 159 1071 159 1060 q 157 1112 159 1084 q 155 1153 155 1139 q 171 1168 155 1168 q 233 1167 191 1168 q 295 1166 275 1166 q 316 1152 316 1166 q 314 1115 316 1140 q 311 1078 311 1090 q 314 1041 311 1065 q 317 1004 317 1017 z \"},\\u00C8:{ha:747,x_min:68,x_max:713,o:\"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 559 1046 q 549 1011 559 1040 q 536 983 540 983 q 525 981 522 983 q 211 1144 288 1093 q 204 1152 208 1146 q 244 1195 210 1164 q 288 1225 277 1225 q 413 1156 304 1225 q 555 1059 513 1093 q 559 1046 560 1055 z \"},\\u00CD:{ha:329,x_min:21,x_max:368,o:\"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 368 1149 q 218 1046 357 1122 q 49 972 81 972 q 28 1006 37 972 q 21 1051 21 1033 q 34 1064 21 1058 q 266 1211 146 1120 q 276 1217 269 1214 q 285 1211 279 1216 q 360 1158 314 1187 q 368 1149 363 1156 z \"},\\u00CE:{ha:329,x_min:-30,x_max:361,o:\"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 361 1027 q 327 1007 359 1023 q 288 991 294 991 q 161 1103 269 991 q 104 1041 155 1099 q 43 992 62 992 q 4 1009 37 992 q -30 1027 -30 1025 q 61 1136 8 1071 q 115 1228 100 1194 q 130 1239 120 1239 l 201 1239 q 214 1228 210 1239 q 267 1136 224 1194 q 361 1027 313 1082 z \"},\\u00CF:{ha:329,x_min:-62,x_max:378,o:\"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 378 1005 q 353 994 378 994 q 293 993 333 994 q 233 992 253 992 q 216 1011 216 992 l 216 1149 q 229 1166 216 1166 q 265 1164 241 1166 q 301 1162 289 1162 q 331 1163 311 1162 q 360 1164 351 1164 q 376 1153 376 1164 q 374 1115 376 1140 q 371 1076 371 1089 q 374 1040 371 1064 q 378 1005 378 1017 m 100 1002 q 81 992 100 994 q 41 992 66 991 q 14 994 12 994 q -17 993 3 994 q -48 991 -38 991 q -61 1004 -61 991 q -60 1036 -61 1015 q -58 1068 -58 1057 q -60 1109 -58 1082 q -62 1150 -62 1137 q -46 1165 -62 1165 q 16 1164 -26 1165 q 78 1164 58 1164 q 99 1149 99 1164 q 97 1112 99 1137 q 94 1075 94 1087 q 97 1038 94 1063 q 100 1002 100 1014 z \"},\\u00CC:{ha:329,x_min:-16,x_max:340,o:\"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 339 1037 q 330 1002 339 1031 q 317 973 320 973 q 305 972 302 973 q -9 1135 68 1083 q -16 1143 -12 1137 q 24 1185 -9 1155 q 68 1215 58 1215 q 193 1146 85 1215 q 335 1050 293 1083 q 339 1037 340 1046 z \"},\\u00D3:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 701 1159 q 551 1056 690 1131 q 382 982 414 982 q 361 1016 370 982 q 354 1061 354 1042 q 367 1074 354 1067 q 599 1221 479 1129 q 609 1227 602 1223 q 618 1221 612 1225 q 693 1168 647 1196 q 701 1159 696 1166 z \"},\\u00D4:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 693 1024 q 659 1005 691 1021 q 621 989 627 989 q 494 1100 601 989 q 437 1038 487 1096 q 375 989 394 989 q 336 1006 370 989 q 302 1025 302 1023 q 393 1133 340 1068 q 448 1225 432 1192 q 463 1236 452 1236 l 534 1236 q 546 1225 543 1236 q 599 1133 557 1191 q 693 1024 646 1080 z \"},\\u00D2:{ha:1007,x_min:41,x_max:966,o:\"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 678 1048 q 669 1013 678 1042 q 656 984 659 984 q 644 983 641 984 q 330 1145 407 1094 q 323 1154 328 1147 q 363 1196 330 1166 q 408 1226 397 1226 q 532 1157 424 1226 q 674 1061 632 1094 q 678 1048 680 1057 z \"},\\u00DA:{ha:917,x_min:68,x_max:848,o:\"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 703 1136 q 553 1033 693 1108 q 385 959 417 959 q 363 993 372 959 q 357 1038 357 1019 q 370 1050 357 1044 q 602 1198 481 1106 q 612 1204 604 1200 q 621 1198 615 1202 q 696 1145 650 1173 q 703 1136 699 1143 z \"},\\u00DB:{ha:917,x_min:68,x_max:848,o:\"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 664 1019 q 630 999 662 1015 q 591 983 597 983 q 465 1095 572 983 q 408 1033 458 1090 q 346 984 365 984 q 307 1001 340 984 q 273 1019 273 1017 q 364 1128 311 1063 q 418 1220 403 1186 q 433 1231 423 1231 l 505 1231 q 517 1220 513 1231 q 570 1128 528 1185 q 664 1019 616 1074 z \"},\\u00D9:{ha:917,x_min:68,x_max:848,o:\"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 613 1038 q 604 1003 613 1032 q 591 975 594 975 q 579 973 576 975 q 265 1136 342 1084 q 258 1144 262 1138 q 298 1186 264 1156 q 342 1217 332 1217 q 467 1147 359 1217 q 609 1051 567 1084 q 613 1038 614 1047 z \"},\\u0131:{ha:306,x_min:62,x_max:241,o:\"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z \"},\"\\u02C6\":{ha:485,x_min:48,x_max:439,o:\"m 439 771 q 405 752 437 768 q 366 736 372 736 q 239 847 347 736 q 182 785 233 843 q 121 736 140 736 q 82 753 115 736 q 48 772 48 770 q 139 880 86 815 q 193 972 178 939 q 208 983 198 983 l 279 983 q 292 972 288 983 q 345 880 302 938 q 439 771 391 827 z \"},\"\\u02DC\":{ha:485,x_min:25,x_max:461,o:\"m 461 842 q 403 794 461 826 q 317 762 345 762 q 236 786 277 762 q 175 810 195 810 q 127 787 152 810 q 98 765 102 765 q 85 771 90 765 q 25 829 25 831 q 26 835 25 831 q 84 889 37 863 q 161 914 130 914 q 244 892 195 914 q 315 869 294 869 q 363 893 328 869 q 404 917 399 917 l 411 914 q 461 842 461 863 z \"},\"\\xAF\":{ha:485,x_min:25,x_max:472,o:\"m 472 893 q 460 840 472 890 q 450 785 456 814 q 410 777 447 778 q 341 777 385 776 q 292 779 290 779 q 168 774 250 779 q 45 768 85 768 q 25 787 25 768 q 45 851 25 803 q 75 899 64 899 q 144 895 98 899 q 214 892 191 892 q 337 897 255 892 q 460 901 419 901 q 472 893 472 901 z \"},\"\\u02D8\":{ha:485,x_min:32,x_max:444,o:\"m 444 940 q 390 784 444 844 q 239 721 334 721 q 86 783 143 721 q 32 940 32 844 q 52 951 32 951 q 121 939 119 951 q 130 903 124 927 q 239 823 157 823 q 347 901 319 823 q 355 939 349 914 q 382 949 359 949 q 444 940 444 949 z \"},\"\\u02D9\":{ha:485,x_min:141,x_max:320,o:\"m 320 783 q 294 764 320 764 l 168 764 q 142 802 142 764 q 142 862 142 822 q 141 922 141 903 q 153 947 141 943 q 168 949 158 949 q 222 948 186 949 q 275 947 258 947 q 309 943 302 947 q 317 912 317 937 q 317 882 317 902 q 317 852 317 863 q 318 818 317 841 q 320 783 320 794 z \"},\"\\u02DA\":{ha:485,x_min:78,x_max:401,o:\"m 401 832 q 353 720 401 766 q 239 673 305 673 q 125 720 173 673 q 78 832 78 766 q 125 947 78 899 q 239 994 172 994 q 354 947 307 994 q 401 832 401 899 m 321 832 q 298 894 321 868 q 239 920 275 920 q 180 894 203 920 q 157 832 157 868 q 181 775 157 800 q 237 750 205 750 q 296 774 271 750 q 321 832 321 798 z \"},\"\\xB8\":{ha:485,x_min:39,x_max:340,o:\"m 340 -77 q 292 -219 340 -165 q 153 -275 241 -275 q 85 -254 127 -275 q 39 -213 39 -233 q 74 -170 39 -211 q 112 -128 109 -128 q 114 -129 113 -128 q 175 -158 144 -158 q 218 -138 199 -158 q 237 -93 237 -117 q 205 -18 237 -52 l 297 -20 q 340 -77 312 -38 z \"},\"\\u02DD\":{ha:485,x_min:14,x_max:515,o:\"m 515 941 q 504 926 515 936 q 347 829 446 876 q 174 766 255 786 q 162 765 166 765 q 140 799 146 765 q 25 748 63 748 q 14 758 14 748 q 16 773 14 763 q 18 789 18 784 q 17 806 18 795 q 15 822 15 817 q 26 835 15 830 q 279 986 109 869 q 294 995 284 990 q 324 968 302 991 q 354 945 347 945 q 393 973 362 945 q 430 1002 424 1002 q 475 973 435 1002 q 515 941 515 945 z \"},\"\\u02DB\":{ha:485,x_min:110,x_max:398,o:\"m 398 -162 q 334 -224 378 -199 q 246 -248 290 -248 q 148 -211 186 -248 q 110 -115 110 -174 q 113 -82 110 -100 q 159 -36 124 -66 q 210 -3 197 -3 l 301 -3 q 214 -111 214 -60 q 260 -152 214 -152 q 319 -133 292 -152 q 348 -113 347 -113 q 376 -135 354 -113 q 398 -162 398 -157 z \"},\"\\u02C7\":{ha:485,x_min:45,x_max:435,o:\"m 435 953 q 345 844 397 910 q 290 753 306 787 q 275 742 285 742 l 204 742 q 192 753 195 742 q 139 844 180 787 q 45 954 92 898 q 79 974 46 958 q 117 989 111 989 q 244 878 137 989 q 301 940 251 882 q 362 988 344 988 q 401 972 368 988 q 435 953 435 956 z \"},\\u0141:{ha:718,x_min:-1,x_max:710,o:\"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 m 492 519 q 479 507 492 513 q 309 438 422 484 q 22 322 214 399 q 16 321 19 321 q 1 335 7 321 l -1 444 q 12 458 -1 452 q 465 640 463 640 q 475 628 473 640 q 492 519 492 536 z \"},\\u0142:{ha:306,x_min:-28,x_max:399,o:\"m 274 941 l 273 932 q 258 498 258 680 q 261 257 258 418 q 264 16 264 96 q 253 0 264 0 l 123 0 q 111 16 111 0 q 113 257 111 96 q 114 498 114 418 q 107 719 114 572 q 100 938 100 865 q 114 951 100 951 q 151 949 126 951 q 187 947 175 947 q 225 949 200 947 q 262 951 250 951 q 274 941 275 951 m 399 495 q 386 488 399 493 q -9 332 251 432 q -25 346 -19 332 l -28 456 q -14 469 -28 464 q 372 621 360 621 q 382 608 380 621 q 399 495 399 518 z \"},\\u0160:{ha:648,x_min:75,x_max:614,o:\"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 m 560 1197 q 469 1088 522 1154 q 415 997 431 1031 q 400 986 410 986 l 329 986 q 317 997 320 986 q 264 1088 305 1031 q 170 1198 216 1142 q 203 1218 171 1202 q 241 1234 236 1234 q 369 1122 262 1234 q 426 1184 376 1126 q 487 1232 469 1232 q 526 1216 493 1232 q 560 1197 559 1200 z \"},\\u0161:{ha:415,x_min:14,x_max:405,o:\"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 m 405 911 q 314 803 367 869 q 260 711 275 745 q 245 701 254 701 l 174 701 q 161 711 165 701 q 109 803 150 745 q 14 912 61 857 q 48 932 16 916 q 86 948 81 948 q 214 836 106 948 q 271 899 220 841 q 332 947 313 947 q 371 930 338 947 q 405 911 404 914 z \"},\\u017D:{ha:701,x_min:26,x_max:662,o:\"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 m 549 1189 q 458 1080 511 1146 q 404 989 420 1023 q 389 978 399 978 l 318 978 q 306 989 309 978 q 253 1080 294 1023 q 159 1190 205 1134 q 193 1210 160 1194 q 231 1225 225 1225 q 358 1114 251 1225 q 415 1176 365 1118 q 476 1224 458 1224 q 515 1208 482 1224 q 549 1189 549 1192 z \"},\\u017E:{ha:585,x_min:21,x_max:572,o:\"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 m 503 895 q 412 786 465 852 q 358 694 374 728 q 343 684 353 684 l 272 684 q 260 694 263 684 q 207 786 248 728 q 113 895 159 840 q 146 915 114 899 q 184 931 179 931 q 312 819 205 931 q 369 882 319 824 q 430 930 412 930 q 469 913 436 930 q 503 895 503 897 z \"},\"\\xA6\":{ha:340,x_min:107,x_max:232,o:\"m 232 481 q 224 473 232 474 q 119 464 163 464 q 114 471 114 464 l 114 761 q 111 896 114 806 q 107 1031 107 986 q 181 1052 107 1052 q 225 1042 224 1052 q 223 961 223 1057 l 224 770 q 228 625 224 723 q 232 481 232 530 m 232 -220 q 224 -229 232 -228 q 119 -238 163 -238 q 114 -231 114 -238 l 114 59 q 111 194 114 104 q 107 329 107 284 q 181 351 107 351 q 225 340 224 351 q 223 259 223 355 l 224 68 q 228 -77 224 22 q 232 -220 232 -172 z \"},\\u00D0:{ha:945,x_min:-18,x_max:905,o:\"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 m 443 530 q 427 468 443 541 q 418 410 425 448 q 401 403 416 403 q 299 404 368 403 q 197 406 231 406 q 98 401 164 406 q 0 396 33 396 q -18 416 -18 396 q 21 532 -18 439 q 40 542 25 542 q 429 547 83 542 q 443 530 443 541 z \"},\\u00F0:{ha:772,x_min:28,x_max:806,o:\"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 m 806 852 q 791 787 806 857 q 783 736 789 764 q 407 724 777 724 q 392 742 392 724 q 427 846 392 775 q 444 854 431 854 q 619 857 503 854 q 793 860 735 860 q 806 852 806 860 z \"},\\u00DD:{ha:815,x_min:24,x_max:794,o:\"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 623 1151 q 473 1048 612 1123 q 304 974 336 974 q 283 1008 292 974 q 276 1053 276 1034 q 289 1065 276 1059 q 521 1213 401 1121 q 531 1219 524 1215 q 540 1213 534 1217 q 615 1160 569 1188 q 623 1151 618 1158 z \"},\\u00DE:{ha:867,x_min:68,x_max:839,o:\"m 839 517 q 751 268 839 358 q 507 178 664 178 q 390 180 468 178 q 272 183 311 183 q 250 155 250 183 q 255 82 250 131 q 259 9 259 34 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 645 l 69 930 q 92 951 68 951 q 129 949 104 951 q 165 947 153 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 250 847 256 923 q 296 846 273 846 q 398 850 330 846 q 498 854 465 854 q 744 761 648 854 q 839 517 839 667 m 668 507 q 612 663 668 606 q 456 720 555 720 q 345 714 425 720 q 250 703 253 708 q 245 484 245 695 q 247 405 245 457 q 249 326 249 353 q 264 317 249 320 q 471 310 301 310 q 668 507 668 310 z \"},\\u00FE:{ha:798,x_min:71,x_max:761,o:\"m 761 326 q 675 88 761 189 q 449 -18 583 -18 q 300 37 369 -18 q 243 92 272 64 q 237 -191 237 85 q 222 -212 237 -212 q 98 -210 117 -212 q 83 -192 83 -208 q 85 68 83 -105 q 86 329 86 242 q 78 634 86 431 q 71 939 71 838 q 89 958 71 956 q 161 961 113 959 q 200 966 171 962 q 239 970 224 970 q 250 954 250 970 q 247 884 250 931 q 243 812 243 836 q 241 701 243 775 q 239 589 239 627 q 243 563 239 563 q 254 572 248 566 q 446 669 349 669 q 673 564 581 669 q 761 326 761 463 m 603 329 q 552 472 603 410 q 418 538 498 538 q 289 470 339 538 q 243 328 243 409 q 291 184 243 245 q 424 118 342 118 q 554 186 500 118 q 603 329 603 250 z \"},\"\\xAD\":{ha:561,x_min:23,x_max:532,o:\"m 532 471 q 522 350 532 462 q 513 345 520 345 q 390 347 472 345 q 267 349 308 349 q 35 345 267 349 q 23 354 23 345 q 29 412 23 362 q 32 475 29 441 q 47 482 37 482 q 160 478 85 482 q 272 473 235 473 q 396 476 313 473 q 519 479 478 479 q 532 471 532 479 z \"},\"\\xB9\":{ha:335,x_min:27,x_max:277,o:\"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 z \"},\"\\xB2\":{ha:532,x_min:18,x_max:503,o:\"m 503 268 q 486 258 503 258 q 381 261 451 258 q 276 265 311 265 q 168 264 240 265 q 58 262 95 262 q 44 272 47 262 q 31 370 31 312 q 43 384 31 382 q 114 404 66 387 q 311 637 311 517 q 210 703 311 703 q 104 671 167 703 q 50 640 42 640 q 44 641 46 640 q 30 697 42 642 q 18 761 18 753 q 125 811 29 786 q 250 833 208 833 q 399 798 340 833 q 471 671 471 755 q 243 385 471 519 l 264 385 q 486 396 353 383 l 492 396 q 500 385 500 396 q 499 354 500 374 q 498 323 498 333 q 500 296 498 314 q 503 268 503 277 z \"},\"\\xB3\":{ha:525,x_min:27,x_max:478,o:\"m 478 423 q 404 290 478 334 q 248 254 343 254 q 37 292 135 254 q 27 300 27 296 q 28 306 27 302 q 41 339 33 317 q 52 393 44 357 q 61 404 55 404 q 68 401 64 403 q 212 366 153 366 q 294 376 270 366 q 332 440 332 393 q 206 517 332 517 q 162 515 190 517 q 124 514 134 514 q 94 525 94 514 q 110 616 94 616 q 176 611 132 616 q 241 607 220 607 q 302 661 302 607 q 199 722 302 722 q 99 708 139 722 q 70 695 89 703 q 63 694 67 694 q 57 705 59 694 q 52 787 52 731 q 134 822 52 810 q 239 831 191 831 q 382 799 319 831 q 462 686 462 759 q 393 562 462 593 q 478 423 478 520 z \"},\"\\xBD\":{ha:1086,x_min:27,x_max:998,o:\"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 703 789 q 699 777 703 786 q 472 380 621 646 q 252 -41 401 238 q 240 -53 245 -53 q 192 -18 237 -53 q 147 22 147 18 q 151 32 147 26 q 603 851 439 525 q 612 860 608 860 q 663 829 623 860 q 703 789 703 798 m 998 7 q 981 -3 998 -3 q 876 0 945 -3 q 770 4 806 4 q 662 3 734 4 q 553 1 589 1 q 538 11 541 1 q 526 109 526 51 q 537 123 526 121 q 608 142 561 126 q 805 376 805 256 q 705 441 805 441 q 599 410 661 441 q 544 379 536 379 q 538 380 541 379 q 525 436 536 381 q 513 500 513 492 q 619 550 524 525 q 744 572 703 572 q 894 537 835 572 q 966 410 966 494 q 738 124 966 258 l 758 124 q 980 135 848 122 l 987 135 q 995 123 995 135 q 994 93 995 113 q 992 62 992 72 q 995 35 992 53 q 998 7 998 16 z \"},\"\\xBC\":{ha:1086,x_min:27,x_max:987,o:\"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 731 789 q 726 777 731 786 q 500 380 649 646 q 280 -41 429 238 q 268 -53 273 -53 q 220 -18 264 -53 q 175 22 175 18 q 178 32 175 26 q 631 851 467 525 q 640 860 635 860 q 691 829 650 860 q 731 789 731 798 m 987 107 q 928 100 987 100 q 911 85 911 100 q 913 44 911 72 q 916 2 916 16 q 837 -13 916 -13 q 751 -3 751 -13 q 757 43 751 12 q 762 90 762 74 q 754 100 762 100 q 636 97 715 100 q 517 95 557 95 q 489 121 494 95 q 487 165 487 129 q 496 221 487 211 q 632 387 557 288 q 758 559 695 473 q 774 570 766 570 q 902 545 828 570 q 918 528 918 541 q 915 457 918 505 q 911 387 911 410 q 910 317 911 366 q 909 248 909 273 l 909 212 q 944 214 921 212 q 978 216 967 216 q 987 208 987 216 q 987 157 987 191 q 987 107 987 124 m 779 429 l 779 432 q 685 307 764 406 q 610 212 648 260 q 653 208 613 208 q 767 210 724 208 q 774 302 768 238 q 780 395 780 362 q 779 429 780 413 z \"},\"\\xBE\":{ha:1086,x_min:-4,x_max:1059,o:\"m 876 789 q 871 777 876 786 q 644 380 793 646 q 425 -41 574 238 q 412 -53 418 -53 q 364 -18 409 -53 q 319 22 319 18 q 323 32 319 26 q 775 851 612 525 q 785 860 780 860 q 835 829 795 860 q 876 789 876 798 m 1059 107 q 1000 100 1059 100 q 983 85 983 100 q 985 44 983 72 q 988 2 988 16 q 909 -13 988 -13 q 823 -3 823 -13 q 829 43 823 12 q 834 90 834 74 q 826 100 834 100 q 708 97 787 100 q 589 95 629 95 q 561 121 566 95 q 559 165 559 129 q 568 221 559 211 q 704 387 629 288 q 830 559 767 473 q 846 570 838 570 q 974 545 900 570 q 990 528 990 541 q 986 457 990 505 q 983 387 983 410 q 982 317 983 366 q 981 248 981 273 l 981 212 q 1016 214 993 212 q 1050 216 1039 216 q 1059 208 1059 216 q 1059 157 1059 191 q 1059 107 1059 124 m 850 429 l 850 432 q 757 307 836 406 q 682 212 720 260 q 725 208 685 208 q 839 210 795 208 q 846 302 840 238 q 852 395 852 362 q 850 429 852 413 m 447 423 q 373 290 447 334 q 217 254 312 254 q 6 292 104 254 q -4 300 -4 296 q -3 306 -4 302 q 10 339 2 317 q 20 393 13 357 q 30 404 24 404 q 37 401 33 403 q 181 366 122 366 q 263 376 239 366 q 301 440 301 393 q 175 517 301 517 q 131 515 159 517 q 93 514 102 514 q 63 525 63 514 q 79 616 63 616 q 144 611 100 616 q 210 607 189 607 q 271 661 271 607 q 168 722 271 722 q 68 708 108 722 q 39 695 58 703 q 32 694 36 694 q 26 705 28 694 q 20 787 20 731 q 103 822 20 810 q 208 831 159 831 q 351 799 288 831 q 431 686 431 759 q 362 562 431 593 q 447 423 447 520 z \"},\\u00FD:{ha:661,x_min:24,x_max:640,o:\"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 534 892 q 384 789 524 865 q 215 715 248 715 q 194 749 203 715 q 187 794 187 776 q 200 807 187 801 q 432 954 312 863 q 442 960 435 957 q 451 954 446 959 q 526 901 480 930 q 534 892 530 899 z \"},\"\\xD7\":{ha:561,x_min:42,x_max:503,o:\"m 503 553 q 491 530 503 541 l 363 401 l 490 274 q 502 250 502 262 q 472 201 502 232 q 423 171 441 171 q 401 182 412 171 l 272 311 l 144 183 q 122 172 134 172 q 73 202 103 172 q 42 250 42 231 q 53 273 42 261 l 182 401 l 54 529 q 43 551 43 540 q 73 601 43 571 q 121 631 102 631 q 144 621 132 631 l 272 492 l 400 619 q 423 631 412 631 q 472 601 441 631 q 503 553 503 571 z \"},\"\\u2074\":{ha:552,x_min:26,x_max:526,o:\"m 526 379 q 467 372 526 372 q 450 357 450 372 q 452 316 450 344 q 455 274 455 288 q 376 259 455 259 q 290 269 290 259 q 296 315 290 284 q 301 361 301 346 q 293 372 301 372 q 175 369 254 372 q 56 367 96 367 q 28 393 33 367 q 26 437 26 401 q 35 493 26 483 q 171 659 96 559 q 297 831 234 745 q 313 842 304 842 q 441 817 367 842 q 457 800 457 812 q 453 729 457 777 q 450 659 450 682 q 449 589 450 638 q 448 520 448 545 l 448 484 q 483 486 460 484 q 517 488 506 488 q 526 480 526 488 q 526 429 526 463 q 526 379 526 396 m 317 701 l 317 704 q 224 578 302 678 q 149 484 186 532 q 192 479 152 479 q 306 481 262 479 q 313 574 307 510 q 319 667 319 634 q 317 701 319 685 z \"},\"\\u20AC\":{ha:642,x_min:43,x_max:595,o:\"m 595 4 q 583 -15 595 -11 q 521 -22 561 -22 q 283 51 387 -22 q 135 251 178 124 q 57 249 89 249 q 44 259 44 249 q 50 359 44 334 q 62 368 52 368 q 111 368 85 368 q 110 409 110 388 q 112 452 110 431 q 57 452 81 452 q 43 466 43 452 q 50 566 43 538 q 64 576 52 576 q 140 575 96 576 q 292 766 186 695 q 523 836 396 836 q 576 831 549 836 q 588 820 588 828 q 587 797 588 820 q 585 758 585 773 q 586 725 585 748 q 587 700 587 703 q 574 688 587 686 q 523 694 528 694 q 302 570 375 694 q 426 572 343 570 q 550 574 509 574 q 562 562 562 574 q 554 458 562 509 q 547 450 553 450 q 414 453 503 450 q 279 457 325 457 l 264 457 q 261 409 261 433 q 264 363 261 385 q 301 363 284 363 q 427 365 343 363 q 553 367 511 367 q 563 356 563 367 q 555 256 563 347 q 547 248 553 248 l 541 249 q 296 256 411 256 q 529 118 369 118 q 587 124 562 118 q 595 115 595 126 q 594 89 595 111 q 593 60 593 68 q 594 32 593 54 q 595 4 595 10 z \"}},familyName:\"Berlin Sans FB\",ascender:1244,descender:-282,underlinePosition:-176,underlineThickness:69,boundingBox:{yMin:-282,xMin:-71,yMax:1244,xMax:1492},resolution:1e3,original_font_information:{format:0,copyright:\"Copyright (c) 1997 The Font Bureau, Inc. All rights reserved. Designed by David Berlow.\",fontFamily:\"Berlin Sans FB\",fontSubfamily:\"Regular\",uniqueID:\"FB Berlin Sans FB Regular\",fullName:\"Berlin Sans FB\",version:\"Version 1.00\",postScriptName:\"BerlinSansFB-Reg\",trademark:\"Copyright (c) 1985, 1987, 1988, 1989 The Font Bureau, Inc. All rights reserved. Berlin Sans is a trademark of The Font Bureau, Inc.\",manufacturer:\"The Font Bureau, Inc.\",designer:\"David Berlow\",description:\"Berlin Sans is based on a brilliant alphabet from the late twenties, the first sans that Lucian Bernhard ever designed, imaginative and little-known. Assisted by Matthew Butterick, David Berlow expanded the single font into a series of four weights, all four complete with Expert character sets, plus one dingbat font.\",manufacturerURL:\"http://www.fontbureau.com\",designerURL:\"http://www.fontbureau.com/designers/\"},cssFontWeight:\"normal\",cssFontStyle:\"normal\"};String.prototype.codePointAt||function(){var e=function(){try{var r={},n=Object.defineProperty,i=n(r,r,r)&&n}catch{}return i}(),t=function(r){if(this==null)throw TypeError();var n=String(this),i=n.length,s=r?Number(r):0;if(s!=s&&(s=0),!(s<0||s>=i)){var o=n.charCodeAt(s),a;return o>=55296&&o<=56319&&i>s+1&&(a=n.charCodeAt(s+1),a>=56320&&a<=57343)?(o-55296)*1024+a-56320+65536:o}};e?e(String.prototype,\"codePointAt\",{value:t,configurable:!0,writable:!0}):String.prototype.codePointAt=t}();var to=0,v2=-3;function Kr(){this.table=new Uint16Array(16),this.trans=new Uint16Array(288)}function A5(e,t){this.source=e,this.sourceIndex=0,this.tag=0,this.bitcount=0,this.dest=t,this.destLen=0,this.ltree=new Kr,this.dtree=new Kr}var g2=new Kr,x2=new Kr,ro=new Uint8Array(30),no=new Uint16Array(30),y2=new Uint8Array(30),b2=new Uint16Array(30),C5=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ia=new Kr,We=new Uint8Array(320);function S2(e,t,r,n){var i,s;for(i=0;i<r;++i)e[i]=0;for(i=0;i<30-r;++i)e[i+r]=i/r|0;for(s=n,i=0;i<30;++i)t[i]=s,s+=1<<e[i]}function F5(e,t){var r;for(r=0;r<7;++r)e.table[r]=0;for(e.table[7]=24,e.table[8]=152,e.table[9]=112,r=0;r<24;++r)e.trans[r]=256+r;for(r=0;r<144;++r)e.trans[24+r]=r;for(r=0;r<8;++r)e.trans[168+r]=280+r;for(r=0;r<112;++r)e.trans[176+r]=144+r;for(r=0;r<5;++r)t.table[r]=0;for(t.table[5]=32,r=0;r<32;++r)t.trans[r]=r}var Ba=new Uint16Array(16);function Ds(e,t,r,n){var i,s;for(i=0;i<16;++i)e.table[i]=0;for(i=0;i<n;++i)e.table[t[r+i]]++;for(e.table[0]=0,s=0,i=0;i<16;++i)Ba[i]=s,s+=e.table[i];for(i=0;i<n;++i)t[r+i]&&(e.trans[Ba[t[r+i]]++]=i)}function M5(e){e.bitcount--||(e.tag=e.source[e.sourceIndex++],e.bitcount=7);var t=e.tag&1;return e.tag>>>=1,t}function Xe(e,t,r){if(!t)return r;for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<<e.bitcount,e.bitcount+=8;var n=e.tag&65535>>>16-t;return e.tag>>>=t,e.bitcount-=t,n+r}function Xs(e,t){for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<<e.bitcount,e.bitcount+=8;var r=0,n=0,i=0,s=e.tag;do n=2*n+(s&1),s>>>=1,++i,r+=t.table[i],n-=t.table[i];while(n>=0);return e.tag=s,e.bitcount-=i,t.trans[r+n]}function k5(e,t,r){var n,i,s,o,a,l;for(n=Xe(e,5,257),i=Xe(e,5,1),s=Xe(e,4,4),o=0;o<19;++o)We[o]=0;for(o=0;o<s;++o){var u=Xe(e,3,0);We[C5[o]]=u}for(Ds(Ia,We,0,19),a=0;a<n+i;){var c=Xs(e,Ia);switch(c){case 16:var f=We[a-1];for(l=Xe(e,2,3);l;--l)We[a++]=f;break;case 17:for(l=Xe(e,3,3);l;--l)We[a++]=0;break;case 18:for(l=Xe(e,7,11);l;--l)We[a++]=0;break;default:We[a++]=c;break}}Ds(t,We,0,n),Ds(r,We,n,i)}function Ra(e,t,r){for(;;){var n=Xs(e,t);if(n===256)return to;if(n<256)e.dest[e.destLen++]=n;else{var i,s,o,a;for(n-=257,i=Xe(e,ro[n],no[n]),s=Xs(e,r),o=e.destLen-Xe(e,y2[s],b2[s]),a=o;a<o+i;++a)e.dest[e.destLen++]=e.dest[a]}}}function I5(e){for(var t,r,n;e.bitcount>8;)e.sourceIndex--,e.bitcount-=8;if(t=e.source[e.sourceIndex+1],t=256*t+e.source[e.sourceIndex],r=e.source[e.sourceIndex+3],r=256*r+e.source[e.sourceIndex+2],t!==(~r&65535))return v2;for(e.sourceIndex+=4,n=t;n;--n)e.dest[e.destLen++]=e.source[e.sourceIndex++];return e.bitcount=0,to}function B5(e,t){var r=new A5(e,t),n,i,s;do{switch(n=M5(r),i=Xe(r,2,0),i){case 0:s=I5(r);break;case 1:s=Ra(r,g2,x2);break;case 2:k5(r,r.ltree,r.dtree),s=Ra(r,r.ltree,r.dtree);break;default:s=v2}if(s!==to)throw new Error(\"Data error\")}while(!n);return r.destLen<r.dest.length?typeof r.dest.slice==\"function\"?r.dest.slice(0,r.destLen):r.dest.subarray(0,r.destLen):r.dest}F5(g2,x2);S2(ro,no,4,3);S2(y2,b2,2,1);ro[28]=0;no[28]=258;var R5=B5;function qr(e,t,r,n,i){return Math.pow(1-i,3)*e+3*Math.pow(1-i,2)*i*t+3*(1-i)*Math.pow(i,2)*r+Math.pow(i,3)*n}function st(){this.x1=Number.NaN,this.y1=Number.NaN,this.x2=Number.NaN,this.y2=Number.NaN}st.prototype.isEmpty=function(){return isNaN(this.x1)||isNaN(this.y1)||isNaN(this.x2)||isNaN(this.y2)};st.prototype.addPoint=function(e,t){typeof e==\"number\"&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=e,this.x2=e),e<this.x1&&(this.x1=e),e>this.x2&&(this.x2=e)),typeof t==\"number\"&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=t,this.y2=t),t<this.y1&&(this.y1=t),t>this.y2&&(this.y2=t))};st.prototype.addX=function(e){this.addPoint(e,null)};st.prototype.addY=function(e){this.addPoint(null,e)};st.prototype.addBezier=function(e,t,r,n,i,s,o,a){var l=[e,t],u=[r,n],c=[i,s],f=[o,a];this.addPoint(e,t),this.addPoint(o,a);for(var q=0;q<=1;q++){var p=6*l[q]-12*u[q]+6*c[q],d=-3*l[q]+9*u[q]-9*c[q]+3*f[q],v=3*u[q]-3*l[q];if(d===0){if(p===0)continue;var m=-v/p;0<m&&m<1&&(q===0&&this.addX(qr(l[q],u[q],c[q],f[q],m)),q===1&&this.addY(qr(l[q],u[q],c[q],f[q],m)));continue}var h=Math.pow(p,2)-4*v*d;if(!(h<0)){var g=(-p+Math.sqrt(h))/(2*d);0<g&&g<1&&(q===0&&this.addX(qr(l[q],u[q],c[q],f[q],g)),q===1&&this.addY(qr(l[q],u[q],c[q],f[q],g)));var x=(-p-Math.sqrt(h))/(2*d);0<x&&x<1&&(q===0&&this.addX(qr(l[q],u[q],c[q],f[q],x)),q===1&&this.addY(qr(l[q],u[q],c[q],f[q],x)))}}};st.prototype.addQuad=function(e,t,r,n,i,s){var o=e+.6666666666666666*(r-e),a=t+2/3*(n-t),l=o+1/3*(i-e),u=a+1/3*(s-t);this.addBezier(e,t,o,a,l,u,i,s)};function pe(){this.commands=[],this.fill=\"black\",this.stroke=null,this.strokeWidth=1}pe.prototype.moveTo=function(e,t){this.commands.push({type:\"M\",x:e,y:t})};pe.prototype.lineTo=function(e,t){this.commands.push({type:\"L\",x:e,y:t})};pe.prototype.curveTo=pe.prototype.bezierCurveTo=function(e,t,r,n,i,s){this.commands.push({type:\"C\",x1:e,y1:t,x2:r,y2:n,x:i,y:s})};pe.prototype.quadTo=pe.prototype.quadraticCurveTo=function(e,t,r,n){this.commands.push({type:\"Q\",x1:e,y1:t,x:r,y:n})};pe.prototype.close=pe.prototype.closePath=function(){this.commands.push({type:\"Z\"})};pe.prototype.extend=function(e){if(e.commands)e=e.commands;else if(e instanceof st){var t=e;this.moveTo(t.x1,t.y1),this.lineTo(t.x2,t.y1),this.lineTo(t.x2,t.y2),this.lineTo(t.x1,t.y2),this.close();return}Array.prototype.push.apply(this.commands,e)};pe.prototype.getBoundingBox=function(){for(var e=new st,t=0,r=0,n=0,i=0,s=0;s<this.commands.length;s++){var o=this.commands[s];switch(o.type){case\"M\":e.addPoint(o.x,o.y),t=n=o.x,r=i=o.y;break;case\"L\":e.addPoint(o.x,o.y),n=o.x,i=o.y;break;case\"Q\":e.addQuad(n,i,o.x1,o.y1,o.x,o.y),n=o.x,i=o.y;break;case\"C\":e.addBezier(n,i,o.x1,o.y1,o.x2,o.y2,o.x,o.y),n=o.x,i=o.y;break;case\"Z\":n=t,i=r;break;default:throw new Error(\"Unexpected path command \"+o.type)}}return e.isEmpty()&&e.addPoint(0,0),e};pe.prototype.draw=function(e){e.beginPath();for(var t=0;t<this.commands.length;t+=1){var r=this.commands[t];r.type===\"M\"?e.moveTo(r.x,r.y):r.type===\"L\"?e.lineTo(r.x,r.y):r.type===\"C\"?e.bezierCurveTo(r.x1,r.y1,r.x2,r.y2,r.x,r.y):r.type===\"Q\"?e.quadraticCurveTo(r.x1,r.y1,r.x,r.y):r.type===\"Z\"&&e.closePath()}this.fill&&(e.fillStyle=this.fill,e.fill()),this.stroke&&(e.strokeStyle=this.stroke,e.lineWidth=this.strokeWidth,e.stroke())};pe.prototype.toPathData=function(e){e=e!==void 0?e:2;function t(o){return Math.round(o)===o?\"\"+Math.round(o):o.toFixed(e)}function r(){for(var o=arguments,a=\"\",l=0;l<arguments.length;l+=1){var u=o[l];u>=0&&l>0&&(a+=\" \"),a+=t(u)}return a}for(var n=\"\",i=0;i<this.commands.length;i+=1){var s=this.commands[i];s.type===\"M\"?n+=\"M\"+r(s.x,s.y):s.type===\"L\"?n+=\"L\"+r(s.x,s.y):s.type===\"C\"?n+=\"C\"+r(s.x1,s.y1,s.x2,s.y2,s.x,s.y):s.type===\"Q\"?n+=\"Q\"+r(s.x1,s.y1,s.x,s.y):s.type===\"Z\"&&(n+=\"Z\")}return n};pe.prototype.toSVG=function(e){var t='<path d=\"';return t+=this.toPathData(e),t+='\"',this.fill&&this.fill!==\"black\"&&(this.fill===null?t+=' fill=\"none\"':t+=' fill=\"'+this.fill+'\"'),this.stroke&&(t+=' stroke=\"'+this.stroke+'\" stroke-width=\"'+this.strokeWidth+'\"'),t+=\"/>\",t};pe.prototype.toDOMElement=function(e){var t=this.toPathData(e),r=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");return r.setAttribute(\"d\",t),r};function T2(e){throw new Error(e)}function Ua(e,t){e||T2(t)}var N={fail:T2,argument:Ua,assert:Ua},Oa=32768,Da=2147483648,pr={},R={},z={};function Ne(e){return function(){return e}}R.BYTE=function(e){return N.argument(e>=0&&e<=255,\"Byte value should be between 0 and 255.\"),[e]};z.BYTE=Ne(1);R.CHAR=function(e){return[e.charCodeAt(0)]};z.CHAR=Ne(1);R.CHARARRAY=function(e){typeof e>\"u\"&&(e=\"\",console.warn(\"Undefined CHARARRAY encountered and treated as an empty string. This is probably caused by a missing glyph name.\"));for(var t=[],r=0;r<e.length;r+=1)t[r]=e.charCodeAt(r);return t};z.CHARARRAY=function(e){return typeof e>\"u\"?0:e.length};R.USHORT=function(e){return[e>>8&255,e&255]};z.USHORT=Ne(2);R.SHORT=function(e){return e>=Oa&&(e=-(2*Oa-e)),[e>>8&255,e&255]};z.SHORT=Ne(2);R.UINT24=function(e){return[e>>16&255,e>>8&255,e&255]};z.UINT24=Ne(3);R.ULONG=function(e){return[e>>24&255,e>>16&255,e>>8&255,e&255]};z.ULONG=Ne(4);R.LONG=function(e){return e>=Da&&(e=-(2*Da-e)),[e>>24&255,e>>16&255,e>>8&255,e&255]};z.LONG=Ne(4);R.FIXED=R.ULONG;z.FIXED=z.ULONG;R.FWORD=R.SHORT;z.FWORD=z.SHORT;R.UFWORD=R.USHORT;z.UFWORD=z.USHORT;R.LONGDATETIME=function(e){return[0,0,0,0,e>>24&255,e>>16&255,e>>8&255,e&255]};z.LONGDATETIME=Ne(8);R.TAG=function(e){return N.argument(e.length===4,\"Tag should be exactly 4 ASCII characters.\"),[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]};z.TAG=Ne(4);R.Card8=R.BYTE;z.Card8=z.BYTE;R.Card16=R.USHORT;z.Card16=z.USHORT;R.OffSize=R.BYTE;z.OffSize=z.BYTE;R.SID=R.USHORT;z.SID=z.USHORT;R.NUMBER=function(e){return e>=-107&&e<=107?[e+139]:e>=108&&e<=1131?(e=e-108,[(e>>8)+247,e&255]):e>=-1131&&e<=-108?(e=-e-108,[(e>>8)+251,e&255]):e>=-32768&&e<=32767?R.NUMBER16(e):R.NUMBER32(e)};z.NUMBER=function(e){return R.NUMBER(e).length};R.NUMBER16=function(e){return[28,e>>8&255,e&255]};z.NUMBER16=Ne(3);R.NUMBER32=function(e){return[29,e>>24&255,e>>16&255,e>>8&255,e&255]};z.NUMBER32=Ne(5);R.REAL=function(e){var t=e.toString(),r=/\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(t);if(r){var n=parseFloat(\"1e\"+((r[2]?+r[2]:0)+r[1].length));t=(Math.round(e*n)/n).toString()}for(var i=\"\",s=0,o=t.length;s<o;s+=1){var a=t[s];a===\"e\"?i+=t[++s]===\"-\"?\"c\":\"b\":a===\".\"?i+=\"a\":a===\"-\"?i+=\"e\":i+=a}i+=i.length&1?\"f\":\"ff\";for(var l=[30],u=0,c=i.length;u<c;u+=2)l.push(parseInt(i.substr(u,2),16));return l};z.REAL=function(e){return R.REAL(e).length};R.NAME=R.CHARARRAY;z.NAME=z.CHARARRAY;R.STRING=R.CHARARRAY;z.STRING=z.CHARARRAY;pr.UTF8=function(e,t,r){for(var n=[],i=r,s=0;s<i;s++,t+=1)n[s]=e.getUint8(t);return String.fromCharCode.apply(null,n)};pr.UTF16=function(e,t,r){for(var n=[],i=r/2,s=0;s<i;s++,t+=2)n[s]=e.getUint16(t);return String.fromCharCode.apply(null,n)};R.UTF16=function(e){for(var t=[],r=0;r<e.length;r+=1){var n=e.charCodeAt(r);t[t.length]=n>>8&255,t[t.length]=n&255}return t};z.UTF16=function(e){return e.length*2};var js={\"x-mac-croatian\":\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\u2020\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\u0160\\u2122\\xB4\\xA8\\u2260\\u017D\\xD8\\u221E\\xB1\\u2264\\u2265\\u2206\\xB5\\u2202\\u2211\\u220F\\u0161\\u222B\\xAA\\xBA\\u03A9\\u017E\\xF8\\xBF\\xA1\\xAC\\u221A\\u0192\\u2248\\u0106\\xAB\\u010C\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u0110\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\uF8FF\\xA9\\u2044\\u20AC\\u2039\\u203A\\xC6\\xBB\\u2013\\xB7\\u201A\\u201E\\u2030\\xC2\\u0107\\xC1\\u010D\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\u0111\\xD2\\xDA\\xDB\\xD9\\u0131\\u02C6\\u02DC\\xAF\\u03C0\\xCB\\u02DA\\xB8\\xCA\\xE6\\u02C7\",\"x-mac-cyrillic\":\"\\u0410\\u0411\\u0412\\u0413\\u0414\\u0415\\u0416\\u0417\\u0418\\u0419\\u041A\\u041B\\u041C\\u041D\\u041E\\u041F\\u0420\\u0421\\u0422\\u0423\\u0424\\u0425\\u0426\\u0427\\u0428\\u0429\\u042A\\u042B\\u042C\\u042D\\u042E\\u042F\\u2020\\xB0\\u0490\\xA3\\xA7\\u2022\\xB6\\u0406\\xAE\\xA9\\u2122\\u0402\\u0452\\u2260\\u0403\\u0453\\u221E\\xB1\\u2264\\u2265\\u0456\\xB5\\u0491\\u0408\\u0404\\u0454\\u0407\\u0457\\u0409\\u0459\\u040A\\u045A\\u0458\\u0405\\xAC\\u221A\\u0192\\u2248\\u2206\\xAB\\xBB\\u2026\\xA0\\u040B\\u045B\\u040C\\u045C\\u0455\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u201E\\u040E\\u045E\\u040F\\u045F\\u2116\\u0401\\u0451\\u044F\\u0430\\u0431\\u0432\\u0433\\u0434\\u0435\\u0436\\u0437\\u0438\\u0439\\u043A\\u043B\\u043C\\u043D\\u043E\\u043F\\u0440\\u0441\\u0442\\u0443\\u0444\\u0445\\u0446\\u0447\\u0448\\u0449\\u044A\\u044B\\u044C\\u044D\\u044E\",\"x-mac-gaelic\":\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\u2020\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\xB4\\xA8\\u2260\\xC6\\xD8\\u1E02\\xB1\\u2264\\u2265\\u1E03\\u010A\\u010B\\u1E0A\\u1E0B\\u1E1E\\u1E1F\\u0120\\u0121\\u1E40\\xE6\\xF8\\u1E41\\u1E56\\u1E57\\u027C\\u0192\\u017F\\u1E60\\xAB\\xBB\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\u1E61\\u1E9B\\xFF\\u0178\\u1E6A\\u20AC\\u2039\\u203A\\u0176\\u0177\\u1E6B\\xB7\\u1EF2\\u1EF3\\u204A\\xC2\\xCA\\xC1\\xCB\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\u2663\\xD2\\xDA\\xDB\\xD9\\u0131\\xDD\\xFD\\u0174\\u0175\\u1E84\\u1E85\\u1E80\\u1E81\\u1E82\\u1E83\",\"x-mac-greek\":\"\\xC4\\xB9\\xB2\\xC9\\xB3\\xD6\\xDC\\u0385\\xE0\\xE2\\xE4\\u0384\\xA8\\xE7\\xE9\\xE8\\xEA\\xEB\\xA3\\u2122\\xEE\\xEF\\u2022\\xBD\\u2030\\xF4\\xF6\\xA6\\u20AC\\xF9\\xFB\\xFC\\u2020\\u0393\\u0394\\u0398\\u039B\\u039E\\u03A0\\xDF\\xAE\\xA9\\u03A3\\u03AA\\xA7\\u2260\\xB0\\xB7\\u0391\\xB1\\u2264\\u2265\\xA5\\u0392\\u0395\\u0396\\u0397\\u0399\\u039A\\u039C\\u03A6\\u03AB\\u03A8\\u03A9\\u03AC\\u039D\\xAC\\u039F\\u03A1\\u2248\\u03A4\\xAB\\xBB\\u2026\\xA0\\u03A5\\u03A7\\u0386\\u0388\\u0153\\u2013\\u2015\\u201C\\u201D\\u2018\\u2019\\xF7\\u0389\\u038A\\u038C\\u038E\\u03AD\\u03AE\\u03AF\\u03CC\\u038F\\u03CD\\u03B1\\u03B2\\u03C8\\u03B4\\u03B5\\u03C6\\u03B3\\u03B7\\u03B9\\u03BE\\u03BA\\u03BB\\u03BC\\u03BD\\u03BF\\u03C0\\u03CE\\u03C1\\u03C3\\u03C4\\u03B8\\u03C9\\u03C2\\u03C7\\u03C5\\u03B6\\u03CA\\u03CB\\u0390\\u03B0\\xAD\",\"x-mac-icelandic\":\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\xDD\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\xB4\\xA8\\u2260\\xC6\\xD8\\u221E\\xB1\\u2264\\u2265\\xA5\\xB5\\u2202\\u2211\\u220F\\u03C0\\u222B\\xAA\\xBA\\u03A9\\xE6\\xF8\\xBF\\xA1\\xAC\\u221A\\u0192\\u2248\\u2206\\xAB\\xBB\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\xFF\\u0178\\u2044\\u20AC\\xD0\\xF0\\xDE\\xFE\\xFD\\xB7\\u201A\\u201E\\u2030\\xC2\\xCA\\xC1\\xCB\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\uF8FF\\xD2\\xDA\\xDB\\xD9\\u0131\\u02C6\\u02DC\\xAF\\u02D8\\u02D9\\u02DA\\xB8\\u02DD\\u02DB\\u02C7\",\"x-mac-inuit\":\"\\u1403\\u1404\\u1405\\u1406\\u140A\\u140B\\u1431\\u1432\\u1433\\u1434\\u1438\\u1439\\u1449\\u144E\\u144F\\u1450\\u1451\\u1455\\u1456\\u1466\\u146D\\u146E\\u146F\\u1470\\u1472\\u1473\\u1483\\u148B\\u148C\\u148D\\u148E\\u1490\\u1491\\xB0\\u14A1\\u14A5\\u14A6\\u2022\\xB6\\u14A7\\xAE\\xA9\\u2122\\u14A8\\u14AA\\u14AB\\u14BB\\u14C2\\u14C3\\u14C4\\u14C5\\u14C7\\u14C8\\u14D0\\u14EF\\u14F0\\u14F1\\u14F2\\u14F4\\u14F5\\u1505\\u14D5\\u14D6\\u14D7\\u14D8\\u14DA\\u14DB\\u14EA\\u1528\\u1529\\u152A\\u152B\\u152D\\u2026\\xA0\\u152E\\u153E\\u1555\\u1556\\u1557\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\u1558\\u1559\\u155A\\u155D\\u1546\\u1547\\u1548\\u1549\\u154B\\u154C\\u1550\\u157F\\u1580\\u1581\\u1582\\u1583\\u1584\\u1585\\u158F\\u1590\\u1591\\u1592\\u1593\\u1594\\u1595\\u1671\\u1672\\u1673\\u1674\\u1675\\u1676\\u1596\\u15A0\\u15A1\\u15A2\\u15A3\\u15A4\\u15A5\\u15A6\\u157C\\u0141\\u0142\",\"x-mac-ce\":\"\\xC4\\u0100\\u0101\\xC9\\u0104\\xD6\\xDC\\xE1\\u0105\\u010C\\xE4\\u010D\\u0106\\u0107\\xE9\\u0179\\u017A\\u010E\\xED\\u010F\\u0112\\u0113\\u0116\\xF3\\u0117\\xF4\\xF6\\xF5\\xFA\\u011A\\u011B\\xFC\\u2020\\xB0\\u0118\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\u0119\\xA8\\u2260\\u0123\\u012E\\u012F\\u012A\\u2264\\u2265\\u012B\\u0136\\u2202\\u2211\\u0142\\u013B\\u013C\\u013D\\u013E\\u0139\\u013A\\u0145\\u0146\\u0143\\xAC\\u221A\\u0144\\u0147\\u2206\\xAB\\xBB\\u2026\\xA0\\u0148\\u0150\\xD5\\u0151\\u014C\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\u014D\\u0154\\u0155\\u0158\\u2039\\u203A\\u0159\\u0156\\u0157\\u0160\\u201A\\u201E\\u0161\\u015A\\u015B\\xC1\\u0164\\u0165\\xCD\\u017D\\u017E\\u016A\\xD3\\xD4\\u016B\\u016E\\xDA\\u016F\\u0170\\u0171\\u0172\\u0173\\xDD\\xFD\\u0137\\u017B\\u0141\\u017C\\u0122\\u02C7\",macintosh:\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\u2020\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\xB4\\xA8\\u2260\\xC6\\xD8\\u221E\\xB1\\u2264\\u2265\\xA5\\xB5\\u2202\\u2211\\u220F\\u03C0\\u222B\\xAA\\xBA\\u03A9\\xE6\\xF8\\xBF\\xA1\\xAC\\u221A\\u0192\\u2248\\u2206\\xAB\\xBB\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\xFF\\u0178\\u2044\\u20AC\\u2039\\u203A\\uFB01\\uFB02\\u2021\\xB7\\u201A\\u201E\\u2030\\xC2\\xCA\\xC1\\xCB\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\uF8FF\\xD2\\xDA\\xDB\\xD9\\u0131\\u02C6\\u02DC\\xAF\\u02D8\\u02D9\\u02DA\\xB8\\u02DD\\u02DB\\u02C7\",\"x-mac-romanian\":\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\u2020\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\xB4\\xA8\\u2260\\u0102\\u0218\\u221E\\xB1\\u2264\\u2265\\xA5\\xB5\\u2202\\u2211\\u220F\\u03C0\\u222B\\xAA\\xBA\\u03A9\\u0103\\u0219\\xBF\\xA1\\xAC\\u221A\\u0192\\u2248\\u2206\\xAB\\xBB\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\xFF\\u0178\\u2044\\u20AC\\u2039\\u203A\\u021A\\u021B\\u2021\\xB7\\u201A\\u201E\\u2030\\xC2\\xCA\\xC1\\xCB\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\uF8FF\\xD2\\xDA\\xDB\\xD9\\u0131\\u02C6\\u02DC\\xAF\\u02D8\\u02D9\\u02DA\\xB8\\u02DD\\u02DB\\u02C7\",\"x-mac-turkish\":\"\\xC4\\xC5\\xC7\\xC9\\xD1\\xD6\\xDC\\xE1\\xE0\\xE2\\xE4\\xE3\\xE5\\xE7\\xE9\\xE8\\xEA\\xEB\\xED\\xEC\\xEE\\xEF\\xF1\\xF3\\xF2\\xF4\\xF6\\xF5\\xFA\\xF9\\xFB\\xFC\\u2020\\xB0\\xA2\\xA3\\xA7\\u2022\\xB6\\xDF\\xAE\\xA9\\u2122\\xB4\\xA8\\u2260\\xC6\\xD8\\u221E\\xB1\\u2264\\u2265\\xA5\\xB5\\u2202\\u2211\\u220F\\u03C0\\u222B\\xAA\\xBA\\u03A9\\xE6\\xF8\\xBF\\xA1\\xAC\\u221A\\u0192\\u2248\\u2206\\xAB\\xBB\\u2026\\xA0\\xC0\\xC3\\xD5\\u0152\\u0153\\u2013\\u2014\\u201C\\u201D\\u2018\\u2019\\xF7\\u25CA\\xFF\\u0178\\u011E\\u011F\\u0130\\u0131\\u015E\\u015F\\u2021\\xB7\\u201A\\u201E\\u2030\\xC2\\xCA\\xC1\\xCB\\xC8\\xCD\\xCE\\xCF\\xCC\\xD3\\xD4\\uF8FF\\xD2\\xDA\\xDB\\xD9\\uF8A0\\u02C6\\u02DC\\xAF\\u02D8\\u02D9\\u02DA\\xB8\\u02DD\\u02DB\\u02C7\"};pr.MACSTRING=function(e,t,r,n){var i=js[n];if(i!==void 0){for(var s=\"\",o=0;o<r;o++){var a=e.getUint8(t+o);a<=127?s+=String.fromCharCode(a):s+=i[a&127]}return s}};var qi=typeof WeakMap==\"function\"&&new WeakMap,fi,U5=function(e){if(!fi){fi={};for(var t in js)fi[t]=new String(t)}var r=fi[e];if(r!==void 0){if(qi){var n=qi.get(r);if(n!==void 0)return n}var i=js[e];if(i!==void 0){for(var s={},o=0;o<i.length;o++)s[i.charCodeAt(o)]=o+128;return qi&&qi.set(r,s),s}}};R.MACSTRING=function(e,t){var r=U5(t);if(r!==void 0){for(var n=[],i=0;i<e.length;i++){var s=e.charCodeAt(i);if(s>=128&&(s=r[s],s===void 0))return;n[i]=s}return n}};z.MACSTRING=function(e,t){var r=R.MACSTRING(e,t);return r!==void 0?r.length:0};function Ys(e){return e>=-128&&e<=127}function O5(e,t,r){for(var n=0,i=e.length;t<i&&n<64&&e[t]===0;)++t,++n;return r.push(128|n-1),t}function D5(e,t,r){for(var n=0,i=e.length,s=t;s<i&&n<64;){var o=e[s];if(!Ys(o)||o===0&&s+1<i&&e[s+1]===0)break;++s,++n}r.push(n-1);for(var a=t;a<s;++a)r.push(e[a]+256&255);return s}function L5(e,t,r){for(var n=0,i=e.length,s=t;s<i&&n<64;){var o=e[s];if(o===0||Ys(o)&&s+1<i&&Ys(e[s+1]))break;++s,++n}r.push(64|n-1);for(var a=t;a<s;++a){var l=e[a];r.push(l+65536>>8&255,l+256&255)}return s}R.VARDELTAS=function(e){for(var t=0,r=[];t<e.length;){var n=e[t];n===0?t=O5(e,t,r):n>=-128&&n<=127?t=D5(e,t,r):t=L5(e,t,r)}return r};R.INDEX=function(e){for(var t=1,r=[t],n=[],i=0;i<e.length;i+=1){var s=R.OBJECT(e[i]);Array.prototype.push.apply(n,s),t+=s.length,r.push(t)}if(n.length===0)return[0,0];for(var o=[],a=1+Math.floor(Math.log(t)/Math.log(2))/8|0,l=[void 0,R.BYTE,R.USHORT,R.UINT24,R.ULONG][a],u=0;u<r.length;u+=1){var c=l(r[u]);Array.prototype.push.apply(o,c)}return Array.prototype.concat(R.Card16(e.length),R.OffSize(a),o,n)};z.INDEX=function(e){return R.INDEX(e).length};R.DICT=function(e){for(var t=[],r=Object.keys(e),n=r.length,i=0;i<n;i+=1){var s=parseInt(r[i],0),o=e[s];t=t.concat(R.OPERAND(o.value,o.type)),t=t.concat(R.OPERATOR(s))}return t};z.DICT=function(e){return R.DICT(e).length};R.OPERATOR=function(e){return e<1200?[e]:[12,e-1200]};R.OPERAND=function(e,t){var r=[];if(Array.isArray(t))for(var n=0;n<t.length;n+=1)N.argument(e.length===t.length,\"Not enough arguments given for type\"+t),r=r.concat(R.OPERAND(e[n],t[n]));else if(t===\"SID\")r=r.concat(R.NUMBER(e));else if(t===\"offset\")r=r.concat(R.NUMBER32(e));else if(t===\"number\")r=r.concat(R.NUMBER(e));else if(t===\"real\")r=r.concat(R.REAL(e));else throw new Error(\"Unknown operand type \"+t);return r};R.OP=R.BYTE;z.OP=z.BYTE;var pi=typeof WeakMap==\"function\"&&new WeakMap;R.CHARSTRING=function(e){if(pi){var t=pi.get(e);if(t!==void 0)return t}for(var r=[],n=e.length,i=0;i<n;i+=1){var s=e[i];r=r.concat(R[s.type](s.value))}return pi&&pi.set(e,r),r};z.CHARSTRING=function(e){return R.CHARSTRING(e).length};R.OBJECT=function(e){var t=R[e.type];return N.argument(t!==void 0,\"No encoding function for type \"+e.type),t(e.value)};z.OBJECT=function(e){var t=z[e.type];return N.argument(t!==void 0,\"No sizeOf function for type \"+e.type),t(e.value)};R.TABLE=function(e){for(var t=[],r=e.fields.length,n=[],i=[],s=0;s<r;s+=1){var o=e.fields[s],a=R[o.type];N.argument(a!==void 0,\"No encoding function for field type \"+o.type+\" (\"+o.name+\")\");var l=e[o.name];l===void 0&&(l=o.value);var u=a(l);o.type===\"TABLE\"?(i.push(t.length),t=t.concat([0,0]),n.push(u)):t=t.concat(u)}for(var c=0;c<n.length;c+=1){var f=i[c],q=t.length;N.argument(q<65536,\"Table \"+e.tableName+\" too big.\"),t[f]=q>>8,t[f+1]=q&255,t=t.concat(n[c])}return t};z.TABLE=function(e){for(var t=0,r=e.fields.length,n=0;n<r;n+=1){var i=e.fields[n],s=z[i.type];N.argument(s!==void 0,\"No sizeOf function for field type \"+i.type+\" (\"+i.name+\")\");var o=e[i.name];o===void 0&&(o=i.value),t+=s(o),i.type===\"TABLE\"&&(t+=2)}return t};R.RECORD=R.TABLE;z.RECORD=z.TABLE;R.LITERAL=function(e){return e};z.LITERAL=function(e){return e.length};function ve(e,t,r){if(t.length&&(t[0].name!==\"coverageFormat\"||t[0].value===1))for(var n=0;n<t.length;n+=1){var i=t[n];this[i.name]=i.value}if(this.tableName=e,this.fields=t,r)for(var s=Object.keys(r),o=0;o<s.length;o+=1){var a=s[o],l=r[a];this[a]!==void 0&&(this[a]=l)}}ve.prototype.encode=function(){return R.TABLE(this)};ve.prototype.sizeOf=function(){return z.TABLE(this)};function Zr(e,t,r){r===void 0&&(r=t.length);var n=new Array(t.length+1);n[0]={name:e+\"Count\",type:\"USHORT\",value:r};for(var i=0;i<t.length;i++)n[i+1]={name:e+i,type:\"USHORT\",value:t[i]};return n}function Ks(e,t,r){var n=t.length,i=new Array(n+1);i[0]={name:e+\"Count\",type:\"USHORT\",value:n};for(var s=0;s<n;s++)i[s+1]={name:e+s,type:\"TABLE\",value:r(t[s],s)};return i}function Qr(e,t,r){var n=t.length,i=[];i[0]={name:e+\"Count\",type:\"USHORT\",value:n};for(var s=0;s<n;s++)i=i.concat(r(t[s],s));return i}function gi(e){e.format===1?ve.call(this,\"coverageTable\",[{name:\"coverageFormat\",type:\"USHORT\",value:1}].concat(Zr(\"glyph\",e.glyphs))):e.format===2?ve.call(this,\"coverageTable\",[{name:\"coverageFormat\",type:\"USHORT\",value:2}].concat(Qr(\"rangeRecord\",e.ranges,function(t){return[{name:\"startGlyphID\",type:\"USHORT\",value:t.start},{name:\"endGlyphID\",type:\"USHORT\",value:t.end},{name:\"startCoverageIndex\",type:\"USHORT\",value:t.index}]}))):N.assert(!1,\"Coverage format must be 1 or 2.\")}gi.prototype=Object.create(ve.prototype);gi.prototype.constructor=gi;function xi(e){ve.call(this,\"scriptListTable\",Qr(\"scriptRecord\",e,function(t,r){var n=t.script,i=n.defaultLangSys;return N.assert(!!i,\"Unable to write GSUB: script \"+t.tag+\" has no default language system.\"),[{name:\"scriptTag\"+r,type:\"TAG\",value:t.tag},{name:\"script\"+r,type:\"TABLE\",value:new ve(\"scriptTable\",[{name:\"defaultLangSys\",type:\"TABLE\",value:new ve(\"defaultLangSys\",[{name:\"lookupOrder\",type:\"USHORT\",value:0},{name:\"reqFeatureIndex\",type:\"USHORT\",value:i.reqFeatureIndex}].concat(Zr(\"featureIndex\",i.featureIndexes)))}].concat(Qr(\"langSys\",n.langSysRecords,function(s,o){var a=s.langSys;return[{name:\"langSysTag\"+o,type:\"TAG\",value:s.tag},{name:\"langSys\"+o,type:\"TABLE\",value:new ve(\"langSys\",[{name:\"lookupOrder\",type:\"USHORT\",value:0},{name:\"reqFeatureIndex\",type:\"USHORT\",value:a.reqFeatureIndex}].concat(Zr(\"featureIndex\",a.featureIndexes)))}]})))}]}))}xi.prototype=Object.create(ve.prototype);xi.prototype.constructor=xi;function yi(e){ve.call(this,\"featureListTable\",Qr(\"featureRecord\",e,function(t,r){var n=t.feature;return[{name:\"featureTag\"+r,type:\"TAG\",value:t.tag},{name:\"feature\"+r,type:\"TABLE\",value:new ve(\"featureTable\",[{name:\"featureParams\",type:\"USHORT\",value:n.featureParams}].concat(Zr(\"lookupListIndex\",n.lookupListIndexes)))}]}))}yi.prototype=Object.create(ve.prototype);yi.prototype.constructor=yi;function bi(e,t){ve.call(this,\"lookupListTable\",Ks(\"lookup\",e,function(r){var n=t[r.lookupType];return N.assert(!!n,\"Unable to write GSUB lookup type \"+r.lookupType+\" tables.\"),new ve(\"lookupTable\",[{name:\"lookupType\",type:\"USHORT\",value:r.lookupType},{name:\"lookupFlag\",type:\"USHORT\",value:r.lookupFlag}].concat(Ks(\"subtable\",r.subtables,n)))}))}bi.prototype=Object.create(ve.prototype);bi.prototype.constructor=bi;var U={Table:ve,Record:ve,Coverage:gi,ScriptList:xi,FeatureList:yi,LookupList:bi,ushortList:Zr,tableList:Ks,recordList:Qr};function La(e,t){return e.getUint8(t)}function Si(e,t){return e.getUint16(t,!1)}function P5(e,t){return e.getInt16(t,!1)}function io(e,t){return e.getUint32(t,!1)}function _2(e,t){var r=e.getInt16(t,!1),n=e.getUint16(t+2,!1);return r+n/65535}function N5(e,t){for(var r=\"\",n=t;n<t+4;n+=1)r+=String.fromCharCode(e.getInt8(n));return r}function z5(e,t,r){for(var n=0,i=0;i<r;i+=1)n<<=8,n+=e.getUint8(t+i);return n}function G5(e,t,r){for(var n=[],i=t;i<r;i+=1)n.push(e.getUint8(i));return n}function V5(e){for(var t=\"\",r=0;r<e.length;r+=1)t+=String.fromCharCode(e[r]);return t}var H5={byte:1,uShort:2,short:2,uLong:4,fixed:4,longDateTime:8,tag:4};function A(e,t){this.data=e,this.offset=t,this.relativeOffset=0}A.prototype.parseByte=function(){var e=this.data.getUint8(this.offset+this.relativeOffset);return this.relativeOffset+=1,e};A.prototype.parseChar=function(){var e=this.data.getInt8(this.offset+this.relativeOffset);return this.relativeOffset+=1,e};A.prototype.parseCard8=A.prototype.parseByte;A.prototype.parseUShort=function(){var e=this.data.getUint16(this.offset+this.relativeOffset);return this.relativeOffset+=2,e};A.prototype.parseCard16=A.prototype.parseUShort;A.prototype.parseSID=A.prototype.parseUShort;A.prototype.parseOffset16=A.prototype.parseUShort;A.prototype.parseShort=function(){var e=this.data.getInt16(this.offset+this.relativeOffset);return this.relativeOffset+=2,e};A.prototype.parseF2Dot14=function(){var e=this.data.getInt16(this.offset+this.relativeOffset)/16384;return this.relativeOffset+=2,e};A.prototype.parseULong=function(){var e=io(this.data,this.offset+this.relativeOffset);return this.relativeOffset+=4,e};A.prototype.parseOffset32=A.prototype.parseULong;A.prototype.parseFixed=function(){var e=_2(this.data,this.offset+this.relativeOffset);return this.relativeOffset+=4,e};A.prototype.parseString=function(e){var t=this.data,r=this.offset+this.relativeOffset,n=\"\";this.relativeOffset+=e;for(var i=0;i<e;i++)n+=String.fromCharCode(t.getUint8(r+i));return n};A.prototype.parseTag=function(){return this.parseString(4)};A.prototype.parseLongDateTime=function(){var e=io(this.data,this.offset+this.relativeOffset+4);return e-=2082844800,this.relativeOffset+=8,e};A.prototype.parseVersion=function(e){var t=Si(this.data,this.offset+this.relativeOffset),r=Si(this.data,this.offset+this.relativeOffset+2);return this.relativeOffset+=4,e===void 0&&(e=4096),t+r/e/10};A.prototype.skip=function(e,t){t===void 0&&(t=1),this.relativeOffset+=H5[e]*t};A.prototype.parseULongList=function(e){e===void 0&&(e=this.parseULong());for(var t=new Array(e),r=this.data,n=this.offset+this.relativeOffset,i=0;i<e;i++)t[i]=r.getUint32(n),n+=4;return this.relativeOffset+=e*4,t};A.prototype.parseOffset16List=A.prototype.parseUShortList=function(e){e===void 0&&(e=this.parseUShort());for(var t=new Array(e),r=this.data,n=this.offset+this.relativeOffset,i=0;i<e;i++)t[i]=r.getUint16(n),n+=2;return this.relativeOffset+=e*2,t};A.prototype.parseShortList=function(e){for(var t=new Array(e),r=this.data,n=this.offset+this.relativeOffset,i=0;i<e;i++)t[i]=r.getInt16(n),n+=2;return this.relativeOffset+=e*2,t};A.prototype.parseByteList=function(e){for(var t=new Array(e),r=this.data,n=this.offset+this.relativeOffset,i=0;i<e;i++)t[i]=r.getUint8(n++);return this.relativeOffset+=e,t};A.prototype.parseList=function(e,t){t||(t=e,e=this.parseUShort());for(var r=new Array(e),n=0;n<e;n++)r[n]=t.call(this);return r};A.prototype.parseList32=function(e,t){t||(t=e,e=this.parseULong());for(var r=new Array(e),n=0;n<e;n++)r[n]=t.call(this);return r};A.prototype.parseRecordList=function(e,t){t||(t=e,e=this.parseUShort());for(var r=new Array(e),n=Object.keys(t),i=0;i<e;i++){for(var s={},o=0;o<n.length;o++){var a=n[o],l=t[a];s[a]=l.call(this)}r[i]=s}return r};A.prototype.parseRecordList32=function(e,t){t||(t=e,e=this.parseULong());for(var r=new Array(e),n=Object.keys(t),i=0;i<e;i++){for(var s={},o=0;o<n.length;o++){var a=n[o],l=t[a];s[a]=l.call(this)}r[i]=s}return r};A.prototype.parseStruct=function(e){if(typeof e==\"function\")return e.call(this);for(var t=Object.keys(e),r={},n=0;n<t.length;n++){var i=t[n],s=e[i];r[i]=s.call(this)}return r};A.prototype.parseValueRecord=function(e){if(e===void 0&&(e=this.parseUShort()),e!==0){var t={};return e&1&&(t.xPlacement=this.parseShort()),e&2&&(t.yPlacement=this.parseShort()),e&4&&(t.xAdvance=this.parseShort()),e&8&&(t.yAdvance=this.parseShort()),e&16&&(t.xPlaDevice=void 0,this.parseShort()),e&32&&(t.yPlaDevice=void 0,this.parseShort()),e&64&&(t.xAdvDevice=void 0,this.parseShort()),e&128&&(t.yAdvDevice=void 0,this.parseShort()),t}};A.prototype.parseValueRecordList=function(){for(var e=this.parseUShort(),t=this.parseUShort(),r=new Array(t),n=0;n<t;n++)r[n]=this.parseValueRecord(e);return r};A.prototype.parsePointer=function(e){var t=this.parseOffset16();if(t>0)return new A(this.data,this.offset+t).parseStruct(e)};A.prototype.parsePointer32=function(e){var t=this.parseOffset32();if(t>0)return new A(this.data,this.offset+t).parseStruct(e)};A.prototype.parseListOfLists=function(e){for(var t=this.parseOffset16List(),r=t.length,n=this.relativeOffset,i=new Array(r),s=0;s<r;s++){var o=t[s];if(o===0){i[s]=void 0;continue}if(this.relativeOffset=o,e){for(var a=this.parseOffset16List(),l=new Array(a.length),u=0;u<a.length;u++)this.relativeOffset=o+a[u],l[u]=e.call(this);i[s]=l}else i[s]=this.parseUShortList()}return this.relativeOffset=n,i};A.prototype.parseCoverage=function(){var e=this.offset+this.relativeOffset,t=this.parseUShort(),r=this.parseUShort();if(t===1)return{format:1,glyphs:this.parseUShortList(r)};if(t===2){for(var n=new Array(r),i=0;i<r;i++)n[i]={start:this.parseUShort(),end:this.parseUShort(),index:this.parseUShort()};return{format:2,ranges:n}}throw new Error(\"0x\"+e.toString(16)+\": Coverage format must be 1 or 2.\")};A.prototype.parseClassDef=function(){var e=this.offset+this.relativeOffset,t=this.parseUShort();if(t===1)return{format:1,startGlyph:this.parseUShort(),classes:this.parseUShortList()};if(t===2)return{format:2,ranges:this.parseRecordList({start:A.uShort,end:A.uShort,classId:A.uShort})};throw new Error(\"0x\"+e.toString(16)+\": ClassDef format must be 1 or 2.\")};A.list=function(e,t){return function(){return this.parseList(e,t)}};A.list32=function(e,t){return function(){return this.parseList32(e,t)}};A.recordList=function(e,t){return function(){return this.parseRecordList(e,t)}};A.recordList32=function(e,t){return function(){return this.parseRecordList32(e,t)}};A.pointer=function(e){return function(){return this.parsePointer(e)}};A.pointer32=function(e){return function(){return this.parsePointer32(e)}};A.tag=A.prototype.parseTag;A.byte=A.prototype.parseByte;A.uShort=A.offset16=A.prototype.parseUShort;A.uShortList=A.prototype.parseUShortList;A.uLong=A.offset32=A.prototype.parseULong;A.uLongList=A.prototype.parseULongList;A.struct=A.prototype.parseStruct;A.coverage=A.prototype.parseCoverage;A.classDef=A.prototype.parseClassDef;var Pa={reserved:A.uShort,reqFeatureIndex:A.uShort,featureIndexes:A.uShortList};A.prototype.parseScriptList=function(){return this.parsePointer(A.recordList({tag:A.tag,script:A.pointer({defaultLangSys:A.pointer(Pa),langSysRecords:A.recordList({tag:A.tag,langSys:A.pointer(Pa)})})}))||[]};A.prototype.parseFeatureList=function(){return this.parsePointer(A.recordList({tag:A.tag,feature:A.pointer({featureParams:A.offset16,lookupListIndexes:A.uShortList})}))||[]};A.prototype.parseLookupList=function(e){return this.parsePointer(A.list(A.pointer(function(){var t=this.parseUShort();N.argument(1<=t&&t<=9,\"GPOS/GSUB lookup type \"+t+\" unknown.\");var r=this.parseUShort(),n=r&16;return{lookupType:t,lookupFlag:r,subtables:this.parseList(A.pointer(e[t])),markFilteringSet:n?this.parseUShort():void 0}})))||[]};A.prototype.parseFeatureVariationsList=function(){return this.parsePointer32(function(){var e=this.parseUShort(),t=this.parseUShort();N.argument(e===1&&t<1,\"GPOS/GSUB feature variations table unknown.\");var r=this.parseRecordList32({conditionSetOffset:A.offset32,featureTableSubstitutionOffset:A.offset32});return r})||[]};var D={getByte:La,getCard8:La,getUShort:Si,getCard16:Si,getShort:P5,getULong:io,getFixed:_2,getTag:N5,getOffset:z5,getBytes:G5,bytesToString:V5,Parser:A};function W5(e,t){t.parseUShort(),e.length=t.parseULong(),e.language=t.parseULong();var r;e.groupCount=r=t.parseULong(),e.glyphIndexMap={};for(var n=0;n<r;n+=1)for(var i=t.parseULong(),s=t.parseULong(),o=t.parseULong(),a=i;a<=s;a+=1)e.glyphIndexMap[a]=o,o++}function X5(e,t,r,n,i){e.length=t.parseUShort(),e.language=t.parseUShort();var s;e.segCount=s=t.parseUShort()>>1,t.skip(\"uShort\",3),e.glyphIndexMap={};for(var o=new D.Parser(r,n+i+14),a=new D.Parser(r,n+i+16+s*2),l=new D.Parser(r,n+i+16+s*4),u=new D.Parser(r,n+i+16+s*6),c=n+i+16+s*8,f=0;f<s-1;f+=1)for(var q=void 0,p=o.parseUShort(),d=a.parseUShort(),v=l.parseShort(),m=u.parseUShort(),h=d;h<=p;h+=1)m!==0?(c=u.offset+u.relativeOffset-2,c+=m,c+=(h-d)*2,q=D.getUShort(r,c),q!==0&&(q=q+v&65535)):q=h+v&65535,e.glyphIndexMap[h]=q}function j5(e,t){var r={};r.version=D.getUShort(e,t),N.argument(r.version===0,\"cmap table version should be 0.\"),r.numTables=D.getUShort(e,t+2);for(var n=-1,i=r.numTables-1;i>=0;i-=1){var s=D.getUShort(e,t+4+i*8),o=D.getUShort(e,t+4+i*8+2);if(s===3&&(o===0||o===1||o===10)||s===0&&(o===0||o===1||o===2||o===3||o===4)){n=D.getULong(e,t+4+i*8+4);break}}if(n===-1)throw new Error(\"No valid cmap sub-tables found.\");var a=new D.Parser(e,t+n);if(r.format=a.parseUShort(),r.format===12)W5(r,a);else if(r.format===4)X5(r,a,e,t,n);else throw new Error(\"Only format 4 and 12 cmap tables are supported (found format \"+r.format+\").\");return r}function Y5(e,t,r){e.segments.push({end:t,start:t,delta:-(t-r),offset:0,glyphIndex:r})}function K5(e){e.segments.push({end:65535,start:65535,delta:1,offset:0})}function Z5(e){var t=!0,r;for(r=e.length-1;r>0;r-=1){var n=e.get(r);if(n.unicode>65535){console.log(\"Adding CMAP format 12 (needed!)\"),t=!1;break}}var i=[{name:\"version\",type:\"USHORT\",value:0},{name:\"numTables\",type:\"USHORT\",value:t?1:2},{name:\"platformID\",type:\"USHORT\",value:3},{name:\"encodingID\",type:\"USHORT\",value:1},{name:\"offset\",type:\"ULONG\",value:t?12:20}];t||(i=i.concat([{name:\"cmap12PlatformID\",type:\"USHORT\",value:3},{name:\"cmap12EncodingID\",type:\"USHORT\",value:10},{name:\"cmap12Offset\",type:\"ULONG\",value:0}])),i=i.concat([{name:\"format\",type:\"USHORT\",value:4},{name:\"cmap4Length\",type:\"USHORT\",value:0},{name:\"language\",type:\"USHORT\",value:0},{name:\"segCountX2\",type:\"USHORT\",value:0},{name:\"searchRange\",type:\"USHORT\",value:0},{name:\"entrySelector\",type:\"USHORT\",value:0},{name:\"rangeShift\",type:\"USHORT\",value:0}]);var s=new U.Table(\"cmap\",i);for(s.segments=[],r=0;r<e.length;r+=1){for(var o=e.get(r),a=0;a<o.unicodes.length;a+=1)Y5(s,o.unicodes[a],r);s.segments=s.segments.sort(function(g,x){return g.start-x.start})}K5(s);var l=s.segments.length,u=0,c=[],f=[],q=[],p=[],d=[],v=[];for(r=0;r<l;r+=1){var m=s.segments[r];m.end<=65535&&m.start<=65535?(c=c.concat({name:\"end_\"+r,type:\"USHORT\",value:m.end}),f=f.concat({name:\"start_\"+r,type:\"USHORT\",value:m.start}),q=q.concat({name:\"idDelta_\"+r,type:\"SHORT\",value:m.delta}),p=p.concat({name:\"idRangeOffset_\"+r,type:\"USHORT\",value:m.offset}),m.glyphId!==void 0&&(d=d.concat({name:\"glyph_\"+r,type:\"USHORT\",value:m.glyphId}))):u+=1,!t&&m.glyphIndex!==void 0&&(v=v.concat({name:\"cmap12Start_\"+r,type:\"ULONG\",value:m.start}),v=v.concat({name:\"cmap12End_\"+r,type:\"ULONG\",value:m.end}),v=v.concat({name:\"cmap12Glyph_\"+r,type:\"ULONG\",value:m.glyphIndex}))}if(s.segCountX2=(l-u)*2,s.searchRange=Math.pow(2,Math.floor(Math.log(l-u)/Math.log(2)))*2,s.entrySelector=Math.log(s.searchRange/2)/Math.log(2),s.rangeShift=s.segCountX2-s.searchRange,s.fields=s.fields.concat(c),s.fields.push({name:\"reservedPad\",type:\"USHORT\",value:0}),s.fields=s.fields.concat(f),s.fields=s.fields.concat(q),s.fields=s.fields.concat(p),s.fields=s.fields.concat(d),s.cmap4Length=14+c.length*2+2+f.length*2+q.length*2+p.length*2+d.length*2,!t){var h=16+v.length*4;s.cmap12Offset=12+2*2+4+s.cmap4Length,s.fields=s.fields.concat([{name:\"cmap12Format\",type:\"USHORT\",value:12},{name:\"cmap12Reserved\",type:\"USHORT\",value:0},{name:\"cmap12Length\",type:\"ULONG\",value:h},{name:\"cmap12Language\",type:\"ULONG\",value:0},{name:\"cmap12nGroups\",type:\"ULONG\",value:v.length/3}]),s.fields=s.fields.concat(v)}return s}var w2={parse:j5,make:Z5},mi=[\".notdef\",\"space\",\"exclam\",\"quotedbl\",\"numbersign\",\"dollar\",\"percent\",\"ampersand\",\"quoteright\",\"parenleft\",\"parenright\",\"asterisk\",\"plus\",\"comma\",\"hyphen\",\"period\",\"slash\",\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"colon\",\"semicolon\",\"less\",\"equal\",\"greater\",\"question\",\"at\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"bracketleft\",\"backslash\",\"bracketright\",\"asciicircum\",\"underscore\",\"quoteleft\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"braceleft\",\"bar\",\"braceright\",\"asciitilde\",\"exclamdown\",\"cent\",\"sterling\",\"fraction\",\"yen\",\"florin\",\"section\",\"currency\",\"quotesingle\",\"quotedblleft\",\"guillemotleft\",\"guilsinglleft\",\"guilsinglright\",\"fi\",\"fl\",\"endash\",\"dagger\",\"daggerdbl\",\"periodcentered\",\"paragraph\",\"bullet\",\"quotesinglbase\",\"quotedblbase\",\"quotedblright\",\"guillemotright\",\"ellipsis\",\"perthousand\",\"questiondown\",\"grave\",\"acute\",\"circumflex\",\"tilde\",\"macron\",\"breve\",\"dotaccent\",\"dieresis\",\"ring\",\"cedilla\",\"hungarumlaut\",\"ogonek\",\"caron\",\"emdash\",\"AE\",\"ordfeminine\",\"Lslash\",\"Oslash\",\"OE\",\"ordmasculine\",\"ae\",\"dotlessi\",\"lslash\",\"oslash\",\"oe\",\"germandbls\",\"onesuperior\",\"logicalnot\",\"mu\",\"trademark\",\"Eth\",\"onehalf\",\"plusminus\",\"Thorn\",\"onequarter\",\"divide\",\"brokenbar\",\"degree\",\"thorn\",\"threequarters\",\"twosuperior\",\"registered\",\"minus\",\"eth\",\"multiply\",\"threesuperior\",\"copyright\",\"Aacute\",\"Acircumflex\",\"Adieresis\",\"Agrave\",\"Aring\",\"Atilde\",\"Ccedilla\",\"Eacute\",\"Ecircumflex\",\"Edieresis\",\"Egrave\",\"Iacute\",\"Icircumflex\",\"Idieresis\",\"Igrave\",\"Ntilde\",\"Oacute\",\"Ocircumflex\",\"Odieresis\",\"Ograve\",\"Otilde\",\"Scaron\",\"Uacute\",\"Ucircumflex\",\"Udieresis\",\"Ugrave\",\"Yacute\",\"Ydieresis\",\"Zcaron\",\"aacute\",\"acircumflex\",\"adieresis\",\"agrave\",\"aring\",\"atilde\",\"ccedilla\",\"eacute\",\"ecircumflex\",\"edieresis\",\"egrave\",\"iacute\",\"icircumflex\",\"idieresis\",\"igrave\",\"ntilde\",\"oacute\",\"ocircumflex\",\"odieresis\",\"ograve\",\"otilde\",\"scaron\",\"uacute\",\"ucircumflex\",\"udieresis\",\"ugrave\",\"yacute\",\"ydieresis\",\"zcaron\",\"exclamsmall\",\"Hungarumlautsmall\",\"dollaroldstyle\",\"dollarsuperior\",\"ampersandsmall\",\"Acutesmall\",\"parenleftsuperior\",\"parenrightsuperior\",\"266 ff\",\"onedotenleader\",\"zerooldstyle\",\"oneoldstyle\",\"twooldstyle\",\"threeoldstyle\",\"fouroldstyle\",\"fiveoldstyle\",\"sixoldstyle\",\"sevenoldstyle\",\"eightoldstyle\",\"nineoldstyle\",\"commasuperior\",\"threequartersemdash\",\"periodsuperior\",\"questionsmall\",\"asuperior\",\"bsuperior\",\"centsuperior\",\"dsuperior\",\"esuperior\",\"isuperior\",\"lsuperior\",\"msuperior\",\"nsuperior\",\"osuperior\",\"rsuperior\",\"ssuperior\",\"tsuperior\",\"ff\",\"ffi\",\"ffl\",\"parenleftinferior\",\"parenrightinferior\",\"Circumflexsmall\",\"hyphensuperior\",\"Gravesmall\",\"Asmall\",\"Bsmall\",\"Csmall\",\"Dsmall\",\"Esmall\",\"Fsmall\",\"Gsmall\",\"Hsmall\",\"Ismall\",\"Jsmall\",\"Ksmall\",\"Lsmall\",\"Msmall\",\"Nsmall\",\"Osmall\",\"Psmall\",\"Qsmall\",\"Rsmall\",\"Ssmall\",\"Tsmall\",\"Usmall\",\"Vsmall\",\"Wsmall\",\"Xsmall\",\"Ysmall\",\"Zsmall\",\"colonmonetary\",\"onefitted\",\"rupiah\",\"Tildesmall\",\"exclamdownsmall\",\"centoldstyle\",\"Lslashsmall\",\"Scaronsmall\",\"Zcaronsmall\",\"Dieresissmall\",\"Brevesmall\",\"Caronsmall\",\"Dotaccentsmall\",\"Macronsmall\",\"figuredash\",\"hypheninferior\",\"Ogoneksmall\",\"Ringsmall\",\"Cedillasmall\",\"questiondownsmall\",\"oneeighth\",\"threeeighths\",\"fiveeighths\",\"seveneighths\",\"onethird\",\"twothirds\",\"zerosuperior\",\"foursuperior\",\"fivesuperior\",\"sixsuperior\",\"sevensuperior\",\"eightsuperior\",\"ninesuperior\",\"zeroinferior\",\"oneinferior\",\"twoinferior\",\"threeinferior\",\"fourinferior\",\"fiveinferior\",\"sixinferior\",\"seveninferior\",\"eightinferior\",\"nineinferior\",\"centinferior\",\"dollarinferior\",\"periodinferior\",\"commainferior\",\"Agravesmall\",\"Aacutesmall\",\"Acircumflexsmall\",\"Atildesmall\",\"Adieresissmall\",\"Aringsmall\",\"AEsmall\",\"Ccedillasmall\",\"Egravesmall\",\"Eacutesmall\",\"Ecircumflexsmall\",\"Edieresissmall\",\"Igravesmall\",\"Iacutesmall\",\"Icircumflexsmall\",\"Idieresissmall\",\"Ethsmall\",\"Ntildesmall\",\"Ogravesmall\",\"Oacutesmall\",\"Ocircumflexsmall\",\"Otildesmall\",\"Odieresissmall\",\"OEsmall\",\"Oslashsmall\",\"Ugravesmall\",\"Uacutesmall\",\"Ucircumflexsmall\",\"Udieresissmall\",\"Yacutesmall\",\"Thornsmall\",\"Ydieresissmall\",\"001.000\",\"001.001\",\"001.002\",\"001.003\",\"Black\",\"Bold\",\"Book\",\"Light\",\"Medium\",\"Regular\",\"Roman\",\"Semibold\"],Q5=[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"space\",\"exclam\",\"quotedbl\",\"numbersign\",\"dollar\",\"percent\",\"ampersand\",\"quoteright\",\"parenleft\",\"parenright\",\"asterisk\",\"plus\",\"comma\",\"hyphen\",\"period\",\"slash\",\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"colon\",\"semicolon\",\"less\",\"equal\",\"greater\",\"question\",\"at\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"bracketleft\",\"backslash\",\"bracketright\",\"asciicircum\",\"underscore\",\"quoteleft\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"braceleft\",\"bar\",\"braceright\",\"asciitilde\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"exclamdown\",\"cent\",\"sterling\",\"fraction\",\"yen\",\"florin\",\"section\",\"currency\",\"quotesingle\",\"quotedblleft\",\"guillemotleft\",\"guilsinglleft\",\"guilsinglright\",\"fi\",\"fl\",\"\",\"endash\",\"dagger\",\"daggerdbl\",\"periodcentered\",\"\",\"paragraph\",\"bullet\",\"quotesinglbase\",\"quotedblbase\",\"quotedblright\",\"guillemotright\",\"ellipsis\",\"perthousand\",\"\",\"questiondown\",\"\",\"grave\",\"acute\",\"circumflex\",\"tilde\",\"macron\",\"breve\",\"dotaccent\",\"dieresis\",\"\",\"ring\",\"cedilla\",\"\",\"hungarumlaut\",\"ogonek\",\"caron\",\"emdash\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"AE\",\"\",\"ordfeminine\",\"\",\"\",\"\",\"\",\"Lslash\",\"Oslash\",\"OE\",\"ordmasculine\",\"\",\"\",\"\",\"\",\"\",\"ae\",\"\",\"\",\"\",\"dotlessi\",\"\",\"\",\"lslash\",\"oslash\",\"oe\",\"germandbls\"],J5=[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"space\",\"exclamsmall\",\"Hungarumlautsmall\",\"\",\"dollaroldstyle\",\"dollarsuperior\",\"ampersandsmall\",\"Acutesmall\",\"parenleftsuperior\",\"parenrightsuperior\",\"twodotenleader\",\"onedotenleader\",\"comma\",\"hyphen\",\"period\",\"fraction\",\"zerooldstyle\",\"oneoldstyle\",\"twooldstyle\",\"threeoldstyle\",\"fouroldstyle\",\"fiveoldstyle\",\"sixoldstyle\",\"sevenoldstyle\",\"eightoldstyle\",\"nineoldstyle\",\"colon\",\"semicolon\",\"commasuperior\",\"threequartersemdash\",\"periodsuperior\",\"questionsmall\",\"\",\"asuperior\",\"bsuperior\",\"centsuperior\",\"dsuperior\",\"esuperior\",\"\",\"\",\"isuperior\",\"\",\"\",\"lsuperior\",\"msuperior\",\"nsuperior\",\"osuperior\",\"\",\"\",\"rsuperior\",\"ssuperior\",\"tsuperior\",\"\",\"ff\",\"fi\",\"fl\",\"ffi\",\"ffl\",\"parenleftinferior\",\"\",\"parenrightinferior\",\"Circumflexsmall\",\"hyphensuperior\",\"Gravesmall\",\"Asmall\",\"Bsmall\",\"Csmall\",\"Dsmall\",\"Esmall\",\"Fsmall\",\"Gsmall\",\"Hsmall\",\"Ismall\",\"Jsmall\",\"Ksmall\",\"Lsmall\",\"Msmall\",\"Nsmall\",\"Osmall\",\"Psmall\",\"Qsmall\",\"Rsmall\",\"Ssmall\",\"Tsmall\",\"Usmall\",\"Vsmall\",\"Wsmall\",\"Xsmall\",\"Ysmall\",\"Zsmall\",\"colonmonetary\",\"onefitted\",\"rupiah\",\"Tildesmall\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"exclamdownsmall\",\"centoldstyle\",\"Lslashsmall\",\"\",\"\",\"Scaronsmall\",\"Zcaronsmall\",\"Dieresissmall\",\"Brevesmall\",\"Caronsmall\",\"\",\"Dotaccentsmall\",\"\",\"\",\"Macronsmall\",\"\",\"\",\"figuredash\",\"hypheninferior\",\"\",\"\",\"Ogoneksmall\",\"Ringsmall\",\"Cedillasmall\",\"\",\"\",\"\",\"onequarter\",\"onehalf\",\"threequarters\",\"questiondownsmall\",\"oneeighth\",\"threeeighths\",\"fiveeighths\",\"seveneighths\",\"onethird\",\"twothirds\",\"\",\"\",\"zerosuperior\",\"onesuperior\",\"twosuperior\",\"threesuperior\",\"foursuperior\",\"fivesuperior\",\"sixsuperior\",\"sevensuperior\",\"eightsuperior\",\"ninesuperior\",\"zeroinferior\",\"oneinferior\",\"twoinferior\",\"threeinferior\",\"fourinferior\",\"fiveinferior\",\"sixinferior\",\"seveninferior\",\"eightinferior\",\"nineinferior\",\"centinferior\",\"dollarinferior\",\"periodinferior\",\"commainferior\",\"Agravesmall\",\"Aacutesmall\",\"Acircumflexsmall\",\"Atildesmall\",\"Adieresissmall\",\"Aringsmall\",\"AEsmall\",\"Ccedillasmall\",\"Egravesmall\",\"Eacutesmall\",\"Ecircumflexsmall\",\"Edieresissmall\",\"Igravesmall\",\"Iacutesmall\",\"Icircumflexsmall\",\"Idieresissmall\",\"Ethsmall\",\"Ntildesmall\",\"Ogravesmall\",\"Oacutesmall\",\"Ocircumflexsmall\",\"Otildesmall\",\"Odieresissmall\",\"OEsmall\",\"Oslashsmall\",\"Ugravesmall\",\"Uacutesmall\",\"Ucircumflexsmall\",\"Udieresissmall\",\"Yacutesmall\",\"Thornsmall\",\"Ydieresissmall\"],Pt=[\".notdef\",\".null\",\"nonmarkingreturn\",\"space\",\"exclam\",\"quotedbl\",\"numbersign\",\"dollar\",\"percent\",\"ampersand\",\"quotesingle\",\"parenleft\",\"parenright\",\"asterisk\",\"plus\",\"comma\",\"hyphen\",\"period\",\"slash\",\"zero\",\"one\",\"two\",\"three\",\"four\",\"five\",\"six\",\"seven\",\"eight\",\"nine\",\"colon\",\"semicolon\",\"less\",\"equal\",\"greater\",\"question\",\"at\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"bracketleft\",\"backslash\",\"bracketright\",\"asciicircum\",\"underscore\",\"grave\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"braceleft\",\"bar\",\"braceright\",\"asciitilde\",\"Adieresis\",\"Aring\",\"Ccedilla\",\"Eacute\",\"Ntilde\",\"Odieresis\",\"Udieresis\",\"aacute\",\"agrave\",\"acircumflex\",\"adieresis\",\"atilde\",\"aring\",\"ccedilla\",\"eacute\",\"egrave\",\"ecircumflex\",\"edieresis\",\"iacute\",\"igrave\",\"icircumflex\",\"idieresis\",\"ntilde\",\"oacute\",\"ograve\",\"ocircumflex\",\"odieresis\",\"otilde\",\"uacute\",\"ugrave\",\"ucircumflex\",\"udieresis\",\"dagger\",\"degree\",\"cent\",\"sterling\",\"section\",\"bullet\",\"paragraph\",\"germandbls\",\"registered\",\"copyright\",\"trademark\",\"acute\",\"dieresis\",\"notequal\",\"AE\",\"Oslash\",\"infinity\",\"plusminus\",\"lessequal\",\"greaterequal\",\"yen\",\"mu\",\"partialdiff\",\"summation\",\"product\",\"pi\",\"integral\",\"ordfeminine\",\"ordmasculine\",\"Omega\",\"ae\",\"oslash\",\"questiondown\",\"exclamdown\",\"logicalnot\",\"radical\",\"florin\",\"approxequal\",\"Delta\",\"guillemotleft\",\"guillemotright\",\"ellipsis\",\"nonbreakingspace\",\"Agrave\",\"Atilde\",\"Otilde\",\"OE\",\"oe\",\"endash\",\"emdash\",\"quotedblleft\",\"quotedblright\",\"quoteleft\",\"quoteright\",\"divide\",\"lozenge\",\"ydieresis\",\"Ydieresis\",\"fraction\",\"currency\",\"guilsinglleft\",\"guilsinglright\",\"fi\",\"fl\",\"daggerdbl\",\"periodcentered\",\"quotesinglbase\",\"quotedblbase\",\"perthousand\",\"Acircumflex\",\"Ecircumflex\",\"Aacute\",\"Edieresis\",\"Egrave\",\"Iacute\",\"Icircumflex\",\"Idieresis\",\"Igrave\",\"Oacute\",\"Ocircumflex\",\"apple\",\"Ograve\",\"Uacute\",\"Ucircumflex\",\"Ugrave\",\"dotlessi\",\"circumflex\",\"tilde\",\"macron\",\"breve\",\"dotaccent\",\"ring\",\"cedilla\",\"hungarumlaut\",\"ogonek\",\"caron\",\"Lslash\",\"lslash\",\"Scaron\",\"scaron\",\"Zcaron\",\"zcaron\",\"brokenbar\",\"Eth\",\"eth\",\"Yacute\",\"yacute\",\"Thorn\",\"thorn\",\"minus\",\"multiply\",\"onesuperior\",\"twosuperior\",\"threesuperior\",\"onehalf\",\"onequarter\",\"threequarters\",\"franc\",\"Gbreve\",\"gbreve\",\"Idotaccent\",\"Scedilla\",\"scedilla\",\"Cacute\",\"cacute\",\"Ccaron\",\"ccaron\",\"dcroat\"];function E2(e){this.font=e}E2.prototype.charToGlyphIndex=function(e){var t=e.codePointAt(0),r=this.font.glyphs;if(r){for(var n=0;n<r.length;n+=1)for(var i=r.get(n),s=0;s<i.unicodes.length;s+=1)if(i.unicodes[s]===t)return n}return null};function A2(e){this.cmap=e}A2.prototype.charToGlyphIndex=function(e){return this.cmap.glyphIndexMap[e.codePointAt(0)]||0};function Ti(e,t){this.encoding=e,this.charset=t}Ti.prototype.charToGlyphIndex=function(e){var t=e.codePointAt(0),r=this.encoding[t];return this.charset.indexOf(r)};function so(e){switch(e.version){case 1:this.names=Pt.slice();break;case 2:this.names=new Array(e.numberOfGlyphs);for(var t=0;t<e.numberOfGlyphs;t++)e.glyphNameIndex[t]<Pt.length?this.names[t]=Pt[e.glyphNameIndex[t]]:this.names[t]=e.names[e.glyphNameIndex[t]-Pt.length];break;case 2.5:this.names=new Array(e.numberOfGlyphs);for(var r=0;r<e.numberOfGlyphs;r++)this.names[r]=Pt[r+e.glyphNameIndex[r]];break;case 3:this.names=[];break;default:this.names=[];break}}so.prototype.nameToGlyphIndex=function(e){return this.names.indexOf(e)};so.prototype.glyphIndexToName=function(e){return this.names[e]};function $5(e){for(var t,r=e.tables.cmap.glyphIndexMap,n=Object.keys(r),i=0;i<n.length;i+=1){var s=n[i],o=r[s];t=e.glyphs.get(o),t.addUnicode(parseInt(s))}for(var a=0;a<e.glyphs.length;a+=1)t=e.glyphs.get(a),e.cffEncoding?e.isCIDFont?t.name=\"gid\"+a:t.name=e.cffEncoding.charset[a]:e.glyphNames.names&&(t.name=e.glyphNames.glyphIndexToName(a))}function e4(e){e._IndexToUnicodeMap={};for(var t=e.tables.cmap.glyphIndexMap,r=Object.keys(t),n=0;n<r.length;n+=1){var i=r[n],s=t[i];e._IndexToUnicodeMap[s]===void 0?e._IndexToUnicodeMap[s]={unicodes:[parseInt(i)]}:e._IndexToUnicodeMap[s].unicodes.push(parseInt(i))}}function t4(e,t){t.lowMemory?e4(e):$5(e)}function r4(e,t,r,n,i){e.beginPath(),e.moveTo(t,r),e.lineTo(n,i),e.stroke()}var Lt={line:r4};function n4(e,t){var r=t||new pe;return{configurable:!0,get:function(){return typeof r==\"function\"&&(r=r()),r},set:function(n){r=n}}}function _e(e){this.bindConstructorValues(e)}_e.prototype.bindConstructorValues=function(e){this.index=e.index||0,this.name=e.name||null,this.unicode=e.unicode||void 0,this.unicodes=e.unicodes||e.unicode!==void 0?[e.unicode]:[],\"xMin\"in e&&(this.xMin=e.xMin),\"yMin\"in e&&(this.yMin=e.yMin),\"xMax\"in e&&(this.xMax=e.xMax),\"yMax\"in e&&(this.yMax=e.yMax),\"advanceWidth\"in e&&(this.advanceWidth=e.advanceWidth),Object.defineProperty(this,\"path\",n4(this,e.path))};_e.prototype.addUnicode=function(e){this.unicodes.length===0&&(this.unicode=e),this.unicodes.push(e)};_e.prototype.getBoundingBox=function(){return this.path.getBoundingBox()};_e.prototype.getPath=function(e,t,r,n,i){e=e!==void 0?e:0,t=t!==void 0?t:0,r=r!==void 0?r:72;var s,o;n||(n={});var a=n.xScale,l=n.yScale;if(n.hinting&&i&&i.hinting&&(o=this.path&&i.hinting.exec(this,r)),o)s=i.hinting.getCommands(o),e=Math.round(e),t=Math.round(t),a=l=1;else{s=this.path.commands;var u=1/(this.path.unitsPerEm||1e3)*r;a===void 0&&(a=u),l===void 0&&(l=u)}for(var c=new pe,f=0;f<s.length;f+=1){var q=s[f];q.type===\"M\"?c.moveTo(e+q.x*a,t+-q.y*l):q.type===\"L\"?c.lineTo(e+q.x*a,t+-q.y*l):q.type===\"Q\"?c.quadraticCurveTo(e+q.x1*a,t+-q.y1*l,e+q.x*a,t+-q.y*l):q.type===\"C\"?c.curveTo(e+q.x1*a,t+-q.y1*l,e+q.x2*a,t+-q.y2*l,e+q.x*a,t+-q.y*l):q.type===\"Z\"&&c.closePath()}return c};_e.prototype.getContours=function(){if(this.points===void 0)return[];for(var e=[],t=[],r=0;r<this.points.length;r+=1){var n=this.points[r];t.push(n),n.lastPointOfContour&&(e.push(t),t=[])}return N.argument(t.length===0,\"There are still points left in the current contour.\"),e};_e.prototype.getMetrics=function(){for(var e=this.path.commands,t=[],r=[],n=0;n<e.length;n+=1){var i=e[n];i.type!==\"Z\"&&(t.push(i.x),r.push(i.y)),(i.type===\"Q\"||i.type===\"C\")&&(t.push(i.x1),r.push(i.y1)),i.type===\"C\"&&(t.push(i.x2),r.push(i.y2))}var s={xMin:Math.min.apply(null,t),yMin:Math.min.apply(null,r),xMax:Math.max.apply(null,t),yMax:Math.max.apply(null,r),leftSideBearing:this.leftSideBearing};return isFinite(s.xMin)||(s.xMin=0),isFinite(s.xMax)||(s.xMax=this.advanceWidth),isFinite(s.yMin)||(s.yMin=0),isFinite(s.yMax)||(s.yMax=0),s.rightSideBearing=this.advanceWidth-s.leftSideBearing-(s.xMax-s.xMin),s};_e.prototype.draw=function(e,t,r,n,i){this.getPath(t,r,n,i).draw(e)};_e.prototype.drawPoints=function(e,t,r,n){function i(f,q,p,d){e.beginPath();for(var v=0;v<f.length;v+=1)e.moveTo(q+f[v].x*d,p+f[v].y*d),e.arc(q+f[v].x*d,p+f[v].y*d,2,0,Math.PI*2,!1);e.closePath(),e.fill()}t=t!==void 0?t:0,r=r!==void 0?r:0,n=n!==void 0?n:24;for(var s=1/this.path.unitsPerEm*n,o=[],a=[],l=this.path,u=0;u<l.commands.length;u+=1){var c=l.commands[u];c.x!==void 0&&o.push({x:c.x,y:-c.y}),c.x1!==void 0&&a.push({x:c.x1,y:-c.y1}),c.x2!==void 0&&a.push({x:c.x2,y:-c.y2})}e.fillStyle=\"blue\",i(o,t,r,s),e.fillStyle=\"red\",i(a,t,r,s)};_e.prototype.drawMetrics=function(e,t,r,n){var i;t=t!==void 0?t:0,r=r!==void 0?r:0,n=n!==void 0?n:24,i=1/this.path.unitsPerEm*n,e.lineWidth=1,e.strokeStyle=\"black\",Lt.line(e,t,-1e4,t,1e4),Lt.line(e,-1e4,r,1e4,r);var s=this.xMin||0,o=this.yMin||0,a=this.xMax||0,l=this.yMax||0,u=this.advanceWidth||0;e.strokeStyle=\"blue\",Lt.line(e,t+s*i,-1e4,t+s*i,1e4),Lt.line(e,t+a*i,-1e4,t+a*i,1e4),Lt.line(e,-1e4,r+-o*i,1e4,r+-o*i),Lt.line(e,-1e4,r+-l*i,1e4,r+-l*i),e.strokeStyle=\"green\",Lt.line(e,t+u*i,-1e4,t+u*i,1e4)};function hi(e,t,r){Object.defineProperty(e,t,{get:function(){return e.path,e[r]},set:function(n){e[r]=n},enumerable:!0,configurable:!0})}function oo(e,t){if(this.font=e,this.glyphs={},Array.isArray(t))for(var r=0;r<t.length;r++){var n=t[r];n.path.unitsPerEm=e.unitsPerEm,this.glyphs[r]=n}this.length=t&&t.length||0}oo.prototype.get=function(e){if(this.glyphs[e]===void 0){this.font._push(e),typeof this.glyphs[e]==\"function\"&&(this.glyphs[e]=this.glyphs[e]());var t=this.glyphs[e],r=this.font._IndexToUnicodeMap[e];if(r)for(var n=0;n<r.unicodes.length;n++)t.addUnicode(r.unicodes[n]);this.font.cffEncoding?this.font.isCIDFont?t.name=\"gid\"+e:t.name=this.font.cffEncoding.charset[e]:this.font.glyphNames.names&&(t.name=this.font.glyphNames.glyphIndexToName(e)),this.glyphs[e].advanceWidth=this.font._hmtxTableData[e].advanceWidth,this.glyphs[e].leftSideBearing=this.font._hmtxTableData[e].leftSideBearing}else typeof this.glyphs[e]==\"function\"&&(this.glyphs[e]=this.glyphs[e]());return this.glyphs[e]};oo.prototype.push=function(e,t){this.glyphs[e]=t,this.length++};function i4(e,t){return new _e({index:t,font:e})}function s4(e,t,r,n,i,s){return function(){var o=new _e({index:t,font:e});return o.path=function(){r(o,n,i);var a=s(e.glyphs,o);return a.unitsPerEm=e.unitsPerEm,a},hi(o,\"xMin\",\"_xMin\"),hi(o,\"xMax\",\"_xMax\"),hi(o,\"yMin\",\"_yMin\"),hi(o,\"yMax\",\"_yMax\"),o}}function o4(e,t,r,n){return function(){var i=new _e({index:t,font:e});return i.path=function(){var s=r(e,i,n);return s.unitsPerEm=e.unitsPerEm,s},i}}var Ye={GlyphSet:oo,glyphLoader:i4,ttfGlyphLoader:s4,cffGlyphLoader:o4};function C2(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(var r=0;r<e.length;r+=1)if(!C2(e[r],t[r]))return!1;return!0}else return!1}function Zs(e){var t;return e.length<1240?t=107:e.length<33900?t=1131:t=32768,t}function bt(e,t,r){var n=[],i=[],s=D.getCard16(e,t),o,a;if(s!==0){var l=D.getByte(e,t+2);o=t+(s+1)*l+2;for(var u=t+3,c=0;c<s+1;c+=1)n.push(D.getOffset(e,u,l)),u+=l;a=o+n[s]}else a=t+2;for(var f=0;f<n.length-1;f+=1){var q=D.getBytes(e,o+n[f],o+n[f+1]);r&&(q=r(q)),i.push(q)}return{objects:i,startOffset:t,endOffset:a}}function a4(e,t){var r=[],n=D.getCard16(e,t),i,s;if(n!==0){var o=D.getByte(e,t+2);i=t+(n+1)*o+2;for(var a=t+3,l=0;l<n+1;l+=1)r.push(D.getOffset(e,a,o)),a+=o;s=i+r[n]}else s=t+2;return{offsets:r,startOffset:t,endOffset:s}}function l4(e,t,r,n,i){var s=D.getCard16(r,n),o=0;if(s!==0){var a=D.getByte(r,n+2);o=n+(s+1)*a+2}var l=D.getBytes(r,o+t[e],o+t[e+1]);return i&&(l=i(l)),l}function c4(e){for(var t=\"\",r=15,n=[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\".\",\"E\",\"E-\",null,\"-\"];;){var i=e.parseByte(),s=i>>4,o=i&15;if(s===r||(t+=n[s],o===r))break;t+=n[o]}return parseFloat(t)}function u4(e,t){var r,n,i,s;if(t===28)return r=e.parseByte(),n=e.parseByte(),r<<8|n;if(t===29)return r=e.parseByte(),n=e.parseByte(),i=e.parseByte(),s=e.parseByte(),r<<24|n<<16|i<<8|s;if(t===30)return c4(e);if(t>=32&&t<=246)return t-139;if(t>=247&&t<=250)return r=e.parseByte(),(t-247)*256+r+108;if(t>=251&&t<=254)return r=e.parseByte(),-(t-251)*256-r-108;throw new Error(\"Invalid b0 \"+t)}function q4(e){for(var t={},r=0;r<e.length;r+=1){var n=e[r][0],i=e[r][1],s=void 0;if(i.length===1?s=i[0]:s=i,t.hasOwnProperty(n)&&!isNaN(t[n]))throw new Error(\"Object \"+t+\" already has key \"+n);t[n]=s}return t}function F2(e,t,r){t=t!==void 0?t:0;var n=new D.Parser(e,t),i=[],s=[];for(r=r!==void 0?r:e.length;n.relativeOffset<r;){var o=n.parseByte();o<=21?(o===12&&(o=1200+n.parseByte()),i.push([o,s]),s=[]):s.push(u4(n,o))}return q4(i)}function Yr(e,t){return t<=390?t=mi[t]:t=e[t-391],t}function M2(e,t,r){for(var n={},i,s=0;s<t.length;s+=1){var o=t[s];if(Array.isArray(o.type)){var a=[];a.length=o.type.length;for(var l=0;l<o.type.length;l++)i=e[o.op]!==void 0?e[o.op][l]:void 0,i===void 0&&(i=o.value!==void 0&&o.value[l]!==void 0?o.value[l]:null),o.type[l]===\"SID\"&&(i=Yr(r,i)),a[l]=i;n[o.name]=a}else i=e[o.op],i===void 0&&(i=o.value!==void 0?o.value:null),o.type===\"SID\"&&(i=Yr(r,i)),n[o.name]=i}return n}function f4(e,t){var r={};return r.formatMajor=D.getCard8(e,t),r.formatMinor=D.getCard8(e,t+1),r.size=D.getCard8(e,t+2),r.offsetSize=D.getCard8(e,t+3),r.startOffset=t,r.endOffset=t+4,r}var k2=[{name:\"version\",op:0,type:\"SID\"},{name:\"notice\",op:1,type:\"SID\"},{name:\"copyright\",op:1200,type:\"SID\"},{name:\"fullName\",op:2,type:\"SID\"},{name:\"familyName\",op:3,type:\"SID\"},{name:\"weight\",op:4,type:\"SID\"},{name:\"isFixedPitch\",op:1201,type:\"number\",value:0},{name:\"italicAngle\",op:1202,type:\"number\",value:0},{name:\"underlinePosition\",op:1203,type:\"number\",value:-100},{name:\"underlineThickness\",op:1204,type:\"number\",value:50},{name:\"paintType\",op:1205,type:\"number\",value:0},{name:\"charstringType\",op:1206,type:\"number\",value:2},{name:\"fontMatrix\",op:1207,type:[\"real\",\"real\",\"real\",\"real\",\"real\",\"real\"],value:[.001,0,0,.001,0,0]},{name:\"uniqueId\",op:13,type:\"number\"},{name:\"fontBBox\",op:5,type:[\"number\",\"number\",\"number\",\"number\"],value:[0,0,0,0]},{name:\"strokeWidth\",op:1208,type:\"number\",value:0},{name:\"xuid\",op:14,type:[],value:null},{name:\"charset\",op:15,type:\"offset\",value:0},{name:\"encoding\",op:16,type:\"offset\",value:0},{name:\"charStrings\",op:17,type:\"offset\",value:0},{name:\"private\",op:18,type:[\"number\",\"offset\"],value:[0,0]},{name:\"ros\",op:1230,type:[\"SID\",\"SID\",\"number\"]},{name:\"cidFontVersion\",op:1231,type:\"number\",value:0},{name:\"cidFontRevision\",op:1232,type:\"number\",value:0},{name:\"cidFontType\",op:1233,type:\"number\",value:0},{name:\"cidCount\",op:1234,type:\"number\",value:8720},{name:\"uidBase\",op:1235,type:\"number\"},{name:\"fdArray\",op:1236,type:\"offset\"},{name:\"fdSelect\",op:1237,type:\"offset\"},{name:\"fontName\",op:1238,type:\"SID\"}],I2=[{name:\"subrs\",op:19,type:\"offset\",value:0},{name:\"defaultWidthX\",op:20,type:\"number\",value:0},{name:\"nominalWidthX\",op:21,type:\"number\",value:0}];function p4(e,t){var r=F2(e,0,e.byteLength);return M2(r,k2,t)}function B2(e,t,r,n){var i=F2(e,t,r);return M2(i,I2,n)}function Na(e,t,r,n){for(var i=[],s=0;s<r.length;s+=1){var o=new DataView(new Uint8Array(r[s]).buffer),a=p4(o,n);a._subrs=[],a._subrsBias=0,a._defaultWidthX=0,a._nominalWidthX=0;var l=a.private[0],u=a.private[1];if(l!==0&&u!==0){var c=B2(e,u+t,l,n);if(a._defaultWidthX=c.defaultWidthX,a._nominalWidthX=c.nominalWidthX,c.subrs!==0){var f=u+c.subrs,q=bt(e,f+t);a._subrs=q.objects,a._subrsBias=Zs(a._subrs)}a._privateDict=c}i.push(a)}return i}function h4(e,t,r,n){var i,s,o=new D.Parser(e,t);r-=1;var a=[\".notdef\"],l=o.parseCard8();if(l===0)for(var u=0;u<r;u+=1)i=o.parseSID(),a.push(Yr(n,i));else if(l===1)for(;a.length<=r;){i=o.parseSID(),s=o.parseCard8();for(var c=0;c<=s;c+=1)a.push(Yr(n,i)),i+=1}else if(l===2)for(;a.length<=r;){i=o.parseSID(),s=o.parseCard16();for(var f=0;f<=s;f+=1)a.push(Yr(n,i)),i+=1}else throw new Error(\"Unknown charset format \"+l);return a}function d4(e,t,r){var n,i={},s=new D.Parser(e,t),o=s.parseCard8();if(o===0)for(var a=s.parseCard8(),l=0;l<a;l+=1)n=s.parseCard8(),i[n]=l;else if(o===1){var u=s.parseCard8();n=1;for(var c=0;c<u;c+=1)for(var f=s.parseCard8(),q=s.parseCard8(),p=f;p<=f+q;p+=1)i[p]=n,n+=1}else throw new Error(\"Unknown encoding format \"+o);return new Ti(i,r)}function za(e,t,r){var n,i,s,o,a=new pe,l=[],u=0,c=!1,f=!1,q=0,p=0,d,v,m,h;if(e.isCIDFont){var g=e.tables.cff.topDict._fdSelect[t.index],x=e.tables.cff.topDict._fdArray[g];d=x._subrs,v=x._subrsBias,m=x._defaultWidthX,h=x._nominalWidthX}else d=e.tables.cff.topDict._subrs,v=e.tables.cff.topDict._subrsBias,m=e.tables.cff.topDict._defaultWidthX,h=e.tables.cff.topDict._nominalWidthX;var b=m;function y(S,E){f&&a.closePath(),a.moveTo(S,E),f=!0}function _(){var S;S=l.length%2!==0,S&&!c&&(b=l.shift()+h),u+=l.length>>1,l.length=0,c=!0}function T(S){for(var E,w,F,C,M,k,I,L,V,G,H,j,Y=0;Y<S.length;){var ee=S[Y];switch(Y+=1,ee){case 1:_();break;case 3:_();break;case 4:l.length>1&&!c&&(b=l.shift()+h,c=!0),p+=l.pop(),y(q,p);break;case 5:for(;l.length>0;)q+=l.shift(),p+=l.shift(),a.lineTo(q,p);break;case 6:for(;l.length>0&&(q+=l.shift(),a.lineTo(q,p),l.length!==0);)p+=l.shift(),a.lineTo(q,p);break;case 7:for(;l.length>0&&(p+=l.shift(),a.lineTo(q,p),l.length!==0);)q+=l.shift(),a.lineTo(q,p);break;case 8:for(;l.length>0;)n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 10:M=l.pop()+v,k=d[M],k&&T(k);break;case 11:return;case 12:switch(ee=S[Y],Y+=1,ee){case 35:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o+l.shift(),V=I+l.shift(),G=L+l.shift(),H=V+l.shift(),j=G+l.shift(),q=H+l.shift(),p=j+l.shift(),l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 34:n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o,V=I+l.shift(),G=o,H=V+l.shift(),j=p,q=H+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 36:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o,V=I+l.shift(),G=o,H=V+l.shift(),j=G+l.shift(),q=H+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;case 37:n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),I=s+l.shift(),L=o+l.shift(),V=I+l.shift(),G=L+l.shift(),H=V+l.shift(),j=G+l.shift(),Math.abs(H-q)>Math.abs(j-p)?q=H+l.shift():p=j+l.shift(),a.curveTo(n,i,s,o,I,L),a.curveTo(V,G,H,j,q,p);break;default:console.log(\"Glyph \"+t.index+\": unknown operator 1200\"+ee),l.length=0}break;case 14:l.length>0&&!c&&(b=l.shift()+h,c=!0),f&&(a.closePath(),f=!1);break;case 18:_();break;case 19:case 20:_(),Y+=u+7>>3;break;case 21:l.length>2&&!c&&(b=l.shift()+h,c=!0),p+=l.pop(),q+=l.pop(),y(q,p);break;case 22:l.length>1&&!c&&(b=l.shift()+h,c=!0),q+=l.pop(),y(q,p);break;case 23:_();break;case 24:for(;l.length>2;)n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);q+=l.shift(),p+=l.shift(),a.lineTo(q,p);break;case 25:for(;l.length>6;)q+=l.shift(),p+=l.shift(),a.lineTo(q,p);n=q+l.shift(),i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 26:for(l.length%2&&(q+=l.shift());l.length>0;)n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s,p=o+l.shift(),a.curveTo(n,i,s,o,q,p);break;case 27:for(l.length%2&&(p+=l.shift());l.length>0;)n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o,a.curveTo(n,i,s,o,q,p);break;case 28:E=S[Y],w=S[Y+1],l.push((E<<24|w<<16)>>16),Y+=2;break;case 29:M=l.pop()+e.gsubrsBias,k=e.gsubrs[M],k&&T(k);break;case 30:for(;l.length>0&&(n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p),l.length!==0);)n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),p=o+l.shift(),q=s+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p);break;case 31:for(;l.length>0&&(n=q+l.shift(),i=p,s=n+l.shift(),o=i+l.shift(),p=o+l.shift(),q=s+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p),l.length!==0);)n=q,i=p+l.shift(),s=n+l.shift(),o=i+l.shift(),q=s+l.shift(),p=o+(l.length===1?l.shift():0),a.curveTo(n,i,s,o,q,p);break;default:ee<32?console.log(\"Glyph \"+t.index+\": unknown operator \"+ee):ee<247?l.push(ee-139):ee<251?(E=S[Y],Y+=1,l.push((ee-247)*256+E+108)):ee<255?(E=S[Y],Y+=1,l.push(-(ee-251)*256-E-108)):(E=S[Y],w=S[Y+1],F=S[Y+2],C=S[Y+3],Y+=4,l.push((E<<24|w<<16|F<<8|C)/65536))}}}return T(r),t.advanceWidth=b,a}function m4(e,t,r,n){var i=[],s,o=new D.Parser(e,t),a=o.parseCard8();if(a===0)for(var l=0;l<r;l++){if(s=o.parseCard8(),s>=n)throw new Error(\"CFF table CID Font FDSelect has bad FD index value \"+s+\" (FD count \"+n+\")\");i.push(s)}else if(a===3){var u=o.parseCard16(),c=o.parseCard16();if(c!==0)throw new Error(\"CFF Table CID Font FDSelect format 3 range has bad initial GID \"+c);for(var f,q=0;q<u;q++){if(s=o.parseCard8(),f=o.parseCard16(),s>=n)throw new Error(\"CFF table CID Font FDSelect has bad FD index value \"+s+\" (FD count \"+n+\")\");if(f>r)throw new Error(\"CFF Table CID Font FDSelect format 3 range has bad GID \"+f);for(;c<f;c++)i.push(s);c=f}if(f!==r)throw new Error(\"CFF Table CID Font FDSelect format 3 range has bad final GID \"+f)}else throw new Error(\"CFF Table CID Font FDSelect table has unsupported format \"+a);return i}function v4(e,t,r,n){r.tables.cff={};var i=f4(e,t),s=bt(e,i.endOffset,D.bytesToString),o=bt(e,s.endOffset),a=bt(e,o.endOffset,D.bytesToString),l=bt(e,a.endOffset);r.gsubrs=l.objects,r.gsubrsBias=Zs(r.gsubrs);var u=Na(e,t,o.objects,a.objects);if(u.length!==1)throw new Error(\"CFF table has too many fonts in 'FontSet' - count of fonts NameIndex.length = \"+u.length);var c=u[0];if(r.tables.cff.topDict=c,c._privateDict&&(r.defaultWidthX=c._privateDict.defaultWidthX,r.nominalWidthX=c._privateDict.nominalWidthX),c.ros[0]!==void 0&&c.ros[1]!==void 0&&(r.isCIDFont=!0),r.isCIDFont){var f=c.fdArray,q=c.fdSelect;if(f===0||q===0)throw new Error(\"Font is marked as a CID font, but FDArray and/or FDSelect information is missing\");f+=t;var p=bt(e,f),d=Na(e,t,p.objects,a.objects);c._fdArray=d,q+=t,c._fdSelect=m4(e,q,r.numGlyphs,d.length)}var v=t+c.private[1],m=B2(e,v,c.private[0],a.objects);if(r.defaultWidthX=m.defaultWidthX,r.nominalWidthX=m.nominalWidthX,m.subrs!==0){var h=v+m.subrs,g=bt(e,h);r.subrs=g.objects,r.subrsBias=Zs(r.subrs)}else r.subrs=[],r.subrsBias=0;var x;n.lowMemory?(x=a4(e,t+c.charStrings),r.nGlyphs=x.offsets.length):(x=bt(e,t+c.charStrings),r.nGlyphs=x.objects.length);var b=h4(e,t+c.charset,r.nGlyphs,a.objects);if(c.encoding===0?r.cffEncoding=new Ti(Q5,b):c.encoding===1?r.cffEncoding=new Ti(J5,b):r.cffEncoding=d4(e,t+c.encoding,b),r.encoding=r.encoding||r.cffEncoding,r.glyphs=new Ye.GlyphSet(r),n.lowMemory)r._push=function(T){var S=l4(T,x.offsets,e,t+c.charStrings);r.glyphs.push(T,Ye.cffGlyphLoader(r,T,za,S))};else for(var y=0;y<r.nGlyphs;y+=1){var _=x.objects[y];r.glyphs.push(y,Ye.cffGlyphLoader(r,y,za,_))}}function R2(e,t){var r,n=mi.indexOf(e);return n>=0&&(r=n),n=t.indexOf(e),n>=0?r=n+mi.length:(r=mi.length+t.length,t.push(e)),r}function g4(){return new U.Record(\"Header\",[{name:\"major\",type:\"Card8\",value:1},{name:\"minor\",type:\"Card8\",value:0},{name:\"hdrSize\",type:\"Card8\",value:4},{name:\"major\",type:\"Card8\",value:1}])}function x4(e){var t=new U.Record(\"Name INDEX\",[{name:\"names\",type:\"INDEX\",value:[]}]);t.names=[];for(var r=0;r<e.length;r+=1)t.names.push({name:\"name_\"+r,type:\"NAME\",value:e[r]});return t}function U2(e,t,r){for(var n={},i=0;i<e.length;i+=1){var s=e[i],o=t[s.name];o!==void 0&&!C2(o,s.value)&&(s.type===\"SID\"&&(o=R2(o,r)),n[s.op]={name:s.name,type:s.type,value:o})}return n}function Ga(e,t){var r=new U.Record(\"Top DICT\",[{name:\"dict\",type:\"DICT\",value:{}}]);return r.dict=U2(k2,e,t),r}function Va(e){var t=new U.Record(\"Top DICT INDEX\",[{name:\"topDicts\",type:\"INDEX\",value:[]}]);return t.topDicts=[{name:\"topDict_0\",type:\"TABLE\",value:e}],t}function y4(e){var t=new U.Record(\"String INDEX\",[{name:\"strings\",type:\"INDEX\",value:[]}]);t.strings=[];for(var r=0;r<e.length;r+=1)t.strings.push({name:\"string_\"+r,type:\"STRING\",value:e[r]});return t}function b4(){return new U.Record(\"Global Subr INDEX\",[{name:\"subrs\",type:\"INDEX\",value:[]}])}function S4(e,t){for(var r=new U.Record(\"Charsets\",[{name:\"format\",type:\"Card8\",value:0}]),n=0;n<e.length;n+=1){var i=e[n],s=R2(i,t);r.fields.push({name:\"glyph_\"+n,type:\"SID\",value:s})}return r}function T4(e){var t=[],r=e.path;t.push({name:\"width\",type:\"NUMBER\",value:e.advanceWidth});for(var n=0,i=0,s=0;s<r.commands.length;s+=1){var o=void 0,a=void 0,l=r.commands[s];if(l.type===\"Q\"){var u=.3333333333333333,c=2/3;l={type:\"C\",x:l.x,y:l.y,x1:Math.round(u*n+c*l.x1),y1:Math.round(u*i+c*l.y1),x2:Math.round(u*l.x+c*l.x1),y2:Math.round(u*l.y+c*l.y1)}}if(l.type===\"M\")o=Math.round(l.x-n),a=Math.round(l.y-i),t.push({name:\"dx\",type:\"NUMBER\",value:o}),t.push({name:\"dy\",type:\"NUMBER\",value:a}),t.push({name:\"rmoveto\",type:\"OP\",value:21}),n=Math.round(l.x),i=Math.round(l.y);else if(l.type===\"L\")o=Math.round(l.x-n),a=Math.round(l.y-i),t.push({name:\"dx\",type:\"NUMBER\",value:o}),t.push({name:\"dy\",type:\"NUMBER\",value:a}),t.push({name:\"rlineto\",type:\"OP\",value:5}),n=Math.round(l.x),i=Math.round(l.y);else if(l.type===\"C\"){var f=Math.round(l.x1-n),q=Math.round(l.y1-i),p=Math.round(l.x2-l.x1),d=Math.round(l.y2-l.y1);o=Math.round(l.x-l.x2),a=Math.round(l.y-l.y2),t.push({name:\"dx1\",type:\"NUMBER\",value:f}),t.push({name:\"dy1\",type:\"NUMBER\",value:q}),t.push({name:\"dx2\",type:\"NUMBER\",value:p}),t.push({name:\"dy2\",type:\"NUMBER\",value:d}),t.push({name:\"dx\",type:\"NUMBER\",value:o}),t.push({name:\"dy\",type:\"NUMBER\",value:a}),t.push({name:\"rrcurveto\",type:\"OP\",value:8}),n=Math.round(l.x),i=Math.round(l.y)}}return t.push({name:\"endchar\",type:\"OP\",value:14}),t}function _4(e){for(var t=new U.Record(\"CharStrings INDEX\",[{name:\"charStrings\",type:\"INDEX\",value:[]}]),r=0;r<e.length;r+=1){var n=e.get(r),i=T4(n);t.charStrings.push({name:n.name,type:\"CHARSTRING\",value:i})}return t}function w4(e,t){var r=new U.Record(\"Private DICT\",[{name:\"dict\",type:\"DICT\",value:{}}]);return r.dict=U2(I2,e,t),r}function E4(e,t){for(var r=new U.Table(\"CFF \",[{name:\"header\",type:\"RECORD\"},{name:\"nameIndex\",type:\"RECORD\"},{name:\"topDictIndex\",type:\"RECORD\"},{name:\"stringIndex\",type:\"RECORD\"},{name:\"globalSubrIndex\",type:\"RECORD\"},{name:\"charsets\",type:\"RECORD\"},{name:\"charStringsIndex\",type:\"RECORD\"},{name:\"privateDict\",type:\"RECORD\"}]),n=1/t.unitsPerEm,i={version:t.version,fullName:t.fullName,familyName:t.familyName,weight:t.weightName,fontBBox:t.fontBBox||[0,0,0,0],fontMatrix:[n,0,0,n,0,0],charset:999,encoding:0,charStrings:999,private:[0,999]},s={},o=[],a,l=1;l<e.length;l+=1)a=e.get(l),o.push(a.name);var u=[];r.header=g4(),r.nameIndex=x4([t.postScriptName]);var c=Ga(i,u);r.topDictIndex=Va(c),r.globalSubrIndex=b4(),r.charsets=S4(o,u),r.charStringsIndex=_4(e),r.privateDict=w4(s,u),r.stringIndex=y4(u);var f=r.header.sizeOf()+r.nameIndex.sizeOf()+r.topDictIndex.sizeOf()+r.stringIndex.sizeOf()+r.globalSubrIndex.sizeOf();return i.charset=f,i.encoding=0,i.charStrings=i.charset+r.charsets.sizeOf(),i.private[1]=i.charStrings+r.charStringsIndex.sizeOf(),c=Ga(i,u),r.topDictIndex=Va(c),r}var O2={parse:v4,make:E4};function A4(e,t){var r={},n=new D.Parser(e,t);return r.version=n.parseVersion(),r.fontRevision=Math.round(n.parseFixed()*1e3)/1e3,r.checkSumAdjustment=n.parseULong(),r.magicNumber=n.parseULong(),N.argument(r.magicNumber===1594834165,\"Font header has wrong magic number.\"),r.flags=n.parseUShort(),r.unitsPerEm=n.parseUShort(),r.created=n.parseLongDateTime(),r.modified=n.parseLongDateTime(),r.xMin=n.parseShort(),r.yMin=n.parseShort(),r.xMax=n.parseShort(),r.yMax=n.parseShort(),r.macStyle=n.parseUShort(),r.lowestRecPPEM=n.parseUShort(),r.fontDirectionHint=n.parseShort(),r.indexToLocFormat=n.parseShort(),r.glyphDataFormat=n.parseShort(),r}function C4(e){var t=Math.round(new Date().getTime()/1e3)+2082844800,r=t;return e.createdTimestamp&&(r=e.createdTimestamp+2082844800),new U.Table(\"head\",[{name:\"version\",type:\"FIXED\",value:65536},{name:\"fontRevision\",type:\"FIXED\",value:65536},{name:\"checkSumAdjustment\",type:\"ULONG\",value:0},{name:\"magicNumber\",type:\"ULONG\",value:1594834165},{name:\"flags\",type:\"USHORT\",value:0},{name:\"unitsPerEm\",type:\"USHORT\",value:1e3},{name:\"created\",type:\"LONGDATETIME\",value:r},{name:\"modified\",type:\"LONGDATETIME\",value:t},{name:\"xMin\",type:\"SHORT\",value:0},{name:\"yMin\",type:\"SHORT\",value:0},{name:\"xMax\",type:\"SHORT\",value:0},{name:\"yMax\",type:\"SHORT\",value:0},{name:\"macStyle\",type:\"USHORT\",value:0},{name:\"lowestRecPPEM\",type:\"USHORT\",value:0},{name:\"fontDirectionHint\",type:\"SHORT\",value:2},{name:\"indexToLocFormat\",type:\"SHORT\",value:0},{name:\"glyphDataFormat\",type:\"SHORT\",value:0}],e)}var D2={parse:A4,make:C4};function F4(e,t){var r={},n=new D.Parser(e,t);return r.version=n.parseVersion(),r.ascender=n.parseShort(),r.descender=n.parseShort(),r.lineGap=n.parseShort(),r.advanceWidthMax=n.parseUShort(),r.minLeftSideBearing=n.parseShort(),r.minRightSideBearing=n.parseShort(),r.xMaxExtent=n.parseShort(),r.caretSlopeRise=n.parseShort(),r.caretSlopeRun=n.parseShort(),r.caretOffset=n.parseShort(),n.relativeOffset+=8,r.metricDataFormat=n.parseShort(),r.numberOfHMetrics=n.parseUShort(),r}function M4(e){return new U.Table(\"hhea\",[{name:\"version\",type:\"FIXED\",value:65536},{name:\"ascender\",type:\"FWORD\",value:0},{name:\"descender\",type:\"FWORD\",value:0},{name:\"lineGap\",type:\"FWORD\",value:0},{name:\"advanceWidthMax\",type:\"UFWORD\",value:0},{name:\"minLeftSideBearing\",type:\"FWORD\",value:0},{name:\"minRightSideBearing\",type:\"FWORD\",value:0},{name:\"xMaxExtent\",type:\"FWORD\",value:0},{name:\"caretSlopeRise\",type:\"SHORT\",value:1},{name:\"caretSlopeRun\",type:\"SHORT\",value:0},{name:\"caretOffset\",type:\"SHORT\",value:0},{name:\"reserved1\",type:\"SHORT\",value:0},{name:\"reserved2\",type:\"SHORT\",value:0},{name:\"reserved3\",type:\"SHORT\",value:0},{name:\"reserved4\",type:\"SHORT\",value:0},{name:\"metricDataFormat\",type:\"SHORT\",value:0},{name:\"numberOfHMetrics\",type:\"USHORT\",value:0}],e)}var L2={parse:F4,make:M4};function k4(e,t,r,n,i){for(var s,o,a=new D.Parser(e,t),l=0;l<n;l+=1){l<r&&(s=a.parseUShort(),o=a.parseShort());var u=i.get(l);u.advanceWidth=s,u.leftSideBearing=o}}function I4(e,t,r,n,i){e._hmtxTableData={};for(var s,o,a=new D.Parser(t,r),l=0;l<i;l+=1)l<n&&(s=a.parseUShort(),o=a.parseShort()),e._hmtxTableData[l]={advanceWidth:s,leftSideBearing:o}}function B4(e,t,r,n,i,s,o){o.lowMemory?I4(e,t,r,n,i):k4(t,r,n,i,s)}function R4(e){for(var t=new U.Table(\"hmtx\",[]),r=0;r<e.length;r+=1){var n=e.get(r),i=n.advanceWidth||0,s=n.leftSideBearing||0;t.fields.push({name:\"advanceWidth_\"+r,type:\"USHORT\",value:i}),t.fields.push({name:\"leftSideBearing_\"+r,type:\"SHORT\",value:s})}return t}var P2={parse:B4,make:R4};function U4(e){for(var t=new U.Table(\"ltag\",[{name:\"version\",type:\"ULONG\",value:1},{name:\"flags\",type:\"ULONG\",value:0},{name:\"numTags\",type:\"ULONG\",value:e.length}]),r=\"\",n=12+e.length*4,i=0;i<e.length;++i){var s=r.indexOf(e[i]);s<0&&(s=r.length,r+=e[i]),t.fields.push({name:\"offset \"+i,type:\"USHORT\",value:n+s}),t.fields.push({name:\"length \"+i,type:\"USHORT\",value:e[i].length})}return t.fields.push({name:\"stringPool\",type:\"CHARARRAY\",value:r}),t}function O4(e,t){var r=new D.Parser(e,t),n=r.parseULong();N.argument(n===1,\"Unsupported ltag table version.\"),r.skip(\"uLong\",1);for(var i=r.parseULong(),s=[],o=0;o<i;o++){for(var a=\"\",l=t+r.parseUShort(),u=r.parseUShort(),c=l;c<l+u;++c)a+=String.fromCharCode(e.getInt8(c));s.push(a)}return s}var N2={make:U4,parse:O4};function D4(e,t){var r={},n=new D.Parser(e,t);return r.version=n.parseVersion(),r.numGlyphs=n.parseUShort(),r.version===1&&(r.maxPoints=n.parseUShort(),r.maxContours=n.parseUShort(),r.maxCompositePoints=n.parseUShort(),r.maxCompositeContours=n.parseUShort(),r.maxZones=n.parseUShort(),r.maxTwilightPoints=n.parseUShort(),r.maxStorage=n.parseUShort(),r.maxFunctionDefs=n.parseUShort(),r.maxInstructionDefs=n.parseUShort(),r.maxStackElements=n.parseUShort(),r.maxSizeOfInstructions=n.parseUShort(),r.maxComponentElements=n.parseUShort(),r.maxComponentDepth=n.parseUShort()),r}function L4(e){return new U.Table(\"maxp\",[{name:\"version\",type:\"FIXED\",value:20480},{name:\"numGlyphs\",type:\"USHORT\",value:e}])}var z2={parse:D4,make:L4},G2=[\"copyright\",\"fontFamily\",\"fontSubfamily\",\"uniqueID\",\"fullName\",\"version\",\"postScriptName\",\"trademark\",\"manufacturer\",\"designer\",\"description\",\"manufacturerURL\",\"designerURL\",\"license\",\"licenseURL\",\"reserved\",\"preferredFamily\",\"preferredSubfamily\",\"compatibleFullName\",\"sampleText\",\"postScriptFindFontName\",\"wwsFamily\",\"wwsSubfamily\"],V2={0:\"en\",1:\"fr\",2:\"de\",3:\"it\",4:\"nl\",5:\"sv\",6:\"es\",7:\"da\",8:\"pt\",9:\"no\",10:\"he\",11:\"ja\",12:\"ar\",13:\"fi\",14:\"el\",15:\"is\",16:\"mt\",17:\"tr\",18:\"hr\",19:\"zh-Hant\",20:\"ur\",21:\"hi\",22:\"th\",23:\"ko\",24:\"lt\",25:\"pl\",26:\"hu\",27:\"es\",28:\"lv\",29:\"se\",30:\"fo\",31:\"fa\",32:\"ru\",33:\"zh\",34:\"nl-BE\",35:\"ga\",36:\"sq\",37:\"ro\",38:\"cz\",39:\"sk\",40:\"si\",41:\"yi\",42:\"sr\",43:\"mk\",44:\"bg\",45:\"uk\",46:\"be\",47:\"uz\",48:\"kk\",49:\"az-Cyrl\",50:\"az-Arab\",51:\"hy\",52:\"ka\",53:\"mo\",54:\"ky\",55:\"tg\",56:\"tk\",57:\"mn-CN\",58:\"mn\",59:\"ps\",60:\"ks\",61:\"ku\",62:\"sd\",63:\"bo\",64:\"ne\",65:\"sa\",66:\"mr\",67:\"bn\",68:\"as\",69:\"gu\",70:\"pa\",71:\"or\",72:\"ml\",73:\"kn\",74:\"ta\",75:\"te\",76:\"si\",77:\"my\",78:\"km\",79:\"lo\",80:\"vi\",81:\"id\",82:\"tl\",83:\"ms\",84:\"ms-Arab\",85:\"am\",86:\"ti\",87:\"om\",88:\"so\",89:\"sw\",90:\"rw\",91:\"rn\",92:\"ny\",93:\"mg\",94:\"eo\",128:\"cy\",129:\"eu\",130:\"ca\",131:\"la\",132:\"qu\",133:\"gn\",134:\"ay\",135:\"tt\",136:\"ug\",137:\"dz\",138:\"jv\",139:\"su\",140:\"gl\",141:\"af\",142:\"br\",143:\"iu\",144:\"gd\",145:\"gv\",146:\"ga\",147:\"to\",148:\"el-polyton\",149:\"kl\",150:\"az\",151:\"nn\"},P4={0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:5,11:1,12:4,13:0,14:6,15:0,16:0,17:0,18:0,19:2,20:4,21:9,22:21,23:3,24:29,25:29,26:29,27:29,28:29,29:0,30:0,31:4,32:7,33:25,34:0,35:0,36:0,37:0,38:29,39:29,40:0,41:5,42:7,43:7,44:7,45:7,46:7,47:7,48:7,49:7,50:4,51:24,52:23,53:7,54:7,55:7,56:7,57:27,58:7,59:4,60:4,61:4,62:4,63:26,64:9,65:9,66:9,67:13,68:13,69:11,70:10,71:12,72:17,73:16,74:14,75:15,76:18,77:19,78:20,79:22,80:30,81:0,82:0,83:0,84:4,85:28,86:28,87:28,88:0,89:0,90:0,91:0,92:0,93:0,94:0,128:0,129:0,130:0,131:0,132:0,133:0,134:0,135:7,136:4,137:26,138:0,139:0,140:0,141:0,142:0,143:28,144:0,145:0,146:0,147:0,148:6,149:0,150:0,151:0},H2={1078:\"af\",1052:\"sq\",1156:\"gsw\",1118:\"am\",5121:\"ar-DZ\",15361:\"ar-BH\",3073:\"ar\",2049:\"ar-IQ\",11265:\"ar-JO\",13313:\"ar-KW\",12289:\"ar-LB\",4097:\"ar-LY\",6145:\"ary\",8193:\"ar-OM\",16385:\"ar-QA\",1025:\"ar-SA\",10241:\"ar-SY\",7169:\"aeb\",14337:\"ar-AE\",9217:\"ar-YE\",1067:\"hy\",1101:\"as\",2092:\"az-Cyrl\",1068:\"az\",1133:\"ba\",1069:\"eu\",1059:\"be\",2117:\"bn\",1093:\"bn-IN\",8218:\"bs-Cyrl\",5146:\"bs\",1150:\"br\",1026:\"bg\",1027:\"ca\",3076:\"zh-HK\",5124:\"zh-MO\",2052:\"zh\",4100:\"zh-SG\",1028:\"zh-TW\",1155:\"co\",1050:\"hr\",4122:\"hr-BA\",1029:\"cs\",1030:\"da\",1164:\"prs\",1125:\"dv\",2067:\"nl-BE\",1043:\"nl\",3081:\"en-AU\",10249:\"en-BZ\",4105:\"en-CA\",9225:\"en-029\",16393:\"en-IN\",6153:\"en-IE\",8201:\"en-JM\",17417:\"en-MY\",5129:\"en-NZ\",13321:\"en-PH\",18441:\"en-SG\",7177:\"en-ZA\",11273:\"en-TT\",2057:\"en-GB\",1033:\"en\",12297:\"en-ZW\",1061:\"et\",1080:\"fo\",1124:\"fil\",1035:\"fi\",2060:\"fr-BE\",3084:\"fr-CA\",1036:\"fr\",5132:\"fr-LU\",6156:\"fr-MC\",4108:\"fr-CH\",1122:\"fy\",1110:\"gl\",1079:\"ka\",3079:\"de-AT\",1031:\"de\",5127:\"de-LI\",4103:\"de-LU\",2055:\"de-CH\",1032:\"el\",1135:\"kl\",1095:\"gu\",1128:\"ha\",1037:\"he\",1081:\"hi\",1038:\"hu\",1039:\"is\",1136:\"ig\",1057:\"id\",1117:\"iu\",2141:\"iu-Latn\",2108:\"ga\",1076:\"xh\",1077:\"zu\",1040:\"it\",2064:\"it-CH\",1041:\"ja\",1099:\"kn\",1087:\"kk\",1107:\"km\",1158:\"quc\",1159:\"rw\",1089:\"sw\",1111:\"kok\",1042:\"ko\",1088:\"ky\",1108:\"lo\",1062:\"lv\",1063:\"lt\",2094:\"dsb\",1134:\"lb\",1071:\"mk\",2110:\"ms-BN\",1086:\"ms\",1100:\"ml\",1082:\"mt\",1153:\"mi\",1146:\"arn\",1102:\"mr\",1148:\"moh\",1104:\"mn\",2128:\"mn-CN\",1121:\"ne\",1044:\"nb\",2068:\"nn\",1154:\"oc\",1096:\"or\",1123:\"ps\",1045:\"pl\",1046:\"pt\",2070:\"pt-PT\",1094:\"pa\",1131:\"qu-BO\",2155:\"qu-EC\",3179:\"qu\",1048:\"ro\",1047:\"rm\",1049:\"ru\",9275:\"smn\",4155:\"smj-NO\",5179:\"smj\",3131:\"se-FI\",1083:\"se\",2107:\"se-SE\",8251:\"sms\",6203:\"sma-NO\",7227:\"sms\",1103:\"sa\",7194:\"sr-Cyrl-BA\",3098:\"sr\",6170:\"sr-Latn-BA\",2074:\"sr-Latn\",1132:\"nso\",1074:\"tn\",1115:\"si\",1051:\"sk\",1060:\"sl\",11274:\"es-AR\",16394:\"es-BO\",13322:\"es-CL\",9226:\"es-CO\",5130:\"es-CR\",7178:\"es-DO\",12298:\"es-EC\",17418:\"es-SV\",4106:\"es-GT\",18442:\"es-HN\",2058:\"es-MX\",19466:\"es-NI\",6154:\"es-PA\",15370:\"es-PY\",10250:\"es-PE\",20490:\"es-PR\",3082:\"es\",1034:\"es\",21514:\"es-US\",14346:\"es-UY\",8202:\"es-VE\",2077:\"sv-FI\",1053:\"sv\",1114:\"syr\",1064:\"tg\",2143:\"tzm\",1097:\"ta\",1092:\"tt\",1098:\"te\",1054:\"th\",1105:\"bo\",1055:\"tr\",1090:\"tk\",1152:\"ug\",1058:\"uk\",1070:\"hsb\",1056:\"ur\",2115:\"uz-Cyrl\",1091:\"uz\",1066:\"vi\",1106:\"cy\",1160:\"wo\",1157:\"sah\",1144:\"ii\",1130:\"yo\"};function N4(e,t,r){switch(e){case 0:if(t===65535)return\"und\";if(r)return r[t];break;case 1:return V2[t];case 3:return H2[t]}}var Qs=\"utf-16\",z4={0:\"macintosh\",1:\"x-mac-japanese\",2:\"x-mac-chinesetrad\",3:\"x-mac-korean\",6:\"x-mac-greek\",7:\"x-mac-cyrillic\",9:\"x-mac-devanagai\",10:\"x-mac-gurmukhi\",11:\"x-mac-gujarati\",12:\"x-mac-oriya\",13:\"x-mac-bengali\",14:\"x-mac-tamil\",15:\"x-mac-telugu\",16:\"x-mac-kannada\",17:\"x-mac-malayalam\",18:\"x-mac-sinhalese\",19:\"x-mac-burmese\",20:\"x-mac-khmer\",21:\"x-mac-thai\",22:\"x-mac-lao\",23:\"x-mac-georgian\",24:\"x-mac-armenian\",25:\"x-mac-chinesesimp\",26:\"x-mac-tibetan\",27:\"x-mac-mongolian\",28:\"x-mac-ethiopic\",29:\"x-mac-ce\",30:\"x-mac-vietnamese\",31:\"x-mac-extarabic\"},G4={15:\"x-mac-icelandic\",17:\"x-mac-turkish\",18:\"x-mac-croatian\",24:\"x-mac-ce\",25:\"x-mac-ce\",26:\"x-mac-ce\",27:\"x-mac-ce\",28:\"x-mac-ce\",30:\"x-mac-icelandic\",37:\"x-mac-romanian\",38:\"x-mac-ce\",39:\"x-mac-ce\",40:\"x-mac-ce\",143:\"x-mac-inuit\",146:\"x-mac-gaelic\"};function W2(e,t,r){switch(e){case 0:return Qs;case 1:return G4[r]||z4[t];case 3:if(t===1||t===10)return Qs;break}}function V4(e,t,r){for(var n={},i=new D.Parser(e,t),s=i.parseUShort(),o=i.parseUShort(),a=i.offset+i.parseUShort(),l=0;l<o;l++){var u=i.parseUShort(),c=i.parseUShort(),f=i.parseUShort(),q=i.parseUShort(),p=G2[q]||q,d=i.parseUShort(),v=i.parseUShort(),m=N4(u,f,r),h=W2(u,c,f);if(h!==void 0&&m!==void 0){var g=void 0;if(h===Qs?g=pr.UTF16(e,a+v,d):g=pr.MACSTRING(e,a+v,d,h),g){var x=n[p];x===void 0&&(x=n[p]={}),x[m]=g}}}var b=0;return s===1&&(b=i.parseUShort()),n}function Ls(e){var t={};for(var r in e)t[e[r]]=parseInt(r);return t}function Ha(e,t,r,n,i,s){return new U.Record(\"NameRecord\",[{name:\"platformID\",type:\"USHORT\",value:e},{name:\"encodingID\",type:\"USHORT\",value:t},{name:\"languageID\",type:\"USHORT\",value:r},{name:\"nameID\",type:\"USHORT\",value:n},{name:\"length\",type:\"USHORT\",value:i},{name:\"offset\",type:\"USHORT\",value:s}])}function H4(e,t){var r=e.length,n=t.length-r+1;e:for(var i=0;i<n;i++)for(;i<n;i++){for(var s=0;s<r;s++)if(t[i+s]!==e[s])continue e;return i}return-1}function Wa(e,t){var r=H4(e,t);if(r<0){r=t.length;for(var n=0,i=e.length;n<i;++n)t.push(e[n])}return r}function W4(e,t){var r,n=[],i={},s=Ls(G2);for(var o in e){var a=s[o];if(a===void 0&&(a=o),r=parseInt(a),isNaN(r))throw new Error('Name table entry \"'+o+'\" does not exist, see nameTableNames for complete list.');i[r]=e[o],n.push(r)}for(var l=Ls(V2),u=Ls(H2),c=[],f=[],q=0;q<n.length;q++){r=n[q];var p=i[r];for(var d in p){var v=p[d],m=1,h=l[d],g=P4[h],x=W2(m,g,h),b=R.MACSTRING(v,x);b===void 0&&(m=0,h=t.indexOf(d),h<0&&(h=t.length,t.push(d)),g=4,b=R.UTF16(v));var y=Wa(b,f);c.push(Ha(m,g,h,r,b.length,y));var _=u[d];if(_!==void 0){var T=R.UTF16(v),S=Wa(T,f);c.push(Ha(3,1,_,r,T.length,S))}}}c.sort(function(F,C){return F.platformID-C.platformID||F.encodingID-C.encodingID||F.languageID-C.languageID||F.nameID-C.nameID});for(var E=new U.Table(\"name\",[{name:\"format\",type:\"USHORT\",value:0},{name:\"count\",type:\"USHORT\",value:c.length},{name:\"stringOffset\",type:\"USHORT\",value:6+c.length*12}]),w=0;w<c.length;w++)E.fields.push({name:\"record_\"+w,type:\"RECORD\",value:c[w]});return E.fields.push({name:\"strings\",type:\"LITERAL\",value:f}),E}var X2={parse:V4,make:W4},Js=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];function X4(e){for(var t=0;t<Js.length;t+=1){var r=Js[t];if(e>=r.begin&&e<r.end)return t}return-1}function j4(e,t){var r={},n=new D.Parser(e,t);r.version=n.parseUShort(),r.xAvgCharWidth=n.parseShort(),r.usWeightClass=n.parseUShort(),r.usWidthClass=n.parseUShort(),r.fsType=n.parseUShort(),r.ySubscriptXSize=n.parseShort(),r.ySubscriptYSize=n.parseShort(),r.ySubscriptXOffset=n.parseShort(),r.ySubscriptYOffset=n.parseShort(),r.ySuperscriptXSize=n.parseShort(),r.ySuperscriptYSize=n.parseShort(),r.ySuperscriptXOffset=n.parseShort(),r.ySuperscriptYOffset=n.parseShort(),r.yStrikeoutSize=n.parseShort(),r.yStrikeoutPosition=n.parseShort(),r.sFamilyClass=n.parseShort(),r.panose=[];for(var i=0;i<10;i++)r.panose[i]=n.parseByte();return r.ulUnicodeRange1=n.parseULong(),r.ulUnicodeRange2=n.parseULong(),r.ulUnicodeRange3=n.parseULong(),r.ulUnicodeRange4=n.parseULong(),r.achVendID=String.fromCharCode(n.parseByte(),n.parseByte(),n.parseByte(),n.parseByte()),r.fsSelection=n.parseUShort(),r.usFirstCharIndex=n.parseUShort(),r.usLastCharIndex=n.parseUShort(),r.sTypoAscender=n.parseShort(),r.sTypoDescender=n.parseShort(),r.sTypoLineGap=n.parseShort(),r.usWinAscent=n.parseUShort(),r.usWinDescent=n.parseUShort(),r.version>=1&&(r.ulCodePageRange1=n.parseULong(),r.ulCodePageRange2=n.parseULong()),r.version>=2&&(r.sxHeight=n.parseShort(),r.sCapHeight=n.parseShort(),r.usDefaultChar=n.parseUShort(),r.usBreakChar=n.parseUShort(),r.usMaxContent=n.parseUShort()),r}function Y4(e){return new U.Table(\"OS/2\",[{name:\"version\",type:\"USHORT\",value:3},{name:\"xAvgCharWidth\",type:\"SHORT\",value:0},{name:\"usWeightClass\",type:\"USHORT\",value:0},{name:\"usWidthClass\",type:\"USHORT\",value:0},{name:\"fsType\",type:\"USHORT\",value:0},{name:\"ySubscriptXSize\",type:\"SHORT\",value:650},{name:\"ySubscriptYSize\",type:\"SHORT\",value:699},{name:\"ySubscriptXOffset\",type:\"SHORT\",value:0},{name:\"ySubscriptYOffset\",type:\"SHORT\",value:140},{name:\"ySuperscriptXSize\",type:\"SHORT\",value:650},{name:\"ySuperscriptYSize\",type:\"SHORT\",value:699},{name:\"ySuperscriptXOffset\",type:\"SHORT\",value:0},{name:\"ySuperscriptYOffset\",type:\"SHORT\",value:479},{name:\"yStrikeoutSize\",type:\"SHORT\",value:49},{name:\"yStrikeoutPosition\",type:\"SHORT\",value:258},{name:\"sFamilyClass\",type:\"SHORT\",value:0},{name:\"bFamilyType\",type:\"BYTE\",value:0},{name:\"bSerifStyle\",type:\"BYTE\",value:0},{name:\"bWeight\",type:\"BYTE\",value:0},{name:\"bProportion\",type:\"BYTE\",value:0},{name:\"bContrast\",type:\"BYTE\",value:0},{name:\"bStrokeVariation\",type:\"BYTE\",value:0},{name:\"bArmStyle\",type:\"BYTE\",value:0},{name:\"bLetterform\",type:\"BYTE\",value:0},{name:\"bMidline\",type:\"BYTE\",value:0},{name:\"bXHeight\",type:\"BYTE\",value:0},{name:\"ulUnicodeRange1\",type:\"ULONG\",value:0},{name:\"ulUnicodeRange2\",type:\"ULONG\",value:0},{name:\"ulUnicodeRange3\",type:\"ULONG\",value:0},{name:\"ulUnicodeRange4\",type:\"ULONG\",value:0},{name:\"achVendID\",type:\"CHARARRAY\",value:\"XXXX\"},{name:\"fsSelection\",type:\"USHORT\",value:0},{name:\"usFirstCharIndex\",type:\"USHORT\",value:0},{name:\"usLastCharIndex\",type:\"USHORT\",value:0},{name:\"sTypoAscender\",type:\"SHORT\",value:0},{name:\"sTypoDescender\",type:\"SHORT\",value:0},{name:\"sTypoLineGap\",type:\"SHORT\",value:0},{name:\"usWinAscent\",type:\"USHORT\",value:0},{name:\"usWinDescent\",type:\"USHORT\",value:0},{name:\"ulCodePageRange1\",type:\"ULONG\",value:0},{name:\"ulCodePageRange2\",type:\"ULONG\",value:0},{name:\"sxHeight\",type:\"SHORT\",value:0},{name:\"sCapHeight\",type:\"SHORT\",value:0},{name:\"usDefaultChar\",type:\"USHORT\",value:0},{name:\"usBreakChar\",type:\"USHORT\",value:0},{name:\"usMaxContext\",type:\"USHORT\",value:0}],e)}var $s={parse:j4,make:Y4,unicodeRanges:Js,getUnicodeRange:X4};function K4(e,t){var r={},n=new D.Parser(e,t);switch(r.version=n.parseVersion(),r.italicAngle=n.parseFixed(),r.underlinePosition=n.parseShort(),r.underlineThickness=n.parseShort(),r.isFixedPitch=n.parseULong(),r.minMemType42=n.parseULong(),r.maxMemType42=n.parseULong(),r.minMemType1=n.parseULong(),r.maxMemType1=n.parseULong(),r.version){case 1:r.names=Pt.slice();break;case 2:r.numberOfGlyphs=n.parseUShort(),r.glyphNameIndex=new Array(r.numberOfGlyphs);for(var i=0;i<r.numberOfGlyphs;i++)r.glyphNameIndex[i]=n.parseUShort();r.names=[];for(var s=0;s<r.numberOfGlyphs;s++)if(r.glyphNameIndex[s]>=Pt.length){var o=n.parseChar();r.names.push(n.parseString(o))}break;case 2.5:r.numberOfGlyphs=n.parseUShort(),r.offset=new Array(r.numberOfGlyphs);for(var a=0;a<r.numberOfGlyphs;a++)r.offset[a]=n.parseChar();break}return r}function Z4(){return new U.Table(\"post\",[{name:\"version\",type:\"FIXED\",value:196608},{name:\"italicAngle\",type:\"FIXED\",value:0},{name:\"underlinePosition\",type:\"FWORD\",value:0},{name:\"underlineThickness\",type:\"FWORD\",value:0},{name:\"isFixedPitch\",type:\"ULONG\",value:0},{name:\"minMemType42\",type:\"ULONG\",value:0},{name:\"maxMemType42\",type:\"ULONG\",value:0},{name:\"minMemType1\",type:\"ULONG\",value:0},{name:\"maxMemType1\",type:\"ULONG\",value:0}])}var j2={parse:K4,make:Z4},De=new Array(9);De[1]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();if(r===1)return{substFormat:1,coverage:this.parsePointer(A.coverage),deltaGlyphId:this.parseUShort()};if(r===2)return{substFormat:2,coverage:this.parsePointer(A.coverage),substitute:this.parseOffset16List()};N.assert(!1,\"0x\"+t.toString(16)+\": lookup type 1 format must be 1 or 2.\")};De[2]=function(){var t=this.parseUShort();return N.argument(t===1,\"GSUB Multiple Substitution Subtable identifier-format must be 1\"),{substFormat:t,coverage:this.parsePointer(A.coverage),sequences:this.parseListOfLists()}};De[3]=function(){var t=this.parseUShort();return N.argument(t===1,\"GSUB Alternate Substitution Subtable identifier-format must be 1\"),{substFormat:t,coverage:this.parsePointer(A.coverage),alternateSets:this.parseListOfLists()}};De[4]=function(){var t=this.parseUShort();return N.argument(t===1,\"GSUB ligature table identifier-format must be 1\"),{substFormat:t,coverage:this.parsePointer(A.coverage),ligatureSets:this.parseListOfLists(function(){return{ligGlyph:this.parseUShort(),components:this.parseUShortList(this.parseUShort()-1)}})}};var fr={sequenceIndex:A.uShort,lookupListIndex:A.uShort};De[5]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();if(r===1)return{substFormat:r,coverage:this.parsePointer(A.coverage),ruleSets:this.parseListOfLists(function(){var s=this.parseUShort(),o=this.parseUShort();return{input:this.parseUShortList(s-1),lookupRecords:this.parseRecordList(o,fr)}})};if(r===2)return{substFormat:r,coverage:this.parsePointer(A.coverage),classDef:this.parsePointer(A.classDef),classSets:this.parseListOfLists(function(){var s=this.parseUShort(),o=this.parseUShort();return{classes:this.parseUShortList(s-1),lookupRecords:this.parseRecordList(o,fr)}})};if(r===3){var n=this.parseUShort(),i=this.parseUShort();return{substFormat:r,coverages:this.parseList(n,A.pointer(A.coverage)),lookupRecords:this.parseRecordList(i,fr)}}N.assert(!1,\"0x\"+t.toString(16)+\": lookup type 5 format must be 1, 2 or 3.\")};De[6]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();if(r===1)return{substFormat:1,coverage:this.parsePointer(A.coverage),chainRuleSets:this.parseListOfLists(function(){return{backtrack:this.parseUShortList(),input:this.parseUShortList(this.parseShort()-1),lookahead:this.parseUShortList(),lookupRecords:this.parseRecordList(fr)}})};if(r===2)return{substFormat:2,coverage:this.parsePointer(A.coverage),backtrackClassDef:this.parsePointer(A.classDef),inputClassDef:this.parsePointer(A.classDef),lookaheadClassDef:this.parsePointer(A.classDef),chainClassSet:this.parseListOfLists(function(){return{backtrack:this.parseUShortList(),input:this.parseUShortList(this.parseShort()-1),lookahead:this.parseUShortList(),lookupRecords:this.parseRecordList(fr)}})};if(r===3)return{substFormat:3,backtrackCoverage:this.parseList(A.pointer(A.coverage)),inputCoverage:this.parseList(A.pointer(A.coverage)),lookaheadCoverage:this.parseList(A.pointer(A.coverage)),lookupRecords:this.parseRecordList(fr)};N.assert(!1,\"0x\"+t.toString(16)+\": lookup type 6 format must be 1, 2 or 3.\")};De[7]=function(){var t=this.parseUShort();N.argument(t===1,\"GSUB Extension Substitution subtable identifier-format must be 1\");var r=this.parseUShort(),n=new A(this.data,this.offset+this.parseULong());return{substFormat:1,lookupType:r,extension:De[r].call(n)}};De[8]=function(){var t=this.parseUShort();return N.argument(t===1,\"GSUB Reverse Chaining Contextual Single Substitution Subtable identifier-format must be 1\"),{substFormat:t,coverage:this.parsePointer(A.coverage),backtrackCoverage:this.parseList(A.pointer(A.coverage)),lookaheadCoverage:this.parseList(A.pointer(A.coverage)),substitutes:this.parseUShortList()}};function Q4(e,t){t=t||0;var r=new A(e,t),n=r.parseVersion(1);return N.argument(n===1||n===1.1,\"Unsupported GSUB table version.\"),n===1?{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(De)}:{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(De),variations:r.parseFeatureVariationsList()}}var hr=new Array(9);hr[1]=function(t){return t.substFormat===1?new U.Table(\"substitutionTable\",[{name:\"substFormat\",type:\"USHORT\",value:1},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)},{name:\"deltaGlyphID\",type:\"USHORT\",value:t.deltaGlyphId}]):new U.Table(\"substitutionTable\",[{name:\"substFormat\",type:\"USHORT\",value:2},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)}].concat(U.ushortList(\"substitute\",t.substitute)))};hr[2]=function(t){return N.assert(t.substFormat===1,\"Lookup type 2 substFormat must be 1.\"),new U.Table(\"substitutionTable\",[{name:\"substFormat\",type:\"USHORT\",value:1},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)}].concat(U.tableList(\"seqSet\",t.sequences,function(r){return new U.Table(\"sequenceSetTable\",U.ushortList(\"sequence\",r))})))};hr[3]=function(t){return N.assert(t.substFormat===1,\"Lookup type 3 substFormat must be 1.\"),new U.Table(\"substitutionTable\",[{name:\"substFormat\",type:\"USHORT\",value:1},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)}].concat(U.tableList(\"altSet\",t.alternateSets,function(r){return new U.Table(\"alternateSetTable\",U.ushortList(\"alternate\",r))})))};hr[4]=function(t){return N.assert(t.substFormat===1,\"Lookup type 4 substFormat must be 1.\"),new U.Table(\"substitutionTable\",[{name:\"substFormat\",type:\"USHORT\",value:1},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)}].concat(U.tableList(\"ligSet\",t.ligatureSets,function(r){return new U.Table(\"ligatureSetTable\",U.tableList(\"ligature\",r,function(n){return new U.Table(\"ligatureTable\",[{name:\"ligGlyph\",type:\"USHORT\",value:n.ligGlyph}].concat(U.ushortList(\"component\",n.components,n.components.length+1)))}))})))};hr[6]=function(t){if(t.substFormat===1){var r=new U.Table(\"chainContextTable\",[{name:\"substFormat\",type:\"USHORT\",value:t.substFormat},{name:\"coverage\",type:\"TABLE\",value:new U.Coverage(t.coverage)}].concat(U.tableList(\"chainRuleSet\",t.chainRuleSets,function(s){return new U.Table(\"chainRuleSetTable\",U.tableList(\"chainRule\",s,function(o){var a=U.ushortList(\"backtrackGlyph\",o.backtrack,o.backtrack.length).concat(U.ushortList(\"inputGlyph\",o.input,o.input.length+1)).concat(U.ushortList(\"lookaheadGlyph\",o.lookahead,o.lookahead.length)).concat(U.ushortList(\"substitution\",[],o.lookupRecords.length));return o.lookupRecords.forEach(function(l,u){a=a.concat({name:\"sequenceIndex\"+u,type:\"USHORT\",value:l.sequenceIndex}).concat({name:\"lookupListIndex\"+u,type:\"USHORT\",value:l.lookupListIndex})}),new U.Table(\"chainRuleTable\",a)}))})));return r}else if(t.substFormat===2)N.assert(!1,\"lookup type 6 format 2 is not yet supported.\");else if(t.substFormat===3){var n=[{name:\"substFormat\",type:\"USHORT\",value:t.substFormat}];n.push({name:\"backtrackGlyphCount\",type:\"USHORT\",value:t.backtrackCoverage.length}),t.backtrackCoverage.forEach(function(s,o){n.push({name:\"backtrackCoverage\"+o,type:\"TABLE\",value:new U.Coverage(s)})}),n.push({name:\"inputGlyphCount\",type:\"USHORT\",value:t.inputCoverage.length}),t.inputCoverage.forEach(function(s,o){n.push({name:\"inputCoverage\"+o,type:\"TABLE\",value:new U.Coverage(s)})}),n.push({name:\"lookaheadGlyphCount\",type:\"USHORT\",value:t.lookaheadCoverage.length}),t.lookaheadCoverage.forEach(function(s,o){n.push({name:\"lookaheadCoverage\"+o,type:\"TABLE\",value:new U.Coverage(s)})}),n.push({name:\"substitutionCount\",type:\"USHORT\",value:t.lookupRecords.length}),t.lookupRecords.forEach(function(s,o){n=n.concat({name:\"sequenceIndex\"+o,type:\"USHORT\",value:s.sequenceIndex}).concat({name:\"lookupListIndex\"+o,type:\"USHORT\",value:s.lookupListIndex})});var i=new U.Table(\"chainContextTable\",n);return i}N.assert(!1,\"lookup type 6 format must be 1, 2 or 3.\")};function J4(e){return new U.Table(\"GSUB\",[{name:\"version\",type:\"ULONG\",value:65536},{name:\"scripts\",type:\"TABLE\",value:new U.ScriptList(e.scripts)},{name:\"features\",type:\"TABLE\",value:new U.FeatureList(e.features)},{name:\"lookups\",type:\"TABLE\",value:new U.LookupList(e.lookups,hr)}])}var Y2={parse:Q4,make:J4};function $4(e,t){var r=new D.Parser(e,t),n=r.parseULong();N.argument(n===1,\"Unsupported META table version.\"),r.parseULong(),r.parseULong();for(var i=r.parseULong(),s={},o=0;o<i;o++){var a=r.parseTag(),l=r.parseULong(),u=r.parseULong(),c=pr.UTF8(e,t+l,u);s[a]=c}return s}function e6(e){var t=Object.keys(e).length,r=\"\",n=16+t*12,i=new U.Table(\"meta\",[{name:\"version\",type:\"ULONG\",value:1},{name:\"flags\",type:\"ULONG\",value:0},{name:\"offset\",type:\"ULONG\",value:n},{name:\"numTags\",type:\"ULONG\",value:t}]);for(var s in e){var o=r.length;r+=e[s],i.fields.push({name:\"tag \"+s,type:\"TAG\",value:s}),i.fields.push({name:\"offset \"+s,type:\"ULONG\",value:n+o}),i.fields.push({name:\"length \"+s,type:\"ULONG\",value:e[s].length})}return i.fields.push({name:\"stringPool\",type:\"CHARARRAY\",value:r}),i}var K2={parse:$4,make:e6};function Xa(e){return Math.log(e)/Math.log(2)|0}function ao(e){for(;e.length%4!==0;)e.push(0);for(var t=0,r=0;r<e.length;r+=4)t+=(e[r]<<24)+(e[r+1]<<16)+(e[r+2]<<8)+e[r+3];return t%=Math.pow(2,32),t}function ja(e,t,r,n){return new U.Record(\"Table Record\",[{name:\"tag\",type:\"TAG\",value:e!==void 0?e:\"\"},{name:\"checkSum\",type:\"ULONG\",value:t!==void 0?t:0},{name:\"offset\",type:\"ULONG\",value:r!==void 0?r:0},{name:\"length\",type:\"ULONG\",value:n!==void 0?n:0}])}function Z2(e){var t=new U.Table(\"sfnt\",[{name:\"version\",type:\"TAG\",value:\"OTTO\"},{name:\"numTables\",type:\"USHORT\",value:0},{name:\"searchRange\",type:\"USHORT\",value:0},{name:\"entrySelector\",type:\"USHORT\",value:0},{name:\"rangeShift\",type:\"USHORT\",value:0}]);t.tables=e,t.numTables=e.length;var r=Math.pow(2,Xa(t.numTables));t.searchRange=16*r,t.entrySelector=Xa(r),t.rangeShift=t.numTables*16-t.searchRange;for(var n=[],i=[],s=t.sizeOf()+ja().sizeOf()*t.numTables;s%4!==0;)s+=1,i.push({name:\"padding\",type:\"BYTE\",value:0});for(var o=0;o<e.length;o+=1){var a=e[o];N.argument(a.tableName.length===4,\"Table name\"+a.tableName+\" is invalid.\");var l=a.sizeOf(),u=ja(a.tableName,ao(a.encode()),s,l);for(n.push({name:u.tag+\" Table Record\",type:\"RECORD\",value:u}),i.push({name:a.tableName+\" table\",type:\"RECORD\",value:a}),s+=l,N.argument(!isNaN(s),\"Something went wrong calculating the offset.\");s%4!==0;)s+=1,i.push({name:\"padding\",type:\"BYTE\",value:0})}return n.sort(function(c,f){return c.value.tag>f.value.tag?1:-1}),t.fields=t.fields.concat(n),t.fields=t.fields.concat(i),t}function Ya(e,t,r){for(var n=0;n<t.length;n+=1){var i=e.charToGlyphIndex(t[n]);if(i>0){var s=e.glyphs.get(i);return s.getMetrics()}}return r}function t6(e){for(var t=0,r=0;r<e.length;r+=1)t+=e[r];return t/e.length}function r6(e){for(var t=[],r=[],n=[],i=[],s=[],o=[],a=[],l,u=0,c=0,f=0,q=0,p=0,d=0;d<e.glyphs.length;d+=1){var v=e.glyphs.get(d),m=v.unicode|0;if(isNaN(v.advanceWidth))throw new Error(\"Glyph \"+v.name+\" (\"+d+\"): advanceWidth is not a number.\");(l>m||l===void 0)&&m>0&&(l=m),u<m&&(u=m);var h=$s.getUnicodeRange(m);if(h<32)c|=1<<h;else if(h<64)f|=1<<h-32;else if(h<96)q|=1<<h-64;else if(h<123)p|=1<<h-96;else throw new Error(\"Unicode ranges bits > 123 are reserved for internal usage\");if(v.name!==\".notdef\"){var g=v.getMetrics();t.push(g.xMin),r.push(g.yMin),n.push(g.xMax),i.push(g.yMax),o.push(g.leftSideBearing),a.push(g.rightSideBearing),s.push(v.advanceWidth)}}var x={xMin:Math.min.apply(null,t),yMin:Math.min.apply(null,r),xMax:Math.max.apply(null,n),yMax:Math.max.apply(null,i),advanceWidthMax:Math.max.apply(null,s),advanceWidthAvg:t6(s),minLeftSideBearing:Math.min.apply(null,o),maxLeftSideBearing:Math.max.apply(null,o),minRightSideBearing:Math.min.apply(null,a)};x.ascender=e.ascender,x.descender=e.descender;var b=D2.make({flags:3,unitsPerEm:e.unitsPerEm,xMin:x.xMin,yMin:x.yMin,xMax:x.xMax,yMax:x.yMax,lowestRecPPEM:3,createdTimestamp:e.createdTimestamp}),y=L2.make({ascender:x.ascender,descender:x.descender,advanceWidthMax:x.advanceWidthMax,minLeftSideBearing:x.minLeftSideBearing,minRightSideBearing:x.minRightSideBearing,xMaxExtent:x.maxLeftSideBearing+(x.xMax-x.xMin),numberOfHMetrics:e.glyphs.length}),_=z2.make(e.glyphs.length),T=$s.make(Object.assign({xAvgCharWidth:Math.round(x.advanceWidthAvg),usFirstCharIndex:l,usLastCharIndex:u,ulUnicodeRange1:c,ulUnicodeRange2:f,ulUnicodeRange3:q,ulUnicodeRange4:p,sTypoAscender:x.ascender,sTypoDescender:x.descender,sTypoLineGap:0,usWinAscent:x.yMax,usWinDescent:Math.abs(x.yMin),ulCodePageRange1:1,sxHeight:Ya(e,\"xyvw\",{yMax:Math.round(x.ascender/2)}).yMax,sCapHeight:Ya(e,\"HIKLEFJMNTZBDPRAGOQSUVWXY\",x).yMax,usDefaultChar:e.hasChar(\" \")?32:0,usBreakChar:e.hasChar(\" \")?32:0},e.tables.os2)),S=P2.make(e.glyphs),E=w2.make(e.glyphs),w=e.getEnglishName(\"fontFamily\"),F=e.getEnglishName(\"fontSubfamily\"),C=w+\" \"+F,M=e.getEnglishName(\"postScriptName\");M||(M=w.replace(/\\s/g,\"\")+\"-\"+F);var k={};for(var I in e.names)k[I]=e.names[I];k.uniqueID||(k.uniqueID={en:e.getEnglishName(\"manufacturer\")+\":\"+C}),k.postScriptName||(k.postScriptName={en:M}),k.preferredFamily||(k.preferredFamily=e.names.fontFamily),k.preferredSubfamily||(k.preferredSubfamily=e.names.fontSubfamily);var L=[],V=X2.make(k,L),G=L.length>0?N2.make(L):void 0,H=j2.make(),j=O2.make(e.glyphs,{version:e.getEnglishName(\"version\"),fullName:C,familyName:w,weightName:F,postScriptName:M,unitsPerEm:e.unitsPerEm,fontBBox:[0,x.yMin,x.ascender,x.advanceWidthMax]}),Y=e.metas&&Object.keys(e.metas).length>0?K2.make(e.metas):void 0,ee=[b,y,_,T,V,E,H,j,S];G&&ee.push(G),e.tables.gsub&&ee.push(Y2.make(e.tables.gsub)),Y&&ee.push(Y);for(var Tr=Z2(ee),E0=Tr.encode(),A0=ao(E0),Ii=Tr.fields,To=!1,an=0;an<Ii.length;an+=1)if(Ii[an].name===\"head table\"){Ii[an].value.checkSumAdjustment=2981146554-A0,To=!0;break}if(!To)throw new Error(\"Could not find head table with checkSum to adjust.\");return Tr}var n6={make:Z2,fontToTable:r6,computeCheckSum:ao};function Ps(e,t){for(var r=0,n=e.length-1;r<=n;){var i=r+n>>>1,s=e[i].tag;if(s===t)return i;s<t?r=i+1:n=i-1}return-r-1}function Ka(e,t){for(var r=0,n=e.length-1;r<=n;){var i=r+n>>>1,s=e[i];if(s===t)return i;s<t?r=i+1:n=i-1}return-r-1}function Za(e,t){for(var r,n=0,i=e.length-1;n<=i;){var s=n+i>>>1;r=e[s];var o=r.start;if(o===t)return r;o<t?n=s+1:i=s-1}if(n>0)return r=e[n-1],t>r.end?0:r}function $r(e,t){this.font=e,this.tableName=t}$r.prototype={searchTag:Ps,binSearch:Ka,getTable:function(e){var t=this.font.tables[this.tableName];return!t&&e&&(t=this.font.tables[this.tableName]=this.createDefaultTable()),t},getScriptNames:function(){var e=this.getTable();return e?e.scripts.map(function(t){return t.tag}):[]},getDefaultScriptName:function(){var e=this.getTable();if(e){for(var t=!1,r=0;r<e.scripts.length;r++){var n=e.scripts[r].tag;if(n===\"DFLT\")return n;n===\"latn\"&&(t=!0)}if(t)return\"latn\"}},getScriptTable:function(e,t){var r=this.getTable(t);if(r){e=e||\"DFLT\";var n=r.scripts,i=Ps(r.scripts,e);if(i>=0)return n[i].script;if(t){var s={tag:e,script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}};return n.splice(-1-i,0,s),s.script}}},getLangSysTable:function(e,t,r){var n=this.getScriptTable(e,r);if(n){if(!t||t===\"dflt\"||t===\"DFLT\")return n.defaultLangSys;var i=Ps(n.langSysRecords,t);if(i>=0)return n.langSysRecords[i].langSys;if(r){var s={tag:t,langSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]}};return n.langSysRecords.splice(-1-i,0,s),s.langSys}}},getFeatureTable:function(e,t,r,n){var i=this.getLangSysTable(e,t,n);if(i){for(var s,o=i.featureIndexes,a=this.font.tables[this.tableName].features,l=0;l<o.length;l++)if(s=a[o[l]],s.tag===r)return s.feature;if(n){var u=a.length;return N.assert(u===0||r>=a[u-1].tag,\"Features must be added in alphabetical order.\"),s={tag:r,feature:{params:0,lookupListIndexes:[]}},a.push(s),o.push(u),s.feature}}},getLookupTables:function(e,t,r,n,i){var s=this.getFeatureTable(e,t,r,i),o=[];if(s){for(var a,l=s.lookupListIndexes,u=this.font.tables[this.tableName].lookups,c=0;c<l.length;c++)a=u[l[c]],a.lookupType===n&&o.push(a);if(o.length===0&&i){a={lookupType:n,lookupFlag:0,subtables:[],markFilteringSet:void 0};var f=u.length;return u.push(a),l.push(f),[a]}}return o},getGlyphClass:function(e,t){switch(e.format){case 1:return e.startGlyph<=t&&t<e.startGlyph+e.classes.length?e.classes[t-e.startGlyph]:0;case 2:var r=Za(e.ranges,t);return r?r.classId:0}},getCoverageIndex:function(e,t){switch(e.format){case 1:var r=Ka(e.glyphs,t);return r>=0?r:-1;case 2:var n=Za(e.ranges,t);return n?n.index+t-n.start:-1}},expandCoverage:function(e){if(e.format===1)return e.glyphs;for(var t=[],r=e.ranges,n=0;n<r.length;n++)for(var i=r[n],s=i.start,o=i.end,a=s;a<=o;a++)t.push(a);return t}};function en(e){$r.call(this,e,\"gpos\")}en.prototype=$r.prototype;en.prototype.init=function(){var e=this.getDefaultScriptName();this.defaultKerningTables=this.getKerningTables(e)};en.prototype.getKerningValue=function(e,t,r){for(var n=0;n<e.length;n++)for(var i=e[n].subtables,s=0;s<i.length;s++){var o=i[s],a=this.getCoverageIndex(o.coverage,t);if(!(a<0))switch(o.posFormat){case 1:for(var l=o.pairSets[a],u=0;u<l.length;u++){var c=l[u];if(c.secondGlyph===r)return c.value1&&c.value1.xAdvance||0}break;case 2:var f=this.getGlyphClass(o.classDef1,t),q=this.getGlyphClass(o.classDef2,r),p=o.classRecords[f][q];return p.value1&&p.value1.xAdvance||0}}return 0};en.prototype.getKerningTables=function(e,t){if(this.font.tables.gpos)return this.getLookupTables(e,t,\"kern\",2)};function we(e){$r.call(this,e,\"gsub\")}function i6(e,t){var r=e.length;if(r!==t.length)return!1;for(var n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function lo(e,t,r){for(var n=e.subtables,i=0;i<n.length;i++){var s=n[i];if(s.substFormat===t)return s}if(r)return n.push(r),r}we.prototype=$r.prototype;we.prototype.createDefaultTable=function(){return{version:1,scripts:[{tag:\"DFLT\",script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}}],features:[],lookups:[]}};we.prototype.getSingle=function(e,t,r){for(var n=[],i=this.getLookupTables(t,r,e,1),s=0;s<i.length;s++)for(var o=i[s].subtables,a=0;a<o.length;a++){var l=o[a],u=this.expandCoverage(l.coverage),c=void 0;if(l.substFormat===1){var f=l.deltaGlyphId;for(c=0;c<u.length;c++){var q=u[c];n.push({sub:q,by:q+f})}}else{var p=l.substitute;for(c=0;c<u.length;c++)n.push({sub:u[c],by:p[c]})}}return n};we.prototype.getMultiple=function(e,t,r){for(var n=[],i=this.getLookupTables(t,r,e,2),s=0;s<i.length;s++)for(var o=i[s].subtables,a=0;a<o.length;a++){var l=o[a],u=this.expandCoverage(l.coverage),c=void 0;for(c=0;c<u.length;c++){var f=u[c],q=l.sequences[c];n.push({sub:f,by:q})}}return n};we.prototype.getAlternates=function(e,t,r){for(var n=[],i=this.getLookupTables(t,r,e,3),s=0;s<i.length;s++)for(var o=i[s].subtables,a=0;a<o.length;a++)for(var l=o[a],u=this.expandCoverage(l.coverage),c=l.alternateSets,f=0;f<u.length;f++)n.push({sub:u[f],by:c[f]});return n};we.prototype.getLigatures=function(e,t,r){for(var n=[],i=this.getLookupTables(t,r,e,4),s=0;s<i.length;s++)for(var o=i[s].subtables,a=0;a<o.length;a++)for(var l=o[a],u=this.expandCoverage(l.coverage),c=l.ligatureSets,f=0;f<u.length;f++)for(var q=u[f],p=c[f],d=0;d<p.length;d++){var v=p[d];n.push({sub:[q].concat(v.components),by:v.ligGlyph})}return n};we.prototype.addSingle=function(e,t,r,n){var i=this.getLookupTables(r,n,e,1,!0)[0],s=lo(i,2,{substFormat:2,coverage:{format:1,glyphs:[]},substitute:[]});N.assert(s.coverage.format===1,\"Single: unable to modify coverage table format \"+s.coverage.format);var o=t.sub,a=this.binSearch(s.coverage.glyphs,o);a<0&&(a=-1-a,s.coverage.glyphs.splice(a,0,o),s.substitute.splice(a,0,0)),s.substitute[a]=t.by};we.prototype.addMultiple=function(e,t,r,n){N.assert(t.by instanceof Array&&t.by.length>1,'Multiple: \"by\" must be an array of two or more ids');var i=this.getLookupTables(r,n,e,2,!0)[0],s=lo(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},sequences:[]});N.assert(s.coverage.format===1,\"Multiple: unable to modify coverage table format \"+s.coverage.format);var o=t.sub,a=this.binSearch(s.coverage.glyphs,o);a<0&&(a=-1-a,s.coverage.glyphs.splice(a,0,o),s.sequences.splice(a,0,0)),s.sequences[a]=t.by};we.prototype.addAlternate=function(e,t,r,n){var i=this.getLookupTables(r,n,e,3,!0)[0],s=lo(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},alternateSets:[]});N.assert(s.coverage.format===1,\"Alternate: unable to modify coverage table format \"+s.coverage.format);var o=t.sub,a=this.binSearch(s.coverage.glyphs,o);a<0&&(a=-1-a,s.coverage.glyphs.splice(a,0,o),s.alternateSets.splice(a,0,0)),s.alternateSets[a]=t.by};we.prototype.addLigature=function(e,t,r,n){var i=this.getLookupTables(r,n,e,4,!0)[0],s=i.subtables[0];s||(s={substFormat:1,coverage:{format:1,glyphs:[]},ligatureSets:[]},i.subtables[0]=s),N.assert(s.coverage.format===1,\"Ligature: unable to modify coverage table format \"+s.coverage.format);var o=t.sub[0],a=t.sub.slice(1),l={ligGlyph:t.by,components:a},u=this.binSearch(s.coverage.glyphs,o);if(u>=0){for(var c=s.ligatureSets[u],f=0;f<c.length;f++)if(i6(c[f].components,a))return;c.push(l)}else u=-1-u,s.coverage.glyphs.splice(u,0,o),s.ligatureSets.splice(u,0,[l])};we.prototype.getFeature=function(e,t,r){if(/ss\\d\\d/.test(e))return this.getSingle(e,t,r);switch(e){case\"aalt\":case\"salt\":return this.getSingle(e,t,r).concat(this.getAlternates(e,t,r));case\"dlig\":case\"liga\":case\"rlig\":return this.getLigatures(e,t,r);case\"ccmp\":return this.getMultiple(e,t,r).concat(this.getLigatures(e,t,r));case\"stch\":return this.getMultiple(e,t,r)}};we.prototype.add=function(e,t,r,n){if(/ss\\d\\d/.test(e))return this.addSingle(e,t,r,n);switch(e){case\"aalt\":case\"salt\":return typeof t.by==\"number\"?this.addSingle(e,t,r,n):this.addAlternate(e,t,r,n);case\"dlig\":case\"liga\":case\"rlig\":return this.addLigature(e,t,r,n);case\"ccmp\":return t.by instanceof Array?this.addMultiple(e,t,r,n):this.addLigature(e,t,r,n)}};function s6(){return typeof window<\"u\"}function Q2(e){for(var t=new ArrayBuffer(e.length),r=new Uint8Array(t),n=0;n<e.length;++n)r[n]=e[n];return t}function o6(e){for(var t=new Buffer(e.byteLength),r=new Uint8Array(e),n=0;n<t.length;++n)t[n]=r[n];return t}function jr(e,t){if(!e)throw t}function Qa(e,t,r,n,i){var s;return(t&n)>0?(s=e.parseByte(),(t&i)===0&&(s=-s),s=r+s):(t&i)>0?s=r:s=r+e.parseShort(),s}function J2(e,t,r){var n=new D.Parser(t,r);e.numberOfContours=n.parseShort(),e._xMin=n.parseShort(),e._yMin=n.parseShort(),e._xMax=n.parseShort(),e._yMax=n.parseShort();var i,s;if(e.numberOfContours>0){for(var o=e.endPointIndices=[],a=0;a<e.numberOfContours;a+=1)o.push(n.parseUShort());e.instructionLength=n.parseUShort(),e.instructions=[];for(var l=0;l<e.instructionLength;l+=1)e.instructions.push(n.parseByte());var u=o[o.length-1]+1;i=[];for(var c=0;c<u;c+=1)if(s=n.parseByte(),i.push(s),(s&8)>0)for(var f=n.parseByte(),q=0;q<f;q+=1)i.push(s),c+=1;if(N.argument(i.length===u,\"Bad flags.\"),o.length>0){var p=[],d;if(u>0){for(var v=0;v<u;v+=1)s=i[v],d={},d.onCurve=!!(s&1),d.lastPointOfContour=o.indexOf(v)>=0,p.push(d);for(var m=0,h=0;h<u;h+=1)s=i[h],d=p[h],d.x=Qa(n,s,m,2,16),m=d.x;for(var g=0,x=0;x<u;x+=1)s=i[x],d=p[x],d.y=Qa(n,s,g,4,32),g=d.y}e.points=p}else e.points=[]}else if(e.numberOfContours===0)e.points=[];else{e.isComposite=!0,e.points=[],e.components=[];for(var b=!0;b;){i=n.parseUShort();var y={glyphIndex:n.parseUShort(),xScale:1,scale01:0,scale10:0,yScale:1,dx:0,dy:0};(i&1)>0?(i&2)>0?(y.dx=n.parseShort(),y.dy=n.parseShort()):y.matchedPoints=[n.parseUShort(),n.parseUShort()]:(i&2)>0?(y.dx=n.parseChar(),y.dy=n.parseChar()):y.matchedPoints=[n.parseByte(),n.parseByte()],(i&8)>0?y.xScale=y.yScale=n.parseF2Dot14():(i&64)>0?(y.xScale=n.parseF2Dot14(),y.yScale=n.parseF2Dot14()):(i&128)>0&&(y.xScale=n.parseF2Dot14(),y.scale01=n.parseF2Dot14(),y.scale10=n.parseF2Dot14(),y.yScale=n.parseF2Dot14()),e.components.push(y),b=!!(i&32)}if(i&256){e.instructionLength=n.parseUShort(),e.instructions=[];for(var _=0;_<e.instructionLength;_+=1)e.instructions.push(n.parseByte())}}}function Ns(e,t){for(var r=[],n=0;n<e.length;n+=1){var i=e[n],s={x:t.xScale*i.x+t.scale01*i.y+t.dx,y:t.scale10*i.x+t.yScale*i.y+t.dy,onCurve:i.onCurve,lastPointOfContour:i.lastPointOfContour};r.push(s)}return r}function a6(e){for(var t=[],r=[],n=0;n<e.length;n+=1){var i=e[n];r.push(i),i.lastPointOfContour&&(t.push(r),r=[])}return N.argument(r.length===0,\"There are still points left in the current contour.\"),t}function $2(e){var t=new pe;if(!e)return t;for(var r=a6(e),n=0;n<r.length;++n){var i=r[n],s=null,o=i[i.length-1],a=i[0];if(o.onCurve)t.moveTo(o.x,o.y);else if(a.onCurve)t.moveTo(a.x,a.y);else{var l={x:(o.x+a.x)*.5,y:(o.y+a.y)*.5};t.moveTo(l.x,l.y)}for(var u=0;u<i.length;++u)if(s=o,o=a,a=i[(u+1)%i.length],o.onCurve)t.lineTo(o.x,o.y);else{var c=s,f=a;s.onCurve||(c={x:(o.x+s.x)*.5,y:(o.y+s.y)*.5}),a.onCurve||(f={x:(o.x+a.x)*.5,y:(o.y+a.y)*.5}),t.quadraticCurveTo(o.x,o.y,f.x,f.y)}t.closePath()}return t}function e0(e,t){if(t.isComposite)for(var r=0;r<t.components.length;r+=1){var n=t.components[r],i=e.get(n.glyphIndex);if(i.getPath(),i.points){var s=void 0;if(n.matchedPoints===void 0)s=Ns(i.points,n);else{if(n.matchedPoints[0]>t.points.length-1||n.matchedPoints[1]>i.points.length-1)throw Error(\"Matched points out of range in \"+t.name);var o=t.points[n.matchedPoints[0]],a=i.points[n.matchedPoints[1]],l={xScale:n.xScale,scale01:n.scale01,scale10:n.scale10,yScale:n.yScale,dx:0,dy:0};a=Ns([a],l)[0],l.dx=o.x-a.x,l.dy=o.y-a.y,s=Ns(i.points,l)}t.points=t.points.concat(s)}}return $2(t.points)}function l6(e,t,r,n){for(var i=new Ye.GlyphSet(n),s=0;s<r.length-1;s+=1){var o=r[s],a=r[s+1];o!==a?i.push(s,Ye.ttfGlyphLoader(n,s,J2,e,t+o,e0)):i.push(s,Ye.glyphLoader(n,s))}return i}function c6(e,t,r,n){var i=new Ye.GlyphSet(n);return n._push=function(s){var o=r[s],a=r[s+1];o!==a?i.push(s,Ye.ttfGlyphLoader(n,s,J2,e,t+o,e0)):i.push(s,Ye.glyphLoader(n,s))},i}function u6(e,t,r,n,i){return i.lowMemory?c6(e,t,r,n):l6(e,t,r,n)}var t0={getPath:$2,parse:u6},r0,zt,n0,eo;function i0(e){this.font=e,this.getCommands=function(t){return t0.getPath(t).commands},this._fpgmState=this._prepState=void 0,this._errorState=0}function q6(e){return e}function s0(e){return Math.sign(e)*Math.round(Math.abs(e))}function f6(e){return Math.sign(e)*Math.round(Math.abs(e*2))/2}function p6(e){return Math.sign(e)*(Math.round(Math.abs(e)+.5)-.5)}function h6(e){return Math.sign(e)*Math.ceil(Math.abs(e))}function d6(e){return Math.sign(e)*Math.floor(Math.abs(e))}var o0=function(e){var t=this.srPeriod,r=this.srPhase,n=this.srThreshold,i=1;return e<0&&(e=-e,i=-1),e+=n-r,e=Math.trunc(e/t)*t,e+=r,e<0?r*i:e*i},je={x:1,y:0,axis:\"x\",distance:function(e,t,r,n){return(r?e.xo:e.x)-(n?t.xo:t.x)},interpolate:function(e,t,r,n){var i,s,o,a,l,u,c;if(!n||n===this){if(i=e.xo-t.xo,s=e.xo-r.xo,l=t.x-t.xo,u=r.x-r.xo,o=Math.abs(i),a=Math.abs(s),c=o+a,c===0){e.x=e.xo+(l+u)/2;return}e.x=e.xo+(l*a+u*o)/c;return}if(i=n.distance(e,t,!0,!0),s=n.distance(e,r,!0,!0),l=n.distance(t,t,!1,!0),u=n.distance(r,r,!1,!0),o=Math.abs(i),a=Math.abs(s),c=o+a,c===0){je.setRelative(e,e,(l+u)/2,n,!0);return}je.setRelative(e,e,(l*a+u*o)/c,n,!0)},normalSlope:Number.NEGATIVE_INFINITY,setRelative:function(e,t,r,n,i){if(!n||n===this){e.x=(i?t.xo:t.x)+r;return}var s=i?t.xo:t.x,o=i?t.yo:t.y,a=s+r*n.x,l=o+r*n.y;e.x=a+(e.y-l)/n.normalSlope},slope:0,touch:function(e){e.xTouched=!0},touched:function(e){return e.xTouched},untouch:function(e){e.xTouched=!1}},nt={x:0,y:1,axis:\"y\",distance:function(e,t,r,n){return(r?e.yo:e.y)-(n?t.yo:t.y)},interpolate:function(e,t,r,n){var i,s,o,a,l,u,c;if(!n||n===this){if(i=e.yo-t.yo,s=e.yo-r.yo,l=t.y-t.yo,u=r.y-r.yo,o=Math.abs(i),a=Math.abs(s),c=o+a,c===0){e.y=e.yo+(l+u)/2;return}e.y=e.yo+(l*a+u*o)/c;return}if(i=n.distance(e,t,!0,!0),s=n.distance(e,r,!0,!0),l=n.distance(t,t,!1,!0),u=n.distance(r,r,!1,!0),o=Math.abs(i),a=Math.abs(s),c=o+a,c===0){nt.setRelative(e,e,(l+u)/2,n,!0);return}nt.setRelative(e,e,(l*a+u*o)/c,n,!0)},normalSlope:0,setRelative:function(e,t,r,n,i){if(!n||n===this){e.y=(i?t.yo:t.y)+r;return}var s=i?t.xo:t.x,o=i?t.yo:t.y,a=s+r*n.x,l=o+r*n.y;e.y=l+n.normalSlope*(e.x-a)},slope:Number.POSITIVE_INFINITY,touch:function(e){e.yTouched=!0},touched:function(e){return e.yTouched},untouch:function(e){e.yTouched=!1}};Object.freeze(je);Object.freeze(nt);function tn(e,t){this.x=e,this.y=t,this.axis=void 0,this.slope=t/e,this.normalSlope=-e/t,Object.freeze(this)}tn.prototype.distance=function(e,t,r,n){return this.x*je.distance(e,t,r,n)+this.y*nt.distance(e,t,r,n)};tn.prototype.interpolate=function(e,t,r,n){var i,s,o,a,l,u,c;if(o=n.distance(e,t,!0,!0),a=n.distance(e,r,!0,!0),i=n.distance(t,t,!1,!0),s=n.distance(r,r,!1,!0),l=Math.abs(o),u=Math.abs(a),c=l+u,c===0){this.setRelative(e,e,(i+s)/2,n,!0);return}this.setRelative(e,e,(i*u+s*l)/c,n,!0)};tn.prototype.setRelative=function(e,t,r,n,i){n=n||this;var s=i?t.xo:t.x,o=i?t.yo:t.y,a=s+r*n.x,l=o+r*n.y,u=n.normalSlope,c=this.slope,f=e.x,q=e.y;e.x=(c*f-u*a+l-q)/(c-u),e.y=c*(e.x-f)+q};tn.prototype.touch=function(e){e.xTouched=!0,e.yTouched=!0};function rn(e,t){var r=Math.sqrt(e*e+t*t);return e/=r,t/=r,e===1&&t===0?je:e===0&&t===1?nt:new tn(e,t)}function it(e,t,r,n){this.x=this.xo=Math.round(e*64)/64,this.y=this.yo=Math.round(t*64)/64,this.lastPointOfContour=r,this.onCurve=n,this.prevPointOnContour=void 0,this.nextPointOnContour=void 0,this.xTouched=!1,this.yTouched=!1,Object.preventExtensions(this)}it.prototype.nextTouched=function(e){for(var t=this.nextPointOnContour;!e.touched(t)&&t!==this;)t=t.nextPointOnContour;return t};it.prototype.prevTouched=function(e){for(var t=this.prevPointOnContour;!e.touched(t)&&t!==this;)t=t.prevPointOnContour;return t};var Jr=Object.freeze(new it(0,0)),m6={cvCutIn:17/16,deltaBase:9,deltaShift:.125,loop:1,minDis:1,autoFlip:!0};function St(e,t){switch(this.env=e,this.stack=[],this.prog=t,e){case\"glyf\":this.zp0=this.zp1=this.zp2=1,this.rp0=this.rp1=this.rp2=0;case\"prep\":this.fv=this.pv=this.dpv=je,this.round=s0}}i0.prototype.exec=function(e,t){if(typeof t!=\"number\")throw new Error(\"Point size is not a number!\");if(!(this._errorState>2)){var r=this.font,n=this._prepState;if(!n||n.ppem!==t){var i=this._fpgmState;if(!i){St.prototype=m6,i=this._fpgmState=new St(\"fpgm\",r.tables.fpgm),i.funcs=[],i.font=r,exports.DEBUG&&(console.log(\"---EXEC FPGM---\"),i.step=-1);try{zt(i)}catch(u){console.log(\"Hinting error in FPGM:\"+u),this._errorState=3;return}}St.prototype=i,n=this._prepState=new St(\"prep\",r.tables.prep),n.ppem=t;var s=r.tables.cvt;if(s)for(var o=n.cvt=new Array(s.length),a=t/r.unitsPerEm,l=0;l<s.length;l++)o[l]=s[l]*a;else n.cvt=[];exports.DEBUG&&(console.log(\"---EXEC PREP---\"),n.step=-1);try{zt(n)}catch(u){this._errorState<2&&console.log(\"Hinting error in PREP:\"+u),this._errorState=2}}if(!(this._errorState>1))try{return n0(e,n)}catch(u){this._errorState<1&&(console.log(\"Hinting error:\"+u),console.log(\"Note: further hinting errors are silenced\")),this._errorState=1;return}}};n0=function(e,t){var r=t.ppem/t.font.unitsPerEm,n=r,i=e.components,s,o,a;if(St.prototype=t,!i)a=new St(\"glyf\",e.instructions),exports.DEBUG&&(console.log(\"---EXEC GLYPH---\"),a.step=-1),eo(e,a,r,n),o=a.gZone;else{var l=t.font;o=[],s=[];for(var u=0;u<i.length;u++){var c=i[u],f=l.glyphs.get(c.glyphIndex);a=new St(\"glyf\",f.instructions),exports.DEBUG&&(console.log(\"---EXEC COMP \"+u+\"---\"),a.step=-1),eo(f,a,r,n);for(var q=Math.round(c.dx*r),p=Math.round(c.dy*n),d=a.gZone,v=a.contours,m=0;m<d.length;m++){var h=d[m];h.xTouched=h.yTouched=!1,h.xo=h.x=h.x+q,h.yo=h.y=h.y+p}var g=o.length;o.push.apply(o,d);for(var x=0;x<v.length;x++)s.push(v[x]+g)}e.instructions&&!a.inhibitGridFit&&(a=new St(\"glyf\",e.instructions),a.gZone=a.z0=a.z1=a.z2=o,a.contours=s,o.push(new it(0,0),new it(Math.round(e.advanceWidth*r),0)),exports.DEBUG&&(console.log(\"---EXEC COMPOSITE---\"),a.step=-1),zt(a),o.length-=2)}return o};eo=function(e,t,r,n){for(var i=e.points||[],s=i.length,o=t.gZone=t.z0=t.z1=t.z2=[],a=t.contours=[],l,u=0;u<s;u++)l=i[u],o[u]=new it(l.x*r,l.y*n,l.lastPointOfContour,l.onCurve);for(var c,f,q=0;q<s;q++)l=o[q],c||(c=l,a.push(q)),l.lastPointOfContour?(l.nextPointOnContour=c,c.prevPointOnContour=l,c=void 0):(f=o[q+1],l.nextPointOnContour=f,f.prevPointOnContour=l);if(!t.inhibitGridFit){if(exports.DEBUG){console.log(\"PROCESSING GLYPH\",t.stack);for(var p=0;p<s;p++)console.log(p,o[p].x,o[p].y)}if(o.push(new it(0,0),new it(Math.round(e.advanceWidth*r),0)),zt(t),o.length-=2,exports.DEBUG){console.log(\"FINISHED GLYPH\",t.stack);for(var d=0;d<s;d++)console.log(d,o[d].x,o[d].y)}}};zt=function(e){var t=e.prog;if(t){var r=t.length,n;for(e.ip=0;e.ip<r;e.ip++){if(exports.DEBUG&&e.step++,n=r0[t[e.ip]],!n)throw new Error(\"unknown instruction: 0x\"+Number(t[e.ip]).toString(16));n(e)}}};function _i(e){for(var t=e.tZone=new Array(e.gZone.length),r=0;r<t.length;r++)t[r]=new it(0,0)}function a0(e,t){var r=e.prog,n=e.ip,i=1,s;do if(s=r[++n],s===88)i++;else if(s===89)i--;else if(s===64)n+=r[n+1]+1;else if(s===65)n+=2*r[n+1]+1;else if(s>=176&&s<=183)n+=s-176+1;else if(s>=184&&s<=191)n+=(s-184+1)*2;else if(t&&i===1&&s===27)break;while(i>0);e.ip=n}function Ja(e,t){exports.DEBUG&&console.log(t.step,\"SVTCA[\"+e.axis+\"]\"),t.fv=t.pv=t.dpv=e}function $a(e,t){exports.DEBUG&&console.log(t.step,\"SPVTCA[\"+e.axis+\"]\"),t.pv=t.dpv=e}function e2(e,t){exports.DEBUG&&console.log(t.step,\"SFVTCA[\"+e.axis+\"]\"),t.fv=e}function t2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log(\"SPVTL[\"+e+\"]\",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.pv=t.dpv=rn(a,l)}function r2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log(\"SFVTL[\"+e+\"]\",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.fv=rn(a,l)}function v6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"SPVFS[]\",r,n),e.pv=e.dpv=rn(n,r)}function g6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"SPVFS[]\",r,n),e.fv=rn(n,r)}function x6(e){var t=e.stack,r=e.pv;exports.DEBUG&&console.log(e.step,\"GPV[]\"),t.push(r.x*16384),t.push(r.y*16384)}function y6(e){var t=e.stack,r=e.fv;exports.DEBUG&&console.log(e.step,\"GFV[]\"),t.push(r.x*16384),t.push(r.y*16384)}function b6(e){e.fv=e.pv,exports.DEBUG&&console.log(e.step,\"SFVTPV[]\")}function S6(e){var t=e.stack,r=t.pop(),n=t.pop(),i=t.pop(),s=t.pop(),o=t.pop(),a=e.z0,l=e.z1,u=a[r],c=a[n],f=l[i],q=l[s],p=e.z2[o];exports.DEBUG&&console.log(\"ISECT[], \",r,n,i,s,o);var d=u.x,v=u.y,m=c.x,h=c.y,g=f.x,x=f.y,b=q.x,y=q.y,_=(d-m)*(x-y)-(v-h)*(g-b),T=d*h-v*m,S=g*y-x*b;p.x=(T*(g-b)-S*(d-m))/_,p.y=(T*(x-y)-S*(v-h))/_}function T6(e){e.rp0=e.stack.pop(),exports.DEBUG&&console.log(e.step,\"SRP0[]\",e.rp0)}function _6(e){e.rp1=e.stack.pop(),exports.DEBUG&&console.log(e.step,\"SRP1[]\",e.rp1)}function w6(e){e.rp2=e.stack.pop(),exports.DEBUG&&console.log(e.step,\"SRP2[]\",e.rp2)}function E6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,\"SZP0[]\",t),e.zp0=t,t){case 0:e.tZone||_i(e),e.z0=e.tZone;break;case 1:e.z0=e.gZone;break;default:throw new Error(\"Invalid zone pointer\")}}function A6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,\"SZP1[]\",t),e.zp1=t,t){case 0:e.tZone||_i(e),e.z1=e.tZone;break;case 1:e.z1=e.gZone;break;default:throw new Error(\"Invalid zone pointer\")}}function C6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,\"SZP2[]\",t),e.zp2=t,t){case 0:e.tZone||_i(e),e.z2=e.tZone;break;case 1:e.z2=e.gZone;break;default:throw new Error(\"Invalid zone pointer\")}}function F6(e){var t=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,\"SZPS[]\",t),e.zp0=e.zp1=e.zp2=t,t){case 0:e.tZone||_i(e),e.z0=e.z1=e.z2=e.tZone;break;case 1:e.z0=e.z1=e.z2=e.gZone;break;default:throw new Error(\"Invalid zone pointer\")}}function M6(e){e.loop=e.stack.pop(),exports.DEBUG&&console.log(e.step,\"SLOOP[]\",e.loop)}function k6(e){exports.DEBUG&&console.log(e.step,\"RTG[]\"),e.round=s0}function I6(e){exports.DEBUG&&console.log(e.step,\"RTHG[]\"),e.round=p6}function B6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"SMD[]\",t),e.minDis=t/64}function R6(e){exports.DEBUG&&console.log(e.step,\"ELSE[]\"),a0(e,!1)}function U6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"JMPR[]\",t),e.ip+=t-1}function O6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"SCVTCI[]\",t),e.cvCutIn=t/64}function D6(e){var t=e.stack;exports.DEBUG&&console.log(e.step,\"DUP[]\"),t.push(t[t.length-1])}function zs(e){exports.DEBUG&&console.log(e.step,\"POP[]\"),e.stack.pop()}function L6(e){exports.DEBUG&&console.log(e.step,\"CLEAR[]\"),e.stack.length=0}function P6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"SWAP[]\"),t.push(r),t.push(n)}function N6(e){var t=e.stack;exports.DEBUG&&console.log(e.step,\"DEPTH[]\"),t.push(t.length)}function z6(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"LOOPCALL[]\",r,n);var i=e.ip,s=e.prog;e.prog=e.funcs[r];for(var o=0;o<n;o++)zt(e),exports.DEBUG&&console.log(++e.step,o+1<n?\"next loopcall\":\"done loopcall\",o);e.ip=i,e.prog=s}function G6(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"CALL[]\",t);var r=e.ip,n=e.prog;e.prog=e.funcs[t],zt(e),e.ip=r,e.prog=n,exports.DEBUG&&console.log(++e.step,\"returning from\",t)}function V6(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"CINDEX[]\",r),t.push(t[t.length-r])}function H6(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"MINDEX[]\",r),t.push(t.splice(t.length-r,1)[0])}function W6(e){if(e.env!==\"fpgm\")throw new Error(\"FDEF not allowed here\");var t=e.stack,r=e.prog,n=e.ip,i=t.pop(),s=n;for(exports.DEBUG&&console.log(e.step,\"FDEF[]\",i);r[++n]!==45;);e.ip=n,e.funcs[i]=r.slice(s+1,n)}function n2(e,t){var r=t.stack.pop(),n=t.z0[r],i=t.fv,s=t.pv;exports.DEBUG&&console.log(t.step,\"MDAP[\"+e+\"]\",r);var o=s.distance(n,Jr);e&&(o=t.round(o)),i.setRelative(n,Jr,o,s),i.touch(n),t.rp0=t.rp1=r}function i2(e,t){var r=t.z2,n=r.length-2,i,s,o;exports.DEBUG&&console.log(t.step,\"IUP[\"+e.axis+\"]\");for(var a=0;a<n;a++)i=r[a],!e.touched(i)&&(s=i.prevTouched(e),s!==i&&(o=i.nextTouched(e),s===o&&e.setRelative(i,i,e.distance(s,s,!1,!0),e,!0),e.interpolate(i,s,o,e)))}function s2(e,t){for(var r=t.stack,n=e?t.rp1:t.rp2,i=(e?t.z0:t.z1)[n],s=t.fv,o=t.pv,a=t.loop,l=t.z2;a--;){var u=r.pop(),c=l[u],f=o.distance(i,i,!1,!0);s.setRelative(c,c,f,o),s.touch(c),exports.DEBUG&&console.log(t.step,(t.loop>1?\"loop \"+(t.loop-a)+\": \":\"\")+\"SHP[\"+(e?\"rp1\":\"rp2\")+\"]\",u)}t.loop=1}function o2(e,t){var r=t.stack,n=e?t.rp1:t.rp2,i=(e?t.z0:t.z1)[n],s=t.fv,o=t.pv,a=r.pop(),l=t.z2[t.contours[a]],u=l;exports.DEBUG&&console.log(t.step,\"SHC[\"+e+\"]\",a);var c=o.distance(i,i,!1,!0);do u!==i&&s.setRelative(u,u,c,o),u=u.nextPointOnContour;while(u!==l)}function a2(e,t){var r=t.stack,n=e?t.rp1:t.rp2,i=(e?t.z0:t.z1)[n],s=t.fv,o=t.pv,a=r.pop();exports.DEBUG&&console.log(t.step,\"SHZ[\"+e+\"]\",a);var l;switch(a){case 0:l=t.tZone;break;case 1:l=t.gZone;break;default:throw new Error(\"Invalid zone\")}for(var u,c=o.distance(i,i,!1,!0),f=l.length-2,q=0;q<f;q++)u=l[q],s.setRelative(u,u,c,o)}function X6(e){for(var t=e.stack,r=e.loop,n=e.fv,i=t.pop()/64,s=e.z2;r--;){var o=t.pop(),a=s[o];exports.DEBUG&&console.log(e.step,(e.loop>1?\"loop \"+(e.loop-r)+\": \":\"\")+\"SHPIX[]\",o,i),n.setRelative(a,a,i),n.touch(a)}e.loop=1}function j6(e){for(var t=e.stack,r=e.rp1,n=e.rp2,i=e.loop,s=e.z0[r],o=e.z1[n],a=e.fv,l=e.dpv,u=e.z2;i--;){var c=t.pop(),f=u[c];exports.DEBUG&&console.log(e.step,(e.loop>1?\"loop \"+(e.loop-i)+\": \":\"\")+\"IP[]\",c,r,\"<->\",n),a.interpolate(f,s,o,l),a.touch(f)}e.loop=1}function l2(e,t){var r=t.stack,n=r.pop()/64,i=r.pop(),s=t.z1[i],o=t.z0[t.rp0],a=t.fv,l=t.pv;a.setRelative(s,o,n,l),a.touch(s),exports.DEBUG&&console.log(t.step,\"MSIRP[\"+e+\"]\",n,i),t.rp1=t.rp0,t.rp2=i,e&&(t.rp0=i)}function Y6(e){for(var t=e.stack,r=e.rp0,n=e.z0[r],i=e.loop,s=e.fv,o=e.pv,a=e.z1;i--;){var l=t.pop(),u=a[l];exports.DEBUG&&console.log(e.step,(e.loop>1?\"loop \"+(e.loop-i)+\": \":\"\")+\"ALIGNRP[]\",l),s.setRelative(u,n,0,o),s.touch(u)}e.loop=1}function K6(e){exports.DEBUG&&console.log(e.step,\"RTDG[]\"),e.round=f6}function c2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z0[i],o=t.fv,a=t.pv,l=t.cvt[n];exports.DEBUG&&console.log(t.step,\"MIAP[\"+e+\"]\",n,\"(\",l,\")\",i);var u=a.distance(s,Jr);e&&(Math.abs(u-l)<t.cvCutIn&&(u=l),u=t.round(u)),o.setRelative(s,Jr,u,a),t.zp0===0&&(s.xo=s.x,s.yo=s.y),o.touch(s),t.rp0=t.rp1=i}function Z6(e){var t=e.prog,r=e.ip,n=e.stack,i=t[++r];exports.DEBUG&&console.log(e.step,\"NPUSHB[]\",i);for(var s=0;s<i;s++)n.push(t[++r]);e.ip=r}function Q6(e){var t=e.ip,r=e.prog,n=e.stack,i=r[++t];exports.DEBUG&&console.log(e.step,\"NPUSHW[]\",i);for(var s=0;s<i;s++){var o=r[++t]<<8|r[++t];o&32768&&(o=-((o^65535)+1)),n.push(o)}e.ip=t}function J6(e){var t=e.stack,r=e.store;r||(r=e.store=[]);var n=t.pop(),i=t.pop();exports.DEBUG&&console.log(e.step,\"WS\",n,i),r[i]=n}function $6(e){var t=e.stack,r=e.store,n=t.pop();exports.DEBUG&&console.log(e.step,\"RS\",n);var i=r&&r[n]||0;t.push(i)}function el(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"WCVTP\",r,n),e.cvt[n]=r/64}function rl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"RCVT\",r),t.push(e.cvt[r]*64)}function u2(e,t){var r=t.stack,n=r.pop(),i=t.z2[n];exports.DEBUG&&console.log(t.step,\"GC[\"+e+\"]\",n),r.push(t.dpv.distance(i,Jr,e,!1)*64)}function q2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z1[n],o=t.z0[i],a=t.dpv.distance(o,s,e,e);exports.DEBUG&&console.log(t.step,\"MD[\"+e+\"]\",n,i,\"->\",a),t.stack.push(Math.round(a*64))}function nl(e){exports.DEBUG&&console.log(e.step,\"MPPEM[]\"),e.stack.push(e.ppem)}function il(e){exports.DEBUG&&console.log(e.step,\"FLIPON[]\"),e.autoFlip=!0}function sl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"LT[]\",r,n),t.push(n<r?1:0)}function ol(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"LTEQ[]\",r,n),t.push(n<=r?1:0)}function al(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"GT[]\",r,n),t.push(n>r?1:0)}function ll(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"GTEQ[]\",r,n),t.push(n>=r?1:0)}function cl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"EQ[]\",r,n),t.push(r===n?1:0)}function ul(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"NEQ[]\",r,n),t.push(r!==n?1:0)}function ql(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"ODD[]\",r),t.push(Math.trunc(r)%2?1:0)}function fl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"EVEN[]\",r),t.push(Math.trunc(r)%2?0:1)}function pl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"IF[]\",t),t||(a0(e,!0),exports.DEBUG&&console.log(e.step,\"EIF[]\"))}function hl(e){exports.DEBUG&&console.log(e.step,\"EIF[]\")}function dl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"AND[]\",r,n),t.push(r&&n?1:0)}function ml(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"OR[]\",r,n),t.push(r||n?1:0)}function vl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"NOT[]\",r),t.push(r?0:1)}function Gs(e,t){var r=t.stack,n=r.pop(),i=t.fv,s=t.pv,o=t.ppem,a=t.deltaBase+(e-1)*16,l=t.deltaShift,u=t.z0;exports.DEBUG&&console.log(t.step,\"DELTAP[\"+e+\"]\",n,r);for(var c=0;c<n;c++){var f=r.pop(),q=r.pop(),p=a+((q&240)>>4);if(p===o){var d=(q&15)-8;d>=0&&d++,exports.DEBUG&&console.log(t.step,\"DELTAPFIX\",f,\"by\",d*l);var v=u[f];i.setRelative(v,v,d*l,s)}}}function gl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"SDB[]\",r),e.deltaBase=r}function xl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"SDS[]\",r),e.deltaShift=Math.pow(.5,r)}function yl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"ADD[]\",r,n),t.push(n+r)}function bl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"SUB[]\",r,n),t.push(n-r)}function Sl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"DIV[]\",r,n),t.push(n*64/r)}function Tl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"MUL[]\",r,n),t.push(n*r/64)}function _l(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"ABS[]\",r),t.push(Math.abs(r))}function wl(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"NEG[]\",r),t.push(-r)}function El(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"FLOOR[]\",r),t.push(Math.floor(r/64)*64)}function Al(e){var t=e.stack,r=t.pop();exports.DEBUG&&console.log(e.step,\"CEILING[]\",r),t.push(Math.ceil(r/64)*64)}function di(e,t){var r=t.stack,n=r.pop();exports.DEBUG&&console.log(t.step,\"ROUND[]\"),r.push(t.round(n/64)*64)}function Cl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"WCVTF[]\",r,n),e.cvt[n]=r*e.ppem/e.font.unitsPerEm}function Vs(e,t){var r=t.stack,n=r.pop(),i=t.ppem,s=t.deltaBase+(e-1)*16,o=t.deltaShift;exports.DEBUG&&console.log(t.step,\"DELTAC[\"+e+\"]\",n,r);for(var a=0;a<n;a++){var l=r.pop(),u=r.pop(),c=s+((u&240)>>4);if(c===i){var f=(u&15)-8;f>=0&&f++;var q=f*o;exports.DEBUG&&console.log(t.step,\"DELTACFIX\",l,\"by\",q),t.cvt[l]+=q}}}function Fl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"SROUND[]\",t),e.round=o0;var r;switch(t&192){case 0:r=.5;break;case 64:r=1;break;case 128:r=2;break;default:throw new Error(\"invalid SROUND value\")}switch(e.srPeriod=r,t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*r;break;case 32:e.srPhase=.5*r;break;case 48:e.srPhase=.75*r;break;default:throw new Error(\"invalid SROUND value\")}t&=15,t===0?e.srThreshold=0:e.srThreshold=(t/8-.5)*r}function Ml(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"S45ROUND[]\",t),e.round=o0;var r;switch(t&192){case 0:r=Math.sqrt(2)/2;break;case 64:r=Math.sqrt(2);break;case 128:r=2*Math.sqrt(2);break;default:throw new Error(\"invalid S45ROUND value\")}switch(e.srPeriod=r,t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*r;break;case 32:e.srPhase=.5*r;break;case 48:e.srPhase=.75*r;break;default:throw new Error(\"invalid S45ROUND value\")}t&=15,t===0?e.srThreshold=0:e.srThreshold=(t/8-.5)*r}function kl(e){exports.DEBUG&&console.log(e.step,\"ROFF[]\"),e.round=q6}function Il(e){exports.DEBUG&&console.log(e.step,\"RUTG[]\"),e.round=h6}function Bl(e){exports.DEBUG&&console.log(e.step,\"RDTG[]\"),e.round=d6}function Rl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"SCANCTRL[]\",t)}function f2(e,t){var r=t.stack,n=r.pop(),i=r.pop(),s=t.z2[n],o=t.z1[i];exports.DEBUG&&console.log(t.step,\"SDPVTL[\"+e+\"]\",n,i);var a,l;e?(a=s.y-o.y,l=o.x-s.x):(a=o.x-s.x,l=o.y-s.y),t.dpv=rn(a,l)}function Ul(e){var t=e.stack,r=t.pop(),n=0;exports.DEBUG&&console.log(e.step,\"GETINFO[]\",r),r&1&&(n=35),r&32&&(n|=4096),t.push(n)}function Ol(e){var t=e.stack,r=t.pop(),n=t.pop(),i=t.pop();exports.DEBUG&&console.log(e.step,\"ROLL[]\"),t.push(n),t.push(r),t.push(i)}function Dl(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"MAX[]\",r,n),t.push(Math.max(n,r))}function Ll(e){var t=e.stack,r=t.pop(),n=t.pop();exports.DEBUG&&console.log(e.step,\"MIN[]\",r,n),t.push(Math.min(n,r))}function Pl(e){var t=e.stack.pop();exports.DEBUG&&console.log(e.step,\"SCANTYPE[]\",t)}function Nl(e){var t=e.stack.pop(),r=e.stack.pop();switch(exports.DEBUG&&console.log(e.step,\"INSTCTRL[]\",t,r),t){case 1:e.inhibitGridFit=!!r;return;case 2:e.ignoreCvt=!!r;return;default:throw new Error(\"invalid INSTCTRL[] selector\")}}function xt(e,t){var r=t.stack,n=t.prog,i=t.ip;exports.DEBUG&&console.log(t.step,\"PUSHB[\"+e+\"]\");for(var s=0;s<e;s++)r.push(n[++i]);t.ip=i}function yt(e,t){var r=t.ip,n=t.prog,i=t.stack;exports.DEBUG&&console.log(t.ip,\"PUSHW[\"+e+\"]\");for(var s=0;s<e;s++){var o=n[++r]<<8|n[++r];o&32768&&(o=-((o^65535)+1)),i.push(o)}t.ip=r}function O(e,t,r,n,i,s){var o=s.stack,a=e&&o.pop(),l=o.pop(),u=s.rp0,c=s.z0[u],f=s.z1[l],q=s.minDis,p=s.fv,d=s.dpv,v,m,h,g;m=v=d.distance(f,c,!0,!0),h=m>=0?1:-1,m=Math.abs(m),e&&(g=s.cvt[a],n&&Math.abs(m-g)<s.cvCutIn&&(m=g)),r&&m<q&&(m=q),n&&(m=s.round(m)),p.setRelative(f,c,h*m,d),p.touch(f),exports.DEBUG&&console.log(s.step,(e?\"MIRP[\":\"MDRP[\")+(t?\"M\":\"m\")+(r?\">\":\"_\")+(n?\"R\":\"_\")+(i===0?\"Gr\":i===1?\"Bl\":i===2?\"Wh\":\"\")+\"]\",e?a+\"(\"+s.cvt[a]+\",\"+g+\")\":\"\",l,\"(d =\",v,\"->\",h*m,\")\"),s.rp1=s.rp0,s.rp2=l,t&&(s.rp0=l)}r0=[Ja.bind(void 0,nt),Ja.bind(void 0,je),$a.bind(void 0,nt),$a.bind(void 0,je),e2.bind(void 0,nt),e2.bind(void 0,je),t2.bind(void 0,0),t2.bind(void 0,1),r2.bind(void 0,0),r2.bind(void 0,1),v6,g6,x6,y6,b6,S6,T6,_6,w6,E6,A6,C6,F6,M6,k6,I6,B6,R6,U6,O6,void 0,void 0,D6,zs,L6,P6,N6,V6,H6,void 0,void 0,void 0,z6,G6,W6,void 0,n2.bind(void 0,0),n2.bind(void 0,1),i2.bind(void 0,nt),i2.bind(void 0,je),s2.bind(void 0,0),s2.bind(void 0,1),o2.bind(void 0,0),o2.bind(void 0,1),a2.bind(void 0,0),a2.bind(void 0,1),X6,j6,l2.bind(void 0,0),l2.bind(void 0,1),Y6,K6,c2.bind(void 0,0),c2.bind(void 0,1),Z6,Q6,J6,$6,el,rl,u2.bind(void 0,0),u2.bind(void 0,1),void 0,q2.bind(void 0,0),q2.bind(void 0,1),nl,void 0,il,void 0,void 0,sl,ol,al,ll,cl,ul,ql,fl,pl,hl,dl,ml,vl,Gs.bind(void 0,1),gl,xl,yl,bl,Sl,Tl,_l,wl,El,Al,di.bind(void 0,0),di.bind(void 0,1),di.bind(void 0,2),di.bind(void 0,3),void 0,void 0,void 0,void 0,Cl,Gs.bind(void 0,2),Gs.bind(void 0,3),Vs.bind(void 0,1),Vs.bind(void 0,2),Vs.bind(void 0,3),Fl,Ml,void 0,void 0,kl,void 0,Il,Bl,zs,zs,void 0,void 0,void 0,void 0,void 0,Rl,f2.bind(void 0,0),f2.bind(void 0,1),Ul,void 0,Ol,Dl,Ll,Pl,Nl,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,void 0,xt.bind(void 0,1),xt.bind(void 0,2),xt.bind(void 0,3),xt.bind(void 0,4),xt.bind(void 0,5),xt.bind(void 0,6),xt.bind(void 0,7),xt.bind(void 0,8),yt.bind(void 0,1),yt.bind(void 0,2),yt.bind(void 0,3),yt.bind(void 0,4),yt.bind(void 0,5),yt.bind(void 0,6),yt.bind(void 0,7),yt.bind(void 0,8),O.bind(void 0,0,0,0,0,0),O.bind(void 0,0,0,0,0,1),O.bind(void 0,0,0,0,0,2),O.bind(void 0,0,0,0,0,3),O.bind(void 0,0,0,0,1,0),O.bind(void 0,0,0,0,1,1),O.bind(void 0,0,0,0,1,2),O.bind(void 0,0,0,0,1,3),O.bind(void 0,0,0,1,0,0),O.bind(void 0,0,0,1,0,1),O.bind(void 0,0,0,1,0,2),O.bind(void 0,0,0,1,0,3),O.bind(void 0,0,0,1,1,0),O.bind(void 0,0,0,1,1,1),O.bind(void 0,0,0,1,1,2),O.bind(void 0,0,0,1,1,3),O.bind(void 0,0,1,0,0,0),O.bind(void 0,0,1,0,0,1),O.bind(void 0,0,1,0,0,2),O.bind(void 0,0,1,0,0,3),O.bind(void 0,0,1,0,1,0),O.bind(void 0,0,1,0,1,1),O.bind(void 0,0,1,0,1,2),O.bind(void 0,0,1,0,1,3),O.bind(void 0,0,1,1,0,0),O.bind(void 0,0,1,1,0,1),O.bind(void 0,0,1,1,0,2),O.bind(void 0,0,1,1,0,3),O.bind(void 0,0,1,1,1,0),O.bind(void 0,0,1,1,1,1),O.bind(void 0,0,1,1,1,2),O.bind(void 0,0,1,1,1,3),O.bind(void 0,1,0,0,0,0),O.bind(void 0,1,0,0,0,1),O.bind(void 0,1,0,0,0,2),O.bind(void 0,1,0,0,0,3),O.bind(void 0,1,0,0,1,0),O.bind(void 0,1,0,0,1,1),O.bind(void 0,1,0,0,1,2),O.bind(void 0,1,0,0,1,3),O.bind(void 0,1,0,1,0,0),O.bind(void 0,1,0,1,0,1),O.bind(void 0,1,0,1,0,2),O.bind(void 0,1,0,1,0,3),O.bind(void 0,1,0,1,1,0),O.bind(void 0,1,0,1,1,1),O.bind(void 0,1,0,1,1,2),O.bind(void 0,1,0,1,1,3),O.bind(void 0,1,1,0,0,0),O.bind(void 0,1,1,0,0,1),O.bind(void 0,1,1,0,0,2),O.bind(void 0,1,1,0,0,3),O.bind(void 0,1,1,0,1,0),O.bind(void 0,1,1,0,1,1),O.bind(void 0,1,1,0,1,2),O.bind(void 0,1,1,0,1,3),O.bind(void 0,1,1,1,0,0),O.bind(void 0,1,1,1,0,1),O.bind(void 0,1,1,1,0,2),O.bind(void 0,1,1,1,0,3),O.bind(void 0,1,1,1,1,0),O.bind(void 0,1,1,1,1,1),O.bind(void 0,1,1,1,1,2),O.bind(void 0,1,1,1,1,3)];function dr(e){this.char=e,this.state={},this.activeState=null}function co(e,t,r){this.contextName=r,this.startIndex=e,this.endOffset=t}function zl(e,t,r){this.contextName=e,this.openRange=null,this.ranges=[],this.checkStart=t,this.checkEnd=r}function Le(e,t){this.context=e,this.index=t,this.length=e.length,this.current=e[t],this.backtrack=e.slice(0,t),this.lookahead=e.slice(t+1)}function wi(e){this.eventId=e,this.subscribers=[]}function Gl(e){var t=this,r=[\"start\",\"end\",\"next\",\"newToken\",\"contextStart\",\"contextEnd\",\"insertToken\",\"removeToken\",\"removeRange\",\"replaceToken\",\"replaceRange\",\"composeRUD\",\"updateContextsRanges\"];r.forEach(function(i){Object.defineProperty(t.events,i,{value:new wi(i)})}),e&&r.forEach(function(i){var s=e[i];typeof s==\"function\"&&t.events[i].subscribe(s)});var n=[\"insertToken\",\"removeToken\",\"removeRange\",\"replaceToken\",\"replaceRange\",\"composeRUD\"];n.forEach(function(i){t.events[i].subscribe(t.updateContextsRanges)})}function ie(e){this.tokens=[],this.registeredContexts={},this.contextCheckers=[],this.events={},this.registeredModifiers=[],Gl.call(this,e)}dr.prototype.setState=function(e,t){return this.state[e]=t,this.activeState={key:e,value:this.state[e]},this.activeState};dr.prototype.getState=function(e){return this.state[e]||null};ie.prototype.inboundIndex=function(e){return e>=0&&e<this.tokens.length};ie.prototype.composeRUD=function(e){var t=this,r=!0,n=e.map(function(s){return t[s[0]].apply(t,s.slice(1).concat(r))}),i=function(s){return typeof s==\"object\"&&s.hasOwnProperty(\"FAIL\")};if(n.every(i))return{FAIL:\"composeRUD: one or more operations hasn't completed successfully\",report:n.filter(i)};this.dispatch(\"composeRUD\",[n.filter(function(s){return!i(s)})])};ie.prototype.replaceRange=function(e,t,r,n){t=t!==null?t:this.tokens.length;var i=r.every(function(o){return o instanceof dr});if(!isNaN(e)&&this.inboundIndex(e)&&i){var s=this.tokens.splice.apply(this.tokens,[e,t].concat(r));return n||this.dispatch(\"replaceToken\",[e,t,r]),[s,r]}else return{FAIL:\"replaceRange: invalid tokens or startIndex.\"}};ie.prototype.replaceToken=function(e,t,r){if(!isNaN(e)&&this.inboundIndex(e)&&t instanceof dr){var n=this.tokens.splice(e,1,t);return r||this.dispatch(\"replaceToken\",[e,t]),[n[0],t]}else return{FAIL:\"replaceToken: invalid token or index.\"}};ie.prototype.removeRange=function(e,t,r){t=isNaN(t)?this.tokens.length:t;var n=this.tokens.splice(e,t);return r||this.dispatch(\"removeRange\",[n,e,t]),n};ie.prototype.removeToken=function(e,t){if(!isNaN(e)&&this.inboundIndex(e)){var r=this.tokens.splice(e,1);return t||this.dispatch(\"removeToken\",[r,e]),r}else return{FAIL:\"removeToken: invalid token index.\"}};ie.prototype.insertToken=function(e,t,r){var n=e.every(function(i){return i instanceof dr});return n?(this.tokens.splice.apply(this.tokens,[t,0].concat(e)),r||this.dispatch(\"insertToken\",[e,t]),e):{FAIL:\"insertToken: invalid token(s).\"}};ie.prototype.registerModifier=function(e,t,r){this.events.newToken.subscribe(function(n,i){var s=[n,i],o=t===null||t.apply(this,s)===!0,a=[n,i];if(o){var l=r.apply(this,a);n.setState(e,l)}}),this.registeredModifiers.push(e)};wi.prototype.subscribe=function(e){return typeof e==\"function\"?this.subscribers.push(e)-1:{FAIL:\"invalid '\"+this.eventId+\"' event handler\"}};wi.prototype.unsubscribe=function(e){this.subscribers.splice(e,1)};Le.prototype.setCurrentIndex=function(e){this.index=e,this.current=this.context[e],this.backtrack=this.context.slice(0,e),this.lookahead=this.context.slice(e+1)};Le.prototype.get=function(e){switch(!0){case e===0:return this.current;case(e<0&&Math.abs(e)<=this.backtrack.length):return this.backtrack.slice(e)[0];case(e>0&&e<=this.lookahead.length):return this.lookahead[e-1];default:return null}};ie.prototype.rangeToText=function(e){if(e instanceof co)return this.getRangeTokens(e).map(function(t){return t.char}).join(\"\")};ie.prototype.getText=function(){return this.tokens.map(function(e){return e.char}).join(\"\")};ie.prototype.getContext=function(e){var t=this.registeredContexts[e];return t||null};ie.prototype.on=function(e,t){var r=this.events[e];return r?r.subscribe(t):null};ie.prototype.dispatch=function(e,t){var r=this,n=this.events[e];n instanceof wi&&n.subscribers.forEach(function(i){i.apply(r,t||[])})};ie.prototype.registerContextChecker=function(e,t,r){if(this.getContext(e))return{FAIL:\"context name '\"+e+\"' is already registered.\"};if(typeof t!=\"function\")return{FAIL:\"missing context start check.\"};if(typeof r!=\"function\")return{FAIL:\"missing context end check.\"};var n=new zl(e,t,r);return this.registeredContexts[e]=n,this.contextCheckers.push(n),n};ie.prototype.getRangeTokens=function(e){var t=e.startIndex+e.endOffset;return[].concat(this.tokens.slice(e.startIndex,t))};ie.prototype.getContextRanges=function(e){var t=this.getContext(e);return t?t.ranges:{FAIL:\"context checker '\"+e+\"' is not registered.\"}};ie.prototype.resetContextsRanges=function(){var e=this.registeredContexts;for(var t in e)if(e.hasOwnProperty(t)){var r=e[t];r.ranges=[]}};ie.prototype.updateContextsRanges=function(){this.resetContextsRanges();for(var e=this.tokens.map(function(n){return n.char}),t=0;t<e.length;t++){var r=new Le(e,t);this.runContextCheck(r)}this.dispatch(\"updateContextsRanges\",[this.registeredContexts])};ie.prototype.setEndOffset=function(e,t){var r=this.getContext(t).openRange.startIndex,n=new co(r,e,t),i=this.getContext(t).ranges;return n.rangeId=t+\".\"+i.length,i.push(n),this.getContext(t).openRange=null,n};ie.prototype.runContextCheck=function(e){var t=this,r=e.index;this.contextCheckers.forEach(function(n){var i=n.contextName,s=t.getContext(i).openRange;if(!s&&n.checkStart(e)&&(s=new co(r,null,i),t.getContext(i).openRange=s,t.dispatch(\"contextStart\",[i,r])),s&&n.checkEnd(e)){var o=r-s.startIndex+1,a=t.setEndOffset(o,i);t.dispatch(\"contextEnd\",[i,a])}})};ie.prototype.tokenize=function(e){this.tokens=[],this.resetContextsRanges();var t=Array.from(e);this.dispatch(\"start\");for(var r=0;r<t.length;r++){var n=t[r],i=new Le(t,r);this.dispatch(\"next\",[i]),this.runContextCheck(i);var s=new dr(n);this.tokens.push(s),this.dispatch(\"newToken\",[s,i])}return this.dispatch(\"end\",[this.tokens]),this.tokens};function Tt(e){return/[\\u0600-\\u065F\\u066A-\\u06D2\\u06FA-\\u06FF]/.test(e)}function l0(e){return/[\\u0630\\u0690\\u0621\\u0631\\u0661\\u0671\\u0622\\u0632\\u0672\\u0692\\u06C2\\u0623\\u0673\\u0693\\u06C3\\u0624\\u0694\\u06C4\\u0625\\u0675\\u0695\\u06C5\\u06E5\\u0676\\u0696\\u06C6\\u0627\\u0677\\u0697\\u06C7\\u0648\\u0688\\u0698\\u06C8\\u0689\\u0699\\u06C9\\u068A\\u06CA\\u066B\\u068B\\u06CB\\u068C\\u068D\\u06CD\\u06FD\\u068E\\u06EE\\u06FE\\u062F\\u068F\\u06CF\\u06EF]/.test(e)}function _t(e){return/[\\u0600-\\u0605\\u060C-\\u060E\\u0610-\\u061B\\u061E\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED]/.test(e)}function vi(e){return/[A-z]/.test(e)}function Vl(e){return/\\s/.test(e)}function Ee(e){this.font=e,this.features={}}function Nt(e){this.id=e.id,this.tag=e.tag,this.substitution=e.substitution}function nn(e,t){if(!e)return-1;switch(t.format){case 1:return t.glyphs.indexOf(e);case 2:for(var r=t.ranges,n=0;n<r.length;n++){var i=r[n];if(e>=i.start&&e<=i.end){var s=e-i.start;return i.index+s}}break;default:return-1}return-1}function Hl(e,t){var r=nn(e,t.coverage);return r===-1?null:e+t.deltaGlyphId}function Wl(e,t){var r=nn(e,t.coverage);return r===-1?null:t.substitute[r]}function Hs(e,t){for(var r=[],n=0;n<e.length;n++){var i=e[n],s=t.current;s=Array.isArray(s)?s[0]:s;var o=nn(s,i);o!==-1&&r.push(o)}return r.length!==e.length?-1:r}function Xl(e,t){var r=t.inputCoverage.length+t.lookaheadCoverage.length+t.backtrackCoverage.length;if(e.context.length<r)return[];var n=Hs(t.inputCoverage,e);if(n===-1)return[];var i=t.inputCoverage.length-1;if(e.lookahead.length<t.lookaheadCoverage.length)return[];for(var s=e.lookahead.slice(i);s.length&&_t(s[0].char);)s.shift();var o=new Le(s,0),a=Hs(t.lookaheadCoverage,o),l=[].concat(e.backtrack);for(l.reverse();l.length&&_t(l[0].char);)l.shift();if(l.length<t.backtrackCoverage.length)return[];var u=new Le(l,0),c=Hs(t.backtrackCoverage,u),f=n.length===t.inputCoverage.length&&a.length===t.lookaheadCoverage.length&&c.length===t.backtrackCoverage.length,q=[];if(f)for(var p=0;p<t.lookupRecords.length;p++)for(var d=t.lookupRecords[p],v=d.lookupListIndex,m=this.getLookupByIndex(v),h=0;h<m.subtables.length;h++){var g=m.subtables[h],x=this.getLookupMethod(m,g),b=this.getSubstitutionType(m,g);if(b===\"12\")for(var y=0;y<n.length;y++){var _=e.get(y),T=x(_);T&&q.push(T)}}return q}function jl(e,t){var r=e.current,n=nn(r,t.coverage);if(n===-1)return null;for(var i,s=t.ligatureSets[n],o=0;o<s.length;o++){i=s[o];for(var a=0;a<i.components.length;a++){var l=e.lookahead[a],u=i.components[a];if(l!==u)break;if(a===i.components.length-1)return i}}return null}function Yl(e,t){var r=nn(e,t.coverage);return r===-1?null:t.sequences[r]}Ee.prototype.getDefaultScriptFeaturesIndexes=function(){for(var e=this.font.tables.gsub.scripts,t=0;t<e.length;t++){var r=e[t];if(r.tag===\"DFLT\")return r.script.defaultLangSys.featureIndexes}return[]};Ee.prototype.getScriptFeaturesIndexes=function(e){var t=this.font.tables;if(!t.gsub)return[];if(!e)return this.getDefaultScriptFeaturesIndexes();for(var r=this.font.tables.gsub.scripts,n=0;n<r.length;n++){var i=r[n];if(i.tag===e&&i.script.defaultLangSys)return i.script.defaultLangSys.featureIndexes;var s=i.langSysRecords;if(s)for(var o=0;o<s.length;o++){var a=s[o];if(a.tag===e){var l=a.langSys;return l.featureIndexes}}}return this.getDefaultScriptFeaturesIndexes()};Ee.prototype.mapTagsToFeatures=function(e,t){for(var r={},n=0;n<e.length;n++){var i=e[n].tag,s=e[n].feature;r[i]=s}this.features[t].tags=r};Ee.prototype.getScriptFeatures=function(e){var t=this.features[e];if(this.features.hasOwnProperty(e))return t;var r=this.getScriptFeaturesIndexes(e);if(!r)return null;var n=this.font.tables.gsub;return t=r.map(function(i){return n.features[i]}),this.features[e]=t,this.mapTagsToFeatures(t,e),t};Ee.prototype.getSubstitutionType=function(e,t){var r=e.lookupType.toString(),n=t.substFormat.toString();return r+n};Ee.prototype.getLookupMethod=function(e,t){var r=this,n=this.getSubstitutionType(e,t);switch(n){case\"11\":return function(i){return Hl.apply(r,[i,t])};case\"12\":return function(i){return Wl.apply(r,[i,t])};case\"63\":return function(i){return Xl.apply(r,[i,t])};case\"41\":return function(i){return jl.apply(r,[i,t])};case\"21\":return function(i){return Yl.apply(r,[i,t])};default:throw new Error(\"lookupType: \"+e.lookupType+\" - substFormat: \"+t.substFormat+\" is not yet supported\")}};Ee.prototype.lookupFeature=function(e){var t=e.contextParams,r=t.index,n=this.getFeature({tag:e.tag,script:e.script});if(!n)return new Error(\"font '\"+this.font.names.fullName.en+\"' doesn't support feature '\"+e.tag+\"' for script '\"+e.script+\"'.\");for(var i=this.getFeatureLookups(n),s=[].concat(t.context),o=0;o<i.length;o++)for(var a=i[o],l=this.getLookupSubtables(a),u=0;u<l.length;u++){var c=l[u],f=this.getSubstitutionType(a,c),q=this.getLookupMethod(a,c),p=void 0;switch(f){case\"11\":p=q(t.current),p&&s.splice(r,1,new Nt({id:11,tag:e.tag,substitution:p}));break;case\"12\":p=q(t.current),p&&s.splice(r,1,new Nt({id:12,tag:e.tag,substitution:p}));break;case\"63\":p=q(t),Array.isArray(p)&&p.length&&s.splice(r,1,new Nt({id:63,tag:e.tag,substitution:p}));break;case\"41\":p=q(t),p&&s.splice(r,1,new Nt({id:41,tag:e.tag,substitution:p}));break;case\"21\":p=q(t.current),p&&s.splice(r,1,new Nt({id:21,tag:e.tag,substitution:p}));break}t=new Le(s,r),!(Array.isArray(p)&&!p.length)&&(p=null)}return s.length?s:null};Ee.prototype.supports=function(e){if(!e.script)return!1;this.getScriptFeatures(e.script);var t=this.features.hasOwnProperty(e.script);if(!e.tag)return t;var r=this.features[e.script].some(function(n){return n.tag===e.tag});return t&&r};Ee.prototype.getLookupSubtables=function(e){return e.subtables||null};Ee.prototype.getLookupByIndex=function(e){var t=this.font.tables.gsub.lookups;return t[e]||null};Ee.prototype.getFeatureLookups=function(e){return e.lookupListIndexes.map(this.getLookupByIndex.bind(this))};Ee.prototype.getFeature=function(t){if(!this.font)return{FAIL:\"No font was found\"};this.features.hasOwnProperty(t.script)||this.getScriptFeatures(t.script);var r=this.features[t.script];return r?r.tags[t.tag]?this.features[t.script].tags[t.tag]:null:{FAIL:\"No feature for script \"+t.script}};function Kl(e){var t=e.current,r=e.get(-1);return r===null&&Tt(t)||!Tt(r)&&Tt(t)}function Zl(e){var t=e.get(1);return t===null||!Tt(t)}var Ql={startCheck:Kl,endCheck:Zl};function Jl(e){var t=e.current,r=e.get(-1);return(Tt(t)||_t(t))&&!Tt(r)}function $l(e){var t=e.get(1);switch(!0){case t===null:return!0;case(!Tt(t)&&!_t(t)):var r=Vl(t);if(!r)return!0;if(r){var n=!1;if(n=e.lookahead.some(function(i){return Tt(i)||_t(i)}),!n)return!0}break;default:return!1}}var ec={startCheck:Jl,endCheck:$l};function tc(e,t,r){t[r].setState(e.tag,e.substitution)}function rc(e,t,r){t[r].setState(e.tag,e.substitution)}function nc(e,t,r){e.substitution.forEach(function(n,i){var s=t[r+i];s.setState(e.tag,n)})}function ic(e,t,r){var n=t[r];n.setState(e.tag,e.substitution.ligGlyph);for(var i=e.substitution.components.length,s=0;s<i;s++)n=t[r+s+1],n.setState(\"deleted\",!0)}var p2={11:tc,12:rc,63:nc,41:ic};function uo(e,t,r){e instanceof Nt&&p2[e.id]&&p2[e.id](e,t,r)}function sc(e){for(var t=[].concat(e.backtrack),r=t.length-1;r>=0;r--){var n=t[r],i=l0(n),s=_t(n);if(!i&&!s)return!0;if(i)return!1}return!1}function oc(e){if(l0(e.current))return!1;for(var t=0;t<e.lookahead.length;t++){var r=e.lookahead[t],n=_t(r);if(!n)return!0}return!1}function ac(e){var t=this,r=\"arab\",n=this.featuresTags[r],i=this.tokenizer.getRangeTokens(e);if(i.length!==1){var s=new Le(i.map(function(a){return a.getState(\"glyphIndex\")}),0),o=new Le(i.map(function(a){return a.char}),0);i.forEach(function(a,l){if(!_t(a.char)){s.setCurrentIndex(l),o.setCurrentIndex(l);var u=0;sc(o)&&(u|=1),oc(o)&&(u|=2);var c;switch(u){case 1:c=\"fina\";break;case 2:c=\"init\";break;case 3:c=\"medi\";break}if(n.indexOf(c)!==-1){var f=t.query.lookupFeature({tag:c,script:r,contextParams:s});if(f instanceof Error)return console.info(f.message);f.forEach(function(q,p){q instanceof Nt&&(uo(q,i,p),s.context[p]=q.substitution)})}}})}}function h2(e,t){var r=e.map(function(n){return n.activeState.value});return new Le(r,t||0)}function lc(e){var t=this,r=\"arab\",n=this.tokenizer.getRangeTokens(e),i=h2(n);i.context.forEach(function(s,o){i.setCurrentIndex(o);var a=t.query.lookupFeature({tag:\"rlig\",script:r,contextParams:i});a.length&&(a.forEach(function(l){return uo(l,n,o)}),i=h2(n))})}function cc(e){var t=e.current,r=e.get(-1);return r===null&&vi(t)||!vi(r)&&vi(t)}function uc(e){var t=e.get(1);return t===null||!vi(t)}var qc={startCheck:cc,endCheck:uc};function d2(e,t){var r=e.map(function(n){return n.activeState.value});return new Le(r,t||0)}function fc(e){var t=this,r=\"latn\",n=this.tokenizer.getRangeTokens(e),i=d2(n);i.context.forEach(function(s,o){i.setCurrentIndex(o);var a=t.query.lookupFeature({tag:\"liga\",script:r,contextParams:i});a.length&&(a.forEach(function(l){return uo(l,n,o)}),i=d2(n))})}function ze(e){this.baseDir=e||\"ltr\",this.tokenizer=new ie,this.featuresTags={}}ze.prototype.setText=function(e){this.text=e};ze.prototype.contextChecks={latinWordCheck:qc,arabicWordCheck:Ql,arabicSentenceCheck:ec};function Ws(e){var t=this.contextChecks[e+\"Check\"];return this.tokenizer.registerContextChecker(e,t.startCheck,t.endCheck)}function pc(){return Ws.call(this,\"latinWord\"),Ws.call(this,\"arabicWord\"),Ws.call(this,\"arabicSentence\"),this.tokenizer.tokenize(this.text)}function hc(){var e=this,t=this.tokenizer.getContextRanges(\"arabicSentence\");t.forEach(function(r){var n=e.tokenizer.getRangeTokens(r);e.tokenizer.replaceRange(r.startIndex,r.endOffset,n.reverse())})}ze.prototype.registerFeatures=function(e,t){var r=this,n=t.filter(function(i){return r.query.supports({script:e,tag:i})});this.featuresTags.hasOwnProperty(e)?this.featuresTags[e]=this.featuresTags[e].concat(n):this.featuresTags[e]=n};ze.prototype.applyFeatures=function(e,t){if(!e)throw new Error(\"No valid font was provided to apply features\");this.query||(this.query=new Ee(e));for(var r=0;r<t.length;r++){var n=t[r];this.query.supports({script:n.script})&&this.registerFeatures(n.script,n.tags)}};ze.prototype.registerModifier=function(e,t,r){this.tokenizer.registerModifier(e,t,r)};function qo(){if(this.tokenizer.registeredModifiers.indexOf(\"glyphIndex\")===-1)throw new Error(\"glyphIndex modifier is required to apply arabic presentation features.\")}function dc(){var e=this,t=\"arab\";if(this.featuresTags.hasOwnProperty(t)){qo.call(this);var r=this.tokenizer.getContextRanges(\"arabicWord\");r.forEach(function(n){ac.call(e,n)})}}function mc(){var e=this,t=\"arab\";if(this.featuresTags.hasOwnProperty(t)){var r=this.featuresTags[t];if(r.indexOf(\"rlig\")!==-1){qo.call(this);var n=this.tokenizer.getContextRanges(\"arabicWord\");n.forEach(function(i){lc.call(e,i)})}}}function vc(){var e=this,t=\"latn\";if(this.featuresTags.hasOwnProperty(t)){var r=this.featuresTags[t];if(r.indexOf(\"liga\")!==-1){qo.call(this);var n=this.tokenizer.getContextRanges(\"latinWord\");n.forEach(function(i){fc.call(e,i)})}}}ze.prototype.checkContextReady=function(e){return!!this.tokenizer.getContext(e)};ze.prototype.applyFeaturesToContexts=function(){this.checkContextReady(\"arabicWord\")&&(dc.call(this),mc.call(this)),this.checkContextReady(\"latinWord\")&&vc.call(this),this.checkContextReady(\"arabicSentence\")&&hc.call(this)};ze.prototype.processText=function(e){(!this.text||this.text!==e)&&(this.setText(e),pc.call(this),this.applyFeaturesToContexts())};ze.prototype.getBidiText=function(e){return this.processText(e),this.tokenizer.getText()};ze.prototype.getTextGlyphs=function(e){this.processText(e);for(var t=[],r=0;r<this.tokenizer.tokens.length;r++){var n=this.tokenizer.tokens[r];if(!n.state.deleted){var i=n.activeState.value;t.push(Array.isArray(i)?i[0]:i)}}return t};function K(e){e=e||{},e.tables=e.tables||{},e.empty||(jr(e.familyName,\"When creating a new Font object, familyName is required.\"),jr(e.styleName,\"When creating a new Font object, styleName is required.\"),jr(e.unitsPerEm,\"When creating a new Font object, unitsPerEm is required.\"),jr(e.ascender,\"When creating a new Font object, ascender is required.\"),jr(e.descender<=0,\"When creating a new Font object, negative descender value is required.\"),this.names={fontFamily:{en:e.familyName||\" \"},fontSubfamily:{en:e.styleName||\" \"},fullName:{en:e.fullName||e.familyName+\" \"+e.styleName},postScriptName:{en:e.postScriptName||(e.familyName+e.styleName).replace(/\\s/g,\"\")},designer:{en:e.designer||\" \"},designerURL:{en:e.designerURL||\" \"},manufacturer:{en:e.manufacturer||\" \"},manufacturerURL:{en:e.manufacturerURL||\" \"},license:{en:e.license||\" \"},licenseURL:{en:e.licenseURL||\" \"},version:{en:e.version||\"Version 0.1\"},description:{en:e.description||\" \"},copyright:{en:e.copyright||\" \"},trademark:{en:e.trademark||\" \"}},this.unitsPerEm=e.unitsPerEm||1e3,this.ascender=e.ascender,this.descender=e.descender,this.createdTimestamp=e.createdTimestamp,this.tables=Object.assign(e.tables,{os2:Object.assign({usWeightClass:e.weightClass||this.usWeightClasses.MEDIUM,usWidthClass:e.widthClass||this.usWidthClasses.MEDIUM,fsSelection:e.fsSelection||this.fsSelectionValues.REGULAR},e.tables.os2)})),this.supported=!0,this.glyphs=new Ye.GlyphSet(this,e.glyphs||[]),this.encoding=new E2(this),this.position=new en(this),this.substitution=new we(this),this.tables=this.tables||{},this._push=null,this._hmtxTableData={},Object.defineProperty(this,\"hinting\",{get:function(){if(this._hinting)return this._hinting;if(this.outlinesFormat===\"truetype\")return this._hinting=new i0(this)}})}K.prototype.hasChar=function(e){return this.encoding.charToGlyphIndex(e)!==null};K.prototype.charToGlyphIndex=function(e){return this.encoding.charToGlyphIndex(e)};K.prototype.charToGlyph=function(e){var t=this.charToGlyphIndex(e),r=this.glyphs.get(t);return r||(r=this.glyphs.get(0)),r};K.prototype.updateFeatures=function(e){return this.defaultRenderOptions.features.map(function(t){return t.script===\"latn\"?{script:\"latn\",tags:t.tags.filter(function(r){return e[r]})}:t})};K.prototype.stringToGlyphs=function(e,t){var r=this,n=new ze,i=function(f){return r.charToGlyphIndex(f.char)};n.registerModifier(\"glyphIndex\",null,i);var s=t?this.updateFeatures(t.features):this.defaultRenderOptions.features;n.applyFeatures(this,s);for(var o=n.getTextGlyphs(e),a=o.length,l=new Array(a),u=this.glyphs.get(0),c=0;c<a;c+=1)l[c]=this.glyphs.get(o[c])||u;return l};K.prototype.nameToGlyphIndex=function(e){return this.glyphNames.nameToGlyphIndex(e)};K.prototype.nameToGlyph=function(e){var t=this.nameToGlyphIndex(e),r=this.glyphs.get(t);return r||(r=this.glyphs.get(0)),r};K.prototype.glyphIndexToName=function(e){return this.glyphNames.glyphIndexToName?this.glyphNames.glyphIndexToName(e):\"\"};K.prototype.getKerningValue=function(e,t){e=e.index||e,t=t.index||t;var r=this.position.defaultKerningTables;return r?this.position.getKerningValue(r,e,t):this.kerningPairs[e+\",\"+t]||0};K.prototype.defaultRenderOptions={kerning:!0,features:[{script:\"arab\",tags:[\"init\",\"medi\",\"fina\",\"rlig\"]},{script:\"latn\",tags:[\"liga\",\"rlig\"]}]};K.prototype.forEachGlyph=function(e,t,r,n,i,s){t=t!==void 0?t:0,r=r!==void 0?r:0,n=n!==void 0?n:72,i=Object.assign({},this.defaultRenderOptions,i);var o=1/this.unitsPerEm*n,a=this.stringToGlyphs(e,i),l;if(i.kerning){var u=i.script||this.position.getDefaultScriptName();l=this.position.getKerningTables(u,i.language)}for(var c=0;c<a.length;c+=1){var f=a[c];if(s.call(this,f,t,r,n,i),f.advanceWidth&&(t+=f.advanceWidth*o),i.kerning&&c<a.length-1){var q=l?this.position.getKerningValue(l,f.index,a[c+1].index):this.getKerningValue(f,a[c+1]);t+=q*o}i.letterSpacing?t+=i.letterSpacing*n:i.tracking&&(t+=i.tracking/1e3*n)}return t};K.prototype.getPath=function(e,t,r,n,i){var s=new pe;return this.forEachGlyph(e,t,r,n,i,function(o,a,l,u){var c=o.getPath(a,l,u,i,this);s.extend(c)}),s};K.prototype.getPaths=function(e,t,r,n,i){var s=[];return this.forEachGlyph(e,t,r,n,i,function(o,a,l,u){var c=o.getPath(a,l,u,i,this);s.push(c)}),s};K.prototype.getAdvanceWidth=function(e,t,r){return this.forEachGlyph(e,0,0,t,r,function(){})};K.prototype.draw=function(e,t,r,n,i,s){this.getPath(t,r,n,i,s).draw(e)};K.prototype.drawPoints=function(e,t,r,n,i,s){this.forEachGlyph(t,r,n,i,s,function(o,a,l,u){o.drawPoints(e,a,l,u)})};K.prototype.drawMetrics=function(e,t,r,n,i,s){this.forEachGlyph(t,r,n,i,s,function(o,a,l,u){o.drawMetrics(e,a,l,u)})};K.prototype.getEnglishName=function(e){var t=this.names[e];if(t)return t.en};K.prototype.validate=function(){var e=this;function t(n,i){}function r(n){var i=e.getEnglishName(n);i&&i.trim().length>0}r(\"fontFamily\"),r(\"weightName\"),r(\"manufacturer\"),r(\"copyright\"),r(\"version\"),this.unitsPerEm>0};K.prototype.toTables=function(){return n6.fontToTable(this)};K.prototype.toBuffer=function(){return console.warn(\"Font.toBuffer is deprecated. Use Font.toArrayBuffer instead.\"),this.toArrayBuffer()};K.prototype.toArrayBuffer=function(){for(var e=this.toTables(),t=e.encode(),r=new ArrayBuffer(t.length),n=new Uint8Array(r),i=0;i<t.length;i++)n[i]=t[i];return r};K.prototype.download=function(e){var t=this.getEnglishName(\"fontFamily\"),r=this.getEnglishName(\"fontSubfamily\");e=e||t.replace(/\\s/g,\"\")+\"-\"+r+\".otf\";var n=this.toArrayBuffer();if(s6())if(window.URL=window.URL||window.webkitURL,window.URL){var i=new DataView(n),s=new Blob([i],{type:\"font/opentype\"}),o=document.createElement(\"a\");o.href=window.URL.createObjectURL(s),o.download=e;var a=document.createEvent(\"MouseEvents\");a.initEvent(\"click\",!0,!1),o.dispatchEvent(a)}else console.warn(\"Font file could not be downloaded. Try using a different browser.\");else{var l=ui(),u=o6(n);l.writeFileSync(e,u)}};K.prototype.fsSelectionValues={ITALIC:1,UNDERSCORE:2,NEGATIVE:4,OUTLINED:8,STRIKEOUT:16,BOLD:32,REGULAR:64,USER_TYPO_METRICS:128,WWS:256,OBLIQUE:512};K.prototype.usWidthClasses={ULTRA_CONDENSED:1,EXTRA_CONDENSED:2,CONDENSED:3,SEMI_CONDENSED:4,MEDIUM:5,SEMI_EXPANDED:6,EXPANDED:7,EXTRA_EXPANDED:8,ULTRA_EXPANDED:9};K.prototype.usWeightClasses={THIN:100,EXTRA_LIGHT:200,LIGHT:300,NORMAL:400,MEDIUM:500,SEMI_BOLD:600,BOLD:700,EXTRA_BOLD:800,BLACK:900};function c0(e,t){var r=JSON.stringify(e),n=256;for(var i in t){var s=parseInt(i);if(!(!s||s<256)){if(JSON.stringify(t[i])===r)return s;n<=s&&(n=s+1)}}return t[n]=e,n}function gc(e,t,r){var n=c0(t.name,r);return[{name:\"tag_\"+e,type:\"TAG\",value:t.tag},{name:\"minValue_\"+e,type:\"FIXED\",value:t.minValue<<16},{name:\"defaultValue_\"+e,type:\"FIXED\",value:t.defaultValue<<16},{name:\"maxValue_\"+e,type:\"FIXED\",value:t.maxValue<<16},{name:\"flags_\"+e,type:\"USHORT\",value:0},{name:\"nameID_\"+e,type:\"USHORT\",value:n}]}function xc(e,t,r){var n={},i=new D.Parser(e,t);return n.tag=i.parseTag(),n.minValue=i.parseFixed(),n.defaultValue=i.parseFixed(),n.maxValue=i.parseFixed(),i.skip(\"uShort\",1),n.name=r[i.parseUShort()]||{},n}function yc(e,t,r,n){for(var i=c0(t.name,n),s=[{name:\"nameID_\"+e,type:\"USHORT\",value:i},{name:\"flags_\"+e,type:\"USHORT\",value:0}],o=0;o<r.length;++o){var a=r[o].tag;s.push({name:\"axis_\"+e+\" \"+a,type:\"FIXED\",value:t.coordinates[a]<<16})}return s}function bc(e,t,r,n){var i={},s=new D.Parser(e,t);i.name=n[s.parseUShort()]||{},s.skip(\"uShort\",1),i.coordinates={};for(var o=0;o<r.length;++o)i.coordinates[r[o].tag]=s.parseFixed();return i}function Sc(e,t){var r=new U.Table(\"fvar\",[{name:\"version\",type:\"ULONG\",value:65536},{name:\"offsetToData\",type:\"USHORT\",value:0},{name:\"countSizePairs\",type:\"USHORT\",value:2},{name:\"axisCount\",type:\"USHORT\",value:e.axes.length},{name:\"axisSize\",type:\"USHORT\",value:20},{name:\"instanceCount\",type:\"USHORT\",value:e.instances.length},{name:\"instanceSize\",type:\"USHORT\",value:4+e.axes.length*4}]);r.offsetToData=r.sizeOf();for(var n=0;n<e.axes.length;n++)r.fields=r.fields.concat(gc(n,e.axes[n],t));for(var i=0;i<e.instances.length;i++)r.fields=r.fields.concat(yc(i,e.instances[i],e.axes,t));return r}function Tc(e,t,r){var n=new D.Parser(e,t),i=n.parseULong();N.argument(i===65536,\"Unsupported fvar table version.\");var s=n.parseOffset16();n.skip(\"uShort\",1);for(var o=n.parseUShort(),a=n.parseUShort(),l=n.parseUShort(),u=n.parseUShort(),c=[],f=0;f<o;f++)c.push(xc(e,t+s+f*a,r));for(var q=[],p=t+s+o*a,d=0;d<l;d++)q.push(bc(e,p+d*u,c,r));return{axes:c,instances:q}}var _c={make:Sc,parse:Tc},wc=function(){return{coverage:this.parsePointer(A.coverage),attachPoints:this.parseList(A.pointer(A.uShortList))}},Ec=function(){var e=this.parseUShort();if(N.argument(e===1||e===2||e===3,\"Unsupported CaretValue table version.\"),e===1)return{coordinate:this.parseShort()};if(e===2)return{pointindex:this.parseShort()};if(e===3)return{coordinate:this.parseShort()}},Ac=function(){return this.parseList(A.pointer(Ec))},Cc=function(){return{coverage:this.parsePointer(A.coverage),ligGlyphs:this.parseList(A.pointer(Ac))}},Fc=function(){return this.parseUShort(),this.parseList(A.pointer(A.coverage))};function Mc(e,t){t=t||0;var r=new A(e,t),n=r.parseVersion(1);N.argument(n===1||n===1.2||n===1.3,\"Unsupported GDEF table version.\");var i={version:n,classDef:r.parsePointer(A.classDef),attachList:r.parsePointer(wc),ligCaretList:r.parsePointer(Cc),markAttachClassDef:r.parsePointer(A.classDef)};return n>=1.2&&(i.markGlyphSets=r.parsePointer(Fc)),i}var kc={parse:Mc},Pe=new Array(10);Pe[1]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();if(r===1)return{posFormat:1,coverage:this.parsePointer(A.coverage),value:this.parseValueRecord()};if(r===2)return{posFormat:2,coverage:this.parsePointer(A.coverage),values:this.parseValueRecordList()};N.assert(!1,\"0x\"+t.toString(16)+\": GPOS lookup type 1 format must be 1 or 2.\")};Pe[2]=function(){var t=this.offset+this.relativeOffset,r=this.parseUShort();N.assert(r===1||r===2,\"0x\"+t.toString(16)+\": GPOS lookup type 2 format must be 1 or 2.\");var n=this.parsePointer(A.coverage),i=this.parseUShort(),s=this.parseUShort();if(r===1)return{posFormat:r,coverage:n,valueFormat1:i,valueFormat2:s,pairSets:this.parseList(A.pointer(A.list(function(){return{secondGlyph:this.parseUShort(),value1:this.parseValueRecord(i),value2:this.parseValueRecord(s)}})))};if(r===2){var o=this.parsePointer(A.classDef),a=this.parsePointer(A.classDef),l=this.parseUShort(),u=this.parseUShort();return{posFormat:r,coverage:n,valueFormat1:i,valueFormat2:s,classDef1:o,classDef2:a,class1Count:l,class2Count:u,classRecords:this.parseList(l,A.list(u,function(){return{value1:this.parseValueRecord(i),value2:this.parseValueRecord(s)}}))}}};Pe[3]=function(){return{error:\"GPOS Lookup 3 not supported\"}};Pe[4]=function(){return{error:\"GPOS Lookup 4 not supported\"}};Pe[5]=function(){return{error:\"GPOS Lookup 5 not supported\"}};Pe[6]=function(){return{error:\"GPOS Lookup 6 not supported\"}};Pe[7]=function(){return{error:\"GPOS Lookup 7 not supported\"}};Pe[8]=function(){return{error:\"GPOS Lookup 8 not supported\"}};Pe[9]=function(){return{error:\"GPOS Lookup 9 not supported\"}};function Ic(e,t){t=t||0;var r=new A(e,t),n=r.parseVersion(1);return N.argument(n===1||n===1.1,\"Unsupported GPOS table version \"+n),n===1?{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(Pe)}:{version:n,scripts:r.parseScriptList(),features:r.parseFeatureList(),lookups:r.parseLookupList(Pe),variations:r.parseFeatureVariationsList()}}var Bc=new Array(10);function Rc(e){return new U.Table(\"GPOS\",[{name:\"version\",type:\"ULONG\",value:65536},{name:\"scripts\",type:\"TABLE\",value:new U.ScriptList(e.scripts)},{name:\"features\",type:\"TABLE\",value:new U.FeatureList(e.features)},{name:\"lookups\",type:\"TABLE\",value:new U.LookupList(e.lookups,Bc)}])}var Uc={parse:Ic,make:Rc};function Oc(e){var t={};e.skip(\"uShort\");var r=e.parseUShort();N.argument(r===0,\"Unsupported kern sub-table version.\"),e.skip(\"uShort\",2);var n=e.parseUShort();e.skip(\"uShort\",3);for(var i=0;i<n;i+=1){var s=e.parseUShort(),o=e.parseUShort(),a=e.parseShort();t[s+\",\"+o]=a}return t}function Dc(e){var t={};e.skip(\"uShort\");var r=e.parseULong();r>1&&console.warn(\"Only the first kern subtable is supported.\"),e.skip(\"uLong\");var n=e.parseUShort(),i=n&255;if(e.skip(\"uShort\"),i===0){var s=e.parseUShort();e.skip(\"uShort\",3);for(var o=0;o<s;o+=1){var a=e.parseUShort(),l=e.parseUShort(),u=e.parseShort();t[a+\",\"+l]=u}}return t}function Lc(e,t){var r=new D.Parser(e,t),n=r.parseUShort();if(n===0)return Oc(r);if(n===1)return Dc(r);throw new Error(\"Unsupported kern table version (\"+n+\").\")}var Pc={parse:Lc};function Nc(e,t,r,n){for(var i=new D.Parser(e,t),s=n?i.parseUShort:i.parseULong,o=[],a=0;a<r+1;a+=1){var l=s.call(i);n&&(l*=2),o.push(l)}return o}var zc={parse:Nc};function Gc(e,t){var r=ui();r.readFile(e,function(n,i){if(n)return t(n.message);t(null,Q2(i))})}function Vc(e,t){var r=new XMLHttpRequest;r.open(\"get\",e,!0),r.responseType=\"arraybuffer\",r.onload=function(){return r.response?t(null,r.response):t(\"Font could not be loaded: \"+r.statusText)},r.onerror=function(){t(\"Font could not be loaded\")},r.send()}function m2(e,t){for(var r=[],n=12,i=0;i<t;i+=1){var s=D.getTag(e,n),o=D.getULong(e,n+4),a=D.getULong(e,n+8),l=D.getULong(e,n+12);r.push({tag:s,checksum:o,offset:a,length:l,compression:!1}),n+=16}return r}function Hc(e,t){for(var r=[],n=44,i=0;i<t;i+=1){var s=D.getTag(e,n),o=D.getULong(e,n+4),a=D.getULong(e,n+8),l=D.getULong(e,n+12),u=void 0;a<l?u=\"WOFF\":u=!1,r.push({tag:s,offset:o,compression:u,compressedLength:a,length:l}),n+=20}return r}function ue(e,t){if(t.compression===\"WOFF\"){var r=new Uint8Array(e.buffer,t.offset+2,t.compressedLength-2),n=new Uint8Array(t.length);if(R5(r,n),n.byteLength!==t.length)throw new Error(\"Decompression error: \"+t.tag+\" decompressed length doesn't match recorded length\");var i=new DataView(n.buffer,0);return{data:i,offset:0}}else return{data:e,offset:t.offset}}function fo(e,t){t=t??{};var r,n,i=new K({empty:!0}),s=new DataView(e,0),o,a=[],l=D.getTag(s,0);if(l===\"\\0\u0001\\0\\0\"||l===\"true\"||l===\"typ1\")i.outlinesFormat=\"truetype\",o=D.getUShort(s,4),a=m2(s,o);else if(l===\"OTTO\")i.outlinesFormat=\"cff\",o=D.getUShort(s,4),a=m2(s,o);else if(l===\"wOFF\"){var u=D.getTag(s,4);if(u===\"\\0\u0001\\0\\0\")i.outlinesFormat=\"truetype\";else if(u===\"OTTO\")i.outlinesFormat=\"cff\";else throw new Error(\"Unsupported OpenType flavor \"+l);o=D.getUShort(s,12),a=Hc(s,o)}else throw new Error(\"Unsupported OpenType signature \"+l);for(var c,f,q,p,d,v,m,h,g,x,b,y,_=0;_<o;_+=1){var T=a[_],S=void 0;switch(T.tag){case\"cmap\":S=ue(s,T),i.tables.cmap=w2.parse(S.data,S.offset),i.encoding=new A2(i.tables.cmap);break;case\"cvt \":S=ue(s,T),y=new D.Parser(S.data,S.offset),i.tables.cvt=y.parseShortList(T.length/2);break;case\"fvar\":f=T;break;case\"fpgm\":S=ue(s,T),y=new D.Parser(S.data,S.offset),i.tables.fpgm=y.parseByteList(T.length);break;case\"head\":S=ue(s,T),i.tables.head=D2.parse(S.data,S.offset),i.unitsPerEm=i.tables.head.unitsPerEm,r=i.tables.head.indexToLocFormat;break;case\"hhea\":S=ue(s,T),i.tables.hhea=L2.parse(S.data,S.offset),i.ascender=i.tables.hhea.ascender,i.descender=i.tables.hhea.descender,i.numberOfHMetrics=i.tables.hhea.numberOfHMetrics;break;case\"hmtx\":m=T;break;case\"ltag\":S=ue(s,T),n=N2.parse(S.data,S.offset);break;case\"maxp\":S=ue(s,T),i.tables.maxp=z2.parse(S.data,S.offset),i.numGlyphs=i.tables.maxp.numGlyphs;break;case\"name\":x=T;break;case\"OS/2\":S=ue(s,T),i.tables.os2=$s.parse(S.data,S.offset);break;case\"post\":S=ue(s,T),i.tables.post=j2.parse(S.data,S.offset),i.glyphNames=new so(i.tables.post);break;case\"prep\":S=ue(s,T),y=new D.Parser(S.data,S.offset),i.tables.prep=y.parseByteList(T.length);break;case\"glyf\":q=T;break;case\"loca\":g=T;break;case\"CFF \":c=T;break;case\"kern\":h=T;break;case\"GDEF\":p=T;break;case\"GPOS\":d=T;break;case\"GSUB\":v=T;break;case\"meta\":b=T;break}}var E=ue(s,x);if(i.tables.name=X2.parse(E.data,E.offset,n),i.names=i.tables.name,q&&g){var w=r===0,F=ue(s,g),C=zc.parse(F.data,F.offset,i.numGlyphs,w),M=ue(s,q);i.glyphs=t0.parse(M.data,M.offset,C,i,t)}else if(c){var k=ue(s,c);O2.parse(k.data,k.offset,i,t)}else throw new Error(\"Font doesn't contain TrueType or CFF outlines.\");var I=ue(s,m);if(P2.parse(i,I.data,I.offset,i.numberOfHMetrics,i.numGlyphs,i.glyphs,t),t4(i,t),h){var L=ue(s,h);i.kerningPairs=Pc.parse(L.data,L.offset)}else i.kerningPairs={};if(p){var V=ue(s,p);i.tables.gdef=kc.parse(V.data,V.offset)}if(d){var G=ue(s,d);i.tables.gpos=Uc.parse(G.data,G.offset),i.position.init()}if(v){var H=ue(s,v);i.tables.gsub=Y2.parse(H.data,H.offset)}if(f){var j=ue(s,f);i.tables.fvar=_c.parse(j.data,j.offset,i.names)}if(b){var Y=ue(s,b);i.tables.meta=K2.parse(Y.data,Y.offset),i.metas=i.tables.meta}return i}function Wc(e,t,r){r=r??{};var n=typeof window>\"u\",i=n&&!r.isUrl?Gc:Vc;return new Promise(function(s,o){i(e,function(a,l){if(a){if(t)return t(a);o(a)}var u;try{u=fo(l,r)}catch(c){if(t)return t(c,null);o(c)}if(t)return t(null,u);s(u)})})}function Xc(e,t){var r=ui(),n=r.readFileSync(e);return fo(Q2(n),t)}var jc=Object.freeze({__proto__:null,Font:K,Glyph:_e,Path:pe,BoundingBox:st,_parse:D,parse:fo,load:Wc,loadSync:Xc}),u0=jc;function q0(e){return Yc(u0.parse(e))}function Yc(e){let t=1e5/((e.unitsPerEm||2048)*72),r={};r.glyphs={};for(let i in e.glyphs.glyphs){let s=e.glyphs.glyphs[i],o=[];s.unicode!==void 0&&o.push(s.unicode);for(let a of s.unicodes)o.indexOf(a)==-1&&o.push(a);for(let a of o){var n={};n.ha=Math.round(s.advanceWidth*t);let{x1:l,y1:u}=s.getPath().getBoundingBox();n.x_min=Math.round(l*t),n.x_max=Math.round(u*t),n.o=\"\",s.path.commands.forEach(function(c,f){c.type.toLowerCase()===\"c\"&&(c.type=\"b\"),n.o+=c.type.toLowerCase(),n.o+=\" \",c.x!==void 0&&c.y!==void 0&&(n.o+=Math.round(c.x*t),n.o+=\" \",n.o+=Math.round(c.y*t),n.o+=\" \"),c.x1!==void 0&&c.y1!==void 0&&(n.o+=Math.round(c.x1*t),n.o+=\" \",n.o+=Math.round(c.y1*t),n.o+=\" \"),c.x2!==void 0&&c.y2!==void 0&&(n.o+=Math.round(c.x2*t),n.o+=\" \",n.o+=Math.round(c.y2*t),n.o+=\" \")}),r.glyphs[String.fromCharCode(a)]=n}}return r.familyName=e.familyName,r.ascender=Math.round(e.ascender*t),r.descender=Math.round(e.descender*t),r.underlinePosition=Math.round(e.tables.post.underlinePosition*t),r.underlineThickness=Math.round(e.tables.post.underlineThickness*t),r.boundingBox={yMin:Math.round(e.tables.head.yMin*t),xMin:Math.round(e.tables.head.xMin*t),yMax:Math.round(e.tables.head.yMax*t),xMax:Math.round(e.tables.head.xMax*t)},r.resolution=1e3,r.original_font_information=e.tables.name,e.styleName?.toLowerCase().indexOf(\"bold\")>-1?r.cssFontWeight=\"bold\":r.cssFontWeight=\"normal\",e.styleName?.toLowerCase().indexOf(\"italic\")>-1?r.cssFontStyle=\"italic\":r.cssFontStyle=\"normal\",r}function f0(e,t,r,n=!1){let i=[];Undo.initEdit({elements:i,selection:!0},n);let s;try{s=new THREE.TextGeometry(e,{font:t,size:r.size,height:r.height,curveSegments:r.curveSegments,bevelEnabled:r.bevelThickness>0,bevelThickness:r.bevelThickness/16,bevelSize:r.bevelSize/16,bevelOffset:r.bevelOffset/16,bevelSegments:r.bevelSegments})}catch(a){throw Blockbench.showQuickMessage(\"Invalid OpenType font!\"),a}let o=ur(s);o.init(),i.push(o),o.select(),Undo.finishEdit(\"MTools: Generate Mesh\")}var Kc=new Dialog({title:\"Generate Text\",form:{text:{label:\"Text\",type:\"textarea\",value:\"Hello, World!\"},file:{label:\"OpenType Font (Optional)\",type:\"file\",extensions:[\"ttf\",\"otf\",\"woff\",\"woff2\"],placeholder:\"Roboto Regular\",filetype:\"Font\",readtype:\"buffer\"},size:{label:\"Size\",type:\"number\",value:8,min:0},height:{label:\"Thickness\",type:\"number\",value:2,min:0},curveSegments:{label:\"Resolution\",type:\"number\",value:1,min:1},_:\"_\",bevelThickness:{label:\"Bevel Thickness\",type:\"number\",value:0,min:0},bevelSize:{label:\"Bevel Size\",type:\"number\",value:8,min:0},bevelOffset:{label:\"Bevel Offset\",type:\"number\",value:0,min:0},bevelSegments:{label:\"Bevel Segments\",type:\"number\",value:1,min:0}},onConfirm(e){let t;if(!e.file)t=ka;else try{t=q0(this.form.file.content)}catch(n){throw Blockbench.showQuickMessage(\"Invalid OpenType font!\"),n}for(let n of e.text)n!=`\n`&&!(n in t.glyphs)&&bn(`Character \"${n}\" doesn't exist on the provided font!`,2e3);let r=new THREE.Font(t);f0(e.text,r,e),Undo.amendEdit({text:{label:\"Text\",type:\"textarea\",value:e.text},size:{label:\"Size\",type:\"number\",value:e.size,min:0},height:{label:\"Thickness\",type:\"number\",value:e.height,min:0},curveSegments:{label:\"Resolution\",type:\"number\",value:e.curveSegments,min:1},bevelThickness:{label:\"Bevel Thickness\",type:\"number\",value:e.bevelThickness,min:0},bevelSize:{label:\"Bevel Size\",type:\"number\",value:e.bevelSize,min:0},bevelOffset:{label:\"Bevel Offset\",type:\"number\",value:e.bevelOffset,min:0},bevelSegments:{label:\"Bevel Segments\",type:\"number\",value:e.bevelSegments,min:0}},n=>{f0(n.text,r,n,!0)})}}),Fy=P(\"textmesh\",()=>{Kc.show()});var Gt={TwistedTorus:{x:\"-cos(u)*(6-(5/4 + sin(3*v))*sin(v-3*u))\",y:\"-(6-(5/4 + sin(3*v))*sin(v-3*u))*sin(u)\",z:\"cos(v-3*u)*(5/4+sin(3*v))\",scale:1,uRange:[0,6.2831854820251465],uDivs:32,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!0,vClose:!0},Bonbon:{x:\"(u-3.3379)\",y:\"cos(u)*sin(v)\",z:\"cos(u)*cos(v)\",scale:2,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Boy:{x:\"(sq2 * cos(2*u)*pow(cos(v),2) + cos(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))\",y:\"(sq2 * sin(2*u)*pow(cos(v),2) - sin(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))\",z:\"(3*pow(cos(v),2)) / (2 - alpha*sq2*sin(3*u)*sin(2*v))\",scale:4,uRange:[-1.5707963705062866,1.5707963705062866],uDivs:16,uWrap:!1,vRange:[0,3.1415927410125732],vDivs:32,vWrap:!1,vClose:!1,variables:\"alpha=1\"},Hexahedron:{x:\"pow(cos(v),3)*pow(cos(u),3)\",y:\"pow(sin(u),3)\",z:\"pow(sin(v),3)*pow(cos(u),3)\",scale:8,uRange:[-1.2999999523162842,1.2999999523162842],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Klein:{x:\"(3*(1+sin(v)) + 2*(1-cos(v)/2)*cos(u))*cos(v)\",y:\"(4+2*(1-cos(v)/2)*cos(u))*sin(v)\",z:\"-2*(1-cos(v)/2)*sin(u)\",scale:1,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Moebius:{x:\"(cos(v)+u*cos(v/2)*cos(v))\",y:\"(u*sin(v/2))\",z:\"(sin(v)+u*cos(v/2)*sin(v))\",scale:4,uRange:[-.4000000059604645,.4000000059604645],uDivs:4,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!1,vClose:!1},Breather:{x:\"-u + (2*rr*cosh(alpha*u)*sinh(alpha*u))/denom\",y:\"(2*ww*cosh(alpha*u)*(-(ww*cos(v)*cos(ww*v)) - sin(v)*sin(ww*v)))/denom\",z:\"(2*ww*cosh(alpha*u)*(-(ww*sin(v)*cos(ww*v)) + cos(v)*sin(ww*v)))/denom\",scale:2,uRange:[-13.2,13.2],uDivs:16,uWrap:!1,vRange:[-37.4,37.4],vDivs:32,vWrap:!1,vClose:!1,variables:`alpha = 0.4\nrr= 1 - pow(alpha,2)\nww = sqrt(rr)\ndenom = alpha*( pow(ww*cosh(alpha*u),2) + pow(alpha*sin(ww*v),2) )`},RidgedTorus:{x:\"outer_radius*cos(u)+(ridge_power*sin(numofridges*u)+inner_radius)*cos(u)*cos(v)\",y:\"outer_radius*sin(u)+(ridge_power*sin(numofridges*u)+inner_radius)*sin(u)*cos(v)\",z:\"(ridge_power*sin(numofridges*u)+inner_radius)*sin(v)\",scale:1,uRange:[0,6.2831854820251465],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1,variables:`outer_radius = 5\nridge_power = 0.6\ninner_radius = 2\nnumofridges = 10`},CliffordTorus:{x:\"cos(u+v)/(sq2+cos(v-u))\",y:\"sin(v-u)/(sq2+cos(v-u))\",z:\"sin(u+v)/(sq2+cos(v-u))\",scale:4,uRange:[0,3.1415927410125732],uDivs:8,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:32,vWrap:!1,vClose:!1,variables:\"sq2 = 1.4142135623730951\"},Cyclide:{x:\"(thickness*(center_offset - aspect_ratio*cos(u)*cos(v) ) + radius*radius*cos(u)) / denom\",y:\"(radius*sin(u)*(aspect_ratio-thickness*cos(v) ) )/denom\",z:\"(radius*sin(v)*(center_offset*cos(u)-thickness ) )/denom\",scale:4,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1,variables:`aspect_ratio = 1\nradius = 0.98\ncenter_offset = 0.199\nthickness  = 0.3\ndenom = (aspect_ratio-center_offset*cos(u)*cos(v))`},Shell:{x:\"(cos(v)*(1+cos(u))*sin(v/8))\",y:\"(sin(u)*sin(v/8)+cos(v/8)*1.5)\",z:\"(sin(v)*(1+cos(u))*sin(v/8))\",scale:4,uRange:[0,6.2831854820251465],uDivs:8,uWrap:!0,vRange:[0,12.566370964050293],vDivs:32,vWrap:!1,vClose:!1},Catalan:{x:\"u-sin(u)*cosh(v)\",y:\"4*sin(1/2*u)*sinh(v/2)\",z:\"1-cos(u)*cosh(v)\",scale:1,uRange:[-3.1415927410125732,9.42477798461914],uDivs:24,uWrap:!1,vRange:[-2,2],vDivs:8,vWrap:!1,vClose:!1},Dini:{x:\"radius*cos(u)*sin(v)\",y:\"2*(((cos(v)+ln(tan(v/2)+1E-2)) + twist_rotation*u)+3.4985)\",z:\"radius*sin(u)*sin(v)\",scale:1,uRange:[0,12.566370614359172],uDivs:16,uWrap:!1,vRange:[0,2],vDivs:8,vWrap:!1,vClose:!1,variables:`radius = 4\ntwist_rotation=0.2`},Catenoid:{x:\"2*cosh(v/2)*cos(u)\",y:\"v\",z:\"2*cosh(v/2)*sin(u)\",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:24,uWrap:!0,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},Cochlea:{x:\"v*cos(u)\",y:\"v*sin(u)\",z:\"(0.4*u-2.5383)\",scale:4,uRange:[0,12.566370964050293],uDivs:16,uWrap:!1,vRange:[0,2],vDivs:16,vWrap:!1,vClose:!1},Cosinus:{x:\"u\",y:\"sin(pi* ( pow(u,2) + pow(v,2) ) )/2\",z:\"v\",scale:8,uRange:[-1,1],uDivs:16,uWrap:!1,vRange:[-1,1],vDivs:16,vWrap:!1,vClose:!1},Enneper:{x:\"u -pow(u,3)/3  + u*pow(v,2)\",y:\"pow(u,2) - pow(v,2)\",z:\"v -pow(v,3)/3  + v*pow(u,2)\",scale:1,uRange:[-2,2],uDivs:8,uWrap:!1,vRange:[-2,2],vDivs:8,vWrap:!1,vClose:!1},Helicoidal:{x:\"sinh(v)*sin(u)\",y:\"3*u\",z:\"-sinh(v)*cos(u)\",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:16,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},Helix:{x:\"(1-0.1*cos(v))*cos(u)/0.1\",y:\"0.1*(sin(v) + u/1.7 -10)/0.1 + 5\",z:\"(1-0.1*cos(v))*sin(u)/0.1\",scale:1,uRange:[0,12.566370964050293],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1},Hyperhelicoidal:{x:\"(sinh(v)*cos(3*u))/(1+cosh(u)*cosh(v))\",y:\"(cosh(v)*sinh(u))/(1+cosh(u)*cosh(v))\",z:\"(sinh(v)*sin(3*u))/(1+cosh(u)*cosh(v))\",scale:8,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:32,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:8,vWrap:!1,vClose:!1},PseudoCatenoid:{x:\"2.2*(2*cosh(v/2)*cos(u))\",y:\"1.51166 * (2*cosh(v/2)*sin(u) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) + 1.8*(v) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))\",z:\"1.51166 * (2*cosh(v/2)*sin(u) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) - 1.8*(v) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))\",scale:1,uRange:[-3.1415927410125732,3.1415927410125732],uDivs:32,uWrap:!1,vRange:[-3.1415927410125732,3.1415927410125732],vDivs:14,vWrap:!1,vClose:!1},PseudoSphere:{x:\"cos(u)*cos(v)+sin((sin(u)+1)*2*pi)\",y:\"4*sin(u)\",z:\"cos(u)*sin(v)+cos((sin(u)+1)*2*pi)\",scale:2,uRange:[-1.5707963705062866,1.5707963705062866],uDivs:32,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:8,vWrap:!1,vClose:!1},Sine:{x:\"sin(u)\",y:\"sin(v)\",z:\"sin(u+v)\",scale:8,uRange:[0,6.2831854820251465],uDivs:16,uWrap:!0,vRange:[0,6.2831854820251465],vDivs:16,vWrap:!0,vClose:!0},Snake:{x:\"1.2*(1 -v/(2*pi))*cos(3*v)*(1 + cos(u)) + 3*cos(3*v)\",y:\"9*v/(2*pi) + 1.2*(1 - v/(2*pi))*sin(u)\",z:\"1.2*(1 -v/(2*pi))*sin(3*v)*(1 + cos(u)) + 3*sin(3*v)\",scale:1,uRange:[0,6.2831854820251465],uDivs:7,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:42,vWrap:!1,vClose:!1},SteroSphere:{x:\"(2*u/(u*u+v*v+1))\",y:\"((u*u+v*v-1)/(u*u+v*v+1))\",z:\"(2*v/(u*u+v*v+1))\",scale:8,uRange:[-2,2],uDivs:16,uWrap:!1,vRange:[-2,2],vDivs:16,vWrap:!1,vClose:!1},Torus:{x:\"(1+0.5*cos(u))*cos(v)\",y:\"0.5*sin(u)\",z:\"(1+0.5*cos(u))*sin(v)\",scale:6,uRange:[0,6.2831854820251465],uDivs:8,uWrap:!1,vRange:[0,6.2831854820251465],vDivs:12,vWrap:!1,vClose:!1}};var Fe=\"INUMBER\",yr=\"IOP1\",br=\"IOP2\",Sr=\"IOP3\",at=\"IVAR\",Ht=\"IVARNAME\",vr=\"IFUNCALL\",Ei=\"IFUNDEF\",Te=\"IEXPR\",mo=\"IEXPREVAL\",Wt=\"IMEMBER\",Ai=\"IENDSTATEMENT\",gr=\"IARRAY\";function X(e,t){this.type=e,this.value=t??0}X.prototype.toString=function(){switch(this.type){case Fe:case yr:case br:case Sr:case at:case Ht:case Ai:return this.value;case vr:return\"CALL \"+this.value;case Ei:return\"DEF \"+this.value;case gr:return\"ARRAY \"+this.value;case Wt:return\".\"+this.value;default:return\"Invalid Instruction\"}};function Ci(e){return new X(yr,e)}function ct(e){return new X(br,e)}function y0(e){return new X(Sr,e)}function ho(e,t,r,n,i){for(var s=[],o=[],a,l,u,c,f=0;f<e.length;f++){var q=e[f],p=q.type;if(p===Fe||p===Ht)Array.isArray(q.value)?s.push.apply(s,ho(q.value.map(function(d){return new X(Fe,d)}).concat(new X(gr,q.value.length)),t,r,n,i)):s.push(q);else if(p===at&&i.hasOwnProperty(q.value))q=new X(Fe,i[q.value]),s.push(q);else if(p===br&&s.length>1)l=s.pop(),a=s.pop(),c=r[q.value],q=new X(Fe,c(a.value,l.value)),s.push(q);else if(p===Sr&&s.length>2)u=s.pop(),l=s.pop(),a=s.pop(),q.value===\"?\"?s.push(a.value?l.value:u.value):(c=n[q.value],q=new X(Fe,c(a.value,l.value,u.value)),s.push(q));else if(p===yr&&s.length>0)a=s.pop(),c=t[q.value],q=new X(Fe,c(a.value)),s.push(q);else if(p===Te){for(;s.length>0;)o.push(s.shift());o.push(new X(Te,ho(q.value,t,r,n,i)))}else if(p===Wt&&s.length>0)a=s.pop(),s.push(new X(Fe,a.value[q.value]));else{for(;s.length>0;)o.push(s.shift());o.push(q)}}for(;s.length>0;)o.push(s.shift());return o}function b0(e,t,r){for(var n=[],i=0;i<e.length;i++){var s=e[i],o=s.type;if(o===at&&s.value===t)for(var a=0;a<r.tokens.length;a++){var l=r.tokens[a],u;l.type===yr?u=Ci(l.value):l.type===br?u=ct(l.value):l.type===Sr?u=y0(l.value):u=new X(l.type,l.value),n.push(u)}else o===Te?n.push(new X(Te,b0(s.value,t,r))):n.push(s)}return n}function Vt(e,t,r){var n=[],i,s,o,a,l,u;if(vo(e))return ot(e,r);for(var c=e.length,f=0;f<c;f++){var q=e[f],p=q.type;if(p===Fe||p===Ht)n.push(q.value);else if(p===br)s=n.pop(),i=n.pop(),q.value===\"and\"?n.push(i?!!Vt(s,t,r):!1):q.value===\"or\"?n.push(i?!0:!!Vt(s,t,r)):q.value===\"=\"?(a=t.binaryOps[q.value],n.push(a(i,Vt(s,t,r),r))):(a=t.binaryOps[q.value],n.push(a(ot(i,r),ot(s,r))));else if(p===Sr)o=n.pop(),s=n.pop(),i=n.pop(),q.value===\"?\"?n.push(Vt(i?s:o,t,r)):(a=t.ternaryOps[q.value],n.push(a(ot(i,r),ot(s,r),ot(o,r))));else if(p===at)if(q.value in t.functions)n.push(t.functions[q.value]);else if(q.value in t.unaryOps&&t.parser.isOperatorEnabled(q.value))n.push(t.unaryOps[q.value]);else{var d=r[q.value];if(d!==void 0)n.push(d);else throw new Error(\"undefined variable: \"+q.value)}else if(p===yr)i=n.pop(),a=t.unaryOps[q.value],n.push(a(ot(i,r)));else if(p===vr){for(u=q.value,l=[];u-- >0;)l.unshift(ot(n.pop(),r));if(a=n.pop(),a.apply&&a.call)n.push(a.apply(void 0,l));else throw new Error(a+\" is not a function\")}else if(p===Ei)n.push(function(){for(var v=n.pop(),m=[],h=q.value;h-- >0;)m.unshift(n.pop());var g=n.pop(),x=function(){for(var b=Object.assign({},r),y=0,_=m.length;y<_;y++)b[m[y]]=arguments[y];return Vt(v,t,b)};return Object.defineProperty(x,\"name\",{value:g,writable:!1}),r[g]=x,x}());else if(p===Te)n.push(Jc(q,t));else if(p===mo)n.push(q);else if(p===Wt)i=n.pop(),n.push(i[q.value]);else if(p===Ai)n.pop();else if(p===gr){for(u=q.value,l=[];u-- >0;)l.unshift(n.pop());n.push(l)}else throw new Error(\"invalid Expression\")}if(n.length>1)throw new Error(\"invalid Expression (parity)\");return n[0]===0?0:ot(n[0],r)}function Jc(e,t,r){return vo(e)?e:{type:mo,value:function(n){return Vt(e.value,t,n)}}}function vo(e){return e&&e.type===mo}function ot(e,t){return vo(e)?e.value(t):e}function go(e,t){for(var r=[],n,i,s,o,a,l,u=0;u<e.length;u++){var c=e[u],f=c.type;if(f===Fe)typeof c.value==\"number\"&&c.value<0?r.push(\"(\"+c.value+\")\"):Array.isArray(c.value)?r.push(\"[\"+c.value.map(p0).join(\", \")+\"]\"):r.push(p0(c.value));else if(f===br)i=r.pop(),n=r.pop(),o=c.value,t?o===\"^\"?r.push(\"Math.pow(\"+n+\", \"+i+\")\"):o===\"and\"?r.push(\"(!!\"+n+\" && !!\"+i+\")\"):o===\"or\"?r.push(\"(!!\"+n+\" || !!\"+i+\")\"):o===\"||\"?r.push(\"(function(a,b){ return Array.isArray(a) && Array.isArray(b) ? a.concat(b) : String(a) + String(b); }((\"+n+\"),(\"+i+\")))\"):o===\"==\"?r.push(\"(\"+n+\" === \"+i+\")\"):o===\"!=\"?r.push(\"(\"+n+\" !== \"+i+\")\"):o===\"[\"?r.push(n+\"[(\"+i+\") | 0]\"):r.push(\"(\"+n+\" \"+o+\" \"+i+\")\"):o===\"[\"?r.push(n+\"[\"+i+\"]\"):r.push(\"(\"+n+\" \"+o+\" \"+i+\")\");else if(f===Sr)if(s=r.pop(),i=r.pop(),n=r.pop(),o=c.value,o===\"?\")r.push(\"(\"+n+\" ? \"+i+\" : \"+s+\")\");else throw new Error(\"invalid Expression\");else if(f===at||f===Ht)r.push(c.value);else if(f===yr)n=r.pop(),o=c.value,o===\"-\"||o===\"+\"?r.push(\"(\"+o+n+\")\"):t?o===\"not\"?r.push(\"(!\"+n+\")\"):o===\"!\"?r.push(\"fac(\"+n+\")\"):r.push(o+\"(\"+n+\")\"):o===\"!\"?r.push(\"(\"+n+\"!)\"):r.push(\"(\"+o+\" \"+n+\")\");else if(f===vr){for(l=c.value,a=[];l-- >0;)a.unshift(r.pop());o=r.pop(),r.push(o+\"(\"+a.join(\", \")+\")\")}else if(f===Ei){for(i=r.pop(),l=c.value,a=[];l-- >0;)a.unshift(r.pop());n=r.pop(),t?r.push(\"(\"+n+\" = function(\"+a.join(\", \")+\") { return \"+i+\" })\"):r.push(\"(\"+n+\"(\"+a.join(\", \")+\") = \"+i+\")\")}else if(f===Wt)n=r.pop(),r.push(n+\".\"+c.value);else if(f===gr){for(l=c.value,a=[];l-- >0;)a.unshift(r.pop());r.push(\"[\"+a.join(\", \")+\"]\")}else if(f===Te)r.push(\"(\"+go(c.value,t)+\")\");else if(f!==Ai)throw new Error(\"invalid Expression\")}return r.length>1&&(t?r=[r.join(\",\")]:r=[r.join(\";\")]),String(r[0])}function p0(e){return typeof e==\"string\"?JSON.stringify(e).replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\"):e}function mr(e,t){for(var r=0;r<e.length;r++)if(e[r]===t)return!0;return!1}function xo(e,t,r){r=r||{};for(var n=!!r.withMembers,i=null,s=0;s<e.length;s++){var o=e[s];o.type===at||o.type===Ht?!n&&!mr(t,o.value)?t.push(o.value):(i!==null&&(mr(t,i)||t.push(i)),i=o.value):o.type===Wt&&n&&i!==null?i+=\".\"+o.value:o.type===Te?xo(o.value,t,r):i!==null&&(mr(t,i)||t.push(i),i=null)}i!==null&&!mr(t,i)&&t.push(i)}function Ge(e,t){this.tokens=e,this.parser=t,this.unaryOps=t.unaryOps,this.binaryOps=t.binaryOps,this.ternaryOps=t.ternaryOps,this.functions=t.functions}Ge.prototype.simplify=function(e){return e=e||{},new Ge(ho(this.tokens,this.unaryOps,this.binaryOps,this.ternaryOps,e),this.parser)};Ge.prototype.substitute=function(e,t){return t instanceof Ge||(t=this.parser.parse(String(t))),new Ge(b0(this.tokens,e,t),this.parser)};Ge.prototype.evaluate=function(e){return e=e||{},Vt(this.tokens,this,e)};Ge.prototype.toString=function(){return go(this.tokens,!1)};Ge.prototype.symbols=function(e){e=e||{};var t=[];return xo(this.tokens,t,e),t};Ge.prototype.variables=function(e){e=e||{};var t=[];xo(this.tokens,t,e);var r=this.functions;return t.filter(function(n){return!(n in r)})};Ge.prototype.toJSFunction=function(e,t){var r=this,n=new Function(e,\"with(this.functions) with (this.ternaryOps) with (this.binaryOps) with (this.unaryOps) { return \"+go(this.simplify(t).tokens,!0)+\"; }\");return function(){return n.apply(r,arguments)}};var sn=\"TEOF\",J=\"TOP\",Fi=\"TNUMBER\",S0=\"TSTRING\",lt=\"TPAREN\",xr=\"TBRACKET\",Mi=\"TCOMMA\",yo=\"TNAME\",bo=\"TSEMICOLON\";function T0(e,t,r){this.type=e,this.value=t,this.index=r}T0.prototype.toString=function(){return this.type+\": \"+this.value};function se(e,t){this.pos=0,this.current=null,this.unaryOps=e.unaryOps,this.binaryOps=e.binaryOps,this.ternaryOps=e.ternaryOps,this.consts=e.consts,this.expression=t,this.savedPosition=0,this.savedCurrent=null,this.options=e.options,this.parser=e}se.prototype.newToken=function(e,t,r){return new T0(e,t,r??this.pos)};se.prototype.save=function(){this.savedPosition=this.pos,this.savedCurrent=this.current};se.prototype.restore=function(){this.pos=this.savedPosition,this.current=this.savedCurrent};se.prototype.next=function(){if(this.pos>=this.expression.length)return this.newToken(sn,\"EOF\");if(this.isWhitespace()||this.isComment())return this.next();if(this.isRadixInteger()||this.isNumber()||this.isOperator()||this.isString()||this.isParen()||this.isBracket()||this.isComma()||this.isSemicolon()||this.isNamedOp()||this.isConst()||this.isName())return this.current;this.parseError('Unknown character \"'+this.expression.charAt(this.pos)+'\"')};se.prototype.isString=function(){var e=!1,t=this.pos,r=this.expression.charAt(t);if(r===\"'\"||r==='\"')for(var n=this.expression.indexOf(r,t+1);n>=0&&this.pos<this.expression.length;){if(this.pos=n+1,this.expression.charAt(n-1)!==\"\\\\\"){var i=this.expression.substring(t+1,n);this.current=this.newToken(S0,this.unescape(i),t),e=!0;break}n=this.expression.indexOf(r,n+1)}return e};se.prototype.isParen=function(){var e=this.expression.charAt(this.pos);return e===\"(\"||e===\")\"?(this.current=this.newToken(lt,e),this.pos++,!0):!1};se.prototype.isBracket=function(){var e=this.expression.charAt(this.pos);return(e===\"[\"||e===\"]\")&&this.isOperatorEnabled(\"[\")?(this.current=this.newToken(xr,e),this.pos++,!0):!1};se.prototype.isComma=function(){var e=this.expression.charAt(this.pos);return e===\",\"?(this.current=this.newToken(Mi,\",\"),this.pos++,!0):!1};se.prototype.isSemicolon=function(){var e=this.expression.charAt(this.pos);return e===\";\"?(this.current=this.newToken(bo,\";\"),this.pos++,!0):!1};se.prototype.isConst=function(){for(var e=this.pos,t=e;t<this.expression.length;t++){var r=this.expression.charAt(t);if(r.toUpperCase()===r.toLowerCase()&&(t===this.pos||r!==\"_\"&&r!==\".\"&&(r<\"0\"||r>\"9\")))break}if(t>e){var n=this.expression.substring(e,t);if(n in this.consts)return this.current=this.newToken(Fi,this.consts[n]),this.pos+=n.length,!0}return!1};se.prototype.isNamedOp=function(){for(var e=this.pos,t=e;t<this.expression.length;t++){var r=this.expression.charAt(t);if(r.toUpperCase()===r.toLowerCase()&&(t===this.pos||r!==\"_\"&&(r<\"0\"||r>\"9\")))break}if(t>e){var n=this.expression.substring(e,t);if(this.isOperatorEnabled(n)&&(n in this.binaryOps||n in this.unaryOps||n in this.ternaryOps))return this.current=this.newToken(J,n),this.pos+=n.length,!0}return!1};se.prototype.isName=function(){for(var e=this.pos,t=e,r=!1;t<this.expression.length;t++){var n=this.expression.charAt(t);if(n.toUpperCase()===n.toLowerCase()){if(t===this.pos&&(n===\"$\"||n===\"_\")){n===\"_\"&&(r=!0);continue}else if(t===this.pos||!r||n!==\"_\"&&(n<\"0\"||n>\"9\"))break}else r=!0}if(r){var i=this.expression.substring(e,t);return this.current=this.newToken(yo,i),this.pos+=i.length,!0}return!1};se.prototype.isWhitespace=function(){for(var e=!1,t=this.expression.charAt(this.pos);(t===\" \"||t===\"\t\"||t===`\n`||t===\"\\r\")&&(e=!0,this.pos++,!(this.pos>=this.expression.length));)t=this.expression.charAt(this.pos);return e};var $c=/^[0-9a-f]{4}$/i;se.prototype.unescape=function(e){var t=e.indexOf(\"\\\\\");if(t<0)return e;for(var r=e.substring(0,t);t>=0;){var n=e.charAt(++t);switch(n){case\"'\":r+=\"'\";break;case'\"':r+='\"';break;case\"\\\\\":r+=\"\\\\\";break;case\"/\":r+=\"/\";break;case\"b\":r+=\"\\b\";break;case\"f\":r+=\"\\f\";break;case\"n\":r+=`\n`;break;case\"r\":r+=\"\\r\";break;case\"t\":r+=\"\t\";break;case\"u\":var i=e.substring(t+1,t+5);$c.test(i)||this.parseError(\"Illegal escape sequence: \\\\u\"+i),r+=String.fromCharCode(parseInt(i,16)),t+=4;break;default:throw this.parseError('Illegal escape sequence: \"\\\\'+n+'\"')}++t;var s=e.indexOf(\"\\\\\",t);r+=e.substring(t,s<0?e.length:s),t=s}return r};se.prototype.isComment=function(){var e=this.expression.charAt(this.pos);return e===\"/\"&&this.expression.charAt(this.pos+1)===\"*\"?(this.pos=this.expression.indexOf(\"*/\",this.pos)+2,this.pos===1&&(this.pos=this.expression.length),!0):!1};se.prototype.isRadixInteger=function(){var e=this.pos;if(e>=this.expression.length-2||this.expression.charAt(e)!==\"0\")return!1;++e;var t,r;if(this.expression.charAt(e)===\"x\")t=16,r=/^[0-9a-f]$/i,++e;else if(this.expression.charAt(e)===\"b\")t=2,r=/^[01]$/i,++e;else return!1;for(var n=!1,i=e;e<this.expression.length;){var s=this.expression.charAt(e);if(r.test(s))e++,n=!0;else break}return n&&(this.current=this.newToken(Fi,parseInt(this.expression.substring(i,e),t)),this.pos=e),n};se.prototype.isNumber=function(){for(var e=!1,t=this.pos,r=t,n=t,i=!1,s=!1,o;t<this.expression.length&&(o=this.expression.charAt(t),o>=\"0\"&&o<=\"9\"||!i&&o===\".\");)o===\".\"?i=!0:s=!0,t++,e=s;if(e&&(n=t),o===\"e\"||o===\"E\"){t++;for(var a=!0,l=!1;t<this.expression.length;){if(o=this.expression.charAt(t),a&&(o===\"+\"||o===\"-\"))a=!1;else if(o>=\"0\"&&o<=\"9\")l=!0,a=!1;else break;t++}l||(t=n)}return e?(this.current=this.newToken(Fi,parseFloat(this.expression.substring(r,t))),this.pos=t):this.pos=n,e};se.prototype.isOperator=function(){var e=this.pos,t=this.expression.charAt(this.pos);if(t===\"+\"||t===\"-\"||t===\"*\"||t===\"/\"||t===\"%\"||t===\"^\"||t===\"?\"||t===\":\"||t===\".\")this.current=this.newToken(J,t);else if(t===\"\\u2219\"||t===\"\\u2022\")this.current=this.newToken(J,\"*\");else if(t===\">\")this.expression.charAt(this.pos+1)===\"=\"?(this.current=this.newToken(J,\">=\"),this.pos++):this.current=this.newToken(J,\">\");else if(t===\"<\")this.expression.charAt(this.pos+1)===\"=\"?(this.current=this.newToken(J,\"<=\"),this.pos++):this.current=this.newToken(J,\"<\");else if(t===\"|\")if(this.expression.charAt(this.pos+1)===\"|\")this.current=this.newToken(J,\"||\"),this.pos++;else return!1;else if(t===\"=\")this.expression.charAt(this.pos+1)===\"=\"?(this.current=this.newToken(J,\"==\"),this.pos++):this.current=this.newToken(J,t);else if(t===\"!\")this.expression.charAt(this.pos+1)===\"=\"?(this.current=this.newToken(J,\"!=\"),this.pos++):this.current=this.newToken(J,t);else return!1;return this.pos++,this.isOperatorEnabled(this.current.value)?!0:(this.pos=e,!1)};se.prototype.isOperatorEnabled=function(e){return this.parser.isOperatorEnabled(e)};se.prototype.getCoordinates=function(){var e=0,t,r=-1;do e++,t=this.pos-r,r=this.expression.indexOf(`\n`,r+1);while(r>=0&&r<this.pos);return{line:e,column:t}};se.prototype.parseError=function(e){var t=this.getCoordinates();throw new Error(\"parse error [\"+t.line+\":\"+t.column+\"]: \"+e)};function te(e,t,r){this.parser=e,this.tokens=t,this.current=null,this.nextToken=null,this.next(),this.savedCurrent=null,this.savedNextToken=null,this.allowMemberAccess=r.allowMemberAccess!==!1}te.prototype.next=function(){return this.current=this.nextToken,this.nextToken=this.tokens.next()};te.prototype.tokenMatches=function(e,t){return typeof t>\"u\"?!0:Array.isArray(t)?mr(t,e.value):typeof t==\"function\"?t(e):e.value===t};te.prototype.save=function(){this.savedCurrent=this.current,this.savedNextToken=this.nextToken,this.tokens.save()};te.prototype.restore=function(){this.tokens.restore(),this.current=this.savedCurrent,this.nextToken=this.savedNextToken};te.prototype.accept=function(e,t){return this.nextToken.type===e&&this.tokenMatches(this.nextToken,t)?(this.next(),!0):!1};te.prototype.expect=function(e,t){if(!this.accept(e,t)){var r=this.tokens.getCoordinates();throw new Error(\"parse error [\"+r.line+\":\"+r.column+\"]: Expected \"+(t||e))}};te.prototype.parseAtom=function(e){var t=this.tokens.unaryOps;function r(i){return i.value in t}if(this.accept(yo)||this.accept(J,r))e.push(new X(at,this.current.value));else if(this.accept(Fi))e.push(new X(Fe,this.current.value));else if(this.accept(S0))e.push(new X(Fe,this.current.value));else if(this.accept(lt,\"(\"))this.parseExpression(e),this.expect(lt,\")\");else if(this.accept(xr,\"[\"))if(this.accept(xr,\"]\"))e.push(new X(gr,0));else{var n=this.parseArrayList(e);e.push(new X(gr,n))}else throw new Error(\"unexpected \"+this.nextToken)};te.prototype.parseExpression=function(e){var t=[];this.parseUntilEndStatement(e,t)||(this.parseVariableAssignmentExpression(t),!this.parseUntilEndStatement(e,t)&&this.pushExpression(e,t))};te.prototype.pushExpression=function(e,t){for(var r=0,n=t.length;r<n;r++)e.push(t[r])};te.prototype.parseUntilEndStatement=function(e,t){return this.accept(bo)?(this.nextToken&&this.nextToken.type!==sn&&!(this.nextToken.type===lt&&this.nextToken.value===\")\")&&t.push(new X(Ai)),this.nextToken.type!==sn&&this.parseExpression(t),e.push(new X(Te,t)),!0):!1};te.prototype.parseArrayList=function(e){for(var t=0;!this.accept(xr,\"]\");)for(this.parseExpression(e),++t;this.accept(Mi);)this.parseExpression(e),++t;return t};te.prototype.parseVariableAssignmentExpression=function(e){for(this.parseConditionalExpression(e);this.accept(J,\"=\");){var t=e.pop(),r=[],n=e.length-1;if(t.type===vr){if(!this.tokens.isOperatorEnabled(\"()=\"))throw new Error(\"function definition is not permitted\");for(var i=0,s=t.value+1;i<s;i++){var o=n-i;e[o].type===at&&(e[o]=new X(Ht,e[o].value))}this.parseVariableAssignmentExpression(r),e.push(new X(Te,r)),e.push(new X(Ei,t.value));continue}if(t.type!==at&&t.type!==Wt)throw new Error(\"expected variable for assignment\");this.parseVariableAssignmentExpression(r),e.push(new X(Ht,t.value)),e.push(new X(Te,r)),e.push(ct(\"=\"))}};te.prototype.parseConditionalExpression=function(e){for(this.parseOrExpression(e);this.accept(J,\"?\");){var t=[],r=[];this.parseConditionalExpression(t),this.expect(J,\":\"),this.parseConditionalExpression(r),e.push(new X(Te,t)),e.push(new X(Te,r)),e.push(y0(\"?\"))}};te.prototype.parseOrExpression=function(e){for(this.parseAndExpression(e);this.accept(J,\"or\");){var t=[];this.parseAndExpression(t),e.push(new X(Te,t)),e.push(ct(\"or\"))}};te.prototype.parseAndExpression=function(e){for(this.parseComparison(e);this.accept(J,\"and\");){var t=[];this.parseComparison(t),e.push(new X(Te,t)),e.push(ct(\"and\"))}};var e7=[\"==\",\"!=\",\"<\",\"<=\",\">=\",\">\",\"in\"];te.prototype.parseComparison=function(e){for(this.parseAddSub(e);this.accept(J,e7);){var t=this.current;this.parseAddSub(e),e.push(ct(t.value))}};var t7=[\"+\",\"-\",\"||\"];te.prototype.parseAddSub=function(e){for(this.parseTerm(e);this.accept(J,t7);){var t=this.current;this.parseTerm(e),e.push(ct(t.value))}};var r7=[\"*\",\"/\",\"%\"];te.prototype.parseTerm=function(e){for(this.parseFactor(e);this.accept(J,r7);){var t=this.current;this.parseFactor(e),e.push(ct(t.value))}};te.prototype.parseFactor=function(e){var t=this.tokens.unaryOps;function r(i){return i.value in t}if(this.save(),this.accept(J,r)){if(this.current.value!==\"-\"&&this.current.value!==\"+\"){if(this.nextToken.type===lt&&this.nextToken.value===\"(\"){this.restore(),this.parseExponential(e);return}else if(this.nextToken.type===bo||this.nextToken.type===Mi||this.nextToken.type===sn||this.nextToken.type===lt&&this.nextToken.value===\")\"){this.restore(),this.parseAtom(e);return}}var n=this.current;this.parseFactor(e),e.push(Ci(n.value))}else this.parseExponential(e)};te.prototype.parseExponential=function(e){for(this.parsePostfixExpression(e);this.accept(J,\"^\");)this.parseFactor(e),e.push(ct(\"^\"))};te.prototype.parsePostfixExpression=function(e){for(this.parseFunctionCall(e);this.accept(J,\"!\");)e.push(Ci(\"!\"))};te.prototype.parseFunctionCall=function(e){var t=this.tokens.unaryOps;function r(s){return s.value in t}if(this.accept(J,r)){var n=this.current;this.parseAtom(e),e.push(Ci(n.value))}else for(this.parseMemberExpression(e);this.accept(lt,\"(\");)if(this.accept(lt,\")\"))e.push(new X(vr,0));else{var i=this.parseArgumentList(e);e.push(new X(vr,i))}};te.prototype.parseArgumentList=function(e){for(var t=0;!this.accept(lt,\")\");)for(this.parseExpression(e),++t;this.accept(Mi);)this.parseExpression(e),++t;return t};te.prototype.parseMemberExpression=function(e){for(this.parseAtom(e);this.accept(J,\".\")||this.accept(xr,\"[\");){var t=this.current;if(t.value===\".\"){if(!this.allowMemberAccess)throw new Error('unexpected \".\", member access is not permitted');this.expect(yo),e.push(new X(Wt,this.current.value))}else if(t.value===\"[\"){if(!this.tokens.isOperatorEnabled(\"[\"))throw new Error('unexpected \"[]\", arrays are disabled');this.parseExpression(e),this.expect(xr,\"]\"),e.push(ct(\"[\"))}else throw new Error(\"unexpected symbol: \"+t.value)}};function n7(e,t){return Number(e)+Number(t)}function i7(e,t){return e-t}function s7(e,t){return e*t}function o7(e,t){return e/t}function a7(e,t){return e%t}function l7(e,t){return Array.isArray(e)&&Array.isArray(t)?e.concat(t):\"\"+e+t}function c7(e,t){return e===t}function u7(e,t){return e!==t}function q7(e,t){return e>t}function f7(e,t){return e<t}function p7(e,t){return e>=t}function h7(e,t){return e<=t}function d7(e,t){return!!(e&&t)}function m7(e,t){return!!(e||t)}function v7(e,t){return mr(t,e)}function g7(e){return(Math.exp(e)-Math.exp(-e))/2}function x7(e){return(Math.exp(e)+Math.exp(-e))/2}function y7(e){return e===1/0?1:e===-1/0?-1:(Math.exp(e)-Math.exp(-e))/(Math.exp(e)+Math.exp(-e))}function b7(e){return e===-1/0?e:Math.log(e+Math.sqrt(e*e+1))}function S7(e){return Math.log(e+Math.sqrt(e*e-1))}function T7(e){return Math.log((1+e)/(1-e))/2}function h0(e){return Math.log(e)*Math.LOG10E}function _7(e){return-e}function w7(e){return!e}function E7(e){return e<0?Math.ceil(e):Math.floor(e)}function A7(e){return Math.random()*(e||1)}function d0(e){return So(e+1)}function C7(e){return isFinite(e)&&e===Math.round(e)}var F7=4.7421875,po=[.9999999999999971,57.15623566586292,-59.59796035547549,14.136097974741746,-.4919138160976202,3399464998481189e-20,4652362892704858e-20,-9837447530487956e-20,.0001580887032249125,-.00021026444172410488,.00021743961811521265,-.0001643181065367639,8441822398385275e-20,-26190838401581408e-21,36899182659531625e-22];function So(e){var t,r;if(C7(e)){if(e<=0)return isFinite(e)?1/0:NaN;if(e>171)return 1/0;for(var n=e-2,i=e-1;n>1;)i*=n,n--;return i===0&&(i=1),i}if(e<.5)return Math.PI/(Math.sin(Math.PI*e)*So(1-e));if(e>=171.35)return 1/0;if(e>85){var s=e*e,o=s*e,a=o*e,l=a*e;return Math.sqrt(2*Math.PI/e)*Math.pow(e/Math.E,e)*(1+1/(12*e)+1/(288*s)-139/(51840*o)-571/(2488320*a)+163879/(209018880*l)+5246819/(75246796800*l*e))}--e,r=po[0];for(var u=1;u<po.length;++u)r+=po[u]/(e+u);return t=e+F7+.5,Math.sqrt(2*Math.PI)*Math.pow(t,e+.5)*Math.exp(-t)*r}function M7(e){return Array.isArray(e)?e.length:String(e).length}function m0(){for(var e=0,t=0,r=0;r<arguments.length;r++){var n=Math.abs(arguments[r]),i;t<n?(i=t/n,e=e*i*i+1,t=n):n>0?(i=n/t,e+=i*i):e+=n}return t===1/0?1/0:t*Math.sqrt(e)}function v0(e,t,r){return e?t:r}function k7(e,t){return typeof t>\"u\"||+t==0?Math.round(e):(e=+e,t=-+t,isNaN(e)||!(typeof t==\"number\"&&t%1===0)?NaN:(e=e.toString().split(\"e\"),e=Math.round(+(e[0]+\"e\"+(e[1]?+e[1]-t:-t))),e=e.toString().split(\"e\"),+(e[0]+\"e\"+(e[1]?+e[1]+t:t))))}function I7(e,t,r){return r&&(r[e]=t),t}function B7(e,t){return e[t|0]}function R7(e){return arguments.length===1&&Array.isArray(e)?Math.max.apply(Math,e):Math.max.apply(Math,arguments)}function U7(e){return arguments.length===1&&Array.isArray(e)?Math.min.apply(Math,e):Math.min.apply(Math,arguments)}function O7(e,t){if(typeof e!=\"function\")throw new Error(\"First argument to map is not a function\");if(!Array.isArray(t))throw new Error(\"Second argument to map is not an array\");return t.map(function(r,n){return e(r,n)})}function D7(e,t,r){if(typeof e!=\"function\")throw new Error(\"First argument to fold is not a function\");if(!Array.isArray(r))throw new Error(\"Second argument to fold is not an array\");return r.reduce(function(n,i,s){return e(n,i,s)},t)}function L7(e,t){if(typeof e!=\"function\")throw new Error(\"First argument to filter is not a function\");if(!Array.isArray(t))throw new Error(\"Second argument to filter is not an array\");return t.filter(function(r,n){return e(r,n)})}function P7(e,t){if(!(Array.isArray(t)||typeof t==\"string\"))throw new Error(\"Second argument to indexOf is not a string or array\");return t.indexOf(e)}function N7(e,t){if(!Array.isArray(t))throw new Error(\"Second argument to join is not an array\");return t.join(e)}function z7(e){return(e>0)-(e<0)||+e}var g0=1/3;function G7(e){return e<0?-Math.pow(-e,g0):Math.pow(e,g0)}function V7(e){return Math.exp(e)-1}function H7(e){return Math.log(1+e)}function W7(e){return Math.log(e)/Math.LN2}function wt(e){this.options=e||{},this.unaryOps={sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,sinh:Math.sinh||g7,cosh:Math.cosh||x7,tanh:Math.tanh||y7,asinh:Math.asinh||b7,acosh:Math.acosh||S7,atanh:Math.atanh||T7,sqrt:Math.sqrt,cbrt:Math.cbrt||G7,log:Math.log,log2:Math.log2||W7,ln:Math.log,lg:Math.log10||h0,log10:Math.log10||h0,expm1:Math.expm1||V7,log1p:Math.log1p||H7,abs:Math.abs,ceil:Math.ceil,floor:Math.floor,round:Math.round,trunc:Math.trunc||E7,\"-\":_7,\"+\":Number,exp:Math.exp,not:w7,length:M7,\"!\":d0,sign:Math.sign||z7},this.binaryOps={\"+\":n7,\"-\":i7,\"*\":s7,\"/\":o7,\"%\":a7,\"^\":Math.pow,\"||\":l7,\"==\":c7,\"!=\":u7,\">\":q7,\"<\":f7,\">=\":p7,\"<=\":h7,and:d7,or:m7,in:v7,\"=\":I7,\"[\":B7},this.ternaryOps={\"?\":v0},this.functions={random:A7,fac:d0,min:U7,max:R7,hypot:Math.hypot||m0,pyt:Math.hypot||m0,pow:Math.pow,atan2:Math.atan2,if:v0,gamma:So,roundTo:k7,map:O7,fold:D7,filter:L7,indexOf:P7,join:N7},this.consts={E:Math.E,PI:Math.PI,true:!0,false:!1}}wt.prototype.parse=function(e){var t=[],r=new te(this,new se(this,e),{allowMemberAccess:this.options.allowMemberAccess});return r.parseExpression(t),r.expect(sn,\"EOF\"),new Ge(t,this)};wt.prototype.evaluate=function(e,t){return this.parse(e).evaluate(t)};var _0=new wt;wt.parse=function(e){return _0.parse(e)};wt.evaluate=function(e,t){return _0.parse(e).evaluate(t)};var x0={\"+\":\"add\",\"-\":\"subtract\",\"*\":\"multiply\",\"/\":\"divide\",\"%\":\"remainder\",\"^\":\"power\",\"!\":\"factorial\",\"<\":\"comparison\",\">\":\"comparison\",\"<=\":\"comparison\",\">=\":\"comparison\",\"==\":\"comparison\",\"!=\":\"comparison\",\"||\":\"concatenate\",and:\"logical\",or:\"logical\",not:\"logical\",\"?\":\"conditional\",\":\":\"conditional\",\"=\":\"assignment\",\"[\":\"array\",\"()=\":\"fndef\"};function X7(e){return x0.hasOwnProperty(e)?x0[e]:e}wt.prototype.isOperatorEnabled=function(e){var t=X7(e),r=this.options.operators||{};return!(t in r)||!!r[t]};var on=new wt({allowMemberAccess:!0});on.consts={E:Math.E,e:Math.E,PI:Math.PI,pi:Math.PI,sq2:Math.SQRT2};var Dy=P(\"xyzmathsurfacefunction\",()=>{let e={};for(let o in Gt)e[o]=o;let t=localStorage.getItem(\"mt_xyzSettings\"),r;t!=null?(t=JSON.parse(t),r=t.preset):(t=Gt.TwistedTorus,r=\"TwistedTorus\");let n=!0,i=new Dialog({title:\"XYZ Math Surface Function\",part_order:[\"form\",\"lines\"],buttons:[\"Save Settings To Memory\",\"Confirm\",\"Cancel\"],cancelIndex:2,confirmIndex:1,width:650,onFormChange(o){if(n){n=!1;return}o.preset!=r&&(r=o.preset,this.setFormValues(Gt[o.preset]))},form:{preset:{label:\"Preset\",type:\"select\",options:()=>e},x:{label:\"X\",type:\"text\",value:Gt.TwistedTorus.x},y:{label:\"Y\",type:\"text\",value:Gt.TwistedTorus.y},z:{label:\"Z\",type:\"text\",value:Gt.TwistedTorus.z},scale:{label:\"Scale\",type:\"number\",value:1},_:\"_\",uRange:{label:\"U Range\",type:\"vector\",dimensions:2,value:[0,6.2831854820251465]},uDivs:{label:\"U Divisions\",type:\"number\",min:2,value:32},uWrap:{label:\"U Wrap\",type:\"checkbox\",value:!0},vRange:{label:\"V Range\",type:\"vector\",dimensions:2,value:[0,6.2831854820251465]},vDivs:{label:\"V Divisions\",type:\"number\",min:2,value:16},vWrap:{label:\"V Wrap\",type:\"checkbox\",value:!0},vClose:{label:\"V Close\",type:\"checkbox\",value:!0},__:\"_\",variables:{label:\"Variables\",type:\"textarea\",placeholder:\"List the variables you want to use via name = value\"}},onConfirm(o){let a=o.variables.split(`\n`),l={};for(let q of a){let[p,d]=q.split(/=(.+)/);p=p.replace(/[\\s;]/g,\"\"),d!==void 0&&(d=d.trim(),l[p]=on.parse(d))}let u=[];for(let q in l)l[q].variables().length==0&&u.push(q);function c(q,p={},d=!1){let v={},m=[];Undo.initEdit({elements:m,selection:!0},d);let h=new Mesh({vertices:{}}),[g,x]=o.uRange,b=q.uDivs,y=(x-g)/b,[_,T]=o.vRange,S=q.vDivs,E=(T-_)/S,w=b+1,F=S+1;o.uWrap&&(w-=1),o.vWrap&&(F-=1);let C=[],M=[];for(let k=0;k<F;k++){let I=_+k*E;for(let L=0;L<w;L++){let V=g+L*y,G={u:V,v:I,p:{u:V,v:I}};Yt(G,\"u\"),Yt(G,\"v\"),Yt(G,\"p\"),Yt(G.p,\"u\"),Yt(G.p,\"v\");for(let ee in l){if(ee in p){v[ee]=G[ee]=p[ee];continue}let Tr=l[ee];v[ee]=G[ee]=Tr.evaluate(G)}let H=+on.evaluate(o.x,G)*o.scale,j=+on.evaluate(o.y,G)*o.scale,Y=+on.evaluate(o.z,G)*o.scale;(isNaN(H)||Math.abs(H)===1/0)&&(H=0),(isNaN(j)||Math.abs(j)===1/0)&&(j=0),(isNaN(Y)||Math.abs(Y)===1/0)&&(Y=0),C.push(h.addVertices([H,j,Y])[0]),M.push([L,k])}}for(let k=0;k<S;k++)for(let I=0;I<b;I++){let L=k+1,V=I+1;o.vWrap&&L>=F&&(L=0),o.uWrap&&V>=w&&(V=0);let G=[L*w+V,L*w+I,k*w+I,k*w+V],H=new MeshFace(h,{vertices:[C[G[0]],C[G[1]],C[G[2]],C[G[3]]]}),j=[M[G[0]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[1]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[2]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height),M[G[3]].slice().V3_divide(w-1,F-1).V3_multiply(Project._texture_width,Project._texture_height)];H.uv[H.vertices[0]]=[j[0][0],j[0][1]],H.uv[H.vertices[1]]=[j[1][0],j[1][1]],H.uv[H.vertices[2]]=[j[2][0],j[2][1]],H.uv[H.vertices[3]]=[j[3][0],j[3][1]],h.addFaces(H)}if(o.vClose&&o.uWrap&&!o.vWrap)for(let k=1;k<b-1;k++){let I=new MeshFace(h,{vertices:[C[b-1],C[b-1-k],C[b-2-k]]}),L=new MeshFace(h,{vertices:[C[S*w],C[S*w+k],C[S*w+k+1]]});h.addFaces(I,L)}return h.init(),m.push(h),h.select(),Undo.finishEdit(\"MTools: Generate Mesh\"),v}let f=c(o);Undo.amendEdit({uDivs:{label:\"U divisions\",value:o.uDivs,min:2},vDivs:{label:\"V divisions\",value:o.vDivs,min:2},...Object.fromEntries(u.map(q=>[\"@value/\"+q,{label:Uo(q),value:f[q],step:.1}]))},q=>{let p={};for(let d in q)d.startsWith(\"@value/\")&&(p[d.substring(7)]=q[d]);c(q,p,!0)})}});i.show(),t!=null&&i.setFormValues(t);let s=$('button:contains(\"Save Settings To Memory\")');s.off(\"click\"),s.on(\"click\",function(){let o=i.getFormResult();localStorage.setItem(\"mt_xyzSettings\",JSON.stringify(o))})});var zy=P(\"generators\");var w0=[],ki=[];BBPlugin.register(Xt,{new_repository_format:!0,title:\"MTools\",author:\"Malik12tree\",icon:\"icon.png\",description:\"Adds powerful mesh modeling tools, operators and generators!\",version:\"2.1.0\",min_version:\"4.9.4\",variant:\"both\",creation_date:\"2022-04-09\",has_changelog:!0,tags:[\"Format: Generic Model\",\"Mesh\",\"Tool\"],onload(){function e(r){for(let n of ki)scene.remove(n);for(let n in r.faces){let i=r.faces[n],s=i.getCenter().V3_toThree();r.mesh.localToWorld(s);let o=i.getNormal(!0).V3_toThree(),a=zi(n,{fillStyle:\"blue\",fontSize:25});ki.push(a),a.position.copy(s),o&&a.position.add(o.multiplyScalar(.5)),scene.add(a)}for(let n in r.vertices){let i=r.vertices[n].V3_toThree();r.mesh.localToWorld(i);let s=Po(r,n)??new THREE.Vector3(0,1,0),o=zi(n,{fillStyle:\"red\",fontSize:25});ki.push(o),o.position.copy(i),s&&o.position.add(s.multiplyScalar(.25)),scene.add(o)}}if(!1){w0.push(Mesh.prototype.preview_controller.on(\"update_geometry\",({element:r})=>e(r)));for(let r of Mesh.all)e(r)}Mesh.prototype.menu.structure.unshift(Et(\"tools\")),Mesh.prototype.menu.structure.unshift(Et(\"operators\")),MenuBar.addAction(Et(\"generators\"),\"filter\")},onuninstall(){un.clear()},onunload(){for(let e of w0)e.delete();for(let e of ki)scene.remove(e);for(let e in qn){let t=Et(e);BarItems[t]?.delete()}}});})();\n/*! Bundled license information:\n\nopentype.js/dist/opentype.module.js:\n  (*! https://mths.be/codepointat v0.2.0 by @mathias *)\n\nexpr-eval/dist/index.mjs:\n  (*!\n   Based on ndef.parser, by Raphael Graf(r@undefined.ch)\n   http://www.undefined.ch/mparser/index.html\n  \n   Ported to JavaScript and modified by Matthew Crumley (email@matthewcrumley.com, http://silentmatt.com/)\n  \n   You are free to use and modify this code in anyway you find useful. Please leave this comment in the code\n   to acknowledge its original source. If you feel like it, I enjoy hearing about projects that use my code,\n   but don't feel like you have to let me know or ask permission.\n  *)\n*/\n"
  },
  {
    "path": "plugins/meshy/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/meshy/about.md",
    "content": "# Meshy\nMeshy is a plugin for Blockbench that allows you to create meshes from your bedrock models and import them into Minecraft. \n\nIt's pretty simple just download the plugin and make a mesh like you normally would. Then add the geometry to your project.\nAlternatively you can also import an obj file then export it as a mesh. File -> Import -> Import OBJ File.\n\nIt may also be slower for large meshes or if you don't have a the best computer. I've tested it quite large meshes and it works fine. But millage may vary.\n## Settings\n\n### Normalize UVs \nThis will normalize the UVs of the mesh so that they are all between 0 and 1. This on by default it works either way but it is recommended to turn it on. So that if you change the texture size it will still be proprietary sized.\n\n### Skip Normals\nThis is a feature that skips the normal calculation for the mesh. This is off by default becuase most of the time you want to have the shading information. It will result in a smaller file size and will be faster to export. ( Not a major diffrence but it is a diffrence )\n\n### Force Multi-Textures\nThis forces multiple textures to be used for bedrock models. This is off by default sense bedrock models can only have one texture. This force them to be enabled. But you will need to stitch the textures before you try puttinng them in minecraft. The plugin Texture Stitcher by mchorse can do this for you.\n\n## CONTRIBUTING\nIf you want to contribute to this plugin please make a pull request at my [GitHub repository](https://github.com/Shadowkitten47/Meshy). Also check that the change hasn't already been made onto that version sense I work on that quite a bit. If for some reason I don't respond or abonded the project or for any other reason that you want to make a change directly to BB make sure to comment Your username, What you changed, and why."
  },
  {
    "path": "plugins/meshy/changelog.json",
    "content": "{\n  \"1.0.3\": {\n    \"title\": \"1.0.3\",\n    \"date\": \"2024-10-8\",\n    \"author\": \"Shadowkitten47\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.4\": {\n    \"title\": \"1.0.4\",\n    \"date\": \"2024-18-8\",\n    \"author\": \"Shadowkitten47\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fix the invertion of the x-axis of the mesh\",\n          \"Fix other smaller issues\"\n        ]\n      }\n    ]\n  },\n  \"1.0.5\": {\n    \"title\": \"1.0.5\",\n    \"date\": \"2025-7-6\",\n    \"author\": \"Shadowkitten47\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes 2\",\n        \"list\": [\n          \"Removed Meta Data, which caused issues on later versions of minecraft formating\",\n          \"Fixed 1/2 length faces (lines and points) which would cause them not to render ingame\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/meshy/members.yml",
    "content": "maintainers:\n  - Shadowkitten47\ndevelopers:\n  - Shadowkitten47\n"
  },
  {
    "path": "plugins/meshy/meshy.js",
    "content": "(function() {\n    const pluginInfo = {\"name\":\"Meshy\",\"id\":\"meshy\",\"version\":\"1.0.5\",\"repository\":\"https://github.com/Shadowkitten47/Meshy\"};\n    \n    const pluginSettings = [\n        {\n            id: 'meshy_normalized_mesh_uvs',\n            name: 'Normalize Mesh UVs',\n            description: 'Normalize UVs of polymeshes',\n            category: 'export',\n            value: true,\n            plugin: pluginInfo.id,\n        },\n        {\n            id: 'meshy_skip_mesh_normals',\n            name: 'Skip Mesh Normals',\n            description: 'Skips normal claculation on polymeshes',\n            category: 'export',\n            value: false,\n            plugin: pluginInfo.id,\n        },\n        {\n            //Force disable single texture on bedrock formats having more than one texture with meshes is pretty useful\n            id: 'meshy_force_textures',\n            name: 'Force Multi-Textures',\n            description: 'Forces bedrock formats to use allow more than one texture ( You will need to stitch the textures )',\n            category: 'edit',\n            value: false,\n            plugin: pluginInfo.id,\n            onChange: (value) => {\n                Formats['bedrock'].single_texture = !value;\n                Formats['bedrock_old'].single_texture = !value;\n            },\n        },\n    ];\n    \n    //Function names for events to remove\n    const listOfFunctions = [ meshyOnParseEvent.name, meshyOnCompileEvent.name, meshyOnBedrockCompileEvent.name];\n    \n    Plugin.register(pluginInfo.id, {\n        title: pluginInfo.name, //Meshy\n        author: 'Shadowkitten47',\n        creation_date: '2024-09-28',\n        icon: 'diamond',\n        description: 'Enables the use of a meshes in bedrock formats and to export them to Minecraft Bedrock',\n        variant: 'both',\n        version: pluginInfo.version, //1.0.4\n        tags: ['Minecraft: Bedrock Edition', 'Entity Models', 'Mesh'],\n        has_changelog: true,\n        min_version: '4.10.4',\n        repository: pluginInfo.repository, //Link\n        onload() {\n            let bedrock_old = Formats['bedrock_old'];\n            let bedrock = Formats['bedrock'];\n            bedrock.meshes = true;\n            bedrock_old.meshes = true;\n            for (let s of pluginSettings) {\n                if (!settings[s.id]) {\n                    new Setting(s.id, s);\n                }\n            }\n            bedrock.single_texture = !settings['meshy_force_textures']?.value;\n            bedrock_old.single_texture = !settings['meshy_force_textures']?.value;\n    \n            let codec = Codecs['bedrock'];\n            purgeEvents(codec); //Removes all of events that match the function names used so that duplicates don't occur\n    \n            codec.on('parsed', meshyOnParseEvent);\n            codec.on('compile', meshyOnBedrockCompileEvent);\n    \n            codec = Codecs['bedrock_old'];\n            purgeEvents(codec);\n    \n            codec.on('parsed', meshyOnParseEvent);\n            codec.on('compile', meshyOnCompileEvent);\n            //pivot_tool = Toolbars[\"tools\"].children.find((t) => t.id == 'pivot_tool').condition = () => { return false; };\n\n        },\n        onunload() {\n            let bedrock_old = Formats['bedrock_old'];\n            let bedrock = Formats['bedrock'];\n            bedrock.meshes = false;\n            bedrock_old.meshes = false;\n            bedrock.single_texture = true;\n            bedrock_old.single_texture = true;\n            for (let s of pluginSettings) {\n                if (settings[s.id]) {\n                    settings[s.id].delete();\n                }\n            }\n            let codec = Codecs['bedrock'];\n            purgeEvents(codec);\n            codec = Codecs['bedrock_old'];\n            purgeEvents(codec);\n            \n\n        },\n    });\n    \n    //Beaware: Function zone below\n    function meshyOnCompileEvent({model, options}) {\n        let groups = getAllGroups();\n        let loose_elements = [];\n        Outliner.root.forEach((obj) => {\n            if (obj instanceof OutlinerElement) {\n                loose_elements.push(obj);\n            }\n        });\n        if (loose_elements.length) {\n            let group = new Group({\n                name: 'bb_main',\n            });\n            group.children.push(...loose_elements);\n            group.is_catch_bone = true;\n            group.createUniqueName();\n            groups.splice(0, 0, group);\n        }\n        for (let i = 0; i < groups.length; i++) {\n            const g = groups[i];\n            if (g.type !== 'group' || g.export == false) return;\n            if (!settings.export_empty_groups.value && !g.children.find((child) => child.export)) return;\n            const bone = model.bones.find((b) => b.name === g.name);\n            let poly_mesh = null;\n            for (var obj of g.children) {\n                if (obj instanceof Mesh) {\n                    poly_mesh = compileMesh(poly_mesh, obj);\n                }\n            }\n            if (poly_mesh !== null) {\n                bone.poly_mesh = poly_mesh;\n            }\n        }\n    }\n    function meshyOnParseEvent({model}) {\n        for (let i = 0; i < model.bones.length; i++) {\n            const bone = model.bones[i];\n            //The groups and bone should be parrel but to make sure it works in all cases below os freaky\n            const group = Project.groups[i].name === bone.name ? Project.groups[i] : Project.groups.find((g) => g.name === bone.name) ?? new Group({name: bone.name});\n            if (bone.poly_mesh != null) {\n                parseMesh(bone.poly_mesh, group);\n            }\n        }\n    }\n    function meshyOnBedrockCompileEvent({model, options}) { //Extra step for non-legacy bedrock\n        model = model['minecraft:geometry'][0];\n        meshyOnCompileEvent({model, options});\n    }\n    \n    //Ensures every function is removed with the names used here. This is so that if duplicates are created it doesn't cause issues\n    //The regular version does not do this\n    function purgeEvents(codec) {\n        \n        for (let i = 0; i < codec.events['parsed']?.length; i++) {\n            if (listOfFunctions.includes(codec.events['parsed'][i].name)) {\n                codec.events['parsed'].splice(i, 1);\n            }\n        }\n        for (let i = 0; i < codec.events['compile']?.length; i++) {\n            if (listOfFunctions.includes(codec.events['compile'][i].name)) {\n                codec.events['compile'].splice(i, 1);\n            }\n                \n        }\n    }\n    \n    /**\n     * Converts a mesh to a polymesh.\n     * @param {Object} polyMesh The polymesh to save to. If not defined, a new polymesh will be created.\n     * @param {Mesh} mesh The mesh to save.\n     * @returns {Object} The polymesh with the mesh saved to it.\n     */\n    function compileMesh(polyMesh, mesh) {\n        polyMesh ??= \n        {\n            normalized_uvs: settings[\"meshy_normalized_mesh_uvs\"].value,\n            positions: [],\n            normals: [],\n            uvs: [],\n            polys: []\n        };\n\n        //vertex keys -> value\n        const postionMap = new Map();\n        const normalMap = new Map();\n        const uvMap = new Map();\n        \n    \n        //normal arr -> value\n        const normals = new Map();\n    \n        //Make a map of faces a vertex is appart of \n        const vertexFacesMap = new Map();\n        for (let faceKey in mesh.faces) {\n            let face = mesh.faces[faceKey];\n            for (let vertexKey of face.vertices) {\n                if (!vertexFacesMap.has(vertexKey)) {\n                    vertexFacesMap.set(vertexKey, []);\n                }\n                vertexFacesMap.get(vertexKey).push(faceKey);\n            }\n        }\n\n        for (let [key, pos] of getVertices(mesh)) {\n            postionMap.set(key, polyMesh.positions.length);\n            polyMesh.positions.push(pos);\n    \n            const normal = getVertexNormal(mesh, key, vertexFacesMap);\n\n            if (!normals.has(normal.toString())) {\n                normalMap.set(key, polyMesh.normals.length);\n                normals.set(normal.toString(), polyMesh.normals.length);\n                polyMesh.normals.push(normal);\n            }\n            else normalMap.set(key, normals.get(normal.toString()))\n        }\n    \n        normals.clear();\n\n        let polys = Object.values(mesh.faces).map((face) => {\n            const poly = face.getSortedVertices().map((vertexKey) => {\n                const uv = uvOnSave(...face.uv[vertexKey]);\n    \n                const uIndex = uvMap.get(uv.toString()) ?? (() => {\n                    const index = polyMesh.uvs.length;\n                    polyMesh.uvs.push(uv);\n                    uvMap.set(uv.toString(), index);\n                    return index;\n                })();\n    \n                return [postionMap.get(vertexKey), normalMap.get(vertexKey), uIndex];\n            });\n            if (poly.length < 4) \n                //Fill the poly with the first vertex if less than a quad change: Support for less than 3 vertices\n                return poly.concat(Array(4 - poly.length).fill(poly[0]));\n            return poly;\n        });\n        //Spread opertator fails here so we loop for each\n        for (let poly of polys) polyMesh.polys.push(poly);\n        return polyMesh;\n    }\n    \n    function parseMesh(polyMesh, group) {\n        const mesh = new Mesh({name: \"mesh\", autouv: 0, color: group.color, vertices: []});\n        const uniquePoints = new Set();\n        for ( let face of polyMesh.polys ) {\n                const unique = new Set();\n                const vertices = []\n                const uvs = {}\n                for (let point of face ) {\n                    if (unique.has(point.toString())) continue;\n                    unique.add(point.toString());\n    \n                    if ( !uniquePoints.has(point[0])) {\n                        uniquePoints.add(point[0]);\n                        let position = polyMesh.positions[point[0]]\n                        position[0] *= -1;\n                        mesh.vertices[`v${point[0]}`] = position;\n                    }\n\n                    vertices.push(`v${point[0]}`);\n        \n                    const uv = [...polyMesh.uvs[point[2]]]\n                    if (polyMesh.normalized_uvs) { \n                        uv.V2_multiply(Project.texture_width, Project.texture_height)\n                    }\n                    uv[1] = Project.texture_height - uv[1]  //Invert y axis\n                    uvs[`v${point[0]}`] = uv;\n                }\n                mesh.addFaces(new MeshFace(mesh, { uv: uvs, vertices }));\n        }\n        mesh.addTo(group).init();\n    }\n    \n    function uvOnSave(...uv) { \n        uv[1] = Project.texture_height - uv[1] //Invert y axis\n        if (!settings[\"meshy_normalized_mesh_uvs\"].value) return uv\n        uv[0] /= Project.texture_width\n        uv[1] /= Project.texture_height\n        return uv\n    }\n    \n    //gets vertices of a Mesh and applys transformations to the points so that they can be exported\n    function getVertices(mesh) {\n        const verts = Object.entries(mesh.vertices).map( ( [key, point ]) => { \n            //Generate a copy of the point so that it won't effect the original point\n            let p = [...point]\n\n            p.V3_add(mesh.origin)\n            p = rotatePoint(p, mesh.origin, mesh.rotation)\n            p[0] *= -1;\n\n            return [ key, p ]\n        }) \n        return verts;\n    }\n    \n    /**\n     * Gets the vertex normal of a mesh\n     * @param {Mesh} mesh The mesh to get the vertex normal from\n     * @param {string} vertexKey The key of the vertex\n     * @param {Map} vertexFacesMap The map of vertex faces\n     * The vertexFacesMap is used to get the faces of the vertex \n     * This so we don't have to loop through the faces for each vertex\n     */\n    function getVertexNormal(mesh, vertexKey, vertexFacesMap) {\n        if (settings[\"meshy_skip_mesh_normals\"].value) return [ 0,1,0 ];\n        let normalSum = [0, 0, 0];\n        let faceCount = 0;\n    \n        const faces = vertexFacesMap.get(vertexKey) || []\n        for (let face of faces) {\n            face = mesh.faces[face];\n            let faceNormal = face.getNormal();\n            normalSum[0] += faceNormal[0];\n            normalSum[1] += faceNormal[1];\n            normalSum[2] += faceNormal[2];\n            faceCount++;\n        }\n    \n        let normalLength = Math.sqrt(normalSum[0] * normalSum[0] + normalSum[1] * normalSum[1] + normalSum[2] * normalSum[2]);\n        if (normalLength === 0) {\n            return [0, 1, 0]; // Default to up vector if normal is zero\n        }\n        return [\n            normalSum[0] / normalLength,\n            normalSum[1] / normalLength,\n            normalSum[2] / normalLength\n        ];\n    }\n    \n    \n    function rotatePoint(point, center, rotation) {\n        // Convert rotation angles to radians\n        const [rx, ry, rz] = rotation.map(Math.degToRad);\n    \n        // Translate point to origin\n        let [x, y, z] = point.map((coord, i) => coord - center[i]);\n    \n        // Rotate around X-axis\n        let temp = y;\n        y = y * Math.cos(rx) - z * Math.sin(rx);\n        z = temp * Math.sin(rx) + z * Math.cos(rx);\n    \n        // Rotate around Y-axis\n        temp = x;\n        x = x * Math.cos(ry) + z * Math.sin(ry);\n        z = -temp * Math.sin(ry) + z * Math.cos(ry);\n    \n        // Rotate around Z-axis\n        temp = x;\n        x = x * Math.cos(rz) - y * Math.sin(rz);\n        y = temp * Math.sin(rz) + y * Math.cos(rz);\n    \n        // Translate back\n        return [\n            x + center[0],\n            y + center[1],\n            z + center[2]\n        ];\n    }\n    \n    })();\n    \n    \n    \n    "
  },
  {
    "path": "plugins/mimodel_format.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\n\n(function() {\n\nvar codec;\n\nPlugin.register('mimodel_format', {\n\ttitle: 'Mine-imator Model Exporter',\n\ticon: 'fas.fa-box-open',\n\tauthor: 'JannisX11',\n\tdescription: 'Export .mimodel files for Mine-imator and Modelbench',\n\ttags: [\"Exporter\"],\n\tversion: '1.0.2',\n\tmin_version: '3.7.0',\n\tvariant: 'both',\n\tonload() {\n\t\t\n\t\tcodec = new Codec('mimodel', {\n\t\t\tname: 'Export Mine-imator Mimodel',\n\t\t\textension: 'mimodel',\n\t\t\tremember: false,\n\t\t\tcompile(options = {}) {\n\n\t\t\t\tif (!Project.box_uv) {\n\t\t\t\t\tBlockbench.showMessageBox({\n\t\t\t\t\t\ttitle: 'Mine-imator Model Exporter',\n\t\t\t\t\t\tmessage: 'Models need to use the UV mode \"Box UV\", otherwise the exporter won\\'t work correctly.'\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tlet entitymodel = {\n\t\t\t\t\tname: Project.geometry_name || Project.name || '',\n\t\t\t\t\tfloor_box_uvs: true,\n\t\t\t\t}\n\t\t\t\tif (Texture.getDefault()) {\n\t\t\t\t\tentitymodel.texture = Texture.getDefault().name\n\t\t\t\t}\n\t\t\t\tentitymodel.texture_size = [Project.texture_width, Project.texture_height];\n\t\t\t\tentitymodel.parts = [];\n\n\t\t\t\tfunction convertSpace(array) {\n\t\t\t\t\tarray[0] *= -1;\n\t\t\t\t\tarray[2] *= -1;\n\t\t\t\t\treturn array;\n\t\t\t\t}\n\t\t\t\tlet base_part;\n\n\t\t\t\tfunction exportArray(array, target) {\n\t\t\t\t\tarray.forEach(item => {\n\t\t\t\t\t\tif (item instanceof Group) {\n\n\t\t\t\t\t\t\tlet part = {\n\t\t\t\t\t\t\t\tname: item.name,\n\t\t\t\t\t\t\t\tposition: item.origin.slice()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (item.parent instanceof Group) {\n\t\t\t\t\t\t\t\tpart.position.V3_subtract(item.parent.origin);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconvertSpace(part.position);\n\t\t\t\t\t\t\tif (item.rotation.find(v => v)) {\n\t\t\t\t\t\t\t\tpart.rotation = convertSpace(item.rotation.slice());\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!target.parts) target.parts = [];\n\t\t\t\t\t\t\ttarget.parts.push(part);\n\n\t\t\t\t\t\t\texportArray(item.children, part);\n\n\t\t\t\t\t\t} else if (item instanceof Cube) {\n\n\t\t\t\t\t\t\tlet shape = {\n\t\t\t\t\t\t\t\ttype: 'block',\n\t\t\t\t\t\t\t\tfrom: convertSpace(item.from.slice().V3_subtract(item.origin)),\n\t\t\t\t\t\t\t\tto: convertSpace(item.to.slice().V3_subtract(item.origin)),\n\t\t\t\t\t\t\t\tinflate: item.inflate || undefined,\n\t\t\t\t\t\t\t\tuv: item.uv_offset.slice(),\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet invert = false;\n\t\t\t\t\t\t\tfor (let axis = 0; axis < 3; axis++) {\n\t\t\t\t\t\t\t\tif ((shape.from[axis] > shape.to[axis]) == (axis == 1)) {\n\t\t\t\t\t\t\t\t\tinvert = !invert;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (shape.from[axis] > shape.to[axis]) {\n\t\t\t\t\t\t\t\t\tlet temp = shape.from[axis];\n\t\t\t\t\t\t\t\t\tshape.from[axis] = shape.to[axis];\n\t\t\t\t\t\t\t\t\tshape.to[axis] = temp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet size = item.size();\n\t\t\t\t\t\t\tshape.uv[0] += size[2];\n\t\t\t\t\t\t\tshape.uv[1] += size[2];\n\t\t\t\t\t\t\tif (item.mirror_uv) shape.texture_mirror = true;\n\t\t\t\t\t\t\tif (invert) shape.invert = true;\n\n\t\t\t\t\t\t\tshape.position = item.origin.slice();\n\t\t\t\t\t\t\tif (item.parent instanceof Group) {\n\t\t\t\t\t\t\t\tshape.position.V3_subtract(item.parent.origin);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconvertSpace(shape.position);\n\t\t\t\t\t\t\tif (item.rotation.find(v => v)) {\n\t\t\t\t\t\t\t\tshape.rotation = convertSpace(item.rotation.slice());\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (target == entitymodel) {\n\t\t\t\t\t\t\t\tif (!base_part) {\n\t\t\t\t\t\t\t\t\tbase_part = {\n\t\t\t\t\t\t\t\t\t\tname: 'model_part',\n\t\t\t\t\t\t\t\t\t\tposition: [0, 0, 0],\n\t\t\t\t\t\t\t\t\t\tshapes: []\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (!entitymodel.parts) entitymodel.parts = [];\n\t\t\t\t\t\t\t\t\tentitymodel.parts.push(base_part);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbase_part.shapes.push(shape);\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (!target.shapes) target.shapes = [];\n\t\t\t\t\t\t\t\ttarget.shapes.push(shape);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\texportArray(Outliner.root, entitymodel);\n\t\t\n\t\t\t\tthis.dispatchEvent('compile', {entitymodel, options});\n\t\t\n\t\t\t\tif (options.raw) {\n\t\t\t\t\treturn entitymodel\n\t\t\t\t} else {\n\t\t\t\t\treturn autoStringify(entitymodel)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tcodec.export_action = new Action('export_mimodel', {\n\t\t\tname: 'Export Mine-imator Mimodel',\n\t\t\ticon: 'fas.fa-box-open',\n\t\t\tcategory: 'file',\n\t\t\tclick: function () {\n\t\t\t\tcodec.export()\n\t\t\t}\n\t\t})\n\n\t\tMenuBar.addAction(codec.export_action, 'file.export')\n\n\t},\n\tonunload() {\n\t\tcodec.export_action.delete();\n\t\tcodec.delete();\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/minecraft_block_wizard/about.md",
    "content": "\nThis Block Wizard for Minecraft Bedrock Edition let's you add your own custom blocks to the game without any prior coding knowledge.\n\nSelect from a list of presets, and customize basic properties of the block.\n\nThen you can use Blockbench's powerful editor to design your own model!\n\nThe generated Add-On can be added to Minecraft, and you can use your block to build in your own world!\n\n> Developed by the creator of Blockbench, in collaboration with Mojang Studios!\n"
  },
  {
    "path": "plugins/minecraft_block_wizard/changelog.json",
    "content": "{\n\t\"1.3.0\": {\n\t\t\"title\": \"1.3.0\",\n\t\t\"date\": \"2025-01-20\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added option to set suitable tool for mining block\",\n\t\t\t\t\t\"Added single-sided alpha test material\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue where merging into a pack with comments in shared files would fail\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.4.0\": {\n\t\t\"title\": \"1.4.0\",\n\t\t\"date\": \"2025-02-15\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Liquid Detection options\",\n\t\t\t\t\t\"Added option to merge into existing mcaddon file\",\n\t\t\t\t\t\"Added option to select game variant (normal, preview, education) inside the wizard\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added a format version to blocks.json, fixing a content log warning\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.5.0\": {\n\t\t\"title\": \"1.5.0\",\n\t\t\"date\": \"2025-10-09\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added redstone conductivity option\",\n\t\t\t\t\t\"Added compatibility for Blockbench 5.0\",\n\t\t\t\t\t\"Added compatibility for new Minecraft install location\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.5.2\": {\n\t\t\"title\": \"1.5.2\",\n\t\t\"date\": \"2025-10-25\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed export issue in the web app\",\n\t\t\t\t\t\"Fixed issue with exporting to the new Minecraft install location\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.0\": {\n\t\t\"title\": \"1.6.0\",\n\t\t\"date\": \"2025-12-31\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added new preset \\\"Leaves\\\"\",\n\t\t\t\t\t\"Added Fade to Opaque material option\",\n\t\t\t\t\t\"Added UV Lock option\",\n\t\t\t\t\t\"Added Random Offset option\",\n\t\t\t\t\t\"Add Destroy Tier option\",\n\t\t\t\t\t\"Update destroy tool export to improve integration\",\n\t\t\t\t\t\"Unlock several features to be available in Education Edition mode\",\n\t\t\t\t\t\"Updated Activate Add-On guide\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed missing namespace in inventory group ID, which is now required\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.1\": {\n\t\t\"title\": \"1.6.1\",\n\t\t\"date\": \"2026-01-02\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue with loading the plugin in the web app\",\n\t\t\t\t\t\"Updated the documentation link\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.0\": {\n\t\t\"title\": \"1.7.0\",\n\t\t\"date\": \"2026-05-06\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Stairs block preset\",\n\t\t\t\t\t\"Added Slab block preset\",\n\t\t\t\t\t\"Added Fence block preset\",\n\t\t\t\t\t\"Added warnings about functionality limitations in some presets\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/minecraft_block_wizard/minecraft_block_wizard.js",
    "content": "(()=>{var e={792:(e,t,o)=>{\"use strict\";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,'\\n#block_wizard_wrapper {\\n\\t\\tmin-height: 300px;\\n\\t\\tposition: relative;\\n\\t\\t--color-subtle_text: #91949C;\\n}\\n#block_wizard_wrapper > content {\\n\\t\\tflex-grow: 1;\\n}\\n#block_wizard_navigation {\\n\\t\\tflex: 40px 0 0;\\n\\t\\tpadding: 8px;\\n\\t\\tdisplay: flex;\\n}\\n#block_wizard_back_button {\\n\\t\\tpadding: 5px;\\n    \\theight: 32px;\\n\\t\\tcursor: pointer;\\n}\\n#block_wizard_back_button:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n#block_wizard_navigation .bar_spacer {\\n\\t\\tflex-grow: 1;\\n}\\n#block_wizard_next_button {\\n\\t\\tbackground-color: var(--color-accent);\\n\\t\\tcolor: var(--color-light);\\n\\t\\twidth: 112px;\\n\\t\\tmargin-right: 4px;\\n}\\n#minecraft_block_wizard section {\\n\\t\\tpadding-top: 8px;\\n\\t\\tpadding-bottom: 8px;\\n}\\n#minecraft_block_wizard p.description {\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tline-height: normal;\\n\\t\\tmargin: 0;\\n\\t\\tmargin-bottom: 2px;\\n}\\n#minecraft_block_wizard input[type=text], #minecraft_block_wizard input[type=number] {\\n\\t\\tdisplay: block;\\n\\t\\twidth: 100%;\\n\\t\\theight: auto;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 4px;\\n\\t\\tpadding-right: 0;\\n\\t\\tborder-radius: 5px;\\n}\\n#minecraft_block_wizard section.divided_section {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n}\\n#minecraft_block_wizard section.divided_section > *:first-child {\\n\\t\\twidth: 70px;\\n\\t\\tflex-shrink: 0;\\n\\t\\tflex-grow: 0;\\n\\t\\tmargin-right: 10px;\\n\\t\\ttext-align: center;\\n}\\n#minecraft_block_wizard section.subsection {\\n\\t\\tmargin-left: 40px;\\n\\t\\tpadding: 4px 0;\\n}\\n#minecraft_block_wizard .wizard_columns {\\n\\t\\tdisplay: flex;\\n\\t\\tgap: 24px;\\n\\t\\tflex-wrap: wrap;\\n}\\n#minecraft_block_wizard .wizard_columns > div {\\n\\t\\tmin-width: 300px;\\n\\t\\tflex-shrink: 1;\\n\\t\\tflex-grow: 1;\\n\\t\\twidth: 0;\\n}\\n.block_wizard_target_selection {\\n\\t\\tposition: absolute;\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\ttop: 0;\\n\\t\\tright: 0;\\n\\t\\tmin-width: 156px;\\n}\\n#block_wizard_id_error {\\n\\t\\tposition: absolute;\\n\\t\\tright: 28px;\\n\\t\\tmargin-top: -28px;\\n}\\n#block_wizard_id_error:hover .block_wizard_tooltip {\\n\\t\\tdisplay: block;\\n    \\tvisibility: visible;\\n\\t\\tmargin: 0;\\n    \\tright: -5px;\\n}\\n#break_block_animation {\\n\\t\\theight: 48px;\\n\\t\\twidth: 48px;\\n\\t\\tflex-shrink: 0;\\n\\t\\tbackground-color: var(--color-button);\\n\\t\\tbackground-position-y: -128px;\\n\\t\\tbackground-size: 100%;\\n\\t\\tbox-shadow: 1px 1px 2px #00000080;\\n\\t\\ttransform: rotate(5deg);\\n\\t\\tmargin-right: 5px;\\n\\t\\tmargin-left: auto;\\n}\\n@keyframes break_block_animation {\\n0%\\t{background-position-y: 0;}\\n9%\\t{background-position-y: -48px;}\\n18%\\t{background-position-y: -96px;}\\n27%\\t{background-position-y: -144px;}\\n36%\\t{background-position-y: -192px;}\\n45%\\t{background-position-y: -240px;}\\n54%\\t{background-position-y: -288px;}\\n63%\\t{background-position-y: -336px;}\\n70%\\t{background-position-y: -384px;}\\n80%\\t{background-position-y: -432px;}\\n90%\\t{background-position-y: -480px;}\\n99%\\t{background-position-y: -528px;}\\n}\\n#block_friction_markers {\\n\\t\\twidth: calc(100% - 50px);\\n\\t\\tposition: relative;\\n\\t\\theight: 20px;\\n\\t\\tmargin-left: 50px;\\n}\\n#block_friction_markers > li {\\n\\t\\tposition: absolute;\\n\\t\\ttext-align: center;\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tmargin-left: -25px;\\n}\\n#block_friction_markers > li::before {\\n\\t\\tcontent: \"\";\\n\\t\\tdisplay: block;\\n\\t\\tpointer-events: none;\\n\\t\\theight: 12px;\\n\\t\\twidth: 3px;\\n\\t\\tposition: absolute;\\n\\t\\ttop: -13px;\\n\\t\\tright: 0;\\n\\t\\tleft: 0;\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: var(--color-grid);\\n}\\n#block_friction_markers > li:first-child {\\n\\t\\tleft: 8px;\\n\\t\\tmargin: 0;\\n}\\n#block_friction_markers > li:first-child::before {\\n\\t\\tmargin-left: 0;\\n}\\n#block_friction_markers > li:nth-child(2) {\\n\\t\\tleft: calc(44.5% + 1px);\\n\\t\\twidth: 50px;\\n}\\n#block_friction_markers > li:last-child {\\n\\t\\tright: 8px;\\n}\\n#block_friction_markers > li:last-child::before {\\n   \\t\\tmargin-right: 0;\\n}\\n#block_explosion_resistance_markers {\\n\\t\\twidth: calc(100% - 60px);\\n\\t\\tposition: relative;\\n\\t\\theight: 20px;\\n\\t\\tmargin-left: 60px;\\n}\\n#block_explosion_resistance_markers > li {\\n\\t\\tposition: absolute;\\n\\t\\ttext-align: center;\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tmargin-left: -25px;\\n}\\n#block_explosion_resistance_markers > li::before {\\n\\t\\tcontent: \"\";\\n\\t\\tdisplay: block;\\n\\t\\tpointer-events: none;\\n\\t\\theight: 12px;\\n\\t\\twidth: 3px;\\n\\t\\tposition: absolute;\\n\\t\\ttop: -13px;\\n\\t\\tright: 0;\\n\\t\\tleft: 0;\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: var(--color-grid);\\n}\\n#block_explosion_resistance_markers > li:first-child {\\n\\t\\tleft: 8px;\\n\\t\\tmargin: 0;\\n}\\n#block_explosion_resistance_markers > li:first-child::before {\\n\\t\\tmargin-left: 0;\\n}\\n#block_explosion_resistance_markers > li[block=planks] {\\n\\t\\tleft: calc(26% + 7px);\\n\\t\\twidth: 44px;\\n}\\n#block_explosion_resistance_markers > li[block=stone] {\\n\\t\\tleft: calc(33% + 16px);\\n\\t\\twidth: 26px;\\n}\\n#block_explosion_resistance_markers > li:last-child {\\n\\t\\tright: calc(7% + 5px);\\n}\\n#block_explosion_resistance_markers > li:last-child::before {\\n   \\t\\tmargin-right: 0;\\n}\\nul.block_wizard_preset_list {\\n\\t\\tmax-height: 360px;\\n\\t\\twidth: 100%;\\n\\t\\toverflow-y: scroll;\\n}\\nul.block_wizard_preset_list > li {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tposition: relative;\\n\\t\\tfloat: left;\\n\\t\\twidth: 134px;\\n\\t\\theight: 154px;\\n\\t\\tmargin: 3px 2px;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder-radius: 5px;\\n\\t\\tcursor: pointer;\\n\\t\\tbox-sizing: content-box;\\n\\t\\tborder: 1px solid transparent;\\n\\t\\tbackground-size: 90px;\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position-x: center;\\n\\t\\tbackground-position-y: 18px;\\n\\t\\timage-rendering: auto;\\n}\\nul.block_wizard_preset_list > li.grayed {\\n\\t\\tpointer-events: none;\\n\\t\\topacity: 0.6;\\n}\\nul.block_wizard_preset_list > li.grayed::before {\\n\\t\\tcontent: \"Not available yet for Education Edition\";\\n\\t\\tcolor: #ffc949;\\n\\t\\tfont-size: 15px;\\n\\t\\ttext-align: center;\\n\\t\\tmargin-top: 49px;\\n}\\nul.block_wizard_preset_list > li:hover {\\n\\t\\tbackground-color: var(--color-selected);\\n\\t\\tcolor: var(--color-light);\\n}\\nul.block_wizard_preset_list > li.selected {\\n\\t\\t    border-color: var(--color-accent);\\n}\\nul.block_wizard_preset_list > li.selected::after {\\n\\t\\tposition: absolute;\\n\\t\\tcontent: \"\\\\f00c\";\\n\\t\\tfont-family: \\'Font Awesome 6 Free\\';\\n\\t\\tfont-weight: 600;\\n\\t\\tcolor: var(--color-accent);\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\theight: 19px;\\n\\t\\ttop: -7px;\\n\\t\\tright: -4px;\\n\\t\\tborder-bottom-left-radius: 8px;\\n\\t\\tpadding-left: 2px;\\n}\\nul.block_wizard_preset_list > li label {\\n\\t\\ttext-align: center;\\n\\t\\twidth: 100%;\\n\\t\\tmargin-top: auto;\\n\\t\\tpointer-events: none;\\n\\t\\tmargin-bottom: 4px;\\n}\\n.block_wizard_preset_note {\\n\\t\\tmargin-top: 6px;\\n\\t\\tmargin-left: 2px;\\n\\t\\tcolor: #e2ca83;\\n}\\n#block_wizard_wrapper input[type=\"radio\"] {\\n\\t\\tvertical-align: middle;\\n\\t\\tmargin-top: -4px;\\n\\t\\tmargin-right: 6px;\\n}\\n#block_wizard_wrapper input[type=\"range\"] {\\n\\t\\tflex-grow: 1;\\n\\t\\tz-index: 20;\\n}\\n#block_wizard_wrapper .bar.flex label {\\n\\t\\tpadding: 3px 6px;\\n\\t\\tmin-width: 50px;\\n}\\n#block_wizard_wrapper code.code {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 1px;\\n}\\n#block_wizard_launch_vscode img {\\n\\t\\tvertical-align: top;\\n\\t\\tmargin-right: 4px;\\n}\\n\\n',\"\"]);const n=a},291:(e,t,o)=>{\"use strict\";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,\"\\n#block_wizard_export_options {\\n\\tdisplay: grid;\\n\\tgrid-template-columns: auto auto;\\n\\tgrid-gap: 10px;\\n\\tmin-height: 125px;\\n}\\n.block_wizard_export_option {\\n\\tdisplay: inline-block;\\n\\tborder: 1px solid;\\n\\tborder-bottom: 10px solid;\\n\\tpadding: 12px;\\n\\tbackground-color: var(--color-back);\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n.block_wizard_export_option:hover {\\n\\tbackground-color: var(--color-button);\\n}\\n.block_wizard_export_option:not(.selected) {\\n\\tborder-top-color: transparent !important;\\n\\tborder-left-color: transparent !important;\\n\\tborder-right-color: transparent !important;\\n}\\n.block_wizard_export_option > h3 {\\n\\tmargin: 0;\\n}\\n#block_wizard_pack_list li {\\n\\tdisplay: inline-block;\\n\\twidth: min(100%, 254px);\\n\\toverflow: hidden;\\n\\tpadding: 4px;\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n#block_wizard_pack_list li:hover {\\n\\tcolor: var(--color-light);\\n}\\n#block_wizard_pack_list li.selected {\\n\\tbackground-color: var(--color-accent);\\n\\tcolor: var(--color-accent_text);\\n}\\n#block_wizard_pack_list li img, #block_wizard_pack_list li div {\\n\\tdisplay: inline-block;\\n\\theight: 32px;\\n\\twidth: 32px;\\n\\tbackground-color: var(--color-back);\\n\\tvertical-align: middle;\\n\\tmargin-right: 2px;\\n}\\n#block_wizard_pack_list li > i {\\n\\tvertical-align: middle;\\n\\tpadding: 5px;\\n\\tmax-width: unset;\\n}\\n\",\"\"]);const n=a},686:(e,t,o)=>{\"use strict\";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,\"\\n.block_wizard_icon_picker {\\n\\t\\tdisplay: flex;\\n}\\n.block_wizard_icon_picker label {\\n\\t\\tpadding: 3px;\\n}\\n.block_wizard_icon_picker > .icon_picker_left {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tmargin-right: 8px;\\n\\t\\theight: 64px;\\n\\t\\twidth: 64px;\\n}\\n.block_wizard_icon_picker > .icon_picker_right {\\n\\t\\theight: 24px;\\n    \\tcursor: pointer;\\n}\\n.block_wizard_icon_picker > .icon_picker_right label {\\n    \\tcursor: inherit;\\n}\\n.block_wizard_icon_picker > .icon_picker_right:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n.block_wizard_icon_picker > .icon_picker_right i.icon {\\n\\t\\tvertical-align: text-bottom;\\n}\\n\",\"\"]);const n=a},558:(e,t,o)=>{\"use strict\";o.d(t,{A:()=>n});var i=o(314),a=o.n(i)()((function(e){return e[1]}));a.push([e.id,'\\n#block_wizard_loot_list {\\n\\tmargin: 6px 0;\\n\\toverflow-y: auto;\\n\\tbackground: var(--color-back);\\n\\tmin-height: 20px;\\n}\\n#block_wizard_loot_list > li {\\n\\tmargin: 10px;\\n\\tpadding: 10px;\\n\\tbackground: var(--color-ui);\\n\\ttext-align: right;\\n}\\n#block_wizard_loot_list > li > p {\\n\\ttext-align: left;\\n}\\n#block_wizard_loot_item_list {\\n\\tmargin: 6px 0;\\n}\\n#block_wizard_loot_item_list > li {\\n\\tdisplay: flex;\\n\\tpadding: 3px 0;\\n}\\n#block_wizard_loot_item_list > li > bb-select {\\n\\twidth: 335px;\\n}\\n#block_wizard_loot_item_list > li > input[type=\"text\"] {\\n\\twidth: 60%;\\n}\\n#block_wizard_loot_item_list > li > .tool {\\n\\tflex-shrink: 0;\\n}\\n#block_wizard_loot_item_list > li > label {\\n\\tpadding-left: 14px;\\n\\tpadding-right: 4px;\\n\\tmargin-left: auto;\\n\\tpadding-top: 2px;\\n\\twhite-space: nowrap;\\n}\\n#block_wizard_loot_item_list > li > input {\\n\\theight: 30px;\\n}\\n\\n',\"\"]);const n=a},314:e=>{\"use strict\";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var o=e(t);return t[2]?\"@media \".concat(t[2],\" {\").concat(o,\"}\"):o})).join(\"\")},t.i=function(e,o,i){\"string\"==typeof e&&(e=[[null,e,\"\"]]);var a={};if(i)for(var n=0;n<this.length;n++){var r=this[n][0];null!=r&&(a[r]=!0)}for(var s=0;s<e.length;s++){var c=[].concat(e[s]);i&&a[c[0]]||(o&&(c[2]?c[2]=\"\".concat(o,\" and \").concat(c[2]):c[2]=o),t.push(c))}},t}},72:(e,t,o)=>{\"use strict\";var i,a=function(){var e={};return function(t){if(void 0===e[t]){var o=document.querySelector(t);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(e){o=null}e[t]=o}return e[t]}}(),n=[];function r(e){for(var t=-1,o=0;o<n.length;o++)if(n[o].identifier===e){t=o;break}return t}function s(e,t){for(var o={},i=[],a=0;a<e.length;a++){var s=e[a],c=t.base?s[0]+t.base:s[0],l=o[c]||0,d=\"\".concat(c,\" \").concat(l);o[c]=l+1;var A=r(d),m={css:s[1],media:s[2],sourceMap:s[3]};-1!==A?(n[A].references++,n[A].updater(m)):n.push({identifier:d,updater:u(m,t),references:1}),i.push(d)}return i}function c(e){var t=document.createElement(\"style\"),i=e.attributes||{};if(void 0===i.nonce){var n=o.nc;n&&(i.nonce=n)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),\"function\"==typeof e.insert)e.insert(t);else{var r=a(e.insert||\"head\");if(!r)throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");r.appendChild(t)}return t}var l,d=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join(\"\\n\")});function A(e,t,o,i){var a=o?\"\":i.media?\"@media \".concat(i.media,\" {\").concat(i.css,\"}\"):i.css;if(e.styleSheet)e.styleSheet.cssText=d(t,a);else{var n=document.createTextNode(a),r=e.childNodes;r[t]&&e.removeChild(r[t]),r.length?e.insertBefore(n,r[t]):e.appendChild(n)}}function m(e,t,o){var i=o.css,a=o.media,n=o.sourceMap;if(a?e.setAttribute(\"media\",a):e.removeAttribute(\"media\"),n&&\"undefined\"!=typeof btoa&&(i+=\"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(n)))),\" */\")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var p=null,g=0;function u(e,t){var o,i,a;if(t.singleton){var n=g++;o=p||(p=c(t)),i=A.bind(null,o,n,!1),a=A.bind(null,o,n,!0)}else o=c(t),i=m.bind(null,o,t),a=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(o)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else a()}}e.exports=function(e,t){(t=t||{}).singleton||\"boolean\"==typeof t.singleton||(t.singleton=(void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i));var o=s(e=e||[],t);return function(e){if(e=e||[],\"[object Array]\"===Object.prototype.toString.call(e)){for(var i=0;i<o.length;i++){var a=r(o[i]);n[a].references--}for(var c=s(e,t),l=0;l<o.length;l++){var d=r(o[l]);0===n[d].references&&(n[d].updater(),n.splice(d,1))}o=c}}}},719:(e,t,o)=>{\"use strict\";o.r(t);var i=o(72),a=o.n(i),n=o(792);a()(n.A,{insert:\"head\",singleton:!1}),n.A.locals},136:(e,t,o)=>{\"use strict\";o.r(t);var i=o(72),a=o.n(i),n=o(291);a()(n.A,{insert:\"head\",singleton:!1}),n.A.locals},361:(e,t,o)=>{\"use strict\";o.r(t);var i=o(72),a=o.n(i),n=o(686);a()(n.A,{insert:\"head\",singleton:!1}),n.A.locals},410:(e,t,o)=>{\"use strict\";o.r(t);var i=o(72),a=o.n(i),n=o(558);a()(n.A,{insert:\"head\",singleton:!1}),n.A.locals},359:(e,t,o)=>{\"use strict\";o.r(t),o.d(t,{exportPack:()=>k,getExistingPacks:()=>w,getFS:()=>v,openExportedFiles:()=>B});var i=o(908);function a(e,t){return e==t?void 0:e}const n={full:!0,none:!1,slab:{origin:[-8,0,-8],size:[16,8,16]},post:{origin:[-4,0,-4],size:[8,16,8]},small:{origin:[-4,0,-4],size:[8,8,8]},carpet:{origin:[-8,0,-8],size:[16,2,16]},fence:{origin:[-2,0,-2],size:[4,24,4]}},r=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAC5SURBVDjLnVJBCoQwEJtvrtfehL2Kt54XX7DgXysRMsRQ7bKHUCfOxLFJbJ+t7d/9Z6CfmF5TC5C11pPg6QDvuAjocK9ZhddlTe6yAV/oV5XTGieQAijm95wvfBvl2ZsbcC2SOuCC2pcbgPgXp0AppQEoAK+V6yGe/MbwKCeBf7nzHQJus/eFDvjNU4A1L1L7wr1XqyigFnq4whOnzbyDXj7IBR8YJFqkAr1AsY6Rz6MsxJ2/moOnLBxZum3avyu6ywAAAABJRU5ErkJggg==\",s=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.log\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,16,16],\"uv\":{\"north\":{\"uv\":[0,32],\"uv_size\":[32,32]},\"east\":{\"uv\":[0,32],\"uv_size\":[32,32]},\"south\":{\"uv\":[0,32],\"uv_size\":[32,32]},\"west\":{\"uv\":[0,32],\"uv_size\":[32,32]},\"up\":{\"uv\":[0,0],\"uv_size\":[32,32]},\"down\":{\"uv\":[0,32],\"uv_size\":[32,-32]}}}]}]}]}'),c=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.leaves\",\"texture_width\":16,\"texture_height\":16},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,16,16],\"uv\":{\"north\":{\"uv\":[0,0],\"uv_size\":[16,16],\"material_instance\":\"north\"},\"east\":{\"uv\":[0,0],\"uv_size\":[16,16],\"material_instance\":\"east\"},\"south\":{\"uv\":[0,0],\"uv_size\":[16,16],\"material_instance\":\"south\"},\"west\":{\"uv\":[0,0],\"uv_size\":[16,16],\"material_instance\":\"west\"},\"up\":{\"uv\":[16,16],\"uv_size\":[-16,-16],\"material_instance\":\"up\"},\"down\":{\"uv\":[16,16],\"uv_size\":[-16,-16],\"material_instance\":\"down\"}}}]}]}]}'),l=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.lectern\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"bone\",\"pivot\":[8,0,-8],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,2,16],\"uv\":{\"north\":{\"uv\":[0,32],\"uv_size\":[16,2]},\"east\":{\"uv\":[0,34],\"uv_size\":[16,2]},\"south\":{\"uv\":[0,36],\"uv_size\":[16,2]},\"west\":{\"uv\":[0,38],\"uv_size\":[16,2]},\"up\":{\"uv\":[0,0],\"uv_size\":[16,16]},\"down\":{\"uv\":[0,32],\"uv_size\":[16,-16]}}},{\"origin\":[-4,2,-4],\"size\":[8,13,8],\"uv\":{\"north\":{\"uv\":[16,26],\"uv_size\":[8,13]},\"east\":{\"uv\":[24,26],\"uv_size\":[8,13]},\"south\":{\"uv\":[16,39],\"uv_size\":[8,13]},\"west\":{\"uv\":[24,39],\"uv_size\":[8,13]}}},{\"origin\":[-7.9875,12,-5],\"size\":[15.975,4,13],\"pivot\":[0,8,0],\"rotation\":[22.5,0,0],\"uv\":{\"north\":{\"uv\":[32,0],\"uv_size\":[16,4]},\"east\":{\"uv\":[32,8],\"uv_size\":[13,4]},\"south\":{\"uv\":[32,4],\"uv_size\":[16,4]},\"west\":{\"uv\":[32,12],\"uv_size\":[13,4]},\"up\":{\"uv\":[16,0],\"uv_size\":[16,13]},\"down\":{\"uv\":[16,26],\"uv_size\":[16,-13]}}}]}]}]}'),d=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.stairs\",\"texture_width\":16,\"texture_height\":16,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"regular\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,8,16],\"uv\":{\"north\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"east\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"south\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"west\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-16,-16]},\"down\":{\"uv\":[16,16],\"uv_size\":[-16,-16]}}}]},{\"name\":\"back_l\",\"parent\":\"regular\",\"pivot\":[0,8,0],\"cubes\":[{\"origin\":[-8,8,0],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"east\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"south\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"west\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[16,8],\"uv_size\":[-8,-8]}}}]},{\"name\":\"back_r\",\"parent\":\"regular\",\"pivot\":[8,8,0],\"cubes\":[{\"origin\":[0,8,0],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"east\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"south\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"west\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"up\":{\"uv\":[8,16],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[8,8],\"uv_size\":[-8,-8]}}}]},{\"name\":\"front_r\",\"parent\":\"regular\",\"pivot\":[8,8,-8],\"cubes\":[{\"origin\":[0,8,-8],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"east\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"south\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"west\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"up\":{\"uv\":[8,8],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[8,16],\"uv_size\":[-8,-8]}}}]},{\"name\":\"front_l\",\"parent\":\"regular\",\"pivot\":[0,8,-8],\"cubes\":[{\"origin\":[-8,8,-8],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"east\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"south\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"west\":{\"uv\":[0,0],\"uv_size\":[8,8]},\"up\":{\"uv\":[16,8],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[16,16],\"uv_size\":[-8,-8]}}}]},{\"name\":\"top_down\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,8,-8],\"size\":[16,8,16],\"uv\":{\"north\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"east\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"south\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"west\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-16,-16]},\"down\":{\"uv\":[16,16],\"uv_size\":[-16,-16]}}}]},{\"name\":\"top_back_l\",\"parent\":\"top_down\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,0],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"east\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"south\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"west\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[16,8],\"uv_size\":[-8,-8]}}}]},{\"name\":\"top_back_r\",\"parent\":\"top_down\",\"pivot\":[8,0,0],\"cubes\":[{\"origin\":[0,0,0],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"east\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"south\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"west\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"up\":{\"uv\":[8,16],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[8,8],\"uv_size\":[-8,-8]}}}]},{\"name\":\"top_front_r\",\"parent\":\"top_down\",\"pivot\":[8,0,-8],\"cubes\":[{\"origin\":[0,0,-8],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"east\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"south\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"west\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"up\":{\"uv\":[8,8],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[8,16],\"uv_size\":[-8,-8]}}}]},{\"name\":\"top_front_l\",\"parent\":\"top_down\",\"pivot\":[0,0,-8],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[8,8,8],\"uv\":{\"north\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"east\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"south\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"west\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"up\":{\"uv\":[16,8],\"uv_size\":[-8,-8]},\"down\":{\"uv\":[16,16],\"uv_size\":[-8,-8]}}}]}],\"item_display_transforms\":{\"gui\":{\"rotation\":[30,-135,0],\"translation\":[0,0,0],\"scale\":[0.625,0.625,0.625],\"rotation_pivot\":[0,0,0],\"scale_pivot\":[0,0,0],\"fit_to_frame\":false}}}]}'),A=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.slab\",\"texture_width\":16,\"texture_height\":16,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"bottom\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,8,16],\"uv\":{\"north\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"east\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"south\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"west\":{\"uv\":[0,8],\"uv_size\":[16,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-16,-16]},\"down\":{\"uv\":[16,16],\"uv_size\":[-16,-16]}}}]},{\"name\":\"top\",\"pivot\":[0,8,0],\"cubes\":[{\"origin\":[-8,8,-8],\"size\":[16,8,16],\"uv\":{\"north\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"east\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"south\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"west\":{\"uv\":[0,0],\"uv_size\":[16,8]},\"up\":{\"uv\":[16,16],\"uv_size\":[-16,-16]},\"down\":{\"uv\":[16,16],\"uv_size\":[-16,-16]}}}]}],\"item_display_transforms\":{\"gui\":{\"rotation\":[30,45,0],\"translation\":[0,0,0],\"scale\":[0.625,0.625,0.625],\"rotation_pivot\":[0,0,0],\"scale_pivot\":[0,0,0],\"fit_to_frame\":false}}}]}'),m=JSON.parse('{\"w\":[{\"description\":{\"identifier\":\"geometry.fence\",\"texture_width\":16,\"texture_height\":16,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[8,0,-8]},{\"name\":\"post\",\"parent\":\"root\",\"pivot\":[8,0,-8],\"cubes\":[{\"origin\":[-2,0,-2],\"size\":[4,16,4],\"uv\":{\"north\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"east\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"south\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"west\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"up\":{\"uv\":[10,10],\"uv_size\":[-4,-4]},\"down\":{\"uv\":[10,10],\"uv_size\":[-4,-4]}}}]},{\"name\":\"north\",\"parent\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-1,12,-8],\"size\":[2,3,9],\"uv\":{\"north\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"east\":{\"uv\":[7,1],\"uv_size\":[9,3]},\"south\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,1],\"uv_size\":[9,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,16],\"uv_size\":[-2,-9]}}},{\"origin\":[-1,6,-8],\"size\":[2,3,9],\"uv\":{\"north\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"east\":{\"uv\":[7,7],\"uv_size\":[9,3]},\"south\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,7],\"uv_size\":[9,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,16],\"uv_size\":[-2,-9]}}}]},{\"name\":\"south\",\"parent\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-1,12,-1],\"size\":[2,3,9],\"uv\":{\"north\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,1],\"uv_size\":[9,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"west\":{\"uv\":[7,1],\"uv_size\":[9,3]},\"up\":{\"uv\":[9,16],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}},{\"origin\":[-1,6,-1],\"size\":[2,3,9],\"uv\":{\"north\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,7],\"uv_size\":[9,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"west\":{\"uv\":[7,7],\"uv_size\":[9,3]},\"up\":{\"uv\":[9,16],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}}]},{\"name\":\"west\",\"parent\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[0,12,-1],\"size\":[8,3,2],\"uv\":{\"north\":{\"uv\":[8,1],\"uv_size\":[8,3]},\"east\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"south\":{\"uv\":[0,1],\"uv_size\":[8,3]},\"west\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"up\":{\"uv\":[8,9],\"uv_size\":[-8,-2]},\"down\":{\"uv\":[8,9],\"uv_size\":[-8,-2]}}},{\"origin\":[0,6,-1],\"size\":[8,3,2],\"uv\":{\"north\":{\"uv\":[8,7],\"uv_size\":[8,3]},\"east\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"south\":{\"uv\":[0,7],\"uv_size\":[8,3]},\"west\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"up\":{\"uv\":[8,9],\"uv_size\":[-8,-2]},\"down\":{\"uv\":[8,9],\"uv_size\":[-8,-2]}}}]},{\"name\":\"east\",\"parent\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,12,-1],\"size\":[9,3,2],\"uv\":{\"north\":{\"uv\":[0,1],\"uv_size\":[9,3]},\"east\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[9,3]},\"west\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"up\":{\"uv\":[16,9],\"uv_size\":[-9,-2]},\"down\":{\"uv\":[16,9],\"uv_size\":[-9,-2]}}},{\"origin\":[-8,6,-1],\"size\":[9,3,2],\"uv\":{\"north\":{\"uv\":[0,7],\"uv_size\":[9,3]},\"east\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"south\":{\"uv\":[7,7],\"uv_size\":[9,3]},\"west\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"up\":{\"uv\":[16,9],\"uv_size\":[-9,-2]},\"down\":{\"uv\":[16,9],\"uv_size\":[-9,-2]}}}]},{\"name\":\"icon\",\"pivot\":[0,0,0],\"rotation\":[0,-90,0],\"cubes\":[{\"origin\":[4,0,-2],\"size\":[4,16,4],\"uv\":{\"north\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"east\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"south\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"west\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"up\":{\"uv\":[10,10],\"uv_size\":[-4,-4]},\"down\":{\"uv\":[10,10],\"uv_size\":[-4,-4]}}},{\"origin\":[-1,6,0],\"size\":[2,3,10],\"pivot\":[0,0,0],\"rotation\":[0,90,0],\"uv\":{\"north\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,7],\"uv_size\":[10,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,7],\"uv_size\":[10,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}},{\"origin\":[-1,12,0],\"size\":[2,3,10],\"pivot\":[0,0,0],\"rotation\":[0,90,0],\"uv\":{\"north\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,1],\"uv_size\":[10,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,1],\"uv_size\":[10,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}},{\"origin\":[-8,0,-2],\"size\":[4,16,4],\"uv\":{\"north\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"east\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"south\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"west\":{\"uv\":[6,0],\"uv_size\":[4,16]},\"up\":{\"uv\":[10,10],\"uv_size\":[-4,-4]},\"down\":{\"uv\":[10,10],\"uv_size\":[-4,-4]}}},{\"origin\":[-17,12,-16],\"size\":[2,3,10],\"pivot\":[-16,0,0],\"rotation\":[0,-90,0],\"uv\":{\"north\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,1],\"uv_size\":[10,3]},\"south\":{\"uv\":[7,1],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,1],\"uv_size\":[10,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}},{\"origin\":[-17,6,-16],\"size\":[2,3,10],\"pivot\":[-16,0,0],\"rotation\":[0,-90,0],\"uv\":{\"north\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"east\":{\"uv\":[0,7],\"uv_size\":[10,3]},\"south\":{\"uv\":[7,7],\"uv_size\":[2,3]},\"west\":{\"uv\":[0,7],\"uv_size\":[10,3]},\"up\":{\"uv\":[9,9],\"uv_size\":[-2,-9]},\"down\":{\"uv\":[9,9],\"uv_size\":[-2,-9]}}}]}],\"item_display_transforms\":{\"gui\":{\"rotation\":[30,45,0],\"translation\":[0,0,0],\"scale\":[0.625,0.625,0.625],\"rotation_pivot\":[0,0,0],\"scale_pivot\":[0,0,0],\"fit_to_frame\":false}}}]}'),p={stone:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnklEQVQ4y4VTQRIAMQTzXA9w7xM8uXti0jS6B8OYEiK1zNxoa60dETsiOnb3I4dmFWABPypz925Wbw1REImRp8Y9Aa5QnvM4bZlhZ0YrzzxhjTGiMl6pfGaeEzAKxuMVsDsjvNbrBqwBReC0Yp9R8aCKlejM3S8h8UossOOMarTX2LyuKYLUn2Apl7fpE03MY+6a4CWmiUj7U5/iBME+eeR3wyunqoUAAAAASUVORK5CYII=\",bedrock:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADASURBVDjLhZPbDcUgDEMzCyt0GAZgKMbtlZFcnVqp7kcUGsCPkNZa676u6xVzznvvfWvPa2XuO5cWOqjwJWbtK7s2xniBHAAXc+3LvuCwIgEW5VqyQHiQ8tNqmdFMecBrWyLZY4Hy+E1bXe0AENW+/tWsViD1xd6x0ZbBi+j51l/sjOqYqIZs+bznGTlE2W2CkpXTW+xwWkh7JFM8TaS0lEt17SDl7HMSeZj9oYriCHcT2Fl5Keh+pmyWQXIeVPsBQmH+agMUE5UAAAAASUVORK5CYII=\",glass:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABaSURBVDjLY7jw6uV/cvGKCzf/M4AYDQ0NDORgrAaQYmD1uu2oBpDqGhQDQM4h1QsYLiAVdx88S5kBA++C4WIAOfEPs5QsFyCrJ9sFKJkJRIAwyDQYTQyG6QMAiP/54kqEtt0AAAAASUVORK5CYII=\",glowstone:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAD6SURBVDjLbZOxDUIxEENvFgokRmAAWkTBEHQUsAKI4ZjgT0FPEfCJF1kWkfJ//sW5s3359V6u43k/jtthM867VU99E9dUTPs9XsvEP07bUQoAFvCyX/cUgJiAWgub+EqgvmFDMsX1VswPNwM9vEpK0kENxUkCvhMAaoo/jeikosdghJTCIAdqrYk8Z8VhWJXTAuw6XQoegWsTtXCT3FRi2ocRSSg428gmSbwi3lBVey35Owpz0Oh9zv57+2BV3rI0LOPpR3vgfQVAdlUF6L4gV+siW15nb5VTd8+awaxml8hZIMeNcz/Kjfp3jVNi7hdasppT5acimRv5Achkgl/nEOAdAAAAAElFTkSuQmCC\",log:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC7UlEQVRYhbWXz2saQRTHPzGK7o+EQbPYkK4VCUToLeRPaC/5D3rq39ZT/oMc2muhl1BoocVACanbYiSrDLpqREJ7WGcy65pD4/RdnHmzM+87732/b3Dr7enLPwCB8OhEktpOCYDBeEE7FNzKiZ6rNXP+7vzbFhtYEeDN6QkAr4DZYgpAbXeHwWgMgFNytd8puXrz2fnFJrEfAABcXXczC73fce5jR/j0ZIwjfPZFdePgAMXBeKFv12o2cJ1tprP73IezxTS9vajSk0MgLcPGAMy6Ajrt60yDWI5X9z4JgBo4wtdOOblLg8iEm+GUZ9U06P7BnvYLr7JxcFiWQB06Mw4VXgXhVdg/SOcmJxRYGyUomGnU6ZWJDqqysc5slKCggxslUGPT97+sAEudy0SrQWVAlQHgZrhcW0z1ug3LyNBsOL3fsc7ATCaaiE7JxRE+Tsm1K0Mz3YrtylYZrwhrTYZOyaUnYxDVjM7NtgvgOttAWo5W08WGFc2Dr6672X7AHTOZ4Ahf111xwZYVB+MF09k9rWZDOzMPkldJubH8bTUfNlvjgHrVzCf3sec4EB63cpJ7np9qhUB4DMYLjo/qtENBIDwufw54ffIcQM/boeD4qE4nkvpbG6YbUblc1rddNzct6tvrAwWAeDji09fuox/tVXcB+HDxy1pgDSCsp6wPhJcJ+KM70HNV63g40j61b2MAKqBpZqDDRk2Pj17UaIeCTiRzoDcCoA4NhEdY9zUgU2Zh3bciuxyAz5f9nLO2U+JWTmiHgvl8rm9qi/kZAGpgpl0FDOt+hvFKFTb0rwGo/wOQ1nudxEw52iKfBgBpaleJCHm9Kw4EwuPs/Xd7ABSI+XwOpDcOhMfHLw+9wWbzyQFQJVhnh42a5kQ8HFEul4G8dJ8MwNR51E90jc1amxxQDcoWETN9QFkgPKJ+wl51V5cFsre20YQACmYAU3Zh3Scejoj6SaYBdSJpVQmFVYeZidU6rzaix17Lf7G/81FcmwmVdRUAAAAASUVORK5CYII=\",lectern:\"data:image/png;base64,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\",flower:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADmSURBVDjLY2AYdOD169cMBx2UGWbv3fv/+/fv/6+9ePFffc1vsDhRIPD2XwaQJhAGGQAzhGgXwDR+3aX+/981SzAGiYFcRJQBMFtBGv+/8QcbBBMjygCQTSAbYS74OFeVNG+ELzFiQPc/CAcu1CY+FpzblOGGgFwEMpToWABpDp1vyODYLcMQNEvvv3gNC9gAyzox4gwAKQyYqcFgVMXHELpa9z+IHzjRkDQDQLaCbAcZALOdaAPAiQloI8gQkAFw9mQj4g0A2QYOC6ABIM1ExwDcBUANIENggUiyATAA0py/xRevGgAMdMhHZrrY8wAAAABJRU5ErkJggg==\",leaves:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEALoAqQCd+yMi3AAAAAlwSFlzAAALEwAACxMBAJqcGAAAAZFJREFUOMt1k7GN6zAQRGeFnwtwBwupAEUu4CCAhSjwNmC4BsENUMHFDhUTMFzAj64AGezAgCrYC+4PwTPwlQgSdzhvZ0mxyRwA4meUdE8exiBxiQ4AdjK5nC8OAPtrx3AcYCcTAEj35I/0QDMcB8TPKAAQxiA2mX/9/ULeMuISfb7Oor2iPbTgk+7J8zPjI3xA+JNO83UuBHn7KSJV7U6dAEBcouctY3/tqNvJzwztFOttLZQ1RRiD/KFYe0XeMubrLABAcRhDEdpkPhwHsF0A+IVLMQMiEam4SXtoob3CTiZN3nIR22ReB8SA20NbMhqOQ6FN9+QNR2STOV20U3CMNpmXbP4FyfX8zGhqJ5vM19taFuMSnQR0jUv0MAbhd0Onus/1tuL9LACA9loy0U6hvaLhjBkmN3rvlSZ8hzGIdgp5T7yed30Wwhjkcr4402dN80gPaK8lh5qGLjzi+2svRDSQuERn0f9oOCHW0lQ7RVOL3+fPO8KLRHSKwxikyc/8K9m6kNj7ay8HqW4rLtG/AVfeVBt1j3SuAAAAAElFTkSuQmCC\",stairs:r,slab:r,fence:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAADTSURBVDjLfVMxDgIxDPOD2JnvAUgszEi38AFmJnYWxIZ4wq3MfKzIlVwZExh8aZOoiZ0cntd9Wy67Rvu6z1/4578dpwYe9AhB5+O8GY9mXHfmEKgSZZUk5CO9A35O87qDZ90P21WHYjq7nxbiyArJM31OhTHePygoIOt6JFXlw/l5BQlaCem6ILmmBhnPHPicvUo1+9Sjd+Cjy3ZzhG6lESp1q9lnfHTgHKs98JjvhADNO7VQhWovPBe/djzbzTUX4In5H/geVPoMDZKb6+GaVPvxBn7ucsZoL/oUAAAAAElFTkSuQmCC\"},g={leaves:[{geometry_part:{bone:\"root\",cube:0,face:\"north\"},condition:\"same_culling_layer\",direction:\"north\"},{geometry_part:{bone:\"root\",cube:0,face:\"south\"},direction:\"south\"},{geometry_part:{bone:\"root\",cube:0,face:\"east\"},condition:\"same_culling_layer\",direction:\"east\"},{geometry_part:{bone:\"root\",cube:0,face:\"west\"},direction:\"west\"},{geometry_part:{bone:\"root\",cube:0,face:\"up\"},condition:\"same_culling_layer\",direction:\"up\"},{geometry_part:{bone:\"root\",cube:0,face:\"down\"},direction:\"down\"}]},u={unit_cube:{description:{identifier:\"geometry.unknown\",texture_width:16,texture_height:16,visible_bounds_width:2,visible_bounds_height:2.5,visible_bounds_offset:[0,.75,0]},bones:[{name:\"block\",pivot:[0,0,0],cubes:[{origin:[-8,0,-8],size:[16,16,16],uv:{north:{uv:[0,0],uv_size:[16,16]},east:{uv:[0,0],uv_size:[16,16]},south:{uv:[0,0],uv_size:[16,16]},west:{uv:[0,0],uv_size:[16,16]},up:{uv:[16,16],uv_size:[-16,-16]},down:{uv:[16,16],uv_size:[-16,-16]}}}]}]},cross:{description:{identifier:\"geometry.unknown\",texture_width:16,texture_height:16,visible_bounds_width:3,visible_bounds_height:2.5,visible_bounds_offset:[0,.75,0]},bones:[{name:\"block\",pivot:[0,0,0],cubes:[{origin:[-8,0,0],size:[16,16,0],pivot:[0,0,0],rotation:[0,-135,0],uv:{north:{uv:[0,0],uv_size:[16,16]}}},{origin:[-8,0,0],size:[16,16,0],pivot:[0,0,0],rotation:[0,135,0],uv:{north:{uv:[0,0],uv_size:[16,16]}}}]}]},log:s.w[0],leaves:c.w[0],lectern:l.w[0],stairs:d.w[0],slab:A.w[0],fence:m.w[0]};var b=o(318);function h(e){let t=\"\",i=\"\";Blockbench.isNewerThan(\"4.99\")?(t=SystemInfo.home_directory,i=SystemInfo.appdata_directory):(t=o(857).homedir(),i=electron.process.env.APPDATA);let a=null;switch(Blockbench.platform){case\"win32\":let o=v();\"edu\"==e?(a=PathModule.join(i,\"Minecraft Education Edition\"),o.existsSync(a)||(a=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState\"))):\"preview\"==e?(a=PathModule.join(i,\"Minecraft Bedrock Preview/Users/Shared/\"),o.existsSync(a)||(a=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState\"))):(a=PathModule.join(i,\"Minecraft Bedrock/Users/Shared/\"),o.existsSync(a)||(a=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState\")));break;case\"linux\":a=PathModule.join(t,\".local/share/mcpelauncher\");break;case\"darwin\":a=PathModule.join(t,\"Library/Application Support/mcpelauncher\");break;case\"android\":a=PathModule.join(t,\"storage/shared/\");break;default:return\"\"}return PathModule.join(a,\"games/com.mojang\")}let f;function v(){if(isApp)return f||(Blockbench.isNewerThan(\"4.99\")?(f=requireNativeModule(\"fs\",{message:\"Enable file system access so that the wizard can export a pack into your Minecraft folder\"}),f):isApp?o(896):void 0)}function w(e){if(!isApp)return[];let t,o=[],i=[];try{t=h(e),o=v().readdirSync(PathModule.join(t,\"development_resource_packs\"),{withFileTypes:!0})}catch(e){return!1}let a={};o.forEach((e=>{if(e.isDirectory())try{let o=PathModule.join(t,\"development_resource_packs\",e.name),i=v().readFileSync(PathModule.join(o,\"manifest.json\"),{encoding:\"utf-8\"}),n=autoParseJSON(i,!1);n&&n.header&&(a[n.header.uuid]=o)}catch(e){console.error(e)}}));try{i=v().readdirSync(PathModule.join(t,\"development_behavior_packs\"),{withFileTypes:!0})}catch(e){return!1}let n=[];return i.forEach((e=>{if(e.isDirectory())try{let o=PathModule.join(t,\"development_behavior_packs\",e.name),i=v().readFileSync(PathModule.join(o,\"manifest.json\"),{encoding:\"utf-8\"}),r=autoParseJSON(i,!1);if(r&&r.dependencies&&r.dependencies[0]){let t=r.dependencies[0].uuid;a[t]&&n.push({name:e.name,bp_path:o,rp_path:a[t],has_icon:!0})}}catch(e){console.error(e)}})),n}async function k(e,t){let o=v(),r=isApp&&h(e.edition),s=e.identifier.replace(/^.+:/,\"\"),c=guid(),l=guid(),d=b;if(e.pack_icon){let C=new CanvasFrame(16,16);await C.loadFromURL(e.pack_icon),d=C.canvas.toDataURL()}let A,m,f={authors:e.pack_authors?e.pack_authors.split(/,\\s*/):void 0,generated_with:{blockbench_block_wizard:[\"1.7.0\"]}},w=function(e,t){let o=[],r=i.A[e.preset],s=\"collision\"==e.selection_box?n[e.collision]:n[e.selection_box],c=\"edu\"==e.edition?\"1.21.90\":\"1.21.100\",l={identifier:e.identifier,menu_category:\"hidden\"==e.category?void 0:{category:e.category,group:\"none\"==e.item_group?void 0:`minecraft:${e.item_group}`}},d=[],A=e.material;e.fade_to_opaque&&\"opaque\"!=e.material&&(A+=\"_to_opaque\");let m={\"minecraft:collision_box\":n[e.collision],\"minecraft:selection_box\":s,\"minecraft:destructible_by_mining\":!!e.mineable&&{seconds_to_destroy:Math.clamp(parseFloat(e.destroy_time),0,1e3)},\"minecraft:destructible_by_explosion\":!!e.explodable&&{explosion_resistance:Math.clamp(parseFloat(e.explosion_resistance),0,200)},\"minecraft:friction\":a(Math.clamp(parseFloat(e.friction),0,.9),.4),\"minecraft:flammable\":e.flammable?{destroy_chance_modifier:parseFloat(e.fire_destroy_chance),catch_chance_modifier:parseFloat(e.fire_catch_chance)}:void 0,\"minecraft:geometry\":`geometry.${t.block_filename}`,\"minecraft:material_instances\":{\"*\":{texture:t.block_filename,render_method:A,face_dimming:!!e.face_dimming&&void 0,ambient_occlusion:!!e.ambient_occlusion&&void 0,tint_method:\"none\"==e.tint_method?void 0:e.tint_method}},\"minecraft:light_emission\":a(parseInt(e.light_emission),0),\"minecraft:light_dampening\":a(parseInt(e.light_dampening),15),\"minecraft:map_color\":e.map_color.substring(0,7)};if(\"none\"!=e.destroy_tool&&(m[`tag:minecraft:is_${e.destroy_tool}_item_destructible`]={}),\"none\"!=e.destroy_tier&&(m[`tag:minecraft:${e.destroy_tier}_tier_destructible`]={}),\"shears\"==e.destroy_tool&&m[\"minecraft:destructible_by_mining\"]&&(m[\"minecraft:destructible_by_mining\"].item_specific_speeds=[{item:\"minecraft:shears\",destroy_speed:0}]),\"custom\"==e.loot_type){m[\"minecraft:loot\"]=`loot_tables/blocks/${t.block_filename}.json`;let i=function(e){return{pools:e.custom_loot.map((e=>{let t={rolls:e.rolls,entries:[]};return e.entries.forEach((e=>{let o;o=\"empty\"==e.type?{type:\"empty\",weight:e.weight}:{type:\"item\",name:\"custom\"==e.type?e.custom_id:e.type,weight:e.weight,functions:[{function:\"set_count\",count:e.count_min==e.count_max?e.count_min:{min:e.count_min,max:e.count_max}}]},t.entries.push(o)})),t}))}}(e);o.push({name:`loot_tables/blocks/${t.block_filename}.json`,content:compileJSON(i)})}function p(){\"string\"==typeof m[\"minecraft:geometry\"]&&(m[\"minecraft:geometry\"]={identifier:m[\"minecraft:geometry\"]})}if(\"facing\"==e.rotation&&(l.traits={\"minecraft:placement_direction\":{enabled_states:[\"minecraft:facing_direction\"]}},d=[{condition:\"q.block_state('minecraft:facing_direction') == 'north'\",components:{\"minecraft:transformation\":{rotation:[0,180,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'south'\",components:{\"minecraft:transformation\":{rotation:[0,0,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'east'\",components:{\"minecraft:transformation\":{rotation:[0,90,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'west'\",components:{\"minecraft:transformation\":{rotation:[0,270,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'up'\",components:{\"minecraft:transformation\":{rotation:[-90,0,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'down'\",components:{\"minecraft:transformation\":{rotation:[90,0,0]}}}]),\"cardinal\"==e.rotation&&(l.traits={\"minecraft:placement_direction\":{enabled_states:[\"minecraft:cardinal_direction\"]}},d=[{condition:\"q.block_state('minecraft:cardinal_direction') == 'north'\",components:{\"minecraft:transformation\":{rotation:[0,180,0]}}},{condition:\"q.block_state('minecraft:cardinal_direction') == 'south'\",components:{\"minecraft:transformation\":{rotation:[0,0,0]}}},{condition:\"q.block_state('minecraft:cardinal_direction') == 'east'\",components:{\"minecraft:transformation\":{rotation:[0,90,0]}}},{condition:\"q.block_state('minecraft:cardinal_direction') == 'west'\",components:{\"minecraft:transformation\":{rotation:[0,270,0]}}}]),\"pillar\"==e.rotation&&(l.traits={\"minecraft:placement_direction\":{enabled_states:[\"minecraft:facing_direction\"]}},d=[{condition:\"q.block_state('minecraft:facing_direction') == 'up' || q.block_state('minecraft:facing_direction') == 'down'\",components:{\"minecraft:transformation\":{rotation:[0,0,0]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'east' || q.block_state('minecraft:facing_direction') == 'west'\",components:{\"minecraft:transformation\":{rotation:[0,0,90]}}},{condition:\"q.block_state('minecraft:facing_direction') == 'north' || q.block_state('minecraft:facing_direction') == 'south'\",components:{\"minecraft:transformation\":{rotation:[90,0,0]}}}]),e.uv_lock&&(p(),m[\"minecraft:geometry\"].uv_lock=!0),\"leaves\"==r.model_type){p();let t=e.identifier.split(\":\")[0];m[\"minecraft:geometry\"].culling=t+\":leaves\",m[\"minecraft:geometry\"].culling_layer=\"minecraft:culling_layer.leaves\"}if(e.random_offset_range){let t=e.random_offset_range;m[\"minecraft:random_offset\"]={x:{range:{min:-t,max:t},steps:2*t},z:{range:{min:-t,max:t},steps:2*t}}}if((e.can_contain_liquid||\"blocking\"!=e.on_liquid_touches)&&(m[\"minecraft:liquid_detection\"]={detection_rules:[{liquid_type:\"water\",can_contain_liquid:!!e.can_contain_liquid||void 0,on_liquid_touches:e.on_liquid_touches}]}),e.redstone_conductor&&(m[\"minecraft:redstone_conductivity\"]={redstone_conductor:!0}),\"stairs\"==e.preset){c=\"1.26.0\",l.traits={\"minecraft:placement_position\":{enabled_states:[\"minecraft:vertical_half\"]},\"minecraft:placement_direction\":{blocks_to_corner_with:[{tags:\"q.any_tag('minecraft:cornerable_stairs')\"}],enabled_states:[\"minecraft:corner_and_cardinal_direction\"]},\"minecraft:connection\":{enabled_states:[\"minecraft:cardinal_connections\"]}},m[\"tag:minecraft:cornerable_stairs\"]={},m[\"minecraft:support\"]={shape:\"stair\"},p();let e=\"q.block_state('minecraft:vertical_half')\",t=\"q.block_state('minecraft:corner')\";m[\"minecraft:geometry\"].bone_visibility={regular:`${e} == 'bottom'`,back_l:`${e} == 'bottom' && (${t} != 'outer_right')`,back_r:`${e} == 'bottom' && (${t} != 'outer_left')`,front_r:`${e} == 'bottom' && ${t} == 'inner_right'`,front_l:`${e} == 'bottom' && ${t} == 'inner_left'`,top_down:`${e} == 'top'`,top_back_l:`${e} == 'top' && (${t} != 'outer_right')`,top_back_r:`${e} == 'top' && (${t} != 'outer_left')`,top_front_r:`${e} == 'top' && ${t} == 'inner_right'`,top_front_l:`${e} == 'top' && ${t} == 'inner_left'`};for(let e of d){if(!e.condition.includes(\"minecraft:cardinal_direction\"))continue;let t=e.condition.match(/cardinal_direction'\\) == '(\\w+)'/)?.[1];t&&(e.components[\"minecraft:connection_rule\"]={accepts_connections_from:\"all\",enabled_directions:[t]})}d.push({condition:`${t} == 'none' && ${e} == 'bottom'`,components:{\"minecraft:collision_box\":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]}]}},{condition:`${t} == 'inner_right' && ${e} == 'bottom'`,components:{\"minecraft:collision_box\":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]},{origin:[0,8,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_right' && ${e} == 'bottom'`,components:{\"minecraft:collision_box\":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[0,8,0],size:[8,8,8]}]}},{condition:`${t} == 'inner_left' && ${e} == 'bottom'`,components:{\"minecraft:collision_box\":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[16,8,8]},{origin:[-8,8,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_left' && ${e} == 'bottom'`,components:{\"minecraft:collision_box\":[{origin:[-8,0,-8],size:[16,8,16]},{origin:[-8,8,0],size:[8,8,8]}]}},{condition:`${t} == 'none' && ${e} == 'top'`,components:{\"minecraft:collision_box\":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]}]}},{condition:`${t} == 'inner_right' && ${e} == 'top'`,components:{\"minecraft:collision_box\":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]},{origin:[0,0,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_right' && ${e} == 'top'`,components:{\"minecraft:collision_box\":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[0,0,0],size:[8,8,8]}]}},{condition:`${t} == 'inner_left' && ${e} == 'top'`,components:{\"minecraft:collision_box\":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[16,8,8]},{origin:[-8,0,-8],size:[8,8,8]}]}},{condition:`${t} == 'outer_left' && ${e} == 'top'`,components:{\"minecraft:collision_box\":[{origin:[-8,8,-8],size:[16,8,16]},{origin:[-8,0,0],size:[8,8,8]}]}})}return\"slab\"==e.preset&&(l.traits={\"minecraft:placement_position\":{enabled_states:[\"minecraft:vertical_half\"]}},p(),m[\"minecraft:geometry\"].bone_visibility={top:\"q.block_state('minecraft:vertical_half') == 'top'\",bottom:\"q.block_state('minecraft:vertical_half') == 'bottom'\"},\"slab\"==e.collision&&(delete m[\"minecraft:collision_box\"],delete m[\"minecraft:selection_box\"],d.push({condition:\"q.block_state('minecraft:vertical_half') == 'bottom'\",components:{\"minecraft:collision_box\":{origin:[-8,0,-8],size:[16,8,16]},\"minecraft:selection_box\":{origin:[-8,0,-8],size:[16,8,16]}}},{condition:\"q.block_state('minecraft:vertical_half') == 'top'\",components:{\"minecraft:collision_box\":{origin:[-8,8,-8],size:[16,8,16]},\"minecraft:selection_box\":{origin:[-8,8,-8],size:[16,8,16]}}}))),\"fence\"==e.preset&&(l.traits={\"minecraft:connection\":{enabled_states:[\"minecraft:cardinal_connections\"]}},m[\"minecraft:support\"]={shape:\"fence\"},m[\"tag:minecraft:has_fence_connections\"]={},m[\"minecraft:connection_rule\"]={accepts_connections_from:\"only_fences\"},p(),m[\"minecraft:geometry\"].bone_visibility={north:\"q.block_state('minecraft:connection_north')\",south:\"q.block_state('minecraft:connection_south')\",east:\"q.block_state('minecraft:connection_east')\",west:\"q.block_state('minecraft:connection_west')\",icon:\"false\"},m[\"minecraft:item_visual\"]={geometry:{identifier:m[\"minecraft:geometry\"].identifier,bone_visibility:{north:\"false\",south:\"false\",east:\"false\",west:\"false\",post:\"false\",icon:\"true\"}},material_instances:m[\"minecraft:material_instances\"]},\"fence\"==e.collision&&(delete m[\"minecraft:collision_box\"],delete m[\"minecraft:selection_box\"],d.push({condition:\"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-2,0,-2],size:[4,24,4]},\"minecraft:selection_box\":{origin:[-2,0,-2],size:[4,16,4]}}},{condition:\"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-8,0,-2],size:[16,24,4]},\"minecraft:selection_box\":{origin:[-8,0,-2],size:[16,16,4]}}},{condition:\"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-2,0,-8],size:[4,24,16]},\"minecraft:selection_box\":{origin:[-2,0,-8],size:[4,16,16]}}},{condition:\"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-8],size:[4,24,16]},{origin:[-8,0,-2],size:[16,24,4]}],\"minecraft:selection_box\":!0}},{condition:\"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-2,0,-8],size:[4,24,10]},\"minecraft:selection_box\":{origin:[-2,0,-8],size:[4,16,10]}}},{condition:\"!q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-2,0,-2],size:[4,24,10]},\"minecraft:selection_box\":{origin:[-2,0,-2],size:[4,16,10]}}},{condition:\"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-2,0,-2],size:[10,24,4]},\"minecraft:selection_box\":{origin:[-2,0,-2],size:[10,16,4]}}},{condition:\"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":{origin:[-8,0,-2],size:[10,24,4]},\"minecraft:selection_box\":{origin:[-8,0,-2],size:[10,16,4]}}},{condition:\"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-8,0,-2],size:[10,24,4]}],\"minecraft:selection_box\":{origin:[-8,0,-8],size:[10,16,10]}}},{condition:\"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-2,0,-2],size:[10,24,4]}],\"minecraft:selection_box\":{origin:[-2,0,-2],size:[10,16,10]}}},{condition:\"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-2,0,-2],size:[10,24,4]}],\"minecraft:selection_box\":{origin:[-2,0,-8],size:[10,16,10]}}},{condition:\"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-8,0,-2],size:[10,24,4]}],\"minecraft:selection_box\":{origin:[-8,0,-2],size:[10,16,10]}}},{condition:\"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && !q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-2],size:[4,24,10]},{origin:[-8,0,-2],size:[16,24,4]}],\"minecraft:selection_box\":{origin:[-8,0,-2],size:[16,16,10]}}},{condition:\"q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && !q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-8],size:[4,24,10]},{origin:[-8,0,-2],size:[16,24,4]}],\"minecraft:selection_box\":{origin:[-8,0,-8],size:[16,16,10]}}},{condition:\"q.block_state('minecraft:connection_east') && !q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-8,0,-2],size:[10,24,4]},{origin:[-2,0,-8],size:[4,24,16]}],\"minecraft:selection_box\":{origin:[-8,0,-8],size:[10,16,16]}}},{condition:\"!q.block_state('minecraft:connection_east') && q.block_state('minecraft:connection_west') && q.block_state('minecraft:connection_north') && q.block_state('minecraft:connection_south')\",components:{\"minecraft:collision_box\":[{origin:[-2,0,-2],size:[10,24,4]},{origin:[-2,0,-8],size:[4,24,16]}],\"minecraft:selection_box\":{origin:[-2,0,-8],size:[10,16,16]}}}))),o.push({name:`blocks/${t.block_filename}.block.json`,content:compileJSON({format_version:c,\"minecraft:block\":{description:l,components:m,permutations:d.length?d:void 0}})}),o.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Behavior Pack\",uuid:t.bp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:\"Behavior\",version:[1,0,0],uuid:guid(),type:\"data\"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),o.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon}),o}(e,{block_filename:s,rp_uuid:c,bp_uuid:l,pack_icon:d,pack_metadata:f}),k=await async function(e,t){let o,a=[],n=i.A[e.preset],r=u[n.model_type],s=p[e.preset];e.use_current_model&&Project&&(r=Codecs.bedrock.compile({raw:!0})[\"minecraft:geometry\"][0],Project.model_identifier=t.block_filename,Texture.all.length&&(s=\"data:image/png;base64,\"+Texture.getDefault().getBase64())),window.BlockWizardProject.project&&(o=ModelProject.all.find((e=>e.uuid==window.BlockWizardProject.project))),o&&(r=Codecs.bedrock.compile({raw:!0})[\"minecraft:geometry\"][0],Texture.all[0]&&(s=\"data:image/png;base64,\"+Texture.getDefault().getBase64())),r.description.identifier=`geometry.${t.block_filename}`;let c={format_version:r.item_display_transforms?\"1.21.110\":\"1.19.0\",\"minecraft:geometry\":[r]};if(window.BlockWizardProject.model=c,a.push({name:`models/blocks/${t.block_filename}.geo.json`,model_file:!0,content:compileJSON(c)}),\"leaves\"==i.A[e.preset].model_type){let t={format_version:\"1.21.80\",\"minecraft:block_culling_rules\":{description:{identifier:e.identifier.split(\":\")[0]+\":leaves\"},rules:g.leaves}};a.push({name:\"block_culling/leaves.block_culling_rules.json\",content:compileJSON(t)})}window.BlockWizardProject.texture=s;let l=`textures/blocks/${t.block_filename}`;a.push({name:l+\".png\",type:\"image\",texture_file:!0,content:s}),a.push({name:\"textures/terrain_texture.json\",merge:!0,content:compileJSON({resource_pack_name:\"vanilla\",texture_name:\"atlas.terrain\",padding:8,num_mip_levels:4,texture_data:{[t.block_filename]:{textures:l}}})}),Texture.getDefault()?.frameCount>1&&a.push({name:\"textures/flipbook_textures.json\",merge:!0,content:compileJSON([{flipbook_texture:l,atlas_tile:t.block_filename,ticks_per_frame:2}])});let d={sound:e.sound};a.push({name:\"blocks.json\",merge:!0,content:compileJSON({format_version:\"1.21.0\",[e.identifier]:d})});let A=[`tile.${e.identifier}.name=${e.display_name}`];return a.push({name:\"texts/en_US.lang\",merge:!0,content:A.join(\"\\n\")}),a.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Resource Pack\",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:\"resources\",uuid:guid(),version:[1,0,0]}],dependencies:[{uuid:t.bp_uuid,version:[1,0,0]}]})}),a.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon}),a}(e,{block_filename:s,rp_uuid:c,bp_uuid:l,pack_icon:d,pack_metadata:f});if(console.log(\"Export\",{bp_files:w,rp_files:k}),\"folder\"==e.export_mode){A=PathModule.join(r,\"development_behavior_packs\",e.pack_name);try{o.readdirSync(A)}catch(B){o.mkdirSync(A)}m=PathModule.join(r,\"development_resource_packs\",e.pack_name);try{o.readdirSync(m)}catch(I){o.mkdirSync(m)}}else if(\"integrate\"==e.export_mode){function z(e){try{let t=o.readFileSync(e,{encoding:\"utf-8\"}),i=autoParseJSON(t,!1);i&&(i.metadata||(i.metadata={}),i.metadata.generated_with||(i.metadata.generated_with={}),i.metadata.generated_with.blockbench_block_wizard instanceof Array==0&&(i.metadata.generated_with.blockbench_block_wizard=[]),i.metadata.generated_with.blockbench_block_wizard.safePush(\"1.7.0\"),o.writeFileSync(e,compileJSON(i),{encoding:\"utf-8\"}))}catch(e){console.error(\"Unable to add generator to existing pack manifests\",e)}}A=e.integrate_pack.bp_path,m=e.integrate_pack.rp_path,z(PathModule.join(A,\"manifest.json\")),z(PathModule.join(m,\"manifest.json\"))}if(\"folder\"==e.export_mode||\"integrate\"==e.export_mode){function E(t,i){if(t.setup_file&&\"integrate\"==e.export_mode)return;let a=PathModule.join(i,t.name);if(function(e,t){try{v().readdirSync(e)}catch(t){v().mkdirSync(e,{recursive:!0})}}(PathModule.dirname(a)),\"integrate\"==e.export_mode&&t.merge&&o.existsSync(a)){let e=o.readFileSync(a,\"utf-8\");if(a.endsWith(\"json\"))try{e=autoParseJSON(e);let o=JSON.parse(t.content);$.extend(!0,o,e),t.content=compileJSON(o)}catch(e){}else a.endsWith(\"png\")||(t.content=e+\"\\n\"+t.content)}Blockbench.writeFile(a,{savetype:t.type,content:t.content}),e.use_current_model&&t.model_file&&Project&&(Project.export_path=a)}w.forEach((e=>{E(e,A)})),k.forEach((e=>{E(e,m)}))}if(\"mcaddon\"==e.export_mode||\"integrate_mcaddon\"==e.export_mode){let y,x=\"integrate_mcaddon\"==e.export_mode,S=e.pack_name;if(y=x&&window.BlockWizardProject.previous_mcaddon?window.BlockWizardProject.previous_mcaddon:new JSZip,x){let N=!1;y.forEach(((e,t)=>{if(N)return;let o=e.split(\"/\");o.length>=2&&(S=o[0].replace(/\\s*(BP|Behavior|RP|Resources?)$/i,\"\"),N=!0)}))}async function M(e,t){if(e.setup_file&&x)return;let o=t+e.name;if(x&&e.merge&&y.file(o)){let t=await y.file(o).async(\"string\");if(o.endsWith(\"json\"))try{t=autoParseJSON(t);let o=JSON.parse(e.content);$.extend(!0,o,t),e.content=compileJSON(o)}catch(e){}else o.endsWith(\"png\")||(e.content=t+\"\\n\"+e.content)}e.setup_file&&x||(\"image\"==e.type&&(e.content=e.content.split(\",\")[1]),y.file(o,e.content,{base64:\"image\"==e.type||void 0,binary:\"buffer\"==e.type||void 0}))}for(let Q of w)await M(Q,S+\" Behavior/\");for(let W of k)await M(W,S+\" Resources/\");let D=await y.generateAsync({type:\"blob\"});isApp?Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:S,content:D,savetype:\"zip\"}):Blockbench.showMessageBox({title:\"Export Add-on\",commands:{download:\"Download File\"},buttons:[\"dialog.cancel\"]},(e=>{\"download\"==e&&Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:S,content:D,savetype:\"zip\"})}))}return{rp_path:m,bp_path:A}}function C(e){if(\"slab\"==e.preset){for(let e of Group.all)\"top\"==e.name&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility(e)})));Cube.all.forEach((e=>{e.autouv=2}))}if(\"fence\"==e.preset)for(let e of Group.all)\"icon\"==e.name&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility(e)})));if(\"stairs\"==e.preset)for(let e of Group.all)(e.name.startsWith(\"front\")||e.name.startsWith(\"top\"))&&(e.visibility=!1,e.children.forEach((e=>{e.visibility=!1,e.preview_controller.updateVisibility?.(e)})))}function B(e,t){let o=e.identifier.replace(/^.+:/,\"\");if(!e.export_mode.includes(\"mcaddon\")&&isApp)Blockbench.read([PathModule.join(t,\"models\",\"blocks\",`${o}.geo.json`)],{},(t=>{loadModelFile(t[0]),\"unit_cube\"==i.A[e.preset].model_type&&Cube.all.forEach((e=>{e.autouv=2})),C(e),Dialog.open.close()}));else{let t={no_file:!0,content:JSON.stringify(window.BlockWizardProject.model),path:o+\".geo.json\"};try{loadModelFile(t),Dialog.open.close()}catch(e){}setTimeout((()=>{new Texture({name:o}).fromDataURL(window.BlockWizardProject.texture).add(!1),window.BlockWizardProject.project=Project.uuid,Cube.all.forEach((e=>{e.autouv=2})),C(e)}),100)}}},908:(e,t,o)=>{\"use strict\";o.d(t,{A:()=>i});const i={stone:{name:\"Stone\",sound:\"stone\",model_type:\"unit_cube\",thumbnail:\"data:image/png;base64,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\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"pickaxe\",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#7d7d7d\"},bedrock:{name:\"Bedrock\",sound:\"stone\",model_type:\"unit_cube\",thumbnail:\"data:image/png;base64,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\",collision:\"full\",selection_box:\"collision\",destroy_tool:\"none\",mineable:!1,explodable:!1,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#3a3c3d\"},glass:{name:\"Glass\",sound:\"glass\",model_type:\"unit_cube\",thumbnail:\"data:image/png;base64,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\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"none\",destroy_time:.4,explosion_resistance:0,friction:.4,flammable:!1,light_emission:0,light_dampening:0,face_dimming:!0,ambient_occlusion:!0,map_color:\"#edf9ff\"},stairs:{name:\"Stairs\",hidden_on_edu:!0,sound:\"stone\",model_type:\"stairs\",thumbnail:\"data:image/png;base64,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\",uv_lock:!0,rotation:\"cardinal\",collision:\"stairs\",selection_box:\"full\",mineable:!0,explodable:!0,destroy_tool:\"pickaxe\",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#7d7d7d\"},slab:{name:\"Slab\",note:\"Cannot be combined into double slabs in-game at the moment\",sound:\"stone\",model_type:\"slab\",thumbnail:\"data:image/png;base64,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\",rotation:\"none\",collision:\"slab\",selection_box:\"slab\",mineable:!0,explodable:!0,destroy_tool:\"pickaxe\",destroy_time:.4,explosion_resistance:30,friction:.4,flammable:!1,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#7d7d7d\"},glowstone:{name:\"Glowstone\",sound:\"glass\",model_type:\"unit_cube\",thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAABLMHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjarb1bluQ6rm35r1bcJohvsjmkRI1RPajm15y02DsfJ++pc2tURsaOCHdzM4kEFtYCAeja//f/9V3/63/9r9DCHa9cWq+j1pv/5ZFHnPyl37///f4Mdz7//acvnX//y9evv78R+VLiz/T7Z91/Xj/5evnHD7T85+vrX79+tefP+/Q/b/TnG3+9YfKTI395/1zRnzdK8ff18Off14i/v8z6T7fz5/f3xOGXyvp969//nRuL8RbeL8Ur7hTSff4bf5+U/B3T5M/Kf0MKvDCcr5Q0+G9K+b+u3/X30v2HBfz7b/+2fvfz5+vpH8vxe6O/bqv+2zr9+Xoo/3n9zir98xWF+Pcnx3++olXyP67t39fve/v37d/dzVwvlqv+uam/buX8jReypDmdH6v8avwu/L2dX4Nf/Z73w6693Oq67sU/Rois+BdyeMMMX9jnzyc8XGKOOzb+jPGJ6XytpxZHfJJbkP0Vvtgu9uFNnT152Dn2I8W/ryWczx1+Hh/W+eQ38MoYeLNwdvaffl3//oX/r7/+5Y2+TzMP4e5/rxXXFbUvLsOd87+8ig0J3581LWd9w/X74/73/7mxiR0sZ5k7Nzjv9XuLVcI/bCudfU53uXhpvn/+Etr75w1YIj67cDHYNSZQQyqhhrvF2EJgHTv7M7nymHJc7EAoV4kvVxlzSpXN6dHP5mdaOK+NJf6+DLywEQWnaWwNjsJm5Vxyxd86JjSvkkoupdTSSi+jzJpqrqXW2qo4NVtquZVWW2u9jTZ76rmXXnvrvY8+RxwJGCvXqKONPsaYkw+defJek9dPvrDiSiuvsupqq6+x5oP5PPkpT33a05/xzDe+6QUCrre+7e3veOcOG1PaeZddd9t9jz0/bO1LX/7KV7/29W988+9d+7Or/7pr/75z//2uhT+7Fs9G+br2j13jy6399RZBOCnuGTsWc2DHmzuAQUf37O4h5+jOuWf3iOlKqUSusrg5b3DH2MG8Qyxf+Hvv/rFz/9t9u1jd/9N9i/9p5y637v+Pnbvcun/auf+6b/9h19554DadDdILWVMQMuF+vGD3Gfs0Lv2P/+QiuNqw1vrCFZ61Gr9re779gWDEk7Hf8Xwl8NJ38TnrnU9a3+YWvjqenep3s+pcXE7PW0uaL5F2b/6ecmXT+gPINT/izflpsab/7SfsZ+XygpAf7z5vXGSm92sl7P19ub/PkxIvFWt27ru3UOY76x4j1RkSALBZ3/bugQmsNnfqz5feuPJVd+KHU8z384byNK889Pz20NLzzV1Xr7NGViDX/bQKVHMzLfMd3rvVxcdgESBkK3d7Jzfx7PcbLx+9G/cw+seL4/zag8UTQp4PS+CVLY33fe78rj3ezOV4/XFe233Nc70vPzQLLyZePX31/oU1ku9Q8x3TuL1VLLkE1ult+MrTAusXw+7rua9Hv1gR+8MRRmE3+JjIv9YbG/8gNI0Kk3o/otaIcROMxpaLcKN7lGe8u/Wyrz35hA+H+FbeLa2Fp3MHaQ6WZ8WAEzz8+95lgDNczirpnseW2Jp/WNX1f26G//7nHu1J37Xv8eK277fYJH73N+36vh9XPQrrQ5jaOMzd9ndzL6tsVvnuX49lE9dZ6Lw11Wtt/4E3t+8t32jfwlVf3vBb3DI3156X+/1mxd5mLwXLLA83zsawg1hgrQsDv/jv/fX67lgBIK5isWogSBhcWsNFNLQN8QBzSvriADG1m1X4NLDiSSBLhEQsrHd2eEAbX2sfFDeDk4N/5449VEAqhwoBeD42D+duN85ZgZVW8a4RxofJhZeQXdczvqektoCtdy7cCN94OgD0faXde98vwLJLeT5caG4+6FuljRKf/NZR+GR97d3ZVZofW8xdZ1Yfa+OC2d+YMegxPtx3NhYrA2o73QKBP9PW+Uk2K62LTwBa+dKLm9XIXfLj896xpGd+6wYtVyoFaEx8tYOB/CCbN9OeibsdnTUc5btYJz7zCREHqkT9drb4WZMfzoF9yR2UrR/ECP70JZEEvGRrWS8s5m7pXe9e1wSkWOJNfOAv/GzAHtJ+Iu88VmVjWNINyq5K0CE8A0A4A38mQb+MwOq2AodsaxTwhSiB54LlRIvF7nARrEwDV+Ligp++YSVsfCg9TcIHENSxAg0hYnz3hRuKVWIhSz0XoYzPZ+Xgjm3z8tFWrbA+EKa9I+4BKlTgI2d8EqLDew7iHOAPatSJIRKPcXnvIDc24ntTmJmYQ+zBMsLbNjGFBfm4W1aolBZZcnAZJ27hYqtK856wqvC0SUx65FLtre2rpW8MADfAvMARNrwB5tw5gMS3WR1AS748r/t4bw6g7+ovUPoUgjGgiS+kb69hfP1A8hsTRMx1PoZtqusedb/w5+dpC0y+xFXwd7bnwTQ+4mqatRDrMXk2cRBjYdYY/Q2W9i8RI0EovAXrF9cwaNxwA2y3uFb+A65hpLgF9kd0RllmosszEX6YY0eUjTtoRukV/+GQtd2vn5CRTy8I/AqyRax6AxyBBb4XLlr4IFantVHXriFjloBCxta1RuAePAKOsbabII8zV8ye+EqgAI86IeXjx0v76/LQEMWImLcOvKvwy4aWOi/QowRCQ3kzvOf8Fdr1//5nmZjuDg9vgguXeG29EM+ObCkLV2N/9g2I3vkD4r+cv3vgaABYg/yUlLHSxDq/IC/bjIVuYstHgEQvA3VJRO2b6PP2iYFuuLqEZy9C9wsvnwVP46cxX2Itn1xgOmzOWZE181We/QfCX3Fa2AsfJgxU4uuRT36awX2xYCwnENEXuzygh95TWj0sovG6IJa8GDjTQqMY27H0Anvh6liHxeqVRSTBd8CvitOkieT8jj0Dfh1Lw9+uG5cgLDU+ByYHO+N9xgoTW3nywU538uXO0Z0E7V1AUYAMtPBDKxK+sBD1qoToipVg9w/fBoaAmQafBIQGxorU67z7SyjGvnHnFsF0+EF/P9gmnkjIfjr0eOA58E2cMhxeIQLMzQayW4B354X4ZwAN2e3CxfexMtxFlprBns6C84UrBJHsGygpvjvAWjnWziLh4lMCtG72F7RuIGwn2mUseQDkrSa2mUAcb2CIALkJZ4BQe41XL9s5CpbeCD4vMN+8klJ6wPuAPiJsh74vYOHDZFiAJ7Fsc8P8IW/oifcu+fWjywD+no6O+8BcAgtRGIbZWUSo13wDl80P5vZMWDP/mjHdHRd5iJY4B6EcxUF0+x5I7O0undgFJMGb4ksE2B/wMiBMGCVw+BDMx53gbeLJBR5jmhjrl0vMn7AIjmimRNu3ZuggwIlVs33Q21C8wbtDaLkDqKdMG/6xr5dL2aoNAR/DfUqXKPPR4Covn0SqmWvEq0Y0WLL5+N+D0wU5LJufPtjr5RKzpWAkoNDgQS/CI4zIfld8UcVLzDwBOq6KhxDiWiOMxOTVAeM9g4kd70fLFNYXtkvIwELiBobPdkH+WkQHRdbj426ThGg2cIw4P9MS02HQxBoi7cu3wBg2C0C8H952E7HqB2VrMhiseX1Hk/aAHMqA9kPIvLGMbTiHK9UBo7peIsdrpEMi4MmgJVuAlXCn0LTJ5rEyGQSHHsD4+wcHXlB6NiBruPuwooI4hsWDUDBiHOKr+Acm32HweA6/1RMZgAphThQURpgqcT2h+t674oXvUFh9H5EWj9decCi2ib9yRS83AApWCBN8pzdiDJBw2BDREo3xETs6IQFeH/ICIfYFRBEqvMJXSBgTRtnjiw5WxRgngd6PRalIQwwRVtlle9AKqAVb+hi77nlJM2tOcyljsfB3h5pC+2aAWj1qDxD7MaZwUazdjn/U01tZc/2OywKFrvUlFgMSmzB23YAXJTnCZpfAEpwFAsttTJemDP12oIjqOzCA+7yJTnXxBZgyHkAUI27ITNAWlf3ucAzJEWymIqH5wRW4S96sAr1BBUqQFT8XG4hlf4TF9wFHYDBNRtWJjgbixcLDdRrv/kr/Xim3BH431TP0D4YfiJ6A6AerhZwgLDDmBGAhiXDmhGcRiohk7wOd3WAbbgS7SBD1Z+wNj4A5PO+Em91aw7wgni+Gsmd8iaEux3cgH3GF4bBfXBLInKIi5MPQJO4AM8jwrb1BrQ0Svt/1pZNbRkayGxkXImAQNNYOUpNUMQDgAfLJRuwblONFk/078aU03GvA2VO5iJ2bWIWGxTCX4TqFP1q61F1YJowAo4LJ4NgmKpsE6wPUCBCpD9hMaO9zQSZBNEI7ygsisqQ8wDcbeeOqN3opKlQy1gp8AUUv9wQfAh/nsSesI4MDl9yWTyL6ApJroV2QacAYnAkCJ0NXqcyFq20o7QM6YSyTj5/uGLgPpUAEXvAqQLDc82jC+/yJONgB48HGJQFQ4fdFjcd+tOFYGDpqBRjHpzObl9A31/2VG9sGm/CtAG3GqdkFOEmYxDHC0v0iTyLCGKOoK0IfUfSF4GPmiHiMyYMgF4wE4MH8wPL7iNFXqS68suWIfCzUN+F9Py4M3IwownHDaruKGlgmVGaATfJJgClaojkD7IX/sM1I90N/WlCo4RBENmAaSyppArYL2oB46kAofOAyHSLDrHKBJcqwRzCeTgBF4iW00njMi977gTMUTO2GtiY/8/CqD6UJ0buAHsK4WMPtE6jQNlyDsNbknp+EHkxAKqBm2D0AEdcnCoFMCUcHxh/QC5mFc7Dj8yWkwBD6Q0AJoiXABNNZuEPPaNSk58LlWGWuiQsGL9iGxusiTrauMr8YWhGd0nrMPMENkS2HE9zE7olKZedBzyhLZ0GC/ClE7DOzMRh5hJddY318AwfJvGRFBAO3LMTAzwjFDQ2o/q653wtrFmB/KbeJI5y7QRNwx7wRYg0FORt4DazOVvCnnonJ8wSXB69H0QKsWBBLcj+3QjTxZSyZbYFhvOW5sBeCKvcF/8OblxlV9gWUOduOIMaWjIkL/rnwU8z+JggBc5L/bESqee2rwomMp4i1sNcL00GoxV16zwQBInW6uaHch1sSp8GWt0Ijw3z3C2PbE9sJ8crIjZGTpgzOqptZfihb+258FM3FZ2flJCv24OUsKZdCaHjxDrYA02S57+fCHwjOOLzbJpHY7HwHdMwZAPDwbSCJS4Q9wcagOARxlmtUnHo+YLNhspUrwE/g5qb9XjScQXoa/LHsJQvoeDJil4gFp2LzWQSuHXtSkm2j0afgTdfR8cVoDKt4iTwJ3d1Y+YQR8HEb7or6RNDqbDfBB34eTpZgQPq5uv2AkN/FiqHO9Bp4qtesPkuydeGMSJmJYogYlFVVxYiGnViHS8vv+J4J3JAuhEiEmqV8aDHA3WJI+6xnm0WCA+N/6x3BdeIjRoAuIVZ9Eh1Mgx9TGsQLW2CHkQqocu4Euyai1HgjEkHSafYAqf56XBhYNDAMbTfNeu6S+VkM5jXpcQFC3PK9sM4AW20lI1bfCIkJaKwCyBN7Osj8AsMTJl6gv9wYrO7BuXP11ojZV1MtgYTmV/Gb0Ie5BcgxBpQx0AZoAbnJpNRctxZxUkCoh4fV74sNB0Gfi92AfI4hryD0JP2I17W6ynxkE5Kp+eDIvOwzQKYMZ8UFwQck+OG7ROeLz2kSW2Qblo3SJcIHJAMACjvhrm5FEb7QG7SYOzHGI2SzLC6bNGAZ4HHotRvHIyKgFxNkt8C2zLN9pZYyE1IDrODDuq4JugCXRG28Nt7v2mqKV3kzLjAkLfQP8XBxdU/Hs552+CwXBrKEbyFWifyIeRizqT9zd2bcm4ZstO39hWdnGDaOjULkrYlOSBr4Ek6eGghiQghShEk9hc0BaMxaB7AXb94s7vYw7YPWgKstoJiGtwOo8pE9FbQ091sxxDCkhcMUprCEzFtoEcIpop3FgmxV6HW5ANKz8nDmgG0/wg/Lho9yQdvTk/Vf/Oo/udX1D79KeAHEQuuGCeVmToY1ft3kjuoomD+mgS0TwCo+yD2lADmBoH7vtTLUsOs5B+L66rXAwbCyPTIUC6jChhEdihCwnui5ZSsHKU+qUSmyeCMILL4TUECQsw21gkoi2PhTPixdAr9fqBnBgogyCxaHMmuGVJaiojyBV7bfkgL1/gy8uih42WWWHemfTbcQJyr2N4CrmzcmkhMSoaNY0ZfNpjZA8f4uYA0cvFWUuQtiKkQgg1WE3KqOimuIn6nxMK9U4DWPBJV7hLfwKdiDmC2XucPudY3whTxNKOCQsBIYNe9YG4LwLBDmCP+4AWcdoJQaYM3oiLiOOhr49QcAsR68FPwAxN1aE2EfVwG5YKUXhCsh44nGaLrwVZQPJoBNEaHgmFeDD6NFX2hBKoAUgQQwhbTcJz/WPGziuuCOmgh0ptxwjWImrWHrRJum/G2XgR7IQ/qY5ODLu0p9iMlI2ezBHaBDLBoPYh43xOan5wfxmPHzO+Wa59ZwmPJktgzLgKwHyDJqXZVbuHv1pNoVElAa6FcQZVLyQ7IwifJAEEvhjTbb8O0nIn/FpWGuoYHoJqwIljq+ouyvSJeLTE/SFIF7QAy+u8G7K8K/wCjYzjDbhC4nynSsE+6SFO0m1PH86QeYMYZ64t7cyGGehHeCyJPDNc1RmAKC866zW94WS4WOOKda0MmbxSmP4JbMPZsvzqO/Iy3jM0SQl118nXU3EN0tdnACqB0VMq9XnqVqWAr0pq41wwOsI9TYRDPLA2YJte0wo3rtTERjb7h89rHoVXOb9OlF5X+DcygZ2CDkh7jaK9E7s9zYLJZg9sl7f6A1MG+EkEobJmIGh0+u7WhSDxnZT6QkuH9ue2NLLgNRerXHVBWXsGUeF6yUYIVKwPw9cmY5IoJ2ZOTqx4rk++EGsFnCy0fo6ku2uw0hLhMOdQ6c3uvB6kP/JexYYRzDTy6mINEiOCpcgZhgZGu4dQMj8QyTOyACThTv+MVnpguqIkudqMMX0TSwDMQKrw2gNx7S4fns3COeIRsKtklAH0QY3G9/JRMHBjr2eliez+XfAeQ9B7JEtp+GTCouNV94uUJEINRA1EUTf52ISTQHdYMatlx/p/VY1PeEby4H74aTIenBJy4lcd8lg4X8uAYBOEJGFQKwBu7rnnUa1+ow1CAt4HnvLV4gPOD3EDrCIsT1g6g96l6iyitc31kblU4nFRAq4LkSXroN/PVsagUYPzaIkBEPh7rPwXUDfJJZu8zWJTgiAAmBexAk3D9o0S33CF0BjLCHT0I0GwHOSFJ2BkWXWUH2INeZZsqeCyFBNnbtGqA0uNn+rNu4duNS8zZvhCNO8I9gzB3BucssBKBJRIAvPFzUBv4IiUjNomZhD1v1yBY7goW9Hg6eaAuAo/9kM/Avg/rJz72KiReJi3h64Aa64+3WBE8r4Yg4Pi5inEE2eCS2PCQS9N7ikTzGCPFaJr7r+EwDBHg9TFByhCMYGlZzEXHAy1jvh6JB5gd0Bvy+Ev4zV/HcnjGBQ8im9T0/l74fOCEwpx19vPYpWdF84WpEAvOJL0gUC2/Ehck0940kYScw1AR1gCjmDUQtvO1FtO09uIQJmYnEzRtRkz36N1iirmHhy9Ozr+j/XHWbJ7H9lhgUIDLXyJtAhf7twnARiDSiivCIgoOLEquRTuwtYAQ/rthYvFnjW/2BiME25SCYJT5x7yiLWSVeiw+s7PAyb55kYPHZJummZ26eNuSAvasliA8RS+wvVzlGgsm15YKiUFdH9+9kagZvYJ828FPYCGj0MB1QYzaH9pzzOUR7D5Y6cJOWCrVMuDOzmsowWQdQIroBH8DwRVB9eedfhCYWwYgHL056aZChAONfRPLe/jpp24pqaDC2/QpS+MaLCwJe7884YyP4FMsY3hf1wN3doFEfNx4yTfjfvCxj6SiWZCETa7PfXEOHlhHfZgJEkpUGxAisC8IOt2P1IGQAAKImElxfFczL7j1y6095f6FHEXj786wYHsYOE0ZYCfh3PHQTRjO7gXhYf6KY/R2HZYw04uqECl93mWs3S10sVyGo3yiM4akZ6PGUB8eHzESlOcACAKNf4YySuJ3biaClo3T7JR86eRGgTlOF4H4tJSNF0ekRSLxrl/3h6f3Z5YY1nTwyMfo1XQDRA7PHTs8a3CTvL3PMOQHDRxikkzvArgeWjYPyj51hD+oe/MRcR5VcqC72hUJICyEIIYom6CAp3aMezyzlfB+gjwWVN/PJy6Orp0qkoOFH9r8ADUC0LgJWAhHkj6y1u84OmqqFnj7pd+Kus5jFQH1bPSP/ONEPHCrvYSf9u7juPtF8aBii2/tB1oCXZ1V1OrTejNXYno8QaJBzE1R8+Ua0dgpba58nfYXFvmPydJk3xa6JNPtFWgIDMDi82fgMvQTxZsJkhmU8HvCt5aVvt5BNKZYNDYjdeMPtAfj7nP3o4QZRJowun4wc8O4xGvR1ZGzU83usEVC1NAhsx+PbJZSi9poHP2Jqt8rpmCJM+YEZENB9iSkhEy0bbg3ua1H3hNbfM/4MUmSInoz/zq7mjVbj/8/XcRM83+8naEs0vJ7zCoLElKrgERm8h/9A/8PFtrDJLPB4ASwiFTs2H09YIJRoesK3l35jPUTVgs975vwZwRp8cMHZ0a/jvuRzE6DoRmDEB0j5EuTZEgjx5/EnWxMs2rFECurrWbFic8CJkeKBiPkZ+wkrhGmNDE1thIHNJM+eahq/j4dMzGkt7uvhKTS7y9WIB7g2LyJq5JTyhTiKAZbT7wgZhIai/5BHkGWYhGV5FR+vb7MsRm7GrtzZohoE8x2A0xmOPLwmgNuwVl4DGmMpAJdmrP7bOCPcJ3pAiT8M9CmMrB/0bocLwPyIp8tjMcsUiCfJ3MxJgsN78m8lUaGzRRQmMQg0e04yWCZSPDaCn5lrxlWbwh4OiQKBFyf0oGlsiw0sNQNnj8ap5ghhXPAhg1OVWwJcGAXREoy9oSuD67tUm0Y8s+N4PhR5mAZ9g8V6cEUA1FqHMLRojGPC8615eNWJvPPmJ2AR48oq/QrHrp7DNV4K4Fi1sCqU3TRb1WvvNbunAwNViKPACACoj6U4pRMEuIvdK8riV9uYuOvmsk2yoGowZvgbxO2pxJAkMSTU1xCJBgRXWGUz8RQhxunCIEIyLyzV/zwlvH9iLpzKPaBkfWnkw8uLxQ2WfwyzInCaj4sjkFjlcUVXiHDYa0ye9REVEloR9jbNdAHWeCukBnP4cQaZ1OfJ6caHAArCDTHiviygCCvihQhHiBV/QbaN+6SiliU/0M3w9Rt2sb2rJKAK+CYlEcQm3kuZ1wRy9nf/qdTCsBXNWDkhanhy7lG7whwdFrY+fc5n+h1KghpYDCDDneUyyi9rsHok9N9AVF31tuZjmJDfOw6oXSYQxzdYYxfZ0GCNU7AOJcEF2JsF848fAcOTRJNQuL5pXVi8qGoxHI5n/wHU1JNdXI0fWMTZIN96haPHXHO9uI7OzSaV2Db/DeH0wOZJc3D3aCsEJTZzq7mekw5sSKgI+j6WJagYByTtaihZ9AW7lJdOClrzI+BF80gSA/Xkn8j7YchhKyTwWb0ShMK5voCQLqMPi09l+izb6mMd8WxpSvQHcU5saVgcg5FDb5BoLKJaituWdN2nhoJ7B7PhQIBdYxO2qQY7Nwid/BU6heaC8VgVFVFX4YEx1g8GBSQslAakfSH3ubGULuKN5++E2MkHbCIWlJEQq9+/HvESWjxNRl2yIZAcUzDjpMgxbF5pFR0WocreE9oF1qtyHlFisRjIEMg7lH8TbfTfT4+oyYwAIfeP3vMoGXHC9V2Ea0QMgcRMaGnfOTtzaZ8UPefYX/eUf5zCtqkUuS03juhRj21fRRJsZV3VTLk/Hv54nwVhsKHvJ+JYbCxweFDdTKgmcwlfQyk/LEkJeCVM/BvBc5FcMcSZC9FwiC2QdAKP5bbb8yTZ1Am+hINK8Kq3hbqK/U++UoAfdDs8u7xmlT3lgz+wmug4PBW4hr8veOqOeT0/QEOGRRdp3+d0UrRAb2XEM7dm0xJ8CfmCmXmE9UdMZQ+2XisAOgZ52MQTpgU11gXle0O8AXD+zRU+IOQjxTGFZBlssnhCLrvQm+aPkHbQnQUrK5q6BH5bmRM8kY91ZTbJlNG8TO8gm62u5k3Uds2y4xkx41YrVOBBMtaGdvIocmKtmfdkSQ0lrIBEAsp0ETAgtbgGYvzV+Ihpy5r2qrohUDZQwBJXbPyxbHCGcAJ5ntG8pV7rsd5lzo+FyIGAWhdhoCBeJ2gJCvZDY4AQQmE9pRUrms4sEnwPXuCErGOYu2bCEf51smqZQIdBvbHfbsM4CRO4RmWPjXl4DJL8/YtjyVPb93TLTpAPV0GOo8ae57986893XtUi8vL2QDAo7HKABaDr+czIG3vMUPvlsR3M8rbGiWDGO3buZi2uH06PUMVbzD158A+UWOmmCrgfOxGsZY3Rc71yKeHwDCk5eghi/+4Al2JFVUzv0090JiL0iFLF6JNHgtajHGoDvnlYnOJVP8+H5+Ij0q/0krsLH9vb2b4PQFwq7kp81AqIZpi3lO0P20FaT43pQhZHS/aHZVVwRjR5QqjxYUBRKHBQXvzC0uH5RKXQeI8JsT1ZHQI6NwGWj3Uht+GQNgogCbOHyhYxeO8rZszPQ3xoGcKDdUehv+zlNO/LHtRq3gcBQWy7FitczDNjy1nSjsDHY6zLauwyHpGBCRYFUhf9TIka9oaE5XIefIS1eiURutXpTjgIFqTmAxmzTOgl68dXWK9ltdamnPvt1norCmYHzOIpMn7M1qC6we+HO0cj5oGbK+DTjI9KHeeU0XT23lqRjziJzX2Q45AObftVGF/e5vqk5lg/ppi5cYKrRSB3AjcQNEcTWBW0oNl8jyD6WW4tKJgoiSpiOCS8xCP4Ax/w5xrAdFVXhK0QLiCbLDr7aMaWH4kV3wY7zcPXYt3cRCjBIUGtk5l6vItTyj4ey0OILPDUGWb1DAWOxU0H1v+k6AJEFmItu+y34W+Y0JSGtWq1emjWjffJX6CnrxWO3BfOML5gPNpW5cUjWYBZrFfxitZmGa+eCT+VhbX4LVnSej8WR3oi0w908C1E3Vqy4lNY20pGweeBhJFo13IjQy7QEKqAMFym4rKVK2E+2Ku/kMSeYHvqP5V8LuD48I01q2lT6Pg9Ighsjs26AyjKY/FEGlCdeJoO0ukFgfjbeMKiQVdi80yfaIo5x9ahnR7TLdNbEK3n1P8jHX7VczaYEOAm6k82apGiy7vOuYD1gQ93am05pnDOypCi9Q3PTRRB5APO8O5h0w13gRTBg29DVH+FxIF8yMA8KFUDAtsik4w55m1dD4AHv7t2gRIR28LgpchT29q+RGBD7rf4cOdjfD3wGSx2OVlykSj5t55N2oGQWCIukhDT9wOn4aNvT3td6ZPUsDTQXrP77F4W9ZF05szxNTtzPPJ/EHIxvMCIR+/Nyqd1sy5ETYu0Cb8AIXCCIa8YjXmPvUEl3jFkKdnsEBaiVTQhEPdVxDmzYnyoBUdQBYjpZ4rh1c3YirY9a4we/gduznOAJFviKt9T0wYE58u1YLXYrnAKU0zc4Hc1wp4sZ0WUea8sMAycjWSv6iwA1WMZUYdhYiNQrYsIMLhi5G861Ts4qofmbCT+jW1ncyzPI8Fc0xL3Z8ueYSot3z8gaFjNviAyxKiMSZqNkfptE9jISE8cbfLoybwq+xY9pH7gESyB1XG7g0UtWvpbPwi7lRcACcsvG+W6WCSEPNtnxYlpkOmJlmekw6V9bpYSasr9sGpQu21R3vXiK/zSdn4E+vsHgU4m/ayLCGZ5ohB9ziP/qeTtr/6xcg0W4paggZqWNydrZy2xJF5bxrMtuKwNpWHxbkoNvyWc7j49Gc1qOsyjmfPPme2DAEKAhhVLnk1iEG87FUjN0z8DP1D2WI2Eq+jusK5pegB6dw6RLiuKuU00wyklO6UaclHIbF6wha/YIIwMJ4wSKc1HDSxc8OYzWUICrZXm1/fHHaQSR/p5vrjyZDM9Q0lf/bGkQbiAMrPGwBwSdbxG8R9NzM1E1LDf47wVsoMFgjv9/OzzsPP50zZ1J9MzaqXI+444PevFvE8SCmeIF5G9VLYVJp8sKICC7wQn5tOQ7cd0pvRdjl2ssd+upkcOr22RcJ3CX2Mz7XNjtSwsu8nmwdqXGcdsDT+i1gW1Auoz1WPgegS2YIWP/BoHuT8iqYVM/ZcLMkPbAD3T0m3aAwfJmuF3+su1EkHeAwGmHDzWQ/gsyP1rZX+/IREZvgdfsVg4qWOhJQlK1AnK61eNu/4kwrbNexv8mPCDp4gSsmhIH1LUFqncrUiqRHQus0CW4Tlm4z3xWfbjZLii536pwbpUKfdQUEP0im1eD/Zxmeu0OtyOIYhbgAafs/xeggWXvzzfKRvk0l0Sa7JSMrpF1Zk1afvwo0F01W4QXfASBIsZfG4HJFnjTs5CYE2H2s22jRrrbR/H86Iy+XCjDiR+Xyp+NtcdhLEmQkgds9qE6kkkJtXOqXO6u1WCxEabaJAxL7gXP/iRzAbGcSG9yq+GFz3ZPVsi2HT2A7jz/KOvE3dE++HRu+KQAAxwWDHSQWHx7K4XWw2ZjVblo0Q8WYe6ImUU1A39gTobxgQ/pontyITweeyxfakaJSiTL/zSwro7gmiA4m+bPyznHdLOwccAxCxf8xAM5Ee672xb3SMZq7dgBA+5LP++LTJGE3Ln30ahm0/A59GgUUJeN4RDWmgCvpl9bcW6VwMi1j89sEkXhrUkQKw32PKOU9AMp+gdwGyZRV/Tgvhl74YiJVULuG9LvoGlBUmoVhhfWR2txki2ZvzVLjXMywKUnUhChEMltJOt/czEmeYBxxOf6pF/+iznufZjf48nm0QEeDBUBuFlr1y0jrv02bG8yZbZs/bBhbvTPOxq7j0Qli3Wem7Lhp55utgzqAf+bjvv4DDCSZGBvn/6WtzDnWC51i3Ck7hkyzOa1ejcz8U+eEQGV4zQmmeq+/WakKZCfnj0ZE4idkOCmBcCiO0ZxUy2/WEZkbe7UDBm/a15RHMgs3DJRyXynDe3Zgk35IeJTsZ/tOcKx58OMGvDZpU2UGsHBJsq8KgVkxVEX7fFonFxy/0PzSxTTCrTZC3fsrAxW9qePDrb0GPrpIjDqcNTlHDShwFyvaYeziGCLPQ5bg0KAQIEcOzu8VTmg29xRZbVXOn1KNpsAqJHHX971sNaQ0vZqA5nW11gJKadHiUCde79FCLnHDxiuHHacvFvPB8PQKY3NBqbatksq26rTSB02FMFvqDRMOHnZBC/P7HDVMiC3BcsGzAH4awlrVZh7TEwHCn/NHxBQnM7tvqoLXEwA0Q5BQ2rRK6znODR54Wh5D/Hup3rPiVwrLpzOmKv0Ho5/lpiSHnM1Nuh4+kRNIwAv371DLNdJsgVETvyG4IBFdoeeOEbhJUc+Tj05wksR2jDATDFu3pWhWAPorJM7MK4YFGPuXF7gsYROXgKkdRTxSCFmbYyewjNMqMT8Q8crJtOQKtjK9BdnDY133vJyZvHFbyv3ovU29PaCniOnbxoFGglIT3jqNaFzhSh5/jDw9tUwL/asfR6rMN6gIef8eXDqQ+R3fb4Y1Jhz1MH4HGARx2sK1reDEvEdlYH2DwlGiafi2kwJfvGhEAKwrY9PHEcnR0JL5j78Pxmn+JQohBItImRMIt1nQVjNaCSpmKBrdSKpdUSsroAqE/V3bCnCbMEvwMAxWebnHLOgkksnBgJMa13BVjxS8D81MXZWGGfaPVQ7jR02cryWcN/0p/s4mlMPN1EoHnY67LCA3v5vIoRF6EB0qt0tLrYQiHeAIXlPnpqfCrmiDCIu1w6hArPsPu4E0Ui9hQsEzF+LFvE97C8skbrTuBE0I//rnzsvr+c8/WrHzM+oUO2LSjwD5Hm/eslwzwujBS9iDXYLwgRh1zcT9zr1mOs7rq6GQlPj61OgPT/kuS2xFW8Fqbb2O79rrvxZSKTmz8t67IRL54U4DLRcUGxX3MPBpNsUvYEk3xmKmzzbLZIdStILRRm+7VOIAfSypsDVuZTdkhXtfz2CdEO+H2zwBkfK8+McAd4A7ZAaLfHsvd02F/4nqbct27/HDA7bQGVXd4ED7MnnQjI7UG1D6tt9iwIEzZC2tZpmebQJEzIW8VfrNcCOYkoYXYCZGAXXweFQND4Sn8LN3Mvgua0xYtAu1yZ+jsXPZBmru818TUdGJElOFfItroS8KEX56AbaAXAGsLXk6lsn8EzoRL/Fsf+PYxdf8WxG+mHOJu12JRkR5Ba1j7C2zMDmyDhstOqapQJ8st6BNg7rMDK7ARmd3DKuQTDhoMeoGIvoThagoJNbJhkH060SD+WzyWwGtjOyYBNE/HzrYaj17K3WoKHbpAxXBi9BwW/EavvTgTVYf/RKLavhlHtSHnPkRWMbRGMp4lt60asQBsWnBNO6mPLG3yXuPrcZ9Ush0P/P3aJtTEtlismwSuBk/d8cDK0wLVxLtu9nlPBD5ct1tJjMth+f9D4U3Lq6Yl1KqwO4SXx1bVcspPV3/YastgosuNdO0cnnLiuNlbD4B1x8lf/KvcSMkzCdNi5rZ/Eim890w0yeLQtSfVYAC9PZ25ZxcJ4t1gm7rmIS8T3ac7t0SOgS8lL/CnfDzI0iQsX8gFMddhFOJ9E3PSYDxmAUpsxPqz8Z+h74UXZWgfIEo5P0IqeadqZjPXUq+XEmiWs7A3tnOr1cXrikdXh5zf7154BOevlDB1BuoBfVa3uRxM1drm2BZ+K9O89cGhfcVvPXbGsPpIhL3Ex/bVfD2T9HU+vv46n532Op5EQmD6YYRVmJoRaNhqStR7ddpBmLSfOYh1gVQnfjcgD52n2yk5PbLABnCRVjzOI2dJg4qWHaM3St9cSDlNRYKftwEeTdNOOcdlpECxK96jHKhWbyspld7wjcM4sEDtdnpNLs7ClESA8KwEsZZQ4X40EkI4esZ3X8S38a6sbW7Qx11TMBnOISKfkFfOBh4Of77xZP9w4OnWgOLLhGRKOVyGqu9yJ5W2KVQtQIFVAlK0Nb0Hee1DPmp5SCWNZtdgLnOnR6syCCP1eIGzGHWx7A5Slt5cVzqw+ljAga8tT7GHvkP2abzWFHc5MjdY9MOe9sNuQEXSxWFktCj1ELvUa6hQGPp0Ksc+IHZf2HMlYEj5UICHv0z7SGqjDJbfqwcBCvREIbB4/ZdXzZK8gdk5dMv9qw3TFLv8uufD0cnu4aXo1OX7BnvDfadS2zT3a3/+60B5ZPYVrskjcZuNmwTP6Fy5r1OoE3Y9ATCi27MoeBFAKvn4Tas0DEPt5zXOb+StWghoQ7V8ZlkHZ8ImX3dAR7gf9Zms6itqc/rDPemMEKTWH/1wWrFSgYMEBbgTnY8Wkw1IgCnfyQM6UWIIYr8P1iMnBXEDD/xULMG5EQN+Xh1mIkcHnWmyO0F7qRNO2EigrxLjDYZxEbQlYDvuytjiaKEL8jcOtr0OuId1PuPGT4FQrNR6byIdZJeFEjFY9DLdZ2cYkj+r3KY4p3ZSq85TCBbRP5Avrz+d1jwVwU+eZLVQudpgdflF+XZqlGYDYSHs0p4cFpzCocfv7Sha02wSJEJeqLbkHsiV7Rzj5PdQblifB68x6s4zJ/IEVHKZRCq78pXhNi0CaaRkcngt9qwoxQkA8f8DBTDp70vdCt2AEw47F5vkoanVZQunp2/1d9klMr+6T02xb3bkx2IB7xMc3s/RrWb7rAbiH7IdoFWIBbvxBn7C5Tjjy9FScrkYnlj6fCmPcdIa+IZy1E5/ex8NTufVjHEB6J3tNrYWt1obsF00r0HhMoa2OgmOyueeAwKpVrvTjc1ld7ggxhg5XvFkgaTl8LXmqkMq6CDwA8swFGYrL3duxPoS1bS/SHT7zPXoIsGBOFzo/HEDBxWT7WKCI2GhfCr+t0CNUYK0mtqAvGaZpJX3Ssu7TbWkOMpvgJpScI3dLT5x1gL44iZgrWL0A6qP1M/uVoFv9sywT9hCTpL++07J6yMpEAdZMGBk2oVl5KuEeCkAwm8jeh2npwx0MLrFDK9s25bYVE+gjs1lsFHuICz0WCf5p4rNweVi5dvEOU0H4WKYCnBFBDPUIVHNjR8qdeVzuJZrBokMLfb6CegOI+rQoF6yB+m0iDt5jN7AQASUkPnMROHc55AJ1heuwNyxYOJ0XoETkxTeYksw/TgcEsmO8oadQUB1+Gmaj+YPJxGXuFOCrruo+1Q3DnkpibAazvj/szYkNeP+8PR6EGMaEC/LZVhlC0cxuWpn6mciHgvxJg8NHICnbs9HynG52PB0ohmjtv2XBjUn2Mx2GiHOmRBQn8HluTyC4+7CyaJlgEjMIbsHhMRakjX2ZnwaMnNsTzcF/Dvqqp2LEew6onGE+wZwa1ObwkI1l3ZDkebNQnwxxVQKkBR19dGtCTh75tT3JdvLmbD+E7CLWW2RWbKpczhO8Cdm/7a0CJ5c/rpP4iOVodVtJFMR4/gOK8+9GNCOunbYBHM+Mrpa47bTyFM6CnGolRYSNWI1YVzivLFZUH2Ukq0pnVBMiPZwzj6db82CtilPaiJ3Ed0fCsTurX2Y+8QwPS0H1/TO+U55VLJQwwRdNvbZDPvnmnueMoD4/YVhY9HxnMPsbcAiLfT19yThaTWfWj+OrInjOYjicAHZ0mL8Tpjy1uJ18Yh3JGb60MxwSFoaKx/M8GATEbGJsTTPK7+9gKppuNvGUEQc3zlJCsZUS9JhW9MZ3VGsibK7mF7AMI7sfJx6dM3RsP6IFnIRIHOkos+eU3ktoTffjNRBQx7Lh22haM934A9r3n8obT3UjYbC1uYwKlgDiIYH7Iqj0U+D6WFJgCeTzhXBt9Lt9huhD6zHqbxGXnaIe+08PSudIrRMlIEg4xOt8SPMv/3L+d/11AIheB4xscZ+2+UM3t2XlQMUpnbFy2QNPU2svX+V76pez/NCO9V5nJBKUeh4L8bjF3CCbWu5xIOOUxBnvLC51ZBFBCEpk05e1zevMVXlZI5tOgN+AJrWmENWL+X89OXhgh+6xwykXI549lgwtqxSRSafO39xl/dUeFzXUqMFhnbibOFSGlUtd0fs4udHSZyeO3AcvPKr/64BQHCBA2J923csTPRsQgRcs78jO26ZsbjqcqpRTaBxl0RDI+zUXs0bdlmfkYm8FXHRhkN26WSwV2hLQhx5R2fHr3LeiUoG1svLvSQTZTQqMS2Ws4OOCHju1Y+xX0FyNgg5JcYZCAlidcsYqAxZKHyA8P2yg6bl6xlV56DLkN+akbEpZMLbP+UeOS/nOef1nLfwy1dOGpogEIziZvrep8T1pHrTAPkX+T3JiKcsa3stKIxN3p6RDzaLm47rgapAV+5w+T8MtYTWTyeU5kBDj9Lj1N4DGU7x5IVYBTnYf2wcIH7sXLYteFtEjPeOZkEuYcF4FYu8NBf2F73kAzLXep/wf6hfsA6knq3cOw2EHHnOZ/mm2Zv360E2SQm6kK48+JAlVtH/3UVaIggvkswaiS0WFzge6Z2veyrU7OCBZHaW4yQ7xwTTfGD3sRAP8S3rq+vf8VJJ5OJAFcZUdnLxkvbcS8EMF/YfiayuqZr1wMAgsKIwX2ETnWE5cGJoOJXgse0Np2SRQhR677ZatPcMhkI6vg1TZFobut9VpWfTKjzwR56w3GBohpe3MXIREPtoMyvKxcNJ6wX2fbCdi5SaYsQw4bXXAF+K2WpcImD1mPufrfFzdqjajRjBDv4EkzPgUcD1ntGdeqAfBNLXnyspYeFUz12sVXhqeUib5uv1hZ96PTchOcAWzMsi07Xs3+Wo9IGv9WFszRjbBU4grOLF1PKilYTWFfudg8u0c28+zTntRES2z6WEIJ0gpUpzNAOXQ/eMnnUbruxKYlyphWU0FDDgHcdudiBQFYptl1cmwY+tKMGNhq1M5lv13BH8PQyOAhx5OPZajF2eNeIp13jZANN50ON51ngxYsi281FPYBhtBJLzGp3CGhCCtnS93auyGyveOzq77QrNR6Nff2YPtuq8NsY79JDx+4yrm/lrkBofiDDWBHsSduL/sup8qIgdM2M4ie8RZYURjBYswgkrHcmQMsiA/LGvGUsBhopQ5FSdrOCVhtbDtYEgJ6gWntV3jMb95JllIDeVcFv1c2DJE3u4lc1D1lOFvmy7ZPhy5EAc9ZoQtOHConeEGpu126786k2xRRyFkv6eADDHu1IG7W7sawBbc0RXHG4iuE1R7Tfo41tI+vhyF88cCpxCd4ZWvcaA9nOIzvN4slkfD5e/CV1MyaEzC+5kC9EIH0q82xIjdbjNkMTtt6HSEEdjYZtwzWn7x66lF6L8m+GBXeGrB3IkUTo3Qfns1AlcbTRb6PF8/IDcf6mw0bmrcpwbjORObkCueGBlDkKynqgjJETrewHtZXtQlvSi2KznyIDn8pwQEgcNCA8SAmzEjyTug89g4y7GXxTbIZY/GHN2A3j2hCWcK5ZJfzQnwWRxfbKpuFuY81ui/pnrgMhajnBEbti73Myzz3c5mwFDsBHSE6CVIr1P7CcWPtk+A3dtmTaGjKDhndfiErcuR6OKYexPt22FbZjyrs7YtY5z2TkXbX8+h8DgTBT2jHK9Z//uJUxBcTpf53gT1OkUH81Q8EiTBG2Dr+quQO/xVyP38KrnNkln/IphZtSxBxaKWYzXyYe5O+fW88pSHp4vgNJ2bWNlZKzVO3YdHxp5qRAzJWU8A1OvoUdsmXrsFCFaeCDhiz8KbVt7LiVDJFM28bR/6Hb2+77DH/+sdC0ShOjst3sPQhqM5T3YuyHq13GNJk88pBOr4dBf/meNoc0PDPs2YFovRXr4tAz/PGSgl2rs1HqI/JOyUTOLun1EkOfqjWkz5oyDmAa0TF2LLe3Z4D09gHNgMunvMbzHBO39lIkQonAoFubodjjEdC7G1F9KP4Tl9xV5h9Jllae8ZXAlrOMy12nj3lHNeawrou6/051v9zF0yyxK22ZbtyTU/eP9qSfsbavv1Ih4efANpwYaGU0YUU77Kya7/OukgKP/UmsbegJN4tE3+AKWFCPoAMcrSBDsOUQLYaI+wFrb/NZsZIF44NEgPobm5Nwwh2ERtQfB90hvJKpIh6XM2Auhtu+VQ9Dqi5drnCMtWA1SVOZ+9zoiEW/yeW8D0fCYXfck9NdE3XnsK30JUNvmE+zyXOScWDabfHRWXCAjvL2nP7jqELq/yO19aLIXj4KztfmsMmNhXrE/sKEZr/d7T7/ZB0NobzQX8KQ+qSOGQPKs3xxlNSGZd1fqNG+RC1NhYMQ1KeV15DOdJW9jqgKN+Y/zl1BzDh0yZvC6/p5Zopm6aOqdgZg2DdXT6Cbip6v0eZrwWzWl9+BikBzSGfasqHfNZ/zoLmblCLu2ZF2n2mY1iQ0L5zpyINvNptUrNAlR5RP33euBfOXC1s8m2xAkQOEm1Q3y34y6GU2LMKJ3Wx/GaFuOqTLgVi8Kso7BGz7mbt6P0pKvO0nc+42k6ZRmkgoQNJ3vZ9wFdUy43NDqeautqQa/zpQIZWE7PeJzNdSuwLNTm6rPRu5/uyUnsPwfmYIMNAs3C5FcsZKnjbwrkkSlOUUTSOuuUyJQPVJl6zbXWDjKt/VyOqvRUkbdxStypsnF2d7h/Shc6C0yxNFVJiAi1srMrgc5oYEskXg8bLk9RT6siqHf0vCPg0EYfBud0ldeO3+lo82qZOOuGTyDcQN7THJiU9yDZVQHZYfPeccHiwxYAd9Ov51zod4yF7cG4nNEfs4MYiw8tcNTFuk/6c+d9OTfFSodgPW50TqCeYMmTw+RwLTlIOJ6FyUeJ1INCTOdoz56WApA8TqwMoOfruIMODXpMgxN9ul0hliA4gGzHLD8rZ8a/PtxgY49P9YHtHJIKNb1COwMmiCHZ0U2NFTbfz5ecCdwdKhBO1RiECAJrLCMOdlPnRFs1bjblNi6n/KVkOW+wIQajCGUPp6W/nSjz3fs37yM6e83sgmWlvdmpiXJBemgYDgoQxd41PV1yaPUw0HeDqiUY/DjUw35Ne7Fv2xFhhHBDuzKT5ZvNVji06sJFttVZYTlLynw+oaUa9sycOP0VooVaNo6YxTlTqQjwGyn1rdPoiaAFni6nGT1Plg7ZEWdnRP1Hb9fpYC3OYWRbX3vOYrFOcsJV7dG7z/hVZ1xc1d5jjKR12xQ7RhGs8QnjN0fRygQznHbfm/i0xfxzwB6eAruzUedXuILwU80sVSOqc2I5rGP9zfi3CqBZ3eLMTYcZsSOYINZuSYZj2/kJGAU7Oon93VkBr32GxBu8rgoV3o2a0aLV1jQllIzdYK8DX39FqslBn56vfMD2nyjyN6mp1lZMnWs6K3sWa4QCXGE4Y+84rKOluQ9J6LJ4yR6U+F5/cd3wF9cNp6g7GEu3pc2B5YaMFHRfybZ6OgdfXk4IqR4HOEnJc9rnNJrtvz1qOLMASck6nzG+noaBP2GCi7cl9wknQnCjfdiM6lA2ddRR2XjaZwHtcM6zpU4O4e+eHRXrAIaZbGfnEJyCD66YjrjAOMs5KryHln7F10QPUOYRjUL1tDgi+Ilcdl9YO7s8+7yd8DpOv1E3lXom/R/2/qT3fi6LUV/F0amPA6jgN05yspgBXzmNBe5nrQJkgLQb69g41nY+SnsnFaD7H7vU333YCK5GFCHyOvPd86KTQ3NkyilJWfLvjhTelou0DW05o74NY/auOzhhqnXbPy0J0BCxHlN9LIZwRrAi6j//5qt/u+r1H33VvL0CzaG8++SCSnFuxApWdhVLxfYpH5oYwOPDPL6LqFp9hAzQevt0BADjFyEAmV+BXV+89Z8Cu+efCuwghrzaw0r03nPZomwptiVD0yHVnhme9nun9pxh3PzzFMliQeuMD7CQhb3BQ48nGqR4I0+xjXTs8NvntIXp1Gu5nKel0Z4FDDv1dfjRGc6tsVpHVLyJkx29go2A40/FRWM19uSSz8iEU8NuYTuOGIJkzGagv+q2zrSE6PT7bDf85ZEMtMdzy1eZY+PvyW0B0O+ZB1fu02p6plnAZ8KZ3gKZIZpYC3vGV5ZuVb1JMOuDPK502jZB1qZ1Dyn6OfkPjpj3ASOWHFno7fgyttEBpY7FthXuGvshAOGEKoWjtZ0daxi95T/bh57onZb8PMtJq7OEfvLDy6QpdNteW2iNBV4OJyGKnZTaKZ7uhpHRDYvJ8fNEHsUOMGnLNwzT6enoJbRJRq+hhC/CcDYb91g24kwWz8x9BojHjdEkrhjrsyXObM38/OPwqYQf1TBRli52CeYDlDtrn6id7Sh2ku9mKZrPzPE5NK9JMBPa/GiyMNPZDCxemL98RJ7XNkl3Hi9holz1Z2Ob1U4o42QQLlZHWElxSkQsLLMMoFhTEb6yZNWl1svWaYcBYBeYIz8DGUVlnZY2kHw6f8xMQpz2DlsL+6rYCJj9TDVPsI8WZ7sc+usxcDzFvXzASwwcwdqaU16pj3/2rLHf1mv62AwMxEdtZGcZbNiyQ9YuW1p91hTqKp8zfqcxoDnsiHH4DhDsYCd0nCX3zRNUwRSa6xCO96vwq+O00VNiK5Gc7n+mR3ynFNga0WG5JhoeaLba1tFu0BwwCO4C70ScVJzFeaPL7lWIFfQAgiKyNADEyftPP8PZbS1LmFUG5HV7K9A9UzLnSCgFH30ahM9hcYqePQVOrDdRfqYYhx53Scmic5/jFqyuQ+zuchoBntOjgQUrqWN2znzwQSW2d8Q5e7LU0FrsVk+d+a44/mc22IIGgp3CWHVoS+dZY3ubMKJkEttK3+BQdscwDycWTQdamJ04c+mE4FN8Yl33r/78N13UeWtQDidIgHbw1itExzA7fRLp2k0e8lbWE9vmZDP8mX3sE6DaM37S/gnnzD6efn24puOpncgEdz3FmGbsqrXHFi1bPWsRST6GM+qIITsM54xaQ+yXREizTKzGfWYkXsniJMcTffqyT7RTCJ+R3OWM3PTBaZL84CNp5kk5E/DzkIeokblk+Nu+qt0vJ0C0+qu7ue3XweiqI6ZWPLVLgL0qwJ6b83SJgdTtZ1iduREgKV1cZbbdlqt3qJuHkX7YdHrC4u186FtzKs8+T7dyQfZ3hjq/ljnPM9q/fuWaXBqeA2OzXmP4hDdn4Sjr7jPl0o6uc+s/6zkjXqv0zokQnxPEh0ddV/B06k8W0v6DCdXArn10i4McCKo+LAcHggwKsftksdkBZ7xFCywtjXYqg0lTm4zQL2H+ynIR3tYsGSeq2a9n2ifinhf4n6TZCt1lH3HkxruDFy6Crn0n77R86JXTHN1bfdgK9PG88fQJVnbGnHwtUdfBiVYMYGr2ny6M8TI/3M5jyRxOPXL7HV/uWHwknfONisH2nEA6ni90hxhv4HlMZwTP4TWdGq0ONJ5SDPEOLz1d6Rl2e0p1sbi+vYdXa382UTfu33MuHNZ+RvI7lPP6fPiik9kdyLata3AoxDwjGIfVVaDPjPxAMTYjw07lqU99ajbhWIsg07kvR26huU+28/apdfF9nsMd7a1p5/LieeyFrbj2XjqJHFMMfEqPxSeC8TnACIHcEU2fD5GBx3b4ulrwASK2AwrMdlXibHW03mv6ujjx2PPed57DGsDFZ2bmM1LW2BPWeRCV3V8EZDPFk4UD4j7LfjESK9vXmfUIWgXbmt8jCiHMiONKdNR77Iwc+0ho2wjPcfV9tingxJAbB1mF7BxNB05DR6zmYdl+8/KvlePfD1NzhmP0URTLvoMENyWIYZYpezJjJbv90s2UDNt7HuvXPII5sw/FplJ8UEtTLxvhffgMZO0cXfkcDB9lYP4DmWYObgen9hSf1QRJIJI9UrELC7R6MMiOJkD82ORbsbZYun+w9PImp5Y5xh3+bJfItIjAjEIzz+WzEi40dXZUm+1PrKm6uGlw9gOO81inZppGGVaIlc68doDEafQyZxKR/45auIbq8nO+Zv8T8OGz7UwOd4oGrsPlqIHRi9za5wPAbHL5RVjbYrPDMZNnRx5+Pg54Duvb1ur+NYiaO4PgO2zicaTKe5qDErR7HPn81wRqO+X3BfZxi0LVeZ4YKsDD0sN5+iOJY/s/adIZfrSeWrDN/Hi43yQ2CM1eULmXc+bGeTJaRH5AlKJZtTd/ypPnc+SgA5FZdzWE5zjJuZ+3j1PJPp+NrcHeyuUD6+A3p9PNg2Bnb+d+yrwCQYT1gbXW9wyteE9bfYs9Q7XrmUMr5CGEarxqPtMjfKaAo7PfDiLbQdSQbPE8jsYOOgusLL6xPKU46dI+7iM5H7PPcI/rgVQTGtqZHmGL2pJmODAfGx1vzD4KtgPFuI5nIXb3EYpMWZswiBbI2kd4fZjqGwlEzltoAB6gcMoePwkMFM8nohBLlTs+Q0O1eC4QhhxtSq4LPH3vy8k9n3OuRmksU+o+JsKBBDbR3KdfR9T2iGsc3DVBVA1EJdiTi309G/pwzXkm8vv8mdcbXLK20Xxw3/H/I3bP/JTqE5kgxLndmLbAe08HXPZh9cKFHPqX2SqOVoEp3J58F+TvL0uSHB9tBm5gZuyEFaw+vdCH4N0Q1vu9Tpj6/gdyES/ktaPagWEWc/ikxt/DezyOvHBKbe4M6oYFIQeyFN9anWjBmn1J4Kq9KxJTnzZlGPBpdfcZZh/sby8VF7Epqpvk49oz0djHQ+b8G4Vst2fcTsi1inGY2ipnbJ9z24cVaiYZFOTX9pkhFt1ZQWMqZqCxPqepeXIOfHv+Fx2s49AyHz3jA/qGAppIkh+POqZjQlQA1j044d2h4DU8Z5yahV9h/5njiaVPWwp9ZgirpHKDvJb35DjYW7zvgj+91aLV35Mc4ZUPxq7+U4vE32yHE1msm0AdqAK4SLOHzSocpxcDFwRIVemvoq6d4Z/WHmGvpUHi8eNi0TCrZVLS3Pr3Y08OxrBsS4SyT/WyXcvhwvbU7XqeeJU805d4+qS05QShfC7PEspNDLc2pJ5843Yccc3s8wPPvi3/sX7dSleX8LOI5T0PunS2jEN0/i6zQpI4SMJmBkt2EOfWTcz+XoSg00xwjne+8/zV03TkdLXto6lUKAvlxYJ6MmsPtpnYiBaAJTWPFZ6IqMFVHID+i+ygjzXV9ykFJ7Sb631M4Dns/i2OqHtQe5CWGIv06R8/e/2nH/ZRNf3Ikn95fM1/82da8GwfhAdgWZa3ziMkfvXSU4X+Oyzj7bvludDW79TfoXaSdNeBs0oOIPkixqZz4qqGdpPPSOgzrvw3eCoZPnw6kddpS7EV+2sgbOtjIVobT/KRYM3ZAk9MQwli98N50uFaDhXwIWjTngDzXzJdl93HjFr8Uc5jFv+Ox9c/AvKS5n9W1t9W0TrAe1ky/edo4u9ZO47fhPZLlmvXHiC8Y1zO8nf04z61QKwKBtROX64dCp8eOXyIy3lC7xnXfftMTJDjz/gtoiV76hOY4ueTcAw1fz8pygKt2ycH+CgFRzeV4HG0SZTu2fSWvNsy+P1drH39S7X2vxdrdxbTRlUHijpB1tOT8nuWMOIbYFqH5rZgq7DT+IFGsdCHNHQfdmojpofGyfHD6fTJ164+Ra85e9nxrtb04UYWhYu7l7kri1J9WNY/1YU77cpqKCcJuy2nOr2YGfaTfLCD+Unz/dta/hYd7FbFrXc4/TgFOb1NHOM3OOf7pV1c+4Vy/7tVOzkwyuff/FXZzxoRAolRsTmPXzI0HUEC1J/kSHJom0U4Ox9T9sAciE4+dTX6vPsWnTfArfET87FZfoM69jPUX/1V8XGGFioTlT3gO73dPh3bikBCOO/rTGcuTX6ZBiQi2V/qfFhsOZ3yLiI+JKgHH9DtNCFFmeOwWT1ngRKaAaO3mGtzpNBtdftFRIHLToM579dQwT5KxNR9PlVdYrRPkYTvcM8Aig8HD+fhvB68NI+2HHl7EUm76Zwb6pKtGtp/gFTk+6M+HGWoF4/TCPT4OBkJqrVkPjG8Sm0u7uWDReyPwIvC56sjvH9auWyCWVaqxMbCWD4ZPcneLmLHgc9cBtyzYyaX8wA3K1llyMWK/feM/XZG3vQxJQ0q5zG5D9o9NYrBB0cHxfw9zrgKrrYAI/wUweG9o7179pqH7/cgt26Fgg+LYgeSmarT4dusCfehzPUM2sa9JKg5Xn375NLjGejUc5zzaIhVIuegl34SCdzVGcxi1apx9id4f+0+zbEIBMj7eJMzTcTAU5+DJETencejFu7lf/Ln9d+8wFM1B7ni5oBwsPvYgdwH6Ryxf5DuExJgmhesv0VHf3lQ5jM/PLBwjv8PtNtfjau3nTUpTZDyl4Xi0tM+B0nzjgMYKcRpQPCJXT1yPuh1khYk0ScANccrlqP/2qm16mCOwxvu9qvX8HEBUIoL4uIsOIsb62mDs5rmPWMdw29SxfdXIMGwLEN4zTdmc1BOQ3BACfb5XLArC5VRs+sM5vuvPm/qrxSHu0LHIeQAlENKxm3pezrUIe/7ctiCS+BTM7pVZvUBJ0xU/SR39ODtFGc5YdU6237ae+GHy4Rn83axscv+eiiETeV5nQe5DZurCXDDEWdOD1ED53Ofzl6F3TojMFUfg4XespUBoXZBOn2cNWTYvLWNbs5/s/ljOoeZgLHMM5vc8Am71WdzRsd+OzLkWHf1WH9fdpJq3Gc+uomo1eyEr9avSX7YxsfWOUQ7FMQnIJ6pgNuKco/2n/lLEVy/HMEpB+lGigXYrnDGVvzPbRu9crH69/X/AKE121sLdR/BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw0AcxV9TtVIrDnYQcchQdbEgKuIoVSyChdJWaNXB5NIPoUlDkuLiKLgWHPxYrDq4OOvq4CoIgh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTDU7xgFVs4xUPCZmcyti4BVd6EEQoxAkZuqJ9EIGnuPrHj6+3kV5lve5P0evkjcZ4BOJZ5luWMTrxNObls55nzjMSpJCfE48ZtAFiR+5Lrv8xrnosMAzw0YmNUccJhaLbSy3MSsZKvEUcURRNcoXsi4rnLc4q+Uqa96TvzCU15bTXKc5hDgWkUASImRUsYEyLERp1UgxkaL9mId/0PEnySWTawOMHPOoQIXk+MH/4He3ZmFywk0KxYDOF9v+GAYCu0CjZtvfx7bdOAH8z8CV1vJX6sDMJ+m1lhY5Avq2gYvrlibvAZc7wMCTLhmSI/lpCoUC8H5G35QD+m+B4KrbW3Mfpw9AhrpaugEODoGRImWveby7u723f880+/sBOVpykBnlZIYAAAAGYktHRACYAK8Av5HPY+4AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmBgsKOyKwzQuUAAAWH0lEQVR42u1dTWhV1xbe15wiwYHBkMQoiDTE0gYUagm2GQm2ESzaFjNwYNtRaHVQSWK06bgxxljsoFoctXXgQLGtVDCvBUe1EhpBIa+8hJRQqIlXlHQQQuiN9w3iuu67715rffucE/PnHtme3PP3fXv9fGvtfTJmBY+ej17P07+Pf/1bZiW+g8xKB94dK40IK+ph2/duKQK+akNl4d8P7j0s+tvTV4czzwmwTMYnb76Yj8oj77HcdM5wx1YCETIrAXz6twt0bjpnkGPGGPPlz39mnhNgiQKf5lhuRMisJNAP7ny16L8v3Lhd+Hf1mtUlf5+dmln2RFgWD0HBnWu2bXCbGxu8x7Yf6jbdH+7zHqPf2ERZbkTILAfgfYEdN6sJ1O2HukuOERE4sixHIizJm5YCOzu9m52YLDnW2btn7nfVraUnXltf+OfgiZaiQ/0DQ6xrsO9hqWUNmaUKvDtq62rY381OTBaAd0dU3VoEfIlVePcV9tijx7NLPn1cEjf573BHEfAdh69AwLtWwCVBkRVwSJAbOVr0372d1wr/LltfUXTMFZGWEhEySw18mwTarOdGZ+8evwt4QgQXfJsELvgICRYzERYtAfL5fJ6bjae/+JX9nQvEulVlrMnu++6nov8+efyDpwFmW1PRseMdV0tiDBrjo/cNF5PY1zfGmM9++CPznADM+L17f377p5fY4yc/fgMG3s0KJLnXBTTkvNLwZSGLjQiZxQJ8SX5uESHEAtig+QCyieAet12KPavd37mzWhKMbCL4AtEXtvQtKAarFjqq5yL7wRMt5shbdV5/3N7WpM5MbnbmpnNm3aoy7/FdmzaaXZs2loBPvzuwY2sJ+ASwqzK62QKXMfw73JHPTw7nV5QF4ECnl+gTXPq+eq/EF7sm3AecZo6zUzMseHQfvuOkC0iiEed2evr2slpEpmJLZtkSwI7o7VTOBth3zAXQnU2SL7bBs8Uc1yTfuTwWRIBt+zezv6NjPsLa93rm0vXizOb9t5951pB51sCHjI7DV8RASvK9kkm2AfJdUzon99s7l8din3ch+xEyCwl+VH/KG+S5M8udubYY4zP7ZE18s5NqALnsefGarhuyA0Q3RdSehYJW370SwX0xgh1vzFfWkFlI4EsCrZGjXtBo/PLX3+yx8dH7RW7EBdZX/CEixL1me1uT+CxctjI+ep+1bI8ez3oDzfkiQuoEsBsu3ZkiSa/mn5HiLOBsF2sBXDUOlnuFYV9PswDGGHOs51voWWxxybUCLgncgNJ+bvfYa12XM4uGAFKXbcnLChgnj38gSrrS6Prmx1i/O9KyW8wk5uO8WrwiWaikRMjMJ/ASEdyZIR1zZzlnAXxCC2p1XAtgWwGfubaJ4MYT9jXtyF7LAux78AWURATfsbiCUqwfUR7PFWPGR+/HOkbijk+aJZB9xRj6HeXXviDs2Lmb3mPd777C5vLk/7XCEndNTqzKTedKwPfFJhyZfcco3QzNGjJxgHdHbV0NK8IQ2L7jdIx7UVUbKtmXX7a+gv0dEYELwo6du+mt8xMRuMBPIwJ3PUmaRojAxTG57HmvMBZCBOiPbFPvAmn7L5+CJ6l7Uh58YMdWNgi0Z+zFW3e9M4yzUFIQxpV6jZmTiZH78ZFHUijp/XizFNtlCUGy+w5sC6qtdMqEgO8+kCShavKqRAQbfPel+8w1vQBOEZQsFJEABR+5HyKCBDz3/gpE8HUpPSGBL16hd8BVNjkiRFou7zNrkjq3bf9mVia1j0nKmBTV+x6eTD4nIc9OTJrqNau9yiEJMFWC6TYeApDv56Tgbcb/nNK7s/17tPYUFBf4Zn1qMYAt5pz+4lfWBzY3NogyqDQ6Dl9hpdADO7ayAs7g2S7xmnYLlzuyUzPsNas2VLKxxYEdW2NLwdL9SO8vqj/FdijduTwmClWIBYAJQEyX/J+borjBi8tge3a4gNgRvSTmuOd0ZyTazeu6EKmzRxKbQu7HdT2ucGZbX+kYkjGlRgBkcLNWE0Wi8ohN5TQi+FyD/dK1pg1J/IkjNnV/uI+ND6RMQ0qTteFa6MQEyE8O54nRHJPth9SA54jgM8dFFsDV262IWCrq+IpINhGkpWLuMcmS2Kmcb5WRtMIISZN9qbLt8ylIlaxLbAJwM8y9GDsbKJp10hj7nL5Ujh6SE3A69r3EWgtyLdzs7ezdI9bxOWsnWZLauhoxRuIIQPcoWSguXun77ie1ZkLE4lYuwQRwLYF7MfsBzly6zi+2+GeENddSKkNE6Nj3UlAWQC+ZU+yk4E2yJPTMnLmenZgUu4WkDiWNCHY3M0eA5saGIsJxBIhC/YxWnCDTfuY/o8G+UUplfMDbMqjUFST5Yilyp2McAeKOgztfZc8ptsX9+D+vJUWfNRULYM8OyS8WrMETIsSRXn2+j1P9UKElbrpKqZzkAnyBmAYK0ltYNJkYRdA3MRNbgO4P94mRLt20NEOOvFWnqoKaZCu1TIVG7lJBRUvnJF9ORPU1c0ixhSRw9Q8MsZY0hNC1dTXG/PxnuAX4/J2X81zuK7FNmolaICXJpxIRctM5FvjmxgaxIyhueil1/q5bVSbGHZLAZU+oru//y2ZALlFdTGzLGksK5gDXWBeVR6xpJtXLDdgKJHmS0kgpmZs10LWyUzNsl83g2S7vS9c6hug3XMeQu+rIjmNOf/Grtytq+yE5LdbkYm1IljVxEEhkkAo+9mzliCA1bnL+25ZkOatD1sX3ewIxVK+g3+Sy572ZhlR9JMVO6oqSuoW4mS8BHzJEApStrxBr4FLfvE2Ei7fueit8cQeZSDeHtmeOL7giy1UouEjdQtZLt80sEddHBHJfvg5i3zUl9xICfIhKG2wBpDKpTQTNf5PZjksEAs9XVJFiAyKCzx9TRzC3INWOsEMEnPHR+6ysrXUhh6Rz6LmkAa8NvHDjtmpiEJ/DqX5opOsCaffTS2vwejuvlZCHXt7giZaSLWHs/3Zfsn0e119H5VGBkMc7rhZ17Ny5PKYCVltXo4Kfy54XS8MoFrFiAIQEsxOT4vYp9AK5KNm+lq/Xn6Rcjkx0bV9KRps8+Jo8Bk+0mF/++tt7jK7HLQ6VSsyImUYAO9Kym137EAp8oiDQvhBn9ulFaUTQ2E6+1hc0kjtBiOC6MkqRCGw7ZXKP2ed3yWW7ALecLFU2XfepAZ/GeYIJ4AtqQhmHEAEZtE7QRxh68b4ZmJvOmazJGcOUWaWUiY75zht3XWJIxH7x1l1z4cbuxOdpb2syx7/+Lb4FoKBGkl19M8lHBPTFcC/Rju7dh9d27LAJ7VouKYC1CRYqPccZWpyEttP51jAmcgFabk9E2NbWpLZkaYKHllmQTHrkrTr4/osA2rRRFJukpWFas+d8jag8UsG39QYtUIwdA0Tlkdm1aaNYxKEATyOCphFosQZp5RIRONdBy719ARoRwveM2j35At7QKh2a5tr3FGcJXpSEkZrZtyN2qWCEaAS1dTVm16aN7HnsrhyfpOoKQ3Zq6SvWSN01CPAXb91Vy8gasD19e9mFH3Gj/tg6AEKEpMIGohEg5zlz6TrrXvoHhthaxrb9m03/wJAXuNmJSTM+el8F/+Ktu+pzXLx1FwI/DcuQmgXQonlpVy8XPKkiiMQZCAl8pWr6f75FliTRdn3zVKrldhHn7hsBXhvHzt1k3x8MPMna2XmwAOtWlakRfVTdqlbZqtesluv2CLv/GYE7ZHykISJw94oQzVb+tFhHA57rf7R1D/Faa+vFfY9TjQG0BsriF9sFpVixB1AwkWIAt1ADFWmAe0Zb0RHg0cg/VReAmGOkI4WrqYcSIWlBiYhQtr6isHSr6B5SKK4UqYQml8w/V7eaAzv4+6naUKmCr6WNEcp0X7OFdxYKJoiI0D+wL9GLISJwjRWIhaI6PSKWcMJTqNglrTyy36PmPpF1gLmRo5BgFBQDZKdmdLMGmOPmxgbIv2qm8UjLblUn37Z/s3gtbdtZ5F61uKh6zWpVpUTimf6BIRX83MhRNYhMnAZmp2aCV/fGDbKQ4OhIy25V9UJJZxNHc28I8Fp7V0/fXgh4TVMYPNsVBDxEAC0X7Th8BSICIkkmtQbodTQSIMDX1tWoAgxCNiTXR9YkaEGr2LGF3qQEdMfhK+bgzjGx187bhhWoftkvjPsbhAS+KqfULh6iuqFWRgMfyURmJybFv0OKU3DuhejfSNNlLnteXV2EzAwiCudbpR21XCJopES6bLn1hiGDW4jrgq4NmqypEiCECMhsJ2DEyBrILLRcHOlg1n4rDa2rCckgEKtFtQiJAHHistjqC6IRIA+GrI5FMgu3c4ibxSjw2qCydxJ3gFgppCk3ydrFSBMiNCDTKEjYREh6P4j546yYtqkDUvSy3R/nn6vXrFZJpm36ROTQwC/UaLoyCYSg6lbT3ibnzfYMS7IAE5kVT13LVdVvI0TQij7QChthxU8IyaU9k0KsQt9X77EbWSdyAaScSXVqresXAXlu3b68bk9rCiUiaGsWtN8iVklLLbWZivjv2YlJFXytazgVIYhEEG1I3UAEsqYsIj3wSG0gtHECiRlQ8NH4RQJei/4fPZ4NBj9REGiTAGn9ll4E0iNYWMXDpJjS18BCSIAAX/CrQnBK6W6S4K2nb686iZBua0khTCWCW7eqzJTVVYpmFjH72akZ0z8wJAZiiNYQlUemakNlkNkvmFbhN9I3DdGsh8gugY/oIAUNQ1oyD0jDqS4Pl3bJCMnL6eVIZKF19BJZULOv+VUk+keBT+qmEFKHVDpjLw9vbmwQN0/STDpiarXcHs2BqWbu+w6BpnUkBR/RFBDgKaCW4gWtshlMAG5TBVfo0IiQVFBCcnvKl6U9hRAiwK1oKYBP76cWAF4acfcJhiwAUpQga8CZUm0jJPvFS40nSEcQ8jLINNozBvGpKPAI6bXJgYheyPOm0hGEgqilKnQObYmV9nKICFIqisx2IoL2kpBUDlqFA1iXY+dupka01DuCCETN72pfwUBfhuYby9ZXqAHcsZ5vgztl0wZf2kzKBl7reUijXzG1NFCTWokEUssWpWuS30aqj7SVjUgGYcvauEIXArw2qtesTgX4B/cexooFoiQg23/D+e0zl66bXPa8KGggAVxtXc3cMmdBgpY+LFVEhGx84LUve6GAoTuBaefSNtLUrG0UMtulm9YyAjua5UCkj0RJMQCJJBoRtAwmjj89uHMs8Uwlssf9HmJosJmqC0Dy++bGBnXzRa2Ig8wOkkml2V5QDRUFL2kghawAhsxzSsHfvMcAtEt20q6gAzu2iiuLyTee/PiN2JmHMU8lUaQ8GqJhaDp9mrqCFnijG3AEEUBL19D2MO17OlBqZGRt27YEHCkQbRwBHnGJ/QNDKvhIA2kawEsYRiiDNSJoujxSDLJFJUkc0SJw6pTh7scnMSPPiUT1aHsWshVcUsuiLkYJ0QGQXnhEI9A2i0BnBlKLR5owkA4cdAVwGt8VGDzblQr4aJAZuysYCZyQIg4XxDU3Nsz5RkHEQbah6R8YYvcbRJ5VS7MQl6HFOm56KV1LAz80u4jdEdTe1qSWG5GVQ2q3C7BmrrN3j1omRVcxodautq5GBf/Ajq1qt9KFG7dV8JE1mZ29e2KllhGSs0qzgEggzUJ340WRudzfAJEysq/hXD7/qtef9/TtVUuqIaVbSRdA4gmkZQ6pFiZ2AVUbKk17W5P4cpCvhyBfuUTUR4QIUXkkRsj2t3mQDhzqekoKhjZLEWLYH43i4gVkOXtwDOAro8a5MOK7584hq3laZoH0y2lEQ9IsqntIwVsawCNbwYVuRxdLCGpvaxK/aYuOzt49JqpuFfvykR5ATYKV9vhP4tqQqqeWGdTW1aSyC3tU3WqaG8eejRJY+PETZU0jglapog8naUTYtn8zlP5pRIjqT5VsD+8CnzTK1tJdtEM5jXUJUuaQyj6BUf0ptfDy4N5DNaXq+uZH9YGRdQLIcOsDyM5mCPjINwGkL7GFuASkz0HVONAXhih5RAJph+sH9x6aqLo18Tr8XPa8qPYhGQzS348GuMgGUwjwXIYSArq0y3liF0APuf1TPSgSm0EA04VkBJqPrdpQ6f16F/qsSSVbO9ZJEowi95/6R6PEAazdJyJ0vP+2zmhhFtKDJSko2ZnLsXMYyTWroIGPpIXtbU3i9RDgQ3Y0TTUIRAUaaDNIwLShBSX1foTysAa+ZhFsrcO3FyEKLGK+B0+0QBYwFQJoLdn2bODMHVKdQrQGtEdOewEFIoDuSDLTHYev6LGLTfIs79I08LkMxiUQ0oQSbAGQTRq13J1atSVRg0yj5NeQDqW4zZKoX0W0hai6VbVwSCVxbqHtWGLLkYoLQDp+tCLHyeMfFEQlLTjSiKA1r4QODRCqMibN0ZHyONJ5hFQKg3UA7oPDoVGw1uOH7G6ppkcGq9trsxbpaUBmK9Kti7gyDXykUijhqL4t+nH73i15LQeWgjNkM6jcyFH1POjnatetKhNrAW7PAlKPTwN4IroGvtY9jKR8yASGbcbpq8OFk3FkQPvhx5lPuIWcB9n6BSnkIO3eyLJ3DfyQfkTp3SDA21jNSwxw+upw5vTVPvPvcEdemilSyoSsc0fOQy8LMbmhg7qfkwwKeKW0D+kqQv4mBPhUdIAXtvRljDEqEUQz9WSBh1STR85DNXJRdAJBR4a6+eN0Tt2PAJnNyP18+fOfmbjPm8oWMUSE37v3e4kgfcvXJUJuOsf6d6Rzl4ggqWO+8yBgQF/0BjIRaYvbkCAyCfCpEoDGa12XM8YY8/k7L4tEOHPpulgn0PrukUgfaTqh82jgk/mWYhPtmWySa5mMBH4aoM8bAWh89sMfIhHohWkmWxN6ENWws3ePuoRMii80yRZpChkfva+Cr5E6beAhHSAtIkgD6cfT/GB7W5OqtCF77fmCyzTA17KihQJ/3iyAjwSSjoCs+KWIXPSNQGVxdmLS5KZz7EvXgEdXHFO6G1ccixvVLzoC+B6mz5g8R4TezmvijEcaPczaehMZuenErVCqnTP1p8z2QyMq6KjFk2KTZwH8MyeAPTIVWzLGGJOfHM5LL1IjQm/nNbHm/lSLvyYSQdxAAVhRjKiIiKt7lsAvKAFcInA6ApL20Uzq+v6Umr6FrN1DGjEQ4JGW8YUAflEQABWU0OaIgp9mNoQgIkhpHwI8UgB79HhWDRKRIHlFEMAlApc+2n5fqvFTpwzShImcLxR45BkXy1hUBAjJHB7ce2hy0zkx8CI1UFPwVPDBHTwk8Bcb8M9EB0gzc4irEWgmXx0pfNSRYp3nBIhJAo0I2akZFeQLN24HfzhKkn6RTp5MxZbMYgZ/0boAzRpwrgHd11BqH9N6EZBehYWM6pctAXwv+JM3XxSJIMUHSIrpBoAa+EsJ+CVNABqkkXNECNmuPknkvxjSuRVJAJQIobPdmKft71J/4lIGflkRIJQI0gbV0ifojHna87BcxrIiAEoEO/dHewkXax6/7NPANIggDUQBXK7gG2NMxqyQYaeOEui2RViKUf1zAgCj56PXRYl5JQC/ognAEQFZSbPcxv8B+01098MLdAAAAAAASUVORK5CYII=\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"none\",destroy_time:.4,explosion_resistance:0,friction:.4,flammable:!1,light_emission:15,light_dampening:15,face_dimming:!1,ambient_occlusion:!1,map_color:\"#ffcd17\"},flower:{name:\"Flower\",sound:\"grass\",model_type:\"cross\",thumbnail:\"data:image/png;base64,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\",collision:\"none\",selection_box:\"small\",mineable:!0,explodable:!0,destroy_tool:\"none\",destroy_time:0,explosion_resistance:0,friction:.4,flammable:!1,light_emission:0,light_dampening:0,face_dimming:!1,on_liquid_touches:\"popped\",ambient_occlusion:!1,map_color:\"#32a852\",random_offset_range:5},leaves:{name:\"Leaves\",note:\"No automatic decay\",sound:\"grass\",model_type:\"leaves\",thumbnail:\"data:image/png;base64,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\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"shears\",destroy_time:.18,explosion_resistance:1,friction:.4,flammable:!0,fire_destroy_chance:30,fire_catch_chance:30,light_emission:0,light_dampening:12,material:\"alpha_test\",fade_to_opaque:!0,tint_method:\"default_foliage\",face_dimming:!0,ambient_occlusion:!0,map_color:\"#1e9847ff\"},log:{name:\"Log\",sound:\"wood\",model_type:\"log\",thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHMAAAB/CAYAAADcgf2dAAAAAXNSR0IArs4c6QAAFXhJREFUeF7tnUmMHUcZx+t5ZmzPOLbHG7az4AUwtrOCEmUzkQVBRFFACCQgEkiRcuUYIXGyfUUcuSLlxnJAHBBiiWRLJCEhYUliYhOcxI6T2BPbs3gyM/Z47If+/ebr+d736vuqql/3Wyb0yZ7uru6uX31rfVWv5pb58dTj+w/VXe2wq7tjtXrtyLN/OH5suX5ybbl+WA5RfuAyhrrsYKoQPwFQlw3MaIgeqFvWDx/56S9f7Xv12/cwQxCffPzeJny/+P2r+f+3jK5ZOlevH3P1el9D7VuYTxzYc8jV3OFNa4e8Zl9ClBc99+IJ730nz05kUH/3/Km+k9S+g0kQJQmCGoKoQT15dlKcakhqP0HtG5hcnV6avtYiVU9/6+7sb8NDIy3n3jn9Xva33Ts/rTrvP/vVX1vOZQOkj7zfnodp2URAJYiSBKASRHkuBNWruvsAas/CDDk23/zqflXKzn1wMSp8llDnrs3m9/32z2/62+hhqD0HsxMQJaXtt2xW4fcT1J6BKR0bqeqKSqKUPk31gmYK1CW73TuOUtdhQhIvTi8c1kRDs4m43lKnll0cGR5wx0+8q0qjBfXnv3lNua9+bO8t67sap3YNpk+dci/Vgjg5c6WpQ+cmP87/H4IoScRC3bRubdOtP3n2+fz/e28bXTrXxeRDx2G2axOHR2/ySsb20Y2qpJFjI4HQDbNz11XPF9fcsW+Xt+1Ll6fdC6+c8Z67MDHT8VmajsFsF2JL6LEINQaivJegAqI8LJtKUAFRHgT1wuRM86kOer+VwywbIvUU2TVfkoCHGFaM4ruXri/LUcqf3wGolcGsGmKLpA6NuFiIvns16P0EtXSYPMTwZVIod+rreO7YcKcGHc0dm1Ro1O7omtWWoHpTgUUllaSez9JQWw1Hr/yQpjSYWgIcHwCoWgIcYKR3ynu8iE2k+7V2q4SqqW5A9eWUy4TaNkypTuUL8xBDfihXYdJLrQKiFMuqoFppQhmn5tqrBJtaGGZVNtGKE0Pq1ZJwS79WBTUlo1SGo5QMsyqI8sO5FIcgykwQl3IJyrLLVuejs3vd+42GGYIIm6h1OjpQOjQ0EiGJIViaVFnthsBoqcDz47PuC3fq854WVHyH1i4GmKYBMEh8jlL23QnqNwgzBqLsbILjU3sE1adOY6Fa7YYgynelzgdEecRC9b03tevLWBFUn6S3A1WFGaqxefrb92ffbmVRfB/SjmODDtLSeZbdo461QP/zjUY1gjy2bRwxZ1M0rUGgzk2Ot1xiDWi6WIN6aXpeLWdpgRmqsSGI8g2t/CYAtAtRPo+gxkCU98ZABcSU++haza4CqmVqtEFBUFvDmtY4NYcZqrH54XcfzJ6H6SN5WDMP7Xin1hSXBcRycizniH9X0WdbNhXnZEaJv4814GNqlGrf+fKeQ8Orh7zziRgNBFECDM0JdhuiNtJ9fy8i3WgnZJ8t79enfundQlDVGqUfPHb70ZWDAwfn5q+5ocEV3j6wyhet3CUaKwq1qGSkxppVgCwKMRsgxlSeaken5ly97lwNMJ1zB9HQysEBVwXUdmxmVVCXA8Rzl2bd0EDNjV9uTNY3wcQfTo9Nu8GBFW77xuG2JbVMb5ZDle1aYKSkLheI1xZuZCCnZ+dzbeqFSWe3jA671UMrvFAte4r7LZtgqZNQrGmp0VBaTrOjRaU/lBHSwii8B95Vux/Ojs8uXpqaczNXrmcQ6YiGiRvu37fVrVo54N79cCqD6sv8a05SCtQQRAmiDKhVQZTvGvKgCarmsQLi0OCAWzk04CYWVWphmHTjxOWr7oPx2UwN8yO0ziM0zUUjtaUTFpcaWKA1qIjpNG8TCQJfHBnyUGMcGy2WjEm6S0G5vnDdfTx31d28eanuqTSYY4spLzhKgLp1dJXp/YYmoLUwQeu0GKi+zqSO9GV5CKrV2TEQ5bfQe8RAlPd+NHElgzg101hTs2/HhvyS0mFSyyHv1ypcDoUQRTNGlupMzb8WgUh9Y9lvrUoe6nTdmlXu+LvNKcDSYH7p7lvd/HxjhJBkypHUj1CtJHqnISLE2Lx+tbt+o5517YkzE01dTDClVOKiJAcIMOk4e37Kq1bxx3+9dd4NrKi5/bu3NHm/VmEzr2N9+9yFpratGqAWlcYW/MhzUlJDWRu6XwINeeeWJPLqAu6lAuL0zBW3dmSV27BuqT5Jwty2YVjt98IwX//v+azRDWtbGwdMOgB126dGWxwlOv+jpw6oL2fleXFT0YyS+sDAiZA5iIXIHzM7N+/mrlzNINJRCUyCMrq+sd6fSybBzF+AQeUwcf5rD+zOQpq/v3Uxh9pUxu+c+8ZX7sg/RhYWW9UDuKmoTeWdKqWPO1ih56fYRNJOgHj9+oI7O3bZffbW5gr8SmHSR3/9kc/n358Kk3fc/LUbWZwkD1SAF3WUoIo1ScVEgK/yHM8P2UQtvMgGUYHlf3BsoA4BkY5KYD7z5H1HxyZms9wsDilhO7avz/5+1+e2uXZgwnmCo7RmeCiD2lLG71wTVMtm+TqboPqm6AhqCKIcaPw5RSEi2J+Zu+ZOvd/soVYG09UaiXZ0uAbTZ1q47fSpWX4P94RD3q9VYxtaFa0t8sG7pFZFkDrX4lstxIAUrlk91OT9dxwmXv6PL73TxI0kMxUm1DOFNDRQZBuxUK0aG9974W8hqNrUHaXefDaZ3sOCiKkoSKI8qoAJO/ve+SXVXYOaJcksGyZ9EKBqMSqueePUWEtIg7+T4+Bbq0kq0weFJwceffj2pn597oV/5/+3SkN8KplypzIJTnHixck5bWxFq1kZlqBBGZpwZykJ5j17trmJaf9LWmqWO054IdhbX0jD7TRCmj07N7vZqze8nQKomt0DVF+GR+1ddsIq2sLzfAnw7PYbC3kCHP/1BfX0mJBknp/QBwKHyUGi7WSY9EISaipMakdC5fYWg4dyvzyhz6XBqnx48R8nY/jl1zz0xb35v6U65+qUJz8QYgyvrLkTpy+5+/bfnN/fLZhrR1Zm79CiZl8+MeYmp5YWjKJzOw2TnhdrU330QlA5RHm/XZ5RzyDS4YNJWRnqZFxblWTyAeSFSS8KqN2EiffYunGkaT4Vf2vawNA59+hD+1RplFCLQqRJYQmFw+QqDy/kg3nTmkb2TNrBomo2GiYeunPr0sYMnVKznAxg0jF7dcENrlihJh9S982jdjVJhGND5Rma7QPMwcHB7PQ7IpbkMCUsH8yPZxp2k4DTM+latMFnUHC+EpioHeLq2ecA0cuFbKYGE3+HGYAtvXPXJjX5EAvVgrh1w7DXA5eS+eBdS+tS2oHJ25UweX90DCZXz1XCpOc8cvfNeTmL1LNWjZJVY4P5xJQQo0qYXCLp+5JgUjwISUtRs3Q9PRTq+bZtjVQgDp4KbFcyqU3UJ+GIrVGyamwAkeYTU7zSIjDXrBposqf4Bi6ZMtXHVXQhmHKkZ/pZxJscig8mtQGoFkyuornDhfu5zSQ1K2HS/0M1SrLGBiHG9Ny82719XdPnVgUTEOng9pRgbt3YqPWR56JhPvHwrqN7d2zOE+0yU8MlNOQA0bSZlGg5EKRk8oHAHa5UmLxGaWxyzm1a14i/5HH2oxl3bWHBW2OTvetiBRxCDF+n8/ZiJZNPIvuA8fNtwXSulsHcu2NTi9GXHc2BakkDQJVQtPvw3LJh0uBBaejwqqG88oFKFpE7tUY7DzH6FiY6IVZqAMfKAEl1WQVMGjCkirlW4c9rrKGpNSXAfTB9IcYnAiapQOpAOQVWFkySWnJ2EJrQIaWfqz9pEjA5zg8O887PbGk6x0OMTsOcuXrdTCiYDhBsJqnZFMmU9kxOnaXApI6fml1oUc/SseK93iswL4w3dtXU7OKWjTeZCQXcyweXlR3qCEySGEocFIEZGkzSkek2TAT3vOMlzN2szkdLKNAsCJ/66hmYmgrkag8lKDiodDPWnnYCppXFwfMRD/IMTVGYn97WHA71PUyCE0oo8JCnKjUrIdJzrDAB1/wf5qJkxsKk6yTUMtQsktsUrEvJ98WDVsI8Rc36JFMrdo5OGmDl9MT0XJ400FJtvtiRZ2dOnrnk4MBoapYcmfUjg1mlHz9CksmvtRITKd4sT58VhYmBwFNv7cC0sk6ASdkjOQiaZk34MngZO6JzZBUA7zAJk86FvFJeWI17+g0mTVXh3TWYCDF4yCPVuAVFagg+SKJhohFIEFdfRWDSy2i52xSYGGBnzi2tcalSMsk+Wqk1q2IA9wEiHRpMPEfW8liS2RZMrirbgcmh8ngxFSa1A6hVwJSzFEVhSnsqYXJnSoPpyweXAhOdqNUD4ZymZn2OBKSUgBaFiXZ5O1pSHlmpUAbImnIqG+bCwkJL5Z5VZSc96I7DpLReTFkmn+eUNhPJfhxae1q5Zmhw8XQeOvKVNz/Mx1wRyfTV8kjJtBbJdh0mVQ9QsM8lU06dWdNldN/KlY0fMuUOEMGknoaXzA+fHZYJd1wv7wNM3oFFYVqhCZ2jEIM/T9rEGJh0DZ/FSXKAqONIJVp1PdbygxiYPmASJqUJEdKQmpXvSP+nZLwP5prh5rnNVJi+tBueYy2ELQpTAvPBpPfnWqVlHyBp77gDJOt6uIQWkUx6FlepGkzulJUFUyt7tGyUb1Wzr042G3hsNXSKZFowxxaT+tQHSTC5hGowfQ6PlExuC2UpCB8IVpkInsOdHjmjwiVTOkFSMq1cKPcopTrk9/EyELybdFxwrxZyWGrWB5PatkKjoGRaIYW1x4EGk5wbzd6WCZMGGd4lFibsnrW2AzAlRHqODD2s2DEFJm+nJ2FSBwCeJZk4p5WVhCSTa4z5hebf/ZKSqc0nWp0uNZJMBmgwIfkxdjEfjGxXrp6GKTvEUsEyO1UGTEih5aGmwAyl6CxbTE4OMkjWBHRbMLmzIYP9dtSsz87ibxZMeU87MLnUdAKmTMJb85mVw6SOptgQ//8kw/TlcS3J7ApMqcq4NHCpAdRPIkxr77pOw5RlK+Z+s6GCZGtpe8ibjVWzlMnxpfG6oWZ7AaZWtmLClHFdij1LgUnXAph8Rkw6z5cBkgNNerNFbWa3YVr2vfbjpx48WnO1g6QyrTUjFkwOBJ2rpfNkKCKvLZKbTYUJzzF27WRo3jF2RkOzmTQ4YktDomBSh/zltfebNCBXtTEwNfVpzXZw8CkwcR8vVZEZIBlnassOeAfJUpCiMC0J9mWLrAp7qsvFfV2BSfCkxIZSf6kwqT1AtWCeer95208pmVopiJVfxbOlZFqJAv7tVtWfrLD3waQsFG8nV7NlS6YliRJoO5LJ2+IDQdpMC6YViFv5VQlTAuLvFloFBomjAcVXlqENDtNqp2MwafZFVrqn2ky+Ui3FySoCE8sKeEf6tIpVlZACkw+ojsCUGRpt1RWuS1kdnSKZXPqkp1uWZPLOLAoTcKwyTGtBkvX8JMmEV2utl6TRJr1SazIa91iFYcsJplZbFJJgKZnaILLaaVGzPKtjZYNISmNrdYrClJUGvSqZkLRQGaZlU60CM6mutXZMmGgkNr1nBfftSCZfj4l2rNKQVDVLbj73ZPGMFDXLO1qDGWN7Y2FqoR/+nu/QRQl0mW+NXaJeFkyytRTTVgETI1vGlryTYmD6SkWsPYJCtrdUmPQx2gYVOG/lalNgyiq/lCV9VmlISDK1rA+XTOQ9eZwnIVgOyLKFKetfrcKw0LYyXGq0xAAGhAVzbHxpc0eZSQFMnryuEqZW/NXTkikzOXyZvFYY5lu4lDIzggGDX23AITWMBtNXaVAFzJRFvFb5ZpTNbFfNymq4IjB9L5oKk9qQyQkJkz/Lt0YESwqyhIbxq3g4b21DGrtHkNQUPpiUVrSKxFq2KLVsJlScVnwlEwj9ChMdaeVji9rMkGRqBWVyJ0vrJ6SSYXIJtpYnyGxRjJr1SSZUJ1/5ZSXTrVg2JJlaeWW3JFObEjN/pU9uuB+STN7huNa3oZKEgmssmDH7t6NNQK0CpnzfIpIpFyPJeDVFMuX7RP9K3zPfu/egq9UO8d824Y1xm8U70udkWMaZb3ZYdPtStM9/YkMOvKKS2Q5MXvfD169wmLC/1i7R0mYWhkk3ElT+60M4VyZMelbK+ky58xcfCDLB0WswY7f8bhdm3bnDLx3/8MjSL1Ev9vT3H7vjYM3VDznX+BWiKmCShPuW9FmzLSSZNCh6FSbFrFw9ViSZh//0t9NHqD9aYNIJgnp6bDrfiSRFzUpbag0Knj3qVZi+tZLoK65mtR8xxXW8Yh3/T9lw32MzmyAGYdIFB+659WANNtXVDkqYlDf17ceTsulvWTD5irWYOFMujqVvlnU/3IZJCQNMX1EW7uEQQj9wyhcsaSuwoU5//dzJXBKlbVUlU14IqA/s2547Sjhv7TApYZI3Kz1StJMCkyBhKX3KpICVzvP9PBMBilnhTH3lg6CBtrI8sp29OzaYEKMlU0Ll3m8RmGgPQLTNLUJq1ld2Qu9ozfCkwOTf7IOpzSdaVX5WVZ3s4/zaev3w66c+UiWxsGT6oL78n7FM/eJcqPqdx5kcCKBakslDGhoI8l06CTO0k5ZW5ZcEc3w2CWJhyfSpX9jUnVvX5Y4SrtHUrA8IgPn2LMC1XNrkLyDJd+F1tHJwlSWZ1kpoGWfyGqBImF7HRhu8pUmmbEiGND4HSNuL1lKPVoW9D2buxIgfOa8KpraDCd4jAWZbEEuTTA3q1o0jTZJq2ddOwkQJB4433r6Qv3rsjiG4wdpoooBklgKxMpjUsEwTdhvmDdfsuPtg+kKV0PIEn2QGN3xKdGw6rma1BxLUl0+O5ZIq7VknJNOCKd/dN4MSs2uIFUtmA6UiiJVLpuYowfutCiY901ex4IPp+60ttJEy088l04BZqjrVBCc6aRAr6qHrkHzYtW19nvuVHqsFmrdt7QLtewcJM7SyKmZmH88JwOwIxI5LpuX9pqhZ3o6sfLAGUgpMa/5QPsMLs2J12jOS6YN6ZmxKTT5IyZUw6f/WknxcUwZMueFTi2SeHi8U7Ie0Wez5jqtZ7cUooS+TD/x6q7gL11lA24Gp1ecQzFACPBZGu9f1DEz6EJl8kB9YdH61KMzAbEdHbWIIds/BDEFtF6avhFKbcsK7KDB7CmLXHaDQKNOgFoWZstuIOg/ZJccmtq96VjI177do5UNbMHscYt9IpoRqVT5YDlARmL3i2Cw7yfRBlZUPsqqeT3SnwIyd2Y/t5E5d1zdqVusQntDX9lgA1CiYfaJOezZpUNaoBdSxybk8TSj3WJA7QTdtt1ZwZr+sdy+rnb6XTM1R4j9Wh2sUmD0ZYhSFu+xgUkc8cWDnQVdvlIhKmP3m2MTC/R8qrDHlTXFU4gAAAABJRU5ErkJggg==\",rotation:\"pillar\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"axe\",destroy_time:.5,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#5f4a2b\"},lectern:{name:\"Lectern\",note:\"Visuals only, no book functionality\",sound:\"wood\",model_type:\"lectern\",thumbnail:\"data:image/png;base64,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\",rotation:\"cardinal\",collision:\"full\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"axe\",destroy_time:.65,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,light_dampening:15,face_dimming:!0,ambient_occlusion:!0,map_color:\"#5f4a2b\"},fence:{name:\"Fence\",hidden_on_edu:!0,sound:\"wood\",model_type:\"fence\",thumbnail:\"data:image/png;base64,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\",collision:\"fence\",selection_box:\"collision\",mineable:!0,explodable:!0,destroy_tool:\"axe\",destroy_time:.65,explosion_resistance:15,friction:.4,flammable:!0,fire_destroy_chance:20,fire_catch_chance:5,light_emission:0,face_dimming:!0,ambient_occlusion:!0,map_color:\"#5f4a2b\"}}},924:(e,t,o)=>{const{getFS:i}=o(359);isApp&&\"BedrockBlockManager\"in window&&(BedrockBlockManager.prototype.checkBlockFile=function(e){try{var t=i().readFileSync(e,\"utf-8\");if(\"string\"==typeof t){let e=(t=autoParseJSON(t,!1))&&t[\"minecraft:block\"];if(!e||!e.components)return;let o=e=>\"object\"==typeof e?o(e.identifier):\"string\"==typeof e&&e.replace(/^geometry\\./,\"\")==this.project.geometry_name;if(o(e.components[\"minecraft:geometry\"]))return e.type=\"block\",e;if(e.permutations instanceof Array)for(let t of e.permutations)if(t.components&&o(t.components[\"minecraft:geometry\"]))return e.type=\"block\",e}}catch(e){return console.error(e),!1}})},318:e=>{\"use strict\";e.exports=\"data:image/png;base64,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\"},317:e=>{\"use strict\";e.exports=require(\"child_process\")},896:e=>{\"use strict\";e.exports=require(\"fs\")},857:e=>{\"use strict\";e.exports=require(\"os\")}},t={};function o(i){var a=t[i];if(void 0!==a)return a.exports;var n=t[i]={id:i,exports:{}};return e[i](n,n.exports,o),n.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var i in t)o.o(t,i)&&!o.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.nc=void 0,(()=>{\"use strict\";var e=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",{attrs:{id:\"block_wizard_wrapper\"}},[o(\"h2\",[e._v(e._s(e.pages[e.open_page].label))]),e._v(\" \"),\"metadata\"==e.open_page?o(\"div\",{staticClass:\"block_wizard_target_selection\"},[o(\"p\",{staticClass:\"description\"},[e._v(\"Game Variant\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,\"edition\",t)},expression:\"form.edition\"}})],1):e._e(),e._v(\" \"),\"metadata\"==e.open_page?o(\"content\",[o(\"section\",[o(\"label\",{staticClass:\"required\"},[e._v(\"Display Name\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The display name will be visible to players in-game.\")]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.display_name,expression:\"form.display_name\"}],attrs:{type:\"text\",placeholder:\"Test Block\"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,\"display_name\",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(\" \"),o(\"section\",[o(\"label\",{staticClass:\"required\"},[e._v(\"Identifier\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The identifier is used internally in the addon to identify this block type.\\n\\t\\t\\t\\tAn identifier consists of the namespace and the block name, separated by a colon.\\n\\t\\t\\t\\tThe namespace should be a short and unique version of your name or the name of your addon.\\n\\t\\t\\t\")]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.identifier,expression:\"form.identifier\"}],attrs:{type:\"text\",placeholder:\"myname:custom_block\"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,\"identifier\",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(\" \"),e.identifier_error?o(\"div\",{attrs:{id:\"block_wizard_id_error\"}},[o(\"i\",{staticClass:\"material-icons\",staticStyle:{color:\"#ff415b\"}},[e._v(\"error\")]),e._v(\" \"),o(\"div\",{staticClass:\"block_wizard_tooltip tooltip\"},[e._v(e._s(e.identifier_error))])]):e._e()]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Creative Category\")]),e._v(\" \"),o(\"div\",{staticClass:\"wizard_columns\"},[o(\"div\",[o(\"p\",{staticClass:\"description\"},[e._v(\"Select the category of the block in the creative inventory\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.inventory_categories},on:{input:function(t){e.form.item_group=\"none\"}},model:{value:e.form.category,callback:function(t){e.$set(e.form,\"category\",t)},expression:\"form.category\"}})],1),e._v(\" \"),o(\"div\",[o(\"p\",{staticClass:\"description\"},[e._v(\"Optionally select the item group within the category.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.inventory_groups[e.form.category]},model:{value:e.form.item_group,callback:function(t){e.$set(e.form,\"item_group\",t)},expression:\"form.item_group\"}})],1)])])]):e._e(),e._v(\" \"),\"preset\"==e.open_page?o(\"content\",[e._m(0),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Preset\")]),e._v(\" \"),o(\"ul\",{staticClass:\"block_wizard_preset_list\"},e._l(e.presets,(function(t,i){return o(\"li\",{key:i,class:{selected:i==e.form.preset,grayed:\"edu\"==e.form.edition&&t.hidden_on_edu},style:{backgroundImage:e.getThumbnail(t.thumbnail)},on:{click:function(t){return e.selectPreset(i)}}},[o(\"label\",[e._v(e._s(t.name))])])})),0),e._v(\" \"),e.presets[e.form.preset].note?o(\"p\",{staticClass:\"block_wizard_preset_note\"},[e._v(\"ℹ️ \"+e._s(e.presets[e.form.preset].name)+\": \"+e._s(e.presets[e.form.preset].note))]):e._e()])]):e._e(),e._v(\" \"),\"shape\"==e.open_page?o(\"content\",[o(\"section\",[o(\"label\",[e._v(\"Collision Box\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the size of the block collision box.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.collision_options},model:{value:e.form.collision,callback:function(t){e.$set(e.form,\"collision\",t)},expression:\"form.collision\"}})],1),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Selection Box\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the size of the block selection box, the area where you can click to select or mine the block.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.selection_box_options},model:{value:e.form.selection_box,callback:function(t){e.$set(e.form,\"selection_box\",t)},expression:\"form.selection_box\"}})],1),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Rotation\")]),e._v(\" \"),\"leaves\"==e.form.preset?o(\"p\",{staticClass:\"description\"},[e._v(\"\\n\\t\\t\\t\\tRotations are not available for this preset.\\n\\t\\t\\t\")]):[o(\"p\",{staticClass:\"description\"},[e._v(\"Select if and how the block can be placed in a rotated orientation.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.rotation_options},model:{value:e.form.rotation,callback:function(t){e.$set(e.form,\"rotation\",t)},expression:\"form.rotation\"}})]],2),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"numeric-input\",{attrs:{min:0,max:16},model:{value:e.form.random_offset_range,callback:function(t){e.$set(e.form,\"random_offset_range\",t)},expression:\"form.random_offset_range\"}}),e._v(\" \"),e._m(1)],1)]):e._e(),e._v(\" \"),\"behavior\"==e.open_page?o(\"content\",[o(\"section\",[e._m(2),e._v(\" \"),o(\"div\",{staticClass:\"bar flex\"},[o(\"label\",[e._v(e._s(e.form.friction))]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.friction,expression:\"form.friction\"}],attrs:{type:\"range\",min:\"0\",max:\"0.9\",step:\"0.01\"},domProps:{value:e.form.friction},on:{__r:function(t){return e.$set(e.form,\"friction\",t.target.value)}}})]),e._v(\" \"),e._m(3)]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Liquid Interaction\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select how the block reacts to flowing water.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.liquid_touches_options},model:{value:e.form.on_liquid_touches,callback:function(t){e.$set(e.form,\"on_liquid_touches\",t)},expression:\"form.on_liquid_touches\"}})],1),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.can_contain_liquid,expression:\"form.can_contain_liquid\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.can_contain_liquid)?e._i(e.form.can_contain_liquid,null)>-1:e.form.can_contain_liquid},on:{change:function(t){var o=e.form.can_contain_liquid,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"can_contain_liquid\",o.concat([null])):n>-1&&e.$set(e.form,\"can_contain_liquid\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"can_contain_liquid\",a)}}}),e._v(\" \"),e._m(4)]),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.redstone_conductor,expression:\"form.redstone_conductor\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.redstone_conductor)?e._i(e.form.redstone_conductor,null)>-1:e.form.redstone_conductor},on:{change:function(t){var o=e.form.redstone_conductor,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"redstone_conductor\",o.concat([null])):n>-1&&e.$set(e.form,\"redstone_conductor\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"redstone_conductor\",a)}}}),e._v(\" \"),e._m(5)]),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.flammable,expression:\"form.flammable\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.flammable)?e._i(e.form.flammable,null)>-1:e.form.flammable},on:{change:function(t){var o=e.form.flammable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"flammable\",o.concat([null])):n>-1&&e.$set(e.form,\"flammable\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"flammable\",a)}}}),e._v(\" \"),e._m(6)]),e._v(\" \"),e.form.flammable?o(\"div\",{staticStyle:{\"margin-left\":\"40px\"}},[o(\"section\",{staticClass:\"divided_section subsection\"},[o(\"numeric-input\",{attrs:{min:0},model:{value:e.form.fire_catch_chance,callback:function(t){e.$set(e.form,\"fire_catch_chance\",t)},expression:\"form.fire_catch_chance\"}}),e._v(\" \"),e._m(7)],1),e._v(\" \"),o(\"section\",{staticClass:\"divided_section subsection\"},[o(\"numeric-input\",{attrs:{min:0},model:{value:e.form.fire_destroy_chance,callback:function(t){e.$set(e.form,\"fire_destroy_chance\",t)},expression:\"form.fire_destroy_chance\"}}),e._v(\" \"),e._m(8)],1)]):e._e()]):e._e(),e._v(\" \"),\"destruct\"==e.open_page?o(\"content\",[o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.mineable,expression:\"form.mineable\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.mineable)?e._i(e.form.mineable,null)>-1:e.form.mineable},on:{change:function(t){var o=e.form.mineable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"mineable\",o.concat([null])):n>-1&&e.$set(e.form,\"mineable\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"mineable\",a)}}}),e._v(\" \"),e._m(9)]),e._v(\" \"),e.form.mineable?o(\"section\",[o(\"label\",[e._v(\"Suitable Tool\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select which tool can break the block faster.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.tool_options},model:{value:e.form.destroy_tool,callback:function(t){e.$set(e.form,\"destroy_tool\",t)},expression:\"form.destroy_tool\"}})],1):e._e(),e._v(\" \"),e.form.mineable?o(\"section\",[o(\"label\",[e._v(\"Tool Tier\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select which tier of tool can be used to break the block.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.tier_options},model:{value:e.form.destroy_tier,callback:function(t){e.$set(e.form,\"destroy_tier\",t)},expression:\"form.destroy_tier\"}})],1):e._e(),e._v(\" \"),e.form.mineable?o(\"section\",{staticClass:\"divided_section\"},[o(\"numeric-input\",{attrs:{min:0,step:.1},model:{value:e.form.destroy_time,callback:function(t){e.$set(e.form,\"destroy_time\",t)},expression:\"form.destroy_time\"}}),e._v(\" \"),e._m(10),e._v(\" \"),o(\"div\",{style:{backgroundImage:e.getThumbnail(e.block_break_texture),animation:\"break_block_animation \"+Math.max(e.form.destroy_time,.25)+\"s steps(1) infinite\"},attrs:{id:\"break_block_animation\"}})],1):e._e(),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.explodable,expression:\"form.explodable\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.explodable)?e._i(e.form.explodable,null)>-1:e.form.explodable},on:{change:function(t){var o=e.form.explodable,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"explodable\",o.concat([null])):n>-1&&e.$set(e.form,\"explodable\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"explodable\",a)}}}),e._v(\" \"),e._m(11)]),e._v(\" \"),e.form.explodable?o(\"section\",[e._m(12),e._v(\" \"),o(\"div\",{staticClass:\"bar flex\"},[o(\"numeric-input\",{staticStyle:{\"max-width\":\"50px\",\"margin-right\":\"10px\"},attrs:{min:0,max:1e4},model:{value:e.form.explosion_resistance,callback:function(t){e.$set(e.form,\"explosion_resistance\",t)},expression:\"form.explosion_resistance\"}}),e._v(\" \"),o(\"input\",{attrs:{type:\"range\",min:\"1\",max:\"1.468\",step:\"0.001\"},domProps:{value:Math.pow(e.form.explosion_resistance+1,1/24)},on:{input:function(t){return e.inputExplosionResistance(t)}}})],1),e._v(\" \"),e._m(13)]):e._e()]):e._e(),e._v(\" \"),\"appearance\"==e.open_page?o(\"content\",[e.current_tab_model?o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.use_current_model,expression:\"form.use_current_model\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.use_current_model)?e._i(e.form.use_current_model,null)>-1:e.form.use_current_model},on:{change:function(t){var o=e.form.use_current_model,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"use_current_model\",o.concat([null])):n>-1&&e.$set(e.form,\"use_current_model\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"use_current_model\",a)}}}),e._v(\" \"),o(\"div\",[o(\"label\",[e._v('Use current model \"'+e._s(e.current_tab_model)+'\"')])])]):e._e(),e._v(\" \"),o(\"section\",[e._m(14),e._v(\" \"),o(\"div\",{staticClass:\"bar flex\"},[o(\"label\",[e._v(e._s(e.form.light_emission))]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.light_emission,expression:\"form.light_emission\"}],style:{\"--color-thumb\":\"hsl(\"+(38+1.2*e.form.light_emission)+\", \"+(20+5*e.form.light_emission)+\"%, \"+(20+5*e.form.light_emission)+\"%)\"},attrs:{type:\"range\",min:\"0\",max:\"15\",step:\"1\"},domProps:{value:e.form.light_emission},on:{__r:function(t){return e.$set(e.form,\"light_emission\",t.target.value)}}})])]),e._v(\" \"),o(\"section\",[e._m(15),e._v(\" \"),o(\"div\",{staticClass:\"bar flex\"},[o(\"label\",[e._v(e._s(e.form.light_dampening))]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.light_dampening,expression:\"form.light_dampening\"}],style:{\"--color-thumb\":\"hsl(\"+(60-1.2*e.form.light_dampening)+\", \"+(95-5*e.form.light_dampening)+\"%, \"+(95-5*e.form.light_dampening)+\"%)\"},attrs:{type:\"range\",min:\"0\",max:\"15\",step:\"1\"},domProps:{value:e.form.light_dampening},on:{__r:function(t){return e.$set(e.form,\"light_dampening\",t.target.value)}}})])]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Transparency\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select how transparent pixels will display in game.\")]),e._v(\" \"),o(\"select-input\",{attrs:{options:e.block_materials},model:{value:e.form.material,callback:function(t){e.$set(e.form,\"material\",t)},expression:\"form.material\"}})],1),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.fade_to_opaque,expression:\"form.fade_to_opaque\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.fade_to_opaque)?e._i(e.form.fade_to_opaque,null)>-1:e.form.fade_to_opaque},on:{change:function(t){var o=e.form.fade_to_opaque,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"fade_to_opaque\",o.concat([null])):n>-1&&e.$set(e.form,\"fade_to_opaque\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"fade_to_opaque\",a)}}}),e._v(\" \"),e._m(16)]),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.face_dimming,expression:\"form.face_dimming\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.face_dimming)?e._i(e.form.face_dimming,null)>-1:e.form.face_dimming},on:{change:function(t){var o=e.form.face_dimming,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"face_dimming\",o.concat([null])):n>-1&&e.$set(e.form,\"face_dimming\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"face_dimming\",a)}}}),e._v(\" \"),e._m(17)]),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.ambient_occlusion,expression:\"form.ambient_occlusion\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.ambient_occlusion)?e._i(e.form.ambient_occlusion,null)>-1:e.form.ambient_occlusion},on:{change:function(t){var o=e.form.ambient_occlusion,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"ambient_occlusion\",o.concat([null])):n>-1&&e.$set(e.form,\"ambient_occlusion\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"ambient_occlusion\",a)}}}),e._v(\" \"),e._m(18)]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Tint Method\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Use a grayscale and tint it in-game to match a biome\")]),e._v(\" \"),o(\"select-input\",{staticStyle:{\"max-width\":\"220px\"},attrs:{options:e.tint_methods},model:{value:e.form.tint_method,callback:function(t){e.$set(e.form,\"tint_method\",t)},expression:\"form.tint_method\"}})],1),e._v(\" \"),o(\"section\",{staticClass:\"divided_section\"},[o(\"color-picker\",{model:{value:e.form.map_color,callback:function(t){e.$set(e.form,\"map_color\",t)},expression:\"form.map_color\"}}),e._v(\" \"),e._m(19)],1),e._v(\" \"),\"none\"!=e.form.rotation?o(\"section\",{staticClass:\"divided_section\"},[o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.uv_lock,expression:\"form.uv_lock\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.uv_lock)?e._i(e.form.uv_lock,null)>-1:e.form.uv_lock},on:{change:function(t){var o=e.form.uv_lock,i=t.target,a=!!i.checked;if(Array.isArray(o)){var n=e._i(o,null);i.checked?n<0&&e.$set(e.form,\"uv_lock\",o.concat([null])):n>-1&&e.$set(e.form,\"uv_lock\",o.slice(0,n).concat(o.slice(n+1)))}else e.$set(e.form,\"uv_lock\",a)}}}),e._v(\" \"),e._m(20)]):e._e(),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Sound\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the sound preset for the block\")]),e._v(\" \"),o(\"select-input\",{staticStyle:{\"max-width\":\"220px\"},attrs:{options:e.block_sounds},model:{value:e.form.sound,callback:function(t){e.$set(e.form,\"sound\",t)},expression:\"form.sound\"}})],1)]):e._e(),e._v(\" \"),\"loot\"==e.open_page?o(\"content\",[o(\"loot-editor\",{attrs:{form:e.form}})],1):e._e(),e._v(\" \"),\"export\"==e.open_page?o(\"content\",{attrs:{id:\"block_wizard_export_page\"}},[o(\"export\",{attrs:{form:e.form}})],1):e._e(),e._v(\" \"),\"next_steps\"==e.open_page?o(\"content\",[o(\"section\",[o(\"label\",[e._v(\"The add-on has now been exported to your selected destination. Enable the packs to test them.\")]),e._v(\" \"),o(\"button\",{staticStyle:{\"margin-top\":\"8px\",\"margin-bottom\":\"24px\"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[o(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"help\")]),e._v(\"How do I install packs?\")]),e._v(\" \"),\"none\"==e.form.spawn_egg_mode?o(\"p\",[e._v(\"Now you can place your block in the world using the command \"),o(\"code\",{staticClass:\"code\",on:{click:function(t){return e.copySummonCommand()}}},[e._v(\"/setblock ~ ~ ~ \"+e._s(e.form.identifier))])]):o(\"p\",[e._v(\"Now you can find the block in the creative inventory!\")])]),e._v(\" \"),\"mcaddon\"!=e.form.export_mode&&\"integrate_mcaddon\"!=e.form.export_mode?o(\"section\",[o(\"label\",[e._v(\"Let's edit the block model!\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"After you close this dialog, you will be able to edit the model and texture in Blockbench\")]),e._v(\" \"),\"mcaddon\"!=e.form.export_mode&&\"integrate_mcaddon\"!=e.form.export_mode?o(\"button\",{attrs:{id:\"block_wizard_launch_vscode\"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[o(\"img\",{attrs:{src:e.VSCode.icon,width:\"22px\"}}),e._v(\"\\n\\t\\t\\t\\tOpen in VS Code\\n\\t\\t\\t\")]):e._e()]):o(\"section\",[o(\"label\",[e._v(\"Now let's edit the block model!\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"After you close this dialog, you will be able to edit the model and texture in Blockbench\")]),e._v(\" \"),e._m(21)]),e._v(\" \"),e._m(22)]):e._e()])};e._withStripped=!0;var t=o(359);const i={metadata:{label:\"Naming\",icon:\"description\"},preset:{label:\"Preset\",icon:\"view_list\"},shape:{label:\"Shape\",icon:\"deployed_code\"},behavior:{label:\"Behavior\",icon:\"mode_heat\"},destruct:{label:\"Destruct\",icon:\"sound_detection_glass_break\"},appearance:{label:\"Appearance\",icon:\"visibility\"},loot:{label:\"Loot\",icon:\"diamond\"},export:{label:\"Export\",icon:\"file_download\"},next_steps:{label:\"Next Steps\",icon:\"queue_play_next\"}};var a=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"p\",{staticClass:\"description\"},[e._v(\"Export your block as a behavior and resource pack.\")]),e._v(\" \"),o(\"section\",{attrs:{id:\"block_wizard_export_options\"}},[e.isApp?o(\"div\",{staticClass:\"block_wizard_export_option\",class:{selected:\"folder\"==e.form.export_mode},staticStyle:{\"border-color\":\"#dccb92\"},on:{click:function(t){return e.setExportMode(\"folder\")}}},[o(\"h3\",[e._v(\"Export to Folder\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.\")])]):e._e(),e._v(\" \"),e.isApp?o(\"div\",{staticClass:\"block_wizard_export_option\",class:{selected:\"integrate\"==e.form.export_mode},staticStyle:{\"border-color\":\"#83c4ea\"},on:{click:function(t){return e.setExportMode(\"integrate\")}}},[o(\"h3\",[e._v(\"Integrate into Pack\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Integrate the block into an existing behavior and resource pack on your computer.\")])]):e._e(),e._v(\" \"),o(\"div\",{staticClass:\"block_wizard_export_option\",class:{selected:\"mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#89ca51\"},on:{click:function(t){return e.setExportMode(\"mcaddon\")}}},[o(\"h3\",[e._v(\"Export as MCAddon\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Generate an MCAddon file that you can install in one click or send to your friends.\")])]),e._v(\" \"),o(\"div\",{staticClass:\"block_wizard_export_option\",class:{selected:\"integrate_mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#d2fc92\"},on:{click:function(t){return e.setExportMode(\"integrate_mcaddon\")}}},[o(\"h3\",[e._v(\"Integrate into MCAddon\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Integrate the block into an existing MCAddon file.\")])])]),e._v(\" \"),\"integrate\"==e.form.export_mode?[o(\"section\",[o(\"label\",[e._v(\"Behavior Pack\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the behavior pack that you want to save the new block into\")]),e._v(\" \"),o(\"ul\",{attrs:{id:\"block_wizard_pack_list\"}},[e._l(e.existing_packs,(function(t){return o(\"li\",{key:t.name,class:{selected:t==e.form.integrate_pack},on:{click:function(o){e.form.integrate_pack=t}}},[t.has_icon?o(\"img\",{attrs:{src:e.getPackIcon(t),width:\"32px\"},on:{error:function(e){t.has_icon=!1}}}):o(\"div\"),e._v(\"\\n\\t\\t\\t\\t\\t\"+e._s(t.name)+\"\\n\\t\\t\\t\\t\")])})),e._v(\" \"),o(\"li\",{on:{click:function(t){return e.addPacks()}}},[o(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tSelect packs manually...\\n\\t\\t\\t\\t\")])],2)])]:\"integrate_mcaddon\"==e.form.export_mode?[o(\"section\",[o(\"label\",[e._v(\"MCAddon File\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the .mcaddon file to merge the new block into.\")]),e._v(\" \"),o(\"div\",[o(\"button\",{staticStyle:{display:\"inline-block\"},on:{click:function(t){return e.selectMCAddon()}}},[o(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tUpload MCAddon\\n\\t\\t\\t\\t\")]),e._v(\"\\n\\t\\t\\t\\t\"+e._s(e.mcaddon_file_name)+\"\\n\\t\\t\\t\")])])]:[o(\"section\",[o(\"label\",{staticClass:\"required\"},[e._v(\"Pack Name\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The name of the packs you are exporting\")]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_name,expression:\"form.pack_name\"}],attrs:{type:\"text\",placeholder:\"Block Pack\"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_name\",t.target.value)}}})]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Pack Author(s)\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.\")]),e._v(\" \"),o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_authors,expression:\"form.pack_authors\"}],attrs:{type:\"text\",placeholder:\"Benchbot, Performance Panda\"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_authors\",t.target.value)}}})]),e._v(\" \"),o(\"section\",[o(\"label\",[e._v(\"Pack Icon\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The pack icon will be visible in the resource and behavior pack menu\")]),e._v(\" \"),o(\"icon-picker\",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,\"pack_icon\",t)},expression:\"form.pack_icon\"}})],1)]],2)};a._withStripped=!0;var n=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",{staticClass:\"block_wizard_icon_picker\"},[o(\"div\",{staticClass:\"icon_picker_left\"},[e.value?o(\"img\",{attrs:{src:e.value,width:\"64px\",height:\"64px\"}}):e._e()]),e._v(\" \"),o(\"div\",{staticClass:\"icon_picker_right\",on:{click:e.pickImage}},[o(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"folder\")]),e._v(\" \"),o(\"label\",[e._v(e._s(e.imageName))])])])};function r(e,t,o,i,a,n,r,s){var c,l=\"function\"==typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=o,l._compiled=!0),i&&(l.functional=!0),n&&(l._scopeId=\"data-v-\"+n),r?(c=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),a&&a.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},l._ssrRegister=c):a&&(c=s?function(){a.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:a),c)if(l.functional){l._injectStyles=c;var d=l.render;l.render=function(e,t){return c.call(t),d(e,t)}}else{var A=l.beforeCreate;l.beforeCreate=A?[].concat(A,c):[c]}return{exports:e,options:l}}n._withStripped=!0;var s=r({name:\"icon-picker\",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:\"image\",type:\"Image\",extensions:[\"png\"]},(e=>{this.value=e[0].content||e[0].path,this.$emit(\"input\",this.value)}))}},computed:{imageName(){if(!this.value)return\"Select Image...\";let e=this.value.split(osfs);return e.length>2?e.last():\"\"}}},n,[],!1,(function(e){var t=o(361);t.__inject__&&t.__inject__(e)}),null,\"6c5a6967\");s.options.__file=\"src/dialog/IconPicker.vue\";var c=r({components:{IconPicker:s.exports},name:\"export\",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:\"\"}),methods:{setExportMode(e){if(this.form.export_mode=e,\"integrate\"==e){let e=(0,t.getExistingPacks)(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+\"pack_icon.png\",addPacks(){let e={name:\"\",bp_path:\"\",rp_path:\"\",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:\"bedrock_behavior_pack\"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:\"bedrock_resource_pack\"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:[\"mcaddon\"],type:\"MCAddon\",readtype:\"binary\"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.BlockWizardProject.previous_mcaddon=t}))}}},a,[],!1,(function(e){var t=o(136);t.__inject__&&t.__inject__(e)}),null,\"2947df98\");c.options.__file=\"src/dialog/Export.vue\";const l=c.exports;var d=function(){var e=this.$createElement,t=this._self._c||e;return t(\"div\",[t(\"input\",{ref:\"color_picker\"})])};d._withStripped=!0;var A=r({name:\"color-picker\",props:{value:String},mounted(){$(this.$refs.color_picker).spectrum({preferredFormat:\"hex\",color:this.value,showAlpha:!1,showInput:!0,move:e=>{this.$emit(\"input\",e.toHexString())},change:e=>{this.$emit(\"input\",e.toHexString())}})}},d,[],!1,(function(e){}),null,\"26f51d01\");A.options.__file=\"src/dialog/ColorPicker.vue\";const m=A.exports;var p=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[e._m(0),e._v(\" \"),o(\"section\",[o(\"input\",{attrs:{type:\"radio\",id:\"block_wizard_loot_same\",value:\"default\"},domProps:{checked:\"default\"==e.form.loot_type},on:{change:function(t){e.form.loot_type=\"default\"}}}),e._v(\" \"),o(\"label\",{attrs:{for:\"block_wizard_loot_same\"}},[e._v(\"Default Loot\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The block will drop itself\")])]),e._v(\" \"),o(\"section\",[o(\"input\",{attrs:{type:\"radio\",id:\"block_wizard_loot_custom\",value:\"texture\"},domProps:{checked:\"custom\"==e.form.loot_type},on:{change:function(t){e.form.loot_type=\"custom\"}}}),e._v(\" \"),o(\"label\",{attrs:{for:\"block_wizard_loot_custom\"}},[e._v(\"Custom Loot\")]),e._v(\" \"),\"custom\"==e.form.loot_type?[o(\"p\",{staticClass:\"description\"},[e._v(\"From each pool, one entry will be selected randomly.\")]),e._v(\" \"),o(\"ul\",{attrs:{id:\"block_wizard_loot_list\"}},e._l(e.form.custom_loot,(function(t){return o(\"li\",{key:t.uuid},[o(\"p\",{staticClass:\"description\"},[e._v(\"Randomly pick one of these entries:\")]),e._v(\" \"),o(\"ul\",{attrs:{id:\"block_wizard_loot_item_list\"}},e._l(t.entries,(function(i){return o(\"li\",{key:i.uuid},[o(\"select-input\",{attrs:{options:e.item_ids},model:{value:i.type,callback:function(t){e.$set(i,\"type\",t)},expression:\"item.type\"}}),e._v(\" \"),\"custom\"==i.type?o(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:i.custom_id,expression:\"item.custom_id\"}],attrs:{type:\"text\",title:\"Enter a custom item identifier\"},domProps:{value:i.custom_id},on:{input:function(t){t.target.composing||e.$set(i,\"custom_id\",t.target.value)}}}):e._e(),e._v(\" \"),\"empty\"!=i.type?[o(\"label\",[e._v(\"Count Min:\")]),e._v(\" \"),o(\"numeric-input\",{attrs:{min:0,max:i.count_max,title:\"Set the minimum possible count for this item\"},model:{value:i.count_min,callback:function(t){e.$set(i,\"count_min\",t)},expression:\"item.count_min\"}}),e._v(\" \"),o(\"label\",[e._v(\"Max:\")]),e._v(\" \"),o(\"numeric-input\",{attrs:{min:i.count_min,max:64,title:\"Set the maximum possible count for this item\"},model:{value:i.count_max,callback:function(t){e.$set(i,\"count_max\",t)},expression:\"item.count_max\"}})]:e._e(),e._v(\" \"),t.entries.length>1?[o(\"label\",[e._v(\"Probability:\")]),e._v(\" \"),o(\"numeric-input\",{attrs:{min:0,title:\"Increase the probability to make an item more likely to drop\"},model:{value:i.weight,callback:function(t){e.$set(i,\"weight\",t)},expression:\"item.weight\"}}),e._v(\" \"),o(\"div\",{staticClass:\"tool\",on:{click:function(e){return t.entries.remove(i)}}},[o(\"i\",{staticClass:\"material-icons\"},[e._v(\"clear\")])])]:e._e()],2)})),0),e._v(\" \"),o(\"button\",{on:{click:function(o){return e.addItem(t)}}},[e._v(\"Add Item\")]),e._v(\" \"),o(\"button\",{on:{click:function(o){return e.form.custom_loot.remove(t)}}},[e._v(\"Remove Pool\")])])})),0),e._v(\" \"),o(\"button\",{on:{click:function(t){return e.addPool()}}},[e._v(\"Add Pool\")])]:e._e()],2)])};p._withStripped=!0;let g={empty:\"Empty\",custom:\"Custom ID\",acacia_boat:\"Acacia Boat\",acacia_button:\"Acacia Button\",acacia_chest_boat:\"Acacia Chest Boat\",acacia_door:\"Acacia Door\",acacia_fence:\"Acacia Fence\",acacia_fence_gate:\"Acacia Fence Gate\",acacia_hanging_sign:\"Acacia Hanging Sign\",acacia_log:\"Acacia Log\",acacia_pressure_plate:\"Acacia Pressure Plate\",acacia_sign:\"Acacia Sign\",acacia_stairs:\"Acacia Stairs\",acacia_trapdoor:\"Acacia Trapdoor\",activator_rail:\"Activator Rail\",allay_spawn_egg:\"Allay Spawn Egg\",amethyst_block:\"Block of Amethyst\",amethyst_cluster:\"Amethyst Cluster\",amethyst_shard:\"Amethyst Shard\",ancient_debris:\"Ancient Debris\",andesite_stairs:\"Andesite Stairs\",angler_pottery_sherd:\"Angler Pottery Sherd\",anvil:\"Anvil\",apple:\"Apple\",archer_pottery_sherd:\"Archer Pottery Sherd\",armor_stand:\"Armor Stand\",arms_up_pottery_sherd:\"Arms Up Pottery Sherd\",arrow:\"Arrow\",axolotl_bucket:\"Axolotl Bucket\",axolotl_spawn_egg:\"Axolotl Spawn Egg\",azalea:\"Azalea\",azalea_leaves:\"Azalea Leaves\",azalea_leaves_flowered:\"Flowering Azalea Leaves\",baked_potato:\"Baked Potato\",bamboo:\"Bamboo\",bamboo_block:\"Block of Bamboo\",bamboo_button:\"Bamboo Button\",bamboo_chest_raft:\"Bamboo Chest Raft\",bamboo_door:\"Bamboo Door\",bamboo_double_slab:\"Bamboo Double Slab\",bamboo_fence:\"Bamboo Fence\",bamboo_fence_gate:\"Bamboo Fence Gate\",bamboo_hanging_sign:\"Bamboo Hanging Sign\",bamboo_mosaic:\"Bamboo Mosaic\",bamboo_mosaic_double_slab:\"Bamboo Mosaic Double Slab\",bamboo_mosaic_slab:\"Bamboo Mosaic Slab\",bamboo_mosaic_stairs:\"Bamboo Mosaic Stairs\",bamboo_planks:\"Bamboo Planks\",bamboo_pressure_plate:\"Bamboo Pressure Plate\",bamboo_raft:\"Bamboo Raft\",bamboo_sapling:\"Bamboo Sapling\",bamboo_sign:\"Bamboo Sign\",bamboo_slab:\"Bamboo Slab\",bamboo_stairs:\"Bamboo Stairs\",bamboo_trapdoor:\"Bamboo Trapdoor\",banner:\"Banner\",banner_pattern:\"Banner Pattern\",barrel:\"Barrel\",barrier:\"Barrier\",basalt:\"Basalt\",bat_spawn_egg:\"Bat Spawn Egg\",beacon:\"Beacon\",bed:\"Bed\",bedrock:\"Bedrock\",bee_nest:\"Bee Nest\",bee_spawn_egg:\"Bee Spawn Egg\",beef:\"Raw Beef\",beehive:\"Beehive\",beetroot:\"Beetroot\",beetroot_seeds:\"Beetroot Seeds\",beetroot_soup:\"Beetroot Soup\",bell:\"Bell\",big_dripleaf:\"Big Dripleaf\",birch_boat:\"Birch Boat\",birch_button:\"Birch Button\",birch_chest_boat:\"Birch Chest Boat\",birch_door:\"Birch Door\",birch_fence:\"Birch Fence\",birch_fence_gate:\"Birch Fence Gate\",birch_hanging_sign:\"Birch Hanging Sign\",birch_log:\"Birch Log\",birch_pressure_plate:\"Birch Pressure Plate\",birch_sign:\"Birch Sign\",birch_stairs:\"Birch Stairs\",birch_trapdoor:\"Birch Trapdoor\",black_candle:\"Black Candle\",black_candle_cake:\"Cake with Black Candle\",black_carpet:\"Black Carpet\",black_concrete:\"Black Concrete\",black_dye:\"Black Dye\",black_glazed_terracotta:\"Black Glazed Terracotta\",black_shulker_box:\"Black Shulker Box\",black_wool:\"Black Wool\",blackstone:\"Blackstone\",blackstone_double_slab:\"Blackstone Double Slab\",blackstone_slab:\"Blackstone Slab\",blackstone_stairs:\"Blackstone Stairs\",blackstone_wall:\"Blackstone Wall\",blade_pottery_sherd:\"Blade Pottery Sherd\",blast_furnace:\"Blast Furnace\",blaze_powder:\"Blaze Powder\",blaze_rod:\"Blaze Rod\",blaze_spawn_egg:\"Blaze Spawn Egg\",bleach:\"Bleach\",blue_candle:\"Blue Candle\",blue_candle_cake:\"Cake with Blue Candle\",blue_carpet:\"Blue Carpet\",blue_concrete:\"Blue Concrete\",blue_dye:\"Blue Dye\",blue_glazed_terracotta:\"Blue Glazed Terracotta\",blue_ice:\"Blue Ice\",blue_shulker_box:\"Blue Shulker Box\",blue_wool:\"Blue Wool\",boat:\"Boat\",bone:\"Bone\",bone_block:\"Bone Block\",bone_meal:\"Bone Meal\",book:\"Book\",bookshelf:\"Bookshelf\",border_block:\"Border\",bordure_indented_banner_pattern:\"Bordure Indented Banner Pattern\",bow:\"Bow\",bowl:\"Bowl\",brain_coral:\"Brain Coral\",bread:\"Bread\",brewer_pottery_sherd:\"Brewer Pottery Sherd\",brewing_stand:\"Brewing Stand\",brick:\"Brick\",brick_block:\"Brick Block\",brick_stairs:\"Brick Stairs\",brown_candle:\"Brown Candle\",brown_candle_cake:\"Cake with Brown Candle\",brown_carpet:\"Brown Carpet\",brown_concrete:\"Brown Concrete\",brown_dye:\"Brown Dye\",brown_glazed_terracotta:\"Brown Glazed Terracotta\",brown_mushroom:\"Brown Mushroom\",brown_mushroom_block:\"Brown Mushroom Block\",brown_shulker_box:\"Brown Shulker Box\",brown_wool:\"Brown Wool\",brush:\"Brush\",bubble_coral:\"Bubble Coral\",bucket:\"Bucket\",budding_amethyst:\"Budding Amethyst\",burn_pottery_sherd:\"Burn Pottery Sherd\",cactus:\"Cactus\",cake:\"Cake\",calcite:\"Calcite\",calibrated_sculk_sensor:\"Calibrated Sculk Sensor\",camel_spawn_egg:\"Camel Spawn Egg\",camera:\"Camera\",campfire:\"Campfire\",candle:\"Candle\",candle_cake:\"Cake with Candle\",carpet:\"Carpet\",carrot:\"Carrot\",carrot_on_a_stick:\"Carrot On A Stick\",carrots:\"Carrots\",cartography_table:\"Cartography Table\",carved_pumpkin:\"Carved Pumpkin\",cat_spawn_egg:\"Cat Spawn Egg\",cauldron:\"Cauldron\",cave_spider_spawn_egg:\"Cave Spider Spawn Egg\",cave_vines:\"Cave Vines\",cave_vines_body_with_berries:\"Cave Vines\",cave_vines_head_with_berries:\"Cave Vines\",chain:\"Chain\",chain_command_block:\"Chain Command Block\",chainmail_boots:\"Chain Boots\",chainmail_chestplate:\"Chain Chestplate\",chainmail_helmet:\"Chain Helmet\",chainmail_leggings:\"Chain Leggings\",charcoal:\"Charcoal\",chemical_heat:\"Chemical Heat\",chemistry_table:\"Chemistry Table\",cherry_boat:\"Cherry Boat\",cherry_button:\"Cherry Button\",cherry_chest_boat:\"Cherry Chest Boat\",cherry_door:\"Cherry Door\",cherry_double_slab:\"Cherry Double Slab\",cherry_fence:\"Cherry Fence\",cherry_fence_gate:\"Cherry Fence Gate\",cherry_hanging_sign:\"Cherry Hanging Sign\",cherry_leaves:\"Cherry Leaves\",cherry_log:\"Cherry Log\",cherry_planks:\"Cherry Planks\",cherry_pressure_plate:\"Cherry Pressure Plate\",cherry_sapling:\"Cherry Sapling\",cherry_sign:\"Cherry Sign\",cherry_slab:\"Cherry Slab\",cherry_stairs:\"Cherry Stairs\",cherry_trapdoor:\"Cherry Trapdoor\",cherry_wood:\"Cherry Wood\",chest:\"Chest\",chest_boat:\"Chest Boat\",chest_minecart:\"Minecart with Chest\",chicken:\"Raw Chicken\",chicken_spawn_egg:\"Chicken Spawn Egg\",chiseled_bookshelf:\"Chiseled Bookshelf\",chiseled_deepslate:\"Chiseled Deepslate\",chiseled_nether_bricks:\"Chiseled Nether Bricks\",chiseled_polished_blackstone:\"Chiseled Polished Blackstone\",chorus_flower:\"Chorus Flower\",chorus_fruit:\"Chorus Fruit\",chorus_plant:\"Chorus Plant\",clay:\"Clay Block\",clay_ball:\"Clay\",client_request_placeholder_block:\"Client Request Placeholder Block\",clock:\"Clock\",coal:\"Coal\",coal_block:\"Block of Coal\",coal_ore:\"Coal Ore\",coast_armor_trim_smithing_template:\"Coast Armor Trim Smithing Template\",cobbled_deepslate:\"Cobbled Deepslate\",cobbled_deepslate_double_slab:\"Cobbled Deepslate Double Slab\",cobbled_deepslate_slab:\"Cobbled Deepslate Slab\",cobbled_deepslate_stairs:\"Cobbled Deepslate Stairs\",cobbled_deepslate_wall:\"Cobbled Deepslate Wall\",cobblestone:\"Cobblestone\",cobblestone_wall:\"Cobblestone Wall\",cocoa:\"Cocoa\",cocoa_beans:\"Cocoa Beans\",cod:\"Cod\",cod_bucket:\"Cod Bucket\",cod_spawn_egg:\"Cod Spawn Egg\",colored_torch_bp:\"Colored Torch Bp\",colored_torch_rg:\"Colored Torch Rg\",command_block:\"Command Block\",command_block_minecart:\"Minecart with Command Block\",comparator:\"Redstone Comparator\",compass:\"Compass\",composter:\"Composter\",compound:\"Compound\",concrete:\"Concrete\",concrete_powder:\"Concrete Powder\",conduit:\"Conduit\",cooked_beef:\"Cooked Beef\",cooked_chicken:\"Cooked Chicken\",cooked_cod:\"Cooked Cod\",cooked_mutton:\"Cooked Mutton\",cooked_porkchop:\"Cooked Porkchop\",cooked_rabbit:\"Cooked Rabbit\",cooked_salmon:\"Cooked Salmon\",cookie:\"Cookie\",copper_block:\"Block of Copper\",copper_ingot:\"Copper Ingot\",copper_ore:\"Copper Ore\",coral:\"Coral\",coral_block:\"Coral Block\",coral_fan:\"Coral Fan\",coral_fan_dead:\"Coral Fan Dead\",coral_fan_hang:\"Coral Fan Hang\",cow_spawn_egg:\"Cow Spawn Egg\",cracked_deepslate_bricks:\"Cracked Deepslate Bricks\",cracked_deepslate_tiles:\"Cracked Deepslate Tiles\",cracked_nether_bricks:\"Cracked Nether Bricks\",cracked_polished_blackstone_bricks:\"Cracked Polished Blackstone Bricks\",crafting_table:\"Crafting Table\",creeper_banner_pattern:\"Creeper Banner Pattern\",creeper_spawn_egg:\"Creeper Spawn Egg\",crimson_button:\"Crimson Button\",crimson_door:\"Crimson Door\",crimson_double_slab:\"Crimson Slab\",crimson_fence:\"Crimson Fence\",crimson_fence_gate:\"Crimson Fence Gate\",crimson_fungus:\"Crimson Fungus\",crimson_hanging_sign:\"Crimson Hanging Sign\",crimson_hyphae:\"Crimson Hyphae\",crimson_nylium:\"Crimson Nylium\",crimson_planks:\"Crimson Planks\",crimson_pressure_plate:\"Crimson Pressure Plate\",crimson_roots:\"Crimson Roots\",crimson_sign:\"Crimson Sign\",crimson_slab:\"Crimson Slab\",crimson_stairs:\"Crimson Stairs\",crimson_stem:\"Crimson Stem\",crimson_trapdoor:\"Crimson Trapdoor\",crossbow:\"Crossbow\",crying_obsidian:\"Crying Obsidian\",cut_copper:\"Cut Copper\",cut_copper_slab:\"Cut Copper Slab\",cut_copper_stairs:\"Cut Copper Stairs\",cyan_candle:\"Cyan Candle\",cyan_candle_cake:\"Cake with Cyan Candle\",cyan_carpet:\"Cyan Carpet\",cyan_concrete:\"Cyan Concrete\",cyan_dye:\"Cyan Dye\",cyan_glazed_terracotta:\"Cyan Glazed Terracotta\",cyan_shulker_box:\"Cyan Shulker Box\",cyan_wool:\"Cyan Wool\",danger_pottery_sherd:\"Danger Pottery Sherd\",dark_oak_boat:\"Dark Oak Boat\",dark_oak_button:\"Dark Oak Button\",dark_oak_chest_boat:\"Dark Oak Chest Boat\",dark_oak_door:\"Dark Oak Door\",dark_oak_fence:\"Dark Oak Fence\",dark_oak_fence_gate:\"Dark Oak Fence Gate\",dark_oak_hanging_sign:\"Dark Oak Hanging Sign\",dark_oak_log:\"Dark Oak Log\",dark_oak_pressure_plate:\"Dark Oak Pressure Plate\",dark_oak_sign:\"Dark Oak Sign\",dark_oak_stairs:\"Dark Oak Stairs\",dark_oak_trapdoor:\"Dark Oak Trapdoor\",dark_prismarine_stairs:\"Dark Prismarine Stairs\",daylight_detector:\"Daylight Sensor\",daylight_detector_inverted:\"Daylight Detector Inverted\",dead_brain_coral:\"Dead Brain Coral\",dead_bubble_coral:\"Dead Bubble Coral\",dead_fire_coral:\"Dead Fire Coral\",dead_horn_coral:\"Dead Horn Coral\",dead_tube_coral:\"Dead Tube Coral\",deadbush:\"Dead Bush\",debug_stick:\"Debug Stick\",decorated_pot:\"Decorated Pot\",deepslate:\"Deepslate\",deepslate_brick_double_slab:\"Deepslate Brick Double Slab\",deepslate_brick_slab:\"Deepslate Brick Slab\",deepslate_brick_stairs:\"Deepslate Brick Stairs\",deepslate_brick_wall:\"Deepslate Brick Wall\",deepslate_bricks:\"Deepslate Bricks\",deepslate_coal_ore:\"Deepslate Coal Ore\",deepslate_copper_ore:\"Deepslate Copper Ore\",deepslate_diamond_ore:\"Deepslate Diamond Ore\",deepslate_emerald_ore:\"Deepslate Emerald Ore\",deepslate_gold_ore:\"Deepslate Gold Ore\",deepslate_iron_ore:\"Deepslate Iron Ore\",deepslate_lapis_ore:\"Deepslate Lapis Lazuli Ore\",deepslate_redstone_ore:\"Deepslate Redstone Ore\",deepslate_tile_double_slab:\"Deepslate Tile Double Slab\",deepslate_tile_slab:\"Deepslate Tile Slab\",deepslate_tile_stairs:\"Deepslate Tile Stairs\",deepslate_tile_wall:\"Deepslate Tile Wall\",deepslate_tiles:\"Deepslate Tiles\",deny:\"Deny\",detector_rail:\"Detector Rail\",diamond:\"Diamond\",diamond_axe:\"Diamond Axe\",diamond_block:\"Block of Diamond\",diamond_boots:\"Diamond Boots\",diamond_chestplate:\"Diamond Chestplate\",diamond_helmet:\"Diamond Helmet\",diamond_hoe:\"Diamond Hoe\",diamond_horse_armor:\"Diamond Horse Armor\",diamond_leggings:\"Diamond Leggings\",diamond_ore:\"Diamond Ore\",diamond_pickaxe:\"Diamond Pickaxe\",diamond_shovel:\"Diamond Shovel\",diamond_sword:\"Diamond Sword\",diorite_stairs:\"Diorite Stairs\",dirt:\"Dirt\",dirt_with_roots:\"Rooted Dirt\",disc_fragment_5:\"Disc Fragment 5\",dispenser:\"Dispenser\",dolphin_spawn_egg:\"Dolphin Spawn Egg\",donkey_spawn_egg:\"Donkey Spawn Egg\",double_cut_copper_slab:\"Double Cut Copper Slab\",double_plant:\"Plant\",double_stone_block_slab:\"Double Stone Block Slab\",double_wooden_slab:\"Double Wooden Slab\",dragon_breath:\"Dragon's Breath\",dragon_egg:\"Dragon Egg\",dried_kelp:\"Dried Kelp\",dried_kelp_block:\"Dried Kelp Block\",dripstone_block:\"Dripstone Block\",dropper:\"Dropper\",drowned_spawn_egg:\"Drowned Spawn Egg\",dune_armor_trim_smithing_template:\"Dune Armor Trim Smithing Template\",dye:\"Dye\",echo_shard:\"Echo Shard\",egg:\"Egg\",elder_guardian_spawn_egg:\"Elder Guardian Spawn Egg\",elytra:\"Elytra\",emerald:\"Emerald\",emerald_block:\"Block of Emerald\",emerald_ore:\"Emerald Ore\",empty_map:\"Empty Map\",enchanted_book:\"Enchanted Book\",enchanted_golden_apple:\"Enchanted Golden Apple\",enchanting_table:\"Enchantment Table\",end_brick_stairs:\"End Stone Brick Stairs\",end_bricks:\"End Stone Bricks\",end_crystal:\"End Crystal\",end_gateway:\"End Gateway\",end_portal:\"End Portal\",end_portal_frame:\"End Portal Frame\",end_rod:\"End Rod\",end_stone:\"End Stone\",ender_chest:\"Ender Chest\",ender_dragon_spawn_egg:\"Ender Dragon Spawn Egg\",ender_eye:\"Eye of Ender\",ender_pearl:\"Ender Pearl\",enderman_spawn_egg:\"Enderman Spawn Egg\",endermite_spawn_egg:\"Endermite Spawn Egg\",evoker_spawn_egg:\"Evoker Spawn Egg\",experience_bottle:\"Bottle o' Enchanting\",explorer_pottery_sherd:\"Explorer Pottery Sherd\",exposed_copper:\"Exposed Copper\",exposed_cut_copper:\"Exposed Cut Copper\",exposed_cut_copper_slab:\"Exposed Cut Copper Slab\",exposed_cut_copper_stairs:\"Exposed Cut Copper Stairs\",exposed_double_cut_copper_slab:\"Exposed Double Cut Copper Slab\",eye_armor_trim_smithing_template:\"Eye Armor Trim Smithing Template\",farmland:\"Farmland\",feather:\"Feather\",fence:\"Oak Fence\",fence_gate:\"Oak Fence Gate\",fermented_spider_eye:\"Fermented Spider Eye\",field_masoned_banner_pattern:\"Field Masoned Banner Pattern\",filled_map:\"Filled Map\",fire:\"Fire\",fire_charge:\"Fire Charge\",fire_coral:\"Fire Coral\",firework_rocket:\"Firework Rocket\",firework_star:\"Firework Star\",fishing_rod:\"Fishing Rod\",fletching_table:\"Fletching Table\",flint:\"Flint\",flint_and_steel:\"Flint and Steel\",flower_banner_pattern:\"Flower Banner Pattern\",flower_pot:\"Flower Pot\",flowering_azalea:\"Flowering Azalea\",flowing_lava:\"Lava\",flowing_water:\"Water\",fox_spawn_egg:\"Fox Spawn Egg\",frame:\"Item Frame\",friend_pottery_sherd:\"Friend Pottery Sherd\",frog_spawn:\"Frogspawn\",frog_spawn_egg:\"Frog Spawn Egg\",frosted_ice:\"Frosted Ice\",furnace:\"Furnace\",ghast_spawn_egg:\"Ghast Spawn Egg\",ghast_tear:\"Ghast Tear\",gilded_blackstone:\"Gilded Blackstone\",glass:\"Glass\",glass_bottle:\"Glass Bottle\",glass_pane:\"Glass Pane\",glistering_melon_slice:\"Glistering Melon Slice\",globe_banner_pattern:\"Globe Banner Pattern\",glow_frame:\"Glow Item Frame\",glow_ink_sac:\"Glow Ink Sac\",glow_lichen:\"Glow Lichen\",glow_squid_spawn_egg:\"Glow Squid Spawn Egg\",glow_stick:\"Glow Stick\",glowingobsidian:\"Glowingobsidian\",glowstone:\"Glowstone\",glowstone_dust:\"Glowstone Dust\",goat_horn:\"Goat Horn\",goat_spawn_egg:\"Goat Spawn Egg\",gold_block:\"Block of Gold\",gold_ingot:\"Gold Ingot\",gold_nugget:\"Gold Nugget\",gold_ore:\"Gold Ore\",golden_apple:\"Golden Apple\",golden_axe:\"Golden Axe\",golden_boots:\"Golden Boots\",golden_carrot:\"Golden Carrot\",golden_chestplate:\"Golden Chestplate\",golden_helmet:\"Golden Helmet\",golden_hoe:\"Golden Hoe\",golden_horse_armor:\"Golden Horse Armor\",golden_leggings:\"Golden Leggings\",golden_pickaxe:\"Golden Pickaxe\",golden_rail:\"Powered Rail\",golden_shovel:\"Golden Shovel\",golden_sword:\"Golden Sword\",granite_stairs:\"Granite Stairs\",grass:\"Grass Block\",grass_path:\"Dirt Path\",gravel:\"Gravel\",gray_candle:\"Gray Candle\",gray_candle_cake:\"Cake with Gray Candle\",gray_carpet:\"Gray Carpet\",gray_concrete:\"Gray Concrete\",gray_dye:\"Gray Dye\",gray_glazed_terracotta:\"Gray Glazed Terracotta\",gray_shulker_box:\"Gray Shulker Box\",gray_wool:\"Gray Wool\",green_candle:\"Green Candle\",green_candle_cake:\"Cake with Green Candle\",green_carpet:\"Green Carpet\",green_concrete:\"Green Concrete\",green_dye:\"Green Dye\",green_glazed_terracotta:\"Green Glazed Terracotta\",green_shulker_box:\"Green Shulker Box\",green_wool:\"Green Wool\",grindstone:\"Grindstone\",guardian_spawn_egg:\"Guardian Spawn Egg\",gunpowder:\"Gunpowder\",hanging_roots:\"Hanging Roots\",hard_glass:\"Hard Glass\",hard_glass_pane:\"Hard Glass Pane\",hard_stained_glass:\"Hard Stained Glass\",hard_stained_glass_pane:\"Hard Stained Glass Pane\",hardened_clay:\"Terracotta\",hay_block:\"Hay Bale\",heart_of_the_sea:\"Heart of the Sea\",heart_pottery_sherd:\"Heart Pottery Sherd\",heartbreak_pottery_sherd:\"Heartbreak Pottery Sherd\",heavy_weighted_pressure_plate:\"Weighted Pressure Plate (Heavy)\",hoglin_spawn_egg:\"Hoglin Spawn Egg\",honey_block:\"Honey Block\",honey_bottle:\"Honey Bottle\",honeycomb:\"Honeycomb\",honeycomb_block:\"Honeycomb Block\",hopper:\"Hopper\",hopper_minecart:\"Minecart with Hopper\",horn_coral:\"Horn Coral\",horse_spawn_egg:\"Horse Spawn Egg\",host_armor_trim_smithing_template:\"Host Armor Trim Smithing Template\",howl_pottery_sherd:\"Howl Pottery Sherd\",husk_spawn_egg:\"Husk Spawn Egg\",ice:\"Ice\",ice_bomb:\"Ice Bomb\",infested_deepslate:\"Infested Deepslate\",ink_sac:\"Ink Sac\",iron_axe:\"Iron Axe\",iron_bars:\"Iron Bars\",iron_block:\"Block of Iron\",iron_boots:\"Iron Boots\",iron_chestplate:\"Iron Chestplate\",iron_door:\"Iron Door\",iron_golem_spawn_egg:\"Iron Golem Spawn Egg\",iron_helmet:\"Iron Helmet\",iron_hoe:\"Iron Hoe\",iron_horse_armor:\"Iron Horse Armor\",iron_ingot:\"Iron Ingot\",iron_leggings:\"Iron Leggings\",iron_nugget:\"Iron Nugget\",iron_ore:\"Iron Ore\",iron_pickaxe:\"Iron Pickaxe\",iron_shovel:\"Iron Shovel\",iron_sword:\"Iron Sword\",iron_trapdoor:\"Iron Trapdoor\",jigsaw:\"Jigsaw Block\",jukebox:\"Jukebox\",jungle_boat:\"Jungle Boat\",jungle_button:\"Jungle Button\",jungle_chest_boat:\"Jungle Chest Boat\",jungle_door:\"Jungle Door\",jungle_fence:\"Jungle Fence\",jungle_fence_gate:\"Jungle Fence Gate\",jungle_hanging_sign:\"Jungle Hanging Sign\",jungle_log:\"Jungle Log\",jungle_pressure_plate:\"Jungle Pressure Plate\",jungle_sign:\"Jungle Sign\",jungle_stairs:\"Jungle Stairs\",jungle_trapdoor:\"Jungle Trapdoor\",kelp:\"Kelp\",ladder:\"Ladder\",lantern:\"Lantern\",lapis_block:\"Block of Lapis Lazuli\",lapis_lazuli:\"Lapis Lazuli\",lapis_ore:\"Lapis Lazuli Ore\",large_amethyst_bud:\"Large Amethyst Bud\",lava:\"Lava\",lava_bucket:\"Lava Bucket\",lead:\"Lead\",leather:\"Leather\",leather_boots:\"Leather Boots\",leather_chestplate:\"Leather Tunic\",leather_helmet:\"Leather Cap\",leather_horse_armor:\"Leather Horse Armor\",leather_leggings:\"Leather Pants\",leaves:\"Leaves\",lectern:\"Lectern\",lever:\"Lever\",light_block:\"Light Block\",light_blue_candle:\"Light Blue Candle\",light_blue_candle_cake:\"Cake with Light Blue Candle\",light_blue_carpet:\"Light Blue Carpet\",light_blue_concrete:\"Light Blue Concrete\",light_blue_dye:\"Light Blue Dye\",light_blue_glazed_terracotta:\"Light Blue Glazed Terracotta\",light_blue_shulker_box:\"Light Blue Shulker Box\",light_blue_wool:\"Light Blue Wool\",light_gray_candle:\"Light Gray Candle\",light_gray_candle_cake:\"Cake with Light Gray Candle\",light_gray_carpet:\"Light Gray Carpet\",light_gray_concrete:\"Light Gray Concrete\",light_gray_dye:\"Light Gray Dye\",light_gray_shulker_box:\"Light Gray Shulker Box\",light_gray_wool:\"Light Gray Wool\",light_weighted_pressure_plate:\"Weighted Pressure Plate (Light)\",lightning_rod:\"Lightning Rod\",lime_candle:\"Lime Candle\",lime_candle_cake:\"Cake with Lime Candle\",lime_carpet:\"Lime Carpet\",lime_concrete:\"Lime Concrete\",lime_dye:\"Lime Dye\",lime_glazed_terracotta:\"Lime Glazed Terracotta\",lime_shulker_box:\"Lime Shulker Box\",lime_wool:\"Lime Wool\",lingering_potion:\"Lingering Potion\",lit_blast_furnace:\"Lit Blast Furnace\",lit_deepslate_redstone_ore:\"Lit Deepslate Redstone Ore\",lit_furnace:\"Lit Furnace\",lit_pumpkin:\"Jack o'Lantern\",lit_redstone_lamp:\"Lit Redstone Lamp\",lit_redstone_ore:\"Lit Redstone Ore\",lit_smoker:\"Lit Smoker\",llama_spawn_egg:\"Llama Spawn Egg\",lodestone:\"Lodestone\",lodestone_compass:\"Lodestone Compass\",log:\"Log\",loom:\"Loom\",magenta_candle:\"Magenta Candle\",magenta_candle_cake:\"Cake with Magenta Candle\",magenta_carpet:\"Magenta Carpet\",magenta_concrete:\"Magenta Concrete\",magenta_dye:\"Magenta Dye\",magenta_glazed_terracotta:\"Magenta Glazed Terracotta\",magenta_shulker_box:\"Magenta Shulker Box\",magenta_wool:\"Magenta Wool\",magma:\"Magma Block\",magma_cream:\"Magma Cream\",magma_cube_spawn_egg:\"Magma Cube Spawn Egg\",mangrove_boat:\"Mangrove Boat\",mangrove_button:\"Mangrove Button\",mangrove_chest_boat:\"Mangrove Chest Boat\",mangrove_door:\"Mangrove Door\",mangrove_double_slab:\"Mangrove Double Slab\",mangrove_fence:\"Mangrove Fence\",mangrove_fence_gate:\"Mangrove Fence Gate\",mangrove_hanging_sign:\"Mangrove Hanging Sign\",mangrove_leaves:\"Mangrove Leaves\",mangrove_log:\"Mangrove Log\",mangrove_planks:\"Mangrove Planks\",mangrove_pressure_plate:\"Mangrove Pressure Plate\",mangrove_propagule:\"Mangrove Propagule\",mangrove_roots:\"Mangrove Roots\",mangrove_sign:\"Mangrove Sign\",mangrove_slab:\"Mangrove Slab\",mangrove_stairs:\"Mangrove Stairs\",mangrove_trapdoor:\"Mangrove Trapdoor\",mangrove_wood:\"Mangrove Wood\",medicine:\"Medicine\",medium_amethyst_bud:\"Medium Amethyst Bud\",melon_block:\"Melon\",melon_seeds:\"Melon Seeds\",melon_slice:\"Melon Slice\",melon_stem:\"Melon Stem\",milk_bucket:\"Milk Bucket\",minecart:\"Minecart\",miner_pottery_sherd:\"Miner Pottery Sherd\",mob_spawner:\"Monster Spawner\",mojang_banner_pattern:\"Mojang Banner Pattern\",monster_egg:\"Infested Stone\",mooshroom_spawn_egg:\"Mooshroom Spawn Egg\",moss_block:\"Moss Block\",moss_carpet:\"Moss Carpet\",mossy_cobblestone:\"Mossy Cobblestone\",mossy_cobblestone_stairs:\"Mossy Cobblestone Stairs\",mossy_stone_brick_stairs:\"Mossy Stone Brick Stairs\",mourner_pottery_sherd:\"Mourner Pottery Sherd\",moving_block:\"Moving Block\",mud:\"Mud\",mud_brick_double_slab:\"Mud Brick Double Slab\",mud_brick_slab:\"Mud Brick Slab\",mud_brick_stairs:\"Mud Brick Stairs\",mud_brick_wall:\"Mud Brick Wall\",mud_bricks:\"Mud Bricks\",muddy_mangrove_roots:\"Muddy Mangrove Roots\",mule_spawn_egg:\"Mule Spawn Egg\",mushroom_stew:\"Mushroom Stew\",music_disc_11:\"Music Disc 11\",music_disc_13:\"Music Disc 13\",music_disc_5:\"Music Disc 5\",music_disc_blocks:\"Music Disc Blocks\",music_disc_cat:\"Music Disc Cat\",music_disc_chirp:\"Music Disc Chirp\",music_disc_far:\"Music Disc Far\",music_disc_mall:\"Music Disc Mall\",music_disc_mellohi:\"Music Disc Mellohi\",music_disc_otherside:\"Music Disc Otherside\",music_disc_pigstep:\"Music Disc Pigstep\",music_disc_relic:\"Music Disc Relic\",music_disc_stal:\"Music Disc Stal\",music_disc_strad:\"Music Disc Strad\",music_disc_wait:\"Music Disc Wait\",music_disc_ward:\"Music Disc Ward\",mutton:\"Mutton\",mycelium:\"Mycelium\",name_tag:\"Name Tag\",nautilus_shell:\"Nautilus Shell\",nether_brick:\"Nether Brick Block\",nether_brick_fence:\"Nether Brick Fence\",nether_brick_stairs:\"Nether Brick Stairs\",nether_gold_ore:\"Nether Gold Ore\",nether_sprouts:\"Nether Sprouts\",nether_star:\"Nether Star\",nether_wart:\"Nether Wart\",nether_wart_block:\"Nether Wart Block\",netherbrick:\"Nether Brick\",netherite_axe:\"Netherite Axe\",netherite_block:\"Block of Netherite\",netherite_boots:\"Netherite Boots\",netherite_chestplate:\"Netherite Chestplate\",netherite_helmet:\"Netherite Helmet\",netherite_hoe:\"Netherite Hoe\",netherite_ingot:\"Netherite Ingot\",netherite_leggings:\"Netherite Leggings\",netherite_pickaxe:\"Netherite Pickaxe\",netherite_scrap:\"Netherite Scrap\",netherite_shovel:\"Netherite Shovel\",netherite_sword:\"Netherite Sword\",netherite_upgrade_smithing_template:\"Netherite Upgrade Smithing Template\",netherrack:\"Netherrack\",netherreactor:\"Nether Reactor Core\",normal_stone_stairs:\"Stone Stairs\",noteblock:\"Note Block\",npc_spawn_egg:\"Npc Spawn Egg\",oak_boat:\"Oak Boat\",oak_chest_boat:\"Oak Chest Boat\",oak_fence:\"Oak Fence\",oak_hanging_sign:\"Oak Hanging Sign\",oak_log:\"Oak Log\",oak_sign:\"Oak Sign\",oak_stairs:\"Oak Stairs\",observer:\"Observer\",obsidian:\"Obsidian\",ocelot_spawn_egg:\"Ocelot Spawn Egg\",ochre_froglight:\"Ochre Froglight\",orange_candle:\"Orange Candle\",orange_candle_cake:\"Cake with Orange Candle\",orange_carpet:\"Orange Carpet\",orange_concrete:\"Orange Concrete\",orange_dye:\"Orange Dye\",orange_glazed_terracotta:\"Orange Glazed Terracotta\",orange_shulker_box:\"Orange Shulker Box\",orange_wool:\"Orange Wool\",oxidized_copper:\"Oxidized Copper\",oxidized_cut_copper:\"Oxidized Cut Copper\",oxidized_cut_copper_slab:\"Oxidized Cut Copper Slab\",oxidized_cut_copper_stairs:\"Oxidized Cut Copper Stairs\",oxidized_double_cut_copper_slab:\"Oxidized Double Cut Copper Slab\",packed_ice:\"Packed Ice\",packed_mud:\"Packed Mud\",painting:\"Painting\",panda_spawn_egg:\"Panda Spawn Egg\",paper:\"Paper\",parrot_spawn_egg:\"Parrot Spawn Egg\",pearlescent_froglight:\"Pearlescent Froglight\",phantom_membrane:\"Phantom Membrane\",phantom_spawn_egg:\"Phantom Spawn Egg\",pig_spawn_egg:\"Pig Spawn Egg\",piglin_banner_pattern:\"Piglin Banner Pattern\",piglin_brute_spawn_egg:\"Piglin Brute Spawn Egg\",piglin_spawn_egg:\"Piglin Spawn Egg\",pillager_spawn_egg:\"Pillager Spawn Egg\",pink_candle:\"Pink Candle\",pink_candle_cake:\"Cake with Pink Candle\",pink_carpet:\"Pink Carpet\",pink_concrete:\"Pink Concrete\",pink_dye:\"Pink Dye\",pink_glazed_terracotta:\"Pink Glazed Terracotta\",pink_petals:\"Pink Petals\",pink_shulker_box:\"Pink Shulker Box\",pink_wool:\"Pink Wool\",piston:\"Piston\",pitcher_crop:\"Pitcher Crop\",pitcher_plant:\"Pitcher Plant\",pitcher_pod:\"Pitcher Pod\",planks:\"Wooden Planks\",plenty_pottery_sherd:\"Plenty Pottery Sherd\",podzol:\"Podzol\",pointed_dripstone:\"Pointed Dripstone\",poisonous_potato:\"Poisonous Potato\",polar_bear_spawn_egg:\"Polar Bear Spawn Egg\",polished_andesite_stairs:\"Polished Andesite Stairs\",polished_basalt:\"Polished Basalt\",polished_blackstone:\"Polished Blackstone\",polished_blackstone_brick_double_slab:\"Polished Blackstone Brick Double Slab\",polished_blackstone_brick_slab:\"Polished Blackstone Brick Slab\",polished_blackstone_brick_stairs:\"Polished Blackstone Brick Stairs\",polished_blackstone_brick_wall:\"Polished Blackstone Brick Wall\",polished_blackstone_bricks:\"Polished Blackstone Bricks\",polished_blackstone_button:\"Polished Blackstone Button\",polished_blackstone_double_slab:\"Polished Blackstone Double Slab\",polished_blackstone_pressure_plate:\"Polished Blackstone Pressure Plate\",polished_blackstone_slab:\"Polished Blackstone Slab\",polished_blackstone_stairs:\"Polished Blackstone Stairs\",polished_blackstone_wall:\"Polished Blackstone Wall\",polished_deepslate:\"Polished Deepslate\",polished_deepslate_double_slab:\"Polished Deepslate Double Slab\",polished_deepslate_slab:\"Polished Deepslate Slab\",polished_deepslate_stairs:\"Polished Deepslate Stairs\",polished_deepslate_wall:\"Polished Deepslate Wall\",polished_diorite_stairs:\"Polished Diorite Stairs\",polished_granite_stairs:\"Polished Granite Stairs\",popped_chorus_fruit:\"Popped Chorus Fruit\",porkchop:\"Raw Porkchop\",portal:\"Portal\",potato:\"Potato\",potion:\"Potion\",powder_snow:\"Powder Snow\",powder_snow_bucket:\"Powder Snow Bucket\",powered_comparator:\"Powered Comparator\",powered_repeater:\"Powered Repeater\",prismarine:\"Prismarine\",prismarine_bricks_stairs:\"Prismarine Brick Stairs\",prismarine_crystals:\"Prismarine Crystals\",prismarine_shard:\"Prismarine Shard\",prismarine_stairs:\"Prismarine Stairs\",prize_pottery_sherd:\"Prize Pottery Sherd\",pufferfish:\"Pufferfish\",pufferfish_bucket:\"Pufferfish Bucket\",pufferfish_spawn_egg:\"Pufferfish Spawn Egg\",pumpkin:\"Pumpkin\",pumpkin_pie:\"Pumpkin Pie\",pumpkin_seeds:\"Pumpkin Seeds\",pumpkin_stem:\"Pumpkin Stem\",purple_candle:\"Purple Candle\",purple_candle_cake:\"Cake with Purple Candle\",purple_carpet:\"Purple Carpet\",purple_concrete:\"Purple Concrete\",purple_dye:\"Purple Dye\",purple_glazed_terracotta:\"Purple Glazed Terracotta\",purple_shulker_box:\"Purple Shulker Box\",purple_wool:\"Purple Wool\",purpur_block:\"Purpur Block\",purpur_stairs:\"Purpur Stairs\",quartz:\"Nether Quartz\",quartz_block:\"Block of Quartz\",quartz_bricks:\"Quartz Bricks\",quartz_ore:\"Nether Quartz Ore\",quartz_stairs:\"Quartz Stairs\",rabbit:\"Raw Rabbit\",rabbit_foot:\"Rabbit's Foot\",rabbit_hide:\"Rabbit Hide\",rabbit_spawn_egg:\"Rabbit Spawn Egg\",rabbit_stew:\"Rabbit Stew\",rail:\"Rail\",raiser_armor_trim_smithing_template:\"Raiser Armor Trim Smithing Template\",rapid_fertilizer:\"Rapid Fertilizer\",ravager_spawn_egg:\"Ravager Spawn Egg\",raw_copper:\"Raw Copper\",raw_copper_block:\"Block of Raw Copper\",raw_gold:\"Raw Gold\",raw_gold_block:\"Block of Raw Gold\",raw_iron:\"Raw Iron\",raw_iron_block:\"Block of Raw Iron\",recovery_compass:\"Recovery Compass\",red_candle:\"Red Candle\",red_candle_cake:\"Cake with Red Candle\",red_carpet:\"Red Carpet\",red_concrete:\"Red Concrete\",red_dye:\"Red Dye\",red_flower:\"Flower\",red_glazed_terracotta:\"Red Glazed Terracotta\",red_mushroom:\"Red Mushroom\",red_mushroom_block:\"Red Mushroom Block\",red_nether_brick:\"Red Nether Brick\",red_nether_brick_stairs:\"Red Nether Brick Stairs\",red_sandstone:\"Red Sandstone\",red_sandstone_stairs:\"Red Sandstone Stairs\",red_shulker_box:\"Red Shulker Box\",red_wool:\"Red Wool\",redstone:\"Redstone Dust\",redstone_block:\"Block of Redstone\",redstone_lamp:\"Redstone Lamp\",redstone_ore:\"Redstone Ore\",redstone_torch:\"Redstone Torch\",redstone_wire:\"Redstone Dust\",reinforced_deepslate:\"Reinforced Deepslate\",repeater:\"Redstone Repeater\",repeating_command_block:\"Repeating Command Block\",reserved6:\"Reserved6\",respawn_anchor:\"Respawn Anchor\",rib_armor_trim_smithing_template:\"Rib Armor Trim Smithing Template\",rotten_flesh:\"Rotten Flesh\",saddle:\"Saddle\",salmon:\"Raw Salmon\",salmon_bucket:\"Salmon Bucket\",salmon_spawn_egg:\"Salmon Spawn Egg\",sand:\"Sand\",sandstone:\"Sandstone\",sandstone_stairs:\"Sandstone Stairs\",sapling:\"Sapling\",scaffolding:\"Scaffolding\",sculk:\"Sculk\",sculk_catalyst:\"Sculk Catalyst\",sculk_sensor:\"Sculk Sensor\",sculk_shrieker:\"Sculk Shrieker\",sculk_vein:\"Sculk Vein\",scute:\"Scute\",sea_lantern:\"Sea Lantern\",sea_pickle:\"Sea Pickle\",seagrass:\"Seagrass\",sentry_armor_trim_smithing_template:\"Sentry Armor Trim Smithing Template\",shaper_armor_trim_smithing_template:\"Shaper Armor Trim Smithing Template\",sheaf_pottery_sherd:\"Sheaf Pottery Sherd\",shears:\"Shears\",sheep_spawn_egg:\"Sheep Spawn Egg\",shelter_pottery_sherd:\"Shelter Pottery Sherd\",shield:\"Shield\",shroomlight:\"Shroomlight\",shulker_box:\"Shulker Box\",shulker_shell:\"Shulker Shell\",shulker_spawn_egg:\"Shulker Spawn Egg\",silence_armor_trim_smithing_template:\"Silence Armor Trim Smithing Template\",silver_glazed_terracotta:\"Silver Glazed Terracotta\",silverfish_spawn_egg:\"Silverfish Spawn Egg\",skeleton_horse_spawn_egg:\"Skeleton Horse Spawn Egg\",skeleton_spawn_egg:\"Skeleton Spawn Egg\",skull:\"Skull\",skull_banner_pattern:\"Skull Banner Pattern\",skull_pottery_sherd:\"Skull Pottery Sherd\",slime:\"Slime Block\",slime_ball:\"Slimeball\",slime_spawn_egg:\"Slime Spawn Egg\",small_amethyst_bud:\"Small Amethyst Bud\",small_dripleaf_block:\"Small Dripleaf\",smithing_table:\"Smithing Table\",smoker:\"Smoker\",smooth_basalt:\"Smooth Basalt\",smooth_quartz_stairs:\"Smooth Quartz Stairs\",smooth_red_sandstone_stairs:\"Smooth Red Sandstone Stairs\",smooth_sandstone_stairs:\"Smooth Sandstone Stairs\",smooth_stone:\"Smooth Stone\",sniffer_egg:\"Sniffer Egg\",sniffer_spawn_egg:\"Sniffer Spawn Egg\",snort_pottery_sherd:\"Snort Pottery Sherd\",snout_armor_trim_smithing_template:\"Snout Armor Trim Smithing Template\",snow:\"Snow\",snow_golem_spawn_egg:\"Snow Golem Spawn Egg\",snow_layer:\"Top Snow\",snowball:\"Snowball\",soul_campfire:\"Soul Campfire\",soul_fire:\"Soul Fire\",soul_lantern:\"Soul Lantern\",soul_sand:\"Soul Sand\",soul_soil:\"Soul Soil\",soul_torch:\"Soul Torch\",sparkler:\"Sparkler\",spawn_egg:\"Spawn Egg\",spider_eye:\"Spider Eye\",spider_spawn_egg:\"Spider Spawn Egg\",spire_armor_trim_smithing_template:\"Spire Armor Trim Smithing Template\",splash_potion:\"Splash Potion\",sponge:\"Sponge\",spore_blossom:\"Spore Blossom\",spruce_boat:\"Spruce Boat\",spruce_button:\"Spruce Button\",spruce_chest_boat:\"Spruce Chest Boat\",spruce_door:\"Spruce Door\",spruce_fence:\"Spruce Fence\",spruce_fence_gate:\"Spruce Fence Gate\",spruce_hanging_sign:\"Spruce Hanging Sign\",spruce_log:\"Spruce Log\",spruce_pressure_plate:\"Spruce Pressure Plate\",spruce_sign:\"Spruce Sign\",spruce_stairs:\"Spruce Stairs\",spruce_trapdoor:\"Spruce Trapdoor\",spyglass:\"Spyglass\",squid_spawn_egg:\"Squid Spawn Egg\",stained_glass:\"Stained Glass\",stained_glass_pane:\"Stained Glass Pane\",stained_hardened_clay:\"Terracotta\",standing_banner:\"Banner\",standing_sign:\"Sign\",stick:\"Stick\",sticky_piston:\"Sticky Piston\",stone:\"Stone\",stone_axe:\"Stone Axe\",stone_block_slab:\"Stone Block Slab\",stone_brick_stairs:\"Stone Brick Stairs\",stone_button:\"Stone Button\",stone_hoe:\"Stone Hoe\",stone_pickaxe:\"Stone Pickaxe\",stone_pressure_plate:\"Stone Pressure Plate\",stone_shovel:\"Stone Shovel\",stone_stairs:\"Cobblestone Stairs\",stone_sword:\"Stone Sword\",stonebrick:\"Stone Bricks\",stonecutter:\"Stonecutter\",stonecutter_block:\"Stonecutter\",stray_spawn_egg:\"Stray Spawn Egg\",strider_spawn_egg:\"Strider Spawn Egg\",stripped_acacia_log:\"Stripped Acacia Log\",stripped_bamboo_block:\"Block of Stripped Bamboo\",stripped_birch_log:\"Stripped Birch Log\",stripped_cherry_log:\"Stripped Cherry Log\",stripped_cherry_wood:\"Stripped Cherry Wood\",stripped_crimson_hyphae:\"Stripped Crimson Hyphae\",stripped_crimson_stem:\"Stripped Crimson Stem\",stripped_dark_oak_log:\"Stripped Dark Oak Log\",stripped_jungle_log:\"Stripped Jungle Log\",stripped_mangrove_log:\"Stripped Mangrove Log\",stripped_mangrove_wood:\"Stripped Mangrove Wood\",stripped_oak_log:\"Stripped Oak Log\",stripped_spruce_log:\"Stripped Spruce Log\",stripped_warped_hyphae:\"Stripped Warped Hyphae\",stripped_warped_stem:\"Stripped Warped Stem\",structure_block:\"Structure Block\",structure_void:\"Structure Void\",sugar:\"Sugar\",sugar_cane:\"Sugar Cane\",suspicious_gravel:\"Suspicious Gravel\",suspicious_sand:\"Suspicious Sand\",suspicious_stew:\"Suspicious Stew\",sweet_berries:\"Sweet Berries\",sweet_berry_bush:\"Sweet Berry Bush\",tadpole_bucket:\"Tadpole Bucket\",tadpole_spawn_egg:\"Tadpole Spawn Egg\",tallgrass:\"Grass\",target:\"Target\",tide_armor_trim_smithing_template:\"Tide Armor Trim Smithing Template\",tinted_glass:\"Tinted Glass\",tnt:\"TNT\",tnt_minecart:\"Minecart with TNT\",torch:\"Torch\",torchflower:\"Torchflower\",torchflower_crop:\"Torchflower Crop\",torchflower_seeds:\"Torchflower Seeds\",totem_of_undying:\"Totem Of Undying\",trader_llama_spawn_egg:\"Trader Llama Spawn Egg\",trapdoor:\"Oak Trapdoor\",trapped_chest:\"Trapped Chest\",trident:\"Trident\",trip_wire:\"Trip Wire\",tripwire_hook:\"Tripwire Hook\",tropical_fish:\"Tropical Fish\",tropical_fish_bucket:\"Tropical Fish Bucket\",tropical_fish_spawn_egg:\"Tropical Fish Spawn Egg\",tube_coral:\"Tube Coral\",tuff:\"Tuff\",turtle_egg:\"Sea Turtle Egg\",turtle_helmet:\"Turtle Shell\",turtle_spawn_egg:\"Turtle Spawn Egg\",twisting_vines:\"Twisting Vines\",underwater_torch:\"Underwater Torch\",undyed_shulker_box:\"Undyed Shulker Box\",unknown:\"Unknown\",unlit_redstone_torch:\"Redstone Torch\",unpowered_comparator:\"Unpowered Comparator\",unpowered_repeater:\"Unpowered Repeater\",verdant_froglight:\"Verdant Froglight\",vex_armor_trim_smithing_template:\"Vex Armor Trim Smithing Template\",vex_spawn_egg:\"Vex Spawn Egg\",villager_spawn_egg:\"Villager Spawn Egg\",vindicator_spawn_egg:\"Vindicator Spawn Egg\",vine:\"Vines\",wall_banner:\"Wall Banner\",wandering_trader_spawn_egg:\"Wandering Trader Spawn Egg\",ward_armor_trim_smithing_template:\"Ward Armor Trim Smithing Template\",warden_spawn_egg:\"Warden Spawn Egg\",warped_button:\"Warped Button\",warped_door:\"Warped Door\",warped_double_slab:\"Warped Slab\",warped_fence:\"Warped Fence\",warped_fence_gate:\"Warped Fence Gate\",warped_fungus:\"Warped Fungus\",warped_fungus_on_a_stick:\"Warped Fungus on a Stick\",warped_hanging_sign:\"Warped Hanging Sign\",warped_hyphae:\"Warped Hyphae\",warped_nylium:\"Warped Nylium\",warped_planks:\"Warped Planks\",warped_pressure_plate:\"Warped Pressure Plate\",warped_roots:\"Warped Roots\",warped_sign:\"Warped Sign\",warped_slab:\"Warped Slab\",warped_stairs:\"Warped Stairs\",warped_stem:\"Warped Stem\",warped_trapdoor:\"Warped Trapdoor\",warped_wart_block:\"Warped Wart Block\",water:\"Water\",water_bucket:\"Water Bucket\",waterlily:\"Lily Pad\",waxed_copper:\"Waxed Block of Copper\",waxed_cut_copper:\"Waxed Cut Copper\",waxed_cut_copper_slab:\"Waxed Cut Copper Slab\",waxed_cut_copper_stairs:\"Waxed Cut Copper Stairs\",waxed_double_cut_copper_slab:\"Waxed Double Cut Copper Slab\",waxed_exposed_copper:\"Waxed Exposed Copper\",waxed_exposed_cut_copper:\"Waxed Exposed Cut Copper\",waxed_exposed_cut_copper_slab:\"Waxed Exposed Cut Copper Slab\",waxed_exposed_cut_copper_stairs:\"Waxed Exposed Cut Copper Stairs\",waxed_exposed_double_cut_copper_slab:\"Waxed Exposed Double Cut Copper Slab\",waxed_oxidized_copper:\"Waxed Oxidized Copper\",waxed_oxidized_cut_copper:\"Waxed Oxidized Cut Copper\",waxed_oxidized_cut_copper_slab:\"Waxed Oxidized Cut Copper Slab\",waxed_oxidized_cut_copper_stairs:\"Waxed Oxidized Cut Copper Stairs\",waxed_oxidized_double_cut_copper_slab:\"Waxed Oxidized Double Cut Copper Slab\",waxed_weathered_copper:\"Waxed Weathered Copper\",waxed_weathered_cut_copper:\"Waxed Weathered Cut Copper\",waxed_weathered_cut_copper_slab:\"Waxed Weathered Cut Copper Slab\",waxed_weathered_cut_copper_stairs:\"Waxed Weathered Cut Copper Stairs\",waxed_weathered_double_cut_copper_slab:\"Waxed Weathered Double Cut Copper Slab\",wayfinder_armor_trim_smithing_template:\"Wayfinder Armor Trim Smithing Template\",weathered_copper:\"Weathered Copper\",weathered_cut_copper:\"Weathered Cut Copper\",weathered_cut_copper_slab:\"Weathered Cut Copper Slab\",weathered_cut_copper_stairs:\"Weathered Cut Copper Stairs\",weathered_double_cut_copper_slab:\"Weathered Double Cut Copper Slab\",web:\"Cobweb\",weeping_vines:\"Weeping Vines\",wheat:\"Wheat\",wheat_seeds:\"Seeds\",white_candle:\"White Candle\",white_candle_cake:\"Cake with White Candle\",white_carpet:\"White Carpet\",white_concrete:\"White Concrete\",white_dye:\"White Dye\",white_glazed_terracotta:\"White Glazed Terracotta\",white_shulker_box:\"White Shulker Box\",white_wool:\"White Wool\",wild_armor_trim_smithing_template:\"Wild Armor Trim Smithing Template\",witch_spawn_egg:\"Witch Spawn Egg\",wither_rose:\"Wither Rose\",wither_skeleton_spawn_egg:\"Wither Skeleton Spawn Egg\",wither_spawn_egg:\"Wither Spawn Egg\",wolf_spawn_egg:\"Wolf Spawn Egg\",wood:\"Wood\",wooden_axe:\"Wooden Axe\",wooden_button:\"Oak Button\",wooden_door:\"Oak Door\",wooden_hoe:\"Wooden Hoe\",wooden_pickaxe:\"Wooden Pickaxe\",wooden_pressure_plate:\"Oak Pressure Plate\",wooden_shovel:\"Wooden Shovel\",wooden_slab:\"Wood Slab\",wooden_sword:\"Wooden Sword\",wool:\"Wool\",writable_book:\"Book & Quill\",written_book:\"Written Book\",yellow_candle:\"Yellow Candle\",yellow_candle_cake:\"Cake with Yellow Candle\",yellow_carpet:\"Yellow Carpet\",yellow_concrete:\"Yellow Concrete\",yellow_dye:\"Yellow Dye\",yellow_flower:\"Flower\",yellow_glazed_terracotta:\"Yellow Glazed Terracotta\",yellow_shulker_box:\"Yellow Shulker Box\",yellow_wool:\"Yellow Wool\",zoglin_spawn_egg:\"Zoglin Spawn Egg\",zombie_horse_spawn_egg:\"Zombie Horse Spawn Egg\",zombie_pigman_spawn_egg:\"Zombie Pigman Spawn Egg\",zombie_spawn_egg:\"Zombie Spawn Egg\",zombie_villager_spawn_egg:\"Zombie Villager Spawn Egg\"};var u=r({name:\"loot-editor\",props:{form:Object},data:()=>({item_ids:g}),methods:{addPool(){this.form.custom_loot.forEachReverse((e=>{0!=e.max&&\"\"!=e.id||this.form.custom_loot.remove(e)}));let e={uuid:guid(),rolls:1,entries:[]};this.form.custom_loot.push(e),this.addItem(e)},addItem(e){e.entries.forEachReverse((t=>{0!=t.max&&\"\"!=t.id||e.entries.remove(t)}));let t={type:\"empty\",custom_id:\"\",uuid:guid(),count_min:1,count_max:1,weight:1};e.entries.push(t)},getItemIcon(e){if(!(e=e.replace(/^minecraft:/,\"\")).includes(\":\")&&g[e])return`https://raw.githubusercontent.com/Mojang/bedrock-samples/main/resource_pack/textures/items/${e}.png`}}},p,[function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"section\",[o(\"p\",{staticClass:\"description\"},[e._v(\"Select which items the block will drop when broken in survival mode\")])])}],!1,(function(e){var t=o(410);t.__inject__&&t.__inject__(e)}),null,\"95345396\");u.options.__file=\"src/dialog/LootEditor.vue\";const b=u.exports;var h=o(908);const f={installed:!1,initialized:!1,icon:\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=\",async open(e,t){if(!f.initialized){let e=o(317);await new Promise((t=>{e.exec(\"code --version\").on(\"close\",(o=>{o||(f.installed=!0,f.launch=(t,o)=>{let i=`code -n \"${t}\" \"${o}\"`;e.exec(i)},t())}))})),f.initialized=!0}f.launch(e,t)},launch(){Blockbench.openLink(\"https://code.visualstudio.com\")}},v={name:\"block-wizard-dialog\",components:{Export:l,ColorPicker:m,LootEditor:b,\"select-input\":Vue.options.components[\"select-input\"]},data:()=>({open_page:\"metadata\",block_break_texture:\"data:image/png;base64,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\",VSCode:f,pages:i,presets:h.A,edition_options:{bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"},inventory_categories:{hidden:\"Hidden\",construction:\"Construction\",equipment:\"Equipment\",items:\"Items\",nature:\"Nature\"},inventory_groups:{hidden:{none:\"None\"},construction:{none:\"None\",\"itemGroup.name.planks\":\"Planks\",\"itemGroup.name.walls\":\"Walls\",\"itemGroup.name.fence\":\"Fences\",\"itemGroup.name.fenceGate\":\"Fence Gates\",\"itemGroup.name.stairs\":\"Stairs\",\"itemGroup.name.door\":\"Doors\",\"itemGroup.name.glass\":\"Glass\",\"itemGroup.name.glassPane\":\"Glass Panes\",\"itemGroup.name.slab\":\"Slabs\",\"itemGroup.name.stoneBrick\":\"Decorative Stone\",\"itemGroup.name.sandstone\":\"Sandstone\",\"itemGroup.name.wool\":\"Wool\",\"itemGroup.name.woolCarpet\":\"Wool Carpet\",\"itemGroup.name.concretePowder\":\"Concrete Powder\",\"itemGroup.name.concrete\":\"Concrete\",\"itemGroup.name.stainedClay\":\"Terracotta\",\"itemGroup.name.glazedTerracotta\":\"Glazed Terracottas\",\"itemGroup.name.permission\":\"Permission Blocks\"},equipment:{none:\"None\",\"itemGroup.name.helmet\":\"Helmets\",\"itemGroup.name.chestplate\":\"Chestplates\",\"itemGroup.name.leggings\":\"Leggings\",\"itemGroup.name.boots\":\"Boots\",\"itemGroup.name.sword\":\"Swords\",\"itemGroup.name.axe\":\"Axes\",\"itemGroup.name.pickaxe\":\"Pickaxes\",\"itemGroup.name.shovel\":\"Shovels\",\"itemGroup.name.hoe\":\"Hoes\",\"itemGroup.name.arrow\":\"Arrows\",\"itemGroup.name.cookedFood\":\"Cooked Food\",\"itemGroup.name.miscFood\":\"Miscellaneous Foods\",\"itemGroup.name.goatHorn\":\"Goat Horns\",\"itemGroup.name.horseArmor\":\"Horse Armor\",\"itemGroup.name.potion\":\"Potions\",\"itemGroup.name.splashPotion\":\"Splash Potions\",\"itemGroup.name.lingeringPotion\":\"Lingering Potions\"},items:{none:\"None\",\"itemGroup.name.bed\":\"Beds\",\"itemGroup.name.candles\":\"Candles\",\"itemGroup.name.anvil\":\"Anvils\",\"itemGroup.name.chest\":\"Chests\",\"itemGroup.name.shulkerBox\":\"Shulker Boxes\",\"itemGroup.name.record\":\"Records\",\"itemGroup.name.sign\":\"Signs\",\"itemGroup.name.skull\":\"Mob Skulls\",\"itemGroup.name.buttons\":\"Buttons\",\"itemGroup.name.boat\":\"Boats\",\"itemGroup.name.rail\":\"Rails\",\"itemGroup.name.minecart\":\"Minecarts\",\"itemGroup.name.pressurePlate\":\"Pressure Plates\",\"itemGroup.name.trapdoor\":\"Trapdoors\",\"itemGroup.name.enchantedBook\":\"Enchanted Books\",\"itemGroup.name.banner_pattern\":\"Banner Patterns\",\"itemGroup.name.banner\":\"Banners\",\"itemGroup.name.firework\":\"Fireworks\",\"itemGroup.name.fireworkStars\":\"Firework Charges\",\"itemGroup.name.chalkboard\":\"Chalkboards\"},nature:{none:\"None\",\"itemGroup.name.dye\":\"Dyes\",\"itemGroup.name.ore\":\"Ores\",\"itemGroup.name.stone\":\"Stone\",\"itemGroup.name.log\":\"Logs\",\"itemGroup.name.wood\":\"Woods\",\"itemGroup.name.leaves\":\"Leaves\",\"itemGroup.name.sapling\":\"Saplings\",\"itemGroup.name.seed\":\"Seeds\",\"itemGroup.name.crop\":\"Crops\",\"itemGroup.name.grass\":\"Ground Cover\",\"itemGroup.name.flower\":\"Flowers\",\"itemGroup.name.rawFood\":\"Raw Food\",\"itemGroup.name.mushroom\":\"Mushrooms\",\"itemGroup.name.monsterStoneEgg\":\"Infested Stone\",\"itemGroup.name.mobEgg\":\"Mob Eggs\",\"itemGroup.name.coral\":\"Coral Blocks\",\"itemGroup.name.coral_decorations\":\"Coral Decorations\",\"itemGroup.name.sculk\":\"Sculk\",\"itemGroup.name.netherWartBlock\":\"Nether Warts\"}},block_materials:{alpha_test:\"Allow Transparency (Alpha Test)\",alpha_test_single_sided:\"Allow Transparency, One-Sided\",blend:\"Allow Translucency (Blend)\",opaque:\"No Transparency (Opaque)\"},tint_methods:{none:\"None\",water:\"Water\",grass:\"Grass\",default_foliage:\"Default Foliage\",dry_foliage:\"Dry Foliage\",birch_foliage:\"Birch Foliage\",evergreen_foliage:\"Evergreen Foliage\"},block_sounds:{stone:\"Stone\",metal:\"Metal\",cloth:\"Cloth\",grass:\"Grass\",glass:\"Glass\",wood:\"Wood\",gravel:\"Gravel\",sand:\"Sand\",snow:\"Snow\",azalea_leaves:\"Leaves\",amethyst_block:\"Amethyst Block\",amethyst_cluster:\"Amethyst Cluster\",ancient_debris:\"Ancient Debris\",anvil:\"Anvil\",azalea:\"Azalea\",bamboo_sapling:\"Bamboo Sapling\",bamboo:\"Bamboo\",basalt:\"Basalt\",big_dripleaf:\"Big Dripleaf\",bone_block:\"Bone Block\",calcite:\"Calcite\",candle:\"Candle\",cave_vines:\"Cave Vines\",chain:\"Chain\",comparator:\"Comparator\",copper:\"Copper\",coral:\"Coral\",deepslate_bricks:\"Deepslate Bricks\",deepslate:\"Deepslate\",dirt_with_roots:\"Dirt With Roots\",dripstone_block:\"Dripstone Block\",fungus:\"Fungus\",hanging_roots:\"Hanging Roots\",honey_block:\"Honey Block\",itemframe:\"Itemframe\",ladder:\"Ladder\",lantern:\"Lantern\",large_amethyst_bud:\"Large Amethyst Bud\",medium_amethyst_bud:\"Medium Amethyst Bud\",moss_block:\"Moss Block\",moss_carpet:\"Moss Carpet\",nether_brick:\"Nether Brick\",nether_gold_ore:\"Nether Gold Ore\",nether_sprouts:\"Nether Sprouts\",nether_wart:\"Nether Wart\",netherite:\"Netherite\",netherrack:\"Netherrack\",nylium:\"Nylium\",pointed_dripstone:\"Pointed Dripstone\",powder_snow:\"Powder Snow\",roots:\"Roots\",scaffolding:\"Scaffolding\",shroomlight:\"Shroomlight\",slime:\"Slime\",small_amethyst_bud:\"Small Amethyst Bud\",soul_sand:\"Soul Sand\",soul_soil:\"Soul Soil\",spore_blossom:\"Spore Blossom\",stem:\"Stem\",sweet_berry_bush:\"Sweet Berry Bush\",tuff:\"Tuff\",vines:\"Vines\"},rotation_options:{none:\"None\",cardinal:\"Cardinal (Like a Furnace)\",facing:\"Facing (Like a Piston)\",pillar:\"Pillar (Like a Log)\"},collision_options:{full:\"Full Block\",none:\"No Collision\",slab:\"Slab\",stairs:\"Stairs\",post:\"Post\",fence:\"Fence\",small:\"Small\",carpet:\"Carpet\"},selection_box_options:{collision:\"Same as Collision\",full:\"Full Block\",none:\"Not Selectable\",slab:\"Slab\",post:\"Post\",small:\"Small\",carpet:\"Carpet\"},tool_options:{none:\"None\",axe:\"Axe\",pickaxe:\"Pickaxe\",shovel:\"Shovel\",sword:\"Sword\",hoe:\"Hoe\",shears:\"Shears\"},tier_options:{none:\"Any\",wood:\"Wood\",stone:\"Stone\",copper:\"Copper\",gold:\"Gold\",iron:\"Iron\",diamond:\"Diamond\",netherite:\"Netherite\"},liquid_touches_options:{blocking:\"Block Liquid\",broken:\"Break\",popped:\"Break and Drop\",no_reaction:\"Flow Through\"},preset_search_term:\"\",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,current_tab_model:\"\",past_preset:!1,form:{edition:localStorage.getItem(\"minecraft_wizard.selected_edition\")||\"bedrock\",identifier:\"\",display_name:\"\",category:\"construction\",item_group:\"none\",preset:\"stone\",rotation:\"none\",collision:\"full\",selection_box:\"collision\",mineable:!0,destroy_time:1,destroy_tool:\"none\",destroy_tier:\"none\",explodable:!0,explosion_resistance:30,breathable:!1,friction:.4,on_liquid_touches:\"blocking\",can_contain_liquid:!1,redstone_conductor:!1,flammable:!1,fire_destroy_chance:20,fire_catch_chance:5,use_current_model:!1,random_offset_range:0,material:\"alpha_test\",fade_to_opaque:!1,tint_method:\"none\",face_dimming:!0,ambient_occlusion:!0,light_emission:0,light_dampening:15,map_color:\"#ffffff\",uv_lock:!1,sound:\"stone\",loot_type:\"default\",custom_loot:[],export_mode:isApp?\"folder\":\"mcaddon\",pack_name:\"\",pack_authors:\"\",pack_icon:\"\",integrate_pack:null}}),computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?\"Use a different namespace than 'minecraft:'\":e.match(/[A-Z]/)?\"Identifiers cannot contain capital letters\":e.match(/^\\d/)?\"Identifiers cannot start with a number\":e.match(/[^a-z0-9-_.:]/)?\"Identifiers cannot contain spaces or special characters\":e.match(/\\w:\\w/)?\"\":\"Identifiers must start with a namespace, separated by a colon\":\"\"}},methods:{selectPreset(e){if(this.past_preset&&!confirm(\"Are you sure you want to go back and apply this preset? It may override some of the values that you have set.\"))return;this.past_preset=!1,this.form.preset=e;let t=this.presets[e];void 0!==t.rotation&&(this.form.rotation=t.rotation),void 0!==t.collision&&(this.form.collision=t.collision),void 0!==t.selection_box&&(this.form.selection_box=t.selection_box),void 0!==t.uv_lock&&(this.form.uv_lock=t.uv_lock),void 0!==t.mineable&&(this.form.mineable=t.mineable),void 0!==t.destroy_time&&(this.form.destroy_time=t.destroy_time),void 0!==t.destroy_tool&&(this.form.destroy_tool=t.destroy_tool),void 0!==t.destroy_tier&&(this.form.destroy_tier=t.destroy_tier),void 0!==t.explodable&&(this.form.explodable=t.explodable),void 0!==t.explosion_resistance&&(this.form.explosion_resistance=t.explosion_resistance),void 0!==t.breathable&&(this.form.breathable=t.breathable),void 0!==t.friction&&(this.form.friction=t.friction),void 0!==t.flammable&&(this.form.flammable=t.flammable),void 0!==t.fire_destroy_chance&&(this.form.fire_destroy_chance=t.fire_destroy_chance),void 0!==t.fire_catch_chance&&(this.form.fire_catch_chance=t.fire_catch_chance),void 0!==t.light_emission&&(this.form.light_emission=t.light_emission),void 0!==t.light_dampening&&(this.form.light_dampening=t.light_dampening),void 0!==t.material&&(this.form.material=t.material),void 0!==t.fade_to_opaque&&(this.form.fade_to_opaque=t.fade_to_opaque),void 0!==t.tint_method&&(this.form.tint_method=t.tint_method),void 0!==t.random_offset_range&&(this.form.random_offset_range=t.random_offset_range),void 0!==t.face_dimming&&(this.form.face_dimming=t.face_dimming),void 0!==t.ambient_occlusion&&(this.form.ambient_occlusion=t.ambient_occlusion),void 0!==t.map_color&&(this.form.map_color=t.map_color),void 0!==t.sound&&(this.form.sound=t.sound)},checkPageComplete(){let{form:e}=this;if(\"metadata\"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage(\"Please enter a name\"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage(\"Please enter a correct identifier\"),!1}else if(\"preset\"==this.open_page){if(!e.preset)return Blockbench.showQuickMessage(\"Please select a block preset\"),!1}else if(\"spawn_egg\"==this.open_page);else if(\"export\"==this.open_page){if(\"integrate\"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage(\"Please select a behavior pack\"),!1;if(\"integrate_mcaddon\"==e.export_mode&&!window.BlockWizardProject.previous_mcaddon)return Blockbench.showQuickMessage(\"Please select an mcaddon file\"),!1;if(!e.export_mode.includes(\"integrate\")&&!e.pack_name)return Blockbench.showQuickMessage(\"Please enter a pack name\"),!1;if(!e.export_mode.includes(\"integrate\")&&e.pack_name.match(/[<>:\"/\\\\|?*]/))return Blockbench.showQuickMessage(\"You cannot use invalid characters in the pack name: \"+e.pack_name.match(/[<>:\"/\\\\|?*]/)[0]),!1}return!0},exportPacks(){(0,t.exportPack)(this.form,{}).then((e=>{this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,\"integrate\"===this.form.export_mode?Blockbench.showQuickMessage(\"Integrated into Resource and Behavior Pack\"):(Blockbench.notification(\"Export Successful\",\"Exported resource and behavior pack\"),Blockbench.showQuickMessage(\"Exported Resource and Behavior Pack\"))})),localStorage.setItem(\"minecraft_wizard.selected_edition\",this.form.edition)},openInstallInstructions(e){!function(e){new Dialog({title:\"Add-on Installation Instructions\",singleButton:!0,width:660,lines:[e.includes(\"mcaddon\")?$('<p style=\"line-height: normal;margin: 10px 0;\">To import the packs into Minecraft, open the downloaded .mcaddon file.</p>')[0]:\"\",$('<p style=\"line-height: normal;margin: 10px 0;\">To enable the addon, you need to add it to your Minecraft world.\\n\\t\\t\\t\\tOpen your world settings and locate the Behavior Packs section.\\n\\t\\t\\t\\tFind your new pack and activate it.\\n\\t\\t\\t\\tEnabling the behavior pack will also automatically activate the resource pack.</p>\\n\\t\\t\\t')[0],Interface.createElement(\"img\",{src:\"data:image/png;base64,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\",style:\"image-rendering: auto; max-width: 100%;\",width:\"660px\"})]}).show()}(e)},switchPage(e){let t=Object.keys(this.pages);if(t.indexOf(e)-t.indexOf(this.open_page)>0){\"preset\"==this.open_page&&(this.past_preset=!0);let o=t.indexOf(this.open_page);for(;this.open_page!=e;){if(o++,!this.checkPageComplete())return!1;\"export\"==t[o-1]&&this.exportPacks(),this.open_page=t[o]}}this.open_page=e},nextPage(){let e=Object.keys(this.pages),o=e[e.indexOf(this.open_page)+1];o?Dialog.open.sidebar.setPage(o):(0,t.openExportedFiles)(this.form,this.resource_pack_path)},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&Dialog.open.sidebar.setPage(t)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||\"myname\")+\":\"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,\"_\").replace(/[^a-z0-9_:]/g,\"\"),this.form.identifier=e},inputExplosionResistance(e){this.form.explosion_resistance=Math.pow(parseFloat(e.target.value),24)-1;let t=this.form.explosion_resistance<10?10:1;this.form.explosion_resistance>20&&(t=.5),this.form.explosion_resistance>200&&(t=.1),this.form.explosion_resistance>2e3&&(t=.01),this.form.explosion_resistance=Math.clamp(Math.round(this.form.explosion_resistance*t)/t,0,1e4)},getThumbnail:e=>`url('${e}')`,copySummonCommand(){let e=`/setblock ~ ~ ~ ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage(\"Command copied to clipboard\")}},mounted(){$(this.$refs.map_color).spectrum({preferredFormat:\"hex\",color:this.form.map_color,showAlpha:!1,showInput:!0,move:e=>{this.form.map_color=e.toHexString()},change:e=>{this.form.map_color=e.toHexString()}})}};var w=r(v,e,[function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"section\",[o(\"p\",{staticClass:\"description\"},[e._v(\"Select a block preset to get started!\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Random Offset\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Randomly offset the model to the side to break up patterns. Minecraft uses this for flowers. The specified value is the offset range in pixels.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Friction\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select the friction of the block. Friction affects an entity's movement speed when walking on the block. Low friction blocks are slippery like ice.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"ul\",{attrs:{id:\"block_friction_markers\"}},[o(\"li\",[e._v(\"Like Ice\")]),e._v(\" \"),o(\"li\",[e._v(\"Normal\")]),e._v(\" \"),o(\"li\",[e._v(\"Like Soul Sand\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Can Contain Liquid\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Whether the block can contain water\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Conduct Redstone\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Select if redstone can pass through the block\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Flammable\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Whether the block can burn\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Fire Catch Chance\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Chance that this block will catch fire when it's next to fire. Wood has a chance of 5. Higher values increase the chance of catching on fire.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Fire Destroy Chance\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Chance that this block will be destroyed when on fire. Wood has a chance of 20. Higher values increase the chance of getting destroyed. If the value is 0, the block will burn forever.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Mineable\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Destroy Time\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The time it takes to mine the block, without a tool, in seconds.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Destructible by Explosion\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Explosion Resistance\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The resistance of the block against explosions, where a value of 0 is like glass, and a value of 30 is like stone.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"ul\",{attrs:{id:\"block_explosion_resistance_markers\"}},[o(\"li\",{attrs:{block:\"glass\"}},[e._v(\"Glass\")]),e._v(\" \"),o(\"li\",{attrs:{block:\"planks\"}},[e._v(\"Planks\")]),e._v(\" \"),o(\"li\",{attrs:{block:\"stone\"}},[e._v(\"Stone\")]),e._v(\" \"),o(\"li\",{attrs:{block:\"obsidian\"}},[e._v(\"Obsidian\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Light Emission\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Set a value to let the block emit light. 15 is the maximum value and is equivalent to glowstone.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Light Dampening\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The amount that light will be dampened when it passes through the block, in a range (0-15). Higher value means the light will be dampened more.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Fade to Opaque\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Fade material to opaque when viewed from a distance. This allows transparent blocks to be viewed from a greater distance.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Face Shading\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Shade faces depending on which direction they are facing\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Ambient Occlusion\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Enable smooth shadows in the corner between multiple blocks\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"Map Color\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"The color that this block will be display with on a map item.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"div\",[o(\"label\",[e._v(\"UV Lock\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"Align the rotation of the texture to the world, rather than to the rotation of the block.\")])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"label\",[o(\"i\",{staticClass:\"material-icons\",staticStyle:{\"vertical-align\":\"bottom\",margin:\"1px 5px\",\"padding-top\":\"9px\"}},[e._v(\"info\")]),e._v(\"\\n\\t\\t\\t\\tYou can always re-export the MCAddon via \"),o(\"b\",[e._v(\"File\")]),e._v(\" > \"),o(\"b\",[e._v(\"Export\")]),e._v(\" > \"),o(\"b\",[e._v(\"Export MCAddon\")]),e._v(\".\\n\\t\\t\\t\")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o(\"section\",[o(\"label\",[e._v(\"To learn more about creating Minecraft addons, visit the \"),o(\"a\",{staticClass:\"open-in-browser\",attrs:{href:\"https://learn.microsoft.com/en-us/minecraft/creator/\",target:\"blank\",rel:\"noopener\"}},[e._v(\"Minecraft Bedrock Creator Portal\")]),e._v(\"!\")]),e._v(\" \"),o(\"p\",{staticClass:\"description\"},[e._v(\"(You can re-open this dialog to return to this page)\")])])}],!1,(function(e){var t=o(719);t.__inject__&&t.__inject__(e)}),null,\"18d1aca8\");w.options.__file=\"src/dialog.vue\";const k=w.exports;var C=o(318);const B=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojNzU0OTE0O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2EzNzMxZjtmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\",I=\"data:image/png;base64,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\";o(924);const z=[];let E,y;BBPlugin.register(\"minecraft_block_wizard\",{title:\"Minecraft Block Wizard\",author:\"JannisX11 & Mojang Studios\",icon:\"icon.png\",description:\"Create custom blocks for Minecraft: Bedrock Edition!\",tags:[\"Minecraft: Bedrock Edition\"],version:\"1.7.0\",min_version:\"4.8.0\",variant:\"both\",creation_date:\"2022-10-25\",has_changelog:!0,bug_tracker:\"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",onload(){function e(){Vue.nextTick((()=>{E.content_vue&&(E.content_vue.current_tab_model=\"\",Project&&\"bedrock_block\"==Project.format.id&&(E.content_vue.current_tab_model=Project.name||\"Block Model\"))}))}async function t(t){0!=await MinecraftEULA.promptUser(\"block_wizard\")&&(E.content_vue&&E.content_vue.form.display_name?Blockbench.showMessageBox({title:\"Block Wizard\",message:`Do you want to keep editing your current block \"${E.content_vue.form.display_name}\", or do you want to start over?`,icon:\"delete\",buttons:[\"Continue\",\"Start New Block\"]},(t=>{1==t&&(E.sidebar.setPage(\"metadata\"),E.delete(),delete E.object,window.BlockWizardProject={}),E.show(),e()})):t?y.show():(E.show(),e()))}window.BlockWizardProject={},y=new Dialog({id:\"minecraft_block_wizard_start\",title:\"Create a Block!\",width:740,padding:!1,buttons:[\"Create a Block!\"],lines:[\"<h2>Minecraft Block Wizard</h2>\",\"<p>Create custom blocks and export them as an addon!</p>\",\"<p>Custom blocks allow you to expand your Minecraft world and add new materials and objects</p>\",\"<p>With the block wizard, you can add a new block to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench</p>\",`<img src=\"${I}\" />`],onConfirm(){setTimeout((()=>{E.show(),e()}),10)}}),E=new Dialog({id:\"minecraft_block_wizard\",title:\"Minecraft Block Wizard\",width:980,padding:!1,buttons:[\"Next\",\"dialog.cancel\"],sidebar:{pages:i,actions:[{id:\"documentation\",name:\"Documentation\",icon:\"description\",click(){Blockbench.openLink(\"https://learn.microsoft.com/en-us/minecraft/creator/documents/minecraftblockwizard?view=minecraft-bedrock-stable\")}}],onPageSwitch(e){return this.dialog.content_vue.switchPage(e)}},component:k,onBuild(e){let t=Interface.createElement(\"div\",{id:\"block_wizard_back_button\",title:\"Go Back\"},Blockbench.getIconNode(\"arrow_back\"));t.onclick=()=>{E.content_vue.previousPage()};let o=Interface.createElement(\"div\",{class:\"bar_spacer\"},[Interface.createElement(\"div\",{class:\"required_message\"},\" = Required\")]),i=e.querySelector(\".button_bar\");i.prepend(o),i.prepend(t)},onConfirm(){return this.content_vue.nextPage(),!1},onCancel(e){if(e&&\"blackout\"==e.target.id)return!1}});let o=new Action(\"open_minecraft_block_wizard\",{name:\"Minecraft Block Wizard\",icon:C,click(){t(!0)}});MenuBar.menus.filter.addAction(o),z.push(o);let a=new Action(\"block_wizard_export_mcaddon\",{name:\"Export MCAddon (Block Wizard)\",icon:C,condition:()=>E.content_vue&&E.content_vue.form.display_name&&E.content_vue.form.export_mode.includes(\"mcaddon\"),click(){E.content_vue.exportPacks()}});MenuBar.menus.file.addAction(a,\"export.0\"),z.push(a);let n=new ModelLoader(\"minecraft_block_wizard\",{name:\"Minecraft Block Wizard\",description:\"Create custom blocks and export them as an addon!\",icon:C,target:\"Minecraft: Bedrock Edition\",onStart(){t(!1)},format_page:{content:[{type:\"label\",text:\"Custom blocks allow you to expand your Minecraft world and add new materials and objects.\"},{type:\"label\",text:\"With the block wizard, you can add a new block to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench.\"},{type:\"image\",source:I}],button_text:\"Create a Block!\"}});z.push(n);let r=Blockbench.addCSS(`\\n\\t\\t\\t.format_entry[format=minecraft_block_wizard] {\\n\\t\\t\\t\\tcolor: #ffa41b;\\n\\t\\t\\t}\\n\\t\\t\\t#start_files .format_entry[format=minecraft_block_wizard]:hover {\\n\\t\\t\\t\\tcolor: #ffc151;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t#format_page_minecraft_block_wizard {\\n\\t\\t\\t\\tbackground-image: url('${B}');\\n\\t\\t\\t\\tbackground-position: bottom;\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_block_wizard content {\\n\\t\\t\\t\\tmargin-top: 18px;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_block_wizard content > label {\\n\\t\\t\\t\\tmax-width: 454px;\\n\\t\\t\\t\\tmargin-bottom: 20px;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_block_wizard img {\\n\\t\\t\\t\\tmargin-top: -265px;\\n\\t\\t\\t\\tmargin-bottom: -58px;\\n\\t\\t\\t\\tmargin-left: calc(20% - 130px);\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_block_wizard .button_bar {\\n\\t\\t\\t\\tjustify-content: right;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t#minecraft_block_wizard_start > .dialog_wrapper {\\n\\t\\t\\t\\tbackground-image: url('${B}');\\n\\t\\t\\t\\tbackground-position: bottom;\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_block_wizard_start content {\\n\\t\\t\\t\\toverflow: initial;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_block_wizard_start content > p {\\n\\t\\t\\t\\tmax-width: 454px;\\n\\t\\t\\t\\tmargin-bottom: 20px;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_block_wizard_start img {\\n\\t\\t\\t\\tmargin-top: -244px;\\n\\t\\t\\t\\tmargin-bottom: -58px;\\n\\t\\t\\t\\tmargin-left: calc(20% - 130px);\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_block_wizard_start .button_bar {\\n\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_block_wizard_start .button_bar button {\\n\\t\\t\\t\\twidth: 180px;\\n\\t\\t\\t\\theight: 40px;\\n\\t\\t\\t\\tmargin-top: 20px;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\tdialog#minecraft_block_wizard .dialog_sidebar_pages li {\\n\\t\\t\\t\\tpadding: 8px 20px;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_block_wizard .button_bar {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_block_wizard .button_bar .bar_spacer {\\n\\t\\t\\t\\tflex-grow: 1;\\n\\t\\t\\t\\ttext-align: left;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_block_wizard .required_message {\\n\\t\\t\\t\\tpadding-top: 5px;\\n\\t\\t\\t\\tpadding-left: 16px;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_block_wizard .required_message::before, #block_wizard_wrapper label.required::after {\\n\\t\\t\\t\\tcontent: \"*\";\\n\\t\\t\\t\\tfont-size: 1.2em;\\n\\t\\t\\t\\tline-height: 0;\\n\\t\\t\\t\\tvertical-align: inherit;\\n\\t\\t\\t\\tcolor: var(--color-accent);\\n\\t\\t\\t}\\n\\t\\t`);z.push(r)},onunload(){z.forEach((e=>e.delete()))}})})()})();"
  },
  {
    "path": "plugins/minecraft_entity_wizard/about.md",
    "content": "\nThis Entity Wizard for Minecraft Bedrock Edition let's you add your own custom entity to the game without any prior coding knowledge.\n\nSelect from a list of presets, and customize basic properties of the entity.\n\nThen you can use Blockbench's powerful editor to design your own model for the entity!\n\nThe generated Add-On can be added to Minecraft, and you can summon your custom entity into your own world!\n\n> Developed by the creator of Blockbench, in collaboration with Mojang Studios!\n"
  },
  {
    "path": "plugins/minecraft_entity_wizard/changelog.json",
    "content": "{\n\t\"1.4.0\": {\n\t\t\"title\": \"1.4.0\",\n\t\t\"date\": \"2024-04-11\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Sniffer preset\",\n\t\t\t\t\t\"Added Camel preset\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.5.0\": {\n\t\t\"title\": \"1.5.0\",\n\t\t\"date\": \"2024-05-23\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Armadillo preset\",\n\t\t\t\t\t\"Added link to Dialogue Designer for NPC entities\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.5.1\": {\n\t\t\"title\": \"1.5.1\",\n\t\t\"date\": \"2024-06-16\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed Wolf preset no longer working correctly in newer Minecraft version\",\n\t\t\t\t\t\"Fixed Magma Slime preset not working correctly\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.6.0\": {\n\t\t\"title\": \"1.6.0\",\n\t\t\"date\": \"2024-09-26\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Breeze preset\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.7.0\": {\n\t\t\"title\": \"1.7.0\",\n\t\t\"date\": \"2025-02-15\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added option to merge into existing mcaddon file\",\n\t\t\t\t\t\"Added option to select game variant (normal, preview, edu) inside the wizard\",\n\t\t\t\t\t\"Added runtime identifier to NPC preset (enabling punch to remove)\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed JSON comments causing file merging with existing packs to fail\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.0\": {\n\t\t\"title\": \"1.8.0\",\n\t\t\"date\": \"2025-10-05\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added happy ghast preset\",\n\t\t\t\t\t\"Added compatibility for Blockbench 5.0\",\n\t\t\t\t\t\"Added compatibility for new Minecraft install location\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed held item position in pillager preset\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.2\": {\n\t\t\"title\": \"1.8.2\",\n\t\t\"date\": \"2025-10-25\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed export issue in the web app\",\n\t\t\t\t\t\"Fixed issue with exporting to the new Minecraft install location\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.8.3\": {\n\t\t\"title\": \"1.8.3\",\n\t\t\"date\": \"2026-04-20\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed missing entity sounds in some presets\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/minecraft_entity_wizard/minecraft_entity_wizard.js",
    "content": "(()=>{var e={1568:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.drive\":{\"loop\":true,\"bones\":{\"wheel_front_left\":{\"rotation\":[\"query.modified_distance_moved * 20\",\"variable.steering / 3\",0]},\"wheel_front_right\":{\"rotation\":[\"query.modified_distance_moved * 20\",\"variable.steering / 3\",0]},\"wheel_back_right\":{\"rotation\":[\"query.modified_distance_moved * 20\",0,0]},\"wheel_back_left\":{\"rotation\":[\"query.modified_distance_moved * 20\",0,0]},\"steering_wheel\":{\"rotation\":[0,0,\"variable.steering * -0.6\"]}}}}}'},1864:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.idle\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"head\":{\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,-0.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,-0.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,15,31.21],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,15,40],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,15,22.5],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,15,31.21],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,-15,-31.21],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,-15,-40],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,-15,-22.5],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,-15,-31.21],\"lerp_mode\":\"catmullrom\"}}},\"left_wing\":{\"rotation\":{\"0.0\":{\"post\":[37.98064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[22.5,67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[37.98064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[22.5,67.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[37.98064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"}}},\"right_wing\":{\"rotation\":{\"0.0\":{\"post\":[37.98064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[22.5,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[37.98064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[22.5,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[37.98064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.fly\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"head\":{\"rotation\":{\"0.0\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[-2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5833\":{\"post\":[-2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"body\":{\"rotation\":{\"0.0\":{\"post\":[45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.4167\":{\"post\":[55,0,0],\"lerp_mode\":\"catmullrom\"},\"0.9167\":{\"post\":[45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.4167\":{\"post\":[55,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[45,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":[0,0,1],\"2.0\":[0,0,1]}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,22.5,15],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,22.5,10],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[0,22.5,15],\"lerp_mode\":\"catmullrom\"},\"1.5833\":{\"post\":[0,22.5,10],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,22.5,15],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,-22.5,-15],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,-22.5,-10],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[0,-22.5,-15],\"lerp_mode\":\"catmullrom\"},\"1.5833\":{\"post\":[0,-22.5,-10],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,-22.5,-15],\"lerp_mode\":\"catmullrom\"}}},\"left_wing\":{\"rotation\":{\"0.0\":{\"post\":[15.48064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,67.5,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[15.48064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[15.48064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"1.25\":{\"post\":[0,67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[15.48064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[0,67.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[15.48064,6.50284,22.02407],\"lerp_mode\":\"catmullrom\"}}},\"right_wing\":{\"rotation\":{\"0.0\":{\"post\":[15.48064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[15.48064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[15.48064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"1.25\":{\"post\":[0,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[15.48064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[0,-67.5,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[15.48064,-6.50284,-22.02407],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.hold_item\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":2,\"bones\":{\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[-67.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[-67.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"rightItem\":{\"scale\":0.7,\"rotation\":[\"-15.0 * (variable.holding_trident)\",0,\"90.0 * (variable.holding_trident)\"],\"position\":[0.0,\"3.50 * (variable.holding_trident)\",0.0]}}}}}'},5622:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.look_at_target\":{\"loop\":true,\"bones\":{\"head\":{\"relative_to\":{\"rotation\":\"entity\"},\"rotation\":[\"variable.x_head_rotation - this\",\"variable.y_head_rotation - this\",0.0]}}},\"animation.{name}.walk\":{\"loop\":true,\"animation_length\":1.45833,\"anim_time_update\":\"variable.walk_anim_time_update\",\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.125\":[0,0,0],\"0.25\":[0,0,2.1],\"0.5\":[0,0,0],\"0.8333\":[0,0,0],\"0.9583\":[0,0,-2.1],\"1.25\":[0,0,0],\"1.4583\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.125\":[0,0,0],\"0.25\":[0,-0.2,0],\"0.5\":[0,0,0],\"0.8333\":[0,0,0],\"0.9583\":[0,-0.2,0],\"1.25\":[0,0,0],\"1.4583\":[0,0,0]}},\"tail\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[5,0,0],\"0.5\":[-2.5,0,0],\"0.7083\":[0,0,0],\"0.9583\":[5,0,0],\"1.2083\":[-2.5,0,0],\"1.4583\":[0,0,0]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[-50,0,0],\"0.25\":[0,0,0],\"0.5\":[0,0,0],\"0.75\":[50,0,0],\"1.0\":[50,0,0],\"1.2917\":[-20,0,0],\"1.4583\":[-50,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,-0.5],\"0.5\":[0,0,0],\"1.0\":[0,0,-0.5],\"1.2917\":[0,1,-0.18],\"1.4583\":[0,0,0]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[50,0,0],\"0.25\":[50,0,0],\"0.5417\":[-20,0,0],\"0.7083\":[-50,0,0],\"0.9583\":[0,0,0],\"1.2083\":[0,0,0],\"1.4583\":[50,0,0]},\"position\":{\"0.0\":[0,0,-0.25],\"0.25\":[0,0,-0.5],\"0.5417\":[0,1,-0.18],\"0.7083\":[0,0,0],\"0.9583\":[0,0,-0.5],\"1.2083\":[0,0,0],\"1.4583\":[0,0,-0.25]}},\"right_front_leg\":{\"rotation\":{\"0.0\":[50,0,0],\"0.25\":[50,0,0],\"0.5417\":[-20,0,0],\"0.7083\":[-50,0,0],\"0.9583\":[0,0,0],\"1.2083\":[0,0,0],\"1.4583\":[50,0,0]},\"position\":{\"0.0\":[0,0,-0.25],\"0.25\":[0,0,-0.5],\"0.5417\":[0,1,-0.18],\"0.7083\":[0,0,0],\"0.9583\":[0,0,-0.5],\"1.2083\":[0,0,0],\"1.4583\":[0,0,-0.25]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[-50,0,0],\"0.25\":[0,0,0],\"0.5\":[0,0,0],\"0.75\":[50,0,0],\"1.0\":[50,0,0],\"1.2917\":[-20,0,0],\"1.4583\":[-50,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,-0.5],\"0.5\":[0,0,0],\"1.0\":[0,0,-0.5],\"1.2917\":[0,1,-0.18],\"1.4583\":[0,0,0]}}}},\"animation.{name}.roll_up\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":0.5,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,5,0],\"0.2\":[0,6,-1],\"0.25\":[0,6,-1],\"0.4\":[0,-1,-1]}},\"tail\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,0,0],\"0.2\":[0,0,-2],\"0.25\":[0,0,-2]}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[17.5,0,0],\"0.25\":[-72.5,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,-1,0],\"0.2\":[0,2,1],\"0.25\":[0,2,1],\"0.3\":[0,2,6],\"0.4\":[0,2,7]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[-35,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,5,-2],\"0.2\":[0,8,-2],\"0.25\":[0,8,-2],\"0.4\":[1,3,-6]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[-45,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,5,-2],\"0.2\":[0,8,-2],\"0.25\":[0,8,-2],\"0.4\":[-1,3,-6]}},\"right_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[-27.5,0,0],\"0.2\":[-32.5,0,0],\"0.25\":[-85,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,5,0],\"0.2\":[-1,9,-1],\"0.25\":[-1,9,-1],\"0.4\":[-1,2,3]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[-12.5,0,0],\"0.2\":[-35,0,0],\"0.25\":[-85,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.15\":[0,5,0],\"0.2\":[1,9,-1],\"0.25\":[1,9,-1],\"0.4\":[1,2,3]}},\"body_rolled_up\":{\"rotation\":{\"0.0\":[0,0,0],\"0.15\":[0,0,0],\"0.4\":[-2.5,0,0],\"0.45\":[5,0,0],\"0.5\":[0,0,0]},\"position\":{\"0.0\":[0,3,0],\"0.15\":[0,8,0],\"0.2\":[0,7,0],\"0.25\":[0,7,0],\"0.4\":[0,1,0],\"0.45\":[0,0.6,0],\"0.5\":[0,0,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"roll\"},\"0.475\":{\"effect\":\"land\"}}},\"animation.{name}.rolled_up\":{\"loop\":\"hold_on_last_frame\",\"bones\":{\"body\":{\"rotation\":[0,0,0],\"position\":[0,-1,-1]},\"tail\":{\"rotation\":[0,0,0],\"position\":[0,0,-2]},\"head\":{\"rotation\":[-72.5,0,0],\"position\":[0,2,7]},\"right_hind_leg\":{\"rotation\":[-35,0,0],\"position\":[1,3,-6]},\"left_hind_leg\":{\"rotation\":[-45,0,0],\"position\":[-1,3,-6]},\"right_front_leg\":{\"rotation\":[-85,0,0],\"position\":[-1,2,3]},\"left_front_leg\":{\"rotation\":[-85,0,0],\"position\":[1,2,3]},\"body_rolled_up\":{\"rotation\":[0,0,0],\"position\":[0,0,0]}}},\"animation.{name}.peek\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":2.5,\"bones\":{\"head\":{\"rotation\":{\"0.0\":[-70,0,0],\"0.15\":[-65,0,0],\"0.4\":[-50,0,0],\"0.5\":[0,0,0],\"0.7\":[0,0,0],\"0.9\":{\"pre\":[-7.5,0,45],\"post\":[-7.5,0,45],\"lerp_mode\":\"catmullrom\"},\"1.15\":[-7.5,0,45],\"1.3\":{\"pre\":[-0.8639,-1.49592,-39.12866],\"post\":[-0.8639,-1.49592,-39.12866],\"lerp_mode\":\"catmullrom\"},\"1.6\":[-0.8639,-1.49592,-39.12866],\"1.75\":[0,0,0],\"1.8\":[-25,0,0],\"1.85\":[-70,0,0]},\"position\":{\"0.0\":[0,1,7],\"0.1\":[0,1,4],\"0.15\":[0,1,4],\"0.25\":[0,1,5],\"0.35\":[0,1,0.2],\"0.4\":[0,1,0.2],\"0.5\":[0,2.1,1.2],\"0.6\":[0,1.1,0.2],\"0.7\":[0,1.1,0.2],\"1.75\":[0,1.1,0.2],\"1.8\":[0,0.1,0.2],\"1.95\":[0,0.1,5.2],\"2.0\":[0,0.1,7.2],\"2.15\":[0,0.1,8.2],\"2.3\":[0,0.1,5.2]}},\"right_hind_leg\":{\"position\":[0,3,-2]},\"left_hind_leg\":{\"position\":[0,3,-2]},\"right_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.6\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.85\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":[-90,0,0],\"1.95\":[-90,0,0]},\"position\":{\"0.0\":{\"post\":[-1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.6\":{\"post\":[-1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.65\":{\"post\":[-1,2,-2],\"lerp_mode\":\"catmullrom\"},\"0.85\":{\"post\":[-1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[-1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[-1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.95\":[-1,2,-1],\"2.0\":[-1,2,3],\"2.15\":[-1,3,4]}},\"left_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.65\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.85\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":[-90,0,0],\"1.95\":[-90,0,0]},\"position\":{\"0.0\":{\"post\":[1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.65\":{\"post\":[1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[1,2,-2],\"lerp_mode\":\"catmullrom\"},\"0.85\":{\"post\":[1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[1,2,-1],\"lerp_mode\":\"catmullrom\"},\"1.95\":[1,2,-1],\"2.0\":[1,2,3],\"2.15\":[1,3,4]}},\"body_rolled_up\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[0,0,0],\"0.35\":[15,0,0],\"0.5\":[-7.5,0,0],\"0.6\":[0,0,0],\"2.0\":[0,0,0],\"2.05\":[-17.5,0,0],\"2.15\":[-25,0,0],\"2.25\":[0,0,0],\"2.3\":[12.5,0,0],\"2.5\":[0,0,0]},\"position\":{\"0.25\":[0,0,0],\"0.35\":[0,1.6,0],\"0.5\":[0,0.5,0],\"0.6\":[0,0,0],\"2.0\":[0,0,0],\"2.05\":[0,1.2,0],\"2.15\":[0,1.7,0],\"2.25\":[0,0,0],\"2.3\":[0,1.3,0],\"2.5\":[0,0,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"peek\"}}},\"animation.{name}.unroll\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":1.5,\"bones\":{\"head\":{\"rotation\":{\"0.1\":[-50,0,0],\"0.15\":[0,0,0],\"0.25\":[0,0,0],\"0.4\":[0,0,0],\"0.65\":[0,0,0],\"0.7\":[0,0,0],\"0.85\":[-2.5,0,0],\"0.9\":[0,0,0],\"0.95\":[-7.5,0,0],\"1.05\":[0,0,0],\"1.1\":[7.5,0,0]},\"position\":{\"0.0\":[0,1,5],\"0.05\":[0,1,0.2],\"0.1\":[0,1,0.2],\"0.15\":[0,2.1,1.2],\"0.25\":[0,1.03,0.13],\"0.4\":[0,1.03,0.13],\"0.65\":[0,1.03,0.13],\"0.7\":[0,1.1,0.2],\"0.75\":[0,4.1,2.2],\"0.85\":[0,5.1,3.2],\"0.9\":[0,0.1,0.2],\"0.95\":[0,0.9,-0.8],\"1.05\":[0,0.9,0],\"1.1\":[0,2.6,0.2],\"1.15\":[0,2.4,0.2],\"1.2\":[0,0,0.2],\"1.25\":[0,0,0.2],\"1.3\":[0,0,0.2]}},\"right_hind_leg\":{\"rotation\":{\"1.1\":[0,0,0],\"1.3\":[0,0,30],\"1.4\":[0,0,0],\"1.45\":[0,0,0],\"1.5\":[0,0,0]},\"position\":{\"1.1\":[0,3,-2],\"1.2\":[0,8,-2],\"1.3\":[-1,3,0],\"1.4\":[0,0,0],\"1.45\":[0,0,0],\"1.5\":[0,0,0]}},\"left_hind_leg\":{\"rotation\":{\"1.1\":[0,0,0],\"1.3\":[0,0,-30],\"1.4\":[0,0,0],\"1.45\":[0,0,0],\"1.5\":[0,0,0]},\"position\":{\"1.1\":[0,3,-2],\"1.2\":[0,8,-2],\"1.3\":[1,3,0],\"1.35\":[1,3,0],\"1.4\":[0,0,0],\"1.45\":[0,0,0],\"1.5\":[0,0,0]}},\"right_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.05\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":[-45,0,0],\"0.55\":[-45,0,0],\"0.6\":{\"pre\":[-92.5,0,0],\"post\":[-92.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.1\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"1.3\":{\"post\":[0,0,30],\"lerp_mode\":\"catmullrom\"},\"1.4\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.45\":[0,0,0],\"1.5\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":[-1,2,2],\"0.05\":{\"pre\":[-1,2,2],\"post\":[-1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.25\":[-1,2,-1],\"0.55\":[-1,2,-1],\"0.7\":{\"pre\":[-1,2,2.63],\"post\":[-1,2,2.63],\"lerp_mode\":\"catmullrom\"},\"1.1\":[-1,2,2],\"1.2\":[-1,7,2],\"1.3\":[-1,3,0],\"1.4\":[0,0,0],\"1.45\":[0,0,0],\"1.5\":[0,0,0]}},\"left_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.05\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":[-45,0,0],\"0.55\":[-45,0,0],\"0.6\":{\"pre\":[-87.5,0,0],\"post\":[-87.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.1\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"1.3\":{\"post\":[0,0,-30],\"lerp_mode\":\"catmullrom\"},\"1.4\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.45\":[0,0,0],\"1.5\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.05\":{\"post\":[1,2,2],\"lerp_mode\":\"catmullrom\"},\"0.15\":{\"post\":[1,2,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":[1,2,-1],\"0.55\":[1,2,-1],\"0.7\":{\"pre\":[1,2,1.88],\"post\":[1,2,1.88],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[1,2,2.67],\"lerp_mode\":\"catmullrom\"},\"1.1\":{\"post\":[1,2,2],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[1,8,2],\"lerp_mode\":\"catmullrom\"},\"1.25\":{\"post\":[1.06,5.06,1],\"lerp_mode\":\"catmullrom\"},\"1.3\":{\"post\":[1,3,0],\"lerp_mode\":\"catmullrom\"},\"1.4\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.45\":[0,0,0],\"1.5\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"body_rolled_up\":{\"rotation\":{\"0.0\":[0,0,0],\"0.05\":[15,0,0],\"0.15\":[-7.5,0,0],\"0.25\":[0,0,0],\"0.7\":[0,0,0],\"0.75\":[-17.5,0,0],\"0.85\":[-25,0,0],\"0.9\":[0,0,0],\"0.95\":[12.5,0,0],\"1.05\":[0,0,0],\"1.1\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.05\":[0,1.6,0],\"0.15\":[0,0.5,0],\"0.25\":[0,0,0],\"0.7\":[0,0,0],\"0.75\":[0,1.2,0],\"0.85\":[0,1.7,0],\"0.9\":[0,0,0],\"0.95\":[0,1.3,0],\"1.05\":[0,0,0],\"1.2\":[0,5,0],\"1.25\":[0,8,0],\"1.5\":[0,1,0]}},\"body\":{\"position\":{\"1.1\":[0,0,0],\"1.2\":[0,4,0],\"1.25\":[0,5,0],\"1.3\":[0,4,0],\"1.4\":[0,-1,0],\"1.5\":[0,0,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"unroll_start\"},\"1.5\":{\"effect\":\"unroll_finish\"}}},\"animation.{name}.unroll_fast\":{\"animation_length\":0.05,\"loop\":\"hold_on_last_frame\",\"bones\":{\"body\":{\"rotation\":[0,0,0],\"position\":[0,-1,-1]},\"tail\":{\"rotation\":[0,0,0],\"position\":[0,0,-2]},\"head\":{\"rotation\":[-72.5,0,0],\"position\":[0,2,7]},\"right_hind_leg\":{\"rotation\":[-35,0,0],\"position\":[1,3,-6]},\"left_hind_leg\":{\"rotation\":[-45,0,0],\"position\":[-1,3,-6]},\"right_front_leg\":{\"rotation\":[-85,0,0],\"position\":[-1,2,3]},\"left_front_leg\":{\"rotation\":[-85,0,0],\"position\":[1,2,3]},\"body_rolled_up\":{\"rotation\":[0,0,0],\"position\":[0,0,0]}},\"sound_effects\":{\"0.0\":{\"effect\":\"unroll_finish\"}}}}}'},1333:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.athena_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this + 2\"]},\"head\":{\"rotation\":[\"-this - 5\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 10\",\"-this\",\"-this - 5\"]},\"leftleg\":{\"rotation\":[\"-this - 3\",\"-this - 3\",\"-this - 3\"]},\"rightarm\":{\"rotation\":[\"-this - 60\",\"-this + 20\",\"-this - 10\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 3\",\"-this + 3\",\"-this + 3\"]}}},\"animation.{name}.brandish_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this - 2\"]},\"head\":{\"rotation\":[\"-this - 15\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 20\",\"-this\",\"-this - 10\"]},\"leftleg\":{\"rotation\":[\"-this + 5\",\"-this - 3\",\"-this - 3\"]},\"rightarm\":{\"rotation\":[\"-this - 110\",\"-this + 50\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this - 5\",\"-this + 3\",\"-this + 3\"]}}},\"animation.{name}.cancan_a_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this + 22\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 5\",\"-this + 18\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 8\",\"-this\",\"-this - 114\"]},\"leftleg\":{\"rotation\":[\"-this - 111\",\"-this + 55\",\"-this\"]},\"rightarm\":{\"rotation\":[\"-this\",\"-this + 84\",\"-this + 111\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this\",\"-this + 23\",\"-this - 13\"]}}},\"animation.{name}.cancan_b_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this - 18\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 10\",\"-this - 20\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this\",\"-this\",\"-this - 112\"]},\"leftleg\":{\"rotation\":[\"-this\",\"-this\",\"-this + 13\"]},\"rightarm\":{\"rotation\":[\"-this + 8\",\"-this + 90\",\"-this + 111\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this - 119\",\"-this - 42\",\"-this\"]}}},\"animation.{name}.default_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this - 10\",\"-this\",\"-this - 10\"]},\"leftleg\":{\"rotation\":[\"-this - 1\",\"-this\",\"-this - 1\"]},\"rightarm\":{\"rotation\":[\"-this - 15\",\"-this\",\"-this + 10\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 1\",\"-this\",\"-this + 1\"]}}},\"animation.{name}.entertain_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 15\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this - 110\",\"-this - 35\",\"-this\"]},\"leftleg\":{\"rotation\":[\"-this + 5\",\"-this - 3\",\"-this - 3\"]},\"rightarm\":{\"rotation\":[\"-this - 110\",\"-this + 35\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this - 5\",\"-this + 3\",\"-this + 3\"]}}},\"animation.{name}.hero_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this + 8\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 4\",\"-this + 67\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 16\",\"-this + 32\",\"-this - 8\"]},\"leftleg\":{\"rotation\":[\"-this\",\"-this - 75\",\"-this - 8\"]},\"rightarm\":{\"rotation\":[\"-this - 99\",\"-this + 63\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 4\",\"-this + 63\",\"-this + 8\"]}}},\"animation.{name}.honor_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 15\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this - 110\",\"-this + 35\",\"-this\"]},\"leftleg\":{\"rotation\":[\"-this + 5\",\"-this - 3\",\"-this - 3\"]},\"rightarm\":{\"rotation\":[\"-this - 110\",\"-this - 35\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this - 5\",\"-this + 3\",\"-this + 3\"]}}},\"animation.{name}.no_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"leftleg\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightarm\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]}}},\"animation.{name}.riposte_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this + 16\",\"-this + 20\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 4\",\"-this + 8\",\"-this + 237\"]},\"leftleg\":{\"rotation\":[\"-this - 14\",\"-this - 18\",\"-this - 16\"]},\"rightarm\":{\"rotation\":[\"-this + 246\",\"-this\",\"-this + 89\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this + 180\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 8\",\"-this + 20\",\"-this + 4\"]}}},\"animation.{name}.salute_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this + 10\",\"-this\",\"-this - 5\"]},\"leftleg\":{\"rotation\":[\"-this - 1\",\"-this\",\"-this - 1\"]},\"rightarm\":{\"rotation\":[\"-this - 70\",\"-this - 40\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 1\",\"-this\",\"-this + 1\"]}}},\"animation.{name}.solemn_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this + 2\"]},\"head\":{\"rotation\":[\"-this + 15\",\"-this\",\"-this\"]},\"leftarm\":{\"rotation\":[\"-this - 30\",\"-this + 15\",\"-this + 15\"]},\"leftleg\":{\"rotation\":[\"-this - 1\",\"-this\",\"-this - 1\"]},\"rightarm\":{\"rotation\":[\"-this - 60\",\"-this - 20\",\"-this - 10\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this + 1\",\"-this\",\"-this + 1\"]}}},\"animation.{name}.wiggle\":{\"loop\":true,\"bones\":{\"baseplate\":{\"rotation\":[0.0,\"math.sin((variable.skeleton.hurt_time - query.frame_alpha) * 120) * 3\",0.0]}}},\"animation.{name}.zombie_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"head\":{\"rotation\":[\"-this - 10\",\"-this\",\"-this - 5\"]},\"leftarm\":{\"rotation\":[\"-this - 105\",\"-this\",\"-this\"]},\"leftleg\":{\"rotation\":[\"-this + 7\",\"-this\",\"-this\"]},\"rightarm\":{\"rotation\":[\"-this - 100\",\"-this\",\"-this\"]},\"rightitem\":{\"rotation\":[\"-this\",\"-this\",\"-this\"]},\"rightleg\":{\"rotation\":[\"-this - 46\",\"-this\",\"-this\"]}}}}}'},6498:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.idle_underwater\":{\"loop\":true,\"animation_length\":5.2,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"pre\":[-8.9,0,0],\"post\":[-8.9,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[-2.6,0,0],\"post\":[-2.6,0,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-8.9,0,0],\"post\":[-8.9,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[0,-0.5,0],\"post\":[0,-0.5,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[49.1,-25.8,0],\"post\":[49.1,-25.8,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[29.1,-40.8,12.5],\"post\":[29.1,-40.8,12.5],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[49.1,-25.8,0],\"post\":[49.1,-25.8,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0.25,0,1],\"post\":[0.25,0,1],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0.25,0,1],\"post\":[0.25,0,1],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-72.5,117.5,85],\"post\":[-72.5,117.5,85],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[-80,117.5,85],\"post\":[-80,117.5,85],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-72.5,117.5,85],\"post\":[-72.5,117.5,85],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0.25,0,-1],\"post\":[0.25,0,-1],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0.25,0,-1],\"post\":[0.25,0,-1],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[49.1,25.8,0],\"post\":[49.1,25.8,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[29.1,40.8,-12.5],\"post\":[29.1,40.8,-12.5],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[49.1,25.8,0],\"post\":[49.1,25.8,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.25,0,1],\"post\":[-0.25,0,1],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-0.25,0,1],\"post\":[-0.25,0,1],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-72.5,-117.5,-85],\"post\":[-72.5,-117.5,-85],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[-80,-117.5,-85],\"post\":[-80,-117.5,-85],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-72.5,-117.5,-85],\"post\":[-72.5,-117.5,-85],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.25,0,-1],\"post\":[-0.25,0,-1],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-0.25,0,-1],\"post\":[-0.25,0,-1],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[0,-32,0],\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"pre\":[11.7,0,0],\"post\":[11.7,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[2.4,0,0],\"post\":[2.4,0,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[11.7,0,0],\"post\":[11.7,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-25.6,0],\"post\":[0,-25.6,0],\"lerp_mode\":\"catmullrom\"},\"3.12\":{\"pre\":[0,16,0],\"post\":[0,16,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0,-25.6,0],\"post\":[0,-25.6,0],\"lerp_mode\":\"catmullrom\"}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,23,0],\"post\":[0,23,0],\"lerp_mode\":\"catmullrom\"},\"2.08\":{\"pre\":[0,-26,0],\"post\":[0,-26,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[0,23,0],\"post\":[0,23,0],\"lerp_mode\":\"catmullrom\"}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[-19.2,0,0],\"post\":[-19.2,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"pre\":[12.3,0,0],\"post\":[12.3,0,0],\"lerp_mode\":\"catmullrom\"},\"5.2\":{\"pre\":[-19.2,0,0],\"post\":[-19.2,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.idle_floor\":{\"loop\":true,\"animation_length\":2.8,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[77.5,-22.5,0],\"post\":[77.5,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[77.5,-22.5,0],\"post\":[77.5,-22.5,0],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-77.5,0,0],\"post\":[-77.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[-77.5,0,0],\"post\":[-77.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[77.5,25,0],\"post\":[77.5,25,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[77.5,25,0],\"post\":[77.5,25,0],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-77.5,0,0],\"post\":[-77.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[-77.5,0,0],\"post\":[-77.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":[0,10,0],\"0.32\":[0,10,0],\"1.04\":[0,-10,0],\"1.76\":[0,-10,0],\"2.48\":[0,10,0],\"2.8\":[0,10,0]}},\"head\":{\"rotation\":{\"0.0\":{\"pre\":[0,0,-11],\"post\":[0,0,-11],\"lerp_mode\":\"catmullrom\"},\"1.28\":{\"pre\":[-13.2,-2.7,-11.5],\"post\":[-13.2,-2.7,-11.5],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[-13.2,-2.7,-11.5],\"post\":[-13.2,-2.7,-11.5],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[0,0,-11],\"post\":[0,0,-11],\"lerp_mode\":\"catmullrom\"}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,38,0],\"post\":[0,38,0],\"lerp_mode\":\"catmullrom\"},\"1.28\":{\"pre\":[0,45.5,0],\"post\":[0,45.5,0],\"lerp_mode\":\"catmullrom\"},\"1.64\":{\"pre\":[0,45.5,0],\"post\":[0,45.5,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[0,38,0],\"post\":[0,38,0],\"lerp_mode\":\"catmullrom\"}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-50,0],\"post\":[0,-50,0],\"lerp_mode\":\"catmullrom\"},\"1.28\":{\"pre\":[0,-59,0],\"post\":[0,-59,0],\"lerp_mode\":\"catmullrom\"},\"1.56\":{\"pre\":[0,-59,0],\"post\":[0,-59,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[0,-50,0],\"post\":[0,-50,0],\"lerp_mode\":\"catmullrom\"}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[33,0,0],\"post\":[33,0,0],\"lerp_mode\":\"catmullrom\"},\"1.28\":{\"pre\":[47.4,0,0],\"post\":[47.4,0,0],\"lerp_mode\":\"catmullrom\"},\"1.64\":{\"pre\":[47.4,0,0],\"post\":[47.4,0,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"pre\":[33,0,0],\"post\":[33,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.idle_floor_underwater\":{\"loop\":true,\"animation_length\":5.12,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0,1.5,0],\"post\":[0,1.5,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0,1.5,0],\"post\":[0,1.5,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[-60,145,0],\"post\":[-60,145,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-60,145,0],\"post\":[-60,145,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0.5,0,0.5],\"post\":[0.5,0,0.5],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0.5,0,0.5],\"post\":[0.5,0,0.5],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-60,0,0],\"post\":[-60,0,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-57.5,0,2.5],\"post\":[-57.5,0,2.5],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[-60,215,0],\"post\":[-60,215,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-60,215,0],\"post\":[-60,215,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.5,0,0.5],\"post\":[-0.5,0,0.5],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-0.5,0,0.5],\"post\":[-0.5,0,0.5],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-60,0,0],\"post\":[-60,0,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-57.5,0,-2.5],\"post\":[-57.5,0,-2.5],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"},\"2.56\":{\"pre\":[0,-18.8,0],\"post\":[0,-18.8,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-25.6,0],\"post\":[0,-25.6,0],\"lerp_mode\":\"catmullrom\"},\"3.12\":{\"pre\":[0,15.8,0],\"post\":[0,15.8,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0,-25.6,0],\"post\":[0,-25.6,0],\"lerp_mode\":\"catmullrom\"}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,22.5,0],\"post\":[0,22.5,0],\"lerp_mode\":\"catmullrom\"},\"2.08\":{\"pre\":[0,-25.9,0],\"post\":[0,-25.9,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[0,22.5,0],\"post\":[0,22.5,0],\"lerp_mode\":\"catmullrom\"}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[-19,0,0],\"post\":[-19,0,0],\"lerp_mode\":\"catmullrom\"},\"2.56\":{\"pre\":[12.3,0,0],\"post\":[12.3,0,0],\"lerp_mode\":\"catmullrom\"},\"5.12\":{\"pre\":[-19,0,0],\"post\":[-19,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.swim\":{\"loop\":true,\"animation_length\":1,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"pre\":[8.3,0,0],\"post\":[8.3,0,0]},\"0.24\":{\"pre\":[11.83,0,0],\"post\":[11.83,0,0]},\"0.68\":{\"pre\":[-7.5,0,0],\"post\":[-7.5,0,0]},\"0.96\":{\"pre\":[6.84,0,0],\"post\":[6.84,0,0]}},\"position\":{\"0.0\":{\"pre\":[0,0,0],\"post\":[0,0,0]},\"0.52\":{\"pre\":[0,-1,0],\"post\":[0,-1,0]},\"0.96\":{\"pre\":[0,-0.05,0],\"post\":[0,-0.05,0]}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[72.5,80,95],\"post\":[72.5,80,95]},\"0.52\":{\"pre\":[72.5,110,95],\"post\":[72.5,110,95]},\"0.96\":{\"pre\":[72.5,81.64,95],\"post\":[72.5,81.64,95]}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-97.5,87.5,-90],\"post\":[-97.5,87.5,-90]},\"0.28\":{\"pre\":[-97.5,107.5,-90],\"post\":[-97.5,107.5,-90]},\"0.76\":{\"pre\":[-97.5,68.71,-90],\"post\":[-97.5,68.71,-90]},\"0.96\":{\"pre\":[-97.5,84.79,-90],\"post\":[-97.5,84.79,-90]}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[72.5,-80,-95],\"post\":[72.5,-80,-95]},\"0.52\":{\"pre\":[72.5,-110,-95],\"post\":[72.5,-110,-95]},\"0.96\":{\"pre\":[72.5,-81.64,-95],\"post\":[72.5,-81.64,-95]}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-97.5,-87.5,90],\"post\":[-97.5,-87.5,90]},\"0.28\":{\"pre\":[-97.5,-108.75,90],\"post\":[-97.5,-108.75,90]},\"0.76\":{\"pre\":[-97.5,-69.96,90],\"post\":[-97.5,-69.96,90]},\"0.96\":{\"pre\":[-97.5,-84.94,90],\"post\":[-97.5,-84.94,90]}}},\"tail\":{\"rotation\":{\"0.0\":{\"pre\":[0,15,0],\"post\":[0,15,0]},\"0.52\":{\"pre\":[0,-15,0],\"post\":[0,-15,0]},\"0.96\":{\"pre\":[0,13.36,0],\"post\":[0,13.36,0]}}},\"head\":{\"rotation\":{\"0.0\":{\"pre\":[-7.5,0,0],\"post\":[-7.5,0,0]},\"0.28\":{\"pre\":[-13.9,0,0],\"post\":[-13.9,0,0]},\"0.72\":{\"pre\":[14.23,0,0],\"post\":[14.23,0,0]},\"0.96\":{\"pre\":[-5.1,0,0],\"post\":[-5.1,0,0]}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-72,0],\"post\":[0,-72,0]},\"0.2\":{\"pre\":[0,-79.9,0],\"post\":[0,-79.9,0]},\"0.64\":{\"pre\":[0,-38.1,0],\"post\":[0,-38.1,0]},\"0.96\":{\"pre\":[0,-69.31,0],\"post\":[0,-69.31,0]}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,72,0],\"post\":[0,72,0]},\"0.2\":{\"pre\":[0,86.5,0],\"post\":[0,86.5,0]},\"0.64\":{\"pre\":[0,26.7,0],\"post\":[0,26.7,0]},\"0.96\":{\"pre\":[0,68.38,0],\"post\":[0,68.38,0]}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[-57,0,0],\"post\":[-57,0,0]},\"0.2\":{\"pre\":[-68.7,0,0],\"post\":[-68.7,0,0]},\"0.64\":{\"pre\":[-24.2,0,0],\"post\":[-24.2,0,0]},\"0.96\":{\"pre\":[-54.37,0,0],\"post\":[-54.37,0,0]}}}}},\"animation.{name}.walk_floor\":{\"loop\":true,\"animation_length\":2.72,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"2.72\":[0,0,0]}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[77.5,35,0],\"post\":[77.5,35,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[77.5,-22.5,0],\"post\":[77.5,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[77.5,35,0],\"post\":[77.5,35,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0.5,0,0],\"post\":[0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0.5,0,0],\"post\":[0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-77.5,-25,0],\"post\":[-77.5,-25,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[-77.5,22.5,0],\"post\":[-77.5,22.5,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[-77.5,-25,0],\"post\":[-77.5,-25,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0.5,0,0],\"post\":[0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0.5,0,0],\"post\":[0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[77.5,32.5,0],\"post\":[77.5,32.5,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[77.5,-30,0],\"post\":[77.5,-30,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[77.5,32.5,0],\"post\":[77.5,32.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-77.5,-30,0],\"post\":[-77.5,-30,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[-77.5,15,0],\"post\":[-77.5,15,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[-77.5,-30,0],\"post\":[-77.5,-30,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":{\"pre\":[0,-10,0],\"post\":[0,-10,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[0,10,0],\"post\":[0,10,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0,-10,0],\"post\":[0,-10,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"pre\":[0,-7.5,0],\"post\":[0,-7.5,0],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"pre\":[0,6.7,0],\"post\":[0,6.7,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0,-7.5,0],\"post\":[0,-7.5,0],\"lerp_mode\":\"catmullrom\"}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,38.1,0],\"post\":[0,38.1,0],\"lerp_mode\":\"catmullrom\"},\"1.08\":{\"pre\":[0,45.6,0],\"post\":[0,45.6,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[0,45.6,0],\"post\":[0,45.6,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0,38.1,0],\"post\":[0,38.1,0],\"lerp_mode\":\"catmullrom\"}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-50,0],\"post\":[0,-50,0],\"lerp_mode\":\"catmullrom\"},\"1.08\":{\"pre\":[0,-59,0],\"post\":[0,-59,0],\"lerp_mode\":\"catmullrom\"},\"1.36\":{\"pre\":[0,-59,0],\"post\":[0,-59,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[0,-50,0],\"post\":[0,-50,0],\"lerp_mode\":\"catmullrom\"}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[33,0,0],\"post\":[33,0,0],\"lerp_mode\":\"catmullrom\"},\"1.08\":{\"pre\":[47.4,0,0],\"post\":[47.4,0,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[47.4,0,0],\"post\":[47.4,0,0],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"pre\":[33,0,0],\"post\":[33,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.walk_floor_underwater\":{\"loop\":true,\"animation_length\":2.04,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"pre\":[0,-5,6],\"post\":[0,-5,6],\"lerp_mode\":\"catmullrom\"},\"1.04\":{\"pre\":[0,5,-4],\"post\":[0,5,-4],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,-5,6],\"post\":[0,-5,6],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0,1.5,0],\"post\":[0,1.5,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,1.5,0],\"post\":[0,1.5,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"pre\":[45,-52.5,0],\"post\":[45,-52.5,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[56.72,2.34,0],\"post\":[56.72,2.34,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[52.5,45,0],\"post\":[52.5,45,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[45,-52.5,0],\"post\":[45,-52.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[1,0,0],\"post\":[1,0,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-40,55,0],\"post\":[-40,55,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[-55,-35,0],\"post\":[-55,-35,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[-54.99,10.03,0],\"post\":[-54.99,10.03,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[-40,55,0],\"post\":[-40,55,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[1,0,0],\"post\":[1,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[1,0,0],\"post\":[1,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"pre\":[65,-55,0],\"post\":[65,-55,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[50,52.5,0],\"post\":[50,52.5,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[50.01,-1.29,0],\"post\":[50.01,-1.29,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[65,-55,0],\"post\":[65,-55,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"pre\":[-62.5,35,0],\"post\":[-62.5,35,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"pre\":[-46.87,-15.62,0],\"post\":[-46.87,-15.62,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[-52.5,-55,0],\"post\":[-52.5,-55,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[-62.5,35,0],\"post\":[-62.5,35,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.44\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[-0.5,0,0],\"post\":[-0.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,15,0],\"post\":[0,15,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"pre\":[0,4,-5.8],\"post\":[0,4,-5.8],\"lerp_mode\":\"catmullrom\"},\"1.04\":{\"pre\":[0,-4,5],\"post\":[0,-4,5],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,4,-5.8],\"post\":[0,4,-5.8],\"lerp_mode\":\"catmullrom\"}}},\"left_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,-60,0],\"post\":[0,-60,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"pre\":[0,-45,0],\"post\":[0,-45,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,-60,0],\"post\":[0,-60,0],\"lerp_mode\":\"catmullrom\"}}},\"right_gills\":{\"rotation\":{\"0.0\":{\"pre\":[0,38,0],\"post\":[0,38,0],\"lerp_mode\":\"catmullrom\"},\"0.64\":{\"pre\":[0,53,0],\"post\":[0,53,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[0,38,0],\"post\":[0,38,0],\"lerp_mode\":\"catmullrom\"}}},\"top_gills\":{\"rotation\":{\"0.0\":{\"pre\":[-34,0,0],\"post\":[-34,0,0],\"lerp_mode\":\"catmullrom\"},\"1.04\":{\"pre\":[-41.5,0,0],\"post\":[-41.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"pre\":[-34,0,0],\"post\":[-34,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.play_dead\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0.0,0.0,45.0]},\"head\":{\"rotation\":[0.0,0.0,45.0]}}},\"animation.{name}.swim_angle\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"variable.pitch\",0.0,0.0]}}}}}'},2902:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.flying\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"45.0 - math.cos(query.life_time * 1489.6) * 8.59\",0,0],\"position\":[0,\"math.cos(query.life_time * 343.774) * 1.6\",0]},\"head\":{\"rotation\":[\"query.target_x_rotation\",\"query.target_y_rotation\",0],\"position\":[\"-this\",\"math.cos(query.life_time * 343.774) * 1.6 - this\",\"-this\"]},\"leftWing\":{\"rotation\":[0,\"math.cos(query.life_time * 1489.6) * -45.0\",0],\"position\":[\"-this\",\"-this\",\"-this\"]},\"leftWingTip\":{\"rotation\":[0,\"math.cos(query.life_time * 1489.6) * -22.0\",0]},\"rightWing\":{\"rotation\":[0,\"math.cos(query.life_time * 1489.6) * 45.0\",0],\"position\":[\"-this\",\"-this\",\"-this\"]},\"rightWingTip\":{\"rotation\":[0,\"math.cos(query.life_time * 1489.6) * 22.0\",0]}}},\"animation.{name}.resting\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[180,0,0],\"position\":[0,-0.035,0]},\"head\":{\"rotation\":[\"query.target_x_rotation\",\"180.0f - query.target_y_rotation\",180],\"position\":[0,-0.035,0]},\"leftWing\":{\"rotation\":[-9,72,0],\"position\":[3,0,3]},\"leftWingTip\":{\"rotation\":[0,99,0]},\"rightWing\":{\"rotation\":[-9,-72,0],\"position\":[-3,0,3]},\"rightWingTip\":{\"rotation\":[0,-99,0]}}}}}'},4017:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.flying\":{\"loop\":true,\"animation_length\":2.55,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"1.3\":[5,0,0],\"2.55\":[0,0,0]}},\"leftwing_bone\":{\"rotation\":{\"0.0\":[0,0,35],\"0.05\":[0,0,0],\"0.1\":[0,0,-35],\"0.15\":[0,0,0],\"0.2\":[0,0,35],\"0.25\":[0,0,0],\"0.3\":[0,0,-35],\"0.35\":[0,0,0],\"0.4\":[0,0,35],\"0.45\":[0,0,0],\"0.5\":[0,0,-35],\"0.55\":[0,0,0],\"0.6\":[0,0,35],\"0.65\":[0,0,0],\"0.7\":[0,0,-35],\"0.75\":[0,0,0],\"0.8\":[0,0,35],\"0.85\":[0,0,0],\"0.9\":[0,0,-35],\"0.95\":[0,0,0],\"1.0\":[0,0,35],\"1.05\":[0,0,0],\"1.1\":[0,0,-35],\"1.15\":[0,0,0],\"1.2\":[0,0,35],\"1.25\":[0,0,0],\"1.3\":[0,0,-35],\"1.35\":[0,0,0],\"1.4\":[0,0,35],\"1.45\":[0,0,0],\"1.5\":[0,0,-35],\"1.55\":[0,0,0],\"1.6\":[0,0,35],\"1.65\":[0,0,0],\"1.7\":[0,0,-35],\"1.75\":[0,0,0],\"1.8\":[0,0,35],\"1.85\":[0,0,0],\"1.9\":[0,0,-35],\"1.95\":[0,0,0],\"2.0\":[0,0,35],\"2.05\":[0,0,0],\"2.1\":[0,0,-35],\"2.15\":[0,0,0],\"2.2\":[0,0,35],\"2.25\":[0,0,0],\"2.3\":[0,0,-35],\"2.35\":[0,0,0],\"2.4\":[0,0,35],\"2.45\":[0,0,0],\"2.5\":[0,0,-35],\"2.55\":[0,0,0]}},\"leg_front\":{\"rotation\":{\"0.0\":[15,0,0],\"1.2\":[25,0,0],\"2.55\":[15,0,0]}},\"leg_mid\":{\"rotation\":{\"0.0\":[15,0,0],\"1.3\":[35,0,0],\"2.55\":[15,0,0]}},\"leg_back\":{\"rotation\":{\"0.0\":[30,0,0],\"1.6\":[45,0,0],\"2.55\":[30,0,0]}},\"rightwing_bone\":{\"rotation\":{\"0.0\":[0,0,-35],\"0.05\":[0,0,0],\"0.1\":[0,0,35],\"0.15\":[0,0,0],\"0.2\":[0,0,-35],\"0.25\":[0,0,0],\"0.3\":[0,0,35],\"0.35\":[0,0,0],\"0.4\":[0,0,-35],\"0.45\":[0,0,0],\"0.5\":[0,0,35],\"0.55\":[0,0,0],\"0.6\":[0,0,-35],\"0.65\":[0,0,0],\"0.7\":[0,0,35],\"0.75\":[0,0,0],\"0.8\":[0,0,-35],\"0.85\":[0,0,0],\"0.9\":[0,0,35],\"0.95\":[0,0,0],\"1.0\":[0,0,-35],\"1.05\":[0,0,0],\"1.1\":[0,0,35],\"1.15\":[0,0,0],\"1.2\":[0,0,-35],\"1.25\":[0,0,0],\"1.3\":[0,0,35],\"1.35\":[0,0,0],\"1.4\":[0,0,-35],\"1.45\":[0,0,0],\"1.5\":[0,0,35],\"1.55\":[0,0,0],\"1.6\":[0,0,-35],\"1.65\":[0,0,0],\"1.7\":[0,0,35],\"1.75\":[0,0,0],\"1.8\":[0,0,-35],\"1.85\":[0,0,0],\"1.9\":[0,0,35],\"1.95\":[0,0,0],\"2.0\":[0,0,-35],\"2.05\":[0,0,0],\"2.1\":[0,0,35],\"2.15\":[0,0,0],\"2.2\":[0,0,-35],\"2.25\":[0,0,0],\"2.3\":[0,0,35],\"2.35\":[0,0,0],\"2.4\":[0,0,-35],\"2.45\":[0,0,0],\"2.5\":[0,0,35],\"2.55\":[0,0,0]}}}},\"animation.{name}.sting\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-175 * math.sin(variable.attack_time * 180)\",0,0]}}},\"animation.{name}.no_stinger\":{\"loop\":true,\"bones\":{\"stinger\":{\"scale\":0}}},\"animation.{name}.fly.bobbing\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,\"20 * math.cos(query.life_time * 343.774 / 2)\",0],\"position\":[0,\"math.cos(query.life_time * 343.774) * 1.6\",0]}}}}}'},5129:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"upperBodyParts0\":{\"position\":[\"math.cos(query.life_time * -360.0        ) * 9.0\",\"2.0 + math.cos((0 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -360.0        ) * 9.0\"]},\"upperBodyParts1\":{\"position\":[\"math.cos(query.life_time * -360.0 +  90.0) * 9.0\",\"2.0 + math.cos((1 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -360.0 +  90.0) * 9.0\"]},\"upperBodyParts10\":{\"position\":[\"math.cos(query.life_time * -180.0 + 207.0) * 5.0\",\"-11.0 + math.cos((10 * 1.5 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -180.0 + 207.0) * 5.0\"]},\"upperBodyParts11\":{\"position\":[\"math.cos(query.life_time * -180.0 + 297.0) * 5.0\",\"-11.0 + math.cos((11 * 1.5 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -180.0 + 297.0) * 5.0\"]},\"upperBodyParts2\":{\"position\":[\"math.cos(query.life_time * -360.0 + 180.0) * 9.0\",\"2.0 + math.cos((2 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -360.0 + 180.0) * 9.0\"]},\"upperBodyParts3\":{\"position\":[\"math.cos(query.life_time * -360.0 + 270.0) * 9.0\",\"2.0 + math.cos((3 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -360.0 + 270.0) * 9.0\"]},\"upperBodyParts4\":{\"position\":[\"math.cos(query.life_time * 108.0 +  45.0) * 7.0\",\"-2.0 + math.cos((4 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * 108.0 +  45.0) * 7.0\"]},\"upperBodyParts5\":{\"position\":[\"math.cos(query.life_time * 108.0 + 135.0) * 7.0\",\"-2.0 + math.cos((5 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * 108.0 + 135.0) * 7.0\"]},\"upperBodyParts6\":{\"position\":[\"math.cos(query.life_time * 108.0 + 225.0) * 7.0\",\"-2.0 + math.cos((6 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * 108.0 + 225.0) * 7.0\"]},\"upperBodyParts7\":{\"position\":[\"math.cos(query.life_time * 108.0 + 315.0) * 7.0\",\"-2.0 + math.cos((7 * 2 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * 108.0 + 315.0) * 7.0\"]},\"upperBodyParts8\":{\"position\":[\"math.cos(query.life_time * -180.0 +  27.0) * 5.0\",\"-11.0 + math.cos((8 * 1.5 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -180.0 +  27.0) * 5.0\"]},\"upperBodyParts9\":{\"position\":[\"math.cos(query.life_time * -180.0 + 117.0) * 5.0\",\"-11.0 + math.cos((9 * 1.5 + query.life_time * 20.0) * 14.32)\",\"math.sin(query.life_time * -180.0 + 117.0) * 5.0\"]}}}}}'},5076:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.idle\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"tornado_top\":{\"position\":{\"0.0\":[0.5,0,0],\"0.25\":[0.5,0,-0.5],\"0.75\":[-0.5,0,-0.5],\"1.25\":[-0.5,0,0.5],\"1.75\":[0.5,0,0.5],\"2.0\":[0.5,0,0]}},\"tornado_mid\":{\"position\":{\"0.0\":[0.5,0,-0.5],\"0.5\":[-0.5,0,-0.5],\"1.0\":[-0.5,0,0.5],\"1.5\":[0.5,0,0.5],\"2.0\":[0.5,0,-0.5]}},\"head\":{\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,1,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"rods\":{\"rotation\":{\"0.0\":[0,0,0],\"2.0\":[0,1080,0]},\"position\":{\"0.0\":[0,0,0],\"1.0\":[0,-1,0],\"2.0\":[0,0,0]}}}},\"animation.{name}.shoot\":{\"animation_length\":1.125,\"bones\":{\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[-12.5,0,0],\"0.75\":[-12.5,0,0],\"0.9167\":[5,0,0],\"1.125\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,-2,0],\"0.7917\":[0,-1,2],\"0.9583\":[0,-1,0],\"1.125\":[0,0,0]}},\"tornado_bottom\":{\"rotation\":[0,0,0]},\"tornado_mid\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[12.5,0,0],\"0.75\":[12.5,0,0],\"0.9167\":[-10,0,0],\"1.125\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,5],\"0.75\":[0,0,6],\"0.9167\":[0,0,-2],\"1.125\":[0,0,0]}},\"tornado_top\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[15,0,0],\"0.75\":[15,0,0],\"0.9167\":[-10,0,0],\"1.125\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,3],\"0.8333\":[0,0,4],\"0.9583\":[0,0,-2],\"1.125\":[0,0,0]}},\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[12.5,0,0],\"0.75\":[12.5,0,0],\"0.9167\":[-2.5,0,0],\"1.125\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,3,5],\"0.8333\":[0,3,6],\"0.9583\":[0,3,-1],\"1.125\":[0,0,0]}},\"rods\":{\"rotation\":{\"0.0\":[0,0,0],\"1.0\":[0,360,0]}}}},\"animation.{name}.jump\":{\"animation_length\":1.125,\"bones\":{\"body\":{\"position\":{\"0.0\":[0,0,0],\"0.5\":[0,-10,0],\"0.625\":[0,-10,0],\"0.75\":[0,11,0],\"1.125\":[0,0,0]}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5\":[22.5,0,0],\"0.625\":[22.5,0,0],\"0.8333\":[-19.25,0,0],\"1.125\":[0,0,0]}},\"tornado_body\":{\"scale\":{\"0.0\":[1,1,1],\"0.5\":[1,1,1],\"0.625\":[1,1,1],\"0.75\":[1,1.3,1],\"1.125\":[1,1,1]}},\"tornado_bottom\":{\"rotation\":{\"0.0\":[0,0,0],\"0.625\":[0,90,0],\"1.125\":[0,360,0]},\"scale\":{\"0.0\":[1,1,1],\"0.5\":[1,1,1],\"0.625\":[1,1,1],\"0.75\":[1,1.1,1],\"1.125\":[1,1,1]}},\"tornado_mid\":{\"rotation\":{\"0.0\":[0,0,0],\"0.625\":[0,0,0],\"1.125\":[0,180,0]},\"position\":{\"0.0\":[0,0,0],\"0.5\":[0,-6,0],\"0.625\":[0,-6,0],\"0.75\":[0,2,0],\"1.125\":[0,0,0]}},\"tornado_top\":{\"rotation\":{\"0.0\":[0,0,0],\"0.625\":[0,0,0],\"1.125\":[0,90,0]},\"position\":{\"0.0\":[0,0,0],\"0.5\":[0,-5,0],\"0.625\":[0,-5,0],\"0.75\":[0,2,0],\"1.125\":[0,0,0]}},\"rods\":{\"rotation\":{\"0.0\":[0,0,0],\"0.8333\":[0,360,0]}}},\"particle_effects\":{\"0.75\":{\"effect\":\"ground_particles\",\"pre_effect_script\":\"variable.ground_particle_amount = math.round(math.random( 3, 4)); variable.ground_particle_initial_speed = math.random( 5, 6 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;\"}}},\"animation.{name}.slide\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":0.2,\"bones\":{\"body\":{\"position\":{\"0.0\":[0,0,0],\"0.2\":[0,0,-6]}},\"tornado_mid\":{\"position\":{\"0.0\":[0,0,0],\"0.2\":[0,0,-3]}},\"tornado_top\":{\"position\":{\"0.0\":[0,0,0],\"0.2\":[0,0,-2]}}}},\"animation.{name}.idle_ground_particles\":{\"loop\":true,\"animation_length\":0.1,\"particle_effects\":{\"0.0\":{\"effect\":\"ground_particles\",\"pre_effect_script\":\"variable.ground_particle_amount = 1; variable.ground_particle_initial_speed = math.random( 2, 3 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;\"}}},\"animation.{name}.slide_ground_particles\":{\"loop\":true,\"animation_length\":0.1,\"particle_effects\":{\"0.0\":{\"effect\":\"ground_particles\",\"pre_effect_script\":\"variable.ground_particle_amount = 5; variable.ground_particle_initial_speed = math.random( 3, 4 ); variable.ground_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.ground_particle_texture_size = query.surface_particle_texture_size; variable.ground_particle_color = query.surface_particle_color;\"}}},\"animation.{name}.whirl_sound\":{\"loop\":true,\"animation_length\":1.5,\"sound_effects\":{\"0.0\":{\"effect\":\"whirl\"}}},\"animation.{name}.idle_ground_sound\":{\"loop\":true,\"animation_length\":6.0,\"sound_effects\":{\"0.0\":{\"effect\":\"idle_ground_sound\"}}}}}'},4043:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.walk\":{\"loop\":true,\"animation_length\":1.5,\"anim_time_update\":\"query.anim_time + math.max(1.215, math.pow(10, query.modified_move_speed) / 2.9) * query.delta_time\",\"bones\":{\"root\":{\"rotation\":{\"0.0\":{\"post\":[0,0,1.75],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,-1.75],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,1.75],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[-2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.125\":{\"post\":[-2.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[2.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,4,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2083\":{\"post\":[0,4,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_hind_leg\":{\"rotation\":{\"0.0\":{\"post\":[-20.4,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.375\":[-22.5,0,0],\"1.5\":[-20.4,0,0]},\"position\":{\"0.0\":{\"post\":[0,-0.21,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[0,4,0],\"lerp_mode\":\"catmullrom\"},\"1.375\":[0,0,0],\"1.5\":[0,-0.21,0]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.625\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[0,4,0],\"lerp_mode\":\"catmullrom\"},\"0.625\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.125\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.125\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"tail\":{\"rotation\":{\"0.0\":{\"post\":[15.94102,-8.42106,20.94102],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[15.94102,8.42106,-20.94102],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[15.94102,-8.42106,20.94102],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.stand_up\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":2.6,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.7\":{\"pre\":[-17.5,0,0],\"post\":[-17.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[-17.83,0,0],\"lerp_mode\":\"catmullrom\"},\"2.3\":[-5.83,0,0],\"2.6\":[0,0,0]},\"position\":{\"0.0\":[0,-19.9,0],\"0.7\":[0,-19.9,-3],\"1.4\":{\"pre\":[0,-12.76,-4],\"post\":[0,-12.76,-4],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[0,-10.1,-4],\"lerp_mode\":\"catmullrom\"},\"2.3\":[0,-2.9,-2],\"2.6\":[0,0,0]}},\"right_front_leg\":{\"rotation\":{\"0.0\":[-90,10,0],\"0.5\":[-90,10,0],\"1.1\":[-49.06,10,0],\"1.8\":[-22.5,10,0],\"2.3\":[-25,10,0],\"2.6\":[0,0,0]},\"position\":{\"0.0\":[0,-20.6,12],\"0.5\":[0,-20.6,8],\"1.1\":[0,-7.14,4.42],\"1.8\":[0,-1.27,-1.33],\"2.3\":[0,-1.27,-0.33],\"2.6\":[0,0,0]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[-90,-10,0],\"0.5\":[-90,-10,0],\"1.1\":[-49.06,-10,0],\"1.8\":[-22.5,-10,0],\"2.3\":[-25,-10,0],\"2.6\":[0,0,0]},\"position\":{\"0.0\":[0,-20.6,12],\"0.5\":[0,-20.6,8],\"1.1\":[0,-7.14,4.42],\"1.8\":[0,-1.27,-1.33],\"2.3\":[0,-1.27,-0.33],\"2.6\":[0,0,0]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[-90,-15,0],\"0.3\":[-90,0,0],\"0.6\":[-90,0,0],\"1.1\":[-60,0,0],\"1.9\":[35,0,0],\"2.2\":[30,0,0],\"2.6\":[0,0,0]},\"position\":{\"0.0\":[1,-20.5,5],\"0.3\":[-2,-20.5,3],\"0.6\":[-2,-20.5,3],\"1.1\":[-2,-10.5,2],\"1.5\":[-2,-0.4,-3.9],\"1.9\":[-2,-4.3,-9.8],\"2.2\":[-1,-2.5,-5],\"2.6\":[0,0,0]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[-90,15,0],\"0.3\":[-90,0,0],\"0.6\":[-90,0,0],\"1.1\":[-60,0,0],\"1.9\":[35,0,0],\"2.2\":[30,0,0],\"2.6\":[0,0,0]},\"position\":{\"0.0\":[-1,-20.5,5],\"0.3\":[2,-20.5,3],\"0.6\":[2,-20.5,3],\"1.1\":[2,-10.5,2],\"1.5\":[2,-0.4,-3.9],\"1.9\":[2,-4.3,-9.8],\"2.2\":[1,-2.5,-5],\"2.6\":[0,0,0]}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.3\":[0,0,0],\"0.8\":[55,0,0],\"2.0\":[65,0,0],\"2.4\":[0,0,0]}},\"tail\":{\"rotation\":{\"0.0\":[50,0,0],\"0.4\":[55,0,0],\"0.9\":[55,0,0],\"1.5\":[17.5,0,0],\"2.6\":[5,0,0]}},\"left_ear\":{\"rotation\":{\"0.0\":[0,0,-45],\"2.6\":[0,0,-45]}},\"right_ear\":{\"rotation\":{\"0.0\":[0,0,45],\"2.6\":[0,0,45]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"stand_up\"}}},\"animation.{name}.dash\":{\"animation_length\":0.5,\"loop\":true,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[5,0,0],\"0.5\":[5,0,0]}},\"tail\":{\"rotation\":{\"0.0\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[112.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[112.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[44.97272,1.76749,-1.76833],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[44.97272,1.76749,-1.76833],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[44.97272,1.76749,-1.76833],\"lerp_mode\":\"catmullrom\"}}},\"left_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[44.97272,-1.76749,1.76833],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[44.97272,-1.76749,1.76833],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-90,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_hind_leg\":{\"rotation\":{\"0.0\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_hind_leg\":{\"rotation\":{\"0.0\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ear\":{\"rotation\":{\"0.0\":[0,-67.5,0],\"0.5\":[0,-67.5,0]}},\"right_ear\":{\"rotation\":{\"0.0\":[0,67.5,0],\"0.5\":[0,67.5,0]}}}},\"animation.{name}.dash_sound\":{\"animation_length\":0.5,\"loop\":false,\"sound_effects\":{\"0.0\":{\"effect\":\"dash\"}}},\"animation.{name}.idle\":{\"loop\":true,\"animation_length\":4,\"bones\":{\"head\":{\"rotation\":[\"variable.xHeadRot\",\"variable.yHeadRot\",0]},\"tail\":{\"rotation\":{\"0.0\":{\"post\":[5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[4.98107,0.43523,-4.98107],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[4.9872,-0.29424,3.36745],\"lerp_mode\":\"catmullrom\"},\"4.0\":{\"post\":[5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"},\"2.625\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"},\"4.0\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"}}},\"right_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"},\"2.625\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"},\"4.0\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.sit_down\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":2,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"1.3\":[30,0,0],\"1.8\":[24,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"1.3\":[0,0,1],\"1.8\":[0,-6,1],\"2.0\":[0,-19.9,0]}},\"right_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.0\":[-30,0,0],\"1.5\":[-30,0,0],\"2.0\":[-90,10,0]},\"position\":{\"0.0\":[0,0,0],\"1.0\":[0,-2,11],\"1.5\":[0,-2,11],\"1.7\":[0,-8.4,11.4],\"2.0\":[0,-20.6,12]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.0\":[-30,0,0],\"1.5\":[-30,0,0],\"2.0\":[-90,-10,0]},\"position\":{\"0.0\":[0,0,0],\"1.0\":[0,-2,11],\"1.5\":[0,-2,11],\"1.7\":[0,-8.4,11.4],\"2.0\":[0,-20.6,12]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5\":[0,0,0],\"1.5\":[-10,0,0],\"1.7\":[-15,-3,0],\"1.9\":[-65,-9,0],\"2.0\":[-90,-15,0]},\"position\":{\"0.0\":[0,0,0],\"0.5\":[0,0,0],\"1.5\":[0,0,1],\"1.7\":[1,-0.62,0.25],\"1.9\":[0.5,-11.25,2.5],\"2.0\":[1,-20.5,5]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5\":[0,0,0],\"1.5\":[-10,0,0],\"1.7\":[-15,3,0],\"1.9\":[-65,9,0],\"2.0\":[-90,15,0]},\"position\":{\"0.0\":[0,0,0],\"0.5\":[0,0,0],\"1.5\":[0,0,1],\"1.7\":[-1,-0.62,0.25],\"1.9\":[-0.5,-11.25,2.5],\"2.0\":[-1,-20.5,5]}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.7\":[-27.5,0,0],\"1.5\":[-21.25,0,0],\"2.0\":[0,0,0]}},\"tail\":{\"rotation\":{\"0.0\":[5,0,0],\"1.7\":[5,0,0],\"1.9\":[80,0,0],\"2.0\":[50,0,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"sit_down\"}}},\"animation.{name}.sit\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,0,0],\"position\":[0,-19.9,0]},\"right_front_leg\":{\"rotation\":[-90,10,0],\"position\":[0,-20.6,12]},\"left_front_leg\":{\"rotation\":[-90,-10,0],\"position\":[0,-20.6,12]},\"left_hind_leg\":{\"rotation\":[-90,-15,0],\"position\":[1,-20.5,5]},\"right_hind_leg\":{\"rotation\":[-90,15,0],\"position\":[-1,-20.5,5]},\"tail\":{\"rotation\":[50,0,0]}}}}}'},6609:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"scale\":1.5}}},\"animation.{name}.lie_down\":{\"loop\":true,\"bones\":{\"backLegL\":{\"rotation\":[-22.92,0,0],\"position\":[0,-0.7,0]},\"backLegR\":{\"rotation\":[28.65,0,-28.65],\"position\":[0.1,-1.2,0]},\"body\":{\"rotation\":[0,0,\"math.lerprotate(0.0, 90.0, variable.liedownamount)\"],\"position\":[0,\"variable.liedownamount * -4.5 + variable.lieonplayer * (4.5 + query.is_baby * 6)\",0]},\"frontLegL\":{\"rotation\":[-72.81,0,0],\"position\":[0,-1,-1.5]},\"frontLegR\":{\"rotation\":[-30,0,-14.46],\"position\":[0.2,-0.9,0]},\"head\":{\"rotation\":[-10,\"math.lerprotate(this, 75.81, variable.liedownamount)\",0],\"position\":[-0.1,0,-0.5]},\"tail1\":{\"rotation\":[\"math.lerprotate(this, -33.84, variable.liedownamounttail)\",0,0],\"position\":[0,0,0]},\"tail2\":{\"rotation\":[\"math.lerprotate(this, -68.92, variable.liedownamounttail)\",0,0],\"position\":[0,0,0]}}},\"animation.{name}.sit\":{\"loop\":true,\"bones\":{\"backLegL\":{\"rotation\":[-45,0,0],\"position\":[0,0,1]},\"backLegR\":{\"rotation\":[-45,0,0],\"position\":[0,0,1]},\"body\":{\"rotation\":[-45,0,0],\"position\":[0,-1,0]},\"frontLegL\":{\"rotation\":[42.15,0,0],\"position\":[0,-4.5,-1]},\"frontLegR\":{\"rotation\":[42.15,0,0],\"position\":[0,-4.5,-1]},\"tail1\":{\"rotation\":[87.5,0,0],\"position\":[0,-3,1]},\"tail2\":{\"rotation\":[-7.5,0,0],\"position\":[0,0,0]}}},\"animation.{name}.sneak\":{\"loop\":true,\"bones\":{\"backLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed\",0,0],\"position\":[0,1,0]},\"backLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed\",0,0],\"position\":[0,1,0]},\"body\":{\"position\":[0,-1,0]},\"frontLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed\",0,0],\"position\":[0,1,0]},\"frontLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed\",0,0],\"position\":[0,1,0]},\"head\":{\"position\":[0,-1,0]},\"tail1\":{\"position\":[0,1,0]},\"tail2\":{\"rotation\":[\"-3 + math.cos(query.modified_distance_moved * 57.3) * 27.0 * query.modified_move_speed\",0,0]}}},\"animation.{name}.sprint\":{\"loop\":true,\"bones\":{\"backLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed\",0,0]},\"backLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 17.19) * 57.3 * query.modified_move_speed\",0,0]},\"frontLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 197.19) * 57.3 * query.modified_move_speed\",0,0]},\"frontLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed\",0,0]},\"tail1\":{\"rotation\":[0,0,0]},\"tail2\":{\"rotation\":[\"-8 + math.cos(query.modified_distance_moved * 57.3) * 18.0 * query.modified_move_speed\",0,0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"backLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed\",0,0]},\"backLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed\",0,0]},\"frontLegL\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed\",0,0]},\"frontLegR\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed\",0,0]},\"tail1\":{\"rotation\":[28.43,0,0]},\"tail2\":{\"rotation\":[\"-43 + math.cos(query.modified_distance_moved * 57.3) * 45.0 * query.modified_move_speed\",0,0]}}}}}'},9830:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"scale\":2}}},\"animation.{name}.general\":{\"loop\":true,\"bones\":{\"wing0\":{\"rotation\":[0,0,\"variable.wing_flap - this\"]},\"wing1\":{\"rotation\":[0,0,\"-variable.wing_flap - this\"]}}},\"animation.{name}.move\":{\"loop\":true,\"anim_time_update\":\"query.modified_distance_moved\",\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0,0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0,0]}}}}}'},6451:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.flop\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 45.0) * 2.0\",\"variable.zrot\"]},\"head\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 45.0) * 4.0\",0]},\"tailfin\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 45.0) * -25.75\",0]}}},\"animation.{name}.swim\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 30.0) * 2.0\",0]},\"head\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 30.0) * 4.0\",0]},\"tailfin\":{\"rotation\":[0,\"math.cos(variable.animationamountblend * 30.0) * -25.75\",0]}}}}}'},7230:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0,4,4],\"scale\":2}}},\"animation.{name}.walk\":{\"loop\":true,\"anim_time_update\":\"query.modified_distance_moved\",\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0,0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0,0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0,0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0,0]}}}}}'},1955:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.legs\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"variable.leg_rot - this\",0.0,0.0]},\"leg1\":{\"rotation\":[\"-variable.leg_rot - this\",0.0,0.0]},\"leg2\":{\"rotation\":[\"-variable.leg_rot - this\",0.0,0.0]},\"leg3\":{\"rotation\":[\"variable.leg_rot - this\",0.0,0.0]}}},\"animation.{name}.swelling\":{\"loop\":true,\"bones\":{\"body\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]},\"head\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]},\"leg0\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]},\"leg1\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]},\"leg2\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]},\"leg3\":{\"scale\":[\"variable.swelling_scale1\",\"variable.swelling_scale2\",\"variable.swelling_scale1\"]}}}}}'},8741:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"query.target_x_rotation - 2.865 + (-2.865 * math.cos(query.life_time * 343.8))\",\"query.target_y_rotation\",0.0]},\"left_fin\":{\"rotation\":[0.0,0.0,\"17.19 * math.cos(query.life_time * 229.2) + 22.92\"]},\"right_fin\":{\"rotation\":[0.0,0.0,\"-17.19 * math.cos(query.life_time * 229.2) - 22.92\"]},\"tail\":{\"rotation\":[\"-5.73 * math.cos(query.life_time * 343.8)\",0.0,0.0]},\"tail_fin\":{\"rotation\":[\"-11.46 * math.cos(query.life_time * 343.8)\",0.0,0.0]}}}}}'},6494:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack.rotations\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0.0,\"math.sin(math.sqrt(variable.attack_time) * 360.0) * 11.46\",0.0]},\"leftarm\":{\"rotation\":[\"-(math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) + math.sin(variable.attack_time * 180.0)) * 5.73\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"-(math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 34.38 + math.sin(variable.attack_time * 180.0) * 28.65) * (variable.is_brandishing_spear ? -2.5 : 1.0 )\",\"variable.is_brandishing_spear ? 0.0 : math.sin(math.sqrt(variable.attack_time) * 360.0) * 22.92\",0.0]}}}}}'},9693:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.arms_legs\":{\"loop\":true,\"bones\":{\"leftArm\":{\"rotation\":[\"math.clamp(this, -22.92, 22.92) - this\",0,0]},\"leftLeg\":{\"rotation\":[\"math.clamp(this, -22.92, 22.92) - this\",0,0]},\"rightArm\":{\"rotation\":[\"math.clamp(this, -22.92, 22.92) - this\",0,0]},\"rightLeg\":{\"rotation\":[\"math.clamp(this, -22.92, 22.92) - this\",0,0]}}},\"animation.{name}.carrying\":{\"loop\":true,\"bones\":{\"leftArm\":{\"rotation\":[\"-28.65 - this\",0,\"-2.87 - this\"]},\"rightArm\":{\"rotation\":[\"-28.65 - this\",0,\"2.87 - this\"]}}},\"animation.{name}.scary_face\":{\"loop\":true,\"bones\":{\"hat\":{\"position\":[0,\"-5.0 - this\",0]},\"head\":{\"position\":[0,\"5.0 - this\",0]}}},\"animation.{name}.attack.rotations\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,\"math.sin(math.sqrt(variable.attack_time) * 360) * 11.46 - this\",0]},\"leftArm\":{\"rotation\":[\"math.sin(math.sqrt(variable.attack_time) * 360) * 11.46\",0,0]},\"rightArm\":{\"rotation\":[\"math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )\",\"variable.is_brandishing_spear ? 0.0 : (math.sin(math.sqrt(variable.attack_time) * 360) * 11.46) * 2.0\",0]}}},\"animation.{name}.bob\":{\"loop\":true,\"bones\":{\"leftArm\":{\"rotation\":[0,0,\"((math.cos(query.life_time * 103.2) * 2.865) + 2.865) *-1.0\"]},\"rightArm\":{\"rotation\":[0,0,\"(math.cos(query.life_time * 103.2) * 2.865) + 2.865\"]}}},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"leftArm\":{\"rotation\":[\"variable.tcos0\",0,0]},\"leftLeg\":{\"rotation\":[\"variable.tcos0 * -1.4\",0,0]},\"rightArm\":{\"rotation\":[\"-variable.tcos0\",0,0]},\"rightLeg\":{\"rotation\":[\"variable.tcos0 * 1.4\",0,0]}}}}}'},4730:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"section_0\":{\"position\":[\"(math.cos(-query.life_time * 928.26) * 1.26) - this\",0.0,0.0],\"rotation\":[0.0,\"(math.cos(query.life_time * 928.26) * 26.9) - this\",0.0]},\"section_1\":{\"position\":[\"(math.sin(query.life_time * 928.26) * 0.63) - this\",0.0,0.0],\"rotation\":[0.0,\"(math.cos(query.life_time * 928.26) * 16) - this\",0.0]},\"section_2\":{\"position\":[0.0,0.0,0.0],\"rotation\":[0.0,\"(math.cos(query.life_time * 928.26) * 9.17) - this\",0.0]},\"section_3\":{\"position\":[\"(math.cos(query.life_time * 928.26) * 0.8) - this\",0.0,0.0]}}}}}'},4597:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.casting\":{\"loop\":true,\"bones\":{\"arms\":{\"scale\":0.0},\"leftarm\":{\"rotation\":[\"math.cos(query.life_time * 763.4) * 14.3239 - this\",\"-this\",\"-135.0 - this\"],\"scale\":1.0},\"rightarm\":{\"rotation\":[\"math.cos(query.life_time * 763.4) * 14.3239 - this\",\"-this\",\"135.0 - this\"],\"scale\":1.0}}},\"animation.{name}.casting.v1.0\":{\"loop\":true,\"bones\":{\"leftarm\":{\"position\":[\"5.0 - this\",0.0,\"-this\"],\"rotation\":[\"math.cos(query.life_time * 763.4) * 14.3239 - this\",\"-this\",\"-135.0 - this\"]},\"rightarm\":{\"position\":[\"-5.0 - this\",0.0,\"-this\"],\"rotation\":[\"math.cos(query.life_time * 763.4) * 14.3239 - this\",\"-this\",\"135.0 - this\"]}}},\"animation.{name}.general\":{\"loop\":true,\"bones\":{\"arms\":{\"position\":[0.0,\"-3.0 - this\",\"-1.0 - this\"],\"rotation\":[\"-42.97 - this\",\"- this\",\"- this\"],\"scale\":1.0},\"leftarm\":{\"scale\":0.0},\"rightarm\":{\"scale\":0.0}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17) * 40.0) - this\",\"-this\",0.0]},\"leg1\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this\",\"-this\",0.0]}}}}}'},3684:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,\"query.is_baby ? 4.0 : 0.0\",\"query.is_baby ? 4.0 : 0.0\"],\"scale\":\"query.is_baby ? 1.3 : 1.0\"}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}},\"animation.{name}.setup\":{\"loop\":true},\"animation.{name}.crouch\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-1.8,0.0],\"rotation\":[0.0,0.0,0.0]},\"head\":{\"position\":[0.0,-0.8,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg0\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg1\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg2\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg3\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]}}},\"animation.{name}.pounce\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,0.0,0.0],\"rotation\":[\"query.vertical_speed * -7.0\",0.0,0.0]},\"head\":{\"position\":[0.0,0.0,0.0],\"rotation\":[\"query.vertical_speed * -7.0\",0.0,0.0]}}},\"animation.{name}.sit\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,1.0,0.0],\"rotation\":[-60.0,0.0,0.0]},\"head\":{\"position\":[0.0,3.0,-3.0],\"rotation\":[60.0,0.0,0.0]},\"leg0\":{\"position\":[0.0,4.0,2.5],\"rotation\":[-15.0,0.0,0.0]},\"leg1\":{\"position\":[0.0,4.0,2.5],\"rotation\":[-15.0,0.0,0.0]},\"leg2\":{\"position\":[0.0,0.75,3.5],\"rotation\":[40.0,0.0,0.0]},\"leg3\":{\"position\":[0.0,0.75,3.5],\"rotation\":[40.0,0.0,0.0]},\"tail\":{\"position\":[0.0,-0.075,-0.15],\"rotation\":[60.0,0.0,0.0]}}},\"animation.{name}.sleep\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-4.8,0.0],\"rotation\":[0.0,0.0,-90.0]},\"head\":{\"position\":[1.8,-0.4,-2.0],\"rotation\":[0.0,-115.0,\"math.cos(query.anim_time * 160.0) + 90 -this\"]},\"tail\":{\"position\":[0.0,0.0,1.5],\"rotation\":[-125.0,0.0,0.0]}}},\"animation.{name}.stuck\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-0.3,0.0],\"rotation\":[60.0,0.0,0.0]}}},\"animation.{name}.wiggle\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-1.8,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 20.0 * 53.7) * 5.0 -this\",0.0]},\"head\":{\"position\":[0.0,-0.8,0.0],\"rotation\":[\"math.clamp(-5.0 * (query.anim_time / 2.0), -5.0, 0)\",0.0,\"math.clamp(25.0 * (query.anim_time / 2.0), 0, 25.0)\"]},\"leg0\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg1\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg2\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"leg3\":{\"position\":[0.0,1.6,0.0],\"rotation\":[0.0,0.0,0.0]},\"tail\":{\"rotation\":[0.0,\"math.cos(query.life_time * 20.0 * 53.7) * 10.0 -this\",0.0]}}}}}'},7257:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.croak\":{\"animation_length\":3,\"bones\":{\"croaking_body\":{\"position\":{\"0.0\":[0,0,0],\"0.375\":[0,0,0],\"0.4167\":[0,0,0],\"0.4583\":[0,1,0],\"2.9583\":[0,1,0],\"3.0\":[0,0,0]},\"scale\":{\"0.0\":[0,0,0],\"0.375\":[0,0,0],\"0.4167\":[1,1,1],\"0.4583\":[1,1,1],\"0.5417\":[1.3,2.1,1.6],\"0.625\":[1.3,2.1,1.6],\"0.7083\":[1,1,1],\"2.25\":[1,1,1],\"2.3333\":[1.3,2.1,1.6],\"2.4167\":[1.3,2.1,1.6],\"2.5\":[1,1,1],\"2.5833\":[1,1,1],\"2.6667\":[1.3,2.1,1.6],\"2.875\":[1.3,2.1,1.8],\"2.9583\":[1,1,1],\"3.0\":[0,0,0]}}}},\"animation.{name}.walk\":{\"loop\":true,\"animation_length\":1.25,\"bones\":{\"left_arm\":{\"rotation\":{\"0.0\":[0,-5,0],\"0.2917\":[7.5,-2.67,-7.5],\"0.625\":[0,0,0],\"0.7917\":[22.5,0,0],\"1.125\":[-45,0,0],\"1.25\":[0,-5,0]},\"position\":{\"0.0\":[0,0.1,-2],\"0.2917\":[-0.5,-0.25,-0.13],\"0.625\":[-0.5,0.1,2],\"0.9583\":[0.5,1,-0.11],\"1.25\":[0,0.1,-2]}},\"right_arm\":{\"rotation\":{\"0.0\":[0,0,0],\"0.125\":[22.5,0,0],\"0.4583\":[-45,0,0],\"0.625\":[0,5,0],\"0.9583\":[7.5,2.33,7.5],\"1.25\":[0,0,0]},\"position\":{\"0.0\":[0.5,0.1,2],\"0.2917\":[-0.5,1,0.12],\"0.625\":[0,0.1,-2],\"0.9583\":[0.5,-0.25,-0.13],\"1.25\":[0.5,0.1,2]}},\"left_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.1667\":[0,0,0],\"0.2917\":[45,0,0],\"0.625\":[-45,0,0],\"0.7917\":[0,0,0],\"1.25\":[0,0,0]},\"position\":{\"0.0\":[0,0.1,1.2],\"0.1667\":[0,0.1,2],\"0.4583\":[0,2,1.06],\"0.7917\":[0,0.1,-1],\"1.25\":[0,0.1,1.2]}},\"right_leg\":{\"rotation\":{\"0.0\":[-33.75,0,0],\"0.0417\":[-45,0,0],\"0.1667\":[0,0,0],\"0.7917\":[0,0,0],\"0.9583\":[45,0,0],\"1.25\":[-33.75,0,0]},\"position\":{\"0.0\":[0,1.14,0.11],\"0.1667\":[0,0.1,-1],\"0.7917\":[0,0.1,2],\"1.125\":[0,2,0.95],\"1.25\":[0,1.14,0.11]}},\"body\":{\"rotation\":{\"0.0\":[0,5,0],\"0.2917\":[-7.5,0.33,7.5],\"0.625\":[0,-5,0],\"0.9583\":[-7.5,0.33,-7.5],\"1.25\":[0,5,0]}}}},\"animation.{name}.jump\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":0.375,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[-20,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,0]}},\"left_arm\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[-56.14,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,1,0]}},\"right_arm\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[-56.14,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,1,0]}},\"left_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[45,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,0]}},\"right_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.25\":[45,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.25\":[0,0,0]}}}},\"animation.{name}.tongue\":{\"animation_length\":0.5,\"bones\":{\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.0833\":[-60,0,0],\"0.4167\":[-60,0,0],\"0.5\":[0,0,0]},\"scale\":{\"0.0\":[1,1,1],\"0.0833\":[0.998,1,1],\"0.4167\":[0.998,1,1],\"0.5\":[1,1,1]}},\"tongue\":{\"rotation\":{\"0.0\":[0,0,0],\"0.0833\":[0,0,0],\"0.4167\":[-18,0,0],\"0.5\":[0,0,0]},\"scale\":{\"0.0833\":[1,1,1],\"0.1667\":[0.5,1,5],\"0.4167\":[1,1,1]}}}},\"animation.{name}.swim\":{\"loop\":true,\"animation_length\":1.04167,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[-10,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[90,22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[45,22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[-22.5,-22.5,-22.5],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[-45,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[22.5,0,22.5],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[90,22.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,-0.64,2],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,-0.64,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[0,-0.27,-1.14],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[0,-1.45,0.43],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[0,-0.64,2],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[90,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[45,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[-22.5,22.5,22.5],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[-45,22.5,0],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[22.5,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[90,-22.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,-0.64,2],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,-0.64,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[0,-0.27,-1.14],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[0,-1.45,0.43],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[0,-0.64,2],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[67.5,-45,0],\"lerp_mode\":\"catmullrom\"},\"0.7917\":{\"post\":[90,45,0],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[-2.5,0,1],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[-2,0,1],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[1,-2,-1],\"lerp_mode\":\"catmullrom\"},\"0.7917\":{\"post\":[0.58,0,-2.83],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[-2.5,0,1],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[-2.5,0,1],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[67.5,45,0],\"lerp_mode\":\"catmullrom\"},\"0.7917\":{\"post\":[90,-45,0],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[2.5,0,1],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[2,0,1],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[-1,-2,-1],\"lerp_mode\":\"catmullrom\"},\"0.7917\":{\"post\":[-0.58,0,-2.83],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[2.5,0,1],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[2.5,0,1],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.idle.water\":{\"loop\":true,\"animation_length\":3,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[-10,0,0],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[0,0,-45],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[-1,0,0],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[-1,-0.5,0],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[-1,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[0,0,45],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,22.5],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[1,0,0],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[1,-0.5,0],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[1,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"post\":[22.5,-22.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[22.5,-22.5,-45],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[22.5,-22.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,1],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"post\":[22.5,22.5,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[22.5,22.5,45],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[22.5,22.5,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,1],\"lerp_mode\":\"catmullrom\"}}}}}}}'},4532:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"tentacles_0\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 0) * 11.5 + 23\",0.0,0.0]},\"tentacles_1\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 57) * 11.5 + 23\",0.0,0.0]},\"tentacles_2\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 115) * 11.5 + 23\",0.0,0.0]},\"tentacles_3\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 172) * 11.5 + 23\",0.0,0.0]},\"tentacles_4\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 229) * 11.5 + 23\",0.0,0.0]},\"tentacles_5\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 286) * 11.5 + 23\",0.0,0.0]},\"tentacles_6\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 344) * 11.5 + 23\",0.0,0.0]},\"tentacles_7\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 402) * 11.5 + 23\",0.0,0.0]},\"tentacles_8\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 458) * 11.5 + 23\",0.0,0.0]}}},\"animation.{name}.scale\":{\"loop\":true,\"bones\":{\"body\":{\"scale\":4.5}}}}}'},216:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_scaling\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,10.0,4.0],\"scale\":1.4}}},\"animation.{name}.look_at_target\":{\"loop\":true,\"bones\":{\"head\":{\"relative_to\":{\"rotation\":\"entity\"},\"rotation\":[\"math.clamp(query.target_x_rotation, -40, 40)\",\"math.clamp(query.target_y_rotation, -45, 25)\",0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"right_back_leg\":{\"rotation\":[\"variable.tcos_right_side * 0.5\",0.0,0.0]},\"left_back_leg\":{\"rotation\":[\"variable.tcos_left_side * 0.5\",0.0,0.0]},\"right_front_leg\":{\"rotation\":[\"-variable.tcos_right_side * 0.5\",0.0,0.0]},\"left_front_leg\":{\"rotation\":[\"-variable.tcos_left_side * 0.5\",0.0,0.0]}}},\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"variable.attack_head_rot\",0,0]}}},\"animation.{name}.ram_attack\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"variable.ram_head_rot\",0,0]}}},\"animation.{name}.horns\":{\"loop\":true,\"bones\":{\"right_horn\":{\"scale\":\"variable.goat_has_right_horn\"},\"left_horn\":{\"scale\":\"variable.goat_has_left_horn\"}}}}}'},7308:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move_eye\":{\"loop\":true,\"bones\":{\"eye\":{\"position\":[\"query.eye_target_x_rotation - this\",\" query.eye_target_y_rotation - this\",\"-8.25 - this\"]}}},\"animation.{name}.setup\":{\"loop\":true,\"bones\":{\"spikepart0\":{\"rotation\":[\"-45.0 - this\",\"0.0 - this\",\"0.0 - this\"],\"position\":[0,-24,0]},\"spikepart1\":{\"rotation\":[\"45.0 - this\",\"0.0 - this\",\"0.0 - this\"],\"position\":[0,-24,0]},\"spikepart10\":{\"rotation\":[\"0.0 - this\",\"0.0 - this\",\" 135.0 - this\"],\"position\":[0,-24,0]},\"spikepart11\":{\"rotation\":[\"0.0 - this\",\"0.0 - this\",\" -135.0 - this\"],\"position\":[0,-24,0]},\"spikepart2\":{\"rotation\":[\"0.0 - this\",\"0.0 - this\",\"45.0 - this\"],\"position\":[0,-24,0]},\"spikepart3\":{\"rotation\":[\"0.0 - this\",\"0.0  - this\",\"-45.0 - this\"],\"position\":[0,-24,0]},\"spikepart4\":{\"rotation\":[\"90.0 - this\",\"45.0 - this\",\" 0.0 - this\"],\"position\":[0,-24,0]},\"spikepart5\":{\"rotation\":[\"90.0 - this\",\"-45.0 - this\",\" 0.0 - this\"],\"position\":[0,-24,0]},\"spikepart6\":{\"rotation\":[\"90.0 - this\",\"-135.0 - this\",\"0.0 - this\"],\"position\":[0,-24,0]},\"spikepart7\":{\"rotation\":[\"90.0 - this\",\"135.0 - this\",\" 0.0 - this\"],\"position\":[0,-24,0]},\"spikepart8\":{\"rotation\":[\"-135.0 - this\",\"0.0 - this\",\" 0.0 - this\"],\"position\":[0,-24,0]},\"spikepart9\":{\"rotation\":[\"135.0 - this\",\"0.0 - this\",\" 0.0 - this\"],\"position\":[0,-24,0]}}},\"animation.{name}.spikes\":{\"loop\":true,\"bones\":{\"spikepart0\":{\"position\":[\"-this\",\"24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"8 * (1 + math.cos(query.life_time * 20 * 1.5) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\"]},\"spikepart1\":{\"position\":[\"-this\",\"24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 1) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 1) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\"]},\"spikepart10\":{\"position\":[\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 10) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\",\"-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 10) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"-this\"]},\"spikepart11\":{\"position\":[\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 11) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\",\"-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 11) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"-this\"]},\"spikepart2\":{\"position\":[\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 2) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\",\"24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 2) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"-this\"]},\"spikepart3\":{\"position\":[\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 3) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\",\"24 + -8 * (1 + math.cos(query.life_time * 20 * 1.5 + 3) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",0]},\"spikepart4\":{\"position\":[\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 4) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\",\"8 - this\",\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 4) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\"]},\"spikepart5\":{\"position\":[\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 5) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\",\"8 - this\",\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 5) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\"]},\"spikepart6\":{\"position\":[\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 6) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\",\"8 - this\",\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 6) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\"]},\"spikepart7\":{\"position\":[\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 7) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\",\"8 - this\",\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 7) * 0.01 - (variable.spike_extension - variable.spike_shake)) - this\"]},\"spikepart8\":{\"position\":[\"-this\",\"-8  + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 8) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"8 * (1 + math.cos(query.life_time * 20 * 1.5 + 8) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\"]},\"spikepart9\":{\"position\":[\"-this\",\"-8 + 8 * (1 + math.cos(query.life_time * 20 * 1.5 + 9) * 0.01 + (variable.spike_extension + variable.spike_shake)) - this\",\"-8 * (1 + math.cos(query.life_time * 20 * 1.5 + 9) * 0.01 - (variable.spike_extension + variable.spike_shake)) - this\"]}}},\"animation.{name}.swim\":{\"loop\":true,\"bones\":{\"tailpart0\":{\"rotation\":[0,\"variable.tail_base_angle * 11.6 - this\",0]},\"tailpart1\":{\"position\":[\"-1.5 - this\",\"-0.5 - this\",\"14.0 - this\"],\"rotation\":[0,\"variable.tail_base_angle * 22.8 - this\",0]},\"tailpart2\":{\"position\":[\"0.5 - this\",\"-0.5 - this\",\"6.0 - this\"],\"rotation\":[0,\"variable.tail_base_angle * 34.4 - this\",0]}}}}}'},2797:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"tentacles_0\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 0) * 11.5 + 23\",0.0,0.0]},\"tentacles_1\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 57) * 11.5 + 23\",0.0,0.0]},\"tentacles_2\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 115) * 11.5 + 23\",0.0,0.0]},\"tentacles_3\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 172) * 11.5 + 23\",0.0,0.0]},\"tentacles_4\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 229) * 11.5 + 23\",0.0,0.0]},\"tentacles_5\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 286) * 11.5 + 23\",0.0,0.0]},\"tentacles_6\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 344) * 11.5 + 23\",0.0,0.0]},\"tentacles_7\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 402) * 11.5 + 23\",0.0,0.0]},\"tentacles_8\":{\"rotation\":[\"math.sin(query.life_time * 360.0 + 458) * 11.5 + 23\",0.0,0.0]}}},\"animation.{name}.scale\":{\"loop\":true,\"bones\":{\"body\":{\"scale\":\"variable.scale\"}}}}}'},7514:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_scaling\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,10.0,4.0],\"scale\":1.4}}},\"animation.{name}.look_at_target\":{\"loop\":true,\"bones\":{\"head\":{\"relative_to\":{\"rotation\":\"entity\"},\"rotation\":[0,\"query.target_y_rotation - this\",0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"left_ear\":{\"rotation\":[0.0,0.0,\"variable.tcos_left_side * 0.5\"]},\"right_ear\":{\"rotation\":[0.0,0.0,\"variable.tcos_right_side * 0.5\"]},\"leg_back_right\":{\"rotation\":[\"variable.tcos_right_side\",0.0,0.0]},\"leg_back_left\":{\"rotation\":[\"variable.tcos_left_side\",0.0,0.0]},\"leg_front_right\":{\"rotation\":[\"-variable.tcos_right_side\",0.0,0.0]},\"leg_front_left\":{\"rotation\":[\"-variable.tcos_left_side\",0.0,0.0]}}},\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"variable.attack_head_rot\",0,0]}}}}}'},7504:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"11 * ((0.0625 - query.model_scale) * 16.0)\",0.0]},\"head\":{\"scale\":\"1.0 + 0.5 * (1.0 - (query.model_scale * 16.0))\"},\"legbl\":{\"scale\":[1.0,\"1.0 + ((0.0625 - query.model_scale) * 16.0)\",1.0]},\"legbr\":{\"scale\":[1.0,\"1.0 + ((0.0625 - query.model_scale) * 16.0)\",1.0]},\"legfl\":{\"scale\":[1.0,\"1.0 + ((0.0625 - query.model_scale) * 16.0)\",1.0]},\"legfr\":{\"scale\":[1.0,\"1.0 + ((0.0625 - query.model_scale) * 16.0)\",1.0]}}},\"animation.{name}.eat\":{\"loop\":true,\"bones\":{\"neck\":{\"rotation\":[\"variable.eat_anim * (110.0 + math.sin((query.life_time * 20.0) * 57.3) * 2.86)\",0.0,0.0]}}},\"animation.{name}.look_at_player\":{\"loop\":true,\"bones\":{\"neck\":{\"rotation\":[\"variable.head_x_rot\",\"(variable.stand_anim + variable.inverse_max_stand_eat) * query.head_y_rotation(0) - q.body_y_rotation\",0.0]}}},\"animation.{name}.rear\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-45.0 * variable.stand_anim\",0.0,0.0]},\"legbl\":{\"rotation\":[\"45.0 * variable.stand_anim\",0.0,0.0]},\"legbr\":{\"rotation\":[\"45.0 * variable.stand_anim\",0.0,0.0]},\"legfl\":{\"rotation\":[\"(-60.0 + math.cos((query.life_time * 20.0) * 34.38) * 57.3) * variable.stand_anim\",0.0,0.0]},\"legfr\":{\"rotation\":[\"(-60.0 - math.cos((query.life_time * 20.0) * 34.38) * 57.3) * variable.stand_anim\",0.0,0.0]},\"neck\":{\"rotation\":[\"(15.0 + variable.head_x_rot) * variable.stand_anim\",0.0,0.0]},\"tail\":{\"rotation\":[\"55.0 * variable.stand_anim\",0.0,0.0]}}},\"animation.{name}.tail\":{\"loop\":true,\"bones\":{\"tail\":{\"rotation\":[0.0,\"math.cos(query.life_time * 802.0) * 57.3\",0.0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"bagl\":{\"rotation\":[\"variable.leg_x_rot_anim / 5.0\",0.0,0.0]},\"bagr\":{\"rotation\":[\"-variable.leg_x_rot_anim / 5.0\",0.0,0.0]},\"legbl\":{\"rotation\":[\"(-variable.leg_stand_factor * 28.6 * query.modified_move_speed) * (1.0 - variable.stand_anim)\",0.0,0.0]},\"legbr\":{\"rotation\":[\"(variable.leg_stand_factor * 28.6 * query.modified_move_speed) * (1.0 - variable.stand_anim)\",0.0,0.0]},\"legfl\":{\"rotation\":[\"variable.leg_x_rot_anim * (1.0 - variable.stand_anim)\",0.0,0.0]},\"legfr\":{\"rotation\":[\"-variable.leg_x_rot_anim * (1.0 - variable.stand_anim)\",0.0,0.0]}}}}}'},6046:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"arm0\":{\"rotation\":[\"-114 + ((1.5 * math.abs(math.mod(variable.attack_animation_tick - query.frame_alpha, 10) - 5) - 2.5) / 5) * 57.3\",0.0,0.0]},\"arm1\":{\"rotation\":[\"-114 + ((1.5 * math.abs(math.mod(variable.attack_animation_tick - query.frame_alpha, 10) - 5) - 2.5) / 5) * 57.3\",0.0,0.0]}}},\"animation.{name}.flower\":{\"loop\":true,\"bones\":{\"arm0\":{\"rotation\":[\"-45.8 + ((0.25 * math.abs(math.mod(variable.offer_flower_tick, 70) - 35) - 17.5) / 35)\",0.0,0.0]}}},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"arm0\":{\"rotation\":[\"-variable.modified_tcos0 * 2.0\",0.0,0.0]},\"arm1\":{\"rotation\":[\"variable.modified_tcos0 * 2.0\",0.0,0.0]}}},\"animation.{name}.move_to_target\":{\"loop\":true,\"bones\":{\"arm0\":{\"rotation\":[\"((math.abs(math.mod(query.modified_distance_moved, 13) - 6.5) - 3.25) / 2.25) * 30.0\",0.0,0.0]},\"arm1\":{\"rotation\":[\"((math.abs(math.mod(query.modified_distance_moved, 13) - 6.5) - 3.25) / 2.25) * -30.0\",0.0,0.0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0.0,0.0,\"variable.modified_tcos0 / 1.5\"]},\"head\":{\"rotation\":[0.0,0.0,\"variable.modified_tcos0 / 1.5\"]},\"leg0\":{\"rotation\":[\"variable.modified_tcos0 * 6.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"-variable.modified_tcos0 * 6.0\",0.0,0.0]}}},\"animation.{name}.walk_to_target\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0.0,0.0,\"2.0 * (math.abs(math.mod(query.modified_distance_moved + 6, 13.0) - 6.5) - 3.25)\"]},\"head\":{\"rotation\":[0.0,0.0,\"2.0 * (math.abs(math.mod(query.modified_distance_moved + 6, 13.0) - 6.5) - 3.25)\"]},\"leg0\":{\"rotation\":[\"(math.cos(query.modified_distance_moved * 38.17) * 40.0)\",0.0,0.0]},\"leg1\":{\"rotation\":[\"(math.cos(query.modified_distance_moved * 38.17 + 180) * 40.0)\",0.0,0.0]}}}}}'},5100:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-5.5,-5.0],\"scale\":[1.2,1.0,1.0]},\"head\":{\"position\":[0.0,2.0,0.0],\"scale\":[1.3,1.2,1.2]},\"leg0\":{\"position\":[0.0,-1.0,0.0],\"scale\":[0.91,0.56,0.91]},\"leg1\":{\"position\":[0.0,-1.0,0.0],\"scale\":[0.91,0.56,0.91]},\"leg2\":{\"position\":[0.0,-1.0,0.0],\"scale\":[0.91,0.56,0.91]},\"leg3\":{\"position\":[0.0,-1.0,0.0],\"scale\":[0.91,0.56,0.91]}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}}}}'},9296:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"bodycube_0\":{\"position\":[0.0,\"3.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_1\":{\"position\":[0.0,\"2.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_2\":{\"position\":[0.0,\"1.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_4\":{\"position\":[0.0,\"-1.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_5\":{\"position\":[0.0,\"-2.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_6\":{\"position\":[0.0,\"-3.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]},\"bodycube_7\":{\"position\":[0.0,\"-4.0 * (variable.slime_squish_factor < 0.0 ? 0.0 : variable.slime_squish_factor) * 1.7\",0.0]}}}}}'},7720:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0,\"query.is_baby ? 4.0 : 0.0\",\"query.is_baby ? 4.0 : 0.0\"],\"scale\":\"query.is_baby ? 2.0 : 1.0\"}}},\"animation.{name}.walk\":{\"loop\":true,\"anim_time_update\":\"query.modified_distance_moved\",\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0,0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0,0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0,0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0,0]}}}}}'},5802:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"scale\":1.5}}},\"animation.{name}.get_in_bed\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0,1,-15],\"rotation\":[-90,0,0]}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17) * 40.0) - this\",\"-this\",0]},\"leg1\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this\",\"-this\",0]}}},\"animation.{name}.raise_arms\":{\"loop\":true,\"bones\":{\"arms\":{\"rotation\":[\"variable.raise_arms * -15.0\",0,0]}}}}}'},8207:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"scale\":1.5}}},\"animation.{name}.sit\":{\"loop\":true,\"bones\":{\"backlegl\":{\"position\":[0.0,\"-2.0 - this\",\"6.0 - this\"],\"rotation\":[-45.0,0.0,0.0]},\"backlegr\":{\"position\":[0.0,\"-2.0 - this\",\"6.0 - this\"],\"rotation\":[\"-45 - this\",0.0,0.0]},\"body\":{\"rotation\":[\"-45 - this\",0.0,0.0]},\"frontlegl\":{\"position\":[0.0,\"-1.5 - this\",\"-7.0 - this\"],\"rotation\":[\"42.15 - this\",0.0,0.0]},\"frontlegr\":{\"position\":[0.0,\"-1.5 - this\",\"-7.0 - this\"],\"rotation\":[\"42.15 - this\",0.0,0.0]},\"head\":{\"position\":[0.0,-2.0,0.0]},\"tail1\":{\"position\":[0.0,0.0,0.0],\"rotation\":[\"45 - this\",0.0,0.0]},\"tail2\":{\"position\":[0.0,0.0,0.0],\"rotation\":[\"45 - this\",0.0,0.0]}}},\"animation.{name}.sneak\":{\"loop\":true,\"bones\":{\"backlegl\":{\"position\":[0.0,\"1.0 - this\",0.0],\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"backlegr\":{\"position\":[0.0,\"1.0 - this\",0.0],\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"body\":{\"position\":[0.0,-1.0,0.0]},\"frontlegl\":{\"position\":[0.0,\"1.0 - this\",0.0],\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"frontlegr\":{\"position\":[0.0,\"1.0 - this\",0.0],\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"head\":{\"position\":[0.0,-1.0,0.0]},\"tail1\":{\"position\":[0.0,\"1.0 - this\",0.0]},\"tail2\":{\"rotation\":[\"62.0 + math.cos(query.modified_distance_moved * 57.3) * 27.0 * query.modified_move_speed - this\",0.0,0.0]}}},\"animation.{name}.sprint\":{\"loop\":true,\"bones\":{\"backlegl\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"backlegr\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 17.19) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"frontlegl\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 197.19) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"frontlegr\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"tail1\":{\"rotation\":[\"-this\",0.0,0.0]},\"tail2\":{\"rotation\":[\"62.0 + math.cos(query.modified_distance_moved * 57.3) * 18.0 * query.modified_move_speed - this\",0.0,0.0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"backlegl\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"backlegr\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"frontlegl\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180.0) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"frontlegr\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 57.3 * query.modified_move_speed - this\",0.0,0.0]},\"tail1\":{\"rotation\":[\"-51.57 - this\",0.0,0.0]},\"tail2\":{\"rotation\":[\"62.0 + math.cos(query.modified_distance_moved * 57.3) * 45.0 * query.modified_move_speed - this\",0.0,0.0]}}}}}'},621:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,1.77,0.0],\"scale\":[1.15,1.15,1.0]},\"head\":{\"position\":[0.0,-0.18,0.15],\"scale\":1.8}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}},\"animation.{name}.lying\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"(query.is_baby ? -8.8 : -7.67) * query.lie_amount -10 - this\",0.0],\"rotation\":[\"query.lie_amount * -180 - this\",0.0,0.0]},\"head\":{\"rotation\":[\"(query.lie_amount * 90) - this\",0.0,0.0]},\"leg0\":{\"rotation\":[\"math.sin(query.life_time * 206.28) * -17.2 - this\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.sin(query.life_time * 263.58) * 17.2 - this\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.sin(query.life_time * 172) * 17.2 - this\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.sin(query.life_time * 229.2) * -17.2 - this\",0.0,0.0]}}},\"animation.{name}.rolling\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"(query.roll_counter / 32) * 360\",0.0,0.0]},\"head\":{\"rotation\":[\"(this * -118) + query.roll_counter - this\",0.0,0.0]},\"leg0\":{\"rotation\":[\"math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * 8.6 - this\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * -8.6 - this\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * -8.6 - this\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.sin(query.life_time * 60 * (query.is_baby ? 0.95 : 0.5) * 57.3) * 8.6 - this\",0.0,0.0]}}},\"animation.{name}.sitting\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"-2.15 -10 -this\",0.0],\"rotation\":[\"(query.is_scared * math.cos(query.life_time * 71.62) * 16.2) + (query.sit_amount * -90) - this\",0.0,0.0]},\"head\":{\"rotation\":[\"query.is_eating ? (90.0 + 11.5 * math.sin(query.life_time * 750)) : (query.sit_amount * (100 - this)) - this\",0.0,0.0]},\"leg0\":{\"rotation\":[0.0,0.0,\"32.7 - this\"]},\"leg1\":{\"rotation\":[0.0,0.0,\"-32.7 - this\"]},\"leg2\":{\"rotation\":[\"(query.is_eating ? (-23 - (16.5 * math.sin(query.life_time * 750))) : 0) - this\",0.0,-15.0]},\"leg3\":{\"rotation\":[\"(query.is_eating ? (-23 - (16.5 * math.sin(query.life_time * 750))) : 0) - this\",0.0,15.0]}}},\"animation.{name}.sneezing\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"(query.sneeze_counter < 15) ? (-45 * (query.sneeze_counter / 14)) : (-45 + (9 * (query.sneeze_counter - 15)) - this)\",0.0,0.0]}}},\"animation.{name}.unhappy\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[0.0,\"(math.sin(query.life_time * 327.6) * 20) - this\",\"(math.sin(query.life_time * 327.6) * 20) - this\"]},\"leg2\":{\"rotation\":[\"(math.sin(query.life_time * 343.8) * -43) - this\",0.0,0.0]},\"leg3\":{\"rotation\":[\"(math.sin(query.life_time * 343.8) * 43) - this\",0.0,0.0]}}}}}'},4223:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.dance\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[\"variable.dance.x-this\",\"variable.dance.y\",0.0]},\"head\":{\"rotation\":[\"-this\",\"-this\",\"variable.dance.y*23.0 - this\"]},\"leg0\":{\"position\":[\"-variable.dance.x\",\"-variable.dance.y\",0.0],\"rotation\":[0.0,0.0,\"-20.0 - this\"]},\"leg1\":{\"position\":[\"-variable.dance.x\",\"-variable.dance.y\",0.0],\"rotation\":[0.0,0.0,\"20.0 - this\"]},\"tail\":{\"rotation\":[\"60.0 - this\",0.0,0.0]},\"wing0\":{\"rotation\":[0.0,0.0,\"-5.0 - variable.wing_flap\"]},\"wing1\":{\"rotation\":[0.0,0.0,\"5.0 + variable.wing_flap\"]}}},\"animation.{name}.flying\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * 80.0 * query.modified_move_speed\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0 * query.modified_move_speed\",0.0,0.0]}}},\"animation.{name}.moving\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"variable.wing_flap * 0.3\",0.0]},\"tail\":{\"rotation\":[\"60.0 + math.cos(query.anim_time * 38.17) * 17.0 - this\",0.0,0.0]},\"wing0\":{\"rotation\":[0.0,0.0,\"-5.0 - variable.wing_flap * 57.3\"]},\"wing1\":{\"rotation\":[0.0,0.0,\"5.0 + variable.wing_flap * 57.3\"]}}},\"animation.{name}.sitting\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,-1.9,0.0]},\"leg0\":{\"rotation\":[90.0,0.0,0.0]},\"leg1\":{\"rotation\":[90.0,0.0,0.0]},\"tail\":{\"rotation\":[\"90.0 - this\",0.0,0.0]},\"wing0\":{\"rotation\":[0.0,0.0,\"-5.0-this\"]},\"wing1\":{\"rotation\":[0.0,0.0,\"5.0-this\"]}}},\"animation.{name}.standing\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[20.0,0.0,0.0]},\"leg1\":{\"rotation\":[20.0,0.0,0.0]}}}}}'},3832:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.base_pose\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-query.target_x_rotation\",0,0],\"position\":[0,-20,0]}}},\"animation.{name}.move\":{\"loop\":true,\"animation_length\":2.417,\"bones\":{\"tail\":{\"rotation\":[\"-5.0 * Math.cos(297.9380535 * query.anim_time) - 5.0\",0,0]},\"tailtip\":{\"rotation\":[\"-5.0 * Math.cos(297.9380535 * query.anim_time) - 5.0\",0,0]},\"wing0\":{\"rotation\":[0,0,\"16.0 * Math.cos(148.9690267 * query.anim_time)\"]},\"wing1\":{\"rotation\":[0,0,\"-16.0 * Math.cos(148.9690267 * query.anim_time)\"]},\"wingtip0\":{\"rotation\":[0,0,\"16.0 * Math.cos(148.9690267 * query.anim_time)\"]},\"wingtip1\":{\"rotation\":[0,0,\"-16.0 * Math.cos(148.9690267 * query.anim_time)\"]}},\"sound_effects\":{\"1.4\":{\"effect\":\"flap\"}}}}}'},8097:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,4.0,4.0],\"scale\":2.0}}},\"animation.{name}.setup\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",0.0,0.0]}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}}}}'},4452:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.crossbow.charge\":{\"bones\":{\"leftarm\":{\"rotation\":[\"math.lerp(-90.0 + 34.38, -90.0, variable.crossbow_charge)  -this\",\"math.lerp(22.92, 48.70, variable.crossbow_charge) -this\",0.0]},\"rightarm\":{\"rotation\":[\"-90.0 + 34.38 -this\",\"-45.84 -this\",0.0]}},\"loop\":true},\"animation.{name}.crossbow.hold\":{\"bones\":{\"leftarm\":{\"rotation\":[\"-85.94 + query.target_x_rotation -this\",\"34.38 + math.clamp(query.target_y_rotation, -45, 25) -this\",0.0]},\"rightarm\":{\"rotation\":[\"-90.0 + 5.73 + query.target_x_rotation -this\",\"-17.19 + math.clamp(query.target_y_rotation, -25, 45) -this\",0.0]}},\"loop\":true},\"animation.{name}.sword.attack\":{\"bones\":{\"leftarm\":{\"rotation\":[\"(math.cos(query.life_time * 20.0 * 10.89) * 28.65) + (math.sin(variable.attack_time * 180.0) * 68.76 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"-100 + (variable.attack2 * 2.2 - variable.attack * 0.4) + variable.x_bob - this\",\"variable.attack2 * 0.6 - 5.73 - this\",\"variable.z_bob - this\"]}},\"loop\":true},\"animation.{name}.hand.attack\":{\"bones\":{\"leftarm\":{\"rotation\":[\"-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) * 1.2 + math.sin(variable.attack_time * 180)) * 10.0\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) * 1.2 + math.sin(variable.attack_time * 180)) * 30.0\",\"-(math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180) ? (-90.0 * math.sin((1 - math.pow((1 - variable.attack_time), 4)) * 180)) + 30.0 : 0.0)\",0.0]}},\"loop\":true},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"leftear\":{\"rotation\":[0.0,0.0,\"variable.tcos0 * 0.5\"]},\"rightear\":{\"rotation\":[0.0,0.0,\"-variable.tcos0 * 0.5\"]},\"leftarm\":{\"rotation\":[\"variable.tcos0\",0.0,0.0]},\"leftleg\":{\"rotation\":[\"-variable.tcos0 * 1.4\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"-variable.tcos0\",0.0,0.0]},\"rightleg\":{\"rotation\":[\"variable.tcos0 * 1.4\",0.0,0.0]}}},\"animation.{name}.admire\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[320.0,25.0,0.0]},\"head\":{\"rotation\":[30.0,0.0,0.0]}}},\"animation.{name}.celebrate_hunt\":{\"loop\":true,\"bones\":{\"leftear\":{\"rotation\":[0.0,0.0,\"Math.sin(query.time_stamp * 30) * 10\"]},\"rightear\":{\"rotation\":[0.0,0.0,\"Math.cos(query.time_stamp * 30) * 10\"]}}},\"animation.{name}.celebrate_hunt_special\":{\"loop\":true,\"bones\":{\"leftear\":{\"rotation\":[0.0,0.0,\"Math.sin(query.time_stamp * 30) * 10\"]},\"rightear\":{\"rotation\":[0.0,0.0,\"Math.cos(query.time_stamp * 30) * 10\"]},\"head\":{\"position\":[\"Math.sin(query.time_stamp * 10)\",\"Math.sin(query.time_stamp * 40)\",0.0]},\"rightarm\":{\"rotation\":[0.0,0.0,\"70 + Math.cos(query.time_stamp * 40) * 10\"]},\"leftarm\":{\"rotation\":[0.0,0.0,\"-70 - Math.cos(query.time_stamp * 40) * 10\"]},\"body\":{\"position\":[0.0,\"Math.sin(query.time_stamp * 40) * 0.35\",0.0]}}}}}'},8539:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.crossbow.charge\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"math.lerp(-90.0 + 34.38, -90.0, variable.crossbow_charge)  -this\",\"math.lerp(22.92, 48.70, variable.crossbow_charge) -this\",0.0]},\"rightarm\":{\"rotation\":[\"-90.0 + 34.38 -this\",\"-45.84 -this\",0.0]}}},\"animation.{name}.crossbow.hold\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"-85.94 + query.target_x_rotation -this\",\"34.38 + math.clamp(query.target_y_rotation, -45, 25) -this\",0.0]},\"rightarm\":{\"rotation\":[\"-90.0 + 5.73 + query.target_x_rotation -this\",\"-17.19 + math.clamp(query.target_y_rotation, -25, 45) -this\",0.0]}}}}}'},9412:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,-1.0,3.0],\"scale\":1.25}}},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"-9 - 2 * query.standing_scale - this\",0.0],\"rotation\":[\"(-(query.standing_scale) * 63) - this\",0.0,0.0]},\"leg0\":{\"position\":[0.0,\"-1 * query.standing_scale\",\"6 * query.standing_scale\"],\"rotation\":[\"query.standing_scale * 63\",0.0,0.0]},\"leg1\":{\"position\":[0.0,\"-1 * query.standing_scale\",\"6 * query.standing_scale\"],\"rotation\":[\"query.standing_scale * 63\",0.0,0.0]},\"leg2\":{\"rotation\":[\"(query.standing_scale > 1) ? (query.standing_scale * 81) - this : 0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"(query.standing_scale > 1) ? (query.standing_scale * 81) - this : 0\",0.0,0.0]}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}}}}'},1687:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0,-1,1],\"scale\":1.5}}},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"earLeft\":{\"rotation\":[\"query.target_x_rotation - this\",\"query.target_y_rotation - this + 15.0\",0]},\"earRight\":{\"rotation\":[\"query.target_x_rotation - this\",\"query.target_y_rotation - this - 15.0\",0]},\"frontLegLeft\":{\"rotation\":[\"variable.jump_rotation * -40.0 - 11.0 - this\",0,0]},\"frontLegRight\":{\"rotation\":[\"variable.jump_rotation * -40.0 - 11.0 - this\",0,0]},\"haunchLeft\":{\"rotation\":[\"variable.jump_rotation * 50.0 - 21.0 - this\",0,0]},\"haunchRight\":{\"rotation\":[\"variable.jump_rotation * 50.0 - 21.0 - this\",0,0]},\"nose\":{\"rotation\":[\"query.target_x_rotation - this\",\"query.target_y_rotation - this\",0]},\"rearFootLeft\":{\"rotation\":[\"variable.jump_rotation * 50.0 - this\",0,0]},\"rearFootRight\":{\"rotation\":[\"variable.jump_rotation * 50.0 - this\",0,0]}}}}}'},1987:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.biting\":{\"loop\":true,\"bones\":{\"mouth\":{\"rotation\":[\"math.sin(math.min(query.anim_time / (variable.bite_anim_duration / 2.0f), 1.0f) * 180.0f) * 40.0f\",0.0,0.0]},\"neck\":{\"position\":[0.0,0.0,\"-math.sin(math.min(query.anim_time / variable.bite_anim_duration, 1.0f) * 180.0f) * variable.bite_neck_length\"]}}},\"animation.{name}.idle_mouth\":{\"loop\":true,\"bones\":{\"mouth\":{\"rotation\":[1.8,0.0,0.0]},\"neck\":{\"position\":[0.0,0.0,0.0]}}},\"animation.{name}.roaring\":{\"loop\":true,\"bones\":{\"mouth\":{\"rotation\":[\"math.sin(math.min(query.anim_time / variable.roar_length, 1.0) * 180) * 40.0\",0.0,0.0]}}},\"animation.{name}.stunned\":{\"loop\":true,\"bones\":{\"neck\":{\"position\":[\"math.sin(query.life_time * 180.0) * 2.8\",-5.0,0.0],\"rotation\":[15.0,0.0,0.0]}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  22.92\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -22.92\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -22.92\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  22.92\",0.0,0.0]}}}}}'},7597:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.flop\":{\"loop\":true,\"bones\":{\"body_back\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 45.0) * -21.75\",0.0]},\"body_front\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 45.0) * 4.0\",\"variable.zrot\"]},\"tailfin\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 45.0) * -40.0\",0.0]}}},\"animation.{name}.swim\":{\"loop\":true,\"bones\":{\"body_back\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 30.0) * -21.75\",0.0]},\"body_front\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 30.0) * 4.0\",0.0]},\"tailfin\":{\"rotation\":[0.0,\"math.cos(variable.animationamountblend * 30.0) * -40.0\",0.0]}}}}}'},2202:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,4.0,4.0],\"scale\":2.0}}},\"animation.{name}.grazing\":{\"animation_length\":2.0,\"loop\":true,\"bones\":{\"head\":{\"position\":{\"0\":[0.0,0.0,0.0],\"0.2\":[0.0,-9.0,0.0],\"1.8\":[0.0,-9.0,0.0],\"2\":[0.0,0.0,0.0]},\"rotation\":{\"0.2\":{\"post\":[\"180.0 * (0.2 + 0.07 * math.sin(query.key_frame_lerp_time * 1644.39))\",0.0,0.0],\"pre\":[36.0,0.0,0.0]},\"1.8\":{\"post\":[36.0,0.0,0.0],\"pre\":[\"180.0 * (0.2 + 0.07 * math.sin(query.key_frame_lerp_time * 1644.39))\",0.0,0.0]}}}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]},\"leg1\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg2\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) * -80.0\",0.0,0.0]},\"leg3\":{\"rotation\":[\"math.cos(query.anim_time * 38.17) *  80.0\",0.0,0.0]}}},\"animation.{name}.setup\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"-this\",0.0,0.0]},\"head\":{\"position\":[0.0,\"-6.0 - this\",0.0]}}}}}'},4541:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.facing\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"base\":{\"position\":[\"variable.shulker.xoffset\",\"variable.shulker.yoffset\",\"variable.shulker.zoffset\"],\"rotation\":[\"variable.shulker.xprerotation\",0.0,\"variable.shulker.zprerotation\"],\"scale\":0.98}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,\"-variable.shulker.upfacing * 6 - (3 * (variable.shulker.northfacing + variable.shulker.southfacing + variable.shulker.westfacing + variable.shulker.eastfacing))\",0.0]},\"lid\":{\"position\":[0.0,\"7.2 - math.sin(variable.shulker.lidpositionfactor * 1.16) * 7.5 + (variable.shulker.lidpositionfactor > 180 ? math.sin(query.life_time * 114.6) * 0.7 + 1.5: 0.0)\",0.0],\"rotation\":[0.0,\"variable.shulker.peekamount > 0.3 ? math.pow(variable.shulker.lidrotationfactor, 4) * 22.5 : 0.0\",0.0]}}}}}'},600:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"bodypart_0\":{\"position\":[\"math.sin(query.life_time * 1031.4) * 1.26\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4) * 27\",0.0]},\"bodypart_1\":{\"position\":[\"math.sin(query.life_time * 1031.4 + 27) * 0.63\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 27) * 18\",0.0]},\"bodypart_2\":{\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 54) * 9\",0.0]},\"bodypart_3\":{\"position\":[\"math.sin(query.life_time * 1031.4 + 81) * 0.63\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 81) * 18\",0.0]},\"bodypart_4\":{\"position\":[\"math.sin(query.life_time * 1031.4 + 108) * 1.26\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 108) * 27\",0.0]},\"bodypart_5\":{\"position\":[\"math.sin(query.life_time * 1031.4 + 135) * 1.89\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 135) * 36\",0.0]},\"bodypart_6\":{\"position\":[\"math.sin(query.life_time * 1031.4 + 162) * 2.52\",0.0,0.0],\"rotation\":[0.0,\"math.cos(query.life_time * 1031.4 + 162) * 45\",0.0]}}}}}'},6400:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"-68.75 * math.sin(variable.attack_time * 180.0) + 22.92 * (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0))\",\"5.73 - math.sin(variable.attack_time * 180.0) * 34.38 - this\",\"-this\"]},\"rightarm\":{\"rotation\":[\"-68.75 * math.sin(variable.attack_time * 180.0) + 22.92 * (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0))\",\"-5.73 + math.sin(variable.attack_time * 180.0) * 34.38 - this\",\"-this\"]}}}}}'},4354:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.walk\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"right_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5833\":[35,0,0],\"1.0\":[-35,0,0],\"1.1667\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,3],\"0.75\":[0,4,-1],\"1.0\":[0,0,0],\"1.1667\":[0,0,-1],\"2.0\":[0,0,3]}},\"right_mid_leg\":{\"rotation\":{\"0.0\":[-7,0,0],\"0.1667\":[-35,0,0],\"0.3333\":[0,0,0],\"1.0\":[0,0,0],\"1.1667\":[0,0,0],\"1.75\":[35,0,0],\"2.0\":[-7,0,0]},\"position\":{\"0.0\":[0,2.67,-0.67],\"0.1667\":[0,0,0],\"0.3333\":[0,0,-2],\"1.0\":[0,0,2],\"1.1667\":[0,0,3],\"1.9167\":[0,4,-1],\"2.0\":[0,2.67,-0.67]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5833\":[0,0,0],\"1.0\":[25,0,0],\"1.1667\":[35,0,0],\"1.5833\":[-35,0,0],\"1.75\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,-0.5],\"0.5833\":[0,0,2],\"1.0\":[0,2.22,0.78],\"1.3333\":[0,4,-1],\"1.5833\":[0,0,0],\"1.75\":[0,0,-2],\"2.0\":[0,0,-0.5]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[-35,0,0],\"0.1667\":[0,0,0],\"1.0\":[0,0,0],\"1.5833\":[35,0,0],\"2.0\":[-35,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.1667\":[0,0,-1],\"1.0\":[0,0,3],\"1.75\":[0,4,-1],\"2.0\":[0,0,0]}},\"left_mid_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.1667\":[0,0,0],\"0.75\":[35,0,0],\"1.1667\":[-35,0,0],\"1.3333\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,2],\"0.1667\":[0,0,3],\"0.9167\":[0,4,-1],\"1.1667\":[0,0,0],\"1.3333\":[0,0,-2],\"2.0\":[0,0,2]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[25,0,0],\"0.1667\":[35,0,0],\"0.5833\":[-35,0,0],\"0.75\":[0,0,0],\"1.0\":[0,0,0],\"1.5833\":[0,0,0],\"2.0\":[25,0,0]},\"position\":{\"0.0\":[0,2.22,0.78],\"0.3333\":[0,4,-1],\"0.5833\":[0,0,0],\"0.75\":[0,0,-2],\"1.0\":[0,0,-0.5],\"1.5833\":[0,0,2],\"2.0\":[0,2.22,0.78]}},\"body\":{\"rotation\":{\"0.0\":{\"post\":[1,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-1,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[1,0,2.5],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[-1,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[1,0,-2.5],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[0,-1,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2083\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.375\":{\"post\":[0,-1,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[7.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.1667\":{\"post\":[9,0,0],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[-1,0,0],\"lerp_mode\":\"catmullrom\"},\"1.25\":{\"post\":[7,0,0],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[7.5,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[0,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,-2.5],\"lerp_mode\":\"catmullrom\"}}},\"right_ear\":{\"rotation\":{\"0.0\":{\"post\":[0,0,2.5],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[0,0,7.5],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,0,2.5],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,7.5],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,2.5],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.sniffsniff\":{\"loop\":true,\"animation_length\":8,\"bones\":{\"nose\":{\"scale\":{\"0.0\":[1,1,1],\"0.5417\":[1,1,1],\"0.5833\":{\"pre\":[1,0.5,1],\"post\":[1,0.5,1],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[1,2.5,1],\"lerp_mode\":\"catmullrom\"},\"0.7917\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.9167\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[1,3,1],\"lerp_mode\":\"catmullrom\"},\"1.125\":[1,1,1],\"2.0\":[1,1,1]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"sniffsniff\"}}},\"animation.{name}.longsniff\":{\"animation_length\":1,\"bones\":{\"nose\":{\"scale\":{\"0.0\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.0833\":{\"post\":[1,0.7,1],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[1,3,1],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[1,3,1],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[1,4,1],\"lerp_mode\":\"catmullrom\"},\"0.8333\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.125\":[-5,0,0],\"0.875\":[-20,0,0],\"1.0\":[0,0,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"long_sniff\"}}},\"animation.{name}.search\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"right_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5833\":[35,0,0],\"1.0\":[-35,0,0],\"1.1667\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,3],\"0.75\":[0,4,-1],\"1.0\":[0,0,0],\"1.1667\":[0,0,-1],\"2.0\":[0,0,3]}},\"right_mid_leg\":{\"rotation\":{\"0.0\":[-7,0,0],\"0.1667\":[-35,0,0],\"0.3333\":[0,0,0],\"1.0\":[0,0,0],\"1.1667\":[0,0,0],\"1.75\":[35,0,0],\"2.0\":[-7,0,0]},\"position\":{\"0.0\":[0,2.67,-0.67],\"0.1667\":[0,0,0],\"0.3333\":[0,0,-2],\"1.0\":[0,0,2],\"1.1667\":[0,0,3],\"1.9167\":[0,4,-1],\"2.0\":[0,2.67,-0.67]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5833\":[0,0,0],\"1.0\":[25,0,0],\"1.1667\":[35,0,0],\"1.5833\":[-35,0,0],\"1.75\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,-0.5],\"0.5833\":[0,0,2],\"1.0\":[0,2.22,0.78],\"1.3333\":[0,4,-1],\"1.5833\":[0,0,0],\"1.75\":[0,0,-2],\"2.0\":[0,0,-0.5]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[-35,0,0],\"0.1667\":[0,0,0],\"1.0\":[0,0,0],\"1.5833\":[35,0,0],\"2.0\":[-35,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.1667\":[0,0,-1],\"1.0\":[0,0,3],\"1.75\":[0,4,-1],\"2.0\":[0,0,0]}},\"left_mid_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.1667\":[0,0,0],\"0.75\":[35,0,0],\"1.1667\":[-35,0,0],\"1.3333\":[0,0,0],\"2.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,2],\"0.1667\":[0,0,3],\"0.9167\":[0,4,-1],\"1.1667\":[0,0,0],\"1.3333\":[0,0,-2],\"2.0\":[0,0,2]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[25,0,0],\"0.1667\":[35,0,0],\"0.5833\":[-35,0,0],\"0.75\":[0,0,0],\"1.0\":[0,0,0],\"1.5833\":[0,0,0],\"2.0\":[25,0,0]},\"position\":{\"0.0\":[0,2.22,0.78],\"0.3333\":[0,4,-1],\"0.5833\":[0,0,0],\"0.75\":[0,0,-2],\"1.0\":[0,0,-0.5],\"1.5833\":[0,0,2],\"2.0\":[0,2.22,0.78]}},\"body\":{\"rotation\":{\"0.0\":[2.5,0,0],\"0.5\":[1.25,0,0],\"1.5\":[0,0,0],\"2.0\":[2.5,0,0]}},\"head\":{\"rotation\":{\"0.0\":[35,0,0],\"0.125\":[33.61503,11.46526,9.803],\"0.875\":[34.71128,17.67415,14.15251],\"1.125\":[37.21128,-17.67415,-14.15251],\"1.875\":[38.30529,-21.62827,-17.40292],\"2.0\":[35,0,0]},\"position\":[0,-2,0]},\"left_ear\":{\"rotation\":{\"0.0\":[0,0,-2.5],\"0.25\":[0,0,-15],\"0.5\":[0,0,-2.5],\"0.75\":[0,0,-15],\"1.0\":[0,0,-2.5],\"1.25\":[0,0,-15],\"1.5\":[0,0,-2.5],\"1.75\":[0,0,-15],\"2.0\":[0,0,-2.5]}},\"right_ear\":{\"rotation\":{\"0.0\":[0,0,2.5],\"0.25\":[0,0,15],\"0.5\":[0,0,2.5],\"0.75\":[0,0,15],\"1.0\":[0,0,2.5],\"1.25\":[0,0,15],\"1.5\":[0,0,2.5],\"1.75\":[0,0,15],\"2.0\":[0,0,2.5]}},\"nose\":{\"scale\":{\"0.0\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.0833\":{\"post\":[1,1.5,1],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.375\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[1,2.5,1],\"lerp_mode\":\"catmullrom\"},\"0.625\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.8333\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"0.9167\":{\"post\":[1,2.5,1],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.2917\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.3333\":{\"post\":[1,2.5,1],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"1.6667\":{\"post\":[1,3.5,1],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[1,1,1],\"lerp_mode\":\"catmullrom\"}}}},\"sound_effects\":{\"0.0\":{\"effect\":\"searching\"},\"1.0\":{\"effect\":\"searching\"}}},\"animation.{name}.dig\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":8,\"bones\":{\"body\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5\":[1.5,0,0],\"1.3333\":[-5,0,0],\"1.5\":[0,0,0],\"2.0\":[0,0,0],\"2.5\":[2.5,0,0],\"3.0\":[0,0,0],\"3.5\":[2.5,0,0],\"4.0\":[0,0,0],\"4.5\":[2.5,0,0],\"5.6667\":[5,0,0],\"5.8333\":[-2.5,0,0],\"6.0\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"1.3333\":[0,1,0],\"1.5\":[0,-7,0]},\"scale\":{\"0.0\":[1,1,1],\"1.5\":[1,1,1],\"1.5417\":[1.04,0.98,1.02],\"1.5833\":[1,1,1]}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"1.4167\":{\"post\":[-10,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.875\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6667\":{\"post\":[38.44,0,0],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[10.95951,13.57454,-14.93501],\"lerp_mode\":\"catmullrom\"},\"3.2083\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"3.5833\":{\"post\":[55,0,0],\"lerp_mode\":\"catmullrom\"},\"3.7917\":{\"post\":[4.2932,-16.187,10.90042],\"lerp_mode\":\"catmullrom\"},\"4.125\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.4167\":{\"post\":[54.71135,7.98009,-5.56662],\"lerp_mode\":\"catmullrom\"},\"4.5\":{\"post\":[55.72895,-6.77684,4.46197],\"lerp_mode\":\"catmullrom\"},\"4.5833\":{\"post\":[54.71135,7.98009,-5.56662],\"lerp_mode\":\"catmullrom\"},\"4.6667\":{\"post\":[55.72895,-6.77684,4.46197],\"lerp_mode\":\"catmullrom\"},\"4.75\":{\"post\":[54.71135,7.98009,-5.56662],\"lerp_mode\":\"catmullrom\"},\"4.8333\":{\"post\":[55.72895,-6.77684,4.46197],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[65,0,0],\"lerp_mode\":\"catmullrom\"},\"5.75\":{\"post\":[65,0,0],\"lerp_mode\":\"catmullrom\"},\"5.9167\":{\"post\":[-32.5,0,0],\"lerp_mode\":\"catmullrom\"},\"6.25\":[0,0,0]},\"position\":{\"0.0\":[0,0,0],\"0.625\":[0,0,0],\"1.375\":[0,1,0],\"1.5\":[0,1,0],\"1.5833\":[0,1,0],\"1.875\":[0,1,0],\"2.0833\":[0,3,0],\"2.2917\":[0,6,0],\"2.6667\":[0,0,0],\"3.2083\":[0,4,0],\"3.5833\":[0,0,0],\"4.125\":[0,4,0],\"5.0\":[0,0,0],\"5.75\":[0,1,0],\"6.0\":[0,1.5,0],\"6.25\":[0,1,0]}},\"left_ear\":{\"rotation\":{\"0.0\":[0,0,-2.5],\"1.25\":[0,0,-2.5],\"1.4167\":[0,0,-50],\"1.5833\":[0,0,-30],\"5.9167\":[0,0,-30],\"6.0833\":[0,0,-65],\"6.3333\":[0,0,-30]}},\"right_ear\":{\"rotation\":{\"0.0\":[0,0,2.5],\"1.25\":[0,0,2.5],\"1.4167\":[0,0,50],\"1.5833\":[0,0,30],\"5.9167\":[0,0,30],\"6.0833\":[0,0,65],\"6.3333\":[0,0,30]}},\"right_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.2083\":[0,0,0],\"1.375\":[0,0,90]},\"position\":{\"0.0\":[0,0,0],\"1.2083\":[0,0,0],\"1.2917\":[-2,-0.75,0],\"1.375\":[-4,-5.5,0]}},\"right_mid_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.25\":[0,0,0],\"1.4167\":[0,0,90]},\"position\":{\"0.0\":[0,0,0],\"1.25\":[0,0,0],\"1.3333\":[-2,-0.75,0],\"1.4167\":[-4,-5.5,0]}},\"right_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.3333\":[0,0,0],\"1.5\":[0,0,90]},\"position\":{\"0.0\":[0,0,0],\"1.3333\":[0,0,0],\"1.4167\":[-2,-0.75,0],\"1.5\":[-4,-5.5,0]}},\"left_front_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.2083\":[0,0,0],\"1.375\":[0,0,-90]},\"position\":{\"0.0\":[0,0,0],\"1.2083\":[0,0,0],\"1.2917\":[2,-0.75,0],\"1.375\":[4,-5.5,0]}},\"left_mid_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.25\":[0,0,0],\"1.4167\":[0,0,-90]},\"position\":{\"0.0\":[0,0,0],\"1.25\":[0,0,0],\"1.3333\":[2,-0.75,0],\"1.4167\":[4,-5.5,0]}},\"left_hind_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"1.3333\":[0,0,0],\"1.5\":[0,0,-90]},\"position\":{\"0.0\":[0,0,0],\"1.3333\":[0,0,0],\"1.4167\":[2,-0.75,0],\"1.5\":[4,-5.5,0]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"digging\"},\"6.0\":{\"effect\":\"drop_seed\"}}},\"animation.{name}.stand_up\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":3,\"bones\":{\"body\":{\"rotation\":{\"0.25\":[0,0,0],\"0.75\":[2.5,0,0],\"1.5\":[-2.5,0,0],\"1.7083\":[0,0,0]},\"position\":{\"0.25\":[0,-7,0],\"0.75\":[0,-7,0],\"1.5\":[0,0,0],\"1.7083\":[0,0,0]}},\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.3333\":[-5,0,0],\"0.7083\":[0,0,0],\"1.0\":[10,0,0],\"1.375\":[0,0,0]},\"position\":{\"0.0\":[0,1,0],\"1.375\":[0,1,0]}},\"left_ear\":{\"rotation\":{\"0.0\":[0,0,-30],\"0.9167\":[0,0,-30],\"1.2083\":[0,0,-5]}},\"right_ear\":{\"rotation\":{\"0.0\":[0,0,30],\"0.9167\":[0,0,30],\"1.2083\":[0,0,5]}},\"right_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,90],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[-4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_mid_leg\":{\"rotation\":{\"0.0833\":{\"pre\":[0,0,90],\"post\":[0,0,90],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0833\":{\"pre\":[-4,-5.5,0],\"post\":[-4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_hind_leg\":{\"rotation\":{\"0.1667\":{\"pre\":[0,0,90],\"post\":[0,0,90],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.1667\":{\"pre\":[-4,-5.5,0],\"post\":[-4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4167\":{\"post\":[6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_front_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,-90],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[-6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_mid_leg\":{\"rotation\":{\"0.0833\":{\"pre\":[0,0,-90],\"post\":[0,0,-90],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0833\":{\"pre\":[4,-5.5,0],\"post\":[4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[-6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.5833\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_hind_leg\":{\"rotation\":{\"0.1667\":{\"pre\":[0,0,-90],\"post\":[0,0,-90],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.1667\":{\"pre\":[4,-5.5,0],\"post\":[4,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.4167\":{\"post\":[-6,-5.5,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}},\"sound_effects\":{\"0.0\":{\"effect\":\"stand_up\"}}},\"animation.{name}.feeling_happy\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"head\":{\"rotation\":{\"0.0\":[0,0,0],\"0.5\":{\"pre\":[-32.00206,19.3546,-11.70092],\"post\":[-32.00206,19.3546,-11.70092],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5\":{\"post\":[-32.00206,-19.3546,11.70092],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ear\":{\"rotation\":{\"0.5\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,-67.5],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.125\":{\"post\":[0,0,-67.5],\"lerp_mode\":\"catmullrom\"},\"1.2917\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_ear\":{\"rotation\":{\"0.5\":{\"pre\":[0,0,0],\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.75\":{\"post\":[0,0,67.5],\"lerp_mode\":\"catmullrom\"},\"0.9583\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.125\":{\"post\":[0,0,67.5],\"lerp_mode\":\"catmullrom\"},\"1.2917\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}},\"sound_effects\":{\"0.0\":{\"effect\":\"happy\"}}},\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0.0,1.0,1.0],\"scale\":1.2}}}}}'},759:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"piece1\":{\"rotation\":[0.0,\"query.target_y_rotation * 0.25\",0.0]}}},\"animation.{name}.sheared\":{\"loop\":true,\"bones\":{\"pumpkin\":{\"scale\":0}}}}}'},9694:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.default_leg_pose\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[0.0,\"45.0 - this\",\"-45.0 - this\"]},\"leg1\":{\"rotation\":[0.0,\"-45.0 - this\",\"45.0 - this\"]},\"leg2\":{\"rotation\":[0.0,\"22.5 - this\",\"-33.3 - this\"]},\"leg3\":{\"rotation\":[0.0,\"-22.5 - this\",\"33.3 - this\"]},\"leg4\":{\"rotation\":[0.0,\"-22.5 - this\",\"-33.3 - this\"]},\"leg5\":{\"rotation\":[0.0,\"22.5 - this\",\"33.3 - this\"]},\"leg6\":{\"rotation\":[0.0,\"-45.0 - this\",\"-45.0 - this\"]},\"leg7\":{\"rotation\":[0.0,\"45.0 - this\",\"45.0 - this\"]}}},\"animation.{name}.look_at_target\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"query.target_x_rotation\",\"query.target_y_rotation\",0.0]}}},\"animation.{name}.walk\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[0.0,\"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 0) * 22.92)\",\"math.abs(math.sin(query.anim_time * 38.17 + 90 * 0) * 22.92)\"]},\"leg1\":{\"rotation\":[0.0,\"math.abs(math.cos(query.anim_time * 76.34 + 90 * 0) * 22.92)\",\"-math.abs(math.sin(query.anim_time * 38.17 + 90 * 0) * 22.92)\"]},\"leg2\":{\"rotation\":[0.0,\"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 1) * 22.92)\",\"math.abs(math.sin(query.anim_time * 38.17 + 90 * 1) * 22.92)\"]},\"leg3\":{\"rotation\":[0.0,\"math.abs(math.cos(query.anim_time * 76.34 + 90 * 1) * 22.92)\",\"-math.abs(math.sin(query.anim_time * 38.17 + 90 * 1) * 22.92)\"]},\"leg4\":{\"rotation\":[0.0,\"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 2) * 22.92)\",\"math.abs(math.sin(query.anim_time * 38.17 + 90 * 2) * 22.92)\"]},\"leg5\":{\"rotation\":[0.0,\"math.abs(math.cos(query.anim_time * 76.34 + 90 * 2) * 22.92)\",\"-math.abs(math.sin(query.anim_time * 38.17 + 90 * 2) * 22.92)\"]},\"leg6\":{\"rotation\":[0.0,\"-math.abs(math.cos(query.anim_time * 76.34 + 90 * 3) * 22.92)\",\"math.abs(math.sin(query.anim_time * 38.17 + 90 * 3) * 22.92)\"]},\"leg7\":{\"rotation\":[0.0,\"math.abs(math.cos(query.anim_time * 76.34 + 90 * 3) * 22.92)\",\"-math.abs(math.sin(query.anim_time * 38.17 + 90 * 3) * 22.92)\"]}}}}}'},3823:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"query.is_baby ? 3.2 : 6.4\",0.0]},\"tentacle1\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"90.0 - this\",0.0]},\"tentacle2\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"45.0 - this\",0.0]},\"tentacle3\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"0.0 - this\",0.0]},\"tentacle4\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"-45.0 - this\",0.0]},\"tentacle5\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"-90.0 - this\",0.0]},\"tentacle6\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"-135.0 - this\",0.0]},\"tentacle7\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"-180.0 - this\",0.0]},\"tentacle8\":{\"rotation\":[\"variable.squid.tentacle_angle - this\",\"-225.0 - this\",0.0]}}},\"animation.{name}.rotate\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"body\":{\"rotation\":[{\"y\":\"180.0 - this\"},{\"x\":\"query.body_x_rotation\"},{\"y\":\"variable.squid.swim_rotation\"}]}}}}}'},7808:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.look_at_target.default\":{\"loop\":true,\"bones\":{\"body\":{\"relative_to\":{\"rotation\":\"entity\"},\"rotation\":[\"query.target_x_rotation\",\"query.target_y_rotation\",0.0]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"right_leg\":{\"rotation\":[\"Math.sin(query.modified_distance_moved * variable.speed * 0.5 + 180) * 114.592 * variable.animation_speed\",0,\"10 * Math.cos(query.modified_distance_moved * variable.speed * 0.5f + 180) * variable.animation_speed\"],\"position\":[0,\"-2 * Math.sin(query.modified_distance_moved * variable.speed * 0.5) * 2 * variable.animation_speed\",0]},\"left_leg\":{\"rotation\":[\"Math.sin(query.modified_distance_moved * variable.speed * 0.5) * 114.592 * variable.animation_speed\",0,\"10 * Math.cos(query.modified_distance_moved * variable.speed * 0.5f) * variable.animation_speed\"],\"position\":[0,\"-2 * Math.sin(query.modified_distance_moved * variable.speed * 0.5 + 180) * 2 * variable.animation_speed\",0]},\"body\":{\"rotation\":[0,0,\"5.72958 * Math.sin(query.modified_distance_moved * variable.speed) * 4 * variable.animation_speed\"],\"position\":[0,\"-2 * Math.cos(query.modified_distance_moved * variable.speed) * 2 * variable.animation_speed\",0]},\"bristle1\":{\"rotation\":[0,0,\"variable.bristle_flow * 74.4845\"]},\"bristle2\":{\"rotation\":[0,0,\"variable.bristle_flow * 68.7549\"]},\"bristle3\":{\"rotation\":[0,0,\"variable.bristle_flow * 34.3775\"]},\"bristle4\":{\"rotation\":[0,0,\"variable.bristle_flow * 68.7549\"]},\"bristle5\":{\"rotation\":[0,0,\"variable.bristle_flow * 74.4845\"]}}},\"animation.{name}.bristle_flow\":{\"loop\":true,\"bones\":{\"bristle0\":{\"rotation\":[0,0,\"2.864789 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * -22.9183)\"]},\"bristle1\":{\"rotation\":[0,0,\"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 11.4592)\"]},\"bristle2\":{\"rotation\":[0,0,\"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 22.9183)\"]},\"bristle3\":{\"rotation\":[0,0,\"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 22.9183)\"]},\"bristle4\":{\"rotation\":[0,0,\"5.72958 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * 11.4592)\"]},\"bristle5\":{\"rotation\":[0,0,\"2.864789 * variable.bristle_range_mod * Math.sin(query.life_time * 20 * variable.bristle_speed_mod * -22.9183)\"]}}}}}'},7250:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.swim\":{\"loop\":true,\"animation_length\":2,\"bones\":{\"tail\":{\"rotation\":{\"0.0\":[0,-22.5,0],\"1.0\":[0,22.5,0],\"2.0\":[0,-22.5,0]}}}}}}'},2869:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.general\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"query.is_pregnant ? 1.0 : 0.0\",0.0],\"rotation\":[\"-this\",0.0,0.0]},\"eggbelly\":{\"position\":[0.0,-0.08,0.0],\"rotation\":[\"-this\",0.0,0.0],\"scale\":\"query.is_pregnant ? 1.0 : 0.0\"}}},\"animation.{name}.ground_move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"-this\",\"math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3 + 180) * variable.backlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this\",\"-this\"]},\"leg1\":{\"rotation\":[\"-this\",\"math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3) * variable.backlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this\",\"-this\"]},\"leg2\":{\"rotation\":[\"-this\",\"query.is_laying_egg ? math.cos(query.life_time * 1146.0 + 180) * 90.0 : math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3 + 180) * variable.frontlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this\",\"-this\"]},\"leg3\":{\"rotation\":[\"-this\",\"query.is_laying_egg ? math.cos(query.life_time * 1146.0) * 90.0 : math.clamp(math.cos(query.anim_time * variable.timemultiplier * variable.legspeedmultiplier * 57.3) * variable.frontlegmultiplier * query.modified_move_speed * 57.3, -90.0, 90.0) - this\",\"-this\"]}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.clamp(math.cos(query.anim_time * 22.92) * query.modified_move_speed * 28.65, -90.0, 90.0) - this\",\"-this\",\"-this\"]},\"leg1\":{\"rotation\":[\"math.clamp(math.cos(query.anim_time * 22.92 + 180) * query.modified_move_speed * 28.65, -90.0, 90.0) - this\",\"-this\",\"-this\"]},\"leg2\":{\"rotation\":[\"-this\",\"-this\",\"math.clamp(math.cos(query.anim_time * 22.92 + 180) * query.modified_move_speed * 28.65, -90.0, 90.0) - this\"]},\"leg3\":{\"rotation\":[\"-this\",\"-this\",\"math.clamp(math.cos(query.anim_time * 22.92) * query.modified_move_speed * 28.65, -90.0, 90.0) - this\"]}}}}}'},410:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack.rotations\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0.0,\"variable.attackbodyroty - this\",0.0]},\"leftarm\":{\"rotation\":[\"variable.attackbodyroty\",\"variable.attackbodyroty\",0.0]},\"rightarm\":{\"rotation\":[\"math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )\",\"(variable.is_brandishing_spear ? 0.0 : variable.attackbodyroty * 2.0) + variable.attackbodyroty\",0.0]}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leftwing\":{\"position\":[0.0,\"-1.0 - this\",\"2.0 - this\"],\"rotation\":[\"27.0 - this\",\"-(27.0 + math.cos(query.life_time * 916.8) * 9.0) - this\",\"-27.0 - this\"]},\"leg0\":{\"rotation\":[\"variable.tcos0 * 1.4 + 36.0\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"query.is_charging ? (216.0 - this) : 0.0\",0.0,0.0]},\"rightwing\":{\"position\":[0.0,\"-1.0 - this\",\"2.0 - this\"],\"rotation\":[\"27.0 - this\",\"27.0 + math.cos(query.life_time * 916.8) * 9.0 - this\",\"27.0 - this\"]}}}}}'},4361:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.baby_transform\":{\"loop\":true,\"bones\":{\"head\":{\"scale\":1.5}}},\"animation.{name}.general\":{\"loop\":true,\"bones\":{\"arms\":{\"position\":[0.0,-1.0,-1.0],\"rotation\":[\"-42.97 - this\",0.0,0.0]}}},\"animation.{name}.general.v1.0\":{\"loop\":true,\"bones\":{\"arms\":{\"position\":[0.0,\"-3.0 - this\",\"-1.0 - this\"],\"rotation\":[\"-42.97 - this\",0.0,0.0]}}},\"animation.{name}.get_in_bed\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,1.0,-15.0],\"rotation\":[-90.0,0.0,0.0]}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17) * 40.0) - this\",\"-this\",0.0]},\"leg1\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this\",\"-this\",0.0]}}}}}'},1424:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"query.is_riding ? 0.0 : ((math.cos(query.life_time * 20.0 * 10.89) * 28.65) + (math.sin(variable.attack_time * 180.0) * 68.76 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92))\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)\",0.0,0.0]}}},\"animation.{name}.hand_attack\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"(-108 + math.cos(query.life_time * 20.0 * 3.84) * 2.87) + (math.sin(variable.attack_time * 180.0) * 126.05 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0)) * 22.92)\",0.0,0.0]}}},\"animation.{name}.base\":{\"loop\":true,\"bones\":{\"arms\":{\"position\":[0.0,\"-3.0 - this\",\"-1.0 - this\"],\"rotation\":[\"-42.97 - this\",0.0,0.0]},\"leftarm\":{\"rotation\":[\"math.cos(query.life_time * 20.0 * 3.84) * 2.87\",-9.0,\"-1 * (math.cos(query.life_time * 20.0 * 5.16) * 2.87 + 2.87)\"]},\"rightarm\":{\"rotation\":[\"math.cos(query.life_time * 20.0 * 3.84) * 2.87\",9.0,\"math.cos(query.life_time * 20.0 * 5.16) * 2.87 + 2.87\"]},\"rightItem\":{\"scale\":\"query.is_angry ? 1.0 : 0.0\"},\"leftItem\":{\"scale\":\"query.is_angry ? 1.0 : 0.0\"}}},\"animation.{name}.riding.arms\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[-36.0,0.0,0.0]}}},\"animation.{name}.riding.legs\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"-72.0 - this\",\"18.0 - this\",\"-this\"]},\"leg1\":{\"rotation\":[\"-72.0 - this\",\"-18.0 - this\",\"-this\"]}}},\"animation.{name}.walk\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"(math.cos(query.modified_distance_moved * 38.17) * 80.21) * query.modified_move_speed * 0.5\",0.0,0.0]},\"leg1\":{\"rotation\":[\"(math.cos(query.modified_distance_moved * 38.17 + 180) * 80.21) * query.modified_move_speed * 0.5\",0.0,0.0]}}}}}'},1654:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.look_at_target.default\":{\"loop\":true,\"bones\":{\"head\":{\"relative_to\":{\"rotation\":\"entity\"},\"rotation\":[\"query.target_x_rotation\",\"query.target_y_rotation\",0]}}},\"animation.{name}.shiver\":{\"loop\":true,\"bones\":{\"left_tendril\":{\"rotation\":[\"variable.left_tendril_x_rot\",0,0]},\"right_tendril\":{\"rotation\":[\"variable.right_tendril_x_rot\",0,0]}},\"sound_effects\":{\"0.0\":{\"effect\":\"clicking\"}}},\"animation.{name}.move\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[\"variable.head_x_rot\",0,\"variable.head_z_rot\"]},\"body\":{\"rotation\":[\"variable.body_x_rot\",0,\"variable.body_z_rot\"]},\"left_leg\":{\"rotation\":[\"variable.left_leg_x_rot\",0,0]},\"right_leg\":{\"rotation\":[\"variable.right_leg_x_rot\",0,0]},\"left_arm\":{\"rotation\":[\"variable.left_arm_x_rot\",0,0]},\"right_arm\":{\"rotation\":[\"variable.right_arm_x_rot\",0,0]}}},\"animation.{name}.emerge\":{\"animation_length\":6.64,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,-22.5],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[0,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[0,0,10],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[0,0,10],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,0,10],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,0,10],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[25,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"3.92\":{\"post\":[35,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[25,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[70,0,2.5],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[70,0,2.5],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,-63,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,-56,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"3.16\":{\"post\":[0,-27,0],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[0,-14,0],\"lerp_mode\":\"catmullrom\"},\"3.92\":{\"post\":[0,-11,0],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[0,-14,0],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[0,-6,-3],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[0,-4,-3],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[0,-6,-3],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,-3,-4],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[0,-3,-4],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.92\":{\"post\":[0.74,0,-40.38],\"lerp_mode\":\"catmullrom\"},\"1.16\":{\"post\":[-67.5,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[-67.5,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"post\":[-47.5,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"1.4\":{\"post\":[-67.5,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[-67.5,0,15],\"lerp_mode\":\"catmullrom\"},\"1.76\":{\"post\":[-67.5,0,-5],\"lerp_mode\":\"catmullrom\"},\"1.84\":{\"post\":[-52.5,0,-5],\"lerp_mode\":\"catmullrom\"},\"1.92\":{\"post\":[-67.5,0,-5],\"lerp_mode\":\"catmullrom\"},\"2.64\":{\"post\":[-17.5,0,-10],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[70,0,12.5],\"lerp_mode\":\"catmullrom\"},\"4.04\":{\"post\":[70,0,12.5],\"lerp_mode\":\"catmullrom\"},\"4.12\":{\"post\":[80,0,12.5],\"lerp_mode\":\"catmullrom\"},\"4.24\":{\"post\":[70,0,12.5],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[77.5,0,-2.5],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[-8,-11,0],\"lerp_mode\":\"catmullrom\"},\"0.92\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,0.47,-0.95],\"lerp_mode\":\"catmullrom\"},\"1.32\":{\"post\":[0,0.47,-0.95],\"lerp_mode\":\"catmullrom\"},\"1.4\":{\"post\":[0,0.47,-0.95],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[0,1,-2],\"lerp_mode\":\"catmullrom\"},\"1.76\":{\"post\":[0,1,-2],\"lerp_mode\":\"catmullrom\"},\"1.84\":{\"post\":[0,1,-2],\"lerp_mode\":\"catmullrom\"},\"1.92\":{\"post\":[0,1,-2],\"lerp_mode\":\"catmullrom\"},\"2.64\":{\"post\":[0,-2,-2],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[0,-4,1],\"lerp_mode\":\"catmullrom\"},\"4.04\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"4.12\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"4.24\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,-1,1],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[-152.5,2.5,7.5],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[-180,12.5,-10],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[-90,12.5,-10],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[-90,12.5,-10],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[-90,12.5,-10],\"lerp_mode\":\"catmullrom\"},\"3.08\":{\"post\":[-95,12.5,-10],\"lerp_mode\":\"catmullrom\"},\"3.24\":{\"post\":[-83.93,3.93,5.71],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[-80,7.5,17.5],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[-67.5,2.5,0],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[-67.5,2.5,0],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[-55,2.5,0],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[-60,2.5,0],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[-55,2.5,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[-67.5,0,0],\"lerp_mode\":\"catmullrom\"},\"5.56\":{\"post\":[-50.45,0,2.69],\"lerp_mode\":\"catmullrom\"},\"6.08\":{\"post\":[-62.72,0,4.3],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[0,-21,9],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[2,-2,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[2,0,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[2,0,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[2,0,0],\"lerp_mode\":\"catmullrom\"},\"3.08\":{\"post\":[2,-2,0],\"lerp_mode\":\"catmullrom\"},\"3.24\":{\"post\":[2,2.71,3.86],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[2,1,5],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[2,3,3],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[2,3,3],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[2.67,4,0],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[2.67,0,0],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[2.67,4,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0.67,3,4],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.12\":{\"post\":[-167.5,-17.5,-7.5],\"lerp_mode\":\"catmullrom\"},\"0.6\":{\"post\":[-167.5,-17.5,-7.5],\"lerp_mode\":\"catmullrom\"},\"0.88\":{\"post\":[-175,-17.5,15],\"lerp_mode\":\"catmullrom\"},\"1.16\":{\"post\":[-190,-17.5,5],\"lerp_mode\":\"catmullrom\"},\"1.28\":{\"post\":[-90,-5,5],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[-90,-17.5,-12.5],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[-90,-17.5,-12.5],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[-90,-17.5,-12.5],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[-90,-17.5,-12.5],\"lerp_mode\":\"catmullrom\"},\"3.04\":{\"post\":[-81.29,-10.64,-14.21],\"lerp_mode\":\"catmullrom\"},\"3.16\":{\"post\":[-83.5,-5.5,-15.5],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[-62.5,-7.5,5],\"lerp_mode\":\"catmullrom\"},\"3.92\":{\"post\":[-58.75,-3.75,5],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[-55,0,0],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[-52.5,0,5],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[-50,0,5],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[-52.5,0,5],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[-72.5,-2.5,5],\"lerp_mode\":\"catmullrom\"},\"5.56\":{\"post\":[-57.5,-4.54,2.99],\"lerp_mode\":\"catmullrom\"},\"6.08\":{\"post\":[-70.99,-5.77,1.78],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.12\":{\"post\":[0,-8,0],\"lerp_mode\":\"catmullrom\"},\"0.6\":{\"post\":[0,-8,0],\"lerp_mode\":\"catmullrom\"},\"0.88\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[-2,0,0],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[-4,3,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[-4,3,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[-4,3,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[-4,3,0],\"lerp_mode\":\"catmullrom\"},\"3.04\":{\"post\":[-3.23,5.7,4.97],\"lerp_mode\":\"catmullrom\"},\"3.16\":{\"post\":[-1.49,2.22,5.25],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[-1.14,1.71,1.86],\"lerp_mode\":\"catmullrom\"},\"3.92\":{\"post\":[-1.14,1.21,3.86],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[-1.14,2.71,4.86],\"lerp_mode\":\"catmullrom\"},\"4.44\":{\"post\":[-1,1,3],\"lerp_mode\":\"catmullrom\"},\"4.56\":{\"post\":[0,1,1],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[0,1,3],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[-2,0,4],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"4.32\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"4.48\":{\"post\":[55,0,0],\"lerp_mode\":\"catmullrom\"},\"4.6\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,-63,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,-56,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[0,-22,0],\"lerp_mode\":\"catmullrom\"},\"3.76\":{\"post\":[0,-12.28,2.48],\"lerp_mode\":\"catmullrom\"},\"3.92\":{\"post\":[0,-9.28,2.48],\"lerp_mode\":\"catmullrom\"},\"4.08\":{\"post\":[0,-12.28,2.48],\"lerp_mode\":\"catmullrom\"},\"4.32\":{\"post\":[0,-4.14,4.14],\"lerp_mode\":\"catmullrom\"},\"4.48\":{\"post\":[0,-0.57,-8.43],\"lerp_mode\":\"catmullrom\"},\"4.6\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"3.84\":{\"post\":[20,0,-17.5],\"lerp_mode\":\"catmullrom\"},\"4.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[20,0,0],\"lerp_mode\":\"catmullrom\"},\"4.84\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,-63,0],\"lerp_mode\":\"catmullrom\"},\"0.52\":{\"post\":[0,-56,0],\"lerp_mode\":\"catmullrom\"},\"1.2\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.68\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,-32,0],\"lerp_mode\":\"catmullrom\"},\"3.36\":{\"post\":[0,-22,0],\"lerp_mode\":\"catmullrom\"},\"3.84\":{\"post\":[-4,2,-7],\"lerp_mode\":\"catmullrom\"},\"4.0\":{\"post\":[-4,0,-5],\"lerp_mode\":\"catmullrom\"},\"4.68\":{\"post\":[-4,0,-9],\"lerp_mode\":\"catmullrom\"},\"4.84\":{\"post\":[-2,2,-3.5],\"lerp_mode\":\"catmullrom\"},\"5.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"5.8\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"6.64\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}},\"particle_effects\":{\"0.0\":{\"effect\":\"digging\",\"pre_effect_script\":\"variable.dig_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.dig_particle_texture_size = query.surface_particle_texture_size; variable.dig_particle_color = query.surface_particle_color;\"}},\"sound_effects\":{\"0.0\":{\"effect\":\"emerge\"}}},\"animation.{name}.dig\":{\"loop\":\"hold_on_last_frame\",\"animation_length\":5,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[4.13441,0.94736,1.2694],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[50,0,0],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[54.45407,-13.53935,-18.14183],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[59.46442,-10.8885,35.7954],\"lerp_mode\":\"catmullrom\"},\"1.3333\":{\"post\":[82.28261,0,0],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[53.23606,10.04715,-29.72932],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[-17.71739,0,0],\"lerp_mode\":\"catmullrom\"},\"2.5417\":{\"post\":[112.28261,0,0],\"lerp_mode\":\"catmullrom\"},\"2.6667\":{\"post\":[116.06889,5.11581,-24.50117],\"lerp_mode\":\"catmullrom\"},\"2.8333\":{\"post\":[121.56244,-4.17248,19.57737],\"lerp_mode\":\"catmullrom\"},\"3.0417\":{\"post\":[138.56889,5.11581,-24.50117],\"lerp_mode\":\"catmullrom\"},\"3.25\":{\"post\":[144.06244,-4.17248,19.57737],\"lerp_mode\":\"catmullrom\"},\"3.375\":{\"post\":[147.28261,0,0],\"lerp_mode\":\"catmullrom\"},\"3.625\":{\"post\":[147.28261,0,0],\"lerp_mode\":\"catmullrom\"},\"3.875\":{\"post\":[134.36221,8.81113,-8.90172],\"lerp_mode\":\"catmullrom\"},\"4.0417\":{\"post\":[132.05966,-8.35927,9.70506],\"lerp_mode\":\"catmullrom\"},\"4.25\":{\"post\":[134.36221,8.81113,-8.90172],\"lerp_mode\":\"catmullrom\"},\"4.5\":[147.5,0,0]},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[0,-16.48454,-6.5784],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[0,-16.48454,-6.5784],\"lerp_mode\":\"catmullrom\"},\"1.0417\":{\"post\":[0,-16.97,-7.11],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[0,-13.97,-7.11],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[0,-11.48454,-0.5784],\"lerp_mode\":\"catmullrom\"},\"2.5417\":{\"post\":[0,-16.48454,-6.5784],\"lerp_mode\":\"catmullrom\"},\"2.6667\":{\"post\":[0,-20.27,-5.42],\"lerp_mode\":\"catmullrom\"},\"3.375\":{\"post\":[0,-21.48454,-5.5784],\"lerp_mode\":\"catmullrom\"},\"4.0417\":{\"post\":[0,-22.48454,-5.5784],\"lerp_mode\":\"catmullrom\"},\"4.5\":[0,-40,-8]}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.6667\":{\"post\":[12.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.2083\":{\"post\":[12.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[45,0,0],\"lerp_mode\":\"catmullrom\"},\"2.375\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.5417\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.375\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"4.375\":[0,0,0]}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-101.8036,-21.29587,30.61478],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[-101.8036,-21.29587,30.61478],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[48.7585,-17.61941,9.9865],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[48.7585,-17.61941,9.9865],\"lerp_mode\":\"catmullrom\"},\"1.4583\":{\"post\":[-101.8036,-21.29587,30.61478],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[-89.04994,-4.19657,-1.47845],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[-158.30728,3.7152,-1.52352],\"lerp_mode\":\"catmullrom\"},\"2.5417\":{\"post\":[-89.04994,-4.19657,-1.47845],\"lerp_mode\":\"catmullrom\"},\"4.375\":{\"post\":[-120,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[2.22,0,0.86],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[3.12,0,4.29],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[1,0,4],\"lerp_mode\":\"catmullrom\"},\"4.375\":{\"post\":[0,0,4],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.2917\":{\"post\":[-63.89288,-0.52011,2.09491],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-63.89288,-0.52011,2.09491],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[-62.87857,15.15061,9.97445],\"lerp_mode\":\"catmullrom\"},\"0.9167\":{\"post\":[-86.93642,17.45026,4.05284],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[-86.93642,17.45026,4.05284],\"lerp_mode\":\"catmullrom\"},\"1.4583\":{\"post\":[-86.93642,17.45026,4.05284],\"lerp_mode\":\"catmullrom\"},\"1.6667\":{\"post\":[63.0984,8.83573,-8.71284],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[35.5984,8.83573,-8.71284],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[-153.27474,-0.02953,3.5235],\"lerp_mode\":\"catmullrom\"},\"2.5417\":{\"post\":[-87.07754,-0.02625,3.132],\"lerp_mode\":\"catmullrom\"},\"4.375\":[-120,0,0]},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[-0.28,5,10],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[-1.51,4.35,4.33],\"lerp_mode\":\"catmullrom\"},\"0.9167\":{\"post\":[-0.6,3.61,4.63],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[-0.6,3.61,0.63],\"lerp_mode\":\"catmullrom\"},\"1.6667\":{\"post\":[-2.85,-0.1,3.33],\"lerp_mode\":\"catmullrom\"},\"2.2083\":{\"post\":[-1,0,4],\"lerp_mode\":\"catmullrom\"},\"4.375\":[0,0,4]}},\"right_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[113.27,0,0],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[113.27,0,0],\"lerp_mode\":\"catmullrom\"},\"3.3333\":{\"post\":[113.27,0,0],\"lerp_mode\":\"catmullrom\"},\"3.5833\":{\"post\":[182.5,0,0],\"lerp_mode\":\"catmullrom\"},\"3.8333\":{\"post\":[120,0,0],\"lerp_mode\":\"catmullrom\"},\"4.0833\":{\"post\":[182.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.2917\":{\"post\":[120,0,0],\"lerp_mode\":\"catmullrom\"},\"4.5\":[90,0,0]},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[0,-13.98,-2.37],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[0,-13.98,-2.37],\"lerp_mode\":\"catmullrom\"},\"3.3333\":{\"post\":[0,-13.98,-2.37],\"lerp_mode\":\"catmullrom\"},\"3.5833\":{\"post\":[0,-7,-3],\"lerp_mode\":\"catmullrom\"},\"3.8333\":{\"post\":[0,-9,-3],\"lerp_mode\":\"catmullrom\"},\"4.0833\":{\"post\":[0,-16.71,-3.69],\"lerp_mode\":\"catmullrom\"},\"4.2917\":[0,-28,-5]}},\"left_leg\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[114.98,0,0],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[114.98,0,0],\"lerp_mode\":\"catmullrom\"},\"3.3333\":{\"post\":[114.98,0,0],\"lerp_mode\":\"catmullrom\"},\"3.5833\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"3.8333\":{\"post\":[172.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.0833\":{\"post\":[90,0,0],\"lerp_mode\":\"catmullrom\"},\"4.2917\":{\"post\":[197.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.5\":[90,0,0]},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.5\":{\"post\":[0,-14.01,-2.35],\"lerp_mode\":\"catmullrom\"},\"0.7083\":{\"post\":[0,-14.01,-2.35],\"lerp_mode\":\"catmullrom\"},\"3.3333\":{\"post\":[0,-14.01,-2.35],\"lerp_mode\":\"catmullrom\"},\"3.5833\":{\"post\":[0,-5,-4],\"lerp_mode\":\"catmullrom\"},\"3.8333\":{\"post\":[0,-7,-4],\"lerp_mode\":\"catmullrom\"},\"4.0833\":{\"post\":[0,-15.5,-3.76],\"lerp_mode\":\"catmullrom\"},\"4.2917\":[0,-28,-5]}}},\"sound_effects\":{\"0.0\":{\"effect\":\"dig\"}},\"particle_effects\":{\"0.0\":{\"effect\":\"digging\",\"pre_effect_script\":\"variable.dig_particle_texture_coordinate = query.surface_particle_texture_coordinate; variable.dig_particle_texture_size = query.surface_particle_texture_size; variable.dig_particle_color = query.surface_particle_color;\"}}},\"animation.{name}.roar\":{\"animation_length\":4.2,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[-25,0,0],\"lerp_mode\":\"catmullrom\"},\"1.6\":{\"post\":[32.5,0,-7.5],\"lerp_mode\":\"catmullrom\"},\"1.84\":{\"post\":[38.33,0,2.99],\"lerp_mode\":\"catmullrom\"},\"2.08\":{\"post\":[40.97,0,-4.3],\"lerp_mode\":\"catmullrom\"},\"2.36\":{\"post\":[44.41,0,6.29],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,-1,3],\"lerp_mode\":\"catmullrom\"},\"1.6\":{\"post\":[0,-3,-6],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,-3,-6],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[-32.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.6\":{\"post\":[-32.5,0,-27.5],\"lerp_mode\":\"catmullrom\"},\"1.8\":{\"post\":[-32.5,0,26],\"lerp_mode\":\"catmullrom\"},\"2.04\":{\"post\":[-32.5,0,-27.5],\"lerp_mode\":\"catmullrom\"},\"2.44\":{\"post\":[-32.5,0,26],\"lerp_mode\":\"catmullrom\"},\"2.84\":{\"post\":[-5,0,-12.5],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.6\":{\"post\":[0,-2,-6],\"lerp_mode\":\"catmullrom\"},\"2.2\":{\"post\":[0,-2,-6],\"lerp_mode\":\"catmullrom\"},\"2.48\":{\"post\":[0,-2,-6],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_tendril\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.76\":{\"post\":[0,0,-10.85],\"lerp_mode\":\"catmullrom\"},\"2.08\":{\"post\":[0,0,12.5],\"lerp_mode\":\"catmullrom\"},\"2.4\":{\"post\":[0,0,-10.85],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"post\":[0,0,12.5],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,-10.85],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_tendril\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.76\":{\"post\":[0,0,-15.85],\"lerp_mode\":\"catmullrom\"},\"2.08\":{\"post\":[0,0,12.5],\"lerp_mode\":\"catmullrom\"},\"2.4\":{\"post\":[0,0,-15.85],\"lerp_mode\":\"catmullrom\"},\"2.72\":{\"post\":[0,0,12.5],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,-15.85],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"post\":[-120,0,-20],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[-77.5,3.75,15],\"lerp_mode\":\"catmullrom\"},\"1.48\":{\"post\":[67.5,-32.5,20],\"lerp_mode\":\"catmullrom\"},\"2.48\":{\"post\":[37.5,-32.5,25],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[27.6,-17.1,32.5],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"post\":[3,-2,0],\"lerp_mode\":\"catmullrom\"},\"1.48\":{\"post\":[4,-2,0],\"lerp_mode\":\"catmullrom\"},\"2.48\":{\"post\":[4,-2,0],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"post\":[-125,0,20],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[-76.25,-17.5,-7.5],\"lerp_mode\":\"catmullrom\"},\"1.48\":{\"post\":[62.5,42.5,-12.5],\"lerp_mode\":\"catmullrom\"},\"2.48\":{\"post\":[37.5,27.5,-27.5],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[25,18.4,-30],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.72\":{\"post\":[-3,-2,0],\"lerp_mode\":\"catmullrom\"},\"1.48\":{\"post\":[-4,-2,0],\"lerp_mode\":\"catmullrom\"},\"2.48\":{\"post\":[-4,-2,0],\"lerp_mode\":\"catmullrom\"},\"4.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}},\"sound_effects\":{\"1.25\":{\"effect\":\"roar\"}}},\"animation.{name}.sniff\":{\"animation_length\":3.32,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.56\":{\"post\":[17.5,32.5,0],\"lerp_mode\":\"catmullrom\"},\"0.96\":{\"post\":[0,32.5,0],\"lerp_mode\":\"catmullrom\"},\"2.2\":{\"post\":[10,0,0],\"lerp_mode\":\"catmullrom\"},\"2.8\":{\"post\":[10,-30,0],\"lerp_mode\":\"catmullrom\"},\"3.32\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.68\":{\"post\":[0,40,0],\"lerp_mode\":\"catmullrom\"},\"0.96\":{\"post\":[-22.5,40,0],\"lerp_mode\":\"catmullrom\"},\"1.24\":{\"post\":[0,20,0],\"lerp_mode\":\"catmullrom\"},\"1.52\":{\"post\":[-35,20,0],\"lerp_mode\":\"catmullrom\"},\"1.76\":{\"post\":[0,20,0],\"lerp_mode\":\"catmullrom\"},\"2.28\":{\"post\":[0,-20,0],\"lerp_mode\":\"catmullrom\"},\"2.6\":{\"post\":[-25,-23.65037,0],\"lerp_mode\":\"catmullrom\"},\"2.88\":{\"post\":[0,-20,0],\"lerp_mode\":\"catmullrom\"},\"3.32\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.96\":{\"post\":[17.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.76\":{\"post\":[-15,0,0],\"lerp_mode\":\"catmullrom\"},\"3.32\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.96\":{\"post\":[-15,0,0],\"lerp_mode\":\"catmullrom\"},\"2.2\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.76\":{\"post\":[17.5,0,0],\"lerp_mode\":\"catmullrom\"},\"3.32\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}},\"sound_effects\":{\"0.0\":{\"effect\":\"sniff\"}}},\"animation.{name}.bob\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[\"variable.modified_bob_cos * 1.43\",0,\"variable.modified_bob_sin * 1.43\"]},\"head\":{\"rotation\":[\"variable.modified_bob_sin * 3.43\",0,\"variable.modified_bob_cos * 3.43\"]}}},\"animation.{name}.attack\":{\"animation_length\":0.33333,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.2083\":{\"post\":[0,-1,-2],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[-30.17493,0,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,-2,-2],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[-120.36119,40.78947,-20.94102],\"lerp_mode\":\"catmullrom\"},\"0.1667\":{\"post\":[-90,-45,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[4,0,5],\"lerp_mode\":\"catmullrom\"},\"0.1667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[-120.36119,-40.78947,20.94102],\"lerp_mode\":\"catmullrom\"},\"0.1667\":{\"post\":[-61.1632,42.85882,11.52421],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.0417\":{\"post\":[-4,0,5],\"lerp_mode\":\"catmullrom\"},\"0.1667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.3333\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}}},\"animation.{name}.hurt\":{\"animation_length\":0.25,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[-22.5,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.125\":{\"post\":[45,0,0],\"lerp_mode\":\"catmullrom\"},\"0.25\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.125\":[22.5,0,0],\"0.25\":[0,0,0]}},\"left_leg\":{\"rotation\":{\"0.0\":[0,0,0],\"0.125\":[-22.5,0,0],\"0.25\":[0,0,0]}}}},\"animation.{name}.sonic_boom\":{\"animation_length\":3,\"bones\":{\"body\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[47.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[55,0,0],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.0\":{\"post\":[-32.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.4583\":{\"post\":[-32.5,0,0],\"lerp_mode\":\"catmullrom\"},\"2.7083\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0833\":{\"post\":[0,-3,0],\"lerp_mode\":\"catmullrom\"},\"1.625\":{\"post\":[0,-4,-1],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.7083\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_ribcage\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5417\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.7917\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.875\":{\"post\":[0,125,0],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[0,125,0],\"lerp_mode\":\"catmullrom\"},\"2.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_ribcage\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.5417\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.7917\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.875\":{\"post\":[0,-125,0],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[0,-125,0],\"lerp_mode\":\"catmullrom\"},\"2.6667\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"head\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.0\":{\"post\":[67.5,0,0],\"lerp_mode\":\"catmullrom\"},\"1.75\":{\"post\":[80,0,0],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"2.7083\":{\"post\":[-45,0,0],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[0,0,-3],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[0,0,-3],\"lerp_mode\":\"catmullrom\"},\"2.7083\":{\"post\":[0,0,-3],\"lerp_mode\":\"catmullrom\"},\"2.875\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"right_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[-42.28659,-32.69813,-5.00825],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[-29.83757,-35.39626,-45.28089],\"lerp_mode\":\"catmullrom\"},\"1.3333\":{\"post\":[-29.83757,-35.39626,-45.28089],\"lerp_mode\":\"catmullrom\"},\"1.6667\":{\"post\":[-72.28659,-32.69813,-5.00825],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[35.26439,-30,35.26439],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[73.75484,-13.0931,19.20518],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[73.75484,-13.0931,19.20518],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[58.20713,-21.1064,28.7261],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[3,0,0],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[3,0,0],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}},\"left_arm\":{\"rotation\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"0.875\":{\"post\":[-33.80694,32.31058,6.87997],\"lerp_mode\":\"catmullrom\"},\"1.1667\":{\"post\":[-17.87827,34.62115,49.02433],\"lerp_mode\":\"catmullrom\"},\"1.3333\":{\"post\":[-17.87827,34.62115,49.02433],\"lerp_mode\":\"catmullrom\"},\"1.6667\":{\"post\":[-51.30694,32.31058,6.87997],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[35.26439,30,-35.26439],\"lerp_mode\":\"catmullrom\"},\"1.9167\":{\"post\":[73.75484,13.0931,-19.20518],\"lerp_mode\":\"catmullrom\"},\"2.5\":{\"post\":[73.75484,13.0931,-19.20518],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[58.20713,21.1064,-28.7261],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}},\"position\":{\"0.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"},\"1.8333\":{\"post\":[-3,0,0],\"lerp_mode\":\"catmullrom\"},\"2.75\":{\"post\":[-3,0,0],\"lerp_mode\":\"catmullrom\"},\"3.0\":{\"post\":[0,0,0],\"lerp_mode\":\"catmullrom\"}}}}}}}'},1154:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.general\":{\"loop\":true,\"bones\":{\"nose\":{\"rotation\":[\"(variable.isholdingitem ? -25.7831 : (math.sin(query.life_time * 57.296) * 4.5)) - this\",0.0,\"(math.cos(query.life_time * 57.296) * 2.5) - this\"]}}},\"animation.{name}.villager_general\":{\"loop\":true,\"bones\":{\"arms\":{\"position\":[0.0,-1.0,-1.0],\"rotation\":[\"-42.97 - this\",0.0,0.0]}}},\"animation.{name}.move\":{\"anim_time_update\":\"query.modified_distance_moved\",\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17) * 40.0) - this\",\"-this\",0.0]},\"leg1\":{\"rotation\":[\"(math.cos(query.anim_time * 38.17 + 180) * 40.0) - this\",\"-this\",0.0]}}}}}'},46:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"-90 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this\",\"5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this\",\"math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this\"]},\"rightarm\":{\"rotation\":[\"-90 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this\",\"(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this\",\"math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this\"]}}}}}'},4179:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.angry\":{\"loop\":true,\"bones\":{\"tail\":{\"rotation\":[0,\"query.is_angry ? -this : (math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed * 80.22 - this)\",0]}}},\"animation.{name}.baby_scaling\":{\"loop\":true,\"bones\":{\"head\":{\"position\":[0,1,-2],\"scale\":1.6}}},\"animation.{name}.head_rot_z\":{\"loop\":true,\"bones\":{\"head\":{\"rotation\":[0,0,\"(query.is_interested ? (query.head_roll_angle * 57.3) : 0) + (query.is_shaking_wetness ? variable.head_rot_z : 0) - this\"]}}},\"animation.{name}.leg_default\":{\"loop\":true,\"bones\":{\"leg0\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 80.22 * query.modified_move_speed - this\",0,0]},\"leg1\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180) * 80.22 * query.modified_move_speed - this\",0,0]},\"leg2\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17 + 180) * 80.22 * query.modified_move_speed - this\",0,0]},\"leg3\":{\"rotation\":[\"math.cos(query.modified_distance_moved * 38.17) * 80.22 * query.modified_move_speed - this\",0,0]}}},\"animation.{name}.shaking\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[0,0,\"variable.body_rot_z - this\"]},\"upperbody\":{\"rotation\":[0,0,\"variable.upper_body_rot_z - this\"]}}},\"animation.{name}.sitting\":{\"loop\":true,\"bones\":{\"body\":{\"rotation\":[-45,0,0],\"position\":[0,-4,-2]},\"leg0\":{\"rotation\":[270,0,0],\"position\":[0,-7,-5]},\"leg1\":{\"rotation\":[270,0,0],\"position\":[0,-7,-5]},\"leg2\":{\"rotation\":[333,0,0],\"position\":[0.01,-1,0]},\"leg3\":{\"rotation\":[333,0,0],\"position\":[0.01,-1,0]},\"tail\":{\"position\":[0,-9,-2]},\"upperBody\":{\"rotation\":[-18,0,0],\"position\":[0,-2,0]}}},\"animation.{name}.tail_default\":{\"loop\":true,\"bones\":{\"tail\":{\"rotation\":[\"query.tail_angle * 57.3 - this\",0,\"variable.tail_rot_z - this\"]}}}}}'},2533:e=>{e.exports='{\"format_version\":\"1.8.0\",\"animations\":{\"animation.{name}.attack_bare_hand\":{\"loop\":true,\"bones\":{\"leftarm\":{\"rotation\":[\"-90.0 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this\",\"5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this\",\"math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this\"]},\"rightarm\":{\"rotation\":[\"90.0 * (variable.is_brandishing_spear - 1.0) - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this\",\"(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this\",\"math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this\"]}}},\"animation.{name}.swimming\":{\"loop\":true,\"bones\":{\"body\":{\"position\":[0.0,\"variable.swim_amount * -10.0 - this\",\"variable.swim_amount * 9.0 - this\"],\"rotation\":[\"variable.swim_amount * (90.0 + query.target_x_rotation)\",0.0,0.0]},\"leftarm\":{\"rotation\":[\"math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) - (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this\",\"math.lerp(this, 14.325, variable.swim_amount) - this\",\"math.lerp(this, 14.325, variable.swim_amount) - (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this\"]},\"leftleg\":{\"rotation\":[\"math.lerp(this, math.cos(query.life_time * 390.0 + 180.0) * 0.3, variable.swim_amount)\",0.0,0.0]},\"rightarm\":{\"rotation\":[\"math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) + (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this\",\"math.lerp(this, 14.325, variable.swim_amount) - this\",\"math.lerp(this, -14.325, variable.swim_amount) + (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this\"]},\"rightleg\":{\"rotation\":[\"math.lerp(this, math.cos(query.life_time * 390.0) * 0.3, variable.swim_amount)\",0.0,0.0]}}}}}'},5825:e=>{e.exports='{\"format_version\":\"1.16.100\",\"minecraft:entity\":{\"description\":{\"identifier\":\"blockbench:basic\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:physics\":{\"has_gravity\":true,\"has_collision\":true},\"minecraft:pushable\":{\"is_pushable\":false},\"minecraft:push_through\":{\"value\":1}}}}'},2813:e=>{e.exports='{\"format_version\":\"1.16.100\",\"minecraft:entity\":{\"description\":{\"identifier\":\"blockbench:basic_walking\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:physics\":{\"has_gravity\":true,\"has_collision\":true},\"minecraft:pushable\":{\"is_pushable\":false},\"minecraft:push_through\":{\"value\":1},\"minecraft:movement\":{\"value\":0.25},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:navigation.walk\":{\"avoid_water\":true},\"minecraft:behavior.random_stroll\":{\"priority\":3,\"speed_multiplier\":0.8}}}}'},4815:e=>{e.exports='{\"format_version\":\"1.20.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"blockbench:basic\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:physics\":{\"has_gravity\":true,\"has_collision\":true},\"minecraft:pushable\":{\"is_pushable\":false},\"minecraft:push_through\":{\"value\":1},\"minecraft:movement\":{\"value\":0.2},\"minecraft:collision_box\":{\"height\":1.0,\"width\":1.2},\"minecraft:movement.basic\":{},\"minecraft:navigation.generic\":{},\"minecraft:input_ground_controlled\":{},\"minecraft:rideable\":{\"seat_count\":1,\"seats\":[{\"position\":[0,0.25,0]}]},\"minecraft:variable_max_auto_step\":{\"base_value\":1.2,\"controlled_value\":1.2}}}}'},1833:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:allay\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"pickup_item_delay\":{\"minecraft:timer\":{\"looping\":false,\"time\":3,\"time_down_event\":{\"event\":\"pickup_item_delay_complete\"}}},\"pickup_item\":{\"minecraft:behavior.pickup_items\":{\"priority\":2,\"max_dist\":32,\"search_height\":32,\"goal_radius\":2.2,\"speed_multiplier\":6,\"pickup_based_on_chance\":false,\"can_pickup_any_item\":false,\"can_pickup_to_hand_or_equipment\":false,\"pickup_same_items_as_in_hand\":true}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:type_family\":{\"family\":[\"allay\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.35,\"height\":0.6},\"minecraft:balloonable\":{\"mass\":0.5},\"minecraft:breathable\":{\"totalSupply\":15,\"suffocateTime\":0},\"minecraft:nameable\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:health\":{\"value\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:damage_sensor\":{\"triggers\":[{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_owner\",\"subject\":\"other\",\"value\":true}]}},\"deals_damage\":false}]},\"minecraft:movement\":{\"value\":0.1},\"minecraft:flying_speed\":{\"value\":0.1},\"minecraft:navigation.hover\":{\"can_path_over_water\":true,\"can_sink\":false,\"can_pass_doors\":false,\"can_path_from_air\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true,\"avoid_sun\":false},\"minecraft:movement.hover\":{},\"minecraft:follow_range\":{\"value\":1024},\"minecraft:ambient_sound_interval\":{\"value\":5.0,\"range\":5.0,\"event_name\":\"ambient\",\"event_names\":[{\"event_name\":\"ambient.tame\",\"condition\":\"query.is_using_item\"},{\"event_name\":\"ambient\",\"condition\":\"!query.is_using_item\"}]},\"minecraft:jump.static\":{},\"minecraft:can_fly\":{},\"minecraft:physics\":{\"has_gravity\":false},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:vibration_listener\":{},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:inventory\":{\"inventory_size\":1},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]}},\"give_item\":true,\"take_item\":true,\"interact_text\":\"action.interact.allay\"}]},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2.0},\"minecraft:behavior.go_and_give_items_to_noteblock\":{\"priority\":3,\"run_speed\":8,\"throw_sound\":\"item_thrown\",\"on_item_throw\":[{\"event\":\"pickup_item_delay\",\"target\":\"self\"}]},\"minecraft:behavior.go_and_give_items_to_owner\":{\"priority\":4,\"run_speed\":8,\"throw_sound\":\"item_thrown\",\"on_item_throw\":[{\"event\":\"pickup_item_delay\",\"target\":\"self\"}]},\"minecraft:behavior.stay_near_noteblock\":{\"priority\":5,\"speed\":8,\"start_distance\":16,\"stop_distance\":4},\"minecraft:behavior.follow_owner\":{\"priority\":6,\"speed_multiplier\":8,\"start_distance\":16,\"stop_distance\":4,\"can_teleport\":false,\"ignore_vibration\":false},\"minecraft:behavior.float\":{\"priority\":7},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:behavior.random_hover\":{\"priority\":9,\"xz_dist\":8,\"y_dist\":8,\"y_offset\":-1,\"interval\":1,\"hover_height\":[1,4]}},\"events\":{\"pickup_item_delay\":{\"remove\":{\"component_groups\":[\"pickup_item\"]},\"add\":{\"component_groups\":[\"pickup_item_delay\"]}},\"pickup_item_delay_complete\":{\"remove\":{\"component_groups\":[\"pickup_item_delay\"]},\"add\":{\"component_groups\":[\"pickup_item\"]}},\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"pickup_item\"]}}}}}'},487:e=>{e.exports='{\"format_version\":\"1.20.80\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"spawn_category\":\"creature\",\"is_spawnable\":true,\"is_summonable\":true,\"properties\":{\"minecraft:armadillo_state\":{\"type\":\"enum\",\"values\":[\"unrolled\",\"rolled_up\",\"rolled_up_peeking\",\"rolled_up_relaxing\",\"rolled_up_unrolling\"],\"default\":\"unrolled\",\"client_sync\":true}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"armadillo\",\"mob\"]},\"minecraft:physics\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:movement.basic\":{},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true,\"avoid_water\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:nameable\":{},\"minecraft:balloonable\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.7,\"height\":0.65},\"minecraft:health\":{\"value\":12},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\"},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:entity_sensor\":{\"subsensors\":[{\"event\":\"minecraft:no_threat_detected\",\"cooldown\":0.2,\"range\":[7.0,2.0],\"minimum_count\":0,\"maximum_count\":0,\"event_filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"undead\"},{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"any_of\":[{\"test\":\"was_last_hurt_by\",\"subject\":\"other\"},{\"test\":\"is_sprinting\",\"subject\":\"other\"},{\"test\":\"is_riding\",\"subject\":\"other\"}]}]}]}},{\"event\":\"minecraft:threat_detected\",\"cooldown\":0.2,\"range\":[7.0,2.0],\"minimum_count\":1,\"event_filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"undead\"},{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"any_of\":[{\"test\":\"was_last_hurt_by\",\"subject\":\"other\"},{\"test\":\"is_sprinting\",\"subject\":\"other\"},{\"test\":\"is_riding\",\"subject\":\"other\"}]}]}]}}]},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"ignore_mob_damage\":true,\"speed_multiplier\":2.0}},\"component_groups\":{\"minecraft:baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.6},\"minecraft:ageable\":{\"duration\":1200,\"interact_filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"unrolled\"},\"feed_items\":\"spider_eye\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"minecraft:baby_unrolled\":{\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.25}},\"minecraft:adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:spawn_entity\":{\"entities\":{\"min_wait_time\":300,\"max_wait_time\":600,\"spawn_sound\":\"mob.armadillo.scute_drop\",\"spawn_item\":\"armadillo_scute\"}},\"minecraft:breedable\":{\"love_filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"unrolled\"},\"require_tame\":false,\"breeds_with\":[{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}],\"breed_items\":[\"spider_eye\"]},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"brush\"}]}},\"play_sounds\":\"mob.armadillo.brush\",\"interact_text\":\"action.interact.brush\",\"hurt_item\":16,\"swing\":true,\"spawn_items\":{\"table\":\"loot_tables/entities/armadillo_brush.json\"}}]}},\"minecraft:adult_unrolled\":{\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0}},\"minecraft:unrolled\":{\"minecraft:movement\":{\"value\":0.14},\"minecraft:ambient_sound_interval\":{},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:threat_detected\"}}},\"minecraft:behavior.tempt\":{\"priority\":3,\"speed_multiplier\":1.25,\"can_tempt_vertically\":true,\"items\":[\"spider_eye\"]},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"target_distance\":6.0,\"probability\":0.02,\"min_look_time\":40,\"max_look_time\":80},\"minecraft:behavior.random_look_around\":{\"priority\":8}},\"minecraft:rolled_up\":{\"minecraft:movement\":{\"value\":0.0},\"minecraft:body_rotation_blocked\":{},\"minecraft:damage_sensor\":{\"triggers\":[{\"on_damage\":{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:threat_detected\"},\"damage_multiplier\":0.5,\"damage_modifier\":-1.0},{\"damage_multiplier\":0.5,\"damage_modifier\":-1.0}]},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"any_of\":[{\"test\":\"on_fire\"},{\"test\":\"in_water\"},{\"test\":\"is_panicking\"},{\"test\":\"is_leashed\"},{\"test\":\"is_riding\"}]},\"event\":\"minecraft:unroll\"}]}},\"minecraft:rolled_up_with_threats\":{\"minecraft:behavior.timer_flag_1\":{\"priority\":0,\"cooldown_range\":2.5,\"duration_range\":[5.0,20.0],\"on_start\":{\"event\":\"minecraft:stop_peeking\"},\"on_end\":{\"event\":\"minecraft:start_peeking\"}}},\"minecraft:rolled_up_without_threats\":{\"minecraft:timer\":{\"looping\":true,\"time\":4,\"randomInterval\":false,\"time_down_event\":{\"event\":\"minecraft:unroll\"}},\"minecraft:behavior.timer_flag_1\":{\"priority\":0,\"cooldown_range\":2.5,\"duration_range\":1.5,\"on_start\":{\"event\":\"minecraft:start_unrolling\"}}}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"trigger\":\"minecraft:spawn_baby\"}]},\"minecraft:entity_born\":{\"trigger\":\"minecraft:spawn_baby\"},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:adult\",\"minecraft:adult_unrolled\",\"minecraft:unrolled\",\"minecraft:scanning\"]}},\"minecraft:spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:baby\",\"minecraft:baby_unrolled\",\"minecraft:unrolled\",\"minecraft:scanning\"]}},\"minecraft:ageable_grow_up\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:baby\",\"minecraft:baby_unrolled\"]},\"add\":{\"component_groups\":[\"minecraft:adult\"]}},{\"filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"unrolled\"},\"add\":{\"component_groups\":[\"minecraft:adult_unrolled\"]}}]},\"minecraft:no_threat_detected\":{\"sequence\":[{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up\"},{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up_peeking\"}]},{\"test\":\"on_fire\",\"value\":false},{\"test\":\"in_water\",\"value\":false},{\"test\":\"is_panicking\",\"value\":false},{\"test\":\"is_leashed\",\"value\":false},{\"test\":\"is_riding\",\"value\":false}]},\"remove\":{\"component_groups\":[\"minecraft:rolled_up_with_threats\"]},\"add\":{\"component_groups\":[\"minecraft:rolled_up_without_threats\"]},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up_relaxing\"}}]},\"minecraft:threat_detected\":{\"sequence\":[{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"unrolled\"},{\"test\":\"on_ground\",\"value\":true},{\"test\":\"on_fire\",\"value\":false},{\"test\":\"in_water\",\"value\":false},{\"test\":\"is_panicking\",\"value\":false},{\"test\":\"is_leashed\",\"value\":false},{\"test\":\"is_riding\",\"value\":false}]},\"trigger\":\"minecraft:roll_up\"},{\"filters\":{\"any_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up_relaxing\"},{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up_unrolling\"}]},\"remove\":{\"component_groups\":[\"minecraft:rolled_up_without_threats\"]},\"add\":{\"component_groups\":[\"minecraft:rolled_up_with_threats\"]},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up\"}}]},\"minecraft:unroll\":{\"sequence\":[{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"operator\":\"not\",\"value\":\"unrolled\"},{\"test\":\"actor_health\",\"subject\":\"self\",\"operator\":\">\",\"value\":0}]},\"remove\":{\"component_groups\":[\"minecraft:rolled_up\",\"minecraft:rolled_up_with_threats\",\"minecraft:rolled_up_without_threats\"]},\"add\":{\"component_groups\":[\"minecraft:unrolled\"]},\"set_property\":{\"minecraft:armadillo_state\":\"unrolled\"},\"emit_vibration\":{\"vibration\":\"entity_act\"}},{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"operator\":\"not\",\"value\":\"unrolled\"},{\"test\":\"actor_health\",\"subject\":\"self\",\"operator\":\">\",\"value\":0},{\"test\":\"has_component\",\"value\":\"minecraft:is_baby\"}]},\"add\":{\"component_groups\":[\"minecraft:baby_unrolled\"]}},{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"operator\":\"not\",\"value\":\"unrolled\"},{\"test\":\"actor_health\",\"subject\":\"self\",\"operator\":\">\",\"value\":0},{\"test\":\"has_component\",\"operator\":\"not\",\"value\":\"minecraft:is_baby\"}]},\"add\":{\"component_groups\":[\"minecraft:adult_unrolled\"]}}]},\"minecraft:roll_up\":{\"sequence\":[{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"operator\":\"not\",\"value\":\"rolled_up\"},{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"operator\":\"not\",\"value\":\"rolled_up_peeking\"},{\"test\":\"actor_health\",\"subject\":\"self\",\"operator\":\">\",\"value\":0}]},\"remove\":{\"component_groups\":[\"minecraft:unrolled\",\"minecraft:baby_unrolled\",\"minecraft:adult_unrolled\",\"minecraft:rolled_up_without_threats\"]},\"add\":{\"component_groups\":[\"minecraft:rolled_up\",\"minecraft:rolled_up_with_threats\"]},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up\"}},{\"filters\":{\"all_of\":[{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"unrolled\"},{\"test\":\"actor_health\",\"subject\":\"self\",\"operator\":\">\",\"value\":0}]},\"emit_vibration\":{\"vibration\":\"entity_act\"}}]},\"minecraft:start_peeking\":{\"sequence\":[{\"filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up\"},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up_peeking\"}}]},\"minecraft:stop_peeking\":{\"sequence\":[{\"filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up_peeking\"},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up\"}}]},\"minecraft:start_unrolling\":{\"sequence\":[{\"filters\":{\"test\":\"enum_property\",\"domain\":\"minecraft:armadillo_state\",\"value\":\"rolled_up_relaxing\"},\"set_property\":{\"minecraft:armadillo_state\":\"rolled_up_unrolling\"}}]}}}}'},6040:e=>{e.exports='{\"format_version\":\"1.16.210\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:armor_stand\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:type_family\":{\"family\":[\"armor_stand\",\"inanimate\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.5,\"height\":1.975},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:knockback_resistance\":{\"value\":1.0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/armor_stand.json\"},\"minecraft:nameable\":{},\"minecraft:persistent\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":false,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{}}}'},5727:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"attack_cooldown\":{\"minecraft:attack_cooldown\":{\"attack_cooldown_time\":120.0,\"attack_cooldown_complete_event\":{\"event\":\"attack_cooldown_complete_event\",\"target\":\"self\"}}},\"axolotl_lucy\":{\"minecraft:variant\":{\"value\":0}},\"axolotl_cyan\":{\"minecraft:variant\":{\"value\":1}},\"axolotl_gold\":{\"minecraft:variant\":{\"value\":2}},\"axolotl_wild\":{\"minecraft:variant\":{\"value\":3}},\"axolotl_blue\":{\"minecraft:variant\":{\"value\":4}},\"axolotl_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"tropical_fish_bucket\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.1}},\"axolotl_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:behavior.breed\":{\"priority\":1,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breed_items\":\"tropical_fish_bucket\",\"transform_to_item\":\"bucket\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"mutation_factor\":{\"variant\":0.00083}}},\"axolotl_in_water\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"in_water\",\"operator\":\"!=\",\"value\":true},\"event\":\"start_drying_out\"}]}},\"axolotl_dried\":{\"minecraft:damage_over_time\":{\"damage_per_hurt\":1,\"time_between_hurt\":0}},\"axolotl_on_land\":{\"minecraft:drying_out_timer\":{\"total_time\":300,\"water_bottle_refill_time\":90,\"dried_out_event\":{\"event\":\"dried_out\"},\"stopped_drying_out_event\":{\"event\":\"stop_drying_out\"},\"recover_after_dried_out_event\":{\"event\":\"recover_after_dried_out\"}}},\"axolotl_on_land_in_rain\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"!=\",\"value\":true},\"event\":\"start_drying_out\"},{\"filters\":{\"test\":\"in_water\",\"operator\":\"==\",\"value\":true},\"event\":\"enter_water\"}]}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:type_family\":{\"family\":[\"axolotl\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.75,\"height\":0.42},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true,\"breathes_air\":true,\"generates_bubbles\":false},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":14},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"lightning\",\"deals_damage\":true,\"damage_multiplier\":2000.0}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":true,\"can_sink\":false,\"avoid_damage_blocks\":true},\"minecraft:movement.amphibious\":{},\"minecraft:movement\":{\"value\":0.1},\"minecraft:underwater_movement\":{\"value\":0.2},\"minecraft:jump.static\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:attack\":{\"damage\":2},\"minecraft:combat_regeneration\":{},\"minecraft:behavior.play_dead\":{\"priority\":0,\"duration\":10,\"force_below_health\":8,\"random_start_chance\":0.33,\"random_damage_range\":[0,2],\"damage_sources\":[\"contact\",\"entity_attack\",\"entity_explosion\",\"magic\",\"projectile\",\"thorns\",\"wither\"],\"apply_regeneration\":true,\"filters\":{\"test\":\"in_water\",\"operator\":\"==\",\"value\":true}},\"minecraft:behavior.tempt\":{\"priority\":2,\"speed_multiplier\":1.1,\"can_tempt_vertically\":true,\"items\":[\"tropical_fish_bucket\"]},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"must_see\":true,\"reselect_targets\":true,\"within_radius\":20.0,\"must_see_forget_duration\":17.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"in_water\",\"subject\":\"other\",\"value\":true},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"},{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"squid\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fish\"}]}]},\"max_dist\":8},{\"filters\":{\"all_of\":[{\"test\":\"in_water\",\"subject\":\"other\",\"value\":true},{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"drowned\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"guardian\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"guardian_elder\"}]}]},\"max_dist\":8}]},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"on_kill\":{\"event\":\"killed_enemy_event\",\"target\":\"self\"}},\"minecraft:behavior.move_to_water\":{\"priority\":6,\"search_range\":16,\"search_height\":5,\"search_count\":1,\"goal_radius\":0.1},\"minecraft:behavior.swim_idle\":{\"priority\":7,\"idle_time\":5.0,\"success_rate\":0.05},\"minecraft:behavior.random_swim\":{\"priority\":8,\"interval\":0,\"xz_dist\":30,\"y_dist\":15},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"interval\":100},\"minecraft:behavior.look_at_player\":{\"priority\":10,\"target_distance\":6.0,\"probability\":0.02}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"add\":{\"component_groups\":[\"axolotl_adult\",\"axolotl_in_water\"]}},{\"randomize\":[{\"weight\":25,\"add\":{\"component_groups\":[\"axolotl_cyan\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"axolotl_gold\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"axolotl_lucy\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"axolotl_wild\"]}}]}]},\"attack_cooldown_complete_event\":{\"remove\":{\"component_groups\":[\"attack_cooldown\"]}},\"killed_enemy_event\":{\"add\":{\"component_groups\":[\"attack_cooldown\"]}},\"minecraft:entity_born\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"axolotl_adult\"]},\"add\":{\"component_groups\":[\"axolotl_baby\",\"axolotl_in_water\"]}},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"add\":{\"component_groups\":[\"axolotl_blue\"]}}]},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"axolotl_baby\"]},\"add\":{\"component_groups\":[\"axolotl_adult\"]}},\"stop_drying_out\":{\"remove\":{\"component_groups\":[\"axolotl_on_land\",\"axolotl_dried\"]},\"add\":{\"component_groups\":[\"axolotl_on_land_in_rain\"]}},\"start_drying_out\":{\"remove\":{\"component_groups\":[\"axolotl_on_land_in_rain\",\"axolotl_in_water\"]},\"add\":{\"component_groups\":[\"axolotl_on_land\"]}},\"dried_out\":{\"add\":{\"component_groups\":[\"axolotl_dried\"]}},\"recover_after_dried_out\":{\"remove\":{\"component_groups\":[\"axolotl_dried\"]}},\"enter_water\":{\"remove\":{\"component_groups\":[\"axolotl_on_land\",\"axolotl_on_land_in_rain\",\"axolotl_dried\"]},\"add\":{\"component_groups\":[\"axolotl_in_water\"]}}}}}'},203:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{},\"components\":{\"minecraft:type_family\":{\"family\":[\"bat\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.5,\"height\":0.9},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.1},\"minecraft:navigation.float\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.float_wander\":{\"xz_dist\":10,\"y_dist\":7,\"y_offset\":-2.0,\"random_reselect\":true,\"float_duration\":[0.1,0.35]},\"minecraft:can_fly\":{},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:nameable\":{},\"minecraft:physics\":{},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{}}}'},9868:e=>{e.exports='{\"format_version\":\"1.20.60\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier\",\"is_spawnable\":true,\"is_summonable\":true,\"properties\":{\"minecraft:has_nectar\":{\"type\":\"bool\",\"client_sync\":true,\"default\":\"query.had_component_group(\\'has_nectar\\')\"}}},\"component_groups\":{\"{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"minecraft:red_flower\",\"minecraft:yellow_flower\",\"minecraft:wither_rose\",\"minecraft:double_plant:0\",\"minecraft:double_plant:1\",\"minecraft:double_plant:4\",\"minecraft:double_plant:5\",\"minecraft:flowering_azalea\",\"minecraft:azalea_leaves_flowered\",\"minecraft:mangrove_propagule\",\"minecraft:pitcher_plant\",\"minecraft:torchflower\",\"minecraft:cherry_leaves\",\"minecraft:pink_petals\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":11,\"speed_multiplier\":1.1}},\"{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:behavior.breed\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"minecraft:red_flower\",\"minecraft:yellow_flower\",\"minecraft:wither_rose\",\"minecraft:double_plant:0\",\"minecraft:double_plant:1\",\"minecraft:double_plant:4\",\"minecraft:double_plant:5\",\"minecraft:flowering_azalea\",\"minecraft:azalea_leaves_flowered\",\"minecraft:mangrove_propagule\",\"minecraft:pitcher_plant\",\"minecraft:torchflower\",\"minecraft:cherry_leaves\",\"minecraft:pink_petals\"]}},\"track_attacker\":{\"minecraft:behavior.hurt_by_target\":{\"priority\":1}},\"angry_{name}\":{\"minecraft:angry\":{\"duration\":25,\"broadcastAnger\":true,\"broadcastRange\":20,\"broadcast_filters\":{\"test\":\"is_family\",\"operator\":\"!=\",\"value\":\"pacified\"},\"calm_event\":{\"event\":\"calmed_down\",\"target\":\"self\"}},\"minecraft:behavior.melee_box_attack\":{\"priority\":2,\"attack_once\":true,\"speed_multiplier\":1.4,\"on_attack\":{\"event\":\"countdown_to_perish_event\",\"target\":\"self\"}}},\"escape_fire\":{\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25,\"force\":true},\"minecraft:timer\":{\"looping\":false,\"time\":[20,50],\"randomInterval\":true,\"time_down_event\":{\"event\":\"stop_panicking_after_fire\",\"target\":\"self\"}}},\"countdown_to_perish\":{\"minecraft:mark_variant\":{\"value\":1},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25,\"force\":true},\"minecraft:timer\":{\"looping\":false,\"time\":[10,60],\"randomInterval\":true,\"time_down_event\":{\"event\":\"perish_event\",\"target\":\"self\"}},\"minecraft:type_family\":{\"family\":[\"bee\",\"mob\",\"arthropod\",\"pacified\"]}},\"perish\":{\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"cause\":\"none\",\"damage_per_tick\":999}]}},\"take_nearest_target\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":10}]},\"minecraft:timer\":{\"looping\":true,\"time\":5,\"time_down_event\":{\"event\":\"calmed_down\",\"target\":\"self\"}}},\"look_for_food\":{\"minecraft:behavior.move_to_block\":{\"priority\":10,\"tick_interval\":1,\"start_chance\":0.5,\"search_range\":6,\"search_height\":4,\"goal_radius\":1.0,\"stay_duration\":20.0,\"target_selection_method\":\"random\",\"target_offset\":[0,0.25,0],\"target_block_filters\":{\"test\":\"is_waterlogged\",\"subject\":\"block\",\"operator\":\"==\",\"value\":false},\"target_blocks\":[\"minecraft:red_flower\",\"minecraft:yellow_flower\",\"minecraft:wither_rose\",\"minecraft:double_plant:0\",\"minecraft:double_plant:1\",\"minecraft:double_plant:4\",\"minecraft:double_plant:5\",\"minecraft:flowering_azalea\",\"minecraft:azalea_leaves_flowered\",\"minecraft:mangrove_propagule\",\"minecraft:pitcher_plant\",\"minecraft:torchflower\",\"minecraft:cherry_leaves\",\"minecraft:pink_petals\"],\"on_stay_completed\":[{\"event\":\"collected_nectar\",\"target\":\"self\"}]},\"minecraft:timer\":{\"looping\":true,\"time\":180,\"time_down_event\":{\"event\":\"find_flower_timeout\"}},\"minecraft:ambient_sound_interval\":{\"event_name\":\"ambient.pollinate\",\"range\":3.0,\"value\":2.0}},\"has_nectar\":{\"minecraft:grows_crop\":{\"charges\":10,\"chance\":0.03}},\"return_to_home\":{\"minecraft:behavior.go_home\":{\"priority\":4,\"speed_multiplier\":1.0,\"interval\":1,\"goal_radius\":1.2,\"on_home\":[{\"filters\":{\"any_of\":[{\"test\":\"is_block\",\"subject\":\"block\",\"value\":\"minecraft:bee_nest\"},{\"test\":\"is_block\",\"subject\":\"block\",\"value\":\"minecraft:beehive\"}]},\"event\":\"minecraft:bee_returned_to_hive\",\"target\":\"block\"},{\"filters\":{\"all_of\":[{\"test\":\"is_block\",\"subject\":\"block\",\"operator\":\"!=\",\"value\":\"minecraft:bee_nest\"},{\"test\":\"is_block\",\"subject\":\"block\",\"operator\":\"!=\",\"value\":\"minecraft:beehive\"}]},\"event\":\"find_hive_event\",\"target\":\"self\"}],\"on_failed\":[{\"event\":\"find_hive_event\",\"target\":\"self\"}]}},\"find_hive\":{\"minecraft:behavior.move_to_block\":{\"priority\":10,\"search_range\":16,\"search_height\":10,\"tick_interval\":1,\"goal_radius\":0.633,\"target_blocks\":[\"bee_nest\",\"beehive\"],\"on_reach\":[{\"event\":\"minecraft:bee_returned_to_hive\",\"target\":\"block\"}]},\"minecraft:timer\":{\"looping\":false,\"time\":180,\"time_down_event\":{\"event\":\"find_hive_timeout\",\"target\":\"self\"}}},\"hive_full\":{\"minecraft:timer\":{\"looping\":false,\"time\":[5,20],\"randomInterval\":true,\"time_down_event\":{\"event\":\"find_hive_event\",\"target\":\"self\"}}},\"shelter_detection\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"event\":\"seek_shelter\",\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"weather\",\"operator\":\"==\",\"value\":\"precipitation\"}]},{\"test\":\"bool_property\",\"domain\":\"minecraft:has_nectar\",\"operator\":\"!=\"},{\"test\":\"has_biome_tag\",\"value\":\"overworld\"}]}}]}},\"abort_shelter_detection\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"event\":\"abort_sheltering\",\"filters\":{\"all_of\":[{\"test\":\"weather\",\"operator\":\"==\",\"value\":\"clear\"},{\"test\":\"is_daytime\",\"value\":true}]}}]}},\"easy_attack\":{\"minecraft:attack\":{\"damage\":2}},\"normal_attack\":{\"minecraft:attack\":{\"damage\":2,\"effect_name\":\"poison\",\"effect_duration\":10}},\"hard_attack\":{\"minecraft:attack\":{\"damage\":2,\"effect_name\":\"poison\",\"effect_duration\":18}},\"default_sound\":{\"minecraft:ambient_sound_interval\":{\"event_name\":\"ambient\",\"range\":0.0,\"value\":0.0}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.25,\"within_radius\":8,\"can_tempt_vertically\":true,\"items\":[\"minecraft:red_flower\",\"minecraft:yellow_flower\",\"minecraft:wither_rose\",\"minecraft:double_plant:0\",\"minecraft:double_plant:1\",\"minecraft:double_plant:4\",\"minecraft:double_plant:5\",\"minecraft:flowering_azalea\",\"minecraft:azalea_leaves_flowered\",\"minecraft:mangrove_propagule\",\"minecraft:pitcher_plant\",\"minecraft:torchflower\",\"minecraft:cherry_leaves\",\"minecraft:pink_petals\"]},\"minecraft:behavior.move_towards_home_restriction\":{\"priority\":9},\"minecraft:behavior.random_hover\":{\"priority\":12,\"xz_dist\":8,\"y_dist\":8,\"y_offset\":-1,\"interval\":1,\"hover_height\":[1,4]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.5},\"minecraft:behavior.float\":{\"priority\":19},\"minecraft:type_family\":{\"family\":[\"bee\",\"mob\",\"arthropod\"]},\"minecraft:on_target_acquired\":{\"event\":\"attacked\",\"target\":\"self\"},\"minecraft:breathable\":{\"totalSupply\":15,\"suffocateTime\":0},\"minecraft:collision_box\":{\"width\":0.55,\"height\":0.5},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:game_event_movement_tracking\":{\"emit_flap\":true},\"minecraft:home\":{\"restriction_radius\":22,\"home_block_list\":[\"minecraft:bee_nest\",\"minecraft:beehive\"]},\"minecraft:follow_range\":{\"value\":1024},\"minecraft:damage_sensor\":{\"triggers\":[{\"cause\":\"fall\",\"deals_damage\":false},{\"on_damage\":{\"filters\":{\"test\":\"is_block\",\"subject\":\"block\",\"value\":\"minecraft:sweet_berry_bush\"}},\"deals_damage\":false}]},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.3},\"minecraft:flying_speed\":{\"value\":0.15},\"minecraft:navigation.hover\":{\"can_path_over_water\":true,\"can_sink\":false,\"can_pass_doors\":false,\"can_path_from_air\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true,\"avoid_sun\":false},\"minecraft:movement.hover\":{},\"minecraft:jump.static\":{},\"minecraft:can_fly\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:nameable\":{},\"minecraft:block_sensor\":{\"sensor_radius\":16,\"sources\":[{\"test\":\"has_silk_touch\",\"subject\":\"other\",\"value\":false}],\"on_break\":[{\"block_list\":[\"minecraft:beehive\",\"minecraft:bee_nest\"],\"on_block_broken\":\"hive_destroyed\"}]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":95,\"add\":{\"component_groups\":[\"{name}_adult\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"{name}_baby\"]}}]},{\"add\":{\"component_groups\":[\"track_attacker\",\"shelter_detection\",\"look_for_food\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"{name}_baby\",\"shelter_detection\",\"track_attacker\",\"look_for_food\"]}},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"{name}_adult\",\"shelter_detection\",\"track_attacker\",\"look_for_food\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"{name}_baby\"]},\"add\":{\"component_groups\":[\"{name}_adult\"]}},\"minecraft:exited_disturbed_hive\":{\"add\":{\"component_groups\":[\"take_nearest_target\"]},\"remove\":{\"component_groups\":[\"find_hive\",\"return_to_home\",\"has_nectar\",\"abort_shelter_detection\",\"shelter_detection\",\"escape_fire\"]},\"set_property\":{\"minecraft:has_nectar\":false}},\"hive_destroyed\":{\"sequence\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"pacified\"},\"add\":{\"component_groups\":[\"take_nearest_target\"]},\"remove\":{\"component_groups\":[\"escape_fire\"]}}]},\"stop_panicking_after_fire\":{\"remove\":{\"component_groups\":[\"escape_fire\"]}},\"minecraft:exited_hive_on_fire\":{\"add\":{\"component_groups\":[\"escape_fire\"]}},\"minecraft:exited_hive\":{\"add\":{\"component_groups\":[\"look_for_food\",\"shelter_detection\"]},\"remove\":{\"component_groups\":[\"find_hive\",\"return_to_home\",\"has_nectar\",\"abort_shelter_detection\"]},\"set_property\":{\"minecraft:has_nectar\":false}},\"minecraft:hive_full\":{\"add\":{\"component_groups\":[\"hive_full\"]},\"remove\":{\"component_groups\":[\"find_hive\",\"return_to_home\"]}},\"attacked\":{\"sequence\":[{\"add\":{\"component_groups\":[\"angry_{name}\"]},\"remove\":{\"component_groups\":[\"take_nearest_target\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"easy\"},\"remove\":{\"component_groups\":[\"normal_attack\",\"hard_attack\"]},\"add\":{\"component_groups\":[\"easy_attack\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"normal\"},\"remove\":{\"component_groups\":[\"easy_attack\",\"hard_attack\"]},\"add\":{\"component_groups\":[\"normal_attack\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"hard\"},\"remove\":{\"component_groups\":[\"easy_attack\",\"normal_attack\"]},\"add\":{\"component_groups\":[\"hard_attack\"]}}]},\"calmed_down\":{\"add\":{\"component_groups\":[\"shelter_detection\",\"return_to_home\"]},\"remove\":{\"component_groups\":[\"angry_{name}\",\"take_nearest_target\"]}},\"collected_nectar\":{\"remove\":{\"component_groups\":[\"look_for_food\"]},\"add\":{\"component_groups\":[\"return_to_home\",\"has_nectar\",\"default_sound\"]},\"set_property\":{\"minecraft:has_nectar\":true}},\"find_hive_event\":{\"remove\":{\"component_groups\":[\"return_to_home\",\"hive_full\"]},\"add\":{\"component_groups\":[\"find_hive\"]}},\"find_hive_timeout\":{\"sequence\":[{\"filters\":{\"test\":\"bool_property\",\"operator\":\"!=\",\"domain\":\"minecraft:has_nectar\"},\"remove\":{\"component_groups\":[\"find_hive\",\"escape_fire\"]},\"add\":{\"component_groups\":[\"look_for_food\"]}},{\"filters\":{\"test\":\"bool_property\",\"domain\":\"minecraft:has_nectar\"},\"remove\":{\"component_groups\":[\"find_hive\"]},\"add\":{\"component_groups\":[\"return_to_home\"]}}]},\"find_flower_timeout\":{\"remove\":{\"component_groups\":[\"look_for_food\"]},\"add\":{\"component_groups\":[\"return_to_home\"]}},\"seek_shelter\":{\"remove\":{\"component_groups\":[\"look_for_food\",\"collect_nectar\",\"shelter_detection\"]},\"add\":{\"component_groups\":[\"default_sound\",\"return_to_home\",\"abort_shelter_detection\"]}},\"abort_sheltering\":{\"remove\":{\"component_groups\":[\"abort_shelter_detection\",\"return_to_home\",\"escape_fire\"]},\"add\":{\"component_groups\":[\"shelter_detection\",\"look_for_food\"]}},\"countdown_to_perish_event\":{\"remove\":{\"component_groups\":[\"collect_nectar\",\"track_attacker\",\"take_nearest_target\",\"look_for_food\",\"angry_{name}\",\"hive_full\",\"find_hive\",\"escape_fire\"]},\"add\":{\"component_groups\":[\"countdown_to_perish\"]}},\"perish_event\":{\"add\":{\"component_groups\":[\"perish\"]}}}}}'},6880:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"mode_switcher\":{\"minecraft:target_nearby_sensor\":{\"inside_range\":2.0,\"outside_range\":3.0,\"must_see\":true,\"on_inside_range\":{\"event\":\"switch_to_melee\",\"target\":\"self\"},\"on_outside_range\":{\"event\":\"switch_to_ranged\",\"target\":\"self\"}}},\"ranged_mode\":{\"minecraft:shooter\":{\"def\":\"minecraft:small_fireball\"},\"minecraft:behavior.ranged_attack\":{\"priority\":3,\"burst_shots\":3,\"burst_interval\":0.3,\"charge_charged_trigger\":0.0,\"charge_shoot_trigger\":4.0,\"attack_interval_min\":3.0,\"attack_interval_max\":5.0,\"attack_radius\":16.0}},\"melee_mode\":{\"minecraft:attack\":{\"damage\":6},\"minecraft:behavior.melee_attack\":{\"priority\":3}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 10 : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/blaze.json\"},\"minecraft:collision_box\":{\"width\":0.5,\"height\":1.8},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:movement\":{\"value\":0.23},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"==\",\"value\":true},\"cause\":\"drowning\",\"damage_per_tick\":1}]},\"minecraft:follow_range\":{\"value\":48,\"max\":48},\"minecraft:fire_immune\":{},\"minecraft:nameable\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":48.0}]},\"minecraft:behavior.random_stroll\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:behavior.random_look_around\":{\"priority\":5},\"minecraft:type_family\":{\"family\":[\"blaze\",\"monster\",\"mob\"]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:on_hurt\":{\"event\":\"minecraft:on_hurt_event\",\"target\":\"self\"},\"minecraft:on_hurt_by_player\":{\"event\":\"minecraft:on_hurt_event\",\"target\":\"self\"},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"mode_switcher\"]}},\"switch_to_melee\":{\"remove\":{\"component_groups\":[\"ranged_mode\"]},\"add\":{\"component_groups\":[\"melee_mode\"]}},\"switch_to_ranged\":{\"remove\":{\"component_groups\":[\"melee_mode\"]},\"add\":{\"component_groups\":[\"ranged_mode\"]}},\"minecraft:on_hurt_event\":{\"add\":{\"component_groups\":[\"mode_switcher\"]}}}}}'},2903:e=>{e.exports='{\"format_version\":\"1.21.30\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"spawn_category\":\"monster\",\"is_spawnable\":true,\"is_summonable\":true,\"properties\":{\"minecraft:is_playing_idle_ground_sound\":{\"type\":\"bool\",\"client_sync\":false,\"default\":false}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"breeze\",\"monster\",\"mob\"]},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":30,\"max\":30},\"minecraft:loot\":{\"table\":\"loot_tables/entities/breeze.json\"},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.77},\"minecraft:knockback_resistance\":{\"value\":0.0},\"minecraft:jump.static\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:persistent\":{},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? 10 : 0\"},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:movement\":{\"value\":0.4},\"minecraft:follow_range\":{\"value\":32.0},\"minecraft:navigation.walk\":{\"blocks_to_avoid\":[{\"tags\":\"query.any_tag(\\'trapdoors\\')\"}]},\"minecraft:movement.basic\":{},\"minecraft:can_climb\":{},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:damage_sensor\":{\"triggers\":[{\"cause\":\"fall\",\"deals_damage\":false},{\"on_damage\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"damager\",\"operator\":\"!=\",\"value\":\"wind_charge\"}},\"cause\":\"projectile\",\"deals_damage\":false}]},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"all_of\":[{\"test\":\"on_ground\",\"subject\":\"self\",\"value\":true},{\"test\":\"has_target\",\"subject\":\"self\",\"value\":true},{\"test\":\"bool_property\",\"operator\":\"==\",\"domain\":\"minecraft:is_playing_idle_ground_sound\"}]},\"event\":\"minecraft:stop_playing_idle_ground_sound\"},{\"filters\":{\"all_of\":[{\"test\":\"bool_property\",\"operator\":\"!=\",\"domain\":\"minecraft:is_playing_idle_ground_sound\"},{\"any_of\":[{\"test\":\"on_ground\",\"subject\":\"self\",\"value\":false},{\"test\":\"has_target\",\"subject\":\"self\",\"value\":false}]}]},\"event\":\"minecraft:start_playing_idle_ground_sound\"}]},\"minecraft:reflect_projectiles\":{\"reflected_projectiles\":[\"xp_bottle\",\"thrown_trident\",\"shulker_bullet\",\"dragon_fireball\",\"arrow\",\"snowball\",\"egg\",\"fireball\",\"splash_potion\",\"ender_pearl\",\"wither_skull\",\"wither_skull_dangerous\",\"small_fireball\",\"lingering_potion\",\"llama_spit\",\"fireworks_rocket\",\"fishing_hook\"],\"azimuth_angle\":\"180.0 + Math.random(-20.0, 20.0)\",\"reflection_scale\":\"0.5\"},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"within_radius\":24,\"scan_interval\":10,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":24},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},\"max_dist\":24}],\"must_see\":true},\"minecraft:behavior.fire_at_target\":{\"projectile_def\":\"minecraft:breeze_wind_charge_projectile\",\"priority\":2,\"filters\":{\"all_of\":[{\"test\":\"is_navigating\",\"value\":false}]},\"attack_range\":[0,16],\"attack_cooldown\":0.5,\"pre_shoot_delay\":0.75,\"post_shoot_delay\":0.2,\"ranged_fov\":90.0,\"owner_anchor\":2,\"owner_offset\":[0.0,0.3,0.0],\"target_anchor\":0,\"target_offset\":[0.0,0.5,0.0]},\"minecraft:behavior.move_around_target\":{\"priority\":3,\"destination_position_range\":[4.0,8.0],\"movement_speed\":1.2,\"destination_pos_spread_degrees\":360,\"filters\":{\"all_of\":[{\"test\":\"on_ground\",\"value\":true},{\"test\":\"target_distance\",\"subject\":\"self\",\"value\":24.0,\"operator\":\"<=\"}]}},\"minecraft:behavior.hurt_by_target\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"skeleton\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"stray\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"zombie\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"husk\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"spider\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"cavespider\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"slime\"}]}}]},\"minecraft:behavior.jump_around_target\":{\"priority\":5,\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"in_water\",\"value\":true},{\"test\":\"on_ground\",\"value\":true}]},{\"test\":\"is_riding\",\"value\":false},{\"test\":\"in_lava\",\"value\":false}]},\"jump_cooldown_duration\":0.5,\"jump_cooldown_when_hurt_duration\":0.1,\"last_hurt_duration\":2.0,\"prepare_jump_duration\":0.5,\"max_jump_velocity\":1.4,\"check_collision\":false,\"entity_bounding_box_scale\":0.7,\"line_of_sight_obstruction_height_ignore\":4,\"valid_distance_to_target\":[4.0,20.0],\"landing_position_spread_degrees\":90,\"landing_distance_from_target\":[4.0,8.0],\"required_vertical_space\":4,\"snap_to_surface_block_range\":10,\"jump_angles\":[40.0,55.0,60.0,75.0,80.0]},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":16},\"minecraft:behavior.random_look_around\":{\"priority\":8}},\"events\":{\"minecraft:start_playing_idle_ground_sound\":{\"add\":{\"component_groups\":[\"minecraft:playing_idle_ground_sound\"]},\"set_property\":{\"minecraft:is_playing_idle_ground_sound\":true}},\"minecraft:stop_playing_idle_ground_sound\":{\"remove\":{\"component_groups\":[\"minecraft:playing_idle_ground_sound\"]},\"set_property\":{\"minecraft:is_playing_idle_ground_sound\":false}}}}}'},6010:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:camel_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:input_ground_controlled\":{},\"minecraft:dash\":{\"cooldown_time\":2.75,\"horizontal_momentum\":20.0,\"vertical_momentum\":0.6},\"minecraft:behavior.player_ride_tamed\":{}},\"minecraft:camel_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.45},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"cactus\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":2.5}},\"minecraft:camel_adult\":{\"minecraft:inventory\":{\"container_type\":\"horse\"},\"minecraft:equippable\":{\"slots\":[{\"slot\":0,\"item\":\"saddle\",\"accepted_items\":[\"saddle\"],\"on_equip\":{\"event\":\"minecraft:camel_saddled\"},\"on_unequip\":{\"event\":\"minecraft:camel_unsaddled\"}}]},\"minecraft:interact\":{\"interactions\":[{\"play_sounds\":\"saddle\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"self\",\"domain\":\"inventory\",\"operator\":\"not\",\"value\":\"saddle\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"saddle\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_sneak_held\",\"subject\":\"other\",\"value\":false}]},\"target\":\"self\"},\"equip_item_slot\":0,\"interact_text\":\"action.interact.saddle\"}]},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":[{\"mate_type\":\"minecraft:camel\",\"baby_type\":\"minecraft:camel\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}],\"breed_items\":[\"cactus\"]},\"minecraft:rideable\":{\"seat_count\":2,\"crouching_skip_interact\":true,\"pull_in_entities\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.horse\",\"seats\":[{\"min_rider_count\":0,\"max_rider_count\":2,\"position\":[0.0,1.905,0.5]},{\"min_rider_count\":1,\"max_rider_count\":2,\"position\":[0.0,1.905,-0.5]}]}},\"minecraft:camel_standing\":{\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:collision_box\":{\"width\":1.7,\"height\":2.375}},\"minecraft:camel_sitting\":{\"minecraft:pushable\":{\"is_pushable\":false,\"is_pushable_by_piston\":true},\"minecraft:collision_box\":{\"width\":1.7,\"height\":0.945}}},\"components\":{\"minecraft:is_tamed\":{},\"minecraft:healable\":{\"items\":[{\"item\":\"cactus\",\"heal_amount\":2}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:type_family\":{\"family\":[\"camel\",\"mob\"]},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":32},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:movement\":{\"value\":0.09},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:physics\":{},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:behavior.float\":{\"priority\":0,\"sink_with_passengers\":true},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":4},\"minecraft:behavior.tempt\":{\"priority\":3,\"speed_multiplier\":2.5,\"can_tempt_vertically\":true,\"items\":[\"cactus\"]},\"minecraft:behavior.random_look_around_and_sit\":{\"priority\":4,\"continue_if_leashed\":true,\"continue_sitting_on_reload\":true,\"min_look_count\":2,\"max_look_count\":5,\"min_look_time\":80,\"max_look_time\":100,\"min_angle_of_view_horizontal\":-30,\"max_angle_of_view_horizontal\":30,\"random_look_around_cooldown\":5,\"probability\":0.001},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":2},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:variable_max_auto_step\":{\"base_value\":1.5625,\"controlled_value\":1.5625,\"jump_prevented_value\":0.5625}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"trigger\":\"minecraft:entity_born\"}]},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:camel_adult\",\"minecraft:camel_standing\"]}},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:camel_baby\",\"minecraft:camel_standing\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:camel_baby\"]},\"add\":{\"component_groups\":[\"minecraft:camel_adult\"]}},\"minecraft:camel_saddled\":{\"add\":{\"component_groups\":[\"minecraft:camel_saddled\"]}},\"minecraft:camel_unsaddled\":{\"remove\":{\"component_groups\":[\"minecraft:camel_saddled\"]}},\"minecraft:start_sitting\":{\"add\":{\"component_groups\":[\"minecraft:camel_sitting\"]},\"remove\":{\"component_groups\":[\"minecraft:camel_standing\"]}},\"minecraft:stop_sitting\":{\"add\":{\"component_groups\":[\"minecraft:camel_standing\"]},\"remove\":{\"component_groups\":[\"minecraft:camel_sitting\"]}}}}}'},7508:e=>{e.exports='{\"format_version\":\"1.16.100\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:cat\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.4},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"fish\",\"salmon\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"minecraft:{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/cat.json\"},\"minecraft:scale\":{\"value\":0.8},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":true,\"require_full_health\":true,\"allow_sitting\":true,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"fish\",\"salmon\"]}},\"minecraft:cat_wild\":{\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:tameable\":{\"probability\":0.33,\"tame_items\":[\"fish\",\"salmon\"],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.35,0.0]}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"reselect_targets\":true,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"rabbit\"},\"max_dist\":8},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":8}]},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":0.5,\"within_radius\":16,\"can_get_scared\":true,\"items\":[\"fish\",\"salmon\"]},\"minecraft:behavior.avoid_mob_type\":{\"priority\":6,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":10,\"walk_speed_multiplier\":0.8,\"sprint_speed_multiplier\":1.33}]},\"minecraft:behavior.move_towards_dwelling_restriction\":{\"priority\":7}},\"minecraft:cat_tame\":{\"minecraft:is_tamed\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:color\":{\"value\":14},\"minecraft:sittable\":{},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":0.5,\"within_radius\":16,\"items\":[\"fish\",\"salmon\"]},\"minecraft:is_dyeable\":{\"interact_text\":\"action.interact.dye\"},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:behavior.follow_owner\":{\"priority\":4,\"speed_multiplier\":1.0,\"start_distance\":10,\"stop_distance\":2},\"minecraft:behavior.stay_while_sitting\":{\"priority\":3},\"minecraft:behavior.ocelot_sit_on_block\":{\"priority\":7,\"speed_multiplier\":1.0},\"minecraft:behavior.pet_sleep_with_owner\":{\"priority\":2,\"speed_multiplier\":1.2,\"search_radius\":10,\"search_height\":10,\"goal_radius\":1.0},\"minecraft:on_wake_with_owner\":{\"event\":\"minecraft:pet_slept_with_owner\",\"target\":\"self\"}},\"minecraft:cat_gift_for_owner\":{\"minecraft:behavior.drop_item_for\":{\"priority\":1,\"seconds_before_pickup\":0.0,\"cooldown\":0.25,\"drop_item_chance\":0.7,\"offering_distance\":5.0,\"minimum_teleport_distance\":2.0,\"max_head_look_at_height\":10.0,\"target_range\":[5.0,5.0,5.0],\"teleport_offset\":[0.0,1.0,0.0],\"time_of_day_range\":[0.74999,0.80],\"speed_multiplier\":1.0,\"search_range\":5,\"search_height\":2,\"search_count\":0,\"goal_radius\":1.0,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":6}],\"loot_table\":\"loot_tables/entities/cat_gift.json\",\"on_drop_attempt\":{\"event\":\"minecraft:cat_gifted_owner\",\"target\":\"self\"}}},\"minecraft:{name}_white\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:{name}_tuxedo\":{\"minecraft:variant\":{\"value\":1}},\"minecraft:{name}_red\":{\"minecraft:variant\":{\"value\":2}},\"minecraft:{name}_siamese\":{\"minecraft:variant\":{\"value\":3}},\"minecraft:{name}_british\":{\"minecraft:variant\":{\"value\":4}},\"minecraft:{name}_calico\":{\"minecraft:variant\":{\"value\":5}},\"minecraft:{name}_persian\":{\"minecraft:variant\":{\"value\":6}},\"minecraft:{name}_ragdoll\":{\"minecraft:variant\":{\"value\":7}},\"minecraft:{name}_tabby\":{\"minecraft:variant\":{\"value\":8}},\"minecraft:{name}_black\":{\"minecraft:variant\":{\"value\":9}},\"minecraft:{name}_jellie\":{\"minecraft:variant\":{\"value\":10}}},\"components\":{\"minecraft:attack_damage\":{\"value\":4},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"cat\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.7},\"minecraft:healable\":{\"items\":[{\"item\":\"fish\",\"heal_amount\":2},{\"item\":\"salmon\",\"heal_amount\":2}]},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.walk\":{\"can_float\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"passive\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":true,\"first_founding_reward\":0},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.mount_pathing\":{\"priority\":1,\"speed_multiplier\":1.25,\"target_dist\":0,\"track_target\":true},\"minecraft:behavior.leap_at_target\":{\"priority\":3,\"target_dist\":0.3},\"minecraft:behavior.ocelotattack\":{\"priority\":4,\"cooldown_time\":1.0,\"x_max_rotation\":30.0,\"y_max_head_rotation\":30.0,\"max_distance\":15.0,\"max_sneak_range\":15.0,\"max_sprint_range\":4.0,\"reach_multiplier\":2.0,\"sneak_speed_multiplier\":0.6,\"sprint_speed_multiplier\":1.33,\"walk_speed_multiplier\":0.8},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":3,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_wild\"]}},{\"weight\":1,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_baby\",\"minecraft:{name}_wild\"]}}]},{\"randomize\":[{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_white\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_tuxedo\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_red\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_siamese\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_british\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_calico\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_persian\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_ragdoll\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_tabby\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_black\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_jellie\"]}}]}]},\"minecraft:spawn_from_village\":{\"sequence\":[{\"randomize\":[{\"weight\":3,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_wild\"]}},{\"weight\":1,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_baby\",\"minecraft:{name}_wild\"]}}]},{\"randomize\":[{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_tuxedo\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_red\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_siamese\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_white\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_british\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_calico\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_persian\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_ragdoll\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_tabby\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"minecraft:{name}_jellie\"]}}]}]},\"minecraft:spawn_midnight_{name}\":{\"sequence\":[{\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_wild\",\"minecraft:{name}_black\"]}}]},\"minecraft:entity_born\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_baby\",\"minecraft:{name}_tame\"]}}]},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_baby\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}},\"minecraft:on_tame\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:{name}_wild\"]}},{\"add\":{\"component_groups\":[\"minecraft:{name}_tame\"]}}]},\"minecraft:pet_slept_with_owner\":{\"add\":{\"component_groups\":[\"minecraft:cat_gift_for_owner\"]}},\"minecraft:cat_gifted_owner\":{\"remove\":{\"component_groups\":[\"minecraft:cat_gift_for_owner\"]}}}}}'},9407:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:spider_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.3,-0.1]}}},\"minecraft:spider_stray_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton.stray\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.3,-0.1]}}},\"minecraft:spider_wither_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton.wither\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.25,-0.1]}}},\"minecraft:spider_neutral\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_brightness\",\"operator\":\"<\",\"value\":0.49},\"event\":\"minecraft:become_hostile\"}},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\"}},\"minecraft:spider_hostile\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_brightness\",\"operator\":\">\",\"value\":0.49},\"event\":\"minecraft:become_neutral\"}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"attack_interval\":5,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":16}]},\"minecraft:behavior.leap_at_target\":{\"priority\":4,\"yd\":0.4,\"must_be_on_ground\":false},\"minecraft:behavior.melee_attack\":{\"priority\":3,\"track_target\":true,\"random_stop_interval\":100,\"reach_multiplier\":0.8}},\"minecraft:spider_angry\":{\"minecraft:angry\":{\"duration\":10,\"duration_delta\":3,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"attack_interval\":10,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":16}]},\"minecraft:behavior.leap_at_target\":{\"priority\":4,\"yd\":0.4,\"must_be_on_ground\":false},\"minecraft:behavior.melee_attack\":{\"priority\":3,\"track_target\":true,\"reach_multiplier\":1.4}},\"minecraft:spider_poison_easy\":{\"minecraft:attack\":{\"damage\":2,\"effect_name\":\"poison\",\"effect_duration\":0}},\"minecraft:spider_poison_normal\":{\"minecraft:attack\":{\"damage\":2,\"effect_name\":\"poison\",\"effect_duration\":7}},\"minecraft:spider_poison_hard\":{\"minecraft:attack\":{\"damage\":2,\"effect_name\":\"poison\",\"effect_duration\":15}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"cavespider\",\"monster\",\"arthropod\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/spider.json\"},\"minecraft:collision_box\":{\"width\":0.7,\"height\":0.5},\"minecraft:health\":{\"value\":12,\"max\":12},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.climb\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":1},\"minecraft:behavior.mount_pathing\":{\"priority\":5,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":7},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.3,0.0]}},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":1,\"randomize\":[{\"weight\":80,\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"is_snow_covered\",\"value\":true},{\"test\":\"is_underground\",\"value\":false}]},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_stray_jockey\",\"minecraft:spider_neutral\"]}},{\"weight\":80,\"filters\":{\"test\":\"is_biome\",\"value\":\"the_nether\"},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_wither_jockey\",\"minecraft:spider_neutral\"]}},{\"weight\":20,\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"is_underground\",\"value\":true}]},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_jockey\",\"minecraft:spider_neutral\"]}}]},{\"weight\":99,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_neutral\"]}}]},\"minecraft:become_hostile\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:spider_neutral\"]},\"add\":{\"component_groups\":[\"minecraft:spider_hostile\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"easy\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_hard\",\"minecraft:spider_poison_normal\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_easy\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"normal\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_easy\",\"minecraft:spider_poison_hard\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_normal\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"hard\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_easy\",\"minecraft:spider_poison_normal\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_hard\"]}}]},\"minecraft:become_neutral\":{\"remove\":{\"component_groups\":[\"minecraft:spider_hostile\"]},\"add\":{\"component_groups\":[\"minecraft:spider_neutral\"]}},\"minecraft:become_angry\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:spider_neutral\"]},\"add\":{\"component_groups\":[\"minecraft:spider_angry\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"easy\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_hard\",\"minecraft:spider_poison_normal\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_easy\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"normal\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_easy\",\"minecraft:spider_poison_hard\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_normal\"]}},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"hard\"},\"remove\":{\"component_groups\":[\"minecraft:spider_poison_easy\",\"minecraft:spider_poison_normal\"]},\"add\":{\"component_groups\":[\"minecraft:spider_poison_hard\"]}}]},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:spider_angry\"]},\"add\":{\"component_groups\":[\"minecraft:spider_neutral\"]}}}}}'},6207:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:chicken\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"wheat_seeds\",\"beetroot_seeds\",\"melon_seeds\",\"pumpkin_seeds\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.1}},\"minecraft:{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/chicken.json\"},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"wheat_seeds\",\"beetroot_seeds\",\"melon_seeds\",\"pumpkin_seeds\"]},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.4,0.0]}},\"minecraft:spawn_entity\":{\"entities\":{\"min_wait_time\":300,\"max_wait_time\":600,\"spawn_sound\":\"plop\",\"spawn_item\":\"egg\",\"filters\":{\"test\":\"rider_count\",\"subject\":\"self\",\"operator\":\"==\",\"value\":0}}}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"chicken\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.8},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":4,\"max\":4},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.5},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.5},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.0,\"items\":[\"wheat_seeds\",\"beetroot_seeds\",\"melon_seeds\",\"pumpkin_seeds\"]},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"from_egg\":{\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}},\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}}]},\"minecraft:entity_born\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_baby\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}}}}}'},662:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:cod\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:type_family\":{\"family\":[\"cod\",\"fish\"]},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.3},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/fish.json\"},\"minecraft:scale\":{\"value\":1.0},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":false,\"breathes_water\":true},\"minecraft:movement\":{\"value\":0.1},\"minecraft:underwater_movement\":{\"value\":0.1},\"minecraft:navigation.generic\":{\"is_amphibious\":false,\"can_path_over_water\":false,\"can_swim\":true,\"can_walk\":false,\"can_breach\":false,\"can_sink\":false},\"minecraft:physics\":{\"has_gravity\":false},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:movement.sway\":{\"sway_amplitude\":0.0},\"minecraft:despawn\":{\"despawn_from_distance\":{\"min_distance\":32,\"max_distance\":40}},\"minecraft:behavior.swim_idle\":{\"priority\":5,\"idle_time\":5.0,\"success_rate\":0.1},\"minecraft:behavior.random_swim\":{\"priority\":3,\"speed_multiplier\":1.0,\"xz_dist\":16,\"y_dist\":4,\"interval\":0},\"minecraft:behavior.swim_wander\":{\"priority\":4,\"interval\":0.1,\"look_ahead\":2.0,\"speed_multiplier\":1.0,\"wander_time\":5.0},\"minecraft:behavior.avoid_mob_type\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":6,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":2.0}]},\"minecraft:flocking\":{\"in_water\":true,\"match_variants\":false,\"use_center_of_mass\":true,\"low_flock_limit\":4,\"high_flock_limit\":8,\"goal_weight\":2.0,\"loner_chance\":0.1,\"influence_radius\":3.0,\"breach_influence\":7.0,\"separation_weight\":1.75,\"separation_threshold\":0.95,\"cohesion_weight\":2.0,\"cohesion_threshold\":1.95,\"innner_cohesion_threshold\":1.25,\"min_height\":1.5,\"max_height\":6.0,\"block_distance\":2.0,\"block_weight\":0.85},\"minecraft:nameable\":{},\"minecraft:conditional_bandwidth_optimization\":{}}}}'},247:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"wheat\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"minecraft:{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/cow.json\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breed_items\":\"wheat\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"bucket:0\"}]}},\"use_item\":true,\"transform_to_item\":\"bucket:1\",\"play_sounds\":\"milk\",\"interact_text\":\"action.interact.milk\"}]}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"cow\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.3},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.25,\"items\":[\"wheat\"]},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.1},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.105,0.0]}},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}},\"minecraft:entity_transformed\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_baby\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}}}}}'},2710:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:creeper\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:exploding\":{\"minecraft:explode\":{\"fuse_length\":1.5,\"fuse_lit\":true,\"power\":3,\"causes_fire\":false,\"destroy_affected_by_griefing\":true}},\"minecraft:charged_{name}\":{\"minecraft:is_charged\":{}},\"minecraft:charged_exploding\":{\"minecraft:explode\":{\"fuse_length\":1.5,\"fuse_lit\":true,\"power\":6,\"causes_fire\":false,\"destroy_affected_by_griefing\":true}},\"minecraft:forced_exploding\":{\"minecraft:target_nearby_sensor\":{},\"minecraft:explode\":{\"fuse_length\":1.5,\"fuse_lit\":true,\"power\":3,\"causes_fire\":false,\"destroy_affected_by_griefing\":true},\"minecraft:on_target_escape\":{}},\"minecraft:forced_charged_exploding\":{\"minecraft:target_nearby_sensor\":{},\"minecraft:explode\":{\"fuse_length\":1.5,\"fuse_lit\":true,\"power\":6,\"causes_fire\":false,\"destroy_affected_by_griefing\":true},\"minecraft:on_target_escape\":{}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"creeper\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.8},\"minecraft:movement\":{\"value\":0.2},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/creeper.json\"},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack\":{\"damage\":3},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"lightning\"},\"event\":\"minecraft:become_charged\"},\"deals_damage\":false}},\"minecraft:target_nearby_sensor\":{\"inside_range\":2.5,\"outside_range\":6.0,\"must_see\":true,\"on_inside_range\":{\"event\":\"minecraft:start_exploding\",\"target\":\"self\"},\"on_outside_range\":{\"event\":\"minecraft:stop_exploding\",\"target\":\"self\"},\"on_vision_lost_inside_range\":{\"event\":\"minecraft:stop_exploding\",\"target\":\"self\"}},\"minecraft:interact\":{\"interactions\":{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"flint_and_steel\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:explode\"}]},\"event\":\"minecraft:start_exploding_forced\",\"target\":\"self\"},\"hurt_item\":1,\"swing\":true,\"play_sounds\":\"ignite\",\"interact_text\":\"action.interact.creeper\"}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.swell\":{\"start_distance\":2.5,\"stop_distance\":6.0,\"priority\":2},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1.25,\"track_target\":false,\"reach_multiplier\":0.0},\"minecraft:behavior.avoid_mob_type\":{\"priority\":3,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"ocelot\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cat\"}]},\"max_dist\":6,\"sprint_speed_multiplier\":1.2}]},\"minecraft:behavior.random_stroll\":{\"priority\":5,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":6,\"look_distance\":8},\"minecraft:behavior.random_look_around\":{\"priority\":6},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"must_see\":true,\"must_see_forget_duration\":3.0,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16}]},\"minecraft:behavior.hurt_by_target\":{\"priority\":2},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:on_target_escape\":{\"event\":\"minecraft:stop_exploding\",\"target\":\"self\"},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:start_exploding_forced\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_charged\"},\"add\":{\"component_groups\":[\"minecraft:forced_exploding\"]}},{\"filters\":{\"test\":\"has_component\",\"value\":\"minecraft:is_charged\"},\"add\":{\"component_groups\":[\"minecraft:forced_charged_exploding\"]}}]},\"minecraft:start_exploding\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_charged\"},\"add\":{\"component_groups\":[\"minecraft:exploding\"]}},{\"filters\":{\"test\":\"has_component\",\"value\":\"minecraft:is_charged\"},\"add\":{\"component_groups\":[\"minecraft:charged_exploding\"]}}]},\"minecraft:stop_exploding\":{\"remove\":{\"component_groups\":[\"minecraft:exploding\"]}},\"minecraft:become_charged\":{\"remove\":{\"component_groups\":[\"minecraft:exploding\"]},\"add\":{\"component_groups\":[\"minecraft:charged_{name}\"]}}}}}'},3084:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:dolphin\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"{name}_adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/dolphin.json\"},\"minecraft:bribeable\":{\"bribe_items\":[\"fish\",\"salmon\"]},\"minecraft:behavior.melee_attack\":{\"priority\":2,\"track_target\":true}},\"dolphin_{name}\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.65},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"fish\",\"salmon\"],\"grow_up\":{\"event\":\"ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":4,\"speed_multiplier\":1.1},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25}},\"dolphin_angry\":{\"minecraft:angry\":{\"duration\":25,\"broadcast_anger\":true,\"broadcast_range\":16,\"calm_event\":{\"event\":\"on_calm\",\"target\":\"self\"}},\"minecraft:on_target_acquired\":{}},\"dolphin_dried\":{\"minecraft:damage_over_time\":{\"damage_per_hurt\":1,\"time_between_hurt\":0}},\"dolphin_swimming_navigation\":{\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_swim\":true,\"can_walk\":false,\"can_breach\":true,\"can_sink\":false},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"all_of\":[{\"test\":\"on_ground\",\"operator\":\"==\",\"value\":true},{\"test\":\"in_water\",\"operator\":\"!=\",\"value\":true}]},\"event\":\"navigation_on_land\"}]}},\"dolphin_on_land\":{\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":true,\"can_breach\":false,\"can_jump\":false},\"minecraft:timer\":{\"looping\":false,\"time\":120,\"time_down_event\":{\"event\":\"dried_out\"}},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"==\",\"value\":true},\"event\":\"stop_dryingout\"}]}},\"dolphin_on_land_in_rain\":{\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":true,\"can_breach\":false,\"can_jump\":false},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"in_water\",\"operator\":\"==\",\"value\":true},\"event\":\"navigation_off_land\"},{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"!=\",\"value\":true},\"event\":\"start_dryingout\"}]}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"dolphin\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.9,\"height\":0.6},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:follow_range\":{\"value\":48,\"max\":48},\"minecraft:breathable\":{\"total_supply\":240,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":false,\"generates_bubbles\":false},\"minecraft:attack\":{\"damage\":3},\"minecraft:movement\":{\"value\":0.1},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":false,\"can_breach\":true,\"can_sink\":false},\"minecraft:underwater_movement\":{\"value\":0.15},\"minecraft:jump.static\":{\"jump_power\":0.6},\"minecraft:can_climb\":{},\"minecraft:behavior.swim_with_entity\":{\"priority\":4,\"success_rate\":0.1,\"chance_to_stop\":0.0333,\"state_check_interval\":0.5,\"catch_up_threshold\":12.0,\"match_direction_threshold\":2.0,\"catch_up_multiplier\":2.5,\"speed_multiplier\":1.5,\"search_range\":20.0,\"stop_distance\":5.0,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.random_swim\":{\"priority\":5,\"interval\":0,\"xz_dist\":20},\"minecraft:behavior.random_breach\":{\"priority\":6,\"interval\":50,\"xz_dist\":6,\"cooldown_time\":2.0},\"minecraft:behavior.random_look_around\":{\"priority\":7},\"minecraft:behavior.avoid_mob_type\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"guardian_elder\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"guardian\"}]},\"max_dist\":8,\"walk_speed_multiplier\":1.0,\"sprint_speed_multiplier\":1.0}],\"probability_per_strength\":0.14},\"minecraft:behavior.find_underwater_treasure\":{\"priority\":2,\"speed_multiplier\":2.0,\"search_range\":30,\"stop_distance\":50},\"minecraft:behavior.move_to_water\":{\"priority\":1,\"search_range\":15,\"search_height\":5},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:flocking\":{\"in_water\":false,\"match_variants\":false,\"use_center_of_mass\":false,\"low_flock_limit\":4,\"high_flock_limit\":8,\"goal_weight\":2.0,\"loner_chance\":0.1,\"influence_radius\":6.0,\"breach_influence\":0.0,\"separation_weight\":1.75,\"separation_threshold\":3.0,\"cohesion_weight\":1.85,\"cohesion_threshold\":6.5,\"innner_cohesion_threshold\":3.5,\"min_height\":4.0,\"max_height\":4.0,\"block_distance\":1.0,\"block_weight\":0.0},\"minecraft:on_target_acquired\":{\"event\":\"become_angry\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"target\":\"self\"},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":90,\"add\":{\"component_groups\":[\"{name}_adult\",\"dolphin_swimming_navigation\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"dolphin_{name}\",\"dolphin_swimming_navigation\"]}}]},\"ageable_grow_up\":{\"remove\":{\"component_groups\":[\"dolphin_{name}\"]},\"add\":{\"component_groups\":[\"{name}_adult\"]}},\"become_angry\":{\"add\":{\"component_groups\":[\"dolphin_angry\"]}},\"on_calm\":{\"remove\":{\"component_groups\":[\"dolphin_angry\"]}},\"stop_dryingout\":{\"remove\":{\"component_groups\":[\"dolphin_on_land\",\"dolphin_dried\"]},\"add\":{\"component_groups\":[\"dolphin_on_land_in_rain\"]}},\"start_dryingout\":{\"remove\":{\"component_groups\":[\"dolphin_on_land_in_rain\"]},\"add\":{\"component_groups\":[\"dolphin_on_land\"]}},\"dried_out\":{\"add\":{\"component_groups\":[\"dolphin_dried\"]}},\"navigation_on_land\":{\"add\":{\"component_groups\":[\"dolphin_on_land\"]},\"remove\":{\"component_groups\":[\"dolphin_swimming_navigation\"]}},\"navigation_off_land\":{\"add\":{\"component_groups\":[\"dolphin_swimming_navigation\"]},\"remove\":{\"component_groups\":[\"dolphin_on_land_in_rain\",\"dolphin_on_land\",\"dolphin_dried\"]}}}}}'},6428:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale_by_age\":{\"start_scale\":0.5,\"end_scale\":1.0},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[{\"item\":\"wheat\",\"growth\":0.016667},{\"item\":\"sugar\",\"growth\":0.025},{\"item\":\"hay_block\",\"growth\":0.15},{\"item\":\"apple\",\"growth\":0.05},{\"item\":\"golden_carrot\",\"growth\":0.05},{\"item\":\"golden_apple\",\"growth\":0.2},{\"item\":\"appleEnchanted\",\"growth\":0.2}],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":4,\"speed_multiplier\":1.0}},\"minecraft:{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/horse.json\"},\"minecraft:behavior.run_around_like_crazy\":{\"priority\":1,\"speed_multiplier\":1.2},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0}},\"minecraft:{name}_wild\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"player\",\"zombie\"],\"interact_text\":\"action.interact.mount\",\"seats\":{\"position\":[0.0,0.925,-0.2]}},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:tamemount\":{\"min_temper\":0,\"max_temper\":100,\"feed_text\":\"action.interact.feed\",\"ride_text\":\"action.interact.mount\",\"feed_items\":[{\"item\":\"wheat\",\"temper_mod\":3},{\"item\":\"sugar\",\"temper_mod\":3},{\"item\":\"apple\",\"temper_mod\":3},{\"item\":\"golden_carrot\",\"temper_mod\":5},{\"item\":\"golden_apple\",\"temper_mod\":10},{\"item\":\"appleEnchanted\",\"temper_mod\":10}],\"auto_reject_items\":[{\"item\":\"horsearmorleather\"},{\"item\":\"horsearmoriron\"},{\"item\":\"horsearmorgold\"},{\"item\":\"horsearmordiamond\"},{\"item\":\"saddle\"}],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}}},\"minecraft:{name}_tamed\":{\"minecraft:is_tamed\":{},\"minecraft:equippable\":{\"slots\":[{\"slot\":0,\"item\":\"saddle\",\"accepted_items\":[\"saddle\"],\"on_equip\":{\"event\":\"minecraft:{name}_saddled\"},\"on_unequip\":{\"event\":\"minecraft:{name}_unsaddled\"}}]},\"minecraft:rideable\":{\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.horse\",\"seats\":{\"position\":[0.0,0.925,-0.2]}},\"minecraft:behavior.player_ride_tamed\":{},\"minecraft:inventory\":{\"inventory_size\":16,\"container_type\":\"horse\"},\"minecraft:breedable\":{\"require_tame\":true,\"inherit_tamed\":false,\"breeds_with\":[{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}],\"breed_items\":[\"golden_carrot\",\"golden_apple\",\"appleEnchanted\"]},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.2,\"items\":[\"apple\",\"carrot\",\"golden_apple\",\"appleEnchanted\",\"golden_carrot\",\"carrotOnAStick\",\"hay_block\",\"sugar\",\"bread\",\"wheat\"]}},\"minecraft:{name}_unchested\":{\"minecraft:interact\":{\"interactions\":[{\"play_sounds\":\"armor.equip_generic\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"chest\"}]},\"event\":\"minecraft:on_chest\",\"target\":\"self\"},\"use_item\":true,\"interact_text\":\"action.interact.attachchest\"}]}},\"minecraft:{name}_chested\":{\"minecraft:is_chested\":{}},\"minecraft:{name}_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:input_ground_controlled\":{},\"minecraft:can_power_jump\":{}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"donkey\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":1.4,\"height\":1.6},\"minecraft:health\":{\"value\":{\"range_min\":15,\"range_max\":30}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.175},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:nameable\":{},\"minecraft:horse.jump_strength\":{\"value\":0.5},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:healable\":{\"items\":[{\"item\":\"wheat\",\"heal_amount\":2},{\"item\":\"sugar\",\"heal_amount\":1},{\"item\":\"hay_block\",\"heal_amount\":20},{\"item\":\"apple\",\"heal_amount\":3},{\"item\":\"golden_carrot\",\"heal_amount\":4},{\"item\":\"golden_apple\",\"heal_amount\":10},{\"item\":\"appleEnchanted\",\"heal_amount\":10}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.2},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.7},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":80,\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:{name}_baby\"]}},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_wild\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_tamed\",\"minecraft:{name}_unchested\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_baby\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_wild\"]}},\"minecraft:on_chest\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_unchested\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_chested\"]}},\"minecraft:{name}_saddled\":{\"add\":{\"component_groups\":[\"minecraft:{name}_saddled\"]}},\"minecraft:{name}_unsaddled\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_saddled\"]}}}}}'},5491:e=>{e.exports='{\"format_version\":\"1.16.210\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:baby_{name}\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:movement\":{\"value\":0.25},\"minecraft:underwater_movement\":{\"value\":0.08}},\"minecraft:adult_{name}\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/drowned.json\"}},\"minecraft:mode_switcher\":{\"minecraft:target_nearby_sensor\":{\"inside_range\":3.0,\"outside_range\":5.0,\"on_inside_range\":{\"event\":\"minecraft:switch_to_melee\",\"target\":\"self\"},\"on_outside_range\":{\"event\":\"minecraft:switch_to_ranged\",\"target\":\"self\"}},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/drowned_ranged_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.weapon.offhand\",\"drop_chance\":1.0}]}},\"minecraft:ranged_mode\":{\"minecraft:shooter\":{\"def\":\"minecraft:thrown_trident\"},\"minecraft:behavior.ranged_attack\":{\"priority\":3,\"attack_interval_min\":1.0,\"attack_interval_max\":3.0,\"attack_radius\":10.0}},\"minecraft:melee_mode\":{\"minecraft:attack\":{\"damage\":3},\"minecraft:behavior.melee_attack\":{\"priority\":3,\"speed_multiplier\":1,\"track_target\":false,\"require_complete_path\":true},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/drowned_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.weapon.offhand\",\"drop_chance\":1.0}]}},\"minecraft:hunter_mode\":{\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_break_doors\":true,\"can_swim\":true,\"can_walk\":true,\"avoid_sun\":true}},\"minecraft:wander_mode\":{\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_break_doors\":true,\"can_swim\":false,\"can_walk\":true,\"avoid_sun\":true}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"drowned\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:annotation.break_door\":{},\"minecraft:underwater_movement\":{\"value\":0.06},\"minecraft:movement.generic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.23},\"minecraft:burns_in_daylight\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":true},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_break_doors\":true,\"can_swim\":false,\"can_walk\":true,\"avoid_sun\":true},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:nautilus_shell\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:trident\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.flee_sun\":{\"priority\":2,\"speed_multiplier\":1},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.stomp_turtle_egg\":{\"priority\":4,\"speed_multiplier\":1,\"search_range\":10,\"search_height\":2,\"goal_radius\":1.14,\"interval\":20},\"minecraft:behavior.pickup_items\":{\"priority\":6,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"reselect_targets\":true,\"must_see\":true,\"within_radius\":12.0,\"must_see_forget_duration\":17.0,\"persist_time\":0.5,\"entity_types\":[{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},{\"any_of\":[{\"test\":\"in_water\",\"subject\":\"other\",\"value\":true},{\"test\":\"is_daytime\",\"value\":false}]}]},\"max_dist\":20},{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},{\"any_of\":[{\"test\":\"in_water\",\"subject\":\"other\",\"value\":true},{\"test\":\"is_daytime\",\"value\":false}]}]},\"max_dist\":20,\"must_see\":false},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":20}]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:has_target\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:lost_target\",\"target\":\"self\"},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":15,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:mode_switcher\",\"minecraft:ranged_mode\",\"minecraft:adult_{name}\"]}},{\"weight\":85,\"randomize\":[{\"weight\":95,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:melee_mode\",\"minecraft:adult_{name}\"]}},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:melee_mode\",\"minecraft:baby_{name}\"]}}]}]},\"minecraft:as_baby\":{\"add\":{\"component_groups\":[\"minecraft:melee_mode\",\"minecraft:baby_{name}\"]}},\"minecraft:as_adult\":{\"add\":{\"component_groups\":[\"minecraft:melee_mode\",\"minecraft:adult_{name}\"]}},\"minecraft:switch_to_melee\":{\"remove\":{\"component_groups\":[\"minecraft:ranged_mode\"]},\"add\":{\"component_groups\":[\"minecraft:melee_mode\"]}},\"minecraft:switch_to_ranged\":{\"remove\":{\"component_groups\":[\"minecraft:melee_mode\"]},\"add\":{\"component_groups\":[\"minecraft:ranged_mode\"]}},\"minecraft:has_target\":{\"remove\":{\"component_groups\":[\"minecraft:wander_mode\"]},\"add\":{\"component_groups\":[\"minecraft:hunter_mode\"]}},\"minecraft:lost_target\":{\"remove\":{\"component_groups\":[\"minecraft:hunter_mode\"]},\"add\":{\"component_groups\":[\"minecraft:wander_mode\"]}}}}}'},8486:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_calm\":{\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\",\"target\":\"self\"},\"minecraft:movement\":{\"value\":0.3}},\"minecraft:{name}_angry\":{\"minecraft:angry\":{\"duration\":25,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:movement\":{\"value\":0.45},\"minecraft:behavior.melee_attack\":{\"priority\":2}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"enderman\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/enderman.json\"},\"minecraft:health\":{\"value\":40,\"max\":40},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4},{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"==\",\"value\":true},\"cause\":\"drowning\",\"damage_per_tick\":1}]},\"minecraft:attack\":{\"damage\":7},\"minecraft:follow_range\":{\"value\":32,\"max\":32},\"minecraft:collision_box\":{\"width\":0.6,\"height\":2.9},\"minecraft:teleport\":{\"random_teleports\":true,\"max_random_teleport_time\":30,\"random_teleport_cube\":[32,32,32],\"target_distance\":16,\"target_teleport_chance\":0.05,\"light_teleport_chance\":0.05},\"minecraft:lookat\":{\"search_radius\":64.0,\"set_target\":true,\"look_cooldown\":5.0,\"filters\":{\"all_of\":[{\"subject\":\"other\",\"test\":\"is_family\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"head\",\"subject\":\"other\",\"operator\":\"not\",\"value\":\"carved_pumpkin\"}]}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":5,\"must_see\":true,\"attack_interval\":10,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"endermite\"},\"max_dist\":64}]},\"minecraft:navigation.walk\":{\"can_path_over_water\":false,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":8.0,\"probability\":8.0},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:behavior.hurt_by_target\":{\"priority\":3},\"minecraft:behavior.enderman_leave_block\":{\"priority\":10},\"minecraft:behavior.enderman_take_block\":{\"priority\":11},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{\"default_values\":{\"max_optimized_distance\":80.0,\"max_dropped_ticks\":10,\"use_motion_prediction_hints\":true}}},\"events\":{\"minecraft:entity_spawned\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:{name}_calm\"]}},\"minecraft:become_angry\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_calm\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_angry\"]}},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_angry\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_calm\"]}}}}}'},331:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 3 : 0\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"endermite\",\"arthropod\",\"monster\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.4,\"height\":0.3},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:health\":{\"value\":8,\"max\":8},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack\":{\"damage\":2},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.melee_attack\":{\"priority\":3,\"track_target\":true},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":5,\"must_see\":true,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"enderman\"}]},\"max_dist\":16}]},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}}}}'},6285:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:celebrate\":{\"minecraft:behavior.celebrate\":{\"priority\":5,\"celebration_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":7.0},\"jump_interval\":{\"range_min\":1.0,\"range_max\":3.5},\"duration\":30.0,\"on_celebration_end_event\":{\"event\":\"minecraft:stop_celebrating\",\"target\":\"self\"}}},\"minecraft:raid_configuration\":{\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"hostile\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":false,\"first_founding_reward\":0},\"minecraft:behavior.move_to_village\":{\"priority\":6,\"speed_multiplier\":0.7},\"minecraft:ambient_sound_interval\":{\"value\":2.0,\"range\":4.0,\"event_name\":\"ambient.in.raid\"}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"10\"},\"minecraft:type_family\":{\"family\":[\"evocation_illager\",\"monster\",\"illager\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/evocation_illager.json\"},\"minecraft:health\":{\"value\":24,\"max\":24},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:movement\":{\"value\":0.5},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_pass_doors\":true,\"can_open_doors\":true,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.summon_entity\":{\"priority\":2,\"summon_choices\":[{\"min_activation_range\":0.0,\"max_activation_range\":3.0,\"cooldown_time\":5.0,\"weight\":3,\"cast_duration\":2.0,\"particle_color\":\"#FF664D59\",\"start_sound_event\":\"cast.spell\",\"sequence\":[{\"shape\":\"circle\",\"target\":\"self\",\"base_delay\":1.0,\"delay_per_summon\":0.0,\"num_entities_spawned\":5,\"entity_type\":\"minecraft:evocation_fang\",\"size\":1.5,\"entity_lifespan\":1.1,\"sound_event\":\"prepare.attack\"},{\"shape\":\"circle\",\"target\":\"self\",\"base_delay\":0.15,\"delay_per_summon\":0.0,\"num_entities_spawned\":8,\"entity_type\":\"minecraft:evocation_fang\",\"size\":2.5,\"entity_lifespan\":1.1}]},{\"min_activation_range\":3.0,\"weight\":3,\"cooldown_time\":5.0,\"cast_duration\":2.0,\"particle_color\":\"#FF664D59\",\"start_sound_event\":\"cast.spell\",\"sequence\":[{\"shape\":\"line\",\"target\":\"self\",\"base_delay\":1.0,\"delay_per_summon\":0.05,\"num_entities_spawned\":16,\"entity_type\":\"minecraft:evocation_fang\",\"size\":20,\"entity_lifespan\":1.1}]},{\"weight\":1,\"cooldown_time\":17.0,\"cast_duration\":5.0,\"particle_color\":\"#FFB3B3CC\",\"sequence\":[{\"shape\":\"circle\",\"target\":\"self\",\"base_delay\":5.0,\"num_entities_spawned\":3,\"entity_type\":\"minecraft:vex\",\"summon_cap\":8,\"summon_cap_radius\":16.0,\"size\":1.0,\"sound_event\":\"prepare.summon\"}]}]},\"minecraft:behavior.send_event\":{\"priority\":3,\"event_choices\":[{\"min_activation_range\":0.0,\"max_activation_range\":16.0,\"cooldown_time\":5.0,\"cast_duration\":3.0,\"particle_color\":\"#FFB38033\",\"weight\":3,\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"sheep\"},{\"test\":\"is_color\",\"subject\":\"other\",\"value\":\"blue\"}]},\"start_sound_event\":\"cast.spell\",\"sequence\":[{\"base_delay\":2.0,\"event\":\"wololo\",\"sound_event\":\"prepare.wololo\"}]}]},\"minecraft:behavior.avoid_mob_type\":{\"priority\":5,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":8,\"walk_speed_multiplier\":0.6,\"sprint_speed_multiplier\":1.0}]},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":0.6},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":20},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]},\"max_dist\":20}],\"must_see\":true},\"minecraft:behavior.look_at_player\":{\"priority\":9,\"look_distance\":3.0,\"probability\":1.0},\"minecraft:behavior.look_at_entity\":{\"priority\":10,\"look_distance\":8.0,\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"}},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:persistent\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:follow_range\":{\"value\":64},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:spawn_for_raid\":{\"add\":{\"component_groups\":[\"minecraft:raid_configuration\"]}},\"minecraft:start_celebrating\":{\"add\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:stop_celebrating\":{\"remove\":{\"component_groups\":[\"minecraft:celebrate\"]}}}}}'},5225:e=>{e.exports='{\"format_version\":\"1.17.10\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"sweet_berries\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":9,\"speed_multiplier\":1.1}},\"minecraft:{name}_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/fox.json\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breed_items\":\"sweet_berries\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}}},\"minecraft:{name}_with_item\":{\"minecraft:equipment\":{\"table\":\"loot_tables/entities/fox_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.weapon.mainhand\",\"drop_chance\":1.0}]}},\"minecraft:trusting_{name}\":{\"minecraft:trust\":{},\"minecraft:behavior.defend_trusted_target\":{\"priority\":0,\"within_radius\":25,\"must_see\":false,\"aggro_sound\":\"mad\",\"sound_chance\":0.05,\"on_defend_start\":{\"event\":\"minecraft:{name}_configure_defending\",\"target\":\"self\"}}},\"minecraft:docile_fox\":{\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.melee_box_attack\":{\"priority\":10,\"track_target\":true,\"require_complete_path\":true}},\"minecraft:defending_fox\":{\"minecraft:behavior.melee_box_attack\":{\"priority\":1,\"track_target\":true,\"require_complete_path\":true},\"minecraft:behavior.panic\":{\"priority\":2,\"speed_multiplier\":1.25},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":true},{\"test\":\"has_target\",\"operator\":\"==\",\"value\":false}]},\"event\":\"minecraft:{name}_configure_docile_day\"},{\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"has_target\",\"operator\":\"==\",\"value\":false}]},\"event\":\"minecraft:{name}_configure_docile_night\"}]}},\"minecraft:{name}_red\":{\"minecraft:variant\":{\"value\":0},\"minecraft:behavior.nearest_prioritized_attackable_target\":{\"priority\":6,\"attack_interval\":2,\"reselect_targets\":true,\"target_search_height\":5,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"rabbit\"},\"max_dist\":12,\"priority\":0},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"chicken\"},\"max_dist\":12,\"priority\":0},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cod\"},\"max_dist\":12,\"priority\":1},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"salmon\"},\"max_dist\":12,\"priority\":1},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"tropicalfish\"},\"max_dist\":12,\"priority\":1},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":12,\"priority\":0}]}},\"minecraft:{name}_arctic\":{\"minecraft:variant\":{\"value\":1},\"minecraft:behavior.nearest_prioritized_attackable_target\":{\"priority\":6,\"attack_interval\":2,\"reselect_targets\":true,\"target_search_height\":5,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"rabbit\"},\"max_dist\":12,\"priority\":1},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"chicken\"},\"max_dist\":12,\"priority\":1},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cod\"},\"max_dist\":12,\"priority\":0},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"salmon\"},\"max_dist\":12,\"priority\":0},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"tropicalfish\"},\"max_dist\":12,\"priority\":0},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":12,\"priority\":1}]}},\"minecraft:{name}_thunderstorm\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"all_of\":[{\"test\":\"weather_at_position\",\"operator\":\"!=\",\"value\":\"thunderstorm\"},{\"test\":\"is_daytime\",\"value\":true}]},\"event\":\"minecraft:{name}_configure_day\"},{\"filters\":{\"all_of\":[{\"test\":\"weather_at_position\",\"operator\":\"!=\",\"value\":\"thunderstorm\"},{\"test\":\"is_daytime\",\"value\":false}]},\"event\":\"minecraft:{name}_configure_night\"}]},\"minecraft:behavior.find_cover\":{\"priority\":0,\"speed_multiplier\":1,\"cooldown_time\":0.0}},\"minecraft:{name}_day\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"weather_at_position\",\"value\":\"thunderstorm\"},\"event\":\"minecraft:{name}_configure_thunderstorm\"},{\"filters\":{\"test\":\"is_daytime\",\"value\":false},\"event\":\"minecraft:{name}_configure_night\"}]},\"minecraft:behavior.nap\":{\"priority\":8,\"cooldown_min\":2.0,\"cooldown_max\":7.0,\"mob_detect_dist\":12.0,\"mob_detect_height\":6.0,\"can_nap_filters\":{\"all_of\":[{\"test\":\"in_water\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},{\"test\":\"on_ground\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},{\"test\":\"is_underground\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},{\"test\":\"weather_at_position\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"thunderstorm\"}]},\"wake_mob_exceptions\":{\"any_of\":[{\"test\":\"trusts\",\"subject\":\"other\",\"operator\":\"==\",\"value\":true},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"==\",\"value\":\"fox\"},{\"test\":\"is_sneaking\",\"subject\":\"other\",\"operator\":\"==\",\"value\":true}]}},\"minecraft:behavior.find_cover\":{\"priority\":9,\"speed_multiplier\":1,\"cooldown_time\":5.0}},\"minecraft:{name}_night\":{\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"weather_at_position\",\"value\":\"thunderstorm\"},\"event\":\"minecraft:{name}_configure_thunderstorm\"},{\"filters\":{\"test\":\"is_daytime\",\"value\":true},\"event\":\"minecraft:{name}_configure_day\"}]},\"minecraft:behavior.stroll_towards_village\":{\"priority\":11,\"speed_multiplier\":1.0,\"goal_radius\":3.0,\"cooldown_time\":10.0,\"search_range\":32,\"start_chance\":0.005}},\"minecraft:{name}_ambient_normal\":{\"minecraft:ambient_sound_interval\":{\"event_name\":\"ambient\"}},\"minecraft:{name}_ambient_sleep\":{\"minecraft:ambient_sound_interval\":{\"event_name\":\"sleep\"}},\"minecraft:{name}_ambient_night\":{\"minecraft:ambient_sound_interval\":{\"event_name\":\"screech\",\"value\":80,\"range\":160}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"fox\",\"mob\"]},\"minecraft:breathable\":{\"totalSupply\":15,\"suffocateTime\":0},\"minecraft:equip_item\":{},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.7},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:movement\":{\"value\":0.3},\"minecraft:attack\":{\"damage\":2},\"minecraft:shareables\":{\"singular_pickup\":true,\"all_items\":true,\"all_items_max_amount\":1,\"items\":[{\"item\":\"minecraft:apple\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:appleEnchanted\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:baked_potato\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:beef\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:beetroot\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:beetroot_soup\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:bread\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:carrot\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:chicken\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:chorus_fruit\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:clownfish\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_beef\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_chicken\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_fish\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_porkchop\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_rabbit\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cooked_salmon\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:cookie\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:dried_kelp\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:fish\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:golden_apple\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:golden_carrot\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:melon\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:mushroom_stew\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:muttonCooked\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:muttonRaw\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:poisonous_potato\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:porkchop\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:potato\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:pufferfish\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:pumpkin_pie\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:rabbit\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:rabbit_stew\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:rotten_flesh\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:salmon\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:spider_eye\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:sweet_berries\",\"priority\":0,\"max_amount\":1},{\"item\":\"minecraft:suspicious_stew\",\"priority\":0,\"max_amount\":1}]},\"minecraft:damage_sensor\":{\"triggers\":[{\"on_damage\":{\"filters\":{\"test\":\"is_block\",\"subject\":\"block\",\"value\":\"minecraft:sweet_berry_bush\"}},\"deals_damage\":false}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.equip_item\":{\"priority\":2},\"minecraft:behavior.avoid_mob_type\":{\"priority\":5,\"entity_types\":[{\"filters\":{\"any_of\":[{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"trusts\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true},{\"test\":\"is_sneaking\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"polarbear\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wolf\"}]},\"max_dist\":10,\"walk_speed_multiplier\":1.0,\"sprint_speed_multiplier\":1.5}]},\"minecraft:behavior.tempt\":{\"priority\":3,\"speed_multiplier\":0.5,\"within_radius\":16,\"can_get_scared\":true,\"items\":[\"sweet_berries\"]},\"minecraft:behavior.stalk_and_pounce_on_target\":{\"priority\":7,\"stalk_speed\":1.2,\"max_stalk_dist\":12.0,\"leap_height\":0.9,\"leap_dist\":0.8,\"pounce_max_dist\":5.0,\"interest_time\":2.0,\"stuck_time\":2.0,\"strike_dist\":2.0,\"stuck_blocks\":{\"test\":\"is_block\",\"subject\":\"block\",\"operator\":\"==\",\"value\":\"snow_layer\"}},\"minecraft:behavior.pickup_items\":{\"priority\":11,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":0.5},\"minecraft:behavior.eat_carried_item\":{\"priority\":12,\"delay_before_eating\":28},\"minecraft:behavior.random_look_around_and_sit\":{\"priority\":12,\"min_look_count\":2,\"max_look_count\":5,\"min_look_time\":80,\"max_look_time\":100,\"probability\":0.001},\"minecraft:behavior.raid_garden\":{\"priority\":12,\"blocks\":[\"minecraft:sweet_berry_bush\"],\"speed_multiplier\":1.2,\"search_range\":12,\"search_height\":2,\"goal_radius\":0.8,\"max_to_eat\":0,\"initial_eat_delay\":2},\"minecraft:behavior.random_stroll\":{\"priority\":13,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":14,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":15},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.6},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":0,\"scheduled_events\":[{\"filters\":[{\"test\":\"is_sleeping\",\"value\":true}],\"event\":\"minecraft:ambient_sleep\"},{\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"distance_to_nearest_player\",\"operator\":\">\",\"value\":16}]},\"event\":\"minecraft:ambient_night\"},{\"filters\":{\"all_of\":[{\"test\":\"is_sleeping\",\"value\":false},{\"any_of\":[{\"test\":\"is_daytime\",\"value\":true},{\"test\":\"distance_to_nearest_player\",\"operator\":\"<=\",\"value\":16}]}]},\"event\":\"minecraft:ambient_normal\"}]},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"is_daytime\",\"value\":false},\"event\":\"minecraft:{name}_configure_night\"},{\"filters\":{\"test\":\"is_daytime\",\"value\":true},\"event\":\"minecraft:{name}_configure_day\"}]}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":95,\"add\":{\"component_groups\":[\"minecraft:{name}_adult\",\"minecraft:{name}_with_item\",\"minecraft:docile_fox\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"minecraft:{name}_baby\",\"minecraft:docile_fox\"]}}]},{\"filters\":{\"test\":\"is_snow_covered\",\"value\":true},\"add\":{\"component_groups\":[\"minecraft:{name}_arctic\"]}},{\"filters\":{\"test\":\"is_snow_covered\",\"value\":false},\"add\":{\"component_groups\":[\"minecraft:{name}_red\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:{name}_baby\",\"minecraft:trusting_{name}\",\"minecraft:docile_fox\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_baby\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_adult\"]}},\"minecraft:{name}_configure_thunderstorm\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_night\",\"minecraft:{name}_day\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_thunderstorm\"]}},\"minecraft:{name}_configure_day\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_night\",\"minecraft:{name}_thunderstorm\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_day\"]}},\"minecraft:{name}_configure_night\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_day\",\"minecraft:{name}_thunderstorm\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_night\"]}},\"minecraft:ambient_normal\":{\"add\":{\"component_groups\":[\"minecraft:{name}_ambient_normal\"]}},\"minecraft:ambient_sleep\":{\"add\":{\"component_groups\":[\"minecraft:{name}_ambient_sleep\"]}},\"minecraft:ambient_night\":{\"add\":{\"component_groups\":[\"minecraft:{name}_ambient_night\"]}},\"minecraft:{name}_configure_defending\":{\"remove\":{\"component_groups\":[\"minecraft:docile_fox\",\"minecraft:{name}_day\",\"minecraft:{name}_night\"]},\"add\":{\"component_groups\":[\"minecraft:defending_fox\"]}},\"minecraft:{name}_configure_docile_day\":{\"remove\":{\"component_groups\":[\"minecraft:defending_fox\",\"minecraft:{name}_night\"]},\"add\":{\"component_groups\":[\"minecraft:docile_fox\",\"minecraft:{name}_day\"]}},\"minecraft:{name}_configure_docile_night\":{\"remove\":{\"component_groups\":[\"minecraft:defending_fox\",\"minecraft:{name}_day\"]},\"add\":{\"component_groups\":[\"minecraft:docile_fox\",\"minecraft:{name}_night\"]}}}}}'},9930:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"temperate_frog\":{\"minecraft:variant\":{\"value\":0}},\"cold_frog\":{\"minecraft:variant\":{\"value\":1}},\"warm_frog\":{\"minecraft:variant\":{\"value\":2}},\"pregnant\":{\"minecraft:behavior.lay_egg\":{\"priority\":2,\"speed_multiplier\":1.0,\"search_range\":10,\"search_height\":3,\"goal_radius\":1.7,\"target_blocks\":[\"minecraft:water\"],\"target_materials_above_block\":[\"Air\"],\"allow_laying_from_below\":true,\"use_default_animation\":false,\"lay_seconds\":2,\"egg_type\":\"minecraft:frog_spawn\",\"lay_egg_sound\":\"lay_spawn\",\"on_lay\":{\"event\":\"laid_egg\",\"target\":\"self\"}},\"minecraft:behavior.move_to_water\":{\"priority\":3,\"search_range\":20,\"search_height\":5,\"goal_radius\":1.5}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:type_family\":{\"family\":[\"frog\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.5,\"height\":0.55},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true,\"breathes_air\":true,\"generates_bubbles\":false},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":true,\"damage_modifier\":-5}},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":true,\"can_sink\":false,\"avoid_damage_blocks\":true},\"minecraft:movement.amphibious\":{},\"minecraft:movement\":{\"value\":0.1},\"minecraft:underwater_movement\":{\"value\":0.15},\"minecraft:jump.static\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{},\"minecraft:leashable\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:breedable\":{\"require_tame\":false,\"causes_pregnancy\":true,\"breeds_with\":{\"mate_type\":\"minecraft:frog\",\"baby_type\":\"minecraft:tadpole\",\"breed_event\":{\"event\":\"become_pregnant\"}},\"breed_items\":[\"slime_ball\"]},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2.0},\"minecraft:behavior.breed\":{\"priority\":4},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.25,\"can_tempt_vertically\":true,\"items\":[\"slime_ball\"]},\"minecraft:behavior.move_to_land\":{\"priority\":6,\"search_range\":30,\"search_height\":8,\"search_count\":80,\"goal_radius\":2},\"minecraft:behavior.eat_mob\":{\"priority\":7,\"run_speed\":2.0,\"eat_animation_time\":0.30,\"pull_in_force\":0.75,\"reach_mob_distance\":1.75,\"eat_mob_sound\":\"tongue\",\"loot_table\":\"loot_tables/entities/frog.json\"},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":8,\"within_radius\":16,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"slime\"},{\"test\":\"is_variant\",\"subject\":\"other\",\"operator\":\"==\",\"value\":1}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"magmacube\"},{\"test\":\"is_variant\",\"subject\":\"other\",\"operator\":\"==\",\"value\":1}]},\"max_dist\":16}],\"must_see\":true},\"minecraft:behavior.croak\":{\"priority\":9,\"interval\":[10,20],\"duration\":4.5,\"filters\":{\"all_of\":[{\"test\":\"in_water\",\"value\":false},{\"test\":\"in_lava\",\"value\":false}]}},\"minecraft:behavior.jump_to_block\":{\"priority\":10,\"search_width\":8,\"search_height\":4,\"minimum_path_length\":2,\"minimum_distance\":1,\"scale_factor\":0.6,\"max_velocity\":1,\"cooldown_range\":[5,7],\"preferred_blocks\":[\"minecraft:waterlily\",\"minecraft:big_dripleaf\"],\"preferred_blocks_chance\":0.5,\"forbidden_blocks\":[\"minecraft:water\"]},\"minecraft:behavior.random_stroll\":{\"priority\":11},\"minecraft:behavior.look_at_player\":{\"priority\":12,\"target_distance\":6.0,\"probability\":0.02}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"add\":{\"component_groups\":[\"temperate_frog\"]}},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"desert\"},{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},{\"test\":\"has_biome_tag\",\"value\":\"mesa\"},{\"test\":\"has_biome_tag\",\"value\":\"nether\"},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"warm\"},{\"test\":\"has_biome_tag\",\"value\":\"ocean\"}]},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"lukewarm\"},{\"test\":\"has_biome_tag\",\"value\":\"ocean\"}]},{\"test\":\"has_biome_tag\",\"value\":\"mangrove_swamp\"}]},\"add\":{\"component_groups\":[\"warm_frog\"]}},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"mountain\"},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"mountains\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"meadow\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"stony_peaks\"}]},{\"test\":\"has_biome_tag\",\"value\":\"ice\"},{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"},{\"test\":\"has_biome_tag\",\"value\":\"the_end\"},{\"test\":\"has_biome_tag\",\"value\":\"deep_dark\"}]},\"add\":{\"component_groups\":[\"cold_frog\"]}}]},\"spawn_temperate\":{\"add\":{\"component_groups\":[\"temperate_frog\"]}},\"spawn_cold\":{\"add\":{\"component_groups\":[\"cold_frog\"]}},\"spawn_warm\":{\"add\":{\"component_groups\":[\"warm_frog\"]}},\"minecraft:entity_transformed\":{\"sequence\":[{\"add\":{\"component_groups\":[\"temperate_frog\"]}},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"desert\"},{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},{\"test\":\"has_biome_tag\",\"value\":\"mesa\"},{\"test\":\"has_biome_tag\",\"value\":\"nether\"},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"warm\"},{\"test\":\"has_biome_tag\",\"value\":\"ocean\"}]},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"lukewarm\"},{\"test\":\"has_biome_tag\",\"value\":\"ocean\"}]},{\"test\":\"has_biome_tag\",\"value\":\"mangrove_swamp\"}]},\"add\":{\"component_groups\":[\"warm_frog\"]}},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"mountain\"},{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"mountains\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"meadow\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"stony_peaks\"}]},{\"test\":\"has_biome_tag\",\"value\":\"ice\"},{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"},{\"test\":\"has_biome_tag\",\"value\":\"the_end\"},{\"test\":\"has_biome_tag\",\"value\":\"deep_dark\"}]},\"add\":{\"component_groups\":[\"cold_frog\"]}}]},\"become_pregnant\":{\"add\":{\"component_groups\":[\"pregnant\"]}},\"laid_egg\":{\"remove\":{\"component_groups\":[\"pregnant\"]}}}}}'},9009:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:ghast\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:fire_immune\":{},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:collision_box\":{\"width\":4,\"height\":4},\"minecraft:movement\":{\"value\":0.03},\"minecraft:navigation.float\":{\"can_path_over_water\":true},\"minecraft:behavior.float_wander\":{\"priority\":2,\"must_reach\":true},\"minecraft:can_fly\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/ghast.json\"},\"minecraft:shooter\":{\"def\":\"minecraft:fireball\"},\"minecraft:type_family\":{\"family\":[\"ghast\",\"monster\",\"mob\"]},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:jump.static\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.ranged_attack\":{\"priority\":1,\"attack_radius\":64,\"charge_shoot_trigger\":2,\"charge_charged_trigger\":1},\"minecraft:follow_range\":{\"value\":64,\"max\":64},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":28}],\"must_see\":true},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}}}}'},4188:e=>{e.exports='{\"format_version\":\"1.13.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:glow_squid\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:squid_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:experience_reward\":{\"on_death\":\"!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"squid\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.95,\"height\":0.95},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/glow_squid.json\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":false,\"breathes_water\":true},\"minecraft:movement\":{\"value\":0.2},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_sink\":false},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:behavior.squid_move_away_from_ground\":{\"priority\":1},\"minecraft:behavior.squid_flee\":{\"priority\":2},\"minecraft:behavior.squid_idle\":{\"priority\":2},\"minecraft:behavior.squid_dive\":{\"priority\":2},\"minecraft:behavior.squid_out_of_water\":{\"priority\":2},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"remove\":{},\"add\":{}},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:squid_baby\"]}}]}}}}'},1195:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:goat\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"goat_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"wheat\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:attack\":{\"damage\":1}},\"goat_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/goat.json\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":0.6},\"minecraft:breedable\":{\"require_tame\":false,\"breed_items\":\"wheat\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"mutation_factor\":{\"variant\":0}},\"minecraft:attack\":{\"damage\":2}},\"goat_default\":{\"minecraft:variant\":{\"value\":0}},\"goat_screamer\":{\"minecraft:variant\":{\"value\":1}},\"interact_default\":{\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"bucket:0\"}]}},\"use_item\":true,\"transform_to_item\":\"bucket:1\",\"play_sounds\":\"milk_suspiciously\",\"interact_text\":\"action.interact.milk\"}]}},\"interact_screamer\":{\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"bucket:0\"}]}},\"use_item\":true,\"transform_to_item\":\"bucket:1\",\"play_sounds\":\"milk.screamer\",\"interact_text\":\"action.interact.milk\"}]}},\"ram_default\":{\"minecraft:behavior.ram_attack\":{\"priority\":5,\"run_speed\":0.7,\"ram_speed\":1.8,\"min_ram_distance\":4,\"ram_distance\":7,\"knockback_force\":2.5,\"knockback_height\":0.04,\"pre_ram_sound\":\"pre_ram\",\"ram_impact_sound\":\"ram_impact\",\"cooldown_range\":[30,300],\"on_start\":[{\"event\":\"start_event\",\"target\":\"self\"}]}},\"ram_screamer\":{\"minecraft:behavior.ram_attack\":{\"priority\":5,\"run_speed\":0.7,\"ram_speed\":1.8,\"min_ram_distance\":4,\"ram_distance\":7,\"knockback_force\":2.5,\"knockback_height\":0.04,\"pre_ram_sound\":\"pre_ram.screamer\",\"ram_impact_sound\":\"ram_impact.screamer\",\"cooldown_range\":[30,300],\"on_start\":[{\"event\":\"start_event\",\"target\":\"self\"}]}},\"attack_cooldown\":{\"minecraft:attack_cooldown\":{\"attack_cooldown_time\":[30,40],\"attack_cooldown_complete_event\":{\"event\":\"attack_cooldown_complete_event\",\"target\":\"self\"}}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:behavior.jump_to_block\":{\"priority\":8,\"search_width\":10,\"search_height\":10,\"minimum_path_length\":8,\"minimum_distance\":1,\"scale_factor\":0.6,\"cooldown_range\":[30,60]},\"minecraft:genetics\":{\"mutation_rate\":0.02,\"genes\":[{\"name\":\"goat_variant\",\"use_simplified_breeding\":true,\"allele_range\":{\"range_min\":1,\"range_max\":100},\"genetic_variants\":[{\"main_allele\":{\"range_min\":1,\"range_max\":2},\"birth_event\":{\"event\":\"minecraft:born_screamer\",\"target\":\"self\"}},{\"main_allele\":{\"range_min\":3,\"range_max\":100},\"birth_event\":{\"event\":\"minecraft:born_default\",\"target\":\"self\"}}]}]},\"minecraft:type_family\":{\"family\":[\"goat\",\"animal\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true,\"blocks_to_avoid\":[{\"name\":\"minecraft:powder_snow\"}]},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.3},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.4},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1,\"items\":[\"wheat\"]},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":6,\"within_radius\":16,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"goat\"},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"}]},\"max_dist\":16}],\"must_see\":true},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":true,\"damage_modifier\":-20}},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"speed_multiplier\":0.6},\"minecraft:behavior.look_at_player\":{\"priority\":10,\"look_distance\":6,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":11},\"minecraft:leashable\":{\"soft_distance\":4,\"hard_distance\":6,\"max_distance\":10},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"add\":{\"component_groups\":[\"goat_adult\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"goat_baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"goat_baby\"]}},\"minecraft:born_default\":{\"add\":{\"component_groups\":[\"goat_default\",\"ram_default\",\"interact_default\"]}},\"minecraft:born_screamer\":{\"add\":{\"component_groups\":[\"goat_screamer\",\"ram_screamer\",\"interact_screamer\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"goat_baby\"]},\"add\":{\"component_groups\":[\"goat_adult\"]}},\"start_event\":{\"add\":{\"component_groups\":[\"attack_cooldown\"]}},\"attack_cooldown_complete_event\":{\"remove\":{\"component_groups\":[\"attack_cooldown\"]}}}}}'},6187:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:guardian\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:{name}_aggressive\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"squid\"}]},\"max_dist\":16}],\"attack_interval_min\":1.0,\"must_see\":true},\"minecraft:target_nearby_sensor\":{\"inside_range\":3.0,\"outside_range\":4.0,\"on_inside_range\":{\"event\":\"minecraft:target_too_close\",\"target\":\"self\"}},\"minecraft:behavior.guardian_attack\":{\"priority\":4}},\"minecraft:{name}_passive\":{\"minecraft:timer\":{\"time\":[1,3],\"looping\":false,\"time_down_event\":{\"event\":\"minecraft:target_far_enough\",\"target\":\"self\"}},\"minecraft:behavior.avoid_mob_type\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":8,\"walk_speed_multiplier\":1,\"sprint_speed_multiplier\":1}]}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 10 : 0\"},\"minecraft:nameable\":{},\"minecraft:collision_box\":{\"width\":0.85,\"height\":0.85},\"minecraft:health\":{\"value\":30,\"max\":30},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.12},\"minecraft:underwater_movement\":{\"value\":0.12},\"minecraft:attack\":{\"damage\":5},\"minecraft:follow_range\":{\"value\":16,\"max\":16},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_swim\":true,\"can_walk\":false,\"can_breach\":true},\"minecraft:movement.sway\":{},\"minecraft:jump.static\":{},\"minecraft:breathable\":{\"breathes_water\":true},\"minecraft:loot\":{\"table\":\"loot_tables/entities/guardian.json\"},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:home\":{\"restriction_radius\":16},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"squid\"}]},\"max_dist\":16}],\"attack_interval_min\":1.0,\"must_see\":true},\"minecraft:target_nearby_sensor\":{\"inside_range\":3.0,\"outside_range\":4.0,\"on_inside_range\":{\"event\":\"minecraft:target_too_close\",\"target\":\"self\"}},\"minecraft:behavior.guardian_attack\":{\"priority\":4},\"minecraft:behavior.move_towards_home_restriction\":{\"priority\":5,\"speed_multiplier\":1.0},\"minecraft:behavior.random_swim\":{\"priority\":7,\"speed_multiplier\":1.0,\"interval\":80,\"avoid_surface\":false},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":12.0,\"probability\":0.01},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:type_family\":{\"family\":[\"guardian\",\"monster\",\"mob\"]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:target_too_close\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_aggressive\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_passive\"]}},\"minecraft:target_far_enough\":{\"remove\":{\"component_groups\":[\"minecraft:{name}_passive\"]},\"add\":{\"component_groups\":[\"minecraft:{name}_aggressive\"]}}}}}'},784:e=>{e.exports='{\"format_version\":\"1.21.110\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"spawn_category\":\"creature\",\"is_spawnable\":true,\"is_summonable\":true,\"properties\":{\"minecraft:can_move\":{\"type\":\"bool\",\"default\":true,\"client_sync\":true}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"happy_ghast\",\"mob\"]},\"minecraft:collision_box\":{\"width\":4.0,\"height\":4.0},\"minecraft:physics\":{\"has_gravity\":false},\"minecraft:can_fly\":{},\"minecraft:jump.static\":{},\"minecraft:follow_range\":{\"value\":16,\"max\":16},\"minecraft:is_tamed\":{},\"minecraft:leashable\":{\"on_unleash\":{\"event\":\"minecraft:on_unleashed\",\"target\":\"self\"},\"presets\":[{\"hard_distance\":10,\"max_distance\":14}]},\"minecraft:nameable\":{},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\"},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:damage_sensor\":{\"triggers\":[{\"cause\":\"fall\",\"deals_damage\":\"no\"}]},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:renders_when_invisible\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:body_rotation_always_follows_head\":{}},\"component_groups\":{\"minecraft:baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.2375},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:breathable\":{\"total_supply\":5,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":true},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"minecraft:snowball\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:movement\":{\"value\":0.3},\"minecraft:flying_speed\":{\"value\":0.0833333},\"minecraft:movement.hover\":{},\"minecraft:navigation.hover\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true,\"can_path_from_air\":true,\"avoid_water\":true},\"minecraft:behavior.follow_mob\":{\"priority\":6,\"search_range\":16,\"stop_distance\":5,\"speed_multiplier\":1.1,\"use_home_position_restriction\":true,\"preferred_actor_type\":\"player\",\"filters\":{\"all_of\":[{\"test\":\"is_underwater\",\"subject\":\"other\",\"value\":false},{\"test\":\"is_baby\",\"subject\":\"other\",\"value\":false},{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"armadillo\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"bee\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"camel\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cat\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"chicken\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cow\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"donkey\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fox\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"goat\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"happy_ghast\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"horse\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"skeleton_horse\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"llama\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mule\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"ocelot\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"panda\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"parrot\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"pig\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"polar_bear\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"rabbit\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"sheep\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"sniffer\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"strider\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager_v2\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wolf\"}]}]}},\"minecraft:behavior.panic\":{\"priority\":2,\"speed_multiplier\":2.0},\"minecraft:behavior.tempt\":{\"priority\":3,\"can_tempt_vertically\":true,\"items\":[\"minecraft:snowball\"],\"speed_multiplier\":1.25,\"within_radius\":16,\"on_tempt_end\":{\"event\":\"minecraft:on_stop_tempting\"}},\"minecraft:behavior.random_hover\":{\"priority\":8,\"xz_dist\":8,\"y_dist\":8,\"y_offset\":-1,\"interval\":1,\"hover_height\":[1,4]},\"minecraft:home\":{\"restriction_radius\":32,\"restriction_type\":\"random_movement\"}},\"minecraft:adult\":{\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:leashable_to\":{},\"minecraft:breathable\":{\"total_supply\":5,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":false},\"minecraft:navigation.float\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true,\"avoid_water\":true},\"minecraft:entity_sensor\":{\"find_players_only\":true,\"relative_range\":false,\"subsensors\":[{\"event\":\"minecraft:become_mobile\",\"cooldown\":0.0,\"y_offset\":4.5,\"range\":[3.5,2.0],\"minimum_count\":0,\"maximum_count\":0,\"event_filters\":{\"all_of\":[{\"test\":\"is_vehicle_family\",\"subject\":\"other\",\"operator\":\"not\",\"value\":\"happy_ghast\"},{\"test\":\"actor_health\",\"operator\":\">\",\"value\":0}]}},{\"event\":\"minecraft:become_immobile\",\"cooldown\":0.0,\"y_offset\":4.5,\"range\":[3.0,1.5],\"minimum_count\":1,\"event_filters\":{\"all_of\":[{\"test\":\"is_vehicle_family\",\"subject\":\"other\",\"operator\":\"not\",\"value\":\"happy_ghast\"},{\"test\":\"actor_health\",\"operator\":\">\",\"value\":0}]}}]},\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"}},\"minecraft:adult_mobile\":{\"minecraft:movement\":{\"value\":0.016},\"minecraft:flying_speed\":{\"value\":0.016},\"minecraft:knockback_resistance\":{\"value\":0.0},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:behavior.float_wander\":{\"priority\":7,\"must_reach\":true,\"random_reselect\":true,\"navigate_around_surface\":true,\"additional_collision_buffer\":true,\"allow_navigating_through_liquids\":false,\"use_home_position_restriction\":true,\"surface_xz_dist\":16,\"surface_y_dist\":16,\"float_duration\":[2.0,7.0]}},\"minecraft:adult_immobile\":{\"minecraft:movement\":{\"value\":0.0},\"minecraft:flying_speed\":{\"value\":0.0},\"minecraft:knockback_resistance\":{\"value\":1.0},\"minecraft:pushable\":{\"is_pushable\":false,\"is_pushable_by_piston\":true},\"minecraft:body_rotation_blocked\":{},\"minecraft:rotation_axis_aligned\":{},\"minecraft:is_collidable\":{}},\"minecraft:adult_unharnessed\":{\"minecraft:behavior.float_tempt\":{\"priority\":4,\"can_tempt_vertically\":true,\"items\":[\"minecraft:snowball\",\"minecraft:black_harness\",\"minecraft:blue_harness\",\"minecraft:brown_harness\",\"minecraft:cyan_harness\",\"minecraft:gray_harness\",\"minecraft:green_harness\",\"minecraft:light_blue_harness\",\"minecraft:light_gray_harness\",\"minecraft:lime_harness\",\"minecraft:magenta_harness\",\"minecraft:orange_harness\",\"minecraft:pink_harness\",\"minecraft:purple_harness\",\"minecraft:red_harness\",\"minecraft:white_harness\",\"minecraft:yellow_harness\"],\"within_radius\":16,\"stop_distance\":7,\"on_tempt_end\":{\"event\":\"minecraft:on_stop_tempting\"}},\"minecraft:home\":{\"restriction_radius\":64,\"restriction_type\":\"random_movement\"},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"black_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"blue_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"brown_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"cyan_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"gray_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"green_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"light_blue_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"light_gray_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"lime_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"magenta_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"orange_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"pink_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"purple_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"white_harness\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"yellow_harness\"}]},\"event\":\"minecraft:on_harnessed\",\"target\":\"self\"},\"use_item\":true,\"equip_item_slot\":\"slot.armor.body\",\"play_sounds\":\"armor.equip_generic\",\"interact_text\":\"action.interact.equipharness\"}]}},\"minecraft:adult_harnessed\":{\"minecraft:home\":{\"restriction_radius\":32,\"restriction_type\":\"random_movement\"},\"minecraft:rideable\":{\"seat_count\":4,\"family_types\":[\"player\"],\"dismount_mode\":\"on_top_center\",\"on_rider_enter_event\":\"minecraft:on_passenger_mount\",\"on_rider_exit_event\":\"minecraft:on_passenger_dismount\",\"interact_text\":\"action.interact.ride.horse\",\"seats\":[{\"min_rider_count\":0,\"max_rider_count\":4,\"position\":[0.0,3.8,1.7],\"third_person_camera_radius\":8.0,\"camera_relax_distance_smoothing\":6.0},{\"min_rider_count\":1,\"max_rider_count\":4,\"position\":[-1.7,3.8,0.0],\"third_person_camera_radius\":8.0,\"camera_relax_distance_smoothing\":6.0},{\"min_rider_count\":2,\"max_rider_count\":4,\"position\":[0.0,3.8,-1.7],\"third_person_camera_radius\":8.0,\"camera_relax_distance_smoothing\":6.0},{\"min_rider_count\":3,\"max_rider_count\":4,\"position\":[1.7,3.8,0.0],\"third_person_camera_radius\":8.0,\"camera_relax_distance_smoothing\":6.0}]},\"minecraft:free_camera_controlled\":{\"strafe_speed_modifier\":1.0,\"backwards_movement_modifier\":0.5},\"minecraft:vertical_movement_action\":{\"vertical_velocity\":0.5},\"minecraft:behavior.player_ride_tamed\":{\"priority\":1},\"minecraft:behavior.float_tempt\":{\"priority\":5,\"can_tempt_vertically\":true,\"items\":[\"minecraft:snowball\"],\"within_radius\":16,\"stop_distance\":7,\"on_tempt_end\":{\"event\":\"minecraft:on_stop_tempting\"}},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_sneak_held\",\"subject\":\"other\",\"value\":false},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"shears\"},{\"test\":\"rider_count\",\"subject\":\"self\",\"operator\":\"equals\",\"value\":0}]},\"event\":\"minecraft:on_unharnessed\",\"target\":\"self\"},\"hurt_item\":1,\"drop_item_slot\":\"slot.armor.body\",\"drop_item_y_offset\":5,\"play_sounds\":\"armor.unequip_generic\",\"interact_text\":\"action.interact.removeharness\",\"vibration\":\"shear\"}]}},\"minecraft:adult_with_passengers\":{\"minecraft:ambient_sound_interval\":{\"value\":30.0}},\"minecraft:adult_without_passengers\":{\"minecraft:ambient_sound_interval\":{\"value\":5.0}}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"trigger\":\"minecraft:spawn_baby\"}]},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:adult\",\"minecraft:adult_mobile\",\"minecraft:adult_unharnessed\",\"minecraft:adult_without_passengers\"]},\"set_property\":{\"minecraft:can_move\":true}},\"minecraft:spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:baby\"]}},\"minecraft:ageable_grow_up\":{\"add\":{\"component_groups\":[\"minecraft:adult\",\"minecraft:adult_mobile\",\"minecraft:adult_unharnessed\",\"minecraft:adult_without_passengers\"]},\"remove\":{\"component_groups\":[\"minecraft:baby\"]},\"set_property\":{\"minecraft:can_move\":true}},\"minecraft:become_immobile\":{\"filters\":{\"test\":\"bool_property\",\"domain\":\"minecraft:can_move\",\"value\":true},\"add\":{\"component_groups\":[\"minecraft:adult_immobile\"]},\"remove\":{\"component_groups\":[\"minecraft:adult_mobile\"]},\"set_property\":{\"minecraft:can_move\":false},\"stop_movement\":{}},\"minecraft:become_mobile\":{\"filters\":{\"test\":\"bool_property\",\"domain\":\"minecraft:can_move\",\"value\":false},\"add\":{\"component_groups\":[\"minecraft:adult_mobile\"]},\"remove\":{\"component_groups\":[\"minecraft:adult_immobile\"]},\"set_property\":{\"minecraft:can_move\":true}},\"minecraft:on_harnessed\":{\"remove\":{\"component_groups\":[\"minecraft:adult_unharnessed\"]},\"add\":{\"component_groups\":[\"minecraft:adult_harnessed\"]},\"set_home_position\":{}},\"minecraft:on_unharnessed\":{\"remove\":{\"component_groups\":[\"minecraft:adult_harnessed\"]},\"add\":{\"component_groups\":[\"minecraft:adult_unharnessed\"]},\"set_home_position\":{}},\"minecraft:on_unleashed\":{\"set_home_position\":{}},\"minecraft:on_passenger_mount\":{\"sequence\":[{\"filters\":{\"test\":\"rider_count\",\"subject\":\"self\",\"operator\":\"equals\",\"value\":1},\"add\":{\"component_groups\":[\"minecraft:adult_with_passengers\"]},\"remove\":{\"component_groups\":[\"minecraft:adult_without_passengers\"]},\"play_sound\":{\"sound\":\"attach\"}}]},\"minecraft:on_passenger_dismount\":{\"sequence\":[{\"filters\":{\"test\":\"rider_count\",\"subject\":\"self\",\"operator\":\"equals\",\"value\":0},\"add\":{\"component_groups\":[\"minecraft:adult_without_passengers\"]},\"remove\":{\"component_groups\":[\"minecraft:adult_with_passengers\"]},\"play_sound\":{\"sound\":\"detach\"}},{\"set_home_position\":{},\"trigger\":\"minecraft:on_player_detected_above\"}]},\"minecraft:on_stop_tempting\":{\"set_home_position\":{}}}}}'},5309:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"zombification_sensor\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"in_nether\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"start_zombification_event\"}}},\"start_zombification\":{\"minecraft:is_shaking\":{},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"in_nether\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"stop_zombification_event\"}},\"minecraft:timer\":{\"looping\":false,\"time\":15,\"time_down_event\":{\"event\":\"become_zombie_event\"}}},\"become_zombie\":{\"minecraft:transformation\":{\"into\":\"minecraft:zoglin\",\"transformation_sound\":\"converted_to_zombified\",\"keep_level\":true}},\"angry_hoglin\":{\"minecraft:angry\":{\"duration\":10,\"broadcast_anger\":true,\"broadcast_range\":16,\"calm_event\":{\"event\":\"become_calm_event\",\"target\":\"self\"},\"angry_sound\":\"angry\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}}},\"attack_cooldown\":{\"minecraft:attack_cooldown\":{\"attack_cooldown_time\":[10.0,15.0],\"attack_cooldown_complete_event\":{\"event\":\"attack_cooldown_complete_event\",\"target\":\"self\"}}},\"minecraft:hoglin_baby\":{\"minecraft:type_family\":{\"family\":[\"hoglin\",\"hoglin_baby\",\"mob\"]},\"minecraft:is_baby\":{},\"minecraft:movement\":{\"value\":0.36},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1,\"track_target\":true,\"reach_multiplier\":1.0,\"cooldown_time\":0.75},\"minecraft:attack\":{\"damage\":1.0},\"minecraft:scale\":{\"value\":0.5},\"minecraft:collision_box\":{\"width\":0.85,\"height\":0.85},\"minecraft:custom_hit_test\":{\"hitboxes\":[{\"width\":1.0,\"height\":0.85,\"pivot\":[0,0.5,0]}]},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"crimson_fungus\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1},\"minecraft:rideable\":{\"seat_count\":3,\"family_types\":[\"piglin\"],\"seats\":[{\"position\":[0.0,0.9,-0.3],\"lock_rider_rotation\":0},{\"position\":[0.0,2.4,-0.3],\"lock_rider_rotation\":0},{\"position\":[0.0,3.9,-0.3],\"lock_rider_rotation\":0}]},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1}},\"minecraft:hoglin_adult\":{\"minecraft:collision_box\":{\"width\":0.9,\"height\":0.9},\"minecraft:movement\":{\"value\":0.3},\"minecraft:custom_hit_test\":{\"hitboxes\":[{\"width\":2.0,\"height\":1.75,\"pivot\":[0,1,0]}]},\"minecraft:group_size\":{\"radius\":32,\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"value\":\"hoglin\"}]}},\"minecraft:behavior.hurt_by_target\":{\"priority\":2},\"minecraft:on_target_acquired\":{\"event\":\"become_angry_event\",\"target\":\"self\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/hoglin.json\"},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1,\"track_target\":true,\"reach_multiplier\":2.5,\"cooldown_time\":2},\"minecraft:attack\":{\"damage\":[3,9]},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":0.6},\"minecraft:breedable\":{\"require_tame\":false,\"love_filters\":{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"},\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"crimson_fungus\"]}},\"unhuntable_adult\":{\"minecraft:type_family\":{\"family\":[\"hoglin\",\"hoglin_adult\",\"mob\"]}},\"huntable_adult\":{\"minecraft:type_family\":{\"family\":[\"hoglin\",\"hoglin_adult\",\"hoglin_huntable\",\"mob\"]}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":40,\"max\":40},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:knockback_resistance\":{\"value\":0.5},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":4,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"}]},\"max_dist\":16}],\"must_see\":true},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:behavior.avoid_mob_type\":{\"priority\":0,\"remove_target\":true,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"has_target\",\"subject\":\"other\",\"value\":true},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"piglin\"}]},\"check_if_outnumbered\":true,\"max_dist\":10,\"sprint_speed_multiplier\":1.2}],\"avoid_mob_sound\":\"retreat\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}},\"minecraft:behavior.avoid_block\":{\"priority\":1,\"tick_interval\":5,\"search_range\":8,\"search_height\":4,\"walk_speed_modifier\":1,\"sprint_speed_modifier\":1,\"avoid_block_sound\":\"retreat\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0},\"target_selection_method\":\"nearest\",\"target_blocks\":[\"minecraft:warped_fungus\",\"minecraft:portal\",\"minecraft:respawn_anchor\"],\"on_escape\":[{\"event\":\"escaped_event\",\"target\":\"self\"}]},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":0.4},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"spawn_adult\"},{\"weight\":5,\"trigger\":\"spawn_baby\"}]},\"minecraft:entity_born\":{\"trigger\":\"spawn_baby\"},\"spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:hoglin_adult\",\"huntable_adult\",\"zombification_sensor\"]}},\"spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:hoglin_baby\",\"zombification_sensor\"]}},\"stop_zombification_event\":{\"add\":{\"component_groups\":[\"zombification_sensor\"]},\"remove\":{\"component_groups\":[\"start_zombification\"]}},\"become_zombie_event\":{\"add\":{\"component_groups\":[\"become_zombie\"]}},\"start_zombification_event\":{\"add\":{\"component_groups\":[\"start_zombification\"]},\"remove\":{\"component_groups\":[\"zombification_sensor\"]}},\"spawn_adult_unhuntable\":{\"add\":{\"component_groups\":[\"minecraft:hoglin_adult\",\"unhuntable_adult\",\"zombification_sensor\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:hoglin_baby\"]},\"add\":{\"component_groups\":[\"minecraft:hoglin_adult\",\"huntable_adult\"]}},\"become_angry_event\":{\"add\":{\"component_groups\":[\"angry_hoglin\"]}},\"become_calm_event\":{\"remove\":{\"component_groups\":[\"angry_hoglin\"]}},\"escaped_event\":{\"add\":{\"component_groups\":[\"attack_cooldown\"]},\"remove\":{\"component_groups\":[\"angry_hoglin\"]}},\"attack_cooldown_complete_event\":{\"remove\":{\"component_groups\":[\"attack_cooldown\"]}}}}}'},4193:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:horse_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale_by_age\":{\"start_scale\":0.5,\"end_scale\":1.0},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[{\"item\":\"wheat\",\"growth\":0.016667},{\"item\":\"sugar\",\"growth\":0.025},{\"item\":\"hay_block\",\"growth\":0.15},{\"item\":\"apple\",\"growth\":0.05},{\"item\":\"golden_carrot\",\"growth\":0.05},{\"item\":\"golden_apple\",\"growth\":0.2},{\"item\":\"appleEnchanted\",\"growth\":0.2}],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":4,\"speed_multiplier\":1.0}},\"minecraft:horse_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/horse.json\"},\"minecraft:behavior.run_around_like_crazy\":{\"priority\":1,\"speed_multiplier\":1.2},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0}},\"minecraft:horse_wild\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"player\",\"zombie\"],\"interact_text\":\"action.interact.mount\",\"seats\":{\"position\":[0.0,1.1,-0.2]}},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:tamemount\":{\"min_temper\":0,\"max_temper\":100,\"feed_text\":\"action.interact.feed\",\"ride_text\":\"action.interact.mount\",\"feed_items\":[{\"item\":\"wheat\",\"temper_mod\":3},{\"item\":\"sugar\",\"temper_mod\":3},{\"item\":\"apple\",\"temper_mod\":3},{\"item\":\"golden_carrot\",\"temper_mod\":5},{\"item\":\"golden_apple\",\"temper_mod\":10},{\"item\":\"appleEnchanted\",\"temper_mod\":10}],\"auto_reject_items\":[{\"item\":\"horsearmorleather\"},{\"item\":\"horsearmoriron\"},{\"item\":\"horsearmorgold\"},{\"item\":\"horsearmordiamond\"},{\"item\":\"saddle\"}],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}}},\"minecraft:horse_tamed\":{\"minecraft:is_tamed\":{},\"minecraft:rideable\":{\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.horse\",\"seats\":{\"position\":[0.0,1.1,-0.2]}},\"minecraft:inventory\":{\"inventory_size\":2,\"container_type\":\"horse\"},\"minecraft:breedable\":{\"require_tame\":true,\"inherit_tamed\":false,\"breeds_with\":[{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}}],\"breed_items\":[\"golden_carrot\",\"golden_apple\",\"appleEnchanted\"]},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.2,\"items\":[\"golden_apple\",\"appleEnchanted\",\"golden_carrot\"]}},\"minecraft:horse_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:input_ground_controlled\":{},\"minecraft:can_power_jump\":{},\"minecraft:behavior.player_ride_tamed\":{}},\"minecraft:base_white\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:base_creamy\":{\"minecraft:variant\":{\"value\":1}},\"minecraft:base_chestnut\":{\"minecraft:variant\":{\"value\":2}},\"minecraft:base_brown\":{\"minecraft:variant\":{\"value\":3}},\"minecraft:base_black\":{\"minecraft:variant\":{\"value\":4}},\"minecraft:base_gray\":{\"minecraft:variant\":{\"value\":5}},\"minecraft:base_darkbrown\":{\"minecraft:variant\":{\"value\":6}},\"minecraft:markings_none\":{\"minecraft:mark_variant\":{\"value\":0}},\"minecraft:markings_white_details\":{\"minecraft:mark_variant\":{\"value\":1}},\"minecraft:markings_white_fields\":{\"minecraft:mark_variant\":{\"value\":2}},\"minecraft:markings_white_dots\":{\"minecraft:mark_variant\":{\"value\":3}},\"minecraft:markings_black_dots\":{\"minecraft:mark_variant\":{\"value\":4}}},\"components\":{\"minecraft:equippable\":{\"slots\":[{\"slot\":0,\"item\":\"saddle\",\"accepted_items\":[\"saddle\"],\"on_equip\":{\"event\":\"minecraft:horse_saddled\"},\"on_unequip\":{\"event\":\"minecraft:horse_unsaddled\"}},{\"slot\":1,\"item\":\"horsearmoriron\",\"accepted_items\":[\"horsearmorleather\",\"horsearmoriron\",\"horsearmorgold\",\"horsearmordiamond\"]}]},\"minecraft:type_family\":{\"family\":[\"horse\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":1.4,\"height\":1.6},\"minecraft:health\":{\"value\":{\"range_min\":15,\"range_max\":30}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":{\"range_min\":0.1125,\"range_max\":0.3375}},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:nameable\":{},\"minecraft:horse.jump_strength\":{\"value\":{\"range_min\":0.4,\"range_max\":1.0}},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:healable\":{\"items\":[{\"item\":\"wheat\",\"heal_amount\":2},{\"item\":\"sugar\",\"heal_amount\":1},{\"item\":\"hay_block\",\"heal_amount\":20},{\"item\":\"apple\",\"heal_amount\":3},{\"item\":\"golden_carrot\",\"heal_amount\":4},{\"item\":\"golden_apple\",\"heal_amount\":10},{\"item\":\"appleEnchanted\",\"heal_amount\":10}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":3,\"speed_multiplier\":1.2},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.7},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":36,\"add\":{\"component_groups\":[\"minecraft:horse_adult\",\"minecraft:horse_wild\"]}},{\"weight\":9,\"add\":{\"component_groups\":[\"minecraft:horse_baby\"]}}]},{\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_white\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_creamy\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_chestnut\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_brown\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_black\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_gray\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:base_darkbrown\"]}}]},{\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:markings_none\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:markings_white_details\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:markings_white_fields\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:markings_white_dots\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:markings_black_dots\"]}}]}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:horse_baby\"]}},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:horse_wild\"]},\"add\":{\"component_groups\":[\"minecraft:horse_tamed\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:horse_baby\"]},\"add\":{\"component_groups\":[\"minecraft:horse_adult\",\"minecraft:horse_wild\"]}},\"minecraft:horse_saddled\":{\"add\":{\"component_groups\":[\"minecraft:horse_saddled\"]}},\"minecraft:horse_unsaddled\":{\"remove\":{\"component_groups\":[\"minecraft:horse_saddled\"]}},\"minecraft:make_white\":{\"add\":{\"component_groups\":[\"minecraft:base_white\"]}},\"minecraft:make_creamy\":{\"add\":{\"component_groups\":[\"minecraft:base_creamy\"]}},\"minecraft:make_chestnut\":{\"add\":{\"component_groups\":[\"minecraft:base_chestnut\"]}},\"minecraft:make_brown\":{\"add\":{\"component_groups\":[\"minecraft:base_brown\"]}},\"minecraft:make_black\":{\"add\":{\"component_groups\":[\"minecraft:base_black\"]}},\"minecraft:make_gray\":{\"add\":{\"component_groups\":[\"minecraft:base_gray\"]}},\"minecraft:make_darkbrown\":{\"add\":{\"component_groups\":[\"minecraft:base_darkbrown\"]}}}}}'},4577:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:look_to_start_zombie_transformation\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:start_transforming\"}}},\"minecraft:start_zombie_transformation\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"minecraft:stop_transforming\"}},\"minecraft:timer\":{\"looping\":false,\"time\":30,\"time_down_event\":{\"event\":\"minecraft:convert_to_zombie\"}}},\"minecraft:convert_to_zombie\":{\"minecraft:transformation\":{\"into\":\"minecraft:zombie<minecraft:as_adult>\",\"transformation_sound\":\"convert_to_drowned\",\"drop_equipment\":true,\"delay\":{\"value\":15}},\"minecraft:is_shaking\":{}},\"minecraft:convert_to_baby_zombie\":{\"minecraft:transformation\":{\"into\":\"minecraft:zombie<minecraft:as_baby>\",\"transformation_sound\":\"convert_to_drowned\",\"drop_equipment\":true,\"delay\":{\"value\":15}},\"minecraft:is_shaking\":{}},\"minecraft:zombie_husk_baby\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.53125},\"minecraft:movement\":{\"value\":0.35}},\"minecraft:zombie_husk_adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:movement\":{\"value\":0.23},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.1,-0.35],\"lock_rider_rotation\":0}},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true},\"minecraft:scale\":{\"value\":1.0625}},\"minecraft:zombie_husk_jockey\":{\"minecraft:behavior.find_mount\":{\"priority\":1,\"within_radius\":16}}},\"components\":{\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"husk\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/zombie.json\"},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/zombie_equipment.json\"},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack\":{\"damage\":3,\"effect_name\":\"hunger\",\"effect_duration\":30},\"minecraft:variant\":{\"value\":2},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_pass_doors\":true,\"can_break_doors\":true,\"avoid_portals\":false},\"minecraft:annotation.break_door\":{},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:start_transforming\"}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.equip_item\":{\"priority\":2},\"minecraft:behavior.melee_attack\":{\"priority\":3},\"minecraft:behavior.stomp_turtle_egg\":{\"priority\":4,\"speed_multiplier\":1,\"search_range\":10,\"search_height\":2,\"goal_radius\":1.14,\"interval\":20},\"minecraft:behavior.pickup_items\":{\"priority\":6,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"reselect_targets\":true,\"within_radius\":25.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":35},{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":35,\"must_see\":false},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":35}]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":9500,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_husk_adult\"]}},{\"weight\":425,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_husk_baby\"]}},{\"weight\":75,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_husk_baby\",\"minecraft:zombie_husk_jockey\"]}}]},\"minecraft:start_transforming\":{\"add\":{\"component_groups\":[\"minecraft:start_zombie_transformation\"]},\"remove\":{\"component_groups\":[\"minecraft:look_to_start_zombie_transformation\"]}},\"minecraft:stop_transforming\":{\"add\":{\"component_groups\":[\"minecraft:look_to_start_zombie_transformation\"]},\"remove\":{\"component_groups\":[\"minecraft:start_zombie_transformation\"]}},\"minecraft:convert_to_zombie\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:convert_to_zombie\"]},\"remove\":{\"component_groups\":[\"minecraft:start_zombie_transformation\"]}},{\"filters\":{\"test\":\"has_component\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:convert_to_baby_zombie\"]},\"remove\":{\"component_groups\":[\"minecraft:start_zombie_transformation\"]}}]}}}}'},1613:e=>{e.exports='{\"format_version\":\"1.13.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:iron_golem\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:player_created\":{\"minecraft:behavior.hurt_by_target\":{\"priority\":2,\"entity_types\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"creeper\"}]}}}},\"minecraft:village_created\":{\"minecraft:behavior.defend_village_target\":{\"priority\":1,\"must_reach\":true,\"attack_chance\":0.05,\"entity_types\":{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]}}},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"defender\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":true,\"first_founding_reward\":0}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"irongolem\",\"mob\"]},\"minecraft:nameable\":{},\"minecraft:collision_box\":{\"width\":1.4,\"height\":2.9},\"minecraft:loot\":{\"table\":\"loot_tables/entities/iron_golem.json\"},\"minecraft:health\":{\"value\":100,\"max\":100},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":false,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:attack\":{\"damage\":{\"range_min\":7,\"range_max\":21}},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:knockback_resistance\":{\"value\":1.0},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":2.0},\"minecraft:preferred_path\":{\"max_fall_blocks\":1,\"jump_cost\":5,\"default_block_cost\":1.5,\"preferred_path_blocks\":[{\"cost\":0,\"blocks\":[\"grass_path\"]},{\"cost\":1,\"blocks\":[\"cobblestone\",\"stone\",\"stonebrick\",\"sandstone\",\"mossy_cobblestone\",\"stone_slab\",\"stone_slab2\",\"stone_slab3\",\"stone_slab4\",\"double_stone_slab\",\"double_stone_slab2\",\"double_stone_slab3\",\"double_stone_slab4\",\"wooden_slab\",\"double_wooden_slab\",\"planks\",\"brick_block\",\"nether_brick\",\"red_nether_brick\",\"end_bricks\",\"red_sandstone\",\"stained_glass\",\"glass\",\"glowstone\",\"prismarine\",\"emerald_block\",\"diamond_block\",\"lapis_block\",\"gold_block\",\"redstone_block\",\"purple_glazed_terracotta\",\"white_glazed_terracotta\",\"orange_glazed_terracotta\",\"magenta_glazed_terracotta\",\"light_blue_glazed_terracotta\",\"yellow_glazed_terracotta\",\"lime_glazed_terracotta\",\"pink_glazed_terracotta\",\"gray_glazed_terracotta\",\"silver_glazed_terracotta\",\"cyan_glazed_terracotta\",\"blue_glazed_terracotta\",\"brown_glazed_terracotta\",\"green_glazed_terracotta\",\"red_glazed_terracotta\",\"black_glazed_terracotta\"]},{\"cost\":50,\"blocks\":[\"bed\",\"lectern\",\"composter\",\"grindstone\",\"blast_furnace\",\"smoker\",\"fletching_table\",\"cartography_table\",\"brewing_stand\",\"smithing_table\",\"cauldron\",\"barrel\",\"loom\",\"stonecutter\"]}]},\"minecraft:behavior.target_when_pushed\":{\"priority\":1,\"percent_chance\":5.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"monster\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"creeper\"}]}}]},\"minecraft:behavior.melee_attack\":{\"priority\":1,\"track_target\":true},\"minecraft:behavior.move_towards_target\":{\"priority\":2,\"speed_multiplier\":0.9,\"within_radius\":32},\"minecraft:behavior.move_through_village\":{\"priority\":3,\"speed_multiplier\":0.6,\"only_at_night\":true},\"minecraft:behavior.move_towards_dwelling_restriction\":{\"priority\":4,\"speed_multiplier\":1},\"minecraft:behavior.offer_flower\":{\"priority\":5},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.6,\"xz_dist\":16},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"must_reach\":true,\"must_see\":true,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"monster\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"creeper\"}]},\"within_default\":10},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"hoglin\"},{\"test\":\"is_difficulty\",\"operator\":\"!=\",\"value\":\"peaceful\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zoglin\"},{\"test\":\"is_difficulty\",\"operator\":\"!=\",\"value\":\"peaceful\"}]},\"max_dist\":16}]},\"minecraft:behavior.hurt_by_target\":{\"priority\":2,\"entity_types\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"creeper\"}}},\"minecraft:persistent\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:follow_range\":{\"value\":64},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:from_player\":{\"add\":{\"component_groups\":[\"minecraft:player_created\"]}},\"minecraft:from_village\":{\"add\":{\"component_groups\":[\"minecraft:village_created\"]}}}}}'},9509:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:llama\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:llama_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[{\"item\":\"wheat\",\"growth\":0.1},{\"item\":\"hay_block\",\"growth\":0.9}],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.0}},\"minecraft:llama_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/llama.json\"},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.87},\"minecraft:behavior.breed\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":true,\"inherit_tamed\":false,\"love_filters\":{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":1},\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"hay_block\"]}},\"minecraft:llama_wandering_trader\":{\"minecraft:mark_variant\":{\"value\":1},\"minecraft:on_friendly_anger\":{\"event\":\"minecraft:defend_wandering_trader\",\"target\":\"self\"},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"all_of\":[{\"test\":\"is_leashed\",\"subject\":\"self\",\"value\":false},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:is_tamed\"}]},\"event\":\"minecraft:on_tame\"}},\"minecraft:persistent\":{}},\"minecraft:strength_1\":{\"minecraft:strength\":{\"value\":1,\"max\":5}},\"minecraft:strength_2\":{\"minecraft:strength\":{\"value\":2,\"max\":5}},\"minecraft:strength_3\":{\"minecraft:strength\":{\"value\":3,\"max\":5}},\"minecraft:strength_4\":{\"minecraft:strength\":{\"value\":4,\"max\":5}},\"minecraft:strength_5\":{\"minecraft:strength\":{\"value\":5,\"max\":5}},\"minecraft:llama_creamy\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:llama_white\":{\"minecraft:variant\":{\"value\":1}},\"minecraft:llama_brown\":{\"minecraft:variant\":{\"value\":2}},\"minecraft:llama_gray\":{\"minecraft:variant\":{\"value\":3}},\"minecraft:llama_wild\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.mount\",\"seats\":{\"position\":[0.0,1.25,-0.3]}},\"minecraft:tamemount\":{\"min_temper\":0,\"max_temper\":30,\"feed_text\":\"action.interact.feed\",\"ride_text\":\"action.interact.mount\",\"feed_items\":[{\"item\":\"wheat\",\"temper_mod\":3},{\"item\":\"hay_block\",\"temper_mod\":6}],\"auto_reject_items\":[{\"item\":\"horsearmorleather\"},{\"item\":\"horsearmoriron\"},{\"item\":\"horsearmorgold\"},{\"item\":\"horsearmordiamond\"},{\"item\":\"saddle\"}],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}}},\"minecraft:llama_tamed\":{\"minecraft:is_tamed\":{},\"minecraft:rideable\":{\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.horse\",\"seats\":{\"position\":[0.0,1.1,-0.2]}},\"minecraft:inventory\":{\"inventory_size\":16,\"container_type\":\"horse\",\"additional_slots_per_strength\":3},\"minecraft:equippable\":{\"slots\":[{\"slot\":1,\"item\":\"carpet\",\"accepted_items\":[\"carpet\"]}]}},\"minecraft:llama_unchested\":{\"minecraft:interact\":{\"interactions\":[{\"play_sounds\":\"armor.equip_generic\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"chest\"}]},\"event\":\"minecraft:on_chest\",\"target\":\"self\"},\"use_item\":true,\"interact_text\":\"action.interact.attachchest\"}]}},\"minecraft:llama_chested\":{\"minecraft:is_chested\":{}},\"minecraft:llama_angry\":{\"minecraft:angry\":{\"duration\":4,\"broadcast_anger\":false,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.ranged_attack\":{\"priority\":2,\"attack_radius\":64,\"charge_shoot_trigger\":2,\"charge_charged_trigger\":1}},\"minecraft:llama_angry_wolf\":{\"minecraft:angry\":{\"duration\":-1,\"broadcast_anger\":false,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.ranged_attack\":{\"priority\":2,\"attack_radius\":64,\"charge_shoot_trigger\":2,\"charge_charged_trigger\":1}},\"minecraft:llama_defend_trader\":{\"minecraft:angry\":{\"duration\":10,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.ranged_attack\":{\"priority\":2,\"attack_radius\":64,\"charge_shoot_trigger\":2,\"charge_charged_trigger\":1}},\"minecraft:in_caravan\":{\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"all\",\"deals_damage\":true}}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"llama\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:mark_variant\":{\"value\":0},\"minecraft:health\":{\"value\":{\"range_min\":15,\"range_max\":30}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:follow_range\":{\"value\":40,\"max\":40},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0,\"can_be_stolen\":true},\"minecraft:balloonable\":{},\"minecraft:healable\":{\"items\":[{\"item\":\"wheat\",\"heal_amount\":2},{\"item\":\"hay_block\",\"heal_amount\":10}]},\"minecraft:shooter\":{\"def\":\"minecraft:llama_spit\"},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.run_around_like_crazy\":{\"priority\":1,\"speed_multiplier\":1.2},\"minecraft:behavior.follow_caravan\":{\"priority\":3,\"speed_multiplier\":2.1,\"entity_count\":10,\"entity_types\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"llama\"}}},\"minecraft:behavior.panic\":{\"priority\":4,\"speed_multiplier\":1.2},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.7},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:behavior.mount_pathing\":{\"priority\":1,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.hurt_by_target\":{\"priority\":1,\"hurt_owner\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"all\",\"deals_damage\":true,\"on_damage\":{\"filters\":{\"test\":\"in_caravan\",\"value\":false},\"event\":\"minecraft:become_angry\"}}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"attack_interval\":16,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wolf\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_tamed\"}]},\"max_dist\":10}],\"must_see\":false,\"must_reach\":true},\"minecraft:on_target_acquired\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"target\",\"value\":\"wolf\"},{\"test\":\"has_component\",\"subject\":\"target\",\"operator\":\"!=\",\"value\":\"minecraft:is_tamed\"}]},\"event\":\"minecraft:mad_at_wolf\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"target\",\"value\":\"wolf\"},{\"test\":\"has_component\",\"subject\":\"target\",\"operator\":\"!=\",\"value\":\"minecraft:is_tamed\"}]},\"event\":\"minecraft:on_calm\",\"target\":\"self\"},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":90,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":10,\"trigger\":\"minecraft:spawn_baby\"}]}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:llama_baby\"]}},\"minecraft:from_wandering_trader\":{\"sequence\":[{\"add\":{\"component_groups\":[\"minecraft:llama_adult\",\"minecraft:llama_wandering_trader\"]}},{\"trigger\":\"minecraft:add_attributes\"}]},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:llama_baby\"]},\"add\":{\"component_groups\":[\"minecraft:llama_adult\",\"minecraft:llama_wild\"]}},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:llama_wild\"]},\"add\":{\"component_groups\":[\"minecraft:llama_tamed\",\"minecraft:llama_unchested\"]}},\"minecraft:join_caravan\":{\"add\":{\"component_groups\":[\"minecraft:in_caravan\"]}},\"minecraft:leave_caravan\":{\"remove\":{\"component_groups\":[\"minecraft:in_caravan\"]}},\"minecraft:mad_at_wolf\":{\"add\":{\"component_groups\":[\"minecraft:llama_angry_wolf\"]}},\"minecraft:defend_wandering_trader\":{\"add\":{\"component_groups\":[\"minecraft:llama_defend_trader\"]}},\"minecraft:become_angry\":{\"add\":{\"component_groups\":[\"minecraft:llama_angry\"]}},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:llama_angry\",\"minecraft:llama_angry_wolf\",\"minecraft:llama_defend_trader\"]}},\"minecraft:on_chest\":{\"remove\":{\"component_groups\":[\"minecraft:llama_unchested\"]},\"add\":{\"component_groups\":[\"minecraft:llama_chested\"]}},\"minecraft:add_attributes\":{\"sequence\":[{\"randomize\":[{\"weight\":32,\"add\":{\"component_groups\":[\"minecraft:strength_1\"]}},{\"weight\":32,\"add\":{\"component_groups\":[\"minecraft:strength_2\"]}},{\"weight\":32,\"add\":{\"component_groups\":[\"minecraft:strength_3\"]}},{\"weight\":2,\"add\":{\"component_groups\":[\"minecraft:strength_4\"]}},{\"weight\":2,\"add\":{\"component_groups\":[\"minecraft:strength_5\"]}}]},{\"randomize\":[{\"weight\":25,\"add\":{\"component_groups\":[\"minecraft:llama_creamy\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"minecraft:llama_white\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"minecraft:llama_brown\"]}},{\"weight\":25,\"add\":{\"component_groups\":[\"minecraft:llama_gray\"]}}]}]},\"minecraft:spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:llama_baby\"]},\"trigger\":\"minecraft:add_attributes\"},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:llama_adult\",\"minecraft:llama_wild\"]},\"trigger\":\"minecraft:add_attributes\"}}}}'},4627:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:magma_cube\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:slime_large\":{\"minecraft:collision_box\":{\"width\":2.08,\"height\":2.08},\"minecraft:health\":{\"value\":16,\"max\":16},\"minecraft:movement\":{\"value\":0.75},\"minecraft:attack\":{\"damage\":6},\"minecraft:loot\":{\"table\":\"loot_tables/entities/magma_cube.json\"}},\"minecraft:slime_medium\":{\"minecraft:collision_box\":{\"width\":0.78,\"height\":0.78},\"minecraft:health\":{\"value\":4,\"max\":4},\"minecraft:movement\":{\"value\":0.66},\"minecraft:attack\":{\"damage\":4},\"minecraft:loot\":{\"table\":\"loot_tables/entities/magma_cube.json\"}},\"minecraft:slime_small\":{\"minecraft:collision_box\":{\"width\":0.52,\"height\":0.52},\"minecraft:health\":{\"value\":1,\"max\":1},\"minecraft:movement\":{\"value\":0.6},\"minecraft:attack\":{\"damage\":2}},\"minecraft:slime_calm\":{\"minecraft:movement.jump\":{\"jump_delay\":[2.0,6.0]}},\"minecraft:slime_aggressive\":{\"minecraft:movement.jump\":{\"jump_delay\":[0.667,2.0]}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? query.variant : 0\"},\"minecraft:type_family\":{\"family\":[\"magmacube\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_lava\":true},\"minecraft:nameable\":{},\"minecraft:fire_immune\":{},\"minecraft:burns_in_daylight\":false,\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true},\"minecraft:jump.static\":{},\"minecraft:movement.jump\":{\"jump_delay\":[2.0,6.0]},\"minecraft:can_climb\":{},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_aggressive\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:become_calm\",\"target\":\"self\"},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.slime_float\":{\"priority\":1,\"jump_chance_percentage\":0.8,\"speed_multiplier\":1.2},\"minecraft:behavior.slime_attack\":{\"priority\":3},\"minecraft:behavior.slime_random_direction\":{\"priority\":4,\"add_random_time_range\":3,\"turn_range\":360,\"min_change_direction_time\":2.0},\"minecraft:behavior.slime_keep_on_jumping\":{\"priority\":5,\"speed_multiplier\":1.0},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16}],\"must_see\":true},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:slime_calm\"]}},\"minecraft:become_calm\":{\"add\":{\"component_groups\":[\"minecraft:slime_calm\"]}},\"minecraft:become_aggressive\":{\"add\":{\"component_groups\":[\"minecraft:slime_aggressive\"]}}}}}'},65:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:mooshroom_become_cow\":{\"minecraft:transformation\":{\"into\":\"minecraft:cow\"}},\"minecraft:cow_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"wheat\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"minecraft:cow_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/mooshroom.json\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breed_items\":\"wheat\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"deny_parents_variant\":{\"chance\":0.00098,\"min_variant\":0,\"max_variant\":1}},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"bowl\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:transformation\"}]},\"event\":\"minecraft:flowerless\",\"target\":\"self\"},\"add_items\":{\"table\":\"loot_tables/gameplay/entities/mooshroom_milking.json\"},\"use_item\":true,\"play_sounds\":\"milk_suspiciously\",\"interact_text\":\"action.interact.moostew\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:2\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":7}]},\"event\":\"minecraft:ate_allium\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:3\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":3}]},\"event\":\"minecraft:ate_bluet\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:1\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":6}]},\"event\":\"minecraft:ate_orchid\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:9\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":1}]},\"event\":\"minecraft:ate_cornflower\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"yellow_flower\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":5}]},\"event\":\"minecraft:ate_dandelion\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:10\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":4}]},\"event\":\"minecraft:ate_lily\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:8\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":8}]},\"event\":\"minecraft:ate_daisy\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:0\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":0}]},\"event\":\"minecraft:ate_poppy\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:4\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:5\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:6\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"red_flower:7\"}],\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":2}]},\"event\":\"minecraft:ate_tulip\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"wither_rose\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1},{\"test\":\"is_mark_variant\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":9}]},\"event\":\"minecraft:ate_rose\",\"target\":\"self\"},\"use_item\":true,\"play_sounds\":\"eat\",\"particle_on_start\":{\"particle_type\":\"smoke\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.feed\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"shears\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:transformation\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":0}]},\"event\":\"become_cow\",\"target\":\"self\"},\"use_item\":false,\"hurt_item\":1,\"play_sounds\":\"shear\",\"spawn_items\":{\"table\":\"loot_tables/entities/mooshroom_shear.json\"},\"particle_on_start\":{\"particle_type\":\"largeexplode\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.mooshear\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"shears\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:transformation\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1}]},\"event\":\"become_cow\",\"target\":\"self\"},\"use_item\":false,\"hurt_item\":1,\"play_sounds\":\"shear\",\"spawn_items\":{\"table\":\"loot_tables/entities/brown_mooshroom_shear.json\"},\"particle_on_start\":{\"particle_type\":\"largeexplode\",\"particle_y_offset\":0.25,\"particle_offset_towards_interactor\":true},\"interact_text\":\"action.interact.mooshear\"},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"bucket:0\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]}},\"use_item\":true,\"transform_to_item\":\"bucket:1\",\"play_sounds\":\"milk\",\"interact_text\":\"action.interact.milk\"}]}},\"minecraft:mooshroom_fed_nothing\":{\"minecraft:mark_variant\":{\"value\":-1}},\"minecraft:mooshroom_brown_fed_poppy\":{\"minecraft:mark_variant\":{\"value\":0}},\"minecraft:mooshroom_brown_fed_cornflower\":{\"minecraft:mark_variant\":{\"value\":1}},\"minecraft:mooshroom_brown_fed_tulips\":{\"minecraft:mark_variant\":{\"value\":2}},\"minecraft:mooshroom_brown_fed_azure_bluet\":{\"minecraft:mark_variant\":{\"value\":3}},\"minecraft:mooshroom_brown_fed_lily_of_the_valley\":{\"minecraft:mark_variant\":{\"value\":4}},\"minecraft:mooshroom_brown_fed_dandelion\":{\"minecraft:mark_variant\":{\"value\":5}},\"minecraft:mooshroom_brown_fed_blue_orchid\":{\"minecraft:mark_variant\":{\"value\":6}},\"minecraft:mooshroom_brown_fed_allium\":{\"minecraft:mark_variant\":{\"value\":7}},\"minecraft:mooshroom_brown_fed_oxeye_daisy\":{\"minecraft:mark_variant\":{\"value\":8}},\"minecraft:mooshroom_brown_fed_wither_rose\":{\"minecraft:mark_variant\":{\"value\":9}},\"minecraft:mooshroom_red\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:mooshroom_brown\":{\"minecraft:variant\":{\"value\":1}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"mushroomcow\",\"mob\"]},\"minecraft:mark_variant\":{\"value\":-1},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.3},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.105,0.0]}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.25,\"items\":[\"wheat\"]},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.1},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:damage_sensor\":{\"triggers\":[{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"lightning\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":0}]},\"event\":\"minecraft:become_brown\"},\"deals_damage\":false,\"on_damage_sound_event\":\"convert_mooshroom\"},{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"lightning\"},{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":1}]},\"event\":\"minecraft:become_red\"},\"deals_damage\":false,\"on_damage_sound_event\":\"convert_mooshroom\"}]}},\"events\":{\"become_cow\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:mooshroom_become_cow\"]}},\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:cow_adult\",\"minecraft:mooshroom_red\"]}},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:cow_baby\",\"minecraft:mooshroom_red\"]}}]},\"minecraft:entity_born\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:cow_baby\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:cow_baby\"]},\"add\":{\"component_groups\":[\"minecraft:cow_adult\"]}},\"minecraft:flowerless\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_fed_nothing\"]}},\"minecraft:ate_allium\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_allium\"]}},\"minecraft:ate_cornflower\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_cornflower\"]}},\"minecraft:ate_lily\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_lily_of_the_valley\"]}},\"minecraft:ate_rose\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_wither_rose\"]}},\"minecraft:ate_orchid\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_blue_orchid\"]}},\"minecraft:ate_daisy\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_oxeye_daisy\"]}},\"minecraft:ate_tulip\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_tulips\"]}},\"minecraft:ate_bluet\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_azure_bluet\"]}},\"minecraft:ate_poppy\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_poppy\"]}},\"minecraft:ate_dandelion\":{\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown_fed_dandelion\"]}},\"minecraft:become_red\":{\"remove\":{\"component_groups\":[\"minecraft:mooshroom_brown\"]},\"add\":{\"component_groups\":[\"minecraft:mooshroom_red\",\"minecraft:mooshroom_fed_nothing\"]}},\"minecraft:become_brown\":{\"remove\":{\"component_groups\":[\"minecraft:mooshroom_red\"]},\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown\",\"minecraft:mooshroom_fed_nothing\"]}},\"minecraft:become_brown_adult\":{\"remove\":{\"component_groups\":[\"minecraft:mooshroom_red\"]},\"add\":{\"component_groups\":[\"minecraft:mooshroom_brown\",\"minecraft:cow_adult\",\"minecraft:mooshroom_fed_nothing\"]}},\"minecraft:become_red_adult\":{\"remove\":{\"component_groups\":[\"minecraft:mooshroom_brown\",\"minecraft:cow_baby\"]},\"add\":{\"component_groups\":[\"minecraft:mooshroom_red\",\"minecraft:cow_adult\"]}}}}}'},3373:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:mule_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale_by_age\":{\"start_scale\":0.5,\"end_scale\":1.0},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[{\"item\":\"wheat\",\"growth\":0.016667},{\"item\":\"sugar\",\"growth\":0.025},{\"item\":\"hay_block\",\"growth\":0.15},{\"item\":\"apple\",\"growth\":0.05},{\"item\":\"golden_carrot\",\"growth\":0.05},{\"item\":\"golden_apple\",\"growth\":0.2},{\"item\":\"appleEnchanted\",\"growth\":0.2}],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":4,\"speed_multiplier\":1.0}},\"minecraft:mule_adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/horse.json\"},\"minecraft:behavior.run_around_like_crazy\":{\"priority\":1,\"speed_multiplier\":1.2}},\"minecraft:mule_wild\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"player\",\"zombie\"],\"interact_text\":\"action.interact.mount\",\"seats\":{\"position\":[0.0,0.975,-0.2]}},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:tamemount\":{\"min_temper\":0,\"max_temper\":100,\"feed_text\":\"action.interact.feed\",\"ride_text\":\"action.interact.mount\",\"feed_items\":[{\"item\":\"wheat\",\"temper_mod\":3},{\"item\":\"sugar\",\"temper_mod\":3},{\"item\":\"apple\",\"temper_mod\":3},{\"item\":\"golden_carrot\",\"temper_mod\":5},{\"item\":\"golden_apple\",\"temper_mod\":10},{\"item\":\"appleEnchanted\",\"temper_mod\":10}],\"auto_reject_items\":[{\"item\":\"horsearmorleather\"},{\"item\":\"horsearmoriron\"},{\"item\":\"horsearmorgold\"},{\"item\":\"horsearmordiamond\"},{\"item\":\"saddle\"}],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}}},\"minecraft:mule_tamed\":{\"minecraft:is_tamed\":{},\"minecraft:equippable\":{\"slots\":[{\"slot\":0,\"item\":\"saddle\",\"accepted_items\":[\"saddle\"],\"on_equip\":{\"event\":\"minecraft:mule_saddled\"},\"on_unequip\":{\"event\":\"minecraft:mule_unsaddled\"}}]},\"minecraft:rideable\":{\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.horse\",\"seats\":{\"position\":[0.0,0.975,-0.2]}},\"minecraft:inventory\":{\"inventory_size\":16,\"container_type\":\"horse\"},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.2,\"items\":[\"apple\",\"carrot\",\"golden_apple\",\"appleEnchanted\",\"golden_carrot\",\"carrotOnAStick\",\"hay_block\",\"sugar\",\"bread\",\"wheat\"]}},\"minecraft:mule_unchested\":{\"minecraft:interact\":{\"interactions\":[{\"play_sounds\":\"armor.equip_generic\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"chest\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:on_chest\",\"target\":\"self\"},\"use_item\":true,\"interact_text\":\"action.interact.attachchest\"}]}},\"minecraft:mule_chested\":{\"minecraft:is_chested\":{}},\"minecraft:mule_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:input_ground_controlled\":{},\"minecraft:can_power_jump\":{},\"minecraft:behavior.player_ride_tamed\":{}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"mule\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":1.4,\"height\":1.6},\"minecraft:health\":{\"value\":{\"range_min\":15,\"range_max\":30}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.175},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:nameable\":{},\"minecraft:horse.jump_strength\":{\"value\":0.5},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:healable\":{\"items\":[{\"item\":\"wheat\",\"heal_amount\":2},{\"item\":\"sugar\",\"heal_amount\":1},{\"item\":\"hay_block\",\"heal_amount\":20},{\"item\":\"apple\",\"heal_amount\":3},{\"item\":\"golden_carrot\",\"heal_amount\":4},{\"item\":\"golden_apple\",\"heal_amount\":10},{\"item\":\"appleEnchanted\",\"heal_amount\":10}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.2},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.7},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":80,\"add\":{\"component_groups\":[\"minecraft:mule_adult\",\"minecraft:mule_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:mule_baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:mule_baby\"]}},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:mule_wild\"]},\"add\":{\"component_groups\":[\"minecraft:mule_tamed\",\"minecraft:mule_unchested\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:mule_baby\"]},\"add\":{\"component_groups\":[\"minecraft:mule_adult\",\"minecraft:mule_wild\"]}},\"minecraft:on_chest\":{\"remove\":{\"component_groups\":[\"minecraft:mule_unchested\"]},\"add\":{\"component_groups\":[\"minecraft:mule_chested\"]}},\"minecraft:mule_saddled\":{\"add\":{\"component_groups\":[\"minecraft:mule_saddled\"]}},\"minecraft:mule_unsaddled\":{\"remove\":{\"component_groups\":[\"minecraft:mule_saddled\"]}}}}}'},7111:e=>{e.exports='{\"format_version\":\"1.19.30\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:npc\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"all\",\"deals_damage\":false}},\"minecraft:type_family\":{\"family\":[\"npc\",\"mob\"]},\"minecraft:fire_immune\":true,\"minecraft:movement\":{\"value\":0.5},\"minecraft:loot\":{\"table\":\"loot_tables/empty.json\"},\"minecraft:collision_box\":{\"width\":0.6,\"height\":2.1},\"minecraft:behavior.look_at_player\":{\"priority\":0,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:persistent\":{},\"minecraft:npc\":{\"npc_data\":{\"portrait_offsets\":{\"translate\":[-7,50,0],\"scale\":[1.75,1.75,1.75]},\"picker_offsets\":{\"translate\":[0,20,0],\"scale\":[1.7,1.7,1.7]},\"skin_list\":[{\"variant\":0}]}},\"minecraft:nameable\":{\"always_show\":false,\"allow_name_tag_renaming\":false},\"minecraft:physics\":{}}}}'},4528:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:ocelot\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:ocelot_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"fish\",\"salmon\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"minecraft:ocelot_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/ocelot.json\"},\"minecraft:scale\":{\"value\":1}},\"minecraft:ocelot_wild\":{\"minecraft:trusting\":{\"probability\":0.33,\"trust_items\":[\"fish\",\"salmon\"],\"trust_event\":{\"event\":\"minecraft:on_trust\",\"target\":\"self\"}},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":0.5,\"within_radius\":16,\"can_get_scared\":true,\"items\":[\"fish\",\"salmon\"]},\"minecraft:behavior.avoid_mob_type\":{\"priority\":5,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":10,\"walk_speed_multiplier\":0.8,\"sprint_speed_multiplier\":1.33}]},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.35,0.0]}}},\"minecraft:ocelot_trusting\":{\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":0.5,\"within_radius\":16,\"items\":[\"fish\",\"salmon\"]},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"fish\",\"salmon\"]}},\"minecraft:ocelot_tame\":{\"minecraft:is_tamed\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:sittable\":{},\"minecraft:behavior.follow_owner\":{\"priority\":4,\"speed_multiplier\":1.0,\"start_distance\":10,\"stop_distance\":2},\"minecraft:behavior.stay_while_sitting\":{\"priority\":3},\"minecraft:behavior.ocelot_sit_on_block\":{\"priority\":6,\"speed_multiplier\":1.0}}},\"components\":{\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack_damage\":{\"value\":4},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"ocelot\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.7},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"reselect_targets\":true,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"chicken\"},\"max_dist\":8},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":8}]},\"minecraft:behavior.mount_pathing\":{\"priority\":1,\"speed_multiplier\":1.25,\"target_dist\":0,\"track_target\":true},\"minecraft:behavior.leap_at_target\":{\"priority\":3,\"target_dist\":0.3},\"minecraft:behavior.ocelotattack\":{\"priority\":4,\"cooldown_time\":1.0,\"x_max_rotation\":30.0,\"y_max_head_rotation\":30.0,\"max_distance\":15.0,\"max_sneak_range\":15.0,\"max_sprint_range\":4.0,\"reach_multiplier\":2.0,\"sneak_speed_multiplier\":0.6,\"sprint_speed_multiplier\":1.33,\"walk_speed_multiplier\":0.8},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":9},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0,\"on_leash\":{\"event\":\"minecraft:on_leash\",\"target\":\"self\"},\"on_unleash\":{\"event\":\"minecraft:on_unleash\",\"target\":\"self\"}},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":3,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:ocelot_adult\",\"minecraft:ocelot_wild\"]}},{\"weight\":1,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:ocelot_baby\",\"minecraft:ocelot_wild\"]}}]}]},\"minecraft:entity_born\":{\"sequence\":[{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:ocelot_baby\",\"minecraft:ocelot_trusting\"]}}]},\"minecraft:entity_born_wild\":{\"remove\":{\"component_groups\":[\"minecraft:ocelot_trusting\"]},\"add\":{\"component_groups\":[\"minecraft:ocelot_baby\",\"minecraft:ocelot_wild\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:ocelot_baby\"]},\"add\":{\"component_groups\":[\"minecraft:ocelot_adult\"]}},\"minecraft:on_trust\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:ocelot_wild\"]}},{\"add\":{\"component_groups\":[\"minecraft:ocelot_trusting\"]}}]},\"minecraft:on_leash\":{\"add\":{\"component_groups\":[\"minecraft:ocelot_leashed\"]}},\"minecraft:on_unleash\":{\"remove\":{\"component_groups\":[\"minecraft:ocelot_leashed\"]}}}}}'},88:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:panda_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.4},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"bamboo\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.roll\":{\"priority\":12,\"probability\":0.0016},\"minecraft:behavior.follow_parent\":{\"priority\":13,\"speed_multiplier\":1.1},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:on_scared\",\"target\":\"self\"},\"minecraft:behavior.sneeze\":{\"priority\":7,\"probability\":0.0001666,\"cooldown_time\":1.0,\"within_radius\":10.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"panda\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true},{\"test\":\"on_ground\",\"operator\":\"==\",\"value\":true}]},\"max_dist\":10}],\"drop_item_chance\":0.001,\"loot_table\":\"loot_tables/entities/panda_sneeze.json\",\"prepare_sound\":\"presneeze\",\"prepare_time\":1.0,\"sound\":\"sneeze\"}},\"minecraft:panda_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/panda.json\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"blend_attributes\":false,\"environment_requirements\":{\"blocks\":\"bamboo\",\"count\":8,\"radius\":5},\"breed_items\":\"bamboo\",\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"mutation_factor\":{\"variant\":1.0}},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"},\"minecraft:attack\":{\"damage\":2.0},\"minecraft:behavior.melee_attack\":{\"priority\":2,\"attack_once\":true,\"track_target\":true,\"reach_multiplier\":1.0}},\"minecraft:panda_lazy\":{\"minecraft:variant\":{\"value\":1},\"minecraft:behavior.lay_down\":{\"priority\":5,\"interval\":400,\"random_stop_interval\":2000},\"minecraft:behavior.random_sitting\":{\"priority\":6,\"start_chance\":0.02,\"stop_chance\":0.2,\"cooldown\":25,\"min_sit_time\":15},\"minecraft:behavior.snacking\":{\"priority\":3,\"snacking_cooldown\":17.5,\"snacking_cooldown_min\":10,\"snacking_stop_chance\":0.0011,\"items\":[\"bamboo\",\"cake\"]},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2.5},\"minecraft:movement\":{\"value\":0.07}},\"minecraft:panda_worried\":{\"minecraft:variant\":{\"value\":2},\"minecraft:behavior.scared\":{\"priority\":1,\"sound_interval\":20},\"minecraft:behavior.avoid_mob_type\":{\"priority\":5,\"max_dist\":16,\"max_flee\":20,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"operator\":\"!=\",\"subject\":\"other\",\"value\":\"panda\"},\"max_dist\":16,\"sprint_speed_multiplier\":1.5}]}},\"minecraft:panda_playful\":{\"minecraft:variant\":{\"value\":3},\"minecraft:behavior.roll\":{\"priority\":12,\"probability\":0.013}},\"minecraft:panda_brown\":{\"minecraft:variant\":{\"value\":4}},\"minecraft:panda_weak\":{\"minecraft:variant\":{\"value\":5},\"minecraft:health\":{\"value\":10,\"max\":10}},\"minecraft:panda_sneezing\":{\"minecraft:behavior.sneeze\":{\"priority\":7,\"probability\":0.002,\"cooldown_time\":1.0,\"within_radius\":10.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"panda\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true},{\"test\":\"on_ground\",\"operator\":\"==\",\"value\":true}]},\"max_dist\":10}],\"drop_item_chance\":0.001,\"loot_table\":\"loot_tables/entities/panda_sneeze.json\",\"prepare_sound\":\"presneeze\",\"prepare_time\":1.0,\"sound\":\"sneeze\"}},\"minecraft:panda_aggressive\":{\"minecraft:type_family\":{\"family\":[\"panda\",\"panda_aggressive\",\"mob\"]},\"minecraft:variant\":{\"value\":6},\"minecraft:attack\":{\"damage\":6.0},\"minecraft:behavior.melee_attack\":{\"priority\":2,\"track_target\":true,\"reach_multiplier\":1.0},\"minecraft:on_friendly_anger\":{\"event\":\"minecraft:on_anger\",\"target\":\"self\"},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25,\"ignore_mob_damage\":true}},\"minecraft:panda_angry\":{\"minecraft:angry\":{\"duration\":500,\"broadcast_anger\":true,\"broadcast_range\":41,\"broadcast_filters\":{\"test\":\"is_family\",\"operator\":\"==\",\"value\":\"panda_aggressive\"},\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:on_target_acquired\":{}},\"minecraft:baby_scared\":{\"minecraft:angry\":{\"duration\":1,\"broadcast_anger\":true,\"broadcast_range\":41,\"broadcast_filters\":{\"test\":\"is_family\",\"operator\":\"==\",\"value\":\"panda_aggressive\"},\"calm_event\":{\"event\":\"minecraft:baby_on_calm\",\"target\":\"self\"}}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"panda\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:navigation.walk\":{\"can_float\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:scale\":{\"value\":1.0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:giveable\":{\"triggers\":{\"cooldown\":3.0,\"items\":[\"bamboo\",\"cake\"],\"on_give\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}}},\"minecraft:inventory\":{\"inventory_size\":1,\"private\":true},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":1.7,\"height\":1.5},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.15},\"minecraft:water_movement\":{\"drag_factor\":0.98},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.random_sitting\":{\"priority\":5,\"start_chance\":0.01,\"stop_chance\":0.3,\"cooldown\":30,\"min_sit_time\":10},\"minecraft:behavior.snacking\":{\"priority\":2,\"snacking_cooldown\":22.5,\"snacking_cooldown_min\":20,\"snacking_stop_chance\":0.001334,\"items\":[\"bamboo\",\"cake\"]},\"minecraft:behavior.mount_pathing\":{\"priority\":5,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.25,\"items\":[\"bamboo\"]},\"minecraft:behavior.random_stroll\":{\"priority\":14,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:balloonable\":{\"mass\":1.5},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.105,0.0]}},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:variant\":{\"value\":0},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:genetics\":{\"mutation_rate\":0.03125,\"genes\":[{\"name\":\"panda_variant\",\"allele_range\":{\"range_min\":0,\"range_max\":15},\"genetic_variants\":[{\"main_allele\":0,\"birth_event\":{\"event\":\"minecraft:panda_lazy\",\"target\":\"self\"}},{\"main_allele\":1,\"birth_event\":{\"event\":\"minecraft:panda_worried\",\"target\":\"self\"}},{\"main_allele\":2,\"birth_event\":{\"event\":\"minecraft:panda_playful\",\"target\":\"self\"}},{\"main_allele\":3,\"birth_event\":{\"event\":\"minecraft:panda_aggressive\",\"target\":\"self\"}},{\"both_allele\":{\"range_min\":4,\"range_max\":7},\"birth_event\":{\"event\":\"minecraft:panda_weak\",\"target\":\"self\"}},{\"both_allele\":{\"range_min\":8,\"range_max\":9},\"birth_event\":{\"event\":\"minecraft:panda_brown\",\"target\":\"self\"}}]}]}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"add\":{\"component_groups\":[\"minecraft:panda_adult\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"minecraft:panda_baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:panda_baby\"]}},\"minecraft:ageable_grow_up\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:panda_baby\"]}},{\"add\":{\"component_groups\":[\"minecraft:panda_adult\"]}},{\"filters\":{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":3},\"add\":{\"component_groups\":[\"minecraft:panda_playful\"]}},{\"filters\":{\"test\":\"is_variant\",\"subject\":\"self\",\"operator\":\"==\",\"value\":6},\"add\":{\"component_groups\":[\"minecraft:panda_aggressive\"]}}]},\"minecraft:panda_lazy\":{\"add\":{\"component_groups\":[\"minecraft:panda_lazy\"]}},\"minecraft:panda_worried\":{\"add\":{\"component_groups\":[\"minecraft:panda_worried\"]}},\"minecraft:panda_playful\":{\"add\":{\"component_groups\":[\"minecraft:panda_playful\"]}},\"minecraft:panda_brown\":{\"add\":{\"component_groups\":[\"minecraft:panda_brown\"]}},\"minecraft:panda_weak\":{\"sequence\":[{\"add\":{\"component_groups\":[\"minecraft:panda_weak\"]}},{\"filters\":{\"test\":\"has_component\",\"operator\":\"==\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:panda_sneezing\"]}}]},\"minecraft:panda_aggressive\":{\"add\":{\"component_groups\":[\"minecraft:panda_aggressive\"]}},\"minecraft:on_scared\":{\"add\":{\"component_groups\":[\"minecraft:baby_scared\"]}},\"minecraft:baby_on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:baby_scared\"]}},\"minecraft:become_angry\":{\"add\":{\"component_groups\":[\"minecraft:panda_angry\"]}},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:panda_angry\"]}}}}}'},280:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:parrot\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:parrot_red\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:parrot_blue\":{\"minecraft:variant\":{\"value\":1}},\"minecraft:parrot_green\":{\"minecraft:variant\":{\"value\":2}},\"minecraft:parrot_cyan\":{\"minecraft:variant\":{\"value\":3}},\"minecraft:parrot_silver\":{\"minecraft:variant\":{\"value\":4}},\"minecraft:parrot_adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/parrot.json\"}},\"minecraft:parrot_wild\":{\"minecraft:type_family\":{\"family\":[\"parrot_wild\",\"mob\"]},\"minecraft:tameable\":{\"probability\":0.33,\"tame_items\":[\"wheat_seeds\",\"pumpkin_seeds\",\"melon_seeds\",\"beetroot_seeds\"],\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}},\"minecraft:behavior.random_fly\":{\"priority\":2,\"xz_dist\":15,\"y_dist\":1,\"y_offset\":0,\"speed_multiplier\":1.0,\"can_land_on_trees\":true,\"avoid_damage_blocks\":true},\"minecraft:behavior.follow_mob\":{\"priority\":3,\"speed_multiplier\":1.0,\"stop_distance\":3,\"search_range\":20}},\"minecraft:parrot_tame\":{\"minecraft:type_family\":{\"family\":[\"parrot_tame\",\"mob\"]},\"minecraft:is_tamed\":{},\"minecraft:behavior.follow_owner\":{\"priority\":2,\"speed_multiplier\":1.0,\"start_distance\":5,\"stop_distance\":1},\"minecraft:sittable\":{},\"minecraft:behavior.stay_while_sitting\":{\"priority\":1},\"minecraft:behavior.find_mount\":{\"priority\":3,\"within_radius\":16,\"avoid_water\":true,\"start_delay\":100,\"target_needed\":false,\"mount_distance\":2.0}}},\"components\":{\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.5,\"height\":1},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.4},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:jump.static\":{},\"minecraft:can_fly\":{},\"minecraft:navigation.fly\":{\"can_path_over_water\":true,\"can_path_from_air\":true},\"minecraft:movement.fly\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":0,\"speed_multiplier\":1.25},\"minecraft:behavior.look_at_player\":{\"priority\":1,\"look_distance\":8.0},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:healable\":{\"force_use\":true,\"filters\":{\"test\":\"is_riding\",\"operator\":\"!=\",\"value\":true},\"items\":[{\"item\":\"cookie\",\"heal_amount\":0,\"effects\":[{\"name\":\"fatal_poison\",\"chance\":1.0,\"duration\":1000,\"amplifier\":0}]}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:parrot_red\",\"minecraft:parrot_adult\",\"minecraft:parrot_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:parrot_blue\",\"minecraft:parrot_adult\",\"minecraft:parrot_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:parrot_green\",\"minecraft:parrot_adult\",\"minecraft:parrot_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:parrot_cyan\",\"minecraft:parrot_adult\",\"minecraft:parrot_wild\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"minecraft:parrot_silver\",\"minecraft:parrot_adult\",\"minecraft:parrot_wild\"]}}]},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:parrot_wild\"]},\"add\":{\"component_groups\":[\"minecraft:parrot_tame\"]}}}}}'},5937:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"phantom\",\"undead\",\"monster\",\"mob\"]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/phantom.json\"},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:physics\":{\"has_gravity\":false},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:attack\":{\"damage\":6},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":false},\"minecraft:collision_box\":{\"width\":0.9,\"height\":0.5},\"minecraft:movement\":{\"value\":1.8},\"minecraft:movement.glide\":{\"start_speed\":0.1,\"speed_when_turning\":0.2},\"minecraft:burns_in_daylight\":{},\"minecraft:follow_range\":{\"value\":64,\"max\":64},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.avoid_mob_type\":{\"priority\":0,\"max_dist\":16.0,\"ignore_visibility\":true,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"ocelot\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cat\"}]},\"max_dist\":16}]},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"reselect_targets\":true,\"scan_interval\":20,\"within_radius\":64.0,\"must_see_forget_duration\":0.5,\"target_search_height\":80.0,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":64}]},\"minecraft:behavior.swoop_attack\":{\"priority\":2,\"damage_reach\":0.2,\"speed_multiplier\":1.0,\"delay_range\":[10.0,20.0]},\"minecraft:behavior.circle_around_anchor\":{\"priority\":3,\"radius_change\":1.0,\"radius_adjustment_chance\":0.004,\"height_adjustment_chance\":0.002857,\"goal_radius\":1.0,\"angle_change\":15.0,\"radius_range\":[5.0,15.0],\"height_offset_range\":[-4.0,5.0],\"height_above_target_range\":[20.0,40.0]}}}}'},6068:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:pig_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"carrot\",\"beetroot\",\"potato\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"minecraft:pig_transform\":{\"minecraft:transformation\":{\"into\":\"minecraft:pig_zombie\",\"delay\":0.5}},\"minecraft:pig_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/pig.json\"},\"minecraft:behavior.breed\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"carrot\",\"beetroot\",\"potato\"]}},\"minecraft:pig_unsaddled\":{\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"saddle\"},\"event\":\"minecraft:on_saddled\"},\"use_item\":true,\"play_sounds\":\"saddle\",\"interact_text\":\"action.interact.saddle\"}]},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.63,0.0]}}},\"minecraft:pig_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/pig_saddled.json\"},\"minecraft:boostable\":{\"speed_multiplier\":2.0,\"duration\":3.0,\"boost_items\":[{\"item\":\"carrotOnAStick\",\"damage\":2,\"replace_item\":\"fishing_rod\"}]},\"minecraft:rideable\":{\"seat_count\":1,\"interact_text\":\"action.interact.mount\",\"family_types\":[\"player\"],\"seats\":{\"position\":[0.0,0.63,0.0]}},\"minecraft:item_controllable\":{\"control_items\":\"carrotOnAStick\"},\"minecraft:behavior.controlled_by_player\":{\"priority\":0}}},\"components\":{\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"lightning\"},{\"test\":\"is_difficulty\",\"operator\":\"!=\",\"value\":\"peaceful\"}],\"event\":\"become_zombie\"},\"deals_damage\":false}},\"minecraft:type_family\":{\"family\":[\"pig\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":0.9,\"height\":0.9},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.75},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.mount_pathing\":{\"priority\":1,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.float\":{\"priority\":2},\"minecraft:behavior.panic\":{\"priority\":3,\"speed_multiplier\":1.25},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.2,\"items\":[\"potato\",\"carrot\",\"beetroot\",\"carrotOnAStick\"]},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"become_zombie\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:pig_transform\"]}},\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:pig_baby\"]}}]},\"minecraft:entity_born\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:pig_baby\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:pig_baby\"]},\"add\":{\"component_groups\":[\"minecraft:pig_adult\",\"minecraft:pig_unsaddled\"]}},\"minecraft:on_saddled\":{\"remove\":{\"component_groups\":[\"minecraft:pig_unsaddled\"]},\"add\":{\"component_groups\":[\"minecraft:pig_saddled\"]}},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:pig_adult\",\"minecraft:pig_unsaddled\"]}}}}}'},4719:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:piglin\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"zombification_sensor\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"in_nether\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"start_zombification_event\"}}},\"start_zombification\":{\"minecraft:is_shaking\":{},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"in_nether\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"stop_zombification_event\"}},\"minecraft:timer\":{\"looping\":false,\"time\":15,\"time_down_event\":{\"event\":\"become_zombie_event\"}}},\"become_zombie\":{\"minecraft:transformation\":{\"into\":\"minecraft:zombie_pigman\",\"transformation_sound\":\"converted_to_zombified\",\"keep_level\":true,\"drop_inventory\":true,\"preserve_equipment\":true}},\"ranged_unit\":{\"minecraft:behavior.ranged_attack\":{\"priority\":8,\"attack_interval_min\":1,\"attack_interval_max\":1,\"attack_radius\":8,\"attack_radius_min\":4,\"speed_multiplier\":1.0,\"target_in_sight_time\":0.1},\"minecraft:shooter\":{\"def\":\"minecraft:arrow\"},\"minecraft:behavior.charge_held_item\":{\"priority\":3,\"items\":[\"minecraft:arrow\"]},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/piglin_gear_ranged.json\"},\"minecraft:variant\":{\"value\":0}},\"melee_unit\":{\"minecraft:behavior.melee_attack\":{\"priority\":8,\"speed_multiplier\":1.0,\"track_target\":true},\"minecraft:attack\":{\"damage\":5},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/piglin_gear_melee.json\"},\"minecraft:variant\":{\"value\":1}},\"angry\":{\"minecraft:angry\":{\"duration\":30,\"broadcast_anger\":true,\"broadcast_anger_on_attack\":true,\"broadcast_anger_on_being_attacked\":true,\"broadcast_range\":16,\"broadcast_targets\":[\"piglin\"],\"calm_event\":{\"event\":\"become_calm_event\",\"target\":\"self\"},\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"piglin\"},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"}]},\"angry_sound\":\"angry\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}}},\"attack_cooldown\":{\"minecraft:attack_cooldown\":{\"attack_cooldown_time\":[30.0,120.0],\"attack_cooldown_complete_event\":{\"event\":\"attack_cooldown_complete_event\",\"target\":\"self\"}}},\"piglin_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:movement\":{\"value\":0.42},\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 1 + (query.equipment_count * Math.Random(1,2)) : 0\"},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.1}},\"piglin_adult\":{\"minecraft:group_size\":{\"radius\":32,\"filters\":{\"all_of\":[{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"is_family\",\"value\":\"piglin\"}]}},\"minecraft:movement\":{\"value\":0.35},\"minecraft:barter\":{\"barter_table\":\"loot_tables/entities/piglin_barter.json\",\"cooldown_after_being_attacked\":20},\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:celebrate_hunt\":{\"celebration_targets\":{\"all_of\":[{\"test\":\"is_family\",\"value\":\"hoglin\"}]},\"broadcast\":true,\"duration\":10,\"celebrate_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0},\"radius\":16},\"minecraft:block_sensor\":{\"sensor_radius\":16,\"on_break\":[{\"block_list\":[\"minecraft:gold_block\",\"minecraft:gilded_blackstone\",\"minecraft:nether_gold_ore\",\"minecraft:gold_ore\",\"minecraft:chest\",\"minecraft:trapped_chest\",\"minecraft:ender_chest\",\"minecraft:barrel\",\"minecraft:shulker_box\",\"minecraft:undyed_shulker_box\"],\"on_block_broken\":\"important_block_destroyed_event\"}]}},\"interactable_piglin\":{\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"gold_ingot\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]}},\"barter\":true,\"admire\":true,\"use_item\":true,\"cooldown_after_being_attacked\":20,\"interact_text\":\"action.interact.barter\"}]}},\"hunter\":{\"minecraft:type_family\":{\"family\":[\"piglin\",\"piglin_hunter\",\"monster\"]}},\"not_hunter\":{\"minecraft:type_family\":{\"family\":[\"piglin\",\"monster\"]}},\"alert_for_attack_targets\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":7,\"within_radius\":16.0,\"persist_time\":2.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wither\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"self\",\"value\":\"piglin_hunter\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"hoglin_huntable\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:attack_cooldown\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"head\",\"operator\":\"!=\",\"value\":\"golden_helmet\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"torso\",\"operator\":\"!=\",\"value\":\"golden_chestplate\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"leg\",\"operator\":\"!=\",\"value\":\"golden_leggings\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"feet\",\"operator\":\"!=\",\"value\":\"golden_boots\"}]},\"max_dist\":16},{\"filters\":{\"any_of\":[{\"test\":\"has_container_open\",\"subject\":\"other\",\"operator\":\"==\",\"value\":true}]},\"max_dist\":16}],\"must_see\":true}},\"take_target_as_response_to_block_break\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":7,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16}]}},\"piglin_jockey\":{\"minecraft:behavior.find_mount\":{\"priority\":1,\"within_radius\":16,\"start_delay\":15,\"max_failed_attempts\":20}}},\"components\":{\"minecraft:equip_item\":{},\"minecraft:admire_item\":{\"duration\":8,\"cooldown_after_being_attacked\":20},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:on_target_acquired\":{\"event\":\"become_angry_event\",\"target\":\"self\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:health\":{\"value\":16,\"max\":16},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/piglin.json\"},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_open_doors\":true},\"minecraft:annotation.open_door\":{},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:nameable\":{},\"minecraft:inventory\":{\"inventory_size\":8},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.admire_item\":{\"priority\":2,\"admire_item_sound\":\"admire\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0},\"on_admire_item_start\":{\"event\":\"admire_item_started_event\",\"target\":\"self\"},\"on_admire_item_stop\":{\"event\":\"admire_item_stopped_event\",\"target\":\"self\"}},\"minecraft:behavior.barter\":{\"priority\":3},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:behavior.avoid_mob_type\":{\"priority\":4,\"remove_target\":true,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie_pigman\"}]},\"max_dist\":6},{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zoglin\"}]},\"max_dist\":6},{\"filters\":{\"all_of\":[{\"test\":\"has_target\",\"subject\":\"other\",\"value\":true},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"hoglin\"}]},\"sprint_speed_multiplier\":1.2,\"check_if_outnumbered\":true}],\"on_escape_event\":{\"event\":\"become_calm_event\",\"target\":\"self\"},\"avoid_mob_sound\":\"retreat\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}},\"minecraft:behavior.equip_item\":{\"priority\":5},\"minecraft:behavior.pickup_items\":{\"priority\":6,\"max_dist\":10,\"goal_radius\":2,\"speed_multiplier\":0.8,\"pickup_based_on_chance\":false,\"can_pickup_any_item\":false,\"cooldown_after_being_attacked\":20.0},\"minecraft:behavior.avoid_block\":{\"priority\":9,\"tick_interval\":5,\"search_range\":8,\"search_height\":4,\"sprint_speed_modifier\":1.1,\"target_selection_method\":\"nearest\",\"target_blocks\":[\"minecraft:soul_fire\",\"minecraft:soul_lantern\",\"minecraft:soul_torch\",\"minecraft:item.soul_campfire\"],\"avoid_block_sound\":\"retreat\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}},\"minecraft:behavior.random_stroll\":{\"priority\":10,\"speed_multiplier\":0.6},\"minecraft:behavior.look_at_player\":{\"priority\":11,\"look_distance\":8},\"minecraft:behavior.random_look_around\":{\"priority\":12},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:follow_range\":{\"value\":64},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:golden_sword\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_axe\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_hoe\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_pickaxe\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_shovel\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_rail\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_helmet\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_chestplate\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_leggings\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_boots\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_apple\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:appleEnchanted\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:golden_carrot\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:gold_block\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:gold_nugget\",\"priority\":2,\"stored_in_inventory\":true},{\"item\":\"minecraft:gold_ore\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:nether_gold_ore\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:gilded_blackstone\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:horsearmorgold\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:crossbow\",\"priority\":2},{\"item\":\"minecraft:porkchop\",\"consume_item\":true,\"priority\":3,\"max_amount\":64},{\"item\":\"minecraft:cooked_porkchop\",\"consume_item\":true,\"priority\":3,\"max_amount\":64},{\"item\":\"minecraft:netherite_helmet\",\"priority\":3},{\"item\":\"minecraft:diamond_helmet\",\"priority\":4},{\"item\":\"minecraft:iron_helmet\",\"priority\":5},{\"item\":\"minecraft:chainmail_helmet\",\"priority\":6},{\"item\":\"minecraft:leather_helmet\",\"priority\":7},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:skull:2\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:skull:3\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:skull:4\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:skull:5\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":8},{\"item\":\"minecraft:netherite_chestplate\",\"priority\":3},{\"item\":\"minecraft:diamond_chestplate\",\"priority\":4},{\"item\":\"minecraft:iron_chestplate\",\"priority\":5},{\"item\":\"minecraft:chainmail_chestplate\",\"priority\":6},{\"item\":\"minecraft:leather_chestplate\",\"priority\":7},{\"item\":\"minecraft:elytra\",\"priority\":7},{\"item\":\"minecraft:netherite_leggings\",\"priority\":3},{\"item\":\"minecraft:diamond_leggings\",\"priority\":4},{\"item\":\"minecraft:iron_leggings\",\"priority\":5},{\"item\":\"minecraft:chainmail_leggings\",\"priority\":6},{\"item\":\"minecraft:leather_leggings\",\"priority\":7},{\"item\":\"minecraft:netherite_boots\",\"priority\":3},{\"item\":\"minecraft:diamond_boots\",\"priority\":4},{\"item\":\"minecraft:iron_boots\",\"priority\":5},{\"item\":\"minecraft:chainmail_boots\",\"priority\":6},{\"item\":\"minecraft:bell\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:clock\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:speckled_melon\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:light_weighted_pressure_plate\",\"priority\":2,\"admire\":true,\"pickup_limit\":1,\"stored_in_inventory\":true},{\"item\":\"minecraft:leather_boots\",\"priority\":7},{\"item\":\"minecraft:netherite_sword\",\"priority\":3},{\"item\":\"minecraft:diamond_sword\",\"priority\":4},{\"item\":\"minecraft:iron_sword\",\"priority\":5},{\"item\":\"minecraft:stone_sword\",\"priority\":6},{\"item\":\"minecraft:wooden_sword\",\"priority\":7},{\"item\":\"minecraft:shield\",\"priority\":7},{\"item\":\"minecraft:gold_ingot\",\"priority\":1,\"pickup_limit\":1,\"admire\":true,\"barter\":true}]}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":5,\"trigger\":\"spawn_baby\"},{\"weight\":95,\"trigger\":\"spawn_adult\"}]},\"minecraft:entity_born\":{\"trigger\":\"spawn_baby\"},\"spawn_adult_no_hunting\":{\"randomize\":[{\"weight\":1,\"trigger\":\"spawn_adult_ranged_no_hunting\"},{\"weight\":1,\"trigger\":\"spawn_adult_melee_no_hunting\"}]},\"spawn_adult\":{\"randomize\":[{\"weight\":1,\"trigger\":\"spawn_adult_ranged\"},{\"weight\":1,\"trigger\":\"spawn_adult_melee\"}]},\"spawn_adult_ranged\":{\"add\":{\"component_groups\":[\"piglin_adult\",\"zombification_sensor\",\"alert_for_attack_targets\",\"ranged_unit\",\"attack_cooldown\",\"hunter\",\"interactable_piglin\"]}},\"spawn_adult_ranged_no_hunting\":{\"add\":{\"component_groups\":[\"piglin_adult\",\"zombification_sensor\",\"alert_for_attack_targets\",\"ranged_unit\",\"attack_cooldown\",\"not_hunter\",\"interactable_piglin\"]}},\"spawn_adult_melee\":{\"add\":{\"component_groups\":[\"piglin_adult\",\"zombification_sensor\",\"alert_for_attack_targets\",\"melee_unit\",\"attack_cooldown\",\"hunter\",\"interactable_piglin\"]}},\"spawn_adult_melee_no_hunting\":{\"add\":{\"component_groups\":[\"piglin_adult\",\"zombification_sensor\",\"alert_for_attack_targets\",\"melee_unit\",\"attack_cooldown\",\"not_hunter\",\"interactable_piglin\"]}},\"spawn_baby\":{\"randomize\":[{\"weight\":9,\"add\":{\"component_groups\":[\"piglin_baby\",\"zombification_sensor\",\"not_hunter\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"piglin_baby\",\"zombification_sensor\",\"piglin_jockey\",\"not_hunter\"]}}]},\"stop_zombification_event\":{\"add\":{\"component_groups\":[\"zombification_sensor\"]},\"remove\":{\"component_groups\":[\"start_zombification\"]}},\"start_zombification_event\":{\"add\":{\"component_groups\":[\"start_zombification\"]},\"remove\":{\"component_groups\":[\"zombification_sensor\"]}},\"become_angry_event\":{\"add\":{\"component_groups\":[\"angry\"]}},\"become_calm_event\":{\"remove\":{\"component_groups\":[\"angry\",\"take_target_as_response_to_block_break\"]},\"add\":{\"component_groups\":[\"alert_for_attack_targets\",\"attack_cooldown\"]}},\"attack_cooldown_complete_event\":{\"remove\":{\"component_groups\":[\"attack_cooldown\"]}},\"become_zombie_event\":{\"add\":{\"component_groups\":[\"become_zombie\"]}},\"important_block_destroyed_event\":{\"remove\":{\"component_groups\":[\"alert_for_attack_targets\"]},\"add\":{\"component_groups\":[\"take_target_as_response_to_block_break\"]}},\"admire_item_started_event\":{\"remove\":{\"component_groups\":[\"interactable_piglin\"]}},\"admire_item_stopped_event\":{\"add\":{\"component_groups\":[\"interactable_piglin\"]}}}}}'},3680:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:pillager\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:celebrate\":{\"minecraft:behavior.celebrate\":{\"priority\":5,\"celebration_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":7.0},\"jump_interval\":{\"range_min\":1.0,\"range_max\":3.5},\"duration\":30.0,\"on_celebration_end_event\":{\"event\":\"minecraft:stop_celebrating\",\"target\":\"self\"}}},\"minecraft:ranged_attack\":{\"minecraft:behavior.ranged_attack\":{\"priority\":4,\"attack_interval_min\":1.0,\"attack_interval_max\":1.0,\"attack_radius\":8.0},\"minecraft:shooter\":{\"def\":\"minecraft:arrow\"},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:melee_mode\"}}},\"minecraft:melee_attack\":{\"minecraft:behavior.melee_attack\":{\"priority\":4,\"track_target\":true},\"minecraft:attack\":{\"damage\":3},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"in_water\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"minecraft:ranged_mode\"}}},\"minecraft:raid_configuration\":{\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"hostile\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":false,\"first_founding_reward\":0},\"minecraft:behavior.move_to_village\":{\"priority\":5,\"speed_multiplier\":1.0,\"goal_radius\":2.0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/pillager_raid.json\"},\"minecraft:ambient_sound_interval\":{\"value\":2.0,\"range\":4.0,\"event_name\":\"ambient.in.raid\"}},\"minecraft:illager_squad_captain\":{\"minecraft:is_illager_captain\":{},\"minecraft:variant\":{\"value\":1},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/pillager_captain_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.armor.chest\",\"drop_chance\":1.0}]},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"has_damage\",\"value\":\"fatal\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:gain_bad_omen\",\"target\":\"other\"}}},\"minecraft:on_hurt\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"},\"minecraft:on_hurt_by_player\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"}},\"minecraft:patrol_captain\":{\"minecraft:is_illager_captain\":{},\"minecraft:variant\":{\"value\":1},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/pillager_captain_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.armor.chest\",\"drop_chance\":1.0}]},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"has_damage\",\"value\":\"fatal\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:gain_bad_omen\",\"target\":\"other\"}}},\"minecraft:on_hurt\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"},\"minecraft:on_hurt_by_player\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:calm\",\"target\":\"self\"},\"minecraft:behavior.hold_ground\":{\"priority\":5,\"min_radius\":10,\"broadcast\":true,\"broadcast_range\":8,\"within_radius_event\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"}},\"minecraft:behavior.move_to_random_block\":{\"priority\":6,\"speed_multiplier\":0.55,\"within_radius\":8,\"block_distance\":512}},\"minecraft:patrol_follower\":{\"minecraft:behavior.follow_target_captain\":{\"priority\":5,\"speed_multiplier\":0.8,\"within_radius\":64,\"follow_distance\":5},\"minecraft:behavior.hold_ground\":{\"priority\":6,\"min_radius\":10,\"broadcast\":true,\"broadcast_range\":8,\"within_radius_event\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"}},\"minecraft:on_hurt\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"},\"minecraft:on_hurt_by_player\":{\"event\":\"minecraft:ranged_mode\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:calm\",\"target\":\"self\"}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0\"},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:type_family\":{\"family\":[\"pillager\",\"monster\",\"illager\",\"mob\"]},\"minecraft:variant\":{\"value\":0},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:health\":{\"value\":24,\"max\":24},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/pillager.json\"},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:banner:15\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0}]},\"minecraft:movement\":{\"value\":0.35},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:nameable\":{},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/pillager_gear.json\"},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1,\"entity_types\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"illager\"},\"max_dist\":64}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"reselect_targets\":true,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]},\"max_dist\":16}]},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.pickup_items\":{\"priority\":7,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":9,\"look_distance\":8},\"minecraft:behavior.random_look_around\":{\"priority\":10},\"minecraft:behavior.charge_held_item\":{\"priority\":3,\"items\":[\"minecraft:arrow\"]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:follow_range\":{\"value\":64}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:ranged_attack\"]}},\"minecraft:spawn_for_raid\":{\"add\":{\"component_groups\":[\"minecraft:ranged_attack\",\"minecraft:raid_configuration\"]}},\"minecraft:spawn_as_patrol_follower\":{\"add\":{\"component_groups\":[\"minecraft:patrol_follower\"]}},\"minecraft:spawn_as_illager_captain\":{\"add\":{\"component_groups\":[\"minecraft:ranged_attack\",\"minecraft:illager_squad_captain\"]}},\"minecraft:promote_to_illager_captain\":{\"add\":{\"component_groups\":[\"minecraft:illager_squad_captain\"]},\"remove\":{\"component_groups\":[\"minecraft:patrol_follower\"]}},\"minecraft:promote_to_patrol_captain\":{\"add\":{\"component_groups\":[\"minecraft:patrol_captain\"]},\"remove\":{\"component_groups\":[\"minecraft:patrol_follower\"]}},\"minecraft:melee_mode\":{\"remove\":{\"component_groups\":[\"minecraft:ranged_attack\"]},\"add\":{\"component_groups\":[\"minecraft:melee_attack\"]}},\"minecraft:ranged_mode\":{\"remove\":{\"component_groups\":[\"minecraft:melee_attack\"]},\"add\":{\"component_groups\":[\"minecraft:ranged_attack\"]}},\"minecraft:start_celebrating\":{\"add\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:stop_celebrating\":{\"remove\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:calm\":{\"remove\":{\"component_groups\":[\"minecraft:melee_attack\",\"minecraft:ranged_attack\"]}}}}}'},9839:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:polar_bear\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":4,\"speed_multiplier\":1.25}},\"minecraft:baby_wild\":{\"minecraft:on_target_acquired\":{\"event\":\"minecraft:on_scared\",\"target\":\"self\"},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16}]}},\"minecraft:baby_scared\":{\"minecraft:angry\":{\"duration\":1,\"broadcast_anger\":true,\"broadcast_range\":41,\"calm_event\":{\"event\":\"minecraft:baby_on_calm\",\"target\":\"self\"}}},\"minecraft:adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/polar_bear.json\"}},\"minecraft:adult_wild\":{\"minecraft:on_target_acquired\":{\"event\":\"minecraft:on_anger\",\"target\":\"self\"},\"minecraft:on_friendly_anger\":{\"event\":\"minecraft:on_anger\",\"target\":\"self\"},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fox\"},\"max_dist\":16}],\"must_see\":false}},\"minecraft:adult_hostile\":{\"minecraft:attack\":{\"damage\":6.0},\"minecraft:angry\":{\"duration\":500,\"broadcast_anger\":false,\"broadcast_range\":20,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.stomp_attack\":{\"priority\":1,\"track_target\":true,\"require_complete_path\":true,\"stomp_range_multiplier\":2.0,\"no_damage_range_multiplier\":2.0}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"polarbear\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":30},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:collision_box\":{\"width\":1.3,\"height\":1.4},\"minecraft:movement\":{\"value\":0.25},\"minecraft:water_movement\":{\"drag_factor\":0.98},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:follow_range\":{\"value\":48},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.random_stroll\":{\"priority\":5},\"minecraft:behavior.look_at_player\":{\"priority\":6,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":7},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:behavior.panic\":{\"priority\":2,\"speed_multiplier\":2.0},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":9,\"add\":{\"component_groups\":[\"minecraft:adult\",\"minecraft:adult_wild\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:baby\",\"minecraft:baby_wild\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:baby\",\"minecraft:baby_wild\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:baby\",\"minecraft:baby_wild\",\"minecraft:baby_scared\"]},\"add\":{\"component_groups\":[\"minecraft:adult\",\"minecraft:adult_wild\"]}},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:adult_hostile\"]},\"add\":{\"component_groups\":[\"minecraft:adult_wild\"]}},\"minecraft:on_anger\":{\"remove\":{\"component_groups\":[\"minecraft:adult_wild\"]},\"add\":{\"component_groups\":[\"minecraft:adult_hostile\"]}},\"minecraft:baby_on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:baby_scared\"]},\"add\":{\"component_groups\":[\"minecraft:baby_wild\"]}},\"minecraft:on_scared\":{\"remove\":{\"component_groups\":[\"minecraft:baby_wild\"]},\"add\":{\"component_groups\":[\"minecraft:baby_scared\"]}}}}}'},8688:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:rabbit\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.4},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"golden_carrot\",\"carrot\",\"yellow_flower\"],\"grow_up\":{\"event\":\"grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/rabbit.json\"},\"minecraft:scale\":{\"value\":0.6},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"breed_items\":[\"golden_carrot\",\"carrot\",\"yellow_flower\"],\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\"},\"require_tame\":false,\"mutation_factor\":{\"variant\":0.2}}},\"coat_brown\":{\"minecraft:variant\":{\"value\":0}},\"coat_white\":{\"minecraft:variant\":{\"value\":1}},\"coat_black\":{\"minecraft:variant\":{\"value\":2}},\"coat_splotched\":{\"minecraft:variant\":{\"value\":3}},\"coat_desert\":{\"minecraft:variant\":{\"value\":4}},\"coat_salt\":{\"minecraft:variant\":{\"value\":5}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"rabbit\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":3,\"max\":3},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:collision_box\":{\"width\":0.67,\"height\":0.67},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true},\"minecraft:movement.skip\":{},\"minecraft:jump.dynamic\":{},\"minecraft:can_climb\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.4},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2.2},\"minecraft:behavior.avoid_mob_type\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":8,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":1.8},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wolf\"},\"max_dist\":4,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":1.8},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"monster\"},\"max_dist\":4,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":1.5}]},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":0.8},\"minecraft:behavior.tempt\":{\"priority\":3,\"speed_multiplier\":1,\"items\":[\"golden_carrot\",\"carrot\",\"yellow_flower\"]},\"minecraft:behavior.raid_garden\":{\"priority\":5,\"blocks\":[\"carrots\"],\"search_range\":16,\"goal_radius\":0.8},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.6,\"xz_dist\":2,\"y_dist\":1},\"minecraft:behavior.look_at_player\":{\"priority\":11},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"in_desert\":{\"add\":{\"component_groups\":[\"coat_desert\"]}},\"in_snow\":{\"randomize\":[{\"weight\":80,\"add\":{\"component_groups\":[\"coat_white\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"coat_splotched\"]}}]},\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":3,\"add\":{\"component_groups\":[\"adult\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"baby\"]}}]},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":50,\"add\":{\"component_groups\":[\"coat_brown\"]}},{\"weight\":40,\"add\":{\"component_groups\":[\"coat_black\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"coat_salt\"]}}]},{\"filters\":{\"test\":\"is_biome\",\"value\":\"desert\"},\"add\":{\"component_groups\":[\"coat_desert\"]}},{\"filters\":{\"test\":\"is_snow_covered\",\"value\":true},\"randomize\":[{\"weight\":80,\"add\":{\"component_groups\":[\"coat_white\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"coat_splotched\"]}}]}]},\"minecraft:entity_born\":{\"sequence\":[{\"add\":{\"component_groups\":[\"baby\"]}},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":50,\"add\":{\"component_groups\":[\"coat_brown\"]}},{\"weight\":40,\"add\":{\"component_groups\":[\"coat_black\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"coat_salt\"]}}]},{\"filters\":{\"test\":\"is_biome\",\"value\":\"desert\"},\"add\":{\"component_groups\":[\"coat_desert\"]}},{\"filters\":{\"test\":\"is_snow_covered\",\"value\":true},\"randomize\":[{\"weight\":80,\"add\":{\"component_groups\":[\"coat_white\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"coat_splotched\"]}}]}]},\"grow_up\":{\"remove\":{\"component_groups\":[\"baby\"]},\"add\":{\"component_groups\":[\"adult\"]}}}}}'},9170:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:celebrate\":{\"minecraft:behavior.celebrate\":{\"priority\":5,\"celebration_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":7.0},\"jump_interval\":{\"range_min\":1.0,\"range_max\":3.5},\"duration\":30.0,\"on_celebration_end_event\":{\"event\":\"minecraft:stop_celebrating\",\"target\":\"self\"}}},\"minecraft:pillager_rider\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:pillager\"}},\"minecraft:pillager_rider_for_raid\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:pillager\",\"spawn_event\":\"minecraft:spawn_for_raid\"}},\"minecraft:evoker_rider_for_raid\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:evocation_illager\",\"spawn_event\":\"minecraft:spawn_for_raid\"}},\"minecraft:pillager_captain_rider\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:pillager\",\"spawn_event\":\"minecraft:spawn_as_illager_captain\"}},\"minecraft:vindicator_rider\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:vindicator\"}},\"minecraft:vindicator_captain_rider\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:vindicator\",\"spawn_event\":\"minecraft:spawn_as_illager_captain\"}},\"minecraft:raid_configuration\":{\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"hostile\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":false,\"first_founding_reward\":0},\"minecraft:behavior.move_to_village\":{\"priority\":5,\"speed_multiplier\":1.0,\"goal_radius\":2.0},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1.0},\"minecraft:ambient_sound_interval\":{\"value\":4.0,\"range\":8.0,\"event_name\":\"ambient.in.raid\"}},\"minecraft:hostile\":{\"minecraft:movement\":{\"value\":0.3},\"minecraft:behavior.delayed_attack\":{\"priority\":4,\"attack_once\":false,\"track_target\":true,\"require_complete_path\":false,\"random_stop_interval\":0,\"reach_multiplier\":1.5,\"speed_multiplier\":1.0,\"attack_duration\":0.75,\"hit_delay_pct\":0.5},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.4},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6,\"angle_of_view_horizontal\":45,\"probability\":1},\"minecraft:behavior.look_at_entity\":{\"priority\":10,\"look_distance\":8,\"angle_of_view_horizontal\":45,\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"}},\"minecraft:behavior.hurt_by_target\":{\"priority\":2,\"entity_types\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"illager\"},\"max_dist\":64}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"must_see\":true,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"subject\":\"other\",\"test\":\"is_family\",\"value\":\"player\"},{\"subject\":\"other\",\"test\":\"is_family\",\"value\":\"irongolem\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]},\"max_dist\":16}]},\"minecraft:behavior.mount_pathing\":{\"priority\":5,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true}},\"stunned\":{\"minecraft:is_stunned\":{},\"minecraft:timer\":{\"looping\":false,\"time\":2,\"time_down_event\":{\"event\":\"minecraft:start_roar\"}}},\"roaring\":{\"minecraft:behavior.knockback_roar\":{\"priority\":1,\"duration\":1,\"attack_time\":0.5,\"knockback_damage\":6,\"knockback_strength\":3,\"knockback_range\":4,\"knockback_filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"ravager\"},\"damage_filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"illager\"},\"on_roar_end\":{\"event\":\"minecraft:end_roar\"},\"cooldown_time\":0.1}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 20 : 0\"},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:ravager_blocked\":{\"knockback_strength\":3.0,\"reaction_choices\":[{\"weight\":1,\"value\":{\"event\":\"minecraft:become_stunned\",\"target\":\"self\"}},{\"weight\":1}]},\"minecraft:attack\":{\"damage\":12.0},\"minecraft:breathable\":{\"suffocate_time\":0,\"total_supply\":15},\"minecraft:collision_box\":{\"height\":1.9,\"width\":1.2},\"minecraft:health\":{\"max\":100,\"value\":100},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:jump.static\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/ravager.json\"},\"minecraft:knockback_resistance\":{\"value\":0.5},\"minecraft:movement\":{\"value\":0.0},\"minecraft:movement.basic\":{},\"minecraft:nameable\":{},\"minecraft:navigation.walk\":{\"avoid_damage_blocks\":true,\"can_path_over_water\":true,\"can_sink\":false},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:break_blocks\":{\"breakable_blocks\":[\"bamboo\",\"bamboo_sapling\",\"beetroot\",\"brown_mushroom\",\"carrots\",\"carved_pumpkin\",\"chorus_flower\",\"chorus_plant\",\"deadbush\",\"double_plant\",\"leaves\",\"leaves2\",\"lit_pumpkin\",\"melon_block\",\"melon_stem\",\"potatoes\",\"pumpkin\",\"pumpkin_stem\",\"red_flower\",\"red_mushroom\",\"crimson_fungus\",\"warped_fungus\",\"reeds\",\"sapling\",\"snow_layer\",\"sweet_berry_bush\",\"tallgrass\",\"turtle_egg\",\"vine\",\"waterlily\",\"wheat\",\"yellow_flower\"]},\"minecraft:follow_range\":{\"value\":64},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"pillager\",\"vindicator\",\"evocation_illager\"],\"seats\":{\"position\":[0.0,2.1,-0.3]}},\"minecraft:type_family\":{\"family\":[\"monster\",\"illager\",\"ravager\",\"mob\"]}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:hostile\"]}},\"minecraft:spawn_for_raid\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:raid_configuration\"]}},\"minecraft:spawn_for_raid_with_evoker_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:evoker_rider_for_raid\",\"minecraft:raid_configuration\"]}},\"minecraft:spawn_for_raid_with_pillager_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:pillager_rider_for_raid\",\"minecraft:raid_configuration\"]}},\"minecraft:spawn_with_pillager_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:pillager_rider\"]}},\"minecraft:spawn_with_pillager_captain_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:pillager_captain_rider\"]}},\"minecraft:spawn_with_vindicator_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:vindicator_rider\"]}},\"minecraft:spawn_with_vindicator_captain_rider\":{\"add\":{\"component_groups\":[\"minecraft:hostile\",\"minecraft:vindicator_captain_rider\"]}},\"minecraft:become_stunned\":{\"add\":{\"component_groups\":[\"stunned\"]},\"remove\":{\"component_groups\":[\"minecraft:hostile\"]}},\"minecraft:start_roar\":{\"add\":{\"component_groups\":[\"roaring\"]},\"remove\":{\"component_groups\":[\"stunned\"]}},\"minecraft:end_roar\":{\"add\":{\"component_groups\":[\"minecraft:hostile\"]},\"remove\":{\"component_groups\":[\"roaring\"]}},\"minecraft:start_celebrating\":{\"add\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:stop_celebrating\":{\"remove\":{\"component_groups\":[\"minecraft:celebrate\"]}}}}}'},8706:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:cod\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"scale_small\":{\"minecraft:scale\":{\"value\":0.5},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:loot\":{\"table\":\"loot_tables/entities/salmon_normal.json\"}},\"scale_normal\":{\"minecraft:scale\":{\"value\":1},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:loot\":{\"table\":\"loot_tables/entities/salmon_normal.json\"}},\"scale_large\":{\"minecraft:scale\":{\"value\":1.5},\"minecraft:health\":{\"value\":6,\"max\":6},\"minecraft:loot\":{\"table\":\"loot_tables/entities/salmon_large.json\"}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:type_family\":{\"family\":[\"salmon\",\"fish\"]},\"minecraft:collision_box\":{\"width\":0.5,\"height\":0.5},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":false,\"breathes_water\":true},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.12},\"minecraft:underwater_movement\":{\"value\":0.12},\"minecraft:navigation.generic\":{\"is_amphibious\":false,\"can_path_over_water\":false,\"can_swim\":true,\"can_walk\":false,\"can_breach\":false,\"can_sink\":false},\"minecraft:movement.sway\":{\"sway_amplitude\":0.0},\"minecraft:physics\":{\"has_gravity\":false},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:despawn\":{\"despawn_from_distance\":{\"min_distance\":32,\"max_distance\":40}},\"minecraft:behavior.avoid_mob_type\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":3,\"max_flee\":10,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":2.0}]},\"minecraft:behavior.swim_idle\":{\"priority\":5,\"idle_time\":5.0,\"success_rate\":0.1},\"minecraft:behavior.random_swim\":{\"speed_multiplier\":1.0,\"priority\":3,\"xz_dist\":16,\"y_dist\":4,\"interval\":0},\"minecraft:behavior.swim_wander\":{\"priority\":4,\"interval\":0.0166,\"look_ahead\":5.0,\"speed_multiplier\":0.014,\"wander_time\":5.0},\"minecraft:flocking\":{\"in_water\":true,\"match_variants\":false,\"use_center_of_mass\":false,\"low_flock_limit\":4,\"high_flock_limit\":8,\"goal_weight\":2.0,\"loner_chance\":0.1,\"influence_radius\":3.0,\"breach_influence\":7.0,\"separation_weight\":0.65,\"separation_threshold\":0.15,\"cohesion_weight\":2.25,\"cohesion_threshold\":1.5,\"innner_cohesion_threshold\":1.5,\"min_height\":4.0,\"max_height\":4.0,\"block_distance\":1.0,\"block_weight\":0.75},\"minecraft:nameable\":{},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":30,\"add\":{\"component_groups\":[\"adult\",\"scale_small\"]}},{\"weight\":50,\"add\":{\"component_groups\":[\"adult\",\"scale_normal\"]}},{\"weight\":15,\"add\":{\"component_groups\":[\"adult\",\"scale_large\"]}}]}}}}'},1652:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:loot_sheared\":{\"minecraft:loot\":{\"table\":\"loot_tables/entities/sheep_sheared.json\"}},\"minecraft:loot_wooly\":{\"minecraft:loot\":{\"table\":\"loot_tables/entities/sheep.json\"}},\"minecraft:rideable_sheared\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.9,0.0]}}},\"minecraft:rideable_wooly\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.975,0.0]}}},\"minecraft:sheep_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":\"wheat\",\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"minecraft:sheep_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\"},\"breed_items\":\"wheat\"}},\"minecraft:sheep_dyeable\":{\"minecraft:is_dyeable\":{\"interact_text\":\"action.interact.dye\"}},\"minecraft:sheep_sheared\":{\"minecraft:is_sheared\":{}},\"minecraft:sheep_white\":{\"minecraft:color\":{\"value\":0}},\"minecraft:sheep_brown\":{\"minecraft:color\":{\"value\":12}},\"minecraft:sheep_black\":{\"minecraft:color\":{\"value\":15}},\"minecraft:sheep_gray\":{\"minecraft:color\":{\"value\":8}},\"minecraft:sheep_light_gray\":{\"minecraft:color\":{\"value\":7}},\"minecraft:sheep_pink\":{\"minecraft:color\":{\"value\":6}},\"minecraft:sheep_red\":{\"minecraft:color\":{\"value\":14}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"sheep\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.3},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":8,\"max\":8},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:interact\":{\"interactions\":[{\"cooldown\":2.5,\"use_item\":false,\"hurt_item\":1,\"spawn_items\":{\"table\":\"loot_tables/entities/sheep_shear.json\"},\"play_sounds\":\"shear\",\"interact_text\":\"action.interact.shear\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"shears\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},{\"test\":\"has_component\",\"value\":\"minecraft:is_dyeable\"}]},\"event\":\"minecraft:on_sheared\",\"target\":\"self\"}}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{\"mass\":0.75},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":1.25},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.5,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.25,\"items\":[\"wheat\"]},\"minecraft:behavior.follow_parent\":{\"priority\":5,\"speed_multiplier\":1.1},\"minecraft:behavior.eat_block\":{\"priority\":6,\"success_chance\":\"query.is_baby ? 0.02 : 0.001\",\"time_until_eat\":1.8,\"eat_and_replace_block_pairs\":[{\"eat_block\":\"grass\",\"replace_block\":\"dirt\"},{\"eat_block\":\"tallgrass\",\"replace_block\":\"air\"}],\"on_eat\":{\"event\":\"minecraft:on_eat_block\",\"target\":\"self\"}},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"sequence\":[{\"randomize\":[{\"weight\":95,\"remove\":{},\"trigger\":\"spawn_adult\"},{\"weight\":5,\"remove\":{},\"trigger\":\"spawn_baby\"}]},{\"randomize\":[{\"weight\":81836,\"add\":{\"component_groups\":[\"minecraft:sheep_white\"]}},{\"weight\":5000,\"add\":{\"component_groups\":[\"minecraft:sheep_black\"]}},{\"weight\":5000,\"add\":{\"component_groups\":[\"minecraft:sheep_light_gray\"]}},{\"weight\":5000,\"add\":{\"component_groups\":[\"minecraft:sheep_gray\"]}},{\"weight\":3000,\"add\":{\"component_groups\":[\"minecraft:sheep_brown\"]}},{\"weight\":164,\"add\":{\"component_groups\":[\"minecraft:sheep_pink\"]}}]}]},\"spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:sheep_adult\",\"minecraft:sheep_dyeable\",\"minecraft:rideable_wooly\",\"minecraft:loot_wooly\"]}},\"spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:sheep_baby\",\"minecraft:sheep_dyeable\",\"minecraft:rideable_sheared\"]}},\"minecraft:entity_born\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:sheep_baby\",\"minecraft:sheep_dyeable\",\"minecraft:rideable_sheared\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:sheep_baby\"]},\"add\":{\"component_groups\":[\"minecraft:sheep_adult\",\"minecraft:rideable_wooly\",\"minecraft:loot_wooly\"]}},\"minecraft:on_sheared\":{\"remove\":{\"component_groups\":[\"minecraft:sheep_dyeable\",\"minecraft:loot_wooly\"]},\"add\":{\"component_groups\":[\"minecraft:sheep_sheared\",\"minecraft:rideable_sheared\",\"minecraft:loot_sheared\"]}},\"minecraft:on_eat_block\":{\"sequence\":[{\"remove\":{\"component_groups\":[\"minecraft:sheep_sheared\"]},\"add\":{\"component_groups\":[\"minecraft:sheep_dyeable\"]}},{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:rideable_wooly\",\"minecraft:loot_wooly\"]},\"remove\":{\"component_groups\":[\"minecraft:loot_sheared\"]}}]},\"wololo\":{\"add\":{\"component_groups\":[\"minecraft:sheep_red\"]}}}}}'},936:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:shulker\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:shulker_purple\":{\"minecraft:variant\":{\"value\":5}},\"minecraft:shulker_black\":{\"minecraft:variant\":{\"value\":0}},\"minecraft:shulker_blue\":{\"minecraft:variant\":{\"value\":4}},\"minecraft:shulker_brown\":{\"minecraft:variant\":{\"value\":3}},\"minecraft:shulker_cyan\":{\"minecraft:variant\":{\"value\":6}},\"minecraft:shulker_gray\":{\"minecraft:variant\":{\"value\":8}},\"minecraft:shulker_green\":{\"minecraft:variant\":{\"value\":2}},\"minecraft:shulker_light_blue\":{\"minecraft:variant\":{\"value\":12}},\"minecraft:shulker_lime\":{\"minecraft:variant\":{\"value\":10}},\"minecraft:shulker_magenta\":{\"minecraft:variant\":{\"value\":13}},\"minecraft:shulker_orange\":{\"minecraft:variant\":{\"value\":14}},\"minecraft:shulker_pink\":{\"minecraft:variant\":{\"value\":9}},\"minecraft:shulker_red\":{\"minecraft:variant\":{\"value\":1}},\"minecraft:shulker_silver\":{\"minecraft:variant\":{\"value\":7}},\"minecraft:shulker_undyed\":{\"minecraft:variant\":{\"value\":16}},\"minecraft:shulker_white\":{\"minecraft:variant\":{\"value\":15}},\"minecraft:shulker_yellow\":{\"minecraft:variant\":{\"value\":11}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"shulker\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:conditional_bandwidth_optimization\":{\"default_values\":{\"max_optimized_distance\":80.0,\"max_dropped_ticks\":10,\"use_motion_prediction_hints\":true}},\"minecraft:health\":{\"value\":30,\"max\":30},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.0,\"max\":0.0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/shulker.json\"},\"minecraft:peek\":{\"on_open\":{\"event\":\"minecraft:on_open\"},\"on_close\":{\"event\":\"minecraft:on_close\"},\"on_target_open\":{\"event\":\"minecraft:on_open\"}},\"minecraft:behavior.look_at_player\":{\"priority\":1,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:shooter\":{\"def\":\"minecraft:shulker_bullet\"},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:behavior.ranged_attack\":{\"attack_interval_min\":1,\"attack_interval_max\":3,\"attack_radius\":15},\"minecraft:behavior.hurt_by_target\":{\"priority\":2},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"entity_types\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16},\"must_see\":true},\"minecraft:navigation.walk\":{},\"minecraft:movement.basic\":{},\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:0\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:16\"}]},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_black\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:8\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_gray\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:7\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_silver\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:15\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:19\"}]},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_white\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:12\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_light_blue\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:14\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_orange\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:1\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_red\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:4\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:18\"}]},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_blue\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:5\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_purple\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:13\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_magenta\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:9\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_pink\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:3\"},{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:17\"}]},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_brown\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:11\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_yellow\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:10\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_lime\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:2\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_green\"},\"use_item\":true},{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"dye:6\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"instabuild\"}]},\"event\":\"minecraft:turn_cyan\"},\"use_item\":true}]},\"minecraft:physics\":{}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:shulker_undyed\"]}},\"minecraft:turn_purple\":{\"add\":{\"component_groups\":[\"minecraft:shulker_purple\"]}},\"minecraft:turn_black\":{\"add\":{\"component_groups\":[\"minecraft:shulker_black\"]}},\"minecraft:turn_blue\":{\"add\":{\"component_groups\":[\"minecraft:shulker_blue\"]}},\"minecraft:turn_brown\":{\"add\":{\"component_groups\":[\"minecraft:shulker_brown\"]}},\"minecraft:turn_cyan\":{\"add\":{\"component_groups\":[\"minecraft:shulker_cyan\"]}},\"minecraft:turn_gray\":{\"add\":{\"component_groups\":[\"minecraft:shulker_gray\"]}},\"minecraft:turn_green\":{\"add\":{\"component_groups\":[\"minecraft:shulker_green\"]}},\"minecraft:turn_light_blue\":{\"add\":{\"component_groups\":[\"minecraft:shulker_light_blue\"]}},\"minecraft:turn_lime\":{\"add\":{\"component_groups\":[\"minecraft:shulker_lime\"]}},\"minecraft:turn_magenta\":{\"add\":{\"component_groups\":[\"minecraft:shulker_magenta\"]}},\"minecraft:turn_orange\":{\"add\":{\"component_groups\":[\"minecraft:shulker_orange\"]}},\"minecraft:turn_pink\":{\"add\":{\"component_groups\":[\"minecraft:shulker_pink\"]}},\"minecraft:turn_red\":{\"add\":{\"component_groups\":[\"minecraft:shulker_red\"]}},\"minecraft:turn_silver\":{\"add\":{\"component_groups\":[\"minecraft:shulker_silver\"]}},\"minecraft:turn_white\":{\"add\":{\"component_groups\":[\"minecraft:shulker_white\"]}},\"minecraft:turn_yellow\":{\"add\":{\"component_groups\":[\"minecraft:shulker_yellow\"]}}}}}'},7815:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:silverfish_calm\":{\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\",\"target\":\"self\"}},\"minecraft:silverfish_angry\":{\"minecraft:angry\":{\"duration\":-1,\"broadcast_anger\":true,\"broadcast_range\":20,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"track_target\":true},\"minecraft:behavior.silverfish_wake_up_friends\":{\"priority\":1}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:type_family\":{\"family\":[\"silverfish\",\"monster\",\"mob\",\"arthropod\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/silverfish.json\"},\"minecraft:health\":{\"value\":8,\"max\":8},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:attack\":{\"damage\":1},\"minecraft:collision_box\":{\"width\":0.4,\"height\":0.3},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":1},\"minecraft:behavior.silverfish_merge_with_stone\":{\"priority\":5},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"attack_interval\":10,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":8}]},\"minecraft:behavior.hurt_by_target\":{\"priority\":1,\"alert_same_type\":true},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:silverfish_calm\"]}},\"minecraft:become_angry\":{\"remove\":{\"minecraft:silverfish_calm\":{}},\"add\":{\"component_groups\":[\"minecraft:silverfish_angry\"]}},\"minecraft:on_calm\":{\"remove\":{\"minecraft:silverfish_angry\":{}},\"add\":{\"component_groups\":[\"minecraft:silverfish_calm\"]}}}}}'},1239:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:lightning_immune\":{\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"other_with_families\":\"lightning\"}},\"deals_damage\":false}}},\"minecraft:ranged_attack\":{\"minecraft:behavior.ranged_attack\":{\"priority\":0,\"attack_interval_min\":1.0,\"attack_interval_max\":3.0,\"attack_radius\":15.0},\"minecraft:shooter\":{\"def\":\"minecraft:arrow\"},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:melee_mode\"},{\"filters\":{\"test\":\"has_ranged_weapon\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"minecraft:melee_mode\"}]}},\"minecraft:melee_attack\":{\"minecraft:behavior.melee_attack\":{\"priority\":4,\"track_target\":true,\"speed_multiplier\":1.25},\"minecraft:attack\":{\"damage\":3},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"all_of\":[{\"test\":\"in_water\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},{\"test\":\"has_ranged_weapon\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true}]},\"event\":\"minecraft:ranged_mode\"}]}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:type_family\":{\"family\":[\"skeleton\",\"undead\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:burns_in_daylight\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/skeleton.json\"},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"avoid_sun\":true,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:nameable\":{},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/skeleton_gear.json\"},\"minecraft:shooter\":{\"def\":\"minecraft:arrow\"},\"minecraft:environment_sensor\":{\"triggers\":[{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:melee_mode\"},{\"filters\":{\"test\":\"has_ranged_weapon\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"minecraft:melee_mode\"}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:bow\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:behavior.ranged_attack\":{\"priority\":0,\"attack_interval_min\":1.0,\"attack_interval_max\":3.0,\"attack_radius\":15.0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"reselect_targets\":true,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":16}]},\"minecraft:behavior.flee_sun\":{\"priority\":2,\"speed_multiplier\":1},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.avoid_mob_type\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wolf\"},\"max_dist\":6,\"walk_speed_multiplier\":1.2,\"sprint_speed_multiplier\":1.2}]},\"minecraft:behavior.pickup_items\":{\"priority\":5,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":8},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:ranged_attack\"]}},\"minecraft:spring_trap\":{\"add\":{\"component_groups\":[\"minecraft:lightning_immune\"]}},\"minecraft:melee_mode\":{\"remove\":{\"component_groups\":[\"minecraft:ranged_attack\"]},\"add\":{\"component_groups\":[\"minecraft:melee_attack\"]}},\"minecraft:ranged_mode\":{\"remove\":{\"component_groups\":[\"minecraft:melee_attack\"]},\"add\":{\"component_groups\":[\"minecraft:ranged_attack\"]}}}}}'},704:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:slime\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:slime_large\":{\"minecraft:collision_box\":{\"width\":2.08,\"height\":2.08},\"minecraft:health\":{\"value\":16,\"max\":16},\"minecraft:movement\":{\"value\":0.6},\"minecraft:attack\":{\"damage\":4}},\"minecraft:slime_medium\":{\"minecraft:collision_box\":{\"width\":1.04,\"height\":1.04},\"minecraft:health\":{\"value\":4,\"max\":4},\"minecraft:movement\":{\"value\":0.4},\"minecraft:attack\":{\"damage\":2}},\"minecraft:slime_small\":{\"minecraft:collision_box\":{\"width\":0.52,\"height\":0.52},\"minecraft:health\":{\"value\":1,\"max\":1},\"minecraft:movement\":{\"value\":0.3},\"minecraft:attack\":{\"damage\":0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/slime.json\"}},\"minecraft:slime_calm\":{\"minecraft:movement.jump\":{\"jump_delay\":[0.5,1.5]}},\"minecraft:slime_aggressive\":{\"minecraft:movement.jump\":{\"jump_delay\":[0.16,0.5]}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? query.variant : 0\"},\"minecraft:type_family\":{\"family\":[\"slime\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement.jump\":{\"jump_delay\":[0.5,1.5]},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_aggressive\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:become_calm\",\"target\":\"self\"},\"minecraft:nameable\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.slime_float\":{\"priority\":1,\"jump_chance_percentage\":0.8,\"speed_multiplier\":1.2},\"minecraft:behavior.slime_attack\":{\"priority\":3},\"minecraft:behavior.slime_random_direction\":{\"priority\":4,\"add_random_time_range\":3,\"turn_range\":360,\"min_change_direction_time\":2.0},\"minecraft:behavior.slime_keep_on_jumping\":{\"priority\":5,\"speed_multiplier\":1.0},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":16}],\"must_see\":true},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:slime_calm\"]}},\"minecraft:become_calm\":{\"add\":{\"component_groups\":[\"minecraft:slime_calm\"]}},\"minecraft:become_aggressive\":{\"add\":{\"component_groups\":[\"minecraft:slime_aggressive\"]}}}}}'},431:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"sniffer_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.45},\"minecraft:ageable\":{\"duration\":2400,\"feed_items\":[\"torchflower_seeds\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"sniffer_adult\":{\"minecraft:behavior.breed\":{\"priority\":3,\"speed_multiplier\":1.0},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:breedable\":{\"require_tame\":false,\"causes_pregnancy\":true,\"breeds_with\":[{\"mate_type\":\"minecraft:sniffer\",\"breed_event\":{\"event\":\"on_pregnant\",\"target\":\"self\"}}],\"breed_items\":[\"torchflower_seeds\"]}},\"feeling_happy\":{\"minecraft:behavior.timer_flag_3\":{\"priority\":5,\"cooldown_range\":0.0,\"duration_range\":[2.0,5.0],\"on_end\":{\"event\":\"on_feeling_happy_end\",\"target\":\"self\"}}},\"stand_up\":{\"minecraft:behavior.timer_flag_2\":{\"priority\":2,\"control_flags\":[\"move\"],\"cooldown_range\":0.0,\"duration_range\":[2.0,5.0],\"on_end\":{\"event\":\"on_rising_end\",\"target\":\"self\"}}},\"pushable\":{\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"sniffer_pregnant\":{\"minecraft:spawn_entity\":{\"entities\":{\"min_wait_time\":0,\"max_wait_time\":0,\"spawn_sound\":\"plop\",\"spawn_item\":\"sniffer_egg\",\"spawn_item_event\":{\"event\":\"on_egg_spawned\",\"target\":\"self\"},\"single_use\":true}},\"minecraft:is_pregnant\":{}},\"sniffer_search_and_dig\":{\"minecraft:behavior.random_search_and_dig\":{\"priority\":5,\"speed_multiplier\":1.25,\"find_valid_position_retries\":5,\"target_blocks\":[\"minecraft:dirt\",\"minecraft:grass\",\"minecraft:podzol\",\"minecraft:dirt_with_roots\",\"minecraft:moss_block\",\"minecraft:mud\",\"minecraft:muddy_mangrove_roots\"],\"goal_radius\":2.0,\"search_range_xz\":20.0,\"search_range_y\":3,\"cooldown_range\":0.0,\"digging_duration_range\":[8.0,10.0],\"item_table\":\"loot_tables/gameplay/entities/sniffer_seeds.json\",\"spawn_item_after_seconds\":6.0,\"spawn_item_pos_offset\":2.25,\"on_searching_start\":{\"event\":\"on_searching_start\",\"target\":\"self\"},\"on_fail_during_searching\":{\"event\":\"on_fail_during_searching\",\"target\":\"self\"},\"on_digging_start\":{\"event\":\"on_digging_start\",\"target\":\"self\"},\"on_item_found\":{\"event\":\"on_item_found\",\"target\":\"self\"},\"on_fail_during_digging\":{\"event\":\"on_fail_during_digging\",\"target\":\"self\"},\"on_success\":{\"event\":\"on_search_and_digging_success\",\"target\":\"self\"}}}},\"components\":{\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2},\"minecraft:behavior.tempt\":{\"priority\":4,\"speed_multiplier\":1.25,\"items\":[\"torchflower_seeds\"]},\"minecraft:behavior.timer_flag_1\":{\"priority\":6,\"control_flags\":[\"move\",\"look\"],\"cooldown_range\":[400.0,500.0],\"duration_range\":2.0,\"on_end\":{\"event\":\"on_scenting_success\",\"target\":\"self\"}},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:collision_box\":{\"width\":1.9,\"height\":1.75},\"minecraft:healable\":{\"items\":[{\"item\":\"torchflower_seeds\",\"heal_amount\":2}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:type_family\":{\"family\":[\"sniffer\",\"mob\"]},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":14},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:follow_range\":{\"value\":64.0},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:movement\":{\"value\":0.09},\"minecraft:persistent\":{},\"minecraft:physics\":{},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"trigger\":\"minecraft:spawn_adult\"},{\"weight\":5,\"trigger\":\"minecraft:entity_born\"}]},\"minecraft:spawn_adult\":{\"add\":{\"component_groups\":[\"sniffer_adult\",\"pushable\"]}},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"sniffer_baby\",\"pushable\"]}},\"on_pregnant\":{\"add\":{\"component_groups\":[\"sniffer_pregnant\"]}},\"on_egg_spawned\":{\"remove\":{\"component_groups\":[\"sniffer_pregnant\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"sniffer_baby\"]},\"add\":{\"component_groups\":[\"sniffer_adult\"]}},\"on_scenting_success\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"subject\":\"self\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"sniffer_search_and_dig\"]}}]},\"on_digging_start\":{\"remove\":{\"component_groups\":[\"pushable\"]}},\"on_item_found\":{\"add\":{\"component_groups\":[\"feeling_happy\"]}},\"on_feeling_happy_end\":{\"remove\":{\"component_groups\":[\"feeling_happy\"]}},\"on_fail_during_searching\":{\"remove\":{\"component_groups\":[\"sniffer_search_and_dig\"]}},\"on_fail_during_digging\":{\"remove\":{\"component_groups\":[\"sniffer_search_and_dig\"]},\"add\":{\"component_groups\":[\"pushable\",\"stand_up\"]}},\"on_search_and_digging_success\":{\"remove\":{\"component_groups\":[\"sniffer_search_and_dig\"]},\"add\":{\"component_groups\":[\"pushable\",\"stand_up\"]}},\"on_rising_end\":{\"remove\":{\"component_groups\":[\"stand_up\"]}}}}}'},2728:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:snowman_sheared\":{\"minecraft:is_sheared\":{}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"snowgolem\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:collision_box\":{\"width\":0.4,\"height\":1.8},\"minecraft:loot\":{\"table\":\"loot_tables/entities/snowman.json\"},\"minecraft:health\":{\"value\":4,\"max\":4},\"minecraft:movement\":{\"value\":0.2},\"minecraft:navigation.walk\":{\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:attack\":{\"damage\":2},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"fall\",\"deals_damage\":false}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4},{\"filters\":{\"test\":\"is_temperature_value\",\"operator\":\">\",\"value\":1.0},\"cause\":\"temperature\",\"damage_per_tick\":1},{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"==\",\"value\":true},\"cause\":\"drowning\",\"damage_per_tick\":1}]},\"minecraft:interact\":{\"interactions\":[{\"cooldown\":2.5,\"use_item\":false,\"hurt_item\":1,\"spawn_items\":{\"table\":\"loot_tables/entities/snow_golem_shear.json\"},\"play_sounds\":\"shear\",\"interact_text\":\"action.interact.shear\",\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"shears\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_sheared\"}]},\"event\":\"minecraft:on_sheared\",\"target\":\"self\"}}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:balloonable\":{},\"minecraft:behavior.ranged_attack\":{\"priority\":1,\"speed_multiplier\":1.25,\"attack_interval\":1,\"attack_radius\":10},\"minecraft:shooter\":{\"def\":\"minecraft:snowball\"},\"minecraft:trail\":{\"block_type\":\"minecraft:snow_layer\",\"spawn_filter\":{\"test\":\"is_temperature_value\",\"operator\":\"<\",\"value\":0.81}},\"minecraft:behavior.random_stroll\":{\"priority\":2,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":3,\"look_distance\":6.0},\"minecraft:behavior.random_look_around\":{\"priority\":4},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":1,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"monster\"},\"within_default\":6}]},\"minecraft:persistent\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:on_sheared\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:snowman_sheared\"]}}}}}'},9165:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:spider_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.54,0.0]}}},\"minecraft:spider_stray_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton.stray\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.54,0.0]}}},\"minecraft:spider_wither_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:skeleton.wither\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"skeleton\"],\"seats\":{\"position\":[0.0,0.54,0.0]}}},\"minecraft:spider_neutral\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_brightness\",\"operator\":\"<\",\"value\":0.49},\"event\":\"minecraft:become_hostile\"}},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\"}},\"minecraft:spider_hostile\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_brightness\",\"operator\":\">\",\"value\":0.49},\"event\":\"minecraft:become_neutral\"}},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\"},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"attack_interval\":5,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":16}]}},\"minecraft:spider_angry\":{\"minecraft:angry\":{\"duration\":10,\"duration_delta\":3,\"calm_event\":{\"event\":\"minecraft:become_calm\",\"target\":\"self\"}},\"minecraft:behavior.leap_at_target\":{\"priority\":4,\"yd\":0.4,\"must_be_on_ground\":false},\"minecraft:behavior.melee_attack\":{\"priority\":3,\"track_target\":true,\"reach_multiplier\":0.8}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"spider\",\"monster\",\"mob\",\"arthropod\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/spider.json\"},\"minecraft:collision_box\":{\"width\":1.4,\"height\":0.9},\"minecraft:health\":{\"value\":16,\"max\":16},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.climb\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:attack\":{\"damage\":3},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":1},\"minecraft:behavior.mount_pathing\":{\"priority\":5,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":7},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.54,-0.1]}},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":1,\"randomize\":[{\"weight\":80,\"filters\":{\"all_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"is_snow_covered\",\"value\":true},{\"test\":\"is_underground\",\"value\":false}]},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_stray_jockey\",\"minecraft:spider_neutral\"]}},{\"weight\":80,\"filters\":{\"test\":\"is_biome\",\"value\":\"the_nether\"},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_wither_jockey\",\"minecraft:spider_neutral\"]}},{\"weight\":20,\"filters\":{\"any_of\":[{\"test\":\"is_daytime\",\"value\":false},{\"test\":\"is_underground\",\"value\":true}]},\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_jockey\",\"minecraft:spider_neutral\"]}}]},{\"weight\":99,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:spider_neutral\"]}}]},\"minecraft:become_hostile\":{\"remove\":{\"component_groups\":[\"minecraft:spider_neutral\"]},\"add\":{\"component_groups\":[\"minecraft:spider_hostile\"]}},\"minecraft:become_neutral\":{\"remove\":{\"component_groups\":[\"minecraft:spider_hostile\"]},\"add\":{\"component_groups\":[\"minecraft:spider_neutral\"]}},\"minecraft:become_angry\":{\"add\":{\"component_groups\":[\"minecraft:spider_angry\"]}},\"minecraft:become_calm\":{\"remove\":{\"component_groups\":[\"minecraft:spider_angry\"]}}}}}'},7534:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:squid\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:squid_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"!query.is_baby && query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"squid\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.95,\"height\":0.95},\"minecraft:health\":{\"value\":10,\"max\":10},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/squid.json\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":false,\"breathes_water\":true},\"minecraft:movement\":{\"value\":0.2},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_sink\":false},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.squid_move_away_from_ground\":{\"priority\":1},\"minecraft:behavior.squid_flee\":{\"priority\":2},\"minecraft:behavior.squid_idle\":{\"priority\":2},\"minecraft:behavior.squid_dive\":{\"priority\":2},\"minecraft:behavior.squid_out_of_water\":{\"priority\":2},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"remove\":{},\"add\":{}},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:squid_baby\"]}}]}}}}'},1369:e=>{e.exports='{\"format_version\":\"1.14.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:strider_saddled\":{\"minecraft:is_saddled\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/strider_saddled.json\"},\"minecraft:boostable\":{\"speed_multiplier\":2.0,\"duration\":16.0,\"boost_items\":[{\"item\":\"warped_fungus_on_a_stick\",\"damage\":1,\"replace_item\":\"fishing_rod\"}]},\"minecraft:rideable\":{\"priority\":0,\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\"],\"interact_text\":\"action.interact.ride.strider\",\"seats\":{\"position\":[0.0,1.6,-0.2]}},\"minecraft:item_controllable\":{\"control_items\":\"warped_fungus_on_a_stick\"},\"minecraft:behavior.controlled_by_player\":{\"priority\":0,\"mount_speed_multiplier\":1.45}},\"minecraft:strider_unsaddled\":{\"minecraft:interact\":{\"interactions\":[{\"on_interact\":{\"filters\":{\"test\":\"has_equipment\",\"subject\":\"other\",\"domain\":\"hand\",\"value\":\"saddle\"},\"event\":\"minecraft:on_saddled\"},\"use_item\":true,\"play_sounds\":\"saddle\",\"interact_text\":\"action.interact.saddle\"}]}},\"minecraft:strider_piglin_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:zombie_pigman\",\"spawn_event\":\"minecraft:spawn_as_strider_jockey\"},\"minecraft:rideable\":{\"priority\":0,\"seat_count\":1,\"crouching_skip_interact\":true,\"family_types\":[\"player\",\"zombie_pigman\"],\"interact_text\":\"action.interact.ride.strider\",\"seats\":{\"position\":[0.0,1.65,-0.2]}}},\"minecraft:strider_parent_jockey\":{\"minecraft:addrider\":{\"entity_type\":\"minecraft:strider\",\"spawn_event\":\"spawn_baby\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"strider\"],\"seats\":{\"position\":[0.0,1.6,0.0]}}},\"minecraft:strider_baby\":{\"minecraft:type_family\":{\"family\":[\"strider\",\"strider_baby\",\"mob\"]},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"warped_fungus\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.follow_parent\":{\"priority\":6,\"speed_multiplier\":1.1}},\"minecraft:strider_adult\":{\"minecraft:type_family\":{\"family\":[\"strider\",\"strider_adult\",\"mob\"]},\"minecraft:behavior.breed\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/strider.json\"},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:breedable\":{\"require_tame\":false,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"warped_fungus\"]}},\"minecraft:start_suffocating\":{\"minecraft:is_shaking\":{},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"any_of\":[{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},{\"test\":\"in_lava\",\"subject\":\"other\",\"operator\":\"==\",\"value\":true}]},\"event\":\"stop_suffocating\"}}},\"minecraft:detect_suffocating\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"all_of\":[{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},{\"any_of\":[{\"test\":\"is_riding\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},{\"test\":\"in_lava\",\"subject\":\"other\",\"operator\":\"==\",\"value\":false}]}]},\"event\":\"start_suffocating\"}}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"strider\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.9,\"height\":1.7},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_water_or_rain\",\"operator\":\"==\",\"value\":true},\"cause\":\"drowning\",\"damage_per_tick\":1}]},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:movement\":{\"value\":0.16},\"minecraft:lava_movement\":{\"value\":0.32},\"minecraft:movement.basic\":{},\"minecraft:navigation.walk\":{\"can_path_over_lava\":true,\"avoid_water\":true,\"can_sink\":false,\"can_walk_in_lava\":true},\"minecraft:jump.static\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:fire_immune\":{},\"minecraft:nameable\":{},\"minecraft:physics\":{},\"minecraft:behavior.rise_to_liquid_level\":{\"priority\":0,\"liquid_y_offset\":0.25,\"rise_delta\":0.01,\"sink_delta\":0.01},\"minecraft:behavior.move_to_liquid\":{\"priority\":7,\"search_range\":16,\"search_height\":10,\"goal_radius\":0.9,\"material_type\":\"Lava\",\"search_count\":30},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":0.8},\"minecraft:behavior.look_at_player\":{\"priority\":9,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":10},\"minecraft:behavior.panic\":{\"priority\":3,\"speed_multiplier\":1.1,\"panic_sound\":\"panic\",\"sound_interval\":{\"range_min\":1.0,\"range_max\":3.0}},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.2,\"items\":[\"warped_fungus\",\"warped_fungus_on_a_stick\"],\"can_tempt_while_ridden\":true,\"tempt_sound\":\"tempt\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":5.0}},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":40,\"trigger\":\"spawn_adult\"},{\"weight\":2,\"trigger\":\"spawn_adult_piglin_jockey\"},{\"weight\":8,\"trigger\":\"spawn_adult_parent_jockey\"},{\"weight\":50,\"trigger\":\"spawn_baby\"}]},\"minecraft:entity_born\":{\"trigger\":\"spawn_baby\"},\"spawn_adult\":{\"add\":{\"component_groups\":[\"minecraft:strider_adult\",\"minecraft:strider_unsaddled\",\"minecraft:detect_suffocating\"]}},\"spawn_adult_parent_jockey\":{\"add\":{\"component_groups\":[\"minecraft:strider_adult\",\"minecraft:strider_parent_jockey\",\"minecraft:strider_unsaddled\",\"minecraft:detect_suffocating\"]}},\"spawn_adult_piglin_jockey\":{\"add\":{\"component_groups\":[\"minecraft:strider_adult\",\"minecraft:strider_saddled\",\"minecraft:strider_piglin_jockey\",\"minecraft:detect_suffocating\"]}},\"spawn_baby\":{\"add\":{\"component_groups\":[\"minecraft:strider_baby\",\"minecraft:detect_suffocating\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:strider_baby\"]},\"add\":{\"component_groups\":[\"minecraft:strider_adult\",\"minecraft:strider_unsaddled\"]}},\"minecraft:on_saddled\":{\"remove\":{\"component_groups\":[\"minecraft:strider_unsaddled\"]},\"add\":{\"component_groups\":[\"minecraft:strider_saddled\"]}},\"start_suffocating\":{\"add\":{\"component_groups\":[\"minecraft:start_suffocating\"]}},\"stop_suffocating\":{\"add\":{\"component_groups\":[\"minecraft:detect_suffocating\"]},\"remove\":{\"component_groups\":[\"minecraft:start_suffocating\"]}}}}}'},927:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"grow_up\":{\"minecraft:transformation\":{\"into\":\"minecraft:frog\",\"transformation_sound\":\"convert_to_frog\"}}},\"components\":{\"minecraft:is_hidden_when_invisible\":{},\"minecraft:type_family\":{\"family\":[\"tadpole\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.8,\"height\":0.6},\"minecraft:breathable\":{\"total_supply\":8,\"suffocate_time\":0,\"breathes_water\":true,\"breathes_air\":false,\"generates_bubbles\":false},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":6},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:navigation.generic\":{\"can_path_over_water\":true,\"can_swim\":true,\"can_walk\":false,\"can_sink\":false,\"avoid_damage_blocks\":true},\"minecraft:movement.sway\":{\"sway_amplitude\":0.0},\"minecraft:movement\":{\"value\":0.1},\"minecraft:underwater_movement\":{\"value\":0.1},\"minecraft:physics\":{},\"minecraft:pushable\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:is_baby\":{},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"slime_ball\"],\"grow_up\":{\"event\":\"ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":2.0},\"minecraft:behavior.tempt\":{\"priority\":5,\"speed_multiplier\":1.25,\"can_tempt_vertically\":true,\"items\":[\"slime_ball\"]},\"minecraft:behavior.random_swim\":{\"priority\":2,\"interval\":100},\"minecraft:behavior.look_at_player\":{\"priority\":3,\"target_distance\":6.0,\"probability\":0.02}},\"events\":{\"ageable_grow_up\":{\"sequence\":[{\"add\":{\"component_groups\":[\"grow_up\"]}}]}}}}'},2998:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:baby\":{\"minecraft:type_family\":{\"family\":[\"turtle\",\"baby_turtle\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.2},\"minecraft:underwater_movement\":{\"value\":0.06},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.16},\"minecraft:behavior.move_to_water\":{\"priority\":1,\"search_range\":15,\"search_height\":5,\"goal_radius\":0.1},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"seagrass\"],\"drop_items\":[\"turtle_shell_piece\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"minecraft:adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:type_family\":{\"family\":[\"turtle\",\"mob\"]},\"minecraft:collision_box\":{\"width\":1.2,\"height\":0.4},\"minecraft:underwater_movement\":{\"value\":0.12},\"minecraft:loot\":{\"table\":\"loot_tables/entities/sea_turtle.json\"},\"minecraft:breedable\":{\"require_tame\":false,\"causes_pregnancy\":true,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:become_pregnant\",\"target\":\"self\"}},\"breed_items\":[\"seagrass\"]},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0},\"minecraft:behavior.move_to_land\":{\"priority\":6,\"search_range\":16,\"search_height\":5,\"goal_radius\":0.5},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"interval\":100}},\"minecraft:pregnant\":{\"minecraft:behavior.go_home\":{\"priority\":1,\"speed_multiplier\":1.0,\"interval\":700,\"goal_radius\":4.0,\"on_home\":{\"event\":\"minecraft:go_lay_egg\",\"target\":\"self\"}}},\"minecraft:wants_to_lay_egg\":{\"minecraft:behavior.lay_egg\":{\"priority\":1,\"speed_multiplier\":1.0,\"search_range\":16,\"search_height\":4,\"goal_radius\":1.5,\"on_lay\":{\"event\":\"minecraft:laid_egg\",\"target\":\"self\"}}}},\"components\":{\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true,\"breathes_air\":true,\"generates_bubbles\":false},\"minecraft:nameable\":{},\"minecraft:health\":{\"value\":30},\"minecraft:damage_sensor\":{\"triggers\":{\"cause\":\"lightning\",\"deals_damage\":true,\"damage_multiplier\":2000.0}},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.1},\"minecraft:water_movement\":{\"drag_factor\":0.9},\"minecraft:navigation.generic\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"can_swim\":true,\"can_walk\":true,\"can_sink\":false,\"avoid_damage_blocks\":true},\"minecraft:movement.amphibious\":{\"max_turn\":5.0},\"minecraft:jump.static\":{},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:home\":{},\"minecraft:follow_range\":{\"value\":1024},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.panic\":{\"priority\":0,\"prefer_water\":true,\"speed_multiplier\":1.2},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.tempt\":{\"priority\":3,\"speed_multiplier\":1.1,\"items\":[\"seagrass\"]},\"minecraft:behavior.move_to_water\":{\"priority\":4,\"search_range\":16,\"search_height\":5,\"goal_radius\":1.5},\"minecraft:behavior.random_swim\":{\"priority\":7,\"interval\":0,\"xz_dist\":30,\"y_dist\":15},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":9,\"add\":{\"component_groups\":[\"minecraft:adult\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"minecraft:baby\"]}}]},\"minecraft:entity_born\":{\"add\":{\"component_groups\":[\"minecraft:baby\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:baby\"]},\"add\":{\"component_groups\":[\"minecraft:adult\"]}},\"minecraft:become_pregnant\":{\"add\":{\"component_groups\":[\"minecraft:pregnant\"]}},\"minecraft:go_lay_egg\":{\"add\":{\"component_groups\":[\"minecraft:wants_to_lay_egg\"]},\"remove\":{\"component_groups\":[\"minecraft:pregnant\"]}},\"minecraft:laid_egg\":{\"remove\":{\"component_groups\":[\"minecraft:wants_to_lay_egg\"]}}}}}'},7359:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:vex\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"vex\",\"monster\",\"mob\"]},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/vex_gear.json\"},\"minecraft:health\":{\"value\":14,\"max\":14},\"minecraft:attack\":{\"damage\":3},\"minecraft:collision_box\":{\"width\":0.4,\"height\":0.8},\"minecraft:movement\":{\"value\":1.0},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:fire_immune\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.charge_attack\":{\"priority\":4},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":70},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]},\"max_dist\":70}],\"must_see\":true},\"minecraft:behavior.look_at_player\":{\"priority\":9,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.look_at_entity\":{\"priority\":9,\"look_distance\":6.0,\"probability\":0.02,\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mob\"}},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:physics\":{\"has_gravity\":false,\"has_collision\":false},\"minecraft:conditional_bandwidth_optimization\":{}}}}'},834:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:villager\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"trade_resupply_component_group\":{\"minecraft:trade_resupply\":{}},\"become_witch\":{\"minecraft:transformation\":{\"into\":\"minecraft:witch\",\"delay\":0.5}},\"become_zombie\":{\"minecraft:transformation\":{\"into\":\"minecraft:zombie_villager_v2\",\"keep_level\":true}},\"work_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":8000}]},\"event\":\"minecraft:schedule_work_pro_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":8000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":10000}]},\"event\":\"minecraft:schedule_gather_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":10000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_work_pro_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"basic_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":8000}]},\"event\":\"minecraft:schedule_wander_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":8000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":10000}]},\"event\":\"minecraft:schedule_gather_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":10000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_wander_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"child_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_play_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"jobless_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":2000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":13000}]},\"event\":\"minecraft:schedule_wander_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":13000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":14000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":14000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":2000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"fisher_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":8000}]},\"event\":\"minecraft:schedule_work_fisher\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":8000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":10000}]},\"event\":\"minecraft:schedule_gather_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":10000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_work_fisher\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"librarian_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":8000}]},\"event\":\"minecraft:schedule_work_librarian\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":8000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":10000}]},\"event\":\"minecraft:schedule_gather_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":10000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_work_librarian\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"farmer_schedule\":{\"minecraft:scheduler\":{\"min_delay_secs\":0,\"max_delay_secs\":10,\"scheduled_events\":[{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":0},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":8000}]},\"event\":\"minecraft:schedule_work_farmer\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":8000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":10000}]},\"event\":\"minecraft:schedule_gather_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":10000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":11000}]},\"event\":\"minecraft:schedule_work_farmer\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":11000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},\"event\":\"minecraft:schedule_home_villager\"},{\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":24000}]},\"event\":\"minecraft:schedule_bed_villager\"}]}},\"job_specific_goals\":{\"minecraft:behavior.inspect_bookshelf\":{},\"minecraft:behavior.harvest_farm_block\":{},\"minecraft:behavior.explore_outskirts\":{},\"minecraft:behavior.work\":{},\"minecraft:behavior.mingle\":{},\"minecraft:behavior.sleep\":{}},\"work_schedule_villager\":{\"minecraft:behavior.work\":{\"priority\":7,\"active_time\":250,\"speed_multiplier\":0.5,\"goal_cooldown\":200,\"sound_delay_min\":100,\"sound_delay_max\":200,\"can_work_in_rain\":false,\"work_in_rain_tolerance\":100,\"on_arrival\":{\"event\":\"minecraft:resupply_trades\",\"target\":\"self\"}}},\"work_schedule_fisher\":{\"minecraft:behavior.work\":{\"priority\":7,\"active_time\":250,\"speed_multiplier\":0.5,\"goal_cooldown\":200,\"sound_delay_min\":100,\"sound_delay_max\":200,\"can_work_in_rain\":false,\"work_in_rain_tolerance\":100,\"on_arrival\":{\"event\":\"minecraft:resupply_trades\",\"target\":\"self\"}}},\"work_schedule_farmer\":{\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:bread\",\"want_amount\":3,\"surplus_amount\":6,\"stored_in_inventory\":true},{\"item\":\"minecraft:carrot\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:potato\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:beetroot\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:wheat_seeds\",\"want_amount\":64,\"surplus_amount\":64,\"stored_in_inventory\":true},{\"item\":\"minecraft:beetroot_seeds\",\"want_amount\":64,\"surplus_amount\":64,\"stored_in_inventory\":true},{\"item\":\"minecraft:wheat\",\"want_amount\":45,\"surplus_amount\":18,\"craft_into\":\"minecraft:bread\",\"stored_in_inventory\":true}]},\"minecraft:behavior.work\":{\"priority\":7,\"active_time\":250,\"speed_multiplier\":0.5,\"goal_cooldown\":200,\"sound_delay_min\":100,\"sound_delay_max\":200,\"can_work_in_rain\":false,\"work_in_rain_tolerance\":100,\"on_arrival\":{\"event\":\"minecraft:resupply_trades\",\"target\":\"self\"}},\"minecraft:behavior.harvest_farm_block\":{\"priority\":8,\"speed_multiplier\":0.5}},\"work_schedule_librarian\":{\"minecraft:behavior.work\":{\"priority\":7,\"active_time\":250,\"speed_multiplier\":0.5,\"goal_cooldown\":200,\"sound_delay_min\":100,\"sound_delay_max\":200,\"can_work_in_rain\":false,\"work_in_rain_tolerance\":100,\"on_arrival\":{\"event\":\"minecraft:resupply_trades\",\"target\":\"self\"}},\"minecraft:behavior.inspect_bookshelf\":{\"priority\":8,\"speed_multiplier\":0.6,\"search_range\":4,\"search_height\":3,\"goal_radius\":0.8,\"search_count\":0}},\"play_schedule_villager\":{\"minecraft:behavior.play\":{\"priority\":8,\"speed_multiplier\":0.32}},\"gather_schedule_villager\":{\"minecraft:behavior.mingle\":{\"priority\":7,\"speed_multiplier\":0.5,\"duration\":30,\"cooldown_time\":10,\"mingle_partner_type\":\"minecraft:villager_v2\",\"mingle_distance\":2.0}},\"home_schedule_villager\":{},\"bed_schedule_villager\":{\"minecraft:behavior.sleep\":{\"priority\":3,\"goal_radius\":1.5,\"speed_multiplier\":0.6,\"sleep_collider_height\":0.3,\"sleep_collider_width\":1.0,\"sleep_y_offset\":0.6,\"timeout_cooldown\":10.0}},\"wander_schedule_villager\":{\"minecraft:behavior.explore_outskirts\":{\"priority\":9,\"explore_dist\":6.0,\"wait_time\":200,\"speed_multiplier\":0.6}},\"behavior_peasant\":{\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:bread\",\"want_amount\":3,\"surplus_amount\":6,\"stored_in_inventory\":true},{\"item\":\"minecraft:carrot\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:potato\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:beetroot\",\"want_amount\":60,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:wheat_seeds\",\"want_amount\":64,\"surplus_amount\":64,\"stored_in_inventory\":true},{\"item\":\"minecraft:beetroot_seeds\",\"want_amount\":64,\"surplus_amount\":64,\"stored_in_inventory\":true},{\"item\":\"minecraft:wheat\",\"want_amount\":45,\"surplus_amount\":18,\"craft_into\":\"minecraft:bread\",\"stored_in_inventory\":true}]}},\"behavior_non_peasant\":{\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:bread\",\"want_amount\":3,\"surplus_amount\":6,\"stored_in_inventory\":true},{\"item\":\"minecraft:carrot\",\"want_amount\":12,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:potato\",\"want_amount\":12,\"surplus_amount\":24,\"stored_in_inventory\":true},{\"item\":\"minecraft:beetroot\",\"want_amount\":12,\"surplus_amount\":24,\"stored_in_inventory\":true}]}},\"trade_components\":{\"minecraft:behavior.trade_interest\":{},\"minecraft:economy_trade_table\":{}},\"unskilled\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"mob\"]},\"minecraft:variant\":{\"value\":0}},\"farmer\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"farmer\",\"mob\"]},\"minecraft:variant\":{\"value\":1},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.farmer\",\"table\":\"trading/economy_trades/farmer_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"farmer\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"fisherman\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"fisherman\",\"mob\"]},\"minecraft:variant\":{\"value\":2},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.fisherman\",\"table\":\"trading/economy_trades/fisherman_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"fisherman\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"shepherd\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"shepherd\",\"mob\"]},\"minecraft:variant\":{\"value\":3},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.shepherd\",\"table\":\"trading/economy_trades/shepherd_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"shepherd\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"fletcher\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"fletcher\",\"mob\"]},\"minecraft:variant\":{\"value\":4},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.fletcher\",\"table\":\"trading/economy_trades/fletcher_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"fletcher\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"librarian\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"librarian\",\"mob\"]},\"minecraft:variant\":{\"value\":5},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.librarian\",\"table\":\"trading/economy_trades/librarian_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"librarian\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"cartographer\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"cartographer\",\"mob\"]},\"minecraft:variant\":{\"value\":6},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.cartographer\",\"table\":\"trading/economy_trades/cartographer_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"cartographer\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"cleric\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"priest\",\"cleric\",\"mob\"]},\"minecraft:variant\":{\"value\":7},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.cleric\",\"table\":\"trading/economy_trades/cleric_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"cleric\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"armorer\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"blacksmith\",\"armorer\",\"mob\"]},\"minecraft:variant\":{\"value\":8},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.armor\",\"table\":\"trading/economy_trades/armorer_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"armorer\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"weaponsmith\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"blacksmith\",\"weaponsmith\",\"mob\"]},\"minecraft:variant\":{\"value\":9},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.weapon\",\"table\":\"trading/economy_trades/weapon_smith_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"weaponsmith\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"toolsmith\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"blacksmith\",\"toolsmith\",\"mob\"]},\"minecraft:variant\":{\"value\":10},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.tool\",\"table\":\"trading/economy_trades/tool_smith_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"toolsmith\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"butcher\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"artisan\",\"butcher\",\"mob\"]},\"minecraft:variant\":{\"value\":11},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.butcher\",\"table\":\"trading/economy_trades/butcher_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"butcher\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"leatherworker\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"artisan\",\"leatherworker\",\"mob\"]},\"minecraft:variant\":{\"value\":12},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.leather\",\"table\":\"trading/economy_trades/leather_worker_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"leatherworker\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"mason\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"artisan\",\"stone_mason\",\"mob\"]},\"minecraft:variant\":{\"value\":13},\"minecraft:behavior.trade_interest\":{\"priority\":5,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.villager.mason\",\"table\":\"trading/economy_trades/stone_mason_trades.json\",\"new_screen\":true,\"persist_trades\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"preferred_profession\":\"mason\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5}},\"nitwit\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"peasant\",\"nitwit\",\"mob\"]},\"minecraft:variant\":{\"value\":14}},\"baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}},\"minecraft:behavior.take_flower\":{\"priority\":9},\"minecraft:preferred_path\":{\"max_fall_blocks\":1,\"jump_cost\":5,\"default_block_cost\":1.5,\"preferred_path_blocks\":[{\"cost\":0,\"blocks\":[\"grass_path\"]},{\"cost\":1,\"blocks\":[\"cobblestone\",\"stone\",\"stonebrick\",\"sandstone\",\"mossy_cobblestone\",\"stone_slab\",\"stone_slab2\",\"stone_slab3\",\"stone_slab4\",\"double_stone_slab\",\"double_stone_slab2\",\"double_stone_slab3\",\"double_stone_slab4\",\"wooden_slab\",\"double_wooden_slab\",\"planks\",\"brick_block\",\"nether_brick\",\"red_nether_brick\",\"end_bricks\",\"red_sandstone\",\"stained_glass\",\"glass\",\"glowstone\",\"prismarine\",\"emerald_block\",\"diamond_block\",\"lapis_block\",\"gold_block\",\"redstone_block\",\"purple_glazed_terracotta\",\"white_glazed_terracotta\",\"orange_glazed_terracotta\",\"magenta_glazed_terracotta\",\"light_blue_glazed_terracotta\",\"yellow_glazed_terracotta\",\"lime_glazed_terracotta\",\"pink_glazed_terracotta\",\"gray_glazed_terracotta\",\"silver_glazed_terracotta\",\"cyan_glazed_terracotta\",\"blue_glazed_terracotta\",\"brown_glazed_terracotta\",\"green_glazed_terracotta\",\"red_glazed_terracotta\",\"black_glazed_terracotta\"]},{\"cost\":50,\"blocks\":[\"bed\",\"lectern\",\"composter\",\"grindstone\",\"blast_furnace\",\"smoker\",\"fletching_table\",\"cartography_table\",\"brewing_stand\",\"smithing_table\",\"cauldron\",\"barrel\",\"loom\",\"stonecutter\"]}]}},\"adult\":{\"minecraft:behavior.make_love\":{\"priority\":5},\"minecraft:behavior.receive_love\":{\"priority\":6},\"minecraft:preferred_path\":{\"max_fall_blocks\":1,\"jump_cost\":20,\"default_block_cost\":3,\"preferred_path_blocks\":[{\"cost\":0,\"blocks\":[\"grass_path\"]},{\"cost\":1,\"blocks\":[\"cobblestone\",\"stone\",\"stonebrick\",\"sandstone\",\"mossy_cobblestone\",\"stone_slab\",\"stone_slab2\",\"stone_slab3\",\"stone_slab4\",\"double_stone_slab\",\"double_stone_slab2\",\"double_stone_slab3\",\"double_stone_slab4\",\"wooden_slab\",\"double_wooden_slab\",\"planks\",\"brick_block\",\"nether_brick\",\"red_nether_brick\",\"end_bricks\",\"red_sandstone\",\"stained_glass\",\"glass\",\"glowstone\",\"prismarine\",\"emerald_block\",\"diamond_block\",\"lapis_block\",\"gold_block\",\"redstone_block\",\"purple_glazed_terracotta\",\"white_glazed_terracotta\",\"orange_glazed_terracotta\",\"magenta_glazed_terracotta\",\"light_blue_glazed_terracotta\",\"yellow_glazed_terracotta\",\"lime_glazed_terracotta\",\"pink_glazed_terracotta\",\"gray_glazed_terracotta\",\"silver_glazed_terracotta\",\"cyan_glazed_terracotta\",\"blue_glazed_terracotta\",\"brown_glazed_terracotta\",\"green_glazed_terracotta\",\"red_glazed_terracotta\",\"black_glazed_terracotta\"]},{\"cost\":50,\"blocks\":[\"bed\",\"lectern\",\"composter\",\"grindstone\",\"blast_furnace\",\"smoker\",\"fletching_table\",\"cartography_table\",\"brewing_stand\",\"smithing_table\",\"cauldron\",\"barrel\",\"loom\",\"stonecutter\"]}]}},\"villager_skin_0\":{\"minecraft:skin_id\":{\"value\":0}},\"villager_skin_1\":{\"minecraft:skin_id\":{\"value\":1}},\"villager_skin_2\":{\"minecraft:skin_id\":{\"value\":2}},\"villager_skin_3\":{\"minecraft:skin_id\":{\"value\":3}},\"villager_skin_4\":{\"minecraft:skin_id\":{\"value\":4}},\"villager_skin_5\":{\"minecraft:skin_id\":{\"value\":5}},\"desert_villager\":{\"minecraft:mark_variant\":{\"value\":1}},\"jungle_villager\":{\"minecraft:mark_variant\":{\"value\":2}},\"savanna_villager\":{\"minecraft:mark_variant\":{\"value\":3}},\"snow_villager\":{\"minecraft:mark_variant\":{\"value\":4}},\"swamp_villager\":{\"minecraft:mark_variant\":{\"value\":5}},\"taiga_villager\":{\"minecraft:mark_variant\":{\"value\":6}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"villager\",\"mob\"]},\"minecraft:mark_variant\":{\"value\":0},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:hide\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:nameable\":{},\"minecraft:movement\":{\"value\":0.5},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_pass_doors\":true,\"can_open_doors\":true,\"avoid_water\":true},\"minecraft:follow_range\":{\"value\":128},\"minecraft:annotation.open_door\":{},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:inventory\":{\"inventory_size\":8,\"private\":true},\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"inhabitant\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":true,\"can_migrate\":true,\"first_founding_reward\":5},\"minecraft:damage_sensor\":{\"triggers\":[{\"on_damage\":{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"lightning\"},\"event\":\"become_witch\"},\"deals_damage\":false},{\"on_damage\":{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"husk\"}],\"all_of\":[{\"test\":\"has_damage\",\"value\":\"fatal\"}]},\"event\":\"become_zombie\"}}]},\"minecraft:persistent\":{},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.hide\":{\"priority\":0,\"speed_multiplier\":0.8,\"poi_type\":\"bed\",\"duration\":30.0},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":0.6},\"minecraft:behavior.trade_with_player\":{\"priority\":2},\"minecraft:behavior.avoid_mob_type\":{\"priority\":4,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie_villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie_pigman\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"illager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"vex\"}]},\"max_dist\":8,\"walk_speed_multiplier\":0.6,\"sprint_speed_multiplier\":0.6}]},\"minecraft:behavior.pickup_items\":{\"priority\":4,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":0.5,\"can_pickup_to_hand_or_equipment\":false},\"minecraft:behavior.move_indoors\":{\"priority\":6,\"speed_multiplier\":0.8,\"timeout_cooldown\":8.0},\"minecraft:behavior.look_at_trading_player\":{\"priority\":7},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":8,\"probability\":0.02},\"minecraft:behavior.share_items\":{\"priority\":9,\"max_dist\":3,\"goal_radius\":2.0,\"speed_multiplier\":0.5,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"}}]},\"minecraft:behavior.move_towards_restriction\":{\"priority\":10,\"speed_multiplier\":0.6},\"minecraft:behavior.random_stroll\":{\"priority\":10,\"speed_multiplier\":0.6},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"become_witch\":{\"add\":{\"component_groups\":[\"become_witch\"]}},\"become_zombie\":{\"sequence\":[{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"normal\"},\"randomize\":[{\"weight\":50,\"add\":{\"component_groups\":[\"become_zombie\"]}},{\"weight\":50}]},{\"filters\":{\"test\":\"is_difficulty\",\"value\":\"hard\"},\"add\":{\"component_groups\":[\"become_zombie\"]}}]},\"minecraft:entity_spawned\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:skin_id\"},\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_0\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_1\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_2\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_3\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_4\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_5\"]}}]},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":5,\"add\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":95,\"sequence\":[{\"add\":{\"component_groups\":[\"adult\"]}},{\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"farmer\",\"behavior_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"fisherman\",\"behavior_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"shepherd\",\"behavior_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"fletcher\",\"behavior_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"librarian\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"cartographer\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"cleric\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"armorer\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"weaponsmith\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"toolsmith\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"butcher\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"leatherworker\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"mason\",\"behavior_non_peasant\",\"basic_schedule\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"nitwit\",\"behavior_peasant\",\"jobless_schedule\"]}}]}]}]},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"desert\"},{\"test\":\"has_biome_tag\",\"value\":\"mesa\"}]},\"add\":{\"component_groups\":[\"desert_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},\"add\":{\"component_groups\":[\"jungle_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},\"add\":{\"component_groups\":[\"savanna_villager\"]}},{\"filters\":{\"any_of\":[{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"ocean\"}]},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"}]},\"add\":{\"component_groups\":[\"snow_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"swamp\"},\"add\":{\"component_groups\":[\"swamp_villager\"]}},{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"taiga\"},{\"test\":\"has_biome_tag\",\"value\":\"extreme_hills\"}]},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"cold\"}]},\"add\":{\"component_groups\":[\"taiga_villager\"]}}]},\"minecraft:spawn_from_village\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":5,\"add\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":95,\"add\":{\"component_groups\":[\"adult\"]},\"sequence\":[{\"randomize\":[{\"weight\":90,\"add\":{\"component_groups\":[\"unskilled\",\"behavior_peasant\",\"basic_schedule\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"nitwit\",\"behavior_peasant\",\"jobless_schedule\"]}}]}]}]},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:skin_id\"},\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_0\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_1\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_2\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_3\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_4\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_5\"]}}]},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"desert\"},{\"test\":\"has_biome_tag\",\"value\":\"mesa\"}]},\"add\":{\"component_groups\":[\"desert_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},\"add\":{\"component_groups\":[\"jungle_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},\"add\":{\"component_groups\":[\"savanna_villager\"]}},{\"filters\":{\"any_of\":[{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"ocean\"}]},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"}]},\"add\":{\"component_groups\":[\"snow_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"swamp\"},\"add\":{\"component_groups\":[\"swamp_villager\"]}},{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"taiga\"},{\"test\":\"has_biome_tag\",\"value\":\"extreme_hills\"}]},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"cold\"}]},\"add\":{\"component_groups\":[\"taiga_villager\"]}}]},\"minecraft:entity_transformed\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"==\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"adult\"]},\"sequence\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"farmer\"},\"add\":{\"component_groups\":[\"farmer\",\"behavior_peasant\",\"farmer_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fisherman\"},\"add\":{\"component_groups\":[\"fisherman\",\"behavior_peasant\",\"fisher_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"shepherd\"},\"add\":{\"component_groups\":[\"shepherd\",\"behavior_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fletcher\"},\"add\":{\"component_groups\":[\"fletcher\",\"behavior_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"librarian\"},\"add\":{\"component_groups\":[\"librarian\",\"behavior_non_peasant\",\"librarian_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cartographer\"},\"add\":{\"component_groups\":[\"cartographer\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cleric\"},\"add\":{\"component_groups\":[\"cleric\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"armorer\"},\"add\":{\"component_groups\":[\"armorer\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"weaponsmith\"},\"add\":{\"component_groups\":[\"weaponsmith\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"toolsmith\"},\"add\":{\"component_groups\":[\"toolsmith\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"butcher\"},\"add\":{\"component_groups\":[\"butcher\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"leatherworker\"},\"add\":{\"component_groups\":[\"leatherworker\",\"behavior_non_peasant\",\"work_schedule\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"mason\"},\"add\":{\"component_groups\":[\"mason\",\"behavior_non_peasant\",\"work_schedule\"]}}]},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"==\",\"value\":\"zombie_villager\"},\"sequence\":[{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":0},\"add\":{\"component_groups\":[\"villager_skin_0\"]}},{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":1},\"add\":{\"component_groups\":[\"villager_skin_1\"]}},{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":2},\"add\":{\"component_groups\":[\"villager_skin_2\"]}},{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":3},\"add\":{\"component_groups\":[\"villager_skin_3\"]}},{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":4},\"add\":{\"component_groups\":[\"villager_skin_4\"]}},{\"filters\":{\"test\":\"is_skin_id\",\"subject\":\"other\",\"value\":5},\"add\":{\"component_groups\":[\"villager_skin_5\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":1},\"add\":{\"component_groups\":[\"desert_villager\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":2},\"add\":{\"component_groups\":[\"jungle_villager\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":3},\"add\":{\"component_groups\":[\"savanna_villager\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":4},\"add\":{\"component_groups\":[\"snow_villager\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":5},\"add\":{\"component_groups\":[\"swamp_villager\"]}},{\"filters\":{\"test\":\"is_mark_variant\",\"subject\":\"other\",\"value\":6},\"add\":{\"component_groups\":[\"taiga_villager\"]}}]},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"==\",\"value\":\"villager\"},\"sequence\":[{\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_0\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_1\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_2\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_3\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_4\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_5\"]}}]},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"desert\"},{\"test\":\"has_biome_tag\",\"value\":\"mesa\"}]},\"add\":{\"component_groups\":[\"desert_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},\"add\":{\"component_groups\":[\"jungle_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},\"add\":{\"component_groups\":[\"savanna_villager\"]}},{\"filters\":{\"any_of\":[{\"all_of\":[{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"ocean\"}]},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"}]},\"add\":{\"component_groups\":[\"snow_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"swamp\"},\"add\":{\"component_groups\":[\"swamp_villager\"]}},{\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"taiga\"},{\"test\":\"has_biome_tag\",\"value\":\"extreme_hills\"}]},{\"test\":\"has_biome_tag\",\"operator\":\"!=\",\"value\":\"cold\"}]},\"add\":{\"component_groups\":[\"taiga_villager\"]}}]}]},\"minecraft:entity_born\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:skin_id\"},\"randomize\":[{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_0\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_1\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_2\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_3\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_4\"]}},{\"weight\":1,\"add\":{\"component_groups\":[\"villager_skin_5\"]}}]},{\"add\":{\"component_groups\":[\"baby\",\"unskilled\",\"child_schedule\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"desert\"},\"add\":{\"component_groups\":[\"desert_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"jungle\"},\"add\":{\"component_groups\":[\"jungle_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"savanna\"},\"add\":{\"component_groups\":[\"savanna_villager\"]}},{\"filters\":{\"any_of\":[{\"test\":\"has_biome_tag\",\"value\":\"cold\"},{\"test\":\"has_biome_tag\",\"value\":\"frozen\"}]},\"add\":{\"component_groups\":[\"snow_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"swamp\"},\"add\":{\"component_groups\":[\"swamp_villager\"]}},{\"filters\":{\"test\":\"has_biome_tag\",\"value\":\"taiga\"},\"add\":{\"component_groups\":[\"taiga_villager\"]}}]},\"minecraft:spawn_farmer\":{\"randomize\":[{\"weight\":5,\"add\":{\"component_groups\":[\"farmer\",\"adult\",\"behavior_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fisherman\",\"adult\",\"behavior_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"shepherd\",\"adult\",\"behavior_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fletcher\",\"adult\",\"behavior_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"mason\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}}]},\"minecraft:spawn_librarian\":{\"randomize\":[{\"weight\":20,\"add\":{\"component_groups\":[\"librarian\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"cartographer\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}}]},\"minecraft:spawn_cleric\":{\"add\":{\"component_groups\":[\"cleric\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},\"minecraft:spawn_armorer\":{\"randomize\":[{\"weight\":6,\"add\":{\"component_groups\":[\"armorer\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"weaponsmith\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"toolsmith\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}}]},\"minecraft:spawn_butcher\":{\"randomize\":[{\"weight\":10,\"add\":{\"component_groups\":[\"butcher\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"leatherworker\",\"adult\",\"behavior_non_peasant\",\"basic_schedule\"]},\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]}}]},\"minecraft:ageable_grow_up\":{\"randomize\":[{\"weight\":10,\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]},\"add\":{\"component_groups\":[\"adult\",\"nitwit\",\"behavior_peasant\",\"jobless_schedule\"]}},{\"weight\":90,\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\"]},\"add\":{\"component_groups\":[\"adult\",\"unskilled\",\"behavior_peasant\",\"basic_schedule\"]}}]},\"minecraft:become_unskilled\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"adult\",\"unskilled\",\"behavior_peasant\",\"basic_schedule\"]}},\"minecraft:become_cleric\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"cleric\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_farmer\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"farmer\",\"adult\",\"behavior_peasant\",\"farmer_schedule\"]}},\"minecraft:become_fisherman\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"fisherman\",\"adult\",\"behavior_non_peasant\",\"fisher_schedule\"]}},\"minecraft:become_fletcher\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"fletcher\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_librarian\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"librarian\",\"adult\",\"behavior_non_peasant\",\"librarian_schedule\"]}},\"minecraft:become_cartographer\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"cartographer\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_armorer\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"armorer\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_weaponsmith\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"weaponsmith\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_toolsmith\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"toolsmith\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_butcher\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"butcher\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_leatherworker\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"leatherworker\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_sheperd\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"shepherd\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:become_mason\":{\"remove\":{\"component_groups\":[\"baby\",\"child_schedule\",\"job_specific_goals\",\"trade_components\"]},\"add\":{\"component_groups\":[\"mason\",\"adult\",\"behavior_non_peasant\",\"work_schedule\"]}},\"minecraft:schedule_wander_villager\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"bed_schedule_villager\",\"wander_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\",\"trade_resupply_component_group\"]},\"add\":{\"component_groups\":[\"wander_schedule_villager\"]}},\"minecraft:schedule_gather_villager\":{\"remove\":{\"component_groups\":[\"bed_schedule_villager\",\"wander_schedule_villager\",\"home_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\",\"trade_resupply_component_group\"]},\"add\":{\"component_groups\":[\"gather_schedule_villager\"]}},\"minecraft:schedule_home_villager\":{\"remove\":{\"component_groups\":[\"bed_schedule_villager\",\"wander_schedule_villager\",\"gather_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\",\"trade_resupply_component_group\"]},\"add\":{\"component_groups\":[\"home_schedule_villager\"]}},\"minecraft:schedule_bed_villager\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\",\"trade_resupply_component_group\"]},\"add\":{\"component_groups\":[\"bed_schedule_villager\"]}},\"minecraft:schedule_play_villager\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"bed_schedule_villager\",\"job_specific_goals\",\"trade_resupply_component_group\"]},\"add\":{\"component_groups\":[\"play_schedule_villager\"]}},\"minecraft:schedule_work_pro_villager\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"bed_schedule_villager\",\"play_schedule_villager\"]},\"add\":{\"component_groups\":[\"work_schedule_villager\"]}},\"minecraft:schedule_work_farmer\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"bed_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\"]},\"add\":{\"component_groups\":[\"work_schedule_farmer\"]}},\"minecraft:schedule_work_fisher\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"bed_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\"]},\"add\":{\"component_groups\":[\"work_schedule_fisher\"]}},\"minecraft:schedule_work_librarian\":{\"remove\":{\"component_groups\":[\"home_schedule_villager\",\"gather_schedule_villager\",\"wander_schedule_villager\",\"bed_schedule_villager\",\"job_specific_goals\",\"play_schedule_villager\"]},\"add\":{\"component_groups\":[\"work_schedule_librarian\"]}},\"minecraft:resupply_trades\":{\"add\":{\"component_groups\":[\"trade_resupply_component_group\"]}}}}}'},3967:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:celebrate\":{\"minecraft:behavior.celebrate\":{\"priority\":5,\"celebration_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":7.0},\"jump_interval\":{\"range_min\":1.0,\"range_max\":3.5},\"duration\":30.0,\"on_celebration_end_event\":{\"event\":\"minecraft:stop_celebrating\",\"target\":\"self\"}}},\"minecraft:vindicator_aggro\":{\"minecraft:angry\":{\"duration\":-1,\"broadcast_anger\":false,\"calm_event\":{\"event\":\"minecraft:stop_aggro\",\"target\":\"self\"}}},\"minecraft:vindicator_johnny\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"within_radius\":12.0,\"must_see_forget_duration\":40.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"illager\"}]},\"max_dist\":12}]}},\"minecraft:default_targeting\":{\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"within_radius\":12.0,\"must_see_forget_duration\":40.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":12},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"}]},\"max_dist\":12}]}},\"minecraft:raid_configuration\":{\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"hostile\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":false,\"first_founding_reward\":0},\"minecraft:behavior.move_to_village\":{\"priority\":4,\"speed_multiplier\":1.0,\"goal_radius\":2.0},\"minecraft:loot\":{\"table\":\"loot_tables/entities/vindicator_raid.json\"},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_pass_doors\":true,\"can_break_doors\":true},\"minecraft:annotation.break_door\":{\"break_time\":30,\"min_difficulty\":\"normal\"},\"minecraft:ambient_sound_interval\":{\"value\":2.0,\"range\":4.0,\"event_name\":\"ambient.in.raid\"}},\"minecraft:illager_squad_captain\":{\"minecraft:is_illager_captain\":{},\"minecraft:variant\":{\"value\":1},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/vindicator_captain_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.armor.chest\",\"drop_chance\":1.0}]},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"has_damage\",\"value\":\"fatal\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:gain_bad_omen\",\"target\":\"other\"}}}},\"minecraft:patrol_captain\":{\"minecraft:is_illager_captain\":{},\"minecraft:variant\":{\"value\":1},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/vindicator_captain_equipment.json\",\"slot_drop_chance\":[{\"slot\":\"slot.armor.chest\",\"drop_chance\":1.0}]},\"minecraft:damage_sensor\":{\"triggers\":{\"on_damage\":{\"filters\":{\"all_of\":[{\"test\":\"has_damage\",\"value\":\"fatal\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"}]},\"event\":\"minecraft:gain_bad_omen\",\"target\":\"other\"}}},\"minecraft:behavior.move_to_random_block\":{\"priority\":5,\"speed_multiplier\":0.55,\"within_radius\":8,\"block_distance\":512}},\"minecraft:patrol_follower\":{\"minecraft:behavior.follow_target_captain\":{\"priority\":5,\"speed_multiplier\":0.8,\"within_radius\":64,\"follow_distance\":5}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0\"},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:nameable\":{\"default_trigger\":{\"event\":\"minecraft:stop_johnny\",\"target\":\"self\"},\"name_actions\":[{\"name_filter\":\"Johnny\",\"on_named\":{\"event\":\"minecraft:start_johnny\",\"target\":\"self\"}}]},\"minecraft:type_family\":{\"family\":[\"vindicator\",\"monster\",\"illager\",\"mob\"]},\"minecraft:variant\":{\"value\":0},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:health\":{\"value\":24,\"max\":24},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack\":{\"damage\":8},\"minecraft:movement\":{\"value\":0.35},\"minecraft:navigation.walk\":{\"can_path_over_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:follow_range\":{\"value\":64},\"minecraft:loot\":{\"table\":\"loot_tables/entities/vindication_illager.json\"},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/vindicator_gear.json\"},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.melee_attack\":{\"priority\":3},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":10,\"look_distance\":8,\"probability\":0.02},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_aggro\",\"target\":\"self\"},\"minecraft:on_target_escape\":{\"event\":\"minecraft:stop_aggro\",\"target\":\"self\"},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"minecraft:default_targeting\"]}},\"minecraft:spawn_as_patrol_follower\":{\"add\":{\"component_groups\":[\"minecraft:default_targeting\",\"minecraft:patrol_follower\"]}},\"minecraft:become_aggro\":{\"add\":{\"component_groups\":[\"minecraft:vindicator_aggro\"]}},\"minecraft:stop_aggro\":{\"remove\":{\"component_groups\":[\"minecraft:vindicator_aggro\"]}},\"minecraft:start_johnny\":{\"add\":{\"component_groups\":[\"minecraft:vindicator_johnny\"]}},\"minecraft:stop_johnny\":{\"remove\":{\"component_groups\":[\"minecraft:vindicator_johnny\"]},\"add\":{\"component_groups\":[\"minecraft:default_targeting\"]}},\"minecraft:spawn_for_raid\":{\"add\":{\"component_groups\":[\"minecraft:default_targeting\",\"minecraft:raid_configuration\"]}},\"minecraft:spawn_as_illager_captain\":{\"add\":{\"component_groups\":[\"minecraft:illager_squad_captain\"]}},\"minecraft:promote_to_illager_captain\":{\"add\":{\"component_groups\":[\"minecraft:illager_squad_captain\"]},\"remove\":{\"component_groups\":[\"minecraft:patrol_follower\"]}},\"minecraft:promote_to_patrol_captain\":{\"add\":{\"component_groups\":[\"minecraft:patrol_captain\"]},\"remove\":{\"component_groups\":[\"minecraft:patrol_follower\"]}},\"minecraft:start_celebrating\":{\"add\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:stop_celebrating\":{\"remove\":{\"component_groups\":[\"minecraft:celebrate\"]}}}}}'},8996:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:wandering_trader\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"managed\":{\"minecraft:managed_wandering_trader\":{}},\"despawning\":{\"minecraft:type_family\":{\"family\":[\"wandering_trader\",\"wandering_trader_despawning\",\"mob\"]}},\"minecraft:scared\":{\"minecraft:angry\":{\"duration\":5,\"broadcastAnger\":true,\"broadcastRange\":10,\"broadcast_targets\":[\"llama\"],\"broadcast_filters\":{\"test\":\"is_leashed_to\",\"subject\":\"other\",\"value\":true},\"calm_event\":{\"event\":\"minecraft:become_calm\",\"target\":\"self\"}}}},\"components\":{\"minecraft:type_family\":{\"family\":[\"wandering_trader\",\"mob\"]},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:timer\":{\"looping\":false,\"random_time_choices\":[{\"weight\":50,\"value\":2400},{\"weight\":50,\"value\":3600}],\"time_down_event\":{\"event\":\"minecraft:start_despawn\",\"target\":\"self\"}},\"minecraft:spawn_entity\":{\"entities\":[{\"min_wait_time\":0,\"max_wait_time\":0,\"spawn_entity\":\"llama\",\"spawn_event\":\"minecraft:from_wandering_trader\",\"single_use\":true,\"num_to_spawn\":2,\"should_leash\":true}]},\"minecraft:economy_trade_table\":{\"display_name\":\"entity.wandering_trader.name\",\"table\":\"trading/economy_trades/wandering_trader_trades.json\",\"new_screen\":true},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:movement\":{\"value\":0.5},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_pass_doors\":true,\"can_open_doors\":true,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:conditional_bandwidth_optimization\":{},\"minecraft:despawn\":{\"remove_child_entities\":true,\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"self\",\"value\":\"wandering_trader_despawning\"},{\"test\":\"has_trade_supply\",\"subject\":\"self\",\"value\":false}]},{\"test\":\"distance_to_nearest_player\",\"operator\":\">\",\"value\":24}]}},\"minecraft:damage_sensor\":{\"triggers\":[{\"cause\":\"entity_attack\",\"deals_damage\":true,\"on_damage\":{\"event\":\"minecraft:become_scared\"}},{\"cause\":\"projectile\",\"deals_damage\":true,\"on_damage\":{\"event\":\"minecraft:become_scared\"}},{\"cause\":\"magic\",\"deals_damage\":true,\"on_damage\":{\"event\":\"minecraft:become_scared\"}}]},\"minecraft:behavior.trade_with_player\":{\"priority\":1},\"minecraft:behavior.trade_interest\":{\"priority\":3,\"within_radius\":6.0,\"interest_time\":45.0,\"remove_item_time\":1.0,\"carried_item_switch_time\":2.0,\"cooldown\":2.0},\"minecraft:behavior.look_at_trading_player\":{\"priority\":4},\"minecraft:behavior.panic\":{\"priority\":1,\"speed_multiplier\":0.6},\"minecraft:behavior.drink_potion\":{\"priority\":1,\"speed_modifier\":-0.2,\"potions\":[{\"id\":7,\"chance\":1.0,\"filters\":{\"all_of\":[{\"any_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":18000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":12000}]},{\"test\":\"is_visible\",\"subject\":\"self\",\"value\":true},{\"any_of\":[{\"test\":\"is_avoiding_mobs\",\"subject\":\"self\",\"value\":true},{\"all_of\":[{\"test\":\"has_component\",\"subject\":\"self\",\"value\":\"minecraft:angry\"},{\"test\":\"is_family\",\"subject\":\"target\",\"operator\":\"!=\",\"value\":\"player\"}]}]}]}},{\"id\":8,\"chance\":1.0,\"filters\":{\"all_of\":[{\"test\":\"hourly_clock_time\",\"operator\":\">=\",\"value\":12000},{\"test\":\"hourly_clock_time\",\"operator\":\"<\",\"value\":18000},{\"test\":\"is_visible\",\"subject\":\"self\",\"value\":true},{\"any_of\":[{\"test\":\"is_avoiding_mobs\",\"subject\":\"self\",\"value\":true},{\"test\":\"has_component\",\"subject\":\"self\",\"value\":\"minecraft:angry\"}]}]}}]},\"minecraft:behavior.avoid_mob_type\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie_villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"zombie_pigman\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"illager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"vex\"}]},\"walk_speed_multiplier\":0.6,\"sprint_speed_multiplier\":0.6}],\"max_dist\":6},\"minecraft:behavior.restrict_open_door\":{\"priority\":5},\"minecraft:behavior.open_door\":{\"priority\":6,\"close_door_after\":true},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":8,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}},\"events\":{\"minecraft:scheduled\":{\"add\":{\"component_groups\":[\"managed\"]}},\"minecraft:start_despawn\":{\"add\":{\"component_groups\":[\"despawning\"]}},\"minecraft:become_scared\":{\"add\":{\"component_groups\":[\"minecraft:scared\"]}},\"minecraft:become_calm\":{\"remove\":{\"component_groups\":[\"minecraft:scared\"]}}}}}'},4021:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:warden\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"emerging\":{\"minecraft:behavior.emerge\":{\"duration\":7.0,\"on_done\":{\"event\":\"minecraft:emerged\",\"target\":\"self\"}}},\"pushable\":{\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true}}},\"components\":{\"minecraft:movement_sound_distance_offset\":{\"value\":0.55},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:attack\":{\"damage\":30},\"minecraft:vibration_listener\":{},\"minecraft:vibration_damper\":{},\"minecraft:suspect_tracking\":{},\"minecraft:anger_level\":{\"max_anger\":150,\"angry_threshold\":80,\"remove_targets_below_angry_threshold\":true,\"angry_boost\":20,\"anger_decrement_interval\":1.0,\"default_annoyingness\":35,\"default_projectile_annoyingness\":10,\"on_increase_sounds\":[{\"sound\":\"listening_angry\",\"condition\":\"query.anger_level(this) >= 40\"},{\"sound\":\"listening\",\"condition\":\"query.anger_level(this) >= 0\"}],\"nuisance_filter\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"not\",\"value\":\"warden\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"not\",\"value\":\"inanimate\"}]}},\"minecraft:is_hidden_when_invisible\":{},\"minecraft:type_family\":{\"family\":[\"warden\",\"monster\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"can_path_over_lava\":true,\"avoid_damage_blocks\":true},\"minecraft:ambient_sound_interval\":{\"value\":2.0,\"range\":4.0,\"event_name\":\"ambient\",\"event_names\":[{\"event_name\":\"angry\",\"condition\":\"query.anger_level(this) >= 80\"},{\"event_name\":\"agitated\",\"condition\":\"query.anger_level(this) >= 40\"}]},\"minecraft:heartbeat\":{\"interval\":\"2.0 - math.clamp(query.anger_level / 80 * 1.5, 0, 1.5)\"},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:collision_box\":{\"width\":0.9,\"height\":2.9},\"minecraft:health\":{\"value\":500,\"max\":500},\"minecraft:movement\":{\"value\":0.3},\"minecraft:knockback_resistance\":{\"value\":1.0},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.dig\":{\"priority\":1,\"duration\":5.5,\"idle_time\":60.0,\"vibration_is_disturbance\":true,\"suspicion_is_disturbance\":true,\"digs_in_daylight\":false},\"minecraft:behavior.roar\":{\"priority\":2,\"duration\":4.2},\"minecraft:behavior.sonic_boom\":{\"priority\":3,\"duration\":3.0,\"speed_multiplier\":1.2,\"attack_damage\":10,\"attack_range_horizontal\":15,\"attack_range_vertical\":20,\"attack_cooldown\":2,\"knockback_vertical_strength\":0.5,\"knockback_horizontal_strength\":2.5,\"knockback_height_cap\":0.5,\"duration_until_attack_sound\":1.7,\"charge_sound\":\"sonic_charge\",\"attack_sound\":\"sonic_boom\"},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1.2,\"melee_fov\":360},\"minecraft:behavior.investigate_suspicious_location\":{\"priority\":5,\"speed_multiplier\":0.7},\"minecraft:behavior.sniff\":{\"priority\":6,\"duration\":4.16,\"sniffing_radius\":24.0,\"suspicion_radius_horizontal\":6.0,\"suspicion_radius_vertical\":20.0,\"cooldown_range\":[5.0,10.0]},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"speed_multiplier\":0.5},\"minecraft:behavior.random_look_around\":{\"priority\":11},\"minecraft:physics\":{},\"minecraft:mob_effect\":{\"effect_range\":20,\"effect_time\":13,\"mob_effect\":\"darkness\",\"cooldown_time\":6,\"entity_filter\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"operator\":\"not\",\"test\":\"has_ability\",\"subject\":\"other\",\"value\":\"invulnerable\"}]}},\"minecraft:follow_range\":30,\"minecraft:fire_immune\":{},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/warden.json\"}},\"events\":{\"minecraft:spawn_emerging\":{\"add\":{\"component_groups\":[\"emerging\"]}},\"minecraft:emerged\":{\"add\":{\"component_groups\":[\"pushable\"]},\"remove\":{\"component_groups\":[\"emerging\"]}},\"minecraft:entity_spawned\":{\"add\":{\"component_groups\":[\"pushable\"]}},\"on_digging_event\":{\"remove\":{\"component_groups\":[\"pushable\"]}}}}}'},5219:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:witch\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:celebrate\":{\"minecraft:behavior.celebrate\":{\"priority\":5,\"celebration_sound\":\"celebrate\",\"sound_interval\":{\"range_min\":2.0,\"range_max\":7.0},\"jump_interval\":{\"range_min\":1.0,\"range_max\":3.5},\"duration\":30.0,\"on_celebration_end_event\":{\"event\":\"minecraft:stop_celebrating\",\"target\":\"self\"}}},\"minecraft:raid_configuration\":{\"minecraft:dweller\":{\"dwelling_type\":\"village\",\"dweller_role\":\"hostile\",\"update_interval_base\":60,\"update_interval_variant\":40,\"can_find_poi\":false,\"can_migrate\":false,\"first_founding_reward\":0},\"minecraft:behavior.move_to_village\":{\"priority\":3,\"speed_multiplier\":1.2,\"goal_radius\":2.0},\"minecraft:ambient_sound_interval\":{\"value\":2.0,\"range\":4.0,\"event_name\":\"ambient.in.raid\"}}},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? (query.is_baby ? 12 : 5) + (Math.die_roll(query.equipment_count,1,3)) : 0\"},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/witch.json\"},\"minecraft:health\":{\"value\":26,\"max\":26},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_water\":false},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":1},\"minecraft:behavior.ranged_attack\":{\"priority\":2,\"speed_multiplier\":1.0,\"attack_interval_min\":3,\"attack_interval_max\":3,\"attack_radius\":10.0},\"minecraft:behavior.random_stroll\":{\"priority\":4,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":5,\"look_distance\":8.0},\"minecraft:behavior.random_look_around\":{\"priority\":5,\"look_distance\":8.0},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":10}],\"must_reach\":true},\"minecraft:type_family\":{\"family\":[\"witch\",\"monster\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:follow_range\":{\"value\":64},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:spawn_for_raid\":{\"add\":{\"component_groups\":[\"minecraft:raid_configuration\"]}},\"minecraft:start_celebrating\":{\"add\":{\"component_groups\":[\"minecraft:celebrate\"]}},\"minecraft:stop_celebrating\":{\"remove\":{\"component_groups\":[\"minecraft:celebrate\"]}}}}}'},2079:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"components\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:nameable\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.72,\"height\":2.01},\"minecraft:attack\":{\"damage\":4,\"effect_name\":\"wither\",\"effect_duration\":10},\"minecraft:loot\":{\"table\":\"loot_tables/entities/wither_skeleton.json\"},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/wither_skeleton_gear.json\"},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"avoid_sun\":true,\"avoid_water\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:wooden_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:stone_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:golden_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:iron_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:diamond_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_shovel\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:wooden_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:stone_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:golden_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:iron_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:diamond_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_pickaxe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:wooden_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:stone_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:golden_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:iron_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:diamond_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_axe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:wooden_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:stone_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:golden_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:iron_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:diamond_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_hoe\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:scale\":{\"value\":1.2},\"minecraft:fire_immune\":{},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"reselect_targets\":true,\"must_see\":true,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"piglin\"},{\"test\":\"is_difficulty\",\"operator\":\"!=\",\"value\":\"peaceful\"}]},\"max_dist\":16},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":16}]},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"track_target\":true,\"speed_multiplier\":1.25},\"minecraft:behavior.pickup_items\":{\"priority\":5,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true},\"minecraft:behavior.random_stroll\":{\"priority\":6,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":7,\"look_distance\":8},\"minecraft:behavior.random_look_around\":{\"priority\":8},\"minecraft:type_family\":{\"family\":[\"wither\",\"monster\",\"undead\",\"skeleton\",\"mob\"]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{}}}}'},5096:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"runtime_identifier\":\"minecraft:wolf\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:wolf_baby\":{\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:ageable\":{\"duration\":1200,\"feed_items\":[\"chicken\",\"cooked_chicken\",\"beef\",\"cooked_beef\",\"muttonRaw\",\"muttonCooked\",\"porkchop\",\"cooked_porkchop\",\"rabbit\",\"cooked_rabbit\",\"rotten_flesh\"],\"grow_up\":{\"event\":\"minecraft:ageable_grow_up\",\"target\":\"self\"}}},\"minecraft:wolf_adult\":{\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? Math.Random(1,3) : 0\"},\"minecraft:loot\":{\"table\":\"loot_tables/entities/wolf.json\"},\"minecraft:breedable\":{\"require_tame\":true,\"require_full_health\":true,\"breeds_with\":{\"mate_type\":\"{identifier}\",\"baby_type\":\"{identifier}\",\"breed_event\":{\"event\":\"minecraft:entity_born\",\"target\":\"baby\"}},\"breed_items\":[\"chicken\",\"cooked_chicken\",\"beef\",\"cooked_beef\",\"muttonRaw\",\"muttonCooked\",\"porkchop\",\"cooked_porkchop\",\"rabbit\",\"cooked_rabbit\",\"rotten_flesh\"]}},\"minecraft:wolf_angry\":{\"minecraft:angry\":{\"duration\":25,\"broadcast_anger\":true,\"broadcast_range\":20,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}},\"minecraft:on_target_acquired\":{},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.675,-0.1]}}},\"minecraft:wolf_wild\":{\"minecraft:behavior.avoid_mob_type\":{\"priority\":3,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"llama\"},\"max_dist\":24,\"walk_speed_multiplier\":1.5,\"sprint_speed_multiplier\":1.5}],\"probability_per_strength\":0.14},\"minecraft:tameable\":{\"probability\":0.33,\"tame_items\":\"bone\",\"tame_event\":{\"event\":\"minecraft:on_tame\",\"target\":\"self\"}},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":4,\"reselect_targets\":true,\"must_see\":true,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"skeleton\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"sheep\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"rabbit\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fox\"}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":16},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"skeleton\"},{\"test\":\"is_underwater\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":16}]},\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\",\"target\":\"self\"},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,0.675,-0.1]}}},\"minecraft:wolf_tame\":{\"minecraft:is_tamed\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:behavior.follow_owner\":{\"priority\":6,\"speed_multiplier\":1.0,\"start_distance\":10,\"stop_distance\":2},\"minecraft:attack\":{\"damage\":4},\"minecraft:behavior.breed\":{\"priority\":2,\"speed_multiplier\":1.0},\"minecraft:behavior.owner_hurt_by_target\":{\"priority\":1},\"minecraft:behavior.owner_hurt_target\":{\"priority\":2},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":5,\"must_see\":true,\"entity_types\":[{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"skeleton\"},\"max_dist\":16}]},\"minecraft:sittable\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0,\"on_leash\":{\"event\":\"minecraft:on_leash\",\"target\":\"self\"},\"on_unleash\":{\"event\":\"minecraft:on_unleash\",\"target\":\"self\"}}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"wolf\",\"mob\"]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0},\"minecraft:collision_box\":{\"width\":0.6,\"height\":0.8},\"minecraft:health\":{\"value\":8,\"max\":8},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:movement\":{\"value\":0.3},\"minecraft:navigation.walk\":{\"can_path_over_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:attack\":{\"damage\":3},\"minecraft:healable\":{\"items\":[{\"item\":\"porkchop\",\"heal_amount\":3},{\"item\":\"cooked_porkchop\",\"heal_amount\":8},{\"item\":\"fish\",\"heal_amount\":2},{\"item\":\"salmon\",\"heal_amount\":2},{\"item\":\"clownfish\",\"heal_amount\":1},{\"item\":\"pufferfish\",\"heal_amount\":1},{\"item\":\"cooked_fish\",\"heal_amount\":5},{\"item\":\"cooked_salmon\",\"heal_amount\":6},{\"item\":\"beef\",\"heal_amount\":3},{\"item\":\"cooked_beef\",\"heal_amount\":8},{\"item\":\"chicken\",\"heal_amount\":2},{\"item\":\"cooked_chicken\",\"heal_amount\":6},{\"item\":\"muttonRaw\",\"heal_amount\":2},{\"item\":\"muttonCooked\",\"heal_amount\":6},{\"item\":\"rotten_flesh\",\"heal_amount\":4},{\"item\":\"rabbit\",\"heal_amount\":3},{\"item\":\"cooked_rabbit\",\"heal_amount\":5},{\"item\":\"rabbit_stew\",\"heal_amount\":10}]},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.float\":{\"priority\":0},\"minecraft:behavior.mount_pathing\":{\"priority\":1,\"speed_multiplier\":1.25,\"target_dist\":0,\"track_target\":true},\"minecraft:behavior.stay_while_sitting\":{\"priority\":3},\"minecraft:behavior.leap_at_target\":{\"priority\":4,\"target_dist\":0.4},\"minecraft:behavior.melee_attack\":{\"priority\":5},\"minecraft:behavior.random_stroll\":{\"priority\":8,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":6,\"target_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.beg\":{\"priority\":9,\"look_distance\":8,\"look_time\":[2,4],\"items\":[\"bone\",\"porkchop\",\"cooked_porkchop\",\"chicken\",\"cooked_chicken\",\"beef\",\"cooked_beef\",\"rotten_flesh\",\"muttonraw\",\"muttoncooked\",\"rabbit\",\"cooked_rabbit\"]},\"minecraft:behavior.hurt_by_target\":{\"priority\":3},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":9,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:wolf_adult\",\"minecraft:wolf_wild\"]}},{\"weight\":1,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:wolf_baby\",\"minecraft:wolf_wild\"]}}]},\"minecraft:entity_born\":{\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:wolf_baby\",\"minecraft:wolf_tame\"]}},\"minecraft:ageable_grow_up\":{\"remove\":{\"component_groups\":[\"minecraft:wolf_baby\"]},\"add\":{\"component_groups\":[\"minecraft:wolf_adult\"]}},\"minecraft:ageable_set_baby\":{\"remove\":{\"component_groups\":[\"minecraft:wolf_adult\"]},\"add\":{\"component_groups\":[\"minecraft:wolf_baby\"]}},\"minecraft:on_tame\":{\"remove\":{\"component_groups\":[\"minecraft:wolf_wild\"]},\"add\":{\"component_groups\":[\"minecraft:wolf_tame\"]}},\"minecraft:become_angry\":{\"remove\":{\"component_groups\":[\"minecraft:wolf_wild\"]},\"add\":{\"component_groups\":[\"minecraft:wolf_angry\"]}},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:wolf_angry\"]},\"add\":{\"component_groups\":[\"minecraft:wolf_wild\"]}}}}}'},4079:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"zoglin_baby\":{\"minecraft:type_family\":{\"family\":[\"zoglin\",\"zoglin_baby\",\"undead\",\"mob\"]},\"minecraft:is_baby\":{},\"minecraft:attack\":{\"damage\":1},\"minecraft:scale\":{\"value\":0.5},\"minecraft:collision_box\":{\"width\":0.85,\"height\":0.85},\"minecraft:custom_hit_test\":{\"hitboxes\":[{\"width\":1.0,\"height\":0.85,\"pivot\":[0,0.5,0]}]}},\"zoglin_adult\":{\"minecraft:type_family\":{\"family\":[\"zoglin\",\"zoglin_adult\",\"undead\",\"mob\"]},\"minecraft:collision_box\":{\"width\":0.9,\"height\":0.9},\"minecraft:custom_hit_test\":{\"hitboxes\":[{\"width\":2.0,\"height\":1.75,\"pivot\":[0,1,0]}]},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:attack\":{\"damage\":[3,8]}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:loot\":{\"table\":\"loot_tables/entities/zoglin.json\"},\"minecraft:experience_reward\":{\"on_bred\":\"Math.Random(1,7)\",\"on_death\":\"query.last_hit_by_player ? 5 : 0\"},\"minecraft:health\":{\"value\":40,\"max\":40},\"minecraft:knockback_resistance\":{\"value\":0.5},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":3,\"within_radius\":16.0,\"entity_types\":[{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"zoglin\"},{\"test\":\"is_family\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"creeper\"}]},\"max_dist\":16}],\"must_see\":true},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1.4,\"track_target\":true},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:movement\":{\"value\":0.25},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_path_over_water\":false,\"avoid_water\":true,\"avoid_damage_blocks\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:fire_immune\":{},\"minecraft:leashable\":{\"soft_distance\":4.0,\"hard_distance\":6.0,\"max_distance\":10.0},\"minecraft:despawn\":{\"filters\":{\"any_of\":[{\"all_of\":[{\"test\":\"is_persistent\",\"value\":false},{\"test\":\"distance_to_nearest_player\",\"operator\":\">\",\"value\":54}]},{\"all_of\":[{\"test\":\"is_persistent\",\"value\":false},{\"test\":\"inactivity_timer\",\"subject\":\"self\",\"value\":30},{\"test\":\"random_chance\",\"value\":800},{\"test\":\"distance_to_nearest_player\",\"operator\":\">\",\"value\":32}]}]}},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1.0},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_transformed\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"zoglin_baby\"]}},{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"zoglin_adult\"]}}]},\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"add\":{\"component_groups\":[\"zoglin_adult\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"zoglin_baby\"]}}]},\"minecraft:as_adult\":{\"add\":{\"component_groups\":[\"zoglin_adult\"]}},\"minecraft:as_baby\":{\"add\":{\"component_groups\":[\"zoglin_baby\"]}}}}}'},6342:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:look_to_start_drowned_transformation\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:start_transforming\"}}},\"minecraft:start_drowned_transformation\":{\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"subject\":\"self\",\"operator\":\"==\",\"value\":false},\"event\":\"minecraft:stop_transforming\"}},\"minecraft:timer\":{\"looping\":false,\"time\":30,\"time_down_event\":{\"event\":\"minecraft:convert_to_drowned\"}}},\"minecraft:convert_to_drowned\":{\"minecraft:transformation\":{\"into\":\"minecraft:drowned<minecraft:as_adult>\",\"transformation_sound\":\"convert_to_drowned\",\"drop_equipment\":true,\"delay\":{\"value\":15}},\"minecraft:is_shaking\":{}},\"minecraft:convert_to_baby_drowned\":{\"minecraft:transformation\":{\"into\":\"minecraft:drowned<minecraft:as_baby>\",\"transformation_sound\":\"convert_to_drowned\",\"drop_equipment\":true,\"delay\":{\"value\":15}},\"minecraft:is_shaking\":{}},\"minecraft:zombie_baby\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:movement\":{\"value\":0.35}},\"minecraft:zombie_adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:movement\":{\"value\":0.23},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.1,-0.35],\"lock_rider_rotation\":0}},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true}},\"minecraft:zombie_jockey\":{\"minecraft:behavior.find_mount\":{\"priority\":1,\"within_radius\":16,\"start_delay\":15,\"max_failed_attempts\":20}},\"minecraft:can_have_equipment\":{\"minecraft:equipment\":{\"table\":\"loot_tables/entities/zombie_equipment.json\"}}},\"components\":{\"minecraft:nameable\":{},\"minecraft:type_family\":{\"family\":[\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:burns_in_daylight\":{},\"minecraft:movement.basic\":{},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_pass_doors\":true,\"can_walk\":true,\"can_break_doors\":true},\"minecraft:annotation.break_door\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_air\":true,\"breathes_water\":true},\"minecraft:attack\":{\"damage\":3},\"minecraft:loot\":{\"table\":\"loot_tables/entities/zombie.json\"},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:environment_sensor\":{\"triggers\":{\"filters\":{\"test\":\"is_underwater\",\"operator\":\"==\",\"value\":true},\"event\":\"minecraft:start_transforming\"}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.equip_item\":{\"priority\":2},\"minecraft:behavior.melee_attack\":{\"priority\":3},\"minecraft:behavior.stomp_turtle_egg\":{\"priority\":4,\"speed_multiplier\":1,\"search_range\":10,\"search_height\":2,\"goal_radius\":1.14,\"interval\":20},\"minecraft:behavior.pickup_items\":{\"priority\":6,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"reselect_targets\":true,\"within_radius\":25.0,\"must_see_forget_duration\":17.0,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":35},{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":35,\"must_see\":false},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":35}]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":380,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_adult\",\"minecraft:can_have_equipment\"]}},{\"weight\":17,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_baby\",\"minecraft:can_have_equipment\"]}},{\"weight\":3,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:zombie_baby\",\"minecraft:zombie_jockey\",\"minecraft:can_have_equipment\"]}}]},\"minecraft:as_adult\":{\"add\":{\"component_groups\":[\"minecraft:zombie_adult\"]}},\"minecraft:as_baby\":{\"add\":{\"component_groups\":[\"minecraft:zombie_baby\"]}},\"minecraft:start_transforming\":{\"add\":{\"component_groups\":[\"minecraft:start_drowned_transformation\"]},\"remove\":{\"component_groups\":[\"minecraft:look_to_start_drowned_transformation\"]}},\"minecraft:stop_transforming\":{\"add\":{\"component_groups\":[\"minecraft:look_to_start_drowned_transformation\"]},\"remove\":{\"component_groups\":[\"minecraft:start_drowned_transformation\"]}},\"minecraft:convert_to_drowned\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:convert_to_drowned\"]},\"remove\":{\"component_groups\":[\"minecraft:start_drowned_transformation\"]}},{\"filters\":{\"test\":\"has_component\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:convert_to_baby_drowned\"]},\"remove\":{\"component_groups\":[\"minecraft:start_drowned_transformation\"]}}]}}}}'},1363:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"minecraft:pig_zombie_baby\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5}},\"minecraft:pig_zombie_adult\":{\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.1,-0.35],\"lock_rider_rotation\":0}},\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"}},\"minecraft:pig_zombie_angry\":{\"minecraft:angry\":{\"duration\":25,\"broadcast_anger\":true,\"broadcast_range\":20,\"calm_event\":{\"event\":\"minecraft:on_calm\",\"target\":\"self\"}}},\"minecraft:pig_zombie_calm\":{\"minecraft:on_target_acquired\":{\"event\":\"minecraft:become_angry\",\"target\":\"self\"}},\"minecraft:strider_jockey\":{\"minecraft:equipment\":{\"table\":\"loot_tables/entities/zombified_piglin_rider_gear.json\"}}},\"components\":{\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:nameable\":{},\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_pass_doors\":true,\"can_open_doors\":true,\"avoid_water\":true,\"avoid_portals\":true},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:fire_immune\":{},\"minecraft:type_family\":{\"family\":[\"zombie_pigman\",\"undead\",\"monster\",\"mob\"]},\"minecraft:loot\":{\"table\":\"loot_tables/entities/zombie_pigman.json\"},\"minecraft:equipment\":{\"table\":\"loot_tables/entities/zombie_pigman_gear.json\"},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:movement\":{\"value\":0.23},\"minecraft:attack\":{\"damage\":5},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.mount_pathing\":{\"priority\":2,\"speed_multiplier\":1.25,\"target_dist\":0,\"track_target\":true},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.melee_attack\":{\"priority\":4,\"speed_multiplier\":1.5},\"minecraft:behavior.stomp_turtle_egg\":{\"priority\":5,\"speed_multiplier\":1,\"search_range\":10,\"search_height\":2,\"goal_radius\":1.14,\"interval\":20},\"minecraft:behavior.pickup_items\":{\"priority\":6,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":7,\"speed_multiplier\":1.0},\"minecraft:behavior.look_at_player\":{\"priority\":8,\"look_distance\":6.0,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":9},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"minecraft:entity_transformed\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_baby\",\"minecraft:pig_zombie_calm\"]}},{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_adult\",\"minecraft:pig_zombie_calm\"]}}]},\"minecraft:entity_spawned\":{\"randomize\":[{\"weight\":95,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_adult\",\"minecraft:pig_zombie_calm\"]}},{\"weight\":5,\"remove\":{},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_baby\",\"minecraft:pig_zombie_calm\"]}}]},\"minecraft:on_calm\":{\"remove\":{\"component_groups\":[\"minecraft:pig_zombie_angry\"]},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_calm\"]}},\"minecraft:become_angry\":{\"remove\":{\"component_groups\":[\"minecraft:pig_zombie_calm\"]},\"add\":{\"component_groups\":[\"minecraft:pig_zombie_angry\"]}},\"minecraft:spawn_as_strider_jockey\":{\"add\":{\"component_groups\":[\"minecraft:strider_jockey\"]}}}}}'},7173:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:entity\":{\"description\":{\"identifier\":\"{identifier}\",\"is_spawnable\":true,\"is_summonable\":true,\"is_experimental\":false},\"component_groups\":{\"become_zombie_villager_v2\":{\"minecraft:transformation\":{\"into\":\"minecraft:zombie_villager_v2\",\"keep_level\":false}},\"baby\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 12 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:is_baby\":{},\"minecraft:scale\":{\"value\":0.5},\"minecraft:movement\":{\"value\":0.35}},\"adult\":{\"minecraft:experience_reward\":{\"on_death\":\"query.last_hit_by_player ? 5 + (query.equipment_count * Math.Random(1,3)) : 0\"},\"minecraft:movement\":{\"value\":0.23},\"minecraft:rideable\":{\"seat_count\":1,\"family_types\":[\"zombie\"],\"seats\":{\"position\":[0.0,1.1,-0.35]}},\"minecraft:behavior.mount_pathing\":{\"priority\":5,\"speed_multiplier\":1.25,\"target_dist\":0.0,\"track_target\":true}},\"jockey\":{\"minecraft:behavior.find_mount\":{\"priority\":1,\"within_radius\":16}},\"from_abandoned_village\":{\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_pass_doors\":true,\"can_open_doors\":true,\"avoid_water\":true,\"avoid_sun\":true},\"minecraft:behavior.flee_sun\":{\"priority\":4,\"speed_multiplier\":1}},\"to_villager\":{\"minecraft:transformation\":{\"into\":\"minecraft:villager\",\"begin_transform_sound\":\"remedy\",\"transformation_sound\":\"unfect\",\"delay\":{\"value\":100,\"block_assist_chance\":0.01,\"block_radius\":4,\"block_chance\":0.3,\"block_types\":[\"minecraft:bed\",\"minecraft:iron_bars\"]}},\"minecraft:spell_effects\":{\"add_effects\":[{\"effect\":\"strength\",\"duration\":100},{\"effect\":\"heal\",\"duration\":100}],\"remove_effects\":\"weakness\"},\"minecraft:is_shaking\":{}},\"farmer\":{\"minecraft:type_family\":{\"family\":[\"farmer\",\"zombie\",\"zombie_villager\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":0}},\"fisherman\":{\"minecraft:type_family\":{\"family\":[\"fisherman\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":0}},\"shepherd\":{\"minecraft:type_family\":{\"family\":[\"shepherd\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":0}},\"fletcher\":{\"minecraft:type_family\":{\"family\":[\"fletcher\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":0}},\"librarian\":{\"minecraft:type_family\":{\"family\":[\"librarian\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":1}},\"cartographer\":{\"minecraft:type_family\":{\"family\":[\"cartographer\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":1}},\"cleric\":{\"minecraft:type_family\":{\"family\":[\"cleric\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":2}},\"armorer\":{\"minecraft:type_family\":{\"family\":[\"armorer\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":3}},\"weaponsmith\":{\"minecraft:type_family\":{\"family\":[\"weaponsmith\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":3}},\"toolsmith\":{\"minecraft:type_family\":{\"family\":[\"toolsmith\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":3}},\"butcher\":{\"minecraft:type_family\":{\"family\":[\"butcher\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":4}},\"leatherworker\":{\"minecraft:type_family\":{\"family\":[\"leatherworker\",\"zombie_villager\",\"zombie\",\"undead\",\"monster\",\"mob\"]},\"minecraft:variant\":{\"value\":4}}},\"components\":{\"minecraft:navigation.walk\":{\"is_amphibious\":true,\"can_pass_doors\":true,\"can_break_doors\":true,\"avoid_sun\":false},\"minecraft:annotation.break_door\":{},\"minecraft:movement.basic\":{},\"minecraft:jump.static\":{},\"minecraft:can_climb\":{},\"minecraft:breathable\":{\"total_supply\":15,\"suffocate_time\":0,\"breathes_water\":true},\"minecraft:loot\":{\"table\":\"loot_tables/entities/zombie.json\"},\"minecraft:equip_item\":{},\"minecraft:collision_box\":{\"width\":0.6,\"height\":1.9},\"minecraft:burns_in_daylight\":{},\"minecraft:health\":{\"value\":20,\"max\":20},\"minecraft:hurt_on_condition\":{\"damage_conditions\":[{\"filters\":{\"test\":\"in_lava\",\"subject\":\"self\",\"operator\":\"==\",\"value\":true},\"cause\":\"lava\",\"damage_per_tick\":4}]},\"minecraft:attack\":{\"damage\":3},\"minecraft:nameable\":{},\"minecraft:shareables\":{\"items\":[{\"item\":\"minecraft:netherite_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:stone_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:wooden_sword\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:turtle_helmet\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":6},{\"item\":\"minecraft:skull:0\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:skull:1\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:carved_pumpkin\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":7},{\"item\":\"minecraft:netherite_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_chestplate\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_leggings\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5},{\"item\":\"minecraft:netherite_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":0},{\"item\":\"minecraft:diamond_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":1},{\"item\":\"minecraft:iron_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":2},{\"item\":\"minecraft:chainmail_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":3},{\"item\":\"minecraft:golden_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":4},{\"item\":\"minecraft:leather_boots\",\"want_amount\":1,\"surplus_amount\":1,\"priority\":5}]},\"minecraft:interact\":{\"interactions\":{\"on_interact\":{\"filters\":{\"all_of\":[{\"test\":\"has_equipment\",\"domain\":\"hand\",\"subject\":\"other\",\"value\":\"golden_apple\"},{\"test\":\"has_component\",\"subject\":\"self\",\"value\":\"minecraft:effect.weakness\"}]},\"event\":\"villager_converted\",\"target\":\"self\"},\"use_item\":true,\"interact_text\":\"action.interact.cure\"}},\"minecraft:despawn\":{\"despawn_from_distance\":{}},\"minecraft:behavior.melee_attack\":{\"priority\":6},\"minecraft:behavior.equip_item\":{\"priority\":3},\"minecraft:behavior.stomp_turtle_egg\":{\"priority\":4,\"speed_multiplier\":1,\"search_range\":10,\"search_height\":2,\"goal_radius\":1.14,\"interval\":20},\"minecraft:behavior.pickup_items\":{\"priority\":8,\"max_dist\":3,\"goal_radius\":2,\"speed_multiplier\":1.0,\"pickup_based_on_chance\":true,\"can_pickup_any_item\":true},\"minecraft:behavior.random_stroll\":{\"priority\":9,\"speed_multiplier\":1},\"minecraft:behavior.look_at_player\":{\"priority\":10,\"look_distance\":6,\"probability\":0.02},\"minecraft:behavior.random_look_around\":{\"priority\":11},\"minecraft:behavior.hurt_by_target\":{\"priority\":1},\"minecraft:behavior.nearest_attackable_target\":{\"priority\":2,\"must_see\":true,\"reselect_targets\":true,\"entity_types\":[{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"player\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"snowgolem\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"irongolem\"}]},\"max_dist\":35},{\"filters\":{\"any_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"villager\"},{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"wandering_trader\"}]},\"max_dist\":35,\"must_see\":false},{\"filters\":{\"all_of\":[{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"baby_turtle\"},{\"test\":\"in_water\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":true}]},\"max_dist\":35}]},\"minecraft:physics\":{},\"minecraft:pushable\":{\"is_pushable\":true,\"is_pushable_by_piston\":true},\"minecraft:conditional_bandwidth_optimization\":{}},\"events\":{\"villager_converted\":{\"remove\":{},\"add\":{\"component_groups\":[\"to_villager\"]}},\"minecraft:entity_spawned\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":9500,\"remove\":{},\"add\":{\"component_groups\":[\"adult\"]}},{\"weight\":425,\"remove\":{},\"add\":{\"component_groups\":[\"baby\"]}},{\"weight\":75,\"remove\":{},\"add\":{\"component_groups\":[\"baby\",\"jockey\"]}}]},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":5,\"add\":{\"component_groups\":[\"farmer\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fisherman\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"shepherd\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fletcher\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"librarian\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"cartographer\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"cleric\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"armorer\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"weaponsmith\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"toolsmith\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"butcher\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"leatherworker\"]}}]}]},\"minecraft:entity_transformed\":{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"baby\"]}},{\"filters\":{\"test\":\"has_component\",\"subject\":\"other\",\"operator\":\"!=\",\"value\":\"minecraft:is_baby\"},\"add\":{\"component_groups\":[\"adult\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"farmer\"},\"add\":{\"component_groups\":[\"farmer\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fisherman\"},\"add\":{\"component_groups\":[\"fisherman\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"shepherd\"},\"add\":{\"component_groups\":[\"shepherd\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"fletcher\"},\"add\":{\"component_groups\":[\"fletcher\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"librarian\"},\"add\":{\"component_groups\":[\"librarian\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cartographer\"},\"add\":{\"component_groups\":[\"cartographer\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"cleric\"},\"add\":{\"component_groups\":[\"cleric\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"armorer\"},\"add\":{\"component_groups\":[\"armorer\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"weaponsmith\"},\"add\":{\"component_groups\":[\"weaponsmith\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"toolsmith\"},\"add\":{\"component_groups\":[\"toolsmith\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"butcher\"},\"add\":{\"component_groups\":[\"butcher\"]}},{\"filters\":{\"test\":\"is_family\",\"subject\":\"other\",\"value\":\"leatherworker\"},\"add\":{\"component_groups\":[\"leatherworker\"]}}]},\"minecraft:become_cleric\":{\"add\":{\"component_groups\":[\"cleric\"]}},\"from_village\":{\"sequence\":[{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":9500,\"remove\":{},\"add\":{\"component_groups\":[\"adult\"]}},{\"weight\":425,\"remove\":{},\"add\":{\"component_groups\":[\"baby\"]}},{\"weight\":75,\"remove\":{},\"add\":{\"component_groups\":[\"baby\",\"jockey\"]}}]},{\"filters\":{\"test\":\"has_component\",\"operator\":\"!=\",\"value\":\"minecraft:variant\"},\"randomize\":[{\"weight\":5,\"add\":{\"component_groups\":[\"farmer\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fisherman\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"shepherd\"]}},{\"weight\":5,\"add\":{\"component_groups\":[\"fletcher\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"librarian\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"cartographer\"]}},{\"weight\":20,\"add\":{\"component_groups\":[\"cleric\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"armorer\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"weaponsmith\"]}},{\"weight\":6,\"add\":{\"component_groups\":[\"toolsmith\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"butcher\"]}},{\"weight\":10,\"add\":{\"component_groups\":[\"leatherworker\"]}}]},{\"add\":{\"component_groups\":[\"from_abandoned_village\"]}}]}}}}'},5939:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"blockbench:basic\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/basic\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"render_controllers\":[\"controller.render.default\"]}}}'},8397:e=>{e.exports='{\"format_version\":\"1.19.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"blockbench:vehicle\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/vehicle\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"render_controllers\":[\"controller.render.default\"],\"animations\":{\"drive\":\"animation.{name}.drive\"},\"scripts\":{\"initialize\":[\"variable.steering = 0;\"],\"pre_animation\":[\"query.has_rider ? (variable.steering = Math.lerp(variable.steering, query.yaw_speed, 0.15));\"],\"animate\":[\"drive\"]}}}}'},8965:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"allay\"},\"textures\":{\"default\":\"textures/entity/{name}\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#00daff\",\"overlay_color\":\"#00adff\"},\"animations\":{\"idle\":\"animation.{name}.idle\",\"fly\":\"animation.{name}.fly\",\"hold_item\":\"animation.{name}.hold_item\",\"general\":\"controller.animation.allay.general\",\"holding\":\"controller.animation.allay.holding\"},\"scripts\":{\"pre_animation\":[\"variable.holding_trident = query.is_item_name_any(\\'slot.weapon.mainhand\\', \\'minecraft:trident\\');\"],\"animate\":[\"general\",\"holding\"]},\"render_controllers\":[\"controller.render.allay\"],\"enable_attachables\":true}}}'},9231:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"textures\":{\"default\":\"textures/entity/{name}\"},\"render_controllers\":[\"controller.render.armadillo\"],\"scripts\":{\"pre_animation\":[\"variable.x_head_rotation = math.clamp(query.target_x_rotation, -32.5, 32.5);\",\"variable.y_head_rotation = math.clamp(query.target_y_rotation, -22.5, 25);\",\"variable.is_rolled_up = query.property(\\'minecraft:armadillo_state\\') != \\'unrolled\\';\",\"variable.rolled_up_time = variable.is_rolled_up ? ((variable.rolled_up_time ?? 0.0) + query.delta_time) : 0.0;\",\"variable.is_peeking = query.property(\\'minecraft:armadillo_state\\') == \\'rolled_up_peeking\\';\",\"variable.is_unrolling = query.property(\\'minecraft:armadillo_state\\') == \\'rolled_up_unrolling\\';\",\"variable.unrolling_time = variable.is_unrolling ? ((variable.unrolling_time ?? 0.0) + query.delta_time) : 0.0;\",\"variable.use_rolled_up_model = variable.rolled_up_time >= 0.2083 && (variable.unrolling_time == 0.0 || variable.unrolling_time <= 1.25 );\",\"variable.walking = query.modified_move_speed > 0.01 && !variable.is_rolled_up;\",\"variable.walk_anim_time_update = query.anim_time + math.min(3.0, math.lerp(2.0, 5.0, query.modified_move_speed)) * query.delta_time;\"],\"animate\":[\"look_at_target_controller\",\"walk_controller\",\"roll_up_controller\"],\"should_update_effects_offscreen\":\"1.0\"},\"animations\":{\"look_at_target\":\"animation.{name}.look_at_target\",\"look_at_target_controller\":\"controller.animation.armadillo.look_at_target\",\"walk\":\"animation.{name}.walk\",\"walk_controller\":\"controller.animation.armadillo.walk\",\"roll_up\":\"animation.{name}.roll_up\",\"rolled_up\":\"animation.{name}.rolled_up\",\"peek\":\"animation.{name}.peek\",\"unroll\":\"animation.{name}.unroll\",\"unroll_fast\":\"animation.{name}.unroll_fast\",\"roll_up_controller\":\"controller.animation.armadillo.roll_up\"},\"sound_effects\":{\"roll\":\"mob.armadillo.roll\",\"land\":\"mob.armadillo.land\",\"peek\":\"mob.armadillo.peek\",\"unroll_start\":\"mob.armadillo.unroll_start\",\"unroll_finish\":\"mob.armadillo.unroll_finish\"},\"spawn_egg\":{\"base_color\":\"#ad716d\",\"overlay_color\":\"#824848\"}}}}'},5154:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/{name}\"},\"animations\":{\"default_pose\":\"animation.{name}.default_pose\",\"no_pose\":\"animation.{name}.no_pose\",\"solemn_pose\":\"animation.{name}.solemn_pose\",\"athena_pose\":\"animation.{name}.athena_pose\",\"brandish_pose\":\"animation.{name}.brandish_pose\",\"honor_pose\":\"animation.{name}.honor_pose\",\"entertain_pose\":\"animation.{name}.entertain_pose\",\"salute_pose\":\"animation.{name}.salute_pose\",\"riposte_pose\":\"animation.{name}.riposte_pose\",\"zombie_pose\":\"animation.{name}.zombie_pose\",\"cancan_a_pose\":\"animation.{name}.cancan_a_pose\",\"cancan_b_pose\":\"animation.{name}.cancan_b_pose\",\"hero_pose\":\"animation.{name}.hero_pose\",\"wiggle\":\"animation.{name}.wiggle\",\"controller.pose\":\"controller.animation.armor_stand.pose\",\"controller.wiggling\":\"controller.animation.armor_stand.wiggle\"},\"scripts\":{\"initialize\":[\"variable.armor_stand.pose_index = 0;\",\"variable.armor_stand.hurt_time = 0;\"],\"animate\":[\"controller.pose\",\"controller.wiggling\"]},\"geometry\":{\"default\":\"geometry.{name}\"},\"render_controllers\":[\"controller.render.armor_stand\"],\"enable_attachables\":true}}}'},4971:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"axolotl\",\"limbs\":\"axolotl_limbs\"},\"textures\":{\"blue\":\"textures/entity/axolotl/axolotl_blue\",\"cyan\":\"textures/entity/axolotl/axolotl_cyan\",\"gold\":\"textures/entity/axolotl/axolotl_gold\",\"lucy\":\"textures/entity/axolotl/axolotl_lucy\",\"wild\":\"textures/entity/axolotl/axolotl_wild\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"idle_float\":\"animation.{name}.idle_underwater\",\"idle_floor\":\"animation.{name}.idle_floor\",\"idle_floor_water\":\"animation.{name}.idle_floor_underwater\",\"swim\":\"animation.{name}.swim\",\"walk_floor\":\"animation.{name}.walk_floor\",\"walk_floor_water\":\"animation.{name}.walk_floor_underwater\",\"play_dead\":\"animation.{name}.play_dead\",\"swim_angle\":\"animation.{name}.swim_angle\",\"look_at_target\":\"animation.common.look_at_target\"},\"scripts\":{\"pre_animation\":[\"variable.moving = query.ground_speed > 0 || query.vertical_speed > 0;\",\"variable.pitch = query.body_x_rotation;\"]},\"animation_controllers\":[{\"general\":\"controller.animation.axolotl.general\"},{\"move\":\"controller.animation.axolotl.move\"}],\"render_controllers\":[\"controller.render.axolotl\"],\"spawn_egg\":{\"base_color\":\"#0xfbc1e3\",\"overlay_color\":\"#0xa62d74\"}}}}'},4271:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/bat\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.35\"},\"animations\":{\"resting\":\"animation.{name}.resting\",\"flying\":\"animation.{name}.flying\"},\"animation_controllers\":[{\"move\":\"controller.animation.bat.move\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":18}}}}'},1326:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/bee/bee\",\"angry\":\"textures/entity/bee/bee_angry\",\"nectar\":\"textures/entity/bee/bee_nectar\",\"angry_nectar\":\"textures/entity/bee/bee_angry_nectar\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"flying\":\"animation.{name}.flying\",\"drip\":\"controller.animation.bee.drip\",\"controller_bee_sting\":\"controller.animation.bee.sting\",\"bee_sting\":\"animation.{name}.sting\",\"bee_no_stinger\":\"animation.{name}.no_stinger\",\"bee_fly_bobbing\":\"animation.{name}.fly.bobbing\",\"bee_root_controller\":\"controller.animation.bee.root\"},\"particle_effects\":{\"nectar_dripping\":\"minecraft:nectar_drip_particle\"},\"scripts\":{\"animate\":[\"bee_root_controller\",{\"bee_no_stinger\":\"query.mark_variant == 1\"}]},\"render_controllers\":[\"controller.render.bee\"],\"spawn_egg\":{\"texture\":\"egg_bee\",\"texture_index\":0}}}}'},9446:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"body\":\"blaze_body\",\"head\":\"blaze_head\"},\"textures\":{\"default\":\"textures/entity/blaze\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"look_at_target\":\"animation.common.look_at_target\",\"move\":\"animation.{name}.move\"},\"particle_effects\":{\"charged_flames\":\"minecraft:mobflame_emitter\"},\"animation_controllers\":[{\"move\":\"controller.animation.blaze.move\"},{\"flame\":\"controller.animation.blaze.flame\"}],\"render_controllers\":[\"controller.render.blaze\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":21}}}}'},5409:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_emissive_alpha\",\"breeze_wind\":\"breeze_wind\"},\"textures\":{\"default\":\"textures/entity/breeze/breeze\",\"breeze_wind\":\"textures/entity/breeze/breeze_wind\"},\"geometry\":{\"default\":\"geometry.{name}\",\"breeze_wind_top\":\"geometry.breeze_wind_top\",\"breeze_wind_mid\":\"geometry.breeze_wind_mid\",\"breeze_wind_bottom\":\"geometry.breeze_wind_bottom\"},\"spawn_egg\":{\"base_color\":\"#af94df\",\"overlay_color\":\"#9166df\"},\"scripts\":{\"animate\":[\"look_at_controller\",\"idle_controller\",\"move_controller\",\"ground_particles_controller\",\"shoot_controller\",\"jump_controller\",\"idle_ground_sound_controller\"],\"should_update_effects_offscreen\":\"1.0\"},\"animations\":{\"look_at\":\"animation.common.look_at_target\",\"idle\":\"animation.{name}.idle\",\"jump\":\"animation.{name}.jump\",\"shoot\":\"animation.{name}.shoot\",\"slide\":\"animation.{name}.slide\",\"idle_ground_particles\":\"animation.{name}.idle_ground_particles\",\"slide_ground_particles\":\"animation.{name}.slide_ground_particles\",\"whirl_sound\":\"animation.{name}.whirl_sound\",\"idle_ground_sound\":\"animation.{name}.idle_ground_sound\",\"look_at_controller\":\"controller.animation.breeze.look_at\",\"idle_controller\":\"controller.animation.breeze.idle\",\"move_controller\":\"controller.animation.breeze.move\",\"ground_particles_controller\":\"controller.animation.breeze.ground_particles\",\"shoot_controller\":\"controller.animation.breeze.shoot\",\"jump_controller\":\"controller.animation.breeze.jump\",\"idle_ground_sound_controller\":\"controller.animation.breeze.idle_ground_sound\"},\"render_controllers\":[\"controller.render.breeze\",\"controller.render.breeze_wind_top\",\"controller.render.breeze_wind_mid\",\"controller.render.breeze_wind_bottom\"],\"sound_effects\":{\"charge\":\"mob.breeze.charge\",\"inhale\":\"mob.breeze.inhale\",\"slide\":\"mob.breeze.slide\",\"whirl\":\"mob.breeze.whirl\",\"idle_ground_sound\":\"mob.breeze.idle_ground\"},\"particle_effects\":{\"ground_particles\":\"minecraft:breeze_ground_particle\"}}}}'},9388:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"camel\"},\"textures\":{\"default\":\"textures/entity/camel/camel\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#fcc369\",\"overlay_color\":\"#cb9337\"},\"animations\":{\"moving\":\"animation.{name}.walk\",\"sit_down\":\"animation.{name}.sit_down\",\"sitting\":\"animation.{name}.sit\",\"stand_up\":\"animation.{name}.stand_up\",\"look_at_target\":\"animation.{name}.look_at_target\",\"dashing\":\"animation.{name}.dash\",\"dashing_sound\":\"animation.{name}.dash_sound\",\"idle\":\"animation.{name}.idle\",\"main\":\"controller.animation.camel.general\"},\"scripts\":{\"pre_animation\":[\"variable.dash_cooldown = (!(variable.last_dash_cooldown ?? true) && query.has_dash_cooldown) ? 2.75 : ( variable.dash_cooldown ?? 0 );\",\"variable.dash_cooldown = math.max(0, variable.dash_cooldown-query.delta_time);\",\"variable.dash_cooldown_progress = (2.75 - variable.dash_cooldown) / 2.75;\",\"variable.last_dash_cooldown = query.has_dash_cooldown;\",\"variable.moving = query.modified_move_speed > 0.05 || query.vertical_speed > 0.05;\",\"variable.xTargetRot = math.clamp(query.target_x_rotation, -30, 30);\",\"variable.xHeadRot = variable.dash_cooldown_progress > 0 ? math.clamp(variable.xTargetRot + (45 * (1 - variable.dash_cooldown_progress)), -25, 70) : variable.xTargetRot;\",\"variable.yHeadRot = math.clamp(query.target_y_rotation, -30, 30);\"],\"animate\":[\"main\",\"idle\"]},\"sound_effects\":{\"sit_down\":\"mob.camel.sit\",\"stand_up\":\"mob.camel.stand\",\"dash\":\"mob.camel.dash\"},\"render_controllers\":[\"controller.render.camel\"]}}}'},5118:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"cat\"},\"textures\":{\"white\":\"textures/entity/cat/white\",\"black\":\"textures/entity/cat/tuxedo\",\"red\":\"textures/entity/cat/redtabby\",\"siamese\":\"textures/entity/cat/siamesecat\",\"british\":\"textures/entity/cat/britishshorthair\",\"calico\":\"textures/entity/cat/calico\",\"persian\":\"textures/entity/cat/persian\",\"ragdoll\":\"textures/entity/cat/ragdoll\",\"tabby\":\"textures/entity/cat/tabby\",\"jellie\":\"textures/entity/cat/jellie\",\"all_black\":\"textures/entity/cat/allblackcat\",\"white_tame\":\"textures/entity/cat/white_tame\",\"black_tame\":\"textures/entity/cat/tuxedo_tame\",\"red_tame\":\"textures/entity/cat/redtabby_tame\",\"siamese_tame\":\"textures/entity/cat/siamesecat_tame\",\"british_tame\":\"textures/entity/cat/britishshorthair_tame\",\"calico_tame\":\"textures/entity/cat/calico_tame\",\"persian_tame\":\"textures/entity/cat/persian_tame\",\"ragdoll_tame\":\"textures/entity/cat/ragdoll_tame\",\"tabby_tame\":\"textures/entity/cat/tabby_tame\",\"all_black_tame\":\"textures/entity/cat/allblackcat_tame\",\"jellie_tame\":\"textures/entity/cat/jellie_tame\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"sneak\":\"animation.{name}.sneak\",\"walk\":\"animation.{name}.walk\",\"sprint\":\"animation.{name}.sprint\",\"sit\":\"animation.{name}.sit\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\",\"lie_down\":\"animation.{name}.lie_down\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.cat.look_at_target\"},{\"move\":\"controller.animation.cat.move\"},{\"baby\":\"controller.animation.cat.baby\"}],\"render_controllers\":[\"controller.render.cat\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":53}}}}'},8839:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"spider\",\"invisible\":\"spider_invisible\"},\"textures\":{\"default\":\"textures/entity/spider/cave_spider\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.7\"},\"animations\":{\"default_leg_pose\":\"animation.{name}.default_leg_pose\",\"look_at_target\":\"animation.spider.look_at_target\",\"walk\":\"animation.{name}.walk\"},\"animation_controllers\":[{\"move\":\"controller.animation.spider.move\"}],\"render_controllers\":[\"controller.render.spider\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":22}}}}'},9471:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.12.0\",\"materials\":{\"default\":\"entity_alphatest\",\"legs\":\"chicken_legs\"},\"textures\":{\"default\":\"textures/entity/chicken\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\",\"general\":\"animation.{name}.general\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"scripts\":{\"animate\":[\"general\",{\"move\":\"query.modified_move_speed\"},\"look_at_target\",{\"baby_transform\":\"query.is_baby\"}]},\"render_controllers\":[\"controller.render.chicken\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":0}}}}'},6500:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/fish/cod\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.ZRot = !query.is_in_water ? Math.cos((query.time_stamp + query.frame_alpha) * 14.32) * 90 : 0.0;\",\"variable.AnimationAmountBlend = Math.lerp(variable.AnimationAmountPrev, variable.AnimationAmount, query.frame_alpha);\"]},\"animations\":{\"flop\":\"animation.{name}.flop\",\"swim\":\"animation.{name}.swim\"},\"animation_controllers\":[{\"general\":\"controller.animation.fish.general\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":45}}}}'},4647:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/cow/cow\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"scripts\":{\"animate\":[{\"walk\":\"query.modified_move_speed\"},\"look_at_target\",{\"baby_transform\":\"query.is_baby\"}]},\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":1}}}}'},5620:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\",\"charged\":\"charged_creeper\"},\"textures\":{\"default\":\"textures/entity/creeper/creeper\",\"charged\":\"textures/entity/creeper/creeper_armor\"},\"geometry\":{\"default\":\"geometry.{name}\",\"charged\":\"geometry.creeper.charged\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":6},\"scripts\":{\"pre_animation\":[\"variable.wobble = Math.sin(query.swell_amount * 5730) * query.swell_amount * 0.01 + 1.0;\",\"variable.swelling_scale1 = (Math.pow(Math.clamp(query.swell_amount, 0.0, 1.0), 4.0) * 0.4 + 1.0) * variable.wobble;\",\"variable.swelling_scale2 = (Math.pow(Math.clamp(query.swell_amount, 0.0, 1.0), 4.0) * 0.1 + 1.0) / variable.wobble;\",\"variable.leg_rot = Math.cos(query.modified_distance_moved * 38.17326) * 80.22 * query.modified_move_speed;\",\"variable.flash = Math.mod(Math.Round(query.swell_amount * 10.0), 2.0);\"]},\"animations\":{\"creeper_head\":\"animation.common.look_at_target\",\"creeper_legs\":\"animation.{name}.legs\",\"creeper_swelling\":\"animation.{name}.swelling\"},\"animation_controllers\":[{\"creeper_head\":\"controller.animation.creeper.head\"},{\"creeper_legs\":\"controller.animation.creeper.legs\"},{\"creeper_swelling\":\"controller.animation.creeper.swelling\"}],\"render_controllers\":[\"controller.render.creeper\",\"controller.render.creeper_armor\"]}}}'},3730:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/dolphin\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"general\":\"controller.animation.dolphin.general\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":49}}}}'},5392:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"horse\"},\"textures\":{\"donkey\":\"textures/entity/horse2/donkey\",\"markings_none\":\"textures/entity/horse2/horse_markings_none\",\"armor_none\":\"textures/entity/horse2/armor/horse_armor_none\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"baby_transform\":\"animation.{name}.baby_transform\",\"walk\":\"animation.{name}.walk\",\"eat\":\"animation.{name}.eat\",\"rear\":\"animation.{name}.rear\",\"tail\":\"animation.{name}.tail\",\"look_at_player\":\"animation.{name}.look_at_player\"},\"scripts\":{\"scale\":\"0.87\",\"initialize\":[\"variable.eat_anim = 0;\",\"variable.stand_anim = 0;\",\"variable.leg_stand_factor = 0;\",\"variable.leg_x_rot_anim = 0;\"],\"pre_animation\":[\"variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);\",\"variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);\",\"variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));\",\"variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);\",\"variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;\"],\"animate\":[{\"baby_transform\":\"query.is_baby\"},\"walk\",\"look_at_player\",{\"rear\":\"variable.stand_anim > 0.0\"},{\"eat\":\"!query.is_standing\"},{\"tail\":\"Math.mod(q.life_time, 10) < 0.5\"}]},\"render_controllers\":[\"controller.render.donkey.v3\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":30}}}}'},5111:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.16.0\",\"materials\":{\"default\":\"drowned\"},\"textures\":{\"default\":\"textures/entity/zombie/drowned\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"],\"animate\":[{\"humanoid_big_head\":\"query.is_baby\"},\"look_at_target\",\"move\",{\"riding.arms\":\"query.is_riding\"},{\"riding.legs\":\"query.is_riding\"},\"holding\",{\"charging\":\"query.is_charging\"},\"attack_controller\",{\"brandish_spear\":\"variable.is_brandishing_spear\"},\"bob\",{\"damage_nearby_mobs\":\"variable.damage_nearby_mobs\"},{\"use_item_progress\":\"( variable.use_item_interval_progress > 0.0 ) || ( variable.use_item_startup_progress > 0.0 )\"},{\"swimming\":\"variable.swim_amount > 0.0\"}]},\"animations\":{\"humanoid_big_head\":\"animation.humanoid.big_head\",\"look_at_target\":\"controller.animation.humanoid.look_at_target\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"attack_controller\":\"controller.animation.drowned.attack.rotations\",\"zombie_attack_bare_hand\":\"animation.zombie.attack_bare_hand\",\"attack_rotations\":\"animation.{name}.attack.rotations\",\"swimming\":\"animation.zombie.swimming\"},\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true,\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":48}}}}'},4682:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_emissive_alpha\",\"invisible\":\"enderman_invisible\"},\"textures\":{\"default\":\"textures/entity/enderman/enderman\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 28.65;\"]},\"animations\":{\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.{name}.move\",\"attack.rotations\":\"animation.{name}.attack.rotations\",\"bob\":\"animation.{name}.bob\",\"arms_legs\":\"animation.{name}.arms_legs\",\"carrying\":\"animation.{name}.carrying\",\"scary_face\":\"animation.{name}.scary_face\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"carrying\":\"controller.animation.enderman.carrying\"},{\"scary_face\":\"controller.animation.enderman.scary_face\"}],\"render_controllers\":[\"controller.render.enderman\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":7}}}}'},3795:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/endermite\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"move\":\"controller.animation.endermite.move\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":25}}}}'},3185:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/illager/evoker\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.9375\",\"animate\":[\"controller_general\",\"controller_move\"]},\"animations\":{\"general\":\"animation.{name}.general\",\"casting\":\"animation.{name}.casting\",\"look_at_target\":\"animation.common.look_at_target\",\"move\":\"animation.{name}.move\",\"celebrating\":\"animation.humanoid.celebrating\",\"controller_general\":\"controller.animation.evoker.general\",\"controller_move\":\"controller.animation.villager.move\"},\"particle_effects\":{\"spell\":\"minecraft:evoker_spell\"},\"render_controllers\":[\"controller.render.evoker\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":40}}}}'},7457:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"red\":\"textures/entity/fox/fox\",\"arctic\":\"textures/entity/fox/arctic_fox\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\",\"crouch\":\"animation.{name}.crouch\",\"sleep\":\"animation.{name}.sleep\",\"setup\":\"animation.{name}.setup\",\"sit\":\"animation.{name}.sit\",\"wiggle\":\"animation.{name}.wiggle\",\"stuck\":\"animation.{name}.stuck\",\"pounce\":\"animation.{name}.pounce\",\"move\":\"controller.animation.fox.move\"},\"scripts\":{\"animate\":[\"setup\",{\"baby_transform\":\"query.is_baby\"},\"move\"]},\"render_controllers\":[\"controller.render.fox\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":55}}}}'},7718:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"frog\"},\"textures\":{\"temperate\":\"textures/entity/frog/temperate_frog\",\"cold\":\"textures/entity/frog/cold_frog\",\"warm\":\"textures/entity/frog/warm_frog\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#d07444\",\"overlay_color\":\"#ffc77c\"},\"animations\":{\"croak\":\"animation.{name}.croak\",\"jump\":\"animation.{name}.jump\",\"tongue\":\"animation.{name}.tongue\",\"walk\":\"animation.{name}.walk\",\"swim\":\"animation.{name}.swim\",\"idle_water\":\"animation.{name}.idle.water\",\"look_at_target\":\"animation.common.look_at_target\",\"general\":\"controller.animation.frog.general\",\"croaking\":\"controller.animation.frog.croaking\",\"eat_mob\":\"controller.animation.frog.eat_mob\"},\"scripts\":{\"animate\":[\"general\",\"croaking\",\"eat_mob\"],\"pre_animation\":[\"variable.moving = query.ground_speed > 0 || query.vertical_speed > 0;\"]},\"render_controllers\":[\"controller.render.frog\"]}}}'},9073:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"ghast\"},\"textures\":{\"default\":\"textures/entity/ghast/ghast\",\"shooting\":\"textures/entity/ghast/ghast_shooting\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":19},\"animations\":{\"move\":\"animation.{name}.move\",\"scale\":\"animation.{name}.scale\"},\"animation_controllers\":[{\"move\":\"controller.animation.ghast.move\"},{\"scale\":\"controller.animation.ghast.scale\"}],\"render_controllers\":[\"controller.render.ghast\"]}}}'},7056:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"glow_squid\"},\"textures\":{\"default\":\"textures/entity/glow_squid/glow_squid\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\",\"squid_rotate\":\"animation.{name}.rotate\"},\"scripts\":{\"animate\":[\"move\",\"squid_rotate\"]},\"render_controllers\":[\"controller.render.glow_squid\"],\"spawn_egg\":{\"base_color\":\"#0x095656\",\"overlay_color\":\"#0x85f1bc\"}}}}'},709:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"goat\"},\"textures\":{\"default\":\"textures/entity/goat/goat\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#c0ac90\",\"overlay_color\":\"#857261\"},\"scripts\":{\"pre_animation\":[\"variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\",\"variable.tcos_left_side = -variable.tcos_right_side;\",\"variable.attack_head_rot =  Math.sin(variable.attack_time * 180.0) * -37.3;\",\"variable.ram_head_rot = Math.sin(variable.should_bow_head * 90.0) * 37.3;\"],\"animate\":[\"walk\",\"look_at_target\",{\"attack\":\"variable.has_target && variable.attack_time >= 0.0\"},\"ram_attack\",\"horns\"]},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.{name}.look_at_target\",\"attack\":\"animation.{name}.attack\",\"ram_attack\":\"animation.{name}.ram_attack\",\"horns\":\"animation.{name}.horns\"},\"render_controllers\":[\"controller.render.default\"]}}}'},9273:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"guardian\",\"ghost\":\"guardian_ghost\"},\"textures\":{\"default\":\"textures/entity/guardian\",\"elder\":\"textures/entity/guardian_elder\",\"beam\":\"textures/entity/guardian_beam\"},\"geometry\":{\"default\":\"geometry.{name}\",\"ghost\":\"geometry.{name}\"},\"animations\":{\"setup\":\"animation.{name}.setup\",\"spikes\":\"animation.{name}.spikes\",\"swim\":\"animation.{name}.swim\",\"look_at_target\":\"animation.common.look_at_target\",\"move_eye\":\"animation.{name}.move_eye\"},\"scripts\":{\"pre_animation\":[\"variable.spike_shake = Math.sin(query.life_time * 2000)/50;\",\"variable.spike_animation_speed = query.life_time < 0.1 ? 0.0 : (!query.is_in_water ? (Math.round(Math.sin(query.life_time * 2000)) == 0.0 ? (Math.random(0.0, 1.0)) : (variable.spike_animation_speed)) : (query.is_moving ? (variable.spike_animation_speed - variable.spike_animation_speed * 0.06) : (variable.spike_animation_speed + (1.0 - variable.spike_animation_speed) * 0.06)));\",\"variable.spike_extension = (1.0 - variable.spike_animation_speed) * 0.55;\",\"variable.tail_animation_speed = query.life_time < 0.1 ? 0.0 : (!query.is_in_water ? 2.0 : query.is_moving ? (variable.tail_animation_speed < 0.5 ? 4.0 : variable.tail_animation_speed + (0.5 - variable.tail_animation_speed) * 0.1) : variable.tail_animation_speed + (0.125 - variable.tail_animation_speed) * 0.2);\",\"variable.tail_swim = query.life_time < 0.1 ? 0.0 : (variable.tail_swim + variable.tail_animation_speed);\",\"variable.tail_base_angle = Math.sin(variable.tail_swim*20.0);\"],\"animate\":[\"setup\",\"spikes\",\"swim\",\"look_at_target\",\"move_eye\"]},\"render_controllers\":[\"controller.render.guardian\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":26}}}}'},3626:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"ghast\"},\"geometry\":{\"default\":\"geometry.{name}\",\"ropes\":\"geometry.happy_ghast_ropes\"},\"textures\":{\"ghastling\":\"textures/entity/{name}/ghastling\",\"happy_ghast\":\"textures/entity/{name}/{name}\",\"ropes\":\"textures/entity/happy_ghast/happy_ghast_ropes\"},\"render_controllers\":[\"controller.render.happy_ghast\",\"controller.render.happy_ghast_ropes\"],\"scripts\":{\"pre_animation\":[\"variable.is_harnessed = query.equipment_count > 0;\",\"variable.shrink_scalar_to_avoid_z_fighting = 3.975f / 4.0f;\",\"variable.shrink_scalar_when_harnessed = variable.is_harnessed ? (16.0f / 17.0f) : 1.0f;\",\"variable.scale = variable.shrink_scalar_to_avoid_z_fighting * variable.shrink_scalar_when_harnessed;\",\"variable.render_ropes = variable.is_harnessed && query.has_any_leashed_entity_of_type(\\'minecraft:boat\\', \\'minecraft:chest_boat\\', \\'minecraft:horse\\', \\'minecraft:skeleton_horse\\', \\'minecraft:zombie_horse\\', \\'minecraft:mule\\', \\'minecraft:donkey\\', \\'minecraft:camel\\', \\'minecraft:sniffer\\');\"],\"animate\":[\"move_controller\",\"scale_controller\"],\"should_update_effects_offscreen\":\"1.0\"},\"animations\":{\"move\":\"animation.{name}.move\",\"move_controller\":\"controller.animation.happy_ghast.move\",\"scale\":\"animation.{name}.scale\",\"scale_controller\":\"controller.animation.happy_ghast.scale\"},\"enable_attachables\":true,\"spawn_egg\":{\"texture\":\"spawn_egg_happy_ghast\"}}}}'},1139:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"hoglin\"},\"textures\":{\"default\":\"textures/entity/hoglin/hoglin\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#C66E55\",\"overlay_color\":\"#5f6464\"},\"scripts\":{\"pre_animation\":[\"variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\",\"variable.tcos_left_side = -variable.tcos_right_side;\",\"variable.attack_head_rot =  Math.sin(variable.attack_time * 180.0) * -37.3;\"]},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.{name}.look_at_target\",\"attack\":\"animation.{name}.attack\",\"hoglin_baby_scaling\":\"animation.{name}.baby_scaling\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.hoglin.look_at_target\"},{\"walk\":\"controller.animation.hoglin.walk\"},{\"attack\":\"controller.animation.hoglin.attack\"},{\"hoglin_baby_scaling\":\"controller.animation.hoglin.baby_scaling\"}],\"render_controllers\":[\"controller.render.default\"]}}}'},1373:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"horse_leather_armor\"},\"textures\":{\"base_brown\":\"textures/entity/horse2/horse_brown\",\"base_white\":\"textures/entity/horse2/horse_white\",\"base_creamy\":\"textures/entity/horse2/horse_creamy\",\"base_chestnut\":\"textures/entity/horse2/horse_chestnut\",\"base_black\":\"textures/entity/horse2/horse_black\",\"base_gray\":\"textures/entity/horse2/horse_gray\",\"base_darkbrown\":\"textures/entity/horse2/horse_darkbrown\",\"markings_none\":\"textures/entity/horse2/horse_markings_none\",\"markings_white\":\"textures/entity/horse2/horse_markings_white\",\"markings_whitefield\":\"textures/entity/horse2/horse_markings_whitefield\",\"markings_whitedots\":\"textures/entity/horse2/horse_markings_whitedots\",\"markings_blackdots\":\"textures/entity/horse2/horse_markings_blackdots\",\"armor_none\":\"textures/entity/horse2/armor/horse_armor_none\",\"armor_leather\":\"textures/entity/horse2/armor/horse_armor_leather\",\"armor_iron\":\"textures/entity/horse2/armor/horse_armor_iron\",\"armor_gold\":\"textures/entity/horse2/armor/horse_armor_gold\",\"armor_diamond\":\"textures/entity/horse2/armor/horse_armor_diamond\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"baby_transform\":\"animation.{name}.baby_transform\",\"walk\":\"animation.{name}.walk\",\"eat\":\"animation.{name}.eat\",\"rear\":\"animation.{name}.rear\",\"tail\":\"animation.{name}.tail\",\"look_at_player\":\"animation.{name}.look_at_player\"},\"scripts\":{\"initialize\":[\"variable.eat_anim = 0;\",\"variable.stand_anim = 0;\",\"variable.leg_stand_factor = 0;\",\"variable.leg_x_rot_anim = 0;\"],\"pre_animation\":[\"variable.armor_texture_slot = query.armor_texture_slot(1);\",\"variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);\",\"variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);\",\"variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));\",\"variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);\",\"variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;\"],\"animate\":[{\"baby_transform\":\"query.is_baby\"},\"walk\",\"look_at_player\",{\"rear\":\"variable.stand_anim > 0.0\"},{\"eat\":\"!query.is_standing\"},{\"tail\":\"Math.mod(q.life_time, 10) < 0.5\"}]},\"render_controllers\":[\"controller.render.horse.v3\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":23}}}}'},8387:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"husk\"},\"textures\":{\"default\":\"textures/entity/zombie/husk\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"humanoid_big_head\":\"animation.humanoid.big_head\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"zombie_attack_bare_hand\":\"animation.zombie.attack_bare_hand\",\"swimming\":\"animation.zombie.swimming\"},\"animation_controllers\":[{\"humanoid_baby_big_head\":\"controller.animation.humanoid.baby_big_head\"},{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"zombie_attack_bare_hand\":\"controller.animation.zombie.attack_bare_hand\"},{\"swimming\":\"controller.animation.zombie.swimming\"}],\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true,\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":28}}}}'},7399:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"iron_golem\"},\"textures\":{\"default\":\"textures/entity/iron_golem\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"walk\":\"animation.{name}.walk\",\"move\":\"animation.{name}.move\",\"walk_to_target\":\"animation.{name}.walk_to_target\",\"move_to_target\":\"animation.{name}.move_to_target\",\"attack\":\"animation.{name}.attack\",\"flower\":\"animation.{name}.flower\",\"look_at_target\":\"animation.common.look_at_target\",\"move_controller\":\"controller.animation.iron_golem.move\",\"arm_controller\":\"controller.animation.iron_golem.arm_movement\"},\"scripts\":{\"pre_animation\":[\"variable.modified_tcos0 = Math.clamp(((Math.cos(query.modified_distance_moved * 13.5) * Math.min(query.modified_move_speed, 0.6) / variable.gliding_speed_value) * 25.0), -12.5, 12.5);\"],\"animate\":[\"look_at_target\",\"move_controller\",\"arm_controller\"]},\"render_controllers\":[\"controller.render.default\"]}}}'},8985:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"llama\"},\"textures\":{\"creamy\":\"textures/entity/llama/llama_creamy\",\"white\":\"textures/entity/llama/llama_white\",\"brown\":\"textures/entity/llama/llama_brown\",\"gray\":\"textures/entity/llama/llama_gray\",\"decor_none\":\"textures/entity/llama/decor/decor_none\",\"decor_white\":\"textures/entity/llama/decor/decor_white\",\"decor_orange\":\"textures/entity/llama/decor/decor_orange\",\"decor_magenta\":\"textures/entity/llama/decor/decor_magenta\",\"decor_light_blue\":\"textures/entity/llama/decor/decor_light_blue\",\"decor_yellow\":\"textures/entity/llama/decor/decor_yellow\",\"decor_lime\":\"textures/entity/llama/decor/decor_lime\",\"decor_pink\":\"textures/entity/llama/decor/decor_pink\",\"decor_gray\":\"textures/entity/llama/decor/decor_gray\",\"decor_silver\":\"textures/entity/llama/decor/decor_silver\",\"decor_cyan\":\"textures/entity/llama/decor/decor_cyan\",\"decor_purple\":\"textures/entity/llama/decor/decor_purple\",\"decor_blue\":\"textures/entity/llama/decor/decor_blue\",\"decor_brown\":\"textures/entity/llama/decor/decor_brown\",\"decor_green\":\"textures/entity/llama/decor/decor_green\",\"decor_red\":\"textures/entity/llama/decor/decor_red\",\"decor_black\":\"textures/entity/llama/decor/decor_black\",\"decor_wandering_trader\":\"textures/entity/llama/decor/trader_llama_decor\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"setup\":\"animation.llama.setup\",\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.llama.baby_transform\"},\"animation_controllers\":[{\"move\":\"controller.animation.llama.move\"},{\"baby\":\"controller.animation.llama.baby\"}],\"render_controllers\":[\"controller.render.llama\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":38}}}}'},2109:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_emissive_alpha\"},\"textures\":{\"default\":\"textures/entity/slime/magmacube\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.slime_squish_factor = (query.previous_squish_value + (query.current_squish_value - query.previous_squish_value) * query.frame_alpha);\",\"variable.bounce = 1 / ((variable.slime_squish_factor / (query.variant * 0.5 + 1)) + 1);\",\"variable.horizontal_scale_amount = variable.bounce * query.variant;\",\"variable.vertical_scale_amount = (1 / variable.bounce) * query.variant;\"],\"scaleX\":\"variable.horizontal_scale_amount\",\"scaleY\":\"variable.vertical_scale_amount\",\"scaleZ\":\"variable.horizontal_scale_amount\"},\"animations\":{\"move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"general\":\"controller.animation.magma_cube.general\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":20}}}}'},4037:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/cow/mooshroom\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"animation_controllers\":[{\"move\":\"controller.animation.mooshroom.move\"},{\"baby\":\"controller.animation.mooshroom.baby\"}],\"render_controllers\":[\"controller.render.mooshroom\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":5}}}}'},6243:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"horse\"},\"textures\":{\"mule\":\"textures/entity/horse2/mule\",\"markings_none\":\"textures/entity/horse2/horse_markings_none\",\"armor_none\":\"textures/entity/horse2/armor/horse_armor_none\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"baby_transform\":\"animation.{name}.baby_transform\",\"walk\":\"animation.{name}.walk\",\"eat\":\"animation.{name}.eat\",\"rear\":\"animation.{name}.rear\",\"tail\":\"animation.{name}.tail\",\"look_at_player\":\"animation.{name}.look_at_player\"},\"scripts\":{\"scale\":\"0.92\",\"initialize\":[\"variable.eat_anim = 0;\",\"variable.stand_anim = 0;\",\"variable.leg_stand_factor = 0;\",\"variable.leg_x_rot_anim = 0;\"],\"pre_animation\":[\"variable.eat_anim = math.clamp(variable.eat_anim + (query.is_grazing ? ((1.0 - variable.eat_anim) * 0.4 + 0.05) : -variable.eat_anim * 0.4 - 0.05) * query.delta_time * 20.0, 0.0, 1.0);\",\"variable.head_x_rot = query.target_x_rotation + (query.modified_move_speed > 0.2 ? (math.cos(query.modified_distance_moved * 11.46) * 11.46 * query.modified_move_speed + query.modified_move_speed * 11.46) : 0.0);\",\"variable.inverse_max_stand_eat = (1.0 - math.max(variable.stand_anim, variable.eat_anim));\",\"variable.leg_stand_factor = math.cos((query.modified_distance_moved * 38.38) + 180.0);\",\"variable.leg_x_rot_anim = variable.leg_stand_factor * 45.8 * query.modified_move_speed;\"],\"animate\":[{\"baby_transform\":\"query.is_baby\"},\"walk\",\"look_at_player\",{\"rear\":\"variable.stand_anim > 0.0\"},{\"eat\":\"!query.is_standing\"},{\"tail\":\"Math.mod(q.life_time, 10) < 0.5\"}]},\"render_controllers\":[\"controller.render.mule.v3\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":31}}}}'},8003:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"npc\"},\"textures\":{\"default\":\"textures/entity/npc\"},\"geometry\":{\"default\":\"geometry.npc\"},\"scripts\":{\"animate\":[{\"move\":\"query.modified_move_speed\"},\"look_at_target\",{\"baby_transform\":\"query.is_baby\"}]},\"animations\":{\"look_at_target\":\"animation.common.look_at_target\",\"move\":\"animation.npc.move\",\"baby_transform\":\"animation.npc.baby_transform\"},\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":35}}}}'},2688:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"ocelot\"},\"textures\":{\"default\":\"textures/entity/cat/ocelot\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"sneak\":\"animation.{name}.sneak\",\"walk\":\"animation.{name}.walk\",\"sprint\":\"animation.{name}.sprint\",\"sit\":\"animation.{name}.sit\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"animation_controllers\":[{\"move\":\"controller.animation.ocelot.move\"},{\"baby\":\"controller.animation.ocelot.baby\"},{\"look_at_target\":\"controller.animation.ocelot.look_at_target\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":16}}}}'},3514:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/panda/panda\",\"lazy\":\"textures/entity/panda/panda_lazy\",\"worried\":\"textures/entity/panda/panda_worried\",\"playful\":\"textures/entity/panda/panda_playful\",\"brown\":\"textures/entity/panda/panda_brown\",\"weak\":\"textures/entity/panda/panda_sneezy\",\"aggressive\":\"textures/entity/panda/panda_aggressive\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"unhappy\":\"animation.{name}.unhappy\",\"sneezing\":\"animation.{name}.sneezing\",\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\",\"sitting\":\"animation.{name}.sitting\",\"rolling\":\"animation.{name}.rolling\",\"lying\":\"animation.{name}.lying\"},\"animation_controllers\":[{\"move\":\"controller.animation.panda.move\"},{\"unhappy\":\"controller.animation.panda.unhappy\"},{\"sneezing\":\"controller.animation.panda.sneezing\"},{\"baby\":\"controller.animation.panda.baby\"}],\"render_controllers\":[\"controller.render.panda\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":54}}}}'},2592:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"parrot\"},\"textures\":{\"blue\":\"textures/entity/parrot/parrot_blue\",\"green\":\"textures/entity/parrot/parrot_green\",\"red_blue\":\"textures/entity/parrot/parrot_red_blue\",\"yellow_blue\":\"textures/entity/parrot/parrot_yellow_blue\",\"grey\":\"textures/entity/parrot/parrot_grey\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"moving\":\"animation.{name}.moving\",\"base\":\"animation.{name}.base\",\"dance\":\"animation.{name}.dance\",\"sitting\":\"animation.{name}.sitting\",\"flying\":\"animation.{name}.flying\",\"standing\":\"animation.{name}.standing\",\"look_at_target\":\"animation.common.look_at_target\",\"movement_controller\":\"controller.animation.parrot.move\"},\"scripts\":{\"pre_animation\":[\"variable.state = query.is_dancing ? 3 : (query.is_sitting ? 2 : (!query.is_on_ground && !query.is_jumping && !query.is_riding ? 0 : 1));\",\"variable.dance.x = Math.cos(query.life_time * 57.3 * 20.0);\",\"variable.dance.y = -Math.sin(query.life_time * 57.3 * 20.0);\",\"variable.wing_flap = ((math.sin(query.wing_flap_position * 57.3) + 1) * query.wing_flap_speed);\"],\"animate\":[\"look_at_target\",\"movement_controller\"]},\"render_controllers\":[\"controller.render.parrot\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":43}}}}'},2725:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"phantom\",\"invisible\":\"phantom_invisible\"},\"textures\":{\"default\":\"textures/entity/phantom\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"initialize\":[\"variable.runtimeid = 0;\",\"variable.tailrotx = -5.0;\",\"variable.wingrotz = 0.0;\"],\"animate\":[\"phantom_base_pose_controller\",\"move\"]},\"animations\":{\"phantom_base_pose\":\"animation.{name}.base_pose\",\"phantom_base_pose_controller\":\"controller.animation.phantom.base_pose\",\"move\":\"animation.{name}.move\"},\"particle_effects\":{\"wing_dust\":\"minecraft:phantom_trail_particle\"},\"sound_effects\":{\"flap\":\"mob.phantom.flap\"},\"render_controllers\":[\"controller.render.phantom\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":51}}}}'},4750:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/pig/pig\",\"saddled\":\"textures/entity/pig/pig_saddle\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"setup\":\"animation.{name}.setup\",\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"scripts\":{\"animate\":[\"setup\",{\"walk\":\"query.modified_move_speed\"},\"look_at_target\",{\"baby_transform\":\"query.is_baby\"}]},\"render_controllers\":[\"controller.render.pig\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":2}}}}'},1569:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"piglin\"},\"textures\":{\"default\":\"textures/entity/piglin/piglin\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#995f40\",\"overlay_color\":\"#f9f3a4\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\",\"variable.attack = Math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3;\",\"variable.attack2 = Math.sin(variable.attack_time * 180.0) * 57.3;\",\"variable.z_bob = Math.cos(query.life_time * 103.13244) * 2.865 + 2.865;\",\"variable.x_bob = Math.sin(query.life_time * 76.776372) * 2.865;\"],\"animate\":[{\"admire\":\"query.is_admiring\"},{\"humanoid_big_head\":\"query.is_baby\"},{\"celebrate_hunt\":\"query.is_celebrating\"},{\"celebrate_hunt_special\":\"query.is_celebrating_special\"},\"move\",\"bob\",\"look_at_target_controller\",\"piglin_attack_controller\",\"riding_controller\"]},\"animations\":{\"move\":\"animation.{name}.move\",\"bob\":\"animation.humanoid.bob\",\"humanoid_big_head\":\"animation.humanoid.big_head\",\"admire\":\"animation.{name}.admire\",\"celebrate_hunt\":\"animation.{name}.celebrate_hunt\",\"celebrate_hunt_special\":\"animation.{name}.celebrate_hunt_special\",\"look_at_target_controller\":\"controller.animation.humanoid.look_at_target\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"piglin_attack_controller\":\"controller.animation.piglin.attack\",\"crossbow_hold\":\"animation.{name}.crossbow.hold\",\"crossbow_charge\":\"animation.{name}.crossbow.charge\",\"melee_attack\":\"animation.{name}.sword.attack\",\"hand_attack\":\"animation.{name}.hand.attack\",\"riding_controller\":\"controller.animation.humanoid.riding\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\"},\"render_controllers\":[\"controller.render.piglin\"],\"enable_attachables\":true}}}'},5324:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"pillager\"},\"textures\":{\"default\":\"textures/entity/pillager\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":56},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"],\"animate\":[\"pillager_root_controller\"]},\"animations\":{\"humanoid_base_pose\":\"animation.humanoid.base_pose\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"bob\":\"animation.humanoid.bob\",\"crossbow_hold\":\"animation.pillager.crossbow.hold\",\"crossbow_charge\":\"animation.pillager.crossbow.charge\",\"celebrating\":\"animation.humanoid.celebrating\",\"controller_humanoid_base_pose\":\"controller.animation.humanoid.base_pose\",\"controller_look_at_target\":\"controller.animation.humanoid.look_at_target\",\"controller_move\":\"controller.animation.humanoid.move\",\"controller_riding\":\"controller.animation.humanoid.riding\",\"controller_attack\":\"controller.animation.humanoid.attack\",\"controller_bob\":\"controller.animation.humanoid.bob\",\"controller_pillager_attack\":\"controller.animation.pillager.attack\",\"pillager_root_controller\":\"controller.animation.pillager.root\"},\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true}}}'},1217:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/polarbear\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"walk\":\"animation.{name}.walk\",\"move\":\"animation.{name}.move\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\"},\"scripts\":{\"scale\":\"1.2\"},\"animation_controllers\":[{\"move\":\"controller.animation.polarbear.move\"},{\"baby\":\"controller.animation.polarbear.baby\"}],\"render_controllers\":[\"controller.render.polarbear\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":37}}}}'},5976:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"brown\":\"textures/entity/rabbit/brown\",\"white\":\"textures/entity/rabbit/white\",\"black\":\"textures/entity/rabbit/blackrabbit\",\"white_splotched\":\"textures/entity/rabbit/white_splotched\",\"gold\":\"textures/entity/rabbit/gold\",\"salt\":\"textures/entity/rabbit/salt\",\"toast\":\"textures/entity/rabbit/toast\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\",\"baby_transform\":\"animation.{name}.baby_transform\",\"look_at_target\":\"animation.common.look_at_target\"},\"animation_controllers\":[{\"general\":\"controller.animation.rabbit.general\"},{\"baby\":\"controller.animation.rabbit.baby\"}],\"render_controllers\":[\"controller.render.rabbit\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":24}}}}'},3828:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"textures\":{\"default\":\"textures/entity/illager/ravager\"},\"materials\":{\"default\":\"ravager\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":57},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"idle_mouth\":\"animation.{name}.idle_mouth\",\"stunned\":\"animation.{name}.stunned\",\"roaring\":\"animation.{name}.roaring\",\"move\":\"controller.animation.ravager.move\",\"head\":\"controller.animation.ravager.head_movement\",\"biting\":\"animation.{name}.biting\"},\"scripts\":{\"pre_animation\":[\"variable.roar_length = 1.0;\",\"variable.bite_anim_duration = 0.75f;\",\"variable.bite_neck_length = 10;\"],\"animate\":[\"move\",\"head\"]},\"particle_effects\":{\"stun_particles\":\"minecraft:stunned_emitter\"}}}}'},5722:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/fish/salmon\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.ZRot = !query.is_in_water ? Math.cos((query.time_stamp + query.frame_alpha) * 14.32) * 90 : 0.0;\",\"variable.AnimationAmountBlend = Math.lerp(variable.AnimationAmountPrev, variable.AnimationAmount, query.frame_alpha);\"]},\"animations\":{\"flop\":\"animation.{name}.flop\",\"swim\":\"animation.{name}.swim\"},\"animation_controllers\":[{\"general\":\"controller.animation.fish.general\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":47}}}}'},7043:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"sheep\"},\"textures\":{\"default\":\"textures/entity/sheep/sheep\"},\"geometry\":{\"default\":\"geometry.{name}\",\"sheared\":\"geometry.sheep.sheared.v1.8\"},\"animations\":{\"setup\":\"animation.{name}.setup\",\"grazing\":\"animation.{name}.grazing\",\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"baby_transform\":\"animation.{name}.baby_transform\",\"move\":\"controller.animation.sheep.move\"},\"scripts\":{\"animate\":[\"setup\",\"look_at_target\",\"move\",{\"baby_transform\":\"query.is_baby\"}]},\"render_controllers\":[\"controller.render.sheep\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":3}}}}'},1546:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"shulker\"},\"textures\":{\"undyed\":\"textures/entity/shulker/shulker_undyed\",\"white\":\"textures/entity/shulker/shulker_white\",\"orange\":\"textures/entity/shulker/shulker_orange\",\"magenta\":\"textures/entity/shulker/shulker_magenta\",\"light_blue\":\"textures/entity/shulker/shulker_light_blue\",\"yellow\":\"textures/entity/shulker/shulker_yellow\",\"lime\":\"textures/entity/shulker/shulker_lime\",\"pink\":\"textures/entity/shulker/shulker_pink\",\"gray\":\"textures/entity/shulker/shulker_gray\",\"silver\":\"textures/entity/shulker/shulker_silver\",\"cyan\":\"textures/entity/shulker/shulker_cyan\",\"purple\":\"textures/entity/shulker/shulker_purple\",\"blue\":\"textures/entity/shulker/shulker_blue\",\"brown\":\"textures/entity/shulker/shulker_brown\",\"green\":\"textures/entity/shulker/shulker_green\",\"red\":\"textures/entity/shulker/shulker_red\",\"black\":\"textures/entity/shulker/shulker_black\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":34},\"scripts\":{\"pre_animation\":[\"variable.Shulker.LidPositionFactor = 180 * (0.5 + variable.Shulker.PeekAmount);\",\"variable.Shulker.LidRotationFactor = -1 + Math.sin(180 * (0.5 + variable.Shulker.PeekAmount));\",\"variable.Shulker.UpFacing = variable.Shulker.FacingDirection == 1;\",\"variable.Shulker.NorthFacing = variable.Shulker.FacingDirection == 2;\",\"variable.Shulker.SouthFacing = variable.Shulker.FacingDirection == 3;\",\"variable.Shulker.WestFacing = variable.Shulker.FacingDirection == 4;\",\"variable.Shulker.EastFacing = variable.Shulker.FacingDirection == 5;\",\"variable.Shulker.XPreRotation = variable.Shulker.UpFacing * 180 + variable.Shulker.NorthFacing * 90 - variable.Shulker.SouthFacing * 90;\",\"variable.Shulker.ZPreRotation = variable.Shulker.NorthFacing * 180 + variable.Shulker.WestFacing * 90 - variable.Shulker.EastFacing * 90;\",\"variable.Shulker.XOffset = -variable.Shulker.WestFacing * 7.99 + variable.Shulker.EastFacing * 7.99;\",\"variable.Shulker.YOffset = variable.Shulker.UpFacing * 16 + variable.Shulker.NorthFacing * 7.99 + variable.Shulker.SouthFacing * 7.99 + variable.Shulker.WestFacing * 7.99 + variable.Shulker.EastFacing * 7.99;\",\"variable.Shulker.ZOffset = variable.Shulker.NorthFacing * 7.99 - variable.Shulker.SouthFacing * 7.99;\"]},\"animations\":{\"facing\":\"animation.{name}.facing\",\"move\":\"animation.{name}.move\",\"look_at_target\":\"animation.common.look_at_target\"},\"animation_controllers\":[{\"facing\":\"controller.animation.shulker.facing\"},{\"move\":\"controller.animation.shulker.move\"}],\"render_controllers\":[\"controller.render.shulker\"]}}}'},5701:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"silverfish\",\"body_layer\":\"silverfish_layers\"},\"textures\":{\"default\":\"textures/entity/silverfish\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"move\":\"controller.animation.silverfish.move\"}],\"render_controllers\":[\"controller.render.silverfish\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":8}}}}'},5373:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"skeleton\"},\"textures\":{\"default\":\"textures/entity/skeleton/skeleton\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":9},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"swimming\":\"animation.zombie.swimming\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"skeleton_attack\":\"animation.skeleton.attack\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"swimming\":\"controller.animation.zombie.swimming\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"skeleton_attack\":\"controller.animation.skeleton.attack\"}],\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true}}}'},2162:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"slime_outer\"},\"textures\":{\"default\":\"textures/entity/slime/slime\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.squish_factor = (query.previous_squish_value + (query.current_squish_value - query.previous_squish_value) * query.frame_alpha);\",\"variable.bounce = 1 / ((variable.squish_factor / (query.variant * 0.5 + 1)) + 1);\",\"variable.horizontal_scale_amount = variable.bounce * query.variant;\",\"variable.vertical_scale_amount = (1 / variable.bounce) * query.variant;\"],\"scaleX\":\"variable.horizontal_scale_amount\",\"scaleY\":\"variable.vertical_scale_amount\",\"scaleZ\":\"variable.horizontal_scale_amount\"},\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":10}}}}'},6123:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"sniffer\"},\"textures\":{\"default\":\"textures/entity/sniffer/sniffer\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"baby_transform\":\"animation.{name}.baby_transform\",\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.common.look_at_target\",\"sniffsniff\":\"animation.{name}.sniffsniff\",\"long_sniff\":\"animation.{name}.longsniff\",\"search\":\"animation.{name}.search\",\"dig\":\"animation.{name}.dig\",\"stand_up\":\"animation.{name}.stand_up\",\"feeling_happy\":\"animation.{name}.feeling_happy\",\"controller_walk\":\"controller.animation.sniffer.walk\",\"controller_sniffsniff\":\"controller.animation.sniffer.sniffsniff\",\"controller_long_sniff\":\"controller.animation.sniffer.long_sniff\",\"controller_search\":\"controller.animation.sniffer.search\",\"controller_dig\":\"controller.animation.sniffer.dig\",\"controller_stand_up\":\"controller.animation.sniffer.stand_up\",\"controller_feeling_happy\":\"controller.animation.sniffer.feeling_happy\"},\"scripts\":{\"pre_animation\":[\"variable.moving = math.min(1.0, query.modified_move_speed * 10);\"],\"animate\":[\"look_at_target\",{\"baby_transform\":\"query.is_baby\"},\"controller_walk\",\"controller_sniffsniff\",\"controller_long_sniff\",\"controller_search\",\"controller_dig\",\"controller_stand_up\",\"controller_feeling_happy\"]},\"render_controllers\":[\"controller.render.sniffer\"],\"spawn_egg\":{\"base_color\":\"#871E09\",\"overlay_color\":\"#25AB70\"},\"sound_effects\":{\"drop_seed\":\"mob.sniffer.drop_seed\",\"sniffsniff\":\"mob.sniffer.sniffsniff\",\"searching\":\"mob.sniffer.searching\",\"long_sniff\":\"mob.sniffer.long_sniff\",\"digging\":\"mob.sniffer.digging\",\"stand_up\":\"mob.sniffer.stand_up\",\"happy\":\"mob.sniffer.happy\"}}}}'},8312:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/snow_golem\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\",\"sheared\":\"animation.{name}.sheared\",\"look_at_target\":\"animation.common.look_at_target\",\"move_controller\":\"controller.animation.snowgolem.move.v1.8\"},\"scripts\":{\"animate\":[\"move_controller\",{\"sheared\":\"query.is_sheared\"}]},\"render_controllers\":[\"controller.render.default\"]}}}'},7719:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"spider\",\"invisible\":\"spider_invisible\"},\"textures\":{\"default\":\"textures/entity/spider/spider\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"default_leg_pose\":\"animation.{name}.default_leg_pose\",\"look_at_target\":\"animation.{name}.look_at_target\",\"walk\":\"animation.{name}.walk\"},\"animation_controllers\":[{\"move\":\"controller.animation.spider.move\"}],\"render_controllers\":[\"controller.render.spider\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":11}}}}'},2416:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/squid\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"animations\":{\"move\":\"animation.{name}.move\",\"squid_rotate\":\"animation.{name}.rotate\"},\"scripts\":{\"animate\":[\"move\",\"squid_rotate\"]},\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":15}}}}'},4381:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"strider\"},\"textures\":{\"default\":\"textures/entity/strider/strider\",\"saddled\":\"textures/entity/strider/strider_saddled\",\"suffocated\":\"textures/entity/strider/strider_suffocated\",\"suffocated_saddled\":\"textures/entity/strider/strider_suffocated_saddled\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#9c3436\",\"overlay_color\":\"#4d494d\"},\"scripts\":{\"pre_animation\":[\"variable.animation_speed = Math.min(query.modified_move_speed, 0.25);\",\"variable.speed = 85.9437;\",\"variable.bristle_flow=Math.cos(query.modified_distance_moved * variable.speed + 180) * variable.animation_speed;\",\"variable.bristle_range_mod=1;\",\"variable.bristle_speed_mod=1;\"],\"animate\":[\"look_at_target\",\"walk\",\"bristle_flow\"]},\"animations\":{\"look_at_target\":\"animation.{name}.look_at_target.default\",\"walk\":\"animation.{name}.walk\",\"bristle_flow\":\"animation.{name}.bristle_flow\"},\"render_controllers\":[\"controller.render.strider\"]}}}'},8203:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"{name}\"},\"textures\":{\"default\":\"textures/entity/{name}\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#6d533d\",\"overlay_color\":\"#160a00\"},\"animations\":{\"swim\":\"animation.{name}.swim\",\"general\":\"controller.animation.tadpole.general\"},\"scripts\":{\"animate\":[\"general\"]},\"render_controllers\":[\"controller.render.tadpole\"]}}}'},2482:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"entity_alphatest\"},\"textures\":{\"default\":\"textures/entity/sea_turtle\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.timeMultiplier = query.has_rider ? 0.39972 : 1.0;\",\"variable.backLegMultiplier = query.has_rider ? 0.5 : 3.0;\",\"variable.frontLegMultiplier = query.has_rider ? 2.0 : 8.0;\",\"variable.legSpeedMultiplier = query.has_rider ? 2.0 : 5.0;\"],\"scale\":\"1.2\"},\"animations\":{\"general\":\"animation.{name}.general\",\"move\":\"animation.{name}.move\",\"ground_move\":\"animation.{name}.ground_move\",\"look_at_target\":\"animation.common.look_at_target\"},\"animation_controllers\":[{\"general\":\"controller.animation.turtle.general\"},{\"move\":\"controller.animation.turtle.move\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":50}}}}'},4931:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"vex\"},\"textures\":{\"default\":\"textures/entity/vex/vex\",\"charging\":\"textures/entity/vex/vex_charging\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"],\"scale\":\"0.4\"},\"animations\":{\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.{name}.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"swimming\":\"animation.humanoid.swimming\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"vex_move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"swimming\":\"controller.animation.humanoid.swimming\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"vex_move\":\"controller.animation.vex.move\"}],\"render_controllers\":[\"controller.render.vex\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":41}}}}'},5398:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"villager_v2\",\"masked\":\"villager_v2_masked\"},\"textures\":{\"base\":\"textures/entity/villager2/villager\",\"base2\":\"textures/entity/villager2/villager\",\"base3\":\"textures/entity/villager2/villager\",\"base4\":\"textures/entity/villager2/villager\",\"base5\":\"textures/entity/villager2/villager\",\"base6\":\"textures/entity/villager2/villager\",\"desert\":\"textures/entity/villager2/biomes/biome_desert\",\"jungle\":\"textures/entity/villager2/biomes/biome_jungle\",\"plains\":\"textures/entity/villager2/biomes/biome_plains\",\"savanna\":\"textures/entity/villager2/biomes/biome_savanna\",\"snow\":\"textures/entity/villager2/biomes/biome_snow\",\"swamp\":\"textures/entity/villager2/biomes/biome_swamp\",\"taiga\":\"textures/entity/villager2/biomes/biome_taiga\",\"armorer\":\"textures/entity/villager2/professions/armorer\",\"butcher\":\"textures/entity/villager2/professions/butcher\",\"cartographer\":\"textures/entity/villager2/professions/cartographer\",\"cleric\":\"textures/entity/villager2/professions/cleric\",\"farmer\":\"textures/entity/villager2/professions/farmer\",\"fisherman\":\"textures/entity/villager2/professions/fisherman\",\"fletcher\":\"textures/entity/villager2/professions/fletcher\",\"leatherworker\":\"textures/entity/villager2/professions/leatherworker\",\"librarian\":\"textures/entity/villager2/professions/librarian\",\"shepherd\":\"textures/entity/villager2/professions/shepherd\",\"tool_smith\":\"textures/entity/villager2/professions/toolsmith\",\"weapon_smith\":\"textures/entity/villager2/professions/weaponsmith\",\"stonemason\":\"textures/entity/villager2/professions/stonemason\",\"nitwit\":\"textures/entity/villager2/professions/nitwit\",\"unskilled\":\"textures/entity/villager2/professions/unskilled\",\"level_stone\":\"textures/entity/villager2/levels/level_stone\",\"level_iron\":\"textures/entity/villager2/levels/level_iron\",\"level_gold\":\"textures/entity/villager2/levels/level_gold\",\"level_emerald\":\"textures/entity/villager2/levels/level_emerald\",\"level_diamond\":\"textures/entity/villager2/levels/level_diamond\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.9375\",\"pre_animation\":[\"variable.num_professions = 15;\",\"variable.num_tiers = 3;\",\"variable.profession_index = (query.variant < variable.num_professions ? query.variant : 0);\",\"variable.level_index = query.trade_tier;\"]},\"animations\":{\"general\":\"animation.villager.general\",\"look_at_target\":\"animation.common.look_at_target\",\"move\":\"animation.villager.move\",\"baby_transform\":\"animation.villager.baby_transform\",\"get_in_bed\":\"animation.villager.get_in_bed\"},\"animation_controllers\":[{\"general\":\"controller.animation.villager_v2.general\"},{\"move\":\"controller.animation.villager_v2.move\"},{\"baby\":\"controller.animation.villager_v2.baby\"}],\"render_controllers\":[\"controller.render.villager_v2_base\",\"controller.render.villager_v2_masked\",\"controller.render.villager_v2_level\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":14}}}}'},9005:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"vindicator\"},\"textures\":{\"default\":\"textures/entity/vindicator\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":39},\"scripts\":{\"scale\":\"0.9375\",\"animate\":[\"vindicator_base\",\"vindicator_walk\",\"controller_look_at_target\",\"controller_vindicator_base\",\"controller_riding\"]},\"animations\":{\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"riding.arms\":\"animation.{name}.riding.arms\",\"riding.legs\":\"animation.{name}.riding.legs\",\"vindicator_base\":\"animation.{name}.base\",\"vindicator_attack\":\"animation.{name}.attack\",\"vindicator_hand_attack\":\"animation.{name}.hand_attack\",\"vindicator_walk\":\"animation.{name}.walk\",\"celebrating\":\"animation.humanoid.celebrating\",\"controller_look_at_target\":\"controller.animation.humanoid.look_at_target\",\"controller_vindicator_base\":\"controller.animation.vindicator.base\",\"controller_riding\":\"controller.animation.humanoid.riding\"},\"render_controllers\":[\"controller.render.vindicator\"],\"enable_attachables\":true}}}'},5172:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"wandering_trader\"},\"textures\":{\"default\":\"textures/entity/wandering_trader\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.9375\"},\"animations\":{\"general\":\"animation.{name}.general\",\"look_at_target\":\"animation.common.look_at_target\",\"raise_arms\":\"animation.{name}.raise_arms\",\"move\":\"animation.{name}.move\"},\"animation_controllers\":[{\"general\":\"controller.animation.villager.general\"},{\"raise_arms\":\"controller.animation.villager_v2.raise_arms\"},{\"move\":\"controller.animation.villager.move\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg_wandering_trader\"}}}}'},9807:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"warden\",\"bioluminescent_layer\":\"warden_bioluminescent_layer\"},\"textures\":{\"default\":\"textures/entity/warden/warden\",\"bioluminescent_layer\":\"textures/entity/warden/warden_bioluminescent_layer\",\"spots_1\":\"textures/entity/warden/warden_pulsating_spots_1\",\"spots_2\":\"textures/entity/warden/warden_pulsating_spots_2\",\"tendrils\":\"textures/entity/warden/warden_tendrils\",\"heart\":\"textures/entity/warden/warden_heart\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.animation_speed = Math.min(0.5, 3.0 * query.modified_move_speed);\",\"variable.anim_pos_mod = 49.388962;\",\"variable.bob = query.life_time * 20;\",\"variable.modified_bob = variable.bob * 0.1 * 57.2958;\",\"variable.modified_bob_sin = math.sin(variable.modified_bob);\",\"variable.modified_bob_cos = math.cos(variable.modified_bob);\",\"variable.pi = 180;\",\"variable.halfpi = variable.pi / 2.0;\",\"variable.tendril_animation_length = 0.5;\",\"variable.head_x_rot = (68.7549 * math.cos(query.modified_distance_moved * variable.anim_pos_mod + variable.halfpi) * math.min(0.35, variable.animation_speed)) + (math.sin(variable.bob * 5.72958) * 0.06);\",\"variable.head_z_rot = (17.1887 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed) + (Math.cos(variable.bob * 5.72958) * 0.06);\",\"variable.body_x_rot = (57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * math.min(0.35, variable.animation_speed)) + (math.cos(variable.bob * 5.72958) * 0.025);\",\"variable.body_z_rot = (5.72958 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed) + (math.sin(variable.bob * 5.72958) * 0.025);\",\"variable.left_leg_x_rot = 57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed;\",\"variable.right_leg_x_rot = 57.2958 * math.cos(query.modified_distance_moved * variable.anim_pos_mod + variable.pi) * variable.animation_speed;\",\"variable.left_arm_x_rot = -(45.8366 * math.cos(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed);\",\"variable.right_arm_x_rot = -(45.8366 * math.sin(query.modified_distance_moved * variable.anim_pos_mod) * variable.animation_speed);\",\"variable.vibration_phase = query.time_since_last_vibration_detection;\",\"variable.tendril_animation = variable.vibration_phase < 0.0 ? 0.0 : 1.0 - (math.min(query.time_since_last_vibration_detection, variable.tendril_animation_length) / variable.tendril_animation_length);\",\"variable.left_tendril_x_rot = variable.tendril_animation * (math.cos(variable.bob * 128.9155) * variable.pi * 0.1);\",\"variable.right_tendril_x_rot = variable.left_tendril_x_rot * -1;\",\"variable.spots_1_alpha = 0.25 * math.cos(variable.bob * 2.578);\",\"variable.spots_2_alpha = 0.25 * math.cos(variable.bob * 2.578 + 180.0);\",\"variable.tendrils_alpha = variable.tendril_animation;\",\"variable.heart_alpha = 0.8 * (1.0 - query.heartbeat_phase);\"],\"animate\":[\"base_pose\",{\"move\":\"!(query.is_emerging || query.is_digging)\"},\"shiver_controller\",\"bob\",{\"emerge\":\"query.is_emerging\"},\"sniff_controller\",{\"dig\":\"query.is_digging\"},\"roar_controller\",{\"look_at_target\":\"!(query.is_emerging || query.is_digging)\"},\"melee_attack_controller\",{\"swimming\":\"query.swim_amount > 0.0\"},\"hurt_controller\",\"sonic_boom_controller\"]},\"animations\":{\"emerge\":\"animation.{name}.emerge\",\"sniff\":\"animation.{name}.sniff\",\"sniff_controller\":\"controller.animation.warden.sniff\",\"dig\":\"animation.{name}.dig\",\"roar\":\"animation.{name}.roar\",\"roar_controller\":\"controller.animation.warden.roar\",\"shiver\":\"animation.{name}.shiver\",\"shiver_controller\":\"controller.animation.warden.shiver\",\"base_pose\":\"animation.humanoid.base_pose.v1.0\",\"look_at_target\":\"animation.{name}.look_at_target.default\",\"move\":\"animation.{name}.move\",\"melee_attack\":\"animation.{name}.attack\",\"melee_attack_controller\":\"controller.animation.warden.melee_attacking\",\"bob\":\"animation.{name}.bob\",\"swimming\":\"animation.humanoid.swimming.v1.0\",\"hurt\":\"animation.{name}.hurt\",\"hurt_controller\":\"controller.animation.warden.hurt\",\"sonic_boom\":\"animation.{name}.sonic_boom\",\"sonic_boom_controller\":\"controller.animation.warden.sonic_boom\"},\"render_controllers\":[\"controller.render.warden\",\"controller.render.warden_bioluminescent_layer\",\"controller.render.warden_spots_1\",\"controller.render.warden_spots_2\",\"controller.render.warden_tendrils\",\"controller.render.warden_heart\"],\"enable_attachables\":true,\"spawn_egg\":{\"base_color\":\"#0F4649\",\"overlay_color\":\"#39D6E0\"},\"sound_effects\":{\"emerge\":\"mob.warden.emerge\",\"sniff\":\"mob.warden.sniff\",\"dig\":\"mob.warden.dig\",\"roar\":\"mob.warden.roar\",\"clicking\":\"mob.warden.clicking\"},\"particle_effects\":{\"digging\":\"minecraft:warden_dig\"}}}}'},3883:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"witch\"},\"textures\":{\"default\":\"textures/entity/witch\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"scale\":\"0.9375\"},\"animations\":{\"villager_general\":\"animation.{name}.villager_general\",\"look_at_target\":\"animation.common.look_at_target\",\"move\":\"animation.{name}.move\",\"general\":\"animation.{name}.general\"},\"animation_controllers\":[{\"general\":\"controller.animation.witch.general\"},{\"move\":\"controller.animation.villager.move\"}],\"render_controllers\":[\"controller.render.default\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":17}}}}'},5383:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"skeleton\"},\"textures\":{\"default\":\"textures/entity/skeleton/wither_skeleton\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"wither_skeleton_attack\":\"animation.wither_skeleton.attack\",\"swimming\":\"animation.zombie.swimming\"},\"animation_controllers\":[{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"wither_skeleton_attack\":\"controller.animation.wither_skeleton.attack\"},{\"swimming\":\"controller.animation.zombie.swimming\"}],\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true,\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":29}}}}'},1300:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"wolf\"},\"textures\":{\"default\":\"textures/entity/wolf/wolf\",\"angry\":\"textures/entity/wolf/wolf_angry\",\"tame\":\"textures/entity/wolf/wolf_tame\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.body_shake_angle = 0.05 * query.frame_alpha + query.shake_angle;\",\"variable.body_roll_progress = Math.clamp((variable.body_shake_angle - 0.16) / 1.8, 0, 1);\",\"variable.body_rot_z = Math.sin(variable.body_roll_progress * 180) * Math.sin(variable.body_roll_progress * 1980) * 27;\",\"variable.upper_body_roll_progress = Math.clamp((variable.body_shake_angle - 0.08) / 1.8, 0, 1);\",\"variable.upper_body_rot_z = (Math.sin(variable.upper_body_roll_progress * 180) * Math.sin(variable.upper_body_roll_progress * 1980) * 27) - variable.body_rot_z;\",\"variable.tail_roll_progress = Math.clamp((variable.body_shake_angle - 0.2) / 1.8, 0, 1);\",\"variable.tail_rot_z = (Math.sin(variable.tail_roll_progress * 180) * Math.sin(variable.tail_roll_progress * 1980) * 27) - variable.body_rot_z;\",\"variable.head_roll_progress = Math.clamp(variable.body_shake_angle / 1.8, 0, 1);\",\"variable.head_rot_z = (Math.sin(variable.head_roll_progress * 180) * Math.sin(variable.head_roll_progress * 1980) * 27) - variable.body_rot_z;\"]},\"animations\":{\"wolf_baby_scaling\":\"animation.{name}.baby_scaling\",\"wolf_look_at\":\"animation.common.look_at_target\",\"wolf_head_rot_z\":\"animation.{name}.head_rot_z\",\"wolf_tail_default\":\"animation.{name}.tail_default\",\"wolf_angry\":\"animation.{name}.angry\",\"wolf_sitting\":\"animation.{name}.sitting\",\"wolf_shaking\":\"animation.{name}.shaking\",\"wolf_leg_default\":\"animation.{name}.leg_default\"},\"animation_controllers\":[{\"wolf_look_at\":\"controller.animation.wolf.look_at\"},{\"wolf_baby_scaling\":\"controller.animation.wolf.baby_scaling\"},{\"wolf_head_rot_z\":\"controller.animation.wolf.head_rot_z\"},{\"wolf_tail_default\":\"controller.animation.wolf.tail_default\"},{\"wolf_angry\":\"controller.animation.wolf.angry\"},{\"wolf_sitting\":\"controller.animation.wolf.sitting\"},{\"wolf_shaking\":\"controller.animation.wolf.shaking\"}],\"render_controllers\":[\"controller.render.{name}\"],\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":4}}}}'},3101:e=>{e.exports='{\"format_version\":\"1.10.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"zoglin\"},\"textures\":{\"default\":\"textures/entity/zoglin/zoglin\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"base_color\":\"#c66e55\",\"overlay_color\":\"#e6e6e6\"},\"scripts\":{\"pre_animation\":[\"variable.tcos_right_side = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\",\"variable.tcos_left_side = -variable.tcos_right_side;\",\"variable.attack_head_rot =  Math.sin(variable.attack_time * 180.0) * -37.3;\"],\"animate\":[\"walk\",\"look_at_target\",{\"attack\":\"variable.has_target && variable.attack_time >= 0.0\"},{\"hoglin_baby_scaling\":\"query.is_baby\"}]},\"animations\":{\"walk\":\"animation.{name}.walk\",\"look_at_target\":\"animation.{name}.look_at_target\",\"attack\":\"animation.{name}.attack\",\"hoglin_baby_scaling\":\"animation.{name}.baby_scaling\"},\"render_controllers\":[\"controller.render.default\"]}}}'},4322:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"zombie\"},\"textures\":{\"default\":\"textures/entity/zombie/zombie\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":12},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"humanoid_big_head\":\"animation.humanoid.big_head\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"zombie_attack_bare_hand\":\"animation.zombie.attack_bare_hand\",\"swimming\":\"animation.zombie.swimming\"},\"animation_controllers\":[{\"humanoid_baby_big_head\":\"controller.animation.humanoid.baby_big_head\"},{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"zombie_attack_bare_hand\":\"controller.animation.zombie.attack_bare_hand\"},{\"swimming\":\"controller.animation.zombie.swimming\"}],\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true}}}'},507:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"min_engine_version\":\"1.8.0\",\"materials\":{\"default\":\"zombie\"},\"textures\":{\"default\":\"textures/entity/piglin/zombie_piglin\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":13},\"scripts\":{\"pre_animation\":[\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"humanoid_big_head\":\"animation.humanoid.big_head\",\"humanoid_base_pose\":\"animation.humanoid.base_pose\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"swimming\":\"animation.humanoid.swimming\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"zombie_attack_bare_hand\":\"animation.zombie.attack_bare_hand\"},\"animation_controllers\":[{\"humanoid_baby_big_head\":\"controller.animation.humanoid.baby_big_head\"},{\"humanoid_base_pose\":\"controller.animation.humanoid.base_pose\"},{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"swimming\":\"controller.animation.humanoid.swimming\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"zombie_attack_bare_hand\":\"controller.animation.zombie.attack_bare_hand\"}],\"render_controllers\":[\"controller.render.default\"],\"enable_attachables\":true}}}'},533:e=>{e.exports='{\"format_version\":\"1.8.0\",\"minecraft:client_entity\":{\"description\":{\"identifier\":\"{identifier}\",\"materials\":{\"default\":\"zombie_villager_v2\",\"masked\":\"zombie_villager_v2_masked\"},\"textures\":{\"default\":\"textures/entity/zombie_villager2/zombie-villager\",\"desert\":\"textures/entity/zombie_villager2/biomes/biome-desert-zombie\",\"jungle\":\"textures/entity/zombie_villager2/biomes/biome-jungle-zombie\",\"plains\":\"textures/entity/zombie_villager2/biomes/biome-plains-zombie\",\"savanna\":\"textures/entity/zombie_villager2/biomes/biome-savanna-zombie\",\"snow\":\"textures/entity/zombie_villager2/biomes/biome-snow-zombie\",\"swamp\":\"textures/entity/zombie_villager2/biomes/biome-swamp-zombie\",\"taiga\":\"textures/entity/zombie_villager2/biomes/biome-taiga-zombie\",\"armorer\":\"textures/entity/zombie_villager2/professions/armorer\",\"butcher\":\"textures/entity/zombie_villager2/professions/butcher\",\"cartographer\":\"textures/entity/zombie_villager2/professions/cartographer\",\"cleric\":\"textures/entity/zombie_villager2/professions/cleric\",\"farmer\":\"textures/entity/zombie_villager2/professions/farmer\",\"fisherman\":\"textures/entity/zombie_villager2/professions/fisherman\",\"fletcher\":\"textures/entity/zombie_villager2/professions/fletcher\",\"leatherworker\":\"textures/entity/zombie_villager2/professions/leatherworker\",\"librarian\":\"textures/entity/zombie_villager2/professions/librarian\",\"shepherd\":\"textures/entity/zombie_villager2/professions/shepherd\",\"tool_smith\":\"textures/entity/zombie_villager2/professions/toolsmith\",\"weapon_smith\":\"textures/entity/zombie_villager2/professions/weaponsmith\",\"stonemason\":\"textures/entity/zombie_villager2/professions/stonemason\",\"nitwit\":\"textures/entity/zombie_villager2/professions/nitwit\"},\"geometry\":{\"default\":\"geometry.{name}\"},\"scripts\":{\"pre_animation\":[\"variable.num_professions = 14;\",\"variable.profession_index = ((query.variant < variable.num_professions) ? query.variant : 0);\",\"variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;\"]},\"animations\":{\"humanoid_big_head\":\"animation.humanoid.big_head\",\"humanoid_base_pose\":\"animation.humanoid.base_pose\",\"look_at_target_default\":\"animation.humanoid.look_at_target.default\",\"look_at_target_gliding\":\"animation.humanoid.look_at_target.gliding\",\"look_at_target_swimming\":\"animation.humanoid.look_at_target.swimming\",\"move\":\"animation.humanoid.move\",\"riding.arms\":\"animation.humanoid.riding.arms\",\"riding.legs\":\"animation.humanoid.riding.legs\",\"holding\":\"animation.humanoid.holding\",\"brandish_spear\":\"animation.humanoid.brandish_spear\",\"charging\":\"animation.humanoid.charging\",\"attack.rotations\":\"animation.humanoid.attack.rotations\",\"sneaking\":\"animation.humanoid.sneaking\",\"bob\":\"animation.humanoid.bob\",\"damage_nearby_mobs\":\"animation.humanoid.damage_nearby_mobs\",\"bow_and_arrow\":\"animation.humanoid.bow_and_arrow\",\"use_item_progress\":\"animation.humanoid.use_item_progress\",\"zombie_attack_bare_hand\":\"animation.zombie.attack_bare_hand\",\"swimming\":\"animation.zombie.swimming\"},\"animation_controllers\":[{\"humanoid_baby_big_head\":\"controller.animation.humanoid.baby_big_head\"},{\"humanoid_base_pose\":\"controller.animation.humanoid.base_pose\"},{\"look_at_target\":\"controller.animation.humanoid.look_at_target\"},{\"move\":\"controller.animation.humanoid.move\"},{\"riding\":\"controller.animation.humanoid.riding\"},{\"holding\":\"controller.animation.humanoid.holding\"},{\"brandish_spear\":\"controller.animation.humanoid.brandish_spear\"},{\"charging\":\"controller.animation.humanoid.charging\"},{\"attack\":\"controller.animation.humanoid.attack\"},{\"sneaking\":\"controller.animation.humanoid.sneaking\"},{\"bob\":\"controller.animation.humanoid.bob\"},{\"damage_nearby_mobs\":\"controller.animation.humanoid.damage_nearby_mobs\"},{\"bow_and_arrow\":\"controller.animation.humanoid.bow_and_arrow\"},{\"use_item_progress\":\"controller.animation.humanoid.use_item_progress\"},{\"zombie_attack_bare_hand\":\"controller.animation.zombie.attack_bare_hand\"},{\"swimming\":\"controller.animation.zombie.swimming\"}],\"render_controllers\":[\"controller.render.zombie_villager_v2_base\",\"controller.render.zombie_villager_v2_masked\"],\"enable_attachables\":true,\"spawn_egg\":{\"texture\":\"spawn_egg\",\"texture_index\":42}}}}'},4462:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":1.5,\"visible_bounds_offset\":[0,0.25,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-6,0,-6],\"size\":[12,8,12],\"uv\":[0,0]}]}]}]}'},4384:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":128,\"visible_bounds_width\":4,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-9,3,-16],\"size\":[18,9,32],\"uv\":[0,0]}]},{\"name\":\"steering_wheel\",\"parent\":\"body\",\"pivot\":[0,13,-7],\"cubes\":[{\"origin\":[-3,10,-9],\"size\":[6,6,2],\"uv\":[0,20]}]},{\"name\":\"wheel_front_left\",\"parent\":\"root\",\"pivot\":[10,5,-13],\"cubes\":[{\"origin\":[9,0,-18],\"size\":[6,10,10],\"uv\":[0,0]}]},{\"name\":\"wheel_front_right\",\"parent\":\"root\",\"pivot\":[-10,5,-13],\"cubes\":[{\"origin\":[-15,0,-18],\"size\":[6,10,10],\"uv\":[0,0],\"mirror\":true}]},{\"name\":\"wheel_back_left\",\"parent\":\"root\",\"pivot\":[10,5,13],\"cubes\":[{\"origin\":[9,0,8],\"size\":[6,10,10],\"uv\":[0,0]}]},{\"name\":\"wheel_back_right\",\"parent\":\"root\",\"pivot\":[-10,5,13],\"cubes\":[{\"origin\":[-15,0,8],\"size\":[6,10,10],\"uv\":[0,0],\"mirror\":true}]}]}]}'},4774:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"head\",\"parent\":\"root\",\"pivot\":[0,4,0],\"cubes\":[{\"origin\":[-2.5,4.01,-2.5],\"size\":[5,5,5],\"uv\":[0,0]}]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,4,0],\"cubes\":[{\"origin\":[-1.5,0,-1],\"size\":[3,4,2],\"uv\":[0,10]},{\"origin\":[-1.5,-1,-1],\"size\":[3,5,2],\"inflate\":-0.2,\"uv\":[0,16]}],\"locators\":{\"lead\":[0,5,0]}},{\"name\":\"rightItem\",\"parent\":\"body\",\"pivot\":[0,-1,-2],\"rotation\":[-80,0,0]},{\"name\":\"right_arm\",\"parent\":\"body\",\"pivot\":[-1.75,3.5,0],\"cubes\":[{\"origin\":[-2.5,0,-1],\"size\":[1,4,2],\"uv\":[23,0]}]},{\"name\":\"left_arm\",\"parent\":\"body\",\"pivot\":[1.75,3.5,0],\"cubes\":[{\"origin\":[1.5,0,-1],\"size\":[1,4,2],\"uv\":[23,6]}]},{\"name\":\"left_wing\",\"parent\":\"body\",\"pivot\":[0.5,3,1],\"cubes\":[{\"origin\":[0.5,-2,1],\"size\":[0,5,8],\"uv\":[16,14]}]},{\"name\":\"right_wing\",\"parent\":\"body\",\"pivot\":[-0.5,3,1],\"cubes\":[{\"origin\":[-0.5,-2,1],\"size\":[0,5,8],\"uv\":[16,14]}]}]}]}'},2032:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,3,4],\"cubes\":[{\"origin\":[-4,2,-6],\"size\":[8,8,12],\"inflate\":0.3,\"uv\":[0,20]},{\"origin\":[-4,2,-6],\"size\":[8,8,12],\"uv\":[0,40]}],\"locators\":{\"lead\":[0,5,-7]}},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,6,5],\"rotation\":[29,0,0],\"cubes\":[{\"origin\":[-0.5,0.08645,5.09326],\"size\":[1,6,1],\"uv\":[44,53]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,5,-7],\"cubes\":[{\"origin\":[-1.5,1,-8],\"size\":[3,5,2],\"pivot\":[0,5,-7],\"rotation\":[-22.5,0,0],\"uv\":[43,15]}]},{\"name\":\"right_ear\",\"parent\":\"head\",\"pivot\":[-1,6,-7],\"cubes\":[{\"origin\":[-3.5,4,-7.6],\"size\":[2,5,0],\"pivot\":[-1.5,6,-7.6],\"rotation\":[10.80524,-22.13991,-4.11405],\"uv\":[43,10]}]},{\"name\":\"left_ear\",\"parent\":\"head\",\"pivot\":[1,7,-7],\"cubes\":[{\"origin\":[1.5,4,-7.6],\"size\":[2,5,0],\"pivot\":[1.5,6,-7.6],\"rotation\":[10.80524,22.13991,4.11405],\"uv\":[47,10]}]},{\"name\":\"right_hind_leg\",\"pivot\":[-2,3,4],\"cubes\":[{\"origin\":[-3,0,3],\"size\":[2,3,2],\"uv\":[51,31]}]},{\"name\":\"left_hind_leg\",\"pivot\":[2,3,4],\"cubes\":[{\"origin\":[1,0,3],\"size\":[2,3,2],\"uv\":[42,31]}]},{\"name\":\"right_front_leg\",\"pivot\":[-2,3,-4],\"cubes\":[{\"origin\":[-3,0,-5],\"size\":[2,3,2],\"uv\":[51,43]}]},{\"name\":\"left_front_leg\",\"pivot\":[2,3,-4],\"cubes\":[{\"origin\":[1,0,-5],\"size\":[2,3,2],\"uv\":[42,43]}]},{\"name\":\"body_rolled_up\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-5,0,-6],\"size\":[10,10,10],\"uv\":[0,0]}]}]}]}'},2711:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64.0,\"texture_height\":64.0,\"visible_bounds_offset\":[0.0,0.5,0.0],\"visible_bounds_width\":1.5},\"bones\":[{\"name\":\"baseplate\",\"cubes\":[{\"origin\":[-6.0,0.0,-6.0],\"size\":[12.0,1.0,12.0],\"uv\":[0.0,32.0]}]},{\"name\":\"waist\",\"parent\":\"baseplate\",\"pivot\":[0.0,12.0,0.0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-6.0,21.0,-1.5],\"size\":[12.0,3.0,3.0],\"uv\":[0.0,26.0]},{\"origin\":[-3.0,14.0,-1.0],\"size\":[2.0,7.0,2.0],\"uv\":[16.0,0.0]},{\"origin\":[1.0,14.0,-1.0],\"size\":[2.0,7.0,2.0],\"uv\":[48.0,16.0]},{\"origin\":[-4.0,12.0,-1.0],\"size\":[8.0,2.0,2.0],\"uv\":[0.0,48.0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-1.0,24.0,-1.0],\"size\":[2.0,7.0,2.0],\"uv\":[0.0,0.0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-4.0,24.0,-4.0],\"size\":[8.0,8.0,8.0],\"uv\":[32.0,0.0]}]},{\"name\":\"leftarm\",\"parent\":\"body\",\"mirror\":true,\"pivot\":[5.0,22.0,0.0],\"cubes\":[{\"origin\":[5.0,12.0,-1.0],\"size\":[2.0,12.0,2.0],\"uv\":[32.0,16.0]}]},{\"name\":\"leftitem\",\"parent\":\"leftarm\",\"pivot\":[6.0,15.0,1.0]},{\"name\":\"leftleg\",\"parent\":\"body\",\"mirror\":true,\"pivot\":[1.9,12.0,0.0],\"cubes\":[{\"origin\":[0.9,1.0,-1.0],\"size\":[2.0,11.0,2.0],\"uv\":[40.0,16.0]}]},{\"name\":\"rightarm\",\"parent\":\"body\",\"pivot\":[-5.0,22.0,0.0],\"cubes\":[{\"origin\":[-7.0,12.0,-1.0],\"size\":[2.0,12.0,2.0],\"uv\":[24.0,0.0]}]},{\"name\":\"rightitem\",\"parent\":\"rightarm\",\"pivot\":[-6.0,15.0,1.0]},{\"name\":\"rightleg\",\"parent\":\"body\",\"pivot\":[-1.9,12.0,0.0],\"cubes\":[{\"origin\":[-2.9,1.0,-1.0],\"size\":[2.0,11.0,2.0],\"uv\":[8.0,0.0]}]}]}]}'},6600:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,-4,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,3,4],\"cubes\":[{\"origin\":[-4,0,-5],\"size\":[8,4,10],\"uv\":[0,11]},{\"origin\":[0,0,-5],\"size\":[0,5,9],\"uv\":[2,17]}],\"locators\":{\"lead\":[0,0,-5]}},{\"name\":\"right_arm\",\"parent\":\"body\",\"pivot\":[-4,1,-4],\"rotation\":[0,-90,0],\"cubes\":[{\"origin\":[-6,-4,-4],\"size\":[3,5,0],\"uv\":[2,13]}]},{\"name\":\"right_leg\",\"parent\":\"body\",\"pivot\":[-4,1,4],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[-5,-4,4],\"size\":[3,5,0],\"uv\":[2,13]}]},{\"name\":\"left_arm\",\"parent\":\"body\",\"pivot\":[4,1,-4],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[3,-4,-4],\"size\":[3,5,0],\"pivot\":[4,1,-4],\"rotation\":[0,0,0],\"uv\":[2,13]}]},{\"name\":\"left_leg\",\"parent\":\"body\",\"pivot\":[4,1,4],\"rotation\":[0,-90,0],\"cubes\":[{\"origin\":[2,-4,4],\"size\":[3,5,0],\"uv\":[2,13]}]},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,2,4],\"cubes\":[{\"origin\":[0,0,4],\"size\":[0,5,12],\"uv\":[2,19]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,2,-5],\"reset\":true,\"cubes\":[{\"origin\":[-4,0,-10],\"size\":[8,5,5],\"uv\":[0,1]}]},{\"name\":\"left_gills\",\"parent\":\"head\",\"pivot\":[4,2,-6],\"cubes\":[{\"origin\":[4,0,-6],\"size\":[3,7,0],\"uv\":[11,40]}]},{\"name\":\"right_gills\",\"parent\":\"head\",\"pivot\":[-4,2,-6],\"cubes\":[{\"origin\":[-7,0,-6],\"size\":[3,7,0],\"uv\":[0,40]}]},{\"name\":\"top_gills\",\"parent\":\"head\",\"pivot\":[0,5,-6],\"cubes\":[{\"origin\":[-4,5,-6],\"size\":[8,3,0],\"uv\":[3,37]}]}]}]}'},4980:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-3,21,-3],\"size\":[6,6,6],\"uv\":[0,0]}]},{\"name\":\"rightEar\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,26,-2],\"size\":[3,4,1],\"uv\":[24,0]}]},{\"name\":\"leftEar\",\"parent\":\"head\",\"pivot\":[0,24,0],\"mirror\":true,\"cubes\":[{\"origin\":[1,26,-2],\"size\":[3,4,1],\"uv\":[24,0]}]},{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-3,8,-3],\"size\":[6,12,6],\"uv\":[0,16]},{\"origin\":[-5,-8,0],\"size\":[10,16,1],\"uv\":[0,34]}]},{\"name\":\"rightWing\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-12,7,1.5],\"size\":[10,16,1],\"uv\":[42,0]}]},{\"name\":\"rightWingTip\",\"parent\":\"rightWing\",\"pivot\":[-12,23,1.5],\"cubes\":[{\"origin\":[-20,10,1.5],\"size\":[8,12,1],\"uv\":[24,16]}]},{\"name\":\"leftWing\",\"parent\":\"body\",\"pivot\":[0,24,0],\"mirror\":true,\"cubes\":[{\"origin\":[2,7,1.5],\"size\":[10,16,1],\"uv\":[42,0]}]},{\"name\":\"leftWingTip\",\"parent\":\"leftWing\",\"pivot\":[12,23,1.5],\"mirror\":true,\"cubes\":[{\"origin\":[12,10,1.5],\"size\":[8,12,1],\"uv\":[24,16]}]}]}]}'},859:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0.5,5,0],\"cubes\":[{\"origin\":[-3,2,-5],\"size\":[7,7,10],\"uv\":[0,0]},{\"origin\":[2,7,-8],\"size\":[1,2,3],\"uv\":[2,0]},{\"origin\":[-2,7,-8],\"size\":[1,2,3],\"uv\":[2,3]}],\"locators\":{\"lead\":[0,4,-1]}},{\"name\":\"stinger\",\"parent\":\"body\",\"pivot\":[0.5,6,1],\"cubes\":[{\"origin\":[0.5,5,5],\"size\":[0,1,2],\"uv\":[26,7]}]},{\"name\":\"rightwing_bone\",\"parent\":\"body\",\"pivot\":[-1,9,-3],\"rotation\":[15,-15,0],\"cubes\":[{\"origin\":[-10,9,-3],\"size\":[9,0,6],\"uv\":[0,18]}]},{\"name\":\"leftwing_bone\",\"parent\":\"body\",\"pivot\":[2,9,-3],\"rotation\":[15,15,0],\"cubes\":[{\"origin\":[2,9,-3],\"size\":[9,0,6],\"uv\":[9,24]}]},{\"name\":\"leg_front\",\"parent\":\"body\",\"pivot\":[2,2,-2],\"cubes\":[{\"origin\":[-3,0,-2],\"size\":[7,2,0],\"uv\":[26,1]}]},{\"name\":\"leg_mid\",\"parent\":\"body\",\"pivot\":[2,2,0],\"cubes\":[{\"origin\":[-3,0,0],\"size\":[7,2,0],\"uv\":[26,3]}]},{\"name\":\"leg_back\",\"parent\":\"body\",\"pivot\":[2,2,2],\"cubes\":[{\"origin\":[-3,0,2],\"size\":[7,2,0],\"uv\":[26,5]}]}]}]}'},2767:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"upperBodyParts0\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts1\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts2\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts3\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts4\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts5\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts6\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts7\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts8\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts9\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts10\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"upperBodyParts11\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,16,0],\"size\":[2,8,2],\"uv\":[0,16]}]},{\"name\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,20,-4],\"size\":[8,8,8],\"uv\":[0,0]}]}]}]}'},8472:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0]},{\"name\":\"rods\",\"parent\":\"body\",\"pivot\":[0,16,0],\"cubes\":[{\"origin\":[-1,11,-6],\"size\":[2,8,2],\"pivot\":[0,19,-3],\"rotation\":[22.5,0,0],\"uv\":[0,17]},{\"origin\":[-3.59808,11,-1.5],\"size\":[2,8,2],\"pivot\":[-2.59808,19,1.5],\"rotation\":[-157.5,60,180],\"uv\":[0,17]},{\"origin\":[1.59808,11,-1.5],\"size\":[2,8,2],\"pivot\":[2.59808,19,1.5],\"rotation\":[-157.5,-60,180],\"uv\":[0,17]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,20,0],\"cubes\":[{\"origin\":[-4,20,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"eyes\",\"parent\":\"head\",\"pivot\":[0,20,0],\"cubes\":[{\"origin\":[-5,22,-4.2],\"size\":[10,3,4],\"uv\":[4,24]}]},{\"name\":\"tornado_body\",\"pivot\":[0,0,0]},{\"name\":\"tornado_bottom\",\"parent\":\"tornado_body\",\"pivot\":[0,0,0]},{\"name\":\"tornado_mid\",\"parent\":\"tornado_bottom\",\"pivot\":[0,7,0]},{\"name\":\"tornado_top\",\"parent\":\"tornado_mid\",\"pivot\":[0,13,0]}]}]}'},9877:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":128,\"visible_bounds_width\":4,\"visible_bounds_height\":5,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0],\"locators\":{\"root_standing\":[0,32,0],\"root_sitting\":[0,12,0]}},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0.5,20,9.5],\"cubes\":[{\"origin\":[-7.5,20,-14],\"size\":[15,12,27],\"uv\":[0,25]}],\"locators\":{\"driver_seat\":[0,30,-11],\"back_seat\":[0,30,10]}},{\"name\":\"saddle\",\"parent\":\"body\",\"pivot\":[0.5,20,9.5],\"cubes\":[{\"origin\":[-4.5,32,-6],\"size\":[9,5,11],\"inflate\":0.1,\"uv\":[74,64]},{\"origin\":[-3.5,37,-6],\"size\":[7,3,11],\"inflate\":0.1,\"uv\":[92,114]},{\"origin\":[-7.5,20,-14],\"size\":[15,12,27],\"inflate\":0.1,\"uv\":[0,89]}]},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,29,13],\"cubes\":[{\"origin\":[-1.5,15,13],\"size\":[3,14,0],\"pivot\":[0,29,13],\"rotation\":[0,180,0],\"uv\":[122,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0.5,25,-10],\"cubes\":[{\"origin\":[-3.5,22,-25],\"size\":[7,8,19],\"uv\":[60,24]},{\"origin\":[-3.5,30,-25],\"size\":[7,14,7],\"uv\":[21,0]},{\"origin\":[-2.5,39,-31],\"size\":[5,5,6],\"uv\":[50,0]}],\"locators\":{\"lead\":[0.0,25,-15]}},{\"name\":\"bridle\",\"parent\":\"head\",\"pivot\":[0.5,25,-10],\"cubes\":[{\"origin\":[-3.5,22,-25],\"size\":[7,8,19],\"inflate\":0.1,\"uv\":[60,87]},{\"origin\":[-3.5,30,-25],\"size\":[7,14,7],\"inflate\":0.1,\"uv\":[21,64]},{\"origin\":[-2.5,39,-31.1],\"size\":[5,5,6],\"inflate\":0.1,\"uv\":[50,64]},{\"origin\":[2.5,40,-28],\"size\":[1,2,2],\"uv\":[74,70]},{\"origin\":[-3.5,40,-28],\"size\":[1,2,2],\"uv\":[74,70],\"mirror\":true}]},{\"name\":\"left_ear\",\"parent\":\"head\",\"pivot\":[3,43,-19.5],\"cubes\":[{\"origin\":[3,42.5,-20.5],\"size\":[3,1,2],\"uv\":[45,0]}]},{\"name\":\"right_ear\",\"parent\":\"head\",\"pivot\":[-3,43,-19.5],\"cubes\":[{\"origin\":[-6,42.5,-20.5],\"size\":[3,1,2],\"uv\":[67,0]}]},{\"name\":\"reins\",\"parent\":\"head\",\"pivot\":[3.7,41,-27],\"cubes\":[{\"origin\":[3.7,34,-27],\"size\":[0,7,15],\"uv\":[98,42]},{\"origin\":[-3.7,34,-12],\"size\":[7.4,7,0],\"uv\":[84,57]},{\"origin\":[-3.7,34,-27],\"size\":[0,7,15],\"uv\":[98,42]}]},{\"name\":\"hump\",\"parent\":\"body\",\"pivot\":[0.5,32,0],\"cubes\":[{\"origin\":[-4.5,32,-6],\"size\":[9,5,11],\"uv\":[74,0]}]},{\"name\":\"right_front_leg\",\"parent\":\"root\",\"pivot\":[-4.9,23,-10.5],\"cubes\":[{\"origin\":[-7.4,0,-13],\"size\":[5,21,5],\"uv\":[0,26]}]},{\"name\":\"left_front_leg\",\"parent\":\"root\",\"pivot\":[4.9,23,-10.5],\"cubes\":[{\"origin\":[2.4,0,-13],\"size\":[5,21,5],\"uv\":[0,0]}]},{\"name\":\"left_hind_leg\",\"parent\":\"root\",\"pivot\":[4.9,23,9.5],\"cubes\":[{\"origin\":[2.4,0,7],\"size\":[5,21,5],\"uv\":[58,16]}]},{\"name\":\"right_hind_leg\",\"parent\":\"root\",\"pivot\":[-4.9,23,9.5],\"cubes\":[{\"origin\":[-7.4,0,7],\"size\":[5,21,5],\"uv\":[94,16]}]}]}]}'},6587:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":4,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,7,1],\"cubes\":[{\"origin\":[-2,-1,-2],\"size\":[4,16,6],\"pivot\":[0,7,1],\"rotation\":[90,0,0],\"uv\":[20,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,9,-9],\"cubes\":[{\"origin\":[-2.5,7,-12],\"size\":[5,4,5],\"uv\":[0,0]},{\"origin\":[-1.5,7.01562,-13],\"size\":[3,2,2],\"uv\":[0,24]},{\"origin\":[-2,11,-9],\"size\":[1,1,2],\"uv\":[0,10]},{\"origin\":[1,11,-9],\"size\":[1,1,2],\"uv\":[6,10]}],\"locators\":{\"lead\":[0,9,-9]}},{\"name\":\"tail1\",\"parent\":\"body\",\"pivot\":[0,9,8],\"cubes\":[{\"origin\":[-0.5,1,8],\"size\":[1,8,1],\"pivot\":[0,9,8],\"rotation\":[47.5,0,0],\"uv\":[0,15]}]},{\"name\":\"tail2\",\"parent\":\"tail1\",\"pivot\":[0,3.6,13.9],\"rotation\":[95,0,0],\"cubes\":[{\"origin\":[-0.5,-4.4,13.9],\"size\":[1,8,1],\"uv\":[4,15]}]},{\"name\":\"backLegL\",\"parent\":\"body\",\"pivot\":[1.1,6,7],\"cubes\":[{\"origin\":[0.1,0,6],\"size\":[2,6,2],\"uv\":[8,13]}]},{\"name\":\"backLegR\",\"parent\":\"body\",\"pivot\":[-1.1,6,7],\"cubes\":[{\"origin\":[-2.1,0,6],\"size\":[2,6,2],\"uv\":[8,13]}]},{\"name\":\"frontLegL\",\"parent\":\"body\",\"pivot\":[1.2,10,-4],\"cubes\":[{\"origin\":[0.2,0.2,-5],\"size\":[2,10,2],\"uv\":[40,0]}]},{\"name\":\"frontLegR\",\"parent\":\"body\",\"pivot\":[-1.2,10,-4],\"cubes\":[{\"origin\":[-2.2,0.2,-5],\"size\":[2,10,2],\"uv\":[40,0]}]}]}]}'},816:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.25,\"visible_bounds_offset\":[0,0.875,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,8,0],\"cubes\":[{\"origin\":[-3,4,-3],\"size\":[6,8,6],\"pivot\":[0,8,0],\"rotation\":[90,0,0],\"uv\":[0,9]}]},{\"name\":\"head\",\"pivot\":[0,9,-4],\"cubes\":[{\"origin\":[-2,9,-6],\"size\":[4,6,3],\"uv\":[0,0]}],\"locators\":{\"lead\":[0,9,-4]}},{\"name\":\"comb\",\"parent\":\"head\",\"pivot\":[0,9,-4],\"cubes\":[{\"origin\":[-1,9,-7],\"size\":[2,2,2],\"uv\":[14,4]}]},{\"name\":\"beak\",\"parent\":\"head\",\"pivot\":[0,9,-4],\"cubes\":[{\"origin\":[-2,11,-8],\"size\":[4,2,2],\"uv\":[14,0]}]},{\"name\":\"leg0\",\"pivot\":[-2,5,1],\"cubes\":[{\"origin\":[-3,0,-2],\"size\":[3,5,3],\"uv\":[26,0]}]},{\"name\":\"leg1\",\"pivot\":[1,5,1],\"cubes\":[{\"origin\":[0,0,-2],\"size\":[3,5,3],\"uv\":[26,0]}]},{\"name\":\"wing0\",\"pivot\":[-3,11,0],\"cubes\":[{\"origin\":[-4,7,-3],\"size\":[1,4,6],\"uv\":[24,13]}]},{\"name\":\"wing1\",\"pivot\":[3,11,0],\"cubes\":[{\"origin\":[3,7,-3],\"size\":[1,4,6],\"uv\":[24,13]}]}]}]}'},6169:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":1.5,\"visible_bounds_offset\":[0,0.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-1,0,1],\"size\":[2,4,7],\"uv\":[0,0]},{\"origin\":[0,4,0],\"size\":[0,1,6],\"uv\":[20,-6]},{\"origin\":[0,-1,3],\"size\":[0,1,2],\"uv\":[22,-1]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,2,0],\"cubes\":[{\"origin\":[-0.9992,1.0008,-3],\"size\":[2,3,1],\"uv\":[0,0]},{\"origin\":[-1,0,-2],\"size\":[2,4,3],\"uv\":[11,0]}]},{\"name\":\"leftFin\",\"parent\":\"body\",\"pivot\":[1,1,0],\"rotation\":[0,0,35],\"cubes\":[{\"origin\":[1,0,0],\"size\":[2,1,2],\"uv\":[24,4]}]},{\"name\":\"rightFin\",\"parent\":\"body\",\"pivot\":[-1,1,0],\"rotation\":[0,0,-35],\"cubes\":[{\"origin\":[-3,0,0],\"size\":[2,1,2],\"uv\":[24,1]}]},{\"name\":\"tailfin\",\"parent\":\"body\",\"pivot\":[0,0,8],\"cubes\":[{\"origin\":[0,0,8],\"size\":[0,4,6],\"uv\":[20,1]}]},{\"name\":\"waist\",\"parent\":\"body\",\"pivot\":[0,0,0]}]}]}'},7528:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":3.125,\"visible_bounds_offset\":[0,1.4375,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,2],\"cubes\":[{\"origin\":[-6,11,-5],\"size\":[12,18,10],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[18,4]},{\"origin\":[-2,11,-6],\"size\":[4,6,1],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[52,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,20,-8],\"cubes\":[{\"origin\":[-4,16,-14],\"size\":[8,8,6],\"uv\":[0,0]},{\"origin\":[-5,22,-12],\"size\":[1,3,1],\"uv\":[22,0]},{\"origin\":[4,22,-12],\"size\":[1,3,1],\"uv\":[22,0]}],\"locators\":{\"lead\":[0,20,-8]}},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-4,12,7],\"cubes\":[{\"origin\":[-6,0,5],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[4,12,7],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,5],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-4,12,-6],\"cubes\":[{\"origin\":[-6,0,-7],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[4,12,-6],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,-7],\"size\":[4,12,4],\"uv\":[0,16]}]}]}]}'},7793:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3.25,\"visible_bounds_offset\":[0,1.375,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-4,6,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,18,0],\"cubes\":[{\"origin\":[-4,18,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-2,6,4],\"cubes\":[{\"origin\":[-4,0,2],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[2,6,4],\"cubes\":[{\"origin\":[0,0,2],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-2,6,-4],\"cubes\":[{\"origin\":[-4,0,-6],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[2,6,-4],\"cubes\":[{\"origin\":[0,0,-6],\"size\":[4,6,4],\"uv\":[0,16]}]}]},{\"description\":{\"identifier\":\"geometry.{name}.charged\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3.25,\"visible_bounds_offset\":[0,1.375,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-4,6,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,18,0],\"cubes\":[{\"origin\":[-4,18,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-2,6,4],\"cubes\":[{\"origin\":[-4,0,2],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[2,6,4],\"cubes\":[{\"origin\":[0,0,2],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-2,6,-4],\"cubes\":[{\"origin\":[-4,0,-6],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[2,6,-4],\"cubes\":[{\"origin\":[0,0,-6],\"size\":[4,6,4],\"uv\":[0,16]}]}]}]}'},2059:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":5,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,-3],\"cubes\":[{\"origin\":[-4,0,-3],\"size\":[8,7,13],\"uv\":[0,13]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,0,-3],\"cubes\":[{\"origin\":[-4,0,-9],\"size\":[8,7,6],\"uv\":[0,0]}],\"locators\":{\"lead\":[0,0,0]}},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,0,-13],\"cubes\":[{\"origin\":[-1,0,-13],\"size\":[2,2,4],\"uv\":[0,13]}]},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,2.5,11],\"cubes\":[{\"origin\":[-2,0,10],\"size\":[4,5,11],\"uv\":[0,33]}]},{\"name\":\"tail_fin\",\"parent\":\"tail\",\"pivot\":[0,2.5,20],\"cubes\":[{\"origin\":[-5,2,19],\"size\":[10,1,6],\"uv\":[0,49]}]},{\"name\":\"back_fin\",\"parent\":\"body\",\"pivot\":[0,7,2],\"rotation\":[-30,0,0],\"cubes\":[{\"origin\":[-0.5,6.25,1],\"size\":[1,5,4],\"uv\":[29,0]}]},{\"name\":\"left_fin\",\"parent\":\"body\",\"pivot\":[3,1,-1],\"rotation\":[0,-25,20],\"cubes\":[{\"origin\":[3,1,-2.5],\"size\":[8,1,4],\"uv\":[40,0]}]},{\"name\":\"right_fin\",\"parent\":\"body\",\"pivot\":[-3,1,-1],\"rotation\":[0,25,-20],\"cubes\":[{\"origin\":[-11,1,-2.5],\"size\":[8,1,4],\"uv\":[40,6]}]}]}]}'},9636:e=>{e.exports='{\"format_version\":\"1.16.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2.5,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-4.0,12.0,-2.0],\"size\":[8.0,12.0,4.0],\"uv\":[16,16]}]},{\"name\":\"jacket\",\"parent\":\"body\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-4.0,12.0,-2.0],\"size\":[8.0,12.0,4.0],\"uv\":[16,32],\"inflate\":0.5}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-4.0,24.0,-4.0],\"size\":[8.0,8.0,8.0],\"uv\":[0,0],\"inflate\":0.5}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0.0,24.0,0.0],\"cubes\":[{\"origin\":[-4.0,24.0,-4.0],\"size\":[8.0,8.0,8.0],\"uv\":[32,0],\"inflate\":1.0}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5.0,22.0,0.0],\"cubes\":[{\"origin\":[-7.0,12.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[0,16]}]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5.0,22.0,0.0],\"cubes\":[{\"origin\":[4.0,12.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[40,16],\"mirror\":true}]},{\"name\":\"rightSleeve\",\"parent\":\"rightArm\",\"pivot\":[-5.0,22.0,0.0],\"cubes\":[{\"origin\":[-7.0,12.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[48,48],\"inflate\":0.5}]},{\"name\":\"leftSleeve\",\"parent\":\"leftArm\",\"pivot\":[5.0,22.0,0.0],\"cubes\":[{\"origin\":[4.0,12.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[40,32],\"inflate\":0.5,\"mirror\":true}]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-1.9,12.0,0.0],\"cubes\":[{\"origin\":[-4.05,0.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[16,48]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[1.9,12.0,0.0],\"cubes\":[{\"origin\":[0.05,0.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[32,48],\"mirror\":true}]},{\"name\":\"rightPants\",\"parent\":\"rightLeg\",\"pivot\":[-1.9,12.0,0.0],\"cubes\":[{\"origin\":[-4.25,0.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[0,48],\"inflate\":0.25}]},{\"name\":\"leftPants\",\"parent\":\"leftLeg\",\"pivot\":[1.9,12.0,0.0],\"cubes\":[{\"origin\":[0.25,0.0,-2.0],\"size\":[4.0,12.0,4.0],\"uv\":[0,32],\"inflate\":0.25,\"mirror\":true}]},{\"name\":\"waist\",\"parent\":\"body\",\"pivot\":[0.0,12.0,0.0]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-6.0,15.0,1.0]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6.0,15.0,1.0]}]}]}'},7953:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":4,\"visible_bounds_offset\":[0,2,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,42,0],\"reset\":true,\"cubes\":[{\"origin\":[-4,30,-2],\"size\":[8,12,4],\"uv\":[32,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,42,0],\"cubes\":[{\"origin\":[-4,42,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,42,0],\"reset\":true,\"cubes\":[{\"origin\":[-4,41.5,-4],\"size\":[8,8,8],\"inflate\":-0.5,\"uv\":[0,16]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,40,0],\"reset\":true,\"cubes\":[{\"origin\":[-6,12,-1],\"size\":[2,30,2],\"uv\":[56,0]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-8,19,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,40,0],\"reset\":true,\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-1],\"size\":[2,30,2],\"uv\":[56,0]}]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-2,30,0],\"reset\":true,\"cubes\":[{\"origin\":[-3,0,-1],\"size\":[2,30,2],\"uv\":[56,0]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[2,30,0],\"reset\":true,\"mirror\":true,\"cubes\":[{\"origin\":[1,0,-1],\"size\":[2,30,2],\"uv\":[56,0]}]}]}]}'},836:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":1.5,\"visible_bounds_offset\":[0,0.25,0]},\"bones\":[{\"name\":\"section_2\",\"pivot\":[0,0,2.5],\"cubes\":[{\"origin\":[-1.5,0,2.5],\"size\":[3,3,1],\"uv\":[0,14]}]},{\"name\":\"section_0\",\"parent\":\"section_2\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-2,0,-4.4],\"size\":[4,3,2],\"uv\":[0,0]}]},{\"name\":\"section_1\",\"parent\":\"section_2\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-3,0,-2.4],\"size\":[6,4,5],\"uv\":[0,5]}]},{\"name\":\"section_3\",\"parent\":\"section_2\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-0.5,0,3.5],\"size\":[1,2,1],\"uv\":[0,18]}]}]}]}'},6341:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"cubes\":[{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"arms\",\"parent\":\"body\",\"pivot\":[0,22,0],\"cubes\":[{\"origin\":[-8,16,-2],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[4,16,-2],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[-4,16,-2],\"size\":[8,4,4],\"uv\":[40,38]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}],\"locators\":{\"right_hand\":[-6,12,0]}},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-5.5,16,0.5]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}],\"locators\":{\"left_hand\":[6,12,0]}}]}]}'},8966:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":4,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,8,0],\"cubes\":[{\"origin\":[-3,0,-3],\"size\":[6,11,6],\"pivot\":[0,8,0],\"rotation\":[90,0,0],\"uv\":[30,15]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,8,-3],\"cubes\":[{\"origin\":[-4,4,-9],\"size\":[8,6,6],\"uv\":[0,0]},{\"origin\":[-4,10,-8],\"size\":[2,2,1],\"uv\":[0,0]},{\"origin\":[2,10,-8],\"size\":[2,2,1],\"uv\":[22,0]},{\"origin\":[-2,4,-12],\"size\":[4,2,3],\"uv\":[0,24]}],\"locators\":{\"held_item\":[-2,5,-10],\"lead\":[0,4,-4]}},{\"name\":\"head_sleeping\",\"parent\":\"head\",\"pivot\":[0,8,-3],\"cubes\":[{\"origin\":[-4,4,-9],\"size\":[8,6,6],\"uv\":[0,12]},{\"origin\":[-4,10,-8],\"size\":[2,2,1],\"uv\":[0,0]},{\"origin\":[2,10,-8],\"size\":[2,2,1],\"uv\":[22,0]},{\"origin\":[-2,4,-12],\"size\":[4,2,3],\"uv\":[0,24]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-3,6,6],\"cubes\":[{\"origin\":[-3.005,0,5],\"size\":[2,6,2],\"uv\":[14,24]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[1,6,6],\"cubes\":[{\"origin\":[1.005,0,5],\"size\":[2,6,2],\"uv\":[22,24]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-3,6,-1],\"cubes\":[{\"origin\":[-3.005,0,-2],\"size\":[2,6,2],\"uv\":[14,24]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[1,6,-1],\"cubes\":[{\"origin\":[1.005,0,-2],\"size\":[2,6,2],\"uv\":[22,24]}]},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,8,7],\"rotation\":[90,0,0],\"cubes\":[{\"origin\":[-2,-2,4.75],\"size\":[4,9,5],\"uv\":[28,0]}]},{\"name\":\"world\",\"pivot\":[0,0,0]}]}]}'},1165:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":48,\"texture_height\":48,\"visible_bounds_width\":1,\"visible_bounds_height\":0.8,\"visible_bounds_offset\":[0,0.25,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,2,4],\"cubes\":[{\"origin\":[-3.5,1,-4],\"size\":[7,3,9],\"uv\":[3,1]},{\"origin\":[-3.5,3,-4],\"size\":[7,0,9],\"uv\":[23,22]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,4,3],\"cubes\":[{\"origin\":[-3.5,5,-4],\"size\":[7,0,9],\"uv\":[23,13]},{\"origin\":[-3.5,3,-4],\"size\":[7,3,9],\"uv\":[0,13]}],\"locators\":{\"lead\":[0,6,0]}},{\"name\":\"eyes\",\"parent\":\"head\",\"pivot\":[-0.5,4,5]},{\"name\":\"right_eye\",\"parent\":\"eyes\",\"pivot\":[-2,7,-1.5],\"cubes\":[{\"origin\":[-3.5,6,-3],\"size\":[3,2,3],\"uv\":[0,0]}]},{\"name\":\"left_eye\",\"parent\":\"eyes\",\"pivot\":[2,7,-1.5],\"cubes\":[{\"origin\":[0.5,6,-3],\"size\":[3,2,3],\"uv\":[0,5]}]},{\"name\":\"croaking_body\",\"parent\":\"body\",\"pivot\":[0,3,-1],\"cubes\":[{\"origin\":[-3.5,1.1,-3.9],\"size\":[7,2,3],\"inflate\":-0.1,\"uv\":[26,5]}]},{\"name\":\"tongue\",\"parent\":\"body\",\"pivot\":[0,3.1,5],\"cubes\":[{\"origin\":[-2,3.1,-2.1],\"size\":[4,0,7],\"uv\":[17,13]}]},{\"name\":\"left_arm\",\"parent\":\"body\",\"pivot\":[4,3,-2.5],\"cubes\":[{\"origin\":[3,0,-3.5],\"size\":[2,3,3],\"uv\":[0,32]},{\"origin\":[0,-0.01,-7.5],\"size\":[8,0,8],\"pivot\":[4,0,-3.5],\"rotation\":[0,0,0],\"uv\":[18,40]}]},{\"name\":\"right_arm\",\"parent\":\"body\",\"pivot\":[-4,3,-2.5],\"cubes\":[{\"origin\":[-5,0,-3.5],\"size\":[2,3,3],\"uv\":[0,38]},{\"origin\":[-8,-0.01,-7.5],\"size\":[8,0,8],\"uv\":[2,40]}]},{\"name\":\"left_leg\",\"parent\":\"root\",\"pivot\":[3.5,3,4],\"cubes\":[{\"origin\":[2.5,0,2],\"size\":[3,3,4],\"uv\":[14,25]},{\"origin\":[1.5,-0.01,0],\"size\":[8,0,8],\"pivot\":[5.5,0,4],\"rotation\":[0,0,0],\"uv\":[2,32]}]},{\"name\":\"right_leg\",\"parent\":\"root\",\"pivot\":[-3.5,3,4],\"cubes\":[{\"origin\":[-5.5,0,2],\"size\":[3,3,4],\"uv\":[0,25]},{\"origin\":[-9.5,-0.01,0],\"size\":[8,0,8],\"pivot\":[-5.5,0,4],\"rotation\":[0,0,0],\"uv\":[18,32]}]}]}]}'},2494:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":6,\"visible_bounds_height\":10,\"visible_bounds_offset\":[0,4,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,1.5,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,16,16],\"uv\":[0,0]}]},{\"name\":\"tentacles_0\",\"parent\":\"body\",\"pivot\":[-3.8,1,-5],\"cubes\":[{\"origin\":[-4.8,-8,-6],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_1\",\"parent\":\"body\",\"pivot\":[1.3,1,-5],\"cubes\":[{\"origin\":[0.3,-10,-6],\"size\":[2,11,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_2\",\"parent\":\"body\",\"pivot\":[6.3,1,-5],\"cubes\":[{\"origin\":[5.3,-7,-6],\"size\":[2,8,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_3\",\"parent\":\"body\",\"pivot\":[-6.3,1,0],\"cubes\":[{\"origin\":[-7.3,-8,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_4\",\"parent\":\"body\",\"pivot\":[-1.3,1,0],\"cubes\":[{\"origin\":[-2.3,-12,-1],\"size\":[2,13,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_5\",\"parent\":\"body\",\"pivot\":[3.8,1,0],\"cubes\":[{\"origin\":[2.8,-10,-1],\"size\":[2,11,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_6\",\"parent\":\"body\",\"pivot\":[-3.8,1,5],\"cubes\":[{\"origin\":[-4.8,-11,4],\"size\":[2,12,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_7\",\"parent\":\"body\",\"pivot\":[1.3,1,5],\"cubes\":[{\"origin\":[0.3,-11,4],\"size\":[2,12,2],\"uv\":[0,0]}]},{\"name\":\"tentacles_8\",\"parent\":\"body\",\"pivot\":[6.3,1,5],\"cubes\":[{\"origin\":[5.3,-12,4],\"size\":[2,13,2],\"uv\":[0,0]}]}]}]}'},4700:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"left_back_leg\",\"pivot\":[1,10,4],\"cubes\":[{\"origin\":[1,0,4],\"size\":[3,6,3],\"uv\":[36,29]}]},{\"name\":\"right_back_leg\",\"pivot\":[-3,10,4],\"cubes\":[{\"origin\":[-3,0,4],\"size\":[3,6,3],\"uv\":[49,29]}]},{\"name\":\"right_front_leg\",\"pivot\":[-3,10,-6],\"cubes\":[{\"origin\":[-3,0,-6],\"size\":[3,10,3],\"uv\":[49,2]}]},{\"name\":\"left_front_leg\",\"pivot\":[1,10,-6],\"cubes\":[{\"origin\":[1,0,-6],\"size\":[3,10,3],\"uv\":[35,2]}]},{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-4,6,-7],\"size\":[9,11,16],\"uv\":[1,1]},{\"origin\":[-5,4,-8],\"size\":[11,14,11],\"uv\":[0,28]}]},{\"name\":\"head\",\"pivot\":[0.5,17,-8],\"cubes\":[{\"origin\":[-2,15,-16],\"size\":[5,7,10],\"pivot\":[1,18,-8],\"rotation\":[55,0,0],\"uv\":[34,46]},{\"origin\":[3,19,-10],\"size\":[3,2,1],\"uv\":[2,61],\"mirror\":true},{\"origin\":[-5,19,-10],\"size\":[3,2,1],\"uv\":[2,61]},{\"origin\":[0.5,6,-14],\"size\":[0,7,5],\"uv\":[23,52]}]},{\"name\":\"right_horn\",\"parent\":\"head\",\"pivot\":[1,18,-8],\"cubes\":[{\"origin\":[-1.99,19,-10],\"size\":[2,7,2],\"uv\":[12,55]}]},{\"name\":\"left_horn\",\"parent\":\"head\",\"pivot\":[1,18,-8],\"cubes\":[{\"origin\":[0.99,19,-10],\"size\":[2,7,2],\"uv\":[12,55]}]}]}]}'},2548:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3.5,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"head\",\"pivot\":[0,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-6,2,-8],\"size\":[12,12,16],\"uv\":[0,0],\"mirror\":false},{\"origin\":[-8,2,-6],\"size\":[2,12,12],\"uv\":[0,28],\"mirror\":false},{\"origin\":[6,2,-6],\"size\":[2,12,12],\"uv\":[0,28]},{\"origin\":[-6,14,-6],\"size\":[12,2,12],\"uv\":[16,40]},{\"origin\":[-6,0,-6],\"size\":[12,2,12],\"uv\":[16,40]}]},{\"name\":\"eye\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,6,0],\"size\":[2,2,1],\"uv\":[8,0]}]},{\"name\":\"tailpart0\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-2,6,7],\"size\":[4,4,8],\"uv\":[40,0]}]},{\"name\":\"tailpart1\",\"parent\":\"tailpart0\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,7,0],\"size\":[3,3,7],\"uv\":[0,54]}]},{\"name\":\"tailpart2\",\"parent\":\"tailpart1\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,8,0],\"size\":[2,2,6],\"uv\":[41,32]},{\"origin\":[1,4.5,3],\"size\":[1,9,9],\"uv\":[25,19]}]},{\"name\":\"spikepart0\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart1\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart2\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart3\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart4\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart5\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart6\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart7\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart8\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart9\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart10\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]},{\"name\":\"spikepart11\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-1,19.5,-1],\"size\":[2,9,2],\"uv\":[0,0]}]}]}]}'},3703:e=>{e.exports='{\"format_version\":\"1.21.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":5,\"visible_bounds_height\":7,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-32,0,-32],\"size\":[64,64,64],\"uv\":{\"north\":{\"uv\":[16,16],\"uv_size\":[16,16]},\"east\":{\"uv\":[0,16],\"uv_size\":[16,16]},\"south\":{\"uv\":[48,16],\"uv_size\":[16,16]},\"west\":{\"uv\":[32,16],\"uv_size\":[16,16]},\"up\":{\"uv\":[16,0],\"uv_size\":[16,16]},\"down\":{\"uv\":[32,16],\"uv_size\":[16,-16]}}},{\"origin\":[-30.5,1.5,-30.5],\"size\":[61,61,61],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[16,48],\"uv_size\":[16,16]},\"east\":{\"uv\":[0,48],\"uv_size\":[16,16]},\"south\":{\"uv\":[48,48],\"uv_size\":[16,16]},\"west\":{\"uv\":[32,48],\"uv_size\":[16,16]},\"up\":{\"uv\":[16,32],\"uv_size\":[16,16]},\"down\":{\"uv\":[32,48],\"uv_size\":[16,-16]}}}],\"locators\":{\"lead\":[0,0,0],\"lead_hold\":[0,24,0],\"multi_lead_hold_1\":[31,24,31],\"multi_lead_hold_2\":[31,24,-27],\"multi_lead_hold_3\":[-31,24,-27],\"multi_lead_hold_4\":[-31,24,31]}},{\"name\":\"tentacles_0\",\"parent\":\"body\",\"pivot\":[-15.2,4,-20],\"cubes\":[{\"origin\":[-19.2,-16,-24],\"size\":[8,20,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,5]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,5]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,5]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,5]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_1\",\"parent\":\"body\",\"pivot\":[5.2,4,-20],\"cubes\":[{\"origin\":[1.2,-24,-24],\"size\":[8,28,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,7]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,7]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,7]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,7]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_2\",\"parent\":\"body\",\"pivot\":[25.2,4,-20],\"cubes\":[{\"origin\":[21.2,-12,-24],\"size\":[8,16,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,4]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,4]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,4]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,4]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_3\",\"parent\":\"body\",\"pivot\":[-25.2,4,0],\"cubes\":[{\"origin\":[-29.2,-16,-4],\"size\":[8,20,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,5]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,5]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,5]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,5]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_4\",\"parent\":\"body\",\"pivot\":[-5.2,4,0],\"cubes\":[{\"origin\":[-9.2,-16,-4],\"size\":[8,20,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,5]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,5]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,5]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,5]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_5\",\"parent\":\"body\",\"pivot\":[15.2,4,0],\"cubes\":[{\"origin\":[11.2,-24,-4],\"size\":[8,28,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,7]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,7]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,7]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,7]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_6\",\"parent\":\"body\",\"pivot\":[-15.2,4,20],\"cubes\":[{\"origin\":[-19.2,-28,16],\"size\":[8,32,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,8]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,8]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,8]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,8]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_7\",\"parent\":\"body\",\"pivot\":[5.2,4,20],\"cubes\":[{\"origin\":[1.2,-28,16],\"size\":[8,32,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,8]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,8]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,8]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,8]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]},{\"name\":\"tentacles_8\",\"parent\":\"body\",\"pivot\":[25.2,4,20],\"cubes\":[{\"origin\":[21.2,-16,16],\"size\":[8,20,8],\"uv\":{\"north\":{\"uv\":[2,2],\"uv_size\":[2,5]},\"east\":{\"uv\":[0,2],\"uv_size\":[2,5]},\"south\":{\"uv\":[6,2],\"uv_size\":[2,5]},\"west\":{\"uv\":[4,2],\"uv_size\":[2,5]},\"up\":{\"uv\":[2,0],\"uv_size\":[2,2]},\"down\":{\"uv\":[4,2],\"uv_size\":[2,-2]}}}]}]}]}'},1538:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,-3],\"cubes\":[{\"origin\":[-8,11,-7],\"size\":[16,14,26],\"inflate\":0.02,\"uv\":[1,1]},{\"origin\":[0,22,-10],\"size\":[0,10,19],\"inflate\":0.02,\"uv\":[90,33]}],\"locators\":{\"lead\":[0,20,-5]}},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,22,-5],\"rotation\":[50,0,0],\"cubes\":[{\"origin\":[-7,21,-24],\"size\":[14,6,19],\"uv\":[61,1]},{\"origin\":[-8,22,-19],\"size\":[2,11,2],\"uv\":[1,13]},{\"origin\":[6,22,-19],\"size\":[2,11,2],\"uv\":[1,13]}]},{\"name\":\"right_ear\",\"parent\":\"head\",\"pivot\":[-7,27,-7],\"rotation\":[0,0,-50],\"cubes\":[{\"origin\":[-13,26,-10],\"size\":[6,1,4],\"uv\":[1,1]}]},{\"name\":\"left_ear\",\"parent\":\"head\",\"pivot\":[7,27,-7],\"rotation\":[0,0,50],\"cubes\":[{\"origin\":[7,26,-10],\"size\":[6,1,4],\"uv\":[1,6]}]},{\"name\":\"leg_back_right\",\"pivot\":[6,8,17],\"cubes\":[{\"origin\":[-8,0,13],\"size\":[5,11,5],\"uv\":[21,45]}]},{\"name\":\"leg_back_left\",\"pivot\":[-6,8,17],\"cubes\":[{\"origin\":[3,0,13],\"size\":[5,11,5],\"uv\":[0,45]}]},{\"name\":\"leg_front_right\",\"pivot\":[-6,12,-3],\"cubes\":[{\"origin\":[-8,0,-6],\"size\":[6,14,6],\"uv\":[66,42]}]},{\"name\":\"leg_front_left\",\"pivot\":[6,12,-3],\"cubes\":[{\"origin\":[2,0,-6],\"size\":[6,14,6],\"uv\":[41,42]}]}]}]}'},2510:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"Body\",\"pivot\":[0,13,9],\"cubes\":[{\"origin\":[-5,11,-11],\"size\":[10,10,22],\"uv\":[0,32]}]},{\"name\":\"Tail\",\"parent\":\"Body\",\"pivot\":[0,20,11],\"rotation\":[25,0,0],\"cubes\":[{\"origin\":[-1.5,6,9],\"size\":[3,14,4],\"uv\":[42,36]}]},{\"name\":\"LegBL\",\"parent\":\"Body\",\"pivot\":[3,11,9],\"cubes\":[{\"origin\":[1,0,7],\"size\":[4,11,4],\"uv\":[48,21],\"mirror\":true}]},{\"name\":\"LegBR\",\"parent\":\"Body\",\"pivot\":[-3,11,9],\"cubes\":[{\"origin\":[-5,0,7],\"size\":[4,11,4],\"uv\":[48,21]}]},{\"name\":\"LegFL\",\"parent\":\"Body\",\"pivot\":[3,11,-9],\"cubes\":[{\"origin\":[1,0,-11],\"size\":[4,11,4],\"uv\":[48,21],\"mirror\":true}]},{\"name\":\"LegFR\",\"parent\":\"Body\",\"pivot\":[-3,11,-9],\"cubes\":[{\"origin\":[-5,0,-11],\"size\":[4,11,4],\"uv\":[48,21]}]},{\"name\":\"Neck\",\"parent\":\"Body\",\"pivot\":[0,17,-8],\"rotation\":[30,0,0],\"cubes\":[{\"origin\":[-2,16,-11],\"size\":[4,12,7],\"uv\":[0,35]}],\"locators\":{\"lead\":[0,17,-8]}},{\"name\":\"Head\",\"parent\":\"Neck\",\"pivot\":[0,28,-11],\"cubes\":[{\"origin\":[-3,28,-11],\"size\":[6,5,7],\"uv\":[0,13]}]},{\"name\":\"Muzzle\",\"parent\":\"Head\",\"pivot\":[0,28,-11],\"cubes\":[{\"origin\":[-2,28,-16],\"size\":[4,5,5],\"uv\":[0,25]}]},{\"name\":\"EarL\",\"parent\":\"Head\",\"pivot\":[0,17,-8],\"rotation\":[0,0,5],\"cubes\":[{\"origin\":[-0.5,32,-5.01],\"size\":[2,3,1],\"uv\":[19,16],\"mirror\":true}]},{\"name\":\"EarR\",\"parent\":\"Head\",\"pivot\":[0,17,-8],\"rotation\":[0,0,-5],\"cubes\":[{\"origin\":[-1.5,32,-5.01],\"size\":[2,3,1],\"uv\":[19,16]}]},{\"name\":\"MuleEarL\",\"parent\":\"Head\",\"pivot\":[0,17,-8],\"rotation\":[0,0,15],\"cubes\":[{\"origin\":[-3,32,-5.01],\"size\":[2,7,1],\"uv\":[0,12],\"mirror\":true}]},{\"name\":\"MuleEarR\",\"parent\":\"Head\",\"pivot\":[0,17,-8],\"rotation\":[0,0,-15],\"cubes\":[{\"origin\":[1,32,-5.01],\"size\":[2,7,1],\"uv\":[0,12]}]},{\"name\":\"ReinsL\",\"parent\":\"Head\",\"pivot\":[2,30.5,-13.5],\"rotation\":[-35,0,0],\"cubes\":[{\"origin\":[3.1,29,-13],\"size\":[0,3,16],\"uv\":[32,2]}]},{\"name\":\"ReinsR\",\"parent\":\"Head\",\"pivot\":[-3,30.5,-13.5],\"rotation\":[-35,0,0],\"cubes\":[{\"origin\":[-3.1,29,-13],\"size\":[0,3,16],\"uv\":[32,2]}]},{\"name\":\"Bridle\",\"parent\":\"Head\",\"pivot\":[0,17,-8],\"cubes\":[{\"origin\":[-2,28,-13],\"size\":[4,5,2],\"inflate\":0.25,\"uv\":[19,0]},{\"origin\":[-3,28,-11],\"size\":[6,5,7],\"inflate\":0.25,\"uv\":[0,0]}]},{\"name\":\"BitL\",\"parent\":\"Bridle\",\"pivot\":[0,17,-8],\"cubes\":[{\"origin\":[2,29,-14],\"size\":[1,2,2],\"uv\":[29,5]}]},{\"name\":\"BitR\",\"parent\":\"Bridle\",\"pivot\":[0,17,-8],\"cubes\":[{\"origin\":[-3,29,-14],\"size\":[1,2,2],\"uv\":[29,5]}]},{\"name\":\"Mane\",\"parent\":\"Neck\",\"pivot\":[0,17,-8],\"cubes\":[{\"origin\":[-1,17,-3.95],\"size\":[2,16,2],\"uv\":[56,36]}]},{\"name\":\"BagL\",\"parent\":\"Body\",\"pivot\":[5,21,11],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[6,13,11],\"size\":[8,8,3],\"uv\":[26,21],\"mirror\":true}]},{\"name\":\"BagR\",\"parent\":\"Body\",\"pivot\":[-5,21,11],\"rotation\":[0,-90,0],\"cubes\":[{\"origin\":[-14,13,11],\"size\":[8,8,3],\"uv\":[26,21]}]},{\"name\":\"Saddle\",\"parent\":\"Body\",\"pivot\":[0,22,2],\"cubes\":[{\"origin\":[-5,12,-3.5],\"size\":[10,9,9],\"inflate\":0.5,\"uv\":[26,0]}]}]}]}'},910:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-6,15,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[1.9,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}]}]}]}'},7010:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":128,\"visible_bounds_width\":3,\"visible_bounds_height\":4,\"visible_bounds_offset\":[0,2,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,31,0],\"cubes\":[{\"origin\":[-9,21,-6],\"size\":[18,12,11],\"uv\":[0,40]},{\"origin\":[-4.5,16,-3],\"size\":[9,5,6],\"inflate\":0.5,\"uv\":[0,70]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,31,-2],\"cubes\":[{\"origin\":[-4,33,-7.5],\"size\":[8,10,8],\"uv\":[0,0]},{\"origin\":[-1,32,-9.5],\"size\":[2,4,2],\"uv\":[24,0]}],\"locators\":{\"lead\":[0,31,-2]}},{\"name\":\"arm0\",\"parent\":\"body\",\"pivot\":[0,31,0],\"cubes\":[{\"origin\":[-13,3.5,-3],\"size\":[4,30,6],\"uv\":[60,21]}]},{\"name\":\"arm1\",\"parent\":\"body\",\"pivot\":[0,31,0],\"cubes\":[{\"origin\":[9,3.5,-3],\"size\":[4,30,6],\"uv\":[60,58]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-4,13,0],\"cubes\":[{\"origin\":[-7.5,0,-3],\"size\":[6,16,5],\"uv\":[37,0]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[5,13,0],\"mirror\":true,\"cubes\":[{\"origin\":[1.5,0,-3],\"size\":[6,16,5],\"uv\":[60,0]}]}]}]}'},4010:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3.25,\"visible_bounds_offset\":[0,1.375,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,2],\"cubes\":[{\"origin\":[-6,11,-5],\"size\":[12,18,10],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[29,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,17,-6],\"cubes\":[{\"origin\":[-2,27,-16],\"size\":[4,4,9],\"uv\":[0,0]},{\"origin\":[-4,15,-12],\"size\":[8,18,6],\"uv\":[0,14]},{\"origin\":[-4,33,-10],\"size\":[3,3,2],\"uv\":[17,0]},{\"origin\":[1,33,-10],\"size\":[3,3,2],\"uv\":[17,0]}],\"locators\":{\"lead\":[0,18,-11]}},{\"name\":\"chest1\",\"parent\":\"body\",\"pivot\":[-8.5,21,3],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[-11.5,13,3],\"size\":[8,8,3],\"uv\":[45,28]}]},{\"name\":\"chest2\",\"parent\":\"body\",\"pivot\":[5.5,21,3],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[2.5,13,3],\"size\":[8,8,3],\"uv\":[45,41]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-3.5,14,6],\"cubes\":[{\"origin\":[-5.5,0,4],\"size\":[4,14,4],\"uv\":[29,29]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[3.5,14,6],\"cubes\":[{\"origin\":[1.5,0,4],\"size\":[4,14,4],\"uv\":[29,29]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-3.5,14,-5],\"cubes\":[{\"origin\":[-5.5,0,-7],\"size\":[4,14,4],\"uv\":[29,29]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[3.5,14,-5],\"cubes\":[{\"origin\":[1.5,0,-7],\"size\":[4,14,4],\"uv\":[29,29]}]}]}]}'},5580:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2.5,\"visible_bounds_height\":5,\"visible_bounds_offset\":[0,2.5,0]},\"bones\":[{\"name\":\"insideCube\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-2,2,-2],\"size\":[4,4,4],\"uv\":[0,16]}]},{\"name\":\"bodyCube_0\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,7,-4],\"size\":[8,1,8],\"uv\":[0,0]}]},{\"name\":\"bodyCube_1\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,6,-4],\"size\":[8,1,8],\"uv\":[0,1]}]},{\"name\":\"bodyCube_2\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,5,-4],\"size\":[8,1,8],\"uv\":[24,10]}]},{\"name\":\"bodyCube_3\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,4,-4],\"size\":[8,1,8],\"uv\":[24,19]}]},{\"name\":\"bodyCube_4\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,3,-4],\"size\":[8,1,8],\"uv\":[0,4]}]},{\"name\":\"bodyCube_5\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,2,-4],\"size\":[8,1,8],\"uv\":[0,5]}]},{\"name\":\"bodyCube_6\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,1,-4],\"size\":[8,1,8],\"uv\":[0,6]}]},{\"name\":\"bodyCube_7\",\"parent\":\"insideCube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,0,-4],\"size\":[8,1,8],\"uv\":[0,7]}]}]}]}'},1566:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,2],\"cubes\":[{\"origin\":[-6,11,-5],\"size\":[12,18,10],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[18,4]},{\"origin\":[-2,11,-6],\"size\":[4,6,1],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[52,0]}]},{\"name\":\"mushroom1\",\"parent\":\"body\",\"pivot\":[2.5,22,8.5],\"cubes\":[{\"origin\":[-1.5,22,8.5],\"size\":[8,7,0],\"uv\":[0,33]},{\"origin\":[-1.5,22,8.5],\"size\":[8,7,0],\"pivot\":[2.5,22,8.5],\"rotation\":[0,90,0],\"uv\":[0,33]}]},{\"name\":\"mushroom2\",\"parent\":\"body\",\"pivot\":[-3,22,0],\"rotation\":[0,45,0],\"cubes\":[{\"origin\":[-7,22,0],\"size\":[8,7,0],\"uv\":[0,33]},{\"origin\":[-7,22,0],\"size\":[8,7,0],\"pivot\":[-3,22,0],\"rotation\":[0,90,0],\"uv\":[0,33]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-4,12,7],\"cubes\":[{\"origin\":[-6,0,5],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[4,12,7],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,5],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-4,12,-6],\"cubes\":[{\"origin\":[-6,0,-7],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[4,12,-6],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,-7],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"head\",\"pivot\":[0,20,-8],\"cubes\":[{\"origin\":[-4,16,-14],\"size\":[8,8,6],\"uv\":[0,0]},{\"origin\":[-5,22,-12],\"size\":[1,3,1],\"uv\":[22,0]},{\"origin\":[4,22,-12],\"size\":[1,3,1],\"uv\":[22,0]}],\"locators\":{\"lead\":[0,20,-8]}},{\"name\":\"mushroom3\",\"parent\":\"head\",\"pivot\":[0,24,-11.25],\"rotation\":[0,-40,0],\"cubes\":[{\"origin\":[-4,24,-11.25],\"size\":[8,7,0],\"uv\":[0,33]},{\"origin\":[-4,24,-11.25],\"size\":[8,7,0],\"pivot\":[0,24,-11.25],\"rotation\":[0,90,0],\"uv\":[0,33]}]}]}]}'},4784:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.npc\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"cubes\":[{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"arms\",\"parent\":\"body\",\"pivot\":[0,21,-1],\"rotation\":[-42.97,0,0],\"cubes\":[{\"origin\":[-4,15,-3],\"size\":[8,4,4],\"uv\":[40,38]},{\"origin\":[-8,15,-3],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[4,15,-3],\"size\":[4,8,4],\"uv\":[44,46]}]},{\"name\":\"leg0\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leg1\",\"pivot\":[2,12,0],\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]}]}]}'},7615:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":4,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,7,1],\"cubes\":[{\"origin\":[-2,-1,-2],\"size\":[4,16,6],\"pivot\":[0,7,1],\"rotation\":[90,0,0],\"uv\":[20,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,9,-9],\"cubes\":[{\"origin\":[-2.5,7,-12],\"size\":[5,4,5],\"uv\":[0,0]},{\"origin\":[-1.5,7.01562,-13],\"size\":[3,2,2],\"uv\":[0,24]},{\"origin\":[-2,11,-9],\"size\":[1,1,2],\"uv\":[0,10]},{\"origin\":[1,11,-9],\"size\":[1,1,2],\"uv\":[6,10]}],\"locators\":{\"lead\":[0,9,-9]}},{\"name\":\"tail1\",\"parent\":\"body\",\"pivot\":[0,9,8],\"cubes\":[{\"origin\":[-0.5,1,8],\"size\":[1,8,1],\"pivot\":[0,9,8],\"rotation\":[52.5,0,0],\"uv\":[0,15]}]},{\"name\":\"tail2\",\"parent\":\"tail1\",\"pivot\":[0,4.125,14.35],\"cubes\":[{\"origin\":[-0.5,-3.875,14.35],\"size\":[1,8,1],\"pivot\":[0,4.125,14.35],\"rotation\":[90,0,0],\"uv\":[4,15]}]},{\"name\":\"backLegL\",\"parent\":\"body\",\"pivot\":[1.1,6,7],\"cubes\":[{\"origin\":[0.1,0,6],\"size\":[2,6,2],\"uv\":[8,13]}]},{\"name\":\"backLegR\",\"parent\":\"body\",\"pivot\":[-1.1,6,7],\"cubes\":[{\"origin\":[-2.1,0,6],\"size\":[2,6,2],\"uv\":[8,13]}]},{\"name\":\"frontLegL\",\"parent\":\"body\",\"pivot\":[1.2,10,-4],\"cubes\":[{\"origin\":[0.2,0.2,-5],\"size\":[2,10,2],\"uv\":[40,0]}]},{\"name\":\"frontLegR\",\"parent\":\"body\",\"pivot\":[-1.2,10,-4],\"cubes\":[{\"origin\":[-2.2,0.2,-5],\"size\":[2,10,2],\"uv\":[40,0]}]}]}]}'},3783:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,14,0],\"cubes\":[{\"origin\":[-9.5,1,-6.5],\"size\":[19,26,13],\"pivot\":[0,14,0],\"rotation\":[90,0,0],\"uv\":[0,25]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,12.5,-17],\"cubes\":[{\"origin\":[-6.5,7.5,-21],\"size\":[13,10,9],\"uv\":[0,6]},{\"origin\":[-3.5,7.5,-23],\"size\":[7,5,2],\"uv\":[45,16]},{\"origin\":[-8.5,16.5,-18],\"size\":[5,4,1],\"uv\":[52,25]},{\"origin\":[3.5,16.5,-18],\"size\":[5,4,1],\"uv\":[52,25]}],\"locators\":{\"lead\":[0,14,-16]}},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-5.5,9,9],\"cubes\":[{\"origin\":[-8.5,0,6],\"size\":[6,9,6],\"uv\":[40,0]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[5.5,9,9],\"cubes\":[{\"origin\":[2.5,0,6],\"size\":[6,9,6],\"uv\":[40,0]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-5.5,9,-9],\"cubes\":[{\"origin\":[-8.5,0,-12],\"size\":[6,9,6],\"uv\":[40,0]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[5.5,9,-9],\"cubes\":[{\"origin\":[2.5,0,-12],\"size\":[6,9,6],\"uv\":[40,0]}]}]}]}'},2735:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,7.5,-3],\"rotation\":[25,0,0],\"cubes\":[{\"origin\":[-1.5,1.5,-4.5],\"size\":[3,6,3],\"uv\":[2,8]}]},{\"name\":\"wing0\",\"parent\":\"body\",\"pivot\":[1.5,7.1,-2.8],\"rotation\":[-10,180,0],\"cubes\":[{\"origin\":[1,2.1,-4.3],\"size\":[1,5,3],\"uv\":[19,8]}]},{\"name\":\"wing1\",\"parent\":\"body\",\"pivot\":[-1.5,7.1,-2.8],\"rotation\":[-10,180,0],\"cubes\":[{\"origin\":[-2,2.1,-4.3],\"size\":[1,5,3],\"uv\":[19,8]}]},{\"name\":\"head\",\"pivot\":[0,8.3,-2.8],\"cubes\":[{\"origin\":[-1,6.8,-3.8],\"size\":[2,3,2],\"uv\":[2,2]},{\"origin\":[-1,9.8,-5.8],\"size\":[2,1,4],\"uv\":[10,0]},{\"origin\":[-0.5,7.8,-4.7],\"size\":[1,2,1],\"uv\":[11,7]},{\"origin\":[-0.5,8.1,-5.7],\"size\":[1,1.7,1],\"uv\":[16,7]},{\"origin\":[0,9.1,-4.9],\"size\":[0,5,4],\"uv\":[2,18]}]},{\"name\":\"tail\",\"pivot\":[0,2.9,1.2],\"rotation\":[50,0,0],\"cubes\":[{\"origin\":[-1.5,-0.1,0.2],\"size\":[3,4,1],\"uv\":[22,1]}]},{\"name\":\"leg0\",\"pivot\":[1.5,1.5,-0.5],\"cubes\":[{\"origin\":[0.5,0,-1.5],\"size\":[1,2,1],\"uv\":[14,18]}]},{\"name\":\"leg1\",\"pivot\":[-0.5,1.5,-0.5],\"cubes\":[{\"origin\":[-1.5,0,-1.5],\"size\":[1,2,1],\"uv\":[14,18]}]}]}]}'},7582:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-3,23,-8],\"size\":[5,3,9],\"uv\":[0,8]}]},{\"name\":\"wing0\",\"parent\":\"body\",\"pivot\":[2,26,-8],\"rotation\":[0,0,5.7],\"cubes\":[{\"origin\":[2,24,-8],\"size\":[6,2,9],\"uv\":[23,12]}]},{\"name\":\"wingtip0\",\"parent\":\"wing0\",\"pivot\":[8,26,-8],\"rotation\":[0,0,5.7],\"cubes\":[{\"origin\":[8,25,-8],\"size\":[13,1,9],\"uv\":[16,24]}],\"locators\":{\"left_wing\":[21,26,0]}},{\"name\":\"wing1\",\"parent\":\"body\",\"pivot\":[-3,26,-8],\"rotation\":[0,0,-5.7],\"mirror\":true,\"cubes\":[{\"origin\":[-9,24,-8],\"size\":[6,2,9],\"uv\":[23,12]}]},{\"name\":\"wingtip1\",\"parent\":\"wing1\",\"pivot\":[-9,26,-8],\"rotation\":[0,0,-5.7],\"mirror\":true,\"cubes\":[{\"origin\":[-22,25,-8],\"size\":[13,1,9],\"uv\":[16,24]}],\"locators\":{\"right_wing\":[-22,24,0]}},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,23,-7],\"rotation\":[11.5,0,0],\"cubes\":[{\"origin\":[-4,22,-12],\"size\":[7,3,5],\"uv\":[0,0]}]},{\"name\":\"tail\",\"parent\":\"body\",\"pivot\":[0,26,1],\"cubes\":[{\"origin\":[-2,24,1],\"size\":[3,2,6],\"uv\":[3,20]}]},{\"name\":\"tailtip\",\"parent\":\"tail\",\"pivot\":[0,25.5,7],\"cubes\":[{\"origin\":[-1,24.5,7],\"size\":[1,1,6],\"uv\":[4,29]}]}]}]}'},4891:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2.25,\"visible_bounds_offset\":[0,0.875,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,13,2],\"cubes\":[{\"origin\":[-5,7,-5],\"size\":[10,16,8],\"pivot\":[0,13,2],\"rotation\":[90,0,0],\"uv\":[28,8]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,12,-6],\"cubes\":[{\"origin\":[-4,8,-14],\"size\":[8,8,8],\"uv\":[0,0]},{\"origin\":[-2,9,-15],\"size\":[4,3,1],\"uv\":[16,16]}],\"locators\":{\"lead\":[0,14,-6]}},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-3,6,7],\"cubes\":[{\"origin\":[-5,0,5],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[3,6,7],\"mirror\":true,\"cubes\":[{\"origin\":[1,0,5],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-3,6,-5],\"cubes\":[{\"origin\":[-5,0,-7],\"size\":[4,6,4],\"uv\":[0,16]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[3,6,-5],\"mirror\":true,\"cubes\":[{\"origin\":[1,0,-7],\"size\":[4,6,4],\"uv\":[0,16]}]}]}]}'},5264:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]},{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,32],\"inflate\":0.25}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-5,24,-4],\"size\":[10,8,8],\"uv\":[0,0],\"inflate\":-0.02},{\"origin\":[-2,24,-5],\"size\":[4,4,1],\"uv\":[31,1]},{\"origin\":[2,24,-5],\"size\":[1,2,1],\"uv\":[2,4]},{\"origin\":[-3,24,-5],\"size\":[1,2,1],\"uv\":[2,0]}],\"inflate\":-0.02},{\"name\":\"leftear\",\"parent\":\"head\",\"pivot\":[5,30,0],\"rotation\":[0,0,-30],\"cubes\":[{\"origin\":[4,25,-2],\"size\":[1,5,4],\"uv\":[51,6]}]},{\"name\":\"rightear\",\"parent\":\"head\",\"pivot\":[-5,30,0],\"rotation\":[0,0,30],\"cubes\":[{\"origin\":[-5,25,-2],\"size\":[1,5,4],\"uv\":[39,6]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0]},{\"name\":\"rightarm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]},{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,32],\"inflate\":0.25}]},{\"name\":\"rightItem\",\"parent\":\"rightarm\",\"pivot\":[-6,15,1]},{\"name\":\"leftarm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[32,48]},{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[48,48],\"inflate\":0.25}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6.0,15.0,1.0]},{\"name\":\"rightleg\",\"parent\":\"body\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,32],\"inflate\":0.25}]},{\"name\":\"leftleg\",\"parent\":\"body\",\"pivot\":[1.9,12,0],\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[16,48]},{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,48],\"inflate\":0.25}]}]}]}'},9271:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}],\"locators\":{\"lead\":[0,0,0]}},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"cubes\":[{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[2,12,0],\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"rightarm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}]},{\"name\":\"rightItem\",\"pivot\":[-6,15,1],\"parent\":\"rightArm\"},{\"name\":\"leftarm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}]},{\"name\":\"leftItem\",\"pivot\":[6.0,15.0,1.0],\"parent\":\"leftArm\"}]}]}'},952:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[-2,15,12],\"cubes\":[{\"origin\":[-7,14,5],\"size\":[14,14,11],\"pivot\":[0,15,12],\"rotation\":[90,0,0],\"uv\":[0,19]},{\"origin\":[-6,28,5],\"size\":[12,12,10],\"pivot\":[0,15,12],\"rotation\":[90,0,0],\"uv\":[39,0]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,14,-16],\"mirror\":true,\"cubes\":[{\"origin\":[-3.5,10,-19],\"size\":[7,7,7],\"uv\":[0,0],\"mirror\":false},{\"origin\":[-2.5,10,-22],\"size\":[5,3,3],\"uv\":[0,44],\"mirror\":false},{\"origin\":[-4.5,16,-17],\"size\":[2,2,1],\"uv\":[26,0],\"mirror\":false},{\"origin\":[2.5,16,-17],\"size\":[2,2,1],\"uv\":[26,0]}],\"locators\":{\"lead\":[0,14,-16]}},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-4.5,10,6],\"cubes\":[{\"origin\":[-6.5,0,4],\"size\":[4,10,8],\"uv\":[50,22]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[4.5,10,6],\"cubes\":[{\"origin\":[2.5,0,4],\"size\":[4,10,8],\"uv\":[50,22]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-3.5,10,-8],\"cubes\":[{\"origin\":[-5.5,0,-10],\"size\":[4,10,6],\"uv\":[50,40]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[3.5,10,-8],\"cubes\":[{\"origin\":[1.5,0,-10],\"size\":[4,10,6],\"uv\":[50,40]}]}]}]}'},7775:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"rearFootLeft\",\"pivot\":[3,6.5,3.7],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,0],\"size\":[2,1,7],\"uv\":[8,24]}]},{\"name\":\"rearFootRight\",\"pivot\":[-3,6.5,3.7],\"mirror\":true,\"cubes\":[{\"origin\":[-4,0,0],\"size\":[2,1,7],\"uv\":[26,24]}]},{\"name\":\"haunchLeft\",\"pivot\":[3,6.5,3.7],\"rotation\":[-20,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[2,2.5,3.7],\"size\":[2,4,5],\"uv\":[16,15]}]},{\"name\":\"haunchRight\",\"pivot\":[-3,6.5,3.7],\"rotation\":[-20,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,2.5,3.7],\"size\":[2,4,5],\"uv\":[30,15]}]},{\"name\":\"body\",\"pivot\":[0,5,8],\"rotation\":[-20,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-3,2,-2],\"size\":[6,5,10],\"uv\":[0,0]}]},{\"name\":\"frontLegLeft\",\"pivot\":[3,7,-1],\"rotation\":[-10,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[2,0,-2],\"size\":[2,7,2],\"uv\":[8,15]}]},{\"name\":\"frontLegRight\",\"pivot\":[-3,7,-1],\"rotation\":[-10,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[2,7,2],\"uv\":[0,15]}]},{\"name\":\"head\",\"pivot\":[0,8,-1],\"mirror\":true,\"cubes\":[{\"origin\":[-2.5,8,-6],\"size\":[5,4,5],\"uv\":[32,0]}],\"locators\":{\"lead\":[0,8,-1]}},{\"name\":\"earRight\",\"parent\":\"head\",\"pivot\":[0,8,-1],\"rotation\":[0,-15,0],\"mirror\":true,\"cubes\":[{\"origin\":[-2.5,12,-2],\"size\":[2,5,1],\"uv\":[58,0]}]},{\"name\":\"earLeft\",\"parent\":\"head\",\"pivot\":[0,8,-1],\"rotation\":[0,15,0],\"mirror\":true,\"cubes\":[{\"origin\":[0.5,12,-2],\"size\":[2,5,1],\"uv\":[52,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,8,-1],\"mirror\":true,\"cubes\":[{\"origin\":[-0.5,9.5,-6.5],\"size\":[1,1,1],\"uv\":[32,9]}]},{\"name\":\"tail\",\"pivot\":[0,4,7],\"rotation\":[-20,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-1.5,2.5,7],\"size\":[3,3,2],\"uv\":[52,6]}]}]}]}'},5069:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":128,\"visible_bounds_width\":5,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"cubes\":[{\"origin\":[-7,10,-2],\"size\":[14,16,20],\"uv\":[0,55]},{\"origin\":[-6,-3,-2],\"size\":[12,13,18],\"uv\":[0,91]}]},{\"name\":\"neck\",\"pivot\":[0,20,-20],\"cubes\":[{\"origin\":[-5,21,-10],\"size\":[10,10,18],\"uv\":[68,73]}]},{\"name\":\"head\",\"parent\":\"neck\",\"pivot\":[0,28,-10],\"cubes\":[{\"origin\":[-8,14,-24],\"size\":[16,20,16],\"uv\":[0,0]},{\"origin\":[-2,12,-28],\"size\":[4,8,4],\"uv\":[0,0]}],\"locators\":{\"stun\":[0,32,-15]}},{\"name\":\"mouth\",\"parent\":\"head\",\"pivot\":[0,15,-10],\"cubes\":[{\"origin\":[-8,13,-24],\"size\":[16,3,16],\"uv\":[0,36]}]},{\"name\":\"horns\",\"parent\":\"head\",\"pivot\":[-5,27,-19],\"rotation\":[60,0,0],\"cubes\":[{\"origin\":[-10,27,-20],\"size\":[2,14,4],\"uv\":[74,55]},{\"origin\":[8,27,-20],\"size\":[2,14,4],\"uv\":[74,55]}]},{\"name\":\"leg0\",\"pivot\":[-12,30,22],\"cubes\":[{\"origin\":[-12,0,17],\"size\":[8,37,8],\"uv\":[96,0]}]},{\"name\":\"leg1\",\"pivot\":[4,30,22],\"cubes\":[{\"origin\":[4,0,17],\"size\":[8,37,8],\"uv\":[96,0]}]},{\"name\":\"leg2\",\"pivot\":[-4,26,-4],\"cubes\":[{\"origin\":[-12,0,-8],\"size\":[8,37,8],\"uv\":[64,0]}]},{\"name\":\"leg3\",\"pivot\":[-4,26,-4],\"cubes\":[{\"origin\":[4,0,-8],\"size\":[8,37,8],\"uv\":[64,0]}]}]}]}'},9597:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":4,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"body_front\",\"pivot\":[0,0,-4],\"cubes\":[{\"origin\":[-1.5,3.5,-4],\"size\":[3,5,8],\"uv\":[0,0]}]},{\"name\":\"body_back\",\"parent\":\"body_front\",\"pivot\":[0,0,4],\"cubes\":[{\"origin\":[-1.5,3.5,4],\"size\":[3,5,8],\"uv\":[0,13]}]},{\"name\":\"dorsal_back\",\"parent\":\"body_back\",\"pivot\":[0,5,4],\"cubes\":[{\"origin\":[0,8.5,4],\"size\":[0,2,3],\"uv\":[2,3]}]},{\"name\":\"tailfin\",\"parent\":\"body_back\",\"pivot\":[0,0,12],\"cubes\":[{\"origin\":[0,3.5,12],\"size\":[0,5,6],\"uv\":[20,10]}]},{\"name\":\"dorsal_front\",\"parent\":\"body_front\",\"pivot\":[0,5,2],\"cubes\":[{\"origin\":[0,8.5,2],\"size\":[0,2,2],\"uv\":[4,2]}]},{\"name\":\"head\",\"parent\":\"body_front\",\"pivot\":[0,3,-4],\"cubes\":[{\"origin\":[-1,4.5,-7],\"size\":[2,4,3],\"uv\":[22,0]}],\"locators\":{\"lead\":[0,3,-4]}},{\"name\":\"leftFin\",\"parent\":\"body_front\",\"pivot\":[1.5,1,-4],\"rotation\":[0,0,35],\"cubes\":[{\"origin\":[-0.50752,3.86703,-4],\"size\":[2,0,2],\"uv\":[2,0]}]},{\"name\":\"rightFin\",\"parent\":\"body_front\",\"pivot\":[-1.5,1,-4],\"rotation\":[0,0,-35],\"cubes\":[{\"origin\":[-1.49258,3.86703,-4],\"size\":[2,0,2],\"uv\":[-2,0]}]}]}]}'},9880:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":2.375,\"visible_bounds_offset\":[0,0.8125,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,19,2],\"cubes\":[{\"origin\":[-4,13,-5],\"size\":[8,16,6],\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[28,8]},{\"origin\":[-4,13,-5],\"size\":[8,16,6],\"inflate\":1.75,\"pivot\":[0,19,2],\"rotation\":[90,0,0],\"uv\":[28,40]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-3,12,7],\"cubes\":[{\"origin\":[-5,0,5],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[-5,6,5],\"size\":[4,6,4],\"inflate\":0.5,\"uv\":[0,48]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[3,12,7],\"cubes\":[{\"origin\":[1,0,5],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[1,6,5],\"size\":[4,6,4],\"inflate\":0.5,\"uv\":[0,48]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-3,12,-5],\"cubes\":[{\"origin\":[-5,0,-7],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[-5,6,-7],\"size\":[4,6,4],\"inflate\":0.5,\"uv\":[0,48]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[3,12,-5],\"cubes\":[{\"origin\":[1,0,-7],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[1,6,-7],\"size\":[4,6,4],\"inflate\":0.5,\"uv\":[0,48]}]},{\"name\":\"head\",\"pivot\":[0,18,-8],\"cubes\":[{\"origin\":[-3,16,-14],\"size\":[6,6,8],\"uv\":[0,0]},{\"origin\":[-3,16,-12],\"size\":[6,6,6],\"inflate\":0.6,\"uv\":[0,32]}],\"locators\":{\"lead\":[0,18,-8]}}]}]}'},8575:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,0.5,0]},\"bones\":[{\"name\":\"base\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,0,-8],\"size\":[16,8,16],\"uv\":[0,28]}]},{\"name\":\"lid\",\"parent\":\"base\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-8,4,-8],\"size\":[16,12,16],\"uv\":[0,0]}]},{\"name\":\"head\",\"parent\":\"base\",\"pivot\":[0,12,0],\"cubes\":[{\"origin\":[-3,6,-3],\"size\":[6,6,6],\"uv\":[0,52]}]}]}]}'},7920:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":1,\"visible_bounds_offset\":[0,0.5,0]},\"bones\":[{\"name\":\"bodyPart_2\",\"pivot\":[0,4,1],\"cubes\":[{\"origin\":[-3,0,-0.5],\"size\":[6,4,3],\"uv\":[0,9]}]},{\"name\":\"bodyPart_0\",\"parent\":\"bodyPart_2\",\"pivot\":[0,2,-3.5],\"cubes\":[{\"origin\":[-1.5,0,-4.5],\"size\":[3,2,2],\"uv\":[0,0]}]},{\"name\":\"bodyPart_1\",\"parent\":\"bodyPart_2\",\"pivot\":[0,3,-1.5],\"cubes\":[{\"origin\":[-2,0,-2.5],\"size\":[4,3,2],\"uv\":[0,4]}]},{\"name\":\"bodyLayer_2\",\"parent\":\"bodyPart_1\",\"pivot\":[0,5,-1.5],\"cubes\":[{\"origin\":[-3,0,-3],\"size\":[6,5,2],\"uv\":[20,18]}]},{\"name\":\"bodyPart_3\",\"parent\":\"bodyPart_2\",\"pivot\":[0,3,4],\"cubes\":[{\"origin\":[-1.5,0,2.5],\"size\":[3,3,3],\"uv\":[0,16]}]},{\"name\":\"bodyPart_4\",\"parent\":\"bodyPart_2\",\"pivot\":[0,2,7],\"cubes\":[{\"origin\":[-1,0,5.5],\"size\":[2,2,3],\"uv\":[0,22]}]},{\"name\":\"bodyLayer_1\",\"parent\":\"bodyPart_4\",\"pivot\":[0,4,7],\"cubes\":[{\"origin\":[-3,0,5.5],\"size\":[6,4,3],\"uv\":[20,11]}]},{\"name\":\"bodyPart_5\",\"parent\":\"bodyPart_2\",\"pivot\":[0,1,9.5],\"cubes\":[{\"origin\":[-1,0,8.5],\"size\":[2,1,2],\"uv\":[11,0]}]},{\"name\":\"bodyPart_6\",\"parent\":\"bodyPart_2\",\"pivot\":[0,1,11.5],\"cubes\":[{\"origin\":[-0.5,0,10.5],\"size\":[1,1,2],\"uv\":[13,4]}]},{\"name\":\"bodyLayer_0\",\"parent\":\"bodyPart_2\",\"pivot\":[0,8,1],\"cubes\":[{\"origin\":[-5,0,-0.5],\"size\":[10,8,3],\"uv\":[20,0]}]}]}]}'},9872:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-6,12,-1],\"size\":[2,12,2],\"uv\":[40,16]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-6,15,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-1],\"size\":[2,12,2],\"uv\":[40,16]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-3,0,-1],\"size\":[2,12,2],\"uv\":[0,16]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[1,0,-1],\"size\":[2,12,2],\"uv\":[0,16]}]}]}]}'},3255:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":5,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"cube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-3,1,-3],\"size\":[6,6,6],\"uv\":[0,16]},{\"origin\":[-4,0,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"eye0\",\"parent\":\"cube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-3.3,4,-3.5],\"size\":[2,2,2],\"uv\":[32,0]}]},{\"name\":\"eye1\",\"parent\":\"cube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[1.3,4,-3.5],\"size\":[2,2,2],\"uv\":[32,4]}]},{\"name\":\"mouth\",\"parent\":\"cube\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[0,2,-3.5],\"size\":[1,1,1],\"uv\":[32,8]}]}]}]}'},9520:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":192,\"texture_height\":192,\"visible_bounds_width\":4,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"bone\",\"pivot\":[0,19,0]},{\"name\":\"body\",\"parent\":\"bone\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-12.5,9,-20],\"size\":[25,24,40],\"inflate\":0.5,\"uv\":[62,0]},{\"origin\":[-12.5,4,-20],\"size\":[25,29,40],\"uv\":[62,68]},{\"origin\":[-12.5,8,-20],\"size\":[25,0,40],\"uv\":[87,68]}],\"locators\":{\"lead\":[0,13,-19]}},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,13.5,-19.4],\"cubes\":[{\"origin\":[-6.5,3,-30.9],\"size\":[13,18,11],\"uv\":[8,15]},{\"origin\":[-6.5,6,-30.9],\"size\":[13,0,11],\"uv\":[8,4]}]},{\"name\":\"left_ear\",\"parent\":\"head\",\"pivot\":[6.4,21,-23.9],\"cubes\":[{\"origin\":[6.4,2,-26.9],\"size\":[1,19,7],\"uv\":[2,0]}]},{\"name\":\"right_ear\",\"parent\":\"head\",\"pivot\":[-6.4,21,-23.9],\"cubes\":[{\"origin\":[-7.4,2,-26.9],\"size\":[1,19,7],\"uv\":[48,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,18,-30.9],\"cubes\":[{\"origin\":[-6.5,18,-39.9],\"size\":[13,2,9],\"uv\":[10,45]}]},{\"name\":\"lower_beak\",\"parent\":\"head\",\"pivot\":[0,11,-31.9],\"cubes\":[{\"origin\":[-6.5,6,-39.9],\"size\":[13,12,9],\"uv\":[10,57]}]},{\"name\":\"right_front_leg\",\"parent\":\"bone\",\"pivot\":[-7.5,9,-15],\"cubes\":[{\"origin\":[-11,0,-19],\"size\":[7,10,8],\"uv\":[32,87]}]},{\"name\":\"right_mid_leg\",\"parent\":\"bone\",\"pivot\":[-7.5,9,0],\"cubes\":[{\"origin\":[-11,0,-4],\"size\":[7,10,8],\"uv\":[32,105]}]},{\"name\":\"right_hind_leg\",\"parent\":\"bone\",\"pivot\":[-7.5,9,15],\"cubes\":[{\"origin\":[-11,0,11],\"size\":[7,10,8],\"uv\":[32,123]}]},{\"name\":\"left_front_leg\",\"parent\":\"bone\",\"pivot\":[7.5,9,-15],\"cubes\":[{\"origin\":[4,0,-19],\"size\":[7,10,8],\"uv\":[0,87]}]},{\"name\":\"left_mid_leg\",\"parent\":\"bone\",\"pivot\":[7.5,9,0],\"cubes\":[{\"origin\":[4,0,-4],\"size\":[7,10,8],\"uv\":[0,105]}]},{\"name\":\"left_hind_leg\",\"parent\":\"bone\",\"pivot\":[7.5,9,15],\"cubes\":[{\"origin\":[4,0,11],\"size\":[7,10,8],\"uv\":[0,123]}]}]}]}'},6615:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":5,\"visible_bounds_height\":4,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"piece2\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-6,0,-6],\"size\":[12,12,12],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[12,48],\"uv_size\":[12,12]},\"east\":{\"uv\":[0,48],\"uv_size\":[12,12]},\"south\":{\"uv\":[36,48],\"uv_size\":[12,12]},\"west\":{\"uv\":[24,48],\"uv_size\":[12,12]},\"up\":{\"uv\":[12,36],\"uv_size\":[12,12]},\"down\":{\"uv\":[24,48],\"uv_size\":[12,-12]}}}]},{\"name\":\"piece1\",\"parent\":\"piece2\",\"pivot\":[0,11,0],\"cubes\":[{\"origin\":[-5,11,-5],\"size\":[10,10,10],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[10,26],\"uv_size\":[10,10]},\"east\":{\"uv\":[0,26],\"uv_size\":[10,10]},\"south\":{\"uv\":[30,26],\"uv_size\":[10,10]},\"west\":{\"uv\":[20,26],\"uv_size\":[10,10]},\"up\":{\"uv\":[10,16],\"uv_size\":[10,10]},\"down\":{\"uv\":[20,26],\"uv_size\":[10,-10]}}}]},{\"name\":\"head\",\"parent\":\"piece1\",\"pivot\":[0,20,0],\"cubes\":[{\"origin\":[-4,20,-4],\"size\":[8,8,8],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[8,8],\"uv_size\":[8,8]},\"east\":{\"uv\":[0,8],\"uv_size\":[8,8]},\"south\":{\"uv\":[24,8],\"uv_size\":[8,8]},\"west\":{\"uv\":[16,8],\"uv_size\":[8,8]},\"up\":{\"uv\":[8,0],\"uv_size\":[8,8]},\"down\":{\"uv\":[16,8],\"uv_size\":[8,-8]}}}],\"locators\":{\"lead\":[0,20,0]}},{\"name\":\"pumpkin\",\"parent\":\"head\",\"pivot\":[0,25.5,0],\"cubes\":[{\"origin\":[-8,17.5,-8],\"size\":[16,16,16],\"inflate\":-3,\"uv\":{\"north\":{\"uv\":[48,48],\"uv_size\":[16,16]},\"east\":{\"uv\":[48,32],\"uv_size\":[16,16]},\"south\":{\"uv\":[48,32],\"uv_size\":[16,16]},\"west\":{\"uv\":[48,32],\"uv_size\":[16,16]},\"up\":{\"uv\":[64,32],\"uv_size\":[-16,-16]},\"down\":{\"uv\":[64,32],\"uv_size\":[-16,-16]}}}]},{\"name\":\"arm1\",\"parent\":\"piece1\",\"pivot\":[0,18,0],\"rotation\":[0,0,57.3],\"cubes\":[{\"origin\":[1,20,-1],\"size\":[12,2,2],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[34,2],\"uv_size\":[12,2]},\"east\":{\"uv\":[32,2],\"uv_size\":[2,2]},\"south\":{\"uv\":[48,2],\"uv_size\":[12,2]},\"west\":{\"uv\":[46,2],\"uv_size\":[2,2]},\"up\":{\"uv\":[34,0],\"uv_size\":[12,2]},\"down\":{\"uv\":[46,2],\"uv_size\":[12,-2]}}}]},{\"name\":\"arm2\",\"parent\":\"piece1\",\"pivot\":[0,18,0],\"rotation\":[0,0,-57.3],\"cubes\":[{\"origin\":[-13,20,-1],\"size\":[12,2,2],\"inflate\":-0.5,\"uv\":{\"north\":{\"uv\":[46,2],\"uv_size\":[-12,2]},\"east\":{\"uv\":[48,2],\"uv_size\":[-2,2]},\"south\":{\"uv\":[60,2],\"uv_size\":[-12,2]},\"west\":{\"uv\":[34,2],\"uv_size\":[-2,2]},\"up\":{\"uv\":[46,0],\"uv_size\":[-12,2]},\"down\":{\"uv\":[58,2],\"uv_size\":[-12,-2]}}}]}]}]}'},178:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":4,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"body0\",\"pivot\":[0,9,0],\"cubes\":[{\"origin\":[-3,6,-3],\"size\":[6,6,6],\"uv\":[0,0]}]},{\"name\":\"head\",\"parent\":\"body0\",\"pivot\":[0,9,-3],\"cubes\":[{\"origin\":[-4,5,-11],\"size\":[8,8,8],\"uv\":[32,4]}]},{\"name\":\"body1\",\"parent\":\"body0\",\"pivot\":[0,9,9],\"cubes\":[{\"origin\":[-5,5,3],\"size\":[10,8,12],\"uv\":[0,12]}]},{\"name\":\"leg0\",\"parent\":\"body0\",\"pivot\":[-4,9,2],\"cubes\":[{\"origin\":[-19,8,1],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg1\",\"parent\":\"body0\",\"pivot\":[4,9,2],\"cubes\":[{\"origin\":[3,8,1],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg2\",\"parent\":\"body0\",\"pivot\":[-4,9,1],\"cubes\":[{\"origin\":[-19,8,0],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg3\",\"parent\":\"body0\",\"pivot\":[4,9,1],\"cubes\":[{\"origin\":[3,8,0],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg4\",\"parent\":\"body0\",\"pivot\":[-4,9,0],\"cubes\":[{\"origin\":[-19,8,-1],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg5\",\"parent\":\"body0\",\"pivot\":[4,9,0],\"cubes\":[{\"origin\":[3,8,-1],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg6\",\"parent\":\"body0\",\"pivot\":[-4,9,-1],\"cubes\":[{\"origin\":[-19,8,-2],\"size\":[16,2,2],\"uv\":[18,0]}]},{\"name\":\"leg7\",\"parent\":\"body0\",\"pivot\":[4,9,-1],\"cubes\":[{\"origin\":[3,8,-2],\"size\":[16,2,2],\"uv\":[18,0]}]}]}]}'},1921:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,-0.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-6,-8,-6],\"size\":[12,16,12],\"uv\":[0,0]}]},{\"name\":\"tentacle1\",\"parent\":\"body\",\"pivot\":[5,-7,0],\"rotation\":[0,90,0],\"cubes\":[{\"origin\":[4,-25,-1],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle2\",\"parent\":\"body\",\"pivot\":[3.5,-7,3.5],\"rotation\":[0,45,0],\"cubes\":[{\"origin\":[2.5,-25,2.5],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle3\",\"parent\":\"body\",\"pivot\":[0,-7,5],\"cubes\":[{\"origin\":[-1,-25,4],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle4\",\"parent\":\"body\",\"pivot\":[-3.5,-7,3.5],\"rotation\":[0,-45,0],\"cubes\":[{\"origin\":[-4.5,-25,2.5],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle5\",\"parent\":\"body\",\"pivot\":[-5,-7,0],\"rotation\":[0,-90,0],\"cubes\":[{\"origin\":[-6,-25,-1],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle6\",\"parent\":\"body\",\"pivot\":[-3.5,-7,-3.5],\"rotation\":[0,-135,0],\"cubes\":[{\"origin\":[-4.5,-25,-4.5],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle7\",\"parent\":\"body\",\"pivot\":[0,-7,-5],\"rotation\":[0,-180,0],\"cubes\":[{\"origin\":[-1,-25,-6],\"size\":[2,18,2],\"uv\":[48,0]}]},{\"name\":\"tentacle8\",\"parent\":\"body\",\"pivot\":[3.5,-7,-3.5],\"rotation\":[0,-225,0],\"cubes\":[{\"origin\":[2.5,-25,-4.5],\"size\":[2,18,2],\"uv\":[48,0]}]}]}]}'},9854:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":128,\"visible_bounds_width\":3,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"right_leg\",\"pivot\":[-4,16,0],\"cubes\":[{\"origin\":[-6,0,-2],\"size\":[4,16,4],\"uv\":[0,32]}]},{\"name\":\"left_leg\",\"pivot\":[4,16,0],\"cubes\":[{\"origin\":[2,0,-2],\"size\":[4,16,4],\"uv\":[0,55]}]},{\"name\":\"body\",\"pivot\":[0,16,0],\"cubes\":[{\"origin\":[-8,14,-8],\"size\":[16,14,16],\"uv\":[0,0]}],\"locators\":{\"lead\":[0,15,-1]}},{\"name\":\"bristle5\",\"parent\":\"body\",\"pivot\":[8,19,0],\"cubes\":[{\"origin\":[8,19,-8],\"size\":[12,0,16],\"pivot\":[8,19,0],\"rotation\":[0,0,70],\"uv\":[16,65]}]},{\"name\":\"bristle4\",\"parent\":\"body\",\"pivot\":[8,24,0],\"cubes\":[{\"origin\":[8,24,-8],\"size\":[12,0,16],\"pivot\":[8,24,0],\"rotation\":[0,0,65],\"uv\":[16,49]}]},{\"name\":\"bristle3\",\"parent\":\"body\",\"pivot\":[8,28,0],\"cubes\":[{\"origin\":[8,28,-8],\"size\":[12,0,16],\"pivot\":[8,28,0],\"rotation\":[0,0,50],\"uv\":[16,33]}]},{\"name\":\"bristle2\",\"parent\":\"body\",\"pivot\":[-8,28,0],\"cubes\":[{\"origin\":[-20,28,-8],\"size\":[12,0,16],\"pivot\":[-8,28,0],\"rotation\":[0,0,-50],\"uv\":[16,33],\"mirror\":true}]},{\"name\":\"bristle1\",\"parent\":\"body\",\"pivot\":[-8,24,0],\"cubes\":[{\"origin\":[-20,24,-8],\"size\":[12,0,16],\"pivot\":[-8,24,0],\"rotation\":[0,0,-65],\"uv\":[16,49],\"mirror\":true}]},{\"name\":\"bristle0\",\"parent\":\"body\",\"pivot\":[-8,19,0],\"cubes\":[{\"origin\":[-20,19,-8],\"size\":[12,0,16],\"pivot\":[-8,19,0],\"rotation\":[0,0,-70],\"uv\":[16,65],\"mirror\":true}]}]}]}'},1704:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":16,\"texture_height\":16,\"visible_bounds_width\":1,\"visible_bounds_height\":0.8,\"visible_bounds_offset\":[0,0.25,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,0,1],\"cubes\":[{\"origin\":[-1.5,3,-2.5],\"size\":[3,2,3],\"uv\":[0,0]}]},{\"name\":\"tail\",\"parent\":\"root\",\"pivot\":[0,0,1],\"cubes\":[{\"origin\":[0,3,-0.5],\"size\":[0,2,7],\"uv\":[0,0]}]}]}]}'},969:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,13,-10],\"cubes\":[{\"origin\":[-9.5,-10,-20],\"size\":[19,20,6],\"pivot\":[0,13,-10],\"rotation\":[90,0,0],\"uv\":[6,37]},{\"origin\":[-5.5,-8,-23],\"size\":[11,18,3],\"pivot\":[0,13,-10],\"rotation\":[90,0,0],\"uv\":[30,1]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,5,-10],\"cubes\":[{\"origin\":[-3,1,-13],\"size\":[6,5,6],\"uv\":[2,0]}]},{\"name\":\"eggbelly\",\"parent\":\"body\",\"pivot\":[0,13,-10],\"rotation\":[90,0,0],\"cubes\":[{\"origin\":[-4.5,-8,-24],\"size\":[9,18,1],\"uv\":[69,33]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-3.5,2,11],\"cubes\":[{\"origin\":[-5.5,1,11],\"size\":[4,1,10],\"uv\":[0,23]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[3.5,2,11],\"cubes\":[{\"origin\":[1.5,1,11],\"size\":[4,1,10],\"uv\":[0,12]}]},{\"name\":\"leg2\",\"parent\":\"body\",\"pivot\":[-5,3,-4],\"cubes\":[{\"origin\":[-18,2,-6],\"size\":[13,1,5],\"uv\":[26,30]}]},{\"name\":\"leg3\",\"parent\":\"body\",\"pivot\":[5,3,-4],\"cubes\":[{\"origin\":[5,2,-6],\"size\":[13,1,5],\"uv\":[26,24]}]}]}]}'},3904:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":4,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,16]},{\"origin\":[-2.9,3,-2],\"size\":[6,10,4],\"uv\":[32,0]}]},{\"name\":\"leftwing\",\"parent\":\"body\",\"pivot\":[0,24,0],\"mirror\":true,\"cubes\":[{\"origin\":[0,12,0],\"size\":[20,12,1],\"uv\":[0,32]}]},{\"name\":\"rightwing\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-20,12,0],\"size\":[20,12,1],\"uv\":[0,32]}]},{\"name\":\"rightItem\",\"pivot\":[-6,13,0]}]}]}'},8725:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":3,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,0,0],\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}],\"locators\":{\"lead_hold\":[0,40,0]}},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}]},{\"name\":\"helmet\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"brim\",\"parent\":\"head\",\"pivot\":[0,24,0],\"rotation\":[-90,0,0],\"cubes\":[{\"origin\":[-8,16,-6],\"size\":[16,16,1],\"inflate\":0.1,\"uv\":[30,47]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"cubes\":[{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"arms\",\"parent\":\"body\",\"pivot\":[0,21,-1],\"rotation\":[-42.97,0,0],\"cubes\":[{\"origin\":[-4,15,-3],\"size\":[8,4,4],\"uv\":[40,38]},{\"origin\":[-8,15,-3],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[4,15,-3],\"size\":[4,8,4],\"uv\":[44,22],\"mirror\":true}]},{\"name\":\"held_item\",\"parent\":\"arms\",\"pivot\":[0,-1,-1]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[2,12,0],\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22],\"mirror\":true}]}]}]}'},4288:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"cubes\":[{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"arms\",\"parent\":\"body\",\"pivot\":[0,22,0],\"cubes\":[{\"origin\":[-8,16,-2],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[4,16,-2],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[-4,16,-2],\"size\":[8,4,4],\"uv\":[40,38]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-5.5,16,0.5]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,46]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]}]}]}'},266:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":128,\"texture_height\":128,\"visible_bounds_width\":4,\"visible_bounds_height\":6,\"visible_bounds_offset\":[0,2,0]},\"bones\":[{\"name\":\"root\",\"pivot\":[0,0,0]},{\"name\":\"body\",\"parent\":\"root\",\"pivot\":[0,21,0],\"cubes\":[{\"origin\":[-9,13,-4],\"size\":[18,21,11],\"uv\":[0,0]}]},{\"name\":\"right_ribcage\",\"parent\":\"body\",\"pivot\":[-7,23,-4],\"cubes\":[{\"origin\":[-9,13,-4.1],\"size\":[9,21,0],\"uv\":[90,11]}]},{\"name\":\"left_ribcage\",\"parent\":\"body\",\"pivot\":[7,23,-4],\"cubes\":[{\"origin\":[0,13,-4.1],\"size\":[9,21,0],\"uv\":[90,11],\"mirror\":true}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,34,0],\"cubes\":[{\"origin\":[-8,34,-5],\"size\":[16,16,10],\"uv\":[0,32]}]},{\"name\":\"right_tendril\",\"parent\":\"head\",\"pivot\":[-8,46,0],\"cubes\":[{\"origin\":[-24,43,0],\"size\":[16,16,0],\"uv\":[52,32]}]},{\"name\":\"left_tendril\",\"parent\":\"head\",\"pivot\":[8,46,0],\"cubes\":[{\"origin\":[8,43,0],\"size\":[16,16,0],\"uv\":[58,0]}]},{\"name\":\"right_arm\",\"parent\":\"body\",\"pivot\":[-13,34,1],\"cubes\":[{\"origin\":[-17,6,-3],\"size\":[8,28,8],\"uv\":[44,50]}]},{\"name\":\"left_arm\",\"parent\":\"body\",\"pivot\":[13,34,1],\"cubes\":[{\"origin\":[9,6,-3],\"size\":[8,28,8],\"uv\":[0,58]}]},{\"name\":\"right_leg\",\"parent\":\"root\",\"pivot\":[-5.9,13,0],\"cubes\":[{\"origin\":[-9,0,-3],\"size\":[6,13,6],\"uv\":[76,48]}]},{\"name\":\"left_leg\",\"parent\":\"root\",\"pivot\":[5.9,13,0],\"cubes\":[{\"origin\":[3,0,-3],\"size\":[6,13,6],\"uv\":[76,76]}]}]}]}'},3140:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":128,\"visible_bounds_width\":2,\"visible_bounds_height\":4.5,\"visible_bounds_offset\":[0,1.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"uv\":[0,0]}]},{\"name\":\"nose\",\"parent\":\"head\",\"pivot\":[0,26,0],\"mirror\":true,\"cubes\":[{\"origin\":[-1,25,-6.75],\"size\":[1,1,1],\"inflate\":-0.25,\"uv\":[0,0]},{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"uv\":[24,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[5,32.03,-5],\"mirror\":true,\"cubes\":[{\"origin\":[-5,32.05,-5],\"size\":[10,2,10],\"uv\":[0,64]}]},{\"name\":\"hat2\",\"parent\":\"hat\",\"pivot\":[-1.75,32,2],\"rotation\":[-3,0,1.5],\"mirror\":true,\"cubes\":[{\"origin\":[-3.75,33.5,-3],\"size\":[7,4,7],\"uv\":[0,76]}]},{\"name\":\"hat3\",\"parent\":\"hat2\",\"pivot\":[-1.75,35,2],\"rotation\":[-6,0,3],\"mirror\":true,\"cubes\":[{\"origin\":[-2.5,36.5,-1],\"size\":[4,4,4],\"uv\":[0,87]}]},{\"name\":\"hat4\",\"parent\":\"hat3\",\"pivot\":[-1.75,38,2],\"rotation\":[-12,0,6],\"mirror\":true,\"cubes\":[{\"origin\":[-1.25,40,1],\"size\":[1,2,1],\"inflate\":0.25,\"uv\":[0,95]}]},{\"name\":\"arms\",\"parent\":\"body\",\"pivot\":[0,21,-1],\"rotation\":[-42.97,0,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,15,-3],\"size\":[8,4,4],\"uv\":[40,38]},{\"origin\":[4,15,-3],\"size\":[4,8,4],\"uv\":[44,22]},{\"origin\":[-8,15,-3],\"size\":[4,8,4],\"uv\":[44,22]}]},{\"name\":\"leg0\",\"parent\":\"body\",\"pivot\":[2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leg1\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22],\"mirror\":false}]}]}]}'},5936:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-6,12,-1],\"size\":[2,12,2],\"uv\":[40,16]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-5,15,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-1],\"size\":[2,12,2],\"uv\":[40,16]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"cubes\":[{\"origin\":[-3,0,-1],\"size\":[2,12,2],\"uv\":[0,16]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[2,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[1,0,-1],\"size\":[2,12,2],\"uv\":[0,16]}]}]}]}'},9071:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2,\"visible_bounds_offset\":[0,1,0]},\"bones\":[{\"name\":\"head\",\"pivot\":[-1,10.5,-7],\"cubes\":[{\"origin\":[-4,7.5,-9],\"size\":[6,6,4],\"uv\":[0,0]},{\"origin\":[-4,13.5,-7],\"size\":[2,2,1],\"uv\":[16,14]},{\"origin\":[0,13.5,-7],\"size\":[2,2,1],\"uv\":[16,14]},{\"origin\":[-2.5,7.51563,-12],\"size\":[3,3,4],\"uv\":[0,10]}],\"locators\":{\"lead\":[-1,10.5,-7]}},{\"name\":\"body\",\"pivot\":[0,10,2],\"rotation\":[90,0,0],\"cubes\":[{\"origin\":[-4,3,-1],\"size\":[6,9,6],\"uv\":[18,14]}]},{\"name\":\"upperBody\",\"pivot\":[-1,10,-3],\"rotation\":[90,0,0],\"cubes\":[{\"origin\":[-5,7,-6],\"size\":[8,6,7],\"uv\":[21,0]}]},{\"name\":\"leg0\",\"pivot\":[-2.5,8,7],\"cubes\":[{\"origin\":[-3.5,0,6],\"size\":[2,8,2],\"uv\":[0,18]}]},{\"name\":\"leg1\",\"pivot\":[0.5,8,7],\"cubes\":[{\"origin\":[-0.5,0,6],\"size\":[2,8,2],\"uv\":[0,18]}]},{\"name\":\"leg2\",\"pivot\":[-2.5,8,-4],\"cubes\":[{\"origin\":[-3.5,0,-5],\"size\":[2,8,2],\"uv\":[0,18]}]},{\"name\":\"leg3\",\"pivot\":[0.5,8,-4],\"cubes\":[{\"origin\":[-0.5,0,-5],\"size\":[2,8,2],\"uv\":[0,18]}]},{\"name\":\"tail\",\"pivot\":[-1,12,8],\"cubes\":[{\"origin\":[-2,4,7],\"size\":[2,8,2],\"uv\":[9,18]}]}]}]}'},6537:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"uv\":[16,16]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"uv\":[0,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-6,15,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[40,16]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-1.9,12,0],\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[1.9,12,0],\"mirror\":true,\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"uv\":[0,16]}]}]}]}'},1994:e=>{e.exports='{\"format_version\":\"1.12.0\",\"minecraft:geometry\":[{\"description\":{\"identifier\":\"geometry.{name}\",\"texture_width\":64,\"texture_height\":64,\"visible_bounds_width\":2,\"visible_bounds_height\":3,\"visible_bounds_offset\":[0,1.5,0]},\"bones\":[{\"name\":\"hat2\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"waist\",\"pivot\":[0,12,0]},{\"name\":\"body\",\"parent\":\"waist\",\"pivot\":[0,24,0],\"reset\":true,\"cubes\":[{\"origin\":[-4,12,-3],\"size\":[8,12,6],\"uv\":[16,20]},{\"origin\":[-4,6,-3],\"size\":[8,18,6],\"inflate\":0.5,\"uv\":[0,38]}]},{\"name\":\"head\",\"parent\":\"body\",\"pivot\":[0,24,0],\"reset\":true,\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,10,8],\"inflate\":0.25,\"uv\":[0,0]},{\"origin\":[-1,23,-6],\"size\":[2,4,2],\"inflate\":0.25,\"uv\":[24,0]}]},{\"name\":\"hat\",\"parent\":\"head\",\"pivot\":[0,24,0],\"cubes\":[{\"origin\":[-4,24,-4],\"size\":[8,8,8],\"inflate\":0.5,\"uv\":[32,0]}]},{\"name\":\"rightArm\",\"parent\":\"body\",\"pivot\":[-5,22,0],\"reset\":true,\"cubes\":[{\"origin\":[-8,12,-2],\"size\":[4,12,4],\"uv\":[44,38]}]},{\"name\":\"rightItem\",\"parent\":\"rightArm\",\"pivot\":[-6,15,1]},{\"name\":\"leftArm\",\"parent\":\"body\",\"pivot\":[5,22,0],\"reset\":true,\"mirror\":true,\"cubes\":[{\"origin\":[4,12,-2],\"size\":[4,12,4],\"uv\":[44,38]}]},{\"name\":\"leftItem\",\"parent\":\"leftArm\",\"pivot\":[6,15,1]},{\"name\":\"rightLeg\",\"parent\":\"body\",\"pivot\":[-2,12,0],\"reset\":true,\"cubes\":[{\"origin\":[-4,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]},{\"name\":\"leftLeg\",\"parent\":\"body\",\"pivot\":[2,12,0],\"reset\":true,\"mirror\":true,\"cubes\":[{\"origin\":[0,0,-2],\"size\":[4,12,4],\"uv\":[0,22]}]}]}]}'},4692:e=>{e.exports='{\"format_version\":\"1.8.0\",\"render_controllers\":{\"controller.render.{name}\":{\"geometry\":\"Geometry.default\",\"materials\":[{\"*\":\"Material.default\"}],\"textures\":[\"query.is_angry ? Texture.angry : (query.is_tamed ? Texture.tame : Texture.default)\"]}}}'},8569:e=>{e.exports='{\"entity_sounds\":{\"defaults\":{\"events\":{\"ambient\":\"\",\"ambient.in.raid\":\"\",\"ambient.in.water\":\"\",\"celebrate\":\"\",\"death\":\"game.player.die\",\"death.in.water\":\"\",\"drink\":{\"pitch\":[0.90,1.10],\"sound\":\"random.drink\",\"volume\":0.350},\"drink.honey\":{\"pitch\":[0.90,1.0],\"sound\":\"random.drink_honey\",\"volume\":0.50},\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"random.eat\",\"volume\":[0.50,1.10]},\"fall.big\":{\"pitch\":1.0,\"sound\":\"damage.fallbig\",\"volume\":0.750},\"fall.small\":{\"pitch\":1.0,\"sound\":\"damage.fallsmall\",\"volume\":0.750},\"fizz\":{\"pitch\":[1.20,2.0],\"sound\":\"random.fizz\",\"volume\":0.70},\"flop\":\"\",\"hurt\":\"game.player.hurt\",\"hurt.in.water\":\"\",\"splash\":{\"pitch\":[0.60,1.40],\"sound\":\"entity.generic.splash\"},\"swim\":{\"pitch\":[0.60,1.40],\"sound\":\"random.swim\"}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"entities\":{\"allay\":{\"events\":{\"ambient\":\"mob.allay.idle\",\"ambient.tame\":\"mob.allay.idle_holding\",\"death\":\"mob.allay.death\",\"hurt\":\"mob.allay.hurt\"},\"pitch\":[0.80,1.20],\"volume\":1},\"armadillo\":{\"events\":{\"ambient\":\"mob.armadillo.ambient\",\"death\":\"mob.armadillo.death\",\"eat\":\"mob.armadillo.eat\",\"hurt\":\"mob.armadillo.hurt\",\"hurt.reduced\":\"mob.armadillo.hurt_reduced\",\"step\":\"mob.armadillo.step\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"axolotl\":{\"events\":{\"ambient\":\"mob.axolotl.idle\",\"ambient.in.water\":\"mob.axolotl.idle_water\",\"attack\":\"mob.axolotl.attack\",\"death\":\"mob.axolotl.death\",\"eat\":\"\",\"hurt\":\"mob.axolotl.hurt\",\"splash\":\"mob.axolotl.splash\",\"swim\":\"mob.axolotl.swim\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"bat\":{\"events\":{\"ambient\":\"mob.bat.idle\",\"death\":\"mob.bat.death\",\"hurt\":\"mob.bat.hurt\",\"takeoff\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.bat.takeoff\",\"volume\":0.050}},\"pitch\":[0.760,1.140],\"volume\":0.10},\"bee\":{\"events\":{\"ambient.pollinate\":{\"sound\":\"mob.bee.pollinate\",\"volume\":0.850},\"attack\":{\"pitch\":[0.80,1.0],\"sound\":\"mob.bee.sting\"},\"death\":{\"pitch\":[0.90,1.10],\"sound\":\"mob.bee.death\",\"volume\":0.60},\"eat\":\"\",\"hurt\":{\"pitch\":[0.90,1.10],\"sound\":\"mob.bee.hurt\",\"volume\":0.60}},\"pitch\":1.0,\"volume\":0.60},\"blaze\":{\"events\":{\"ambient\":\"mob.blaze.breathe\",\"death\":\"mob.blaze.death\",\"hurt\":\"mob.blaze.hit\",\"shoot\":\"mob.blaze.shoot\"},\"pitch\":[0.80,1.20],\"volume\":2.0},\"bogged\":{\"events\":{\"ambient\":\"mob.bogged.ambient\",\"death\":\"mob.bogged.death\",\"hurt\":\"mob.bogged.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.bogged.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"breeze\":{\"events\":{\"ambient\":{\"pitch\":[0.70,1.10],\"sound\":\"mob.breeze.idle_ground\",\"volume\":[0.80,1.0]},\"ambient.in.air\":{\"pitch\":[0.70,1.10],\"sound\":\"mob.breeze.idle_air\",\"volume\":[0.80,1.0]},\"charge\":{\"pitch\":1.0,\"sound\":\"mob.breeze.charge\",\"volume\":1.0},\"death\":{\"pitch\":1.0,\"sound\":\"mob.breeze.death\",\"volume\":1.0},\"hurt\":{\"pitch\":1.0,\"sound\":\"mob.breeze.hurt\",\"volume\":1.0},\"jump\":{\"pitch\":1.0,\"sound\":\"mob.breeze.jump\",\"volume\":1.0},\"land\":{\"pitch\":1.0,\"sound\":\"mob.breeze.land\",\"volume\":1.0},\"reflect\":{\"pitch\":1.0,\"sound\":\"mob.breeze.deflect\",\"volume\":1.0},\"shoot\":{\"pitch\":[1.0,1.20],\"sound\":\"mob.breeze.shoot\",\"volume\":1.50},\"step\":{\"volume\":0.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"camel\":{\"events\":{\"ambient\":\"mob.camel.ambient\",\"death\":\"mob.camel.death\",\"eat\":\"mob.camel.eat\",\"hurt\":\"mob.camel.hurt\",\"saddle\":\"mob.horse.leather\",\"step\":\"mob.camel.step\",\"step_sand\":\"mob.camel.step_sand\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"volume\":1},\"camel_husk\":{\"events\":{\"ambient\":\"mob.camel_husk.ambient\",\"dash_ready\":\"mob.camel_husk.dash_ready\",\"death\":\"mob.camel_husk.death\",\"eat\":\"mob.camel_husk.eat\",\"hurt\":\"mob.camel_husk.hurt\",\"saddle\":\"mob.horse.leather\",\"step\":\"mob.camel_husk.step\",\"step_sand\":\"mob.camel_husk.step_sand\"},\"pitch\":[0.80,1.20],\"volume\":1},\"cat\":{\"events\":{\"ambient\":\"mob.cat.straymeow\",\"ambient.tame\":\"mob.cat.meow\",\"death\":\"mob.cat.hit\",\"eat\":\"mob.cat.eat\",\"hurt\":\"mob.cat.hit\",\"purr\":\"mob.cat.purr\",\"purreow\":\"mob.cat.purreow\",\"tempt\":{\"pitch\":1.0,\"sound\":\"mob.cat.beg_for_food\",\"volume\":0.70}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"cave_spider\":{\"events\":{\"ambient\":\"mob.spider.say\",\"death\":\"mob.spider.death\",\"hurt\":\"mob.spider.say\",\"step\":{\"pitch\":[0.90,1.10],\"sound\":\"mob.spider.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"chicken\":{\"events\":{\"ambient\":\"mob.chicken.say\",\"death\":\"mob.chicken.hurt\",\"eat\":\"\",\"hurt\":\"mob.chicken.hurt\",\"plop\":\"mob.chicken.plop\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.chicken.step\",\"volume\":0.250}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"cod\":{\"events\":{\"flop\":{\"pitch\":1.0,\"sound\":\"mob.fish.flop\",\"volume\":1.0},\"hurt\":\"mob.fish.hurt\",\"hurt.in.water\":\"mob.fish.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.fish.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"copper_golem\":{\"__molang_version\":13,\"events\":{\"deactivate\":\"mob.copper_golem.becoming_statue\",\"death\":\"mob.copper_golem.death\",\"hurt\":\"mob.copper_golem.hurt\",\"spawn\":\"mob.copper_golem.spawn\",\"step\":\"mob.copper_golem.step\"},\"pitch\":1.0,\"variants\":{\"key\":\"query.property(\\'minecraft:oxidation_level\\')\",\"map\":{\"oxidized\":{\"events\":{\"death\":\"mob.copper_golem.oxidized.death\",\"hurt\":\"mob.copper_golem.oxidized.hurt\",\"step\":\"mob.copper_golem.oxidized.step\"},\"pitch\":1.0,\"volume\":1.0},\"weathered\":{\"events\":{\"death\":\"mob.copper_golem.weathered.death\",\"hurt\":\"mob.copper_golem.weathered.hurt\",\"step\":\"mob.copper_golem.weathered.step\"},\"pitch\":1.0,\"volume\":1.0}}},\"volume\":1.0},\"cow\":{\"events\":{\"ambient\":\"mob.cow.say\",\"death\":\"mob.cow.death\",\"eat\":\"\",\"hurt\":\"mob.cow.hurt\",\"step\":\"mob.cow.step\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"creaking\":{\"events\":{\"activate\":\"mob.creaking.activate\",\"ambient\":\"mob.creaking.ambient\",\"attack\":\"mob.creaking.attack\",\"creaking_heart_spawn\":\"mob.creaking.spawn\",\"deactivate\":\"mob.creaking.deactivate\",\"death\":\"mob.creaking.death\",\"freeze\":\"mob.creaking.freeze\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.creaking.step\",\"volume\":0.80},\"unfreeze\":\"mob.creaking.unfreeze\"},\"pitch\":1.0,\"volume\":1.0},\"creeper\":{\"events\":{\"death\":\"mob.creeper.death\",\"fuse\":{\"pitch\":0.50,\"sound\":\"random.fuse\",\"volume\":1.0},\"hurt\":\"mob.creeper.say\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"dolphin\":{\"events\":{\"ambient\":\"mob.dolphin.idle\",\"ambient.in.water\":\"mob.dolphin.idle_water\",\"attack\":\"mob.dolphin.attack\",\"breathe\":\"mob.dolphin.blowhole\",\"death\":\"mob.dolphin.death\",\"death.in.water\":\"mob.dolphin.death\",\"eat\":{\"pitch\":1.0,\"sound\":\"mob.dolphin.eat\",\"volume\":0.70},\"hurt\":\"mob.dolphin.hurt\",\"hurt.in.water\":\"mob.dolphin.hurt\",\"jump\":{\"pitch\":1.0,\"sound\":\"mob.dolphin.jump\",\"volume\":0.70},\"splash\":\"mob.dolphin.splash\",\"swim\":\"mob.dolphin.swim\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"donkey\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.horse.donkey.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.horse.armor\",\"volume\":0.60},\"breathe\":{\"pitch\":1.0,\"sound\":\"mob.horse.breathe\",\"volume\":0.70},\"death\":\"mob.horse.donkey.death\",\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.eat\",\"volume\":[0.50,1.50]},\"hurt\":\"mob.horse.donkey.hit\",\"jump\":{\"pitch\":1.0,\"sound\":\"mob.horse.jump\",\"volume\":0.40},\"land\":{\"pitch\":1.0,\"sound\":\"mob.horse.land\",\"volume\":0.40},\"mad\":\"mob.horse.donkey.angry\",\"saddle\":{\"pitch\":1.0,\"sound\":\"mob.horse.leather\",\"volume\":0.50},\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"volume\":0.80},\"drowned\":{\"events\":{\"ambient\":\"mob.drowned.say\",\"ambient.in.water\":\"mob.drowned.say_water\",\"death\":\"mob.drowned.death\",\"death.in.water\":\"mob.drowned.death_water\",\"hurt\":\"mob.drowned.hurt\",\"hurt.in.water\":\"mob.drowned.hurt_water\",\"step\":\"mob.drowned.step\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"elder_guardian\":{\"events\":{\"ambient\":\"mob.guardian.land_idle\",\"ambient.in.water\":\"mob.elderguardian.idle\",\"death\":\"mob.elderguardian.death\",\"death.in.water\":\"mob.elderguardian.death\",\"flop\":\"mob.guardian.flop\",\"hurt\":\"mob.guardian.land_hit\",\"hurt.in.water\":\"mob.elderguardian.hit\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"ender_dragon\":{\"events\":{\"death\":\"mob.enderdragon.death\",\"flap\":\"mob.enderdragon.flap\",\"hurt\":\"mob.enderdragon.hit\",\"mad\":\"mob.enderdragon.growl\"},\"pitch\":[0.80,1.20],\"volume\":80.0},\"enderman\":{\"events\":{\"ambient\":\"mob.endermen.idle\",\"death\":\"mob.endermen.death\",\"hurt\":\"mob.endermen.hit\",\"mad\":\"mob.endermen.scream\",\"stare\":{\"pitch\":1.0,\"sound\":\"mob.endermen.stare\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"endermite\":{\"events\":{\"ambient\":\"mob.endermite.say\",\"death\":\"mob.endermite.kill\",\"hurt\":\"mob.endermite.hit\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.endermite.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"evocation_fang\":{\"events\":{\"fang\":\"mob.evocation_fangs.attack\"},\"pitch\":[0.80,1.20],\"volume\":0.80},\"evocation_illager\":{\"events\":{\"ambient\":\"mob.evocation_illager.ambient\",\"ambient.in.raid\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.evocation_illager.ambient\",\"volume\":3.0},\"cast.spell\":\"mob.evocation_illager.cast_spell\",\"celebrate\":\"mob.evocation_illager.celebrate\",\"death\":\"mob.evocation_illager.death\",\"hurt\":\"mob.evocation_illager.hurt\",\"prepare.attack\":\"mob.evocation_illager.prepare_attack\",\"prepare.summon\":\"mob.evocation_illager.prepare_summon\",\"prepare.wololo\":\"mob.evocation_illager.prepare_wololo\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"fishing_hook\":{\"events\":{\"splash\":{\"sound\":\"random.splash\"}},\"pitch\":[0.60,1.40],\"volume\":0.250},\"fox\":{\"events\":{\"ambient\":\"mob.fox.ambient\",\"attack\":\"mob.fox.bite\",\"death\":\"mob.fox.death\",\"eat\":\"mob.fox.eat\",\"hurt\":\"mob.fox.hurt\",\"mad\":\"mob.fox.aggro\",\"screech\":{\"sound\":\"mob.fox.screech\",\"volume\":2},\"sleep\":\"mob.fox.sleep\",\"teleport\":\"entity.fox.teleport\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"frog\":{\"events\":{\"ambient\":\"mob.frog.ambient\",\"ambient.baby\":{\"pitch\":1.20,\"sound\":\"mob.frog.ambient\",\"volume\":2.50},\"death\":\"mob.frog.death\",\"eat\":\"mob.frog.eat\",\"hurt\":\"mob.frog.hurt\",\"jump_to_block\":\"mob.frog.jump_to_block\",\"step\":\"mob.frog.step\"},\"pitch\":[0.80,1.20],\"volume\":1},\"ghast\":{\"events\":{\"ambient\":\"mob.ghast.moan\",\"death\":\"mob.ghast.death\",\"hurt\":\"mob.ghast.scream\",\"shoot\":{\"sound\":\"mob.ghast.fireball\",\"volume\":0.70},\"warn\":\"mob.ghast.charge\"},\"pitch\":[0.80,1.20],\"volume\":5.0},\"glow_squid\":{\"events\":{\"ambient\":\"mob.glow_squid.ambient\",\"death\":\"mob.glow_squid.death\",\"hurt\":\"mob.glow_squid.hurt\"},\"pitch\":[0.80,1.20],\"volume\":0.40},\"goat\":{\"events\":{\"ambient\":\"mob.goat.ambient\",\"ambient.screamer\":\"mob.goat.ambient.screamer\",\"death\":\"mob.goat.death\",\"death.screamer\":\"mob.goat.death.screamer\",\"eat\":\"mob.goat.eat\",\"hurt\":\"mob.goat.hurt\",\"hurt.screamer\":\"mob.goat.hurt.screamer\",\"step\":\"mob.goat.step\"},\"pitch\":[0.80,1.20],\"volume\":1},\"guardian\":{\"events\":{\"ambient\":\"mob.guardian.land_idle\",\"ambient.in.water\":\"mob.guardian.ambient\",\"death\":\"mob.guardian.land_death\",\"death.in.water\":\"mob.guardian.death\",\"flop\":\"mob.guardian.flop\",\"hurt\":\"mob.guardian.land_hit\",\"hurt.in.water\":\"mob.guardian.hit\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"happy_ghast\":{\"__molang_version\":13,\"events\":{\"ambient\":\"mob.happy_ghast.ambient\",\"armor.equip_generic\":\"mob.happy_ghast.harness_equip\",\"armor.unequip_generic\":\"mob.happy_ghast.harness_unequip\",\"attach\":\"mob.happy_ghast.goggles_down\",\"death\":\"mob.happy_ghast.death\",\"detach\":\"mob.happy_ghast.goggles_up\",\"hurt\":\"mob.happy_ghast.hurt\"},\"pitch\":1.0,\"variants\":{\"key\":\"query.is_baby ? \\'ghastling\\' : \\'adult\\'\",\"map\":{\"adult\":{\"events\":{\"ambient\":\"mob.happy_ghast.ambient\",\"death\":\"mob.happy_ghast.death\",\"hurt\":\"mob.happy_ghast.hurt\"},\"pitch\":1.0,\"volume\":4.0},\"ghastling\":{\"events\":{\"ambient\":\"mob.ghastling.ambient\",\"death\":\"mob.ghastling.death\",\"hurt\":\"mob.ghastling.hurt\",\"spawn\":\"mob.ghastling.spawn\"},\"pitch\":0.50,\"volume\":1.0}}},\"volume\":1.0},\"hoglin\":{\"events\":{\"ambient\":\"mob.hoglin.ambient\",\"angry\":\"mob.hoglin.angry\",\"attack\":\"mob.hoglin.attack\",\"death\":\"mob.hoglin.death\",\"eat\":\"\",\"hurt\":\"mob.hoglin.hurt\",\"retreat\":\"mob.hoglin.retreat\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.hoglin.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"horse\":{\"__molang_version\":13,\"events\":{\"add.chest\":\"mob.horse.armor\",\"ambient\":\"mob.horse.idle\",\"armor\":\"mob.horse.armor\",\"armor.unequip_generic\":\"mob.horse.horse_armor_unequip\",\"breathe\":\"mob.horse.breathe\",\"death\":\"mob.horse.death\",\"eat\":\"mob.horse.eat\",\"hurt\":\"mob.horse.hit\",\"jump\":\"mob.horse.jump\",\"land\":\"mob.horse.land\",\"mad\":\"mob.horse.angry\",\"saddle\":\"mob.horse.leather\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"variants\":{\"key\":\"query.is_baby ? \\'baby\\' : \\'adult\\'\",\"map\":{\"adult\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":{\"sound\":\"mob.horse.idle\",\"volume\":1.0},\"armor\":{\"pitch\":1.0,\"sound\":\"mob.horse.armor\",\"volume\":0.60},\"breathe\":{\"pitch\":1.0,\"sound\":\"mob.horse.breathe\",\"volume\":1.0},\"death\":{\"pitch\":0.90,\"sound\":\"mob.horse.death\",\"volume\":0.50},\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.eat\",\"volume\":[0.50,1.50]},\"hurt\":{\"sound\":\"mob.horse.hit\",\"volume\":0.450},\"jump\":{\"pitch\":1.0,\"sound\":\"mob.horse.jump\",\"volume\":0.40},\"land\":{\"pitch\":1.0,\"sound\":\"mob.horse.land\",\"volume\":0.40},\"saddle\":{\"pitch\":1.0,\"sound\":\"mob.horse.leather\",\"volume\":0.60}},\"pitch\":1.0,\"volume\":1.0},\"baby\":{\"events\":{\"ambient\":{\"pitch\":0.50,\"sound\":\"mob.baby_horse.ambient\",\"volume\":1.0},\"ambient.baby\":{\"pitch\":0.50,\"sound\":\"mob.baby_horse.ambient\",\"volume\":1.0},\"angry\":{\"pitch\":0.0,\"sound\":\"mob.baby_horse.angry\",\"volume\":1.0},\"breathe\":{\"pitch\":0.0,\"sound\":\"mob.baby_horse.breathe\",\"volume\":1.0},\"death\":{\"pitch\":0.50,\"sound\":\"mob.baby_horse.death\",\"volume\":1.0},\"eat\":{\"pitch\":0.0,\"sound\":\"mob.baby_horse.eat\",\"volume\":1.0},\"hurt\":{\"pitch\":0.50,\"sound\":\"mob.baby_horse.hurt\",\"volume\":1.0},\"land\":{\"pitch\":0.0,\"sound\":\"mob.baby_horse.land\",\"volume\":1.0}},\"pitch\":1.0,\"volume\":0.0}}},\"volume\":0.80},\"husk\":{\"events\":{\"ambient\":\"mob.husk.ambient\",\"death\":\"mob.husk.death\",\"hurt\":\"mob.husk.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.husk.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"iron_golem\":{\"events\":{\"ambient\":\"mob.irongolem.say\",\"death\":\"mob.irongolem.death\",\"hurt\":\"mob.irongolem.hit\",\"irongolem.crack\":\"mob.irongolem.crack\",\"irongolem.repair\":\"mob.irongolem.repair\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.irongolem.walk\",\"volume\":1.0},\"throw\":{\"pitch\":1.0,\"sound\":\"mob.irongolem.throw\",\"volume\":1.0}},\"pitch\":[0.80,1.0],\"volume\":1.0},\"item\":{\"events\":{\"fizz\":{\"pitch\":[2.0,2.40],\"sound\":\"random.fizz\",\"volume\":0.40}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"lightning_bolt\":{\"events\":{\"explode\":{\"pitch\":[0.30,0.70],\"sound\":\"ambient.weather.lightning.impact\"},\"thunder\":{\"pitch\":[0.60,1.0],\"sound\":\"ambient.weather.thunder\"}},\"volume\":1000.0},\"llama\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.llama.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.llama.swag\",\"volume\":0.50},\"armor.unequip_generic\":\"mob.llama.carpet_unequip\",\"death\":\"mob.llama.death\",\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.llama.eat\",\"volume\":[0.50,1.50]},\"hurt\":\"mob.llama.hurt\",\"mad\":\"mob.llama.angry\",\"shoot\":\"mob.llama.spit\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.llama.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":0.80},\"magma_cube\":{\"events\":{\"ambient\":\"\",\"attack\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.attack\"},\"death\":\"mob.magmacube.small\",\"hurt\":\"mob.magmacube.small\",\"squish.big\":{\"pitch\":[0.640,0.960],\"sound\":\"mob.magmacube.big\"},\"squish.small\":{\"pitch\":[0.640,0.960],\"sound\":\"mob.magmacube.small\"}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"minecart\":{\"events\":{\"step\":\"\"}},\"minecraft:npc\":{\"events\":{\"ambient\":\"mob.villager.idle\",\"death\":\"dig.wood\",\"hurt\":\"mob.villager.hit\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"mooshroom\":{\"events\":{\"ambient\":\"mob.cow.say\",\"death\":\"mob.cow.hurt\",\"eat\":\"mob.mooshroom.eat\",\"hurt\":\"mob.cow.hurt\",\"step\":{\"pitch\":[0.90,1.10],\"sound\":\"mob.cow.step\",\"volume\":0.650}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"mule\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.horse.donkey.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.horse.armor\",\"volume\":0.60},\"breathe\":{\"pitch\":1.0,\"sound\":\"mob.horse.breathe\",\"volume\":0.70},\"death\":\"mob.horse.donkey.death\",\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.eat\",\"volume\":[0.50,1.50]},\"hurt\":\"mob.horse.donkey.hit\",\"jump\":{\"pitch\":1.0,\"sound\":\"mob.horse.jump\",\"volume\":0.40},\"land\":{\"pitch\":1.0,\"sound\":\"mob.horse.land\",\"volume\":0.40},\"mad\":\"mob.horse.donkey.angry\",\"saddle\":{\"pitch\":1.0,\"sound\":\"mob.horse.leather\",\"volume\":0.60},\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"volume\":0.80},\"nautilus\":{\"__molang_version\":13,\"events\":{\"ambient\":\"mob.nautilus.ambient\",\"ambient.in.water\":\"mob.nautilus.ambient.in.water\",\"armor.unequip_generic\":\"mob.nautilus.armor_unequip\",\"dash_ready\":\"mob.nautilus.dash_ready\",\"death\":\"mob.nautilus.death\",\"death.in.water\":\"mob.nautilus.death.in.water\",\"eat\":\"mob.nautilus.eat\",\"hurt\":\"mob.nautilus.hurt\",\"hurt.in.water\":\"mob.nautilus.hurt.in.water\",\"saddle\":\"mob.nautilus.saddle\",\"saddle_in_water\":\"mob.nautilus.saddle_underwater\",\"swim\":\"mob.nautilus.swim\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":1.0,\"variants\":{\"key\":\"query.is_baby ? \\'baby\\' : \\'adult\\'\",\"map\":{\"adult\":{\"events\":{\"ambient\":\"mob.nautilus.ambient\",\"ambient.in.water\":\"mob.nautilus.ambient.in.water\",\"dash_ready\":\"mob.nautilus.dash_ready\",\"death\":\"mob.nautilus.death\",\"death.in.water\":\"mob.nautilus.death.in.water\",\"eat\":\"mob.nautilus.eat\",\"hurt\":\"mob.nautilus.hurt\",\"hurt.in.water\":\"mob.nautilus.hurt.in.water\",\"swim\":\"mob.nautilus.swim\"},\"pitch\":1.0,\"volume\":3.0},\"baby\":{\"events\":{\"ambient\":\"mob.baby_nautilus.ambient\",\"ambient.in.water\":\"mob.baby_nautilus.ambient.in.water\",\"death\":\"mob.baby_nautilus.death\",\"death.in.water\":\"mob.baby_nautilus.death.in.water\",\"eat\":\"mob.nautilus.eat\",\"hurt\":\"mob.baby_nautilus.hurt\",\"hurt.in.water\":\"mob.baby_nautilus.hurt.in.water\",\"swim\":\"mob.nautilus.swim\"},\"pitch\":1.0,\"volume\":3.0}}},\"volume\":3.0},\"npc\":{\"events\":{\"death\":\"dig.wood\",\"hurt\":\"mob.villager.hit\",\"spawn\":\"mob.villager.idle\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"ocelot\":{\"events\":{\"ambient\":\"mob.ocelot.idle\",\"death\":\"mob.ocelot.death\",\"eat\":\"mob.cat.eat\",\"hurt\":{\"sound\":\"mob.cat.hit\",\"volume\":0.450}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"panda\":{\"events\":{\"ambient\":\"mob.panda.idle\",\"ambient.aggressive\":\"mob.panda.idle.aggressive\",\"ambient.baby\":\"mob.panda_baby.idle\",\"ambient.worried\":\"mob.panda.idle.worried\",\"attack\":\"mob.panda.bite\",\"cant_breed\":\"mob.panda.cant_breed\",\"death\":{\"sound\":\"mob.panda.death\",\"volume\":0.820},\"eat\":\"mob.panda.eat\",\"hurt\":{\"sound\":\"mob.panda.hurt\",\"volume\":0.820},\"presneeze\":\"mob.panda.presneeze\",\"sneeze\":\"mob.panda.sneeze\",\"step\":{\"sound\":\"mob.panda.step\",\"volume\":0.40}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"parched\":{\"events\":{\"ambient\":\"mob.parched.ambient\",\"death\":\"mob.parched.death\",\"hurt\":\"mob.parched.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.parched.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"parrot\":{\"events\":{\"ambient\":{\"sound\":\"mob.parrot.idle\",\"volume\":0.70},\"death\":{\"pitch\":[0.80,1.0],\"sound\":\"mob.parrot.death\",\"volume\":1.0},\"eat\":\"mob.parrot.eat\",\"fly\":\"mob.parrot.fly\",\"hurt\":{\"pitch\":[0.80,1.0],\"sound\":\"mob.parrot.hurt\",\"volume\":1.0},\"imitate.blaze\":{\"pitch\":1.80,\"sound\":\"mob.imitate.blaze\",\"volume\":0.40},\"imitate.bogged\":{\"pitch\":1.70,\"sound\":\"mob.imitate.bogged\",\"volume\":0.70},\"imitate.breeze\":{\"pitch\":1.70,\"sound\":\"mob.imitate.breeze\",\"volume\":0.70},\"imitate.camel_husk\":{\"pitch\":1.70,\"sound\":\"mob.imitate.camel_husk\",\"volume\":0.70},\"imitate.cave_spider\":{\"pitch\":1.80,\"sound\":\"mob.imitate.spider\",\"volume\":0.60},\"imitate.creaking\":{\"pitch\":1.0,\"sound\":\"mob.imitate.creaking\",\"volume\":1.0},\"imitate.creeper\":{\"pitch\":1.80,\"sound\":\"imitate.fuse\",\"volume\":0.60},\"imitate.drowned\":{\"pitch\":1.80,\"sound\":\"mob.imitate.drowned\",\"volume\":0.60},\"imitate.elder_guardian\":{\"pitch\":1.70,\"sound\":\"mob.imitate.guardian\",\"volume\":0.70},\"imitate.ender_dragon\":{\"pitch\":1.80,\"sound\":\"mob.imitate.enderdragon\",\"volume\":0.20},\"imitate.enderman\":{\"pitch\":1.70,\"sound\":\"mob.imitate.endermen\",\"volume\":0.50},\"imitate.endermite\":{\"pitch\":1.80,\"sound\":\"mob.imitate.endermite\",\"volume\":0.70},\"imitate.evocation_illager\":{\"pitch\":1.80,\"sound\":\"mob.imitate.evocation_illager\",\"volume\":0.60},\"imitate.ghast\":{\"pitch\":1.80,\"sound\":\"mob.imitate.ghast\",\"volume\":0.70},\"imitate.guardian\":{\"pitch\":1.80,\"sound\":\"mob.imitate.guardian\",\"volume\":0.70},\"imitate.happy_ghast\":{\"pitch\":1.70,\"sound\":\"mob.imitate.happy_ghast\"},\"imitate.husk\":{\"pitch\":1.80,\"sound\":\"mob.imitate.husk\",\"volume\":0.60},\"imitate.magma_cube\":{\"pitch\":1.80,\"sound\":\"mob.imitate.magmacube\",\"volume\":0.60},\"imitate.parched\":{\"pitch\":1.70,\"sound\":\"mob.imitate.parched\",\"volume\":0.70},\"imitate.phantom\":{\"pitch\":1.50,\"sound\":\"mob.imitate.phantom\",\"volume\":0.70},\"imitate.pillager\":{\"pitch\":1.80,\"sound\":\"mob.imitate.pillager\",\"volume\":0.70},\"imitate.polar_bear\":{\"pitch\":0.80,\"sound\":\"mob.imitate.polarbear\",\"volume\":0.70},\"imitate.ravager\":{\"pitch\":1.70,\"sound\":\"mob.imitate.ravager\",\"volume\":0.70},\"imitate.shulker\":{\"pitch\":1.70,\"sound\":\"mob.imitate.shulker\",\"volume\":0.40},\"imitate.silverfish\":{\"pitch\":1.80,\"sound\":\"mob.imitate.silverfish\",\"volume\":0.70},\"imitate.skeleton\":{\"pitch\":1.70,\"sound\":\"mob.imitate.skeleton\",\"volume\":1},\"imitate.slime\":{\"pitch\":1.80,\"sound\":\"mob.imitate.slime\",\"volume\":0.60},\"imitate.spider\":{\"pitch\":1.80,\"sound\":\"mob.imitate.spider\",\"volume\":0.60},\"imitate.stray\":{\"pitch\":1.60,\"sound\":\"mob.imitate.stray\",\"volume\":0.60},\"imitate.vex\":{\"pitch\":1.60,\"sound\":\"mob.imitate.vex\",\"volume\":0.80},\"imitate.vindication_illager\":{\"pitch\":1.70,\"sound\":\"mob.imitate.vindicator\",\"volume\":0.60},\"imitate.warden\":{\"pitch\":1.80,\"sound\":\"mob.imitate.warden\",\"volume\":0.80},\"imitate.witch\":{\"pitch\":1.80,\"sound\":\"mob.imitate.witch\",\"volume\":0.50},\"imitate.wither\":{\"pitch\":1.80,\"sound\":\"mob.imitate.wither\",\"volume\":0.20},\"imitate.wither_skeleton\":{\"pitch\":1.80,\"sound\":\"mob.imitate.wither_skeleton\",\"volume\":0.70},\"imitate.wolf\":{\"pitch\":1.80,\"sound\":\"mob.imitate.wolf\",\"volume\":0.60},\"imitate.zoglin\":{\"pitch\":1.70,\"sound\":\"mob.imitate.zoglin\",\"volume\":0.70},\"imitate.zombie\":{\"pitch\":1.80,\"sound\":\"mob.imitate.zombie\",\"volume\":0.60},\"imitate.zombie_pigman\":{\"pitch\":1.80,\"sound\":\"mob.imitate.zombiepig\",\"volume\":0.40},\"imitate.zombie_villager\":{\"pitch\":1.80,\"sound\":\"mob.imitate.zombie_villager\",\"volume\":0.60},\"step\":\"mob.parrot.step\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"phantom\":{\"events\":{\"ambient\":\"mob.phantom.idle\",\"attack\":\"mob.phantom.bite\",\"death\":\"mob.phantom.death\",\"flap\":\"mob.phantom.flap\",\"hurt\":\"mob.phantom.hurt\",\"swoop\":{\"pitch\":[0.950,1.050],\"sound\":\"mob.phantom.swoop\"}},\"pitch\":[0.80,1.20],\"volume\":10.0},\"pig\":{\"events\":{\"ambient\":\"mob.pig.say\",\"boost\":\"mob.pig.boost\",\"death\":\"mob.pig.death\",\"death.to.zombie\":\"mob.pig.death\",\"eat\":\"mob.pig.eat\",\"hurt\":\"mob.pig.say\",\"step\":\"mob.pig.step\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"piglin\":{\"events\":{\"admire\":\"mob.piglin.admiring_item\",\"ambient\":\"mob.piglin.ambient\",\"angry\":\"mob.piglin.angry\",\"attack\":\"mob.piglin.attack\",\"celebrate\":\"mob.piglin.celebrate\",\"death\":\"mob.piglin.death\",\"hurt\":\"mob.piglin.hurt\",\"retreat\":\"mob.piglin.retreat\",\"step\":{\"sound\":\"mob.piglin.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"piglin_brute\":{\"events\":{\"ambient\":\"mob.piglin_brute.ambient\",\"angry\":\"mob.piglin_brute.angry\",\"death\":\"mob.piglin_brute.death\",\"hurt\":\"mob.piglin_brute.hurt\",\"step\":{\"sound\":\"mob.piglin_brute.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"pillager\":{\"events\":{\"ambient\":\"mob.pillager.idle\",\"ambient.in.raid\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.pillager.idle\",\"volume\":3.0},\"celebrate\":\"mob.pillager.celebrate\",\"death\":\"mob.pillager.death\",\"hurt\":\"mob.pillager.hurt\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"player\":{\"events\":{\"attack.critical\":\"game.player.attack.critical\",\"attack.nodamage\":\"game.player.attack.nodamage\",\"attack.strong\":\"game.player.attack.strong\",\"death\":\"game.player.die\",\"death.in.water\":\"game.player.die\",\"elderguardian.curse\":{\"pitch\":1.0,\"sound\":\"mob.elderguardian.curse\",\"volume\":1.0},\"hurt\":\"game.player.hurt\",\"hurt.in.water\":\"game.player.hurt\",\"splash\":{\"pitch\":[0.60,1.40],\"sound\":\"entity.generic.splash\"},\"teleport\":\"entity.player.teleport\",\"throw\":{\"pitch\":[0.330,0.50],\"sound\":\"random.bow\",\"volume\":0.50}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"polar_bear\":{\"events\":{\"ambient\":\"mob.polarbear.idle\",\"ambient.baby\":\"mob.polarbear_baby.idle\",\"death\":\"mob.polarbear.death\",\"hurt\":{\"sound\":\"mob.polarbear.hurt\",\"volume\":0.70},\"mob.warning\":{\"pitch\":1.0,\"sound\":\"mob.polarbear.warning\",\"volume\":1.20},\"step\":{\"pitch\":1.0,\"sound\":\"mob.polarbear.step\",\"volume\":0.70}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"pufferfish\":{\"events\":{\"flop\":{\"pitch\":1.0,\"sound\":\"mob.fish.flop\",\"volume\":1.0},\"hurt\":\"mob.fish.hurt\",\"hurt.in.water\":\"mob.fish.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.fish.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"rabbit\":{\"events\":{\"ambient\":\"mob.rabbit.idle\",\"death\":\"mob.rabbit.death\",\"eat\":\"\",\"hurt\":\"mob.rabbit.hurt\"},\"pitch\":[0.80,1.20],\"volume\":0.80},\"ravager\":{\"events\":{\"ambient\":\"mob.ravager.ambient\",\"ambient.in.raid\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.ravager.ambient\",\"volume\":3.0},\"attack.strong\":\"mob.ravager.bite\",\"celebrate\":\"mob.ravager.celebrate\",\"death\":\"mob.ravager.death\",\"hurt\":\"mob.ravager.hurt\",\"roar\":\"mob.ravager.roar\",\"step\":\"mob.ravager.step\",\"stun\":\"mob.ravager.stun\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"salmon\":{\"events\":{\"flop\":{\"pitch\":1.0,\"sound\":\"mob.fish.flop\",\"volume\":1.0},\"hurt\":\"mob.fish.hurt\",\"hurt.in.water\":\"mob.fish.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.fish.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"sheep\":{\"events\":{\"ambient\":\"mob.sheep.say\",\"death\":\"mob.sheep.say\",\"eat\":\"\",\"hurt\":\"mob.sheep.say\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.sheep.step\",\"volume\":0.40}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"shulker\":{\"events\":{\"ambient\":\"mob.shulker.ambient\",\"death\":\"mob.shulker.death\",\"hurt\":\"mob.shulker.hurt\",\"shoot\":\"mob.shulker.shoot\",\"shulker.close\":\"mob.shulker.close\",\"shulker.open\":\"mob.shulker.open\",\"teleport\":\"mob.shulker.teleport\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"silverfish\":{\"events\":{\"ambient\":\"mob.silverfish.say\",\"death\":\"mob.silverfish.kill\",\"hurt\":\"mob.silverfish.hit\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.silverfish.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"skeleton\":{\"events\":{\"ambient\":\"mob.skeleton.say\",\"death\":\"mob.skeleton.death\",\"hurt\":{\"sound\":\"mob.skeleton.hurt\",\"volume\":0.70},\"step\":{\"pitch\":1.0,\"sound\":\"mob.skeleton.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"skeleton_horse\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.horse.skeleton.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.horse.armor\",\"volume\":0.60},\"breathe\":{\"pitch\":1.0,\"sound\":\"mob.horse.breathe\",\"volume\":0.70},\"death\":\"mob.horse.skeleton.death\",\"hurt\":\"mob.horse.skeleton.hit\",\"jump\":{\"pitch\":1.0,\"sound\":\"mob.horse.jump\",\"volume\":0.40},\"land\":{\"pitch\":1.0,\"sound\":\"mob.horse.land\",\"volume\":0.40},\"saddle\":{\"pitch\":1.0,\"sound\":\"mob.horse.leather\",\"volume\":0.60}},\"pitch\":[0.80,1.20],\"volume\":0.80},\"slime\":{\"events\":{\"ambient\":\"\",\"attack\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.attack\"},\"death\":\"mob.slime.small\",\"hurt\":\"mob.slime.small\",\"squish.big\":{\"pitch\":[0.640,0.960],\"sound\":\"mob.slime.big\"},\"squish.small\":{\"pitch\":[0.640,0.960],\"sound\":\"mob.slime.small\"}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"sniffer\":{\"events\":{\"ambient\":\"mob.sniffer.idle\",\"death\":\"mob.sniffer.death\",\"eat\":\"mob.sniffer.eat\",\"hurt\":\"mob.sniffer.hurt\",\"plop\":\"mob.sniffer.plop\",\"step\":\"mob.sniffer.step\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"snow_golem\":{\"events\":{\"death\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.snowgolem.death\"},\"hurt\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.snowgolem.hurt\"},\"shoot\":{\"pitch\":[0.330,0.50],\"sound\":\"mob.snowgolem.shoot\"}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"spider\":{\"events\":{\"ambient\":\"mob.spider.say\",\"death\":\"mob.spider.death\",\"hurt\":\"mob.spider.say\",\"step\":{\"pitch\":[0.90,1.10],\"sound\":\"mob.spider.step\",\"volume\":0.350}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"squid\":{\"events\":{\"ambient\":\"mob.squid.ambient\",\"death\":\"mob.squid.death\",\"hurt\":\"mob.squid.hurt\"},\"pitch\":[0.80,1.20],\"volume\":0.40},\"stray\":{\"events\":{\"ambient\":\"mob.stray.ambient\",\"death\":\"mob.stray.death\",\"hurt\":\"mob.stray.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.stray.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"strider\":{\"events\":{\"ambient\":\"mob.strider.idle\",\"death\":\"mob.strider.death\",\"eat\":\"mob.strider.eat\",\"hurt\":\"mob.strider.hurt\",\"panic\":\"mob.strider.panic\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.strider.step\",\"volume\":0.250},\"step_lava\":{\"pitch\":1.0,\"sound\":\"mob.strider.step_lava\",\"volume\":0.20},\"tempt\":\"mob.strider.tempt\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"tadpole\":{\"events\":{\"death\":\"mob.tadpole.death\",\"flop\":{\"pitch\":1.0,\"sound\":\"mob.fish.flop\",\"volume\":1.0},\"hurt\":\"mob.tadpole.hurt\"},\"pitch\":[0.80,1.20],\"volume\":1},\"trader_llama\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.llama.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.llama.swag\",\"volume\":0.50},\"death\":\"mob.llama.death\",\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.llama.eat\",\"volume\":[0.50,1.50]},\"hurt\":\"mob.llama.hurt\",\"mad\":\"mob.llama.angry\",\"shoot\":\"mob.llama.spit\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.llama.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":0.80},\"tropicalfish\":{\"events\":{\"flop\":{\"pitch\":1.0,\"sound\":\"mob.fish.flop\",\"volume\":1.0},\"hurt\":\"mob.fish.hurt\",\"hurt.in.water\":\"mob.fish.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.fish.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"turtle\":{\"events\":{\"ambient\":\"mob.turtle.ambient\",\"born\":{\"pitch\":1.0,\"sound\":\"mob.turtle_baby.born\",\"volume\":1.0},\"death\":\"mob.turtle.death\",\"death.baby\":\"mob.turtle_baby.death\",\"eat\":\"\",\"hurt\":\"mob.turtle.hurt\",\"hurt.baby\":\"mob.turtle_baby.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.turtle.step\",\"volume\":1.0},\"step.baby\":{\"pitch\":1.0,\"sound\":\"mob.turtle_baby.step\",\"volume\":1.0},\"swim\":{\"pitch\":[0.60,1.40],\"sound\":\"mob.turtle.swim\"}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"vex\":{\"events\":{\"ambient\":\"mob.vex.ambient\",\"charge\":\"mob.vex.charge\",\"death\":\"mob.vex.death\",\"hurt\":\"mob.vex.hurt\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"villager\":{\"events\":{\"ambient\":\"mob.villager.idle\",\"death\":\"mob.villager.death\",\"death.to.zombie\":\"mob.villager.death\",\"haggle\":\"mob.villager.haggle\",\"haggle.no\":\"mob.villager.no\",\"haggle.yes\":\"mob.villager.yes\",\"hurt\":\"mob.villager.hit\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"villager_v2\":{\"events\":{\"ambient\":\"mob.villager.idle\",\"death\":\"mob.villager.death\",\"death.to.zombie\":\"mob.villager.death\",\"haggle\":\"mob.villager.haggle\",\"haggle.no\":\"mob.villager.no\",\"haggle.yes\":\"mob.villager.yes\",\"hurt\":\"mob.villager.hit\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"vindicator\":{\"events\":{\"ambient\":\"mob.vindicator.idle\",\"ambient.in.raid\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.vindicator.idle\",\"volume\":3.0},\"celebrate\":\"mob.vindicator.celebrate\",\"death\":\"mob.vindicator.death\",\"hurt\":\"mob.vindicator.hurt\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"wandering_trader\":{\"events\":{\"ambient\":\"mob.wanderingtrader.idle\",\"death\":\"mob.wanderingtrader.death\",\"disappeared\":\"mob.wanderingtrader.disappeared\",\"drink\":\"mob.wanderingtrader.drink_potion\",\"drink.milk\":\"mob.wanderingtrader.drink_milk\",\"haggle\":\"mob.wanderingtrader.haggle\",\"haggle.no\":\"mob.wanderingtrader.no\",\"haggle.yes\":\"mob.wanderingtrader.yes\",\"hurt\":\"mob.wanderingtrader.hurt\",\"reappeared\":\"mob.wanderingtrader.reappeared\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"warden\":{\"events\":{\"agitated\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.agitated\",\"volume\":10.0},\"ambient\":\"mob.warden.idle\",\"angry\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.angry\",\"volume\":10.0},\"attack\":{\"pitch\":1.0,\"sound\":\"mob.warden.attack\",\"volume\":10.0},\"death\":{\"pitch\":[0.80,1.0],\"sound\":\"mob.warden.death\",\"volume\":1.0},\"heartbeat\":{\"pitch\":1.0,\"sound\":\"mob.warden.heartbeat\",\"volume\":5.0},\"hurt\":{\"pitch\":[0.80,1.0],\"sound\":\"mob.warden.hurt\",\"volume\":1.0},\"listening\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.listening\",\"volume\":10.0},\"listening_angry\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.listening_angry\",\"volume\":10.0},\"nearby_close\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.nearby_close\",\"volume\":5.0},\"nearby_closer\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.nearby_closer\",\"volume\":5.0},\"nearby_closest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.warden.nearby_closest\",\"volume\":5.0},\"roar\":{\"pitch\":1.0,\"sound\":\"mob.warden.roar\",\"volume\":10.0},\"step\":{\"pitch\":1.0,\"sound\":\"mob.warden.step\",\"volume\":10.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"witch\":{\"events\":{\"ambient\":\"mob.witch.ambient\",\"ambient.in.raid\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.witch.ambient\",\"volume\":3.0},\"celebrate\":\"mob.witch.celebrate\",\"death\":\"mob.witch.death\",\"drink\":{\"pitch\":1.0,\"sound\":\"mob.witch.drink\",\"volume\":1.0},\"hurt\":\"mob.witch.hurt\",\"throw\":{\"pitch\":1.0,\"sound\":\"mob.witch.throw\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"wither\":{\"events\":{\"ambient\":\"mob.wither.ambient\",\"break.block\":{\"pitch\":1.0,\"sound\":\"mob.wither.break_block\",\"volume\":1.0},\"death\":\"mob.wither.death\",\"death.mid.volume\":{\"sound\":\"mob.wither.death\",\"volume\":0.750},\"death.min.volume\":{\"sound\":\"mob.wither.death\",\"volume\":0.50},\"hurt\":\"mob.wither.hurt\",\"shoot\":{\"pitch\":1.0,\"sound\":\"mob.wither.shoot\",\"volume\":3.0},\"spawn\":{\"pitch\":1.0,\"sound\":\"mob.wither.spawn\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"wither_skeleton\":{\"events\":{\"ambient\":{\"pitch\":[0.80,1.20],\"sound\":\"entity.wither_skeleton.ambient\",\"volume\":1.0},\"death\":{\"pitch\":[0.80,1.20],\"sound\":\"entity.wither_skeleton.death\",\"volume\":1.0},\"hurt\":{\"pitch\":[0.80,1.20],\"sound\":\"entity.wither_skeleton.hurt\",\"volume\":1.0},\"step\":{\"pitch\":1.0,\"sound\":\"entity.wither_skeleton.step\",\"volume\":1.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"wolf\":{\"events\":{\"ambient\":\"mob.wolf.bark\",\"death\":\"mob.wolf.death\",\"eat\":\"\",\"growl\":\"mob.wolf.growl\",\"hurt\":\"mob.wolf.hurt\",\"hurt.reduced\":\"armor.damage_wolf\",\"pant\":\"mob.wolf.panting\",\"shake\":\"mob.wolf.shake\",\"step\":\"mob.wolf.step\",\"whine\":\"mob.wolf.whine\"},\"pitch\":[0.80,1.20],\"volume\":1.0},\"xp_orb\":{\"events\":{\"fizz\":{\"pitch\":[2.0,2.40],\"sound\":\"random.fizz\",\"volume\":0.40}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"zoglin\":{\"events\":{\"ambient\":\"mob.zoglin.idle\",\"angry\":\"mob.zoglin.angry\",\"attack\":\"mob.zoglin.attack\",\"death\":\"mob.zoglin.death\",\"hurt\":\"mob.zoglin.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.zoglin.step\",\"volume\":0.150}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"zombie\":{\"events\":{\"ambient\":\"mob.zombie.say\",\"death\":\"mob.zombie.death\",\"hurt\":\"mob.zombie.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.zombie.step\",\"volume\":0.450}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"zombie_horse\":{\"events\":{\"add.chest\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.armor\",\"volume\":1.0},\"ambient\":\"mob.horse.zombie.idle\",\"armor\":{\"pitch\":1.0,\"sound\":\"mob.horse.armor\",\"volume\":0.60},\"breathe\":{\"pitch\":1.0,\"sound\":\"mob.horse.breathe\",\"volume\":0.70},\"death\":\"mob.horse.zombie.death\",\"eat\":{\"pitch\":[0.80,1.20],\"sound\":\"mob.horse.eat\",\"volume\":[0.50,1.50]},\"hurt\":\"mob.horse.zombie.hit\",\"jump\":{\"pitch\":1.0,\"sound\":\"mob.horse.jump\",\"volume\":0.40},\"land\":{\"pitch\":1.0,\"sound\":\"mob.horse.land\",\"volume\":0.40},\"mad\":\"mob.horse.zombie.angry\",\"saddle\":{\"pitch\":1.0,\"sound\":\"mob.horse.leather\",\"volume\":0.60}},\"pitch\":[0.80,1.20],\"volume\":0.80},\"zombie_nautilus\":{\"events\":{\"ambient\":\"mob.zombie_nautilus.ambient\",\"ambient.in.water\":\"mob.zombie_nautilus.ambient.in.water\",\"armor.unequip_generic\":\"mob.nautilus.armor_unequip\",\"dash_ready\":\"mob.zombie_nautilus.dash_ready\",\"death\":\"mob.zombie_nautilus.death\",\"death.in.water\":\"mob.zombie_nautilus.death.in.water\",\"eat\":\"mob.zombie_nautilus.eat\",\"hurt\":\"mob.zombie_nautilus.hurt\",\"hurt.in.water\":\"mob.zombie_nautilus.hurt.in.water\",\"saddle\":\"mob.nautilus.saddle\",\"saddle_in_water\":\"mob.nautilus.saddle_underwater\",\"swim\":\"mob.zombie_nautilus.swim\",\"unsaddle\":\"mob.unsaddle\"},\"pitch\":1.0,\"volume\":3.0},\"zombie_pigman\":{\"events\":{\"ambient\":\"mob.zombiepig.zpig\",\"death\":\"mob.zombiepig.zpigdeath\",\"hurt\":\"mob.zombiepig.zpighurt\",\"mad\":{\"pitch\":[1.440,2.160],\"sound\":\"mob.zombiepig.zpigangry\",\"volume\":2.0}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"zombie_villager\":{\"events\":{\"ambient\":\"mob.zombie_villager.say\",\"death\":\"mob.zombie_villager.death\",\"hurt\":\"mob.zombie_villager.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.zombie.step\",\"volume\":0.450}},\"pitch\":[0.80,1.20],\"volume\":1.0},\"zombie_villager_v2\":{\"events\":{\"ambient\":\"mob.zombie_villager.say\",\"death\":\"mob.zombie_villager.death\",\"hurt\":\"mob.zombie_villager.hurt\",\"step\":{\"pitch\":1.0,\"sound\":\"mob.zombie.step\",\"volume\":0.450}},\"pitch\":[0.80,1.20],\"volume\":1.0}}}}'},6662:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,'\\ndialog#minecraft_entity_wizard {\\n\\t\\tmax-width: 100%;\\n}\\ndialog#minecraft_entity_wizard .dialog_handle  {\\n\\t\\tmargin-bottom: 0;\\n}\\ndialog#minecraft_entity_wizard .button_bar  {\\n\\t\\tdisplay: none;\\n}\\n#entity_wizard_wrapper {\\n\\t\\tdisplay: flex;\\n\\t\\tmin-height: 460px;\\n\\t\\tposition: relative;\\n\\t\\t--color-subtle_text: #91949C;\\n}\\n#entity_wizard_start_page {\\n\\t\\ttext-align: center;\\n\\t\\twidth: 100%;\\n\\t\\tpadding: 12px 20px;\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-size: cover;\\n\\t\\tbackground-position: center;\\n\\t\\timage-rendering: auto;\\n}\\n#entity_wizard_start_page > div {\\n\\t\\tdisplay: inline-block;\\n}\\n#entity_wizard_start_page > img {\\n\\t\\tdisplay: inline-block;\\n\\t\\tvertical-align: middle;\\n\\t\\tmargin-left: 16px;\\n\\t\\tmargin-top: 16px;\\n\\t\\tmargin-bottom: -8px;\\n\\t\\tmargin-right: -56px;\\n}\\n#entity_wizard_start_page section {\\n\\t\\tmax-width: 480px;\\n\\t\\tpadding: 0 20px;\\n\\t\\tmargin: auto;\\n}\\n#entity_wizard_start_page #entity_wizard_start_button {\\n\\t\\tbackground-color: var(--color-accent);\\n\\t\\tcolor: var(--color-light);\\n\\t\\theight: 40px;\\n\\t\\twidth: 128px;\\n}\\n#entity_wizard_sidebar {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tflex: 0 0 160px;\\n\\t\\tpadding: 16px 0;\\n\\t\\tposition: relative;\\n}\\n@media (max-device-width: 640px) {\\n#entity_wizard_sidebar {\\n\\t\\t\\tdisplay: none;\\n}\\n}\\n#entity_wizard_sidebar li {\\n\\t\\twidth: 100%;\\n\\t\\tpadding: 6px 20px;\\n\\t\\tborder-left: 4px solid transparent;\\n\\t\\tcursor: pointer;\\n}\\n#entity_wizard_sidebar li:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n#entity_wizard_sidebar li.selected {\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\tborder-left: 4px solid var(--color-accent);\\n}\\n#entity_wizard_sidebar .entity_wizard_documentation {\\n\\t\\tposition: absolute;\\n\\t\\tbottom: 10px;\\n\\t\\tpadding: 8px;\\n}\\n.entity_wizard_documentation a {\\n\\t\\ttext-decoration: none;\\n}\\n.entity_wizard_documentation a i {\\n\\t\\tdisplay: inline;\\n\\t\\tvertical-align: text-bottom;\\n\\t\\tpointer-events: none;\\n}\\n.entity_wizard_documentation a span {\\n\\t\\ttext-decoration: underline;\\n\\t\\tpointer-events: none;\\n}\\n#entity_wizard_page {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tflex-grow: 1;\\n\\t\\tpadding: 5px 20px;\\n}\\n#entity_wizard_page > content {\\n\\t\\tflex-grow: 1;\\n}\\n#entity_wizard_navigation {\\n\\t\\tflex: 40px 0 0;\\n\\t\\tpadding: 8px;\\n\\t\\tdisplay: flex;\\n}\\n#entity_wizard_back_button {\\n\\t\\tpadding: 5px;\\n    \\theight: 32px;\\n\\t\\tcursor: pointer;\\n}\\n#entity_wizard_back_button:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n#entity_wizard_navigation .bar_spacer {\\n\\t\\tflex-grow: 1;\\n}\\n#entity_wizard_next_button {\\n\\t\\tbackground-color: var(--color-accent);\\n\\t\\tcolor: var(--color-light);\\n\\t\\twidth: 112px;\\n\\t\\tmargin-right: 4px;\\n}\\n\\n\\t/* Required */\\n#entity_wizard_page #required_message {\\n\\t\\tpadding-top: 5px;\\n\\t\\tpadding-left: 16px;\\n}\\n#entity_wizard_page #required_message::before, #entity_wizard_page label.required::after {\\n\\t\\tcontent: \"*\";\\n\\t\\tfont-size: 1.2em;\\n\\t\\tline-height: 0;\\n\\t\\tvertical-align: inherit;\\n\\t\\tcolor: var(--color-accent);\\n}\\n#minecraft_entity_wizard section {\\n\\t\\tpadding-top: 16px;\\n}\\n#minecraft_entity_wizard p {\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tline-height: normal;\\n}\\n#minecraft_entity_wizard input[type=text], #minecraft_entity_wizard input[type=number] {\\n\\t\\tdisplay: block;\\n\\t\\twidth: 100%;\\n\\t\\theight: auto;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 4px 8px;\\n\\t\\tborder-radius: 5px;\\n}\\n.entity_wizard_target_selection {\\n\\t\\tposition: absolute;\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\ttop: 8px;\\n\\t\\tright: 20px;\\n\\t\\tmin-width: 156px;\\n}\\n#entity_wizard_id_error {\\n\\t\\tposition: absolute;\\n\\t\\tright: 28px;\\n\\t\\tmargin-top: -28px;\\n}\\n#entity_wizard_id_error:hover .entity_wizard_tooltip {\\n\\t\\tdisplay: block;\\n    \\tvisibility: visible;\\n\\t\\tmargin: 0;\\n    \\tright: -5px;\\n}\\nul.entity_wizard_mob_list {\\n\\t\\tmax-height: 360px;\\n\\t\\twidth: 100%;\\n\\t\\toverflow-y: scroll;\\n}\\nul.entity_wizard_mob_list > li {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tposition: relative;\\n\\t\\tfloat: left;\\n\\t\\twidth: 122px;\\n\\t\\theight: 90px;\\n\\t\\tmargin: 2px;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder-radius: 5px;\\n\\t\\tcursor: pointer;\\n\\t\\tbox-sizing: content-box;\\n\\t\\tborder: 1px solid transparent;\\n\\t\\tbackground-size: 96px;\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position: 12px 3px;\\n\\t\\timage-rendering: auto;\\n}\\nul.entity_wizard_mob_list > li:hover {\\n\\t\\tbackground-color: var(--color-selected);\\n\\t\\tcolor: var(--color-light);\\n}\\nul.entity_wizard_mob_list > li.selected {\\n\\t\\t    border-color: var(--color-accent);\\n}\\nul.entity_wizard_mob_list > li.selected::after {\\n\\t\\tposition: absolute;\\n\\t\\tcontent: \"\\\\f00c\";\\n\\t\\tfont-family: \\'Font Awesome 6 Free\\';\\n\\t\\tfont-weight: 600;\\n\\t\\tcolor: var(--color-accent);\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\theight: 19px;\\n\\t\\ttop: -8px;\\n\\t\\tright: -4px;\\n\\t\\tborder-bottom-left-radius: 8px;\\n\\t\\tpadding-left: 2px;\\n}\\nul.entity_wizard_mob_list > li label {\\n\\t\\ttext-align: center;\\n\\t\\twidth: 100%;\\n\\t\\tmargin-top: auto;\\n\\t\\tpointer-events: none;\\n}\\n#entity_wizard_page input[type=\"radio\"] {\\n\\t\\tvertical-align: middle;\\n\\t\\tmargin-top: -4px;\\n\\t\\tmargin-right: 6px;\\n}\\n#entity_wizard_page code.code {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 1px;\\n}\\n.dialogue_designer_icon {\\n\\t\\tvertical-align: middle;\\n\\t\\tmargin-bottom: 1px;\\n\\t\\tmargin-right: 2px;\\n}\\n#entity_wizard_launch_vscode img {\\n\\t\\tvertical-align: top;\\n\\t\\tmargin-right: 4px;\\n}\\n\\n',\"\"]);const r=o},4457:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,\"\\n#entity_wizard_egg_color_preview {\\n\\theight: 64px;\\n\\twidth: 64px;\\n\\tbackground-color: var(--color-back);\\n}\\n#entity_wizard_egg_color_preview canvas {\\n\\theight: 100%;\\n\\twidth: 100%;\\n}\\n\",\"\"]);const r=o},7691:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,\"\\n#entity_wizard_export_options {\\n\\tdisplay: grid;\\n\\tgrid-template-columns: auto auto;\\n\\tgrid-gap: 10px;\\n\\tmin-height: 125px;\\n}\\n.entity_wizard_export_option {\\n\\tdisplay: inline-block;\\n\\tborder: 1px solid;\\n\\tborder-bottom: 10px solid;\\n\\tpadding: 12px;\\n\\tbackground-color: var(--color-back);\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n.entity_wizard_export_option:hover {\\n\\tbackground-color: var(--color-button);\\n}\\n.entity_wizard_export_option:not(.selected) {\\n\\tborder-top-color: transparent !important;\\n\\tborder-left-color: transparent !important;\\n\\tborder-right-color: transparent !important;\\n}\\n.entity_wizard_export_option > h3 {\\n\\tmargin: 0;\\n}\\n#entity_wizard_pack_list li {\\n\\tdisplay: inline-block;\\n\\twidth: min(100%, 254px);\\n\\toverflow: hidden;\\n\\tpadding: 4px;\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n#entity_wizard_pack_list li:hover {\\n\\tcolor: var(--color-light);\\n}\\n#entity_wizard_pack_list li.selected {\\n\\tbackground-color: var(--color-accent);\\n\\tcolor: var(--color-accent_text);\\n}\\n#entity_wizard_pack_list li img, #entity_wizard_pack_list li div {\\n\\tdisplay: inline-block;\\n\\theight: 32px;\\n\\twidth: 32px;\\n\\tbackground-color: var(--color-back);\\n\\tvertical-align: middle;\\n\\tmargin-right: 2px;\\n}\\n#entity_wizard_pack_list li > i {\\n\\tvertical-align: middle;\\n\\tpadding: 5px;\\n\\tmax-width: unset;\\n}\\n\",\"\"]);const r=o},9966:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,\"\\n.entity_wizard_icon_picker {\\n\\t\\tdisplay: flex;\\n}\\n.entity_wizard_icon_picker label {\\n\\t\\tpadding: 3px;\\n}\\n.entity_wizard_icon_picker > .icon_picker_left {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tmargin-right: 8px;\\n\\t\\theight: 64px;\\n\\t\\twidth: 64px;\\n}\\n.entity_wizard_icon_picker > .icon_picker_right {\\n\\t\\theight: 24px;\\n    \\tcursor: pointer;\\n}\\n.entity_wizard_icon_picker > .icon_picker_right label {\\n    \\tcursor: inherit;\\n}\\n.entity_wizard_icon_picker > .icon_picker_right:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n.entity_wizard_icon_picker > .icon_picker_right i.icon {\\n\\t\\tvertical-align: text-bottom;\\n}\\n\",\"\"]);const r=o},8627:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,'\\n#entity_wizard_loot_list {\\n\\tmargin: 6px -6px;\\n\\toverflow-y: auto;\\n\\tbackground: var(--color-back);\\n\\tmin-height: 20px;\\n}\\n#entity_wizard_loot_list > li {\\n\\tmargin: 10px;\\n\\tpadding: 10px;\\n\\tbackground: var(--color-ui);\\n\\ttext-align: right;\\n}\\n#entity_wizard_loot_list > li > p {\\n\\ttext-align: left;\\n}\\n#entity_wizard_loot_item_list {\\n\\tmargin: 6px 0;\\n}\\n#entity_wizard_loot_item_list > li {\\n\\tdisplay: flex;\\n\\tpadding: 3px 0;\\n}\\n#entity_wizard_loot_item_list > li > bb-select {\\n\\twidth: 335px;\\n}\\n#entity_wizard_loot_item_list > li > input[type=\"text\"] {\\n\\twidth: 60%;\\n}\\n#entity_wizard_loot_item_list > li > .tool {\\n\\tflex-shrink: 0;\\n}\\n#entity_wizard_loot_item_list > li > label {\\n\\tpadding-left: 14px;\\n\\tpadding-right: 4px;\\n\\tmargin-left: auto;\\n\\tpadding-top: 2px;\\n\\twhite-space: nowrap;\\n}\\n#entity_wizard_loot_item_list > li > input {\\n\\theight: 30px;\\n}\\n\\n',\"\"]);const r=o},7983:(e,t,a)=>{\"use strict\";a.d(t,{A:()=>r});var i=a(6314),o=a.n(i)()((function(e){return e[1]}));o.push([e.id,\"\\n#entity_wizard_egg_color_bar {\\n\\tdisplay: flex;\\n}\\n#entity_wizard_egg_color_preview {\\n\\tmargin: 8px;\\n\\tmargin-left: 0;\\n}\\n\",\"\"]);const r=o},6314:e=>{\"use strict\";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?\"@media \".concat(t[2],\" {\").concat(a,\"}\"):a})).join(\"\")},t.i=function(e,a,i){\"string\"==typeof e&&(e=[[null,e,\"\"]]);var o={};if(i)for(var r=0;r<this.length;r++){var n=this[r][0];null!=n&&(o[n]=!0)}for(var m=0;m<e.length;m++){var s=[].concat(e[m]);i&&o[s[0]]||(a&&(s[2]?s[2]=\"\".concat(a,\" and \").concat(s[2]):s[2]=a),t.push(s))}},t}},5072:(e,t,a)=>{\"use strict\";var i,o=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function n(e){for(var t=-1,a=0;a<r.length;a++)if(r[a].identifier===e){t=a;break}return t}function m(e,t){for(var a={},i=[],o=0;o<e.length;o++){var m=e[o],s=t.base?m[0]+t.base:m[0],l=a[s]||0,A=\"\".concat(s,\" \").concat(l);a[s]=l+1;var c=n(A),d={css:m[1],media:m[2],sourceMap:m[3]};-1!==c?(r[c].references++,r[c].updater(d)):r.push({identifier:A,updater:g(d,t),references:1}),i.push(A)}return i}function s(e){var t=document.createElement(\"style\"),i=e.attributes||{};if(void 0===i.nonce){var r=a.nc;r&&(i.nonce=r)}if(Object.keys(i).forEach((function(e){t.setAttribute(e,i[e])})),\"function\"==typeof e.insert)e.insert(t);else{var n=o(e.insert||\"head\");if(!n)throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");n.appendChild(t)}return t}var l,A=(l=[],function(e,t){return l[e]=t,l.filter(Boolean).join(\"\\n\")});function c(e,t,a,i){var o=a?\"\":i.media?\"@media \".concat(i.media,\" {\").concat(i.css,\"}\"):i.css;if(e.styleSheet)e.styleSheet.cssText=A(t,o);else{var r=document.createTextNode(o),n=e.childNodes;n[t]&&e.removeChild(n[t]),n.length?e.insertBefore(r,n[t]):e.appendChild(r)}}function d(e,t,a){var i=a.css,o=a.media,r=a.sourceMap;if(o?e.setAttribute(\"media\",o):e.removeAttribute(\"media\"),r&&\"undefined\"!=typeof btoa&&(i+=\"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r)))),\" */\")),e.styleSheet)e.styleSheet.cssText=i;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(i))}}var p=null,u=0;function g(e,t){var a,i,o;if(t.singleton){var r=u++;a=p||(p=s(t)),i=c.bind(null,a,r,!1),o=c.bind(null,a,r,!0)}else a=s(t),i=d.bind(null,a,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(a)};return i(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;i(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||\"boolean\"==typeof t.singleton||(t.singleton=(void 0===i&&(i=Boolean(window&&document&&document.all&&!window.atob)),i));var a=m(e=e||[],t);return function(e){if(e=e||[],\"[object Array]\"===Object.prototype.toString.call(e)){for(var i=0;i<a.length;i++){var o=n(a[i]);r[o].references--}for(var s=m(e,t),l=0;l<a.length;l++){var A=n(a[l]);0===r[A].references&&(r[A].updater(),r.splice(A,1))}a=s}}}},2395:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(6662);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},2694:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(4457);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},1083:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(7691);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},4769:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(9966);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},742:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(8627);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},4737:(e,t,a)=>{\"use strict\";a.r(t);var i=a(5072),o=a.n(i),r=a(7983);o()(r.A,{insert:\"head\",singleton:!1}),r.A.locals},5317:e=>{\"use strict\";e.exports=require(\"child_process\")},9896:e=>{\"use strict\";e.exports=require(\"fs\")},857:e=>{\"use strict\";e.exports=require(\"os\")}},t={};function a(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={id:i,exports:{}};return e[i](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var i in t)a.o(t,i)&&!a.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.nc=void 0,(()=>{\"use strict\";var e=function(){var e=this,t=e._self._c;return t(\"div\",{attrs:{id:\"entity_wizard_wrapper\"}},[\"start\"==e.open_page?[t(\"div\",{style:{backgroundImage:`url('${e.start_page_background}')`},attrs:{id:\"entity_wizard_start_page\"}},[t(\"div\",[t(\"h2\",[e._v(\"Create your Entity!\")]),e._v(\" \"),e._m(0),e._v(\" \"),e._m(1),e._v(\" \"),t(\"section\",[t(\"button\",{attrs:{id:\"entity_wizard_start_button\"},on:{click:function(t){e.open_page=\"metadata\"}}},[e._v(\"Let's Go!\")]),e._v(\" \"),t(\"button\",{staticClass:\"cancel_btn\",staticStyle:{display:\"none\"},on:{click:function(t){return e.cancel(t,!0)}}},[e._v(\"Cancel\")])])]),e._v(\" \"),t(\"img\",{staticStyle:{\"image-rendering\":\"auto\"},attrs:{src:e.start_page_image,width:\"280px\"}})])]:[t(\"ul\",{attrs:{id:\"entity_wizard_sidebar\"}},[e._l(e.pages,(function(a,i){return t(\"li\",{key:i,class:{selected:e.open_page==i},on:{click:function(t){return e.switchPage(i)}}},[e._v(e._s(a.name))])})),e._v(\" \"),e._m(2)],2),e._v(\" \"),t(\"div\",{attrs:{id:\"entity_wizard_page\"}},[t(\"h2\",[e._v(e._s(e.pages[e.open_page].name))]),e._v(\" \"),\"metadata\"==e.open_page?t(\"div\",{staticClass:\"entity_wizard_target_selection\"},[t(\"p\",{staticClass:\"description\"},[e._v(\"Game Variant\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,\"edition\",t)},expression:\"form.edition\"}})],1):e._e(),e._v(\" \"),\"metadata\"==e.open_page?t(\"content\",[t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Display Name\")]),e._v(\" \"),t(\"p\",[e._v(\"The display name will be visible to players in-game.\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.display_name,expression:\"form.display_name\"}],attrs:{type:\"text\",placeholder:\"Red Panda\"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,\"display_name\",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(\" \"),t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Identifier\")]),e._v(\" \"),t(\"p\",[e._v(\"The identifier is used internally in the addon to identify this entity type.\\n\\t\\t\\t\\t\\t\\tAn identifier consists of the namespace and the entity name, separated by a colon.\\n\\t\\t\\t\\t\\t\\tThe namespace should be a short and unique version of your name or the name of your addon.\\n\\t\\t\\t\\t\\t\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.identifier,expression:\"form.identifier\"}],attrs:{type:\"text\",placeholder:\"myname:red_panda\"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,\"identifier\",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(\" \"),e.identifier_error?t(\"div\",{attrs:{id:\"entity_wizard_id_error\"}},[t(\"i\",{staticClass:\"material-icons\",staticStyle:{color:\"#ff415b\"}},[e._v(\"error\")]),e._v(\" \"),t(\"div\",{staticClass:\"entity_wizard_tooltip tooltip\"},[e._v(e._s(e.identifier_error))])]):e._e()])]):e._e(),e._v(\" \"),\"appearance\"==e.open_page?t(\"content\",[e._m(3),e._v(\" \"),t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Mob\")]),e._v(\" \"),t(\"search-bar\",{staticStyle:{width:\"220px\"},attrs:{placeholder:\"Search...\"},model:{value:e.appearance_search_term,callback:function(t){e.appearance_search_term=t},expression:\"appearance_search_term\"}}),e._v(\" \"),t(\"ul\",{staticClass:\"entity_wizard_mob_list\"},e._l(e.appearance_mobs,(function(a,i){return t(\"li\",{key:i,class:{selected:i==e.form.appearance},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){e.form.appearance=i}}},[t(\"label\",[e._v(e._s(a.name))])])})),0)],1)]):e._e(),e._v(\" \"),\"behavior\"==e.open_page?t(\"content\",[e._m(4),e._v(\" \"),t(\"section\",[t(\"input\",{attrs:{type:\"radio\",id:\"entity_wizard_behavior_same\",value:\"colors\"},domProps:{checked:e.form.behavior==e.form.appearance},on:{change:function(t){e.form.behavior=e.form.appearance}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"entity_wizard_behavior_same\"}},[e._v(\"Same Behavior\")]),e._v(\" \"),t(\"p\",[e._v(e._s(e.getSameBehaviorText(e.form.appearance)))])]),e._v(\" \"),t(\"section\",[t(\"input\",{attrs:{type:\"radio\",id:\"entity_wizard_behavior_different\",value:\"texture\"},domProps:{checked:e.form.behavior!=e.form.appearance},on:{change:function(t){e.form.behavior=\"basic\"==e.form.appearance?\"basic_walking\":\"basic\"}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"entity_wizard_behavior_different\"}},[e._v(\"Different Behavior\")]),e._v(\" \"),t(\"p\",[e._v(\"Use the behavior from another mob.\")]),e._v(\" \"),e._m(5),e._v(\" \"),e.form.behavior!=e.form.appearance?[t(\"label\",[e._v(\"Mob\")]),e._v(\" \"),t(\"search-bar\",{staticStyle:{width:\"220px\"},attrs:{placeholder:\"Search...\"},model:{value:e.behavior_search_term,callback:function(t){e.behavior_search_term=t},expression:\"behavior_search_term\"}}),e._v(\" \"),t(\"ul\",{staticClass:\"entity_wizard_mob_list\"},e._l(e.behavior_mobs,(function(a,i){return t(\"li\",{key:i,class:{selected:i==e.form.behavior},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){e.form.behavior=i}}},[t(\"label\",[e._v(e._s(a.name))])])})),0)]:e._e()],2)]):e._e(),e._v(\" \"),\"loot\"==e.open_page?t(\"content\",[t(\"loot-editor\",{attrs:{form:e.form,mobs:e.mobs}})],1):e._e(),e._v(\" \"),\"spawn_egg\"==e.open_page?t(\"content\",[t(\"spawn-egg\",{attrs:{form:e.form}})],1):e._e(),e._v(\" \"),\"export\"==e.open_page?t(\"content\",{attrs:{id:\"entity_wizard_export_page\"}},[t(\"export\",{attrs:{form:e.form}})],1):e._e(),e._v(\" \"),\"next_steps\"==e.open_page?t(\"content\",[t(\"section\",[\"mcaddon\"==e.form.export_mode||\"integrate_mcaddon\"==e.form.export_mode?t(\"label\",[e._v(\"The packs have now been exported to your selected destination\")]):t(\"label\",[e._v(\"The packs have now been exported into Minecraft: \"+e._s(e.edition_options[e.form.edition])+\". Enable the packs to test them.\")]),e._v(\" \"),t(\"button\",{staticStyle:{\"margin-top\":\"8px\",\"margin-bottom\":\"24px\",display:\"block\"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[t(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"help\")]),e._v(\"How do I install packs?\")]),e._v(\" \"),\"none\"==e.form.spawn_egg_mode?t(\"p\",[e._v(\"Now you can spawn your entity using the command \"),t(\"code\",{staticClass:\"code\",on:{click:function(t){return e.copySummonCommand()}}},[e._v(\"/summon \"+e._s(e.form.identifier))])]):t(\"p\",[e._v(\"Now you can find the spawn egg in the creative inventory and spawn your entity!\")])]),e._v(\" \"),\"mcaddon\"!=e.form.export_mode&&\"integrate_mcaddon\"!=e.form.export_mode?t(\"section\",[t(\"label\",[e._v(\"Let's continue editing the entity!\")]),e._v(\" \"),t(\"p\",[e._v(\"After you close this dialog, you will be able to edit the model, texture and animations in Blockbench\")]),e._v(\" \"),t(\"p\",[e._v(\"You can edit the behavior of the entity using a code editor, Visual Studio Code is recommended!\")]),e._v(\" \"),t(\"button\",{attrs:{id:\"entity_wizard_launch_vscode\"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[t(\"img\",{attrs:{src:e.VSCode.icon,width:\"22px\"}}),e._v(\"\\n\\t\\t\\t\\t\\t\\tOpen in VS Code\\n\\t\\t\\t\\t\\t\")])]):t(\"section\",[t(\"label\",[e._v(\"Now let's edit the entity model!\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"After you close this dialog, you will be able to edit the model, texture and animations in Blockbench\")]),e._v(\" \"),e._m(6)]),e._v(\" \"),\"npc\"==e.form.behavior?t(\"section\",[t(\"label\",[t(\"img\",{staticClass:\"dialogue_designer_icon\",attrs:{src:e.dialogue_designer_icon,width:\"32px\"}}),e._v(\"\\n\\t\\t\\t\\t\\t\\tCheck out \"),t(\"a\",{attrs:{href:\"https://jannisx11.github.io/dialogue-designer/\",rel:\"noopener\"}},[e._v(\"Dialogue Designer\")]),e._v(\" to create an interactive dialogue for your NPC!\\n\\t\\t\\t\\t\\t\")])]):e._e(),e._v(\" \"),e._m(7)]):e._e(),e._v(\" \"),t(\"div\",{attrs:{id:\"entity_wizard_navigation\"}},[\"metadata\"!=e.open_page?t(\"div\",{attrs:{id:\"entity_wizard_back_button\"},on:{click:function(t){return e.previousPage()}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"arrow_back\")])]):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"bar_spacer\"},[\"next_steps\"!=e.open_page&&\"spawn_egg\"!=e.open_page?t(\"div\",{attrs:{id:\"required_message\"}},[e._v(\" = Required\")]):e._e()]),e._v(\" \"),t(\"button\",{staticClass:\"confirm_btn\",attrs:{id:\"entity_wizard_next_button\"},on:{click:function(t){return e.nextPage()}}},[e._v(e._s(e.pages[e.open_page].button||\"Next\"))]),e._v(\" \"),t(\"button\",{staticClass:\"cancel_btn\",on:{click:function(t){return e.cancel(t)}}},[e._v(\"Cancel\")])])])]],2)};e._withStripped=!0;var t=a(5825),i=a.n(t),o=a(5939),r=a.n(o);const n=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAAgVBMVEUAAACWsLt4jpcCAwNJlsOSUFCESEhhNTVCiLBCiLExZIMwY4FiNTWESEgEBQVOjrSMZWiESUkwYoDX4uaZZGJiqsySUFBJlsOkwc1QnMaXXVvT3+TF1t2rxtGmw85Zo8m90dlep8uUV1ajwc2Js8pancWen6iVZWhLmMSUVFS80NiRr4FFAAAAE3RSTlMAzE0BgIDAQMDAQEBBvwJzdnBAQCJZxAAAAWxJREFUaN7t1FlOwzAUhWG3gc60DJmadGKG7n+BOLYqRz2SFR5sX8T5V/Dp3MSKMcYYY4wxxhhjjDHG2HXZeDQaZ0pKmlPrpJAMZ7/b7WWQ1pbzpLOktUpZ5jhdyVZCjgRSjyOCdMUBkooXrpNsJeRIIPU4EkjrYZwo7xKuk36lzdtrXZ/boaD2XNf1x70K1031rkmHUzuIczpozmd5qwJlQBWS/JwyNAhIfk5w0Pa4BZKH8928hAYVBZA8nDyPAAKShxMFBCQPJxoISciJCEISciKDkAScuCAkAScuCEmOkwSEpAtHAMiSLEcIqHjuQHlOEEF/EfR1/B2oKYOCNlXVIyEIOboHFbDFrE9CEHImUxW2pSMhCDkrFb7F3JEABJwYZbCSAeGxMhU8XMmBUqyDJAQZzt1Uxc8dzoFC/lnDV3Igu85KRQ5XMqAm0bGQZNIW+ymnzxyuErHOpcdZB5pI4XQt56I4jDHG/lM/DvyfGkXuxs4AAAAASUVORK5CYII=\";var m=a(4462),s=a.n(m);const l=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABZElEQVR4Xu2XPUpDQRSF54GgkN48iARFIVtI7yJcgpsxFqZKlRXYuYiQOo0QyA8GXsQ2hZUyVmkCczmNnPelvofhnPO9O5MqBX9vi81PRDIdjSPj6XX6VIUE4nD4sBzA8O6q6NjZ8iPlAHrdumh+t28IAAL4BNgB4b1UtGBODIUPYwlyC3AN8g5o/UMosnX//VP4vhmF3vb14jHiP03mL6H5s4ev0PzF7XP4Jjs+oMoBDLuXRYfO9p8pB3Bdd4rm183hL4DOTb9o/rDaphzAeW9QNP+9e08EAAF8AuyAooVx6r8AS7Dt16CCj4NWWiAEYJAABBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+AzEEGJQoWYAAKT4DMQQYlChZgAApPgMxBBiUKFmAACk+A3HrCfgFq4gYUP/zkAUAAAAASUVORK5CYII=\";var A=a(2813),c=a.n(A),d=a(4815),p=a.n(d),u=a(8397),g=a.n(u),h=a(4384),f=a.n(h),_=a(1568),b=a.n(_),v=a(6040),y=a.n(v),w=a(5154),B=a.n(w),k=a(2711),C=a.n(k),Q=a(1333),E=a.n(Q),I=a(1833),x=a.n(I),D=a(8965),S=a.n(D),z=a(4774),M=a.n(z),U=a(1864),R=a.n(U),j=a(487),G=a.n(j),O=a(9231),J=a.n(O),Y=a(2032),F=a.n(Y),q=a(5622),H=a.n(q),V=a(5727),K=a.n(V),N=a(4971),T=a.n(N),P=a(6600),W=a.n(P),L=a(6498),Z=a.n(L),X=a(203),ee=a.n(X),te=a(4271),ae=a.n(te),ie=a(4980),oe=a.n(ie),re=a(2902),ne=a.n(re),me=a(9868),se=a.n(me),le=a(1326),Ae=a.n(le),ce=a(859),de=a.n(ce),pe=a(4017),ue=a.n(pe),ge=a(6880),he=a.n(ge),fe=a(9446),_e=a.n(fe),be=a(2767),ve=a.n(be),ye=a(5129),we=a.n(ye),Be=a(2903),ke=a.n(Be),Ce=a(5409),Qe=a.n(Ce),Ee=a(8472),Ie=a.n(Ee),xe=a(5076),De=a.n(xe),Se=a(6010),ze=a.n(Se),Me=a(9388),Ue=a.n(Me),Re=a(9877),je=a.n(Re),Ge=a(4043),Oe=a.n(Ge),Je=a(7508),Ye=a.n(Je),Fe=a(5118),qe=a.n(Fe),He=a(6587),Ve=a.n(He),Ke=a(6609),Ne=a.n(Ke),Te=a(9407),Pe=a.n(Te),We=a(8839),Le=a.n(We),Ze=a(178),Xe=a.n(Ze),$e=a(9694),et=a.n($e),tt=a(6207),at=a.n(tt),it=a(9471),ot=a.n(it),rt=a(816),nt=a.n(rt),mt=a(9830),st=a.n(mt),lt=a(662),At=a.n(lt),ct=a(6500),dt=a.n(ct),pt=a(6169),ut=a.n(pt),gt=a(6451),ht=a.n(gt),ft=a(247),_t=a.n(ft),bt=a(4647),vt=a.n(bt),yt=a(7528),wt=a.n(yt),Bt=a(7230),kt=a.n(Bt),Ct=a(2710),Qt=a.n(Ct),Et=a(5620),It=a.n(Et),xt=a(7793),Dt=a.n(xt),St=a(1955),zt=a.n(St),Mt=a(3084),Ut=a.n(Mt),Rt=a(3730),jt=a.n(Rt),Gt=a(2059),Ot=a.n(Gt),Jt=a(8741),Yt=a.n(Jt),Ft=a(6428),qt=a.n(Ft),Ht=a(5392),Vt=a.n(Ht),Kt=a(2510),Nt=a.n(Kt),Tt=a(5491),Pt=a.n(Tt),Wt=a(5111),Lt=a.n(Wt),Zt=a(9636),Xt=a.n(Zt),$t=a(6494),ea=a.n($t),ta=a(8486),aa=a.n(ta),ia=a(4682),oa=a.n(ia),ra=a(7953),na=a.n(ra),ma=a(9693),sa=a.n(ma),la=a(331),Aa=a.n(la),ca=a(3795),da=a.n(ca),pa=a(836),ua=a.n(pa),ga=a(4730),ha=a.n(ga),fa=a(6285),_a=a.n(fa),ba=a(3185),va=a.n(ba),ya=a(6341),wa=a.n(ya),Ba=a(4597),ka=a.n(Ba),Ca=a(5225),Qa=a.n(Ca),Ea=a(7457),Ia=a.n(Ea),xa=a(8966),Da=a.n(xa),Sa=a(3684),za=a.n(Sa),Ma=a(9930),Ua=a.n(Ma),Ra=a(7718),ja=a.n(Ra),Ga=a(1165),Oa=a.n(Ga),Ja=a(7257),Ya=a.n(Ja),Fa=a(9009),qa=a.n(Fa),Ha=a(9073),Va=a.n(Ha),Ka=a(2494),Na=a.n(Ka),Ta=a(4532),Pa=a.n(Ta),Wa=a(4188),La=a.n(Wa),Za=a(7056),Xa=a.n(Za),$a=a(1195),ei=a.n($a),ti=a(709),ai=a.n(ti),ii=a(4700),oi=a.n(ii),ri=a(216),ni=a.n(ri),mi=a(6187),si=a.n(mi),li=a(9273),Ai=a.n(li),ci=a(2548),di=a.n(ci),pi=a(7308),ui=a.n(pi),gi=a(784),hi=a.n(gi),fi=a(3626),_i=a.n(fi),bi=a(3703),vi=a.n(bi),yi=a(2797),wi=a.n(yi),Bi=a(5309),ki=a.n(Bi),Ci=a(1139),Qi=a.n(Ci),Ei=a(1538),Ii=a.n(Ei),xi=a(7514),Di=a.n(xi),Si=a(4193),zi=a.n(Si),Mi=a(1373),Ui=a.n(Mi),Ri=a(7504),ji=a.n(Ri);const Gi=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAEG0lEQVQ4EQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjmgMdwQiP4QAAAABJRU5ErkJggg==\",Oi=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAEG0lEQVQ4EQEQBO/7Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjmgMdwQiP4QAAAABJRU5ErkJggg==\";var Ji=a(4577),Yi=a.n(Ji),Fi=a(8387),qi=a.n(Fi),Hi=a(910),Vi=a.n(Hi),Ki=a(2533),Ni=a.n(Ki),Ti=a(1613),Pi=a.n(Ti),Wi=a(7399),Li=a.n(Wi),Zi=a(7010),Xi=a.n(Zi),$i=a(6046),eo=a.n($i),to=a(9509),ao=a.n(to),io=a(8985),oo=a.n(io),ro=a(4010),no=a.n(ro),mo=a(5100),so=a.n(mo),lo=a(4627),Ao=a.n(lo),co=a(2109),po=a.n(co),uo=a(5580),go=a.n(uo),ho=a(9296),fo=a.n(ho),_o=a(65),bo=a.n(_o),vo=a(4037),yo=a.n(vo),wo=a(1566),Bo=a.n(wo),ko=a(7720),Co=a.n(ko),Qo=a(3373),Eo=a.n(Qo),Io=a(6243),xo=a.n(Io),Do=a(7111),So=a.n(Do),zo=a(8003),Mo=a.n(zo),Uo=a(4784),Ro=a.n(Uo),jo=a(5802),Go=a.n(jo),Oo=a(4528),Jo=a.n(Oo),Yo=a(2688),Fo=a.n(Yo),qo=a(7615),Ho=a.n(qo),Vo=a(8207),Ko=a.n(Vo),No=a(88),To=a.n(No),Po=a(3514),Wo=a.n(Po),Lo=a(3783),Zo=a.n(Lo),Xo=a(621),$o=a.n(Xo),er=a(280),tr=a.n(er),ar=a(2592),ir=a.n(ar),or=a(2735),rr=a.n(or),nr=a(4223),mr=a.n(nr),sr=a(5937),lr=a.n(sr),Ar=a(2725),cr=a.n(Ar),dr=a(7582),pr=a.n(dr),ur=a(3832),gr=a.n(ur),hr=a(6068),fr=a.n(hr),_r=a(4750),br=a.n(_r),vr=a(4891),yr=a.n(vr),wr=a(8097),Br=a.n(wr),kr=a(4719),Cr=a.n(kr),Qr=a(1569),Er=a.n(Qr),Ir=a(5264),xr=a.n(Ir),Dr=a(4452),Sr=a.n(Dr),zr=a(9839),Mr=a.n(zr),Ur=a(1217),Rr=a.n(Ur),jr=a(952),Gr=a.n(jr),Or=a(9412),Jr=a.n(Or),Yr=a(3680),Fr=a.n(Yr),qr=a(5324),Hr=a.n(qr),Vr=a(9271),Kr=a.n(Vr),Nr=a(8539),Tr=a.n(Nr),Pr=a(8688),Wr=a.n(Pr),Lr=a(5976),Zr=a.n(Lr),Xr=a(7775),$r=a.n(Xr),en=a(1687),tn=a.n(en),an=a(9170),on=a.n(an),rn=a(3828),nn=a.n(rn),mn=a(5069),sn=a.n(mn),ln=a(1987),An=a.n(ln),cn=a(8706),dn=a.n(cn),pn=a(5722),un=a.n(pn),gn=a(9597),hn=a.n(gn),fn=a(7597),_n=a.n(fn),bn=a(1652),vn=a.n(bn),yn=a(7043),wn=a.n(yn),Bn=a(9880),kn=a.n(Bn),Cn=a(2202),Qn=a.n(Cn),En=a(936),In=a.n(En),xn=a(1546),Dn=a.n(xn),Sn=a(8575),zn=a.n(Sn),Mn=a(4541),Un=a.n(Mn),Rn=a(7815),jn=a.n(Rn),Gn=a(5701),On=a.n(Gn),Jn=a(7920),Yn=a.n(Jn),Fn=a(600),qn=a.n(Fn),Hn=a(1239),Vn=a.n(Hn),Kn=a(5373),Nn=a.n(Kn),Tn=a(9872),Pn=a.n(Tn),Wn=a(6400),Ln=a.n(Wn),Zn=a(704),Xn=a.n(Zn),$n=a(2162),em=a.n($n),tm=a(3255),am=a.n(tm),im=a(431),om=a.n(im),rm=a(6123),nm=a.n(rm),mm=a(9520),sm=a.n(mm),lm=a(4354),Am=a.n(lm),cm=a(2728),dm=a.n(cm),pm=a(8312),um=a.n(pm),gm=a(6615),hm=a.n(gm),fm=a(759),_m=a.n(fm),bm=a(9165),vm=a.n(bm),ym=a(7719),wm=a.n(ym),Bm=a(7534),km=a.n(Bm),Cm=a(2416),Qm=a.n(Cm),Em=a(1921),Im=a.n(Em),xm=a(3823),Dm=a.n(xm),Sm=a(1369),zm=a.n(Sm),Mm=a(4381),Um=a.n(Mm),Rm=a(9854),jm=a.n(Rm),Gm=a(7808),Om=a.n(Gm),Jm=a(927),Ym=a.n(Jm),Fm=a(8203),qm=a.n(Fm),Hm=a(1704),Vm=a.n(Hm),Km=a(7250),Nm=a.n(Km),Tm=a(2998),Pm=a.n(Tm),Wm=a(2482),Lm=a.n(Wm),Zm=a(969),Xm=a.n(Zm),$m=a(2869),es=a.n($m),ts=a(7359),as=a.n(ts),is=a(4931),os=a.n(is),rs=a(3904),ns=a.n(rs),ms=a(410),ss=a.n(ms),ls=a(834),As=a.n(ls),cs=a(5398),ds=a.n(cs),ps=a(8725),us=a.n(ps),gs=a(4361),hs=a.n(gs);const fs=\"data:image/png;base64,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\";var _s=a(3967),bs=a.n(_s),vs=a(9005),ys=a.n(vs),ws=a(4288),Bs=a.n(ws),ks=a(1424),Cs=a.n(ks),Qs=a(8996),Es=a.n(Qs),Is=a(5172),xs=a.n(Is),Ds=a(4021),Ss=a.n(Ds),zs=a(9807),Ms=a.n(zs),Us=a(266),Rs=a.n(Us),js=a(1654),Gs=a.n(js),Os=a(5219),Js=a.n(Os),Ys=a(3883),Fs=a.n(Ys),qs=a(3140),Hs=a.n(qs),Vs=a(1154),Ks=a.n(Vs),Ns=a(2079),Ts=a.n(Ns),Ps=a(5383),Ws=a.n(Ps),Ls=a(5936),Zs=a.n(Ls),Xs=a(46),$s=a.n(Xs),el=a(5096),tl=a.n(el),al=a(1300),il=a.n(al),ol=a(9071),rl=a.n(ol),nl=a(4179),ml=a.n(nl),sl=a(4692),ll=a.n(sl),Al=a(4079),cl=a.n(Al),dl=a(3101),pl=a.n(dl),ul=a(1363),gl=a.n(ul),hl=a(507),fl=a.n(hl),_l=a(7173),bl=a.n(_l),vl=a(533),yl=a.n(vl),wl=a(1994),Bl=a.n(wl);const kl=\"data:image/png;base64,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\";var Cl=a(6342),Ql=a.n(Cl),El=a(4322),Il=a.n(El),xl=a(6537),Dl=a.n(xl);const Sl={};Sl.basic={name:\"Basic (Still)\",behavior:i(),entity:r(),model:s(),thumbnail:n,textures:{default:l}},Sl.basic_walking={name:\"Basic (Walking)\",behavior:c(),model:s(),thumbnail:n,textures:{default:l}},Sl.vehicle={name:\"Vehicle\",behavior:p(),entity:g(),model:f(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACaUlEQVR4nO3aMWhTQRgA4D8SUOgiCjZQEUXFVejS3dWlIDg6OIiTYDcR1KWTddBBHErpUFwUl4y6FyeHLIJgFQtpcXAp6lSnpL6Y17xX+5o0931bfu5dbvjh7r/7a1FQs/Vlu198aeFZ3/Gvlx7X/mfesvLWUVbRdY+LepnBMxdOZ36vfvoWERFTk41MfH2jXWoRvfOWlbeOssquexwcGfYCGC4JkDgJkDgJkDgJkDgJkDgJkLhS9wCdertXivXzuKhfaS8Uuol72TrZN7588UT/+Px8Zt769e99x739WeTfqUo9ImJm8tSug1Y3NiMi4mxjIhNfa29FRMTEuTO7fr/1+WtERBydupSJ/17/WGKpVMEZIHESIHESIHESIHESIHESIHESIHH1iJ06f5BO3d+rU+cPou4fPfV3jblaxOCev1/xMBPv9M6tFP2ne/3DzdadfekJZG9sAYnrvgUMuuvvvctfuX93OyLi2PknSXXRjpvMa2DeXX+Hu/zxYwtInARInARIXOYMkFfnd9jzx0/3HiBiru+Abp2fU8dzuNkCEicBEleqK7gqed3GZelOLq9WtCu4Ko3WrX2Z58X7p/syz17ldT2XddA3q4W6gquyurEZP57fyMQuP3pV6NsPD65lA9PTA7uTq5LX9VzWMKqskTgDNBdno7k4e2DfsWMkEoDhGYlD4NWbbw70O3YMPQGO317+5xWyiL/PCmvtrYghHwIPK1tA4iRA4ko1hVZl0CNUUUWbU6visQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg0PkDW7OdcDUbPUwAAAAASUVORK5CYII=\"},animations:b()},Sl.armor_stand={name:\"Armor Stand\",behavior:y(),entity:B(),model:C(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQXSURBVHja7Vq9ihRBEJ53EARB8AXMxdAHEDQQxEDhknsARTbSRcTDSNmTyxbFDVwjNxA0uMjA/B7C52itOb/l26J6anp79qbndhqK/qve6fqqurq7eqvqf/r96TAIfX//qKZKpV/zg/Dx9d2AfJv+z6/ur3mq0pIHwNPHt+uJI0/tl9/8+vZhtL+39PPDkwD69u5BrSGQ1IVOnt1Z1zW/5Kx9Jt2GMfiO1HsHQAvNgkNAzi1eDSByBk6DB/7eAZBJCr04uBUO791ck9TRp/uljLoGgsGTcVpgDWLvALB5Clmm3GTWGhQLTO7XPEX4ANYiyilmba3xJhDBW4QF6PXNZtvGrJnPc6gaZPmt3gHw1rxn1pZ3jzlUbWFFWEAIoZE8s7YAjDlUdp6gQQDQZNZtnSw7UPYbxQPgmbU3XjtU7VOKB8Az67YWZAE5CB+QS9qhakdaPAC7BmsEoJQEh5VDKUB1HU/wxreygFwAcjSfG0/wxhdrATquoMm7bmffNWAyXRE+ngIAnw108MW7bmffNboEABNOASAWZYIg3nU7+67Bx9RcgkZSAOA7gnXo8q7b2XeNvrcxL6boXbc7uWsIanoNow5UuV/zgA/5NvGIJifXdN3Ovmtg4qwJFlh7Zy04h9IYhLaW4zk577qdfdfY9V3AA8BzcrwUrPhlZ3cNmVRT8DPWJiQPKtInOercBuJvaR8Qc3I6pK63vWxfxUwQgLczJm6ztBHjByjeQchycmzaVvyyM2cNACztWVpuYx26zbIAz8npdwjtDzp9F2DhoD05g7NG8XaIMboOIXgcj4VFNAVlWdidb8s8SRZKJqG3KG4TXhZSjwUwPBb9RT2OWkdZmJ5ljhbvNmOroSRtYkdHR2E6nW6QtHXVPggAlstlWK1WJs3n87pfCEKl8A8CAJn0YrGoCWUIAWElh6ZT+AcBACYMYgGZAEAK/2AAEOLJW+Y9mUxCKn/xAMg61SbMdTZ1OLoU/kE5wZg2IRyWQAp/8QCImca0yU4NJp3KX/zTmGjJcmBNTjCF/8IfUrYBAObM+7je3qRvNpuFVP7iX5KwptmB8brmdvYBbfmLPxrr46usW2i6zXHX479wgSztMOlDCx9hYdqWQ7P2fiYsA/392I7Bc+Hfr8Y0pjFlb4Mcm9Oxfo72NL0JDh6IvQWAI79C+PenLrflGxwAWtsIXnLZsooY3+hULkOy/hS5VwDwC1Hyv64uQ9LvfHsHgLXl7a0PwMPk6Bl7PKzumDY+UhmdqfXuAbjyMvz5UdXEZdTRxmWuN45XSHeRdw7A2Zd/v331eE2xupeb44cAQHVtGU5PznOUrTrarH6dr/sjgpS1BK6f1rR8U23ksfa2eU0RgZo0G6vvDIDj5+dU3TirCXW0eblVBv0FQMwNT8+BndkAAAAASUVORK5CYII=\"},animations:E()},Sl.allay={name:\"Allay\",behavior:x(),entity:S(),model:M(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABo0lEQVRYw+1VsUrEQBDdT7AXLKwUDisRGwUtrDzwI/wQweIa/+BSXGdh6Q+cIIiVWqhctLARVA6bFAoGRt7KWya5PS4bLglIBh6zs5md9zK7mxjjse3XD+km33L4I9YjXjl/m4ApaMs3EpRvSE4gRoGl0yeHYAFXUlyAJifKCOhciwAHI3Fdw3imgKM0S464jICFCxEAb++2rkgnovSPlORRKqXOAFoP7N2KLF4mdg3GmaStly/Zf5cMKIBAnM/BOt9h1bVBSgHwiCcE6IIUg4KMAcT5HIDk7Bbi4FvAwkiAQpLAtAfYRooIEjBt7zcePx059wzFYdrzGUVgXed+nNkCxLq2Pvn6Rph8kibHGIX0FiDO57ATFME1PgF4e30jvJ3QV8zMyfhyPIQ8kFOTQ79ws6zQLVjvDQXQAnxzpioD0W4UC68KxoCd78d2Ds8qEwCy7tnYkfueV9qB1hq31eO7QRH8bwFrvYcBvR5rX5mAzZORJaHnvG+uMgHa+56FGv+etXw/9K+apLWRa7Nf0n6ccLwTxc+NkMNqJW+EsLXW5mm/rBdS0hfxFsYAAAAASUVORK5CYII=\"},animations:R()},Sl.armadillo={name:\"Armadillo\",disable_on_edu:!0,behavior:G(),entity:J(),model:F(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:H()},Sl.axolotl={name:\"Axolotl\",behavior:K(),entity:T(),model:W(),thumbnail:\"data:image/png;base64,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\",textures:{blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACrElEQVR42u1YPU8bQRC9f0HFL6BPQYPSE6WDAA0NEg52XCShQSIfIJQyUn4ATRQkKEAk/yNd2iA7EQUuQYgEeeO38jjDsGvfXQh3N54nPe3e7vm8793s7O4lieE29nad23l/4Ym6vF5dPxu0fz668qRr9GX5r8Nj54axMANAORhql+KlCVkNmEkeB1moAbE3EhPPTchjwEQyeYOFGjAqLO/SANwfMyDrs+7VgFgOyDpoyiuh/0DffxcbG0Ba0kDJBG4Gbyt1xichecTzKSGTJDei9AZQJEwndU8S+WHxhyddUz+9+dDqEGJpDYit9aNCXv6usgY8WvjqVl90bnBUYpL3+2f0N0coOfNsjkoJbgRFAG9barbd5rvOrTePNvSpN4CLl0sj+iohsj7fcqG6NCC0VSYDQhujyhiwsnLuQvWxMYAPVA46Sw6Q4iuRAxDyGCxKXs+aAyodAWlzAC1/qiIg7Srg1/W+ATwPqIiAfzEAbzm2DKqJANoJYucH8h0jTQGQDKDrUhuQ9uRHiY+2yrKe9zhd+DfAYUfcUWeA2Nkh7RE7tJ8o7AswFypLEjnMAG6ELPlxO3aqLMwAKZDmNm978HB3MO/pHlnHPdIMukc+jxIpf869fQIzRPB0rvUbrM21PRsLP91GrbcjrJ10ny+3rkHVBnzadw5EKMqy9F917sqAkHhugmoDkIBeNv9mZm4A9anPATT/wVdr7V+vG60u+KZ5eg2OZXJsPGl3ib0T4oDqRUMkyrfPTjwxHT4eXPopgVK96FgyhHiVCXGr/r0rBSPxyRJ9KhMin9+SMAekCEHdto4a8W17yuXpU4MvS7MuJBRt6BuLKJAmqBefJ7RVTYdY2A8Try4i0pqgejqkEaZSvOUAywGWAwwGg8FgMBgMBoPBYDAYxgp/APIqUnv/FcsYAAAAAElFTkSuQmCC\",cyan:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACjElEQVR42u1YPU8CQRC9X2Dnv/AX2NrbGqiNNlRYUVgbaYyViY0dRCvjD/CjMMFgYkQJVphgbCxs0IKgnpmTIc9hF+4QubtlXjLZu13uuPdu9t3sep5iEHfPn/5x/SMIOpbnuZOmv3PWDoL7+ZzGovxX69X3h0VsAlDIh+F+SV6KEFWABW/JGLEKYHsjLIAkjyKMI8CcN/8rYhVgVFpOUgAS1CYAjSVWAJsHRBWAfcWUaTT272RtDxA20CBZEBSH20Q7PhMZhzyKgFkgsyTxAnAmLHq5IPpEj85/onfO40wajXFYJFYA27c+TMrjdakVAIsaTNlhxiR/T/fg+/Cx7Et9dYhCcAZg33Lp3jeJSX005rwAkyyPYwO+KfnWTCWxSQBTYZQaAfBB5UPPhADo1tK5o3iAJJ8KD7jNFgMi1OJxVA9IdQYgYTyWArC5OZUBYb8CWPWhDziRAX8RgN6y7TPoTAZwJchVHlaMPAW4H3+XaAHCrvzkklcej7ucjn0PcNgSd9QawLZ2CLvENtUTse0AI1HZyo0OkwAohGxxuW1bVcYmgCTIcxj7cH7bVn9sgngtfhmwZSPF+0xtC0xhQSOzV6V4ypeCqBVuOgcbl93d9dPu2mqlQ+G0ABcP70YDY6OKbYt6Wmi+dIzkUQSnBbhuvQ1819HBE72vNykP4Pnf84AGeQDFZqHWoZhJc3zMl9sc9ex+P5wnTSSRPE0H8gkyS2qdJ20zQzZL5wQg8pIwb3pgy2bppABhgjNFS0cXUctsf40z5gwqhUO/XLwamN/UR2MzkQVsgHIrzN0KcGWrOo1rUpf2Njg5HWTa2+D0dAhDzEny6gHqAeoBCoVCoVAoFAqFQqFQKBQzhW+/9zhmA3i/DAAAAABJRU5ErkJggg==\",gold:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACVklEQVR42u1ZsU7DMBD1zNAPoAO/gMTGxsQvMDAzVUgVIxM7U0fENzDyAUh8AAtIDFRi6IAEbDAwGF3EVY+rnTihxMnlnnRKYiep7+X8fOc6Z1jFx822f7naK4zO5fX1dOTvL7YK43a+pr46v+Xvxr7MshFAJgfD7dJ5SUJdAvbHLmhZCYh9ESZAOo8kNCFgc+O3ZSWgKizXSQARGiOA+jpLQEwD6hLAuhKKNOr7d2djA0g1FEgmBMnhY6cVnx1p4jySgFEgo6TzBHAk7LpJYezk2+ygML7mfnYahbHMOktAbK1PCXl8rrcEYFKDIVsmTPJ+ege/h89lW++zQySCIwDbZocjHyKT2qhPPQHrTI+zAb+U/GqhlDhEQCgx6g0BOFA56EEQgGotlbuOBkjne6EBNMjXx51isHheVwN6HQGpGsDipioCUlcBzPpQB1REwF8IoK8cWwbVRABngpzlYcbIU4Db8b5OE5Ba+cmSV543Laez7wGWlbhVNUCsdkgtsUP5RLYdYHRUHuVGR4gAJEIesdyOVZXZCJAO8hzGNpzfseqPRRCfxZUBjyyk+J7WtsAMETxM3BfZ/OTHztwnGdb2qgmICRgLVbYt6rbX+TISVBMg//FBApr84dFLDVjO/yFqQAxPp86z3R6PlqbeaXISnc+esbXtdJUoqiOAnJeO8qYHHlksVRKQYhwpljpqxPPU+SZ9arA4d35xueootVHfIKJAkqDe+fmRe2/jmd6FffR+jRGRSoLq6ZDimErnTQNMA0wDDAaDwWAwGAwGg8FgMBgGhW8QHTbfpJ2c/QAAAABJRU5ErkJggg==\",lucy:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACW0lEQVR42u1YsU7DMBDNL7DyD6wIMbLTkb2dGRj6B7C0K6IjIxsDOxJi68pSVqADYyQYQYRepater3bqhFI7l3vSya6dpLmX8/Ods8ywis/bSTG9uJ8b9eXvu6PzYty7nhuP82+aq/JfX4/TosyiEUAmX4bHpfOShKoEnGQHTotKgO+LMAHSeSShDgG72c6SRSVgXVhukgAi1EcAzSVLgE8DqhLAuuKKNJr7d2d9LxBqKJBMCJLDbdKKz47UcR5JwCiQUZI8ARwJh9np3GS482+eZ6dRGMssWQJ8e31IyON9jSUAkxoM2TJhktfTM/g53Jdjjc8OkQiOABy72esXLjJpjObUE7DJ9Dga8EvJr+ZKiV0EuBKjxhCALypfuhUEoFpL5a6iAdL5RmjA036/+B6/F9Riv6oGNDoC0GHsSwJkcqQiAkJ3Acz6UAdURMBfCKCv7NsG1UQAZ4Kc5WHGyEuAx/G6pAkIrfxkySv7dcvp6GeAZSXuuhrAVzuEltiufCLaCTA6Klt50OEiAImQLZbbvqoyGgHSQV7DOIbr21f9sQjivbgzYMtCis/Z2hGYwYPn42FO9tYdLRmPk6kmwCdgLFTRjqi3vc+XkaCeALmvo4Infa63KQ2Q619aK8XxtXv1wzbpDBem3mlyEp2XuqDe6XWiqI4Acl46yocerlYlASHGkWKpo1bxqzOnBh9nl8WkM8hXl8cgp7lWRAE5+tIbLZylvmrnZxnewzbuSfqLz9LgYIfoWnURIcPeB9XLIcQxlc6bBpgGmAYYDAaDwWAwGAwGg8FgMLQKv1kna47WuMdJAAAAAElFTkSuQmCC\",wild:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACbklEQVR42u1YMU7DQBAMouEBNHRQUaBItAgkijQUIFEAEl0aKiokKvIE6PgBT+CDhrU00mS4u9hR0NmbHWl1zp0x3rm98e5OJoG/+Hx9bBbzq9bsWn/fXp428+vz1jCP37bW5399vT0070+zxsaUVSHAXsgc1Zf5/nhu59V5JaEvASf7B0mrRgA7r7sDAtR5JmEdAvZ2dpesKgG5sMTcJgkwQnME2FoVAizUc2cSBOQ0oC8B0JVUpNnavzuLF9BdLwkTr7FAghAmB+OgFR+OlHYdIqi7xCRwFGiUDJ4ARMLx4bQ1OIndxW+sw2kWxpINloDctz4X9rkcYbQEcFLDIVsSJr3fnoHn4FrnRp8dsgbwsQBJF9OjJkWmzdmaCwJyumC2yfS4GnindNf006fZIghIJUajIYBfVF9atUCF0gUBrNaq3LzbegRMG1gD1PlRaIC9pO2qjXy9SgNwNFxEQEkDUrUAz40+Arr0CDTr4xrCRQR0yQNSBCACcp9BN3kAMkFkeZw24whgnu8bNAGa7iLb03ktefU6VzHmyuhcpVktw+MzruVxl3JX7+ex1F3SnKJaB5gd1VEbHSkCmAgdudxOFVe8VqUcZidwhnmOz3eu+oMI8t/ylyFFlD6rWg8w8Iu72Vlj9nJ/s2SYN3NNgAoXjzDXBOScZxLcR4B+11nBB93X25QG6PlX20px3EpBhLPsvOqCe6dXiaJLDVBH0fTgEWLpNhFaZYiUSB09otS6ctHW6kJAqnuDanBrokC7w66dX8c5V4T0bVq6jIiuJLg+Dl0JCA0IDQgNiDQ4EAgEAoFAIBAIBAKBQGDM+AGhA7lVmhxIoQAAAABJRU5ErkJggg==\"},animations:Z()},Sl.bat={name:\"Bat\",behavior:ee(),entity:ae(),model:oe(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAE4UlEQVR4Xu2az2sTQRTHJyK4hR7SUGmDHhIUS8RL/QHWk156UTwIXjz4x3nwIniQeulF8VAFq/UghoqSXCQFS9pDoSuIke+Yb3iZzP6YZDbt1l0om92dX+/z3rx586YlFXEtXyz3giBQweycLhEe7KkwDBXe6ecw1Hc+v/28U4pq687NRm9/t6PK81XdDq+4OlFt+X4fOeiVK4s9Cs9OOXgIv3fwD8DcbKAhRAkD4VGOAAiTELe+7UeOwSbshbNndHu8vv/85VTfbDNWa7IwhAcQCELh+R0QogQhyOp8oDq74cCS2EZ7J0wtAISvVCqqsXROd93c/qG63a4iBMJxgRILgEKbIFwsAABQ/9ZKXXU6oWq1O6qzu68tBxBcANxYqvYg/GH4Rw9pJjg1gIBnwFlYWFBrbz6lhppoAXPBoe5sL5zRdzkN0vgACQDlN962NABeLgAe37/eg/D4g/CE0N3/rX9Xyqf1/cmLTT8ApPD4DQjSiUGQ6nxZC+QiiG1up3n3cPVqD4JDYAiLO54Jg5bxbP1jegDS29PkccecxZyXAmOQmMd8T58QN3hXJxfXFixAapu/zTpOU4BOypzv1DitgJ1wKnA62CDJAflc6iQAat4GYSwANvIQXsYBUnjTMUZpLisAnPNeAGhn1jd3Cvxy/YO6fKmi6rW6ng4bm0315WtX3V29NnCGUvsMjEwQWU0BOkD6BNmvkwXQBxCCadr1WnWwfpuQbIGRCcCnc5RTgP3QGU4EQAvfD3HZEIRttVtD8sAaTKcoNe8SIKXx+mYZBjpc76OmgZMFjDOQo65jAzG2BaDio3vLOlqjdqOCnnHC1yxhRYFwtoC8AiBcE4QzgCy1NM22uVl6v91JHwlGDdDcwyPchRM0AyPWf/66nbrTLKEAgpfdIJZHJDCw/cWF+Y+4HzGBGTfAd4wLwHXAvuElZnHk0gYAiAtk2EzH6QpAzlsXk50aAFgANc9OsYevny8PhccMjtIAkNkcruUIZFy2r1MFgOBI7t1pAbZBPF3bivUBdFBIWHDfjnawhXXZvk4NAJygjPq4R5AbJA4mjQ8AgEajoYVnUoP1XZYt7wAe3K4NJRkn6cC2V8DUiBMe/R05AER+cnlLepaQzLImQBPApNvXSRRkq1uiqUN7Mu0ln1FRpseYMWKKTJY1Eym5AQAhscbLvJ80aVtOkETl+QGXSJZ/9a6ppwC9frPZHChinCyudwtg1lYGN1IwOsKk1JdZn+WRESIAmcNH+XFC10wAyCMvdGA+2zqNKyO/MSUWFfEdeSQICzDP+eSzeR6I2EAmQfgcdfeZEvOtfbRXkgC0GQsBpVDSMmwABtOmX591cwGAR1UUAvE/wl5c/M2o0HxvKyvrHXsAiPnlSa+Z1yMUnuXpJbF/rmczSfObz6RoJlOgthh4iwRtAywAOBx/Z6HhpDaPRRYnaZBZfh8BgCmBbS+uaZ36ZilgUtsjAJgKQ0Wkw467F08SMOn7EABqXx6InnQrGAIQ9Z9hJ9kKRixA/sMTY4TjvpQlmXnc9xEAKEyBGSP8NwAmIZnXukUckFfN+Rp3YQG+SOa1ncIC8qo5X+MuLMAXyby2U1hAXjXna9yFBfgimdd2CgvIq+Z8jbuwAF8k89pOYQF51ZyvcRcW4ItkXtspLCCvmvM17r/6aXpunfHxSQAAAABJRU5ErkJggg==\"},animations:ne()},Sl.bee={name:\"Bee\",behavior:se(),entity:Ae(),model:de(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA4RJREFUeJztmM1rG0cYh591ZGwrUdwoUgqxKcVgKJgG44v/gEChUHIT7qGQlF5K/4beQu+5NKSH0Ca00FJ6C/QDQs+mkDpxDDJbwkaVTVt9dVfWrES1bA/KTGd3JVeBVlKseUCM5nve37wz80oWQ1K4tBKmU6cQ3YB06lSkruwJ3JZI9Fk8neb+LwfWsHOMg9SwDaXRMtWF2K02+3fyk+UXXjob/vGnZ8n0eRf8XzO0AB99eIGF/Dznzq/SqNkq9SttNr8IB/b74Bsvkn9z5WXuPPBUOm4iO7C+thkC7OxtJ3bm6sbqQCu/ffL7wAn0XY7v+iR4gfKA9bXNsJ/hEukBfqXNxddeB3huD4jv+iR4wdDqn3gPiBM/DvodoHNY3OWt7/8CoFL9Z7h8rgtA4ZPJ9oCZQRU7e9vWzt62JYVYyM8n2jRqdt/yQdx5YFvH5cfBQAEk+r0gb349r5PPddXnReFfBZDozx8QEeLi0nLfPnr5+tpmKL1pkrAKl1ZCgK++fIN337nPp59fVmk/4iLEvQBIjLP19g8AkQhSD6REN+DrR0/GchxmAOqiQ6NmU/aE2tl+6UbhZ+UJjZrN5fePEm3073K8uuioCcteL2TWxYiH1qMkJRfnV9qqUC5SvvO//uQAs9y7nlIGnju/yr3ruzz6rlfnv7qrLkTZXx+3LjqQnmP5bFrVSS/Q24+amWx6DoCqk8FtiYgQ0Lv9r91ucOWGw62lm6q8UbO5tXSTKzccrt1uJF4Dv9LGbQmqTgaAbHou4vJlT6i8XMM4mKmLDm5LYO8XVWFciHrTJZtZ5G5hK9L5bmGLbGaRetNVZdJwib1fxG0J6qKD6AZAz+WlJ4huEDkioybltgQlv7ewkh/w9HHvLqo6GXI0WcjPKyOzmUX8SluFxHo59IyXO/70sUXJD6hUU5T8gFd4Jkp6Thmcffa930/pUaFCNxnFHR6UKfkB9n6R1tEy0OHjrVkgx+kzZ6g6kKNJ1cnw2XvQOpoFoPhjB7A4PChS8gMePvwtMZk0VDd4nMYbhsX1nNAPgtAPgokLZP53XM+JGD11IkiD/SAIpRhxUU48/QyeShF09z/uD5ITjR8E4dQafxzylZi6owHJl2GqRNBfBv3FGO+qRsTUvw76ZTi15//qxup0hsgGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMhheEvwFg2Tfa8nIOyAAAAABJRU5ErkJggg==\",nectar:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABGpJREFUeJztmF9oW1UYwH+36/827douQ1vxYSwgDkuN4h7EpyqoD1VktcMU0tWApZ1MZGwgDisNHRtuTHCxg66tsqqrWmSsbP4ZPvggRXBdt0prZGa1rdOkicnaexPJ9fpQ7iF/uq2gLqk5P7ic3O875zvn+853zncJrJHm+i2G024zohNjSa3TbjMat9YZD99dZYz0tie1jVvrjLXaz3pmxo4Ih2fGjhhmQJx2m7F5Y0XaM9LbbmzeWJEWAFO2mi4TKGvtODf6qFFiLaaqxkZo0UtVjQ3vzzbKYqOcGf7tpuM6P/0paQ6n3Wa8971XMdt/sPZ/haQFNGzbbgBMTI2nLcxptxknBo7xUvsraUbOXV0JwDv7drD78CdJut//iAhbmzdWGLd6zwRi8oZt243VHDcxM0DzR6m974GVwYWtzE/uX3MGpO56NmTBmid32m0GwNDIIG3P70rSmRlgkpgJ6yYDUkk9Dol3QCIL05f59vN5APyBfCG3booD0HzCl9UZkHczxcTUuDIxNa6YgSixFgudUtgKQGjRmyS/HanOZtp5uEUATBLvBbMCGH+eEu+JWDfFxbNeuG0ATBLLH6zsvklt3T2rjkmUN2zbbpjZlE0ozfVbDE9/DzXl37Cr9QKDpxpFuxqpQUjNAiDNTsvOLwBwH+yi90AfAGpcx9Pfw96ObtS4zseTVzNyHPIAdr6wj9Cil7mISmjRy9DIoNjhxNbefFFkQmjRS2PHUlof87dS2CrsuQ92AdB7oI/5GxqKouA+2MXejm4Aoc8EeUE1BoDmj/LV+dMAPP5kC7DikOaPMnnexy/fFXC2J19cgFU1Ns725AvdwvRlYXQuohL89Q1ht3PPUYJqDDWu8+HwIQZPD1BtvQs1rgPQuefoHXM4lbzq0iIAAj4LP86Mo/mjSR1KrMW0nQzRdMxHX51HOBZa9NJX56HpmI+2kyFKrMUEIk+LcZo/ykcfHCbgswDgeftVSvM3sLejm0DwGkH/dUZG3wfAXEMmUGbGjhgOl5v9TZUcOhPms+P3s1z0HGWxUVHiHnTMU22pJHgjzMXhOgD+KmrnoR09aXLNHxXjn+36QditLCulurRInHsT8y6wPuLIzB3gcLmZ1XTqm15mVtO5dkXB4XIT8FnEjppOVlsqRYbE5jxJclhxPuCz4HC5uXZFYVbT8QfyGe5/nfCySlCN0ek6wFxE5bWeDt7q6yaoxnjqmd2Z8B0A8el2YeBdABbm55jVdLwz09QuLREAjrcUAJsoKy8n4IOSoifQfF8y9CIsLxUAMP11DFBYmJ9mVtO5dOm6mOQxx5vcW7KB8LIKQHhZxeFyU1lWKmSSbCYc8Rmarhuarmfdh8x/TjjiS3I654JgOqzpumEGIzUo/3tWczgng5CY/uYfJDmHputGzjp/K8wqkXNHA9IrQ04FIbEyJFaMzK7qDpHz1SHxMszZ8++023LzE1kikUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEsk74G/7Ri/57lmM8AAAAAElFTkSuQmCC\",angry:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAA29JREFUeJztmEtoU0EUhv+b1j5ib7VtWqF2VSwIxVK6SbtuEQS3RRdCcScuu3YluHVdV1KwoIhrH1BchiLU9AUpkZLGNKhJW3PTzCQ1w3URZpx7b1JT0CRtzgdhMu85/5yZM4mBKpkdG7b9rS1gRQF/a4ujLmExZHLM0+fSRT+Wv+wZ1c5RD1qrbSiNlqkuxEY6W74T95YPXO62f/y0DJmedsH/mqoFePJoAJ39HejpG8HhflSlPJVHcMmu2O/hG8uRvzV8BYurlkrrjWMHxkeDNgCEt1Y8OzM3MVLRyrc73ytOoO+ye9cbwQuUB4yPBu1yhkukB/BUHoPXbwDAqT3AveuN4AVVq3/uPcCN+zjod4BOMrKB2+9/AQBS6T/D9QeKAIDZZ43tAb5KFeGtFSO8tWJIITr7OzxtDvejZcsrsbgaNU7K14OKAkj0e0He/Hpepz9QVJ+zwl8FkOjhD4BDiMGrQ2X76OXjo0FbelMjYcyODdsA8OrlTdy/t4znL6ZVWg63CG4vAOAZ587dDwDgeEHqDylWFHi9vlOX4+ADgANWwOF+FAmLqZ0tl07MflaecLgfxfSDI08b/bsc74AV1IQJq/Rk1sVwP61riU8ujqfyqlAuUsb59Xcx8FQeywtdysCevhEsL3QhGdnA108XkIxsePrr4x6wAlhRYKjbr+pYUXja1xpfr78dAJCOmcjkmEMIoHT7B+bDSMdMR50UJx0zEZgPe6IBT+WRyTGkYyYAoNff7nD5hMVUXq6hHvgOWAGZHEN0O6IK3UKEzDYE5sMwZ5Ycnc2ZJQTmwwiZbapMGi6JbkeQyTHlAUDJ5aUnsKJwHJFa48vkGOK8tLA4F9jdLN1F+o5PZY8RMtuQ7Z5UZTyVR7Z7EiGzDVPZY1Umd3x300CcC6TSrYhz4RAhYTEkLKaML/dTulaop5t8xSX3Eohzgeh2BLmjIQAF4PE1DAJId3UBMSCAbMnQp+MYPDrCLgB8LAAwkNyLIM4F1ta+eSaThuoG19N4oloyVszmQthciIZ7yPx3MlbMYXTTiSAN5kLYUgy3KOeecgY3pQi6+5/0B8m5hgthN63xJyGjRNMdDcAbGZpKBD0y6BGjvquqEU0fHfTLsGnP/9zESHM+kQmCIAiCIAiCIAiCIAiCIAiCIAiCIAiCIIgzwm/zHk8y2FFodwAAAABJRU5ErkJggg==\",angry_nectar:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABHlJREFUeJztmG9oW1UUwH+vq+nftOvaFO3ED2OBYbGUIHZj+MUq6D5MEeuGKcTVgqWdTEbZQBxWFzo27FDQ2kFpp2zqqhYZVOef6gc/1CJo96fSGplpbes0aWrT9r2k5Pn8UN7lJem6grpk5v7gcfPuuffce84995xHYJ3UVW0xPC6nERkZiGs9LqdRu3Wzce8dJUZfe0NcW7t1s7Fe/WnP+ECHMHh8oMMwHeJxOY3yjUVJT197g1G+sSjJAWbfarJUoKx34FT/TiPPkUtJqZO5WR8lpU58vzgpiPZz/uzv153X/NHPcWt4XE7j7e99itn+g73/K8RtoLqyxgAYGR1O2pjH5TRO9bzGsw3PJyn59OqKA9449AT7T3wYJ/vjz7DQVb6xyFjrPRWIxasra4zVDDcxI0ALRKjYds/KZFs905cOrzsCEk89HaJg3Yt7XE4D4HRfL08/uS9OZkaAiTUSbpkISCTxOlhzgJWZscsMfTYNQCCYLfodZTEA6k750zoCsq4nGBkdVkZGhxXTEXmOXCFTbPUAzM364vpvRKKxqTYe1nCAiTUvmBXAWD4j3q04ymLiuVW4oQNMrOUPVk7fpGLznavOsfZXV9YYZjSlE0pd1Rajs/sopYXfsK9+kN4ztaJdjUQnJEYBkKRnz97PAfAea6H9SBcAakyns/sorU1tqDGdDy5dTcl1yALY+9Qh5mZ9TIVV5mZ9nO7rFSdsbV11P4hImJv1Udu0mDTG/K3Y6oU+77EWANqPdDG9oKEoCt5jLbQ2tQEIeSrICqlRALRAhC8vnAPgwYf3ACsGaYEIly740QIRBrsKRQIsKXUy2FXIzNhlfv3uNmbGLgulU2GV0G8vCb3NB04SUqOoMZ33zh6n91wPmxy3o8Z0AJoPnLxpBieStSk/B4Cg385P48NogUjcgDxHLmUHRwj67WiBiDDMdE7Qb6fs4Ah5jlyC4V1inhaI8P67Jwj67QB0vn6Q/OwNtDa1EQxNEApco6//HQDMPaQCZXygw3A3ejm8u5jj5+f5+M27Wcp5nIJovyhxX+3ysWNhGXv4W2IXnwHgr5wGbNt2slC0nSG7jQc+WckFWiAi5j/W8qPQW1yQz6b8HHHvTcxc4LjPnZoc4G70MqnpVO1+jklNZ+KKgrvRS9BvFye6Y2GZIbuNhaLtIkKiU53C+B0LywAiItyNXiauKExqOoFgNme7X2R+SSWkRmluPMJUWOWFo0282tVGSI3yyKP7U2E7AOLTbbDnLQBmpqeY1HR842NULC4SBHhlKxVAsLAQ/JCX8xCa/ws4WU3F4iITAF9HAYWZ6TEmNZ2LF6+JRe53v8xdeRuYX1IBmF9ScTd6KS7IF32SdGY+7Dc0XTc0XU+7D5n/nPmwP87ojHOCabCm64bpjESn/O9ZzeCMdII1/M0/SDIOTdeNjDV+LcwqkXFXA5IrQ0Y5wVoZrBUjtbu6SWR8dbAmw4y9/x6XMzM/kSUSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUgktwh/Awh8kWIftpuuAAAAAElFTkSuQmCC\"},animations:ue()},Sl.blaze={name:\"Blaze\",behavior:he(),entity:_e(),model:ve(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtUUqDlYUcchQnSyIijhKFYtgobQVWnUwufRDaNKQpLg4Cq4FBz8Wqw4uzro6uAqC4AeIm5uToouU+L+k0CLGg+N+vLv3uHsHCPUyU82OcUDVLCMVj4nZ3IoYeIUf/QhiAF0SM/VEeiEDz/F1Dx9f76I8y/vcn6NHyZsM8InEs0w3LOJ14ulNS+e8TxxmJUkhPiceM+iCxI9cl11+41x0WOCZYSOTmiMOE4vFNpbbmJUMlXiKOKKoGuULWZcVzluc1XKVNe/JXxjKa8tprtMcRhyLSCAJETKq2EAZFqK0aqSYSNF+zMM/5PiT5JLJtQFGjnlUoEJy/OB/8LtbszA54SaFYkDni21/jACBXaBRs+3vY9tunAD+Z+BKa/krdWDmk/RaS4scAb3bwMV1S5P3gMsdYPBJlwzJkfw0hUIBeD+jb8oBfbdA96rbW3Mfpw9AhrpaugEODoHRImWvebw72N7bv2ea/f0AJWRyiHDOpsMAAAAGYktHRAD8APwA/HxSMqAAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflAxUMJRhYv0w5AAAC10lEQVRo3u1ZQYvTQBT+sikEZC8K3qRECiuYwi6991So4M0fsPgbvLmwh0W8rSCevKiX/ABPwrYgWnoTLLS0hRSCoSzsYWFPPVjIEA+TN/OSttqDbNK0D8q8vHnTzvcy8973qBGGIf4mpudEAICKnZzwAwDAm2NPmQIB2KYcZ31p+xiGBnIse2t5VWzAqssPgY8DEgj5GfbkFI37h0C1htzLegHwA2DelbpVl+DjEwDIt71/qEeybYLsrfX2Hx8nAMOqS1vFhm1q0AScwAeiKCeA3j6NpKdOARcelM0OAIHkSZDAV2yV8NKAZ32ZEPMupbUTIAGfd+M8IINjm0Cw5P5vygkorXcCgpUnAPBUEAh8tZasDHkWI/r9JFKJjcCldX73udDcqrXcL51TYpsQL41sc4Af6A2OXQ1q7OryRxyAcwGrrn3GrvYbu3reD5IlFMDg5FT/1qrA3mYABq63NLuLjrfIAVZUBNHxlvoNXA+i42Fw1gLGLsT7UzhlyGcA4lMr+wBMRLyheMMKEKAAwLrA0Z1XKjhHd78B1oUEt2QN5l0MzlqYCGA0BZyynH/7QT6321DrMs8B5zVEdgM4iEuWUwY+/wKePZTjgQlMhJ6fCDk3mkod0L5kJ7/gq9SbTQmaegWSZhNwXmfbKxjnNUT0YDcWN002vnm7AXxv62fyTX8Hb5KoNPJmqVoDXvzIOADPgYjKFgFatmFA69zG6z5fz4HyPiE9vvsZZlwFGOBhL9nK8u5u1tdzNHI/sg97Wl9Fk/PUKEkekK7TLMuL0pdc9/P/pxdIl7Yc1OfbCwAnQekGiLfABRUjGj2KFpqfGLjwb4CnV4W+AiXh38Cs3FNkxiTgl9fAg/tbcAUurxNMTnQ8kE2NRU+CREuJxaX1Ql8BRWljjj5paPqLKeAU/QQQZydeTzq3FfoEEM8H4/vcVvgy+K9/hrYiCe4CsAvALgC7AGyr/AF5oLftKJDGmgAAAABJRU5ErkJggg==\"},animations:we()},Sl.breeze={name:\"Breeze\",behavior:ke(),entity:Qe(),model:Ie(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAwFJREFUWIXllr9rE2Ecxj8XIiSXkohJDtOKaLWLOJjij60guDk5uQlSF8E/wG5u4uKiY110kiLFURAKVZRSaRzEWmJKEZu0l6R4l+SSIuQc0vfNe5e0qa0pis+Sy/v98Tz3zTfPnUYPTE3Ou4l4EwDH0Twxp66RyW+SM5co2CapqEHBNj05s08nvEU+BHsJSMSbOI6GU+/so4ddAMZOXmS1ZjEUiQGwWrMAePv1Ta/2vQWo5HrYRdfdjnOAl68e8rOYA2Dg2FnGr94lFTV6Cgj0FKCQOHWNUjkgfwoxgdWaxcbyvMyrfv8kp7BvAYIoEW+SiDclqVPX0HUXu1qQo1fR7WxPAsTYHWfr7uut0Qsh0YEUJ47WOTJ8gUplg0plg0PJU7siZzc7AFAqt3X698CuFtD149y7OUEi3qRUDqCHXZx6g6Qe3b+A7RZQxIqOzYv33yg6NoAkjQ6kiA6kegrQpibn3Z22W435yf3Yqc92OUHTCsHWwhqxhkwSJCtrYRkT57re3gt1H8R+mFZIEp4ZdiTZylq4gyvoJxbqSuWAbGTEGqhuqMYADFpxIcqg1c+0Qnxe1mV/8WlaIVkfXFz/wuI6nt9LdbShSIxMfhPy+Jxuk6FIbOs6hmm1HdCuFjxjX62lPH3b51ZrAkXH9iyRaFB0bHJKQU5ZMoCcudQiVM5EH9FL9Pb3FdCu33niqgUiwf9QUW1Vjannar0KkZ+KGh0c2tiN+66/kcCz2+9GAc7d+kFi5PyCGitlP4x+nDwMwJUHpxf8taKfSt7tBqSA/xbSKWam59xSOcCj2dekogbPH4/v+CLxpyBNvlQOkIg3u77V9BPazPRcxw4IMQCXr13q6yQ8E8D35FOv+4Wg11YbnuuDQMC0QtJCVX9X/bqfCApy/ztc2+f7LCBnLnVYqOrbfRdAF+/2f++rgIP8z/8byGbNdK3mpms1N/27taIumzV3Xbuty2WzZnpwMEk+X2RwMAlAJKJl/ISAzMnni4yMGJltWu4d3aayl7v9K/EL8kLEqax7cgsAAAAASUVORK5CYII=\",breeze_wind:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACJUlEQVR42u3bSU7jQBQAUG7LRfoqrFkj9R0Q3IElElKUddh1uxs81PwLvyfV0vav+kMcKbm7AwAAAAAAAAAAfpDL9XY/ar1/pK3n17cva/S55MbdYw9H9qIDJmrII8UWeoK07PRWkyila4/eO2zFbR2A3px3Qoz8+Enq0NL3gb0N1ZgKww9ydMWFrbBJXqpbFvipDjZCIeZOklCJLQ2yxUjv9bGy9/UsSteZwgAAAAAAAMAJXK63X8v1/vF3Pb++/Vk591vea2stn3PkWf/HvLZyrm1+wGsHk3PYEQpmq2h67udoUbRKfJMC2gs6tZBS7rOX1BrJLU1ar+RmbSq3w4dv4MQff6UN12XalQac0t25G6sZY6vpk9PEhxJeo6pKkzayk76LM+K7yuj4AAAAAAAAAICJ1PoFznI9/X75do2If28fa7Eejbfmc1vsL9qPccgsqLAJLf1p2FYH1poeJd2TEs/WPVtPwmwjxzf9G26KiZH7jpFaqCnTScXNNtqCd2iPAifYC1vIxM72Xz8AAACquFxvD2vL6fysfFbNbcmDjl6bsnrsZWSMzNglwQrwnz2pzNhFFWLijO4UI7dzxerY87zD6AAAADj7V8LH5cq5JnXVjIUGRZCStBGxrMVTWpi1990inioxllwcqVjIy5XJVngoYTt7xoM/1cFEKe6eiWiZ2J5F1bMomzdQrxFmxVzmJwAAAAAAAAAAAAAAAAAAAEBwn/Zgy9NBkl8iAAAAAElFTkSuQmCC\"},animations:De()},Sl.camel={name:\"Camel\",behavior:ze(),entity:Ue(),model:je(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Oe()},Sl.cat={name:\"Cat\",aliases:\"ocelot\",behavior:Ye(),entity:qe(),model:Ve(),thumbnail:\"data:image/png;base64,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\",animations:Ne(),textures:{allblackcat_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERACsbQK8cAAADXUlEQVRo3u1Zu24TQRQ93p3xrhY/lEQ4VZBS5BOoEwr4gggJCYkCia+goOA3KJCoEB0VEihlIvEJFJHoEiki6ySbtWdWpiB3cz2efdlrO5E5jT2zszNzz33ObGM0GsFEu9UTQdBN21EUIh704brNtC9JhlAq1iiJjbVHQkgPAKDVAADA22d/fufO1W71RFP6GKoYAHBxeVp67Tw4ts4g6Kab1GoATsa0oI3Tf7NdhCDopoTVCZH54GaxOheNohBN6QMAlI6h1T+NKp1NwGZvR5hE8P6T0196LgTYkCRDuG4TSTKsvND3H18Vb+/uPpVX1+dYNkTVF6YRngS2kTnNnFoNSrlNKQIouAjpQatBpsmvr22lz2kDUvoTBGYFRpvAZQQnt+EBsy7hAUBw/6NFfn7axvHBGZ5/6OPz6w62n2zg8cvjMeGVjseyAuHo6GjkOA6SJEGj0cDe3jMphT821nWbkMKH0jEODr4p13VxeHgIIcQNMQlc18VNhpIksJBercIDQMPz2kKK28AkhZ8Gmrf7r/D+y8eU+avrc/CxNnQ7mxOaonmVjlOtEwkAxjRsswACT4M0bxz39cwEUEMKP43SfEOUEosiNifA3HyW8EUEhP2TsbEm+bMSIGadIC9tkcZM0sgaOOF58YdbUN1w+MZtQS2rvwpsGuR9QnqF9cY8hJ8qDVZNVabfctCzPOGnTbulCSDt+l4HrtuE73eEqTHeX7YG51odqluNc4HKVJlVzhvTpcGSC5BvE2Fl3svya9P8lwln3gtQBiEfttUOSy+FTfPe7O2IKApxcXmqzcPI+tpWahFZx1jSPBVOZjVIQTAv8i+MAN/vCNKQ73cE5fEg6E6cxGx1QZHm88ZQAFwmEYUuQMWMVgNEUYgoCifO87YAyKM7T2EUBHlf3eVtJQIoIJmRn+ffsH8yVtbSb1FuJivImpuPMX8XagFFJJjFSJ7gJADP/3njqVawCb8IMgoLoSpHV5s5m2UsZQFeDpchY64EkLZo8VkKEVvlZ0uBXHgav2jhAUDwk1gdkbjodveuwZnH5ed9gqBb1Xarl8aDOq7B7w0B3HdXEU671RP01ebdizdpZRZF4cx37vcBjdaDh4JfS/G7vLo+P91pAmzfBlfKBbDi+E/AqhPwF5MYIpd+k1Z1AAAAAElFTkSuQmCC\",allblackcat:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAE4ElEQVRoge2YT2gcVRzHv7P7Zmfd3TTGsNlCmtDoQoM5WCr+QQRrDgb0IkUNYjGlLQbvIV48eKgX8ebFghUCKijFIIJSsHoRQaRghS0NqBETS2vcbGa7mczsm+V5WH8vb19mZiedLbSSDyzD/PbNm/f7837v9xuDV2ahYk6cRSFfFLlcv5Q5jg3XqyOdzkhZq9XEzNS48e6n3wIABgqDqDWq0Ll/eAIAYBimYKYFAPC5BwBQ739b/dnY8bDCSGlcZMwsmtwFAKzcuGrQe5PAdAGvzGL46EX43AMzLfjcQy7XD9erB04wNz0Z60VN7kqFSQn9PgpySJyxu0EawJw4C6BtAHVxdA2CvB/XCI5jI2Nm2+/xXfi87VHuuzvmoLkPjT0mVDkZQpFHRk43jGcPl/DFx8+jdmUVADDw4AEMH70o9IHrtRUAQDqdQavVBACsbVyTLx8oDOLUcw/JhRO0BRx3U5hsW3md69U/AhXRDaDz99qviQzANpoZPPXiV4roFwDhXifldWqNKuamJzE3PbnDCISqeKvVlDklbM4wfO71bCsYhXxRZMys3O9RIa/mhSZ3A/PCzNS4AaDDCHPTk1i4cFVEKaxGkwolPzVhqso3NteSbQHL6hMmy0J9yU8fjWH5uypeOlfHZ6f2YezpQTxyfLljAUFhDAD9+0odi+S+C5Nld4wnGW0L9dRRcRwbAOT66J7omQHUxdJi3nxhBmfOLwBoK765tYGofQy0DUDjg4xA3k+nM3Iu1fg6qsLqMUjzet7N5AagG4oEoDP707kd5XmCDKAvPkx5INoAdv1Gx1iai0hqAKZO4Hk3k8z1HyVpUPJYVPiTwaPyT9g26gWpxflR8MoshoplwZgleGUWvDKLxflRLM6PSjkAWempV/0XRJAHVRkzrcjkS8/cDqT3h4plsV5bwdblEwawXRiR3Pe9WKE2VCwLYDsHqFGgbwH6LywBAtv1Rxhx1xVGijFLMGYJx7GRTmdQOPKJGHj0c1HIF0UhX5Ryy+oThXwxsihRYaaFXK5fetZk2Y5egsbQFghjbeOaMTM1bqjXrcsnDPv7aWP9m2OJlAcA9sbrrxgA8PZ7H0phUC4gz7peve3hGJYP29d6+O+Wxp//AADS92S6jOzOjmao19AJQntYj4K4UNd3LmH3p2PUGlXsHzwoTJaVRcVQsSwcx0Zjc80gzwfhcw/rGysdkTBULAvV82rhpJa/evEVBm82DACo2dcTKRpGav/gQQG0PWRZfYIUzuX6Eaa8z72u9XicMfQfRUkQv/9VwbEnS6H/JyXVbQAVMz734Dg2HMdGk7uRijHT6uj/9SZIl0XNxb9+Fe+/83i3Zd4yTC1Kgs5a7ruw6y70cjnOuUyejRpPY9RGS90Wh05fAnBpt3rFJkULVK9hkBJRypNCat0eNZ5qBfVZda7VC89g6YOHI9eVhK6nAIVs3J5dD2c9YtQkqFeEQcbYXKkiP9LbzK8ivwfQy/WsvNsvLvfdOyL0ji0MPeKCiiIh+G09BZiq9K0UJTr6sRhFnOaL+oukX3/DSPVS+bsRgy99icbwExgpjcszX21OysV2yfvDleim5G5FJsFuTcn/ldTAkZPigQOHBTMtvPXya/IsdhwbS8s/Ju627nQYsH10nTm/0NNPznvssccedzr/AgLG2pFUz3nXAAAAAElFTkSuQmCC\",blackcat:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJfSURBVGje7ZgxSwMxFMfvG4gudlCnguCirn4EOxZEHVR0cHISXFz9Gn4ChwoObuooIt0s+AVETqUq6tLh5B39l9c0uXu55O5a2sCfXI5rmvdL3stLgs7TYaBqrrIYqapWV6MwDHui9kFtOWj/fCRqeqoSi75vNpu936r9p/Vj+t652ABQDSAA0MgD4G0dAA4BBmAQSRA4ADKe/56Lw+R9mcYCOQNYX5mNjQ4varGSAACCbtZMEKQApDPvHcDa0vyA0v7UNGgdBADA8jdBKA2A1FipdBCozQOoLg4MFQAa4Pb5TPxMNbWzwOCBT5XJFWw1dCtAAsGX8SMBABB4HmELAN+iH/5+ZACkxQDJ1svh4b23PACd0nPjZKEnvKdvkXjwWhK0XADAfahWdxKqvQPgxnMAaZmaCYApEEoB6AKoVwC6AanP/BtfAKQQsI3ymibs934n+L7bck+FT4/2tZLm4lkBSAOhDkD7uh4rdwDc310AuOQBOgA0+4DgXPiguRE0QEkmljcApNImlb4N5r0LmFyADm6FAeCJiPpOCkCNA2pSY9wFuidUWvY4sXLlDgCzx2uenOQNoHQX4HuuugeTsgDg2Vza/2PmsQq+bjf7bq8KAaCDYANAjQM2ZwEyngznLlDoCkBqrPqe7fk9KwDT0gcU7wCQc0O2AKC/h72+WyKJOs9XgTTl9nYpmpR7EwBck+FsoLYBKGmQrdZj8Pb5am1c2k2zFxcA9feXswjiQNIA+DJKYiyXv2vxLgCTD5YNoDAX2KjvRjfHx3HNs7CxANBoXA5obABMyqRMyliXf4CvS4vS3/Y/AAAAAElFTkSuQmCC\",britishshorthair_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERADZ4RsPFAAADpElEQVRo3u1YS2sTURT+Mo9KZ5pFGQxCtdUWClJEtNsuhOBfELtwI+JK3GVRkJaK4KLQVTfW2o3QFP+C9GFaaDfRlQilJU0fUCeELtKkYmYaF3rHk5k7M3nMxEA8MGTuzOTOnO9+5zvn3EilUoHd5hcXJACIKioKpSIA4CB77Hju1fSUgRptfnFBiioqAFhz0vHTx08Mv//T76jn3V4m8S5GFRWxyzEAQAyAntOh9ij4l8bACtq4ADDn6Xj/8AgAoGm9yOdPG3oZW3kAVXN4zZdcTlZ948jN4arr4w/HjcABcDNN620YhNsjt8p0vJpKyY0CyQO0JQA0Y6uplEzHxbOSFVbFs5Kvo1QvggwHiYqTWxjoOR3Xr111PPN6ZsYB4EQiwaUkz2E/x+kqhwWCxHN69MoOhu6/xIf3c3jw6Bn2Pj5H+mTYAsPLtre3K4IgwDRNRCIRrG1syAAczrPxvbGxsiiK2NragiT9/hzTNCGKIv5kKJlH+SDo7xoC6ZNhzM1OYi21ibnZSaRPYjVPmNnPWB+8f3hk6QVdbea8pvVifXNTpuyyM49n+fyppUfNmkDRpC8slIroH+irQprdZ9eKZyXHYRdNu9CpPYr1nN0RXvbxyxJNM8CtAIk3OOHKyorEgGJxms+fWo7bQaJxXchmqmoQv5UPAhiBChpP1Nyuu5me0x0OaFqvawhQIIYGbjiYyJx0+23LNLiXzXCrN8qC/oE+Lnj2UKglUzRjkTfv3koMUarQ9Jyt1EH22LcGpyHAqM1WizrDAGCU5zEHAOLxuBEqALxmyKsZYeamHcnlpMQccnOegspYwnNez+lNl7otD4FCqQhwRJCXBRgIbgIYVK73BeDF1LREW0wmehOJhOEmgPQZN1Vn51QEeTFNtYKGQlgdIDXRqEQsB1fXPwm7mV1BUbqhKN1If/lsnbsdo3fuXlTR9rsuqKoKo1yuWkHDNFH++bcf6uqScX7+A6Is4pLcxa0FVFXF4ODgRZgACGH0+Sz+aSqzl8D2EHDTgbBNsOdmXvFRTx7WPeKfNkX2GoAJZy39RuAAMOeDAMEuXNRRr/aXsYbVEK0CwjcL1FuIUBGkpStVf1rWMhCjiuqZEkMFwGuHp97NR5r7KUt4GkCZxACJKqqj6WoZA4JoMf12d9vNBLrP14lmtcN097UV1GsbBrjdCHMTop0sspRcslb+67cda98dQOiNSFsxgLcF1hEMqLUd7jgN+A/AfwA6w34B4LFBPXf9P10AAAAASUVORK5CYII=\",britishshorthair:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAEnElEQVRoge2ZXWgcVRTHf7NuC+4mQlizBGISsdCieZK8lCBUAgpSwURo8yAq+EEEqw8l7kOEtCgVWUMebB4McQWRtqQBa6ltCIaKIvoU0UAtLYS4mxbCrMMq+6E0yPgQzuyZ2dnvjUjND5aZ3L1z9/7PPefccyfG1rUxNHv6Z5lNzNkA7aEw2UIegFTyNl42Vy4YU/NXAehoi5DJWSV9HuruB+D96Xft9lAYwBlT/3109Fmj5GHF+fnPbT2P8dgbhvxuMwS9DVvXxlhYDRPtjAIQBcy0Sbgt5DvA+OhQUxOoFTFWq3EMsKd/Ftg2gIgXop1Rft24BUAk0oFlZQCQ1a/VCLLygDOG3HvHkLEXLy3Zur3/4f3e9oqeU43gM899wcUzw5gLh6t2jkQ6nKsWMDV/lURbhPHRIWfiXiwr4zwvz3rHqBdt0EYJ/H5nL4eOXGH4xCrDJ1Y5dORKQwNJ/FfyBsvKOKLzuYLTru/90EJbIVpjzCbmbL/40mFgpk3fSekVFNa+OWOAe0XHR4foGhixJY/4CZak5kWSH7iTstyPvfxqUyHgMoCIHui6yb4nPuT8ZzMcff4Ya1+9ycrmduyJMcoZQNwc8P1exOukqp9pDxUTsJk2q654swYI+DWubO5nZnqSr7/9jpnpSUd8LbSHws4HiuLyuUKJePlOP+NNwH74GbZRAlCMK+3q2UKe3r5u1wro1YeiKP3ReJMlbIuXfjoxAr67j/TbKYLNupCX5eVlWwwlXmBZGUe410i6GMom1yt6gddgrTBM8EKsl6dffIoPLu+zAd46vGYAfPnpIgDX7z9mA0zEYkYmZzkVX7nKb/HSEtHOqMubIpEOVyXpDQEoxr6ZNjHTZsnql7s2S2AknnKKIM1IPMVIPOVqk7JTX70fgLXkum/y0ruAFi+I0bQH+IVZuZBrBEPqfsvKuJKUvpfJppK3OfXOyYoho0MA3LuFnnBvXzfgXnk/1x84+KghBZZc25IT3Mn+yd9/bXHf4+caVw8EUz/9YACcOv1JxY6ziTm7t6/bOSiVyx0iRLYwP/Hec0U58X71B0Au9RsA99y7t+Kca6HkMNQs2UIefJKgoL1LPKtcAtRhJOGVaPL058XI5Cym4qdtwHHv9+JxJ/HJfTkmYjGXJ5w9d9aG7clXOk5LaFWqQs20yeuvHTcAMn9sNqKvKsbbkyddAiU2a8UbCsvLyzaUVnE6x4B7J9BG8IaC5IDE5Z/rmletBMqd85uhkni/Elj6+uWBrcUX+Ch+sOVzFJxSuJwh6t2H/YogTT5XcO0s0lfXDjr5HXhlhejgxTok1UcAiuJbYQTv/q+FVjoNitesJdddbbeWnuTGxwM1yqmfqrtAvcWGLm116aqzPxTLWjGiPkC5CqENi3BPazO/Jgj+hxahWuHjxXtM9tYB2su0J4lB2kNh16HrwPGVen6+blwe4Fee1kurD1dy3mj27W85Avo93/+R4EuPdRm57kHX21edyAYf6QHg+182/v3ZsXMrL/i+EYKdfQnxXyKw8GPWltW/dv0msJ2RH+x5oOp/a+4GHA/wewW2yy677HK38w9rBcEZWeOGrAAAAABJRU5ErkJggg==\",calico_tame:\"data:image/png;base64,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\",calico:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAFWUlEQVR42uxZXWgcVRQ+ExfBbkxIt4naajCbfSl5aVPaJ2mrm5XWUAQ1fVCkrdUEIrSCIgUjPrgFqT5oH4QWxIBUpDGltpBKk9gN+FAaTPNSfIm7osafTdPSdGteNOP97s65uXN39ifZmRCIB5bZmbmzd75zv/Odc+5atm2TaT9lMvJiOFxL9+7l5LX01FTBuEQiYVGFNvXZroKJej7P0YN1dXxqnR+6Uvb5THPfkucuZSGviwD+cFOjc9ZIf2ZnqD7SWNVE1lP99MDPX9Lf6cvq2v7dUTqbSsvvcIQASbHDYwyYVsJqvC5+c7JXff/9ynFauHFanUca6pc92fzjL9K66NPyc2vrJxRvyUonlDGsvH171pLPtYWuyc/4id22F6t8YYBclb4u2hffsrhiWzsVeBxnb99Z0kQYj+fgBH5WOoGOCkfUinCYE1dqC54DcFhDxKaatm51vUG8F9/znQHsBJ2ufhiAM/g7szPKCRzXpQyrD2NNwjmcUjUDIHiI+Zee26NicfG4oCam60fJ1l4mIlby2sRkwRvsaN/iuSwAzDrC4PkIO3XIvfrQAugAgwRzws49OCEMNviwQCEvQRo89Sq1Jk5SbOhHimzcTAeuTlJvhZNxXIKedsfH6roJXhdVGVqxfhsiCdB4loHzAsxrq89OUItTjThPpdOSATBmAezMuW/pvktD9O/eZyh38QUVb48dHFAv4KUD6wVTeOym7QkV8/pqM3jWkuZHN0mhnR4fVvGuZ49iegJrbWmxqmaApJRwAkBz+hOhQbRzp7iZU6kJ6VCPQx2UcoADAE4AILu+03Uf4DkcdCAYy8+VAuy3hXQPxp/Y5rr51WtH5DF1ppPC9zep69vfTrH3PUIgaesUtpxVZuCm05h9uuIz9U0RNh2B89aWKkOAK0EWNFPEtFxrMRNKxD/nbQmGQ8CsJPUQYAcgBC6OTtKliZt0d25OahLqBGSJUlZMdKuqA6o1ZsDL754T2WREAjr23gcuFkRjMQWc6X82lXNlIrAg4xFmfpoUQaaTrtDWyBuLRYdDZ4eiFoeAFwPEGDn4eCq/MADPWSa6a7GQYQfcGjikYn9iLs+M9roZyR6EgHCCtfHJdwJzgNIAM5bGR9zghRrb653SFALppb5obpi6e9sbJZ29zOwrmDHxSFadgz2wL94PthcIVUrnSi1fS+SdQATh3CC/Z5q7XVnA7CtYAMECOI7DoPfDETofIAOkCAr1V0I3+v0PLkH0qvaKiZCTRWyzskMs3/hnRwELWAR/7e9S149duKvAI3zEd+uj5xeonAAvmwEaeEVvXhmUyZXmXz2FAsC6aIcqYVHF1RvFEOuOXlxJu7CHget7BcG1w3rt78eE+A0AkMCdFGgKrNlac2GFIgwaojNgRfYD+KWLdXCljqZxDuf8bo7jKlBnFm/AoNLsSQ4IAd2gWLAiDig3mQkaRQ2A4Dg8POwai9jPC2DhBorZEOkG8GACQvDZI5/K30Hsc2cYWBbAJKOZqFReeN6rjV2q1e77WjVL7ABd/fWyFkeuBd4azG9P4D16kmP53mNwf7BpEAodp8ui+EC6yxYMSI+dViqvFzKmYcVQB6B7++W36QL2eGkA7nHBxeBhsn7o66KOwycUCwJLg9PfJWUW4MbDbD/ffP0VS49vL9ErtZtbomdw5X+uHJkBqrhKDgTLAFZqSxyxITFvDFgqOD+sWDgGxYC8GrZ129ycsFP82HAoxwAvC1L0ChjAjQZvdqzEJsRqMuuPv7KqEuQtMO1/gEA7sVXlAH3DkYuYRx5qslY7AK+/9pa1I7RWrYbWuP3vgLXugP8EGABT2d7tU6lJvAAAAABJRU5ErkJggg==\",graytabby_tame:\"data:image/png;base64,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\",jellie_tame:\"data:image/png;base64,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\",jellie:\"data:image/png;base64,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\",persian_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAR3N4QvEAAADIUlEQVRo3u1Yv2vbQBR+ks9QhNe6aHJA2DT9gZY6pVAylW6l0Km0dCh0TiBroUP/gED/glKalO7dSqbS1E6TISJQg10PmlycVWiJhTood3k63Z1kS7ZK4wdGutNZd+97733vPWlhGAIvzu4msVoNNh72XRCJ/fzdBLKK+4Uk5gwzuvojgMYj9btOjwgAgPP14/R7K0QXTWLl+TH/LLf4IyhTiOxBrd5k9954EFPeajWkXpFVvPEAanV031Bbnnndwxfx+at3JoUDgJVn45wKH/ypn+Hxld97VQuFmN0ux3ukHsDi83wjVVhkkZv6fhWPhwpuESqK+QKfLS8AlPCY1Q0zuYFhQm3FZIh740F0+P4myUqMw77LQOMVd3o+2GlWnhMIQg94eXAbvr15Cj+f3YC1T79g/e1neH/3JNMLu91uqOs6BEEAmqbBrcqPKlWYV9xqNeBkcu/serMCnU4HCImOEwQBVCoVCMMQ1q5BVejyBZGndryzwVIeH/sRUSXnlKnx/oNM6/hQEpGu6EyJc6Wlz9QQ6PkAEB3SQpvSTfAVKxT9TwRA/B2yjKHikCyGKEo0USHkHW4nD9XemqrgYTyRwfoqa2MAhNf21qQYAGilxruUbF4BAPUW7DkyDhCtm0byAkDm4Va8JWUhgNdhy2KrO9/3lHvNVD9gD/jw+hWxV41YrIrunZ4PTx6vpiPOeYAqHHgQYjUIZfmcJDcTB6him1pE2oycHhHwRzHS5PO/LOvwxRcYZu5St5QQAMNkdb6V2g+cu/7KuhyMeQPg7EYVHbWqd7hNKMHQe5648BpR9aZKXTgcLAX7L0K0450NIipkMgsfo7RLQ2GgygIx5UVWn3MI6IX390j5Yd8FvgymBRTzJArSglxe+kFEBgQ9oOwqa15q9WaC/JyeD/aqwebozxsPov/hxmeRAOAPHYWAwH1Ewe/FJTR9FguDOTQ8ubJAWjmrKkRkfcPF2JUT4YK8gKSVorN8fMSFj6xpwiEx7LulZQOSpRmZNivUGheeYcO/LTpVusxcXKZkL4X/U9HhkssSgCUASwCWACwBuMzyFz6jzlJ6Dg/9AAAAAElFTkSuQmCC\",persian:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAEhUlEQVRoge2YXWgcVRTHf4PbgJutJqYsBD8SGjYlDbI+RaGhkSAFibZBKLHaIkKwoLQvCYKK3/gg2BerDxVFqtUoCtZiK4qIUfPQlEBXqYGUSGOElJh1o9ndhE3q+DBz7t75zGYnfdv/y9y9c+fec/7n866xeukwOrZ0nuDiqaNmW3uLmpuemsEPx0dGjTc+/R6AxkQTuXzWs2b7rZ0A/J15x/S8jDdbz+Ici9t2Gb6H2Ggo/m4CZL79EICW/hcNOTcKYu6J1UuHWSm0OOba2lsUCfoYYHigN5IAFOeifR8RioAtnScAiwCARDKlFuXnLwOW8vKcnppBrF8NCfn5yySS5fHwU8873sveYnlBes8ha1CeD/Wc9RDb9+hpvvyon/nP+tSkrrz6HRAGIux7iSaGB3qV4G5YCqfUeHpqhjb7nU7mhrAJ3hNbLNXRs/+cNvULY+f6yvFpH6TnBLC8YE37nctnGR7oXZcEHUG5xYPinCNfOGSLCEMSnrJ62OY242JBPxwfGTUABwnDA70cOdCjEqv728xkkb3PvO7ryg0LY+UQiDeXrW6Pjda90ULAb/Lx83fy4wsPM/7ITro+/o3dr3zC+3f/WtGG7779qiXwwpiy+JEDPYBXcSEk3Z0CUVS3tBv63CYlT0Mvee7Y1+NWn4Ng901331fROoHf2XqouM93yxXZAzKTRcAucdqhcoj+hLJC1ndepLude7jLpsCdU3RUYojNgi97S+PHPE3L1q6hipg2r5wxITxPCNwkBCnpZwx5VipXEIwvnr6DBx67n1h9nwmwVjhrAHx18msA+p98ywTL1XL5rOr4gjq/hoUxU7xF9xwIzgHudRtBZAJkIJYTAqQxkvlKY03WC4I8wVF5tLV6r5BIpsj8/F3oeXcdfDMaASefGzTTHfHAdlfGmckiD+3rWJdx88oZhweIMpWSADjK3eK2XYb0FvJMzDxLaWmZayur3HTvSPXaA7Gpf/8zps7nee3gUOhCsezFU0dNCGE+3kwiaSmtOr72Fg+p4BPz7h4koCfJ/7EAwA031oXKXAl8+4DIsEmAcmXxgyOpte727BGEusZ6SrkC15ZLkUU1cvksM6dfdlhVqsDWriHDryLocIeEOX/BpDjnKZ/g3xOoMAhQ+JbUg6Ehl/vnatjrdWGISwukkal4A1dyNOcvWPvZJOjwqwKOMPAhYTG+3ZMD+OkJVvMr7BiciE7A0vgxUxdsUwiwlfdLqpnJIpJ0BWEe8NfoS0bjztsoLS1TmPWW3eT+sxuS1w2VA4I6trAmxDeD29k7kUzRhmV1t/Lg9IY2UDlDVQCbkB2DE8BEJCXD4InxoN4/CJ4coHWCOqSUAoqEwGoAioji1c+NwmwW8YK15RLx5M1qmfQr1WLdKlDxnT3kW/e9ofy7fAfxkGB7UmE2S/3tTY4QaO3/oWqZ3IhBeCtaTaelx3/QpUnepTvi6t8hP0+wQsCLP7/ZA0D9PR9sVDwHHB6wGTeuqNdTN/zuGwDlDiAiAaL09bpuXg/IX+011FBDDTXUUEMNUfA/XU55oQKUV7MAAAAASUVORK5CYII=\",ragdoll_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERASXl47NaAAADqUlEQVRo3u1YPUhbURT+8nIDr9DSV2iGDBkUAv4gWTNlKELngJtdbKGgjlWXrkXwp1sTp+rkVCGTQ0E6uBihixUTaMElQ4ZAEzqUCybcDvW8ntx3XxKTvEijBx557+a+d893znd+7g0ppaDLwV5WJFNpRGNxVCtlnBWOcVm88Mxb28o10KX8KJ2LaCwOAKhWygAA/pyYnGl0eh8A8rs7N167nQjTIIEnJZOpNG5bSJ9Bi/BbjDzPjUHGOSsc97QYeR6A+226T0zOGN+p1+stOr5+u94y7jhOX0yw/BQlquV3d1zFSeFeGPHz1+8rfhHwXo2pG3SgDMjv7mB8atoFSs/9SLn4NcKfL4sX7jdN+UUHyvPFIMNB6MmJPELUT6bSLQrS3GQqjYO9rMeAcwvLRkqaAHcCzr0clBEEX4iy/bM3Obx4tYLTw208n3+H7Mccvrxf8iRIkxQKBWVZFprNJkKhECYmJiLVShnjU9MuYGJXNBZHqVS6CofDODk5gRB/1Wk2mwiHw1BK4cmjBxET5QdBfwAQlIzI8+NT03hcO8fp4TY2V5fweX8d1cq56z19vi4EWGcV9zbdz2bm8dR5GNENats2pJS+QHkC7dsApAyB4h5e28p5sj/9+tI386+KkLJkWM4Ancq2bQOAC5yPDRKwxwC8ofArRY7jwHEc93+/eVSebNtGfCzR4jHdYBwQAeX3fMzP8+3K543L4MFeVpiSmt+4n3DFpZQtDPBrbqSU7mUC3e43kDI4CJFSolope/IFzyWcCdFY3ON1KWVXlaIfCX0vfhM6TU0Zm/qBTj24lFLwWOallYPh36WcYTKCbduNQA1g2gy124ywfNHoZAACdZTf91SAzMtFTziY4j5oA1hB0Z/Xa/I0ZwCxIhqL+4IfhoSUUthcXRJ8i0lJb25hudEpAeqdXzchwBuhaqWM+FjCWP6GEgIbK4stAHVqdhI9FMgA3AhH+X1P/Pt1lcPOAVa/mxy/EPDr5EzrVStl2LZ9K2FgtVNsEHVYn3dZvHDZcFY4bjGQqQ8IPAd82v0g/Dq0boDqOYA6QaoCpm6Ql0DTaQ+9f82KQEOgYyPUSyNCnmx3pthNf09GCNwA7XZ3vR4+8s2QDp4/z2bmPfv7YYZCW/r3InRG5zhOx40T32zdlritcLdlbtREEEB++jqo05b/Qaxuy9fISq1WE0opoZQSGyuL7v31OEb9CtVqNaEnonq93pLQRlm63g7fuRxwb4B7A9wN+QN1QRbvD6ZXkgAAAABJRU5ErkJggg==\",ragdoll:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAFGUlEQVRoge2YT2gcVRjAf7PZhtEUQygRY7rFBNrqBs3BgyGHKEEUrdDuIeQQqbKWhC25iNsUbA891ErTCIIxMVYXqhaRIOnBmlaklAhtcsghidliDpFmlUjXZSLZukO2cTxs3+yb2dl/mT2Ukh8s8+btmzff973v+943T0kv9iGzo2WM8ciw0drWQX2Dj/hqjLnpKZaji9hZunVDGfruGgB1O3ehJRM5Y5obWwCYufmTUd/gAyC+GgNAvq/f06jkPCwRX/nTAJiIjALQe+q0It7rBq+9I73Yx+9KhylcfYOP1rYOx4eXbt0g3N3pSoBSEfJUGtMAO1rGgIwB5JUXniBobetgbnoKALH6pRpBrDxgzi3aV46dt4wVc5P2GHJ/74kz9/sR/QU9pxiegz2XALgzfoA74wdMQYWrTURGTcGFwHaPKMUQwmhye256ymJM+VcKskG3indto5oXu36UuuY5+LqHZn+LqehEZJRmf0vBibRkgnB3J+HuzrwKyEZYji6aczrlF5n4asyaLyoYDspSdN6SnETCCwRDZigIA8jhIMbaufL9eQWwGCHc3cm+Z9qNQgqLpGZHJD/AlEdu7/M/5yoEzBwgK9/53ghvvhNm5vIQr/ac5tMvR7j20VGAnJxgZ+ib6xmB09m+4+e+tuwkdmPeH2+JdSdkl6+E+wN45qanLKvZ7G+hVltg5vIQg8eOcvXiSWq1BdNd7eNLEdS+jS5HF83nnRRRVbWg0IXeXS5eIZjI7vLKDJwbMQfK/+erCwAIWF1VNqzsAWCNZ6G0ruvmVKJP3jEqjff40KirGLLTe+KMoaoqvqa9Zp+TwWSF5BUXbScvsBuiEp7gnRjYwxtvvcalmWcNgEMvLCgAP1yYBODe0wMGQFewX9GSCbPiy1f5qVVZwXVdd/QAgVh9p1UXyFum09Ut3sDgCgyOMR4ZtvwRGFwBYDyS7RNlp/0qk0qlgIxS8dWYpXACLLkEsp5Q3+DLUV7X9aJbpFuUpei8IQSSY9SesSFTDxQLmVQqZUB2VeWEKSsjzytyhqMRNv9VRG0hrjtvv8/GeopNPc1jL33rygDeC6MfKwAffBIpOHApOm8EgiECwZABlLT/2osW2bByLOdTPh/Jlb8BqHqkuqTxhfC4nsEBOaZFGIDVA4RX1Df4ylIeoLquBoDN1IZrWRUtmeDzUycNwHTv8ciwmfhEOx9dwX6LJ5QSAnIhFF+N4WvamzcRPvlEU0FP0/75qyRF86GcDYcsCgaCobImsIeCMABkjfDzxMWc+AfnqrKUHMAvvaSTOvuPzLo2gKfYR85W0HXd4gEyTu+Lr8ZQVdUxDNKTh/lssI3qX9/lw7d3k548TDqZmfu3L553Lav5LeC0TwOW6s/pWgz7fi2HgX0OXddzjLD/yCwwW5ZS5ZAT43alihUc9hygaZqhqqpZB8jzOG2tkHvaI55XVZX/5vqUu7EEdf7dbKynuJfa4NHHa82x4iBnq+QcidnZSiEi3L/QmWIpHqTrOulYghrfLjbWU9yNZSrPpw5dL1umfHiBnGpNZqvfCvLHkF15+f7lQE9OvSDvCJkQyOWPq68AUNP21VbEM7F4QCW+uOrq6sozWLC/4N9O3xsA2QrApQHynfM9yIij9krgbaq6rSQb2y2nr3LyavdnXPNGtDInMOXi9ty/GHlL4UqeujzQaJpmCM6GQ2Zb0zRDSyZo9/tML3gY8QCsra0B2SMwcb/NNtts87DzP9vO+4s0uvUuAAAAAElFTkSuQmCC\",red:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQKSURBVGje7Vg9axVBFN0/IGKljWIdBJ+ISALaCBYGKxttRFSwsooIYiuCoLwqYCNYpBFF8QPsoqWIpDIBsVDwxY88Y1SiTYp17/Wd9ezdOzMbsorRBA6z+7I7M/fccz9ms6XpU5nF3I3hfPHB/pxHxdzcLxT3J0a3ZwuL81FsWL9Joe8/v12+27vaUfSvD+evrwzlqXnsXlLPN0XmEfDy3Na8d7GTfxjfnb+5vC2XexnZABAApAjQzdP7YjgMEiKaEADIe60TgD+5lgU+TexVvLu2S1FuQIwwXoiRUFGAGF+8L/OL0ZhHrplMnkvWFvJBljijTSVkBzobf8r+5qhCrmVBgSgAkIXZC3bxEAkeAVAAyzq0QXGC7EVGEID32lBCNjK0uQYrt1ouCLDvkVASAPkTCbG5QgrQUGwxFFTu4mGPaUDuZSPyHI/WCM4LlphKAiUCUgroT4zovrAeE9BKCGBSMVwM0w0Vmzx4aZ0uoCMlPniEDWDgmTJ3sOcNCZxfMFrFgQCs17oCrMQ8qduNzXY7umHvWeQMbNQlgYxHrvHyDhwyf2uPwttTKwTUMn2EgNDzUIAlpvJswPt4TzA7vjPvdXcovPXb7gcaE2ANspL1yOB3bAjwevy8F1IonbUEWly31gdgUrm+c3ZLCfwuPYK+YEYLbqCaEsDyxyjzaAJG+MhoK0kxtk4AG88ENJ0QIVBRhpcII+FTUYCXQNskwNtQDfRMasKQhF0jHMnbkEIZ5VEc9u3J0ezr4yM6CriRw2+4jhJw/vRxF7HDSCz72kweJIBimaXPVURCwCNg4eEhhRAgIxvPXa1gRQRwvNsyGWtda54MSTjQSzA8AtSoAQkAvM6AAtCNeqjIlmU8NTWV8/9CPUGjEIgQYJ/HAQyHsdjmtcUuvMwkyL19JtkJphofrwaHDiMsZcjYqwI8n9cA4UgeCgFrqPwmHpdreB4hkSQg1GQ06Q5jCqiUQZMHvD7ATYiU2Di2GSEiYqgpIJSFSwnzSN8FQgTY5ilGADdY/A1CkDIkBChACPr+9JgCipBrkJCFvF/eU821Ndirw2hqagcd08TIb9Lf2yYIJ1CRvwCehwq+PDpc+4IF2bMKvFwA4zVvxHKAm8EDtdxTgOfZ2FmA12Xv6/8HpYxDIOZtJsKWRC8MMi/RMdAa27iLfbuzRsQIsOcKi5jEvZLH9d8SYPevZbDmdfTcAyyXAECkxl+JmmDpxf2srY+dy/ogEmxaCgLwmQxnA3sPgmKLzMw8y/qf37e26eXU+fRhaMD6x7cXcoBJSRHwuz2UKmMrPw0OCLA1/28h4I+EgGCyuy+fHBvTkZuc/4KAV/dOKqbvnimv0eT88wSkjsOpv1VPwGo3YI2ANQJWhh9uppdF+i2p1QAAAABJRU5ErkJggg==\",redtabby_tame:\"data:image/png;base64,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\",redtabby:\"data:image/png;base64,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\",siamese:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALhSURBVGje7ZkxSxxBFMf3C0hIZZqE1CKobfINPDsRYiMSCytbmxT5AKnT+Q0ipJDESozYiGhIkyMHNhaCnIhJSNJccfKW/OW/z/d2xtvZu4O7gT+7M+zuzfvNvJk377LO9/VMa+v9uy6093m7+/XwU64f3w4KWmvMZDd/rkv1+NGTXPrdpYWXBYW+c9487LLQXrl4ALhzgKEhCADooQD4N+R+4AC4js7NTT8vdBIA5MqdLoMQA0DD5G9pw7UqA5ifncyNbn9o5JJ7GA8xABivp60HwQPAEOQ+duSTA3gx9fSePACQN20tCGUAAGGgANgolgbAdbxjdciCIHUPADQwAPIRPbrtdrs78fYoN1auUteLodchrBEs2Umk/ax1mkvueXfB2hIytjYAFgRvEYzpFI8sDBTDLy9adxD01lr2PYFltcv7lQFYP867gDfVvalsPQNDNYBY4xGPaEl7EgBWRwBB0w/5cgiAiNvKAMhv67VJK1kcgAVO7j9uPrsT2uVZBB58DS1aIQBloy/P9B0AG88AQpFaCACm/tABgD/xNqfFz/QCADtA7AzAAomQF9sqrjJgf49Wst9flquHwm82XpuKjcV7BeD5P0Ydu44F4GZ3MVftANjfqwLQu4AHwDokaQAy+oBQucgHtZ9zPbTnpwagT6EIpT1VLmW+L0oBgAMhQLDWAL3oeTNARl4ObkMJgKNFjgM8AAzBykPghCrTHidWVu0AEMt70gA4ctShMIfD1hnAOpQN3AVC0ZgGIG08uhoA/N86C1gAMPKYBb/2XxWyV7UDCAUiFgCc8WNPgzpDxBLjxXB2gb7OAITG2ve8bVBnj+AqHA8AAEPwAHhTH1CGDgD073i1kCWKUae1k8WG3MmSoiEASJPhbKDrAFTWyWbzJLv6eflg40KZ5iQuAOqYlvp4GwKQyqgYY1np0uL/AfAfIcMEoHYX4OwsMkCcqBwZAJwDHCkA4zIu4zLS5RbYn4QNQgva+QAAAABJRU5ErkJggg==\",siamesecat_tame:\"data:image/png;base64,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\",siamesecat:\"data:image/png;base64,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\",tabby_tame:\"data:image/png;base64,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\",tabby:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATxSURBVGhD7ZhNaB1VGIa/e0NLaJPatNpUUUoiYgNaRY0VKV2IXURXVqm4sP6CYl1J6w8qKOpCUl21iohY68pi7ULaLvxZhCKJFbFViAomSGqahpTENC1pgl59Tu47fJnM3JvcyaUQ8sBwzpk7c+Z87/dzTpKzBLbfdWNhzeUNtvqyOjv795gNDg0b4zi7D3Qkvp/E3ue2FTZtudeab7nT9r/9snX91F38ZYr93/5ccq6d2zYXaHe98aYtW3ml1TdeN+tvlyJfbGeA0Svq60IrEKTp6rWhrZQLI6dD6wVNEjcNjNcc80GiAPEFKRoQBC/SViLC2uYmG+jpLY7MWq69Jpo7jfs3rS/I+zhjx0Nbrf3VV0JE6H4WEgVgQSxs9NzYDOMJ4UrBe0JzlhNy+dIl1ts/GC44PzEZhCj33mxJTQFC3bcg47e/8FZY/FxAPCAKFEVqS81FlCACYPxtLc2h7f6jb15EyKngyVC8rgWxwGNfHQ59f7/31MC02uBJK2ZnfusoKAJ8Dislbmp7JPE9UgCjBUVZIMBLHx7JVAyDAHQkAoY+s2vUvj/0i93x6HHr3Ndqt993g73XviIIUMp4wGOC5xERr4MvYBiOuHwPtNsAHsbrrIl7jD38xnd4Zy47URI1W1rXv3b+wrhx/TUwZPmaGlu37klb3thmw6f7QjsyfKt1dnbZ7z194Tlgcep7hoZHwxzLapfaxYkJO3PqT1u16gqra2iwJbX14ZocHwtj7vM7z/E87w2OnAsGYvTkxYnwHdrJf/4N8zddtSY80/+/MNw/0Tv4evihQqIUiOfTPVsfLPbMjnzxWbE3hfdWKTSvUueBp54NUdDz43eR9xXS3tMSAAh/nomvT/cyp0CxnTf8lgWIQGphPCgNPv9gz4x0kmA/dPcET3ujZTCt6hXvZ02BaBfgpMZVHEak3S8FC9UeLzBcRVDIQJ7jeRkIbHtUeqJHRksEDJ8vIvVk5I53D0xTNO1+Gj6lSCMdfthC8bxE8MWQFMO4eBpA+/t7QxsXT3NlPRLn+g/vKYyPjdjRrpORsqjt+20bN1ht3Uo79E1HWSHYtlTBvQgsVkbLGGrBpx9/FKWBr/aqAweP/ZrJwHLMevL4sTMt94gAFi4PEtqP73wx9IXEwPvvtO8u3p1KBS8GdSBrjpcj9SRYKRhM5cYYLnJYHlcLCn2e4R3VAMaCcbUJ6hK2tAo3P5ZHwVdmChTET35Eip7x4e+R9+MHIZ33QWlU7QiIToJCoYcRqrpJBQqPcT++wLQaABJCAoBqgNKG9yQE43L/J8hKng/7i4+yIG88LQsjtBGHvu7H4X3m0RyEOXs+xIsgvynnvWh+XG3yGIRhuvRRvMCBhAWRx74FHUbiEBnMCRhHqhDm8jggBOGPQHyPSzXAEx9Xg7wM5VJee+UxGgN8y8LUT4LfMYh5Nt7cklgLOBk+/NgTQUgZiiBciiL61SbUAOWzzz1gEfsOfhn6PnzVh8brN0/LUX8QAowHL4BqQPzvAVA9ANZR7RqQU8UHUgC8GHM9iLALKK8lhCIl7Y8hiUUEeuNxTNY/dsqR83+88HG/1bG4am9Dl5ppEaDQFwhS7aPopSYy7sTRTyIhtG9DPMcXGtFRmJz0ra/YC5moBrAlnf36pK2+e0M4ncFCz38IEYDxhH3r80+HlvEiiyyyyMLH7D+mOQv2YM3IzAAAAABJRU5ErkJggg==\",tuxedo_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAgZsqZHrAAACbUlEQVRo3u1ZPUjDQBR+LReQ4mjAwhVcgp2EdJKIrp3EQcjo0kUHwc3B2cFNcNCloxQyVih0tRikQ4dOhS6CAYc4liJYqIsvXNI2vWtymhoflCSXn5f73vfe+3LNjMdjCFohXyTBsZXVHNh20zs2jDL0+50RcJqmlYhlVYFSCoZRho/B0Hf+9a0X+ix8p063BQAAqqpy+w6zrMjFjuN4kw9OYFmN8F74MRiCaVbAsqoLO6OUeiDyWpCNpa1d37vPY848y/CmAJsKGH0R5+122+fo8OBI4UmBsHeJAwAiesOi1FcURaGUeqnEAvmrKTAPYRF6hkUEJx/cT2QN6HRbcPZQhMcLFfYuXbje77G5J0R1NvKsWVYVTLMC9/d3n9/3zSSPTAAydH2TyHSwspoDbH9sNzHNSiwpELUGZGVTDLuHYZQjgYhb3GfHowIwivk31VgRJVIDkEEoxHAfxyOnALZBTSsRAJhQd7PGRQpjUEWKiKl6o+bTD2wnoZRGVoREdgpEjRROWFbnIK7rEjZfC/kiYXs0Rs91XSKq/8PMtptcLJgVYVVV4wEAHfT7HS5qI2BRqScqiWVZ9iecJEn4TK0BGF3sqYV8kdQbNdB1fST7Y+S3LbIQCgIQdxeQDTBXCrBCZFERMi3n4xAy0gHA6LFbVpz8+QUR226C4zgehfGYUjpB62XrANwpEFzJEa3q+D0Q19rCjzIA+31cwiPxXaDeqPku0HV9BH/YSJhoSVKuSmMAfg3OWhpbdqGTCCm8FDXA2NmG4401uHt5B/vpORXR9wC4ub2aOHF6cp4OAKb9MZImS30N+Acg7QB8AT3XPI98MXL+AAAAAElFTkSuQmCC\",tuxedo:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACYElEQVRo3u2YMUsDMRTH7xuILnZQp4Lgoq5+BDsWRB1UdHByKnTxs/gJHCo4uKmjiHSz4DeQE6mKunQ4eYf/8poml5cmd+3RFv7kEq65vF/yXl4S9Z5PI1VLldVEVbW6mcRx3BfVT2rrUff7PVPzc5VU9H673e7/V+3f1g/ew/fRniSJlyIXAKoBBAAqPQD8TAA4BBiAQWRB4ABo4Pz/XBwm78s0FsgbwPbGYmp0fFlLlQUAEHSzZoIgBWCb+dwAbK0tD8n2UdOgdRAAAMvfBGFsAKTGSqWDQHUeQHVxYKIA0AD3LxbSZyqpPgoMHvhUmVzBVRO3AiQQQhlfCgCAwPMIVwB4F/3w9tIAsMUAydbL4aE9WB6ATum51VzpC+2UI1BQUktJ0PIBAPehUt1JqAwOgBvPAdgyNRMAUyCUAtAF0KAAdANSn/k7oQBIIWAb5SVN2M/DQfR1v+efCp+fHWslzcVHBSANhDoA3Zt6qtwBcH/3AeCTB+gA0OwDgjcAPmhuBA1QkonlDQCptElj3wbz3gVMLkAHt8IA8EREbZMCUOOAmtQYd4H/Eyote5xYuXIHgNnjJU9O8gYwdhfge666B+uCoQQAz+Zs38fMYxV83u0O3F4VAkAHwQWAGgdczgJkPBnOXaDQFYDUWPU91/P7qABMSx9QggNAzg25AoB+H48Gbokk6r1cR9KUO9ilaFbuTQBwTYazgVoHoKxBdjpP0dvHq7NxtpvmIC4A6qYlaAMQyiiJsVzhrsUnHEBhLrBTP0xuG4205FnYVABota6GNDUAfDsou2YAZgCmHMAfOKGQ6jMfQKgAAAAASUVORK5CYII=\",white_tame:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRERAgyMfHj1AAADmUlEQVRo3u1Z3YrTQBQ+TSelP4HF1FIoFBRE3aWyKCIism+x+DwKvoFPoRe+gltEvNgbSViXlS2FQqGGREuTdM1P48VyhkmaTJI2tbrruWkzk87M+c7fd6alIAggKpoxJU2pQZ9104Kv6heQZZmOGYYBBwcHHmQU056TOhEBAMD2XAAAYJ+leo27lmZMSa1aob8RKiTz3jwR4gabUoMe0vZcYMFYVeYXTuh79DlNmlKDKl+kCEkTuFmRm+qmRYGdjEdgey7opgWT8SjxNwvHIwvHI1nH80quBQzDAFmWwTCM3BsNvp267HOj0RCHg3PYtuRGcBXlUeE4MFdZ0/ZcGjYteWc9ANjkYntuoss/f/qMzuMB+v3+EoBJiTFO4SyK66YFbPJjlS9CSoqikHanG9pE+/EO9h6+Am2oQOvWA3hz/AFe3GyGDpAUt6ZpuoIggO/7UCqVQJIksd3pLr2PY7PZzC2Xy+D7PhByiafv+1AulyEIArh9554IAPR8ummF1mnJO14hITC/cGA4Pod2pwutG4egDQ+h//ItaEOFKj4cXM7z5Mmjx2LUUpPxiCrMWr3d6UIbQGTBj/MAWimq4bnJeLR2CJQURSHsgWrVylL2x8zNszzK3t37S4fHw6LysiyHgOQBcHJ2ugQ6e4Zer7eeB2RZQKpcYiTVa6mIs6WpVq3EgobewALOyz+sB22MBywcj8QltaTxPBJnQXasTsRUvrEJ5Vcqg3lLFXpBnOBcXRILL7uZc8DR0REBANjt7VOUk2Ku3emmZt04doa5APMA5gCk3DzrF8X5EwGIa4Z4in38/Ilb71kAULkoALu9fcrvU2N0wwAIm6aaLPfHCvA3SSkIAlBVlbDuvXA8opsWtOQdj9dwxLWxC8cjrFuzxIllg1HytTUPUFWVoIVUVaUdVlNqQJLytuemUtIs7+Acesk2JDUEMH6xddVNa6mfj2ul5xcOtS5bwjCrs2NFcvvcAGDGT6K4k/EITs5OQ7QWP9NqM1qWR5/Zi5dteIPAHjCN57PKpynE1n/e+8gV4pT/E2CkEqE8rWtc0xKlsWwSjDJCHhgbqwLf9Z8ErRWXlfNmYdOeEzamedaPehwqH+pDUi5L1wZgZtmEdxmy6TK0dR7g/3LJNuvw1u8EUUHNmFIgirgG/2cA4MXfdRBBM6YE/7U5fv2eXnrqpnXl3Z9WAfZaKnLlfPUByNoOX9kQgGsu/wG47gD8BiIoaztNTB++AAAAAElFTkSuQmCC\",white:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM9SURBVGhD7ZjdahQxFMezq/WjVdDWKgiCV6Li4iPsU4jP44UPo174DBURL7yRFRVBKQiC1q6Ctn5UWfml8x9OQ5KZ6exuy7o/CDmTyWRyPnKSmY6L8Gnz62jl1FJx5dzm9y336sVzt7y8XLQ4NxwOXb/fjz4f49vW9mjx6IKXt//s+Npen15azI7FnE6eOFY+c+T4Qu135+gW9R5QXpOktsbYLz9+/i6kXTm8roI5SPlxEjUA6GXjfCmRJMN+/PDey7Qhp/j7a2dEKS5LUu1NSRogBmFv6yZISbwtef3d26zy06CRAWA/yguUlcJ2nKZjKnIobenY5MLAuZDXfWo8SWIMSSXGtbW1kZJoTOHUc2Hy07vF+ZUzrZJhF48woFV+48sDt3q552Xqe583vWyV5zkUCgvrkozPxCmDwcDX3BPI127cLGuK1nRY6K/5SR4n5RJg4JdvXvuwWj17y22sD9yjO/d9ffvcip8A9+tMAEPhNbhw8ZI3FjXgfYptU98c1ghCy6kNHTxUyH5CmoyiAaz1q156/crVQtrN+oLnFPp4XsqDDfEQjG77gp1Dr9drtQTGcpiwKGzBLheQAQh52qzBIWYEDAD0jRm/rQHKJcDESVTFZUmqvQkxD9o2FE9FgIgpPw4ab4N1kfdz65t7VTlFOSNV2tKRdxWWkFpztFdtO3YJCOUCxmHSygE6cue8P64zf4rag0uxx0+f+OvUvh3mAJQLDYCxoc43xqQNMLElILSDKIrseeAw4K3LVmjDGy/iNa5jIS1QLvyMpb8Na2TtBAp/4H257U9MPAJ0DmCCyFKY8Ewpj1JSLEWdPrpHv4Oicglo/TJJZAoTzymGV7kv7yr8QZnbtuXGmjRdZXzVIUzUHoE1cWqrRAx5NjU2qE9YTwsfAVVGEFb5FFLA7vG5/vTRWSFUfhrGqFwChCyFT1/JtoSgkJ04ylvD2iQYGsYuhWlFQvk/QJ4Is3LTLMynsFUk5/0w4hQJlqqfpW3p6G8tFo9tSZPehg6a7D4PM2+Aova/ngpxzxF11g1QJkHWn8r/RBfPKw88u/vQ5wHyAQeeWfc++F0AQTsAyiuLt/3jOmfOnDmHG+f+Aa1lvXj2EgkXAAAAAElFTkSuQmCC\"}},Sl.cave_spider={name:\"Cave Spider\",behavior:Pe(),entity:Le(),model:Xe(),thumbnail:\"data:image/png;base64,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\",animations:et(),textures:{default:\"data:image/png;base64,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\"}},Sl.chicken={name:\"Chicken\",aliases:\"bird\",behavior:at(),entity:ot(),model:nt(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAACrFBMVEUAAAADAwIFBQQUEgkJCAcoIhJcUygpJRIZFQ1dXV3dyWOLiooBAQGCdjpbTSvT09NpaWlBQD4ODg3DsVd9AABLPyRUSyUhISElIhiWlpacnJytkVKQgkFyZzJ9fX0AAABGRkZISEhCQDMiIiLLuFqMjIylpaW1oVJNOht0dHRDQ0MVEwnjzmXZ2dlvb29oaGhHR0dFPyPCCwvIpl7BwcHUwF6Tk5O7AACdeDdSRzWwsLCkpKSukVKdnZ24p1JkZGSEhISIcUB1dXWKfT14ZDlrYTBNTU1fAABlWy1LOhomIRlMTExKPiMlJSV9d2uLiHOSkpJnUzONjY3GxsatkFF+fn5yNhlcXFwkHQ+Zi0RLS0tGAAAYFAzo6OiZmZmIiIh/f3/Ozs6pqal3d3fl0Gaenp7MzMy1tbXAwMB4Wyqadjawhj20o07MqmB0WCi0tLSPj4/MAABaRB/m5uazllSXl5cAAABaTjumpqaKioqCgoLT09Ph4eGSkpLR0dGZAAC3t7eHh4eFhYXc3NyysrKfn5+9vb2urq6jo6OOjo6Dg4Pa2trHx8ehoaHDw8ObmpqVcjTb29u5ubmxsbF9fX17e3vLy8vJycm9mjnV1dW/v7+srKyEZC/e3t6np6fFxcWEfG7QsWGmfzuTcTcCAgHg4OC1jTvj4+N0dHR9d25ra2vhymXdxGSfQEB6YzudeDdfSCG+DQbFAADX19ecnJzjzWXdw2TYu2PVt2LNrGDBr1SZdzxvXDu8mDlsUiV5eXmrgztyXThhTCqWOxs+MRqzppCpfn6Kh3WCe27ZxWCijV6lmVyxj1SzVFSzmlK7n1GhSklHR0dGRkaxhz25kzqObDFpVDBfPhx8Hw6WAwG4rY63rY6DgHp4a1WGajqfJyecJSWWOhs/MhvIDQ0B60kpAAAAXXRSTlMAAwcaCzmCOSbH9+ABkYLpc2kQ2ZxeXUYt49vZo6GcnGpeUUjp4tvYo4BfGP3vnYBgVvv67+zq6uTk2traz83Ir6qdmpZ3dnZwbWxeXEnz7enk49rYzMzFuKp2Vx7/RNzuAAAHJElEQVRo3t3aVZfTQBTA8eDu7u7u7u7ukIQWaIFCCyVQChQoUii0uBZ3d3d3d9cvwr2dmU4gLRwgIT38X7a7+7C/M7kzmYcV/qjU2XtVyCkkTamzZxsyZEiVZCEhh5StWhKQOGf7lKFDa5tN4hw3cCBOylyyZX7yKX3ViikEo+Mc1s416PHNcsMsIaeJ3b62eX7kLHM6C1ZMKRgd53AScIZExxs4EJKqBpwQkKobvkpFZ7HZWeAmT23BlO3whXxcaKfNnYGepWvtZY0mFR3hWx8dZWiBGwz4IT4JOJCxJASNGOFDDuab6qOflgyhLTk6JRx1bByxKkxlBY0cbwRhZJSHuGchac1UypllW7QStl4YOMgEEnl2hpEQxERklIGk5ojiSnxwyMGmHLU7o9kKljCI1JKBcJZYnAMgWDTGQemCtcDBcSprDKnYE4uWhJwZwME2qjiko3OBgzUyglRs4jYtiXGwlVOnfMdxL/HhLEHhlUMbdkqhP2jixG22hWqSmhOdoalTvuOQ8QYOhCS9QVDANldFWko5DMRDECpwH8LCYSMWwiwZALKpSB5mUbQg3HLkWMCFA47es5Sy/zYCYiQOmjZ5vgZESOz57Vw4l77sMunF6VB/9NYv2xBESBspCDmSlADEOCPgjJwxFzger1U3Drb1GoBIex5HCEiRJBXI7dYu01DgYDMiXqvVqgenY4MDW6KgHc8evmGgidseR9QgxbUxurMWuH+c7RF2W9QzFxfIqgdnEnRgC3BWQw/fEhAeAitiIMUlSWHgYEjiHAhJ8MQgIP01qMck0rlL51dHOz/hehQE7SIgmnMoxF+4dHuRcJNhM5S/Bo3aehk5Z/GJnQfOjqejR9+7ngjED2otCTmy/PegUaO2HkAOtgM52L3327QgLQc7OpS28Zgs6wHCDsJQ8+iO2wYgmB0OisdZ72OcyCJJJ1Bi0i4Vx++1MY47LkcUdQVx0tlz9BC49HyTiiPLsxe4yc5iN203e8OGQy5R1Au0brGKhBxyCABn5NgYyC9Dy3DHAwdCkpvyfOGQJDFQcOZfg0aOVJM+TKKtGzl2rBbEW7OT3d+cksRAwZmSpANITcJDAHoBmsQgPIr4dVKJgeZLki4gDQk5WpB/RjyOKBoDUpMWj2Xd4iD/vLn28CotxygQJ3HQhUO7GWgycCAgTfmOowX9/VCnL68mMRByxo+noJnBaUsJyBkaQS7/CzYAQQuaGYRtrztpMeUQEP4ReZrNBiRnSBQXwuUfOF55vsiukxwUJOeQ3qTFhENBM2UZQdAGEVoFF0k7nJIAYhwKUlxemYB0JxGOBjQPBXjbXiozEHAoCF96OoKQ1JeBxjLPlXda0Kq4oMnA0RWE5T78mYOQs2meKwZyakDTOGjyNHEaAy3XETRu3OGrFIQcj8USA7ksAed3IEkRKQg5IgMtv2jVFURIAHr56pEF4iD4ZhmfIeRQEHIYSL5oteoNQtLYl69eT98/j4D8XgKC5sR2mciaDxwOWm41AISk19OnT98/fM48i4tw1KCFKpDiUsR/AToyPQoaPnyOhJhEK4QbXeEe/UGD6n0PgmZSj/dYDGQnIGpQCMcve/UGYanb1YsL8orLZsdAs5eGCchFQciRjQEhqSYDPaIg5NhsKhC81WZwEOEQ0MwVOoOwTPe/IujjjYAnBCDC+QFkC8RALuAQEL6DLxoBGr7ofs1PNyyBgMXiCU1GTmRZIhDuQQYKyrA+hoAgCyu6OhZLZNmyOCDg8JBjGGhODDQ7CoI2eAhIcUWcBKT4NZx/CfIMn+OxzMGTxwNvtYCoTJaCcTn98hkB8mhB+GNFgjbgeuE7NRiHkwE4uoOwkEcDglwIwt+EJAQZzuEgJG1IANrAQYZzsD7DafN+CfqBk1kwpJQ5yvwM5PdKxxCEx6Dxq8NJDBSZrQbRk0c6FvqBU0owNiQhiJA4aLJM+4GjfVhGkABESR4NaLnxHC2peAEmgkMgEehWDsHwtCQ8BObFA226MyGNYHha0nBMC+p6Z8IE40FaUlwQzk7WCSaAoqQ4INzoJoFwx/X8AdSsiyCYCEJSdw4CTmbBVBCWum1dCrpZAzjmg4A0sC6Abt51pBKSA4Sr1O2uw5FEIEEo4khqUFrHg2QDORwPkg3kSCf8Rv8pKH3hLMSQsn3pM+aD0hfeO2xYRiABZ9iwYbfPmAlCTuVhEJAKIwcrl9M80ODWtcZsPjFMXa4aKQSzQJWAg23ep+GYA0rRuTd6Tp88zjw4SyaCkFSIczjJNBCS8uYikL2nTsRIleh/V5c7809BnIQcnCVOSgWcpuQQ+OcgJJUbQ+KkVsjBSqcXTChFnkLoYTuOV6dNasGc1KQk4KhJp/YChY+3eSGpMeUkD4kdAsdP0gdXuVUKwcyQhJzTZJYqD8gvmB4cAqfpeBdOAg6bJahFknDojvsbzjfW5mspUxngPQAAAABJRU5ErkJggg==\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAGfSURBVGje7Vg7TgMxEPWh6FHEHSgoSUWHuAoSd6DhAlRptkoRaS8AK3ELJJMJO9HLaGbiJOB1HD/pyZv9KPvejmfGDgEQ1xiGITL6vt9hULB4vomr1+tII/Hl6WqHIQHfX49J9/07WDibQKK7rtvQMmB+O9uKp+NDDSDxzCIMwAgg4ZFOr0nH8st7TDXi4/1hI57GSb/6oZAC9zH1ffq3uziZAfSTIoDIlzgicByv/z4/Rgjz1PfJHglS2D5SLqjKABaUIhorghT+V0Z8Lu/zG4ACWYAmmqtClQawOMz6eF4y1A5vSkhgTqgGWm7gcxdlABqB+QLFW11iVQbIthhNqTInYBJEoVpSPCYCvAVWMQZYlUArjccm2WJWgDifveZIywO8cpR9gyeweAOsKmAZoHWN4/rC/d8iDZDzH8VjEpTPauNZGSBFasRrGqQxZ2GA9pWtZKdFhwc2Sm614Sh3obJWB22Oa72/VgW8FtnaR7CiBu/LaoCWvVMNkD2CFGx1jtooc1D2en8qvYZJqyBW2byY1WZDQ0NDQ0NDw9T4AXr53/OT/m8uAAAAAElFTkSuQmCC\"},animations:st()},Sl.cod={name:\"Cod\",aliases:\"fish\",behavior:At(),entity:dt(),model:ut(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABjUlEQVRYw+1WMU4DMRD0TyJR8ARaChoqJCpEJNKlokpPCZHSIsEbKEiHKClANDyAIjyBRxjGunHGmzUKIaSJTxrZXu/tjmfXpwsxxnA96sfL4XF8vrsiAuxcf85eiLA/OEl78Md7ugf74+15jqMxPBt8U3IPDAYgwfvrFMgESFoJ4MGel/g7Dm2F34KjMmWSLnkiwBepgKgE/3ngkGInILkoUxKQ4AU0ydvDTbKRkFXL2kQFJs9geTMBXVgwOAngBDu93ah1xhw2zGsEOiWiSwCy1qAKoM5MbNUiESJ0j55afLi9vAJIIo240C9e+bomVgJ5XShAZjytHT0bRi0D5dUmNd2v5chNngjUEtQarebDsunpmAy++p0pFOBJ7MgrhrXOvVE/Xgrs309Osw/msNkmjOuAl9wm8+y5PjWwcfCRsXfaNhnhNbSNx2YsrsRfoNf3J79/I7Aspk8f5TVclUB/fBH2jg4TMIftYHj2ayJrJbCKEhuTvlqCTROwaAQagUagEWgEGoHtJoDfkC+ediSxd/s1IgAAAABJRU5ErkJggg==\"},animations:ht()},Sl.cow={name:\"Cow\",behavior:_t(),entity:vt(),model:wt(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAACuFBMVEUAAAAcFRAQDAkSDwsBAQEKCAggGBMdFxEuLi4CAgEBAQEQDg4bFRAIBwcPDw8XEg4pIBgNCgcHBgYODAwNCwsQDQkMCggDAwMBAQESEBAODAwSEBCFhYUtIxogGRMlHBUrIhgMCwsLCggqIBgkHRYlHhZeXl5jY2M5OTkJBwcHBgYYGBgNCggzMzMgGRRDQ0MyMjIQDg4MCgpiYWEODAwLCQklJSUJCAgbGRgvLy8tLS10dHQ8PDwlHheIiIgzKSAsIRo5OTlycnJ+fn53d3dPT09OTk4uLi4pIBcmHRY+MSMgGRM2Kx4yJh2jo6M5LCEqIhmPj49ra2snHhYjGxVhYWEwJRuSkpISDw88LyIODAx1dXUzJx2BgYEiGhQuIxorIhk0KR5NTU0vJBtlZWU6LSGioqKMjIyfn59iYmIsIxmwsLChoaGUk5M6My2dnZxYUEgsIRl/f36Hh4dlX1kqIRiZmZmOjo6KiomFhYVdXFxHQ0ABAQCXl5eVlZVnZ2d/W1tEOCwwKCGbm5t0dHNaWVlUU1IaFBCurq53dnZpaWlFPTVIPTE7NTFGOzBBNSg1KSAtJR6AfHh5eHhzcnJWTkZPRz9CPTk/MiV8enp4dHBeWFJQUFBbVE5MTExTTUZOSURNRDo6Ojo/ODY0NDQ2MCkrIxyNjY2HhIF0cW9UUE1PSkYxKiWenp5vb25vbWtoaGhwa2VmYl5dXV1WUU1JSEdUS0JGQT1DPzw4MSspKSk7LyQWExKOi4iAgIB9fHyCf3p0cGtraWdqZ2VMSEVLQTZBOzY+NzIxMTBBOC/MzMyEgH1qZF1XVlZiW1NbVlJSTktFRUU9MCg0LSWUkY5uaGJhXFd8V1deVU08PDxHQDk4MzAnJyckJCQfHh4cFhJhXl1vT09LRD4xLy7CwsFeREFQOzgNCghoyrd/AAAASHRSTlMAuFRUA4rSuFEVEfDSgyy4sDZ19OlFMR4L/fn00cXAvLWoVtra0sytpZZ9YDz59d/c2tLRwLimmGlhVf30493d3dvT0s+rqppfRaYQAAALhklEQVRo3s3Y918TZxwH8HTvvffee++97iE5Mu5yB15CJhAg7L3LrIBsyi6IDFFRHKBVWq1W66i1tXvv8W/0+73nLpeUX+8aPy8jaHj5vPM83+f7TTTpn/Nfv/1M04mT8197RpKkE4Z0/h0FEuREIZ1/R1pi+MOtktTrbpGkR+JNuvwOUcwePiwIbetEUSxLF8VX40m6/ELr0siWDqvV12W1bv84lJjWUBJOvDZOJOQoSU5ISIYvee8nygHSqab/OchJSAZJcipyIPElIUeLBooX6aIIJ1nZHtwpDCWl5UIphV952mjScg6s37Z9kH6XiqZU/Ku3PxDFwi1loviywaRYTt0B5EADmu9QtypZVW7/djCh81gj9KVTDCZddKPKGemTtvYDp2Vr3fJqovu1NL7whXDbzcaRKAfvFXCAIsHDbbdv6Vhe4KlKVXWxApB0ZmgcKz2Tuq/shb17yuzu3rKNoerS3Y0jyiYtv3UuQRC8vP4WyrHKoFVb7KJYszE3OxuuEqTELW09oG1NMj5iOGazSf/ce0NXFEfM3giStESamr6JqF1JTUiFn5TPy0c5+oCufPKBN66g31527703wEu1gKfu63TgoCg3UcnG9Baprz9hWVAkAEcv0J2jY4vPypzrrFaLT/DBv9+xFS5yWQ16wqqnGmZ8TAl15nUqBcQCR0dQ0+jUfcihLQaOoAMOK728OjExtyZ6h3LXqZxVyCkqE8uKBrF+GPTwKfqB/FP3IUdN3WxaSXVIQdREPA3Z4l6UJPR/KH3Yf7REfq7kaFc+R3gzT4huNfT4ov+HzxNisn02cXnw2ktfdwBHaklXvGn2xnqGIxyB8DyvEwg5sakrEkORUq6pDqU1ZDekfXlsVZFUkF7Y2+IWG9IaygtqgONw1DMQQjhw6QO67IWYHocX7KvsbLFGEYWhlst3rxVnYWYl5M1CTZU01EBzKmuRNs07HI5gN4I4eOgEgptlRcmBkU5YcLvV2vlVAxzFRnj0zMqi9F5JcuThoM9LBw72JMCmpQedtY7gjkyGRjcQ67IiZy/c6a8+FsUPtgAnFEbOBNZSWvWQJO3bPqjcrlLghHLh2bWNjgynEzm6g1ifpRM4ItyrcAm+/txq+ANysMVM9NgL3kYO5tsGnB9warOODAeAPgKGISBL295qPIWS7OyGhnJpqHDvgYTBtk4QdXkWCqS+d6AZ49Qa/HYt/tS+nZVOg0EWq5iLTSd7bYEkNX59ODX5+7GxsY+sAYbZL0lFq+gUBSC8ax3OYZjKjFqjQXY7kELVhb1SefbRQWvyZ01jaw7BKrbmXzvAEhnrLi8D2e+ABDfviMLoBhpqU0BAghS6cxPTxKJOAE0dYrwDGeutNBaXj3Iwqx1yNBDRDxQO9RxAEA2cWK+YLYp7KwH0xwBUyri1y4IcQRA8xQxGAw0QTgVhs9YHFAqHw0cjIHfBJtioljbmjzXf7ToEa7buBwmLnEw4lhjQ5ozJKBDRC/TzfCg8bLGmKyD3RMfRj2DlP6YOISjorLRlBoBUjzvAcBoIi3qSqBWkI6iqqmAlgNzlaxH0ztCERSDE2zE5dejHXbAogGy2zJzFdvQQooJqg/BcxbTq0RdUfuR9ALnL7KV2u3VpCUDFv30zuWvXzz/Cos3TmSCq9LeDRQNhH2qtnGFUEKd49AC53io88iUFzfcPQfWyAZL/DYB+AlBTDuNhBQAtztERGgE5g856Rgv16AKyWOo+nkVQb+k8y/ZMuFgPgN78bfKnn2egBQKItdnmOLRoGRiYdqqgYp1BPgsEQf0deSwbCve0eYjnTcjfdL18BHGEgrR8oYBymvELpyOIpaKRPf0Wi88FTSBUhKDfPudoeQAoYKMbtBx0sEn+QjApZp1AimipE3//MyscXoegz0kEBCn+r4ebA8nBCker09mtcnQEHetZZaE5cuSTVgVEi5X3+lyxIOqcg6rG5viJfwY9QNEPdNhyLGvlB5T055Hvqt5D0BJdOcVss1j+A+IQNNCKbTy4zS+DeIVz/2l6gD7+cjgrSyF19kxV/UPy/+piVFC3AkJFZI7urAAO9vEK//FiDXTuWSZdQFmbdrkjJNdbK7QKBtCG4QkAIYdEQNx+hwJqnubQI1cQT04y6QLqWbmpqipYI5MsEEE7HHjlG+z24e/rKwdgXQrlwLa/tRZBFe1RHIbTCzQcApDfL5O6XHBCqgdKFUGQVue7hGjOmfUZGVhBkxqHMHqBnnxxOLfg+E9jfr+/eXdWF9w5QS0WGbQeQY5oUHdlbdCZ0Rp0wrSvVzhEJxDm1KeeL/D7vzs+5p+q+nEcQWQZqLa5XQV5K4NYPHL2N4+azSlMMdEVhKQH/GvWfHd8qqpq5ZcdsSDbPgRV+NvV4TFHqxlSMdrkHE3xsqxXAXFn6ONB0j0ProH8VLUyK88VoCAOQLZPC4FTCqBpdaproFF/07bvfTBw8tU3JgDSlfSu/ziAYNoTestnPhtKR4+7cEM3pxjJtAYaXZ8qjx0PgDi9QUh6ye+PAnWPNLrdFOTOoQsS0j3QLL+bxhNzpL+DHARB9AZhTjm4qIHy37bb15bLoCEAKQfW7m92gAY479oK7CqI4wwCWSzHcmVQscCy46WAKSwDVu2mncpIRVCzfxtySEoElEk4xBoCsliXWE/3ZwuHXexqNxR0ubsQQLXTMgeyYxuM0ybgwA2MAjFGgSA+X9ueAocjR1jtdlNQqbR5mnLaK4LObYs/QN+JAXnoRDEEhBkv3w0gZuc8gPr6yuHgynKIHKcjWDEAe0FBezQQeowDvW1PRxDDtPXa+2pb7JCDCii4Aw5LBfWVqyDcP0SdZCgI8/2vACotLFVAAx66PTwvg9zjLh+tIWV0GA7iyMJn+2gfwuAu0PfPMmhk9zjrUkA7m7uNB+Hq+9x5v/fGgtDC41vEQM5hBdQOHz7+N9CnrGtiPiffGwPCpECvoqBxx2bnrzOEGAjanLGTgtYVfoqLdrH5CohjFBBPIqAFR7ASPAaBfAhyOhVQo73Ih4v6POpEV0ApBEACgly+hdr1hBgBOhnvjMs1jqBpwikgixwBJ3oMyOxhPbYAfibZ4AQQb+b1B7EsgNh+d3nT6Bwsz8WA1NAPqb8krWAEjy2T9SHITyv9AqNAe/z+OYLRQAFaQfALOW8lrVixgrN5AQTZMalsm0GgtqE9/kXlE/s6FUTfk+C2KZxzznvOZqMgvIG8QSAXfpK3LvzAKOMhCsQoIIVztulWDQTHaAwIEoDbLKAmFhRQJzqvcEzRIB7LPMUYUKYtEAXapBU1ehBEOQrIG1BBhBgG8kSBPnR/rYDUiX4/cGhuCdiQFAHx/ElGgniegj51+ZSiJlwxXPrTTRAKYlkksSxjhhCIQSBvQMD9T0HQ6iEYHRTEtX/yxX9BrIAgTp4kEAOOzBvIxGOQQVipni5logcOVjidXzBcFOghswdBAQABHvhJj+kPstEgCJPiUQfoavjvxG31hESDkpLM+TJf3k3oBrqDbJ5YEE8CKmiDo/bdGRIDeuKqpKSkXzibjTenIGfF1XfrDrLFggiABEGe6BuCnyCHR5Ca82+iJP4XmfPEFSa9QTxYAgGvBjJ74SJ5fDBPfncCiDcroFiSzLkLOHrn5qT3eJsAl9kLHjpCSSAAncaFoPWo5PlzTZhYkjEcBCUlvcfgZY5MdF5ufZCP2jm6bRQUQ7oEOIbk7NOuAdJbxQCinEsvvk0F5dOJjqBlOdVkWM6iJE7hXGm6XgPRY9RAxkcjqRxTDAj7AP+/gyhJ4SAIElBBhMQDhCTg0NwQ8OIeCQBSJvrpprjmBpZFksAWqxM9zqDrsQkgiIHBxiMIjiyeefQ9BkEeAUB0oj9simsehVbJ2SCRiR5n0MXnYPfmEUQn+iV3m+Kbs8+jJPKWzDntLFPcQ0knDCdCOnE4MunuS3Xi/AvmWYzLJJkuWAAAAABJRU5ErkJggg==\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQpSURBVGjevZmhbhwxEIb3ISIVllQFRZWilpYcOYVGB4oOVKcoKK8QEh6puuCoJCzgQHl1JCSkhXmPosrNWPpP//43M/Zeq5w0Ou+u7fV8Ho9nvEMpZTD5sX0cyaf3b8rs49ud3N7els1mU8v2DPLh3esqfM9keP6dnp6W4+PjWtb+/9dP+zX5fX9femWIALDyJqY8AAAClFexZ4vFolxcXNR/k5cC8Hh9PVLQrk3K3d3gSRcAU8iUNyvoAWAym81G8lIATOn1+fkOgJX/GQDM//LysmBpZMqbmOmzvCQAtQD7N2W5HvRuAoDy9m8AUM6UN0ir1WpgQb/Whwn6RX8oq2/R59E12nnmfxAAzLQOFINXp6fOMAOgCqCNLjsA8JTXPtDGFIbZo5wC0Bezl1cHyH4Az6EQt2Xr4WVj/wo0Uh5idVRZtOX7aMuzzpYQAsAL/zx3gsYZAB6g1f16dla+X12NZlPbMQCePb6vk6D1PbMHfJ4AU/Tb5y9VtBwCgPn+XK/Lr5ub+uKHh4cqvAz4vpWtLurzjKoCHoBo5j3ocMAeCLvPfUTevguACRQaqnsoOwC7F9RWww5ApkS0tDzl+bnnIDHjDEjvWVsvMPJkBIAhZAq0JFOO4bRMXv1N5Jv4Gk5zMgDtUMtPT08jyZTgXaAFx6ujO4Rda5jtbbn8bDKAaNbtnils5r5cLqtYGRAUVjQoVj6zMp59hsBtsrgD5YMAeDNn5e12WxWfz+dVrKwAemYme87v44jTC7iihIb7nAwgCoQgGtCYoA1L5MAQ+UFaJpyBsn8v7uB+ce1Fm1xvMoCTk5PJADwIkYVEIDLHp0sQz7ItswlAo71XR0cW1laxsqc8A9CBevRbEHhdt+IFBeA5Uw27UwC69RwKQEF4TiuzAramKVsrQ/DC5yYAncUpAFqBT4/5e2bM+UQWg2RbKkeNVjcFwGJKs/QC8JbDFOVZNA/xAGhSpA6Qc4YRAN3OvOsohOWOWhEemzUU61FezwoiC+CQ2csl9pImD4AOWrM2b90xgMwsPQARCAXAHj06p/CyxMgHjABk66jH9FoAdMAYnCqv25gCiM4BvC03Wgb8bO88oGddTQWggwAAT/kIgM6mZ/J8XMdKsv9AXy6AKMDwToK13AKgM9AbIrPyvBxbZwdRgqU7yZ4P8F7gHWlFTrAnwWkpH4XHXggcQY4mIgXADqpnF2DFskCIz/S8bTD6iMH1shQ7c7ituiMAUfYWzRibNDqqH0MaW6CmrtFHjAxA6xA3eq5199LhKDPzYnOeVQWQnfCqqUcfMbw8P4tFeg5i1Cr3DkSigwdv4PxiBpDFC95ajz5itPyClwjx+1uZJi/doZWGtlJTBhBBiJxd9BGjxzm2xhcFQthddgA01u8RLzlqfSuMAHiO8JC+IFkUyLEFxv0XsXAXcxf0h/wAAAAASUVORK5CYII=\"},animations:kt()},Sl.creeper={name:\"Creeper\",behavior:Qt(),entity:It(),model:Dt(),thumbnail:\"data:image/png;base64,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\",animations:zt(),textures:{default:\"data:image/png;base64,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\"}},Sl.dolphin={name:\"Dolphin\",behavior:Ut(),entity:jt(),model:Ot(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Yt()},Sl.donkey={name:\"Donkey\",rideable:!0,behavior:qt(),entity:Vt(),model:Nt(),animations:ji(),thumbnail:\"data:image/png;base64,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\",textures:{donkey:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAc+SURBVHja3VpNix1FFO3/IExAnBmiMxKiMeJHBoIrRSGbwPiBUSSog4qbBARH3cXNLKLgT3A1uIgrt7px5UJwK/hn2pyG8zjvzL23q997M3mTB5dXXV3VVefUvbdu3e6uW6PfBy9f6G8+/0QpaHNmE+KAd1/f7g9vXJoJrlmHf06c/bQ9ypw8y2PjfXJ9c/av4uOs5Q8gW+oyDQBQJ5xEkoS1JiCaYOukSYCDVxLWmgBM8t6d2ycmiDqagJpFREC0+pRzoQERsMxuDw4O+v39/T4j4P57LwxybjRgWQLQjiZA8EoC7p2KE1wFq1OeAeAwC4DXMk0Dz6I2cNW5A7Q61Ek/MHuWzyBw/GtZTSDSgFMzATop3YZ8O/I63ZbQN3J+vhWyD/ux79T9XfvwOXwux1k7DVAClQyN/qYQ4AvmsrTjWoXzO+2xV+YQf/j2ix7y9lvXB3nUu8aZEgDgf//1e//bg597EgHBvc/ev9FvbGz0Ozs7/dbW1lBGHYlyWVXofBZ9TxAAyQgAeJDw2BKA1ScB8OYk4O7H7/SvvnR1AA5BGXUE/OHNNwZZlACMxRjgLPueeNCff/w6kIAyAHJLY5kCYkgAwSsJfB60hDI2NgOjRea9aN95NXoICOB//P7rARxFWVbNwD8JIEgSoOah91oCoqnzXqbv3A+TpN0DuK4cQVNIiIJXoGoOrhljQc2jyj51unIEw0mjrCRQvSsCCLqVgCgZ0hJ0aSaqNZDSKHRWycnSFGgOquZceVV3tFHTUeC6dcJxVmaQeXcPkzXsrbRJI0MPu1MfAHAAgt/DqhkwX2UKwaMtfrimA8V9gAYBe3t7s61Tx3zztav9tRefDWX7qQv92P2KPHfOF7cuzpXDDnR8rgGu3moiJAHC/mwDArD6FQE/fbnZ/3Jnu3/w3ZVBUEbd5d3Nfuz+FAKeu3xlrnyig6uyq7MHO3qP7fUZagKQyAQAYhmZSgDnHhKARg4gi/QiMqK+1ABGj6ijWreo+JS2YwRce2VvAA5BuTk20ACIK90S3GQ/AIEqU8VVvaniEN5vbcu5co5axqIwyKOGa7DHeCcNM52EZQmgCmv5+Ph4EFXxKW11sRwggIMAjXT1fprE4a7g3n2VGgCHdu+jp/vDw8P+6OhoKKsTbG3ri6TXJMA1QNuHk1UPTyL0ehUEUJW/evfJARCvIwKqthFw3dpJwiQTQKf//v1nEAJXVVqUAAdIIFpWu29pq+cXtX8VDdb8XqcODg0Acnf3mRkBKKPOYwH3ti0EZPs8nZrfb2kbAeO11nOH8vtzBIAp5AU+vX1rliRhmduc+oMpBCy792fC4zkBKTit19hF45lOGVJ7V5VnvTLqJERbaYtUcQc1riLYA7SqHF13CobgufoUDXSi7TFyJg7U2yuRVbDVSsCi0rkqM3ggeHpQVa8ITEaAZ5PcC/vY2Ym0ymf4eSXzV3qUbzJdTYZApjg+gvRskiZW1Plq1KamN0YAM0MUXCPk9Xq/zzaTCVBbakla+jOcCDU9Ba+aEBHARC3k1NJGyxAQrXxEhBKgjle14LEgICKDBChg1QCWzzUBnlZ3UlT9VQt8Gz6XBLSYwRh4igJ24Wu7qLxyAlp3gYoALavqe1lJILDoX8tMwrC+GaSra7SH+t5O0QwQs8ER2Egim4/8gQLTrLOC1vH5P3mVNVBREkiAHznRxwfHdUWA1rWoP64VmBIQgWYdZGENiBIhkQZwMsgAU3BdgVanqEAz9Uc5AuvEq0bwv4kAD209SvM3QX72ptPRyYypfkRA5AfUCTq4yO45j2YnmJmAq79rAUlwDeAqtARBnrWJAiFug0py5fndQS5EgL8Kq5wg+vAbAp2ct8l2AgZCFQkY371/tR0uREBl/05A5AdUA0BItf0pMR4KR6uvBFR7PxdgUhwQ+YDKBPiyNDMFvg2KIsAoGvRjsIu+bcoIqOoWNoGMhOicTzNQ+4/iBSdAM0LRiVDfUVaRYCWTCKjMIFN/JYFaoMmP7AygCRGG10y9UTQrdKoERG9WslfjURqaJkAVpAONHGaUDGnJC+oByA9EY/eWcoLRLpBpAWMCOjf2GTOvMQJ47nBA1XXzKVFD2swfVAFNRl7LNpj5itbxsntZMjaaZ1c5q0i++fzWINEHVHpf22QfW0HYNmun91vI94jWwbvpzmVvWyK3aDKs1wlrndu/1kftI9Jbc4xROr56ddZ5Y51QdpLLNEBZVk1wwDpOZi7VWE4m23gc49eRP+vcu2cq55NwFVewfI4T4cCzNvrMag5qch7AKa7qUNdFHVo0IbI/nYhKRI631bFaxvSVz7ZtD+SciC7b6yOb9sGjVdXJRCC1nGlfNEbmMzLw0ZugiIy5j4qiYCcDG61iNhkHPxZgZT4kGzd7Ze+vwaK6zr/8jiaTSWVrkc1ln9bquBUp1Tz8U93oi/aoTeeNdSL+eUz0yqoCP1WchGpsjj8WUkegVf4HXy7U/ARKUTYAAAAASUVORK5CYII=\",markings_none:Gi,armor_none:Oi}},Sl.drowned={name:\"Drowned\",aliases:\"zombie\",behavior:Pt(),entity:Lt(),model:Xt(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:ea()},Sl.enderman={name:\"Enderman\",behavior:aa(),entity:oa(),model:na(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAAsVBMVEUAAAAICAgCAgIBAQEBAQEICAgTExMDAwMTExMBAQEKCgoFBQUAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAABAQESEhIGBgYDAwMAAAAAAAAAAAABAQESEhINDQ0AAAADAwMLCwsQEBAJCQkFBQUPDw8HBwcUFBSIA8fBPsSSM5NhJmFMH0wqETAqDyoeEx4RBRKmHszLRMuvLMSlOqVnB5B4G413LXdMAHJdFG4aACcOAhNbiBqQAAAAHHRSTlMAjjyOEH/vvfCeg3r7Jfnt6OSIZiHbcU5EMQsKn8CD0AAAA3JJREFUaN7t2teuVDEMBdBcLr336u740Hvn/z+MJGcAAeIJJPuB/QVL8k4mnpn2b3Lywq0LJ1uZnDx1GgROnypCmpwgxq0GaXA2nBx1inzSyfNnwQZm24BdOGA7ez6TdP7sZmtY7t0dtk3YBqmlhYYFty4gtqluW5ABKLa0kOkQGBEFgHjfJgdzQUQ2LArCZIuTCjKBzpO0Ce8cYckEgRk4ETnANjkmRu6JIGaesxIBlsFhMkHOBL0kBlDrABwDRoGYC3r06QvMdB2gyTHPBT1+9fDDiwESMsM1M84FwbN3r58ukHZEJwpBl0RQD3r+DODJC2IZoMExFvGWljNnmAXg7ZuPLwP3mZETtbwcu6rC8/cPHz3dOSHM1vJyPFscTJ8fP0H0dewFr7a8HOG6qI11QzScuXr7QcvLEcAQMaqsCgUK3myJWSBGJ+ZAYxcmvtMyc6Tdeb2IeCRo5kLLygIRDZAQBkO3BTpuWVmg2EEKcAD5UUvL6pDKAolNEBpJOggWyGg2CSUf5PEN5FwCZA5mC4RGiI7ZIFgX0ACtDikWAJEIwAHUOX1kays7gEp0KATgABLCLukjc56eiAFC1QIdcl69DoEuHQqAzNdnmWidU2brYuQ6IEKkSvcQCIIuEEovAOpd2QA0tCNUKHVHZIcRliogYNYBoqgDcmTTEqBjOYCImCMKgPgHCJzzQUdyADkXAcEBhF4DdMyCCxTEYJIPOmKy7x3aL0bJBekE2Q6yNTLO3VwXCHSB3BcoudR9MAyRmAERQjD9lHmsmxp1dsg5H4T7sZe+So0FQAa+H/tuLOnH/vDIR1ogIq8BUrRYoAhM/7TfQdgFOkb6m/qYv4EUVqnTd3v5BVRgt68F+m1kwsVA6aWm4J9BIckgolod+gUUXgBE8gPklAy6cXGK8MfILBnULp27dk5UMWSB0r/0nDmxnrA2QcpUAcSiaKosBX6e2kHkiAMUVUDrCYsAWArkLHVAPVicKGSBTrXMLBAIDZAYypnLZ+623CxQF8SAjniiwH9PJ0hNFMAYT7QCWSObIP8P+gNIDqCIIiDCHdSxCEj6DhIvAlod6oU6xCrEpsxVQLNDNEBUBuQ2QIVGRjOmUgvkSMRWCLSnBOjeWoWu1AGNVejimRPXC4FaO9laLdDIjctzbpdandw8d+3C/fbX+Qpm9cXLHCCNAgAAAABJRU5ErkJggg==\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw1AUhU9TS0UqCu0g4pChOlkQFXGUKhbBQmkrtOpg8tI/aNKQpLg4Cq4FB38Wqw4uzro6uAqC4A+Im5uToouUeF9SaBHjhcf7OO+ew3v3AUKzylSzZwJQNctIJ+JiLr8qBl8RwCDC8CEoMVNPZhaz8Kyve+qjuovxLO++P6tfKZgM8InEc0w3LOIN4plNS+e8TxxhZUkhPiceN+iCxI9cl11+41xyWOCZESObnieOEIulLpa7mJUNlXiaOKqoGuULOZcVzluc1Wqdte/JXxgqaCsZrtMaQQJLSCIFETLqqKAKCzHaNVJMpOk87uEfdvwpcsnkqoCRYwE1qJAcP/gf/J6tWZyadJNCcSDwYtsfo0BwF2g1bPv72LZbJ4D/GbjSOv5aE5j9JL3R0aJHwMA2cHHd0eQ94HIHGHrSJUNyJD8toVgE3s/om/JA+BboW3Pn1j7H6QOQpVkt3wAHh8BYibLXPd7d2z23f3va8/sBBP1ye+2uXGsAAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBRATAhAjRZexAAACMElEQVRo3t1ZS67DIAwExBm4YE/RK1Y9RBdd+QjZ5G1C5Fr+4ISW8JCqpgkQPNiewY3BaKWUVXsOADHM0agdMYQQUstIANi/8fV/aNk7oJQym42rdj95ja87PwsQdZ30u7bkmQQAPq5nbtUOVw7AHjCjsVxzhcCsu07XjcMheeNIiqWZPAAzWW7gedb16z1rPJ2HuY6jgPjwAMr1kttIiGoaAYMoAToiFHYdgHeEQ6k+x89ax1xRQ+B1JG0nrcRH+3GeQ11/JKNwFJ5oB7rTr/uSn2HJj9t7V42P2zs/w5Jf9yVrYzkgrkCleI2xJjEt5qn649SgNJ4LBTImftlYNUnHqomVRcYjL8CA0JxAEuFYAGiHs7SkvVDwnOEe8K3T1qF3tOqK1vqENV8KF2wSm2jsJCVWK+Hmjq7W7dzAJdCjGkJLxgDQ1wO4nesFKtUZXjqVGCuPdvcWFtG0PJXxEqth4NynQQ/KPeQuld7WvFxfTddgQFJv9z8aBtY4rjDbmm+4sHFVhH4pUS1jPB6mhVEFMoUQ1pPcG7kPWig7/3Zv5VRji5EtQHEMQt+VNtS7qzEAiCgeo/ScMxq7OweGBBL2oNYT7XAWoDui1RO0MVYt4ic6oCdzSMUXycU1ULTckc7q8rPavaXQYiVHro/GFGJBxDKwlLLS342czibBM/8zto6xckHcsvSeqPBirUKIdrzFBlrKjHNzLY6lCrNUhnMVRM5qee88GuV5QNF+a+0PCcMdE7elCQ4AAAAASUVORK5CYII=\"},animations:sa()},Sl.endermite={name:\"Endermite\",behavior:Aa(),entity:da(),model:ua(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANHSURBVGje7ZjrUhNBEIXnAawSERIKuSWiISEhNy1AbjGJBBG5G4go+sf3f4S2vw4dA6Wg/JBskq7qms3O7mbP6e4zPRvCla0v7stWqSXr2XNZTm1LciIn02Mv5NnT5zIXz0josnrp2Lz6qhnmYumQiGe6p8Poo7j57+y2+x7U6oVz0ReTWulIIAPgbU/KzHjqGgGrhW/ma9lmmJ/MG5i/JeC2+x4MeL2oXjiTs3jJfDN7KJx/V2xpNjRkNb0rlaUTG9XDVu446DVhLbMX9N5QzTfJoPB26fQa+O7ju+57MNM/l2r+kwF9k/5g4/LLhuy+/m7nmackmFMA0rNA7mtEFpDl+aoUEptSTFZkZeG9Rb9WaBpoflMWZMZcV93eTPPbUr/nTVPeoqgZYIJIJtRUE1S0rBw4p6IlE09mJT4yY45GJLoEMpIEANy8eN4hwQFXCqeykT0yAiAEsJOjCSMhNjItU2PzMhtbYP6Ptd/zRt3iWu8O/p8zIJK179YofTER8xFxc8DUfCV/cmcGIIoI4sbiQec5kTEizwv7SCkA3pZHjT69AeA5580R4GOPp6xH8AxYS+8ZCf6cKGWALndN8ZGo46g//YECUwJ2RMHpyvBZtksXtjr4dawiXMu8ZkDnOVHKAHthHwFtgBT4RvbAgHGMcx7wXMPSSW/APMd2jR77cyJDABHlhX30+l+9WvuJqh1nPsr+yg/rD5wAvwbgtpdQgvw5kSKAqPrY7vx2LL3JAIADlGaI9OY6COAc80ScFpn7nACeEyUC2J21lzt1hE43KeYKMigBQSMfNPImkAiendclE9FjZBWIrBGxzdxRp84pAYQNZ04jb0sbREEA4DXypvbsCyAk0gSYol8RwIg7CdSyNjuhr40ou3qb4mfaag8BkENzQ5r3MwGa2i1plL8C3uqalFYCyA4DH6nG5j4ZYMpdvDASbu7vIcLFjtrvO/sFvGWO6ltW6KaIEQIQPG16jIi+s53ypQFlE6Trv6k8QAFONmj72wGPHvS1+dfe1FQ5JCeyYeBsJX9pX235XD0znho8AvheTwZoN9gbn6z/UyNkgseoTZDt6/ndFr9m6Ps+APEDKELoHzQGqg8Y2tCGNrRBtp/8/g8zddrEyQAAAABJRU5ErkJggg==\"},animations:ha()},Sl.evocation_illager={name:\"Evoker\",aliases:\"evokation illager\",behavior:_a(),entity:va(),model:wa(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAASBSURBVHja7ZtNaxRBEIaH/AklSLxkBS8eFIXgQoggXkTEQ8gvEGEhF0+5C5pLEBYDIZeAB3PJRbwloLfgIXqQXCL+lnFq2JpU11ZVd+/2zsx+DLzMR8/O9Pt0VX9sNtnS0lJm6dPhYQ7a6/crldeOjnIs0wT3fjk5KZ/zcnMzB73Z3i6F133b1dVVfnl5mcMeRc+zcbcQAKJ5AgBNcc0UAKulwVCn03GEALhxfh4D4OLiYn4BgPlmANBcZ6FfFwBuulkADUQAmkbjtaeAqgEQXydoKTYFaCrUCsDXD9CRgioFAG46aQSIrVqIG3bOWSqUZUr/YEUOiA5vXNT0pCT28lJrh0RA6P20LASAFPqpAKkAYgxL9/sg4rHUw0s5b0n6fGg0ZSGtreW3ZCgEAhVWGE1L5k9PT/Pj42NHcE3rGCUo9BqeOwC0Fl9bWyv1bne3qjQc43UrOixwFAAPc25c678kEBQAHzYlYBka00IdxnQ02z84KIXnUGalCD4b9lQUgBbWYCy0I9cgUBAcBu4zWiEtV2G7/7pb3QfHsFmfocY1CLCXct5qdSsafBBoH+EAkFoGzbzd2ck/7O3lH/f3qwgAwTUok3Kbm7VEKxPb8lYkSGEvpUQGJjQIIATwamvLEQLg99NnQTk+nx7Tcx76o7S+FQXaLBKPM6yIBgKmtBoAnO5qxkOUyrwPggQjyUwyRYWxN0/1TD5sSp2kb4SZuY3PIyb+wifPX6hjP5Qt37xhqtgyUHE8ncQpAD4/aDWA7tNnORWvWAwAbf6fEsDdO6s51cqtZa5mAUgzxLkDwKNgbgDAnIAvjuBaqwBww1A5Kl/5vYePRGE5n/2Ffk6TYDBW9QJACNR8qwDwCjx43HUUWx5qZAFgnlJgAWCRAuEAJMi0MRYAZj0FNACkDhmYGEfOtr6+noN8APC+Xq/naNSWtD7naYjJANAM+sp9RjSNAyDp1lYAhur5XuDs80Z+9nXDW1ZUWhRU1KdRPkc7NKjHyu3Va9HObnDNuSdmddgWALgqRFHD5996snkJQOzyGB5+/qMXDSf1NgSAmKsAaEPeOBHw5/dB6wFEpUBsBFgAgHxdALTQHkoBKxKMPsEEUEgs+/XzfTMAqNkBAKgLv25BGwKg0bL6gOqlCm14CVYOVEYMvHiE7+is1gRBQ8WY52ljvkCCYPa8o8zFRwEgdYS+VJA7RBsAtiaGe9WKNQLwAcE/4OK+EL+/EvhAVdNiX4hVENKYTw4Af6hJfrDpBeCsC3whRnO6jQCo+cHfHrKkOYa5kyD3JwaApkE6AGzsdIabGgGM+wXI+C8Y9LTOcDOPAOY6AnAyk8D8FAIoVK4L2gDAmORMFEA597+eyjYDwDfVnVkAfJqLZuleWw6nAlCuCXAi1CYAAUoCwJkJNgBAWsWJU3UhEpIBKIfBBgDAu/GfsPh8BFOTlvMl+NQDwJ/q4k9zYb4PEKA+uAag5VxTnwJgDH9gBcf8nzHQPBXeC0oDoFhC/vv7PWsCQP1fOrLK4joaAAwghIDg99HzVvn/D2WIPRjwQQp3AAAAAElFTkSuQmCC\"},animations:ka()},Sl.fox={name:\"Fox\",behavior:Qa(),entity:Ia(),model:Da(),thumbnail:\"data:image/png;base64,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\",animations:za(),textures:{red:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACoklEQVRo3uVZMU4DMRBMgSh5AyCeQB/xBBr+wB8oItGTJ/AFCsQr6BAFLU0+kIbqYE9MNLfatdf2cbmIk0Z2zom9O6y9s2axWq0Wx0cnHUPevd6edoLPu7MB8P7p+rx7Xt+bkDFvXuvBnMDXdjvAwnm6rmtGbyQWYmPZ+c36atCCgPeXx95htOjLmDfv7AgQY2UR/OUAECBOM0AAnLWAuaSVuXneKAEyzyQESFhayBHgOQ9480YIYOel/y8JYOydAG5bCWBHeWtY0MTADumP4XxPgF5EL2gh9ZsS1BCA9UcjwFuslICcM9460e8JOBpHJcAzytMBOWcelhcmWgjQ23D0CBDAQeRuafkglD6PwTCew3MemDUBuRCMGH5wBCA0IYg2H2+7NgX+btR5ASIHLYsntDzOLfSBtKMRkEtXLbWABS1zvTSqv6cxCQEttUCEgJSOmA0BtbVAiRKsfQ5SCieN+ZXF3raz3nukHiwBpeqzZp291gK5p1d8KuOk0nEzAVPXAjkCvLT7ZwRMXQvMkgDLGd7zDLyvrQU8gwFvS3mEjhYBXAvwHZ6uBax7wxIpjIWxlo4oK71CHXJkcmvplNnWAlhY1/elBDAJOkuV1AqT1wIcAdp5yGvvkjV1PukoqEqDml1xEBJX+tZeg/N89x8Zt2qLHAFMgnZcf64iQO/3SG5vIcDaUlECUjqlmAA8JQR45wGf+JbRGNcHGQ5TLqq4yOJDmludnYoJGITTT5jjLyV9DlP9b67UgZgjAM5Y+oIJ4BI7pUus7RAmIFWC8pgmgB2LXoTqlGuJK6u85ixg/c7SK2ECasvIKQiw0qBHQHUW2CcBWgjpWyZ9BlhCyEqDRUKolgAx6mZ5udsS0hfAYHzmcb2nvXPEumKL1Cw1SvAbN645ZRyZz+UAAAAASUVORK5CYII=\",arctic:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAACzElEQVRo3uWZQU7EMAxFexr2rJC4CguuMifhGCAhcQT2iC0bpNmxmhVlXOlXn1/bTdNQdUQlq1HSSeKXxI49XXd+Tqdjz3I4HLrj12dvom2of3p9GeXt431Stj68fr0HfUIenh9/SRc8fd+vlmGS/fdpEFUUZbThDQD2NoUxcZStLep3dwBs0jZJrB4EAKAEi9Wz4irow/q077nf3QHgx7YoJFM+UpyF+2K5GABzO+DfAli7A/gbNqSeeIbY5mB1LZQfAGRK8KBszEoAZH2yrYiUVxujBroZADV6PEH1Ah4A1LGhy5TSXZStvrpR9kZNAagiPGGdhNeuK6pnGMLukd1pBAD9qxseyq0AsPsbt9d5oJvbq9/EqYw2gOOVj5SHYAyA9y5R3MbHht9NAegdIPPx6ut1288B4MuSgvP61PlgdzQDgK2JS4t35j3hb0uVx1imEJfxWwbBdQq4KYDMDa6NBTxhRSNwXK9lvDcBsCYWyAC0kM0A1MYCS26Ctc/FxgLZZOCFePzsOEZQdx0LZJOJjO7ScXYbCwBA9GSG908AbB0LzAHYfAdEsYDn870JLY0FdglAFYnSWVpfEwtgciXhcknovBqAFwtc392PAqsMa6xtS2MBDKz2hfvS3ahxii6OG7OsjQVKcn41scA4uKMIK6t1nk1KQew1FlAA3hVbbZCXHVIAk3IpgOj6izKUQ15fBe04FqXt3gpiJ2n2SHMT3t1EQVQBUJIlFncNAIXNyqoB1HyAt+rVANgFlQKILLRGdLyinPH1YgsvH+hloKLzX2UE9bxZtsdEDRFbf3iAyEXNAYC9YdCaItM/WCYZoeT8LwYA0TPFbQpAszQl6W1ezWi3qfJc5ykfhexVsUDJxyjzpEoBcJ2XY+A0mP5O/66bJEkVyN4BRNddLzMcpcnVKPIx2QSAnWccCT33c+3RxKNUm+cFsqCrFMAP1j1HfgzqFQUAAAAASUVORK5CYII=\"}},Sl.frog={name:\"Frog\",behavior:Ua(),entity:ja(),model:Oa(),thumbnail:\"data:image/png;base64,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\",animations:Ya(),textures:{temperate:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACq0lEQVRo3u1ZPUrEQBhN4yE8gM0W4gVcG8HKwkLstrCwdtHGC4hoaytY2FkKiyewshA8gmzjHST6BV54vJ3Jz2QmMWLgI7PJzOx78/3OJMvoWl4d5W/nu4VkY7yMACRk/O3BZv54vF2Itnsh8Hl/kUMLIeMN7MvNYSHvdydl254nA22TG2CsPEzIRFeyDgiAfzydlQIiyQgA6GSyVcrzYl6IgZ/vbBRi7TpT4NWH4FlvPtDFias0gDY/t7u+0zvea78kTqyrz1rwAUMfEMNzF3meI4kT6+qHrjYD9/VbCX1wZHZi+EdTJ3443VtZKRN7HsNsnBqAg8Jx2ZlBDA5sfetMSFfNB6it2Wg/b0gFaBZ1To0qLgBVmmRNox0lV6i5KPi2NuwyQdMk5xhudyYAU4HYxGa/bVVvdxsHYCycU7SdPD+odpqE29fpNGdxaX26vrYiUcsP5AYuLZrmCwO9nM0KGYyAOhv/Hh0BjR612vsBnl9fF2LtQQhg1V33URDgcpvtv4kGDPjXYlGSGJSA1UohBFhGR6CJefZqQiyxCPikVYz3bSs56qDcruun81Ulws4acIHnuoXLCu2j7137a4Dkok4LvOQm5FJ3zDmjEnCpu0mlyKvPGumdgNl5FwI2fnACsNu2BODogxLgjBtCoHcT8oVIrne0BtIogjaP5xMO7p+EQFXM5jDJJxh1IdR3TBk9kTEoXw7gbR9vA11bUJ1LxyY9WtTEM8rvAyjYRklglBrQ6OJyQnYoa1/uT4IPgKFpmyPaYZaej7oiER9F8glbCHiMj+LUGkV8EUQ10OXPbWw0Dfg+cFRNzuebXfws6Ue+pB/m+vjENBoCVZGH77+WgC/6aP0Tww+S2H9V9GFR8KGRKFkEagsiJBdEzwFdrtBsjCyc/V9/5PoGVJk8gNArF6wAAAAASUVORK5CYII=\",cold:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACuUlEQVRo3u1Zu0oEMRTdT7CwsdDCQnBB0UqwsHNBRGxExEILOy2111oQrCzFys7CZku/wN/wM2TkDJz1cDeZncljxgEHLslmkuw9953MYCDPxeN6cXy3XNKgjw8AkELWb58uFHtXSyXZfisAbl9OCmohZD2YfX08LOn9+XzSx3g2prE5GKbkaUIgK8lZjJDxj7fLCRFINgBkdG1lraTRcLX8YzK/OZovCf1ZpqDSJ3GsNR+IceIqDbCv42jtO9vyvZ2XxYmt9FULPsY4h8A47gKve2RxYiv9UGkr4755U6GPjqxOTP+o68QPN7tTkgJhPIXZODVABwVzeAknpkMTGB0Yc2eZkJWaj6GmZmPneUMqmVayzmmjiouBKk2qptlPkiusuWDjg7uNIBvGOpcJQpOaY7QfDYCmQsLGo6thY9WjxToypqQ5xfaz5wernTrh9nNnp1ByaX19cW6KkpYfzA1aWtTNF2D66+yspM4AWGfT370DYKPHrLVgvLi/Lwn9TgBQ6q62FwC03Fb7r6MBMP49Hk9AdArg+mk/CIBS7wDUMc/WALBaTQ3AR41ivO9YqVHHBcA1z+5XlQijNeBiXusWLSvsHPvedb4mk1rU2QIvuwm51J1yz6QAXOquUymq9FUjrQOAnccAwPrOAdBumwKgo3cKQDNuCIDWTcgXIrXesTWQjSLs63q94dD5yQHY0OcLpa5rxqoQWjcYRCcyvVbx5QA99ukx0HUEtXvZtVmvFm3i6eX3AdhubwH0UgM2uriKNXWoraPfuihG09gDeyWpRez9qCsS6VWk3rCFMg9K4tQ2ivgiiAKG5GL+HGupyWwfOKo21/vNGD/L+pEv64e5Nj4x9QZAVeTR9s8C8EUfW/+k8IMs9l8VfZQs86GRKFsEaspESC5IngNiHkgxNJElycD/zx95fgDOAvoGmDs8owAAAABJRU5ErkJggg==\",warm:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACnklEQVRo3u1aO04DMRDNdXKENLkEfcg50tCni0RBTYEo0xAJiRMA1+AYaNGs9NDTi+1dfxdLrDSKtbu253lm3oy9Wa3oent9HM7nh1FWPV4GAJLS/3DYD6fT3SjabgLg4/1lgBVS+puyT8/3o9gYaNv9akrb4DYZVh4uZKIrOaUIFGdLAkg1AFB0vV6PstlsBrMElN/f3oxi7SlX4NWH4F6zGMgJ4pAF0Ob79qvP9BfP9b0qQayrz1bwKYZ3MC/uu8DzGFWCWFc/dbVZcd97V9THL2kgzw1ijKNj2f0SbuO0AALUJjELWBAjoKEQAtjenXIhXTWfQrFuo+8FeTzkw1cmdCjuGwNWdPl0kVyBCTQZpfqwJjNQMwNCu0i2hqswEPzGmJ77seJwQ1e5MeWeRfIDKxbkY7o+t9uBxWV1xBxL0fKDVxwyN1+Y0l+73SiLAfD5fjcAQvw81dcUH47HUay9mAU4ITF7dAGAXQYg5lrAFP++XH5BLAoAZXYsAJbuAMxJnk1dSKvMUtnfJVEc76pTWGABBeCrXn0bG02E2RbAYFxWYyKkfzxjZVzPuR8rzcWdtpu4EICyeUvtc4sD4BWOOddht+EirTkA8/McANZ/cQAc1DEAEOiLAlBWigXQ3IV8FAmXYFrUzb8+4/58whHaNhajUeVs3UnxDoo3+rzaPu5n2i2eyHQP7OJ43g7yMaMKH6vwXpj7Vj1a5OzY5TcCLti6BNClBZhdXEGo7MG1To6lETNFahE9H9XqkdmDz3VSQHCOKRLULhZxMYgCzpmcz2OrfeAIDc77hpw4q/qRr+qHuRafmLoBEGIe/v2zALQW0s+rvmBLiYMq/q+1kK8OclFvChNVY6BYJVJyQfEckJs/UhNZs/9O/F8Nrh/BGi3RkD75dAAAAABJRU5ErkJggg==\"}},Sl.ghast={name:\"Ghast\",behavior:qa(),entity:Va(),model:Na(),thumbnail:\"data:image/png;base64,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\",animations:Pa(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJ1SURBVGje3VkxbsMwDNT70ufkNRn6oz6gCNAlSPesmVrQKIMzc5RIWY6NGiAqqKZFHskTpZTy99zv9x+R2+02SQk+qidyvVwe+jpm86jDRN9VfW9OpIx6lgCgOl/n8xMAdozvMOcyMgSAVjR6AYiMEQCZF3k/nSY5Ho8z0Xl9718CgI6/HQ4zQSBeAkB0AUxJMez7eg0DgKLOW8cZEPJutlRDAKjTmRrzAPj8+HjM61j+tzsArNNZlrUlkAEAgY84jyCsUgIMjAwA6qD8jWbAEgCGZYCNOhqWAUCdFSctAAjOLjPAGhQFwNayRh8jzUCx2bYZANaYbAkwQtOIIzfYObtWDwkOBYDtAD0lwLY6ywlszc23Qc+wEQB4c7tohFr99isB2KQVXgOAzGFm88PQCAC8NtoSa+vc0aO/ylkgcx7fk77eNWTuI4q+4PXoPSncwwFMRAeNt/PoOHKD14qz0+jQGmbNDusSR3IA6ntO2zECuDmJRfS9TOgFYJYB+MHeUthSEJwsABPJRyPFImANsfu26IjYfb0FMpJZNBuyAGiwQyUg70RJTGtMHp2TxzsMeSQatcu7kkuTIKY/KwUPBHQUF7MA1HaClvO1qC/hgKkEWkjjwgoC7rHM2B4SVNDxe62yi2aAZ98TCdbSH/tva3QtQmxxpsfOBa3g1MCPjGXtEmF/Nc46yrq3aAYwXcyCCAlam7wfYGoZ7ZYA666WRL/2fa+kIt+vARUJSvEIByPEDPF6d3vDYy8wolnQyoQWB3jZEM6AmqFLox/JAm97ZEFopTqzcdYHZDvAVvR72uGeb7GgpO8T1j7P1+Z67gMiR+qM/b9HYaAZP5mjJAAAAABJRU5ErkJggg==\",shooting:\"data:image/png;base64,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\"}},Sl.glow_squid={name:\"Glow Squid\",behavior:La(),entity:Xa(),model:Im(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Dm()},Sl.goat={name:\"Goat\",behavior:ei(),entity:ai(),model:oi(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC9FBMVEUAAAABAQEODg3b29oDAwMJCQgmJSQaGhozMzIxMTEqKiqhoaBCQUCwrqhRUE0oKCcJCQhNRTqGhoYfHRtSUlEdHR2op6VraV80MC0uLSxCOzInJSQaGhoUFBQNDQ0yMjI4ODikpKRKSEJuY1QwLy66uroeHh5xcW0fHx8aGRni4Nh+enJMTEzAwMAvLi5CQkJVVFGnp6ecm5kWFRV7e3s2NjRsa2ksLCza2M/o6OhjY2N7eHBHR0doXU63trVeVUdiW029vbxRSDyCgXxmZWMPDw8KCgqgn59ZWVnf39+enJZ4dWvc3NzQz8zLycE9PDulpKLHx8eSj4tJSUm1tK0nJydzcGZnZFuWlpaQj47j4+OMi4X19fXa2deDgHTAv727ubLl49rIyMiUlJRzZ1br6uivqpszMzOSkZDV0spPT0/i4uKSkpGNjIfh4eFGRUWRkI89PT3d3dtpaWng4N+Tk5GQj4uTk5OOjYpdXFzHxsaMi4aFgnfu7evAvruPj4zEw8Hy8vHX1c6Jh3+BfHHf3t2OjImLiYM6OTjc29iKiIHe3d3FxcWRkI1/eW3c3NrZ2NbCwcCEgXa9u7e3tKqIhn1XV1ctLS29u7Z+fn6Gg3n09PS/vbl4eHdRRTva2dTY1tG5tq61saaEgXV0aVjZ19S1s6yainN5cGFOTU3n5d6HhHtISEhDQkLQ0NC3trF+d2pKSkpAPz41NTXo5+O5uLaYl5eqpJWEfXR8dWd6cmVkZGJTUlK8u7Sqqqqmopx3bV92a1svLy/r6uXNzcyura2dnZyem5Con41wcHBhYGDX19exrZ+amplgVkzW08u/v76tq6enp6ako6KkoJVtbWxvZ13V1NOysrK2tK6yr6WopZ+Fe2xvbGWwr6ulpaSsqaGFg4Hw7+3PysKalYelmYZ4dmxraGRYT0YgIB+6urmtqZuHh4edj3qNg3NqXk/q6ePEv7GXkoiSj4aQi4CVh3KBdWRkYFnUybXBs52LiHtMRT/PPIXaAAAAWHRSTlMAARz+BRP+WDw3WrXv7pNGD6iXYFsg3tGplpOCUEgk+c25k/vw7Z+ak4L+/fXY1tXKvK+ShX50MfPy8O/o59vRzsu0kYY+NfLx7+3q5eLi3tvPzMvKv6iWAGKd4AAADWRJREFUaN7N2XdYE2cYAPDgosNOu/fee++99+4dFy4xORKEJJcQIiGJCRAEwRCGgIqAIlihgCylZdiCiogKrVWx1Vrt3nu3//R9v7vkEmjtU3IU3+cppHHc73nX9xEV/zEmnXzljCmKgyYmnXxZQkLCQUOaSjgtrfPmXRGtOBjisIFS5EA03qY4GOKwxYs3tyKnLuE2xRknR/9L4Y6/7hC5BaNB1tQEvg7qdtlJ2EvRUQfgHDs/Jubq8SUdVgGg1O4EMRos0EtRB+BAjC/pMOtAF4LqdpYSDgR/mkKIqHDOrkTAjDMJQdYEvjShsa1i8c5G5ED1ogXOcZeffajEWRUbGztfIp0tkeQHWSxten3F4orUhFbSTNECBx6beDghTTp2cowpP1YiJSbFFhwukeTtoZ0SKLUU+6gumnAwCAk5EBIJOBD5yVIC5Z2yLt7S1tZoHRggoLoWPvq4O0KrMz/4ikAmmybD1xWx+BtEkuxj3w2Vslo3N5SW1rVaeP5BSEXBsqWmmPCYm4OcufhqRcasWRn5+CbWdFzGHkEWS2ObHkB9MclLZ82a9UYIKdEE/81HDnqWhfxqomykQ2/Er9GpXZvJ2FfsBJBFD6CWt8MfSiixSSboHfQk52SEYGUjHXp2YuI1NyIotYXvTrCsq1g8wAOojU9IQFByPikL9BJysGkylhVAxZLz8TXhJCbKSTphC/xFQEIQOBYuxCnrboQjjYCSiaEAvy6NxcCEzcrBNBFevglHbb6MpBNUabtwlO/4arMAGgiOfUufsGkwChCyjLzKgLRIvZ1MUiWRdvVFDHKr3buSYpTKVRWtAFpX2iWMfYtl3VvB5UfykrECH50kPtqUgxx8FULa0memZQCpq5bPUUL4dsJiLE0t5UtLgbNwIYIwTEvR84bowd4WIGTUQkhb3m6Pp+UBfa8UYsNXPIAsllbgICjQsslCikj15s4lpRKyF0La8JqWouQAlW8trrpEGYglX20G0DzgrNNvh5adj8Uw5UPrzMrA3s6ZG+yemOTJuAQgxGKlyAF6SlWu0xUrQ2LD4lbLPODo9dsxIeKgYyBHWtbLMrDJBRIUK4WWBzTpwiadbpkyLNKsFj3GPoGD1VpBPPlYIpOJkPDtDNI7G7b0GShKJhCSXtSlK8NjCV06D0BvJSYVEA4UCwPrZEoSk5KYk5GDB75jX7uZjg+C4rWKyOM65YhIpqhP/9RP25GRg6ClsGugWIlQJzGk1tmwXUtpaQkEfR25Z8pjSuUHc0KztIbauGfXnqHm73/7sKAgieyi5OAuTEoKklbto+kQkI2CkAF0HBDi4uIkUlz7xg+xg7e9+8vHv39YMDl5PvaPQEKISSCteo2KDwF5jPHoibxkUXenK9MBJJEKqUHd8g345Kqf2G++qcKOhtotg0HPgdLFEJLmLQpaBigiKJ5h8HV85E19CEjWAydISt9I2XS65aoV+GR3Z2Xlua/Hzl0aPDwICbKDkaKlCMgggOSZssPj4lbPnLlaJC2BRURRnQBSq9NiccNUVg434S4WSGQbbQCOFFozsOQDnQGUl2dCENIcmPnt1PtDX28CULnKsaadGm7CIhHSG7gKsVijg4BkGft7Z65eDxyRBCXbQlG1365cuakYQKqNFJUfGHGhmx3bQxmGLG0ISI6xP/qmmVK8vB5aqI/Kq6ldufJj3dZFCNIWSFsHemc7TYd4ZjNMKEiOsb9B4mCO5qSbKOpVrvdnAOnUADLQBdIihFY2h4HsISCjJ0WGsZ/yRBgIuqiJ0vZyPWz1RwTUTtPJ4iIkkzUKZAyAbLCpZRj74wSI1ETJ7ZTRX9vBsuwf/QIoUViEGuBIIK2wlfM8tACS63CNeg4b5+UQkJuiyti901o/AdJ7aar29i+wWiYcdAmkNePmIYtRZtAhoFgPw/5dsK0Hqdks2/j5NJry+rc5HF84NJpdplV9FBUGov8R5DFGBLoGCHE47OmrBZDbbPCyn3z+ed3gYDP3uipNg1FISWGO1x4AhF0eief4S0gf4w1/jlC4QdrD5O5d+Pn7g7YaAKkcI0HwfAmkNYeBbBGD7oUEKZfgAYanK4g+pGkjw9CeCm37q1wIyBYfFEkg5EggPO0jBeFSxOxgguLicF/D2mMYO43hr+X2+woJ6E07M/tvQAYawi6CtLAjIwbdAGVaIoJIgt6gaY+R8dAQuSyb+R5qEMSMAsVrCcjjZBCE68cOIK3ZGAloyuNxcR8Er9FzIEHv0cFwwdj/M4goDKS+YlMByOskb0SwFIXbhpijuJkzl8YHPU4WYptjBEiK0SCji82ODBR1tzBfOPXAgoo1SQky5roy2W2qNEc4iFRH+DYSlM1GCjpEmi9IElTsEm3Q42EYP9ezR6UCUjgIkkjmnTS13Ykg/F85QIcH2xnzBLtahRQzpAD/3uwaMvaE9CYDEz16U8cDB0H4ngTyjnkpYj8LCSJ5Wv/yRhrCQLqDYTI5BAnxhYe8bciy4cMNAVAeemDstSSnXgLKdbFjBR0rJUj4topKEU8CfFRzrwRaE3i+DVTCtd4+m7xhFH8MyjMyJQDyQGePFXT0zUqlJl25hCSIfOsLzjMFiWdZf+eeMNBsBAmhdTICyIMgW7zWxgComWWYsYNugPGa17AvDoJsobicsPu6i4x9OEi6jGkZCWQwmykKQK5eLhO+NveOEfS0Ujmo1+sbNq6GXkLSGglU4s1FT3VTGMgsXMZSzGEgCARh0yGok+PGWrLrHm4AEJD2pZNeGgxw8EJUW+tn2R9UoSBcO8JESaAS40hQLYDGGlMvPk9PouU1APlIKUjL1rM4YjWdYsUWudfg0TUalFXEOvF4NYaCzj0lktNeJFXgj8/iYWA25LFsJwfR7F601g0gtbpJOLpAiyBPAMSwCDIyBORtRlDuOZPGzpGytAo+E6YwaBJZ3l4E7VAtUqvdCHqHksLjdCKoJDsMNNvFdnDcpUcSTsSkLqjYW7CgUwzIIUvXX1vTUx4KwuSIGwFAeUVsLoKavQDK9hqyYAg6zj2FcGQg3XezcjIpl9PoCV492H6VBEoxG8TPOhCUYs5iEVTSy9XTtLe6iGEAdBVw5Ipjil/DdeshY+wRrh6uJgn0UuDGSkAMTQsguOTW250uFkDenm+hmeUDcTX1dtINeM9yliHoowUjQQZ6NAgsAMrO7DmXkxfEFWU7S3IZosJ+6MjcHQay5x0AxHb6/ZzcoBIGZsZPygYJquHeVYeCyNFlsDttCCoJBXn3+lmI8QA5O2p6aNrWD3u6GWY+DBQ4KQDkLapGUEcmAQ3797MEVJt5jswgO13D9dBZP+l8Tf213C/qEaC8wGnvYgGUW8P5AVTzzX61uho8ZXD3kBc09D4NoN7Mmnd1Po1jwes7CKi4WATZaUMIyO6s5zi/Nu/H3VVrEVSdy+TKCzqpshJA3NBnHEdAKlU5AS3XbS0PTJkEYhkGQJ1G5nX4WNTnrmbJHio7UmaQJ7eysnIUSLdgBMgmgL4dZhkC0mjIG9nZjLyg6bcWsQcC2YUeyjPT+PySTD9bxhj3ExDb2ctAyAo6+dSpJ7Js5WcwNne9QEALigMgaexnlxQ54VjJHK5msY/7vywmoJ7aTNlBUQoFgE595h2Ou0dxRBqA1uq2qgmosDAw9jYvOdyHhz5FzyfD+Ek2gqCHZAcpCGjKhbu522cojlAvSAOQrspRCKA0jaMYQUYzjSC702q1spfurWv7DD/JRlAZgF5tHh/Q8h8OUQBoLQw+gDSaVzYBSKPburukyEsDqKOMYc65xfprQ6NejyAYQgSxPVzt+IDUahGkURHQppVfqwCke4VlAfRqDedimElHXz+dB9CTPT9vgn+sXVRYhhfe2uyui2QGZXZOmXrfEQA63+cmoGIfgFaWi6ASuxMOFFd2/SS4+Z46/fn7Z/B1ZV/qoK8JaEg/7Vp5QXfVcFPgrjYVQBpHoQ9BqsJXJFA9wzRzvUXVLLmGwW+dwfOpAz8KoCHLumlyg+7kAISBIBWcGgBSLVr+sVsC+YtsJSyCSNw/nU+1WlOzq1xdrXo9gGbIDbo9DORLU8OXwrUqnwjKrjfa7GXso1ODN99TH7Jau/nuVj3EmdcCVNa4Z4bggab2adJgU7sXrC33QTOpCncDqMhbzXoZ5tbrjw69jF9/SzfPtwHnIrk5ZDcGQOryNEch/DBG1l4hLMmqLxltFougo6Q/IGZpOt+GnPELBKmhfwIgqJ6msImiCMgugSQScMY3HgGQTre7atueKgAtWlsOaSKgbBsFoP8/pu/co8Por65fAyC1OgAyUhME4ltcOwD0EX5OjSC3b6JBDVbrpf0A+qTf7XNAN6nXAMiVpbXZJwR0+lkA2tzwKdvdlgWYNAf52d6mZcpwyiYiok6/yrqZ5y16PYC26qqqEJTVyfknCoSkZwmoaz+AdLrlL+WVdHAA2nm6YqIi6rSzLFdEn9QwgO2NRweAfrVMA9DExQNRipN4vqtshwAaal04DUATGycDyGrd2/8Ku5fX6wH0gGJCAwsHIL7hU+DAFeOCMxQTHlGnXWXl+Ua8YBwMHDFLfOPBwxFJcnH+AvRB7JEmXBkCAAAAAElFTkSuQmCC\",textures:{default:\"data:image/png;base64,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\"},animations:ni()},Sl.guardian={name:\"Guardian\",behavior:si(),entity:Ai(),model:di(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:ui()},Sl.happy_ghast={name:\"Happy Ghast\",behavior:hi(),entity:_i(),model:vi(),thumbnail:\"data:image/png;base64,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\",animations:wi(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGHaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj48dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4slJgLAAAJSklEQVR4Xu2bzW7bRhDHxwYcia6iBFWs+JDAKGD4ECDvED9NgD5QgTyN8xQ9BL4E6cFRqiJhVFO0D+mhGmY4nNldkssP2/MDDFjLFWdn57+zH6T2gJHn+Q/6Ocsy+hGePn26VypoydevX0v2kH83GwAA+GU2i1aeJEnpWgjcfwCAJEkgy7LS/aR6HMn+ZDKJ2p912ecF95ksy4o/Dr3mqgck2L56nLr1++BBCWBMjEUE90YA2+trXuSEBmAswRiCPT7n16XtHKatAdarFUwPD51zOqVufSBzsiaATZryokbM5nNeBLCz37b/2nInBbC9vobFclkqd9WHmgLYpCnk2y0AANy2FMHBLviT6bQihDEI4N5MAU3ggUfy7RZu07R18GEnoFsiKIpmv0/unADqzvV1iZX2Jbq8d1NqC2Bs2xiKJg6tHJRRGGPkc7q4Zwz2pQ7QqFM3Bq7AGXHYB0dgtfL7gnQy99DYB6UjePDpZ6l+V+AqnhIrnXIfHyJFBsDO4HM8/1z3/NuHJqbp4SFAjWmgiSiSJFHt98GQtpFiERjSmJA6sZD27dAg0KECGoIYA6gtlSlAGhX0wIT+9YU0DUhwcfi+16cPY2Xfl9K5GPqETwPr1YrVcIPfw/twhvRtLOxrI1rKBK7ypnC7FJwGbtM0OPhYj45+bToBj/2HQOUgKLRDYokg9D40veP5usZ6tYLvV1cAjtGPhNrvgiFtI/s4ounIDhVBDHy26EMfFIEvqFQsrtEPAfbvO5UM4BMBlmvXu4COeG30YzkNvk8ohrIG4CLgweafu4ZmAVdQqTgeHx+XrhkypQzgEgEl9kIwFAywlNapMFz1KJJvfTK0feACAEUEFKmsDaH301I/JzT4SKj9LhjSNlI6CXSN+rHgCqxrehgjY+jnykkgwtcFHNe1IXAJQ0PyG2pkmzp0cc8YqGsADZ8whqSJCDj8vb2Y8HtrAuyTytNA4/8XOA/m8yijFu8zmU75pVGwp72VG0rbn4rlef4jRHza28Ac7e1gCd+aJ9Y7fHzkI8kI3gq+MwKIDU2/Q9iHkQigsg0cgqHnwqHtD8koBAA9B0GyRbfBXdOnLR+jmAJ4Gcd1OIXXpPk8EX7GHQJ+R5oaqB1aR7PvY+gpIPinYdxhcDjo6rim8Hu6gsvrIlJdHz5/Y9qi/P3lCwAAPDs6AiB2cGGKC0u08+Xz51I5gvWPnj8vlSOFADRHukDrnL7aINnvyzbC28Dt4wstz46OStfWq1WxpaQi+OvjR/H3h1ifl6P90u8CNrs3b0LfvmlKJpw78M9dwm3xzyFgP23SFG7ynF+ugHVxRFKbtP8xBtvra9heX1faJv3OEEf/Rokbrw/EZrEIpL+I9e21Y8OdvAs8fvIEYNe5IQJYLJdF/0rnC1hGg3VLBEPhL79qZeAoR/aG2oeDsnCiXF1eFv/jaRpPZRwUMnX8+PS0VAfx2e8azT71YbZclnzGPqHlmzQtRj/1lZbT00g6dYxmG8hZr1ZwMJ/DbLmE49NTWLCO0JjN57DYfWe2XMLBfN75lNYFvpHbhHy7hXy7LWWV0QpgsVwGB10DxdDHlEbn+JApwUUbnzUm06nYp6MVwF3j8ZMnxfxdRwA8/XeFJirnz8PpqrQrXPa7JqbtR5NJMbq0zuZkWVbZHfRJlmV6BqCr0q5SaMwANGXoNvh2B13T+iiYs0nT4BGgsV6t4I9373gxAAC8OjuDN+fnlefr+XYL7y8u4M8PH0rlyO9v37YWchPfMHtOplN4NJnAo8mkdB1PNDm42uc7mLq7ANxNSOUQew2QJIl46FAH7LBXZ2f8UsH7i4tiRYt/7y8ueLUCvFfbqSzfbisneD7qnhc0QROlVE6DD7HPAVxHkhzakdw+TYV0H1sH3EbNyKjnbdL24RLYcS9OToLqh+Cyf3V5CQe7XQwvB5YBaDnPGCh6fh/o6hyAzmkuJKcRXEjxgOE25sXJSfG/VoaC0e5Vly7XQhJ1Ba/V950niALAlT9PmSG7giRJ4DZNS6d4Gi4RcLDzXSmYXqMicBHShqvLS7hNU6ftJucAPtuu4NURtHYfcRdA5wiq+JBdATr02+vXAOwotw08rYWitbMO6AP6pAWt6TmAhhY0F5LgXS+3ilPATDk9wzTKy/nWhYsAR4aEa0QhUuOlIEhlIWhtoJlOCz71q8k5gGYbPIGTkGIWQkUATeABpiJY7NYEXAgu5yncKR4EiutaKBh4zHSu4IesdbpAE0adzIP9H+UcYL1aFSnr15cvi70uD3JIJ/InVrGgUxhF2rFo7b7Jc/jn0yeAXRC4OOvi2gVoq3dtd4B9Wbe89TaQOkHnfN+83WfwkToi4HDfXMELJVEOgcDxJo8mDK0++szLsX4pA9AO4gZc0BFDhSAplcJHGqJ1Slua2KPZjQYePN9DsKNht06gJ4EJOTcBFiRX4EAQwE2eV04ZkY1ygpkkyU8BNA0+hXcONlZyUApGSIfGwGebZ4rFclnxLZSbPIfv376pfYD9xK9rQdME0ISSAEKhqdt1vs3hHSylYRAUHxseXISnT58PsAvuTZ6X+qNu+13TgIQr1TcZvMFrAOw4BJ2mR66SGDhNg4+LH3CoH0cHf/jBCRWBBAadH1GjD+Dxg+MSgJTWtQyglUv3QJIk8QuAj3jJOTrna1mBIo0uEEYYZb1alR748Kd+9OHRm/PzSkdQmtino52uCdqA7ZDsaiPdVQ6CAFyZIUgAdB5Ho1IHZrvFn29EaN8NAUXAg4/go2LJWQlfW2jWoxmPLwaRUD8QlwC0wLkWh5owpHK07RVACFJngOBY0/QvgcJEeEf5qDMNhPpHoQNHy4guAWipW1scasIA4V7U9ygCCCFm8GNRRwR1wdU/OO7nEoCGJgDwXEOoz4vl8qcA+IUukEZSHee7YMg2aQLoIxaws188C0DlTKbTSnqNwZAd7UJqg9TW2FAb9P++go9Ufh0sdUgXSJ3cl21kqDZIdqEn28DsVwSgkQk/xcYG03KpLBYh9w6pUxf0nfeBZovXawsVhnRfbk9rl2EYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEY3fAfplYV4hqfAv8AAAAASUVORK5CYII=\",ghastling:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEPUlEQVR42u1aPY/bMAz1P+3YoVORrUDXdi3QobihP+iAQ7sVxQG3HNLOWTOlkFEGLy8kRUpK7pI4ABFZlizy8UO0zGn6/9tut7tCm81mpin4k3mF/qzX+/nS1vpxDq7Lbf7Xxk6jfj0AyJynx8cjALiNY3jNLCEAf79+3gndv3tTJVWDGrUCEGlrAKyfn12qAfD06cNlAYAC/X54qBLPFz6K4EJDAOAFrB8KUJgTc48AwJovAv789mVm8Mfq7e7Xx/fzf6HSV+6VMTUAIqQCwFrpAQAZlXa5xwDIegIACl+oMCtAlHv4XIxVzQBoptjjAhkAEHgEQAQXEjAKCDULkLH4DARSKGQBkd0Ax4uA5T9qAewCLDwSA4D8obugBWEf3jsyYQuIDAAibBGSAUBwPAtg82fNWhYgLiIuJNfYxmt1/28BgDUp2kdNa6CwtTEAWReIRH51F2Bmsi6gmbNoHGMD91kAtAZBT9gyV1zIBEDbAVpcQNvqOCZ4u4C2DQrT3jboCV8SJHyOmgdYjI0AwOrjtXsSIUvrKDxagmvCrbtALwA9qXDNBSRVFjBOCkDmZWbUy5Dn+64LjAAg82pbIy8eac8Y9hqsMWFpKSrEuefLWUPmPGKSAVaGdmoT9uZz4sT9KHjp49xDax8F0Zf24ZHzLaG5jQBeBACWJbQCcGABnLC0uAKj6wliJUStVHsD9dpzkI9qqgZMBrjaWAxmUWvIAiDKDrmAbDfaYcZoF5iZCuYXPL8rCKL5Y1v+EQTvXK8FBFnHEt7Tek8MmF2gJgAKjYkHa2C1Wu3p+93dnmkBs/ThGJ6PeQmCMcICLPc7CoK1dBOBQEvxNGT5OM8TYUTwiBtolpJpl7UnL/qjwKx97RSpxf+1jzEIBvPFoOG19QGGwQ8lQjM6pPmo9ou5c/pZ+jJWgJbgWZe3W0R2HTPgWC8cEe2LwBgTvETG+iRXsy4vBljWELYAj9FW38/EAuucwTpU9Uxd4/EgD8hmgD2+P/JZmlLS5wmj3+etsa3zrQPb1vnDzxP444V8ocVr7OP72eNs83j7pX4sKArMfdqYiwegJmSNrtYCInQ1LtAq/E27wM0DcFUxoMcKFgBueRe4ChdYYsDiAksesLiA9wLEfTz+anYB7xVYew1+NS6QLTG9NloA0GprsThRq8G16nG9Mles2c3W9Wb4iNBBzTDX1mpk1dvyfQ8U75nZdawxFshW1elcLof1s1hP55Wccf0tV3daQuPimbpeix8PiJoV78vleqOwB0JN+NFra9agXR+UzEYfzrW2UQA0Ex+xVm19eYYGwME2mnm4VnDoMYFaiQofWcMjLzZpFpiqshYGaxriQmdB3fNlr643CwCD7lngFNV8VjPRoDpqPW9tVEYaAGas1T+jcabXBfB5WvsolT4XQy0CnBLwJhc4NTMI+rmAn86t2ddGCwC3DsA/s+q2cpd0Pe8AAAAASUVORK5CYII=\"}},Sl.hoglin={name:\"Hoglin\",behavior:ki(),entity:Qi(),model:Ii(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAADAFBMVEUAAAAhHhwhLDU8OS5FS05lXENgZGV+goGVW0qlY1C7clvJgmXVlXrYtmPooHTcxHPl2pX//67///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfqLQKAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAABpxJREFUaAXFwd2aFYd1BcBa+xysQXJu/P7PmAsnIoNneq90D4LI5uBAfj5Vpf5Yd5c/x+lw+eCzXwxrLMM2dao4pR888AuJTbROrTcJv/ra3Zth56ivjdnBcIgWFfHYbJAgndXUKb5hXMp2/aOZMWMYLK0giYpH5p6YlOQ+qEvjsbs3ryni79yXcRqs+4vQaNOoh3YaZFYt00qDjgfufnGp1ptf8KtPdvxmFk3VqanUI13s7GKbalqNqgfufsW/OHVdfvXF+M2OQahLiMeqwqxWMU3RiAfGZcyMXnzt2fikFadePNTFMNhGtSjqgXHZLvXAsk8+SSUuScRD799Xl62+f+8SERUP3F16EV8b/vanYYeGujSpb7nNDrMTn5Q08dDdzy4pcflFffDZjj/V76Wo1EOvZr3ZeVUqbRKP3X3w3/n4NOtNKaLt1GNbi9qRpnFK46G7f2rx/OSLuhTx2MutMtj2taOalDQeueMvXv3V13Zc5vlns4hQb0I8dEy6VFqXEN90921Dww7r1CAlxLc1g61TlIbGQ3d/wd1f/KuvbXheNDtofZJKPZQYp1m3Q6NCdTxy921Ls08f1kbXKSqqiW9ZG9QlKhWNh+40jcZXxurNzvPTNuNAqVObeCTTjMu20QSRNh65+019bfHxJ/u0ZccpdUol9Uirh0+yCRJt0njgjmoaX5vDiw+Yj3dDqUvFNyTGJyuIUxCP3G0o9dCf/obnoZZKnUKc/twSiXm9exW3u9OOLbk71N3rfbV+JhFf1L/f0fimeXpePB3MUSp1CvGbYK1TV8nQg5ttWBapNxVv6jRUt9ZDHy3z9NElF6H1pt60GBLlOLouyVbCoPWml+1ptTXWZT2w4hn7LJboxWmrqFO1HG2UBLsSp0p70KpTlYZWo+5Y39Z12ptLpU6hdSpx2VSozbyzG33HbjW02yCqaVqpaLmzWA8c4unjgdtPmx7SuhRJXepNtbZ0ty4vomwsVb+potTl7q/+mX3XNe/WHCIu9SZ88L+W/jm9+UdrDjKrJTKO1G2Nf3SkGVZFM+y/+W5Dc+z6ZJ0W41Tj0nY3xWCd1ie7R+pN260fNbQx1mWcZnccIrv12SQOsztO47JGWpe+0aW+352pMj7ZscZBWerSoBy32R073gyNaVlNrNQPGaTWZ2ONI+Hm75TkMNb4bDU4tkWRPfyA0brpYl3WOKhstT6rKIexLoutmxYh27jU97srbkePm1mXbqnbVtUXcTvKkWadhoObtmmcQkr9gLukxy21jcZwKPfd1O+1bq+kN1azDXE0NhtZIqq+392pO9tqMmxVZ1cRRbxZ2TRHZqyqzNYnaVzqh9w16TZRdaAqVjZR8SY63aROhzfhqKim3hT1A+7apG0S1qWUFE29CWna0tRp0BJtVHxSP+Qu7cRqfZGwDREVp2pGWnU5iA4rGvWbpr7fXWVj0FSkcdpqVKRNU9UdiaYqTaSqRKNRkvoB6XtfS31L6r/3H75b6o9192Peu3x0Wb/z3uWjy/p+4w82/mB3l/fBs9P64n3w7LT+TjwW/wPj/0z8T4w/2N33+tklLk8uP7t8+NklLk8uP7t88D3GP1H///LkEqf6JB/eR1OnlCimvkgJFX79BUWaukSRX32Pu/gslHgTcYlTKNOGSp3SmtYpNEKaijf1Xe7jVKlUsgnGqSFsbJI2O9E0YXakU6cGCbNJk0pav3N75xlPeMaTl8Nnd6FhEJ1QRo1m1sT9IOnNcdMkJFmTzsZUp9w43Dba+5HGm9s7z47x5PnlnRdPnrs8eTlc7snYEg0hs0JmZRin284RRtPE7TBjiSHMHMGRzCzZdPzm5Z136uUddXrhduPFJ/fUzg57s+bASG+7Zu3Ycdobr2bH7MjYnbGzQ4bbzmtzX+Z1jGOcfvJ6f62Xd3tTFnWb24u63+4+MmKwTjMSl5hhDLN2zdo7YwzDzNjZwWDH/TaH08xwW6dXx7oM3t1n7u8wLnt4xd2ws2PW2Ga2DGuHnbXNmLVjZ4c1O7PsLJbeVjOHIzNY9icfcbsddNmdNYsd9p3LT+4ObJc6Qg+nI+jSreghTY9YVnPkcDnQlFU9VA9Rp9e708u7cXqn6zI3B8aLy+v9SMVOK2idjqxkpxU29SaNrjpFtMQSlDoFLXFauqyXd2sXe3uZZYd1uj8zmNexPntmMK9j/Wa8GTvr9/7mzdhZv7cuu1hdb3bssN6s+3pgfW2cxs5i/Zd1GjuL9UV8sSzLsqz/kvpjjT/YfwKok2nyzIF6TQAAAABJRU5ErkJggg==\"},animations:Di()},Sl.horse={name:\"Horse\",rideable:!0,behavior:zi(),entity:Ui(),model:Nt(),thumbnail:\"data:image/png;base64,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\",animations:ji(),textures:{base_brown:\"data:image/png;base64,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\",base_white:\"data:image/png;base64,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\",base_creamy:\"data:image/png;base64,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\",base_chestnut:\"data:image/png;base64,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\",base_black:\"data:image/png;base64,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\",base_gray:\"data:image/png;base64,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\",base_darkbrown:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAZISURBVHja5VtNiyRFEG1EFhFXFFcWBsdhBGVZXV1QVhBPggcvwoAeBC8yJy/KeBjw5mkOXvwViwd/ZGmWvOb16xeRkV3dYw82BJWVH5URL+MrM2dWqyP6fffxw+nrD95IqfW5NYYw4c9fnE3XXz1aU3tHXXuCcYzj/q0M5lHuzffDZ6frJ5POc5S/JmSlLtKAJqgCDiABwlED4BisMg0AVHgG4agBaExeXV1tMdjqYAJsFg4At/qgO6EBTrDIbi8vL6eLi4spAuD3bz+c6c5owFIAWj+YAIRnEFrbQZzgPlAd+UYTvJlFE57LMI32LWgDVh0RoOpQh34N2dv8BgRvTy6zCTgNOJgJwElxGNJwpHUcltpY5/w0FGIMxmHsaHznMfgOvot5jk4DGEAGg7O/EQB0wZQWO659OL9Dz330WeGdB+Dk/r3p/PWXpvbk8qv3XrC0r9T5NsYOAfDozVdm+t8BAOGfnrw2E0CAwA9efnGmXQFokQM5wG2OHQKAhW9PAADhGYQ2pvWDyTTqCYHEaBcAdh1b/kH1AQKAAAAQEgCweXBbJSEa5W3J2CEAVPhGLDwLyuagmtFLav6r06euE1QfAGEjACB0FQB3GFJJuvgkqppIcRa6rgSz6u1ZzVHP6q79WXA3ZtS7a5rMaW+mTZwZatqdevpG7fdPVajmvNqtT+vbfhomHfGcX37+0fTs6XuWzt56OPXaM/DUOZ+/fb5RtgMa404DVL3x7jQAWhCNUQD++PF0+vOns+mvX5/M1Mqt7vG7p1OvfQSA9x8/2SjbAUh4WBCosyY73MZjnCPkMTxnE2IJjQIAPkIAXEirkFvxqC/UuqLiI317ADz75NNZ8EatPJQBqopXkpvo1wRpqgwVZ/WGijdCe7UveGUz1jLLoc80AVIQlgIAFeby8+fPZ2IVH+mbCahlV1cCQL37PjSgObTfvn9nur6+nm5ubuYyO8Fq30gwB4RrLwGgNr4PAKDKv3xzMguEdwdA1jcT3EW3kgk477502wtbZqEgCJfZ7it9mVcW2tVr5JoBcGHMRQWXC4yAAlV2cR5OTdsrfZ1geOd6zmC53QKgWRwDwP5gxCyWxv6IkLRBIBaO6zl34XxmxQhB+CieM6KqIZkZZZTlDsxPlvgwb9GGTMvrBM2taAaAixDOmTivi52l5hZZslUBwAmmmaw7wJm/q4JnILhdYwYAC6xPdkw90LPQG22+qpTaLR+GNFKAdjlNUgB66XcPAJwMgdp7S3m1XtvRZxiAaINTAcABoZGmCgB/rxKG0XcolC8BwKm+A6IHQKSqdw4AB4YCMGICVQD4hMrNe3AAXATgtmgbzifNSwBQ4RWEgwJQMYPoLEEB6J1LRGXcbTDYfMdxsCiQAcDl7CAmSsn1qQeymrki2rDWrcO3nvlHu0Ae5Pq61c1WXgFwqxyl5JwgsdAMlraHPsAxDCH1g25rmQkXAbCLBjAfDIATWoFLfUCmAXoQsosGOKF5TGbjTkAHhNvJ8qKlPkAzM94/RzvE6MBhRPUZgCwNVrtWALTMd5RDPkBNgAFwWtAzgUoSxKtSAUCFc57fOchhHzDiBDMAtI8r9xIhDZO9pEmfO/sA3Sa71c+AyMKf+oDebjDLE5zqD+UBzgdwFIi8qgMj04AoG3RqHq1oBEBWt5MPiDTAmUFkAlm04BXQuB5lg9XbqiiSlHxAZgYj6q8AOPXXa/XMvpcAUPIB0Xm6O0Fxx80ODE2cssOQ6m5Qt7L8HrWVfEC2+i4KVLSAAeuZVw8A7Dt0H5+9oxydem/cC/RidSXLy66osmywalJVviIHHd0RroY3Nw/u/0vReR/aqU8WIdA37EftFfCzKzF3PbbSrK6nDY6ZNaPE8EadOkCqd/0t6MUzxuhaLLo6W22pCzMUeM9IAzZQZk1QgWmeLLNMQTEA6p1m9BcsGz5gK74HKrfFnKg4C4vvbAGhggd9+JvdrTV9z0Wu3qZu5QZUNMHaHzGyoVkGHO27oSWVOWXls8uP9I+3olhvbVonN6vKzDghuRxpn50j8BmR8Lp1dgcmc3h1V+LR6m0xZlY8A7SaYIU+JJjXHYro4UhUt9Idl2MmoszWoqv2iFn954xRPtyuMbrz3PgTf3f40LOpnqPZlfYxd3U7DfobtPRctC/MZnsAAAAASUVORK5CYII=\",markings_none:Gi,markings_white:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACpSURBVHja7dUhEsJADEDRtTjuy1W4zBrOwA3Q1RXBBIaZMm118sR3q95mkhERo3MDAAAAAAAAAAAAAAAAAAD87xoRl6ztBNyytgBr1hZgydoCPLK2APfMGQQAAACALgBlN78JAACgFMD86XnQ5l1FgHmicgCfizUj4rXz85uqTcDZKfiCWYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBb2ziDVsqrv1lAAAAAElFTkSuQmCC\",markings_whitefield:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAVkSURBVHja7ZvpTuswEIX9eH6ovhS/QSDxg32Hspd9XwsIEOtcn1Fcue44cdqU27SNdNRcxG18vniZGRtFRMrV6elpoTo4OFAnJyfq9vaW72M1NTXV0Pz8fFcEv6oXAbjmBw6Ab36gAEjmuw5gdXWVtbu7Kxo4OjrqSLEAQub/K4BardYxgI+PD/6uzc3NoNLM/zcAMD+wAKz5gQTgmh8oAL7xgQEQMj4EMAQwBDAEMAQwBFAjY0L3NYDDw8M00f39PfU1gPf3d1H7+/sQXV1d2V6gBwrAxcUFwmOq1+vcCxKpPMIDygqADADCEMCnydetostatsDS8wACXVfDsPmk5F61Y77MANiIe9+O+VIAQONQsvKFOSAvAN986QG4asd8mQHw5OdDSFOpASDq8wOg6+trSMUoZL5UAFC2doQ1X+dZ7/sNgCrCfN8DyDJfFgCErA/dPg+AGPOlAPD4+EjPz8+UpwfEmi8LAGUARA+BHOb5MgAIvcwYpTYBaNNYKiWAn58fFiDs7e3hU0lKMz82NkaTk5OQKlK2nakAjo+PW2QMxYre3t5YX19fnE4bs1oCsLa21iIAWFxcpImJCRoZGYFUUXJflAjA7hEWBQD3n5+fAFDJAUCjHgEI4+PjkCpCfk9tAeDuEEsAoLxDwJ0Pbm5ulC8BAKfiZ2dnPHdsbGxAqlNJ7WwC4J8PCAGIzA84n8AK40IwhlsgzM7O+qLt7W1CD6hWq3xvpDpR6EU1AEinQ0IAckDg767X6xqlNQwHqbIkAOAhYIdBItWJUgGEzvekAYiFkABQOzs7hCLr1tYWpHwJANTS0hItLCykLqExShuqqQecsgDEQHAAcKXZNe3+3srKiiSs/zQ3NwepdtUJAOoUQggAHu7+3vr6uiSeADsJhLIm6zQAPAsbqSzlBWAf7v+uBGB5edlKtaNMAClvlmdwGIhRCICJABvCZORWj/zflSLB6elpjgWMVF7FLNepXTvWPOQaDUkAQFkQZmZmyHxSVsIk6U8A4EswDHIC0EYVbMD4mzJSUJQsiYWbbzoqmweAHfv2/+YAwMHR6+urGxw1NSiUF3TDvHhWOAsAqkdtAuCESLhUFoQ85hFDdATAJC3KZG8iAHtuoF0ACINRbUYR5vv7OwjAhxBjGsLqVRgAX+7BCQmAvU+DYBqnEecDQmgIWP3+/ioDKRMAlsueApAGIWmovru7I2MwCgBSa9xLwqTakwBCEGxDMQT8OQDP6CsASLJS1P8AIJPNicL630sAmi6UrlDDM9JdAkAeAL7wTPfCHIGVApMl7gsAoENrMF8ITrA5gp3harUaNI9NlCRJ0lkAAvk5F0asaQyH8/NzLp0nmzMaxp+enviA1uXlJWHSNFK+cgDAPie9vLw0XjCeAbAKP4RplJ1gHCUoo6bu//Dw4MqP5JpgREDgVQDPRcKFAon5WQWNt3VJdH1jTCMbTPKAllAYu9IhAF57uc34LjwLtUbAtm1AegoAGnUzGLey5qVan6WJN+kENJR0s8xegOoQlMDmao8AgCWt/XZbPgQAlWb7dxCJaHR0lGHi3ohLbQDB+TkORYQACAYq6Mao7dlui7QZMNC9MIn6EgCw7LNiAaB+iDcaA8CHYNJqTq39v5BpBwBPZHhz6D14kxYGxqyR8lUEAFtAFQAQoksEWD4AF4IxzyoKgHLmCy5aAoYxW5EA+BDyALCnVgIACOMb49q+BIDwN166BcCqAcIY1UUAkM4tewA08gnMQ3Y1wRDExksi/ZcAGgqZjwWQdnDbmOfDm3YV8i/EFjaWkCpNPQ8g69Q60mnMMdhgwZvHJ/4Ns4hNMAwxBDAcpH2EEIB/4WvbQimDVqgAAAAASUVORK5CYII=\",markings_whitedots:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAToSURBVHja7ZpZT+MwFIU97/My/24e7p9EIAFileAFIfEAltiEQGxi30qBUpa5x4ot1ziJk7ht2snDUWkaxz5f7Gv7GvH9/S2y1O12xdfXl1LevWlqtVpG7Xa755k+4feXlxdT5uPjQ3Q6HXXt+fm5R77yuB/32u3G5+fn54+2ZTbcbWxZADaEmADSykcBgIbGBKAhxAKQVb4yAG0+NgC3V9nXiwDIMl8ZgG2+HwCyFAIgz3wlAK75QQPQDXUBhJiuDMBnfhgA9MyjARQ1XwpAmvlhAUiLDX0BkGW+AdAAaAA0ABoA3S5xYaX/EQC9v79LLgidcgFqADRDoAmCDYBQoSE8hMwe/r8CgMpGAkA/UmKoaCwAlEmKavNjA8BuRBHzYwWg6JtvADQAagcAC7k/3KZfoQCo6LK3xgBgXnI7iNvwOxSATEQjCIC4XgIA1I+/WZLrJ18bovQAn/khAVBmO52OZAAGAn+ntDb0ZezHBFAUgn2IYgEQIQAopvmYAIpAqAIgqvnYAEIhDARAiPkAAIVnmloACDWfAKBk+nErJ2umidoL6gSAkmjsm4JGE0Ayr4aKXl9fZavVko+Pj8QSUJUhEAKhEoC8HV9BAOLt7Q1v3pjn71FSa1EBuA/Iqvj4+LhHp6enpsv7AMEwKtXmxx6ATqBo8RAQDw8P4vz83AZAMdLrowpALVWxOYl1xlB3AMQACACSf3dRBy0xAbgQ6gSAMANcX19LBmAgoBf0+5BlqAAgrP6wAHp6epIXFxfy5OSEWOLw8LBSINzY2BBbW1uFp+4iADIDVA6AnrKAwADw5pX5vb09BYB7RHCCFfclMJXKANA9IhWAzp4kU1fm+MwAQG4SJQGgAuDu7i4AEAMgAAhRTABZMgAwPpFEwNjFD3d3d8qglmteA7i5uTHrfhscngsAMM+i7e1teXBwgJhAdQSAgKUyKHr6CgBAfJ0AAMJz3BUjTOzv70PEEOTR0ZHke1WZvMOYQQIwmxY9FDB9MQCyAUBnZ2e2EN2NIQ3A3gvo+AAIbF7FgzzzAweg82hcqdQNb7fbavrCG7YBcES3JS8vLyVAobdAbmIVscECoOJByEZo0AB06pg0AI6W8urqSvJbJvutO+MUbzPNvDLp9ADfVpiGDsBdUSXBC4GKnC7/I1ChO6eYz1ItAahGJT1BRW8YhGlfIRtAEWN5uQC9aKkNgAhvNnjnp4PnsADo87OqDyTHfFCPsHMIwwRQ5oSIMgxWBaACcw4A97l/E5UGEPIGyfO9CMAf1zwA1LY5EaUAoKLnl7lDwMnUpo1pWaFib3l78YRzPKxKsZXGbhL5BCRVFhcXDQBn/9E3AL7dYXQAviwy9iWYhrHc1uYTAMQAaGVlxd5/VDrczSyogyJvZNyFDEUKlKrLJ1L5g9vbW0jNQthzWABoYWFB8qdkAAoCwGEd4km3B7+k1B+WlpaMGABhLb+5udmX7I3W/f098QoUMgDm5ua0aGZmRk5PT0PEUtexFHfOHEoBID0NalkAQFuura1JBhAdggNAwHwKADE1NUUTExPGPKDs7OyYg5eyQ8AQ0wshyCY/Pz8vl5eXAYFYIk0DACAYgACAyclJiNbX13s2bWWCICU7N4ltMHIBkF3x7OwsAUSW+SEBEKurqz071lKzAKIpupE27wGgPmsKQFQB8A/d2JGwfbRgAAAAAABJRU5ErkJggg==\",markings_blackdots:\"data:image/png;base64,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\",armor_none:Oi,armor_leather:\"data:image/png;base64,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\",armor_iron:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAARCSURBVHja7Vo7bttAEBVsC4YNuHKlIk3gJldw6hzATQ6gUpUqNYYRqFAnpJN7w1XgLil9h1wgyAHSBD6Ag02ekCc8DWdXpCSKFMUBHkjtktqZt7Mz+2Gn00orrbTSSiuttNJKK620cojy6/vHzo+v713c3d2F+/v78Pj4OAfuUabPFGlHUSsCgC+f3mQwHA6DB32mMQR4noDeBqbT6Rz83UgPAF5fphkCYDhcHyAJjSYA4G8arzEAZd7z4fWbC2v43hFA44kUAc/Pz0HRGAJoUIoAAM8wUOI+ZnytCKBb61hXd/cI0Ge89+2wAWpLAIKal95YZrPAqmc5V1CUSUAIYQnaCYCtt1ikOs3z7PlYEGSdvqMp0xKgw6aWBFj3B1LjF7AuTsP3jgBPOQQ2pjEb6GLgMImhtgR4xtvAl5eEIthmELfeWARuGrR/ynLFJsbDs7Yl1JOdZYeydqQ3bBcGeVNgb+q7CQk6Q9yWeGnZM97r/QwBsVUgyy0BKSL+vHyOTo+3SQANscbbzKVzFU3PGQJwtQsgrfMIqHoi5xlpy9SjGQBxv2BQ5wB2WWzrbVyoeiJXBJksoBMZuExsdwh1sZngXotue1mjf/+8mUNJyLstpkEoBjzT2L1GO4226WgRhZtMgLdKtMGp1kbc3t4GRZF3+/1+yIPGEmBzszcpabQHnJ+fB6LX6y1B6wgOidFo5NbvHQEfut1A3JyeLkHrSAqMxxUEKFG83zsC3h4dBeDd8bEL1rOHYTgwGAy27gE61AoNu00IuLi4CMDl5WW4urpaAspYv4uOfHh4CN59qQSokbhXaPmuUnLUA1BQ1DhLEgPY09PTHLinsbb31Qt2RUDSA2AACtfJyXgH71pPAepEQGUesCoG4Jo3FZbmAWURkDcL6PwglQpL84CyhkBsDmDnAtrLqVS4dx6QdyZYeQwoywNQPx6P3Svb2tViqBIPoLGz2WzJWEvCQXiANX7XJFQyD7Bubq8koXIPKEtgIIxdda31WuAghDs0k8lk3iNMYcjR3X/wFjNdyeHsRQa7dVzbyw6qg7eYUh2gM96BDd5GbHJXmhHcI+Ds7CzTOIByNq6Kg4R1YwkJ5LWIDkqAbsSmSGDHRwm4PjlZeID1Am3cI6GIF+BZmyr5vx4B1Ae6QccYAXZbPnZmmCEAV48AhTZOBbT38nqC1/M6i8yrg+runQcmt+VpvCUAC5bu/zGIXiBYxsZ5XEYS8nqC1/M8g8R/KgExHaCjJSBGQgwdvmQJ4GoNYIMKNq5fj3mulxqD9vhav0qznaBQ3TwCiiBzgEECFNqgLnF1DQ/F+R8wxI4570sNAM/yPf0wgwTo0tlupBIkwEPsi/fFwYwOAYIrOAY4b5eW0GNzBctjHy2k3rOrSW9prDpa/Vd5oeoRPdRQAlJ1VnF7IhTrAS8oaSwpqsdWZZ2GPeNX9YD3ue2mehSVv7uZemxcWy9FAAAAAElFTkSuQmCC\",armor_gold:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAW1SURBVHja7Zq/ax1HEMfPvxCoVGMEceMuuHvlC0Egk0pVGuO4EimFSyFkFYr+ACWQJphASJ0uJI0bF64DBuMmYNKEFDYGIwwCF3Y277t5c/7e3Mze7rt7xpZv4YtO9+Ptzudmd2Z3r6rGMpaxjGUsYxnLWMYylrGM5WMszx7eqJ789pmp03ufhHByK7wJe1E4xjm+p6SeUp3+c3vpqiv75ZsrLT3+YRIs8T1nBoDlCXjb0Qv+/DxK/j+THgC9PjludwEYP3P9qDmEMw0Akv/FeB4DcM66P7z+3dQihr9XAMT4GkICwL/hfmCdGQBiUAoAhHtkoMRxH+PfGQBxa+7r7O4WgMY9xvOtbjPTewsAg5oV3uScjgKd985zBdYyAYQQmqKXEKWvK9WhjuO8vHlvEJRr/AyHzBYA6jZDv/1BAGj3h7oaqF1cDP/gAFiNw8AmYUwPdJ7qccDRsvp+bwCW8Xrgy4VQqjcn37W0u7tbBsAYcEtkhkH9o3Ke1cdw8S4PwMrKSvXq2Z0sSTvrKKW6Mr9Iq9vWBpkpsJH69oGgs8QUgFwIVli2jDc9QAPwZoFyXgNIgYAxXnqcCyAHQp2HKON15OJchcNzCwD+6gkQX7MAMAQ2ZggAXSBayZhqu1Y0fD4A4rgmyDmAnhbr6964oI0ZEoAHQYfcLrWiACcycBlvdQjXvEwQsowZGoAHQep6+Ov1Rr3ymxHUPGrodjeWvbTRL/76MoohWMti8Zo2hgYhT7GfFgKwIPQCYL1tMVzL8w7o6R83G9JptA5H0vX4mf39/SwAGsKgADzjcyB4odQKPzrEHh4eFgFgCCkAXvfLAqAHkBIIei6g5wy8vghjFgEgEDwAOUq+fQ9A4x7DrVIrylpiyKIAIAZQYnwEwHl1KQB+dmNjo6HV1dUgWl9fb4iviY6Pj6P29vbM610QSg3vDeD5o68azyIP4AbBEJEYx0aKBArO4y+fY3hra2tVSoMA0BBKAYTTn6qr58+LAvTphQum5Lq8YQGys7NT7AFdRsoCrT5eGACM9wAIhMnFiwGazvTFpUsNTefXoJlx6C7wmKiDg4NKzrFSALz0nGe31jFkzrH7AsAxGzlV4vPff1v1BpCzWGMdQ40VFG8s0K4PWfGdk5yp8/bZC6Cff6xqI4+OjqIAogRAry7A8VmMg7oSoVZ8V8oFwEYuCqBfF3AmOJbxXpy3Zl3TjDFgDiArFC6/CygPsLwguXGqlBsFOD9IhcI+ITAdBRJTXO/t53iAlwPoXIDfcioUpjwA7Vm4C1iDoI4I2jNyBsGCTLDSoRDjQMkYIKtVg3cBaNZX07M9pwtwA7XLeoZgHgBhXpAyeDaORGkAL//+etgugEoAYDZYFXeBko8nUHIASJaZAoDZ4SBdQEgLAKikC8Qf7wkAkyppB+rPBYDZYXYXsDyAK2YAE/KEoT2AvUsM6wOA1wW8LoB7qgd3r1W87t8FAJJKRfgNyFsc0WOAtX6wLABeF6gByJoZHi4BIPdAFoAuI98VgK5V6YoXKKU7SExGomJNZnBeYrj2hiE0D311G6YdbWh8yGEsxKZWpSu9VscAkLFZleM8JTGDA0ApaYMGwINyyvi4NeYB2N7erj1gkgaQ3InxjEw9w5mhBiDtQdvQxhQAa69Q7xC39tY8ABOncsjbl+sC4O3jye/mtqHestMAOpbl3wKgygXA1tZWuHzuXGtCg/9xXipPfoDgQOjKIiWVRh2pNqCNLQDyu/T7svulj+P2uN49FQCbm5u1pBFSMVeeIi7upl3c+lBBA+GXoOvntpkA6HullP7fHXYAsLhCCA1rAdDurPqf+6WG8RwDgHT9un0WgC4Ics3cwJAZHM3Wgie3jyXCkQuAnk/VKW2SNuZuwljy4rAGwKqvIQdofDcgZI1ROPW5Cr8p3jHKbUevkGtlYSUAeG6gP7gskTy7SDv6APgPYfbTiNqnQXUAAAAASUVORK5CYII=\",armor_diamond:\"data:image/png;base64,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\"}},Sl.husk={name:\"Husk\",aliases:\"zombie\",behavior:Yi(),entity:qi(),model:Vi(),thumbnail:\"data:image/png;base64,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\",animations:Ni(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAP3SURBVGje3Zm7ahVRFIbzDhZy8IJoERQhXhDBqEUUEQURMahFQCWViKSwsbCxtbWwsrMULO2sBTvfwdcY82/45DvLOTkTDGRyAot9nTnz/2uv287S0py/T++fdl8/bnZpf3zZ6jyO3F073z24falXsrZ00P8COoB/fXvbhDFEALRPsnbgCQA0gCGCMWBvXTs7JcwvBAFoGjNgLv2FJyAgn9xfbYLWf//80MBHMIE+AhbCBAI6QEIAmg8BPhkLTQBHPURg/xCQuRDT5wghbWFMACIggUiAedQQyPyB0bC1i4YJeQGysX6j9WtI5Fk/5zWHzfSzh/dkPAov32fbTngC/sXGndZG3r1enwLhEAnASgomxBzEjYIAfxCgbccBH3mz9ax7ufmwScbYvgnLOwiZ9hf1lNHuOwFoxNoMKGwYzQMc8JwK9uUZ5wk2jz7TGg0BTmho7cgCdDKZNAE846xVB8j7sH2n0pw07xlFnCeeo017dpsAMZ6x9/gZ+w/7CvqW0SQ6JDMAYo6xT0b29e1hjTkqRhPhuci+E0DiUuN5TXCc4UFU3evTUBOjCny0tcLNyye6i2cmHe3y8vKUDHGqNS1Gsra6cmRHmff+759fNX+SNhLSccp7kngZfNqxEUBUQQCe05T+nhGAjJGAmBAnwea2J8UX2kfGaAJEIUzgv2qP0ycPN6D5cVq077naR5IWI3j5fBiOFUfq2sLPOIOkxb79vgj9gE9OwjyngWfdH3TkDej6hWN/CUi/rtdxBZIfDVBIIMFyncH++pzrEhMBGSaCE+ACzft4z1wCqkYD2iTMIgATAYTtkoyPeef/ADAB1iLrAOEUPL53dQqg84q61+NdnQAcoM2gmgcmE0l/FgHUF5l3BTiLAGuQlNvgnz9aa201iXpNn0jguUE+YBYBOQmsG7TFBJDyApiPtPZ3IoCPpugiS7XgAJG+dcr2QWHx1LFDU9q13UOAwUMG85WAgKkXKoD35UifD3CNgI27zog/4XTUktzVK2uRQQQAJn1r2wSg8eoPKgH1fwcuiW2nlQATgd8gzJkAl+dOgog4Xh9EgO3aBMTeWIMkWp8CRwEAov18gO8HDNAEcNxtCrzL4GwCJsAFm9cjg5ygAQZcwOclgMy8xXOVALSHBnB8zuAAbwKy12HQN1PWssH5QsYE+PJmLgEBGwFUQPMw5ETYV51QXyKE9klWfKWecU2ETIDjvu8pIMDg09Zq1GuDCCC8VIC8iPnsi9SrMafNkSsrR5skiriPKQTwP/vPHW9iE2lz22vWrk8AV3LUACZoVz4AYJY87LauWfryCEADsM1tAwoJNfFy4QUJnqu3UwaXvn2E7zBp5+H/A1b/DxMW9YloAAAAAElFTkSuQmCC\"}},Sl.iron_golem={name:\"Iron Golem\",behavior:Pi(),entity:Li(),model:Xi(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:eo()},Sl.llama={name:\"Llama\",rideable:!0,behavior:ao(),entity:oo(),model:no(),thumbnail:\"data:image/png;base64,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\",animations:so(),textures:{creamy:\"data:image/png;base64,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\",brown:\"data:image/png;base64,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\",gray:\"data:image/png;base64,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\",white:\"data:image/png;base64,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\",decor_black:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKTSURBVHja7ZldS9xAFIa9qBelF0WktXa/LH6sel2KiAhquyu6IAvS//9Pxpypb3p2yLIkTi5MnouHZCYkE+Y8OfORrRDCFvQXOgEB6AQEAAQABAAEAAQABAAEAAQABAAEAAQABMjL8fZzMCYf5uHHx1lEdbnb8c9W+Xx38b/u8zweDz/Ni/qniMptvNO7EcB3mjouV6AOJqehijYEqGpnNDwJw8FxmIyn8eivWZ1QHRmgYO/L4SxXo3c3z8G4vHiI2LkEyCWBnmXPVXue66un8vx+towsHv+uXLc6O0eAzAz2p2F3Z1xyd7ssv7icAuhrtyD69tbx7etRROXh99N47O0QYCnfxul0OHhrkNTBo8F5PP76OYuBGo9OsgqgVC4BfHA3UWS84v3O4j1kgMyog8sM8DoEWLCyCVBM7ux549E0pnLLOvrCfdt6l7TOC9N5AXyn1wlA0/vSjrYhoJyAFRknZwaw59p47oOdBtgPSVVZovMCrCyLagpg92p10FQAm3yVs/CMAuiZXgBPOhdZJ0MvhoCmY7vW83VXAZqF29FWAhYoiZhtFVAMA+tWAb5tO//ze1nO+lWnFUIvBNBY3GRJV/crqVp327llkjb3AWyiWbUvoHdIr1vZ6IUATQLZVJyqjSXVtbHjqHa0C6jdvnTo065gWkcGyJwBoOcZAMgA0KVVQNf/mLETCN0VQF/wv9nxYmV2rn8BKvvzqlm8R/8Q2vzfD5kzQBqktKxg+jJB7ZAA6UQwneBtug7vXIC6AWcJSAYgA5AByABkADqyO6sAP8vftCpo8isY2AgCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABIC38gLeyhdyeyFSPgAAAABJRU5ErkJggg==\",decor_blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALySURBVHja7Zo/ixNBGIevsbGwFOw9/6DXnYgneoVF4OSKAxXlRGzsbP1Odn4BQZAzcGiX2s8RrMb8NvnFd5eNXiYjZHef4mF2N7szm5ln3vmT7KSUdmC4UAkIQCUgACAAIAAgACAAIAAgACAAIAAgACAAIEBZdi89S/euvUlKb14+SXtX5+ha6XKMyxO3r5zU8GdKhd/H1wYpwK/vH9L07F2ajt+n9O00Tb+8SromdL5JoaOXk/Tg6EfF/miSdC5U4aUFcDkPjycVLlvp3cM5vqd57HuJAIWxSJZKQqmi3etK9n7lO/36dimvjo3Lrq7PRDcW3vchQGH2DsfzBl+kFkCUFMB5qhFjeUpHL/6c33n8ufb5rYNP9fcbogBVD1j0UA0F7rHqIVXP2aBQVeqN+x+Xlaz8HJJLCaCxWyG/EmD2zqsaf1VqCfSeRIDCqMepEdzzJJYE0HygpADLMXwRYdyozR4fG70tMvRegGrcC+PzOmN5znPNCCABPOkqPQQoT+X/rwjQDPsx7b0AngQ5zF/04WrSFCZyF31OjR8bQfm4sUpGAOep9/tbmG+LCPH9BjEExCiwDpof5KwCPK/wsVcBopQAliAuYaPstZWB5zvh2CuEQQiQ+0XXiRhxCGhbd5dq/LaVgHn6+mfrsSaMOo/rfzMIAXJDb85zcZct7s79j42g5i5fLNO7j/Fa285h7wXQl3zyfLz2l819DnokwMHxGQJ0XQCH5BwBHEqpzI5HgJzx3PcjADuB0FUBmuvj5YZQXKeHa9WyT7+WhXubvxfU8tMzIS8qfYsjgBpIYb3ZUG7g2sMzCa4/Ok+5G0iwpQLE3a8YHfyZG9x/FsnZCIItFkC92gKogfePzqtrSmN0WBUtoOMCLPfBF2HeDa/1fgz5tchARfZnFdD8ibeNTX8/gI4tA+np7AMAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACwNbwGyFCt9rlrNTDAAAAAElFTkSuQmCC\",decor_brown:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALgSURBVHja7ZpPahRBFIdzDBcSBxduzNITCBoIiZAjiLgTRHTlBYLLkJWXcJFlmFsEQtZepPVX6V/7UulBqrsL2+4v8DHdPf1npt5X71VVZq9pmj1YLzQCAtAICAAIAAgACAAIAAgACAAIAAgACAAIAAgwLd+OnzVnh5vm4uRpo21xfrTfMcX9E0dPEt/fbNKr76/30jGf13L26nE6bnzeKgXQl48BcpC8Peahuo8aVg2u7bdXB1UaWp/z8+VxF1xhEfxMvXf7/lES0tv+njpnCiHJAD2B+fnj9YMeqIBMlQH6erif6WD7nOuPBynwer3+8uKe6AhQSYDYyA5MLdHis1Lm+S1AFFD7zkjOSkLnaH+1JcBcnPypnS4LYwOjHtdX/6focQqoe3lEvTuv+Xr9tH2ZSoVS/rvt865MWAgyQI1BYNu46nlqeIlVewwQg69n+pjOcRn4uj29Gzy259TITLMTIH7Jki885ro8NU+VXfLs1TcGcIAtgIIulAkc9CjMKgSIlDZ0aeDy2lt7DJCXA9f3e7ODEHQfq/W5ZlkChtbfIb1Wz1HKjfNy98ypZgEx6C41HnfkmUef5ebD3bjE4wTPSFYzC/AgqPQGuqb0unzwV6vWdrX+cNOtAbiX+5kekHoWENcEaq1PzFIAz4NLb+BeUzRKD2k39kYdm2IwGOt8XqacZWJm8HGvGMbPtRoBVO9E6Q2GXgczE2BIKh9TOmbZGO3frv3FlwAxpAQMuQ5mJsDQOe9Uc3fg9wDwLwSI07F8sUS9O67R5yPq/JoH/19v1+Tj9TT6jDOAg74rvVsI0v9CBchnAvl+PuJf0gwAAXoWg/IR/t/eh/9cgHxRp3QfFl4C+vZVBmjIBZWAmNLTb+RCyvePJigBCxXAU7xdi0Oe2o1dPAIWggABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABYAy/AJaSG5M4H3NeAAAAAElFTkSuQmCC\",decor_cyan:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAM3SURBVHja7ZrPatRQFIf7BqNjLYpIkSL6Bm7dq6AIbn0Cn8CFVazowopTKUqVFmm1UBfVjSsX4kIQ/IOIG9GNIENf4jq/mBPO3Jm0zUyCnclX+Mj/ZHrul3PPTTIRQpiA+kIQEIAgIAAgACAAIAAgACAAIAAgACAAIAAgACBAuTSu3gmiOTsfmrcWQmOuFRrX7v6js37o8+s8N+4Fu06GX6d5v5xeu2e/En7PSAqQNdDNVoKWJzvTqduLQwdl/4OVsO/+k3Bg8WmGgl6FaDq3rpeH/w15+5ABSubkxusw8+xVOLryIhxfe5kEWQIoG0i6Mhpe5zEBjq1uBl3TX9cv27z2i9F6BCgZf3dlAlSQapXWdW41oqaHlp5vmw08ylC1zgBqkCTdd4Jo3YDvDobNAM2F5YTp5Y1MAOt7y6oxhBdA2UDzU4/Wkjvfb7O7XQ2veb+NDFAyCrD1uUeW1pOgV1kDqCEPP17PGto3rk0lhGUjL4V+29gL4O86FXpFAtxvficUbBPA7sTSM8BcK6sB+l2vnwi2XyxHLQTww6AigZ5Mu4Qix/l+1oJcSQ3gMsBOlb5tO/hwtWvfWmQA328OEuQiWcMygEfBTqr2MjNAKrTd9ZJAKV5T1R22zo8QtN2PCmy+FgKc+/UlXNr6Xvif1TFFj4vvuuQ5QIUZwFf0Nr+b8X+tRgFm/SAVfdHjup6+WdczQBe0m1FAdl5ll+vzvU8I4yeAfrvqiAqK0z0pwIf25fBm60Thf1bHfGxfGesg1UIApXF1A4N0AWd/fh4LAewvb5nnAIAAgAAwTgL0rYbTsb29Ueuq2F3lnrwuTunZx72RS94npPsR9D2cAeIhnSr8d+3TIW/7mR+fwsU/37JljQb8SEIF4vnfX2n0URbgbftUrgDxQ6B4KKnRAQJQA0AdBehkimkCPGpFYFTc+YIw+5DTfxjSr+BzH3zqOH/suH9gOfIZQP2378PjPl8Fn+/zte/79oXcom/Q9wvwnwRQxb+dAHHRF78H0DY/KkAAikBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKiCvwbtcm/E97kEAAAAAElFTkSuQmCC\",decor_gray:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAHKSURBVHja7dhRagIxEIBhj2XxZY8jiCDeq4+9Qq+VNtKBdEmWrU2Kdj/hx5hddmD8dzLJLqW0w3aRBAJIAgFAABAABAABQAAQAAQAAUAAEAAE6Ms0TWm/39/I45JeMWrPj7lW7Jib30OAzrx/JjV4OxzS68vLLdm94+Rn5mfnGEH+XYs/v1beT4ABFWBeBWLcO0Yt1vxtb92rAgzicrmk6/V643Q6pePxOCTR+Zn5+TlOjhHEXHyX1/Pc+Xz+Nk+AQRWgRu8eoLXer60QKsAAyvU2xqMqQG3Nj3Gs/eX1cj6uEWBwD1DSswLU3ualirDJXUCtEVoqn2u2UrWEl8ks19xYi0ckOseMtTyv6xEvj6P3CMp1v+wD8ngzFaBl/dLcPW9t6638y12AHqAhwFKCWkm79xyg7AVGnANMlT39vCeo9QHzMwM9wOCTwN9Uk3t2Gj+FACDAJpLx9Wn9JgAIAALgPx4Erd0nrzlVWzoskvQnqQDxR5Z757w3ngbt2fGAS0D82XFQ0vu0Dk/QAyjhmsCdsm8XAAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAACAACgAAgAAgAAoAAIAAIAAKAACAACIAH4APHXvcwKi59cQAAAABJRU5ErkJggg==\",decor_green:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJoSURBVHja7ZpBbsIwEEVzBKpKVSNVFQuE2HEH7sIKqWq77OVTHDLhM4SFHVuF+lV6CqYJEPvNeGxouq5roF7oBASgExAAEAAQABAAEAAQABAAEAAQABAAEAAQIC+L/WvXHpY94fHzz1tPaIfj3Nd/+my7QHhtff3T+657/GfQ89uvzcVzVQowdkboJOmQwNxBskFRAUp0tA7q+X7Wk8dwbrhPu8fwuNTnIgMMHW4dbKLZce7r26AaPiNo5C+aATt/aJv0CFCAcbAlykp0tKb8MbJ18J0AvTjSfvl+76l2CtB0qBE6N0p13tVB6d/nSK4Mo/O9ZgOddqZEsMG3IxmgQAbwBWC5DLC8jnpP45Dor2IK0JuMueEQTSnXWaRrVFo7RwbwqT4c++c+NtO1wYQAWjNUIYAWSrERFhvBNtBehBIZQAtMXRb6DDBOFc3lOe1hVccUkBp9Jk50ah4G/6IGGCI118D7it+KwTC4lt51KWhpP7RPy9RVPauAxe7YGbv4m0257npglkUzwHmjaX012JoNNO3r/+oQYHu88W2CAAnX6SbQ1O7b3JvSwtIi3ATQ9zQJLOqnpoh6poChAIoWIPE6qDgD3G1nDH+32tQAmWoAuNNVQMr8W8NamZ1A+L8C3Nwe9d+ayTd4ViXbUffXdUPJ9vdTNpngDzKAnwb817N+0yfXsg3uRQBX0MW24dEFcEu62DY8ugBuUye2DWQAoAaAhxXAL9V81e9/spXrBxzARhAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAMTwC37YLTYeqjNqAAAAAElFTkSuQmCC\",decor_light_blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAK+SURBVHja7ZqxTgJBFEX5MxN/wNqP8HdMaIylnSaWlhZGKys7UKNGKxMTGqsxF7zuc1zEhV2CO8fkhBlYZmHenTvvDQ5SSgMoFyYBATAJCAAQACAAQACAAAABAAIABAAIABAAIABAAO2yP0pJDG9TOnpI6eBu1ldbrDq+xvDY4vTx/Vvb/fi8ro+fSW2/XqQAPDHm8H4WKD2KVQWwezVDY2+fzya87S+nsbfOJtN76F66j9qXLxU3rxWjt5+v6REH6CAwnlyJSv3j52oltjF+7gIOqtsSg7AQ3Zdg4vMIoKMtQJO7c1E5QBdW67ElhOg4CqraT5NKiHXo8+n1orcA2b33aa/WVYN1Mp58WaxXv4Kk8dtygLini9wBJADdP+Yesa1r5AYSCQ7QkQN45e9dd+cAGlsCsLVLZBaABWEX0KMCHgVQxBYQJ79JIIbj5d4nAXhFOtOO+3VbOUBEgXXOEYMbV36sDiQGCaaILcCTNLXg8d+/cF4lNM3OYxXQhQNIVB7biV1MAuft/37eeUIRW8Cyq2+Z9zkHEHGf1sprswqIdX3MARRgb0EWYl4NFFcF+As3HcAT1uQ9chrfT0H3Pt2FAzi/8OdUW/W+a/+44uucoJgqwFvAOhwgnsrF00BXGW0EPu7tPnmM1YHuHU/7fBop/Dn8HhxggQOoXuZcvQcOoNWwDgfY2Mn4/JvX77UAnPg0HWBZ54CCqwDg/wFgUwSgmrzu5EyZcHyt7jd1XeO2DpBiRh2vbes3BOjYAfIg5X0HPPYJao8EkCd0dX2dnM3rQ88dIC8VsfUeOkA81s0dwOfmq5aO8E8cIN/j83+SxAF6JoB8RdflAL85BPTcARblCMBBECAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAWAcfU/9gsrlGgakAAAAASUVORK5CYII=\",decor_lime:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALESURBVHja7ZjBahRBEIbzVnkEX8CgJ0/evCQiHnP0JjkIQrwIehcPQQ+CsET2oggyZAnxkkuOIuQF2vyDNVYqM7tMp0d2Z77Az07N0NOZrq+rqmsrpbSFpisWAQBYBABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAUBZvZg/StLht91ar6snyd8r8X69Z9k8Jt2z5/Ge2ZMEoG3h/ALeZtKj0/v1O/T76efDZPYQoOn9fg79etkz6f2PndZrIkBhadEF1tHiXuMgvytLRRjv8GbOq+vPi/00qw7Sx/M79bX0pXpVa1Y9T/PqzbXnADAAAHKO32VDRQA/hwCQbQBECOR4QaBf3dfzyQLg86HPk5YbS6WAd9/vNs4pWQPECODn9E6XBKS343MiQGG15WNBNkQE6EoB5mSFfG//u3/Q2KMHwO/oPrs7d9zs4kHjDCu4fJFZMgLI8ZrPokxXDdC28zX2uHo5DQCs2u+zE/24Po7zzhi6BpDz5UhBZnNawWdOt5zv04GHYRIpIDe354zzKcCKtJJ9APufBKY/6pltVX7c+VYEGgTa/bInAcBi7206fTzv/bE5425EgKvj4BARQHP4PoC3/X2fivypYVJ9gMuT7XT5dbv3x2qMxubs0K5OXalOYOwGxpTVNrddT64T+Ozsd3p68qv3x2qMxtJX33AAFMYVzvu+IHfcWi7G378ue9wpICOU3yZ1oDUDwKrm3DM3i0knEG0iAMuq4a5KelmVbRV013tY9DWOALERs8o2R7OQIwEgVvTRjk2fxd6HrOYRWlMA6orenQTiySBW/JwARgZAbAbFJs+q52jDAbgZ4q/bq1IEGkMKiCF+WQrIbB6hDTkFxKNbm80pgEYQAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgD0v/UHCcB2t71fhaEAAAAASUVORK5CYII=\",decor_magenta:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANYSURBVHja7Zq9axRBGIfzV1lIUAwKYpNOEBsb8S+wt9TCRgIaNUKMwa9IFI3iF4pEGxWDiLY2lukOFqtxfu/dO86tJ2Q3c5C7fYSH2ezdZDbzPvPOu7vOhBBmoLswCQjAJCAAIAAgACAAIAAgACAAIAAgACAAIAAgQFlW9l8JYv3osqHjZ3P3w/rBW6H0GHXuzS31x45j+XG6nsE5vyb9rLaTAuQB0kT4pDi7GbR36av9jmrxe9Cx2nFMdBrjwpfgY6oV+nv8M7V+Lb2LW+maJIOOyQCF0eRrcm3if1yzVhmgpAS+ei3Ab0+mgPp5lyMFfoQILj8CFEaTmwIQg6MJ3zh0d2wZoHp/ZigD6JwC+6n3IryuVsLT7evGh+0niZe95ZQlOr0F1Fs/3pUAcbV5cH5/PGvt7QNXbYWWzDIewOrbgrWrs4tppUsABT/PBI7O6TP7fpSVDFAYT8c24VvnLSh3ZpfGlwGyLcBrgEfHblqQdV6r37cFrXydswwQJdG1Tb0A+YrWqmkywW365UWgZwDPMKX+MAVbK9jH0EpW0L3w0+cK8v8ygEvRiS0gT+1N0nvbfprUjfnVfjqOGcBScsHgO2uHb/TH+Hwupf08yJu9B7bfq1U9oOOHvy5bZlj7udDPAF25C2i7r7fppz4mgAoyFYExSFqtonQG0MrPawDhdwKp6s9u/fJbQxccAQoLMFQDDG67SgY/vzbf8/22zsfLx8/x77oAnckAWomtCrrH+0Lbp3QKgoq/NtvITp4D+ErPn/75Q636E0FlJJE/BfRsMfUCWJUc92IVS42CH/upT9N+e3YyBv869y6gejVvhU/TQOr7KpzaZIFJEKALQqRA2u1Yw0Ba5ojyTEsG6PTbQD0ubVUDtOwH/H8A2AsCDL0PH1TA+TvxvHr2t2lq/3mX7q+Os9+R+o6hyocxZIBq8/TQfq79XXVB9e7U3/b5kVC/C2Aip0QAKwRj0FOAY7Ct0FPw35yIHA+SJN//859h0jNADHR9RSvAlgkkQy3YdWFg0gVQoEdU9ZYBRgR6lDAwRTXATh4EtX2EDNwGAgIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQHP+AGvUdXJkDlP4AAAAAElFTkSuQmCC\",decor_none:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABJJREFUOE9jYBgFo2AUjAIIAAAEEAABTLtGVQAAAABJRU5ErkJggg==\",decor_orange:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMKSURBVHja7Zk9axRRFIbzN2xsrBcERS2CFgEhFi5aRBC0tLPQ0k6sZCGoUbMmIUZB0uc3BOxSRAiIpPZnHOfdm5O9e51ZMpO7YZl5Ai+zczN7d+ac556POwtmtoC6K4wAABgBABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAkFmHb82O98y+XjEb9Mx+Py0+r4TPq7fs3PN/uBPmGi6b7fbC7+j3NPZmORw1/v25je7l9B6K6zafhGt8XGOdBEAPL0Ou98NxbclODSvlBOD4VXBW7gcUVD+Wwu8cfJsEQOMCYP/1GID1S2FM1/j4xlUjAlxEBPAVK6fliAAOq1a6HPtrtzwCuKMFYQrA5/vF/dwEgJkBIIO78XM4vgwEOXrj8v8pwCOAh/rRPZykgMHDAMD72x1PAZ4GdPx0z+zLSjjmSAE/h5MA7BRRYO3u+eeWNvshmihtVUUAASBnxwAIFEERA7B1jQgwkwggh8jgs6wBvAgUAGVF4Paz8hpAADgYnagBtMrjlX/WCeJr4znOCkDaBchhdeaZ5nhXVRdQVgQKyLgLUAQRFK0HQJW+HlaqA8C7xXFXUOd7aRF4+KIw9IP8hlYqcADKUoAiQFoDpCmgEwD4ahYAdSdp0hbK6GrLvAYQAB+L/L96I08NoDm8DvA2UDWHHBqnAK32qgjg450pArUC/jZYhUePwuppUgM4AN4G5n5AX+nT2sB4IyhNAYNehyKASG9Ce5PvpTXAn5fjjiPXPsAwCvVlRWBZF+ApoJMRoOkOX46dQdSxCDCvxjj5qzpvNwDK/01qgKa1A5ozAOq2gKQAdgJRGwCI35y5/NVvukGUXhufp+P+zsCv8f9j9DmOAKO+t2+V4T11ojsYQ7YEgIPHkwVdWuClhaL+X3cTCM0xAGlLV/cctSAFpCF+2jl5vYURYGexRgS4TgRoFQBpji87j3O+zvUyCEOSAhAbQQgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgA0EXpH3uMeVj+uIEQAAAAAElFTkSuQmCC\",decor_pink:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALYSURBVHja7ZrBattAEIbz9IVAKJScdMuxBHJxoIWSSy59jVJSYppDbqlIL1vveGc9GisFrVfB1n6BH8mRbIeZb/+ZHeUshHCG2hVBAACCAAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAKisbh3Cx1/h9cMPOQ4Ur1X6fNH5w1D2d/E+1f+utwiAJCcFIJ5bHRqU19tNkL89BT2K5gh0TOLX31ut1lvp96ni7/rr3XW9317HASprE9hPL0GC+7n/IsfsBjVAsKs/JfEm3A1AWIX7HRCa/KSL534HQTwCQGW5gItiwip/j0BlV7KubusKFgBzb3QncahmAUjWb+uhvpbjIV8cLTcF+vl72AbZ1u0K1q+OIp9vALjqww4G/X4Pws+/w5KAA8zgAGqvej5HDxBhGnMbA4DKg2HL0/IBsMGfkojS96Wkx6Bnq7UdeYVdQO4prL1rw+eSP9oA2pLQBAAlCdCtkm7pSnoADfYMDiB/kzZ1IwnPjeBYL2DPmygBXQrI1A/RejmxBOTgaz9Q0wHsXEG3m7a+qwPY1Z7U/Qn5PPcHTQBQugo375Et3cRt4N4qm2EXkLeBus/XvsPvAPS63f/b+1pxAAlESUM3FRxd6WnfnwdMuuOoOQnU2YJO+ezUz5e+sclhK5NA6XgLHUCskrn66TtASSKLwTnGYKSft14vGwCtgyVN4MJtshkHkGFISb0t6R0Q/w+AjgEA1wn7R7/2sXCesL11fvm4lXnGPujwKRXH7QBSAkySZFhj9+ddmo8fWjbQkZYAP9SJtd2uWve6hUlZWwD4hLutoaz22PXTAC7XAQYrepNsa/kCQze8Tl1fEAB7CfZAuAdGe46AThsASa4BwDeFkmxr+TjAwkrAytV0Px72D378rgAxCEIAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgN5B/wCYGoUPx2L+8wAAAABJRU5ErkJggg==\",decor_purple:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJESURBVHja7ZkxTsNAEEUjFIEEDUUUIUoKShoKKs5AgYTo4Fp0lHQcgh6ukJssrNGPfkYOwc5aBO8rHrE3xnZ2nmd215OU0gTqhU5AADoBAQABAAEAAQABAAEAAQABAAEAAQABAAHKcj49S/O92ZLj6Tw9Ht035O0S53f8OneHNw15W/vXB1fNdj4m7+fP3KbjqhTAO6ytQ7e5qDpc51eASv84iaXg5k9d2+9BeJt+Z24jAwwQmNzBMQilRPBzSTIFWG1rmZx8Y4IiQGE88CVTf5sI/nRHAd4f3tLr6XNa3H4s2/L2y+yp+U5tlIDCJcCfLmUDp8QYwAXzUqP7/zELBMgAA2QAH3gN1dEuwrpajwBff7zOdXkC/dgu/6fA64n3gWCJDveBn64RA7+SBULdr04ABaFrCva03WWw5IHw7SHHAJru6X49C8VMEWcMVZSAviNedVTXEhDrf8knzuv/5f7Fyrl1LWUHbfv00MWoZhrYt/P7iLNuEDjUGEAlwQPsi0FxTBC/R4BfBHPbUXpJEeJ524SLbW37Q01Pd1KAvvVOncm6+j8XoG+9q2G1jBJQuATADgrQt97VUCdZCYTxCrDp3Tnv1ivKALGex0WeOE0r8WIIdlyA+J7ABaD+VyCA78eAMwUcmQBxMSgu8sSAa1WNjhyJAHExqC3gURAEqLwEMAYYkQAxwJsCTgZgIQgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAP6CT67j1Zn3kJDXAAAAAElFTkSuQmCC\",decor_red:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKcSURBVHja7Zoxb9QwFID9LyhiR50KQh2Q2FCXdmDhhyJxVzFUuilLpExhyNBMHfsnTF4aHy+PHKp9Lrrgb/iUc3KJe/bn52enznvvoFxoBASgERAAEAAQABAAEAAQABAAEAAQABAAEAAQIC+3r997oXrzwfs7N372m+FSJZcz1SPPqt1THdXTMdQZ6v9x9m4s62vCZjg/+xtLFKC/vPYPH7/sG0HKupGOqbR/+9k3BukkOS+ddvQPG54RnilHXZ/+/PP8anbU19vp2MlziAB5aVVD+60bG3vs+E3GCFC731Jt3R/C6U5vVGc3S3IiQF5044aRlrXzA8MzOzOqW1VnONctnBfuL27KFSCE/DBX2ungWAFaFfr3AtSZI8DdfCpojAh21LcHRCACvEAEaE043s/bOSRQ+cShMB9GfmcikRahL0UAndTFjG793ZjEcDa61CjNugqYcgBdR2OSwXZhKloq//cC6CXP46evz/7BMjWEpdS4lHvmfSEBm42y6gVygMrNRnnzl062UaIvbQqI7cRj7rPLvzBKs0qwUTnAlAxq6fR8v5QEdsXlALvEJCzhvsV9gNrlWw3Uh3OAXi0B2+lzt7AsDOW+pAiQ8mNT7tM7bzLqv7+68GHnLncOMNaxdbNdQDnK1LUbkLr1buC3aVrTK6AyIoA02C6hA1Lvg9MSQEZxyhZv6n1QcA4AJyiAzHcpOUDqfcD/A8ApCGDfh9vXvodeCwdk9NsMW3/fvmun0U84AthNndgyrH0KsAldbBnWHwF0QhdbhrVHALupE1uGdQtgN3Viy0AOAGsWwG7qxJaBjSBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAPgX/AK33ndmL+leXgAAAABJRU5ErkJggg==\",decor_silver:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANwSURBVHja7ZpNS5RRGIb9O5nmZIbkuGgRBC1ataihMrUy+hiSokUbceEIQRLSByr0ASO6cTEQutCFIOhmtoK/wT9x6n7snl4sWuSZhXotLl7fD855Oc91nue8Z+xIKXXA6YVBQAAGAQEAAQABAAEAAQABAAEAAQABAAEAAQAB8vK6cyDdvTCYnp0rpxddA2msVA5Geg+OR21fbahttaf23YeuFdF7+L77Lj6n+wIBcnXWcdDf/v5+ere0kRa+N9Pi4mLQjoGWZG6/uVAP9vb2gunp6aDRaASzS+vxPlNTU8Hj9xvp+Zdm2t3dRYDcAmhQNeBCwZmbm2vNPs3GHBnAGWZ+fj5Ynz1ge3s7UPBnZmbS5uZm4PfRNVH9sB5IVgTIFHwLsPLwZQyygqBZqcC0IwNIpomJiehHgZR43x6MB5r1CrwD7kxRFEWZQu+KAJkpCuABdwbIIUKxnjvVSwBRFEBMTk7G/WKp0Pu4VCBAG9BAj46OBp5pStm5+1EJcPuq715zqCQo6Kr1y8vLaXV1NT19uxIp3yWhmBkQIDOq+Qr+0NBQa6Zp5lf6BrN8BagtZ4B/CSB2dnbivgQQuo8AbUar68M1WGk7dz9q04s9p3xnHvWt86/D1fTx3pNUr9fj/NP9arC1tRUlQ++KAG0UQGlYAfKMzZEBlPrVjjKKZ7pTuzOPBTi8KFTNF1owCpUFBMiMAq50rM8uz0wFrR1rAC/uLIJKwtraWuuzzxnC+wR+XpJIFt1DgMx4t82rfqVqr9xzfAWoDe/meW/B6wJde9V7OSjuPvpY3CHMtTOJAIAAx2IwCptVfztHAEAAQAA4SQLc7OlP17t6053SpRY3ui8G186W4vzWuf50tbMnrmllrOeNV/C+rvaMn3cf7djsgSMKoKA46FfOdMdR57peH66mSqWS3nxupFqtlsZqP7+Vm81WYCWFgquj27EIkscCFaVg0I9JCXAgtT+uzRDLoIAqsAzeKVgDeNZqx0w/mDidM3CnaBHo+q7AU8NP6VeAgq/Uz4DxGQgIAAgACAAIAAgACPAfPCqVkxnvGgj0d/XXf+PoWHzm8DmBIwPAScgAxdmuLDByvtzKBuJ232AcdX2s53e2IHBkAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAPiDH0u6mtJUtilqAAAAAElFTkSuQmCC\",decor_white:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALGSURBVHja7ZpdixMxFIb3F7pCwYtFQbzwxr9WKRTKluJFob0WvO4fkMW1UvxAWIg9mXnLaTauzkyq3ZlHeJhJpjmJkzfnnGT2IoRwAcOFl4AAeAkIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAZVksFsFYr9fxOplMIip3tb9cLsNsNou2dK8+VCeszv9Wdf63gxTAeDwO0+k0Mp/Pg5V1Nbp0evftYzDC7U0I37/Ga4mJT7GJlf3Yn93X3G1vI/E+M54fX7aH53iAwmxGo/Dh8rJif39U3tPVvre1cfb9vfrdpP1n6hBAYV6vn4U31y+CXY1X70ZHdLXvbcn+y+unR32pLNLx2HO1H2wIkNs3FA6M7iGgdrOf5YJ3JwkBZvPg3r37r+uM6Ooz4zlqhwcojIu19vJ/fro5JIMlhOCTPk24Jt8mWfE/F/s1HhOB6novAL+im6zutu00IXEy4mrbVpNV+D9nNuMkK9nbX6sVv7vnDdLxVPW7YXgAZfxy900E4HcJTXIAH4st/p4qB8jFfOvPyr4uHY//7SBCQNvY3qbdvYw8oeQuIN0N5MiNx+8WBiEAi3tGm4SuaTufhMkVnyIJVA6QOwuwUBDje12fjufwfChJ4Purq1arr007f/qnU8HVahUpdRLobeuET8mhXdPTv/S5xjeYk8Aq822u9raeA85MAJYAPX/7JLRJuNq0O8uXUf/7XZkcAA/QXwHo1K+pgRIfh4C/B4D/JYA/ffbVPj93n3um7wayUfIbApzYA2jC/rasieZF9kQAaUKXHvKkW8W2W0c4UwGkhzpNy/DIBWCrOV3hqQd4yCPAIxdAeqjTtAw9yAH8is7lAA/lCNCzXUC6dcuV2QVwEAQIABAAIABAAIAAAAEAAgAEAAgAEAAgAEAAgAAAAQACAAQACAAQACAAQACAAAABAAIABAAIAP41vwA6beDBsiAlTAAAAABJRU5ErkJggg==\",decor_yellow:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAPESURBVHja7Zrfa9NQFMf3T+0lIL4MYTgZQygiDvw3BHGg4Kv6tH9D1OlaOqpzWsZw+CBDsBai3WPomrbDtBnXe87NTW7uHJiYjpp8B19yb34293zuOeeebEEIsQBVVxgEAIBBAAAQAIAAAAQAIAAAAQAIAEAAAAIAEACAAAAEAIrVqLkkvBdXhPfulvDeXBP+21UW7Sf98/1fO+petI3aXmNFDHeWhbezxs/WzzLP5d8gt977daXovEoCQC/uv3KUoYwBK2JQ/N494bs1MQ22xEnvIbfJMEW/HP1Wv7Mom3ti0Hsghi49oyX6vaf8zOB0P25Pg7psPxEjd0mchV/jNl0LD1Cw+sebYtBd5cGlNhmgKLhMD8OzuuOIcNJkAKhNxh30NmLj8vNjSPR+V/R/bPD5BAwAmBEAZ2FDDvp9Hmgy2Gw8AAFwwIbWxiVDKwCPeKZrABLP9Fm1GYBv1Q0BPIDtOyp2yphIMbKoEHDSrfFspDYZhmOzVKEegMKWvDcBQB5Az3pt6GDcMva7sdGnwUH8u2g/PEDBUgZYjwd90L0u/A+1wgfa37/Ls1t7ADMcUD4QjF9KD/BMwnhbtj/KfOQRewbKTSoFgDnrsszAvNfpuB+cbsUxOE4yC0gGOYEl40uoFADNVKxXM32REz8KByYASaKYhIZKAGAqS4zNc52ejZx5R+1ZeAD6TWRQDYCa3XXO/MnrUDuJ9TLx+/mYz5/8+hQB4FRnFZB3Da7jbdYkUAHQTgHg794Uw9aNwnIA5QGceNYrl94yjHsUewMNgJ71ySqgKgDIwVEvnDHOymvUwP79NeR2VbbdTpLAxsrMVgFpANw/ts2E1D6nEgDwTJDKegM2ZsbreGZSjI5m/Gj7alJwku3CKo20qpD3o3qAfg49m2BjyePD3TVe5fBWSlcPtQepTCUwnGzLzWGOl3XZlaKu/p8DwJWyHB4gr+eYy8GI/i7qlzsEdJxLywGgkq0Cyh4nUQmEyguAWcixP/van4IvOsaZtcyo6VsBZdR6TR9/P4hq/PAUc+4B7KKObTT7QxAZmJZMGMiyAGAVg6hvJnj2cSrm5EkcoTkFwF7Smf3+8ea541QEolIuBrI0SeBhqvQZTr6k/iMmGNdFONkz+s9TfajEHkD3qWBkFo/MPlSCHMCM+XaRx+4Pvi8jBygTAOeyfKvPqwLjY43+d2oMJApBEACAAAAEACAAAAEACABAAAACABAAgAAABAAgAAABAAgAQAAAAgAQAIAAAAQAIAAAAQAIAEAAAAIAEACALlO/AVzm8hvyIMv6AAAAAElFTkSuQmCC\",trader_llama_decor:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAADIUlEQVR4nO3ZP0gbYRjH8W8kQ+EkkQ4KdnBRMWARVCzpJIiDFKQUHLq09s/UBgpOhXYpVNoppTS71qmbkCIOomQytI2FgBCpdbCgUKcmeOAgvB3iJTFU612iJvr7TPfm8r7vkee9J8+9ByIiIiIiIiIiIiIiIiJyMfnOY9JUNGTW0jZdPRZraRuA0QfXAAgMJqtyTblE2ADEp7YACnN19Vh09jbx4/sfOnubjh3D+U61rqkW+Y860R6+Z640BgBoae0A4Pf2OgB7uzl+Jmc8/yhPl+9iZ3cYmI3R5ofN/fznb7dHySUwlf7guUTY3Jzs43lrnKXZX7T5YWkWvt6IYNnNNKaD7NpZGtPBY8cpfidZyeXUtCMXQGmAV09hYivYzNcbEZ6MLDL3OgPA9MgigcFMxXdbYDDpS0X/mLU0tPnh1ssQ4/NDWMFm4CCw1vHBB2i08gvlIms4z8mtYDPj80NAPkX3T1QefEf/RMbX1WMBHAo+nDywJ10o9exc/gJKPW+Ns7ECnb1N5BLhitO/w6kB5g7m+GA/LpxTBig6t78Ax9vtUcaIEZ/aOpUawJmjNN5OYP+3CC5DBmgAGLr/3jgflB7/j9d+paZHFg8dVyMDBAaTvvJxSykDFPkhn9q7hyPGOT4pr/1Kjc8PMUbmVGqAVDRkNj47NUDxnDJAUQPA6kLMt7ebY283x+pC7MRB8NrPYWd3WH6xAhRrALdjHCWXCBvnOX/5xQp2dqdwThmgqPAUsD45w6exb64H8NrPzu4w8CXGuztJNvfzGzY3J/uqsgicGiA+tcXmPry7k2TgS6ywCPQUUFS4a7uHI6altYPFj89c3cle+v1rJxCq+yjozFE6tnYCj5GKhoxZwvXd57Wf1JhXVzEPA+4D6bWf1BizhElFQ64D6bWf1IbCRtCj29Dmz7gewGs/EakBvvbwvTNN39V6hyCnoHs4YpydPS9tqXPlBZ3bttSfQ28Dr7+JHLz6feapLXWufFPHbVvqXPmmjtu21DnVAJfPoRqgfFPHbVtERERERERERERERERERERERERERERERERERM7CXxvg3VtX6I8jAAAAAElFTkSuQmCC\"}},Sl.magma_cube={name:\"Magma Cube\",aliases:\"lave slime\",behavior:Ao(),entity:po(),model:go(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:fo()},Sl.mooshroom={name:\"Mooshroom\",aliases:\"mushroom cow\",behavior:bo(),entity:yo(),model:Bo(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Co()},Sl.mule={name:\"Mule\",rideable:!0,behavior:Eo(),entity:xo(),model:Nt(),animations:ji(),thumbnail:\"data:image/png;base64,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\",textures:{mule:\"data:image/png;base64,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\",markings_none:Gi,armor_none:Oi}},Sl.npc={name:\"NPC\",behavior:So(),entity:Mo(),model:Ro(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Go()},Sl.ocelot={name:\"Ocelot\",aliases:\"cat\",behavior:Jo(),entity:Fo(),model:Ho(),thumbnail:\"data:image/png;base64,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\",animations:Ko(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALqSURBVGje7ZmrTsRAGIX7JngkrwF2PQkCidl3wPEACB6ABEUQWCwKTQgCg2RX4EjJafIlh5/ptEsvNLudZNLLzuU/579OtygSrXxZluqvN0fl6vak/HhcVp339GKDxhp0rc062qNpvo9tM75TcyHvzg9/gHcyuhCg+Z9v19VVe0yKAG30fLWoNrpY7P/S/F8tQIDVIQDryhGgceuny15k2EhYAYdtBI5u0IUAgXYS6uYhBwpBKYNaAmbqGurTAnArrjkg7iqDWIBrFabVXUjexVjgMaEpLgBeXSbtwTVnAXXAeyPg/f64EgagFZDyq9w7O6juddWzj9G9NtfcKJDmaIx+k6kqkKo7Aep6pzF0zdE7LEL3IkprOFGsSZDuTADadRAx6PgzAJ2IaBUSUiAhIkWA3otQXbE07eMgITyS7PL0YgFoksCSMrUYEJmXSm+4j2tZQnsQxEIAzFyAo2WXIWaknOu0bhQ7Md+nOpoCFEJGAlxrgI1ZQO8IbnE8saiuAPP401vkZ9O273NBCx8WQGkN7XN1AtA2GoYAtwr/zUmZJAEeB/BXhI4EeLzAdRjvKTLXOwPHLD0Fxnsf07SeBEezHrTcBbwaJKBhBRF0MZXWthZH8x7EBNKDIAT4eYNxZICmCnGyBKBBSMD3UwRAFv7tVqeuOaOBcz9HqFgptjkP4MteM7j/exyI6c+rUWLAKOBjrc0z/ulCxnK4jgDWEMiYBimSqPZivYELoIRBm2sFYXiO3wC8Vqir/b0YYhzExVJYJLCPr89vgx13c+dtbaxnXfHR1AeRJgKYS9kb3cCLKI8DHJSYPzgB5F5dPXenDjipyq8uWKLR1cNpkoBYSnuZ7ZXpaC4AaHeJCsCGhQjBzQseJ4CawE+CXgABfrQs4IDxuy6nLXzaD0JYjmcAfidIciz3Y/S/ZAGCVEyNW9siaLHvvdiVNupX1ym2mN52hgDqbw4i1AA74f+pf2zafKmd29zmNrdtad+BhmvVyshO1wAAAABJRU5ErkJggg==\"}},Sl.panda={name:\"Panda\",behavior:To(),entity:Wo(),model:Zo(),thumbnail:\"data:image/png;base64,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\",animations:$o(),textures:{default:\"data:image/png;base64,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\",aggressive:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAG00lEQVR4nO1aMWgcRxR9J1TcLjphIblY21VSmMBxhXCXJjExKlIYbFQLXLk61B2uVKsTIgFVBtVXpxAOSgrFhTERHAdGRVLZbKHixEncbncpnL/6+/fP7MzunYTBD8Rpd//OzH/z9/8/f6aBLxdTT/mGdnNhBgP5ovGVgNsewG3jKwG3PYDbhuoZJfb396dRFAEAOp22UW4wGAIA4jiuNJhut6uNx9fbe2HRRchFeXo+GAwzeQ6NFE1OQxi2sv8nk8vCvSBYQpJcGd+ndzQ4fwJlytvkTBbhYilh2EIQLCEIlrJrQhAsYWXlLprNICdDz+iXvxOGrdy1kwWQUsvLd0plx+OLzBIINNNcYdfZl+CKNZtBdr/ZDJCmSc4aOCEACkRMJpduBBDG4wsAOhH0TMJl9l3JIKW54hym+8C18kRKklwhDFtuTjCOY29HNB5f5KyAtZW75v7l4cPvCuMJw9aUBs0VTNMkdy9NE/U5AKNFJMmVnwXUQR0nSOBKJ8kVgmAJo9G51QnanCPg6APqouwzKCOClKVfIO8D+G+aJjl52Y7EXAmQYdFm/iZMJpcIw1Y2eN9fasOERr/fn8pBuHh7X3AnKX2DLcrQe/TO5uamk99yxWLZAACg3+8DAHZ39wAAx8e/5WTH4ws8fvwzAKDX26aB5togeRkmy/peXr6jhlbA7pxpzPzzIgvkGedCp9PG8vKd0lmPogh7e7sAkClLoOu9vd3S75n66nTacO2bnrsmY3zMtmsAaJydfZjKAYzHF1mnjx59D+DzzFID29u9zApo9omcOI4zS3n//q9Ce1ofJmgyURQ15MzTGHmfBLIEDd1ut1FwgrzTdns987C7u3v4+PEf/PDjTwCAo6M32Nh4gqOjNwCAX349wJ9//I4HD77N2mq31zEc/p0RZfrGy8y/jLzR6BwrK3cxGp0X5MqwYBLkyhPW1u7h+bOn2XdOyvd623j+7CnW1u7l5JvNAO32eqFt6o/3K++Nxxfqc+369PRd7tekk4bcYoh3LmNmmibY2XllbWxn51UuAwM+hyNNYeDas1PWKOVMz+V4B4Mher3tnLwrFkwvnZ6+w2h0jjRNMuXLHFwURRkJaZpgNDrPzYqm3GAwxGAwRBzH2f/yOUG+w7Gx8aTQvpaKSyySsOZh+eBdGgM+k/D27bFVhhdOtDDFr6MoyggizDIXWOSdAHqoca308LZs7fC2tDb5varVJVdUYrLK6vAmEEVRAwDu3/8mNz5aH0hMJpeNmRVFbV5au55Xv5ryQL6QQn+rq9G09mJIhiqK3ZqMraDC358FPn36F8B1SU1D7XqANqu22M3vz0pR2Q4Pw7wERpCfQi0CtNn2gbSIOqRQW6QgV95WFKlEQN0ZdFkXuKTOmsxkcunl2G9tZ6js8zHlHfK+TJl9UZmAWXt12V6n08bJyUnOgZ6cnMy8cFPpE6BEpyoJMh3mSnGzlkUQktOijWumKlHZAmx5uU1eXm9tvVDNmkCFE5lZSuW3tl74KfA/KmWCYdiaHh6+zt2jAZrSYHrGwQdN7flUfTiJgL8DBCoSAGBKYUYS4QI2YDVWHx6+Lt2F1mb8RgkA9ETDFdoub11UIoAvbExORVZ45w1ex5t3uT4jQCp/00qb0O/350pCY3U1KixtDUvHmXZsgvwkTAsZCdvOMIcs2alhUB42uCnlZV825WmbnO8Ou0ASpVoAULSCmyBBnv5wgevMA/ndZfrfmAjZTlfMC5zkJLkq3domRXxnn8s7+YCbnn2JMmvwsQIgT4C6FuB761J5udXkW7TUSuubm5tqUjRrxYGiryhYgMnsJpPLTHntYENdIky5/Dx8AXBNhNMnwFNTl3M/ZZDK87ZfvuyqYzAR4Rv+5DkiYxQAgIOD/VwSQgsduU9gOgEiIRXXLInaJyJcUDUHABQLODjYzwbCoRxOAOCuPIfmB2wbKTYy6vqBxtnZB9UCeN1NGxQHJ8PVCiSBvocftLG6QOqzaHvZRXnAzQo4OTblJfE+43OBbK9w2kLr3HToEahv+hzSClyP5rrImuQKq0GT6QN2P1A1EsjoQueGZgkbSaoFmBoA6odBkxWUzb7rTPuilABZwTXBhQQXBziPoocGqixbq8KyOiv/j+PY+bgrfSZ0hoDLc3LntYssQUQ7WwCHdtAB8AuDHJT8aKFwlo5Qg5UAzfxt9XfbqtG22tOqwL7KVCXBuDOk7d5ofsB1qczlNDLqRoGqvsPJAgC9Fu9bJ5iFFcw6GmSpsDz8zFG29VSnYMJJkSTMKyJwEq2ZoM+emysJLqW1OkTYzi7wiVWjgK/iVWfetb7IiXAlwfcT+Q+Wme0mFX8F9AAAAABJRU5ErkJggg==\",brown:\"data:image/png;base64,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\",lazy:\"data:image/png;base64,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\",playful:\"data:image/png;base64,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\",sneezy:\"data:image/png;base64,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\",worried:\"data:image/png;base64,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\"}},Sl.parrot={name:\"Parrot\",aliases:\"bird\",behavior:tr(),entity:ir(),model:rr(),thumbnail:\"data:image/png;base64,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\",animations:mr(),textures:{blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJTSURBVFjD7VbJTgJBEB01RhGG4QcUQXAJbif/xSOf4UcoakyMRxU/wC1RTxoPuMXEs4p4cbkIiYmJUdP2q6GwwWZYDEw0dlLp6h5m3ptX1W8wRJ3D13tF4Q+nhRm6rvcxwqj3RqvvhghgRmhJ9h8Lc+BE+AdPhSeYEJ09M6Krd9aZAN4I8XpxKHJHe44KMAlE6fD2bVJYQ2eF3Ixu09oTWi9PAHIGIhnxcr4vsqldRwXw23IKALArvEEzAJHzGvM3AniYYRiFmnLOa7XmnKuhqoGA3CQ5gKXsKIEvPG+rEZrTE/h4aKN4v2+lIDBZR53ElQYAAdzRPV0ggBmkkH8jwG/KAVDMTKJRo+ZTYFkWRaW9HxEorSerwkAqoG4PIzCeK5K6JgIMyE3IJKLRaFE4EfCPPsmaJ+sjoAIjvMFLWtfqlN7QWvUE1KPGOUqhElGbU1u6saywRjLUtPQS0gGxRjmgiCOBwOitDTicD5yKWJoegH1cxz4RiOnVwHVYLzufL7Jlk5H7IOFIgEyGgdFweWB1n3Mn74fxAJhdj/JIquw9XyWQzAlAysY5f0ioKWXO++V8ge0WzYf6I5iMar96AvJDATD2apaSZSzd1xKQwJ7gapHjdfas5PeSzgRYOgYqlbEgZ/6aa07ouhUX3SxHcmnBHQKGMqoh8WaaNB/sTIjJ+KJs7HSTCdy12Mlju4gnl4Qx9dzcHoBLqkZln5jEFwGcWbwNHMvQjIY3Ic4ugGA0rhAACAwDM+RyhQCTwOfXRQIJ+UdyufkEfqUT/hP4EwQ+AbsOJLrS9GU1AAAAAElFTkSuQmCC\",green:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAICSURBVFjD7ZVNTsMwEIVHcICeokfjdwECNkWwBDWlFRuqqkBBYtPCFSpaDkBI98AZkDiBybM9jhMcV0lVRUWMNIrtNH6fx/YriZLReiWZF1GcIZWdRpT+sjNTAHgiXXE+JhE8x4ATElsBiY0mie0W+QHkiuL8/nqR6asAQyCzcTwime0pmfbpk+o3RuQBiMt5OZsPAHH8Nq8CEGwMlXBDt01/6ADAZESJMNpcDbyz95zbdtrVQKLcSIih7NiC3c66BNhpr7kBWJwTYthHV4nnBQQhvNlMAPAEFNq/AfRKOeVqQzIQy4rCM9dqNZnzxhYCyO4nV4WFbEHXGOL+M13qQgBmK6Lk0KFfr9dT6QMYvJM4vC0LEKVPe6Bhijrl0aAAQOqqhcnVskHsw+mKuw8SPX1o5SImqo/tQEW8AH1tKN1IJSa4elMTYLyv3wEA467Ae1gvO9/Jo4LpaggvACbuWsbDwvY4t33eD+OBMLse2mfj/G/MKMhleSdk2vxHAiC0eTzPF9hucfiw/0iGse3XCYA/CoixV3MpuYzZcVdA+OAm7Xj712os70aQTQ8xFsqWkZ/8rjInrNyKUx/HMX3oVQNAViwCsboARQMuaRsVbgVuiQHAncVq4FjkiKUfQtxdCMFoKgGACAwDT5SrEgCGCMIKAXAw9voVAKykE/4D/AmAHx69d+4Sz6VbAAAAAElFTkSuQmCC\",grey:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFzSURBVFjD7ZYxjoMwEEWnTcUpOEHqPdVWewFqaJBoqGki0VHQc4ccIE2KtFs6+Q5jDQY7C1hkE2UkazyO4b+ZMQRSC61pGlXXtVKn/X0sNFp6IcQB4QPAnqqqtE+SRBVFob0foL8hLtIZuuz8ZfZpkAlxCWDH6wGw7wZhWmEZhFiM5zIeAeAHIjIAmHN2DGNKjuz7CtiVYI9yY0CM5zKeBPj93hkAzAfCMw29ln2343ELRDZy7ipxKJv9FERRpMejtVUAdi/TNNWehaTg1BpM9nk2AMRxA3gWh4/jeDB8AFmWqbIsw1ZgySH8M4DMFOJt244qINddoshcPnYy9gLkea5F4GUFXOsuQ9khyuNRG0geGojAI0uIwLvWXdZ13aACiDdrAWcrX7287qpE0BbgDNhCiH0HMngLNvse+BcAt39MOh4OzwEgYWsgXhcg/Bm4fwWRuvwMsmN7fwAt4oHYBIAhng/QV2LbM/CKb8IPwFsAXAH4QC8i0nscswAAAABJRU5ErkJggg==\",red_blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKKSURBVFjD7ZfNbtNAEMfXcZ2kDVWeIi/TZ+DCEyAOVHwdkODCCYkLqnpFQuIAQpwQF0AgPg6IZ4CQxHbsJk2bFAId9j+eQW5qG5JCLBArjdbrrD2/nY+/FUMLjp4xFFiLrO04zqKvIbPog3A6dF3aXVlhmKwRCuCgUiGzsUvuaeK5ECC2D+zXanTw/jkN3zzJBWjbfX3ZG2UA7FWrDBdIpPoSKYXKBRh5Hm8Yv3tKO68e5wLghTh5VxzMjmnHoa/dSvJbv0Y0aNCXT8nebz33OADCaXCih1s0enCbrzvWAIQQaq5xjTmQ0B6srfE+rD83Gjzj9OZsQJXLY6LAI3Nxj8z5AblXJgxhzvWzASaPtim+d4vCuzcZBCHESWMzf6kg35zzC6Mf17zeHPJ8DKAnJ5ysrrJTAH2U+SRV/tu7oNlssv3s3okAepLfWOoAa9+aOko7zLqnLZgO9dwAKLpQTNetVuuIFQHgALWr08UAAmkv5F4rHwU5z8D+xvU5ItCRgvOlpeA4FgHRaGhL5nWF/oZ92qaRrNGahQC6CRCYg1QHqOaj5z8UtKVGCyJEw1MsOL7UDxSzEAAPtsUJXtRO5R5rPxUJgOWFHcJDYZUFBwoIGC3qQoCuUOL0sZwyTKmfgkQFABTVE6Wzyudc2mflO/QTqLT8ZgLEM3nX0CE143qd76nlFSSqHk7Tyoc1S3FKfjMB9MsFh/pBUkVEBDDDECX8XpoSli7FRx624/6NzXIATGr8CsR0fT2pNcfQ5JpLh6G3ZICOfFF9j87c2bKFOVpuDaAbClPw0lY8ThPIPDv+eBEqAFqsFAA4eSEQ0IRSADBey6e4NIBn1tdb/JFYNsBfqYT/Af4JgO9WgE9hJVHQbAAAAABJRU5ErkJggg==\",yellow_blue:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJXSURBVFjD7ZXNbtNAEMeXvkCkSJaSIDkqsh8DEO/Ay1E+LoCqSi2gigoBcT4AkbQC2oScKE1bjlx6oCXHYf6zu8463RiSAlELI412vF77//PM7ljRjFausSdEC53rpN5enfU1pGZ9sPL8G1VeHFN56w2VO6/8a16eaE+GFN2uU2w8F6BU1/7h4LP4xAywaHnztUAAZtzCR/tUZQeAxGsDCh8fcNaGMj8ZgNNaahG939/NBUDa4aWGXn8KgMWqq3t6ZHGISozRBwBSpRS9G3wSccSSPv5CyUqi046ULyQ36VL7WgohmeC12BNYi1FSvpSIqI2jOy0BiJwyjDLQV7R9uCfiO18GEmPOCk9rEInuNqXm0b1WZoxv1TwAPQ67SkRlNNcCwF/3p2zqU1AoFMR/NncmgFLTbMYxt0KuoG8OVuxSptbTAZijiB3uliSO44znAmwTLT7ozViCvrMXXJ/CkLHFhx9/HcAeNXcDWpC0DPXRmO2KQ/HiDlGwSfrocvYqte9yjXIgI7kAwZauPbWV9r5KY8zjftDRAEHbD4D7tvOFpvEABvOAyM9AQiPhngPRNRANI94xoB4AiI13PMSXuY+MP+PthCL2jH3DCG+Y655KfyzSF1jIB1A1/R+bD/WHWxi3/3sBwieHInayrOh4WYsjHq5w/FSd+rn4AET4fpdbbkN3PvYrfI25SSciBcDLIWYBEGO0EKGbWh7n1gnn3oozD7M111fnA6AcOwvE+QX47XsAxwhfExzdyHydtYsPAJE8iL8CYCGKX5f+QYBz2Qn/A1wIgB9cCuJWPKWjMQAAAABJRU5ErkJggg==\"}},Sl.phantom={name:\"Phantom\",behavior:lr(),entity:cr(),model:pr(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:gr()},Sl.pig={name:\"Pig\",rideable:!0,behavior:fr(),entity:br(),model:yr(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC2VBMVEUAAAABAQEIBQUCAQEuGxpqODUGAwO9fXmIVlJmQ0BePTotGhmIT05zRURpMDFYNDIzHh0KBgYxIB8rGxprPj2gbm4pFRW7dnCQVFNePDs5Hx5fNTROMzFELCoQCgqISES8d3JeMTBsREFbLSqfaGTJhH/Hg36+bmzGgn27bGqiameeZ2RcMC9uQ0GSVlWTWlctGxrIhH7BgHtqOjmmbGiLVlR5SEacZ2ObZmKRTUpCKyk1JSUzJCOAS0rIg36laGS/ZWC5Yl65Yl2pb2t+S0mnbWpoNDGXV1aSTUk0JCQSDAvZlpWRX1uKV1PbkIqKUE/BfnqKSUXRhH64dG+4amm+hIOJPkB3Ojbako7ak5HReXeKVVKKUVDAfXm4YVyNWlaOW1iLWFRuOTiKU1GKSkbZlZPShX+KTEmPY2GQXlrTiYS2U1WKTUu/e3faj4m3aWfXkpC8eHS9eXXYlJPAgX6eTkiKT06KUU3ZlZLbkY3VjYmKSkiJQUGKQ0O9dXO4cW2OU1IDAQG2dnLYjYfBf3yQXVnWioTEgXyhamakaWWPWVZwOjm4b2yNVlSKTkzWjIfDhoS5bGqMUlCAPDvMzMzRb2q4ZGGgZGC5dXCtYFyiXFjUh4G/fXmUY1+YXFmlTkx9PzvHg33Re3i4dXCqameKRUO8c3CJRkeTSEN6QkHYjom0cWymbWmQVVOpT098Oznkra3Pi4jQdXKfaGSgXVuNS0jOjo3ViIK9goC/eHSzdG+wcGylY1+dYF2TV1WpVVR/REOFPz7BnZrUmZfEg4DRgXzMgHyzeHS9bm2yZ2ajWFOhTU2OTkyfSUqEQ0CysbHDoJ2Yl5e/goHWhIDNhH7Sf3vRfnqzU1OFUk6qUE6VTkuYR0ZqQj9/QD3LxMPEp6XGn52sbWmwa2e/Z2OrY2GtXVm3WFmWVFCAQT5RMjEVDA24sbHhoqDYnZzBlJGukpClfXtLLy0bEBDS20Z3AAAAS3RSTlMAAgoDWMMH/vx2cUr81sNrSAw5NMa8X+XHfnxzZl4U/OfbyMO56ujo5+TY1tPMy7RR6eff29i+trWxVz487erq6eLi4ODd09HLPRet/VYuAAAKoUlEQVRo3s3ZBZfTQBAHcNzd3d3d3aUhKSmFoyl2hWIFiru7u7u7u7u7u7vDJ2BmdpctpEgo9n8PuPKO5sfs7OwWIvyZJC5ZKX60CP9NEpecAqn4v5AS52/YcOOUKRsbNsz5P5AS57/aUOQ/ICXOXxdyZSFpFv5zUuISdQbNqttiaLt2lxY2XHik7hEgXa2bPH6kCP8kiUq0qwMZRD+329YCazULf/43pETFCSLTbiiUCnyMFOtvkogTQGkQFtZDvsJVhGT4m6REWag6TNGge23IPyMRh0FQwTn/kETVIQ6leW2Z7nwBGwSQkqf+syRZHVO6M0cDJHJSC5xP2f8kqUzS5g2+5oTRqkmOtA1tgXPpT5GI0wkXCR8q0nwlPToskNOB/V67FjTDGzJSwt/PqZmUCA3w+YLTswWO6QZh2NGC0xqm4yAS8QrRyVvh95AixUrDD6bSxOnUc9tKqoTgQFp34DzOwcCAxOCBQh7Io2K/g5MBT4FokoOCbT26f5/TgnE4iZXo0Vw1SeicHINaYPkLxZQcFPyA07MT22S8r+vC5eT4nnAVQKFy8A1X8qaVHJPNxKGdx7INf2/HHkVBUOgc3M9i/g792erQPgwY2MhB0NioIXBiZuMcTBg/P3v+ZHVoDIksGK5QDI896u/l0IvvcsYBRyRMcGw25LiMtnYJCp0jX/T4zs4KPGYFB6JQAwmQdU5BMXHNHErPFt/e6D2amzgEMhjoD3B6hMnj3cwJC8IZ0vTXQQljZhUcsVXkKjQIeCL8+pOcVsCRoFA47GgII44gySfSt4lWDs7h9SGPywSyymlAX5kjnrhyW90WYqNjJRuYOBJEHOugQoJDHnoRlENph1fBow+JE5DmPSQnAKRSvBZB9cZvoC0i2od6x8wRGXR5cf/+giPTfRhxZJpw0FiP3SqoXr3xW+kB5pjv8ON2jlTV/qZvGP81h1qalcc66KdIgqO4JMjMkeXhoF7oWRLPCqgziToP2xCEJBeSOAPnNFYkyMSRacx3GIGW9HZaAmlaZwRp2mGokhSEBeHYbBJEQ0lyTKBw5BCoj9MqCEgI6kwLJwVhJo4EiTU8TBwzqJunlxoCCDKYCoUk0cQNTBwavwTinGGbbEHTZKzd/usgv5tEBEIS9hINZ8k5xjmsNdQ1+vc5E1VvKCB9EZIIRBkM7R1Gs/IzpyXnUEbqg77HGTmRbXbvr4N0IkkQfLWBSiA4LRHEOUMGrvwBB9PW21VlX3h+BYQk3xcgWLh2kkMg5tkz9AccimFIDoImZbYCejECRR0liL66OKx1O2jlltwjQDMbbRz0zd5RGCPcBfdEip1ytn59S6ABA17sRBA5JAg2HrSy4EhQoxkCYDosXJyjBIKWOCdZBg04dy86gkgiQW4bgsThbQKZzy4X5wSCejt/CTR58lu20xDEXQQSnIl2CQrOQRDniCktQdUSWgDdfomgg7rfLUF0us0W9RkJVywTyMRRGjfhHNnSAnS6XMyfJ+m7br9CkN5vqVuCMKx/mmxx9jaDzJxWuKyS4wUOgiatqw+gOoPKW9n2g+/fRZDDsXQ7gTpG385BMA57OU2gYBzeZ5zTq3dv8iwBDsS7ao1qBeTWxh/qCCBI3+0I0hcBCUGwCmZQcI68JKpt++CfoYsHgZ7bVfXnQaN1/fCh9evXH/I7KH43gHQkwYI1JdCB4KDGghPAY73DQU4ngIBj91gBORyjD78B0OsGR48jqJ/u9+sUG4GWTao//9ugQA6GWhlBfTho/1gvgrp6LYAcPlgyPE/bAQlA+sF70QUoHDzfBJk4SjfgIAjqQyA88xEEP6yBNG1Y6zqMBKDzkye/m4agVl6nMxDkOkmgJhwUlCOzpZdLMRAEsQySpMt+BF0Y8GEaXDj6BIJcbe2n2jx9Ao+3sXyfs9uvKL8IGjtt9hckBMEAV5QvQV47gNrsg6++w/F27cU4HTVfAMjT1gpof7MVi92fSS0Wr75/9zNoyZ0gIGC0+gYHZhDjaABq2iQcQMhRVWugZjenLuWkB02VEdrg9y8JBM8JBC1hoG7AaPUNDoCQg5kNvYYgTzeXlW0/tT2BGjWa2lfD2BQAab5Vtz+iAUHrzjJQr97OMwDq5vEoCArOUfvv9mk+N4FsCJoYriiWQCBZ1X8UghwT+vo+g3R9FQOdBQ4EWrq3E0FrYQVw/gTnTByBO8SPRzWBxoxkH52McAugRju0gY8R5DixYpoPQNP8bgDpCPJ0G2tnTUkntwQF5RgjV9H93E9H9WxbKxgMBIIqWQNBSSYgqFmzFQqAdH06A8EbIcgzlt1tDjDQEqZxfc0ZM6Y/+8jgZ0c1UIYgKNxQLIBi10AQkpYiqNl1AOH7je6nQBDk6cYvW+vq3wIQjIJvcAwVQEiaTqD2CoJajVFVCyAi5evrZqTRoyTI4eCr0o160r5kfv36BIITyszpP7cxfabtOB1Fox2jBQjqYwlEifiZNLD/qOsuY/No8Rek4JPGAkeCTJwRvhH0bVU0N5AAhGmvNIWdaB1EpASfSVDhzQ7HBAK5OGhsHyd5Dsy7hqBJX3LKFt6laQiKG6WWpiGJg2AOIcgIVxBkNQlSMNJeBNH7uQyVROHLoCjEaXOjy7x5cJYIDiVVwmhpKgMobpTIEdJpGHffCfQGNgQ1BZN1EFWJkSQIHuYiDoaqA6Auy4HGOZQ4ESDR0hQDTgQESRKBmtgam0DWqrR372OHBLkM5lk+r02befOuCVAfZ1vEdB2LIBkCdRQkAEFCAVGVTnAOgrrCYY2gPqeftAFQFwiBnE4EdfXaPUFA+/cOZKSlyDHPIesk8jSa2h4uEl0RtAz/DWHqUxOorT0oaEWzUSPY4Uoe8xyyvnDVAQQD3G5H0OkxtpEA0kdP3RcA6j2Wgbp603/x10lTFUDN5jIQcQwcmtDxEUJISgmau3O1DUATR8K48z88yUG9vew/MTCBIGrvwgR6sGYgnmWGisENGBIIGnIqgp6t0jQANRlps9HHt46rTgJo/mbYfCaQJCXLCKDFzUatgXY2QuYQSHMj6dliqIp7davGjaH2ixAE0U9u9vmUoCBJSlsEQM1G4bcBJ2JoGgLRttUp0xQFQTB/EUQBUFMO8rSFpjYnctqiDCQ4oYPoCAgACQyBYNyFA4juAQxkJiXLOIpzQk+qNQM1CpCCguA1gMbiPUCCzCTBCR3UbNQeTZCmQTkgbvbS7xagiSObKAz0h0OgZhM1kRE2ik4UP7Y5glrBxkOQER4jhAdZA81mC7caOUPG6EShu+nSjvCZthWA6K7850HUkADywSTpCCDkwKTG+P3ibkqgcNX4GyAiwSTxwQUbbl4wh1wqgCijR38GtWocrv41EJFyMRC7m6psCIwWd8mmMIX/LogW7jMob4HouOPEZRk2Hl2WDddfBBEpN4HyFogYAUBA6ueQd1Nq6b8LooUbkTc2zrfo4h4oQE2bNFH+NohIiZFDIEEiEHwk/RcgigDNHShINgzNoX8KWjGqPyP5+GWZz6F/k9yavJsiiKYlgjJF+DeJXCoXAw0cSGcZcBCUCTr+XyVilDwIWjyq/044ywz0JIkd4d+FSEU1eTcFzj+rjiSVyi1AUJ3/IhEL5EFQpv+gOgG9lCnB7+F8AuHpZ4zG5gt6AAAAAElFTkSuQmCC\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALeSURBVGje7Zi/TsQwDMYLDwcTEjMbG2JlYkYMiAlYmJjgNW7kSdCNSMwMpY7O5YvzOX/u6J2gVLKaJmka/2I7TruucC3vbvuPp8cg7y/P0V3aXk9PstL99osprneR2QFQmT0ArZsNACb/FjBXC0Aos3WBPxMEl9dXYT+3+701e1Zm/VXCmDC2J8l8Li/6asmNL21DnyYADAQqxWBQxXESUwNg39D6KgAyEL48PL+dnY8gPChYL/fwDhmrtEr9w32HshaAQRbHR0Gwrh4ATnJ4Ft9VCPvdXi9XRHYoyyVtqry8EwFYTaAVQPiuvusoPcIG5bV8c3gQAbDjo8QmZwBgnTXtxNzJO7Vm6gJgEFb10gchhG8T5aVPEcC42jp5C6QUaKzC4EYjFDRLY6IUQOGdCIC6rOnTBCCCYBUuBRpsgwniVoiTxclJm51UsiAkPrFxFYpC98Z3AeCgiR9mVgP90irujY11DACFQMCW4FYBYIkP+nfwq2FQvbOBPheLeCs0Zop9ky1zTcUYKBybCdu6KQA0uxIA9uGwSzjUWV8WN5if6zOzkJzSuWw2C0DKNQC0bYzEGQCYR1hLsEHOE+xbUt47x+h7rguoFAEME0lWlWxv6wCwcSMHgIHIpfHSX+6dTVjcXF7Lpi4XZDwAuALjeI4F2ABaCwBXXZXF8jcAiOQ5//TygVYA1gRzACTDUwBSngYArDyusDXpJMdfTWJKAD9hAdrmAzBKs8QncQuwiCldwM1RGmKAB0Dbu9I2Qo+5G7hAC4BaF9CFaQEwboM23ZVor9E/WnWwCt3q5L4OAFyxxKpaXQCCs7cLZAHYq1WhTQDg6nl5vesC9q9QJQAbH7YOIAmszklPzR5dwEJIjs5OHLB+n02FtwEg8nlyhC1ZQGQF5FTK4lc1gMl/wrLjNFE+lwnWQGDbIgOzGwDkj09JSQ+O+5MUynRHW7Xv5je8UbzmB4p3JHYDY+Vf4y9tRXXRGVGwpwAAAABJRU5ErkJggg==\",saddle:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAM9SURBVGje7ZivjhRBEMYHNC+APM8LoEkAAwGBIRhCQggGgUKdICRcTgEGDAqC5QlW8hBocpLkNGKYavYbvq7+qrtnYdnAMkllevrfdP26qrpmhqFxnbw4Hk/fvk7y9f277G5tn+7ersrwt19KcdxN9g4AZO8BoG5vACj5bwH7agEMZW9d4J8JgifPnqbz3J/33uxVWfWHpDlp7kiK9Tx5PHZLbX5rm/osAqBAsFIKhlScF7FtAOodqO8CYBPx4On5y4OHM4gICtfbPY0Rc7V2aXz1cmDZCMAkqxvXknBdPwBe5PRsvgsIZ4czo10Z2alsl7VBeRuTAVgvYCmA9F6MDZSeYZPyKB9duZwB8POz5CbnAHCdN+3C3MWYXjMNASgI63rrwxDSu4Xy1qcJYN5tLN4DaQUarzC50QyFzdKZqATQGJMBgMu6PosAZBC8wq1Aw220QD4KebG8OGvziyo2RMQnNS+gAHo0fwiAJy38sLIb7Jde8WhurlMAJAQBtgW3C4BKfNi/k19Nk+KuJvq2WuVHoTNT7lscmRsqpkDx3ErU0S0BsNm1AKgXp1MioK76qrih/BzPykJqStey2SoAK/cAQNsciSsAOI/wluCDXCTct6V89B2DcaELQJoApoUUuyqOt00A+LhRA6BA2LtuHpwbDy+ez8TqrL+1Dz5hCXN5lF1dLchEAHgH5vkCC/ABtBeAvcOU/Xz/QpLT4ztJ8GxtPwBQJK/5Z5QPLAWAF/cAsAwPAKzcCwC7DEWtzAIwVh5453mHvUkXOf56EUsB2Eu3bQGs6IfrB/OuQ6wOYAavtEp8Crcgi/hdAA4f3Rs/vnlexACZo0x9rK+NqQFQyjOEnwA6ztAoHd7EBXxgSkFpUiop1OkC6Kvmwr0fAO26RXtE/2zXySpw1Nl9EwC8Y5jfFLp19VK3C1jfBIGCs48BXQD8tVShXwHAp0mU10cuUPwVEgC6YsCfBlAE1uBLD2bPLuAhFJ/OLg5AeZ8H7NQCisRHfMK2LCCzAvFVqiBwHgDlZSa49Z+w6nNaKF/LBHsgAITPASDYiN0AEH98WkpGcMKfpFSWJ9q6fTe/4Z3iPT9Qok/iMDB2/jX+Dtu94fBCEpxnAAAAAElFTkSuQmCC\"},animations:Br()},Sl.piglin={name:\"Piglin\",behavior:Cr(),entity:Er(),model:xr(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Sr()},Sl.polar_bear={name:\"Polar Bear\",behavior:Mr(),entity:Rr(),model:Gr(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC01BMVEUAAAADAwMFBQUUFBRJSEWsrKYVFRS9vb07OzlVVVRQUFA8PDzR0cNhYV3Y2Nh0dG/BwcFra2R+fn5ycm5NTkpBQT9TU00FBwVgYFx7e3MmJiV9fXmzs6cPFA95eXFWVlM4NjMREQ8XFxWQi4O6uq0RFxG4uKtmZWNVUk1cWFRubmc3NjI2NjQHCgdGRkYuLCobGxoBAQHT09OalpASGRKFhYFmY13CwsK8vK+CfXZ4dG62trZbWFRfX1yVlZVIRkIPEw9FQz8LEAsKDgoyMS41NTMhIR5OTkkUFRMzNzB2dG/MzL5qbWR+fHq+vrJZWVIZHxmlpZm4uLhzc2ulpZywsKmKiokPFA+FhX2hoaEyNC+NjY14eHVOTk4+PjoXFxcPDw/g4OCUlJTFxcWPj4WKiIWAgHvZ2cq+vrKXkoqqq6QTGhOSko64tbKNjYXb29uQkIdxbWeMi4WRkYvNzc2Pj4bLy8uLioWRkYyRkYrf396Tk5DBwcHAwLiXl5eSkpDb29DEw8Hf39u/v7+8vLy4uLiioqKcnJGSko2QkImLi4KCgn2BgXzd3dbRz8rIyMinp6aTk5GHhoLc3NTPz8/a2sy5t7K2tbGlpaWDg369vbK0sa2Tk4qNi4iEhH+/v7WJh4MgJh/Y2MvV1MnFxMO8u7K7uq+2tqyvrqenqKGgoJ6GhX96eHLf39/X19fb29Kinpfd3dfMzMzKysa5ua6rq6mfoJuamZKOjYiIiYF9e3V2dG67u7nDw7jCwrSwsLCppqCenpV/fnlaW1M8QDnW1tbDw77IyLzCwry7ubK0tK+qqaKjn5igoJeYlo+QkI+QkI6NjYuzs6uvrquko6GlpZ+dm5iZlIyRjISIhn5sbGZhYltITEYUGxTV1cnCwsG7urGko5yWk43d3d3Y19DMzMfPzsKysqdzb2lQUUpBRD0XHRZRVk1RVUxFSUMzNzAxNi8ehkFgAAAAYXRSTlMAAwkghP4Y2HNhW032gfbo3L+P45uEYUC/kT/68MCOcmAnGvPb29i/v6WUg2tfT00tAf3z8Onn3d3b2tDDvraopJ2UgXFqX1xJ/Pr18One3Nza1s7NzMa/vr22oZV/TxoSCQhb1gAACLNJREFUaN7N2fWT00AUB/Di7u7u7u7u7tpkkyY1WqwUd3d3d3d3d3d3tz+B97KBBdJybAjQ7w83N3M36WdW3r5ubH8t2dPlTh3NFjHJni6hw+EoGykk5EAihaRxBg8GzqYZDkfjeP+Z1EXjDLXbh07ra7dv2WK3l/mfpNjJE9snAOfHJP1fJOSEDv8oWc/5r6PEOJFC0jmRQtI5kULSOZFCip054YwJdnukkIBDyyBHtszIqR8oEcGx2yfAgcJIVnMcM7bYeTPNAbGe1LmBg4ZXNNihZWkzi0FZlFMP4bl4hPLOGXoOjiKWgxaJL57zc/puohxiOWjAIlEUp3czwTmwtgf5CyBRnCTykyYARxD+Aihax4mQbdykSSMFiOWgaHVyO5YuW+ZwLOMjIYeBLOXoYSQODoB8QLKMEz/O0MEzJsARMHhL32kGUpQczBShHyGWcezfB0kTNm6lpCg5LP28AYs5jIQ/ujFS1BzMIEmynMNiJLG6M2PCBuTwgfg5UZPw25BeBhFgAmSew0i9KYn2GI4ZjGMeZJ6D86PvuJ5LHTQHgWMWZJ7DQKwIvHhIj1CBA8TJ4SQpp4BDrAchh7sdXDpxkqgo4OnV5xegxaY8XZvzt4NL4dTdPwBAY4TwubxQNgWKIfbsxj9Ci47MF4ccIT3CcqYEx8pmQSKQ+DwHjhAyXxR/BepB/gDERRo6+MD1IKEgn/vvgLhIvWcLQrDXGAStFcJnTGCqCVCxGBqIgwQciFtwI2hkWE6/Md0lE6DCFZ5VLqqBJp3oyUhRcDAIOr08PKgXMQUqMWSDfUO73sDBUyoqEuUwkKKs/QUoYAaUQ908ZEPxa8CBMFIUHAbaGRbkDUjS1KPr+UGqelMQNtjtUZKQYwS5R4fkuH2SJC2W/X4zoKcUZCAZOUbQKNIjJIcQGJ/xewHEvYa6ndm1Y7qdxUAycKIE9SAEQQtlblCMDs++9svhSIxjBAXDgIIEdhiAju7jBKUvzgjhScjhBXlxBa33+zlBCcTeG8OTJg1BEnI4QX16AWjxQhnGp0pRTpD4M2n4cn19b50s9EfQMCEsyLt75mMjaHQvAjO2UJblfRWBwwv6mTRP3Qyk3sMnC0JUoEvSbo9nF4D6/czxrpMh68bGtJkBURIDqepmnKXfBvnGEByuPozTfY7GIcQM6GdSt5kXVVX4LdBlaQGAAt0JwboT/MaRpDny1MuEmAAVOTzMQNp6/fdAU3p4EXRRAhCUQTIGOOiRMJcEwRxIvTWr//ckXMrC74GCBEBnKYgFQVcGCYJpkOqM9T0JOFwg5+p+P4OQYxqUYOZ5p9MZa8Q30UCts/oOdHJAONAYDeR0A8jLPMEpAsQ8SBx2fI/TeVYUHzEQhoGUlaFX0BjyFQRdhoFDQV4zIJdrz2oAxZr1iAtEIN0pCOLt7tU5LPh3M6AHrj0KXEU7nUAKDXL7+oUCYf+lg5BELhz6+T8CJkA9u/W/N1YZIIqrYS3dODzse1A/X/8hANpOSEhQdzw+v4F27heH/zGoWOEKeOW07BSAlO07nU9U9XsPIf0HLBoQEuT2IWjh+Dk66OZ+UTQNYpxWQ9Hz9dbg/fF1RpCiGEHIweNqvCwjiHIMoD7coJZw94WioUsnQk4pH1z3Z27+EbRyUShQkED2AEceP67PDbcAHAOoH1btxXNS8YA8+0/11V+TPIersId7H9yni5oNw0pFmQsgL5Y6Fm3DA2fcnPFgStFaDAEajWfaOJkP5Dl/fvlgB317OQ1eiA0bR0GsKwbQCs+q7tJPIDyuKEdOUSt6ojAgSeIEHZ51HhqNg8ChOXFo5I+g7tLKFXNXeOZJ0qAp7u8+C7dXYOE4yrHZjCAsmyZA6q31t6H3Ob+874QZm4aegCryIwjGYeVMz6xZANrNusLR+H00ENA4BYETEtQHF/3UcTInSH275BiSVr90vFwtQCiIdcVuAM1zxsKq18Md/NZ/LdhNxuocDbTo9M8gWH5joUfjBN2/89blQtI5zzw6zBcQpHMIuRjL47l6dp5zDYC8XuLTOT43DMBYyqEgRQHSjyDKWf+6AA/I9W6Jy4WkJ54ddDdTkM45vHqVx7PaGQtAkO6kl87RZqQFchhIIzHQoHWU4/fzgb7m3uHJFLQTQW783F3zYK6csebhgUJB3oDO0UDJbN+D5s7VSMN1zgIJV9hR+EpWui4PKE2bryD1qVZ4pmhrKAicWaI4ee0aJ4SCMAHKCQnynEHSKnoAeiUdVLomjiMXKRMDXQ5cEigIOBAYtJ1rdNC6qQBaQDlGUIFRcz0eJK0CjlY0p2KFSsI4vKR399fh3cmlUp0qiwPXIoeCgHQOQePlqVKf6zrGCKrx4Ng1FCHIRw8V4MSlHJOk44RIjfAR6WMNGMJAkB2wqGX5yrXlI8KDXJ/UzTe/gvaMYxzTJACV0h+RUVGAxECHlo84J+1YLorhQTGq1lPVJR+PIGisgWOO1J4+goKQxECiOAQ44UGYbPnUJa43m2NdmcM41gRBcymJgSA/gcYE8ti0MFLVB29Un/UcBM2cuQJJsIhx6+0wgty+7hKAfiZVARByLE7DVTM9HiTdoNeWIUA+YgTRiQOO5Sm5ZPcs2MNzlRvateXikKDF49Pa/lVKuu7e2nwNQBewg1goTzaCdsNd5r8DFcp1V9235O52AHnvQIV7gjuOgfDED/w7ECZa1nL7XK6x50bt3QebplJbrQgw0BRCAovn/EMQkmrnct1R9/r3yZXS2/LTIsBAOI/yPwUhqVB5AOVND78CiJJ00CCcR3lvRds/DU5cPuQgaAWtS2c1z5XFWuvlz2v7X0m5agWtS1fxyID3X/8bVH3JeqxLjwEEna0Oql8thu1/pbrr+K3D8wD0CjtbCU/PDCmB899SN9dxVf1896ryipCx6/47RysC5aC3OHZu9Z71RyOAQ3dcU9cx9bbffzQiOLQuNVHH+v2RwqGjVN7SnfUFxWB02iPqosMAAAAASUVORK5CYII=\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAO7SURBVHja7Zy9btwwDMfvMTL2fYO8SedufYSOzZghQ8eMt7ZQABaMwC/JlM+S/gSEy11sny3+RFEkdbebIff7/a/Wfr/++mx/3t++vJYWvd4tSaz7tO492m67itWJReFc6QRBadq1fv74/tmyIQAADwJA6iwPgOeXZwCwowUYKR8fb2Hll2MBQAIApSMlAMrnGQrlSqWpAwBcEADuBI4EoEwd0eOtewYAiQBwCEj5GQC0Cv/uyP0CgAMO1NE24hn49GO1HuUDgEkA8CDoVf7yAFhms8y91Al8+VSv5SVTq7WRANSrEWmlAgAaPeinb0//59byWt5HfIMMACJ+Rx2F9FrttEb8h0dat1MA8B6elmHWyI8o/ygA2iokOtLr4zOUPj0A3ggoHVdGPTWaDrzRqXV+pn/SAsFo5U8LgOY88dHPAeBWoMfRynZQpSnBA2CE8qcFYPYVSsQKnDH6AQAAAAAAAHIqAHACAQAAuFLQyIsNtJ4Tzey1xgHK39HvaLnnqZXLl3q8ZeQNjoATyez1RgIj39GSZl5K+ZJpyzSXPKDkBZfqWENt8ilK6SmfHydNCdJ3WSDUxy4PQO9I9gDQQsyRe7cKRSzrxcPbVrURJMkHkBRA/5cAyDapAOCkxFF0HiXFl6b9HwBMljjSHDVvDj3DqZKmIO4TQLtBAFodI+uc2vkb6VQBgASJ1t5J2UHpPDL/2nmjAUDlbwcARwowIxBE9hgCgAcDoIVXeypzCgDaeQDgAZ69F3RpbRIgkj+gFaS0OJuefxJZrWiBoS3X9loRZq/yo5s3egE4WtxZXytzt9NlpXWERSFoVX5G3iAjwycBNXWYNwsAq+AzUoM3GwDbTAE986wHQe/oz1DcqOsAgIsDkFXkwc3/Mrn+nQDIcgLrtj0ALUtCbek3EgCvyMNbZkpFJgBgMgC0qGP9DPyzERtallwFtNTe1RBEa/CONK8qiHY10atXNbRNujg6+o8CELUCvcvA6POhDqABAOl3gHoigfVvCAGAC+cCNOVHii41COpCzB4nrbciF3UAQQCsZV49aqLKt87zKnJbqo4AQOJ0UAdCZl8TIw3c0Vl89AGAzaYDDsBMUbGjdQDbJH+sEUIOG7XyfpYNkb1xBq0YZLtRH/k5mKsDkJEAWj7/L1kAenhpixh1yAwWILMGAA7BxJYsY/8ienQzALbJ/68qvRnH7fL/q4qWcLKii1vm/1cGQNuBJIWcvcQWenQykXIUPP9Pr9pxyBJCIBAIBAKBQCAQCAQCWV3+ARxUr8ias75BAAAAAElFTkSuQmCC\"},animations:Jr()},Sl.pillager={name:\"Pillager\",behavior:Fr(),entity:Hr(),model:Kr(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Tr()},Sl.rabbit={name:\"Rabbit\",aliases:\"bunny\",behavior:Wr(),entity:Zr(),model:$r(),thumbnail:\"data:image/png;base64,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\",animations:tn(),textures:{black:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJfSURBVGje3ZnPTsMwDMb3EpPGbced9wg777rX5ojgCRCCyxD3gisZfftqp86/soJk0qVtZv8SO463GYZhE5GfP/k3bLfbUfTzfr8fDofDjUhfdFxL5P2IeO+fTqfheDxOdFFd5Z48M9oVVUoNf9jtfiGIqDJofAsADDQKQA2PiDybDUC+WCFIK8KKSV8NgKgBKQAyw/y89uFKyAKAxuo1QsC2FoAop5IDAGdXDdVWAPBkhZWyZhoB6KpoAUB9VMWDkIoflrEKpQgAvoR+ie6AbpE7Lvvm5XIZjZCWAVjwWeTdSF92YOKAxwD0umRloZHn83k0XNoc4+fiyGR3K43MDEC3Rr0uiS2RwMffydINgDcgGo5tTn6BKye17zNsSzDi806gsQVBVAPwFMkJep/P78P18bUqcPJKZeM1MKrABGwm9K1lZ/ld5PnUbIl8vXyMxl+f3sbrFgBYXyuA3wBACOyPc0HHygRxW0wZn7tSesgEAPudZVgKVM7s3w0AjqSp2fXg8MyjrGIFMAjLQM/X8XPU8LsBgMFjzIwcxebup3aM0p1mUQC8rXnK/TsAc8ua7+WcyFYHwAtynr97RYlVAbBOd7wD4Fmf+1YPgIscVpLj9VklsZQbYZEjWrqK1gGLAWACxPs4H0DwOS9vmIsjUeNZn64ArGJnTh/emwMQFa/42jURKpVUgbRU+DzRDUCL6m1tVtdqnMUB6DLPLYJYADSNXhUADpp/Pc7iAND3awFggF0VgBa/BbQaZ3EAugPURujekb4rgBaKtxqnCwBOSnLyAT5F5pTKvN8LWgP4BnxBLAwNMNywAAAAAElFTkSuQmCC\",brown:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJmSURBVGje1Zm/TsMwEMb7WogJdUGICVhgAyZYERNi6IzY+gjwBjwHI4InQAiWIvbQs3rV1y+2c46dto50SmInru9n359cRyPjcbS/04hcn+450fuH27Nmen+xItI2yjjkfYuE3n96vGmmk/ZclnOd98kzSZNSxe+uDpYQRHQyqHwJAAzUCkAVN8n82WQA8sMKQc4iPDFpywFgVSAG4OV52npe23AnJAFAZfUaIeA5G8AEJAXAok+2uCqqZwFgNaPW4VtpBKC7ogiAhY2qhCDE/IdP2SwA+BLaJZoDmkXquGyblydjp/z58bgFwAefRd61tCU7JnZ4DECv++wsVPL0cNcp7s4Jynf5kWKemQFoaNTrPr7F4vj4N1kGAxAaEBXHc0p+gTsnFvcZtk/QCTr/AXOVe40ExQCEJpIy9u/7dzN7/cxynLxTWXl1giIrSZCuQMgWY3ZneT62WiJ/Hz9O+dnbl7suAYDn63Pg3hQXX7A6HV8miGExpnzqThnkYABsdz7FYqBSVn9rALAnja1uCA6vPEoVO4BB+BQM2TreWxXfGgDoPGT1QhPr6o9FjL6RZq0AOKyl9lcLoGtbc1/KF1l1AEJOLmTvwaJETQB8X3ccAfBbn9uqB8BFDl+SE2rzlcSiZjSxFTpiu7I4AEyAOI7zBwg+F8obuvyIVXmez6AAfMXOlDbs6wRglFDxddBEqK/ECqR9hb8nBgMwZO6w7nE2kj1iUSQHgKbRVQFgp7npcdZ+oO3nAkAHWxWAEv8FlBpnY7WEXA+91Z7eEkJzJ15qnMFCnaUc3VVX5Jq+NbfghKq0fv8ZO+5hVm7/xgAAAABJRU5ErkJggg==\",gold:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKMSURBVGje3ZnBTsMwDIb3OFx4Dc48DK/Aa3DhwAUhBCcegh1AmkBcOCChMdDYhmBiQJijuXL/xmmSpmPlYLVN29T+EjuO2zPG9ELk6e7AkIzvD63w9efoxPyMz0pCbaH9uoTeDxG1j/m1Me8XFV1YV7pnn1m2BSvFhs8ejgoIJKyMND4HAAQaDGBleIjQs9EA6MMMgY4kqBi1NQEQbIAHgPm4qjz/PesXQJMASGP5XEKQx6YA7DRdSQwAvreYXhaGFgYvpz0OVrBSrpGWAHhW5ABQ+CiLAsEXP2i0UVdXW1Jgkn4p3UG6RWy/6Jv7u9vWeHsEAC74KPRupW0xqLRFByYMeAiAz1NmljRyb2fLGk7HGOPr4gh+PzkyIwBeGvk8JbaEBD78JkprALQOpeHyGJNfyJnjW/cRtksKQ1fxo2T88vrr5bQEojEATZGYoDe9GZlJ/7FZ4MRkB4yn9vnw2JjX8yIJsgB4BDRf9PldyPO+0SJ5u322xk8GQ3ueAwDqy9c8+jKJKqW48oXQoOPKBOWy6DM+dqa0IRUA6Hcuw3ygYkZ/YwBgJPWNrgYHR15KJ2YAgnAZqPm6vA41fGMAyOBBo6cpVnfft2KkrjRrBYDLmqbcvwNQN63xXsyOrHMAtCCn+btWlOgUANfuDlcAudfHts4DwCKHK8nR2lwlMZ8bySJHaOkquA6YCkAmQLiO4wZEPqflDXVxJNR41KdVAK5iZ0ybvFcHIFS04muriVCq+AqkqYL7idYA5KjeNs3qcvWzdgA8zWOLIC4AnEZ3CgAGzb/uZ+0ApO83BSADbKcA5PgXkKuftQPgFaBphG470rcKIIfiufppBQAmJTH5AO4iY0pl2v+C3AB+AQIL0htM7eSsAAAAAElFTkSuQmCC\",salt:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALvSURBVGje1ZmxTtxAEIZ5LZSShkipAAmlC0pLFykVINEjiogiTbpESgFUeYJ7AMoIdA+AEDSc6DcZ6/7L72HGt+Nd20oxsr3eXe18npmdWW+klDZyZGd7M4kc7L9tBM/z+TwtFouWSFvuvJZ8OT1MOeKN/3Z+lFhW7WefE4u0ZS8Kip98+rCCIKIByHMNAKxABIBWnvvrdtElDAADAQMKQ/kaFoAF6gV7X9YC8OvHxav+aGMoIQCiMAbiXpSdzWYtEPJcCqBlrkqRdQBkXT8vjv9BW84hALQVZS+KlWdhAHwtAvB3waIAREOAYjkWwGttWcVyzl6BiScWZTWAiAtY/imL+7i31Sh/sLtlAoAVaoHVuC6AuZb9woGJF2sBwH2JZcnc79+9aRYoV8vyLOVFdMyC6+r3kN6RGQBY8cvry9V9n9ji+TqD5yBsiQdAvw8D8BbGivM1kl/wQrv2fVYEeYgWDw5D5i20GIAoa0kk6C1uH9PzzX1R4GSX8iBwIFwBwBdg+p4Jan/r6ov+sAgdI3B9uXtqlH/+/dDc1wDguQdvhS0ADEErpu8jfVhxJEj6vsZXL5FXAKyIrIOQFxBZEA9EWY4N2CajsWJQAPAPUeTq+9dWVJdnEbzDe/i6PGMs2tjs5BnZIbtBjZS5CgDeuvB1dBtHeGvb01/VGqMtAm2TA9BRHgv1cmzvfU45Gs02RwUA//d8U0f1SD0f3Wqj44oAeHm2t/21KqzloUItAJNYgBfFrT3f6lPzS/LHGM0CvKIiV9ZVeGEABGESAF4W5UlX9piTN3hFj9evOoCowl6h4abGHSc6XUkWuyHnKYNlgn1Fg4gq7x19aWvsCrqTArDqiHW1vVdQWUEYpe9gLlAyGEfhfUrgIeYZHQCfApcC4HT5vwGga4MSkDXmGR2ALppqgBy7Qiy2AK7xS+ap9U9hdAAocUVKLWmKM4JiF8CBRymAGvMMAgBRng9BPOF+/NeYf5rmzKNjC/99rg3gD0EUyOYOT6hrAAAAAElFTkSuQmCC\",toast:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAALYSURBVGje3Zk9bsJAEIV9CaSko6TmCFQgwTVo+JMQ1+MWKGUUCqQoHQX1JmPlWY/xrNll1ybE0ovtsT3sfDv7m8I5V4To55A/rtfrlcJ9v993g8HgSmIL9WtJvj+dTpXk3rI1+HCXy8Wdz+fyXdjlWmzy7PcogguFwF9fXioIIhSOg88BQAoKxQBA4CGSd6MByA8DgpxFKCAkthQAApILCrjaZn07HA7LZ5vNppaZ6/W6qiQ5y7tRADhYXDMEPqcCkNqBYgDg3fl8XgWK8263q1VWcKE+3t+vUhASO/R2OFS2FABSM3ygVkMAILDValULdrFY3A+Ag0bngmAlcD7HANB9CFJzNpuVwU+n0wqA7mck07gCkI2i7XZ7dS9aLpc1WxQABI5asADgOtQvNysOcjKZlOk/Ho+9wVsAdFPQmVMb3WIBsBiAaL/fV9ehfgHM8m9J/6ZWawB8BeLA+Rzql6H5+hnd3PAblhD0aDQqpZsWbNkA+AoS0+kdj0cnSuk4dabKoTNHHZjgFY6HOF+q6x6fa8t6n+cLmDVaKgP//HK5IFgjlNWBXwFgCLo9+oL3QcC7IcEXZQKm13qKagB0u9OB6eA1KOipAPDcnsdyC4IPDgMSH+zzKTIAINDLWgH6+ga+x/chtf8nAHDnIbXn68VvPbfm41DMGuCe77IA0MOabxj8dwBupbV+pm3/CoCvk/O1dx5PnxaAtbrTIwDslu3pAXBgvkmOzya9vbWSs2yYi7P0c0t6/Z4dAC9CeBznzQ29WGGb3hprAsAQQgKHX957bAWAXs/H2HjCI4W9BSBUvs3X7AB8q7lQ8TTa2iC9V1z72H5vBUDq5qUodVaXy0/nAJDmqKUUAOIr1U/nADhNRY/20zkAbvspBUfHmuqncwB6uHy0n84BYEOzaVocCkB8pfp5CIAcBc/lpxUAelLSNCdAO+ZZIf9vDuN707Y2xBu1ba4PvgGqoEuP7iUQGgAAAABJRU5ErkJggg==\",white_splotched:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAMZSURBVGje3ZnPjtowEMbzAFyRdm8cOfMInHkQXpJXWKkq3W4r7X/RVdVeUhW1p7odiy/7ZTJO4tiJ2CJ9ChjizPxsj8dD4Zwr+mi32znR9X7vhc+Hw8GVZVmTtPXt15LcDy0WCy9ug0L3r9drt1qtGrbA1uPx6E6vordRcPzh7q6CIIIx7HwOANLXcrn0igEgjuM+lh4kgIgGIA8GBLmKtGHSlgIABnY50Abg+O5D7X55/d7fVIM0CAA7i/cMga+pAMQ4cQYO9QVQfff84mcOZpB/3T42Bqu3UdZIMwDMihwAaI06Xs99AFTL4/65Yeuv9x+HA+BgxGudlwMvi9iAp9fmdrv1AOQqn62YIM+5vLioDQL053OzzT19abRFAcDDOeBpAHgfM7MAl6f6ZrPxjstV7zB65tWcPPVrBcJTLKg9PxoAByUGgK0R72Nii4wi929Ndwu6aD6fe+nnZgcQ2lbYcb7G5BdwREBYcUYvN85Din8uiPAZ9knsELHNEkvQlg0AHqwVE/R+3Hxz5dVLUuDUM1U7L+2AIqoAYAQ4ymtnsUZlhCD83pq6esRCkEQ/P333zpfXX/37HAC0vdxG2+IrAIaAoNTmPABw5/g9B6gu52NnSopms5nZ3gCgc3AGoQFYoHiLOicAIRUcuXkb09sTO8l7tzVLdH9nD0Cf9JDRaQf1FqVjhvyGt6Su0T8LAJyRyaiHDOv63srH21LWnPdlAaC3tZBx/x0AK9Oyihx8jOx7Iot1RC+xSQBY+7215mMKHykA+JmTAODkwEoeOP9mCG3H3lQAgDAJAHZWJzu8p+vqD5//9dIILSM53bF01cdKtfvWAQcDwCGEAeCEJW36mKsPJbo01hVH2Hmr9BXKKEcDwE7AcUg7ahVF9XddAELSox8qvo6aCA1VW4F0qPR5YjQAOaq3qVldrn4mB4BpHlsEsQBIX6n9TA4Ap8LYMphVF8zRz+QAsIPA+BQAHGDfFABR6n8B+l+nNwNAipEAkBKhx470owLIYTj/03x2ADgpkdFGGVqXo618QJ8iY0plnHmOeUL8CzlUCETgPL+VAAAAAElFTkSuQmCC\",white:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJySURBVGje3ZnNTsMwDMf3gNyQuPKkewUkxBgDiTGYxoTgUkQFJwLp5uL9m6R2PgqlkpUuaVP7l9hJvIkxZiKR6XRqrMxns0bo92azMVVVHYitk/brEvu+RAJ9mLquO7qQrrZtf03ESpHhq+WyhWCFlOHG5wCAQKUAyHCJ2GfVAOyHCYItraBiti4FgNSAEID6/BKfNR+zRQs0CgA3lu45BF6mArDKkWgAtG3rbWvofrYYc3vfGSyxUq6R5gBoVuQAwHzUcH+WAGjd427d0fX94ioeAH+J+yV3B+4W2n7RN83pyc767xIBuOCjfN5068zDY6dOHZgw4CEAuo+ZWdzI1fFRY7gtNcb3xRH8fnRkRgC0NNJ9TGyRBD78JkoxAL4OueG81Owv+MwJrfsI2yU86tvLAeAARDIAnyKaoPe6eDbV2TYpcOJMRePbleDn2gGgEfD5YsjvJM+HRsvK2/VLY3w1f2rucwBAfV0B/AAAh4D+2Bd0XDtBviyGjNfOlBLSAYB+5zIsBEoz+n8GAEbS0Oj64ODIcxnFDEAQLgN9vs5/Sw3/MwB48LCj51Osrz20YsSuNIMCwGXNp9y/A9A3rbFNcyIbHQBfkPP5uy8pMSoArtMdrgD8rI91oweASQ7XJsdX50qJhdyIJzmkqStFHjAOAN8A4TqOBxD+nG/f0BdHpMajPkUBuJKdmjre1gdAKr7ka9GNUKyEEqSxgueJYgByZG9Td3W5+hkcAE1zbRLEBYC20aMCgEHzt/sZHAD3/VQAPMCOCkCO/wJy9TM4AFoBUiN06UhfFEAOxXP1UwQAbko0+wE8RWpSZb7/C3ID+AJqOCnCpASABAAAAABJRU5ErkJggg==\"}},Sl.ravager={name:\"Ravager\",aliases:\"illager\",behavior:on(),entity:nn(),model:sn(),thumbnail:\"data:image/png;base64,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\",animations:An(),textures:{default:\"data:image/png;base64,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\"}},Sl.salmon={name:\"Salmon\",aliases:\"fish\",behavior:dn(),entity:un(),model:hn(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAPNSURBVHja7JdfaFtVHMc/Jw33psluFzQx1UYYrCwIyjLTP7jKhLGC9UlZ33zIy0B8kMFwgvZhzNHtwQfxobBH9yas4vRBNx04hjBbAltR6R9W3TBdkzZKmixpcmdzfIjn7uYmy59W2IN+4fA799zf7/x+53fO+X3vFRcHY1Re9krXD0UBWP3x2QTTQwMAMokkjKD/7DkUbn/wvqAB+s+ekwC6pgNQNst8+c07ALxy6CMAMpOnLVuXEY9KeXjCmkAensCIRyXA+GwC5XyBCrqmW62Zc+W4bJYB8Plc+Hwu/D5PnY07f+GW6OKWNdD14YTIA9MXBgAII0giGfHuohWcgakAFkOjlDc2OQL4fR4y9gBUx5byGiSRRDSduWKBXkDTdcxyuWEAv7x7wkrtTCwnQ0E3M8UDdD/hQ9/dzeTlTxn23iQd+0uGglXXLvsE47OJmgmNeFRGNJ1Fs0wYgaZXV6hkM+TyW5w8Mw/A5p8Fsr9V133yzDy5/FZ9BpyrN+JRubG8xL1/nCeRHKB99BhdDI+O8Fb0BUp7AgB47mT4fXSEQE+qPoBGzgH2e33MFQtENJ1OEAq6OX/0FNlCiV1/qIlDnH8vxtXrxzly6BMAxMXBWJ3xvecLEuCZn31iJpaTr8338vVzKd48OtXyGnYKdxIpVYrVfu//NchcscCdV4uS9YfKV68fx325m4imY7dTWVLPYQRAWwG6xgJBfqLCWCDIj2aJsUCQa8X7JMJrltJn4RWrnwivWXrK7lrxfs3zApW2MyBODEblS3Rxgy3s8lI4zdOh7poT22N0sZre5PVkqE7fKdvOwMG+fax6NJzyDXmQ1fQmhaJptdX0ZnW8gb5Ttp2Bm999K+0VTN3xfD7H4soakb6nrHfq2TB6ADAfPIBKpabqdXpIG94CBywyCkycsgYzk6eF6NtbVVhZ3vYtcLVSsJPRTuCssk0LkR3qasW0eiazr9zuwFlVH+W8rQDs9SG6zdVPDw0wPpuoCeTK1DHZdgYUGe0E00MD0ohHMXMbAKzevU3JLImOMtBv+6DINFhlM9xgi+HlJVLZdTyaB7/XECmz1PoQKuedkpF9/8dnE7z97B5S2Wpd93sNdu/dJ9u6BSr9i2Z5R1vQ//kXotcfFL3+oEhl18XG8hKR2IgUHw++WEdG9o+QZlvitNsWGYURdWSk5AIVdLfbagsOPbudmqfTmvFIMlKyx/Pw4OVKpZYk9K+RkZL5J/us1g4JdUxG31/6SjoHG32/O5EtlJq+t/98NA1ASsnjhIvHjP8D+G8HcGXqmPx7ANbR5UpEgbC7AAAAAElFTkSuQmCC\"},animations:_n()},Sl.sheep={name:\"Sheep\",behavior:vn(),entity:wn(),model:kn(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAC8VBMVEUAAAAYFBEFBQQsLCwyKyYtJR8XExEdHR0BAQFrWU1vb28sLCwQEA8+NS6IiIh8fHwLCQgtLS02Lig1LiiNjY2cnJwiHRogHBgJCAcQEBDe3t6pqamSkpKhoaGenp4UEQ8tLS0RDgwvKCR0dHRkZGQkHxt3d3dRUVEzMTAwKCMcGRcEBATY2NhBODHW1tYwKSShoaGrq6u4uLigoKCQkJAkHxyQkJAbFxQZFRNMTEwDAwM7MiyDa1l+Z1a9vb2wsLB3d3dxcXFlUEK6urptbW2RkZGvr6+rq6taWlqAgIBiXVlHR0dCQkJaWlofGxhAQEAKCQiPj4/o6OiVlZXh4eGZmZmysrKQkJDGxsa/v7/m5ubj4+PMzMyGhoaUlJSWlpaIblrCwsFDOjJqWErl5eWYmJh/f39rWUsyKybExMSSkpKKcFyXl5doVkjFxcWVfWqoqKiJiIhsWk2Pd2SMc1+4uLjLy8tuXE/JycluW02OdmNkUUKTk5OMdGGMjIyLi4utra2SeWbZ2dnd3d2Lcl6KioqQeGVxXlBtW07Kysq9vb2vr66srKyReWaKcl9nVUfb29q6urq0tLSFhYWOdWJyW0uzs7OSe2q+vr62trZqV0l+fn5mU0TPz8+2tbWkpKODaFTY2Ni3t7eqqamiloyRemlXST7W1tWwsLCgoKCbm5uDg4OPdmJ1YFC8vLyGd22Gblt7Z1bMkZGIh4eBe3aUfm2FalVHPDPf39/S0tKdnZ2Kc2F+Y1JuWEg1LSji4N+PioeekIaVi4OCgoKShn15b2dURz17dnKHcV56YVJOQjk5MSsHBgaopaOioqK0paGnoZ3Hjo2zhISEgX6ufn6qeXmYhniMgHiHe3CGa1c/Ny87MiwAAACuqqeioaC+iIWIhIKBdGuXc2R2a2NkY2GBbV5cTEDCv7yvo5qinJeYk4+ajYOldnWTgnNwcHCWgG5yZluXko6pf36Ec2huaWWAcGR4aV5fXVxiXlopIRsODQxnbW74AAAAUXRSTlMAPQ03/lNRJwH9xjQV67WJNjHQyrquqnstE/TbuLOySzsz7cbGtoZ3Z1NEB/Pz8vLt6Obe27e1h3thBf3z8/Dr5+Th3tzbxsG1pJyThXh2SCb6SC1bAAALrUlEQVRo3s3YZ1giVxQGYNJ777333nvvPZMJMKMIjEgQEAQBRURiL9iiwRITTWzRWJJN2WSTNb333nvvvedXvnsvM8NKfuR5vOp+u4vsus/Ou/ecOXPUwD9rbbr17obVJ2ttLSuKstqQ1tp1qOZev7K6kDbapfaampqaa8al1YK00a5XIrXXrMDrkKRIzc07r2VYujCOnmsGSpGlIqFYuUDkqj9yNdKSnBI4OVdckVOgHk4BfpO7hKe0BeEwA+PQ5GYU7tjFI4GzDRPkaBxNp5Ga3ZsuEgkc0jrqCWkcraEoqVRBFoEEzq45uDYDIfhAwzg0zETnkrzQJJwOOxnm0IP2pkjW5MzGpvemGxkWIBtvdt5leu9kR0dqpBWY3wN+xR1tPnYj/pyDcYVzT9gG/UKaRS2XVjM9OgkPFOReC5lLm3Lm7AiENm/oO42ET+g8WNRW10njFiVg48zRB6DqIhfWL12gcihV0zPSQJVNFBeGk6ve2OCo0Qqo89S7nzU24XAD7ZDJKdAuCEA2SCfhp5rxKrNIw4ez78EZHZGb9V5v4CwSJhXhTJgFbiBwDtW6I4fV4YpsEkTqrNZJjD40YbMK3ECMk8uupJaMJpuEN9mpvc4oihQUN/MAnbUis0w6Rz+wFbIlS6F1FDhGJwFBJAg8QEdaxkHSSpb+kHFAcjxPyXDgvtM7inA0kMAJVGqR7l2x6rnk6ifmnqzPy5NzM2uojcQhk9M4FyTM17PeqYrbL0lDBZkctYg50fsEASAl81ZTSbU9NrFIB7EE8+bpuQBfPESjUanUApLOYaToB6IZoGBCynqiFtQOFoliFigvb76gpBK9d2joXos/akmTCmi94JJutIkAkbjZuMnVSEODQFCQs0gFmfmAkpG+gaHaB8f9/gGLZZyScsiv5huNRh1ET0UTkVYuoiCbTbQxkNlq5QLqSkZMJss1Dz74YG3N+IAkgUQ5L4jODJCyCicyaWQgmxOvDIQw0NQ8QaGHW0wmt5+Qai3oJclSU5BjIcVy4poMdPWdbhRM5QxCw0AoFgMVaaCpq66aJygWa3v4fbdfSUZLFVl2Swp6qZWejc0jxCmoPhHBXa8WqwhSEpsGcuKtCrpq3qBlsVB19eitSjLZOnErdlApOWEh3WOFhIFsneAgrFj06AAxe9IgG0w8Qf/c81R1daxhdDDZGmhRolKLWQTI6RFI4h6zmMxlc5KcDnqHgpxxQWAgJ37DF/Tcc39+tTwWC42NPh9oSSbvsyZEyws21suUo33ZPFwkpiuFTzOQ0wYTBcXN/ECfWaQ2Urfl375PQFc/ZLmFto7ZOtmXq+4dNV2oDAMhDBRHRRkI9eUGqij8zGJpC6caqnt7ex8evM9z11tpkLXqShwOfcatiIAzB2Q2q1UjFH6g7u7PX2xuC3vtlct7x1ZWPiTooJ6Ba9j63jlpFLNACAWBmgZ5OIFm7WN1ANk7v1q+ciVAt0VVkMUyUHNlzaATDpGOwWwQkgaBwwX00q+zdvvdb9vt9i8t5ns+B+hjiYLMYo8FieLGhoNx5oLiZo8KQviATKZH7rbfjbz9paX+veeeTIM8NqONgvwiBREOA2EOpkFXJ2BaCNDM05/cffdNN8VeDL733g8omXQLK46pVAU5YdLDQIk7866eC6rP4wOaefnDT25CZv5+74fEk7eVvsCu2yKVUpAIQRYIF2cgjzljGeIGuuMOQpq9/4snr33yNkxq+nCokpoZCKFrmE0FxTUQ3vAHdXd/eAdy0+zs/fffde2TbwFEbua5IO2crFCoIIGBzB5rGnT6gfMEnXAUQN+9gjOa7f78d4CmbiEgWzaIvoJqg2dVkNWjLkP1wl6G+ebE/c/s/u711195ebb7NtPXH10bVEGJVg1kc6og/Z4PaiCPWrWgIIoAzTvrjf7y+uuvvfY0QCZBBVnNUyMWhIAIR7VY1Z0tLw2qD+ptZOYEkpMvvqKBpmwAFeGiGijdy9RDQfR4GCiRl5cGxT3ko2dDHqBOWe578RUKSlx1fTz6Af7t/wm6moGs+GMCEgQuIFMXIY3eDlDw+uvjkpF4rK3R/wQR7BwQQkBYSHiBTKaILMvK+12m4FWTfQBh95Cg0Se1CkIY6M47VZB1wklACG+QX/J3TrYOK5LRWuWWyPlESwnIiltuDqj+aqGegawTsrxQoME+ScbbTmWizy0xkBR1x81mkYGKjGbVkxAYaPI6SXJroDinHjpov8MJCJjBCAHJiOJmIEkWBAayOo0URMvEQGKPRGOkIDrAAeKRNfc7goIQBkLczTqIXs2ogoIM5GmR5UyQh2L35gIC6ZLTVFCEgRRJatZAGHsMVK+CrB8ATkBuAjIzUGLqeoB4kY7oYSAMgTRIulVZFYQdKEFBrz4UCLR2dRIQznISHIASwUevB4hbjuqL6CQGipiGOzUQvrEACgF99JPjLYBMpp5OApLvo0ta4tprATqfH2gn/F9v1UkMZKpiILobMtBD3xc7HL4/vgFoIlB1KwOhx4IAnb3/iRxBktst+TVSxJ0JAoeBhPhj1dUdFTf4fG+8BFAggNO8DxwBoFc/XYMXhoEkRfFrpGEcmArCmspAZMF4rLqhAqD+sd43XgIIp1kkkHz0aYmLOwgIiZAYSL6OghAGsiaEeBrU4XCM9baFvv8aIJOIv3Hn441NLr6gc7rcDATS8MR/gcwCQJ43vakb+l0ORwygUDEKZxLBcTSV8QYdHRi5ro+A3Ip/2PzCdauCrNpX9G/a7S4XQO3hGEDFxW88Lzzu8vmaykocDs6gQItpWAFIlrusYpcKYiKBgDzoXgpCStrbw5WxYpJGR7/P5+q4gTNov8MDLQAMuglIJCAlDXKO4EVUq/ZYyusqQbwAVXobVNANFXxByA4XYrS0BkYG+wgo4pbdaO8qwdkiR1YBtTWUlzeV+OzeuspKuz0MkK+DgDpKmgDimQOWj7a0khEcMcWFYdQOQyDShZ7SQHEV5HvmgWXeujBAddXV91fcAFB/eRN3UG/v2MPPA2QKCASkyJhLJEmAGAf5raO9/5kHCgsJKKyB+kvKFwQUCo09PEJBrW6AZIWC+hiIehKf5d8DTuGeaZB3GiCfwwFQWRln0DqxsVCorRiFCwivGkcGZQry+wnIzEBYMP7Kzwfn+DVP9oanUTKcUTmZAuDwB7W3pwAqLv7x258c32AKRProFFCS2HcIiC4YF126CTgGwynecCgUJqJugFxljWVlTfxBlWy0rHQ4fgaIPmIxBSLsyRGkC8bFhjXXNCCHVCwLhWKxSi9AmAIA3fzsQoDq7CkKKnvzRoBaRgYVBsJMzAPojP0PMiAElH9PRzu+w92WasQUKAGnsJA3yOsNA2Sfrl7pq+jwzYy2mFowBSJ9EbbB52HBACedTfLzQXoq1NY2U97kegKcwrU35w8KU9CyCoAae5ePjgBk6jGBg0w93rRBxs67HSX5VrbNlNxMOdtub1hIUH9jb28D5lJr+oEW/LixxAVQNukLjcMfVElA3tSyG/odjsax3oZQA4YAAQUfd5WVUVA26QGNwx80PU1v5JtcLoDasV80YAiMjoDj8wHkcBgM2aQHGId/1p3xTodCKS8BIY246VINxciYizzPSzo6CCibtEAcgPKfuJ2MllD4JjJZCKiyMgVQg4OA0FcALWIAygcpFmtoe6q8HCCy8aCCDQD1d1BQCXpoEXP5VvmUREGOZ+7xeusIKFWdwrJDFowm3PaLm93SpKccWDDyAQrXEVCYjKX+8vLFBiHrMxI4hRooTEA+PM8hKjMsfgjpncLCw4470OtNVQJk99p9LgdbMBYfxE7pncOO29iwhxdTYNoL0dsugFyNWDAWt2Q66cCN8brHE0+nMAVSdQSEOQDQzScZliwA5efffHsIUyC0zFVONp4v3i1c27CEAYiQMJYqMZZcN7+LRl9S0PrrbslIAJUwzj4cFh4uJHAQcJY8jPTO6nA6GSSA1j5mNeGkSRw5/wIc6c1Ha5TXFQAAAABJRU5ErkJggg==\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TS0UqKnZQcchQnSyIXzhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg+AHi5uak6CIl/i8ptIj14Lgf7+497t4BQq3EVLNjHFA1y0hEI2I6syr6X+FDH3oxjUGJmXosuZhC2/F1Dw9f78I8q/25P0e3kjUZ4BGJ55huWMQbxDObls55nzjICpJCfE48ZtAFiR+5Lrv8xjnvsMAzg0YqMU8cJBbzLSy3MCsYKvEUcUhRNcoX0i4rnLc4q6UKa9yTvzCQ1VaSXKc5jCiWEEMcImRUUEQJFsK0aqSYSNB+pI1/yPHHySWTqwhGjgWUoUJy/OB/8LtbMzc54SYFIoDvxbY/RgD/LlCv2vb3sW3XTwDvM3ClNf3lGjD7SXq1qYWOgJ5t4OK6qcl7wOUOMPCkS4bkSF6aQi4HvJ/RN2WA/luga83trbGP0wcgRV0t3wAHh8BonrLX27y7s7W3f880+vsBrpNyv7WKqS8AAAAGYktHRAB7AIgA+CsBWrcAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQflBREQNSrPtDcLAAAO5UlEQVR42uVbf5AU9ZX/dPfr7umZ2WFwL64sdzlJorncBs+KXDgNqFHkl8diVEAQgfIHIqccJJIfFc4oEU1BcqBwSBkVQuBYDhMQEA5BiZDTIicesli5U4JSV4wgLDv09kxPT7/uvj/G71xv7+yPWTAl5FVNzXRP98y89z7v8z7vO91SEAToypqbm4NkMgnLspBMJgEAlmWhvr4eAGCaZvm9VCqF2tpaCeeRUXcH1NfXIxk3YOVTAIBMJlMOBACkUqlyUACgtrYWF1QATNMEACTjBjLHT0CgIZz1aBDOJ5N7clAmk4GVt5FKpVB/SR2SyWS5BKJouSADIBxLxo12yLAsC5lMBqZpIpVKldFyQZVAuO6Fo2G4izIQAbngAiBqXTB/lPWjZHjBBUA4Wn9JXYcuIBCRyWTOWw4g0ecB/L+Tx0/Asixc/qUvluFdaoV2OdvJuIH3Dv8BAHD5l75YPg9AEEZJGB2ZTAYDBw6sqBMcOx+8s+tFUvUYACDb8jGuGD6R33t9I7luEYMbp/G+Tc9Ta2srEokEHDsH3/ehajoC34Nj5zB08sNcrQ6hcNbeO/wHNBw9StkjR2DVurDqp/Eb6xYTEeGQ54EUBRLpeD9n4brJ3+YP9/wbXaZ9HvqAAWiuq+NKJWKaZhk1Yf0Qtbe2riZZ1eDZefhuEdfccje/vaOJXLcIZoaVt9EwfBIf2LqSfM/FsKkP8283rCDDiCHbchIKEUzTrFqHyIK5xfNTuzdAVVW0fbI9fu7PMGrGo/DdIizzDEbe+wPcNvsJAIBbKMDzPCzasrJdSdTX17frCiIYXZGk6xbRcvJjXD5kDPu+Dytvw3eLaBg2gb9x6728Z91SOvDyL0iNxSEpKgBA1TT4vo8AElQ9jkMvP0/VloB08ODBIEpopmni/V1r6LJhk3nTskfpz+sugs9FeJ4PADh2ysTtsx/ngy+toCvGzuBKBFiJLE3TxIABAypCdOfKhYqqabj61um8/+XVVHCKICKQDHh+gJgRRxAARiIBy7LgOgXIsgzHzoMUGa0tH8Njxm3fXuhVhYAoLDOZDFKpFK66dSYDwC0PPsoft1qYcOXNmHTVGJzI5nH77McZAIbc9V0Ok6A4v8wTEee76hRfa7yHXadQ4pnAR7pPCrIso9+gURwEAb7wjUZ2XRetLadw+dCxrJIC3/dh53MwW09h6J3fYaKqAQDZsqwyXE3TLLe6TCZThmyxWMSho0fx/vHj7dqjEEHinGg5WZZV3i9ed9pt4gYUVceBLc+Tnc+j4cbxXHQK+N/fbSc9ZuDwnl+TrMgY3DiNm19pIsdxAAANIyazFotj75pFpGp61QGQupsGz7VtWDhHueGeefz6qidJ12P4u4lzWHSY5h1rqQxtx0Gqb20py3YBg8ZMLR/3zrbVFAQBhoybwW9sWE6O48DnInK5HGr69EU8HodlZgEAox94zDtrJXguzWcXmxZ/l26Zs5BN08TvfvUMKVoMHjM0TQMCH+wFSKb6gDQdiqKgYdgEbn6liTyP4bELjRQUCjZeXf0zKlgmgiCAkawBJAlfHjaJ6y+pw/Zn51PeylU/CzQ3Nwfhx7hR1ys7X/iJ8vKK+cq4UdcrZxuAYfc/xn37XlTmCf7EcVJkWGdOw/MDEKlwi0UUchYc28ahnetJliUMue0+lnxG25lWOI6DrwyfzJ7HICK0ZVsBdvHWhqdpy/JHaOjkuaySUn0ARNuKkqNt2+cEAW+/9HO6uF+JMw5sXUnXTHiIFVnGtXc8yEMmzeFYrCSEvjD0WyzLEiQECHzG4MZp/Ju1S+jaibM48D0MmfiP/PbG5YQgQLHogIsF3HDvP7FGChy7gD0rF5Dvce+nQcHiAKDqRpciphr72tj72DyTxeHd6wmSjP1bVtFf3zSRX29aRm9t+jlJkgSSgcO711PDTRN50N9PYSGUSIthx3MLqPZzdZ/ogBgaZz3BgSQh8BnJuIGRD8xnkoHR//A4D7v/sW4jQJ05H7Z/WbPxnHHAoW0rSSYNmqahUGQMGnsPv/PvaylmxOH7Pj5/9Rg+sncj9f1cP/z3axsIkoy/vHoMZ/bvJGaGFovDdWwk4wZIkbF56TwKuIhx33uaN/50NhERCrYNK29jyz/PoWkLVnfdBU6dOlXW7qKdRXt3+P2wyAHQqbbvzFpaWoJ9G5aRJAHsBehTezHyOQvxeByQZPgeY+CIO/m9324hUhQwu3CdAiQAX2+cxrvXLKYvD5vEv9+xmgaPe5B3LJ9HTiEPJ2chFo9jzHeW8KZFsyiAhGQyiTvmreiyC0hHjhwJok5GgxB2PjwR9mYR9LWVTyoDrr+jrB7f3bmO7HweAKDrGgaOvIuTcQP7Nq8iWVYgSRJc14WqqijkLVx581R+o2kJIQjgeR5cp4DGhxawlbexdcnD5ORMADIkRYEei2HKj1d53QohAfuw80K0iP3t1gcj0rkac1yvPE2++eIKarhpIidralCTSkHXY/if3S+SmDr7DxrOADBw+B2ct0z4XMT+jSvoq6PvZiuXg4wAjQ8t4E2L59KO5fNI1TToiRRUXYcWMwCp+wWvdlI4rNiiyi28L4yOqpWXJCEZN/DqLxbRTVPmcPOOtfRXN4xnM9uKkyc+gm3n8e6u9cRuEfWX1EGRJby7cx1dO2EmywrBD4D3X2uiPqkURkx/hLc/O59k0kCqVuL0wEfjw09xsWBD1bTuf8/qeVMVu1BAIlkDI5mGTAo8z0eipg9U3YDPRQSQoJBaIp9UGpaZhSzL8ANg5L0/qGr42PnCTxQAuHbiLN699in6229NLys80zRxZO9GkmUZ19w2nfdvW0PMDN9jSJKErw6fxP+1+TmyLAtDJ83mvWsWkabpGDx+Fr+xbjHpqorrpsxlALDyNl58cibd/9P1XZeAJMtQiUCqBiEqNE2Fz0UoigJZIUiSBEWRoSgKuFgAJBmFQgG+W+hdK5BkvL5uKSHwsW/DMtrbtJREuV1581RWVA37XnqBrho9uVQCI+5kUnUc2rGGPD+Aqqql2YFUQJJLHYEUXDdlLm9e+kPa9syP6D9+uZBq+lzUfQkY8QTiNWlIqg5V1xEEgOcyikUHefM07HwOHrsIPIbnB7BtG21tbaUv74Wpmg636OCyb45nhVR8ZcQUZmb8569X0MHtv6Rk3IDruhg89m628jZ8LuLdXevJ8xjMHuLJGiiKgszxE1BkGTdOncvbn51P2ZYWvPrCE9T40AIGJJw8dapn02Aul0M+n4emaZAVgqobIF1HTU2qtODADvI5C45TUltnsqcR0xT47ICoemWcbyuVz9E3t5DrujiydyNpsThq6+pxxai7GABUVcWbG5+jA1tXkuf5+Iuvj2K3kIeqx1B0HHxz8hz+/Y7VBEnG9mfnk88eNF1HkRnbn/kR2bkzuGXOQvY9t/sAkKrjzy6ugxSUCCqfawMz4/Spk2C3NGHJEtDachK+7yGV6gOFNOixONjrxSQpE+KJJHzfRzxZA1XT8DejpzBkBcfe3kVvbftXahg2gWWFAEmGQoTM/p00ZPxMNnQNV948lfc0LaMbp87leNzAqOmPsBqLIQgCKIqCoVO/z26xiGTcwLjvPd2tEpRVknGm9TQ810G+rQ3wGAhKKz+5Ngs1NSkoioK+ffuCVB26kUA8kYTnefB74f/g22eyHwBusQjPD6CQhuadTcTMYM/HoNGTuFTTKmLxJBTS4BQd7Nu8iq4YMYlN04THpcx6PrCnaRkZ8ST0eAKuU3Jc1WLYtOT7tPbxB7qddqW182coMSMOx3EARYGuatCNWHkqkyWAfUDXdXieB1U3oCoSHMeB53kYed8PPZzHJt0+8rqqC3nGhNFgZjz3q1ewYftvzu8AdLYi5DhOxTcOHz5c8fiGhgbpfAxAp1pR1/Xys3hciNatWBaLj+Gg/MkEIOyw4zjtgnHBB0A4Gw7CnxwCLnT4A4D0wQcfBOl0GgCQTqfhOE7Z2e5eO44D27aRzWbLH5jL5ZBIJMqfl06nP9PdQRbOG4ZRdigM/2jdV3JafEYulys/i32f+RIIOxJd+g5nOhoMwzDKx2ezWaTTaSQSiXL2jx071i5IPeg2AYDyI7pdxaO6AIis2bYNwzBgGEY7DRDtCrquI4wakXHhrPi8RCJRft0TEwGOok9sV0JiV5zVKxIUGQ1/aaXsizKIIibsfNVrhRGOqUS+2Wy2w+8Qz9WgrcP/AseOHSvv6N+/f7tsRzMinA6fIyyc9WqyHy2/SqUY5p2PPvoI6XQahmEgm82Wn3vTrag7DR/VAWL70yA5UYbRbAqHwyaOCR8ruOicDEN/bPvwww+DdDrdwflK+7qySy+9VKq6BP6YFp0yBdzDjlYqn3BmBflGCfQTCyKcIn2mAlBJWFWq+0pkKhwPt+auyrVXCMhms0G4z0fJ7mzn/uiMoet6ByKr1ELF7xFIiBJ01OFKAerxLCC+LAq1c4mAcJsNwzv8WijKqFTvyYxSScVWVQJhpfdpBUFkX7S4qKQOs3v4/TAKOptce1oG1F1P/pSIsPwDw9CuxPZiX1R9ViqlnsK+XRtsbW2tqg9Ge20vpr0g7EB4nghPk+GpMloeYTLsQZC77gLRqU44GI68yFIl8VGt8BBZijpeSVKL10Kdit8mzo0SYVd80ykCCoVCECY88eFhDgiTYvTY3iAgnP1owCsFoX///h2CXgkFnZRAl79P7sz5qOCoRIq96RLR+g+jrjMRJN4Xj/DEGu0IlYalbttg2LGwo10Fp7dEGR6yokGopAHC8BffHz7/bMVQ+RohoP0V3pWu9K7m6u/uSDCaoXA5hMVXIpHoQH6VoN9FOXRdAuGrvcPOA2h3wwPQ/gaps2mBYTETXVeIOh9FZnjNIrqAEg1qj0tA3BFWX19f8XI4cQMEgHaXxvf2QqmwI1EeibY+sdpUqQTDgevt/xZy+GowYSIY4W2BEBGks535o05ks9kOBBjeFhwQDV6llamoxuhSB4RvbjJNs12NR4NSKTjVmhh8otqiu5WkXC7XbsmtX79+HQIXRo/Y151O6XChZPQO8Uo3RIa5oBck+JkyEo6E7wgN3/TUXVc43+3/AIgzVRMuPGqGAAAAAElFTkSuQmCC\"},animations:Qn()},Sl.shulker={name:\"Shulker\",behavior:In(),entity:Dn(),model:zn(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAMAAADFCguTAAAA3lBMVEUAAAAaEhoZERkXEBcdFB1FMEVfQ19SOVJXPVcTDRM3Jjc0JDRiRmI/LD9BLkFcQlxMNUwBAQFaQFp5U3lbP1uJYImJXolsS2xbPltfQl9ROFF7VntyTnJ5VXlMNUxfRF9VO1VHMkdmRmZmSGZyUXJXPVdON05tTm1+Wn5SOVJoSWh1UnVjRmNWPFZqS2p0UXRKNEqCXIJiRGJNNk1JM0lvTW90T3RVOlVuTG5HMEd3VHd+V36AWYBdQl1+W35DL0OHXYdQN1B2UXZ7VHtrSWtcQFx7WHtzUHOFXIVvT2/IvNjhAAAAE3RSTlMAPzo1Q7G8tr8uv7fEuMO2qgHFATbU1AAADGtJREFUaN7N22d72zYQB/A2zWqbTqmBOMQ9xE1xiVpOpEhW/P2/UP8HOKIUu6/guLmnIWXTTX4PcIcD2OaHp4mXf//98ofvJv56+S4pitW7l3/98F3Ey3fz+VzTcHn3PYwS58wSxpKb74H08u30Zn6ThIwiwcfp2/+T9OPboigS7S4MQ8+DqNUSfOPtjxK/pRyn67pkpWnaKplq2lR8lCBJcl7PN6NupCE2H99/Xq8/v/+40YRuM3/93CRw5vNNcpdwzjmIhG/O8PD5SAMnRCTzfxDv+YViLr67eU4SpXIyS3rGQg+5s/5IGsH5uEYueQyxX6+S5FlySVTWCn9uDw48nwE5iz5DpI10ejRNiq775qQXr28T4iA2nzeCg7gmiUeAoQq11y+emHDNoVX5NBWVhRn6PMyW+ESXz/wRkaYnSu9vRQJnw1OZ9af1UFkDhMdlPhUhQ3p/K9KLN8V0s9kjlZk3xQCBMogeBNWbSO9+v9lMkzcvnp5DqUwenRbD2TBZwvQ1jOfSp5EOUTJNkqR4UtJPgqNRfEKsOWcgPZw9kd70sxrFlBrKm5+eivMHMnm1Ek0COQvOZVx5rj/wH71vKKv1fP6HIMlz5ptVeLcizgPKQHr4Udw5aXVH6S1PwmRp4OwZQl+T5zJhvmaIR2cIvwnRWv/SUG7lJu5NGGJo2OFwYHvkw+brjBk4108GLsUc/+qe9nDhysNv+EoC5Mb5XVGcWoY4fUJCXA/DwHnoGX6K0u4ECFpfUdzF40gG5OYn1Eent1hPtPn7r9LmWjQkEC6XJCxJCXaVetcVuutHkiDPm+67Ts9PGmL+EaUjcvvRybkeKGQzWh04iCSHp00VRQ6k5wBpM613XTcu+BK0FtU/9Ivrj8MAina2XguOi6iysaJkxgcJkOexHKCZF8ZE6vYtC4upID0aBLnYiEwLKgrOSTMjA2hSfpAD5UrlAeS1LqZPF+ndTbXztD3gDLtZ4jB+IMnd9BgYAEWR2kiBpkWuKHGfcFDYIU4t1gB9wzNXxKMc+nLDe6uHovCqLANo15QqQI0ECGNTKTFjVd4D5J2oJXn9iNKbj8LHQTTo6LsilUe93iGVY2UMULBbLkt1VxqGFGjFXIAUJY0B8mZa0sZuXoiKm9PeEIhBREi0VHqESA5O3LaVrwC0C1QVoNKWA90CxNL0ABA75ADNbu+Q3pxUhOQa0luk8oa2A11fTKmyHAdz5QNkNTZAdh3YADUySZ14ACmKW6W4V/nt7JZSFNG2IYJI2D1enzoK6hKtTpXlG4bl++Ootu0gwgoEULOUrLIqBoixvCcYWwEUOk6uU3qLc9l1M53vw/tUPuXHTAVIRSbXdrMYjwEqA1u67BUnBagddY6i5JAR6O7UdfgjsaegXBoKjVI56Xkq6/E2Aygo7UZVg1r1AbIyVZUDxSGVPYtbgEa6AxDWpRgg76QlxYnx9L6dU5OgXLpvEkzv2mprArTbqY3d7MpSJdBk7Kv42pDqZbEDEBvtTwAx5hxoxA7xneet1yvInDwhxJQuI7qKVXnrZwDtGgOAxlguBWgMkFEakiB26AFCEKhSUhOgQ5oDpHmhi8gTj9K7oP3/XjSJWs2y7Vi1bUONAnUH0AIeRISPUqAwxvB0I52D9i1AFXMAwn0FkBdD3HY6QEykchunR8swVCSLurPtGhUGkCE4WRQAVEdySX0A6D6miQsQMgQwE8dFAsWnDqH3jG+/Cj32M4ACWnd2TZ2NAYpw5YHkXja7xUKyylL9DJqOdIwYvo5NkzG3ygHyvGQPUhuCc+eaJkDBzrBtXFQVFEuMzkSAAjWSAq08qjJ9LzT4hyYOoJa5B+biUQzQaqbRYhmHqX80zYwght2g3DlIcCYECoxSBSiS6WW3LZU9IxDFSARAueI49OiQAzTz8jj1d1l2NMflEpC6VhuAFpNL0MS2AdoFks31kD4C0gFSUteMca/uAArDwAiyDN3BXjZRtlABqn0oziAEQEEj3+2Z44qyH0CYuB4gxtqeYO0KoNoI1KYGyA4mE4CCDIQBRCY0VpikQN4qYVTr9wyAzuE5AO1Hukmw1A2DXYAyj9RajQCK/AnF4CFQoFJztSV7mYNFR8HYPIyiBWiEdYkxc7xFnwLIsJG2XHLlEV9j2BqjkW+u6UPQ/Zd7ArHYOZhY9TLMWGkDZHEJ/bqqMYCiaKfKgeI73lzd1degQcio/KvjOPMzKnc78mmGEJcgcc14c12Wcr2M76n1ZHXJuQTtW4BSp0LFA9QEAnAv+YoFUGDINtcwzgHS9e4CRDF8qVcAOSZAWIjVAYT7cPX5vFmlZHONAQoTLM4UyepxUMFiDvJLuz6DzlnNr75lkcgKqNvvJEB9nwOEQRCRPALqAGLKFlsg1QZoca7yAQQOQMetqgIULCwpUGzGHNQlnNQJ0GgAsb4FiFcZMvo8NueqB4d7tqYJULmLLBlQ28eosgKg5EZLvkyc0AxVZroCZOx8YRg444EDUI2+G1kLmdYx5WUfEuhmdiYRiH4RLedlr9Dui/apk8c4R8WkaOwSoJ1kL3MrlL0A4Zh4TxIWuqxQYQp+OYEBUGapQiM4CzE6igIQrmhkO+MJmqubE2hGoJube1I3gND1K4DQXHclTBejs1iIyQJonB0BaqSbqz4FKDVTAs00DaCLiRtREIixA0A4J1PZD5MFkJgsZTuxLIBqNQCo+SBX9jFAJgd9Go1uaeJubruLReCQAtTqLOLNNWgmYrIWPHfEZBGPQKgyOknLgWKlGkCYotsZDZM2LAJorjFAug9QieY6EZO1oNyhAOcCZNRyoANA2KtWAwgkmrf1Jz5KqylAjlIxgKjMCPRlskxTcAZQFEU1QDLN1XFiEyDnCwgiIgG0Xk87Ak1PjKos7ifHiQqQYVGAg+CcAWQuFgDh7CgFOnjxBUiIcGZeI2a3xYpqraeyhwqgeqcKDsV2aK4EMgmEI1skA4oB8qanGCAkzvl0hvgEEBYBDV8UuSNABlUZPIIz9DSe5ASypEFe2HseZmh1EqAhQJpRLml7aq6V4ijjiMo+AkhwBOYSlGUASZ9c3ZDXukag69hPKZdQYby5+lT2gT8BiHsGkFgGtmkKUB1EsiDThGhG8QCkn24BYm6ai+bawPMAJJLaH5sAUbuTA8UhQDHzOOjT1aaaQLo2W5/31Jaqqg9A4y8BkGnw5hrVclvYFCA20v4LdFu5Yk+t1gFAfiRARLmOLaYUoFp6T81yAo0SXQNoiDPIxFzwbg8Qmc6gy501YqESqLGf4IVVWrkAMca6SxEH3d4QCGYC1TjODyDEsLPGVAJk4HBL7UUqqVv+nrovErq7+8tJ46CZCxBr2wM/J9c7Y3EBEh7fUi2A6kalH5F9LazrrXhP7RDs0O6HvVnCQRienJorvRVvyuWSg47DAGX1UgUowyOASkOuuf4JkH5IAULXJxDrH4DwyBEgQ70E3TexhiBRRI9wMwD69QeJ+PlPgNDuD9T185SD9uJgTSAUXw+Qkua6Ra/syqVtcZDgiKPzsm5KelTyXvbrTxIcQULGTiYKQGgRDkAn1opc6ghEB5MvJ1fVMOphHcKEZQCVSBzxn6UAEhxZ0iuAjk7l8vfUBUCsikXFzQBqmVMJEDKkrq1sLDrrIkIC0Uqw4/vWBqDfXkhSBtL46DiMv6cOw55gJh+lzfwGINeFyDyiuRp1MNkqAPnYiAAUNUsClfYHgH695MiTANJ1h0Bu5QLE2IlAc08HaIuFOAoAsviZZ6suAYn8yOB3wwBIcJ6URCAnzUO0CjcFSMeUAeSFBBpT2QdjBYEmQZCgVOmuWgvDaJ6cI9KbQGMqf2ooBGqLGQelR4B2VnYE5+gTBE2iwb00IoAGzpOPEkBjpSKQUjGAWO7eAZTnKdI3y47bjGodnyOAdmVjAHSVyk9PAshxev46uE8AwvzFbh6GAUBWpKoABY0REYgy2fimHEECqNXFe+o0PtA9FyCDn1x9lDlAhlEC9Mtz/L+eP70CSHdSWijRUAjW3oVBxF9Y4cbfV1s1QM/BEaQ3VHBVdaDyz10mTq5iv7MDqFQtgJ6NI0gAjccEYnEVC1AZ4OS6oyYB0LNyxMQRyEl5c3V63acdPEDlhyVAvz8zR5B+A8jRW95c48AgUGl8AEhidGRHCSCd8ffUNUDYEgH0i8zfW5An6XqPdAKoRuIAJM2RT2+AtmMlsjKA/ncOxYtXAOHkmlm/fw8cTvqNQL9/L39ZSZCeanT+BfNRUqWn8JL9AAAAAElFTkSuQmCC\",animations:Un(),textures:{undyed:\"data:image/png;base64,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\",black:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAT+SURBVHja7VpLktMwEPWaOB/no0yS+QNT3I0VSw7BBTjBLKBYUMWCLQsOQHEANhRLbmDyFD9PW5YsKXGRxEmquuy29dTSa6nVUpwopZJdZDyZ51dXd1pwD7m8vNUymV7k2VhVdPl+mM3y/mBSEZ+92PI2mV88SbIrAejIYDTNh6NZPp+vtOAez5p0CMhAJ149PCQUnz1ZdlsCKAvVAgHwPDt/c/NcCzsq9ZlalroqSMDoOHoC4EXZ2evrey3U5XOpA9MfTo6fAHhREuCS29sXVgJ2tb93AnQwM6aATxgHMHqOngAzBtDTeN40/DUB4w4QwBggO+m6r02BwaQ7BEiP+zp/8jFAdSkGrFY3OslRWwRBrCCdmQKyg7bpcIhTQLVJgFznzTW/iYB9JkKqzWWQqS4Cn0yFpc6giHtMm33vBVRbQXAwnJabHQY4PDM3P4e2GWqFAHZEb2wwpNeCBEd3rtDxjp0t34/n5RT439vhCgHcz9/dvdR7dOiI7NC5x+d76igHHd7EHp868a7yZn3A295Dv79/qNVH3WXf1V6JR3noqB/4SiobeuXwhgeZB3DoK/GescFVD/DSPqeRWV/NfrHsSvsx7Zf2EzIp13IlGiPXbWXoYJd4mQy5ys8teHqC7xk0zfK29tC+ctQ/D7BfyeRsObx5NZcx24GIKw2Wz2wjKDSRopOkfXngIpdj15JcjgCdjgY03pXJYU6FNJ51osFyNygTKV/+UFtGDbyPdIln+2u5vKvzaBzfsTyCJc8EfXhZD/HLNR51uPYSrg5JvByBLE8iXW2R+ETOYdcpju00hx7kHAQJPs/J4UsPAs9AGXqq5IpBsSMY9isjAN6gVyimbpvDHAFN+KUDLz3owvjsh+ClfQZaHQPkHEYhX+IgGTfn4DZ42Cd+FYDnqsFUWsawGHw5AuSStQrsAKMuOiyXmBg8y2+LVwZeFXM6hIBaDOA6Gsog5yznMBuxjPWAmMPw6Cp2BE2qMSR0BJbtRx6wWFyVSmgDYAhDF3NINia0AbBp4qGHOgB47i3kdFhF2OdepfUDBnOz4tu8PEtH+S6y993groJO9Ppjh2TlfWp53ykCNtcs2PMdJeDpKr1v8/zBELDLoQSw0vNm55o83zECxrl7JNg9fzIE1D2fnd4IaCpzJqDLBDQFv84T4Fv+Ok1ASALUqUQo9SZA2eEmQm1mgjHSOQK2kYMk4Oi3wzzn4x+Ypni/F2DZydMV5+/8gzQYX4jGiWsInmVD2m+tgN/28m9s3ENCIj7wEhuNn8wrOFlPqP3S5nDqtd/YgEonhhEEFN8L6KtoRCyBbDj1WAIlieEEjO0VxHigNCqIiMIL4mJHAIa/xPoITLDGyo8W2ADbKODhJcqXa3NqwQvWK9d1vdPZosSnxRpPPOeubfpQn82WTjylJF8SUdyb9hOtpJvOoMBmebHrqETq/OIjFG/qxDvtjaZWvefAb9qXFXoWZD+hJ/mw6ZoK473CSBM+9dabVUaSzY5ZvqKnbvu9Bj0V9SX8TgcFeOCgdR48pIbO90X5Gj7NonSv/b4D3/fY7zvsG/Ulrt+vP4855Pffj1qof//2TsuHx9daqCdd+8nOSxJOhgCz85QzAWcCzgR0iwAz2scK8S45ymjfJgkHT8DXL2/zNuTzpzdWOZopYAp+69ell3GPn6v8j5/vrXK0BDC4mcHvZAiIne/HSsA/K9dRSVpLRfEAAAAASUVORK5CYII=\",blue:\"data:image/png;base64,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\",brown:\"data:image/png;base64,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\",cyan:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAWtSURBVHja7VrNjtxEEPaZzR8ka8gLRDwOPxMQCHbZ5U8h0qAQoYiA+I3CCLEzZLUnniAHEAckDlw58ACIB+CCOPIGpr9yV7u6XLbbMyPW9u6h1O7p/rq6v6qurvY4y/M820Seeu/jIv98RYLnsr4kuTr/rHjynXtRXbZfefNucenVW5F06evb35Knn6kk25QALOTy/ry4cnCn2L23IMEzfmurQ0AGFvHsjRsZS5c+2XddAliu51shYBUWnz98RMILlfVrdx8U+dfHJLsfPiQMvGP0BMCKYbFY4IPvSvGLJUGb+g2YS6/dHj8BsCIRIBdsyeI4eAR7BQjY2ANPfwssa1ugZn31G8cBCojjJ0DEALY0yi9X1aLZ/YX1iYBb98dPQIgBWCRbu+mZSeAYsOEeHhYB0uLS8tL9Jx8D5EKt/c/W98fgNGLAp0dlkuMW1XkSqBhAWeJktoBcJLaDPg20FwxgC+RbJWAhXH/RfgwOJRHKt3kMhlTXBb6QCuu6Pw7xjG1z2neBfFtB8PLevLrs+ACH3/TlZ2iXoa0QwAuhiw1c2gkSHFqcr6ONFxvanfAW+L+vwxEB4T5/dEJ3dKq7yF7WV0Xcvqru864Oa+KOz/WAb+ivxwPebnf1pTXeskN/03wrfNl/ReMDH6WyqSW7N0VxzgO866Pkdo4NTeOU+Eo/byM9Xk2/P3Yj/T3mL/VnzGQ4y3FOYxF+MvLywmd9dJnxeHkhauqv2wm/VHgfNGVyJckx9QuSavpa6sDHmZzO4eVFRt7nZSprvBCp9deXIpkHCA9qzSL1MRo8QJ1C+gq+qKfhUn95jmvl1guNhkwOe4o9p/UazGO6JEneBqNESuYSluhjVOKl0Sy9ol3Ov57LW5YDeFG1hf4Ilv6dYA1vLcSPE/CffEtj1DxIe6EyToSXHsj9F/ZbKB5D4jO5hxvf4iyOa+4T7vN+D4KEmrdYVvDuyxYEngNl6x1CzKcpBrXeQq0XMk5/7AGwqLdKEF039nDwgDY8lzX8KtZvYaTou4SefxOen71nhBgQ9jAmhk5dyYNgvLaH18CTfnZ/TLALvzyJUukohvXABw+IjqyUAdwCQtR1C46OmB547r823s83mn+KAZYnRgzw52gqg7xnQwzgPZg4AWsPUwxJJEDjQwxJ9MAwf+QBu/e/qQZLnAAUwXWxh6LJpG4Bp1PjKUVNdWGHh76Lr7wbbYdkAj2+zAS3/IJBX1a6Li9PPPd6sYmc/nV4Q8EiLtw8tGUmnl96q9Y+KQKonB0mW36aBIgysr5h+cEQsMlLCWCl5fXi2iw/LQJuHjaWTZY/MwTULD87gx7Q1uecgCkT0Bb8Jk9A1/E3aQJSEqBpJUIuzW1NgGYDToS2mQn2kckRsI4MkoDRX4f5PR//gaml83sB7stj+D9O+Q/SZLwXwokyBc99U+ZvDsDf9vLf2HiGpER84CW2N96RJHFynFT9QefevFN/6wSiRbjB8AoqiQD/vQCVYhJ9CeSJc70vgZLEdAI8g5YVei9AENELL4iTkmIAuL/EdhGYXZgdRB8t8AQsL+CXl+gPXHlGG3jBelS6ca++/0XAX3z57QjPe9faPly/9sFXlX68JjP0B/IlEf5Z6gc+Q2XnxTdoMeiAcueFfbOOQWQdFumD13X+YqTW/vxeqW9/bte9vqBfzm/mx5+l6c/YkqyEG0Mpf3eMsXIqgWW87o8S/ZvGpUkKPI+r9Uj8TNdb9Gu8rPO8HDbj73RQ2aEXDgfJdZzDwMMSXO+D3/F4OV4KnvVpvDW/rvGyorDlr38eF5C///2RhOu//3ZE8sPj2yRcbxpn6NJKAC9eknBmCNCLZzkn4JyAcwKmRYCO9n2F8U0yCgLWXXwKCYMn4NdfPiq2IT//dMeU0WwBw3KuNQtWzihcFI2W/uPP700ZLQEc3HTwOzME9N3vYyXgPx09JkRzSwtlAAAAAElFTkSuQmCC\",gray:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAVpSURBVHja7VrNctMwEPZTBLhDSZw0IS4USigt5W/gVThx5CF4AZ6AAwwHZjhw5cADMDwAF4Yjb2Dyyfnk1Vqy5ThDE7eHHWctfZL2W2l35TYZDAZJF7l1cJgvTs6M4Dfk/sMzI9mdo3w2v+3osn1/luWj8dSRpvna9vfJlaulJF0JgCHj/Vv5ZDrPD4+OjUymmXlX6nOlZ+YdyIARw729hNI0n+y7LgGUa4MNEADPwyAYdnz21AgNlfqdu4v84dkzIyQBu2PnCYAXaSyMe3D6xAiNhaBNvwNmNJ7tPgHwIoyRxnnl8XO7I7grQEDX+c+dAMQAfQS09/U7HgHsnp0noIgB83IXLD2N5+LksTWY21963wTBrAcEMAbASBoY+k0Syhgw7Q8B0uPS83L79zgGzJ1AKL2tCShjwLwfMeDo+JEtcpoygY4ByCC9OQLSSBwHHfl9u+C8j8BgowSs8rzMBKE0uC2F0GCTaZClLgIfS2GtMx3iN47Ned8FBoMNXoaaLz/Z1l2GNkIAK7riYjMzggKnMK7Q0UZjbXt2aI/A/74OOwTwPn/67IW5o0NHZIfOOz7bqaMfdHgTd3zqxIf66/GA97VDf/T8ZWU86qH5Q+uVePSHjvGBd0pZbtOwPrfnl0FM1gG6nbFBt/MJvJxf4tab39+/+swsPiGTHJR5WuZ2CdaFDPFsl3neh3fuAks8PcF2Bk0uUgbNmPnlZStm/c5tTtfw8iIj7/OylJUelClP3//1O9eD5WJDVWQojeospK/gTMmyDJd4p5AJLV4vSlZyOFPyg0go/3NMFEnyNugUUrKW8EgljQq8dJpvXtku11+p5X2eMwMuF8c29kewZBrUeJ8hHMfiH5yaMfQO0rtQO4c7Bnj5Sc72XxEZcqTEJ/IMhb7iyK85zgeNrDyDIEHvFp8XtAeBLwJlVnuHkOuRH1R86/fdQqsfZIod6OwAeINesaJ03xnmDqjFr56hM2zxHowUfYZlDKnFr35zZ9gYwDOMQdGpqXCQjOszvA5exhAssAnPrMFS2pm/Bd7uAJkiYgaAAYy6MHg9fOkxmbLWx5cxJYYA2V94JItmkMWNjAEGH7kAXx6HR2MJ0DGA64ndgXb9qAPuLU6sErsATIStizMkjYldAObUeOixDgAe8w3Tfec4xK6feBMDNv2BQV9Wmi4v128M8y5y7rfBrgIj9objgKT2983RpNLeKwKKZxrt+Z4SUD6l932e3xoCunyUAFZ6XhtX5/meETDOwzvB7/kLQ0DV8+nF2wF1fS4J6DMBdcGv9wQ0pb9eExBTAPWqEEKZW18ApdtbCG2yEmwjvSNgHdlKAnb+OszvfPwDppbG/xdg34Pyie/v/ANpNH4lBieeMXj2jVm/dwD+eRtP/obERHzgJbY1/uDQwclxYufn/yoTXzd/7QK0EfgEFUuAFOLbEqjHaEdg5pAYT8CKQZ8XuhmQtcJr70NiHDBdbn/f7g2tP7lxM81Hk5lzTtzJM2cR/JgJHCKxwY/9eN/zAPhJgUf+l3ieXd/xoX777sLOr/EUH46/9fxJMdjIGANjTXrZoz53dAwidXikGMzfv0k3mWGJr7YP1Xyuzvk4v7u+dKWnUfMn9CRf1j0Lxkd2EcDW4U2FVzOexHNcPY+LS4P48v1QjVfVi3UNDTYBg2ACCvJqsaXidewgeKILvu38cr6u60/y3C+//rzPIb//fjRC/fu3t0Y+vH9lhHponG2XWgJovCThwhCgjadcEnBJwCUB/SJAR/u2QnxIdoKAdY2PIWHrCfj65U2+Cfn86bVXduYIeDy3bE2slxMTLvKgp3/8fOeVnSWAwU0HvwtDQNvzvqsE/AO6EvOWwzwL6AAAAABJRU5ErkJggg==\",green:\"data:image/png;base64,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\",light_blue:\"data:image/png;base64,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\",lime:\"data:image/png;base64,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\",magenta:\"data:image/png;base64,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\",orange:\"data:image/png;base64,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\",pink:\"data:image/png;base64,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\",purple:\"data:image/png;base64,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\",red:\"data:image/png;base64,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\",silver:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAWASURBVHja7VrNbtNAEPZTBHiBiidpadTQlkBVRSqqeogoRZRKRfQnVEBVVVXbQznyBBxAHJA4cOXAAyAegAviyBsYvjWfMzvetddJVBynh5G99n47O9/Mzs46iRqNRjSMbGysxUdHPSO4T9r7RjY3u3G3e99qy/dra514eXnRkiJ9Zfu75Nr1vkTDEgBDVlbuxaury/He3hMjuMezvDYEZMCIm1NTEaVIn+w7KAGUG42RENBLjT89fWWEhsr206eP4rOzQyM7O48NBtEx9gTAizQWxp2cvDBCYyF4p58B0+ncGX8C4EUYI41zyfn5URoRjAoQMKz+CiyB/cwS0N7Xz5gHED01IKCfA+hpXI+Pn6cGM/yl94FZX18dfwKYA2AkDfTdkwRGwbBruFIESI9Lz8vwr30OkIa61j/vuQ3WIgccHu6aIgdGFe0EOgdgB6nNEpBGYjnozK+joApLoDFKArjPy53Atw1WpRBqjHIbZKmLxMdSWLe5HeIey+Z/nwUajREehnjYYYJzHX6qdhgaCQE0BAkNIQ1BgYNnbOMdjeV7CJfAZR+HLQJ4nr+4ODFndLSR2ZN2L7bf99LzPNrwJs74bBPv66/HA979fj9+/frUMd5+gX7ffPv4pH/PjA+8VcqGXhne8CDrAIY+rnzP3OAbJ8H3MuPq8Vz68VzqLzN/qT8ikxwUGVsaIQ8v3OvlYYZ4eSDy9dfvgacn+J5JUxZXkhyXfkmS1pfXBt6q5HQNLw8y8jwvS1nXBxHdXx+K5DYoIyivitTSjwB7F9JHcG7JsgyX+k0O0MpdHzR8lRzWFCMn7xjMMVEkydOgLKRkLeESvY1KvHSaS698L+efqeVdngMYk+M79key5Dao8S5DOA7xL18+M2PoCNJRqJ0j8TIC2Z9E+hwp8ZFcw76vOPJrjmQQHuAaBAk6WlxeYPjSg8AzUeadIeR8fDko7xTq+iAD/VYEwBv0CkW3XWuYEZCH5zWL71n6XRgpeg3r+fvwvGdkpDmAaxiDolNR4SAZ12t4EDz0M/wxwSI8dw2W0jKHlcGnESC3rJABYACzLgyWW0wZPPsPiud85fxDHAACMjmA+2gog1yzXMOcROgEXGsYHg0lQOM5n9AIZH9TBxwcbKeN0AlAEUIXa0hOJnQC0KnxaIc6AHjoW1qat5ZD6PyJNzlg1B8Y9GGl6PAyNzcdDyP//TQ4rMCIxcVmobTbc5lntSJAXkOk1gQURUOlCBjmowSwPgKKPD8RBOR5fmII8Hl+oiLgioBJJSAv+dWegKLtr9YEhBRAtSqEUOaGlsS1JKBMCVzbUngQqSQBY38c5nc+/oCppWhA9uMY/OGUP5CG4inAyWsInn1D5u8cgD9v82ds/vwdkvGBl9iyeJAkcXKcUP1SZ5H+3AloI/AJKpQAKcSXJVCPUZZASWIwAWTQ5YXLMEASqJ0Q4oBud8UZvT790cJCM+502tY6cSmn8GMmcMjECwuz1p8eNAH6urX1wOgD/u7dVpzov2Otc9fyYXt7+2GqH/WDxFNcON5L/cBHAM/P3zLGoAOut2/PONsYRLbhEQwWitft5B8j7cz7Vmva0qfb1Ef9vvmF6I/oyVZrxnrJq3wOxqgcV2CJ1/1xRX/fuLhKPMfVejRethF9Wf3T1niudjKvaYONwCCYwGDYV/EwaTf/tWdVu2n1RwTBE338rBovv83/Cfn1NzP4RF/zH77tGb/p0W+PF8WxW378ehtDfv5+b4Ttr1/Ojbx7u2GEbd84VZdcAmi8JGFiCNDGU64IuCLgioB6EaCzfVkh3idjQcCgxoeQUHkCPn/ajUchHz9sOWVsloDDc3/fRqmXI5MuYq+nv31/45SxJYDJTSe/iSGg7HofVwL+AJn10znH4i6IAAAAAElFTkSuQmCC\",white:\"data:image/png;base64,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\",yellow:\"data:image/png;base64,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\"}},Sl.silverfish={name:\"Silverfish\",behavior:jn(),entity:On(),model:Yn(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQYSURBVGje7Zi7TltBEIb9GnkBpDQWiIK7uImbBIoimpSUpIwA2xhjMGBz8RVsSySgdChCSkudIklFkVSpU6TIW0z8TRh0fOJjsBN8YuSRVrtnd8+B/5+df8YbCNzY6uqqxHfzsrW1JXNzczI2Niazs7MSqGH5ckoyZxmZnJyU6enpqj3PvvwMtKV1dXVJPp8X+omJCSWAvtbecO6NxBJZWVhYUBLamoCDgwMFXRmq9+l5TiaTEg6HJR6Py+bmpoKEIOZ3d3clFotJoVCQTCaj7x0eHooRYK0tDFDZbFYSiYSkUikFViwWFdje3p5sbGwoCc1824h4Hn9ZRYw9X0eeVM1b85p/UHLxIkcbHVhZWVEdGBkZkcHBQZmamhKvsOHEuOeXri4DoQ9Xv8G8f6o933b2tBf7r7SvOOEP0mzNi8QHOQkIW7a4p0ca4AMDA9Lf36960AgBWOH6YxVwvkufKyWregiCMMxIU1IqQmtjJ2n/nACAE8u5XE7je21tTXZ2dlQQj4+Pheywvr4uaAW9ATfwzjFr77591e9+/vH99h83sNF4WiK5M6F3zrPX3nWCdO9zzv0zQ7yOjo5U6EzciPvz83NJp9MqboRENBpVghrVAEKqXixDSIXkqneYa5kG4FlA4mmAb29vawjgfcQR0KFQSOcgqFECrj/1eIIwb9bSgJaLoAkhRGTPssKxIwyYo9jp7e2Vnp4ebWiDuwCqZXd53zSg8jfufWogjf/twVIigC1WeYYQwPb19SkJ3d3dMjw87FkkuU+AebneCXCHgK8nANAwTEYAvJXGpETAB4NBzQxeJ2ApeHnbbkgNLC8vq5dpgLXGPL3zBLTcyuWyFj0oP42YJyugB2QExPHk5ESLIzQBHWDf/v6+7mUd3fAi4L83lB4CAA0ggFMVWjagMQ949iCYZASAM2bdSuW2JMDKXov/SCSiPV5lTBl8cXGhWcEI4DcCeyCJ3is9vq2QYI2wsrF7zWtPywjAuwCzIogTAHCAkgIJk1KppARACuucHAoj3vMigGrOACF49QhwrlNA+XIanHcC1P9DQ0Oa8pr9nhtYLQLsbsGebeyLaRao/EMQgfKPjo7K+Pj4XxHgbJBbLwSchPlGAMePfn5+XlPfzMyMNAO6bczSGTGOuiNspDqLc9ZN7Jh7dAScnp4KDSEELOIHGWQFBJLfChBh5Nz3u05FNzGk9woP34gDPIDxOlkAlSevQwaqTxFk4J0Fz31OQijzWvcT187e1mu94+/1WMVDeG5xcdHzRriZE+DlXd+97zY8xo8g6nyvW6BGBdE5doZArXXfjRyM50iB7uvuRs2dzu468r4RgPjZzbDdAvOM+FEi2wVJ4LEa4gdQFB/x43qMtIgIQgrgWQ90rGMd61jHHp/9ArPVAQOjxm26AAAAAElFTkSuQmCC\"},animations:qn()},Sl.skeleton={name:\"Skeleton\",behavior:Vn(),entity:Nn(),model:Pn(),thumbnail:\"data:image/png;base64,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\",animations:Ln(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJSSURBVGje5VhBjsIwDOz3+BDSXrkv176A04of9ANojzyhDyk7SINGXjuN2qYNFMlKmtDUnthjJ00z8mvbdoCcv88D+1YwF0nz7j8Y2HXdcP25PlsVAhC9+xEAqMERCLsB4HK5DPf7/dkSjF0AAGNhNEFQj/h4AGAkdh1Cg9HfdQjkckBq7u0AoOt7AHipcCxDVOXilt09tvfGUvNc11tf56sDwFP293Z7cQD5AGMpECwA0dzmAMC1Na15hkP6vn+FgEoEBNfl2p5grhoANL15ho6JJctcqaLUpWBXQGDW1Q+Hw1O42/qsKZLv2rNCZHwVJKmMzZ0/nU5u/GLcm4NgnJ7gZYboAFUFAF/H40tJGqrKc8et6H/wDo3XNcdkcwCsolG6S8W8kp+uhbXHpJp6gB7AtiTnMGws/wDE1HuqYxHFin5AKsu/XwOh8XxOAVBsg8jGUVui8FKD9dkrjIrrR1ckgdnnUmlXwyB1tC6unx50vDaHOzTNRbGsRmoa5G6iz6qRfRo6R79sAOylx5xSFQYoCOjn8Ir3zRL6/VOW53xUdop+jovpTtoDD9OlHfc8wIaCjun5wraLXXnpoUbz+VRe0VMf+2PvUQdvLQ0TbRchpRTTTuEArqulsRJaxAE8gVovnKNfdmEStVM9QG+TdCzHc2waTBHhInVAFF9TAZhDgvabGkJeu+h9wNbndc+tiwNgS+C1SuJUubuqfqn4X/vCwjMqtftV3CmCtSn2dkh31t4y2fe0wOHxG3Nvca2uKYs1hdYSOqapTcnWuzVeg4MeTnd5NL9NS2UAAAAASUVORK5CYII=\"}},Sl.slime={name:\"Slime\",behavior:Xn(),entity:em(),model:am(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAFUSURBVGje7VaxCsJADL1ROjn5DX6Fi5ubq2NxEAeX4iT4Lc7ORXASHB38pUoOIiFc7zzOtpe7BkJLMr2Xy3tRyhHVs6xP771O/f8q9Rdyc13Wrr76MWbzaUNTxRLlbfUFQ8FhuvriCeBAASRO3kQE7/sCj44IBIcAaeLEbX0fAoqiiJcAChgmDDVKQFs/CQ3guw01fOauvngCcKfxmdNpa/V39JPQAP7UbVrg6wK2/e+FgFCf/8edAOAhRfp8aB/BD0ZCqM93fSdE7/Oh/V1VTET7fF93QrQ+39edEK3Pd30nRO/zXd8Jg8X6smh8UqUWAOr8OOg83rc6ESz8014WBMDXRADWkyQAJ28igJKQ9AugJCABdPpJr0AWIugLNDli+E5ztee77hJHcdpAd91EAN91W91EjGixM9mdrW66G8QRwAG1rYBtNUS5Q/YiOMYYY2QdHxXvoz3tkDSDAAAAAElFTkSuQmCC\"}},Sl.sniffer={name:\"Sniffer\",behavior:om(),entity:nm(),model:sm(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Am()},Sl.snow_golem={name:\"Snow Golem\",behavior:dm(),entity:um(),model:hm(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:_m()},Sl.spider={name:\"Spider\",behavior:vm(),entity:wm(),model:Xe(),thumbnail:\"data:image/png;base64,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\",animations:et(),textures:{default:\"data:image/png;base64,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\"}},Sl.squid={name:\"Squid\",behavior:km(),entity:Qm(),model:Im(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAHJSURBVGje7Zg9TsQwEIV9BhZptS0NRwCJhgvQIMotaCiRtqSk5ARInDZoLE30NBr/jD3Z4CUjPSXKzjqeL479nBCMcXV7N6FuHp5myd8aFRqltuMesmjS/fPbLA0IXX98/YjCcxRdHw4AF/3y/jkLIXBnuMDT4TBRyCO30wggO6IWAyCLP339RCEEBEDxvd9HUeEoujYkAHzyCIKO8hXgQul4DGEWQyFIwwDQhr4UPNF4zkNeAuDXYDgAueI1ANrTZwDDvQItAHgEaACGGwG5OYCLRwBUnJwDcAIcbg4oLYPaKoDLIBWMR/YGwwHQjJAsXhohaYbwf6sA8L7hCla4G8B0yWoa0jisNW9fGv7nzncDIG8mb4odRNdX2gtg+z35qf64AEi5u1QH0ftrkvmlZbMn3w1A6anWdlAaIR4xlvYt+S4ASsWkCqp1gqV8uXmy5HcDaLG2u911NDEyj4J+swLoyV8FAIcGgN3dRQP4Q/lZo3R2APhVaBgAnpOaFwDDKuMDwLK9TeWnvgm2rDKG/vgAyHUy5QNSxqnX2Bjb9wPQYlVrrfOC7fsBaNms5FTa3NTkV7TvC8Ba0BL5KSVy+gBsscUW/zp+AYIqBnxKiWVbAAAAAElFTkSuQmCC\"},animations:Dm()},Sl.strider={name:\"Strider\",rideable:!0,behavior:zm(),entity:Um(),model:jm(),thumbnail:\"data:image/png;base64,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\",animations:Om(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAYAAAC7gW9qAAAAAXNSR0IArs4c6QAACfRJREFUeJztm01sG8cVx/+kdvkpkuJaYWVFsp1IUSU5thXFcaMe5AZ1UV+MAimCBOgh9yZAg16KtECAHmy4QJtDEBQw0EsLBLBR1E3RSwoLcCygcG3DihAnluqPRLYZR1HopUhaXPFL7GH9RjPL5YfMJWWr8wMM7c7MLue9mffmzZu1C01yenKyTNfXkikAwFA0UtGuWt2lpXsAgEyxIJSHFBUAMBPrxjN3v654X0hRcTW9jH/c/crVTP/dzTzMY6wWatZ7OzrQ7w+w+3OjzwEwBbcKz5fbCU+MhrsesrfrKE2/AcDhv/wW7x15C0PRSFVFxDxe4f7g1U8AmCPJK+BOdqXmb/UHggBMBdEsaQZHZsB7R95Cvz+AiMdTs53fV7vD9YRvtM1GaFoBf+/ZiaFopK5wVF/PVNpN0wrQNI3Zcyqfh9+nIuLxNCyonf23E8ecIM+Xy2nbcjulXO/dzq7JvmvRSJuN4LgCSEg7k/D7VKGc2pISNsMHNL0KkDcn/D4VWG32rdV5ZGeAsVqoOfp2NNqO55FbBXgaFcjqC2oFO62maQVcS6agZ1cF4SMeT9WYwFgtwFgrsXpeeH56V5vqj5wJ/Og3ryKRywlli+na0zSRyyGVz9vW9QeCTEi65v85TUuWQcBcCqvFAkPRCM6NPsfih0bhl0ynaHoVuPXHjyp2eLQS2PmEi+MHhHvaC1BcT4ERv0eg62fufu1I/M/jyGaI4O2erlP5PCIeD/vLo+s6AgD6/P7151Sl7jWRKhSb7rPywYGJMl/w0a5BocHhhRvC/fAvjwAAzhw9hX5/QFj6yK6N1YIw+lSeyueh6zorj8xcwLPatqqd+yydxrPhcNX6uHEPl08eK3/y+w/hd3cAAO4YWcQNAxM277XWGWsluP60/4CggNnlZbOz498DABz84r+s7qmuMC598y0AoNu7vr31uztgrJXYNUFl1jb0GxPaNqENTyKXQ9wwEFJUxHxe5EoleDs6EFIUZIpFhBSlok+AmXe4ef8+Bjo7WRk9myuVEDcMYca5ju/ZJyiAiBsGAHN68tcvfOcJAMClb75Ft9eLRC4n/OUFtiqhGvyzJDj9Hi8YLwj9tdYDpmmQ0nhShSLzN2RSVRVgffBqepnd9weCzBnFfF42GvWgkaO/iVyOdcoK38la/QIq/QONslVJfB3hent4d7naD1kb14NGkZ/uVnjhG31nplisGPW4YeBOdoXFBjQgEVWpOgMAUWlxw4DrzcGhcjVt09SuBtko/yxvBnbw7+NHv9pyeCe7gtFwl+AH7ASzClltUKmO/rqO79lXtk4lu2lpXX8zxQJzNFYT4B0hj92soNHl8XaYz+dKpap9qWceVnjBgXVZFf4GWHd+9EP8qPCai6iKIHg1oXnsVoiQolQogL+PqIqtn7FTHAlqh53wgE0g1Of3C9PY+kP8w1rAJwQ81tDX71NZTMDX+X0qejxB9hz/G3ZTPFcqselvx9loF15Kmk6aTIVXBD9wqUJRMBHX8T37yna23AjkJH81exmuDgUfHJhgAgKoUA4p4mcXz6NcKuJ3Y89v2NESteycsFOmdRawZbCRF9rR7fUyr08zwi7s5UNiPbvKnqF1n1cCeXiClt1MsWCrLH60BzqDFY77/L0EJrZ12yqBSczbCF/Gd6g/EBQ6wJY9nwo/VPz5xs16+gIAvD44AAAwsqWKVYN8kHXrS76I73y1OMDKO+++gTNHT1XIlSoUzTiAb8y/7PORvevlMxcAiB642+uFFvAxwXkF8aNqvabRfX1wAHp2lY0Yb6cxX+VyWm/5exhqRoJno+tnb7GeHdg996nQ0W6vF/+8+xX6A0GMdZltaWrbrQr8MpjI5XD+XgJHep9sOCiSSJyn4mz9J71PCiaxOijmB/41fa6p8/hHjQr3afW+F5I6kukMACAaDrWnVzZkF86WA7teclz5jqbEWkF24WwZAFohPNCgAjZj5ElwoHXCAxDjAD5mJqzBkXVn9v6Na0117vTkZFl9QkPvK2a2eOTFCVbXSsEJYQY0Gg5bP2tphpenp00h//ahI+/bKLYHI5+P7EW31yuEqVfTyywtttkfNTgJU8BMzNwskNDnnv6u0PCdd99oY7faB1PA+FJC3OtrGhK5HCs7c/SUI5+l1ePyyWN1k7ROUuEDeKfX7fXi5v0VVgdUHlk5BQn+/Gu/bmugJSggvnccmqah7+Mps6AziPjecSwt3sb4UgKAaP9O+ILTk5PlnT8/DKD9wgOAMqW6caiwhplYN2JcxUBnEFf2TwDcUVa1z1ab4eXpaRempx1950ZwHyqsCQW6rmOgM8iueWgWOH1CWw8+KHIaZgLjSwlMJXVoUQ0ncmZWZhjAcmYZelIHzRTAnPrsrP7GtZZ0rF2RIFPAlOrG8MiYUDk/NwsAGB4Zw3JmGfjyC8c7wEeCd/96Eb2vHGDRYDsiQdePJw+WPcEwFuML0KIaqxgeHYOu65ifm2UK4NvoSdM8Ll258lhvjxUAyK+kkUxnkExnEA2HMDwyxuxfi2rm6G9RFMAcTdrxaVENmvZglB8oIb8ifvp689YtDOzc2c5+tgy3ntQxPDLG7N8TrP5FRjKdEZTVDlodGSqU7QEg+AAencsKkZm0El7oVgdHSiadEgq6Qma8z8cAJHwmnUIoHAGvtGahSJBWAGIzokLJ/yOPRVq8VRlh4BFPi7c6IwwAytvDu4WCelvcNweHhPv3m9wLWJOiADD6/YMor5kfV7Y6HH7otLhTidHNTooqAASb58//U4Uifgq3kCXKPGjPCf9YL1c1P5e3+2iCaHdOoFW4+XQ3AJYO5z+OsGOrpMbdQGXKm1LilCKnlPlWxD0a7mLfz0RU8xNW2g1SGaXCtiJuYD3lnSoUhdOgm/dXKnwAb/tbwQ8IJ0PxveMAgMDHU+j7dAbZHxxiZYTTafHNxm217yv7J1hWmKA2U2rL/o/VpuG22jdtgwc6gxVpcT6FvhWmP/DABKZUN/SkznJ/J3IGTuQMLC3exvzcrOAEr/dux/Xe7W2Z/u04J1QAoKdvF7pCXZifm8Ui1jNDsZ4diPXswNTcLKwHKK3k8slj5ZEXJ9rzgcSU6kYPVzA8MgZN0zB/dRZLi7dZ+WdPPY38Spqlw506GOEzQj/8wy9YeTuEBwDXC3v2lHv6dgEws7+xnh2scn5ulm2FKQtMCqBZ8rh/NsfOBXgoEOKTpPqDYzMq2yqpcXetBCelyCltTqMPmFtk/t5pWnkgyqMA5mhGwyHbtDhflkxnKu6dph1ZIB43pcV5YWj9pxQ5kUmnoCd14ZygWU5PTpYvnzxWNm7/u5xdOFue+8/5tgkvkUgkEolEIpFIJBKJRCKRSCQSiUQikUgkEolEIpFIJBKJRCKRSCQSiUQikUi2Hv8Dk1keJbQJB5oAAAAASUVORK5CYII=\",saddled:\"data:image/png;base64,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\",suffocated_saddled:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAYAAAC7gW9qAAAAAXNSR0IArs4c6QAAC4tJREFUeJztm1tsG8cVhn/SFK9a7oqUSJmKVDGBL7Rst4Lb2EnaFI2bFHARFGgSNE2QGiiclyQt0Ie0QtG+FLDhvDvIS2rAAQwYTtuHNgiQixNUbW5N1dSSLdqOY8lSJIu0tObyuiSlsA+rGc0ul7RkLilbnQ8wtNrZWc05M3PmzD9rGxrk6KGhCrmenp0BAPRGeqqeq1UWv/I5ACBfLOjue10eAMDc4jz8S76q93ldHkwkpjF8/l+2Rtpvb6QySylXrFve1taGsNhJf7/m0AzOFwtVxrP3zYwnRMO9t9jaFRwNvwHAL3/3A7z43HH0RnpQyhXxyZlj2N0t6J65OpdBYN+z9PfNi1oPe10enQMSqfm6fyssaU7MFwt0lDSCJQ548bnjCIudENw+JM+fwEsP9wMAwlu+AQBIfP5fPL0riJNjp4CBgzXfczPjyTPECVbQsAPOp2cwEOlB4fwJvPtxBi893I+TYwsYncsA70zS53Z3C3h6VxC/eUcbHZ46jmglDTsgEAjgGgqYmssAAE6OLWB7lxtP7wrqnhuZy+Hk2AIAYHQug70D2n2z+d9KLAuChO1dbuzprg5ce7p92N7lrrqf3pSj16sZ2lYOf8ACB0hnT2PqrT9WBb167O4W8MmZYyicPwFgxQmrjQFW0vAU8AwcxN4BUGNWy979L2hL58x/1lTvthsBjeD0udZcx+oRYLkDLlxXMTKXq7o/MpfDheuqaZ16yU6zaXgKTM/OQPL5IQwcBOaO0SBIIj6BrAqjcxks3vVjCG4fMmpOZ3xY6qQ9zF6zWD0FGnbAz38Ww/HX4hBEAXv3v4DTZ44B0AxmE6GRuRxOj13H4L5nkVDmIajmQZM10GpjzbAkE2QhTjg9dl2XCJGyUq6I3kgP3QushfSmnOXTpWEHvPNuumqHRww1C3IL4lcAVownewGS15PEiN0jkGv/ks+S/J/F0hEguJneWb7OqDk63wW3D9cWV4yXZRl2ACFxJWtsd3tvek3IqvmG22z7w09/VWFvfL60Enjunn4Xm/qf1FX44Y+6AADHX4vrtrdsb9fqfUDbOxDUmQXs6ttWs3FfJKbQX/iwqg2EsamLGPrFt/GXP8/A5XACABLKPJKK+XuNZcXFEhzFxZLuIXVWi97uniB9iBAJd+P4a3EAgOTz0zKXw4mMkqHXxAlsXZfDieJiCX3w49LsBABgV982GP8+IZVL0ykg5xWUy2W0tbXB5/QgVyrA5/RgaySKj/+5hFQuTeu1tbXROgRSl3UEwcFWBlaGY+dmJ0Y/zWD3vSrG/32NNmrH3VsBAONXLkHy+ZHKpXU/WacQo42O3BqJ6u6RuuQ6qWidsOObmzH612HsvtcGZbIN5XIZuWWDyM/UlTQ1vFwuo1wu0zhRLpd1TiBTJqvm6ZSqGQMGd2wB8BOMX5yE1yVhIjGNRGoeY1cvIix1wuvyIKvm0SGIAEANIJj1LOk58jOVSyOr5pEvFqjRBK/Lo2tDyB7RGcUa1O726ozNFwtod3upUwjtbi8tI9gOPvRYxSzAAEBSWdAFqJtBnMD2fC0nGEdevXfmSgU6jIlBSWVBJ46QXm93e2nHsMYTWKcllQXYnnjgQMXr8phGWTK0a5FUFmCsaxwJRtj3kd4nBpgth4nUPKLhXmqQsVfNYId4rTLy0/b8gWcqrFeMDSMY1998sYCezm4AgM/pgSBqmV1GydBAaKS4WNI9B4D2LgsJWGSYm7WlloG1YA1nbXWwvwDQzUVjr7Cea3d74XN6EAlrTphNzNHAx+L0uahi7HI46erA1ksZHGCctx2CCJ9T3wFmjiOGmmFmPGCyGwyJQWyNRLE1EsVdwW70dHZTg42VBVHA+JVLuOepR3D49ZerDA8GA/Sa/Xn49Zdxz1OPYPzKJQiioFui2GvWIalcGrlSgf5juZydotcdglg1OtiOMzrJ9vyBZypmc3k1JJUFuqQBWg8HgwFkVG07LDDZYClXpGVk+APApdmJNQVaQr15TjCLF6ZTICQGbymtJA13OZxw+lwQ3D6MX7lEIzRLWOpESAnSPIJMhZAYrFptjPXJspsvFuhzrPFs2+8KdtNAS4wfu3oRu762jdbLqnl9EDR7EftH2CWHbSiJ+IIoYCQ+umq1Jix1Yk9sNx0J7MpgzAdY2EBca06brVxky24kq+a1PIC9yb4s3b5yX51ZoI0gz0g+PwRRwJsfvaczztir5NrYswfuewgZJUMbzEZqkmCx3Gz5uxV0I8AIG1xC3X3wZ6FrqOTz4x/jnyIsddJYQJIgs6WQTY5SuTTGrl7Ed3Z8a9VJEYdjPVVn6w8O3KubEp6gPgF5a/jvDZ3H325U7QaNQuTkjWncSGvRusO/+tMfq8lPvl/x9n/PcudbLopaTX7y/QoANMN4YJUOWI+eJ4YDzTMegD4PMObMQHVyZNyZvf7Bmw017uihoYpSyOLxRzXBI7bvPlrWTMMJdRMhwNwBrGTdqAPWG9OzwXQ7sCWv6MSNicQ0JhLTANb/owYrsQOAlEriS1sKgJbeLjmWMBLSUtG+ZXX18K+fopX8aWtPaNcTu5RKIiWFsPNGCX15BdkvRgEAYkiEffoiprwipFQSb7/yBgZdLvjT80j7O5vmhJFTR2qm5s3AkZJCIE5AKqkrDLq9SBvK2ttcwLITIoWM2TtvCWL4nid/29KY4pCWDZNSSVzf3otAIICuD88CmAb8Hbi+vReJRALScoVsWZO3/Ol5ZC1owNFDQ5WHv6/FmlYbDwCO4UoWD9raca7DiTBTEPV34PLOPkCW6b1zHU70J+t/EbpWhl49aht61dJXrgn7g7Z23Q1ZlhH1d9Brlp03tO1se9vaP21pBDYpshqaCe68UcKwHEcgEMAJRTM8FolBURTIsoxhAMRZ2XIRk6HmZoetygSpA4YrWcRiMV1hPK7JSLGY5ghcs164YDPBP/1tFo8/GqHZYEsywf3791fcbjdmZ2cRCARoQSwWgyzLiMfj1AHsM2R6fPbZZ3d0JugAAFVVoSgKFEWBKIrUeED7FFZRlLovuZNxAFpviqKW+QUCgapeVlX9520TExOIRqPYCNhlWUYsFqPz3+2u/p6XQAIicVYraHZm6GCHNxsDWGRZptOATJNmwhrd7OTIkVH0kZ0Yx+YAxPiMkoYg+i2NCSQTJCsAYT2yQs7/I3eELN4sRRi4zWXxZivCwG0gixtFUQDYcf93UflK23g1Ox2uevkTDxzQTYHJ9LSu/NOxsQ0VneuqwsYPiwDrZfH1pu7/GDEaz2L1V9vrhZ2VuwFNFd6SV3QfR5ixUaRxO7AieRMJfCQkYsmxRM8FvrSlIBkE040ijdsHXS68/cobkFJJTHk1KVxcPhPIfjGKvryCnTdKIOoxgKZL463EDgDpUpEaGDQcjbFlKSmESCFDjW+1NtgMaB7wpS2F8vZeRGez2PThWXQBWLr/65BlGV0XtBghpZLIlovwL0vjRCK/k7Gf69B/zHR5Zx9VhQnkmeGKFScBtxd2InUTyDY46u+oksVZCX0jDH9geQoMV7KArKlBoijihKIN+cCmAGRZ1hlO5PD+pHXHYrUYOXWk0nRBBAAikQhEUUQ8Htcpv+FwGOFwGMPxOIwHKM1k5NSRSmzffS2RxR3DlSwiWPkOIBaLIRAIIB6PI5FI0PuXN/uhqurKtAiZy2drhVWEfn/4MXq/FcYDgG1wcLASiWg7MVVVEQ6vnBDG43EqfxEVmJXLAeDMmTN39F6AnguwEONYkVSWZZ1kvlGkcXs9gZNI5EQ2Z1cFURSrVgkraeaBKIsD0HpTFEVTWZy9pyhK1e9W0woViMVOZHHWGNKzRv0/o6Qhy7LunKBRjh4aqoycOlIpTH1QyU++X4l//FHLjOdwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBwOh8PhcDgcDofD4XA4HA6Hw+FwOBuP/wHmpNuUnaYa2AAAAABJRU5ErkJggg==\",suffocated:\"data:image/png;base64,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\"}},Sl.tadpole={name:\"Tadpole\",behavior:Ym(),entity:qm(),model:Vm(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAALhJREFUOI3tkSEOwkAQRV9J14waRYKq6AEQVQiCrkBxhJ6OE2BwnACDQ9QsBjE1ayoWQbYpIQ2WEJ6ZTObPT/5MxoimrqKZoaq0bYtzjr7vOV7uGRPk40ZEhpqWnXNTuwDMxs3+cEJEhloUxWA6abBblbGpqzgX4nhwOl9foiXdW4QQAgDrZYmq4r1nu6kwM8yMrusASLrvI6uXiygiqOpwMO89IQQO59vk+xJ5EiUjeOb9dP0/P8UDt5NFZhNYePMAAAAASUVORK5CYII=\"},animations:Nm()},Sl.turtle={name:\"Turtle\",aliases:\"tortoise\",behavior:Pm(),entity:Lm(),model:Xm(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:es()},Sl.vex={name:\"Vex\",behavior:as(),entity:os(),model:ns(),thumbnail:\"data:image/png;base64,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\",animations:ss(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAANVSURBVHja7Zk9ixYxFIXfP+sPsFGwFEHExk4rQdhWaxFs10YQsVIQbLWTbbYQXrkLZ3g83mTe2fnancmFSzLJTCbn3I9kModDj9x7+vIY+uDZWae8vnP/cVUPA6VvvLHjD5YMNEnZHQHuEbsgwEOAuhsPKHnC2AneffT8n/F0rba45j0lQ4Q+fPHmOJsHEDjLsQQQOAkgeJKSzYE6OQGa4FwECKDGIxF9BPBetc1CQI39KQigF9SUwDPw1yKgFlMxcMTVk1dvO9V1lKGl52rxyv6MAA+JILJGAOvXdnFOjJPPQJOQ0rNZ2GQkEIS8JurxHrZnoeFEjSYgm6AmRdChavfns3qJiMzt+b4a0FKumCQESjs9Bx+aLY19eaNEAMeVF9AIDAleT0ZAKQTOv/46/vj5uyMg6tHGEBhCAPvp4qyzJCk0SpYoJ9/pKe4Z+2yrhUAt/n0n6TmgRIDfN5qAmtVC6QFRsq5VoAa6NK7q2dLpwEt9ygOjtsYl66tdlhdwgs88oM+jvG/o3r+PrMPa4sumh83YjRPDLwg8e/fpanyVqxOQgeb1FATEWPKgG0mAb5amJkDW13tIwo0kgG1TEqBlelUCGJMCqdWjlgtqnkLVXkFbY3+ehKhfxMzydXgKATERgiUhmQqsllmSxr2IgDmZpT3LagTwQ0Z1J8CBBUlaZh2cg8yIcRJmOyA5lQCVNesTXGmfIdemi/vXKV3fvWVRAjgBT368j6c8JEAgSYCfCPmY/KZgiKhvkUPTbGnSNtXjlVYkCVk/7yEBGVAndFUCStnaXZWnOwSbbaXd/RlaPs7iBPCFHvPqU7uO2fitkS1hntxIgFucOUIJcrFVwIG4S/vkS3+YSAABOFgnwJMkn18kCWbnAf6ZTAAlAvynCAF7EmQIsN0JWMQDPEuXfqJ6fDtgH0dJ9PX7j1dgogw9//zt+OHL907Vp5J9oYv+PK2B8sNN/+2VuXWogBNgLJMq1d8RhL5FCNiNaJ/OY7GLyz//abTfSoA1QNKsjWeF0k1ZuQR8E4BP9QgHrnKz8V6zuDzl1sb6qdbvs/ZmSZDlBbrm7tEe928WvAioJc3Nuf6mk9tQ6+9KGvi9gm/SpEmTJk2aNGnSpEmTJk2aNGnSZF/yF+bcUS/MNQYnAAAAAElFTkSuQmCC\",charging:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAATCSURBVHja7Zm9ihRBFIXnSXwGc5P1DcQnEMHABYVFVBANdAWRZUVQ0EgQJlRDEWHDXQ0UEQ1UEEwEFQwWEwOhndP2Kc6cqa6enpnt3XYquFR3VXdNn6/uvfUzg5WVlUHKLmw8KGCXbg+D6f2pizeS1tS/W1N/bsdPnEn2VxRF0ho/KCZaoSwdAPeIpQDgIaC2NB6wdX4jeACu6QnzAli7fm/Ms3jPuo3DRwt9pm4gtq7cLa7dfwJrFD2TB0A0hbNchAeocAXAawXg4fjo2Gqo2z69XkJ4eujIYgHwA1V4+WOVRyzCAygefbJv1OE6BQBtfIYw9gQAxfIDYaxfBAD1Avavo6+Q8B16TwiE0xrAWBxVbq6k4Vaw7c3hP8MHbg5DfSweY2uHunYHAMNo0nAPkLhW19eQAQR6zai9HQD9GI31EFsilqMTYGxOTo+x6TIGQ5+ncHoNPYElYeC7FAzfRb2EymwA1L0JgR2XbsbRrwCw3t93D4qV2q4urhDwG3UANAQ8V6xevjV/CCgECi3drPKCsTrLC6mlcxMAig+CR7/Ha9TzeT6nIUCPmQtAbDQxEjsffxRfvu+GqQbXqKNX6BphGgDaTkEKAYIUhIaGzjzMF5osZwIQi9Hg7pXoUG6Ot3nYpDZOqc2UJjuK1tF2SLz3maI1gNSouQeg1OsyOVrYxDZOdTNAbCWpmT9mDkA9BDYTgIllpcwEHHUKHxM/Mg+bpiWrt7Vd+7vhN+cFMGaoxGIiZt9+7gare+bmw2flmlxLXsOaBLGfs1fvDE6eW58w9gMDwOHzN2X/LPFtrTZDFK4vtAWA93kdE633TQBioh0A+qIHzQ2g7faxaWnrotWmATBt/xDP31EIBwIAcoML58cuEgBsbgBtEkbMNCYpEpmZwrmUdhgpT1HjWgHPsoyZPkcwKPcFAJfOrAMQva+DwGlWEyhdXYU5THqD97lvAFDq8tmBaAzzGpA4zbo4FxkD4xB4vy8AdMXIcIh5gIrzdYa7trq4gtbQiHlLpwD0A3z3yDM7egQ3UgqApzwKgEtcH2EC0D2Fhgjb9hyAU9c8UMY+zw8qGLq1VggltKpOofpxmOcC9xL3rM4BxGJexfMUybfWzBvc8/sS2t0fS2oH4KHQGQD+ID8+lsRYjw/HvR/CxODUAfAR1xzBBNnZLMDNTd10pKe3FO7Hbw4gHMVVGzIV6wA8SeoCqZMk6FtpjrCKJADuHmPnjzxu1x0poXkS1BDQegfQiQd4lo79iUoIemCiB5oawzqqCJvHW69KMShhO28/FS/efQ7GNpbaBussB8T+2qIoAtB/gPQ80F1Z36VwFYhpkiXbAyBp6wTANObb6lhb03t79W1TP8h1uh6L/fr9Z8JQjx1Z10LmBpASRIvV6Vkh7cPX3QMntBEARi02ynXC9blR20CttwBUREo4yz4JbZUDUiNOT0FdHYD3L1/3G0BstD2xsc2Fw9ZWz/QXAEeeousAEELlLUF8rz1Axas3pKbG6r0x0b0FQPEQpMkRsQ5z10Ydk2bvc4CPPgU7ANp/B0BjPSY2bH4idb2fBdT1FUByF5ho7/00uEyWAWQAGUAGkAFkABlABpABZAAZQAaQAWQAGUAGkAEsm/0FJ2PKpXRyvz8AAAAASUVORK5CYII=\"}},Sl.villager={name:\"Villager\",behavior:As(),entity:ds(),model:us(),thumbnail:\"data:image/png;base64,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\",animations:hs(),textures:{base:fs,base2:fs,base3:fs,base4:fs,base5:fs,base6:fs,desert:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARVSURBVHhe7Zq9rtRWFIWHgkgUKaKQDglFREkTCaQUNKkiOhKJKkWUhjcA8QQ0SZeC7ja8AW9ABGUaaiQaGp4gBSiVk+Xos9as2bZn7h2ubUzxXZ+zf4732scztgc2TdMM8urJvebNn783f784ad69ftYhm3wZvzRKo4P4bABNyPilURodxGu3/zr5pUXC1QDZM35plEbHG/Dy5wvN8x8+aZuAPeOXRml0ECre3r/YomasqgFc7hUZvzRKoyOR/sUHq2lAdQukAR/EXUAigF1FnD7rIn1jfs0T93tMFnTetA86+0LRle+0ZEHnzYZ7+1RkQefN5A3Qs0Uf3HbHqHL3ZfP45sVmSvRgNURVtFPlHELbAF0KQ8fvvvqsJONOcxQqZKrjzmdibZTGNVEa10RpXBOlcU2UxjVRGo/BF99/3QxRPRRV5LrHpjQeg0q0U4mtyHWPzY7h0rXLzRAZ3wdC++yV2IrMT67+9E1z49dvWzQ+NH/HUIl2Mr6Pjw342IDzaYDWknCh8aG/N4wKHoMfSRIVj9hEvioHVHjmyCaf2xA+dAV4vBhswKfXr5R4TJKFUyhQJLivihf8ZOY52FwM/qM0ALGZMNYEigZOLGEUTYEayyYfcZ4LiqmQT6+w/ntA/jjCuqB45701gN30k3vxTx/e7sYeQx7rgOcK7MqREK2nBmiO8KoBiiN+tAGI5tLyJrhoRydxEd4EjRGguY7pJ6eyO/iJJUZr8jM9MRXk7DSAHU7xVROqRlSFeiHYGWdBfXnpyzz8NFhzxkK+KufMDfAmaEyRjp8QdAmmbd/cPshBdP6jDQ1w9mqAf6tWDXAkTFQnw9fndzzWxYFsrDPUBJAtzyF2GuC7KRCcwolLvJgsSvi88iUqMoW6LQWclfbPyd2bneC+K0Axj+7e+S/8/3ihsRcPCGQnfFc4iipXIofQOY9J+wcxwNztPn5w68tGaExhKcSFJ5V4FzkENRyLTsxpqYoEGuEcIrYiBZyV0jhn1AQ90OjI94Lbxvy53tZkCYwJHPPneluTJeBiBCKrBlT+XG9rsgT0HaJ3AL48JTBtQ/5cb2syRxDi6KVHR3bXbRXafR2f/fFjF4+tPOmcQIQjsbqj0ACNV9MAxOooMWqC2zJeIFbxaoLbypPOCUSAHqT0edaRBrgt48WiG/C+KY1rojSuidK4JkrjmiiNa6I0romN7p+ghwnnn98+L8k4X2OMLGBq2v8sOEQKqGIOIQuYmq0rAHKHj7HzkAVMTfebHi8WFekj2W1VPo+iIBu5c6F91h4SL+SvRGiMnRheUrAn5M6FTgRvUlXxEie/8GT5sNNE5hoDcXpZ8fw5sCUCwWmTCN60PJk4fzPzXIcYz58DW1dAX9Hy9+2e7KAG6Ojr4WOdzJ+adhezCRSNj3EmC4/XmCakTfl9a0xJ1wCa4MgmARpnoqMYUKwEO75m5k5NdyvTxJug+T7igTjW8zV9Pi+azb/5zOjvAwqQCQAAAABJRU5ErkJggg==\",jungle:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASHSURBVHhe5ZnPilxFGMVnJ5KtCAkJ/iWDJCIJonGRBBcuRCQLCYoBN8GVmwQh4saFCLp1I+YB3LiMZK8P4Iv4EldOhV9z7unv3u6emUzfoRa/qapTX9Wtc7q6e5I5GIaha0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0qxJ0rxJHj74suDmNJvHL42S657XpTiSXBmA7h8/qVhjqyf4rQC+Pfxe8PDuxeH//6+3bj5xvnG1POTNaEy7WT9FFMHQK9MO7luCgWAefHplUujELI+WRMq007WT3FaAbh53QQFAAoh65M1oTLtZP0UpxmA34Kv3n19FELWJ82wDoRBDgg5n2R9kg+sanbBX23M59uAeXSvyfOsAhD0bx6+0nCNfsLcFPnAqmYX3JTaP7+/tuqnaebUMpfnWTsQ5gkgcdPbBODXUNezqtmVn7652syo1Z5u1OeoFQpFLWeBMoD7t65NBrArCoD2JALQB5uM8EnPWHv7mHr6rCkDyFeyugVek3NT6IE6GIejX9Vuy8+/fLfaRzz564/RmBByHfrGANR3g8xlTWqJDsOr7kjjVhwVhSAzmPe2CuDBw3urdi0Amfj9y49aAX03xlxVo1Zm9EA3qzH91AkAzcmDTyEj2oPbQCDSNdac6thvNgCZUAdT9LXA59Ri2jXVcXgerpY+Y7WqEZXuazi419JHp97X5Vh17AU6szMaHAU25mEVmNhUV8Ea2nz+cTn48K1XB6FPfvjhzq2G+sx7nc8TgB80Neeo866liePQAuA6g8yplUE01alVrXShvh9sjjmTc1T1nOkkWN2Ao8Kh5swx51R1wHxVnwaOSykKfrNKnd+6Uj8t+DyZIsPLIHO/0cBZagCYAox5CPoWQKOGcHK/0cB5cO/yYm+AjHgIbpKvQPqp536jgXMW3gIyRxiMZRQqLfcbDZylBIBJx0PAPGbnajXmtjBXPlTMBaC3R+rPCw7rh+bV1NhfXUxmvev+dhHNqAypTeZugDO1viL32wQHBzecYzSnMo/eAvD/XXGk6d/QeSBpWZ9jBeJj13K/TXBgSLMykZozFQBz7QbkIcXUVZemuaz3fTIQ13K/fdMMcThaGaxefdCcvxW0xsOASsu99k0z4+jQIgsT6nK9IBxMq78p1H1RiselCmabUPdBKfZEKfZEKVZ88MkLg/j40ZvD/afXG+pnnaBum9p9sybkocWNL841CEF9atR3c7lWUKe11C2F8pV1A27+10fXG1rIOuZZzxrVPf3x/dayVi0PXgrNSJrQxGcXXhy+fufcoFaf4hhypAHr1Vc9X4XeLvGboP1ws0xo/M+3h03XWKb0nS6DfL/zF1qhQPyPk1kjnb2XRPuRZoXC+O3zC6MAZMIN8soyFh4KaC37Lo32I82iAZpfbRlTX1SmuQ1LNi/aj8rsFB6CTBICpglA82cmgF3g11yM563APHO5fmmU4iYUAkFkIJinJtcujVLcFgxiVkEQis8vmVLclQziLBh/xnDwPwQxyi3EMABEAAAAAElFTkSuQmCC\",plains:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASsSURBVHhe5ZhBi5tVFIbzI1y4EynSMqhgS0sLlYEquomuigsFYVwJs3JVcOkfmJ/86RN4Pt6cnCRTJ/VLvIuHe+97zrn3vMckU1xN0zQ0rTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrTgSrXgKbr559c+yP/by8af3otaemlY8BRc7gNdXj6bk0ccfbVHz9/FfDeCPtz9Mye/r7zb8/ObrzVrzKzvCpQ8A4+uXz8YegOaHHYDm2df8yur5Z59MyU+vn02/vnkxU+MZg++/utrCPIbHWh80VuuE98U3UsNYNZsDOBRnX/s5yQDyE5NGWKnxMfZoXZ3U9xMHgDG+5/ld16h7dND8vQdQHz0WrwYcgHGHAKnXOjGeg8i9xjDDADSeJs3JAajvHQCPdwYzZpyGbMq4ZJ78+OKLrdr71FHjO+zVNa+hNA8aNydjnNsBZBM+JDVuQzaYzSfGuYM9mnvPHeT4BmvuiaW5NMiemF+LfUPYGQAG/D5mAz6Iljnq5mTzQp5GyaXWjz816L5X68jJ2nrWlAbTnHol89oBgAZ9VIwdilcTkAbynAPIWs+ZYz17NPYacq1DqMYzzv5fD8C8Gs+YuWDDgO5Zc7VOrMn63OcAqsm/fvtljqWuedgZQPdfIFE3j2aSfQPIO+pAugF0dR3VwENZXV9fT7DPoLp5Nzc3W6QRTaSR/Pi63mcA5JKX9VANPJTVer2ezcHt7e10d3c3/fnu3WafMXLREpp3SLmvjQOaK2bNtRaIU5e1ea4GHspmAAmmNA81Xj8BdQBppMPBvG+dVAMPpRWBH46qyaHYh8YfNeBvfp6h/vjxg5h6vW/rkFBUNTkU+9D46w/5j540mTlPr57M+//FAHhbQzkAyJjkAKDet3VIznkA4gBS06ifhm+ffrn1yaj3bR0SLquaHIqdGkwmmtGse/Uun7g5aHluHwUSqiaHYqfmmKH8BGiw5gs5dWgrPiJAMkFWz7UZIa/WiM0kPgj1rmPk3d7PP3n9Z2/VunzyQPNCbH6AoGCOIHptiDgPkZM1+WDFx6DedwzvFY0C99mrWs3P9zm7nweQJjTCSgIXsmYzajXXei7NByredS6saBQjiUaIaVgD7h2A+axdXqU2sDSbAfh9dq3Np0FjrFnDmnX1DqkNLM38gyac0yg4APbqrF2tNUneVRtYms33WgPs33cA1rNC1klqtYGl2fwZtHkN1SHkABJ0Y3JxA0jDaejYADI/scYV0NVqA0sz/xmkuTTlWQN1ALUmV81mrlptYGnmT0BnKA3kAMwz10+MqznmW4tWG1iazW+AJnIIaaAOQDPq1nKXdZzNI+6dtYGlmX8EXR1Cmu0GgKaed1zcAGjO5nMINq+ZV58/2dFqHWg098TJZ18bWJrNj2A2bbOahToAtRwYXPwAQDPuWTHTDSBzU7NG3UGxrw0szc6fQRpVA0zXARgz19qs1zDw/+U81waWZjMAm3bvWUOYTxM1z3PqYD21fArOcgA2a/P5vbZ5kx3CvtzEXI179q5zYTZl00DT7mtBl5O1YK45nnN/HkyrvwFEKt3/bGZRxAAAAABJRU5ErkJggg==\",savanna:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVKSURBVHhe5ZlNixxlFIXrD6gIQSIiQxhEGYggmlEhuDCB6EJxEQMiCCN+QHClggmKSFYBlZDsXLsIZC9uggu34sr/4V8o55Q87anTt6Z7psuugVo8qfe9H1X3nKqubjJN27azpgzOiTI4J8rgnCiDc6IMzokyOCfK4Jwog1Pz7Vc7h4c6N8RJekQZnBIJuf7Rk+1xBJ2kB8rgtnn/3ScOD/+uJUL74xqQPX7OoyiD2+TNS4+3Q0iE0N2FjLGv+kXWe48oh9omm9w9x3uqcw5RBreJhtRdWWfYdTnOOcvgthlTPKx7zjI4J8rgnCiDc6IMzokyOCfK4BgcXHq1/eXrTzt+vfV5B3vlXnn23FrkecemDI4BBvx2+7MeMuJUG3Bxb7d1ds+e6ZH1Q0ikxLpwDBnTgPeeOt8+2NtboL24/NhOR9YnS4ExDUC8M/YT8N3Of+KF9m5C1idLgbEN8KdAjP0OqAwAmZD1yVJgTAN46WECH4MxDZBIF58mZH3S3Ln5SQs//3iz4+H9uwu095rkygt7PS48s9Px9v759trFF3tPgMQrJrIPyIsPXt/v8BgiK2SGi68oDXDhlQGQ4oWG9iemEiIThNaIyj7wmkQ5F+nitSeno0O91oMGuOg/Ht7vwACOKV6kAAzwoQVPBPHsA++r1nqxuSgX5/AtQD2UBlTiMcBBtD8RetxdAB8BBkaADGCt46o+DPNegTgdJdyfAkS6eCC3ZIDffRePAW4Eot0AH97JO44IHUXVI1SDaDeAcyFEcPfzYyBObABHJw1wUgB3FKEuyNdpHH1ukta5R0zefRgygL6NDXATtB4SkgK4g5UB9AivqfoRIhBdPQnUuQFiyQAXjNCMVXnItzkvQQZOAYjLPqDH+32NEIlDuIt3EzDqSAN0JyUEkf5EeFxrngBnyAAGFm4A+3X6KlLApjT3Dt5pfzp4efFIIxgUU041qtWPGa2F1i4EES4k7z4x76sMUK3q0rwUsCkNgnTkV5v2HPn5So1M+OLyuQ6tNbx/llnn4EIxjhJLLb1CefV5r+9TwKY0iDkpaYALqcCY4/ZBCtiUMih4kWScF07GtwUvvSF46enPYqx1ZJ/n620cnawSOmTMtsi3uvbCTdCM+tOY1tRof2wDxLrxbaFrpwmIVI4bJMFaE8eQPF9v43CyjE/9BOjaIHGYwV7zCf1pzGPaV3p6G4cTrRv/v0CkI2H6TCOQfdaR8zxPC/3lRYVEqiDjik1pgK5fPd7MW9WLQQP0j5o5Qe79ZMLzQjGv9x72HkuBq6APdB03wPfEHF17SLzo/Z+aICEylnsu4HG/EDmtIQWuwnuFzsfnWXtdg31ei3xlALmGoJp9YBfhkPM+ekWV4zw6psCp6QwQGhAhLhIU8ziiXDz5zLEXOcDUdI8Yohiau+aCHMRQq7XXEvfz0JMDTE33tmd4BDCscDEJNS7Sc4pdebT/ROQAU7P4XteQ65iAMHJaZ732Eg5ekwNMzdLXIMP60A5xzKpyIg3A2BxgahZfMy4kxVx7+vmO/d1HFsIRlKgmxSsmtM4Bpqb5/Yf9Fv568NoSf/95o0dV4+e4dfXMkeQAU9Pozrx14ewC7lbGV+VW5YnnAFPTXH3juVb4kAw9lCOeOe+t6kQOMDWdARrMh1fs+scv9QQSzxz5qj/rRA4wNQ1D+tDOUI74UH6oJgeYms4ABvNBXQB7j3lOvVWN71mr9jTRM0AwvA8NVc77vMZ7WAvqTwvN93e+OTz2g1/e+LCL6ag8NdpnzMk6QXyoZ2rKIHdq1TE5ad+UlME5UQbnQ9v8A4foF7kPq81qAAAAAElFTkSuQmCC\",snow:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVySURBVHhe5Zkxj9xUFIWnpEJJEwTbBG3FpgSlSEMBiHIlSoTgB6RfCdHBD0gTUkQ0SBRI9IiWkpqCH8APMRxLn3V8fO0dzwzjJ6b48t47977ne649zmh213Vd0/z5x8+d+PuvX0egZ/5aSrElMO9NcC3z11KKLYHR3397PWoCZP5aSrEl3Gz1FGT+WkqxJSrz/jRk/lpKsSUw7XgzMn8tpdgSmHXTIC3z11KKLSGTbt4b8r9ogD7P+YbXHC11Yr4HzeNzMT9LelnUObm9u+vEly++6/F1pXs8Y6llPPM0L4s6J1nQ3Jo7x92b2+Oa63Prsqhz8sHnX3Q/ff91p1FQmB5PtOrR9bjm7NPaz6tirBUrizonfmeFisKom/UmOB4jnxhnsEbzeVnUVujuyIDGjO3DfftlmLnyNE6StoS7QnFrOWR/KW4FxR/agEP2l+IlUYqXRCleEqV4SZTiKdAXjdRAsfc+ud2L3HtqSvEU6FtXaqBYZbYi956aifDwwYPOef+dN7vrh28MY+bPca4G6Cy+3wut/fzMTyZCNsDNa8z8OZYacMqPgM7yBmjtTcj8ZCJkAw59ApbeAX6H7iP3JlUDYOkmwETIBhz6BCw1QLHKbEXuTWTSzWcTMj+ZGF5Ldt7X1R2QVuUurZ05XbBviaxn0oC3Hj3qrq6uejTPODnEsoBcexO4W1Xe0tqpGpgxjQ75mlMLjBrg5ueagHliXggX8jVzX6e+Bn0s3BS65m7aP0auLzYA09fX1z2sPccbILKIXDP3deZVzMUxp9FzOJN4cm8DMCXjNzc3oyYolnneAArxOeu5uef63HOqNUZE7tOc2OoGVOaEm88czbkoxQDFenGMIvew9pxqjRliiWIiG8C+sgH67+32ydvd3Uc3A189fbfXGJXjTaAxXFCoKEaK9UI9nnt8XxXX6EaEnyt8TR57YNIAGUxkGNNVXNAkLuJFMn/y6WdDoVp7rnj87ONh7vsy5mvleS5g3pvAXvaISQPyLusLj0OcnESHqjiK4kJcXDGKdJ197PV9rmduGjiWXRrm4yCqhiQUtgSmq9ha0sCx7GQSZNofb28EcXI0qgG+/xykgWMZGuDmqsc981hzZ6rHmvlcPDUnnxjWaeBYSlHoJ+ZX3z7/dzrWpSmW+rngfSL4Cdw1mqo6gWaLPG+0cJZMbtkADAoaIM2boP8FpMm8/kqkkebkeaOFo7+ypAZbPwE0QXUI7jDmNaox/KnM9TxvtHBabgDQAMxr9O8BMq+4RvQ8b7RwlkwuNefUyFSCOQzSkLlcj+upEMTKiwo6l7q0LRugornD/sdQtCofXaO/E0Rv1M3SVR3OBSgm9dyTcXL8TM7alzTEo+zXQhOZj3mBefShARgBrTFB0alpJN/jFXN79oHiwc36ufc1QC9KHn9/ac5+1qVzATeHnk0T5JDnc+VrzD1bMxh1kWIZxT5G3Ljv0x7IPVvT/0OxiG485wJT5LNHuptnr4++pwWGiRcNvnYjmMwxteocrtcKpSj0sqBocCOYrJrga9+vN3BeZ2tKMaEZmNPcjVdrcskXeW4LlGKFNwHDvk7dNcgzW6AUl8hGaHSjuSZfY57VAv0PIvzAofGbDx8Po/jlx9c9P7x80aOYPsuYrUbQWsaF9jT5DvCCKdY1dP92JSPken5155lrj/ZmAVvTP9IqHDDCHJN8pWSkCZgkN/eRR/OygK3pv2t74Wleo36Lk3HM0wBvwlxDyNMe7c8CtmYncypQBbt5RsWUyN1jRJdJSOPoyvsvftA8Bf0/FOt3HhOeXOGN4ByNoDW5LTJMKNaNM+6DG/Yx81pjtKBw1/YFsxqPOefclOIxeCPQWqYUL4du9w8b6MORTdaqiAAAAABJRU5ErkJggg==\",swamp:\"data:image/png;base64,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\",taiga:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAQNSURBVHja7Zs/ixNBGMbzEU6QU0ghIYgklUL0/FcIhwgWV5laTrCzPMROsBMbwcZC0MLOxs9wln4JwQ8y8iw84dk378yum71kkkzxMv+XfX4z8+78SQYhhME22/nP9+Hrx7PKEGea8ab2g20HALFdygqAXQGQGuZ7PwWKD9h3H7AXIyAlci9GwKpWABQABUABUAAUAAVAPgsZpn98eRv6eGbqOaiXBQC+JEKmNT9mrGfF6jPsc7UewjIFCoALevDp8b2QKrt7Y9TKCoB1A3g4HQe18dXLNcsNwO9f3wLs75/zyl4cH1U2P5pUthcAKB72en5cg7DzAFQ8YAAADRD2AoCOgg+nj2sQGgFcOjgIq9jt69dcm9+/GZ4/urP0AsiDpdqljEKxsKF4Ow10RNg6jQCuHB6G4XBYGeKeaOSzrEmIQkCc+V0BqCiCUABazjKFlQSg4mMQKJ5lXYV0bQfHhiUsxCDEMFehWsa6MADwltY1ABQ9Ho8rYzoGAIaXhq9YFwA4NghBCPGY80gjpPeneAJg6DnFge19CJ9OpzUIOgrsKFn3CKBIAiAEOj+7DqAxv5cpoGVthNDx9TUFtPetxQCwXRQA5g1DzCXN8+qknCCmBIW/evpgYQqB00ZDbcd6aFfLk97UnrcjgfUshCUAuD2haP7QAGn+yMB6U81H/MmtaU0E0jAV7hnbWVNYXlx7U7/3diTEpsMSAAxlCEEIYdYJ8pcW6hS1jRWiALyhz7xYO/Y6e96me98MdVkHqKkQiqCQlKUApKx3APyseV8BBaFgWAYA+gnUeBsA1m9sFEBsDRCDwLQFoM4sZV3bre1AxFs2tim7aFPH5xmdnjpAXTv0AmCVI+tVzXp1uyjiF4F5+sX4LwApkZsEoL1sQVC8B4L5OwFAhzthMO2tBTSvFwDr9AE6f73hTvEKJFbX+gTkZe8EPUG67o+t/iwA6xSZP9C9sl4pcU/ddAjJ+mxrDybsIcWqAOzGJ7YZUgDeF2EBwB4x2SOl1CGkJ9YTnXreqgDsPqAtgMUUsMdHqZf2yptE27LsrsZ4YKgQrAB7CaGjRc/mYqNJn5cdAM5f9rSmeb6mALScgngNzTz6BZYrpOwA6J26vTuPfR4Jxatj7+S13iaX0I17gU0ubrK+Hmev2XCnAahYeySmfsADYn1GLrvIpBOkKM7hyWQSZrNZFb57cxa+f/5UhTAtUxgKRC8obH52ACCEoqwh/+Wzk1o8VbeNbSUA9DzCNgDGo1HSsgOAl1IICO1/8GBYRto8bdNGfJYAKAgCGVIs186Ic03NfNZXOJomRIXZ5hcbGwGgQr1Lh9TZmwJpE88OgN0heYcIujPzTmS83VYsniWAmMUapdo0WfmlaAFQAGRl/wA8Eqn8BlVX+wAAAABJRU5ErkJggg==\",armorer:\"data:image/png;base64,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\",butcher:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEBElEQVR4Xu2aX0hTURzHf/elEAKfNMzNlVBbZLNmf0YI0SxSSiIQSoJQsBcfgvaU1ENUVhDYmw++OOrBXqxAQ190BBHLcuny4a6HZO5fuF6EQOjlxO+ss7a7s9tmenfWPffB+2e/c8/v9/l9f79zJlPA5Idi8vhBApAKMDkBWQImF4BsgrIEZAmUmcDD9jaCLtird2Q8Ca/9oNfZz/Tc1NqzezZG+252j3ZlL4GbJ0+Q6qoqWFtfB3ZGx/GaF0A2CAwAx2Xbs3seMHwnBj/3LZX5uOwAjBLgi0sXqNIQGkLA88D0jGIqAJj5R2/eKVh2qBS8Ng2AQkqTAIyqQVHnkQoQNTNG+SUVYBRpUeeRChA1M0b5JRVgFGlR55EKEDUzRvklFWAUaVHnkQoQNTNG+SUVYBRpUeeRChA1M0b5JRVgFGlR55EK0MvMba+X3B8ayoF0y3uDDA49+W/A6QbCC5YHRVR5F+PXXwB4yaBUQK7cTaaA/Ho3FQBesKYCMOYbJd09vTl9gvdM22z443yku6dHuNVD16GwGiJ2hzPH5osaIvs0z7QANjqumK692TZbAoAHqRhwmx1cMe8rCAD3AB2d56H1VFuOzVv/DJmeeA3aDVL2ZGjDG6d9VoyDW21TEADWscvdkplfob+nIoA/tHk24tMFMObLr/fnPh+5XCk9ALPf5GyGFreLAthlaQRCCCTiyxRDMBCEz6EQaDdJjNZGm+dWZ5v3fq4CcKlr7zwHtXU1NPjsIx77CqlkCqYmJqHQdwIegIpSADpbb7PAzrraTPYRgqIoUAwAbQ+4c8VF7GeuQ8UsgxgABlyDCqjfQwNnBwMQi0ShUE3zAJzue5zXUMshee2ceSWADcxqs1I7bHnY/KKRKL232Cz0Hg/2jJdVBoBg48AfJ4bD8D0ZFxMArs/oZbrHA6wmVyEWiUFnVxcNdOHDe2g+cgyS8WVYTabg0NHjaTiE0GdsbJrsn5UCQe21N9HgZ2dnoc3TSi20G6tyq0DBhoVOLIVCNLv05vdfDKjJ6aSrwXwgCEuhxRx/0/bpEXh9wHkw8w5LgwUzDn6/H1RVBed+O0QjK6DdWpcdgNYBbIAYlNXWQD/C7C9+nKPnyfFxcLld8CkQzCDSa2yqqhKHw6EMDw+T/v5+4b4HMM3mMEAAh90u2vwwcAYBg0cFDNy9l9kTBAPzuhnFHoAlkEgkwOPxVA4A3AHW1e/WVSf2hthKTMilrZSyystKeg9gpe2MLYPaF+KOEDdDekthKU6U0zYPwIOzHtLYfRUWRkegufcabJ96BT87LsK2qZfcs4j7+1KA5gFIfw9w0iaIXRvLAfsBOzD7T0dG6eqAK0el/4tcyMZUSgb/1db0AH4Be8rmUTW5vvMAAAAASUVORK5CYII=\",cartographer:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAC1ElEQVR4Xu2XQUhVQRSG5xHhxozKjUIKRujCIATNRQhRi2hTaKJguRQSW1WugmzTonLjIqhFQeDKjRG0UgI3FQ9EsaAeKahUG2khbQxi4h84cJ/NTO++OzB33py3uXDnzdw5//n+f+4tiMh/hcjrFywAExC5AmyByAHgEGQLsAUiV4AtEDkAYZ4CcueyRON+r34UdefXM1GcabIPevYWT8jnh9bE2rtv4sbBIXFqfDlTDZkm+xAAz4QIpS+H1eOjFICEhxDRWSBJHbKg0PgqE8WZJvuygMvnsgAu1QxxLSYgxK653DMT4FLNENdiAkLsmss9MwEu1QxxLSYgxK653DMT4FLNENdiAkLsmss9MwEu1QxxLSbA1LX7fW3y3tKGViDbWGgUGAm4daZVTn/Y1I7bxliAwBRgAjgDDArYgu7ZldNybH6lJk4QYxHVClDtPF/RkVoAdP/Hz12R9ojEPBSZN3JSCzA7N6cKGRkcTPWOsDR+Qc3re7KQK+sYN6PzOYo//vapovV1/Vnx6OFU2Xwb/jUhwJ3JKXmyNC9ggV+9o6kECM4C6LKOAoiAsTTdJ9usFD/9M89X+NFzrX7UBR4wx+T9IWjDn6yjs02uBdBRgEKbjjaUpfn/Po5ATf37l1rb5F4AnQhJP1PxUn6V29slVU9Ly6Uysky28V08nl/xkUTo7+79UftubzqiwpCssLX1RhaLy2psYOBu2br4esR909elTyEqFiC5SRTUUHdAJK1AAvT3DwuQkKTAlBs+C68oBG0bpK523X4skO43J3oECOju7lJXoiBJTs0QQMIg3fFGSMGI+xdnHigBiIQX1ybU302vzr4pqMoCyU1Twp/rbFO3P3/fEceuX1UkUPHIjTx2P1UI2joFAkgAEgFXhGSei3cqAAKxo7lREUA/21ejb/Qzh6DpVAil804FwGJ0KtDCefX8fvIyh2BeUK52H9EL8BfNyH1Qj86JlQAAAABJRU5ErkJggg==\",cleric:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADyklEQVR4Xu1azWsTQRSfmhpCwVqChfiB1rSIEFtQQYsUevAkglrEk6CHHEQ9FfSgf4AeKvSkXsxBwZOIHyCePBSKiKBCa0CkTav4EaiEWqGE2LjyG3xldjuzJduFt3FnL8lu5s2+93u/9+Zl3rSImF8tMbdfWAAsA2KOgA2BmBPAJkEbAjYEYo6ADYGYE8CuAjYEuENg+MyA49Uh17skhHDEznRCHM6/9HXSi8IhZ6byR05RnGw1mpPr/S3nwzVTqYvi5Hr5nZ0BFw8MOeXFikvxTFtatCfb5LOeE9Mif+mVVs/CjX5n6nG3HLdQWxTqPJgD9+pcXnQgww7AyT2DDimrKrirY5u8rWY/idF741o9wZ5UaYcc93H+ywrvY15cBGYkAeAOQXYGWACYEbAMYHYA++stA9hdwKyAZQCzA9hfbxnA7gJmBSwDmB3A/nrLAHYXMCtgGcDsAPbXWwawu4BZAcsAkwNow/H6+H0XSFcGTjt+G5XMDm349UYGAIDPbxPi4fsx1xjs4m7fVzfu1DasAbOAEYDCSL8z9aRb6BjQc3xa5C/r9+qZ7Wn49RYAmwMMCMQmB+h6c2hLIdOj7WRaBfCbrh2FBEm/UXsL42hOU5ur4eANScC35wbFdauAnzHEHOinAoD7KK4eRgCwBJLS1IAEK9TnOm+qDUuvk6JYP2gBQFhAeW/bmgyiruvN149WyKNQotDwMgD33pAKicmBp9ECACPQO9eBoLacdcYQADB2Q3qjnONX5afMF00FABQnELzwUr/dBADGk/EkCxBwNQUDrh274JDCXhDUwwZ+DICx+7M5afSbUlF+Ng0DAICqtMoAim8Yd/Xprf8zB6wVAALMmwybJgRoFZhdKEtbutoz8lO9RyiYQgDxTwwiMMAYhFXkcsCdkYOuY2pd6XXGJWX233E0dQw9IyEcP+uc79MCMNcxEbm/0dplcK0hQAxQ64DIMkDnbgKgulQTfZuyriETP0oi1ZqUGV6XBLFhotYAqjDCwltaB65gQhI0VoK03MFgNQcQIFgedZUgAKAlkPIAwKLvTQEA6vnah87lUpiqPyqNcZ/cPaeNZ1SCagWoFkWRTII6JtH5XYDgPWUJz+899U2etTX9GYLc1sxm19Rfy9+NoIXE5kDT+G6K4oDxuwdblo2BEUPnyuLZWML3+Crknt9Nuf4O468wrqbYDyAowQQyBs/OD9d8jVfljg7Wxe3RpHx05GzVyJhAbgtRaNXGCECAMbj8PO/VieRQJ5jCJUQ7Ak+1KgCYmXJCo/QNKhfYmgCCfwG0VRJLJCiE+wAAAABJRU5ErkJggg==\",farmer:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEuklEQVR4Xu1bTW8bVRS9buz4M3Yc48TQJs2HA1GrqohWBMGCdoEACSGEWCLYdlcJ+AewQgiJH8ACxBJVLJCQYEFYIBrUIlBU1BInAUzAxLUTO/6Ok0HnmjdMktp1eqdyeJm3efLMu89zzj33vhnpXhcd8vHpe2eNeNxHvoEC1TYj5ozHzmZr9MpbP7kkEETGkj/u1vabj2aNnb4NXj6UGKN85neeN1aLfO3p1+dFGETG3YKQrPv6k0cMBT7gd/NWlWqT51oxTbMv3xRhEBlLgHVrO39lxvCFRwng3d6HqVn/hU3zf6/wfCQIYAWMTDBgkFDc+PloKQDg4fHhsWcZPNRwZBSw+O3zBsBaFWANgyMRAncCr3LI9FNfiPKYyLjbRNZpnTrncabjvMfYe+Y/lBwyQwDexymAYxDX/0zl970bqH2wZ65Yplg4uO8R1PVDQQCeDg+tSMA8Olmn9LLXnNX96UeHafHHtbb31ToAtA6QoEBb554T8O6b40a22U9xd4MmH4zQfLpKLzwWpc9/WDevLf9VoEjQTTNTMZOkm0s5ShWOUTKywx5Wawrl1jsCBvZlct0NtlcDa/Abc88JeHF2jF904kG/+YADfs8u7w0GvPw75O0zr5fq27RRqd8xujarW7uuZ8vV/0gp1VqkhFrh1nMC7Mgjkj0cAiTs6WDrKEAHL0owOAqQsKeDraMAHbwoweAoQMKeDraOAnTwogSDowAJezrYOgrQwYsSDI4CJOzpYOsoQAcvSjA4CpCwp4OtowAdvCjB4ChAwp4Oto4CdPCiBIOjAAl7Otg6CtDBixIMjgIk7Olg6yjgMHgRtYKxRKt46dj2IM8og0epPGZVS4iy+VzGJ+4RsGLuuQIUeH+oj4o5D0WirfrAdkWTihBpo4QioacE7AXvdfuoUGjQyImqSYIqmrR2i0AJF1+9Zcuz27LJvYYRmiHg+XphgLeoN2vk8dZY5qriU+2NEEF4oIy2UjFsC4WeEwBQ3sgmVUvbDBAez+R3l7kmhoJMCDxvXW+HCmwn4I1nnjDOTQ2z464vrdH7X11t+x9Icgp8bWeHymuBfeCVAhQJWA/FQAnSUnns7XrtzDiXqmI8kEiYao7+W7q6bikzbSf125mMeWt6aoImEy1JL2c2aXGp1dqixscLv5qEIAeEo0QjJ4e5+nvhVq5jNIEEFFFjICdIG6aYgHuN33Z2UMCNiTN8+/TKQkcFYM2XH541wrEt9qoWBLz90kUjGnLTeqnJ3rd6fC9p6nwfPB7uSgHnH+/nXIG2ue/m3HTpHVmzxH1TgAqfuxGAB0BLDJoeENvXvm/cNQTQL4DeQSTDQxkCBwkpHIMAgs6PXPY3+iPl6ZgETyS3WAHq6PzfE4BTAPLHQCcYlNDpGIRK/KHjtnWN3pcQkCggFj/JSkBCrLjyFDCGeI6GPQwco1pa5ft29A33nAAkQcQ0RnjwFM9oikInGHJDailFyakkuVx+KlfwsrRKIEkpxY7vAduPwYMoAGtBwrkLF7ghMhgYoOSTV1wr1y6b7ybbjTT19Y/SxPkPXFc/O2XY6f2eK0CRhWQ4Onma0ss3aHzmObo+N0fq8xi/AR6kYFafyAclut36fwDH1E69qHJmoAAAAABJRU5ErkJggg==\",fisherman:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAFRUlEQVR4Xu1ba2hURxQ+6zNrou76ihsStRYf6P6oCqam/imhFAv1RVvQtIivP4K/RFFofYNi8WdBqFQC1tKHSCuFQskvY6KhJmKjtYZGJMa4iCRq1o0vrnyTnuvsZO69W9l07s3e+XP3zpk7d8433zlz5u6cCHmUfZ8utNCkIjEyq2VH1zNxv+dkc8SrDz/LPQcPAKA8FK5eEKUbd5+L31xXEABAcRQoP3vqCBuEgmDAN9srLZ59mcrMhCHPgPqj71g88zIL+PeGLy96mlGgfQAAUBVgQOpaMkPfCeoAACBQHo6wIBnAysM3BN4HwMkxxeHh2bZx5XunOp1PcLJ3jhtYznGFaQZFdIEOr/OqMrp6OSZwC5h0wPjBhCKb30sOcHKmvHZ56Si6nXpKuDKYHHfIbFSXYzU2AbCok00V/aLwO7gP40vY8sppYgImF/cHWyhjo9lhd2zMaFFfMnq43ab3yQvqefxEO1ePMv1hOpd76cyr37194vfkkiJxNQ6AKbb5hgEhAIYRCE3A8AQYf33IAONTYHgAIQMMT4Dx14cM8JqCRWXjrJ7MU4pFRxGu/3T3DSnQPJV5M15ksfK4Xrrz0PMZL1D9JPdUJmRAoTPAT3QdjLF4msBgvNRPfYYA+Gk2TIwlZIAJ1P30TsEArPXl8WKaMzVujy31KEM96T6KFReJ6+3u9JALgsRH0XWL3xjwWRwKo0DpZPlE7YSVjo0SQKptuhloM4qsmJ+w5FlGvC+XZFlcsACFgZHlP1/tCjYAiPVlhRDvwxyYASogKh2CvjmKwP5ZKSiO2WZ6y6aANgwMM6b1Tnfgd4c2ALJyOrrDH8gg8H3Qd4eO9rujep51pO6aVu4m89MSl8tYQgCcUAoZEJpA6AMKwwnC1p38gNsq4OZhg7R6RHTOjkHxAkCV5/KcU5+5LFmD0UYLADZIiAbdANBthACA2wYJ/fpt8yR2g+qgeIfoNFgneS7PBQIA3iG6AYB9groTBAC6eqYu+vXb7lFsh9VBoQ6DdhqskzyX50IANN8P+LSq01lAZhAOaaPk83TpAAbsP/yF1XLpsnhRqvM+NTQ0ZO0X3OSvywAAoB7TVT2+LM8rAKs+/tA68+NZW0n5vqqqylIBcJMzOHJ/siKQ7955YMAGjE+kcxKGbrnj05+QLd12Pm9foSJQctbzLvudbSMShHssg/WZGC2N9mSNh+uw3HFbbvBwelKwRu5PfhhyHTiclKEeqFaBYBDyCgDTVoc6fwtUZbpvg7kGKTonaBQAzgni4+s8C80tXVRcs5HiiVKaUndC6Ic2vRWfUEnHDzT+7Y/owYWf7CvkqGs98x3FF9eINmjb3fSt/ayTAzMOgDx745edpKtXmuj647+E8l+t30rVmz+jfXPbRbPmkattAGbOnCXqWk4dElcAgNLZOcwG4M+zJ7JOf+scmG8AwOzjWHn63ZVCeS7XG5qoJnZDHEFPzVgpqqH8L0f3C1YsWLtL1OEeJblqjQABJRAAqM7n73kf2Mqnbt6itsY/aO+ycTYAoD6eWb5tt80Avm9vbxOmgQITCAQAjZfTgqbJDd+LgZ++UCuu9adO06ZNn1PHr4doyVv9/xUw1WHrYMuWIwftemYB+wrYPydAuKXIGF0GkTIjZ2ncr1hDk0rL6Pjxg/R+oj9BAeDIucPy7DPtuQ/QH4UBkrM/UK/zAUYDIU6Z4YFikFeokiakztnKZ03xvze62Qf9UX47VmunpqhpMLosM6OhsAoA59bISsvgoF7Nv2G5zCSnfvyWZve/J019/Xtr3sJYHTP/a91Ln1Kd5RqicrgAAAAASUVORK5CYII=\",fletcher:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADoklEQVR4Xu2a30tUQRTHzyVobU1XN4M1rJY2WX0QgkBR6sk2glDqD8j0IVq2lyIowodegjAJ6sU2CtR6DSojCDZ9CRQFIRDUbdncyl9grr9SNIiJM8vcvSveO3fJhtGdedkfd+758TnfOTMPowFnNAVOEDYlP89Bv66ub+hvvYh81ng2ZH7ODZ4BYMnnLABMfCsIOaeAPMdeWN/4rS8DBSAXe4CxD+SEAtjaR/njyMklcMBVkLGbzS+t0N87XgHGfd5qvzYDkM0eL+ockUwm6dmlp6cHmpubLbd67WJtpX7QMUumYL+DboGbl8DKr/SBiAcCbRgHe/f1wBj3LMKzbXw+NTVFIpEI/auxsRHcbve/A0BjDAJrgNkkb5XAdgIYHR0lQ0NDUF1dDS6XC1pbW6Grq8sawKnKo1wFYALHyooz8vg6uZBNYUznVh33mD4rKkr3nfsvP2YkcufSGT3uxcVUP8Ix+3MZ7j1/Be3t7bBvfowbo2YXAFo6WOSkBucW17iG7U5gNs3me0oK6SOEwSBg8ixpTHjzcPlrYCk6aCuEbV1/tjxKNkkBkKwgwsNRChCOXDKHSgGSFUR4OEoBwpFL5lApQLKCCA9HKUA4cskcKgVIVhDh4SgFCEcumUOlAMkKIjwcpQDhyCVzqBQgWUGEh6MUIBy5ZA6VAiQriPBwlAKEI5fMoVKAZAURHo5SgHDkkjlUCpCsIMLDUQqwQp5IJIjX69XYp/DyCHBoqQBMfHp6moZRV1e3K9VimVR/fz/51N0Cpy937l4AN2tSFyUfDn7bEkbbVT+5/TTKrT6z09DWDeXl5fD+2vkMAUdnUhcrzfwIUPuWLrSWKg9xO9P3eAsde/SJpe5CGIjPQq3PAz+qGuj/h0fewUwyfTlxeeOPPt95tgmCwSDEYjH48ug6+G88homJCRh5cheSa6l7xZ0js1yYImFQAHYckpPn6DRt+IPp9LILV6C+vp4qAC8sBwIBCIfDMPnmmf6OdAB4yVccySfj31ctq8ZUhArw+XwQj8cpiN7eXvobr6zjEkEV7DgAdnsAg+AvLYaKQyU617fDMWnlTxVtpQBCCHkQrIBb4XHQNI27drHK2EOwd7CBPUTGtc/i4wKIRqPQ19cHoVAoawDYLLFJytb5jUXnJtXR0UHsJI9GjQ0VdxZZO39WAHhN0vgcAXiLnfoSQAUkFtaka3zCAODhR8bO/18BoPTZYQrXf04B2NwHZO7+TAV/AYmVa+5Rmtj7AAAAAElFTkSuQmCC\",leatherworker:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADOUlEQVR4Xu2Yz2sTQRTHJ/SgEpHYViFgD5ZKRQqBUsQexGJzqzehIIRc/AP8AwTBg3+AB0FEQUJAKPQgtLe0VDxUpBQCRSyWeqgQ0LYGMaiHsvIdeMvs7O82upPOm0ubyWZ33ud9v+/NbE5YPnKWxy8YACvAcgJsAcsFwEWQLcAWsJwAW8ByAXAXYAuwBSwnwBawXADcBdgCbAHLCbAFLBcAdwG2AFvAcgJsAcsFwF2ALcAWsJwAW8ByAXAXCLXAvfJlB+r4st/xiORCf15+ftz4mIl9bo8PObQGWh991tcapO759R3PukODmB4ddMaGBiUA+hE9fGNnVyxt7hoLQAWiw0oFoJA/5QZPNAGh3fnVMwDGR4ri6/4PuXw1mRRPpAJ6FQCCpoHgz/efkR/Xt1q+hBoPAIrTvZy2BkRd37MA1KySzMOK4KEAUBfQqz3mg7ykZkmv1GH+S7IHCVIASbxYyIvFtS0xMzEiWu2OlHjQOBSA188eOs3mZ7G3+c5teQj+5uwdgfkHT15GdgEVQhywKBBhABA8RnO7JUrDxe4CwENLk9OiVLooNhqLbhWF7A7OXZHztafPfQUlSUZNuyYwi5Q9IqsuGuRB/ShZNQlCLICgxaYFAKD6BsQUCJEAIHnyGi0YxQa9NY0C7l6/5Lx4+ymTnWMc6FAA+KFaPdUbUbtJmtVqterUajUzAVDBQ7XH+PnnQP4dLp4VY+UZWQTVQXPbre9y+vSJPjEwek12C3XQfWgO12FkdYgKU0KOADRXl3zXoBPo80nmopSTVDVx0u3W9z5Z4hRIN8dZoJA/6XlWu/Nb4DBEI8mpsF6vO5VKxUwL6CRp44HAIVvactKJCtdjLk0hNLoG6ABIAcg+tpxqF0AHwEDweCeAkUQB3ZLrv7hPoAXwIoQyTw8lEDqEYwcAFlAzj4D1vQCg0OHDtKKWViU+BTyaveoWQbS8vbUVGSwGQAxMTMnWiP8xf3/uvZHFLSkI3+LpGEyFjqygnr7oOxP7etLA6bpAABQ0FLA898rTCbDp6fv2wS2Gpm1sjgwg7LUzbX/j3rKmXUDW10duhG6Ub4k3jQXPGvW5Y9cFss7I/37+X+mq4dSjlXMZAAAAAElFTkSuQmCC\",librarian:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADt0lEQVR4Xu1bTWgTQRSeFdpDj5qDjWITAt700h7UWrDQk4gVJSiIoiAeRE9aKx4UvdXqSfEggqIISvCgiHgoVGirgi2I4kUISSUGD4nHFFow8g2+ZXYym0nc1N2dzl72572dne973/tJoQ6L+HEvk6mLWywtLXl2fL1cdoJACPRykA+3+m756yUPAfTexxef+OXo5TeBMAR6uVUQQfxkBchqMF4BlgCpBlgFCAygIBqfArYI+qQAtcPYKwBFbt/LLHu1P+dpFqpnfvNA/9nt7PmND573D13cwRbufNY2oNDboI6A2WqVnXp2l02dvMDBjDy4ybb1rWNfFn97ziqksg/u7x8+w12xJq5DJ+BKMllHBOVo0bNircY3fGR5mZ+fdnc3YEW0VQqQn9E6pd5eBmJxhE6AVqN/HV739PCJcG+tFmjPUNzpfN5dI9BirW6+E34gICh41T5iQ0AnSLQEKBiIhQKmKys8/4cTXXy/8n0QdcSCgCAAde9aAnQMmW63CjA9wjp8VgE6hky3WwWYHmEdPqsAHUOm260CTI+wDp9VgI4h0+1WAaZHWIfPKkDHkOl2qwDTI6zDZxWgY0i2/yzn+Z+oNyYzRpDXNghLgFWATQFbA9ZsEczlHtaHBofcxlAofmelH4v8vlgs8POxo8f5OS5doq0uIBIA8LNzb9nY2DW+Bmw4E0FGEvD+3XQ9ndrCZPAkCZCweVMfg49xBBA4gIXss9kTDeoBQbBBBSBp567hthTW7lDWCf+WNkjyRnRbIYD8jCKApE2Fb35+gU1M3HYJHB8/Vz8wepAThNqwe3CPGQqQixsRgKpfqfzyqBAEIP9n5mbcrkBFshNyXY01mqYA5TRFHxsAOLHtEQmJxHoedRBAfiAptgQAPOU7tTY5+gCdSqVdQkAAjjiR0KAA+rVHYOXoi9IfGOhnsCPncYAM0V9WTBTV4JwfSde/VVfc9Nq6oUuZavAhm3itcm623q2pQkudZzXyXbWmMzl51f2vLJIzHMVI0uCDfCfZy10B9+JYLKvBb3j6X0D9vuNQoaNZ3k/GZBcLnVjsKP9BAlokDkoR8eNRmw0cynkVQ2LRg10GT1GVbY+fPHJbpKgY+EWOAJrvZQJE8FCF3AmoFaKw0RBE1R82FQl4rhqhw0wDR5zxqe2JfZ5SAtKmNIBdruggAc9pGMK1qm1GrRPw6EGm1MZk8BQdAt8MAJFARNC7RB6KqDg+hxl5+rZnlvfb0L9sWuwuKsVEATz2EKmeHAYpa56AP29NNAreqdoeAAAAAElFTkSuQmCC\",nitwit:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADl0lEQVR4Xu1ZMWsUQRSeLZLgGcKBCClEsLNPGyubFEIaK8HOytqfYW2VLmBlE0iRJpW29naCiASCcoTzJElx4Vv8jm+fs9ndu0VmdmabZGdmZ/d97/vevPeucIlfReL2uwxAZkDiCGQJJE6AHASzBLIEEkcgSyBxAuRTIEsgSyBxBLIEEidAPgWyBLIEIkfg+eu9uZpwfXVd3l7OrtzGaN0dHZzeyvLoJWABmE5+u+nFzG1ujdIFAAyA93ElyQAaDxmcvP84LAnsv3o6X1tfK70LusNY3mMMMaBuHnOWEdHFAAAAz0LnuKh1/A/DNQiW8+O7ixg5CAD2Xjwpoz48//Ns4u5tj/9hAADiRQBgvE8S0TEAAKjG1cOUhQZBK4/oJaAAkPbUPqUBWdSB8OHdScXp0TEAMUATHethpT9loIEyegDIAGZ6ygKVgI8BgwmC8Cg9zXgAJtwZbbiLyXSRBluJ+BKj6CTQd+mSAegb0dj2ywyo8xjLTHts1I3/L89r+Xv27dxtP7xfeTVTYa0HkCxxvHUiFCoATIXLI+9v3c+c39YBdo2vQVIrgVABwHehCrTGEQTOkRYKEsZseRwlADQOEkDaq/UAAWB+wIKJ2WN0AOw+26n0/FD9McHRfgDpD4P10moRazDPuIH74BngA4ABjiWulrw+AAgInrOgFbapqOghtTx8e1QB6eWb/fmf2eXSQd+eKk0bWQDgPXwXLqS99CjHvn75XtkS622nWAEpYJA+AeO4GcZ9AHA9gdD1mKsb9+3XFYBHjx8sHsF7eBQ2AQDvYy0lwdZZBQDfhwNlnp0oRbfGm5Vvvs1YCybuuzKgCaBV53sDAB9imUA2cDxYAOgpeJuNRS0vlQEMQDAKz2nmRUPPf/wqe3ZgizIkWACs4WoUoibPTjYjNArzfFWDbaTVrk1wEsApwIDAD6dR1JcCwDFtTGJM204WQObiACI4ANhnp0E0nikk/n46/lwehTiSkHnZ9JKg6HlskxXeBwsAvcjOKozmGawAYJ3OsQOLcXqa/TrGE+3fNf1Wt2pU7/p8QQbwQfV4m83ICgXQJxP28Zp+q2vzzj7XFCwvfZRv8yKVBZIMbUvbOIH9ggSAXocxpHsb47mGUqEcNEZoBzdIANToZQFQIAACvKzSwDxBCY4BqxqtTNGgqaxYlWFd2Nh1bempZWhf9yK7X9/7dzWwaX3uCjchNPT5zIChe7jJvuQZcAMpgsBTWQ1iIgAAAABJRU5ErkJggg==\",shepherd:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEhElEQVR4Xu1bQWgTQRSdgBdtg1RLm6KipoUiWkGi0KsFbwX15EEQvIqgeBAR9KKIJ8GD1wqC4FGhN0GvBS2CVaTQRkWlsVSDJDUXYeVN+9af6cymoRPMNLuXbLKzf/9/783/f8NMRjU4rpwYjTCkXFlWhaGcHj09V1I92S59fu/5VKaRjXa+3tB5AkAQGDiD6ggAerq26niLpSWVz/XGhJaXa5tfAbdOHV+ZAss1VRjsU+VqTRW/VxRBufH0ZUMVBT0FCABBYOAMquMAyPdnVbn6Jya1YwDgFNBVYH6x86ZAT/cWzTw+9XRYVUHwCpBlDoGZc5xadwFgJjgoxXWgl9DPWO0h2qGPyJgAuECQAMgcIINNCp7jAELbAyCDkopAgKZC1hN0HUgGADZVmAriM/ks87tNcbRrXvv5u6Z2bFvpa3BYFZAkYbMTbLbGmwpwOWpOFbbiUB8aMulHko2gAYjzz2rOaAY8FzFrFNAsg5ttfNBtrA8yUgB8oBiyjVQBIbPnw/dUAT5QDNlGqoCQ2fPhe6oAHyiGbCNVQMjs+fA9VYAPFEO2kSogZPZ8+J4qwAeKIdtIFRAyez58TxXgA8WQbaQKcLH37dOraNe+Y1aAkq6FpganAjoegOnpF1GhMGYFKOlaqoDAEHBOgSSW0xyQkCADE4DKgE04XfpR0b7ndmb1J767cgDvsd2H37b39qlfS4sxFvK7q7L8L+AyNqnjNwBhAwHX6KwJEO9DwDgAgnne3b23rXoPpzPV6ueILJI1BDg8PKgDczGJ+2xsEozgAACDdBrSJ6OuQAicTQUAJigAyCSdluy6AmF+kPNegtF2OcCVfGzBrgcAmQcge+QR5BMCEhwAcr5LebsUQACarSy+qsDJw0MR1gFyGR1XluETK8SevZ2ry3uJ7wIma5A3GEUidAEwOfkoGhjYrVl/8+6D4jnLrKu0+gAAwR/N74lNYWGlXFqHBZavi1/qQEjsBM1SCHYXFr6qI4cOOKsAAIAHCBxj5Tl+axUAMvik1asmCE4AyCSCGB8/p8fJ4FyBYO0xdpbgwLL6sUsX6silLR+MSxvnR0cibOexLadF0BIUqOLh1IyOKYMbaUguP13PelzeJ5eqwol8bqWbLJYqelmrPPhg3wAAeAbqWt8sQeBmL90JUupwiue2lliOtY3D/Y+vXVfv94/o+A5+nFFn796ps9mqKkAiQWISAAQpBoClzda2IojZ2fl43rITdLEHGxOXr+pNFVzUfPvJRFwCZVPVCgVgO4/c0IVnyBXuPJe73TJJnZut5WU3SMAkcHjgzdNnYgYg/4sP7sd9AK63qhOU+x4aKQB+xTlAtrfs/Vn+XC9DbGzIogSD5c6cTq1uhDAFXDlMJkGcrwGAtR1y58sOOzhzzpqtruvNDwDIa/ie9Iq90SnBMtioBOI5shfQ/wdIAGTyw2DbK6+NXYAnlWEDs5UAwCfZC3BzF3KC3Oq3phHi+72sBGQj6U9RyZhZRch2MzY3qgDeDxAG+/9t75V2Zf3n723154QvEJqx0/EA/AWvjT+9rp5EOAAAAABJRU5ErkJggg==\",stonemason:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADf0lEQVR4Xu1aPWwTMRR2UBtSCKGMyYiUIiFSlVRULEWiMwsUIcTCSAExsDIxsTIgoIxI/CyMzEWiCypKqBqERCMxJmPaEKkhrQj6XF704tohZw7k3tnLufZ7rr/P33vv6l5CxLwlYo5feAK8AmLOgA+BmAvAJ0EfAj4EYs6AD4GYC8BXAR8CPgRizoAPgZgLwFcBHwI+BCLCwPLym+63tXVx/fa9QKoOZOwyV88fP+gWz02KQuFCIEyBjF0mAHurVN52Y0sAQmB8PBVPBZD8oQJVAVAFxsvv17T5ITIhYFIACNjYaIvZ2ctarJEhACo4PjmxB+ifqkNkCIDMQYJaBnVjPJl7Alwvbf96f5FSgA1ZngAb1qLk4xUQpdO0weIVYGLt7MyZ7oeVj1qCBs3ZnEJQn3w+L9/v0Vqtlkin07JfrVblfrPZbG+er12v1/fgMSpgPxNABHFyOEFDvQl6AvZxCEABuVxO1Go1gSeUgFYqleIRAmpOGZQzIpkDQiHg5sKN7qdyWaiVALnhdLEoni4+05I3VTglM/Bq5XPfvGk8aAWAPU40k8lI12azKdDHk6pAKAQAKBbSEaAbp1/6PwiYnp6We0P543Gui3EizFQ2jSFgC8TWz0YJYfh4Akws2p6krV8Yp2mzhlYBuEd7uPhKrnd34VrfdTIBVMcH5QC+npocbTYdpk8Ct6ZYEP9XQ8PNKtqdW/fl89GT3SfmMaeO8znYcOJoLT7uHAHI9j93tkVne6dHbGpsTLS3tuTPw/RhlxwdEQdGRgWtZfJzngACwmXGyeDjnLhh/Ux/YYYp6yBrJWaKU11++gBCbf7KVXE0kxGbzaZ4/fJF37pkx31JCWSozmHcSQWojOFkIeeLl+bFZqMhp5feLYnCwbao/EjJn8lmGLZhS22lvOrUJUyC3vgIFJ44OcQwGgc9d35OEoGGsIANBwfSqPFxGsO8kyFAoLmsAe5Y5oj2gBvN770kST4cPMjhoUTrOxkCyAF8g7Lf6YhkMtlTgcoCAJINnwNointTjnAuB9CLTS9xdTqyCwLUzE6yBkgQQHbkawLNSXKWAALUA5NM7gL8Xd8pR9AJq/bpw4f6hKKrAE6GwMkTE9obVPV0OToVvDZRGAa/fF13qwrQJyT4ioJed7F36uO7GzTMoz/Ijs+ZbIN+xhaEXBtbp07DBsDf+sSegF9mxW1fTFE1xgAAAABJRU5ErkJggg==\",toolsmith:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAEgElEQVR4Xu1YTW8bVRQ9Axk7sWOT0KZyasVVWyWkgiYLJEtVUkBBols2IASrlgU/gG6RWLFnj1SJBRJS1wghiEAkCvIGJS12ZFDSxLh1adokHn/UH+Shc8djxfa4aoQQ08x7m7Fm3hvPPfecc+97Bnw+DJ/HDw2AZoDPEdAS8DkBtAlqCWgJ+BwBLQGfE0BXAS0BLQGfI6Al4HMC6CqgJaAl4HMEtAR8TgBdBbQEtAR8joCWgM8JoKuAloCWgM8R0BLwOQF0FegrgfkLZxSgsJTZ7pgzN51QpWoDq1v3joV8+gZxNnZSRQIDWNsudMwhMPndMjYLO8cfgGjQ7Mn0TCKmrHrTHwBEgibWuqg+e2ZcFWsNnwDgIgEbADLggT8lQACsWhMbxx0Auj17hOX1ziowP51Q1hOqAJ9zods6vm+p633/dx/yxDJYrNQRDZmshmDHwMhYAiOhAJYyW65r5y8kFOd3B0pgnhkASPNIyMTExSRyt1JtABhYYjaJ7bUUipVGj0EywH79gwBDBnT1FZ5kwExiXDHz0+fGsLdfwd/KwPOGfD9GXghhfXMHVqXu2gz1y/QzBQAZMDxkYvxEuJ2gwyAUHlVQLNd6miRhQB+qCzOU8r4HMPvkfDQUQKwFALPOQTZwEAAyQCnl2ik6gX75xefiB7LjUMBW/j4++fQzT5XPjo9xqE+Xp+HFTw0jfiraIdP8X0XkH5TEEQlSsdrpBU4V+Oj6dWzlCiACBhEwgEwmi6++vuktAJygnUQxIEmYUjAMAzTDSDgoIFilGlgZeF8coQUCDDsmsoLS4fMr736A9HrWST729/dkzjfffu8tAKh3OxYF9viRgIl3rl3FzRs35J4MQ3IowwHG+S3Bt8DiPbbJnO00Sm9dmpCX/LH5WNjgtU2UwV2fw/G5hTexvLiIuYUFLC/+AO4GJdutAAUQw0Cp1pRgOLjmpcnzQvF0Jovcakp+R0JBhAcHZE6p2kSpUpP7niuD1Gx+zza3px3x0ZCYGr3i4txruPPriixNzCSxvZrCcCiIoUETJ0aG2q+kgd57WO7pEJ/2P/+recKA6dOjyO+UED853L6u392V/+SzeMw2wnyhCN6nTFrKEACmJs8JU9LpbLtxIj+i4h0GiuXHjlK8BwBNkIFb1RoiQ8H2lYBY9QYuvf4Gdn9flYBHJ2ex8tOPIAPYCVq1Bnhm4FYOnYy9d+Ws2vjTQuo3bx6gGARgamIEhUdlxF4Mt6/Z3B6iYVNAOTwIlJhdpWG3yLZH9j0iu/r2lMrfr+K7lZyn3N+JqQcABp585TRSt+/CAeYwAASJg4ARAJZFju6jM2fNxx9eVrfSd7wLgH32ZwrdhdrlhmSewwm224DYGdLUCALn2wC4H5ISgJ9/yXhXAu8vXFYr6UyPyb56fkw2Pv2GAPCwbDPAMFx3hlybfNkus571ACdAHnYeDNh6f65ZhzKDqCtgLHgAq8IzAJodnX1QGh+a5MFAoI3P7Q3384G+CHrkQYcxHW6KjvJ9XuvujvLtnnTmowTwb+f+Ay9ZNl9FvKgMAAAAAElFTkSuQmCC\",unskilled:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAhElEQVR4Xu3VAREAMAwCseLfdIV85qAcGbv4W/z+E4AGxBNAIF4AnyACCMQTQCBeACuAAALxBBCIF8AKIIBAPAEE4gWwAgggEE8AgXgBrAACCMQTQCBeACuAAALxBBCIF8AKIIBAPAEE4gWwAgggEE8AgXgBrAACCMQTQCBeACuAQJ3AA2jYAEGs/2CBAAAAAElFTkSuQmCC\",weaponsmith:\"data:image/png;base64,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\",level_diamond:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADHSURBVHhe5c+xDQIxEEXB64eQlgnpg4AeaICEGAkZXz4uwHrBSKv3oz3GGGmMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCuv8R2332ee3nfEuHI+f30/5+l9R4wr5/OXx32e3nfEWMJYwljCWMJYwljC2DGOP+qN1Dfu22NgAAAAAElFTkSuQmCC\",level_emerald:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAhklEQVR42u3UMRGAMBQFwbiICUxgJVpQQ4MSFDBRQEnNPHzwtzgDW1xL0irXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAswJU7x3umLMD6bOlz1AXoc6TtSzwAAAAAAAAA+EUfFinRRoswk58AAAAASUVORK5CYII=\",level_gold:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADESURBVHhe5c+xDQJBEATBT4LYyIS8SIYccDDw0fLv1wVwaqOkVY+1x8ykMZYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCufec3j/PUtifGlev5z+t+nt53xLhyPf9+3s7T+44YSxhLGEsYSxhLGEsYO+b4A2rT1Icf5ZDNAAAAAElFTkSuQmCC\",level_iron:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADKSURBVHhe5c+xDcJAEEVBd0sTUAUBGaFTOkCiC4qgh+Ocjws4vWCk1fvRbmOMNMYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGM7/PPr6v+zy9r4jxzPH8+3Gdp/cVMZ45nn/eLvP0viLGEsYSxhLGEsYSxhLGjrH9Abro0nm1ZydBAAAAAElFTkSuQmCC\",level_stone:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAATUlEQVR42u3SQQ2AQBAEwfO2SsYGCQ8UkQsClx8i2CoHPZm1AAAAAAAAAAAAAAAAABgqSSfpsfHPvvs6j5kjJPniq2rmC6pqbjwAP/QCF28aJUIjE8AAAAAASUVORK5CYII=\"}},Sl.vindicator={name:\"Vindicator\",aliases:\"illager\",behavior:bs(),entity:ys(),model:Bs(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Cs()},Sl.wandering_trader={name:\"Wandering Trader\",aliases:\"villager\",behavior:Es(),entity:xs(),model:us(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:hs()},Sl.warden={name:\"Warden\",behavior:Ss(),entity:Ms(),model:Rs(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\",bioluminescent_layer:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAACNElEQVR42u3bQU8aQRQAYH5BTVqIok3xZrxYQZt49VKNZ5Oee+mR/38sb+sjA2GB0mKW4fuSyS4zA0He22Ef7vZ6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwfh4cflwdn37Mri9X2hnV18fY8wnVLHB59HLYHz/Ohh/m0b78P25afk4EsGnVHMCRNA/nU7bxmMsEqSL7/3k6WmyronuxuBvH9guJoEE+Ofl/8t0H3MlwCEE//zy53s8RwJ0VP9i9Hh6dTM/qvPkL08Ac5vjMTeeIwEqqwAisBHopgyMiqBoTV9WA7PHvgIqrP+bYJ+Pxu3L/mgcc7r4e8B7JEC/P5xUvwpskyjKwCPgAz2yo18CSAIJsCLQuR/bcr/6pLACLAZ9eH0zibbcbwWo/OiPoMc2/+6yr+pVwFfAn6M+g/7w60fTMhnK1cAKUOGyn4GOoEewMwFyP5Og2q+DY06APPKzL4/25f0yCfxwUHESlMlQ9gk+AAAAAAAAAOymPxy1/r+9f3c3KcfXzd1mnI4FPbZNkItAz7ezvuZ6vZiTbda3/DoLr1U8lhRdC/pbQPOKmwhMeQlaJkE5b54Eb0myam6+Tjm+as5W79HVP/uz6RrEfTcRwNGPJKDn3sCdzpBrPJuu4t7AtsBsE7C/rcFrSIKq7g1cV/vOy6CWuniXGry2JDjoewM31b5ttfX/qsEPfdk/+HsD1dW7J4B7A1UB7g0EAAAAAAAAAAAAAAAAAAAAYL9+AzFrX0kqWSbMAAAAAElFTkSuQmCC\",spots_1:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAvklEQVR42u3bzQ1AQBAGUIk4qcKRKujAzcnFWTUS9SlAETTgIrH+9r0S2MzON9lJEgAAAAAAACBSadNuvgIOHQAAAMjfAAD6EQAAAAAAAAAAiFa5rF78AHxHNvTK9l/V3ejnAje5+t2/PQLOmWYHBsBUDtEXnk05UgzvZQSM+xQAOGa2DgDwPXlRaeIAAIDYGW8DKOe8jl0GUMoBCMzaEiCGgftebNMbAaoHAAAAAAAAAAAAAAAAAAAAAAAAwewLzjZyVBx0lQAAAABJRU5ErkJggg==\",spots_2:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAwElEQVR42u3csQ2DMBAFUKSIiilSwhSwAV0qGupME4n5GIAhYAEkiiSW8b03gn32fVknVxUAAAAAAAAAAAB85zGMu1UAAAAAyITHGgAAAAAAAACAoPrX2+AIAD/1WbQWmwgAQFL1PMUIcIJquRsRpojBFQtACs2zC32t+zsBxSP0AQAAAAAAAABA7qLP+lGIdt3OC9m4GuR8QqEEtx79FgSJV/VckJ4B9Hl9HgAAAAAAAAAAAAAAAAAAAAAAAP7qAIDaK6EL6Kr6AAAAAElFTkSuQmCC\",tendrils:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABGElEQVR42u3cwQkCMRAF0AXxZBUe9WgHdmADXixJsD4LsIhowibEdRsw8x4EBW+Zn7gRJ9MEAAAQy/2R8svh+UomI5hS9ByAOohne7sKQXSb8yW13YBgO8DxlHIA7ACBCl5XfS54/xVQ3jOu3f6Y6orPY1l8J4HBi5/HV+HrQ2B/KmD81d8XWtGDBWD1twAAAAAAAAAAAAAAAP5B+wu4HsCgujZw/QCBi68JNGgA8qovXcHE3QFKc+hKixiD+7kHYA5D+UwgYpwAliFo9wR8ApCbR81ShCPg1N0J0AWh3h9gpoKFoT4Y2gWCBqDtCgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzN4sxb2nWs/fcgAAAABJRU5ErkJggg==\",heart:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAvElEQVR42u3WvQ2DQAwGUBqqiIaGOiXslIaRIjFfBsgQ/Fg4oqFO4fckdBKlP9t3TQMAAAAAAAAAAHDr8ZzWdn6tKlHVe4kG0ATFQh8/3wi864cI/zgVpkj4v2+X4R9XgeIUEJO+h3+deNNfbANkE+Qv938hufIz9DjPh6DqFGqC6/r3CLQRhA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwP9siHI9IZ3/xJAAAAAASUVORK5CYII=\"},animations:Gs()},Sl.witch={name:\"Witch\",behavior:Js(),entity:Fs(),model:Hs(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,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\"},animations:Ks()},Sl.wither_skeleton={name:\"Wither Skeleton\",behavior:Ts(),entity:Ws(),model:Zs(),thumbnail:\"data:image/png;base64,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\",animations:$s(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKCSURBVGje3VnLjsIwDOwXIHHgAkhIvXHnuBfOqz2s+P9v6TLVDpodOWm3NCUUycqjSWuP7dgxTTPwOxwOHWi32/Xt+XzuifN8lqLm3X8q9OVy6clB2G63zX6/7wn9tm37dhUAuODsc0wASAQCIKwCABX4dDo9WoIRWQBpNQBAWBU+sgBqHUQgVmcBFFjdAWMKr1aAdnVnALXPOQKifq/ugGerc4FUJPDwx/nqBYRgEXnoc9+PrIGUe48DWA0AyujH9dp9fn1137dbTxg7CNE69DEHUkBSeURVAIA0u1NgIk2rJfj+lDU54VkVmV6kUWozSoCo5Uj77iZDVAUAmuujdZO9L+spNeb61EGYEr6KQ1IZhTDQJJhTzYLcEtCHxrkGe7guigzqXvqsCgA2m82DSQiAvvrur6n+IX+OPRRe3zlELweAjNKvqVWPAB4ldA3J3QDvHqJq8gE9A0r6ZqqmQHBz+5THIowV/YBklvdfA6LwHOcAKKYgnsaptsTdQgXWcZQYFedPb3g0RR2XCrvqBnqxWpw/L3R4O+bs0DCX8mW+z8MgtamRh30K+gx/owHwosfUVJUCKAgMrUO5f/TNufkLNcgkBuFN0R9jYqpJz/OZGPl9ILIAdwWd09Ta29nu+57HT01U/KpMlyDTub3kISrIqJtoO8uhlDtp/3sGUFD0NTUmMLkzgEmWW+Ez/I1OTFLt1NCq9USdG1N+83flDsJZ8oCUf00FIHUIjgHAvxnVI7QtVhJ7xX09MuviAHgKvFRKnEt3F+Uv5/9LFywioXLar6KmqNdoFk8YRo/HY9e27SMJ4nPdw33+lxvXvcUfJxqymFNoLqFzHi6j0vmSRdMfSRlClm3qulwAAAAASUVORK5CYII=\"}},Sl.wolf={name:\"Wolf\",aliases:\"dog\",behavior:tl(),entity:il(),model:rl(),thumbnail:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABgCAYAAADy1PuhAAAolElEQVR4Ae3BCZBl11ng+f93zrlvz7WqslZZtmxrlzdZ1uINGWNLXjDY0LZE0ywmYgbDxDQw09PTgCYaMD3RMEN0wwQwjdvQER22jA0GwsgGbC0lay3tUq2qRao193z7u/eec76ph51D8vyySlKVpCxH/X6W8142l1xyyTv+p1/4xT+8+uqrP3jk8OFdjUZjnu8zwnln3SUXX3zNrbfcets1b3/7h8xJnOS9z++6++4vfPH22z975OiRvXyfEM47ay65+OJrbr3l1tuuefvbP2ROYoD3njTt5fds3/6FL3/lK589euzYXs5xwnln7NJLL7321k996tfffvXbbzYnMSAEj/ceVWVZCMFvv/feL3zpy3/+2WPHju/hHCWc95Jdduml7/hXP/mTt117zTU3A8b7QFRlkKoSgsd7zzKfZ/S6HdK0lz/48I4v/s3X7vjs8RMn9nCOEc570a64/PJrf/InfuLXr33HOz4kJ7FCiJE89wyjqjQbddJehxA8K4UQ/UM7dnzha3d847ePHD26m3OEcN4LduUVV1z76Z/52duuu+66m0TE+DzH+5xlPgRCCKjyPdrtJvOzM3S7bUSEYrFIoVBERDDGUKmOUKmOEGPM79l+z+1fuP32zx4+fHg3a5xw3mldcfnl7/i5n/30/3HdddfdZE5ihRgjnU4b7z2qfI92u8n87DTdbodB1lrWrd/I2PgExlhW8t7n+w/sf2T//v07nnjyyYcPHDz40JEjR/boSawhwnmruvLKK6/79E//zK9ff/31N8tJrKCqpGlKr9dDVRnUbjWZn5um2+0wyBjLyOgYo2MTGGMQEax1OGcBYVC5XKZSKdNsthpPP/P0o0899dSOJ5588oEjR448emJ6+rl4Eq8S4bzvcfnll1/3sz/907/+zhveeZM5iRVUFe893W6XEAKD0rTH4sIsjfoSqspKIkKxWGJy3QaSQpFBxlgKhQLDiAilYoFisURSSMjzHO+9NhuNmSeefPLRAwcPPPTIo489fOi55x5dXFycjifxChC+T4yOjGy45u1v+/FHHnv8L5eW6sd5CS6//PLrfupf/svb3nHNNTfJd+BcgksSUMV7j/c5qkpfjBEfAjEqadqj1ayTZyl9MUbSNCXLMkSgWCxSKBQREfqS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\",animations:ml(),render_controllers:ll(),textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAU4SURBVGje7ZnNa55FFMXnbxAR4kJBVGppSiFGDH5U2oC4cCMhiIILQXHjx0KCIhSDWFwUpGArBIsNKAUrKISSXaFVbO3CRqxiNLabgm78Gx5zBn4v5z3ME/B5s8zAZeaZr3fOmXvv3Jm3FEu3b94qv1y/3v31x5+d59euXK35pYsXa06dvp984lBBDh+6v8rs/nvrfAsLC2Xu0dkx0ZhvvzrXfb5yuo4nVx1z+m8pp175+2WpIFcvf1eOLb1V81ubm2XiBAGA1w86eJVVDzGqm57eVxABh4TFxcUKWHNKVNZCGSfAKivXt5PrBPgaJEnAv3//MyJi4sQCHSRlFuH1qnMCAC+Zn58fgZZABmMF3Ilszd1qdwIcvPLBuy7RBMph3ElwFUyTYBxzQMbMzEx55dXpcveF56u8cePT8vbZ44V5Ndbnp94Jb7UnAchgE3BVc1VMVc8+TobbKQT0JZ8zwSbprfaWBgi8yoNSMp326GBdTZOkdIp9KW3czavlA7K95QNEwGATSGBKd9x5V3fu42NVVFZK8Ekci4aA+UceLOvr61WqT9j+Vu5909PnXK12JyBlsAY46wJ94s3nupUTH1VRWXWtIzCPR5ximknLnLyuz/H2mR3mk8QNJoBJHPyp4+9WcRL8WPJFef7yC0+NnSQJJIH7rieonMP7pG9Q22AnyM4DOO0RQtCEnQQ1T81CnJCUVP3slz4hiRpEgJ/d+5YOlu/Pf9Z98t5rnXIv3/z6wyLxaM8DH5fUjAx4diLBg6TUrvQ5aRK7QsBP35yuoJW3CHj4oXuaBFCWs3MgAFDI2zKDPAGyr89BHw+bldNnEAEAkYiAGxe+qKCVtwjY2toaG5MEYALE+yzOyy2n5+D8fsA4B+pzeZ9BBLz0wX1jIuBzjx+uBLg2QMCZM8+OSYKXBrhc++HKKCTmQqTQNaM4zvTl5eVRcEMYrXrNwzehL/3UNjgQEjiBvf375kh09vs3ZGAWEpVFgNI2qM5lbW2trK6uVjAQoEUr17ckTQHvLjIBK3AufQQgExGQJDh4CMAkMAsRIMAAURkwAi8SfMGe5zEHEUdnH6hg1s9/WfuSQwBEQoC3DUoCox2X2veJ2gHdIgD7hQyV2RV2UwtH9O2BEV5fdZiEk+DqjykxD/cB9dmVpF3TLmDXU1NT9W4vUTlT686vMkDYscxxhnJgY48i20BcrQGIv9D4p488Vg4c2D9WP1gDSNshrMLYbvWdF6uIABHhBDxzZK6TLC+93v146XIHAXnn90uKALn90989uhPgjjFJoCzw7gf4vV0nIDUAAgReJPj43zZ+HvPqrpqtU0BgEY4xiQjsA+6O0IFP9B6w0zucRER4MOL9+faQOp2b3xn8DpHOL6NEXo3wL5AAKXkKDNaADC3z1iWf0IrPCU64hHh7Hm0exWVY60GQX3LSOXK04p9URtSmU2ei94DcXeo0eV84Sl8noHW2J8FJQL4S+fy0E1dwvGpdAKduIg1wNXWgmtjBtszA3xVab3t5u2y9AebtDsdIG7tNCO7AKU/kA9IX8N0iAPWnjz+t5c6m5qQP6Ht5hgC+kwA5aJmD8okIWDl1cuSJKUtUVp0mzhcZbNNNIO285QRbDyOtccQHEE1kKckruGvDoOTgPWcBfgq0/rRwH5D38zxRWi/P+eLsWsa1mBA53yKSjMEvQizu142NkbCgJKDlL3Kevmd0fxnKf5xa4yBA4irvRFCnfFBiAthMG+NHPEflnPW+N8K+OKCvrztaP318Xa4BXreX9tJe+t/pPwjVz/Na1q/9AAAAAElFTkSuQmCC\",angry:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAY9SURBVGjetVnPa1ZHFJ3/QCgipIsKYosVE4SY0lCtxQbEhRsJoVhwISjd9MeihIogBql0IYhQFYJBP1BEraQQNLuIsVQr0kS0palRNwG76brLZ87AeZw5ufOJFB9cZt68O/PNOXPvnTvzpSTP0rPn6dHcXPP07yeNlvfv3svl7ZmZXLIN7x9v25wo2zevzzKwcW0eb3h4OA1+OFAI+vx89XJzfvxM7s8SbRxTfwsl21EeTaOJcm/2Tjoy+k0uny8s5DpK1Yna/5ucbCVFBBA8flDBo452EoO23t4NiQLgJGFkZCQDxpgQ1DFR9gNg1FHiXclVAnQOECfg3xf/tEQApBMQtVcJ4AQVJOuchLajTQkgeMjQ0FALGkIy2BfAlcho7Oi7glPwagVOkrevWHUIFFGScSVBTdBdgv04Bsno7+9PBw72prdvfJblq8dn07cXjieOi746PtuV8Oi7E0ABSFqEu4C3Fw/ZnZ251Uxdv94Mbt3ezD140P4g6mwjEU6G+ikJqD26qg7WSY++RxYAkKw7AVF78XBwAAQJb61ekwXvEH1XM3VX8aBYe9zH1b2iGODfoxigq3ylM5EiHW0PJ0QSbq5a1Sz19TWXTx7JgjraaBW6C0S7BAkY+uC9ND09nSXHhOV3lKrrkd7Hir4ruP8rrQVgYACECwD0ia/3NOMnfsiCOtrwzbdA3x4ZFN1NfOfwtlrg1d/y32McUeII7P6vd9vgS/dw8GhrCYCAAAV/+vihLEqCbks6KS337/2k2EkciAPXVXdQPobqeGxQ6wA47gwkwQlAWxsEIQBIwPR/CgmBDvVrQjNXv9XvSoiLm77reUxwotTvse2ShK4WoHv3htG+9Mu1c82Ph79oUGr92U/fJ4hme5r4qLhleMLTjQRNkty6POa4SzgBEAbJqgU4Ab9PnsmgUUYEbHn/nZAA1hHsFAgBIOWN3MB3ANfVMaijaTNK6kQEvNIFCAQCAh7fuJhBo4wIWFxcLPo4AXQB5vucnNajoKfg9HzAfgpUx1IdTX937vgol8wDnAC05WffsXWFADgSH5RqDSRgYmJ3IQ4eFqCCiMyV4KpwYlEWNzY21q4agxjaNbJ7gMM3AvW+kX7xABzALv210AoSH30nGXQLCOogAM8yqEZlamoqdTqdDIYEYBIo8Q5xV2B0B5kEy0MMpQYo0utGGBZqBQFceRd+05hAtwABAEwgqBMMwIMEnYCWvs2RiE8H3s2TnL52KeuyJDASqSvMb9qnm35BAMBgxQmWq05i0I7vBB0RQP8lGahzNbgSmAgF75oYMeqjjS6hJOhqRluc6hC8Wozr874ifLBqWAX6dU9PTz7bQ1D3Jzrzo04gXAEvGQwRwIpLkWUgas56mGGCgwC3adPGol3PBdo30g8JWE5hkcY2ne8+zwIlEKEE7Nox2EDGRr9sfrs925AAP/PrZABI/Z/6GtGVAA2MTgLrAKN+XQNf0y9coBsBbgEkAOBBgvb/c/5hEdXVNKNdAGAp3MYgILAG3KO7WoDuJFHgVP2CgG73cBAQocmI6vNdU2oPbnpm0DOEBz/PEnlrxPhCEnS7011Av0Vt1V3AU0s/dSEmRPk5kxO868WKX215FudprSZBesjx4MitlfEJdQq+YdfhzhOVFL20Le4DfHXZhsFr6Sh1lYBob3eCnQC/JdLx+V2BEHQEnCAh2k4C+W2FBaiZKlB0UrCRG+i9QnS357c90R2gn+4YGPmNq80UPAJOHSfAySkswE9cfhcfEUDzp45erfnKuuV4DKjdPJMAvjsBAAJ3IFCuMtsIlJbCvissYPz0qTYSsw5BHW0Y2G9k6JvqAu7nURCMLkaifswPSDQzS4gfwdUa+D3SUQIKC1DwWnICugtEf1poDPDzue8oGgM0RigxamU8FjNF9ruI6D5C26MS40CKa3FO7o/5+VY4IScgihc+juuqS0X3e7V+JACiJq9g2eYERaX/dZcfdlRl9TH+iJYaUJTI6I6wlgfUdDXQ6u7jK+tWULOGiBTMvX0iBe+oZwM3Nf1b7U2e4fW33RKieUbWortD+zibrxJfgXY3ecNn+Ah0zey5yp4E6U7SPsj1X1ei02Et+kYTxbv+Q6vi7vc646KsgdYESi3gJdL8h9AytSElAAAAAElFTkSuQmCC\",tame:\"data:image/png;base64,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\"}},Sl.zoglin={name:\"Zoglin\",behavior:cl(),entity:pl(),model:Ii(),thumbnail:\"data:image/png;base64,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\",animations:Di(),textures:{default:\"data:image/png;base64,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\"}},Sl.zombie_pigman={name:\"Zombie Piglin\",behavior:gl(),entity:fl(),model:xr(),textures:{default:\"data:image/png;base64,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\"},thumbnail:\"data:image/png;base64,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\"},Sl.zombie_villager={name:\"Zombie Villager\",behavior:bl(),entity:yl(),model:Bl(),thumbnail:\"data:image/png;base64,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\",textures:{base:kl,base2:kl,base3:kl,base4:kl,base5:kl,base6:kl,desert:\"data:image/png;base64,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\",jungle:\"data:image/png;base64,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\",plains:\"data:image/png;base64,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\",savanna:\"data:image/png;base64,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\",snow:\"data:image/png;base64,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\",swamp:\"data:image/png;base64,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\",taiga:\"data:image/png;base64,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\"}},Sl.zombie={name:\"Zombie\",behavior:Ql(),entity:Il(),model:Dl(),thumbnail:\"data:image/png;base64,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\",textures:{default:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAOMSURBVGje5VhNaxNRFJ3fkZ0LSzbiB1ikgtlpW4ILFxEaNymILUGkQinaRZfiKm66KEh3Qnf9I/lPz5zXOeOZkzeZBINMxsLh3bx7M80579773pssq/l7cfwgPD98GDiqrWMK8GWb/kcyeydPCwFoK9EU4GuFAK/Pt0ukaasoz95slcD51ggAqACArn5rBeBKMws0I7QEUgK0ogRSqw4BvBG2VgCtd61/EvdS0AYIXyt6QNXWx1LQctBdYyME0K1Nu73v76ltzle/6hm+Y1AgxDZmn3fS/IFK4PjbIMK3RG+I+hzdPVJjozLACVCEDz8G4ePlMHz5+T6czMZPl+/iXGo7XHRo4naqfaVxNa5pjBErfnC+G4kTnMOoW6I3SB1dLGZII/d5/ljMgWin04kgeX6GT8XSrNEsoM8baKNKwLu37vmsfcbys5Je1AvUpzGNKQECB5jUau2ePon2/szez+cx5+mM7+IZvntoZmimNa4J+uqkzvq0fc/3DKo6GPlzG3cuGOxNg6Lb7ZZQ+4DpNGwf3E8CvkfdzwtR+/zb2/iciJntmdUIAfxeQKxFAJLPsfZtddME8BPmf1cCf3338B+w8/h7eLnzqwDmtu4NC6gPyC4u/mA4DNn1dchubuZOl5iLPo0HMJd/J5IDYGv81dUdYJsAtf51CgA7KcDR0R1gk8jsxxedHkRITuMBkqVfRUgJ5nF1/lUFcIK1AigZFSAXYW51NZ4CkLCS5/ivBMDKVwkAnwqAz8yUmPYkA9vJ6Opjvipe49T2eKQ6swZ2nX8ZAUhokQD0c6Rd/GPCVzAlgMczUzxzpMkRPIYT7sf9RFErAFdSBdAV1r6g87RLZLymVQDaKhjsGgH0YoZ+wgsZRlzJ9RYLYI5A3FICKCnPAJ1L+ecIefqrGADjmbZVQuXxfrwGMV7PMXKedxj4356+iuRhr00AjVtqF0jVP7u6NkEXy8Tw6zRXlwLQxwxhaTBupSZYJYDXvWJOgKpmxs9VgnnpmABMc5JnKeiLWQqwUgn0er0AVBHkPOPG43EJBSE92OhKOrGUAH4WkDl90wSyJE8h/DZK4ktnQL/fL8iR4GQyCV/PzqKtPsS6ADwncHQBi0whwRlpPVfM+XPhOK+XHb6fZPrD1ldv9KMHLJ0BIKUAKZIH3D8ajUpQAVLbqJYSiC2KZ4yWor5u4ys6fS+pPYJvrtkEMdbx/w1lxzkXWEm9iwAAAABJRU5ErkJggg==\"},animations:Ni()};const zl=Sl;var Ml=a(8569),Ul=a.n(Ml);const Rl=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAABVklEQVR4nOyZu0pDQRRFjxBFMTcxPhpFEMTCRkhnb+MPiKBgbav4B2lF/0FQkLQp8gmCoBALCxECQRsfMSSipEp3SWAPYSBhM8Ne1bA5HO6Cw7mvTJLLWchkLHAkwGZAoHV3YD40v15gXljYsHH2yW/fpGeNEBsJsJEAm7gEXPt457gD84dyEeauPi7c/W0oGiE2EmAjATZxCTTuJ2FRpYQ9ffe96/m+UnqCea1at2FohNhIgI0E2AQvMNH/bbQwtwyLjsq3MD/pntoouJy6gPnV3j7Mmz/v6VkjxEYCbCTAJq77wPrqJiz6brdg/ni9YqOgePgG8/kkD/PXxnN61gixkQAbCbCJS8C17137+O/jH+YzS9Ne9a7+ruvpRyPERgJsJMAmrveB6tkWLJrNZs2HxbU2zD/rifnw28H/j3fPa+lZI8RGAmwkwCau+0CIaITYBC/QAwAA//9Cy7DYAAAABklEQVQDAKP4R80IhpgiAAAAAElFTkSuQmCC\";function jl(e){let t=\"\",i=\"\";Blockbench.isNewerThan(\"4.99\")?(t=SystemInfo.home_directory,i=SystemInfo.appdata_directory):(t=a(857).homedir(),i=electron.process.env.APPDATA);let o=null;switch(Blockbench.platform){case\"win32\":let a=Ol();\"edu\"==e?(o=PathModule.join(i,\"Minecraft Education Edition\"),a.existsSync(o)||(o=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState\"))):\"preview\"==e?(o=PathModule.join(i,\"Minecraft Bedrock Preview/Users/Shared/\"),a.existsSync(o)||(o=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState\"))):(o=PathModule.join(i,\"Minecraft Bedrock/Users/Shared/\"),a.existsSync(o)||(o=PathModule.join(i,\"../local/\",\"Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState\")));break;case\"linux\":o=PathModule.join(t,\".local/share/mcpelauncher\");break;case\"darwin\":o=PathModule.join(t,\"Library/Application Support/mcpelauncher\");break;case\"android\":o=PathModule.join(t,\"storage/shared/\");break;default:return\"\"}return PathModule.join(o,\"games/com.mojang\")}let Gl;function Ol(){if(isApp)return Gl||(Blockbench.isNewerThan(\"4.99\")?(Gl=requireNativeModule(\"fs\",{message:\"Enable file system access so that the wizard can export a pack into your Minecraft folder\"}),Gl):isApp?a(9896):void 0)}var Jl=function(){var e=this,t=e._self._c;return t(\"div\",[e._m(0),e._v(\" \"),t(\"section\",[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.spawn_egg_mode,expression:\"form.spawn_egg_mode\"}],attrs:{type:\"radio\",id:\"entity_wizard_egg_color\",value:\"colors\"},domProps:{checked:e._q(e.form.spawn_egg_mode,\"colors\")},on:{change:function(t){return e.$set(e.form,\"spawn_egg_mode\",\"colors\")}}}),t(\"label\",{attrs:{for:\"entity_wizard_egg_color\"}},[e._v(\"Colors\")]),e._v(\" \"),t(\"p\",[e._v(\"Select the default spawn egg icon and pick the base color and an overlay color\")]),e._v(\" \"),t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"colors\"==e.form.spawn_egg_mode,expression:\"form.spawn_egg_mode == 'colors'\"}],attrs:{id:\"entity_wizard_egg_color_bar\"}},[t(\"colored-spawn-egg\",{attrs:{base:e.form.spawn_egg_base,overlay:e.form.spawn_egg_overlay}}),e._v(\" \"),t(\"div\",{staticStyle:{\"line-height\":\"38px\"}},[t(\"input\",{ref:\"spawn_egg_base\"}),e._v(\" \"),t(\"label\",[e._v(\"Base Color\")]),e._v(\" \"),t(\"br\"),e._v(\" \"),t(\"input\",{ref:\"spawn_egg_overlay\"}),e._v(\" \"),t(\"label\",[e._v(\"Overlay Color\")])])],1)]),e._v(\" \"),t(\"section\",[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.spawn_egg_mode,expression:\"form.spawn_egg_mode\"}],attrs:{type:\"radio\",id:\"entity_wizard_egg_texture\",value:\"texture\"},domProps:{checked:e._q(e.form.spawn_egg_mode,\"texture\")},on:{change:function(t){return e.$set(e.form,\"spawn_egg_mode\",\"texture\")}}}),t(\"label\",{attrs:{for:\"entity_wizard_egg_texture\"}},[e._v(\"Custom Texture\")]),e._v(\" \"),t(\"p\",[e._v(\"Load a custom texture for your spawn egg item\")]),e._v(\" \"),\"texture\"==e.form.spawn_egg_mode?t(\"icon-picker\",{model:{value:e.form.spawn_egg_image,callback:function(t){e.$set(e.form,\"spawn_egg_image\",t)},expression:\"form.spawn_egg_image\"}}):e._e()],1),e._v(\" \"),t(\"section\",[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.spawn_egg_mode,expression:\"form.spawn_egg_mode\"}],attrs:{type:\"radio\",id:\"entity_wizard_egg_none\",value:\"none\"},domProps:{checked:e._q(e.form.spawn_egg_mode,\"none\")},on:{change:function(t){return e.$set(e.form,\"spawn_egg_mode\",\"none\")}}}),t(\"label\",{attrs:{for:\"entity_wizard_egg_none\"}},[e._v(\"None\")]),e._v(\" \"),t(\"p\",[e._v(\"Do not generate a spawn egg. With this option, you will only be able to spawn the entity using commands.\")])])])};Jl._withStripped=!0;var Yl=function(){var e=this._self._c;return e(\"div\",{attrs:{id:\"entity_wizard_egg_color_preview\"}},[e(\"canvas\",{ref:\"canvas\"})])};Yl._withStripped=!0;const Fl=new Image(16,16);Fl.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA1UlEQVQ4y6WTzQmEMBCFbW+r8CDe7MEmbGA7sAgPmhYk+AOiXlQ85DrLGxiRdZPNuoGHePi+mTxI8HhmgeTWuQ36CNI0pSRJ6GcpQERrTUopkn9vuK5rDgTzPLOkqiq/bUSwbRtn33fq+95PcIaNMQwvy0Jd17HgqwQCTFvXlQX4juN4XMkpkNIAyPrTNB2wCKwSEQzDwDBWb5rmAiNxHJP1/m3bsgDtf5qOhGFIzhJtk5EoitwlFkVxgSR5nrsFOCgIOYNlWTL4DjvfESQC2ab+9YIlLxpxdMvXu3+1AAAAAElFTkSuQmCC\";const ql=new Image(16,16);function Hl(e,t,a,i,o,r,n,m){var s,l=\"function\"==typeof e?e.options:e;if(t&&(l.render=t,l.staticRenderFns=a,l._compiled=!0),i&&(l.functional=!0),r&&(l._scopeId=\"data-v-\"+r),n?(s=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(n)},l._ssrRegister=s):o&&(s=m?function(){o.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(l.functional){l._injectStyles=s;var A=l.render;l.render=function(e,t){return s.call(t),A(e,t)}}else{var c=l.beforeCreate;l.beforeCreate=c?[].concat(c,s):[s]}return{exports:e,options:l}}ql.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABWUlEQVQ4y62UMUvDUBSF729y0NHJIag4OPgbXJIp1EqbZMqYqWJBRUqhjSIGp1DEqEHEEBIQba1tjTWVloL/4frug0ipNK3FB4e35Hznnct7AaFUgERzrbmNswDWxG1Y3tr8O1TTNCQVm0+g3N9wkKIoOLO5XC5jtVrFIAjwPI44xDAMzGaz0yGqqmKlUkHbttHzPLwd9qHUeQHLsnBqHTpqofEIYRii7/voMrPd78FxuwG7dw5XKoQAlFYb9ODhawiXzHza7QBV0nUdUwFk3m8+w0m3DZQeRRGefbxBkZ3IcZwfwERIPp/nwzOjFsRxjDWWfvBa55VIiZm0tLH6G5DL5XjKUasOV4NPuIjfwXVdHAfQkBeElck19tjHhwximiaOdqedJEkSpg5RvrZ5UmKme5EAZFlGURTT7wINiDTaeYdpcV2AcXPqOyIIJWYyGSTzvz7E0V/AN87bB/pr+VlTAAAAAElFTkSuQmCC\";const Vl=Hl({name:\"colored-spawn-egg\",props:{base:String,overlay:String},methods:{updateCanvas(){this.ctx.globalCompositeOperation=\"source-over\",this.ctx.clearRect(0,0,16,16),this.ctx.drawImage(Fl,0,0),this.ctx.globalCompositeOperation=\"multiply\",this.ctx.fillStyle=this.base,this.ctx.fillRect(0,0,16,16),this.ctx.globalCompositeOperation=\"destination-in\",this.ctx.drawImage(Fl,0,0),this.ctx2.globalCompositeOperation=\"source-over\",this.ctx2.clearRect(0,0,16,16),this.ctx2.drawImage(ql,0,0),this.ctx2.globalCompositeOperation=\"multiply\",this.ctx2.fillStyle=this.overlay,this.ctx2.fillRect(0,0,16,16),this.ctx2.globalCompositeOperation=\"destination-in\",this.ctx2.drawImage(ql,0,0),this.ctx.globalCompositeOperation=\"source-over\",this.ctx.drawImage(this.canvas2,0,0)}},watch:{base(){this.updateCanvas()},overlay(){this.updateCanvas()}},mounted(){this.canvas=this.$refs.canvas,this.canvas.width=16,this.canvas.height=16,this.ctx=this.canvas.getContext(\"2d\"),this.canvas2=document.createElement(\"canvas\"),this.canvas2.width=16,this.canvas2.height=16,this.ctx2=this.canvas2.getContext(\"2d\"),this.updateCanvas()}},Yl,[],!1,(function(e){var t=a(2694);t.__inject__&&t.__inject__(e)}),null,\"1ebfb222\").exports;var Kl=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"entity_wizard_icon_picker\"},[t(\"div\",{staticClass:\"icon_picker_left\"},[e.value?t(\"img\",{attrs:{src:e.value,width:\"64px\",height:\"64px\"}}):e._e()]),e._v(\" \"),t(\"div\",{staticClass:\"icon_picker_right\",on:{click:e.pickImage}},[t(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"folder\")]),e._v(\" \"),t(\"label\",[e._v(e._s(e.imageName))])])])};Kl._withStripped=!0;const Nl=Hl({name:\"icon-picker\",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:\"image\",type:\"Image\",extensions:[\"png\"]},(e=>{this.value=e[0].content||e[0].path,this.$emit(\"input\",this.value)}))}},computed:{imageName(){if(!this.value)return\"Select Image...\";let e=this.value.split(osfs);return e.length>2?e.last():\"\"}}},Kl,[],!1,(function(e){var t=a(4769);t.__inject__&&t.__inject__(e)}),null,\"5f161121\").exports,Tl=Hl({name:\"spawn-egg\",components:{ColoredSpawnEgg:Vl,IconPicker:Nl},props:{form:Object},methods:{loadImage(){}},mounted(){$(this.$refs.spawn_egg_base).spectrum({preferredFormat:\"hex\",color:this.form.spawn_egg_base,showAlpha:!1,showInput:!0,move:e=>{this.form.spawn_egg_base=e.toHexString()},change:e=>{this.form.spawn_egg_base=e.toHexString()}}),$(this.$refs.spawn_egg_overlay).spectrum({preferredFormat:\"hex\",color:this.form.spawn_egg_overlay,showAlpha:!1,showInput:!0,move:e=>{this.form.spawn_egg_overlay=e.toHexString()},change:e=>{this.form.spawn_egg_overlay=e.toHexString()}})}},Jl,[function(){var e=this._self._c;return e(\"section\",[e(\"p\",[this._v(\"Design the item that the mob will be spawned with.\")])])}],!1,(function(e){var t=a(4737);t.__inject__&&t.__inject__(e)}),null,\"049dbc44\").exports;var Pl=function(){var e=this,t=e._self._c;return t(\"div\",[e._m(0),e._v(\" \"),t(\"section\",[t(\"input\",{attrs:{type:\"radio\",id:\"entity_wizard_loot_same\",value:\"default\"},domProps:{checked:\"default\"==e.form.loot_type},on:{change:function(t){e.form.loot_type=\"default\"}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"entity_wizard_loot_same\"}},[e._v(\"Default Loot\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(e._s(e.getSameLootText()))])]),e._v(\" \"),t(\"section\",[t(\"input\",{attrs:{type:\"radio\",id:\"entity_wizard_loot_none\",value:\"none\"},domProps:{checked:\"none\"==e.form.loot_type},on:{change:function(t){e.form.loot_type=\"none\"}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"entity_wizard_loot_none\"}},[e._v(\"No Loot\")])]),e._v(\" \"),t(\"section\",[t(\"input\",{attrs:{type:\"radio\",id:\"entity_wizard_loot_custom\",value:\"texture\"},domProps:{checked:\"custom\"==e.form.loot_type},on:{change:function(t){e.form.loot_type=\"custom\"}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"entity_wizard_loot_custom\"}},[e._v(\"Custom Loot\")]),e._v(\" \"),\"custom\"==e.form.loot_type?[t(\"p\",{staticClass:\"description\"},[e._v(\"From each pool, one entry will be selected randomly.\")]),e._v(\" \"),t(\"ul\",{attrs:{id:\"entity_wizard_loot_list\"}},e._l(e.form.custom_loot,(function(a){return t(\"li\",{key:a.uuid},[t(\"p\",{staticClass:\"description\"},[e._v(\"Randomly pick one of these entries:\")]),e._v(\" \"),t(\"ul\",{attrs:{id:\"entity_wizard_loot_item_list\"}},e._l(a.entries,(function(i){return t(\"li\",{key:i.uuid},[t(\"select-input\",{attrs:{options:e.item_ids},model:{value:i.type,callback:function(t){e.$set(i,\"type\",t)},expression:\"item.type\"}}),e._v(\" \"),\"custom\"==i.type?t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:i.custom_id,expression:\"item.custom_id\"}],attrs:{type:\"text\",title:\"Enter a custom item identifier\"},domProps:{value:i.custom_id},on:{input:function(t){t.target.composing||e.$set(i,\"custom_id\",t.target.value)}}}):e._e(),e._v(\" \"),\"empty\"!=i.type?[t(\"label\",[e._v(\"Count Min:\")]),e._v(\" \"),t(\"numeric-input\",{attrs:{min:0,max:i.count_max,title:\"Set the minimum possible count for this item\"},model:{value:i.count_min,callback:function(t){e.$set(i,\"count_min\",t)},expression:\"item.count_min\"}}),e._v(\" \"),t(\"label\",[e._v(\"Max:\")]),e._v(\" \"),t(\"numeric-input\",{attrs:{min:i.count_min,max:64,title:\"Set the maximum possible count for this item\"},model:{value:i.count_max,callback:function(t){e.$set(i,\"count_max\",t)},expression:\"item.count_max\"}})]:e._e(),e._v(\" \"),a.entries.length>1?[t(\"label\",[e._v(\"Probability:\")]),e._v(\" \"),t(\"numeric-input\",{attrs:{min:0,title:\"Increase the probability to make an item more likely to drop\"},model:{value:i.weight,callback:function(t){e.$set(i,\"weight\",t)},expression:\"item.weight\"}}),e._v(\" \"),t(\"div\",{staticClass:\"tool\",on:{click:function(e){return a.entries.remove(i)}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"clear\")])])]:e._e()],2)})),0),e._v(\" \"),t(\"button\",{on:{click:function(t){return e.addItem(a)}}},[e._v(\"Add Item\")]),e._v(\" \"),t(\"button\",{on:{click:function(t){return e.form.custom_loot.remove(a)}}},[e._v(\"Remove Pool\")])])})),0),e._v(\" \"),t(\"button\",{on:{click:function(t){return e.addPool()}}},[e._v(\"Add Pool\")])]:e._e()],2)])};Pl._withStripped=!0;let Wl={empty:\"Empty\",custom:\"Custom ID\",acacia_boat:\"Acacia Boat\",acacia_button:\"Acacia Button\",acacia_chest_boat:\"Acacia Chest Boat\",acacia_door:\"Acacia Door\",acacia_fence:\"Acacia Fence\",acacia_fence_gate:\"Acacia Fence Gate\",acacia_hanging_sign:\"Acacia Hanging Sign\",acacia_log:\"Acacia Log\",acacia_pressure_plate:\"Acacia Pressure Plate\",acacia_sign:\"Acacia Sign\",acacia_stairs:\"Acacia Stairs\",acacia_trapdoor:\"Acacia Trapdoor\",activator_rail:\"Activator Rail\",allay_spawn_egg:\"Allay Spawn Egg\",amethyst_block:\"Block of Amethyst\",amethyst_cluster:\"Amethyst Cluster\",amethyst_shard:\"Amethyst Shard\",ancient_debris:\"Ancient Debris\",andesite_stairs:\"Andesite Stairs\",angler_pottery_sherd:\"Angler Pottery Sherd\",anvil:\"Anvil\",apple:\"Apple\",archer_pottery_sherd:\"Archer Pottery Sherd\",armor_stand:\"Armor Stand\",arms_up_pottery_sherd:\"Arms Up Pottery Sherd\",arrow:\"Arrow\",axolotl_bucket:\"Axolotl Bucket\",axolotl_spawn_egg:\"Axolotl Spawn Egg\",azalea:\"Azalea\",azalea_leaves:\"Azalea Leaves\",azalea_leaves_flowered:\"Flowering Azalea Leaves\",baked_potato:\"Baked Potato\",bamboo:\"Bamboo\",bamboo_block:\"Block of Bamboo\",bamboo_button:\"Bamboo Button\",bamboo_chest_raft:\"Bamboo Chest Raft\",bamboo_door:\"Bamboo Door\",bamboo_double_slab:\"Bamboo Double Slab\",bamboo_fence:\"Bamboo Fence\",bamboo_fence_gate:\"Bamboo Fence Gate\",bamboo_hanging_sign:\"Bamboo Hanging Sign\",bamboo_mosaic:\"Bamboo Mosaic\",bamboo_mosaic_double_slab:\"Bamboo Mosaic Double Slab\",bamboo_mosaic_slab:\"Bamboo Mosaic Slab\",bamboo_mosaic_stairs:\"Bamboo Mosaic Stairs\",bamboo_planks:\"Bamboo Planks\",bamboo_pressure_plate:\"Bamboo Pressure Plate\",bamboo_raft:\"Bamboo Raft\",bamboo_sapling:\"Bamboo Sapling\",bamboo_sign:\"Bamboo Sign\",bamboo_slab:\"Bamboo Slab\",bamboo_stairs:\"Bamboo Stairs\",bamboo_trapdoor:\"Bamboo Trapdoor\",banner:\"Banner\",banner_pattern:\"Banner Pattern\",barrel:\"Barrel\",barrier:\"Barrier\",basalt:\"Basalt\",bat_spawn_egg:\"Bat Spawn Egg\",beacon:\"Beacon\",bed:\"Bed\",bedrock:\"Bedrock\",bee_nest:\"Bee Nest\",bee_spawn_egg:\"Bee Spawn Egg\",beef:\"Raw Beef\",beehive:\"Beehive\",beetroot:\"Beetroot\",beetroot_seeds:\"Beetroot Seeds\",beetroot_soup:\"Beetroot Soup\",bell:\"Bell\",big_dripleaf:\"Big Dripleaf\",birch_boat:\"Birch Boat\",birch_button:\"Birch Button\",birch_chest_boat:\"Birch Chest Boat\",birch_door:\"Birch Door\",birch_fence:\"Birch Fence\",birch_fence_gate:\"Birch Fence Gate\",birch_hanging_sign:\"Birch Hanging Sign\",birch_log:\"Birch Log\",birch_pressure_plate:\"Birch Pressure Plate\",birch_sign:\"Birch Sign\",birch_stairs:\"Birch Stairs\",birch_trapdoor:\"Birch Trapdoor\",black_candle:\"Black Candle\",black_candle_cake:\"Cake with Black Candle\",black_carpet:\"Black Carpet\",black_concrete:\"Black Concrete\",black_dye:\"Black Dye\",black_glazed_terracotta:\"Black Glazed Terracotta\",black_shulker_box:\"Black Shulker Box\",black_wool:\"Black Wool\",blackstone:\"Blackstone\",blackstone_double_slab:\"Blackstone Double Slab\",blackstone_slab:\"Blackstone Slab\",blackstone_stairs:\"Blackstone Stairs\",blackstone_wall:\"Blackstone Wall\",blade_pottery_sherd:\"Blade Pottery Sherd\",blast_furnace:\"Blast Furnace\",blaze_powder:\"Blaze Powder\",blaze_rod:\"Blaze Rod\",blaze_spawn_egg:\"Blaze Spawn Egg\",bleach:\"Bleach\",blue_candle:\"Blue Candle\",blue_candle_cake:\"Cake with Blue Candle\",blue_carpet:\"Blue Carpet\",blue_concrete:\"Blue Concrete\",blue_dye:\"Blue Dye\",blue_glazed_terracotta:\"Blue Glazed Terracotta\",blue_ice:\"Blue Ice\",blue_shulker_box:\"Blue Shulker Box\",blue_wool:\"Blue Wool\",boat:\"Boat\",bone:\"Bone\",bone_block:\"Bone Block\",bone_meal:\"Bone Meal\",book:\"Book\",bookshelf:\"Bookshelf\",border_block:\"Border\",bordure_indented_banner_pattern:\"Bordure Indented Banner Pattern\",bow:\"Bow\",bowl:\"Bowl\",brain_coral:\"Brain Coral\",bread:\"Bread\",brewer_pottery_sherd:\"Brewer Pottery Sherd\",brewing_stand:\"Brewing Stand\",brick:\"Brick\",brick_block:\"Brick Block\",brick_stairs:\"Brick Stairs\",brown_candle:\"Brown Candle\",brown_candle_cake:\"Cake with Brown Candle\",brown_carpet:\"Brown Carpet\",brown_concrete:\"Brown Concrete\",brown_dye:\"Brown Dye\",brown_glazed_terracotta:\"Brown Glazed Terracotta\",brown_mushroom:\"Brown Mushroom\",brown_mushroom_block:\"Brown Mushroom Block\",brown_shulker_box:\"Brown Shulker Box\",brown_wool:\"Brown Wool\",brush:\"Brush\",bubble_coral:\"Bubble Coral\",bucket:\"Bucket\",budding_amethyst:\"Budding Amethyst\",burn_pottery_sherd:\"Burn Pottery Sherd\",cactus:\"Cactus\",cake:\"Cake\",calcite:\"Calcite\",calibrated_sculk_sensor:\"Calibrated Sculk Sensor\",camel_spawn_egg:\"Camel Spawn Egg\",camera:\"Camera\",campfire:\"Campfire\",candle:\"Candle\",candle_cake:\"Cake with Candle\",carpet:\"Carpet\",carrot:\"Carrot\",carrot_on_a_stick:\"Carrot On A Stick\",carrots:\"Carrots\",cartography_table:\"Cartography Table\",carved_pumpkin:\"Carved Pumpkin\",cat_spawn_egg:\"Cat Spawn Egg\",cauldron:\"Cauldron\",cave_spider_spawn_egg:\"Cave Spider Spawn Egg\",cave_vines:\"Cave Vines\",cave_vines_body_with_berries:\"Cave Vines\",cave_vines_head_with_berries:\"Cave Vines\",chain:\"Chain\",chain_command_block:\"Chain Command Block\",chainmail_boots:\"Chain Boots\",chainmail_chestplate:\"Chain Chestplate\",chainmail_helmet:\"Chain Helmet\",chainmail_leggings:\"Chain Leggings\",charcoal:\"Charcoal\",chemical_heat:\"Chemical Heat\",chemistry_table:\"Chemistry Table\",cherry_boat:\"Cherry Boat\",cherry_button:\"Cherry Button\",cherry_chest_boat:\"Cherry Chest Boat\",cherry_door:\"Cherry Door\",cherry_double_slab:\"Cherry Double Slab\",cherry_fence:\"Cherry Fence\",cherry_fence_gate:\"Cherry Fence Gate\",cherry_hanging_sign:\"Cherry Hanging Sign\",cherry_leaves:\"Cherry Leaves\",cherry_log:\"Cherry Log\",cherry_planks:\"Cherry Planks\",cherry_pressure_plate:\"Cherry Pressure Plate\",cherry_sapling:\"Cherry Sapling\",cherry_sign:\"Cherry Sign\",cherry_slab:\"Cherry Slab\",cherry_stairs:\"Cherry Stairs\",cherry_trapdoor:\"Cherry Trapdoor\",cherry_wood:\"Cherry Wood\",chest:\"Chest\",chest_boat:\"Chest Boat\",chest_minecart:\"Minecart with Chest\",chicken:\"Raw Chicken\",chicken_spawn_egg:\"Chicken Spawn Egg\",chiseled_bookshelf:\"Chiseled Bookshelf\",chiseled_deepslate:\"Chiseled Deepslate\",chiseled_nether_bricks:\"Chiseled Nether Bricks\",chiseled_polished_blackstone:\"Chiseled Polished Blackstone\",chorus_flower:\"Chorus Flower\",chorus_fruit:\"Chorus Fruit\",chorus_plant:\"Chorus Plant\",clay:\"Clay Block\",clay_ball:\"Clay\",client_request_placeholder_block:\"Client Request Placeholder Block\",clock:\"Clock\",coal:\"Coal\",coal_block:\"Block of Coal\",coal_ore:\"Coal Ore\",coast_armor_trim_smithing_template:\"Coast Armor Trim Smithing Template\",cobbled_deepslate:\"Cobbled Deepslate\",cobbled_deepslate_double_slab:\"Cobbled Deepslate Double Slab\",cobbled_deepslate_slab:\"Cobbled Deepslate Slab\",cobbled_deepslate_stairs:\"Cobbled Deepslate Stairs\",cobbled_deepslate_wall:\"Cobbled Deepslate Wall\",cobblestone:\"Cobblestone\",cobblestone_wall:\"Cobblestone Wall\",cocoa:\"Cocoa\",cocoa_beans:\"Cocoa Beans\",cod:\"Cod\",cod_bucket:\"Cod Bucket\",cod_spawn_egg:\"Cod Spawn Egg\",colored_torch_bp:\"Colored Torch Bp\",colored_torch_rg:\"Colored Torch Rg\",command_block:\"Command Block\",command_block_minecart:\"Minecart with Command Block\",comparator:\"Redstone Comparator\",compass:\"Compass\",composter:\"Composter\",compound:\"Compound\",concrete:\"Concrete\",concrete_powder:\"Concrete Powder\",conduit:\"Conduit\",cooked_beef:\"Cooked Beef\",cooked_chicken:\"Cooked Chicken\",cooked_cod:\"Cooked Cod\",cooked_mutton:\"Cooked Mutton\",cooked_porkchop:\"Cooked Porkchop\",cooked_rabbit:\"Cooked Rabbit\",cooked_salmon:\"Cooked Salmon\",cookie:\"Cookie\",copper_block:\"Block of Copper\",copper_ingot:\"Copper Ingot\",copper_ore:\"Copper Ore\",coral:\"Coral\",coral_block:\"Coral Block\",coral_fan:\"Coral Fan\",coral_fan_dead:\"Coral Fan Dead\",coral_fan_hang:\"Coral Fan Hang\",cow_spawn_egg:\"Cow Spawn Egg\",cracked_deepslate_bricks:\"Cracked Deepslate Bricks\",cracked_deepslate_tiles:\"Cracked Deepslate Tiles\",cracked_nether_bricks:\"Cracked Nether Bricks\",cracked_polished_blackstone_bricks:\"Cracked Polished Blackstone Bricks\",crafting_table:\"Crafting Table\",creeper_banner_pattern:\"Creeper Banner Pattern\",creeper_spawn_egg:\"Creeper Spawn Egg\",crimson_button:\"Crimson Button\",crimson_door:\"Crimson Door\",crimson_double_slab:\"Crimson Slab\",crimson_fence:\"Crimson Fence\",crimson_fence_gate:\"Crimson Fence Gate\",crimson_fungus:\"Crimson Fungus\",crimson_hanging_sign:\"Crimson Hanging Sign\",crimson_hyphae:\"Crimson Hyphae\",crimson_nylium:\"Crimson Nylium\",crimson_planks:\"Crimson Planks\",crimson_pressure_plate:\"Crimson Pressure Plate\",crimson_roots:\"Crimson Roots\",crimson_sign:\"Crimson Sign\",crimson_slab:\"Crimson Slab\",crimson_stairs:\"Crimson Stairs\",crimson_stem:\"Crimson Stem\",crimson_trapdoor:\"Crimson Trapdoor\",crossbow:\"Crossbow\",crying_obsidian:\"Crying Obsidian\",cut_copper:\"Cut Copper\",cut_copper_slab:\"Cut Copper Slab\",cut_copper_stairs:\"Cut Copper Stairs\",cyan_candle:\"Cyan Candle\",cyan_candle_cake:\"Cake with Cyan Candle\",cyan_carpet:\"Cyan Carpet\",cyan_concrete:\"Cyan Concrete\",cyan_dye:\"Cyan Dye\",cyan_glazed_terracotta:\"Cyan Glazed Terracotta\",cyan_shulker_box:\"Cyan Shulker Box\",cyan_wool:\"Cyan Wool\",danger_pottery_sherd:\"Danger Pottery Sherd\",dark_oak_boat:\"Dark Oak Boat\",dark_oak_button:\"Dark Oak Button\",dark_oak_chest_boat:\"Dark Oak Chest Boat\",dark_oak_door:\"Dark Oak Door\",dark_oak_fence:\"Dark Oak Fence\",dark_oak_fence_gate:\"Dark Oak Fence Gate\",dark_oak_hanging_sign:\"Dark Oak Hanging Sign\",dark_oak_log:\"Dark Oak Log\",dark_oak_pressure_plate:\"Dark Oak Pressure Plate\",dark_oak_sign:\"Dark Oak Sign\",dark_oak_stairs:\"Dark Oak Stairs\",dark_oak_trapdoor:\"Dark Oak Trapdoor\",dark_prismarine_stairs:\"Dark Prismarine Stairs\",daylight_detector:\"Daylight Sensor\",daylight_detector_inverted:\"Daylight Detector Inverted\",dead_brain_coral:\"Dead Brain Coral\",dead_bubble_coral:\"Dead Bubble Coral\",dead_fire_coral:\"Dead Fire Coral\",dead_horn_coral:\"Dead Horn Coral\",dead_tube_coral:\"Dead Tube Coral\",deadbush:\"Dead Bush\",debug_stick:\"Debug Stick\",decorated_pot:\"Decorated Pot\",deepslate:\"Deepslate\",deepslate_brick_double_slab:\"Deepslate Brick Double Slab\",deepslate_brick_slab:\"Deepslate Brick Slab\",deepslate_brick_stairs:\"Deepslate Brick Stairs\",deepslate_brick_wall:\"Deepslate Brick Wall\",deepslate_bricks:\"Deepslate Bricks\",deepslate_coal_ore:\"Deepslate Coal Ore\",deepslate_copper_ore:\"Deepslate Copper Ore\",deepslate_diamond_ore:\"Deepslate Diamond Ore\",deepslate_emerald_ore:\"Deepslate Emerald Ore\",deepslate_gold_ore:\"Deepslate Gold Ore\",deepslate_iron_ore:\"Deepslate Iron Ore\",deepslate_lapis_ore:\"Deepslate Lapis Lazuli Ore\",deepslate_redstone_ore:\"Deepslate Redstone Ore\",deepslate_tile_double_slab:\"Deepslate Tile Double Slab\",deepslate_tile_slab:\"Deepslate Tile Slab\",deepslate_tile_stairs:\"Deepslate Tile Stairs\",deepslate_tile_wall:\"Deepslate Tile Wall\",deepslate_tiles:\"Deepslate Tiles\",deny:\"Deny\",detector_rail:\"Detector Rail\",diamond:\"Diamond\",diamond_axe:\"Diamond Axe\",diamond_block:\"Block of Diamond\",diamond_boots:\"Diamond Boots\",diamond_chestplate:\"Diamond Chestplate\",diamond_helmet:\"Diamond Helmet\",diamond_hoe:\"Diamond Hoe\",diamond_horse_armor:\"Diamond Horse Armor\",diamond_leggings:\"Diamond Leggings\",diamond_ore:\"Diamond Ore\",diamond_pickaxe:\"Diamond Pickaxe\",diamond_shovel:\"Diamond Shovel\",diamond_sword:\"Diamond Sword\",diorite_stairs:\"Diorite Stairs\",dirt:\"Dirt\",dirt_with_roots:\"Rooted Dirt\",disc_fragment_5:\"Disc Fragment 5\",dispenser:\"Dispenser\",dolphin_spawn_egg:\"Dolphin Spawn Egg\",donkey_spawn_egg:\"Donkey Spawn Egg\",double_cut_copper_slab:\"Double Cut Copper Slab\",double_plant:\"Plant\",double_stone_block_slab:\"Double Stone Block Slab\",double_wooden_slab:\"Double Wooden Slab\",dragon_breath:\"Dragon's Breath\",dragon_egg:\"Dragon Egg\",dried_kelp:\"Dried Kelp\",dried_kelp_block:\"Dried Kelp Block\",dripstone_block:\"Dripstone Block\",dropper:\"Dropper\",drowned_spawn_egg:\"Drowned Spawn Egg\",dune_armor_trim_smithing_template:\"Dune Armor Trim Smithing Template\",dye:\"Dye\",echo_shard:\"Echo Shard\",egg:\"Egg\",elder_guardian_spawn_egg:\"Elder Guardian Spawn Egg\",elytra:\"Elytra\",emerald:\"Emerald\",emerald_block:\"Block of Emerald\",emerald_ore:\"Emerald Ore\",empty_map:\"Empty Map\",enchanted_book:\"Enchanted Book\",enchanted_golden_apple:\"Enchanted Golden Apple\",enchanting_table:\"Enchantment Table\",end_brick_stairs:\"End Stone Brick Stairs\",end_bricks:\"End Stone Bricks\",end_crystal:\"End Crystal\",end_gateway:\"End Gateway\",end_portal:\"End Portal\",end_portal_frame:\"End Portal Frame\",end_rod:\"End Rod\",end_stone:\"End Stone\",ender_chest:\"Ender Chest\",ender_dragon_spawn_egg:\"Ender Dragon Spawn Egg\",ender_eye:\"Eye of Ender\",ender_pearl:\"Ender Pearl\",enderman_spawn_egg:\"Enderman Spawn Egg\",endermite_spawn_egg:\"Endermite Spawn Egg\",evoker_spawn_egg:\"Evoker Spawn Egg\",experience_bottle:\"Bottle o' Enchanting\",explorer_pottery_sherd:\"Explorer Pottery Sherd\",exposed_copper:\"Exposed Copper\",exposed_cut_copper:\"Exposed Cut Copper\",exposed_cut_copper_slab:\"Exposed Cut Copper Slab\",exposed_cut_copper_stairs:\"Exposed Cut Copper Stairs\",exposed_double_cut_copper_slab:\"Exposed Double Cut Copper Slab\",eye_armor_trim_smithing_template:\"Eye Armor Trim Smithing Template\",farmland:\"Farmland\",feather:\"Feather\",fence:\"Oak Fence\",fence_gate:\"Oak Fence Gate\",fermented_spider_eye:\"Fermented Spider Eye\",field_masoned_banner_pattern:\"Field Masoned Banner Pattern\",filled_map:\"Filled Map\",fire:\"Fire\",fire_charge:\"Fire Charge\",fire_coral:\"Fire Coral\",firework_rocket:\"Firework Rocket\",firework_star:\"Firework Star\",fishing_rod:\"Fishing Rod\",fletching_table:\"Fletching Table\",flint:\"Flint\",flint_and_steel:\"Flint and Steel\",flower_banner_pattern:\"Flower Banner Pattern\",flower_pot:\"Flower Pot\",flowering_azalea:\"Flowering Azalea\",flowing_lava:\"Lava\",flowing_water:\"Water\",fox_spawn_egg:\"Fox Spawn Egg\",frame:\"Item Frame\",friend_pottery_sherd:\"Friend Pottery Sherd\",frog_spawn:\"Frogspawn\",frog_spawn_egg:\"Frog Spawn Egg\",frosted_ice:\"Frosted Ice\",furnace:\"Furnace\",ghast_spawn_egg:\"Ghast Spawn Egg\",ghast_tear:\"Ghast Tear\",gilded_blackstone:\"Gilded Blackstone\",glass:\"Glass\",glass_bottle:\"Glass Bottle\",glass_pane:\"Glass Pane\",glistering_melon_slice:\"Glistering Melon Slice\",globe_banner_pattern:\"Globe Banner Pattern\",glow_frame:\"Glow Item Frame\",glow_ink_sac:\"Glow Ink Sac\",glow_lichen:\"Glow Lichen\",glow_squid_spawn_egg:\"Glow Squid Spawn Egg\",glow_stick:\"Glow Stick\",glowingobsidian:\"Glowingobsidian\",glowstone:\"Glowstone\",glowstone_dust:\"Glowstone Dust\",goat_horn:\"Goat Horn\",goat_spawn_egg:\"Goat Spawn Egg\",gold_block:\"Block of Gold\",gold_ingot:\"Gold Ingot\",gold_nugget:\"Gold Nugget\",gold_ore:\"Gold Ore\",golden_apple:\"Golden Apple\",golden_axe:\"Golden Axe\",golden_boots:\"Golden Boots\",golden_carrot:\"Golden Carrot\",golden_chestplate:\"Golden Chestplate\",golden_helmet:\"Golden Helmet\",golden_hoe:\"Golden Hoe\",golden_horse_armor:\"Golden Horse Armor\",golden_leggings:\"Golden Leggings\",golden_pickaxe:\"Golden Pickaxe\",golden_rail:\"Powered Rail\",golden_shovel:\"Golden Shovel\",golden_sword:\"Golden Sword\",granite_stairs:\"Granite Stairs\",grass:\"Grass Block\",grass_path:\"Dirt Path\",gravel:\"Gravel\",gray_candle:\"Gray Candle\",gray_candle_cake:\"Cake with Gray Candle\",gray_carpet:\"Gray Carpet\",gray_concrete:\"Gray Concrete\",gray_dye:\"Gray Dye\",gray_glazed_terracotta:\"Gray Glazed Terracotta\",gray_shulker_box:\"Gray Shulker Box\",gray_wool:\"Gray Wool\",green_candle:\"Green Candle\",green_candle_cake:\"Cake with Green Candle\",green_carpet:\"Green Carpet\",green_concrete:\"Green Concrete\",green_dye:\"Green Dye\",green_glazed_terracotta:\"Green Glazed Terracotta\",green_shulker_box:\"Green Shulker Box\",green_wool:\"Green Wool\",grindstone:\"Grindstone\",guardian_spawn_egg:\"Guardian Spawn Egg\",gunpowder:\"Gunpowder\",hanging_roots:\"Hanging Roots\",hard_glass:\"Hard Glass\",hard_glass_pane:\"Hard Glass Pane\",hard_stained_glass:\"Hard Stained Glass\",hard_stained_glass_pane:\"Hard Stained Glass Pane\",hardened_clay:\"Terracotta\",hay_block:\"Hay Bale\",heart_of_the_sea:\"Heart of the Sea\",heart_pottery_sherd:\"Heart Pottery Sherd\",heartbreak_pottery_sherd:\"Heartbreak Pottery Sherd\",heavy_weighted_pressure_plate:\"Weighted Pressure Plate (Heavy)\",hoglin_spawn_egg:\"Hoglin Spawn Egg\",honey_block:\"Honey Block\",honey_bottle:\"Honey Bottle\",honeycomb:\"Honeycomb\",honeycomb_block:\"Honeycomb Block\",hopper:\"Hopper\",hopper_minecart:\"Minecart with Hopper\",horn_coral:\"Horn Coral\",horse_spawn_egg:\"Horse Spawn Egg\",host_armor_trim_smithing_template:\"Host Armor Trim Smithing Template\",howl_pottery_sherd:\"Howl Pottery Sherd\",husk_spawn_egg:\"Husk Spawn Egg\",ice:\"Ice\",ice_bomb:\"Ice Bomb\",infested_deepslate:\"Infested Deepslate\",ink_sac:\"Ink Sac\",iron_axe:\"Iron Axe\",iron_bars:\"Iron Bars\",iron_block:\"Block of Iron\",iron_boots:\"Iron Boots\",iron_chestplate:\"Iron Chestplate\",iron_door:\"Iron Door\",iron_golem_spawn_egg:\"Iron Golem Spawn Egg\",iron_helmet:\"Iron Helmet\",iron_hoe:\"Iron Hoe\",iron_horse_armor:\"Iron Horse Armor\",iron_ingot:\"Iron Ingot\",iron_leggings:\"Iron Leggings\",iron_nugget:\"Iron Nugget\",iron_ore:\"Iron Ore\",iron_pickaxe:\"Iron Pickaxe\",iron_shovel:\"Iron Shovel\",iron_sword:\"Iron Sword\",iron_trapdoor:\"Iron Trapdoor\",jigsaw:\"Jigsaw Block\",jukebox:\"Jukebox\",jungle_boat:\"Jungle Boat\",jungle_button:\"Jungle Button\",jungle_chest_boat:\"Jungle Chest Boat\",jungle_door:\"Jungle Door\",jungle_fence:\"Jungle Fence\",jungle_fence_gate:\"Jungle Fence Gate\",jungle_hanging_sign:\"Jungle Hanging Sign\",jungle_log:\"Jungle Log\",jungle_pressure_plate:\"Jungle Pressure Plate\",jungle_sign:\"Jungle Sign\",jungle_stairs:\"Jungle Stairs\",jungle_trapdoor:\"Jungle Trapdoor\",kelp:\"Kelp\",ladder:\"Ladder\",lantern:\"Lantern\",lapis_block:\"Block of Lapis Lazuli\",lapis_lazuli:\"Lapis Lazuli\",lapis_ore:\"Lapis Lazuli Ore\",large_amethyst_bud:\"Large Amethyst Bud\",lava:\"Lava\",lava_bucket:\"Lava Bucket\",lead:\"Lead\",leather:\"Leather\",leather_boots:\"Leather Boots\",leather_chestplate:\"Leather Tunic\",leather_helmet:\"Leather Cap\",leather_horse_armor:\"Leather Horse Armor\",leather_leggings:\"Leather Pants\",leaves:\"Leaves\",lectern:\"Lectern\",lever:\"Lever\",light_block:\"Light Block\",light_blue_candle:\"Light Blue Candle\",light_blue_candle_cake:\"Cake with Light Blue Candle\",light_blue_carpet:\"Light Blue Carpet\",light_blue_concrete:\"Light Blue Concrete\",light_blue_dye:\"Light Blue Dye\",light_blue_glazed_terracotta:\"Light Blue Glazed Terracotta\",light_blue_shulker_box:\"Light Blue Shulker Box\",light_blue_wool:\"Light Blue Wool\",light_gray_candle:\"Light Gray Candle\",light_gray_candle_cake:\"Cake with Light Gray Candle\",light_gray_carpet:\"Light Gray Carpet\",light_gray_concrete:\"Light Gray Concrete\",light_gray_dye:\"Light Gray Dye\",light_gray_shulker_box:\"Light Gray Shulker Box\",light_gray_wool:\"Light Gray Wool\",light_weighted_pressure_plate:\"Weighted Pressure Plate (Light)\",lightning_rod:\"Lightning Rod\",lime_candle:\"Lime Candle\",lime_candle_cake:\"Cake with Lime Candle\",lime_carpet:\"Lime Carpet\",lime_concrete:\"Lime Concrete\",lime_dye:\"Lime Dye\",lime_glazed_terracotta:\"Lime Glazed Terracotta\",lime_shulker_box:\"Lime Shulker Box\",lime_wool:\"Lime Wool\",lingering_potion:\"Lingering Potion\",lit_blast_furnace:\"Lit Blast Furnace\",lit_deepslate_redstone_ore:\"Lit Deepslate Redstone Ore\",lit_furnace:\"Lit Furnace\",lit_pumpkin:\"Jack o'Lantern\",lit_redstone_lamp:\"Lit Redstone Lamp\",lit_redstone_ore:\"Lit Redstone Ore\",lit_smoker:\"Lit Smoker\",llama_spawn_egg:\"Llama Spawn Egg\",lodestone:\"Lodestone\",lodestone_compass:\"Lodestone Compass\",log:\"Log\",loom:\"Loom\",magenta_candle:\"Magenta Candle\",magenta_candle_cake:\"Cake with Magenta Candle\",magenta_carpet:\"Magenta Carpet\",magenta_concrete:\"Magenta Concrete\",magenta_dye:\"Magenta Dye\",magenta_glazed_terracotta:\"Magenta Glazed Terracotta\",magenta_shulker_box:\"Magenta Shulker Box\",magenta_wool:\"Magenta Wool\",magma:\"Magma Block\",magma_cream:\"Magma Cream\",magma_cube_spawn_egg:\"Magma Cube Spawn Egg\",mangrove_boat:\"Mangrove Boat\",mangrove_button:\"Mangrove Button\",mangrove_chest_boat:\"Mangrove Chest Boat\",mangrove_door:\"Mangrove Door\",mangrove_double_slab:\"Mangrove Double Slab\",mangrove_fence:\"Mangrove Fence\",mangrove_fence_gate:\"Mangrove Fence Gate\",mangrove_hanging_sign:\"Mangrove Hanging Sign\",mangrove_leaves:\"Mangrove Leaves\",mangrove_log:\"Mangrove Log\",mangrove_planks:\"Mangrove Planks\",mangrove_pressure_plate:\"Mangrove Pressure Plate\",mangrove_propagule:\"Mangrove Propagule\",mangrove_roots:\"Mangrove Roots\",mangrove_sign:\"Mangrove Sign\",mangrove_slab:\"Mangrove Slab\",mangrove_stairs:\"Mangrove Stairs\",mangrove_trapdoor:\"Mangrove Trapdoor\",mangrove_wood:\"Mangrove Wood\",medicine:\"Medicine\",medium_amethyst_bud:\"Medium Amethyst Bud\",melon_block:\"Melon\",melon_seeds:\"Melon Seeds\",melon_slice:\"Melon Slice\",melon_stem:\"Melon Stem\",milk_bucket:\"Milk Bucket\",minecart:\"Minecart\",miner_pottery_sherd:\"Miner Pottery Sherd\",mob_spawner:\"Monster Spawner\",mojang_banner_pattern:\"Mojang Banner Pattern\",monster_egg:\"Infested Stone\",mooshroom_spawn_egg:\"Mooshroom Spawn Egg\",moss_block:\"Moss Block\",moss_carpet:\"Moss Carpet\",mossy_cobblestone:\"Mossy Cobblestone\",mossy_cobblestone_stairs:\"Mossy Cobblestone Stairs\",mossy_stone_brick_stairs:\"Mossy Stone Brick Stairs\",mourner_pottery_sherd:\"Mourner Pottery Sherd\",moving_block:\"Moving Block\",mud:\"Mud\",mud_brick_double_slab:\"Mud Brick Double Slab\",mud_brick_slab:\"Mud Brick Slab\",mud_brick_stairs:\"Mud Brick Stairs\",mud_brick_wall:\"Mud Brick Wall\",mud_bricks:\"Mud Bricks\",muddy_mangrove_roots:\"Muddy Mangrove Roots\",mule_spawn_egg:\"Mule Spawn Egg\",mushroom_stew:\"Mushroom Stew\",music_disc_11:\"Music Disc 11\",music_disc_13:\"Music Disc 13\",music_disc_5:\"Music Disc 5\",music_disc_blocks:\"Music Disc Blocks\",music_disc_cat:\"Music Disc Cat\",music_disc_chirp:\"Music Disc Chirp\",music_disc_far:\"Music Disc Far\",music_disc_mall:\"Music Disc Mall\",music_disc_mellohi:\"Music Disc Mellohi\",music_disc_otherside:\"Music Disc Otherside\",music_disc_pigstep:\"Music Disc Pigstep\",music_disc_relic:\"Music Disc Relic\",music_disc_stal:\"Music Disc Stal\",music_disc_strad:\"Music Disc Strad\",music_disc_wait:\"Music Disc Wait\",music_disc_ward:\"Music Disc Ward\",mutton:\"Mutton\",mycelium:\"Mycelium\",name_tag:\"Name Tag\",nautilus_shell:\"Nautilus Shell\",nether_brick:\"Nether Brick Block\",nether_brick_fence:\"Nether Brick Fence\",nether_brick_stairs:\"Nether Brick Stairs\",nether_gold_ore:\"Nether Gold Ore\",nether_sprouts:\"Nether Sprouts\",nether_star:\"Nether Star\",nether_wart:\"Nether Wart\",nether_wart_block:\"Nether Wart Block\",netherbrick:\"Nether Brick\",netherite_axe:\"Netherite Axe\",netherite_block:\"Block of Netherite\",netherite_boots:\"Netherite Boots\",netherite_chestplate:\"Netherite Chestplate\",netherite_helmet:\"Netherite Helmet\",netherite_hoe:\"Netherite Hoe\",netherite_ingot:\"Netherite Ingot\",netherite_leggings:\"Netherite Leggings\",netherite_pickaxe:\"Netherite Pickaxe\",netherite_scrap:\"Netherite Scrap\",netherite_shovel:\"Netherite Shovel\",netherite_sword:\"Netherite Sword\",netherite_upgrade_smithing_template:\"Netherite Upgrade Smithing Template\",netherrack:\"Netherrack\",netherreactor:\"Nether Reactor Core\",normal_stone_stairs:\"Stone Stairs\",noteblock:\"Note Block\",npc_spawn_egg:\"Npc Spawn Egg\",oak_boat:\"Oak Boat\",oak_chest_boat:\"Oak Chest Boat\",oak_fence:\"Oak Fence\",oak_hanging_sign:\"Oak Hanging Sign\",oak_log:\"Oak Log\",oak_sign:\"Oak Sign\",oak_stairs:\"Oak Stairs\",observer:\"Observer\",obsidian:\"Obsidian\",ocelot_spawn_egg:\"Ocelot Spawn Egg\",ochre_froglight:\"Ochre Froglight\",orange_candle:\"Orange Candle\",orange_candle_cake:\"Cake with Orange Candle\",orange_carpet:\"Orange Carpet\",orange_concrete:\"Orange Concrete\",orange_dye:\"Orange Dye\",orange_glazed_terracotta:\"Orange Glazed Terracotta\",orange_shulker_box:\"Orange Shulker Box\",orange_wool:\"Orange Wool\",oxidized_copper:\"Oxidized Copper\",oxidized_cut_copper:\"Oxidized Cut Copper\",oxidized_cut_copper_slab:\"Oxidized Cut Copper Slab\",oxidized_cut_copper_stairs:\"Oxidized Cut Copper Stairs\",oxidized_double_cut_copper_slab:\"Oxidized Double Cut Copper Slab\",packed_ice:\"Packed Ice\",packed_mud:\"Packed Mud\",painting:\"Painting\",panda_spawn_egg:\"Panda Spawn Egg\",paper:\"Paper\",parrot_spawn_egg:\"Parrot Spawn Egg\",pearlescent_froglight:\"Pearlescent Froglight\",phantom_membrane:\"Phantom Membrane\",phantom_spawn_egg:\"Phantom Spawn Egg\",pig_spawn_egg:\"Pig Spawn Egg\",piglin_banner_pattern:\"Piglin Banner Pattern\",piglin_brute_spawn_egg:\"Piglin Brute Spawn Egg\",piglin_spawn_egg:\"Piglin Spawn Egg\",pillager_spawn_egg:\"Pillager Spawn Egg\",pink_candle:\"Pink Candle\",pink_candle_cake:\"Cake with Pink Candle\",pink_carpet:\"Pink Carpet\",pink_concrete:\"Pink Concrete\",pink_dye:\"Pink Dye\",pink_glazed_terracotta:\"Pink Glazed Terracotta\",pink_petals:\"Pink Petals\",pink_shulker_box:\"Pink Shulker Box\",pink_wool:\"Pink Wool\",piston:\"Piston\",pitcher_crop:\"Pitcher Crop\",pitcher_plant:\"Pitcher Plant\",pitcher_pod:\"Pitcher Pod\",planks:\"Wooden Planks\",plenty_pottery_sherd:\"Plenty Pottery Sherd\",podzol:\"Podzol\",pointed_dripstone:\"Pointed Dripstone\",poisonous_potato:\"Poisonous Potato\",polar_bear_spawn_egg:\"Polar Bear Spawn Egg\",polished_andesite_stairs:\"Polished Andesite Stairs\",polished_basalt:\"Polished Basalt\",polished_blackstone:\"Polished Blackstone\",polished_blackstone_brick_double_slab:\"Polished Blackstone Brick Double Slab\",polished_blackstone_brick_slab:\"Polished Blackstone Brick Slab\",polished_blackstone_brick_stairs:\"Polished Blackstone Brick Stairs\",polished_blackstone_brick_wall:\"Polished Blackstone Brick Wall\",polished_blackstone_bricks:\"Polished Blackstone Bricks\",polished_blackstone_button:\"Polished Blackstone Button\",polished_blackstone_double_slab:\"Polished Blackstone Double Slab\",polished_blackstone_pressure_plate:\"Polished Blackstone Pressure Plate\",polished_blackstone_slab:\"Polished Blackstone Slab\",polished_blackstone_stairs:\"Polished Blackstone Stairs\",polished_blackstone_wall:\"Polished Blackstone Wall\",polished_deepslate:\"Polished Deepslate\",polished_deepslate_double_slab:\"Polished Deepslate Double Slab\",polished_deepslate_slab:\"Polished Deepslate Slab\",polished_deepslate_stairs:\"Polished Deepslate Stairs\",polished_deepslate_wall:\"Polished Deepslate Wall\",polished_diorite_stairs:\"Polished Diorite Stairs\",polished_granite_stairs:\"Polished Granite Stairs\",popped_chorus_fruit:\"Popped Chorus Fruit\",porkchop:\"Raw Porkchop\",portal:\"Portal\",potato:\"Potato\",potion:\"Potion\",powder_snow:\"Powder Snow\",powder_snow_bucket:\"Powder Snow Bucket\",powered_comparator:\"Powered Comparator\",powered_repeater:\"Powered Repeater\",prismarine:\"Prismarine\",prismarine_bricks_stairs:\"Prismarine Brick Stairs\",prismarine_crystals:\"Prismarine Crystals\",prismarine_shard:\"Prismarine Shard\",prismarine_stairs:\"Prismarine Stairs\",prize_pottery_sherd:\"Prize Pottery Sherd\",pufferfish:\"Pufferfish\",pufferfish_bucket:\"Pufferfish Bucket\",pufferfish_spawn_egg:\"Pufferfish Spawn Egg\",pumpkin:\"Pumpkin\",pumpkin_pie:\"Pumpkin Pie\",pumpkin_seeds:\"Pumpkin Seeds\",pumpkin_stem:\"Pumpkin Stem\",purple_candle:\"Purple Candle\",purple_candle_cake:\"Cake with Purple Candle\",purple_carpet:\"Purple Carpet\",purple_concrete:\"Purple Concrete\",purple_dye:\"Purple Dye\",purple_glazed_terracotta:\"Purple Glazed Terracotta\",purple_shulker_box:\"Purple Shulker Box\",purple_wool:\"Purple Wool\",purpur_block:\"Purpur Block\",purpur_stairs:\"Purpur Stairs\",quartz:\"Nether Quartz\",quartz_block:\"Block of Quartz\",quartz_bricks:\"Quartz Bricks\",quartz_ore:\"Nether Quartz Ore\",quartz_stairs:\"Quartz Stairs\",rabbit:\"Raw Rabbit\",rabbit_foot:\"Rabbit's Foot\",rabbit_hide:\"Rabbit Hide\",rabbit_spawn_egg:\"Rabbit Spawn Egg\",rabbit_stew:\"Rabbit Stew\",rail:\"Rail\",raiser_armor_trim_smithing_template:\"Raiser Armor Trim Smithing Template\",rapid_fertilizer:\"Rapid Fertilizer\",ravager_spawn_egg:\"Ravager Spawn Egg\",raw_copper:\"Raw Copper\",raw_copper_block:\"Block of Raw Copper\",raw_gold:\"Raw Gold\",raw_gold_block:\"Block of Raw Gold\",raw_iron:\"Raw Iron\",raw_iron_block:\"Block of Raw Iron\",recovery_compass:\"Recovery Compass\",red_candle:\"Red Candle\",red_candle_cake:\"Cake with Red Candle\",red_carpet:\"Red Carpet\",red_concrete:\"Red Concrete\",red_dye:\"Red Dye\",red_flower:\"Flower\",red_glazed_terracotta:\"Red Glazed Terracotta\",red_mushroom:\"Red Mushroom\",red_mushroom_block:\"Red Mushroom Block\",red_nether_brick:\"Red Nether Brick\",red_nether_brick_stairs:\"Red Nether Brick Stairs\",red_sandstone:\"Red Sandstone\",red_sandstone_stairs:\"Red Sandstone Stairs\",red_shulker_box:\"Red Shulker Box\",red_wool:\"Red Wool\",redstone:\"Redstone Dust\",redstone_block:\"Block of Redstone\",redstone_lamp:\"Redstone Lamp\",redstone_ore:\"Redstone Ore\",redstone_torch:\"Redstone Torch\",redstone_wire:\"Redstone Dust\",reinforced_deepslate:\"Reinforced Deepslate\",repeater:\"Redstone Repeater\",repeating_command_block:\"Repeating Command Block\",reserved6:\"Reserved6\",respawn_anchor:\"Respawn Anchor\",rib_armor_trim_smithing_template:\"Rib Armor Trim Smithing Template\",rotten_flesh:\"Rotten Flesh\",saddle:\"Saddle\",salmon:\"Raw Salmon\",salmon_bucket:\"Salmon Bucket\",salmon_spawn_egg:\"Salmon Spawn Egg\",sand:\"Sand\",sandstone:\"Sandstone\",sandstone_stairs:\"Sandstone Stairs\",sapling:\"Sapling\",scaffolding:\"Scaffolding\",sculk:\"Sculk\",sculk_catalyst:\"Sculk Catalyst\",sculk_sensor:\"Sculk Sensor\",sculk_shrieker:\"Sculk Shrieker\",sculk_vein:\"Sculk Vein\",scute:\"Scute\",sea_lantern:\"Sea Lantern\",sea_pickle:\"Sea Pickle\",seagrass:\"Seagrass\",sentry_armor_trim_smithing_template:\"Sentry Armor Trim Smithing Template\",shaper_armor_trim_smithing_template:\"Shaper Armor Trim Smithing Template\",sheaf_pottery_sherd:\"Sheaf Pottery Sherd\",shears:\"Shears\",sheep_spawn_egg:\"Sheep Spawn Egg\",shelter_pottery_sherd:\"Shelter Pottery Sherd\",shield:\"Shield\",shroomlight:\"Shroomlight\",shulker_box:\"Shulker Box\",shulker_shell:\"Shulker Shell\",shulker_spawn_egg:\"Shulker Spawn Egg\",silence_armor_trim_smithing_template:\"Silence Armor Trim Smithing Template\",silver_glazed_terracotta:\"Silver Glazed Terracotta\",silverfish_spawn_egg:\"Silverfish Spawn Egg\",skeleton_horse_spawn_egg:\"Skeleton Horse Spawn Egg\",skeleton_spawn_egg:\"Skeleton Spawn Egg\",skull:\"Skull\",skull_banner_pattern:\"Skull Banner Pattern\",skull_pottery_sherd:\"Skull Pottery Sherd\",slime:\"Slime Block\",slime_ball:\"Slimeball\",slime_spawn_egg:\"Slime Spawn Egg\",small_amethyst_bud:\"Small Amethyst Bud\",small_dripleaf_block:\"Small Dripleaf\",smithing_table:\"Smithing Table\",smoker:\"Smoker\",smooth_basalt:\"Smooth Basalt\",smooth_quartz_stairs:\"Smooth Quartz Stairs\",smooth_red_sandstone_stairs:\"Smooth Red Sandstone Stairs\",smooth_sandstone_stairs:\"Smooth Sandstone Stairs\",smooth_stone:\"Smooth Stone\",sniffer_egg:\"Sniffer Egg\",sniffer_spawn_egg:\"Sniffer Spawn Egg\",snort_pottery_sherd:\"Snort Pottery Sherd\",snout_armor_trim_smithing_template:\"Snout Armor Trim Smithing Template\",snow:\"Snow\",snow_golem_spawn_egg:\"Snow Golem Spawn Egg\",snow_layer:\"Top Snow\",snowball:\"Snowball\",soul_campfire:\"Soul Campfire\",soul_fire:\"Soul Fire\",soul_lantern:\"Soul Lantern\",soul_sand:\"Soul Sand\",soul_soil:\"Soul Soil\",soul_torch:\"Soul Torch\",sparkler:\"Sparkler\",spawn_egg:\"Spawn Egg\",spider_eye:\"Spider Eye\",spider_spawn_egg:\"Spider Spawn Egg\",spire_armor_trim_smithing_template:\"Spire Armor Trim Smithing Template\",splash_potion:\"Splash Potion\",sponge:\"Sponge\",spore_blossom:\"Spore Blossom\",spruce_boat:\"Spruce Boat\",spruce_button:\"Spruce Button\",spruce_chest_boat:\"Spruce Chest Boat\",spruce_door:\"Spruce Door\",spruce_fence:\"Spruce Fence\",spruce_fence_gate:\"Spruce Fence Gate\",spruce_hanging_sign:\"Spruce Hanging Sign\",spruce_log:\"Spruce Log\",spruce_pressure_plate:\"Spruce Pressure Plate\",spruce_sign:\"Spruce Sign\",spruce_stairs:\"Spruce Stairs\",spruce_trapdoor:\"Spruce Trapdoor\",spyglass:\"Spyglass\",squid_spawn_egg:\"Squid Spawn Egg\",stained_glass:\"Stained Glass\",stained_glass_pane:\"Stained Glass Pane\",stained_hardened_clay:\"Terracotta\",standing_banner:\"Banner\",standing_sign:\"Sign\",stick:\"Stick\",sticky_piston:\"Sticky Piston\",stone:\"Stone\",stone_axe:\"Stone Axe\",stone_block_slab:\"Stone Block Slab\",stone_brick_stairs:\"Stone Brick Stairs\",stone_button:\"Stone Button\",stone_hoe:\"Stone Hoe\",stone_pickaxe:\"Stone Pickaxe\",stone_pressure_plate:\"Stone Pressure Plate\",stone_shovel:\"Stone Shovel\",stone_stairs:\"Cobblestone Stairs\",stone_sword:\"Stone Sword\",stonebrick:\"Stone Bricks\",stonecutter:\"Stonecutter\",stonecutter_block:\"Stonecutter\",stray_spawn_egg:\"Stray Spawn Egg\",strider_spawn_egg:\"Strider Spawn Egg\",stripped_acacia_log:\"Stripped Acacia Log\",stripped_bamboo_block:\"Block of Stripped Bamboo\",stripped_birch_log:\"Stripped Birch Log\",stripped_cherry_log:\"Stripped Cherry Log\",stripped_cherry_wood:\"Stripped Cherry Wood\",stripped_crimson_hyphae:\"Stripped Crimson Hyphae\",stripped_crimson_stem:\"Stripped Crimson Stem\",stripped_dark_oak_log:\"Stripped Dark Oak Log\",stripped_jungle_log:\"Stripped Jungle Log\",stripped_mangrove_log:\"Stripped Mangrove Log\",stripped_mangrove_wood:\"Stripped Mangrove Wood\",stripped_oak_log:\"Stripped Oak Log\",stripped_spruce_log:\"Stripped Spruce Log\",stripped_warped_hyphae:\"Stripped Warped Hyphae\",stripped_warped_stem:\"Stripped Warped Stem\",structure_block:\"Structure Block\",structure_void:\"Structure Void\",sugar:\"Sugar\",sugar_cane:\"Sugar Cane\",suspicious_gravel:\"Suspicious Gravel\",suspicious_sand:\"Suspicious Sand\",suspicious_stew:\"Suspicious Stew\",sweet_berries:\"Sweet Berries\",sweet_berry_bush:\"Sweet Berry Bush\",tadpole_bucket:\"Tadpole Bucket\",tadpole_spawn_egg:\"Tadpole Spawn Egg\",tallgrass:\"Grass\",target:\"Target\",tide_armor_trim_smithing_template:\"Tide Armor Trim Smithing Template\",tinted_glass:\"Tinted Glass\",tnt:\"TNT\",tnt_minecart:\"Minecart with TNT\",torch:\"Torch\",torchflower:\"Torchflower\",torchflower_crop:\"Torchflower Crop\",torchflower_seeds:\"Torchflower Seeds\",totem_of_undying:\"Totem Of Undying\",trader_llama_spawn_egg:\"Trader Llama Spawn Egg\",trapdoor:\"Oak Trapdoor\",trapped_chest:\"Trapped Chest\",trident:\"Trident\",trip_wire:\"Trip Wire\",tripwire_hook:\"Tripwire Hook\",tropical_fish:\"Tropical Fish\",tropical_fish_bucket:\"Tropical Fish Bucket\",tropical_fish_spawn_egg:\"Tropical Fish Spawn Egg\",tube_coral:\"Tube Coral\",tuff:\"Tuff\",turtle_egg:\"Sea Turtle Egg\",turtle_helmet:\"Turtle Shell\",turtle_spawn_egg:\"Turtle Spawn Egg\",twisting_vines:\"Twisting Vines\",underwater_torch:\"Underwater Torch\",undyed_shulker_box:\"Undyed Shulker Box\",unknown:\"Unknown\",unlit_redstone_torch:\"Redstone Torch\",unpowered_comparator:\"Unpowered Comparator\",unpowered_repeater:\"Unpowered Repeater\",verdant_froglight:\"Verdant Froglight\",vex_armor_trim_smithing_template:\"Vex Armor Trim Smithing Template\",vex_spawn_egg:\"Vex Spawn Egg\",villager_spawn_egg:\"Villager Spawn Egg\",vindicator_spawn_egg:\"Vindicator Spawn Egg\",vine:\"Vines\",wall_banner:\"Wall Banner\",wandering_trader_spawn_egg:\"Wandering Trader Spawn Egg\",ward_armor_trim_smithing_template:\"Ward Armor Trim Smithing Template\",warden_spawn_egg:\"Warden Spawn Egg\",warped_button:\"Warped Button\",warped_door:\"Warped Door\",warped_double_slab:\"Warped Slab\",warped_fence:\"Warped Fence\",warped_fence_gate:\"Warped Fence Gate\",warped_fungus:\"Warped Fungus\",warped_fungus_on_a_stick:\"Warped Fungus on a Stick\",warped_hanging_sign:\"Warped Hanging Sign\",warped_hyphae:\"Warped Hyphae\",warped_nylium:\"Warped Nylium\",warped_planks:\"Warped Planks\",warped_pressure_plate:\"Warped Pressure Plate\",warped_roots:\"Warped Roots\",warped_sign:\"Warped Sign\",warped_slab:\"Warped Slab\",warped_stairs:\"Warped Stairs\",warped_stem:\"Warped Stem\",warped_trapdoor:\"Warped Trapdoor\",warped_wart_block:\"Warped Wart Block\",water:\"Water\",water_bucket:\"Water Bucket\",waterlily:\"Lily Pad\",waxed_copper:\"Waxed Block of Copper\",waxed_cut_copper:\"Waxed Cut Copper\",waxed_cut_copper_slab:\"Waxed Cut Copper Slab\",waxed_cut_copper_stairs:\"Waxed Cut Copper Stairs\",waxed_double_cut_copper_slab:\"Waxed Double Cut Copper Slab\",waxed_exposed_copper:\"Waxed Exposed Copper\",waxed_exposed_cut_copper:\"Waxed Exposed Cut Copper\",waxed_exposed_cut_copper_slab:\"Waxed Exposed Cut Copper Slab\",waxed_exposed_cut_copper_stairs:\"Waxed Exposed Cut Copper Stairs\",waxed_exposed_double_cut_copper_slab:\"Waxed Exposed Double Cut Copper Slab\",waxed_oxidized_copper:\"Waxed Oxidized Copper\",waxed_oxidized_cut_copper:\"Waxed Oxidized Cut Copper\",waxed_oxidized_cut_copper_slab:\"Waxed Oxidized Cut Copper Slab\",waxed_oxidized_cut_copper_stairs:\"Waxed Oxidized Cut Copper Stairs\",waxed_oxidized_double_cut_copper_slab:\"Waxed Oxidized Double Cut Copper Slab\",waxed_weathered_copper:\"Waxed Weathered Copper\",waxed_weathered_cut_copper:\"Waxed Weathered Cut Copper\",waxed_weathered_cut_copper_slab:\"Waxed Weathered Cut Copper Slab\",waxed_weathered_cut_copper_stairs:\"Waxed Weathered Cut Copper Stairs\",waxed_weathered_double_cut_copper_slab:\"Waxed Weathered Double Cut Copper Slab\",wayfinder_armor_trim_smithing_template:\"Wayfinder Armor Trim Smithing Template\",weathered_copper:\"Weathered Copper\",weathered_cut_copper:\"Weathered Cut Copper\",weathered_cut_copper_slab:\"Weathered Cut Copper Slab\",weathered_cut_copper_stairs:\"Weathered Cut Copper Stairs\",weathered_double_cut_copper_slab:\"Weathered Double Cut Copper Slab\",web:\"Cobweb\",weeping_vines:\"Weeping Vines\",wheat:\"Wheat\",wheat_seeds:\"Seeds\",white_candle:\"White Candle\",white_candle_cake:\"Cake with White Candle\",white_carpet:\"White Carpet\",white_concrete:\"White Concrete\",white_dye:\"White Dye\",white_glazed_terracotta:\"White Glazed Terracotta\",white_shulker_box:\"White Shulker Box\",white_wool:\"White Wool\",wild_armor_trim_smithing_template:\"Wild Armor Trim Smithing Template\",witch_spawn_egg:\"Witch Spawn Egg\",wither_rose:\"Wither Rose\",wither_skeleton_spawn_egg:\"Wither Skeleton Spawn Egg\",wither_spawn_egg:\"Wither Spawn Egg\",wolf_spawn_egg:\"Wolf Spawn Egg\",wood:\"Wood\",wooden_axe:\"Wooden Axe\",wooden_button:\"Oak Button\",wooden_door:\"Oak Door\",wooden_hoe:\"Wooden Hoe\",wooden_pickaxe:\"Wooden Pickaxe\",wooden_pressure_plate:\"Oak Pressure Plate\",wooden_shovel:\"Wooden Shovel\",wooden_slab:\"Wood Slab\",wooden_sword:\"Wooden Sword\",wool:\"Wool\",writable_book:\"Book & Quill\",written_book:\"Written Book\",yellow_candle:\"Yellow Candle\",yellow_candle_cake:\"Cake with Yellow Candle\",yellow_carpet:\"Yellow Carpet\",yellow_concrete:\"Yellow Concrete\",yellow_dye:\"Yellow Dye\",yellow_flower:\"Flower\",yellow_glazed_terracotta:\"Yellow Glazed Terracotta\",yellow_shulker_box:\"Yellow Shulker Box\",yellow_wool:\"Yellow Wool\",zoglin_spawn_egg:\"Zoglin Spawn Egg\",zombie_horse_spawn_egg:\"Zombie Horse Spawn Egg\",zombie_pigman_spawn_egg:\"Zombie Pigman Spawn Egg\",zombie_spawn_egg:\"Zombie Spawn Egg\",zombie_villager_spawn_egg:\"Zombie Villager Spawn Egg\"};const Ll=Hl({name:\"loot-editor\",props:{form:Object,mobs:Object},data:()=>({item_ids:Wl}),methods:{addPool(){this.form.custom_loot.forEachReverse((e=>{0!=e.max&&\"\"!=e.id||this.form.custom_loot.remove(e)}));let e={uuid:guid(),rolls:1,entries:[]};this.form.custom_loot.push(e),this.addItem(e)},addItem(e){e.entries.forEachReverse((t=>{0!=t.max&&\"\"!=t.id||e.entries.remove(t)}));let t={type:\"empty\",custom_id:\"\",uuid:guid(),count_min:0,count_max:1,weight:1};e.entries.push(t)},getSameLootText(){return`Use the default loot from the ${this.mobs[this.form.behavior].name}.`},getItemIcon(e){if(!(e=e.replace(/^minecraft:/,\"\")).includes(\":\")&&Wl[e])return`https://raw.githubusercontent.com/Mojang/bedrock-samples/main/resource_pack/textures/items/${e}.png`}}},Pl,[function(){var e=this._self._c;return e(\"section\",[e(\"p\",{staticClass:\"description\"},[this._v(\"Select which items the entity will drop on death\")])])}],!1,(function(e){var t=a(742);t.__inject__&&t.__inject__(e)}),null,\"afbd0422\").exports;var Zl=function(){var e=this,t=e._self._c;return t(\"div\",[t(\"p\",[e._v(\"Export your mob as a behavior and resource pack.\")]),e._v(\" \"),t(\"section\",{attrs:{id:\"entity_wizard_export_options\"}},[e.isApp?t(\"div\",{staticClass:\"entity_wizard_export_option\",class:{selected:\"folder\"==e.form.export_mode},staticStyle:{\"border-color\":\"#dccb92\"},on:{click:function(t){return e.setExportMode(\"folder\")}}},[t(\"h3\",[e._v(\"Export to Folder\")]),e._v(\" \"),t(\"p\",[e._v(\"Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.\")])]):e._e(),e._v(\" \"),e.isApp?t(\"div\",{staticClass:\"entity_wizard_export_option\",class:{selected:\"integrate\"==e.form.export_mode},staticStyle:{\"border-color\":\"#83c4ea\"},on:{click:function(t){return e.setExportMode(\"integrate\")}}},[t(\"h3\",[e._v(\"Integrate into Pack\")]),e._v(\" \"),t(\"p\",[e._v(\"Integrate the entity into an existing behavior and resource pack on your computer.\")])]):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"entity_wizard_export_option\",class:{selected:\"mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#89ca51\"},on:{click:function(t){return e.setExportMode(\"mcaddon\")}}},[t(\"h3\",[e._v(\"Export as MCAddon\")]),e._v(\" \"),t(\"p\",[e._v(\"Generate an MCAddon file that you can install in one click or send to your friends.\")])]),e._v(\" \"),t(\"div\",{staticClass:\"entity_wizard_export_option\",class:{selected:\"integrate_mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#d2fc92\"},on:{click:function(t){return e.setExportMode(\"integrate_mcaddon\")}}},[t(\"h3\",[e._v(\"Integrate into MCAddon\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Integrate the entity into an existing MCAddon file.\")])])]),e._v(\" \"),\"integrate\"==e.form.export_mode?[t(\"section\",[t(\"label\",[e._v(\"Behavior Pack\")]),e._v(\" \"),t(\"p\",[e._v(\"Select the behavior pack that you want to save the new mob into\")]),e._v(\" \"),t(\"ul\",{attrs:{id:\"entity_wizard_pack_list\"}},[e._l(e.existing_packs,(function(a){return t(\"li\",{key:a.name,class:{selected:a==e.form.integrate_pack},on:{click:function(t){e.form.integrate_pack=a}}},[a.has_icon?t(\"img\",{attrs:{src:e.getPackIcon(a),width:\"32px\"},on:{error:function(e){a.has_icon=!1}}}):t(\"div\"),e._v(\"\\n\\t\\t\\t\\t\\t\"+e._s(a.name)+\"\\n\\t\\t\\t\\t\")])})),e._v(\" \"),t(\"li\",{on:{click:function(t){return e.addPacks()}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tSelect packs manually...\\n\\t\\t\\t\\t\")])],2)])]:\"integrate_mcaddon\"==e.form.export_mode?[t(\"section\",[t(\"label\",[e._v(\"MCAddon File\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select the .mcaddon file to merge the new item into.\")]),e._v(\" \"),t(\"div\",[t(\"button\",{staticStyle:{display:\"inline-block\"},on:{click:function(t){return e.selectMCAddon()}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tUpload MCAddon\\n\\t\\t\\t\\t\")]),e._v(\"\\n\\t\\t\\t\\t\"+e._s(e.mcaddon_file_name)+\"\\n\\t\\t\\t\")])])]:[t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Pack Name\")]),e._v(\" \"),t(\"p\",[e._v(\"The name of the packs you are exporting\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_name,expression:\"form.pack_name\"}],attrs:{type:\"text\",placeholder:\"Red Panda Pack\"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_name\",t.target.value)}}})]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Pack Author(s)\")]),e._v(\" \"),t(\"p\",[e._v(\"You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_authors,expression:\"form.pack_authors\"}],attrs:{type:\"text\",placeholder:\"Benchbot, Performance Panda\"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_authors\",t.target.value)}}})]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Pack Icon\")]),e._v(\" \"),t(\"p\",[e._v(\"The pack icon will be visible in the resource and behavior pack menu\")]),e._v(\" \"),t(\"icon-picker\",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,\"pack_icon\",t)},expression:\"form.pack_icon\"}})],1)]],2)};Zl._withStripped=!0;const Xl={components:{IconPicker:Nl},name:\"export\",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:\"\"}),methods:{setExportMode(e){if(this.form.export_mode=e,\"integrate\"==e){let e=function(e){if(!isApp)return[];let t,a=[],i=[],o=Ol();try{t=jl(e),a=o.readdirSync(PathModule.join(t,\"development_resource_packs\"),{withFileTypes:!0})}catch(e){return!1}let r={};a.forEach((e=>{if(e.isDirectory())try{let a=PathModule.join(t,\"development_resource_packs\",e.name),i=o.readFileSync(PathModule.join(a,\"manifest.json\"),{encoding:\"utf-8\"}),n=autoParseJSON(i,!1);n&&n.header&&(r[n.header.uuid]=a)}catch(e){console.error(e)}}));try{i=o.readdirSync(PathModule.join(t,\"development_behavior_packs\"),{withFileTypes:!0})}catch(e){return!1}let n=[];return i.forEach((e=>{if(e.isDirectory())try{let a=PathModule.join(t,\"development_behavior_packs\",e.name),i=o.readFileSync(PathModule.join(a,\"manifest.json\"),{encoding:\"utf-8\"}),m=autoParseJSON(i,!1);if(m&&m.dependencies&&m.dependencies[0]){let t=m.dependencies[0].uuid;r[t]&&n.push({name:e.name,bp_path:a,rp_path:r[t],has_icon:!0})}}catch(e){console.error(e)}})),n}(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+\"pack_icon.png\",addPacks(){let e={name:\"\",bp_path:\"\",rp_path:\"\",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:\"bedrock_behavior_pack\"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:\"bedrock_resource_pack\"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:[\"mcaddon\"],type:\"MCAddon\",readtype:\"binary\"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.EntityWizardProject.previous_mcaddon=t}))}}},$l=Hl(Xl,Zl,[],!1,(function(e){var t=a(1083);t.__inject__&&t.__inject__(e)}),null,\"6244a4ee\").exports,eA=\"data:image/png;base64,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\",tA=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMjY1MjQ2O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6IzI4NmI0OTtmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\",aA={installed:!1,initialized:!1,icon:\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=\",async open(e,t){if(!aA.initialized){let e=a(5317);await new Promise((t=>{e.exec(\"code --version\").on(\"close\",(a=>{a||(aA.installed=!0,aA.launch=(t,a)=>{let i=`code -n \"${t}\" \"${a}\"`;e.exec(i)},t())}))})),aA.initialized=!0}aA.launch(e,t)},launch(){Blockbench.openLink(\"https://code.visualstudio.com\")}};function iA(){let e=\"#\";for(var t=0;t<6;t++)e+=Math.floor(16*Math.random()).toString(16);return e}const oA={name:\"entity-wizard-dialog\",components:{SpawnEgg:Tl,Export:$l,LootEditor:Ll},data(){let e=function(){if(Format.id&&Format.id.match(/^bedrock/)){let e=Project.geometry_name;Project.geometry_name=\"{name}\";let t=Format.codec.compile();Project.geometry_name=e;let a={name:\"Current Model\",entity:zl.basic.entity,model:t,thumbnail:zl.basic.thumbnail,textures:{}};main_preview.screenshot({width:144,height:96},(e=>{a.thumbnail=e}));let i=Texture.getDefault();if(i){let e=\"data:image/png;base64,\"+i.getBase64();a.textures.default=e}return a}}();return{open_page:\"start\",start_page_image:eA,start_page_background:tA,dialogue_designer_icon:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAjUlEQVQ4jWNgGGjACKX/k6ufEab5wI3XJOl00BBlYGBgYGAiR/Plq9cZUuoXMzAwMDCwoEsQAy5eeghnM5FkNRYwDAyAB+Llq9cZLl56yKCvJw+XRA4svC5w0BDFUExI85zGWAYGBiwpcfLaQ3DNMEV4ACO6wH8GBob/KfWL/8PYJJuApgmbPFGA6MwFAFZdLyWGO8YJAAAAAElFTkSuQmCC\",VSCode:aA,pages:{metadata:{name:\"Name\"},appearance:{name:\"Appearance\"},behavior:{name:\"Behavior\"},loot:{name:\"Loot\"},spawn_egg:{name:\"Spawn Egg\"},export:{name:\"Export\",button:\"Export\"},next_steps:{name:\"Next Steps\",button:isApp?\"Edit Model\":\"Continue\"}},edition_options:{bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"},mobs:zl,open_project_mob:e,appearance_search_term:\"\",behavior_search_term:\"\",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,form:{edition:localStorage.getItem(\"minecraft_wizard.selected_edition\")||\"bedrock\",identifier:\"\",display_name:\"\",appearance:\"\",behavior:\"\",loot_type:\"default\",custom_loot:[],spawn_egg_mode:\"colors\",spawn_egg_base:iA(),spawn_egg_overlay:iA(),spawn_egg_image:\"\",export_mode:isApp?\"folder\":\"mcaddon\",pack_name:\"\",pack_authors:\"\",pack_icon:\"\",integrate_pack:null}}},computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?\"Use a different namespace than 'minecraft:'\":e.match(/[A-Z]/)?\"Identifiers cannot contain capital letters\":e.match(/^\\d/)?\"Identifiers cannot start with a number\":e.match(/[^a-z0-9-_.:]/)?\"Identifiers cannot contain spaces or special characters\":e.match(/\\w:\\w/)?\"\":\"Identifiers must start with a namespace, separated by a colon\":\"\"},appearance_mobs(){let e=this.appearance_search_term.toLowerCase(),t=\"edu\"==this.form.edition,a={};for(var i in this.open_project_mob&&(a.blockbench_model=this.open_project_mob),this.mobs){let o=this.mobs[i];o.disable_on_edu&&t||o.entity&&(o.name.toLowerCase().includes(e)||o.aliases&&o.aliases.includes(e))&&(a[i]=o)}return a},behavior_mobs(){let e=this.behavior_search_term.toLowerCase(),t=\"edu\"==this.form.edition,a={};for(var i in this.mobs){let o=this.mobs[i];o.disable_on_edu&&t||(o.name.toLowerCase().includes(e)||o.aliases&&o.aliases.includes(e))&&(a[i]=o)}return a}},methods:{cancel(e){if(!document.querySelector(\"#blackout:hover\")&&open_interface instanceof Dialog){let e=open_interface;e.hide(),\"start\"!=this.open_page&&Blockbench.showMessageBox({title:\"Discard\",message:\"Do you want to discard your progress in the Minecraft entity wizard?\",icon:\"delete\",buttons:[\"Keep\",\"Discard\"]},(t=>{1==t&&(e.delete(),delete e.object)}))}},checkPageComplete(){let{form:e}=this;if(\"metadata\"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage(\"Please enter a name\"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage(\"Please enter a correct identifier\"),!1}else if(\"appearance\"==this.open_page){if(!e.appearance)return Blockbench.showQuickMessage(\"Please select a base mob\"),!1}else if(\"behavior\"==this.open_page){if(!e.behavior)return Blockbench.showQuickMessage(\"Please select a base mob\"),!1}else if(\"spawn_egg\"==this.open_page);else if(\"export\"==this.open_page){if(\"integrate\"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage(\"Please select a behavior pack\"),!1;if(\"integrate_mcaddon\"==e.export_mode&&!window.EntityWizardProject.previous_mcaddon)return Blockbench.showQuickMessage(\"Please select an mcaddon file\"),!1;if(0==e.export_mode.includes(\"integrate\")&&!e.pack_name)return Blockbench.showQuickMessage(\"Please enter a pack name\"),!1;if(0==e.export_mode.includes(\"integrate\")&&e.pack_name.match(/[<>:\"/\\\\|?*]/))return Blockbench.showQuickMessage(\"You cannot use invalid characters in the pack name: \"+e.pack_name.match(/[<>:\"/\\\\|?*]/)[0]),!1}return!0},async exportPacks(){let e=await async function(e,t){let a=Ol(),i=isApp&&jl(e.edition),o=e.identifier.replace(/^.+:/,\"\"),r=guid(),n=Rl;if(e.pack_icon){let d=new CanvasFrame(16,16);await d.loadFromURL(e.pack_icon),n=d.canvas.toDataURL()}let m,s,l={authors:e.pack_authors?e.pack_authors.split(/,\\s*/):void 0,generated_with:{blockbench_entity_wizard:[\"1.8.3\"]}},A=function(e,t){let a=[],i=guid();a.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Behavior Pack\",uuid:i,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:\"Behavior\",version:[1,0,0],uuid:guid(),type:\"data\"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),a.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon});let o=(zl[e.behavior]||zl.basic).behavior;var r;r=(r=(r=o).replace(/{name}/g,t.mob_filename)).replace(/{identifier}/g,e.identifier),o=JSON.parse(r);let{component_groups:n,description:m,components:s}=o[\"minecraft:entity\"];if(m.identifier=e.identifier,m.is_spawnable=\"none\"!=e.spawn_egg_mode,\"custom\"==e.loot_type){if(n)for(let e in n)e.includes(\"adult\")&&n[e][\"minecraft:loot\"]&&(n[e][\"minecraft:loot\"]={table:`loot_tables/entities/${t.mob_filename}.json`});s[\"minecraft:loot\"]={table:`loot_tables/entities/${t.mob_filename}.json`};let i=function(e){return{pools:e.custom_loot.map((e=>{let t={rolls:e.rolls,entries:[]};return e.entries.forEach((e=>{let a;a=\"empty\"==e.type?{type:\"empty\",weight:e.weight}:{type:\"item\",name:\"custom\"==e.type?e.custom_id:e.type,weight:e.weight,functions:[{function:\"set_count\",count:e.count_min==e.count_max?e.count_min:{min:e.count_min,max:e.count_max}}]},t.entries.push(a)})),t}))}}(e);a.push({name:`loot_tables/entities/${t.mob_filename}.json`,content:compileJSON(i)})}else if(\"none\"==e.loot_type&&(delete s[\"minecraft:loot\"],n))for(let e in n)delete n[e][\"minecraft:loot\"];return a.push({name:`entities/${t.mob_filename}.behavior.json`,content:compileJSON(o)}),a}(e,{mob_filename:o,rp_uuid:r,pack_icon:n,pack_metadata:l}),c=await async function(e,t){function a(a){return a=(a=a.replace(/{name}/g,t.mob_filename)).replace(/{identifier}/g,e.identifier),JSON.parse(a)}let i=[];i.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Resource Pack\",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:\"resources\",uuid:guid(),version:[1,0,0]}]})}),i.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon});const o=zl[e.appearance]||t.open_project_mob;let r,n=a(o.entity),{description:m}=n[\"minecraft:client_entity\"];if(m.identifier=e.identifier,\"colors\"==e.spawn_egg_mode)m.spawn_egg={base_color:e.spawn_egg_base,overlay_color:e.spawn_egg_overlay};else if(\"texture\"==e.spawn_egg_mode){let a=t.mob_filename+\"_spawn_egg\";m.spawn_egg={texture:a},i.push({name:\"textures/item_texture.json\",merge:!0,content:compileJSON({texture_data:{[a]:{textures:[`textures/items/${a}`]}}})});let o=new CanvasFrame(16,16);await o.loadFromURL(e.spawn_egg_image);let r=o.canvas.toDataURL();i.push({name:`textures/items/${a}.png`,content:r,type:\"image\"})}else delete m.spawn_egg;window.EntityWizardProject.project&&(r=ModelProject.all.find((e=>e.uuid==window.EntityWizardProject.project)),r&&r!==Project&&r.select());let s=a(o.model);window.EntityWizardProject.model=s,r&&(s=Codecs.bedrock.compile({raw:!0})),i.push({name:`models/entity/${t.mob_filename}.geo.json`,content:compileJSON(s)}),window.EntityWizardProject.textures={};let l=Object.keys(o.textures).length;if(1==l){m.textures.default=`textures/entity/${t.mob_filename}`;let e=o.textures.default;r&&Texture.all.length&&(e=\"data:image/png;base64,\"+Texture.getDefault().getBase64()),window.EntityWizardProject.textures.default=e,i.push({name:`textures/entity/${t.mob_filename}.png`,content:e,type:\"image\"})}else if(l>1)for(var A in o.textures){let e=\"default\"==A?t.mob_filename:A;m.textures[A]=`textures/entity/${t.mob_filename}/${e}`;let a=o.textures[A];if(r&&Texture.all.length){let t=Texture.all.find((t=>t.name==e+\".png\"));t&&(a=\"data:image/png;base64,\"+t.getBase64())}window.EntityWizardProject.textures[A]=a,i.push({name:`textures/entity/${t.mob_filename}/${e}.png`,content:a,type:\"image\"})}if(delete window.EntityWizardProject.animation,o.animations){let e=a(o.animations);r&&(e=Animator.buildFile()),window.EntityWizardProject.animation=e,i.push({name:`animations/${t.mob_filename}.animation.json`,content:compileJSON(e)})}if(o.render_controllers){let e=a(o.render_controllers);i.push({name:`render_controllers/${t.mob_filename}.render_controllers.json`,content:compileJSON(e)})}i.push({name:`entity/${t.mob_filename}.entity.json`,content:compileJSON(n)});let c=[`entity.${e.identifier}.name=${e.display_name}`];\"none\"!=e.spawn_egg_mode&&c.push(`item.spawn_egg.entity.${e.identifier}.name=Spawn ${e.display_name}`),o.rideable&&c.push(`action.hint.exit.${e.identifier}=Tap sneak to dismount`),i.push({name:\"texts/en_US.lang\",merge:!0,content:c.join(\"\\n\")});let{entity_sounds:d}=JSON.parse(Ul());return i.push({name:\"sounds.json\",merge:!0,content:compileJSON({entity_sounds:{entities:{[e.identifier]:d.entities[e.appearance]}}})}),i}(e,{mob_filename:o,rp_uuid:r,pack_icon:n,pack_metadata:l,open_project_mob:t.open_project_mob});if(\"folder\"==e.export_mode){m=PathModule.join(i,\"development_behavior_packs\",e.pack_name);try{a.readdirSync(m)}catch(p){a.mkdirSync(m)}s=PathModule.join(i,\"development_resource_packs\",e.pack_name);try{a.readdirSync(s)}catch(u){a.mkdirSync(s)}}else if(\"integrate\"==e.export_mode){function g(e){try{let t=a.readFileSync(e,{encoding:\"utf-8\"}),i=autoParseJSON(t,!1);i&&(i.metadata||(i.metadata={}),i.metadata.generated_with||(i.metadata.generated_with={}),i.metadata.generated_with.blockbench_entity_wizard instanceof Array==0&&(i.metadata.generated_with.blockbench_entity_wizard=[]),i.metadata.generated_with.blockbench_entity_wizard.safePush(\"1.8.3\"),a.writeFileSync(e,compileJSON(i),{encoding:\"utf-8\"}))}catch(e){console.error(\"Unable to add generator to existing pack manifests\",e)}}m=e.integrate_pack.bp_path,s=e.integrate_pack.rp_path,g(PathModule.join(m,\"manifest.json\")),g(PathModule.join(s,\"manifest.json\"))}if(\"folder\"==e.export_mode||\"integrate\"==e.export_mode){function h(t,i){if(t.setup_file&&\"integrate\"==e.export_mode)return;let o=PathModule.join(i,t.name);if(function(e,t){let a=e.split(PathModule.sep),i=Math.max(t.split(PathModule.sep).length-1,1);for(;i<a.length;i++){let e=PathModule.join(...a.slice(0,i+1));try{Ol().readdirSync(e)}catch(t){Ol().mkdirSync(e)}}}(PathModule.dirname(o),i),\"integrate\"==e.export_mode&&t.merge&&a.existsSync(o)){let e=a.readFileSync(o,\"utf-8\");if(o.endsWith(\"json\"))try{e=autoParseJSON(e);let a=JSON.parse(t.content);$.extend(!0,a,e),t.content=compileJSON(a)}catch(e){}else o.endsWith(\"png\")||(t.content=e+\"\\n\"+t.content)}Blockbench.writeFile(o,{savetype:t.type,content:t.content})}A.forEach((e=>{h(e,m)})),c.forEach((e=>{h(e,s)}))}if(\"mcaddon\"==e.export_mode||\"integrate_mcaddon\"==e.export_mode){let f,_=\"integrate_mcaddon\"==e.export_mode,b=e.pack_name;if(f=_&&window.EntityWizardProject.previous_mcaddon?window.EntityWizardProject.previous_mcaddon:new JSZip,_){let w=!1;f.forEach(((e,t)=>{if(w)return;let a=e.split(\"/\");a.length>=2&&(b=a[0].replace(/\\s*(BP|Behavior|RP|Resources?)$/i,\"\"),w=!0)}))}async function v(e,t){if(e.setup_file&&_)return;let a=t+e.name;if(_&&e.merge&&f.file(a)){let t=await f.file(a).async(\"string\");if(a.endsWith(\"json\"))try{t=autoParseJSON(t);let a=JSON.parse(e.content);$.extend(!0,a,t),e.content=compileJSON(a)}catch(e){}else a.endsWith(\"png\")||(e.content=t+\"\\n\"+e.content)}e.setup_file&&_||(\"image\"==e.type&&(e.content=e.content.split(\",\")[1]),f.file(a,e.content,{base64:\"image\"==e.type||void 0,binary:\"buffer\"==e.type||void 0}))}for(let B of A)await v(B,b+\" Behavior/\");for(let k of c)await v(k,b+\" Resources/\");let y=await f.generateAsync({type:\"blob\"});isApp?Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:b,content:y,savetype:\"zip\"}):Blockbench.showMessageBox({title:\"Export Add-on\",commands:{download:\"Download File\"},buttons:[\"dialog.cancel\"]},(e=>{\"download\"==e&&Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:b,content:y,savetype:\"zip\"})}))}return{rp_path:s,bp_path:m}}(this.form,{open_project_mob:this.open_project_mob});this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,\"integrate\"==this.form.export_mode?Blockbench.showQuickMessage(\"Integrated into Resource and Behavior Pack\"):(Blockbench.notification(\"Export Successful\",\"Exported resource and behavior pack\"),Blockbench.showQuickMessage(\"Exported Resource and Behavior Pack\")),localStorage.setItem(\"minecraft_wizard.selected_edition\",this.form.edition)},async switchPage(e){let t=Object.keys(this.pages),a=t.indexOf(this.open_page),i=t.indexOf(e);if(i<=a)this.open_page=e;else{let e;for(;this.open_page!=e&&this.open_page!=t[i];)e=this.open_page,await this.nextPage()}},async nextPage(){if(!this.checkPageComplete())return;if(\"appearance\"==this.open_page&&!this.form.behavior&&zl[this.form.appearance]&&(this.form.behavior=this.form.appearance),\"export\"==this.open_page&&await this.exportPacks(),\"next_steps\"==this.open_page){let e=this.form.identifier.replace(/^.+:/,\"\"),t=this.resource_pack_path;if(this.form.export_mode.includes(\"mcaddon\")||!isApp){let t={no_file:!0,content:JSON.stringify(window.EntityWizardProject.model),path:e+\".geo.json\"};try{loadModelFile(t)}catch(e){console.error(e)}return setTimeout((()=>{for(let t in window.EntityWizardProject.textures){let a=window.EntityWizardProject.textures[t];new Texture({name:e}).fromDataURL(a).add(!1)}window.EntityWizardProject.animation&&Animator.loadFile({json:window.EntityWizardProject.animation,path:`animations/${e}.animation.json`}),window.EntityWizardProject.project=Project.uuid}),100),void(Dialog.open&&Dialog.open.close())}open_interface instanceof Dialog&&open_interface.hide(),Blockbench.read([PathModule.join(t,\"models\",\"entity\",`${e}.geo.json`)],{},(e=>{loadModelFile(e[0]),setTimeout((()=>{open_interface&&\"select_texture\"==open_interface.id&&open_interface.onButton(1)}),100)}))}let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)+1];t&&(this.open_page=t)},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&(this.open_page=t)},openInstallInstructions(e){!function(e){new Dialog({title:\"Add-on Installation Instructions\",singleButton:!0,width:660,lines:[e.includes(\"mcaddon\")?$('<p style=\"line-height: normal;margin: 10px 0;\">To import the packs into Minecraft, open the downloaded .mcaddon file.</p>')[0]:\"\",$('<p style=\"line-height: normal;margin: 10px 0;\">To enable the addon, you need to add it to your Minecraft world.\\n\\t\\t\\t\\tOpen your world settings and locate the Behavior Packs section.\\n\\t\\t\\t\\tFind your new pack and activate it.\\n\\t\\t\\t\\tEnabling the behavior pack will also automatically activate the resource pack.</p>\\n\\t\\t\\t')[0],Interface.createElement(\"img\",{src:\"data:image/png;base64,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\",style:\"image-rendering: auto; max-width: 100%;\",width:\"660px\"})]}).show()}(e)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||\"myname\")+\":\"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,\"_\").replace(/[^a-z0-9_:]/g,\"\"),this.form.identifier=e},getThumbnail:e=>`url('${e}')`,getSameBehaviorText(e){return\"blockbench_model\"==e?\"Use the basic behavior.\":\"basic\"==e?\"Use the basic behavior as well.\":`Use the behavior from the ${this.mobs[this.form.appearance].name} as well.`},copySummonCommand(){let e=`/summon ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage(\"Command copied to clipboard\")}}},rA=Hl(oA,e,[function(){var e=this,t=e._self._c;return t(\"section\",[t(\"label\",[e._v(\"This wizard will guide you through the process of creating a custom Minecraft entity.\")]),e._v(\" \"),t(\"p\",[e._v(\"In the process, you can select the appearance of the mob, as well as how it behaves in the world, what it is called and how it can be spawned.\")])])},function(){var e=this,t=e._self._c;return t(\"section\",[t(\"label\",[e._v(\"By the end, you will have a simple Add-On containing your entity.\")]),e._v(\" \"),t(\"p\",[e._v(\"From there, you will be able to customize the entity in depth.\")]),e._v(\" \"),t(\"p\",[e._v(\"We will let you know everything you will need to get started.\")])])},function(){var e=this,t=e._self._c;return t(\"li\",{staticClass:\"entity_wizard_documentation\"},[t(\"a\",{staticClass:\"open-in-browser\",attrs:{href:\"https://aka.ms/mcentitywizard\"}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"description\")]),e._v(\" \"),t(\"span\",[e._v(\"Documentation\")])])])},function(){var e=this._self._c;return e(\"section\",[e(\"p\",[this._v(\"Select the mob that you want the appearance of your entity to be based off. You can later modify the model in Blockbench.\")])])},function(){var e=this._self._c;return e(\"section\",[e(\"p\",[this._v(\"Select how you want the entity to behave and interact with the world.\")])])},function(){var e=this,t=e._self._c;return t(\"p\",[t(\"b\",[e._v(\"WARNING:\")]),e._v(\" Combining different appearance and behavior might not work out of the box and might need additional adjustments.\")])},function(){var e=this,t=e._self._c;return t(\"label\",[t(\"i\",{staticClass:\"material-icons\",staticStyle:{\"vertical-align\":\"sub\",margin:\"4px\"}},[e._v(\"info\")]),e._v(\"You can always re-export the MCAddon via \"),t(\"b\",[e._v(\"File\")]),e._v(\" > \"),t(\"b\",[e._v(\"Export\")]),e._v(\" > \"),t(\"b\",[e._v(\"Export MCAddon\")]),e._v(\".\")])},function(){var e=this,t=e._self._c;return t(\"section\",[t(\"label\",[e._v(\"To learn more about creating Minecraft addons, visit the \"),t(\"a\",{staticClass:\"open-in-browser\",attrs:{href:\"https://wiki.bedrock.dev/guide/introduction.html\",target:\"blank\",rel:\"noopener\"}},[e._v(\"Beginners Guide\")]),e._v(\" on the Bedrock Wiki!\")]),e._v(\" \"),t(\"p\",[e._v(\"(You can re-open this dialog to return to this page)\")])])}],!1,(function(e){var t=a(2395);t.__inject__&&t.__inject__(e)}),null,\"2f51db9c\").exports,nA=[];let mA;Plugin.register(\"minecraft_entity_wizard\",{title:\"Minecraft Entity Wizard\",author:\"JannisX11 & Mojang Studios\",icon:\"icon.png\",description:\"Create entities for Minecraft: Bedrock Edition! Start with the looks and behavior of a vanilla entity, and turn it into your own creation!\",tags:[\"Minecraft: Bedrock Edition\"],version:\"1.8.3\",min_version:\"4.8.0\",variant:\"both\",has_changelog:!0,bug_tracker:\"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",creation_date:\"2021-08-04\",onload(){async function e(){0!=await MinecraftEULA.promptUser(\"entity_wizard\")&&mA.show()}window.EntityWizardProject={},mA=new Dialog({id:\"minecraft_entity_wizard\",title:\"Minecraft Entity Wizard\",width:980,padding:!1,buttons:[],component:rA,onConfirm(){return this.content_vue.nextPage(),!1},onCancel(){return this.content_vue.cancel(),!1}});let t=new Action(\"new_bedrock_entity\",{name:\"Minecraft Entity Wizard\",icon:Rl,click(){e()}});MenuBar.menus.filter.addAction(t),nA.push(t);let a=new Action(\"entity_wizard_export_mcaddon\",{name:\"Export MCAddon (Entity Wizard)\",icon:Rl,condition:()=>mA.content_vue&&mA.content_vue.form.display_name&&mA.content_vue.form.export_mode.includes(\"mcaddon\"),click(){mA.content_vue.exportPacks()}});MenuBar.menus.file.addAction(a,\"export.0\"),nA.push(a);let i=new ModelLoader(\"minecraft_entity_wizard\",{name:\"Minecraft Entity Wizard\",description:\"Create custom Entities for Minecraft: Bedrock Edition!\",icon:Rl,target:\"Minecraft: Bedrock Edition\",format_page:{component:{template:`\\n\\t\\t\\t\\t\\t\\t<div id=\"entity_wizard_start_page\">\\n\\t\\t\\t\\t\\t\\t\\t<div>\\n\\t\\t\\t\\t\\t\\t\\t\\t<section>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<label>This wizard will guide you through the process of creating a custom Minecraft entity.</label>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<p>In the process, you can select the appearance of the mob, as well as how it behaves in the world, what it is called and how it can be spawned.</p>\\n\\t\\t\\t\\t\\t\\t\\t\\t</section>\\n\\t\\t\\t\\t\\t\\t\\t\\t<section>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<label>By the end, you will have a simple Add-On containing your entity.</label>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<p>From there, you will be able to customize the entity in depth.</p>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<p>We will let you know everything you will need to get started.</p>\\n\\t\\t\\t\\t\\t\\t\\t\\t</section>\\n\\t\\t\\t\\t\\t\\t\\t\\t<section>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<button @click=\"start()\" id=\"entity_wizard_start_button\">Let's Go!</button>\\n\\t\\t\\t\\t\\t\\t\\t\\t</section>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t\\t<img style=\"image-rendering: auto;\" src=\"${eA}\" width=\"280px\" />\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t`,methods:{async start(){await e(),mA.content_vue.open_page=\"metadata\"}}}},onStart(){e()}});nA.push(i);let o=Blockbench.addCSS(`\\n\\t\\t\\t#start_screen #entity_wizard {cursor: pointer;}\\n\\t\\t\\t#entity_wizard .graphic {image-rendering: pixelated;}\\n\\t\\t\\t#start_screen #entity_wizard .start_screen_right {padding: 12px;}\\n\\t\\t\\t#start_screen #entity_wizard right {padding: 4px;}\\n\\t\\t\\t#minecraft_entity_wizard .dialog_content {margin: 0;}\\n\\t\\t\\t.format_entry[format=minecraft_entity_wizard] {\\n\\t\\t\\t\\tcolor: #fde013;\\n\\t\\t\\t}\\n\\t\\t\\t#start_files .format_entry[format=minecraft_entity_wizard]:hover {\\n\\t\\t\\t\\tcolor: #fffe6a;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_entity_wizard {\\n\\t\\t\\t\\tbackground-image: url('${tA}');\\n\\t\\t\\t\\tbackground-position: bottom;\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_entity_wizard p {\\n\\t\\t\\t\\tcolor: var(--color-subtle_text);\\n\\t\\t\\t\\tline-height: normal;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_entity_wizard #entity_wizard_start_page section {\\n\\t\\t\\t\\tmax-width: 480px;\\n\\t\\t\\t\\tpadding: 0 20px;\\n\\t\\t\\t\\tmargin: auto;\\n\\t\\t\\t\\tpadding-top: 16px;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_entity_wizard #entity_wizard_start_button {\\n\\t\\t\\t\\tbackground-color: var(--color-accent);\\n\\t\\t\\t\\tcolor: var(--color-light);\\n\\t\\t\\t\\theight: 40px;\\n\\t\\t\\t\\twidth: 128px;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_entity_wizard #entity_wizard_start_page img {\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t\\tfloat: right;\\n\\t\\t\\t\\tmargin: 0;\\n\\t\\t\\t\\tmargin-top: -16px;\\n\\t\\t\\t}\\n\\t\\t`);nA.push(o)},onunload(){nA.forEach((e=>e.delete()))}})})()})();"
  },
  {
    "path": "plugins/minecraft_item_wizard/about.md",
    "content": "\nThis Item Wizard for Minecraft Bedrock Edition let's you add your own custom item to the game without any prior coding knowledge.\n\nSelect from a list of presets, and customize properties and functionality of the item.\n\nYou can use Blockbench's powerful editor to design a 3D model for your item! And you can design the 2D icon using Blockbench's built-in pixel art editor.\n\nThe generated Add-On can be added to Minecraft, and you can use your custom items in your own world!\n\n> Developed by the creator of Blockbench, in collaboration with Mojang Studios!\n"
  },
  {
    "path": "plugins/minecraft_item_wizard/changelog.json",
    "content": "{\n\t\"1.1.0\": {\n\t\t\"title\": \"1.1.0\",\n\t\t\"date\": \"2024-06-28\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added Enchantable Functionality\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed typo in the list of armor slots\",\n\t\t\t\t\t\"Made labels for armor slots more clear\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.0\": {\n\t\t\"title\": \"1.2.0\",\n\t\t\"date\": \"2025-02-15\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added option to merge into existing mcaddon file\",\n\t\t\t\t\t\"Added option to select game variant (normal, preview, education) inside the wizard\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed JSON comments causing file merging with existing packs to fail\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.1\": {\n\t\t\"title\": \"1.2.1\",\n\t\t\"date\": \"2025-06-08\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed an issue when importing mcaddon file for merging\",\n\t\t\t\t\t\"The resource pack now has the behavior pack set as a dependency\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.2\": {\n\t\t\"title\": \"1.2.2\",\n\t\t\"date\": \"2025-10-09\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added compatibility for Blockbench 5.0\",\n\t\t\t\t\t\"Added compatibility for new Minecraft install location\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.2.4\": {\n\t\t\"title\": \"1.2.4\",\n\t\t\"date\": \"2025-10-25\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed export issue in the web app\",\n\t\t\t\t\t\"Fixed issue with exporting to the new Minecraft install location\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/minecraft_item_wizard/minecraft_item_wizard.js",
    "content": "(()=>{\"use strict\";var e={729:(e,t,a)=>{a.d(t,{Z:()=>g});var n=a(645),o=a.n(n),r=a(667),i=a.n(r),l=a(766),s=a(482),d=a(351),c=o()((function(e){return e[1]})),p=i()(l),u=i()(s),m=i()(d);c.push([e.id,'\\n#item_wizard_wrapper {\\n\\t\\tmin-height: 300px;\\n\\t\\tposition: relative;\\n\\t\\t--color-subtle_text: #91949C;\\n}\\n#item_wizard_wrapper > content {\\n\\t\\tflex-grow: 1;\\n}\\n#item_wizard_navigation {\\n\\t\\tflex: 40px 0 0;\\n\\t\\tpadding: 8px;\\n\\t\\tdisplay: flex;\\n}\\n#item_wizard_back_button {\\n\\t\\tpadding: 5px;\\n    \\theight: 32px;\\n\\t\\tcursor: pointer;\\n}\\n#item_wizard_back_button:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n#item_wizard_navigation .bar_spacer {\\n\\t\\tflex-grow: 1;\\n}\\n#item_wizard_next_button {\\n\\t\\tbackground-color: var(--color-accent);\\n\\t\\tcolor: var(--color-light);\\n\\t\\twidth: 112px;\\n\\t\\tmargin-right: 4px;\\n}\\n#minecraft_item_wizard section {\\n\\t\\tpadding-top: 8px;\\n\\t\\tpadding-bottom: 8px;\\n}\\n#minecraft_item_wizard p.description {\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tline-height: normal;\\n\\t\\tmargin: 0;\\n\\t\\tmargin-bottom: 2px;\\n}\\n#minecraft_item_wizard p.error_message {\\n\\t\\tline-height: normal;\\n\\t\\tpadding: 8px;\\n\\t\\tborder-radius: 3px;\\n\\t\\tborder-color: var(--color-error);\\n\\t\\tborder-width: 1px;\\n\\t\\tborder-style: solid;\\n}\\n#minecraft_item_wizard input[type=text], #minecraft_item_wizard input[type=number] {\\n\\t\\tdisplay: block;\\n\\t\\twidth: 100%;\\n\\t\\theight: auto;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 4px;\\n\\t\\tpadding-right: 0;\\n\\t\\tborder-radius: 5px;\\n}\\n#minecraft_item_wizard section.divided_section {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n}\\n#minecraft_item_wizard section.divided_section > *:first-child {\\n\\t\\twidth: 70px;\\n\\t\\tflex-shrink: 0;\\n\\t\\tmargin-right: 10px;\\n\\t\\ttext-align: center;\\n\\t\\tflex-grow: 0;\\n}\\n#minecraft_item_wizard section.subsection {\\n\\t\\tmargin-left: 40px;\\n\\t\\tpadding: 4px 0;\\n}\\n#minecraft_item_wizard .wizard_columns {\\n\\t\\tdisplay: flex;\\n\\t\\tgap: 24px;\\n\\t\\tflex-wrap: wrap;\\n}\\n#minecraft_item_wizard .wizard_columns > div {\\n\\t\\tmin-width: 300px;\\n\\t\\tflex-shrink: 1;\\n\\t\\tflex-grow: 1;\\n\\t\\twidth: 0;\\n}\\n.item_wizard_target_selection {\\n\\t\\tposition: absolute;\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\ttop: 0;\\n\\t\\tright: 0;\\n\\t\\tmin-width: 156px;\\n}\\n#item_wizard_id_error {\\n\\t\\tposition: absolute;\\n\\t\\tright: 28px;\\n\\t\\tmargin-top: -28px;\\n}\\n#item_wizard_id_error:hover .item_wizard_tooltip {\\n\\t\\tdisplay: block;\\n    \\tvisibility: visible;\\n\\t\\tmargin: 0;\\n    \\tright: -5px;\\n}\\nul.item_wizard_preset_list {\\n\\t\\tmax-height: 360px;\\n\\t\\twidth: 100%;\\n\\t\\toverflow-y: scroll;\\n}\\nul.item_wizard_preset_list > li {\\n\\t\\tdisplay: flex;\\n\\t\\tflex-direction: column;\\n\\t\\tposition: relative;\\n\\t\\tfloat: left;\\n\\t\\twidth: 100px;\\n\\t\\theight: 118px;\\n\\t\\tmargin: 3px 2px;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder-radius: 5px;\\n\\t\\tcursor: pointer;\\n\\t\\tbox-sizing: content-box;\\n\\t\\tborder: 1px solid transparent;\\n\\t\\tbackground-size: 64px;\\n\\t\\tbackground-repeat: no-repeat;\\n\\t\\tbackground-position-x: center;\\n\\t\\tbackground-position-y: 18px;\\n\\t\\timage-rendering: pixelated;\\n}\\nul.item_wizard_preset_list > li:hover {\\n\\t\\tbackground-color: var(--color-selected);\\n\\t\\tcolor: var(--color-light);\\n}\\nul.item_wizard_preset_list > li.selected {\\n\\t\\t    border-color: var(--color-accent);\\n}\\nul.item_wizard_preset_list > li.selected::after {\\n\\t\\tposition: absolute;\\n\\t\\tcontent: \"\\\\f00c\";\\n\\t\\tfont-family: \\'Font Awesome 6 Free\\';\\n\\t\\tfont-weight: 600;\\n\\t\\tcolor: var(--color-accent);\\n\\t\\tbackground-color: var(--color-ui);\\n\\t\\theight: 19px;\\n\\t\\ttop: -7px;\\n\\t\\tright: -4px;\\n\\t\\tborder-bottom-left-radius: 8px;\\n\\t\\tpadding-left: 2px;\\n}\\nul.item_wizard_preset_list > li label {\\n\\t\\ttext-align: center;\\n\\t\\twidth: 100%;\\n\\t\\tmargin-top: auto;\\n\\t\\tpointer-events: none;\\n}\\n#item_wizard_wrapper input[type=\"radio\"] {\\n\\t\\tvertical-align: middle;\\n\\t\\tmargin-top: -4px;\\n\\t\\tmargin-right: 6px;\\n}\\n#item_wizard_wrapper input[type=\"range\"] {\\n\\t\\tflex-grow: 1;\\n\\t\\tz-index: 20;\\n}\\n#item_wizard_wrapper .bar.flex label {\\n\\t\\tpadding: 3px 6px;\\n\\t\\tmin-width: 50px;\\n}\\n.item_wizard_model_option {\\n\\t\\tdisplay: inline-block;\\n\\t\\theight: 160px;\\n\\t\\twidth: 240px;\\n\\t\\tmax-width: calc(50% - 20px);\\n\\t\\tmargin-right: 16px;\\n\\t\\tpadding-top: 16px;\\n\\t\\tpadding-left: 15px;\\n\\t\\tfont-size: 1.1em;\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 2px solid transparent;\\n\\t\\tcursor: pointer;\\n\\t\\tbackground-position-x: right;\\n\\t\\tbackground-position-y: bottom;\\n\\t\\tbackground-repeat: no-repeat;\\n}\\n.item_wizard_model_option:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n.item_wizard_model_option.selected {\\n\\t\\tborder-color: var(--color-accent);\\n}\\n.item_wizard_model_option[background=\"third_person_model\"] {\\n\\t\\tbackground-image: url('+p+');\\n}\\n.item_wizard_model_option[background=\"third_person_sprite\"] {\\n\\t\\tbackground-image: url('+u+');\\n}\\n#item_wizard_glint_input {\\n\\t\\tposition: relative;\\n}\\n#item_wizard_glint_input::after {\\n\\t\\tcontent: \"\";\\n\\t\\theight: 30px;\\n\\t\\twidth: 30px;\\n\\t\\tposition: absolute;\\n\\t\\tbackground: linear-gradient(137deg, rgba(149,41,236,0.6) 12%, rgba(174,56,196,0.5) 17%, rgba(100,25,126,0.7) 26%, rgba(175,67,208,0.6) 29%, rgba(106,27,137,0.7) 32%, rgba(123,34,170,0.4) 50%, rgba(177,90,191,0.6) 59%, rgba(99,32,140,0.5) 63%, rgba(130,34,156,0.6) 71%, rgba(187,57,198,0.47) 75%);\\n\\t\\tborder-radius: 4px;\\n\\t\\tright: 19px;\\n\\t\\tanimation: 2s infinite item_wizard_glint_input;\\n\\t\\tanimation-timing-function: ease;\\n\\t\\tmix-blend-mode: lighten;\\n}\\n@keyframes item_wizard_glint_input {\\n0% {\\n\\t\\t\\topacity: 0.5;\\n}\\n50% {\\n\\t\\t\\topacity: 1.0;\\n}\\n100% {\\n\\t\\t\\topacity: 0.5;\\n}\\n}\\n.item_wizard_component_list > li {\\n\\t\\tmargin-bottom: 8px;\\n\\t\\tdisplay: flex;\\n\\t\\tflex-wrap: wrap;\\n}\\n.item_wizard_functionality_options {\\n\\t\\tmargin-left: 14px;\\n\\t\\tmargin-bottom: 32px;\\n\\t\\tborder-left: 3px solid var(--color-back);\\n\\t\\tpadding-left: 18px;\\n\\t\\twidth: 100%;\\n}\\n.item_wizard_component_list > li > label {\\n\\t\\tfont-size: 1.2em;\\n\\t\\tvertical-align: top;\\n\\t\\tflex-shrink: 0;\\n}\\n#minecraft_item_wizard .item_wizard_component_list > li > p.description {\\n\\t\\tmargin-top: 5px;\\n\\t\\tmargin-right: 10px;\\n\\t\\tmargin-left: auto;\\n}\\n#item_wizard_digger_blocks {\\n\\t\\tpadding: 8px 0;\\n}\\n#item_wizard_digger_blocks > li {\\n\\t\\tdisplay: flex;\\n\\t\\talign-items: center;\\n\\t\\tmargin-top: 4px;\\n\\t\\tgap: 5px;\\n}\\n#item_wizard_digger_blocks > li > bb-select {\\n\\t\\twidth: 30%;\\n}\\n#item_wizard_digger_blocks > li > .numeric_input {\\n\\t\\tmax-width: 100px;\\n}\\n#item_wizard_digger_blocks > li > label {\\n\\t\\tmargin-left: auto;\\n}\\n.break_block_animation {\\n\\t\\theight: 48px;\\n\\t\\twidth: 48px;\\n\\t\\tflex-shrink: 0;\\n\\t\\tbackground-color: var(--color-button);\\n\\t\\tbackground-position-y: -128px;\\n\\t\\tbackground-size: 100%;\\n\\t\\tbox-shadow: 1px 1px 2px #00000080;\\n\\t\\ttransform: rotate(5deg);\\n\\t\\tmargin-right: 5px;\\n\\t\\tbackground-image: url('+m+');\\n}\\n@keyframes break_block_animation {\\n0%\\t{background-position-y: 0;}\\n9%\\t{background-position-y: -48px;}\\n18%\\t{background-position-y: -96px;}\\n27%\\t{background-position-y: -144px;}\\n36%\\t{background-position-y: -192px;}\\n45%\\t{background-position-y: -240px;}\\n54%\\t{background-position-y: -288px;}\\n63%\\t{background-position-y: -336px;}\\n70%\\t{background-position-y: -384px;}\\n80%\\t{background-position-y: -432px;}\\n90%\\t{background-position-y: -480px;}\\n99%\\t{background-position-y: -528px;}\\n}\\n#item_durability_markers {\\n\\t\\twidth: calc(100% - 50px);\\n\\t\\tposition: relative;\\n\\t\\theight: 20px;\\n\\t\\tmargin-left: 50px;\\n}\\n#item_durability_markers > li {\\n\\t\\tposition: absolute;\\n\\t\\ttext-align: center;\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tmargin-left: -25px;\\n}\\n#item_durability_markers > li::before {\\n\\t\\tcontent: \"\";\\n\\t\\tdisplay: block;\\n\\t\\tpointer-events: none;\\n\\t\\theight: 12px;\\n\\t\\twidth: 3px;\\n\\t\\tposition: absolute;\\n\\t\\ttop: -13px;\\n\\t\\tright: 0;\\n\\t\\tleft: 0;\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: var(--color-grid);\\n}\\n#item_durability_markers > li:first-child {\\n\\t\\tleft: calc(6% + 1px);\\n}\\n#item_durability_markers > li:nth-child(2) {\\n\\t\\tleft: calc(13.7% + 1px);\\n\\t\\twidth: 50px;\\n}\\n#item_durability_markers > li:nth-child(3) {\\n\\t\\tleft: calc(73.7% + 1px);\\n\\t\\twidth: 50px;\\n}\\n#item_durability_markers > li:last-child {\\n\\t\\tright: calc(3% - 10px);\\n}\\n#item_durability_markers > li:last-child::before {\\n\\t\\tmargin-right: 20px;\\n}\\n#item_fuel_markers {\\n\\t\\twidth: calc(100% - 50px);\\n\\t\\tposition: relative;\\n\\t\\theight: 20px;\\n\\t\\tmargin-left: 50px;\\n}\\n#item_fuel_markers > li {\\n\\t\\tposition: absolute;\\n\\t\\ttext-align: center;\\n\\t\\tcolor: var(--color-subtle_text);\\n\\t\\tmargin-left: -25px;\\n}\\n#item_fuel_markers > li::before {\\n\\t\\tcontent: \"\";\\n\\t\\tdisplay: block;\\n\\t\\tpointer-events: none;\\n\\t\\theight: 12px;\\n\\t\\twidth: 3px;\\n\\t\\tposition: absolute;\\n\\t\\ttop: -13px;\\n\\t\\tright: 0;\\n\\t\\tleft: 0;\\n\\t\\tmargin: auto;\\n\\t\\tbackground-color: var(--color-grid);\\n}\\n#item_fuel_markers > li[item=planks] {\\n\\t\\tleft: calc(2.8% + 7px);\\n}\\n#item_fuel_markers > li[item=coal] {\\n\\t\\tleft: calc(10.4% + 16px);\\n}\\n#item_fuel_markers > li:last-child {\\n\\t\\tright: 8px;\\n}\\n#item_fuel_markers > li:last-child::before {\\n   \\t\\tmargin-right: 0;\\n}\\n#item_wizard_wrapper code.code {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tborder: 1px solid var(--color-border);\\n\\t\\tpadding: 1px;\\n}\\n#item_wizard_launch_vscode img {\\n\\t\\tvertical-align: top;\\n\\t\\tmargin-right: 4px;\\n}\\n\\n',\"\"]);const g=c},338:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,\"\\n#item_wizard_export_options {\\n\\tdisplay: grid;\\n\\tgrid-template-columns: auto auto;\\n\\tgrid-gap: 10px;\\n\\tmin-height: 125px;\\n}\\n.item_wizard_export_option {\\n\\tdisplay: inline-block;\\n\\tborder: 1px solid;\\n\\tborder-bottom: 10px solid;\\n\\tpadding: 12px;\\n\\tbackground-color: var(--color-back);\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n.item_wizard_export_option:hover {\\n\\tbackground-color: var(--color-button);\\n}\\n.item_wizard_export_option:not(.selected) {\\n\\tborder-top-color: transparent !important;\\n\\tborder-left-color: transparent !important;\\n\\tborder-right-color: transparent !important;\\n}\\n.item_wizard_export_option > h3 {\\n\\tmargin: 0;\\n}\\n#item_wizard_pack_list li {\\n\\tdisplay: inline-block;\\n\\twidth: min(100%, 254px);\\n\\toverflow: hidden;\\n\\tpadding: 4px;\\n\\tcursor: pointer;\\n\\tborder-radius: 5px;\\n}\\n#item_wizard_pack_list li:hover {\\n\\tcolor: var(--color-light);\\n}\\n#item_wizard_pack_list li.selected {\\n\\tbackground-color: var(--color-accent);\\n\\tcolor: var(--color-accent_text);\\n}\\n#item_wizard_pack_list li img, #item_wizard_pack_list li div {\\n\\tdisplay: inline-block;\\n\\theight: 32px;\\n\\twidth: 32px;\\n\\tbackground-color: var(--color-back);\\n\\tvertical-align: middle;\\n\\tmargin-right: 2px;\\n}\\n#item_wizard_pack_list li > i {\\n\\tvertical-align: middle;\\n\\tpadding: 5px;\\n\\tmax-width: unset;\\n}\\n\",\"\"]);const r=o},423:(e,t,a)=>{a.d(t,{Z:()=>w});var n=a(645),o=a.n(n),r=a(667),i=a.n(r),l=a(566),s=a(777),d=a(364),c=a(933),p=a(730),u=a(53),m=o()((function(e){return e[1]})),g=i()(l),b=i()(s),h=i()(d),f=i()(c),v=i()(p),_=i()(u);m.push([e.id,'\\n.item_wizard_slider_label {\\n\\tmargin-left: 10px;\\n\\tmargin-top: 10px;\\n\\tdisplay: inline-block;\\n\\tvertical-align: top;\\n\\tcolor: var(--color-subtle_text);\\n}\\n.item_wizard_hud_slider_range {\\n\\twidth: 300px;\\n\\tmax-width: calc(100% - 30px);\\n\\tmin-height: 20px;\\n\\taspect-ratio: 10;\\n\\tbackground-repeat: repeat-x;\\n\\tbackground-size: contain;\\n\\tmargin-top: 5px;\\n\\tdisplay: inline-block;\\n\\tcursor: ew-resize;\\n}\\n.item_wizard_hud_slider_range > div {\\n\\theight: 100%;\\n\\tbackground-repeat: repeat-x;\\n\\tbackground-size: contain;\\n\\tpointer-events: none;\\n}\\n.item_wizard_hud_slider_range:hover > div {\\n\\tfilter: saturate(0.5) brightness(1.75);\\n}\\n.item_wizard_hud_slider[slider_tex=\"health\"] > .item_wizard_hud_slider_range {\\n\\tbackground-image: url('+g+');\\n}\\n.item_wizard_hud_slider[slider_tex=\"health\"] > .item_wizard_hud_slider_range > div {\\n\\tbackground-image: url('+b+');\\n}\\n.item_wizard_hud_slider[slider_tex=\"armor\"] > .item_wizard_hud_slider_range {\\n\\tbackground-image: url('+h+');\\n}\\n.item_wizard_hud_slider[slider_tex=\"armor\"] > .item_wizard_hud_slider_range > div {\\n\\tbackground-image: url('+f+');\\n}\\n.item_wizard_hud_slider[slider_tex=\"hunger\"] > .item_wizard_hud_slider_range {\\n\\tbackground-image: url('+v+');\\n}\\n.item_wizard_hud_slider[slider_tex=\"hunger\"] > .item_wizard_hud_slider_range > div {\\n\\tbackground-image: url('+_+\");\\n}\\n\\n\",\"\"]);const w=m},74:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,\"\\n.item_wizard_icon_picker {\\n\\t\\tdisplay: flex;\\n}\\n.item_wizard_icon_picker label {\\n\\t\\tpadding: 3px;\\n}\\n.item_wizard_icon_picker > .icon_picker_left {\\n\\t\\tbackground-color: var(--color-back);\\n\\t\\tmargin-right: 8px;\\n\\t\\theight: 64px;\\n\\t\\twidth: 64px;\\n}\\n.item_wizard_icon_picker > .icon_picker_right {\\n\\t\\theight: 24px;\\n    \\tcursor: pointer;\\n}\\n.item_wizard_icon_picker > .icon_picker_right label {\\n    \\tcursor: inherit;\\n}\\n.item_wizard_icon_picker > .icon_picker_right:hover {\\n\\t\\tcolor: var(--color-light);\\n}\\n.item_wizard_icon_picker > .icon_picker_right i.icon {\\n\\t\\tvertical-align: text-bottom;\\n}\\n\",\"\"]);const r=o},64:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,\"\\n.item_wizard_suggestion_id_list {\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tmargin-bottom: 20px;\\n\\tmargin-top: 4px;\\n\\tgap: 4px;\\n}\\n\",\"\"]);const r=o},841:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(645),o=a.n(n)()((function(e){return e[1]}));o.push([e.id,\"\\nbb-select[data-v-09e61bde] {\\n\\tmin-width: min(180px, 50%);\\n}\\n\",\"\"]);const r=o},645:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var a=e(t);return t[2]?\"@media \".concat(t[2],\" {\").concat(a,\"}\"):a})).join(\"\")},t.i=function(e,a,n){\"string\"==typeof e&&(e=[[null,e,\"\"]]);var o={};if(n)for(var r=0;r<this.length;r++){var i=this[r][0];null!=i&&(o[i]=!0)}for(var l=0;l<e.length;l++){var s=[].concat(e[l]);n&&o[s[0]]||(a&&(s[2]?s[2]=\"\".concat(a,\" and \").concat(s[2]):s[2]=a),t.push(s))}},t}},667:e=>{e.exports=function(e,t){return t||(t={}),\"string\"!=typeof(e=e&&e.__esModule?e.default:e)?e:(/^['\"].*['\"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/[\"'() \\t\\n]/.test(e)||t.needQuotes?'\"'.concat(e.replace(/\"/g,'\\\\\"').replace(/\\n/g,\"\\\\n\"),'\"'):e)}},379:(e,t,a)=>{var n,o=function(){var e={};return function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(e){a=null}e[t]=a}return e[t]}}(),r=[];function i(e){for(var t=-1,a=0;a<r.length;a++)if(r[a].identifier===e){t=a;break}return t}function l(e,t){for(var a={},n=[],o=0;o<e.length;o++){var l=e[o],s=t.base?l[0]+t.base:l[0],d=a[s]||0,c=\"\".concat(s,\" \").concat(d);a[s]=d+1;var p=i(c),u={css:l[1],media:l[2],sourceMap:l[3]};-1!==p?(r[p].references++,r[p].updater(u)):r.push({identifier:c,updater:b(u,t),references:1}),n.push(c)}return n}function s(e){var t=document.createElement(\"style\"),n=e.attributes||{};if(void 0===n.nonce){var r=a.nc;r&&(n.nonce=r)}if(Object.keys(n).forEach((function(e){t.setAttribute(e,n[e])})),\"function\"==typeof e.insert)e.insert(t);else{var i=o(e.insert||\"head\");if(!i)throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");i.appendChild(t)}return t}var d,c=(d=[],function(e,t){return d[e]=t,d.filter(Boolean).join(\"\\n\")});function p(e,t,a,n){var o=a?\"\":n.media?\"@media \".concat(n.media,\" {\").concat(n.css,\"}\"):n.css;if(e.styleSheet)e.styleSheet.cssText=c(t,o);else{var r=document.createTextNode(o),i=e.childNodes;i[t]&&e.removeChild(i[t]),i.length?e.insertBefore(r,i[t]):e.appendChild(r)}}function u(e,t,a){var n=a.css,o=a.media,r=a.sourceMap;if(o?e.setAttribute(\"media\",o):e.removeAttribute(\"media\"),r&&\"undefined\"!=typeof btoa&&(n+=\"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r)))),\" */\")),e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}var m=null,g=0;function b(e,t){var a,n,o;if(t.singleton){var r=g++;a=m||(m=s(t)),n=p.bind(null,a,r,!1),o=p.bind(null,a,r,!0)}else a=s(t),n=u.bind(null,a,t),o=function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(a)};return n(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;n(e=t)}else o()}}e.exports=function(e,t){(t=t||{}).singleton||\"boolean\"==typeof t.singleton||(t.singleton=(void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n));var a=l(e=e||[],t);return function(e){if(e=e||[],\"[object Array]\"===Object.prototype.toString.call(e)){for(var n=0;n<a.length;n++){var o=i(a[n]);r[o].references--}for(var s=l(e,t),d=0;d<a.length;d++){var c=i(a[d]);0===r[c].references&&(r[c].updater(),r.splice(c,1))}a=s}}}},907:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(729);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},294:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(338);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},557:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(423);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},257:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(74);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},635:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(64);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},90:(e,t,a)=>{a.r(t);var n=a(379),o=a.n(n),r=a(841);o()(r.Z,{insert:\"head\",singleton:!1}),r.Z.locals},351:e=>{e.exports=\"data:image/png;base64,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\"},566:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUUqHewg4pChumhBVMRRqlgEC6Wt0KqDyaVf0KQhSXFxFFwLDn4sVh1cnHV1cBUEwQ8QVxcnRRcp8X9JoUWMB8f9eHfvcfcOEJpVppo9E4CqWUY6ERdz+VUx8IoAgghjDCGJmXoys5iF5/i6h4+vdzGe5X3uz9GvFEwG+ETiOaYbFvEG8cympXPeJ46wsqQQnxOPG3RB4keuyy6/cS45LPDMiJFNzxNHiMVSF8tdzMqGSjxNHFVUjfKFnMsK5y3OarXO2vfkLwwVtJUM12kOI4ElJJGCCBl1VFCFhRitGikm0rQf9/APOf4UuWRyVcDIsYAaVEiOH/wPfndrFqcm3aRQHOh9se2PESCwC7Qatv19bNutE8D/DFxpHX+tCcx+kt7oaNEjILwNXFx3NHkPuNwBBp90yZAcyU9TKBaB9zP6pjwwcAv0rbm9tfdx+gBkqavlG+DgEBgtUfa6x7uD3b39e6bd3w9mQHKiPEu2qwAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+cHCA81E53SsTAAAABHSURBVBjTjY/bCQAxCATHq2b7r2a7yf1E8jKQAUFk0BUGrdfeEzmUBIBt5h6ImIUK23w88CQdmfZTmYlKTKHa3CQt7984hB9I0xt4MKFNVwAAAABJRU5ErkJggg==\"},777:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUUqHewg4pChumhBVMRRqlgEC6Wt0KqDyaVf0KQhSXFxFFwLDn4sVh1cnHV1cBUEwQ8QVxcnRRcp8X9JoUWMB8f9eHfvcfcOEJpVppo9E4CqWUY6ERdz+VUx8IoAgghjDCGJmXoys5iF5/i6h4+vdzGe5X3uz9GvFEwG+ETiOaYbFvEG8cympXPeJ46wsqQQnxOPG3RB4keuyy6/cS45LPDMiJFNzxNHiMVSF8tdzMqGSjxNHFVUjfKFnMsK5y3OarXO2vfkLwwVtJUM12kOI4ElJJGCCBl1VFCFhRitGikm0rQf9/APOf4UuWRyVcDIsYAaVEiOH/wPfndrFqcm3aRQHOh9se2PESCwC7Qatv19bNutE8D/DFxpHX+tCcx+kt7oaNEjILwNXFx3NHkPuNwBBp90yZAcyU9TKBaB9zP6pjwwcAv0rbm9tfdx+gBkqavlG+DgEBgtUfa6x7uD3b39e6bd3w9mQHKiPEu2qwAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+cHCA81LVyzrJsAAABISURBVBjTnY7RCQAgCAXPVnD/MfqylZrBfirCiKgDQZ6nCC+4qruqxx4gjZCcp7wuAkgcRKRWSQDlIGy59T9G2em63YRV5IcGhCAn1Jiiu3sAAAAASUVORK5CYII=\"},730:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOGylRGwuZAAAASUlEQVQY04WPwQ3AMAgDL5nG+0/DNuQDKWqTchIfdLZkePC4DyMFSQCYWf1vaQvJW5yn+gh5lUYkr2RTK3JY6JL8bzFlcS+lsAC9/Bx1Qfp7hgAAAABJRU5ErkJggg==\"},53:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOHDvt4+wWAAAAiUlEQVQY02NgQID/UIwBmGAKrmhpMWySkGDAppAJpoC7PZVBSUiIYUdLBIZCRgYGhv+bJCQYlISEGJ5E6TE8ffmaQVpclMGjZgVMnoGJgYGB0e/FC4ZeoY8Mh89eZWBgYGB4+vI1inUsMBPnH3n6P9GGgSgA8+H/R1dX/cfnY7iG/9/vEFYEUwAA9JAw4z/oGNIAAAAASUVORK5CYII=\"},364:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOACsWI6EvAAAAP0lEQVQY072QMQ4AIAgDD//F63kYDgIhxMHJS1ja0qFw8LhOaQK4qgJgZldt9dcwKpBIVk+jNy8e+BySscvV3wvOE3aCVZoeAAAAAElFTkSuQmCC\"},933:e=>{e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpUVaHKwg4pChOlkQFdFNqlgEC6Wt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQBD9AXF2cFF2kxP8lhRYxHhz34929x907QGhUmGp2jQGqZhnpRFzM5VfEwCsCCCKMGfRLzNSTmYUsPMfXPXx8vYvxLO9zf46wUjAZ4BOJZ5luWMTrxFObls55nzjCypJCfE48atAFiR+5Lrv8xrnksMAzI0Y2PUccIRZLHSx3MCsbKvEkcVRRNcoXci4rnLc4q5Uaa92TvzBU0JYzXKc5hAQWkUQKImTUsIEKLMRo1Ugxkab9uId/0PGnyCWTawOMHPOoQoXk+MH/4He3ZnFi3E0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV1vZXG8D0J+n1thY9Anq3gYvrtibvAZc7wMCTLhmSI/lpCsUi8H5G35QH+m6BnlW3t9Y+Th+ALHW1dAMcHAIjJcpe83h3sLO3f8+0+vsBmpVyt37DapwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnBwgOASHv7XlwAAAAXklEQVQY042QsQ3AIAwEzyhjpU+GTUMHPRMwRNKzACkCloMoOMnN/cuWDB+1jUWdA+r9FEJMmOLPOYCcM4DKEJO6vgnvLxWtiPXS19uwcx47gDgWWCpt4/0ZMvxlmr8RIymlxyLCAAAAAABJRU5ErkJggg==\"},482:e=>{e.exports=\"data:image/png;base64,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\"},766:e=>{e.exports=\"data:image/png;base64,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\"},81:e=>{e.exports=require(\"child_process\")},147:e=>{e.exports=require(\"fs\")},37:e=>{e.exports=require(\"os\")}},t={};function a(n){var o=t[n];if(void 0!==o)return o.exports;var r=t[n]={id:n,exports:{}};return e[n](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.nc=void 0,(()=>{var e=function(){var e=this,t=e._self._c;return t(\"div\",{attrs:{id:\"item_wizard_wrapper\"}},[t(\"h2\",[e._v(e._s(e.pages[e.open_page].label))]),e._v(\" \"),\"preset\"==e.open_page?t(\"div\",{staticClass:\"item_wizard_target_selection\"},[t(\"p\",{staticClass:\"description\"},[e._v(\"Game Variant\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.edition_options},model:{value:e.form.edition,callback:function(t){e.$set(e.form,\"edition\",t)},expression:\"form.edition\"}})],1):e._e(),e._v(\" \"),\"preset\"==e.open_page?t(\"content\",[e._m(0),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Preset\")]),e._v(\" \"),t(\"ul\",{staticClass:\"item_wizard_preset_list\"},e._l(e.presets,(function(a,n){return t(\"li\",{key:n,class:{selected:n==e.form.preset},style:{backgroundImage:e.getThumbnail(a.thumbnail)},on:{click:function(t){return e.selectPreset(n)}}},[t(\"label\",[e._v(e._s(a.name))])])})),0)])]):e._e(),e._v(\" \"),\"metadata\"==e.open_page?t(\"content\",[t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Display Name\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"The display name will be displayed in the UI\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.display_name,expression:\"form.display_name\"}],attrs:{type:\"text\",placeholder:\"Bamboo Sword\"},domProps:{value:e.form.display_name},on:{input:[function(t){t.target.composing||e.$set(e.form,\"display_name\",t.target.value)},function(t){return e.inputDisplayName()}]}})]),e._v(\" \"),t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Identifier\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"The identifier is used internally in the addon to identify this item.\\n\\t\\t\\t\\tAn identifier consists of the namespace and the item name, separated by a colon.\\n\\t\\t\\t\\tThe namespace should be a short and unique version of your name or the name of your addon.\\n\\t\\t\\t\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.identifier,expression:\"form.identifier\"}],attrs:{type:\"text\",placeholder:\"myname:bamboo_sword\"},domProps:{value:e.form.identifier},on:{input:[function(t){t.target.composing||e.$set(e.form,\"identifier\",t.target.value)},function(t){e.has_customized_id=!0}]}}),e._v(\" \"),e.identifier_error?t(\"div\",{attrs:{id:\"item_wizard_id_error\"}},[t(\"i\",{staticClass:\"material-icons\",staticStyle:{color:\"#ff415b\"}},[e._v(\"error\")]),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_tooltip tooltip\"},[e._v(e._s(e.identifier_error))])]):e._e()]),e._v(\" \"),t(\"section\",{staticClass:\"divided_section\"},[t(\"numeric-input\",{attrs:{min:1,max:64,step:1},model:{value:e.form.stack_size,callback:function(t){e.$set(e.form,\"stack_size\",e._n(t))},expression:\"form.stack_size\"}}),e._v(\" \"),e._m(1)],1),e._v(\" \"),t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Creative Category\")]),e._v(\" \"),t(\"div\",{staticClass:\"wizard_columns\"},[t(\"div\",[t(\"p\",{staticClass:\"description\"},[e._v(\"Select the item category in the creative inventory\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.inventory_categories},on:{input:function(t){e.form.item_group=\"none\"}},model:{value:e.form.category,callback:function(t){e.$set(e.form,\"category\",t)},expression:\"form.category\"}})],1),e._v(\" \"),t(\"div\",[\"hidden\"!=e.form.category?t(\"p\",{staticClass:\"description\"},[e._v(\"Optionally select the item group within the category\")]):e._e(),e._v(\" \"),\"hidden\"!=e.form.category?t(\"select-input\",{attrs:{options:e.inventory_groups[e.form.category]},model:{value:e.form.item_group,callback:function(t){e.$set(e.form,\"item_group\",t)},expression:\"form.item_group\"}}):e._e()],1)])])]):e._e(),e._v(\" \"),\"functionality\"==e.open_page?t(\"content\",[t(\"ul\",{staticClass:\"item_wizard_component_list\"},[t(\"li\",{class:{expanded:e.form.melee_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.melee_enabled,expression:\"form.melee_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_melee_enabled\"},domProps:{checked:Array.isArray(e.form.melee_enabled)?e._i(e.form.melee_enabled,null)>-1:e.form.melee_enabled},on:{change:function(t){var a=e.form.melee_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"melee_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"melee_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"melee_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_melee_enabled\"}},[e._v(\"Melee Attack\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Use the weapon to attack mobs\")]),e._v(\" \"),e.form.melee_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[e.form.melee_enabled?t(\"section\",[t(\"section\",[t(\"label\",[e._v(\"Damage\")]),e._v(\" \"),t(\"hud-slider\",{attrs:{slider_tex:\"health\",getLabel:e.getMeleeDamageLabel},model:{value:e.form.melee_damage,callback:function(t){e.$set(e.form,\"melee_damage\",t)},expression:\"form.melee_damage\"}})],1)]):e._e()]):e._e()]),e._v(\" \"),t(\"li\",{class:{expanded:e.form.digger_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.digger_enabled,expression:\"form.digger_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_digger_enabled\"},domProps:{checked:Array.isArray(e.form.digger_enabled)?e._i(e.form.digger_enabled,null)>-1:e.form.digger_enabled},on:{change:function(t){var a=e.form.digger_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"digger_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"digger_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"digger_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_digger_enabled\"}},[e._v(\"Break Blocks\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Use the item to break specific blocks\")]),e._v(\" \"),e.form.digger_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"ul\",{attrs:{id:\"item_wizard_digger_blocks\"},on:{focusout:function(t){return e.clearUnsetDiggerBlocks()}}},e._l(e.form.digger_blocks,(function(a){return t(\"li\",{key:a.uuid},[t(\"select-input\",{attrs:{options:e.digger_block_options},model:{value:a.type,callback:function(t){e.$set(a,\"type\",t)},expression:\"block.type\"}}),e._v(\" \"),\"custom\"==a.type?t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:a.id,expression:\"block.id\"}],staticClass:\"dark_bordered\",attrs:{placeholder:\"gravel\"},domProps:{value:a.id},on:{input:function(t){t.target.composing||e.$set(a,\"id\",t.target.value)}}}):e._e(),e._v(\" \"),t(\"label\",[e._v(\"Speed:\")]),e._v(\" \"),t(\"numeric-input\",{attrs:{min:0,max:50,step:1},model:{value:a.speed,callback:function(t){e.$set(a,\"speed\",e._n(t))},expression:\"block.speed\"}}),e._v(\" \"),t(\"div\",{staticClass:\"break_block_animation\",style:{animation:`break_block_animation ${Math.max(4/a.speed,.25)}s steps(1) infinite`,backgroundImage:a.speed?void 0:\"none\"}}),e._v(\" \"),t(\"div\",{staticClass:\"tool\",attrs:{title:\"Remove\"},on:{click:function(t){return e.form.digger_blocks.remove(a)}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"clear\")])])],1)})),0),e._v(\" \"),t(\"button\",{on:{click:function(t){e.clearUnsetDiggerBlocks(),e.addDiggerBlock()}}},[e._v(\"Add Block\")]),e._v(\" \"),e.form.digger_blocks.length?t(\"p\",{staticClass:\"description\"},[e._v(\"Speed previews are an approximation. Exact breaking speed will depend on the type of block.\")]):e._e()]):e._e()]),e._v(\" \"),e.form.food_enabled||e.form.place_entity_enabled?e._e():t(\"li\",{class:{expanded:e.form.wearable_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.wearable_enabled,expression:\"form.wearable_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_wearable_enabled\"},domProps:{checked:Array.isArray(e.form.wearable_enabled)?e._i(e.form.wearable_enabled,null)>-1:e.form.wearable_enabled},on:{change:function(t){var a=e.form.wearable_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"wearable_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"wearable_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"wearable_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_wearable_enabled\"}},[e._v(\"Wearable\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Wear the item as armor or another wearable\")]),e._v(\" \"),e.form.wearable_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[t(\"label\",[e._v(\"Slot\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select where the item can be equipped\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.wearable_options},model:{value:e.form.wearable_slot,callback:function(t){e.$set(e.form,\"wearable_slot\",t)},expression:\"form.wearable_slot\"}})],1),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Protection\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Set how much protection the item provides\")]),e._v(\" \"),t(\"hud-slider\",{attrs:{slider_tex:\"armor\"},model:{value:e.form.wearable_protection,callback:function(t){e.$set(e.form,\"wearable_protection\",t)},expression:\"form.wearable_protection\"}})],1),e._v(\" \"),e.form.stack_size>1?t(\"p\",{staticClass:\"error_message\"},[e._v(\"Wearable items cannot be stacked. This item will be exported as not stackable even though you entered \"+e._s(e.form.stack_size)+\" as Stack Size on the previous screen.\")]):e._e()]):e._e()]),e._v(\" \"),e.form.wearable_enabled||e.form.digger_enabled||e.form.melee_enabled?t(\"li\",{class:{expanded:e.form.durability_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.durability_enabled,expression:\"form.durability_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_durability_enabled\"},domProps:{checked:Array.isArray(e.form.durability_enabled)?e._i(e.form.durability_enabled,null)>-1:e.form.durability_enabled},on:{change:function(t){var a=e.form.durability_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"durability_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"durability_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"durability_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_durability_enabled\"}},[e._v(\"Durability\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Item loses some durability every time it is used, until it breaks\")]),e._v(\" \"),e.form.durability_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[e._m(2),e._v(\" \"),t(\"div\",{staticClass:\"bar flex\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model.number\",value:e.form.durability_max,expression:\"form.durability_max\",modifiers:{number:!0}}],staticStyle:{\"max-width\":\"54px\"},attrs:{type:\"number\",min:\"0\",max:\"2100\",step:\"1\"},domProps:{value:e.form.durability_max},on:{input:function(t){t.target.composing||e.$set(e.form,\"durability_max\",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.durability_max,expression:\"form.durability_max\"}],attrs:{type:\"range\",min:\"0\",max:\"2100\",step:\"1\"},domProps:{value:e.form.durability_max},on:{__r:function(t){return e.$set(e.form,\"durability_max\",t.target.value)}}})]),e._v(\" \"),e._m(3)]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Repair Item\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select a material that can be used to repair your item\")]),e._v(\" \"),t(\"suggestion-id-list\",{attrs:{placeholder:\"diamond\",data_type:\"item\"},model:{value:e.form.repair_items,callback:function(t){e.$set(e.form,\"repair_items\",t)},expression:\"form.repair_items\"}}),e._v(\" \"),e._m(4),e._v(\" \"),t(\"div\",{staticClass:\"bar flex\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model.number\",value:e.form.repair_amount,expression:\"form.repair_amount\",modifiers:{number:!0}}],staticStyle:{\"max-width\":\"54px\"},attrs:{type:\"number\",min:\"0\",max:\"100\",step:\"1\"},domProps:{value:e.form.repair_amount},on:{input:function(t){t.target.composing||e.$set(e.form,\"repair_amount\",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.repair_amount,expression:\"form.repair_amount\"}],attrs:{type:\"range\",min:\"0\",max:\"100\",step:\"1\"},domProps:{value:e.form.repair_amount},on:{__r:function(t){return e.$set(e.form,\"repair_amount\",t.target.value)}}})])],1)]):e._e()]):e._e(),e._v(\" \"),e.form.melee_enabled||e.form.digger_enabled||e.form.wearable_enabled?t(\"li\",{class:{expanded:e.form.enchantable_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.enchantable_enabled,expression:\"form.enchantable_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_enchantable_enabled\"},domProps:{checked:Array.isArray(e.form.enchantable_enabled)?e._i(e.form.enchantable_enabled,null)>-1:e.form.enchantable_enabled},on:{change:function(t){var a=e.form.enchantable_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"enchantable_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"enchantable_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"enchantable_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_enchantable_enabled\"}},[e._v(\"Enchantable\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Allow players to enchant the item in an enchanting table\")]),e._v(\" \"),e.form.enchantable_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[t(\"label\",[e._v(\"Slot\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select which types of enchantment to allow on the item\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.enchantable_slot_options},model:{value:e.form.enchantable_slot,callback:function(t){e.$set(e.form,\"enchantable_slot\",t)},expression:\"form.enchantable_slot\"}})],1),e._v(\" \"),t(\"section\",[e._m(5),e._v(\" \"),t(\"div\",{staticClass:\"bar flex\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model.number\",value:e.form.enchantable_value,expression:\"form.enchantable_value\",modifiers:{number:!0}}],staticStyle:{\"max-width\":\"54px\"},attrs:{type:\"number\",min:\"0\",max:\"50\",step:\"1\"},domProps:{value:e.form.enchantable_value},on:{input:function(t){t.target.composing||e.$set(e.form,\"enchantable_value\",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.enchantable_value,expression:\"form.enchantable_value\"}],attrs:{type:\"range\",min:\"0\",max:\"50\",step:\"1\"},domProps:{value:e.form.enchantable_value},on:{__r:function(t){return e.$set(e.form,\"enchantable_value\",t.target.value)}}})])])]):e._e()]):e._e(),e._v(\" \"),e.form.wearable_enabled||e.form.place_entity_enabled?e._e():t(\"li\",{class:{expanded:e.form.food_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.food_enabled,expression:\"form.food_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_food_enabled\"},domProps:{checked:Array.isArray(e.form.food_enabled)?e._i(e.form.food_enabled,null)>-1:e.form.food_enabled},on:{change:function(t){var a=e.form.food_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"food_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"food_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"food_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_food_enabled\"}},[e._v(\"Food\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Allow players to eat the item\")]),e._v(\" \"),e.form.food_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[t(\"label\",[e._v(\"Food Type\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select a type of food to determine the sound and animation\")]),e._v(\" \"),t(\"select-input\",{attrs:{options:e.food_animation_options},model:{value:e.form.food_animation,callback:function(t){e.$set(e.form,\"food_animation\",t)},expression:\"form.food_animation\"}})],1),e._v(\" \"),t(\"section\",{staticClass:\"divided_section\"},[t(\"numeric-input\",{attrs:{min:.1,max:1.6,step:.1},model:{value:e.form.food_duration,callback:function(t){e.$set(e.form,\"food_duration\",e._n(t))},expression:\"form.food_duration\"}}),e._v(\" \"),e._m(6)],1),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Nutrition\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select how much eating the item can fill up the hunger bar\")]),e._v(\" \"),t(\"hud-slider\",{attrs:{slider_tex:\"hunger\"},model:{value:e.form.food_nutrition,callback:function(t){e.$set(e.form,\"food_nutrition\",t)},expression:\"form.food_nutrition\"}})],1),e._v(\" \"),t(\"section\",{staticClass:\"divided_section\"},[t(\"numeric-input\",{attrs:{min:0,max:5,step:.1},model:{value:e.form.food_saturation_modifier,callback:function(t){e.$set(e.form,\"food_saturation_modifier\",e._n(t))},expression:\"form.food_saturation_modifier\"}}),e._v(\" \"),e._m(7)],1),e._v(\" \"),t(\"section\",{staticClass:\"divided_section\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.food_always_eat,expression:\"form.food_always_eat\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.food_always_eat)?e._i(e.form.food_always_eat,null)>-1:e.form.food_always_eat},on:{change:function(t){var a=e.form.food_always_eat,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"food_always_eat\",a.concat([null])):r>-1&&e.$set(e.form,\"food_always_eat\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"food_always_eat\",o)}}}),e._v(\" \"),e._m(8)])]):e._e()]),e._v(\" \"),t(\"li\",{class:{expanded:e.form.fuel_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.fuel_enabled,expression:\"form.fuel_enabled\"}],attrs:{id:\"item_wizard_fuel_enabled\",type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.fuel_enabled)?e._i(e.form.fuel_enabled,null)>-1:e.form.fuel_enabled},on:{change:function(t){var a=e.form.fuel_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"fuel_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"fuel_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"fuel_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_fuel_enabled\"}},[e._v(\"Furnace Fuel\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Allow the item to be used as fuel in a furnace\")]),e._v(\" \"),e.form.fuel_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[e._m(9),e._v(\" \"),t(\"div\",{staticClass:\"bar flex\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model.number\",value:e.form.fuel_duration,expression:\"form.fuel_duration\",modifiers:{number:!0}}],staticStyle:{\"max-width\":\"50px\"},attrs:{type:\"number\",min:\"0\",max:\"80\",step:\"0.5\"},domProps:{value:e.form.fuel_duration},on:{input:function(t){t.target.composing||e.$set(e.form,\"fuel_duration\",e._n(t.target.value))},blur:function(t){return e.$forceUpdate()}}}),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.fuel_duration,expression:\"form.fuel_duration\"}],attrs:{type:\"range\",min:\"0\",max:\"80\",step:\"0.5\"},domProps:{value:e.form.fuel_duration},on:{__r:function(t){return e.$set(e.form,\"fuel_duration\",t.target.value)}}})]),e._v(\" \"),e._m(10)])]):e._e()]),e._v(\" \"),e.form.food_enabled||e.form.wearable_enabled?e._e():t(\"li\",{class:{expanded:e.form.place_entity_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.place_entity_enabled,expression:\"form.place_entity_enabled\"}],attrs:{id:\"item_wizard_place_entity_enabled\",type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.place_entity_enabled)?e._i(e.form.place_entity_enabled,null)>-1:e.form.place_entity_enabled},on:{change:function(t){var a=e.form.place_entity_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"place_entity_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"place_entity_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"place_entity_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_place_entity_enabled\"}},[e._v(\"Place Entity\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Place an entity on the ground when using the item\")]),e._v(\" \"),e.form.place_entity_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Entity ID\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"}),e._v(\" \"),t(\"suggestion-id-list\",{attrs:{placeholder:\"zombie\",data_type:\"entity\",multiple:!1},model:{value:e.form.place_entity_id,callback:function(t){e.$set(e.form,\"place_entity_id\",t)},expression:\"form.place_entity_id\"}})],1)]):e._e()]),e._v(\" \"),e.form.food_enabled?t(\"li\",{class:{expanded:e.form.cooldown_enabled}},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.cooldown_enabled,expression:\"form.cooldown_enabled\"}],attrs:{type:\"checkbox\",id:\"item_wizard_cooldown_enabled\"},domProps:{checked:Array.isArray(e.form.cooldown_enabled)?e._i(e.form.cooldown_enabled,null)>-1:e.form.cooldown_enabled},on:{change:function(t){var a=e.form.cooldown_enabled,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"cooldown_enabled\",a.concat([null])):r>-1&&e.$set(e.form,\"cooldown_enabled\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"cooldown_enabled\",o)}}}),e._v(\" \"),t(\"label\",{attrs:{for:\"item_wizard_cooldown_enabled\"}},[e._v(\"Cooldown\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Enable a cooldown after using the item\")]),e._v(\" \"),e.form.cooldown_enabled?t(\"div\",{staticClass:\"item_wizard_functionality_options\"},[t(\"section\",{staticClass:\"divided_section\"},[t(\"numeric-input\",{attrs:{min:0,max:60,step:.1},model:{value:e.form.cooldown_duration,callback:function(t){e.$set(e.form,\"cooldown_duration\",e._n(t))},expression:\"form.cooldown_duration\"}}),e._v(\" \"),e._m(11)],1),e._v(\" \"),t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Category\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Assign the cooldown to a category. You can enter your own category name, and if you have multiple items with the same category they will share the same cooldown.\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.cooldown_category,expression:\"form.cooldown_category\"}],attrs:{type:\"text\",placeholder:\"\"},domProps:{value:e.form.cooldown_category},on:{input:function(t){t.target.composing||e.$set(e.form,\"cooldown_category\",t.target.value)}}})])]):e._e()]):e._e()])]):e._e(),e._v(\" \"),\"design\"==e.open_page?t(\"content\",[t(\"section\",[t(\"label\",[e._v(\"Handheld Item Model\")]),e._v(\" \"),e.form.wearable_enabled?t(\"p\",{staticClass:\"description\"},[e._v(\"Not available for wearable items. Wearable items always use a 3D model when equipped, and a flat icon in hand.\")]):[t(\"p\",{staticClass:\"description\"},[e._v(\"Do you want to create a handheld model for your item, or just use the 2D icon? In the inventory and on the ground it will use the icon either way.\")]),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_model_option\",class:{selected:!e.form.attachable_model},attrs:{background:\"third_person_model\"},on:{click:function(t){e.form.attachable_model=!1}}},[e._v(\"\\n\\t\\t\\t\\t\\tIcon\\n\\t\\t\\t\\t\")]),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_model_option\",class:{selected:e.form.attachable_model},attrs:{background:\"third_person_sprite\"},on:{click:function(t){e.form.attachable_model=!0}}},[e._v(\"\\n\\t\\t\\t\\t\\tIcon + 3D Model\\n\\t\\t\\t\\t\")])]],2),e._v(\" \"),e.form.attachable_model&&!e.form.wearable_enabled&&e.current_tab_model?t(\"section\",{staticClass:\"divided_section\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.use_current_model,expression:\"form.use_current_model\"}],attrs:{type:\"checkbox\"},domProps:{checked:Array.isArray(e.form.use_current_model)?e._i(e.form.use_current_model,null)>-1:e.form.use_current_model},on:{change:function(t){var a=e.form.use_current_model,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"use_current_model\",a.concat([null])):r>-1&&e.$set(e.form,\"use_current_model\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"use_current_model\",o)}}}),e._v(\" \"),t(\"div\",[t(\"label\",[e._v('Use current model \"'+e._s(e.current_tab_model)+'\"')])])]):e._e(),e._v(\" \"),t(\"section\",{staticClass:\"divided_section\"},[t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.glint,expression:\"form.glint\"}],attrs:{type:\"checkbox\",id:\"item_wizard_glint_input\"},domProps:{checked:Array.isArray(e.form.glint)?e._i(e.form.glint,null)>-1:e.form.glint},on:{change:function(t){var a=e.form.glint,n=t.target,o=!!n.checked;if(Array.isArray(a)){var r=e._i(a,null);n.checked?r<0&&e.$set(e.form,\"glint\",a.concat([null])):r>-1&&e.$set(e.form,\"glint\",a.slice(0,r).concat(a.slice(r+1)))}else e.$set(e.form,\"glint\",o)}}}),e._v(\" \"),e._m(12)])]):e._e(),e._v(\" \"),\"export\"==e.open_page?t(\"content\",{attrs:{id:\"item_wizard_export_page\"}},[t(\"export\",{attrs:{form:e.form}})],1):e._e(),e._v(\" \"),\"next_steps\"==e.open_page?t(\"content\",[t(\"section\",[t(\"label\",[e._v(\"The add-on has now been exported to your selected destination. Enable the packs to test them.\")]),e._v(\" \"),t(\"button\",{staticStyle:{\"margin-top\":\"8px\",\"margin-bottom\":\"24px\",display:\"block\"},on:{click:function(t){return e.openInstallInstructions(e.form.export_mode)}}},[t(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"help\")]),e._v(\"How do I install packs?\")]),e._v(\" \"),\"none\"==e.form.spawn_egg_mode?t(\"p\",[e._v(\"Now you can give yourself the item using the command \"),t(\"code\",{staticClass:\"code\",on:{click:function(t){return e.copyGiveCommand()}}},[e._v(\"/give @s \"+e._s(e.form.identifier))])]):t(\"p\",[e._v(\"Now you can find the item in the creative inventory!\")])]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Let's now edit the item icon\"+e._s(e.form.attachable_model?\" and model\":\"\")+\"!\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"After you close this dialog, you will be able to edit the icon texture\"+e._s(e.form.attachable_model?\" and model\":\"\")+\" in Blockbench\")]),e._v(\" \"),\"mcaddon\"!=e.form.export_mode&&\"integrate_mcaddon\"!=e.form.export_mode?t(\"button\",{attrs:{id:\"item_wizard_launch_vscode\"},on:{click:function(t){return e.VSCode.open(e.behavior_pack_path,e.resource_pack_path)}}},[t(\"img\",{attrs:{src:e.VSCode.icon,width:\"22px\"}}),e._v(\"\\n\\t\\t\\t\\tOpen in VS Code\\n\\t\\t\\t\")]):t(\"label\",[t(\"i\",{staticClass:\"material-icons\",staticStyle:{\"vertical-align\":\"sub\",margin:\"4px\"}},[e._v(\"info\")]),e._v(\"You can always re-export the MCAddon via \"),t(\"b\",[e._v(\"File\")]),e._v(\" > \"),t(\"b\",[e._v(\"Export\")]),e._v(\" > \"),t(\"b\",[e._v(\"Export MCAddon\")]),e._v(\".\")])]),e._v(\" \"),e._m(13)]):e._e()])};e._withStripped=!0;const t=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAhElEQVQ4y9WSwQnAIBAEbcpefFmEJViNJdmNYQ82OeVUzCdkYfEgzhhinPtNYowNfQWhpRRpSqkdQbXWrqZkBy0lgJAdxDKYRcJTVxIdgmC8949glIxQzllAFLMpoMSCWL33FtDID7gC8QygwPoWKLFeV0MdOF4lJVhDCHto9hMdQZ/nAqzufev6TWmcAAAAAElFTkSuQmCC\",n=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":16,\"texture_height\":16},\"bones\":[{\"name\":\"root_item\",\"pivot\":[0,0,0],\"binding\":\"q.item_slot_to_bone_name(c.item_slot)\",\"cubes\":[{\"origin\":[-2.5,0,-1.5],\"size\":[5,11,3],\"uv\":[0,0]}]}]}]}'),o=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAq0lEQVQ4y2NgoAco1WD6T7bmOnO+/yEqnP/pa/scAfH/IAzSDLIdRBNlEEjTFmG5//+nzQXTIM0gsbviqmA+XoPgmmW0//+PywQbAscgPlAcryEoBmDBIFcgG4LTAJhCZBqGYfwQTr7/WEMbZADMEJi/YXyY64gyABkjGwTzAlYDsLkCm0E4NcMMgIUFNu+A5PAaAAIgBTBDYAmKaM3IhsDiG5wagXyiNZMKANOS2s9rfvFXAAAAAElFTkSuQmCC\",r=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.apple\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root_item\",\"pivot\":[0,0,0],\"binding\":\"q.item_slot_to_bone_name(c.item_slot)\",\"cubes\":[{\"origin\":[-2.5,0,-2.5],\"size\":[5,5,5],\"uv\":[0,0]},{\"origin\":[-2.5,5,0],\"size\":[5,3,0],\"pivot\":[0,0,0],\"rotation\":[0,45,0],\"uv\":[0,10]}]}]}]}'),i=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAi0lEQVQ4y2NgIAO4uLj8h2GyNMOAhITEf7I079u3j3QDqKb5xo0bNNKMLVRBfJAmomwGKc7OzoYbQpJmZEOmTZsGVgzSBGKT5GeYASAMcg3JAYbuFZI1e5qJ/s/wkwNrhAUq0YaANHemq//XkOMGawBphBlEMPRBGGQzTDMygBlE0M8k+xfdBnINAAA+k7meeyM0+AAAAABJRU5ErkJggg==\",l=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root_item\",\"pivot\":[0,0,0],\"binding\":\"q.item_slot_to_bone_name(c.item_slot)\",\"cubes\":[{\"origin\":[-1,-1,-1],\"size\":[2,4,2],\"uv\":[0,18]},{\"origin\":[-1,3,-4],\"size\":[2,1,8],\"uv\":[0,8]},{\"origin\":[0,4,-2],\"size\":[0,16,4],\"uv\":[0,-4]}]}]}]}'),s=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACCSURBVDjLY2AYtMDFxeU/OiZJMwjcuHHj/8GDB8EYxAaJe5qJ/s/wk/tPlCESEhJwDDOoM139v4Yc93+SvQSyGeYikIEkawY5G2QzzDtEGwLSjOxsmHeIMgDZZpgY0Qag24xsAEEvYLMZ2QAQwGkALpvRDSHZZpJDm2QA0ki2ZkoAAHM7haFaNxXaAAAAAElFTkSuQmCC\",d=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root_item\",\"pivot\":[0,0,0],\"binding\":\"q.item_slot_to_bone_name(c.item_slot)\",\"cubes\":[{\"origin\":[-1,-1,-1],\"size\":[2,20,2],\"uv\":[0,6]},{\"origin\":[0,13,-8],\"size\":[0,5,16],\"uv\":[0,-16]}]}]}]}'),c=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZElEQVQ4y+2Q0QnAMAhEXcMhnMx9HMkZso3lPg7aNBBp/0oPjkDwPUlEvhkzq1XbcERUZl7q7qWq1YLHGIXgpAD3WwkEGAY4w2xLgJ7fDgjb2wJCc18LWn/ALY8ElKyGKJE/txyvKqD/7THp6gAAAABJRU5ErkJggg==\",p=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":2,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"root_item\",\"pivot\":[0,0,0]},{\"name\":\"helmet\",\"parent\":\"root_item\",\"pivot\":[0,0,0],\"binding\":\"\\'head\\'\",\"cubes\":[{\"origin\":[-4,0,-4],\"size\":[8,8,8],\"inflate\":1,\"uv\":[0,0]}]}]}]}'),u=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACOSURBVDhPzZHRCcAgEENdwyGczH0cyRncxvI+Imq9coV+NBBQ7yWIhvALpZT67lcMG9Ra67VWs8Bk2GiASykLwJqzmbkVaIABVaLwPD8W5JwHqKvKcxAGdimIMXbMwArKMOJHwVz0FMbHoMQQyCrg+q4Cy66C04sr7CrQb5ysB9xzi6wSV1jSN+3euU90AR6gYrV/vkWqAAAAAElFTkSuQmCC\",m=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,14,0]},{\"name\":\"chestplate\",\"parent\":\"body\",\"pivot\":[0,0,0],\"binding\":\"\\'body\\'\",\"cubes\":[{\"origin\":[-4,2,-2],\"size\":[8,12,4],\"inflate\":1.01,\"uv\":[0,0]}]},{\"name\":\"arm_right\",\"pivot\":[-5,12,0]},{\"name\":\"arm_plate_right\",\"parent\":\"arm_right\",\"pivot\":[-5,12,0],\"binding\":\"\\'rightarm\\'\",\"cubes\":[{\"origin\":[-8,2,-2],\"size\":[4,12,4],\"inflate\":1,\"uv\":[0,16]}]},{\"name\":\"arm_left\",\"pivot\":[5,12,0]},{\"name\":\"arm_plate_left\",\"parent\":\"arm_left\",\"pivot\":[5,12,0],\"binding\":\"\\'leftarm\\'\",\"cubes\":[{\"origin\":[4,2,-2],\"size\":[4,12,4],\"inflate\":1,\"uv\":[0,16],\"mirror\":true}]}]}]}'),g=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABzSURBVDjLzZKBCQAhCEVboyGcrH0cqRncxsODDxJ6dgcHCR/k83uV1dpxRUSaqfeu5WIRUZT1pjnnrTHGMwQAv8iLmfcACEOfARY22dG3AdjNB61/BViDmf8PAINbrxD5KWB9bwDKf4CJR4DIDwFelX9GXVFQ5+tlirbMAAAAAElFTkSuQmCC\",b=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":3.5,\"visible_bounds_offset\":[0,1.25,0]},\"bones\":[{\"name\":\"body\",\"pivot\":[0,24,0]},{\"name\":\"belt\",\"parent\":\"body\",\"pivot\":[0,12,0],\"binding\":\"\\'belt\\'\",\"cubes\":[{\"origin\":[-4,12,-2],\"size\":[8,12,4],\"inflate\":0.51,\"uv\":[0,0]}]},{\"name\":\"leg_right\",\"pivot\":[-1.9,12,0]},{\"name\":\"leggings_right\",\"parent\":\"leg_right\",\"pivot\":[-1.9,12,0],\"binding\":\"\\'rightleg\\'\",\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"inflate\":0.5,\"uv\":[0,16]}]},{\"name\":\"leg_left\",\"pivot\":[1.9,12,0]},{\"name\":\"leggings_left\",\"parent\":\"leg_left\",\"pivot\":[1.9,12,0],\"binding\":\"\\'leftleg\\'\",\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"inflate\":0.5,\"uv\":[0,16],\"mirror\":true}]}]}]}'),h=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAABuSURBVDjL3ZDBDcAgCEVdgyGYjH0YiRnchuYfSKhFq8f2Jx78Pp4Jrf0vzOxxVt10GOm9OxH5W18KAFUCdGa2JxhB9Oi2BBV4LFDVc0GGKgG66q0cFpGHAN1UEj/k4QzEfWRugoBWS8rMcpnfygVA+r/XisE2BgAAAABJRU5ErkJggg==\",f=JSON.parse('{\"a\":[{\"description\":{\"identifier\":\"geometry.unknown\",\"texture_width\":32,\"texture_height\":32,\"visible_bounds_width\":3,\"visible_bounds_height\":2.5,\"visible_bounds_offset\":[0,0.75,0]},\"bones\":[{\"name\":\"leg_right\",\"pivot\":[-1.9,12,0]},{\"name\":\"boot_right\",\"parent\":\"leg_right\",\"pivot\":[-1.9,12,0],\"binding\":\"\\'rightleg\\'\",\"cubes\":[{\"origin\":[-3.9,0,-2],\"size\":[4,12,4],\"inflate\":1,\"uv\":[0,0]}]},{\"name\":\"leg_left\",\"pivot\":[1.9,12,0],\"rotation\":[-0.1,0,0]},{\"name\":\"boot_left\",\"parent\":\"leg_left\",\"pivot\":[1.9,12,0],\"binding\":\"\\'leftleg\\'\",\"cubes\":[{\"origin\":[-0.1,0,-2],\"size\":[4,12,4],\"inflate\":1,\"uv\":[0,0],\"mirror\":true}]}]}]}');let v={first_person_hold:{loop:!0,bones:{root_item:{rotation:[90,56,-32],position:[9,18,5]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[25,0,0],position:[.5,19,-2.5],scale:.85}}}};const _={};_.iron_ingot={name:\"Iron Ingot\",category:\"items\",item_group:\"none\",thumbnail:t,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWklEQVQ4jWNkQAI3btz4z4AGVq1ahS7EUFdXxwhjM2HIkggoNoBx/vz5cGdbWlpiKDh+/DgDPvmB98IwMIDl8ePHcA62UCZoACEFhCxgwaWYkGEwMPCBOPAAAJiRGaIDkbcPAAAAAElFTkSuQmCC\",icon:t,model:n.a[0],animations:v,stack_size:64,enchantable_enabled:!0,durability_enabled:!1,durability_max:0},_.apple={name:\"Apple\",category:\"nature\",item_group:\"itemGroup.name.crop\",thumbnail:o,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA3ElEQVRYhWNkwALuiqv+Z2BgYBC30oOLvTx2CUOd8svbjNj0kwKYsAnCLH557BLDy2OXGLhdvSi1hzQHwMD1Pz9pZjFRDtBkYUeJBloAFmyCL49dYlCqr4Dzv+7eRjMHMH4JDP6PbDEDAwNBX2NTBxMjNWGyIGvGZgkMiFvpEaWOVIA3DdADoKQBWKoXR+MzMDAwMEB9SlCMRMB4V1z1P7oBmizsZBvq8/YRaYWTWo7Sf5tGi/+EVdIGMImJijG8ev0K7piBcsjAWj4KRsEoGAWjYBSMglEwCgYSAABKK1C75y3FWgAAAABJRU5ErkJggg==\",icon:o,model:r.a[0],animations:v,stack_size:64,enchantable_enabled:!0,durability_enabled:!1,durability_max:0,food_enabled:!0,food_nutrition:4,food_saturation_modifier:.6,food_duration:1.6,food_animation:\"eat\"},_.sword={name:\"Sword\",category:\"equipment\",thumbnail:i,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAoklEQVRYhWNgYGBg+Pjx4/+rV6/+ZxgAwDQQlqI44OPHj3Cfb966je6hwMTAwMDw5MkTetuL6oCBBKMOGHAHsBBSEBIdg5Iz1ixdwkhNBwx4CIw6YNQBLE+ePGG49+DhgDlgwEOAET2fUwqoXU7QHMBdOyfTFCUkUqafpotPBj4NtARo4U0DNRuu0TQkWCQkuWlpPkEw4FEw4A4YBaNgFIwCAKyCJqI/12atAAAAAElFTkSuQmCC\",icon:i,model:l.a[0],animations:{first_person_hold:{loop:!0,bones:{root_item:{rotation:[66,60,-60],position:[3,23,4]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[90,0,0],position:[.5,22.5,-.5]}}}},category:\"equipment\",item_group:\"itemGroup.name.sword\",stack_size:1,melee_enabled:!0,melee_damage:7,enchantable_enabled:!0,enchantable_slot:\"sword\",enchantable_value:14,durability_enabled:!0,durability_max:251,repair_items:\"iron_ingot\",repair_amount:25},_.pickaxe={name:\"Pickaxe\",category:\"equipment\",item_group:\"itemGroup.name.pickaxe\",thumbnail:s,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAtElEQVRYhWNkoCL4+PHjf2LU8fPzM8LYLNS0+MmTJySp5+fnZ2QkpJgYw5AtvvfgIV71SgrycLaMjAx1QgBmsa+3F1Ee2rx1238lBXmiQwwvuHr1KlHxTm29VAPwIGsJ0EJxTc2GaxSnD2IAEz0swQcY0X2ODmgdEoyECg/kQoMWgIUqWYESBxAqOGjugJdb6gfUAQOeC0YdMOqAUQeMOmDUAaMOGHAHsLx4/nWg3TAKRjgAAJW4P1/jZu7xAAAAAElFTkSuQmCC\",icon:s,model:d.a[0],animations:{first_person_hold:{loop:!0,bones:{root_item:{rotation:[66,60,-60],position:[3,23,4]}}},third_person_hold:{loop:!0,bones:{root_item:{rotation:[90,0,0],position:[.5,22.5,-.5]}}}},stack_size:1,melee_enabled:!0,melee_damage:3,digger_enabled:!0,digger_blocks:[{type:\"stone\",id:\"\",speed:7},{type:\"metal\",id:\"\",speed:7}],enchantable_enabled:!0,enchantable_slot:\"pickaxe\",enchantable_value:14,durability_enabled:!0,durability_max:251,repair_items:\"iron_ingot\",repair_amount:25},_.helmet={name:\"Helmet\",thumbnail:c,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABqUlEQVRYhe2Vv4qDQBCHvxxbCCuk0Mp0yXMkRSrzxJaCvkHKQEoFQYuFDCgEvOLYPfX+CV46v8odZ3Zmd+e3u+EPsizrRQQArbWzW9vlctn8NcdvqDlOcRwDUJYlAI/HA4Cqqpbknl8AQJqmBEHgxp7nLU4+qwARoSxLgiCgaRpnHxbz0gKm7HY7922PZAlvc5zsmQ/xfX/UlC8rwCbxPM9tu+/7wKcSljDrCKqqYijF/+h+yybLsh5gqnUR+XaLf7oThnHT/9P4oa8COB6PlGU5Ouu2bTHGICLEccztdqNtW7bbLQBN09B1HVproigaydL3faIoIs9z7Pzw0bR1XTvfqqpQVmZ1XTuZBUFAGIauy/M8R0TY7/cUReESd12HiHA4HL7ET1d7vV5d4fCpJgWMgpVSGGNccq01p9NpA9D3fV8Uhbt+kyTp7eRaa5RSPJ/P0X1hFzi02R0WEZTWGmMMXdcBcD6ff7zb0zQdjb97B2xRxhi01ogIdV2PdgYgDEOMMSx6SOZgHzPbJ1bC9/sdEXl9AZYkSfph9y99RVdWVlZWVlZW/o1359T3PpGTRGcAAAAASUVORK5CYII=\",icon:c,model:p.a[0],category:\"equipment\",item_group:\"itemGroup.name.helmet\",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:\"slot.armor.head\",wearable_protection:2,enchantable_enabled:!0,enchantable_slot:\"armor_head\",enchantable_value:9,durability_enabled:!0,durability_max:165,repair_items:\"iron_ingot\",repair_amount:25},_.chestplate={name:\"Chestplate\",thumbnail:u,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB8ElEQVRYhe2VsY7qMBBFDygSkZLOBRLpkp4/MDV8sXt/Qjr4ACQkp0CKJVNlC974mSxseGK3WD1uQyZzmZlrT2bgjf8dM2vtAOC9B6AoCgA2m80sJQpP8C/8sS/FHEBrTV3XMVjTNDcBjDHDcrmMf7rHN8YM1trBWjsYYwatdSzyK2Tee47HIyGEqGy1WsXEANvtlsPhEP0pH4j8vu8BKMuStm0nkwNkRVHgnIvBRVXf99R1TVmWN8nHfIEkB3DO0XUdRVFMnkIGkOc58Pc+U4Xym+d59H/FB+i6jqqqOJ1O0yfgvSeEQNd1ZFmG956+72OSMcZ8UZ/yq6qKz7vd7mED3pyAUorz+RwdqaJU9ZgvBaXqAZRSzzVhURRR0eVyQew0aQiBEELsgZQ/Lk4pFd/JFU2ewPl8jslFhVLqkzLxj/nCE/VpIVO4ez/GmGGxWMQgovbRfd4bZt77yft/WIAUkdrPBPuV+KQqHcHPHuMrmN97qbWmaZqnuvjbC5BZv9/vfzw5/PkMx5BFIt/5T2JmrR3SJTTe8/fs9PnVHpnDdd02TRMTrddrtNbRFr8klx75DmRw3WbOuZhA7l/s8W5v2/ZmMr6Cufc+7neZYEopnHPRlhGb7vdnl80U4i5Ig6VbEa7NmL4b8994441fjQ97WHQdH4ICkQAAAABJRU5ErkJggg==\",icon:u,model:m.a[0],category:\"equipment\",item_group:\"itemGroup.name.chestplate\",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:\"slot.armor.chest\",wearable_protection:6,enchantable_enabled:!0,enchantable_slot:\"armor_torso\",enchantable_value:9,durability_enabled:!0,durability_max:240,repair_items:\"iron_ingot\",repair_amount:25},_.leggings={name:\"Leggings\",thumbnail:g,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABg0lEQVRYhe2VsY6DMAyG/0MMkTxkz5j3oHtfu4/RIaMlJJZKWMp2N9lnOKDoqNqFbykmrv07OA5wcnJycvJhvm632zcAiAgAgIiwZhPR5Nevz32U6/X6tSWgBYCu63C/39H3PdQGAGbGOI7m3Pc9iMj8SykT//l/NN6mABGxYKqemTEMgwUEgJSSVbjXfw8tEaGUgpQSmBlEhHEcLZAPpgnV//F4AACGYVj0959icwe8chFBrdUSaIVz5u+W/H1/rPGnQXxTEhEul8tmEx2lWXrZdR1yzru28OUCfFO+g8UdeFdywA0iYH34rK0BzwfNMxoNFmO0BDFGswEgxoiUkiX3a0dpfKNpghACQgh27tUWEbO9oCO0WrGic0CfichsP+dDCDaIjtBoMK1Qq9KpqIQQTESt1UQdFqCj1QdkZuScAfw22/xkLE3Hfwkgosk9ICLIOaOUMtkRP5iY2S6nwwL0wV84Wq2/7WqtJmbvTbeHFph+b1+1RxtOTwIRveQUnHycH2QAMyShVMeWAAAAAElFTkSuQmCC\",icon:g,model:b.a[0],category:\"equipment\",item_group:\"itemGroup.name.leggings\",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:\"slot.armor.legs\",wearable_protection:5,enchantable_enabled:!0,enchantable_slot:\"armor_legs\",enchantable_value:9,durability_enabled:!0,durability_max:225,repair_items:\"iron_ingot\",repair_amount:25},_.boots={name:\"Boots\",thumbnail:h,texture:\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA6ElEQVRYhe2UPQ6DMAyFH6iDJXsLW0YOwAlg5sY5BysSI2PGSN7oUCWiqBKqoFP9TXmOE9v5cYUTpmnaYowAAOccuq6rztZ8Q33mQERwzt0Z87sERAREBO/9TxJ4nDksywIASCmBmX+ShGH8N1UIYQNQvlhKCUd9HO9twzBc6ow1M2McR7RtW4x7zczo+/7jfE72Cg8AmOcZqloCZp0rzTpXv9dXqVNKWNcVRFQqUlXEGEtAVQURlUXZ/w5qZob3HiJSKmqa5q33ExFEBMDrhLL/HVdQhRC2Tw/wuPnRdtcjNAzDMAzDeAJ4RWqZHRgaOQAAAABJRU5ErkJggg==\",icon:h,model:f.a[0],category:\"equipment\",item_group:\"itemGroup.name.boots\",stack_size:1,attachable_model:!0,wearable_enabled:!0,wearable_slot:\"slot.armor.feet\",wearable_protection:2,enchantable_enabled:!0,enchantable_slot:\"armor_feet\",enchantable_value:9,durability_enabled:!0,durability_max:195,repair_items:\"iron_ingot\",repair_amount:25};const w=_,A=\"data:image/png;base64,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\";function k(e){let t=\"\",n=\"\";Blockbench.isNewerThan(\"4.99\")?(t=SystemInfo.home_directory,n=SystemInfo.appdata_directory):(t=a(37).homedir(),n=electron.process.env.APPDATA);let o=null;switch(Blockbench.platform){case\"win32\":let a=x();\"edu\"==e?(o=PathModule.join(n,\"Minecraft Education Edition\"),a.existsSync(o)||(o=PathModule.join(n,\"../local/\",\"Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState\"))):\"preview\"==e?(o=PathModule.join(n,\"Minecraft Bedrock Preview/Users/Shared/\"),a.existsSync(o)||(o=PathModule.join(n,\"../local/\",\"Packages/Microsoft.MinecraftWindowsBeta_8wekyb3d8bbwe/LocalState\"))):(o=PathModule.join(n,\"Minecraft Bedrock/Users/Shared/\"),a.existsSync(o)||(o=PathModule.join(n,\"../local/\",\"Packages/Microsoft.MinecraftUWP_8wekyb3d8bbwe/LocalState\")));break;case\"linux\":o=PathModule.join(t,\".local/share/mcpelauncher\");break;case\"darwin\":o=PathModule.join(t,\"Library/Application Support/mcpelauncher\");break;case\"android\":o=PathModule.join(t,\"storage/shared/\");break;default:return\"\"}return PathModule.join(o,\"games/com.mojang\")}let y;function x(){if(isApp)return y||(Blockbench.isNewerThan(\"4.99\")?(y=requireNativeModule(\"fs\",{message:\"Enable file system access so that the wizard can export a pack into your Minecraft folder\"}),y):isApp?a(147):void 0)}const z={preset:{label:\"Preset\",icon:\"view_list\"},metadata:{label:\"Naming\",icon:\"description\"},functionality:{label:\"Functionality\",icon:\"build\"},design:{label:\"Design\",icon:\"visibility\"},export:{label:\"Export\",icon:\"file_download\"},next_steps:{label:\"Next Steps\",icon:\"queue_play_next\"}};var M=function(){var e=this,t=e._self._c;return t(\"div\",[t(\"p\",{staticClass:\"description\"},[e._v(\"Export your item as a behavior and resource pack.\")]),e._v(\" \"),t(\"section\",{attrs:{id:\"item_wizard_export_options\"}},[e.isApp?t(\"div\",{staticClass:\"item_wizard_export_option\",class:{selected:\"folder\"==e.form.export_mode},staticStyle:{\"border-color\":\"#dccb92\"},on:{click:function(t){return e.setExportMode(\"folder\")}}},[t(\"h3\",[e._v(\"Export to Folder\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Export the packs directly into the development pack folders of your Minecraft installation, and get started right away.\")])]):e._e(),e._v(\" \"),e.isApp?t(\"div\",{staticClass:\"item_wizard_export_option\",class:{selected:\"integrate\"==e.form.export_mode},staticStyle:{\"border-color\":\"#83c4ea\"},on:{click:function(t){return e.setExportMode(\"integrate\")}}},[t(\"h3\",[e._v(\"Integrate into Pack\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Integrate the item into an existing behavior and resource pack on your computer.\")])]):e._e(),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_export_option\",class:{selected:\"mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#89ca51\"},on:{click:function(t){return e.setExportMode(\"mcaddon\")}}},[t(\"h3\",[e._v(\"Export as MCAddon\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Generate an MCAddon file that you can install in one click or send to your friends.\")])]),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_export_option\",class:{selected:\"integrate_mcaddon\"==e.form.export_mode},staticStyle:{\"border-color\":\"#d2fc92\"},on:{click:function(t){return e.setExportMode(\"integrate_mcaddon\")}}},[t(\"h3\",[e._v(\"Integrate into MCAddon\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Integrate the item into an existing MCAddon file.\")])])]),e._v(\" \"),\"integrate\"==e.form.export_mode?[t(\"section\",[t(\"label\",[e._v(\"Behavior Pack\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select the behavior pack that you want to save the new item into\")]),e._v(\" \"),t(\"ul\",{attrs:{id:\"item_wizard_pack_list\"}},[e._l(e.existing_packs,(function(a){return t(\"li\",{key:a.name,class:{selected:a==e.form.integrate_pack},on:{click:function(t){e.form.integrate_pack=a}}},[a.has_icon?t(\"img\",{attrs:{src:e.getPackIcon(a),width:\"32px\"},on:{error:function(e){a.has_icon=!1}}}):t(\"div\"),e._v(\"\\n\\t\\t\\t\\t\\t\"+e._s(a.name)+\"\\n\\t\\t\\t\\t\")])})),e._v(\" \"),t(\"li\",{on:{click:function(t){return e.addPacks()}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tSelect packs manually...\\n\\t\\t\\t\\t\")])],2)])]:\"integrate_mcaddon\"==e.form.export_mode?[t(\"section\",[t(\"label\",[e._v(\"MCAddon File\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select the .mcaddon file to merge the new item into.\")]),e._v(\" \"),t(\"div\",[t(\"button\",{staticStyle:{display:\"inline-block\"},on:{click:function(t){return e.selectMCAddon()}}},[t(\"i\",{staticClass:\"material-icons\"},[e._v(\"add\")]),e._v(\"\\n\\t\\t\\t\\t\\tUpload MCAddon\\n\\t\\t\\t\\t\")]),e._v(\"\\n\\t\\t\\t\\t\"+e._s(e.mcaddon_file_name)+\"\\n\\t\\t\\t\")])])]:[t(\"section\",[t(\"label\",{staticClass:\"required\"},[e._v(\"Pack Name\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"The name of the packs you are exporting\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_name,expression:\"form.pack_name\"}],attrs:{type:\"text\",placeholder:\"Item Pack\"},domProps:{value:e.form.pack_name},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_name\",t.target.value)}}})]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Pack Author(s)\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"You can enter your name as the author of the pack. To enter multiple names, separate them with a comma.\")]),e._v(\" \"),t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.form.pack_authors,expression:\"form.pack_authors\"}],attrs:{type:\"text\",placeholder:\"Benchbot, Benchamin\"},domProps:{value:e.form.pack_authors},on:{input:function(t){t.target.composing||e.$set(e.form,\"pack_authors\",t.target.value)}}})]),e._v(\" \"),t(\"section\",[t(\"label\",[e._v(\"Pack Icon\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"The pack icon will be visible in the resource and behavior pack menu\")]),e._v(\" \"),t(\"icon-picker\",{model:{value:e.form.pack_icon,callback:function(t){e.$set(e.form,\"pack_icon\",t)},expression:\"form.pack_icon\"}})],1)]],2)};M._withStripped=!0;var C=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"item_wizard_icon_picker\"},[t(\"div\",{staticClass:\"icon_picker_left\"},[e.value?t(\"img\",{attrs:{src:e.value,width:\"64px\",height:\"64px\"}}):e._e()]),e._v(\" \"),t(\"div\",{staticClass:\"icon_picker_right\",on:{click:e.pickImage}},[t(\"i\",{staticClass:\"material-icons icon\"},[e._v(\"folder\")]),e._v(\" \"),t(\"label\",[e._v(e._s(e.imageName))])])])};function D(e,t,a,n,o,r,i,l){var s,d=\"function\"==typeof e?e.options:e;if(t&&(d.render=t,d.staticRenderFns=a,d._compiled=!0),n&&(d.functional=!0),r&&(d._scopeId=\"data-v-\"+r),i?(s=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||\"undefined\"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(i)},d._ssrRegister=s):o&&(s=l?function(){o.call(this,(d.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(d.functional){d._injectStyles=s;var c=d.render;d.render=function(e,t){return s.call(t),c(e,t)}}else{var p=d.beforeCreate;d.beforeCreate=p?[].concat(p,s):[s]}return{exports:e,options:d}}C._withStripped=!0;var S=D({name:\"icon-picker\",props:{value:String},methods:{pickImage(){Blockbench.import({readtype:\"image\",type:\"Image\",extensions:[\"png\"]},(e=>{this.value=e[0].content||e[0].path,this.$emit(\"input\",this.value)}))}},computed:{imageName(){if(!this.value)return\"Select Image...\";let e=this.value.split(osfs);return e.length>2?e.last():\"\"}}},C,[],!1,(function(e){var t=a(257);t.__inject__&&t.__inject__(e)}),null,\"67c6ca01\");const P=D({components:{IconPicker:S.exports},name:\"export\",props:{form:Object,bedrock_installed:Boolean},data:()=>({isApp,existing_packs:[],mcaddon_file_name:\"\"}),methods:{setExportMode(e){if(this.form.export_mode=e,\"integrate\"==e){let e=function(e,t){if(!isApp)return[];let a,n=[],o=[];try{a=k(e),n=x().readdirSync(PathModule.join(a,\"development_resource_packs\"),{withFileTypes:!0})}catch(e){return!1}let r={};n.forEach((e=>{if(e.isDirectory())try{let t=PathModule.join(a,\"development_resource_packs\",e.name),n=x().readFileSync(PathModule.join(t,\"manifest.json\"),{encoding:\"utf-8\"}),o=autoParseJSON(n,!1);o&&o.header&&(r[o.header.uuid]=t)}catch(e){console.error(e)}}));try{o=x().readdirSync(PathModule.join(a,\"development_behavior_packs\"),{withFileTypes:!0})}catch(e){return!1}let i=[];return o.forEach((e=>{if(e.isDirectory())try{let t=PathModule.join(a,\"development_behavior_packs\",e.name),n=x().readFileSync(PathModule.join(t,\"manifest.json\"),{encoding:\"utf-8\"}),o=autoParseJSON(n,!1);if(o&&o.dependencies&&o.dependencies[0]){let a=o.dependencies[0].uuid;r[a]&&i.push({name:e.name,bp_path:t,rp_path:r[a],has_icon:!0})}}catch(e){console.error(e)}})),i}(this.form.edition);if(e instanceof Array)this.bedrock_installed=!0,this.existing_packs.replace(e);else{let e={bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"};Blockbench.showQuickMessage(`No installation of Minecraft ${e[this.form.edition]} was found on your device`)}}},getPackIcon:e=>e.bp_path+osfs+\"pack_icon.png\",addPacks(){let e={name:\"\",bp_path:\"\",rp_path:\"\",has_icon:!0};e.bp_path=Blockbench.pickDirectory({resource_id:\"bedrock_behavior_pack\"}),e.bp_path&&(e.name=PathModule.basename(e.bp_path),e.rp_path=Blockbench.pickDirectory({resource_id:\"bedrock_resource_pack\"}),e.rp_path&&(this.existing_packs.push(e),this.form.integrate_pack=e))},selectMCAddon(){Blockbench.import({extensions:[\"mcaddon\"],type:\"MCAddon\",readtype:\"binary\"},(async e=>{this.mcaddon_file_name=e[0].name;let t=await JSZip.loadAsync(e[0].content);window.ItemWizardProject.previous_mcaddon=t}))}}},M,[],!1,(function(e){var t=a(294);t.__inject__&&t.__inject__(e)}),null,\"02f4cdce\").exports;var O=function(){var e=this._self._c;return e(\"div\",[e(\"input\",{ref:\"color_picker\"})])};O._withStripped=!0;const N=D({name:\"color-picker\",props:{value:String},mounted(){$(this.$refs.color_picker).spectrum({preferredFormat:\"hex\",color:this.value,showAlpha:!1,showInput:!0,move:e=>{this.$emit(\"input\",e.toHexString())},change:e=>{this.$emit(\"input\",e.toHexString())}})}},O,[],!1,(function(e){}),null,\"cdd660b2\").exports;var B=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"item_wizard_hud_slider\"},[t(\"div\",{staticClass:\"item_wizard_hud_slider_range\",on:{mousedown:function(t){return e.slide(t,!0)},mousemove:function(t){return e.slide(t,!0)},touchmove:function(t){return e.slideTouch(t,!0)},touchstart:function(t){return e.slideTouch(t,!0)}}},[t(\"div\",{style:{width:5*e.value+\"%\",backgroundSize:e.value<2?\"cover\":\"contain\"}})]),e._v(\" \"),t(\"div\",{staticClass:\"item_wizard_slider_label\"},[e._v(e._s(e.getLabel(e.value)))])])};B._withStripped=!0;const j=D({name:\"hud-slider\",props:{value:Number,getLabel:{type:Function,default:e=>e}},methods:{slide(e){0!=e.buttons&&(this.value=Math.clamp(Math.round(e.offsetX/e.target.clientWidth*20),0,20),this.$emit(\"input\",this.value))},slideTouch(e){convertTouchEvent(e),this.value=Math.clamp(Math.round(e.offsetX/e.target.clientWidth*20),0,20),this.$emit(\"input\",this.value)}}},B,[],!1,(function(e){var t=a(557);t.__inject__&&t.__inject__(e)}),null,\"22d2328e\").exports;var T=function(){var e=this,t=e._self._c;return t(\"div\",{staticClass:\"item_wizard_suggestion_id_list\"},[t(\"select-input\",{attrs:{options:e.options},on:{input:function(t){e.value=\"custom\"==e.select_value?e.value:e.select_value,e.$emit(\"input\",e.value)}},model:{value:e.select_value,callback:function(t){e.select_value=t},expression:\"select_value\"}}),e._v(\" \"),\"custom\"==e.select_value?t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.value,expression:\"value\"}],ref:\"input\",attrs:{type:\"text\",placeholder:e.placeholder},domProps:{value:e.value},on:{input:[function(t){t.target.composing||(e.value=t.target.value)},function(t){return e.$emit(\"input\",e.value)}]}}):e._e()],1)};T._withStripped=!0;let H={entity:{allay:\"Allay\",armor_stand:\"Armor Stand\",arrow:\"Arrow\",axolotl:\"Axolotl\",bat:\"Bat\",bee:\"Bee\",blaze:\"Blaze\",boat:\"Boat\",camel:\"Camel\",cat:\"Cat\",cave_spider:\"Cave Spider\",chest_boat:\"Chest Boat\",chest_minecart:\"Chest Minecart\",chicken:\"Chicken\",cod:\"Cod\",command_block_minecart:\"Command Block Minecart\",cow:\"Cow\",creeper:\"Creeper\",dolphin:\"Dolphin\",donkey:\"Donkey\",dragon_fireball:\"Dragon Fireball\",drowned:\"Drowned\",egg:\"Egg\",elder_guardian:\"Elder Guardian\",ender_crystal:\"Ender Crystal\",ender_dragon:\"Ender Dragon\",ender_pearl:\"Ender Pearl\",enderman:\"Enderman\",endermite:\"Endermite\",evocation_fang:\"Evocation Fang\",evocation_illager:\"Evocation Illager\",eye_of_ender_signal:\"Eye Of Ender Signal\",fireball:\"Fireball\",fireworks_rocket:\"Fireworks Rocket\",fox:\"Fox\",frog:\"Frog\",ghast:\"Ghast\",glow_squid:\"Glow Squid\",goat:\"Goat\",guardian:\"Guardian\",hoglin:\"Hoglin\",hopper_minecart:\"Hopper Minecart\",horse:\"Horse\",husk:\"Husk\",iron_golem:\"Iron Golem\",lightning_bolt:\"Lightning Bolt\",llama:\"Llama\",llama_spit:\"Llama Spit\",magma_cube:\"Magma Cube\",minecart:\"Minecart\",mooshroom:\"Mooshroom\",mule:\"Mule\",npc:\"NPC\",ocelot:\"Ocelot\",painting:\"Painting\",panda:\"Panda\",parrot:\"Parrot\",phantom:\"Phantom\",pig:\"Pig\",piglin:\"Piglin\",piglin_brute:\"Piglin Brute\",pillager:\"Pillager\",player:\"Player\",polar_bear:\"Polar Bear\",pufferfish:\"Pufferfish\",rabbit:\"Rabbit\",ravager:\"Ravager\",salmon:\"Salmon\",sheep:\"Sheep\",shulker:\"Shulker\",shulker_bullet:\"Shulker Bullet\",silverfish:\"Silverfish\",skeleton:\"Skeleton\",skeleton_horse:\"Skeleton Horse\",slime:\"Slime\",small_fireball:\"Small Fireball\",sniffer:\"Sniffer\",snow_golem:\"Snow Golem\",spider:\"Spider\",squid:\"Squid\",stray:\"Stray\",strider:\"Strider\",tadpole:\"Tadpole\",thrown_trident:\"Thrown Trident\",tnt:\"TNT\",tnt_minecart:\"TNT Minecart\",trader_llama:\"Trader Llama\",tropicalfish:\"Tropicalfish\",turtle:\"Turtle\",vex:\"Vex\",villager:\"Villager\",vindicator:\"Vindicator\",wandering_trader:\"Wandering Trader\",warden:\"Warden\",witch:\"Witch\",wither:\"Wither\",wither_skeleton:\"Wither Skeleton\",wolf:\"Wolf\",zoglin:\"Zoglin\",zombie:\"Zombie\",zombie_horse:\"Zombie Horse\",zombie_pigman:\"Zombie Pigman\",zombie_villager:\"Zombie Villager\"},item:{acacia_boat:\"Acacia Boat\",acacia_button:\"Acacia Button\",acacia_chest_boat:\"Acacia Chest Boat\",acacia_door:\"Acacia Door\",acacia_fence:\"Acacia Fence\",acacia_fence_gate:\"Acacia Fence Gate\",acacia_hanging_sign:\"Acacia Hanging Sign\",acacia_log:\"Acacia Log\",acacia_pressure_plate:\"Acacia Pressure Plate\",acacia_sign:\"Acacia Sign\",acacia_stairs:\"Acacia Stairs\",acacia_standing_sign:\"Acacia Sign\",acacia_trapdoor:\"Acacia Trapdoor\",acacia_wall_sign:\"Acacia Wall Sign\",activator_rail:\"Activator Rail\",agent_spawn_egg:\"Agent Spawn Egg\",allay_spawn_egg:\"Allay Spawn Egg\",allow:\"Allow\",amethyst_block:\"Block of Amethyst\",amethyst_cluster:\"Amethyst Cluster\",amethyst_shard:\"Amethyst Shard\",ancient_debris:\"Ancient Debris\",andesite_stairs:\"Andesite Stairs\",angler_pottery_sherd:\"Angler Pottery Sherd\",anvil:\"Anvil\",apple:\"Apple\",archer_pottery_sherd:\"Archer Pottery Sherd\",armor_stand:\"Armor Stand\",arms_up_pottery_sherd:\"Arms Up Pottery Sherd\",arrow:\"Arrow\",axolotl_bucket:\"Axolotl Bucket\",axolotl_spawn_egg:\"Axolotl Spawn Egg\",azalea:\"Azalea\",azalea_leaves:\"Azalea Leaves\",azalea_leaves_flowered:\"Flowering Azalea Leaves\",baked_potato:\"Baked Potato\",balloon:\"Balloon\",bamboo:\"Bamboo\",bamboo_block:\"Block of Bamboo\",bamboo_button:\"Bamboo Button\",bamboo_chest_raft:\"Bamboo Chest Raft\",bamboo_door:\"Bamboo Door\",bamboo_double_slab:\"Bamboo Double Slab\",bamboo_fence:\"Bamboo Fence\",bamboo_fence_gate:\"Bamboo Fence Gate\",bamboo_hanging_sign:\"Bamboo Hanging Sign\",bamboo_mosaic:\"Bamboo Mosaic\",bamboo_mosaic_double_slab:\"Bamboo Mosaic Double Slab\",bamboo_mosaic_slab:\"Bamboo Mosaic Slab\",bamboo_mosaic_stairs:\"Bamboo Mosaic Stairs\",bamboo_planks:\"Bamboo Planks\",bamboo_pressure_plate:\"Bamboo Pressure Plate\",bamboo_raft:\"Bamboo Raft\",bamboo_sapling:\"Bamboo Sapling\",bamboo_sign:\"Bamboo Sign\",bamboo_slab:\"Bamboo Slab\",bamboo_stairs:\"Bamboo Stairs\",bamboo_standing_sign:\"Bamboo Standing Sign\",bamboo_trapdoor:\"Bamboo Trapdoor\",bamboo_wall_sign:\"Bamboo Wall Sign\",banner:\"Banner\",banner_pattern:\"Banner Pattern\",barrel:\"Barrel\",barrier:\"Barrier\",basalt:\"Basalt\",bat_spawn_egg:\"Bat Spawn Egg\",beacon:\"Beacon\",bed:\"Bed\",bedrock:\"Bedrock\",bee_nest:\"Bee Nest\",bee_spawn_egg:\"Bee Spawn Egg\",beef:\"Raw Beef\",beehive:\"Beehive\",beetroot:\"Beetroot\",beetroot_seeds:\"Beetroot Seeds\",beetroot_soup:\"Beetroot Soup\",bell:\"Bell\",big_dripleaf:\"Big Dripleaf\",birch_boat:\"Birch Boat\",birch_button:\"Birch Button\",birch_chest_boat:\"Birch Chest Boat\",birch_door:\"Birch Door\",birch_fence:\"Birch Fence\",birch_fence_gate:\"Birch Fence Gate\",birch_hanging_sign:\"Birch Hanging Sign\",birch_log:\"Birch Log\",birch_pressure_plate:\"Birch Pressure Plate\",birch_sign:\"Birch Sign\",birch_stairs:\"Birch Stairs\",birch_standing_sign:\"Birch Sign\",birch_trapdoor:\"Birch Trapdoor\",birch_wall_sign:\"Birch Wall Sign\",black_candle:\"Black Candle\",black_candle_cake:\"Cake with Black Candle\",black_carpet:\"Black Carpet\",black_concrete:\"Black Concrete\",black_dye:\"Black Dye\",black_glazed_terracotta:\"Black Glazed Terracotta\",black_shulker_box:\"Black Shulker Box\",black_wool:\"Black Wool\",blackstone:\"Blackstone\",blackstone_double_slab:\"Blackstone Double Slab\",blackstone_slab:\"Blackstone Slab\",blackstone_stairs:\"Blackstone Stairs\",blackstone_wall:\"Blackstone Wall\",blade_pottery_sherd:\"Blade Pottery Sherd\",blast_furnace:\"Blast Furnace\",blaze_powder:\"Blaze Powder\",blaze_rod:\"Blaze Rod\",blaze_spawn_egg:\"Blaze Spawn Egg\",bleach:\"Bleach\",blue_candle:\"Blue Candle\",blue_candle_cake:\"Cake with Blue Candle\",blue_carpet:\"Blue Carpet\",blue_concrete:\"Blue Concrete\",blue_dye:\"Blue Dye\",blue_glazed_terracotta:\"Blue Glazed Terracotta\",blue_ice:\"Blue Ice\",blue_shulker_box:\"Blue Shulker Box\",blue_wool:\"Blue Wool\",boat:\"Boat\",bone:\"Bone\",bone_block:\"Bone Block\",bone_meal:\"Bone Meal\",book:\"Book\",bookshelf:\"Bookshelf\",border_block:\"Border\",bordure_indented_banner_pattern:\"Bordure Indented Banner Pattern\",bow:\"Bow\",bowl:\"Bowl\",brain_coral:\"Brain Coral\",bread:\"Bread\",brewer_pottery_sherd:\"Brewer Pottery Sherd\",brewing_stand:\"Brewing Stand\",brick:\"Brick\",brick_block:\"Brick Block\",brick_stairs:\"Brick Stairs\",brown_candle:\"Brown Candle\",brown_candle_cake:\"Cake with Brown Candle\",brown_carpet:\"Brown Carpet\",brown_concrete:\"Brown Concrete\",brown_dye:\"Brown Dye\",brown_glazed_terracotta:\"Brown Glazed Terracotta\",brown_mushroom:\"Brown Mushroom\",brown_mushroom_block:\"Brown Mushroom Block\",brown_shulker_box:\"Brown Shulker Box\",brown_wool:\"Brown Wool\",brush:\"Brush\",bubble_column:\"Bubble Column\",bubble_coral:\"Bubble Coral\",bucket:\"Bucket\",budding_amethyst:\"Budding Amethyst\",burn_pottery_sherd:\"Burn Pottery Sherd\",cactus:\"Cactus\",cake:\"Cake\",calcite:\"Calcite\",calibrated_sculk_sensor:\"Calibrated Sculk Sensor\",camel_spawn_egg:\"Camel Spawn Egg\",camera:\"Camera\",campfire:\"Campfire\",candle:\"Candle\",candle_cake:\"Cake with Candle\",carpet:\"Carpet\",carrot:\"Carrot\",carrot_on_a_stick:\"Carrot On A Stick\",carrots:\"Carrots\",cartography_table:\"Cartography Table\",carved_pumpkin:\"Carved Pumpkin\",cat_spawn_egg:\"Cat Spawn Egg\",cauldron:\"Cauldron\",cave_spider_spawn_egg:\"Cave Spider Spawn Egg\",cave_vines:\"Cave Vines\",cave_vines_body_with_berries:\"Cave Vines\",cave_vines_head_with_berries:\"Cave Vines\",chain:\"Chain\",chain_command_block:\"Chain Command Block\",chainmail_boots:\"Chain Boots\",chainmail_chestplate:\"Chain Chestplate\",chainmail_helmet:\"Chain Helmet\",chainmail_leggings:\"Chain Leggings\",charcoal:\"Charcoal\",chemical_heat:\"Chemical Heat\",chemistry_table:\"Chemistry Table\",cherry_boat:\"Cherry Boat\",cherry_button:\"Cherry Button\",cherry_chest_boat:\"Cherry Chest Boat\",cherry_door:\"Cherry Door\",cherry_double_slab:\"Cherry Double Slab\",cherry_fence:\"Cherry Fence\",cherry_fence_gate:\"Cherry Fence Gate\",cherry_hanging_sign:\"Cherry Hanging Sign\",cherry_leaves:\"Cherry Leaves\",cherry_log:\"Cherry Log\",cherry_planks:\"Cherry Planks\",cherry_pressure_plate:\"Cherry Pressure Plate\",cherry_sapling:\"Cherry Sapling\",cherry_sign:\"Cherry Sign\",cherry_slab:\"Cherry Slab\",cherry_stairs:\"Cherry Stairs\",cherry_standing_sign:\"Cherry Standing Sign\",cherry_trapdoor:\"Cherry Trapdoor\",cherry_wall_sign:\"Cherry Wall Sign\",cherry_wood:\"Cherry Wood\",chest:\"Chest\",chest_boat:\"Chest Boat\",chest_minecart:\"Minecart with Chest\",chicken:\"Raw Chicken\",chicken_spawn_egg:\"Chicken Spawn Egg\",chiseled_bookshelf:\"Chiseled Bookshelf\",chiseled_deepslate:\"Chiseled Deepslate\",chiseled_nether_bricks:\"Chiseled Nether Bricks\",chiseled_polished_blackstone:\"Chiseled Polished Blackstone\",chorus_flower:\"Chorus Flower\",chorus_fruit:\"Chorus Fruit\",chorus_plant:\"Chorus Plant\",clay:\"Clay Block\",clay_ball:\"Clay\",client_request_placeholder_block:\"Client Request Placeholder Block\",clock:\"Clock\",coal:\"Coal\",coal_block:\"Block of Coal\",coal_ore:\"Coal Ore\",coast_armor_trim_smithing_template:\"Coast Armor Trim Smithing Template\",cobbled_deepslate:\"Cobbled Deepslate\",cobbled_deepslate_double_slab:\"Cobbled Deepslate Double Slab\",cobbled_deepslate_slab:\"Cobbled Deepslate Slab\",cobbled_deepslate_stairs:\"Cobbled Deepslate Stairs\",cobbled_deepslate_wall:\"Cobbled Deepslate Wall\",cobblestone:\"Cobblestone\",cobblestone_wall:\"Cobblestone Wall\",cocoa:\"Cocoa\",cocoa_beans:\"Cocoa Beans\",cod:\"Cod\",cod_bucket:\"Cod Bucket\",cod_spawn_egg:\"Cod Spawn Egg\",colored_torch_bp:\"Colored Torch Bp\",colored_torch_rg:\"Colored Torch Rg\",command_block:\"Command Block\",command_block_minecart:\"Minecart with Command Block\",comparator:\"Redstone Comparator\",compass:\"Compass\",composter:\"Composter\",compound:\"Compound\",concrete:\"Concrete\",concrete_powder:\"Concrete Powder\",conduit:\"Conduit\",cooked_beef:\"Cooked Beef\",cooked_chicken:\"Cooked Chicken\",cooked_cod:\"Cooked Cod\",cooked_mutton:\"Cooked Mutton\",cooked_porkchop:\"Cooked Porkchop\",cooked_rabbit:\"Cooked Rabbit\",cooked_salmon:\"Cooked Salmon\",cookie:\"Cookie\",copper_block:\"Block of Copper\",copper_ingot:\"Copper Ingot\",copper_ore:\"Copper Ore\",coral:\"Coral\",coral_block:\"Coral Block\",coral_fan:\"Coral Fan\",coral_fan_dead:\"Coral Fan Dead\",coral_fan_hang:\"Coral Fan Hang\",coral_fan_hang2:\"Coral Fan Hang2\",coral_fan_hang3:\"Coral Fan Hang3\",cow_spawn_egg:\"Cow Spawn Egg\",cracked_deepslate_bricks:\"Cracked Deepslate Bricks\",cracked_deepslate_tiles:\"Cracked Deepslate Tiles\",cracked_nether_bricks:\"Cracked Nether Bricks\",cracked_polished_blackstone_bricks:\"Cracked Polished Blackstone Bricks\",crafting_table:\"Crafting Table\",creeper_banner_pattern:\"Creeper Banner Pattern\",creeper_spawn_egg:\"Creeper Spawn Egg\",crimson_button:\"Crimson Button\",crimson_door:\"Crimson Door\",crimson_double_slab:\"Crimson Slab\",crimson_fence:\"Crimson Fence\",crimson_fence_gate:\"Crimson Fence Gate\",crimson_fungus:\"Crimson Fungus\",crimson_hanging_sign:\"Crimson Hanging Sign\",crimson_hyphae:\"Crimson Hyphae\",crimson_nylium:\"Crimson Nylium\",crimson_planks:\"Crimson Planks\",crimson_pressure_plate:\"Crimson Pressure Plate\",crimson_roots:\"Crimson Roots\",crimson_sign:\"Crimson Sign\",crimson_slab:\"Crimson Slab\",crimson_stairs:\"Crimson Stairs\",crimson_standing_sign:\"Crimson Sign\",crimson_stem:\"Crimson Stem\",crimson_trapdoor:\"Crimson Trapdoor\",crimson_wall_sign:\"Crimson Sign\",crossbow:\"Crossbow\",crying_obsidian:\"Crying Obsidian\",cut_copper:\"Cut Copper\",cut_copper_slab:\"Cut Copper Slab\",cut_copper_stairs:\"Cut Copper Stairs\",cyan_candle:\"Cyan Candle\",cyan_candle_cake:\"Cake with Cyan Candle\",cyan_carpet:\"Cyan Carpet\",cyan_concrete:\"Cyan Concrete\",cyan_dye:\"Cyan Dye\",cyan_glazed_terracotta:\"Cyan Glazed Terracotta\",cyan_shulker_box:\"Cyan Shulker Box\",cyan_wool:\"Cyan Wool\",danger_pottery_sherd:\"Danger Pottery Sherd\",dark_oak_boat:\"Dark Oak Boat\",dark_oak_button:\"Dark Oak Button\",dark_oak_chest_boat:\"Dark Oak Chest Boat\",dark_oak_door:\"Dark Oak Door\",dark_oak_fence:\"Dark Oak Fence\",dark_oak_fence_gate:\"Dark Oak Fence Gate\",dark_oak_hanging_sign:\"Dark Oak Hanging Sign\",dark_oak_log:\"Dark Oak Log\",dark_oak_pressure_plate:\"Dark Oak Pressure Plate\",dark_oak_sign:\"Dark Oak Sign\",dark_oak_stairs:\"Dark Oak Stairs\",dark_oak_trapdoor:\"Dark Oak Trapdoor\",dark_prismarine_stairs:\"Dark Prismarine Stairs\",darkoak_standing_sign:\"Dark Oak Sign\",darkoak_wall_sign:\"Darkoak Wall Sign\",daylight_detector:\"Daylight Sensor\",daylight_detector_inverted:\"Daylight Detector Inverted\",dead_brain_coral:\"Dead Brain Coral\",dead_bubble_coral:\"Dead Bubble Coral\",dead_fire_coral:\"Dead Fire Coral\",dead_horn_coral:\"Dead Horn Coral\",dead_tube_coral:\"Dead Tube Coral\",deadbush:\"Dead Bush\",debug_stick:\"Debug Stick\",decorated_pot:\"Decorated Pot\",deepslate:\"Deepslate\",deepslate_brick_double_slab:\"Deepslate Brick Double Slab\",deepslate_brick_slab:\"Deepslate Brick Slab\",deepslate_brick_stairs:\"Deepslate Brick Stairs\",deepslate_brick_wall:\"Deepslate Brick Wall\",deepslate_bricks:\"Deepslate Bricks\",deepslate_coal_ore:\"Deepslate Coal Ore\",deepslate_copper_ore:\"Deepslate Copper Ore\",deepslate_diamond_ore:\"Deepslate Diamond Ore\",deepslate_emerald_ore:\"Deepslate Emerald Ore\",deepslate_gold_ore:\"Deepslate Gold Ore\",deepslate_iron_ore:\"Deepslate Iron Ore\",deepslate_lapis_ore:\"Deepslate Lapis Lazuli Ore\",deepslate_redstone_ore:\"Deepslate Redstone Ore\",deepslate_tile_double_slab:\"Deepslate Tile Double Slab\",deepslate_tile_slab:\"Deepslate Tile Slab\",deepslate_tile_stairs:\"Deepslate Tile Stairs\",deepslate_tile_wall:\"Deepslate Tile Wall\",deepslate_tiles:\"Deepslate Tiles\",deny:\"Deny\",detector_rail:\"Detector Rail\",diamond:\"Diamond\",diamond_axe:\"Diamond Axe\",diamond_block:\"Block of Diamond\",diamond_boots:\"Diamond Boots\",diamond_chestplate:\"Diamond Chestplate\",diamond_helmet:\"Diamond Helmet\",diamond_hoe:\"Diamond Hoe\",diamond_horse_armor:\"Diamond Horse Armor\",diamond_leggings:\"Diamond Leggings\",diamond_ore:\"Diamond Ore\",diamond_pickaxe:\"Diamond Pickaxe\",diamond_shovel:\"Diamond Shovel\",diamond_sword:\"Diamond Sword\",diorite_stairs:\"Diorite Stairs\",dirt:\"Dirt\",dirt_with_roots:\"Rooted Dirt\",disc_fragment_5:\"Disc Fragment 5\",dispenser:\"Dispenser\",dolphin_spawn_egg:\"Dolphin Spawn Egg\",donkey_spawn_egg:\"Donkey Spawn Egg\",double_cut_copper_slab:\"Double Cut Copper Slab\",double_plant:\"Plant\",double_stone_block_slab:\"Double Stone Block Slab\",double_stone_block_slab2:\"Double Stone Block Slab2\",double_stone_block_slab3:\"Double Stone Block Slab3\",double_stone_block_slab4:\"Double Stone Block Slab4\",double_wooden_slab:\"Double Wooden Slab\",dragon_breath:\"Dragon's Breath\",dragon_egg:\"Dragon Egg\",dried_kelp:\"Dried Kelp\",dried_kelp_block:\"Dried Kelp Block\",dripstone_block:\"Dripstone Block\",dropper:\"Dropper\",drowned_spawn_egg:\"Drowned Spawn Egg\",dune_armor_trim_smithing_template:\"Dune Armor Trim Smithing Template\",dye:\"Dye\",echo_shard:\"Echo Shard\",egg:\"Egg\",elder_guardian_spawn_egg:\"Elder Guardian Spawn Egg\",elytra:\"Elytra\",emerald:\"Emerald\",emerald_block:\"Block of Emerald\",emerald_ore:\"Emerald Ore\",empty_map:\"Empty Map\",enchanted_book:\"Enchanted Book\",enchanted_golden_apple:\"Enchanted Golden Apple\",enchanting_table:\"Enchantment Table\",end_brick_stairs:\"End Stone Brick Stairs\",end_bricks:\"End Stone Bricks\",end_crystal:\"End Crystal\",end_gateway:\"End Gateway\",end_portal:\"End Portal\",end_portal_frame:\"End Portal Frame\",end_rod:\"End Rod\",end_stone:\"End Stone\",ender_chest:\"Ender Chest\",ender_dragon_spawn_egg:\"Ender Dragon Spawn Egg\",ender_eye:\"Eye of Ender\",ender_pearl:\"Ender Pearl\",enderman_spawn_egg:\"Enderman Spawn Egg\",endermite_spawn_egg:\"Endermite Spawn Egg\",evoker_spawn_egg:\"Evoker Spawn Egg\",experience_bottle:\"Bottle o' Enchanting\",explorer_pottery_sherd:\"Explorer Pottery Sherd\",exposed_copper:\"Exposed Copper\",exposed_cut_copper:\"Exposed Cut Copper\",exposed_cut_copper_slab:\"Exposed Cut Copper Slab\",exposed_cut_copper_stairs:\"Exposed Cut Copper Stairs\",exposed_double_cut_copper_slab:\"Exposed Double Cut Copper Slab\",eye_armor_trim_smithing_template:\"Eye Armor Trim Smithing Template\",farmland:\"Farmland\",feather:\"Feather\",fence:\"Oak Fence\",fence_gate:\"Oak Fence Gate\",fermented_spider_eye:\"Fermented Spider Eye\",field_masoned_banner_pattern:\"Field Masoned Banner Pattern\",filled_map:\"Filled Map\",fire:\"Fire\",fire_charge:\"Fire Charge\",fire_coral:\"Fire Coral\",firework_rocket:\"Firework Rocket\",firework_star:\"Firework Star\",fishing_rod:\"Fishing Rod\",fletching_table:\"Fletching Table\",flint:\"Flint\",flint_and_steel:\"Flint and Steel\",flower_banner_pattern:\"Flower Banner Pattern\",flower_pot:\"Flower Pot\",flowering_azalea:\"Flowering Azalea\",flowing_lava:\"Lava\",flowing_water:\"Water\",fox_spawn_egg:\"Fox Spawn Egg\",frame:\"Item Frame\",friend_pottery_sherd:\"Friend Pottery Sherd\",frog_spawn:\"Frogspawn\",frog_spawn_egg:\"Frog Spawn Egg\",frosted_ice:\"Frosted Ice\",furnace:\"Furnace\",ghast_spawn_egg:\"Ghast Spawn Egg\",ghast_tear:\"Ghast Tear\",gilded_blackstone:\"Gilded Blackstone\",glass:\"Glass\",glass_bottle:\"Glass Bottle\",glass_pane:\"Glass Pane\",glistering_melon_slice:\"Glistering Melon Slice\",globe_banner_pattern:\"Globe Banner Pattern\",glow_frame:\"Glow Item Frame\",glow_ink_sac:\"Glow Ink Sac\",glow_lichen:\"Glow Lichen\",glow_squid_spawn_egg:\"Glow Squid Spawn Egg\",glow_stick:\"Glow Stick\",glowingobsidian:\"Glowingobsidian\",glowstone:\"Glowstone\",glowstone_dust:\"Glowstone Dust\",goat_horn:\"Goat Horn\",goat_spawn_egg:\"Goat Spawn Egg\",gold_block:\"Block of Gold\",gold_ingot:\"Gold Ingot\",gold_nugget:\"Gold Nugget\",gold_ore:\"Gold Ore\",golden_apple:\"Golden Apple\",golden_axe:\"Golden Axe\",golden_boots:\"Golden Boots\",golden_carrot:\"Golden Carrot\",golden_chestplate:\"Golden Chestplate\",golden_helmet:\"Golden Helmet\",golden_hoe:\"Golden Hoe\",golden_horse_armor:\"Golden Horse Armor\",golden_leggings:\"Golden Leggings\",golden_pickaxe:\"Golden Pickaxe\",golden_rail:\"Powered Rail\",golden_shovel:\"Golden Shovel\",golden_sword:\"Golden Sword\",granite_stairs:\"Granite Stairs\",grass:\"Grass Block\",grass_path:\"Dirt Path\",gravel:\"Gravel\",gray_candle:\"Gray Candle\",gray_candle_cake:\"Cake with Gray Candle\",gray_carpet:\"Gray Carpet\",gray_concrete:\"Gray Concrete\",gray_dye:\"Gray Dye\",gray_glazed_terracotta:\"Gray Glazed Terracotta\",gray_shulker_box:\"Gray Shulker Box\",gray_wool:\"Gray Wool\",green_candle:\"Green Candle\",green_candle_cake:\"Cake with Green Candle\",green_carpet:\"Green Carpet\",green_concrete:\"Green Concrete\",green_dye:\"Green Dye\",green_glazed_terracotta:\"Green Glazed Terracotta\",green_shulker_box:\"Green Shulker Box\",green_wool:\"Green Wool\",grindstone:\"Grindstone\",guardian_spawn_egg:\"Guardian Spawn Egg\",gunpowder:\"Gunpowder\",hanging_roots:\"Hanging Roots\",hard_glass:\"Hard Glass\",hard_glass_pane:\"Hard Glass Pane\",hard_stained_glass:\"Hard Stained Glass\",hard_stained_glass_pane:\"Hard Stained Glass Pane\",hardened_clay:\"Terracotta\",hay_block:\"Hay Bale\",heart_of_the_sea:\"Heart of the Sea\",heart_pottery_sherd:\"Heart Pottery Sherd\",heartbreak_pottery_sherd:\"Heartbreak Pottery Sherd\",heavy_weighted_pressure_plate:\"Weighted Pressure Plate (Heavy)\",hoglin_spawn_egg:\"Hoglin Spawn Egg\",honey_block:\"Honey Block\",honey_bottle:\"Honey Bottle\",honeycomb:\"Honeycomb\",honeycomb_block:\"Honeycomb Block\",hopper:\"Hopper\",hopper_minecart:\"Minecart with Hopper\",horn_coral:\"Horn Coral\",horse_spawn_egg:\"Horse Spawn Egg\",host_armor_trim_smithing_template:\"Host Armor Trim Smithing Template\",howl_pottery_sherd:\"Howl Pottery Sherd\",husk_spawn_egg:\"Husk Spawn Egg\",ice:\"Ice\",ice_bomb:\"Ice Bomb\",infested_deepslate:\"Infested Deepslate\",ink_sac:\"Ink Sac\",iron_axe:\"Iron Axe\",iron_bars:\"Iron Bars\",iron_block:\"Block of Iron\",iron_boots:\"Iron Boots\",iron_chestplate:\"Iron Chestplate\",iron_door:\"Iron Door\",iron_golem_spawn_egg:\"Iron Golem Spawn Egg\",iron_helmet:\"Iron Helmet\",iron_hoe:\"Iron Hoe\",iron_horse_armor:\"Iron Horse Armor\",iron_ingot:\"Iron Ingot\",iron_leggings:\"Iron Leggings\",iron_nugget:\"Iron Nugget\",iron_ore:\"Iron Ore\",iron_pickaxe:\"Iron Pickaxe\",iron_shovel:\"Iron Shovel\",iron_sword:\"Iron Sword\",iron_trapdoor:\"Iron Trapdoor\",jigsaw:\"Jigsaw Block\",jukebox:\"Jukebox\",jungle_boat:\"Jungle Boat\",jungle_button:\"Jungle Button\",jungle_chest_boat:\"Jungle Chest Boat\",jungle_door:\"Jungle Door\",jungle_fence:\"Jungle Fence\",jungle_fence_gate:\"Jungle Fence Gate\",jungle_hanging_sign:\"Jungle Hanging Sign\",jungle_log:\"Jungle Log\",jungle_pressure_plate:\"Jungle Pressure Plate\",jungle_sign:\"Jungle Sign\",jungle_stairs:\"Jungle Stairs\",jungle_standing_sign:\"Jungle Sign\",jungle_trapdoor:\"Jungle Trapdoor\",jungle_wall_sign:\"Jungle Wall Sign\",kelp:\"Kelp\",ladder:\"Ladder\",lantern:\"Lantern\",lapis_block:\"Block of Lapis Lazuli\",lapis_lazuli:\"Lapis Lazuli\",lapis_ore:\"Lapis Lazuli Ore\",large_amethyst_bud:\"Large Amethyst Bud\",lava:\"Lava\",lava_bucket:\"Lava Bucket\",lead:\"Lead\",leather:\"Leather\",leather_boots:\"Leather Boots\",leather_chestplate:\"Leather Tunic\",leather_helmet:\"Leather Cap\",leather_horse_armor:\"Leather Horse Armor\",leather_leggings:\"Leather Pants\",leaves:\"Leaves\",leaves2:\"Leaves2\",lectern:\"Lectern\",lever:\"Lever\",light_block:\"Light Block\",light_blue_candle:\"Light Blue Candle\",light_blue_candle_cake:\"Cake with Light Blue Candle\",light_blue_carpet:\"Light Blue Carpet\",light_blue_concrete:\"Light Blue Concrete\",light_blue_dye:\"Light Blue Dye\",light_blue_glazed_terracotta:\"Light Blue Glazed Terracotta\",light_blue_shulker_box:\"Light Blue Shulker Box\",light_blue_wool:\"Light Blue Wool\",light_gray_candle:\"Light Gray Candle\",light_gray_candle_cake:\"Cake with Light Gray Candle\",light_gray_carpet:\"Light Gray Carpet\",light_gray_concrete:\"Light Gray Concrete\",light_gray_dye:\"Light Gray Dye\",light_gray_shulker_box:\"Light Gray Shulker Box\",light_gray_wool:\"Light Gray Wool\",light_weighted_pressure_plate:\"Weighted Pressure Plate (Light)\",lightning_rod:\"Lightning Rod\",lime_candle:\"Lime Candle\",lime_candle_cake:\"Cake with Lime Candle\",lime_carpet:\"Lime Carpet\",lime_concrete:\"Lime Concrete\",lime_dye:\"Lime Dye\",lime_glazed_terracotta:\"Lime Glazed Terracotta\",lime_shulker_box:\"Lime Shulker Box\",lime_wool:\"Lime Wool\",lingering_potion:\"Lingering Potion\",lit_blast_furnace:\"Lit Blast Furnace\",lit_deepslate_redstone_ore:\"Lit Deepslate Redstone Ore\",lit_furnace:\"Lit Furnace\",lit_pumpkin:\"Jack o'Lantern\",lit_redstone_lamp:\"Lit Redstone Lamp\",lit_redstone_ore:\"Lit Redstone Ore\",lit_smoker:\"Lit Smoker\",llama_spawn_egg:\"Llama Spawn Egg\",lodestone:\"Lodestone\",lodestone_compass:\"Lodestone Compass\",log:\"Log\",log2:\"Log2\",loom:\"Loom\",magenta_candle:\"Magenta Candle\",magenta_candle_cake:\"Cake with Magenta Candle\",magenta_carpet:\"Magenta Carpet\",magenta_concrete:\"Magenta Concrete\",magenta_dye:\"Magenta Dye\",magenta_glazed_terracotta:\"Magenta Glazed Terracotta\",magenta_shulker_box:\"Magenta Shulker Box\",magenta_wool:\"Magenta Wool\",magma:\"Magma Block\",magma_cream:\"Magma Cream\",magma_cube_spawn_egg:\"Magma Cube Spawn Egg\",mangrove_boat:\"Mangrove Boat\",mangrove_button:\"Mangrove Button\",mangrove_chest_boat:\"Mangrove Chest Boat\",mangrove_door:\"Mangrove Door\",mangrove_double_slab:\"Mangrove Double Slab\",mangrove_fence:\"Mangrove Fence\",mangrove_fence_gate:\"Mangrove Fence Gate\",mangrove_hanging_sign:\"Mangrove Hanging Sign\",mangrove_leaves:\"Mangrove Leaves\",mangrove_log:\"Mangrove Log\",mangrove_planks:\"Mangrove Planks\",mangrove_pressure_plate:\"Mangrove Pressure Plate\",mangrove_propagule:\"Mangrove Propagule\",mangrove_roots:\"Mangrove Roots\",mangrove_sign:\"Mangrove Sign\",mangrove_slab:\"Mangrove Slab\",mangrove_stairs:\"Mangrove Stairs\",mangrove_standing_sign:\"Mangrove Standing Sign\",mangrove_trapdoor:\"Mangrove Trapdoor\",mangrove_wall_sign:\"Mangrove Wall Sign\",mangrove_wood:\"Mangrove Wood\",medicine:\"Medicine\",medium_amethyst_bud:\"Medium Amethyst Bud\",melon_block:\"Melon\",melon_seeds:\"Melon Seeds\",melon_slice:\"Melon Slice\",melon_stem:\"Melon Stem\",milk_bucket:\"Milk Bucket\",minecart:\"Minecart\",miner_pottery_sherd:\"Miner Pottery Sherd\",mob_spawner:\"Monster Spawner\",mojang_banner_pattern:\"Mojang Banner Pattern\",monster_egg:\"Infested Stone\",mooshroom_spawn_egg:\"Mooshroom Spawn Egg\",moss_block:\"Moss Block\",moss_carpet:\"Moss Carpet\",mossy_cobblestone:\"Mossy Cobblestone\",mossy_cobblestone_stairs:\"Mossy Cobblestone Stairs\",mossy_stone_brick_stairs:\"Mossy Stone Brick Stairs\",mourner_pottery_sherd:\"Mourner Pottery Sherd\",moving_block:\"Moving Block\",mud:\"Mud\",mud_brick_double_slab:\"Mud Brick Double Slab\",mud_brick_slab:\"Mud Brick Slab\",mud_brick_stairs:\"Mud Brick Stairs\",mud_brick_wall:\"Mud Brick Wall\",mud_bricks:\"Mud Bricks\",muddy_mangrove_roots:\"Muddy Mangrove Roots\",mule_spawn_egg:\"Mule Spawn Egg\",mushroom_stew:\"Mushroom Stew\",music_disc_11:\"Music Disc 11\",music_disc_13:\"Music Disc 13\",music_disc_5:\"Music Disc 5\",music_disc_blocks:\"Music Disc Blocks\",music_disc_cat:\"Music Disc Cat\",music_disc_chirp:\"Music Disc Chirp\",music_disc_far:\"Music Disc Far\",music_disc_mall:\"Music Disc Mall\",music_disc_mellohi:\"Music Disc Mellohi\",music_disc_otherside:\"Music Disc Otherside\",music_disc_pigstep:\"Music Disc Pigstep\",music_disc_relic:\"Music Disc Relic\",music_disc_stal:\"Music Disc Stal\",music_disc_strad:\"Music Disc Strad\",music_disc_wait:\"Music Disc Wait\",music_disc_ward:\"Music Disc Ward\",mutton:\"Mutton\",mycelium:\"Mycelium\",name_tag:\"Name Tag\",nautilus_shell:\"Nautilus Shell\",nether_brick:\"Nether Brick Block\",nether_brick_fence:\"Nether Brick Fence\",nether_brick_stairs:\"Nether Brick Stairs\",nether_gold_ore:\"Nether Gold Ore\",nether_sprouts:\"Nether Sprouts\",nether_star:\"Nether Star\",nether_wart:\"Nether Wart\",nether_wart_block:\"Nether Wart Block\",netherbrick:\"Nether Brick\",netherite_axe:\"Netherite Axe\",netherite_block:\"Block of Netherite\",netherite_boots:\"Netherite Boots\",netherite_chestplate:\"Netherite Chestplate\",netherite_helmet:\"Netherite Helmet\",netherite_hoe:\"Netherite Hoe\",netherite_ingot:\"Netherite Ingot\",netherite_leggings:\"Netherite Leggings\",netherite_pickaxe:\"Netherite Pickaxe\",netherite_scrap:\"Netherite Scrap\",netherite_shovel:\"Netherite Shovel\",netherite_sword:\"Netherite Sword\",netherite_upgrade_smithing_template:\"Netherite Upgrade Smithing Template\",netherrack:\"Netherrack\",netherreactor:\"Nether Reactor Core\",normal_stone_stairs:\"Stone Stairs\",noteblock:\"Note Block\",npc_spawn_egg:\"Npc Spawn Egg\",oak_boat:\"Oak Boat\",oak_chest_boat:\"Oak Chest Boat\",oak_fence:\"Oak Fence\",oak_hanging_sign:\"Oak Hanging Sign\",oak_log:\"Oak Log\",oak_sign:\"Oak Sign\",oak_stairs:\"Oak Stairs\",observer:\"Observer\",obsidian:\"Obsidian\",ocelot_spawn_egg:\"Ocelot Spawn Egg\",ochre_froglight:\"Ochre Froglight\",orange_candle:\"Orange Candle\",orange_candle_cake:\"Cake with Orange Candle\",orange_carpet:\"Orange Carpet\",orange_concrete:\"Orange Concrete\",orange_dye:\"Orange Dye\",orange_glazed_terracotta:\"Orange Glazed Terracotta\",orange_shulker_box:\"Orange Shulker Box\",orange_wool:\"Orange Wool\",oxidized_copper:\"Oxidized Copper\",oxidized_cut_copper:\"Oxidized Cut Copper\",oxidized_cut_copper_slab:\"Oxidized Cut Copper Slab\",oxidized_cut_copper_stairs:\"Oxidized Cut Copper Stairs\",oxidized_double_cut_copper_slab:\"Oxidized Double Cut Copper Slab\",packed_ice:\"Packed Ice\",packed_mud:\"Packed Mud\",painting:\"Painting\",panda_spawn_egg:\"Panda Spawn Egg\",paper:\"Paper\",parrot_spawn_egg:\"Parrot Spawn Egg\",pearlescent_froglight:\"Pearlescent Froglight\",phantom_membrane:\"Phantom Membrane\",phantom_spawn_egg:\"Phantom Spawn Egg\",pig_spawn_egg:\"Pig Spawn Egg\",piglin_banner_pattern:\"Piglin Banner Pattern\",piglin_brute_spawn_egg:\"Piglin Brute Spawn Egg\",piglin_spawn_egg:\"Piglin Spawn Egg\",pillager_spawn_egg:\"Pillager Spawn Egg\",pink_candle:\"Pink Candle\",pink_candle_cake:\"Cake with Pink Candle\",pink_carpet:\"Pink Carpet\",pink_concrete:\"Pink Concrete\",pink_dye:\"Pink Dye\",pink_glazed_terracotta:\"Pink Glazed Terracotta\",pink_petals:\"Pink Petals\",pink_shulker_box:\"Pink Shulker Box\",pink_wool:\"Pink Wool\",piston:\"Piston\",pitcher_crop:\"Pitcher Crop\",pitcher_plant:\"Pitcher Plant\",pitcher_pod:\"Pitcher Pod\",planks:\"Wooden Planks\",plenty_pottery_sherd:\"Plenty Pottery Sherd\",podzol:\"Podzol\",pointed_dripstone:\"Pointed Dripstone\",poisonous_potato:\"Poisonous Potato\",polar_bear_spawn_egg:\"Polar Bear Spawn Egg\",polished_andesite_stairs:\"Polished Andesite Stairs\",polished_basalt:\"Polished Basalt\",polished_blackstone:\"Polished Blackstone\",polished_blackstone_brick_double_slab:\"Polished Blackstone Brick Double Slab\",polished_blackstone_brick_slab:\"Polished Blackstone Brick Slab\",polished_blackstone_brick_stairs:\"Polished Blackstone Brick Stairs\",polished_blackstone_brick_wall:\"Polished Blackstone Brick Wall\",polished_blackstone_bricks:\"Polished Blackstone Bricks\",polished_blackstone_button:\"Polished Blackstone Button\",polished_blackstone_double_slab:\"Polished Blackstone Double Slab\",polished_blackstone_pressure_plate:\"Polished Blackstone Pressure Plate\",polished_blackstone_slab:\"Polished Blackstone Slab\",polished_blackstone_stairs:\"Polished Blackstone Stairs\",polished_blackstone_wall:\"Polished Blackstone Wall\",polished_deepslate:\"Polished Deepslate\",polished_deepslate_double_slab:\"Polished Deepslate Double Slab\",polished_deepslate_slab:\"Polished Deepslate Slab\",polished_deepslate_stairs:\"Polished Deepslate Stairs\",polished_deepslate_wall:\"Polished Deepslate Wall\",polished_diorite_stairs:\"Polished Diorite Stairs\",polished_granite_stairs:\"Polished Granite Stairs\",popped_chorus_fruit:\"Popped Chorus Fruit\",porkchop:\"Raw Porkchop\",portal:\"Portal\",potato:\"Potato\",potion:\"Potion\",powder_snow:\"Powder Snow\",powder_snow_bucket:\"Powder Snow Bucket\",powered_comparator:\"Powered Comparator\",powered_repeater:\"Powered Repeater\",prismarine:\"Prismarine\",prismarine_bricks_stairs:\"Prismarine Brick Stairs\",prismarine_crystals:\"Prismarine Crystals\",prismarine_shard:\"Prismarine Shard\",prismarine_stairs:\"Prismarine Stairs\",prize_pottery_sherd:\"Prize Pottery Sherd\",pufferfish:\"Pufferfish\",pufferfish_bucket:\"Pufferfish Bucket\",pufferfish_spawn_egg:\"Pufferfish Spawn Egg\",pumpkin:\"Pumpkin\",pumpkin_pie:\"Pumpkin Pie\",pumpkin_seeds:\"Pumpkin Seeds\",pumpkin_stem:\"Pumpkin Stem\",purple_candle:\"Purple Candle\",purple_candle_cake:\"Cake with Purple Candle\",purple_carpet:\"Purple Carpet\",purple_concrete:\"Purple Concrete\",purple_dye:\"Purple Dye\",purple_glazed_terracotta:\"Purple Glazed Terracotta\",purple_shulker_box:\"Purple Shulker Box\",purple_wool:\"Purple Wool\",purpur_block:\"Purpur Block\",purpur_stairs:\"Purpur Stairs\",quartz:\"Nether Quartz\",quartz_block:\"Block of Quartz\",quartz_bricks:\"Quartz Bricks\",quartz_ore:\"Nether Quartz Ore\",quartz_stairs:\"Quartz Stairs\",rabbit:\"Raw Rabbit\",rabbit_foot:\"Rabbit's Foot\",rabbit_hide:\"Rabbit Hide\",rabbit_spawn_egg:\"Rabbit Spawn Egg\",rabbit_stew:\"Rabbit Stew\",rail:\"Rail\",raiser_armor_trim_smithing_template:\"Raiser Armor Trim Smithing Template\",rapid_fertilizer:\"Rapid Fertilizer\",ravager_spawn_egg:\"Ravager Spawn Egg\",raw_copper:\"Raw Copper\",raw_copper_block:\"Block of Raw Copper\",raw_gold:\"Raw Gold\",raw_gold_block:\"Block of Raw Gold\",raw_iron:\"Raw Iron\",raw_iron_block:\"Block of Raw Iron\",recovery_compass:\"Recovery Compass\",red_candle:\"Red Candle\",red_candle_cake:\"Cake with Red Candle\",red_carpet:\"Red Carpet\",red_concrete:\"Red Concrete\",red_dye:\"Red Dye\",red_flower:\"Flower\",red_glazed_terracotta:\"Red Glazed Terracotta\",red_mushroom:\"Red Mushroom\",red_mushroom_block:\"Red Mushroom Block\",red_nether_brick:\"Red Nether Brick\",red_nether_brick_stairs:\"Red Nether Brick Stairs\",red_sandstone:\"Red Sandstone\",red_sandstone_stairs:\"Red Sandstone Stairs\",red_shulker_box:\"Red Shulker Box\",red_wool:\"Red Wool\",redstone:\"Redstone Dust\",redstone_block:\"Block of Redstone\",redstone_lamp:\"Redstone Lamp\",redstone_ore:\"Redstone Ore\",redstone_torch:\"Redstone Torch\",redstone_wire:\"Redstone Dust\",reinforced_deepslate:\"Reinforced Deepslate\",repeater:\"Redstone Repeater\",repeating_command_block:\"Repeating Command Block\",reserved6:\"Reserved6\",respawn_anchor:\"Respawn Anchor\",rib_armor_trim_smithing_template:\"Rib Armor Trim Smithing Template\",rotten_flesh:\"Rotten Flesh\",saddle:\"Saddle\",salmon:\"Raw Salmon\",salmon_bucket:\"Salmon Bucket\",salmon_spawn_egg:\"Salmon Spawn Egg\",sand:\"Sand\",sandstone:\"Sandstone\",sandstone_stairs:\"Sandstone Stairs\",sapling:\"Sapling\",scaffolding:\"Scaffolding\",sculk:\"Sculk\",sculk_catalyst:\"Sculk Catalyst\",sculk_sensor:\"Sculk Sensor\",sculk_shrieker:\"Sculk Shrieker\",sculk_vein:\"Sculk Vein\",scute:\"Scute\",sea_lantern:\"Sea Lantern\",sea_pickle:\"Sea Pickle\",seagrass:\"Seagrass\",sentry_armor_trim_smithing_template:\"Sentry Armor Trim Smithing Template\",shaper_armor_trim_smithing_template:\"Shaper Armor Trim Smithing Template\",sheaf_pottery_sherd:\"Sheaf Pottery Sherd\",shears:\"Shears\",sheep_spawn_egg:\"Sheep Spawn Egg\",shelter_pottery_sherd:\"Shelter Pottery Sherd\",shield:\"Shield\",shroomlight:\"Shroomlight\",shulker_box:\"Shulker Box\",shulker_shell:\"Shulker Shell\",shulker_spawn_egg:\"Shulker Spawn Egg\",silence_armor_trim_smithing_template:\"Silence Armor Trim Smithing Template\",silver_glazed_terracotta:\"Silver Glazed Terracotta\",silverfish_spawn_egg:\"Silverfish Spawn Egg\",skeleton_horse_spawn_egg:\"Skeleton Horse Spawn Egg\",skeleton_spawn_egg:\"Skeleton Spawn Egg\",skull:\"Skull\",skull_banner_pattern:\"Skull Banner Pattern\",skull_pottery_sherd:\"Skull Pottery Sherd\",slime:\"Slime Block\",slime_ball:\"Slimeball\",slime_spawn_egg:\"Slime Spawn Egg\",small_amethyst_bud:\"Small Amethyst Bud\",small_dripleaf_block:\"Small Dripleaf\",smithing_table:\"Smithing Table\",smoker:\"Smoker\",smooth_basalt:\"Smooth Basalt\",smooth_quartz_stairs:\"Smooth Quartz Stairs\",smooth_red_sandstone_stairs:\"Smooth Red Sandstone Stairs\",smooth_sandstone_stairs:\"Smooth Sandstone Stairs\",smooth_stone:\"Smooth Stone\",sniffer_egg:\"Sniffer Egg\",sniffer_spawn_egg:\"Sniffer Spawn Egg\",snort_pottery_sherd:\"Snort Pottery Sherd\",snout_armor_trim_smithing_template:\"Snout Armor Trim Smithing Template\",snow:\"Snow\",snow_golem_spawn_egg:\"Snow Golem Spawn Egg\",snow_layer:\"Top Snow\",snowball:\"Snowball\",soul_campfire:\"Soul Campfire\",soul_fire:\"Soul Fire\",soul_lantern:\"Soul Lantern\",soul_sand:\"Soul Sand\",soul_soil:\"Soul Soil\",soul_torch:\"Soul Torch\",sparkler:\"Sparkler\",spawn_egg:\"Spawn Egg\",spider_eye:\"Spider Eye\",spider_spawn_egg:\"Spider Spawn Egg\",spire_armor_trim_smithing_template:\"Spire Armor Trim Smithing Template\",splash_potion:\"Splash Potion\",sponge:\"Sponge\",spore_blossom:\"Spore Blossom\",spruce_boat:\"Spruce Boat\",spruce_button:\"Spruce Button\",spruce_chest_boat:\"Spruce Chest Boat\",spruce_door:\"Spruce Door\",spruce_fence:\"Spruce Fence\",spruce_fence_gate:\"Spruce Fence Gate\",spruce_hanging_sign:\"Spruce Hanging Sign\",spruce_log:\"Spruce Log\",spruce_pressure_plate:\"Spruce Pressure Plate\",spruce_sign:\"Spruce Sign\",spruce_stairs:\"Spruce Stairs\",spruce_standing_sign:\"Spruce Sign\",spruce_trapdoor:\"Spruce Trapdoor\",spruce_wall_sign:\"Spruce Wall Sign\",spyglass:\"Spyglass\",squid_spawn_egg:\"Squid Spawn Egg\",stained_glass:\"Stained Glass\",stained_glass_pane:\"Stained Glass Pane\",stained_hardened_clay:\"Terracotta\",standing_banner:\"Banner\",standing_sign:\"Sign\",stick:\"Stick\",sticky_piston:\"Sticky Piston\",stone:\"Stone\",stone_axe:\"Stone Axe\",stone_block_slab:\"Stone Block Slab\",stone_block_slab2:\"Stone Block Slab2\",stone_block_slab3:\"Stone Block Slab3\",stone_block_slab4:\"Stone Block Slab4\",stone_brick_stairs:\"Stone Brick Stairs\",stone_button:\"Stone Button\",stone_hoe:\"Stone Hoe\",stone_pickaxe:\"Stone Pickaxe\",stone_pressure_plate:\"Stone Pressure Plate\",stone_shovel:\"Stone Shovel\",stone_stairs:\"Cobblestone Stairs\",stone_sword:\"Stone Sword\",stonebrick:\"Stone Bricks\",stonecutter:\"Stonecutter\",stonecutter_block:\"Stonecutter\",stray_spawn_egg:\"Stray Spawn Egg\",strider_spawn_egg:\"Strider Spawn Egg\",stripped_acacia_log:\"Stripped Acacia Log\",stripped_bamboo_block:\"Block of Stripped Bamboo\",stripped_birch_log:\"Stripped Birch Log\",stripped_cherry_log:\"Stripped Cherry Log\",stripped_cherry_wood:\"Stripped Cherry Wood\",stripped_crimson_hyphae:\"Stripped Crimson Hyphae\",stripped_crimson_stem:\"Stripped Crimson Stem\",stripped_dark_oak_log:\"Stripped Dark Oak Log\",stripped_jungle_log:\"Stripped Jungle Log\",stripped_mangrove_log:\"Stripped Mangrove Log\",stripped_mangrove_wood:\"Stripped Mangrove Wood\",stripped_oak_log:\"Stripped Oak Log\",stripped_spruce_log:\"Stripped Spruce Log\",stripped_warped_hyphae:\"Stripped Warped Hyphae\",stripped_warped_stem:\"Stripped Warped Stem\",structure_block:\"Structure Block\",structure_void:\"Structure Void\",sugar:\"Sugar\",sugar_cane:\"Sugar Cane\",suspicious_gravel:\"Suspicious Gravel\",suspicious_sand:\"Suspicious Sand\",suspicious_stew:\"Suspicious Stew\",sweet_berries:\"Sweet Berries\",sweet_berry_bush:\"Sweet Berry Bush\",tadpole_bucket:\"Tadpole Bucket\",tadpole_spawn_egg:\"Tadpole Spawn Egg\",tallgrass:\"Grass\",target:\"Target\",tide_armor_trim_smithing_template:\"Tide Armor Trim Smithing Template\",tinted_glass:\"Tinted Glass\",tnt:\"TNT\",tnt_minecart:\"Minecart with TNT\",torch:\"Torch\",torchflower:\"Torchflower\",torchflower_crop:\"Torchflower Crop\",torchflower_seeds:\"Torchflower Seeds\",totem_of_undying:\"Totem Of Undying\",trader_llama_spawn_egg:\"Trader Llama Spawn Egg\",trapdoor:\"Oak Trapdoor\",trapped_chest:\"Trapped Chest\",trident:\"Trident\",trip_wire:\"Trip Wire\",tripwire_hook:\"Tripwire Hook\",tropical_fish:\"Tropical Fish\",tropical_fish_bucket:\"Tropical Fish Bucket\",tropical_fish_spawn_egg:\"Tropical Fish Spawn Egg\",tube_coral:\"Tube Coral\",tuff:\"Tuff\",turtle_egg:\"Sea Turtle Egg\",turtle_helmet:\"Turtle Shell\",turtle_spawn_egg:\"Turtle Spawn Egg\",twisting_vines:\"Twisting Vines\",underwater_torch:\"Underwater Torch\",undyed_shulker_box:\"Undyed Shulker Box\",unknown:\"Unknown\",unlit_redstone_torch:\"Redstone Torch\",unpowered_comparator:\"Unpowered Comparator\",unpowered_repeater:\"Unpowered Repeater\",verdant_froglight:\"Verdant Froglight\",vex_armor_trim_smithing_template:\"Vex Armor Trim Smithing Template\",vex_spawn_egg:\"Vex Spawn Egg\",villager_spawn_egg:\"Villager Spawn Egg\",vindicator_spawn_egg:\"Vindicator Spawn Egg\",vine:\"Vines\",wall_banner:\"Wall Banner\",wall_sign:\"Wall Sign\",wandering_trader_spawn_egg:\"Wandering Trader Spawn Egg\",ward_armor_trim_smithing_template:\"Ward Armor Trim Smithing Template\",warden_spawn_egg:\"Warden Spawn Egg\",warped_button:\"Warped Button\",warped_door:\"Warped Door\",warped_double_slab:\"Warped Slab\",warped_fence:\"Warped Fence\",warped_fence_gate:\"Warped Fence Gate\",warped_fungus:\"Warped Fungus\",warped_fungus_on_a_stick:\"Warped Fungus on a Stick\",warped_hanging_sign:\"Warped Hanging Sign\",warped_hyphae:\"Warped Hyphae\",warped_nylium:\"Warped Nylium\",warped_planks:\"Warped Planks\",warped_pressure_plate:\"Warped Pressure Plate\",warped_roots:\"Warped Roots\",warped_sign:\"Warped Sign\",warped_slab:\"Warped Slab\",warped_stairs:\"Warped Stairs\",warped_standing_sign:\"Warped Sign\",warped_stem:\"Warped Stem\",warped_trapdoor:\"Warped Trapdoor\",warped_wall_sign:\"Warped Sign\",warped_wart_block:\"Warped Wart Block\",water:\"Water\",water_bucket:\"Water Bucket\",waterlily:\"Lily Pad\",waxed_copper:\"Waxed Block of Copper\",waxed_cut_copper:\"Waxed Cut Copper\",waxed_cut_copper_slab:\"Waxed Cut Copper Slab\",waxed_cut_copper_stairs:\"Waxed Cut Copper Stairs\",waxed_double_cut_copper_slab:\"Waxed Double Cut Copper Slab\",waxed_exposed_copper:\"Waxed Exposed Copper\",waxed_exposed_cut_copper:\"Waxed Exposed Cut Copper\",waxed_exposed_cut_copper_slab:\"Waxed Exposed Cut Copper Slab\",waxed_exposed_cut_copper_stairs:\"Waxed Exposed Cut Copper Stairs\",waxed_exposed_double_cut_copper_slab:\"Waxed Exposed Double Cut Copper Slab\",waxed_oxidized_copper:\"Waxed Oxidized Copper\",waxed_oxidized_cut_copper:\"Waxed Oxidized Cut Copper\",waxed_oxidized_cut_copper_slab:\"Waxed Oxidized Cut Copper Slab\",waxed_oxidized_cut_copper_stairs:\"Waxed Oxidized Cut Copper Stairs\",waxed_oxidized_double_cut_copper_slab:\"Waxed Oxidized Double Cut Copper Slab\",waxed_weathered_copper:\"Waxed Weathered Copper\",waxed_weathered_cut_copper:\"Waxed Weathered Cut Copper\",waxed_weathered_cut_copper_slab:\"Waxed Weathered Cut Copper Slab\",waxed_weathered_cut_copper_stairs:\"Waxed Weathered Cut Copper Stairs\",waxed_weathered_double_cut_copper_slab:\"Waxed Weathered Double Cut Copper Slab\",wayfinder_armor_trim_smithing_template:\"Wayfinder Armor Trim Smithing Template\",weathered_copper:\"Weathered Copper\",weathered_cut_copper:\"Weathered Cut Copper\",weathered_cut_copper_slab:\"Weathered Cut Copper Slab\",weathered_cut_copper_stairs:\"Weathered Cut Copper Stairs\",weathered_double_cut_copper_slab:\"Weathered Double Cut Copper Slab\",web:\"Cobweb\",weeping_vines:\"Weeping Vines\",wheat:\"Wheat\",wheat_seeds:\"Seeds\",white_candle:\"White Candle\",white_candle_cake:\"Cake with White Candle\",white_carpet:\"White Carpet\",white_concrete:\"White Concrete\",white_dye:\"White Dye\",white_glazed_terracotta:\"White Glazed Terracotta\",white_shulker_box:\"White Shulker Box\",white_wool:\"White Wool\",wild_armor_trim_smithing_template:\"Wild Armor Trim Smithing Template\",witch_spawn_egg:\"Witch Spawn Egg\",wither_rose:\"Wither Rose\",wither_skeleton_spawn_egg:\"Wither Skeleton Spawn Egg\",wither_spawn_egg:\"Wither Spawn Egg\",wolf_spawn_egg:\"Wolf Spawn Egg\",wood:\"Wood\",wooden_axe:\"Wooden Axe\",wooden_button:\"Oak Button\",wooden_door:\"Oak Door\",wooden_hoe:\"Wooden Hoe\",wooden_pickaxe:\"Wooden Pickaxe\",wooden_pressure_plate:\"Oak Pressure Plate\",wooden_shovel:\"Wooden Shovel\",wooden_slab:\"Wood Slab\",wooden_sword:\"Wooden Sword\",wool:\"Wool\",writable_book:\"Book & Quill\",written_book:\"Written Book\",yellow_candle:\"Yellow Candle\",yellow_candle_cake:\"Cake with Yellow Candle\",yellow_carpet:\"Yellow Carpet\",yellow_concrete:\"Yellow Concrete\",yellow_dye:\"Yellow Dye\",yellow_flower:\"Flower\",yellow_glazed_terracotta:\"Yellow Glazed Terracotta\",yellow_shulker_box:\"Yellow Shulker Box\",yellow_wool:\"Yellow Wool\",zoglin_spawn_egg:\"Zoglin Spawn Egg\",zombie_horse_spawn_egg:\"Zombie Horse Spawn Egg\",zombie_pigman_spawn_egg:\"Zombie Pigman Spawn Egg\",zombie_spawn_egg:\"Zombie Spawn Egg\",zombie_villager_spawn_egg:\"Zombie Villager Spawn Egg\"}};const I=D({name:\"suggestion-id-list\",props:{value:String,data_type:String,placeholder:String,multiple:{type:Boolean,default:!0}},data:()=>({}),computed:{options(){let e=H[this.data_type]||{};return Object.assign({\"\":\"-\",custom:\"Custom ID\"},e)},select_value(){let e=H[this.data_type]||{};return!e||e[this.value]?this.value:\"custom\"}},methods:{getOptions(){},openAddMenu(e){let t=[];for(let e in data)t.push({id:e,name:data[e],icon:\"label\",click:()=>{this.value&&0!=this.multiple?this.value+=\", \"+e:this.value=e,this.$emit(\"input\",this.value)}});new Menu(t,{searchable:!0}).open(this.$refs.input)}}},T,[],!1,(function(e){var t=a(635);t.__inject__&&t.__inject__(e);var n=a(90);n.__inject__&&n.__inject__(e)}),\"09e61bde\",\"257abb12\").exports,X={installed:!1,initialized:!1,icon:\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJub25lIj4NCjxtYXNrIGlkPSJtYXNrMCIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNTYiPg0KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xODEuNTM0IDI1NC4yNTJDMTg1LjU2NiAyNTUuODIzIDE5MC4xNjQgMjU1LjcyMiAxOTQuMjM0IDI1My43NjRMMjQ2Ljk0IDIyOC40MDNDMjUyLjQ3OCAyMjUuNzM4IDI1NiAyMjAuMTMyIDI1NiAyMTMuOTgzVjQyLjAxODFDMjU2IDM1Ljg2ODkgMjUyLjQ3OCAzMC4yNjM4IDI0Ni45NCAyNy41OTg4TDE5NC4yMzQgMi4yMzY4MUMxODguODkzIC0wLjMzMzEzMiAxODIuNjQyIDAuMjk2MzQ0IDE3Ny45NTUgMy43MDQxOEMxNzcuMjg1IDQuMTkxIDE3Ni42NDcgNC43MzQ1NCAxNzYuMDQ5IDUuMzMzNTRMNzUuMTQ5IDk3LjM4NjJMMzEuMTk5MiA2NC4wMjQ3QzI3LjEwNzkgNjAuOTE5MSAyMS4zODUzIDYxLjE3MzUgMTcuNTg1NSA2NC42M0wzLjQ4OTM2IDc3LjQ1MjVDLTEuMTU4NTMgODEuNjgwNSAtMS4xNjM4NiA4OC45OTI2IDMuNDc3ODUgOTMuMjI3NEw0MS41OTI2IDEyOEwzLjQ3Nzg1IDE2Mi43NzNDLTEuMTYzODYgMTY3LjAwOCAtMS4xNTg1MyAxNzQuMzIgMy40ODkzNiAxNzguNTQ4TDE3LjU4NTUgMTkxLjM3QzIxLjM4NTMgMTk0LjgyNyAyNy4xMDc5IDE5NS4wODEgMzEuMTk5MiAxOTEuOTc2TDc1LjE0OSAxNTguNjE0TDE3Ni4wNDkgMjUwLjY2N0MxNzcuNjQ1IDI1Mi4yNjQgMTc5LjUxOSAyNTMuNDY3IDE4MS41MzQgMjU0LjI1MlpNMTkyLjAzOSA2OS44ODUzTDExNS40NzkgMTI4TDE5Mi4wMzkgMTg2LjExNVY2OS44ODUzWiIgZmlsbD0id2hpdGUiLz4NCjwvbWFzaz4NCjxnIG1hc2s9InVybCgjbWFzazApIj4NCjxwYXRoIGQ9Ik0yNDYuOTQgMjcuNjM4M0wxOTQuMTkzIDIuMjQxMzhDMTg4LjA4OCAtMC42OTgzMDIgMTgwLjc5MSAwLjU0MTcyMSAxNzUuOTk5IDUuMzMzMzJMMy4zMjM3MSAxNjIuNzczQy0xLjMyMDgyIDE2Ny4wMDggLTEuMzE1NDggMTc0LjMyIDMuMzM1MjMgMTc4LjU0OEwxNy40Mzk5IDE5MS4zN0MyMS4yNDIxIDE5NC44MjcgMjYuOTY4MiAxOTUuMDgxIDMxLjA2MTkgMTkxLjk3NkwyMzkuMDAzIDM0LjIyNjlDMjQ1Ljk3OSAyOC45MzQ3IDI1NS45OTkgMzMuOTEwMyAyNTUuOTk5IDQyLjY2NjdWNDIuMDU0M0MyNTUuOTk5IDM1LjkwNzggMjUyLjQ3OCAzMC4zMDQ3IDI0Ni45NCAyNy42MzgzWiIgZmlsbD0iIzAwNjVBOSIvPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZCkiPg0KPHBhdGggZD0iTTI0Ni45NCAyMjguMzYyTDE5NC4xOTMgMjUzLjc1OUMxODguMDg4IDI1Ni42OTggMTgwLjc5MSAyNTUuNDU4IDE3NS45OTkgMjUwLjY2N0wzLjMyMzcxIDkzLjIyNzJDLTEuMzIwODIgODguOTkyNSAtMS4zMTU0OCA4MS42ODAyIDMuMzM1MjMgNzcuNDUyM0wxNy40Mzk5IDY0LjYyOThDMjEuMjQyMSA2MS4xNzMzIDI2Ljk2ODIgNjAuOTE4OCAzMS4wNjE5IDY0LjAyNDVMMjM5LjAwMyAyMjEuNzczQzI0NS45NzkgMjI3LjA2NSAyNTUuOTk5IDIyMi4wOSAyNTUuOTk5IDIxMy4zMzNWMjEzLjk0NkMyNTUuOTk5IDIyMC4wOTIgMjUyLjQ3OCAyMjUuNjk1IDI0Ni45NCAyMjguMzYyWiIgZmlsbD0iIzAwN0FDQyIvPg0KPC9nPg0KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjFfZCkiPg0KPHBhdGggZD0iTTE5NC4xOTYgMjUzLjc2M0MxODguMDg5IDI1Ni43IDE4MC43OTIgMjU1LjQ1OSAxNzYgMjUwLjY2N0MxODEuOTA0IDI1Ni41NzEgMTkyIDI1Mi4zODkgMTkyIDI0NC4wMzlWMTEuOTYwNkMxOTIgMy42MTA1NyAxODEuOTA0IC0wLjU3MTE3NSAxNzYgNS4zMzMyMUMxODAuNzkyIDAuNTQxMTY2IDE4OC4wODkgLTAuNzAwNjA3IDE5NC4xOTYgMi4yMzY0OEwyNDYuOTM0IDI3LjU5ODVDMjUyLjQ3NiAzMC4yNjM1IDI1NiAzNS44Njg2IDI1NiA0Mi4wMTc4VjIxMy45ODNDMjU2IDIyMC4xMzIgMjUyLjQ3NiAyMjUuNzM3IDI0Ni45MzQgMjI4LjQwMkwxOTQuMTk2IDI1My43NjNaIiBmaWxsPSIjMUY5Q0YwIi8+DQo8L2c+DQo8ZyBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6b3ZlcmxheSIgb3BhY2l0eT0iMC4yNSI+DQo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE4MS4zNzggMjU0LjI1MkMxODUuNDEgMjU1LjgyMiAxOTAuMDA4IDI1NS43MjIgMTk0LjA3NyAyNTMuNzY0TDI0Ni43ODMgMjI4LjQwMkMyNTIuMzIyIDIyNS43MzcgMjU1Ljg0NCAyMjAuMTMyIDI1NS44NDQgMjEzLjk4M1Y0Mi4wMTc5QzI1NS44NDQgMzUuODY4NyAyNTIuMzIyIDMwLjI2MzYgMjQ2Ljc4NCAyNy41OTg2TDE5NC4wNzcgMi4yMzY2NUMxODguNzM3IC0wLjMzMzI5OSAxODIuNDg2IDAuMjk2MTc3IDE3Ny43OTggMy43MDQwMUMxNzcuMTI5IDQuMTkwODMgMTc2LjQ5MSA0LjczNDM3IDE3NS44OTIgNS4zMzMzN0w3NC45OTI3IDk3LjM4NkwzMS4wNDI5IDY0LjAyNDVDMjYuOTUxNyA2MC45MTg5IDIxLjIyOSA2MS4xNzM0IDE3LjQyOTIgNjQuNjI5OEwzLjMzMzExIDc3LjQ1MjNDLTEuMzE0NzggODEuNjgwMyAtMS4zMjAxMSA4OC45OTI1IDMuMzIxNiA5My4yMjczTDQxLjQzNjQgMTI4TDMuMzIxNiAxNjIuNzczQy0xLjMyMDExIDE2Ny4wMDggLTEuMzE0NzggMTc0LjMyIDMuMzMzMTEgMTc4LjU0OEwxNy40MjkyIDE5MS4zN0MyMS4yMjkgMTk0LjgyNyAyNi45NTE3IDE5NS4wODEgMzEuMDQyOSAxOTEuOTc2TDc0Ljk5MjcgMTU4LjYxNEwxNzUuODkyIDI1MC42NjdDMTc3LjQ4OCAyNTIuMjY0IDE3OS4zNjMgMjUzLjQ2NyAxODEuMzc4IDI1NC4yNTJaTTE5MS44ODMgNjkuODg1MUwxMTUuMzIzIDEyOEwxOTEuODgzIDE4Ni4xMTVWNjkuODg1MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcikiLz4NCjwvZz4NCjwvZz4NCjxkZWZzPg0KPGZpbHRlciBpZD0iZmlsdGVyMF9kIiB4PSItMjEuNDg5NiIgeT0iNDAuNTIyNSIgd2lkdGg9IjI5OC44MjIiIGhlaWdodD0iMjM2LjE0OSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPg0KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4NCjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIi8+DQo8ZmVPZmZzZXQvPg0KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMTAuNjY2NyIvPg0KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPg0KPGZlQmxlbmQgbW9kZT0ib3ZlcmxheSIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93Ii8+DQo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvdyIgcmVzdWx0PSJzaGFwZSIvPg0KPC9maWx0ZXI+DQo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2QiIHg9IjE1NC42NjciIHk9Ii0yMC42NzM1IiB3aWR0aD0iMTIyLjY2NyIgaGVpZ2h0PSIyOTcuMzQ3IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+DQo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPg0KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLz4NCjxmZU9mZnNldC8+DQo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMC42NjY3Ii8+DQo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+DQo8ZmVCbGVuZCBtb2RlPSJvdmVybGF5IiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3ciLz4NCjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93IiByZXN1bHQ9InNoYXBlIi8+DQo8L2ZpbHRlcj4NCjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhciIgeDE9IjEyNy44NDQiIHkxPSIwLjY1OTk4OCIgeDI9IjEyNy44NDQiIHkyPSIyNTUuMzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+DQo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAiLz4NCjwvbGluZWFyR3JhZGllbnQ+DQo8L2RlZnM+DQo8L3N2Zz4=\",async open(e,t){if(!X.initialized){let e=a(81);await new Promise((t=>{e.exec(\"code --version\").on(\"close\",(a=>{a||(X.installed=!0,X.launch=(t,a)=>{let n=`code -n \"${t}\" \"${a}\"`;e.exec(n)},t())}))})),X.initialized=!0}X.launch(e,t)},launch(){Blockbench.openLink(\"https://code.visualstudio.com\")}},L={name:\"item-wizard-dialog\",components:{Export:P,ColorPicker:N,\"hud-slider\":j,\"suggestion-id-list\":I,\"select-input\":Vue.options.components[\"select-input\"]},data:()=>({open_page:\"preset\",VSCode:X,pages:z,presets:w,edition_options:{bedrock:\"Bedrock\",preview:\"Bedrock Preview\",edu:\"Education Edition\"},inventory_categories:{construction:\"Construction\",equipment:\"Equipment\",items:\"Items\",nature:\"Nature\"},inventory_groups:{construction:{none:\"None\",\"itemGroup.name.planks\":\"Planks\",\"itemGroup.name.walls\":\"Walls\",\"itemGroup.name.fence\":\"Fences\",\"itemGroup.name.fenceGate\":\"Fence Gates\",\"itemGroup.name.stairs\":\"Stairs\",\"itemGroup.name.door\":\"Doors\",\"itemGroup.name.glass\":\"Glass\",\"itemGroup.name.glassPane\":\"Glass Panes\",\"itemGroup.name.slab\":\"Slabs\",\"itemGroup.name.stoneBrick\":\"Decorative Stone\",\"itemGroup.name.sandstone\":\"Sandstone\",\"itemGroup.name.wool\":\"Wool\",\"itemGroup.name.woolCarpet\":\"Wool Carpet\",\"itemGroup.name.concretePowder\":\"Concrete Powder\",\"itemGroup.name.concrete\":\"Concrete\",\"itemGroup.name.stainedClay\":\"Terracotta\",\"itemGroup.name.glazedTerracotta\":\"Glazed Terracottas\",\"itemGroup.name.permission\":\"Permission Blocks\"},equipment:{none:\"None\",\"itemGroup.name.helmet\":\"Helmets\",\"itemGroup.name.chestplate\":\"Chestplates\",\"itemGroup.name.leggings\":\"Leggings\",\"itemGroup.name.boots\":\"Boots\",\"itemGroup.name.sword\":\"Swords\",\"itemGroup.name.axe\":\"Axes\",\"itemGroup.name.pickaxe\":\"Pickaxes\",\"itemGroup.name.shovel\":\"Shovels\",\"itemGroup.name.hoe\":\"Hoes\",\"itemGroup.name.arrow\":\"Arrows\",\"itemGroup.name.cookedFood\":\"Cooked Food\",\"itemGroup.name.miscFood\":\"Miscellaneous Foods\",\"itemGroup.name.goatHorn\":\"Goat Horns\",\"itemGroup.name.horseArmor\":\"Horse Armor\",\"itemGroup.name.potion\":\"Potions\",\"itemGroup.name.splashPotion\":\"Splash Potions\",\"itemGroup.name.lingeringPotion\":\"Lingering Potions\"},items:{none:\"None\",\"itemGroup.name.bed\":\"Beds\",\"itemGroup.name.candles\":\"Candles\",\"itemGroup.name.anvil\":\"Anvils\",\"itemGroup.name.chest\":\"Chests\",\"itemGroup.name.shulkerBox\":\"Shulker Boxes\",\"itemGroup.name.record\":\"Records\",\"itemGroup.name.sign\":\"Signs\",\"itemGroup.name.skull\":\"Mob Skulls\",\"itemGroup.name.buttons\":\"Buttons\",\"itemGroup.name.boat\":\"Boats\",\"itemGroup.name.rail\":\"Rails\",\"itemGroup.name.minecart\":\"Minecarts\",\"itemGroup.name.pressurePlate\":\"Pressure Plates\",\"itemGroup.name.trapdoor\":\"Trapdoors\",\"itemGroup.name.enchantedBook\":\"Enchanted Books\",\"itemGroup.name.banner_pattern\":\"Banner Patterns\",\"itemGroup.name.banner\":\"Banners\",\"itemGroup.name.firework\":\"Fireworks\",\"itemGroup.name.fireworkStars\":\"Firework Charges\",\"itemGroup.name.chalkboard\":\"Chalkboards\"},nature:{none:\"None\",\"itemGroup.name.dye\":\"Dyes\",\"itemGroup.name.ore\":\"Ores\",\"itemGroup.name.stone\":\"Stone\",\"itemGroup.name.log\":\"Logs\",\"itemGroup.name.wood\":\"Woods\",\"itemGroup.name.leaves\":\"Leaves\",\"itemGroup.name.sapling\":\"Saplings\",\"itemGroup.name.seed\":\"Seeds\",\"itemGroup.name.crop\":\"Crops\",\"itemGroup.name.grass\":\"Ground Cover\",\"itemGroup.name.flower\":\"Flowers\",\"itemGroup.name.rawFood\":\"Raw Food\",\"itemGroup.name.mushroom\":\"Mushrooms\",\"itemGroup.name.monsterStoneEgg\":\"Infested Stone\",\"itemGroup.name.mobEgg\":\"Mob Eggs\",\"itemGroup.name.coral\":\"Coral Blocks\",\"itemGroup.name.coral_decorations\":\"Coral Decorations\",\"itemGroup.name.sculk\":\"Sculk\",\"itemGroup.name.netherWartBlock\":\"Nether Warts\"}},digger_block_options:{unset:\"Unset\",wood:\"Wood\",stone:\"Stone\",metal:\"Metal\",dirt:\"Dirt\",sand:\"Sand\",gravel:\"Gravel\",grass:\"Grass\",snow:\"Snow\",custom:\"Custom\"},wearable_options:{\"slot.armor.head\":\"Head\",\"slot.armor.chest\":\"Torso\",\"slot.armor.legs\":\"Legs\",\"slot.armor.feet\":\"Feet\",\"slot.weapon.offhand\":\"Offhand\",\"slot.saddle\":\"Saddle\",\"slot.armor\":\"Armor (Horse)\",\"slot.chest\":\"Chest (Donkey)\"},enchantable_slot_options:{armor_feet:\"Armor Feet\",armor_torso:\"Armor Torso\",armor_head:\"Armor Head\",armor_legs:\"Armor Legs\",axe:\"Axe\",bow:\"Bow\",cosmetic_head:\"Head Cosmetic\",crossbow:\"Crossbow\",elytra:\"Elytra\",fishing_rod:\"Fishing Rod\",flintsteel:\"Flint And Steel\",hoe:\"Hoe\",pickaxe:\"Pickaxe\",shears:\"Shears\",shield:\"Shield\",shovel:\"Shovel\",sword:\"Sword\",all:\"All\"},food_animation_options:{eat:\"Food\",drink:\"Drink\"},preset_search_term:\"\",has_customized_id:!1,resource_pack_path:null,behavior_pack_path:null,bedrock_installed:!1,current_tab_model:\"\",past_preset:!1,form:{edition:localStorage.getItem(\"minecraft_wizard.selected_edition\")||\"bedrock\",identifier:\"\",display_name:\"\",category:\"equipment\",item_group:\"none\",preset:\"iron_ingot\",stack_size:64,attachable_model:!1,use_current_model:!1,glint:!1,melee_enabled:!1,melee_damage:1,digger_enabled:!1,digger_blocks:[],wearable_enabled:!1,wearable_slot:\"slot.armor.head\",wearable_protection:0,enchantable_enabled:!1,enchantable_slot:\"sword\",enchantable_value:1,durability_enabled:!1,durability_max:0,repair_items:\"\",repair_amount:25,food_enabled:!1,food_nutrition:2,food_saturation_modifier:.6,food_duration:1.6,food_animation:\"eat\",food_always_eat:!1,fuel_enabled:!1,fuel_duration:1,place_entity_enabled:!1,place_entity_id:\"\",cooldown_enabled:!1,cooldown_duration:1,cooldown_category:\"\",export_mode:isApp?\"folder\":\"mcaddon\",pack_name:\"\",pack_authors:\"\",pack_icon:\"\",integrate_pack:null}}),computed:{identifier_error(){let e=this.form.identifier;return e?e.match(/^minecraft:/)?\"Use a different namespace than 'minecraft:'\":e.match(/[A-Z]/)?\"Identifiers cannot contain capital letters\":e.match(/^\\d/)?\"Identifiers cannot start with a number\":e.match(/[^a-z0-9-_.:]/)?\"Identifiers cannot contain spaces or special characters\":e.match(/\\w:\\w/)?\"\":\"Identifiers must start with a namespace, separated by a colon\":\"\"}},methods:{selectPreset(e){if(this.past_preset&&!confirm(\"Are you sure you want to go back and apply this preset? It may override some of the values that you have set.\"))return;this.past_preset=!1,this.form.preset=e;let t=this.presets[e];this.form.attachable_model=!1,this.form.use_current_model=!1,this.form.glint=!1,this.form.melee_enabled=!1,this.form.melee_damage=1,this.form.digger_enabled=!1,this.form.digger_blocks=[],this.form.wearable_enabled=!1,this.form.wearable_slot=\"slot.armor.head\",this.form.wearable_protection=0,this.form.durability_enabled=!1,this.form.durability_max=0,this.form.repair_items=\"\",this.form.repair_amount=25,this.form.food_enabled=!1,this.form.food_nutrition=2,this.form.food_saturation_modifier=.6,this.form.food_duration=1.6,this.form.food_animation=\"eat\",this.form.food_always_eat=!1,this.form.fuel_enabled=!1,this.form.fuel_duration=1,this.form.place_entity_enabled=!1,this.form.place_entity_id=\"\",this.form.cooldown_enabled=!1,this.form.cooldown_duration=1,this.form.cooldown_category=\"\";for(let e in t)null!=this.form[e]&&(\"digger_blocks\"==e?(this.form.digger_blocks.empty(),t.digger_blocks.forEach((e=>{let t=Object.assign({uuid:guid(),id:\"\"},e);this.form.digger_blocks.push(t)}))):this.form[e]=t[e])},addDiggerBlock(){this.form.digger_blocks.push({uuid:guid(),type:\"unset\",id:\"\",speed:8})},clearUnsetDiggerBlocks(){let e=this.form.digger_blocks.filter((e=>\"unset\"!=e.type));this.form.digger_blocks.replace(e)},checkPageComplete(){let{form:e}=this;if(\"metadata\"==this.open_page){if(!e.display_name)return Blockbench.showQuickMessage(\"Please enter a name\"),!1;if(!e.identifier||this.identifier_error)return Blockbench.showQuickMessage(\"Please enter a correct identifier\"),!1}else if(\"preset\"==this.open_page){if(!e.preset)return Blockbench.showQuickMessage(\"Please select an item preset\"),!1}else if(\"export\"==this.open_page){if(\"integrate\"==e.export_mode&&!e.integrate_pack)return Blockbench.showQuickMessage(\"Please select a behavior pack\"),!1;if(\"integrate_mcaddon\"==e.export_mode&&!window.ItemWizardProject.previous_mcaddon)return Blockbench.showQuickMessage(\"Please select an mcaddon file\"),!1;if(!e.export_mode.includes(\"integrate\")&&!e.pack_name)return Blockbench.showQuickMessage(\"Please enter a pack name\"),!1;if(!e.export_mode.includes(\"integrate\")&&e.pack_name.match(/[<>:\"/\\\\|?*]/))return Blockbench.showQuickMessage(\"You cannot use invalid characters in the pack name: \"+e.pack_name.match(/[<>:\"/\\\\|?*]/)[0]),!1}return!0},exportPacks(){(async function(e,t){let a=x(),n=isApp&&k(e.edition),o=e.identifier.replace(/^.+:/,\"\"),r=guid(),i=guid(),l=A;if(e.pack_icon){let m=new CanvasFrame(16,16);await m.loadFromURL(e.pack_icon),l=m.canvas.toDataURL()}let s,d,c={authors:e.pack_authors?e.pack_authors.split(/,\\s*/):void 0,generated_with:{blockbench_item_wizard:[\"1.2.4\"]}},p=function(e,t){let a=[],n={description:{identifier:e.identifier,menu_category:\"hidden\"==e.category?void 0:{category:e.category,group:\"none\"==e.item_group?void 0:e.item_group}},components:{\"minecraft:max_stack_size\":parseInt(e.stack_size),\"minecraft:icon\":t.item_filename}};if(e.glint&&(n.components[\"minecraft:glint\"]=!0),e.melee_enabled&&(n.components[\"minecraft:damage\"]=e.melee_damage,e.digger_enabled||(n.components[\"minecraft:can_destroy_in_creative\"]=!1)),e.digger_enabled&&e.digger_blocks.length){let t=[];e.digger_blocks.forEach((e=>{let a={speed:e.speed};\"unset\"!=e.type&&(\"custom\"==e.type?a.block=e.id:a.block={tags:`query.any_tag('${e.type}')`},t.push(a))})),n.components[\"minecraft:digger\"]={destroy_speeds:t}}if(!e.digger_enabled&&!e.melee_enabled||e.attachable_model&&!e.wearable_enabled||(n.components[\"minecraft:hand_equipped\"]=!0),e.wearable_enabled&&(n.components[\"minecraft:max_stack_size\"]=1,n.components[\"minecraft:wearable\"]={slot:e.wearable_slot,protection:e.wearable_protection}),e.enchantable_enabled&&(n.components[\"minecraft:enchantable\"]={slot:e.enchantable_slot,value:parseInt(e.enchantable_value)}),e.durability_enabled&&(n.components[\"minecraft:durability\"]={max_durability:parseInt(e.durability_max)},e.repair_items)){let t=e.repair_items.split(/[, ]+/);n.components[\"minecraft:repairable\"]={repair_items:[{items:t,repair_amount:Math.floor(e.repair_amount/100*e.durability_max)}]}}return e.food_enabled&&(n.components[\"minecraft:food\"]={nutrition:parseFloat(e.food_nutrition),saturation_modifier:parseFloat(e.food_saturation_modifier),can_always_eat:!!e.food_always_eat||void 0},n.components[\"minecraft:use_modifiers\"]={movement_modifier:.32,use_duration:parseFloat(e.food_duration)},n.components[\"minecraft:use_animation\"]=e.food_animation),e.fuel_enabled&&(n.components[\"minecraft:fuel\"]={duration:10*parseFloat(e.fuel_duration)}),e.place_entity_enabled&&e.place_entity_id&&(n.components[\"minecraft:entity_placer\"]={entity:e.place_entity_id}),e.cooldown_enabled&&(n.components[\"minecraft:cooldown\"]={duration:e.cooldown_duration,category:e.cooldown_category||\"item_wizard\"}),a.push({name:`items/${t.item_filename}.item.json`,content:compileJSON({format_version:\"1.20.50\",\"minecraft:item\":n})}),a.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Behavior Pack\",uuid:t.bp_uuid||guid(),version:[1,0,0],min_engine_version:[1,20,0]},metadata:t.pack_metadata,modules:[{description:\"Behavior\",version:[1,0,0],uuid:guid(),type:\"data\"}],dependencies:[{uuid:t.rp_uuid,version:[1,0,0]}]})}),a.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon}),a}(e,{item_filename:o,rp_uuid:r,bp_uuid:i,pack_icon:l,pack_metadata:c}),u=await async function(e,t){let a,n,o=[],r=w[e.preset]||w.iron_ingot,i=r.texture,l=r.icon;if(window.ItemWizardProject.project&&(a=ModelProject.all.find((e=>e.uuid==window.ItemWizardProject.project))),window.ItemWizardProject.icon_project&&(n=ModelProject.all.find((e=>e.uuid==window.ItemWizardProject.icon_project))),n&&(l=n.textures[0].getDataURL()),e.attachable_model||e.wearable_enabled){let n=r.model;e.use_current_model&&Project&&!a&&(n=Codecs.bedrock.compile({raw:!0})[\"minecraft:geometry\"][0],Project.model_identifier=t.item_filename,Texture.all.length&&(i=Texture.getDefault().getDataURL())),a&&(a.select(),n=Codecs.bedrock.compile({raw:!0})[\"minecraft:geometry\"][0],a.textures[0]&&(i=a.textures[0].getDataURL())),n.description.identifier=\"geometry.\"+t.item_filename;let l={format_version:\"1.19.0\",\"minecraft:geometry\":[n]};window.ItemWizardProject.model=l,o.push({name:`models/entity/attachable/${t.item_filename}.geo.json`,model_file:!0,overwrite:!1,content:compileJSON(l)})}if(o.push({name:\"textures/item_texture.json\",merge:!0,content:compileJSON({texture_data:{[t.item_filename]:{textures:`textures/items/${t.item_filename}.png`}}})}),e.attachable_model||e.wearable_enabled){let n={identifier:e.identifier,render_controllers:[e.wearable_enabled?\"controller.render.armor\":\"controller.render.item_default\"],materials:{default:e.glint?\"entity_alphatest_glint\":\"entity_alphatest\",enchanted:\"entity_alphatest_glint\"},textures:{default:`textures/entity/attachable/${t.item_filename}`,enchanted:\"textures/misc/enchanted_item_glint\"},geometry:{default:\"geometry.\"+t.item_filename},animations:r.animations?{first_person_hold:`animation.${t.item_filename}.first_person_hold`,third_person_hold:`animation.${t.item_filename}.third_person_hold`}:void 0,scripts:r.animations?{animate:[{first_person_hold:\"c.is_first_person\"},{third_person_hold:\"!c.is_first_person\"}]}:void 0};if(o.push({name:`attachables/${t.item_filename}.attachable.json`,content:compileJSON({format_version:\"1.10.0\",\"minecraft:attachable\":{description:n}})}),r.animations){let e={format_version:\"1.8.0\",animations:{[`animation.${t.item_filename}.first_person_hold`]:r.animations.first_person_hold,[`animation.${t.item_filename}.third_person_hold`]:r.animations.third_person_hold}};a&&(e=Animator.buildFile()),o.push({name:`animations/attachables/${t.item_filename}.animation.json`,content:compileJSON(e)}),window.ItemWizardProject.animation=e}window.ItemWizardProject.texture=i,o.push({name:`textures/entity/attachable/${t.item_filename}.png`,type:\"image\",texture_file:!0,overwrite:!1,content:i})}window.ItemWizardProject.icon_texture=l,o.push({name:`textures/items/${t.item_filename}.png`,type:\"image\",texture_file:!0,overwrite:!1,content:l});let s=[`item.${e.identifier}=${e.display_name}`];return o.push({name:\"texts/en_US.lang\",merge:!0,content:s.join(\"\\n\")}),o.push({name:\"manifest.json\",setup_file:!0,content:compileJSON({format_version:2,header:{name:e.pack_name,description:e.pack_name+\" Resource Pack\",uuid:t.rp_uuid,version:[1,0,0],min_engine_version:[1,16,0]},metadata:t.pack_metadata,modules:[{description:e.pack_name,type:\"resources\",uuid:guid(),version:[1,0,0]}],dependencies:t.bp_uuid?[{uuid:t.bp_uuid,version:[1,0,0]}]:void 0})}),o.push({name:\"pack_icon.png\",setup_file:!0,type:\"image\",content:t.pack_icon}),o}(e,{item_filename:o,rp_uuid:r,bp_uuid:i,pack_icon:l,pack_metadata:c});if(\"folder\"==e.export_mode){s=PathModule.join(n,\"development_behavior_packs\",e.pack_name);try{a.readdirSync(s)}catch(g){a.mkdirSync(s,{recursive:!0})}d=PathModule.join(n,\"development_resource_packs\",e.pack_name);try{a.readdirSync(d)}catch(b){a.mkdirSync(d,{recursive:!0})}}else if(\"integrate\"==e.export_mode){function h(e){try{let t=a.readFileSync(e,{encoding:\"utf-8\"}),n=autoParseJSON(t,!1);n&&(n.metadata||(n.metadata={}),n.metadata.generated_with||(n.metadata.generated_with={}),n.metadata.generated_with.blockbench_item_wizard instanceof Array==0&&(n.metadata.generated_with.blockbench_item_wizard=[]),n.metadata.generated_with.blockbench_item_wizard.safePush(\"1.2.4\"),a.writeFileSync(e,compileJSON(n),{encoding:\"utf-8\"}))}catch(e){console.error(\"Unable to add generator to existing pack manifests\",e)}}s=e.integrate_pack.bp_path,d=e.integrate_pack.rp_path,h(PathModule.join(s,\"manifest.json\")),h(PathModule.join(d,\"manifest.json\"))}if(\"folder\"==e.export_mode||\"integrate\"==e.export_mode){function f(t,n){if(t.setup_file&&\"integrate\"==e.export_mode)return;let o=PathModule.join(n,t.name),r=PathModule.dirname(o);if(0!=t.overwrite||!a.existsSync(o)){if(function(e,t){try{x().readdirSync(e)}catch(t){x().mkdirSync(e,{recursive:!0})}}(r),\"integrate\"==e.export_mode&&t.merge&&a.existsSync(o)){let e=a.readFileSync(o,\"utf-8\");if(o.endsWith(\"json\"))try{e=autoParseJSON(e);let a=JSON.parse(t.content);$.extend(!0,a,e),t.content=compileJSON(a)}catch(e){}else o.endsWith(\"png\")||(t.content=e+\"\\n\"+t.content)}Blockbench.writeFile(o,{savetype:t.type,content:t.content}),e.use_current_model&&t.model_file&&Project&&(Project.export_path=o)}}p.forEach((e=>{f(e,s)})),u.forEach((e=>{f(e,d)}))}if(\"mcaddon\"==e.export_mode||\"integrate_mcaddon\"==e.export_mode){let v,_=\"integrate_mcaddon\"==e.export_mode,y=e.pack_name;if(v=_&&window.ItemWizardProject.previous_mcaddon?window.ItemWizardProject.previous_mcaddon:new JSZip,_){let C=!1;v.forEach(((e,t)=>{if(C)return;let a=e.split(\"/\");a.length>=2&&(y=a[0].replace(/\\s*(BP|Behavior|RP|Resources?)$/i,\"\"),C=!0)}))}async function z(e,t){if(e.setup_file&&_)return;let a=t+e.name;if(_&&e.merge&&v.file(a)){let t=await v.file(a).async(\"string\");if(a.endsWith(\"json\"))try{t=autoParseJSON(t);let a=JSON.parse(e.content);$.extend(!0,a,t),e.content=compileJSON(a)}catch(e){}else a.endsWith(\"png\")||(e.content=t+\"\\n\"+e.content)}e.setup_file&&_||(\"image\"==e.type&&(e.content=e.content.split(\",\")[1]),v.file(a,e.content,{base64:\"image\"==e.type||void 0,binary:\"buffer\"==e.type||void 0}))}for(let D of p)await z(D,y+\" Behavior/\");for(let S of u)await z(S,y+\" Resources/\");let M=await v.generateAsync({type:\"blob\"});isApp?Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:y,content:M,savetype:\"zip\"}):Blockbench.showMessageBox({title:\"Export Add-on\",commands:{download:\"Download File\"},buttons:[\"dialog.cancel\"]},(e=>{\"download\"==e&&Blockbench.export({type:\"Minecraft Add-on\",extensions:[\"mcaddon\"],name:y,content:M,savetype:\"zip\"})}))}return{rp_path:d,bp_path:s}})(this.form).then((e=>{this.resource_pack_path=e.rp_path,this.behavior_pack_path=e.bp_path,\"integrate\"===this.form.export_mode?Blockbench.showQuickMessage(\"Integrated into Resource and Behavior Pack\"):(Blockbench.notification(\"Export Successful\",\"Exported resource and behavior pack\"),Blockbench.showQuickMessage(\"Exported Resource and Behavior Pack\"))})),localStorage.setItem(\"minecraft_wizard.selected_edition\",this.form.edition)},openInstallInstructions(e){!function(e){new Dialog({title:\"Add-on Installation Instructions\",singleButton:!0,width:660,lines:[e.includes(\"mcaddon\")?$('<p style=\"line-height: normal;margin: 10px 0;\">To import the packs into Minecraft, open the downloaded .mcaddon file.</p>')[0]:\"\",$('<p style=\"line-height: normal;margin: 10px 0;\">To enable the addon, you need to add it to your Minecraft world.\\n\\t\\t\\t\\tOpen your world settings and locate the Behavior Packs section.\\n\\t\\t\\t\\tFind your new pack and activate it.\\n\\t\\t\\t\\tEnabling the behavior pack will also automatically activate the resource pack.</p>\\n\\t\\t\\t')[0],Interface.createElement(\"img\",{src:\"data:image/png;base64,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\",style:\"image-rendering: auto; max-width: 100%;\",width:\"660px\"})]}).show()}(e)},switchPage(e){let t=Object.keys(this.pages);if(t.indexOf(e)-t.indexOf(this.open_page)>0){\"preset\"==this.open_page&&(this.past_preset=!0);let a=t.indexOf(this.open_page);for(;this.open_page!=e;){if(a++,!this.checkPageComplete())return!1;\"export\"==t[a-1]&&this.exportPacks(),this.open_page=t[a]}}this.open_page=e},nextPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)+1];t?Dialog.open.sidebar.setPage(t):(Dialog.open.close(),function(e,t){let a=e.identifier.replace(/^.+:/,\"\");if(e.export_mode.includes(\"mcaddon\")||!isApp){let e={no_file:!0,content:JSON.stringify(window.ItemWizardProject.model),path:a+\".geo.json\"};return loadModelFile({no_file:!0,content:ItemWizardProject.icon_texture,path:`textures/items/${a}.png`}),window.ItemWizardProject.icon_project=Project.uuid,void setTimeout((()=>{loadModelFile(e),setTimeout((()=>{new Texture({name:a}).fromDataURL(window.ItemWizardProject.texture).add(!1),window.ItemWizardProject.project=Project.uuid,window.ItemWizardProject.animation&&Animator.loadFile({path:`animations/attachables/${a}.animation.json`,json:window.ItemWizardProject.animation})}),100)}),20)}Blockbench.read([PathModule.join(t,\"textures\",\"items\",`${a}.png`)],{},(e=>{loadModelFile(e[0])})),(e.attachable_model||e.wearable_enabled)&&Blockbench.read([PathModule.join(t,\"models\",\"entity\",\"attachable\",`${a}.geo.json`)],{},(async e=>{loadModelFile(e[0]),await new Promise((e=>setTimeout(e,200))),Project.updateThumbnail(),BarItems.tab_overview.click()}))}(this.form,this.resource_pack_path))},previousPage(){let e=Object.keys(this.pages),t=e[e.indexOf(this.open_page)-1];t&&Dialog.open.sidebar.setPage(t)},inputDisplayName(){if(this.has_customized_id)return;let e=(settings.username.value||\"myname\")+\":\"+this.form.display_name;e=e.toLowerCase().replace(/[- _.]+/g,\"_\").replace(/[^a-z0-9_:]/g,\"\"),this.form.identifier=e},getThumbnail:e=>`url('${e}')`,getMeleeDamageLabel(e){let t={0:\"No Damage\",1:\"Punch\",2:\"Wooden Shovel\",3:\"Wooden Pickaxe\",4:\"Wooden Axe\",5:\"Wooden Sword\",6:\"Stone Sword\",7:\"Iron Sword\",8:\"Diamond Sword\",9:\"Netherite Sword\",10:\"Kill Cow in one hit\",11:\"Sharpness II Diamond Sword\",12:\"Kill Cave Spider in one hit\",13:\"Sharpness III Netherite Sword\",14:\"Sharpness IV Netherite Sword\",15:\"Sharpness V Netherite Sword\",20:\"Kill Creeper in one hit\"};return t[e]?e+\" - Comparable to: \"+t[e]:e},getProtectionLabel(e){let t={0:\"No protection\",1:\"Leather Helmet\",2:\"Iron Helmet\",3:\"Diamond Helmet\",4:\"Chainmail Leggings\",5:\"Golden Chestplate\",6:\"Iron Chestplate\",7:\"Full Leather Armor\",8:\"Diamond Chestplate\",9:\"\",10:\"\",11:\"Full Golden Armor\",12:\"Full Chainmail Armor\",13:\"\",14:\"\",15:\"Full Iron Armor\",16:\"\",17:\"\",18:\"\",19:\"\",20:\"Full Diamond Armor\"};return t[e]?e+\" - Comparable to: \"+t[e]:e},getNutritionLabel(e){let t={0:\"No nutrition\",1:\"Potato\",2:\"Melon Slice\",3:\"Carrot\",4:\"Apple\",5:\"Bread\",6:\"Cooked Chicken\",8:\"Steak\",10:\"Rabbit Stew\",14:\"Entire Cake\",20:\"Full Nutrition\"};return t[e]?e+\" - Comparable to:\"+t[e]:e},copyGiveCommand(){let e=`/give @s ${this.form.identifier}`;Clipbench.setText(e),Blockbench.showQuickMessage(\"Command copied to clipboard\")}}},G=D(L,e,[function(){var e=this._self._c;return e(\"section\",[e(\"p\",{staticClass:\"description\"},[this._v(\"Select an item preset to get started!\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Stack Size\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"How many items can be combined into one stack\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Maximum Durability\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Select the durability that the item has when it's brand new\")])])},function(){var e=this,t=e._self._c;return t(\"ul\",{attrs:{id:\"item_durability_markers\"}},[t(\"li\",[e._v(\"Wood\")]),e._v(\" \"),t(\"li\",[e._v(\"Iron\")]),e._v(\" \"),t(\"li\",[e._v(\"Diamond\")]),e._v(\" \"),t(\"li\",[e._v(\"Netherite\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Repair Amount\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Set how much one item will repair, in percent. In vanilla Minecraft, this is always 25%.\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Value\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"The enchantment value determines the amount and quality of enchantments that can be achieved. The \"),t(\"a\",{attrs:{href:\"https://wiki.bedrock.dev/items/item-components.html#enchantability-value\"}},[e._v(\"value of vanilla items\")]),e._v(\" ranges between 1 and 25.\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Eat Duration\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Set how long eating one item will take, in seconds.\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Saturation Modifier\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v('Saturation is a second hidden bar that \"extends\" the hunger bar. Nutrition multiplied by the Saturation Modifier determines the saturation level.')])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Can Always Eat\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"If enabled, the player will always be able to eat the item, even when not hungry\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Fuel Duration\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"How many items a furnace can process with by burning one of this item\")])])},function(){var e=this,t=e._self._c;return t(\"ul\",{attrs:{id:\"item_fuel_markers\"}},[t(\"li\",{attrs:{item:\"planks\"}},[e._v(\"Planks\")]),e._v(\" \"),t(\"li\",{attrs:{item:\"coal\"}},[e._v(\"Coal\")]),e._v(\" \"),t(\"li\",{attrs:{item:\"coal_block\"}},[e._v(\"Coal Block\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Cooldown Duration\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Set how long the item will need to cool down after being used, in seconds\")])])},function(){var e=this,t=e._self._c;return t(\"div\",[t(\"label\",[e._v(\"Icon Glint\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"Display the 2D icon with a shimmery glint, like it's enchanted\")])])},function(){var e=this,t=e._self._c;return t(\"section\",[t(\"label\",[e._v(\"To learn more about creating Minecraft addons, visit the \"),t(\"a\",{staticClass:\"open-in-browser\",attrs:{href:\"https://learn.microsoft.com/en-us/minecraft/creator/\",target:\"blank\",rel:\"noopener\"}},[e._v(\"Minecraft Bedrock Creator Portal\")]),e._v(\"!\")]),e._v(\" \"),t(\"p\",{staticClass:\"description\"},[e._v(\"(You can re-open this dialog to return to this page)\")])])}],!1,(function(e){var t=a(907);t.__inject__&&t.__inject__(e)}),null,\"2a3db55c\").exports,E=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTgwIgogICBoZWlnaHQ9IjQ2MCIKICAgdmlld0JveD0iMCAwIDI1OS4yOTE2NiAxMjEuNzA4MzQiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzQ0OTEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTIuMSByMTUzNzEiCiAgIHNvZGlwb2RpOmRvY25hbWU9InN0YXJ0X3NjcmVlbi5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM0NDg1IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIwLjQ5NDk3NDc1IgogICAgIGlua3NjYXBlOmN4PSI1NTUuMDY1ODUiCiAgICAgaW5rc2NhcGU6Y3k9IjIzLjA4OTk4NiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICB1bml0cz0icHgiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSI0NTEiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE0NDg4Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xNzUuMjkxNjUpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojMDIwMjAyO2ZpbGwtb3BhY2l0eTowLjE4O3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Im0gMjU5LjI1MTQ0LDIwOS42MDI4NSBjIC01MS4wNDg0OCwwIC0xMjIuMjcxODgsMTcuMzM0NTMgLTE2Ni4xMDQwNzYsMTguMTM2MzQgQyA0OS4zMTUxNjEsMjI4LjU0MSA1LjkxMTYwNDJlLTgsMjIyLjU3MjYgNS45MTE2MDQyZS04LDIyMi41NzI2IEwgLTAuMDU2MzM2OCwyNTAuODIwMDcgLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMjU5LjI5NjIzLDI5Ny4wMDI0MiBaIgogICAgICAgaWQ9InBhdGg1MDU5IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY3NjY2NjYyIgLz4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iZmlsbDojODY0YmE3O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDowLjI2NDU4MzMycHg7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGQ9Ik0gLTEuMjA3MTY2MmUtOCwyOTcuMDAyOTMgMC42OTk2NTIzNywyNTQuOTc3ODEgYyAwLDAgMzYuOTA3NDg2NjMsMTkuNjE3OTggODQuNzIzMDA3NjMsMjQuODI0MjYgNjUuOTU2ODQsNy4xODE1NCA5Ni4xMDM3NCwtNS42ODE2OCAxNDEuMzEwMDQsLTMuNjc4NTYgMjAuMTI5MTksMC44OTE5NCAyOS40ODQ1MSwzLjEwODU2IDMyLjYyNDkzLDMuNDQyNjQgbCAtMC4wNjE0LDE3LjQzNjI3IHoiCiAgICAgICBpZD0icGF0aDUwMzgtOSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2IzODdjMztmaWxsLW9wYWNpdHk6MC45NDExNzY0NztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC4yNjQ1ODMzMnB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICBkPSJNIC0xLjIwNzE2NjJlLTgsMjk3LjAwMjkzIC0wLjA1NjMzNjgsMjUwLjgyMDA3IGMgMCwwIDUzLjkxNzk0MTgsMzguOTk4MzcgMTEzLjQ0OTE5NjgsMzcuNDg2NDYgNDguMDgyNjEsLTEuMjIxMTUgNzMuOTg1ODksLTIuMDczMDggOTcuNTQwNzcsMC40NDI4MiAxOC4zMTU3MiwxLjk1NjMgNDguMzYyNiw4LjI1MzA3IDQ4LjM2MjYsOC4yNTMwNyB2IDAgeiIKICAgICAgIGlkPSJwYXRoNTAzOCIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjc3NjY2MiIC8+CiAgPC9nPgo8L3N2Zz4K\",W=\"data:image/png;base64,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\",Z=[];let Y,U;BBPlugin.register(\"minecraft_item_wizard\",{title:\"Minecraft Item Wizard\",author:\"JannisX11 & Mojang Studios\",icon:\"icon.png\",description:\"Create custom items for Minecraft: Bedrock Edition!\",tags:[\"Minecraft: Bedrock Edition\"],version:\"1.2.4\",min_version:\"4.8.0\",new_repository_format:!0,variant:\"both\",has_changelog:!0,bug_tracker:\"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",onload(){function e(){Vue.nextTick((()=>{Y.content_vue&&(Y.content_vue.current_tab_model=\"\",Project&&\"bedrock_block\"==Project.format.id&&(Y.content_vue.current_tab_model=Project.name||\"Block Model\"))}))}async function t(t){Dialog.open||await MinecraftEULA.promptUser(\"item_wizard\")&&(Y.content_vue&&Y.content_vue.form.display_name?Blockbench.showMessageBox({title:\"Item Wizard\",message:`Do you want to keep editing your current item \"${Y.content_vue.form.display_name}\", or do you want to start over?`,icon:\"delete\",buttons:[\"Continue\",\"Start New Item\"]},(t=>{1==t&&(Y.sidebar.setPage(\"metadata\"),Y.delete(),delete Y.object,window.ItemWizardProject={}),Y.show(),e()})):t?U.show():(Y.show(),e()))}window.ItemWizardProject={},U=new Dialog({id:\"minecraft_item_wizard_start\",title:\"Create an Item!\",width:740,padding:!1,buttons:[\"Create an Item!\"],lines:[\"<h2>Minecraft Item Wizard</h2>\",\"<p>Create custom items and export them as an addon!</p>\",\"<p>With the Item Wizard, you can add a new item to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench</p>\",`<img src=\"${W}\" />`],onConfirm(){setTimeout((()=>{Y.show(),e()}),10)}}),Y=new Dialog({id:\"minecraft_item_wizard\",title:\"Minecraft Item Wizard\",width:980,padding:!1,buttons:[\"Next\",\"dialog.cancel\"],sidebar:{pages:z,actions:[{id:\"documentation\",name:\"Documentation\",icon:\"description\",click(){Blockbench.openLink(\"https://learn.microsoft.com/en-us/minecraft/creator/documents/minecraftitemwizard\")}}],onPageSwitch(e){return this.dialog.content_vue.switchPage(e)}},component:G,onBuild(e){let t=Interface.createElement(\"div\",{id:\"item_wizard_back_button\",title:\"Go Back\"},Blockbench.getIconNode(\"arrow_back\"));t.onclick=()=>{Y.content_vue.previousPage()};let a=Interface.createElement(\"div\",{class:\"bar_spacer\"},[Interface.createElement(\"div\",{class:\"required_message\"},\" = Required\")]),n=e.querySelector(\".button_bar\");n.prepend(a),n.prepend(t)},onConfirm(){return this.content_vue.nextPage(),!1},onCancel(e){if(e&&\"blackout\"==e.target.id)return!1}});let a=new Action(\"open_minecraft_item_wizard\",{name:\"Minecraft Item Wizard\",icon:A,click(){t(!0)}});MenuBar.menus.filter.addAction(a),Z.push(a);let n=new Action(\"item_wizard_export_mcaddon\",{name:\"Export MCAddon (Item Wizard)\",icon:A,condition:()=>Y.content_vue&&Y.content_vue.form.display_name&&Y.content_vue.form.export_mode.includes(\"mcaddon\"),click(){Y.content_vue.exportPacks()}});MenuBar.menus.file.addAction(n,\"export.0\"),Z.push(n);let o=new ModelLoader(\"minecraft_item_wizard\",{name:\"Minecraft Item Wizard\",description:\"Create custom items and export them as an addon!\",icon:A,target:\"Minecraft: Bedrock Edition\",onStart(){t(!1)},format_page:{content:[{type:\"label\",text:\"Custom items allow you to expand your Minecraft experience with custom tools, weapons, food, and other objects.\"},{type:\"label\",text:\"With the Item Wizard, you can add a new item to your game in just a few simple steps. Once you are done, you will be able to edit the custom model in Blockbench.\"},{type:\"image\",source:W}],button_text:\"Create an Item!\"}});Z.push(o);let r=Blockbench.addCSS(`\\n\\t\\t\\t.format_entry[format=minecraft_item_wizard] {\\n\\t\\t\\t\\tcolor: #dd88ff;\\n\\t\\t\\t}\\n\\t\\t\\t#start_files .format_entry[format=minecraft_item_wizard]:hover {\\n\\t\\t\\t\\tcolor: #eec3ff;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t#format_page_minecraft_item_wizard {\\n\\t\\t\\t\\tbackground-image: url('${E}');\\n\\t\\t\\t\\tbackground-position: bottom;\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_item_wizard content {\\n\\t\\t\\t\\tmargin-top: -18px;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_item_wizard content > label {\\n\\t\\t\\t\\tmax-width: 404px;\\n\\t\\t\\t\\tmargin-bottom: 20px;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_item_wizard img {\\n\\t\\t\\t\\tmargin-top: -80px;\\n\\t\\t\\t\\tmargin-bottom: -75px;\\n\\t\\t\\t\\tmargin-left: calc(20% - -21px);\\n\\t\\t\\t\\twidth: 594px;\\n\\t\\t\\t\\tmax-width: 130%;\\n\\t\\t\\t}\\n\\t\\t\\t#format_page_minecraft_item_wizard .button_bar {\\n\\t\\t\\t\\tjustify-content: right;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\t#minecraft_item_wizard_start > .dialog_wrapper {\\n\\t\\t\\t\\tbackground-image: url('${E}');\\n\\t\\t\\t\\tbackground-position: bottom;\\n\\t\\t\\t\\tbackground-repeat: no-repeat;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_item_wizard_start content {\\n\\t\\t\\t\\toverflow: initial;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_item_wizard_start content > p {\\n\\t\\t\\t\\tmax-width: 454px;\\n\\t\\t\\t\\tmargin-bottom: 20px;\\n\\t\\t\\t\\tdisplay: block;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_item_wizard_start img {\\n\\t\\t\\t\\tmargin-top: -50px;\\n\\t\\t\\t\\tmargin-bottom: -72px;\\n\\t\\t\\t\\tmargin-left: calc(20% - -25px);\\n\\t\\t\\t\\twidth: 635px;\\n\\t\\t\\t\\tmax-width: 100%;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_item_wizard_start .button_bar {\\n\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t}\\n\\t\\t\\t#minecraft_item_wizard_start .button_bar button {\\n\\t\\t\\t\\twidth: 180px;\\n\\t\\t\\t\\theight: 40px;\\n\\t\\t\\t\\tmargin-top: 20px;\\n\\t\\t\\t}\\n\\n\\n\\t\\t\\tdialog#minecraft_item_wizard .dialog_sidebar_pages li {\\n\\t\\t\\t\\tpadding: 8px 20px;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_item_wizard .button_bar {\\n\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\talign-items: center;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_item_wizard .button_bar .bar_spacer {\\n\\t\\t\\t\\tflex-grow: 1;\\n\\t\\t\\t\\ttext-align: left;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_item_wizard .required_message {\\n\\t\\t\\t\\tpadding-top: 5px;\\n\\t\\t\\t\\tpadding-left: 16px;\\n\\t\\t\\t}\\n\\t\\t\\tdialog#minecraft_item_wizard .required_message::before, #item_wizard_wrapper label.required::after {\\n\\t\\t\\t\\tcontent: \"*\";\\n\\t\\t\\t\\tfont-size: 1.2em;\\n\\t\\t\\t\\tline-height: 0;\\n\\t\\t\\t\\tvertical-align: inherit;\\n\\t\\t\\t\\tcolor: var(--color-accent);\\n\\t\\t\\t}\\n\\t\\t`);Z.push(r)},onunload(){Z.forEach((e=>e.delete()))}})})()})();"
  },
  {
    "path": "plugins/minecraft_title_generator/about.md",
    "content": "<div id=\"about-content\">\n  <img src=\"https://ewanhowell.com/assets/images/plugins/minecraft-title-generator/logo.webp\" />\n  <p>This plugin adds a new format that allows you to create Minecraft-styled title models that you can render in high quality.</p>\n  <h2>Getting started</h2>\n  <p>To use this plugin, start by creating a new <strong>Minecraft Title</strong> project from the start screen, or go to <strong>File > New > Minecraft Title</strong> You can then use the pop-up dialog to add some text to the project. Don't forget to set the text type! You can add more text by using the <strong>Add Text</strong> button <i class=\"icon material-icons\" style=\"translate:0 5px\">text_fields</i> in the outliner.</p>\n  <p>Once you are done configuring your text, you can go to the <strong>Render</strong> tab at the top right to produce a high-quality render of your title. The <strong>Position Camera</strong> button <i class=\"icon material-icons\" style=\"translate:0 5px\">auto_mode</i> will set the camera angle for you.</p>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 128px;\n    object-fit: contain;\n    margin: 16px 0 24px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n  <a href=\"https://github.com/ewanhowell5195/MinecraftTitleGenerator/\">\n    <i class=\"fa_big icon fab fa-github\" style=\"color: #6E40C9;\"></i>\n    <p>Submit Textures and Fonts</p>\n  </a>\n  <a href=\"https://youtu.be/iGaufrACVj4\">\n    <i class=\"fa_big icon fab fa-youtube\" style=\"color: #FF4444;\"></i>\n    <p>Tutorial</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/minecraft_title_generator/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2023-06-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2023-06-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed resetting all tabs\"\n        ]\n      }\n    ]\n  },\n  \"1.0.2\": {\n    \"title\": \"1.0.2\",\n    \"date\": \"2023-06-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added overlay opacity slider\",\n          \"Added colour opacity slider\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Checkbox containers are now labels\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed missing pointer cursors\",\n          \"Fixed debug mode duplicating textures\",\n          \"Fixed plugin about action not getting removed on plugin unload\",\n          \"Fixed anchor links in Blockbench webapp\",\n          \"Fixed gradient overlay scaling\"\n        ]\n      }\n    ]\n  },\n  \"1.0.3\": {\n    \"title\": \"1.0.3\",\n    \"date\": \"2023-06-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed for Safari versions older than version 16.4\"\n        ]\n      }\n    ]\n  },\n  \"1.0.4\": {\n    \"title\": \"1.0.4\",\n    \"date\": \"2023-06-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"V\\\" character in the built-in font\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2023-06-21\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Tweak the \\\"Small\\\" text size\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Fonts can now change the example text\"\n        ]\n      }\n    ]\n  },\n  \"1.1.1\": {\n    \"title\": \"1.1.1\",\n    \"date\": \"2023-06-23\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Optimise the models in the built-in font\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2023-08-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added new Minecraft Title texture preset export options\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The plugin now has an image icon\",\n          \"The Minecraft Title angle is now automatically loaded on project creation\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Update to new plugin repository format\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"The built-in font and overlay will now have a working thumbnail when there is no internet connection\"\n        ]\n      }\n    ]\n  },\n  \"1.2.1\": {\n    \"title\": \"1.2.1\",\n    \"date\": \"2023-09-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added a warning when there is no internet connection\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Switch to jsDelivr CDN\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"The built-in font and overlay will now have a working thumbnail when there is no internet connection\"\n        ]\n      }\n    ]\n  },\n  \"1.3.0\": {\n    \"title\": \"1.3.0\",\n    \"date\": \"2023-09-23\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added font variants\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Added CDN url fallback system\",\n          \"Font variants are a breaking change so the sources have been moved to a temporary dev branch\"\n        ]\n      }\n    ]\n  },\n  \"1.3.1\": {\n    \"title\": \"1.3.1\",\n    \"date\": \"2023-09-28\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Switch back to main branch\"\n        ]\n      }\n    ]\n  },\n  \"1.3.2\": {\n    \"title\": \"1.3.2\",\n    \"date\": \"2023-10-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Aspect ratio calculation fix\"\n        ]\n      }\n    ]\n  },\n  \"1.3.3\": {\n    \"title\": \"1.3.3\",\n    \"date\": \"2023-10-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed fonts that are flat\"\n        ]\n      }\n    ]\n  },\n  \"1.3.4\": {\n    \"title\": \"1.3.4\",\n    \"date\": \"2023-11-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Blockbench will now wait for Minecraft Title Generator to load before finishing loading\"\n        ]\n      }\n    ]\n  },\n  \"1.3.5\": {\n    \"title\": \"1.3.5\",\n    \"date\": \"2023-12-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Fonts can now list their available characters\",\n          \"Font variants now have their own tab\",\n          \"Added more info button on fonts\",\n          \"Fonts can now have descriptions\",\n          \"Increased max font list height\"\n        ]\n      }\n    ]\n  },\n  \"1.3.6\": {\n    \"title\": \"1.3.6\",\n    \"date\": \"2023-12-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Removed font \\\"width\\\" property\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed debug mode thumbnails\"\n        ]\n      }\n    ]\n  },\n  \"1.4.0\": {\n    \"title\": \"1.4.0\",\n    \"date\": \"2024-02-21\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added \\\"Tileables\\\". Tileables are a texture type that tiles a texture over the faces of each character\",\n          \"Added new render output Dialog with more customisation options\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added required EULA agreement\",\n          \"Added confirmation check for deleting presets\",\n          \"Updated number sliders to use Blockbench numeric inputs\",\n          \"Font and texture thumbnails now lazy load\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed backup CDN for if a CDN goes down after you have opened Blockbench and used the plugin\"\n        ]\n      }\n    ]\n  },\n  \"1.4.1\": {\n    \"title\": \"1.4.1\",\n    \"date\": \"2024-02-26\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed ability to bypass EULA agreement\"\n        ]\n      }\n    ]\n  },\n  \"1.5.0\": {\n    \"title\": \"1.5.0\",\n    \"date\": \"2024-05-10\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Made the position camera button a main button with a new icon\",\n          \"Render buttons now have tooltips\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed render controls disappearing for some people\",\n          \"Fixed render controls missing in Blockbench v4.10.0\"\n        ]\n      }\n    ]\n  },\n  \"1.5.1\": {\n    \"title\": \"1.5.1\",\n    \"date\": \"2024-06-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Added a class to the format page so it can be easily targetted by themes\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed Vue.js warnings\"\n        ]\n      }\n    ]\n  },\n  \"1.6.0\": {\n    \"title\": \"1.6.0\",\n    \"date\": \"2024-06-09\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The texture search bar can now be cleared with a button\",\n          \"The texture search bar will now be automatically focused when switching tab\",\n          \"Added the ability to remove the custom overlay texture\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed resetting the font selection page\",\n          \"Fixed resetting texture and overlay pages when a custom texture is loaded\"\n        ]\n      }\n    ]\n  },\n  \"1.6.1\": {\n    \"title\": \"1.6.1\",\n    \"date\": \"2024-07-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed selected items to use the select colour instead of the button colour\"\n        ]\n      }\n    ]\n  },\n  \"1.7.0\": {\n    \"title\": \"1.7.0\",\n    \"date\": \"2024-08-31\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Fonts now support setting a default character spacing\"\n        ]\n      }\n    ]\n  },\n  \"1.8.0\": {\n    \"title\": \"1.8.0\",\n    \"date\": \"2025-02-24\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Fonts now support character shifting. This adjusts the spacing between specific characters to improve readability by slightly modifying their positions when placed next to each other\",\n          \"Fonts now support custom widths for the spaces between words\",\n          \"Added the ability to disable the built-in overlay texture included with some fonts. These are normally only applied when using gradient or tileable textures\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed built-in font overlay textures using the wrong blend method\",\n          \"Fixed some settings possibly not loading properly when loading a preset\"\n        ]\n      }\n    ]\n  },\n  \"1.8.1\": {\n    \"title\": \"1.8.1\",\n    \"date\": \"2025-02-24\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed enabling line terminators causing a crash\"\n        ]\n      }\n    ]\n  },\n  \"1.9.0\": {\n    \"title\": \"1.9.0\",\n    \"date\": \"2025-03-08\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added \\\"Shapes\\\". Shapes are a new type of element that can be added, as an alternative to text/fonts\",\n          \"\\\"Minecraft Title\\\" is now available as an angle from the \\\"Angles\\\" context menu\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Textures are now upscaled to the maximum size when enabling the fade edges to the border colour feature, in order to make a smoother gradient\",\n          \"Fade edges to the border colour is now automatically selected when selecting the bottom text type\",\n          \"Words with only one character will no longer contain a subgroup for that character\",\n          \"Tileable texture resolution is now 1-4 instead of 1000-4000\",\n          \"Improved the loading time of the plugin dialogs first load\",\n          \"Redesigned the presets menu\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed loading presets with font variants\",\n          \"Fixed being unable to create presets when one already exists\"\n        ]\n      }\n    ]\n  },\n  \"1.9.1\": {\n    \"title\": \"1.9.1\",\n    \"date\": \"2025-03-08\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed presets not loading all settings properly\"\n        ]\n      }\n    ]\n  },\n  \"1.9.2\": {\n    \"title\": \"1.9.2\",\n    \"date\": \"2025-05-28\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed being unable to add new text when opening an existing Minecraft Title project\"\n        ]\n      }\n    ]\n  },\n  \"1.10.0\": {\n    \"title\": \"1.10.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  },\n  \"1.10.1\": {\n    \"title\": \"1.10.1\",\n    \"date\": \"2025-10-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed custom textures failing to load\"\n        ]\n      }\n    ]\n  },\n  \"1.10.2\": {\n    \"title\": \"1.10.2\",\n    \"date\": \"2025-10-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed select menu styling\"\n        ]\n      }\n    ]\n  },\n  \"1.10.3\": {\n    \"title\": \"1.10.3\",\n    \"date\": \"2025-11-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Updated preset button styles to match the Blockbench 5.0 button design\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed presets failing to load\"\n        ]\n      }\n    ]\n  },\n  \"1.10.4\": {\n    \"title\": \"1.10.4\",\n    \"date\": \"2026-04-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Made the repository branch easier to change in the code for testing purposes\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"Failed to load textures and fonts\\\" warning showing when the fallback URL loaded successfully\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/minecraft_title_generator/minecraft_title_generator.js",
    "content": "(async () => {\n  const repo = \"ewanhowell5195/MinecraftTitleGenerator\"\n  const branch = \"main\"\n  const thumbnail = \"data:image/webp;base64,UklGRlgAAABXRUJQVlA4TEsAAAAvX8AKEBcw//M///MfgAe2jSQp2iSPOr+nSXPHOng7ov8TUKa/ZLlkuWT5VVyOy1FKKXNFRBwtJ0mU3YktcTmu31JKKVPklPlPZXoA\"\n  const shapeThumbnail = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAsAQMAAAA+dijMAAAABlBMVEUAAAD///+l2Z/dAAAAE0lEQVQIW2NggAP7////DAcCDgA7eYDpLi6r7QAAAABJRU5ErkJggg==\"\n  const fonts = {\n    \"minecraft-ten\": {\n      name: \"Minecraft Ten\",\n      type: \"font\",\n      thumbnail,\n      characters: {\"0\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0,5.4,0.448,7.4],\"south\":[0.448,5.4,0,7.4],\"up\":[0.448,5.4,0,4.3],\"down\":[0.448,8.5,0,7.4]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"1\":[{\"from\":[-2,2,-3],\"to\":[18,42,19],\"faces\":{\"north\":[0.48,5.4,0.8,7.4],\"south\":[0.8,5.4,0.48,7.4],\"up\":[0.8,5.4,0.48,4.3],\"down\":[0.8,8.5,0.48,7.4]}},{\"from\":[12,44,21],\"to\":[-4,0,-5],\"faces\":{\"north\":[0.016,13.35,0,13.3],\"east\":[0.016,13.35,0,13.3],\"south\":[0.016,13.35,0,13.3],\"west\":[0.528,14.2,0.544,13.65],\"up\":[0.016,13.35,0,13.3],\"down\":[0.016,13.35,0,13.3]}},{\"from\":[20,40,21],\"to\":[12,28,-5],\"faces\":{\"north\":[0.016,13.35,0,13.3],\"south\":[0.016,13.35,0,13.3],\"west\":[0.016,13.35,0,13.3],\"up\":[0.016,13.35,0,13.3],\"down\":[0.016,13.35,0,13.3]}}],\"2\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0.832,5.4,1.28,7.4],\"south\":[1.28,5.4,0.832,7.4],\"up\":[1.28,5.4,0.832,4.3],\"down\":[1.28,8.5,0.832,7.4]}},{\"from\":[8,28,-5],\"to\":[24,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,12,-5],\"to\":[8,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.032,13.85,0,14.4],\"east\":[0.016,13.85,0.032,14.4],\"south\":[0,13.85,0.032,14.4],\"west\":[0,13.85,0.016,14.4],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"3\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[1.312,5.4,1.76,7.4],\"south\":[1.76,5.4,1.312,7.4],\"up\":[1.76,5.4,1.312,4.3],\"down\":[1.76,8.5,1.312,7.4]}},{\"from\":[8,28,-5],\"to\":[24,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[8,12,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.08,13.3,0.048,13.85],\"east\":[0.016,13.3,0,13.35],\"south\":[0.048,13.3,0.08,13.85],\"west\":[0.064,13.3,0.048,13.85],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"4\":[{\"from\":[-10,2,-3],\"to\":[26,42,19],\"faces\":{\"north\":[1.792,5.4,2.368,7.4],\"south\":[2.368,5.4,1.792,7.4],\"up\":[2.368,5.4,1.792,4.3],\"down\":[2.368,8.5,1.792,7.4]}},{\"from\":[-12,20,-5],\"to\":[-8,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-12,0,-5],\"to\":[-8,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[8,0,-5],\"to\":[28,8,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,20,-5],\"to\":[28,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,28,-5],\"to\":[24,36,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,36,-5],\"to\":[20,40,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[8,40,-5],\"to\":[16,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[28,44,21],\"to\":[-12,0,-5],\"faces\":{\"north\":[0.704,14.4,0.544,13.85],\"east\":[0.544,14.4,0.56,13.85],\"south\":[0.544,14.4,0.704,13.85],\"west\":[0.544,14.4,0.56,13.85],\"up\":[0.544,13.9,0.704,13.85],\"down\":[0.544,13.9,0.704,13.85]}}],\"5\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[2.4,5.4,2.848,7.4],\"south\":[2.848,5.4,2.4,7.4],\"up\":[2.848,5.4,2.4,4.3],\"down\":[2.848,8.5,2.4,7.4]}},{\"from\":[8,12,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.85,0.032,14.4],\"east\":[0,13.85,0.016,14.4],\"south\":[0.032,13.85,0,14.4],\"west\":[0.016,13.85,0.032,14.4],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"6\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[2.88,5.4,3.328,7.4],\"south\":[3.328,5.4,2.88,7.4],\"up\":[3.328,5.4,2.88,4.3],\"down\":[3.328,8.5,2.88,7.4]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.512,14.4,0.544,13.85],\"east\":[0.512,14.4,0.528,13.85],\"south\":[0.544,14.4,0.512,13.85],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"7\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[3.36,5.4,3.808,7.4],\"south\":[3.808,5.4,3.36,7.4],\"up\":[3.808,5.4,3.36,4.3],\"down\":[3.808,8.5,3.36,7.4]}},{\"from\":[0,0,-5],\"to\":[4,8,21],\"faces\":{\"east\":[0.016,13.3,0,13.35],\"up\":[0.016,13.3,0,13.35]}},{\"from\":[-4,8,-5],\"to\":[0,16,21],\"faces\":{\"east\":[0.016,13.3,0,13.35],\"up\":[0.016,13.3,0,13.35]}},{\"from\":[-8,16,-5],\"to\":[-4,24,21],\"faces\":{\"east\":[0.016,13.3,0,13.35],\"up\":[0.016,13.3,0,13.35]}},{\"from\":[8,28,-5],\"to\":[24,32,21],\"faces\":{\"west\":[0.016,13.3,0,13.35],\"up\":[0.016,13.3,0,13.35]}},{\"from\":[20,12,21],\"to\":[16,0,-5],\"faces\":{\"west\":[0.016,13.3,0,13.35],\"down\":[0.016,13.3,0,13.35]}},{\"from\":[16,20,21],\"to\":[12,12,-5],\"faces\":{\"west\":[0.016,13.3,0,13.35],\"down\":[0.016,13.3,0,13.35]}},{\"from\":[12,28,21],\"to\":[8,20,-5],\"faces\":{\"west\":[0.016,13.3,0,13.35],\"down\":[0.016,13.3,0,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.752,13.85,0.624,13.3],\"east\":[0.752,13.85,0.736,13.3],\"south\":[0.624,13.85,0.752,13.3],\"west\":[0.64,13.85,0.624,13.3],\"up\":[0.624,13.85,0.752,13.8],\"down\":[0.016,13.3,0,13.35]}}],\"8\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[3.84,5.4,4.288,7.4],\"south\":[4.288,5.4,3.84,7.4],\"up\":[4.288,5.4,3.84,4.3],\"down\":[4.288,8.5,3.84,7.4]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"9\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[4.32,5.4,4.768,7.4],\"south\":[4.768,5.4,4.32,7.4],\"up\":[4.768,5.4,4.32,4.3],\"down\":[4.768,8.5,4.32,7.4]}},{\"from\":[8,12,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.544,13.85,0.512,14.4],\"east\":[0,13.3,0.016,13.35],\"south\":[0.512,13.85,0.544,14.4],\"west\":[0.512,13.85,0.528,14.4],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"!\":[{\"from\":[2,2,-3],\"to\":[14,42,19],\"faces\":{\"north\":[10.144,5.4,10.336,7.4],\"south\":[10.144,5.4,10.336,7.4],\"up\":[10.336,5.4,10.144,4.3],\"down\":[10.336,8.5,10.144,7.4]}},{\"from\":[16,44,21],\"to\":[0,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"#\":[{\"from\":[-10,2,-3],\"to\":[26,42,19],\"faces\":{\"north\":[5.344,5.4,5.92,7.4],\"south\":[5.92,5.4,5.344,7.4],\"up\":[5.92,5.4,5.344,4.3],\"down\":[5.92,8.5,5.344,7.4]}},{\"from\":[28,36,21],\"to\":[24,24,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[28,20,21],\"to\":[24,8,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,20,21],\"to\":[-12,8,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,36,21],\"to\":[-12,24,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0.704,13.85,0.72,14.4],\"south\":[0,13.3,0.016,13.35],\"west\":[0.704,13.85,0.72,14.4],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"$\":[{\"from\":[-6,-2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0.928,9.7,1.376,11.9],\"south\":[1.376,9.7,0.928,11.9],\"up\":[1.376,9.7,0.928,8.6],\"down\":[1.376,13.2,0.928,12.1]}},{\"from\":[24,38,21],\"to\":[-8,2,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0.016,13.3,0,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[1.232,14.3,1.488,14.35],\"down\":[1.232,14.3,1.488,14.35]}},{\"from\":[14,2,21],\"to\":[2,-4,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[14,44,21],\"to\":[2,38,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"%\":[{\"from\":[-10,2,-3],\"to\":[26,42,19],\"faces\":{\"north\":[13.344,5.4,13.92,7.4],\"south\":[13.92,5.4,13.344,7.4],\"up\":[13.92,5.4,13.344,4.3],\"down\":[13.92,8.5,13.344,7.4]}},{\"from\":[20,16,-5],\"to\":[28,24,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[12,24,-5],\"to\":[28,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0.016,13.35,0.048,13.4]}},{\"from\":[4,36,-5],\"to\":[12,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[4,0,-5],\"to\":[12,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-12,16,-5],\"to\":[4,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0.048,13.35,0.016,13.4],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-12,20,-5],\"to\":[-4,28,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[28,44,21],\"to\":[-12,0,-5],\"faces\":{\"north\":[1.024,13.85,1.104,14.4],\"east\":[1.024,13.85,1.04,14.4],\"south\":[1.104,13.85,1.024,14.4],\"west\":[1.088,13.85,1.104,14.4],\"up\":[1.024,14.35,1.104,14.4],\"down\":[1.024,13.85,1.104,13.9]}}],\"&\":[{\"from\":[-8,2,-3],\"to\":[24,42,19],\"faces\":{\"north\":[4.8,5.4,5.312,7.4],\"south\":[5.312,5.4,4.8,7.4],\"up\":[5.312,5.4,4.8,4.3],\"down\":[5.312,8.5,4.8,7.4]}},{\"from\":[-6,24,-5],\"to\":[-2,28,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,24,21],\"to\":[-10,16,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,12,21],\"to\":[-10,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[26,44,21],\"to\":[-6,0,-5],\"faces\":{\"north\":[0.736,14.4,0.864,13.85],\"east\":[0.72,14.4,0.736,13.85],\"south\":[0.864,14.4,0.736,13.85],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"'\":[{\"from\":[2,22,-3],\"to\":[14,42,19],\"faces\":{\"north\":[11.328,5.4,11.52,6.4],\"south\":[11.52,5.4,11.328,6.4],\"up\":[11.52,5.4,11.328,4.3],\"down\":[11.52,8.5,11.328,7.4]}},{\"from\":[12,20,-5],\"to\":[16,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,44,21],\"to\":[0,20,-5],\"faces\":{\"north\":[0.096,13.6,0.16,13.9],\"east\":[0,13.3,0.016,13.35],\"south\":[0.16,13.6,0.096,13.9],\"west\":[0.032,13.6,0.016,13.9],\"up\":[0.144,13.3,0.08,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"(\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[5.952,5.4,6.4,7.4],\"south\":[6.4,5.4,5.952,7.4],\"up\":[6.4,5.4,5.952,4.3],\"down\":[6.4,8.5,5.952,7.4]}},{\"from\":[16,36,-5],\"to\":[24,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,12,-5],\"to\":[0,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,0,-5],\"to\":[24,8,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-8,24,-5],\"to\":[0,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[0,20,-5],\"to\":[8,24,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.816,13.3,0.752,13.85],\"east\":[0.8,13.3,0.816,13.85],\"south\":[0.752,13.3,0.816,13.85],\"west\":[0.752,13.3,0.768,13.85],\"up\":[0.752,13.3,0.816,13.35],\"down\":[0.752,13.3,0.816,13.35]}}],\")\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[6.432,5.4,6.88,7.4],\"south\":[6.88,5.4,6.432,7.4],\"up\":[6.88,5.4,6.432,4.3],\"down\":[6.88,8.5,6.432,7.4]}},{\"from\":[8,20,-5],\"to\":[16,24,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,36,-5],\"to\":[0,44,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,12,-5],\"to\":[24,20,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,0,-5],\"to\":[0,8,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,24,-5],\"to\":[24,32,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.752,13.3,0.816,13.85],\"east\":[0.752,13.3,0.768,13.85],\"south\":[0.816,13.3,0.752,13.85],\"west\":[0.8,13.3,0.816,13.85],\"up\":[0.816,13.3,0.752,13.35],\"down\":[0.816,13.3,0.752,13.35]}}],\"+\":[{\"from\":[-4,10,-3],\"to\":[20,34,19],\"faces\":{\"north\":[11.552,5.8,11.936,7],\"south\":[11.936,5.8,11.552,7],\"up\":[11.936,5.4,11.552,4.3],\"down\":[11.936,8.5,11.552,7.4]}},{\"from\":[14,28,-5],\"to\":[22,36,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,28,-5],\"to\":[2,36,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,8,-5],\"to\":[2,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[14,8,-5],\"to\":[22,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[22,36,21],\"to\":[-6,8,-5],\"faces\":{\"north\":[0.96,13.3,1.072,13.65],\"east\":[1.056,13.3,1.072,13.65],\"south\":[0.96,13.3,1.072,13.65],\"west\":[0.96,13.3,0.976,13.65],\"up\":[0.96,13.6,1.072,13.65],\"down\":[0.96,13.3,1.072,13.35]}}],\",\":[{\"from\":[2,-6,-3],\"to\":[14,14,19],\"faces\":{\"north\":[0,11.1,0.192,12.1],\"south\":[0.192,11.1,0,12.1],\"up\":[0.192,9.7,0,8.6],\"down\":[0.192,13.2,0,12.1]}},{\"from\":[12,-8,-5],\"to\":[16,0,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,16,21],\"to\":[0,-8,-5],\"faces\":{\"north\":[0.096,13.6,0.16,13.9],\"east\":[0,13.3,0.016,13.35],\"south\":[0.16,13.6,0.096,13.9],\"west\":[0.032,13.6,0.016,13.9],\"up\":[0.144,13.3,0.08,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"-\":[{\"from\":[0,18,-3],\"to\":[16,26,19],\"faces\":{\"north\":[10.816,6.2,11.072,6.6],\"south\":[11.072,6.2,10.816,6.6],\"up\":[11.072,5.4,10.816,4.3],\"down\":[11.072,8.5,10.816,7.4]}},{\"from\":[18,28,21],\"to\":[-2,16,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\".\":[{\"from\":[2,2,-3],\"to\":[14,14,19],\"faces\":{\"north\":[10.368,6.8,10.56,7.4],\"south\":[10.56,6.8,10.368,7.4],\"up\":[10.56,5.4,10.368,4.3],\"down\":[10.56,8.5,10.368,7.4]}},{\"from\":[16,16,21],\"to\":[0,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\";\":[{\"from\":[16,36,21],\"to\":[0,20,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[2,-6,-3],\"to\":[14,34,19],\"faces\":{\"north\":[0.224,10.1,0.416,12.1],\"south\":[0.416,10.1,0.224,12.1],\"up\":[0.416,9.7,0.224,8.6],\"down\":[0.416,13.2,0.224,12.1]}},{\"from\":[12,-8,-5],\"to\":[16,0,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,16,21],\"to\":[0,-8,-5],\"faces\":{\"north\":[0.096,13.6,0.16,13.9],\"east\":[0,13.3,0.016,13.35],\"south\":[0.16,13.6,0.096,13.9],\"west\":[0.032,13.6,0.016,13.9],\"up\":[0.144,13.3,0.08,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"=\":[{\"from\":[-4,10,-3],\"to\":[20,34,19],\"faces\":{\"north\":[11.968,5.8,12.352,7],\"south\":[12.352,5.8,11.968,7],\"up\":[12.352,5.4,11.968,4.3],\"down\":[12.352,8.5,11.968,7.4]}},{\"from\":[-6,20,-5],\"to\":[22,24,21],\"faces\":{\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[22,36,21],\"to\":[-6,8,-5],\"faces\":{\"north\":[0.736,13.9,0.752,14.25],\"east\":[0.736,13.9,0.752,14.25],\"south\":[0.736,13.9,0.752,14.25],\"west\":[0.736,13.9,0.752,14.25],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"@\":[{\"from\":[-14,-6,-3],\"to\":[30,42,19],\"faces\":{\"north\":[1.408,9.7,2.112,12.1],\"south\":[2.112,9.7,1.408,12.1],\"up\":[2.112,9.7,1.408,8.6],\"down\":[2.112,13.2,1.408,12.1]}},{\"from\":[28,40,-5],\"to\":[32,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[0,30,-5],\"to\":[16,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[0,16,-5],\"to\":[4,18,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[28,-8,-5],\"to\":[32,-4,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-16,40,-5],\"to\":[-12,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[32,44,21],\"to\":[-16,4,-5],\"faces\":{\"north\":[1.68,14.3,1.296,13.3],\"east\":[1.68,14.3,1.664,13.3],\"south\":[1.296,14.3,1.68,13.3],\"west\":[1.312,14.3,1.296,13.3],\"up\":[1.632,14.3,1.44,14.35],\"down\":[1.68,13.35,1.296,13.3]}},{\"from\":[32,4,21],\"to\":[-4,-8,-5],\"faces\":{\"north\":[1.824,13.45,1.68,13.3],\"east\":[0,13.3,0.016,13.35],\"south\":[1.68,13.45,1.824,13.3],\"west\":[1.68,13.45,1.696,13.3],\"up\":[1.68,13.4,1.824,13.45]}}],\"a\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0.48,1.1,0.928,3.1],\"south\":[0.928,1.1,0.48,3.1],\"up\":[0.928,1.1,0.48,0],\"down\":[0.928,4.2,0.48,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"*\":[{\"from\":[-4,18,-3],\"to\":[20,42,19],\"faces\":{\"north\":[14.304,5.4,14.688,6.6],\"south\":[14.688,5.4,14.304,6.6],\"up\":[14.688,5.4,14.304,4.3],\"down\":[14.688,8.5,14.304,7.4]}},{\"from\":[6,40,-5],\"to\":[10,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[6,16,-5],\"to\":[10,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[18,28,-5],\"to\":[22,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,28,-5],\"to\":[-2,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[22,44,21],\"to\":[-6,16,-5],\"faces\":{\"north\":[1.072,13.65,1.184,13.3],\"east\":[1.168,13.65,1.184,13.3],\"south\":[1.072,13.65,1.184,13.3],\"west\":[1.072,13.65,1.088,13.3],\"up\":[1.072,13.65,1.184,13.6],\"down\":[1.072,13.35,1.184,13.3]}}],\"b\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0.96,1.1,1.408,3.1],\"south\":[1.408,1.1,0.96,3.1],\"up\":[1.408,1.1,0.96,0],\"down\":[1.408,4.2,0.96,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"\\\\\":[{\"from\":[-10,2,-3],\"to\":[26,42,19],\"faces\":{\"north\":[9.056,5.4,9.632,7.4],\"south\":[9.632,5.4,9.056,7.4],\"up\":[9.632,5.4,9.056,4.3],\"down\":[9.632,8.5,9.056,7.4]}},{\"from\":[4,36,-5],\"to\":[12,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-4,24,-5],\"to\":[4,36,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-12,16,-5],\"to\":[-4,24,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,20,-5],\"to\":[28,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[12,8,-5],\"to\":[20,20,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[4,0,-5],\"to\":[12,8,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[28,44,21],\"to\":[-12,0,-5],\"faces\":{\"north\":[0.96,13.85,0.88,14.4],\"east\":[0.944,13.85,0.96,14.4],\"south\":[0.88,13.85,0.96,14.4],\"west\":[0.88,13.85,0.896,14.4],\"up\":[0.88,13.85,0.96,13.9],\"down\":[0.88,14.35,0.96,14.4]}}],\"c\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[1.44,1.1,1.888,3.1],\"south\":[1.888,1.1,1.44,3.1],\"up\":[1.888,1.1,1.44,0],\"down\":[1.888,4.2,1.44,3.1]}},{\"from\":[-8,12,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0.016,13.3,0,13.35],\"up\":[0.016,13.3,0,13.35],\"down\":[0.016,13.3,0,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.032,13.3,0,13.85],\"east\":[0.032,13.3,0.016,13.85],\"south\":[0,13.3,0.032,13.85],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\":\":[{\"from\":[16,36,21],\"to\":[0,20,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[2,2,-3],\"to\":[14,34,19],\"faces\":{\"north\":[10.592,5.8,10.784,7.4],\"south\":[10.784,5.8,10.592,7.4],\"up\":[10.784,5.4,10.592,4.3],\"down\":[10.784,8.5,10.592,7.4]}},{\"from\":[16,16,21],\"to\":[0,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"😳\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[0,1.1,0.448,3.1],\"south\":[0.448,1.1,0,3.1],\"up\":[0.448,1.1,0,0],\"down\":[0.448,4.2,0,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"d\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[1.92,1.1,2.368,3.1],\"south\":[2.368,1.1,1.92,3.1],\"up\":[2.368,1.1,1.92,0],\"down\":[2.368,4.2,1.92,3.1]}},{\"from\":[-4,40,21],\"to\":[-8,4,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-4,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0.032,13.3,0.048,13.85],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"e\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[2.4,1.1,2.848,3.1],\"south\":[2.848,1.1,2.4,3.1],\"up\":[2.848,1.1,2.4,0],\"down\":[2.848,4.2,2.4,3.1]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,12,-5],\"to\":[8,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.048,13.3,0.08,13.85],\"east\":[0.064,13.3,0.048,13.85],\"south\":[0.08,13.3,0.048,13.85],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"┣\":[{\"from\":[0,10,-3],\"to\":[16,34,19],\"faces\":{\"north\":[15.424,5.8,15.68,7],\"south\":[15.68,5.8,15.424,7],\"up\":[15.68,5.4,15.424,4.3],\"down\":[15.68,8.5,15.424,7.4]}},{\"from\":[-2,28,-5],\"to\":[6,36,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-2,8,-5],\"to\":[6,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[18,36,21],\"to\":[-2,8,-5],\"faces\":{\"north\":[0.96,13.3,1.04,13.65],\"east\":[1.056,13.3,1.072,13.65],\"south\":[0.992,13.3,1.072,13.65],\"west\":[0,13.3,0.016,13.35],\"up\":[0.992,13.6,1.072,13.65],\"down\":[0.992,13.3,1.072,13.35]}}],\"f\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[2.88,1.1,3.328,3.1],\"south\":[3.328,1.1,2.88,3.1],\"up\":[3.328,1.1,2.88,0],\"down\":[3.328,4.2,2.88,3.1]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,0,-5],\"to\":[8,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.096,13.85,0.064,13.3],\"east\":[0.096,13.85,0.08,13.3],\"south\":[0.064,13.85,0.096,13.3],\"west\":[0,13.3,0.016,13.35],\"up\":[0.016,13.35,0.048,13.4],\"down\":[0,13.3,0.016,13.35]}}],\"/\":[{\"from\":[-10,2,-3],\"to\":[26,42,19],\"faces\":{\"north\":[8.448,5.4,9.024,7.4],\"south\":[9.024,5.4,8.448,7.4],\"up\":[9.024,5.4,8.448,4.3],\"down\":[9.024,8.5,8.448,7.4]}},{\"from\":[20,16,-5],\"to\":[28,24,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[12,24,-5],\"to\":[20,36,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[4,36,-5],\"to\":[12,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[4,0,-5],\"to\":[12,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-4,8,-5],\"to\":[4,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-12,20,-5],\"to\":[-4,28,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[28,44,21],\"to\":[-12,0,-5],\"faces\":{\"north\":[0.88,13.85,0.96,14.4],\"east\":[0.88,13.85,0.896,14.4],\"south\":[0.96,13.85,0.88,14.4],\"west\":[0.944,13.85,0.96,14.4],\"up\":[0.88,14.35,0.96,14.4],\"down\":[0.88,13.85,0.96,13.9]}}],\"g\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[3.36,1.1,3.808,3.1],\"south\":[3.808,1.1,3.36,3.1],\"up\":[3.808,1.1,3.36,0],\"down\":[3.808,4.2,3.36,3.1]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.096,13.85,0.128,13.3],\"east\":[0.112,13.85,0.096,13.3],\"south\":[0.128,13.85,0.096,13.3],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\">\":[{\"from\":[-6,8,-3],\"to\":[22,36,19],\"faces\":{\"north\":[12.864,5.7,13.312,7.1],\"south\":[13.312,5.7,12.864,7.1],\"up\":[13.312,5.4,12.864,4.3],\"down\":[13.312,8.5,12.864,7.4]}},{\"from\":[16,18,-5],\"to\":[24,26,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[0,34,-5],\"to\":[8,38,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,30,-5],\"to\":[0,34,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[0,6,-5],\"to\":[8,10,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-8,10,-5],\"to\":[0,14,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,38,21],\"to\":[-8,6,-5],\"faces\":{\"north\":[0.96,13.65,1.024,14.05],\"east\":[0.96,13.65,0.976,14.05],\"south\":[1.024,13.65,0.96,14.05],\"west\":[1.008,13.65,1.024,14.05],\"up\":[1.024,14,0.96,14.05],\"down\":[1.024,13.65,0.96,13.7]}}],\"h\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[3.84,1.1,4.288,3.1],\"south\":[4.288,1.1,3.84,3.1],\"up\":[4.288,1.1,3.84,0],\"down\":[4.288,4.2,3.84,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"i\":[{\"from\":[2,2,-3],\"to\":[14,42,19],\"faces\":{\"north\":[4.32,1.1,4.512,3.1],\"south\":[4.512,1.1,4.32,3.1],\"up\":[4.512,1.1,4.32,0],\"down\":[4.512,4.2,4.32,3.1]}},{\"from\":[16,44,21],\"to\":[0,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"j\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[4.544,1.1,4.992,3.1],\"south\":[4.992,1.1,4.544,3.1],\"up\":[4.992,1.1,4.544,0],\"down\":[4.992,4.2,4.544,3.1]}},{\"from\":[8,20,-5],\"to\":[24,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.112,13.85,0.144,13.3],\"east\":[0,13.3,0.016,13.35],\"south\":[0.144,13.85,0.112,13.3],\"west\":[0.128,13.85,0.144,13.3],\"up\":[0,13.3,0.016,13.35],\"down\":[0.032,13.35,0.064,13.4]}}],\"k\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[5.024,1.1,5.472,3.1],\"south\":[5.472,1.1,5.024,3.1],\"up\":[5.472,1.1,5.024,0],\"down\":[5.472,4.2,5.024,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"l\":[{\"from\":[-4,2,-3],\"to\":[20,42,19],\"faces\":{\"north\":[5.504,1.1,5.888,3.1],\"south\":[5.888,1.1,5.504,3.1],\"up\":[5.888,1.1,5.504,0],\"down\":[5.888,4.2,5.504,3.1]}},{\"from\":[-6,12,-5],\"to\":[6,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[22,44,21],\"to\":[-6,0,-5],\"faces\":{\"north\":[0.144,13.85,0.256,13.3],\"east\":[0.144,13.85,0.16,13.3],\"south\":[0.256,13.85,0.144,13.3],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0.256,13.3,0.144,13.35]}}],\"<\":[{\"from\":[-6,8,-3],\"to\":[22,36,19],\"faces\":{\"north\":[12.384,5.7,12.832,7.1],\"south\":[12.832,5.7,12.384,7.1],\"up\":[12.832,5.4,12.384,4.3],\"down\":[12.832,8.5,12.384,7.4]}},{\"from\":[-8,18,-5],\"to\":[0,26,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[8,34,-5],\"to\":[16,38,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,30,-5],\"to\":[24,34,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[8,6,-5],\"to\":[16,10,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,10,-5],\"to\":[24,14,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,38,21],\"to\":[-8,6,-5],\"faces\":{\"north\":[1.024,13.65,0.96,14.05],\"east\":[1.008,13.65,1.024,14.05],\"south\":[0.96,13.65,1.024,14.05],\"west\":[0.96,13.65,0.976,14.05],\"up\":[0.96,14,1.024,14.05],\"down\":[0.96,13.65,1.024,13.7]}}],\"m\":[{\"from\":[-12,2,-3],\"to\":[28,42,19],\"faces\":{\"north\":[5.92,1.1,6.56,3.1],\"east\":[0.032,13.4,0.048,13.3],\"south\":[6.56,1.1,5.92,3.1],\"west\":[0.032,13.4,0.048,13.3],\"up\":[6.56,1.1,5.92,0],\"down\":[6.56,4.2,5.92,3.1]}},{\"from\":[4,10,-3],\"to\":[12,10,19],\"faces\":{\"down\":[6.72,4.2,6.592,3.1]}},{\"from\":[2,36,-5],\"to\":[14,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0.016,13.35,0.064,13.4]}},{\"from\":[6,28,-5],\"to\":[10,36,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[2,0,-5],\"to\":[14,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[30,44,21],\"to\":[-14,0,-5],\"faces\":{\"north\":[0.192,13.85,0.368,13.3],\"east\":[0,13.3,0.016,13.35],\"south\":[0.192,13.85,0.368,13.3],\"west\":[0,13.3,0.016,13.35],\"up\":[0.192,13.3,0.368,13.35],\"down\":[0.192,13.3,0.368,13.35]}}],\"n\":[{\"from\":[-8,2,-3],\"to\":[24,42,19],\"faces\":{\"north\":[6.752,1.1,7.264,3.1],\"south\":[7.264,1.1,6.752,3.1],\"up\":[7.264,1.1,6.752,0],\"down\":[7.264,4.2,6.752,3.1]}},{\"from\":[6,36,-5],\"to\":[10,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[6,0,-5],\"to\":[10,10,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[26,44,21],\"to\":[-10,0,-5],\"faces\":{\"north\":[0.304,14.4,0.448,13.3],\"east\":[0,13.3,0.016,13.35],\"south\":[0.304,14.4,0.448,13.3],\"west\":[0,13.3,0.016,13.35],\"up\":[0.304,13.3,0.448,13.35],\"down\":[0.304,13.3,0.448,13.35]}}],\"o\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[7.296,1.1,7.744,3.1],\"south\":[7.744,1.1,7.296,3.1],\"up\":[7.744,1.1,7.296,0],\"down\":[7.744,4.2,7.296,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"😩\":[{\"from\":[2,22,-3],\"to\":[14,42,19],\"faces\":{\"north\":[11.104,5.4,11.296,6.4],\"south\":[11.296,5.4,11.104,6.4],\"up\":[11.296,5.4,11.104,4.3],\"down\":[11.296,8.5,11.104,7.4]}},{\"from\":[0,36,-5],\"to\":[4,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,44,21],\"to\":[0,20,-5],\"faces\":{\"north\":[0.16,13.9,0.096,13.6],\"east\":[0.032,13.9,0.016,13.6],\"south\":[0.096,13.9,0.16,13.6],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0.08,13.3,0.144,13.35]}}],\"p\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[7.776,1.1,8.224,3.1],\"south\":[8.224,1.1,7.776,3.1],\"up\":[8.224,1.1,7.776,0],\"down\":[8.224,4.2,7.776,3.1]}},{\"from\":[-8,0,-5],\"to\":[8,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.288,14.4,0.32,13.85],\"east\":[0.288,14.4,0.304,13.85],\"south\":[0.32,14.4,0.288,13.85],\"west\":[0,13.3,0.016,13.35],\"up\":[0.016,13.35,0.048,13.4],\"down\":[0,13.3,0.016,13.35]}}],\"q\":[{\"from\":[-8,2,-3],\"to\":[24,42,19],\"faces\":{\"north\":[8.256,1.1,8.768,3.1],\"south\":[8.768,1.1,8.256,3.1],\"up\":[8.768,1.1,8.256,0],\"down\":[8.768,4.2,8.256,3.1]}},{\"from\":[-6,12,21],\"to\":[-10,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[26,44,21],\"to\":[-6,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0.368,14.3,0.384,13.75],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"?\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[9.664,5.4,10.112,7.4],\"south\":[10.112,5.4,9.664,7.4],\"up\":[10.112,5.4,9.664,4.3],\"down\":[10.112,8.5,9.664,7.4]}},{\"from\":[16,0,-5],\"to\":[24,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-8,0,-5],\"to\":[0,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.96,13.85,0.896,13.3],\"east\":[0.96,13.85,0.944,13.3],\"south\":[0.896,13.85,0.96,13.3],\"west\":[0.912,13.85,0.896,13.3],\"up\":[0.96,13.85,0.896,13.8],\"down\":[0,13.3,0.016,13.35]}}],\"r\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[8.8,1.1,9.248,3.1],\"south\":[9.248,1.1,8.8,3.1],\"up\":[9.248,1.1,8.8,0],\"down\":[9.248,4.2,8.8,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"s\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[9.28,1.1,9.728,3.1],\"south\":[9.728,1.1,9.28,3.1],\"up\":[9.728,1.1,9.28,0],\"down\":[9.728,4.2,9.28,3.1]}},{\"from\":[8,12,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,28,-5],\"to\":[8,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.85,0.032,14.4],\"east\":[0,13.85,0.016,14.4],\"south\":[0.032,13.85,0,14.4],\"west\":[0.016,13.85,0.032,14.4],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"┫\":[{\"from\":[0,10,-3],\"to\":[16,34,19],\"faces\":{\"north\":[15.136,5.8,15.392,7],\"south\":[15.392,5.8,15.136,7],\"up\":[15.392,5.4,15.136,4.3],\"down\":[15.392,8.5,15.136,7.4]}},{\"from\":[10,28,-5],\"to\":[18,36,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[10,8,-5],\"to\":[18,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[18,36,21],\"to\":[-2,8,-5],\"faces\":{\"north\":[0.992,13.3,1.072,13.65],\"east\":[0,13.3,0.016,13.35],\"south\":[0.96,13.3,1.04,13.65],\"west\":[1.056,13.3,1.072,13.65],\"up\":[0.96,13.6,1.04,13.65],\"down\":[0.96,13.3,1.04,13.35]}}],\"t\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[9.76,1.1,10.208,3.1],\"south\":[10.208,1.1,9.76,3.1],\"up\":[10.208,1.1,9.76,0],\"down\":[10.208,4.2,9.76,3.1]}},{\"from\":[16,0,-5],\"to\":[24,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-8,0,-5],\"to\":[0,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.032,14.4,0.096,13.85],\"east\":[0.032,14.4,0.048,13.85],\"south\":[0.032,14.4,0.096,13.85],\"west\":[0.032,14.4,0.048,13.85],\"up\":[0.032,14.4,0.096,14.35],\"down\":[0,13.3,0.016,13.35]}}],\"u\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[10.24,1.1,10.688,3.1],\"south\":[10.688,1.1,10.24,3.1],\"up\":[10.688,1.1,10.24,0],\"down\":[10.688,4.2,10.24,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"v\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[10.72,1.1,11.168,3.1],\"south\":[11.168,1.1,10.72,3.1],\"up\":[11.168,1.1,10.72,0],\"down\":[11.168,4.2,10.72,3.1]}},{\"from\":[-8,8,-5],\"to\":[-4,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-4,0,-5],\"to\":[0,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,0,-5],\"to\":[20,8,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[20,8,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.096,14.4,0.224,13.85],\"east\":[0.096,14.4,0.112,13.85],\"south\":[0.096,14.4,0.224,13.85],\"west\":[0.096,14.4,0.112,13.85],\"up\":[0.096,14.35,0.224,14.4],\"down\":[0,13.3,0.016,13.35]}}],\"w\":[{\"from\":[-12,2,-3],\"to\":[28,42,19],\"faces\":{\"north\":[11.2,1.1,11.84,3.1],\"east\":[0.032,13.3,0.048,13.4],\"south\":[11.84,1.1,11.2,3.1],\"west\":[0.032,13.3,0.048,13.4],\"up\":[11.84,1.1,11.2,0],\"down\":[11.84,4.2,11.2,3.1]}},{\"from\":[4,30,-3],\"to\":[12,30,19],\"faces\":{\"up\":[12,1.1,11.872,0]}},{\"from\":[2,32,-5],\"to\":[14,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[6,0,-5],\"to\":[10,12,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[26,0,-5],\"to\":[30,8,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-14,0,-5],\"to\":[-10,8,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[30,44,21],\"to\":[-14,0,-5],\"faces\":{\"north\":[0.448,13.85,0.624,13.3],\"east\":[0.448,13.85,0.464,13.3],\"south\":[0.448,13.85,0.624,13.3],\"west\":[0.448,13.85,0.464,13.3],\"up\":[0.448,13.85,0.624,13.8],\"down\":[0.448,13.35,0.624,13.3]}}],\"x\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[12.032,1.1,12.48,3.1],\"south\":[12.48,1.1,12.032,3.1],\"up\":[12.48,1.1,12.032,0],\"down\":[12.48,4.2,12.032,3.1]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"y\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[12.512,1.1,12.96,3.1],\"south\":[12.96,1.1,12.512,3.1],\"up\":[12.96,1.1,12.512,0],\"down\":[12.96,4.2,12.512,3.1]}},{\"from\":[-8,0,-5],\"to\":[0,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[16,0,-5],\"to\":[24,20,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.224,14.4,0.288,13.85],\"east\":[0.224,14.4,0.24,13.85],\"south\":[0.224,14.4,0.288,13.85],\"west\":[0.224,14.4,0.24,13.85],\"up\":[0.224,14.35,0.288,14.4],\"down\":[0,13.3,0.016,13.35]}}],\"z\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[12.992,1.1,13.44,3.1],\"south\":[13.44,1.1,12.992,3.1],\"up\":[13.44,1.1,12.992,0],\"down\":[13.44,4.2,12.992,3.1]}},{\"from\":[-8,12,-5],\"to\":[8,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0.048,13.35,0.016,13.4],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[8,28,-5],\"to\":[24,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0.016,13.35,0.048,13.4]}},{\"from\":[16,24,-5],\"to\":[24,28,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,16,-5],\"to\":[0,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0.448,13.85,0.512,14.4],\"east\":[0.464,13.85,0.448,14.4],\"south\":[0.512,13.85,0.448,14.4],\"west\":[0.448,14.4,0.464,13.85],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"[\":[{\"from\":[-2,2,-3],\"to\":[18,42,19],\"faces\":{\"north\":[6.912,5.4,7.232,7.4],\"south\":[7.232,5.4,6.912,7.4],\"up\":[7.232,5.4,6.912,4.3],\"down\":[7.232,8.5,6.912,7.4]}},{\"from\":[-4,12,-5],\"to\":[4,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,44,21],\"to\":[-4,0,-5],\"faces\":{\"north\":[0.88,13.85,0.832,14.4],\"east\":[0.016,13.3,0.032,13.85],\"south\":[0.832,13.85,0.88,14.4],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"]\":[{\"from\":[-2,2,-3],\"to\":[18,42,19],\"faces\":{\"north\":[7.264,5.4,7.584,7.4],\"south\":[7.584,5.4,7.264,7.4],\"up\":[7.584,5.4,7.264,4.3],\"down\":[7.584,8.5,7.264,7.4]}},{\"from\":[12,12,-5],\"to\":[20,32,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,44,21],\"to\":[-4,0,-5],\"faces\":{\"north\":[0.832,13.85,0.88,14.4],\"east\":[0,13.3,0.016,13.35],\"south\":[0.88,13.85,0.832,14.4],\"west\":[0.016,13.3,0.032,13.85],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"^\":[{\"from\":[-2,30,-3],\"to\":[18,42,19],\"faces\":{\"north\":[13.952,5.4,14.272,6],\"south\":[14.272,5.4,13.952,6],\"up\":[14.272,5.4,13.952,4.3],\"down\":[14.272,8.5,13.952,7.4]}},{\"from\":[16,40,-5],\"to\":[20,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-4,40,-5],\"to\":[0,44,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,44,21],\"to\":[-4,28,-5],\"faces\":{\"north\":[1.024,13.85,1.12,13.65],\"east\":[1.104,13.85,1.12,13.65],\"south\":[1.024,13.85,1.12,13.65],\"west\":[1.024,13.85,1.04,13.65],\"up\":[0,13.3,0.016,13.35],\"down\":[1.024,13.7,1.12,13.65]}}],\"_\":[{\"from\":[-6,-6,-3],\"to\":[22,2,19],\"faces\":{\"north\":[0.448,11.7,0.896,12.1],\"south\":[0.896,11.7,0.448,12.1],\"up\":[0.896,9.7,0.448,8.6],\"down\":[0.896,13.2,0.448,12.1]}},{\"from\":[24,4,21],\"to\":[-8,-8,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"{\":[{\"from\":[-4,2,-3],\"to\":[20,42,19],\"faces\":{\"north\":[7.616,5.4,8,7.4],\"south\":[8,5.4,7.616,7.4],\"up\":[8,5.4,7.616,4.3],\"down\":[8,8.5,7.616,7.4]}},{\"from\":[-6,12,-5],\"to\":[2,20,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,24,-5],\"to\":[2,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[2,20,-5],\"to\":[6,24,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[22,28,21],\"to\":[18,16,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[18,44,21],\"to\":[-6,0,-5],\"faces\":{\"north\":[0.8,13.3,0.896,13.85],\"east\":[0.8,13.3,0.816,13.85],\"south\":[0.896,13.3,0.8,13.85],\"west\":[0.528,13.5,0.544,14.05],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"}\":[{\"from\":[-4,2,-3],\"to\":[20,42,19],\"faces\":{\"north\":[8.032,5.4,8.416,7.4],\"south\":[8.416,5.4,8.032,7.4],\"up\":[8.416,5.4,8.032,4.3],\"down\":[8.416,8.5,8.032,7.4]}},{\"from\":[14,12,-5],\"to\":[22,20,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[14,24,-5],\"to\":[22,32,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[10,20,-5],\"to\":[14,24,21],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-2,28,21],\"to\":[-6,16,-5],\"rotation\":{\"angle\":0,\"axis\":\"y\",\"origin\":[16,0,0]},\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[22,44,21],\"to\":[-2,0,-5],\"faces\":{\"north\":[0.896,13.3,0.8,13.85],\"east\":[0.528,13.5,0.544,14.05],\"south\":[0.8,13.3,0.896,13.85],\"west\":[0.8,13.3,0.816,13.85],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}}],\"~\":[{\"from\":[-4,30,-3],\"to\":[20,42,19],\"faces\":{\"north\":[14.72,5.4,15.104,6],\"south\":[15.104,5.4,14.72,6],\"up\":[15.104,5.4,14.72,4.3],\"down\":[15.104,8.5,14.72,7.4]}},{\"from\":[18,40,-5],\"to\":[22,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-6,28,-5],\"to\":[-2,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[22,44,21],\"to\":[-6,28,-5],\"faces\":{\"north\":[1.68,13.45,1.792,13.65],\"east\":[1.776,13.65,1.792,13.45],\"south\":[1.68,13.45,1.792,13.65],\"west\":[1.68,13.65,1.696,13.45],\"up\":[1.68,13.65,1.792,13.6],\"down\":[1.68,13.5,1.792,13.45]}}],\"£\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[13.472,1.1,13.92,3.1],\"south\":[13.92,1.1,13.472,3.1],\"up\":[13.92,1.1,13.472,0],\"down\":[13.92,4.2,13.472,3.1]}},{\"from\":[16,40,-5],\"to\":[20,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,28,-5],\"to\":[24,40,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,12,-5],\"to\":[24,16,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-4,28,-5],\"to\":[4,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-4,12,-5],\"to\":[4,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-4,12,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"east\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,44,21],\"to\":[-4,0,-5],\"faces\":{\"north\":[1.216,14.4,1.104,13.85],\"east\":[0.08,13.85,0.096,13.3],\"south\":[1.104,14.4,1.216,13.85],\"west\":[1.104,14.4,1.12,13.85],\"up\":[0,13.3,0.016,13.35],\"down\":[1.104,13.9,1.216,13.85]}}],\"€\":[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":[13.952,1.1,14.4,3.1],\"south\":[14.4,1.1,13.952,3.1],\"up\":[14.4,1.1,13.952,0],\"down\":[14.4,4.2,13.952,3.1]}},{\"from\":[16,40,-5],\"to\":[20,44,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[16,0,-5],\"to\":[20,4,21],\"faces\":{\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35]}},{\"from\":[-8,28,-5],\"to\":[4,32,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[-8,12,-5],\"to\":[4,16,21],\"faces\":{\"east\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[24,28,21],\"to\":[20,16,-5],\"faces\":{\"north\":[0,13.3,0.016,13.35],\"south\":[0,13.3,0.016,13.35],\"west\":[0,13.3,0.016,13.35],\"up\":[0,13.3,0.016,13.35],\"down\":[0,13.3,0.016,13.35]}},{\"from\":[20,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":[1.296,13.85,1.184,13.3],\"east\":[1.28,13.85,1.296,13.3],\"south\":[1.184,13.85,1.296,13.3],\"west\":[1.216,14.4,1.232,13.85],\"up\":[1.184,13.85,1.296,13.8],\"down\":[1.184,13.35,1.296,13.3]}}]},\n      textures: {\n        flat: {\n          name: \"Flat\",\n          thumbnail,\n          texture: \"data:image/png;base64,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\"\n        }\n      },\n      overlays: {\n        none: {\n          name: \"None\",\n          thumbnail: \"data:image/webp;base64,UklGRlgAAABXRUJQVlA4TEsAAAAvX8AKEBcw//M//wMUgAe2jSQp2iSPOr+nSXPHOng7ov8TUKa/ZLlkuWT5VVyOy1FKKXNFRBwtJ0mU3YktcTmu31JKKVPklPlPZXoA\"\n        }\n      },\n      faces: [\n        [22, 62],\n        [108, 148],\n        [194, 194, 234, 242]\n      ],\n      ends: [\n        [0, 22, 62, 84],\n        [86, 108, 148, 170],\n        [172, 194, 242, 264]\n      ],\n      height: 44,\n      border: 266,\n      terminatorSpace: true,\n      shifts: {\n        \"//\": 16,\n        \"\\\\\\\\\": 16,\n        \"tj\": 8,\n        \"lt\": 8,\n        \"ly\": 8,\n        \"yj\": 6,\n        \"lv\": 4,\n        \"qt\": 4,\n        \"qv\": 4,\n        \"{{\": 4,\n        \"}}\": 4,\n        \"}]\": 4,\n        \"[{\": 4,\n        \"l?\": 4,\n        \"q?\": 4,\n        \"t.\": 4,\n        \"t,\": 4,\n        \"t_\": 4,\n        \"t-\": 4,\n        \"-t\": 4,\n        \"l-\": 8,\n        \"/j\": 8,\n        \"l\\\\\": 8\n      }\n    },\n    \"minecraft-ten-blank\": {\n      name: \"Minecraft Ten (Blank)\",\n      type: \"shape\",\n      thumbnail: shapeThumbnail,\n      characters: {a:[{\"from\":[-6,2,-3],\"to\":[22,42,19],\"faces\":{\"north\":{\"uv\":[0,4,16,11.27273]},\"south\":{\"uv\":[16,4,0,11.27273]},\"up\":{\"uv\":[16,4,0,0]},\"down\":{\"uv\":[16,15.27273,0,11.27273]}},\"parsed\":true},{\"from\":[24,44,21],\"to\":[-8,0,-5],\"faces\":{\"north\":{\"uv\":[0,15.63636,0.57143,15.81818]},\"east\":{\"uv\":[0,15.63636,0.57143,15.81818]},\"south\":{\"uv\":[0,15.63636,0.57143,15.81818]},\"west\":{\"uv\":[0,15.63636,0.57143,15.81818]},\"up\":{\"uv\":[0,15.63636,0.57143,15.81818]},\"down\":{\"uv\":[0,15.63636,0.57143,15.81818]}},\"parsed\":true}]},\n      textures: {\n        flat: {\n          name: \"Flat\",\n          thumbnail: shapeThumbnail,\n          texture: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAABYBAMAAAAU6ordAAAAD1BMVEUAAAAAAABUVFSwsLD///9xh7SGAAAAAXRSTlMAQObYZgAAACRJREFUOE9jMEYBDKNcsrkuKGCUO8qlDlcJBYxyyefiBwL4JAHoO/sVx1YEjAAAAABJRU5ErkJggg==\"\n        }\n      },\n      overlays: {\n        none: {\n          name: \"None\",\n          thumbnail: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAsAQMAAAA+dijMAAAABlBMVEUAAABMTEz/QcDZAAAAAnRSTlNNTTspwV0AAAATSURBVAhbY2CAA/v///8MBwIOADt5gOkuLqvtAAAAAElFTkSuQmCC\"\n        }\n      },\n      faces: [\n        [22, 62]\n      ],\n      ends: [\n        [0, 22, 62, 84]\n      ],\n      height: 44,\n      border: 86,\n      textureWidth: 28,\n      textureHeight: 88\n    }\n  }\n  const fontData = []\n  let tileables = {\n    cobblestone: {\n      texture: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEW1tbWmpqaIh4hubW1hYWFSUlLm8qFQAAAAcUlEQVR42gVAARGDMAz8MAMjh4CSLwIWIgDSIGAD/1p2iPk5pTfFOW3QLR3nGrrGQxSLTL1wp2TJ3PF6W/yaOjSV9eEB2y3a4omQPSerG4f6biMXkP0a8X2DMdpytQkuIWuY49CuziJmclhoIcsjUvgH41gVHD61kt4AAAAASUVORK5CYII=\"\n    }\n  }\n  const connection = {\n    roots: [\n      `https://raw.githubusercontent.com/${repo}/${branch}`,\n      `https://cdn.jsdelivr.net/gh/${repo}@${branch}`\n    ],\n    rootIndex: 0\n  }\n  let root = connection.roots[0]\n  const api = \"https://api.wynem.com\"\n  let format, action, action2, dialog, mode, styles, preview, debug, controls\n  const id = \"minecraft_title_generator\"\n  const name = \"Minecraft Title Generator\"\n  const icon = \"text_fields\"\n  const description = \"Create Minecraft-styled title models!\"\n  const links = {\n    website: {\n      text: \"By Ewan Howell\",\n      link: \"https://ewanhowell.com/\",\n      icon: \"language\",\n      colour: \"#33E38E\"\n    },\n    discord: {\n      text: \"Discord Server\",\n      link: \"https://discord.ewanhowell.com/\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    },\n    github: {\n      text: \"Submit Textures and Fonts\",\n      link: `https://github.com/${repo}/`,\n      icon: \"fab.fa-github\",\n      colour: \"#6E40C9\"\n    },\n    tutorial: {\n      text: \"Tutorial\",\n      link: \"https://youtu.be/iGaufrACVj4\",\n      icon: \"fab.fa-youtube\",\n      colour: \"#FF4444\"\n    }\n  }\n  const stopConfigs = [\n    [0.5],\n    [0.4, 0.8],\n    [1/3, 2/3],\n    [0.3, 0.6, 0.8],\n    [0.2, 0.6],\n    [0.2, 0.5, 0.8],\n    [0.2, 0.4, 0.7],\n    [0.2, 0.4, 0.6, 0.8]\n  ]\n  const titleCameraAngle = {\n    name: \"Minecraft Title\",\n    id: \"minecraft-title\",\n    position: [0, -170, -320],\n    target: [0, 0, 0],\n    default: true\n  }\n  const stats = []\n  const variables = {\n    main: [\n      {\n        font: Object.keys(fonts)[0],\n        baseFont: Object.keys(fonts)[0],\n        fontVariant: null,\n        fontTab: \"fonts\",\n        type: \"top\",\n        row: 0\n      },\n      {\n        texture: Object.keys(fonts[\"minecraft-ten\"].textures)[0],\n        variant: null,\n        tileable: Object.keys(tileables)[0],\n        tileableVariant: null,\n        smoothGradient: true,\n        gradientColour0: \"#FFCF76\",\n        gradientColour1: \"#FFA3A3\",\n        gradientColour2: \"#F4C1A4\",\n        gradientColour3: \"#E19A3E\",\n        gradientColour4: \"#DA371E\",\n        gradientColour1Enabled: false,\n        gradientColour2Enabled: false,\n        gradientColour3Enabled: false,\n        customTextureType: \"texture\",\n        textureSource: \"premade\",\n        customTexture: null\n      },\n      {},\n      {\n        terminators: false\n      },\n      {\n        characterSpacing: 0,\n        rowSpacing: 0,\n        scaleX: 1,\n        scaleY: 1,\n        scaleZ: 1,\n        disableCharacterShifting: false\n      }\n    ],\n    texture: [\n      {},\n      {},\n      {\n        overlay: Object.keys(fonts[\"minecraft-ten\"].overlays)[0],\n        overlayBlend: \"overlay\",\n        overlayColourBlend: \"multiply\",\n        overlayColour: \"#fff\",\n        overlayOpacity: 100,\n        overlaySource: \"premade\",\n        customOverlay: null\n      },\n      {\n        tileableScale: 2,\n        tileableXOffset: 0,\n        tileableYOffset: 0,\n        tileableRandomRotations: false,\n        tileableRandomMirroring: false,\n        tileableTextureResolution: 1,\n        disableFontOverlay: false,\n        hue: 0,\n        saturation: 100,\n        brightness: 100,\n        contrast: 100,\n        blend: \"multiply\",\n        customBorder: false,\n        customEdge: false,\n        colourOpacity: 100,\n        colour: \"#fff\",\n        customBorderColour: \"#000\",\n        customEdgeColour: \"#000\",\n        edgeBrightness: 35,\n        fadeToBorder: false\n      }\n    ]\n  }\n  let initialLoaded\n  const initialLoad = new Promise(fulfil => {\n    initialLoaded = fulfil\n  })\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author: \"Ewan Howell\",\n    description,\n    tags: [\"Minecraft\", \"Title\", \"Logo\"],\n    version: \"1.10.4\",\n    min_version: \"5.0.0\",\n    variant: \"both\",\n    creation_date: \"2023-06-10\",\n    await_loading: true,\n    contributes: {\n      formats: [\"minectaft_title\"]\n    },\n    has_changelog: true,\n    website: \"https://ewanhowell.com/plugins/minecraft-title-generator/\",\n    repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/minecraft-title-generator\",\n    bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Minecraft Title Generator]\",\n    async onload() {\n      styles = Blockbench.addCSS(`\n        .minecraft-title-list {\n          display: flex;\n          max-height: 384px;\n          flex-wrap: wrap;\n          gap: 10px;\n          overflow-x: hidden;\n        }\n        .minecraft-title-list.small {\n          max-height: 256px;\n        }\n        .minecraft-title-item {\n          display: flex;\n          flex-direction: column;\n          gap: 5px;\n          padding: 10px 10px 5px;\n          background-color: var(--color-back);\n          align-items: center;\n          cursor: pointer;\n          flex: 1;\n          position: relative;\n          min-width: 150px;\n        }\n        .minecraft-title-item:hover {\n          background-color: var(--color-button);\n        }\n        .minecraft-title-item > img {\n          max-width: 100px;\n          height: 50px;\n          display: flex;\n          object-fit: contain;\n        }\n        .minecraft-title-item > div:first-child {\n          flex: 1;\n          display: flex;\n          align-items: center;\n          margin-bottom: 5px;\n        }\n        .minecraft-title-item > div:nth-child(2) {\n          text-align: center;\n          flex: 1;\n          display: flex;\n          align-items: center;\n          max-height: 24px;\n          min-height: 24px;\n          line-height: 16px;\n          margin: -2px 0 2px;\n        }\n        .minecraft-title-item.selected {\n          outline: 2px solid var(--color-accent);\n          background-color: var(--color-selected);\n          outline-offset: -2px;\n        }\n        .minecraft-title-item-has-variants {\n          display: flex;\n          position: absolute;\n          bottom: 4px;\n          right: 4px;\n          z-index: 1;\n        }\n        .minecraft-title-links {\n          display: flex;\n          justify-content: space-around;\n          margin: 20px 40px 0;\n        }\n        .minecraft-title-links > a {\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          gap: 5px;\n          padding: 5px;\n          text-decoration: none;\n          flex-grow: 1;\n          flex-basis: 0;\n          color: var(--color-subtle_text);\n          text-align: center;\n        }\n        .minecraft-title-links > a:hover {\n          background-color: var(--color-accent);\n          color: var(--color-light);\n        }\n        .minecraft-title-links > a > i {\n          font-size: 32px;\n          width: 100%;\n          max-width: initial;\n          height: 32px;\n          text-align: center;\n        }\n        .minecraft-title-links > a:hover > i {\n          color: var(--color-light) !important;\n        }\n        .minecraft-title-links > a > p {\n          flex: 1;\n          display: flex;\n          align-items: center;\n        }\n        .spacer, #minecraft_title_generator .sp-preview, #minecraft_title_generator .form_inline_select > li {\n          flex: 1;\n        }\n        #minecraft_title_generator .form_inline_select > li {\n          border-radius: 0;\n        }\n        #minecraft_title_generator .form_inline_select > li:first-child {\n          border-radius: 5px 0 0 5px;\n        }\n        #minecraft_title_generator .form_inline_select > li:last-child {\n          border-radius: 0 5px 5px 0;\n        }\n        #minecraft_title_generator .form_inline_select > .disabled {\n          cursor: not-allowed;\n          color: inherit !important;\n          text-decoration: line-through;\n          opacity: 0.5;\n        }\n        .minecraft-title-item-buttons > i:hover, #minecraft-title-preview-container > i:hover, .minecraft-title-button:hover, #minecraft-title-custom-texture > i:hover, #minecraft-title-custom-overlay > i:hover, .text-input-row > i:hover, .minecraft-title-button:hover > svg {\n          color: var(--color-light);\n        }\n        .minecraft-title-preset > *, .minecraft-title-item *, .text-input-row > i:hover, #minecraft-title-render-button-row *, .minecraft-title-links * {\n          cursor: pointer;\n        }\n        #format_page_minecraft_title {\n          padding-bottom: 0;\n        }\n        #format_page_minecraft_title .format_target {\n          margin-bottom: 6px;\n        }\n        #format_page_minecraft_title div:nth-child(3), #format_page_minecraft_title content {\n          overflow-y: auto;\n        }\n        body.minecraft-title-generator .config_dialog .form_bar_shading {\n          display: none;\n        }\n      `)\n      let shadeState\n      settings.shading.condition = () => Project.format?.id !== format.id\n      format = new ModelFormat({\n        id: \"minecraft_title\",\n        name: \"Minecraft Title\",\n        icon,\n        category: \"minecraft\",\n        target: [\"Minecraft\"],\n        render_sides: \"front\",\n        model_identifier: false,\n        rotate_cubes: true,\n        uv_rotation: true,\n        bone_rig: true,\n        centered_grid: true,\n        per_texture_uv_size: true,\n        onSetup: loadRenderAngle,\n        new() {\n          newProject(this)\n          dialog.show()\n        },\n        onActivation() {\n          shadeState = settings.shading.value\n          document.body.classList.add(\"minecraft-title-generator\")\n          settings.shading.set(false)\n        },\n        onDeactivation() {\n          settings.shading.set(shadeState)\n          document.body.classList.remove(\"minecraft-title-generator\")\n          dialog.close()\n        },\n        format_page: {\n          component: {\n            methods: {\n              create: () => format.new()\n            },\n            template: `\n              <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n                <p class=\"format_description\">${description}</p>\n                <p class=\"format_target\"><b>Target</b> : <span>Logos</span> <span>Renders</span> <span>Thumbnails</span></p>\n                <content>\n                  <h3 class=\"markdown\">Good to know:</h3>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li>This format is designed to create Minecraft-styled title models.</li>\n                      <li>New text can be added with the <strong>Add Minecraft Title Text</strong> button <i class=\"icon material-icons\" style=\"font-size:20px\">text_fields</i>.</li>\n                      <li>There are automatic presets for text positions and text angles, so make sure to check out all of the text options!</li>\n                      <li>To render your title, you can use the <strong>Render</strong> mode found at the top right.</li>\n                      <li>The camera can be automatically positioned in the render mode using the <strong>Position camera</strong> button <i class=\"icon material-icons\" style=\"font-size:20px\">auto_mode</i>.</li>\n                    </ul>\n                  </p>\n                </content>\n                <div class=\"spacer\"></div>\n                <div class=\"minecraft-title-links\">${Object.values(links).map(e => `\n                  <a href=\"${e.link}\">\n                    ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                    <p>${e.text}</p>\n                  </a>\n                `).join(\"\")}</div>\n                <div class=\"button_bar\">\n                  <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"create\">\n                    <i class=\"material-icons\">${icon}</i>\n                    Create New Minecraft Title\n                  </button>\n                </div>\n              </div>\n            `\n          }\n        }\n      })\n      mode = new Mode(\"minecraft_title_render\", {\n        name: \"Render\",\n        category: \"navigate\",\n        condition: {\n          formats: [format.id]\n        },\n        hide_toolbars: true,\n        hide_status_bar: true,\n        onSelect() {\n          three_grid.visible = false\n          const pivot = Canvas.scene.getObjectByName(\"pivot_marker\")\n          if (pivot) pivot.visible = false\n          setTimeout(selectHandler, 0)\n        },\n        onUnselect() {\n          three_grid.visible = true\n          const pivot = Canvas.scene.getObjectByName(\"pivot_marker\")\n          if (pivot) pivot.visible = true\n          Canvas.scene.traverse(e => {\n            if (e.type === \"Line\") e.visible = true\n          })\n        }\n      })\n      action = new Action(\"minecraft_title_add_text\", {\n        name: \"Add Minecraft Title Text\",\n        icon,\n        condition: () => Project.format === format,\n        async click() {\n          if (dialog.content_vue) {\n            dialog.content_vue.switchToFonts()\n            dialog.show()\n          } else {\n            dialog.show()\n            await initialLoad\n            dialog.content_vue.switchToFonts()\n          }\n        }\n      })\n      action2 = new Action(\"minecraft_title_add_shape\", {\n        name: \"Add Minecraft Title Shape\",\n        icon: \"interests\",\n        condition: () => Project.format === format,\n        async click() {\n          if (dialog.content_vue) {\n            dialog.content_vue.switchToShapes()\n            dialog.show()\n          } else {\n            dialog.show()\n            await initialLoad\n            dialog.content_vue.switchToShapes()\n          }\n        }\n      })\n      Toolbars.outliner.add(action2, 0)\n      Toolbars.outliner.add(action, 0)\n      MenuBar.menus.edit.addAction(action2, 5)\n      MenuBar.menus.edit.addAction(action, 5)\n      Interface.Panels.outliner.menu.addAction(action2, 0)\n      Interface.Panels.outliner.menu.addAction(action, 0)\n      controls = document.createElement(\"div\")\n      controls.id = \"minecraft-title-render-controls-container\"\n      document.getElementById(\"center\").append(controls)\n      const controlsStyles = document.createElement(\"style\")\n      controlsStyles.innerHTML = `\n        #minecraft-title-render-controls {\n          position: absolute;\n          bottom: 50px;\n          left: 50%;\n          transform: translateX(-50%);\n          background-color: var(--color-ui);\n          flex-direction: column;\n          box-shadow: 0 5px 10px #0006;\n          align-items: center;\n          gap: 10px;\n          padding: 10px;\n          display: none;\n          z-index: 1;\n          border-radius: 6px;\n        }\n\n        body[mode=\"minecraft_title_render\"] {\n          #minecraft-title-render-controls {\n            display: flex;\n          }\n\n          #center {\n            margin-bottom: calc(4px - var(--toolbar-height));\n          }\n        }\n\n        .minecraft-title-render-controls-row {\n          display: flex;\n          gap: 20px;\n          align-items: center;\n        }\n\n        #minecraft-title-render-buttons {\n          display: flex;\n          gap: 10px;\n          justify-content: center;\n\n          > div {\n            padding: 5px 30px;\n            cursor: pointer;\n            width: initial;\n            height: initial;\n            position: relative;\n\n            &::before {\n              content: \"\";\n              position: absolute;\n              inset: 0;\n              background-color: var(--color-error);\n              border-radius: 8px;\n              z-index: -1;\n              transition: filter .15s;\n            }\n\n            &:first-child::before {\n              background-color: var(--color-accent);\n            }\n\n            &:hover::before {\n              filter: brightness(1.25) hue-rotate(5deg);\n            }\n\n            &.disabled {\n              cursor: not-allowed;\n\n              &::before {\n                background-color: var(--color-button);\n                filter: initial !important;\n              }\n            }\n\n            > i {\n              color: var(--color-light);\n              padding: 0;\n            }\n\n            .tooltip {\n              transform: translate(calc(11px - 50%), 10px)\n            }\n          }\n        }\n\n        #minecraft-title-render-resolutions {\n          display: flex;\n          background-color: var(--color-button);\n          padding: 4px;\n          border-radius: 4px;\n        }\n\n        .minecraft-title-render-resolution {\n          width: 32px;\n          height: 32px;\n          cursor: pointer;\n          border-radius: 4px;\n\n          > i {\n            font-size: 32px;\n            max-width: 32px;\n          }\n\n          > svg {\n            fill: var(--color-text);\n          }\n\n          &.selected {\n            background-color: var(--color-accent);\n            color: var(--color-accent_text);\n\n            > svg {\n              fill: var(--color-accent_text);\n            }\n          }\n        }\n      `\n      controls.append(controlsStyles)\n      const vue = document.createElement(\"div\")\n      controls.append(vue)\n      new Vue({\n        methods: {\n          render() {\n            if (Preview.selected.camera instanceof THREE.OrthographicCamera) return Blockbench.showMessageBox({\n              title: \"Orthographic not supported\",\n              message: \"Orthographic perspectives are not supported for render mode.\\n\\nIf you wish to render with an orthographic perspective, use the built-in Blockbench screenshot options.\",\n              buttons: [\"Disable orthographic perspective\", \"dialog.close\"],\n              width: 500\n            }, async button => {\n              if (button === 0) Preview.selected.setProjectionMode(false)\n            })\n            if (this.rendering) return\n            this.rendering = true\n            const args = this\n            const dialog = new Dialog({\n              id: \"minecraft_title_render_result\",\n              title: \"Rendering…\",\n              buttons: [],\n              lines: [`<style>\n                #minecraft_title_render_result .hidden {\n                  display: none;\n                }\n                #minecraft_title_render_result .dialog_content {\n                  margin: 0;\n                }\n                #minecraft-title-output {\n                  max-width: 100%;\n                  min-height: 32px;\n                  border: 1px solid var(--color-accent);\n                  object-fit: contain;\n                }\n                #minecraft-title-render-content {\n                  margin: 20px;\n                }\n                #minecraft-title-render-content, #minecraft-title-render-output {\n                  display: flex;\n                  align-items: center;\n                  flex-direction: column;\n                }\n                #minecraft-title-render-button-row {\n                  width: 100%;\n                  display: flex;\n                  gap: 10px;\n                  flex-wrap: wrap;\n                }\n                #minecraft-title-render-button-row > button {\n                  flex: 1;\n                  display: flex;\n                  gap: 10px;\n                  justify-content: center;\n                  align-items: center;\n                  text-decoration: none;\n                  height: 40px;\n                  min-width: 200px;\n                }\n                #minecraft-title-render-button-row > button:focus > div {\n                  text-decoration: underline;\n                }\n                #render-detail-row {\n                  display: flex;\n                  justify-content: space-between;\n                  width: 100%;\n                  gap: 10px;\n                }\n                #minecraft-title-render-output {\n                  gap: 10px;\n                  width: 100%;\n                  height: calc(100vh - 180px - 40px);\n                }\n                #minecraft-title-render-output > .form_inline_select {\n                  width: 100%;\n                  flex-grow: initial;\n                }\n                .minecraft-output-options {\n                  display: flex;\n                  gap: 10px;\n                  width: 100%;\n                  align-items: center;\n                  flex-wrap: wrap;\n                  justify-content: space-between;\n                }\n                .minecraft-output-options.disabled {\n                  pointer-events: none;\n                  opacity: 0.5;\n                }\n                .minecraft-output-options.disabled .sp-preview-inner {\n                  filter: grayscale();\n                }\n                .minecraft-output-options.disabled .sp-preview::after {\n                  content: \"\";\n                  position: absolute;\n                  inset: 0;\n                  background: linear-gradient(to top right, transparent calc(50% - 2px), var(--color-close) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 2px)), linear-gradient(to top left, transparent calc(50% - 2px), var(--color-close) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 2px));\n                }\n                .minecraft-output-label {\n                  font-size: 1.25em;\n                }\n                .minecraft-output-options .bb-select {\n                  flex: 1;\n                  cursor: pointer;\n                }\n                .minecraft-output-options > div {\n                  display: flex;\n                  gap: 10px;\n                  align-items: center;\n                }\n                .minecraft-output-options input:not([type='checkbox']) {\n                  width: 60px;\n                }\n                .minecraft-output-options input[type='checkbox'] {\n                  cursor: pointer;\n                }\n              </style>`],\n              component: {\n                data: {\n                  rendering: true,\n                  image: null,\n                  dimensions: null,\n                  size: null,\n                  canvas: null,\n                  tab: \"normal\",\n                  resolutionWidth: 1920,\n                  resolutionHeight: 1080,\n                  aspectWidth: 16,\n                  aspectHeight: 9,\n                  lastChanged: \"width\",\n                  linked: true,\n                  minecraftMode: \"1.20\",\n                  minecraftModes: {\n                    \"1.20\": \"1.20+ Title Texture\",\n                    \"1.19\": \"1.19- Title Texture\",\n                    mojang: \"Mojang Studios Texture\"\n                  },\n                  backgroundColour: \"#78b8ff\",\n                  backgroundColour2: \"#c7ecff\",\n                  backgroundColourEnabled: false,\n                  backgroundColour2Enabled: false,\n                  updating: false,\n                  tabToUpdate: false,\n                  padding: 0\n                },\n                mounted() {\n                  $(this.$refs.backgroundColour).spectrum(this.colourInput(\"backgroundColour\")),\n                  $(this.$refs.backgroundColour2).spectrum(this.colourInput(\"backgroundColour2\"))\n                },\n                methods: {\n                  async copy() {\n                    const r = await fetch(this.canvas.toDataURL())\n                    navigator.clipboard.write([new ClipboardItem({ \"image/png\": await r.blob() })])\n                    Blockbench.showQuickMessage(\"Copied to clipboard\")\n                  },\n                  save() {\n                    Blockbench.export({\n                      extensions: [\"png\"],\n                      type: tl(\"data.image\"),\n                      savetype: \"image\",\n                      name: Project.name || \"minecraft_title\",\n                      content: this.canvas.toDataURL()\n                    }, () => Blockbench.showQuickMessage(\"Saved title\"))\n                  },\n                  async tabChange(tab) {\n                    this.tab = tab\n                    let canvas, ctx\n                    if (tab === \"normal\") {\n                      ({ canvas, ctx } = new CanvasFrame(this.image.width, this.image.height))\n                      ctx.drawImage(this.image, 0, 0)\n                    } else if (tab === \"square\") {\n                      const max = Math.max(this.image.width, this.image.height);\n                      ({ canvas, ctx } = new CanvasFrame(max, max))\n                      ctx.drawImage(this.image, Math.floor(max / 2 - this.image.width / 2), Math.floor(max / 2 - this.image.height / 2))\n                    } else if (tab === \"custom\") {\n                      ({ canvas, ctx } = new CanvasFrame(this.resolutionWidth, this.resolutionHeight))\n                      const aspect = this.image.width / this.image.height\n                      const ratio = Math.min(canvas.width / this.image.width, canvas.height / this.image.height)\n                      const w = Math.floor(this.image.width * ratio)\n                      const h = Math.floor(this.image.height * ratio)\n                      ctx.drawImage(this.image, Math.floor(canvas.width / 2 - w / 2), Math.floor(canvas.height / 2 - h / 2), w, h)\n                    } else if (tab === \"minecraft\") {\n                      const aspect = this.image.width / this.image.height\n                      let w, h\n                      if (this.image.width > 1024 || this.image.height > 1024) {\n                        if (aspect > 1) {\n                          w = 1024\n                          h = Math.floor(1024 / aspect)\n                        } else {\n                          h = 1024\n                          w = Math.floor(1024 * aspect)\n                        }\n                      } else {\n                        w = this.image.width\n                        h = this.image.height\n                      }\n                      const capped = new CanvasFrame(w, h)\n                      if (this.image.width < 64 || this.image.height < 64) capped.ctx.imageSmoothingEnabled = false\n                      capped.ctx.drawImage(this.image, 0, 0, w, h)\n                      capped.autoCrop()\n                      if (this.minecraftMode === \"1.20\") {\n                        ({ canvas, ctx } = new CanvasFrame(1024, 256))\n                        const scaleFactor = Math.min(1024 / capped.width, 176 / capped.height)\n                        const newWidth = capped.width * scaleFactor\n                        const newHeight = capped.height * scaleFactor\n                        const x = (1024 - newWidth) / 2\n                        const y = (176 - newHeight) / 2\n                        if (newWidth > capped.width) ctx.imageSmoothingEnabled = false\n                        ctx.drawImage(capped.canvas, x, y, newWidth, newHeight)\n                      } else if (this.minecraftMode === \"1.19\") {\n                        const base = await loadImage(\"data:image/png;base64,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\")\n                        let preCanvas\n                        if (capped.width / capped.height < 137 / 22) {\n                          preCanvas = new CanvasFrame(Math.floor((capped.height / 22) * 137), capped.height)\n                          preCanvas.ctx.drawImage(capped.canvas, Math.floor((preCanvas.width - capped.width) / 2), 0)\n                        } else if (capped.width / capped.height > 137 / 22) {\n                          preCanvas = new CanvasFrame(capped.width, Math.floor((capped.width / 137) * 22))\n                          preCanvas.ctx.drawImage(capped.canvas, 0, Math.floor((preCanvas.height - capped.height) / 2))\n                        } else preCanvas = capped;\n                        ({ canvas, ctx } = new CanvasFrame(Math.floor((preCanvas.width / 137) * 128), Math.floor((preCanvas.width / 137) * 128), true, 1024))\n                        ctx.imageSmoothingEnabled = false\n                        ctx.drawImage(base, 0, 0, canvas.width, canvas.height)\n                        const width = Math.floor((preCanvas.width / 274) * 155)\n                        ctx.drawImage(preCanvas.canvas, 0, 0, width, preCanvas.height, 0, 0, width, preCanvas.height)\n                        ctx.drawImage(preCanvas.canvas, width, 0, preCanvas.width - width, preCanvas.height, 0, Math.floor(preCanvas.height / 44 * 45), preCanvas.width - width, preCanvas.height)\n                      } else if (this.minecraftMode === \"mojang\") {\n                        let preCanvas\n                        if (capped.width < capped.height * 4) {\n                          preCanvas = new CanvasFrame(capped.height * 4 + 8, capped.height + 2)\n                          preCanvas.ctx.drawImage(capped.canvas, Math.floor((capped.height * 4 - capped.width) / 2) + 4, 1)\n                        } else if (capped.width > capped.height * 4) {\n                          preCanvas = new CanvasFrame(capped.width + 8, Math.floor(capped.width / 4) + 2)\n                          preCanvas.ctx.drawImage(capped.canvas, 4, Math.floor((preCanvas.height - capped.height) / 2))\n                        } else {\n                          preCanvas = new CanvasFrame(capped.width + 8, capped.height + 4)\n                          preCanvas.ctx.drawImage(capped.canvas, 4, 1)\n                        }\n                        ({ canvas, ctx } = new CanvasFrame(Math.floor(preCanvas.width / 2), Math.floor(preCanvas.width / 2)))\n                        ctx.drawImage(preCanvas.canvas, 0, 0)\n                        ctx.drawImage(preCanvas.canvas, Math.floor(-preCanvas.width / 2), Math.floor(preCanvas.width / 4))\n                      }\n                    }\n                    const padding = tab === \"minecraft\" ? 0 : this.padding\n                    this.canvas.width = canvas.width + padding * 2\n                    this.canvas.height = canvas.height + padding * 2\n                    if (this.tab !== \"minecraft\" && this.backgroundColourEnabled) {\n                      if (this.backgroundColour2Enabled) {\n                        const gradient = this.ctx.createLinearGradient(0, 0, 0, this.canvas.height)\n                        gradient.addColorStop(0, this.backgroundColour)\n                        gradient.addColorStop(1, this.backgroundColour2)\n                        this.ctx.fillStyle = gradient\n                      } else {\n                        this.ctx.fillStyle = this.backgroundColour\n                      }\n                      this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height)\n                    }\n                    this.ctx.drawImage(canvas, padding, padding)\n                    const size = this.canvas.toDataURL().slice(22).length * 0.75\n                    this.dimensions = `${this.canvas.width} x ${this.canvas.height}`\n                    this.size = `${size > 1048576 ? `${Math.roundTo(size / 1048576, 2)} MB` : `${Math.round(size / 1024)} KB`}`\n                  },\n                  changeResolution(changed) {\n                    this.lastChanged = changed\n                    if (this.linked) {\n                      if (changed === \"width\") {\n                        this.resolutionHeight = Math.max(1, Math.floor((this.resolutionWidth * this.aspectHeight) / this.aspectWidth))\n                      } else {\n                        this.resolutionWidth = Math.max(1, Math.floor((this.resolutionHeight * this.aspectWidth) / this.aspectHeight))\n                      }\n                      if (this.resolutionWidth > 4096 || this.resolutionHeight > 4096) {\n                        const aspect = this.resolutionWidth / this.resolutionHeight\n                        if (aspect > 1) {\n                          this.resolutionWidth = 4096\n                          this.resolutionHeight = Math.floor(4096 / aspect)\n                        } else {\n                          this.resolutionHeight = 4096\n                          this.resolutionWidth = Math.floor(4096 * aspect)\n                        }\n                      }\n                    } else {\n                      this.resolutionWidth = Math.max(1, parseInt(this.resolutionWidth))\n                      this.resolutionHeight = Math.max(1, parseInt(this.resolutionHeight))\n                      const [aW, aH] = getAspectRatio(this.resolutionWidth, this.resolutionHeight)\n                      this.aspectWidth = aW\n                      this.aspectHeight = aH\n                    }\n                    this.update(\"custom\")\n                  },\n                  changeAspect() {\n                    this.aspectWidth = Math.max(1, parseInt(this.aspectWidth))\n                    this.aspectHeight = Math.max(1, parseInt(this.aspectHeight))\n                    const [w, h] = getFromAspect(this.aspectWidth, this.aspectHeight, this.resolutionWidth, this.resolutionHeight, this.lastChanged === \"width\")\n                    this.resolutionWidth = w\n                    this.resolutionHeight = h\n                    this.update(\"custom\")\n                  },\n                  colourInput: v => ({\n                    preferredFormat: \"hex\",\n                    color: dialog.component.data[v],\n                    showAlpha: false,\n                    showInput: true,\n                    move: c => dialog.content_vue.updateColour(v, c),\n                    change: c => dialog.content_vue.updateColour(v, c),\n                    hide: c => dialog.content_vue.updateColour(v, c)\n                  }),\n                  updateColour(v, c) {\n                    this[v] = c.toHexString()\n                    this.update(this.tab)\n                  },\n                  async update(tab) {\n                    if (this.updating) {\n                      this.tabToUpdate = tab\n                      return\n                    }\n                    this.updating = true\n                    await this.tabChange(tab)\n                    this.updating = false\n                    if (this.tabToUpdate) {\n                      this.update(this.tabToUpdate)\n                      this.tabToUpdate = false\n                    }\n                  }\n                },\n                template: `\n                  <div id=\"minecraft-title-render-content\">\n                    <h1 v-if=\"rendering\" style=\"text-align:center\">Rendering…</h1>\n                    <div id=\"minecraft-title-render-output\" :style=\"{ display: rendering ? 'none' : 'flex' }\">\n                      <ul class=\"form_inline_select\">\n                        <li @click=\"update('normal')\" :class=\"{ selected: tab === 'normal' }\">Normal</li>\n                        <li @click=\"update('square')\" :class=\"{ selected: tab === 'square' }\">Square</li>\n                        <li @click=\"update('custom')\" :class=\"{ selected: tab === 'custom' }\">Custom</li>\n                        <li @click=\"update('minecraft')\" :class=\"{ selected: tab === 'minecraft' }\">Minecraft</li>\n                      </ul>\n                      <div class=\"minecraft-output-options\" :style=\"{ display: tab === 'custom' ? 'flex' : 'none' }\">\n                        <div>\n                          <div class=\"minecraft-output-label\">Resolution:</div>\n                          <numeric-input v-model=\"resolutionWidth\" :step=\"1\" :min=\"1\" :max=\"4096\" @input=\"changeResolution('width')\" />\n                          <div class=\"minecraft-output-label\" style=\"margin: 0 -5px\">⨉</div>\n                          <numeric-input v-model=\"resolutionHeight\" :step=\"1\" :min=\"1\" :max=\"4096\" @input=\"changeResolution('height')\" />\n                          <div class=\"tool\" :class=\"{ enabled: linked }\" @click=\"linked = !linked\">\n                            <div class=\"tooltip\" style=\"margin-left: 0px;\">Link width and height</div>\n                            <i class=\"fa_big icon fas fa-link\"></i>\n                          </div>\n                        </div>\n                        <div>\n                          <div class=\"minecraft-output-label\">Aspect Ratio:</div>\n                          <numeric-input v-model=\"aspectWidth\" :step=\"1\" :min=\"1\" :max=\"4096\" @input=\"changeAspect\" />\n                          <div class=\"minecraft-output-label\" style=\"margin: 0 -5px\">:</div>\n                          <numeric-input v-model=\"aspectHeight\" :step=\"1\" :min=\"1\" :max=\"4096\" @input=\"changeAspect\" />\n                        </div>\n                      </div>\n                      <div class=\"minecraft-output-options\" :style=\"{ display: tab === 'minecraft' ? 'none' : 'flex' }\">\n                        <div>\n                          <div class=\"minecraft-output-label\">Background Colour:</div>\n                          <input type=\"checkbox\" :checked=\"backgroundColourEnabled\" v-model=\"backgroundColourEnabled\" @input=\"backgroundColourEnabled = !backgroundColourEnabled; update(tab)\" />\n                          <div :class=\"{ hidden: !backgroundColourEnabled }\">\n                            <input ref=\"backgroundColour\" />\n                          </div>\n                        </div>\n                      </div>\n                      <div class=\"minecraft-output-options\" :class=\"{ hidden: tab === 'minecraft', disabled: !backgroundColourEnabled }\">\n                        <div>\n                          <div class=\"minecraft-output-label\">Second Background Colour:</div>\n                          <input type=\"checkbox\" :checked=\"backgroundColour2Enabled\" v-model=\"backgroundColour2Enabled\" @input=\"backgroundColour2Enabled = !backgroundColour2Enabled; update(tab)\" />\n                          <div :class=\"{ hidden: !backgroundColour2Enabled }\">\n                            <input ref=\"backgroundColour2\" />\n                          </div>\n                        </div>\n                      </div>\n                      <div class=\"minecraft-output-options\" :style=\"{ display: tab === 'minecraft' ? 'none' : 'flex' }\">\n                        <div>\n                          <div class=\"minecraft-output-label\">Padding:</div>\n                          <numeric-input v-model=\"padding\" :step=\"1\" :min=\"0\" :max=\"1024\" @input=\"update(tab)\" />\n                        </div>\n                      </div>\n                      <div class=\"minecraft-output-options\" :style=\"{ display: tab === 'minecraft' ? 'flex' : 'none' }\">\n                        <div class=\"minecraft-output-label\">Texture mode:</div>\n                        <select-input v-model=\"minecraftMode\" :options=\"minecraftModes\" @input=\"update('minecraft')\" />\n                      </div>\n                      <div class=\"spacer\"></div>\n                      <canvas id=\"minecraft-title-output\" class=\"checkerboard\" />\n                      <div class=\"spacer\"></div>\n                      <div id=\"render-detail-row\">\n                        <div>{{ dimensions }}</div>\n                        <div>{{ size }}</div>\n                      </div>\n                      <div id=\"minecraft-title-render-button-row\">\n                        <button @click=\"copy\">\n                          <i class=\"material-icons icon\">file_copy</i>\n                          <div>Copy render</div>\n                        </button>\n                        <button @click=\"save\">\n                          <i class=\"material-icons icon\">save</i>\n                          <div>Save render</div>\n                        </button>\n                      </div>\n                    </div>\n                  </div>\n                `\n              },\n              onOpen() {\n                setTimeout(() => Canvas.withoutGizmos(() => {\n                  let minX = Infinity\n                  let maxX = -Infinity\n                  let minY = Infinity\n                  let maxY = -Infinity\n                  const direction = Preview.selected.controls.target.clone().sub(Preview.selected.camera.position).normalize()\n                  Canvas.scene.traverseVisible(cube => {\n                    if (cube.type === \"cube\") {\n                      for (let i = 0; i < 72; i += 3) {\n                        const vertex = new THREE.Vector3(...cube.geometry.attributes.position.array.slice(i, i + 3))\n                        if (direction.dot(vertex.clone().sub(Preview.selected.camera.position).normalize()) <= 0) continue\n                        const vec = vertex.applyMatrix4(cube.matrixWorld).project(Preview.selected.camera)\n                        const x = (vec.x + 1) / 2\n                        const y = (-vec.y + 1) / 2\n                        minX = Math.min(minX, x)\n                        maxX = Math.max(maxX, x)\n                        minY = Math.min(minY, y)\n                        maxY = Math.max(maxY, y)\n                      }\n                    }\n                  })\n                  if (minX === Infinity) {\n                    dialog.close()\n                    Blockbench.showQuickMessage(\"Nothing in frame\")\n                    args.rendering = false\n                    return\n                  }\n                  minX = Math.max(minX, 0)\n                  maxX = Math.min(maxX, 1)\n                  minY = Math.max(minY, 0)\n                  maxY = Math.min(maxY, 1)\n                  if (minX === maxX || minY === maxY) {\n                    dialog.close()\n                    Blockbench.showQuickMessage(\"Nothing in frame\")\n                    args.rendering = false\n                    return\n                  }\n                  const aspect = (maxX - minX) / ((maxY - minY) * Preview.selected.height / Preview.selected.width)\n                  let outWidth, outHeight\n                  const resolution = args.antialias ? Math.min(args.resolution * 2, 4096) : args.resolution\n                  if (aspect > 1) {\n                    outWidth = resolution\n                    outHeight = resolution / aspect\n                  } else {\n                    outWidth = resolution * aspect\n                    outHeight = resolution\n                  }\n                  preview.resize(outWidth, outHeight)\n                  preview.controls.target.copy(Preview.selected.controls.target)\n                  preview.camera.position.copy(Preview.selected.camera.position)\n                  const fullWidth = outWidth / (maxX - minX)\n                  const fullHeight = outHeight / (maxY - minY)\n                  preview.camera.setViewOffset(fullWidth, fullHeight, minX * fullWidth, minY * fullHeight, outWidth, outHeight)\n                  preview.render()\n                  const img = new CanvasFrame(preview.canvas)\n                  img.autoCrop()\n                  const imageData = img.ctx.getImageData(0, 0, img.width, img.height)\n                  const data = imageData.data\n                  const length = data.length\n                  const width = img.width\n                  const height = img.height\n                  const width1 = width - 1\n                  const height1 = height - 1\n                  for (let i = length - 4; i >= 0; i -= 4) {\n                    const x = i / 4 % img.width\n                    const y = Math.floor(i / (4 * height))\n                    if (data[i + 3] === 0) {\n                      if (\n                        (x === 0 || data[i - 1] !== 0) &&\n                        (x === width1 || data[i + 7] !== 0) &&\n                        (y === 0 || data[i - width * 4 + 3] !== 0) &&\n                        (y === height1 || data[i + width * 4 + 3] !== 0)\n                      ) {\n                        let count = 0\n                        let sr, sg, sb, sa\n                        sr = sg = sb = sa = 0\n                        if (x !== 0) {\n                          count++\n                          sr += data[i - 4]\n                          sg += data[i - 3]\n                          sb += data[i - 2]\n                          sa += data[i - 1]\n                        }\n                        if (x !== width1) {\n                          count++\n                          sr += data[i + 4]\n                          sg += data[i + 5]\n                          sb += data[i + 6]\n                          sa += data[i + 7]\n                        }\n                        if (y !== 0) {\n                          count++\n                          sr += data[i - width * 4]\n                          sg += data[i - width * 4 + 1]\n                          sb += data[i - width * 4 + 2]\n                          sa += data[i - width * 4 + 3]\n                        }\n                        if (y !== height1) {\n                          count++\n                          sr += data[i + width * 4]\n                          sg += data[i + width * 4 + 1]\n                          sb += data[i + width * 4 + 2]\n                          sa += data[i + width * 4 + 3]\n                        }\n                        data[i] = sr / count\n                        data[i + 1] = sg / count\n                        data[i + 2] = sb / count\n                        data[i + 3] = sa / count\n                      } else {\n                        const store = []\n                        const queue = [i]\n                        while (store.length < 6 && queue.length !== 0) {\n                          const j = queue.shift()\n                          store.push(j)\n                          const x = j / 4 % img.width\n                          if (x !== 0 && data[j - 1] === 0 && !store.includes(j - 4)) queue.push(j - 4)\n                          if (x !== width1 && data[j + 7] === 0 && !store.includes(j + 4)) queue.push(j + 4)\n                          if (Math.floor(j / (4 * height)) !== 0 && data[j - width * 4 + 3] === 0 && !store.includes(j - width * 4)) queue.push(j - width * 4)\n                        }\n                        if (store.length >= 6) continue\n                        for (const j of store) {\n                          const x = j / 4 % img.width\n                          const y = Math.floor(j / (4 * height))\n                          let count = 0\n                          let sr, sg, sb, sa\n                          sr = sg = sb = sa = 0\n                          if (x !== 0 && data[j - 1] !== 0) {\n                            count++\n                            sr += data[j - 4]\n                            sg += data[j - 3]\n                            sb += data[j - 2]\n                            sa += data[j - 1]\n                          }\n                          if (x !== width1 && data[j + 7] !== 0) {\n                            count++\n                            sr += data[j + 4]\n                            sg += data[j + 5]\n                            sb += data[j + 6]\n                            sa += data[j + 7]\n                          }\n                          if (y !== 0 && data[j - width * 4 + 3] !== 0) {\n                            count++\n                            sr += data[j - width * 4]\n                            sg += data[j - width * 4 + 1]\n                            sb += data[j - width * 4 + 2]\n                            sa += data[j - width * 4 + 3]\n                          }\n                          if (y !== height1 && data[j + width * 4 + 3] !== 0) {\n                            count++\n                            sr += data[j + width * 4]\n                            sg += data[j + width * 4 + 1]\n                            sb += data[j + width * 4 + 2]\n                            sa += data[j + width * 4 + 3]\n                          }\n                          data[j] = sr / count\n                          data[j + 1] = sg / count\n                          data[j + 2] = sb / count\n                          data[j + 3] = sa / count\n                        }\n                      } \n                    } else if (\n                      (x === 0 || data[i - 1] === 0) &&\n                      (x === width1 || data[i + 7] === 0) &&\n                      (y === 0 || data[i - width * 4 + 3] === 0) &&\n                      (y === height1 || data[i + width * 4 + 3] === 0)\n                    ) {\n                      data[i + 3] = 0\n                    } else {\n                      const store = []\n                      const queue = [i]\n                      while (store.length < 6 && queue.length !== 0) {\n                        const j = queue.shift()\n                        store.push(j)\n                        const x = j / 4 % img.width\n                        if (x !== 0 && data[j - 1] !== 0 && !store.includes(j - 4)) queue.push(j - 4)\n                        if (x !== width1 && data[j + 7] !== 0 && !store.includes(j + 4)) queue.push(j + 4)\n                        if (Math.floor(j / (4 * height)) !== 0 && data[j - width * 4 + 3] !== 0 && !store.includes(j - width * 4)) queue.push(j - width * 4)\n                      }\n                      if (store.length >= 6) continue\n                      for (const j of store) {\n                        data[j + 3] = 0\n                      }\n                    }\n                  }\n                  img.ctx.putImageData(imageData, 0, 0)\n                  img.autoCrop()\n                  let out\n                  if (args.antialias) {\n                    const canvas = new CanvasFrame(img.width, img.height)\n                    canvas.ctx.filter = \"blur(0.75px)\"\n                    canvas.ctx.drawImage(img.canvas, 0, 0)\n                    out = new CanvasFrame(Math.floor(img.width / 2), Math.floor(img.height / 2))\n                    out.ctx.drawImage(canvas.canvas, 0, 0, out.width, out.height)\n                  } else {\n                    out = img\n                  }\n                  args.rendering = false\n                  this.content_vue.rendering = false\n                  this.content_vue.image = out.canvas\n                  const size = out.canvas.toDataURL().slice(22).length * 0.75\n                  this.content_vue.dimensions = `${out.canvas.width} x ${out.canvas.height}`\n                  this.content_vue.size = `${size > 1048576 ? `${Math.roundTo(size / 1048576, 2)} MB` : `${Math.round(size / 1024)} KB`}`\n                  dialog.object.style.width = `${Math.max(450, out.canvas.width)}px`\n                  dialog.object.querySelector(\".dialog_title\").textContent = \"Minecraft Title Render\"\n                  dialog.object.style.left = `${Math.clamp((window.innerWidth - dialog.object.clientWidth) / 2, 0, 2000)}px`\n                  dialog.object.addEventListener(\"keydown\", e => {\n                    if (e.key === \"Enter\") return e.stopPropagation()\n                  })\n                  setTimeout(() => {\n                    this.content_vue.canvas = dialog.object.querySelector(\"#minecraft-title-output\")\n                    this.content_vue.canvas.width = this.content_vue.image.width\n                    this.content_vue.canvas.height = this.content_vue.image.height\n                    this.content_vue.ctx = this.content_vue.canvas.getContext(\"2d\")\n                    this.content_vue.ctx.drawImage(this.content_vue.image, 0, 0)\n                  }, 0)\n                }), 10)\n              }\n            })\n            dialog.show()\n          },\n          position: loadRenderAngle,\n          custom() {\n            new Dialog({\n              id: \"custom_resolution\",\n              title: \"Custom Resolution\",\n              form: {\n                resolution: {\n                  label: \"Resolution\",\n                  type: \"number\",\n                  value: this.resolution,\n                  min: 1,\n                  max: 4096\n                },\n                info: {\n                  type: \"info\",\n                  text: \"The resolution determines the width or height of the render, depending on which one is larger. The chosen resolution may not exactly match the render size\"\n                },\n                info2: {\n                  type: \"info\",\n                  text: \"If antialiasing is enabled, the render size is capped at 2048 pixels\"\n                }\n              },\n              onConfirm: result => this.resolution = this.antialias ? Math.min(result.resolution, 2048) : result.resolution\n            }).show()\n          }\n        },\n        data: {\n          resolution: 1024,\n          antialias: true,\n          rendering: false\n        },\n        template: `\n          <div id=\"minecraft-title-render-controls\">\n            <div id=\"minecraft-title-render-buttons\">\n              <div @click=\"position\" class=\"tool\">\n                <div class=\"tooltip\">Position camera<div class=\"tooltip_description\">Position the camera at the correct angle for rendering a Minecraft Title</div></div>\n                <i class=\"material-icons icon\">text_rotation_angleup</i>\n              </div>\n              <div @click=\"render\" class=\"tool\" :class=\"{ disabled: rendering }\">\n                <div class=\"tooltip\">Render Minecraft Title<div class=\"tooltip_description\">Render the Minecraft Title as an image</div></div>\n                <i class=\"material-icons icon\">photo_camera</i>\n              </div>\n            </div>\n            <div class=\"minecraft-title-render-controls-row\">\n              <div id=\"minecraft-title-render-resolutions\">\n                <div class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"resolution = 480\" :class=\"{ selected: resolution === 480 }\" title=\"Around 480 pixels\">\n                  <svg width=\"32\" height=\"32\" viewBox=\"0 -960 960 960\"><path d=\"M160-80.01c-22 0-40.833-7.823-56.5-23.49S80-137.99 80-159.99l.01-640.02c0-22 7.823-40.823 23.49-56.49s34.49-23.49 56.49-23.49H800c22 0 40.833 7.823 56.5 23.49s23.5 34.49 23.5 56.49l-.01 640.02c0 22-7.823 40.823-23.49 56.49S822-80.01 800-80.01zM280-360h120c11.333 0 20.833-3.833 28.5-11.5S440-388.667 440-400v-60c0-11.333-3.833-20.833-11.5-28.5S411.333-500 400-500H300v-40h80v20h60v-40c0-11.333-3.833-20.833-11.5-28.5S411.333-600 400-600H280c-11.333 0-20.833 3.833-28.5 11.5S240-571.333 240-560v60c0 11.333 3.833 20.833 11.5 28.5S268.667-460 280-460h100v40h-80v-20h-60v40c0 11.333 3.833 20.833 11.5 28.5S268.667-360 280-360zm240 0h160c11.333 0 20.833-3.833 28.5-11.5S720-388.667 720-400v-160c0-11.333-3.833-20.833-11.5-28.5S691.333-600 680-600H520zm60-60v-120h80v120z\"/></svg>\n                </div>\n                <div class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"resolution = 720\" :class=\"{ selected: resolution === 720 }\" title=\"Around 720 pixels\">\n                  <svg width=\"32\" height=\"32\" viewBox=\"0 -960 960 960\"><path d=\"M240-360h60v-80h80v80h60v-240h-60v100h-80v-100h-60zm280 0h160c11.333 0 20.833-3.833 28.5-11.5S720-388.667 720-400v-160c0-11.333-3.833-20.833-11.5-28.5S691.333-600 680-600H520zm60-60v-120h80v120zM160-80.01c-22 0-40.833-7.823-56.5-23.49s-23.495-34.49-23.495-56.49l.01-640.02c0-22 7.818-40.823 23.485-56.49s34.49-23.49 56.49-23.49H800c22 0 40.833 7.823 56.5 23.49s23.49 34.49 23.49 56.49v640.02c0 22-7.823 40.823-23.49 56.49s-34.49 23.49-56.49 23.49z\"/></svg>\n                </div>\n                <div class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"resolution = 1024\" :class=\"{ selected: resolution === 1024 }\" title=\"Around 1024 pixels\">\n                  <i class=\"material-icons icon\">1k</i>\n                </div>\n                <div class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"resolution = 2048\" :class=\"{ selected: resolution === 2048 }\" title=\"Around 2048 pixels\">\n                  <i class=\"material-icons icon\">2k</i>\n                </div>\n                <div v-if=\"!antialias\" class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"resolution = 4096\" :class=\"{ selected: resolution === 4096 }\" title=\"Around 4096 pixels\">\n                  <i class=\"material-icons icon\">4k</i>\n                </div>\n                <div class=\"minecraft-title-render-resolution minecraft-title-button\" @click=\"custom\" :class=\"{ selected: ![480, 720, 1024, 2048, 4096].includes(resolution) }\" title=\"Custom size\" style=\"display:flex;align-items:center;justify-content:center\">\n                  <i style=\"font-size:24px;margin-left:-3px\" class=\"material-icons icon\">tag</i>\n                </div>\n              </div>\n              <div style=\"margin-right:-20px\">Antialiasing:</div>\n              <input type=\"checkbox\" :checked=\"antialias\" v-model=\"antialias\" @input=\"resolution = Math.min(resolution, 2048)\">\n            </div>\n          </div>\n        `\n      }).$mount(vue)\n      preview = new Preview({\n        id: \"minecraft_title_preview\",\n        antialias: false,\n        offscreen: true\n      })\n      dialog = new Dialog({\n        id: \"new_minecraft_title_text\",\n        title: \"Add Minecraft Title Text\",\n        buttons: [],\n        lines: [`<style>\n          #new_minecraft_title_text {\n            overflow: hidden;\n          }\n          #new_minecraft_title_text .dialog_title {\n            display: none;\n          }\n          #new_minecraft_title_text > .dialog_handle,\n          #new_minecraft_title_text .dialog_close_button {\n            z-index: 3;\n          }\n          #new_minecraft_title_text .dialog_content {\n            margin: 0;\n          }\n          #new_minecraft_title_text .dialog_close_button:hover {\n            border-radius: 6px;\n          }\n          #minecraft-title-tabs {\n            background-color: var(--color-frame);\n            display: flex;\n            gap: 2px;\n            padding: 4px 4px 0;\n            position: sticky;\n            top: 0;\n            z-index: 3;\n          }\n          #minecraft-title-tabs > div {\n            padding: 4px 12px;\n            cursor: pointer;\n            border-top: 2px solid transparent;\n            background-color: var(--color-back);\n            flex: 1;\n            text-align: center;\n          }\n          #minecraft-title-tabs > div.selected {\n            background-color: var(--color-ui);\n            border-top-color: var(--color-accent);\n            cursor: default;\n          }\n          .minecraft-title-contents {\n            display: none;\n            padding: 20px 20px 0;\n            flex-direction: column;\n          }\n          #minecraft_title_generator .visible {\n            display: flex !important;\n          }\n          #minecraft-title-buttons {\n            display: flex;\n            padding: 20px 12px 20px 20px;\n            gap: 10px;\n            position: absolute;\n            bottom: 0;\n            left: 0;\n            right: 8px;\n            z-index: 2;\n            background-color: var(--color-ui);\n          }\n          .minecraft-title-contents .slider-label {\n            margin: 3px 10px 0 0;\n          }\n          .minecraft-title-contents .checkbox-row div {\n            margin: 3px 0 0 5px;\n          }\n          .minecraft-title-contents input.hidden + div {\n            display: none !important;\n          }\n          .minecraft-title-contents .checkbox-row {\n            display: flex;\n            cursor: pointer;\n          }\n          .minecraft-title-contents .checkbox-row * {\n            cursor: pointer;\n          }\n          .minecraft-title-contents .bb-select {\n            cursor: pointer;\n          }\n          #minecraft_title_generator {\n            padding-bottom: 72px;\n          }\n          #minecraft-title-preview-container {\n            margin-bottom: -10px;\n            position: sticky;\n            top: 38px;\n            z-index: 2;\n            cursor: pointer;\n            display: none;\n          }\n          #minecraft-title-preview {\n            width: 100%;\n            height: 150px;\n            image-rendering: auto;\n            object-fit: contain;\n          }\n          #minecraft-title-preview-container > .icon {\n            position: absolute;\n            bottom: 7px;\n            right: 7px;\n          }\n          #minecraft-title-preview-container > .fa {\n            position: absolute;\n            bottom: 3px;\n            left: 3px;\n            font-size: 18px;\n            padding: 6px;\n          }\n          .minecraft-title-item-buttons {\n            position: absolute;\n            top: 4px;\n            left: 4px;\n            font-size: 1.25rem;\n            z-index: 1;\n            flex-direction: column;\n            gap: 3px;\n            display: flex;\n          }\n          .minecraft-title-item-buttons > i {\n            display: none;\n            font-size: 1.25rem;\n          }\n          .minecraft-title-item:hover i {\n            display: flex !important;\n          }\n          .minecraft-title-item-author:hover::after {\n            content: attr(data-author);\n            font-family: var(--font-main);\n            position: absolute;\n            background-color: var(--color-dark);\n            padding: 4px;\n            margin: 0 0 0 22px;\n            font-size: 0.8em;\n            pointer-events: none;\n          }\n          .minecraft-title-item:nth-child(3n) .minecraft-title-item-author:hover::after {\n            transform: translateX(calc(-100% - 25px));\n          }\n          .minecraft-title-item-buttons > .fa::before {\n            font-size: 16px;\n            margin-left: 1.25px;\n          }\n          #minecraft-title-expanded-preview {\n            position: absolute;\n            inset: 26px 0 0;\n            z-index: 29;\n            background-color: #0004;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            backdrop-filter: blur(2px);\n            cursor: pointer;\n          }\n          #minecraft-title-expanded-preview > canvas {\n            box-shadow: 0 10px 10px #0004;\n            max-width: calc(100vw - 40px);\n            max-height: calc(100vh - 40px);\n          }\n          #minecraft_title_generator .sp-replacer {\n            display: flex;\n            margin-bottom: 10px;\n          }\n          #minecraft_title_generator .form_inline_select {\n            margin: 10px 0;\n          }\n          .minecraft-title-file > canvas {\n            max-height: 160px;\n            object-fit: contain;\n            cursor: pointer;\n          }\n          .minecraft-title-file {\n            display: flex;\n            flex-direction: column;\n            gap: 10px;\n          }\n          #minecraft-title-custom-gradient-customiser {\n            display: flex;\n            gap: 5px;\n          }\n          #minecraft-title-gradient-preview {\n            flex: 1;\n            height: 160px;\n          }\n          .minecraft-title-file.hidden, #minecraft-title-custom-gradient.hidden {\n            display: none;\n          }\n          #minecraft-title-gradient-colours {\n            display: flex;\n            flex-direction: column;\n            justify-content: space-between;\n          }\n          #minecraft-title-gradient-colours > div {\n            display: flex;\n            gap: 5px;\n            justify-content: flex-end;\n          }\n          #minecraft-title-gradient-colours .sp-replacer {\n            margin-bottom: 0;\n          }\n          #minecraft-title-gradient-colours .sp-preview {\n            width: 50px;\n          }\n          #minecraft-title-gradient-colours input.disabled + div {\n            opacity: 0.5;\n            pointer-events: none;\n            cursor: not-allowed;\n          }\n          #minecraft-title-gradient-colours input.disabled + div .sp-preview::after {\n            content: \"\";\n            position: absolute;\n            inset: 0;\n            background: linear-gradient(to top right, transparent calc(50% - 2px), var(--color-close) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 2px)), linear-gradient(to top left, transparent calc(50% - 2px), var(--color-close) calc(50% - 1px) calc(50% + 1px), transparent calc(50% + 2px));\n          }\n          #minecraft-title-gradient-colours input.disabled + div .sp-preview-inner {\n            filter: grayscale(1);\n          }\n          .minecraft-title-header-row {\n            display: flex;\n            justify-content: space-between;\n            align-items: end;\n          }\n          .github-link, .github-link > a {\n            display: flex;\n            gap: 5px;\n            justify-content: flex-end;\n            align-items: center;\n            text-decoration: none;\n          }\n          .github-link > a:hover > div {\n            text-decoration: underline;\n            cursor: pointer;\n          }\n          #minecraft-title-custom-texture, #minecraft-title-custom-overlay {\n            position: relative;\n          }\n          #minecraft-title-custom-texture > i, #minecraft-title-custom-overlay > i {\n            position: absolute;\n            top: 7px;\n            right: 7px;\n            cursor: pointer;\n          }\n          #text-type-input {\n            text-decoration: none;\n          }\n          body:has(#text-type-input:focus) > .contextMenu > li > span::after {\n            opacity: 0.8;\n            font-size: 12px;\n          }\n          body:has(#text-type-input:focus) > .contextMenu > li:first-child > span::after {\n            content: 'The \"Minecraft\" text';\n            margin-left: 35px;\n          }\n          body:has(#text-type-input:focus) > .contextMenu > li:nth-child(2) > span::after {\n            content: 'The update text';\n            margin-left: 10px;\n          }\n          body:has(#text-type-input:focus) > .contextMenu > li:last-child > span::after {\n            content: 'The edition text';\n            margin-left: 22px;\n          }\n          #new_minecraft_title_text .dialog_close_button:not(:is(:last-child)):not(:is(:nth-last-child(2))):hover {\n            background-color: var(--color-accent);\n          }\n          #new_minecraft_title_text .dialog_close_button.selected:not(:hover)::after {\n            content: \"\";\n            position: absolute;\n            background-color: var(--color-accent);\n            left: 0;\n            right: 0;\n            bottom: 0;\n            height: 2px;\n          }\n          .minecraft-texture-search {\n            display: flex;\n            align-items: center;\n            margin-bottom: 10px;\n            position: relative;\n\n            > input {\n              flex: 1;\n              padding-right: 32px;\n            }\n\n            > i {\n              position: absolute;\n              right: 6px;\n              top: 50%;\n              transform: translateY(-50%);\n              pointer-events: none;\n\n              &.active {\n                cursor: pointer;\n                pointer-events: initial;\n              }\n            }\n          }\n          .text-input-row {\n            display: flex;\n            gap: 10px;\n            align-items: center;\n          }\n          .text-input-row > input {\n            flex: 1;\n          }\n          #minecraft-title-connection-warning {\n            background-color: var(--color-frame);\n            padding: 10px;\n          }\n          #minecraft-title-connection-warning * {\n            cursor: pointer;\n          }\n          #minecraft-title-connection-warning > div {\n            border: 1px solid var(--color-warning);\n            border-radius: 10px;\n            padding: 5px 10px;\n            position: relative;\n            z-index: 0;\n            overflow: hidden;\n            color: var(--color-light);\n            display: flex;\n            align-items: center;\n            gap: 10px;\n          }\n          #minecraft-title-connection-warning > div::before {\n            content: \"\";\n            position: absolute;\n            inset: 0;\n            background-color: var(--color-warning);\n            z-index: -1;\n            opacity: 0.25;\n          }\n          #minecraft-title-connection-warning > div > svg {\n            fill: var(--color-light);\n          }\n          #minecraft-title-connection-warning-underline {\n            text-decoration: underline;\n          }\n          .tileable-preview {\n            width: calc(100% - 34px);\n            min-height: 48px;\n            overflow: hidden;\n          }\n          .tileable-preview > div {\n            scale: 3;\n            width: 100%;\n            height: 100%;\n            transform-origin: 0 0;\n          }\n          .radio-row {\n            display: flex;\n            align-items: center;\n            gap: 20px !important;\n          }\n          .radio-row > label {\n            display: flex;\n            align-items: center;\n            gap: 6px;\n            cursor: pointer;\n          }\n          .radio-row > label * {\n            cursor: pointer;\n          }\n          .minecraft-title-button-row {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n          }\n          .minecraft-title-button-row > button {\n            flex: 1;\n            min-height: 32px;\n            height: initial;\n            line-height: 110%;\n            padding-top: 6px;\n            padding-bottom: 6px;\n          }\n          .space-below {\n            margin-bottom: 5px;\n          }\n          #minecraft-title-generator-title {\n            position: absolute;\n            top: 0;\n            left: 16px;\n            z-index: 3;\n            padding-top: 2px;\n            font-size: 1.12em;\n            pointer-events: none;\n          }\n        </style>`],\n        component: {\n          data: getDefaultDialogArgs(),\n          mounted() {\n            $(this.$refs.colour).spectrum(colourInput(dialog, \"colour\")),\n            $(this.$refs.customBorderColour).spectrum(colourInput(dialog, \"customBorderColour\")),\n            $(this.$refs.customEdgeColour).spectrum(colourInput(dialog, \"customEdgeColour\")),\n            $(this.$refs.gradientColour0).spectrum(colourInput(dialog, \"gradientColour0\")),\n            $(this.$refs.gradientColour1).spectrum(colourInput(dialog, \"gradientColour1\")),\n            $(this.$refs.gradientColour2).spectrum(colourInput(dialog, \"gradientColour2\")),\n            $(this.$refs.gradientColour3).spectrum(colourInput(dialog, \"gradientColour3\")),\n            $(this.$refs.gradientColour4).spectrum(colourInput(dialog, \"gradientColour4\")),\n            $(this.$refs.overlayColour).spectrum(colourInput(dialog, \"overlayColour\"))\n          },\n          methods: {\n            resetVariables(type, page) {\n              if (!variables[type][page]) return\n              for (const [k, v] of Object.entries(variables[type][page])) {\n                this[k] = v\n              }\n            },\n            async reset(force, ignoreUpdate) {\n              const font = fontData.find(e => e.type === fonts[this.font].type).id\n              const beforeFont = this.font\n              if (force) {\n                for (let i = 0; i < variables.main.length; i++) {\n                  this.resetVariables(\"main\", i)\n                }\n              } else {\n                this.resetVariables(\"main\", this.tab)\n              }\n              if (force || this.tab === 0) {\n                this.font = font\n                this.baseFont = font\n\n                if (beforeFont !== this.font) {\n                  await this.updateFont(true)\n                }\n              }\n              if (force || this.tab === 1) {\n                this.texture = Object.keys(fonts[this.font].textures)[1] ?? Object.keys(fonts[this.font].textures)[0]\n                this.deleteCustomTexture()\n                $(this.$refs.gradientColour0).spectrum(\"set\", \"#FFCF76\")\n                $(this.$refs.gradientColour1).spectrum(\"set\", \"#FFA3A3\")\n                $(this.$refs.gradientColour2).spectrum(\"set\", \"#F4C1A4\")\n                $(this.$refs.gradientColour3).spectrum(\"set\", \"#E19A3E\")\n                $(this.$refs.gradientColour4).spectrum(\"set\", \"#DA371E\")\n              }\n              this.resetTexture(force)\n              if (!ignoreUpdate) this.buildPreview()\n            },\n            resetTexture(force) {\n              if (force) {\n                for (let i = 0; i < variables.main.length; i++) {\n                  this.resetVariables(\"texture\", i)\n                }\n              } else {\n                this.resetVariables(\"texture\", this.tab)\n              }\n              if (force || this.tab === 2) {\n                this.deleteCustomOverlay()\n                $(this.$refs.overlayColour).spectrum(\"set\", \"#fff\")\n              }\n              if (force || this.tab === 3) {\n                $(this.$refs.colour).spectrum(\"set\", \"#fff\")\n                $(this.$refs.customBorderColour).spectrum(\"set\", \"#000\")\n                $(this.$refs.customEdgeColour).spectrum(\"set\", \"#000\")\n              }\n            },\n            finish: () => dialog.onConfirm(),\n            async updateFont(ignoreUpdate) {\n              await getFontTextures(this.font)\n              if (!this.textures.find(e => e[0] === \"flat\" && e[2] === this.font)) {\n                const textures = Object.entries(fonts[this.font].textures).map(e => e.concat([this.font]))\n                const overlays = Object.entries(fonts[this.font].overlays).map(e => e.concat([this.font]))\n                textures.sort((a, b) => {\n                  const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0\n                  const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0\n                  return statsB - statsA\n                })\n                overlays.sort((a, b) => {\n                  const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0\n                  const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0\n                  return statsB - statsA\n                })\n                this.textures.push(...textures)\n                this.overlays.push(...overlays)\n              }\n              this.texture = Object.keys(fonts[this.font].textures)[1] ?? Object.keys(fonts[this.font].textures)[0]\n              this.variant = null\n              this.overlay = Object.keys(fonts[this.font].overlays)[0]\n              this.characterSpacing = fonts[this.font].characterSpacing ?? 0\n              if (!ignoreUpdate) this.buildPreview()\n            },\n            buildPreview() {\n              let finish\n              setTimeout(async () => {\n                if (this.building) {\n                  this.build = true\n                  finish()\n                  return\n                }\n                this.building = true\n                await this.makePreview()\n                this.building = false\n                if (this.build) {\n                  this.update = false\n                  await this.buildPreview()\n                }\n                finish()\n              }, 0)\n              return new Promise(fulfil => finish = fulfil)\n            },\n            async makePreview() {\n              this.scene.remove(...this.scene.children)\n\n              const texture = await makeTexture(getArgs(this, true))\n\n              this.material = new THREE.MeshBasicMaterial({\n                map: texture,\n                transparent: true,\n                alphaTest: 0.5\n              })\n              \n              await getFontCharacters(this.font)\n\n              const addText = (str, args = {}) => {\n                let width = 0\n                const cubes = []\n                const group = new THREE.Group()\n                let lastCharacter\n                for (const [i, char] of Array.from(str).entries()) {\n                  if (char === \" \" && !fonts[this.font].characters[\" \"]) {\n                    width += fonts[this.font].spaceWidth ?? 8\n                    continue\n                  }\n                  if (lastCharacter && fonts[this.font].shifts?.[lastCharacter + char]) {\n                    width -= fonts[this.font].shifts[lastCharacter + char]\n                  }\n                  let min = Infinity\n                  let max = -Infinity\n                  const character = new THREE.Group()\n                  for (let cube of fonts[this.font].characters[char]) {\n                    if (!cube.parsed) {\n                      cube.parsed = true\n                      for (const [direction, uv] of Object.entries(cube.faces)) {\n                        cube.faces[direction] = { uv }\n                      }\n                    }\n\n                    cube = JSON.parse(JSON.stringify(cube))\n                    min = Math.min(min, cube.from[0], cube.to[0])\n                    max = Math.max(max, cube.from[0], cube.to[0])\n\n                    if (args.type === \"bottom\" && !fonts[this.font].flat) {\n                      if (cube.to[2] > cube.from[2]) {\n                        cube.to[2] += 20\n                      } else {\n                        cube.from[2] += 20\n                      }\n                    }\n\n                    const geometry = new THREE.BoxGeometry(cube.to[0] - cube.from[0], cube.to[1] - cube.from[1], cube.to[2] - cube.from[2])\n                    const mesh = new THREE.Mesh(geometry, this.material)\n\n                    mesh.position.fromArray([\n                      (cube.from[0] + cube.to[0]) / 2,\n                      (cube.from[1] + cube.to[1]) / 2,\n                      (cube.from[2] + cube.to[2]) / 2\n                    ])\n\n                    const indexes = {\n                      north: 40,\n                      east: 0,\n                      south: 32,\n                      west: 8,\n                      up: 16,\n                      down: 24\n                    }\n\n                    for (const key of Object.keys(indexes)) {\n                      const face = cube.faces[key]\n                      const i = indexes[key]\n                      if (face) {\n                        const uv = [\n                          [face.uv[0] / 16, 1 - (face.uv[1] / 16)],\n                          [face.uv[2] / 16, 1 - (face.uv[1] / 16)],\n                          [face.uv[0] / 16, 1 - (face.uv[3] / 16)],\n                          [face.uv[2] / 16, 1 - (face.uv[3] / 16)]\n                        ]\n                        geometry.attributes.uv.array.set(uv[0], i + 0)\n                        geometry.attributes.uv.array.set(uv[1], i + 2)\n                        geometry.attributes.uv.array.set(uv[2], i + 4)\n                        geometry.attributes.uv.array.set(uv[3], i + 6)\n                      } else {\n                        const offset = i / 8 * 6\n                        geometry.index.array[offset] = 0\n                        geometry.index.array[offset + 1] = 0\n                        geometry.index.array[offset + 2] = 0\n                        geometry.index.array[offset + 3] = 0\n                        geometry.index.array[offset + 4] = 0\n                        geometry.index.array[offset + 5] = 0\n                      }\n                    }\n                    character.add(mesh)\n                    cubes.push(mesh)\n                  }\n                  if (i) max += fonts[this.font].characterSpacing ?? 0\n                  for (const cube of character.children) {\n                    cube.position.x -= width + max\n                  }\n                  group.add(character)\n                  width += max - min\n                  lastCharacter = char\n                }\n\n                for (const cube of cubes) {\n                  cube.position.x += width / 2\n                }\n\n                if (fonts[this.font].autoBorder) {\n                  let minX = Infinity\n                  let minY = Infinity\n                  let minZ = Infinity\n                  let maxX = -Infinity\n                  let maxY = -Infinity\n                  let maxZ = -Infinity\n\n                  for (const cube of cubes) {\n                    const from = [\n                      cube.position.x - cube.geometry.parameters.width / 2,\n                      cube.position.y - cube.geometry.parameters.height / 2,\n                      cube.position.z - cube.geometry.parameters.depth / 2\n                    ]\n                    const to = [\n                      from[0] + cube.geometry.parameters.width,\n                      from[1] + cube.geometry.parameters.height,\n                      from[2] + cube.geometry.parameters.depth\n                    ]\n                    minX = Math.min(minX, from[0], to[0])\n                    minY = Math.min(minY, from[1], to[1])\n                    minZ = Math.min(minZ, from[2], to[2])\n                    maxX = Math.max(maxX, from[0], to[0])\n                    maxY = Math.max(maxY, from[1], to[1])\n                    maxZ = Math.max(maxZ, from[2], to[2])\n                  }\n\n                  const geometry = new THREE.BoxGeometry(minX - maxX - 4, minY - maxY - 4, minZ - maxZ - 4)\n                  const mesh = new THREE.Mesh(geometry, this.material)\n\n                  mesh.position.fromArray([\n                    (maxX + minX) / 2,\n                    (maxY + minY) / 2,\n                    (maxZ + minZ) / 2\n                  ])\n\n                  const indexes = [40, 0, 32, 8, 16, 24]\n\n                  for (const i of indexes) {\n                    const uv = [\n                      [0, 1 - fonts[this.font].border / fonts[this.font].textureHeight],\n                      [1 / fonts[this.font].textureWidth, 1 - fonts[this.font].border / fonts[this.font].textureHeight],\n                      [0, 1 - (fonts[this.font].border + 1) / fonts[this.font].textureHeight],\n                      [1 / fonts[this.font].textureWidth, 1 - (fonts[this.font].border + 1) / fonts[this.font].textureHeight]\n                    ]\n                    mesh.geometry.attributes.uv.array.set(uv[0], i + 0)\n                    mesh.geometry.attributes.uv.array.set(uv[1], i + 2)\n                    mesh.geometry.attributes.uv.array.set(uv[2], i + 4)\n                    mesh.geometry.attributes.uv.array.set(uv[3], i + 6)\n                  }\n\n                  group.add(mesh)\n                }\n\n                if (args.type === \"bottom\") {\n                  group.scale.setX(0.75)\n                  group.scale.setY(1.6)\n                  group.scale.setZ(0.75)\n                  group.rotation.fromArray([Math.degToRad(-90), 0, 0])\n                  group.position.z += fonts[this.font].height + 49\n                  if (fonts[this.font].flat) {\n                    group.position.y -= 18\n                  } else {\n                    group.position.y -= 25 - fonts[this.font].ends[0][1]\n                  }\n                }\n\n                this.scene.add(group)\n              }\n\n              if (fonts[this.font].type === \"font\") {\n                if ((this.terminators || fonts[this.font].forcedTerminators) && fonts[this.font].terminatorSpace) {\n                  addText(`┫ ${fonts[this.font].example?.[0] ?? \"ex😳mple\"} ┣`)\n                  addText(`┫ ${fonts[this.font].example?.[1] ?? \"text\"} ┣`, { type: \"bottom\" })\n                } else if (this.terminators || fonts[this.font].forcedTerminators) {\n                  addText(`┫${fonts[this.font].example?.[0] ?? \"ex😳mple\"}┣`)\n                  addText(`┫${fonts[this.font].example?.[1] ?? \"text\"}┣`, { type: \"bottom\" })\n                } else {\n                  addText(fonts[this.font].example?.[0] ?? \"ex😳mple\")\n                  addText(fonts[this.font].example?.[1] ?? \"text\", { type: \"bottom\" })\n                }\n              } else {\n                addText(\"a\")\n              }\n\n              this.renderer = new THREE.WebGLRenderer({\n                alpha: true,\n                canvas: this.canvas,\n                preserveDrawingBuffer: true\n              })\n\n              this.renderer.render(this.scene, this.camera)\n            },\n            updatePreview() {\n              setTimeout(async () => {\n                if (this.updating) {\n                  this.update = true\n                  return\n                }\n                this.updating = true\n                const texture = await makeTexture(getArgs(this, true))\n                this.material.map = texture\n                this.material.needsUpdate = true\n                this.renderer.render(this.scene, this.camera)\n                if (this.textureSource === \"tileable\" || this.textureSource === \"file\" && this.customTexture && this.customTextureType === \"tileable\") {\n                  let img\n                  if (this.textureSource === \"file\") img = await loadImage(this.customTexture)\n                  else img = await loadImage(await getTileable(this.tileable, this.tileableVariant))\n                  this.tileableWidth = img.width - 1\n                  this.tileableHeight = img.height - 1\n                  this.tileableXOffset = Math.min(this.tileableXOffset, img.width - 1)\n                  this.tileableYOffset = Math.min(this.tileableYOffset, img.height - 1)\n                }\n                this.updating = false\n                if (this.update) {\n                  this.update = false\n                  this.updatePreview()\n                }\n              }, 0)\n            },\n            expandCanvas(e) {\n              const canvas = new CanvasFrame(this.canvas.width, this.canvas.height)\n              canvas.canvas.classList.add(\"checkerboard\")\n              canvas.ctx.drawImage(this.canvas, 0, 0)\n              const overlay = document.createElement(\"div\")\n              overlay.id = \"minecraft-title-expanded-preview\"\n              overlay.append(canvas.canvas)\n              overlay.addEventListener(\"click\", e => overlay.remove())\n              document.body.append(overlay)\n            },\n            async selectCustomTexture() {\n              const texture = await getTextureFromFile()\n              if (!texture) return\n              if (texture.width / texture.height === fonts[this.font].textureWidth / fonts[this.font].textureHeight) this.customTextureType = \"texture\"\n              else this.customTextureType = \"tileable\"\n              globalThis.texture = texture\n              this.customTextureCanvas.width = texture.width\n              this.customTextureCanvas.height = texture.height\n              this.customTextureCanvas.getContext(\"2d\").drawImage(texture, 0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height)\n              this.customTexture = this.customTextureCanvas.toDataURL()\n              this.updatePreview()\n            },\n            async selectCustomOverlay() {\n              const texture = await getTextureFromFile()\n              if (!texture) return\n              this.customOverlayCanvas.width = texture.width\n              this.customOverlayCanvas.height = texture.height\n              this.customOverlayCanvas.getContext(\"2d\").drawImage(texture, 0, 0, this.customOverlayCanvas.width, this.customOverlayCanvas.height)\n              this.customOverlay = this.customOverlayCanvas.toDataURL()\n              this.updatePreview()\n            },\n            deleteCustomTexture() {\n              this.customTexture = null\n              this.customTextureCanvas.getContext(\"2d\").clearRect(0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height)\n              this.updatePreview()\n            },\n            deleteCustomOverlay() {\n              this.customOverlay = null\n              this.customOverlayCanvas.getContext(\"2d\").clearRect(0, 0, this.customOverlayCanvas.width, this.customOverlayCanvas.height)\n              this.updatePreview()\n            },\n            saveTexture: async (font, type, texture, variant) => Blockbench.export({\n              type: \"PNG Texture\",\n              extensions: [\"png\"],\n              name: variant ?? texture,\n              content: type === \"tileables\" ? await getTileable(texture, variant) : await getTexture(fonts[font][type], texture, variant),\n              savetype: \"image\"\n            }, () => {\n              Blockbench.showQuickMessage(\"Exported texture\")\n              sendStats({\n                font,\n                texture: type === \"textures\" ? texture : undefined,\n                tileable: type === \"tileables\" ? texture : undefined,\n                overlay: type === \"overlays\" ? texture : undefined\n              })\n            }),\n            async importTexture() {\n              const textures = []\n              Undo.initEdit({ textures })\n              const args = getArgs(this)\n              args.text = args.customTexture ? \"custom\" : this.textureSource === \"gradient\" ? \"gradient\" : this.texture\n              const texture = await makeTexture(args)\n              texture.add()\n              textures.push(texture)\n              Undo.finishEdit(\"Add Minecraft title texture\")\n              dialog.close()\n              sendStats(args)\n            },\n            scrollToVariants() {\n              setTimeout(() => {\n                if (this.$refs.textureVariants) {\n                  this.$refs.textureVariants.scrollIntoView({ behavior: \"smooth\" })\n                }\n              }, 0)\n            },\n            importTextureAsFile() {\n              Blockbench.showMessageBox({\n                title: \"Import current texture as file\",\n                message: \"Are you sure you want to import the current texture as a file?\\n\\nAny settings applied to it will be baked into the texture and cannot be removed.\\n\\nThis action cannot be undone.\",\n                buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n              }, async button => {\n                if (button === 0) {\n                  const args = getArgs(this)\n                  sendStats(args)\n                  args.canvas = true\n                  const texture = await makeTexture(args)\n                  this.customTextureCanvas.width = texture.width\n                  this.customTextureCanvas.height = texture.height\n                  this.customTextureCanvas.getContext(\"2d\").drawImage(texture, 0, 0, this.customTextureCanvas.width, this.customTextureCanvas.height)\n                  this.customTexture = texture.toDataURL()\n                  this.resetTexture(true)\n                  this.updatePreview()\n                }\n              })\n            },\n            presets() {\n              const settings = this\n              const presetDialog = new Dialog({\n                id: \"minecraft_title_presets\",\n                title: \"Minecraft Title Presets\",\n                buttons: [],\n                lines: [`<style>\n                  #minecraft_title_presets .dialog_content {\n                    margin: 20px;\n                  }\n                  #minecraft-title-presets-container {\n                    display: flex;\n                    flex-direction: column;\n                    gap: 20px;\n                  }\n                  #minecraft-title-presets {\n                    display: flex;\n                    flex-direction: column;\n                    gap: 10px;\n                    overflow: auto;\n                    max-height: 272px;\n                  }\n                  .minecraft-title-preset {\n                    display: flex;\n                    gap: 10px;\n                    padding: 10px 15px;\n                    align-items: center;\n                    cursor: pointer;\n                    background-color: var(--color-button);\n                    border-radius: 5px;\n                    box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\n                  }\n                  .minecraft-title-preset:hover {\n                    background-color: var(--color-accent);\n                    color: var(--color-accent_text);\n                  }\n                  .minecraft-title-preset > i.clickable:hover {\n                    color: var(--color-ui);\n                  }\n                  .minecraft-title-preset-name {\n                    font-size: 1.5rem;\n                  }\n                  .minecraft-title-preset-date {\n                    margin-top: 4px;\n                    opacity: 0.75;\n                    font-size: 0.8rem;\n                  }\n                  #minecraft-title-preset-buttons {\n                    display: flex;\n                    gap: 10px;\n                    margin-top: -10px;\n                  }\n                  #minecraft-title-preset-buttons > button {\n                    flex: 1;\n                  }\n                  #minecraft-title-presets-container hr {\n                    margin: 0;\n                  }\n                </style>`],\n                component: {\n                  data: {\n                    presets: JSON.parse(localStorage.getItem(\"minecraft_title_presets\") ?? \"{}\")\n                  },\n                  methods: {\n                    add() {\n                      const args = getArgs(settings)\n                      delete args.font\n                      delete args.fontTab\n                      delete args.three\n                      args.fontType = fonts[args.baseFont].type\n                      if (args.textureSource === \"file\" || args.overlaySource === \"file\") {\n                        return Blockbench.showQuickMessage(\"Custom textures are not supported for presets\", 3000)\n                      }\n                      for (const [key, obj] of Object.entries(this.presets)) {\n                        if (areObjectsEqual(args, obj.settings)) {\n                          return Blockbench.showQuickMessage(`Current settings are already saved under the preset \"${key}\"`, 3000)\n                        }\n                      }\n                      new Dialog({\n                        id: \"minecraft_title_preset_name\",\n                        title: \"Minecraft Title Preset Name\",\n                        form: {\n                          name: {\n                            label: \"Preset Name\",\n                            placeholder: \"Minecraft Cracked\"\n                          }\n                        },\n                        onConfirm: result => {\n                          const name = result.name.trim()\n                          if (!name) return Blockbench.showQuickMessage(\"No name provided\")\n                          if (name.length > 24) return Blockbench.showQuickMessage(\"Please keep names 24 characters or less\", 3000)\n                          if (this.presets[name]) return Blockbench.showQuickMessage(`The name \"${name}\" is already in use`, 3000)\n                          this.presets[name] = {\n                            date: Date.now(),\n                            settings: args\n                          }\n                          localStorage.setItem(\"minecraft_title_presets\", JSON.stringify(this.presets))\n                          this.$forceUpdate()\n                        }\n                      }).show()\n                    },\n                    deletePreset(event, name) {\n                      Blockbench.showMessageBox({\n                        title: \"Delete preset\",\n                        message: `Are you sure you want to delete the preset \"${name}\"?\\n\\nThis action cannot be undone.`,\n                        buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n                      }, async button => {\n                        if (button === 0) {\n                          delete this.presets[name]\n                          localStorage.setItem(\"minecraft_title_presets\", JSON.stringify(this.presets))\n                          this.$forceUpdate()\n                          Blockbench.showQuickMessage(\"Deleted preset\")\n                        }\n                      })\n                    },\n                    async load(event, name) {\n                      if (event.target.classList.contains(\"material-icons\")) return\n                      const args = this.presets[name].settings\n                      if (args.fontType === \"shape\") {\n                        if (fonts[settings.font].type !== \"shape\") {\n                          await settings.switchToShapes()\n                        }\n                      } else if (fonts[settings.font].type !== \"font\") {\n                        await settings.switchToFonts()\n                      }\n                      await settings.reset(true, true)\n                      const ignore = [\n                        \"font\",\n                        \"baseFont\",\n                        \"fontVariant\",\n                        \"fontTab\",\n                        \"texture\",\n                        \"variant\",\n                        \"tileable\",\n                        \"tileableVariant\",\n                        \"overlay\",\n                        \"tileableXOffset\",\n                        \"tileableYOffset\"\n                      ]\n                      for (const k of Object.values(variables).flat().flatMap(Object.keys)) {\n                        if (!ignore.includes(k) && args[k] !== undefined) {\n                          settings[k] = args[k]\n                        }\n                      }\n                      if (fonts[args.baseFont]) {\n                        settings.font = args.baseFont\n                        settings.baseFont = args.baseFont\n                        if (args.fontVariant && fonts[args.fontVariant] && fonts[args.baseFont].variants?.some(e => e.id === args.fontVariant)) {\n                          settings.font = args.fontVariant\n                          settings.fontVariant = args.fontVariant\n                          settings.fontTab = \"variants\"\n                        }\n                        await settings.updateFont(true)\n                      }\n                      if (fonts[settings.font].textures[args.texture]) {\n                        settings.texture = args.texture\n                        if (args.variant && fonts[settings.font].textures[args.texture].variants?.[args.variant]) {\n                          settings.variant = args.variant\n                        }\n                      }\n                      if (fonts[settings.font].overlays[args.overlay]) {\n                        settings.overlay = args.overlay\n                      }\n                      if (args.tileable && tileables[args.tileable]) {\n                        settings.tileable = args.tileable\n                        if (args.tileableVariant && tileable[args.tileable].variants?.[args.tileableVariant]) {\n                          settings.tileableVariant = args.tileableVariant\n                        }\n                        if (args.tileableXOffset || args.tileableYOffset) {\n                          const img = await loadImage(await getTileable(args.tileable, args.tileableVariant))\n                          if (args.tileableXOffset) settings.tileableXOffset = Math.min(img.width - 1, args.tileableXOffset)\n                          if (args.tileableYOffset) settings.tileableYOffset = Math.min(img.height - 1, args.tileableYOffset)\n                        }\n                      }\n                      for (let col of [\"colour\", \"customBorderColour\", \"customEdgeColour\", \"overlayColour\", \"gradientColour0\", \"gradientColour1\", \"gradientColour2\", \"gradientColour3\", \"gradientColour4\"]) {\n                        $(settings.$refs[col]).spectrum(\"set\", settings[col])\n                      }\n                      settings.buildPreview().then(settings.updatePreview)\n                      presetDialog.close()\n                      Blockbench.showQuickMessage(`Preset \"${name}\" loaded`, 3000)\n                    },\n                    importText(name, text) {\n                      new Dialog({\n                        id: \"minecraft_title_preset_import\",\n                        title: \"Minecraft Title Preset Import\",\n                        form: {\n                          name: {\n                            label: \"Preset Name\",\n                            placeholder: \"Minecraft Cracked\",\n                            value: name\n                          },\n                          data: {\n                            type: \"textarea\",\n                            label: \"Preset Data\",\n                            placeholder: \"{}\",\n                            value: text\n                          }\n                        },\n                        onConfirm: result => {\n                          const name = result.name.trim()\n                          if (!name) return Blockbench.showQuickMessage(\"No name provided\")\n                          if (name.length > 24) return Blockbench.showQuickMessage(\"Please keep names 24 characters or less\", 3000)\n                          if (this.presets[name]) return Blockbench.showQuickMessage(`The name \"${name}\" is already in use`, 3000)\n                          try {\n                            const data = JSON.parse(result.data.trim())\n                            if (!data.preset || data.type !== \"minecraft_title_generator_preset\") {\n                              return Blockbench.showQuickMessage(\"Invalid preset\")\n                            }\n                            for (const [key, obj] of Object.entries(this.presets)) {\n                              if (areObjectsEqual(data.preset, obj.settings)) {\n                                return Blockbench.showQuickMessage(`Current settings are already saved under the preset \"${key}\"`, 3000)\n                              }\n                            }\n                            this.presets[name] = {\n                              date: Date.now(),\n                              settings: data.preset\n                            }\n                            localStorage.setItem(\"minecraft_title_presets\", JSON.stringify(this.presets))\n                            this.$forceUpdate()\n                          } catch {\n                            Blockbench.showQuickMessage(\"Invalid json for preset data\", 3000)\n                          }\n                        }\n                      }).show()\n                    },\n                    importFile() {\n                      Blockbench.import({\n                        extensions: [\"json\"],\n                        type: \"Minecraft Title Preset\",\n                      }, files => {\n                        this.importText(files[0].name.replace(/\\.json$/, \"\"), files[0].content)\n                      })\n                    },\n                    exportPreset(event, name) {\n                      const dialog = new Dialog({\n                        id: \"minecraft_title_preset_export\",\n                        title: \"Minecraft Title Preset Export\",\n                        buttons: [],\n                        lines: [`<style>\n                          #minecraft_title_preset_export .dialog_content {\n                            margin: 20px;\n                          }\n                          #minecraft-title-preset-export {\n                            display: flex;\n                            flex-direction: column;\n                            gap: 20px;\n                          }\n                          #minecraft-title-preset-export-text {\n                            background-color: var(--color-back);\n                            padding: 10px;\n                            border: 1px solid var(--color-border);\n                            cursor: text;\n                            user-select: all;\n                            word-break: break-all;\n                            max-height: 256px;\n                            overflow-y: auto;\n                          }\n                          #minecraft-title-preset-export-buttons {\n                            display: flex;\n                            gap: 10px;\n                          }\n                          #minecraft-title-preset-export-buttons > button {\n                            flex: 1;\n                          }\n                        </style>`],\n                        component: {\n                          data: {\n                            preset: {\n                              type: \"minecraft_title_generator_preset\",\n                              preset: this.presets[name].settings\n                            }\n                          },\n                          methods: {\n                            copy() {\n                              navigator.clipboard.writeText(JSON.stringify(this.preset))\n                              Blockbench.showQuickMessage(\"Copied to clipboard\")\n                              dialog.close()\n                            },\n                            save() {\n                              Blockbench.export({\n                                extensions: [\"json\"],\n                                name: `${name.replace(/\\s/g, \"_\")}.json`,\n                                content: JSON.stringify(this.preset, null, 2)\n                              }, () => {\n                                Blockbench.showQuickMessage(\"Exported preset\")\n                                dialog.close()\n                              })\n                            }\n                          },\n                          template: `\n                            <div id=\"minecraft-title-preset-export\">\n                              <div id=\"minecraft-title-preset-export-text\">{{ JSON.stringify(preset) }}</div>\n                              <div id=\"minecraft-title-preset-export-buttons\">\n                                <button @click=\"copy\">Copy</button>\n                                <button @click=\"save\">Export</button>\n                              </div>\n                            </div>\n                          `\n                        }\n                      }).show()\n                    }\n                  },\n                  template: `\n                    <div id=\"minecraft-title-presets-container\">\n                      <div v-if=\"Object.keys(this.presets).length\" id=\"minecraft-title-presets\">\n                        <div v-for=\"[name, data] of Object.entries(presets)\" class=\"minecraft-title-preset\" @click=\"load($event, name)\">\n                          <i class=\"material-icons\" :title=\"(data.settings.fontType === 'shape' ? 'Shape' : 'Text') + ' preset'\">{{ data.settings.fontType === 'shape' ? 'interests' : 'text_fields' }}</i>\n                          <div class=\"minecraft-title-preset-name\">{{ name }}</div>\n                          <div class=\"spacer\"></div>\n                          <div class=\"minecraft-title-preset-date\">{{ new Date(data.date).toLocaleDateString('en-GB', { year: 'numeric', month: 'short', day: '2-digit' }) }}</div>\n                          <i class=\"material-icons clickable\" @click=\"exportPreset($event, name)\" title=\"Share preset\">ios_share</i>\n                          <i class=\"material-icons clickable\" @click=\"deletePreset($event, name)\" title=\"Delete preset\">delete</i>\n                        </div>\n                      </div>\n                      <hr v-if=\"Object.keys(this.presets).length\">\n                      <button @click=\"add\">Create new preset</button>\n                      <div id=\"minecraft-title-preset-buttons\">\n                        <button @click=\"importText()\" title=\"Import preset\">Import from text</button>\n                        <button @click=\"importFile\" title=\"Import preset\">Import from file</button>\n                      </div>\n                    </div>\n                  `\n                }\n              }).show()\n            },\n            async textInfo(font, parent) {\n              await getFontCharacters(font)\n              new Blockbench.Dialog({\n                id: \"minecraft_title_info\",\n                title: `${parent && parent !== font ? `${fonts[parent].name} ` : \"\"}${fonts[font].name} Info`,\n                lines: [`<style>\n                  #minecraft_title_info .code, #minecraft_title_info code {\n                    padding: 0 2px;\n                    border: 1px solid var(--color-border);\n                    background-color: var(--color-back);\n                    cursor: text;\n                    user-select: text;\n                  }\n                </style>`],\n                component: { template: `\n                  <div>\n                    ${fonts[font].description ? `<p>${fonts[font].description.replace(/`(.*?)`/g, \"<code>$1</code>\")}</p>` : \"\"}\n                    <h2>Available Characters</h2>\n                    <div class=\"code\">${Object.keys(fonts[font].characters).sort((a, b) => {\n                      const isALetter = /[a-zA-Z]/.test(a)\n                      const isBLetter = /[a-zA-Z]/.test(b)\n                      const isANumber = /\\d/.test(a)\n                      const isBNumber = /\\d/.test(b)\n                      if (isALetter) {\n                        if (!isBLetter) return -1\n                        else if (isBLetter)\n                        return a.localeCompare(b)\n                      } else if (isANumber) {\n                        if (!isBLetter && !isBNumber) return -1\n                        else if (isBLetter) return 1\n                        else if (isBNumber) return a.localeCompare(b)\n                      } else {\n                        if (isBLetter || isBNumber) return 1\n                        else return a.localeCompare(b)\n                      }\n                    }).join(\" \").replace(/[😩😳]/g, \"\")}</div>\n                    <p style=\"margin-top:10px\">You can use an uppercase <code>A</code> to get the <code>a</code> with the creeper face.</p>\n                  </div>\n                ` },\n                buttons: [\"dialog.close\"]\n              }).show()\n            },\n            connectionInfo() {\n              Blockbench.showMessageBox({\n                title: \"Failed to load textures and fonts\",\n                message: `Minecraft Title Generator was unable to load the textures and fonts. You will only be able to use the built-in texture and font.\\n\\nPlease make sure you are connected to the internet, and can access this <a href=\"${root}/fonts.json\">fonts.json</a> file.\\n\\nIf you are unable to access the fonts.json file, it may be blocked by your computer or your internet service provider. If it is not your computer blocking it, you may be able to use a VPN to bypass the block. One good example is <a href=\"https://1.1.1.1/\">Cloudflare WARP</a>, which is a free program that commonly resolves this issue.`\n              })\n            },\n            tabChange(tab) {\n              this.tab = tab\n              document.querySelector(\"#new_minecraft_title_text .dialog_content\").scrollTop = 0\n              this.focus()\n            },\n            focus() {\n              setTimeout(() => this.$el.querySelector(\".minecraft-title-contents.visible input[type='text']\")?.focus(), 0)\n            },\n            async switchToFonts() {\n              if (fonts[this.font].type === \"shape\") {\n                this.lastShape = this.baseFont\n                this.lastShapeTexture = this.texture\n                this.lastShapeTextureVariant = this.variant\n                this.lastShapeOverlay = this.overlay\n\n                this.tab = 0\n                if (this.lastShape) {\n                  this.font = this.lastFontVariant ?? this.lastFont\n                  this.baseFont = this.lastFont\n                  this.fontVariant = this.lastFontVariant\n                  this.fontTab = this.fontVariant ? \"variants\" : \"fonts\"\n                } else {\n                  this.font = this.fontList.find(e => e[1].type === \"font\")[0]\n                  this.baseFont = this.font\n                  this.fontVariant = null\n                  this.fontTab = \"fonts\"\n                }\n\n                await this.updateFont(true)\n\n                if (this.lastShape) {\n                  this.texture = this.lastFontTexture\n                  this.variant = this.lastFontTextureVariant\n                  this.overlay = this.lastFontOverlay\n                }\n\n                this.camera.fov = 18\n                this.camera.lookAt(new THREE.Vector3(0, 0, 0))\n                this.camera.updateProjectionMatrix()\n\n                return this.buildPreview()\n              }\n            },\n            async switchToShapes() {\n              if (fonts[this.font].type === \"font\") {\n                this.lastFont = this.baseFont\n                this.lastFontVariant = this.fontVariant\n                this.lastFontTexture = this.texture\n                this.lastFontTextureVariant = this.variant\n                this.lastFontOverlay = this.overlay\n\n                this.tab = 0\n                this.fontTab = \"fonts\"\n                this.fontVariant = null\n                if (this.lastShape) {\n                  this.font = this.lastShape\n                  this.baseFont = this.lastShape\n                } else {\n                  this.font = this.fontList.find(e => e[1].type === \"shape\")[0]\n                  this.baseFont = this.font\n                }\n\n                await this.updateFont(true)\n\n                if (this.lastShape) {\n                  this.texture = this.lastShapeTexture\n                  this.variant = this.lastShapeTextureVariant\n                  this.overlay = this.lastShapeOverlay\n                }\n\n                this.camera.fov = 12\n                this.camera.lookAt(new THREE.Vector3(0, 18, 0))\n                this.camera.updateProjectionMatrix()\n\n                return this.buildPreview()\n              }\n            }\n          },\n          computed: {\n            linearGradient() {\n              if (this.smoothGradient) return `linear-gradient(${[\n                [this.gradientColour0, 0],\n                this.gradientColour1Enabled ? [this.gradientColour1, 25] : null,\n                this.gradientColour2Enabled ? [this.gradientColour2, 50] : null,\n                this.gradientColour3Enabled ? [this.gradientColour3, 75] : null,\n                [this.gradientColour4, 100]\n              ].filter(e => e).map(e => `${e[0]} ${e[1]}%`)})`\n              const states = [\n                this.gradientColour1Enabled,\n                this.gradientColour2Enabled,\n                this.gradientColour3Enabled\n              ]\n              const stops = stopConfigs[states[0] << 2 | states[1] << 1 | states[2]]\n              let prev = 0\n              const colourStops = []\n              for (let i = 0, j = 0; i < 5; i++) if (states[i-1] ?? true) {\n                colourStops.push([this[`gradientColour${i}`], prev * 100])\n                colourStops.push([this[`gradientColour${i}`], (stops[j] ?? 1) * 100])\n                prev = stops[j] ?? 1\n                j++\n              }\n              return `linear-gradient(${colourStops.map(e => `${e[0]} ${e[1]}%`)})`\n            }\n          },\n          template: `\n            <div id=\"${id}\">\n              <div id=\"minecraft-title-generator-title\">Add Minecraft Title {{ fonts[font].type === 'font' ? 'Text' : 'Shape' }}</div>\n              <div class=\"dialog_close_button\" style=\"right:148px;\" :class=\"{ selected: fonts[font].type === 'font' }\" @click=\"switchToFonts\" title=\"Switch to text mode\">\n                <i class=\"material-icons\">text_fields</i>\n              </div>\n              <div class=\"dialog_close_button\" style=\"right:115px;\" :class=\"{ selected: fonts[font].type === 'shape' }\" @click=\"switchToShapes\" title=\"Switch to shape mode\">\n                <i class=\"material-icons\">interests</i>\n              </div>\n              <div class=\"dialog_close_button\" style=\"right:66px;\" @click=\"presets\" title=\"Load and save presets\">\n                <i class=\"material-icons\">tune</i>\n              </div>\n              <div class=\"dialog_close_button\" style=\"right:33px;\" @click=\"reset()\" title=\"Reset values back to their defaults\">\n                <i class=\"material-icons\">replay</i>\n              </div>\n              <div v-if=\"connection.failed\" id=\"minecraft-title-connection-warning\">\n                <div @click=\"connectionInfo\">\n                  <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\"><path d=\"M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16\" /></svg>\n                  <div>Failed to load textures and fonts</div>\n                  <div class=\"spacer\"></div>\n                  <div id=\"minecraft-title-connection-warning-underline\">More Info</div>\n                </div>\n              </div>\n              <div id=\"minecraft-title-tabs\">\n                <div @click=\"tabChange(0)\" :class=\"{ selected: tab === 0 }\">{{ fonts[font].type === 'font' ? 'Text' : 'Shape' }}</div>\n                <div @click=\"tabChange(1)\" :class=\"{ selected: tab === 1 }\">Texture</div>\n                <div @click=\"tabChange(2)\" :class=\"{ selected: tab === 2 }\">Overlay</div>\n                <div @click=\"tabChange(3)\" :class=\"{ selected: tab === 3 }\">Style</div>\n                <div @click=\"tabChange(4)\" :class=\"{ selected: tab === 4 }\">Settings</div>\n              </div>\n              <div id=\"minecraft-title-preview-container\" :class=\"{ visible: [1, 2, 3].includes(tab) }\">\n                <canvas @click=\"expandCanvas\" id=\"minecraft-title-preview\" class=\"checkerboard\" width=\"2160\" height=\"600\"></canvas>\n                <i @click=\"expandCanvas\" class=\"material-icons icon\">open_in_full</i>\n                <i class=\"fa fa-file-import\" title=\"Import texture into project\" @click=\"importTexture\"></i>\n              </div>\n              <div class=\"minecraft-title-contents\" :class=\"{ visible: tab === 0 }\">\n                <template v-if=\"fonts[font].type === 'font'\">\n                  <h2>Minecraft Title Text</h2>\n                  <p class=\"space-below\">The text you want to add to the scene</p>\n                  <div class=\"text-input-row\">\n                    <input type=\"text\" id=\"minecraft-title-text-input\" class=\"dark_bordered\" v-model=\"text\" placeholder=\"Minecraft\"/>\n                    <i class=\"fa fa-circle-info\" title=\"More info\" @click=\"textInfo(font, baseFont)\"></i>\n                  </div>\n                  <br>\n                </template>\n                <template v-if=\"fonts[font].type === 'font'\">\n                  <div class=\"minecraft-title-header-row\">\n                    <h2>Font</h2>\n                    <div class=\"github-link\">\n                      <a href=\"${links.github.link}\">\n                        <i class=\"icon fab fa-github\"></i>\n                        <div>Submit fonts</div>\n                      </a>\n                    </div>\n                  </div>\n                  <p>The font to use for the text</p>\n                  <ul class=\"form_inline_select\">\n                    <li @click=\"fontTab = 'fonts'\" :class=\"{ selected: fontTab === 'fonts' }\">Fonts</li>\n                    <li @click=\"fonts[font].variants ? fontTab = 'variants' : null\" :class=\"{ selected: fontTab === 'variants', disabled: !fonts[font].variants }\">Variants</li>\n                  </ul>\n                  <div v-if=\"fontTab === 'fonts'\" class=\"minecraft-title-list small\">\n                    <div class=\"minecraft-title-item\" v-for=\"[id, data] of fontList\" v-if=\"data.type === 'font'\" @click=\"font = id; baseFont = id; fontVariant = null; updateFont()\" :class=\"{ selected: baseFont === id }\">\n                      <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[id].type + 's/' + id + '/thumbnails/flat.png'\" loading=\"lazy\" />\n                      <div :style=\"{ maxWidth: data.variants ? '78%' : null }\">{{ data.name }}</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i v-if=\"data.author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                        <i class=\"fa fa-circle-info\" title=\"More info\" @click=\"textInfo(id)\"></i>\n                      </div>\n                      <i v-if=\"data.variants\" class=\"minecraft-title-item-has-variants material-icons\" :title=\"'Has ' + (data.variants.length + 1) + ' variants'\">filter_{{ data.variants.length > 9 ? '9_plus' : data.variants.length + 1 }}</i>\n                    </div>\n                  </div>\n                  <div v-if=\"fonts[font].variants && fontTab === 'variants'\" class=\"minecraft-title-list small\">\n                    <div class=\"minecraft-title-item\" @click=\"font = baseFont; fontVariant = null; variant = null; updateFont()\" :class=\"{ selected: !fontVariant }\">\n                      <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[baseFont].type + 's/' + baseFont + '/thumbnails/flat.png'\" loading=\"lazy\" />\n                      <div>Default</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i v-if=\"fonts[baseFont].author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + fonts[baseFont].author\">person</i>\n                        <i class=\"fa fa-circle-info\" title=\"More info\" @click=\"textInfo(baseFont)\"></i>\n                      </div>\n                    </div>\n                    <div class=\"minecraft-title-item\" v-for=\"data of fonts[baseFont].variants\" @click=\"font = data.id; fontVariant = data.id, updateFont()\" :class=\"{ selected: fontVariant === data.id }\">\n                      <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[data.id].type + 's/' + data.id + '/thumbnails/flat.png'\" loading=\"lazy\" />\n                      <div>{{ data.name }}</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i v-if=\"data.author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                        <i class=\"fa fa-circle-info\" title=\"More info\" @click=\"textInfo(data.id, baseFont)\"></i>\n                      </div>\n                    </div>\n                  </div>\n                </template>\n                <template v-if=\"fonts[font].type === 'shape'\">\n                  <div class=\"minecraft-title-header-row\">\n                    <h2>Shape</h2>\n                    <div class=\"github-link\">\n                      <a href=\"${links.github.link}\">\n                        <i class=\"icon fab fa-github\"></i>\n                        <div>Submit shapes</div>\n                      </a>\n                    </div>\n                  </div>\n                  <p class=\"space-below\">The shape to add</p>\n                  <div class=\"minecraft-title-list\">\n                    <div class=\"minecraft-title-item\" v-for=\"[id, data] of fontList\" v-if=\"data.type === 'shape'\" @click=\"font = id; baseFont = id; fontVariant = null; updateFont()\" :class=\"{ selected: baseFont === id }\">\n                      <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[id].type + 's/' + id + '/thumbnails/flat.png'\" loading=\"lazy\" />\n                      <div :style=\"{ maxWidth: data.variants ? '78%' : null }\">{{ data.name }}</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i v-if=\"data.author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                      </div>\n                    </div>\n                  </div>\n                </template>\n                <br>\n                <h2>{{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Type / Angle</h2>\n                <p class=\"space-below\">The type of {{ fonts[font].type === 'font' ? 'text' : 'shape' }} to add</p>\n                <a href=\"javascript:void(0)\" id=\"text-type-input\" @click=\"event.stopPropagation()\">\n                  <select-input v-model=\"type\" :options=\"types\" @input=\"fadeToBorder = type === 'bottom' ? true : false; updatePreview()\" />\n                </a>\n                <br>\n                <h2>{{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Row</h2>\n                <p>The vertical row that the {{ fonts[font].type === 'font' ? 'text' : 'shape' }} will appear on</p>\n                <div class=\"bar slider_input_combo\">\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"row\" min=\"-10\" max=\"10\" step=\"1\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"row\" :min=\"-10\" :max=\"10\" :step=\"1\" />\n                </div>\n              </div>\n              <div class=\"minecraft-title-contents\" :class=\"{ visible: tab === 1 }\">\n                <div class=\"minecraft-title-header-row\">\n                  <h2>Texture</h2>\n                  <div class=\"github-link\">\n                    <a href=\"${links.github.link}\">\n                      <i class=\"icon fab fa-github\"></i>\n                      <div>Submit textures</div>\n                    </a>\n                  </div>\n                </div>\n                <p>The texture to apply to the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}</p>\n                <ul class=\"form_inline_select\">\n                  <li @click=\"textureSource = 'premade'; updatePreview(); focus()\" :class=\"{ selected: textureSource === 'premade' }\">Textures</li>\n                  <li @click=\"textureSource = 'tileable'; updatePreview(); focus()\" :class=\"{ selected: textureSource === 'tileable' }\">Tileables</li>\n                  <li @click=\"textureSource = 'gradient'; updatePreview()\" :class=\"{ selected: textureSource === 'gradient' }\">Gradient</li>\n                  <li @click=\"lastTextureSource = textureSource; textureSource = 'file'; updatePreview()\" :class=\"{ selected: textureSource === 'file' }\">File</li>\n                </ul>\n                <div v-if=\"textureSource === 'premade'\">\n                  <div v-if=\"textures.filter(e => e[2] === font).length > 16\" class=\"minecraft-texture-search\">\n                    <input type=\"text\" placeholder=\"Search…\" class=\"dark_bordered\" v-model=\"textureSearch\">\n                    <i class=\"material-icons\" :class=\"{ active: textureSearch }\" @click=\"textureSearch = ''; focus()\">{{ textureSearch ? \"clear\" : \"search\" }}</i>\n                  </div>\n                  <div class=\"minecraft-title-list\">\n                    <div class=\"minecraft-title-item\" v-for=\"[id, data, type] of textures\" v-if=\"font === type && (textures.filter(e => e[2] === font).length <= 16 || id.includes(textureSearch) || Object.keys(fonts[font].textures[id]?.variants ?? {}).some(e => e.includes(textureSearch)))\" @click=\"texture = id; variant = null; updatePreview(); scrollToVariants()\" :class=\"{ selected: texture === id }\">\n                      <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + id + '.png'\" loading=\"lazy\" />\n                      <div :style=\"{ maxWidth: fonts[font].textures[id]?.variants ? '78%' : null }\">{{ data.category ?? data.name }}</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i v-if=\"data.author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                        <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'textures', id)\">save</i>\n                      </div>\n                      <i v-if=\"fonts[font].textures[id]?.variants\" class=\"minecraft-title-item-has-variants material-icons\" :title=\"'Has ' + (Object.keys(fonts[font].textures[id].variants).length + 1) + ' variants'\">filter_{{ Object.keys(fonts[font].textures[id].variants).length > 8 ? '9_plus' : Object.keys(fonts[font].textures[id].variants).length + 1 }}</i>\n                    </div>\n                  </div>\n                  <div v-if=\"fonts[font].textures[texture]?.variants\">\n                    <br>\n                    <h2>Variants</h2>\n                    <div class=\"minecraft-title-list\" ref=\"textureVariants\">\n                      <div class=\"minecraft-title-item\" @click=\"variant = null; updatePreview()\" :class=\"{ selected: !variant }\">\n                        <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + texture + '.png'\" loading=\"lazy\" />\n                        <div>{{ fonts[font].textures[texture].name }}</div>\n                        <div class=\"minecraft-title-item-buttons\">\n                          <i v-if=\"fonts[font].textures[texture].author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + fonts[font].textures[texture].author\">person</i>\n                          <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'textures', texture)\">save</i>\n                        </div>\n                      </div>\n                      <div class=\"minecraft-title-item\" v-for=\"[id, data] of Object.entries(fonts[font].textures[texture].variants)\" @click=\"variant = id; updatePreview()\" :class=\"{ selected: variant === id }\">\n                        <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + id + '.png'\" loading=\"lazy\" />\n                        <div>{{ data.name }}</div>\n                        <div class=\"minecraft-title-item-buttons\">\n                          <i v-if=\"data.author ?? fonts[font].textures[texture].author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + (data.author ?? fonts[font].textures[texture].author)\">person</i>\n                          <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'textures', texture, id)\">save</i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div v-if=\"textureSource === 'tileable'\">\n                  <div v-if=\"tileablesList.length > 16\" class=\"minecraft-texture-search\">\n                    <input type=\"text\" placeholder=\"Search…\" class=\"dark_bordered\" v-model=\"textureSearch\">\n                    <i class=\"material-icons\" :class=\"{ active: textureSearch }\" @click=\"textureSearch = ''; focus()\">{{ textureSearch ? \"clear\" : \"search\" }}</i>\n                  </div>\n                  <div class=\"minecraft-title-list\">\n                    <div class=\"minecraft-title-item\" v-for=\"[id, data] of tileablesList\" v-if=\"tileablesList.length <= 16 || id.includes(textureSearch) || id === tileable || Object.keys(tileables[id]?.variants ?? {}).some(e => e.includes(textureSearch))\" @click=\"tileable = id; tileableVariant = null; updatePreview(); scrollToVariants()\" :class=\"{ selected: tileable === id }\">\n                      <div class=\"tileable-preview\">\n                        <div :style=\"{ backgroundImage: 'url(' + (data.texture ?? connection.roots[connection.rootIndex] + '/tileables/' + (data.path ? data.path + '/' : '') + id + '.png') + ')' }\" />\n                      </div>\n                      <div :style=\"{ maxWidth: tileables[id]?.variants ? '78%' : null }\">{{ data.category ?? data.name }}</div>\n                      <div class=\"minecraft-title-item-buttons\">\n                        <i class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                        <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'tileables', id)\">save</i>\n                      </div>\n                      <i v-if=\"tileables[id]?.variants\" class=\"minecraft-title-item-has-variants material-icons\" :title=\"'Has ' + (Object.keys(tileables[id].variants).length + 1) + ' variants'\">filter_{{ Object.keys(tileables[id].variants).length > 8 ? '9_plus' : Object.keys(tileables[id].variants).length + 1 }}</i>\n                    </div>\n                  </div>\n                  <div v-if=\"tileables[tileable]?.variants\">\n                    <br>\n                    <h2>Variants</h2>\n                    <div class=\"minecraft-title-list\" ref=\"textureVariants\">\n                      <div class=\"minecraft-title-item\" @click=\"tileableVariant = null; updatePreview()\" :class=\"{ selected: !tileableVariant }\">\n                        <div class=\"tileable-preview\">\n                          <div :style=\"{ backgroundImage: 'url(' + (tileables[tileable].texture ?? connection.roots[connection.rootIndex] + '/tileables/' + (tileables[tileable].path ? tileables[tileable].path + '/' : '') + tileable + '.png') + ')' }\" />\n                        </div>\n                        <div>{{ tileables[tileable].name }}</div>\n                        <div class=\"minecraft-title-item-buttons\">\n                          <i v-if=\"tileables[tileable].author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + tileables[tileable].author\">person</i>\n                          <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'tileables', tileable)\">save</i>\n                        </div>\n                      </div>\n                      <div class=\"minecraft-title-item\" v-for=\"[id, data] of Object.entries(tileables[tileable].variants)\" @click=\"tileableVariant = id; updatePreview()\" :class=\"{ selected: tileableVariant === id }\">\n                        <div class=\"tileable-preview\">\n                          <div :style=\"{ backgroundImage: 'url(' + (data.texture ?? connection.roots[connection.rootIndex] + '/tileables/' + (tileables[tileable].path ? tileables[tileable].path + '/' : '') + id + '.png') + ')' }\" />\n                        </div>\n                        <div>{{ data.name }}</div>\n                        <div class=\"minecraft-title-item-buttons\">\n                          <i class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + (data.author ?? tileables[tileable].author)\">person</i>\n                          <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'tileables', tileable, id)\">save</i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div :class=\"{ hidden: textureSource !== 'gradient' }\" id=\"minecraft-title-custom-gradient\">\n                  <div id=\"minecraft-title-custom-gradient-customiser\">\n                    <div id=\"minecraft-title-gradient-preview\" :style=\"{ background: linearGradient }\"></div>\n                    <div id=\"minecraft-title-gradient-colours\">\n                      <div>\n                        <input ref=\"gradientColour0\" />\n                      </div>\n                      <div>\n                        <input type=\"checkbox\" :checked=\"gradientColour1Enabled\" v-model=\"gradientColour1Enabled\" @input=\"updatePreview\">\n                        <input ref=\"gradientColour1\" :class=\"{ disabled: !gradientColour1Enabled }\" />\n                      </div>\n                      <div>\n                        <input type=\"checkbox\" :checked=\"gradientColour2Enabled\" v-model=\"gradientColour2Enabled\" @input=\"updatePreview\">\n                        <input ref=\"gradientColour2\" :class=\"{ disabled: !gradientColour2Enabled }\" />\n                      </div>\n                      <div>\n                        <input type=\"checkbox\" :checked=\"gradientColour3Enabled\" v-model=\"gradientColour3Enabled\" @input=\"updatePreview\">\n                        <input ref=\"gradientColour3\" :class=\"{ disabled: !gradientColour3Enabled }\" />\n                      </div>\n                      <div>\n                        <input ref=\"gradientColour4\" />\n                      </div>\n                    </div>\n                  </div>\n                  <label class=\"checkbox-row\" style=\"margin-top: 10px\">\n                    <input type=\"checkbox\" :checked=\"smoothGradient\" v-model=\"smoothGradient\" @input=\"updatePreview\">\n                    <div>Smooth gradient</div>\n                  </label>\n                </div>\n                <div :class=\"{ hidden: textureSource !== 'file' }\" id=\"minecraft-title-custom-texture\" class=\"minecraft-title-file\">\n                  <canvas class=\"checkerboard\" width=\"500\" height=\"160\" @click=\"selectCustomTexture\" />\n                  <i v-if=\"customTexture\" class=\"material-icons\" title=\"Delete custom texture\" @click=\"deleteCustomTexture\">delete</i>\n                  <div class=\"minecraft-title-button-row\">\n                    <button @click=\"selectCustomTexture\">Select file</button>\n                    <button @click=\"importTextureAsFile\" title=\"Import the current selected texture as a custom texture, with its overlay and styles applied\">Import current texture as file</button>\n                  </div>\n                  <div class=\"radio-row\">\n                    <div>Texture Type:</div>\n                    <label for=\"custom-texture-type-texture\">\n                      <input type=\"radio\" id=\"custom-texture-type-texture\" value=\"texture\" v-model=\"customTextureType\" @input=\"updatePreview\" />\n                      <div>Texture</div>\n                    </label>\n                    <label for=\"custom-texture-type-tileable\">\n                      <input type=\"radio\" id=\"custom-texture-type-tileable\" value=\"tileable\" v-model=\"customTextureType\" @input=\"updatePreview\" />\n                      <div>Tileable</div>\n                    </label>\n                  </div>\n                </div>\n              </div>\n              <div class=\"minecraft-title-contents\" :class=\"{ visible: tab === 2 }\">\n                <div class=\"minecraft-title-header-row\">\n                  <h2>Overlay Texture</h2>\n                  <div class=\"github-link\">\n                    <a href=\"${links.github.link}\">\n                      <i class=\"icon fab fa-github\"></i>\n                      <div>Submit overlays</div>\n                    </a>\n                  </div>\n                </div>\n                <p>A texture to overlay onto the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}</p>\n                <ul class=\"form_inline_select\">\n                  <li @click=\"overlaySource = 'premade'; updatePreview()\" :class=\"{ selected: overlaySource === 'premade' }\">Textures</li>\n                  <li @click=\"overlaySource = 'file'; updatePreview()\" :class=\"{ selected: overlaySource === 'file' }\">File</li>\n                </ul>\n                <div v-if=\"overlaySource === 'premade'\" class=\"minecraft-title-list small\">\n                  <div class=\"minecraft-title-item\" v-for=\"[id, data, type] of overlays\" v-if=\"font === type\" @click=\"overlay = id; updatePreview()\" :class=\"{ selected: overlay === id }\">\n                    <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + id + '.png'\" loading=\"lazy\" />\n                    <div>{{ data.name }}</div>\n                    <div class=\"minecraft-title-item-buttons\">\n                      <i v-if=\"data.author\" class=\"minecraft-title-item-author material-icons\" :data-author=\"'By ' + data.author\">person</i>\n                      <i class=\"material-icons\" title=\"Save Texture\" @click=\"saveTexture(font, 'overlays', id)\">save</i>\n                    </div>\n                  </div>\n                </div>\n                <div :class=\"{ hidden: overlaySource !== 'file' }\" id=\"minecraft-title-custom-overlay\" class=\"minecraft-title-file\">\n                  <canvas class=\"checkerboard\" width=\"500\" height=\"160\" @click=\"selectCustomOverlay\" />\n                  <i v-if=\"customOverlay\" class=\"material-icons\" title=\"Delete custom overlay\" @click=\"deleteCustomOverlay\">delete</i>\n                  <button @click=\"selectCustomOverlay\">Select file</button>\n                </div>\n                <br>\n                <p class=\"space-below\">The blend method to use when applying the overlay</p>\n                <select-input v-model=\"overlayBlend\" :options=\"blends\" @input=\"updatePreview\" />\n                <br>\n                <h2>Overlay Colour</h2>\n                <p class=\"space-below\">A colour to apply to the overlay texture</p>\n                <input ref=\"overlayColour\" />\n                <p class=\"space-below\">The blend method to use when applying the colour</p>\n                <select-input v-model=\"overlayColourBlend\" :options=\"blends\" @input=\"updatePreview\" />\n                <br>\n                <h2>Overlay Opacity</h2>\n                <p>The opacity to apply the overlay at</p>\n                <div class=\"bar slider_input_combo\">\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"overlayOpacity\" min=\"0\" max=\"100\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"overlayOpacity\" :min=\"0\" :max=\"100\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n              </div>\n              <div class=\"minecraft-title-contents\" :class=\"{ visible: tab === 3 }\">\n                <div v-if=\"textureSource === 'tileable' || textureSource === 'file' && customTexture && customTextureType === 'tileable'\">\n                  <h2>Configuration</h2>\n                  <p>Configure the tileable texture</p>\n                  <div class=\"bar slider_input_combo\">\n                    <div class=\"slider-label\" style=\"width: 60px;\">Scale:</div>\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"tileableScale\" min=\"1\" max=\"8\" step=\"1\" @input=\"updatePreview\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"tileableScale\" :min=\"1\" :max=\"8\" :step=\"1\" @input=\"updatePreview\" />\n                  </div>\n                  <div class=\"bar slider_input_combo\">\n                    <div class=\"slider-label\" style=\"width: 60px;\">X Offset:</div>\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"tileableXOffset\" min=\"0\" :max=\"tileableWidth\" step=\"1\" @input=\"updatePreview\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"tileableXOffset\" :min=\"0\" :max=\"tileableWidth\" :step=\"1\" @input=\"updatePreview\" />\n                  </div>\n                  <div class=\"bar slider_input_combo\">\n                    <div class=\"slider-label\" style=\"width: 60px;\">Y Offset:</div>\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"tileableYOffset\" min=\"0\" :max=\"tileableHeight\" step=\"1\" @input=\"updatePreview\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"tileableYOffset\" :min=\"0\" :max=\"tileableHeight\" :step=\"1\" @input=\"updatePreview\" />\n                  </div>\n                  <div class=\"bar slider_input_combo\">\n                    <div class=\"slider-label\">Texture Resolution:</div>\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"tileableTextureResolution\" min=\"1\" :max=\"4\" step=\"1\" @input=\"updatePreview\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"tileableTextureResolution\" :min=\"1\" :max=\"4\" :step=\"1\" @input=\"updatePreview\" />\n                  </div>\n                  <label class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"tileableRandomRotations\" v-model=\"tileableRandomRotations\" @input=\"updatePreview\">\n                    <div>Random Rotations</div>\n                  </label>\n                  <label class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"tileableRandomMirroring\" v-model=\"tileableRandomMirroring\" @input=\"updatePreview\">\n                    <div>Random Mirroring</div>\n                  </label>\n                  <label v-if=\"fonts[font].overlay\" class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"disableFontOverlay\" v-model=\"disableFontOverlay\" @input=\"updatePreview\">\n                    <div>Disable included font overlay</div>\n                  </label>\n                  <br>\n                </div>\n                <div v-if=\"textureSource === 'gradient' && fonts[font].overlay\">\n                  <h2>Configuration</h2>\n                  <p>Configure the gradient texture</p>\n                  <label class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"disableFontOverlay\" v-model=\"disableFontOverlay\" @input=\"updatePreview\">\n                    <div>Disable included font overlay</div>\n                  </label>\n                  <br>\n                </div>\n                <h2>Filters</h2>\n                <p>Apply some filters to the chosen texture</p>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\" style=\"width: 70px\">Hue</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"hue\" min=\"0\" max=\"359\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"hue\" :min=\"0\" :max=\"359\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\" style=\"width: 70px\">Saturation</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"saturation\" min=\"0\" max=\"200\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"saturation\" :min=\"0\" :max=\"200\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\" style=\"width: 70px\">Brightness</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"brightness\" min=\"0\" max=\"200\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"brightness\" :min=\"0\" :max=\"200\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\" style=\"width: 70px\">Contrast</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"contrast\" min=\"0\" max=\"200\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"contrast\" :min=\"0\" :max=\"200\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n                <br>\n                <h2>Colour</h2>\n                <p class=\"space-below\">A colour to apply to the chosen texture</p>\n                <input ref=\"colour\" />\n                <p class=\"space-below\">The blend method to use when applying the colour</p>\n                <select-input v-model=\"blend\" :options=\"blends\" @input=\"updatePreview\" />\n                <p style=\"margin:15px 0 -5px\">The opacity to apply the colour at</p>\n                <div class=\"bar slider_input_combo\">\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"colourOpacity\" min=\"0\" max=\"100\" step=\"1\" @input=\"updatePreview\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"colourOpacity\" :min=\"0\" :max=\"100\" :step=\"1\" @input=\"updatePreview\" />\n                </div>\n                <br>\n                <h2>Border</h2>\n                <label class=\"checkbox-row\">\n                  <input type=\"checkbox\" :checked=\"customBorder\" v-model=\"customBorder\" @input=\"updatePreview\">\n                  <div>Use a custom colour for the {{ fonts[font].type === 'font' ? 'text' : 'shape' }} border</div>\n                </label>\n                <input ref=\"customBorderColour\" :class=\"{ hidden: !customBorder }\" />\n                <label class=\"checkbox-row\">\n                  <input type=\"checkbox\" :checked=\"fadeToBorder\" v-model=\"fadeToBorder\" @input=\"updatePreview\">\n                  <div>Fade the top and bottom of the text into the border colour</div>\n                </label>\n                <br>\n                <h2>Edges</h2>\n                <label class=\"checkbox-row\">\n                  <input type=\"checkbox\" :checked=\"customEdge\" v-model=\"customEdge\" @input=\"updatePreview\">\n                  <div>Use a custom colour for the top and bottom faces</div>\n                </label>\n                <input ref=\"customEdgeColour\" :class=\"{ hidden: !customEdge }\" />\n                <div :class=\"{ hidden: !(!customEdge && (textureSource === 'tileable' || textureSource === 'gradient' || textureSource === 'file' && customTexture && customTextureType === 'tileable')) }\">\n                  <div class=\"bar slider_input_combo\">\n                    <div class=\"slider-label\">Edge brightness:</div>\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"edgeBrightness\" min=\"0\" max=\"100\" step=\"1\" @input=\"updatePreview\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"edgeBrightness\" :min=\"0\" :max=\"100\" :step=\"1\" @input=\"updatePreview\" />\n                  </div>\n                </div>\n                <template v-if=\"fonts[font].type === 'font'\">\n                  <label v-if=\"!fonts[font].forcedTerminators\" class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"terminators\" v-model=\"terminators\" @input=\"buildPreview\">\n                    <div>Enable line terminators</div>\n                  </label>\n                  <p v-if=\"!fonts[font].forcedTerminators\">Line terminators are special characters that appear at the start and end of the text</p>\n                </template>\n              </div>\n              <div class=\"minecraft-title-contents\" :class=\"{ visible: tab === 4 }\">\n                <template v-if=\"fonts[font].type === 'font'\">\n                  <h2>Character Spacing</h2>\n                  <p>Add a space between each character</p>\n                  <div class=\"bar slider_input_combo\">\n                    <input type=\"range\" class=\"tool disp_range\" v-model.number=\"characterSpacing\" min=\"0\" max=\"20\" step=\"1\" />\n                    <numeric-input class=\"tool disp_text\" v-model.number=\"characterSpacing\" :min=\"0\" :max=\"20\" :step=\"1\" />\n                  </div>\n                  <br>\n                </template>\n                <h2>Row Spacing</h2>\n                <p>Change the spacing between the vertical rows of {{ fonts[font].type === 'font' ? 'text' : 'shape' }}</p>\n                <div class=\"bar slider_input_combo\">\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"rowSpacing\" min=\"-4\" max=\"20\" step=\"1\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"rowSpacing\" :min=\"-4\" :max=\"20\" :step=\"1\" />\n                </div>\n                <br>\n                <h2>{{ fonts[font].type === 'font' ? 'Text' : 'Shape' }} Scale</h2>\n                <p>The scale to render the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}<br>For advanced scaling, use <strong>Transform > Scale</strong> after adding the {{ fonts[font].type === 'font' ? 'text' : 'shape' }}</p>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\">X</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"scaleX\" min=\"0.05\" max=\"4\" step=\"0.05\" style=\"--color-thumb:var(--color-axis-x)\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"scaleX\" :min=\"0.05\" :max=\"4\" :step=\"0.05\" />\n                </div>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\">Y</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"scaleY\" min=\"0.05\" max=\"4\" step=\"0.05\" style=\"--color-thumb:var(--color-axis-y)\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"scaleY\" :min=\"0.05\" :max=\"4\" :step=\"0.05\" />\n                </div>\n                <div class=\"bar slider_input_combo\">\n                  <div class=\"slider-label\">Z</div>\n                  <input type=\"range\" class=\"tool disp_range\" v-model.number=\"scaleZ\" min=\"0.05\" max=\"4\" step=\"0.05\" style=\"--color-thumb:var(--color-axis-z)\" />\n                  <numeric-input class=\"tool disp_text\" v-model.number=\"scaleZ\" :min=\"0.05\" :max=\"4\" :step=\"0.05\" />\n                </div>\n                <template v-if=\"fonts[font].shifts\">\n                  <br>\n                  <h2>Character shifting</h2>\n                  <p class=\"space-below\">Certain characters get shifted when placed next to specific characters to adjust spacing for better readability</p>\n                  <label class=\"checkbox-row\">\n                    <input type=\"checkbox\" :checked=\"disableCharacterShifting\" v-model=\"disableCharacterShifting\" @input=\"updatePreview\">\n                    <div>Disable character shifting</div>\n                  </label>\n                </template>\n              </div>\n              <div id=\"minecraft-title-buttons\">\n                <button v-if=\"tab > 0\" @click=\"tabChange(tab - 1)\">Back</button>\n                <div class=\"spacer\"></div>\n                <button v-if=\"tab < 4\" @click=\"tabChange(tab + 1)\">Next</button>\n                <button @click=\"finish\">Finish</button>\n              </div>\n            </div>\n          `\n        },\n        onOpen() {\n          setTimeout(async () => {\n            this.content_vue.focus()\n            if (!await MinecraftEULA.promptUser(id)) return dialog.close()\n          }, 0)\n        },\n        onConfirm() {\n          let text\n          if (fonts[this.content_vue.font].type === \"font\") {\n            text = this.content_vue.text.replace(/A/g, \"😳\").replace(/(\\s|^)'/g, \"$1😩\").replace(/(\\s|^)\"/g, \"$1😩😩\").replace(/\"/g, \"''\").toLowerCase().trim()\n            if (!text) {\n              this.content_vue.tab = 0\n              Blockbench.showQuickMessage(\"Please provide some text\")\n              return false\n            }\n          } else {\n            text = \"a\"\n          }\n          dialog.close()\n          addText(text, getArgs(this.content_vue))\n        },\n        async onBuild() {\n          getFontTextures(\"minecraft-ten-blank\", true)\n          const [fetchedStats] = await Promise.all([\n            fetch(`${api}/blockbench/minecrafttitlegenerator/stats`, { headers: { source: \"blockbench\" } }).then(e => e.json()).catch(() => []),\n            getFontTextures(\"minecraft-ten\", true)\n          ])\n          stats.push(...fetchedStats)\n          const ten = stats.find(e => e.id === \"minecraft-ten\")\n          if (ten) ten.count = Infinity\n          else stats.push({\n            id: \"minecraft-ten\",\n            count: Infinity\n          })\n          fontData.push(...await fetchData(\"fonts.json\", () => []))\n          const shapes = await fetchData(\"shapes.json\", () => [])\n          const shapeModels = await fetchData(\"shapes/shapes.json\")\n          for (const shape of shapes) {\n            shape.type = \"shape\"\n            shape.characters = {\n              a: shapeModels[shape.id]\n            }\n            fontData.push(shape)\n          }\n          for (let [i, font] of fontData.entries()) {\n            font.type ??= \"font\"\n            if (fonts[font.id]) {\n              fonts[font.id] = Object.assign(fonts[font.id], font)\n              font = fonts[font.id]\n              fontData[i] = font\n            } else {\n              font.name ??= titleCase(font.id)\n              font.characters ??= `fonts/${font.id}/characters.json`\n              font.textures = `fonts/${font.id}/textures.json`\n              fonts[font.id] = font\n            }\n            font.textureWidth ??= 1000\n            font.textureHeight ??= 320\n            font.parsed = true\n            if (font.variants) for (const [j, v] of font.variants.entries()) {\n              const variant = Object.assign({}, font, v)\n              delete variant.thumbnail\n              variant.name ??= titleCase(variant.id)\n              variant.characters = `fonts/${variant.id}/characters.json`\n              variant.textures = `fonts/${variant.id}/textures.json`\n              delete variant.overlays\n              fonts[variant.id] = variant\n              font.variants[j] = variant\n              if (variant.shifts) {\n                if (v.shifts === \"inherit\") {\n                  variant.shifts = font.shifts\n                } else if (!v.shifts) {\n                  delete variant.shifts\n                }\n              }\n              variant.parsed = true\n            }\n          }\n          for (const font of Object.entries(fonts).filter(e => !e[1].parsed)) {\n            font[1].id = font[0]\n            fontData.push(font[1])\n          }\n          tileables = Object.assign(tileables, await fetchData(\"tileables.json\"))\n          for (const [id, tileable] of Object.entries(tileables)) {\n            tileable.name ??= titleCase(id)\n            tileable.author ??= \"Mojang\"\n            tileable.path ??= \"minecraft\"\n            if (tileable.variants) for (const [id, variant] of Object.entries(tileable.variants)) {\n              variant.name ??= titleCase(id)\n              variant.path ??= tileable.path\n            }\n          }\n          this.content_vue.fontList = fontData.map(e => [e.id, e])\n          this.content_vue.textures = Object.entries(fonts[\"minecraft-ten\"].textures).map(e => e.concat([\"minecraft-ten\"]))\n          this.content_vue.tileablesList = Object.entries(tileables)\n          this.content_vue.overlays = Object.entries(fonts[\"minecraft-ten\"].overlays).map(e => e.concat([\"minecraft-ten\"]))\n          if (Object.keys(fonts[\"minecraft-ten\"].textures)[1]) this.content_vue.texture = Object.keys(fonts[\"minecraft-ten\"].textures)[1]\n          this.content_vue.fontList.sort((a, b) => {\n            const statsA = stats.find(e => e.id === a[0])?.count ?? 0\n            const statsB = stats.find(e => e.id === b[0])?.count ?? 0\n            return statsB - statsA\n          })\n          this.content_vue.textures.sort((a, b) => {\n            const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0\n            const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0\n            return statsB - statsA\n          })\n          this.content_vue.tileablesList.sort((a, b) => {\n            const statsA = stats.find(e => e.id === `tileable.${a[0]}`)?.count ?? 0\n            const statsB = stats.find(e => e.id === `tileable.${b[0]}`)?.count ?? 0\n            return statsB - statsA\n          })\n          this.content_vue.overlays.sort((a, b) => {\n            const statsA = stats.find(e => e.id === `${a[2]}.${a[0]}`)?.count ?? 0\n            const statsB = stats.find(e => e.id === `${a[2]}.${b[0]}`)?.count ?? 0\n            return statsB - statsA\n          })\n          this.content_vue.$forceUpdate()\n\n          this.content_vue.canvas = dialog.content_vue.$el.querySelector(\"#minecraft-title-preview\")\n          this.content_vue.customTextureCanvas = dialog.content_vue.$el.querySelector(\"#minecraft-title-custom-texture > canvas\")\n          this.content_vue.customOverlayCanvas = dialog.content_vue.$el.querySelector(\"#minecraft-title-custom-overlay > canvas\")\n          this.content_vue.customTextureCanvas.getContext(\"2d\").globalCompositeOperation = \"copy\"\n          this.content_vue.customOverlayCanvas.getContext(\"2d\").globalCompositeOperation = \"copy\"\n\n          this.content_vue.camera = new THREE.PerspectiveCamera(18, this.content_vue.canvas.width / this.content_vue.canvas.height, 1, 1000)\n          this.content_vue.camera.position.x = 0\n          this.content_vue.camera.position.y = -170\n          this.content_vue.camera.position.z = -320\n          this.content_vue.camera.lookAt(new THREE.Vector3(0, 0, 0))\n\n          this.content_vue.scene = new THREE.Scene()\n\n          this.content_vue.buildPreview()\n\n          initialLoaded()\n        }\n      })\n      debugDialog = new Dialog({\n        id: `debug_${id}`,\n        title: \"Load Debug Minecraft Title Text\",\n        component: {\n          data: {\n            connection,\n            font: Object.keys(fonts)[0],\n            fonts,\n            texture: Object.keys(fonts[\"minecraft-ten\"].textures)[1] ?? Object.keys(fonts[\"minecraft-ten\"].textures)[0],\n            variant: null,\n          },\n          methods: {\n            async selectFont(id) {\n              await getFontTextures(id)\n              this.font = id\n              this.texture = Object.keys(fonts[id].textures)[0]\n              this.variant = null\n            }\n          },\n          template: `\n            <div>\n              <h2>Font</h2>\n              <div class=\"minecraft-title-list small\">\n                <div class=\"minecraft-title-item\" v-for=\"[id, data] of Object.entries(fonts)\" @click=\"selectFont(id)\" :class=\"{ selected: font === id }\">\n                  <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[id].type + 's/' + id + '/thumbnails/flat.png'\" loading=\"lazy\" />\n                  <div>{{ data.name }}</div>\n                </div>\n              </div>\n              <br>\n              <h2>Texture</h2>\n              <div class=\"minecraft-title-list\">\n                <div class=\"minecraft-title-item\" @click=\"texture = 'all'; variant = null\" :class=\"{ selected: texture === 'all' }\">\n                  <div>All</div>\n                </div>\n                <div class=\"minecraft-title-item\" v-for=\"[id, data] of Object.entries(fonts[font].textures)\" v-if=\"fonts[font].textures[id]\" @click=\"texture = id; variant = null\" :class=\"{ selected: texture === id }\">\n                  <img :src=\"data.thumbnail ?? connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + id + '.png'\" loading=\"lazy\" />\n                  <div>{{ data.category ?? data.name }}</div>\n                  <i v-if=\"fonts[font].textures[id]?.variants\" class=\"minecraft-title-item-has-variants material-icons\" :title=\"'Has ' + (Object.keys(fonts[font].textures[id].variants).length + 1) + ' variants'\">filter_{{ Object.keys(fonts[font].textures[id].variants).length > 8 ? '9_plus' : Object.keys(fonts[font].textures[id].variants).length + 1 }}</i>\n                </div>\n              </div>\n              <div v-if=\"fonts[font].textures[texture]?.variants\">\n                <br>\n                <h2>Texture Variants</h2>\n                <div class=\"minecraft-title-list\">\n                  <div class=\"minecraft-title-item\" @click=\"variant = null\" :class=\"{ selected: !variant }\">\n                    <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + texture + '.png'\" loading=\"lazy\" />\n                    <div>{{ fonts[font].textures[texture].name }}</div>\n                  </div>\n                  <div class=\"minecraft-title-item\" v-for=\"[id, data] of Object.entries(fonts[font].textures[texture].variants)\" @click=\"variant = id\" :class=\"{ selected: variant === id }\">\n                    <img :src=\"connection.roots[connection.rootIndex] + '/' + fonts[font].type + 's/' + font + '/thumbnails/' + id + '.png'\" loading=\"lazy\" />\n                    <div>{{ data.name }}</div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          `\n        },\n        async onConfirm() {\n          await getFontCharacters(this.content_vue.font)\n          const str = Object.keys(fonts[this.content_vue.font].characters).sort().join(\"\").replace(/😩|😳/g, \"\").replace(\"a\", \"😳a\").replace(\"'\", \"😩'\")\n          if (this.content_vue.texture === \"all\") {\n            const textures = []\n            for (const [id, data] of Object.entries(fonts[this.content_vue.font].textures)) {\n              textures.push([id])\n              if (data.variants) textures.push(...Object.keys(data.variants).map(e => [id, e]))\n            }\n            for (const [i, texture] of textures.entries()) {\n              await addText(str, {\n                debug: true,\n                font: this.content_vue.font,\n                texture: texture[0],\n                variant: texture[1],\n                row: textures.length - i - 1,\n                characterSpacing: fonts[this.content_vue.font].spaceWidth ?? 8,\n                rowSpacing: 8,\n                blend: \"multiply\",\n                colour: \"#fff\",\n                scaleX: 1,\n                scaleY: 1,\n                scaleZ: 1,\n                customBorder: false,\n                spacerWidth: 31,\n                name: texture[1] ?? texture[0],\n                ignoreStats: true,\n                ignoreTextureCheck: true\n              })\n            }\n          } else {\n            const parts = []\n            let part = \"\"\n            let x = 0\n            for (const char of str) {\n              part += char\n              x++\n              if (x >= 11) {\n                x = 0\n                parts.push(part)\n                part = \"\"\n              }\n            }\n            if (part) parts.push(part)\n            for (const [i, part] of parts.entries()) {\n              await addText(part, {\n                debug: true,\n                font: this.content_vue.font,\n                texture: this.content_vue.texture,\n                variant: this.content_vue.variant,\n                row: parts.length - i - 1,\n                characterSpacing: 8,\n                rowSpacing: 8,\n                blend: \"multiply\",\n                colour: \"#fff\",\n                scaleX: 1,\n                scaleY: 1,\n                scaleZ: 1,\n                customBorder: false,\n                spacerWidth: 31,\n                name: this.content_vue.variant ?? this.content_vue.texture,\n                ignoreStats: true\n              })\n            }\n          }\n        }\n      })\n      debug = new Action(\"load_debug_minecraft_title_text\", {\n        name: \"Load Debug Minecraft Title Text\",\n        icon,\n        condition: () => Project.format === format,\n        click: () => debugDialog.show()\n      })\n      MenuBar.addAction(debug, \"help.developer.1\")\n      Blockbench.on(\"update_selection\", selectHandler)\n      DefaultCameraPresets.push(titleCameraAngle)\n    },\n    onunload() {\n      Blockbench.removeListener(\"update_selection\", selectHandler)\n      format.delete()\n      action.delete()\n      action2.delete()\n      mode.delete()\n      styles.delete()\n      preview.delete()\n      debug.delete()\n      dialog.close()\n      debugDialog.close()\n      controls.remove()\n      DefaultCameraPresets.splice(DefaultCameraPresets.indexOf(titleCameraAngle), 1)\n    }\n  })\n\n  async function fetchData(path, fallback) {\n    const currentRoot = connection.rootIndex\n    try {\n      const r = await fetch(`${root}/${path}`)\n      if (r.status !== 200) throw new Error\n      if (r.headers.get(\"Content-Type\")?.startsWith(\"text/plain\") || r.headers.get(\"Content-Type\")?.startsWith(\"application/json\")) return r.json()\n      return r\n    } catch {\n      for (let x = currentRoot + 1; x < connection.roots.length; x++) {\n        try {\n          const r = await fetch(`${connection.roots[x]}/${path}`)\n          if (r.status !== 200) throw new Error\n          root = connection.roots[x]\n          connection.rootIndex = x\n          if (r.headers.get(\"Content-Type\")?.startsWith(\"text/plain\") || r.headers.get(\"Content-Type\")?.startsWith(\"application/json\")) return r.json()\n          return r\n        } catch {}\n      }\n      connection.failed = true\n      return fallback ? fallback() : {}\n    }\n  }\n\n  function sendStats(args, font) {\n    let chosenTexture, chosenTileable\n    if (!args.gradientColour0 && !args.customTexture) {\n      if (args.tileable) chosenTileable = args.tileable\n      else chosenTexture = args.texture\n    }\n    const chosenOverlay = args.customOverlay || args.overlay === \"none\" ? undefined : args.overlay\n    if (font || chosenTexture || chosenTileable || chosenOverlay) fetch(`${api}/blockbench/minecrafttitlegenerator/stats`, {\n      method: \"POST\",\n      headers: {\n        source: \"blockbench\",\n        \"Content-Type\": \"application/json\"\n      },\n      body: JSON.stringify({\n        font: args.font,\n        ignoreFont: !font,\n        texture: chosenTexture,\n        tileable: chosenTileable,\n        overlay: chosenOverlay\n      })\n    }).catch(() => {})\n  }\n\n  async function getTexture(object, texture, variant, direct) {\n    if (!direct && !object[texture] || variant && !object[texture].variants?.[variant]) {\n      return \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX7PvkAAAA/TQ/fAAAADklEQVR4XmPgh8IPEAgAEeAD/bSogK0AAAAASUVORK5CYII=\"\n    }\n    if (!direct && ((variant && object[texture].variants[variant]?.texture.startsWith(\"data:image/png;base64,\")) || (!variant && object[texture].texture.startsWith(\"data:image/png;base64,\")))) return variant ? object[texture].variants[variant].texture : object[texture].texture\n    const data = await new Promise(async fulfil => {\n      const reader = new FileReader()\n      reader.onload = e => fulfil(e.target.result)\n      reader.readAsDataURL(new Blob([await fetchData(direct ?? (variant ? object[texture].variants[variant].texture : object[texture].texture)).then(e => e.arrayBuffer())], { type: \"image/png\" }))\n    }).catch(() => {})\n    if (!direct) {\n      if (variant) object[texture].variants[variant].texture = data\n      else object[texture].texture = data\n    }\n    return data\n  }\n\n  async function addText(text, args) {\n    args.text = text\n    const elements = []\n    const textures = []\n    Undo.initEdit({\n      outliner: true,\n      elements,\n      textures\n    })\n    let texture = await makeTexture(args)\n    let match\n    if (!args.ignoreTextureCheck) for (const image of Texture.all) {\n      if (image.img.src === texture.img.src) {\n        match = true\n        texture = image\n        break\n      }\n    }\n    if (!match) {\n      texture.add()\n      textures.push(texture)\n    }\n    await getFontCharacters(args.font)\n    if (!args.debug && args.characterSpacing && fonts[args.font].characters[\"​\"]) {\n      text = text.split(\"\").join(\"​\")\n      args.spacerWidth = args.characterSpacing - 1\n      args.characterSpacing = 0\n    }\n    if (!args.debug && (args.terminators || fonts[args.font].forcedTerminators) && fonts[args.font].terminatorSpace) {\n      text = `┫ ${text} ┣`\n    } else if (!args.debug && (args.terminators || fonts[args.font].forcedTerminators)) {\n      text = `┫${text}┣`\n    }\n    let words\n    if (fonts[args.font].characters[\" \"]) words = [text]\n    else words = text.split(\" \")\n    let group\n    let offset = 0\n    if (words.length === 1) {\n      [group] = makeWord(text, offset, \"root\", {\n        font: args.font,\n        texture: texture.uuid,\n        row: args.row,\n        type: args.type,\n        characterSpacing: args.characterSpacing,\n        spacerWidth: args.spacerWidth,\n        rowSpacing: args.rowSpacing,\n        scale: [args.scaleX, args.scaleY, args.scaleZ],\n        disableCharacterShifting: args.disableCharacterShifting,\n        name: args.name,\n        elements\n      })\n    } else {\n      group = new Group(args.name ?? makeName(text)).init()\n      let lastCharacter\n      for (const part of words) {\n        const [word, newOffset, newLastCharacter] = makeWord(part, offset, group, {\n          font: args.font,\n          texture: texture.uuid,\n          row: args.row,\n          type: args.type,\n          characterSpacing: args.characterSpacing,\n          spacerWidth: args.spacerWidth,\n          rowSpacing: args.rowSpacing,\n          scale: [args.scaleX, args.scaleY, args.scaleZ],\n          disableCharacterShifting: args.disableCharacterShifting,\n          elements,\n          lastCharacter\n        })\n        offset = newOffset + ((fonts[args.font].spaceWidth ?? 8) + args.characterSpacing) * args.scaleX\n        lastCharacter = newLastCharacter\n      }\n    }\n    group.addTo().select()\n    let min = Infinity\n    let max = -Infinity\n    for (const cube of Cube.selected) {\n      min = Math.min(min, cube.from[0], cube.to[0])\n      max = Math.max(max, cube.from[0], cube.to[0])\n    }\n    let width = (max - min) / 2\n    if (fonts[args.font].autoBorder) width -= 2 * (args.scaleX + args.scaleY) / 2 * (args.type === \"bottom\" ? 0.75 : args.type === \"small\" ? 0.35 : 1)\n    for (const cube of Cube.selected) {\n      cube.from[0] += width\n      cube.to[0] += width\n    }\n    if (args.type === \"bottom\") {\n      group.rotation[0] = -90\n    }\n    Canvas.updateView({\n      elements: Cube.selected,\n      groups: Group.multi_selected\n    })\n    Undo.finishEdit(\"Add Minecraft title text\")\n    updateSelection()\n    if (!args.ignoreStats) sendStats(args, true)\n  }\n\n  async function makeTexture(args) {\n    const img = await loadImage(args.customTexture && args.customTextureType === \"texture\" ? args.customTexture : await getTexture(fonts[args.font].textures, args.texture, args.variant))\n    const res = args.tileable || args.customTexture && args.customTextureType === \"tileable\" ? args.tileableTextureResolution : 1\n    let { canvas, ctx } = new CanvasFrame(img.width * res, img.height * res)\n    ctx.imageSmoothingEnabled = false\n    ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n    let m = canvas.width / fonts[args.font].textureWidth\n    if (args.gradientColour0) {\n      if (args.smoothGradient) {\n        const colours = [\n          [args.gradientColour0, 0],\n          args.gradientColour1Enabled ? [args.gradientColour1, 0.25] : null,\n          args.gradientColour2Enabled ? [args.gradientColour2, 0.50] : null,\n          args.gradientColour3Enabled ? [args.gradientColour3, 0.75] : null,\n          [args.gradientColour4, 1]\n        ].filter(e => e)\n        const height = fonts[args.font].ends[fonts[args.font].ends.length - 1][3]\n        if (canvas.width < fonts[args.font].textureWidth * 4) {\n          const newCanvas = new CanvasFrame(fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4)\n          newCanvas.ctx.imageSmoothingEnabled = false\n          newCanvas.ctx.drawImage(canvas, 0, 0, fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4)\n          canvas = newCanvas.canvas\n          ctx = newCanvas.ctx\n          m = canvas.width / fonts[args.font].textureWidth\n        }\n        ctx.globalCompositeOperation = \"source-atop\"\n        const gradient = ctx.createLinearGradient(0, 0, 0, height * m)\n        for (let i = 0; i < fonts[args.font].faces.length; i++) {\n          const face = fonts[args.font].faces[i]\n          const end = fonts[args.font].ends[i]\n          gradient.addColorStop(end[0] / height, args.gradientColour0)\n          if (face.length === 2) {\n            gradient.addColorStop(face[0] / height, args.gradientColour0)\n            for (const stop of colours) {\n              gradient.addColorStop(Math.lerp(face[0], face[1], stop[1]) / height, stop[0])\n            }\n            gradient.addColorStop(face[1] / height, args.gradientColour4)\n          } else {\n            gradient.addColorStop(face[0] / height, args.gradientColour0)\n            gradient.addColorStop(face[1] / height, args.gradientColour0)\n            for (const stop of colours) {\n              gradient.addColorStop(Math.lerp(face[1], face[2], stop[1]) / height, stop[0])\n            }\n            gradient.addColorStop(face[2] / height, args.gradientColour4)\n            gradient.addColorStop(face[3] / height, args.gradientColour4)\n          }\n          gradient.addColorStop(end[3] / height, args.gradientColour4)\n        }\n        ctx.fillStyle = gradient\n        ctx.fillRect(0, 0, canvas.width * m, height * m)\n      } else {\n        const charHeight = fonts[args.font].faces[0][3] ? fonts[args.font].faces[0][2] - fonts[args.font].faces[0][1] : fonts[args.font].faces[0][1] - fonts[args.font].faces[0][0]\n        const states = [\n          args.gradientColour1Enabled,\n          args.gradientColour2Enabled,\n          args.gradientColour3Enabled\n        ]\n        const stops = stopConfigs[states[0] << 2 | states[1] << 1 | states[2]]\n        for (let i = 0; i < fonts[args.font].faces.length; i++) {\n          const face = fonts[args.font].faces[i]\n          const end = fonts[args.font].ends[i]\n          const offset = face[3] ? face[1] : face[0] \n          let prev = 0\n          for (let i = 0, j = 0; i < 5; i++) if (states[i-1] ?? true) {\n            const end = Math.floor((stops[j] ?? 1) * charHeight)\n            ctx.fillStyle = args[`gradientColour${i}`]\n            ctx.fillRect(0, offset + prev, canvas.width, end - prev)\n            prev = end\n            j++\n          }\n          ctx.fillStyle = args.gradientColour0\n          ctx.fillRect(0, end[0], canvas.width, (face[3] ? face[1] : end[1]) - end[0])\n          ctx.fillStyle = args.gradientColour4\n          ctx.fillRect(0, (face[2] ?? end[2]), canvas.width, end[3] - (face[2] ?? end[2]))\n        }\n      }\n      ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})`\n      for (const end of fonts[args.font].ends) {\n        ctx.fillRect(0, end[0] * m, canvas.width, end[1] * m - end[0] * m)\n        ctx.fillRect(0, end[2] * m, canvas.width, end[3] * m - end[2] * m)\n      }\n      if (fonts[args.font].overlay && !args.disableFontOverlay) {\n        await loadOverlay(args.font)\n        ctx.globalCompositeOperation = \"source-over\"\n        ctx.drawImage(fonts[args.font].overlay, 0, 0, canvas.width, canvas.height)\n      }\n    } else if (args.tileable || args.customTexture && args.customTextureType === \"tileable\") {\n      let base\n      if (args.customTexture) base = await loadImage(args.customTexture)\n      else base = await loadImage(await getTileable(args.tileable, args.tileableVariant))\n      const { canvas: texture, ctx: tctx } = new CanvasFrame(base.width, base.height)\n      tctx.drawImage(base, -args.tileableXOffset, -args.tileableYOffset)\n      if (args.tileableXOffset) tctx.drawImage(base, base.width - args.tileableXOffset, -args.tileableYOffset)\n      if (args.tileableYOffset) tctx.drawImage(base, -args.tileableXOffset, base.height - args.tileableYOffset)\n      if (args.tileableXOffset && args.tileableYOffset) tctx.drawImage(base, base.width - args.tileableXOffset, base.height - args.tileableYOffset)\n      const width = Math.max(1, Math.round(texture.width * args.tileableScale))\n      const height = Math.max(1, Math.round(texture.height * args.tileableScale))\n      ctx.globalCompositeOperation = \"source-atop\"\n      const uvScaleW = canvas.width / 16\n      const uvScaleH = canvas.height / 16\n      await getFontCharacters(args.font)\n      for (const [i, char] of Object.values(fonts[args.font].characters).entries()) {\n        let faceUV, topUV, bottomUV\n        for (const cube of char) {\n          for (const face of Object.values(cube.faces)) {\n            const mapped = (face?.uv ?? face).map((e, i) => Math.round(i % 2 ? e * uvScaleH : e * uvScaleW))\n            const middle = fonts[args.font].faces.find(e => mapped[1] >= e[0] * res && mapped[1] <= e[e.length - 1] * res && mapped[3] >= e[0] * res && mapped[3] <= e[e.length - 1] * res)\n            if (middle) {\n              if (!faceUV) {\n                faceUV = [Math.min(mapped[0], mapped[2]), middle[0] * res, Math.max(mapped[0], mapped[2]), middle[middle.length - 1] * res, middle.length === 4 ? (middle[1] - middle[0]) * res : null]\n              } else {\n                faceUV[0] = Math.min(faceUV[0], mapped[0], mapped[2])\n                faceUV[2] = Math.max(faceUV[2], mapped[0], mapped[2])\n              }\n            } else {\n              const top = fonts[args.font].ends.find(e => mapped[1] >= e[0] * res && mapped[1] <= e[1] * res && mapped[3] >= e[0] * res && mapped[3] <= e[1] * res)\n              if (top) {\n                if (!topUV) {\n                  topUV = [Math.min(mapped[0], mapped[2]), top[0] * res, Math.max(mapped[0], mapped[2]), top[1] * res]\n                } else {\n                  topUV[0] = Math.min(topUV[0], mapped[0], mapped[2])\n                  topUV[2] = Math.max(topUV[2], mapped[0], mapped[2])\n                }\n              } else {\n                const bottom = fonts[args.font].ends.find(e => mapped[1] >= e[2] * res && mapped[1] <= e[3] * res && mapped[3] >= e[2] * res && mapped[3] <= e[3] * res)\n                if (bottom) {\n                  if (!bottomUV) {\n                    bottomUV = [Math.min(mapped[0], mapped[2]), bottom[2] * res, Math.max(mapped[0], mapped[2]), bottom[3] * res]\n                  } else {\n                    bottomUV[0] = Math.min(bottomUV[0], mapped[0], mapped[2])\n                    bottomUV[2] = Math.max(bottomUV[2], mapped[0], mapped[2])\n                  }\n                }\n              }\n            }\n          }\n        }\n        if (faceUV) {\n          const area = new CanvasFrame(faceUV[2] - faceUV[0], faceUV[3] - faceUV[1])\n          area.ctx.imageSmoothingEnabled = false\n          const start = faceUV[4] ?? 0\n          for (let y = start; y < area.height; y += height) {\n            for (let x = 0; x < area.width; x += width) {\n              if (args.tileableRandomRotations || args.tileableRandomMirroring) {\n                drawRotatedMirrored(area.ctx, texture, x, y, width, height, Math.floor(random(i, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring)\n              } else {\n                area.ctx.drawImage(texture, x, y, width, height)\n              }\n            }\n          }\n          if (start !== 0) {\n            for (let y = start; y > 0; y -= height) {\n              for (let x = 0; x < area.width; x += width) {\n                if (args.tileableRandomRotations || args.tileableRandomMirroring) {\n                  drawRotatedMirrored(area.ctx, texture, x, y - height, width, height, Math.floor(random(i + 100, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring)\n                } else {\n                  area.ctx.drawImage(texture, x, y - height, width, height)\n                }\n              }\n            }\n          }\n          ctx.fillStyle = \"#fff\"\n          ctx.fillRect(faceUV[0], faceUV[1], area.width, area.height)\n          ctx.drawImage(area.canvas, faceUV[0], faceUV[1])\n        }\n        if (topUV) {\n          const area = new CanvasFrame(topUV[2] - topUV[0], topUV[3] - topUV[1])\n          area.ctx.imageSmoothingEnabled = false\n          for (let y = area.height; y > 0; y -= height) {\n            for (let x = 0; x < area.width; x += width) {\n              if (args.tileableRandomRotations || args.tileableRandomMirroring) {\n                drawRotatedMirrored(area.ctx, texture, x, y - height, width, height, Math.floor(random(i + 200, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring)\n              } else {\n                area.ctx.drawImage(texture, x, y - height, width, height)\n              }\n            }\n          }\n          ctx.fillStyle = \"#fff\"\n          ctx.fillRect(topUV[0], topUV[1], area.width, area.height)\n          ctx.drawImage(area.canvas, topUV[0], topUV[1])\n          ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})`\n          ctx.fillRect(topUV[0], topUV[1], area.width, area.height)\n        }\n        if (bottomUV) {\n          const area = new CanvasFrame(bottomUV[2] - bottomUV[0], bottomUV[3] - bottomUV[1])\n          area.ctx.imageSmoothingEnabled = false\n          for (let y = 0; y < area.height; y += height) {\n            for (let x = 0; x < area.width; x += width) {\n              if (args.tileableRandomRotations || args.tileableRandomMirroring) {\n                drawRotatedMirrored(area.ctx, texture, x, y, width, height, Math.floor(random(i + 300, x, y) * 4) * 90 * args.tileableRandomRotations, random(i + 400, x, y) < 0.5 && args.tileableRandomMirroring)\n              } else {\n                area.ctx.drawImage(texture, x, y, width, height)\n              }\n            }\n          }\n          ctx.fillStyle = \"#fff\"\n          ctx.fillRect(bottomUV[0], bottomUV[1], area.width, area.height)\n          ctx.drawImage(area.canvas, bottomUV[0], bottomUV[1])\n          ctx.fillStyle = `rgba(0, 0, 0, ${(100 - args.edgeBrightness) / 100})`\n          ctx.fillRect(bottomUV[0], bottomUV[1], area.width, area.height)\n        }\n      }\n      if (fonts[args.font].overlay && !args.disableFontOverlay) {\n        ctx.globalCompositeOperation = \"source-over\"\n        await loadOverlay(args.font)\n        ctx.drawImage(fonts[args.font].overlay, 0, 0, canvas.width, canvas.height)\n      }\n    }\n    ctx.globalCompositeOperation = \"copy\"\n    ctx.filter =`hue-rotate(${args.hue}deg) saturate(${args.saturation}%) brightness(${args.brightness}%) contrast(${args.contrast}%`\n    ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height)\n    ctx.filter =\"hue-rotate(0deg) saturate(100%) brightness(100%) contrast(100%)\"\n    ctx.globalCompositeOperation = args.blend\n    ctx.fillStyle = args.colour\n    ctx.globalAlpha = args.colourOpacity / 100\n    ctx.fillRect(0, 0, canvas.width, canvas.height)\n    ctx.globalAlpha = 1\n    ctx.globalCompositeOperation = \"destination-in\"\n    ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n    if (args.customEdge) {\n      ctx.globalCompositeOperation = \"source-atop\"\n      ctx.fillStyle = args.customEdgeColour\n      for (const row of fonts[args.font].ends) {\n        ctx.fillRect(0, row[0] * m, canvas.width, (row[1] - row[0]) * m)\n        ctx.fillRect(0, row[2] * m, canvas.width, (row[3] - row[2]) * m)\n      }\n    }\n    if (args.customOverlay || (args.overlay && args.overlay !== \"none\")) {\n      const overlay = await loadImage(args.customOverlay ?? await getTexture(fonts[args.font].overlays, args.overlay))\n      const overlayCanvas = new CanvasFrame(overlay.width, overlay.height)\n      overlayCanvas.ctx.drawImage(overlay, 0, 0)\n      overlayCanvas.ctx.globalCompositeOperation = args.overlayColourBlend\n      overlayCanvas.ctx.fillStyle = args.overlayColour\n      overlayCanvas.ctx.fillRect(0, 0, overlay.width, overlay.height)\n      overlayCanvas.ctx.globalCompositeOperation = \"destination-in\"\n      overlayCanvas.ctx.drawImage(overlay, 0, 0)\n      if (overlay.width > canvas.width) {\n        const frame = new CanvasFrame(overlay.width, overlay.height)\n        frame.ctx.imageSmoothingEnabled = false\n        frame.ctx.drawImage(canvas, 0, 0, overlay.width, overlay.height)\n        canvas = frame.canvas\n        ctx = frame.ctx\n        m = canvas.width / fonts[args.font].textureWidth\n      }\n      ctx.globalCompositeOperation = args.overlayBlend\n      ctx.imageSmoothingEnabled = false\n      ctx.globalAlpha = args.overlayOpacity / 100\n      ctx.drawImage(overlayCanvas.canvas, 0, 0, canvas.width, canvas.height)\n      ctx.globalAlpha = 1\n    }\n    if (args.customBorder) {\n      ctx.globalCompositeOperation = \"source-atop\"\n      ctx.fillStyle = args.customBorderColour\n      ctx.fillRect(0, fonts[args.font].border * m, canvas.width, canvas.height - fonts[args.font].border * m)\n    }\n    if (args.fadeToBorder) {\n      if (canvas.width < fonts[args.font].textureWidth * 4) {\n        const newCanvas = new CanvasFrame(fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4)\n        newCanvas.ctx.imageSmoothingEnabled = false\n        newCanvas.ctx.drawImage(canvas, 0, 0, fonts[args.font].textureWidth * 4, fonts[args.font].textureHeight * 4)\n        canvas = newCanvas.canvas\n        ctx = newCanvas.ctx\n        m = canvas.width / fonts[args.font].textureWidth\n      }\n      ctx.globalCompositeOperation = \"source-atop\"\n      const height = fonts[args.font].ends[fonts[args.font].ends.length - 1][3]\n      const border = ctx.getImageData(0, fonts[args.font].border * m, 1, 1).data\n      const gradient = ctx.createLinearGradient(0, 0, 0, height * m)\n      for (const stop of fonts[args.font].ends) {\n        gradient.addColorStop(stop[0] / height, `rgb(${border[0]},${border[1]},${border[2]})`)\n        gradient.addColorStop(stop[1] / height, `rgb(${border[0]},${border[1]},${border[2]}, 0)`)\n        gradient.addColorStop(stop[2] / height, `rgb(${border[0]},${border[1]},${border[2]}, 0)`)\n        gradient.addColorStop(stop[3] / height, `rgb(${border[0]},${border[1]},${border[2]})`)\n      }\n      ctx.fillStyle = gradient\n      ctx.fillRect(0, 0, canvas.width * m, height * m)\n    }\n    if (args.canvas) return canvas\n    if (args.three) {\n      const texture = await new Promise(fulfil => new THREE.TextureLoader().load(canvas.toDataURL(), fulfil))\n      texture.colorSpace = THREE.SRGBColorSpace\n      texture.magFilter = THREE.NearestFilter\n      return texture\n    }\n    return new Texture({\n      name: `${args.name ?? fonts[args.font].type === \"shape\" ? args.font : makeName(args.text)}.png`,\n      render_sides: \"front\",\n      uv_width: fonts[args.font].textureWidth,\n      uv_height: fonts[args.font].textureHeight\n    }).fromDataURL(canvas.toDataURL())\n  }\n\n  function makeWord(text, offset, parent, args) {\n    const word = new Group(fonts[args.font].type === \"shape\" ? args.font : args.name ?? makeName(text))\n    word.addTo(parent).init()\n    for (const char of text) {\n      if (fonts[args.font].characters[char]) {\n        const [character, newOffset] = makeCharacter(char, offset, word, args, text.length)\n        offset = newOffset\n      }\n    }\n    if (fonts[args.font].autoBorder) {\n      offset += 4\n      let minX = Infinity\n      let minY = Infinity\n      let minZ = Infinity\n      let maxX = -Infinity\n      let maxY = -Infinity\n      let maxZ = -Infinity\n      for (const group of word.children) for (const cube of group.children) {\n        minX = Math.min(minX, cube.from[0], cube.to[0])\n        minY = Math.min(minY, cube.from[1], cube.to[1])\n        minZ = Math.min(minZ, cube.from[2], cube.to[2])\n        maxX = Math.max(maxX, cube.from[0], cube.to[0])\n        maxY = Math.max(maxY, cube.from[1], cube.to[1])\n        maxZ = Math.max(maxZ, cube.from[2], cube.to[2])\n      }\n      const size = 2 * (args.scale[0] + args.scale[1]) / 2 * (args.type === \"bottom\" ? 0.75 : args.type === \"small\" ? 0.35 : 1)\n      const border = new Cube({\n        name: \"border\",\n        from: [maxX + size, maxY + size, maxZ + size],\n        to: [minX - size, minY - size, minZ - size]\n      })\n      const uv = [0, fonts[args.font].border, 1, fonts[args.font].border + 1]\n      for (const face of Object.values(border.faces)) {\n        face.texture = args.texture\n        face.uv = uv\n      }\n      border.addTo(word).init()\n      args.elements.push(border)\n    }\n    return [word, offset, args.lastCharacter]\n  }\n\n  const charMap = {\n    \"┫\": \"open_terminator\",\n    \"┣\": \"close_terminator\",\n    \" \": \"space\",\n    \"​\": \"spacer\"\n  }\n\n  function makeCharacter(char, offset, parent, args, wordLength) {\n    if (!args.disableCharacterShifting && args.lastCharacter && fonts[args.font].shifts?.[args.lastCharacter + char]) {\n      offset -= fonts[args.font].shifts[args.lastCharacter + char]\n    }\n    let minX = Infinity\n    let maxX = -Infinity\n    let minZ = Infinity\n    let maxZ = -Infinity\n    const cubes = []\n    for (const element of fonts[args.font].characters[char]) {\n      if (!element.parsed) {\n        element.parsed = true\n        for (const [direction, uv] of Object.entries(element.faces)) {\n          element.faces[direction] = { uv }\n        }\n      }\n      const cube = new Cube(element)\n      if (char === \"​\") {\n        if (cube.to[0] > cube.from[0]) {\n          cube.to[0] += args.spacerWidth\n        } else {\n          cube.from[0] += args.spacerWidth\n        }\n      }\n      if (args.type === \"small\") {\n        if (cube.to[2] > cube.from[2]) {\n          cube.to[2] -= 6\n        } else {\n          cube.from[2] -= 6\n        }\n      }\n      minX = Math.min(minX, cube.from[0], cube.to[0])\n      maxX = Math.max(maxX, cube.from[0], cube.to[0])\n      minZ = Math.min(minZ, cube.from[2], cube.to[2])\n      maxZ = Math.max(maxZ, cube.from[2], cube.to[2])\n      cube.autouv = 0\n      for (const key in cube.faces) {\n        const readFace = element.faces[key]\n        const newFace = cube.faces[key]\n        if (readFace === undefined) {\n          newFace.texture = null\n          newFace.uv = [0, 0, 0, 0]\n        } else {\n          newFace.texture = args.texture\n          newFace.uv.forEach((n, i) => {\n            const size = i % 2 === 0 ? fonts[args.font].textureWidth : fonts[args.font].textureHeight\n            newFace.uv[i] = readFace.uv[i] * size / 16\n          })\n        }\n      }\n      cubes.push(cube)\n    }\n    let character\n    if (wordLength === 1) {\n      character = parent\n    } else {\n      character = new Group(charMap[char] ? charMap[char] : makeName(char))\n      character.addTo(parent).init()\n    }\n    const heightOffset = fonts[args.font].height\n    for (const cube of cubes) {\n      cube.to[0] -= offset + maxX\n      cube.from[0] -= offset + maxX\n      cube.to[2] -= minZ\n      cube.from[2] -= minZ\n      if (args.type === \"bottom\") {\n        cube.to[1] *= 2\n        cube.from[1] *= 2\n        cube.to[1] -= args.row * (heightOffset * 2 + 4) + args.rowSpacing * args.row + heightOffset * 2 + 18\n        cube.from[1] -= args.row * (heightOffset * 2 + 4) + args.rowSpacing * args.row + heightOffset * 2 + 18\n        cube.to = cube.to.map(e => e * 0.75)\n        cube.from = cube.from.map(e => e * 0.75)\n        cube.to[2] -= 8\n        cube.from[2] -= 8\n        if (!fonts[args.font].flat) {\n          if (cube.to[2] > cube.from[2]) {\n            cube.to[2] += 24\n          } else {\n            cube.from[2] += 24\n          }\n        }\n      } else if (args.type === \"small\") {\n        cube.to[2] -= (maxZ - minZ)\n        cube.from[2] -= (maxZ - minZ)\n        cube.to[0] *= 0.35\n        cube.from[0] *= 0.35\n        cube.to[1] *= 0.35\n        cube.from[1] *= 0.35\n        cube.to[2] *= 0.35\n        cube.from[2] *= 0.35\n        cube.to[1] -= args.row * (heightOffset * 0.35) + args.rowSpacing * args.row + heightOffset * 0.35\n        cube.from[1] -= args.row * (heightOffset * 0.35) + args.rowSpacing * args.row + heightOffset * 0.35\n      } else {\n        cube.to[2] -= (maxZ - minZ) / 2\n        cube.from[2] -= (maxZ - minZ) / 2\n        cube.to[1] += args.row * (heightOffset + 4) + args.rowSpacing * args.row\n        cube.from[1] += args.row * (heightOffset + 4) + args.rowSpacing * args.row\n      }\n      cube.to = cube.to.map((e, i) => e * args.scale[i])\n      cube.from = cube.from.map((e, i) => e * args.scale[i])\n      cube.addTo(character).init()\n      args.elements.push(cube)\n    }\n    args.lastCharacter = char\n    return [character, offset + (maxX - minX + args.characterSpacing * args.scale[0])]\n  }\n\n  const makeName = str => str.replace(/\\s/g, \"_\").replace(/😳/g, \"a\").replace(/😩/g, \"'\").replace(/┫|┣|\\u200b/g, \"\")\n\n  function selectHandler() {\n    if (Mode.selected.id === \"minecraft_title_render\") Canvas.scene.traverseVisible(e => {\n      if (e.type === \"Line\") e.visible = false\n    })\n  }\n\n  async function getFontTextures(font, force) {\n    if (typeof fonts[font].textures === \"object\") {\n      if (!force) return\n    } else {\n      fonts[font].textures = {}\n    }\n    if (!fonts[font].overlays?.none) fonts[font].overlays = { none: { name: \"None\" } }\n    const data = await fetchData(`${fonts[font].type}s/${font}/textures.json`, () => ({ textures: {}, overlays: {} }))\n    for (const [id, texture] of Object.entries(data.textures)) {\n      texture.name ??= titleCase(id)\n      texture.texture = `${fonts[font].type}s/${font}/textures/${id}.png`\n      if (texture.variants) for (const [id, variant] of Object.entries(texture.variants)) {\n        variant.name ??= titleCase(id)\n        variant.texture = `${fonts[font].type}s/${font}/textures/${id}.png`\n      }\n      fonts[font].textures[id] = texture\n    }\n    for (const [id, overlay] of Object.entries(data.overlays)) {\n      overlay.name ??= titleCase(id)\n      overlay.texture = `${fonts[font].type}s/${font}/overlays/${id}.png`\n      fonts[font].overlays[id] = overlay\n    }\n    const flat = stats.find(e => e.id === `${font}.flat`)\n    if (flat) flat.count = Infinity\n    else stats.push({\n      id: `${font}.flat`,\n      count: Infinity\n    })\n    stats.push({\n      id: `${font}.none`,\n      count: Infinity\n    })\n    const mainId = Object.keys(fonts[font].textures)[1]\n    if (mainId) {\n      const main = stats.find(e => e.id === `${font}.${mainId}`)\n      if (main) main.count = 999999999\n      else stats.push({\n        id: `${font}.${mainId}`,\n        count: 999999999\n      })\n    }\n  }\n\n  async function getFontCharacters(id) {\n    if (typeof fonts[id].characters === \"object\") return\n    fonts[id].characters = await fetchData(`fonts/${id}/characters.json`)\n  }\n\n  function titleCase(str) {\n    return str.replace(/_|-/g, \" \").replace(/\\w\\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase())\n  }\n\n  function updateColour(dialog, v, c) {\n    dialog.component.data[v] = c.toHexString()\n    dialog.content_vue.updatePreview()\n  }\n\n  const colourInput = (dialog, v) => ({\n    preferredFormat: \"hex\",\n    color: dialog.component.data[v],\n    showAlpha: false,\n    showInput: true,\n    move: c => updateColour(dialog, v, c),\n    change: c => updateColour(dialog, v, c),\n    hide: c => updateColour(dialog, v, c)\n  })\n\n  function getTextureFromFile() {\n    return new Promise(fulfil => {\n      Filesystem.importFile({\n        title: \"Select Minecraft title texture\",\n        type: \"PNG Texture\",\n        readtype: \"buffer\",\n        extensions: [\"png\"]\n      }, async files => {\n        try {\n          const texture = await loadImage(files[0].content)\n          fulfil(texture)\n        } catch {\n          Blockbench.showQuickMessage(\"Unable to load texture\")\n          fulfil()\n        }\n      })\n    }).catch(() => undefined)\n  }\n\n  function getDefaultDialogArgs() {\n    const args = Object.fromEntries(Object.values(variables).flat().flatMap(Object.entries))\n    args.connection = connection\n    args.tab = 0\n    args.text = \"\"\n    args.fonts = fonts\n    args.fontList = []\n    args.types = {\n      top: \"Top\",\n      bottom: \"Bottom\",\n      small: \"Small\"\n    }\n    args.textures = []\n    args.tileables = tileables\n    args.tileablesList = []\n    args.overlays = []\n    args.blends = {\n      multiply: \"Multiply\",\n      color: \"Colour\",\n      lighter: \"Lighter\",\n      screen: \"Screen\",\n      overlay: \"Overlay\",\n      \"soft-light\": \"Soft Light\",\n      hue: \"Hue\",\n      saturation: \"Saturation\",\n      difference: \"Difference\",\n      \"source-over\": \"Source Over\"\n    }\n    args.building = false\n    args.build = false\n    args.updating = false\n    args.update = false\n    args.lastTextureSource = null\n    args.textureSearch = \"\"\n    args.tileableWidth = 0\n    args.tileableHeight = 0\n    return args\n  }\n\n  const getArgs = (vue, three) => {\n    const args = Object.fromEntries(Object.values(variables).flat().flatMap(Object.entries).map(([key]) => [key, vue[key]]))\n    args.texture = vue.textureSource === \"gradient\" || vue.textureSource === \"tileable\" || (vue.textureSource === \"file\" && vue.customTexture) || (!vue.customTexture && vue.textureSource === \"file\" && [\"gradient\", \"tileable\"].includes(vue.lastTextureSource)) ? \"flat\" : vue.texture\n    args.variant = vue.textureSource === \"premade\" || (!vue.customTexture && vue.textureSource === \"file\" && vue.lastTextureSource === \"premade\") ? vue.variant : null\n    args.tileable = vue.textureSource === \"tileable\" || (!vue.customTexture && vue.textureSource === \"file\" && vue.lastTextureSource === \"tileable\") ? vue.tileable : null\n    args.tileableVariant = vue.textureSource === \"tileable\" || (!vue.customTexture && vue.textureSource === \"file\" && vue.lastTextureSource === \"tileable\") ? vue.tileableVariant : null\n    args.customTexture = vue.textureSource === \"file\" ? vue.customTexture : null\n    args.customOverlay = vue.overlaySource === \"file\" ? vue.customOverlay : null\n    if (vue.textureSource === \"gradient\" || (!vue.customTexture && vue.textureSource === \"file\" && vue.lastTextureSource === \"gradient\")) {\n      for (let x = 0; x < 5; x++) {\n        args[\"gradientColour\" + x] = vue[\"gradientColour\" + x]\n      }\n    } else {\n      for (let x = 0; x < 5; x++) {\n        args[\"gradientColour\" + x] = null\n      }\n    }\n    args.three = three\n    return args\n  }\n\n  function areObjectsEqual(obj1, obj2) {\n    const keys1 = Object.keys(obj1)\n    const keys2 = Object.keys(obj2)\n    if (keys1.length !== keys2.length) return false\n    for (let key of keys1) {\n      if (!obj2.hasOwnProperty(key) || obj1[key]?.toString() !== obj2[key]?.toString()) {\n        return false\n      }\n    }\n    return true\n  }\n\n  function loadImage(b64) {\n    const img = new Image()\n    return new Promise((fulfil, reject) => {\n      img.onload = () => fulfil(img)\n      img.onerror = reject\n      if (b64 instanceof ArrayBuffer) {\n        img.src = URL.createObjectURL(new Blob([b64], { type: \"image/png\" }))\n      } else {\n        img.src = b64\n      }\n    })\n  }\n\n  function loadRenderAngle() {\n    Preview.selected.loadAnglePreset(titleCameraAngle)\n  }\n\n  const gcd = (a, b) => b === 0 ? a : gcd(b, a % b)\n\n  function getAspectRatio(w, h) {\n    const divisor = gcd(w, h)\n    return [w / divisor, h / divisor]\n  }\n\n  function getFromAspect(aW, aH, w, h, isWidth) {\n    let width, height\n    if (isWidth) {\n      width = w\n      height = Math.floor(w * aH / aW)\n      if (height > 4096) {\n        height = 4096\n        width = Math.floor(4096 * aW / aH)\n      }\n    } else {\n      height = h\n      width = Math.floor(h * aW / aH)\n      if (width > 4096) {\n        width = 4096\n        height = Math.floor(4096 * aH / aW)\n      }\n    }\n    return [width, height]\n  }\n\n  async function getTileable(id, variant) {\n    const data = variant ? tileables[id].variants[variant] : tileables[id]\n    if (!data.texture) {\n      data.texture = await new Promise(async fulfil => {\n        const reader = new FileReader()\n        reader.onload = e => fulfil(e.target.result)\n        reader.readAsDataURL(new Blob([await fetchData(`/tileables/${data.path ? data.path + \"/\" : \"\"}${variant ?? id}.png`).then(e => e.arrayBuffer())], { type: \"image/png\" }))\n      }).catch(() => {})\n    }\n    return data.texture\n  }\n\n  async function loadOverlay(id) {\n    if (typeof fonts[id].overlay === \"boolean\") {\n      fonts[id].overlay = await loadImage(await getTexture(null, null, null, `fonts/${id}/textures/overlay.png`))\n    }\n  }\n\n  function drawRotatedMirrored(ctx, img, x, y, w, h, r, mirror) {\n    ctx.save()\n    ctx.translate(x + w / 2, y + h / 2)\n    ctx.rotate(Math.degToRad(r))\n    if (mirror) ctx.scale(-1, 1)\n    ctx.drawImage(img, -(w / 2), -(h / 2), w, h)\n    ctx.restore()\n  }\n\n  const fract = n => n - Math.floor(n)\n\n  function random(x, y, z) {\n    x = fract(x * 0.1031)\n    y = fract(y * 0.1031)\n    z = fract(z * 0.1031)\n    const res = x * (z + 31.32) + y * (y + 31.32) + z * (x + 31.32)\n    return fract((x + y + res * 2) * (z + res))\n  }\n})()\n"
  },
  {
    "path": "plugins/missing_texture_highlighter.js",
    "content": "(function() {\r\nvar flash_action;\r\nPlugin.register('missing_texture_highlighter', {\r\n\ttitle: 'Missing Texture Highlighter',\r\n\ticon: 'flash_on',\r\n\tauthor: 'JannisX11',\r\n\tdescription: 'Highlights missing textures by flashing them.',\r\n\tversion: '0.1.1',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\t\tconst mt_highlighter = {\r\n\t\t\ti: 0,\r\n\t\t\tstart: function() {\r\n\t\t\t\tclearInterval(mt_highlighter.interval);\r\n\t\t\t\tmt_highlighter.i = 0;\r\n\t\t\t\tmt_highlighter.interval = setInterval(mt_highlighter.flash, 200);\r\n\t\t\t\tmt_highlighter.flash();\r\n\t\t\t},\r\n\t\t\tflash: function() {\r\n\t\t\t\tvar fc = mt_highlighter.i;\r\n\t\t\t\tif (fc > 16) {\r\n\t\t\t\t\tx = 0;\r\n\t\t\t\t\tclearInterval(mt_highlighter.interval);\r\n\t\t\t\t}\r\n\t\t\t\tCanvas.emptyMaterials.forEach((m, i) => {\r\n\t\t\t\t\tlet brightness = (fc%2) ? settings.brightness.value / 50 : 2.5;\r\n\t\t\t\t\tm.uniforms.BRIGHTNESS.value = brightness;\r\n\t\t\t\t})\r\n\t\t\t\tmt_highlighter.i++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tflash_action = new Action({\r\n\t\t\tid: 'flash_missing_textures',\r\n\t\t\tname: 'Flash Missing Textures',\r\n\t\t\tcategory: 'textures',\r\n\t\t\ticon: 'flash_on',\r\n\t\t\tclick() {\r\n\t\t\t\tmt_highlighter.start();\r\n\t\t\t}\r\n\t\t});\r\n\t\tMenuBar.addAction(flash_action, 'filter')\r\n\t},\r\n\tonunload() {\r\n\t\tflash_action.delete();\r\n\t}\r\n});\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/mod_utils.js",
    "content": "/**\nMIT License\n\nCopyright (c) 2022 JTK222\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 all\ncopies 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 THE\nSOFTWARE.\n**/\n\n(function() {\n\nvar mappingsKey = \"mod_utils.has_mappings\";\nvar omitVoxelShapesGroup = \"mod_utils.omitVoxelShapesGroup\";\n\nfunction isValidVersion(){\n\tvar versions = Blockbench.version.split(\".\");\n\treturn versions[0] >= 3 && versions [1] >= 1;\n}\n\nfunction loadZipToJson(importType){\n\t/*Undo.initEdit({\n\t\toutliner: true,\n\t\tuv_mode: true,\n\t\telements: Outliner.elements,\n\t\ttextures: textures\n\t});*/\n\n\tBlockbench.import({\n\t\ttype: importType.extension + ' File',\n\t\textensions: [importType.extension],\n\t\treadtype: 'binary'\n\t}, (files) => {\n\t\tlet data = files[0].content;\n\t\tvar loadedZip = new JSZip().loadAsync(data);\n\t\tloadedZip.then(zip => {\n\t\t\tzip.file(importType.file).async(\"string\")\n\t\t\t.then(json => {\n\t\t\t\tconsole.log(importType);\n\t\t\t\timportType.import(json);\n\t\t\t});\n\t\t\t\n\t\t\tif(importType == ImportTypeEnum.TBL){\n\t\t\t\tif(zip.file(importType.texture))\n\t\t\t\t\tzip.file(importType.texture).async(\"base64\").then(img => {\n\t\t\t\t\t\tvar texture = new Texture().fromDataURL('data:image/png;base64,' + img);\n\t\t\t\t\t\n\t\t\t\t\t\ttexture.add();\n\t\t\t\t\t});\n\t\t\t}else{\n\t\t\t\tif(zip.file(importType.texture))\n\t\t\t\t\tzip.file(importType.texture).forEach(pr => {\n\t\t\t\t\t\tpr.async(\"base64\").then(img => {\n\t\t\t\t\t\t\tvar texture = new Texture().fromDataURL('data:image/png;base64,' + img);\n\t\t\t\t\t\t\n\t\t\t\t\t\t\ttexture.add();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\t//Undo.finishEdit(\"Model Import\");\n}\n\nvar ImportTypeEnum = {\n\tTBL: {\n\t\textension: 'tbl',\n\t\tfile: 'model.json',\n\t\ttexture: 'texture.png',\n\t\timport: loadTabulaModel\n\t},\n\tTBL2: {\n\t\textension: 'tbl',\n\t\tfile: 'model.json',\n\t\ttexture: 'texture.png',\n\t\timport: null\n\t},\n\tTCN: {\n\t\textension: 'tcn',\n\t\tfile: 'model.xml',\n\t\ttexture: /\\.png/,\n\t\timport: loadTechneModel\n\t}\n}\n\nvar AxisEnum = {\n\tX: 0,\n\tY: 1,\n\tZ: 2,\n\tsize: 3,\n\tproperties: {\n\t\t0: {name: \"X-Axis\", value: 0, code: \"x\"},\n\t\t1: {name: \"Y-Axis\", value: 1, code: \"y\"},\n\t\t2: {name: \"Z-Axis\", value: 2, code: \"z\"},\n\t}\n}\n\n    var Mappings = {\n        mojmaps: {\n            createCube: \"Block.box\",\n            combine: \"VoxelShapes.join\",\n            booleanFunction: \"IBooleanFunction\",\n            key: \"mod_utils.selected_mappings.mojmaps\",\n        },\n        mcp: {\n            createCube: \"Block.makeCuboidShape\",\n            combine: \"VoxelShapes.combineAndSimplify\",\n            booleanFunction: \"IBooleanFunction\",\n            key: \"mod_utils.selected_mappings.mcp\",\n        },\n        yarn: {\n            createCube: \"Block.createCuboidShape\",\n            combine: \"VoxelShapes.combineAndSimplify\",\n            booleanFunction: \"BooleanBiFunction\",\n            key: \"mod_utils.selected_mappings.yarn\",\n        },\n        parchment: {\n            createCube: \"Block.box\",\n            combine: \"Shapes.join\",\n            booleanFunction: \"BooleanOp\",\n            key: \"mod_utils.selected_mappings.parchment\",\n        },\n    };\n\n/** ---------- Help ---------- */\n\nvar helpDialog = new Dialog({\n\tid: 'mod_utils_help_dialog',\n\ttitle: 'Help - Mod Utils',\n\twidth: 800,\n\tlines: [\n\t\t`<style>\n\t\t.modUtilHelpTabs {\n\t\t\tposition: relative;\n\t\t\tmin-height: 400px; /* This part sucks */\n\t\t\tclear: both;\n\t\t\tmargin: 25px 0;\n\t\t}\n\t\t.modUtilsHelpTab {\n\t\t\tfloat: left;\n\t\t}\n\t\t.modUtilsHelpTab label {\n\t\t\tbackground: var(--color-ui);\n\t\t\tpadding: 10px;\n\t\t\tborder: 1px solid #ccc;\n\t\t\tmargin-left: -1px;\n\t\t\tposition: relative;\n\t\t\tleft: 1px;\n\t\t}\n\t\t.modUtilsHelpTab [type=\"radio\"] {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.modUtilsContent {\n\t\t\tposition: absolute;\n\t\t\ttop: 28px;\n\t\t\tleft: 0;\n\t\t\tbackground: var(--color-ui);\n\t\t\tright: 0;\n\t\t\tbottom: 0;\n\t\t\tpadding: 20px;\n\t\t\tborder: 1px solid #ccc;\n\t\t\theight: auto;\n\t\t\toverflow: auto;\n\t\t}\n\t\t[type=\"radio\"]:checked ~ label {\n\t\t\tbackground: var(--color-button);\n\t\t\tborder-bottom: 1px solid white;\n\t\t\tz-index: 2;\n\t\t}\n\t\t[type=\"radio\"]:checked ~ label ~ .modUtilsContent {\n\t\t\tz-index: 1;\n\t\t}\n\t</style>\n\t<div class=\"modUtilHelpTabs\">\n\t\t<div class=\"modUtilsHelpTab\">\n\t\t\t<input type=\"radio\" id=\"tab-1\" name=\"tab-group-1\" checked />\n\t\t\t<label for=\"tab-1\">VoxelShapes</label>\n\t\t\t<div class=\"modUtilsContent\">\n\t\t\t\t<p>\n\t\t\t\t\tIn order to use the VoxelShape exporter, you first need to\n\t\t\t\t\tcreate a new Group, called \"VoxelShapes\". All cubes that you\n\t\t\t\t\tcreate within this group, will be added to the voxelShape trough\n\t\t\t\t\tthe OR BooleanFunction. Additionally you can add sub groups with\n\t\t\t\t\tthe name equaling a \"$\" and a BooleanFunction as shown in the image\n\t\t\t\t\tbellow (Ex: $and). The first cube in such a group represents the red\n\t\t\t\t\tcube, all other ones will be combined with an OR BooleanFunction\n\t\t\t\t\tfirst.\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\tThere is an advanced settings menu for the VoxelShape exporter that\n\t\t\t\t\tallows you to disable the requirement of the \"VoxelShapes\" group.\n\t\t\t\t\tThis option is only designed to be used for rapid prototyping and should\n\t\t\t\t\tnot be used in production. For the best performance, you should be creating a\n\t\t\t\t\trepresentation of your VoxelShape in a separate model and use the BooleanFunctions\n\t\t\t\t\tto create the proper shape rather than ORing all of the cubes in your model together.\n\t\t\t\t\tIf not using BooleanFunctions, use the \"VoxelShapes\" group to make sure that only\n\t\t\t\t\tthe cubes you need are being used for the VoxelShape. The less cubes, the better.\n\t\t\t\t</p>\n\t\t\t\t<img\n\t\t\t\t\tsrc=\"https://raw.githubusercontent.com/JannisX11/blockbench-plugins/master/src/mod_utils/voxel_shape_guide.png\"\n\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\theight=\"auto\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"modUtilsHelpTab\">\n\t\t\t<input type=\"radio\" id=\"tab-2\" name=\"tab-group-1\" />\n\t\t\t<label for=\"tab-2\">Tabula Import</label>\n\t\t\t<div class=\"modUtilsContent\">\n\t\t\t\t<p>\n\t\t\t\t\tIn order to import a Tabula Model, you need to create a new\n\t\t\t\t\tModded Entity. Now the Point \"Import Tabula Model (.tbl)\" should\n\t\t\t\t\tbe available in your import menu.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"modUtilsHelpTab\">\n\t\t\t<input type=\"radio\" id=\"tab-3\" name=\"tab-group-1\" />\n\t\t\t<label for=\"tab-3\">Techne Import</label>\n\t\t\t<div class=\"modUtilsContent\">\n\t\t\t\t<p>\n\t\t\t\t\tTechne Import is only Available in Modded Entity Mode. A new\n\t\t\t\t\tMenu entry under \"File > Import > Import Techne Model (.tcn)\"\n\t\t\t\t\tshould be available.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>`\n\t],\n\tsingleButton: true\n});\n\nvar modUtilsHelp = new Action({\n\tid: 'mod_utils.help',\n\tname: \"Mod Utils\",\n\ticon: 'help',\n\tdescription: 'Opens a Small Help window',\n\tcategory: 'help',\n\tcondition: () => true,\n\tclick: function (event) {\n\t\thelpDialog.show();\n\t}\n});\n\n/** ---------- Import - Techne ---------- */\n\n\nvar importTechne = new Action({\n\tid: 'import_techne',\n\tname: \"Import Techne Model (.tcn)\",\n\ticon: 'flip_to_back',\n\tdescription: 'Import a Techne Model',\n\tcategory: 'file',\n\tcondition: () => Format.id === Formats.modded_entity.id,\n\tclick: function (event) {\n\t\tloadZipToJson(ImportTypeEnum.TCN);\n\t}\n});\n\nfunction loadTechneModel(data) {\n\n\treader = new DOMParser();\n\tvar xml = reader.parseFromString(data, \"text/xml\");\n\n\tvar model = xml.getElementsByTagName(\"Model\")[0];\n\t\n\tname = xml.getElementsByTagName(\"ProjectName\")[0].childNodes[0].nodeValue;\n\ttextureSizes = xml.getElementsByTagName(\"TextureSize\")[0].childNodes[0].nodeValue;\n\n\tProject.name = name;\n\tProject.texture_width = textureSizes.slice(0, textureSizes.indexOf(\",\"));\n\tProject.texture_height = textureSizes.slice(textureSizes.indexOf(\",\") + 1, textureSizes.length);\n\t\n\tvar shapes = model.getElementsByTagName(\"Geometry\")[0].getElementsByTagName(\"Shape\");\n\tvar rootGroup = new Group(\"root\").addTo();\n\trootGroup.init();\n\n\tfor(var i = 0; i < shapes.length; i++){\n\t\tvar shape = shapes[i];\n\t\t\n\t\toffset = JSON.parse(\"[\" + shape.getElementsByTagName(\"Offset\")[0].childNodes[0].nodeValue + \"]\");\n\t\tposition = JSON.parse(\"[\" + shape.getElementsByTagName(\"Position\")[0].childNodes[0].nodeValue + \"]\");\n\t\tposition[1] = 24 - position[1];\n\t\trotation = JSON.parse(\"[\" + shape.getElementsByTagName(\"Rotation\")[0].childNodes[0].nodeValue + \"]\");\n\t\tsize = JSON.parse(\"[\" + shape.getElementsByTagName(\"Size\")[0].childNodes[0].nodeValue + \"]\");\n\t\tuv = JSON.parse(\"[\" + shape.getElementsByTagName(\"TextureOffset\")[0].childNodes[0].nodeValue + \"]\");\n\t\tmirror = shape.getElementsByTagName(\"TextureOffset\")[0].childNodes[0].nodeValue === \"True\";\n\t\t\n\t\tvar group = new Group(\n\t\t\t{\n\t\t\t\tname: shape.getAttribute(\"name\"),\n\t\t\t\torigin: [position[0], position[1], position[2]],\n\t\t\t\trotation: [-rotation[0], rotation[1], rotation[2]],\n\t\t\t}\n\t\t).addTo(rootGroup);\n\t\tgroup.init();\n\t\t\n\t\tvar cube = new Cube(\n\t\t\t{\n\t\t\t\tmirror_uv: mirror,\n\t\t\t\tname: shape.getAttribute(\"name\"),\n\t\t\t\tfrom: [position[0] + offset[0], position[1] - size[1] - offset[1], position[2] + offset[2]],\n\t\t\t\tto: [position[0] + size[0] + offset[0], position[1] - offset[1], position[2] + offset[2] + size[2]],\n\t\t\t\tuv_offset: [uv[0],  uv[1]],\n\t\t\t}\n\t\t).addTo(group);\n\t\tcube.init();\n\t}\n\tCanvas.updateAll()\n}\n\n/** ---------- Import - Tabula ---------- */\n\nvar importTabula = new Action({\n\tid: 'import_tabula',\n\tname: \"Import Tabula Model (.tbl)\",\n\ticon: 'flip_to_back',\n\tdescription: 'Import a Tabula Model',\n\tcategory: 'file',\n\tcondition: () => Format.id === Formats.modded_entity.id,\n\tclick: function (event) {\n\t\tloadZipToJson(ImportTypeEnum.TBL);\n\t}\n});\n\nfunction loadTabulaModel(data) {\n\tUndo.initEdit({\n\t\toutliner: true,\n\t\tbitmap: true,\n\t\tuv_mode: true\n\t});\n\tvar json = JSON.parse(data);\n\t\n\tvar version = json.projVersion || 0;\n\n\tswitch(version){\n\t\tcase 5:\n\t\t\tProject.name = json.modelName;\n\t\t\tProject.texture_width = json.texWidth;\n\t\t\tProject.texture_height = json.texHeight;\n\t\t\tjson.parts.forEach(part => readTblBone(part, version, null));\n\t\t\tBlockbench.showMessageBox({\n\t\t\t\ttitle: \"Warning\",\n\t\t\t\tmessage: \"You imported a version 5 Tabula Model.\\nThis Format has some functions which are not supported by Blockbench, for this reason some things might have broken on import.\"\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tProject.name = json.modelName;\n\t\t\tProject.texture_width = json.textureWidth;\n\t\t\tProject.texture_height = json.textureHeight;\n\t\t\tvar rootGroup = new Group(\n\t\t\t\t{\n\t\t\t\t\tname: \"root\",\n\t\t\t\t\torigin: [0, 24, 0],\n\t\t\t\t\trotation: [0, 0, 0],\n\t\t\t\t}\n\t\t\t).addTo();\n\t\t\trootGroup.init();\n\t\t\tjson.cubes.forEach(cube => readTblBone(cube, version, rootGroup));\n\t\t\tbreak;\n\t}\n\t\n\n\tUndo.finishEdit('Import Tabula Model');\n\tCanvas.updateAll();\n}\n\nfunction readTblBone(json, version, parentGroup){\n\tvar group;\n\tswitch(version){\n\t\tcase 5:\n\t\t\tgroup = new Group({\n\t\t\t\tname: json.name,\n\t\t\t\torigin: [(parentGroup == null ? 0 : parentGroup.origin[0]) + json.rotPX, (parentGroup == null ?  + 24 : parentGroup.origin[1]) - json.rotPY, (parentGroup == null ? 0 : parentGroup.origin[2]) + json.rotPZ],\n\t\t\t\trotation: [-json.rotAX, json.rotAY, -json.rotAZ]\n\t\t\t});\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tgroup = new Group({\n\t\t\t\tname: json.name,\n\t\t\t\torigin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]],\n\t\t\t\trotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]],\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tgroup = new Group({\n\t\t\t\tname: json.name,\n\t\t\t\torigin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]],\n\t\t\t\trotation: [-json.rotation[0], json.rotation[1], json.rotation[2]],\n\t\t\t});\n\t\t\tbreak;\n\t}\n\tif(parentGroup) group.addTo(parentGroup);\n\tgroup.init();\n\n\tswitch(version){\n\t\tcase 5:\n\t\t\tif(json.children) json.children.forEach(bone => readTblBone(bone, version, group));\n\t\t\tif(json.boxes) json.boxes.forEach(cube => readTblCube(cube, version, group, json));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif(json.children) json.children.forEach(bone => readTblBone(bone, version, group));\n\t\t\treadTblCube(json, version, group);\n\t\t\tbreak;\n\t}\n}\n\nfunction readTblCube(json, version, parentGroup, extra){\n\tvar cube;\n\tswitch(version){\n\t\tcase 5:\n\t\t\tvar pos = [json.posX, json.posY, json.posZ];\n\t\t\tvar dim = [json.dimX, json.dimY, json.dimZ];\n\t\t\tcube = new Cube({\n\t\t\t\tmirror_uv: extra.mirror,\n\t\t\t\tname: json.name,\n\t\t\t\tfrom: [parentGroup.origin[0] + pos[0], parentGroup.origin[1] -  pos[1] - dim[1], parentGroup.origin[2] +  pos[2]],\n\t\t\t\tto: [parentGroup.origin[0] + pos[0] + dim[0], parentGroup.origin[1] - pos[1], parentGroup.origin[2] +  pos[2] + dim[2]],\n\t\t\t\tuv_offset: [extra.texOffX + json.texOffX, extra.texOffY + json.texOffY]\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcube = new Cube({\n\t\t\t\tmirror_uv: json.txMirror,\n\t\t\t\tname: json.name,\n\t\t\t\tfrom: [parentGroup.origin[0] + json.offset[0], parentGroup.origin[1] -  json.offset[1] - json.dimensions[1], parentGroup.origin[2] +  json.offset[2]],\n\t\t\t\tto: [parentGroup.origin[0] + json.offset[0] + json.dimensions[0], parentGroup.origin[1] - json.offset[1], parentGroup.origin[2] +  json.offset[2] + json.dimensions[2]],\n\t\t\t\tuv_offset: [json.txOffset[0],  json.txOffset[1]],\n\t\t\t});\n\t\t\tbreak;\n\t}\n\tif(parentGroup) cube.addTo(parentGroup);\n\tcube.init();\n}\n\n/** ---------- Import Tabula Model v2 --------- */\nvar importTabula2Obj = (function (){\n\n\tfunction loadTabulaModel2(data) {\n\t\tUndo.initEdit({\n\t\t\toutliner: true,\n\t\t\tbitmap: true,\n\t\t\tuv_mode: true,\n\t\t});\n\t\tvar json = JSON.parse(data);\n\t\t\n\t\tvar version = json.projVersion || 0;\n\n\t\tif(version != 2){\n\t\t\tBlockbench.showMessageBox({\n\t\t\t\ttitle: \"Warning\",\n\t\t\t\tmessage: \"You are importing an unsupported version of Tabula files, if you experience any issues, please report them and provide your model file so we can try to fix them.\"\n\t\t\t});\n\t\t}\n\t\tProject.name = json.modelName;\n\t\tProject.texture_width = json.textureWidth;\n\t\tProject.texture_height = json.textureHeight;\n\t\tvar rootGroup = new Group(\n\t\t\t{\n\t\t\t\tname: json.modelName,\n\t\t\t\torigin: [0, 24, 0],\n\t\t\t\trotation: [0, 0, 0],\n\t\t\t}\n\t\t).addTo();\n\t\trootGroup.init();\n\t\tjson.cubes.forEach(cube => parseTbl(cube, version, rootGroup));\n\t\t\n\t\n\t\tUndo.finishEdit('Import Tabula Model', {\n\t\t\toutliner: true,\n\t\t\tbitmap: true,\n\t\t\tuv_mode: true,\n\t\t});\n\t\tCanvas.updateAll();\n\t}\n\n\tfunction parseTbl(json, version, parentGroup){\n\t\tif((json.children && json.children.length > 1) || !parentGroup){\n\t\t\tvar group = null;\n\t\t\tswitch(version){\n\t\t\t\tcase 2:\n\t\t\t\t\tgroup = new Group({\n\t\t\t\t\t\tname: json.name,\n\t\t\t\t\t\torigin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]],\n\t\t\t\t\t\trotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]],\n\t\t\t\t\t});\n\t\t\t\t\tif(parentGroup) group.addTo(parentGroup);\n\t\t\t\t\tgroup.init();\n\t\t\t\t\tcreateCube(json, group, false);\n\t\t\t\t\tif(json.children) json.children.forEach(bone => parseTbl(bone, version, group));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: break;\n\t\t\t}\n\t\t}else{\n\t\t\tcreateCube(json, parentGroup, true);\n\t\t}\n\t}\n\n\tfunction createCube(json, parentGroup, useRotation){\n\t\tvar cubeObj = null;\n\t\t\n\t\tif(!useRotation)\n\t\t\tcubeObj = {\n\t\t\t\tmirror_uv: json.txMirror,\n\t\t\t\tname: json.name,\n\t\t\t\tfrom: [parentGroup.origin[0] + json.offset[0], parentGroup.origin[1] -  json.offset[1] - json.dimensions[1], parentGroup.origin[2] +  json.offset[2]],\n\t\t\t\tto: [parentGroup.origin[0] + json.offset[0] + json.dimensions[0], parentGroup.origin[1] - json.offset[1], parentGroup.origin[2] +  json.offset[2] + json.dimensions[2]],\n\t\t\t\tuv_offset: [json.txOffset[0],  json.txOffset[1]],\n\t\t\t\torigin: [parentGroup.origin[0], parentGroup.origin[1], parentGroup.origin[2]],\n\t\t\t};\n\t\telse\n\t\t\tcubeObj = {\n\t\t\t\tmirror_uv: json.txMirror,\n\t\t\t\tname: json.name,\n\t\t\t\tfrom: [\n\t\t\t\t\tparentGroup.origin[0] + json.position[0] + json.offset[0],\n\t\t\t\t\tparentGroup.origin[1] - json.position[1] - json.offset[1] - json.dimensions[1],\n\t\t\t\t\tparentGroup.origin[2] + json.position[2] + json.offset[2]\n\t\t\t\t],\n\t\t\t\tto: [\n\t\t\t\t\tparentGroup.origin[0] + json.position[0] + json.offset[0] + json.dimensions[0],\n\t\t\t\t\tparentGroup.origin[1] - json.position[1] - json.offset[1],\n\t\t\t\t\tparentGroup.origin[2] + json.position[2] + json.offset[2] + json.dimensions[2]\n\t\t\t\t],\n\t\t\t\tuv_offset: [json.txOffset[0],  json.txOffset[1]],\n\t\t\t\torigin: [parentGroup.origin[0] + json.position[0], parentGroup.origin[1] - json.position[1], parentGroup.origin[2] + json.position[2]],\n\t\t\t\trotation: [-json.rotation[0], json.rotation[1], -json.rotation[2]],\n\t\t\t};\n\n\t\tvar cube = new Cube(cubeObj);\n\t\tif(parentGroup) cube.addTo(parentGroup);\n\t\tcube.init();\n\t}\n\n\treturn {\n\t\tact: new Action({\n\t\t\tid: 'import_tabula_2',\n\t\t\tname: \"Import Tabula Model - Better but Experimental (.tbl)\",\n\t\t\ticon: 'flip_to_back',\n\t\t\tdescription: 'Experimental - Import a Tabula Model, may produce a better result, but does not support all tabula file format versions. If you have broken results please report those issues.',\n\t\t\tcategory: 'file',\n\t\t\tcondition: () => Format.id === Formats.modded_entity.id,\n\t\t\tclick: function (event) {\n\t\t\t\tloadZipToJson(ImportTypeEnum.TBL2);\n\t\t\t}\n\t\t}),\n\t\tbaseFunc: loadTabulaModel2,\n\t};\n})();\n\nvar importTabula2 = importTabula2Obj.act;\nImportTypeEnum.TBL2.import = importTabula2Obj.baseFunc;\n\n/** ---------- Export - VoxelShape ---------- */\n\n    var exportVoxelShapeAction = new Action({\n        id: \"export_voxelshape\",\n        name: \"Export Voxelshape (1.14+ Modded Minecraft)\",\n        icon: \"flip_to_back\",\n        description: \"Export a VoxelShape (Block Hitbox 1.14+ Modded only)\",\n        category: \"file\",\n        condition: () => Format.id === Formats.java_block.id,\n        click: function (event) {\n            if (event.shiftKey || !Blockbench.hasFlag(mappingsKey)) {\n                resetFlags();\n                exportVoxelShapeDialog.show();\n            } else exportVoxelShape(undefined);\n        },\n    });\n\n    var exportVoxelShapeDialog = new Dialog({\n        id: \"export_voxelshape\",\n        title: \"VoxelShape Exporter\",\n\t\tbuttons: [\"Confirm\", \"Cancel\", \"Advanced Settings\"],\n\t\tconfirmIndex: 0,\n\t\tcancelIndex: 1,\n        form: {\n            mappings: {\n                label: \"Mappings\",\n                type: \"select\",\n                options: {\n                    mojmaps: \"MojMaps (Mojang's Official Mappings)\",\n                    mcp: \"MCP\",\n                    yarn: \"Yarn\",\n                    parchment: \"Parchment\",\n                },\n                value: \"mojmaps\",\n\t\t\t\tdescription: \"Select the mappings being used by your development environment\",\n            },\n            rememberSettings: {\n                label: \"Remember settings\",\n                type: \"checkbox\",\n                value: true,\n                description:\n                    \"This will remember these settings and you won't be prompted again.\\nTo access this menu again, hold shift while selecting the export option.\",\n            },\n        },\n        onConfirm: function (formData) {\n            this.hide();\n\n            if (formData.rememberSettings) {\n                Blockbench.addFlag(mappingsKey);\n                Blockbench.addFlag(Mappings[formData.mappings].key);\n            }\n\n            exportVoxelShape(Mappings[formData.mappings]);\n        },\n\t\tonButton(index, event) {\n\t\t\tif (index !== 2) return;\n\t\t\t\n\t\t\tvar advancedSettingsDialog = new Dialog({\n\t\t\t\tid: \"voxelshape_advanced_settings\",\n\t\t\t\ttitle: \"Advanced Settings\",\n\t\t\t\tlines: [\n\t\t\t\t\t`\n\t\t\t\t\t<style>\n\t\t\t\t\t\th1, p {\n\t\t\t\t\t\t\tmargin: 0%;\n\t\t\t\t\t\t}\n\t\t\t\t\t</style>\n\t\t\t\t\t<h1>WARNING</h1>\n\t\t\t\t\t<p>Disabling this setting can and will severely harm your model's performance. This setting should only be used for basic models and/or for prototyping. For the proper way of doing this, please look at the help section.</p>\n\t\t\t\t\t<br>\n\t\t\t\t\t`,\n\t\t\t\t],\n\t\t\t\tform: {\n\t\t\t\t\tonlyIncludeVoxelShapesGroup: {\n\t\t\t\t\t\tlabel: '\"VoxelShapes\" required',\n\t\t\t\t\t\ttype: \"checkbox\",\n\t\t\t\t\t\tvalue: !Blockbench.hasFlag(omitVoxelShapesGroup),\n\t\t\t\t\t\tdescription: 'Only the cubes in the group named \"VoxelShapes\" will be used.\\nIf not enabled, all cubes in the project will be used.',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tpart_order: [\"lines\", \"form\", \"component\"],\n\t\t\t\tonConfirm(formData) {\n\t\t\t\t\tif (!formData.onlyIncludeVoxelShapesGroup) Blockbench.addFlag(omitVoxelShapesGroup); else Blockbench.removeFlag(omitVoxelShapesGroup);\n\t\t\t\t\texportVoxelShapeDialog.show();\n\t\t\t\t},\n\t\t\t\tonCancel() {\n\t\t\t\t\texportVoxelShapeDialog.show();\n\t\t\t\t}\n\t\t\t})\n\t\t\tadvancedSettingsDialog.show()\n\t\t}\n    });\n\n    function exportVoxelShape(mappings) {\n        if (mappings === undefined) {\n            if (Blockbench.hasFlag(Mappings.mojmaps.key)) {\n                mappings = Mappings.mojmaps;\n            } else if (Blockbench.hasFlag(Mappings.mcp.key)) {\n                mappings = Mappings.mcp;\n            } else if (Blockbench.hasFlag(Mappings.yarn.key)) {\n                mappings = Mappings.yarn;\n            } else if (Blockbench.hasFlag(Mappings.parchment.key)) {\n                mappings = Mappings.parchment;\n            } else {\n                exportVoxelShapeDialog.show();\n                return;\n            }\n        }\n\n\t\tvar output;\n        if (!Blockbench.hasFlag(omitVoxelShapesGroup)) {\n\t\t\tvar voxelShapeGroup = searchVoxelShapeGroup(Outliner.elements);\n            if (voxelShapeGroup === undefined) {\n                Blockbench.showMessageBox({\n                    buttons: [\"ok\"],\n                    confirm: 0,\n                    title: \"Error - VoxelShape Export\",\n                    message:\n                        'You are missing the \"VoxelShapes\" group,\\nwhich is required to export a voxel Shape.\\nCheck out the Help menu for further instructions.',\n                });\n\t\t\t\tresetFlags()\n                return;\n            }\n\t\t\toutput = generateShape(voxelShapeGroup, mappings);\n        } else {\n\t\t\toutput = generateShape(undefined, mappings)\n\t\t}\n\t\t\n\t\t//code repurposed from CodeView plugin\n\t\toutputViewDialog = new Dialog({\n\t\t\ttitle: 'VoxelShape Output',\n\t\t\tid: 'output_view',\n\t\t\tresizable: true,\n\t\t\twidth: 650,\n\t\t\tsingleButton: true,\n\t\t\tcomponent: {\n\t\t\t\tcomponents: {VuePrismEditor},\n\t\t\t\tdata: {\n\t\t\t\t\ttext: ''\n\t\t\t\t},\n\t\t\t\tmethods: {\n\t\t\t\t\tcopyText() {\n\t\t\t\t\t\tnavigator.clipboard.writeText(this.text);\n\t\t\t\t\t\tBlockbench.showQuickMessage(\n\t\t\t\t\t\t\t\"Copied!\",\n\t\t\t\t\t\t\t1000\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\texportFile() {\n\t\t\t\t\t\tvar path = Blockbench.export({\n\t\t\t\t\t\t\textensions: [\"java\", \"txt\"],\n\t\t\t\t\t\t\tname: \"VoxelShape\",\n\t\t\t\t\t\t\tcontent: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tBlockbench.showQuickMessage(\n\t\t\t\t\t\t\t\"The VoxelShape was successfully exported!\",\n\t\t\t\t\t\t\t1000\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<vue-prism-editor id=\"code-view-output\" v-model=\"text\" language=\"java\" style=\"height: 25em;\" :line-numbers=\"true\" />\n\t\t\t\t\t\t<button @click=\"copyText()\" style=\"width: 49%; margin: 0 auto; display: inline;\">Copy</button>\n\t\t\t\t\t\t<button @click=\"exportFile()\" style=\"width: 49%; margin: 0 auto; display: inline;\">Export</button>\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t}\n        });\n        outputViewDialog.component.data.text = output;\n\t\toutputViewDialog.show();\n    }\n\n    function generateShape(group, mappings) {\n\t\tvar elements = []\n\t\telements = group === undefined ? Outliner.elements : group.children;\n        var operation = group.name[0] === '$' ? group.name.substring(1).toUpperCase() : \"OR\";\n        if (operation === \"VOXELSHAPES\" || group === undefined) {\n            operation = \"OR\";\n        }\n\n        var method = [];\n\n        for (var i = 0; i < elements.length; i++) {\n            var child = elements[i];\n            if (child instanceof Group) {\n                method.push(generateShape(child, mappings));\n            } else {\n                method.push(\n                    mappings.createCube +\n                        \"(\" +\n                        child.from[0] +\n                        \", \" +\n                        child.from[1] +\n                        \", \" +\n                        child.from[2] +\n                        \", \" +\n                        child.to[0] +\n                        \", \" +\n                        child.to[1] +\n                        \", \" +\n                        child.to[2] +\n                        \")\"\n                );\n            }\n        }\n\n        var useStream = operation === \"OR\" && elements.length > 2;\n\n        if (useStream) {\n            var output = \"Stream.of(\\n\";\n\n            for (var i = 0; i < method.length; i++) {\n                if (i == method.length - 1) {\n                    output = output + method[i] + \"\\n\";\n                } else {\n                    output = output + method[i] + \",\\n\";\n                }\n            }\n\n            output =\n                output +\n                \").reduce((v1, v2) -> \" +\n                mappings.combine +\n                \"(v1, v2, \" +\n                mappings.booleanFunction +\n                \".\" +\n                operation +\n                \")).get();\";\n\n            return output;\n        } else {\n            var output = method[method.length - 1];\n            for (var i = method.length - 2; i >= 0; i--) {\n                output =\n                    mappings.combine +\n                    \"(\" +\n                    method[i] +\n                    \", \" +\n                    output +\n                    \", \" +\n                    mappings.booleanFunction +\n                    \".\" +\n                    operation +\n                    \")\";\n            }\n            return output;\n        }\n    }\n\n    function searchVoxelShapeGroup(elements) {\n        var rGroup;\n        Group.all.forEach((group) => {\n            if (group.name === \"VoxelShapes\") rGroup = group;\n        });\n        return rGroup;\n    }\n\n    function resetFlags() {\n        Blockbench.removeFlag(mappingsKey);\n        Blockbench.removeFlag(Mappings.mojmaps.key);\n        Blockbench.removeFlag(Mappings.mcp.key);\n        Blockbench.removeFlag(Mappings.yarn.key);\n        Blockbench.removeFlag(Mappings.parchment.key);\n        Blockbench.removeFlag(omitVoxelShapesGroup);\n    }\n\n// var helpMenu;\n\nPlugin.register('mod_utils', {\n\ttitle: 'Mod Utils',\n\tauthor: 'JTK222 (Maintainer), Wither (For the original Techne importer), Ocraftyone (VoxelShape improvements)',\n\ticon: 'fa-cubes',\n\tdescription: 'Allows importing Tabula files, and exporting VoxelShapes',\n    tags: [\"Minecraft: Java Edition\"],\n\tversion: '1.7.1',\n\tvariant: 'desktop',\n\n\tonload() {\n\t\tif(isValidVersion){\n\n\t\t\t// helpMenu = new BarMenu('help', []);\n\t\t\t// helpMenu.label.textContent = 'Help';\n\t\t\t// MenuBar.update();\n\t\t\t\n\t\t\tMenuBar.addAction(exportVoxelShapeAction, 'file.export');\n\t\t\tMenuBar.addAction(importTabula2, 'file.import');\n\t\t\tMenuBar.addAction(importTabula, 'file.import');\n\t\t\tMenuBar.addAction(importTechne, 'file.import');\n\t\t\tMenuBar.addAction(modUtilsHelp, 'help');\n\t\t}\n\t},\n\tonunload() {\n\t\tif(isValidVersion){\n\t\t\texportVoxelShapeAction.delete();\n\t\t\timportTabula.delete();\n\t\t\timportTabula2.delete();\n\t\t\timportTechne.delete();\n\t\t\tmodUtilsHelp.delete();\n\n\t\t\t// helpMenu.hide();\n\t\t}\n\t},\n\toninstall(){},\n\tonuninstall() {}\n});\n\n})();"
  },
  {
    "path": "plugins/modded_entity_fabric.js",
    "content": "// code based off the existing modded_entity.js module built into Blockbench for entity code but for Fabric Yarn mappings!\r\n// https://github.com/JannisX11/blockbench/blob/master/js/io/formats/modded_entity.js\r\n(function() {\r\n\r\nconst FABRIC_OPTIONS_DEFAULT = {\r\n\theader: 'package com.example.mod;',\r\n\tentity: 'Entity',\r\n\trender: '',\r\n\tmembers: '',\r\n};\r\nObject.freeze(FABRIC_OPTIONS_DEFAULT);\r\n\r\nfabricOptions = Object.assign({}, FABRIC_OPTIONS_DEFAULT);\r\nlet button;\r\n\r\nconst compileCallback = (e) => {\r\n\tif (Format.id !== \"modded_entity\") return;\r\n\te.model.fabricOptions = fabricOptions;\r\n\t// console.log(`compileCallback model:`, e.model);\r\n};\r\n\r\nconst parseCallback = (e) => {\r\n\t// console.log(`parseCallback:`, e);\r\n\tif (e.model && typeof e.model.fabricOptions === 'object') {\r\n\t\tObject.assign(fabricOptions, e.model.fabricOptions);\r\n\t} else {\r\n\t\tfabricOptions = Object.assign({}, FABRIC_OPTIONS_DEFAULT);\r\n\t}\r\n\tsetTemplate();\r\n};\r\n\r\nfunction setTemplate() {\r\n\tconst { header, entity, render, members } = fabricOptions;\r\n\r\n\tCodecs.modded_entity.templates['Fabric 1.14'] = {\r\n\t\tname: 'Fabric 1.14',\r\n\t\tflip_y: true,\r\n\t\tinteger_size: true,\r\n\t\tfile:\r\n\t\t\t `// Made with Blockbench %(bb_version)\r\n\t\t\t// Exported for Minecraft version 1.14\r\n\t\t\t// Paste this class into your mod and generate all required imports\r\n\r\n\t\t\t${header}\r\n\r\n\t\t\timport net.minecraft.client.model.Box;\r\n\t\t\timport net.minecraft.client.model.ModelPart;\r\n\t\t\timport net.minecraft.client.render.entity.model.EntityModel;\r\n\t\t\timport net.minecraft.entity.Entity;\r\n\r\n\r\n\t\t\tpublic class %(identifier) extends EntityModel {\r\n\t\t\t\t%(fields)\r\n\r\n\t\t\t\tpublic %(identifier)() {\r\n\t\t\t\t\ttextureWidth = %(texture_width);\r\n\t\t\t\t\ttextureHeight = %(texture_height);\r\n\r\n\t\t\t\t\t%(content)\r\n\t\t\t\t}\r\n\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {\r\n\t\t\t\t\t${render}\r\n\t\t\t\t\t%(renderers)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpublic void setRotationAngle(ModelPart bone, float x, float y, float z) {\r\n\t\t\t\t\t\tbone.pitch = x;\r\n\t\t\t\t\t\tbone.yaw = y;\r\n\t\t\t\t\t\tbone.roll = z;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t${members}\r\n\t\t\t}`,\r\n\t\tfield: `private final ModelPart %(bone);`,\r\n\t\tbone:\r\n\t\t\t `%(bone) = new ModelPart(this);\r\n\t\t\t%(bone).setPivot(%(x), %(y), %(z));\r\n\t\t\t?(has_parent)%(parent).addChild(%(bone));\r\n\t\t\t?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz));\r\n\t\t\t%(cubes)`,\r\n\t\trenderer: `%(bone).render(f5);`,\r\n\t\tcube: `%(bone).boxes.add(new Box(%(bone), %(uv_x), %(uv_y), %(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror)));`,\r\n\t};\r\n\tCodecs.modded_entity.templates['Fabric 1.15+'] = { // ID used internally, will show \"Fabric 1.15-1.16\" in blockbench\r\n\t\tname: 'Fabric 1.15-1.16',\r\n\t\tflip_y: true,\r\n\t\tinteger_size: false,\r\n\t\tfile:\r\n\t\t\t `// Made with Blockbench %(bb_version)\r\n\t\t\t\t// Exported for Minecraft version 1.15 - 1.16\r\n\t\t\t\t// Paste this class into your mod and generate all required imports\r\n\r\n\t\t\t\t${header}\r\n\r\n\t\t\t\tpublic class %(identifier) extends EntityModel<${entity}> {\r\n\t\t\t\t\t\t%(fields)\r\n\t\t\t\t\t\tpublic %(identifier)() {\r\n\t\t\t\t\t\t\t\ttextureWidth = %(texture_width);\r\n\t\t\t\t\t\t\t\ttextureHeight = %(texture_height);\r\n\t\t\t\t\t\t\t\t%(content)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@Override\r\n\t\t\t\t\t\tpublic void setAngles(${entity} entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch){\r\n\t\t\t\t\t\t\t\t//previously the render function, render code was moved to a method below\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t@Override\r\n\t\t\t\t\t\tpublic void render(MatrixStack matrixStack, VertexConsumer\tbuffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){\r\n\t\t\t\t\t\t\t\t${render}\r\n\t\t\t\t\t\t\t\t%(renderers)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tpublic void setRotationAngle(ModelPart bone, float x, float y, float z) {\r\n\t\t\t\t\t\t\t\tbone.pitch = x;\r\n\t\t\t\t\t\t\t\tbone.yaw = y;\r\n\t\t\t\t\t\t\t\tbone.roll = z;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t${members}\r\n\t\t\t\t}`,\r\n\t\tfield: `private final ModelPart %(bone);`,\r\n\t\tbone:\r\n\t\t\t `%(bone) = new ModelPart(this);\r\n\t\t\t%(bone).setPivot(%(x), %(y), %(z));\r\n\t\t\t?(has_parent)%(parent).addChild(%(bone));\r\n\t\t\t?(has_rotation)setRotationAngle(%(bone), %(rx), %(ry), %(rz));\r\n\t\t\t%(cubes)`,\r\n\t\trenderer: `%(bone).render(matrixStack, buffer, packedLight, packedOverlay);`,\r\n\t\tcube: `%(bone).setTextureOffset(%(uv_x), %(uv_y)).addCuboid(%(x), %(y), %(z), %(dx), %(dy), %(dz), %(inflate), %(mirror));`,\r\n\t};\r\n\r\n\tCodecs.modded_entity.templates['Fabric 1.17+'] = {\r\n\t\tname: 'Fabric 1.17+',\r\n\t\tflip_y: true,\r\n\t\tinteger_size: false,\r\n\t\tfile:\r\n\t\t\t`// Made with Blockbench %(bb_version)\r\n\t\t\t// Exported for Minecraft version 1.17+ for Yarn\r\n\t\t\t// Paste this class into your mod and generate all required imports\r\n\r\n\t\t\t${header}\r\n   \r\n\t\t\tpublic class %(identifier) extends EntityModel<${entity}> {\r\n\t\t\t\t%(fields)\r\n\t\t\t\tpublic %(identifier)(ModelPart root) {\r\n\t\t\t\t\t%(model_parts)\r\n\t\t\t\t}\r\n\t\t\t\tpublic static TexturedModelData getTexturedModelData() {\r\n\t\t\t\t\tModelData modelData = new ModelData();\r\n\t\t\t\t\tModelPartData modelPartData = modelData.getRoot();\r\n\t\t\t\t\t%(content)\r\n\t\t\t\t\treturn TexturedModelData.of(modelData, %(texture_width), %(texture_height));\r\n\t\t\t\t}\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void setAngles(${entity} entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {\r\n\t\t\t\t}\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) {\r\n\t\t\t\t\t%(renderers)\r\n\t\t\t\t}\r\n\t\t\t}`,\r\n\t\tfield: `private final ModelPart %(bone);`,\r\n\t\tmodel_part: `this.%(bone) = root.getChild(\"%(bone)\");`,\r\n\t\tbone:\r\n\t\t\t`?(has_no_parent)ModelPartData %(bone) = modelPartData.addChild(\"%(bone)\", ModelPartBuilder.create()\r\n\t\t\t?(has_parent)ModelPartData %(bone) = %(parent).addChild(\"%(bone)\", ModelPartBuilder.create()\r\n\t\t\t%(remove_n)%(cubes)\r\n\t\t\t?(has_rotation)%(remove_n), ModelTransform.of(%(x), %(y), %(z), %(rx), %(ry), %(rz)));\r\n\t\t\t?(has_no_rotation)%(remove_n), ModelTransform.pivot(%(x), %(y), %(z)));`,\r\n\t\trenderer: `%(bone).render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha);`,\r\n\t\tcube: `.uv(%(uv_x), %(uv_y)){?(has_mirror).mirrored()}.cuboid(%(x), %(y), %(z), %(dx), %(dy), %(dz), new Dilation(%(inflate))){?(has_mirror).mirrored(false)}`,\r\n\t}\r\n\r\n}\r\n\r\nPlugin.register('modded_entity_fabric', {\r\n\ttitle: 'Fabric Modded Entity',\r\n\ticon: 'icon-format_java',\r\n\tauthor: 'Eliot Lash, SebaSphere',\r\n\tdescription: 'Plugin for exporting Modded Entities using Fabric/Yarn Sourcemap',\r\n    tags: [\"Minecraft: Java Edition\"],\r\n\tmin_version: '3.6.6',\r\n\tversion: '0.4.0',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\t\tCodecs.project.on('compile', compileCallback);\r\n\t\tCodecs.project.on('parse', parseCallback);\r\n\t\tsetTemplate();\r\n\t\t// add a button to show the tips\r\n\t\tbutton = new Action('fabric_info', {\r\n\t\t\tname: 'Fabric Options',\r\n\t\t\tdescription: 'Stuff for Fabric support',\r\n\t\t\ticon: 'info',\r\n\t\t\tcondition: () => Format.id === \"modded_entity\",\r\n\t\t\tclick: function () {\r\n\t\t\t\tvar dialog = new Dialog({\r\n\t\t\t\t\tid: 'project',\r\n\t\t\t\t\ttitle: 'Fabric Options',\r\n\t\t\t\t\twidth: 540,\r\n\t\t\t\t\tlines: [\r\n\t\t\t\t\t\t'<p>These settings allow you to customize the exported java code if desired.<p>',\r\n\t\t\t\t\t\t`<p><b>Be sure to select your Fabric version</b> in project settings first. Fabric format is currently <b>${Project.modded_entity_version.includes(\"Fabric\") ? 'Enabled' : '<span style=\"color:red;\">Disabled</span>'}</b>.</p>`,\r\n\t\t\t\t\t\t'<p>For help animating your models, check out <a href=\"https://github.com/bernie-g/geckolib\">GeckoLib</a> which has native Fabric support.</p>',\r\n\t\t\t\t\t],\r\n\t\t\t\t\tform: {\r\n\t\t\t\t\t\tentity: {label: 'Entity Type', value: fabricOptions.entity},\r\n\t\t\t\t\t\theader: {label: 'Code Header Injection', value: fabricOptions.header},\r\n\t\t\t\t\t\trender: {label: 'Render Code Injection', value: fabricOptions.render},\r\n\t\t\t\t\t\tmembers: {label: 'Code Extra Members Injection', value: fabricOptions.members},\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonConfirm: function(formResult) {\r\n\t\t\t\t\t\tObject.assign(fabricOptions, formResult);\r\n\t\t\t\t\t\tsetTemplate();\r\n\t\t\t\t\t\tdialog.hide()\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\tdialog.show()\r\n\t\t\t}\r\n\t\t});\r\n\t\tMenuBar.addAction(button, 'file.1');\r\n\t},\r\n\tonunload() {\r\n\t\tdelete Codecs.modded_entity.templates['Fabric 1.14'];\r\n\t\tdelete Codecs.modded_entity.templates['Fabric 1.15+']; // 1.15 to 1.16\r\n\t\tdelete Codecs.modded_entity.templates['Fabric 1.17+']; // 1.17 to 1.19 at time of writing\r\n\t\t// remove button when plugin is unloaded\r\n\t\tbutton.delete();\r\n\t\tCodecs.project.events.compile.remove(compileCallback)\r\n\t\tCodecs.project.events.parse.remove(parseCallback)\r\n\t}\r\n});\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/multi-layer.js",
    "content": "(function() {\n    class RenderLayer {\n        constructor(name, title) {\n            this.name = name\n            this.title = title\n        }\n    }\n\n    const NONE = \"None\"\n    const LAYERS = [\n        new RenderLayer(\"solid\", \"Solid\"),\n        new RenderLayer(\"translucent\", \"Translucent\")\n    ]\n\n    var layerGroups = {}\n    var useMultiLayer = false\n\n    Codecs.java_block.on('compile', event => {\n        // if we're not doing a multi-layer export, return\n        if (!useMultiLayer) return;\n        event.model.loader = \"forge:multi-layer\"\n        event.model.layers = {}\n        delete event.model.elements\n        function computeCube(list, s) {\n            if (s.export == false) return;\n            //Create Element\n            var element = {}\n            if ((event.options.cube_name !== false && !settings.minifiedout.value) || event.options.cube_name === true) {\n                if (s.name !== 'cube') {\n                    element.name = s.name\n                }\n            }\n            element.from = s.from.slice();\n            element.to = s.to.slice();\n            if (s.inflate) {\n                for (var i = 0; i < 3; i++) {\n                    element.from[i] -= s.inflate;\n                    element.to[i] += s.inflate;\n                }\n            }\n            if (s.shade === false) {\n                element.shade = false\n            }\n            if (!s.rotation.allEqual(0) || !s.origin.allEqual(8)) {\n                var axis = s.rotationAxis()||'y';\n                element.rotation = new oneLiner({\n                    angle: s.rotation[getAxisNumber(axis)],\n                    axis,\n                    origin: s.origin\n                })\n            }\n            if (s.rescale) {\n                if (element.rotation) {\n                    element.rotation.rescale = true\n                } else {\n                    element.rotation = new oneLiner({\n                        angle: 0,\n                        axis: s.rotation_axis||'y',\n                        origin: s.origin,\n                        rescale: true\n                    })\n                }\n\n            }\n            if (s.rotation.positiveItems() >= 2) {\n                element.rotated = s.rotation\n            }\n            var element_has_texture\n            var e_faces = {}\n            for (var face in s.faces) {\n                if (s.faces.hasOwnProperty(face)) {\n                    if (s.faces[face].texture !== null) {\n                        var tag = new oneLiner()\n                        if (s.faces[face].enabled !== false) {\n                            tag.uv = s.faces[face].uv.slice();\n                            tag.uv.forEach((n, i) => {\n                                tag.uv[i] = n * 16 / UVEditor.getResolution(i%2);\n                            })\n                        }\n                        if (s.faces[face].rotation) {\n                            tag.rotation = s.faces[face].rotation\n                        }\n                        if (s.faces[face].texture) {\n                            var tex = s.faces[face].getTexture()\n                            if (tex) {\n                                tag.texture = '#' + tex.id\n                                // in the future we should dynamically map textures\n                                // to each layer\n                                //textures_used.safePush(tex)\n                            }\n                            element_has_texture = true\n                        }\n                        if (!tag.texture) {\n                            tag.texture = '#missing'\n                        }\n                        if (s.faces[face].cullface) {\n                            tag.cullface = s.faces[face].cullface\n                        }\n                        if (s.faces[face].tint >= 0) {\n                            tag.tintindex = s.faces[face].tint\n                        }\n                        e_faces[face] = tag\n                    }\n                }\n            }\n            //Gather Textures\n            if (!element_has_texture) {\n                element.color = s.color\n            }\n            element.faces = e_faces\n\n            function inVd(n) {\n                return n < -16 || n > 32;\n            }\n            if (inVd(element.from[0]) ||\n            inVd(element.from[1]) ||\n            inVd(element.from[2]) ||\n            inVd(element.to[0]) ||\n            inVd(element.to[1]) ||\n            inVd(element.to[2])\n        ) {\n            overflow_cubes.push(s);\n        }\n        if (Object.keys(element.faces).length) {\n            list.push(element)\n        }\n    }\n\n    function iterate(list, arr) {\n        var i = 0;\n        if (!arr || !arr.length) {\n            return;\n        }\n        for (i = 0; i < arr.length; i++) {\n            if (arr[i].type === 'cube') {\n                computeCube(list, arr[i])\n            } else if (arr[i].type === 'group') {\n                iterate(list, arr[i].children)\n            }\n        }\n    }\n\n    function createModel(layer) {\n        if (!(layer.name in layerGroups)) {\n            return\n        }\n\n        group = null\n        for (var i = 0; i < Outliner.root.length; i++) {\n            if (layerGroups[layer.name] == Outliner.root[i].name) {\n                group = Outliner.root[i]\n                break\n            }\n        }\n        layerElements = []\n        iterate(layerElements, [group])\n        model = {}\n        if ('parent' in event.model) {\n            model.parent = event.model.parent\n        }\n        model.textures = event.model.textures\n        model.elements = layerElements\n        event.model.layers[layer.name] = model\n    }\n\n    LAYERS.forEach(l => createModel(l))\n    useMultiLayer = false\n})\n\nfunction getDialog() {\n    var groups = {};\n    groups[NONE] = \"None\";\n    Outliner.root.forEach(function(s) {\n        if (s instanceof Group) {\n            groups[s.name] = s.name;\n        }\n    });\n    var optionsForm = {};\n    LAYERS.forEach(l => {\n        optionsForm[l.name] = {\n            label: l.title,\n            type: 'select',\n            options: groups\n        }\n    });\n    return new Dialog({\n        id: 'multilayer-dialog',\n        title: 'Multi-Layer JSON Model',\n        form: optionsForm,\n        lines: [\n            '<p>Choose the group to apply to each render layer.</p>'\n        ],\n        onConfirm: function (formData) {\n            this.hide();\n            LAYERS.forEach(l => {\n                if (formData[l.name] !== NONE) {\n                    layerGroups[l.name] = formData[l.name];\n                }\n            });\n            useMultiLayer = true\n            Codecs.java_block.export();\n        }\n    });\n}\n\nPlugin.register('multi-layer', {\n    title: 'Multi-Layer',\n    icon: 'layers',\n    author: 'aidancbrady',\n    description: 'Allows exporting in Forge\\'s multi-layer model format.',\n    tags: [\"Minecraft: Java Edition\"],\n    version: '1.0',\n    variant: 'both',\n    onload() {\n        action = new Action({\n            id: 'export_multilayer',\n            name: 'Export Multi-Layer Model',\n            icon: 'layers',\n            description: 'Exports a model in the Forge multi-layer format.',\n            category: 'file',\n            condition: _ => Format.id === 'java_block',\n            click: () => {\n                layerRenders = {};\n                getDialog().show();\n            }\n        })\n        MenuBar.addAction(action, 'file.export');\n    },\n    onunload() {\n        action.delete()\n    }\n})\n})()\n"
  },
  {
    "path": "plugins/no_java_limits/about.md",
    "content": "Are you tired of slicing your models into pieces just to fit into Minecraft's size limits? This plugin will help you!\n\n## Usage\n\n1. **Create** a model as large as you want - without limits, even thousands of blocks wide\n2. **Export** it as usual\n3. **Import** it into a Display Entity\n4. **Rescale** the entity using the generated command or manually\n\nDone! No more cutting"
  },
  {
    "path": "plugins/no_java_limits/no_java_limits.js",
    "content": "(function () {\n    \"use strict\";\n\n    const PLUGIN_ID = \"no_java_limits\";\n    const OFFSET = 8;\n    const LIMIT_DIST = 24;\n\n    let suppressDialog = false;\n    let scaleUpAction, scaleDownAction;\n\n    let originalCoordinateLimits = null;\n    let originalLimiterTest = null;\n    let originalLimiterMove = null;\n    let originalLimiterClamp = null;\n\n    function applyLargeLimits() {\n        const codec = Codecs[\"java_block\"];\n        if (codec && codec.format && codec.format.cube_size_limiter) {\n            const limiter = codec.format.cube_size_limiter;\n\n            originalCoordinateLimits = limiter.coordinate_limits;\n            originalLimiterTest = limiter.test;\n            originalLimiterMove = limiter.move;\n            originalLimiterClamp = limiter.clamp;\n\n            limiter.coordinate_limits = [-Infinity, Infinity];\n            limiter.test = () => false;\n            limiter.move = () => { };\n            limiter.clamp = () => { };\n        }\n    }\n\n    function restoreOriginalLimits() {\n        const codec = Codecs[\"java_block\"];\n        if (codec && codec.format && codec.format.cube_size_limiter) {\n            const limiter = codec.format.cube_size_limiter;\n\n            if (originalCoordinateLimits)\n                limiter.coordinate_limits = originalCoordinateLimits;\n            if (originalLimiterTest) limiter.test = originalLimiterTest;\n            if (originalLimiterMove) limiter.move = originalLimiterMove;\n            if (originalLimiterClamp) limiter.clamp = originalLimiterClamp;\n        }\n    }\n\n    function showExportDialog(scale) {\n        if (suppressDialog) return;\n\n        const command = `/data modify entity @e[limit=1,sort=nearest,type=minecraft:item_display] transformation.scale set value [${scale}f,${scale}f,${scale}f]`;\n\n        let dialogForm = {\n            info: {\n                type: \"info\",\n                text: `<h3>Your model was scaled down by a factor of <strong>${scale}x</strong>.</h3>\\nTo restore its size in-game, stand close to the item_display and run the following command:`,\n            },\n            command: {\n                type: \"textarea\",\n                value: `${command}`,\n                readonly: true,\n                height: 82,\n            },\n            dontShow: {\n                type: \"checkbox\",\n                label: \"Do not show again for this session\",\n                value: false,\n            },\n        };\n\n        if (settings.dialog_larger_cubes && settings.dialog_larger_cubes.value) {\n            dialogForm.limitDialog = {\n                type: \"info\",\n                text: `<hr>Also, it looks like you have the \"Model Too Large\" dialog enabled. You may want to disable it in Settings > Dialogs.`,\n            };\n        }\n\n        new Dialog(\"no_java_limits_popup\", {\n            id: \"no_java_limits_popup\",\n            title: \"NoJavaLimits: Scale Applied\",\n            form: dialogForm,\n            onConfirm: function (formData) {\n                if (formData.dontShow) {\n                    suppressDialog = true;\n                }\n                this.hide();\n            },\n        }).show();\n    }\n\n    function scaleModel(factor) {\n        if (!Project || !Format || Format.id !== \"java_block\") {\n            Blockbench.showStatusMessage(\n                \"This tool only works on Java Block/Item models.\",\n                2000,\n            );\n            return;\n        }\n\n        Undo.initEdit({\n            elements: Cube.all,\n            outliner: Group.all,\n            project: Project,\n        });\n\n        const scaleWithOffset = (value, f) =>\n            Math.round(((value - OFFSET) * f + OFFSET) * 1e8) / 1e8;\n\n        Cube.all.forEach((cube) => {\n            cube.from = cube.from.map((v) => scaleWithOffset(v, factor));\n            cube.to = cube.to.map((v) => scaleWithOffset(v, factor));\n            cube.origin = cube.origin.map((v) => scaleWithOffset(v, factor));\n            if (cube.inflate !== undefined) {\n                cube.inflate = Math.round(cube.inflate * factor * 1e8) / 1e8;\n            }\n        });\n\n        Group.all.forEach((group) => {\n            group.origin = group.origin.map((v) => scaleWithOffset(v, factor));\n        });\n\n        Canvas.updateAll();\n        Undo.finishEdit(`Scale model by ${factor}x`);\n        Blockbench.showStatusMessage(`Scaled model by ${factor}x`, 2000);\n    }\n\n    function createActions() {\n        scaleUpAction = new Action(\"no_java_limits_scale_up\", {\n            name: \"Scale Model ×2\",\n            icon: \"zoom_in\",\n            category: \"transform\",\n            condition: () => Format && Format.id === \"java_block\",\n            click: () => scaleModel(2),\n        });\n\n        scaleDownAction = new Action(\"no_java_limits_scale_down\", {\n            name: \"Scale Model ×0.5\",\n            icon: \"zoom_out\",\n            category: \"transform\",\n            condition: () => Format && Format.id === \"java_block\",\n            click: () => scaleModel(0.5),\n        });\n\n        if (MenuBar.menus.transform) {\n            MenuBar.menus.transform.addAction(scaleUpAction);\n            MenuBar.menus.transform.addAction(scaleDownAction);\n        } else {\n            MenuBar.addAction(scaleUpAction, \"tools\");\n            MenuBar.addAction(scaleDownAction, \"tools\");\n        }\n    }\n\n    function removeActions() {\n        if (scaleUpAction) scaleUpAction.delete();\n        if (scaleDownAction) scaleDownAction.delete();\n    }\n\n    let originalCompile = null;\n    let originalParse = null;\n\n    function hookExport() {\n        const codec = Codecs[\"java_block\"];\n        if (!codec || originalCompile) return;\n\n        // Import\n        originalParse = codec.parse.bind(codec);\n        codec.parse = function (data, path) {\n            let json;\n            let isString = typeof data === \"string\";\n\n            if (isString) {\n                try {\n                    json = JSON.parse(data);\n                } catch (e) {\n                    return originalParse(data, path);\n                }\n            } else {\n                json = data;\n            }\n\n            if (json && json.no_java_limits_scale) {\n                const scale = json.no_java_limits_scale;\n\n                if (Array.isArray(json.elements)) {\n                    for (const el of json.elements) {\n                        const sc = (v) =>\n                            Math.round((v - OFFSET) * scale * 1e8) / 1e8 + OFFSET;\n\n                        if (Array.isArray(el.from)) el.from = el.from.map(sc);\n                        if (Array.isArray(el.to)) el.to = el.to.map(sc);\n                        if (el.rotation && Array.isArray(el.rotation.origin)) {\n                            el.rotation.origin = el.rotation.origin.map(sc);\n                        }\n                        if (el.inflate) {\n                            el.inflate = Math.round(el.inflate * scale * 1e8) / 1e8;\n                        }\n                    }\n                }\n\n                delete json.no_java_limits_scale;\n\n                if (isString) {\n                    data = JSON.stringify(json);\n                }\n            }\n\n            return originalParse(data, path);\n        };\n\n        // Export\n        originalCompile = codec.compile.bind(codec);\n        codec.compile = function (options) {\n            const result = originalCompile(options);\n\n            let json, wasString;\n            if (typeof result === \"string\") {\n                try {\n                    json = JSON.parse(result);\n                    wasString = true;\n                } catch (e) {\n                    return result;\n                }\n            } else {\n                json = result;\n                wasString = false;\n            }\n\n            if (json && Array.isArray(json.elements)) {\n                let maxDist = 0;\n\n                for (const el of json.elements) {\n                    const inflate = el.inflate || 0;\n\n                    if (Array.isArray(el.from)) {\n                        el.from.forEach(\n                            (v) =>\n                                (maxDist = Math.max(maxDist, Math.abs(v - inflate - OFFSET))),\n                        );\n                    }\n                    if (Array.isArray(el.to)) {\n                        el.to.forEach(\n                            (v) =>\n                                (maxDist = Math.max(maxDist, Math.abs(v + inflate - OFFSET))),\n                        );\n                    }\n                    if (el.rotation && Array.isArray(el.rotation.origin)) {\n                        el.rotation.origin.forEach(\n                            (v) => (maxDist = Math.max(maxDist, Math.abs(v - OFFSET))),\n                        );\n                    }\n                }\n\n                let power = 0;\n                while (maxDist / Math.pow(2, power) > LIMIT_DIST + 0.0001) {\n                    power++;\n                }\n\n                if (power > 0) {\n                    const scaleFactor = Math.pow(2, -power);\n                    const inverseScale = Math.pow(2, power);\n\n                    for (const el of json.elements) {\n                        const sc = (v) =>\n                            Math.round((v - OFFSET) * scaleFactor * 1e8) / 1e8 + OFFSET;\n\n                        if (Array.isArray(el.from)) el.from = el.from.map(sc);\n                        if (Array.isArray(el.to)) el.to = el.to.map(sc);\n                        if (el.rotation && Array.isArray(el.rotation.origin)) {\n                            el.rotation.origin = el.rotation.origin.map(sc);\n                        }\n                        if (el.inflate) {\n                            el.inflate = Math.round(el.inflate * scaleFactor * 1e8) / 1e8;\n                        }\n                    }\n\n                    let reorderedJson = {};\n                    let scaleInjected = false;\n\n                    for (let key in json) {\n                        reorderedJson[key] = json[key];\n                        if (key === \"credit\") {\n                            reorderedJson.no_java_limits_scale = inverseScale;\n                            scaleInjected = true;\n                        }\n                    }\n                    if (!scaleInjected) {\n                        reorderedJson.no_java_limits_scale = inverseScale;\n                    }\n\n                    json = reorderedJson;\n\n                    showExportDialog(inverseScale);\n                }\n            }\n\n            return wasString ? JSON.stringify(json, null, \"\\t\") : json;\n        };\n    }\n\n    function unhookExport() {\n        const codec = Codecs[\"java_block\"];\n        if (codec && originalCompile) {\n            codec.compile = originalCompile;\n            originalCompile = null;\n        }\n        if (codec && originalParse) {\n            codec.parse = originalParse;\n            originalParse = null;\n        }\n    }\n\n    BBPlugin.register(PLUGIN_ID, {\n\t\ttitle: \"No Java Limits\",\n\t\tauthor: \"Rajdacz\",\n\t\tdescription:\n\t\t\t\"Allows creating infinite-sized models for use in display entities.\",\n\t\ticon: \"zoom_out_map\",\n\t\ttags: [\"Minecraft: Java Edition\", \"Display Entities\"],\n\t\tversion: \"1.0.0\",\n\t\tmin_version: \"4.8.0\",\n\t\tvariant: \"both\",\n\t\tonload() {\n\t\t\thookExport();\n\t\t\tapplyLargeLimits();\n\t\t\tcreateActions();\n\t\t\tsuppressDialog = false;\n\t\t},\n\t\tonunload() {\n\t\t\tunhookExport();\n\t\t\tremoveActions();\n\t\t\trestoreOriginalLimits();\n\t\t},\n\t});\n})();\n"
  },
  {
    "path": "plugins/obj_animation_export.js",
    "content": "(function() {\n\n\tlet export_action;\n\t\n\tBBPlugin.register('obj_animation_export', {\n\t\ttitle: 'OBJ Animation Exporter',\n\t\ticon: 'icon-objects',\n\t\tauthor: 'JannisX11',\n\t\tdescription: 'Exports an animation to OBJ as an OBJ file sequence',\n\t\tabout: 'To export, right click an animation and click Export OBJ Sequence.',\n\t\ttags: ['Exporter'],\n\t\tversion: '0.1.0',\n\t\tmin_version: '4.0.0',\n\t\tvariant: 'both',\n\t\tonload() {\n\t\t\t\n\t\t\texport_action = new Action('export_obj_sequence', {\n\t\t\t\tname: 'Export OBJ Sequence',\n\t\t\t\tdescription: 'Export animation as OBJ sequence',\n\t\t\t\ticon: 'icon-objects',\n\t\t\t\tcategory: 'animation',\n\t\t\t\tcondition: () => Modes.animate && Animation.selected,\n\t\t\t\tclick() {\n\t\t\t\t\tnew Dialog({\n\t\t\t\t\t\tid: 'export_obj_sequence',\n\t\t\t\t\t\ttitle: 'Export OBJ Sequence',\n\t\t\t\t\t\tform: {\n\t\t\t\t\t\t\tlength: {label: 'Length', type: 'number', value: Animation.selected.length, min: 0, max: 10000},\n\t\t\t\t\t\t\tfps: {label: 'FPS', type: 'number', value: Animation.selected.snapping, min: 1, max: 1000},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonConfirm({length, fps}) {\n\t\t\t\t\t\t\tlet archive = new JSZip();\n\t\t\t\t\t\t\tlet name = (Project.name||'model');\n\t\t\t\t\t\t\tlet num_length = Math.round(length * fps).toString().length;\n\n\t\t\t\t\t\t\tTimeline.setTime(0);\n\t\t\t\t\t\t\tfor (let frame = 0; frame <= length * fps; frame++) {\n\t\t\t\t\t\t\t\tTimeline.setTime(frame / fps);\n\t\t\t\t\t\t\t\tAnimator.preview();\n\t\t\t\t\t\t\t\tlet obj = Codecs.obj.compile();\n\t\t\t\t\t\t\t\tarchive.file(`${name}_${frame.toDigitString(num_length)}.obj`, obj);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tlet all_files = Codecs.obj.compile({all_files: true});\n\n\t\t\t\t\t\t\tarchive.file('materials.mtl', all_files.mtl)\n\t\t\t\t\n\t\t\t\t\t\t\tfor (let key in all_files.images) {\n\t\t\t\t\t\t\t\tlet texture = all_files.images[key]\n\t\t\t\t\t\t\t\tif (texture && !texture.error) {\n\t\t\t\t\t\t\t\t\tarchive.file(pathToName(texture.name) + '.png', texture.getBase64(), {base64: true});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tarchive.generateAsync({type: 'blob'}).then(content => {\n\t\t\t\t\t\t\t\tBlockbench.export({\n\t\t\t\t\t\t\t\t\tresource_id: 'obj',\n\t\t\t\t\t\t\t\t\ttype: 'Zip Archive',\n\t\t\t\t\t\t\t\t\textensions: ['zip'],\n\t\t\t\t\t\t\t\t\tname: 'animation',\n\t\t\t\t\t\t\t\t\tcontent: content,\n\t\t\t\t\t\t\t\t\tsavetype: 'zip'\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}).show();\n\t\t\t\t}\n\t\t\t})\n\t\n\t\t\tAnimation.prototype.menu.addAction(export_action, '-1');\n\t\t},\n\t\tonunload() {\n\t\t\texport_action.delete();\n\t\t}\n\t});\n})()\n"
  },
  {
    "path": "plugins/oc_3dm_model.js",
    "content": "// author: LucunJi\r\n// 2020-07-06 00:03:44\r\n//\r\n// this plugin allows you to export a block to use in OpenComputer mod\r\n// the format of exported .3dm files follows instructions here: https://github.com/OpenPrograms/Sangar-Programs/blob/master/models/example.3dm\r\n// you need print3d.lua (https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua) and a 3D printer in addition\r\n//\r\n// thanks to Gamepiaynmo's cpm_plugin(https://github.com/Gamepiaynmo/CustomModel/blob/master/plugin/cpm_model.js), I learned a lot from his code\r\n\r\n(function() {\r\n\tlet export_action;\r\n\tlet options = {};\r\n\r\n\tPlugin.register('oc_3dm_model', {\r\n\t\ttitle: 'OC 3dm Model Format',\r\n\t\ticon: 'computer',\r\n\t\tauthor: 'Lucun_Ji',\r\n\t\tdescription: 'Export models of OpenComputer mod in .3dm format.',\r\n\t\tversion: '0.1.0',\r\n\t\tvariant: 'desktop',\r\n\r\n\t\tonload() {\r\n\t\t\tlet codec = new Codec('oc_3dm_model', {\r\n\t\t\t\tname: 'OC .3dm Model',\r\n\t\t\t\textension: '3dm',\r\n\t\t\t\tremember: false,\r\n\r\n\t\t\t\tcompile() {\r\n\t\t\t\t\tfunction convertCube(cube) {\r\n\t\t\t\t\t\tlet str = '    {';\r\n\t\t\t\t\t\tcube.from.forEach(i => {\r\n\t\t\t\t\t\t\tstr += i + ', ';\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tcube.to.forEach(i => {\r\n\t\t\t\t\t\t\tstr += i + ', ';\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tstr += 'texture = \"';\r\n\t\t\t\t\t\tfor (let i = 0; i < textures.length; i++) {\r\n\t\t\t\t\t\t\tif (textures[i].uuid == cube.faces.north.texture) {\r\n\t\t\t\t\t\t\t\tstr += textures[i].name.replace(/\\.[^/.]+$/, \"\");\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tstr += '\"';\r\n\r\n\t\t\t\t\t\tstr += '}'\r\n\t\t\t\t\t\treturn str;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction handleObj(obj) {\r\n\t\t\t\t\t\tlet arr = [];\r\n\t\t\t\t\t\tif (obj instanceof Cube) {\r\n\t\t\t\t\t\t\tarr.push('    -- ' + obj.name + '\\n');\r\n\t\t\t\t\t\t\tarr.push(convertCube(obj) + ',\\n');\r\n\t\t\t\t\t\t} else if (obj instanceof Group) {\r\n\t\t\t\t\t\t\tarr.push('\\n');\r\n\t\t\t\t\t\t\tarr.push('    -- ' + obj.name + '\\n');\r\n\t\t\t\t\t\t\tfor (let child of obj.children) {\r\n\t\t\t\t\t\t\t\thandleObj(child).forEach(i => arr.push('  ' + i));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn arr;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet model = '-- generated by Blockbench, with OpenComputer .3dm Model plugin\\n';\r\n\t\t\t\t\tmodel += '{\\n';\r\n\t\t\t\t\tmodel += '  label = \"' + options.label + '\",\\n';\r\n\t\t\t\t\tmodel += '  lightLevel = ' + options.lightLevel + ',\\n';\r\n\t\t\t\t\tmodel += '  emitRedstone = ' + options.emitRedstone + ',\\n';\r\n\t\t\t\t\tmodel += '  buttonMode = ' + options.buttonMode + ',\\n';\r\n\t\t\t\t\tmodel += '  collidable = {' + options.collidableInactive + ', ' + options.collidableActive + '},\\n';\r\n\t\t\t\t\tmodel += '\\n';\r\n\t\t\t\t\tmodel += '  shapes = {\\n';\r\n\r\n\t\t\t\t\tOutliner.root.forEach(obj => {\r\n\t\t\t\t\t\thandleObj(obj).forEach(i => model += i);\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tmodel += '  }\\n';\r\n\t\t\t\t\tmodel += '}'\r\n\r\n\t\t\t\t\treturn model;\r\n\t\t\t\t},\r\n\t\t\t\tparse(model, path) {\r\n\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\texport_action = new Action('export_oc_3dm_model', {\r\n\t\t\t\tname: 'Export OC .3dm model',\r\n\t\t\t\tdescription: '',\r\n\t\t\t\ticon: 'computer',\r\n\t\t\t\tcategory: 'file',\r\n\t\t\t\tclick() {\r\n\t\t\t\t\tlet dialog = new Dialog({\r\n\t\t\t\t\t\ttitle: 'OC .3dm Model Export',\r\n\t\t\t\t\t\tid: 'oc_3dm_export',\r\n\t\t\t\t\t\tlines: [\r\n\t\t\t\t\t\t\t'<p>Block Name: <input type=\"text\" id=\"label\" value=\"\" style=\"background-color:var(--color-back)\"></p>',\r\n\t\t\t\t\t\t\t'<p>Light Level(0~8): <input type=\"number\" id=\"lightLevel\" value=0 style=\"background-color:var(--color-back)\"></p>',\r\n\t\t\t\t\t\t\t'<p>Redstone Signal Level(0~15): <input type=\"number\" id=\"emitRedstone\" value=0 style=\"background-color:var(--color-back)\"></p>',\r\n\t\t\t\t\t\t\t'<p>Button Mode: <input type=\"checkbox\" checked=false id=\"buttonMode\"></p>',\r\n\t\t\t\t\t\t\t'<p>Collidable(inactive): <input type=\"checkbox\" checked=true id=\"collidableInactive\"></p>',\r\n\t\t\t\t\t\t\t'<p>Collidable(active): <input type=\"checkbox\" checked=true id=\"collidableActive\"></p>',\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tdraggable: true,\r\n\t\t\t\t\t\tonConfirm() {\r\n\t\t\t\t\t\t\tdialog.hide();\r\n\t\t\t\t\t\t\toptions.label = $('.dialog#oc_3dm_export input#label').val();\r\n\t\t\t\t\t\t\toptions.lightLevel = parseInt($('.dialog#oc_3dm_export input#lightLevel').val());\r\n\t\t\t\t\t\t\toptions.emitRedstone = parseInt($('.dialog#oc_3dm_export input#emitRedstone').val());\r\n\t\t\t\t\t\t\toptions.buttonMode = $('.dialog#oc_3dm_export input#buttonMode').is(':checked');\r\n\t\t\t\t\t\t\toptions.collidableInactive = $('.dialog#oc_3dm_export input#collidableInactive').is(':checked');\r\n\t\t\t\t\t\t\toptions.collidableActive = $('.dialog#oc_3dm_export input#collidableActive').is(':checked');\r\n\t\t\t\t\t\t\tcodec.export();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tdialog.show();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tMenuBar.addAction(export_action, 'file.export')\r\n\t\t},\r\n\r\n\t\tonunload() {\r\n\t\t\texport_action.delete();\r\n\t\t}\r\n\t});\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/optifine_player_models/about.md",
    "content": "This plugin adds a new format that allows you to make you own custom OptiFine player models.\n\n## Setup\n1. Open your launcher and go to the **Installations** tab.\n2. Find your installation, click the triple dot, and slect **Edit**.\\\n3. Select **More Options**.\n4. Inside the **JVM ARGUMENTS** field, add:\n`-Dplayer.models.local=true -Dplayer.models.reload=true`\nNote:\\t**player.models.reload** reloads the model every 5 seconds in game, and can be disabled after you finish making the model.\n5. Make a folder named <code>playermodels</code> inside your **.minecraft** folder.\n6. Inside that folder, make 2 more folders named <code>items</code> and <code>users</code>.\n\n## Usage\n- You need a config file for every player with a player model. This config file must be the players username, and needs to go in the **users** folder.\n**Example**: `.minecraft/playermodels/users/ewanhowell5195.cfg`\n- You can create a user config by going to **File > Export > Create OptiFine Player Model Config**.\n- Exported player models should go in a folder named what the player model is, inside the **items** folder, and be named `model.cfg`.\n**Example**: `.minecraft/playermodels/items/horns/model.cfg`\n- If not using **Use Player Texture**, textures must go inside a folder named `users` located next to the model file, and be named the players username.\n**Example**: `.minecraft/playermodels/items/horns/users/ewanhowell5195.png`\n\n## Limitations\n- They are client side only.\n- They are not part of resource packs.\n- They require OptiFine, and JVM args set in the launcher.\n- Animations are not supported.\n- You can only target specific players, not all players.\n\n## Important\nEnabling the player model JVM arguments **will disable any online player models**, usually being seasonal cosmetics like the Santa and Witch hats."
  },
  {
    "path": "plugins/optifine_player_models/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2022-05-29\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2022-06-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Restructured plugin internals\"\n        ]\n      }\n    ]\n  },\n  \"1.1.1\": {\n    \"title\": \"1.1.1\",\n    \"date\": \"2022-06-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed missing \\\"playermodels\\\" folder in plugin about\",\n          \"Fixed the format failing to load if the file path for a skin was not found\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2022-10-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added format page on the start screen\"\n        ]\n      }\n    ]\n  },\n  \"1.3.0\": {\n    \"title\": \"1.3.0\",\n    \"date\": \"2022-10-27\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added credit support\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the start screen format page page trying to load the wrong format\"\n        ]\n      }\n    ]\n  },\n  \"1.3.1\": {\n    \"title\": \"1.3.1\",\n    \"date\": \"2022-11-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed credit not saving to the model\"\n        ]\n      }\n    ]\n  },\n  \"1.3.2\": {\n    \"title\": \"1.3.2\",\n    \"date\": \"2023-02-08\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the \\\"Use Player Texture\\\" option not working\"\n        ]\n      }\n    ]\n  },\n  \"1.4.0\": {\n    \"title\": \"1.4.0\",\n    \"date\": \"2025-01-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 4.12\"\n        ]\n      }\n    ]\n  },\n  \"1.5.0\": {\n    \"title\": \"1.5.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      },\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Updated to new repository format\"\n        ]\n      }\n    ]\n  },\n  \"1.5.1\": {\n    \"title\": \"1.5.1\",\n    \"date\": \"2025-10-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"The format page \\\"Show Information\\\" button will now show the plugin page instead of a unique dialog\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed player configs failing to be created\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/optifine_player_models/optifine_player_models.js",
    "content": "(async function () {\n  let fs, format, codec, action, config, property, setResolution, textureAdd, model, styles\n  const id = \"optifine_player_models\"\n  const name = \"OptiFine Player Models\"\n  const icon = \"icon-player\"\n  const description = \"Adds a new format that allows you to create OptiFine player models.\"\n  const links = {\n    website: {\n      text: \"By Ewan Howell\",\n      link: \"https://ewanhowell.com/\",\n      icon: \"language\",\n      colour: \"#33E38E\"\n    },\n    discord: {\n      text: \"Discord Server\",\n      link: \"https://discord.ewanhowell.com/\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    },\n    tutorial: {\n      text: \"Player Model Tutorial\",\n      link: \"https://youtu.be/0rT-q95dpV0\",\n      icon: \"fab.fa-youtube\",\n      colour: \"#FF4444\"\n    }\n  }\n  const groups = [\n    {\n      name: \"head\",\n      origin: [0, 24, 0]\n    },\n    {\n      name: \"body\",\n      origin: [0, 24, 0]\n    },\n    {\n      name: \"leftArm\",\n      origin: [-5, 22, 0]\n    },\n    {\n      name: \"rightArm\",\n      origin: [5, 22, 0]\n    },\n    {\n      name: \"leftLeg\",\n      origin: [-1.95, 12, 0]\n    },\n    {\n      name: \"rightLeg\",\n      origin: [1.95, 12, 0]\n    }\n  ]\n  const groupNames = groups.map(e => e.name)\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author: \"Ewan Howell\",\n    description,\n    tags: [\"Minecraft: Java Edition\", \"OptiFine\", \"Player Models\"],\n    version: \"1.5.1\",\n    min_version: \"5.0.0\",\n    variant: \"both\",\n    await_loading: true,\n    creation_date: \"2022-05-29\",\n    contributes: {\n      formats: [\"optifine_player_model\"]\n    },\n    website: \"https://ewanhowell.com/plugins/optifine-player-models/\",\n    repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/optifine_player_models\",\n    bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[OptiFine Player Models]\",\n    has_changelog: true,\n    async onload() {\n      fs = require(\"fs\", {\n        message: \"This permission is required for exporting your model\",\n        optional: false\n      })\n\n      if (!fs) {\n        throw new Error(\"fs access denied\")\n      }\n\n      addStyles()\n      codec = new Codec(\"optifine_player_model_codec\", {\n        name: \"OptiFine Player Model\",\n        extension: \"cfg\",\n        remember: true,\n        load_filter: {\n          type: \"json\",\n          extensions: [\"cfg\"],\n          condition: file => file && file.models != undefined\n        },\n        compile() {\n          const entityModel = {\n            type: \"PlayerItem\",\n            credit: Project.credit || settings.credit.value\n          }\n          if (Project.use_player_texture) entityModel.usePlayerTexture = true\n          entityModel.textureSize = [Project.texture_width, Project.texture_height]\n          entityModel.models = []\n          Outliner.root.forEach(g => {\n            if (g instanceof Group == false || !groupNames.includes(g.name)) return\n            if (!settings.export_empty_groups.value && !g.children.find(child => child.export)) return\n\n            if (!g.children.length) return\n\n            //Bone\n            const bone = {\n              type: \"ModelBox\",\n              attachTo: g.name,\n              invertAxis: \"xy\",\n              mirrorTexture: undefined,\n              translate: g.origin.slice().V3_multiply(-1)\n            }\n\n            if (!g.rotation.allEqual(0)) bone.rotate = g.rotation.slice()\n            if (g.mirror_uv) bone.mirrorTexture = \"u\"\n\n            function populate(p_model, group, depth) {\n              if (group.children.length === 0) return\n              let mirror_sub\n\n              let child_cubes = group.children.filter(obj => obj.export && obj.type === 'cube')\n              let has_different_mirrored_children = !!child_cubes.find(obj => obj.mirror_uv !== child_cubes[0].mirror_uv)\n\n              group.children.forEach(obj => {\n                if (!obj.export) return\n                if (obj.type === \"cube\") {\n\n                  let box\n                  if (Project.box_uv) {\n                    box = new oneLiner()\n                  } else {\n                    box = {}\n                  }\n                  const c_size = obj.size()\n                  box.coordinates = [\n                    obj.from[0],\n                    obj.from[1],\n                    obj.from[2],\n                    c_size[0],\n                    c_size[1],\n                    c_size[2]\n                  ]\n                  if (depth === 0) {\n                    box.coordinates[0] += p_model.translate[0]\n                    box.coordinates[1] += p_model.translate[1]\n                    box.coordinates[2] += p_model.translate[2]\n                  } else {\n                    box.coordinates[0] -= p_model.translate[0]\n                    box.coordinates[1] -= p_model.translate[1]\n                    box.coordinates[2] -= p_model.translate[2]\n                  }\n                  if (Project.box_uv) {\n                    box.textureOffset = obj.uv_offset\n                  } else {\n                    for (const face in obj.faces) {\n                      if (obj.faces[face].texture !== null) {\n                        box[`uv${capitalizeFirstLetter(face)}`] = obj.faces[face].uv\n                      }\n                    }\n                  }\n\n                  if (obj.inflate && typeof obj.inflate === \"number\") {\n                    box.sizeAdd = obj.inflate\n                  }\n\n                  if (obj.mirror_uv !== group.mirror_uv && has_different_mirrored_children) {\n                    if (!mirror_sub) {\n                      mirror_sub = { \n                        invertAxis: \"xy\",\n                        mirrorTexture: \"u\",\n                        boxes: []\n                      }\n                      if (!p_model.submodels) p_model.submodels = []\n                      p_model.submodels.splice(0, 0, mirror_sub)\n                    }\n                    mirror_sub.boxes.push(box)\n                  } else {\n                    if (!p_model.boxes) p_model.boxes = []\n                    if (obj.mirror_uv !== group.mirror_uv) p_model.mirrorTexture = obj.mirror_uv ? \"u\" : undefined\n                    p_model.boxes.push(box)\n                  }\n                } else if (obj.type === \"group\") {\n\n                  const bone = {\n                    id: obj.name,\n                    invertAxis: \"xy\",\n                    mirrorTexture: undefined,\n                    translate: obj.origin.slice()\n                  }\n                  if (obj.mirror_uv) {\n                    bone.mirrorTexture = \"u\"\n                  }\n                  if (!obj.rotation.allEqual(0)) {\n                    bone.rotate = obj.rotation.slice()\n                  }\n                  populate(bone, obj, depth+1)\n                  if (depth === 0) {\n                    bone.translate[0] += p_model.translate[0]\n                    bone.translate[1] += p_model.translate[1]\n                    bone.translate[2] += p_model.translate[2]\n                  } else {\n                    bone.translate[0] -= group.origin[0]\n                    bone.translate[1] -= group.origin[1]\n                    bone.translate[2] -= group.origin[2]\n                  }\n\n                  if (!p_model.submodels) p_model.submodels = []\n                  p_model.submodels.push(bone)\n                } \n              })\n            }\n            populate(bone, g, 0)\n\n            bone.translate[2] = 0 - bone.translate[2]\n\n            switch (g.name) {\n              case \"head\":\n              case \"body\":\n                bone.translate[0] = 0 - bone.translate[0]\n                bone.translate[1] = -24 - bone.translate[1]\n                break\n              case \"leftArm\":\n                bone.translate[0] = 5 - bone.translate[0]\n                bone.translate[1] = -22 - bone.translate[1]\n                break\n              case \"rightArm\":\n                bone.translate[0] = -5 - bone.translate[0]\n                bone.translate[1] = -22 - bone.translate[1]\n                break\n              case \"leftLeg\":\n                bone.translate[0] = 2 - bone.translate[0]\n                bone.translate[1] = -12 - bone.translate[1]\n                break\n              case \"rightLeg\":\n                bone.translate[0] = -2 - bone.translate[0]\n                bone.translate[1] = -12 - bone.translate[1]\n                break\n            }\n\n            entityModel.models.push(bone)\n          })\n\n          this.dispatchEvent(\"compile\", {entityModel})\n\n          return autoStringify(entityModel)\n        },\n        parse(model, path) {\n          this.dispatchEvent(\"parse\", {model})\n          if (typeof model.credit === \"string\") Project.credit = model.credit\n          if (model.textureSize) {\n            Project.texture_width = parseInt(model.textureSize[0]) || 64\n            Project.texture_height = parseInt(model.textureSize[1]) || 64\n          }\n          if (model.usePlayerTexture) Project.use_player_texture = true\n          let empty_face = {uv: [0, 0, 0, 0], texture: null}\n          if (model.models) {\n            model.models.forEach(b => {\n              if (typeof b !== \"object\" || !b.attachTo || !groupNames.includes(b.attachTo)) return\n              let subcount = 0\n\n              //Bone\n              const group = new Group({\n                name: b.attachTo,\n                origin: [b.translate[0] ?? 0, b.translate[1] ?? 0, b.translate[2] ?? 0],\n                rotation: b.rotate,\n                mirror_uv: (b.mirrorTexture && b.mirrorTexture.includes(\"u\"))\n              })\n              group.origin.V3_multiply(-1)\n\n              group.origin[2] = 0 - group.origin[2]\n\n              switch (b.attachTo) {\n                case \"head\":\n                case \"body\":\n                  group.origin[0] = 0 - group.origin[0]\n                  group.origin[1] = 24 - group.origin[1]\n                  break\n                case \"leftArm\":\n                  group.origin[0] = -5 - group.origin[0]\n                  group.origin[1] = 22 - group.origin[1]\n                  break\n                case \"rightArm\":\n                  group.origin[0] = 5 - group.origin[0]\n                  group.origin[1] = 22 - group.origin[1]\n                  break\n                case \"leftLeg\":\n                  group.origin[0] = -2 - group.origin[0]\n                  group.origin[1] = 12 - group.origin[1]\n                  break\n                case \"rightLeg\":\n                  group.origin[0] = 2 - group.origin[0]\n                  group.origin[1] = 12 - group.origin[1]\n                  break\n              }\n\n              function readContent(submodel, p_group, depth) {\n\n                if (submodel.boxes && submodel.boxes.length) {\n                  submodel.boxes.forEach(box => {\n\n                    const base_cube = new Cube({\n                      name: box.name || p_group.name,\n                      autouv: 0,\n                      uv_offset: box.textureOffset,\n                      inflate: box.sizeAdd,\n                      mirror_uv: p_group.mirror_uv\n                    })\n                    if (box.coordinates) {\n                      if (depth === 0) {\n                        box.coordinates[0] += p_group.origin[0]\n                        box.coordinates[1] += p_group.origin[1]\n                        box.coordinates[2] += p_group.origin[2]\n                      }\n                      base_cube.extend({\n                        from: [\n                          box.coordinates[0],\n                          box.coordinates[1],\n                          box.coordinates[2]\n                        ],\n                        to: [\n                          box.coordinates[0] + box.coordinates[3],\n                          box.coordinates[1] + box.coordinates[4],\n                          box.coordinates[2] + box.coordinates[5]\n                        ]\n                      })\n                    }\n                    if (!box.textureOffset && (\n                        box.uvNorth\n                       || box.uvEast\n                       || box.uvSouth\n                       || box.uvWest\n                       || box.uvUp\n                       || box.uvDown\n                    )) {\n                      Project.box_uv = false\n                      base_cube.extend({faces: {\n                        north: box.uvNorth ? {uv: box.uvNorth} : empty_face,\n                        east:  box.uvEast  ? {uv: box.uvEast}  : empty_face,\n                        south: box.uvSouth ? {uv: box.uvSouth} : empty_face,\n                        west:  box.uvWest  ? {uv: box.uvWest}  : empty_face,\n                        up:    box.uvUp    ? {uv: box.uvUp}    : empty_face,\n                        down:  box.uvDown  ? {uv: box.uvDown}  : empty_face,\n                      }})\n                    }\n                    if (p_group.parent !== \"root\") {\n                      for (let i = 0; i < 3; i++) {\n                        base_cube.from[i] += p_group.origin[i]\n                        base_cube.to[i] += p_group.origin[i]\n                      }\n                    }\n                    base_cube.addTo(p_group).init()\n                  })\n                }\n                if (submodel.submodels && submodel.submodels.length) {\n                  submodel.submodels.forEach(subsub => {\n                    if (subsub.translate) {\n                      subsub.translate[0] += p_group.origin[0]\n                      subsub.translate[1] += p_group.origin[1]\n                      subsub.translate[2] += p_group.origin[2]\n                    }\n                    const group = new Group({\n                      name: subsub.id || `${b.attachTo}_sub_${subcount}`,\n                      origin: subsub.translate || (depth >= 1 ? submodel.translate : undefined),\n                      rotation: subsub.rotate,\n                      mirror_uv: (subsub.mirrorTexture && subsub.mirrorTexture.includes(\"u\"))\n                    })\n                    subcount++\n                    group.addTo(p_group).init()\n                    readContent(subsub, group, depth + 1)\n                  })\n                }\n              }\n\n              group.init().addTo()\n              readContent(b, group, 0)\n            })\n          }\n          this.dispatchEvent(\"parsed\", {model})\n          Canvas.updateAllBones()\n\n          for (const group of groups) if (!Group.all.find(e => e.name === group.name)) new Group(group).init()\n        }\n      })\n      async function getTexture(path) {\n        const texture = await new Promise(fulfill => new THREE.TextureLoader().load(path, fulfill, null, fulfill))\n        const canvas = document.createElement(\"canvas\")\n        canvas.width = 64\n        canvas.height = 64\n        const ctx = canvas.getContext(\"2d\")\n        ctx.drawImage(texture.image, 0, 0, 32, 16, 0, 0, 32, 16)     //head\n        ctx.drawImage(texture.image, 8, 16, 4, 4, 8, 16, 4, 4)       //right leg bottom\n        ctx.drawImage(texture.image, 0, 20, 8, 12, 0, 20, 8, 12)     //right leg right front\n        ctx.drawImage(texture.image, 12, 20, 4, 20, 12, 20, 4, 20)   //right leg back\n        ctx.drawImage(texture.image, 20, 16, 8, 4, 20, 16, 8, 4)     //body top\n        ctx.drawImage(texture.image, 20, 20, 8, 12, 20, 20, 8, 12)   //body front\n        ctx.drawImage(texture.image, 32, 20, 8, 12, 32, 20, 8, 12)   //body back\n        ctx.drawImage(texture.image, 44, 16, 8, 4, 44, 16, 8, 4)     //right arm top bottom\n        ctx.drawImage(texture.image, 40, 20, 8, 12, 40, 20, 8, 12)   //right arm right front\n        ctx.drawImage(texture.image, 52, 20, 4, 12, 52, 20, 4, 12)   //right arm back\n        ctx.drawImage(texture.image, 24, 48, 4, 4, 24, 48, 4, 4)     //left leg bottom\n        ctx.drawImage(texture.image, 20, 52, 12, 12, 20, 52, 12, 12) //left leg front left back \n        ctx.drawImage(texture.image, 36, 48, 8, 4, 36, 48, 8, 4)     //left arm bottom\n        ctx.drawImage(texture.image, 36, 52, 12, 12, 36, 52, 12, 12) //left arm front left back\n        const skin = new THREE.CanvasTexture(canvas)\n        const img = new Image()\n        img.tex = skin\n        img.tex.magFilter = THREE.NearestFilter\n        img.tex.minFilter = THREE.NearestFilter\n        return skin\n      }\n      const greyscale = new Uint8Array(4)\n      greyscale[0] = 64\n      greyscale[1] = 64\n      greyscale[2] = 64\n      greyscale[3] = 255\n      const material = new THREE.MeshLambertMaterial({\n        color: 0xffffff,\n        map: await getTexture(\"assets/player_skin.png\"),\n        alphaMap: new THREE.DataTexture(greyscale, 1, 1),\n        transparent: true\n      })\n      model = new THREE.Object3D()\n      model.name = \"optifine_player_model_guide\"\n      model.position.x = 0.001\n      model.position.y = 0.001\n      model.position.z = 0.001\n      const cubes = [\n        {\n          //Head\n          \"size\": [8, 8, 8],\n          \"pos\": [0, 28, 0],\n          \"origin\": [0, 24, 0],\n          \"north\": {\"uv\": [2.032, 2.032, 3.968, 3.968]},\n          \"east\": {\"uv\": [0.032, 2.032, 1.968, 3.968]},\n          \"south\": {\"uv\": [6.032, 2.032, 7.968, 3.968]},\n          \"west\": {\"uv\": [4.032, 2.032, 5.968, 3.968]},\n          \"up\": {\"uv\": [3.968, 1.968, 2.032, 0.032]},\n          \"down\": {\"uv\": [5.968, 0.032, 4.032, 1.968]}\n        },\n        {\n          //Body\n          \"size\": [8, 12, 4],\n          \"pos\": [0, 18, 0],\n          \"north\": {\"uv\": [5.032, 5.032, 6.968, 7.968]},\n          \"east\": {\"uv\": [4.032, 5.032, 4.968, 7.968]},\n          \"south\": {\"uv\": [8.032, 5.032, 9.968, 7.968]},\n          \"west\": {\"uv\": [7.032, 5.032, 7.968, 7.968]},\n          \"up\": {\"uv\": [5.032, 4.968, 6.968, 4.032]},\n          \"down\": {\"uv\": [7.032, 4.032, 8.968, 4.968]}\n        },\n        {\n          //L Arm\n          \"size\": [4, 12, 4],\n          \"pos\": [-6, 18, 0],\n          \"origin\": [-4, 22, 0],\n          \"north\": {\"uv\": [9.032, 13.032, 9.968, 15.968]},\n          \"east\": {\"uv\": [8.032, 13.032, 8.968, 15.968]},\n          \"south\": {\"uv\": [11.032, 13.032, 11.968, 15.968]},\n          \"west\": {\"uv\": [10.032, 13.032, 10.968, 15.968]},\n          \"up\": {\"uv\": [9.968, 12.968, 9.032, 12.032]},\n          \"down\": {\"uv\": [10.968, 12.032, 10.032, 12.968]}\n        },\n        {\n          //R Arm\n          \"size\": [4, 12, 4],\n          \"pos\": [6, 18, 0],\n          \"origin\": [4, 22, 0],\n          \"north\": {\"uv\": [11.032, 5.032, 11.968, 7.968]},\n          \"east\": {\"uv\": [10.032, 5.032, 10.968, 7.968]},\n          \"south\": {\"uv\": [13.032, 5.032, 13.968, 7.968]},\n          \"west\": {\"uv\": [12.032, 5.032, 12.968, 7.968]},\n          \"up\": {\"uv\": [11.968, 4.968, 11.032, 4.032]},\n          \"down\": {\"uv\": [12.968, 4.032, 12.032, 4.968]}\n        },\n        {\n          //L Leg\n          \"size\": [3.95, 12, 4],\n          \"pos\": [-1.975, 6, 0],\n          \"origin\": [0, 12, 0],\n          \"north\": {\"uv\": [5.032, 13.032, 5.968, 15.968]},\n          \"east\": {\"uv\": [4.032, 13.032, 4.968, 15.968]},\n          \"south\": {\"uv\": [7.032, 13.032, 7.968, 15.968]},\n          \"west\": {\"uv\": [6.032, 13.032, 6.968, 15.968]},\n          \"up\": {\"uv\": [5.968, 12.968, 5.032, 12.032]},\n          \"down\": {\"uv\": [6.968, 12.032, 6.032, 12.968]}\n        },\n        {\n          //R Leg\n          \"size\": [3.95, 12, 4],\n          \"pos\": [1.975, 6, 0],\n          \"origin\": [0, 12, 0],\n          \"north\": {\"uv\": [1.032, 5.032, 1.968, 7.968]},\n          \"east\": {\"uv\": [0.032, 5.032, 0.968, 7.968]},\n          \"south\": {\"uv\": [3.032, 5.032, 3.968, 7.968]},\n          \"west\": {\"uv\": [2.032, 5.032, 2.968, 7.968]},\n          \"up\": {\"uv\": [1.968, 4.968, 1.032, 4.032]},\n          \"down\": {\"uv\": [2.968, 4.032, 2.032, 4.968]}\n        }\n      ]\n      for (const cube of cubes) {\n        const mesh = new THREE.Mesh(new THREE.BoxGeometry(...cube.size), material)\n        if (cube.origin) {\n          mesh.position.set(cube.origin[0], cube.origin[1], cube.origin[2])\n          mesh.geometry.translate(-cube.origin[0], -cube.origin[1], -cube.origin[2])\n        }\n        mesh.geometry.translate(cube.pos[0], cube.pos[1], cube.pos[2])\n        for (const [key, face] of Object.entries(cube)) {\n          if (face.uv !== undefined) {\n            let fIndex = 0;\n            switch(key) {\n              case \"north\": fIndex = 10; break\n              case \"east\": fIndex = 0; break\n              case \"south\": fIndex = 8; break\n              case \"west\": fIndex = 2; break\n              case \"up\": fIndex = 4; break\n              case \"down\": fIndex = 6; break\n            }\n            let uv_array = [\n              [face.uv[0] / 16, 1 - (face.uv[1] / 16)],\n              [face.uv[2] / 16, 1 - (face.uv[1] / 16)],\n              [face.uv[0] / 16, 1 - (face.uv[3] / 16)],\n              [face.uv[2] / 16, 1 - (face.uv[3] / 16)]\n            ]\n            const rot = (face.rotation + 0)\n            while (rot > 0) {\n              let a = arr[0]\n              arr[0] = arr[2]\n              arr[2] = arr[3]\n              arr[3] = arr[1]\n              arr[1] = a\n              rot -= 90\n            }\n            mesh.geometry.attributes.uv.array.set(uv_array[0], fIndex * 4 + 0)\n            mesh.geometry.attributes.uv.array.set(uv_array[1], fIndex * 4 + 2)\n            mesh.geometry.attributes.uv.array.set(uv_array[2], fIndex * 4 + 4)\n            mesh.geometry.attributes.uv.array.set(uv_array[3], fIndex * 4 + 6)\n            mesh.geometry.attributes.uv.needsUpdate = true\n          }\n        }\n        model.add(mesh)\n      }\n      if (settings.display_skin.value) {\n        let val = settings.display_skin.value\n        if (val.startsWith(\"username:\")) {\n          fetch(`https://api.mojang.com/users/profiles/minecraft/${val.slice(9)}`).then(async r => {\n            const uuid = await r.json()\n            if (uuid?.id) {\n              fetch(`https://sessionserver.mojang.com/session/minecraft/profile/${uuid.id}`).then(async r => {\n                const data = await r.json()\n                model.children[0].material.map = await getTexture(JSON.parse(Buffer.from(data.properties[0].value, \"base64\").toString()).textures.SKIN.url)\n              })\n            }\n          })\n        } else {\n          if (val.slice(1, 2) === \",\") val = val.slice(2)\n          try {\n            model.children[0].material.map = await getTexture(val)\n          } catch {}\n        }\n      }\n      format = new ModelFormat({\n        id: \"optifine_player_model\",\n        name: \"OptiFine Player Model\",\n        description: \"Player models for OptiFine\",\n        icon,\n        category: \"minecraft\",\n        show_on_start_screen: true,\n        model_identifier: false,\n        box_uv: true,\n        optional_box_uv: true,\n        single_texture: true,\n        bone_rig: true,\n        centered_grid: true,\n        integer_size: true,\n        codec,\n        onActivation: () => Canvas.scene.add(model),\n        onDeactivation: () => Canvas.scene.remove(model),\n        format_page: {\n          component: {\n            methods: {\n              load: () => Formats.optifine_player_model.new(),\n              info() {\n                Plugins.dialog.show()\n                Plugins.dialog.content_vue.search_term = \"OptiFine Player Models\"\n                Plugins.dialog.content_vue.selectPlugin(Plugins.dialog.content_vue.viewed_plugins.find(e => e.id === \"optifine_player_models\"))\n              }\n            },\n            template: `\n              <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n                <p class=\"format_description\">${description}</p>\n                <p class=\"format_target\"><b>Target</b> : <span>Minecraft: Java Edition with OptiFine</span></p>\n                <content>\n                  <h3 class=\"markdown\"><strong>How to use:</strong></h3>\n                  <br>\n                  <button @click=\"info\">Show information</button>\n                  <br>\n                  <br>\n                  <h3 class=\"markdown\"><strong>Limitations:</strong></h3>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li>They are client side only.</li>\n                      <li>They are not part of resource packs.</li>\n                      <li>They require OptiFine, and JVM args set in the launcher.</li>\n                      <li>Animations are not supported.</li>\n                      <li>You can only target specific players, not all players.</li>\n                    </ul>\n                  </p>\n                </content>\n                <div class=\"spacer\"></div>\n                <div class=\"optifine-player-model-links\">${Object.values(links).map(e => `\n                  <a href=\"${e.link}\">\n                    ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                    <p>${e.text}</p>\n                  </a>\n                `).join(\"\")}</div>\n                <div class=\"button_bar\">\n                  <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"load\">\n                    <i class=\"${icon} icon\"></i>\n                    Create New OptiFine Player Model\n                  </button>\n                </div>\n              </div>\n            `\n          }\n        }\n      })\n      Object.defineProperty(format, \"integer_size\", {get: _ => Project.box_uv})\n      codec.format = format\n      action = new Action(\"export_optifine_player_model\", {\n        name: \"Export OptiFine Player Model\",\n        icon: \"icon-optifine_file\",\n        condition: {\n          formats: [format.id]\n        },\n        click: () => codec.export()\n      })\n      MenuBar.addAction(action, \"file.export.0\")\n      codec.export_action = action\n      property = new Property(ModelProject, \"boolean\", \"use_player_texture\", {\n        default: false,\n        label: \"Use Player Texture\",\n        condition: {\n          formats: [format.id]\n        }\n      })\n      setResolution = () => {\n        if (Project.format === format) {\n          Project.texture_width = Project.texture_height = 64\n          for (const group of groups) new Group(group).init()\n        }\n      }\n      Blockbench.on(\"new_project\", setResolution)\n      textureAdd = e => {\n        if (Project.format === format) {\n          Texture.all.map(tex => tex.getMaterial()).forEach(e => e.transparent = false)\n        }\n      }\n      textureAdd()\n      Blockbench.on(\"add_texture\", textureAdd)\n      const addGroupOriginal = BarItems.add_group.condition\n      const addCubeOriginal = BarItems.add_cube.condition\n      const deleteOriginal = BarItems.delete.condition ?? (() => true)\n      BarItems.add_group.condition = () => Project.format === format ? addGroupOriginal() && (Group.selected || Cube.selected?.length) : addGroupOriginal()\n      BarItems.add_cube.condition = () => Project.format === format ? addCubeOriginal() && (Group.selected || Cube.selected?.length) : addCubeOriginal()\n      BarItems.delete.condition = () => Project.format === format ? deleteOriginal() && !groupNames.includes(Group.selected?.name) : deleteOriginal()\n      config = new Action(\"create_optifine_player_model_config\", {\n        name: \"Create OptiFine Player Model Config\",\n        icon: \"icon-optifine_file\",\n        condition: {\n          formats: [format.id]\n        },\n        click() {\n          const dialog = new Dialog({\n            title: \"Create OptiFine Player Model Config\",\n            id: \"optifine_player_model_config\",\n            lines: [`\n              <style>\n                .optifine_player_model_config_disabled {\n                  text-decoration: none!important;\n                  opacity: 0.5;\n                }\n                .optifine_player_model_config_disabled:hover {\n                  background-color: var(--color-button);\n                  color: var(--color-text)!important;\n                  cursor: default;\n                }\n              </style>\n            `],\n            component: {\n              methods: {\n                change() {\n                  const button = $(\"#optifine_player_model_config_create\")\n                  if ($(\"#optifine_player_model_config_username\").val().trim() !== \"\" && $(\"#optifine_player_model_config_item\").val().trim() !== \"\") {\n                    button.removeClass(\"optifine_player_model_config_disabled\")\n                  } else {\n                    button.addClass(\"optifine_player_model_config_disabled\")\n                  }\n                },\n                create() {\n                  if ($(\"#optifine_player_model_config_create\").hasClass(\"optifine_player_model_config_disabled\")) return\n                  const data = {\n                    items: [\n                      {\n                        type: $(\"#optifine_player_model_config_item\").val().trim(),\n                        active: true\n                      }\n                    ]\n                  }\n                  Blockbench.export({\n                    extensions: [\"cfg\"],\n                    type: \"CFG\",\n                    name: $(\"#optifine_player_model_config_username\").val().trim(),\n                    content: JSON.stringify(data, null, 2)\n                  }, file => Blockbench.showQuickMessage(`Saved as: ${file}`, 2000))\n                  dialog.cancel()\n                },\n                close: () => dialog.cancel()\n              },\n              template: `\n                <div>\n                  <p>The usernam of the player that this config applies to.</p>\n                  <div class=\"dialog_bar form_bar\">\n                    <label class=\"name_space_left\" for=\"optifine_player_model_config_username\">Minecraft username:</label>\n                    <input type=\"text\" class=\"dark_bordered half focusable_input\" id=\"optifine_player_model_config_username\" placeholder=\"steve\" @input=\"change()\">\n                  </div>\n                  <br>\n                  <p>The player model name is the name of the folder you put the <strong>model.cfg</strong> file in.</p>\n                  <div class=\"dialog_bar form_bar\">\n                    <label class=\"name_space_left\" for=\"optifine_player_model_config_item\">Player model name:</label>\n                    <input type=\"text\" class=\"dark_bordered half focusable_input\" id=\"optifine_player_model_config_item\" placeholder=\"horns\" @input=\"change()\">\n                  </div>\n                  <br>\n                  <div style=\"display:flex;gap:8px;justify-content:flex-end\">\n                    <button id=\"optifine_player_model_config_create\" @click=\"create()\" class=\"optifine_player_model_config_disabled\">Create</button>\n                    <button @click=\"close()\">Cancel</button>\n                  </div>\n                </div>\n              `\n            },\n            buttons: []\n          }).show()\n        }\n      })\n      MenuBar.addAction(config, \"file.export.1\")\n    },\n    onunload() {\n      Blockbench.removeListener(\"new_project\", setResolution)\n      Blockbench.removeListener(\"add_texture\", textureAdd)\n      codec?.delete()\n      format?.delete()\n      action?.delete()\n      config?.delete()\n      styles?.delete()\n      property?.delete()\n    }\n  })\n  function addStyles() {\n    styles = Blockbench.addCSS(`\n      .spacer {\n        flex: 1;\n      }\n      .optifine-player-model-links {\n        display: flex;\n        justify-content: space-around;\n        margin: 20px 40px 0;\n      }\n      .optifine-player-model-links > a {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 5px;\n        padding: 5px;\n        text-decoration: none;\n        flex-grow: 1;\n        flex-basis: 0;\n        color: var(--color-subtle_text);\n        text-align: center;\n      }\n      .optifine-player-model-links > a:hover {\n        background-color: var(--color-accent);\n        color: var(--color-light);\n      }\n      .optifine-player-model-links > a > i {\n        font-size: 32px;\n        width: 100%;\n        max-width: initial;\n        height: 32px;\n        text-align: center;\n      }\n      .optifine-player-model-links > a:hover > i {\n        color: var(--color-light) !important;\n      }\n      .optifine-player-model-links > a > p {\n        flex: 1;\n        display: flex;\n        align-items: center;\n      }\n      #format_page_optifine_player_model {\n        padding-bottom: 0;\n      }\n      #format_page_optifine_player_model .format_target {\n        margin-bottom: 6px;\n      }\n      #format_page_optifine_player_model div:nth-child(3), #format_page_optifine_player_model content {\n        overflow-y: auto;\n      }\n    `)\n  }\n})()"
  },
  {
    "path": "plugins/optimize.js",
    "content": "Plugin.register(\"optimize\", {\n\"title\": \"Optimize\",\n\"author\": \"Krozi\",\n\"icon\": \"border_outer\",\n\"version\": \"1.2.8\",\n\"description\": \"Hide concealed faces for better performance!\",\nonload() {\n\t\nMenuBar.addAction(new Action({\n\tid: \"optimize\",\n\tname: \"Optimize\",\n\ticon: \"border_outer\",\n\tcategory: \"filter\",\n\tclick: function(ev) {\ntry {\n\tvar dialog = new Dialog({title:'Optimize', id:'optimize_options', lines:[\n\t\t'<p>Restrict to selected elements <input type=\"checkbox\" id=\"restrict\"></p>',\n\t\t'<p>Apply culling (Blockmodels only)<input type=\"checkbox\" id = \"culling\"></p>',\n\t\t'<br/>Please check if all visible cubes are still there.<br/>Unwanted changes can be reverted using Ctrl+Z.'\n\t],\n\t\"onConfirm\": function(data) {\n\t// dialog.hide()\n\tvar restrictToSelected = $(\"#restrict\")[0].checked\n\tvar applyCulling = $(\"#culling\")[0].checked\n\tdialog.hide()\n\t\n\tvar elements = Outliner.elements\n\tif (restrictToSelected) {\n\t\telements = selected\n\t}\n\taspects = {\"elements\": elements, \"uv_only\": false}\n\tUndo.initEdit(aspects)\n\t\n\tBlockbench.showMessage('Starting optimization', 'center')\n\tvar axisToFace = ['west', 'down', 'north', 'east', 'up', 'south']\n\tvar epsilon = 0.00001\n\tvar removedFaces = 0\n\tvar culledFaces = 0\n\tvar invisibleCubes = []\n\tfor (i=0; i<elements.length; i++) {\n\t\tvar cube1 = elements[i]\n\t\tvar origin1 = cube1.origin\n\t\tvar angle1\n\t\tvar rotationAxis1\n\t\t[angle1, rotationAxis1] = optimize_getAngleAxis(cube1.rotation)\n\t\tfor (faceAxis = 0; faceAxis < 6; faceAxis++) {\n\t\t\tif (cube1.faces[axisToFace[faceAxis]].texture == null) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (applyCulling) {\n\t\t\t\tdelete cube1.faces[axisToFace[faceAxis]].cullface\n\t\t\t}\n\t\t\tvar x = (faceAxis+2)%3\n\t\t\tvar y = faceAxis%3\n\t\t\tvar z = (faceAxis+1)%3\n\t\t\tvar level\n\t\t\tvar [cube1from, cube1to] = optimize_fromToInflate(cube1)\n\t\t\tif (faceAxis < 3) {\n\t\t\t\tlevel = cube1from[y]\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlevel = cube1to[y]\n\t\t\t}\n\t\t\tif (Math.abs(cube1to[x] - cube1from[x]) < epsilon || Math.abs(cube1to[z] - cube1from[z]) < epsilon) {\n\t\t\t\tvar planes = []\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar planes = [[cube1from[x], cube1from[z], cube1to[x], cube1to[z]]]\n\t\t\t\tvar nonRectangleIntersections = []\n\t\t\t\tfor (j=0; j<elements.length; j++) {\n\t\t\t\t\tif (cube1.faces[axisToFace[faceAxis]].texture !== null && i != j) {\n\t\t\t\t\t\tvar cube2 = elements[j]\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar origin2 = cube2.origin\n\t\t\t\t\t\tvar angle2\n\t\t\t\t\t\tvar rotationAxis2\n\t\t\t\t\t\t[angle2, rotationAxis2] = optimize_getAngleAxis(cube2.rotation)\n\t\t\t\t\t\tif (rotationAxis1 != rotationAxis2 && angle1 != 0 && angle2 != 0) {\n\t\t\t\t\t\t\tnonRectangleIntersections.push(cube2)\n\t\t\t\t\t\t\tcontinue\t\t\t// Intersection not a rectangle --> Not my problem, ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar rotationAxis = Math.max(rotationAxis1, rotationAxis2)\n\t\t\t\t\t\tvar notRotationAxis = 3-y-rotationAxis\n\t\t\t\t\t\tvar intersection = []\n\t\t\t\t\t\tvar [from, to] = optimize_fromToInflate(cube2)\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (rotationAxis1 == rotationAxis2 && angle1 == angle2) {\t\t\t// Both cubes have the same orientations\n\t\t\t\t\t\t\tfrom = optimize_rotatePoint(optimize_rotatePoint(from, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)\n\t\t\t\t\t\t\tto = optimize_rotatePoint(optimize_rotatePoint(to, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1)\n\t\t\t\t\t\t\tvar level2 = to[y]\n\t\t\t\t\t\t\tif (faceAxis < 3) {\n\t\t\t\t\t\t\t\tlevel2 = from[y]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (level2-epsilon <= level && level <= level2+epsilon && cube2.faces[axisToFace[faceAxis]].texture === null) {}\n\t\t\t\t\t\t\telse if (from[y]-epsilon <= level && level <= to[y]+epsilon) {\n\t\t\t\t\t\t\t\tintersection = [from[x], from[z], to[x], to[z]]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\telse if (rotationAxis1 == rotationAxis2 || angle1 == 0 || angle2 == 0) {\t\t// Both cubes have different orientations\n\t\t\t\t\t\t\tnonRectangleIntersections.push(cube2)\n\t\t\t\t\t\t\tvar corners = []\n\t\t\t\t\t\t\tcorner = from.slice(0)\n\t\t\t\t\t\t\tcorners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1))\n\t\t\t\t\t\t\tcorner[(rotationAxis+1)%3] = to[(rotationAxis+1)%3]\n\t\t\t\t\t\t\tcorners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1))\n\t\t\t\t\t\t\tcorner[(rotationAxis+2)%3] = to[(rotationAxis+2)%3]\n\t\t\t\t\t\t\tcorners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1))\n\t\t\t\t\t\t\tcorner[(rotationAxis+1)%3] = from[(rotationAxis+1)%3]\n\t\t\t\t\t\t\tcorners.push(optimize_rotatePoint(optimize_rotatePoint(corner, origin2, rotationAxis, angle2), origin1, rotationAxis, -angle1))\n\t\t\t\t\t\t\tvar intersected = []\n\t\t\t\t\t\t\tfor (var c=0; c<4; c++) {\n\t\t\t\t\t\t\t\tvar t = (level-corners[c][y]) / (corners[(c+1)%4][y]-corners[c][y])\n\t\t\t\t\t\t\t\tif (0 <= t && t < 1) {\n\t\t\t\t\t\t\t\t\tintersected.push(corners[c][notRotationAxis] + (corners[(c+1)%4][notRotationAxis] - corners[c][notRotationAxis]) * t)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (intersected.length == 2) {\n\t\t\t\t\t\t\t\tif (notRotationAxis == z) {\n\t\t\t\t\t\t\t\t\tintersection = [from[x], Math.min(intersected[0], intersected[1]), to[x], Math.max(intersected[0], intersected[1])]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tintersection = [Math.min(intersected[0], intersected[1]), from[z], Math.max(intersected[0], intersected[1]), to[z]]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (intersection.length == 4) {\n\t\t\t\t\t\t\tvar newPlanes = []\n\t\t\t\t\t\t\tfor (planeNumber=0; planeNumber < planes.length; planeNumber++) {\n\t\t\t\t\t\t\t\tplane = planes[planeNumber]\n\t\t\t\t\t\t\t\tif (plane[0] < intersection[2]-epsilon && plane[2] > intersection[0]+epsilon && plane[1] < intersection[3]-epsilon && plane[3] > intersection[1]+epsilon) {\t\t// Cube intersects with plane --> Split up in 4 new planes\n\t\t\t\t\t\t\t\t\tif (intersection[0]-epsilon > plane[0]) {\n\t\t\t\t\t\t\t\t\t\tnewPlanes.push([plane[0], plane[1], intersection[0], plane[3]])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (intersection[1]-epsilon > plane[1]) {\n\t\t\t\t\t\t\t\t\t\tnewPlanes.push([Math.max(plane[0], intersection[0]), plane[1], Math.min(plane[2], intersection[2]), intersection[1]])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (intersection[3]+epsilon < plane[3]) {\n\t\t\t\t\t\t\t\t\t\tnewPlanes.push([Math.max(plane[0], intersection[0]), intersection[3], Math.min(plane[2], intersection[2]), plane[3]])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (intersection[2]+epsilon < plane[2]) {\n\t\t\t\t\t\t\t\t\t\tnewPlanes.push([intersection[2], plane[1], plane[2], plane[3]])\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tnewPlanes.push(plane)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tplanes = newPlanes\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Try to cull elements with different rotations\n\t\t\t\tfor (j=0; j<nonRectangleIntersections.length; j++) {\n\t\t\t\t\tvar cube2 = nonRectangleIntersections[j]\n\t\t\t\t\tvar [from, to] = optimize_fromToInflate(cube2)\n\t\t\t\t\tvar [angle2, rotationAxis2] = optimize_getAngleAxis(cube2.rotation)\n\t\t\t\t\tfor (planeNumber=planes.length-1; planeNumber >= 0; planeNumber--) {\n\t\t\t\t\t\tvar plane = planes[planeNumber]\n\t\t\t\t\t\tvar corners = [\n\t\t\t\t\t\t\t[plane[0], level, plane[1]],\n\t\t\t\t\t\t\t[plane[2], level, plane[1]],\n\t\t\t\t\t\t\t[plane[0], level, plane[3]],\n\t\t\t\t\t\t\t[plane[2], level, plane[3]]\n\t\t\t\t\t\t]\n\t\t\t\t\t\tvar deletePlane = true\n\t\t\t\t\t\tfor (k=0; k<4; k++) {\n\t\t\t\t\t\t\tvar corner = [corners[k][(3-x)%3], corners[k][(4-x)%3], corners[k][(5-x)%3]]\n\t\t\t\t\t\t\tcorner = optimize_rotatePoint(optimize_rotatePoint(corner, origin1, rotationAxis1, angle1), cube2.origin, rotationAxis2, -angle2)\n\t\t\t\t\t\t\tif (!(\n\t\t\t\t\t\t\t\tfrom[0] - epsilon <= corner[0] && corner[0] <= to[0] + epsilon &&\n\t\t\t\t\t\t\t\tfrom[1] - epsilon <= corner[1] && corner[1] <= to[1] + epsilon &&\n\t\t\t\t\t\t\t\tfrom[2] - epsilon <= corner[2] && corner[2] <= to[2] + epsilon\n\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\tdeletePlane = false\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (deletePlane) {\n\t\t\t\t\t\t\tplanes.remove(plane)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (planes.length == 0) {\n\t\t\t\tcube1.faces[axisToFace[faceAxis]].texture = null\n\t\t\t\tremovedFaces++\n\t\t\t}\n\t\t\telse if (applyCulling) {\n\t\t\t\tvar cullFaces = [true, true, true, true, true, true]\n\t\t\t\tfor (var j = 0; j < planes.length; j++) {\n\t\t\t\t\tfor (k = 0; k < 4; k++) {\n\t\t\t\t\t\tvar corner = [0, 0, 0]\n\t\t\t\t\t\tcorner[x] = planes[j][(k&1) * 2]\n\t\t\t\t\t\tcorner[z] = planes[j][(k&2) + 1]\n\t\t\t\t\t\tcorner[y] = level\n\t\t\t\t\t\tvar rotatedCorner = optimize_rotatePoint(corner, origin1, rotationAxis1, angle1)\n\t\t\t\t\t\tfor (var l = 0; l < 3; l++) {\n\t\t\t\t\t\t\tif (rotatedCorner[l] > epsilon) {\n\t\t\t\t\t\t\t\tcullFaces[l] = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (rotatedCorner[l] < 16-epsilon) {\n\t\t\t\t\t\t\t\tcullFaces[l+3] = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (var j = 0; j < 6; j++) {\n\t\t\t\t\tif (cullFaces[j]) {\n\t\t\t\t\t\tcube1.faces[axisToFace[faceAxis]].cullface = axisToFace[j]\n\t\t\t\t\t\tculledFaces++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar visible = false\n\t\tfor (invisibleFace=0; invisibleFace<6; invisibleFace++) {\n\t\t\tif (cube1.faces[axisToFace[invisibleFace]].texture !== null) {\n\t\t\t\tvisible = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif (!visible) {\n\t\t\tinvisibleCubes.push(i)\n\t\t}\n\t}\n\tfor (i=invisibleCubes.length-1; i >= 0; i--) {\n\t\telements[invisibleCubes[i]].remove()\n\t}\n\tupdateSelection()\n\tBlockbench.showMessage('Faces removed: ' + removedFaces + (invisibleCubes.length > 0 && (', Cubes removed: ' + invisibleCubes.length) || '') + (culledFaces > 0 && (', Faces culled: ' + culledFaces) || ''), 'center')\n\tUndo.finishEdit(\"optimize\", aspects)\n    Canvas.updateAllFaces()\n}})\n\tdialog.show()\n}\ncatch(err) {\n\tBlockbench.showMessage(err.message + err, 'center')\n\tconsole.error(err)\n}\n\n}}), \"filter\")\n\n},\n\nonunload() {\n\tMenuBar.removeAction(\"filter.optimize\")\n}\n})\n\noptimize_fromToInflate = function(cube) {\n\tvar from = [cube.from[0] - cube.inflate, cube.from[1] - cube.inflate, cube.from[2] - cube.inflate]\n\tvar to = [cube.to[0] + cube.inflate, cube.to[1] + cube.inflate, cube.to[2] + cube.inflate]\n\treturn [from, to]\n}\n\noptimize_rotatePoint = function(position, origin, axis, angle) {\n\tif (angle == 0 || axis == -1) {\n\t\treturn position\n\t}\n\tvar sin\n\tvar cos\n\tif (angle == 45) {\n\t\tsin = 0.7071067812\n\t\tcos = 0.7071067812\n\t}\n\telse if (angle == -45) {\n\t\tsin = -0.7071067812\n\t\tcos = 0.7071067812\n\t}\n\telse if (angle == 22.5) {\n\t\tsin = 0.3826834324\n\t\tcos = 0.9238795325\n\t}\n\telse if (angle == -22.5) {\n\t\tsin = -0.3826834324\n\t\tcos = 0.9238795325\n\t}\n\telse {\n\t\tsin = Math.sin(angle * Math.PI / 180)\n\t\tcos = Math.cos(angle * Math.PI / 180)\n\t}\n\tvar newPosition = [0,0,0]\n\tvar x = axis\n\tvar y = (axis+1)%3\n\tvar z = (axis+2)%3\n\tnewPosition[x] = position[x]\n\tnewPosition[y] = origin[y] + (position[y]-origin[y]) * cos - (position[z]-origin[z]) * sin\n\tnewPosition[z] = origin[z] + (position[z]-origin[z]) * cos + (position[y]-origin[y]) * sin\n\treturn newPosition\n}\n\noptimize_getAngleAxis = function(rotation) {\n\tfor (axis = 0; axis < 3; axis++) {\n\t\tif (rotation[axis] != 0) {\n\t\t\treturn [rotation[axis], axis]\n\t\t}\n\t}\n\treturn [0, -1]\n}\n"
  },
  {
    "path": "plugins/outline_creator.js",
    "content": "var createOutlineAction;\r\n\r\nPlugin.register('outline_creator', {\r\n    icon: 'crop_square',\r\n    title: 'Outline Creator',\r\n    description: 'Creates stylistic outlines for cubes and meshes using negative scale values.',\r\n    about: 'Select an element you want to create an outline for, go to the `Tools` menu and click on the `Create Outline` option.',\r\n    author: 'Wither',\r\n    version: '1.1.0',\r\n    min_version: '4.2.0',\r\n    variant: 'both',\r\n\r\n    onload() {\r\n        createOutlineAction = new Action({\r\n            id: 'create_outline',\r\n            name: 'Create Outline',\r\n            icon: 'crop_square',\r\n            description: 'Create an outline for selected elements',\r\n            click(ev) {\r\n                if (selected.length === 0) {\r\n                    Blockbench.showMessageBox({\r\n                        title: 'No valid elements selected',\r\n                        icon: 'error',\r\n                        message: 'You must select at least one cube or mesh!',\r\n                        buttons: ['OK']\r\n                    });\r\n                }\r\n\r\n                else if (!selected.find(el => el instanceof Cube || el instanceof Mesh)) {\r\n                    Blockbench.showMessageBox({\r\n                        title: 'Invalid elements',\r\n                        icon: 'error',\r\n                        message: 'You can only add outlines to cubes and meshes!',\r\n                        buttons: ['OK']\r\n                    });\r\n                }\r\n\r\n                else {\r\n                    outlineSettings.show();\r\n                }\r\n            }\r\n        });\r\n        MenuBar.addAction(createOutlineAction, 'tools');\r\n    },\r\n    onunload() {\r\n        createOutlineAction.delete();\r\n    }\r\n})\r\n\r\nfunction createOutline(outline_thickness) {\r\n    Undo.initEdit({elements: Outliner.elements, outliner: true});\r\n\r\n    // Cube handling\r\n    for (const element of Cube.selected) {\r\n        var outline = new Cube({\r\n            name: `${element.name}_outline`, \r\n            from:[element.to[0] + outline_thickness, element.to[1] + outline_thickness, element.to[2] + outline_thickness], \r\n            to:[element.from[0] - outline_thickness, element.from[1] - outline_thickness, element.from[2] - outline_thickness],\r\n            rotation: element.rotation,\r\n            origin: element.origin,\r\n            faces: {\r\n                north: {\r\n                    uv: element.faces.south.uv,\r\n                    texture: element.faces.south.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.south.cullface\r\n                },\r\n                south: {\r\n                    uv: element.faces.north.uv,\r\n                    texture: element.faces.north.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.north.cullface\r\n                },\r\n                west: {\r\n                    uv: element.faces.east.uv,\r\n                    texture: element.faces.east.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.east.cullface\r\n                },\r\n                east: {\r\n                    uv: element.faces.west.uv,\r\n                    texture: element.faces.west.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.west.cullface\r\n                },\r\n                up: {\r\n                    uv: element.faces.down.uv,\r\n                    texture: element.faces.down.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.down.cullface\r\n                },\r\n                down: {\r\n                    uv: element.faces.up.uv,\r\n                    texture: element.faces.up.texture,\r\n                    rotation: 180,\r\n                    cullface: element.faces.up.cullface\r\n                }\r\n            }\r\n        }).init();\r\n    }\r\n\r\n    // Mesh handling\r\n    for (const mesh of Mesh.selected) {\r\n        mesh.duplicate();\r\n        mesh.oldVertices = {};\r\n\r\n        for (const key in mesh.vertices) {\r\n            mesh.oldVertices[key] = mesh.vertices[key].slice();\r\n        }\r\n\r\n        mesh.forAllFaces(face => {\r\n            face.invert();\r\n        })\r\n\r\n        mesh.resize(outline_thickness * 2, 0, false, false, true);\r\n        mesh.resize(outline_thickness, 1, false, false, true);\r\n        mesh.resize(outline_thickness * 2, 2, false, false, true);\r\n        mesh.name = mesh.name + \"_outline\";\r\n    }\r\n\r\n    Canvas.updateView({\r\n\telements: selected,\r\n\telement_aspects: {transform: true, geometry: true},\r\n    })\r\n\r\n    Undo.finishEdit('Created outlines');\r\n}\r\n\r\nvar outlineSettings = new Dialog({\r\n    title: 'Outline Settings',\r\n    id: 'outline_settings',\r\n    form: {\r\n        thickness: {label: 'Thickness', type: 'number', value: 0.1, min: 0, step: 0.1}\r\n    },\r\n    onConfirm: function(formResult) {\r\n        outlineSettings.hide();\r\n        createOutline(formResult.thickness);\r\n    }\r\n});\r\n"
  },
  {
    "path": "plugins/outliner_group_exporter/LICENSE.MD",
    "content": "MIT License\n\nCopyright (c) 2024 MrCrayfish\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/outliner_group_exporter/about.md",
    "content": "Group Exporter is a simple plugin that allows you to export groups from the outliner as a model. Only the cubes that are contained within the group will be exported. This plugin is only for the Java Block/Item format, and supporting custom formats.\n\n## How to use Group Exporter\n\n- **Step 1:** Select a group in the outliner\n- **Step 2:** Right click the group and hover the option \"Export\"\n- **Step 3:** Click the format you want to export as\n- **Step 4:** Follow the steps as you would normally when exporting\n\n## License\n\nGroup Exporter is available under MIT"
  },
  {
    "path": "plugins/outliner_group_exporter/changelog.json",
    "content": "{\n    \"1.0.0\": {\n        \"title\": \"1.0.0\",\n        \"date\": \"2025-03-19\",\n        \"author\": \"MrCrayfish\",\n        \"categories\": [\n            {\n                \"title\": \"Features\",\n                \"list\": [\n                    \"Initial release\"\n                ]\n            }\n        ]\n    }\n}"
  },
  {
    "path": "plugins/outliner_group_exporter/members.yml",
    "content": "maintainers:\n  - MrCrayfish"
  },
  {
    "path": "plugins/outliner_group_exporter/outliner_group_exporter.js",
    "content": "(function() {\n    var separator;\n    var actionExportGroup;\n    var originalExportFunction;\n    BBPlugin.register('outliner_group_exporter', {\n        title: 'Group Exporter',\n        author: 'MrCrayfish',\n        icon: 'icon.png',\n        description: 'A simple plugin to allow you to export a group from the outliner as a model. Only cubes inside the group will be exported.',\n        tags: ['Minecraft Java Edition'],\n        version: '1.0.0',\n        min_version: '4.10.1',\n        variant: 'both',\n        onload() {\n            // Setup action and separator\n            separator = new MenuSeparator('export');\n            actionExportGroup = {\n                name: \"Export\",\n                id: 'export_outliner_group',\n                icon: 'insert_drive_file',\n                category: 'export',\n                // Only allow on java_block format or custom formats that can support it (e.g. ones that use Cubes)\n                condition: () => Format.id === 'java_block' || Format.allowOutlinerGroupExporting,\n                children() {\n                    return MenuBar.menus.file.structure.find(menu => menu.id === 'export')?.children;\n                }\n            };\n\n            // Append the separator and action to group menu\n            Group.prototype.menu.addAction(separator);\n            Group.prototype.menu.addAction(actionExportGroup);\n\n            let restrictCubes = (restrict) => {\n                if(!restrict)\n                    return;\n\n                // Get the top parent group\n                let group = getCurrentGroup();\n\n                // If none selected, just return\n                if(!group) {\n                    return;\n                }\n\n                // Find children cubes in the group\n                let selectedCubes = [];\n                group.forEachChild(cube => {\n                    selectedCubes.push(cube);\n                }, Cube, false);\n\n                // Update export flag on all cubes\n                Cube.all.forEach(cube => {\n                    cube.export = selectedCubes.includes(cube);\n                });\n            }\n\n            // Resets the export flag on all cubes\n            let resetCubes = (restrict) => {\n                if(!restrict)\n                    return;\n                Cube.all.forEach(cube => {\n                    cube.export = true;\n                });\n            }\n\n            // Override export function\n            originalExportFunction = Codec.prototype.export;\n            Codec.prototype.export = async function () {\n                // Check if the menu is open. Is this okay for web/mobile app?\n                let restrict = Group.prototype.menu == Menu.open;\n                restrictCubes(restrict); \n                originalExportFunction.call(this);\n                resetCubes(restrict);\n            };\n        },\n        onunload() {\n            // Clean up\n            Codec.prototype.export = originalExportFunction;\n            Group.prototype.menu.removeAction(separator);\n            Group.prototype.menu.removeAction('export_outliner_group');\n        }\n    });\n})()"
  },
  {
    "path": "plugins/pbr_preview/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/pbr_preview/about.md",
    "content": "**Create and view PBR textures in Blockbench. Exports [USDZ](https://openusd.org/release/index.html) and in formats for labPBR\n(Java) or RenderDragon (Bedrock) shaders**\n\n> **_PBR:_ Physically based rendering**\\\n> Read the\n> _[Intoduction to Physically Based Rendering](https://learn.microsoft.com/en-us/minecraft/creator/documents/rtxpbrintro?view=minecraft-bedrock-stable \"View Minecraft Creator documentation article.\")_\n> article in the Minecraft Creator documentation if you are not already familiar\n> with creating PBR content for Bedrock Edition. Visit the\n> [shaderLABS wiki](https://shaderlabs.org/wiki/Main_Page) for more information\n> on the labPBR material standard.\n\n## Blockbench PBR Plugin Features\n\n### PBR Material Preview\n\n- Preview PBR textures in Edit, Paint, and Animate mode.\n- Infers texture channels based on naming conventions when no channel has been\n  explicitly defined. Intended for previewing imported existing Bedrock and Java\n  PBR textures.\n- Uses Blockbench's preview scenes as model environment map.\n- PBR materials are updated with every edit to provide a live painting preview\n  of the material in Blockbench.\n\n### MER Maps\n\n> _MER:_ Metallic, emissive, and roughness maps assigned to red, green, and blue\n> channels respectively. It is the format used in Bedrock texture sets.\n\n#### Decode MER\n\n- MERs can be inferred and decoded automatically when PBR mode is enabled.\n- Decoding can be _slow_ on large textures (1024x+).\n- Assign an albedo map prior to decoding a MER to extract the emissive color.\n- Channels extracted from a MER can be saved as either separate textures or into\n  separate layers in a single texture.\n\n#### Export MER\n\n- Compiles metal, emissive and roughness channels into MER texture.\n- (Emissive colors will be lost upon export. Use grayscale values in emissive\n  channels for accurate brightness levels.)\n\n### Generate Normal Map\n\n- Calculate normal map based on the assigned or inferred height map for the\n  currently selected material/texture.\n\n### Generate Ambient Occlusion Map\n\n- Generate an AO map from the material's normal map. (AO available in some\n  labPBR shaders.)\n\n### Texture Baking\n\n- Bake a normal and emissive maps onto the base color channel.\n- Output multiple light positions.\n- Choose ambient light settings before baking.\n\n### Export Texture Set\n\n- Create a `.texture_set.json` file for the project textures.\n- Dialog allows defining values which can not be inferred from project.\n- Exports MER and normal maps in the process.\n\n### labPBR Specular/Normal Maps\n\n- Export `_s` and `_n` files for PBR textures created in Blockbench.\n- Decode existing, imported labPBR textures into PBR material channels.\n\n### Material Brush\n\n- Paint across multiple PBR channels simultaneously for a consistent material\n  output.\n- Save material brush presets to a collection.\n- Automatic PBR preview updates after every brush stroke.\n\n### Export USDZ Scenes\n\n- Adds new codec for exporting in USDZ format.\n\n### `.bbmat` Codec\n\nReuse and share PBR materials in Blockbench with this custom file format.\n\n## Usage\n\n### PBR Controls\n\nThis plugin adds the _PBR Controls_ panel, which controls enabling and disabling\nPBR materials in Blockbench previews.\n\n#### Toggle PBR\n\n- Use the _PBR Preview_ toggle to toggle or refresh the PBR preview. Also found\n  in the _View_ menu.\n\n> <details>\n> <summary>Usage Tip</summary>\n> Toggling the PBR preview off and on may solve any texture discrepancies. Allowing the scene to render again will ensure all textures are up-to-date in the preview.\n> </details>\n\n#### Toggle Corrected Lighting\n\n- Use the _Correct Lights_ toggle to enable or disable physically-corrected\n  lighting in the preview scene. This may improve the appearance of reflective\n  and emissive materials in the preview scene, but will dim the albedo/base\n  color texture.\n\n#### Tone Mapping\n\n- The _Tone Mapping_ select will apply various tone mapping techniques to the\n  preview scene. Use the _Linear_ option to match the tone map used by most\n  Bedrock shaders.\n\n#### Exposure\n\n- The scene exposure can be adjusted once a tone map technique is selected.\n  Values range from -2.0 to 2.0.\n\n### Channel Management\n\nControl which textures or texture layers are used for PBR channels using the\nfollowing methods:\n\n#### Create Material Texture\n\n- Use the _Create Material Texture_ action to create a blank texture with PBR\n  material layers initialized.\\\n  If an existing texture is selected, it will be used as the albedo channel in\n  the PBR material. If the project has other textures, include those textures in\n  the selection to have them automatically assigned to the new material's PBR\n  channels.\n\nFollow these naming conventions to ensure the textures are assigned to the\nappropriate channels when creating a new material:\n\n#### Channel Naming Convention\n\nThe plugin will assume that textures and layers which end in an underscore and a\nchannel name are intended to be used as that channel. For example,\n`texture_roughness` will be used as the roughness map unless the channel has\nbeen manually assigned a texture.\n\n##### Supported Channels\n\n| Channel     | Description           | Colorspace                                                        |\n| ----------- | --------------------- | ----------------------------------------------------------------- |\n| `ao`        | Ambient Occlusion     | **BW**                                                            |\n| `albedo`    | Albedo / Base Color   | **RGB**                                                           |\n| `normal`    | DirectX Normal Map    | **RGB**                                                           |\n| `metalness` | Metallic map          | **BW**                                                            |\n| `roughness` | Roughness map         | **BW**                                                            |\n| `emissive`  | Emissive map          | Displayed in **RGB**; Exported as **BW** in MER                   |\n| `sss`       | Subsurface Scattering | **BW**; Not supported by shader but exported in MER alpha channel |\n\n###### Supported Minecraft Shader Channels\n\nRenderDragon and labPBR textures are automatically decoded and displayed when\nthe channels can be inferred based on the existence of MER, specular, or normal\nmaps. Some features are not supported by the Blockbench preview's shader, such\nas AO and POM, but can still be decoded/encoded during texture import/export\n\n#### Explicit Channel Assignment\n\nCreate a Texture Layer in Blockbench to enable channel assignment in PBR\npreviews. Each channel can be selected from a menu and applied to the current\nmaterial. The menu is visible in the _PBR Controls_ panel when in Paint mode.\nThe menu options are available in the _Image_ menu, as well as in the context\nmenu of a texture or layer, and in the Layers panel.\n\n#### Removing Channel Assignment\n\nChannels can be disabled by hiding or deleting the layer, or un-assigning the\nchannel in the menu. Texture layers cannot be assigned to more than one channel.\nAssigning a layer to a new channel will clear the layer's current channel.\n\n#### Finding Assigned Channels\n\nSelect a texture with material layers assigned to reveal the _PBR Channels_\npanel. This panel displays the channels currently assigned in the selected\ntexture. Click a channel in the menu to have it selected in the Layers panel.\n\n### Material Brush Tool\n\nUse the _Material Brush Tool_ to paint across multiple PBR channels. The\ncontrols found in the _Material Brush Panel_.\n\n- Set the metallic, roughness and height values on a scale of 0% - 100%\n- Use the color picker in the _Material Brush Panel_ to set the emissive color.\n- The current color selected in the main color picker is used as the albedo\n  color.\n- Only visible layers with channels assigned will be updated by the brush.\n- Blockbench's paint brush size and smoothness settings control the material\n  brush's settings as well.\n\n#### Material Brush Presets\n\nOpen the _Material Brush Presets_ dialog to define and save new brush settings,\nor to select and apply existing presets. A material preview is generated upon\nsaving a preset. Select a preset to populate its values in the Material Brush\ninput controls.\n\n### `.bbmat` Files\n- Import Blockbench PBR materials by dropping a `.bbmat` file into a Blockbench project.\n  - The import option is also available in the _File_ menu.\n- Export existing materials from texture content menu to save its assigned channels together in one file."
  },
  {
    "path": "plugins/pbr_preview/changelog.json",
    "content": "{\n    \"1.0.0\": {\n        \"title\": \"1.0.0\",\n        \"date\": \"2024-05-25\",\n        \"author\": \"Jason J. Gardner\",\n        \"categories\": [\n            {\n                \"title\": \"PBR plugin\",\n                \"list\": [\n                    \"Initial release 🚀\"\n                ]\n            }\n        ]\n    },\n    \"1.1.0\": {\n        \"title\": \"1.1.0\",\n        \"date\": \"2024-06-10\",\n        \"author\": \"Jason J. Gardner\",\n        \"categories\": [\n            {\n                \"title\": \"Java Support\",\n                \"list\": [\n                    \"Added labPBR export option\",\n                    \"Added labPBR texture decoding\"\n                ]\n            },\n            {\n                \"title\": \"Material Brush\",\n                \"list\": [\n                    \"Added material brush tool\",\n                    \"Added material brush preset dialog\"\n                ]\n            }\n        ]\n    },\n    \"1.2.0\": {\n        \"title\": \"1.2.0\",\n        \"date\": \"2024-06-20\",\n        \"author\": \"Jason J. Gardner\",\n        \"categories\": [\n            {\n                \"title\": \"USDZ Export\",\n                \"list\": [\n                    \"Added USDZ export option\",\n                    \"Added normal map orientation options\",\n                    \"Created `.bbmat` codec\"\n                ]\n            }\n        ]\n    },\n    \"1.2.1\": {\n        \"title\": \"1.2.1\",\n        \"date\": \"2024-11-10\",\n        \"author\": \"Jason J. Gardner\",\n        \"categories\": [\n            {\n                \"title\": \"Alpha Threshold Fix\",\n                \"list\": [\n                    \"Fixed alpha test threshold application on models.\",\n                    \"Alpha test value is 1%\"\n                ]\n            }\n        ]\n    }\n}"
  },
  {
    "path": "plugins/pbr_preview/members.yml",
    "content": "maintainers:\n  - jasonjgardner\ndevelopers:\n  - jasonjgardner\n"
  },
  {
    "path": "plugins/pbr_preview/pbr_preview.js",
    "content": "\"use strict\";(()=>{var _=THREE,ie=Vue,le=window.JSZip;var F=\"1.2.2\",K=\"1.0.0\",N=\"_NONE_\",h={albedo:{id:\"albedo\",label:\"Albedo\",description:\"The color of the material\",map:\"map\",icon:\"tonality\",default:new _.Color(16777215),regex:new RegExp(\"(s|_)*(basecolor|color|albedo)\",\"i\")},metalness:{id:\"metalness\",label:\"Metalness\",description:\"The material's metalness map\",map:\"metalnessMap\",icon:\"brightness_6\",default:new _.Color(0),regex:new RegExp(\"[ _]*metal(lic|ness)?\",\"i\")},emissive:{id:\"emissive\",label:\"Emissive\",description:\"The material's emissive map\",map:\"emissiveMap\",icon:\"wb_twilight\",default:new _.Color(0),regex:new RegExp(\"[ _]*(emissive|emission)\",\"i\")},roughness:{id:\"roughness\",label:\"Roughness\",description:\"The material's roughness map\",map:\"roughnessMap\",icon:\"grain\",default:new _.Color(16777215),regex:new RegExp(\"[ _]*rough(ness)?\",\"i\")},height:{id:\"height\",label:\"Height\",description:\"The material's height map\",map:\"bumpMap\",icon:\"landscape\",default:new _.Color(16777215),regex:new RegExp(\"[ _]*(height|bump)\",\"i\")},normal:{id:\"normal\",label:\"Normal\",description:\"The material's normal map\",map:\"normalMap\",icon:\"looks\",default:new _.Color(\"rgb(128, 128, 255)\"),regex:new RegExp(\"[ _]*normal\",\"i\")},ao:{id:\"ao\",label:\"Ambient Occlusion\",description:\"The material's ambient occlusion map\",map:\"aoMap\",icon:\"motion_mode\",default:new _.Color(16777215),regex:new RegExp(\"[ _]*(ao|ambientocclusion|ambient occlusion)\",\"i\")}},o={},y=[],C=[];var ce=[...Object.keys(h).map(e=>h[e].id),N];y.push(()=>{o.channelProp=new Property(TextureLayer,\"enum\",\"channel\",{default:N,values:ce,label:\"PBR Channel\",exposed:!1}),o.textureChannelProp=new Property(Texture,\"enum\",\"channel\",{default:N,values:ce,label:\"PBR Channel\",exposed:!1}),o.materialTextureProp=new Property(Texture,\"boolean\",\"material\",{default:!1,label:\"Material Texture\"}),o.pbrMaterialsProp=new Property(ModelProject,\"object\",\"pbr_materials\",{default:{},exposed:!1,label:\"PBR Materials\"}),o.projectMaterialsProp=new Property(ModelProject,\"object\",\"bb_materials\",{default:{},exposed:!1,label:\"Project Materials\"}),o.projectPbrModeProp=new Property(ModelProject,\"boolean\",\"pbr_active\",{default:!1,exposed:!1,values:[],label:\"PBR Mode\"})});function E(){return Texture.selected?Texture.selected:TextureLayer.selected?TextureLayer.selected.texture:Project?Project.selected_texture?Project.selected_texture:Project.textures.find(e=>e.selected)??null:Texture.all.find(e=>e.selected)??Texture.getDefault()}function R(){return TextureLayer.selected?TextureLayer.selected:Texture.selected?.selected_layer?Texture.selected.selected_layer:Project.selected_texture!==null&&Project.selected_texture?.layers_enabled===!0?Project.selected_texture.layers.find(e=>e.selected)??Project.selected_texture.layers[0]:E()?.getActiveLayer()??null}function G(){return Project?Project.model_identifier.length>0?Project.model_identifier:Project.getDisplayName():pathToName(E()?.name??\"texture\")}function ue(e,a){let t;return function(...r){let n=()=>{t=void 0,e.apply(this,r)};clearTimeout(t),t=setTimeout(n,a)}}function z(e){let a=MediaPreview.renderer??new _.WebGLRenderer({alpha:!0,antialias:!0}),t=new _.Scene,r=new _.PerspectiveCamera(75,96/96,.1,1e3),n=new _.AmbientLight(16777215,.75);t.add(n);let i=new _.PointLight(16777215,1,100);i.position.set(5,5,5),t.add(i);let s=new _.SphereGeometry(1,32,32),l=e instanceof _.MeshStandardMaterial&&e.isMeshStandardMaterial?e:new _.MeshStandardMaterial({color:e.albedo,metalness:e.metalness??0,roughness:e.roughness??1,emissive:e.emissive,bumpScale:e.height??0,envMap:PreviewScene.active?.cubemap??null,envMapIntensity:.5}),u=new _.Mesh(s,l);t.add(u),r.position.x=0,r.position.y=0,r.position.z=2,a.setSize(96,96),a.render(t,r);let m=a.domElement.toDataURL();return l.dispose(),MediaPreview.renderer||(a.clear(),a.dispose()),m}function Y(e,a){let t=a??document.createElement(\"canvas\"),r=t.getContext(\"2d\");if(!r)return t.remove(),null;let n=Math.max(Project?Project.texture_width:16,16),i=Math.max(Project?Project.texture_height:16,16);t.width=n,t.height=i,r.fillStyle=`rgb(${e.r*255}, ${e.g*255}, ${e.b*255})`,r.fillRect(0,0,n,i);let s=t.toDataURL();return a||t.remove(),s}var Ve=(e=!0)=>{let a=Project?Project.textures??Texture.all:Texture.all;return e?a.filter(t=>t.layers_enabled&&t.layers.length>0).flatMap(t=>t.layers):a},D=class e{constructor(a,t){this._scope=a??Ve(),this._materialUuid=t}merToCanvas(){let a=this.getTexture(h.emissive),t=this.getTexture(h.roughness),r=this.getTexture(h.metalness);if(!a&&!t&&!r){let{metalness:n,emissive:i,roughness:s}=this.decodeMer();n&&(r=e.makePixelatedCanvas(n)),i&&(a=e.makePixelatedCanvas(i)),s&&(t=e.makePixelatedCanvas(s))}return{emissiveMap:a,roughnessMap:t,metalnessMap:r}}getMaterial(a={}){let{emissiveMap:t,roughnessMap:r,metalnessMap:n}=Format.id.startsWith(\"bedrock\")?this.merToCanvas():{emissiveMap:this.getTexture(h.emissive),roughnessMap:this.getTexture(h.roughness),metalnessMap:this.getTexture(h.metalness)},i=this.getTexture(h.normal);return new _.MeshStandardMaterial({map:this.getTexture(h.albedo)??e.makePixelatedCanvas(TextureLayer.selected?.canvas??Texture.all.find(s=>s.selected)?.canvas??Texture.getDefault().canvas),aoMap:this.getTexture(h.ao),bumpMap:this.getTexture(h.height),normalMap:i,metalnessMap:n,metalness:n?1:0,roughnessMap:r,roughness:1,emissiveMap:t,emissiveIntensity:t?1:0,emissive:t?16777215:0,envMap:PreviewScene.active?.cubemap??null,envMapIntensity:.95,alphaTest:.01,transparent:!0,...a})}renderMaterialPreview(){return z(this.getMaterial())}saveTexture(a,t){Project&&(Project.pbr_materials||(Project.pbr_materials={}),Project.pbr_materials[this._materialUuid]||(Project.pbr_materials[this._materialUuid]={}),Project.pbr_materials[this._materialUuid][a.id]=t.uuid,t.extend({channel:a.id}))}findTexture(a,t=!0){if(!Project)return null;let r=this._scope.find(u=>u.channel&&(u.channel===a||u.channel===a.id));if(r)return r;let[n,i]=typeof a==\"string\"?[a,new RegExp(`_*${a}(.[^.]+)?$`,\"i\")]:[a.id,a.regex??new RegExp(`_*${a.id}(.[^.]+)?$`,\"i\")];Project.pbr_materials=Project.pbr_materials??{};let s=Project.pbr_materials[this._materialUuid];if(t&&!s?.length&&n!==N)return this._scope.find(u=>i.test(u.name))??null;let l=s?.[n];return l?this._scope.find(u=>u.uuid===l)??null:null}static makePixelatedCanvas(a){let t=new _.CanvasTexture(a,void 0,void 0,void 0,_.NearestFilter,_.NearestFilter);return t.needsUpdate=!0,t}getTexture(a){let t=this.findTexture(a);return t?e.makePixelatedCanvas(t.canvas):null}static extractChannel(a,t){let r=a.canvas,{width:n,height:i}=r,s=r.getContext(\"2d\");if(!s||!n||!i)return null;let l=document.createElement(\"canvas\");l.width=n,l.height=i;let u=l.getContext(\"2d\");if(!u)return null;let m={r:0,g:1,b:2,a:3}[t],{data:d}=s.getImageData(0,0,n,i),c=new Uint8ClampedArray(n*i*4);for(let g=0;g<d.length;g+=4){let x=d[g+m];c[g]=x,c[g+1]=x,c[g+2]=x,c[g+3]=255}let v=new ImageData(c,n,i);return u.putImageData(v,0,0),l}decodeMer(a=1){let t=this.findTexture(\"mer\",!0);if(!t)return{metalness:null,emissive:null,emissiveLevel:null,roughness:null,sss:null};let r=e.extractChannel(t,\"r\"),n=e.extractChannel(t,\"g\"),i=e.extractChannel(t,\"b\"),s=e.extractChannel(t,\"a\"),l=document.createElement(\"canvas\");l.width=t.img.width??16,l.height=t.img.height??16;let u=this.findTexture(h.albedo);u&&(l.width=u.img.width??16,l.height=u.img.height??16);let m=l.getContext(\"2d\"),d=n?.getContext(\"2d\"),c=u?.canvas?.getContext(\"2d\");if(!m||!c||!d)return{metalness:r,emissive:n,roughness:i,sss:s};let v=c.getImageData(0,0,l.width,l.height),g=d.getImageData(0,0,l.width,l.height),x=new Uint8ClampedArray(l.width*l.height*4);for(let f=0;f<v.data.length;f+=4){if(g.data[f]>a){x[f]=v.data[f],x[f+1]=v.data[f+1],x[f+2]=v.data[f+2],x[f+3]=255;continue}x[f]=0,x[f+1]=0,x[f+2]=0,x[f+3]=255}return m.putImageData(new ImageData(x,l.width,l.height),0,0),{metalness:r,emissive:l,emissiveLevel:n,roughness:i,sss:s}}createMer(a=!1){let t=this.findTexture(h.metalness,a),r=this.findTexture(h.emissive,a),n=this.findTexture(h.roughness,a),i=this.findTexture(\"sss\",!1),s=Math.max(t?.img.width??0,r?.img.width??0,n?.img.width??0,Project?Project.texture_width:0,16),l=Math.max(t?.img.height??0,r?.img.height??0,n?.img.height??0,Project?Project.texture_height:0,16),u=document.createElement(\"canvas\");u.width=s,u.height=l;let m=u.getContext(\"2d\");if(!m)return null;let d=t?.img?e.extractChannel(t,\"r\"):null,c=r?.img?e.extractChannel(r,\"g\"):null,v=n?.img?e.extractChannel(n,\"b\"):null,g=i&&i?.img?e.extractChannel(i,\"a\"):null,x=d?.getContext(\"2d\")?.getImageData(0,0,s,l)??new ImageData(s,l),f=c?.getContext(\"2d\")?.getImageData(0,0,s,l)??new ImageData(s,l),p=v?.getContext(\"2d\")?.getImageData(0,0,s,l)??new ImageData(s,l),b=g?.getContext(\"2d\")?.getImageData(0,0,s,l)??new ImageData(new Uint8ClampedArray(s*l*4).fill(255),s,l),M=new Uint8ClampedArray(s*l*4);for(let w=0;w<M.length;w+=4)M[w]=x.data[w],M[w+1]=f.data[w],M[w+2]=p.data[w],M[w+3]=b.data[w];return m.putImageData(new ImageData(M,s,l),0,0),u}createLabPbrOutput(a=!0){let t=this.findTexture(h.metalness,a),r=this.findTexture(h.emissive,a),n=this.findTexture(h.roughness,a),i=this.findTexture(h.normal,a),s=this.findTexture(h.height,a),l=this.findTexture(h.ao,!1),u=this.findTexture(\"sss\",!0),m=this.findTexture(\"porosity\",!0),d=Math.max(t?.img.width??0,r?.img.width??0,n?.img.width??0,Project?Project.texture_width:0,16),c=Math.max(t?.img.height??0,r?.img.height??0,n?.img.height??0,Project?Project.texture_height:0,16),v=document.createElement(\"canvas\");v.width=d,v.height=c;let g=v.getContext(\"2d\"),x=document.createElement(\"canvas\");x.width=d,x.height=c;let f=x.getContext(\"2d\");if(!g||!f)return null;let p=new Uint8ClampedArray(d*c*4),b=new Uint8ClampedArray(d*c*4),M=t?.canvas,w=r?.canvas,S=n?.canvas,T=u?.canvas,P=m?.canvas,L=M?.getContext(\"2d\"),j=w?.getContext(\"2d\"),H=S?.getContext(\"2d\"),I=T?.getContext(\"2d\"),ke=P?.getContext(\"2d\"),De=L?.getImageData(0,0,d,c),O=j?.getImageData(0,0,d,c),ne=H?.getImageData(0,0,d,c),Se=I?.getImageData(0,0,d,c),je=ke?.getImageData(0,0,d,c);for(let k=0;k<p.length;k+=4){let oe=ne?1-Math.sqrt(ne.data[k]/255):0,Oe=Math.min(229,Math.max(0,Math.round((De?.data[k]??oe)*229))),Fe=je?.data[k],Ge=Se?.data[k];if(p[k]=oe*255,p[k+1]=Oe,p[k+2]=Ge??Fe??0,!O){p[k+3]=255;continue}let ze=Math.round((O?.data[k]+O?.data[k+1]+O?.data[k+2])/3);p[k+3]=ze||255}g.putImageData(new ImageData(p,d,c),0,0);let Be=i?.canvas,Ne=l?.canvas,Re=s?.canvas,Ae=Be?.getContext(\"2d\"),Ie=Ne?.getContext(\"2d\"),He=Re?.getContext(\"2d\"),se=Ae?.getImageData(0,0,d,c),$e=Ie?.getImageData(0,0,d,c),Ue=He?.getImageData(0,0,d,c);for(let k=0;k<b.length;k+=4)b[k]=se?.data[k]??0,b[k+1]=se?.data[k+1]??0,b[k+2]=$e?.data[k+2]??255,b[k+3]=Ue?.data[k+3]||255;return f.putImageData(new ImageData(b,d,c),0,0),{specular:v,normalMap:x}}decodeLabPbrNormal(a){let t=a.img.width??16,r=a.img.height??16,n=a.canvas.getContext(\"2d\");if(!n)return{};let i=document.createElement(\"canvas\");i.width=t,i.height=r;let s=document.createElement(\"canvas\");s.width=t,s.height=r;let l=document.createElement(\"canvas\");l.width=t,l.height=r;let u=i.getContext(\"2d\"),m=s.getContext(\"2d\"),d=l.getContext(\"2d\"),{data:c}=n.getImageData(0,0,t,r);if(!c||!u||!m||!d)return{};let v=new Uint8ClampedArray(t*r*4),g=new Uint8ClampedArray(t*r*4),x=new Uint8ClampedArray(t*r*4);for(let f=0;f<c.length;f+=4){let p=f+1,b=f+2,M=f+3;v[f]=c[b],v[p]=c[b],v[b]=c[b],v[M]=255,g[f]=c[f],g[p]=c[p],g[b]=255,g[M]=255,x[f]=c[M],x[p]=c[M],x[b]=c[M],x[M]=255}return u.putImageData(new ImageData(v,t,r),0,0),m.putImageData(new ImageData(g,t,r),0,0),d.putImageData(new ImageData(x,t,r),0,0),{ao:i,normal:s,heightmap:l}}decodeLabPbrSpecular(a){let t=a.img.width??16,r=a.img.height??16,n=a.canvas.getContext(\"2d\");if(!n)return{};let i=document.createElement(\"canvas\");i.width=t,i.height=r;let s=document.createElement(\"canvas\");s.width=t,s.height=r;let l=document.createElement(\"canvas\");l.width=t,l.height=r;let u=document.createElement(\"canvas\");u.width=t,u.height=r;let m=document.createElement(\"canvas\");m.width=t,m.height=r;let d=i.getContext(\"2d\"),c=s.getContext(\"2d\"),v=l.getContext(\"2d\"),g=u.getContext(\"2d\"),x=m.getContext(\"2d\"),{data:f}=n.getImageData(0,0,t,r);if(!f||!d||!c||!v||!g||!x)return{};let p=new Uint8ClampedArray(t*r*4),b=new Uint8ClampedArray(t*r*4),M=new Uint8ClampedArray(t*r*4),w=new Uint8ClampedArray(t*r*4),S=new Uint8ClampedArray(t*r*4);for(let T=0;T<f.length;T+=4){let P=T+1,L=T+2,j=T+3;M[T]=255-f[T],M[P]=255-f[T],M[L]=255-f[T],M[j]=255,p[T]=f[P],p[P]=f[P],p[L]=f[P],p[j]=255,b[T]=f[j],b[P]=f[j],b[L]=f[j],b[j]=255,w[T]=0,w[P]=0,w[L]=0,w[j]=255,S[T]=f[L],S[P]=f[L],S[L]=f[L],S[j]=255,f[L]<65&&(w[T]=f[L],w[P]=f[L],w[L]=f[L],w[j]=255,S[T]=0,S[P]=0,S[L]=0,S[j]=255)}return d.putImageData(new ImageData(p,t,r),0,0),c.putImageData(new ImageData(b,t,r),0,0),v.putImageData(new ImageData(M,t,r),0,0),g.putImageData(new ImageData(w,t,r),0,0),x.putImageData(new ImageData(S,t,r),0,0),{metalness:i,emissive:s,roughness:l,sss:u,porosity:m}}createTexturesFromSpecular(a){let t=this.decodeLabPbrSpecular(a);return Object.entries(t).forEach(([r,n])=>{n&&new Texture({name:`${a.name}_${r}`,saved:!1,particle:!1,keep_size:!1}).fromDataURL(n.toDataURL()).add()}),t}createTexturesFromNormal(a){let t=this.decodeLabPbrNormal(a);return Object.entries(t).forEach(([r,n])=>{n&&new Texture({name:`${a.name}_${r}`,saved:!1,particle:!1,keep_size:!1}).fromDataURL(n.toDataURL()).add()}),t}};var V=class{constructor({lightHeight:a=.66,ambientLight:t=[.1,.1,.1],minLightIntensity:r=0,lightDiffuse:n=[1,1,1]}={}){this.lightHeight=a,this.ambientLight=t,this.minLightIntensity=r,this.lightDiffuse=n}bake(a,t,r){let n=t instanceof HTMLCanvasElement?t:this.createCanvas(t.width,t.height),i=r instanceof HTMLCanvasElement?r:this.createCanvas(r.width,r.height),s=n.getContext(\"2d\"),l=i.getContext(\"2d\");s.drawImage(t,0,0),l.drawImage(r,0,0);let u=s.getImageData(0,0,t.width,t.height),m=l.getImageData(0,0,r.width,r.height),d=[],c=[];for(let g=0;g<m.width;++g){c[g]=[];for(let x=0;x<m.height;++x){let f=(g+x*m.width)*4,p=[(m.data[f+0]/255-.5)*2,(m.data[f+1]/255-.5)*2,(m.data[f+2]/255-.5)*2],b=Math.sqrt(p[0]**2+p[1]**2+p[2]**2);c[g][x]=[p[0]/b,p[1]/b,p[2]/b]}}let v=g=>{let x=this.createCanvas(t.width,t.height),f=x.getContext(\"2d\"),p=f.getImageData(0,0,x.width,x.height),b=[Math.cos(g),Math.sin(g),this.lightHeight];for(let M=0;M<m.width;++M)for(let w=0;w<m.height;++w){let S=c[M][w],T=(M+w*m.width)*4,P=[u.data[T+0]/255,u.data[T+1]/255,u.data[T+2]/255,u.data[T+3]],L=S[0]*b[0]+S[1]*b[1]+S[2]*b[2];L=Math.min(1,Math.max(this.minLightIntensity,L));let j=[L*P[0]*this.lightDiffuse[0]+this.ambientLight[0],L*P[1]*this.lightDiffuse[1]+this.ambientLight[1],L*P[2]*this.lightDiffuse[2]+this.ambientLight[2],P[3]];p.data[T+0]=Math.floor(j[0]*255),p.data[T+1]=Math.floor(j[1]*255),p.data[T+2]=Math.floor(j[2]*255),p.data[T+3]=j[3]}return f.putImageData(p,0,0),x};for(let g=0;g<a;++g){let x=Math.PI*2/a*g;d.push(v(x))}return d}createCanvas(a,t){let r=document.createElement(\"canvas\");return r.width=a,r.height=t,r}};var me=(e,a=8,t=!1)=>{if(!Project)return;let r=Project.selected_texture??Texture.getDefault(),n=new D(r.layers_enabled?r.layers:Project.textures,r.uuid),i=n.findTexture(h.albedo);if(!i){Blockbench.showStatusMessage(\"Can not bake without a base color assigned.\",3e3);return}let s=n.findTexture(h.normal);if(!s){Blockbench.showStatusMessage(\"Can not bake without a normal map assigned.\",3e3);return}let u=new V(e).bake(a,i.canvas,s.canvas),m=new Texture({name:`${i.name}_baked`,saved:!1,particle:!1,keep_size:!1,layers_enabled:!0}).fromDataURL(u[0].toDataURL()),d=t?c=>{let v=n.findTexture(h.emissive);if(!v)return c;let g=v.canvas;if(!g.getContext(\"2d\"))return c;let f=Math.max(c.width,g.width,Project?Project.texture_width:16),p=Math.max(c.height,g.height,Project?Project.texture_height:16),b=document.createElement(\"canvas\");b.width=f,b.height=p;let M=b.getContext(\"2d\");return M?(M.drawImage(c,0,0),M.globalCompositeOperation=\"screen\",M.drawImage(g,0,0),b):c}:c=>c;u.forEach((c,v)=>{new TextureLayer({name:`baked_${v+1}`,data_url:d(c).toDataURL()},m).addForEditing()}),m.add().select(),Blockbench.showQuickMessage(\"Textures baked \\u{1F950}\",2e3)};y.push(()=>{o.bakeTexturesDialog=new Dialog(\"bake_textures\",{id:\"bake_textures\",title:\"Bake Textures\",buttons:[\"Bake\",\"Cancel\"],form:{ambientLight:{type:\"color\",label:\"Ambient Light\",value:\"#1f1f1f\"},lightDiffuse:{type:\"color\",label:\"Light Diffuse\",value:\"#ffffff\"},lightHeight:{type:\"range\",label:\"Light Height\",min:0,max:1,step:.01,value:.66},minLightIntensity:{type:\"range\",label:\"Minimum Light Intensity\",min:0,max:1,step:.01,value:0},directions:{type:\"number\",label:\"Directions\",value:8,min:1,max:360,step:1},blendEmissive:{type:\"checkbox\",label:\"Blend Emissive\",value:!1}},onConfirm(e){let a=new _.Color(e.ambientLight.toString()),t=new _.Color(e.lightDiffuse.toString());me({ambientLight:[a.r,a.g,a.b],lightDiffuse:[t.r,t.g,t.b],lightHeight:Number(e.lightHeight),minLightIntensity:Number(e.minLightIntensity)},e.directions??8,e.blendEmissive??!1)}}),o.bakeTexturesAction=new Action(\"bake_textures\",{icon:\"cake\",name:\"Bake Textures\",description:\"Bakes textures for the selected PBR material\",click(){o.bakeTexturesDialog?.show()}}),MenuBar.addAction(o.bakeTexturesAction,\"tools\")});C.push(()=>{MenuBar.removeAction(\"tools.bake_textures\")});function de(e,a){let t=e.getTexture();if(!t||!Project)return null;let r=Project.materials[t.uuid];r.isShaderMaterial&&!Project.bb_materials[t.uuid]?Project.bb_materials[t.uuid]=r:r.isMeshStandardMaterial&&r.dispose();let n=new D(t.layers_enabled?t.layers.filter(i=>i.visible)??null:Project.textures,t.uuid).getMaterial({side:Canvas.getRenderSide(t),...a,alphaTest:.01});return Project.materials[t.uuid]=_.ShaderMaterial.prototype.copy.call(n,r),t}function Qe(e){return Object.values(e).filter(a=>a?(Canvas.updateAllFaces(a),!0):!1).length>0}function Je(e,a){let t={};return e.forAllFaces(r=>{let n=de(r,a);n&&(t[n.uuid]=n)}),t}function Xe(e,a){let t={};return Object.keys(e.faces).forEach(r=>{let n=e.faces[r],i=de(n,a);i&&(t[i.uuid]=i)}),t}var B=(e={})=>{if(!Project)return;let t=Project.elements.map(r=>r instanceof Mesh&&Je(r,e)||r instanceof Cube&&Xe(r,e)).reduce((r,n)=>({...r,...n}),{});Project.pbr_active=Texture.all.length>0&&t&&Qe(t)},A=(e=100)=>ue(B,e);var te={},ee=()=>Condition({modes:[\"edit\",\"paint\"],selected:{texture:!0},project:!0,method(){let e=E();return e&&!e.material?!0:e?.material===!0&&R()!==null&&Modes.paint}}),he=()=>Condition({modes:[\"paint\",\"edit\"],selected:{texture:!0},method(){let e=E();if(e?.material&&Modes.edit)return!1;let a=R()??e;return a?.channel&&a.channel!==N}});y.push(()=>{Object.entries(h).forEach(([e,a])=>{te[e]=new Action(`assign_channel_${e}`,{icon:a.icon??\"tv_options_edit_channels\",name:`Assign to ${a.label.toLocaleLowerCase()} channel`,description:`Assign the selected layer to the ${a.label} channel`,category:\"textures\",condition:ee,click(){let t=TextureLayer.selected??(Project?Project.selected_texture:null);if(!t)return;Undo.initEdit({layers:[t]}),t.extend({channel:a.id});let r=t instanceof TextureLayer?t.texture:t;r.updateChangesAfterEdit(),Project.pbr_materials[r.uuid]||(Project.pbr_materials[r.uuid]={}),Object.entries(Project.pbr_materials[r.uuid]).forEach(([n,i])=>{i===t.uuid&&(delete Project.pbr_materials[r.uuid][n],t.channel=N)}),r.uuid===t.uuid&&(Project.pbr_materials[r.uuid]={}),Project.pbr_materials[r.uuid][e]=t.uuid,Undo.finishEdit(\"Change channel assignment\"),Blockbench.showQuickMessage(`Assigned \"${t.name}\" to ${a.label} channel`,2e3),B()}})})});C.push(()=>{Object.values(te).forEach(e=>{e.delete()})});y.push(()=>{o.unassignChannel=new Action(\"unassign_channel\",{icon:\"cancel\",name:\"Unassign Channel\",description:\"Unassign the selected layer from the channel\",category:\"textures\",condition:he,click(){let e=TextureLayer.selected??(Project?Project.selected_texture:null);if(!e)return;Undo.initEdit({layers:[e]});let a=e instanceof TextureLayer?e.texture:e,t=e.channel;Project.pbr_materials[a.uuid]={},e.channel=N,a.updateChangesAfterEdit(),Undo.finishEdit(\"Unassign channel\"),Blockbench.showQuickMessage(`Unassigned \"${e.name}\" from ${t} channel`,2e3),A()}}),o.channelMenu=new Menu(\"channel_menu\",[...Object.keys(h).map(e=>`assign_channel_${e}`),\"unassign_channel\"],{onOpen(){A()}}),o.openChannelMenu=new Action(\"pbr_channel_menu\",{name:\"Assign to PBR Channel\",icon:\"texture\",condition:()=>ee()||he(),click(e){o.channelMenu?.open(e)},children:[...Object.values(te),o.unassignChannel]}),o.showChannelMenu=new Action(\"show_channel_menu\",{icon:\"texture\",name:\"Assign to PBR Channel\",description:\"Assign the selected layer to a channel\",category:\"textures\",condition:ee,click(e){o.channelMenu?.open(e)}}),o.openChannelMenu&&(MenuBar.addAction(o.openChannelMenu,\"image.0\"),Texture.prototype.menu.addAction(o.openChannelMenu,\"0\"),TextureLayer.prototype.menu.addAction(o.openChannelMenu,\"0\")),Toolbars.layers.add(o.showChannelMenu,1)});C.push(()=>{MenuBar.removeAction(\"image.pbr_channel_menu\"),Texture.prototype.menu.removeAction(\"pbr_channel_menu\"),TextureLayer.prototype.menu.removeAction(\"pbr_channel_menu\"),Toolbars.layers.remove(o.showChannelMenu)});function $(e,a=\"DirectX\",t=!1){let r=e.canvas.getContext(\"2d\");if(!r)return null;let n=Math.max(e.img.width??e.canvas.width,Project?Project.texture_width:0,16),i=Math.max(e.img.height??e.canvas.height,Project?Project.texture_height:0,16),{data:s}=r.getImageData(0,0,n,i),l=document.createElement(\"canvas\"),u=l.getContext(\"2d\");if(!u)return null;let m=(p,b)=>{let M=(p+b*n)*4;return s[M]/255};l.width=n,l.height=i,u.drawImage(e.img,0,0,n,i);let d=u.getImageData(0,0,n,i),c=d.data,v=p=>{let b=Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);return[p[0]/b,p[1]/b,p[2]/b]};for(let p=0;p<i;p++)for(let b=0;b<n;b++){let M=m(Math.max(b-1,0),p),w=m(Math.min(b+1,n-1),p),S=m(b,Math.max(p-1,0)),T=m(b,Math.min(p+1,i-1)),P=w-M,L=T-S,j=a===\"DirectX\"?[P,L,1]:[-P,-L,1],H=v(j),I=(p*n+b)*4;c[I]=(H[0]+1)/2*255,c[I+1]=(H[1]+1)/2*255,c[I+2]=(H[2]+1)/2*255,c[I+3]=t?m(b,p)*255:255}u.putImageData(d,0,0);let g=l.toDataURL(),x=`${e.name.replace(/_height(map)?/i,\"\")}_normal`;if(e instanceof TextureLayer){let p=new TextureLayer({name:x,data_url:g,visible:!0},e.texture);return p.addForEditing(),p}let f=new Texture({name:x,saved:!1,particle:!1}).fromDataURL(g);return Project&&f.add(),f}function pe(e){let a=e.canvas.getContext(\"2d\");if(!a)return null;let t=Math.max(e.img.width??e.canvas.width,Project?Project.texture_width:0,16),r=Math.max(e.img.height??e.canvas.height,Project?Project.texture_height:0,16),{data:n}=a.getImageData(0,0,t,r),i=document.createElement(\"canvas\"),s=i.getContext(\"2d\");if(!s)return null;let l=(g,x)=>{let f=(g+x*t)*4;return n[f]/255};i.width=t,i.height=r,s.drawImage(e.img,0,0,t,r);let u=s.getImageData(0,0,t,r),m=u.data;for(let g=0;g<r;g++)for(let x=0;x<t;x++){let f=l(Math.max(x-1,0),g),p=l(Math.min(x+1,t-1),g),b=l(x,Math.max(g-1,0)),M=l(x,Math.min(g+1,r-1)),w=p-f,S=M-b,T=Math.sqrt(w*w+S*S)*255,P=(g*t+x)*4;m[P]=T,m[P+1]=T,m[P+2]=T,m[P+3]=255}s.putImageData(u,0,0);let d=i.toDataURL(),c=`${e.name.replace(/_height(map)?/i,\"\")}_ao`;if(e instanceof TextureLayer){let g=new TextureLayer({name:c,data_url:d,visible:!0},e.texture);return g.addForEditing(),g}let v=new Texture({name:c,saved:!1,particle:!1,keep_size:!1}).fromDataURL(d);return Project&&v.add(),v}var ge=(e,a=\"DirectX\")=>{let t=R()??E()??Texture.getDefault();if(!t)return;let r=$(t,a,!1);if(!r){Blockbench.showQuickMessage(\"Failed to generate normal map\",2e3);return}r.select(e),new D(t instanceof Texture&&t.layers_enabled?t.layers:null,t.uuid).saveTexture(h.normal,r),Blockbench.showQuickMessage(\"Normal map generated\",2e3)};y.push(()=>{o.generateDirectXNormal=new Action(\"generate_dx_normal\",{icon:h.normal.icon??\"altitude\",name:\"Generate DirectX Normal Map\",description:\"Generates a DirectX normal map from the height map\",condition:()=>(R()??E())!==null,click:e=>ge(e)}),o.generateOpenGlNormal=new Action(\"generate_opengl_normal\",{icon:h.normal.icon??\"altitude\",name:\"Generate OpenGL Normal Map\",description:\"Generates an OpenGL normal map from the height map\",condition:()=>(R()??E())!==null,click:e=>ge(e,\"OpenGL\")}),o.generateAo=new Action(\"generate_ao\",{icon:h.ao.icon??\"motion_mode\",name:\"Generate Ambient Occlusion Map\",description:\"Generates an ambient occlusion map from the height map\",condition:{selected:{texture:!0},project:!0},click(){let e=R()??E()??Texture.getDefault();if(!e)return;let a=new D(e instanceof Texture&&e.layers_enabled?e.layers:null,e.uuid),t=a.findTexture(h.normal)??$(e);if(!t){Blockbench.showQuickMessage(\"Unable to generate ambient occlusion map without a normal map\",2e3);return}let r=pe(t);if(r){a.saveTexture(h.ao,r),r.select(),Blockbench.showQuickMessage(\"Ambient occlusion map generated\",2e3);return}Blockbench.showQuickMessage(\"Failed to generate ambient occlusion map\",2e3)}}),o.generateNormal=new Action(\"generate_normal\",{children:[o.generateDirectXNormal,o.generateOpenGlNormal],name:\"Generate Normal Map\",description:\"Generates a normal map from the height map\",condition:()=>(R()??E())!==null,click(){},icon:h.normal.icon??\"altitude\"}),MenuBar.addAction(o.generateNormal,\"tools\"),MenuBar.addAction(o.generateAo,\"tools\")});C.push(()=>{MenuBar.removeAction(\"tools.generate_normal\"),MenuBar.removeAction(\"tools.generate_ao\")});var Ze=(e,a=\"texture\")=>{e.toBlob(async t=>{t&&Blockbench.export({content:await t.arrayBuffer(),type:\"PNG\",name:`${a}_n`,extensions:[\"png\"],resource_id:\"normal_map\",savetype:\"image\"})})},We=(e,a=\"texture\")=>{e.toBlob(async t=>{t&&Blockbench.export({content:await t.arrayBuffer(),type:\"PNG\",name:`${a}_s`,extensions:[\"png\"],resource_id:\"specular_map\",savetype:\"image\"})})};y.push(()=>{o.generateLabPbr=new Action(\"generate_lab_pbr\",{icon:\"experiment\",name:\"Generate labPBR textures\",description:\"Generate a specular and normal map in labPBR format for Java shaders\",condition:{formats:[\"java_block\"],project:!0},async click(){let e=E();if(!e)return;let t=new D(e.layers_enabled?e.layers:[e],e.uuid).createLabPbrOutput();if(t===null)return;let r=e.name??(Project?Project.getDisplayName():\"texture\");await Promise.all([Ze(t.normalMap,pathToName(r)),We(t.specular,pathToName(r))]),Blockbench.showQuickMessage(\"Exported labPBR textures\")}}),o.decodeLabPbr=new Action(\"decode_lab_pbr\",{icon:\"frame_source\",name:\"Decode labPBR textures\",description:\"Decodes the selected texture into a specular or normal map in labPBR format\",condition:{formats:[\"java\"],project:!0,selected:{texture:!0}},click(){let e=TextureLayer.selected?.texture??Texture.all.find(t=>t.selected)??Texture.getDefault(),a=new D(e.layers_enabled?e.layers:[e],e.uuid);if(pathToName(e.name).endsWith(\"_n\")){a.createTexturesFromNormal(e);return}if(pathToName(e.name).endsWith(\"_s\")){a.createTexturesFromSpecular(e);return}Blockbench.showQuickMessage(\"Failed to decode labPBR texture\")}}),MenuBar.addAction(o.generateLabPbr,\"file.export\"),MenuBar.addAction(o.decodeLabPbr,\"tools\")});C.push(()=>{MenuBar.removeAction(\"file.export.generate_lab_pbr\")});y.push(()=>{o.createMaterialTexture=new Action(\"create_material_texture\",{icon:\"deployed_code\",name:\"Create Material Texture\",description:\"Creates a new texture for a PBR material\",condition:{modes:[\"edit\",\"paint\"],project:!0},click(){if(!Project)return;let e={...h},a=new Texture({name:\"New Material\",saved:!1,particle:!1});a.extend({material:!0});let t=Texture.all.filter(s=>(s.selected||s.multi_selected)&&!s.material)??Texture.all,r=E(),n=r?new D(t,r.uuid):null;try{let s=n?.findTexture(h.albedo,!0)?.canvas.toDataURL()??r?.canvas.toDataURL()??Y(new _.Color(8421504),a.canvas);if(!s)return;a.fromDataURL(s);let l=new TextureLayer({name:e.albedo.label,visible:!0,data_url:s,keep_size:!0},a);l.extend({channel:e.albedo.id}),l.addForEditing(),l.texture.updateChangesAfterEdit(),n?.saveTexture(e.albedo,l),delete e.albedo}catch(s){console.warn(\"Failed to create base color texture\",s),Blockbench.showStatusMessage(\"Failed to create base color texture in new material\",3e3)}let i=Object.keys(e).reverse().map(s=>{let l=h[s],u=n?.findTexture(l,!0),m=u?u.canvas.toDataURL():Y(l.default??new _.Color(0));if(!m)return;let d=new TextureLayer({name:l.label,visible:!0,data_url:m,keep_size:!0},a);return d.extend({channel:l.id}),n?.saveTexture(l,d),d}).filter(Boolean);Undo.initEdit({textures:Texture.all,layers:i}),a.add().select(),a.activateLayers(),i.map(s=>{s.addForEditing(),a.width=Math.max(a.width,s.img.width),a.height=Math.max(a.height,s.img.height)}),a.updateChangesAfterEdit(),Undo.finishEdit(\"Create Material Texture\")}}),MenuBar.addAction(o.createMaterialTexture,\"tools\"),Toolbars.texturelist.add(o.createMaterialTexture,3)});C.push(()=>{MenuBar.removeAction(\"tools.create_material_texture\"),Toolbars.texturelist.remove(\"create_material_texture\")});var Q=(e,a)=>{let t=E()??Texture.getDefault(),r=new D(t.layers_enabled?t.layers:Project?Project.textures:null,t.uuid).createMer(!0);if(!r)throw new Error(\"Failed to generate MER map from selected texture.\");r.toBlob(async n=>{if(!n)throw new Error(\"Failed to save MER map.\");let[i,s]=Project?[e?`${e}_mer`:`${t.name??Project.getDisplayName()}_mer`,Project.export_path]:[\"mer\"];Blockbench.export({content:await n.arrayBuffer(),type:\"PNG\",name:i,extensions:[\"png\"],resource_id:\"mer\",savetype:\"image\",startpath:s},a)})};y.push(()=>{o.generateMer=new Action(\"create_mer\",{icon:\"lightbulb_circle\",name:\"Export MER\",description:\"Exports a texture map from the metalness, emissive, and roughness channels. (For use in Bedrock resource packs.)\",condition:{formats:[\"bedrock\",\"bedrock_block\"],project:!0},click(){try{Q()}catch(e){console.error(\"Failed to export MER map:\",e),Blockbench.showStatusMessage(\"Failed to export MER map\",3e3)}}}),o.decodeMer=new Action(\"decode_mer\",{name:\"Decode MER\",icon:\"arrow_split\",condition:{formats:[\"bedrock\",\"bedrock_block\"],project:!0,selected:{texture:!0}},children:[{icon:\"move_item\",name:\"Decode MER to Textures\",description:\"Decodes a MER texture map into metalness, emissive, and roughness channels into separate textures\",click(){let e=E()??Texture.getDefault(),a=new D([e],e.uuid),t=a.decodeMer(),r=[h.metalness,h.emissive,h.roughness];Undo.initEdit({textures:[e]}),r.forEach(n=>{let i=n.id,s=t[i];if(!s){Blockbench.showStatusMessage(`Failed to decode ${n.label} channel`,3e3);return}let l=new Texture({name:`${e?.name}_${i}`,keep_size:!1}).fromDataURL(s.toDataURL());l.add(!0),a.saveTexture(n,l)}),Undo.finishEdit(\"Decode MER to textures\")}},{icon:\"move_group\",name:\"Decode MER to Layers\",description:\"Decodes a MER texture map into metalness, emissive, and roughness channels into material layers\",condition:()=>E()?.layers_enabled===!0,click(){let e=E()??Texture.getDefault(),a=new D(e.layers_enabled?e.layers:[e],e.uuid),t=a.decodeMer(),r=[h.metalness,h.emissive,h.roughness];Undo.initEdit({textures:[e]}),r.forEach(n=>{let i=n.id,s=t[i];if(!s){Blockbench.showStatusMessage(`Failed to decode ${n.label} channel`,3e3);return}let l=new TextureLayer({name:`${e?.name}_${i}`,data_url:s.toDataURL()},e);a.saveTexture(n,l),l.addForEditing()}),Undo.finishEdit(\"Decode MER to layers\")}}],click(){}}),MenuBar.addAction(o.decodeMer,\"tools\"),MenuBar.addAction(o.generateMer,\"file.export\")});C.push(()=>{MenuBar.removeAction(\"file.export.create_mer\"),MenuBar.removeAction(\"tools.decode_mer\")});var qe=()=>{Project&&Project.textures.forEach(e=>{let a=new D(null,e.uuid),t=a.findTexture(h.normal,!1),r=a.findTexture(h.height,!1),n=a.findTexture(h.albedo,!1),i=a.findTexture(h.metalness,!1)?.name,s=a.findTexture(h.emissive,!1)?.name,l=a.findTexture(h.roughness,!1)?.name,u={};return n||(u.baseColor={type:\"color\",label:\"Base Color\",value:\"#ff00ff\"}),!i&&!s&&!l&&(u.metalness={label:\"Metalness\",type:\"range\",min:0,max:255,step:1,value:0},u.emissive={label:\"Emissive\",type:\"range\",min:0,max:255,step:1,value:0},u.roughness={label:\"Roughness\",type:\"range\",min:0,max:255,step:1,value:0}),t&&(u.depthMap={type:\"checkbox\",label:\"Normal Map\",value:\"normal\"}),r&&(u.depthMap={type:\"checkbox\",label:\"Height Map\",value:\"heightmap\"}),t&&r&&(u.depthMap={type:\"radio\",label:\"Depth Map\",options:{normal:\"Normal Map\",heightmap:\"Height\"},value:\"normal\"}),o.textureSetDialog=new Dialog(\"texture_set\",{id:\"texture_set\",title:\"Create Texture Set JSON\",buttons:[\"Create\",\"Cancel\"],form:u,cancelIndex:1,onConfirm(m){let d=G(),c=i||s||l,v={format_version:\"1.16.100\",\"minecraft:texture_set\":{color:(n?d:m.baseColor?.toHexString())??d,metalness_emissive_roughness:[m.metalness??0,m.emissive??0,m.roughness??255]}};m.depthMap===\"normal\"&&t||!r&&t?v[\"minecraft:texture_set\"].normal=`${d}_normal`:(!t||m.depthMap===\"heightmap\")&&r&&(v[\"minecraft:texture_set\"].heightmap=`${d}_heightmap`);let g=p=>{if(!m.depthMap)return p();let b=m.depthMap===\"normal\"||m.depthMap&&!r,M=b?t:r;if(!M)return p();Blockbench.export({content:M.canvas.toDataURL()??\"\",type:\"PNG\",name:`${d}_${b?\"normal\":\"heightmap\"}`,extensions:[\"png\"],resource_id:m.depthMap,startpath:Project.export_path,savetype:\"image\"},w=>{v[\"minecraft:texture_set\"][b?\"normal\":\"heightmap\"]=pathToName(w,!1),p()})},x=p=>{if(!n)return p();Blockbench.export({content:n.canvas.toDataURL(),extensions:[\"png\"],type:\"PNG\",name:d,startpath:Project.export_path,savetype:\"image\"},b=>{v[\"minecraft:texture_set\"].color=pathToName(b,!1),p()})},f=()=>g(()=>{x(()=>{Blockbench.export({content:JSON.stringify(v,null,2),type:\"JSON\",name:`${d}.texture_set`,extensions:[\"json\"],resource_id:\"texture_set\",startpath:Project.export_path,savetype:\"text\"},()=>{Blockbench.showQuickMessage(\"Texture set created\",2e3),o.textureSetDialog?.hide()})})});if(c){try{Q(d,p=>{v[\"minecraft:texture_set\"].metalness_emissive_roughness=pathToName(p,!1),f()})}catch(p){console.warn(\"Failed to export MER map:\",p),Blockbench.showStatusMessage(\"Failed to export MER map\",3e3)}return}f()}}),o.textureSetDialog.show()})};y.push(()=>{o.createTextureSet=new Action(\"create_texture_set\",{name:\"Create Texture Set\",icon:\"layers\",description:\"Creates a texture set JSON file. Generates a MER when metalness, emissive, or roughness channels are set.\",click(){qe()},condition:{formats:[\"bedrock\",\"bedrock_block\"],project:!0}}),MenuBar.addAction(o.createTextureSet,\"file.export\")});C.push(()=>{MenuBar.removeAction(\"file.export.create_texture_set\")});y.push(()=>{o.toggleCorrectLights=new Toggle(\"correct_lights\",{category:\"preview\",name:\"Correct Lights\",description:\"Corrects the lighting in the preview\",icon:\"fluorescent\",default:!1,onChange(e){Preview.all.forEach(a=>{a.renderer.physicallyCorrectLights=e}),Preview.selected.renderer.physicallyCorrectLights=e,Blockbench.showQuickMessage(`Physically corrected lighting is now ${e?\"enabled\":\"disabled\"}`,2e3),e&&o.togglePbr?.set(!0),B()},click(){}}),MenuBar.addAction(o.toggleCorrectLights,\"preview\")});C.push(()=>{MenuBar.removeAction(\"preview.correct_lights\")});var J=()=>{!Project||!Project.bb_materials||(Project.elements.forEach(e=>{e instanceof Cube&&Object.keys(e.faces).forEach(a=>{let r=e.faces[a].getTexture();if(!r)return;let n=Project.bb_materials[r.uuid];n&&(Project.materials[r.uuid]=n)})}),Project.pbr_active=!1,Canvas.updateAll())};var fe=[\"undo\",\"redo\",\"add_texture\",\"finish_edit\",\"finished_edit\",\"load_project\",\"select_preview_scene\",\"change_texture_path\",\"select_project\",\"load_undo_save\",\"add_cube\"],xe=()=>Project&&Project.pbr_active&&B(),Ke=()=>{Blockbench.on(fe.join(\" \"),xe)},be=()=>{fe.forEach(e=>{Blockbench.removeListener(e,xe)})};y.push(()=>{o.togglePbr=new Toggle(\"toggle_pbr\",{name:\"PBR Preview\",description:\"Toggle PBR Preview\",icon:\"panorama_photosphere\",category:\"view\",default:!1,click(){},onChange(e){if(e){B(),Ke(),Blockbench.showQuickMessage(\"PBR Preview is now enabled\");return}J(),be(),Blockbench.showQuickMessage(\"PBR Preview is now disabled\")}}),MenuBar.addAction(o.togglePbr,\"view\")});C.push(()=>{be(),MenuBar.removeAction(\"view.toggle_pbr\")});var ve=e=>{let a=Math.max(-2,Math.min(2,e));Preview.all.forEach(t=>{t.renderer.toneMappingExposure=a}),Preview.selected.renderer.toneMappingExposure=a};y.push(()=>{o.exposureSlider=new NumSlider(\"display_settings_exposure\",{category:\"preview\",name:\"Exposure\",description:\"Adjusts the exposure of the scene\",type:\"number\",value:1,icon:\"exposure\",settings:{min:-2,max:2,step:.01,default:1},onBefore(){Number(o.tonemappingSelect?.get())===_.NoToneMapping&&o.tonemappingSelect.change(_.LinearToneMapping.toString()),o.togglePbr?.set(!0)},onChange(e){ve(Number(e))},onAfter(){A()}}),o.resetExposureButton=new Action(\"display_settings_reset_exposure\",{category:\"preview\",name:\"Reset Exposure\",description:\"Resets the exposure of the scene\",icon:\"exposure_plus_1\",condition:()=>o.exposureSlider!==void 0&&Number(o.exposureSlider?.get())!==1,click(){ve(1),o.exposureSlider?.setValue(1,!0),A()}}),o.tonemappingSelect=new BarSelect(\"display_settings_tone_mapping\",{category:\"preview\",name:\"Tone Mapping\",description:\"Changes the tone mapping of the preview\",type:\"select\",default_value:_.NoToneMapping,value:Preview.selected.renderer.toneMapping??_.NoToneMapping,icon:\"monochrome_photos\",options:{[_.NoToneMapping]:\"No Tone Mapping\",[_.LinearToneMapping]:\"Linear\",[_.ReinhardToneMapping]:\"Reinhard\",[_.CineonToneMapping]:\"Cineon\",[_.ACESFilmicToneMapping]:\"ACES\"},onChange({value:e}){Preview.selected.renderer.toneMapping=Number(e);let a=1;Preview.selected.renderer.toneMapping===_.NoToneMapping?o.exposureSlider?.setValue(a,!0):a=Number(o.exposureSlider?.get()??1),Preview.all.forEach(t=>{t.renderer.toneMapping=Number(e),t.renderer.toneMappingExposure=a}),Preview.selected.renderer.toneMappingExposure=a,Blockbench.showQuickMessage(`Tone mapping set to ${this.getNameFor(e)}`,2e3),o.togglePbr&&!o.togglePbr.value&&o.togglePbr.set(!0),B()}})});var ae=class{async parse(a){let t=new le,r=\"model.usda\";t.file(r,\"\");let n=we(),i={},s={};a.traverseVisible(m=>{if(!m.isMesh)return;let d=m;if(!d.material.isMeshStandardMaterial){console.warn(\"THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)\",m);return}let c=d.geometry,v=d.material,g=\"geometries/Geometry_\"+c.id+\".usd\";if(!t.file(g)){let x=rt(c);t.file(g,et(x))}v.uuid in i||(i[v.uuid]=v),n+=tt(d,c,v)}),n+=lt(i,s),t.file(r,n),n=null;for(let m in s){let d=s[m],c=m.split(\"_\")[1],v=d.format===_.RGBAFormat,g=Ye(d.image,c),f=await(await new Promise(p=>g.toBlob(b=>b&&p(b),v?\"image/png\":\"image/jpeg\",1))).arrayBuffer();t.file(`textures/Texture_${m}.${v?\"png\":\"jpg\"}`,f)}let l=0;t.forEach(async m=>{let d=34+m.length;l+=d;let c=l&63,v=await t.file(m).async(\"uint8array\");if(c!==4){let g=64-c,x=new Uint8Array(g),f=new Uint8Array(v.length+g);f.set(v,0),f.set(x,v.length),t.file(m,f)}l+=v.length});let u=await t.generateAsync({type:\"blob\",compression:\"STORE\"});return new Uint8Array(await u.arrayBuffer())}};function Ye(e,a){if(typeof HTMLImageElement<\"u\"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&e instanceof HTMLCanvasElement||typeof OffscreenCanvas<\"u\"&&e instanceof OffscreenCanvas||typeof ImageBitmap<\"u\"&&e instanceof ImageBitmap){let t=1024/Math.max(e.width,e.height),r=document.createElement(\"canvas\");r.width=e.width*Math.min(1,t),r.height=e.height*Math.min(1,t);let n=r.getContext(\"2d\");if(n.imageSmoothingEnabled=!1,n.drawImage(e,0,0,r.width,r.height),a!==void 0){let i=parseInt(a,16),s=(i>>16&255)/255,l=(i>>8&255)/255,u=(i&255)/255,m=n.getImageData(0,0,r.width,r.height),d=m.data;for(let c=0;c<d.length;c+=4)d[c+0]=d[c+0]*s,d[c+1]=d[c+1]*l,d[c+2]=d[c+2]*u;n.putImageData(m,0,0)}return r}throw new Error(\"Unsupported image type\")}var U=7;function we(){return`#usda 1.0\n(\n    customLayerData = {\n        string creator = \"Blockbench USDZExporter\"\n    }\n    metersPerUnit = 1\n    upAxis = \"Y\"\n)\n\n`}function et(e){let a=we();return a+=e,a}function tt(e,a,t){let r=\"Object_\"+e.id,n=at(e.matrixWorld);return e.matrixWorld.determinant()<0&&console.warn(\"THREE.USDZExporter: USDZ does not support negative scales\",e),`def Xform \"${r}\" (\n    prepend references = @./geometries/Geometry_${a.id}.usd@</Geometry>\n)\n{\n    matrix4d xformOp:transform = ${n}\n    uniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n    rel material:binding = </Materials/Material_${t.id}>\n}\n\n`}function at(e){let a=e.elements;return`( ${X(a,0)}, ${X(a,4)}, ${X(a,8)}, ${X(a,12)} )`}function X(e,a){return`(${e[a+0]}, ${e[a+1]}, ${e[a+2]}, ${e[a+3]})`}function rt(e){return`\ndef \"Geometry\"\n{\n  ${nt(e)}\n}\n`}function nt(e){let a=\"Geometry\",t=e.attributes,r=t.position.count;return`\n    def Mesh \"${a}\"\n    {\n        int[] faceVertexCounts = [${st(e)}]\n        int[] faceVertexIndices = [${ot(e)}]\n        normal3f[] normals = [${_e(t.normal,r)}] (\n            interpolation = \"vertex\"\n        )\n        point3f[] points = [${_e(t.position,r)}]\n        float2[] primvars:st = [${it(t.uv,r)}] (\n            interpolation = \"vertex\"\n        )\n        uniform token subdivisionScheme = \"none\"\n    }\n`}function st(e){let a=e.index!==null?e.index.count:e.attributes.position.count;return Array(a/3).fill(3).join(\", \")}function ot(e){let a=e.index,t=[];if(a!==null)for(let r=0;r<a.count;r++)t.push(a.getX(r));else{let r=e.attributes.position.count;for(let n=0;n<r;n++)t.push(n)}return t.join(\", \")}function _e(e,a){if(e===void 0)return console.warn(\"USDZExporter: Normals missing.\"),Array(a).fill(\"(0, 0, 0)\").join(\", \");let t=[];for(let r=0;r<e.count;r++){let n=e.getX(r),i=e.getY(r),s=e.getZ(r);t.push(`(${n.toPrecision(U)}, ${i.toPrecision(U)}, ${s.toPrecision(U)})`)}return t.join(\", \")}function it(e,a){if(e===void 0)return console.warn(\"USDZExporter: UVs missing.\"),Array(a).fill(\"(0, 0)\").join(\", \");let t=[];for(let r=0;r<e.count;r++){let n=e.getX(r),i=e.getY(r);t.push(`(${n.toPrecision(U)}, ${Number(i.toPrecision(U))})`)}return t.join(\", \")}function lt(e,a){let t=[];for(let r in e){let n=e[r];t.push(ct(n,a))}return`def \"Materials\"\n{\n${t.join(\"\")}\n}\n\n`}function ct(e,a){let t=\"            \",r=[],n=[];function i(l,u,m){let d=l.id+(m?\"_\"+m.getHexString():\"\"),c=l.format===_.RGBAFormat;return a[d]=l,`\n        def Shader \"Transform2d_${u}\" (\n            sdrMetadata = {\n                string role = \"math\"\n            }\n        )\n        {\n            uniform token info:id = \"UsdTransform2d\"\n            float2 inputs:in.connect = </Materials/Material_${e.id}/uvReader_st.outputs:result>\n            float2 inputs:scale = ${ye(l.repeat)}\n            float2 inputs:translation = ${ye(l.offset)}\n            float2 outputs:result\n        }\n\n        def Shader \"Texture_${l.id}_${u}\"\n        {\n            uniform token info:id = \"UsdUVTexture\"\n            asset inputs:file = @textures/Texture_${d}.${c?\"png\":\"jpg\"}@\n            float2 inputs:st.connect = </Materials/Material_${e.id}/Transform2d_${u}.outputs:result>\n            token inputs:wrapS = \"repeat\"\n            token inputs:wrapT = \"repeat\"\n            float outputs:r\n            float outputs:g\n            float outputs:b\n            float3 outputs:rgb\n        }`}let s=e;if(s.map!==null?(r.push(`${t}color3f inputs:diffuseColor.connect = </Materials/Material_${s.id}/Texture_${s.map.id}_diffuse.outputs:rgb>`),n.push(i(s.map,\"diffuse\",s.color))):r.push(`${t}color3f inputs:diffuseColor = ${Me(s.color)}`),s.emissiveMap!==null?(r.push(`${t}color3f inputs:emissiveColor.connect = </Materials/Material_${s.id}/Texture_${s.emissiveMap.id}_emissive.outputs:rgb>`),n.push(i(s.emissiveMap,\"emissive\"))):s.emissive.getHex()>0&&r.push(`${t}color3f inputs:emissiveColor = ${Me(s.emissive)}`),s.normalMap!==null&&(r.push(`${t}normal3f inputs:normal.connect = </Materials/Material_${s.id}/Texture_${s.normalMap.id}_normal.outputs:rgb>`),n.push(i(s.normalMap,\"normal\"))),s.aoMap!==null&&(r.push(`${t}float inputs:occlusion.connect = </Materials/Material_${s.id}/Texture_${s.aoMap.id}_occlusion.outputs:r>`),n.push(i(s.aoMap,\"occlusion\"))),s.roughnessMap!==null&&s.roughness===1?(r.push(`${t}float inputs:roughness.connect = </Materials/Material_${s.id}/Texture_${s.roughnessMap.id}_roughness.outputs:g>`),n.push(i(s.roughnessMap,\"roughness\"))):r.push(`${t}float inputs:roughness = ${s.roughness}`),s.metalnessMap!==null&&s.metalness===1?(r.push(`${t}float inputs:metallic.connect = </Materials/Material_${s.id}/Texture_${s.metalnessMap.id}_metallic.outputs:b>`),n.push(i(s.metalnessMap,\"metallic\"))):r.push(`${t}float inputs:metallic = ${s.metalness}`),s.alphaMap!==null?(r.push(`${t}float inputs:opacity.connect = </Materials/Material_${s.id}/Texture_${s.alphaMap.id}_opacity.outputs:r>`),r.push(`${t}float inputs:opacityThreshold = 0.0001`),n.push(i(s.alphaMap,\"opacity\"))):r.push(`${t}float inputs:opacity = ${s.opacity}`),s.isMeshPhysicalMaterial){let l=s;r.push(`${t}float inputs:clearcoat = ${l.clearcoat}`),r.push(`${t}float inputs:clearcoatRoughness = ${l.clearcoatRoughness}`),r.push(`${t}float inputs:ior = ${l.ior}`)}return`\n    def Material \"Material_${s.id}\"\n    {\n        def Shader \"PreviewSurface\"\n        {\n            uniform token info:id = \"UsdPreviewSurface\"\n${r.join(`\n`)}\n            int inputs:useSpecularWorkflow = 0\n            token outputs:surface\n        }\n\n        token outputs:surface.connect = </Materials/Material_${s.id}/PreviewSurface.outputs:surface>\n        token inputs:frame:stPrimvarName = \"st\"\n\n        def Shader \"uvReader_st\"\n        {\n            uniform token info:id = \"UsdPrimvarReader_float2\"\n            token inputs:varname.connect = </Materials/Material_${s.id}.inputs:frame:stPrimvarName>\n            float2 inputs:fallback = (0.0, 0.0)\n            float2 outputs:result\n        }\n\n${n.join(`\n`)}\n\n    }\n`}function Me(e){return`(${e.r}, ${e.g}, ${e.b})`}function ye(e){return`(${e.x}, ${e.y})`}var Te=ae;y.push(()=>{let e=new Codec(\"usdz\",{extension:\"usdz\",name:\"USDZ\",remember:!0,export_options:{normal_type:{type:\"select\",label:\"Normal Map Type\",default:\"opengl\",options:{opengl:\"OpenGL\",directx:\"DirectX\"}}},fileName(){return G()+\".usdz\"},async compile(a={}){if(!Project)throw new Error(\"No project loaded\");let t=Object.assign(this.getExportOptions(),a);Project.textures.forEach(s=>{if(!s.material)return;let l=new D(s.layers,s.uuid),u=l.findTexture(\"normal\",!0);if(!u)return;let m=$(u,t.normal_type);m&&l.saveTexture(h.normal,m)}),B();let r=new Te,n=new _.Scene;n.name=\"blockbench_export\",n.add(Project.model_3d);let i=await r.parse(n);return this.dispatchEvent(\"compile\",{model:i,options:t}),Canvas.scene.add(Project.model_3d),i},async export(a={}){let t=await this.compile(a);Blockbench.export({content:t,name:this.fileName(),startpath:this.startPath(),resource_id:\"usdz\",type:this.name,extensions:[\"usdz\"],savetype:\"buffer\"},r=>this.afterDownload(r))}});o.exportUsdz=new Action(\"export_usdz\",{category:\"file\",name:\"Export USDZ\",description:\"Exports the current model as a USDZ file\",icon:\"stacks\",async click(){if(!e)return;let a=await e.promptExportOptions();await e.export(a)}}),o.usdz=e,MenuBar.addAction(o.exportUsdz,\"file.export\")});C.push(()=>{MenuBar.removeAction(\"file.export_usdz\")});y.push(()=>{o.bbmat=new Codec(\"material\",{name:\"Blockbench Material\",extension:\"bbmat\",remember:!1,load_filter:{extensions:[\"bbmat\"],type:\"json\"},compile(){if(!Texture.selected?.material||!Texture.selected?.layers_enabled)return;let e=Texture.selected.layers.map(a=>{let t=a.channel,r=a.canvas.toDataURL();return[t,r]});return JSON.stringify({version:K,channels:Object.fromEntries(e)})},parse(e,a){return e=typeof e==\"string\"?JSON.parse(e):e,e.version!==K?(Blockbench.showMessageBox({title:\"Invalid Blockbench Material Version\",message:`The material file \"${a}\" is not compatible with version ${F} of the PBR plugin.`,buttons:[\"OK\"],confirm:0,width:400,cancel:0,checkboxes:{}},()=>null),{}):e.channels},load(e,a,t){if(!Project)return;let r=this.parse(e,a.path),n=Object.keys(r);if(!n.length)throw new Error(\"No valid channels found in the material\");let i=r[h.albedo.id]??r[n[0]];n.includes(\"preview\")&&(i=r.preview);let s=new Texture({name:pathToName(a.name),saved:!0,particle:!1,source:i,layers_enabled:!0});s.extend({material:!0});let l=n.map(u=>{if(!(u in h))return null;let m=r[u],d=new TextureLayer({name:u,data_url:m,visible:!0},s);return d.extend({channel:u}),d}).filter(Boolean);if(!l.length)throw new Error(\"No valid channel layers found in the material\");i||s.fromDataURL(l[0].canvas.toDataURL()),s.add().select(),l.forEach(u=>{u.addForEditing(),s.width=Math.max(s.width,u.img.width),s.height=Math.max(s.height,u.img.height)}),s.updateChangesAfterEdit()},export(){Blockbench.export({resource_id:\"material\",type:this.name,extensions:[this.extension],name:`${Texture.selected?.name??this.fileName??\"material\"}.bbmat`,startpath:this.startPath(),content:this.compile()},e=>this.afterDownload(e))}}),o.bbMatExport=new Action(\"export_bbmat\",{icon:\"stacks\",name:\"Save as .bbmat\",category:\"file\",condition:{project:!0,selected:{texture:!0},method(){return Texture.selected?.material}},click(){o.bbmat?.export?.()}}),o.bbMatImport=new Action(\"import_bbmat\",{icon:\"stacks\",name:\"Import .bbmat\",category:\"file\",condition:{project:!0},click(){Blockbench.import({extensions:[\"bbmat\"],type:\"json\",title:\"Import .bbmat\",multiple:!0},e=>{o.bbmat?.load&&e.forEach(a=>{o.bbmat.load(a.content,a,!0)})})}}),o.bbmat.export_action=o.bbMatExport,Texture.prototype.menu.addAction(o.bbMatExport),MenuBar.addAction(o.bbMatImport,\"file.import\")});C.push(()=>{Texture.prototype.menu.removeAction(\"export_bbmat\"),MenuBar.removeAction(\"file.import.import_bbmat\")});var Z=class e{constructor({colors:a}){this._colors={...Object.fromEntries(Object.keys(h).map(t=>[t,h[t].default??new _.Color(4294967040)])),...a}}get colors(){return this._colors}set colors(a){this._colors={...this._colors,...a}}toString(){let a=Object.entries(this._colors).map(([t,r])=>[t,r.getHexString()]);return JSON.stringify(a)}getChannel(a){return this._colors[a]}static makeLinearColor(a){let t=Math.min(1,Math.max(0,a));return new _.Color(t,t,t).convertSRGBToLinear()}static fromSettings(){let a=\"#000000\",t=Number(o.brushMetalnessSlider?.get()),r=Number(o.brushRoughnessSlider?.get()??1),n=(o.brushEmissiveColor?.get()??a).toString(),i=Number(o.brushHeightSlider?.get()),s=ColorPanel.get(),l={[h.albedo.id]:new _.Color(s),[h.metalness.id]:e.makeLinearColor(t),[h.roughness.id]:e.makeLinearColor(r),[h.emissive.id]:new _.Color(n??a),[h.height.id]:e.makeLinearColor(i)};return new e({colors:l})}};var Ce=\"materialBrushPresets\",re=()=>JSON.parse(localStorage.getItem(Ce)||\"{}\"),ut=(e,a)=>{let t=re(),r=a??guid(),n=o.userMaterialBrushPresets?.getFormResult()??{},i={};return n.albedo&&(i.albedo=n.albedo.toString()),n.metalness&&(i.metalness=Number(n.metalness)),n.roughness&&(i.roughness=Number(n.roughness)),n.emissive&&(i.emissive=n.emissive.toString()),n.height&&(i.height=Number(n.height)),t[r]=[i,e??\"New Preset\",z(i)],localStorage.setItem(Ce,JSON.stringify(t)),r},Ee=({metalness:e,roughness:a,emissive:t,height:r,albedo:n})=>{e!==void 0&&o.brushMetalnessSlider?.setValue(e||0,!0),a!==void 0&&o.brushRoughnessSlider?.setValue(a??1,!0),t!==void 0&&o.brushEmissiveColor?.set(t??\"#000000\"),r!==void 0&&o.brushHeightSlider?.setValue(Math.max(0,Math.min(1,r??.5)),!0),n!==void 0&&ColorPanel.set(n)},W=({id:e})=>Condition({project:!0,tools:[\"material_brush\"],method(){let a=E();return(a?.layers_enabled&&a.layers.find(({channel:t})=>t&&t===e)!==void 0)===!0}}),mt=ie.extend({name:\"UserPresetsDialog\",data(){return{userPresets:{},channels:h}},methods:{applyPreset(e){try{let[a,t]=this.userPresets[e],{metalness:r,roughness:n,emissive:i,height:s,albedo:l}=a;Ee({metalness:Number(r),roughness:Number(n),emissive:i.toString(),height:Number(s),albedo:l.toString()}),o.userMaterialBrushPresets?.hide(),Blockbench.showQuickMessage(`Preset \"${t}\" applied`,2e3)}catch{Blockbench.showQuickMessage(\"Failed to apply preset\",2e3)}},deletePreset(e){Blockbench.showMessageBox({title:\"Delete Preset\",message:\"Are you sure you want to delete this preset?\",confirm:1,cancel:0,buttons:[\"Cancel\",\"Delete\"],checkboxes:{},width:400},a=>{if(a){let t=re(),r=this.userPresets[e][1]??e;delete t[e],localStorage.setItem(\"materialBrushPresets\",JSON.stringify(t)),this.userPresets=t,Blockbench.showQuickMessage(`Preset \"${r}\" deleted`,2e3)}})},editPreset(e){o.userMaterialBrushPresets?.setFormValues({name:this.userPresets[e][1]??e,...this.userPresets[e][0]})},getSummary(e){return Object.entries(e).filter(([a])=>a in this.channels).map(([a,t])=>a===\"albedo\"||a===\"emissive\"?`${this.channels[a]?.label??a}: ${t}`:`${this.channels[a]?.label??a}: ${Number(t).toFixed(1)}`).join(`\n`)}},computed:{presets(){return Object.entries(this.userPresets)}},mounted(){this.userPresets=re()},template:`\n    <div>\n      <ul class=\"list mobile_scrollbar preset_list\">\n        <li\n          v-for=\"([key, [settings, name, image]]) in presets\"\n          :key=\"key\"\n          class=\"user_preset\"\n        >\n          <div v-if=\"image\" class=\"preset_preview\" @click=\"editPreset(key)\">\n            <img :src=\"image\" :alt=\"name\" :title=\"getSummary(settings)\" width=\"96\" height=\"96\" />\n            <div class=\"preset_title\">{{ name }}</div>\n          </div>\n          <div v-else>\n            <div class=\"preset_title\" @click=\"editPreset(key)\" :title=\"getSummary(settings)\">{{ name }}</div>\n          </div>\n          <div class=\"preset_buttons\">\n            <button class=\"delete_preset\" type=\"button\" @click=\"deletePreset(key)\">\n              <i class=\"material-icons\">close</i>\n            </button>\n          </div>\n        </li>\n      </ul>\n    </div>`});y.push(()=>{o.materialBrushStyles=Blockbench.addCSS(`\n  .preset_list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, 96px);\n    grid-gap: 8px;\n    justify-content: start;\n    align-items: start;\n    margin: 0 auto;\n    padding: 8px;\n  }\n\n  .user_preset {\n    display: flex;\n    justify-content: start;\n    align-items: center;\n    width: 100%;\n    padding: 8px;\n    position: relative;\n  }\n\n  .preset_title {\n    font-size: 1em;\n    color: var(--color-text);\n  }\n\n  .user_preset:hover .preset_title {\n    color: var(--color-accent);\n  }\n\n  .preset_preview {\n    display: flex;\n    flex-direction: column;\n    flex-wrap: nowrap;\n    justify-content: center;\n    align-items: center;\n    text-align: center;\n  }\n\n  .preset_buttons {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    font-size: 0.8em;\n    padding: 0 4px;\n  }\n\n  .preset_channel {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    margin: 0 8px;\n    font-size: 0.8em;\n  }\n\n  .delete_preset {\n    margin-left: 8px;\n    padding: 4px;\n    height: 24px;\n    width: 24px;\n    min-width: 24px;\n    background-color: transparent;\n    color: var(--color-text);\n    border: none;\n    border-radius: 100%;\n    position: absolute;\n    right: -8px;\n    top: 0;\n    filter: drop-shadow(0 0 2px var(--color-shadow));\n  }\n\n  .delete_preset:hover {\n    background: transparent;\n    color: var(--color-accent);\n  }\n\n  .delete_preset .material-icons {\n    font-size: 0.825em;\n  }\n\n  .delete_preset:hover .material-icons {\n    color: var(--color-accent);\n  }`),o.brushMetalnessSlider=new NumSlider(\"slider_brush_metalness\",{category:\"paint\",name:\"Metalness\",description:\"Adjust the metalness of the brush\",tool_setting:\"brush_metalness\",settings:{min:0,max:1,step:.01,default:0},condition:()=>W(h.metalness)}),o.brushRoughnessSlider=new NumSlider(\"slider_brush_roughness\",{category:\"paint\",name:\"Roughness\",description:\"Adjust the roughness of the brush\",tool_setting:\"brush_roughness\",settings:{min:0,max:1,step:.01,default:1},condition:()=>W(h.roughness)}),o.brushEmissiveColor=new ColorPicker(\"brush_emissive_color\",{category:\"paint\",name:\"Emissive\",description:\"Adjust the emissive color of the brush\",value:\"#000000\",tool_setting:\"brush_emissive\",condition:()=>W(h.emissive)}),o.brushHeightSlider=new NumSlider(\"slider_brush_height\",{category:\"paint\",name:\"Height\",description:\"Adjust the height of the brush\",tool_setting:\"brush_height\",settings:{min:0,max:1,step:.01,default:.5},condition:()=>W(h.height)}),o.materialBrushTool=new Tool(\"material_brush\",{name:\"Material Brush\",description:\"Paints across multiple texture layers\",icon:\"view_in_ar\",paintTool:!0,cursor:\"cell\",category:\"tools\",toolbar:\"brush\",condition:{project:!0,selected:{texture:!0},modes:[\"paint\"],method(){return E()?.layers_enabled??!1}},allowed_view_modes:\"textured\",tool_settings:{brush_metalness:0,brush_roughness:1,brush_emissive:\"#000000\",brush_height:.5},brush:{blend_modes:!1,shapes:!0,size:!0,softness:!0,opacity:!0,offset_even_radius:!0,floor_coordinates:!0,changePixel(e,a,t,r,{size:n,softness:i,texture:s,x:l,y:u}){let m=Z.fromSettings(),d=Object.keys(m.colors),c=Math.floor(n-i*n/100),v=t;return s.layers.forEach(g=>{if(!g.visible||!d.includes(g.channel))return;let x=m.getChannel(g.channel);if(!x)return;let f=Math.sqrt((l-e)**2+(u-a)**2),p=Math.min(1,f/c);if(l%c<=p&&u%c<=p){let b=g.ctx.getImageData(e,a,1,1).data,M=new _.Color(`rgb(${b[0]}, ${b[1]}, ${b[2]})`);x.lerp(M,1)}g.ctx.fillStyle=x.getStyle(),g.ctx.fillRect(e,a,1,1),g.selected&&(v={r:x.r*255,g:x.g*255,b:x.b*255,a:r*255})}),v},onStrokeStart({texture:e}){return Undo.initEdit({layers:e.layers}),!0},onStrokeEnd({texture:e}){return Undo.finishEdit(\"Material Brush Stroke\"),!0}},onCanvasClick(e){Painter.startPaintToolCanvas(e,e.event)},onSelect(){Painter.updateNslideValues(),B()},click(){A()}}),o.loadBrushPreset=new Action(\"load_brush_preset\",{icon:\"stroke_full\",name:\"Material Brush Presets\",description:\"Load or save a brush preset\",category:\"paint\",condition:{project:!0},click(){o.userMaterialBrushPresets=new Dialog(\"user_brush_presets\",{id:\"user_brush_presets\",title:\"Edit Material Brush\",component:mt,part_order:[\"lines\",\"component\",\"form\"],form:{albedo:{type:\"color\",label:\"Albedo\",value:ColorPanel.get(),toggle_enabled:!0},metalness:{type:\"number\",label:\"Metalness\",min:0,max:1,step:.01,full_width:!1,toggle_enabled:!0},roughness:{type:\"number\",label:\"Roughness\",min:0,max:1,step:.01,toggle_enabled:!0,full_width:!1},emissive:{type:\"color\",label:\"Emissive\",value:\"#000000\",toggle_enabled:!0},height:{type:\"number\",label:\"Height\",min:0,max:1,step:.01,toggle_enabled:!0}},onConfirm(e){Ee({metalness:Number(e.metalness??o.brushMetalnessSlider?.get()),roughness:Number(e.roughness??o.brushRoughnessSlider?.get()),emissive:(e.emissive??o.brushEmissiveColor?.get()).toString(),height:Number(e.height??o.brushHeightSlider?.get()),albedo:(e.albedo??ColorPanel.get()).toString()})},buttons:[\"Close\",\"Save\",\"Apply\"],cancelIndex:0,confirmIndex:2,onButton(e,a){o.materialBrushTool?.select(),e===1&&Blockbench.textPrompt(\"Save Preset\",\"New Preset\",t=>{t&&(ut(t),Blockbench.showQuickMessage(`Preset \"${t}\" saved`,2e3))})}}).show()}}),MenuBar.addAction(o.materialBrushTool,\"tools.0\")});C.push(()=>{MenuBar.removeAction(\"tools.material_brush\")});y.push(()=>{o.materialBrushPanel=new Panel(\"material_brush_panel\",{name:\"Material Brush\",id:\"material_brush_panel\",icon:\"view_in_ar\",toolbars:[new Toolbar(\"material_brush_toolbar\",{id:\"material_brush_toolbar\",children:[\"material_brush\",\"load_brush_preset\",\"slider_brush_metalness\",\"slider_brush_roughness\",\"brush_emissive_color\",\"slider_brush_height\"],name:\"Material Settings\"})],condition:{modes:[\"paint\"],project:!0},component:{},expand_button:!0,growable:!1,onFold(){},onResize(){},default_side:\"right\",default_position:{slot:\"right_bar\",float_position:[0,0],float_size:[400,300],height:300,folded:!1},insert_after:\"color\",insert_before:\"outliner\"})});y.push(()=>{o.displaySettingsPanel=new Panel(\"display_settings\",{name:\"PBR Controls\",id:\"display_settings_panel\",icon:\"display_settings\",toolbars:[new Toolbar(\"controls_toolbar\",{id:\"controls_toolbar\",children:[\"toggle_pbr\",\"correct_lights\",\"display_settings_tone_mapping\",\"display_settings_exposure\",\"display_settings_reset_exposure\",\"show_channel_select_menu\"],name:\"Display Settings\"})],display_condition:{modes:[\"edit\",\"paint\",\"animate\"],project:!0},component:{},expand_button:!0,growable:!1,onFold(){},onResize(){},default_side:\"left\",default_position:{slot:\"left_bar\",float_position:[0,0],float_size:[400,300],height:300,folded:!1},insert_after:\"textures\",insert_before:\"color\"})});var q=e=>e.visible&&e.channel&&e.channel!==N,dt=()=>{let e=R();if(e)return e.texture.layers.filter(q);let a=E();return a?a.layers_enabled?a.layers.filter(q):Texture.all.map(t=>t.layers_enabled?[...t.layers.filter(q)]:[q(t)?t:null]).flat().filter(Boolean):[]},Pe=[\"select_texture\",\"update_texture_selection\",\"finish_edit\",\"add_texture\"],Le=()=>{Panels.channels_panel.inside_vue.textures=dt()};y.push(()=>{o.channelsPanelStyle=Blockbench.addCSS(`\n    .texture_channel {\n      color: var(--color-text);\n      flex: 1;\n      font-size: 1em;\n      margin: 0 0 0 auto;\n      padding: 0 8px;\n      text-align: right;\n    }\n\n    .texture_channel + .texture_particle_icon {\n      padding-right: 8px;\n    }\n\n    .texture_channel_description {\n      background-color: var(--color-back);\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n      justify-content: space-between;\n    }\n    \n    .texture_channel_wrapper {\n      align-items: center;\n      background-color: var(--color-ui);\n      border-left: 1px solid var(--color-border);\n      display: flex;\n      flex: 1;\n      flex-direction: row;\n      align-items: center;\n      flex-wrap: nowrap;\n      padding: 0 8px;\n    }\n\n    .texture_channel_wrapper:hover {\n      background-color: var(--color-button);\n    }\n\n    .texture_channel_description .texture_name {\n      flex-direction: column;\n      flex-wrap: nowrap;\n      color: var(--color-subtle_text);\n      display: flex;\n      flex: 1;\n      justify-content: center;\n      align-items: start;\n    }\n\n    .texture_parent {\n      color: var(--color-subtle_text);\n      font-size: 0.8em;\n    }\n\n    .texture_channel_description:hover .texture_channel {\n      color: var(--color-accent);\n    }\n\n    #pbr_channel_list {\n      display: flex;\n      flex-direction: column;\n    }\n\n    #pbr_channel_list .texture {\n      border-top: 1px solid var(--color-border);\n      padding-right: 0;\n    }\n  `),o.channelsPanel=new Panel(\"channels_panel\",{name:\"PBR Channels\",id:\"channels_panel\",icon:\"gallery_thumbnail\",condition:{project:!0,selected:{texture:!0},modes:[\"paint\",\"edit\"]},toolbars:[],component:{name:\"ChannelsPanel\",data(){return{channels:h,textures:[]}},methods:{openMenu(e){o.channelMenu?.open(e)},selectTexture(e){Modes.options.paint.select(),e.select(),e.scrollTo()},channelEnabled(e){return e.channel&&e.channel!==N&&e.channel in this.channels},getImgSrc(e){return e.img?.src??`data:image/png;base64,${e.canvas.toDataURL()}`}},template:`\n      <div>\n        <ul class=\"list mobile_scrollbar\" id=\"pbr_channel_list\">\n          <li\n            v-for=\"texture in textures\"\n            v-on:click.stop=\"selectTexture(texture)\"\n            v-on:dblclick=\"openMenu($event)\"\n            :key=\"texture.uuid\"\n            class=\"texture\"\n          >\n            <img :src=\"getImgSrc(texture)\" :alt=\"texture.name\" width=\"48\" height=\"48\" />\n            <div class=\"texture_description_wrapper texture_channel_description\">\n              <div class=\"texture_name\">\n                <div>{{ texture.name }}</div>\n                <div v-if=\"texture && texture.texture\" class=\"texture_parent\">\n                  {{ texture.texture.name }}\n                </div>\n              </div>\n              <div v-if=\"channelEnabled(texture)\" class=\"texture_channel_wrapper\">\n                <div class=\"texture_channel\">{{ channels[texture.channel].label }}</div>\n                <i class=\"material-icons texture_particle_icon\">{{ channels[texture.channel].icon }}</i>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>`},expand_button:!0,growable:!0,onFold(){},onResize(){},default_side:\"left\",default_position:{slot:\"left_bar\",float_position:[0,0],float_size:[400,300],height:350,folded:!0},insert_after:\"layers\",insert_before:\"color\"}),Blockbench.on(Pe.join(\" \"),Le)});C.push(()=>{Pe.forEach(e=>{Blockbench.removeListener(e,Le)})});(()=>{let e=()=>{y.forEach(t=>t())},a=()=>{J(),C.forEach(t=>t()),Object.entries(o).forEach(([t,r])=>{try{r?.delete()}catch(n){console.warn(`Failed to delete ${t} action:`,n)}})};BBPlugin.register(\"pbr_preview\",{version:F,title:\"PBR Tools\",author:\"Jason J. Gardner\",description:\"Create and view PBR materials in Blockbench. Export USDZ scenes and textures for Java or RenderDragon shaders.\",tags:[\"Minecraft: Java Edition\",\"Minecraft: Bedrock Edition\",\"PBR\"],icon:\"icon.png\",variant:\"both\",await_loading:!0,repository:\"https://github.com/jasonjgardner/blockbench-plugins\",has_changelog:!0,min_version:\"4.10.3\",max_version:\"4.11.9\",onload:e,onunload:a})})();})();\n"
  },
  {
    "path": "plugins/performance_audit.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\n\n(function() {\n\nvar performance_audit_action;\n\nPlugin.register('performance_audit', {\n\ttitle: 'Performance Audit',\n\ticon: 'network_check',\n\tauthor: 'JannisX11',\n\tdescription: 'Find performance issues and bottlenecks in your Blockbench installation.',\n\tabout: 'You can run a performance audit via Help > Audit Performance.',\n\tversion: '1.1.2',\n\tmin_version: '3.0.0',\n\tvariant: 'both',\n\tonload() {\n\n\t\tfunction measurePerformance(method, count = 5) {\n\t\t\tlet start = Date.now();\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tmethod();\n\t\t\t}\n\t\t\tlet time = (Date.now() - start) / count;\n\t\t\treturn time\n\t\t}\n\t\tasync function measurePerformanceAsync(method, count = 5, delay = 20) {\n\t\t\tlet start = Date.now();\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tmethod();\n\t\t\t\tawait new Promise(r => setTimeout(r, delay));\n\t\t\t}\n\t\t\tlet time = (Date.now() - start) / count;\n\t\t\treturn time - delay;\n\t\t}\n\n\t\tperformance_audit_action = new Action({\n\t\t\tid: 'performance_audit',\n\t\t\tname: 'Audit Performance',\n\t\t\ticon: 'network_check',\n\t\t\tcategory: 'help',\n\t\t\tclick: async () => {\n\t\t\t\tlet toast = Blockbench.showToastNotification({\n\t\t\t\t\ttext: 'Auditing performance...',\n\t\t\t\t\ticon: 'network_check',\n\t\t\t\t})\n\n\t\t\t\tlet fps_sum = Prop.fps;\n\t\t\t\tawait new Promise(r => setTimeout(r, 1008));\n\t\t\t\tfps_sum += Prop.fps;\n\t\t\t\tlet avg_fps = fps_sum / 2;\n\t\t\t\t\n\t\t\t\tlet render_time = measurePerformance(() => {\n\t\t\t\t\tPreview.all.forEach(function(prev) {\n\t\t\t\t\t\tif (prev.canvas.isConnected) {\n\t\t\t\t\t\t\tprev.render()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tlet animate_time = measurePerformance(() => {\n\t\t\t\t\tif (Animator.open) {\n\t\t\t\t\t\tif (Timeline.playing) {\n\t\t\t\t\t\t\tTimeline.loop();\n\t\t\t\t\t\t} else if (AnimationController.selected) {\n\t\t\t\t\t\t\tAnimationController.selected.updatePreview();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (Preview.selected) {\n\t\t\t\t\t\tWinterskyScene.updateFacingRotation(Preview.selected.camera);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tlet dispatch_time = measurePerformance(() => {\n\t\t\t\t\tBlockbench.dispatchEvent('render_frame');\n\t\t\t\t})\n\t\t\t\tlet animate_time_sum = render_time + animate_time + dispatch_time;\n\n\t\t\t\tlet selection_update_time = measurePerformance(updateSelection);\n\n\t\t\t\tlet selection_time = measurePerformance(() => {\n\t\t\t\t\tBarItems.invert_selection.click();\n\t\t\t\t}, 4);\n\n\t\t\t\tlet uv_editor_time = await measurePerformanceAsync(() => {\n\t\t\t\t\tPanels.uv.fold();\n\t\t\t\t\tPanels.uv.fold();\n\t\t\t\t}, 2, 20);\n\t\t\t\tlet outliner_time = await measurePerformanceAsync(() => {\n\t\t\t\t\tPanels.outliner.fold();\n\t\t\t\t\tPanels.outliner.fold();\n\t\t\t\t}, 2, 20);\n\n\n\t\t\t\tlet conclusion = 'Your performance is good!';\n\t\t\t\tlet tips = [];\n\t\t\t\tif (avg_fps < 46) {\n\t\t\t\t\tif (animate_time_sum > 23) {\n\t\t\t\t\t\tconclusion = 'Your performance is limited by CPU power...';\n\t\t\t\t\t\ttips = [\n\t\t\t\t\t\t\t'Try and reduce the number of elements in your project, or hide elements you don\\'t use'\n\t\t\t\t\t\t]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconclusion = 'Your performance is limited by graphics rendering power...';\n\t\t\t\t\t\ttips = [\n\t\t\t\t\t\t\t'Close or minimize other performance-intensive applications, such as games or 3D or 2D editor',\n\t\t\t\t\t\t\t'Check if there are any updates for your graphics drivers',\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t} else if (avg_fps < 54) {\n\t\t\t\t\tconclusion = 'Your performance is below average';\n\t\t\t\t}\n\t\t\t\tif (settings.ambient_occlusion_enabled && settings.ambient_occlusion_enabled.value) {\n\t\t\t\t\ttips.push('You are using the \"Ambient Occlusion\" plugin. It is recommended to uninstall or disable this plugin if you are having performance issues.')\n\t\t\t\t}\n\t\t\t\tif (avg_fps > 59) {\n\t\t\t\t\tconclusion = 'Your performance is great!';\n\t\t\t\t}\n\n\t\t\t\tlet faces_total = 0;\n\t\t\t\tlet faces_selected = 0;\n\t\t\t\tfor (let el of Outliner.elements) {\n\t\t\t\t\tif (el.faces) {\n\t\t\t\t\t\tlet amount = 0;\n\t\t\t\t\t\tif (el instanceof Cube) {\n\t\t\t\t\t\t\tamount = Object.keys(el.faces).filter(fkey => el.faces[fkey].texture !== null).length;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tamount = Object.keys(el.faces).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (el.selected) faces_selected += amount;\n\t\t\t\t\t\tfaces_total += amount;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnew Dialog('performance_audit', {\n\t\t\t\t\ttitle: 'Performance Audit Results',\n\t\t\t\t\tbuttons: ['Close', 'Re-Run'],\n\t\t\t\t\tcancelIndex: 0,\n\t\t\t\t\tform: {\n\t\t\t\t\t\tconclusion: {type: 'info', text: '#### ' + conclusion},\n\t\t\t\t\t\ttips:\t\t{type: 'info', text: '* ' + tips.join('\\n* '), condition: tips.length > 0},\n\t\t\t\t\t\t'_1': '_',\n\n\t\t\t\t\t\tfps: \t\t\t{type: 'info', text: Math.roundTo(avg_fps, 2).toString(), label: 'Average FPS'},\n\t\t\t\t\t\tcpu_load:\t\t{type: 'info', text: Math.roundTo(animate_time_sum * 100 / (1000 / avg_fps), 1) + '%', label: 'CPU Load'},\n\t\t\t\t\t\t'_2': '_',\n\n\t\t\t\t\t\tframe_time: \t{type: 'info', text: Math.roundTo(animate_time_sum, 2).toString(), label: 'Frame Time'},\n\t\t\t\t\t\trender_time:\t{type: 'info', text: Math.roundTo(render_time, 2).toString(), label: 'Render Time'},\n\t\t\t\t\t\tanimate_time:\t{type: 'info', text: Math.roundTo(animate_time, 2).toString(), label: 'Animate Time'},\n\t\t\t\t\t\tdispatch_time:\t{type: 'info', text: Math.roundTo(dispatch_time, 2).toString(), label: 'Render Event Hook'},\n\t\t\t\t\t\t'_3': '_',\n\t\t\t\t\t\t\n\t\t\t\t\t\tselection_update:{type: 'info', text: Math.roundTo(selection_update_time, 2).toString(), label: 'Selection Update Time'},\n\t\t\t\t\t\tselection:\t\t{type: 'info', text: Math.roundTo(selection_time, 2).toString(), label: 'Selection Change Time'},\n\t\t\t\t\t\tuv_editor_time: {type: 'info', text: Math.roundTo(uv_editor_time, 2).toString(), label: 'UV Editor Impact'},\n\t\t\t\t\t\toutliner_time:\t{type: 'info', text: Math.roundTo(outliner_time, 2).toString(), label: 'Outliner Impact'},\n\t\t\t\t\t\t'_4': '_',\n\n\t\t\t\t\t\telements:\t\t{type: 'info', text: `${Outliner.selected.length} / ${Outliner.elements.length}`, label: 'Elements'},\n\t\t\t\t\t\tfaces:\t\t\t{type: 'info', text: `${faces_selected} / ${faces_total}`, label: 'Faces'},\n\t\t\t\t\t},\n\t\t\t\t\tonButton(button) {\n\t\t\t\t\t\tif (button == 1) {\n\t\t\t\t\t\t\tperformance_audit_action.click();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}).show();\n\n\t\t\t\ttoast.delete();\n\t\t\t}\n\t\t})\n\t\tMenuBar.menus.help.addAction(performance_audit_action);\n\t},\n\tonunload() {\n\t\tperformance_audit_action.delete()\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/pie_menu.js",
    "content": "(function() {\r\n    function getElementWidth(jqelement){        \r\n        jqelement.attr('style',`width: fit-content`);\r\n        $(document.body).append(jqelement);\r\n        jqelement.attr('style',`width: max-content`);\r\n        let width = jqelement.width();\r\n        \r\n        jqelement.remove();\r\n        return width;\r\n    }\r\n\r\n    class PieMenu extends BarItem{\r\n        /**\r\n         * @type PieMenu\r\n         */\r\n        static active = null;\r\n        static all = {};\r\n        static TWO_PI = 6.283185307179586;\r\n        static HALF_PI = 1.5707963267948966;\r\n        static QUARTER_PI = 0.7853981633974483;\r\n        static mouseEvent = null;\r\n        static debugMode = false;\r\n\r\n        /**\r\n         * Create Pie Menu\r\n         * @param {{\r\n         * name: String,\r\n         * id: String,\r\n         * radius: Number,\r\n         * structure: Array<Action | String>,\r\n         * condition: any,\r\n         * keybind: {key:Number,shift:boolean,ctrl:boolean,alt:boolean,meta:boolean},\r\n         * skipExtraName: Boolean\r\n         * }} data \r\n         */\r\n        constructor(id, data){\r\n            if (typeof id == 'object') {\r\n                data = id;\r\n                id = data.id;\r\n            }\r\n            if (!data.skipExtraName) {\r\n                if (!data.name.endsWith(' Pie Menu')) {\r\n                    data.name = tl(data.name) + ' Pie Menu';\r\n                }\r\n            }\r\n\r\n            super(id, data);\r\n\r\n            this._radius_ = data.radius !== undefined ? data.radius: -1; // negative radius means auto radius multiplied by the absoulte value\r\n            this.structure = data.structure || [];\r\n            this.node = $(`<div class=pieMenu><div class=pieSlices></div><h4></h4><div class=pieCenter><svg><defs><mask id=AngleIndicator><circle/></mask></defs><foreignObject mask=url(#AngleIndicator)><div class=gradient xmlns=http://www.w3.org/1999/xhtml /></foreignObject></svg></div></div>`);\r\n\r\n            this.uuid = guid();\r\n\r\n            PieMenu.all[this.uuid] = this;\r\n\r\n            this.setName(this.name);\r\n\r\n            this.cache = {\r\n                isHold: false,\r\n                lastCenter: [0,0]\r\n            }\r\n\r\n            if (this.id) this.setId(this.id);\r\n        }\r\n        get radius(){\r\n            if (this._radius_ < 0) {\r\n                let autoRadius = 0;\r\n                let indices = [\r\n                    this.actionIndexFromAngle(0,'deg'),\r\n                    this.actionIndexFromAngle(90,'deg'),\r\n                    this.actionIndexFromAngle(180,'deg'),\r\n                    this.actionIndexFromAngle(270,'deg'),\r\n                ]\r\n                for (let i = 0; i < 4; i++) {\r\n                        autoRadius += getElementWidth( this.buildAction( this.getActionAt(indices[i]) ) );\r\n                }\r\n                return ( autoRadius/2 ) * Math.abs(this._radius_);\r\n            }\r\n            return this._radius_;\r\n        }\r\n        set radius(value){\r\n            return value;\r\n        }\r\n        equals(otherPieMenu) {\r\n            return this.uuid == otherPieMenu.uuid;\r\n        }\r\n        setName(value) {\r\n            this.name = value;\r\n            this.setNodeTitle(value);\r\n        }\r\n        setNodeTitle(value){\r\n            this.node.children('h4').html(value);\r\n        }\r\n        setId(value){\r\n            this.id = value;\r\n            this.node.attr('id', value);\r\n            return this;\r\n        }\r\n        conditionMet(){\r\n            return Condition(this.condition);\r\n        }\r\n        show(x = mouse_pos.x, y = mouse_pos.y){\r\n            if (Project==0||Format==0) return;\r\n            if (!this.conditionMet()) return;\r\n            if (PieMenu.active && this.equals(PieMenu.active)) return;\r\n            if (PieMenu.active) PieMenu.active.hide();\r\n            PieMenu.active = this;\r\n            this.build();\r\n\r\n            let r = this.radius;\r\n            // 30 is action heights\r\n            x = Math.clamp(x, r+30, window.innerWidth - (r+30));\r\n            y = Math.clamp(y, r+30, window.innerHeight - (r+30));\r\n\r\n            this.node[0].style.left = x + 'px';\r\n            this.node[0].style.top =  y + 'px';\r\n            this.node[0].style.width = `calc(${r<<1}px + calc(var(--pie-major_radius)*2))` \r\n            this.node[0].style.height = `calc(${r<<1}px + calc(var(--pie-major_radius)*2))` \r\n            this.cache.lastCenter = [x,y];\r\n\r\n            $(document.body).append(this.node)\r\n        }\r\n        hide(){\r\n            PieMenu.active = undefined;\r\n            this.node.remove();\r\n        }\r\n\r\n        // \\ - - - /\r\n        getActionAt(i){\r\n            return typeof this.structure[i] == 'string' ? BarItems[this.structure[i]]: this.structure[i];\r\n        }\r\n        actionConditionMetAt(i) {\r\n            let action = this.getActionAt(i);\r\n            return Condition(action.condition);\r\n        }\r\n        actionIndexFromAngle(angle, unit = 'rad'){\r\n            if (unit == 'deg') {\r\n                angle = Math.degToRad(angle);\r\n            }\r\n            return Math.floor( (angle / PieMenu.TWO_PI) * this.structure.length);\r\n        }\r\n        getActionFromAngle(angle, unit = 'rad'){\r\n            let index = this.actionIndexFromAngle(angle, unit);\r\n            return this.getActionAt(index);\r\n        }\r\n        // \\ - - - /\r\n        buildAction(action, i){\r\n            // Create Action Node\r\n            let actionNode = $('<div></div>');\r\n\r\n            // Add Icon\r\n            if (action.icon) {\r\n                let iconParms = action.icon.split(' ');\r\n                actionNode.append(Blockbench.getIconNode(iconParms[0], action.color || iconParms[1]));\r\n            }\r\n\r\n            // Add Text\r\n            actionNode.append($('<span></span>').text(tl(action.name)));\r\n\r\n            // Add Keybind Label\r\n            actionNode.append( $(`<label class=keybinding_label i=${i}></label>`).text( i < 10 ?i:'' ) );\r\n            return actionNode;\r\n        }\r\n        build(){\r\n            let slices = this.node.children('.pieSlices');\r\n            slices.empty();\r\n\r\n            let angleStep = 360 / this.structure.length;\r\n            let angle = -angleStep-90;\r\n\r\n            for (let i = 0; i < this.structure.length; i++) {\r\n                angle += angleStep;\r\n                const action = this.getActionAt(i);\r\n\r\n                if (!PieMenu.debugMode){\r\n                    if (!this.actionConditionMetAt(i)) continue;\r\n                }         \r\n                \r\n                \r\n                // Create Pie Slice Which Handels Rotation And Animation ( Action Container )\r\n                let slice = $(`<div class=pieSlice></div>`);\r\n\r\n                slice.attr('style', `transform: translate(-50%,-50%) rotate(${angle}deg);`);\r\n\r\n                let actionNode = this.buildAction(action, i);\r\n\r\n                // Reverse Rotation\r\n                actionNode.attr('style', `transform: rotate(${360-angle}deg)`);\r\n\r\n                slice.append(actionNode);\r\n                slices.append(slice);\r\n\r\n            }\r\n\r\n            return this.node;\r\n        }\r\n        trigger(event){\r\n            this.cache.isHold = event.repeat;\r\n            if (!this.cache.isHold) {\r\n                this.setNodeTitle(this.name + `<br> ( IsHold: ${tl('dialog.no')})`)\r\n                this.show();\r\n            } else {\r\n                this.setNodeTitle(this.name + `<br> ( IsHold: ${tl('dialog.yes')})`)\r\n            }\r\n        }\r\n        unTrigger(...arg){ // is it even a word?\r\n\r\n            let action;\r\n\r\n            if (typeof arg[0] === 'number') {\r\n                if (this.actionConditionMetAt(arg[0])) {\r\n                    this.hide();\r\n                    action = this.getActionAt(arg[0]);\r\n                }\r\n            } else if (arg[0] || this.cache.isHold) {\r\n                let angle = this.angleToCursor() - (Math.PI - PieMenu.QUARTER_PI/2);\r\n                angle = (angle + PieMenu.TWO_PI) % PieMenu.TWO_PI;\r\n\r\n                action = this.getActionFromAngle(angle);\r\n                \r\n                this.hide();\r\n            }\r\n\r\n            if (action) {\r\n                if (Condition(action.condition)) {\r\n                    if (action.click) {\r\n                        action.click();\r\n                    }\r\n                    if (action.select) {\r\n                        action.select();\r\n                    }\r\n                    if (action.children) {\r\n                        this.showActionMenuOf(action);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        showActionMenuOf(action){\r\n            if (typeof action.children == 'function') {\r\n                new Menu(action.children()).show(PieMenu.mouseEvent);\r\n\r\n            } else if (action.children instanceof Array && action.children.length) {\r\n                new Menu(action.children).show(PieMenu.mouseEvent);\r\n            }\r\n        }\r\n\r\n        delete() {\r\n            var scope = this;\r\n            this.toolbars.forEach(bar => {\r\n                bar.remove(scope);\r\n            })\r\n            delete BarItems[this.id];\r\n            Keybinds.actions.remove(this);\r\n            delete PieMenu.all[this.uuid];\r\n        }\r\n        angleToCursor(){\r\n            return new THREE.Vector2( mouse_pos.x , mouse_pos.y ).sub(new THREE.Vector2( ...this.cache.lastCenter )).angle();\r\n        }\r\n        static initCSS() {\r\n            let style = $('#pieMenuStyles');\r\n            if (style.length) {\r\n                style.remove();   \r\n            }\r\n            style = $('<style id=\"pieMenuStyles\"></style>');\r\n            style.text(\r\n                // Container\r\n                `:root{--pie-dir_idct_size:10%;--pie-major_radius:30px;--pie-major_thickness:22px}.pieMenu{transform:translate(-50%,-50%);width:50%;height:50%;position: fixed;}.pieCenter{position:relative;top:50%;left:50%;transform:translate(-50%,-50%);width:calc(var(--pie-major_radius) * 2);height:calc(var(--pie-major_radius) * 2)}.pieCenter>svg{height:calc(var(--pie-major_radius) * 2);width:calc(var(--pie-major_radius) * 2)}.pieCenter>svg circle{cx:var(--pie-major_radius);cy:var(--pie-major_radius);r:calc(var(--pie-major_radius) - calc(var(--pie-major_thickness) * 0.5));stroke-width:calc(var(--pie-major_thickness) * .5);fill:none;stroke:white}.pieCenter div.gradient{width:100%;height:100%;border-radius:50%;--l_o:calc(50% - var(--pie-dir_idct_size));--r_o:calc(50% + var(--pie-dir_idct_size));background:conic-gradient(from 0deg at 50% 50%,var(--color-bright_ui) var(--l_o),var(--color-accent) var(--l_o),var(--color-accent) 50%,var(--color-accent) var(--r_o),var(--color-bright_ui) var(--r_o));box-shadow: inset 0px 0px 20px 0px black;}.pieCenter>svg foreignObject{--r:calc(var(--pie-major_radius)*2);width:var(--r);height:var(--r)}`\r\n                +\r\n                // Actions\r\n                `.pieSlice{height:100%;width:fit-content;position: absolute;left: 50%;top: 50%;animation:expandOut .1s linear}.pieSlice div{display:flex;height:30px;padding:4px;padding-left:34px;padding-right:8px;width:max-content;background-color: var(--color-bright_ui);color: var(--color-bright_ui_text);border-radius:5px;box-shadow: 0 0 6px 0px #0005;}.pieSlice div.focused{background-color:var(--color-accent)}.pieSlice div>i{margin-top:1px;margin-right:4px;margin-left:-28px;pointer-events:none}.pieSlice div>img{cursor:default;height:20px;width:20px;color:var(--color-text);white-space:nowrap;margin-bottom:-3px;margin-left:-27px;margin-right:5px;margin-top:1px}.pieSlice div>span{pointer-events:none;flex:1 0 auto}.pieSlices{width:100%;height:100%;position: absolute;}`\r\n                +\r\n                // Animations\r\n                `@keyframes expandOut{0%{height:0%}100%{height:100%}}`\r\n                + \r\n                // Title\r\n                `.pieMenu h4{position: absolute;left: 50%;top: calc(50% - 75px);transform: translate(-50%,-50%);width: fit-content;color: var(--color-subtle_text);text-align:center}`\r\n            )\r\n            $(document.body).append(style);\r\n        }\r\n        static onkeyup(e){\r\n            if (!PieMenu.active) return;\r\n            if (!PieMenu.active.keybind) return;\r\n            if (e.which == 27) { PieMenu.active.hide(); return; };\r\n\r\n            let actionIndex = e.which - 48;\r\n            if (Math.isBetween(actionIndex, 0, 9)) {\r\n                PieMenu.active.unTrigger(actionIndex);\r\n                return;\r\n            }\r\n            if (PieMenu.active.cache.isHold && e.which == PieMenu.active.keybind.key) {\r\n                PieMenu.active.unTrigger(); \r\n            }\r\n        }\r\n        static onclick(e){\r\n            if (!PieMenu.active) return;\r\n            if (!PieMenu.active.cache.isHold) {\r\n                PieMenu.active.unTrigger(true);\r\n            }\r\n        }\r\n        static onmousemove(e){\r\n            PieMenu.mouseEvent = e;\r\n            if (!PieMenu.active) return;\r\n            \r\n            let pieCenter = PieMenu.active.node.children('.pieCenter');\r\n\r\n            let angle = PieMenu.active.angleToCursor();\r\n            pieCenter.attr('style', `transform: translate(-50%, -50%) rotate(calc(${angle}rad - 90deg))`);\r\n\r\n            angle -= Math.PI - PieMenu.QUARTER_PI/2;\r\n            angle = (angle + PieMenu.TWO_PI) % PieMenu.TWO_PI;\r\n            \r\n            let index = PieMenu.active.actionIndexFromAngle(angle);\r\n            PieMenu.active.node.find('.pieSlices div').removeClass('focused');\r\n            if (PieMenu.active.actionConditionMetAt(index)) {\r\n                \r\n                PieMenu.active.node\r\n                .children('.pieSlices')\r\n                .find(`label[i=${index}]`)\r\n                .parent()\r\n                .addClass('focused')\r\n            }\r\n        }\r\n        fromAction(action, menu={}) {\r\n            if (typeof action.children == 'function') {\r\n                this.structure = action.children();\r\n            } else {\r\n                this.structure = action.children;\r\n            }\r\n            this.condition = action.condition || menu.condition;\r\n            this.structure = this.structure.filter(e=> e != '_');\r\n            return this;\r\n        }\r\n        fromBarSelect(barselect){\r\n            let actions  = [];\r\n            for (const key in barselect.options) {\r\n                const option = barselect.options[key];\r\n                \r\n                let name = barselect.getNameFor(key)\r\n                let icon = option.icon || '';\r\n                let data = {\r\n                    name,icon,\r\n                    id: key+'_pie_action',\r\n                    private: true,\r\n                    click(){\r\n                        barselect.set(key);\r\n                        barselect.onChange(barselect.value);\r\n                    },\r\n                    condition: undefined\r\n                };\r\n                if (option.condition) data.condition = option.condition;\r\n                actions.push( new Action(data) )\r\n            }\r\n            this.structure=actions;\r\n            return this;\r\n        }\r\n        \r\n    }\r\n    window.PieMenu = PieMenu;\r\n\r\n    document.removeEventListener('keyup', PieMenu.onkeyup)\r\n    document.addEventListener('keyup', PieMenu.onkeyup);\r\n\r\n    document.removeEventListener('click', PieMenu.onclick)\r\n    document.addEventListener('click', PieMenu.onclick);\r\n\r\n    document.removeEventListener('mousemove', PieMenu.onmousemove)\r\n    document.addEventListener('mousemove', PieMenu.onmousemove);\r\n\r\n    PieMenu.initCSS();\r\n\r\n    let addedPieMenus = [];\r\n    Plugin.register(\"pie_menu\", {\r\n\t\ttitle: \"Pie Menus\",\r\n\t\ticon: \"fas.fa-chart-pie\",\r\n\t\tauthor: \"Malik12tree\",\r\n\t\tdescription: \"Add pie shaped menus for faster work.\",\r\n\t\tabout: \"<style>.piePrivate p{width: fit-content;display: inline;margin-left: 10px !important;}.piePrivate tr td:nth-child(2){padding-left:10px}.piePrivate2 td, .piePrivate2 th{padding:0 10px}</style><h1>Built-in Pies</h1><table class=piePrivate><tr>    <td>Add Pie</td>    <td>Keybind: </td>    <td><p><code>ctrl + shift + a</code></p></td></tr><tr>    <td>Import Pie</td>    <td>Keybind: </td>    <td><p><code>shift + q</code></p></td></tr><tr>    <td>Export Pie</td>    <td>Keybind: </td>    <td><p><code>shift + w</code></p></td></tr><tr>    <td>Mode Pie</td>    <td>Keybind: </td>    <td><p><code>shift + tab (web: shift + x)</code></p></td></tr><tr>    <td>View Mode Pie</td>    <td>Keybind: </td>    <td><p><code>alt + z</code></p></td></tr><tr>    <td>Toolbox Pie</td>    <td>Keybind: </td>    <td><p><code>shift + t</code></p></td></tr><tr>    <td>New Pie</td>    <td>Keybind: </td>    <td><p><code>shift + n</code></p></td></tr><tr>    <td>Preferences Pie</td>    <td>Keybind: </td>    <td><p><code>shift + o</code></p></td></tr><tr>    <td>Rotate Pie</td>    <td>Keybind: </td>    <td><p><code>shift + r</code></p></td></tr><tr>    <td>Flip Pie</td>    <td>Keybind: </td>    <td><p><code>shift + f</code></p></td></tr><tr>    <td>Center Pie</td>    <td>Keybind: </td>    <td><p><code>shift + c</code></p></td></tr><tr>    <td>Properties Pie</td>    <td>Keybind: </td>    <td><p><code>shift + p</code></p></td></tr></table><h1>API</h1><h2>CSS Variables</h2><table class=piePrivate2><tr><th>Name</th><th>Default</th><th>Description</th></tr><tr><td>--pie-dir_idct_size</td><td>10%</td><td>sets the angle indicator size</td></tr><tr><td>--pie-major_radius</td><td>30px</td><td>sets the center pie's radius</td></tr><tr><td>--pie-major_thickness</td><td>22px</td><td>sets the center pie's thickness</td></tr></table>\",\r\n\t\tversion: \"1.0.0\",\r\n\t\tvariant: \"both\",\r\n        tags: [\"Interface\"],\r\n\t\tonload() {\r\n            addedPieMenus.push(\r\n                new PieMenu({\r\n                    name: \"Add Pie Menu\", // NEEDS LANG SUPPORT,\r\n                    id: 'add_pie_menu',\r\n                    radius: -0.75,\r\n                    keybind: {key:65,shift:true,ctrl:true},\r\n                    structure: ['add_cube','add_group','add_locator','add_mesh','add_null_object','add_texture_mesh','add_animation','add_keyframe']\r\n                }),\r\n\r\n                new PieMenu({\r\n                    name: 'generic.import',\r\n                    keybind: {key:81,shift:true},\r\n                    id: 'import_pie_menu',\r\n                    radius: -0.75,\r\n                }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='import')),\r\n                \r\n                new PieMenu({\r\n                    name: 'generic.export',\r\n                    keybind: {key:87,shift:true},\r\n                    id: 'export_pie_menu',\r\n                    radius: -0.7,\r\n                }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='export')),\r\n                \r\n                new PieMenu({\r\n                    name: 'action.view_mode',\r\n                    id: 'view_mode_pie_menu',\r\n                    keybind: {key:90,alt:true},\r\n                    radius: -1,\r\n                }).fromBarSelect(BarItems['view_mode']),\r\n                \r\n                new PieMenu({\r\n                    name: \"Mode Pie Menu\", // NEEDS LANG SUPPORT,\r\n                    id: 'mode_pie_menu',\r\n                    radius: -1.5,\r\n                    keybind: Blockbench.isWeb ? {key:88,shift:true}: {key:9,shift:true},\r\n                    structure: (function() {\r\n                        let actions = [];\r\n                        for (const key in Modes.options) {\r\n                            const mode = Modes.options[key];\r\n\r\n                            actions.push(\r\n                                new Action({\r\n                                    name: mode.name,\r\n                                    condition: mode.condition,\r\n                                    id: key+'_pie_action',\r\n                                    private: true,\r\n\r\n                                    click(){ mode.select() }\r\n                                })\r\n                            )\r\n                        }\r\n                        return actions;\r\n                    })()\r\n                }),\r\n\r\n                new PieMenu({\r\n                    name: 'Tool Pie Menu',\r\n                    id: 'main_tools_pie_menu',\r\n                    radius: -1.5,\r\n                    keybind: {key:84,shift:true},\r\n                    structure: (function() {\r\n                        let actions = [];\r\n                        let tools = Toolbox.children.filter(tool => tool instanceof Tool);\r\n                        tools.forEach(tool => {\r\n                            actions.push(\r\n                                new Action({\r\n                                    id: tool.id,\r\n                                    name: tl(tool.name),\r\n                                    private: true,\r\n                                    icon: tool.icon,\r\n                                    click(){\r\n                                        tool.select();\r\n                                    },\r\n                                    condition: tool.condition\r\n                                })\r\n                            )\r\n                        });\r\n                        return actions;\r\n                    })()\r\n                }),\r\n\r\n                new PieMenu({\r\n                    name: 'New Pie Menu',\r\n                    keybind: {key:78,shift:true},\r\n                    id: 'new_pie_menu',\r\n                    radius: -1,\r\n                }).fromAction(MenuBar.menus.file.structure.find(e=>e.id=='new')),\r\n\r\n                new PieMenu({\r\n                    name: 'Preferences Pie Menu',\r\n                    keybind: {key:79,shift:true},\r\n                    id: 'preferences_pie_menu',\r\n                    radius: -1,\r\n                }).fromAction(MenuBar.menus.file.structure.find(e=>e.id==\"preferences\")),\r\n\r\n                ...(function() {\r\n                    let pies = [];\r\n                    const keybinds = [\r\n                        {key:82,shift:true},\r\n                        {key:70,shift:true},\r\n                        {key:67,shift:true},\r\n                        {key:80,shift:true}\r\n                    ];\r\n                    const radii = [ -0.75,-1,-1,-0.75 ];\r\n\r\n                    for (let i = 1; i < 5; i++) {\r\n                        let action = MenuBar.menus.transform.structure[i];\r\n                        pies.push(\r\n                            new PieMenu({\r\n                                keybind: keybinds[i-1],\r\n                                id: action.id +'_pie_menu',\r\n                                name: tl(action.name),\r\n                                radius: radii[i-1],\r\n                            }).fromAction(MenuBar.menus.transform.structure[i], MenuBar.menus.transform),\r\n                        )\r\n                    }\r\n                    return pies;\r\n                })(),\r\n            );\r\n            addedPieMenus[7].structure.push(BarItems['plugins_window']); // add plugins window in the preferences pie \r\n\r\n        },\r\n        onunload() {\r\n            addedPieMenus.forEach(m => m.delete() );\r\n            addedPieMenus = [];\r\n        }\r\n    });\r\n})()\r\n\r\n// 500."
  },
  {
    "path": "plugins/plaster.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\r\n\r\n(function() {\r\n\r\nvar plaster_action;\r\n\r\nPlugin.register('plaster', {\r\n\ttitle: 'Plaster',\r\n\ticon: 'healing',\r\n\tauthor: 'JannisX11',\r\n\tdescription: 'Fixes texture bleeding (small white or colored lines around the edges of your model) by slightly shrinking UV maps',\r\n\tversion: '1.1.0',\r\n\tmin_version: '3.0.5',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\t\tplaster_action = new Action({\r\n\t\t    id: 'plaster',\r\n\t\t    name: 'Plaster',\r\n\t\t    icon: 'healing',\r\n\t\t    category: 'edit',\r\n\t\t    condition: () => !(Project.box_uv && !Format.optional_box_uv),\r\n\t\t    click(ev) {\r\n\t\t    \tif (selected.length === 0) {\r\n\t\t\t\t\tBlockbench.showMessage('No cubes selected', 'center')\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tlet elements = Outliner.selected.filter(element => element.faces);\r\n\r\n\t\t\t\tnew Dialog({\r\n\t\t\t\t\tid: 'plaster',\r\n\t\t\t\t\ttitle: 'Plaster',\r\n\t\t\t\t\ticon: 'healing',\r\n\t\t\t\t\tform: {\r\n\t\t\t\t\t\tmargin: {label: 'Margin', type: 'select', options: {\r\n\t\t\t\t\t\t\ts: 'Small',\r\n\t\t\t\t\t\t\tm: 'Medium',\r\n\t\t\t\t\t\t\tl: 'Large',\r\n\t\t\t\t\t\t\txl: 'Extra Large',\r\n\t\t\t\t\t\t\tcustom: 'Custom',\r\n\t\t\t\t\t\t}, default: 'm'},\r\n\t\t\t\t\t\tcustom: {label: 'Custom Margin (%)', value: 5, min: 0, max: 50, condition: result => result.margin == 'custom'}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonConfirm(formData) {\r\n\t\t\t\t\t\tthis.hide()\r\n\t\t\t\t\t\t//Margin\r\n\t\t\t\t\t\tvar margin;\r\n\t\t\t\t\t\tswitch (formData.margin) {\r\n\t\t\t\t\t\t\tcase 's':\r\n\t\t\t\t\t\t\t\tmargin = 0.016\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 'm':\r\n\t\t\t\t\t\t\t\tmargin = 0.032\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 'l':\r\n\t\t\t\t\t\t\t\tmargin = 0.06\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 'xl':\r\n\t\t\t\t\t\t\t\tmargin = 0.1\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase 'custom':\r\n\t\t\t\t\t\t\t\tmargin = formData.custom/100\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlet fixNumber = function(number, isSecond) {\r\n\t\t\t\t\t\t\t//Vars\r\n\t\t\t\t\t\t\tlet adapted_margin = margin\r\n\t\t\t\t\t\t\tlet x1 = number\r\n\t\t\t\t\t\t\tlet edge = x1%1\r\n\t\t\t\t\t\t\tlet floor = Math.floor(x1)\r\n\r\n\t\t\t\t\t\t\t//Switches\r\n\t\t\t\t\t\t\tif (edge > 0.9 && !isSecond) {\r\n\t\t\t\t\t\t\t\tedge = 1 + adapted_margin\r\n\t\t\t\t\t\t\t} else if (edge < 0.1 && isSecond) {\r\n\t\t\t\t\t\t\t\tedge = -adapted_margin\r\n\t\t\t\t\t\t\t} else if (edge === 0 && !isSecond) {\r\n\t\t\t\t\t\t\t\tedge = adapted_margin\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t//Return\r\n\t\t\t\t\t\t\treturn floor+edge\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tUndo.initEdit({elements, uv_only: true})\r\n\t\t\t\t\t\t//Processing\r\n\t\t\t\t\t\telements.forEach(element => {\r\n\t\t\t\t\t\t\tfor (let fkey in element.faces) {\r\n\t\t\t\t\t\t\t\tlet face = element.faces[fkey];\r\n\t\t\t\t\t\t\t\tif (face.texture !== null) {\r\n\r\n\t\t\t\t\t\t\t\t\tif (face instanceof MeshFace) {\r\n\t\t\t\t\t\t\t\t\t\tlet uv_center = [0, 0];\r\n\t\t\t\t\t\t\t\t\t\tlet vertices = face.getSortedVertices();\r\n\t\t\t\t\t\t\t\t\t\tfor (let vkey of vertices) {\r\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(uv_center.slice(), face.uv[vkey].slice())\r\n\t\t\t\t\t\t\t\t\t\t\tuv_center.V2_add(face.uv[vkey]);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tuv_center.V2_divide(vertices.length);\r\n\t\t\t\t\t\t\t\t\t\tfor (let vkey of vertices) {\r\n\t\t\t\t\t\t\t\t\t\t\tlet diff_to_center = uv_center.slice().V2_subtract(face.uv[vkey]);\r\n\t\t\t\t\t\t\t\t\t\t\tlet distance = Math.sqrt(Math.pow(diff_to_center[0], 2) + Math.pow(diff_to_center[1], 2));\r\n\t\t\t\t\t\t\t\t\t\t\tconsole.log({uv_center, uv: face.uv[vkey].slice(), diff_to_center, distance, margin, vkey, face})\r\n\t\t\t\t\t\t\t\t\t\t\tface.uv[vkey][0] += (diff_to_center[0] / distance) * margin;\r\n\t\t\t\t\t\t\t\t\t\t\tface.uv[vkey][1] += (diff_to_center[1] / distance) * margin;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t} else if (face.uv instanceof Array) {\r\n\t\t\t\t\t\t\t\t\t\tface.uv.forEach(function(u, i) {\r\n\t\t\t\t\t\t\t\t\t\t\tlet is_mirrored = face.uv[ (i>1?i-2:i) ] > face.uv[i+ (i>1?0:2) ]\r\n\t\t\t\t\t\t\t\t\t\t\tface.uv[i] = fixNumber(face.uv[i], i>1 !== is_mirrored)\r\n\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telement.preview_controller.updateUV(element);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tUVEditor.loadData()\r\n\t\t\t\t\t\tUndo.finishEdit('plaster')\r\n\t\t\t\t\t}\r\n\t\t\t\t}).show()\r\n\t\t    }\r\n\t\t})\r\n\t\tMenuBar.addAction(plaster_action, 'filter')\r\n\t},\r\n\tonunload() {\r\n\t\tplaster_action.delete()\r\n\t}\r\n});\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/player_statue_generator.js",
    "content": "var generatePlayerStatueAction;\n\nPlugin.register('player_statue_generator', {\n    icon: 'accessibility',\n    title: 'Player Statue Generator',\n    description: 'Generates player shaped models.',\n    tags: [\"Minecraft: Java Edition\"],\n    author: 'Wither, dragonmaster95 and 3XH6R',\n    version: '2.0.2',\n    min_version: '3.0.0',\n    variant: 'both',\n\n    onload() {\n        generatePlayerStatueAction = new Action({\n            id: 'generate_player_statue',\n            name: 'Generate Player Statue',\n            icon: 'accessibility',\n            description: 'Generates a player shaped model',\n            category: 'filter',\n            condition: () => Format.id === \"java_block\",\n            click: function(ev) {\n                playerModelSettings.show()\n            }\n        })\n        MenuBar.addAction(generatePlayerStatueAction, 'filter');\n    },\n    onunload() {\n        this.onuninstall();\n    },\n    onuninstall() {\n        generatePlayerStatueAction.delete();\n    }\n})\n\nvar playerModelSettings = new Dialog({\n    title: 'Choose Model',\n    id: 'playerModelSettings',\n    form: {\n        model: {label: 'Player Model', type: 'select', options: {steve: 'Steve (Classic)', alex: 'Alex (Slim)'}, default:'Steve (Classic)'},\n        secondLayer: {label: 'Generate Second Layer', type: 'checkbox'},\n        cape: {label: 'Cape', type: 'checkbox'}\n    }\n});\n\nvar capeInfo = new Dialog({\n    title: 'Cape Texture Warning',\n    id: 'cape_warning',\n    lines: [\n        'You might have to edit your cape texture <br>to a square format(32x32) to make it work in-game!<br> <a class=\"open-in-browser\" id=\"cape-gen-button\" style=\"text-decoration: underline;\">Click here</a> to import the texture template.',\n        '<p></p>'\n    ]\n});\n\nfunction setDisplay() {\n    if(display.head === undefined) {\n        display.head = new DisplaySlot('head', {translation: [0, -29, 0], scale: [1.6, 1.6, 1.6]});\n    }\n    else {\n        display.head.scale = [1.6, 1.6, 1.6];\n        display.head.translation = [0, -29, 0];\n    }\n}\n\nfunction generateSteve(secondLayer) {\n    Undo.initEdit({element: Outliner.elements, outliner: true });\n    steveGroup = new Group('steve').init();\n \n    new Cube({name:'head',from:[4,23.5,4],to:[12,31.5,12],autouv:0,faces:{north:{uv:[2,2,4,4]},south:{uv:[6,2,8,4]},west:{uv:[4,2,6,4]},east:{uv:[0,2,2,4]},up:{uv:[4,2,2,0]},down:{uv:[6,0,4,2]}}}).addTo(steveGroup).init();\n    new Cube({name:'body',from:[4,11.5,6],to:[12,23.5,10],autouv:0,faces:{north:{uv:[5,5,7,7.98]},south:{uv:[8,5,10,8]},west:{uv:[7,5,8,7.98]},east:{uv:[4,5,5,8]},up:{uv:[7,5,5,4]},down:{uv:[9,4,7,5]}}}).addTo(steveGroup).init();\n    new Cube({name:'right_arm',from:[12,11.5,6],to:[16,23.5,10],autouv:0,faces:{north:{uv:[11,5,12,8]},south:{uv:[13,5,14,8]},west:{uv:[12,5,13,8]},east:{uv:[10,5,11,8]},up:{uv:[12,5,11,4]},down:{uv:[13,4,12,5]}}}).addTo(steveGroup).init();\n    new Cube({name:'left_arm',from:[0,11.5,6],to:[4,23.5,10],autouv:0,faces:{north:{uv:[9,13,10,16]},south:{uv:[11,13,12,16]},west:{uv:[10,13,11,16]},east:{uv:[8,13,9,16]},up:{uv:[10,13,9,12]},down:{uv:[11,12,10,13]}}}).addTo(steveGroup).init();\n    new Cube({name:'right_leg',from:[8,-0.5,6],to:[12,11.5,10],autouv:0,faces:{north:{uv:[1,5,2,8]},south:{uv:[3,5,4,8]},west:{uv:[2,5,3,8]},east:{uv:[0,5,1,8]},up:{uv:[2,5,1,4]},down:{uv:[3,4,2,5]}}}).addTo(steveGroup).init();\n    new Cube({name:'left_leg',from:[4,-0.5,6],to:[8,11.5,10],autouv:0,faces:{north:{uv:[5,13,6,16]},south:{uv:[7,13,8,16]},west:{uv:[6,13,7,16]},east:{uv:[4,13,5,16]},up:{uv:[6,13,5,12]},down:{uv:[7,12,6,13]}}}).addTo(steveGroup).init();\n    \n    if (secondLayer) {\n        new Cube({name:'head_2nd_layer',from:[3.5,23,3.5],to:[12.5,32,12.5],autouv:0,faces:{north:{uv:[10,2,12,4]},south:{uv:[14,2,16,4]},west:{uv:[12,2,14,4]},east:{uv:[8,2,10,4]},up:{uv:[12,2,10,0]},down:{uv:[14,0,12,2]}}}).addTo(steveGroup).init();\n        new Cube({name:'body_2nd_layer',from:[4,11.02,5.5],to:[12,24.03,10.5],autouv:0,faces:{north:{uv:[5,9,7,12]},south:{uv:[8,9,10,12]},west:{uv:[7,9,8,12]},east:{uv:[4,9,5,12]},up:{uv:[7,9,5,8]},down:{uv:[9,8,7,9]}}}).addTo(steveGroup).init();\n        new Cube({name:'right_arm_2nd_layer',from:[11.5,11,5.5],to:[16.49,24,10.5],autouv:0,faces:{north:{uv:[11,9,12,12]},south:{uv:[13,9,14,12]},west:{uv:[12,9,13,12]},east:{uv:[10,9,11,12]},up:{uv:[12,9,11,8]},down:{uv:[13,8,12,9]}}}).addTo(steveGroup).init();\n        new Cube({name:'left_arm_2nd_layer',from:[-0.5,11,5.5],to:[4.5,24,10.5],autouv:0,faces:{north:{uv:[13,13,14,16]},south:{uv:[15,13,16,16]},west:{uv:[14,13,15,16]},east:{uv:[12,13,13,16]},up:{uv:[14,13,13,12]},down:{uv:[15,12,14,13]}}}).addTo(steveGroup).init();\n        new Cube({name:'right_leg_2nd_layer',from:[7.5,-1,5.5],to:[12.5,12,10.5],autouv:0,faces:{north:{uv:[1,9,2,12]},south:{uv:[3,9,4,12]},west:{uv:[2,9,3,12]},east:{uv:[0,9,1,12]},up:{uv:[2,9,1,8]},down:{uv:[3,8,2,9]}}}).addTo(steveGroup).init();\n        new Cube({name:'left_leg_2nd_layer',from:[3.5,-1,5.5],to:[8.5,12,10.5],autouv:0,faces:{north:{uv:[1,13,2,16]},south:{uv:[3,13,4,16]},west:{uv:[2,13,3,16]},east:{uv:[0,13,1,16]},up:{uv:[2,12,1,11]},down:{uv:[3,12,2,13]}}}).addTo(steveGroup).init();\n    }\n    setDisplay();\n    steveGroup.openUp().select();\n    playerModelSettings.hide();\n    Undo.finishEdit('Generated Steve Statue');\n}\n\nfunction generateAlex(secondLayer) {\n    Undo.initEdit({elements: Outliner.elements, outliner: true});\n    alexGroup = new Group('alex').init();\n\n    new Cube({name:'head',from:[4,23.5,4],to:[12,31.5,12],autouv:0,faces:{north:{uv:[2,2,4,4]},south:{uv:[6,2,8,4]},west:{uv:[4,2,6,4]},east:{uv:[0,2,2,4]},up:{uv:[4,2,2,0]},down:{uv:[6,0,4,2]}}}).addTo(alexGroup).init();\n    new Cube({name:'body',from:[4,11.5,6],to:[12,23.5,10],autouv:0,faces:{north:{uv:[5,5,7,8]},south:{uv:[8,5,10,8]},west:{uv:[7,5,8,8]},east:{uv:[4,5,5,8]},up:{uv:[7,5,5,4]},down:{uv:[9,4,7,5]}}}).addTo(alexGroup).init();\n    new Cube({name:'right_arm',from:[12,11.5,6],to:[15,23.5,10],autouv:0,faces:{north:{uv:[11,5,11.75,8]},south:{uv:[12.75,5,13.5,8]},west:{uv:[11.75,5,12.75,8]},east:{uv:[10,5,11,8]},up:{uv:[11.75,5,11,4]},down:{uv:[12.5,4,11.75,5]}}}).addTo(alexGroup).init();\n    new Cube({name:'left_arm',from:[1,11.5,6],to:[4,23.5,10],autouv:0,faces:{north:{uv:[9,13,9.75,16]},south:{uv:[10.75,13,11.5,16]},west:{uv:[9.75,13,10.75,16]},east:{uv:[8,13,9,16]},up:{uv:[9.75,13,9,12]},down:{uv:[10.5,12,9.75,13]}}}).addTo(alexGroup).init();\n    new Cube({name:'right_leg',from:[4,-0.5,6],to:[8,11.5,10],autouv:0,faces:{north:{uv:[5,13,6,16]},south:{uv:[7,13,8,16]},west:{uv:[6,13,7,16]},east:{uv:[4,13,5,16]},up:{uv:[6,13,5,12]},down:{uv:[7,12,6,13]}}}).addTo(alexGroup).init();\n    new Cube({name:'left_leg',from:[8,-0.5,6],to:[12,11.5,10],autouv:0,faces:{north:{uv:[1,5,2,8]},south:{uv:[3,5,4,8]},west:{uv:[2,5,3,8]},east:{uv:[0,5,1,8]},up:{uv:[2,5,1,4]},down:{uv:[3,4,2,5]}}}).addTo(alexGroup).init();\n\n    if (secondLayer) {\n        new Cube({name:'head_2nd_layer',from:[3.5,23,3.5],to:[12.5,32,12.5],autouv:0,faces:{north:{uv:[10,2,12,4]},south:{uv:[14,2,16,4]},west:{uv:[12,2,14,4]},east:{uv:[8,2,10,4]},up:{uv:[12,2,10,0]},down:{uv:[14,0,12,2]}}}).addTo(alexGroup).init();\n        new Cube({name:'body_2nd_layer',from:[4,11.02,5.49],to:[12,24.03,10.49],autouv:0,faces:{north:{uv:[5,9,7,12]},south:{uv:[8,9,10,12]},west:{uv:[7,9,8,12]},east:{uv:[4,9,5,12]},up:{uv:[7,9,5,8]},down:{uv:[9,8,7,9]}}}).addTo(alexGroup).init();\n        new Cube({name:'right_arm_2nd_layer',from:[11.5,11,5.5],to:[15.5,24,10.5],autouv:0,faces:{north:{uv:[10.75,9,11.5,12]},south:{uv:[12.75,9,13.5,12]},west:{uv:[11.75,9,12.75,12]},east:{uv:[10,9,11,12]},up:{uv:[11.75,9,11,8]},down:{uv:[12.5,8,11.75,9]}}}).addTo(alexGroup).init();\n        new Cube({name:'left_arm_2nd_layer',from:[0.5,11,5.5],to:[4.5,24,10.5],autouv:0,faces:{north:{uv:[13,13,13.75,16]},south:{uv:[14.75,13,15.5,16]},west:{uv:[13.75,13,14.75,16]},east:{uv:[12,13,13,16]},up:{uv:[13.75,13,13,12]},down:{uv:[14.5,12,13.75,13]}}}).addTo(alexGroup).init();\n        new Cube({name:'right_leg_2nd_layer',from:[7.5,-1,5.5],to:[12.5,12,10.5],autouv:0,faces:{north:{uv:[1,9,2,12]},south:{uv:[3,9,4,12]},west:{uv:[0,9,1,12]},east:{uv:[0,9,1,12]},up:{uv:[2,9,1,8]},down:{uv:[3,8,2,9]}}}).addTo(alexGroup).init();\n        new Cube({name:'left_leg_2nd_layer',from:[3.5,-1,5.5],to:[8.5,12,10.5],autouv:0,faces:{north:{uv:[1,13,2,16]},south:{uv:[3,13,4,16]},west:{uv:[2,13,3,16]},east:{uv:[0,13,1,16]},up:{uv:[2,13,1,12]},down:{uv:[3,12,2,13]}}}).addTo(alexGroup).init();\n    }\n    setDisplay();\n    alexGroup.openUp().select();\n    playerModelSettings.hide();\n    Undo.finishEdit('Generated Alex Statue');\n}\n\nfunction generateCape(){\n    Undo.initEdit({elements: Outliner.elements, outliner: true});\n    new Cube({name:'cape',from:[2.5,6,13],to:[13.5,23,14],autouv:0,faces:{north:{uv:[0.5,0.5,6,9]},south:{uv:[6.5,0.5,12,9]},west:{uv:[6,0.5,6.5,9]},east:{uv:[0,0.5,0.5,9]},up:{uv:[6,0.5,0.5,0]},down:{uv:[11.5,0,6,0.5]}},rotation:[-22.5,0,0],origin:[7.5,14,10.5]}).init();\n    setDisplay();\n    Undo.finishEdit('Generated Cape Model');\n}\n\nplayerModelSettings.onConfirm = function(data) {\n    switch(data.model) {\n        case 'steve':\n            generateSteve(data.secondLayer);\n            break;\n        case 'alex':\n            generateAlex(data.secondLayer);\n            break;\n    }\n    if (data.cape) {\n        playerModelSettings.hide();\n        capeInfo.show();\n        document.getElementById('cape-gen-button').onclick = function() {\n            let capeTexture = new Texture({name: 'cape_texture', res: 32, mode: 'bitmap', source: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAklEQVR4AewaftIAAACRSURBVO3BoQ3CUBSG0e/dNIGEBZpgSBAMwhCMwDIUAQrVCXBMga6pK6JJBbaiqiCK5T0Skt/ccwJvt+oxkqgszqS6lodARNh2xZhXe1Jd7iey3ZNU8/Ux8EXGZJUviGm6no/ZckPM0NbEGGKGmCFmiBlihpghZogZYoaYIWaIGWKGWMak6Xp+MbQ1zjnnnPuHFz1lGpsvFTuyAAAAAElFTkSuQmCC'});\n            capeTexture.add();\n            capeTexture.load();\n        };\n    }\n}\n\ncapeInfo.onConfirm = function() {\n    playerModelSettings.hide();\n    capeInfo.hide();\n    generateCape();\n}\n"
  },
  {
    "path": "plugins/pluginstats.js",
    "content": ";(function () {\r\nconst STORE = \"store\";\r\nconst MAX_WEEKS = 52; // year\r\nconst URL = 'https://blckbn.ch/api/stats/plugins?weeks=';\r\nconst KEY_STORAGE = 'ps-data';\r\n\r\n/**\r\n * https://github.com/Malik12tree/LineGraph.js\r\n * @author Malik12tree\r\n */\r\nconst Graph = (function() {\r\n\r\n\r\nconst xmlns = \"http://www.w3.org/2000/svg\";\r\n\r\nclass SVGShapeContainer {\r\n\tconstructor(width, height) {\r\n\t\tthis.node = document.createElementNS(xmlns, \"svg\");\r\n\t\tthis.groupNode = document.createElementNS(xmlns, \"g\");\r\n\r\n\t\tthis.node.append(this.groupNode);\r\n\r\n\t\tthis.setSize(width, height);\r\n\t}\r\n\tsetPadding(paddingInPercent) {\r\n\t\tconst g = this.groupNode;\r\n\t\t\r\n\t\tif (paddingInPercent != 1) {\r\n\t\t\tg.setAttributeNS(null, 'transform', `scale(${paddingInPercent})`);\r\n\t\t\tg.setAttributeNS(null, 'transform-origin', 'center');\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tg.removeAttributeNS(null, 'transform');\r\n\t\tg.removeAttributeNS(null, 'transform-origin');\r\n\t\treturn this;\r\n\t}\r\n\tsetSize(width, height) {\r\n\t\tthis.width = width;\r\n\t\tthis.height = height;\r\n\r\n\t\tthis.node.setAttributeNS(null, \"viewBox\", \"0 0 \" + width + \" \" + height);\r\n\t\tthis.node.setAttributeNS(null, \"width\", width);\r\n\t\tthis.node.setAttributeNS(null, \"height\", height);\r\n\t}\r\n\tadd(...svgshapes) {\r\n\t\tsvgshapes.forEach(shape => {\r\n\t\t\tthis.groupNode.append(shape.node ?? shape);\r\n\t\t});\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\nclass SVGShape {\r\n\tconstructor() {\r\n\t\tlet scopedPath = '';\r\n\t\tObject.defineProperty(this, 'path',{\r\n\t\t\tenumerable: true,\r\n\t\t\tget() {\r\n\t\t\t\treturn scopedPath;\r\n\t\t\t},\r\n\t\t\tset(value) {\r\n\t\t\t\tscopedPath = value;\r\n\t\t\t\tthis.attr('d', value);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.absoulteForced = false;\r\n\r\n\t\tthis.node = document.createElementNS(xmlns, \"path\");\r\n\t}\r\n\tforceAbsoulte(v) {\r\n\t\tthis.absoulteForced = v;\r\n\t\treturn this;\r\n\t}\r\n\tclear() { \r\n\t\tthis.path = '';\r\n\t\treturn this;\r\n\t}\r\n\tattr(idNS, value) {\r\n\t\tthis.node.setAttributeNS(null, idNS, value);\r\n\t\treturn this;\r\n\t}\r\n\tstroke(color) {\r\n\t\tif (color == '0') color = 'transparent';\r\n\t\treturn this.attr('stroke', color);\r\n\t}\r\n\tstrokeWidth(value) {\r\n\t\treturn this.attr('stroke-width', value);\r\n\t}\r\n\tfill(color) {\r\n\t\tif (color == '0') color = 'transparent';\r\n\t\treturn this.attr('fill', color);\r\n\t}\r\n\r\n\tcommand(name, relative, ...params) {\r\n\t\tif (this.absoulteForced) relative = false;\r\n\t\t\r\n\t\tname = relative ? name : name.toUpperCase();\r\n\r\n\t\tif (this.path != '') this.path += ' ';\r\n\r\n\t\tif (0 in params) {\r\n\t\t\tthis.path += name + ' ' + params.join(' ');\r\n\t\t} else {\r\n\t\t\tthis.path += name;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tclose() {\r\n\t\treturn this.command('z', false);\r\n\t}\r\n\r\n\tmoveTo(x, y, relative = true) {\r\n\t\treturn this.command('m', relative, x, y);\r\n\t}\r\n\tlineTo(x, y, relative = true) {\r\n\t\treturn this.command('l', relative, x, y);\r\n\t}\r\n\tlineToHorizontal(x, relative = true) {\r\n\t\treturn this.command('h', relative, x);\r\n\t}\r\n\tlineToVertical(y, relative = true) {\r\n\t\treturn this.command('v', relative, y);\r\n\t}\r\n\r\n\t//\r\n\tcubicBezier(\r\n\t\tstartX, startY,\r\n\t\tcontrolPoint1X, controlPoint1Y,\r\n\t\tcontrolPoint2X, controlPoint2Y,\r\n\t\tendX, endY,\r\n\t\trelative = true\r\n\t) {\r\n\r\n\t\tthis.moveTo(startX, startY, relative);\r\n\t\treturn this.command('c', relative, controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, endX, endY);\r\n\t}\r\n\tsmoothCubicBezier(\r\n\t\tstartX, startY,\r\n\t\tcontrolPoint2X, controlPoint2Y,\r\n\t\tendX, endY,\r\n\t\trelative = true\r\n\t) {\r\n\r\n\t\tthis.moveTo(startX, startY, relative);\r\n\t\treturn this.command('s', relative, controlPoint2X, controlPoint2Y, endX, endY);\r\n\t}\r\n\r\n\t//\r\n\tquadraticBezier(\r\n\t\tstartX, startY,\r\n\t\tcontrolPointX, controlPointY,\r\n\t\tendX, endY,\r\n\t\trelative = true\r\n\t) {\r\n\r\n\t\tthis.moveTo(startX, startY, relative);\r\n\t\treturn this.command('q', relative, controlPointX, controlPointY, endX, endY);\r\n\t}\r\n\tsmoothQuadraticBezier(\r\n\t\tstartX, startY,\r\n\t\tendX, endY,\r\n\t\trelative = true\r\n\t) {\r\n\r\n\t\tthis.moveTo(startX, startY, relative);\r\n\t\treturn this.command('t', relative, endX, endY);\r\n\t}\r\n\r\n\t//\r\n\tellipticalArc(\r\n\t\tradiusX, radiusY,\r\n\t\tlargeArcFlag, sweepFlag,\r\n\t\tx, y,\r\n\t\trelative = true\r\n\t) {\r\n\t\treturn this.command('a', relative, radiusX, radiusY, largeArcFlag, sweepFlag, x, y);\r\n\t}\r\n\r\n\tcircle(x,y, rx, ry, relative) {\r\n        this.moveTo(x - rx, y, relative);\r\n\t\tthis.ellipticalArc(rx, ry, 0, '1,1', rx*2, 0);\r\n\t\tthis.ellipticalArc(rx, ry, 0, '1,1', -rx*2, 0);\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nconst snap = (x, factor) => Math.round(x / factor) * factor;\r\nconst inverseLerp = (min, max, v) => (v - min) / (max - min);\r\n\r\n\r\nreturn class Graph {\r\n\t/** @param {GraphData} data */\r\n\tconstructor(data) {\r\n\t\tthis.datapoints = data.datapoints;\r\n\t\tthis.onValue = data.onValue;\r\n\t\tthis.onCancel = data.onCancel;\r\n\t\tthis.minmax = data.minmax ?? [];\r\n\t\tif (!data.minmax) this.computeMinMax();\r\n\t\t\r\n\t\tdata.style = data.style ?? {};\r\n\t\tconst style = this.style = data.style;\r\n\r\n\t\tstyle.strokeWidth = style.strokeWidth ?? 1;\r\n\t\tstyle.padding = style.padding ?? 1;\r\n\t\tstyle.lineSize = style.lineSize ?? 1;\r\n\t\tstyle.lineColor = style.lineColor ?? '#ff6996';\r\n\t\tstyle.strokeColor = style.strokeColor ?? '#ff6996';\r\n\t\tstyle.fillColor = style.fillColor ?? '#ff699622';\r\n\t\t\r\n\t\tthis.node = document.createElement('div');\r\n\t\tthis.node.classList.add('graph');\r\n\t\tthis.node.style.width = 'fit-content';\r\n\r\n\t\tthis.svgStroke = new SVGShape().fill(0);\r\n\t\tthis.svgFill = new SVGShape().fill(0);\r\n\t\tthis.svgOverlay = new SVGShape();\r\n\t\tthis.svgStroke.node.classList.add('graphStroke');\r\n\t\tthis.svgFill.node.classList.add('graphFill');\r\n\t\tthis.svgOverlay.node.classList.add('graphLine');\r\n\r\n\t\tthis.svgContainer = new SVGShapeContainer(0,0)\r\n\t\t.add(this.svgStroke, this.svgFill, this.svgOverlay)\r\n\r\n\t\tthis.node.append(this.svgContainer.node);\r\n\t\t\r\n\t\tlet _oldIndex = -1;\r\n\t\t\r\n\t\tthis.node.addEventListener('mouseenter', e => {\r\n\t\t\tconst data = this.updateContextualLine(e);\r\n\t\t\t_oldIndex = data.index;\r\n\t\t\tthis?.onValue?.(data);\r\n\t\t});\r\n\t\tthis.node.addEventListener('mousemove', e => {\r\n\t\t\tconst data = this.updateContextualLine(e);\r\n\t\t\tconst tempIndex = data.index;\r\n\t\t\tif (tempIndex == _oldIndex) return;\r\n\r\n\t\t\t_oldIndex = tempIndex;\r\n\t\t\tthis?.onValue?.(data);\r\n\t\t} );\r\n\t\tthis.node.addEventListener('mouseleave', () => {\r\n\t\t\tthis.svgOverlay.clear();\r\n\t\t\tthis?.onCancel?.();\r\n\t\t});\r\n\t\t\r\n\t\tthis.setSize(data.width, data.height);\r\n\t\tthis.extendStyle(style);\r\n\t\tthis.update();\r\n\t}\r\n\tsetSize(width, height) {\r\n\t\twidth = width ?? 200;\r\n\t\theight = height ?? 200;\r\n\r\n\t\tthis.width = width;\r\n\t\tthis.height = height;\r\n\r\n\t\tthis.svgContainer.setSize(width, height);\r\n\r\n\t\tthis.node.style.width = width + 'px';\r\n\t\tthis.node.style.height = height + 'px';\r\n\t\tthis.updateSVGOrigin();\r\n\t}\r\n\tcomputeMinMax() {\r\n\t\tif (typeof this.minmax != 'object') this.minmax = [];\r\n\t\t\r\n\t\tthis.minmax[0] = Infinity;\r\n\t\tthis.minmax[1] = -Infinity;\r\n\t\tfor (const y of this.datapoints) {\r\n\t\t\tthis.minmax[0] = Math.min(this.minmax[0], y);\r\n\t\t\tthis.minmax[1] = Math.max(this.minmax[1], y);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tupdateSVGOrigin() {\r\n\t\tconst offsetX = this.width * this.style.padding * 0.5;\r\n\t\tconst offsetY = this.height * this.style.padding * 0.5;\r\n\t\tthis.svgContainer.groupNode.setAttributeNS(null, 'transform-origin', `${offsetX}px ${offsetY}px`);\r\n\t}\r\n\t/** @param {GraphStyleData} data */\r\n\textendStyle(data) {\r\n\t\t['strokeWidth','padding','lineSize','lineColor','strokeColor','fillColor']\r\n\t\t.forEach(key => {\r\n\t\t\tthis.style[key] = data[key] ?? this.style[key];\r\n\t\t});\r\n\t\tthis.svgContainer.setPadding(this.style.padding);\r\n\t\tthis.updateSVGOrigin();\r\n\r\n\t\tthis.svgStroke.stroke(this.style.strokeColor).strokeWidth(this.style.strokeWidth);\r\n\t\tthis.svgFill.fill(this.style.fillColor);\r\n\t\t\r\n\t\tthis.svgOverlay.fill(this.style.lineColor);\r\n\t}\r\n\t/** @param {MouseEvent} event */\r\n\tupdateContextualLine(event) {\r\n\t\tconst length = this.datapoints.length - 1;\r\n\t\tconst factor = this.width / length;\r\n\r\n\t\tconst smallOffset = 0.5 - this.style.padding/2;\r\n\t\tconst sampledOffsetPercentage = (event.offsetX/this.width - smallOffset) / this.style.padding;\r\n\t\tconst sampledOffset = Math.min(Math.max(sampledOffsetPercentage, 0), 1) * this.width;\r\n\r\n\t\tconst x = Math.floor(snap(sampledOffset, factor));\r\n\t\tconst i = Math.round(sampledOffset / this.width * length);\r\n\t\tconst y = this.yOf(i);\r\n\r\n\t\tconst size = this.style.lineSize / 2;\r\n\t\tconst r = 4*size;\r\n\t\t\r\n\t\tconst xLeft = x - size;\r\n\t\tconst xRight = x + size;\r\n\t\tconst yToFirst = y - r;\r\n\r\n\t\tconst yFromSec = y + r;\r\n\t\tconst yToSec = this.height;\r\n\r\n\t\tthis.svgOverlay\r\n\t\t.clear()\r\n\t\t.forceAbsoulte(true)\r\n\t\t.moveTo(xLeft, 0).lineTo(xRight, 0).lineTo(xRight, yToFirst).lineTo(xLeft, yToFirst)\r\n\t\t.close()\r\n\t\t.moveTo(xLeft, yFromSec).lineTo(xRight, yFromSec).lineTo(xRight, yToSec).lineTo(xLeft, yToSec)\r\n\t\t.close()\r\n\t\t.forceAbsoulte(false)\r\n\t\t.circle(x, y, r, r, false);\r\n\r\n\r\n\t\treturn {value: this.datapoints[i], offset: sampledOffsetPercentage, index: i}\r\n\t}\r\n\tyOf(i) {\r\n\t\treturn this.height - inverseLerp(\r\n\t\t\tthis.minmax[0],\r\n\t\t\tthis.minmax[1],\r\n\t\t\tthis.datapoints[i]\r\n\t\t) * this.height;\r\n\t}\r\n\tupdate() {\r\n\t\tthis.svgStroke.clear();\r\n\t\tthis.svgFill.clear();\r\n\r\n\t\tconst length = this.datapoints.length - 1;\r\n\r\n\t\tfor (let i = 0; i <= length; i++) {\r\n\t\t\tconst x = i / length * this.width;\r\n\t\t\tconst y = this.yOf(i);\r\n\t\t\t\r\n\t\t\tif (i == 0) {\r\n\t\t\t\tthis.svgStroke.moveTo(x, y);\r\n\t\t\t\tthis.svgFill.moveTo(x, y);\r\n\t\t\t} else {\r\n\t\t\t\tthis.svgStroke.lineTo(x, y, false);\r\n\t\t\t\tthis.svgFill.lineTo(x, y, false);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\tif (1 in this.datapoints) {\r\n\t\t\tthis.svgFill.lineTo(this.width, this.height, false).lineTo(0, this.height, false);\r\n\t\t}\r\n\t\t// 0 sized circle that keeps the the height of the container constant\r\n\t\tthis.svgFill.circle(0,0, 0, 0, false);\r\n\t}\r\n}\r\n})();\r\n\r\nconst pluginMap = {};\r\nPlugins.all.forEach(plugin => pluginMap[plugin.id] = plugin);\r\n\r\nlet downloadData = [];\r\nasync function initializeAllDownloadData() {\r\n\tconst storageDataMaybe = sessionStorage.getItem(KEY_STORAGE);\r\n\tif (storageDataMaybe) {\r\n\t\tdownloadData = JSON.parse(storageDataMaybe);\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (let i = 1; i <= MAX_WEEKS; i++) {\t\t\r\n\t\tconst weeksData = await new Promise(resolve => \r\n\t\t\t$.getJSON(URL + i, weeksData => resolve(weeksData))\r\n\t\t);\r\n\t\tdownloadData.push(weeksData);\r\n\t}\r\n\tsessionStorage.setItem(KEY_STORAGE, JSON.stringify(downloadData));\r\n}\r\nfunction dateSinceWeeks(numberOfWeeks, exclusive) {\r\n\tconst date = new Date();\r\n\tconst dayOfTheWeek = date.getDay();\r\n\r\n\tlet offset = date.getDate() - numberOfWeeks * 7;\r\n\toffset -= dayOfTheWeek; // offset date to sunday of the week\r\n\toffset += 4;            // offset date to thursday of the week. apparently thursday is the start of the week\r\n\tif (exclusive) offset --;\r\n\r\n\tdate.setDate(offset);\r\n\r\n\treturn date.toLocaleDateString('en-GB');\r\n}\r\nfunction ordinalize(number) {\r\n\tconst lastDigit = number % 10;\r\n\tconst secondLastDigit = Math.floor(number / 10) % 10;\r\n\r\n\tif (secondLastDigit == 1) return number + \"th\";\r\n\r\n\tif (lastDigit == 1) return number + \"st\";\r\n\tif (lastDigit == 2) return number + \"nd\";\r\n\tif (lastDigit == 3) return number + \"rd\";\r\n\r\n\treturn number + \"th\";\r\n}\r\n\r\nconst format = Intl.NumberFormat('en').format;\r\n\r\nconst get = selector => dialog.object.querySelector(selector);\r\n\r\nfunction updateHTML(id, perWeek = true) {\r\n\tget('#ps-graph [y]').innerText = perWeek ? 'Downloads Per Week': 'Downloads';\r\n\r\n\tconst plugin = pluginMap[id];\r\n\t\r\n\tget('#ps-rank').innerText = ordinalize(Plugins.all.indexOf(plugin) + 1);\r\n\tconst authorElement = get('#ps-author');\r\n\tconst versionElement = get('#ps-version');\r\n\tconst weeklyElement = get('#ps-weekly');\r\n\tconst yearlyElement = get('#ps-yearly');\r\n\r\n\tauthorElement.innerText = plugin.author;\r\n\tversionElement.innerText = plugin.version;\r\n\r\n\tweeklyElement.innerText = format(downloadData[1][id]);\r\n\tyearlyElement.innerText = format(downloadData.at(-1)[id]);\r\n\r\n\tconst downloadDataLength = downloadData.length;\r\n\tgraph.datapoints = [];\r\n\r\n\tlet maximumValue = 0;\r\n\tlet isInfant = true;\r\n\tlet infantOffset = 0;\r\n\tfor (let i = 0; i < downloadDataLength; i++) {\r\n\t\tconst index = downloadDataLength - i - 1;\r\n\t\tconst weekDownloads = downloadData[index]?.[id] ?? 0;\r\n\t\tconst nextWeekDownloads = downloadData[index - 1]?.[id] ?? 0;\r\n\r\n\t\tif (isInfant && weekDownloads - nextWeekDownloads > 0) isInfant = false;\r\n\r\n\t\tif (isInfant) {\r\n\t\t\tinfantOffset++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst realIndex = i - infantOffset;\r\n\t\tgraph.datapoints[realIndex] = weekDownloads;\r\n\t\tif (perWeek) graph.datapoints[realIndex] -= nextWeekDownloads;\r\n\r\n\t\tmaximumValue = Math.max(maximumValue, graph.datapoints[realIndex]);\r\n\t}\r\n\r\n\tif (graph.datapoints.length <= 1) {\r\n\t\tdialog.object.classList.add('ps-not_enough_data');\r\n\t\treturn;\r\n\t}\r\n\tdialog.object.classList.remove('ps-not_enough_data');\r\n\tgraph.minmax[1] = maximumValue / 0.9;\r\n\tgraph.update();\r\n}\r\n\r\nconst dialogOptions = {}\r\nconst dialog = new Dialog({\r\n\twidth: 600,\r\n\tid: 'plugin_stats',\r\n\ttitle: 'Plugin Statistics',\r\n\tpart_order: ['form', 'lines'],\r\n\tbuttons: ['dialog.ok'],\r\n\tresizable: false,\r\n\r\n\tform: {\r\n\t\tplugin: { label: 'Plugin', type: 'select', options: dialogOptions },\r\n\t\tper_week: { label: 'Per Week', type: 'checkbox', value: true }\r\n\t},\r\n\tonFormChange(data) {\r\n\t\tupdateHTML(data.plugin, data.per_week);\r\n\t},\r\n\tlines: [\r\n`\r\n<span class=\"subtle\">Ranked #<span id=\"ps-rank\"></span> this week</span>\r\n<div class=\"ps-stats\">\r\n\t<div class=\"ps-stat\">\r\n\t\t<h3>Author</h3>\r\n\t\t<span id=\"ps-author\">??</span>\r\n\t</div>\r\n\t<div class=\"ps-stat\">\r\n\t\t<h3>Version</h3>\r\n\t\t<span id=\"ps-version\">??</span>\r\n\t</div>\r\n\t<div class=\"ps-stat\">\r\n\t\t<h3>Weekly Downloads</h3>\r\n\t\t<span id=\"ps-weekly\">??</span>\r\n\t</div>\r\n\t<div class=\"ps-stat\">\r\n\t\t<h3>Yearly Downloads</h3>\r\n\t\t<span id=\"ps-yearly\">??</span>\r\n\t</div>\r\n</div>\r\n<div id=\"ps-graph\">\r\n\t<span class=\"ps-graph-info\"></span>\r\n\t<span class=\"ps-label\" y>??</span>\r\n\t<span class=\"ps-label\" x>Weeks</span>\r\n\t<span style=\"grid-area:holder\"></span>\r\n</div>\r\n<style>\r\n.ps-not_enough_data #ps-graph {\r\n\tdisplay: none;\r\n}\r\n.ps-not_enough_data > .dialog_wrapper > .dialog_content:after {\r\n\tcontent: 'no enough data to show graph.';\r\n    \r\n    display: block;\r\n\twidth: 100%;\r\n\tpadding-top: 20px;\r\n\t\r\n    color: var(--color-subtle_text);\r\n    text-align: center;\r\n\tfont-style: italic;\r\n}\r\n\r\n\r\n#plugin_stats .dialog_content {\r\n\toverflow-x: hidden;\r\n}\r\n.ps-stats {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: space-between;\r\n}\r\n.ps-stat {\r\n\twidth: 47%;\r\n\tpadding-block: 5px;\r\n\tborder-bottom: 1px solid var(--color-border);\r\n}\r\n.ps-stat h3 {\r\n\tmargin: 0;\r\n\tdisplay: block;\r\n\tcolor: var(--color-subtle_text);\r\n}\r\n.ps-stat span {\r\n\tpadding-left: 2px;\r\n}\r\n.ps-graph-info:empty::before {\r\n\t/* Keeps the size of the span (even when empty) */\r\n\tcontent: '0';\r\n\tcolor: transparent !important;\r\n} \r\n.ps-graph-info {\r\n\twidth: 100%;\r\n\tpadding-bottom: 5px;\r\n\ttext-align: left;\r\n\tfont-family: monospace;\r\n\tfont-size: 0.85em;\r\n\tcolor: var(--color-subtle_text);\r\n}\r\n#ps-graph {\r\n\tpadding-top: 10px;\r\n\tdisplay: grid;\r\n    grid-template-areas: \r\n\t\t\"info info\"\r\n\t\t\"y graph\"\r\n\t\t\"holder x\";\r\n}\r\n\r\n.ps-graph-info { grid-area: info }\r\n.graph { grid-area: graph }\r\n.ps-label {\r\n\tcolor: var(--color-subtle_text);\r\n}\r\n.ps-label[x] { grid-area: x }\r\n.ps-label[y] {\r\n\tgrid-area: y;\r\n    writing-mode: vertical-lr;\r\n    transform: rotate(180deg);\r\n}\r\n\r\n#ps-graph svg {\r\n\tdisplay: block;\r\n}\r\n\r\n</style>`\r\n\t],\r\n});\r\nconst graph = new Graph({\r\n\tdatapoints: [0,0],\r\n    width: 1,\r\n    height: 1,\r\n    minmax: [0, 17500],\r\n    style: {\r\n        strokeWidth: 2,\r\n        lineSize: 2,\r\n        padding: 0.95,\r\n    },\r\n    onValue({index, value}) {\r\n\t\tconst downloadsSince = format(value);\r\n\t\tconst downloads = downloadsSince <= 0 ? 'unreleased': downloadsSince;\r\n\t\tconst numberOfWeeks = graph.datapoints.length - index - 1;\r\n\t\tconst from = dateSinceWeeks(numberOfWeeks);\r\n\t\tconst to = dateSinceWeeks(numberOfWeeks - 1, true);\r\n\t\tconst perWeek = get('#plugin_stats #per_week').checked;\r\n\r\n\t\tif (perWeek) {\r\n\t\t\tget('.ps-graph-info').innerText = `${from} to ${to} ≈ ${downloads}`;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tget('.ps-graph-info').innerText = `since ${from} ≈ ${downloads}`;\r\n\t},\r\n\tonCancel() {\r\n\t\tget('.ps-graph-info').innerText = '';\r\n\t}\r\n});\r\nconst spinningIcon = () => {\r\n\tconst icon_node = Blockbench.getIconNode('donut_large');\r\n\ticon_node.classList.add('spinning');\r\n\treturn icon_node;\r\n}\r\n\r\nlet action;\r\nlet loadingAction;\r\nlet isPluginStateDead = false;\r\n\r\nconst meta = {\r\n\t\"title\": \"Plugin Statistics\",\r\n\t\"icon\": \"trending_up\",\r\n\t\"author\": \"Malik12tree\",\r\n\t\"description\": \"View download statistics of your blockbench plugin\",\r\n\t\"version\": \"1.3.0\",\r\n\t\"variant\": \"both\",\r\n\t\"tags\": [\"Blockbench\", \"Plugins\", \"Development\"]\r\n}\r\nBBPlugin.register('pluginstats', {\r\n\t...meta,\r\n\tonload() {\r\n\t\tloadingAction = new Action('plugin_stat_loading', {\r\n\t\t\tname: 'Fetching Plugin Statistics..',\r\n\t\t\ticon: spinningIcon(),\r\n\t\t});\r\n\r\n\t\taction = new Action('plugin_stat_action', {\r\n\t\t\tname: 'View ' + meta.title,\r\n\t\t\ticon: meta.icon,\r\n\t\t\tdescription: meta.description,\r\n\t\t\tclick() {\r\n\t\t\t\tdialog.show();\r\n\t\t\t\t\r\n\t\t\t\tgraph.extendStyle({\r\n\t\t\t\t\tlineColor: CustomTheme.data.colors.accent,\r\n\t\t\t\t\tstrokeColor: CustomTheme.data.colors.accent,\r\n\t\t\t\t\tfillColor: CustomTheme.data.colors.accent + '22'\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tget('#ps-graph').append(graph.node);\r\n\t\t\t\tupdateHTML(open_interface.getFormResult().plugin ?? Plugins.all[0].id);\r\n\t\t\t\t\r\n\t\t\t\tconst rect = get('content.dialog_content').getBoundingClientRect();\r\n\t\t\t\tgraph.setSize(rect.width - 30, 200);\r\n\t\t\t\tgraph.update();\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\tMenuBar.addAction(loadingAction, 'tools');\r\n\r\n\t\tinitializeAllDownloadData().then(() => {\r\n\t\t\tif (isPluginStateDead) return;\r\n\r\n\t\t\t// sort if not sorted\r\n\t\t\tif (!Object.values(Plugins.download_stats).length) {\r\n\t\t\t\tPlugins.download_stats = downloadData[1];\r\n\t\t\t\tPlugins.sort();\r\n\t\t\t}\r\n\t\t\t// \r\n\t\t\t// setup options\r\n\t\t\tPlugins.all.forEach(plugin => {\r\n\t\t\t\tif (plugin.source != STORE) return;\r\n\t\t\t\t\r\n\t\t\t\tdialogOptions[plugin.id] = plugin.title;\r\n\t\t\t});\r\n\t\t\t//\r\n\r\n\t\t\tloadingAction.delete();\r\n\t\t\tMenuBar.addAction(action, 'tools');\r\n\t\t});\r\n\t},\r\n\tonunload() {\r\n\t\tisPluginStateDead = true;\r\n\t\taction.delete();\r\n\t\tloadingAction.delete();\r\n\t}\r\n});\r\n\r\n})();"
  },
  {
    "path": "plugins/preview_scene_customiser/about.md",
    "content": "<div id=\"about-content\">\n  <h2>How to use</h2>\n  <ul>\n    <li>Press <strong>Create New Preview Scene</strong> and create a model.</li>\n    <li>To export to a file, go to <strong>File > Export > Export Preview Scene</strong>.</li>\n    <li>To install directly to Blockbench, go to <strong>File > Export > Install Preview Scene in Blockbench</strong>, and fill in the options.</li>\n  </ul>\n  <h2>Managing scenes</h2>\n  <p>Management options can be found under <strong>View > Preview Scene Customiser</strong>.</p>\n  <ul>\n    <li>To manage installed scenes, go to <strong>Manage Preview Scenes</strong>.</li>\n    <li>To import scene files, go to <strong>Import Preview Scene</strong>, select a scene file, and fill in the options.</li>\n    <li>To download pre-made scenes, go to <strong>Download Preview Scenes</strong>.</li>\n  </ul>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n  <a href=\"https://github.com/ewanhowell5195/previewSceneCustomiser/\">\n    <i class=\"fa_big icon fab fa-github\" style=\"color: #6E40C9;\"></i>\n    <p>Submit Preview Scenes</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/preview_scene_customiser/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2022-10-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2023-10-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Update to new plugin format\"\n        ]\n      }\n    ]\n  },\n  \"1.1.1\": {\n    \"title\": \"1.1.1\",\n    \"date\": \"2023-11-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed plugin loading after models have been opened\"\n        ]\n      }\n    ]\n  },\n  \"1.1.3\": {\n    \"title\": \"1.1.2\",\n    \"date\": \"2023-08-09\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed a crash\"\n        ]\n      }\n    ]\n  },\n  \"1.1.4\": {\n    \"title\": \"1.1.3\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed bugs introduced with Blockbench 4.12\"\n        ]\n      }\n    ]\n  },\n  \"1.1.5\": {\n    \"title\": \"1.1.5\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed a crash when creating a new project from the start screen\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/preview_scene_customiser/preview_scene_customiser.js",
    "content": "(async function () {\n  let format, codec, exportAction, exportAction2, importAction, manageAction, styles, properties, ignoreChange\n  const id = \"preview_scene_customiser\"\n  const name = \"Preview Scene Customiser\"\n  const icon = \"nature_people\"\n  const author = \"Ewan Howell\"\n  const description = \"Create your very own preview scenes. Download preview scenes from the Preview Scene Store. Edit and manage existing preview scenes.\"\n  const links = {\n    website: {\n      text: \"By Ewan Howell\",\n      link: \"https://ewanhowell.com/\",\n      icon: \"language\",\n      colour: \"#33E38E\"\n    },\n    discord: {\n      text: \"Discord Server\",\n      link: \"https://discord.ewanhowell.com/\",\n      icon: \"fab.fa-discord\",\n      colour: \"#727FFF\"\n    },\n    github: {\n      text: \"Submit Preview Scenes\",\n      link: \"https://github.com/ewanhowell5195/previewSceneCustomiser/\",\n      icon: \"fab.fa-github\",\n      colour: \"#6E40C9\"\n    }\n  }\n  const E = s => $(document.createElement(s))\n  function setCurrentPreviewScene(data) {\n    localStorage.setItem(\"preview_scene\", data.scene.id)\n    activePreviewScene = data.scene.id\n  }\n  function removeCurrentPreviewScene() {\n    if (ignoreChange) return\n    localStorage.removeItem(\"preview_scene\")\n  }\n  let activePreviewScene = PreviewScene.active?.id ?? \"none\"\n  const scenes = []\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author,\n    description,\n    tags: [\"Preview Scenes\", \"Blockbench\"],\n    version: \"1.2.0\",\n    min_version: \"5.0.0\",\n    variant: \"both\",\n    creation_date: \"2022-10-14\",\n    await_loading: true,\n    has_changelog: true,\n    website: \"https://ewanhowell.com/plugins/preview-scene-customiser/\",\n    repository: \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/preview-scene-customiser\",\n    bug_tracker: \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Preview Scene Customiser]\",\n    onload() {\n      styles = Blockbench.addCSS(`\n        .preview-scene-links {\n          display: flex;\n          justify-content: space-around;\n          margin: 20px 40px 0;\n        }\n        .preview-scene-links > a {\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          gap: 5px;\n          padding: 5px;\n          text-decoration: none;\n          flex-grow: 1;\n          flex-basis: 0;\n          color: var(--color-subtle_text);\n          text-align: center;\n        }\n        .preview-scene-links > a:hover {\n          background-color: var(--color-accent);\n          color: var(--color-light);\n        }\n        .preview-scene-links > a > i {\n          font-size: 32px;\n          width: 100%;\n          max-width: initial;\n          height: 32px;\n          text-align: center;\n        }\n        .preview-scene-links > a:hover > i {\n          color: var(--color-light) !important;\n        }\n        .preview-scene-links > a > p {\n          flex: 1;\n          display: flex;\n          align-items: center;\n        }\n        #format_page_preview_scene_model {\n          padding-bottom: 0;\n        }\n        #format_page_preview_scene_model .format_target {\n          margin-bottom: 6px;\n        }\n        #format_page_preview_scene_model div:nth-child(3), #format_page_preview_scene_model content {\n          overflow-y: auto;\n        }\n      `)\n      const stored = JSON.parse(localStorage.getItem(\"preview_scenes\") ?? \"[]\")\n      for (const scene of stored) {\n        scenes.push(scene.id)\n        new PreviewModel(scene.id, scene.model)\n        if (scene.category) PreviewScene.menu_categories[scene.category] ??= { _label: titleCase(scene.category) }\n        new PreviewScene(scene.id, {\n          category: scene.category,\n          name: scene.name,\n          preview_models: [scene.id]\n        })\n      }\n      codec = new Codec(\"preview_scene_codec\", {\n        name: \"Preview Scene\",\n        extension: \"bbscene\",\n        remember: true,\n        load_filter: {\n          type: \"json\",\n          extensions: [\"bbscene\"]\n        },\n        async export() {\n          var scope = this\n          const compiled = scope.compile({raw: true})\n          compiled.settings = {\n            renderSide: Project.preview_scene_render_side,\n            lightSide: Project.preview_scene_light_side,\n            lightColour: Project.preview_scene_light_colour,\n            tintColour: Project.preview_scene_tint_colour,\n            shading: Project.preview_scene_shading\n          }\n          let [dialog, settings] = await configurePreviewSceneSettings(compiled, {\n            export: true\n          })\n          settings = await settings\n          Project.preview_scene_render_side = settings.renderSide\n          Project.preview_scene_light_side = settings.lightSide\n          Project.preview_scene_light_colour = settings.lightColour\n          Project.preview_scene_tint_colour = settings.tintColour\n          Project.preview_scene_shading = settings.shading\n          dialog.close()\n          Blockbench.export({\n            resource_id: 'model',\n            type: scope.name,\n            extensions: [scope.extension],\n            name: scope.fileName(),\n            startpath: scope.startPath(),\n            content: scope.compile({settings}),\n            custom_writer: isApp ? (a, b) => scope.write(a, b) : null,\n          }, path => scope.afterDownload(path))\n        },\n        compile(options) {\n          options ??= {}\n          const clear_elements = []\n          const element_index_lut = []\n          function computeCube(s) {\n            if (s.export == false) return\n            const element = {}\n            element_index_lut[Cube.all.indexOf(s)] = clear_elements.length\n            if (s.name !== \"cube\") element.name = s.name\n            element.position = s.from.slice()\n            let to = s.to.slice()\n            if (s.inflate) for (let i = 0; i < 3; i++) {\n              element.position[i] -= s.inflate\n              to[i] += s.inflate\n            }\n            element.size = [to[0] - element.position[0], to[1] - element.position[1], to[2] - element.position[2]]\n            if (!s.rotation.allEqual(0)) element.rotation = s.rotation\n            if (!s.origin.allEqual(0)) element.origin = s.origin\n            const e_faces = {}\n            for (const face in s.faces) {\n              if (s.faces.hasOwnProperty(face) && s.faces[face].texture !== null) {\n                const tag = new oneLiner()\n                if (s.faces[face].enabled !== false) {\n                  tag.uv = s.faces[face].uv.slice();\n                  tag.uv.forEach((n, i) => tag.uv[i] = n)\n                }\n                e_faces[face] = tag\n              }\n            }\n            element.faces = e_faces\n            if (Object.keys(element.faces).length) {\n              clear_elements.push(element)\n            }\n          }\n          function iterate(arr) {\n            if (!arr || !arr.length) return\n            for (let i = 0; i < arr.length; i ++) {\n              if (arr[i].type === \"cube\") computeCube(arr[i])\n              else if (arr[i].type === \"group\") iterate(arr[i].children)\n            }\n          }\n          iterate(Outliner.root)\n          function checkExport(key, condition) {\n            key = options[key]\n            if (key === undefined) {\n              return condition;\n            } else {\n              return key\n            }\n          }\n          const previewScene = {}\n          if (checkExport(\"comment\", Project.credit || settings.credit.value)) previewScene.credit = Project.credit || settings.credit.value\n          if (options.settings) previewScene.settings = options.settings\n          const texture = Texture.getDefault()\n          if (texture) {\n            const canvas = document.createElement(\"canvas\")\n            canvas.width = texture.width\n            canvas.height = texture.height\n            canvas.getContext(\"2d\").drawImage(texture.img, 0, 0)\n            previewScene.texture = canvas.toDataURL()\n          }\n          if (Project.texture_width !== 16 || Project.texture_height !== 16) previewScene.texture_size = [Project.texture_width, Project.texture_height]\n          if (checkExport(\"elements\", clear_elements.length >= 1)) previewScene.cubes = clear_elements\n          if (checkExport(\"groups\", (settings.export_groups.value && Group.all.length))) {\n            groups = compileGroups(false, element_index_lut)\n            let i = 0;\n            while (i < groups.length) {\n              if (typeof groups[i] === \"object\") i = Infinity\n              i++\n            }\n            if (i === Infinity) previewScene.groups = groups\n          }\n          this.dispatchEvent(\"compile\", {model: previewScene, options});\n          if (options.raw) return previewScene\n          else return autoStringify(previewScene)\n        },\n        async parse(model) {\n          if (!model.cubes) return Blockbench.showMessageBox({\n            translateKey: \"invalid_model\",\n            icon: \"error\"\n          })\n          this.dispatchEvent(\"parse\", {model})\n          if (typeof model.credit === \"string\") Project.credit = model.credit\n          if (Array.isArray(model.texture_size)) {\n            Project.texture_width = model.texture_size[0]\n            Project.texture_height = model.texture_size[1]\n          }\n          if (model.settings?.renderSide) Project.preview_scene_render_side = model.settings.renderSide\n          if (model.settings?.lightSide) Project.preview_scene_light_side = model.settings.lightSide\n          if (model.settings?.lightColour) Project.preview_scene_light_colour = model.settings.lightColour\n          if (model.settings?.tintColour) Project.preview_scene_tint_colour = model.settings.tintColour\n          if (model.settings?.shading) Project.preview_scene_shading = model.settings.shading\n          if (model.texture) {\n            const data = await getTexture(model.texture)\n            if (data) new Texture({name: \"texture.png\"}).fromDataURL(data).add()\n          }\n          const cubes = []\n          model.cubes.forEach(obj => {\n            const cube = new Cube(obj)\n            if (obj.name) cube.name = obj.name\n            cube.from = obj.position\n            cube.to = [obj.position[0] + obj.size[0], obj.position[1] + obj.size[1], obj.position[2] + obj.size[2]]\n            for (var key in cube.faces) {\n              if (obj.faces[key] === undefined) {\n                cube.faces[key].texture = null\n                cube.faces[key].uv = [0, 0, 0, 0]\n              } else {\n                cube.faces[key].uv.forEach((n, i) => {\n                  cube.faces[key].uv[i] = obj.faces[key].uv[i]\n                })\n              }\n            }\n            Outliner.root.push(cube)\n            cube.parent = \"root\"\n            cube.init()\n            cubes.push(cube);\n          })\n          if (model.groups && model.groups.length > 0) parseGroups(model.groups)\n          updateSelection()\n          this.dispatchEvent(\"parsed\", {model})\n        }\n      })\n      Language.data[\"format_category.blockbench\"] ??= \"Blockbench\"\n      format = new ModelFormat({\n        id: \"preview_scene_model\",\n        name: \"Preview Scene\",\n        description: \"Create a new Preview Scene model\",\n        extension: \"bbscene\",\n        icon,\n        category: \"blockbench\",\n        single_texture: true,\n        rotate_cubes: true,\n        model_identifier: false,\n        optional_box_uv: true,\n        centered_grid: true,\n        codec,\n        format_page: {\n          component: {\n            methods: {\n              create: () => format.new()\n            },\n            template: `\n              <div class=\"ewan-format-page\" style=\"display:flex;flex-direction:column;height:100%\">\n                <p class=\"format_description\">${description}</p>\n                <p class=\"format_target\"><b>Target</b> : <span>Blockbench</span></p>\n                <content>\n                  <h3 class=\"markdown\">How to use:</h3>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li><p>Press <strong>Create New Preview Scene</strong> and create a model.</p></li>\n                      <li><p>To export to a file, go to <strong>File > Export > Export Preview Scene</strong>.</p></li>\n                      <li><p>To install directly to Blockbench, go to <strong>File > Export > Install Preview Scene in Blockbench</strong>, and fill in the options.</p></li>\n                    </ul>\n                  </p>\n                  <h3 class=\"markdown\">Managing scenes:</h3>\n                  <p>Management options can be found under <strong>View > Preview Scene Customiser</strong>.</p>\n                  <p class=\"markdown\">\n                    <ul>\n                      <li><p>To manage installed scenes, go to <strong>Manage Preview Scenes</strong>.</p></li>\n                      <li><p>To import scene files, go to <strong>Import Preview Scene</strong>, select a scene file, and fill in the options.</p></li>\n                      <li><p>To download pre-made scenes, go to <strong>Download Preview Scenes</strong>.</p></li>\n                    </ul>\n                  </p>\n                </content>\n                <div class=\"spacer\"></div>\n                <div class=\"preview-scene-links\">${Object.values(links).map(e => `\n                  <a href=\"${e.link}\">\n                    ${Blockbench.getIconNode(e.icon, e.colour).outerHTML}\n                    <p>${e.text}</p>\n                  </a>\n                `).join(\"\")}</div>\n                <div class=\"button_bar\">\n                  <button id=\"create_new_model_button\" style=\"margin-top:20px;margin-bottom:24px;\" @click=\"create\">\n                    <i class=\"material-icons\">${icon}</i>\n                    Create New Preview Scene\n                  </button>\n                </div>\n              </div>\n            `\n          }\n        },\n        onActivation() {\n          setTimeout(() => {\n            ignoreChange = true\n            PreviewScene.active?.unselect()\n            ignoreChange = false\n          }, 0)\n        },\n        onDeactivation: () => PreviewScene.scenes[activePreviewScene]?.select()\n      })\n      codec.format = format\n      BarItems.preview_scene.condition = () => Project.format !== format\n      exportAction = new Action({\n        id: \"export_preview_scene_model\",\n        name: \"Export Preview Scene\",\n        icon,\n        condition: {\n          formats: [format.id]\n        },\n        click: () => codec.export()\n      })\n      MenuBar.addAction(exportAction, \"file.export.0\")\n      exportAction2 = new Action({\n        id: \"install_preview_scene\",\n        name: \"Install Preview Scene in Blockbench\",\n        icon: \"add_to_photos\",\n        condition: {\n          formats: [format.id]\n        },\n        click() {\n          const model = JSON.parse(codec.compile())\n          model.settings = {\n            renderSide: Project.preview_scene_render_side,\n            lightSide: Project.preview_scene_light_side,\n            lightColour: Project.preview_scene_light_colour,\n            tintColour: Project.preview_scene_tint_colour,\n            shading: Project.preview_scene_shading\n          }\n          importPreviewScene(model, {dontEnable: true})\n        }\n      })\n      MenuBar.addAction(exportAction2, \"file.export.1\")\n      codec.export_action = exportAction\n      manageAction = new Action({\n        name,\n        id,\n        description: \"Import and manage your Preview Scenes\",\n        icon,\n        children: [\n          new Action({\n            id: \"manage_preview_scene_models\",\n            name: \"Manage Preview Scenes\",\n            icon: \"photo_library\",\n            click: () => managePreviewScenes()\n          }),\n          new Action({\n            id: \"import_preview_scene_model\",\n            name: \"Import Preview Scene\",\n            icon: \"add_to_photos\",\n            async click() {\n              try {\n                Blockbench.import({\n                  resource_id: \"model\",\n                  extensions: [\"bbscene\"],\n                  type: \"Blockbench Preview Scene\",\n                }, files => {\n                  if (files) importPreviewScene(JSON.parse(files[0].content))\n                })\n              } catch {\n                Blockbench.showMessageBox({\n                  translateKey: \"invalid_model\",\n                  icon: \"error\"\n                })\n              }\n            }\n          }),\n          new Action({\n            id: \"download_preview_scene_models\",\n            name: \"Download Preview Scenes\",\n            icon: \"file_download\",\n            async click() {\n              const sceneData = await fetch(\"https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes.json\").then(e => e.json()).catch(() => {})\n              if (!sceneData) return new Dialog({\n                id: \"download_preview_scene_models_connection_failure_dialog\",\n                title: name,\n                lines: ['<h2>Connection failed</h2><span>Please check your internet connection and make sure that you can access <a href=\"https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes.json\">GitHub</a></span>'],\n                buttons: [\"Okay\"]\n              }).show()\n              const dialog = new Dialog({\n                id: \"download_preview_scene_dialog\",\n                title: \"Preview Scene Customiser Store\",\n                width: 780,\n                buttons: [],\n                sidebar: {\n                  pages: Object.fromEntries(sceneData.map(e => [e.id, {\n                    label: titleCase(e.id),\n                    icon: e.icon\n                  }])),\n                  onPageSwitch(page) {\n                    $(\"dialog#download_preview_scene_dialog #scene_categories > div\").addClass(\"hidden\")\n                    $(`dialog#download_preview_scene_dialog #scene_category_${page}`).removeClass(\"hidden\")\n                  }\n                },\n                lines: [`\n                  <style>\n                    dialog#download_preview_scene_dialog .dialog_wrapper {\n                      grid-template-rows: auto;\n                    }\n                    dialog#download_preview_scene_dialog .dialog_content {\n                      margin: 10px 24px 24px;\n                    }\n                    dialog#download_preview_scene_dialog #button_row {\n                      display: flex;\n                      justify-content: end;\n                      padding-top: 24px;\n                      gap: 8px;\n                    }\n                    dialog#download_preview_scene_dialog .hidden {\n                      display: none;\n                    }\n                    dialog#download_preview_scene_dialog h2 {\n                      padding-bottom: 10px;\n                    }\n                    dialog#download_preview_scene_dialog #scene_categories {\n                      height: 455px;\n                    }\n                    dialog#download_preview_scene_dialog .scenes_container {\n                      display: flex;\n                      flex-wrap: wrap;\n                      gap: 8px;\n                      max-height: 400px;\n                      overflow-y: auto;\n                    }\n                    dialog#download_preview_scene_dialog .scene {\n                      width: 256px;\n                      height: 128px;\n                      background-color: var(--color-back);\n                      cursor: pointer;\n                      position: relative;\n                      display: flex;\n                      justify-content: end;\n                      align-items: center;\n                      flex-direction: column;\n                      border: 2px solid transparent;\n                    }\n                    dialog#download_preview_scene_dialog .scene:hover {\n                      background-color: var(--color-button);\n                    }\n                    dialog#download_preview_scene_dialog .scene img {\n                      position: absolute;\n                      top: 8px;\n                      left: 8px;\n                    }\n                    dialog#download_preview_scene_dialog .scene span {\n                      z-index: 1;\n                      font-size: 20px;\n                      text-align: center;\n                    }\n                    dialog#download_preview_scene_dialog .scene_author {\n                      position: absolute;\n                      top: 8px;\n                      left: 8px;\n                      display: none;\n                    }\n                    dialog#download_preview_scene_dialog .scene:hover .scene_author {\n                      display: inline;\n                    }\n                    dialog#download_preview_scene_dialog .scene_author:hover {\n                      color: var(--color-light);\n                    }\n                    dialog#download_preview_scene_dialog .scene_author:hover::after {\n                      content: attr(data-author);\n                      font-family: var(--font-main);\n                      position: absolute;\n                      background-color: var(--color-dark);\n                      padding: 4px;\n                      margin-left: 4px;\n                      font-size: 0.8em;\n                    }\n                    dialog#download_preview_scene_dialog .selected {\n                      border-color: var(--color-accent);\n                      background-color: var(--color-button);\n                    }\n                    dialog#download_preview_scene_dialog #download {\n                      background-color: var(--color-selected);\n                    }\n                    dialog#download_preview_scene_dialog #download:hover {\n                      background-color: var(--color-accent);\n                    }\n                    dialog#download_preview_scene_dialog .spacer {\n                      flex: 1;\n                      border-bottom: 2px solid var(--color-border);\n                    }\n                  </style>\n                  <div id=\"scene_categories\"></div>\n                  <div id=\"button_row\">\n                    <button id=\"download\">Download</button>\n                    <button id=\"close\">Close</button>\n                  </div>\n                `]\n              }).show()\n              const categories = $(\"dialog#download_preview_scene_dialog #scene_categories\")\n              let selected\n              for (const category of sceneData) {\n                categories.append(E(\"div\").attr(\"id\", `scene_category_${category.id}`).addClass(\"hidden\").append(\n                  E(\"h2\").text(titleCase(category.id)),\n                  E(\"div\").addClass(\"scenes_container\").append(...category.scenes.map(e => E(\"div\").addClass(\"scene\").attr(\"data-scene\", e.id).append(\n                    E(\"img\").attr(\"src\", `https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes/${e.id}/scene.webp`),\n                    E(\"span\").text(e.name ?? titleCase(e.id)),\n                    E(\"i\").addClass(\"scene_author material-icons\").attr(\"data-author\", `By ${e.author}`).text(\"person\")\n                  ).on(\"click\", f => {\n                    $(\"dialog#download_preview_scene_dialog #scene_categories .selected\").removeClass(\"selected\")\n                    $(f.currentTarget).addClass(\"selected\")\n                    selected = e\n                  })))\n                ))\n              }\n              $(`dialog#download_preview_scene_dialog #scene_category_${sceneData[0].id}`).removeClass(\"hidden\")\n              $(\"dialog#download_preview_scene_dialog #close\").on(\"click\", e => dialog.close())\n              $(\"dialog#download_preview_scene_dialog #download\").on(\"click\", async e => {\n                if (!selected) return Blockbench.showQuickMessage(\"Please select a preview scene\")\n                const scene = await fetch(`https://raw.githubusercontent.com/ewanhowell5195/previewSceneCustomiser/main/scenes/${selected.id}/scene.bbscene`).then(e => e.json()).catch(() => {})\n                if (!scene) return Blockbench.showQuickMessage(\"Unable to load preview scene\")\n                importPreviewScene(scene, {\n                  name: selected.name ?? titleCase(selected.id),\n                  category: titleCase($(\"dialog#download_preview_scene_dialog #scene_categories > :not(.hidden)\")[0].id.slice(15)),\n                  eula: selected.eula\n                })\n                dialog.close()\n              })\n              $(\"dialog#download_preview_scene_dialog .dialog_sidebar\").append(\n                E(\"div\").addClass(\"spacer\"),\n                E(\"a\").attr(\"href\", links.github.link).css({\n                  display: \"flex\",\n                  gap: \"10px\",\n                  \"align-items\": \"center\",\n                  \"justify-content\": \"center\",\n                  margin: \"24px\",\n                  cursor: \"pointer\",\n                  \"text-decoration\": \"none\"\n                }).append(\n                  E(\"i\").addClass(\"icon fab fa-github\").css(\"font-size\", \"22px\"),\n                  E(\"span\").text(\"Submit your own\").css(\"text-decoration\", \"underline\")\n                )\n              )\n            }\n          })\n        ]\n      })\n      MenuBar.addAction(manageAction, \"view.11\")\n      const currentScene = localStorage.getItem(\"preview_scene\")\n      if (currentScene) setTimeout(() => {\n        if (Project.format?.id !== format.id) PreviewScene.scenes[currentScene]?.select()\n        else activePreviewScene = currentScene\n      }, 0)\n      properties = [\n        new Property(ModelProject, \"number\", \"preview_scene_render_side\", {\n          exposed: false,\n          default: 2,\n          condition: () => Format === format\n        }),\n        new Property(ModelProject, \"number\", \"preview_scene_light_side\", {\n          exposed: false,\n          default: 0,\n          condition: () => Format === format\n        }),\n        new Property(ModelProject, \"string\", \"preview_scene_light_colour\", {\n          exposed: false,\n          default: \"#ffffff\",\n          condition: () => Format === format\n        }),\n        new Property(ModelProject, \"string\", \"preview_scene_tint_colour\", {\n          exposed: false,\n          default: \"#ffffff\",\n          condition: () => Format === format\n        }),\n        new Property(ModelProject, \"boolean\", \"preview_scene_shading\", {\n          exposed: false,\n          default: true,\n          condition: () => Format === format\n        })\n      ]\n      Blockbench.on(\"select_preview_scene\", setCurrentPreviewScene)\n      Blockbench.on(\"unselect_preview_scene\", removeCurrentPreviewScene)\n    },\n    onuninstall() {\n      localStorage.removeItem(\"preview_scene\")\n      localStorage.removeItem(\"preview_scenes\")\n    },\n    onunload() {\n      Blockbench.removeListener(\"select_preview_scene\", setCurrentPreviewScene)\n      Blockbench.removeListener(\"unselect_preview_scene\", removeCurrentPreviewScene)\n      format.delete()\n      codec.delete()\n      manageAction.children.forEach(e => e.delete())\n      manageAction.delete()\n      exportAction.delete()\n      exportAction2.delete()\n      PreviewScene.active?.unselect()\n      for (const scene of scenes) PreviewScene.scenes[scene].delete()\n      styles.delete()\n      properties.forEach(e => e.delete())\n    }\n  })\n  async function configurePreviewSceneSettings(model, args) {\n    if (!model.texture) return Blockbench.showMessageBox({\n      title: \"Unable to configure preview scene settings\",\n      message: \"This preview scene is missing a texture. Please add a texture to it before trying to configure its settings.\",\n      icon: \"warning\"\n    })\n    let texture = await new Promise(fulfill => new THREE.TextureLoader().load(model.texture, fulfill, null, fulfill))\n    const form = {\n      name: {\n        label: \"Preview Scene Name\",\n        type: \"input\",\n        placeholder: \"Example Name\",\n        value: args?.name\n      },\n      category: {\n        label: \"Preview Scene Category\",\n        type: \"input\",\n        placeholder: \"Minecraft\",\n        value: args?.category\n      },\n      renderSide: {\n        label: \"Render Side\",\n        type: \"select\",\n        options: {\n          0: \"Front Side\",\n          1: \"Back Side\",\n          2: \"Double Side\"\n        },\n        value: model.settings?.renderSide ?? 2\n      },\n      lightSide: {\n        label: \"Light side\",\n        type: \"select\",\n        options: {\n          0: \"Up\",\n          1: \"North\",\n          2: \"East\",\n          3: \"Down\",\n          4: \"South\",\n          5: \"West\"\n        },\n        value: model.settings?.lightSide ?? 0\n      },\n      lightColour: {\n        label: \"Light colour\",\n        type: \"color\",\n        value: model.settings?.lightColour ?? \"#ffffff\"\n      },\n      tintColour: {\n        label: \"Tint colour\",\n        type: \"color\",\n        value: model.settings?.tintColour ?? \"#ffffff\"\n      },\n      shading: {\n        label: \"Shading\",\n        type: \"checkbox\",\n        value: model.settings?.shading ?? true\n      }\n    }\n    if (args?.export) {\n      delete form.name\n      delete form.category\n    }\n    const dialog = new Dialog({\n      id: \"preview_scene_settings_dialog\",\n      title: \"Preview Scene Settings\",\n      buttons: [],\n      part_order: [\"form\", \"lines\"],\n      form,\n      lines: [`\n        <style>\n          dialog#preview_scene_settings_dialog #button_row {\n            display: flex;\n            justify-content: end;\n            padding-top: 13px;\n            gap: 8px;\n          }\n          dialog#preview_scene_settings_dialog #import {\n            background-color: var(--color-selected);\n          }\n          dialog#preview_scene_settings_dialog #import:hover {\n            background-color: var(--color-accent);\n          }\n          dialog#preview_scene_settings_dialog img {\n            height: 128px;\n            cursor: pointer;\n          }\n          dialog#preview_scene_settings_dialog #img_container {\n            display: flex;\n            gap: 5px;\n            flex-direction: column;\n            margin: 5px;\n          }\n          dialog#preview_scene_settings_dialog #save {\n            cursor: pointer;\n          }\n          dialog#preview_scene_settings_dialog #save:hover {\n            color: var(--color-light)\n          }\n          dialog#preview_scene_settings_dialog #preview_scene_texture {\n            transition: box-shadow .1s\n          }\n          dialog#preview_scene_settings_dialog #preview_scene_texture:hover {\n            box-shadow: 0 0 10px #00000080;\n          }\n        </style>\n        <div class=\"dialog_bar form_bar form_bar_name\">\n          <label class=\"name_space_left\" for=\"name\">Texture:</label>\n          <img id=\"preview_scene_texture\" src=\"${model.texture}\" title=\"Replace texture\" />\n          <div id=\"img_container\">\n            <div>${texture.image.width} ⨉ ${texture.image.height}</div>\n            <i id=\"save\" class=\"material-icons\" title=\"Save texture\">save</i>\n          </div>\n        </div>\n        <div id=\"button_row\">\n          <button id=\"import\">${args?.export ? \"Export\" : \"Import\"}</button>\n          <button id=\"cancel\">Cancel</button>\n        </div>\n      `]\n    }).show()\n    $(\"dialog#preview_scene_settings_dialog #preview_scene_texture\").on(\"click\", async e => {\n      let newTexture\n      try {\n        if (isApp) {\n          const file = electron.dialog.showOpenDialogSync({\n            filters: [\n              {\n                name: \"PNG Texture\",\n                extensions: [\"png\"]\n              }\n            ]\n          })\n          if (!file) return\n          newTexture = await new Promise(fulfill => new THREE.TextureLoader().load(file[0], fulfill, null, fulfill))\n        } else {\n          const input = document.createElement(\"input\")\n          let file\n          input.type = \"file\"\n          input.accept = \".png\"\n          await new Promise(fulfil => {\n            input.onchange = () => {\n              file = Array.from(input.files)\n              fulfil()\n            }\n            input.click()\n          })\n          const data = await new Promise(fulfil => {\n            const fr = new FileReader()\n            fr.onload = () => fulfil(fr.result)\n            fr.readAsDataURL(file[0])\n          })\n          newTexture = await new Promise(fulfill => new THREE.TextureLoader().load(data, fulfill, null, fulfill))\n        }\n      } catch {\n        return Blockbench.showQuickMessage(\"Unable to load texture\")\n      }\n      if (texture.image.width !== newTexture.image.width || texture.image.height !== newTexture.image.height) return Blockbench.showQuickMessage(`Selected texture does not match required dimentions of ${texture.image.width} ⨉ ${texture.image.height}`, 2000)\n      texture = newTexture\n      const canvas = document.createElement(\"canvas\")\n      canvas.width = texture.image.width\n      canvas.height = texture.image.height\n      canvas.getContext(\"2d\").drawImage(texture.image, 0, 0)\n      const data = canvas.toDataURL()\n      $(\"dialog#preview_scene_settings_dialog #preview_scene_texture\").attr(\"src\", data)\n      model.texture = data\n    })\n    $(\"dialog#preview_scene_settings_dialog #save\").on(\"click\", e => Blockbench.export({\n      type: \"PNG Texture\",\n      extensions: [\"png\"],\n      name: args?.name,\n      content: model.texture,\n      savetype: \"image\"\n    }))\n    $(\"dialog#preview_scene_settings_dialog #cancel\").on(\"click\", e => dialog.close())\n    return [dialog, new Promise(fulfil => {\n      $(\"dialog#preview_scene_settings_dialog #import\").on(\"click\", e => {\n        fulfil({\n          renderSide: parseInt(dialog.form.form_data.renderSide.bar.querySelector(\".bb-select\").getAttribute(\"value\")),\n          lightSide: parseInt(dialog.form.form_data.lightSide.bar.querySelector(\".bb-select\").getAttribute(\"value\")),\n          lightColour: dialog.form.form_data.lightColour.colorpicker.value.toHexString(),\n          tintColour: dialog.form.form_data.tintColour.colorpicker.value.toHexString(),\n          shading: dialog.form.form_data.shading.bar.querySelector(\"input\").checked\n        })\n      })\n    })]\n  }\n  async function importPreviewScene(model, args) {\n    let [dialog, settings] = await configurePreviewSceneSettings(model, args)\n    $(\"dialog#preview_scene_settings_dialog #import\").on(\"click\", async e => {\n      settings = await settings\n      const name = dialog.form.form_data.name.bar.querySelector(\"input\").value.trim()\n      const category = dialog.form.form_data.category.bar.querySelector(\"input\").value.trim().replace(/\\s/g, \"_\")\n      if (!name) return Blockbench.showQuickMessage(\"Invalid name\")\n      const id = name.toLowerCase().replace(/\\s/g, \"_\")\n      if (PreviewScene.scenes[id]?.id) return Blockbench.showQuickMessage(\"Preview Scene already exists, please pick a different name\", 2000) \n      model.color = settings.tintColour\n      model.shading = settings.shading\n      model.render_side = settings.renderSide\n      scenes.push(id)\n      new PreviewModel(id, model)\n      const lightColour = tinycolor(settings.lightColour).toRgb()\n      PreviewScene.menu_categories[category] ??= { _label: titleCase(category) }\n      const scene = new PreviewScene(id, {\n        category,\n        name,\n        preview_models: [id],\n        light_color: {\n          r: lightColour.r / 255,\n          g: lightColour.g / 255,\n          b: lightColour.b / 255\n        },\n        light_side: settings.lightSide,\n        require_minecraft_eula: args?.eula\n      })\n      if (!args?.dontEnable) PreviewScene.scenes[id].select()\n      const stored = JSON.parse(localStorage.getItem(\"preview_scenes\") ?? \"[]\")\n      stored.push({\n        id,\n        category,\n        name,\n        model: model\n      })\n      localStorage.setItem(\"preview_scenes\", JSON.stringify(stored))\n      dialog.close()\n    })\n  }\n  async function managePreviewScenes() {\n    const dialog = new Dialog({\n      title: \"Manage Preview Scenes\",\n      id: \"manage_preview_scenes_dialog\",\n      lines: [`\n        <style>\n          dialog#manage_preview_scenes_dialog .dialog_content {\n            margin-top: 10px;\n          }\n          dialog#manage_preview_scenes_dialog #button_row {\n            display: flex;\n            justify-content: end;\n            padding-top: 8px;\n          }\n          dialog#manage_preview_scenes_dialog .hidden {\n            display: none;\n          }\n          dialog#manage_preview_scenes_dialog .row {\n            display: flex;\n            padding: 2px 4px 2px 1em;\n            align-items: center;\n          }\n          dialog#manage_preview_scenes_dialog .row .spacer {\n            height: 2px;\n            background-color: var(--color-button);\n            margin: 0 10px\n          }\n          dialog#manage_preview_scenes_dialog #preview_scenes > div {\n            padding-bottom: 16px;\n          }\n          dialog#manage_preview_scenes_dialog .spacer {\n            flex: 1;\n          }\n          dialog#manage_preview_scenes_dialog .dialog_content i {\n            cursor: pointer;\n            margin-left: 5px;\n          }\n          dialog#manage_preview_scenes_dialog i:hover {\n            color: var(--color-light);\n          }\n          dialog#manage_preview_scenes_dialog .dialog_wrapper {\n            position: relative;\n          }\n          dialog#manage_preview_scenes_dialog #delete_warning {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n          }\n          dialog#manage_preview_scenes_dialog #delete_warning_darken {\n            position: absolute;\n            width: 100%;\n            height: 100%;\n            background-color: var(--color-dark);\n            opacity: 0.8;\n          }\n          dialog#manage_preview_scenes_dialog #delete_warning_container {\n            z-index: 1;\n            display: flex;\n            gap: 24px;\n            flex-direction: column;\n            align-items: center;\n            filter: drop-shadow(0 0 10px var(--color-dark))\n          }\n          dialog#manage_preview_scenes_dialog #delete_warning_container h2 {\n            text-align: center;\n          }\n          dialog#manage_preview_scenes_dialog #delete_warning_buttons {\n            display: flex;\n            gap: 24px;\n          }\n          dialog#manage_preview_scenes_dialog .danger-button:hover {\n            background-color: var(--color-close);\n            color: var(--color-text)!important;\n          }\n        </style>\n        <div>\n          <div id=\"preview_scenes\">\n            <h2 id=\"builtin_label\" class=\"hidden\">Built-in Preview Scenes</h2>\n            <div id=\"builtin_preview_scenes\" class=\"hidden\"></div>\n            <h2 id=\"custom_label\" class=\"hidden\">Custom Preview Scenes</h2>\n            <div id=\"custom_preview_scenes\" class=\"hidden\"></div>\n          </div>\n          <div id=\"button_row\">\n            <button id=\"close\">Close</button>\n          </div>\n        </div>\n      `],\n      buttons: []\n    }).show()\n    $(\"dialog#manage_preview_scenes_dialog #close\").on(\"click\", e => dialog.cancel())\n    const builtinScenes = Object.entries(PreviewScene.scenes).filter(e => !scenes.includes(e[0]))\n    if (builtinScenes.length) {\n      $(\"dialog#manage_preview_scenes_dialog #builtin_label\").removeClass(\"hidden\")\n      const builtin = $(\"dialog#manage_preview_scenes_dialog #builtin_preview_scenes\").removeClass(\"hidden\")\n      for (const scene of builtinScenes) {\n        builtin.append(E(\"div\").addClass(\"row\").append(\n          E(\"div\").text(scene[1].name),\n          E(\"span\").addClass(\"spacer\"),\n          E(\"i\").addClass(\"material-icons icon\").text(\"edit\").attr(\"title\", \"Edit preview scene\").on(\"click\", e => {\n            editPreviewScene(scene[1])\n            dialog.close()\n          }),\n          E(\"i\").addClass(\"material-icons icon\").text(\"save\").attr(\"title\", \"Save preview scene\").on(\"click\", e => savePreviewScene(scene[1]))\n        ))\n      }\n    }\n    const customScenes = Object.entries(PreviewScene.scenes).filter(e => scenes.includes(e[0]))\n    if (customScenes.length) {\n      $(\"dialog#manage_preview_scenes_dialog #custom_label\").removeClass(\"hidden\")\n      const custom = $(\"dialog#manage_preview_scenes_dialog #custom_preview_scenes\").removeClass(\"hidden\")\n      for (const scene of customScenes) {\n        custom.append(E(\"div\").addClass(\"row\").append(\n          E(\"span\").text(scene[1].name),\n          E(\"span\").addClass(\"spacer\"),\n          E(\"i\").addClass(\"material-icons icon\").text(\"edit\").attr(\"title\", \"Edit preview scene\").on(\"click\", e => {\n            editPreviewScene(scene[1])\n            dialog.close()\n          }),\n          E(\"i\").addClass(\"material-icons icon\").text(\"save\").attr(\"title\", \"Save preview scene\").on(\"click\", e => savePreviewScene(scene[1])),\n          E(\"i\").addClass(\"material-icons icon\").text(\"delete\").attr(\"title\", \"Delete preview scene\").on(\"click\", e => {\n            $(\"dialog#manage_preview_scenes_dialog .dialog_wrapper\").append(\n              E(\"div\").attr(\"id\", \"delete_warning\").append(\n                E(\"div\").attr(\"id\", \"delete_warning_darken\"),\n                E(\"div\").attr(\"id\", \"delete_warning_container\").append(\n                  E(\"h2\").html(`Are you sure you want to delete<br><strong>${scene[1].name}</strong>?`),\n                  E(\"div\").attr(\"id\", \"delete_warning_buttons\").append(\n                    E(\"button\").text(\"Cancel\").on(\"click\", e => $(\"dialog#manage_preview_scenes_dialog #delete_warning\").remove()),\n                    E(\"button\").addClass(\"danger-button\").text(\"Delete\").on(\"click\", e => {\n                      PreviewScene.active?.unselect()\n                      PreviewScene.scenes[scene[1].id].delete()\n                      scenes.splice(scenes.indexOf(scene[1].id), 1)\n                      const stored = JSON.parse(localStorage.getItem(\"preview_scenes\"))\n                      stored.splice(stored.findIndex(e => e.id === scene[1].id), 1)\n                      localStorage.setItem(\"preview_scenes\", JSON.stringify(stored))\n                      managePreviewScenes()\n                      dialog.close()\n                    })\n                  )\n                )\n              )\n            )\n          })\n        ))\n      }\n    }\n  }\n  function getModel(model) {\n    const data = {}\n    if (model.texture) data.texture = model.texture\n    if (!model.texture_size.allEqual(16)) data.texture_size = model.texture_size\n    data.cubes = model.cubes\n    return data\n  }\n  function getTexture(texture) {\n    if (texture.startsWith(\"data:image/png;base64,\")) return texture\n    return new Promise(async fulfil => {\n      const reader = new FileReader()\n      reader.onload = e => fulfil(e.target.result)\n      reader.readAsDataURL(new Blob([await fetch(texture).then(e => e.arrayBuffer())], { type: \"image/png\" }))\n    }).catch(() => {})\n  }\n  function editPreviewScene(scene) {\n    const model = getModel(scene.preview_models[0])\n    codec.parse(model)\n    Project.name = scene.id\n    Project.preview_scene_render_side = scene.preview_models[0].render_side\n    Project.preview_scene_light_side = scene.light_side\n    Project.preview_scene_light_colour = tinycolor.fromRatio(scene.light_color).toHexString()\n    Project.preview_scene_tint_colour = scene.preview_models[0].color\n    Project.preview_scene_shading = scene.preview_models[0].shading\n    Blockbench.setStatusBarText(scene.name)\n  }\n  async function savePreviewScene(scene) {\n    for (const model of scene.preview_models) {\n      const out = getModel(model)\n      out.settings = {\n        renderSide: scene.preview_models[0].render_side,\n        lightSide: scene.light_side,\n        lightColour: tinycolor.fromRatio(scene.light_color).toHexString(),\n        tintColour: scene.preview_models[0].color,\n        shading: scene.preview_models[0].shading\n      }\n      out.texture = await getTexture(out.texture)\n      Blockbench.export({\n        type: \"Blockbench Preview Scene\",\n        extensions: [\"bbscene\"],\n        name: scene.id,\n        content: autoStringify(out),\n        savetype: \"bbscene\"\n      })\n    }\n  }\n  function titleCase(str) {\n    return str.replace(/_|-/g, \" \").replace(/\\w\\S*/g, str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase())\n  }\n})()"
  },
  {
    "path": "plugins/quick_box_uv_layout.js",
    "content": "(function () {\n    let button;\n    Plugin.register('quick_box_uv_layout', {\n        title: 'Quick Box-UV Layout',\n        author: 'Manuel-3',\n        description: 'Button that changes UV of a Per-face cube into Box-UV layout.',\n        about: 'This plugin simply adds a button that rearranges your individual Per-face UV rectangles in the same way Box-UV mode would. This is handy if you want to use the standard Box-UV format, but also have the flexibility of Per-face UV mode.',\n        icon: 'calendar_view_month',\n        version: '0.0.1',\n        variant: 'both',\n        onload() {\n            button = new Action('quick_box_uv_layout', {\n                name: 'Quick Box-UV Layout',\n                description: 'Changes UV into Box-UV layout.',\n                icon: 'calendar_view_month',\n                click: function () {\n                    Undo.initEdit({ elements: Cube.selected });\n\n                    // Horizontal and vertical offset\n                    let h = 0;\n                    let v = 0;\n\n                    // If box-uv then convert to per-face\n                    if (Project.box_uv) Project.box_uv = false;\n\n                    Cube.selected.forEach(cube => {\n                        // Get cube size\n                        const x = cube.size(0, true);\n                        const y = cube.size(1, true);\n                        const z = cube.size(2, true);\n\n                        // Get the required offset by looking at the top left corner of the up face\n                        h = cube.faces['up'].uv[2] - z;\n                        v = cube.faces['up'].uv[3];\n\n                        // Set individual faces position and size\n                        // Note that up face is flipped on both axes and down face is flipped on the horizontal axis\n                        cube.faces['north'].uv = [h + z, v + z, h + z + x, v + z + y];\n                        cube.faces['east'].uv = [h, v + z, h + z, v + z + y];\n                        cube.faces['west'].uv = [h + z + x, v + z, h + z + x + z, v + z + y];\n                        cube.faces['south'].uv = [h + z + x + z, v + z, h + z + x + z + x, v + z + y];\n                        cube.faces['up'].uv = [h+ z + x, v + z, h + z, v];\n                        cube.faces['down'].uv = [h + z + x + x, v, h + z + x, v + z];\n                    });\n                    Undo.finishEdit('convert to box-uv layout');\n                    // Update view to make the changes show\n                    Canvas.updateView({elements: Cube.selected, element_aspects: {uv: true}});\n                }\n            });\n            Toolbars.uv_editor.add(button);\n        },\n        onunload() {\n            button.delete();\n        }\n    });\n})();\n"
  },
  {
    "path": "plugins/rainbow_road_game/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/rainbow_road_game/about.md",
    "content": "You can start a race by clicking the Play button at the top center of the viewport.\n\nNavigate using `WASD`: `W` accelerates, `S` decelerates or drives backwards. `A` and `D` are used for steering. Only works with a physical keyboard!\n\nStay on the road, collect points, and beat your highscore!\n\nUse the \"View Rainbow Road Game Highscore\" action to see your highscore.\n"
  },
  {
    "path": "plugins/rainbow_road_game/rainbow_road_game.js",
    "content": "/// <reference path=\"../../types/index.d.ts\" />\n\n(function() {\n\n\tclass RainbowRace {\n\t\tconstructor() {\n\t\t\tthis.velocity = 0.03;\n\t\t\tthis.y_velocity = 0;\n\t\t\tthis.steering_angle = 0;\n\t\t\tthis.steer_direction = 0;\n\t\t\tthis.turn_axis = new THREE.Vector3(0, 1, 0);\n\t\t\tthis.step = 4;\n\t\t\tthis.path = [];\n\t\t\tthis.waypoints = [];\n\n\t\t\tthis.material = new THREE.MeshPhongMaterial({\n\t\t\t\tcolor: 0xffffff,\n\t\t\t\tflatShading: true,\n\t\t\t\tvertexColors: true,\n\t\t\t\tshininess: 0,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t});\n\t\t\tthis.geometry = new THREE.BufferGeometry();\n\t\t\tthis.track_width = 6;\n\t\t\tthis.track_length = 250;\n\t\t\tthis.track_length_back = 12;\n\t\t\tthis.collision_length = 64;\n\n\t\t\tthis.ticks = 0;\n\t\t\tthis.playing = false;\n\t\t\tthis.on_track = true;\n\t\t\tthis.score = 0;\n\n\t\t\tfor (let i = 0; i < this.track_length; i++) {\n\t\t\t\tthis.addPathPoint(i < this.track_length_back);\n\t\t\t}\n\n\t\t\tlet colors = [\n\t\t\t\t[128/255,  75/255, 227/255],\n\t\t\t\t[ 21/255, 118/255, 240/255],\n\t\t\t\t[ 68/255, 189/255,  96/255],\n\t\t\t\t[253/255, 203/255,  42/255],\n\t\t\t\t[252/255, 137/255,  46/255],\n\t\t\t\t[240/255,  40/255,  67/255],\n\t\t\t]\n\t\t\tlet bg_color = new THREE.Color(CustomTheme.data.colors.dark);\n\n\t\t\tlet vertex_count = 4 * this.track_width * this.track_length;\n\t\t\tthis.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertex_count * 3), 3));\n\t\t\tthis.geometry.setAttribute('color', new THREE.BufferAttribute(\t new Float32Array(vertex_count * 3), 3));\n\t\t\t\n\t\t\tfor (let i = 0; i < this.track_length * 20; i++) {\n\t\t\t\tfor (let j = 0; j < 4; j++) {\n\t\t\t\t\tlet k = 0;\n\t\t\t\t\tfor (let color of colors) {\n\t\t\t\t\t\tlet color_factor = 1;\n\t\t\t\t\t\tif ( (k==0 && j%2==0) || (k==5 && j%2==1) ) {\n\t\t\t\t\t\t\tcolor_factor = 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet fade = Math.min(Math.pow(i / (this.track_length * 0.97), 2), 1);\n\t\t\t\t\t\tthis.geometry.attributes.color.setXYZ(\n\t\t\t\t\t\t\t(i*6 + k) * 4 + j,\n\t\t\t\t\t\t\tMath.lerp(color[0] * color_factor, bg_color.r, fade),\n\t\t\t\t\t\t\tMath.lerp(color[1] * color_factor, bg_color.g, fade),\n\t\t\t\t\t\t\tMath.lerp(color[2] * color_factor, bg_color.b, fade)\n\t\t\t\t\t\t);\n\t\t\t\t\t\tk++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.updateGeometry();\n\n\t\t\tthis.coin_geometry = new THREE.OctahedronGeometry(5, 0);\n\t\t\tthis.coin_geometry2 = new THREE.OctahedronGeometry(6.2, 0);\n\t\t\tthis.coin_material = new THREE.MeshPhongMaterial({\n\t\t\t\tcolor: new THREE.Color(3.3, 3.2, 0.8),\n\t\t\t\tflatShading: false,\n\t\t\t\tshininess: 1\n\t\t\t});\n\t\t\tthis.coin_material2 = new THREE.MeshPhongMaterial({\n\t\t\t\tcolor: 0xff9c2b,\n\t\t\t\tflatShading: true,\n\t\t\t\tshininess: 0,\n\t\t\t\topacity: 0.5,\n\t\t\t\ttransparent: true\n\t\t\t});\n\t\t\tthis.coins = [];\n\t\t\t\n\t\t\tthis.scene = new THREE.Object3D();\n\t\t\tthis.world = new THREE.Object3D();\n\t\t\tthis.track = new THREE.Mesh(this.geometry, this.material);\n\t\t\tthis.scene.add(this.world);\n\t\t\tthis.world.add(this.track);\n\t\t\tthis.position = new THREE.Vector3();\n\n\t\t\tthis.keys = {\n\t\t\t\tw: false,\n\t\t\t\ts: false,\n\t\t\t\ta: false,\n\t\t\t\td: false,\n\t\t\t};\n\t\t\tdocument.addEventListener('keydown', event => {\n\t\t\t\tif (event.key == 'w') this.keys.w = true;\n\t\t\t\tif (event.key == 's') this.keys.s = true;\n\t\t\t\tif (event.key == 'a') this.keys.a = true;\n\t\t\t\tif (event.key == 'd') this.keys.d = true;\n\t\t\t})\n\t\t\tdocument.addEventListener('keyup', event => {\n\t\t\t\tif (event.key == 'w') this.keys.w = false;\n\t\t\t\tif (event.key == 's') this.keys.s = false;\n\t\t\t\tif (event.key == 'a') this.keys.a = false;\n\t\t\t\tif (event.key == 'd') this.keys.d = false;\n\t\t\t})\n\n\t\t\tthis.interval = setInterval(() => {\n\t\t\t\tthis.tick();\n\t\t\t}, 1000/30);\n\t\t}\n\t\tasync start() {\n\t\t\tif (this.playing) this.stop();\n\n\t\t\tCanvas.scene.add(this.scene);\n\t\t\tthree_grid.visible = false;\n\n\t\t\tlet model_size = 3 / calculateVisibleBox()[0];\n\t\t\tProject.model_3d.scale.set(model_size, model_size, model_size);\n\n\t\t\tlet path_scale = 3;\n\t\t\tthis.track.scale.set(path_scale, path_scale, path_scale);\n\t\t\tthis.velocity = 0;\n\t\t\tthis.y_velocity = 0;\n\t\t\tthis.on_track = true;\n\t\t\tthis.playing = true;\n\t\t\tthis.score = 0;\n\t\t\tthis.steer_direction = 0;\n\t\t\tthis.scene.rotation.set(0, 0, 0);\n\t\t\tthis.world.position.set(0, 0, -this.track_length_back * path_scale);\n\t\t\tthis.track.position.set(0, 0, 0);\n\t\t\tthis.track.rotation.set(0, 0, 0);\n\n\t\t\tlet camera_preset = {\n\t\t\t\tprojection: 'perspective',\n\t\t\t\tposition: [0, 32, -40],\n\t\t\t\ttarget: [0, 20, 0]\n\t\t\t};\n\t\t\tPreview.selected.loadAnglePreset(camera_preset);\n\n\t\t\tthis.front_right_wheel = Group.all.find(g => {\n\t\t\t\tlet name = g.name.toLowerCase();\n\t\t\t\treturn name.includes('wheel') && name.includes('front') && name.includes('right')\n\t\t\t})?.mesh;\n\t\t\tthis.front_left_wheel = Group.all.find(g => {\n\t\t\t\tlet name = g.name.toLowerCase();\n\t\t\t\treturn name.includes('wheel') && name.includes('front') && name.includes('left')\n\t\t\t})?.mesh;\n\t\t\tlet rear_wheel = Group.all.find(g => {\n\t\t\t\tlet name = g.name.toLowerCase();\n\t\t\t\treturn (name.includes('wheel') || name.includes('axle') || name.includes('axis')) && (name.includes('rear') || name.includes('back'))\n\t\t\t})\n\t\t\tthis.rotation_adjustment = Math.PI;\n\t\t\tif (rear_wheel) {\n\t\t\t\tif (rear_wheel.origin[2] < 0) {\n\t\t\t\t\tthis.rotation_adjustment = 0;\n\t\t\t\t\tProject.model_3d.position.z -= rear_wheel.origin[2] * model_size;\n\t\t\t\t} else {\n\t\t\t\t\tProject.model_3d.position.z += rear_wheel.origin[2] * model_size;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t\tstop() {\n\t\t\tCanvas.scene.remove(this.scene);\n\t\t\tthree_grid.visible = true;\n\t\t\tthis.playing = false;\n\t\t\tProject.model_3d.rotation.y = 0;\n\t\t\tProject.model_3d.scale.set(1, 1, 1);\n\t\t\tProject.model_3d.position.set(0, 0, 0);\n\t\t\tBlockbench.setStatusBarText();\n\t\t\tthis.coins.forEach(coin => this.world.remove(coin));\n\t\t\tthis.coins.empty();\n\n\t\t\tif (this.timeout) {\n\t\t\t\tclearTimeout(this.timeout);\n\t\t\t\tdelete this.timeout;\n\t\t\t}\n\t\t}\n\t\ttick() {\n\t\t\tif (!this.playing) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet steering_amount = 0.2 * (1-Math.exp(0.2 * (this.velocity - 18)));\n\t\t\tif (this.keys.a) {\n\t\t\t\tthis.steering_angle -= steering_amount * (1+Math.pow( this.steering_angle / 2, 3));\n\t\t\t} else if (this.keys.d) {\n\t\t\t\tthis.steering_angle += steering_amount * (1+Math.pow(-this.steering_angle / 2, 3));\n\t\t\t} else if (this.steering_angle) {\n\t\t\t\t//this.steering_angle -= (this.steering_angle > 0 ? 1 : -1) * 0.14;\n\t\t\t\t//if (Math.abs(this.steering_angle) < 0.1) this.steering_angle = 0;\n\t\t\t\tthis.steering_angle *= 0.8;\n\t\t\t}\n\t\t\tthis.steering_angle = Math.clamp(this.steering_angle, -1.5, 1.4);\n\n\t\t\tif (this.keys.w) {\n\t\t\t\tthis.velocity += 0.1 * (1-Math.exp(0.3 * (this.velocity - 7)));\n\t\t\t} else if (this.keys.s) {\n\t\t\t\tthis.velocity -= this.velocity > 0 ? 0.15 : 0.1;\n\t\t\t} else {\n\t\t\t\tthis.velocity -= this.velocity > 0 ? 0.1 : -0.1;\n\t\t\t\tif (Math.abs(this.velocity) < 0.1) this.velocity = 0;\n\t\t\t}\n\t\t\tthis.velocity = Math.clamp(this.velocity, -4, 10);\n\n\t\t\tif (!this.on_track) {\n\t\t\t\tthis.y_velocity = Math.clamp(this.y_velocity - 0.2, -4, 4);\n\t\t\t}\n\n\t\t\tlet movement = new THREE.Vector3(0, -this.y_velocity, -this.velocity);\n\t\t\tthis.steer_direction = this.steer_direction + this.steering_angle * Math.min(this.velocity, 1.4) * 0.02;\n\t\t\tmovement.applyAxisAngle(this.turn_axis, -this.steer_direction + 0);\n\t\t\tthis.scene.rotation.y = Math.lerp(this.scene.rotation.y, this.steer_direction, 0.1);\n\t\t\tProject.model_3d.rotation.y = this.rotation_adjustment + this.scene.rotation.y - this.steer_direction;\n\t\t\tthis.world.position.add(movement);\n\n\t\t\tif (this.front_right_wheel) this.front_right_wheel.rotation.y = this.steering_angle * -0.5;\n\t\t\tif (this.front_left_wheel) this.front_left_wheel.rotation.y = this.steering_angle * -0.5;\n\n\t\t\tlet closest_waypoint = this.getClosestWaypoint();\n\t\t\tif (closest_waypoint) {\n\t\t\t\tlet segments_regenerated = false;\n\t\t\t\twhile (closest_waypoint.index > this.track_length_back) {\n\t\t\t\t\tthis.generatePathStep();\n\t\t\t\t\tsegments_regenerated = true;\n\t\t\t\t\tclosest_waypoint.index--;\n\t\t\t\t}\n\t\t\t\tif (segments_regenerated) this.updateGeometry();\n\t\t\t} else if (this.on_track) {\n\t\t\t\t// Fall off\n\t\t\t\tthis.fall();\n\t\t\t}\n\n\t\t\tthis.coins.forEach(coin => {\n\t\t\t\tcoin.rotation.y += 0.01;\n\t\t\t\tcoin.position.y = 10 + Math.sin(this.ticks * 0.1) * 0.8;\n\n\t\t\t\tlet offset = Reusable.vec2.set(0, 0, 0);\n\t\t\t\tcoin.localToWorld(offset);\n\t\t\t\tlet distance = offset.length();\n\t\t\t\tif (distance && distance < 34) {\n\t\t\t\t\tthis.collectCoin(coin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tBlockbench.setStatusBarText(`Score: ${separateThousands(this.score)}`);\n\n\t\t\tthis.ticks++;\n\t\t}\n\t\tfall() {\n\t\t\tthis.on_track = false;\n\t\t\tlet previous_highscore = localStorage.getItem('rainbow_game.highscore') || 0;\n\t\t\tRainbowRace.last_score = this.score;\n\t\t\tif (this.score > previous_highscore) {\n\t\t\t\tBlockbench.showQuickMessage(`New Highscore: ${separateThousands(this.score)}`);\n\t\t\t\tlocalStorage.setItem('rainbow_game.highscore', this.score);\n\t\t\t} else {\n\t\t\t\tBlockbench.showQuickMessage(`Score: ${separateThousands(this.score)}`);\n\t\t\t}\n\t\t\t\n\t\t\tthis.timeout = setTimeout(() => {\n\t\t\t\tthis.stop();\n\t\t\t}, 1000)\n\t\t}\n\t\tcreateCoin(position) {\n\t\t\tlet coin = new THREE.Mesh(this.coin_geometry, this.coin_material);\n\t\t\tlet coin_glow = new THREE.Mesh(this.coin_geometry2, this.coin_material2);\n\t\t\tcoin.add(coin_glow);\n\t\t\tcoin.position.copy(position);\n\t\t\tcoin.position.y = 10;\n\t\t\tcoin.scale.y = 1.4;\n\t\t\tthis.world.add(coin);\n\t\t\tthis.coins.push(coin);\n\n\t\t\tif (this.coins.length > 40) {\n\t\t\t\tthis.world.remove(this.coins.shift());\n\t\t\t}\n\t\t}\n\t\tcollectCoin(coin) {\n\t\t\tthis.score += 5;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.coins.remove(coin);\n\t\t\t}, 40);\n\t\t\tlet interval = setInterval(() => {\n\t\t\t\tcoin.position.y *= 1.1;\n\t\t\t\tcoin.scale.multiplyScalar(0.95);\n\t\t\t}, 16)\n\t\t\tsetTimeout(() => {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tthis.coins.remove(coin);\n\t\t\t\tthis.world.remove(coin);\n\t\t\t}, 150);\n\t\t}\n\t\tgeneratePathStep() {\n\t\t\tthis.track.rotation.y += this.path[0];\n\t\t\tlet offset = new THREE.Vector3(0, 0, -this.step * this.track.scale.x);\n\t\t\toffset.applyAxisAngle(this.turn_axis, this.track.rotation.y);\n\t\t\t//offset.x *= this.track.scale.x;\n\t\t\t//offset.z *= this.track.scale.x;\n\t\t\tthis.track.position.sub(offset);\n\n\t\t\tif (Math.random() < 1/24) {\n\t\t\t\t// Coin\n\t\t\t\tlet waypoint = this.waypoints[this.collision_length - 2];\n\t\t\t\tlet position = Reusable.vec1.copy(waypoint.position);\n\t\t\t\tposition.applyMatrix4(this.track.matrix);\n\t\t\t\tthis.createCoin(position);\n\t\t\t}\n\n\t\t\tthis.path.shift();\n\t\t\tthis.addPathPoint();\n\t\t\tthis.score++;\n\t\t}\n\t\tgetClosestWaypoint() {\n\t\t\tlet position = new THREE.Vector3();\n\t\t\tthis.track.worldToLocal(position);\n\t\t\tlet distance = new THREE.Vector3();\n\t\t\tlet waypoints_in_reach = this.waypoints.filter((waypoint, index) => {\n\t\t\t\twaypoint.index = index;\n\t\t\t\twaypoint.distance = distance.copy(position).sub(waypoint.position).length();\n\t\t\t\treturn waypoint.distance <= (this.track_width + 2);\n\t\t\t});\n\t\t\twaypoints_in_reach.sort((a, b) => a.distance - b.distance);\n\t\t\treturn waypoints_in_reach[0];\n\t\t}\n\t\tupdateGeometry() {\n\t\t\tlet segment_width = 2;\n\t\t\tlet angle = 0;\n\t\t\tlet trailhead = new THREE.Vector3(0, 0, 0);\n\t\t\tlet offset1 = new THREE.Vector3(0, 0, 0);\n\t\t\tlet offset2 = new THREE.Vector3(0, 0, 0);\n\t\t\tlet offset3 = new THREE.Vector3(0, 0, 0);\n\t\t\tlet offset4 = new THREE.Vector3(0, 0, 0);\n\n\t\t\tlet quad_index = 0;\n\t\t\tlet indices = [];\n\t\t\tlet positions = [];\n\n\t\t\tthis.waypoints.empty();\n\n\t\t\tlet i = 0;\n\t\t\tfor (let curvature of this.path) {\n\t\t\t\tlet old_angle = angle;\n\t\t\t\tangle += curvature;\n\t\t\t\tif (i < this.collision_length) {\n\t\t\t\t\tthis.waypoints.push({position: new THREE.Vector3().copy(trailhead)});\n\t\t\t\t}\n\t\t\t\tfor (let x = -3; x < 3; x++) {\n\t\t\t\t\toffset1.set(x * segment_width, 0, 0)\n\t\t\t\t\toffset1.applyAxisAngle(this.turn_axis, old_angle);\n\t\t\t\t\toffset1.add(trailhead);\n\t\t\t\t\tpositions.push(offset1.x, offset1.y, offset1.z);\n\n\t\t\t\t\toffset2.set((x+1) * segment_width, 0, 0)\n\t\t\t\t\toffset2.applyAxisAngle(this.turn_axis, old_angle);\n\t\t\t\t\toffset2.add(trailhead);\n\t\t\t\t\tpositions.push(offset2.x, offset2.y, offset2.z);\n\n\t\t\t\t\toffset3.set(x * segment_width, 0, this.step);\n\t\t\t\t\toffset3.applyAxisAngle(this.turn_axis, angle);\n\t\t\t\t\toffset3.add(trailhead);\n\t\t\t\t\tpositions.push(offset3.x, offset3.y, offset3.z);\n\n\t\t\t\t\toffset4.set((x+1) * segment_width, 0, this.step);\n\t\t\t\t\toffset4.applyAxisAngle(this.turn_axis, angle);\n\t\t\t\t\toffset4.add(trailhead);\n\t\t\t\t\tpositions.push(offset4.x, offset4.y, offset4.z);\n\n\t\t\t\t\tindices.push(quad_index*4 + 0, quad_index*4 + 3, quad_index*4 + 1, quad_index*4 + 0, quad_index*4 + 2, quad_index*4 + 3);\n\n\t\t\t\t\tquad_index++;\n\t\t\t\t}\n\t\t\t\toffset1.set(0, -0.005, this.step);\n\t\t\t\toffset1.applyAxisAngle(this.turn_axis, angle);\n\t\t\t\ttrailhead.add(offset1);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthis.geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );\n\t\t\tthis.geometry.setIndex(indices);\n\t\t}\n\t\taddPathPoint(straight) {\n\t\t\tlet last_point = this.path.last() || 0;\n\t\t\tlet influence = straight ? 0 : Math.pow(Math.randomab(-1, 1), 3) * 0.5;\n\t\t\tthis.path.push(Math.lerp(last_point, influence, 0.075));\n\t\t}\n\t\t\n\t}\n\tRainbowRace.start = () => {\n\t\tif (!RainbowRace.current_race) {\n\t\t\tRainbowRace.current_race = new RainbowRace();\n\t\t}\n\t\tRainbowRace.current_race.start();\n\t}\n\tRainbowRace.stop = () => {\n\t\tRainbowRace.current_race.stop();\n\t}\n\n\tlet css, controls, highscore_action;\n\t\n\tPlugin.register('rainbow_road_game', {\n\t\ttitle: \"Rainbow Road Game\",\n\t\tauthor: \"JannisX11\",\n\t\ticon: \"icon.png\",\n\t\tdescription: \"The rainbow road racing minigame from April fools day 2024! Turn your model into a race car and take it for a spin!\",\n\t\ttags: [\"Minigame\"],\n\t\tversion: \"0.1.1\",\n\t\tmin_version: \"4.8.0\",\n\t\tvariant: \"both\",\n\t\tcreation_date: \"2024-04-1\",\n\t\tonload() {\n\n\t\t\tlet buttons = [\n\t\t\t\tInterface.createElement('div', {}, Blockbench.getIconNode('play_arrow')),\n\t\t\t\tInterface.createElement('div', {}, Blockbench.getIconNode('pause')),\n\t\t\t];\n\t\t\tcontrols = Interface.createElement('div', {id: 'rainbow_game_controls'}, buttons);\n\t\t\tInterface.preview.append(controls);\n\t\t\tbuttons[0].onclick = RainbowRace.start;\n\t\t\tbuttons[1].onclick = RainbowRace.stop;\n\n\t\t\tlet css = Blockbench.addCSS(`\n\t\t\t\t#rainbow_game_controls {\n\t\t\t\t\twidth: 64px;\n\t\t\t\t\theight: 30px;\n\t\t\t\t\tmargin: auto;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\tright: 0;\n\t\t\t\t\ttop: 1px;\n\t\t\t\t\tbackground-color: var(--color-ui);\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\tz-index: 10;\n\t\t\t\t\tborder-bottom-right-radius: 2px;\n\t\t\t\t\tborder-bottom-left-radius: 2px;\n\t\t\t\t}\n\t\t\t\t#rainbow_game_controls > div {\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\tpadding: 4px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t}\n\t\t\t\t#rainbow_game_controls > div:hover {\n\t\t\t\t\tcolor: var(--color-light);\n\t\t\t\t}\n\t\t\t`);\n\n\t\t\thighscore_action = new Action('rainbow_road_highscore', {\n\t\t\t\tname: 'View Rainbow Road Game Highscore',\n\t\t\t\ticon: 'looks',\n\t\t\t\tclick() {\n\t\t\t\t\tBlockbench.showMessageBox({\n\t\t\t\t\t\ttitle: 'Rainbow Road Game',\n\t\t\t\t\t\tmessage: `Last score: ${separateThousands(RainbowRace.last_score || 0)}\\n\\nHighscore: ${separateThousands(localStorage.getItem('rainbow_game.highscore') || 0)}`\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\tonunload() {\n\t\t\tcontrols.remove();\n\t\t\tcss.delete();\n\t\t\thighscore_action.delete();\n\t\t}\n\t});\n\t\n\t})()\n\t"
  },
  {
    "path": "plugins/reexport_on_save/LICENSE.MD",
    "content": "MIT License\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/reexport_on_save/about.md",
    "content": "This plugin adds a toggle to automatically re-export when saving a project.\nThe export settings can be customized per project.\nOther plugins that add new exporting codecs should work with this out of the box.\n"
  },
  {
    "path": "plugins/reexport_on_save/members.yml",
    "content": "maintainers:\n  - mr0x13f\ndevelopers:\n  - mr0x13f\n"
  },
  {
    "path": "plugins/reexport_on_save/reexport_on_save.js",
    "content": "(function() {\n\nconst windows = Blockbench.operating_system === 'Windows';\n\n// Fix for Properties of type 'object' not getting read properly on project load\n// Thanks SnaveSutit!\nclass DeepClonedObjectProperty extends Property {\n    constructor(targetClass, name, options) {\n        super(targetClass, 'object', name, options)\n    }\n    merge(instance, data) {\n        if (data[this.name] == undefined) {\n            instance[this.name] = undefined;\n        } else if (typeof data[this.name] === 'object') {\n            instance[this.name] = JSON.parse(JSON.stringify(data[this.name]));\n            (JSON.stringify(instance[this.name]));\n\n            // Empty object gets replaced with undefined\n            if (Object.keys(instance[this.name]).length === 0)\n                instance[this.name] = undefined;\n        }\n    }\n    copy(instance, target) {\n        if (instance[this.name] == undefined) {\n            target[this.name] = undefined;\n        } else if (typeof instance[this.name] === 'object') {\n            target[this.name] = JSON.parse(JSON.stringify(instance[this.name]));\n\n            // Empty object gets replaced with undefined\n            if (Object.keys(target[this.name]).length === 0)\n                target[this.name] = undefined;\n        }\n    }\n}\n\nlet deferred = [];\n\nlet isCurrentlyReexporting = false;\nlet anotherReexportQueued = false;\n\n// MARK: 🟥 plugin\n\nPlugin.register('reexport_on_save', {\n    title:         'Re-export on Save',\n    author:        '0x13F',\n    description:   'Automatically re-export your project when saving',\n    icon:          'output',\n    creation_date: '2025-04-18',\n    version:       '2.0.0',\n    variant:       'desktop',\n    min_version:   '4.12.4',\n    has_changelog: false,\n    tags:          [ 'Exporter', 'Utility' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/reexport_on_save',\n    onload() {\n\n        // Property to store re-export settings in project file\n        let reexportSettingsProperty = deferDelete(new DeepClonedObjectProperty(ModelProject, 'reexport', {\n            exposed: false,\n            default: undefined,\n        }));\n\n        // Re-export settings action (for Action Control [F1])\n        let reexportSettingsAction = deferDelete(new Action('reexport_settings', {\n            name: 'Re-export on Save...',\n            icon: 'output',\n            click() {  \n                reexportSettingsDialog.show();\n            },\n        }));\n\n        // MARK: 🟩   dialog\n\n        // Re-export settings dialog\n        let reexportSettingsDialog = deferDelete(new Dialog('reexport_settings_dialog', {\n            title: 'Re-export on Save',\n            // Note that this form gets massively altered by buildReexportDialog()\n            form: {\n                ['info']: {\n                    type: 'info',\n                    text: 'Automatically re-export when saving this project.',\n                },\n                ['enabled']: {\n                    type: 'checkbox',\n                    label: 'Enabled (for this project)',\n                    value: true,\n                },\n                ['codec_seperator']: '_',\n                // This will get replaced with a div later\n                ['codec_options_dummy']: { type: 'info', text: '', },\n                ['path_seperator']: '_',\n                ['path']: {\n                    type: 'text',\n                    label: 'Export location',\n                    value: '',\n                    extensions: [ 'blend' ],\n                },\n                ['relative']: {\n                    type: 'checkbox',\n                    label: 'Relative to project',\n                    value: true,\n                },\n            },\n            onOpen() {\n                buildReexportDialog(this);\n            },\n            onConfirm(result) {\n                Project.reexport ??= {};\n\n                // Save re-export codec settings\n                let codecResult = this.codecForm.getResult();\n                Project.reexport.codec = codecResult.codec;\n                // Remove 'codec_' prefix from codec options\n                Project.reexport.codec_options = Object.keys(codecResult)\n                    .filter(k => k !== 'codec')\n                    .map(k => [k.slice('codec_'.length), codecResult[k]])\n                    .reduce(toMap, {});\n\n                // Store re-export codec settings in Project.export_options\n                Project.export_options[Project.reexport.codec] = {...Project.reexport.codec_options};\n\n                // Scream at the user if the path is bad\n                if (!isReexportPathValid(result.path)) {\n                    Blockbench.showMessageBox({\n                        title: 'Re-export on Save',\n                        message: 'Chosen export path is not valid, please enter a different path.',\n                        icon: 'error',\n                    }, () => BarItems['reexport_settings'].trigger());\n                    return;\n                }\n\n                // Now that we know the path is ok, store it and the new enabled state\n                Project.reexport.path = result.path;\n                setReexportEnabled(result.enabled);\n            },\n        }));\n\n        // MARK: 🟩   toggle\n\n        // Re-export enabled toggle in the file menu\n        // If re-export settings are not set, will instead open the dialog\n        // Icon will be kept up-to-date with the enabled state\n        let reexportEnabledToggle = {\n            id: 'reexport_toggle',\n\t\t\tname: 'Re-export on Save',\n\t\t\ticon: 'check_box_outline_blank',\n\t\t\tsearchable: false,\n            condition: () => Project,\n\t\t\tclick() {\n                // If re-export is not set up then show dialog\n                if (Project.reexport == undefined) {\n                    reexportSettingsDialog.show();\n                // Otherwise toggle enabled\n                } else {\n                    setReexportEnabled(!Project.reexport.enabled);\n                }\n\t\t\t},\n            children: [\n                // File -> [x] Re-export on save [...] -> Options...\n                {\n                    name: 'menu.options',\n                    icon: 'web_asset',\n                    click() {\n                        BarItems['reexport_settings'].trigger();\n                    },\n                },\n            ],\n\t\t};\n        // Position the toggle in the File menu right after the Export dropdown\n        let exportDropdownIndex = MenuBar.menus.file.structure.findIndex(item => item.id === 'export');\n        let reexportEnabledToggleIndex = exportDropdownIndex + 1;\n        MenuBar.menus.file.structure.splice(reexportEnabledToggleIndex, 0, reexportEnabledToggle);\n        defer(() => MenuBar.menus.file.structure.splice(MenuBar.menus.file.structure.indexOf(reexportEnabledToggle), 1));\n\n        // Set initial state for checkbox toggle\n        // Would only matter if plugins got reloaded while a file is open with re-export already enabled\n        updateReexportEnabledCheckbox();\n        // Same for status bar\n        updateStatusBar();\n\n        // MARK: 🟩   listeners\n\n        // Update toggle and status when switching projects\n        deferDelete(Blockbench.addListener('select_project', () => {\n            updateReexportEnabledCheckbox();\n            updateStatusBar();\n        }));\n\n        // Open listener\n        deferDelete(Blockbench.addListener('load_project',  onProjectOpen));\n        deferDelete(Blockbench.addListener('setup_project', onProjectOpen));\n\n        // Save listener\n        deferDelete(Blockbench.addListener('save_project', e => {\n            // Not an actual manual save\n            if (e.model.meta.backup)\n                return;\n            // Re-export not set up or disabled\n            if (!Project.reexport?.enabled)\n                return;\n\n            reexport();\n        }));\n\n    },\n    onunload() {\n\n        for (let lambda of deferred)\n            lambda();\n        \n    },\n});\n\n// MARK: 🟥 re-export\n\n// Make the actual re-export happen\n// We avoid using the codec's export() method, as it triggers dialogs and such\n// Instead we use the codec's compile() and write() methods\n// If a re-exporting process is already being done right now, queue up another one\nasync function reexport() {\n\n    if (isCurrentlyReexporting) {\n        anotherReexportQueued = true;\n        return;\n    }\n\n    let startTime = new Date();\n\n    isCurrentlyReexporting = true;\n    updateStatusBar();\n\n    let exportPath = exportPathToAbsolute(Project.reexport.path);\n\n    // Failed to resolve export path\n    if (!PathModule.isAbsolute(exportPath)) {\n        isCurrentlyReexporting = false;\n        showReexportFailed('the export path is relative but this project has no save path');\n        return;\n    }\n\n    // Invalid export path\n    if (!isReexportPathValid(exportPath)) {\n        isCurrentlyReexporting = false;\n        showReexportFailed('the export path is not valid');\n        return;\n    }\n\n    let exportFilename = PathModule.basename(exportPath);\n    let codec = Codecs[Project.reexport.codec];\n    let codecOptions = Project.reexport.codec_options;\n\n    // Bad codec\n    if (codec == undefined || codec.export_action?.conditionMet() === false) {\n        isCurrentlyReexporting = false;\n        showReexportFailed(`\"${Project.reexport.codec}\" is not a valid export codec for this project`);\n        return;\n    }\n\n    // Compile\n    let content = await tryCatchAwait(() => codec.compile(codecOptions));\n\n    if (content instanceof Error) {\n        isCurrentlyReexporting = false;\n        showReexportFailed(content);\n        return;\n    } else if (content == undefined) {\n        isCurrentlyReexporting = false;\n        showReexportFailed();\n        return;\n    }\n\n    // Write\n    let writeResult = await tryCatchAwait(() => codec.write(content, exportPath));\n\n    if (writeResult instanceof Error) {\n        isCurrentlyReexporting = false;\n        showReexportFailed(content);\n        return;\n    }\n\n    // TODO: Maybe we could check here that the output file exists\n    // maybe whether the last write time has been updated\n    // but since we can't assume codec.write() will let us know when it's done,\n    // it would be tricky to determine.\n    // If someone actually runs into this we could look at it\n\n    // Success :)\n    isCurrentlyReexporting = false;\n    updateStatusBar(`Re-exported as ${exportFilename}`, 'check', 5000);\n\n    // Show the quick message at least 1 second after saving,\n    // to allow for the saving message to disappear\n    let endTime = new Date();\n    let durationMs = endTime - startTime;\n    setTimeout(() => {\n        Blockbench.showQuickMessage(`Re-exported as ${exportFilename}`, 1000)\n    }, 1000 - durationMs);\n\n    // If another re-export was queued, start it now\n    if (anotherReexportQueued) {\n        anotherReexportQueued = false;\n        reexport();\n    }\n\n}\n\nfunction showReexportFailed(reason) {\n    updateStatusBar('Re-exporting failed', 'error', 5000);\n\n    let reasonText = reason == undefined ? ''\n        : reason instanceof Error ? ` because: \"${reason}\"`\n        : ` because ${reason}`;\n\n    Blockbench.showToastNotification({\n        text: `Re-exporting failed${reasonText}. Please adjust your re-export settings.`,\n        icon: 'error',\n        color: 'red',\n        click: () => BarItems['reexport_settings'].trigger(),\n    });\n}\n\n// MARK: 🟥 build dialog\n\n// Make hacky changes to the re-export dialog\n// Called when the dialog is opened, and when the codec is changed.\n// Form(s) get auto-filled with the saved re-export settings and/or previously used export settings.\n// The codec selection and options are in a seperate form, inserted in a div inside the dialog form.\n// Codec form is accessible later with dialog.codecForm\n// The export path picker is a textbox with a browse button inserted into it.\nfunction buildReexportDialog(dialog, justChangedCodecTo) {\n\n    // Fill values from settings if they're already set\n    if (Project.reexport != undefined && justChangedCodecTo == undefined) {\n        dialog.setFormValues({\n            ...Project.reexport,\n            // Also set the relative checkbox\n            relative: !PathModule.isAbsolute(Project.reexport?.path ?? ''),\n        });\n    }\n\n    // MARK: 🟩   codec form\n\n    // Make sure we have a div to work with\n    let codecOptionsDiv = dialog.object.querySelector('#reexport_dialog_codec_options');\n    if (codecOptionsDiv != undefined) {\n        // Dialog has been build before, just clear the div\n        codecOptionsDiv.innerHTML = '';\n    } else {\n        // Fresh dialog, replace the dummy with a div\n        let codecOptionsDummy = dialog.object.querySelector('.form_bar_codec_options_dummy');\n        codecOptionsDiv = Interface.createElement('div', { id: 'reexport_dialog_codec_options' });\n        dialog.form.node.appendChild(codecOptionsDiv);\n        codecOptionsDummy.after(codecOptionsDiv);\n        codecOptionsDummy.remove();\n    }\n\n    // Codec that was just picked...\n    let selectedCodec = justChangedCodecTo\n        // ...or that was saved in re-export settings\n        ?? Project.reexport?.codec\n        // ...or first codec that has export_options saved\n        ?? Object.keys(Codecs)\n            .filter(c => Project.export_options[c] != undefined)\n            [0]\n        // ...otherwise just use GLTF\n        ?? 'gltf';\n\n    // List of Codecs\n    let codecsList = Object.values(Codecs)\n        .filter(c => c.export_action?.conditionMet())\n        // Options shown as model name with extension\n        // For GLTF we manually add .glb as another extension\n        .map(c => [c.id, `${c.name} (.${c.extension}${c.id === 'gltf' ? '/.glb' : ''})`])\n        .reduce(toMap, {});\n\n    // Options for the chosen Codec\n    // Keys get 'codec_' prefix\n    let codecExportOptions = Codecs[selectedCodec].export_options;\n    let codecOptionsList = Object.keys(codecExportOptions)\n        .map(key => ['codec_'+key, codecExportOptions[key]])\n        .reduce(toMap, {});\n\n    // Create inner form for codec and codec options\n    let codecForm = new InputForm({\n        ['codec']: {\n            label: 'Export as',\n            type: 'select',\n            options: codecsList,\n            value: selectedCodec,\n        },\n        ...codecOptionsList,\n    });\n    dialog.codecForm = codecForm;\n    codecOptionsDiv.appendChild(codecForm.node);\n\n    // Make sure label width for the codec form is the same as the outer form \n    let maxLabelWidth = dialog.form.node.style.getPropertyValue('--max_label_width');\n    codecForm.node.style.setProperty('--max_label_width', maxLabelWidth);\n\n    // Codec is currently used in re-export settings, fill values\n    if (selectedCodec === Project.reexport?.codec) {\n        let savedCodecOptions = Object.keys(Project.reexport.codec_options)\n            .map(key => [ 'codec_'+key, Project.reexport.codec_options[key] ])\n            .reduce(toMap, {});\n        codecForm.setValues(savedCodecOptions);\n\n    // Codec was used before in export_options, fill values as defaults\n    } else if (Project.export_options[selectedCodec] != undefined) {\n        let savedCodecOptions = Object.keys(Project.export_options[selectedCodec])\n            .map(key => [ 'codec_'+key, Project.export_options[selectedCodec][key] ])\n            .reduce(toMap, {});\n        codecForm.setValues(savedCodecOptions);\n    }\n\n    // Remember encoding if the codec is GLTF\n    let gltfEncoding = selectedCodec === 'gltf' ? dialog.codecForm.getResult().codec_encoding : undefined;\n\n    // Remember whether the path is relative\n    let exportPathIsRelative = dialog.getFormResult().relative;\n\n    // Inner form change listener\n    // Rebuild dialog when codec is changed\n    // Keep extension up-to-date\n    codecForm.on('change', data => {\n        // If codec is changed, update export path extension\n        let newCodec = data.result.codec;\n        if (newCodec !== selectedCodec) {\n            // Rebuild the whole dialog\n            buildReexportDialog(dialog, newCodec);\n\n            // Update extension for new codec\n            // Special case for when the new codec is GLTF and the previously saved encoding is GLB\n            let newExtension = Codecs[newCodec].extension;\n            if (newCodec === 'gltf' && dialog.codecForm.getResult().codec_encoding === 'binary')\n                newExtension = 'glb';\n            changeReexportExtension(dialog, newExtension);\n        \n\n        // If GLTF encoding is changed, update export path extension\n        } else if (newCodec === 'gltf' && data.result.codec_encoding !== gltfEncoding) {\n            gltfEncoding = data.result.codec_encoding;\n            let extension = gltfEncoding === 'ascii' ? 'gltf' : 'glb';\n            changeReexportExtension(dialog, extension);\n        }\n    });\n\n    // MARK: 🟩   export path\n\n    // Now that we can know the extension,\n    // if no re-export settings have been set,\n    // and we didn't just change the codec,\n    // then make up an export path\n    if (Project.reexport?.path == undefined && justChangedCodecTo == undefined) {\n        let extension = Codecs[selectedCodec].extension;\n        if (gltfEncoding === 'binary')\n            extension = 'glb';\n        let projectName = Project.name || 'model';\n        let exportPath = '.' + PathModule.sep + projectName + '.' + extension;\n        dialog.setFormValues({ path: exportPath });\n    }\n    \n    // Add browse button to path input, if we haven't already\n    let browseButton = dialog.form.node.querySelector('.form_bar_path>.input_wrapper>i.material-icons');\n    if (browseButton == undefined) {\n        let pathDiv = dialog.form.node.querySelector('.form_bar_path');\n        pathDiv.classList.add('form_bar_file');\n        let pathInput = pathDiv.querySelector('input');\n        browseButton = Blockbench.getIconNode('insert_drive_file', { style: { cursor: 'pointer' } });\n        let inputWrapper = Interface.createElement('div', {class: 'input_wrapper'}, [\n            pathInput,\n            browseButton,\n        ]);\n        pathDiv.append(inputWrapper);\n        // File picker dialog with correct extension\n        browseButton.onclick = async () => {\n            let oldPath = dialog.getFormResult().path;\n            let parentDir = PathModule.dirname((Project.save_path || Project.export_path) ?? '');\n            let startPath = PathModule.resolve(parentDir, oldPath);\n\n            let selectedCodec = dialog.codecForm.getResult().codec;\n            let gltfEncoding = selectedCodec === 'gltf' ? dialog.codecForm.getResult().codec_encoding : undefined;\n            let extension = Codecs[selectedCodec].extension;\n            if (gltfEncoding === 'binary')\n                extension = 'glb';\n    \n            // Replace invalid path with just the name of the project\n            if (isReexportPathValid(oldPath, extension))\n                startPath = Project.name || 'model';\n    \n            let chosenPath = await pickExportPath(startPath, Codecs[selectedCodec].name, [extension]);\n            dialog.setFormValues({ path: chosenPath });\n            makeReexportPathRelative(dialog, exportPathIsRelative);\n        }\n        \n        // Relative path toggle\n        // Also only if we hadn't already added the browse button\n        dialog.form.on('change', data => {\n            // If relative checkbox got toggled, update export path\n            if (data.result.relative !== exportPathIsRelative) {\n                exportPathIsRelative = data.result.relative;\n                makeReexportPathRelative(dialog, data.result.relative);\n            }\n        });\n    }\n\n}\n\n// MARK: 🟥 status bar\n\n// Update the text in the status bar\n// We make our own status bar element to play with\n// This function can be called with text and an icon to display a message,\n// or without parameters to show whatever the current status is\nfunction updateStatusBar(statusText, icon, expire) {\n\n    let reexportStatusNode = document.querySelector('#reexport_status');\n\n    if (reexportStatusNode == undefined) {\n        let statusBarNode = document.querySelector('#status_bar');\n        let statusMessageNode = statusBarNode.querySelector('#status_message');\n        reexportStatusNode = Interface.createElement('div', {\n            id: 'reexport_status',\n            style: 'flex-grow: 1; cursor: pointer;',\n        }, [\n            Blockbench.getIconNode('output'),\n            Interface.createElement('span', {\n                id: 'reexport_status_text',\n                style: 'padding-left: 6px; padding-right: 6px; vertical-align: top;',\n            }),\n        ]);\n        statusBarNode.appendChild(reexportStatusNode);\n        statusMessageNode.after(reexportStatusNode);\n\n        reexportStatusNode.onclick = () => BarItems['reexport_settings'].trigger();\n        \n        // Make the fps counter stop growing\n        let fpsCounterNode = statusBarNode.querySelector('div.f_right');\n        fpsCounterNode.style.width = '100px';\n        fpsCounterNode.style.textAlign = 'right';\n    }\n\n    let reexportStatusIconNode = reexportStatusNode.querySelector('.icon');\n    let reexportStatusTextNode = reexportStatusNode.querySelector('#reexport_status_text');\n    reexportStatusIconNode.classList.remove('spinning');\n\n    // No status text provided, decide what it should be\n    if (statusText == undefined) {\n        if (isCurrentlyReexporting) {\n            icon = 'autorenew';\n            statusText = 'Re-exporting...';\n            reexportStatusIconNode.classList.add('spinning');\n        } else if (Project.reexport?.enabled) {\n            icon = null;\n            statusText = 'Re-export on Save enabled';\n        }\n    }\n\n    // Hide if we have absolutely nothing to display\n    reexportStatusNode.style.display = statusText == undefined ? 'none' : 'block';\n\n    reexportStatusTextNode.textContent = statusText;\n    reexportStatusIconNode.textContent = icon;\n\n    if (expire != undefined)\n        setTimeout(updateStatusBar, expire);\n}\n\n// MARK: 🟥 util\n\nfunction exportPathToAbsolute(exportPath) {\n    return PathModule.resolve(PathModule.dirname(Project.save_path), PathModule.dirname(Project.export_path), exportPath);\n}\n\nfunction isReexportPathValid(exportPath, expectedExtension = undefined) {\n    let absoluteExportPath = exportPathToAbsolute(exportPath);\n    let filename = PathModule.basename(exportPath);\n    let extensionWithPeriod = PathModule.extname(filename);\n    let isInvalid = false;\n\n    // Re-export path should not be the same as the project itself\n    // Note how export_path is actually the save path when editing a model that isn't saved as .bbmodel\n    // But it still means it will get saved there when pressing Ctrl+S\n    isInvalid ||= absoluteExportPath === Project.save_path || absoluteExportPath === Project.export_path;\n\n    // No extension, very likely a bad filename\n    // If the user does intend to actually save as something without a filename,\n    // then they're weird\n    isInvalid ||= extensionWithPeriod === '' || extensionWithPeriod === '.';\n\n    if (expectedExtension == undefined) {\n        expectedExtension = Codecs[Project.reexport.codec].extension;\n        if (Project.reexport.codec === 'gltf' && Project.reexport.codec_options.encoding === 'binary')\n            expectedExtension = 'glb';\n    }\n    \n    // Extension doesn't match what's expected from the codec\n    // This is a lot more likely to be intentional than no extension\n    // But still a lot less likely than being an accident\n    // Maybe we should remove this check in future?\n    isInvalid ||= extensionWithPeriod.slice(1) !== expectedExtension;\n\n    // null bytes invalid on all OSes\n    isInvalid ||= exportPath.includes('\\0');\n\n    // Windows specific...\n    if (windows) {\n        // Invalid path char\n        isInvalid ||= ['<','>','\"','|','?','*'].some(char => absoluteExportPath.includes(char));\n        // Invalid filename char\n        isInvalid ||= filename.includes(':');\n        // Invalid name\n        isInvalid ||= ['CON'|'PRN'|'AUX'|'NUL'].some(name => filename.toUpperCase() === name);\n        // COM0-9 or LTP0-9\n        isInvalid ||= /^(COM\\d|LTP\\d)$/i.test(filename);\n        // Start or end with space\n        isInvalid ||= filename.startsWith(' ') || filename.endsWith(' ');\n        // End with period\n        isInvalid ||= filename.endsWith('.');\n        // Only spaces and periods\n        isInvalid ||= [...filename].every(c => c === '.' || c === ' ');\n    }\n\n    return !isInvalid;\n}\n\n// When the user changes the re-export codec or GLTF encoding,\n// we update the export path extension\nfunction changeReexportExtension(dialog, newExtension) {\n\n    let oldPath = dialog.getFormResult().path;\n    let baseNameWithoutExt = PathModule.basename(oldPath, PathModule.extname(oldPath));\n    // Replace empty filename or filename startings with periods, because they're probably invalid\n    if (baseNameWithoutExt === '' || baseNameWithoutExt.startsWith('.'))\n        baseNameWithoutExt = Project.name || 'model';\n\n    let pathWithoutExtension = PathModule.dirname(oldPath) + PathModule.sep + baseNameWithoutExt;\n    let newPath = pathWithoutExtension + '.' + newExtension;\n\n    dialog.setFormValues({ path: newPath, });\n}\n\n// When the user toggles the relative path checkbox in the re-export dialog,\n// we edit the export path to match the new value\nfunction makeReexportPathRelative(dialog, makeRelative) {\n    \n    let oldPath = dialog.getFormResult().path;\n    let newPath = undefined;\n\n    let parentDir = PathModule.dirname((Project.save_path || Project.export_path) ?? '');\n    // If we don't know the parent dir of the project,\n    // there's no point even trying to do anything\n    if (parentDir === '' || parentDir === '.')\n        return;\n\n    if (makeRelative && PathModule.isAbsolute(oldPath)) {\n        newPath = '.' + PathModule.sep + PathModule.relative(parentDir, oldPath);\n    } else if (!makeRelative) { // make absolute\n        newPath = PathModule.resolve(parentDir, oldPath);\n    }\n\n    dialog.setFormValues({ path: newPath });\n    \n}\n\n// Changes the enabled setting and notifies the user\nfunction setReexportEnabled(enabled) {\n\n    let oldEnabled = Project.reexport.enabled;\n\n    Project.reexport.enabled = enabled;\n\n    updateReexportEnabledCheckbox();\n    updateStatusBar();\n\n    if (oldEnabled !== enabled) {\n        if (enabled) {\n            Blockbench.showToastNotification({\n                text: 'Your project will now be automatically re-exported when you save.',\n                icon: 'info',\n                expire: 5000,\n            });\n        } else {\n            Blockbench.showQuickMessage('Re-export on Save disabled');\n        }\n    }\n\n}\n\n// Make sure the toggle icon in the file menu matches the enabled setting\nfunction updateReexportEnabledCheckbox() {\n    let toggle = MenuBar.menus.file.structure.find(i => i.id === 'reexport_toggle');\n    if (toggle != undefined)\n        toggle.icon = Project.reexport?.enabled ? 'check_box' : 'check_box_outline_blank';\n}\n\n// Callback for when a project is loaded, or imported\nfunction onProjectOpen(e) {\n\n    // This gets called twice for some reason, we ignore the second time when e is not undefined\n    if (e != undefined)\n        return;\n\n    // Wait for properties to be loaded\n    setTimeout(() => {\n        // If the re-export settings is an empty object, replace it with undefined\n        if (Project.reexport != undefined && Object.keys(Project.reexport).length === 0)\n            Project.reexport = undefined;\n        \n        // Update toggle checkbox state and status bar\n        updateReexportEnabledCheckbox();\n        updateStatusBar();\n\n        if (Project.reexport?.enabled) {\n            Blockbench.showToastNotification({\n                text: 'This project is set up to automatically re-export when you save.',\n                icon: 'info',\n                expire: 5000,\n                click: () => BarItems['reexport_settings'].trigger(),\n            });\n        }\n    }, 0);\n}\n\n// Export dialog that doesn't save anything\nfunction pickExportPath(startPath, name, extensions) {\n    return new Promise((resolve, reject) => {\n        Blockbench.export({\n            type: name,\n            startpath: startPath,\n            extensions: extensions,\n            custom_writer: (content, exportPath) => resolve(exportPath),\n        });\n    });\n}\n\nfunction defer(lambda) {\n    deferred.push(lambda);\n}\n\nfunction deferDelete(deletable) {\n    if (deletable.delete == undefined) {\n        console.warn('deferDelete() called with object that isn\\'t deletable: ', deletable);\n        return;\n    }\n    defer(() => deletable.delete());\n    return deletable;\n}\n\nfunction toMap(acc, entry) {\n    return { ...acc, [entry[0]]: entry[1] };\n}\n\nasync function tryCatchAwait(lambda) {\n    try {\n        return await lambda();\n    } catch (e) {\n        return e;\n    }\n}\n\n})();\n"
  },
  {
    "path": "plugins/reference_models/reference_models.js",
    "content": "/// <reference path=\"../../types/index.d.ts\" />\n\n(function() {\n\nlet add_action, change_model_action;\n\nPlugin.register('reference_models', {\n\ttitle: 'Reference Models',\n\ticon: 'fas.fa-monument',\n\tauthor: 'JannisX11',\n\tdescription: 'Load and view glTF/glb models or other project tabs as references in Blockbench',\n\tversion: '1.1.0',\n\tmin_version: '5.0.0',\n\tvariant: 'desktop',\n\tonload() {\n\t\tclass ReferenceModel extends OutlinerElement {\n\t\t\tconstructor(data, uuid) {\n\t\t\t\tsuper(data, uuid)\n\t\t\t\t\n\t\t\t\tfor (var key in ReferenceModel.properties) {\n\t\t\t\t\tReferenceModel.properties[key].reset(this);\n\t\t\t\t}\n\t\t\t\tif (data && typeof data === 'object') {\n\t\t\t\t\tthis.extend(data)\n\t\t\t\t}\n\t\t\t}\n\t\t\tgetWorldCenter() {\n\t\t\t\treturn THREE.fastWorldPosition(this.mesh, Reusable.vec2);\n\t\t\t}\n\t\t\textend(object) {\n\t\t\t\tfor (var key in ReferenceModel.properties) {\n\t\t\t\t\tReferenceModel.properties[key].merge(this, object)\n\t\t\t\t}\n\t\t\t\tif (typeof object.vertices == 'object') {\n\t\t\t\t\tfor (let key in object.vertices) {\n\t\t\t\t\t\tthis.vertices[key] = object.vertices[key].slice();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.sanitizeName();\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tgetUndoCopy() {\n\t\t\t\tvar copy = new ReferenceModel(this)\n\t\t\t\tcopy.uuid = this.uuid;\n\t\t\t\tdelete copy.parent;\n\t\t\t\treturn copy;\n\t\t\t}\n\t\t\tgetSaveCopy() {\n\t\t\t\tvar el = {}\n\t\t\t\tfor (var key in ReferenceModel.properties) {\n\t\t\t\t\tReferenceModel.properties[key].copy(this, el)\n\t\t\t\t}\n\t\t\t\tel.type = 'reference_model';\n\t\t\t\tel.uuid = this.uuid\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\tstatic behavior = {\n\t\t\t\tmovable: true,\n\t\t\t\trotatable: true,\n\t\t\t\tscalable: true\n\t\t\t}\n\t\t}\n\t\t\tReferenceModel.prototype.title = tl('data.reference_model');\n\t\t\tReferenceModel.prototype.type = 'reference_model';\n\t\t\tReferenceModel.prototype.icon = 'fas fa-monument';\n\t\t\tReferenceModel.prototype.needsUniqueName = false;\n\t\t\tReferenceModel.prototype.menu = new Menu([\n\t\t\t\t'change_reference_model_file',\n\t\t\t\t'_',\n\t\t\t\t'group_elements',\n\t\t\t\t'copy',\n\t\t\t\t'paste',\n\t\t\t\t'duplicate',\n\t\t\t\t'_',\n\t\t\t\t'rename',\n\t\t\t\t'toggle_visibility',\n\t\t\t\t'delete'\n\t\t\t]);\n\t\t\tReferenceModel.prototype.buttons = [\n\t\t\t\tOutliner.buttons.export,\n\t\t\t\tOutliner.buttons.locked,\n\t\t\t\tOutliner.buttons.visibility,\n\t\t\t];\n\n\t\tnew Property(ReferenceModel, 'string', 'name', {default: 'reference_model'})\n\t\tnew Property(ReferenceModel, 'string', 'path')\n\t\tnew Property(ReferenceModel, 'string', 'project')\n\t\tnew Property(ReferenceModel, 'vector', 'origin');\n\t\tnew Property(ReferenceModel, 'vector', 'rotation');\n\t\tnew Property(ReferenceModel, 'vector', 'scale', {default: [1, 1, 1]});\n\t\tnew Property(ReferenceModel, 'boolean', 'visibility', {default: true});\n\t\tnew Property(ReferenceModel, 'boolean', 'wireframe', {\n\t\t\tdefault: false,\n\t\t\tinputs: {\n\t\t\t\telement_panel: {\n\t\t\t\t\tinput: {label: 'Wireframe', type: 'checkbox'},\n\t\t\t\t\tonChange() {\n\t\t\t\t\t\tupdateSelection();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tOutlinerElement.registerType(ReferenceModel, 'reference_model');\n\n\t\tfunction loadReferenceModel(element, path) {\n\t\t\tconst loader = new THREE.GLTFLoader();\n\t\t\tloader.setPath(PathModule.dirname(path) + PathModule.sep);\n\t\t\tloader.load(PathModule.basename(path), gltf => {\n\t\t\t\tif (element.mesh.children[0]) element.mesh.remove(element.mesh.children[0]);\n\t\t\t\telement.mesh.add(gltf.scene);\n\t\t\t\tlet base_size = Format.block_size;\n\t\t\t\tgltf.scene.scale.set(base_size, base_size, base_size);\n\t\t\t\telement.preview_controller.updateTransform(element);\n\t\t\t})\n\t\t}\n\t\tfunction loadProjectAsRefModel(ref_model) {\n\t\t\tlet project = ModelProject.all.find(p => p.uuid == ref_model.project);\n\t\t\tif (!project) return;\n\t\t\t\n\t\t\tif (ref_model.mesh.children[0]) ref_model.mesh.remove(ref_model.mesh.children[0]);\n\t\t\tref_model.mesh.add(project.model_3d);\n\t\t\tref_model.preview_controller.updateTransform(ref_model);\n\t\t}\n\n\t\t\n\t\tfunction selectReferenceSource(ref_model) {\n\t\t\tlet project_options = {};\n\t\t\tfor (let project of ModelProject.all) {\n\t\t\t\tif (project == Project) continue;\n\t\t\t\tproject_options[project.uuid] = project.name;\n\t\t\t}\n\t\t\tnew Dialog({\n\t\t\t\tid: 'reference_model_settings',\n\t\t\t\tform: {\n\t\t\t\t\ttype: {type: \"inline_select\", options: {\n\t\t\t\t\t\tfile: '3D File',\n\t\t\t\t\t\tproject: 'Project tab'\n\t\t\t\t\t}, value: ref_model.project ? 'project' : 'file'},\n\t\t\t\t\tfile: {\n\t\t\t\t\t\tlabel: '3D File',\n\t\t\t\t\t\ttype: 'file',\n\t\t\t\t\t\textensions: ['gltf', 'glb'],\n\t\t\t\t\t\treadtype: file => (pathToExtension(file.path) == 'glb' ? 'binary' : 'text'),\n\t\t\t\t\t\tfile_type: '3D Model',\n\t\t\t\t\t\tvalue: ref_model.path,\n\t\t\t\t\t\tcondition: (result) => result.type == 'file',\n\t\t\t\t\t},\n\t\t\t\t\tproject: {\n\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\tlabel: 'Project',\n\t\t\t\t\t\tvalue: ref_model.project,\n\t\t\t\t\t\toptions: project_options,\n\t\t\t\t\t\tcondition: (result) => result.type == 'project',\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonConfirm(result) {\n\t\t\t\t\tUndo.initEdit({elements: [ref_model]});\n\t\t\t\t\tconsole.log(result)\n\t\t\t\t\tif (result.type == 'file') {\n\t\t\t\t\t\tref_model.path = result.file;\n\t\t\t\t\t\tloadReferenceModel(ref_model, result.file);\n\t\t\t\t\t\tref_model.name = pathToName(result.file, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tref_model.project = result.project;\n\t\t\t\t\t\tref_model.name = ModelProject.all.find(p => p.uuid == result.project)?.getDisplayName() ?? 'Project';\n\t\t\t\t\t\tloadProjectAsRefModel(ref_model);\n\t\t\t\t\t}\n\t\t\t\t\tUndo.finishEdit('Change reference model source');\n\t\t\t\t}\n\t\t\t}).show();\n\t\t}\n\t\tBlockbench.on('select_project', () => {\n\t\t\tReferenceModel.all.forEach(ref_model => {\n\t\t\t\tif (ref_model.project) {\n\t\t\t\t\tloadProjectAsRefModel(ref_model);\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t\t\n\t\tnew NodePreviewController(ReferenceModel, {\n\t\t\tsetup(element) {\n\t\t\n\t\t\t\tvar mesh = new THREE.Object3D();\n\t\t\t\tProject.nodes_3d[element.uuid] = mesh;\n\t\t\t\tmesh.name = element.uuid;\n\t\t\t\tmesh.type = element.type;\n\t\t\t\tmesh.isElement = true;\n\t\t\t\tconsole.log(mesh, element.path)\n\t\t\t\tif (element.path) {\n\t\t\t\t\tloadReferenceModel(element, element.path)\n\t\t\t\t} else if (element.project) {\n\t\t\t\t\tloadProjectAsRefModel(element);\n\t\t\t\t}\n\n\t\t\t\t// Update\n\t\t\t\tthis.updateTransform(element);\n\t\t\t\tmesh.visible = element.visibility;\n\t\t\t},\n\t\t\tupdateSelection(element) {\n\t\t\t\tlet w = element.wireframe;\n\t\t\t\telement.mesh.traverse(object => {\n\t\t\t\t\tif (object.material && 'wireframe' in object.material) {\n\t\t\t\t\t\tobject.material.wireframe = w;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tadd_action = new Action('add_reference_model', {\n\t\t\tname: 'Add Reference Model',\n\t\t\ticon: 'fas.fa-monument',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => Modes.edit || Modes.paint,\n\t\t\tclick: function () {\n\n\t\t\t\tUndo.initEdit({outliner: true, elements: [], selection: true});\n\t\t\t\tvar base_reference_model = new ReferenceModel({export: false}).init()\n\t\t\t\tvar group = getCurrentGroup();\n\t\t\t\tbase_reference_model.addTo(group)\n\t\n\t\t\t\tif (Format.bone_rig) {\n\t\t\t\t\tif (group) {\n\t\t\t\t\t\tvar pos1 = group.origin.slice()\n\t\t\t\t\t\tbase_reference_model.extend({\n\t\t\t\t\t\t\torigin: pos1.slice()\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbase_reference_model.select()\n\t\t\t\tBlockbench.dispatchEvent( 'add_reference_model', {object: base_reference_model} )\n\t\n\n\t\t\t\tselectReferenceSource(base_reference_model);\n\t\t\t\tUndo.finishEdit('Add reference model', {outliner: true, elements: [base_reference_model], selection: true});\n\n\t\t\t\t/*Blockbench.import({\n\t\t\t\t\ttype: 'glTF Model',\n\t\t\t\t\textensions: ['gltf', 'glb'],\n\t\t\t\t\treadtype: file => (pathToExtension(file.path) == 'glb' ? 'binary' : 'text')\n\n\t\t\t\t}, files => {\n\t\t\t\t\tlet path = files[0].path;\n\t\t\t\t\tbase_reference_model.path = path;\n\t\t\t\t\tbase_reference_model.name = pathToName(path, false);\n\t\t\t\t\tUndo.finishEdit('Add reference model', {outliner: true, elements: selected, selection: true});\n\n\t\t\t\t\tloadReferenceModel(base_reference_model, path);\n\t\t\t\t})*/\n\n\t\t\t\treturn base_reference_model\n\t\t\t}\n\t\t})\n\t\tchange_model_action = new Action('change_reference_model_file', {\n\t\t\tname: 'Change Reference Model',\n\t\t\ticon: 'fas.fa-monument',\n\t\t\tcategory: 'edit',\n\t\t\tcondition: () => (Modes.edit || Modes.paint) && ReferenceModel.selected[0],\n\t\t\tclick: function () {\n\t\t\t\tlet ref_models = ReferenceModel.selected;\n\t\t\t\tselectReferenceSource(ref_models[0]);\n\n\t\t\t}\n\t\t})\n\t\tInterface.Panels.outliner.menu.addAction(add_action, '3')\n\t\tMenuBar.menus.edit.addAction(add_action, '6')\n\t},\n\tonunload() {\n\t\tadd_action.delete()\n\t\tchange_model_action.delete()\n\t}\n});\n\n// =========================================================================\n\n/*\nThree.js glTF Model Loader\nhttps://github.com/mrdoob/three.js\n\nCopyright © 2010-2021 three.js authors\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*/\n\n( function () {\n\n\tclass GLTFLoader extends THREE.Loader {\n\n\t\tconstructor( manager ) {\n\n\t\t\tsuper( manager );\n\t\t\tthis.dracoLoader = null;\n\t\t\tthis.ktx2Loader = null;\n\t\t\tthis.meshoptDecoder = null;\n\t\t\tthis.pluginCallbacks = [];\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t\t} );\n\t\t\tthis.register( function ( parser ) {\n\n\t\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tload( url, onLoad, onProgress, onError ) {\n\n\t\t\tconst scope = this;\n\t\t\tlet resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = THREE.LoaderUtils.extractUrlBase( url );\n\n\t\t\t} // Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tconst _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tconst loader = new THREE.FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( this.requestHeader );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t}\n\n\t\tsetDRACOLoader( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetDDSLoader() {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".' );\n\n\t\t}\n\n\t\tsetKTX2Loader( ktx2Loader ) {\n\n\t\t\tthis.ktx2Loader = ktx2Loader;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\t\treturn this;\n\n\t\t}\n\n\t\tregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tunregister( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tparse( data, path, onLoad, onError ) {\n\n\t\t\tlet content;\n\t\t\tconst extensions = {};\n\t\t\tconst plugins = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tconst magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = THREE.LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst parser = new GLTFParser( json, {\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\trequestHeader: this.requestHeader,\n\t\t\t\tmanager: this.manager,\n\t\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\t\tmeshoptDecoder: this.meshoptDecoder\n\t\t\t} );\n\t\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\t\tplugins[ plugin.name ] = plugin; // Workaround to avoid determining as unknown extension\n\t\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t\t// Remove this workaround if we move all the existing\n\t\t\t\t// extension handlers to plugin system\n\n\t\t\t\textensions[ plugin.name ] = true;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.setExtensions( extensions );\n\t\t\tparser.setPlugins( plugins );\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t}\n\t/* GLTFREGISTRY */\n\n\n\tfunction GLTFRegistry() {\n\n\t\tlet objects = {};\n\t\treturn {\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\t\t};\n\n\t}\n\t/*********************************/\n\n\t/********** EXTENSIONS ***********/\n\n\t/*********************************/\n\n\n\tconst EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\t\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\t\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\t\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\t\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\t\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression'\n\t};\n\t/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\n\n\tclass GLTFLightsExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL; // THREE.Object3D instance caches\n\n\t\t\tthis.cache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\n\t\t}\n\n\t\t_markDefs() {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.extensions && nodeDef.extensions[ this.name ] && nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_loadLight( lightIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst cacheKey = 'light:' + lightIndex;\n\t\t\tlet dependency = parser.cache.get( cacheKey );\n\t\t\tif ( dependency ) return dependency;\n\t\t\tconst json = parser.json;\n\t\t\tconst extensions = json.extensions && json.extensions[ this.name ] || {};\n\t\t\tconst lightDefs = extensions.lights || [];\n\t\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\t\tlet lightNode;\n\t\t\tconst color = new THREE.Color( 0xffffff );\n\t\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\t\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\t\tswitch ( lightDef.type ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlightNode = new THREE.DirectionalLight( color );\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlightNode = new THREE.PointLight( color );\n\t\t\t\t\tlightNode.distance = range;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlightNode = new THREE.SpotLight( color );\n\t\t\t\t\tlightNode.distance = range; // Handle spotlight properties.\n\n\t\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t\t} // Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t\t// here, because node-level parsing will only override position if explicitly specified.\n\n\n\t\t\tlightNode.position.set( 0, 0, 0 );\n\t\t\tlightNode.decay = 2;\n\t\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\t\t\tlightNode.name = parser.createUniqueName( lightDef.name || 'light_' + lightIndex );\n\t\t\tdependency = Promise.resolve( lightNode );\n\t\t\tparser.cache.add( cacheKey, dependency );\n\t\t\treturn dependency;\n\n\t\t}\n\n\t\tcreateNodeAttachment( nodeIndex ) {\n\n\t\t\tconst self = this;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tconst lightDef = nodeDef.extensions && nodeDef.extensions[ this.name ] || {};\n\t\t\tconst lightIndex = lightDef.light;\n\t\t\tif ( lightIndex === undefined ) return null;\n\t\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\n\n\n\tclass GLTFMaterialsUnlitExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshBasicMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pending = [];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\t\tif ( metallicRoughness ) {\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\n\n\n\tclass GLTFMaterialsClearcoatExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale; // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\n\t\t\t\t\tmaterialParams.clearcoatNormalScale = new THREE.Vector2( scale, - scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\n\n\n\tclass GLTFMaterialsTransmissionExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t\t}\n\n\t\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\n\n\n\tclass GLTFMaterialsVolumeExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || 0;\n\t\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.attenuationTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\n\n\n\tclass GLTFMaterialsIorExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t}\n\t/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\n\n\n\tclass GLTFMaterialsSpecularExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t\t}\n\n\t\tgetMaterialType( materialIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\t\t\treturn THREE.MeshPhysicalMaterial;\n\n\t\t}\n\n\t\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn Promise.resolve();\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\t\t\tconst extension = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t\t}\n\n\t\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\t\tmaterialParams.specularTint = new THREE.Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularTintMap', extension.specularColorTexture ).then( function ( texture ) {\n\n\t\t\t\t\ttexture.encoding = THREE.sRGBEncoding;\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t}\n\t/**\n * BasisU THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\n\n\n\tclass GLTFTextureBasisUExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ this.name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tconst loader = parser.options.ktx2Loader;\n\n\t\t\tif ( ! loader ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t}\n\t/**\n * WebP THREE.Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\n\n\n\tclass GLTFTextureWebPExtension {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.parser = parser;\n\t\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\t\tthis.isSupported = null;\n\n\t\t}\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst name = this.name;\n\t\t\tconst parser = this.parser;\n\t\t\tconst json = parser.json;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst extension = textureDef.extensions[ name ];\n\t\t\tconst source = json.images[ extension.source ];\n\t\t\tlet loader = parser.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, source, loader );\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t\t} // Fall back to PNG or JPEG.\n\n\n\t\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tdetectSupport() {\n\n\t\t\tif ( ! this.isSupported ) {\n\n\t\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\t\tconst image = new Image(); // Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t\t// WebP images, unfortunately.\n\n\t\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn this.isSupported;\n\n\t\t}\n\n\t}\n\t/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\n\n\n\tclass GLTFMeshoptCompression {\n\n\t\tconstructor( parser ) {\n\n\t\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\t\tthis.parser = parser;\n\n\t\t}\n\n\t\tloadBufferView( index ) {\n\n\t\t\tconst json = this.parser.json;\n\t\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\t\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( [ buffer, decoder.ready ] ).then( function ( res ) {\n\n\t\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\t\t\t\t\tconst count = extensionDef.count;\n\t\t\t\t\tconst stride = extensionDef.byteStride;\n\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\tconst source = new Uint8Array( res[ 0 ], byteOffset, byteLength );\n\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\treturn result;\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/* BINARY EXTENSION */\n\n\n\tconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tconst BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tconst BINARY_EXTENSION_CHUNK_TYPES = {\n\t\tJSON: 0x4E4F534A,\n\t\tBIN: 0x004E4942\n\t};\n\n\tclass GLTFBinaryExtension {\n\n\t\tconstructor( data ) {\n\n\t\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\t\tthis.content = null;\n\t\t\tthis.body = null;\n\t\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tthis.header = {\n\t\t\t\tmagic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\t\tlength: headerView.getUint32( 8, true )\n\t\t\t};\n\n\t\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t\t}\n\n\t\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\t\tlet chunkIndex = 0;\n\n\t\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\t\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\t\tchunkIndex += 4;\n\n\t\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\t\tthis.content = THREE.LoaderUtils.decodeText( contentArray );\n\n\t\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t\t} // Clients must ignore chunks with unknown types.\n\n\n\t\t\t\tchunkIndex += chunkLength;\n\n\t\t\t}\n\n\t\t\tif ( this.content === null ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * DRACO THREE.Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\n\n\n\tclass GLTFDracoMeshCompressionExtension {\n\n\t\tconstructor( json, dracoLoader ) {\n\n\t\t\tif ( ! dracoLoader ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t\t}\n\n\t\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\t\tthis.json = json;\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\tthis.dracoLoader.preload();\n\n\t\t}\n\n\t\tdecodePrimitive( primitive, parser ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst dracoLoader = this.dracoLoader;\n\t\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\t\tconst threeAttributeMap = {};\n\t\t\tconst attributeNormalizedMap = {};\n\t\t\tconst attributeTypeMap = {};\n\n\t\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\t\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t\t}\n\n\t\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\t\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\n\n\n\tclass GLTFTextureTransformExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t\t}\n\n\t\textendTexture( texture, transform ) {\n\n\t\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\t\treturn texture;\n\n\t\t\t}\n\n\t\t\ttexture = texture.clone();\n\n\t\t\tif ( transform.offset !== undefined ) {\n\n\t\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t\t}\n\n\t\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\t\ttexture.rotation = transform.rotation;\n\n\t\t\t}\n\n\t\t\tif ( transform.scale !== undefined ) {\n\n\t\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\t\t\treturn texture;\n\n\t\t}\n\n\t}\n\t/**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\n\n\t/**\n * A sub class of StandardMaterial with some of the functionality\n * changed via the `onBeforeCompile` callback\n * @pailhead\n */\n\n\n\tclass GLTFMeshStandardSGMaterial extends THREE.MeshStandardMaterial {\n\n\t\tconstructor( params ) {\n\n\t\t\tsuper();\n\t\t\tthis.isGLTFSpecularGlossinessMaterial = true; //various chunks that need replacing\n\n\t\t\tconst specularMapParsFragmentChunk = [ '#ifdef USE_SPECULARMAP', '\tuniform sampler2D specularMap;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapParsFragmentChunk = [ '#ifdef USE_GLOSSINESSMAP', '\tuniform sampler2D glossinessMap;', '#endif' ].join( '\\n' );\n\t\t\tconst specularMapFragmentChunk = [ 'vec3 specularFactor = specular;', '#ifdef USE_SPECULARMAP', '\tvec4 texelSpecular = texture2D( specularMap, vUv );', '\ttexelSpecular = sRGBToLinear( texelSpecular );', '\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tspecularFactor *= texelSpecular.rgb;', '#endif' ].join( '\\n' );\n\t\t\tconst glossinessMapFragmentChunk = [ 'float glossinessFactor = glossiness;', '#ifdef USE_GLOSSINESSMAP', '\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );', '\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture', '\tglossinessFactor *= texelGlossiness.a;', '#endif' ].join( '\\n' );\n\t\t\tconst lightPhysicalFragmentChunk = [ 'PhysicalMaterial material;', 'material.diffuseColor = diffuseColor.rgb * ( 1. - max( specularFactor.r, max( specularFactor.g, specularFactor.b ) ) );', 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );', 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );', 'material.roughness = max( 1.0 - glossinessFactor, 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.', 'material.roughness += geometryRoughness;', 'material.roughness = min( material.roughness, 1.0 );', 'material.specularColor = specularFactor;' ].join( '\\n' );\n\t\t\tconst uniforms = {\n\t\t\t\tspecular: {\n\t\t\t\t\tvalue: new THREE.Color().setHex( 0xffffff )\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tvalue: 1\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tvalue: null\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis._extraUniforms = uniforms;\n\n\t\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\t\tfor ( const uniformName in uniforms ) {\n\n\t\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t\t}\n\n\t\t\t\tshader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' ).replace( 'uniform float metalness;', 'uniform float glossiness;' ).replace( '#include <roughnessmap_pars_fragment>', specularMapParsFragmentChunk ).replace( '#include <metalnessmap_pars_fragment>', glossinessMapParsFragmentChunk ).replace( '#include <roughnessmap_fragment>', specularMapFragmentChunk ).replace( '#include <metalnessmap_fragment>', glossinessMapFragmentChunk ).replace( '#include <lights_physical_fragment>', lightPhysicalFragmentChunk );\n\n\t\t\t};\n\n\t\t\tObject.defineProperties( this, {\n\t\t\t\tspecular: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specular.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specular.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.specularMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.specularMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_SPECULARMAP = ''; // USE_UV is set by the renderer for specular maps\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_SPECULARMAP;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossiness.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossiness.value = v;\n\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn uniforms.glossinessMap.value;\n\n\t\t\t\t\t},\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossinessMap.value = v;\n\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\t\tthis.defines.USE_UV = '';\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\t\t\t\t\t\t\tdelete this.defines.USE_UV;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\tthis.setValues( params );\n\n\t\t}\n\n\t\tcopy( source ) {\n\n\t\t\tsuper.copy( source );\n\t\t\tthis.specularMap = source.specularMap;\n\t\t\tthis.specular.copy( source.specular );\n\t\t\tthis.glossinessMap = source.glossinessMap;\n\t\t\tthis.glossiness = source.glossiness;\n\t\t\tdelete this.metalness;\n\t\t\tdelete this.roughness;\n\t\t\tdelete this.metalnessMap;\n\t\t\tdelete this.roughnessMap;\n\t\t\treturn this;\n\n\t\t}\n\n\t}\n\n\tclass GLTFMaterialsPbrSpecularGlossinessExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n\t\t\tthis.specularGlossinessParams = [ 'color', 'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity', 'emissive', 'emissiveIntensity', 'emissiveMap', 'bumpMap', 'bumpScale', 'normalMap', 'normalMapType', 'displacementMap', 'displacementScale', 'displacementBias', 'specularMap', 'specular', 'glossinessMap', 'glossiness', 'alphaMap', 'envMap', 'envMapIntensity', 'refractionRatio' ];\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn GLTFMeshStandardSGMaterial;\n\n\t\t}\n\n\t\textendParams( materialParams, materialDef, parser ) {\n\n\t\t\tconst pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\t\t\tconst pending = [];\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\tconst array = pbrSpecularGlossiness.diffuseFactor;\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 );\n\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\tmaterialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 );\n\n\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t}\n\n\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\tconst specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\n\t\tcreateMaterial( materialParams ) {\n\n\t\t\tconst material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\t\tmaterial.fog = true;\n\t\t\tmaterial.color = materialParams.color;\n\t\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\t\t\tmaterial.lightMap = null;\n\t\t\tmaterial.lightMapIntensity = 1.0;\n\t\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\t\tmaterial.aoMapIntensity = 1.0;\n\t\t\tmaterial.emissive = materialParams.emissive;\n\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\t\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\t\tmaterial.bumpScale = 1;\n\t\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\t\tmaterial.normalMapType = THREE.TangentSpaceNormalMap;\n\t\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\t\t\tmaterial.displacementMap = null;\n\t\t\tmaterial.displacementScale = 1;\n\t\t\tmaterial.displacementBias = 0;\n\t\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\t\tmaterial.specular = materialParams.specular;\n\t\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\t\tmaterial.glossiness = materialParams.glossiness;\n\t\t\tmaterial.alphaMap = null;\n\t\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\t\tmaterial.envMapIntensity = 1.0;\n\t\t\tmaterial.refractionRatio = 0.98;\n\t\t\treturn material;\n\n\t\t}\n\n\t}\n\t/**\n * THREE.Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\n\n\n\tclass GLTFMeshQuantizationExtension {\n\n\t\tconstructor() {\n\n\t\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERPOLATION ********/\n\n\t/*********************************/\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\n\n\tclass GLTFCubicSplineInterpolant extends THREE.Interpolant {\n\n\t\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\t}\n\n\t\tcopySampleValue_( index ) {\n\n\t\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\t\t\tconst result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tvalueSize = this.valueSize,\n\t\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\t\tconst td = t1 - t0;\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p; // Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tconst _q = new THREE.Quaternion();\n\n\tclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\t\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\t/*********************************/\n\n\t/********** INTERNALS ************/\n\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\n\tconst WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\tconst WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\tconst WEBGL_FILTERS = {\n\t\t9728: THREE.NearestFilter,\n\t\t9729: THREE.LinearFilter,\n\t\t9984: THREE.NearestMipmapNearestFilter,\n\t\t9985: THREE.LinearMipmapNearestFilter,\n\t\t9986: THREE.NearestMipmapLinearFilter,\n\t\t9987: THREE.LinearMipmapLinearFilter\n\t};\n\tconst WEBGL_WRAPPINGS = {\n\t\t33071: THREE.ClampToEdgeWrapping,\n\t\t33648: THREE.MirroredRepeatWrapping,\n\t\t10497: THREE.RepeatWrapping\n\t};\n\tconst WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\tconst ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex'\n\t};\n\tconst PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\tconst INTERPOLATION = {\n\t\tCUBICSPLINE: undefined,\n\t\t// We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t// keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: THREE.InterpolateLinear,\n\t\tSTEP: THREE.InterpolateDiscrete\n\t};\n\tconst ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\t/* UTILITY FUNCTIONS */\n\n\tfunction resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return ''; // Host Relative URL\n\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t} // Absolute URL http://,https://,//\n\n\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url; // Data URI\n\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url; // Blob URL\n\n\t\tif ( /^blob:.*$/i.test( url ) ) return url; // Relative URL\n\n\t\treturn path + url;\n\n\t}\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\n\n\n\tfunction createDefaultMaterial( cache ) {\n\n\t\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\t\tcache[ 'DefaultMaterial' ] = new THREE.MeshStandardMaterial( {\n\t\t\t\tcolor: 0xFFFFFF,\n\t\t\t\temissive: 0x000000,\n\t\t\t\tmetalness: 1,\n\t\t\t\troughness: 1,\n\t\t\t\ttransparent: false,\n\t\t\t\tdepthTest: true,\n\t\t\t\tside: THREE.FrontSide\n\t\t\t} );\n\n\t\t}\n\n\t\treturn cache[ 'DefaultMaterial' ];\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\t\tfor ( const name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\n\n\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\t/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tlet hasMorphPosition = false;\n\t\tlet hasMorphNormal = false;\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\t\tconst pendingPositionAccessors = [];\n\t\tconst pendingNormalAccessors = [];\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tconst pendingAccessor = target.POSITION !== undefined ? parser.getDependency( 'accessor', target.POSITION ) : geometry.attributes.position;\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tconst pendingAccessor = target.NORMAL !== undefined ? parser.getDependency( 'accessor', target.NORMAL ) : geometry.attributes.normal;\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [ Promise.all( pendingPositionAccessors ), Promise.all( pendingNormalAccessors ) ] ).then( function ( accessors ) {\n\n\t\t\tconst morphPositions = accessors[ 0 ];\n\t\t\tconst morphNormals = accessors[ 1 ];\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\t\tgeometry.morphTargetsRelative = true;\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\n\n\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t} // .extras has user-defined data, so check that .extras.targetNames is an array.\n\n\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tlet geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView + ':' + dracoExtension.indices + ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tlet attributesKey = '';\n\t\tconst keys = Object.keys( attributes ).sort();\n\n\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\tfunction getNormalizedComponentScale( constructor ) {\n\n\t\t// Reference:\n\t\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\t\tswitch ( constructor ) {\n\n\t\t\tcase Int8Array:\n\t\t\t\treturn 1 / 127;\n\n\t\t\tcase Uint8Array:\n\t\t\t\treturn 1 / 255;\n\n\t\t\tcase Int16Array:\n\t\t\t\treturn 1 / 32767;\n\n\t\t\tcase Uint16Array:\n\t\t\t\treturn 1 / 65535;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t\t}\n\n\t}\n\t/* GLTF PARSER */\n\n\n\tclass GLTFParser {\n\n\t\tconstructor( json = {}, options = {} ) {\n\n\t\t\tthis.json = json;\n\t\t\tthis.extensions = {};\n\t\t\tthis.plugins = {};\n\t\t\tthis.options = options; // loader object cache\n\n\t\t\tthis.cache = new GLTFRegistry(); // associations between Three.js objects and glTF elements\n\n\t\t\tthis.associations = new Map(); // THREE.BufferGeometry caching\n\n\t\t\tthis.primitiveCache = {}; // THREE.Object3D instance caches\n\n\t\t\tthis.meshCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.cameraCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.lightCache = {\n\t\t\t\trefs: {},\n\t\t\t\tuses: {}\n\t\t\t};\n\t\t\tthis.textureCache = {}; // Track node names, to ensure no duplicates\n\n\t\t\tthis.nodeNamesUsed = {}; // Use an THREE.ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\t\tif ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) {\n\n\t\t\t\tthis.textureLoader = new THREE.ImageBitmapLoader( this.options.manager );\n\n\t\t\t} else {\n\n\t\t\t\tthis.textureLoader = new THREE.TextureLoader( this.options.manager );\n\n\t\t\t}\n\n\t\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\t\t\tthis.fileLoader = new THREE.FileLoader( this.options.manager );\n\t\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetExtensions( extensions ) {\n\n\t\t\tthis.extensions = extensions;\n\n\t\t}\n\n\t\tsetPlugins( plugins ) {\n\n\t\t\tthis.plugins = plugins;\n\n\t\t}\n\n\t\tparse( onLoad, onError ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions; // Clear the loader cache\n\n\t\t\tthis.cache.removeAll(); // Mark the special nodes/meshes in json for efficient parse\n\n\t\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t\t} );\n\n\t\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\treturn Promise.all( [ parser.getDependencies( 'scene' ), parser.getDependencies( 'animation' ), parser.getDependencies( 'camera' ) ] );\n\n\t\t\t} ).then( function ( dependencies ) {\n\n\t\t\t\tconst result = {\n\t\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\t\tasset: json.asset,\n\t\t\t\t\tparser: parser,\n\t\t\t\t\tuserData: {}\n\t\t\t\t};\n\t\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\t\t\t\tassignExtrasToUserData( result, json );\n\t\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t\t} ) ).then( function () {\n\n\t\t\t\t\tonLoad( result );\n\n\t\t\t\t} );\n\n\t\t\t} ).catch( onError );\n\n\t\t}\n\t\t/**\n   * Marks the special nodes/meshes in json for efficient parse.\n   */\n\n\n\t\t_markDefs() {\n\n\t\t\tconst nodeDefs = this.json.nodes || [];\n\t\t\tconst skinDefs = this.json.skins || [];\n\t\t\tconst meshDefs = this.json.meshes || []; // Nothing in the node definition indicates whether it is a THREE.Bone or an\n\t\t\t// THREE.Object3D. Use the skins' joint references to mark bones.\n\n\t\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t\t}\n\n\t\t\t} // Iterate over all nodes, marking references to shared resources,\n\t\t\t// as well as skeleton joints.\n\n\n\t\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh ); // Nothing in the mesh definition indicates whether it is\n\t\t\t\t\t// a THREE.SkinnedMesh or THREE.Mesh. Use the node's mesh reference\n\t\t\t\t\t// to mark THREE.SkinnedMesh if node has skin.\n\n\n\t\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\t\t/**\n   * Counts references to shared node / THREE.Object3D resources. These resources\n   * can be reused, or \"instantiated\", at multiple nodes in the scene\n   * hierarchy. THREE.Mesh, Camera, and Light instances are instantiated and must\n   * be marked. Non-scenegraph resources (like Materials, Geometries, and\n   * Textures) can be reused directly and are not marked here.\n   *\n   * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n   */\n\n\n\t\t_addNodeRef( cache, index ) {\n\n\t\t\tif ( index === undefined ) return;\n\n\t\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t\t}\n\n\t\t\tcache.refs[ index ] ++;\n\n\t\t}\n\t\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\n\n\t\t_getNodeRef( cache, index, object ) {\n\n\t\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\t\t\tconst ref = object.clone();\n\t\t\tref.name += '_instance_' + cache.uses[ index ] ++;\n\t\t\treturn ref;\n\n\t\t}\n\n\t\t_invokeOne( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.push( this );\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) return result;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_invokeAll( func ) {\n\n\t\t\tconst extensions = Object.values( this.plugins );\n\t\t\textensions.unshift( this );\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\t\tconst result = func( extensions[ i ] );\n\t\t\t\tif ( result ) pending.push( result );\n\n\t\t\t}\n\n\t\t\treturn pending;\n\n\t\t}\n\t\t/**\n   * Requests the specified dependency asynchronously, with caching.\n   * @param {string} type\n   * @param {number} index\n   * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n   */\n\n\n\t\tgetDependency( type, index ) {\n\n\t\t\tconst cacheKey = type + ':' + index;\n\t\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\t\tif ( ! dependency ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'scene':\n\t\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mesh':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'accessor':\n\t\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bufferView':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'buffer':\n\t\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'material':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skin':\n\t\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'animation':\n\t\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'camera':\n\t\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t\t}\n\n\t\t\treturn dependency;\n\n\t\t}\n\t\t/**\n   * Requests all dependencies of the specified type asynchronously, with caching.\n   * @param {string} type\n   * @return {Promise<Array<Object>>}\n   */\n\n\n\t\tgetDependencies( type ) {\n\n\t\t\tlet dependencies = this.cache.get( type );\n\n\t\t\tif ( ! dependencies ) {\n\n\t\t\t\tconst parser = this;\n\t\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\t\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t\t} ) );\n\t\t\t\tthis.cache.add( type, dependencies );\n\n\t\t\t}\n\n\t\t\treturn dependencies;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBuffer( bufferIndex ) {\n\n\t\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\t\tconst loader = this.fileLoader;\n\n\t\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t\t} // If present, GLB container is required to be the first buffer.\n\n\n\t\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t\t}\n\n\t\t\tconst options = this.options;\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tloader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n   * @param {number} bufferViewIndex\n   * @return {Promise<ArrayBuffer>}\n   */\n\n\n\t\tloadBufferView( bufferViewIndex ) {\n\n\t\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\t\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n   * @param {number} accessorIndex\n   * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n   */\n\n\n\t\tloadAccessor( accessorIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t\t// compression extension).\n\t\t\t\treturn Promise.resolve( null );\n\n\t\t\t}\n\n\t\t\tconst pendingBufferViews = [];\n\n\t\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t\t} else {\n\n\t\t\t\tpendingBufferViews.push( null );\n\n\t\t\t}\n\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\t\tconst bufferView = bufferViews[ 0 ];\n\t\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ]; // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\n\t\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\t\tlet array, bufferAttribute; // The buffer is not interleaved if the stride is the item size in bytes.\n\n\t\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own THREE.InterleavedBuffer\n\t\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes ); // Integer parameters to IB/IBA are in array elements, not bytes.\n\n\t\t\t\t\t\tib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );\n\t\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset % byteStride / elementBytes, normalized );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized );\n\n\t\t\t\t} // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\n\n\t\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\t\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\t\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\t\tbufferAttribute = new THREE.BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst index = sparseIndices[ i ];\n\t\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse THREE.BufferAttribute.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn bufferAttribute;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n   * @param {number} textureIndex\n   * @return {Promise<THREE.Texture>}\n   */\n\n\n\t\tloadTexture( textureIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst source = json.images[ textureDef.source ];\n\t\t\tlet loader = this.textureLoader;\n\n\t\t\tif ( source.uri ) {\n\n\t\t\t\tconst handler = options.manager.getHandler( source.uri );\n\t\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t\t}\n\n\t\t\treturn this.loadTextureImage( textureIndex, source, loader );\n\n\t\t}\n\n\t\tloadTextureImage( textureIndex, source, loader ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst options = this.options;\n\t\t\tconst textureDef = json.textures[ textureIndex ];\n\t\t\tconst cacheKey = ( source.uri || source.bufferView ) + ':' + textureDef.sampler;\n\n\t\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t\t}\n\n\t\t\tconst URL = self.URL || self.webkitURL;\n\t\t\tlet sourceURI = source.uri || '';\n\t\t\tlet isObjectURL = false;\n\t\t\tlet hasAlpha = true;\n\t\t\tconst isJPEG = sourceURI.search( /\\.jpe?g($|\\?)/i ) > 0 || sourceURI.search( /^data\\:image\\/jpeg/ ) === 0;\n\t\t\tif ( source.mimeType === 'image/jpeg' || isJPEG ) hasAlpha = false;\n\n\t\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t\t// Load binary image data from bufferView, if provided.\n\t\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\t\tif ( source.mimeType === 'image/png' ) {\n\n\t\t\t\t\t\t// Inspect the PNG 'IHDR' chunk to determine whether the image could have an\n\t\t\t\t\t\t// alpha channel. This check is conservative — the image could have an alpha\n\t\t\t\t\t\t// channel with all values == 1, and the indexed type (colorType == 3) only\n\t\t\t\t\t\t// sometimes contains alpha.\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n\t\t\t\t\t\tconst colorType = new DataView( bufferView, 25, 1 ).getUint8( 0, false );\n\t\t\t\t\t\thasAlpha = colorType === 6 || colorType === 4 || colorType === 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisObjectURL = true;\n\t\t\t\t\tconst blob = new Blob( [ bufferView ], {\n\t\t\t\t\t\ttype: source.mimeType\n\t\t\t\t\t} );\n\t\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\t\treturn sourceURI;\n\n\t\t\t\t} );\n\n\t\t\t} else if ( source.uri === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + textureIndex + ' is missing URI and bufferView' );\n\n\t\t\t}\n\n\t\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\t\tconst texture = new THREE.Texture( imageBitmap );\n\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tloader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( texture ) {\n\n\t\t\t\t// Clean up resources and configure THREE.Texture.\n\t\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.flipY = false;\n\t\t\t\tif ( textureDef.name ) texture.name = textureDef.name; // When there is definitely no alpha channel in the texture, set THREE.RGBFormat to save space.\n\n\t\t\t\tif ( ! hasAlpha ) texture.format = THREE.RGBFormat;\n\t\t\t\tconst samplers = json.samplers || {};\n\t\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\t\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;\n\t\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipmapLinearFilter;\n\t\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;\n\t\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;\n\t\t\t\tparser.associations.set( texture, {\n\t\t\t\t\ttype: 'textures',\n\t\t\t\t\tindex: textureIndex\n\t\t\t\t} );\n\t\t\t\treturn texture;\n\n\t\t\t} ).catch( function () {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\t\treturn null;\n\n\t\t\t} );\n\t\t\tthis.textureCache[ cacheKey ] = promise;\n\t\t\treturn promise;\n\n\t\t}\n\t\t/**\n   * Asynchronously assigns a texture to the given material parameters.\n   * @param {Object} materialParams\n   * @param {string} mapName\n   * @param {Object} mapDef\n   * @return {Promise<Texture>}\n   */\n\n\n\t\tassignTexture( materialParams, mapName, mapDef ) {\n\n\t\t\tconst parser = this;\n\t\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\t\tif ( transform ) {\n\n\t\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams[ mapName ] = texture;\n\t\t\t\treturn texture;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Assigns final material to a THREE.Mesh, THREE.Line, or THREE.Points instance. The instance\n   * already has a material (generated from the glTF material options alone)\n   * but reuse of the same glTF material may require multiple threejs materials\n   * to accommodate different primitive types, defines, etc. New materials will\n   * be created if necessary, and reused from a cache.\n   * @param  {Object3D} mesh THREE.Mesh, THREE.Line, or THREE.Points instance.\n   */\n\n\n\t\tassignFinalMaterial( mesh ) {\n\n\t\t\tconst geometry = mesh.geometry;\n\t\t\tlet material = mesh.material;\n\t\t\tconst useVertexTangents = geometry.attributes.tangent !== undefined;\n\t\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\t\tif ( mesh.isPoints ) {\n\n\t\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\t\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\t\tpointsMaterial = new THREE.PointsMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( pointsMaterial, material );\n\t\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = pointsMaterial;\n\n\t\t\t} else if ( mesh.isLine ) {\n\n\t\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\t\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\t\tlineMaterial = new THREE.LineBasicMaterial();\n\t\t\t\t\tTHREE.Material.prototype.copy.call( lineMaterial, material );\n\t\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = lineMaterial;\n\n\t\t\t} // Clone the material if it will be modified\n\n\n\t\t\tif ( useVertexTangents || useVertexColors || useFlatShading ) {\n\n\t\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\t\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\t\tif ( useVertexTangents ) cacheKey += 'vertex-tangents:';\n\t\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\t\tcachedMaterial = material.clone();\n\t\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\t\tif ( useVertexTangents ) {\n\n\t\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\t\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = cachedMaterial;\n\n\t\t\t} // workarounds for mesh and geometry\n\n\n\t\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t\t}\n\n\t\t\tmesh.material = material;\n\n\t\t}\n\n\t\tgetMaterialType() {\n\n\t\t\treturn THREE.MeshStandardMaterial;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n   * @param {number} materialIndex\n   * @return {Promise<Material>}\n   */\n\n\n\t\tloadMaterial( materialIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst materialDef = json.materials[ materialIndex ];\n\t\t\tlet materialType;\n\t\t\tconst materialParams = {};\n\t\t\tconst materialExtensions = materialDef.extensions || {};\n\t\t\tconst pending = [];\n\n\t\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\t\tconst sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t\t} else {\n\n\t\t\t\t// Specification:\n\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\t\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\t\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t\t} );\n\t\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t\t} ) ) );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\t\tmaterialParams.side = THREE.DoubleSide;\n\n\t\t\t}\n\n\t\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\t\tmaterialParams.transparent = true; // See: https://github.com/mrdoob/three.js/issues/17706\n\n\t\t\t\tmaterialParams.depthWrite = false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterialParams.format = THREE.RGBFormat;\n\t\t\t\tmaterialParams.transparent = false;\n\n\t\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) ); // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\n\t\t\t\tmaterialParams.normalScale = new THREE.Vector2( 1, - 1 );\n\n\t\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\t\tmaterialParams.normalScale.set( materialDef.normalTexture.scale, - materialDef.normalTexture.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tmaterialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\tlet material;\n\n\t\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t\t}\n\n\t\t\t\tif ( materialDef.name ) material.name = materialDef.name; // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\n\t\t\t\tif ( material.map ) material.map.encoding = THREE.sRGBEncoding;\n\t\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\t\tassignExtrasToUserData( material, materialDef );\n\t\t\t\tparser.associations.set( material, {\n\t\t\t\t\ttype: 'materials',\n\t\t\t\t\tindex: materialIndex\n\t\t\t\t} );\n\t\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\t\t\t\treturn material;\n\n\t\t\t} );\n\n\t\t}\n\t\t/** When THREE.Object3D instances are targeted by animation, they need unique names. */\n\n\n\t\tcreateUniqueName( originalName ) {\n\n\t\t\tconst sanitizedName = THREE.PropertyBinding.sanitizeNodeName( originalName || '' );\n\t\t\tlet name = sanitizedName;\n\n\t\t\tfor ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\t\tname = sanitizedName + '_' + i;\n\n\t\t\t}\n\n\t\t\tthis.nodeNamesUsed[ name ] = true;\n\t\t\treturn name;\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n   *\n   * Creates BufferGeometries from primitives.\n   *\n   * @param {Array<GLTF.Primitive>} primitives\n   * @return {Promise<Array<BufferGeometry>>}\n   */\n\n\n\t\tloadGeometries( primitives ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst cache = this.primitiveCache;\n\n\t\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ].decodePrimitive( primitive, parser ).then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst primitive = primitives[ i ];\n\t\t\t\tconst cacheKey = createPrimitiveKey( primitive ); // See if we've already created this geometry\n\n\t\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\t\tif ( cached ) {\n\n\t\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\t\tpending.push( cached.promise );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet geometryPromise;\n\n\t\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser );\n\n\t\t\t\t\t} // Cache this geometry\n\n\n\t\t\t\t\tcache[ cacheKey ] = {\n\t\t\t\t\t\tprimitive: primitive,\n\t\t\t\t\t\tpromise: geometryPromise\n\t\t\t\t\t};\n\t\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n   * @param {number} meshIndex\n   * @return {Promise<Group|Mesh|SkinnedMesh>}\n   */\n\n\n\t\tloadMesh( meshIndex ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\t\tconst primitives = meshDef.primitives;\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\t\tconst material = primitives[ i ].material === undefined ? createDefaultMaterial( this.cache ) : this.getDependency( 'material', primitives[ i ].material );\n\t\t\t\tpending.push( material );\n\n\t\t\t}\n\n\t\t\tpending.push( parser.loadGeometries( primitives ) );\n\t\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\t\tconst geometries = results[ results.length - 1 ];\n\t\t\t\tconst meshes = [];\n\n\t\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\t\tconst primitive = primitives[ i ]; // 1. create THREE.Mesh\n\n\t\t\t\t\tlet mesh;\n\t\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP || primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN || primitive.mode === undefined ) {\n\n\t\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true ? new THREE.SkinnedMesh( geometry, material ) : new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleStripDrawMode );\n\n\t\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, THREE.TriangleFanDrawMode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\t\tmesh = new THREE.Line( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineLoop( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( geometry, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || 'mesh_' + meshIndex );\n\t\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\t\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\t\t\t\t\tparser.assignFinalMaterial( mesh );\n\t\t\t\t\tmeshes.push( mesh );\n\n\t\t\t\t}\n\n\t\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst group = new THREE.Group();\n\n\t\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn group;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n   * @param {number} cameraIndex\n   * @return {Promise<THREE.Camera>}\n   */\n\n\n\t\tloadCamera( cameraIndex ) {\n\n\t\t\tlet camera;\n\t\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\t\tif ( ! params ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\t\tcamera = new THREE.PerspectiveCamera( THREE.MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\t\tcamera = new THREE.OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t\t}\n\n\t\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\t\t\tassignExtrasToUserData( camera, cameraDef );\n\t\t\treturn Promise.resolve( camera );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n   * @param {number} skinIndex\n   * @return {Promise<Object>}\n   */\n\n\n\t\tloadSkin( skinIndex ) {\n\n\t\t\tconst skinDef = this.json.skins[ skinIndex ];\n\t\t\tconst skinEntry = {\n\t\t\t\tjoints: skinDef.joints\n\t\t\t};\n\n\t\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t\t}\n\n\t\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\t\tskinEntry.inverseBindMatrices = accessor;\n\t\t\t\treturn skinEntry;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n   * @param {number} animationIndex\n   * @return {Promise<AnimationClip>}\n   */\n\n\n\t\tloadAnimation( animationIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst animationDef = json.animations[ animationIndex ];\n\t\t\tconst pendingNodes = [];\n\t\t\tconst pendingInputAccessors = [];\n\t\t\tconst pendingOutputAccessors = [];\n\t\t\tconst pendingSamplers = [];\n\t\t\tconst pendingTargets = [];\n\n\t\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\t\tconst target = channel.target;\n\t\t\t\tconst name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\n\t\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\t\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\t\tpendingSamplers.push( sampler );\n\t\t\t\tpendingTargets.push( target );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( [ Promise.all( pendingNodes ), Promise.all( pendingInputAccessors ), Promise.all( pendingOutputAccessors ), Promise.all( pendingSamplers ), Promise.all( pendingTargets ) ] ).then( function ( dependencies ) {\n\n\t\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\t\tconst targets = dependencies[ 4 ];\n\t\t\t\tconst tracks = [];\n\n\t\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst node = nodes[ i ];\n\t\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\t\tconst target = targets[ i ];\n\t\t\t\t\tif ( node === undefined ) continue;\n\t\t\t\t\tnode.updateMatrix();\n\t\t\t\t\tnode.matrixAutoUpdate = true;\n\t\t\t\t\tlet TypedKeyframeTrack;\n\n\t\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.NumberKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.QuaternionKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tTypedKeyframeTrack = THREE.VectorKeyframeTrack;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\t\t\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;\n\t\t\t\t\tconst targetNames = [];\n\n\t\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t\t// Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh.\n\t\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet outputArray = outputAccessor.array;\n\n\t\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\t\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst track = new TypedKeyframeTrack( targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ], inputAccessor.array, outputArray, interpolation ); // Override interpolation with custom factory method.\n\n\t\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\t\t\t\t\t\t\t\tconst interpolantType = this instanceof THREE.QuaternionKeyframeTrack ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\t\t\t\t\t\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t\t}; // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\n\n\t\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\t\t\t\treturn new THREE.AnimationClip( name, undefined, tracks );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tcreateNodeMesh( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\t\tif ( nodeDef.mesh === undefined ) return null;\n\t\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh ); // if weights are provided on the node, override weights on the mesh.\n\n\n\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n   * @param {number} nodeIndex\n   * @return {Promise<Object3D>}\n   */\n\n\n\t\tloadNode( nodeIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst parser = this;\n\t\t\tconst nodeDef = json.nodes[ nodeIndex ]; // reserve node's name before its dependencies, so the root has the intended name.\n\n\t\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\t\t\treturn function () {\n\n\t\t\t\tconst pending = [];\n\n\t\t\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( meshPromise ) {\n\n\t\t\t\t\tpending.push( meshPromise );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t\t} ) );\n\n\t\t\t\t}\n\n\t\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\t\tpending.push( promise );\n\n\t\t\t\t} );\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t}().then( function ( objects ) {\n\n\t\t\t\tlet node; // .isBone isn't in glTF spec. See ._markDefs\n\n\t\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\t\tnode = new THREE.Bone();\n\n\t\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\t\tnode = new THREE.Group();\n\n\t\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode = new THREE.Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\t\tnode.name = nodeName;\n\n\t\t\t\t}\n\n\t\t\t\tassignExtrasToUserData( node, nodeDef );\n\t\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\t\tconst matrix = new THREE.Matrix4();\n\t\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tparser.associations.set( node, {\n\t\t\t\t\ttype: 'nodes',\n\t\t\t\t\tindex: nodeIndex\n\t\t\t\t} );\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t}\n\t\t/**\n   * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n   * @param {number} sceneIndex\n   * @return {Promise<Group>}\n   */\n\n\n\t\tloadScene( sceneIndex ) {\n\n\t\t\tconst json = this.json;\n\t\t\tconst extensions = this.extensions;\n\t\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tconst parser = this; // THREE.Loader returns THREE.Group, not Scene.\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\n\t\t\tconst scene = new THREE.Group();\n\t\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\t\t\tconst nodeIds = sceneDef.nodes || [];\n\t\t\tconst pending = [];\n\n\t\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tfunction buildNodeHierachy( nodeId, parentObject, json, parser ) {\n\n\t\tconst nodeDef = json.nodes[ nodeId ];\n\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\tif ( nodeDef.skin === undefined ) return node; // build skeleton here as well\n\n\t\t\tlet skinEntry;\n\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\tskinEntry = skin;\n\t\t\t\tconst pendingJoints = [];\n\n\t\t\t\tfor ( let i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isMesh ) return;\n\t\t\t\t\tconst bones = [];\n\t\t\t\t\tconst boneInverses = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\tbones.push( jointNode );\n\t\t\t\t\t\t\tconst mat = new THREE.Matrix4();\n\n\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t} );\n\t\t\t\treturn node;\n\n\t\t\t} );\n\n\t\t} ).then( function ( node ) {\n\n\t\t\t// build node hierachy\n\t\t\tparentObject.add( node );\n\t\t\tconst pending = [];\n\n\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\tconst children = nodeDef.children;\n\n\t\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst child = children[ i ];\n\t\t\t\t\tpending.push( buildNodeHierachy( child, node, json, parser ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\n\n\n\tfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst box = new THREE.Box3();\n\n\t\tif ( attributes.POSITION !== undefined ) {\n\n\t\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\t\t\tconst min = accessor.min;\n\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\tbox.set( new THREE.Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ), new THREE.Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) );\n\n\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst targets = primitiveDef.targets;\n\n\t\tif ( targets !== undefined ) {\n\n\t\t\tconst maxDisplacement = new THREE.Vector3();\n\t\t\tconst vector = new THREE.Vector3();\n\n\t\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\t\tconst min = accessor.min;\n\t\t\t\t\tconst max = accessor.max; // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\t\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t\t} // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\n\n\t\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\n\n\t\t\tbox.expandByVector( maxDisplacement );\n\n\t\t}\n\n\t\tgeometry.boundingBox = box;\n\t\tconst sphere = new THREE.Sphere();\n\t\tbox.getCenter( sphere.center );\n\t\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\t\tgeometry.boundingSphere = sphere;\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n\n\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tconst attributes = primitiveDef.attributes;\n\t\tconst pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfor ( const gltfAttributeName in attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase(); // Skip attributes already provided by e.g. Draco extension.\n\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\t\tcomputeBounds( geometry, primitiveDef, parser );\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry;\n\n\t\t} );\n\n\t}\n\t/**\n * @param {BufferGeometry} geometry\n * @param {Number} drawMode\n * @return {BufferGeometry}\n */\n\n\n\tfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\t\tlet index = geometry.getIndex(); // generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t} //\n\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === THREE.TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( newIndices.length / 3 !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t} // build final geometry\n\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\treturn newGeometry;\n\n\t}\n\n\tTHREE.GLTFLoader = GLTFLoader;\n\n} )();\n\n})()\n"
  },
  {
    "path": "plugins/repeat_it.js",
    "content": "(function () {\n    var repeatAction;\n    var canRotate;\n    Plugin.register(\"repeat_it\", {\n        title: \"Repeat It\",\n        author: \"Ocraftyone\",\n        icon: \"content_copy\",\n        description:\n            \"Allows you to repeat cubes with a translation applied to each new object\",\n        about: \"Allows you to repeat cubes with a translation applied to each new object.\\n\\nAt this time, the only shape that can be copied are cubes, but this may be updated in the future.\",\n        version: \"0.0.1\",\n        variant: \"both\",\n        onload () {\n            repeatAction = new Action(\"repeat_shape\", {\n                name: \"Repeat shape\",\n                description: \"Repeat shape\",\n                icon: \"content_copy\",\n                click (event) {\n                    canRotate = Format.rotate_cubes;\n                    var rotationLimit = Format.rotation_limit;\n                    var option_dialog = new Dialog({\n                        id: \"repeat_shape_dialog\",\n                        title: \"Repeat Shape\",\n                        form: {\n                            repeat: {\n                                label: \"Repeat\",\n                                type: \"number\",\n                                value: 2,\n                                description: \"Number of times to copy the cube\",\n                                min: 2,\n                            },\n                            possitionDiff: {\n                                label: \"Position difference\",\n                                type: \"vector\",\n                                value: [0, 0, 0],\n                                description: \"Possition offset between each cloned cube\",\n                            },\n                            rotationDiff: {\n                                label: \"Rotation difference\",\n                                type: \"vector\",\n                                value: [0, 0, 0],\n                                description:\n                                    \"Rotation offset between each cloned cube.\\nRotation will only apply if the model supports it. If this option is not greyed out, your model supports rotation!\",\n                                step: Format.rotation_limit ? 22.5 : 1,\n                                readonly: !canRotate,\n                            },\n                            shouldCreateGroup: {\n                                label: \"Create group\",\n                                type: \"checkbox\",\n                                value: true,\n                                description: \"Wraps the original and all new cubes into a group\",\n                            },\n                        },\n                        onConfirm (formResult) {\n                            var possitionDiff = formResult.possitionDiff;\n                            var rotationDiff = formResult.rotationDiff;\n                            var zero = [0, 0, 0];\n                            \n                            if (rotationDiff.equals(zero) && possitionDiff.equals(zero)) {\n                                Blockbench.showMessageBox({\n                                    buttons: [\"OK\", \"Cancel\"],\n                                    title: \"Error\",\n                                    message: \"There are no transforms applied to the repeated shapes!\",\n                                    confirm: 0,\n                                    cancel: 1,\n                                },\n                                (button) => {\n                                    if (button == 0) {\n                                        option_dialog.show()\n                                    }\n                                });\n                                return;\n                            }\n\n                            if (rotationLimit) {\n                                if (!rotationDiff.every((e) => e % 22.5 === 0)) {\n                                    Blockbench.showMessageBox({\n                                        buttons: [\"OK\", \"Cancel\"],\n                                        title: \"Error\",\n                                        message: \"Rotation difference is not a multiple of the rotation limit! (22.5)\",\n                                        confirm: 0,\n                                        cancel: 1,\n                                    },\n                                    (button) => {\n                                        if (button == 0) {\n                                            option_dialog.show()\n                                        }\n                                    });\n                                    return;\n                                }\n                                var nonZero = 0\n                                rotationDiff.forEach(value => value !== 0 && nonZero++)\n                                if (nonZero > 1) {\n                                    Blockbench.showMessageBox({\n                                        buttons: [\"OK\", \"Cancel\"],\n                                        title: \"Error\",\n                                        message: \"The rotation limits of this model prevent you from rotating on more that one axis at a time!\",\n                                        confirm: 0,\n                                        cancel: 1,\n                                    },\n                                    (button) => {\n                                        if (button == 0) {\n                                            option_dialog.show()\n                                        }\n                                    });\n                                    return;\n                                }\n                            }\n                            \n                            this.hide();\n                            var elementsToAdd = [];\n                            Undo.initEdit({\n                                elements: [],\n                                outliner: true,\n                                selection: true,\n                            });\n                            var shouldCreateGroup = formResult.shouldCreateGroup;\n                            Cube.selected.forEach(function (cube, i) {\n                                var group = cube.parent;\n                                if (shouldCreateGroup) {\n                                    group = new Group(\n                                        cube.name + \" group\"\n                                    ).init();\n                                    group.addTo(cube.parent);\n                                    cube.addTo(group);\n                                }\n\n                                for (var j = 1; j < formResult.repeat; j++) {\n                                    var newCubeFrom = [\n                                        cube.from[0] +\n                                            possitionDiff[0] * j,\n                                        cube.from[1] +\n                                            possitionDiff[1] * j,\n                                        cube.from[2] +\n                                            possitionDiff[2] * j,\n                                    ];\n                                    var newCubeTo = [\n                                        cube.to[0] +\n                                            possitionDiff[0] * j,\n                                        cube.to[1] +\n                                            possitionDiff[1] * j,\n                                        cube.to[2] +\n                                            possitionDiff[2] * j,\n                                    ];\n                                    if (canRotate) {\n                                        var newCubeRotation = [\n                                            cube.rotation[0] +\n                                                rotationDiff[0] * j,\n                                            cube.rotation[1] +\n                                                rotationDiff[1] * j,\n                                            cube.rotation[2] +\n                                                rotationDiff[2] * j,\n                                        ];\n                                    }\n                                    var newCube = new Cube(cube).extend({\n                                        from: newCubeFrom,\n                                        to: newCubeTo,\n                                        rotation: newCubeRotation,\n                                        name: cube.name + \"_\" + j,\n                                    }).init();\n                                    newCube.addTo(group);\n                                    elementsToAdd.push(newCube);\n                                }\n                            });\n                            Canvas.updateView({ elements: elementsToAdd, element_aspects: {transform: true} })\n                            Undo.finishEdit(\"Repeat shape\", {\n                                outliner: true,\n                                elements: elementsToAdd,\n                                selection: true,\n                            });\n                        },\n                    });\n\n                    option_dialog.show();\n                },\n            });\n\n            MenuBar.addAction(repeatAction, \"tools\");\n        },\n        onunload () {\n            repeatAction.delete();\n        },\n    });\n})();\n"
  },
  {
    "path": "plugins/repeating_textures/LICENSE.MD",
    "content": "MIT License\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/repeating_textures/about.md",
    "content": "Enables repeating textures, meaning textures wrap when the UV is beyond the texture bounds.\nAllows for more accurate importing of OBJ models that make use of repeating textures.\nRepeated textures can be toggled on and off from `View > Repeating Textures`."
  },
  {
    "path": "plugins/repeating_textures/members.yml",
    "content": "maintainers:\n  - mr0x13f\ndevelopers:\n  - mr0x13f\n"
  },
  {
    "path": "plugins/repeating_textures/repeating_textures.js",
    "content": "(function() {\n\nlet deferred = [];\n\nPlugin.register('repeating_textures', {\n\n    title:         'Repeating Textures',\n    author:        '0x13F',\n    description:   'Enables repeating textures',\n    icon:          'icon.png',\n    creation_date: '2025-06-15',\n    version:       '3.0.0',\n    variant:       'both',\n    min_version:   '4.12.4',\n    has_changelog: false,\n    tags:          [ 'Texture', 'Viewport', 'Utility' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/repeating_textures',\n    \n    onload() {\n\n        // Hook into the Texture.getMaterial() method to set the wrap mode\n        {\n            let original = Texture.prototype.getMaterial;\n            Texture.prototype.getMaterial = function () {\n                let result = original.apply(this);\n                updateTextureWrapMode(this);\n                return result;\n            };\n            defer(() => Texture.prototype.getMaterial = original);\n        }\n\n        // Setting\n        deferDelete(new Setting('repeating_textures', {\n            name: 'Repeating Textures',\n            description: 'Wrap textures when UV is beyond the texture bounds',\n            category: 'view',\n            value: true,\n            onChange() {\n                updateAllTextureWrapModes();\n            },\n        }));\n\n        // Toggle\n        let repeatingTexturesToggle = deferDelete(new Toggle('toggle_repeating_textures', {\n            name: 'Repeating Textures',\n            description: 'Wrap textures when UV is beyond the texture bounds',\n            icon: 'qr_code',\n            category: 'view',\n            linked_setting: 'repeating_textures',\n        }));\n        let shadingToggleIndex = MenuBar.menus.view.structure.indexOf('toggle_shading');\n        let repeatingTexturesToggleIndex = shadingToggleIndex + 1;\n        MenuBar.menus.view.structure.splice(repeatingTexturesToggleIndex, 0, repeatingTexturesToggle);\n        defer(() => MenuBar.menus.view.structure.splice(MenuBar.menus.view.structure.indexOf(repeatingTexturesToggle), 1));\n\n        // Apply setting on load\n        updateAllTextureWrapModes();\n        // Disable on unload\n        defer(() => updateAllTextureWrapModes(false));\n\n    },\n\n    onunload() {\n\n        for (let lambda of deferred.reverse())\n            lambda();\n        \n    },\n\n});\n\nfunction updateAllTextureWrapModes(force = undefined) {\n\n    for (let texture of Texture.all)\n        updateTextureWrapMode(texture, force);\n\n}\n\nfunction updateTextureWrapMode(texture, force = undefined) {\n\n    let useRepeating = force ?? Settings.get('repeating_textures');\n    let wrapMode = useRepeating ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;\n    let map = texture.material?.map ?? texture.img?.tex;\n\n    if (map.wrapS === wrapMode && map.wrapT === wrapMode)\n        return;\n\n    map.wrapS = wrapMode;\n    map.wrapT = wrapMode;\n    map.needsUpdate = true;\n\n}\n\nfunction defer(lambda) {\n    deferred.push(lambda);\n}\n\nfunction deferDelete(deletable) {\n    if (deletable.delete == undefined) {\n        console.warn('deferDelete() called with object that isn\\'t deletable: ', deletable);\n        return;\n    }\n    defer(() => deletable.delete());\n    return deletable;\n}\n\n})();\n"
  },
  {
    "path": "plugins/resource_pack_exporter.js",
    "content": "var exportResourcePackAction;\n\nPlugin.register('resource_pack_exporter', {\n    title: 'Resource Pack Exporter',\n    icon: 'archive',\n    author: 'Wither',\n    description: 'Exports your model as a ready-to-use Minecraft resource pack',\n    tags: [\"Minecraft: Java Edition\"],\n    version: '1.0.0',\n    min_version: '3.0.0',\n    variant: 'both',\n\n    onload() {\n        exportResourcePackAction = new Action({\n            id: 'export_rp',\n            name: 'Export Resource Pack',\n            icon: 'archive',\n            description: 'Exports your model as a ready-to-use Minecraft resource pack',\n            category: 'file',\n            condition: () => Format.id === \"java_block\",\n            click: function (ev) {\n                packDialog.show();\n            }\n        });\n        MenuBar.addAction(exportResourcePackAction, 'file.export');\n    },\n    onunload() {\n        this.onuninstall();\n    },\n    onuninstall() {\n        exportResourcePackAction.delete();\n    }\n})\n\nvar packDialog = new Dialog({\n    id: 'create_pack',\n    title: 'Pack Settings',\n    draggable: true,\n    form: {\n        pack_name: {label: 'Pack Name', value: 'My Pack'},\n        pack_description: {label: 'Pack Description', value: 'My Description'}\n    },\n    onConfirm: function(data) {\n        exportResourcePack(data.pack_name, data.pack_description);\n        packDialog.hide();\n    }\n});\n\nfunction exportResourcePack(name, description) {\n    Screencam.cleanCanvas({width: 100, height: 100}, base64 => {\n        let packZip = new JSZip();\n        packZip.file('pack.png', base64.split(',')[1], {base64: true});\n\n        let manifestObject = {pack: {description: description !== '' ? description : 'My Description', pack_format: 4}};\n        let animTextureObject = {animation: {frametime: 2}};\n\n        packZip.file('pack.mcmeta', JSON.stringify(manifestObject, null, '\\t'));\n\n        let assetsFolder = packZip.folder('assets');\n        let minecraftFolder = assetsFolder.folder('minecraft');\n        let modelsFolder = minecraftFolder.folder('models');\n        let blockFolder = modelsFolder.folder('block');\n    \n        let texturesFolder = minecraftFolder.folder('textures');\n        let blockbenchTexturesFolder = texturesFolder.folder('blockbench')\n    \n        for(let textureIndex = 0; textureIndex < textures.length; textureIndex++) {\n            textures[textureIndex].name = `texture_${textureIndex}.png`;\n            textures[textureIndex].folder = 'blockbench';\n            textures[textureIndex].namespace = 'minecraft';\n            if (textures[textureIndex].frameCount > 1) {\n                blockbenchTexturesFolder.file(`texture_${textureIndex}.png.mcmeta`, JSON.stringify(animTextureObject, null, \"\\t\"));\n            }\n            blockbenchTexturesFolder.file(`texture_${textureIndex}.png`, textures[textureIndex].getBase64(), {base64: true});\n        }\n    \n        blockFolder.file('glass.json', Codecs.java_block.compile());\n    \n        packZip.generateAsync({type: 'blob'}).then(content => {\n            Blockbench.export({\n                type: 'Zip Archive',\n                extensions: ['zip'],\n                name: name !== '' ? name : 'My Pack',\n                content: content,\n                savetype: 'zip'\n            });\n        });\n    });\n}"
  },
  {
    "path": "plugins/resource_pack_utilities/about.md",
    "content": "<div id=\"about-content\">\n  <img src=\"https://ewanhowell.com/assets/images/plugins/resource-pack-utilities/logo.webp\" />\n  <p>This plugin contains a collection of utilities to assist with resource pack creation.</p>\n  <h2>How to use</h2>\n  <p>To use this plugin, go <strong>Tools > Resource Pack Utilities</strong>, then select the utility you would like to use.</p>\n  <h2>Utilities</h2>\n  <ul>\n    <li>\n      <h3>Animation Combiner</h3>\n      <p>Animation Combiner is a tool that combines the textures from a selected folder into an animated spritesheet texture.</p>\n    </li>\n    <li>\n      <h3>Batch Exporter</h3>\n      <p>Batch Exporter is a tool that will export every bbmodel file within a folder to an output folder using the selected format.</p>\n    </li>\n    <li>\n      <h3>Bed Converter</h3>\n      <p>Bed Converter is a tool that splits a bed entity texture into the per-face textures used by the new bed block model format.</p>\n    </li>\n    <li>\n      <h3>Chest Converter</h3>\n      <p>Chest Converter is a tool that will convert the chest textures between the 1.14 format 1.15 format.</p>\n    </li>\n    <li>\n      <h3>CIT Optimiser</h3>\n      <p>CIT Optimiser is a tool that will go through all properties files in an OptiFine CIT folder and optimise them to be as small as possible, removing any unnecessary data.</p>\n    </li>\n    <li>\n      <h3>Clock Generator</h3>\n      <p>Clock Generator is a tool that allows you to quickly and easily generate a full set of clock textures from a simple input texture.</p>\n    </li>\n    <li>\n      <h3>CTM Converter</h3>\n      <p>CTM Converter is a tool that will convert compact CTM into full CTM or overlay CTM.</p>\n    </li>\n    <li>\n      <h3>Image Resizer</h3>\n      <p>Image Resizer is a tool that will go through all images in a folder and resize them, relative to their original size.</p>\n    </li>\n    <li>\n      <h3>JSON Optimiser</h3>\n      <p>JSON Optimiser is a tool that will go through all JSON files in a folder and optimise them to be as small as possible, minifying them and removing any unnecessary data.</p>\n    </li>\n    <li>\n      <h3>Lang Builder</h3>\n      <p>Lang Builder lets you define language key modifications using replacement, prefix, or suffix modes. Changes are applied to all vanilla language files.</p>\n    </li>\n    <li>\n      <h3>Lang Stripper</h3>\n      <p>Lang Stripper is a tool that will go through all the language files in an resource pack and remove any entries that have not been modified.</p>\n    </li>\n    <li>\n      <h3>Minecraft Title Converter</h3>\n      <p>Minecraft Title Converter is a tool that will convert images to be in the the Minecraft title format. This can also convert existing textures between the 1.19 and 1.20 texture formats.</p>\n    </li>\n    <li>\n      <h3>Missing Textures</h3>\n      <p>Missing Textures is a tool that will check what textures you have in a resource pack and tell you which ones the resource pack is missing.</p>\n    </li>\n    <li>\n      <h3>Mojang Converter</h3>\n      <p>Mojang Converter is a tool that will convert images to be in the the Mojang Studios logo format. This can also convert existing textures between the 1.15 and 1.16 texture formats.</p>\n    </li>\n    <li>\n      <h3>Pack Cleaner</h3>\n      <p>Pack Cleaner is a tool that will go through all the files in a resource pack and compare them against the vanilla assets, removing them if they are unmodified.</p>\n    </li>\n    <li>\n      <h3>Pack Creator</h3>\n      <p>Pack Creator is a tool that allows you to create template resource packs, as well as get the vanilla textures, models, sounds, etc…</p>\n    </li>\n    <li>\n      <h3>Skin Converter</h3>\n      <p>Skin Converter is a tool that will convert Minecraft skins between the classic 64x32 format and the modern 64x64 format.</p>\n    </li>\n    <li>\n      <h3>Sounds Stripper</h3>\n      <p>Sounds Stripper is a tool that will go through the sounds.json file in an resource pack and remove any entries that have not been modified.</p>\n    </li>\n    <li>\n      <h3>Wide ⇄ Slim Converter</h3>\n      <p>Wide ⇄ Slim Converter is a tool that will convert Minecraft skins between the wide 4px arm format and the slim 3px arm format.</p>\n    </li>\n  </ul>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 128px;\n    object-fit: contain;\n    margin: 16px 0 24px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  #about-content h3 {\n    margin-bottom: -4px;\n    font-weight: 600;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n  <a href=\"https://www.youtube.com/playlist?list=PLYMG6bVBIumJWFq1MVbubz86XfdGApan3\">\n    <i class=\"fa_big icon fab fa-youtube\" style=\"color: #FF4444;\"></i>\n    <p>Tutorials</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/resource_pack_utilities/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2024-07-01\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2024-07-09\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Missing Textures utility\",\n          \"Added ability to export and load ignore lists\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Changed logs to save as a \\\".log\\\" file\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2024-07-24\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Chest Converter utility\",\n          \"Added Clock Generator utility\",\n          \"Added CTM Converter utility\",\n          \"Added Image Resizer utility\",\n          \"Added Minecraft Title Converter utility\",\n          \"Added Mojang Converter utility\",\n          \"Added Skin Converter utility\",\n          \"Added Wide ⇄ Slim Converter utility\"\n        ]\n      }\n    ]\n  },\n  \"1.3.0\": {\n    \"title\": \"1.3.0\",\n    \"date\": \"2024-07-25\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Animation Combiner utility\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed textures trying to export as \\\".image\\\" files\"\n        ]\n      }\n    ]\n  },\n  \"1.4.0\": {\n    \"title\": \"1.4.0\",\n    \"date\": \"2024-07-27\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Sounds Stripper utility\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"JSON minification is now optional in JSON Optimiser\",\n          \"Updated the Lang Stripper icon\",\n          \"Added YouTube tutorials link\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed output textures failing to save\",\n          \"Fixed sorting of numerical file names in Animation Combiner\"\n        ]\n      }\n    ]\n  },\n  \"1.5.0\": {\n    \"title\": \"1.5.0\",\n    \"date\": \"2024-08-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"JSON Optimiser now has an option to remove \\\"minecraft:\\\" prefixes\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Added support for the 1.21.2 \\\"light_emission\\\" property of block models to JSON Optimiser\"\n        ]\n      }\n    ]\n  },\n  \"1.5.1\": {\n    \"title\": \"1.5.1\",\n    \"date\": \"2024-09-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed Batch Exporter failing to parse certain bbmodel files\",\n          \"Fixed Batch Exporter failing to export formats where the codec ID did not match the format ID\"\n        ]\n      }\n    ]\n  },\n  \"1.6.0\": {\n    \"title\": \"1.6.0\",\n    \"date\": \"2025-01-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Blockbench can now be launched with the \\\"--resource-pack-utility=<utility>\\\" command line argument to launch straight to the specified utility\"\n        ]\n      }\n    ]\n  },\n  \"1.6.1\": {\n    \"title\": \"1.6.1\",\n    \"date\": \"2025-03-02\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed Batch Exporter failing to export glTF, OBJ, FBX, and Collada models\"\n        ]\n      }\n    ]\n  },\n  \"1.6.2\": {\n    \"title\": \"1.6.2\",\n    \"date\": \"2025-03-13\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changed\",\n        \"list\": [\n          \"Renamed the setting names to make them more generic so I can use them across multiple plugins\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed using outdated asset index files when a newer one is available\"\n        ]\n      }\n    ]\n  },\n  \"1.7.0\": {\n    \"title\": \"1.7.0\",\n    \"date\": \"2025-06-03\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Techinical Changes\",\n        \"list\": [\n          \"The cache folder has been moved to the AppData folder and is no longer required to be specified by the user\",\n          \"The \\\"Minecraft Directory\\\" setting ID has been made more unique as to not conflict if other plugins use the same ID\"\n        ]\n      }\n    ]\n  },\n  \"1.8.0\": {\n    \"title\": \"1.8.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Lang Builder utility\"\n        ]\n      },\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      },\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Temporarily removed command line argument support\"\n        ]\n      }\n    ]\n  },\n  \"1.9.0\": {\n    \"title\": \"1.9.0\",\n    \"date\": \"2025-10-15\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Updates\",\n        \"list\": [\n          \"Updated Pack Creator to support the new pack.mcmeta format\",\n          \"Updated JSON Optimiser to support the new pack.mcmeta format\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed ability to export from Animation Combiner\"\n        ]\n      }\n    ]\n  },\n  \"1.9.1\": {\n    \"title\": \"1.9.1\",\n    \"date\": \"2025-10-16\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Re-enabled command line argument support\"\n        ]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed the back button hover colour\"\n        ]\n      }\n    ]\n  },\n  \"1.9.2\": {\n    \"title\": \"1.9.2\",\n    \"date\": \"2025-12-04\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed Batch Exporter crashing when loading bbmodels that have unknown model formats\"\n        ]\n      }\n    ]\n  },\n  \"1.10.0\": {\n    \"title\": \"1.10.0\",\n    \"date\": \"2026-05-17\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added Bed Converter utility for splitting a bed entity texture into the per-face textures used by the new bed block model format\",\n          \"Added drag-and-drop support to all file and folder inputs\"\n        ]\n      },\n      {\n        \"title\": \"Updates\",\n        \"list\": [\n          \"Updated JSON Optimiser to support the multi-axis rotation format for block model elements\",\n          \"Updated JSON Optimiser to strip default `force_translucent` values from texture entries\",\n          \"Updated JSON Optimiser to simplify single-sprite texture entries to the string form\",\n          \"Updated JSON Optimiser to strip the `uv` property from faces when it matches the auto-generated value\",\n          \"Updated JSON Optimiser to remove empty `elements` arrays\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Blockbench's native file drop is now blocked while the Resource Pack Utilities dialog is open\",\n          \"Tweaked dialog header font sizes\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/resource_pack_utilities/resource_pack_utilities.js",
    "content": "const crypto = require(\"node:crypto\")\nconst zlib = require(\"node:zlib\")\n\nlet fs, dialog, action, action2, styles, storage, cacheDir\n\nconst id = \"resource_pack_utilities\"\nconst name = \"Resource Pack Utilities\"\nconst icon = \"construction\"\nconst description = \"A collection of utilities to assist with resource pack creation.\"\n\nconst manifest = {\n  latest: {},\n  versions: []\n}\n\nlet outputLog = []\nconst output = {\n  log: log => outputLog.push([\"message\", log]),\n  info: log => outputLog.push([\"info\", log]),\n  warn: log => outputLog.push([\"warn\", log]),\n  error: log => outputLog.push([\"error\", log])\n}\n\nconst setupPlugin = () => Plugin.register(id, {\n  title: name,\n  icon: \"icon.png\",\n  author: \"Ewan Howell\",\n  description,\n  tags: [\"Minecraft: Java Edition\", \"Resource Packs\", \"Utilities\"],\n  version: \"1.10.0\",\n  min_version: \"5.0.2\",\n  variant: \"desktop\",\n  website: `https://ewanhowell.com/plugins/${id.replace(/_/g, \"-\")}/`,\n  repository: `https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/${id}`,\n  bug_tracker: `https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[${name}]`,\n  creation_date: \"2024-07-01\",\n  has_changelog: true,\n  async onload() {\n    fs = require(\"fs\", {\n      message: \"This permission is required to access your downloaded Minecraft versions, cache versions you open that aren’t already downloaded, and export assets to folders.\",\n      optional: false\n    })\n\n    if (!fs) {\n      throw new Error(\"fs access denied\")\n    }\n\n    cacheDir = PathModule.join(SystemInfo.user_data_directory, \"minecraft_assets_cache\")\n    if (!fs.existsSync(cacheDir)) {\n      fs.mkdirSync(cacheDir, { recursive: true })\n    }\n    storage = JSON.parse(localStorage.getItem(id) ?? \"{}\")\n    storage.favourites ??= []\n    let directory\n    if (SystemInfo.platform === \"win32\") {\n      directory = PathModule.join(SystemInfo.appdata_directory, \".minecraft\")\n    } else if (SystemInfo.platform === \"darwin\") {\n      directory = PathModule.join(SystemInfo.home_directory, \"Library\", \"Application Support\", \"minecraft\")\n    } else {\n      directory = PathModule.join(SystemInfo.home_directory, \".minecraft\")\n    }\n    new Setting(\"ewan_minecraft_directory\", {\n      value: directory,\n      category: \"defaults\",\n      type: \"click\",\n      name: \"Ewan's Plugins - Minecraft Directory\",\n      description: \"The location of your .minecraft folder\",\n      icon: \"folder_open\",\n      click() {\n        const dir = Blockbench.pickDirectory({\n          title: \"Select your .minecraft folder\",\n          startpath: settings.ewan_minecraft_directory.value\n        })\n        if (dir) {\n          settings.ewan_minecraft_directory.value = dir\n          Settings.saveLocalStorages()\n        }\n      }\n    })\n\n    const methods = {\n      selectFolder(title = \"folder\", key = \"folder\") {\n        const dir = Blockbench.pickDirectory({\n          title: `Select ${title}`,\n          startpath: PathModule.join(settings.ewan_minecraft_directory.value, \"resourcepacks\")\n        })\n        if (dir) {\n          this[key] = dir\n        }\n      }\n    }\n\n    styles = Blockbench.addCSS(`\n      .rpu-code {\n        background-color: var(--color-back);\n        border: 1px solid var(--color-border);\n        padding: 0 2px;\n      }\n\n      @keyframes shake {\n        0%, 100% {\n          transform: translateX(0);\n          outline: 0 solid transparent;\n        }\n        12.5%, 62.5% {\n          transform: translateX(8px);\n          outline: 4px solid var(--color-danger);\n        }\n        37.5%, 87.5% {\n          transform: translateX(-8px);\n          outline: 4px solid var(--color-danger);\n        }\n      }\n\n      #${id} {\n        .dialog_content {\n          margin: 0;\n          max-height: calc(100vh - 128px);\n        }\n\n        button {\n          display: inline-flex;\n          justify-content: center;\n          align-items: center;\n          min-height: 32px;\n\n          &:disabled {\n            opacity: .5;\n            cursor: not-allowed;\n\n            &:hover {\n              background-color: var(--color-button);\n              color: var(--color-text) !important;\n            }\n          }\n\n          &.material-icons {\n            min-width: 32px;\n            padding: 0;\n\n            &:focus {\n              text-decoration: none;\n              color: var(--color-light);\n            }\n\n            &.icon {\n              background-color: initial;\n\n              &:focus {\n                color: var(--color-text) !important;\n              }\n\n              &:hover {\n                color: var(--color-light) !important;\n              }\n            }\n          }\n        }\n\n        code {\n          background-color: var(--color-back);\n          border: 1px solid var(--color-border);\n          padding: 0 2px;\n        }\n\n        input[type=\"text\"] {\n          background-color: var(--color-back);\n          padding: 0 8px;\n          border: 1px solid var(--color-border);\n          height: 32px;\n        }\n\n        h1, h3, p {\n          margin: 0;\n          padding: 0;\n        }\n\n        h3 {\n          margin-bottom: -8px;\n        }\n\n        .bb-select {\n          cursor: pointer;\n          padding-top: 0;\n          padding-right: 27px;\n          display: flex;\n          align-items: center;\n\n          &::before {\n            top: 50%;\n            right: 6px;\n            transform: translateY(calc(-50% - 7px));\n          }\n        }\n\n        .divider {\n          min-height: 1px;\n          display: flex;\n          align-items: center;\n          gap: 16px;\n\n          &::before,\n          &:not(:empty)::after {\n            content: \"\";\n            flex: 1;\n            height: 1px;\n            background-color: var(--color-border);\n          }\n        }\n\n        #home {\n          .component-searchBar {\n            margin: 16px;\n            padding-bottom: 16px;\n            border-bottom: 1px solid var(--color-border);\n          }\n\n          > .utilities {\n            margin: 16px;\n            gap: 8px;\n            flex-wrap: wrap;\n            display: flex;\n\n            > div {\n              background-color: var(--color-back);\n              padding: 12px 16px 16px 16px;\n              cursor: pointer;\n              display: flex;\n              flex-direction: column;\n              gap: 8px;\n              width: calc(50% - 4px);\n              position: relative;\n              border-radius: 6px;\n\n              * {\n                cursor: pointer;\n              }\n\n              &:hover {\n                background-color: var(--color-button);\n              }\n            }\n\n            + div {\n              border-top: 1px solid var(--color-border);\n              padding-top: 16px;\n            }\n\n            .fa-star {\n              position: absolute;\n              top: 16px;\n              right: 16px;\n\n              &.fa {\n                color: #f9c300;\n\n                &:hover {\n                  filter: brightness(1.2);\n                }\n              }\n\n              &.far:hover {\n                color: var(--color-light);\n              }\n            }\n          }\n\n          h3 {\n            font-weight: 600;\n            font-size: 22px;\n            color: var(--color-light);\n            line-height: 100%;\n            margin: 0;\n            display: flex;\n            gap: 6px;\n            padding-right: 28px;\n          }\n        }\n\n        #header {\n          background-color: var(--color-back);\n          position: relative;\n          padding: 8px 40px 16px 16px;\n\n          h1 {\n            font-weight: 600;\n            color: var(--color-light);\n            display: flex;\n            gap: 8px;\n            align-items: center;\n            font-size: 28px;\n\n            > i {\n              font-size: 30px;\n              min-width: 30px;\n            }\n          }\n        }\n\n        #home-button {\n          position: absolute;\n          top: 8px;\n          right: 8px;\n          background-color: initial;\n          display: flex;\n          align-items: center;\n          min-width: initial;\n          padding: 0 8px;\n          box-shadow: none;\n\n          &:hover {\n            color: var(--color-light) !important;\n          }\n\n          &:disabled {\n            pointer-events: initial;\n            cursor: not-allowed;\n\n            &:hover {\n              color: var(--color-text) !important;\n            }\n          }\n        }\n\n        #info-button {\n          position: absolute;\n          bottom: 8px;\n          right: 8px;\n        }\n\n        .utility {\n          margin: 16px 8px 16px 16px;\n          padding-right: 8px;\n          display: flex;\n          gap: 16px;\n          flex-direction: column;\n          max-height: calc(100vh - 286px);\n          overflow-y: auto;\n\n          > div, .col {\n            display: flex;\n            gap: 16px;\n            flex-direction: column;\n\n            > .component-checkboxRow + .component-checkboxRow {\n              margin-top: -16px;\n            }\n          }\n\n          .row {\n            display: flex;\n            gap: 32px;\n            flex-direction: row;\n            align-items: flex-start;\n          }\n        }\n\n        .no-results {\n          display: flex;\n          padding: 0 !important;\n          background-color: initial !important;\n          text-align: center;\n          width: 100% !important;\n          height: 128px;\n          justify-content: center;\n          align-items: center;\n        }\n\n        .button-row {\n          display: flex;\n          gap: 8px;\n\n          > * {\n            flex: 1 1 0px;\n          }\n        }\n\n        .utility-langBuilder {\n          margin-left: 14px;\n        }\n\n        ${Object.entries(components).filter((([k, v]) => v.styles)).map(([k, v]) => `.component-${k} { ${v.styles} }`).join(\"\")}\n        ${Object.entries(utilities).filter((([k, v]) => v.component.styles)).map(([k, v]) => `.utility-${k} { ${v.component.styles} }`).join(\"\")}\n      }\n    `, \"base\")\n\n    const subcomponents = Object.fromEntries(\n      Object.entries(components).map(([k, v]) => {\n        v.template = `<div ref=\"container\" class=\"component-${k}\">${v.template}</div>`\n        return [k, Vue.extend(v)]\n      })\n    )\n\n    const utilityComponents = Object.fromEntries(\n      Object.entries(utilities).map(([k, v]) => {\n        v.component.props = [\"value\"]\n        const data = v.component.data\n        v.component.data = function() {\n          return {\n            ...data,\n            status: this.value\n          }\n        }\n        v.component.watch = {\n          value(val) {\n            this.status = val\n          },\n          status(val) {\n            this.$emit(\"input\", val)\n          },\n          ...v.component.watch\n        }\n        v.component.components = subcomponents\n        v.component.methods ??= {}\n        v.component.methods = { ...v.component.methods, ...methods }\n        v.component.template = `<div ref=\"container\" class=\"utility utility-${k}\">${v.component.template}</div>`\n        return [k, Vue.extend(v.component)]\n      })\n    )\n\n    dialog = new Dialog({\n      id,\n      title: name,\n      width: 780,\n      buttons: [],\n      cancel_on_click_outside: false,\n      component: {\n        data: {\n          utility: null,\n          utilities,\n          status: {\n            processing: false,\n            finished: false\n          },\n          favourites: storage.favourites,\n          search: \"\"\n        },\n        components: {\n          ...subcomponents,\n          ...utilityComponents\n        },\n        watch: {\n          status(val) {\n            if (val.processing) {\n              const styles = document.createElement(\"style\")\n              styles.id = `${id}-processing-styles`\n              styles.innerHTML = `\n                #${id} {\n                  .dialog_close_button {\n                    pointer-events: none;\n                    opacity: .5;\n                  }\n\n                  .dialog_handle::before, #header::before {\n                    content: \"\";\n                    position: absolute;\n                    top: 0;\n                    right: 0;\n                    bottom: 0;\n                    width: 30px;\n                    cursor: not-allowed;\n                  }\n                }\n              `\n              document.body.append(styles)\n            } else {\n              document.getElementById(`${id}-processing-styles`)?.remove()\n            }\n          }\n        },\n        methods: {\n          showInfo() {\n            new Dialog({\n              id: `${id}-info`,\n              title: `${utilities[this.utility].name} Info`,\n              buttons: [\"dialog.close\"],\n              lines: [\n                `<style>#${id}-info {\n                  ul {\n                    margin-bottom: 8px;\n                  }\n\n                  li {\n                    list-style: initial;\n                    margin-left: 20px;\n\n                    li {\n                      list-style: circle;\n\n                      li {\n                        list-style: square;\n                      }\n                    }\n                  }\n\n                  code {\n                    background-color: var(--color-back);\n                    border: 1px solid var(--color-border);\n                    padding: 0 2px;\n                  }\n\n                  h3 {\n                    margin: 0 0 8px 0;\n                    padding: 0;\n                    font-weight: 700;\n                  }\n                }</style>`,\n                utilities[this.utility].info\n              ],\n              width: 780\n            }).show()\n          },\n          favourite(id) {\n            this.favourites.unshift(id)\n            save()\n            sortUtilities()\n          },\n          unfavourite(id) {\n            this.favourites.splice(this.favourites.indexOf(id), 1)\n            save()\n            sortUtilities()\n          }\n        },\n        computed: {\n          utilityList() {\n            const sorted = Object.entries(this.utilities).sort((a, b) => a[0].localeCompare(b[0]))\n            if (this.search.length) {\n              return sorted.filter(e => e[0].toLowerCase().includes(this.search.replace(/\\s/g, '')))\n            }\n            return sorted.filter(e => !this.favourites.includes(e[0]))\n          }\n        },\n        template: `\n          <div>\n            <div v-if=\"utility\" id=\"header\">\n              <h1><i class=\"material-icons icon\">{{ utilities[utility].icon }}</i> {{ utilities[utility].name }}</h1>\n              <span>{{ utilities[utility].description }}</span>\n              <button id=\"home-button\" @click=\"utility = null; status.finished = false\" :disabled=\"status.processing\"><i class=\"material-icons\">arrow_back</i> Home</button>\n              <button v-if=\"utilities[utility].info\" id=\"info-button\" class=\"material-icons icon\" @click=\"showInfo\">info</button>\n            </div>\n            <div v-if=\"utility === null\" id=\"home\">\n              <search-bar v-model=\"search\" />\n              <div class=\"utilities\" v-if=\"!search.length && Object.keys(utilities).filter(e => favourites.includes(e)).length\">\n                <div v-for=\"id in favourites\" v-if=\"id in utilities\" @click=\"utility = id\">\n                  <h3><i class=\"material-icons icon\">{{ utilities[id].icon }}</i> {{ utilities[id].name }}</h3>\n                  <div>{{ utilities[id].tagline }}</div>\n                  <i class=\"fa_big fa fa-star\" @click.stop=\"unfavourite(id)\"></i>\n                </div>\n              </div>\n              <div class=\"utilities\" v-if=\"Object.keys(utilities).filter(e => !favourites.includes(e)).length\">\n                <div v-if=\"!utilityList.length\" class=\"no-results\">No results…</div>\n                <div v-for=\"([id, data]) in utilityList\" v-if=\"search.length ? id.toLowerCase().includes(search.replace(/\\\\s/g, '')) : !favourites.includes(id)\" @click=\"utility = id\">\n                  <h3><i class=\"material-icons icon\">{{ data.icon }}</i> {{ data.name }}</h3>\n                  <div>{{ data.tagline }}</div>\n                  <i v-if=\"favourites.includes(id)\" class=\"fa_big fa fa-star\" @click.stop=\"unfavourite(id)\"></i>\n                  <i v-else class=\"fa_big far fa-star\" @click.stop=\"favourite(id)\"></i>\n                </div>\n              </div>\n            </div>\n            <component v-for=\"(data, id) in utilities\" :key=\"id\" v-if=\"utility === id\" :is=\"id\" v-model=\"status\"></component>\n          </div>\n        `\n      },\n      onConfirm(r, e) {\n        if (Keybinds.extra.confirm.keybind.isTriggered(e)) return false\n      },\n      async onBuild() {\n        const data = await fetch(\"https://piston-meta.mojang.com/mc/game/version_manifest_v2.json\").then(e => e.json())\n        data.versions.splice(data.versions.findIndex(e => e.id === \"1.6\"), 1)\n        manifest.latest = data.latest\n        manifest.versions = data.versions.slice(0, data.versions.findIndex(e => e.id === \"13w24a\") + 1)\n      },\n      async onOpen() {\n        if (!await exists(settings.ewan_minecraft_directory.value)) {\n          new Dialog({\n            title: \"The .minecraft directory was not found\",\n            lines: ['When prompted, please select your <code class=\"rpu-code\">.minecraft</code> folder'],\n            width: 450,\n            buttons: [\"dialog.ok\"],\n            onClose() {\n              const dir = Blockbench.pickDirectory({\n                title: \"Select your .minecraft folder\",\n                startpath: settings.ewan_minecraft_directory.value\n              })\n              if (dir) {\n                settings.ewan_minecraft_directory.value = dir\n                Settings.saveLocalStorages()\n              } else {\n                dialog.close()\n              }\n            }\n          }).show()\n        }\n      }\n    })\n    action = new Action({\n      id,\n      name,\n      description,\n      icon,\n      click: () => dialog.show(),\n      condition: () => !Object.keys(utilities).filter(e => storage.favourites.includes(e)).length,\n    })\n    action2 = new Action({\n      id: id + 2,\n      name,\n      description,\n      icon,\n      click: () => dialog.show(),\n      condition: () => Object.keys(utilities).filter(e => storage.favourites.includes(e)).length,\n      children: [\n        {\n          name: \"Open\",\n          icon: \"menu\",\n          click: () => dialog.show()\n        },\n        ...Object.entries(utilities).map(([id, data]) => new Action({\n          id,\n          name: data.name,\n          description: data.tagline,\n          icon: data.icon,\n          click() {\n            dialog.show()\n            dialog.content_vue.utility = id\n          },\n          condition: () => storage.favourites.includes(id)\n        }))\n      ]\n    })\n    sortUtilities()\n    MenuBar.addAction(action, \"tools\")\n    MenuBar.addAction(action2, \"tools\")\n    document.addEventListener(\"keydown\", copyText)\n    document.addEventListener(\"dragover\", blockOutsideDnd, true)\n    document.addEventListener(\"drop\", blockOutsideDnd, true)\n    const utility = Blockbench.argv.find(e => e.startsWith(\"--resource-pack-utility=\"))?.split(\"=\")[1]\n    if (utility && utilities[utility]) {\n      dialog.show()\n      dialog.content_vue.utility = utility\n    }\n  },\n  onunload() {\n    document.removeEventListener(\"keydown\", copyText)\n    document.removeEventListener(\"dragover\", blockOutsideDnd, true)\n    document.removeEventListener(\"drop\", blockOutsideDnd, true)\n    dialog?.close()\n    action?.delete()\n    action2?.delete()\n    Object.keys(utilities).forEach(e => BarItems[e]?.delete())\n    styles?.delete()\n    document.getElementById(`${id}-processing-styles`)?.remove()\n  }\n})\n\n// Functions\n\nfunction blockOutsideDnd(event) {\n  const dialogEl = document.getElementById(id)\n  if (!dialogEl) return\n  if (document.getElementById(\"dialog_wrapper\")?.lastElementChild !== dialogEl) return\n  if (event.target.closest?.(\".component-fileInput, .folder-selector\")) return\n  event.preventDefault()\n  event.stopPropagation()\n}\n\nfunction save() {\n  localStorage.setItem(id, JSON.stringify(storage))\n}\n\nconst getFiles = async function*(dir) {\n  const dirents = await fs.promises.readdir(dir, { withFileTypes: true })\n  for (const dirent of dirents) {\n    const res = PathModule.resolve(dir, dirent.name)\n    if (dirent.isDirectory()) {\n      yield* getFiles(res)\n    } else if (!res.match(/([\\/\\\\]|^)\\.git([\\/\\\\]|$)/)) {\n      yield res\n    }\n  }\n}\n\nasync function listFiles(dir, type) {\n  const files = await fs.promises.readdir(dir, { withFileTypes: true })\n  return files.filter(e => e.isFile() && (!type || e.name.endsWith(\".\" + type))).map(e => e.name).sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n}\n\nconst sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"]\nfunction formatBytes(bytes) {\n  if (bytes === 0) return \"0 B\"\n  const sign = bytes < 0 ? \"-\" : \"\"\n  bytes = Math.abs(bytes)\n  const i = Math.floor(Math.log(bytes) / Math.log(1024))\n  return sign + parseFloat((bytes / Math.pow(1024, i)).toFixed(1)) + \" \" + sizes[i]\n}\n\nasync function loadImage(imagePath) {\n  const img = new Image()\n  if (imagePath.startsWith?.(\"data:image/png;base64,\")) {\n    img.src = imagePath\n  } else {\n    let imageData\n    if (typeof imagePath === \"object\") {\n      imageData = imagePath\n    } else {\n      imageData = await fs.promises.readFile(imagePath)\n    }\n    const base64Data = imageData.toString(\"base64\")\n    img.src = `data:image/png;base64,${base64Data}`\n  }\n  await img.decode()\n  return img\n}\n\nfunction confirm(title, message) {\n  return new Promise(fulfil => Blockbench.showMessageBox({\n    title,\n    message: message + \"\\n\\nThis action cannot be undone!\",\n    buttons: [\"dialog.confirm\", \"dialog.cancel\"],\n    width: 512\n  }, b => fulfil(!b)))\n}\n\nfunction showMessage(title, message) {\n  return new Promise(fulfil => {\n    new Dialog({\n      id: `${id}-message`,\n      title,\n      lines: [\n        `<style>#${id}-message {\n          .dialog_content {\n            white-space: pre-wrap;\n          }\n\n          code {\n            background-color: var(--color-back);\n            border: 1px solid var(--color-border);\n            padding: 0 2px;\n          }\n        }</style>`,\n        message\n      ],\n      buttons: [\"dialog.ok\"],\n      onClose: () => fulfil()\n    }).show()\n  })\n}\n\nfunction formatPath(path) {\n  return path.replace(/\\\\/g, \"/\")\n}\n\nfunction exists(path) {\n  return new Promise(async fulfil => {\n    try {\n      await fs.promises.stat(path)\n      fulfil(true)\n    } catch {\n      fulfil(false)\n    }\n  })\n}\n\nfunction copyText(evt) {\n  if (event.ctrlKey && event.key === \"c\") {\n    const selection = window.getSelection()\n    const text = selection.toString()\n    if (text) {\n      let parent = selection.anchorNode.parentElement\n      while (parent) {\n        if (parent.id === \"resource_pack_utilities\") {\n          navigator.clipboard.writeText(text)\n          break\n        }\n        parent = parent.parentElement\n      }\n    }\n  }\n}\n\nconst td = new TextDecoder\nfunction parseZip(zip) {\n  const ua = new Uint8Array(zip)\n  const dv = new DataView(zip)\n\n  const offEOCD = ua.findLastIndex((e, i, a) => e === 0x50 && a[i+1] === 0x4b && a[i+2] === 0x05 && a[i+3] === 0x06)\n  const offCenDir = dv.getUint32(offEOCD + 16, true)\n  const recordCount = dv.getUint16(offEOCD + 10, true)\n\n  const parsedZip = {\n    buffer: zip,\n    array: ua,\n    view: dv,\n    eocdOffset: offEOCD,\n    centralDirOffset: offCenDir,\n    fileCount: recordCount,\n    files: {}\n  }\n\n  for (let i = 0, o = offCenDir; i < recordCount; i++) {\n    const n = dv.getUint16(o + 28, true)\n    const m = dv.getUint16(o + 30, true)\n    const k = dv.getUint16(o + 32, true)\n    const encodedPath = ua.subarray(o + 46, o + 46 + n)\n    const filePath = td.decode(encodedPath)\n\n    if (!filePath.endsWith(\"/\") && (filePath.startsWith(\"assets/\") || [\"pack.mcmeta\", \"version.json\", \"pack.png\"].includes(filePath)) && !/\\.(class|nbt|mcassetsroot)$/.test(filePath)) {\n      const h = dv.getUint32(o + 42, true)\n      const q = dv.getUint16(h + 8,  true)\n      const t = dv.getUint16(h + 10, true)\n      const d = dv.getUint16(h + 12, true)\n      const s = dv.getUint32(o + 20, true)\n      const a = dv.getUint32(o + 24, true)\n      const e = dv.getUint16(h + 28, true)\n\n      parsedZip.files[filePath] = {\n        path: filePath,\n        compressedSize: s,\n        size: a,\n        crc32: dv.getUint32(o + 16, true),\n        timeValue: t,\n        dateValue: d,\n        encodedPath,\n        compressionMethod: q,\n        compressedContent: ua.subarray(h + 30 + n + e, h + 30 + n + e + s)\n      }\n      if (q === 0) {\n        parsedZip.files[filePath].content = parsedZip.files[filePath].compressedContent\n      } else {\n        Object.defineProperty(parsedZip.files[filePath], \"content\", {\n          configurable: true,\n          enumerable: true,\n          get() {\n            const c = zlib.inflateRawSync(this.compressedContent)\n            Object.defineProperty(this, \"content\", {\n              value: c,\n              configurable: true,\n              enumerable: true\n            })\n            return c\n          }\n        })\n      }\n    }\n\n    o += 46 + n + m + k\n  }\n\n  return parsedZip\n}\n\nfunction getVersion(id) {\n  return manifest.versions.find(e => e.id === id)\n}\n\nasync function getVersionData(id) {\n  const version = getVersion(id)\n  if (!version) return\n  if (version.data) {\n    return version.data\n  }\n  const vanillaDataPath = PathModule.join(settings.ewan_minecraft_directory.value, \"versions\", id, id + \".json\")\n  if (await exists(vanillaDataPath)) {\n    version.data = JSON.parse(await fs.promises.readFile(vanillaDataPath))\n    return version.data\n  }\n  const cacheDataPath = PathModule.join(cacheDir, `data_${id}.json`)\n  if (await exists(cacheDataPath)) {\n    version.data = JSON.parse(await fs.promises.readFile(cacheDataPath))\n    return version.data\n  }\n  version.data = await fetch(version.url).then(e => e.json())\n  await fs.promises.writeFile(cacheDataPath, JSON.stringify(version.data), \"utf-8\")\n  return version.data\n}\n\nasync function shaCheck(path, sha) {\n  return crypto.createHash(\"sha1\").update(await fs.promises.readFile(path)).digest(\"hex\") === sha\n}\n\nasync function getVersionAssetsIndex(id) {\n  const version = await getVersionData(id)\n  if (version.assetsIndex) {\n    return version.assetsIndex\n  }\n  const vanillaAssetsIndexPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"indexes\", version.assets + \".json\")\n  if (await exists(vanillaAssetsIndexPath)) {\n    if (await shaCheck(vanillaAssetsIndexPath, version.assetIndex.sha1)) {\n      version.assetsIndex = JSON.parse(await fs.promises.readFile(vanillaAssetsIndexPath))\n      return version.assetsIndex\n    } else {\n      version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json())\n      await fs.promises.writeFile(vanillaAssetsIndexPath, JSON.stringify(version.assetsIndex), \"utf-8\")\n    }\n  }\n  const cacheAssetsIndexPath = PathModule.join(cacheDir, `assets_index_${version.assets}.json`)\n  if (await exists(cacheAssetsIndexPath) && await shaCheck(cacheAssetsIndexPath, version.assetIndex.sha1)) {\n    version.assetsIndex = JSON.parse(await fs.promises.readFile(cacheAssetsIndexPath))\n    return version.assetsIndex\n  }\n  version.assetsIndex = await fetch(version.assetIndex.url).then(e => e.json())\n  await fs.promises.writeFile(cacheAssetsIndexPath, JSON.stringify(version.assetsIndex), \"utf-8\")\n  return version.assetsIndex\n}\n\nasync function getVersionJar(id) {\n  let jar\n  const jarPath = PathModule.join(settings.ewan_minecraft_directory.value, \"versions\", id, id + \".jar\")\n  if (await exists(jarPath)) {\n    jar = parseZip((await fs.promises.readFile(jarPath)).buffer)\n    output.log(`Using downloaded version of \\`${id}\\``)\n  } else {\n    const jarPath = PathModule.join(cacheDir, id + \".jar\")\n    if (await exists(jarPath)) {\n      jar = parseZip((await fs.promises.readFile(jarPath)).buffer)\n      output.log(`Using cached version of \\`${id}\\``)\n    } else {\n      output.log(`\\`${id}\\` was not found on your computer, downloading…`)\n      const version = await getVersionData(id)\n      if (!version) return\n      const client = await fetch(version.downloads.client.url).then(e => e.arrayBuffer())\n      fs.promises.writeFile(jarPath, new Uint8Array(client))\n      output.log(`\\`${id}\\` downloaded`)\n      jar = parseZip(client)\n    }\n  }\n  return jar\n}\n\nfunction objectsEqual(obj1, obj2) {\n  if (obj1 === obj2) {\n    return true\n  }\n  if (obj1 == null || typeof obj1 !== \"object\" || obj2 == null || typeof obj2 !== \"object\") {\n    return false\n  }\n  const keys1 = Object.keys(obj1)\n  const keys2 = Object.keys(obj2)\n  if (keys1.length !== keys2.length) {\n    return false\n  }\n  for (const key of keys1) {\n    if (!(key in obj2) || !objectsEqual(obj1[key], obj2[key])) {\n      return false\n    }\n  }\n  return true\n}\n\nfunction getRoot(id) {\n  const version = getVersion(id)\n  if (Date.parse(version.releaseTime) >= 1403106748000 || version.data.assets === \"1.7.10\") {\n    return \"assets\"\n  }\n  return \"assets/minecraft\"\n}\n\nfunction langToJSON(lang) {\n  return Object.fromEntries(lang.split(\"\\n\").map(e => e.split(/=(.*)/).filter(e => e)).filter(e => e.length === 2))\n}\n\nfunction jsonToLang(json) {\n  return Object.entries(json).map(e => e.join(\"=\")).join(\"\\n\")\n}\n\nfunction sortUtilities() {\n  action2.children.sort((a, b) => {\n    if (a.name === \"Show all\") return -Infinity\n    if (b.name === \"Show all\") return Infinity\n    return storage.favourites.findIndex(e => e === a.id) - storage.favourites.findIndex(e => e === b.id)\n  })\n}\n\nfunction getDate() {\n  return new Date().toISOString().replace(/T/, \"_\").replace(/:/g, \"-\").split(\".\")[0]\n}\n\nfunction formatFilePaths(paths) {\n  const tree = {}\n  paths.map(filePath => filePath.split(/\\/|\\\\/)).forEach(filePath => {\n    let branch = tree\n    filePath.slice(0, -1).forEach(directory => {\n      if (!branch[directory]) {\n        branch[directory] = {}\n      }\n      branch = branch[directory]\n    })\n    branch[filePath[filePath.length - 1]] = true\n  })\n\n  const lines = []\n  function branchToString(branch, indentLevel = 0) {\n    for (const [key, value] of Object.entries(branch)) {\n      lines.push(\"  \".repeat(indentLevel) + key)\n      if (typeof value === \"object\") {\n        branchToString(value, indentLevel + 1)\n      }\n    }\n  }\n  branchToString(tree)\n\n  return lines.join(\"\\n\")\n}\n\nfunction rowBlank(imageData, width, y) {\n  for (let x = 0; x < width; ++x) if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false\n  return true\n}\n\nfunction columnBlank(imageData, width, x, top, bottom) {\n  for (let y = top; y < bottom; ++y) if (imageData.data[y * width * 4 + x * 4 + 3] !== 0) return false\n  return true\n}\n\nclass Canvas extends CanvasFrame {\n  constructor(width, height) {\n    super(width, height)\n    this.canvas.ctx = this.ctx\n    this.canvas.trim = this.trim\n    return this.canvas\n  }\n\n  trim() {\n    const imageData = this.ctx.getImageData(0, 0, this.width, this.height)\n    let top = 0, bottom = imageData.height, left = 0, right = imageData.width\n    while (top < bottom && rowBlank(imageData, this.width, top)) ++top\n    while (bottom - 1 > top && rowBlank(imageData, this.width, bottom - 1)) --bottom\n    while (left < right && columnBlank(imageData, this.width, left, top, bottom)) ++left\n    while (right - 1 > left && columnBlank(imageData, this.width, right - 1, top, bottom)) --right\n    if (top === bottom && bottom === left && left === right) {\n      this.width = 1\n      this.height = 1\n      return this\n    }\n    const trimmed = this.ctx.getImageData(left, top, right - left, bottom - top);\n    const copy = new Canvas(this.width, this.height)\n    copy.width = trimmed.width\n    copy.height = trimmed.height\n    copy.ctx.putImageData(trimmed, 0, 0)\n    this.width = copy.width\n    this.height = copy.height\n    this.ctx.clearRect(0, 0, this.width, this.height)\n    this.ctx.drawImage(copy, 0, 0)\n    return this\n  }\n}\n\nfunction imageToCanvas(img) {\n  const canvas = new Canvas(img.width, img.height)\n  canvas.ctx.drawImage(img, 0, 0)\n  return canvas\n}\n\nfunction arrayBufferToBase64(buffer) {\n  let binary = \"\"\n  const bytes = new Uint8Array(buffer)\n  for (let i = 0; i < bytes.length; i += 8192) {\n    binary += String.fromCharCode.apply(null, bytes.subarray(i, i + 8192))\n  }\n  return btoa(binary)\n}\n\nasync function getObject(filePath, version, assetsIndex) {\n  if (!assetsIndex) {\n    assetsIndex = await getVersionAssetsIndex(version)\n  }\n  const root = getRoot(version)\n  const data = assetsIndex.objects[filePath.slice(root.length + 1)]\n  const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n  const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n  if (await exists(vanillaObjectPath)) {\n    return fs.promises.readFile(vanillaObjectPath)\n  }\n  const cacheObjectPath = PathModule.join(cacheDir, \"objects\", objectPath)\n  if (await exists(cacheObjectPath)) {\n    return fs.promises.readFile(cacheObjectPath)\n  }\n  const object = Buffer.from(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer()))\n  await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true })\n  await fs.promises.writeFile(cacheObjectPath, object)\n  output.log(`Downloaded \\`${filePath}\\` to the cache`)\n  return object\n}\n\n// Constants\n\nconst header = `Generated by the Resource Pack Utilities plugin for Blockbench: https://ewanhowell.com/plugins/${id.replace(/_/g, \"-\")}/\\n\\n`\n\nconst releasePattern = new RegExp(\"^[\\\\d\\\\.]+$\")\nconst invalidDirPattern = new RegExp('[\\\\\\\\/:*?\"<>|`]')\nconst simpleFilePattern = new RegExp(\"\\\\.(fsh|vsh|glsl|txt|ogg|zip|icns)$\")\n\nconst batchExporterFormats = Object.fromEntries(Object.entries(Formats).filter(([id, format]) => format.codec?.compile && format.codec.extension && format.codec.extension !== \"bbmodel\").map(e => [e[0], {\n  name: e[1].name,\n  type: e[1].codec?.extension\n}]))\n\nconst batchExporterSpecialFormats = [\"gltf\", \"obj\", \"fbx\", \"collada\"]\n\nObject.assign(batchExporterFormats, {\n  gltf: {\n    name: \"glTF\",\n    type: \"gltf\"\n  },\n  obj: {\n    name: \"OBJ\",\n    type: \"obj\"\n  },\n  fbx: {\n    name: \"FBX\",\n    type: \"fbx\"\n  },\n  collada: {\n    name: \"Collada (dae)\",\n    type: \"dae\"\n  }\n})\n\nconst components = {\n  folderSelector: {\n    props: {\n      value: {},\n      placeholder: {\n        default: \"Folder\"\n      }\n    },\n    data() {\n      return {\n        folder: this.value ?? \"\",\n        dragging: false\n      }\n    },\n    watch: {\n      value(newVal) {\n        this.folder = newVal\n      }\n    },\n    methods: {\n      selectFolder(title = \"folder\") {\n        const dir = Blockbench.pickDirectory({\n          title: `Select the ${title}`,\n          startpath: this.folder || PathModule.join(settings.ewan_minecraft_directory.value, \"resourcepacks\")\n        })\n        if (dir) {\n          this.folder = dir\n          this.$emit(\"input\", this.folder)\n        }\n      },\n      input() {\n        this.$emit(\"input\", this.folder)\n      },\n      onDragOver(event) {\n        if (!event.dataTransfer?.types?.includes(\"Files\")) return\n        event.preventDefault()\n        event.stopPropagation()\n        this.dragging = true\n      },\n      onDragLeave(event) {\n        event.stopPropagation()\n        if (event.currentTarget.contains(event.relatedTarget)) return\n        this.dragging = false\n      },\n      async onDrop(event) {\n        event.preventDefault()\n        event.stopPropagation()\n        this.dragging = false\n        const file = event.dataTransfer.files[0]\n        if (!file?.path) return\n        try {\n          const stat = await fs.promises.stat(file.path)\n          if (!stat.isDirectory()) return\n        } catch {\n          return\n        }\n        this.folder = file.path\n        this.$emit(\"input\", this.folder)\n      },\n      formatPath\n    },\n    computed: {\n      buttonText() {\n        return this.$slots.default[0].text\n      }\n    },\n    styles: `\n      .folder-selector {\n        display: flex;\n        cursor: pointer;\n      }\n\n      .folder-selector.dragging {\n        outline: 2px dashed var(--color-accent);\n        outline-offset: 2px;\n      }\n\n      input {\n        flex: 1;\n        pointer-events: none;\n        direction: rtl;\n        text-overflow: ellipsis;\n        text-align: left;\n      }\n    `,\n    template: `\n      <div class=\"folder-selector\" :class=\"{ dragging }\" @click=\"selectFolder(buttonText)\" @dragover=\"onDragOver\" @dragleave=\"onDragLeave\" @drop=\"onDrop\">\n        <input disabled type=\"text\" :value=\"formatPath(folder)\" :placeholder=\"'Select ' + placeholder\">\n        <button class=\"material-icons\">folder_open</button>\n      </div>\n    `\n  },\n  checkboxRow: {\n    props: [\"value\", \"disabled\"],\n    styles: `\n      label {\n        display: flex;\n        gap: 4px;\n        align-items: center;\n        cursor: pointer;\n\n        * {\n          cursor: pointer;\n        }\n\n        &.disabled {\n          cursor: not-allowed;\n\n          * {\n            color: var(--color-subtle_text);\n            cursor: not-allowed;\n          }\n        }\n      }\n    `,\n    template: `\n      <label :class=\"{ disabled }\">\n        <input type=\"checkbox\" :checked=\"value\" :disabled=\"disabled\" @input=\"$emit('input', $event.target.checked)\">\n        <div><slot></slot></div>\n      </label>\n    `\n  },\n  radioRow: {\n    props: [\"value\", \"options\"],\n    data() {\n      return {\n        name: \"radio-\" + Math.random()\n      }\n    },\n    watch: {\n      value(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    styles: `\n      input {\n        min-width: 30px;\n        text-align: center;\n      }\n\n      label {\n        display: flex;\n        gap: 4px;\n        cursor: pointer;\n        align-items: center;\n\n        * {\n          cursor: pointer;\n        }\n      }\n    `,\n    template: `\n      <label v-for=\"[id, text] in options\">\n        <input type=\"radio\" :name=\"name\" :value=\"value\" :checked=\"id === value\" @input=\"value = id\">\n        <div>{{ text }}</div>\n      </label>\n    `\n  },\n  inputRow: {\n    props: [\"value\", \"placeholder\", \"width\", \"required\"],\n    styles: `\n      display: flex;\n      gap: 8px;\n      align-items: center;\n\n      input {\n        flex: 1;\n      }\n\n      .required {\n        border: 1px solid var(--color-error);\n        animation: shake .5s ease-in-out;\n      }\n    `,\n    template: `\n      <div :style=\"{ width: width ? width + 'px' : 'initial' }\"><slot></slot>:</div>\n      <input type=\"text\" :class=\"{ required }\" :placeholder=\"placeholder\" :value=\"value\" @input=\"$emit('input', $event.target.value)\">\n    `\n  },\n  ignoreList: {\n    props: [\"value\"],\n    data() {\n      return {\n        newWord: \"\",\n        ignoreList: this.value\n      }\n    },\n    watch: {\n      value(val) {\n        this.ignoreList = val\n      },\n      ignoreList(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    methods: {\n      addWord() {\n        if (this.newWord && !this.ignoreList.includes(this.newWord.toLowerCase())) {\n          this.ignoreList.push(this.newWord.toLowerCase())\n        }\n        this.newWord = \"\"\n        setTimeout(() => this.$refs.input.focus(), 0)\n      },\n      load() {\n        Blockbench.import({\n          title: \"Load Ignore List\",\n          extensions: [\"json\"],\n          type: \"JSON\"\n        }, files => {\n          try {\n            const data = JSON.parse(files[0].content)\n            if (!Array.isArray(data) || data.some(e => typeof e !== \"string\")) {\n              throw new Error\n            }\n            this.ignoreList = Array.from(new Set(data.map(e => e.toLowerCase().trim())))\n          } catch {\n            Blockbench.showQuickMessage(\"Invalid ignore list\")\n          }\n        })\n      },\n      save() {\n        if (!this.ignoreList.length) {\n          Blockbench.showQuickMessage(\"The ignore list is empty\")\n          return\n        }\n        Blockbench.export({\n          extensions: [\"json\"],\n          type: \"JSON\",\n          name: \"ignore_list\",\n          content: JSON.stringify(this.ignoreList, null, 2)\n        }, () => Blockbench.showQuickMessage(\"Exported Ignore List\"))\n      }\n    },\n    styles: `\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n\n      > div {\n        display: flex;\n      }\n\n      input {\n        flex: 1;\n      }\n\n      ul {\n        background-color: var(--color-back);\n        border: 1px solid var(--color-border);\n        height: 128px;\n        overflow-y: auto;\n      }\n\n      li {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        justify-content: space-between;\n        padding-left: 8px;\n        background-color: var(--color-ui);\n\n        &:not(:first-child) {\n          margin-top: 1px;\n        }\n\n        button {\n          opacity: 0;\n        }\n\n        &:hover button {\n          opacity: 1;\n        }\n      }\n\n      .ignore-list-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: -8px;\n\n        h3 {\n          flex: 1;\n          margin: 0;\n        }\n\n        .tool {\n          margin: 0;\n          width: initial;\n          height: initial;\n          cursor: pointer;\n        }\n\n        i {\n          margin: 0;\n        }\n      }\n    `,\n    template: `\n      <div class=\"ignore-list-header\">\n        <h3>Ignore List</h3>\n        <div class=\"tool\" @click=\"load\">\n          <div class=\"tooltip\">Load Ignore List</div>\n          <i class=\"material-icons\">upload</i>\n        </div>\n        <div class=\"tool\" @click=\"save\">\n          <div class=\"tooltip\">Export Ignore List</div>\n          <i class=\"material-icons\">save</i>\n        </div>\n      </div>\n      <p>Files and folders that include these terms will<br>be ignored</p>\n      <div>\n        <input type=\"text\" placeholder=\"Enter term\" v-model=\"newWord\" ref=\"input\" @keydown.enter=\"addWord\">\n        <button class=\"material-icons\" @click=\"addWord\">add</button>\n      </div>\n      <ul>\n        <li v-for=\"(term, index) in ignoreList\" :key=\"index\">\n          <span>{{ term }}</span>\n          <button class=\"material-icons icon\" @click=\"ignoreList.splice(index, 1)\">close</button>\n        </li>\n      </ul>\n    `\n  },\n  outputLog: {\n    props: {\n      value: {},\n      small: {\n        type: Boolean\n      }\n    },\n    data() {\n      return {\n        logs: this.value,\n        waiting: false\n      }\n    },\n    watch: {\n      value(val) {\n        if (this.waiting) return\n        this.waiting = true\n        setTimeout(() => {\n          this.logs = val.slice()\n          this.waiting = false\n        }, 100)\n      },\n      logs() {\n        if (this.$refs.log.scrollTop >= this.$refs.log.scrollHeight - this.$refs.log.clientHeight) {\n          this.$nextTick(() => {\n            this.scrollToBottom()\n          })\n        }\n      }\n    },\n    methods: {\n      scrollToBottom() {\n        const container = this.$refs.log\n        container.scrollTop = container.scrollHeight\n      },\n      copy() {\n        navigator.clipboard.writeText(this.value.map(e => e[1]).join(\"\\n\\n\").replaceAll(\"`\", \"\"))\n        Blockbench.showQuickMessage(\"Log copied\")\n      },\n      save() {\n        Blockbench.export({\n          extensions: [\"log\"],\n          type: \"Log file\",\n          name: \"log\",\n          content: this.value.map(e => e[1]).join(\"\\n\\n\").replaceAll(\"`\", \"\")\n        }, () => Blockbench.showQuickMessage(\"Saved log\"))\n      }\n    },\n    mounted() {\n      const el = this.$refs.log\n      el.scrollTop = el.scrollHeight\n    },\n    styles: `\n      .log {\n        height: 256px;\n        overflow-y: auto;\n        overflow-x: hidden;\n        font-family: var(--font-code);\n        background-color: var(--color-back);\n        border: 1px solid var(--color-border);\n\n        > * {\n          user-select: text;\n          cursor: text;\n          white-space: pre-wrap;\n          max-width: 100%;\n          overflow-wrap: anywhere;\n          padding: 4px 4px 4px 24px;\n          position: relative;\n          font-size: 13px;\n\n          &:not(:last-child) {\n            border-bottom: 1px solid var(--color-border);\n          }\n\n          &::before {\n            content: \">\";\n            position: absolute;\n            left: 8px;\n          }\n\n          code {\n            background-color: var(--color-dark);\n            border-color: var(--color-dark);\n          }\n        }\n\n        .info {\n          background-color: color-mix(in srgb, var(--color-accent) 25%, transparent);\n        }\n\n        .warn {\n          background-color: color-mix(in srgb, var(--color-warning) 25%, transparent);\n        }\n\n        .error {\n          background-color: color-mix(in srgb, var(--color-error) 25%, transparent);\n        }\n\n        span {\n          color: var(--color-accent);\n          text-decoration: underline;\n          cursor: pointer; \n        }\n      }\n\n      .small {\n        height: 128px;\n      }\n\n      .buttons {\n        display: flex;\n        gap: 8px;\n        margin-top: 8px;\n\n        button {\n          flex: 1;\n        }\n      }\n    `,\n    template: `\n      <div class=\"log\" ref=\"log\" :class=\"{ small }\">\n        <div v-if=\"logs.length > 1000\" class=\"warning\">{{ (logs.length - 1000).toLocaleString() }} log entries are not displayed. <span @click=\"save\">Save Log</span> to see the full log</div>\n        <div v-for=\"(log, index) in logs.slice(-1000)\" :key=\"index\" :class=\"log[0]\" v-html=\"log[1].replace(/\\`([^\\`]*)\\`/g, '<code>$1</code>').replaceAll('\\uE000', '\\`')\"></div>\n      </div>\n      <div class=\"buttons\">\n        <button @click=\"copy\">\n          <i class=\"material-icons\">content_copy</i>\n          <span>Copy Log</span>\n        </button>\n        <button @click=\"save\">\n          <i class=\"material-icons\">save</i>\n          <span>Save Log</span>\n        </button>\n      </div>\n    `\n  },\n  progressBar: {\n    props: [\"done\", \"total\"],\n    data() {\n      return {\n        displayedDone: 0,\n        waiting: false\n      }\n    },\n    watch: {\n      done(val) {\n        if (this.waiting) return\n        this.waiting = true\n        setTimeout(() => {\n          this.displayedDone = this.done\n          this.waiting = false\n        }, 500)\n      }\n    },\n    computed: {\n      progressPercentage() {\n        if (!this.displayedDone) return 0\n        return Math.round(this.displayedDone / this.total * 100)\n      }\n    },\n    styles: `\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n\n      .progress-bar-container {\n        width: 100%;\n        height: 24px;\n        background-color: var(--color-back);\n        position: relative;\n      }\n\n      .progress-bar {\n        height: 100%;\n        background-color: var(--color-accent);\n        position: absolute;\n        top: 4px;\n        left: 4px;\n        height: 16px;\n        transition: width .5s ease;\n      }\n\n      div {\n        text-align: center;\n      }\n    `,\n    template: `\n      <div class=\"progress-text\">{{ total === null ? \"Loading…\" : displayedDone === total ? \"Finished\" : \"Processing…\" }}</div>\n      <div class=\"progress-bar-container\">\n        <div class=\"progress-bar\" :style=\"{ width: 'calc(' + progressPercentage + '% - 8px)' }\"></div>\n      </div>\n      <div v-if=\"typeof total === 'number' && total\">{{ displayedDone }} / {{ total }} - {{ progressPercentage }}%</div>\n      <div v-else>{{ progressPercentage }}%</div>\n    `\n  },\n  versionSelector: {\n    props: {\n      value: {},\n      width: {\n        default: 120\n      }\n    },\n    data() {\n      return {\n        version: this.value || manifest.versions.find(e => releasePattern.test(e.id))?.id,\n        snapshots: this.value ? !releasePattern.test(this.value) : false,\n        manifest,\n        releasePattern\n      }\n    },\n    watch: {\n      manifest: {\n        handler(val) {\n          if (this.value) return\n          if (this.snapshots) {\n            this.version = val.versions.find(e => !releasePattern.test(e.id)).id\n          } else {\n            this.version = val.versions.find(e => releasePattern.test(e.id)).id\n          }\n        },\n        deep: true\n      },\n      version: {\n        handler(val, oldVal) {\n          this.$emit(\"input\", val)\n        },\n        immediate: true\n      }\n    },\n    methods: {\n      change() {\n        this.version = this.manifest.versions.find(e => this.snapshots ? !releasePattern.test(e.id) : releasePattern.test(e.id)).id\n      }\n    },\n    styles: `\n      display: flex;\n      align-items: center;\n      gap: 8px;\n\n      .bb-select {\n        flex: 1;\n        min-width: 100px;\n      }\n\n      label {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        cursor: pointer;\n\n        * {\n          cursor: pointer;\n        }\n      }\n    `,\n    template: `\n      <div :style=\"{ width: width + 'px' }\">Minecraft Version:</div>\n      <select-input v-model=\"version\" :options=\"Object.fromEntries(manifest.versions.filter(e => snapshots ? !releasePattern.test(e.id) : releasePattern.test(e.id)).map(e => [e.id, e.id]))\" @input=\"$emit('update:version', version)\" />\n      <label>\n        <input type=\"checkbox\" v-model=\"snapshots\" @change=\"change\">\n        <div>Snapshots</div>\n      </label>\n    `\n  },\n  selectRow: {\n    props: [\"value\", \"options\", \"width\"],\n    watch: {\n      value(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    styles: `\n      display: flex;\n      gap: 8px;\n      align-items: center;\n\n      .bb-select {\n        flex: 1;\n      }\n    `,\n    template: `\n      <div :style=\"{ width: width ? width + 'px' : 'initial' }\"><slot></slot>:</div>\n      <select-input v-model=\"value\" :options=\"options\" />\n    `\n  },\n  fileInput: {\n    props: {\n      value: {},\n      type: {\n        default: \"PNG\",\n      },\n      extensions: {\n        default: [\"png\"]\n      },\n      multiple: {\n        type: Boolean\n      },\n      max: {},\n      title: {}\n    },\n    data() {\n      const maxFiles = parseInt(this.max)\n      const multipleFiles = this.multiple || parseInt(this.max) > 1\n      this.title ??= `Select ${ maxFiles ? \"up to \" + maxFiles : \"\" } ${ multipleFiles ? \"files\" : \"a file\" }`\n      return {\n        files: Array.isArray(this.value) ? this.value : this.value ? [this.value] : [],\n        message: `select or drop ${ maxFiles ? \"up to \" + maxFiles : \"\" } ${ multipleFiles ? \"files\" : \"a file\" }`,\n        maxFiles,\n        multipleFiles,\n        dragging: false\n      }\n    },\n    methods: {\n      async ingestFiles(files) {\n        if (!files.length) return\n        if (files.length === 1 && this.type === \"PNG\") this.message = \"change file\"\n        else if (files.length === 1) this.message = files[0].name\n        else this.message = `${files.length} files selected`\n        this.files = []\n        for (const [i, file] of files.entries()) {\n          if (this.maxFiles && i >= this.maxFiles) {\n            continue\n          }\n          const buf = file.content instanceof Buffer\n            ? file.content\n            : Buffer.from(file.content ?? await file.arrayBuffer())\n          const data = {}\n          if (this.type === \"PNG\") {\n            const b64Image = buf.toString(\"base64\")\n            const img = await loadImage(buf)\n            data.image = img\n            data.src = `data:image/png;base64,${b64Image}`\n            data.info = `${file.name}\\n${img.width.toLocaleString()}x${img.height.toLocaleString()} - ${formatBytes(buf.byteLength)}`\n          }\n          data.content = buf\n          data.path = file.path\n          data.name = file.name\n          this.files.push(data)\n        }\n        this.$emit(\"input\", Array.isArray(this.value) ? this.files : this.files[0])\n      },\n      async changeFiles() {\n        Blockbench.import({\n          title: this.title,\n          extensions: this.extensions,\n          type: this.type,\n          multiple: this.multipleFiles,\n          readtype: \"buffer\"\n        }, files => this.ingestFiles(files))\n      },\n      onDragOver(event) {\n        if (!event.dataTransfer?.types?.includes(\"Files\")) return\n        event.preventDefault()\n        event.stopPropagation()\n        this.dragging = true\n      },\n      onDragLeave(event) {\n        event.stopPropagation()\n        if (event.currentTarget.contains(event.relatedTarget)) return\n        this.dragging = false\n      },\n      async onDrop(event) {\n        event.preventDefault()\n        event.stopPropagation()\n        this.dragging = false\n        const dropped = Array.from(event.dataTransfer.files)\n        const exts = this.extensions.map(e => e.toLowerCase())\n        const filtered = dropped.filter(f => exts.some(e => f.name.toLowerCase().endsWith(\".\" + e)))\n        if (!filtered.length) return\n        await this.ingestFiles(this.multipleFiles ? filtered : filtered.slice(0, 1))\n      },\n      remove(index) {\n        event.stopPropagation()\n        this.files.splice(index, 1)\n        this.$emit(\"input\", Array.isArray(this.value) ? this.files : this.files[0])\n        if (!this.files.length) this.message = `select or drop ${ this.maxFiles ? \"up to \" + this.maxFiles : \"\" } ${ this.multipleFiles ? \"files\" : \"a file\" }`\n        else if (this.files.length === 1) this.message = \"change file\"\n        else this.message = `${this.files.length} files selected`\n      },\n      prev(index) {\n        const file = this.files[index - 1]\n        this.$set(this.files, index - 1, this.files[index])\n        this.$set(this.files, index, file)\n        this.$emit(\"input\", this.files)\n      },\n      next(index) {\n        const file = this.files[index + 1]\n        this.$set(this.files, index + 1, this.files[index])\n        this.$set(this.files, index, file)\n        this.$emit(\"input\", this.files)\n      }\n    },\n    styles: `\n      background-color: var(--color-back);\n      border: 1px solid var(--color-border);\n\n      > div.dragging {\n        outline: 2px dashed var(--color-accent);\n        outline-offset: -4px;\n      }\n\n      > div {\n        padding: 16px;\n        user-select: none;\n        position: relative;\n        text-shadow: none;\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        align-items: flex-start;\n\n        &:not(:has(.file-input-images:hover)):hover button {\n          background-color: var(--color-accent);\n          color: var(--color-accent_text);\n        }\n\n        &:not(:has(.file-input-images:focus)):focus button {\n          text-decoration: underline;\n        }\n      }\n\n      * {\n        cursor: pointer;\n      }\n\n      .file-input-row {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        max-width: 100%;\n      }\n\n      .file-input-text {\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n\n      .file-input-images {\n        display: flex;\n        gap: 8px;\n        overflow-x: auto;\n        position: relative;\n        z-index: 1;\n        margin: 0 -16px -16px;\n        padding: 0 16px 6px;\n        width: calc(100% + 32px);\n        cursor: default;\n        justify-content: safe center;\n\n        * {\n          cursor: default;\n        }\n\n        > div {\n          display: flex;\n          flex-direction: column;\n          font-size: 14px;\n          color: var(--color-subtle_text);\n          align-items: center;\n          gap: 4px;\n          white-space: pre;\n          text-align: center;\n          font-weight: 600;\n\n          &:first-child .prev {\n            display: none;\n          }\n\n          &:last-child .next {\n            display: none;\n          }\n        }\n      }\n\n      .file-image {\n        position: relative;\n        display: flex;\n\n        & img {\n          height: 128px;\n          display: block;\n        }\n\n        .icon {\n          position: absolute;\n          color: var(--color-light);\n          top: 64px;\n          transform: translateY(-50%);\n          cursor: pointer;\n          font-size: 32px;\n          min-width: 32px;\n          filter: drop-shadow(0 2px 3px #000);\n          opacity: 0;\n\n          &:hover {\n            transform: translateY(-50%) scale(1.4);\n          }\n        }\n\n        &:hover .icon {\n          opacity: 1;\n        }\n      }\n\n      .prev {\n        left: 0;\n      }\n\n      .next {\n        right: 0;\n      }\n\n      .remove {\n        top: 0 !important;\n        right: 0;\n        font-size: 24px !important;\n        padding: 4px;\n        transform: initial !important;\n\n        &:hover {\n          transform: scale(1.2) !important;\n        }\n      }\n    `,\n    template: `\n      <div @click=\"changeFiles\" tabindex=\"0\" :class=\"{ dragging }\" @dragover=\"onDragOver\" @dragleave=\"onDragLeave\" @drop=\"onDrop\">\n        <div class=\"file-input-row\">\n          <button>\n            <i class=\"material-icons icon\">upload</i>\n            <span>Choose file{{ multipleFiles ? 's' : '' }}</span>\n          </button>\n          <span class=\"file-input-text\">{{ this.message }}</span>\n        </div>\n        <div v-if=\"type === 'PNG' && files.length\" class=\"file-input-images\" tabindex=\"0\" @click.stop>\n          <div v-for=\"(file, index) in files\">\n            <div class=\"file-image\">\n              <img class=\"checkerboard\" :src=\"file.src\">\n              <i class=\"remove material-icons icon\" @click=\"remove(index)\">close</i>\n              <i class=\"prev material-icons icon\" @click=\"prev(index)\">navigate_before</i>\n              <i class=\"next material-icons icon\" @click=\"next(index)\">navigate_next</i>\n            </div>\n            <div>{{ file.info }}</div>\n          </div>\n        </div>\n      </div>\n    `\n  },\n  canvasOutput: {\n    props: {\n      value: {},\n      name: {\n        default: \"image\",\n      },\n      type: {\n        default: \"PNG\"\n      },\n      error: {},\n      height: {}\n    },\n    mounted() {\n      this.appendCanvas()\n    },\n    watch: {\n      value() {\n        this.appendCanvas()\n      },\n      error() {\n        this.appendCanvas()\n      }\n    },\n    methods: {\n      async appendCanvas() {\n        if (this.value) {\n          this.$refs.canvasContainer.textContent = \"\"\n          if (this.type === \"GIF\") {\n            const img = document.createElement(\"img\")\n            img.src = `data:image/gif;base64,${arrayBufferToBase64(this.value)}`\n            this.$refs.canvasContainer.append(img)\n            this.$refs.canvasInfo.textContent = `${this.name}.gif\\n${this.value[6] + (this.value[7] << 8)}x${this.value[8] + (this.value[9] << 8)} - ${formatBytes(this.value.length)}`\n          } else {\n            this.value.classList.add(\"checkerboard\")\n            if (this.height) {\n              this.value.style.height = this.height + \"px\"\n            }\n            this.$refs.canvasContainer.append(this.value)\n            this.$refs.canvasInfo.textContent = `${this.name}.png\\n${this.value.width}x${this.value.height} - ${formatBytes((await (await new Promise(fulfil => this.value.toBlob(fulfil))).arrayBuffer()).byteLength)}`\n          }\n        } else {\n          if (this.error) {\n            this.$refs.canvasContainer.innerHTML = `<span class=\"canvas-output-error\">${this.error}</span>`\n          } else {\n            this.$refs.canvasContainer.textContent = \"No output yet…\"\n          }\n          this.$refs.canvasInfo.textContent = \"\"\n        }\n      },\n      async copy() {\n        const r = await fetch(this.value.toDataURL())\n        navigator.clipboard.write([new ClipboardItem({ \"image/png\": await r.blob() })])\n        Blockbench.showQuickMessage(\"Copied to clipboard…\")\n      },\n      save() {\n        if (this.type === \"GIF\") {\n          Blockbench.export({\n            extensions: [\"gif\"],\n            type: \"GIF\",\n            name: this.name,\n            savetype: \"binary\",\n            content: this.value\n          }, () => Blockbench.showQuickMessage(\"Saved…\"))\n        } else {\n          Blockbench.export({\n            extensions: [this.type.toLowerCase()],\n            type: this.type,\n            name: this.name,\n            savetype: \"image\",\n            content: this.value.toDataURL()\n          }, () => Blockbench.showQuickMessage(\"Saved…\"))\n        }\n      }\n    },\n    styles: `\n      display: flex;\n      flex-direction: column;\n      gap: 8px !important;\n      flex: 1;\n\n      .canvas-container {\n        background-color: var(--color-back);\n        border: 1px solid var(--color-border);\n        padding: 16px;\n        font-size: 14px;\n        color: var(--color-subtle_text);\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        white-space: pre;\n        text-align: center;\n        gap: 4px;\n        font-weight: 600;\n\n        > :first-child {\n          overflow-x: auto;\n          max-width: 100%;\n        }\n\n        > :empty {\n          display: none;\n        }\n      }\n\n      canvas, img {\n        height: 256px;\n        display: block;\n      }\n\n      .canvas-output-error {\n        color: var(--color-error);\n      }\n    `,\n    template: `\n      <div class=\"canvas-container\" :style=\"{ paddingBottom: value ? '6px' : '16px' }\">\n        <div ref=\"canvasContainer\"></div>\n        <div ref=\"canvasInfo\"></div>\n      </div>\n      <div class=\"button-row\" @click=\"save\">\n        <button :disabled=\"!value\">\n          <i class=\"material-icons icon\">save</i>\n          <span>Save</span>\n        </button>\n        <button v-if=\"type !== 'GIF'\" :disabled=\"!value\" @click=\"copy\">\n          <i class=\"material-icons icon\">content_copy</i>\n          <span>Copy</span>\n        </button>\n      </div>\n    `\n  },\n  tabSelect: {\n    props: [\"value\", \"options\"],\n    watch: {\n      value(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    styles: `\n      li {\n        flex: 1 1 0px;\n      }\n    `,\n    template: `\n      <ul class=\"form_inline_select\">\n        <li v-for=\"(name, id) in options\" :class=\"{ selected: id === value }\" @click=\"value = id\">{{ name }}</li>\n      </ul>\n    `\n  },\n  numSlider: {\n    props: {\n      value: {},\n      min: {\n        default: 0\n      },\n      max: {\n        default: 100\n      },\n      step: {\n        default: 1\n      }\n    },\n    watch: {\n      value(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    template: `\n      <div class=\"bar slider_input_combo\">\n        <input type=\"range\" class=\"tool disp_range\" v-model.number=\"value\" :min=\"min\" :max=\"max\" :step=\"step\" />\n        <numeric-input class=\"tool disp_text\" v-model.number=\"value\" :min=\"min\" :max=\"max\" :step=\"step\" />\n      </div>\n    `\n  },\n  numInputRow: {\n    props: {\n      value: {},\n      min: {\n        default: 0\n      },\n      max: {\n        default: 100\n      },\n      step: {\n        default: 1\n      },\n      width: {}\n    },\n    watch: {\n      value(val) {\n        this.$emit(\"input\", val)\n      }\n    },\n    styles: `\n      display: flex;\n      gap: 8px;\n      align-items: center;\n    `,\n    template: `\n      <div :style=\"{ width: width ? width + 'px' : 'initial' }\"><slot></slot>:</div>\n      <numeric-input class=\"tool disp_text\" v-model.number=\"value\" :min=\"min\" :max=\"max\" :step=\"step\" />\n    `\n  },\n  searchBar: {\n    props: {\n      value: String,\n      placeholder: {\n        type: String,\n        default: \"Search…\"\n      },\n      autofocus: {\n        type: Boolean,\n        default: true\n      }\n    },\n    mounted() {\n      if (!this.autofocus) return\n      this.$nextTick(() => {\n        if (!this.$refs.search) return\n        this.$refs.search.focus()\n        this.$refs.search.selectionStart = this.$refs.search.value.length\n        this.$refs.search.selectionEnd = this.$refs.search.value.length\n      })\n    },\n    styles: `\n      .search_bar {\n        width: 100%;\n        display: flex;\n        float: initial;\n\n        input {\n          padding-right: 32px;\n          text-overflow: ellipsis;\n        }\n\n        i {\n          pointer-events: none;\n\n          &.active {\n            pointer-events: initial;\n            cursor: pointer;\n          }\n        }\n      }\n    `,\n    template: `\n      <div class=\"search_bar\">\n        <input type=\"text\" class=\"dark_bordered\" :placeholder=\"placeholder\" :value=\"value\" @input=\"$emit('input', $event.target.value)\" ref=\"search\">\n        <i :class=\"{ active: value }\" class=\"material-icons\" @click=\"$emit('input', ''); $refs.search.focus()\">{{ value ? \"clear\" : \"search\" }}</i>\n      </div>\n    `\n  }\n}\n\nconst utilities = {\n  jsonOptimiser: {\n    name: \"JSON Optimiser\",\n    icon: \"code\",\n    tagline: \"Optimise every JSON file in a folder.\",\n    description: \"JSON Optimiser is a tool that will go through all JSON files in a folder and optimise them to be as small as possible, minifying them and removing any unnecessary data.\",\n    info: `\n      <h3>Changes that JSON Optimiser makes:</h3>\n      <ul>\n        <li>Minifies <code>.json</code>, <code>.mcmeta</code>, <code>.jem</code>, and <code>.jpm</code> files</li>\n        <li>Removes default credits. Custom credits are kept</li>\n        <li>Removes unnecessary keys</li>\n        <li>Removes <code>minecraft:</code> prefixes</li>\n        <li>For block/item model <code>.json</code> files\n          <ul>\n            <li>Removes the <code>groups</code> object</li>\n            <li>For the <code>textures</code> object:\n              <ul>\n                <li>Removes the <code>force_translucent</code> property when it is set to <code>false</code></li>\n                <li>Collapses the object form to the string form when only <code>sprite</code> remains</li>\n              </ul>\n            </li>\n            <li>For the <code>rotation</code> object:\n              <ul>\n                <li>Removes the <code>rotation</code> object when <code>angle</code> is set to <code>0</code> (single-axis format)</li>\n                <li>Removes <code>x</code>, <code>y</code>, and <code>z</code> properties when they are set to <code>0</code> (Euler format)</li>\n                <li>Removes the <code>rotation</code> object when <code>x</code>, <code>y</code>, and <code>z</code> are all <code>0</code> or absent (Euler format)</li>\n                <li>Removes the <code>rescale</code> property when it is set to <code>false</code></li>\n              </ul>\n            </li>\n            <li>For the <code>faces</code> object:\n              <ul>\n                <li>Removes the <code>rotation</code> property when it is set to <code>0</code></li>\n                <li>Removes the <code>tintindex</code> property when it is set to <code>-1</code></li>\n                <li>Removes the <code>uv</code> property when it matches the auto-generated value from the element's <code>from</code>/<code>to</code> (only when <code>rotation</code> is unset)</li>\n                <li>Removes empty <code>face</code> objects</li>\n              </ul>\n            </li>\n            <li>Removes the <code>shade</code> property when it is set to <code>true</code></li>\n            <li>Removes the <code>light_emission</code> property when it is set to <code>0</code></li>\n            <li>Removes empty <code>elements</code> arrays</li>\n          </ul>\n        </li>\n        <li>For animation <code>.mcmeta</code> files\n          <ul>\n            <li>Removes the file when the texture it is for does not exist</li>\n            <li>Removes the <code>interpolate</code> property when it is set to<code>false</code></li>\n            <li>Removes the <code>frametime</code> property when it is set to<code>1</code></li>\n            <li>Removes the <code>width</code> property when the frames are square</li>\n            <li>Removes the <code>height</code> property when the frames are square</li>\n            <li>For the <code>frames</code> array\n              <ul>\n                <li>Removes the <code>time</code> property when it matches the main <code>frametime</code> property</li>\n                <li>Removes the <code>frames</code> array when all the frames are present, in order, and match the main <code>frametime</code> property</li>\n                <li>Changes most common <code>time</code> property to be the main <code>frametime</code> property, and makes old the main <code>frametime</code> property into the <code>time</code> properties</li>\n              </ul>\n            </li>\n          </ul>\n        </li>\n        <li>For OptiFine CEM <code>.jem</code>/<code>.jpm</code> files\n          <ul>\n            <li>Removes the <code>animations</code> array when it is empty</li>\n            <li>Removes the <code>translation</code> array when all axes are set to <code>0</code></li>\n            <li>Removes the <code>rotation</code> array when all axes are set to <code>0</code></li>\n            <li>Removes the <code>scale</code> property when it is set to <code>1</code></li>\n            <li>Removes empty <code>boxes</code> arrays</li>\n            <li>Removes empty <code>sprites</code> arrays</li>\n            <li>Removes empty <code>submodel</code> objects</li>\n            <li>Removes empty <code>submodels</code> arrays</li>\n          </ul>\n        </li>\n      </ul>\n    `,\n    component: {\n      data: {\n        folder: \"\",\n        types: {\n          json: true,\n          mcmeta: true,\n          jem: true,\n          jpm: true\n        },\n        prefixes: true,\n        minify: true,\n        ignoreList: [],\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run JSON Optimiser?\", `Are you sure you want to run JSON Optimiser over the following folder:\\n<code>${formatPath(this.folder)}</code>\\n\\nMake a backup first if you would like to keep an un-optimised version of the folder.`)) return\n\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const mcmetaKeys = [ \"credit\", \"animation\", \"villager\", \"texture\", \"pack\", \"language\", \"filter\", \"overlays\", \"gui\" ]\n          const animationKeys = [ \"interpolate\", \"width\", \"height\", \"frametime\", \"frames\" ]\n          const jemKeys = [ \"credit\", \"texture\", \"textureSize\", \"shadowSize\", \"models\" ]\n          const modelKeys = [ \"model\", \"id\", \"part\", \"attach\", \"scale\", \"animations\" ]\n          const partKeys = [ \"id\", \"texture\", \"textureSize\", \"invertAxis\", \"translate\", \"rotate\", \"mirrorTexture\", \"boxes\", \"sprites\", \"submodel\", \"submodels\" ]\n          const boxKeys = [ \"textureOffset\", \"uvDown\", \"uvUp\", \"uvNorth\", \"uvSouth\", \"uvWest\", \"uvEast\", \"coordinates\", \"sizeAdd\" ]\n          const spriteKeys = [ \"textureOffset\", \"coordinates\", \"sizeAdd\" ]\n          const elementKeys = [ \"from\", \"to\", \"rotation\", \"faces\", \"shade\", \"light_emission\" ]\n          const faceKeys = [ \"uv\", \"texture\", \"cullface\", \"rotation\", \"tintindex\" ]\n          modelKeys.push(...partKeys)\n\n          function processPart(part, rootMode) {\n            for (const key in part) {\n              if (!(rootMode ? partKeys.concat(modelKeys) : partKeys).includes(key)) delete part[key]\n            }\n            if (part.translate && part.translate.every(e => !e)) delete part.translate\n            if (part.rotate && part.rotate.every(e => !e)) delete part.rotate\n            if (part.scale === 1) delete part.scale\n            if (part.boxes) {\n              for (const box of part.boxes) {\n                for (const key in box) {\n                  if (!boxKeys.includes(key)) delete box[key]\n                }\n              }\n              part.boxes = part.boxes.filter(e => Object.keys(e).length)\n              if (!part.boxes.length) delete part.boxes\n            }\n            if (part.sprites) {\n              for (const sprite of part.sprites) {\n                for (const key in sprite) {\n                  if (!spriteKeys.includes(key)) delete sprite[key]\n                }\n              }\n              part.sprites = part.sprites.filter(e => Object.keys(e).length)\n              if (!part.sprites.length) delete part.sprites\n            }\n            if (part.submodel) {\n              processPart(part.submodel)\n              if (!Object.keys(part.submodel).length) delete part.submodel\n            }\n            if (part.submodels) {\n              for (const submodel of part.submodels) {\n                processPart(submodel)\n              }\n              part.submodels = part.submodels.filter(e => Object.keys(e).length)\n              if (!part.submodels.length) delete part.submodels\n            }\n          }\n\n          const files = []\n          for await (const file of getFiles(this.folder)) {\n            const shortened = formatPath(file.slice(this.folder.length)).replace(/^\\//, \"\")\n            if (\n              (file.endsWith(\".json\") && !this.types.json) ||\n              (file.endsWith(\".mcmeta\") && !this.types.mcmeta) ||\n              (file.endsWith(\".jem\") && !this.types.jem) ||\n              (file.endsWith(\".jpm\") && !this.types.jpm) ||\n              !(file.endsWith(\".json\") || file.endsWith(\".mcmeta\") || file.endsWith(\".jem\") || file.endsWith(\".jpm\")) ||\n              this.ignoreList.some(item => shortened.toLowerCase().includes(item))\n            ) continue\n            files.push([file, shortened])\n          }\n\n          this.total = files.length\n\n          let beforeTotal = 0\n          let afterTotal = 0\n\n          for (const [file, shortened] of files) {\n            if (this.cancelled) break\n            const before = (await fs.promises.stat(file)).size\n            beforeTotal += before\n            let data\n            try {\n              data = JSON.parse((await fs.promises.readFile(file, \"utf-8\")).trim())\n            } catch (err) {\n              output.error(`Skipping \\`${shortened}\\` as it could not be read`)\n              this.done++\n              continue\n            }\n            if (data.credit === \"Made with Blockbench\") delete data.credit\n            if (this.types.json && file.endsWith(\".json\")) {\n              delete data.groups\n              if (data.textures) {\n                for (const [key, value] of Object.entries(data.textures)) {\n                  if (value && typeof value === \"object\" && typeof value.sprite === \"string\") {\n                    if (value.force_translucent === false) delete value.force_translucent\n                    if (Object.keys(value).length === 1) data.textures[key] = value.sprite\n                  }\n                }\n              }\n              if (data.elements) {\n                for (const element of data.elements) {\n                  for (const key in element) {\n                    if (!elementKeys.includes(key)) delete element[key]\n                  }\n                  if (element.rotation) {\n                    const rot = element.rotation\n                    if (\"angle\" in rot) {\n                      if (rot.angle === 0) delete element.rotation\n                      else if (rot.rescale === false) delete rot.rescale\n                    } else {\n                      if (rot.x === 0) delete rot.x\n                      if (rot.y === 0) delete rot.y\n                      if (rot.z === 0) delete rot.z\n                      if (rot.x === undefined && rot.y === undefined && rot.z === undefined) {\n                        delete element.rotation\n                      } else if (rot.rescale === false) {\n                        delete rot.rescale\n                      }\n                    }\n                  }\n                  if (element.faces) {\n                    let autoUv\n                    if (Array.isArray(element.from) && Array.isArray(element.to) && element.from.length === 3 && element.to.length === 3) {\n                      const [x1, y1, z1] = element.from\n                      const [x2, y2, z2] = element.to\n                      autoUv = {\n                        down:  [x1, 16 - z2, x2, 16 - z1],\n                        up:    [x1, z1, x2, z2],\n                        north: [16 - x2, 16 - y2, 16 - x1, 16 - y1],\n                        south: [x1, 16 - y2, x2, 16 - y1],\n                        west:  [z1, 16 - y2, z2, 16 - y1],\n                        east:  [16 - z2, 16 - y2, 16 - z1, 16 - y1]\n                      }\n                    }\n                    for (const [key, face] of Object.entries(element.faces)) {\n                      for (const key in face) {\n                        if (!faceKeys.includes(key)) delete face[key]\n                      }\n                      if (face.rotation === 0) delete face.rotation\n                      if (face.tintindex === -1) delete face.tintindex\n                      if (\n                        autoUv && autoUv[key] && !face.rotation &&\n                        Array.isArray(face.uv) && face.uv.length === 4 &&\n                        face.uv.every((v, i) => v === autoUv[key][i])\n                      ) delete face.uv\n                      if (!Object.keys(face).length) delete element.faces[key]\n                    }\n                  }\n                  if (element.shade) delete element.shade\n                  if (element.light_emission === 0) delete element.light_emission\n                }\n                data.elements = data.elements.filter(e => e.faces && Object.keys(e.faces).length)\n                if (!data.elements.length) delete data.elements\n              }\n            }\n            if (this.types.mcmeta && file.endsWith(\".mcmeta\")) {\n              if (file.endsWith(\".png.mcmeta\")) {\n                if (!fs.existsSync(file.slice(0, -7))) {\n                  fs.rmSync(file)\n                  output.log(`\\`${shortened}\\`\\nBefore: ${formatBytes(before)}\\nAfter: 0 B`)\n                  this.done++\n                  continue\n                }\n              }\n              for (const key in data) {\n                if (!mcmetaKeys.includes(key)) delete data[key]\n              }\n              if (data.pack) {\n                for (const key in data.pack) {\n                  if (!(key === \"pack_format\" || key === \"min_format\" || key === \"max_format\" || key === \"supported_formats\" || key === \"description\")) delete data.pack[key]\n                }\n              } else if (data.animation) {\n                for (const key in data.animation) {\n                  if (!animationKeys.includes(key)) delete data.animation[key]\n                }\n                if (data.animation.interpolate === false) delete data.animation.interpolate\n                if (data.animation.frametime === 1) delete data.animation.frametime\n                if (data.animation.width && !data.animation.height) {\n                  const img = await loadImage(file.slice(0, -7))\n                  if (data.animation.width === img.height) delete data.animation.width\n                }\n                if (data.animation.height && !data.animation.width) {\n                  const img = await loadImage(file.slice(0, -7))\n                  if (data.animation.height === img.width) delete data.animation.height\n                }\n                if (data.animation.frames) {\n                  const frametime = data.animation.frametime ?? 1\n                  data.animation.frames = data.animation.frames.map(e => {\n                    if (e.time === frametime) return e.index\n                    return e\n                  })\n                  if (data.animation.frames.every((e, i) => e === i)) {\n                    const img = await loadImage(file.slice(0, -7))\n                    if (data.animation.frames.length === img.height / img.width) delete data.animation.frames\n                  } else {\n                    const times = new Map\n                    data.animation.frames.forEach(e => {\n                      if (typeof e === \"number\") {\n                        times.set(frametime, (times.get(frametime) ?? 0) + 1)\n                      } else {\n                        times.set(e.time, (times.get(e.time) ?? 0) + 1)\n                      }\n                    })\n                    const largest = Array.from(times).reduce((a, e) => {\n                      if (a[1] > e[1]) return a\n                      return e\n                    }, [1, 0])\n                    if (frametime !== largest[0]) {\n                      data.animation.frametime = largest[0]\n                      data.animation.frames = data.animation.frames.map(e => {\n                        if (typeof e === \"number\") return {\n                          index: e,\n                          time: frametime\n                        }\n                        if (e.time === largest[0]) return e.index\n                        return e\n                      })\n                    }\n                  }\n                }\n              }\n            }\n            if (this.types.jem && file.endsWith(\".jem\")) {\n              for (const key in data) {\n                if (!jemKeys.includes(key)) delete data[key]\n              }\n              if (data.models) {\n                for (const model of data.models) {\n                  for (const key in model) {\n                    if (!modelKeys.includes(key)) delete model[key]\n                  }\n                  if (!model.animations?.length) delete model.animations\n                  processPart(model, true)\n                }\n                data.models = data.models.map(e => {\n                  if (e.boxes || e.submodel || e.submodels || e.model || e.sprites) return e\n                  return { part: e.part }\n                })\n                if (!data.models.length) {\n                  for (const key in data) delete data[key]\n                }\n              }\n            }\n            if (this.types.jpm && file.endsWith(\".jpm\")) {\n              processPart(data)\n            }\n            let out\n            if (this.minify) {\n              out = JSON.stringify(data)\n            } else {\n              out = compileJSON(data, { indentation: \"  \" })\n            }\n            if (this.prefixes) {\n              out = out.replace(/(?<![a-z0-9])minecraft:/g, \"\")\n            }\n            await fs.promises.writeFile(file, out, \"utf-8\")\n            const after = (await fs.promises.stat(file)).size\n            afterTotal += after\n            output.log(`\\`${shortened}\\`\\nBefore: ${formatBytes(before)}\\nAfter: ${formatBytes(after)}`)\n            this.done++\n          }\n          this.total = this.done\n          output.info(`Compressed ${this.total} files\\nBefore: ${formatBytes(beforeTotal)}\\nAfter: ${formatBytes(afterTotal)}\\nSaved: ${formatBytes(beforeTotal - afterTotal)}`)\n          this.status.processing = false\n          this.status.finished = true\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Folder to Optimise:</h3>\n              <folder-selector v-model=\"folder\">folder to optimise the JSON of</folder-selector>\n              <checkbox-row v-model=\"types.json\">Optimise <code>.json</code> files</checkbox-row>\n              <checkbox-row v-model=\"types.mcmeta\">Optimise <code>.mcmeta</code> files</checkbox-row>\n              <checkbox-row v-model=\"types.jem\">Optimise <code>.jem</code> files</checkbox-row>\n              <checkbox-row v-model=\"types.jpm\">Optimise <code>.jpm</code> files</checkbox-row>\n              <checkbox-row v-model=\"prefixes\" style=\"margin-top: 0;\">Remove <code>minecraft:</code> prefixes</checkbox-row>\n              <checkbox-row v-model=\"minify\" style=\"margin-top: 0;\">Minify output</checkbox-row>\n            </div>\n            <ignore-list v-model=\"ignoreList\" />\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Optimise</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  citOptimiser: {\n    name: \"CIT Optimiser\",\n    icon: \"coffee\",\n    tagline: \"Optimise the OptiFine CIT properties files in a folder.\",\n    description: \"CIT Optimiser is a tool that will go through all properties files in an OptiFine CIT folder and optimise them to be as small as possible, removing any unnecessary data.\",\n    info: `\n      <h3>Changes that CIT Optimiser makes:</h3>\n      <ul>\n        <li>Removes the <code>type=item</code> property</li>\n        <li>Replaces <code>matchItems</code> with <code>items</code></li>\n        <li>Removes the <code>minecraft:</code> prefix</li>\n        <li>Removes blank lines</li>\n      </ul>\n    `,\n    component: {\n      data: {\n        folder: \"\",\n        ignoreList: [],\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run CIT Optimiser?\", `Are you sure you want to run CIT Optimiser over the following folder:\\n<code>${formatPath(this.folder)}</code>\\n\\nMake a backup first if you would like to keep an un-optimised version of the folder.`)) return\n\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const files = []\n          for await (const file of getFiles(this.folder)) {\n            const shortened = formatPath(file.slice(this.folder.length)).replace(/^\\//, \"\")\n            if (\n              !file.endsWith(\".properties\") ||\n              this.ignoreList.some(item => shortened.toLowerCase().includes(item))\n            ) continue\n            files.push([file, shortened])\n          }\n\n          this.total = files.length\n\n          let beforeTotal = 0\n          let afterTotal = 0\n\n          for (const [file, shortened] of files) {\n            if (this.cancelled) break\n            const before = (await fs.promises.stat(file)).size\n            beforeTotal += before\n            let data\n            try {\n              data = (await fs.promises.readFile(file, \"utf-8\")).trim()\n            } catch (err) {\n              output.error(`Skipping \\`${shortened}\\` as it could not be read`)\n              this.done++\n              continue\n            }\n            data = data.replace(/(type=item\\n?|minecraft:)/g, \"\")\n            data = data.replace(/matchItems/g, \"items\")\n            data = data.replace(/\\n{2,}/g, \"\\n\")\n            await fs.promises.writeFile(file, data, \"utf-8\")\n            const after = (await fs.promises.stat(file)).size\n            afterTotal += after\n            output.log(`\\`${shortened}\\`\\nBefore: ${formatBytes(before)}\\nAfter: ${formatBytes(after)}`)\n            this.done++\n          }\n          this.total = this.done\n          output.info(`Compressed ${this.total} files\\nBefore: ${formatBytes(beforeTotal)}\\nAfter: ${formatBytes(afterTotal)}\\nSaved: ${formatBytes(beforeTotal - afterTotal)}`)\n          this.status.processing = false\n          this.status.finished = true\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Folder to Optimise:</h3>\n              <folder-selector v-model=\"folder\">folder to optimise the CIT properties files of</folder-selector>\n            </div>\n            <ignore-list v-model=\"ignoreList\" style=\"align-self: flex-start;\" />\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Optimise</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  packCreator: {\n    name: \"Pack Creator\",\n    icon: \"create_new_folder\",\n    tagline: \"Create template resource packs and get the vanilla assets.\",\n    description: \"Pack Creator is a tool that allows you to create template resource packs, as well as get the vanilla textures, models, sounds, etc…\",\n    component: {\n      data: {\n        folder: \"\",\n        name: \"\",\n        description: \"\",\n        attemptedStart: false,\n        assets: false,\n        objects: false,\n        create: {\n          blockstates: false,\n          models: false,\n          optifine: false,\n          textures: false,\n          sounds: false,\n          emissive: false\n        },\n        cancelled: false,\n        outputLog,\n        version: \"\",\n        done: 0,\n        total: null\n      },\n      created() {\n        this.folder = formatPath(PathModule.join(settings.ewan_minecraft_directory.value, \"resourcepacks\"))\n      },\n      methods: {\n        async execute() {\n          this.name = this.name.trim()\n          this.description = this.description.trim()\n          if (!this.name) {\n            return this.attemptedStart = true\n          }\n          if (this.assets) {\n            await showMessage(\"Vanilla assets notice\", \"The vanilla assets are only to be used as a template!\\n\\nBefore releasing your resource pack, make sure to remove any unmodified vanilla assets from your resource pack.\\n\\nYou can use the <code>Pack Cleaner</code> utility to quickly and easily remove all unmodified assets from your pack.\")\n          }\n          outputLog.length = 0\n          this.done = 0\n          this.total = null\n          if (invalidDirPattern.test(this.name)) {\n            output.error(`The name cannot include the following characters: \\`\\\\\\/:*?\"<>|\\uE000\\``)\n            this.status.finished = true\n            this.total = 0\n            return\n          }\n          if (!await exists(this.folder)) {\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            this.status.finished = true\n            this.total = 0\n            return\n          }\n          const folder = PathModule.join(this.folder, this.name)\n          if (await exists(folder)) {\n            output.error(`The resource pack \\`${formatPath(this.folder)}/${this.name}\\` already exists`)\n            this.status.finished = true\n            this.total = 0\n            return\n          }\n          this.cancelled = false\n          this.status.finished = false\n          this.status.processing = true\n          const jar = await getVersionJar(this.version)\n          if (this.assets) {\n            output.log(\"Extracting vanilla assets…\")\n            const entries = Object.entries(jar.files)\n            let totalAssets = entries.length\n            let objectsEntries\n            if (this.objects) {\n              const assetsIndex = await getVersionAssetsIndex(this.version)\n              objectsEntries = Object.entries(assetsIndex.objects)\n              totalAssets += objectsEntries.length\n            }\n            this.total = totalAssets + Object.values(this.create).filter(e => e).length + 3\n            const paths = new Set\n            for (const [file, data] of entries) {\n              paths.add(PathModule.join(folder, PathModule.dirname(file)))\n            }\n            for (const path of paths) {\n              await fs.promises.mkdir(path, { recursive: true })\n            }\n            for (let i = 0; i < entries.length; i += 256) {\n              if (this.cancelled) {\n                this.status.finished = true\n                this.status.processing = false\n                output.info(\"Cancelled\")\n                this.total = this.done\n                return\n              }\n              const files = []\n              for (const [file, data] of entries.slice(i, i + 256)) {\n                if (file === \"version.json\" || file === \"pack.mcmeta\") {\n                  this.done++\n                  continue\n                }\n                files.push(new Promise(async fulfil => {\n                  await fs.promises.writeFile(PathModule.join(folder, file), data.content)\n                  output.log(`Extracted \\`${file}\\``)\n                  this.done++\n                  fulfil()\n                }))\n              }\n              await Promise.all(files)\n            }\n            output.log(\"Extracted vanilla assets\")\n            if (this.objects) {\n              output.log(\"Extracting objects…\")\n              const root = getRoot(this.version)\n              const paths = new Set\n              for (const [file, data] of objectsEntries) {\n                if (file.startsWith(\"icons/\")) continue\n                paths.add(PathModule.join(folder, root, PathModule.dirname(file)))\n              }\n              for (const path of paths) {\n                await fs.promises.mkdir(path, { recursive: true })\n              }\n              for (let i = 0; i < objectsEntries.length; i += 256) {\n                if (this.cancelled) {\n                  this.status.finished = true\n                  this.status.processing = false\n                  output.info(\"Cancelled\")\n                  this.total = this.done\n                  return\n                }\n                const files = []\n                for (const [file, data] of objectsEntries.slice(i, i + 256)) {\n                  if (file === \"pack.mcmeta\" || file.startsWith(\"icons/\")) {\n                    this.done++\n                    continue\n                  }\n                  files.push(new Promise(async fulfil => {\n                    const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n                    const packPath = PathModule.join(this.folder, this.name, root, file)\n                    const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n                    if (await exists(vanillaObjectPath)) {\n                      await fs.promises.copyFile(vanillaObjectPath, packPath)\n                      output.log(`Extracted \\`${root}/${file}\\``)\n                    } else {\n                      const cacheObjectPath = PathModule.join(cacheDir, \"objects\", objectPath)\n                      if (await exists(cacheObjectPath)) {\n                        await fs.promises.copyFile(cacheObjectPath, packPath)\n                        output.log(`Extracted \\`${root}/${file}\\``)\n                      } else {\n                        const object = new Uint8Array(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer()))\n                        await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true })\n                        await fs.promises.writeFile(cacheObjectPath, object)\n                        await fs.promises.writeFile(packPath, object)\n                        output.log(`Downloaded \\`${root}/${file}\\``)\n                      }\n                    }\n                    this.done++\n                    fulfil()\n                  }))\n                }\n                await Promise.all(files)\n              }\n              output.log(\"Extracted objects\")\n            }\n          }\n          if (this.total === null) {\n            this.total = Object.values(this.create).filter(e => e).length + 3\n          }\n          if (!await exists(PathModule.join(folder, \"assets/minecraft\"))) {\n            await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft\"), { recursive: true })\n            output.log(`Created pack directory \\`${formatPath(folder)}\\``)\n          }\n          this.done++\n          if (this.create.blockstates) {\n            if (!await exists(PathModule.join(folder, \"assets/minecraft/blockstates\"))) {\n              await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft/blockstates\"), { recursive: true })\n              output.log(\"Created folder `assets/minecraft/blockstates`\")\n            }\n            this.done++\n          }\n          if (this.create.models) {\n            if (!await exists(PathModule.join(folder, \"assets/minecraft/models\"))) {\n              await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft/models\"), { recursive: true })\n              output.log(\"Created folder `assets/minecraft/models`\")\n            }\n            this.done++\n          }\n          if (this.create.optifine) {\n            await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft/optifine\"), { recursive: true })\n            output.log(\"Created folder `assets/minecraft/optifine`\")\n            this.done++\n          }\n          if (this.create.textures) {\n            if (!await exists(PathModule.join(folder, \"assets/minecraft/textures\"))) {\n              await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft/textures\"), { recursive: true })\n              output.log(\"Created folder `assets/minecraft/textures`\")\n            }\n            this.done++\n          }\n          if (this.create.sounds) {\n            if (!await exists(PathModule.join(folder, \"assets/minecraft/sounds\"))) {\n              await fs.promises.mkdir(PathModule.join(folder, \"assets/minecraft/sounds\"), { recursive: true })\n              output.log(\"Created folder `assets/minecraft/sounds`\")\n            }\n            this.done++\n          }\n          if (this.create.emissive) {\n            await fs.promises.writeFile(PathModule.join(folder, \"assets/minecraft/optifine/emissive.properties\"), \"suffix.emissive=_e\", \"utf-8\")\n            output.log(\"Created file `assets/minecraft/optifine/emissive.properties`\")\n            this.done++\n          }\n          let packFormat\n          const mcmeta = {\n            pack: {\n              description: this.description || \"Template Resource Pack\",\n              pack_format: packFormat\n            }\n          }\n          if (jar.files[\"version.json\"]) {\n            const data = JSON.parse(jar.files[\"version.json\"].content)\n            if (typeof data.pack_version === \"number\") {\n              mcmeta.pack.pack_format = data.pack_version.resource\n            } else if (data.pack_version.resource) {\n              mcmeta.pack.pack_format = data.pack_version.resource\n            } else {\n              mcmeta.pack.min_format = data.pack_version.resource_major\n              mcmeta.pack.max_format = data.pack_version.resource_major\n            }\n          } else if (jar.files[\"pack.mcmeta\"]) {\n            mcmeta.pack.pack_format = JSON.parse(jar.files[\"pack.mcmeta\"].content).pack.pack_format\n          } else if (this.version.startsWith(\"1.9\") || this.version.startsWith(\"1.10\") || this.version.startsWith(\"15w\")) {\n            mcmeta.pack.pack_format = 2\n          } else if (this.version.startsWith(\"1.11\") || this.version.startsWith(\"1.12\") || this.version.startsWith(\"16w\") || this.version.startsWith(\"17w\")) {\n            mcmeta.pack.pack_format = 3\n          } else {\n            mcmeta.pack.pack_format = 1\n          }\n          await fs.promises.writeFile(PathModule.join(folder, \"pack.mcmeta\"), JSON.stringify(mcmeta, null, 2), \"utf-8\")\n          output.log(\"Created file `pack.mcmeta`\")\n          this.done++\n          if (!await exists(PathModule.join(folder, \"pack.png\"))) {\n            await fs.promises.writeFile(PathModule.join(folder, \"pack.png\"), \"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\", { encoding: \"base64\" })\n            output.log(\"Created `pack.png`\")\n          }\n          this.done++\n          output.info(`Created template resource pack \\`${this.name}\\``)\n          this.status.processing = false\n          this.status.finished = true\n        },\n        assetsToggle() {\n          if (!this.vanillaAssets) {\n            this.objects = false\n          }\n        },\n        optifineToggle() {\n          if (!this.create.optifine) {\n            this.create.emissive = false\n          }\n        },\n        emissiveToggle() {\n          if (this.create.emissive) {\n            this.create.optifine = true\n          }\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Output Location:</h3>\n              <folder-selector v-model=\"folder\">folder to output the resource pack to</folder-selector>\n              <input-row v-model=\"name\" placeholder=\"Enter name…\" width=\"120\" :required=\"attemptedStart && !name.length\">Pack Name</input-row>\n              <input-row v-model=\"description\" placeholder=\"Enter description…\" width=\"120\">Pack Description</input-row>\n              <version-selector v-model=\"version\" />\n              <checkbox-row v-model=\"assets\" @input=\"assetsToggle\">Import vanilla assets</checkbox-row>\n              <checkbox-row v-model=\"objects\" :disabled=\"!assets\">Also include objects (sounds, languages, panorama, etc…)</checkbox-row>\n            </div>\n            <div class=\"col\">\n              <h3>Create Folders:</h3>\n              <checkbox-row v-model=\"create.blockstates\">blockstates</checkbox-row>\n              <checkbox-row v-model=\"create.models\">models</checkbox-row>\n              <checkbox-row v-model=\"create.optifine\" @input=\"optifineToggle\">optifine</checkbox-row>\n              <checkbox-row v-model=\"create.textures\">textures</checkbox-row>\n              <checkbox-row v-model=\"create.sounds\">sounds</checkbox-row>\n              <h3>Create Files:</h3>\n              <checkbox-row v-model=\"create.emissive\" @input=\"emissiveToggle\">emissive.properties</checkbox-row>\n            </div>\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Create</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  packCleaner: {\n    name: \"Pack Cleaner\",\n    icon: \"mop\",\n    tagline: \"Remove unmodified vanilla assets from a resource pack.\",\n    description: \"Pack Cleaner is a tool that will go through all the files in a resource pack and compare them against the vanilla assets, removing them if they are unmodified.\",\n    component: {\n      data: {\n        folder: \"\",\n        ignoreList: [],\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        version: \"\",\n        objects: false\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run Pack Cleaner?\", `Are you sure you want to run Pack Cleaner over the following resource pack:\\n<code>${formatPath(this.folder)}</code>\\n\\nMake a backup first if you would like to keep an un-altered version of the resource pack.`)) return\n          \n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The resource pack \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const jar = await getVersionJar(this.version)\n\n          const files = []\n          for await (const file of getFiles(this.folder)) {\n            const shortened = formatPath(file.slice(this.folder.length)).replace(/^\\//, \"\")\n            if (\n              shortened === \"pack.mcmeta\" ||\n              shortened === \"pack.png\" ||\n              this.ignoreList.some(item => shortened.toLowerCase().includes(item))\n            ) continue\n            files.push([file, shortened])\n          }\n\n          this.total = files.length\n\n          let removed = 0\n\n          async function checkFile(file, shortened, fileBuffer, assetBuffer) {\n            try {\n              let remove\n              if (file.endsWith(\".json\")) {\n                if (fileBuffer.equals(assetBuffer)) {\n                  remove = true\n                } else {\n                  const fileData = JSON.parse(fileBuffer)\n                  const assetData = JSON.parse(assetBuffer)\n                  if (objectsEqual(fileData, assetData)) {\n                    remove = true\n                  }\n                }\n              } else if (file.endsWith(\".png.mcmeta\")) {\n                if (!await exists(file.slice(0, -7))) {\n                  try {\n                    await fs.promises.unlink(file)\n                    output.log(`Removed \\`${shortened}\\``)\n                    removed++\n                  } catch {}\n                }\n              } else if (file.endsWith(\".png\")) {\n                if (fileBuffer.equals(assetBuffer)) {\n                  remove = true\n                } else if (fileBuffer.readUint32BE(16) === assetBuffer.readUint32BE(16) && fileBuffer.readUint32BE(20) === assetBuffer.readUint32BE(20)) {\n                  const fileImg = await loadImage(fileBuffer)\n                  const assetImg = await loadImage(assetBuffer)\n                  const fileCanvas = new Canvas(fileImg.width, fileImg.height)\n                  const assetCanvas = new Canvas(assetImg.width, assetImg.height)\n                  fileCanvas.ctx.drawImage(fileImg, 0, 0)\n                  assetCanvas.ctx.drawImage(assetImg, 0, 0)\n                  fileImgData = fileCanvas.ctx.getImageData(0, 0, fileImg.width, fileImg.height).data\n                  assetImgData = assetCanvas.ctx.getImageData(0, 0, assetImg.width, assetImg.height).data\n                  let same = true\n                  for (let i = fileImgData.length - 1; i >= 0; i--) {\n                    same &&= fileImgData[i] === assetImgData[i]\n                  }\n                  if (same) {\n                    const mcmeta = file + \".mcmeta\"\n                    const mcmetaShortened = shortened + \".mcmeta\"\n                    if (await exists(mcmeta)) {\n                      if (mcmetaShortened in jar.files) {\n                        const mcmetaBuffer = await fs.promises.readFile(mcmeta)\n                        let removeMcmeta\n                        if (mcmetaBuffer.equals(jar.files[mcmetaShortened].content)) {\n                          removeMcmeta = true\n                        } else {\n                          const mcmetaFile = JSON.parse(mcmetaBuffer)\n                          const mcmetaAsset = JSON.parse(jar.files[mcmetaShortened].content)\n                          if (objectsEqual(mcmetaFile, mcmetaAsset)) {\n                            remove = true\n                            removeMcmeta = true\n                          }\n                        }\n                        if (removeMcmeta) {\n                          await fs.promises.unlink(mcmeta)\n                          output.log(`Removed \\`${mcmetaShortened}\\``)\n                          removed++\n                        }\n                      }\n                    } else if (!(mcmetaShortened in jar.files)) {\n                      remove = true\n                    }\n                  }\n                }\n              } else if (simpleFilePattern.test(file) && fileBuffer.equals(assetBuffer)) {\n                remove = true\n              }\n              if (remove) {\n                try {\n                  await fs.promises.unlink(file)\n                  output.log(`Removed \\`${shortened}\\``)\n                  removed++\n                } catch {}\n              }\n            } catch {\n              output.error(`Failed to process \\`${shortened}\\`, skipping…`)\n            }\n          }\n\n          const objectsFiles = {}\n          if (this.objects) {\n            const assetsIndex = await getVersionAssetsIndex(this.version)\n            const entries = Object.entries(assetsIndex.objects)\n            const version = getVersion(this.version)\n            let root\n            if (Date.parse(version.releaseTime) >= 1403106748000 || version.data.assets === \"1.7.10\") {\n              root = \"assets\"\n            } else {\n              root = \"assets/minecraft\"\n            }\n            for (let i = 0; i < entries.length; i += 256) {\n              if (this.cancelled) {\n                this.status.finished = true\n                this.status.processing = false\n                output.info(\"Cancelled\")\n                this.total = this.done\n                return\n              }\n              const downloads = []\n              for (const [file, data] of entries.slice(i, i + 256)) {\n                if (file === \"pack.mcmeta\") continue\n                downloads.push(new Promise(async fulfil => {\n                  const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n                  const assetPath = `${root}/${file}`\n                  const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n                  if (await exists(vanillaObjectPath)) {\n                    objectsFiles[assetPath] = vanillaObjectPath\n                  } else {\n                    const cacheObjectPath = PathModule.join(cacheDir, \"objects\", objectPath)\n                    if (!await exists(cacheObjectPath)) {\n                      const object = new Uint8Array(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer()))\n                      await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true })\n                      await fs.promises.writeFile(cacheObjectPath, object)\n                      output.log(`Downloaded \\`${root}/${file}\\` to the cache`)\n                    }\n                    objectsFiles[assetPath] = cacheObjectPath\n                  }\n                  fulfil()\n                }))\n              }\n              await Promise.all(downloads)\n            }\n          }\n\n          for (const [file, shortened] of files) {\n            if (this.cancelled) break\n            if (!await exists(file)) continue\n            if (shortened in objectsFiles) {\n              await checkFile(file, shortened, await fs.promises.readFile(file), await fs.promises.readFile(objectsFiles[shortened]))\n            } else if (shortened in jar.files) {\n              await checkFile(file, shortened, await fs.promises.readFile(file), jar.files[shortened].content)\n            }\n            this.done++\n          }\n\n          const deleteEmptyFolders = async folderPath => {\n            try {\n              const entries = await fs.promises.readdir(folderPath, { withFileTypes: true })\n              for (const entry of entries) {\n                const fullPath = PathModule.join(folderPath, entry.name)\n                if (entry.isDirectory()) {\n                  await deleteEmptyFolders(fullPath)\n                  if ((await fs.promises.readdir(fullPath)).length === 0) {\n                    await fs.promises.rmdir(fullPath)\n                    output.log(`Deleted empty folder \\`${formatPath(fullPath.slice(this.folder.length)).replace(/^\\//, \"\")}\\``)\n                  }\n                }\n              }\n            } catch {}\n          }\n\n          await deleteEmptyFolders(this.folder)\n\n          this.total = this.done\n          output.info(`Removed ${removed} files`)\n          this.status.processing = false\n          this.status.finished = true\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Resource Pack to Clean:</h3>\n              <folder-selector v-model=\"folder\" placeholder=\"Resource Pack\">resource pack to clean the contents of</folder-selector>\n              <version-selector v-model=\"version\" />\n              <checkbox-row v-model=\"objects\">Also clean objects (sounds, languages, panorama, etc…)</checkbox-row>\n            </div>\n            <ignore-list v-model=\"ignoreList\" />\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Clean</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  langStripper: {\n    name: \"Lang Stripper\",\n    icon: \"translate\",\n    tagline: \"Remove all unedited entries from the Minecraft language files.\",\n    description: \"Lang Stripper is a tool that will go through all the language files in an resource pack and remove any entries that have not been modified.\",\n    component: {\n      data: {\n        folder: \"\",\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        mode: \"default\",\n        version: \"\"\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run Lang Stripper?\", `Are you sure you want to run Lang Stripper over the following resource pack:\\n<code>${formatPath(this.folder)}</code>\\n\\nMake a backup first if you would like to keep an un-stripped version of the language files.`)) return\n\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The resource pack \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const langPath = PathModule.join(this.folder, \"assets\", \"minecraft\", \"lang\")\n          if (!await exists(langPath)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(\"The `assets/minecraft/lang` folder was not found\")\n            return\n          }\n\n          const removed = []\n\n          const processFile = async (type, filePath, assetPath, assetBuffer) => {\n            try {\n              const file = await fs.promises.readFile(filePath, \"utf-8\")\n              const asset = assetBuffer.toString()\n              let fileData, assetData\n              if (type === \".json\") {\n                fileData = JSON.parse(file)\n                assetData = JSON.parse(asset)\n              } else {\n                fileData = langToJSON(file)\n                assetData = langToJSON(asset)\n              }\n              let changes = 0\n              for (const key in fileData) {\n                if (fileData[key] === assetData[key]) {\n                  delete fileData[key]\n                  removed.push(`Removed \\`${key}\\` from \\`${assetPath}\\``)\n                  changes++\n                }\n              }\n              output.log(`Processed \\`${assetPath}\\`: Stripped \\`${removed.length}\\` entries`)\n              if (changes) {\n                if (type === \".json\") {\n                  await fs.promises.writeFile(filePath, JSON.stringify(fileData, null, 2))\n                } else {\n                  await fs.promises.writeFile(filePath, jsonToLang(fileData))\n                }\n              }\n            } catch {\n              output.error(`Skipping \\`${assetPath}\\` as it could not be read`)\n            }\n            this.done++\n          }\n\n          const jar = await getVersionJar(this.version)\n          let langs, assetsIndex, root\n          if (this.mode === \"default\") {\n            this.total = 1\n          } else {\n            assetsIndex = await getVersionAssetsIndex(this.version)\n            const files = await listFiles(langPath)\n            root = getRoot(this.version)\n            const extension = PathModule.extname(Object.keys(assetsIndex.objects).find(e => e.startsWith(\"assets/minecraft/lang/\".slice(root.length + 1))))\n            langs = files.filter(e => assetsIndex.objects[`assets/minecraft/lang/${e}`.slice(root.length + 1)] || (e.toLowerCase().startsWith(\"en_us.\") && e.endsWith(extension)))\n            if (langs.length === 0) {\n              this.status.finished = true\n              this.status.processing = false\n              this.total = 0\n              output.error(`No valid \\`${this.version}\\` language files were found in \\`assets/minecraft/lang\\``)\n              return\n            }\n            this.total = langs.length\n          }\n\n          const enUS = \"assets/minecraft/lang/en_us.json\" in jar.files ? \"assets/minecraft/lang/en_us.json\" : \"assets/minecraft/lang/en_us.lang\" in jar.files ? \"assets/minecraft/lang/en_us.lang\" : \"assets/minecraft/lang/en_US.lang\"\n\n          const enUSFile = PathModule.join(this.folder, enUS)\n\n          if (await exists(enUSFile)) {\n            await processFile(PathModule.extname(enUS), enUSFile, enUS, jar.files[enUS].content)\n          } else if (this.mode === \"default\") {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The language file \\`${enUS}\\` was not found`)\n            return\n          }\n\n          if (this.mode === \"all\") {\n            async function getLang(lang, langPath) {\n              const data = assetsIndex.objects[langPath.slice(root.length + 1)]\n              const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n              const vanillaObjectPath = PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n              if (await exists(vanillaObjectPath)) {\n                return fs.promises.readFile(vanillaObjectPath)\n              }\n              const cacheObjectPath = PathModule.join(cacheDir, \"objects\", objectPath)\n              if (await exists(cacheObjectPath)) {\n                return fs.promises.readFile(cacheObjectPath)\n              }\n              const object = Buffer.from(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(e => e.arrayBuffer()))\n              await fs.promises.mkdir(PathModule.dirname(cacheObjectPath), { recursive: true })\n              await fs.promises.writeFile(cacheObjectPath, object)\n              output.log(`Downloaded \\`${langPath}\\` to the cache`)\n              return object\n            }\n\n            for (const lang of langs) {\n              if (this.cancelled) {\n                this.status.finished = true\n                this.status.processing = false\n                output.info(\"Cancelled\")\n                this.total = this.done\n                return\n              }\n              if (lang.toLowerCase().startsWith(\"en_us.\")) continue\n              const langPath = `assets/minecraft/lang/${lang}`\n              await processFile(PathModule.extname(lang), PathModule.join(this.folder, langPath), langPath, await getLang(lang, langPath))\n            }\n          }\n\n          for (const remove of removed) {\n            output.log(remove)\n          }\n\n          output.info(\"Finished\")\n          this.status.finished = true\n          this.status.processing = false\n        }\n      },\n      styles: `\n        .component-versionSelector {\n          align-self: flex-start;\n        }\n      `,\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <h3>Resource Pack to Strip:</h3>\n          <folder-selector v-model=\"folder\" placeholder=\"Resource Pack\">resource pack to strip the language files of</folder-selector>\n          <version-selector v-model=\"version\" />\n          <radio-row v-model=\"mode\" :options=\"[['default', 'Strip default language file (en_us)'], ['all', 'Strip all language files']]\"></radio-row>\n          <button :disabled=\"!folder\" @click=\"execute\">Strip</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  batchExporter: {\n    name: \"Batch Exporter\",\n    icon: \"move_group\",\n    tagline: \"Export every bbmodel file in a folder at the same time.\",\n    description: \"Batch Exporter is a tool that will export every bbmodel file within a folder to an output folder using the selected format.\",\n    component: {\n      data: {\n        inputFolder: \"\",\n        outputFolder: \"\",\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        textures: true,\n        subfolders: false,\n        textureFolders: true,\n        format: \"java_block\",\n        formats: Object.fromEntries(Object.entries(batchExporterFormats).map(e => [e[0], e[1].name])),\n        specialFormats: batchExporterSpecialFormats\n      },\n      methods: {\n        async execute() {\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.inputFolder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.inputFolder)}\\` was not found`)\n            return\n          }\n\n          if (!await exists(this.outputFolder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.outputFolder)}\\` was not found`)\n            return\n          }\n\n          const files = await listFiles(this.inputFolder, \"bbmodel\")\n\n          this.total = files.length\n\n          if (!files.length) {\n            this.status.finished = true\n            this.status.processing = false\n            output.error(\"No `.bbmodel` files present in the selected folder\")\n            return\n          }\n\n          let exportOptions = {}\n          const codec = Formats[this.format]?.codec ?? Codecs[this.format]\n          if (Object.keys(codec.export_options).length) {\n            output.log(\"Getting export options…\")\n            newProject(\"\")\n            await codec.promptExportOptions()\n            exportOptions = codec.getExportOptions()\n            await Project.close()\n            output.log(\"Export options loaded\")\n          }\n\n          for (const file of files) {\n            try {\n              const name = file.slice(0, -8)\n              let outputPath = \"\"\n              let fullOutputPath = this.outputFolder\n              if (this.subfolders) {\n                outputPath = name + \"/\"\n                fullOutputPath = PathModule.join(fullOutputPath, name)\n              }\n              const saveName = PathModule.join(fullOutputPath, `${name}.${batchExporterFormats[this.format].type}`)\n              if (await exists(saveName)) {\n                output.warn(`Skipping \\`${file}\\` as \\`${outputPath}${name}.${batchExporterFormats[this.format].type}\\` already exists`)\n                this.done++\n                continue\n              }\n              const data = autoParseJSON(await fs.promises.readFile(PathModule.join(this.inputFolder, file), \"utf-8\"), false)\n              if (!data) {\n                output.error(`Skipping \\`${file}\\` as it could not be read`)\n                this.done++\n                continue\n              }\n              if (data.meta.model_format !== this.format && !batchExporterSpecialFormats.includes(this.format)) {\n                output.warn(`Skipping \\`${file}\\` as it is in ${data.meta.model_format in Formats ? `the \\`${Formats[data.meta.model_format].name}\\`` : \"an unknown\"} format`)\n                this.done++\n                continue\n              }\n              if (!Formats[data.meta.model_format]) {\n                output.warn(`Skipping \\`${file}\\` as it uses an unknown model format: \\`${data.meta.model_format}\\``)\n                this.done++\n                continue\n              }\n              newProject(Formats[data.meta.model_format])\n              Codecs.project.parse(data)\n              let compiled, mtl\n              if (this.format === \"obj\") {\n                const obj = Codecs.obj.compile(Object.assign({\n                  all_files: true,\n                  mtl_name: this.textures ? `${name}.mtl` : undefined\n                }, exportOptions))\n                compiled = obj.obj\n                mtl = obj.mtl\n              } else {\n                compiled = await Codecs[this.format].compile(exportOptions)\n              }\n              if (fullOutputPath !== this.outputFolder) {\n                await fs.promises.mkdir(fullOutputPath, { recursive: true })\n              }\n              await fs.promises.writeFile(saveName, Buffer.from(compiled), \"utf-8\")\n              output.log(`Exported \\`${file}\\` to \\`${outputPath}${name}.${batchExporterFormats[this.format].type}\\``)\n              if (this.format === \"obj\" && this.textures) {\n                if (await exists(saveName.slice(0, -3) + \"mtl\")) {\n                  output.warn(`Skipping \\`${file}\\`'s material as \\`${outputPath}${name}.mtl\\` already exists`)\n                } else {\n                  await fs.promises.writeFile(saveName.slice(0, -3) + \"mtl\", mtl, \"utf-8\")\n                  output.log(`Exported \\`${file}\\`'s material to \\`${outputPath}${name}.mtl\\``)\n                }\n              }\n              if (this.textures) {\n                for (const texture of data.textures) {\n                  const name = texture.name.endsWith(\".png\") ? texture.name : texture.name + \".png\"\n                  let saveName\n                  if (this.textureFolders && !batchExporterSpecialFormats.includes(this.format)) {\n                    await fs.promises.mkdir(PathModule.join(this.outputFolder, outputPath, \"textures\", texture.folder), { recursive: true })\n                    saveName = formatPath(PathModule.join(outputPath, \"textures\", texture.folder, name))\n                  } else {\n                    saveName = `${outputPath}${name}`\n                  }\n                  const savePath = PathModule.join(this.outputFolder, saveName)\n                  if (await exists(savePath)) {\n                    output.warn(`Skipping texture \\`${name}\\` from \\`${file}\\` as \\`${saveName}\\` already exists`)\n                    continue\n                  }\n                  await fs.promises.writeFile(savePath, Buffer.from(texture.source.split(\",\")[1], \"base64\"), \"utf-8\")\n                  output.log(`Exported \\`${name}\\` from \\`${file}\\` to \\`${saveName}\\``)\n                }\n              }\n              await Project.close()\n            } catch (err) {\n              output.error(`Skipping \\`${file}\\` as it could not be read`)\n              console.error(err)\n            }\n            this.done++\n          }\n\n          output.info(\"Finished\")\n          this.status.finished = true\n          this.status.processing = false\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <h3>Input Folder:</h3>\n          <folder-selector v-model=\"inputFolder\" placeholder=\"Input Folder\">folder containing bbmodels</folder-selector>\n          <h3>Output Folder:</h3>\n          <folder-selector v-model=\"outputFolder\" placeholder=\"Output Folder\">folder to export the bbmodels to</folder-selector>\n          <select-row v-model=\"format\" :options=\"formats\">Output format</select-row>\n          <checkbox-row v-model=\"subfolders\">Export each model to its own subfolder</checkbox-row>\n          <checkbox-row v-model=\"textures\">Export textures</checkbox-row>\n          <checkbox-row v-if=\"!specialFormats.includes(format)\" :disabled=\"!textures\" v-model=\"textureFolders\">Export textures into their defined folders</checkbox-row>\n          <button :disabled=\"!inputFolder || !outputFolder\" @click=\"execute\">Export</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  missingTextures: {\n    name: \"Missing Textures\",\n    icon: \"find_in_page\",\n    tagline: \"List the textures that are missing from a resource pack.\",\n    description: \"Missing Textures is a tool that will check what textures you have in a resource pack and tell you which ones the resource pack is missing.\",\n    component: {\n      data: {\n        folder: \"\",\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        version: \"\",\n        ignoreList: [\"clouds\", \"color_palettes\", \"colormap\", \"debug\", \"font\", \"gui/title\", \"presets\", \"realms\", \"textures/effect\"],\n        exportLog: false\n      },\n      methods: {\n        async execute() {\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const jar = await getVersionJar(this.version)\n\n          const toCheck = Object.keys(jar.files).filter(e => e.endsWith(\".png\") && !this.ignoreList.some(item => e.toLowerCase().includes(item)))\n\n          this.total = toCheck.length\n\n          const files = (await Array.fromAsync(getFiles(this.folder))).map(e => formatPath(e.slice(this.folder.length + 1)))\n\n          const missing = []\n          for (const file of toCheck) {\n            if (!files.includes(file)) {\n              output.log(`Missing \\`${file}\\``)\n              missing.push(file)\n            }\n            this.done++\n          }\n\n          const str = `Missing ${missing.length} of ${this.total} textures (${!this.total ? 0 : ((missing.length / this.total) * 100).toFixed(2).replace(/\\.?0+$/, \"\")}%)`\n\n          if (this.exportLog) {\n            const name = PathModule.join(this.folder, `missing_textures_${getDate()}.txt`)\n            await fs.promises.writeFile(name, `${header}${str}\\n\\nMissing Textures\\n――――――――――――――――\\n${formatFilePaths(missing)}`, \"utf-8\")\n            output.log(`Saved missing textures list to \\`${name}\\``)\n          }\n\n          output.info(`Finished\\n${str}`)\n          this.status.finished = true\n          this.status.processing = false\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Resource Pack:</h3>\n              <folder-selector v-model=\"folder\" placeholder=\"Resource Pack\">resource pack to list missing textures of</folder-selector>\n              <version-selector v-model=\"version\" />\n              <checkbox-row v-model=\"exportLog\">Export missing texture list</checkbox-row>\n            </div>\n            <ignore-list v-model=\"ignoreList\" />\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Find Missing Textures</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  mojangConverter: {\n    name: \"Mojang Converter\",\n    icon: \"swap_horiz\",\n    tagline: \"Convert images to and between the 1.15 and 1.16 Mojang logo formats.\",\n    description: \"Mojang Converter is a tool that will convert images to be in the the Mojang Studios logo format. This can also convert existing textures between the 1.15 and 1.16 texture formats.\",\n    component: {\n      data: {\n        file: null,\n        outputNew: null,\n        outputOld: null,\n        inputMode: \"image\",\n        inputModes: {\n          image: \"Arbitrary image or 1.15 format\",\n          old: \"1.16 and above format\"\n        },\n        outputMode: \"new\",\n        outputModes: {\n          new: \"Convert for 1.16 and above\",\n          old: \"Convert for 1.15 and below\"\n        }\n      },\n      methods: {\n        async execute() {\n          if (!this.file) {\n            this.outputNew = null\n            this.outputOld = null\n            return\n          }\n          const img = imageToCanvas(this.file.image)\n          if (this.inputMode === \"old\") {\n            const oldCanvas = new Canvas(img.width * 2, Math.floor(img.width / 2))\n            oldCanvas.ctx.drawImage(img, 0, 0, img.width, Math.floor(img.width / 2), 0, 0, img.width, Math.floor(img.width / 2))\n            oldCanvas.ctx.drawImage(img, 0, Math.floor(img.width / 2), img.width, Math.floor(img.width / 2), img.width, 0, img.width, Math.floor(img.width / 2))\n            oldCanvas.trim()\n            this.outputOld = new Canvas(oldCanvas.width, oldCanvas.width)\n            this.outputOld.ctx.drawImage(oldCanvas, 0, Math.floor((oldCanvas.width - oldCanvas.height) / 2))\n          } else {\n            img.trim()\n            const size = Math.max(img.width, img.height)\n            this.outputOld = new Canvas(size, size)\n            this.outputOld.ctx.drawImage(img, (this.outputOld.width - img.width) / 2, (this.outputOld.height - img.height) / 2)\n          }\n          img.trim()\n          let newCanvas\n          if (img.width < img.height * 4) {\n            newCanvas = new Canvas(img.height * 4 + 8, img.height + 2)\n            newCanvas.ctx.drawImage(img, Math.floor((img.height * 4 - img.width) / 2) + 4, 1)\n          } else if (img.width > img.height * 4) {\n            newCanvas = new Canvas(img.width + 8, Math.floor(img.width / 4) + 2)\n            newCanvas.ctx.drawImage(img, 4, Math.floor((newCanvas.height - img.height) / 2))\n          } else {\n            newCanvas = new Canvas(img.width + 8, img.height + 4)\n            newCanvas.ctx.drawImage(img, 4, 1)\n          }\n          this.outputNew = new Canvas(Math.floor(newCanvas.width / 2), Math.floor(newCanvas.width / 2))\n          this.outputNew.ctx.drawImage(newCanvas, 0, 0)\n          this.outputNew.ctx.drawImage(newCanvas, Math.floor(-newCanvas.width / 2), Math.floor(newCanvas.width / 4))\n        }\n      },\n      template: `\n        <h3>Input texture:</h3>\n        <tab-select v-model=\"inputMode\" :options=\"inputModes\" @input=\"execute\" />\n        <file-input v-model=\"file\" title=\"Select your Mojang Studios texture\" @input=\"execute\" />\n        <h3>Mojang Studios texture:</h3>\n        <tab-select v-if=\"inputMode === 'image'\" v-model=\"outputMode\" :options=\"outputModes\" />\n        <canvas-output v-if=\"inputMode !== 'old' && outputMode === 'new'\" v-model=\"outputNew\" name=\"mojangstudios\" />\n        <canvas-output v-if=\"inputMode === 'old' || outputMode === 'old'\" v-model=\"outputOld\" name=\"mojang\" />\n      `\n    }\n  },\n  minecraftTitleConverter: {\n    name: \"Minecraft Title Converter\",\n    icon: \"text_fields\",\n    tagline: \"Convert images to and between the 1.19 and 1.20 Minecraft title formats.\",\n    description: \"Minecraft Title Converter is a tool that will convert images to be in the the Minecraft title format. This can also convert existing textures between the 1.19 and 1.20 texture formats.\",\n    component: {\n      data: {\n        file: null,\n        outputNew: null,\n        outputOld: null,\n        outputBetween: null,\n        inputMode: \"image\",\n        inputModes: {\n          image: \"Arbitrary image or 1.20 format\",\n          old: \"1.19 and below format\"\n        },\n        outputMode: \"new\",\n        outputModes: {\n          new: \"Convert for 1.20 and above\",\n          old: \"Convert for 1.19 and below\"\n        },\n        error: null\n      },\n      methods: {\n        async execute() {\n          if (!this.file) {\n            this.outputNew = null\n            this.outputOld = null\n            this.outputBetween = null\n            this.error = null\n            return\n          }\n          const img = imageToCanvas(this.file.image)\n          const aspect = img.width / img.height\n          let w, h\n          if (img.width > 1024 || img.height > 1024) {\n            if (aspect > 1) {\n              w = 1024\n              h = Math.floor(1024 / aspect)\n            } else {\n              h = 1024\n              w = Math.floor(1024 * aspect)\n            }\n          } else {\n            w = img.width\n            h = img.height\n          }\n          const canvas = new Canvas(w, h)\n          if (img.width < 64 || img.height < 64) {\n            canvas.ctx.imageSmoothingEnabled = false\n          }\n          canvas.ctx.drawImage(img, 0, 0, w, h)\n          const base = await loadImage(\"data:image/png;base64,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\")\n          let oldPreCanvas\n          if (canvas.width / canvas.height < 137 / 22) {\n            oldPreCanvas = new Canvas(Math.floor((canvas.height / 22) * 137), canvas.height)\n            oldPreCanvas.ctx.drawImage(canvas, Math.floor((oldPreCanvas.width - canvas.width) / 2), 0)\n          } else if (canvas.width / canvas.height > 137 / 22) {\n            oldPreCanvas = new Canvas(canvas.width, Math.floor((canvas.width / 137) * 22))\n            oldPreCanvas.ctx.drawImage(canvas, 0, Math.floor((oldPreCanvas.height - canvas.height) / 2))\n          } else oldPreCanvas = canvas\n          this.outputOld = new Canvas(Math.floor((oldPreCanvas.width / 137) * 128), Math.floor((oldPreCanvas.width / 137) * 128))\n          this.outputOld.ctx.imageSmoothingEnabled = false\n          this.outputOld.ctx.drawImage(base, 0, 0, this.outputOld.width, this.outputOld.height)\n          const width = Math.floor((oldPreCanvas.width / 274) * 155)\n          this.outputOld.ctx.drawImage(oldPreCanvas, 0, 0, width, oldPreCanvas.height, 0, 0, width, oldPreCanvas.height)\n          this.outputOld.ctx.drawImage(oldPreCanvas, width, 0, oldPreCanvas.width - width, oldPreCanvas.height, 0, Math.floor(oldPreCanvas.height / 44 * 45), oldPreCanvas.width - width, oldPreCanvas.height)\n          function newConvert(img) {\n            const input = new Canvas(img.width, img.height)\n            input.ctx.drawImage(img, 0, 0)\n            input.trim()\n            const canvas = new Canvas(1024, 256)\n            const ctx = canvas.getContext(\"2d\")\n            const scaleFactor = Math.min(1024 / input.width, 176 / input.height)\n            const newWidth = input.width * scaleFactor\n            const newHeight = input.height * scaleFactor\n            const x = (1024 - newWidth) / 2\n            const y = (176 - newHeight) / 2\n            if (newWidth > input.width) ctx.imageSmoothingEnabled = false\n            ctx.drawImage(input, x, y, newWidth, newHeight)\n            return canvas\n          }\n          this.outputNew = newConvert(canvas)\n          if (img.width === img.height) {\n            const m = img.width / 256\n            const w = Math.floor(m * 155)\n            const w2 = Math.floor(m * 119)\n            const h = Math.floor(m * 44)\n            const h2 = Math.floor(m * 45)\n            const convertCanvas = new Canvas(w + w2, h)\n            convertCanvas.ctx.drawImage(img, 0, 0, w, h, 0, 0, w, h)\n            convertCanvas.ctx.drawImage(img, 0, h2, w2, h, w, 0, w2, h)\n            this.outputBetween = newConvert(convertCanvas)\n            this.error = null\n          } else {\n            this.outputBetween = null\n            this.error = \"The input image must be square for this type of conversion\"\n          }\n        }\n      },\n      template: `\n        <h3>Input texture:</h3>\n        <tab-select v-model=\"inputMode\" :options=\"inputModes\" />\n        <file-input v-model=\"file\" title=\"Select your Minecraft Title texture\" @input=\"execute\" />\n        <template v-if=\"inputMode === 'image'\">\n          <h3>Minecraft Title texture:</h3>\n          <tab-select v-model=\"outputMode\" :options=\"outputModes\" />\n          <canvas-output v-if=\"outputMode === 'new'\" v-model=\"outputNew\" name=\"minecraft\" height=\"178\" />\n          <canvas-output v-if=\"outputMode === 'old'\" v-model=\"outputOld\" name=\"minecraft\" />\n        </template>\n        <template v-else>\n          <h3>Minecraft Title texture for 1.20 and above:</h3>\n          <canvas-output v-model=\"outputBetween\" name=\"minecraft\" :error=\"error\" height=\"178\" />\n        </div>\n      `\n    }\n  },\n  skinConverter: {\n    name: \"Skin Converter\",\n    icon: \"group\",\n    tagline: \"Convert Minecraft skins between the classic and modern skin formats.\",\n    description: \"Skin Converter is a tool that will convert Minecraft skins between the classic 64x32 format and the modern 64x64 format.\",\n    component: {\n      data: {\n        file: null,\n        canvas: null,\n        error: null,\n        mode: \"wide\",\n        modes: {\n          wide: \"Wide\",\n          slim: \"Slim\"\n        },\n        direction: \"down\"\n      },\n      methods: {\n        async execute() {\n          if (!this.file) {\n            this.canvas = null\n            this.error = null\n            return\n          }\n          if (!(this.file.image.width === this.file.image.height || this.file.image.width === this.file.image.height * 2)) {\n            this.canvas = null\n            this.error = \"Invalid skin: Skins must be square, or in the aspect ratio 2:1\"\n            return\n          }\n          if (!(Math.clz32(this.file.image.width) < Math.clz32(this.file.image.width - 1))) {\n            this.canvas = null\n            this.error = \"Invalid skin: Skins must have dimensions that are powers of 2, such as 64, 128, 256, etc…\"\n            return\n          }\n          if (this.file.image.width < 64) {\n            this.canvas = null\n            this.error = \"Invalid skin: The minimum size for a skin is 64x32\"\n            return\n          }\n          this.error = null\n          const img = imageToCanvas(this.file.image)\n          if (img.width === img.height) {\n            this.direction = \"down\"\n            this.canvas = new Canvas(img.width, Math.floor(img.width / 2))\n            this.canvas.ctx.drawImage(img, 0, 0)\n          } else {\n            this.direction = \"up\"\n            this.canvas = new Canvas(img.width, img.width)\n            const m = img.width / 64\n            this.canvas.ctx.drawImage(img, 0, 0)\n            this.canvas.ctx.save()\n            this.canvas.ctx.translate(img.width, 0)\n            this.canvas.ctx.scale(-1, 1)\n            this.canvas.ctx.drawImage(img, 0, 20 * m, 12 * m, 12 * m, 36 * m, 52 * m, 12 * m, 12 * m)\n            this.canvas.ctx.drawImage(img, 12 * m, 20 * m, 4 * m, 12 * m, 32 * m, 52 * m, 4 * m, 12 * m)\n            this.canvas.ctx.drawImage(img, 4 * m, 16 * m, 4 * m, 4 * m, 40 * m, 48 * m, 4 * m, 4 * m)\n            this.canvas.ctx.drawImage(img, 8 * m, 16 * m, 4 * m, 4 * m, 36 * m, 48 * m, 4 * m, 4 * m)\n            if (this.mode === \"slim\") {\n              this.canvas.ctx.drawImage(img, 40 * m, 20 * m, 11 * m, 12 * m, 21 * m, 52 * m, 11 * m, 12 * m)\n              this.canvas.ctx.drawImage(img, 51 * m, 20 * m, 3 * m, 12 * m, 18 * m, 52 * m, 3 * m, 12 * m)\n              this.canvas.ctx.drawImage(img, 44 * m, 16 * m, 3 * m, 4 * m, 25 * m, 48 * m, 3 * m, 4 * m)\n              this.canvas.ctx.drawImage(img, 47 * m, 16 * m, 3 * m, 4 * m, 22 * m, 48 * m, 3 * m, 4 * m)\n            } else {\n              this.canvas.ctx.drawImage(img, 40 * m, 20 * m, 12 * m, 12 * m, 20 * m, 52 * m, 12 * m, 12 * m)\n              this.canvas.ctx.drawImage(img, 52 * m, 20 * m, 4 * m, 12 * m, 16 * m, 52 * m, 4 * m, 12 * m)\n              this.canvas.ctx.drawImage(img, 44 * m, 16 * m, 4 * m, 4 * m, 24 * m, 48 * m, 4 * m, 4 * m)\n              this.canvas.ctx.drawImage(img, 48 * m, 16 * m, 4 * m, 4 * m, 20 * m, 48 * m, 4 * m, 4 * m)\n            }\n          }\n        }\n      },\n      template: `\n        <h3>Input skin:</h3>\n        <file-input v-model=\"file\" title=\"Select your skin file\" @input=\"execute\" />\n        <h3>Output skin:</h3>\n        <tab-select v-if=\"direction === 'up'\" v-model=\"mode\" :options=\"modes\" @input=\"execute\" />\n        <canvas-output v-model=\"canvas\" name=\"skin\" :error=\"error\" />\n      `\n    }\n  },\n  wideSlimConverter: {\n    name: \"Wide ⇄ Slim Converter\",\n    icon: \"supervisor_account\",\n    tagline: \"Convert Minecraft skins between the wide and slim skin formats.\",\n    description: \"Wide ⇄ Slim Converter is a tool that will convert Minecraft skins between the wide 4px arm format and the slim 3px arm format.\",\n    component: {\n      data: {\n        file: null,\n        slim: null,\n        wide: null,\n        error: null,\n        mode: \"wide\",\n        modes: {\n          wide: \"Wide\",\n          slim: \"Slim\"\n        },\n        slimCol: 1,\n        wideCol: 1\n      },\n      methods: {\n        async execute() {\n          if (!this.file) {\n            this.slim = null\n            this.wide = null\n            this.error = null\n            return\n          }\n          if (this.file.image.width != 64 || ![32, 64].includes(this.file.image.height)) {\n            this.slim = null\n            this.wide = null\n            this.error = \"Invalid skin: Skins must be 64x64 or 64x32\"\n            return\n          }\n          this.error = null\n\n          const slimCol = this.slimCol - 1\n          const wideCol = this.wideCol - 1\n\n          this.slim = imageToCanvas(this.file.image)\n          this.wide = imageToCanvas(this.file.image)\n\n          this.slim.ctx.clearRect(44 + slimCol, 16, 12 - slimCol, 16)\n          this.slim.ctx.drawImage(this.file.image, 45 + slimCol, 16, 10 - slimCol * 2, 16, 44 + slimCol, 16, 10 - slimCol * 2, 16)\n          this.slim.ctx.drawImage(this.file.image, 56 - slimCol, 20, slimCol, 12, 54 - slimCol, 20, slimCol, 12)\n          this.slim.ctx.clearRect(47 + slimCol, 16, 4 - slimCol, 4)\n          this.slim.ctx.drawImage(this.file.image, 49 + slimCol, 16, 3 - slimCol, 4, 47 + slimCol, 16, 3 - slimCol, 4)\n\n          this.slim.ctx.clearRect(44 + slimCol, 32, 12 - slimCol, 16)\n          this.slim.ctx.drawImage(this.file.image, 45 + slimCol, 32, 10 - slimCol * 2, 16, 44 + slimCol, 32, 10 - slimCol * 2, 16)\n          this.slim.ctx.drawImage(this.file.image, 56 - slimCol, 36, slimCol, 12, 54 - slimCol, 36, slimCol, 12)\n          this.slim.ctx.clearRect(47 + slimCol, 32, 4 - slimCol, 4)\n          this.slim.ctx.drawImage(this.file.image, 49 + slimCol, 32, 3 - slimCol, 4, 47 + slimCol, 32, 3 - slimCol, 4)\n\n          this.slim.ctx.clearRect(39 - slimCol, 48, 9 + slimCol, 16)\n          this.slim.ctx.drawImage(this.file.image, 40 - slimCol, 48, 4 + slimCol * 2, 16, 39 - slimCol, 48, 4 + slimCol * 2, 16)\n          this.slim.ctx.drawImage(this.file.image, 45 + slimCol, 52, 3 - slimCol, 12, 43 + slimCol, 52, 3 - slimCol, 12)\n          this.slim.ctx.clearRect(42 - slimCol, 48, 1 + slimCol, 4)\n          this.slim.ctx.drawImage(this.file.image, 44 - slimCol, 48, slimCol, 4, 42 - slimCol, 48, slimCol, 4)\n\n          this.slim.ctx.clearRect(55 - slimCol, 48, 9 + slimCol, 16)\n          this.slim.ctx.drawImage(this.file.image, 56 - slimCol, 48, 4 + slimCol * 2, 16, 55 - slimCol, 48, 4 + slimCol * 2, 16)\n          this.slim.ctx.drawImage(this.file.image, 61 + slimCol, 52, 3 - slimCol, 12, 59 + slimCol, 52, 3 - slimCol, 12)\n          this.slim.ctx.clearRect(58 - slimCol, 48, 1 + slimCol, 4)\n          this.slim.ctx.drawImage(this.file.image, 60 - slimCol, 48, slimCol, 4, 58 - slimCol, 48, slimCol, 4)\n\n          this.wide.ctx.clearRect(45 + wideCol, 16, 12 - wideCol, 16)\n          this.wide.ctx.drawImage(this.file.image, 44 + wideCol, 16, 10 - wideCol * 2, 16, 45 + wideCol, 16, 10 - wideCol * 2, 16)\n          this.wide.ctx.drawImage(this.file.image, 53 - wideCol, 20, 1 + wideCol, 12, 55 - wideCol, 20, 1 + wideCol, 12)\n          this.wide.ctx.clearRect(49 + wideCol, 16, 4 - wideCol, 4)\n          this.wide.ctx.drawImage(this.file.image, 47 + wideCol, 16, 3 - wideCol, 4, 49 + wideCol, 16, 3 - wideCol, 4)\n          \n          this.wide.ctx.clearRect(45 + wideCol, 32, 12 - wideCol, 16)\n          this.wide.ctx.drawImage(this.file.image, 44 + wideCol, 32, 10 - wideCol * 2, 16, 45 + wideCol, 32, 10 - wideCol * 2, 16)\n          this.wide.ctx.drawImage(this.file.image, 53 - wideCol, 36, 1 + wideCol, 12, 55 - wideCol, 36, 1 + wideCol, 12)\n          this.wide.ctx.clearRect(49 + wideCol, 32, 4 - wideCol, 4)\n          this.wide.ctx.drawImage(this.file.image, 47 + wideCol, 32, 3 - wideCol, 4, 49 + wideCol, 32, 3 - wideCol, 4)\n\n          this.wide.ctx.clearRect(39 - wideCol, 48, 7 + wideCol, 16)\n          this.wide.ctx.drawImage(this.file.image, 38 - wideCol, 48, 6 + wideCol * 2, 16, 39 - wideCol, 48, 6 + wideCol * 2, 16)\n          this.wide.ctx.drawImage(this.file.image, 43 + wideCol, 52, 3 - wideCol, 12, 45 + wideCol, 52, 3 - wideCol, 12)\n          this.wide.ctx.clearRect(43 - wideCol, 48, wideCol, 4)\n          this.wide.ctx.drawImage(this.file.image, 41 - wideCol, 48, 1 + wideCol, 4, 43 - wideCol, 48, 1 + wideCol, 4)\n\n          this.wide.ctx.clearRect(55 - wideCol, 48, 7 + wideCol, 16)\n          this.wide.ctx.drawImage(this.file.image, 54 - wideCol, 48, 6 + wideCol * 2, 16, 55 - wideCol, 48, 6 + wideCol * 2, 16)\n          this.wide.ctx.drawImage(this.file.image, 59 + wideCol, 52, 3 - wideCol, 12, 61 + wideCol, 52, 3 - wideCol, 12)\n          this.wide.ctx.clearRect(59 - wideCol, 48, wideCol, 4)\n          this.wide.ctx.drawImage(this.file.image, 57 - wideCol, 48, 1 + wideCol, 4, 59 - wideCol, 48, 1 + wideCol, 4)\n        }\n      },\n      template: `\n        <h3>Input skin:</h3>\n        <tab-select v-model=\"mode\" :options=\"modes\" />\n        <file-input v-model=\"file\" title=\"Select your skin file\" @input=\"execute\" />\n        <h3 v-if=\"mode === 'wide'\">The column of pixels in the arms that gets removed:</h3>\n        <num-slider v-if=\"mode === 'wide'\" v-model=\"slimCol\" :min=\"1\" :max=\"4\" @input=\"execute\" />\n        <h3 v-if=\"mode === 'slim'\">The column of pixels in the arms that gets duplicated:</h3>\n        <num-slider v-if=\"mode === 'slim'\" v-model=\"wideCol\" :min=\"1\" :max=\"3\" @input=\"execute\" />\n        <h3>Output {{ mode === 'wide' ? 'slim' : 'wide' }} skin:</h3>\n        <canvas-output v-if=\"mode === 'wide'\" v-model=\"slim\" name=\"slim\" :error=\"error\" />\n        <canvas-output v-if=\"mode === 'slim'\" v-model=\"wide\" name=\"wide\" :error=\"error\" />\n      `\n    }\n  },\n  ctmConverter: {\n    name: \"CTM Converter\",\n    icon: \"grid_view\",\n    tagline: \"Convert compact CTM into full or overlay CTM.\",\n    description: \"CTM Converter is a tool that will convert compact CTM into full CTM or overlay CTM.\",\n    component: {\n      data: {\n        files: [],\n        error: null,\n        full: null,\n        overlay: null,\n        mode: \"full\",\n        modes: {\n          full: \"Full CTM\",\n          overlay: \"Overlay CTM\"\n        }\n      },\n      methods: {\n        async execute() {\n          if (!this.files.length) {\n            this.full = null\n            this.overlay = null\n            this.error = null\n            return\n          }\n          if (![1, 5].includes(this.files.length)) {\n            this.full = null\n            this.overlay = null\n            this.error = \"Please provide either a combined compact CTM spritesheet, or the 5 indivdual textures\"\n            return\n          }\n          let img\n          if (this.files.length === 1) {\n            if (this.files[0].image.width !== this.files[0].image.height * 5) {\n              this.full = null\n              this.overlay = null\n              this.error = \"Invalid compact CTM: A compact CTM spritesheet must be in the aspect ratio 5:1\"\n              return\n            }\n            img = this.files[0].image\n          } else {\n            let size\n            for (const [i, file] of this.files.entries()) {\n              if (file.image.width !== file.image.height) {\n                this.full = null\n                this.overlay = null\n                this.error = \"Invalid input: CTM sprites must be square\"\n                return\n              }\n              if (!size) {\n                size = file.image.width\n                img = new Canvas(size * 5, size)\n              } else if (file.image.width !== size) {\n                this.full = null\n                this.overlay = null\n                this.error = \"Invalid input: All CTM sprites must be the same size\"\n                return\n              }\n              img.ctx.drawImage(file.image, size * i, 0)\n            }\n          }\n          if (img.height < 2) {\n            this.full = null\n            this.overlay = null\n            this.error = \"Invalid input: The minimum tile size is 2x2\"\n            return\n          }\n          this.error = null\n          const coords = {\n            full: [0, 0, 16, 16],\n            empty: [16, 0, 16, 16],\n            emptyTop: [16, 0, 16, 8],\n            emptyBottom: [16, 8, 16, 8],\n            emptyLeft: [16, 0, 8, 16],\n            emptyRight: [24, 0, 8, 16],\n            emptyTopLeft: [16, 0, 8, 8],\n            emptyTopRight: [24, 0, 8, 8],\n            emptyBottomLeft: [16, 8, 8, 8],\n            emptyBottomRight: [24, 8, 8, 8],\n            leftRight: [32, 0, 16, 16],\n            topBottom: [48, 0, 16, 16],\n            corners: [64, 0, 16, 16],\n            fullLeft: [0, 0, 8, 16],\n            fullRight: [8, 0, 8, 16],\n            fullTop: [0, 0, 16, 8],\n            fullBottom: [0, 8, 16, 8],\n            topBottomLeft: [48, 0, 8, 16],\n            topBottomRight: [56, 0, 8, 16],\n            leftRightTop: [32, 0, 16, 8],\n            leftRightBottom: [32, 8, 16, 8],\n            leftRightLeft: [32, 0, 8, 16],\n            leftRightRight: [40, 0, 8, 16],\n            topBottomTop: [48, 0, 16, 8],\n            topBottomBottom: [48, 8, 16, 8],\n            fullTopLeft: [0, 0, 8, 8],\n            fullTopRight: [8, 0, 8, 8],\n            fullBottomLeft: [0, 8, 8, 8],\n            fullBottomRight: [8, 8, 8, 8],\n            topBottomTopLeft: [48, 0, 8, 8],\n            topBottomTopRight: [56, 0, 8, 8],\n            topBottomBottomLeft: [48, 8, 8, 8],\n            topBottomBottomRight: [56, 8, 8, 8],\n            leftRightTopLeft: [32, 0, 8, 8],\n            leftRightTopRight: [40, 0, 8, 8],\n            leftRightBottomLeft: [32, 8, 8, 8],\n            leftRightBottomRight: [40, 8, 8, 8],\n            cornersTop: [64, 0, 16, 8],\n            cornersBottom: [64, 8, 16, 8],\n            cornersLeft: [64, 0, 8, 16],\n            cornersRight: [72, 0, 8, 16],\n            cornersTopLeft: [64, 0, 8, 8],\n            cornersTopRight: [72, 0, 8, 8],\n            cornersBottomLeft: [64, 8, 8, 8],\n            cornersBottomRight: [72, 8, 8, 8],\n            emptyTopLeft: [16, 0, 8, 8],\n            emptyTopRight: [24, 0, 8, 8],\n            emptyBottomLeft: [16, 8, 8, 8],\n            emptyBottomRight: [24, 8, 8, 8],\n            emptyLeft: [16, 0, 8, 16],\n            emptyRight: [24, 0, 8, 16],\n            emptyTop: [16, 0, 16, 8],\n            emptyBottom: [16, 8, 16, 8]\n          }\n          const fullMap = [\n            [\"full\", 0, 0],\n            [\"fullLeft\", 16, 0],\n            [\"topBottomRight\", 24, 0],\n            [\"topBottom\", 32, 0],\n            [\"topBottomLeft\", 48, 0],\n            [\"fullRight\", 56, 0],\n            [\"fullTop\", 0, 16],\n            [\"leftRightBottom\", 0, 24],\n            [\"leftRight\", 0, 32],\n            [\"leftRightTop\", 0, 48],\n            [\"fullBottom\", 0, 56],\n            [\"fullTopLeft\", 16, 16],\n            [\"topBottomTopRight\", 24, 16],\n            [\"topBottomTop\", 32, 16],\n            [\"topBottomTopLeft\", 48, 16],\n            [\"fullTopRight\", 56, 16],\n            [\"leftRightBottomRight\", 56, 24],\n            [\"leftRightRight\", 56, 32],\n            [\"leftRightTopRight\", 56, 48],\n            [\"fullBottomRight\", 56, 56],\n            [\"topBottomBottomLeft\", 48, 56],\n            [\"topBottomBottom\", 32, 56],\n            [\"topBottomBottomRight\", 24, 56],\n            [\"fullBottomLeft\", 16, 56],\n            [\"leftRightTopLeft\", 16, 48],\n            [\"leftRightLeft\", 16, 32],\n            [\"leftRightBottomLeft\", 16, 24],\n            [\"emptyBottomRight\", 24, 24],\n            [\"emptyBottom\", 32, 24],\n            [\"emptyBottomLeft\", 48, 24],\n            [\"emptyLeft\", 48, 32],\n            [\"emptyTopLeft\", 48, 48],\n            [\"emptyTop\", 32, 48],\n            [\"emptyTopRight\", 24, 48],\n            [\"emptyRight\", 24, 32],\n            [\"empty\", 32, 32],\n            [\"fullTopLeft\", 64, 0],\n            [\"topBottomTopRight\", 72, 0],\n            [\"topBottomTopLeft\", 80, 0],\n            [\"fullTopRight\", 88, 0],\n            [\"leftRightBottomRight\", 88, 8],\n            [\"leftRightTopRight\", 88, 16],\n            [\"fullBottomRight\", 88, 24],\n            [\"topBottomBottomLeft\", 80, 24],\n            [\"topBottomBottomRight\", 72, 24],\n            [\"fullBottomLeft\", 64, 24],\n            [\"leftRightTopLeft\", 64, 16],\n            [\"leftRightBottomLeft\", 64, 8],\n            [\"cornersBottomRight\", 72, 8],\n            [\"cornersBottomLeft\", 80, 8],\n            [\"cornersTopLeft\", 80, 16],\n            [\"cornersTopRight\", 72, 16],\n            [\"leftRightLeft\", 96, 0],\n            [\"cornersTopRight\", 104, 0],\n            [\"topBottomTop\", 112, 0],\n            [\"cornersBottomRight\", 120, 8],\n            [\"leftRightRight\", 120, 16],\n            [\"cornersBottomLeft\", 112, 24],\n            [\"topBottomBottom\", 96, 24],\n            [\"cornersTopLeft\", 96, 16],\n            [\"cornersBottomRight\", 104, 8],\n            [\"cornersBottomLeft\", 112, 8],\n            [\"cornersTopLeft\", 112, 16],\n            [\"cornersTopRight\", 104, 16],\n            [\"cornersLeft\", 128, 0],\n            [\"emptyTopRight\", 136, 0],\n            [\"cornersTop\", 144, 0],\n            [\"emptyBottomRight\", 152, 8],\n            [\"cornersRight\", 152, 16],\n            [\"emptyBottomLeft\", 144, 24],\n            [\"cornersBottom\", 128, 24],\n            [\"emptyTopLeft\", 128, 16],\n            [\"cornersBottomRight\", 136, 8],\n            [\"cornersBottomLeft\", 144, 8],\n            [\"cornersTopLeft\", 144, 16],\n            [\"cornersTopRight\", 136, 16],\n            [\"emptyLeft\", 160, 0],\n            [\"cornersRight\", 168, 0],\n            [\"emptyTop\", 176, 0],\n            [\"cornersBottom\", 176, 8],\n            [\"emptyRight\", 184, 16],\n            [\"cornersLeft\", 176, 16],\n            [\"emptyBottom\", 160, 24],\n            [\"cornersTop\", 160, 16],\n            [\"leftRightLeft\", 64, 32],\n            [\"cornersTopRight\", 72, 32],\n            [\"topBottomTop\", 80, 32],\n            [\"cornersBottomRight\", 88, 40],\n            [\"leftRightRight\", 88, 48],\n            [\"cornersBottomLeft\", 80, 56],\n            [\"topBottomBottom\", 64, 56],\n            [\"cornersTopLeft\", 64, 48],\n            [\"emptyBottomRight\", 72, 40],\n            [\"emptyBottomLeft\", 80, 40],\n            [\"emptyTopLeft\", 80, 48],\n            [\"emptyTopRight\", 72, 48],\n            [\"leftRightLeft\", 96, 32],\n            [\"emptyTopRight\", 104, 32],\n            [\"topBottomTop\", 112, 32],\n            [\"emptyBottomRight\", 120, 40],\n            [\"leftRightRight\", 120, 48],\n            [\"emptyBottomLeft\", 112, 56],\n            [\"topBottomBottom\", 96, 56],\n            [\"emptyTopLeft\", 96, 48],\n            [\"cornersBottomRight\", 104, 40],\n            [\"cornersBottomLeft\", 112, 40],\n            [\"cornersTopLeft\", 112, 48],\n            [\"cornersTopRight\", 104, 48],\n            [\"emptyTop\", 128, 32],\n            [\"emptyTop\", 144, 32],\n            [\"emptyBottomRight\", 152, 40],\n            [\"emptyTopRight\", 152, 48],\n            [\"emptyBottom\", 144, 56],\n            [\"emptyBottom\", 128, 56],\n            [\"emptyTopLeft\", 128, 48],\n            [\"emptyBottomLeft\", 128, 40],\n            [\"cornersBottomRight\", 136, 40],\n            [\"cornersBottomLeft\", 144, 40],\n            [\"cornersTopLeft\", 144, 48],\n            [\"cornersTopRight\", 136, 48],\n            [\"cornersTopLeft\", 160, 32],\n            [\"emptyTopRight\", 168, 32],\n            [\"cornersBottomRight\", 168, 40],\n            [\"emptyBottomLeft\", 160, 40],\n            [\"emptyTopLeft\", 176, 32],\n            [\"cornersTopRight\", 184, 32],\n            [\"emptyBottomRight\", 184, 40],\n            [\"cornersBottomLeft\", 176, 40],\n            [\"corners\", 160, 48]\n          ]\n          const overlayMap = [\n            [\"emptyLeft\", 0, 0],\n            [\"emptyTopRight\", 8, 0],\n            [\"emptyTop\", 16, 0],\n            [\"emptyTopLeft\", 32, 0],\n            [\"emptyRight\", 40, 0],\n            [\"emptyRight\", 40, 16],\n            [\"emptyRight\", 40, 32],\n            [\"emptyBottomLeft\", 32, 40],\n            [\"emptyBottom\", 16, 40],\n            [\"emptyBottomRight\", 8, 40],\n            [\"emptyLeft\", 0, 32],\n            [\"emptyLeft\", 0, 16],\n            [\"cornersBottomRight\", 8, 8],\n            [\"topBottomBottom\", 16, 8],\n            [\"cornersBottomLeft\", 32, 8],\n            [\"leftRightLeft\", 32, 16],\n            [\"cornersTopLeft\", 32, 32],\n            [\"topBottomTop\", 16, 32],\n            [\"cornersTopRight\", 8, 32],\n            [\"leftRightRight\", 8, 16],\n            [\"full\", 16, 16],\n            [\"topBottomBottomLeft\", 48, 8],\n            [\"fullBottomRight\", 56, 8],\n            [\"leftRightTopRight\", 56, 0],\n            [\"leftRightTopLeft\", 64, 0],\n            [\"fullBottomLeft\", 64, 8],\n            [\"topBottomBottomRight\", 72, 8],\n            [\"topBottomTopRight\", 72, 16],\n            [\"fullTopLeft\", 64, 16],\n            [\"leftRightBottomLeft\", 64, 24],\n            [\"leftRightBottomRight\", 56, 24],\n            [\"fullTopRight\", 56, 16],\n            [\"topBottomTopLeft\", 48, 16],\n            [\"emptyTopLeft\", 48, 0],\n            [\"emptyTopRight\", 72, 0],\n            [\"emptyBottomRight\", 72, 24],\n            [\"emptyBottomLeft\", 48, 24],\n            [\"fullBottom\", 80, 8],\n            [\"leftRightTop\", 80, 0],\n            [\"fullLeft\", 96, 0],\n            [\"topBottomRight\", 104, 0],\n            [\"fullTop\", 96, 16],\n            [\"leftRightBottom\", 96, 24],\n            [\"fullRight\", 88, 16],\n            [\"topBottomLeft\", 80, 16]\n          ]\n          const multiplier = img.width / 80\n          this.full = new Canvas(Math.floor(192 * multiplier), Math.floor(64 * multiplier))\n          this.overlay = new Canvas(Math.floor(112 * multiplier), Math.floor(48 * multiplier))\n          function paste(canvas, img, multiplier, area, x, y) {\n            const [x2, y2, w, h] = coords[area].map(e => Math.floor(e * multiplier))\n            canvas.ctx.drawImage(img, x2, y2, w, h, Math.floor(x * multiplier), Math.floor(y * multiplier), w, h)\n          }\n          for (const [area, x, y] of fullMap) paste(this.full, img, multiplier, area, x, y)\n          for (const [area, x, y] of overlayMap) paste(this.overlay, img, multiplier, area, x, y)\n        },\n        async save() {\n          const dir = Blockbench.pickDirectory()\n          if (!dir) return\n          let img, tileSize, tileCount\n          if (this.mode === \"full\") {\n            img = this.full\n            tileSize = img.width / 12\n            tileCount = 47\n          } else {\n            img = this.overlay\n            tileSize = img.width / 7\n            tileCount = 17\n          }\n          const canvas = new Canvas(tileSize, tileSize)\n          let tile = 0\n          loop:\n          for (let h = 0; h < img.height; h += tileSize) {\n            for (let w = 0; w < img.width; w += tileSize) {\n              canvas.ctx.drawImage(img, w, h, tileSize, tileSize, 0, 0, tileSize, tileSize)\n              await fs.promises.writeFile(PathModule.join(dir, tile + \".png\"), Buffer.from(await (await new Promise(fulfil => canvas.toBlob(fulfil))).arrayBuffer()))\n              canvas.ctx.clearRect(0, 0, tileSize, tileSize)\n              tile++\n              if (tile >= tileCount) {\n                break loop\n              }\n            }\n          }\n          Blockbench.showQuickMessage(\"Exported CTM\")\n        }\n      },\n      template: `\n        <h3>Compact CTM:</h3>\n        <file-input v-model=\"files\" title=\"Select your compact CTM\" @input=\"execute\" max=\"5\" />\n        <h3>Output CTM:</h3>\n        <tab-select v-model=\"mode\" :options=\"modes\" @input=\"execute\" />\n        <canvas-output v-if=\"mode === 'full'\" v-model=\"full\" name=\"full_ctm\" :error=\"error\" height=\"192\" />\n        <canvas-output v-if=\"mode === 'overlay'\" v-model=\"overlay\" name=\"overlay_ctm\" :error=\"error\" height=\"192\" />\n        <button :disabled=\"!full\" @click=\"save\">Export CTM</button>\n      `\n    }\n  },\n  bedConverter: {\n    name: \"Bed Converter\",\n    icon: \"bed\",\n    tagline: \"Convert a bed entity texture into the block texture format.\",\n    description: \"Bed Converter is a tool that splits a bed entity texture into the per-face textures used by the new bed block model format.\",\n    component: {\n      data: {\n        file: null,\n        outputs: [],\n        error: null\n      },\n      computed: {\n        prefix() {\n          const name = this.file?.name ?? (this.file?.path && PathModule.basename(this.file.path))\n          if (!name) return \"\"\n          return name.replace(/\\.[^.]+$/, \"\")\n        }\n      },\n      methods: {\n        async execute() {\n          if (!this.file) {\n            this.outputs = []\n            this.error = null\n            return\n          }\n          const img = this.file.image\n          if (img.width !== img.height) {\n            this.outputs = []\n            this.error = \"Invalid bed texture: must be square\"\n            return\n          }\n          if (Math.log2(img.width) % 1 !== 0 || img.width < 64) {\n            this.outputs = []\n            this.error = \"Invalid bed texture: must be a power-of-2 square at least 64x64\"\n            return\n          }\n          this.error = null\n          const MATRIX = {\n            raw:    (dx, dy, sw, sh, m) => [ 1, 0,  0,  1,  dx        * m,  dy        * m],\n            hflip:  (dx, dy, sw, sh, m) => [-1, 0,  0,  1, (dx + sw)  * m,  dy        * m],\n            vflip:  (dx, dy, sw, sh, m) => [ 1, 0,  0, -1,  dx        * m, (dy + sh)  * m],\n            rot180: (dx, dy, sw, sh, m) => [-1, 0,  0, -1, (dx + sw)  * m, (dy + sh)  * m],\n            rotCW:  (dx, dy, sw, sh, m) => [ 0, 1, -1,  0, (dx + sh)  * m,  dy        * m],\n            rotCCW: (dx, dy, sw, sh, m) => [ 0,-1,  1,  0,  dx        * m, (dy + sw)  * m],\n            transp: (dx, dy, sw, sh, m) => [ 0, 1,  1,  0,  dx        * m,  dy        * m],\n            antitr: (dx, dy, sw, sh, m) => [ 0,-1, -1,  0, (dx + sh)  * m, (dy + sw)  * m]\n          }\n          const FACES = {\n            bed_down:       [[\"rot180\", 28,  6, 16, 16,  0,  0]],\n            bed_head_up:    [[\"raw\",     6,  6, 16, 16,  0,  0]],\n            bed_foot_up:    [[\"raw\",     6, 28, 16, 16,  0,  0]],\n            bed_head_north: [\n              [\"rot180\",  6,  0, 16,  6,  0,  7],\n              [\"raw\",    53, 21,  3,  3,  0, 13],\n              [\"raw\",    56, 21,  3,  3,  3, 13],\n              [\"raw\",    59,  9,  3,  3, 10, 13],\n              [\"raw\",    50,  9,  3,  3, 13, 13]\n            ],\n            bed_foot_south: [\n              [\"vflip\",  22, 22, 16,  6,  0,  7],\n              [\"raw\",    53,  3,  3,  3,  0, 13],\n              [\"raw\",    56,  3,  3,  3,  3, 13],\n              [\"raw\",    59, 15,  3,  3, 10, 13],\n              [\"raw\",    50, 15,  3,  3, 13, 13]\n            ],\n            bed_head_east: [\n              [\"rotCW\",  22,  6,  6, 16,  0,  7],\n              [\"hflip\",  56, 18,  3,  3,  7, 13],\n              [\"raw\",    59, 21,  3,  3, 10, 13],\n              [\"raw\",    50, 21,  3,  3, 13, 13]\n            ],\n            bed_head_west: [\n              [\"rotCCW\",  0,  6,  6, 16,  0,  7],\n              [\"raw\",    53,  9,  3,  3,  0, 13],\n              [\"raw\",    56,  9,  3,  3,  3, 13],\n              [\"antitr\", 56,  6,  3,  3,  6, 13]\n            ],\n            bed_foot_east: [\n              [\"rotCW\",  22, 28,  6, 16,  0,  7],\n              [\"raw\",    53, 15,  3,  3,  0, 13],\n              [\"raw\",    56, 15,  3,  3,  3, 13],\n              [\"transp\", 56, 12,  3,  3,  6, 13]\n            ],\n            bed_foot_west: [\n              [\"rotCCW\",  0, 28,  6, 16,  0,  7],\n              [\"vflip\",  56,  0,  3,  3,  7, 13],\n              [\"raw\",    59,  3,  3,  3, 10, 13],\n              [\"raw\",    50,  3,  3,  3, 13, 13]\n            ]\n          }\n          const m = img.width / 64\n          const outputs = []\n          for (const [faceName, ops] of Object.entries(FACES)) {\n            const canvas = new Canvas(16 * m, 16 * m)\n            const ctx = canvas.ctx\n            ctx.imageSmoothingEnabled = false\n            for (const [tname, sx, sy, sw, sh, dx, dy] of ops) {\n              const [a, b, c, d, e, f] = MATRIX[tname](dx, dy, sw, sh, m)\n              ctx.save()\n              ctx.setTransform(a, b, c, d, e, f)\n              ctx.drawImage(img, sx * m, sy * m, sw * m, sh * m, 0, 0, sw * m, sh * m)\n              ctx.restore()\n            }\n            outputs.push({ name: faceName, canvas })\n          }\n          this.outputs = outputs\n        },\n        async saveAll() {\n          const dir = Blockbench.pickDirectory()\n          if (!dir) return\n          const prefix = this.prefix ? `${this.prefix}_` : \"\"\n          await Promise.all(this.outputs.map(async out => fs.promises.writeFile(\n            PathModule.join(dir, `${prefix}${out.name}.png`),\n            Buffer.from(await (await new Promise(fulfil => out.canvas.toBlob(fulfil))).arrayBuffer())\n          )))\n          Blockbench.showQuickMessage(\"Exported bed textures\")\n        }\n      },\n      template: `\n        <h3>Input bed texture:</h3>\n        <file-input v-model=\"file\" title=\"Select your bed texture\" @input=\"execute\" />\n        <h3 v-if=\"file || error\">Output bed textures:</h3>\n        <div v-if=\"!outputs.length && (file || error)\" style=\"display: flex;\">\n          <canvas-output :error=\"error || 'No output yet…'\" />\n        </div>\n        <div v-if=\"outputs.length\" class=\"row\" style=\"gap: 16px; flex-wrap: wrap;\">\n          <canvas-output v-for=\"out in outputs\" :key=\"out.name\" v-model=\"out.canvas\" :name=\"(prefix ? prefix + '_' : '') + out.name\" :height=\"128\" />\n        </div>\n        <button :disabled=\"!outputs.length\" @click=\"saveAll\">Save All</button>\n      `\n    }\n  },\n  chestConverter: {\n    name: \"Chest Converter\",\n    icon: \"package_2\",\n    tagline: \"Convert chest textures between the 1.14 and 1.15 formats.\",\n    description: \"Chest Converter is a tool that will convert the chest textures between the 1.14 format 1.15 format.\",\n    component: {\n      data: {\n        file: null,\n        files: [],\n        name: \"normal\",\n        output: null,\n        output2: null,\n        error: null,\n        mode: \"normalOld\",\n        modes: {\n          normalOld: \"1.14 format normal\",\n          largeOld: \"1.14 format double\",\n          normalNew: \"1.15 format normal\",\n          largeNew: \"1.15 format double\"\n        }\n      },\n      methods: {\n        async execute() {\n          if ((this.mode === \"normalOld\" || this.mode === \"largeOld\" || this.mode === \"normalNew\") && !this.file) {\n            this.output = null\n            this.output2 = null\n            this.error = null\n            return\n          }\n          if (this.mode === \"largeNew\" && !this.files.length) {\n            this.output = null\n            this.output2 = null\n            this.error = null\n            return\n          }\n          if ((this.mode === \"normalOld\" || this.mode === \"normalNew\") && this.file.image.width !== this.file.image.height) {\n            this.output = null\n            this.output2 = null\n            this.error = \"Invalid chest texture: Normal chest textures must be square\"\n            return\n          }\n          if (this.mode === \"largeOld\" && this.file.image.width !== this.file.image.height * 2) {\n            this.output = null\n            this.output2 = null\n            this.error = \"Invalid chest texture: 1.14 format double chest textures must be in the aspect ratio 2:1\"\n            return\n          }\n          if (this.mode === \"largeNew\") {\n            if (this.files.length < 2) {\n              this.output = null\n              this.output2 = null\n              this.error = \"Please provide both parts of the 1.15 format double chest texture\"\n              return\n            }\n            if (this.files.some(e => e.image.width !== e.image.height)) {\n              this.output = null\n              this.output2 = null\n              this.error = \"Invalid chest texture: 1.15 format double chest textures must be square\"\n              return\n            }\n            if (this.files[0].image.width !== this.files[1].image.width) {\n              this.output = null\n              this.output2 = null\n              this.error = \"Invalid chest texture: Both 1.15 format double chest textures must be the same size\"\n              return\n            }\n          }\n          this.error = null\n          const drawFlipped = (canvas, m, img, x, y, w, h, x2, y2) => canvas.ctx.drawImage(img, Math.floor(x * m), Math.floor(y * m), Math.floor(w * m), Math.floor(h * m), Math.floor(x2 * m), Math.floor(canvas.height - (y2 + h) * m), Math.floor(w * m), Math.floor(h * m))\n          const drawRotated = (canvas, m, img, x, y, w, h, x2, y2) => canvas.ctx.drawImage(img, Math.floor(x * m), Math.floor(y * m), Math.floor(w * m), Math.floor(h * m), Math.floor(canvas.width - (x2 + w) * m), Math.floor(canvas.height - (y2 + h) * m), Math.floor(w * m), Math.floor(h * m))\n          if (this.mode === \"normalOld\" || this.mode === \"normalNew\") {\n            this.name = \"normal\"\n            this.output2 = null\n            const m = this.file.image.width / 64\n            this.output = imageToCanvas(this.file.image)\n            this.output.ctx.save()\n            this.output.ctx.scale(1, -1)\n            this.output.ctx.translate(0, -this.output.height)\n            drawFlipped(this.output, m, this.file.image, 14, 0, 14, 14, 28, 0)\n            drawFlipped(this.output, m, this.file.image, 28, 0, 14, 14, 14, 0)\n            drawFlipped(this.output, m, this.file.image, 14, 19, 14, 14, 28, 19)\n            drawFlipped(this.output, m, this.file.image, 28, 19, 14, 14, 14, 19)\n            drawFlipped(this.output, m, this.file.image, 1, 0, 2, 1, 3, 0)\n            drawFlipped(this.output, m, this.file.image, 3, 0, 2, 1, 1, 0)\n            this.output.ctx.restore()\n            this.output.ctx.rotate(Math.degToRad(180))\n            this.output.ctx.translate(-this.output.width, -this.output.height)\n            drawRotated(this.output, m, this.file.image, 14, 14, 42, 5, 14, 14)\n            drawRotated(this.output, m, this.file.image, 0, 14, 14, 5, 0, 14)\n            drawRotated(this.output, m, this.file.image, 14, 33, 42, 10, 14, 33)\n            drawRotated(this.output, m, this.file.image, 0, 33, 14, 10, 0, 33)\n            drawRotated(this.output, m, this.file.image, 1, 1, 5, 4, 1, 1)\n            drawRotated(this.output, m, this.file.image, 0, 1, 1, 4, 0, 1)\n          } else if (this.mode === \"largeOld\") {\n            this.name = \"normal_left\"\n            const m = this.file.image.width / 128\n            this.output = new Canvas(this.file.image.height, this.file.image.height)\n            this.output.ctx.save()\n            this.output.ctx.scale(1, -1)\n            this.output.ctx.translate(0, -this.output.height)\n            drawFlipped(this.output, m, this.file.image, 59, 0, 15, 14, 14, 0)\n            drawFlipped(this.output, m, this.file.image, 29, 0, 15, 14, 29, 0)\n            drawFlipped(this.output, m, this.file.image, 59, 19, 15, 14, 14, 19)\n            drawFlipped(this.output, m, this.file.image, 29, 19, 15, 14, 29, 19)\n            drawFlipped(this.output, m, this.file.image, 4, 0, 1, 1, 1, 0)\n            drawFlipped(this.output, m, this.file.image, 2, 0, 1, 1, 2, 0)\n            this.output.ctx.restore()\n            this.output.ctx.rotate(Math.degToRad(180))\n            this.output.ctx.translate(-this.output.width, -this.output.height)\n            drawRotated(this.output, m, this.file.image, 29, 14, 44, 5, 14, 14)\n            drawRotated(this.output, m, this.file.image, 29, 33, 44, 10, 14, 33)\n            drawRotated(this.output, m, this.file.image, 2, 1, 3, 4, 1, 1)\n            this.output2 = new Canvas(this.file.image.height, this.file.image.height)\n            this.output2.ctx.save()\n            this.output2.ctx.scale(1, -1)\n            this.output2.ctx.translate(0, -this.output2.height)\n            drawFlipped(this.output2, m, this.file.image, 44, 0, 15, 14, 14, 0)\n            drawFlipped(this.output2, m, this.file.image, 14, 0, 15, 14, 29, 0)\n            drawFlipped(this.output2, m, this.file.image, 44, 19, 15, 14, 14, 19)\n            drawFlipped(this.output2, m, this.file.image, 14, 19, 15, 14, 29, 19)\n            drawFlipped(this.output2, m, this.file.image, 3, 0, 1, 1, 1, 0)\n            drawFlipped(this.output2, m, this.file.image, 1, 0, 1, 1, 2, 0)\n            this.output2.ctx.restore()\n            this.output2.ctx.rotate(Math.degToRad(180))\n            this.output2.ctx.translate(-this.output2.width, -this.output2.height)\n            drawRotated(this.output2, m, this.file.image, 0, 14, 14, 5, 0, 14)\n            drawRotated(this.output2, m, this.file.image, 73, 14, 15, 5, 14, 14)\n            drawRotated(this.output2, m, this.file.image, 14, 14, 15, 5, 43, 14)\n            drawRotated(this.output2, m, this.file.image, 0, 33, 14, 10, 0, 33)\n            drawRotated(this.output2, m, this.file.image, 73, 33, 15, 10, 14, 33)\n            drawRotated(this.output2, m, this.file.image, 14, 33, 15, 10, 43, 33)\n            drawRotated(this.output2, m, this.file.image, 0, 1, 1, 4, 0, 1)\n            drawRotated(this.output2, m, this.file.image, 5, 1, 1, 4, 1, 1)\n            drawRotated(this.output2, m, this.file.image, 1, 1, 1, 4, 3, 1)\n          } else {\n            this.name = \"normal_double\"\n            this.output2 = null\n            const m = this.files[0].image.width / 64\n            this.output = new Canvas(this.files[0].image.width * 2, this.files[0].image.height)\n            this.output.ctx.save()\n            this.output.ctx.scale(1, -1)\n            this.output.ctx.translate(0, -this.output.height)\n            drawFlipped(this.output, m, this.files[0].image, 14, 0, 15, 14, 59, 0)\n            drawFlipped(this.output, m, this.files[1].image, 14, 0, 15, 14, 44, 0)\n            drawFlipped(this.output, m, this.files[0].image, 29, 0, 15, 14, 29, 0)\n            drawFlipped(this.output, m, this.files[1].image, 29, 0, 15, 14, 14, 0)\n            drawFlipped(this.output, m, this.files[0].image, 14, 19, 15, 14, 59, 19)\n            drawFlipped(this.output, m, this.files[1].image, 14, 19, 15, 14, 44, 19)\n            drawFlipped(this.output, m, this.files[0].image, 29, 19, 15, 14, 29, 19)\n            drawFlipped(this.output, m, this.files[1].image, 29, 19, 15, 14, 14, 19)\n            drawFlipped(this.output, m, this.files[0].image, 1, 0, 1, 1, 4, 0)\n            drawFlipped(this.output, m, this.files[1].image, 1, 0, 1, 1, 3, 0)\n            drawFlipped(this.output, m, this.files[0].image, 2, 0, 1, 1, 2, 0)\n            drawFlipped(this.output, m, this.files[1].image, 2, 0, 1, 1, 1, 0)\n            this.output.ctx.restore()\n            this.output.ctx.rotate(Math.degToRad(180))\n            this.output.ctx.translate(-this.output.width, -this.output.height)\n            drawRotated(this.output, m, this.files[0].image, 14, 14, 44, 5, 29, 14)\n            drawRotated(this.output, m, this.files[1].image, 0, 14, 14, 5, 0, 14)\n            drawRotated(this.output, m, this.files[1].image, 14, 14, 15, 5, 73, 14)\n            drawRotated(this.output, m, this.files[1].image, 43, 14, 15, 5, 14, 14)\n            drawRotated(this.output, m, this.files[0].image, 14, 33, 44, 10, 29, 33)\n            drawRotated(this.output, m, this.files[1].image, 0, 33, 14, 10, 0, 33)\n            drawRotated(this.output, m, this.files[1].image, 14, 33, 15, 10, 73, 33)\n            drawRotated(this.output, m, this.files[1].image, 43, 33, 15, 10, 14, 33)\n            drawRotated(this.output, m, this.files[0].image, 1, 1, 3, 4, 2, 1)\n            drawRotated(this.output, m, this.files[1].image, 0, 1, 1, 4, 0, 1)\n            drawRotated(this.output, m, this.files[1].image, 1, 1, 1, 4, 5, 1)\n            drawRotated(this.output, m, this.files[1].image, 3, 1, 1, 4, 1, 1)\n          }\n        }\n      },\n      template: `\n        <h3>Input chest texture{{ mode === 'largeNew' ? \"s\" : \"\" }}:</h3>\n        <tab-select v-model=\"mode\" :options=\"modes\" @input=\"execute\" />\n        <file-input v-if=\"mode !== 'largeNew'\" :key=\"mode\" v-model=\"file\" title=\"Select your chest texture\" @input=\"execute\" />\n        <file-input v-if=\"mode === 'largeNew'\" :key=\"mode\" v-model=\"files\" title=\"Select your chest textures\" @input=\"execute\" max=\"2\" />\n        <h3>Output chest textures:</h3>\n        <div class=\"row\" style=\"gap: 16px;\">\n          <canvas-output v-model=\"output\" :name=\"name\" :error=\"error\" />\n          <canvas-output v-if=\"output2\" v-model=\"output2\" name=\"normal_right\" />\n        </div>\n      `\n    }\n  },\n  imageResizer: {\n    name: \"Image Resizer\",\n    icon: \"resize\",\n    tagline: \"Batch resize images in a folder, relative to their original sizes.\",\n    description: \"Image Resizer is a tool that will go through all images in a folder and resize them, relative to their original size.\",\n    component: {\n      data: {\n        folder: \"\",\n        multiplier: 2,\n        method: \"nearest\",\n        methods: {\n          nearest: \"Nearest\",\n          bilinear: \"Bilinear\"\n        },\n        ignoreList: [],\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run Image Resizer?\", `Are you sure you want to run Image Resizer over the following folder:\\n<code>${formatPath(this.folder)}</code>\\n\\nMake a backup first if you would like to keep the original versions of the images.`)) return\n\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const files = []\n          for await (const file of getFiles(this.folder)) {\n            const shortened = formatPath(file.slice(this.folder.length)).replace(/^\\//, \"\")\n            if (\n              !file.endsWith(\".png\") ||\n              this.ignoreList.some(item => shortened.toLowerCase().includes(item))\n            ) continue\n            files.push([file, shortened])\n          }\n\n          this.total = files.length\n\n          for (const [file, shortened] of files) {\n            if (this.cancelled) break\n            \n            const img = await loadImage(file)\n\n            const width = Math.max(1, Math.round(img.width * this.multiplier))\n            const height = Math.max(1, Math.round(img.height * this.multiplier))\n\n            if (width > 4096 || height > 4096) {\n              output.warn(`Skipping \\`${shortened}\\` as \\`${width}x${height}\\` is over the maxinum size limit (\\`4096x4096\\`)`)\n              this.done++\n              continue\n            }\n\n            const canvas = new Canvas(width, height)\n            \n            if (this.method === \"nearest\") {\n              canvas.ctx.imageSmoothingEnabled = false\n            }\n\n            canvas.ctx.drawImage(img, 0, 0, width, height)\n\n            await fs.promises.writeFile(file, Buffer.from(await (await new Promise(fulfil => canvas.toBlob(fulfil))).arrayBuffer()))\n\n            output.log(`Resized \\`${shortened}\\` from \\`${img.width}x${img.height}\\` to \\`${width}x${height}\\``)\n            this.done++\n          }\n\n          this.total = this.done\n          output.info(\"Finished\")\n          this.status.processing = false\n          this.status.finished = true\n        }\n      },\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <div class=\"row\">\n            <div class=\"col spacer\">\n              <h3>Folder to Resize:</h3>\n              <folder-selector v-model=\"folder\">folder to resize the images of</folder-selector>\n              <select-row v-model=\"method\" :options=\"methods\" width=\"148\">Interpolation method</select-row>\n              <num-input-row v-model=\"multiplier\" :min=\"0.1\" :max=\"256\" :step=\"0.1\" width=\"148\">Size Multiplier</num-input-row>\n              <div>If the input size is <code>16</code>, the output size will be <code>{{ Math.round(16 * multiplier).toLocaleString() }}</code></div>\n            </div>\n            <ignore-list v-model=\"ignoreList\" style=\"align-self: flex-start;\" />\n          </div>\n          <button :disabled=\"!folder\" @click=\"execute\">Resize</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <button v-else @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  clockGenerator: {\n    name: \"Clock Generator\",\n    icon: \"schedule\",\n    tagline: \"Easily generate a full set of clock textures from a simple input texture.\",\n    description: \"Clock Generator is a tool that allows you to quickly and easily generate a full set of clock textures from a simple input texture.\",\n    component: {\n      data: {\n        file: null,\n        frameCount: 32,\n        method: \"nearest\",\n        methods: {\n          nearest: \"Nearest\",\n          bilinear: \"Bilinear\"\n        },\n        gif: null,\n        frames: [],\n        error: null,\n        template: \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQBAMAAACigOGCAAAAMFBMVEUAAAD/APv///8AAAAeHBxJaNhsbIl1KAKyZBHclhPpsRX61kr797f99V///wD///9MIKtdAAAABHRSTlMAAAAzDEMHjAAAAMxJREFUeF5tzKEOgkAcgPH/KFoPXwApGtwYuyazMd/AanJmR0GbzUNnVoLJ4mAkguq9go0mI1oJvADe/8YcG3z1t32gATAGoMyq9CoBLOOsDbrRdfza1sEoJOwTSq0bwvwrwSjLAuFICendEfJcQikSMPyYhJDQaUJiqnrfcv4rA6EQEJujREXAJBSGhAedxPTg2FW6LgBXg/SdRmmIMF0gyBAunAfBE2Fp10HbZDzgJ6UJaz9LzzulsdI6ns/YCgGrAbgec6ENwHWhCT8ruX6BrD+klgAAAABJRU5ErkJggg==\"\n      },\n      methods: {\n        saveTemplate() {\n          Blockbench.export({\n            extensions: [\"png\"],\n            type: \"PNG\",\n            name: \"template\",\n            savetype: \"image\",\n            content: this.template\n          }, () => Blockbench.showQuickMessage(\"Saved template…\"))\n        },\n        async execute() {\n          if (!this.file) {\n            this.gif = null\n            this.error = null\n            return\n          }\n          const size = this.file.image.height\n          if (this.file.image.width !== size * 3) {\n            this.gif = null\n            this.error = \"Invalid texture: The clock texture must be in the aspect ratio 3:1\"\n            return\n          }\n          this.error = null\n          this.frames = []\n          const gif = GIFEnc.GIFEncoder()\n          for (let x = 0; x < this.frameCount; x++) {\n            const canvas = new Canvas(size, size)\n            if (this.method === \"nearest\") {\n              canvas.ctx.imageSmoothingEnabled = false\n            }\n            canvas.ctx.save()\n            canvas.ctx.translate(size / 2, size / 2)\n            canvas.ctx.rotate((360 / this.frameCount * x) * Math.PI / 180)\n            canvas.ctx.drawImage(this.file.image, size, 0, size, size, -size / 2, -size / 2, size, size)\n            canvas.ctx.restore()\n            canvas.ctx.globalCompositeOperation = \"destination-in\"\n            canvas.ctx.drawImage(this.file.image, 2 * size, 0, size, size, 0, 0, size, size)\n            canvas.ctx.globalCompositeOperation = \"source-over\"\n            canvas.ctx.drawImage(this.file.image, 0, 0, size, size, 0, 0, size, size)\n            this.frames.push(canvas)\n            const { data } = canvas.ctx.getImageData(0, 0, size, size)\n            const palette = GIFEnc.quantize(data, 256)\n            const index = GIFEnc.applyPalette(data, palette)\n            let transparent\n            for (let i = data.length - 1; i >= 0; i -= 4) {\n              if (data[i] < 128) {\n                transparent = true\n                break\n              }\n            }\n            gif.writeFrame(index, size, size, {\n              transparent,\n              palette,\n              delay: 50,\n              dispose: 2\n            })\n          }\n          gif.finish()\n          this.gif = gif.bytes()\n        },\n        async save() {\n          const dir = Blockbench.pickDirectory()\n          if (!dir) return\n          await Promise.all(this.frames.map(async (frame, i) => fs.promises.writeFile(PathModule.join(dir, `clock_${i.toString().padStart(2, 0)}.png`), Buffer.from(await (await new Promise(fulfil => frame.toBlob(fulfil))).arrayBuffer()))))\n          Blockbench.showQuickMessage(\"Exported clock\")\n        }\n      },\n      styles: `\n        #template {\n          display: flex;\n          gap: 8px;\n          flex-direction: row;\n        }\n      `,\n      template: `\n        <h3>Template:</h3>\n        <div class=\"row\">\n          <div class=\"spacer\">The input texture consists of three parts: the clock frame (gets overlayed on top), the rotating dial (should cover the entire area), and a mask to control the dial's visibility (solid pixels show the dial, transparent pixels hide it).</div>\n          <div class=\"col\" style=\"margin-top: -32px;\">\n            <img class=\"checkerboard\" width=\"192\" height=\"64\" :src=\"template\">\n            <button style=\"margin-top: -8px;\" @click=\"saveTemplate\">Save template</button>\n          </div>\n        </div>\n        <h3>Input texture:</h3>\n        <file-input v-model=\"file\" title=\"Select your clock texture\" @input=\"execute\" />\n        <div>\n          <num-input-row v-model=\"frameCount\" :min=\"2\" :max=\"360\" width=\"148\" @input=\"execute\">Frame count</num-input-row>\n          <select-row v-model=\"method\" :options=\"methods\" width=\"148\" @input=\"execute\">Interpolation method</select-row>\n        </div>\n        <h3>Output clock:</h3>\n        <canvas-output v-model=\"gif\" name=\"clock\" :error=\"error\" type=\"GIF\" />\n        <button :disabled=\"!gif\" @click=\"save\">Export Clock</button>\n      `\n    }\n  },\n  animationCombiner: {\n    name: \"Animation Combiner\",\n    icon: \"theaters\",\n    tagline: \"Combine a folder of textures into an animated spritesheet texture.\",\n    description: \"Animation Combiner is a tool that combines the textures from a selected folder into an animated spritesheet texture.\",\n    component: {\n      data: {\n        folder: \"\",\n        ignoreList: [],\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        gif: null,\n        output: null,\n        type: \"vertical\",\n        types: {\n          vertical: \"Vertical\",\n          horizonal: \"Horizontal\"\n        },\n        delay: 1,\n        interpolation: false,\n        width: null,\n        height: null\n      },\n      methods: {\n        async execute() {\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = null\n          this.cancelled = false\n          this.gif = null\n          this.width = null\n          this.height = null\n\n          if (!await exists(this.folder)) {\n            this.status.finished = true\n            this.status.processing = false\n            this.total = 0\n            output.error(`The folder \\`${formatPath(this.folder)}\\` was not found`)\n            return\n          }\n\n          const files = await listFiles(this.folder, \"png\")\n          \n          this.total = files.length\n\n          const frames = []\n\n          for (const file of files) {\n            if (this.cancelled) break\n            let img\n            try {\n              img = await loadImage(PathModule.join(this.folder, file))\n            } catch {\n              output.error(`Skipping \\`${shortened}\\` as it could not be read`)\n              this.done++\n              continue\n            }\n            if (!this.width) {\n              this.width = img.width\n              this.height = img.height\n              output.log(`Animation frame size set to \\`${this.width}x${this.height}\\`. Loaded from \\`${file}\\``)\n            } else if (img.width !== this.width || img.height !== this.height) {\n              output.warn(`Skipping \\`${file}\\` as its size \\`${img.width}x${img.height}\\` does not match the animation frame size \\`${this.width}x${this.height}\\``)\n              this.done++\n              continue\n            }\n            frames.push(img)\n            this.done++\n          }\n\n          if (!this.cancelled) {\n            const gif = GIFEnc.GIFEncoder()\n            if (this.type === \"vertical\") {\n              this.output = new Canvas(this.width, this.height * frames.length)\n            } else {\n              this.output = new Canvas(this.width * frames.length, this.height)\n            }\n            let delay, interpolationFrames, opacityMultiplier\n            if (this.interpolation) {\n              if (this.delay === 1) {\n                delay = 25\n                interpolationFrames = 1\n                opacityMultiplier = 0.5\n              } else if (this.delay === 2) {\n                delay = 17\n                interpolationFrames = 2\n                opacityMultiplier = 0.33\n              } else if (this.delay === 3) {\n                delay = 13\n                interpolationFrames = 3\n                opacityMultiplier = 0.25\n              } else {\n                delay = this.delay * 10\n                interpolationFrames = 4\n                opacityMultiplier = 0.2\n              }\n            }\n            for (const [i, frame] of frames.entries()) {\n              if (this.type === \"vertical\") {\n                this.output.ctx.drawImage(frame, 0, i * this.height)\n              } else {\n                this.output.ctx.drawImage(frame, i * this.width, 0)\n              }\n              const canvas = imageToCanvas(frame)\n              const { data } = canvas.ctx.getImageData(0, 0, this.width, this.height)\n              const palette = GIFEnc.quantize(data, 256)\n              const index = GIFEnc.applyPalette(data, palette)\n              let transparent\n              for (let i = data.length - 1; i >= 0; i -= 4) {\n                if (data[i] < 128) {\n                  transparent = true\n                  break\n                }\n              }\n              if (this.interpolation) {\n                gif.writeFrame(index, this.width, this.height, {\n                  transparent,\n                  palette,\n                  delay: this.delay * 10\n                })\n                const nextFrame = frames[i + 1] ?? frames[0]\n                for (let j = 1; j <= interpolationFrames; j++) {\n                  const interpolatedCanvas = imageToCanvas(frame)\n                  const ctx = interpolatedCanvas.ctx\n                  ctx.drawImage(frame, 0, 0)\n                  ctx.globalAlpha = j * opacityMultiplier\n                  ctx.drawImage(nextFrame, 0, 0)\n                  ctx.globalAlpha = 1\n\n                  const { data } = ctx.getImageData(0, 0, this.width, this.height)\n                  const palette = GIFEnc.quantize(data, 256)\n                  const index = GIFEnc.applyPalette(data, palette)\n                  gif.writeFrame(index, this.width, this.height, {\n                    transparent,\n                    palette,\n                    delay\n                  })\n                }\n              } else {\n                gif.writeFrame(index, this.width, this.height, {\n                  transparent,\n                  palette,\n                  delay: this.delay * 50,\n                  dispose: 2\n                })\n              }\n            }\n            gif.finish()\n            this.gif = gif.bytes()\n          }\n\n          this.total = this.done\n          output.info(\"Finished\")\n          this.status.processing = false\n          this.status.finished = true\n        },\n        async save() {\n          Blockbench.export({\n            extensions: [\"png\"],\n            type: \"PNG\",\n            name: \"animation\",\n            savetype: \"buffer\",\n            content: Buffer.from(await (await new Promise(fulfil => this.output.toBlob(fulfil))).arrayBuffer())\n          }, async file => {\n            const mcmeta = {\n              animation: {}\n            }\n            if (this.delay > 1) {\n              mcmeta.animation.frametime = this.delay\n            }\n            if (this.interpolation) {\n              mcmeta.animation.interpolate = true\n            }\n            if (this.type === \"vertical\" && this.width !== this.height) {\n              mcmeta.animation.height = this.height\n            } else if (this.type === \"horizonal\") {\n              mcmeta.animation.width = this.width\n            }\n            await fs.promises.writeFile(file + \".mcmeta\", JSON.stringify(mcmeta, null, 2))\n            Blockbench.showQuickMessage(\"Exported animation\")\n          })\n        }\n      },\n      styles: `\n        #template {\n          display: flex;\n          gap: 8px;\n          flex-direction: row;\n        }\n      `,\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <h3>Input folder:</h3>\n          <folder-selector v-model=\"folder\">folder containing the animation frames</folder-selector>\n          <select-row v-model=\"type\" :options=\"types\" width=\"53\">Format</select-row>\n          <num-input-row v-model=\"delay\" :min=\"1\" :max=\"400\" width=\"53\">Delay</num-input-row>\n          <checkbox-row v-model=\"interpolation\">Interpolation</checkbox-row>\n          <button :disabled=\"!folder\" @click=\"execute\">Combine</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" small />\n          <canvas-output v-model=\"gif\" name=\"animation\" type=\"GIF\" />\n          <button v-if=\"status.processing\" @click=\"cancelled = true\">Cancel</button>\n          <div v-else class=\"button-row\">\n            <button @click=\"save\">Export Animation</button>\n            <button @click=\"status.finished = false\">Done</button>\n          </div>\n        </div>\n      `\n    }\n  },\n  soundsStripper: {\n    name: \"Sounds Stripper\",\n    icon: \"volume_up\",\n    tagline: \"Remove all unedited entries from the Minecraft sounds.json file.\",\n    description: \"Sounds Stripper is a tool that will go through the sounds.json file in an resource pack and remove any entries that have not been modified.\",\n    component: {\n      data: {\n        file: null,\n        outputLog,\n        done: 0,\n        total: null,\n        cancelled: false,\n        mode: \"default\",\n        version: \"\"\n      },\n      methods: {\n        async execute() {\n          if (!await confirm(\"Run Sounds Stripper?\", `Are you sure you want to run Sounds Stripper over the following file:\\n<code>${formatPath(this.file.path)}</code>\\n\\nMake a backup first if you would like to keep an un-stripped version of the sounds.json.`)) return\n\n          outputLog.length = 0\n          this.status.finished = false\n          this.status.processing = true\n          this.done = 0\n          this.total = 1\n\n          const vanilla = JSON.parse(await getObject(\"assets/minecraft/sounds.json\", this.version))\n          const sounds = JSON.parse(this.file.content)\n          \n          const logs = []\n\n          function stringify(arr) {\n            const out = []\n            for (let item of arr) {\n              if (typeof item === \"string\") {\n                item = {\n                  name: item\n                }\n              }\n              item.volume ??= 1\n              item.pitch ??= 1\n              item.weight ??= 1\n              item.stream ??= false\n              item.attenuation_distance ??= 16\n              item.preload ??= false\n              item.type ??= \"file\"\n              out.push(JSON.stringify(Object.entries(item).sort((a, b) => a[0].localeCompare(b[0]))))\n            }\n            return JSON.stringify(out.sort())\n          }\n\n          let modified\n          for (const [key, data] of Object.entries(sounds)) {\n            if (key in vanilla) {\n              const before = JSON.stringify(data)\n              if (data.sounds) {\n                if (stringify(data.sounds) === stringify(vanilla[key].sounds)) {\n                  delete data.sounds\n                  delete data.replace\n                } else {\n                  for (const [i, sound] of data.sounds.entries()) {\n                    if (typeof sound === \"string\") continue\n                    if (sound.volume === 1) delete sound.volume\n                    if (sound.pitch === 1) delete sound.pitch\n                    if (sound.weight === 1) delete sound.weight\n                    if (sound.stream === false) delete sound.stream\n                    if (sound.attenuation_distance === 16) delete sound.attenuation_distance\n                    if (sound.preload === false) delete sound.preload\n                    if (sound.type === \"file\") delete sound.type\n                    if (\"name\" in sound && Object.keys(sound).length === 1) {\n                      data.sounds[i] = sound.name\n                    }\n                  }\n                }\n              }\n              if (data.subtitle === vanilla[key].subtitle) {\n                delete data.subtitle\n              }\n              if (!Object.keys(data).length) {\n                modified = true\n                delete sounds[key]\n                logs.push(`Removed \\`${key}\\``)\n              } else if (JSON.stringify(data) !== before) {\n                modified = true\n                logs.push(`Optimised \\`${key}\\``)\n              }\n            }\n          }\n\n          if (modified) {\n            await fs.promises.writeFile(this.file.path, JSON.stringify(sounds, null, 2))\n          } else {\n            output.log(\"No changes were made\")\n          }\n\n          for (const log of logs) {\n            output.log(log)\n          }\n\n          this.done = 1\n          output.info(\"Finished\")\n          this.status.processing = false\n          this.status.finished = true\n        }\n      },\n      styles: `\n        .component-versionSelector {\n          align-self: flex-start;\n        }\n      `,\n      template: `\n        <div v-if=\"!status.processing && !status.finished\">\n          <h3>Select your sounds.json:</h3>\n          <file-input v-model=\"file\" title=\"Select your sounds.json file\" type=\"sounds.json\" :extensions=\"['json']\" />\n          <version-selector v-model=\"version\" />\n          <button :disabled=\"!file\" @click=\"execute\">Strip</button>\n        </div>\n        <div v-else>\n          <progress-bar :done=\"done\" :total=\"total\" />\n          <output-log v-model=\"outputLog\" />\n          <button v-if=\"!status.processing\" @click=\"status.finished = false\">Done</button>\n        </div>\n      `\n    }\n  },\n  langBuilder: {\n    name: \"Lang Builder\",\n    icon: \"glyphs\",\n    tagline: \"Easily make language file changes that support every language.\",\n    description: \"Lang Builder lets you define language key modifications using replacement, prefix, or suffix modes. Changes are applied to all vanilla language files.\",\n    info: `\n      <h3>What is Lang Builder?</h3>\n      <p>\n        Lang Builder is a tool for creating and managing Minecraft language files for resource packs.\n        It allows you to quickly modify, remove, or add text entries across all in-game languages, without manually editing each file.\n        This is ideal for customising item names, UI text, or adding special characters and formatting consistently in multiple languages.\n      </p>\n      <br>\n      <h3>Features:</h3>\n      <ul>\n        <li>Supports multiple edit modes:\n          <ul>\n            <li><code>Replace</code> - Completely replace the original text</li>\n            <li><code>Blank</code> - Set the text to be empty</li>\n            <li><code>Prefix</code> - Add text before the original text</li>\n            <li><code>Suffix</code> - Add text after the original text</li>\n            <li><code>Prefix &amp; Suffix</code> - Add text both before and after the original text</li>\n          </ul>\n        </li>\n        <li>Automatically applies your changes to all the games language files</li>\n        <li>Exports valid JSON language files ready for use in a resource pack</li>\n      </ul>\n      <br>\n      <h3>How to Use:</h3>\n      <ol>\n        <li>Select a Minecraft Version to load, or select and load an existing config file</li>\n        <li>Add entries by clicking <strong>Add Entry</strong> and set the key, mode, and values</li>\n        <li>Choose your output folder</li>\n        <li>Click <strong>Build Languages</strong> to generate the language files</li>\n      </ol>\n      <br>\n      <h3>Warnings and Errors:</h3>\n      <p>Entry keys will be outlined with a <span style=\"margin: 0 2px; outline: 2px solid var(--color-warning); padding: 0 4px; background-color: var(--color-back);\">Warning</span> when they key does not exist in the selected game version.</p>\n      <p style=\"margin-top: 4px;\">Entry keys will be outlined with an <span style=\"margin: 0 2px; outline: 2px solid var(--color-error); padding: 0 2px; background-color: var(--color-back);\">Error</span> when they are empty, or are duplicated.</p>\n    `,\n    component: {\n      data: {\n        version: \"\",\n        newVersion: \"\",\n        file: \"\",\n        outputLog,\n        languages: [],\n        lang: {},\n        data: [],\n        modes: {\n          replace: \"Replace\",\n          blank: \"Blank\",\n          prefix: \"Prefix\",\n          suffix: \"Suffix\",\n          prefixSuffix: \"Prefix & Suffix\"\n        },\n        folder: \"\",\n        sortCol: null,\n        sortDir: null,\n        filter: \"\",\n        state: \"home\",\n        savePath: null\n      },\n      computed: {\n        entryList() {\n          const filter = this.filter.toLowerCase()\n          return this.data.filter(e => e.key.toLowerCase().includes(filter) || e.mode.includes(filter) || e.value?.toLowerCase().includes(filter) || e.value2?.toLowerCase().includes(filter))\n        }\n      },\n      methods: {\n        async loadVersion() {\n          this.status.processing = true\n          this.state = \"loading\"\n          outputLog.length = 0\n          this.savePath = null\n\n          if (!(await this.load(this.version))) return\n\n          this.data = [{\n            key: \"\",\n            mode: \"replace\",\n            value: \"\"\n          }]\n\n          this.state = \"loaded\"\n          this.status.processing = false\n        },\n        async loadConfig() {\n          this.status.processing = true\n          this.state = \"loading\"\n          outputLog.length = 0\n\n          this.savePath = this.file.path\n\n          let data\n          try {\n            data = JSON.parse(this.file.content)\n          } catch {\n            output.error(`The file \\`${PathModule.basename(this.file.path)}\\` could not be read`)\n            this.state = \"error\"\n            this.status.processing = false\n            return\n          }\n\n          if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\n            output.error(`The file \\`${PathModule.basename(this.file.path)}\\` is not a valid config file`)\n            this.state = \"error\"\n            this.status.processing = false\n            return\n          }\n\n          if (Object.values(data).every(v => typeof v === \"string\")) {\n            output.log(`Detected language file. Converting to entries array with replace mode`)\n            output.log(`Using selcted version \\`${this.version}\\``)\n            data = {\n              entries: Object.entries(data).map(([k, v]) => ({\n                key: k,\n                mode: \"replace\",\n                value: v\n              }))\n            }\n          }\n\n          if (!data.version) {\n            data.version = this.version\n            output.log(`Config missing version. Using selcted version \\`${this.version}\\``)\n          }\n\n          if (!(await this.load(data.version))) return\n\n          if (this.version !== data.version) {\n            this.version = data.version\n          }\n\n          if (typeof data.output === \"string\") {\n            this.folder = data.output\n          }\n\n          if (data.entries && !(this.validateEntries(data.entries))) {\n            this.state = \"error\"\n            this.status.processing = false\n            return\n          }\n\n          this.data = data.entries ?? [{\n            key: \"\",\n            mode: \"replace\",\n            value: \"\"\n          }]\n\n          this.state = \"loaded\"\n          this.status.processing = false\n        },\n        async load(version, errorState = \"error\") {\n          this.folder = \"\"\n          this.filter = \"\"\n\n          const jar = await getVersionJar(version)\n          if (!jar) {\n            output.error(`Unknown game version \\`${version}\\``)\n            this.state = errorState\n            this.status.processing = false\n            return\n          }\n\n          if (!jar.files[\"assets/minecraft/lang/en_us.json\"]) {\n            output.error(\"Only game versions that use JSON language files are supported.\")\n            this.state = errorState\n            this.status.processing = false\n            return\n          }\n\n          const assetsIndex = await getVersionAssetsIndex(version)\n          const root = getRoot(version)\n\n          const data = assetsIndex.objects[\"pack.mcmeta\"]\n          const objectPath = `${data.hash.slice(0, 2)}/${data.hash}`\n          const fullPath = (await exists(PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)))\n            ? PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", objectPath)\n            : PathModule.join(cacheDir, \"objects\", objectPath)\n\n          if (!await exists(fullPath)) {\n            const file = Buffer.from(await fetch(`https://resources.download.minecraft.net/${objectPath}`).then(r => r.arrayBuffer()))\n            await fs.promises.mkdir(PathModule.dirname(fullPath), { recursive: true })\n            await fs.promises.writeFile(fullPath, file)\n            output.log(\"Downloaded pack.mcmeta to cache\")\n          }\n\n          const packMeta = JSON.parse(await fs.promises.readFile(fullPath, \"utf-8\"))\n          this.languages = packMeta.language\n          this.languages.en_us.data = JSON.parse(jar.files[\"assets/minecraft/lang/en_us.json\"].content)\n          this.lang = this.languages.en_us.data\n\n          const codes = Object.keys(this.languages)\n\n          const results = await Promise.all(codes.map(async code => {\n            const langPath = `assets/minecraft/lang/${code}.json`\n            const entry = assetsIndex.objects[langPath.slice(root.length + 1)]\n            if (!entry) return [code, null]\n\n            const langObjectPath = `${entry.hash.slice(0, 2)}/${entry.hash}`\n            const filePath = (await exists(PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", langObjectPath)))\n              ? PathModule.join(settings.ewan_minecraft_directory.value, \"assets\", \"objects\", langObjectPath)\n              : PathModule.join(cacheDir, \"objects\", langObjectPath)\n\n            if (!await exists(filePath)) {\n              const file = Buffer.from(await fetch(`https://resources.download.minecraft.net/${langObjectPath}`).then(r => r.arrayBuffer()))\n              await fs.promises.mkdir(PathModule.dirname(filePath), { recursive: true })\n              await fs.promises.writeFile(filePath, file)\n              output.log(`Downloaded ${code}.json to cache`)\n            }\n\n            const json = JSON.parse(await fs.promises.readFile(filePath, \"utf-8\"))\n            return [code, json]\n          }))\n\n          for (const [code, langData] of results) {\n            if (langData) this.languages[code].data = langData\n          }\n\n          this.keys = Object.fromEntries(\n            Object.entries(this.lang).map(([k, v]) => {\n              let str = `${k}: ${v}`\n              if (str.length > 100) str = str.slice(0, 99) + \"…\"\n              return [k, str]\n            })\n          )\n\n          return true\n        },\n        validateEntries(entries) {\n          if (!Array.isArray(entries)) {\n            output.error(\"Entries must be an array\")\n            return\n          }\n\n          for (const [i, entry] of entries.entries()) {\n            if (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n              output.error(`Entry ${i + 1}: Must be an object`)\n              return\n            }\n\n            if (typeof entry.key !== \"string\") {\n              output.error(`Entry ${i + 1}: Key must be a string`)\n              return\n            }\n            if (!entry.key) {\n              output.error(`Entry ${i + 1}: Key is required`)\n              return\n            }\n\n            if (typeof entry.mode !== \"string\" || !(entry.mode in this.modes)) {\n              output.error(`Entry ${i + 1}: Invalid mode`)\n              return\n            }\n\n            if (typeof entry.value !== \"string\" && !(entry.mode === \"blank\" && entry.value === undefined)) {\n              output.error(`Entry ${i + 1}: Value must be a string`)\n              return\n            }\n\n            if (entry.mode === \"prefixSuffix\") {\n              if (typeof entry.value2 !== \"string\") {\n                output.error(`Entry ${i + 1}: Value2 must be a string for Prefix & Suffix mode`)\n                return\n              }\n              if (!entry.value2) {\n                output.error(`Entry ${i + 1}: Value2 is required for Prefix & Suffix mode`)\n                return\n              }\n            }\n          }\n\n          return true\n        },\n        addEntry() {\n          this.data.push({\n            key: \"\",\n            mode: \"replace\",\n            value: \"\"\n          })\n          this.$nextTick(() => this.$refs.entries.scrollTop = this.$refs.entries.scrollHeight)\n        },\n        keyInput(entry) {\n          if (!entry.value && this.lang[entry.key]) {\n            entry.value = this.lang[entry.key]\n          }\n        },\n        keyInputFocus: evt => {\n          const el = evt.currentTarget\n          setTimeout(() => {\n            el.style.direction = \"ltr\"\n            el.scrollLeft = el.scrollWidth\n          }, 0)\n        },\n        keyInputBlur: evt => evt.currentTarget.style.direction = \"rtl\",\n        valuePlaceholder(entry) {\n          if (entry.mode === \"replace\") {\n            return this.lang[entry.key] ?? \"Stone\"\n          } else if (entry.mode === \"suffix\") {\n            return \"Suffix\"\n          } else {\n            return \"Prefix\"\n          }\n        },\n        changeMode(entry) {\n          if (entry.mode === \"blank\") {\n            delete entry.value\n          } else {\n            entry.value = \"\"\n          }\n          if (entry.mode === \"prefixSuffix\") {\n            entry.value2 = \"\"\n          } else {\n            delete entry.value2\n          }\n        },\n        cleanData() {\n          this.data = this.data.map(entry => {\n            const key = entry.key.trim() ?? \"\"\n            let mode = entry.mode\n\n            if (mode === \"prefixSuffix\") {\n              if (entry.value && !entry.value2) {\n                mode = \"prefix\"\n              } else if (!entry.value && entry.value2) {\n                mode = \"suffix\"\n                entry.value = entry.value2\n              }\n              if (mode !== \"prefixSuffix\") delete entry.value2\n            }\n\n            return { ...entry, key, mode }\n          }).filter(entry => {\n            if (!entry.key) return false\n            if (entry.mode === \"prefix\" && !entry.value) return false\n            if (entry.mode === \"suffix\" && !entry.value) return false\n            if (entry.mode === \"prefixSuffix\") return entry.value && entry.value2\n            return true\n          })\n        },\n        saveAs() {\n          this.cleanData()\n          if (!this.data.length) {\n            this.data.push({\n              key: \"\",\n              mode: \"replace\",\n              value: \"\"\n            })\n            Blockbench.showQuickMessage(\"Nothing to save\")\n            return\n          }\n          Blockbench.export({\n            extensions: [\"json\"],\n            type: \"Language Config\",\n            name: \"lang_config\",\n            content: JSON.stringify({\n              version: this.version,\n              output: this.folder,\n              entries: this.data\n            }, null, 2)\n          }, path => {\n            this.savePath = path\n            Blockbench.showQuickMessage(\"Saved language config\")\n          })\n        },\n        async save() {\n          this.cleanData()\n          if (!this.data.length) {\n            this.data.push({\n              key: \"\",\n              mode: \"replace\",\n              value: \"\"\n            })\n            Blockbench.showQuickMessage(\"Nothing to save\")\n            return\n          }\n          if (!(await exists(PathModule.dirname(this.savePath)))) {\n            Blockbench.showQuickMessage(\"Save location not found\")\n            this.savePath = null\n          }\n          await fs.promises.writeFile(this.savePath, JSON.stringify({\n            version: this.version,\n            output: this.folder,\n            entries: this.data\n          }, null, 2), \"utf-8\")\n          Blockbench.showQuickMessage(\"Saved language config\")\n        },\n        entryOptions(evt, index) {\n          const menu = []\n          if (this.data.length > 1) {\n            menu.push({\n              id: \"remove\",\n              name: \"Remove\",\n              icon: \"delete\",\n              click: () => this.data.splice(index, 1)\n            })\n          }\n          new Menu(\"entry_context_menu\", menu).open(evt)\n        },\n        changeSort(col) {\n          if (this.sortCol !== col) {\n            this.sortCol = col\n            this.sortDir = \"up\"\n          } else if (this.sortDir === \"up\") {\n            this.sortDir = \"down\"\n          } else {\n            this.sortCol = null\n            this.sortDir = null\n          }\n\n          const dir = this.sortDir === \"down\" ? -1 : 1\n\n          this.data.sort((a, b) => {\n            if (!this.sortCol || !this.sortDir) {\n              return a.key.localeCompare(b.key, undefined, { numeric: true, sensitivity: \"base\" })\n            }\n\n            if (this.sortCol === \"key\") {\n              return a.key.localeCompare(b.key, undefined, { numeric: true, sensitivity: \"base\" }) * dir\n            }\n\n            if (this.sortCol === \"mode\") {\n              const cmp = a.mode.localeCompare(b.mode, undefined, { numeric: true, sensitivity: \"base\" }) * dir\n              return cmp || a.key.localeCompare(b.key, undefined, { numeric: true, sensitivity: \"base\" })\n            }\n\n            if (this.sortCol === \"value\") {\n              return (a.value ?? \"\").localeCompare(b.value ?? \"\", undefined, { numeric: true, sensitivity: \"base\" }) * dir\n            }\n\n            return 0\n          })\n        },\n        async build() {\n          this.cleanData()\n          if (!this.data.length) {\n            this.data.push({\n              key: \"\",\n              mode: \"replace\",\n              value: \"\"\n            })\n            Blockbench.showQuickMessage(\"Nothing to save\")\n            return\n          }\n\n          if (!await confirm(\"Build language files?\", `Are you sure you want to build the language files?\\n\\nAny existing language files in the <code>${formatPath(this.folder)}</code> directory will be overwritten.`)) return\n\n          this.status.processing = true\n          this.state = \"building\"\n\n          await fs.promises.mkdir(this.folder, { recursive: true })\n\n          output.log(`Building to \\`${formatPath(this.folder)}\\``)\n\n          const sortedKeys = [...new Set(this.data.map(e => e.key))].sort((a, b) => a.localeCompare(b, undefined, { numeric: true, sensitivity: \"base\" }))\n\n          const codes = Object.keys(this.languages)\n\n          for (const code of codes) {\n            const base = this.languages[code].data\n            const out = {}\n\n            for (const entry of this.data) {\n              const orig = base[entry.key] ?? \"\"\n              let value\n\n              switch (entry.mode) {\n                case \"replace\":\n                  value = entry.value\n                  break\n                case \"prefix\":\n                  value = entry.value + orig\n                  break\n                case \"suffix\":\n                  value = orig + entry.value\n                  break\n                case \"prefixSuffix\":\n                  value = entry.value + orig + entry.value2\n                  break\n                case \"blank\":\n                  value = \"\"\n                  break\n                default:\n                  continue\n              }\n\n              out[entry.key] = value\n            }\n\n            const ordered = {}\n            for (const k of sortedKeys) {\n              if (k in out) ordered[k] = out[k]\n            }\n\n            let json = JSON.stringify(ordered, null, 2)\n            json = json.replace(/\\\\\\\\u([0-9a-fA-F]{4})/g, \"\\\\u$1\")\n\n            await fs.promises.writeFile(PathModule.join(this.folder, code + \".json\"), json, \"utf-8\")\n            output.log(`Done \\`${code}.json\\``)\n          }\n\n          output.info(\"Build complete\")\n\n          this.status.processing = false\n          this.state = \"built\"\n        },\n        async changeVersion() {\n          this.status.processing = true\n          this.state = \"switching\"\n\n          output.log(`Switching from \\`${this.version}\\` to \\`${this.newVersion}\\``)\n\n          if (!(await this.load(this.newVersion, \"switchError\"))) return\n\n          this.version = this.newVersion\n\n          this.state = \"loaded\"\n          this.status.processing = false\n        },\n        keyClass(entry) {\n          if (entry.key === \"\" || this.data.filter(e => e.key === entry.key).length > 1) return \"error\"\n          if (!this.lang[entry.key]) return \"warning\"\n        }\n      },\n      styles: `\n        > div {\n          margin-left: 2px;\n        }\n\n        input {\n          text-overflow: ellipsis;\n        }\n\n        .entries {\n          display: flex;\n          flex-direction: column;\n          gap: 8px;\n          max-height: calc(256px + 29px + 8px);\n          overflow-y: auto;\n          margin-top: -8px;\n          margin-left: -2px;\n          padding-bottom: 2px;\n\n          > button {\n            align-self: flex-start;\n          }\n        } \n\n        .entry,\n        .entry-prop {\n          display: flex;\n          gap: 8px;\n\n          > * {\n            height: 32px;\n          }\n\n          &:first-child {\n            margin-left: 2px;\n          }\n\n          &.warning {\n            outline: 2px solid var(--color-warning);\n          }\n\n          &.error {\n            outline: 2px solid var(--color-error);\n          }\n        }\n\n        .entry-prop {\n          gap: 0;\n        }\n\n        .key-input {\n          width: 200px;\n          direction: rtl;\n          text-align: left;\n        }\n\n        .key-select {\n          width: 32px;\n          min-width: 32px;\n          padding: 0;\n          color: transparent;\n\n          &::before {\n            right: 50%;\n            transform: translate(50%, calc(-50% - 7px));\n            color: var(--color-text);\n            text-align: center;\n          }\n        }\n\n        .mode-select {\n          min-width: 126px;\n        }\n\n        .entry-value {\n          flex: 1;\n          min-width: 128px;\n        }\n\n        .column-titles {\n          display: flex;\n          gap: 16px;\n          border-bottom: 1px solid var(--color-border);\n          line-height: 1;\n          position: sticky;\n          top: 0;\n          background-color: var(--color-ui);\n          z-index: 1;\n          margin-left: 2px;\n\n          > * {\n            padding: 6px 0;\n          }\n\n          > :first-child {\n            width: 228px;\n          }\n\n          > :nth-child(2) {\n            width: 118px;\n          }\n\n          > :nth-child(3) {\n            flex: 1;\n          }\n\n          > :not(:last-child) {\n            cursor: pointer;\n            position: relative;\n\n            &::after {\n              content: \"\";\n              position: absolute;\n              top: 0;\n              bottom: 0;\n              right: -8px;\n              border-right: 1px solid var(--color-border);\n            }\n\n            &::before {\n              content: \"arrow_upward\";\n              position: absolute;\n              right: 0;\n              font-family: 'Material Icons';\n              opacity: 0;\n            }\n\n            &.down::before {\n              opacity: 1;\n              transform: scaleY(-1);\n            }\n\n            &.up::before {\n              opacity: 1;\n            }\n\n            &:hover {\n              color: var(--color-light);\n            }\n          }\n        }\n\n        .add-entry {\n          align-self: flex-start;\n          margin-top: -8px;\n        }\n\n        .output-bar {\n          display: flex;\n          align-items: center;\n          gap: 8px;\n\n          .component-folderSelector {\n            flex: 1;\n          }\n        }\n\n        .no-results {\n          height: 32px;\n        }\n      `,\n      template: `\n        <div v-if=\"state === 'home'\">\n          <h3>Select a Minecraft version:</h3>\n          <version-selector v-model=\"version\" />\n          <button @click=\"loadVersion\">Load Version</button>\n          <div class=\"divider\">OR</div>\n          <h3>Select a language config file:</h3>\n          <file-input v-model=\"file\" title=\"Select your language config file\" type=\"lang_config.json\" :extensions=\"['json']\" />\n          <button :disabled=\"!file\" @click=\"loadConfig\">Load Config</button>\n        </div>\n        <div v-else-if=\"state === 'loading' || state === 'error'\">\n          <output-log v-model=\"outputLog\" />\n          <button :disabled=\"state !== 'error'\" @click=\"state = 'home'\">Back</button>\n        </div>\n        <div v-else-if=\"state === 'loaded'\" class=\"entry-builder\">\n          <div class=\"button-row\">\n            <button @click=\"state='home'\">Back</button>\n            <button @click=\"state='change'\">Minecraft Version: {{ version }}</button>\n          </div>\n          <div class=\"divider\"></div>\n          <search-bar v-model=\"filter\" placeholder=\"Filter…\" />\n          <div v-if=\"entryList.length\" class=\"entries\" ref=\"entries\">\n            <div class=\"column-titles\">\n              <div :class=\"sortCol === 'key' ? sortDir : ''\" @click=\"changeSort('key')\">Key</div>\n              <div :class=\"sortCol === 'mode' ? sortDir : ''\" @click=\"changeSort('mode')\">Mode</div>\n              <div :class=\"sortCol === 'value' ? sortDir : ''\" @click=\"changeSort('value')\">Value</div>\n              <div style=\"width: 28px\"></div>\n            </div>\n            <div v-for=\"(entry, index) in entryList\" :key=\"index\" class=\"entry\">\n              <div class=\"entry-prop\" :class=\"keyClass(entry)\">\n                <input class=\"key-input\" type=\"text\" placeholder=\"block.minecraft.stone\" v-model=\"entry.key\" @input=\"keyInput(entry)\" @focus=\"keyInputFocus\" @blur=\"keyInputBlur\">\n                <select-input class=\"key-select\" v-model=\"entry.key\" :options=\"keys\" @input=\"keyInput(entry)\" />\n              </div>\n              <select-input class=\"mode-select\" v-model=\"entry.mode\" :options=\"modes\" @input=\"changeMode(entry)\" />\n              <input class=\"entry-value\" type=\"text\" :placeholder=\"valuePlaceholder(entry)\" v-model=\"entry.value\" :style=\"{ visibility: entry.mode === 'blank' ? 'hidden' : 'initial' }\">\n              <input class=\"entry-value\" v-if=\"entry.mode === 'prefixSuffix'\" type=\"text\" placeholder=\"Suffix\" v-model=\"entry.value2\">\n              <button class=\"material-icons\" @click=\"entryOptions($event, index)\">menu</button>\n            </div>\n          </div>\n          <div v-else class=\"no-results\">No results…</div>\n          <button class=\"add-entry\" @click=\"addEntry\"><i class=\"material-icons\">add</i>Add Entry</button>\n          <div class=\"divider\"></div>\n          <div class=\"output-bar\">\n            <div>Output location:</div>\n            <folder-selector v-model=\"folder\">folder to output the built language files to</folder-selector>\n          </div>\n          <div class=\"button-row\">\n            <div class=\"button-row\">\n              <button @click=\"saveAs\"><i class=\"material-icons\">save</i>Save Config…</button>\n              <button v-if=\"savePath\" @click=\"save\"><i class=\"material-icons\">save</i>Quick Save</button>\n            </div>\n            <button :disabled=\"!folder\" @click=\"build\"><i class=\"material-icons\">build</i>Build Languages</button>\n          </div>\n        </div>\n        <div v-else-if=\"state === 'building' || state === 'built'\">\n          <output-log v-model=\"outputLog\" />\n          <button :disabled=\"state !== 'built'\" @click=\"state = 'loaded'\">Back</button>\n        </div>\n        <div v-else-if=\"state === 'change'\">\n          <h3>Select a new Minecraft version:</h3>\n          <version-selector v-model=\"newVersion\" />\n          <div class=\"button-row\">\n            <button @click=\"newVersion = version; state = 'loaded'\">Back</button>\n            <button :disabled=\"version === newVersion\" @click=\"changeVersion\">Switch to {{ newVersion }}</button>\n          </div>\n        </div>\n        <div v-else-if=\"state === 'switching' || state === 'switchError'\">\n          <output-log v-model=\"outputLog\" />\n          <button :disabled=\"state !== 'switchError'\" @click=\"state = 'loaded'\">Back</button>\n        </div>\n      `\n    }\n  }\n}\n\nglobalThis.resourcePackUtilities = utilities\n\nsetupPlugin()"
  },
  {
    "path": "plugins/resourcepack_packager.js",
    "content": "/* Blockbench \"resourcepack_packager\" Plugin created by leopoldhub*/\n\n/** This work is licensed under the Creative Commons Attribution 4.0 International License.\nTo view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. */\n\n/* the source code is in the \"src/resourcepack_packager\" folder! */\n(()=>{var e={187:e=>{\"use strict\";var t,r=\"object\"==typeof Reflect?Reflect:null,n=r&&\"function\"==typeof r.apply?r.apply:function(e,t,r){return Function.prototype.apply.call(e,t,r)};t=r&&\"function\"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(r,n){function o(r){e.removeListener(t,i),n(r)}function i(){\"function\"==typeof e.removeListener&&e.removeListener(\"error\",o),r([].slice.call(arguments))}m(e,t,i,{once:!0}),\"error\"!==t&&function(e,t,r){\"function\"==typeof e.on&&m(e,\"error\",t,r)}(e,o,{once:!0})}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var a=10;function s(e){if(\"function\"!=typeof e)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof e)}function c(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function u(e,t,r,n){var o,i,a,u;if(s(r),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit(\"newListener\",t,r.listener?r.listener:r),i=e._events),a=i[t]),void 0===a)a=i[t]=r,++e._eventsCount;else if(\"function\"==typeof a?a=i[t]=n?[r,a]:[a,r]:n?a.unshift(r):a.push(r),(o=c(e))>0&&a.length>o&&!a.warned){a.warned=!0;var l=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+\" \"+String(t)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");l.name=\"MaxListenersExceededWarning\",l.emitter=e,l.type=t,l.count=a.length,u=l,console&&console.warn&&console.warn(u)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function f(e,t,r){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:r},o=l.bind(n);return o.listener=r,n.wrapFn=o,o}function p(e,t,r){var n=e._events;if(void 0===n)return[];var o=n[t];return void 0===o?[]:\"function\"==typeof o?r?[o.listener||o]:[o]:r?function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(o):v(o,o.length)}function d(e){var t=this._events;if(void 0!==t){var r=t[e];if(\"function\"==typeof r)return 1;if(void 0!==r)return r.length}return 0}function v(e,t){for(var r=new Array(t),n=0;n<t;++n)r[n]=e[n];return r}function m(e,t,r,n){if(\"function\"==typeof e.on)n.once?e.once(t,r):e.on(t,r);else{if(\"function\"!=typeof e.addEventListener)throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function o(i){n.once&&e.removeEventListener(t,o),r(i)}))}}Object.defineProperty(i,\"defaultMaxListeners\",{enumerable:!0,get:function(){return a},set:function(e){if(\"number\"!=typeof e||e<0||o(e))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+e+\".\");a=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if(\"number\"!=typeof e||e<0||o(e))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+e+\".\");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return c(this)},i.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t.push(arguments[r]);var o=\"error\"===e,i=this._events;if(void 0!==i)o=o&&void 0===i.error;else if(!o)return!1;if(o){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var s=new Error(\"Unhandled error.\"+(a?\" (\"+a.message+\")\":\"\"));throw s.context=a,s}var c=i[e];if(void 0===c)return!1;if(\"function\"==typeof c)n(c,this,t);else{var u=c.length,l=v(c,u);for(r=0;r<u;++r)n(l[r],this,t)}return!0},i.prototype.addListener=function(e,t){return u(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return u(this,e,t,!0)},i.prototype.once=function(e,t){return s(t),this.on(e,f(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return s(t),this.prependListener(e,f(this,e,t)),this},i.prototype.removeListener=function(e,t){var r,n,o,i,a;if(s(t),void 0===(n=this._events))return this;if(void 0===(r=n[e]))return this;if(r===t||r.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit(\"removeListener\",e,r.listener||t));else if(\"function\"!=typeof r){for(o=-1,i=r.length-1;i>=0;i--)if(r[i]===t||r[i].listener===t){a=r[i].listener,o=i;break}if(o<0)return this;0===o?r.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(r,o),1===r.length&&(n[e]=r[0]),void 0!==n.removeListener&&this.emit(\"removeListener\",e,a||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,r,n;if(void 0===(r=this._events))return this;if(void 0===r.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==r[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete r[e]),this;if(0===arguments.length){var o,i=Object.keys(r);for(n=0;n<i.length;++n)\"removeListener\"!==(o=i[n])&&this.removeAllListeners(o);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(t=r[e]))this.removeListener(e,t);else if(void 0!==t)for(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},i.prototype.listeners=function(e){return p(this,e,!0)},i.prototype.rawListeners=function(e){return p(this,e,!1)},i.listenerCount=function(e,t){return\"function\"==typeof e.listenerCount?e.listenerCount(t):d.call(e,t)},i.prototype.listenerCount=d,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},932:(e,t,r)=>{\"use strict\";const n=r(504);e.exports=e=>{if(!n(e))return!1;const t=e.trim().match(n.regex),r={};if(t[1]){r.mediaType=t[1].toLowerCase();const e=t[1].split(\";\").map((e=>e.toLowerCase()));r.contentType=e[0],e.slice(1).forEach((e=>{const t=e.split(\"=\");r[t[0]]=t[1]}))}return r.base64=!!t[t.length-2],r.data=t[t.length-1]||\"\",r.toBuffer=()=>{const e=r.base64?\"base64\":\"utf8\";return Buffer.from(r.data,e)},r}},378:function(e,t,r){\"use strict\";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});const i=o(r(418)),a=o(r(87)),s=r(292),c=r(352);class u extends Dialog{constructor(e){super({id:\"export-resourcepack-form-dialog\",title:\"Export resourcepack\",form:{resourcepackName:{label:\"Resourcepack Name\",type:\"text\",value:e.resourcepackName},resourcepackVersion:{label:\"Resourcepack Version\",type:\"select\",options:Object.fromEntries(Object.entries(i.default).map((e=>e.reverse()))),value:e.resourcepackVersion},resourcepackDescription:{label:\"Resourcepack Description\",type:\"textarea\",value:e.resourcepackDescription},enableResourcepackCredits:{label:\"Enable Credits\",type:\"checkbox\",value:e.enableResourcepackCredits},resourcepackCredits:{label:\"Resourcepack Credits\",type:\"text\",value:e.resourcepackCredits},modelType:{label:\"Model type\",type:\"select\",options:{block:\"block\",item:\"item\"},value:e.modelType},namespace:{label:\"Namespace\",type:\"text\",value:e.namespace},modelId:{label:\"Model id\",type:\"text\",value:e.modelId},enableAnimation:{label:\"Enable Animation\",type:\"checkbox\",value:e.enableAnimation},frameTime:{label:\"Time between frames\",type:\"number\",min:1,value:e.frameTime},frameStart:{label:\"Starting frame\",description:\"must be inferior to the number of frames in your animation\",type:\"number\",min:0,value:e.frameStart},interpolate:{label:\"Interpolate\",description:'generate \"between-frames\" if frametime > 1',type:\"checkbox\",value:e.interpolate}},onConfirm:e=>n(this,void 0,void 0,(function*(){const t=e;(0,s.setResourcepackFormDialogOptions)(t),(0,c.saveArchive)(yield(0,a.default)(t),t.resourcepackName)}))})}}t.default=u},751:function(e,t,r){\"use strict\";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});const o=n(r(308)),i=r(292),a=n(r(378));class s extends Action{constructor(){super(\"export-resourcepack-menu-action\",{name:\"Export resourcepack\",icon:\"fa-file-zipper\",click:()=>{this.exportResourcepackFormDialog.show()},condition:()=>\"java_block\"===Format.id}),this.exportResourcepackFormDialog=new a.default((0,i.getResourcepackFormDialogOptions)()),o.default.once(\"unload\",this.exportResourcepackFormDialog.delete)}}t.default=s},607:function(e,t,r){\"use strict\";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});const o=n(r(751)),i=n(r(308));i.default.on(\"load\",(()=>{const e=new o.default;MenuBar.addAction(e,\"file.export\"),i.default.once(\"unload\",(()=>{try{e.delete()}catch(e){}}))})),Plugin.register(\"resourcepack_packager\",{title:\"Resourcepack Packager\",author:\"leopoldhub\",description:\"Export your java models and texture into a resourcepack\",icon:\"fa-file-zipper\",tags:[\"Minecraft: Java Edition\",\"Resourcepack\",\"Exporter\"],variant:\"both\",version:\"1.0.1\",oninstall:()=>{i.default.emit(\"install\")},onload:()=>{i.default.emit(\"load\")},onuninstall:()=>{i.default.emit(\"uninstall\")},onunload:()=>{i.default.emit(\"unload\")}})},418:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});t.default={1.8:1,\"1.9-1.10\":2,\"1.11-1.12\":3,\"1.13-1.14\":4,\"1.15-1.16.1\":5,\"1.16.2-1.16.5\":6,\"1.17.17.1\":7,\"1.18-1.18.2\":8,\"1.19-1.19.2\":9,\"1.19.3\":12}},308:function(e,t,r){\"use strict\";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});const o=n(r(187));t.default=new o.default},87:function(e,t,r){\"use strict\";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0});const i=o(r(583)),a=r(811),s=r(352);t.default=function(e){return n(this,void 0,void 0,(function*(){const t=new i.default;try{t.file(\"pack.png\",yield(0,a.obtainBase64PackIcon)(),{base64:!0})}catch(e){console.error(\"unable to add pack icon... reason: \",e)}(0,s.archiveManifest)(t,e.resourcepackDescription,parseInt(e.resourcepackVersion,10));const r=(0,s.getNamespaceTexturesFolder)(t,e.namespace,e.modelType),n=(0,s.getNamespaceModelsFolder)(t,e.namespace,e.modelType);return(0,s.archiveTextures)(r,e.namespace,e.modelType,e.modelId,e.frameTime,e.frameStart,e.interpolate),(0,s.archiveModel)(n,e.modelId,e.enableResourcepackCredits,e.resourcepackCredits),t}))}},292:function(e,t,r){\"use strict\";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.resetResourcepackFormDialogOptions=t.setResourcepackFormDialogOptions=t.getResourcepackFormDialogOptions=t.getDefaultResourcepackFormDialogOptions=void 0;const o=n(r(418));let i;function a(){return{resourcepackName:\"blockbench-pack\",resourcepackDescription:\"\",enableResourcepackCredits:!0,resourcepackCredits:'Created with Blockbench [Exported as resourcepack with the \"resourcepack_packager\" plugin]',resourcepackVersion:Object.values(o.default).reverse()[0].toString(),namespace:\"minecraft\",modelId:\"stone\",modelType:\"block\",enableAnimation:!0,frameTime:1,frameStart:0,interpolate:!1}}t.getDefaultResourcepackFormDialogOptions=a,t.getResourcepackFormDialogOptions=function(){return i||(i=a()),i},t.setResourcepackFormDialogOptions=function(e){i=e},t.resetResourcepackFormDialogOptions=function(){i=void 0}},352:function(e,t,r){\"use strict\";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{c(n.next(e))}catch(e){i(e)}}function s(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.saveArchive=t.archiveModel=t.archiveTextures=t.archiveManifest=t.getNamespaceTexturesFolder=t.getNamespaceModelsFolder=t.getNamespaceAssetsFolder=void 0;const o=r(811),i=r(10),a=r(723);function s(e,t){var r;return null===(r=e.folder(\"assets\"))||void 0===r?void 0:r.folder(t)}t.getNamespaceAssetsFolder=s,t.getNamespaceModelsFolder=function(e,t,r){var n,o;return null===(o=null===(n=s(e,t))||void 0===n?void 0:n.folder(\"models\"))||void 0===o?void 0:o.folder(r)},t.getNamespaceTexturesFolder=function(e,t,r){var n,o;return null===(o=null===(n=s(e,t))||void 0===n?void 0:n.folder(\"textures\"))||void 0===o?void 0:o.folder(r)},t.archiveManifest=function(e,t,r){e.file(\"pack.mcmeta\",autoStringify((0,o.buildManifest)(t,r)))},t.archiveTextures=function(e,t,r,n,s,c,u){const l=e.folder(n);Texture.all.forEach((e=>{const f=`${(0,a.hardObtainProperty)(e,\"name\")}.png`;if(e.frameCount&&e.frameCount>1){let t=(0,i.createIncrementalArray)(e.frameCount);t=(0,i.cutAndSwapArray)(t,c),null==l||l.file(`${f}.mcmeta`,autoStringify((0,o.createTextureAnimation)(s,t,u)))}(0,a.hardDefineProperty)(e,\"folder\",`${r}/${n}`),(0,a.hardDefineProperty)(e,\"namespace\",t),null==l||l.file(f,e.getBase64(),{base64:!0})}))},t.archiveModel=function(e,t,r=!1,n=\"\"){null==e||e.file(`${t}.json`,autoStringify((0,o.compileJavaBlockCodec)(r,n)))},t.saveArchive=function(e,t){return e.generateAsync({type:\"blob\"}).then((e=>n(this,void 0,void 0,(function*(){Blockbench.export({type:\"Zip Archive\",extensions:[\"zip\"],name:t,content:e,savetype:\"zip\"})}))))}},10:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.cutAndSwapArray=t.createIncrementalArray=void 0,t.createIncrementalArray=function(e){return[...[...Array(e)].keys()]},t.cutAndSwapArray=function(e,t){return[...e.slice(t,e.length),...e.slice(0,t)]}},811:function(e,t,r){\"use strict\";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.createTextureAnimation=t.compileJavaBlockCodec=t.buildManifest=t.obtainBase64PackIcon=void 0;const o=n(r(932));t.obtainBase64PackIcon=function(){return new Promise(((e,t)=>{Screencam.cleanCanvas({width:100,height:100},(r=>{const n=(0,o.default)(r);n||t(new Error(\"unable to parse screenshot data url\")),e(n.data)}))}))},t.buildManifest=function(e,t){return{pack:{description:e,pack_format:t}}},t.compileJavaBlockCodec=function(e=!1,t=\"\"){const r=Codecs.java_block.compile({raw:!0});return r.credit=e?t:\"\",r},t.createTextureAnimation=function(e,t,r){return{animation:{frametime:e,frames:t,interpolate:r}}}},723:(e,t)=>{\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),t.hardObtainProperty=t.hardDefineProperty=void 0,t.hardDefineProperty=function(e,t,r){Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0})},t.hardObtainProperty=function(e,t){var r;return null===(r=Object.entries(e).find((([e])=>e===t)))||void 0===r?void 0:r[1]}},504:function(e,t){var r,n,o;n=[],void 0===(o=\"function\"==typeof(r=function(){\"use strict\";function e(t){return e.regex.test((t||\"\").trim())}return e.regex=/^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s<>]*?)$/i,e})?r.apply(t,n):r)||(e.exports=o)},583:e=>{\"use strict\";e.exports=JSZip}},t={};(function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,r),i.exports})(607)})();"
  },
  {
    "path": "plugins/root_motion_extractor.js",
    "content": "(function() {\n\n    const planeGeometry = new THREE.PlaneBufferGeometry(64, 64 );\n    const planeMaterial = new THREE.MeshBasicMaterial({color: 0x00FFDD,side: THREE.DoubleSide, transparent: true, opacity: 0.3});\n    const plane = new THREE.Mesh(planeGeometry, planeMaterial);\n    var floorHeight = 0;\n\n    plane.rotation.x = -Math.PI / 2;\n    plane.position.y = floorHeight;\n\n    const action = new Action({\n        id: 'root_motion_extractor',\n        name: 'Extract Root Motion',\n        icon: \"fa-person-running\",\n        click: () => {\n            scene.add( plane );\n            let dia = new Dialog({\n                id: 'extractor_dialog',\n                title: 'Extract Root Motion',\n                form : {\n                    floorHeight : {label: 'Floor Height', type: 'number', value: floorHeight, step: 0.5, min: -1024.0, max: 1024.0},\n                },\n                onFormChange: (formData) => {\n                    floorHeight = formData.floorHeight;\n                    scene.remove(plane);\n                    plane.position.y = floorHeight;\n                    scene.add(plane);\n                },\n                onConfirm: (formData) => {\n                    scene.remove(plane);\n                    dia.hide();\n                    runThroughFrames();\n                },\n                onCancel: () => {\n                    scene.remove(plane);\n                }\n            }).show();\n            \n        }\n    })\n\n    Plugin.register(\"root_motion_extractor\", {\n        title: \"Root Motion Extractor\",\n        icon: \"fa-exchange\",\n        author: \"Tschipp\",\n        description: \"Attempts to extract root motion from an animation\",\n        version: \"1.1.0\",\n        tags: [\"Minecraft: Bedrock Edition\"],\n        onload() {\n            Blockbench.on(\"select_mode\", (event) => {\n                if (event.mode.name != \"Animate\")\n                    scene.remove( plane );\n            });\n\n            Blockbench.on(\"display_animation_frame\", onAnimFrame);\n\n            MenuBar.addAction(action, 'animation');\n        },\n        onunload() {\n            Blockbench.removeListener(\"select_mode\");\n            Blockbench.removeListener(\"display_animation_frame\", onAnimFrame);\n            action.delete();\n        }\n    });\n\n    \n    var oldSpheres = [];\n\n    function findFloorContacts(frame, previousContacts)\n    {\n        let contacts = {};\n        for(let sp of oldSpheres)\n            scene.remove(sp);\n        oldSpheres = [];\n\n        Outliner.root.forEach(root => {\n            if (root instanceof Group)\n                root.forEachChild(child => {\n                    //Threejs mesh\n                    let mesh = child.getMesh();\n                    //get the vertices in world space and print their coordinates\n                    let vertices = mesh.geometry.attributes.position;\n                    let cubeid = mesh.geometry.uuid;\n                    let positions = [];\n                    for (let i = 0; i < vertices.count; i += vertices.itemSize) {\n                        let pos = new THREE.Vector3(vertices.array[i], vertices.array[i + 1], vertices.array[i + 2]);\n                        pos.applyMatrix4(mesh.matrixWorld);\n                        positions.push({[cubeid + \"_\" + i] : pos});\n\n                        //render a sphere at the vertex\n                        if(pos.y < floorHeight)\n                        {\n                            let sphereGeometry = new THREE.SphereGeometry(0.3, 8, 8);\n                            let sphereMaterial = new THREE.MeshBasicMaterial({color: 0x00FF11, transparent: true, opacity: 0.5});\n                            let sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);\n                            sphere.position.copy(pos);\n                            scene.add(sphere);\n                            oldSpheres.push(sphere);\n                        }  \n                    }\n\n                    let cFilter = (contact) => {\n                        let vertId = Object.keys(contact)[0];\n                        let lastContact = undefined;\n\n                        for(let k in previousContacts) {\n                            let conts = previousContacts[k];\n                            for(let c of conts) {\n                                if(vertId === Object.keys(c)[0]) {\n                                    lastContact = c;\n                                }\n                            }\n\n                        }\n\n                        if(lastContact) {\n\n                            let y = lastContact[vertId].y;\n                            let res = false;\n                            if(y < floorHeight)\n                                res = contact[vertId].y >= floorHeight;\n                            else\n                                res = contact[vertId].y < floorHeight;\n\n                            return res;\n                        }\n\n                        return contact[vertId].y < floorHeight;\n                    };\n\n\n                    let filtered = positions.filter(cFilter);\n                    if(filtered.length > 0)\n                    {\n                        let cont = contacts[frame];\n                        if(!cont)\n                            cont = [];\n\n                        cont.push(...filtered);\n                        contacts[frame] = cont;\n                    }\n\n                }, Cube, false);\n        });\n\n        return contacts;\n    }\n\n    var processingMotion = false;\n    var processedContacts = {}\n    var motionData = {};\n\n    function runThroughFrames() {\n        if(Animator.selected)\n        {\n            processedContacts = {};\n            console.log(\"Extracting root motion...\");\n            Timeline.time = 0;\n            Timeline.start();\n\n            processingMotion = true;\n        }\n    }\n\n    \n\n    function onAnimFrame()\n    {\n        if(processingMotion)\n        {\n            let length = Timeline.animation_length > 0 ? Timeline.animation_length : 10;\n            if(Timeline.time >= length)\n            {\n                console.log(\"Finished processing motion\");\n                Blockbench.showQuickMessage('Finished extracting root motion');\n                processingMotion = false;\n                console.log(processedContacts);\n                processMotionData();\n                // await Timeline.pause();\n                return;\n            }\n\n            let res = findFloorContacts(Timeline.time, processedContacts);\n            processedContacts = Object.assign(processedContacts, res);\n        }\n        \n    }\n\n    function processMotionData() {\n        motionData = {};\n\n        let temp = {};\n\n        for(let frame in processedContacts)\n        {\n            let contacts = processedContacts[frame];\n            for(let contact of contacts)\n            {\n                let key = Object.keys(contact)[0];\n                if(temp[key])\n                {\n                    let prev = motionData[key];\n                    if(!prev)\n                        prev = [];\n\n                    prev.push({\n                        startTime : temp[key].frame,\n                        endTime : frame,\n                        startPos : temp[key][key],\n                        endPos : contact[key]\n                    });\n\n                    motionData[key] = prev;\n                    delete temp[key];\n                }\n                else\n                {\n                    temp[key] = {...contact, frame: frame};\n                }\n            }\n        }\n\n        console.log(motionData);\n        computeAverageRootMotion();\n    }\n\n    function computeAverageRootMotion()\n    {\n        let size = 0;\n        for(let key in motionData)\n        {\n            let data = motionData[key];\n            size += data.length;\n        }\n\n        let factor = 1.0 / size;\n\n        let avgSpeed = 0;\n\n        for(let key in motionData)\n        {\n            let data = motionData[key];\n            for(let d of data)\n            {\n                let diff = d.endPos.clone().sub(d.startPos);\n                diff.y = 0;\n                let timeDiff = d.endTime - d.startTime;\n                avgSpeed += factor * (diff.length() / timeDiff);\n            }\n        }\n\n        for(let old of oldSpheres)\n            scene.remove(old);\n\n        let statsDialog = new Dialog({\n            id: 'stats_dialog',\n            title: 'Root Motion Statistics',\n            onConfirm: () => {\n                Timeline.pause();\n                statsDialog.hide();\n            },\n            onCancel: () => {\n                Timeline.pause();\n            },\n            lines : [`<p>Average speed (pixels/s): ${avgSpeed.toFixed(5)}</p>`,\n                     `<p>Average speed (m/s): ${(avgSpeed / 16.0).toFixed(5)}</p>`,\n                     `<p>Movement Component Speed: ${((avgSpeed / 16.0) / (6.6 * Math.sqrt((avgSpeed / 16.0)))).toFixed(5)}</p>`,\n                     `<p>Animation Time Factor: divide by ${(avgSpeed / 2).toFixed(5)} or mulitply by ${(2/avgSpeed).toFixed(5)}</p>`]\n        }).show();\n    }\n\n    \n\n})();"
  },
  {
    "path": "plugins/sam3dj.js",
    "content": "/** sam3DJ | aka. Sammy's .3DJ (format implementation)\r\n *  ==================================================\r\n *  Author:     Sammy L. Koch (1Turtle)\r\n *  Licence:    Apache-2.0 (see https://www.apache.org/licenses/LICENSE-2.0.txt)\r\n*/\r\n\r\n(function() {    \r\n    const pluginProperties = {\r\n        \r\n        title: 'sam3DJ',\r\n        author: '1Turtle',\r\n        tags: ['Minecraft: Java Edition', 'Format', 'Exporter'],\r\n        version: '1.1.0',\r\n        variant: 'both',\r\n        description: 'Generate 3D prints in MC (Java Edition) via the .3DJ format within the SC-Peripherals mod!',\r\n        about: \"This plugin allows you to **export a model into the .3DJ format**.  \\nThe .3DJ format is _mostly_ used with the `3D Printer` from the **SC-Peripherals** Java Edition mod.  \\n  \\n**Tip:** Cubes in a `state_on` folder will be _only_ displayed whenever the model is toggled on!    \\n> **Note:** _The format does not support the following attributes:_  \\n> * Rotated cubes  \\n> * One cube with multiple textures  \\n> * Cubes outside the given block space *(16x16x16 Grid / 1x1x1 Block)*  \\n  \\nTry to avoid those things, or else you might run into weird results.  \\nMeshes are also not supported due to the limitations of the format and Minecraft.\\n> For the full format documentations, see the [SwitchCraft3 Wiki](https://docs.sc3.io/whats-new/sc-peripherals.html#_3dj-format)  \\n\",\r\n        icon: 'print',\r\n        onload() {\r\n            MenuBar.addAction(btnExport, 'file.export');\r\n        },\r\n        onunload() {\r\n            MenuBar.removeAction('file.export.export_3dj');\r\n        }\r\n    };\r\n    \r\n    const SC_TEXTURE_BLANK = 'sc-peripherals:block/white';\r\n    \r\n    /**\r\n     * Returns a fitting tint color for the given cube. (and with fitting we mean the first pixel we can find...)\r\n     * @param {*} cube The cube which holds the wanted texture.\r\n     * @returns The hex code for the tint color of the texture.\r\n     */\r\n    function getTint(cube) {  //Get Tint function\r\n        let tmp = cube.faces['up'].getTexture();  //Gets texture for top face\r\n        if (tmp) {\r\n            targetRectangle = cube.faces['up'].getBoundingRect();  \r\n        \r\n            targetCanvas = Painter.getCanvas(tmp);\r\n            targetContext = targetCanvas.getContext('2d');\r\n            buffer = targetContext.getImageData(targetRectangle.ax, targetRectangle.ay, 1, 1);\r\n        \r\n            var hex = [  //converts RGB to hex value and adds to array\r\n                Math.round(buffer.data[0]).toString(16),\r\n                Math.round(buffer.data[1]).toString(16),\r\n                Math.round(buffer.data[2]).toString(16)\r\n            ];\r\n            for (var i = 0; i < hex.length; i++) {  //standardises values to 2, by adding zero if not long enough\r\n                if (hex[i].length === 1) {\r\n                    hex[i] = '0' + hex[i];\r\n                }\r\n            }\r\n\r\n            return hex.join(\"\");\r\n        }\r\n        return \"000000\"; // Has no texture and therefore no tint\r\n    }\r\n\r\n    function getSingleTexture(cube) {\r\n        let faces = 0;\r\n        let missing = false;\r\n        let texture = SC_TEXTURE_BLANK;\r\n        let Tint = getTint(cube);  //Calls to get Cube Top Face colour\r\n    \r\n        for (let dir in cube.faces) { //in ['north', 'east', 'south', 'west', 'up', 'down']\r\n            let tmp = cube.faces[dir].getTexture();\r\n    \r\n            if (!tmp) {\r\n                if (typeof cube.parent === 'object' && cube.parent.name.includes(\":block/\")) {\r\n                    texture = cube.parent.name;\r\n                    tmp = true;\r\n                }\r\n\r\n                if (cube.name.includes(\":block/\")) {\r\n                    texture = cube.name;\r\n                    tmp = true;\r\n                }\r\n\r\n                if (!tmp) {\r\n                    missing = true;\r\n                }\r\n            } else {\r\n                // Generate actual ID\r\n                let id = tmp.namespace + ':' + tmp.folder + '/' + (tmp.name.replace(/\\.[^/.]+$/, \"\"))\r\n    \r\n                if (texture !== id)\r\n                    faces++;\r\n                texture = id;\r\n            }\r\n        }\r\n        \r\n        return {\r\n            texture: texture,\r\n            textureTint: Tint,\r\n            missingTexture: missing,\r\n            multipleTexture: (faces > 1),\r\n        };\r\n    }\r\n    \r\n    /**\r\n     * Converts a given element to a shape in .3DJ format.\r\n     * @param {*} obj The given element (e.g. Cube).\r\n     * @returns The fianl shape (+ some booleans) in a object.\r\n     */\r\n    function genShape(cube, raw = false, useTint = false) {\r\n        \r\n\r\n        let result = getSingleTexture(cube);\r\n        \r\n        let shape = {\r\n            bounds: [\r\n                cube.from[0],\r\n                cube.from[1],\r\n                cube.from[2],\r\n    \r\n                cube.to[0],\r\n                cube.to[1],\r\n                cube.to[2],\r\n            ],\r\n            texture: result.texture,\r\n        };\r\n    \r\n        if (!raw) {\r\n            if (useTint) {\r\n                // Use Tint color of texture instead of the textures name.\r\n                shape.tint = result.textureTint;  \r\n                shape.texture = SC_TEXTURE_BLANK;\r\n            } else {\r\n                //default behaviour\r\n                shape.tint = 'FFFFFF';\r\n            }\r\n        }\r\n    \r\n        return {\r\n            shape: shape,\r\n            missingTexture: result.missingTexture,\r\n            multipleTexture: result.multipleTexture,\r\n        };\r\n    }\r\n    \r\n    function isStateON(group) {\r\n        if (group.name === 'state_on') {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Generates the object that contains the shapes in .3DJ format (off state only).\r\n     * @param {*} objects Contains all elements.\r\n     * @returns The final shapes (+ some booleans) in a object.\r\n     */\r\n    function genModel(elements, raw = false, useTint) {\r\n        let shapeOFF = [];\r\n        let shapeON = [];\r\n        \r\n        for (const cube of elements)\r\n            if (cube instanceof Cube && cube.visibility) {\r\n                let stateON = false;\r\n                if (typeof cube.parent === 'object')\r\n                    stateON = isStateON(cube.parent)\r\n                    \r\n                let result = genShape(cube, raw, useTint);\r\n                if (stateON)\r\n                    shapeON.push(result.shape);\r\n                else\r\n                    shapeOFF.push(result.shape);\r\n    \r\n                if (result.missingTexture || result.multipleTexture)\r\n                    Blockbench.showQuickMessage('Some cubes got a blank texture', 4000);\r\n            }\r\n    \r\n        return {on: shapeON, off: shapeOFF};\r\n    }\r\n    \r\n    /**\r\n     * Returns the given value or undefined, whenever the string is usable or not.\r\n     * @param {*} value\r\n     * @returns The value or undefined.\r\n     */\r\n    function aditionalValue(value) {\r\n        return (typeof value === 'string' && value.trim() !== '') ? value : undefined;\r\n    }\r\n    \r\n    /**\r\n     * Compiles a whole project to the .3DJ format (Used for exporting).\r\n     * @param {*} options\r\n     * @returns The final object in the .3DJ format.\r\n     */\r\n    function compile3DJ(options = {}) {\r\n        let output = { }\r\n    \r\n        if (!options.raw) {\r\n            output.label            =  aditionalValue(options.label);\r\n            output.tooltip          =  aditionalValue(options.tooltip);\r\n            output.isButton         =  options.isBtn;\r\n            output.collideWhenOn    =  options.collideOn;\r\n            output.collideWhenOff   =  options.collideOff;\r\n            output.lightLevel       =  options.lightLvl;\r\n            output.redstoneLevel    =  options.redstoneLvl;\r\n            if (options.isSeat) output.seatPos = options.seatPos;\r\n        }\r\n        \r\n        const shapes = genModel(Project.elements, options.raw, options.useTint);\r\n        output.shapesOff = shapes.off;\r\n        output.shapesOn = shapes.on;\r\n    \r\n        return output;\r\n    }\r\n    \r\n    const codec3dj = new Codec('codec_3dj', {\r\n        name: \"3DJ model\",\r\n        remember: true,\r\n        remember: false,\r\n        extension: \"3dj\",\r\n        load_filter: {\r\n            type: 'json',\r\n            extensions: ['3dj'],\r\n            condition(model) {\r\n                return model.shapesOff;\r\n            }\r\n        },\r\n    \r\n        compile(options) { return autoStringify(compile3DJ(options)); },\r\n        export(options = {}) {\r\n            Blockbench.export({\r\n                resource_id: 'model',\r\n                type: this.name,\r\n                extensions: [this.extension],\r\n                name: this.fileName(),\r\n                startpath: this.startPath(),\r\n                content: this.compile(options),\r\n                custom_writer: isApp ? (a, b) => this.write(a, b) : null,\r\n            }, path => this.afterDownload(path))\r\n        },\r\n    });\r\n    \r\n    const popConfigModel = new Dialog({\r\n        id: 'popConfig_3dj',\r\n        title: 'Model Propities',\r\n        form: {\r\n            raw: {\r\n                label: 'Raw mode (ON = ignore all below)',\r\n                type: 'checkbox',\r\n                value: false,\r\n            },\r\n            label: {\r\n                label: 'Label',\r\n                type: 'input',\r\n                value: codec3dj.fileName(),\r\n            },\r\n            tooltip: {\r\n                label: 'Tooltip',\r\n                type: 'input',\r\n                value: Project.credit || settings.credit.value || '',\r\n            },\r\n            isBtn: {\r\n                label: 'Act as Button',\r\n                type: 'checkbox',\r\n                value: false,\r\n            },\r\n            lightLvl: {\r\n                label: 'Light Level',\r\n                type: 'number',\r\n                value: 0,\r\n                min: 0, max: 15, step: 1,\r\n            },\r\n            redstoneLvl: {\r\n                label: 'Redstone Power',\r\n                type: 'number',\r\n                value: 0,\r\n                min: 0, max: 15, step: 1,\r\n            },\r\n            collideOff: {\r\n                label: 'Collision (OFF state)',\r\n                type: 'checkbox',\r\n                value: true,\r\n            },\r\n            collideOn: {\r\n                label: 'Collision (ON state)',\r\n                type: 'checkbox',\r\n                value: true,\r\n            },\r\n            useTint: {\r\n                label: 'Use texture for color tint instead of the textures name.',\r\n                type: 'checkbox',\r\n                value: false,\r\n            },\r\n            isSeat: {\r\n                label: 'Is a seat? (OFF = ignore position)',\r\n                type: 'checkbox',\r\n                value: false,\r\n            },\r\n            seatPos: {\r\n                label: 'The position of the seat',\r\n                type: 'vector',\r\n                value: [0.5,0.5,0.5],\r\n                min: 0.1,\r\n                max: 0.9,\r\n                step: 0.1,\r\n            }\r\n        },\r\n        onConfirm(formData) {\r\n            codec3dj.export(formData);\r\n        }\r\n    });\r\n    \r\n    /**\r\n     * Checks if all given cubes meet the requirements.\r\n     * @param {Cube} elements The cubes.\r\n     * @returns Object containing booleans for whenever a condition is met.\r\n     */\r\n    function checkCubes(elements) {\r\n        let rotation = false;\r\n        let texture = false;\r\n        let border = false;\r\n        let mesh = false;\r\n    \r\n        for (const cube of elements) {\r\n            if (cube instanceof Cube) {\r\n                if (cube.visibility) {\r\n                    if (!rotation)\r\n                        rotation =(cube.rotation[0] !== 0\r\n                                || cube.rotation[1] !== 0\r\n                                || cube.rotation[2] !== 0);\r\n                        \r\n                    if (!texture)\r\n                        texture = (getSingleTexture(cube).multipleTexture);\r\n                        \r\n                    if (!border) {\r\n                        function checkNum(num) {\r\n                            if (!border)\r\n                                border = (num < 0 || num > 16);\r\n                        }\r\n                        cube.from.forEach(checkNum)\r\n                        cube.to.forEach(checkNum)\r\n                    }\r\n                \r\n                    // We are done here\r\n                    if (rotation && texture && border)\r\n                        break\r\n                }\r\n            } else { mesh = true; }\r\n        }\r\n    \r\n        return {rotation: rotation, texture: texture, border: border, mesh: mesh};\r\n    }\r\n    \r\n    const btnExport = new Action('export_3dj', {\r\n        name: 'Export 3DJ Model',\r\n        description: 'Export model as a .3DJ (.json) file for 3D Printers',\r\n        icon: 'print',\r\n        category: 'file',\r\n        condition: () => (Project !== 0),\r\n        click() {\r\n            // Check for stuff we dont want\r\n            const result = checkCubes(Project.elements);\r\n\r\n            // Generate warnings\r\n            if ( result.rotation || result.texture || result.border || result.mesh) {\r\n                let warning = new Dialog({\r\n                    id: 'popWarn_3dj',\r\n                    title: \"Holdup..\",\r\n                    form: {\r\n                        header: {\r\n                            type: 'info',\r\n                            text: 'Exporting your model like that might give weird results because of the following things:',\r\n                        },\r\n                        introduction: {\r\n                            type: 'info',\r\n                            text: 'Cubes that...',\r\n                        }\r\n                    },\r\n                    onConfirm() {\r\n                        popConfigModel.show();\r\n                    }\r\n                });\r\n                // Actual messages\r\n                if (result.rotation)\r\n                    warning.form.rotation = {\r\n                        type: 'info',\r\n                        text: '... have rotation',\r\n                    }\r\n                if (result.texture)\r\n                    warning.form.texture = {\r\n                        type: 'info',\r\n                        text: '... use multiple textures',\r\n                    }\r\n                if (result.border)\r\n                    warning.form.border = {\r\n                        type: 'info',\r\n                        text: '... are out of bounce (16x16x16 Grid / 1x1x1 Block)',\r\n                    }\r\n                if (result.mesh)\r\n                    warning.form.border = {\r\n                        type: 'info',\r\n                        text: '... are actually a Mesh and not a Cube',\r\n                    }\r\n    \r\n                warning.form.nextstep = {\r\n                    type: 'info',\r\n                    text: '*Press \\'Confirm\\' if you still want to proceed.*',\r\n                }\r\n    \r\n                warning.show();\r\n            // Or just export if everything is right :)\r\n            } else\r\n                popConfigModel.show();\r\n        }\r\n    });\r\n    \r\n    Plugin.register('sam3dj', pluginProperties);\r\n    })();\r\n"
  },
  {
    "path": "plugins/scene_recorder/about.md",
    "content": "<div id=\"about-content\">\n  <p>This plugin extends the built-in GIF recorder with a number of new formats to record your model with.</p>\n  <p>The new formats can be found inside the GIF recorder. You can find the <strong>Record Gif...</strong> button <i class=\"icon material-icons\" style=\"translate:0 5px\">local_movies</i> under the <strong>View</strong> menu.</p>\n  <h2>Formats</h2>\n  <table>\n    <tr>\n      <td>GIF</td>\n      <td>Record animated GIFs in higher quality than the built-in GIF format</td>\n    </tr>\n    <tr>\n      <td>MP4 Video</td>\n      <td>Record an MP4 video</td>\n    </tr>\n    <tr>\n      <td>MKV Video</td>\n      <td>Record an MKV video</td>\n    </tr>\n    <tr>\n      <td>MOV Video</td>\n      <td>Record an MOV video</td>\n    </tr>\n    <tr>\n      <td>WebM Video</td>\n      <td>Record a WebM video</td>\n    </tr>\n    <tr>\n      <td>Animated WebP</td>\n      <td>Record an animated WebP image</td>\n    </tr>\n    <tr>\n      <td>Spritesheet</td>\n      <td>Record to a vertically stacked spritesheet texture</td>\n    </tr>\n  </table>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n  }\n  .about table {\n    width: 100%;\n    border-collapse: collapse;\n  }\n  .about tr:first-child td {\n    border-top: none;\n  }\n  .about td:first-child {\n    font-weight: 700;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n  <a href=\"https://ffmpeg.org/download.html\">\n    <svg height=\"32\" viewBox=\"0 0 70 70\"><path fill=\"none\" stroke=\"#008700\" stroke-width=\"9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M5 5h20L5 25v20L45 5h20L5 65h20l40-40v20L45 65h20\"/></svg>\n    <p>FFmpeg</p>\n  </a>\n  <a href=\"https://youtu.be/jZLqNocSQDM\">\n    <i class=\"fa_big icon fab fa-youtube\" style=\"color: #FF4444;\"></i>\n    <p>Installing FFmpeg</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/scene_recorder/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2022-12-14\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Initial release\"\n        ]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2022-12-18\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed MP4 pixel encoding\"\n        ]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2023-04-10\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added the new GIF Recorder features into Scene Recorder\"\n        ]\n      }\n    ]\n  },\n  \"1.2.0\": {\n    \"title\": \"1.2.0\",\n    \"date\": \"2023-08-05\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Technical Changes\",\n        \"list\": [\n          \"Update to new plugin repository format\"\n        ]\n      }\n    ]\n  },\n  \"2.0.0\": {\n    \"title\": \"2.0.0\",\n    \"date\": \"2024-07-11\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"New Features\",\n        \"list\": [\n          \"Added the MKV Video format\",\n          \"Added the MOV Video format\",\n          \"Added the Spritesheet format\"\n        ]\n      },\n      {\n        \"title\": \"Changes\",\n        \"list\": [\n          \"Scene Recorder has been merged with the built-in GIF Recorder. It is no longer its own dialog, everything is now in one place.\"\n        ]\n      },\n      {\n        \"title\": \"Removed Features\",\n        \"list\": [\n          \"Removed the PNG Image Sequence format - This is now natively supported by the GIF Recorder\",\n          \"Removed the Animated PNG format - This is now natively supported by the GIF Recorder\"\n        ]\n      }\n    ]\n  },\n  \"2.0.1\": {\n    \"title\": \"2.0.1\",\n    \"date\": \"2025-01-22\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed for Blockbench 4.12\"\n        ]\n      }\n    ]\n  },\n  \"2.1.0\": {\n    \"title\": \"2.1.0\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Compatibility\",\n        \"list\": [\n          \"Updated for Blockbench 5.0\"\n        ]\n      }\n    ]\n  },\n  \"2.1.1\": {\n    \"title\": \"2.1.1\",\n    \"date\": \"2025-10-12\",\n    \"author\": \"Ewan Howell\",\n    \"categories\": [\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\n          \"Fixed exporting recordings\",\n          \"Fixed selecting FFmpeg in the \\\"Missing FFmpeg\\\" dialog\"\n        ]\n      }\n    ]\n  }\n}"
  },
  {
    "path": "plugins/scene_recorder/scene_recorder.js",
    "content": "(async function () {\n  const originalFormats = {}\n\n  let child_process, formats, ffmpegPath, dialog\n  const id = \"scene_recorder\"\n  const name = \"Scene Recorder\"\n  const E = s => $(document.createElement(s))\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author: \"Ewan Howell\",\n    description: \"Enhance the GIF recorder by adding new formats for recording your model. Replace the built-in GIF format with a higher quality one.\",\n    tags: [\"Recording\", \"Media\"],\n    version: \"2.1.1\",\n    min_version: \"5.0.0\",\n    variant: \"desktop\",\n    website: `https://ewanhowell.com/plugins/${id.replace(/_/g, \"-\")}/`,\n    repository: `https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/${id}`,\n    bug_tracker: `https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[${name}]`,\n    creation_date: \"2022-12-14\",\n    has_changelog: true,\n    async onload() {\n      child_process = require(\"child_process\", {\n        message: \"Required to process recordings using FFmpeg\",\n        optional: false\n      })\n\n      if (!child_process) {\n        throw new Error(\"child_process access denied\")\n      }\n\n      Screencam.gif_options_dialog.close()\n      Screencam.gif_options_dialog.onOpen = async () => {\n        if (await checkFFmpeg()) {\n          Screencam.gif_options_dialog.close()\n        } else {\n          delete Screencam.gif_options_dialog.onOpen\n        }\n      }\n\n      if (await checkFFmpeg()) return\n\n      formats = {\n        gif: {\n          name: \"GIF\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"GIF\",\n            extension: \"gif\",\n            command: [\"-lavfi\", \"split[v][pg];[pg]palettegen=reserve_transparent=1:stats_mode=single[pal];[v][pal]paletteuse=new=1:dither=bayer:bayer_scale=3\"]\n          })\n        },\n        mp4: {\n          name: \"MP4 Video\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"MP4 Video\",\n            extension: \"mp4\",\n            command: [\"-c:v\", options.mp4Codec, \"-pix_fmt\", \"yuv420p\", \"-vf\", \"scale=floor(iw/2)*2:floor(ih/2)*2\", \"-an\"]\n          })\n        },\n        mkv: {\n          name: \"MKV Video\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"MKV Video\",\n            extension: \"mkv\",\n            command: [\"-c:v\", options.mp4Codec, \"-pix_fmt\", \"yuv420p\", \"-vf\", \"scale=floor(iw/2)*2:floor(ih/2)*2\", \"-an\"]\n          })\n        },\n        mov: {\n          name: \"MOV Video\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"MOV Video\",\n            extension: \"mov\",\n            command: [\"-c:v\", options.mp4Codec, \"-pix_fmt\", \"yuv420p\", \"-vf\", \"scale=floor(iw/2)*2:floor(ih/2)*2\", \"-an\"]\n          })\n        },\n        webm: {\n          name: \"WebM Video\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"WebM Video\",\n            extension: \"webm\",\n            command: [\"-c:v\", \"libvpx-vp9\", \"-crf\", \"10\", \"-b:v\", \"0\", \"-an\"]\n          })\n        },\n        webp: {\n          name: \"Animated WebP\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"Animated WebP\",\n            extension: \"webp\",\n            command: [\"-loop\", 0]\n          })\n        },\n        spritesheet: {\n          name: \"Spritesheet\",\n          process: (vars, options) => processFFmpeg(vars, options, {\n            name: \"Spritesheet\",\n            extension: \"png\",\n            format: \"image2\",\n            validate(vars) {\n              if (vars.canvas_height * vars.frames > 300000) {\n                Blockbench.showMessageBox({\n                  title: \"Spritesheet too large\",\n                  message: `The generated spritesheet would be <code>${(vars.canvas_height * vars.frames).toLocaleString()}</code> pixels tall. The maximum supported height is <code>300,000</code>`\n                })\n                return\n              }\n              return true\n            },\n            preprocess(vars, options, args, buffers, file) {\n              const streams = new Array(buffers.length).fill().map((e, i) => `[s${i}]`).join(\"\")\n              let filter = `split=${buffers.length}${streams};${new Array(buffers.length).fill().map((e, i) => `[s${i}]trim=start_frame=${i}:end_frame=${i + 1}[s${i}]`).join(\";\")};${streams}vstack=${buffers.length}`\n              let filterType\n              if (filter.length > 1024) {\n                args.file = true\n                fs.writeFileSync(file, filter, \"utf-8\")\n                filter = file\n                filterType = \"-filter_complex_script\"\n              } else {\n                filterType = \"-lavfi\"\n              }\n              args.command = [\"-frames:v\", 1, \"-update\", 1, filterType, filter]\n            }\n          })\n        }\n      }\n\n      for (const [id, format] of Object.entries(formats)) {\n        if (ScreencamGIFFormats[id]) {\n          originalFormats[id] = ScreencamGIFFormats[id]\n        } else {\n          Screencam.gif_options_dialog.form_config.format.options[id] = format.name\n        }\n        ScreencamGIFFormats[id] = format\n      }\n\n      insertToForm(\"mp4Codec\", {\n        label: \"Codec\",\n        type: \"select\",\n        default: \"libx264\",\n        options: {\n          libx264: \"H.264\",\n          libx265: \"H.265\",\n          \"libvpx-vp9\": \"VP9\"\n        },\n        condition: form => [\"mp4\", \"mkv\", \"mov\"].includes(form.format)\n      }, 1)\n    },\n    onunload() {\n      dialog?.close()\n      if (formats) {\n        Screencam.gif_options_dialog.close()\n        delete Screencam.gif_options_dialog.onOpen\n        for (const id of Object.keys(formats)) {\n          if (originalFormats[id]) {\n            ScreencamGIFFormats[id] = originalFormats[id]\n          } else {\n            delete ScreencamGIFFormats[id]\n            delete Screencam.gif_options_dialog.form_config.format.options[id]\n          }\n        }\n        delete Screencam.gif_options_dialog.form_config.mp4Codec\n        Screencam.gif_options_dialog.build()\n      }\n    }\n  })\n\n  function processFFmpeg(vars, options, args) {\n    if (args.validate && !args.validate(vars)) return\n    Blockbench.export({\n      resource_id: id,\n      extensions: [args.extension],\n      type: args.name,\n      name: Project.name ?? \"scene\",\n      async custom_writer(content, file) {\n        const toast = Blockbench.showToastNotification({ text: `Processing your ${args.name}…`, icon: \"local_movies\" })\n        const buffers = []\n        for (const [i, canvas] of vars.frame_canvases.entries()) {\n          const blob = await new Promise(canvas.toBlob.bind(canvas))\n          buffers.push(Buffer.from(await blob.arrayBuffer()))\n        }\n        if (args.preprocess) {\n          args.preprocess(vars, options, args, buffers, file)\n        }\n        await ffmpeg(buffers, [\"-framerate\", options.fps, \"-i\", \"-\", ...args.command, \"-f\", args.format ?? args.extension, \"-y\", file])\n        toast.delete()\n        Blockbench.showQuickMessage(`Saved as ${file}`)\n      }\n    })\n  }\n\n  function spawn(exe, args, data = { stdio: \"ignore\" }) {\n    const p = child_process.spawn(exe, args, data)\n    p.promise = new Promise((fulfil, reject) => {\n      p.on(\"close\", fulfil)\n      p.on(\"error\", reject)\n    })\n    return p\n  }\n\n  async function ffmpeg(frames, args) {\n    const p = spawn(ffmpegPath, args, {\n      stdio: [\"pipe\", \"ignore\", \"pipe\"]\n    })\n    for (const frame of frames) p.stdin.write(frame)\n    p.stdin.end()\n    // let out = \"\"\n    // for await (const chunk of p.stderr) {\n    //   out += chunk\n    // }\n    // console.log(out)\n    return p.promise\n  }\n\n  async function checkFFmpeg() {\n    const paths = [\n      localStorage.getItem(\"ffmpegPath\"),\n      \"ffmpeg\",\n      \"/usr/local/bin/ffmpeg\"\n    ].filter(e => e)\n    for (const path of paths) {\n      const p = spawn(path, [])\n      try {\n        await p.promise\n        ffmpegPath = path\n        return\n      } catch {}\n    }\n    const process = require(\"process\")\n    dialog = new Blockbench.Dialog({\n      id: \"no-ffmpeg\",\n      title: \"Missing FFmpeg\",\n      width: 610,\n      buttons: [],\n      lines: [`<style>dialog#no-ffmpeg {\n        .dialog_content {\n          margin-top: 0;\n          overflow-x: clip;\n        }\n\n        iframe {\n          display: block;\n          margin-top: 16px;\n        }\n\n        .button-bar {\n          display: flex;\n          justify-content: flex-end;\n          gap: 8px;\n          margin-top: 16px;\n        }\n      }</style>`],\n      component: {\n        methods: {\n          async select() {\n            Filesystem.importFile({\n              title: \"Select FFmpeg\",\n              extensions: []\n            }, async files => {\n              try {\n                const p = spawn(files[0].path, [], {\n                  stdio: [\"ignore\", \"ignore\", \"pipe\"]\n                })\n                let out = \"\"\n                for await (const chunk of p.stderr) out += chunk\n                if (!out.startsWith(\"ffmpeg\")) return Blockbench.showQuickMessage(\"Invalid FFmpeg file\")\n              } catch {\n                return Blockbench.showQuickMessage(\"Invalid FFmpeg file\")\n              }\n              localStorage.setItem(\"ffmpegPath\", files[0].path)\n              dialog.close()\n              Plugins.all.find(e => e.id === id).reload()\n            })\n          },\n          reload() {\n            Plugins.all.find(e => e.id === id).reload()\n            Blockbench.showQuickMessage(`Reloaded ${name}`)\n          },\n          close() {\n            dialog.close()\n          }\n        },\n        template: `\n          <div>\n            <h1>Missing FFmpeg</h1>\n            <p>FFmpeg is required to use this plugin: <a style=\"color: var(--color-accent);\" href=\"https://ffmpeg.org/download.html\">Download FFmpeg</a></p>\n            ${process.platform === \"linux\" ? \"\" : `<iframe width=\"560\" height=\"315\" src=\"${process.platform === \"darwin\" ? \"https://www.youtube.com/embed/H1o6MWnmwpY\" : \"https://www.youtube.com/embed/jZLqNocSQDM\"}\" frameborder=\"0\" allow=\"\" allowfullscreen></iframe>`}\n            <div class=\"button-bar\">\n              <button @click=\"select\">Select FFmpeg executable manually</button>\n              <div style=\"flex: 1;\"></div>\n              <button @click=\"reload\">Reload plugin</button>\n              <button @click=\"close\">Close</button>\n            </div>\n          </div>\n        `\n      }\n    }).show()\n    return true\n  }\n\n  function insertToForm(name, properties, index) {\n    const formArray = Object.entries(Screencam.gif_options_dialog.form_config)\n    formArray.splice(index, 0, [name, properties])\n    Screencam.gif_options_dialog.form_config = Object.fromEntries(formArray)\n    Screencam.gif_options_dialog.build()\n  }\n})()"
  },
  {
    "path": "plugins/screencast_keys.js",
    "content": "(function() {\n\nvar setting, scale_setting, element, modifier_list, mouse_buttons, style, is_installed;\n\nPlugin.register('screencast_keys', {\n\ttitle: 'Screencast Keys',\n\ticon: 'keyboard',\n\tauthor: 'JannisX11',\n\tdescription: 'Displays the key combinations you press on screen. Useful for tutorial videos.',\n\tversion: '0.2.0',\n\tmin_version: '3.2.1',\n\tvariant: 'both',\n\tonload() {\n\n\t\tis_installed = true;\n\t\tvar timeout;\n\t\telement = Interface.createElement('div', {id: 'screencast_keys'});\n\t\tmodifier_list = Interface.createElement('div', {id: 'screencast_modifier_keys'}, [\n\t\t\tInterface.createElement('p', {style: 'display: none;'}, 'Ctrl'),\n\t\t\tInterface.createElement('p', {style: 'display: none;'}, 'Shift'),\n\t\t\tInterface.createElement('p', {style: 'display: none;'}, 'Alt'),\n\t\t]);\n\t\tmouse_buttons = Interface.createElement('div', {id: 'screencast_mouse'}, [\n\t\t\tInterface.createElement('div', {class: ''}),\n\t\t\tInterface.createElement('div', {class: ''}),\n\t\t\tInterface.createElement('div', {class: ''}),\n\t\t]);\n\n\t\tstyle = Blockbench.addCSS(`\n\t\t\t#screencast_keys {\n\t\t\t\tposition: absolute;\n\t\t\t\tpointer-events: none;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 100%;\n\t\t\t\tbottom: 6px;\n\t\t\t\tfont-size: calc(var(--screencast-keys-scale) * 1.1em);\n\t\t\t\tz-index: 10;\n\t\t\t}\n\t\t\t#screencast_modifier_keys {\n\t\t\t\tposition: absolute;\n\t\t\t\tpointer-events: none;\n\t\t\t\ttext-align: center;\n\t\t\t\tbottom: 10px;\n\t\t\t\tleft: 10px;\n\t\t\t\tdisplay: flex;\n\t\t\t\tz-index: 10;\n\t\t\t\tgap: 6px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\t\t\t#screencast_modifier_keys > p {\n\t\t\t\tbackground-color: var(--color-text);\n\t\t\t\tcolor: var(--color-ui);\n\t\t\t\tpadding: 0 6px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tfont-size: calc(var(--screencast-keys-scale) * 1em);\n\t\t\t\topacity: 0.7;\n\t\t\t}\n\t\t\t#screencast_mouse {\n\t\t\t\tposition: absolute;\n\t\t\t\tpointer-events: none;\n\t\t\t\theight: calc(var(--screencast-keys-scale) * 24px);\n\t\t\t\twidth: calc(var(--screencast-keys-scale) * 32px);\n\t\t\t\tbottom: 8px;\n\t\t\t\tright: 80px;\n\t\t\t\tdisplay: flex;\n\t\t\t\tz-index: 10;\n\t\t\t\tgap: 4px;\n\t\t\t\tborder-top-right-radius: 16px;\n\t\t\t\tborder-top-left-radius: 16px;\n\t\t\t\toverflow: hidden;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\t\t\t#screencast_mouse > * {\n\t\t\t\tbackground-color: var(--color-button);\n\t\t\t\tborder-radius: 2px;\n\t\t\t\theight: 100%;\n\t\t\t\tflex-grow: 1;\n\t\t\t}\n\t\t\t#screencast_mouse > .selected {\n\t\t\t\tbackground-color: var(--color-text);\n\t\t\t}\n\t\t\t#screencast_mouse > *:last-child {\n\t\t\t\tposition: absolute;\n\t\t\t\toutline: 4px solid var(--color-dark);\n\t\t\t\tborder-radius: 4px;\n\t\t\t\theight: 48%;\n\t\t\t\twidth: 10px;\n\t\t\t\tmargin: auto;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tbottom: -2px;\n\t\t\t}\n\t\t`)\n\t\t\n\t\tsetting = new Setting('screencast_keys', {\n\t\t\tvalue: true,\n\t\t\tname: 'Screencast Keys',\n\t\t\tdescription: 'Displays the key combinations you press on screen',\n\t\t\tonChange() {\n\t\t\t\tmodifier_list.style.display = setting.value ? 'flex' : 'none';\n\t\t\t\tmouse_buttons.style.display = setting.value ? 'flex' : 'none';\n\t\t\t}\n\t\t})\n\t\tscale_setting = new Setting('screencast_keys_scale', {\n\t\t\ttype: 'number',\n\t\t\tmin: 50,\n\t\t\tvalue: 150,\n\t\t\tname: 'Screencast Keys UI Scale',\n\t\t\tdescription: 'Select the scale of the screencast keys overlay',\n\t\t\tonChange() {\n\t\t\t\tdocument.body.style.setProperty('--screencast-keys-scale', `${scale_setting.value / 100}`);\n\t\t\t}\n\t\t})\n\t\tsetting.onChange();\n\t\tscale_setting.onChange();\n\n\t\tInterface.preview.append(modifier_list);\n\t\tInterface.preview.append(element);\n\t\tInterface.preview.append(mouse_buttons);\n\n\t\tfunction screencast(label) {\n\t\t\tif (!Settings.get('screencast_keys')) return;\n\t\t\tif (!element.isConnected) {\n\t\t\t\tInterface.preview.append(element);\n\t\t\t}\n\t\t\tclearTimeout(timeout);\n\t\t\tsetTimeout(() => {\n\t\t\t\telement.textContent = label.replace(/\\[\\w+\\] \\+ /g, '');\n\t\t\t}, element.textContent ? 50 : 0)\n\t\t\telement.textContent = '';\n\n\t\t\ttimeout = setTimeout(() => {\n\t\t\telement.textContent = '';\n\t\t\t}, 1000)\n\t\t}\n\n\t\tKeybind.prototype.screencastOldIsTriggered = Keybind.prototype.isTriggered;\n\t\tKeybind.prototype.isTriggered = function (event, ...args) {\n\t\t\tvar result = this.screencastOldIsTriggered(event, ...args);\n\t\t\tif (result && event instanceof MouseEvent == false && is_installed) {\n\t\t\t\tscreencast(this.label);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction updateModifierKeys(ctrl, shift, alt) {\n\t\t\tif (!is_installed || !setting.value) return;\n\t\t\tmodifier_list.childNodes[0].style.display = ctrl ? 'block' : 'none';\n\t\t\tmodifier_list.childNodes[1].style.display = shift ? 'block' : 'none';\n\t\t\tmodifier_list.childNodes[2].style.display = alt ? 'block' : 'none';\n\t\t}\n\t\tdocument.addEventListener('keydown', event => {\n\t\t\tupdateModifierKeys(event.ctrlOrCmd, event.shiftKey, event.altKey);\n\t\t})\n\t\tdocument.addEventListener('keyup', event => {\n\t\t\tupdateModifierKeys(event.ctrlOrCmd, event.shiftKey, event.altKey);\n\t\t})\n\t\twindow.addEventListener('blur', event => {\n\t\t\tupdateModifierKeys();\n\t\t})\n\n\t\tfunction updateMouseButtons(event) {\n\t\t\tif (!is_installed || !setting.value) return;\n\t\t\tlet buttons = event.buttons;\n\t\t\tlet lmb = false, rmb = false, mmb = false;\n\n\t\t\tif (buttons >= 4) { mmb = true; buttons -= 4; }\n\t\t\tif (buttons >= 2) { rmb = true; buttons -= 2; }\n\t\t\tif (buttons >= 1) { lmb = true; buttons -= 1; }\n\n\t\t\tmouse_buttons.childNodes[2].classList.toggle('selected', mmb)\n\t\t\tmouse_buttons.childNodes[1].classList.toggle('selected', rmb)\n\t\t\tmouse_buttons.childNodes[0].classList.toggle('selected', lmb)\n\t\t}\n\t\tdocument.addEventListener('mousedown', updateMouseButtons);\n\t\tdocument.addEventListener('mouseup', updateMouseButtons);\n\t\tdocument.addEventListener('mouseleave', updateMouseButtons);\n\n\t},\n\tonunload() {\n\t\telement.remove();\n\t\tmodifier_list.remove();\n\t\tmouse_buttons.remove();\n\t\tsetting.delete();\n\t\tstyle.delete();\n\t\tKeybind.prototype.isTriggered = Keybind.prototype.screencastOldIsTriggered;\n\t}\n});\n\n})()\n"
  },
  {
    "path": "plugins/seat_position.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\r\n\r\n(function() {\r\n\tlet scale = 1;\r\n\tlet position = [0, 0, 0];\r\n\tlet rotation = 0;\r\n\tlet new_version = true;\r\n\r\n\r\n\twindow.SeatPositioner = {\r\n\t\tgetDialogLines() {\r\n\t\t\treturn [\r\n\t\t\t\t`<div class=\"dialog_bar\">\r\n\t\t\t\t\t<label class=\"inline_label\">Current Version</label>\r\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"STP-v\" oninput=\"SeatPositioner.update()\" checked=\"${new_version}\">\r\n\t\t\t\t</div>`,\r\n\t\t\t\t`<div class=\"dialog_bar\">\r\n\t\t\t\t\t<label class=\"inline_label\">Model Scale</label>\r\n\t\t\t\t\t\t<input type=\"number\" step=\"0.1\" id=\"STP-s\" oninput=\"SeatPositioner.update()\" class=\"dark_bordered medium_width\" value=\"${scale}\">\r\n\t\t\t\t</div>`,\r\n\t\t\t\t`<div class=\"dialog_bar\">\r\n\t\t\t\t\t<label class=\"inline_label\">X: </label>\r\n\t\t\t\t\t\t<input type=\"number\" step=\"0.1\" id=\"STP-px\" class=\"dark_bordered medium_width\" oninput=\"SeatPositioner.update()\" value=\"${position[0]}\">\r\n\t\t\t\t\t<label class=\"inline_label\">Y: </label>\r\n\t\t\t\t\t\t<input type=\"number\" step=\"0.1\" id=\"STP-py\" class=\"dark_bordered medium_width\" oninput=\"SeatPositioner.update()\" value=\"${position[1]}\">\r\n\t\t\t\t\t<label class=\"inline_label\">Z: </label>\r\n\t\t\t\t\t\t<input type=\"number\" step=\"0.1\" id=\"STP-pz\" class=\"dark_bordered medium_width\" oninput=\"SeatPositioner.update()\" value=\"${position[2]}\">\r\n\t\t\t\t\t<label class=\"inline_label\">Rotation</label>\r\n\t\t\t\t\t\t<input type=\"number\" step=\"1\" id=\"STP-r\" oninput=\"SeatPositioner.update()\" class=\"dark_bordered medium_width\" value=\"${rotation}\">\r\n\t\t\t\t</div>`,\r\n\t\t\t\t`<div class=\"dialog_bar\">\r\n\t\t\t\t\t<input type=\"text\" id=\"STP-out\" class=\"dark_bordered input_wide code\" readonly>\r\n\t\t\t\t</div>`\r\n\t\t\t]\r\n\t\t},\r\n\t\tdialog: new Dialog({\r\n\t\t\tid: 'seat_position',\r\n\t\t\ttitle: 'Seat Position',\r\n\t\t\twidth: 540,\r\n\t\t\tlines: [],\r\n\t\t\tsingleButton: true,\r\n\t\t\tonConfirm: function() {\r\n\t\t\t\tscene.remove(SeatPositioner.object);\r\n\t\t\t\tthis.hide()\r\n\t\t\t}\r\n\t\t}),\r\n\t\tobject: new THREE.Object3D(),\r\n\t\tsetupObject: function() {\r\n\t\r\n\t\t\tif (SeatPositioner.init) return;\r\n\t\r\n\t\t\tvar O = SeatPositioner.object;\r\n\t\t\tvar M = new THREE.MeshLambertMaterial({color: 0xffffff});\r\n\t\r\n\t\t\tvar head = new THREE.Mesh(new THREE.BoxGeometry(8, 8, 8), M);\r\n\t\t\thead.position.y = 19;\r\n\t\t\tO.add(head);\r\n\t\r\n\t\t\tvar body = new THREE.Mesh(new THREE.BoxGeometry(8, 12, 4), M);\r\n\t\t\tbody.position.y = 9;\r\n\t\t\tO.add(body);\r\n\t\r\n\t\t\tvar leg_geo = new THREE.BoxGeometry();\r\n\t\t\tleg_geo.setShape([-2, -12, -2], [2, 0, 2]);\r\n\t\r\n\t\t\tvar leg_r = new THREE.Mesh(leg_geo, M);\r\n\t\t\tleg_r.position.set(2, 3, 0);\r\n\t\t\tleg_r.rotation.x = Math.degToRad(70);\r\n\t\t\tleg_r.rotation.z = Math.degToRad(13);\r\n\t\t\tO.add(leg_r);\r\n\t\r\n\t\t\tvar leg_l = new THREE.Mesh(leg_geo, M);\r\n\t\t\tleg_l.position.set(-2, 3, 0);\r\n\t\t\tleg_l.rotation.x = Math.degToRad(70);\r\n\t\t\tleg_l.rotation.z = Math.degToRad(-13);\r\n\t\t\tO.add(leg_l);\r\n\t\r\n\t\t\tvar arm_geo = new THREE.BoxGeometry();\r\n\t\t\tarm_geo.setShape([-2, -10, -2], [2, 2, 2]);\r\n\t\r\n\t\t\tvar arm_r = new THREE.Mesh(arm_geo, M);\r\n\t\t\tarm_r.position.set(6, 13, 0);\r\n\t\t\tarm_r.rotation.x = Math.degToRad(36);\r\n\t\t\tO.add(arm_r);\r\n\t\r\n\t\t\tvar arm_l = new THREE.Mesh(arm_geo, M);\r\n\t\t\tarm_l.position.set(-6, 13, 0);\r\n\t\t\tarm_l.rotation.x = Math.degToRad(36);\r\n\t\t\tO.add(arm_l);\r\n\t\r\n\t\t\tSeatPositioner.init = true;\r\n\t\t},\r\n\t\tupdate: function() {\r\n\t\t\tlet output = '';\r\n\r\n\t\t\tposition[0] = trimFloatNumber(parseFloat($('#STP-px').val())||0);\r\n\t\t\tposition[1] = trimFloatNumber(parseFloat($('#STP-py').val())||0);\r\n\t\t\tposition[2] = trimFloatNumber(parseFloat($('#STP-pz').val())||0);\r\n\r\n\t\t\tnew_version = $('#STP-v').is(':checked');\r\n\t\t\tSeatPositioner.object.position.set(\r\n\t\t\t\tposition[0] * -16,\r\n\t\t\t\tposition[1] * 16 + (new_version ? 2.2 : 0),\r\n\t\t\t\tposition[2] * -16,\r\n\t\t\t);\r\n\t\t\toutput = `\"position\": [${position.join(', ')}]`;\r\n\t\t\t\r\n\t\t\tscale = parseFloat( $('#STP-s').val() )||0\r\n\t\t\tvar s = 1 / scale;\r\n\t\t\tSeatPositioner.object.scale.set(s, s, s);\r\n\r\n\t\t\trotation = parseFloat( $('#STP-r').val() )||0;\r\n\t\t\tSeatPositioner.object.rotation.y = -Math.degToRad(rotation);\r\n\t\t\tif (rotation) {\r\n\t\t\t\toutput += `, \"rotate_rider_by\": ${trimFloatNumber(rotation)}`\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t$('#STP-out').val(output);\r\n\t\r\n\t\t}\r\n\t};\r\n\r\n\r\n\twindow.SetupHitboxHelper = {\r\n\t\tdialog: new Dialog({\r\n\t\t\tid: 'setup_hitbox',\r\n\t\t\ttitle: 'Setup Hitbox',\r\n\t\t\twidth: 540,\r\n\t\t\tform: {\r\n\t\t\t\ttype: {label: 'Type', type: 'select', options: {\r\n\t\t\t\t\tentity_hitbox: 'Entity Hitbox',\r\n\t\t\t\t\tentity_collision: 'Entity Collision',\r\n\t\t\t\t\tblock_selection_box: 'Block Selection Box',\r\n\t\t\t\t\tblock_collision: 'Block Collision',\r\n\t\t\t\t}},\r\n\t\t\t\tsize_entity: {label: 'Size', type: 'vector', value: [1, 1], dimensions: 2, step: 0.1, condition: form => form.type == 'entity_hitbox' || form.type == 'entity_collision'},\r\n\t\t\t\toffset_entity: {label: 'Offset', type: 'vector', value: [0, 0, 0], step: 0.1, condition: form => form.type == 'entity_hitbox'},\r\n\t\t\t\tsize_block: {label: 'Size', type: 'vector', value: [16, 16, 16], max: 16, min: 0, dimensions: 3, condition: form => form.type.startsWith('block')},\r\n\t\t\t\toffset_block: {label: 'Offset', type: 'vector', value: [0, 0, 0], condition: form => form.type.startsWith('block')},\r\n\t\t\t\tresult: {type: 'textarea', height: 130, readonly: true}\r\n\t\t\t},\r\n\t\t\tsingleButton: true,\r\n\t\t\tonFormChange({type, size_entity, size_block, offset_entity, offset_block}) {\r\n\t\t\t\tif (type.startsWith('entity')) {\r\n\t\t\t\t\tSetupHitboxHelper.object.scale.x = SetupHitboxHelper.object.scale.z = size_entity[0] || 0.01;\r\n\t\t\t\t\tSetupHitboxHelper.object.scale.y = size_entity[1] || 0.01;\r\n\t\t\t\t\tSetupHitboxHelper.object.position.fromArray(offset_entity).multiplyScalar(16);\r\n\t\t\t\t\tSetupHitboxHelper.object.position.set(\r\n\t\t\t\t\t\t-offset_entity[0] * 16,\r\n\t\t\t\t\t\toffset_entity[1] * 16,\r\n\t\t\t\t\t\t-offset_entity[2] * 16\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSetupHitboxHelper.object.scale.x = size_block[0]/16 || 0.01;\r\n\t\t\t\t\tSetupHitboxHelper.object.scale.z = size_block[2]/16 || 0.01;\r\n\t\t\t\t\tSetupHitboxHelper.object.scale.y = size_block[1]/16 || 0.01;\r\n\t\t\t\t\tSetupHitboxHelper.object.position.set(\r\n\t\t\t\t\t\t-offset_block[0],\r\n\t\t\t\t\t\toffset_block[1],\r\n\t\t\t\t\t\toffset_block[2]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet result_string;\r\n\t\t\t\tif (type == 'entity_hitbox') {\r\n\t\t\t\t\t// Entity\r\n\t\t\t\t\tresult_string = '\"minecraft:custom_hit_test\": '+ compileJSON({\r\n\t\t\t\t\t\t\"hitboxes\": [\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\twidth: size_entity[0],\r\n\t\t\t\t\t\t\t\theight: size_entity[1],\r\n\t\t\t\t\t\t\t\tpivot: [offset_entity[0], offset_entity[1] + size_entity[1]/2, offset_entity[2]]\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t})\r\n\t\t\t\t} else if (type == 'entity_collision') {\r\n\t\t\t\t\t// Entity\r\n\t\t\t\t\tresult_string = '\"minecraft:collision_box\": '+ compileJSON({\r\n\t\t\t\t\t\twidth: size_entity[0],\r\n\t\t\t\t\t\theight: size_entity[1],\r\n\t\t\t\t\t})\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Block\r\n\t\t\t\t\tlet value = compileJSON({\r\n\t\t\t\t\t\torigin: [offset_block[0] - size_block[0]/2, offset_block[1], offset_block[2] - size_block[2]/2],\r\n\t\t\t\t\t\tsize: size_block\r\n\t\t\t\t\t});16\r\n\r\n\t\t\t\t\tif (size_block.allEqual(0)) value = false;\r\n\t\t\t\t\tif (size_block.allEqual(16) && offset_block.allEqual(0)) value = true;\r\n\r\n\t\t\t\t\tresult_string = `\"minecraft:${type == 'block_collision' ? 'collision_box' : 'selection_box'}\": ` + value\r\n\t\t\t\t}\r\n\t\t\t\t$('dialog#setup_hitbox textarea').val(result_string).addClass('code');\r\n\t\t\t},\r\n\t\t\tonOpen() {\r\n\t\t\t\tif (!this.getFormResult().type?.endsWith('block') && Format.id == 'bedrock_block') {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tthis.setFormValues({type: 'block_collision'});\r\n\t\t\t\t\t}, 10);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tonConfirm() {\r\n\t\t\t\tscene.remove(SetupHitboxHelper.object);\r\n\t\t\t\tthis.hide()\r\n\t\t\t}\r\n\t\t}),\r\n\t\tsize: [1, 0],\r\n\t\toffset: [0, 0, 0],\r\n\t\tobject: null,\r\n\t\tsetupObject: function() {\r\n\t\r\n\t\t\tif (SetupHitboxHelper.init) return;\r\n\t\t\tlet object = SetupHitboxHelper.object = new THREE.LineSegments(\r\n\t\t\t\tnew THREE.BufferGeometry(),\r\n\t\t\t\tnew THREE.LineBasicMaterial({color: 0xffbd2e})\r\n\t\t\t)\r\n\t\t\tlet position_array = [\r\n\t\t\t\t8, 0, 8, \t8, 16, 8,\r\n\t\t\t\t8, 0, -8, \t8, 16, -8,\r\n\t\t\t\t-8, 0, 8, \t-8, 16, 8,\r\n\t\t\t\t-8, 0, -8,\t-8, 16, -8,\r\n\r\n\t\t\t\t8, 0, 8,\t-8, 0, 8,\r\n\t\t\t\t8, 0, -8,\t-8, 0, -8,\r\n\t\t\t\t8, 16, 8,\t-8, 16, 8,\r\n\t\t\t\t8, 16, -8,\t-8, 16, -8,\r\n\r\n\t\t\t\t8, 0, 8,\t8, 0, -8,\r\n\t\t\t\t-8, 0, 8,\t-8, 0, -8,\r\n\t\t\t\t8, 16, 8,\t8, 16, -8,\r\n\t\t\t\t-8, 16, 8,\t-8, 16, -8,\r\n\t\t\t]\r\n\t\t\tobject.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(position_array), 3));\r\n\t\t\tobject.geometry.attributes.position.needsUpdate = true;\r\n\t\t\tSetupHitboxHelper.init = true;\r\n\t\t}\r\n\t};\r\n\t\r\n\tvar seat_pos_action, hitbox_action, style;\r\n\r\n\tPlugin.register('seat_position', {\r\n\t\ttitle: 'Seat Position + Hitbox',\r\n\t\ticon: 'event_seat',\r\n\t\tauthor: 'JannisX11',\r\n\t\tdescription: 'Preview seat positions, hit/selection boxes, and collision boxes for custom MC Bedrock entities and blocks',\r\n\t\ttags: [\"Minecraft: Bedrock Edition\"],\r\n\t\tversion: '1.3.2',\r\n\t\tvariant: 'both',\r\n\t\tonload() {\r\n\t\t\tseat_pos_action = new Action('open_seat_position', {\r\n\t\t\t\tname: 'Setup Seat Position',\r\n\t\t\t\ticon: 'event_seat',\r\n\t\t\t\tcondition: _ => Format.bone_rig,\r\n\t\t\t\tclick: () => {\r\n\t\t\t\t\tSeatPositioner.dialog.lines = SeatPositioner.getDialogLines();\r\n\t\t\t\t\tSeatPositioner.dialog.show();\r\n\t\t\t\t\t$('#blackout').hide(0);\r\n\t\t\t\t\tSeatPositioner.setupObject();\r\n\t\t\t\t\tscene.add(SeatPositioner.object);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\thitbox_action = new Action('open_hitbox_setup', {\r\n\t\t\t\tname: 'Setup Hitbox',\r\n\t\t\t\tdescription: 'Set up an entity or block collision, hitbox, or selection box',\r\n\t\t\t\ticon: 'view_in_ar',\r\n\t\t\t\tcondition: _ => Format.bone_rig,\r\n\t\t\t\tclick: () => {\r\n\t\t\t\t\tSetupHitboxHelper.dialog.show();\r\n\t\t\t\t\t$('#blackout').hide(0);\r\n\t\t\t\t\tSetupHitboxHelper.setupObject();\r\n\t\t\t\t\tscene.add(SetupHitboxHelper.object);\r\n\t\t\t\t\tSetupHitboxHelper.dialog.updateFormValues();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\tMenuBar.addAction(seat_pos_action, 'filter');\r\n\t\t\tMenuBar.addAction(hitbox_action, 'filter');\r\n\r\n\t\t\tstyle = Blockbench.addCSS(`\r\n\t\t\t\tdialog#setup_hitbox textarea {\r\n\t\t\t\t\ttab-size: 40px;\r\n\t\t\t\t}\r\n\t\t\t`)\r\n\t\t},\r\n\t\tonunload() {\r\n\t\t\tseat_pos_action.delete();\r\n\t\t\thitbox_action.delete();\r\n\t\t}\r\n\t})\r\n\r\n})()\r\n"
  },
  {
    "path": "plugins/shape_generator.js",
    "content": "(function() {\r\n\r\n\r\n    Plugin.register('shape_generator', {\r\n        title: 'Shape Generator',\r\n        icon: 'pages',\r\n        author: 'dragonmaster95',\r\n        description: 'Generates shapes.',\r\n        version: '0.0.4',\r\n        min_version: '5.0.5',\r\n        variant: 'both',\r\n        onload() {\r\n            ShapeGeneratorAction = new Action(\"generate_shape\", {\r\n                name: \"Generate shape\",\r\n                description: \"Generates circular shapes.\",\r\n                icon: \"pages\",\r\n                click: function(){\r\n    \r\n                    //Check if the user is in the right mode\r\n                    if (!Format.rotate_cubes) {\r\n                        Blockbench.showMessageBox({\r\n                            title: 'Incompatible Format',\r\n                            message: 'This plugin only works in formats that support cube rotations.'\r\n                        })\r\n                        return;\r\n                    }\r\n                    else {\r\n                        shapeWindow();\r\n                    }\r\n                }\r\n            })\r\n            MenuBar.addAction(ShapeGeneratorAction, \"filter\");\r\n        },\r\n        onunload() {\r\n            ShapeGeneratorAction.delete();\r\n        }\r\n    });\r\n\r\n\r\n//shape selection window\r\nfunction shapeWindow() {\r\n    var shape_list = {\r\n        hexadecagon: \"Hexadecagon\",\r\n        octagon: \"Octagon\"\r\n    };\r\n    var variable_list = {\r\n        diameter: \"Diameter/Length\",\r\n        radius: \"Radius\",\r\n        side: \"Side\"\r\n    };\r\n    var axis_list = {\r\n        x: \"X\",\r\n        y: \"Y\",\r\n        z: \"Z\"\r\n    };\r\n\r\n    var shape_window = new Dialog({\r\n        title: 'Shape selector', \r\n        id: 'shape_selector', \r\n\r\n        form: {\r\n            shape: {label: \"Select shape\", type: \"select\", options: shape_list},\r\n            border: {label: \"Hollow\", type: \"checkbox\"},\r\n            variable: {label: \"Variable\", type: \"select\", options: variable_list},\r\n            value: {label: \"Value\", type: \"number\", value: 0},\r\n            thickness: {label: \"Height/Depth\", type: \"number\", value: 16},\r\n            center: {label: \"Center Point\", type: \"vector\", value: [8,8,8]},\r\n            axis: {label: \"Axis\", type: \"select\", options: axis_list}\r\n        },\r\n        lines: [\r\n            '<p><span style=\"float:left;\">Reset values: <button title=\"Reset values\" =button id=\"reset_shape\"><i class=\"material-icons\" style=\"color:white\">refresh</i></button></span></p><br/><br/>'\r\n        ],\r\n        /*lines: [\r\n            '<p style=\"text-align:left;\">Select shape:' + shape_list +\r\n            '<span style=\"float:right;\"><button title=\"Reset values\" =button id=\"reset_shape\"><i class=\"material-icons\" style=\"color:white\">refresh</i></button></span></p>' +\r\n            'Hollow <input type=\"checkbox\" id=\"border\"><br/><p></p>' +\r\n            'Variable ' + variable_list + '<br/>' +\r\n            'Value: <input value=16 type=\"number\" id=\"value\" style=\"background-color:var(--color-back)\" > <br/>' +\r\n            'Height/Depth: <input value=1 type=\"number\" style=\"background-color:var(--color-back)\" id=\"thickness\"> <br/><p></p>' +\r\n            'Center point: <input value=8 type=\"number\" style=\"background-color:var(--color-back)\" id=\"x\">' + ' ' + '<input value=8 type=\"number\" style=\"background-color:var(--color-back)\" id=\"y\"> <input value=8 type=\"number\" style=\"background-color:var(--color-back)\" id=\"z\"> <br\\>' +\r\n            'Axis:' + axis_list\r\n\r\n        ],*/ \r\n        draggable: true, \r\n        onConfirm(result) {\r\n            generateShape(result);\r\n            shape_window.hide();\r\n        }\r\n    });\r\n    shape_window.show();\r\n    if (localStorage.getItem(\"shape\") != undefined) {\r\n        document.getElementById(\"shape\").selectedIndex = localStorage.getItem(\"shape\");\r\n        $('.dialog#shape_selector input#border').prop(\"checked\", (localStorage.getItem(\"border\") == 'true'));\r\n        document.getElementById(\"variable\").selectedIndex = localStorage.getItem(\"variable\");\r\n        $('.dialog#shape_selector input#value').val(localStorage.getItem(\"value\"));\r\n        $('.dialog#shape_selector input#thickness').val(localStorage.getItem(\"thickness\"));\r\n        document.getElementById(\"axis\").selectedIndex = localStorage.getItem(\"axis\");\r\n        $('.dialog#shape_selector input#center_0').val(localStorage.getItem(\"center_x\"));\r\n        $('.dialog#shape_selector input#center_1').val(localStorage.getItem(\"center_y\"));\r\n        $('.dialog#shape_selector input#center_2').val(localStorage.getItem(\"center_z\"));\r\n    }\r\n\r\n    //Reset Button Click Event\r\n    document.getElementById(\"reset_shape\").onclick = function(){\r\n        document.getElementById(\"shape\").selectedIndex=0;\r\n        $('.dialog#shape_selector input#border').prop(\"checked\", false);\r\n        document.getElementById(\"variable\").selectedIndex=0;\r\n        $('.dialog#shape_selector input#value').val(16);\r\n        $('.dialog#shape_selector input#thickness').val(1);\r\n        document.getElementById(\"axis\").selectedIndex=1;\r\n        $('.dialog#shape_selector input#center_0').val(8);\r\n        $('.dialog#shape_selector input#center_1').val(8);\r\n        $('.dialog#shape_selector input#center_2').val(8);\r\n\r\n        localStorage.removeItem(\"shape\");\r\n        localStorage.removeItem(\"border\");\r\n        localStorage.removeItem(\"variable\");\r\n        localStorage.removeItem(\"value\");\r\n        localStorage.removeItem(\"thickness\");\r\n        localStorage.removeItem(\"axis\");\r\n        localStorage.removeItem(\"center\");\r\n    }\r\n}\r\n\r\n/*\r\n    <div class=\"dialog draggable paddinged ui-draggable\" id=\"selection_creator\" style=\"display: block; left: 337.5px; top: 64px;\">\r\n    <h2 class=\"dialog_handle ui-draggable-handle\">shape Generator</h2>\r\n\r\n    <div class=\"dialog_bar\">\r\n    <input type=shape_list id=\"shape\">\r\n    <label class=\"name_space_left\" for=\"selgen_new\">Select a shape: </label>\r\n    </div>\r\n\r\n    <div class=\"dialog_bar\">\r\n        <input type=\"checkbox\" id=\"border\">\r\n        <label class=\"name_space_left\" for=\"selgen_group\">Border only</label>\r\n    </div>\r\n\r\n    <div class=\"dialog_bar\">\r\n        <label class=\"name_space_left\" for=\"selgen_new\">Name Contains</label>\r\n    <input type=\"text\" class=\"dark_bordered half\" id=\"selgen_name\">\r\n        </div>\r\n\r\n        <div class=\"dialog_bar\">\r\n        <label class=\"name_space_left\" for=\"selgen_new\">Random</label>\r\n        <input type=\"range\" min=\"0\" max=\"100\" step=\"1\" value=\"100\" class=\"tool half\" id=\"selgen_random\">\r\n        </div>\r\n\r\n        <div class=\"dialog_bar\">\r\n        <button type=\"button\" class=\"large confirm_btn\" onclick=\"createSelection()\">Select</button>\r\n        <button type=\"button\" class=\"large cancel_btn\" onclick=\"hideDialog()\">Cancel</button>\r\n        </div>\r\n        <div id=\"dialog_close_button\" onclick=\"$('.dialog#'+open_dialog).find('.cancel_btn:not([disabled])').click()\"><i class=\"material-icons\">clear</i></div>\r\n    </div>\r\n    )\r\n}\r\n    shape_window.show();*/\r\n\r\n\r\nfunction generateShape(result) {\r\n    var shape = result.shape;\r\n    var shape_selected = document.getElementById(\"shape\").selectedIndex;\r\n    localStorage.setItem(\"shape\", shape_selected);\r\n    \r\n    var variable = result.variable;\r\n    var variable_selected = document.getElementById(\"variable\").selectedIndex;\r\n    localStorage.setItem(\"variable\", variable_selected);\r\n\r\n    var border = result.border;\r\n    localStorage.setItem(\"border\", border);\r\n\r\n    var axis = result.axis;\r\n    var axis_selected = document.getElementById(\"axis\").selectedIndex;\r\n    localStorage.setItem(\"axis\", axis_selected);\r\n\r\n    //no value or value too small\r\n    var value = $('.dialog#shape_selector input#value').val().valueOf();\r\n    localStorage.setItem(\"value\", value);\r\n    if (value == \"\" || value <= 0) {\r\n        var error_window1 = new Dialog({\r\n            title: 'Error', id: 'error_window_1', lines: [\r\n                'Error occured:<br\\>' +\r\n                'The '+document.getElementById(\"variable\").item(document.getElementById(\"variable\").selectedIndex).textContent+' has has to be a positive number<br\\>' +\r\n                ' <br\\>' +\r\n                'Your value: ' +value\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window1.hide();\r\n            }\r\n        });\r\n        error_window1.show();\r\n        return;\r\n    }\r\n\r\n    //negative value for thickness\r\n    var thickness = result.thickness;\r\n    localStorage.setItem(\"thickness\", thickness);\r\n    if (thickness == \"\" || parseFloat(thickness) <= 0) {\r\n        var error_window2 = new Dialog({\r\n            title: 'Error', id: 'error_window_2', lines: [\r\n                'Error occured:<br\\>' +\r\n                'The height/depth has to be set to a positive number<br\\>' +\r\n                ' <br\\>' +\r\n                'Your value: ' + thickness\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window2.hide();\r\n            }\r\n        });\r\n        error_window2.show();\r\n        return;\r\n    }\r\n\r\n    //invalid Origin\r\n    var origin = result.center;\r\n    localStorage.setItem(\"center_x\", origin[0]);\r\n    localStorage.setItem(\"center_y\", origin[1]);\r\n    localStorage.setItem(\"center_z\", origin[2]);\r\n    if (isNaN(origin[0]) || isNaN(origin[1]) || isNaN(origin[2])) {\r\n        var error_window3 = new Dialog({\r\n            title: 'Error', id: 'error_window_3', lines: [\r\n                'Error occured:<br\\>' +\r\n                'One of the origin values seem to not exist. Please fill out all 3 \"origin\" values.<br\\>' +\r\n                ' <br\\>' +\r\n                'Your values:\\tX:'+origin[0]+' Y:'+origin[1]+' Z:'+origin[2]\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window3.hide();\r\n            }\r\n        });\r\n        error_window3.show();\r\n        return;\r\n    }\r\n\r\n    if (border || shape !=='hexadecagon') borderValues(shape, variable, value, thickness, border, axis, origin);\r\n    else determineShape(shape, variable, value, thickness, border, axis, origin, 0, 0);\r\n}\r\n\r\nfunction borderValues(shape, variable, value, thickness, border, axis, origin) {\r\n    //Border true\r\n    var border_window = new Dialog({\r\n        title: 'Define more stuff',\r\n        id: 'border_width',\r\n        form: {\r\n            border: {label: \"Border width\", type: \"number\", value: 1}\r\n        },\r\n        lines: [\r\n            '<p>Shape rotation: <input id=\"angle\" type=\"range\" min=\"0\" max=\"7\" value=\"0\" oninput=\"$(\\'label#test\\').text(\\' \\'+parseInt($(\\'input#angle\\').val())*22.5+\\'°\\')\" onchange=\"$(\\'label#test\\').text(parseInt($(\\'input#angle\\').val())*22.5+\\'°\\')\">' +\r\n            '<label id=\"test\"> 0°</label>' +\r\n            '<br/><p/>'\r\n        ],\r\n        draggable: true,\r\n        onConfirm(result) {\r\n            var border_size = result.border;\r\n            angle = $('.dialog#border_width input#angle').val().valueOf();\r\n\r\n            var tmp = value;\r\n            if (variable=='diameter') tmp = value/2;\r\n            if (variable=='side') console.log(tmp);\r\n            if (variable=='side') tmp = value / 0.414213562373095 /2;\r\n            if (variable=='side') console.log(tmp);\r\n\r\n            \r\n            if (border_size < 0 || border_size === \"\" || border_size >= tmp) {\r\n                var error_window1 = new Dialog({\r\n                    title: 'Error', id: 'error_window_1', lines: [\r\n                        'Error occured:<br\\>' +\r\n                        'The border_width has to be set to a positive number and can\\'t be bigger than the object\\'s radius.<br\\>' +\r\n                        ' <br\\>' +\r\n                        'Your value: ' + border_size + '\\t(Maximum size: ' + tmp.toFixed(2) + ')'\r\n                    ], draggable: true, onConfirm() {\r\n                        borderValues(shape, variable, value, thickness, border, axis, origin);\r\n                        error_window1.hide();\r\n                    }\r\n                });\r\n                error_window1.show();\r\n                return;\r\n            }\r\n            localStorage.setItem(\"border_size\", border_size);\r\n            localStorage.setItem(\"angle\", angle);\r\n            determineShape(shape, variable, value, thickness, border, axis, origin, border_size, angle*22.5);\r\n            border_window.hide();\r\n        }\r\n    });\r\n    border_window.show();\r\n    if (localStorage.getItem(\"border_size\") != undefined) {\r\n        $('.dialog#border_width input#angle').val(localStorage.getItem(\"angle\"));\r\n        $('.dialog#border_width input#border').val(localStorage.getItem(\"border_size\"));\r\n        $('label#test').text((' '+localStorage.getItem(\"angle\")*22.5+'°'));\r\n    }\r\n}\r\n\r\nfunction determineShape(shape, variable, value, thickness, border, axis, origin, border_size, angle) {\r\n\tUndo.initEdit({outliner: true, elements: [], selection: true});\r\n    if (shape === 'hexadecagon')\r\n    {\r\n        var diameter = 0;\r\n        //user chose radius or diameter\r\n        if (variable === 'radius' || variable === 'diameter') {\r\n            if (variable === 'radius') diameter = parseFloat(value) * 2;\r\n            else diameter = parseFloat(value);\r\n            var side = diameter * 0.198912367379658;\r\n        }\r\n\r\n        //user chose side\r\n        else if (variable === 'side') {\r\n            var side = parseFloat(value);\r\n            diameter = side / 0.198912367379658;\r\n        }\r\n\r\n        //value is too high\r\n        if ((diameter/2+origin[2] > 32 || diameter/2+origin[0] > 32 || thickness/2+origin[1] > 32 ||\r\n             origin[2]-diameter/2 < -16 || origin[0]-diameter/2 < -16 || origin[1]-thickness/2 < -16) && Format.canvas_limit) {\r\n            var error_window2 = new Dialog({title: 'Error', id: 'error_window_2', lines: [\r\n                'Error occured:<br\\>' +\r\n                'Your shape would go outside of the restricted area.<br/>'+\r\n                ' <br\\>' +\r\n                'Please make sure to keep the shape small enough so that it still fits in the canvas and <br\\>'+\r\n                'that the center point isn\\'t causing issues.<br\\>'\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window2.hide();\r\n            }\r\n            });\r\n            error_window2.show();\r\n            return;\r\n        }\r\n\r\n        if (border) generateHexadecagonBordered(diameter, side, origin, axis, thickness, border_size);\r\n        else generateHexadecagonFilled(diameter, side, origin, axis, thickness);\r\n    }\r\n\r\n    if (shape === 'octagon')\r\n    {\r\n        //user chose radius or diameter\r\n        if (variable === 'radius' || variable === 'diameter') {\r\n            if (variable === 'radius') var diameter = parseFloat(value) * 2;\r\n            else var diameter = parseFloat(value);\r\n            var side = diameter * 0.414213562373095;\r\n        }\r\n\r\n        //user chose side\r\n        else if (variable === 'side') {\r\n            var side = parseFloat(value);\r\n            var diameter = side / 0.414213562373095;\r\n        }\r\n\r\n        //value is too high\r\n        if ((diameter/2+origin[2] > 32 || diameter/2+origin[0] > 32 || thickness/2+origin[1] > 32 ||\r\n                origin[2]-diameter/2 < -16 || origin[0]-diameter/2 < -16 || origin[1]-thickness/2 < -16) && Format.canvas_limit) {\r\n            var error_window2 = new Dialog({title: 'Error', id: 'error_window_2', lines: [\r\n                'Error occured:<br\\>' +\r\n                'Your shape would go outside of the restricted area.<br/>'+\r\n                ' <br\\>' +\r\n                'Please make sure to keep the shape small enough so that it still fits in the canvas and <br\\>'+\r\n                'that the center point isn\\'t causing issues.<br\\>'\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window2.hide();\r\n            }\r\n            });\r\n            error_window2.show();\r\n            return;\r\n        }\r\n\r\n        if (border) generateOctagonBordered(diameter, side, origin, axis, thickness, border_size, angle);\r\n        else generateOctagonFilled(diameter, side, origin, axis, thickness, angle);\r\n    }\r\n\r\n    if (shape === 'hexagon_flat')\r\n    {\r\n        //user chose radius or diameter\r\n        if (variable === 'radius' || variable === 'diameter') {\r\n            if (variable === 'radius') var diameter = parseFloat(value) * 2;\r\n            else var diameter = parseFloat(value);\r\n            var side = diameter * 0.5858;\r\n        }\r\n\r\n        //user chose side\r\n        else if (variable === 'side') {\r\n            var side = parseFloat(value);\r\n            var diameter = side / 0.5858;\r\n        }\r\n\r\n        //value is too high\r\n        if ((diameter/2+origin[2] > 32 || diameter/2+origin[0] > 32 || thickness/2+origin[1] > 32 ||\r\n                origin[2]-diameter/2 < -16 || origin[0]-diameter/2 < -16 || origin[1]-thickness/2 < -16) && Format.canvas_limit) {\r\n            var error_window2 = new Dialog({title: 'Error', id: 'error_window_2', lines: [\r\n                'Error occured:<br\\>' +\r\n                'Your shape would go outside of the restricted area.<br/>'+\r\n                ' <br\\>' +\r\n                'Please make sure to keep the shape small enough so that it still fits in the canvas and <br\\>'+\r\n                'that the center point isn\\'t causing issues.<br\\>'\r\n            ], draggable: true, onConfirm() {\r\n                shapeWindow();\r\n                error_window2.hide();\r\n            }\r\n            });\r\n            error_window2.show();\r\n            return;\r\n        }\r\n\r\n        var side2 = diameter*0.5412;\r\n\r\n        if (border) generateHexagonFlatBordered(diameter, side, side2, origin, axis, thickness, border_size, angle);\r\n        else generateHexagonFlatFilled(diameter, side, side2, origin, axis, thickness, angle);\r\n    }\r\n\r\n    //edit\r\n    Undo.finishEdit('Generated Shape', {outliner: true, elements: selected, selection: true});\r\n    Blockbench.showMessage('Generated a '+shape+' with a '+variable+' of '+value+' (Border:'+border+')', 'sidebar');\r\n\r\n}\r\n\r\n//------------Hexadecagon------------//\r\n\r\nfunction generateHexadecagonFilled(diameter, side, origin, axis, thickness) {\r\n\r\n    hexadecagon = new Group('hexadecagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n    var fromX = origin[0]-(side/2);\r\n    var fromY = origin[1]-(thickness/2);\r\n    var fromZ = origin[2]-(diameter/2);\r\n    var toX = fromX+side;\r\n    var toY = fromY+thickness;\r\n    var toZ = fromZ+diameter;\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,-45,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,0,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,22.5,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,45,hexadecagon);\r\n\r\n    var fromX2 = parseFloat(origin[0]-(diameter/2));\r\n    var fromY2 = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ2 = parseFloat(origin[2]-(side/2));\r\n    var toX2 = parseFloat(fromX2+diameter);\r\n    var toY2 = parseFloat(fromY2+thickness);\r\n    var toZ2 = parseFloat(fromZ2+side);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY2=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 = parseFloat(fromX2+origin[1]-origin[0]);\r\n        fromX2 = parseFloat(cacheY2+(origin[0]-thickness/2));\r\n        cacheY2=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 = parseFloat(toX2+origin[1]-origin[0]);\r\n        toX2 = parseFloat(cacheY2+(origin[0]-thickness/2));\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY2=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 =parseFloat(fromZ2+origin[1]-origin[2]);\r\n        fromZ2 = parseFloat(cacheY2+(origin[2]-thickness/2));\r\n        cacheY2=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 =parseFloat(toZ2+origin[1]-origin[2]);\r\n        toZ2 = parseFloat(cacheY2+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,0,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,22.5,hexadecagon);\r\n\r\n    Canvas.updateAll();\r\n    hexadecagon.openUp().select();\r\n\r\n}\r\n\r\nfunction generateHexadecagonBordered(diameter, side, origin, axis, thickness, border_size) {\r\n\r\n    hexadecagon = new Group('hexadecagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n    border_size = parseFloat(border_size);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n\r\n    var fromX = parseFloat(origin[0]-(side/2));\r\n    var fromY = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ = parseFloat(origin[2]-(diameter/2));\r\n    var toX = parseFloat(fromX+side);\r\n    var toY = parseFloat(fromY+thickness);\r\n    var toZ = parseFloat(fromZ+border_size);\r\n\r\n    var fromX2 = parseFloat(fromX);\r\n    var fromY2 = parseFloat(fromY);\r\n    var fromZ2 = parseFloat(fromZ+(diameter-border_size));\r\n    var toX2 = parseFloat(toX);\r\n    var toY2 = parseFloat(toY);\r\n    var toZ2 = parseFloat(toZ+(diameter-border_size));\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 = parseFloat(fromX2+origin[1]-origin[0]);\r\n        fromX2 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 = parseFloat(toX2+origin[1]-origin[0]);\r\n        toX2 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 =parseFloat(fromZ2+origin[1]-origin[2]);\r\n        fromZ2 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 =parseFloat(toZ2+origin[1]-origin[2]);\r\n        toZ2 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,-45,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,0,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,22.5,hexadecagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,45,hexadecagon);\r\n\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,-45,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,0,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,22.5,hexadecagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,45,hexadecagon);\r\n\r\n    var fromX3 = parseFloat(origin[0]-(diameter/2));\r\n    var fromY3 = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ3 = parseFloat(origin[2]-(side/2));\r\n    var toX3 = parseFloat(fromX3+border_size);\r\n    var toY3 = parseFloat(fromY3+thickness);\r\n    var toZ3 = parseFloat(fromZ3+side);\r\n\r\n    var fromX4 = parseFloat(fromX3+(diameter-border_size));\r\n    var fromY4 = parseFloat(fromY3);\r\n    var fromZ4 = parseFloat(fromZ3);\r\n    var toX4 = parseFloat(toX3+(diameter-border_size));\r\n    var toY4 = parseFloat(toY3);\r\n    var toZ4 = parseFloat(toZ3);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY3+(thickness/2-origin[1]));\r\n        fromY3 = parseFloat(fromX3+origin[1]-origin[0]);\r\n        fromX3 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY3+(thickness/2-origin[1]));\r\n        toY3 = parseFloat(toX3+origin[1]-origin[0]);\r\n        toX3 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY4+(thickness/2-origin[1]));\r\n        fromY4 = parseFloat(fromX4+origin[1]-origin[0]);\r\n        fromX4 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY4+(thickness/2-origin[1]));\r\n        toY4 = parseFloat(toX4+origin[1]-origin[0]);\r\n        toX4 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY3+(thickness/2-origin[1]));\r\n        fromY3 =parseFloat(fromZ3+origin[1]-origin[2]);\r\n        fromZ3 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY3+(thickness/2-origin[1]));\r\n        toY3 =parseFloat(toZ3+origin[1]-origin[2]);\r\n        toZ3 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY4+(thickness/2-origin[1]));\r\n        fromY4 =parseFloat(fromZ4+origin[1]-origin[2]);\r\n        fromZ4 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY4+(thickness/2-origin[1]));\r\n        toY4 =parseFloat(toZ4+origin[1]-origin[2]);\r\n        toZ4 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX3,fromY3,fromZ3,toX3,toY3,toZ3,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX3,fromY3,fromZ3,toX3,toY3,toZ3,origin,axis,0,hexadecagon);\r\n    buildCube(fromX3,fromY3,fromZ3,toX3,toY3,toZ3,origin,axis,22.5,hexadecagon);\r\n\r\n    buildCube(fromX4,fromY4,fromZ4,toX4,toY4,toZ4,origin,axis,-22.5,hexadecagon);\r\n    buildCube(fromX4,fromY4,fromZ4,toX4,toY4,toZ4,origin,axis,0,hexadecagon);\r\n    buildCube(fromX4,fromY4,fromZ4,toX4,toY4,toZ4,origin,axis,22.5,hexadecagon);\r\n\r\n    Canvas.updateAll();\r\n    hexadecagon.openUp().select();\r\n}\r\n\r\n\r\n//--------------Octagon--------------//\r\n\r\nfunction generateOctagonFilled(diameter, side, origin, axis, thickness, angle) {\r\n\r\n    octagon = new Group('octagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n    angle = parseFloat(angle%45);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n    var fromX = origin[0]-(side/2);\r\n    var fromY = origin[1]-(thickness/2);\r\n    var fromZ = origin[2]-(diameter/2);\r\n    var toX = fromX+side;\r\n    var toY = fromY+thickness;\r\n    var toZ = fromZ+diameter;\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,45-angle,octagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,0-angle,octagon);\r\n\r\n    var fromX2 = parseFloat(origin[0]-(diameter/2));\r\n    var fromY2 = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ2 = parseFloat(origin[2]-(side/2));\r\n    var toX2 = parseFloat(fromX2+diameter);\r\n    var toY2 = parseFloat(fromY2+thickness);\r\n    var toZ2 = parseFloat(fromZ2+side);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY2=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 = parseFloat(fromX2+origin[1]-origin[0]);\r\n        fromX2 = parseFloat(cacheY2+(origin[0]-thickness/2));\r\n        cacheY2=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 = parseFloat(toX2+origin[1]-origin[0]);\r\n        toX2 = parseFloat(cacheY2+(origin[0]-thickness/2));\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY2=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 =parseFloat(fromZ2+origin[1]-origin[2]);\r\n        fromZ2 = parseFloat(cacheY2+(origin[2]-thickness/2));\r\n        cacheY2=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 =parseFloat(toZ2+origin[1]-origin[2]);\r\n        toZ2 = parseFloat(cacheY2+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,45-angle,octagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,0-angle,octagon);\r\n\r\n    Canvas.updateAll();\r\n    octagon.openUp().select();\r\n}\r\n\r\nfunction generateOctagonBordered(diameter, side, origin, axis, thickness, border_size, angle) {\r\n\r\n    octagon = new Group('octagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n    border_size = parseFloat(border_size);\r\n    angle = parseFloat(angle%45);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n    var fromX = parseFloat(origin[0]-(side/2));\r\n    var fromY = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ = parseFloat(origin[2]-(diameter/2));\r\n    var toX = parseFloat(fromX+side);\r\n    var toY = parseFloat(fromY+thickness);\r\n    var toZ = parseFloat(fromZ+border_size);\r\n\r\n    var fromX2 = parseFloat(fromX);\r\n    var fromY2 = parseFloat(fromY);\r\n    var fromZ2 = parseFloat(fromZ+(diameter-border_size));\r\n    var toX2 = parseFloat(toX);\r\n    var toY2 = parseFloat(toY);\r\n    var toZ2 = parseFloat(toZ+(diameter-border_size));\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 = parseFloat(fromX2+origin[1]-origin[0]);\r\n        fromX2 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 = parseFloat(toX2+origin[1]-origin[0]);\r\n        toX2 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY2+(thickness/2-origin[1]));\r\n        fromY2 =parseFloat(fromZ2+origin[1]-origin[2]);\r\n        fromZ2 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY2+(thickness/2-origin[1]));\r\n        toY2 =parseFloat(toZ2+origin[1]-origin[2]);\r\n        toZ2 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,45-angle,octagon);\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,0-angle,octagon);\r\n\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,45-angle,octagon);\r\n    buildCube(fromX2,fromY2,fromZ2,toX2,toY2,toZ2,origin,axis,0-angle,octagon);\r\n\r\n    var fromX3 = parseFloat(origin[0]-(diameter/2));\r\n    var fromY3 = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ3 = parseFloat(origin[2]-(side/2));\r\n    var toX3 = parseFloat(fromX3+border_size);\r\n    var toY3 = parseFloat(fromY3+thickness);\r\n    var toZ3 = parseFloat(fromZ3+side);\r\n\r\n    var fromX4 = parseFloat(fromX3+(diameter-border_size));\r\n    var fromY4 = parseFloat(fromY3);\r\n    var fromZ4 = parseFloat(fromZ3);\r\n    var toX4 = parseFloat(toX3+(diameter-border_size));\r\n    var toY4 = parseFloat(toY3);\r\n    var toZ4 = parseFloat(toZ3);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY3+(thickness/2-origin[1]));\r\n        fromY3 = parseFloat(fromX3+origin[1]-origin[0]);\r\n        fromX3 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY3+(thickness/2-origin[1]));\r\n        toY3 = parseFloat(toX3+origin[1]-origin[0]);\r\n        toX3 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY4+(thickness/2-origin[1]));\r\n        fromY4 = parseFloat(fromX4+origin[1]-origin[0]);\r\n        fromX4 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY4+(thickness/2-origin[1]));\r\n        toY4 = parseFloat(toX4+origin[1]-origin[0]);\r\n        toX4 = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY3+(thickness/2-origin[1]));\r\n        fromY3 =parseFloat(fromZ3+origin[1]-origin[2]);\r\n        fromZ3 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY3+(thickness/2-origin[1]));\r\n        toY3 =parseFloat(toZ3+origin[1]-origin[2]);\r\n        toZ3 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n\r\n        var cacheY=parseFloat(fromY4+(thickness/2-origin[1]));\r\n        fromY4 =parseFloat(fromZ4+origin[1]-origin[2]);\r\n        fromZ4 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY4+(thickness/2-origin[1]));\r\n        toY4 =parseFloat(toZ4+origin[1]-origin[2]);\r\n        toZ4 = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX3,fromY3,fromZ3,toX3,toY3,toZ3,origin,axis,45-angle,octagon);\r\n    buildCube(fromX3,fromY3,fromZ3,toX3,toY3,toZ3,origin,axis,0-angle,octagon);\r\n\r\n    buildCube(fromX4,fromY4,fromZ4,toX4,toY4,toZ4,origin,axis,45-angle,octagon);\r\n    buildCube(fromX4,fromY4,fromZ4,toX4,toY4,toZ4,origin,axis,0-angle,octagon);\r\n\r\n    Canvas.updateAll();\r\n    octagon.openUp().select();\r\n}\r\n\r\n//--------------Hexagon--------------//\r\n\r\nfunction generateHexagonFlatFilled(diameter, side, side2, origin, axis, thickness, angle) {\r\n\r\n    hexagon = new Group('hexagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    side2 = parseFloat(side2);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n    angle = parseFloat(angle);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n    //Center piece\r\n    var fromX = parseFloat(origin[0]-(side/2));\r\n    var fromY = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ = parseFloat(origin[2]-(diameter/2));\r\n    var toX = fromX+side;\r\n    var toY = fromY+thickness;\r\n    var toZ = fromZ+diameter;\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle,hexagon);\r\n\r\n    //rotated part1\r\n    fromX = parseFloat(origin[0]-(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]-(diameter*0.1912));\r\n    toX = parseFloat(fromX+(side*0.6));\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle+22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle+45);\r\n\r\n    //rotated part2\r\n    toX = parseFloat(origin[0]+(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]-(diameter*0.1912));\r\n    fromX = parseFloat(toX-(side*0.6));\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle-22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle-45);\r\n\r\n    //rotated part3\r\n    fromX = parseFloat(origin[0]-(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]+(diameter*0.1912)-side2);\r\n    toX = parseFloat(fromX+(side*0.6));\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle-22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle-45);\r\n\r\n    //rotated part4\r\n    toX = parseFloat(origin[0]+(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]+(diameter*0.1912)-side2);\r\n    fromX = parseFloat(toX-(side*0.6));\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle+22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle+45);\r\n\r\n    Canvas.updateAll();\r\n    hexagon.openUp().select();\r\n}\r\n\r\nfunction generateHexagonFlatBordered(diameter, side, side2, origin, axis, thickness, border_size, angle) {\r\n\r\n    hexagon = new Group('hexagon').init();\r\n    diameter = parseFloat(diameter);\r\n    side = parseFloat(side);\r\n    side2 = parseFloat(side2);\r\n    thickness = parseFloat(thickness);\r\n    origin[0] = parseFloat(origin[0]);\r\n    origin[1] = parseFloat(origin[1]);\r\n    origin[2] = parseFloat(origin[2]);\r\n    border_size = parseFloat(border_size);\r\n    angle = parseFloat(angle);\r\n\r\n    //loading message\r\n    //Blockbench.showMessage('Generating shape... Please wait', 'center')\r\n\r\n    //Center piece1\r\n    var fromX = parseFloat(origin[0]-(side/2));\r\n    var fromY = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ = parseFloat(origin[2]-(diameter/2));\r\n    var toX = fromX+side;\r\n    var toY = fromY+thickness;\r\n    var toZ = fromZ+border_size;\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle,hexagon);\r\n\r\n    //Center piece2\r\n    var fromX = parseFloat(origin[0]-(side/2));\r\n    var fromY = parseFloat(origin[1]-(thickness/2));\r\n    var fromZ = parseFloat(origin[2]+(diameter/2)-border_size);\r\n    var toX = fromX+side;\r\n    var toY = fromY+thickness;\r\n    var toZ = fromZ+border_size;\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n    }\r\n\r\n    if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle,hexagon);\r\n\r\n    //rotated part1\r\n    fromX = parseFloat(origin[0]-(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]-(diameter*0.1912));\r\n    toX = parseFloat(fromX+border_size);\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle+22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle+45);\r\n\r\n    //rotated part2\r\n    toX = parseFloat(origin[0]+(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]-(diameter*0.1912));\r\n    fromX = parseFloat(toX-border_size);\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle-22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle-45);\r\n\r\n    //rotated part3\r\n    fromX = parseFloat(origin[0]-(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]+(diameter*0.1912)-side2);\r\n    toX = parseFloat(fromX+border_size);\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle+45);\r\n    }\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle-22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle-45);\r\n\r\n    //rotated part4\r\n    toX = parseFloat(origin[0]+(diameter*0.4619));\r\n    fromY = origin[1]-(thickness/2);\r\n    fromZ = parseFloat(origin[2]+(diameter*0.1912)-side2);\r\n    fromX = parseFloat(toX-border_size);\r\n    toY = fromY+thickness;\r\n    toZ = parseFloat(fromZ+side2);\r\n\r\n    if (axis === 'x') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY = parseFloat(fromX+origin[1]-origin[0]);\r\n        fromX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY = parseFloat(toX+origin[1]-origin[0]);\r\n        toX = parseFloat(cacheY+(origin[0]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n    else if (axis === 'z') {\r\n        var cacheY=parseFloat(fromY+(thickness/2-origin[1]));\r\n        fromY =parseFloat(fromZ+origin[1]-origin[2]);\r\n        fromZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        cacheY=parseFloat(toY+(thickness/2-origin[1]));\r\n        toY =parseFloat(toZ+origin[1]-origin[2]);\r\n        toZ = parseFloat(cacheY+(origin[2]-thickness/2));\r\n        angle = parseFloat(angle-45);\r\n    }\r\n\r\n\r\n    buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,angle+22.5,hexagon);\r\n\r\n    if (axis === 'z' || axis === 'x') angle=parseFloat(angle+45);\r\n\r\n    Canvas.updateAll();\r\n    hexagon.openUp().select();\r\n}\r\n\r\n\r\n\r\nfunction buildCube(fromX,fromY,fromZ,toX,toY,toZ,origin,axis,rotation,group) {\r\n    var iteration = 0;\r\n    while (rotation < -45) {\r\n        rotation += 90;\r\n        iteration--;\r\n    }\r\n    while (rotation > 45) {\r\n        rotation -= 90;\r\n        iteration++;\r\n    }\r\n    var cube = new Cube({\r\n    \tname: group.name,\r\n    \tfrom: [fromX, fromY, fromZ],\r\n        to: [toX, toY, toZ],\r\n        origin: origin.slice(),\r\n\t\trotation: [axis == 'x' ? rotation : 0, axis == 'y' ? rotation : 0, axis == 'z' ? rotation : 0]\r\n    }).addTo(group).init()\r\n/*    selected.length = 0;\r\n    selected.push(cube.index());\r\n    if (axis === \"y\") {\r\n        console.log(selected);\r\n        rotateSelectedY(iteration, true);\r\n        console.log(iteration);\r\n    }*/\r\n}\r\n\r\n})()\r\n\r\nonUninstall = function() {\r\n\t//Removing entries\r\n\tBlockbench.removeMenuEntry('Generate shape')\r\n};\r\n"
  },
  {
    "path": "plugins/shaper.js",
    "content": "(function () {\n  let menuAction;\n\n  Plugin.register(\"shaper\", {\n    title: \"Shaper\",\n    author: \"Vowxky\",\n    description: \"Support tool for the Shaper mod that helps create and export hitboxes. Exports Voxel Shapes as a flat JSON list with scope selection for easier editing and reuse.\",\n    version: \"1.0.0\",\n    icon: \"bar_chart\",\n    variant: \"both\",\n    tags: [\"Minecraft: Java Edition\"],\n\n    onload() {\n      menuAction = new Action(\"shaper_export_flat_json\", {\n        name: \"Export Shape Json\",\n        description: \"Exports as [[x1,y1,z1,x2,y2,z2], ...] with group/selected/all selection\",\n        icon: \"fa-file-export\",\n        click: () => openExportDialog()\n      });\n      MenuBar.addAction(menuAction, \"file.export\");\n    },\n\n    onunload() {\n      menuAction?.delete();\n    }\n  });\n\n  function openExportDialog() {\n    const dlg = new Dialog({\n      id: \"shaper_export_dialog\",\n      title: \"Shaper Export\",\n      width: 420,\n      form: {\n        scope: {\n          label: \"Cubes to export\",\n          type: \"select\",\n          options: {\n            group: \"Group\",\n            selected: \"Selected cubes\",\n            all: \"All cubes\"\n          },\n          value: \"group\"\n        },\n        groupName: {\n          label: \"Group name\",\n          type: \"text\",\n          value: \"shapes\",\n          condition: (f) => f.scope === \"group\"\n        }\n      },\n      onConfirm(form) {\n        exportFlatJson(form);\n      }\n    });\n    dlg.show();\n  }\n\n  function exportFlatJson(form) {\n    const centered = Format.centered_grid;\n    const scope = (form.scope || \"group\");\n    const groupName = String(form.groupName || \"shapes\").trim();\n    let cubes = [];\n\n    if (scope === \"group\") {\n      const grp = findGroupByName(groupName);\n      if (!grp) {\n        Blockbench.showQuickMessage(`Shaper: Group \"${groupName}\" not found. Nothing exported.`);\n        return;\n      }\n      cubes = collectCubesFromGroup(grp);\n      if (!cubes.length) {\n        Blockbench.showQuickMessage(`Shaper: Group \"${groupName}\" has no cubes. Nothing exported.`);\n        return;\n      }\n    } else if (scope === \"selected\") {\n      const sel = (typeof selected !== \"undefined\" && Array.isArray(selected)) ? selected : [];\n      cubes = sel.filter(n => n && n.type === \"cube\");\n      if (!cubes.length) {\n        Blockbench.showQuickMessage(\"Shaper: No selected cubes. Nothing exported.\");\n        return;\n      }\n    } else {\n      cubes = (Cube.all || []);\n      if (!cubes.length) {\n        Blockbench.showQuickMessage(\"Shaper: No cubes found in model. Nothing exported.\");\n        return;\n      }\n    }\n\n    const payload = buildBoxesFromCubes(cubes, centered);\n    const baseName = (Project && Project.name ? Project.name : \"voxel_shape\");\n    const fileName = (scope === \"group\" ? `shapes/${baseName}.json` : `${baseName}.json`);\n\n    Blockbench.export({\n      type: \"Voxel Shape File\",\n      extensions: [\"json\"],\n      savetype: \"text\",\n      name: fileName,\n      content: JSON.stringify(payload)\n    });\n\n    Blockbench.showQuickMessage(\n      `Shaper: JSON exported (${scope === \"group\" ? `group \"${groupName}\"` : (scope === \"selected\" ? \"selected cubes\" : \"all cubes\")}).`\n    );\n  }\n\n  function findGroupByName(name) {\n    if (!Group || !Group.all) return null;\n    const target = (name || \"\").toLowerCase();\n    return Group.all.find(g => g && typeof g.name === \"string\" && g.name.toLowerCase() === target) || null;\n  }\n\n  function collectCubesFromGroup(group) {\n    const out = [];\n    (function walk(node) {\n      if (!node) return;\n      if (node.type === \"cube\") { out.push(node); return; }\n      if (node.children && Array.isArray(node.children)) node.children.forEach(walk);\n    })(group);\n    return out;\n  }\n\n  function pxToBlock(px) { return px / 16.0; }\n  function numWithCenter(px, isXZ, centered) {\n    const base = pxToBlock(px);\n    return centered && isXZ ? base + 0.5 : base;\n  }\n\n  function buildBoxesFromCubes(cubes, centered) {\n    const list = cubes.slice().sort((a, b) => {\n      if (a.from[1] !== b.from[1]) return a.from[1] - b.from[1];\n      if (a.from[0] !== b.from[0]) return a.from[0] - b.from[0];\n      return a.from[2] - b.from[2];\n    });\n\n    return list.map(c => ([\n      numWithCenter(c.from[0], true,  centered),\n      numWithCenter(c.from[1], false, centered),\n      numWithCenter(c.from[2], true,  centered),\n      numWithCenter(c.to[0],   true,  centered),\n      numWithCenter(c.to[1],   false, centered),\n      numWithCenter(c.to[2],   true,  centered)\n    ]));\n  }\n})();\n"
  },
  {
    "path": "plugins/simplify.js",
    "content": "Plugin.register(\"simplify\", {\n    title: \"Simplify Models\",\n    author: \"ThePinkHacker\",\n    icon: \"build\",\n    description: \"Simplifies the cubes in a model. For example if a block was 0.99 pixels wide, then it would change it to 1.\",\n    version: \"1.0.0\",\n    variant: \"both\",\n    onload() {\n        MenuBar.addAction(\n            new Action({\n                id: \"simplify\",\n                name: \"Simplify\",\n                icon: \"build\",\n                category: \"filter\",\n                click: dialog_open,\n            }),\n            \"filter\",\n        );\n    },\n    onunload() {\n        MenuBar.removeAction(\"filter.simplify\");\n    }\n});\n\nfunction dialog_confirm(data, pointer_event) {\n    if (data.roundAmount == 0) {\n        Blockbench.showMessage(\"Failed, Invalid Number.\", \"center\");\n        return;\n    }\n    \n    try {\n        let cubes;\n\n        if (data.selectOnly == true) {\n            cubes = Cube.selected;\n        } else {\n            cubes = Cube.all;\n        }\n    \n        // Undo\n        Undo.initEdit({elements: cubes});\n    \n        // Simplify cube loop\n        for (let i = 0; i < cubes.length; i++) {\n            // Size\n            if (data.size) {\n                cubes[i].to = simplify_array(cubes[i].to, data.roundAmount);\n                cubes[i].from = simplify_array(cubes[i].from, data.roundAmount);\n            }\n    \n            // UV\n            if (data.uv) {\n                cubes[i].faces.north.uv = simplify_array(cubes[i].faces.north.uv, data.roundAmount);\n                cubes[i].faces.east.uv = simplify_array(cubes[i].faces.east.uv, data.roundAmount);\n                cubes[i].faces.south.uv = simplify_array(cubes[i].faces.south.uv, data.roundAmount);\n                cubes[i].faces.west.uv = simplify_array(cubes[i].faces.west.uv, data.roundAmount);\n                cubes[i].faces.up.uv = simplify_array(cubes[i].faces.up.uv, data.roundAmount);\n                cubes[i].faces.down.uv = simplify_array(cubes[i].faces.down.uv, data.roundAmount);\n            }\n    \n            // Rotation\n            if (data.rotation) {\n                cubes[i].rotation = simplify_array(cubes[i].rotation, data.roundAmount);\n            }\n    \n            // Origin\n            if (data.origin) {\n                cubes[i].origin = simplify_array(cubes[i].origin, data.roundAmount);\n            }\n    \n            Canvas.adaptObjectPosition(cubes[i]);\n            Canvas.updateUV(cubes[i]);\n        }\n    \n        Undo.finishEdit(\"simplify cubes\", {elements: cubes});\n        updateSelection()\n    }\n    catch (error) {\n        console.error(error);\n        Blockbench.showMessage(\"Failed\", \"center\");\n        updateSelection()\n    }\n}\n\nfunction dialog_create() {\n    let form = {\n        selectOnly: {label: \"Selected Cubes Only\", type: \"checkbox\"},\n        roundAmount: {label: \"Rounding Amount\", type: \"number\", value: 0.25, min: 0.0, step: 0.25},\n        size: {label: \"Size\", type: \"checkbox\", value: true},\n        uv: {label: \"UV\", type: \"checkbox\", value: true},\n        origin: {label: \"Origin\", type: \"checkbox\", value: true}\n    };\n\n    if (!Format.rotation_snap) {\n        form.rotation = {label: \"Rotation\", type: \"checkbox\", value: true};\n    }\n\n    return new Dialog({\n        title: \"Simplify Models\",\n        id: \"simplify_options\",\n        lines: [\n            \"<p>This will simplify the cubes in the current model. It will do this to the rotation, pivot point, size, UV, and position of each cube.</p>\",\n        ],\n        form: form,\n        onConfirm: dialog_confirm,\n    });\n}\n\n\nfunction dialog_open() {\n    dialog_create().show();\n}\n\nfunction simplify_value(value, round) {\n    return Math.round(value / round) * round;\n}\n\nfunction simplify_array(values, round) {\n    return values.map((value) => simplify_value(value, round));\n}\n"
  },
  {
    "path": "plugins/skin_mirror.js",
    "content": "(function () {\n\n\tfunction getTexture() {\n\t\tif (Texture.selected) {\n\t\t\treturn [Texture.selected];\n\t\t} else {\n\t\t\treturn Texture.all;\n\t\t}\n\t}\n\n\tlet arm_pixels = 4;\n\tlet invert = false;\n\n\twindow.MirrorUI = {\n\t\tdialog: new Dialog({\n\t\t\tid: 'skin_mirror',\n\t\t\ttitle: 'Skin Mirror',\n\t\t\twidth: 540,\n\t\t\tform: {\n\t\t\t\ttype: {\n\t\t\t\t\tlabel: 'Type', type: 'select', options: {\n\t\t\t\t\t\tsteve: 'Steve',\n\t\t\t\t\t\talex: 'Alex',\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmirror: {\n\t\t\t\t\tlabel: 'Direction', type: 'select', options: {\n\t\t\t\t\t\tmirror_normal: 'Right Arm/Leg -> Left Arm/Leg',\n\t\t\t\t\t\tmirror_inverted: 'Left Arm/Leg -> Right Arm/Leg',\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\tonFormChange({ type, mirror }) {\n\t\t\t\tif (type == 'steve') {\n\t\t\t\t\tarm_pixels = 4;\n\t\t\t\t}\n\t\t\t\telse if (type == 'alex') {\n\t\t\t\t\tarm_pixels = 3;\n\t\t\t\t}\n\n\t\t\t\tif (mirror == 'mirror_inverted') {\n\t\t\t\t\tinvert = true;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tinvert = false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonConfirm() {\n\n\t\t\t\tthis.hide()\n\n\t\t\t\tfunction mirror_selection(ctx, texture, s_px, s_py, t_px, t_py, size_x, size_y, s_layer, t_layer) {\n\t\t\t\t\t\n\t\t\t\t\tlet factor = texture.display_height / 64;\n\t\t\t\t\t\n\t\t\t\t\tif (invert) {\n\t\t\t\t\t\t[s_px, t_px, s_py, t_py] = [t_px, s_px, t_py, s_py]\n\n\t\t\t\t\t\t//base layer arms + legs\n\t\t\t\t\t\tfor (let i = 0; i < size_x * factor; i++) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tctx.clearRect((t_px + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\t\t\t\t\t\tctx.drawImage(texture.img, s_px * factor + i, s_py * factor, 1, size_y * factor, (t_px + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//second layer legs\n\t\t\t\t\t\tif (t_layer == -16) {\n\t\t\t\t\t\t\tfor (let i = 0; i < size_x * factor; i++) {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tctx.clearRect((t_px + size_x) * factor - 1 - i, (t_py + s_layer) * factor, 1, size_y * factor);\n\t\t\t\t\t\t\t\tctx.drawImage(texture.img, (s_px+t_layer) * factor + i, s_py * factor, 1, size_y * factor, (t_px + size_x) * factor - 1 - i, (t_py + s_layer) * factor, 1, size_y * factor);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//second layer arms\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (let i = 0; i < size_x * factor; i++) {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tctx.clearRect((t_px + size_x) * factor - 1 - i, (t_py + t_layer) * factor, 1, size_y * factor);\n\t\t\t\t\t\t\t\tctx.drawImage(texture.img, (s_px+s_layer) * factor + i, s_py * factor, 1, size_y * factor, (t_px + size_x) * factor - 1 - i, (t_py + t_layer) * factor, 1, size_y * factor);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (let i = 0; i < size_x * factor; i++) {\n\t\t\t\t\t\t\t//base layer arms + legs\n\t\t\t\t\t\t\tctx.clearRect((t_px + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\t\t\t\t\t\tctx.drawImage(texture.img, s_px * factor + i, s_py * factor, 1, size_y * factor, (t_px + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\n\t\t\t\t\t\t\t//second layer arms + legs\n\t\t\t\t\t\t\tctx.clearRect((t_px + t_layer + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\t\t\t\t\t\tctx.drawImage(texture.img, s_px * factor + i, (s_py+s_layer) * factor, 1, size_y * factor, (t_px + t_layer + size_x) * factor - 1 - i, t_py * factor, 1, size_y * factor);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet textures = getTexture();\n\n\t\t\t\tUndo.initEdit({ textures, bitmap: true });\n\t\t\t\ttextures.forEach(texture => {\n\t\t\t\t\ttexture.edit((canvas) => {\n\n\t\t\t\t\t\tlet ctx = canvas.getContext('2d');\n\n\t\t\t\t\t\tif (arm_pixels == 3) {\n\t\t\t\t\t\t\t//arms alex\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 40, 20, 39, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 44, 20, 36, 52, 3, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 47, 20, 32, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 51, 20, 43, 52, 3, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 44, 16, 36, 48, 3, 4, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 47, 16, 39, 48, 3, 4, 16, 16);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t//arms steve\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 40, 20, 40, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 44, 20, 36, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 48, 20, 32, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 52, 20, 44, 52, 4, 12, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 44, 16, 36, 48, 4, 4, 16, 16);\n\t\t\t\t\t\t\tmirror_selection(ctx, texture, 48, 16, 40, 48, 4, 4, 16, 16);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//legs\n\t\t\t\t\t\tmirror_selection(ctx, texture, 0, 20, 24, 52, 4, 12, 16, -16);\n\t\t\t\t\t\tmirror_selection(ctx, texture, 4, 20, 20, 52, 4, 12, 16, -16);\n\t\t\t\t\t\tmirror_selection(ctx, texture, 8, 20, 16, 52, 4, 12, 16, -16);\n\t\t\t\t\t\tmirror_selection(ctx, texture, 12, 20, 28, 52, 4, 12, 16, -16);\n\t\t\t\t\t\tmirror_selection(ctx, texture, 4, 16, 20, 48, 4, 4, 16, -16);\n\t\t\t\t\t\tmirror_selection(ctx, texture, 8, 16, 24, 48, 4, 4, 16, -16);\n\n\t\t\t\t\t}, { no_undo: true });\n\t\t\t\t})\n\t\t\t\tUndo.finishEdit('Mirrored Skin')\n\t\t\t}\n\t\t})\n\t};\n\n\tPlugin.register('skin_mirror', {\n\t\ttitle: 'Skin Mirror',\n\t\ticon: 'icon-mirror_x',\n\t\tauthor: 'oectway',\n\t\tdescription: 'Tool that allows you to mirror the arms and legs of existing skins to the other side.',\n\t\ttags: [\"Minecraft\", \"Skins\"],\n\t\tversion: '1.1.0',\n\t\tvariant: 'both',\n\t\tonload() {\n\t\t\tskin_mirror_action = new Action('open_skin_mirror', {\n\t\t\t\tname: 'Mirror Skin',\n\t\t\t\ticon: 'icon-mirror_x',\n\t\t\t\tclick: () => {\n\t\t\t\t\tMirrorUI.dialog.show();\n\t\t\t\t}\n\t\t\t})\n\t\t\tMenuBar.addAction(skin_mirror_action, 'filter');\n\t\t},\n\t\tonunload() {\n\t\t\tskin_mirror_action.delete();\n\t\t}\n\t})\n})()"
  },
  {
    "path": "plugins/skin_packager.js",
    "content": "(() => {\n  // src/util/uninstall_register.js\n  var removables = [];\n  function registerRemovable(item) {\n    removables.push(item);\n  }\n  function deleteRemovables() {\n    removables.forEach((item) => {\n      if (typeof item.delete == \"function\") item.delete();\n    });\n    removables.splice(0, Infinity);\n  }\n\n  // src/generate_pack.js\n  var BoneTypes = {\n    body: \"base\",\n    head: \"base\",\n    hat: \"clothing\",\n    helmet: \"armor\",\n    rightArm: \"base\",\n    rightSleeve: \"clothing\",\n    rightArmArmor: \"armor\",\n    rightItem: \"item\",\n    leftArm: \"base\",\n    leftSleeve: \"clothing\",\n    leftArmArmor: \"armor\",\n    leftItem: \"item\",\n    jacket: \"clothing\",\n    bodyArmor: \"armor\",\n    waist: \"armor_offset\",\n    rightLeg: \"base\",\n    rightPants: \"clothing\",\n    rightLegging: \"armor\",\n    rightBoot: \"armor\",\n    leftLeg: \"base\",\n    leftPants: \"clothing\",\n    leftLegging: \"armor\",\n    leftBoot: \"armor\"\n  };\n  var FormValues = {};\n  var SkinData = [];\n  function isProjectSlim(project) {\n    let arm_cube = project.elements.find((el) => el instanceof Cube && el.name.includes(\"Right Arm\"));\n    return arm_cube && arm_cube.size(0) < 3.8;\n  }\n  registerRemovable(Blockbench.addCSS(`\n\t.skin_pack_export_list > div {\n\t\tpadding-left: 118px;\n\t\tdisplay: flex;\n\t}\n\t.skin_pack_export_list > div > label {\n\t\tflex-grow: 1;\n\t\twidth: 0;\n\t}\n\t.skin_pack_export_list > div > label.checkbox {\n\t\tflex-grow: 0;\n\t\twidth: 34px;\n\t\ttext-align: center;\n\t}\n\t.skin_pack_export_list li {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\t.skin_pack_export_list li.disabled_skin {\n\t\topacity: 0.5;\n\t}\n\t.skin_pack_export_list li > * {\n\t\tmargin: 2px;\n\t\tobject-fit: contain;\n\t}\n\t.skin_pack_export_list li input[type=checkbox] {\n\t\ttext-align: center;\n\t\tmin-width: 30px;\n\t}\n\t.skin_pack_export_list li input[type=text] {\n\t\tflex-grow: 1;\n\t}\n\t.skin_pack_export_list .skin_drag_handle {\n\t\tflex-grow: 0;\n\t\tcursor: move;\n\t\tpadding-top: 6px;\n\t}\n\t.skin_pack_export_list li img {\n\t\ttransition: transform 100ms ease;\n\t\ttransform-origin: left;\n\t}\n\t.skin_pack_export_list li:not(.disabled_skin) img:hover {\n\t\ttransform: scale(4);\n\t\tbackground-color: var(--color-back);\n\t\tborder: 0.25px solid var(--color-accent);\n\t}\n`));\n  function cleanTextureName(name) {\n    return name.replace(/\\.png$/i, \"\");\n  }\n  function selectSkinsForExport() {\n    let uuids = [];\n    ModelProject.all.forEach((project) => {\n      if (project.format.id !== \"minecraft_skin_geometry\" && project.format.id !== \"skin\") return;\n      if (!project.textures[0]) return;\n      if (project.format.id === \"minecraft_skin_geometry\") {\n        let data = SkinData.find((s) => s.uuid == project.uuid);\n        if (!data) {\n          data = {\n            uuid: project.uuid,\n            export: true,\n            slim: project.minecraft_skin_slim,\n            free: false\n          };\n          SkinData.push(data);\n        }\n        data.thumbnail = project.thumbnail || project.textures[0].source;\n        data.name = project.skin_display_name;\n        data.id = project.geometry_name;\n        uuids.push(project.uuid);\n      } else {\n        let multi = project.textures.length > 1;\n        project.textures.forEach((texture, i) => {\n          let uuid = project.uuid + \"-\" + texture.uuid;\n          let data = SkinData.find((s) => s.uuid == uuid);\n          if (!data) {\n            data = {\n              uuid,\n              export: true,\n              slim: isProjectSlim(project),\n              free: false,\n              name: multi ? cleanTextureName(texture.name) : project.skin_display_name,\n              id: multi ? cleanTextureName(texture.name).replace(/\\s+/g, \"\") : project.geometry_name\n            };\n            SkinData.push(data);\n          }\n          data.texture = texture;\n          data.thumbnail = texture.source;\n          if (!multi) data.name = project.skin_display_name;\n          if (!multi) data.id = project.geometry_name;\n          uuids.push(data.uuid);\n        });\n      }\n    });\n    SkinData.forEachReverse((skin) => {\n      if (!uuids.includes(skin.uuid)) {\n        SkinData.remove(skin);\n      }\n    });\n    let dialog = new Dialog({\n      id: \"skin_pack_export\",\n      title: \"Export Skin Pack\",\n      width: 700,\n      form: {\n        name: { label: \"Pack Name\", type: \"text\", value: FormValues.name },\n        id: { label: \"Pack Identifier\", type: \"text\", value: FormValues.id },\n        version: { label: \"Version\", type: \"text\", value: FormValues.version || \"1.0.0\" },\n        uuid: { label: \"UUID\", type: \"text\", value: FormValues.uuid || guid() },\n        regenerate_uuid: { label: \" \", nocolon: true, type: \"buttons\", buttons: [\"Regenerate UUID\"], click(index) {\n          dialog.setFormValues({ uuid: guid() });\n        } },\n        type: { type: \"select\", label: \"Pack Type\", options: {\n          auger: \"Ready-to-Submit\",\n          mcpack: \"MCPack\"\n        } },\n        separator1: \"_\",\n        key_art: { type: \"file\", label: \"Key Art\", value: FormValues.key_art, extensions: [\"jpg\"], filetype: \"Image\", condition: (form) => form.type == \"auger\" },\n        partner_art: { type: \"file\", label: \"Partner Art\", value: FormValues.partner_art, extensions: [\"jpg\"], filetype: \"Image\", condition: (form) => form.type == \"auger\" },\n        hd_key_art: { type: \"file\", label: \"HD Key Art\", value: FormValues.hd_key_art, extensions: [\"jpg\"], filetype: \"Image\", condition: (form) => form.type == \"auger\" },\n        separator2: \"_\"\n      },\n      component: {\n        data() {\n          return {\n            skins: SkinData\n          };\n        },\n        methods: {\n          changeMeta(skin, uuid, key, event) {\n            let project = ModelProject.all.find((p) => p.uuid == uuid || p.textures.length == 1 && uuid == p.uuid + \"-\" + p.textures[0].uuid);\n            if (project) {\n              if (key == \"id\") {\n                project.geometry_name = skin.id;\n              } else {\n                project.skin_display_name = skin.name;\n              }\n              project.saved = false;\n            }\n          },\n          sort(event) {\n            var item = this.skins.splice(event.oldIndex, 1)[0];\n            this.skins.splice(event.newIndex, 0, item);\n          },\n          drop(event) {\n          }\n        },\n        template: `\n\t\t\t\t<div class=\"skin_pack_export_list\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<label>ID</label>\n\t\t\t\t\t\t<label>Name</label>\n\t\t\t\t\t\t<label class=\"checkbox\">Slim</label>\n\t\t\t\t\t\t<label class=\"checkbox\">Free</label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul v-sortable=\"{onUpdate: sort, onEnd: drop, animation: 160, handle: '.skin_drag_handle'}\">\n\t\t\t\t\t\t<li v-for=\"skin in skins\" :key=\"skin.uuid\" :class=\"{disabled_skin: !skin.export}\">\n\t\t\t\t\t\t\t<div class=\"skin_drag_handle\"><i class=\"material-icons\">drag_handle</i></div>\n\t\t\t\t\t\t\t<input type=\"checkbox\" v-model=\"skin.export\" :style=\"{color: skin.export ? 'var(--color-accent)' : 'unset'}\">\n\t\t\t\t\t\t\t<img :src=\"skin.thumbnail\" width=\"48px\" height=\"48px\" />\n\t\t\t\t\t\t\t<input type=\"text\" class=\"dark_bordered\" v-model=\"skin.id\" @input=\"changeMeta(skin, skin.uuid, 'id', $event)\">\n\t\t\t\t\t\t\t<input type=\"text\" class=\"dark_bordered\" v-model=\"skin.name\" @input=\"changeMeta(skin, skin.uuid, 'name', $event)\">\n\t\t\t\t\t\t\t<input type=\"checkbox\" v-model=\"skin.slim\">\n\t\t\t\t\t\t\t<input type=\"checkbox\" v-model=\"skin.free\">\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t`\n      },\n      onConfirm(formResult) {\n        FormValues.id = formResult.id;\n        FormValues.name = formResult.name;\n        FormValues.uuid = formResult.uuid;\n        FormValues.version = formResult.version;\n        FormValues.type = formResult.type;\n        FormValues.key_art = formResult.key_art;\n        FormValues.partner_art = formResult.partner_art;\n        FormValues.hd_key_art = formResult.hd_key_art;\n        generatePack(formResult);\n      }\n    }).show();\n  }\n  async function generatePack(options) {\n    let archive = new JSZip();\n    let skin_folder;\n    if (options.type == \"mcpack\") {\n      skin_folder = archive;\n    } else {\n      skin_folder = archive.folder(\"Content/skin_pack\");\n    }\n    let skin_config = {\n      id: options.id,\n      name: options.name,\n      uuid: options.uuid,\n      version: options.version,\n      type: options.type,\n      key_art: options.key_art,\n      partner_art: options.partner_art,\n      hd_key_art: options.hd_key_art,\n      skins: {}\n    };\n    let geometries = {};\n    let skins = [];\n    let translations = [\n      `skinpack.${options.id}=${options.name}`\n    ];\n    for (let skin of SkinData) {\n      let uuid = skin.uuid;\n      if (!skin.export) continue;\n      let project = ModelProject.all.find((p) => uuid.substring(0, p.uuid.length) == p.uuid);\n      if (!project) continue;\n      let geometry_name = project.format.id == \"minecraft_skin_geometry\" && `geometry.${options.id}.${skin.id}`;\n      let meta = {\n        localization_name: skin.id,\n        geometry: geometry_name || `geometry.humanoid.${skin.slim ? \"customSlim\" : \"custom\"}`,\n        texture: `${skin.id}.png`,\n        type: skin.free ? \"free\" : \"paid\"\n      };\n      skins.push(meta);\n      translations.push(`skin.${options.id}.${skin.id}=${skin.name}`);\n      let texture = skin.texture || project.selected_texture || project.textures[0];\n      skin_folder.file(`${skin.id}.png`, texture.getBase64(), { base64: true });\n      if (geometry_name) {\n        project.select();\n        if (Modes.animate) {\n          Modes.options.edit.select();\n        }\n        let model = Codecs.bedrock_old.compile({ raw: true });\n        let { bones } = model;\n        delete model.visible_bounds_width;\n        delete model.visible_bounds_height;\n        delete model.visible_bounds_offset;\n        delete model.bones;\n        model.META_ModelVersion = \"1.0.6\";\n        model.rigtype = skin.slim ? \"slim\" : \"normal\";\n        if (project.skin_geo_flag_armsdown) model.animationArmsDown = true;\n        if (project.skin_geo_flag_armsoutfront) model.animationArmsOutFront = true;\n        if (project.skin_geo_flag_statueoflibertyarms) model.animationStatueOfLibertyArms = true;\n        if (project.skin_geo_flag_singlearmanimation) model.animationSingleArmAnimation = true;\n        if (project.skin_geo_flag_stationarylegs) model.animationStationaryLegs = true;\n        if (project.skin_geo_flag_singleleganimation) model.animationSingleLegAnimation = true;\n        if (project.skin_geo_flag_noheadbob) model.animationNoHeadBob = true;\n        if (project.skin_geo_flag_dontshowarmor) model.animationDontShowArmor = true;\n        if (project.skin_geo_flag_upsidedown) model.animationUpsideDown = true;\n        if (project.skin_geo_flag_invertedcrouch) model.animationInvertedCrouch = true;\n        model.bones = bones;\n        bones.forEach((bone) => {\n          if (BoneTypes[bone.name]) {\n            bone.META_BoneType = BoneTypes[bone.name];\n          }\n        });\n        geometries[geometry_name] = model;\n      }\n      skin_config.skins[skin.id] = {\n        export: skin.export,\n        slim: skin.slim,\n        free: skin.free,\n        name: skin.name,\n        model_file: geometry_name ? Project.save_path : void 0,\n        texture_file: texture.path || texture.source.replace(/\\?.*$/, \"\")\n      };\n    }\n    let version = options.version ? options.version.split(\".\").map((v) => parseInt(v)) : [1, 0, 0];\n    while (version.length < 3) {\n      version.push(0);\n    }\n    let manifest = {\n      format_version: 1,\n      header: {\n        name: options.name || \"pack.name\",\n        version,\n        uuid: options.uuid || guid()\n      },\n      modules: [\n        {\n          version,\n          type: \"skin_pack\",\n          uuid: guid()\n        }\n      ]\n    };\n    let languages = [\"en_US\"];\n    let skins_file = {\n      serialize_name: options.id,\n      localization_name: options.id,\n      skins\n    };\n    if (Object.keys(geometries).length) skin_folder.file(\"geometry.json\", compileJSON(geometries));\n    skin_folder.file(\"skins.json\", compileJSON(skins_file));\n    skin_folder.file(\"manifest.json\", compileJSON(manifest));\n    skin_folder.file(\"texts/en_US.lang\", translations.join(\"\\n\"));\n    skin_folder.file(\"texts/languages.json\", compileJSON(languages));\n    if (options.type == \"mcpack\") {\n      let blob = await archive.generateAsync({ type: \"blob\" });\n      Blockbench.export({\n        type: \"MCPack\",\n        extensions: [\"mcpack\"],\n        name: options.id,\n        content: blob,\n        savetype: \"zip\"\n      });\n    } else {\n      console.log(options);\n      async function writeImage(source, target) {\n        if (source && isApp) {\n          let fs = requireNativeModule(\"fs\");\n          let base64 = fs.readFileSync(source, \"base64\");\n          archive.file(target, base64, { base64: true });\n        }\n      }\n      await writeImage(options.key_art, `Store Art/${options.id}_Thumbnail_0.jpg`);\n      await writeImage(options.partner_art, `Marketing Art/${options.id}_PartnerArt.jpg`);\n      await writeImage(options.hd_key_art, `Marketing Art/${options.id}_MarketingKeyArt.jpg`);\n      let blob = await archive.generateAsync({ type: \"blob\" });\n      Blockbench.export({\n        type: \"ZIP Folder\",\n        extensions: [\"zip\"],\n        name: options.id,\n        content: blob,\n        savetype: \"zip\"\n      });\n    }\n    Blockbench.export({\n      type: \"Skin Pack Config\",\n      extensions: [\"bbskinpack\"],\n      name: options.id,\n      content: \"\",\n      custom_writer(content, path) {\n        let export_skin_config = JSON.parse(JSON.stringify(skin_config));\n        if (skin_config.key_art) export_skin_config.key_art = PathModule.relative(PathModule.dirname(path), skin_config.key_art).replace(/[\\\\/]+/g, \"/\");\n        if (skin_config.partner_art) export_skin_config.partner_art = PathModule.relative(PathModule.dirname(path), skin_config.partner_art).replace(/[\\\\/]+/g, \"/\");\n        if (skin_config.hd_key_art) export_skin_config.hd_key_art = PathModule.relative(PathModule.dirname(path), skin_config.hd_key_art).replace(/[\\\\/]+/g, \"/\");\n        for (let id in export_skin_config.skins) {\n          let skin = export_skin_config.skins[id];\n          if (isApp && skin.model_file) {\n            skin.model_file = PathModule.relative(PathModule.dirname(path), skin.model_file).replace(/[\\\\/]+/g, \"/\");\n          }\n          if (isApp && skin.texture_file) {\n            skin.texture_file = PathModule.relative(PathModule.dirname(path), skin.texture_file).replace(/[\\\\/]+/g, \"/\");\n          }\n        }\n        Blockbench.writeFile(path, {\n          content: compileJSON(export_skin_config),\n          savetype: \"text\"\n        });\n      }\n    });\n  }\n  if (!BarItems.export_minecraft_skin_pack) {\n    let export_action = new Action(\"export_minecraft_skin_pack\", {\n      name: \"Export Skin Pack\",\n      icon: \"folder_shared\",\n      click() {\n        selectSkinsForExport();\n      }\n    });\n    MenuBar.addAction(export_action, \"file.export\");\n    registerRemovable(export_action);\n  }\n\n  // src/skin_presets.js\n  var PresetSteve = {\n    display_name: \"Player - Wide\",\n    pose: true,\n    model: `{\n\t\t\"name\": \"steve\",\n\t\t\"texturewidth\": 64,\n\t\t\"textureheight\": 64,\n\t\t\"eyes\": [\n\t\t\t[9, 11],\n\t\t\t[13, 11]\n\t\t],\n\t\t\"bones\": [\n\t\t\t{\n\t\t\t\t\"name\": \"Waist\",\n\t\t\t\t\"color\": 0,\n\t\t\t\t\"pivot\": [0, 12, 0],\n\t\t\t\t\"pose\": [0, 0, 0]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Head\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 1,\n\t\t\t\t\"pivot\": [0, 24, 0],\n\t\t\t\t\"pose\": [-6, 5, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Head\", \"origin\": [-4, 24, -4], \"size\": [8, 8, 8], \"uv\": [0, 0]},\n\t\t\t\t\t{\"name\": \"Hat Layer\", \"visibility\": false, \"origin\": [-4, 24, -4], \"size\": [8, 8, 8], \"uv\": [32, 0], \"inflate\": 0.5, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Body\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 3,\n\t\t\t\t\"pivot\": [0, 24, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Body\", \"origin\": [-4, 12, -2], \"size\": [8, 12, 4], \"uv\": [16, 16]},\n\t\t\t\t\t{\"name\": \"Body Layer\", \"visibility\": false, \"origin\": [-4, 12, -2], \"size\": [8, 12, 4], \"uv\": [16, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Right Arm\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 5,\n\t\t\t\t\"pivot\": [-5, 22, 0],\n\t\t\t\t\"pose\": [-10, 0, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Right Arm\", \"origin\": [-8, 12, -2], \"size\": [4, 12, 4], \"uv\": [40, 16]},\n\t\t\t\t\t{\"name\": \"Right Arm Layer\", \"visibility\": false, \"origin\": [-8, 12, -2], \"size\": [4, 12, 4], \"uv\": [40, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Left Arm\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 0,\n\t\t\t\t\"pivot\": [5, 22, 0],\n\t\t\t\t\"pose\": [12, 0, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Left Arm\", \"origin\": [4, 12, -2], \"size\": [4, 12, 4], \"uv\": [32, 48]},\n\t\t\t\t\t{\"name\": \"Left Arm Layer\", \"visibility\": false, \"origin\": [4, 12, -2], \"size\": [4, 12, 4], \"uv\": [48, 48], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Right Leg\",\n\t\t\t\t\"color\": 6,\n\t\t\t\t\"pivot\": [-1.9, 12, 0],\n\t\t\t\t\"pose\": [11, 0, 2],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Right Leg\", \"origin\": [-3.9, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 16]},\n\t\t\t\t\t{\"name\": \"Right Leg Layer\", \"visibility\": false, \"origin\": [-3.9, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Left Leg\",\n\t\t\t\t\"color\": 7,\n\t\t\t\t\"pivot\": [1.9, 12, 0],\n\t\t\t\t\"pose\": [-10, 0, -2],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Left Leg\", \"origin\": [-0.1, 0, -2], \"size\": [4, 12, 4], \"uv\": [16, 48]},\n\t\t\t\t\t{\"name\": \"Left Leg Layer\", \"visibility\": false, \"origin\": [-0.1, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 48], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}`\n  };\n  var PresetAlex = {\n    display_name: \"Player - Slim\",\n    pose: true,\n    model: `{\n\t\t\"name\": \"alex\",\n\t\t\"texturewidth\": 64,\n\t\t\"textureheight\": 64,\n\t\t\"eyes\": [\n\t\t\t[9, 11],\n\t\t\t[13, 11]\n\t\t],\n\t\t\"bones\": [\n\t\t\t{\n\t\t\t\t\"name\": \"Waist\",\n\t\t\t\t\"color\": 0,\n\t\t\t\t\"pivot\": [0, 12, 0],\n\t\t\t\t\"pose\": [0, 0, 0]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Head\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 1,\n\t\t\t\t\"pivot\": [0, 24, 0],\n\t\t\t\t\"pose\": [-6, 5, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Head\", \"origin\": [-4, 24, -4], \"size\": [8, 8, 8], \"uv\": [0, 0]},\n\t\t\t\t\t{\"name\": \"Hat Layer\", \"visibility\": false, \"origin\": [-4, 24, -4], \"size\": [8, 8, 8], \"uv\": [32, 0], \"inflate\": 0.5, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Body\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 3,\n\t\t\t\t\"pivot\": [0, 24, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Body\", \"origin\": [-4, 12, -2], \"size\": [8, 12, 4], \"uv\": [16, 16]},\n\t\t\t\t\t{\"name\": \"Body Layer\", \"visibility\": false, \"origin\": [-4, 12, -2], \"size\": [8, 12, 4], \"uv\": [16, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Right Arm\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 5,\n\t\t\t\t\"pivot\": [-5, 21.5, 0],\n\t\t\t\t\"pose\": [-10, 0, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Right Arm\", \"origin\": [-7, 11.5, -2], \"size\": [3, 12, 4], \"uv\": [40, 16]},\n\t\t\t\t\t{\"name\": \"Right Arm Layer\", \"visibility\": false, \"origin\": [-7, 11.5, -2], \"size\": [3, 12, 4], \"uv\": [40, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Left Arm\",\n\t\t\t\t\"parent\": \"Waist\",\n\t\t\t\t\"color\": 0,\n\t\t\t\t\"pivot\": [5, 21.5, 0],\n\t\t\t\t\"pose\": [12, 0, 0],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Left Arm\", \"origin\": [4, 11.5, -2], \"size\": [3, 12, 4], \"uv\": [32, 48]},\n\t\t\t\t\t{\"name\": \"Left Arm Layer\", \"visibility\": false, \"origin\": [4, 11.5, -2], \"size\": [3, 12, 4], \"uv\": [48, 48], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Right Leg\",\n\t\t\t\t\"color\": 6,\n\t\t\t\t\"pivot\": [-1.9, 12, 0],\n\t\t\t\t\"pose\": [11, 0, 2],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Right Leg\", \"origin\": [-3.9, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 16]},\n\t\t\t\t\t{\"name\": \"Right Leg Layer\", \"visibility\": false, \"origin\": [-3.9, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 32], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"name\": \"Left Leg\",\n\t\t\t\t\"color\": 7,\n\t\t\t\t\"pivot\": [1.9, 12, 0],\n\t\t\t\t\"pose\": [-10, 0, -2],\n\t\t\t\t\"cubes\": [\n\t\t\t\t\t{\"name\": \"Left Leg\", \"origin\": [-0.1, 0, -2], \"size\": [4, 12, 4], \"uv\": [16, 48]},\n\t\t\t\t\t{\"name\": \"Left Leg Layer\", \"visibility\": false, \"origin\": [-0.1, 0, -2], \"size\": [4, 12, 4], \"uv\": [0, 48], \"inflate\": 0.25, \"layer\": true}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}`\n  };\n\n  // src/load_skin_pack_config.js\n  function importImageFileAsSkin(file, is_alex) {\n    let parts = file.name.replace(/\\.png$/i, \"\").split(/[-_.]/);\n    let alex_hints = [\"s\", \"a\", \"f\", \"slim\", \"alex\", \"female\"];\n    if (is_alex == void 0) {\n      is_alex = alex_hints.includes(parts[0]) || alex_hints.includes(parts.last());\n    }\n    newProject(Formats.skin);\n    let preset = is_alex ? PresetAlex : PresetSteve;\n    let model = JSON.parse(preset.model || preset.model_bedrock);\n    Codecs.skin_model.parse(model, 16, null, true, true);\n    Project.name = parts.filter((part, i) => !alex_hints.includes(part) || i && i !== parts.length - 1 || part.toLowerCase() == \"female\").map((part) => part.substring(0, 1).toUpperCase() + part.substring(1)).join(\" \");\n    Project.geometry_name = file.name.replace(/\\.png$/i, \"\");\n    Texture.all[0].remove(true);\n    new Texture({ name: file.name }).fromFile(file).add(false);\n    Outliner.elements.forEach((element) => {\n      if (element.visibility === false) element.visibility = true;\n    });\n    Canvas.updateVisibility();\n  }\n  function loadSkinPackConfig(file) {\n    let content = autoParseJSON(file.content);\n    let dirname = PathModule.dirname(file.path);\n    FormValues.id = content.id;\n    FormValues.name = content.name;\n    FormValues.uuid = content.uuid;\n    FormValues.version = content.version;\n    FormValues.type = content.type;\n    FormValues.key_art = content.key_art ? PathModule.join(dirname, content.key_art) : \"\";\n    FormValues.partner_art = content.partner_art ? PathModule.join(dirname, content.partner_art) : \"\";\n    FormValues.hd_key_art = content.hd_key_art ? PathModule.join(dirname, content.hd_key_art) : \"\";\n    for (let id in content.skins) {\n      let skin = content.skins[id];\n      let skin_data = {\n        export: skin.export,\n        slim: skin.slim,\n        free: skin.free\n      };\n      if (skin.model_file) {\n        let model_file = PathModule.join(dirname, skin.model_file);\n        let fs = requireNativeModule(\"fs\", { scope: dirname });\n        let model_file_content = autoParseJSON(fs.readFileSync(model_file, \"utf-8\"));\n        Codecs.project.load(model_file_content, { path: model_file });\n        if (skin.name) Project.skin_display_name = skin.name;\n        if (!Project.name && Project.skin_display_name) Project.name = Project.skin_display_name;\n        skin_data.uuid = Project.uuid;\n        skin_data.thumbnail = Project.thumbnail || Project.textures[0].source;\n        skin_data.name = Project.skin_display_name;\n        skin_data.id = Project.geometry_name;\n      } else if (skin.texture_file) {\n        let texture_file = PathModule.join(dirname, skin.texture_file);\n        Blockbench.read(texture_file, { readtype: \"image\" }, (files) => {\n          importImageFileAsSkin(files[0], skin.slim);\n          if (skin.name) Project.skin_display_name = skin.name;\n          if (Project.skin_display_name) Project.name = Project.skin_display_name;\n          skin_data.uuid = Project.uuid + \"-\" + Texture.all[0].uuid;\n          skin_data.thumbnail = Project.thumbnail || Project.textures[0].source;\n          skin_data.name = Project.skin_display_name;\n          skin_data.id = Project.geometry_name;\n        });\n      }\n      SkinData.push(skin_data);\n    }\n  }\n  if (!BarItems.load_minecraft_skin_pack_config) {\n    let export_action = new Action(\"load_minecraft_skin_pack_config\", {\n      name: \"Load Skin Pack Config\",\n      icon: \"recent_actors\",\n      click() {\n        Blockbench.import({\n          extensions: [\"bbskinpack\"],\n          type: \"Skin Pack Config\"\n        }, (files) => {\n          loadSkinPackConfig(files[0]);\n        });\n      }\n    });\n    MenuBar.addAction(export_action, \"file.5\");\n    registerRemovable(export_action);\n    Blockbench.addDragHandler(\n      \"bbskinpack\",\n      { extensions: [\"bbskinpack\"] },\n      function(files) {\n        loadSkinPackConfig(files[0]);\n      }\n    );\n    registerRemovable({\n      delete() {\n        Blockbench.removeDragHandler(\"bbskinpack\");\n      }\n    });\n  }\n\n  // src/display_name.js\n  var display_name_default = new Property(ModelProject, \"string\", \"skin_display_name\", {\n    condition: { formats: [\"skin\", \"minecraft_skin_geometry\"] },\n    label: \"Display Name\"\n  });\n\n  // package.json\n  var package_default = {\n    name: \"skin-geometry-plugin\",\n    version: \"0.3.2\",\n    description: \"Blockbench plugin to create Minecraft 3D skin packs\",\n    repository: {\n      type: \"git\",\n      url: \"https://github.com/JannisX11/skin-geometry-plugin\"\n    },\n    private: true,\n    main: \"src/plugin.ts\",\n    type: \"module\",\n    scripts: {\n      build: \"esbuild src/skin_geometry_creator.js src/skin_packager.js --bundle --loader:.png=dataurl --outdir=dist\",\n      dev: \"esbuild src/skin_geometry_creator.js src/skin_packager.js --bundle --loader:.png=dataurl --outdir=dist --watch\"\n    },\n    author: \"Jannis\",\n    devDependencies: {\n      \"blockbench-types\": \"^5.1.0-beta.2-next.2\"\n    },\n    dependencies: {\n      esbuild: \"^0.27.4\"\n    }\n  };\n\n  // src/skin_packager.js\n  BBPlugin.register(\"skin_packager\", {\n    title: \"Minecraft Skin Pack Packager\",\n    author: \"JannisX11\",\n    icon: \"icon-player\",\n    description: \"Create Skin Packs for the Minecraft Marketplace\",\n    tags: [\"Minecraft: Bedrock Edition\", \"Minecraft Marketplace\"],\n    about: `Generates skin packs for the Minecraft Marketplace.\n\nAll textures in all open tabs count as skins. You can load individual skins into Blockbench via **File** > **Import Minecraft Skins**.\n\nYou can also create new skins via **New** > **Minecraft Skin**, in the File menu or on the start screen.\n\nExport a skin pack via **File** > **Export** > **Export Skin Pack**.`,\n    version: package_default.version,\n    min_version: \"3.7.0\",\n    variant: \"desktop\",\n    await_loading: true,\n    onload() {\n      let import_action = new Action(\"import_minecraft_skins\", {\n        icon: \"folder\",\n        name: \"Import Minecraft Skins\",\n        description: \"Import a batch of Minecraft skins\",\n        click() {\n          Blockbench.import({\n            resource_id: \"texture\",\n            extensions: [\"png\"],\n            type: \"Minecraft Skin\",\n            readtype: \"image\",\n            multiple: true\n          }, (files) => {\n            files.forEach((file) => {\n              importImageFileAsSkin(file);\n            });\n          });\n        }\n      });\n      MenuBar.menus.file.addAction(import_action, 5);\n      registerRemovable(import_action);\n      registerRemovable(display_name_default);\n    },\n    onunload() {\n      deleteRemovables();\n    }\n  });\n})();\n"
  },
  {
    "path": "plugins/smudge_brush/LICENSE.MD",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "plugins/smudge_brush/members.yml",
    "content": "maintainers:\n  - JannisX11\n"
  },
  {
    "path": "plugins/smudge_brush/smudge_brush.js",
    "content": "/// <reference path=\"../../types/index.d.ts\" />\n\nlet smudge_brush;\n\nPlugin.register('smudge_brush', {\n\ttitle: 'Smudge Brush',\n\ticon: 'touch_app',\n\tauthor: 'JannisX11',\n\tdescription: 'Adds a smudge brush to smear, soften, or blur textures and images',\n\ttags: ['Brush', 'Paint'],\n\tversion: '1.0.0',\n\tmin_version: '4.8.0',\n    creation_date: \"2025-12-27\",\n\tvariant: 'both',\n\tonload() {\n\n\t\tlet last_coord = null;\n\t\tsmudge_brush = new Tool('smudge_brush', {\n\t\t\tname: 'Smudge Brush',\n\t\t\ticon: 'touch_app',\n\t\t\tcategory: 'tools',\n\t\t\ttoolbar: 'brush',\n\t\t\tcursor: 'crosshair',\n\t\t\tselectFace: true,\n\t\t\ttransformerMode: 'hidden',\n\t\t\tpaintTool: true,\n\t\t\tbrush: {\n\t\t\t\tblend_modes: false,\n\t\t\t\tshapes: true,\n\t\t\t\tsize: true,\n\t\t\t\tsoftness: true,\n\t\t\t\topacity: true,\n\t\t\t\toffset_even_radius: true,\n\t\t\t\tfloor_coordinates: () => BarItems.slider_brush_softness.get() == 0,\n\t\t\t\tinterval: 1,\n\t\t\t\tonStrokeStart() {\n\t\t\t\t\tlast_coord = null;\n\t\t\t\t},\n\t\t\t\tdraw({ctx, x, y, size, softness, texture, event}) {\n\t\t\t\t\tif (!last_coord || (last_coord[0] == x && last_coord[1] == y)) {\n\t\t\t\t\t\tlast_coord = [x, y];\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet b_opacity = BarItems.slider_brush_opacity.get()/255;\n\t\t\t\t\tlet matrix_id = Painter.current.element\n\t\t\t\t\t\t\t\t? (Painter.current.element.uuid + Painter.current.face)\n\t\t\t\t\t\t\t\t: Painter.current.face;\n\t\t\t\t\tlet face_matrix = settings.paint_side_restrict.value && Painter.current.face_matrices[matrix_id];\n\t\t\t\t\tlet run_per_pixel = (pxcolor, local_opacity, px, py) => {\n\t\t\t\t\t\tif (face_matrix) {\n\t\t\t\t\t\t\tif (!face_matrix[px] || !face_matrix[px][py % texture.display_height]) {\n\t\t\t\t\t\t\t\treturn pxcolor;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn smudge_brush.brush.changePixel(px, py, pxcolor, local_opacity, {opacity: b_opacity, ctx, x, y, size, softness, texture, event});\n\t\t\t\t\t}\n\t\t\t\t\tlet shape = BarItems.brush_shape.value;\n\t\t\t\t\tif (shape == 'square') {\n\t\t\t\t\t\tPainter.editSquare(ctx, x, y, size, softness * 1.8, run_per_pixel);\n\t\t\t\t\t} else if (shape == 'circle') {\n\t\t\t\t\t\tPainter.editCircle(ctx, x, y, size, softness * 1.8, run_per_pixel);\n\t\t\t\t\t}\n\t\t\t\t\tlast_coord = [x, y];\n\t\t\t\t},\n\t\t\t\tchangePixel(px, py, pxcolor, local_opacity, {opacity, ctx, x, y, size, softness, texture, event}) {\n\t\t\t\t\tlet a = opacity * local_opacity * 0.4;\n\n\t\t\t\t\tlet result_color;\n\t\t\t\t\tlet smear_pixel = [\n\t\t\t\t\t\tpx - (x - last_coord[0]),\n\t\t\t\t\t\tpy - (y - last_coord[1]),\n\t\t\t\t\t];\n\t\t\t\t\tlet smear_color = {r: 0, g: 0, b: 0, a: 0};\n\t\t\t\t\tlet count = 0;\n\t\t\t\t\tlet start = [Math.floor(smear_pixel[0]), Math.floor(smear_pixel[1])]\n\t\t\t\t\tPainter.scanCanvas(ctx, ...start, 2, 2, (px1, py1, pxcolor2) => {\n\t\t\t\t\t\tlet amount_x = smear_pixel[0] % 1;\n\t\t\t\t\t\tlet amount_y = smear_pixel[1] % 1;\n\t\t\t\t\t\tif (px1 == start[0]) amount_x = 1-amount_x;\n\t\t\t\t\t\tif (py1 == start[1]) amount_y = 1-amount_y;\n\t\t\t\t\t\tsmear_color.r += pxcolor2[0] * amount_x * amount_y;\n\t\t\t\t\t\tsmear_color.g += pxcolor2[1] * amount_x * amount_y;\n\t\t\t\t\t\tsmear_color.b += pxcolor2[2] * amount_x * amount_y;\n\t\t\t\t\t\tsmear_color.a += (pxcolor2[3] / 255) * amount_x * amount_y;\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t});\n\t\t\t\t\tif (count == 4) {\n\t\t\t\t\t\tresult_color = Painter.combineColors(pxcolor, smear_color, a);\n\t\t\t\t\t}\n\t\t\t\t\tif (Painter.lock_alpha) result_color.a = pxcolor.a\n\t\t\t\t\treturn result_color || pxcolor;\n\t\t\t\t}\n\t\t\t},\n\t\t\tallowed_view_modes: ['textured', 'material'],\n\t\t\tmodes: ['paint'],\n\t\t\tonCanvasClick(data) {\n\t\t\t\tPainter.startPaintToolCanvas(data, data.event);\n\t\t\t},\n\t\t\tonSelect() {\n\t\t\t\tPainter.updateNslideValues();\n\t\t\t\tInterface.addSuggestedModifierKey('shift', 'modifier_actions.draw_line');\n\t\t\t},\n\t\t\tonUnselect() {\n\t\t\t\tInterface.removeSuggestedModifierKey('shift', 'modifier_actions.draw_line');\n\t\t\t}\n\t\t});\n\t\tif (!localStorage.getItem('smudge_brush.init')) {\n\t\t\tlet index = Toolbars.tools.children.indexOf(BarItems.brush_tool);\n\t\t\tToolbars.tools.add(smudge_brush, index+1);\n\t\t\tlocalStorage.setItem('smudge_brush.init', 'true');\n\t\t}\n\n\t},\n\tonunload() {\n\t\tsmudge_brush.delete();\n\t}\n});\n\n"
  },
  {
    "path": "plugins/splash_art_customiser/about.md",
    "content": "This plugin allows you to customise the start screen's splash art by adding your own! If you add multiple splash art images, you can set it to pick a random one every time your launch Blockbench.\n\n## How to use\nOn the top left corner of the splash art, you will find a gear icon. From here you can manage your custom splash arts.\n\n## Splash art types\n- URL - A splash art can be loaded from a URL (faster loading)\n- File - A splash art can be loaded from a file (slower loading)\n- Gallery - Pick an image from the [Blockbench Gallery](https://www.blockbench.net/gallery)\n\n## Supported file types\n- PNG\n- JPG/JPEG\n- GIF\n- WebP\n- SVG"
  },
  {
    "path": "plugins/splash_art_customiser/splash_art_customiser.js",
    "content": "(async function () {\n  let styles, splashArtStyles, galleryImages, customSplash, dialog, settingsDialog\n  const id = \"splash_art_customiser\"\n  const title = \"Splash Art Customiser\"\n  const E = s => $(document.createElement(s))\n  const db = indexedDB.open(\"splash-art-customiser\", 1)\n  db.onupgradeneeded = () => {\n    const store = db.result.createObjectStore(\"images\", { keyPath: \"image\" })\n    store.createIndex(\"applied\", [\"applied\"])\n  }\n  await new Promise(fulfil => db.onsuccess = fulfil)\n  Plugin.register(id, {\n    title,\n    icon: \"palette\",\n    author: \"Ewan Howell\",\n    description: \"Customise the start screen's splash art, by adding your own!\",\n    tags: [\"Splash art\", \"Start screen\", \"Blockbench\"],\n    version: \"1.1.4\",\n    min_version: \"4.12.0\",\n    variant: \"both\",\n    creation_date: \"2022-11-08\",\n    onload() {\n      if (!Blockbench.flags.after_update) setSplashArt()\n      styles = Blockbench.addCSS(`\n        #splash_screen > i {\n          color: var(--color-light);\n          opacity: 0!important;\n          transition: opacity .15s;\n          text-shadow: 0 0 4px black;\n        }\n        #splash_screen:hover > i {\n          opacity: 1!important;\n        }\n        #splash_screen > .graphic {\n          background-position: 50% 50%;\n          max-height: initial;\n        }\n        #customise-splash-art {\n          position: absolute;\n          top: 8px;\n          left: 8px;\n          cursor: pointer;\n        }\n        dialog#${id} .dialog_wrapper {\n          position: relative;\n        }\n        dialog#${id} .flex-center {\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          gap: 8px;\n        }\n        dialog#${id} .column {\n          flex-direction: column;\n          gap: 24px;\n        }\n        dialog#${id} button {\n          text-decoration: none;\n        }\n        dialog#${id} button:active > span, dialog#${id} #input-image-label:active > span {\n          text-decoration: underline;\n        }\n        dialog#${id} #input-image {\n          display: none;\n        }\n        dialog#${id} #input-image-label {\n          background-color: var(--color-button);\n          cursor: pointer;\n          padding: 0 16px;\n          height: 32px;\n          min-width: 100px;\n        }\n        dialog#${id} #input-image-label:hover {\n          background-color: var(--color-accent);\n          color: var(--color-accent_text);\n        }\n        dialog#${id} input[type=text] {\n          width: 256px;\n        }\n        dialog#${id} #error {\n          position: absolute;\n          top: 0;\n          bottom: 0;\n          left: 0;\n          right: 0;\n        }\n        dialog#${id} #error-darken {\n          background-color: var(--color-dark);\n          opacity: 0.8;\n          position: absolute;\n          top: 0;\n          bottom: 0;\n          left: 0;\n          right: 0;\n        }\n        dialog#${id} #splash-art-previews {\n          display: flex;\n          gap: 8px;\n          flex-wrap: wrap;\n          overflow-y: auto;\n          max-height: 316px;\n          width: 100%;\n        }\n        dialog#${id} .splash-art-preview {\n          width: calc(50% - 4px);\n          aspect-ratio: 64 / 27;\n          background-position: 50% 50%;\n          background-size: cover;\n          background-color: var(--color-back);\n          background-repeat: no-repeat;\n          border: 2px solid var(--color-ui);\n          position: relative;\n          overflow: clip;\n          image-rendering: initial;\n        }\n        dialog#${id} .splash-art-preview:hover {\n          background-color: var(--color-selected);\n          border: 2px solid var(--color-accent);\n        }\n        dialog#${id} .button-bar {\n          display: none;\n          background-color: var(--color-dark);\n          opacity: 0.8;\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          right: 0;\n          height: 30px;\n          align-items: center;\n          padding: 0 5px;\n          gap: 8px;\n        }\n        dialog#${id} .splash-art-preview:hover > .button-bar {\n          display: flex;\n        }\n        dialog#${id} .button-bar > i, dialog#${id} .button-bar > div > svg {\n          cursor: pointer;\n        }\n        dialog#${id} .button-bar > div {\n          height: 24px;\n        }\n        dialog#${id} .button-bar > div > svg {\n          fill: var(--color-text);\n          width: 24px;\n        }\n        dialog#${id} .button-bar > i:hover {\n          color: var(--color-light);\n        }\n        dialog#${id} .button-bar > div > svg:hover {\n          fill: var(--color-light);\n        }\n        dialog#${id} .back {\n          cursor: pointer;\n          position: absolute;\n          top: 8px;\n          left: 8px;\n        }\n        dialog#${id} .back:hover {\n          color: var(--color-light);\n        }\n        dialog#${id} .applied {\n          position: absolute;\n          top: 0;\n          right: 4px;\n          color: var(--color-confirm);\n          text-shadow: 0 0 4px black;\n        }\n      `)\n      setTimeout(() => {\n        $(\"#splash_screen\").append(\n          E(\"i\").attr(\"id\", \"customise-splash-art\").addClass(\"material-icons icon custom-splash\").text(\"settings\").on(\"click\", async e => {\n            const transaction = db.result.transaction(\"images\", \"readonly\")\n            const get = transaction.objectStore(\"images\").getAll()\n            let images = await new Promise(fulfil => get.onsuccess = () => fulfil(get.result))\n            if (!galleryImages) galleryImages = await fetch(\"https://api.github.com/repos/JannisX11/blockbench.net/contents/assets/gallery\").then(e => e.json()).then(e => e.map(e => e.download_url)).catch(() => {})\n            dialog = new Dialog({\n              id,\n              title,\n              width: 560,\n              buttons: [],\n              component: {\n                data: {\n                  url: false,\n                  file: false,\n                  gallery: false,\n                  error: false,\n                  images,\n                  galleryImages,\n                  randomised: !localStorage.getItem(\"splash-art-randomisation-disabled\")\n                },\n                methods: {\n                  importFile() {\n                    const file = document.getElementById(\"input-image\").files[0]\n                    if (file.size > 8388608) return this.error = \"File too large. Max size is 8 MB\"\n                    const reader = new FileReader()\n                    reader.readAsDataURL(file)\n                    reader.onload = e => {\n                      if (!reader.result.startsWith(\"data:image/\")) return this.error = \"Invalid image\"\n                      addSplashArt(reader.result)\n                    }\n                    reader.onerror = e => this.error = e\n                  },\n                  async importURL() {\n                    const url = document.getElementById(\"input-url\").value\n                    if (!url) return Blockbench.showQuickMessage(\"Please enter a URL\")\n                    try {\n                      const r = await fetch(url)\n                      if (!r.headers.get(\"Content-Type\")?.startsWith(\"image/\")) return this.error = \"URL is not an image\"\n                      addSplashArt(url)\n                    } catch {\n                      return this.error = \"Unable to get URL\"\n                    }\n                  },\n                  deleteImage(image) {\n                    const transaction = db.result.transaction(\"images\", \"readwrite\")\n                    transaction.objectStore(\"images\").delete(image)\n                    images.splice(images.indexOf(images.find(e => e.image === image)), 1)\n                    setSplashArt()\n                  },\n                  addSplashArt,\n                  async setCurrentSplashArt(image) {\n                    const data = await setSplashArt(image)\n                    Blockbench.showQuickMessage(\"Applied splash art\")\n                    if (localStorage.getItem(\"splash-art-randomisation-disabled\")) {\n                      const transaction = db.result.transaction(\"images\", \"readwrite\")\n                      const store = transaction.objectStore(\"images\")\n                      const index = store.index(\"applied\")\n                      const get = index.get([\"true\"])\n                      get.onsuccess = () => {\n                        if (get.result) {\n                          delete get.result.applied\n                          store.put(get.result)\n                        }\n                        const transaction = db.result.transaction(\"images\", \"readwrite\")\n                        data.applied = \"true\"\n                        store.put(data)\n                      }\n                      this.images.forEach(e => e.applied = false)\n                      this.images.find(e => e.image === image).applied = true\n                      this.$forceUpdate()\n                    }\n                  },\n                  randomiseToggle() {\n                    if (localStorage.getItem(\"splash-art-randomisation-disabled\")) localStorage.removeItem(\"splash-art-randomisation-disabled\")\n                    else localStorage.setItem(\"splash-art-randomisation-disabled\", true)\n                  }\n                },\n                template: `\n                  <div>\n                    <div v-if=\"images.length\" class=\"flex-center column\">\n                      <div id=\"splash-art-previews\">\n                        <div v-for=\"image in images\" class=\"splash-art-preview\" :style=\"{ backgroundImage: 'url(' + image.image + ')', imageRendering: image.imageRendering ?? 'smooth', backgroundSize: image.backgroundSize ?? 'cover', backgroundRepeat: image.backgroundRepeat ?? 'no-repeat'}\">\n                          <div class=\"button-bar\">\n                            <div title=\"Apply splash art\" @click=\"setCurrentSplashArt(image.image)\">\n                              <svg viewBox=\"0 0 24 24\"><path d=\"M19,19H5V5H15V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V11H19M7.91,10.08L6.5,11.5L11,16L21,6L19.59,4.58L11,13.17L7.91,10.08Z\" /></svg>\n                            </div>\n                            <i class=\"material-icons icon\" title=\"Edit splash art\" @click=\"addSplashArt(image.image)\">edit</i>\n                            <div class=\"spacer\"></div>\n                            <i class=\"material-icons icon\" title=\"Delete splash art\" @click=\"deleteImage(image.image)\">delete</i>\n                          </div>\n                          <i v-if=\"!randomised && image.applied\" class=\"material-icons icon applied\" title=\"Currently applied splash art\">check</i>\n                        </div>\n                      </div>\n                      <div class=\"flex-center\" style=\"width:100%\">\n                        <input type=\"checkbox\" id=\"randomise-splash-art\" v-model=\"randomised\" @change=\"randomiseToggle()\">\n                        <label for=\"randomise-splash-art\">Randomise splash art</label>\n                        <div class=\"spacer\"></div>\n                        <button class=\"flex-center\" @click=\"images = []\">\n                          <i class=\"material-icons icon\">add</i>\n                          <span>Add new</span>\n                        </button>\n                      </div>\n                    </div>\n                    <div v-if=\"!images.length && !url && !file && !gallery\" class=\"flex-center column\">\n                      <h2>Choose splash art source type</h2>\n                      <div class=\"flex-center\">\n                        <button class=\"flex-center\" @click=\"url = true\">\n                          <i class=\"material-icons icon\">link</i>\n                          <span>URL (faster)</span>\n                        </button>\n                        <button class=\"flex-center\" @click=\"file = true\">\n                          <i class=\"material-icons icon\">insert_drive_file</i>\n                          <span>File (slower)</span>\n                        </button>\n                        <button v-if=\"galleryImages\" class=\"flex-center\" @click=\"gallery = true\">\n                          <i class=\"material-icons icon\">photo_library</i>\n                          <span>Blockbench Gallery</span>\n                        </button>\n                      </div>\n                    </div>\n                    <div v-if=\"url\" class=\"flex-center column\">\n                      <i class=\"material-icons icon back\" @click=\"url = false\">arrow_back</i>\n                      <h2>Enter image URL</h2>\n                      <div class=\"flex-center\">\n                        <input id=\"input-url\" type=\"text\" class=\"dark_bordered focusable_input\">\n                        <button class=\"flex-center\" v-on:click=\"importURL()\">\n                          <i class=\"material-icons icon\">download</i>\n                          <span>Import</span>\n                        </button>\n                      </div>\n                    </div>\n                    <div v-if=\"file\" class=\"flex-center column\">\n                      <i class=\"material-icons icon back\" @click=\"file = false\">arrow_back</i>\n                      <h2>Select image file</h2>\n                      <label id=\"input-image-label\" class=\"flex-center\" for=\"input-image\">\n                        <i class=\"material-icons icon\">download</i>\n                        <span>Import Image</span>\n                      </label>\n                      <input id=\"input-image\" type=\"file\" accept=\"image/*\" class=\"flex-center\" @change=\"importFile()\">\n                    </div>\n                    <div v-if=\"gallery\" class=\"flex-center column\">\n                      <i class=\"material-icons icon back\" @click=\"gallery = false\">arrow_back</i>\n                      <h2>Blockbench Gallery</h2>\n                      <div id=\"splash-art-previews\">\n                        <div v-for=\"image in galleryImages\" class=\"splash-art-preview\" :style=\"{ backgroundImage: 'url(' + image + ')'}\">\n                          <div class=\"button-bar\">\n                            <i class=\"material-icons icon\" title=\"Import splash art\" @click=\"addSplashArt(image)\">download</i>\n                          </div>\n                        </div>\n                      </div>\n                    </div>\n                    <div v-if=\"error\">\n                      <div id=\"error-darken\"></div>\n                      <div id=\"error\" class=\"flex-center column\">\n                        <h2>{{ error }}</h2>\n                        <button class=\"flex-center\" @click=\"error = false\">\n                          <span>Okay</span>\n                        </button>\n                      </div>\n                    </div>\n                  </div>\n                `\n              }\n            }).show()\n          })\n        )\n      }, 100)\n      $(\".start_screen_close_button\").addClass(\"custom-splash\")\n    },\n    onunload() {\n      styles.delete()\n      splashArtStyles?.delete()\n      $(\"#customise-splash-art\").remove()\n      customSplash.remove()\n      dialog?.close()\n      settingsDialog?.close()\n    },\n    onuninstall() {\n      const transaction = db.result.transaction(\"images\", \"readwrite\")\n      transaction.objectStore(\"images\").clear()\n      localStorage.removeItem(\"splash-art-randomisation-disabled\")\n    }\n  })\n  async function addSplashArt(image) {\n    const aspectRatios = [\n      \"4:3\",\n      \"16:9\",\n      \"16:10\",\n      \"21:9\",\n      \"64:27\"\n    ]\n    const imageRenderers = [\n      \"Auto\",\n      \"Pixelated\"\n    ]\n    const backgroundSizes = [\n      \"Auto\",\n      \"Contain\",\n      \"Cover\"\n    ]\n    const backgroundRepeats = [\n      \"Repeat\",\n      \"Repeat X\",\n      \"Repeat Y\",\n      \"No Repeat\",\n      \"Space\",\n      \"Round\"\n    ]\n    dialog?.close()\n    settingsDialog = new Dialog({\n      id: \"splash_art_settings\",\n      title: \"Splash art settings\",\n      lines: [`\n        <style>\n          dialog#splash_art_settings #splash-art-settings-preview {\n            height: 200px;\n            background-position: 50% 50%;\n            margin: auto;\n            background-color: var(--color-back);\n          }\n        </style>\n        <div id=\"splash-art-settings-preview\" style=\"background-image:url(${image})\"></div>\n        <br>\n      `],\n      form: {\n        aspectRatio: {\n          label: \"Aspect Ratio\",\n          type: \"select\",\n          options: Object.fromEntries(aspectRatios.map((e, i) => [i, e])),\n          value: 4\n        },\n        imageRendering: {\n          label: \"Image Rendering\",\n          type: \"select\",\n          options: Object.fromEntries(imageRenderers.map((e, i) => [i, e]))\n        },\n        backgroundSize: {\n          label: \"Background Size\",\n          type: \"select\",\n          options: Object.fromEntries(backgroundSizes.map((e, i) => [i, e])),\n          value: 2\n        },\n        backgroundRepeat: {\n          label: \"Background Repeat\",\n          type: \"select\",\n          options: Object.fromEntries(backgroundRepeats.map((e, i) => [i, e])),\n          value: 3\n        }\n      },\n      onConfirm(data) {\n        const transaction = db.result.transaction(\"images\", \"readwrite\")\n        transaction.objectStore(\"images\").put({\n          image,\n          aspectRatio: aspectRatios[data.aspectRatio].replace(\":\", \" / \"),\n          imageRendering: imageRenderers[data.imageRendering].toLowerCase(),\n          backgroundSize: backgroundSizes[data.backgroundSize].toLowerCase(),\n          backgroundRepeat: backgroundRepeats[data.backgroundRepeat].toLowerCase().replace(\" \", \"-\")\n        })\n        setSplashArt(image)\n        observer.disconnect()\n      }\n    }).show()\n    const preview = $(\"dialog#splash_art_settings #splash-art-settings-preview\")\n    const updatePreview = () => preview.css({\n      aspectRatio: aspectRatios[parseInt(settingsDialog.form.form_data.aspectRatio.bar.querySelector(\".bb-select\").getAttribute(\"value\"))].replace(\":\", \" / \"),\n      imageRendering: imageRenderers[parseInt(settingsDialog.form.form_data.imageRendering.bar.querySelector(\".bb-select\").getAttribute(\"value\"))].toLowerCase(),\n      backgroundSize: backgroundSizes[parseInt(settingsDialog.form.form_data.backgroundSize.bar.querySelector(\".bb-select\").getAttribute(\"value\"))].toLowerCase(),\n      backgroundRepeat: backgroundRepeats[parseInt(settingsDialog.form.form_data.backgroundRepeat.bar.querySelector(\".bb-select\").getAttribute(\"value\"))].toLowerCase().replace(\" \", \"-\")\n    })\n    updatePreview()\n    const observer = new MutationObserver(updatePreview)\n    document.querySelectorAll(\"dialog#splash_art_settings .bb-select\").forEach(e => observer.observe(e, { attributes: true }))\n  }\n  async function setSplashArt(image) {\n    splashArtStyles?.delete()\n    const transaction = db.result.transaction(\"images\", \"readonly\")\n    const store = transaction.objectStore(\"images\")\n    if (image) {\n      const get = store.get(image)\n      await new Promise(fulfil => get.onsuccess = () => {\n        image = get.result\n        fulfil()\n      })\n    }\n    if (!image && localStorage.getItem(\"splash-art-randomisation-disabled\")) {\n      const index = store.index(\"applied\")\n      const get = index.get([\"true\"])\n      await new Promise(fulfil => get.onsuccess = () => {\n        image = get.result\n        fulfil()\n      })\n      if (!image) {\n        const get = store.getAll()\n        await new Promise(fulfil => get.onsuccess = () => {\n          image = get.result?.[0]\n          fulfil()\n        })\n      }\n    }\n    if (!image) {\n      const get = store.getAll()\n      await new Promise(fulfil => get.onsuccess = () => {\n        if (get.result.length) image = get.result[Math.floor(Math.random() * get.result.length)]\n        fulfil()\n      })\n    }\n    if (image) setBackgroundImage(image)\n    return image\n  }\n  function setBackgroundImage(data) {\n    if (!customSplash) customSplash = E(\"div\").attr(\"id\", \"custom-spash-art\").addClass(\"custom-splash\").appendTo(\"#splash_screen\")\n    splashArtStyles = Blockbench.addCSS(`\n      #splash_screen {\n        aspect-ratio: ${data.aspectRatio ?? \"64 / 27\"}!important;\n      }\n\n      #custom-spash-art {\n        background-image: url(\"${data.image}\")!important;\n        aspect-ratio: ${data.aspectRatio ?? \"64 / 27\"}!important;\n        image-rendering: ${data.imageRendering ?? \"initial\"}!important;\n        background-size: ${data.backgroundSize ?? \"cover\"}!important;\n        background-repeat: ${data.backgroundRepeat ?? \"no-repeat\"}!important;\n        background-position: 50% 50%;\n      }\n\n      #splash_screen > *:not(.custom-splash) {\n        display: none;\n      }\n    `)\n  }\n})()"
  },
  {
    "path": "plugins/startup_tips.js",
    "content": "(function() {\r\n  // Register plugin\r\n  Plugin.register('startup_tips', {\r\n    title: 'Startup Tips',\r\n    author: 'TheOtterlord',\r\n    icon: 'info',\r\n    description: 'This plugin provides helpful tips for those unfamiliar with Blockbench',\r\n    about: 'The Startup Tips plugin provides helpful tips about Blockbench on startup. These tips include tips about model creation, external resources, the editor, and more',\r\n    version: '1.1.0',\r\n    variant: 'both',\r\n    onload() {\r\n      // define tips\r\n      var tips = [\r\n        // Editor Tips\r\n        \"Want a fresh new look for blockbench? Edit the color scheme in settings\",\r\n        \"Press Ctrl+S to quickly save your work. Saving often is important\",\r\n        \"Immerse yourself in Blockbench with fullscreen (f11)\",\r\n        \"Did something wrong? Undo your changes quickly with Ctrl+Z\",\r\n        \"Undid something you wanted to keep? Redo your changes quickly with Ctrl+Y\",\r\n        \"Take a screenshot of your model with Ctrl+P and share with your friends\",\r\n        \"You can convert your model to another format using the convert button in the file dropdown\",\r\n        \"Use the Edit Session feature to create models with your friends\",\r\n        \"Blockbench supports multiple languages\",\r\n        \"Set a custom background with Right Click > Background > Load\",\r\n        \"Save your angle with Right Click > Save Angle\",\r\n        \"Click the eyes in the right sidebar to hide elements\",\r\n        \"You can also load these tips from the help menu\",\r\n        \"You can adjust the screen size using the buttons in the view menu\",\r\n        \"You can search for an action using the button in the help menu\",\r\n        \"Blockbench saves your recent models for quick access when you return\",\r\n        // Model Creation Tips\r\n        \"Animations add a lot to an entity, make sure you include animations in yours too\",\r\n        \"If 2 cubes with different textures are overlapping on a certain axis, you can inflate one of them to fix it\",\r\n        \"Pivot points define where the bones are rotated\",\r\n        \"Little things, like blinking animations and moving mouths can make your entity look so much better\",\r\n        \"Models with a lot of tiny parts can perform badly on low end devices. Find the right balance between performance and detail\",\r\n        // External Resource Tips\r\n        \"Don't know which model to use? Visit https://blockbench.net/quickstart to find the format you need\",\r\n        \"Blockbench for particles? Try JannisX11's Snowstorm Particle Generator: https://jannisx11.github.io/snowstorm/\",\r\n        \"Looking for inspiration? https://mcpedl.com is a hub of Minecraft creativity\",\r\n        \"Report any issues to https://github.com/JannisX11/blockbench/issues\",\r\n        \"Got a tip? Tag @TheOtterlord in an issue at https://github.com/JannisX11/blockbench-plugins/issues\",\r\n        \"Want to make your own plugin? Visit https://jannisx11.github.io/blockbench-docs to get started\",\r\n        // Misc\r\n        \"Backup your models to keep them safe\"\r\n      ];\r\n      // add extra tips based on platform\r\n      if (Blockbench.isWeb) {\r\n        tips.push(\"If you are on Windows, Linux or MacOS, you can install the desktop application found at https://blockbench.net/downloads\");\r\n      }\r\n      if (Blockbench.isMobile) {\r\n        tips.push(\"It is recommended that you use Blockbench on a desktop\");\r\n      }\r\n      function showTip() {\r\n        // show a tip in a message box\r\n        Blockbench.showMessageBox({\r\n          \"buttons\": [\"Cancel\", \"Next\"],\r\n          \"confirm\": 1,\r\n          \"cancel\": 0,\r\n          \"title\": \"Startup Tip\",\r\n          // pick random tip\r\n          \"message\": tips[Math.floor(Math.random()*tips.length)],\r\n          \"icon\": \"icon-blockbench\"\r\n        }, function(result) {\r\n          // if next is clicked\r\n          if (result == 1) {\r\n            // show another tip\r\n            showTip();\r\n          }\r\n        });\r\n      }\r\n      // add a button to show the tips\r\n      button = new Action('show_tips', {\r\n        name: 'Show Tips',\r\n        description: 'Show some helpful tips to consider when using Blockbench',\r\n        icon: 'info',\r\n        click: function() {\r\n          showTip();\r\n        }\r\n      });\r\n      MenuBar.addAction(button, 'help.-1');\r\n      // show a tip on load\r\n      showTip();\r\n    },\r\n    onunload() {\r\n      // remove button when plugin is unloaded\r\n      button.delete();\r\n    }\r\n  });\r\n})();\r\n"
  },
  {
    "path": "plugins/structure_importer.js",
    "content": "var nbt = new function() {\n\n\t'use strict';\n\n\tif (typeof ArrayBuffer === 'undefined') {\n\t\tthrow new Error('Missing required type ArrayBuffer');\n\t}\n\tif (typeof DataView === 'undefined') {\n\t\tthrow new Error('Missing required type DataView');\n\t}\n\tif (typeof Uint8Array === 'undefined') {\n\t\tthrow new Error('Missing required type Uint8Array');\n\t}\n\n\t/** @exports nbt */\n\n\tvar nbt = this;\n\t//var zlib = typeof require !== 'undefined' ? require('zlib') : window.zlib;\n\n\t/**\n\t * A mapping from type names to NBT type numbers.\n\t * {@link module:nbt.Writer} and {@link module:nbt.Reader}\n\t * have correspoding methods (e.g. {@link module:nbt.Writer#int})\n\t * for every type.\n\t *\n\t * @type Object<string, number>\n\t * @see module:nbt.tagTypeNames */\n\tnbt.tagTypes = {\n\t\t'end': 0,\n\t\t'byte': 1,\n\t\t'short': 2,\n\t\t'int': 3,\n\t\t'long': 4,\n\t\t'float': 5,\n\t\t'double': 6,\n\t\t'byteArray': 7,\n\t\t'string': 8,\n\t\t'list': 9,\n\t\t'compound': 10,\n\t\t'intArray': 11\n\t};\n\n\t/**\n\t * A mapping from NBT type numbers to type names.\n\t *\n\t * @type Object<number, string>\n\t * @see module:nbt.tagTypes */\n\tnbt.tagTypeNames = {};\n\t(function() {\n\t\tfor (var typeName in nbt.tagTypes) {\n\t\t\tif (nbt.tagTypes.hasOwnProperty(typeName)) {\n\t\t\t\tnbt.tagTypeNames[nbt.tagTypes[typeName]] = typeName;\n\t\t\t}\n\t\t}\n\t})();\n\n\tfunction hasGzipHeader(data) {\n\t\tvar head = new Uint8Array(data.slice(0, 2));\n\t\treturn head.length === 2 && head[0] === 0x1f && head[1] === 0x8b;\n\t}\n\n\tfunction encodeUTF8(str) {\n\t\tvar array = [], i, c;\n\t\tfor (i = 0; i < str.length; i++) {\n\t\t\tc = str.charCodeAt(i);\n\t\t\tif (c < 0x80) {\n\t\t\t\tarray.push(c);\n\t\t\t} else if (c < 0x800) {\n\t\t\t\tarray.push(0xC0 | c >> 6);\n\t\t\t\tarray.push(0x80 | c         & 0x3F);\n\t\t\t} else if (c < 0x10000) {\n\t\t\t\tarray.push(0xE0 |  c >> 12);\n\t\t\t\tarray.push(0x80 | (c >>  6) & 0x3F);\n\t\t\t\tarray.push(0x80 |  c        & 0x3F);\n\t\t\t} else {\n\t\t\t\tarray.push(0xF0 | (c >> 18) & 0x07);\n\t\t\t\tarray.push(0x80 | (c >> 12) & 0x3F);\n\t\t\t\tarray.push(0x80 | (c >>  6) & 0x3F);\n\t\t\t\tarray.push(0x80 |  c        & 0x3F);\n\t\t\t}\n\t\t}\n\t\treturn array;\n\t}\n\n\tfunction decodeUTF8(array) {\n\t\tvar codepoints = [], i;\n\t\tfor (i = 0; i < array.length; i++) {\n\t\t\tif ((array[i] & 0x80) === 0) {\n\t\t\t\tcodepoints.push(array[i] & 0x7F);\n\t\t\t} else if (i+1 < array.length &&\n\t\t\t\t\t\t(array[i]   & 0xE0) === 0xC0 &&\n\t\t\t\t\t\t(array[i+1] & 0xC0) === 0x80) {\n\t\t\t\tcodepoints.push(\n\t\t\t\t\t((array[i]   & 0x1F) << 6) |\n\t\t\t\t\t( array[i+1] & 0x3F));\n\t\t\t} else if (i+2 < array.length &&\n\t\t\t\t\t\t(array[i]   & 0xF0) === 0xE0 &&\n\t\t\t\t\t\t(array[i+1] & 0xC0) === 0x80 &&\n\t\t\t\t\t\t(array[i+2] & 0xC0) === 0x80) {\n\t\t\t\tcodepoints.push(\n\t\t\t\t\t((array[i]   & 0x0F) << 12) |\n\t\t\t\t\t((array[i+1] & 0x3F) <<  6) |\n\t\t\t\t\t( array[i+2] & 0x3F));\n\t\t\t} else if (i+3 < array.length &&\n\t\t\t\t\t\t(array[i]   & 0xF8) === 0xF0 &&\n\t\t\t\t\t\t(array[i+1] & 0xC0) === 0x80 &&\n\t\t\t\t\t\t(array[i+2] & 0xC0) === 0x80 &&\n\t\t\t\t\t\t(array[i+3] & 0xC0) === 0x80) {\n\t\t\t\tcodepoints.push(\n\t\t\t\t\t((array[i]   & 0x07) << 18) |\n\t\t\t\t\t((array[i+1] & 0x3F) << 12) |\n\t\t\t\t\t((array[i+2] & 0x3F) <<  6) |\n\t\t\t\t\t( array[i+3] & 0x3F));\n\t\t\t}\n\t\t}\n\t\treturn String.fromCharCode.apply(null, codepoints);\n\t}\n\n\t/* Not all environments, in particular PhantomJS, supply\n\t   Uint8Array.slice() */\n\tfunction sliceUint8Array(array, begin, end) {\n\t\tif ('slice' in array) {\n\t\t\treturn array.slice(begin, end);\n\t\t} else {\n\t\t\treturn new Uint8Array([].slice.call(array, begin, end));\n\t\t}\n\t}\n\n\t/**\n\t * In addition to the named writing methods documented below,\n\t * the same methods are indexed by the NBT type number as well,\n\t * as shown in the example below.\n\t *\n\t * @constructor\n\t * @see module:nbt.Reader\n\t *\n\t * @example\n\t * var writer = new nbt.Writer();\n\t *\n\t * // all equivalent\n\t * writer.int(42);\n\t * writer[3](42);\n\t * writer(nbt.tagTypes.int)(42);\n\t *\n\t * // overwrite the second int\n\t * writer.offset = 0;\n\t * writer.int(999);\n\t *\n\t * return writer.buffer; */\n\tnbt.Writer = function() {\n\t\tvar self = this;\n\n\t\t/* Will be resized (x2) on write if necessary. */\n\t\tvar buffer = new ArrayBuffer(1024);\n\n\t\t/* These are recreated when the buffer is */\n\t\tvar dataView = new DataView(buffer);\n\t\tvar arrayView = new Uint8Array(buffer);\n\n\t\t/**\n\t\t * The location in the buffer where bytes are written or read.\n\t\t * This increases after every write, but can be freely changed.\n\t\t * The buffer will be resized when necessary.\n\t\t *\n\t\t * @type number */\n\t\tthis.offset = 0;\n\n\t\t// Ensures that the buffer is large enough to write `size` bytes\n\t\t// at the current `self.offset`.\n\t\tfunction accommodate(size) {\n\t\t\tvar requiredLength = self.offset + size;\n\t\t\tif (buffer.byteLength >= requiredLength) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar newLength = buffer.byteLength;\n\t\t\twhile (newLength < requiredLength) {\n\t\t\t\tnewLength *= 2;\n\t\t\t}\n\n\t\t\tvar newBuffer = new ArrayBuffer(newLength);\n\t\t\tvar newArrayView = new Uint8Array(newBuffer);\n\t\t\tnewArrayView.set(arrayView);\n\n\t\t\t// If there's a gap between the end of the old buffer\n\t\t\t// and the start of the new one, we need to zero it out\n\t\t\tif (self.offset > buffer.byteLength) {\n\t\t\t\tnewArrayView.fill(0, buffer.byteLength, self.offset);\n\t\t\t}\n\n\t\t\tbuffer = newBuffer;\n\t\t\tdataView = new DataView(newBuffer);\n\t\t\tarrayView = new Uint8Array(newBuffer);\n\t\t}\n\n\t\tfunction write(dataType, size, value) {\n\t\t\taccommodate(size);\n\t\t\tdataView['set' + dataType](self.offset, value);\n\t\t\tself.offset += size;\n\t\t\treturn self;\n\t\t}\n\n\t\t/**\n\t\t * Returns the writen data as a slice from the internal buffer,\n\t\t * cutting off any padding at the end.\n\t\t *\n\t\t * @returns {ArrayBuffer} a [0, offset] slice of the interal buffer */\n\t\tthis.getData = function() {\n\t\t\taccommodate(0);  /* make sure the offset is inside the buffer */\n\t\t\treturn buffer.slice(0, self.offset);\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#byte\n\t\t * @param {number} value - a signed byte\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.byte] = write.bind(this, 'Int8', 1);\n\n\t\t/**\n\t\t * @method module:nbt.Writer#ubyte\n\t\t * @param {number} value - an unsigned byte\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis.ubyte = write.bind(this, 'Uint8', 1);\n\n\t\t/**\n\t\t * @method module:nbt.Writer#short\n\t\t * @param {number} value - a signed 16-bit integer\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.short] = write.bind(this, 'Int16', 2);\n\n\t\t/**\n\t\t * @method module:nbt.Writer#int\n\t\t * @param {number} value - a signed 32-bit integer\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.int] = write.bind(this, 'Int32', 4);\n\n\t\t/**\n\t\t * @method module:nbt.Writer#float\n\t\t * @param {number} value - a signed 32-bit float\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.float] = write.bind(this, 'Float32', 4);\n\n\t\t/**\n\t\t * @method module:nbt.Writer#float\n\t\t * @param {number} value - a signed 64-bit float\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.double] = write.bind(this, 'Float64', 8);\n\n\t\t/**\n\t\t * As JavaScript does not support 64-bit integers natively, this\n\t\t * method takes an array of two 32-bit integers that make up the\n\t\t * upper and lower halves of the long.\n\t\t *\n\t\t * @method module:nbt.Writer#long\n\t\t * @param {Array.<number>} value - [upper, lower]\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.long] = function(value) {\n\t\t\tself.int(value[0]);\n\t\t\tself.int(value[1]);\n\t\t\treturn self;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#byteArray\n\t\t * @param {Array.<number>|Uint8Array|Buffer} value\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.byteArray] = function(value) {\n\t\t\tthis.int(value.length);\n\t\t\taccommodate(value.length);\n\t\t\tarrayView.set(value, this.offset);\n\t\t\tthis.offset += value.length;\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#intArray\n\t\t * @param {Array.<number>} value\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.intArray] = function(value) {\n\t\t\tthis.int(value.length);\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < value.length; i++) {\n\t\t\t\tthis.int(value[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#string\n\t\t * @param {string} value\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.string] = function(value) {\n\t\t\tvar bytes = encodeUTF8(value);\n\t\t\tthis.short(bytes.length);\n\t\t\taccommodate(bytes.length);\n\t\t\tarrayView.set(bytes, this.offset);\n\t\t\tthis.offset += bytes.length;\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#list\n\t\t * @param {Object} value\n\t\t * @param {number} value.type - the NBT type number\n\t\t * @param {Array} value.value - an array of values\n\t\t * @returns {module:nbt.Writer} itself */\n\t\tthis[nbt.tagTypes.list] = function(value) {\n\t\t\tthis.byte(nbt.tagTypes[value.type]);\n\t\t\tthis.int(value.value.length);\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < value.value.length; i++) {\n\t\t\t\tthis[value.type](value.value[i]);\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Writer#compound\n\t\t * @param {Object} value - a key/value map\n\t\t * @param {Object} value.KEY\n\t\t * @param {string} value.KEY.type - the NBT type number\n\t\t * @param {Object} value.KEY.value - a value matching the type\n\t\t * @returns {module:nbt.Writer} itself\n\t\t *\n\t\t * @example\n\t\t * writer.compound({\n\t\t * foo: { type: 'int', value: 12 },\n\t\t * bar: { type: 'string', value: 'Hello, World!' }\n\t\t * }); */\n\t\tthis[nbt.tagTypes.compound] = function(value) {\n\t\t\tvar self = this;\n\t\t\tObject.keys(value).map(function (key) {\n\t\t\t\tself.byte(nbt.tagTypes[value[key].type]);\n\t\t\t\tself.string(key);\n\t\t\t\tself[value[key].type](value[key].value);\n\t\t\t});\n\t\t\tthis.byte(nbt.tagTypes.end);\n\t\t\treturn self;\n\t\t};\n\n\t\tvar typeName;\n\t\tfor (typeName in nbt.tagTypes) {\n\t\t\tif (nbt.tagTypes.hasOwnProperty(typeName)) {\n\t\t\t\tthis[typeName] = this[nbt.tagTypes[typeName]];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * In addition to the named writing methods documented below,\n\t * the same methods are indexed by the NBT type number as well,\n\t * as shown in the example below.\n\t *\n\t * @constructor\n\t * @see module:nbt.Writer\n\t *\n\t * @example\n\t * var reader = new nbt.Reader(buf);\n\t * int x = reader.int();\n\t * int y = reader[3]();\n\t * int z = reader[nbt.tagTypes.int](); */\n\tnbt.Reader = function(buffer) {\n\t\tif (!buffer) { throw new Error('Argument \"buffer\" is falsy'); }\n\n\t\tvar self = this;\n\n\t\t/**\n\t\t * The current location in the buffer. Can be freely changed\n\t\t * within the bounds of the buffer.\n\t\t *\n\t\t * @type number */\n\t\tthis.offset = 0;\n\n\t\tvar arrayView = new Uint8Array(buffer);\n\t\tvar dataView = new DataView(arrayView.buffer);\n\n\t\tfunction read(dataType, size) {\n\t\t\tvar val = dataView['get' + dataType](self.offset);\n\t\t\tself.offset += size;\n\t\t\treturn val;\n\t\t}\n\n\t\t/**\n\t\t * @method module:nbt.Reader#byte\n\t\t * @returns {number} the read byte */\n\t\tthis[nbt.tagTypes.byte] = read.bind(this, 'Int8', 1);\n\n\t\t/**\n\t\t * @method module:nbt.Reader#byte\n\t\t * @returns {number} the read unsigned byte */\n\t\tthis.ubyte = read.bind(this, 'Uint8', 1);\n\n\t\t/**\n\t\t * @method module:nbt.Reader#short\n\t\t * @returns {number} the read signed 16-bit short  */\n\t\tthis[nbt.tagTypes.short] = read.bind(this, 'Int16', 2);\n\n\t\t/**\n\t\t * @method module:nbt.Reader#int\n\t\t * @returns {number} the read signed 32-bit integer */\n\t\tthis[nbt.tagTypes.int] = read.bind(this, 'Int32', 4);\n\n\t\t/**\n\t\t * @method module:nbt.Reader#float\n\t\t * @returns {number} the read signed 32-bit float */\n\t\tthis[nbt.tagTypes.float] = read.bind(this, 'Float32', 4);\n\n\t\t/**\n\t\t * @method module:nbt.Reader#double\n\t\t * @returns {number} the read signed 64-bit float */\n\t\tthis[nbt.tagTypes.double] = read.bind(this, 'Float64', 8);\n\n\t\t/**\n\t\t * As JavaScript does not not natively support 64-bit\n\t\t * integers, the value is returned as an array of two\n\t\t * 32-bit integers, the upper and the lower.\n\t\t *\n\t\t * @method module:nbt.Reader#long\n\t\t * @returns {Array.<number>} [upper, lower] */\n\t\tthis[nbt.tagTypes.long] = function() {\n\t\t\treturn [this.int(), this.int()];\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Reader#byteArray\n\t\t * @returns {Array.<number>} the read array */\n\t\tthis[nbt.tagTypes.byteArray] = function() {\n\t\t\tvar length = this.int();\n\t\t\tvar bytes = [];\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\tbytes.push(this.byte());\n\t\t\t}\n\t\t\treturn bytes;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Reader#intArray\n\t\t * @returns {Array.<number>} the read array of 32-bit ints */\n\t\tthis[nbt.tagTypes.intArray] = function() {\n\t\t\tvar length = this.int();\n\t\t\tvar ints = [];\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\tints.push(this.int());\n\t\t\t}\n\t\t\treturn ints;\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Reader#string\n\t\t * @returns {string} the read string */\n\t\tthis[nbt.tagTypes.string] = function() {\n\t\t\tvar length = this.short();\n\t\t\tvar slice = sliceUint8Array(arrayView, this.offset,\n\t\t\t\tthis.offset + length);\n\t\t\tthis.offset += length;\n\t\t\treturn decodeUTF8(slice);\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Reader#list\n\t\t * @returns {{type: string, value: Array}}\n\t\t *\n\t\t * @example\n\t\t * reader.list();\n\t\t * // -> { type: 'string', values: ['foo', 'bar'] } */\n\t\tthis[nbt.tagTypes.list] = function() {\n\t\t\tvar type = this.byte();\n\t\t\tvar length = this.int();\n\t\t\tvar values = [];\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\tvalues.push(this[type]());\n\t\t\t}\n\t\t\treturn { type: nbt.tagTypeNames[type], value: values };\n\t\t};\n\n\t\t/**\n\t\t * @method module:nbt.Reader#compound\n\t\t * @returns {Object.<string, { type: string, value }>}\n\t\t *\n\t\t * @example\n\t\t * reader.compound();\n\t\t * // -> { foo: { type: int, value: 42 },\n\t\t * //      bar: { type: string, value: 'Hi!' }} */\n\t\tthis[nbt.tagTypes.compound] = function() {\n\t\t\tvar values = {};\n\t\t\twhile (true) {\n\t\t\t\tvar type = this.byte();\n\t\t\t\tif (type === nbt.tagTypes.end) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tvar name = this.string();\n\t\t\t\tvar value = this[type]();\n\t\t\t\tvalues[name] = { type: nbt.tagTypeNames[type], value: value };\n\t\t\t}\n\t\t\treturn values;\n\t\t};\n\n\t\tvar typeName;\n\t\tfor (typeName in nbt.tagTypes) {\n\t\t\tif (nbt.tagTypes.hasOwnProperty(typeName)) {\n\t\t\t\tthis[typeName] = this[nbt.tagTypes[typeName]];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @param {Object} value - a named compound\n\t * @param {string} value.name - the top-level name\n\t * @param {Object} value.value - a compound\n\t * @returns {ArrayBuffer}\n\t *\n\t * @see module:nbt.parseUncompressed\n\t * @see module:nbt.Writer#compound\n\t *\n\t * @example\n\t * nbt.writeUncompressed({\n\t * name: 'My Level',\n\t * value: {\n\t * foo: { type: int, value: 12 },\n\t * bar: { type: string, value: 'Hi!' }\n\t * }\n\t * }); */\n\tnbt.writeUncompressed = function(value) {\n\t\tif (!value) { throw new Error('Argument \"value\" is falsy'); }\n\n\t\tvar writer = new nbt.Writer();\n\n\t\twriter.byte(nbt.tagTypes.compound);\n\t\twriter.string(value.name);\n\t\twriter.compound(value.value);\n\n\t\treturn writer.getData();\n\t};\n\n\t/**\n\t * @param {ArrayBuffer|Buffer} data - an uncompressed NBT archive\n\t * @returns {{name: string, value: Object.<string, Object>}}\n\t * a named compound\n\t *\n\t * @see module:nbt.parse\n\t * @see module:nbt.writeUncompressed\n\t *\n\t * @example\n\t * nbt.readUncompressed(buf);\n\t * // -> { name: 'My Level',\n\t * //      value: { foo: { type: int, value: 42 },\n\t * //               bar: { type: string, value: 'Hi!' }}} */\n\tnbt.parseUncompressed = function(data) {\n\t\tif (!data) { throw new Error('Argument \"data\" is falsy'); }\n\n\t\tvar reader = new nbt.Reader(data);\n\n\t\tvar type = reader.byte();\n\t\tif (type !== nbt.tagTypes.compound) {\n\t\t\tthrow new Error('Top tag should be a compound');\n\t\t}\n\n\t\treturn {\n\t\t\tname: reader.string(),\n\t\t\tvalue: reader.compound()\n\t\t};\n\t};\n\n\t/**\n\t * @callback parseCallback\n\t * @param {Object} error\n\t * @param {Object} result - a named compound\n\t * @param {string} result.name - the top-level name\n\t * @param {Object} result.value - the top-level compound */\n\n\t/**\n\t * This accepts both gzipped and uncompressd NBT archives.\n\t * If the archive is uncompressed, the callback will be\n\t * called directly from this method. For gzipped files, the\n\t * callback is async.\n\t *\n\t * For use in the browser, window.zlib must be defined to decode\n\t * compressed archives. It will be passed a Buffer if the type is\n\t * available, or an Uint8Array otherwise.\n\t *\n\t * @param {ArrayBuffer|Buffer} data - gzipped or uncompressed data\n\t * @param {parseCallback} callback\n\t *\n\t * @see module:nbt.parseUncompressed\n\t * @see module:nbt.Reader#compound\n\t *\n\t * @example\n\t * nbt.parse(buf, function(error, results) {\n\t * if (error) {\n\t * throw error;\n\t * }\n\t * console.log(result.name);\n\t * console.log(result.value.foo);\n\t * }); */\n\tnbt.parse = function(data, callback) {\n\t\tif (!data) { throw new Error('Argument \"data\" is falsy'); }\n\n\t\tvar self = this;\n\n\t\tif (!hasGzipHeader(data)) {\n\t\t\tcallback(null, self.parseUncompressed(data));\n\t\t} else if (!zlib) {\n\t\t\tconsole.log(zlib)\n\t\t\tcallback(new Error('NBT archive is compressed but zlib is not ' +\n\t\t\t\t'available'), null);\n\t\t} else {\n\t\t\t/* zlib.gunzip take a Buffer, at least in Node, so try to convert\n\t\t\t   if possible. */\n\t\t\tvar buffer;\n\t\t\tif (data.length) {\n\t\t\t\tbuffer = data;\n\t\t\t} else if (typeof Buffer !== 'undefined') {\n\t\t\t\tbuffer = new Buffer(data);\n\t\t\t} else {\n\t\t\t\t/* In the browser? Unknown zlib library. Let's settle for\n\t\t\t\t   Uint8Array and see what happens. */\n\t\t\t\tbuffer = new Uint8Array(data);\n\t\t\t}\n\n\t\t\tzlib.gunzip(buffer, function(error, uncompressed) {\n\t\t\t\tif (error) {\n\t\t\t\t\tcallback(error, null);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(null, self.parseUncompressed(uncompressed));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\nBlockbench.nbt_lib = nbt\n\nlet fs;\nfunction getFS() {\n\tif (fs) return fs;\n\tfs = require('fs');\n\treturn fs;\n}\n\nlet zlib;\n// 🛠️ FIX 2: Explicitly define Node.js modules for desktop environment \n// (Blockbench 5.0 often stops making these global)\nif (!Blockbench.isWeb) {\n\tzlib = require('zlib');\n} else {\n\t$.getScript('https://rawgit.com/nodeca/pako/master/dist/pako.js', function() {\n\t\twindow.zlib = pako\n\t})\n}\n\nvar structure_importer_resourepackCount = 0\n\nfunction structure_importer_selectResourcePath(button) {\n\tbuttonNumber = button.id.split(\"-\")[1]\n\n\tlet path = Blockbench.pickDirectory({\n\t\ttitle: 'Select the \"assets\" folder of a resource pack',\n\t\tresource_id: 'mc_structure'\n\t})\n\tdocument.getElementById(\"structure_importer_path_input-\" + String(buttonNumber)).value = path;\n}\n\nfunction structure_importer_addResourcePack() {\n\tstructure_importer_resourepackCount += 1\n\tvar node = document.createElement(\"P\")\n\tnode.id = \"structure_importer_path-\" + String(structure_importer_resourepackCount)\n\tvar input = document.createElement(\"INPUT\")\n\tinput.type = \"text\"\n\tinput.value = \"Enter path to assets folder here\"\n\tinput.id = \"structure_importer_path_input-\" + String(structure_importer_resourepackCount)\n\tvar button = document.createElement(\"BUTTON\")\n\tbutton.innerHTML = \"Browse\"\n\tbutton.id = \"structure_importer_path_button-\" + String(structure_importer_resourepackCount)\n\tbutton.onclick = function() {\n\t\tstructure_importer_selectResourcePath(this)\n\t}\n\tvar removeButton = document.createElement(\"BUTTON\")\n\tremoveButton.innerHTML = \"Remove\"\n\tremoveButton.id = \"structure_importer_path_remove-\" + String(structure_importer_resourepackCount)\n\tremoveButton.onclick = function() {\n\t\tbuttonNumber = this.id.split(\"-\")[1]\n\t\tvar buttonToRemove = document.getElementById(\"structure_importer_path-\" + String(buttonNumber))\n\t\tbuttonToRemove.parentNode.removeChild(buttonToRemove)\n\t}\n\tnode.appendChild(document.createTextNode(\"Resource Pack: \"))\n\tnode.appendChild(input)\n\tnode.appendChild(button)\n\tnode.appendChild(removeButton)\n\tvar addButton = document.getElementById(\"structure_importer_add\")\n\taddButton.parentNode.insertBefore(node, addButton)\n}\n\n// ❌ Removed: function structure_importer_updateSize (Still commented out from previous fix)\n/*\nfunction structure_importer_updateSize() {\n\tvar filePath = document.getElementById(\"file\").files[0].path\n\tvar data = zlib.gunzipSync(fs.readFileSync(filePath))\n\tnbt.parse(data, function (a, b) {\n\t\tvar sizeNBT = b.value.size.value.value\n\t\tvar size = document.getElementById(\"structure_importer_size\")\n\t\tsize.innerHTML = \"Size: \" + String(sizeNBT[0]) + \"x\" + String(sizeNBT[1]) + \"x\" + String(sizeNBT[2])\n\t\tvar scale = document.getElementById(\"scale\")\n\t\tscale.value = 2**Math.ceil(Math.log2(Math.max(sizeNBT[0], sizeNBT[1], sizeNBT[2])))\n\t})\n}\n*/\n\nfunction structure_importer_run(ev) {\n\tfunction importStructureFile(cb) {\n\t\tif (Blockbench.isWeb) {\n\t\t\tfileLoaderLoad('.nbt', false, function() {\n\t\t\t\thideDialog()\n\t\t\t\tvar file = $('#file_upload').get(0).files[0]\n\t\t\t\tvar reader = new FileReader()\n\t\t\t\treader.onload = function() {\n\t\t\t\t\tvar data = zlib.ungzip(this.result)\n\n\t\t\t\t\tnbt.parse(data, function(error, data) {\n\t\t\t\t\t\tif (error) throw error\n\t\t\t\t\t\tlegacyStructureImporter(data)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (file) {\n\t\t\t\t\treader.readAsArrayBuffer(file)\n\t\t\t\t}\n\t\t\t})\n\t\t\t$('#file_folder').val('')\n\t\t} else {\n\t\t\tstructure_importer_resourepackCount = 0\n\t\t\tvar dialog = new Dialog({title:'Import Structure', id:'structure_importer_options', lines:[\n\t\t\t\t'<p>Scale: <input type=\"number\" id=\"scale\" value=16></p>',\n\t\t\t\t'<p>Use legacy structure importer: <input type=\"checkbox\" id=\"structure_importer_legacy\"></p>',\n\t\t\t\t'<p>Save assets as default: <input type=\"checkbox\" id=\"structure_importer_save_assets\"></p>',\n\t\t\t\t'<p>Vanilla assets: <input type=\"text\" value=\"Enter path to assets folder here\" id=\"structure_importer_path_input-0\"><button id=\"structure_importer_path_button-0\" onclick=\"structure_importer_selectResourcePath(this)\">Browse</button></p>',\n\t\t\t\t'<button onclick=\"structure_importer_addResourcePack()\" id=\"structure_importer_add\">Add resourcepack'\n\t\t\t\t],\n\t\t\t\t\"onOpen\": function () {\n\t\t\t\t\tpathSetting = Settings.get(\"structure_importer_default_assets\")\n\t\t\t\t\tif (pathSetting) {\n\t\t\t\t\t\tvar paths = JSON.parse(pathSetting)\n\t\t\t\t\t\tif (paths.length > 0) {\n\t\t\t\t\t\t\tfor(var i = 0; i < paths.length; i++) {\n\t\t\t\t\t\t\t\tconst assets = paths[i];\n\t\t\t\t\t\t\t\tvar input = $(\"#structure_importer_path_input-\" + String(i))\n\t\t\t\t\t\t\t\tif (!input[0])\n\t\t\t\t\t\t\t\t\tstructure_importer_addResourcePack()\n\t\t\t\t\t\t\t\tinput = $(\"#structure_importer_path_input-\" + String(i))\n\n\t\t\t\t\t\t\t\tinput[0].value = assets\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"onConfirm\": function(data) {\n\t\t\t\t\tvar paths = []\n\t\t\t\t\tfor (var i = 0; i <= structure_importer_resourepackCount; i++) {\n\t\t\t\t\t\tvar path = $(\"#structure_importer_path_input-\" + String(i))\n\t\t\t\t\t\tif (path.length >= 1) {\n\t\t\t\t\t\t\tpaths.push(path[0].value)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar useLegacy = $(\"#structure_importer_legacy\")[0].checked\n\t\t\t\t\tvar pathsValid = false\n\t\t\t\t\tfor (var i = 0; i < paths.length; i++) {\n\t\t\t\t\t\tif (paths[i] != \"Enter path to assets folder here\" && paths[i] != \"undefined\") {\n\t\t\t\t\t\t\tpathsValid = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!pathsValid && !useLegacy) {\n\t\t\t\t\t\tBlockbench.showMessage(\"Error: no assets folder provided\", \"center\")\n\t\t\t\t\t\tthrow \"Error: no assets folder provided\"\n\t\t\t\t\t}\n\n\t\t\t\t\tvar saveAssets = $(\"#structure_importer_save_assets\")[0].checked\n\t\t\t\t\tif (saveAssets){\n\t\t\t\t\t\tdefaultAssetsSettings.set(JSON.stringify(paths))\n\t\t\t\t\t\tSettings.save()\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar structureBuilder = new StructureBuilder()\n\t\t\t\t\tstructureBuilder.scale = $(\"#scale\")[0].value\n\t\t\t\t\tstructureBuilder.assetPaths = paths\n\t\t\t\t\t\n\t\t\t\t\tdialog.hide()\n\t\t\t\t\t\n\t\t\t\t\t// ✅ FIX 1: Use asynchronous import\n\t\t\t\t\tBlockbench.import({\n\t\t\t\t\t\ttype: \"NBT structure\",\n\t\t\t\t\t\textensions: [\"nbt\", \"dat\"],\n\t\t\t\t\t\ttitle: \"Pick an NBT structure file\",\n\t\t\t\t\t\treadtype: \"binary\" // Important: tells BB to load the file as a buffer\n\t\t\t\t\t}, (files) => {\n\t\t\t\t\t\tif (files.length === 0) {\n\t\t\t\t\t\t\tBlockbench.showMessage(\"Error: no files were picked\", \"center\")\n\t\t\t\t\t\t\tthrow \"Error: no files were picked\"\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar fileData = files[0].content; // The loaded binary data\n\n\t\t\t\t\t\t// nbt.parse will now check for the gzip header and use the asynchronous zlib.gunzip\n\t\t\t\t\t\tnbt.parse(fileData, (error, data) => {\n\t\t\t\t\t\t\tif (error) {\n\t\t\t\t\t\t\t\tBlockbench.showMessage(\"Error parsing NBT file: \" + error.message, \"center\");\n\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (!useLegacy) {\n\t\t\t\t\t\t\t\tstructureBuilder.buildStructure(data)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tlegacyStructureImporter(data)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\tdialog.show()\n\t\t}\n\t}\n\n\timportStructureFile()\n\t\n\tfunction legacyStructureImporter(file) {\n\t\tfile = file.value\n\n\t\tvar group = new Group('structure').init().addTo()\n\n\t\tvar blocks = file.blocks.value.value\n\t\tvar palette = file.palette.value.value\n\t\tvar calculated_blocks = []\n\t\tvar max_size = 16\n\t\tvar i = 0\n\n\t\twhile (i < blocks.length) {\n\t\t\tvar blockType = palette[blocks[i].state.value].Name.value\n\t\t\tif (blocks[i].pos && \n\t\t\t\tblockType !== 'minecraft:air' &&\n\t\t\t\tblockType !== 'minecraft:tallgrass' &&\n\t\t\t\tblockType !== 'minecraft:double_plant'\n\t\t\t) {\n\t\t\t\tvar size = [0, 0, 0, 1, 1, 1]\n\n\t\t\t\tif (blockType === 'minecraft:carpet' || blockType.includes('repeater') || blockType.includes('comparator')) {\n\t\t\t\t\t//clearFaces(blocks[i].pos, ['down'])\n\n\t\t\t\t\tsize = [0, 0, 0, 1, 0.0625, 1]\n\n\t\t\t\t} else if (blockType === 'minecraft:chest') {\n\n\t\t\t\t\tsize = [0.0625, 0, 0.0625, 0.9375, 0.9375, 0.9375]\n\n\t\t\t\t} else if (blockType.includes('torch')) {\n\n\t\t\t\t\tsize = [0.4, 0, 0.4, 0.6, 0.8, 0.6]\n\n\t\t\t\t} else if (blockType.includes('flower')) {\n\n\t\t\t\t\tsize = [0.4, 0, 0.4, 0.6, 0.5, 0.6]\n\n\t\t\t\t} else if (blockType.includes('slab')) {\n\t\t\t\t\tvar half;\n\t\t\t\t\tif (\n\t\t\t\t\t\tpalette[blocks[i].state.value] &&\n\t\t\t\t\t\tpalette[blocks[i].state.value].Properties &&\n\t\t\t\t\t\tpalette[blocks[i].state.value].Properties.value.half\n\t\t\t\t\t) {\n\t\t\t\t\t\thalf = palette[blocks[i].state.value].Properties.value.half.value\n\t\t\t\t\t}\n\t\t\t\t\tif (half === 'top') {\n\t\t\t\t\t\t//clearFaces(blocks[i].pos, ['up'])\n\t\t\t\t\t\tsize = [0, 0.5, 0, 1, 1, 1]\n\n\t\t\t\t\t} else if (half === 'bottom') {\n\t\t\t\t\t\t//clearFaces(blocks[i].pos, ['down'])\n\t\t\t\t\t\tsize = [0, 0, 0, 1, 0.5, 1]\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//clearFaces(blocks[i].pos, ['north', 'east', 'south', 'west', 'up', 'down'])\n\n\t\t\t\t\t\tsize = [0, 0, 0, 1, 1, 1]\n\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t//clearFaces(blocks[i].pos, ['north', 'east', 'south', 'west', 'up', 'down'])\n\n\t\t\t\t\tsize = [0, 0, 0, 1, 1, 1]\n\n\t\t\t\t}\n\t\t\t\t//Add Block Position Offset\n\t\t\t\tfor (si = 0; si<6; si++) {\n\t\t\t\t\tsize[si] += blocks[i].pos.value.value[si%3]\n\t\t\t\t}\n\t\t\t\tcalculated_blocks.push({\n\t\t\t\t\tpos: size,\n\t\t\t\t\tname: blockType.replace('minecraft:', '')\n\t\t\t\t})\n\n\t\t\t\tmax_size = Math.max(max_size, size[0], size[3], size[1], size[4], size[2], size[5])\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\n\t\t//Print Into Canvas\n\t\tvar size_multiplier = 1\n\t\tmax_size = max_size/16\n\n\t\tif (max_size > 1) {\n\n\t\t\tif (max_size <= 2) {\n\t\t\t\tsize_multiplier = 0.5\n\n\t\t\t} else if (max_size <= 4) {\n\t\t\t\tsize_multiplier = 0.25\n\n\t\t\t} else if (max_size <= 8) {\n\t\t\t\tsize_multiplier = 0.125\n\n\t\t\t} else {\n\t\t\t\tsize_multiplier = 0.0625\n\t\t\t}\n\t\t\t//Adapt Grid\n\t\t\tsettings.edit_size.value = 16 / size_multiplier\n\t\t\tsaveSettings()\n\t\t}\n\n\t\tcalculated_blocks.forEach(function(cbl) {\n\t\t\tif (size_multiplier !== 1) {\n\t\t\t\tcbl.pos.forEach(function(p, ip) {\n\t\t\t\t\tcbl.pos[ip] = p * size_multiplier\n\t\t\t\t})\n\t\t\t}\n\t\t\tvar cube = new Cube().extend({\n\t\t\t\tfrom: [cbl.pos[0], cbl.pos[1], cbl.pos[2]],\n\t\t\t\tto:   [cbl.pos[3], cbl.pos[4], cbl.pos[5]],\n\t\t\t\tname: cbl.name,\n\t\t\t\tdisplay: {\n\t\t\t\t\tautouv: false\n\t\t\t\t}\n\t\t\t}).addTo(group)\n\t\t\tfor (var face in cube.faces) {\n\t\t\t\tif (cube.faces.hasOwnProperty(face)) {\n\t\t\t\t\tcube.faces[face].uv = [0, 0, 16, 16]\n\t\t\t\t}\n\t\t\t}\n\t\t\t// elements.push(cube)\n\t\t\tcube.init()\n\t\t\ti++;\n\t\t})\n\t\tCanvas.updateAll()\n\t\t\n\t}\n}\n\nwindow.structure_importer_selectResourcePath = structure_importer_selectResourcePath;\nwindow.structure_importer_addResourcePack = structure_importer_addResourcePack;\n// window.structure_importer_updateSize = structure_importer_updateSize;\nwindow.structure_importer_run = structure_importer_run;\n\nlet defaultAssetsSettings;\n\nPlugin.register(\"structure_importer\", {\ntitle: 'Structure Importer',  \nauthor: \"JannisX11 & Krozi\",\nicon: \"account_balance\",\ndescription: \"Import structure files generated by structure blocks in Minecraft Java\",\nversion: \"2.1.7\",\nmin_version: \"3.7.0\",\nvariant: 'desktop',\nonload() {\n\n//Adds an entry to the plugin menu\nMenuBar.addAction(new Action({\n\tid: \"structure_importer\",\n\tname: \"Structure file\",\n\ticon: \"account_balance\",\n\tdescription: \"Import a structure file\",\n\tcategory: \"filter\",\n\tclick: structure_importer_run\n}), \"file.import\")\n\nMenuBar.addAction(new Action({\n\tid: \"structure_importer\",\n\tname: \"Import Structure\",\n\ticon: \"account_balance\",\n\tdescription: \"Import a structure file\",\n\tcategory: \"filter\",\n\tclick: structure_importer_run\n}), \"filter\")\n\n\tdefaultAssetsSettings = new Setting(\"structure_importer_default_assets\", {\n\t\tname: \"Structure Importer Default Assets\",\n\t\ttype: \"text\",\n\t\ticon: \"folder_close\",\n\t\tcategory: \"defaults\",\n\t\tdescription: \"The default assets folders used to import structures\",\n\t\tvalue: \"[]\"\n\t})\n},\n\nonunload() {\n\tMenuBar.removeAction(\"file.import.structure_importer\")\n\tMenuBar.removeAction(\"filter.structure_importer\")\n\tMenuBar.removeAction(\"structure_importer\")\n\tdelete StructureBuilder\n\tdefaultAssetsSettings.delete()\n}\n})\n\nvar StructureBuilder = class {\n\tconstructor() {\n\t\tthis.assetPaths = []\n\t\tthis.allFaces = [\"north\", \"east\", \"south\", \"west\", \"up\", \"down\"]\n\t\tthis.textureVariables = {}\n\t\tthis.palette = []\n\t\tthis.paletteCulling = []\n\t\tthis.group = new Group('structure').init().addTo()\n\t\tthis.texturesAdded = []\n\t\tthis.culling = []\n\t\tthis.scale = 16\n\t\tthis.solid = [\n\t\t\t\"stone\",\n\t\t\t\"granite\",\n\t\t\t\"polished_granite\",\n\t\t\t\"diorite\",\n\t\t\t\"polished_diorite\",\n\t\t\t\"andesite\",\n\t\t\t\"polished_andesite\",\n\t\t\t\"grass_block\",\n\t\t\t\"dirt\",\n\t\t\t\"coarse_dirt\",\n\t\t\t\"podzol\",\n\t\t\t\"cobblestone\",\n\t\t\t\"oak_planks\",\n\t\t\t\"spruce_planks\",\n\t\t\t\"birch_planks\",\n\t\t\t\"jungle_planks\",\n\t\t\t\"acacia_planks\",\n\t\t\t\"dark_oak_planks\",\n\t\t\t\"bedrock\",\n\t\t\t\"sand\",\n\t\t\t\"red_sand\",\n\t\t\t\"gravel\",\n\t\t\t\"gold_ore\",\n\t\t\t\"iron_ore\",\n\t\t\t\"coal_ore\",\n\t\t\t\"oak_log\",\n\t\t\t\"spruce_log\",\n\t\t\t\"birch_log\",\n\t\t\t\"jungle_log\",\n\t\t\t\"acacia_log\",\n\t\t\t\"dark_oak_log\",\n\t\t\t\"stripped_spruce_log\",\n\t\t\t\"stripped_birch_log\",\n\t\t\t\"stripped_jungle_log\",\n\t\t\t\"stripped_acacia_log\",\n\t\t\t\"stripped_dark_oak_log\",\n\t\t\t\"stripped_oak_log\",\n\t\t\t\"oak_wood\",\n\t\t\t\"spruce_wood\",\n\t\t\t\"birch_wood\",\n\t\t\t\"jungle_wood\",\n\t\t\t\"acacia_wood\",\n\t\t\t\"dark_oak_wood\",\n\t\t\t\"stripped_oak_wood\",\n\t\t\t\"stripped_spruce_wood\",\n\t\t\t\"stripped_birch_wood\",\n\t\t\t\"stripped_jungle_wood\",\n\t\t\t\"stripped_acacia_wood\",\n\t\t\t\"stripped_dark_oak_wood\",\n\t\t\t\"sponge\",\n\t\t\t\"wet_sponge\",\n\t\t\t\"lapis_ore\",\n\t\t\t\"lapis_block\",\n\t\t\t\"dispenser\",\n\t\t\t\"sandstone\",\n\t\t\t\"chiseled_sandstone\",\n\t\t\t\"cut_sandstone\",\n\t\t\t\"note_block\",\n\t\t\t\"sticky_piston\",\n\t\t\t\"white_wool\",\n\t\t\t\"orange_wool\",\n\t\t\t\"magenta_wool\",\n\t\t\t\"light_blue_wool\",\n\t\t\t\"yellow_wool\",\n\t\t\t\"lime_wool\",\n\t\t\t\"pink_wool\",\n\t\t\t\"gray_wool\",\n\t\t\t\"light_gray_wool\",\n\t\t\t\"cyan_wool\",\n\t\t\t\"purple_wool\",\n\t\t\t\"blue_wool\",\n\t\t\t\"brown_wool\",\n\t\t\t\"green_wool\",\n\t\t\t\"red_wool\",\n\t\t\t\"black_wool\",\n\t\t\t\"white_concrete\",\n\t\t\t\"orange_concrete\",\n\t\t\t\"magenta_concrete\",\n\t\t\t\"light_blue_concrete\",\n\t\t\t\"yellow_concrete\",\n\t\t\t\"lime_concrete\",\n\t\t\t\"pink_concrete\",\n\t\t\t\"gray_concrete\",\n\t\t\t\"light_gray_concrete\",\n\t\t\t\"cyan_concrete\",\n\t\t\t\"purple_concrete\",\n\t\t\t\"blue_concrete\",\n\t\t\t\"brown_concrete\",\n\t\t\t\"green_concrete\",\n\t\t\t\"red_concrete\",\n\t\t\t\"black_concrete\",\n\t\t\t\"white_concrete_powder\",\n\t\t\t\"orange_concrete_powder\",\n\t\t\t\"magenta_concrete_powder\",\n\t\t\t\"light_blue_concrete_powder\",\n\t\t\t\"yellow_concrete_powder\",\n\t\t\t\"lime_concrete_powder\",\n\t\t\t\"pink_concrete_powder\",\n\t\t\t\"gray_concrete_powder\",\n\t\t\t\"light_gray_concrete_powder\",\n\t\t\t\"cyan_concrete_powder\",\n\t\t\t\"purple_concrete_powder\",\n\t\t\t\"blue_concrete_powder\",\n\t\t\t\"brown_concrete_powder\",\n\t\t\t\"green_concrete_powder\",\n\t\t\t\"red_concrete_powder\",\n\t\t\t\"black_concrete_powder\",\n\t\t\t\"gold_block\",\n\t\t\t\"iron_block\",\n\t\t\t\"bricks\",\n\t\t\t\"tnt\",\n\t\t\t\"bookshelf\",\n\t\t\t\"mossy_cobblestone\",\n\t\t\t\"obsidian\",\n\t\t\t\"diamond_ore\",\n\t\t\t\"diamond_block\",\n\t\t\t\"crafting_table\",\n\t\t\t\"furnace\",\n\t\t\t\"redstone_ore\",\n\t\t\t\"snow_block\",\n\t\t\t\"clay\",\n\t\t\t\"jukebox\",\n\t\t\t\"pumpkin\",\n\t\t\t\"netherrack\",\n\t\t\t\"soul_sand\",\n\t\t\t\"glowstone\",\n\t\t\t\"carved_pumpkin\",\n\t\t\t\"jack_o_lantern\",\n\t\t\t\"infested_stone\",\n\t\t\t\"infested_cobblestone\",\n\t\t\t\"infested_stone_bricks\",\n\t\t\t\"infested_mossy_stone_bricks\",\n\t\t\t\"infested_cracked_stone_bricks\",\n\t\t\t\"infested_chiseled_stone_bricks\",\n\t\t\t\"stone_bricks\",\n\t\t\t\"mossy_stone_bricks\",\n\t\t\t\"cracked_stone_bricks\",\n\t\t\t\"chiseled_stone_bricks\",\n\t\t\t\"brown_mushroom_block\",\n\t\t\t\"red_mushroom_block\",\n\t\t\t\"melon\",\n\t\t\t\"mycelium\",\n\t\t\t\"nether_bricks\",\n\t\t\t\"end_stone\",\n\t\t\t\"redstone_lamp\",\n\t\t\t\"emerald_ore\",\n\t\t\t\"emerald_block\",\n\t\t\t\"command_block\",\n\t\t\t\"redstone_block\",\n\t\t\t\"nether_quartz_ore\",\n\t\t\t\"quartz_block\",\n\t\t\t\"chiseled_quartz_block\",\n\t\t\t\"quartz_pillar\",\n\t\t\t\"dropper\",\n\t\t\t\"white_terracotta\",\n\t\t\t\"orange_terracotta\",\n\t\t\t\"magenta_terracotta\",\n\t\t\t\"light_blue_terracotta\",\n\t\t\t\"yellow_terracotta\",\n\t\t\t\"lime_terracotta\",\n\t\t\t\"pink_terracotta\",\n\t\t\t\"gray_terracotta\",\n\t\t\t\"light_gray_terracotta\",\n\t\t\t\"cyan_terracotta\",\n\t\t\t\"purple_terracotta\",\n\t\t\t\"blue_terracotta\",\n\t\t\t\"brown_terracotta\",\n\t\t\t\"green_terracotta\",\n\t\t\t\"red_terracotta\",\n\t\t\t\"black_terracotta\",\n\t\t\t\"prismarine\",\n\t\t\t\"prismarine_bricks\",\n\t\t\t\"dark_prismarine\",\n\t\t\t\"sea_lantern\",\n\t\t\t\"hay_block\",\n\t\t\t\"terracotta\",\n\t\t\t\"coal_block\",\n\t\t\t\"packed_ice\",\n\t\t\t\"red_sandstone\",\n\t\t\t\"chiseled_red_sandstone\",\n\t\t\t\"cut_red_sandstone\",\n\t\t\t\"smooth_stone\",\n\t\t\t\"smooth_sandstone\",\n\t\t\t\"smooth_quartz\",\n\t\t\t\"smooth_red_sandstone\",\n\t\t\t\"purpur_block\",\n\t\t\t\"purpur_pillar\",\n\t\t\t\"end_stone_bricks\",\n\t\t\t\"repeating_command_block\",\n\t\t\t\"chain_command_block\",\n\t\t\t\"magma_block\",\n\t\t\t\"nether_wart_block\",\n\t\t\t\"red_nether_bricks\",\n\t\t\t\"bone_block\",\n\t\t\t\"observer\",\n\t\t\t\"white_glazed_terracotta\",\n\t\t\t\"orange_glazed_terracotta\",\n\t\t\t\"magenta_glazed_terracotta\",\n\t\t\t\"light_blue_glazed_terracotta\",\n\t\t\t\"tube_coral_block\",\n\t\t\t\"brain_coral_block\",\n\t\t\t\"bubble_coral_block\",\n\t\t\t\"fire_coral_block\",\n\t\t\t\"horn_coral_block\",\n\t\t\t\"dead_tube_coral_block\",\n\t\t\t\"dead_brain_coral_block\",\n\t\t\t\"dead_bubble_coral_block\",\n\t\t\t\"dead_fire_coral_block\",\n\t\t\t\"dead_horn_coral_block\",\n\t\t\t\"blue_ice\",\n\t\t\t\"dried_kelp_block\",\n\t\t\t\"barrel\",\n\t\t\t\"blast_furnace\",\n\t\t\t\"cartography_table\",\n\t\t\t\"fletching_table\",\n\t\t\t\"composter\",\n\t\t\t\"structure_block\",\n\t\t\t\"jigsaw\",\n\t\t\t\"loom\",\n\t\t\t\"smithing_table\",\n\t\t\t\"smoker\",\n\t\t\t\"bee_nest\",\n\t\t\t\"beehive\",\n\t\t\t\"honeycomb_block\",\n\t\t\t\"ancient_debris\",\n\t\t\t\"basalt\",\n\t\t\t\"polished_basalt\",\n\t\t\t\"blackstone\",\n\t\t\t\"gilded_blackstone\",\n\t\t\t\"polished_blackstone\",\n\t\t\t\"chiseled_polished_blackstone\",\n\t\t\t\"polished_blackstone_bricks\",\n\t\t\t\"cracked_polished_blackstone_bricks\",\n\t\t\t\"netherite_block\",\n\t\t\t\"chiseled_nether_bricks\",\n\t\t\t\"cracked_nether_bricks\",\n\t\t\t\"crimson_nylium\",\n\t\t\t\"warped_nylium\",\n\t\t\t\"crimson_planks\",\n\t\t\t\"warped_planks\",\n\t\t\t\"crimson_stem\",\n\t\t\t\"warped_stem\",\n\t\t\t\"stripped_crimson_stem\",\n\t\t\t\"stripped_warped_stem\",\n\t\t\t\"crying_obsidian\",\n\t\t\t\"crimson_hyphae\",\n\t\t\t\"warped_hyphae\",\n\t\t\t\"stripped_crimson_hyphae\",\n\t\t\t\"stripped_warped_hyphae\",\n\t\t\t\"lodestone\",\n\t\t\t\"nether_gold_ore\",\n\t\t\t\"quartz_bricks\",\n\t\t\t\"respawn_anchor\",\n\t\t\t\"shroomlight\",\n\t\t\t\"soul_soil\",\n\t\t\t\"target\",\n\t\t\t\"warped_wart_block\"\n\t\t]\n\t\tthis.cullSelf = [\n\t\t\t\"glass\",\n\t\t\t\"glass_pane\",\n\t\t\t\"white_stained_glass\",\n\t\t\t\"orange_stained_glass\",\n\t\t\t\"magenta_stained_glass\",\n\t\t\t\"light_blue_stained_glass\",\n\t\t\t\"yellow_stained_glass\",\n\t\t\t\"lime_stained_glass\",\n\t\t\t\"pink_stained_glass\",\n\t\t\t\"gray_stained_glass\",\n\t\t\t\"light_gray_stained_glass\",\n\t\t\t\"cyan_stained_glass\",\n\t\t\t\"purple_stained_glass\",\n\t\t\t\"blue_stained_glass\",\n\t\t\t\"brown_stained_glass\",\n\t\t\t\"green_stained_glass\",\n\t\t\t\"red_stained_glass\",\n\t\t\t\"black_stained_glass\",\n\t\t\t\"white_stained_glass_pane\",\n\t\t\t\"orange_stained_glass_pane\",\n\t\t\t\"magenta_stained_glass_pane\",\n\t\t\t\"light_blue_stained_glass_pane\",\n\t\t\t\"yellow_stained_glass_pane\",\n\t\t\t\"lime_stained_glass_pane\",\n\t\t\t\"pink_stained_glass_pane\",\n\t\t\t\"gray_stained_glass_pane\",\n\t\t\t\"light_gray_stained_glass_pane\",\n\t\t\t\"cyan_stained_glass_pane\",\n\t\t\t\"purple_stained_glass_pane\",\n\t\t\t\"blue_stained_glass_pane\",\n\t\t\t\"brown_stained_glass_pane\",\n\t\t\t\"green_stained_glass_pane\",\n\t\t\t\"red_stained_glass_pane\",\n\t\t\t\"black_stained_glass_pane\",\n\t\t\t\"ice\",\n\t\t\t\"cactus\",\n\t\t\t\"iron_bars\",\n\t\t\t\"slime_block\",\n\t\t\t\"honey_block\"\n\t\t]\n\t\tthis.cullSelfGroup = [\n\t\t\t[\n\t\t\t\t\"oak_fence\",\n\t\t\t\t\"spruce_fence\",\n\t\t\t\t\"birch_fence\",\n\t\t\t\t\"jungle_fence\",\n\t\t\t\t\"acacia_fence\",\n\t\t\t\t\"dark_oak_fence\"\n\t\t\t],\n\t\t\t[\n\t\t\t\t\"cobblestone_wall\",\n\t\t\t\t\"mossy_cobblestone_wall\",\n\t\t\t\t\"brick_wall\",\n\t\t\t\t\"prismarine_wall\",\n\t\t\t\t\"red_sandstone_wall\",\n\t\t\t\t\"mossy_stone_brick_wall\",\n\t\t\t\t\"granite_wall\",\n\t\t\t\t\"stone_brick_wall\",\n\t\t\t\t\"nether_brick_wall\",\n\t\t\t\t\"andesite_wall\",\n\t\t\t\t\"red_nether_brick_wall\",\n\t\t\t\t\"sandstone_wall\",\n\t\t\t\t\"end_stone_brick_wall\",\n\t\t\t\t\"diorite_wall\",\n\t\t\t\t\"blackstone_wall\",\n\t\t\t\t\"polished_blackstone_brick_wall\",\n\t\t\t\t\"polished_blackstone_wall\"\n\t\t\t]\n\t\t]\n\t\tthis.slabs = [\n\t\t\t\"stone_slab\",\n\t\t\t\"smooth_stone_slab\",\n\t\t\t\"stone_brick_slab\",\n\t\t\t\"sandstone_slab\",\n\t\t\t\"acacia_slab\",\n\t\t\t\"birch_slab\",\n\t\t\t\"dark_oak_slab\",\n\t\t\t\"jungle_slab\",\n\t\t\t\"oak_slab\",\n\t\t\t\"spruce_slab\",\n\t\t\t\"purpur_slab\",\n\t\t\t\"quartz_slab\",\n\t\t\t\"red_sandstone_slab\",\n\t\t\t\"brick_slab\",\n\t\t\t\"cobblestone_slab\",\n\t\t\t\"nether_brick_slab\",\n\t\t\t\"petrified_oak_slab\",\n\t\t\t\"prismarine_slab\",\n\t\t\t\"prismarine_brick_slab\",\n\t\t\t\"dark_prismarine_slab\",\n\t\t\t\"polished_granite_slab\",\n\t\t\t\"smooth_red_sandstone_slab\",\n\t\t\t\"mossy_stone_brick_slab\",\n\t\t\t\"polished_diorite_slab\",\n\t\t\t\"mossy_cobblestone_slab\",\n\t\t\t\"end_stone_brick_slab\",\n\t\t\t\"smooth_sandstone_slab\",\n\t\t\t\"smooth_quartz_slab\",\n\t\t\t\"granite_slab\",\n\t\t\t\"andesite_slab\",\n\t\t\t\"red_nether_brick_slab\",\n\t\t\t\"polished_andesite_slab\",\n\t\t\t\"diorite_slab\",\n\t\t\t\"cut_red_sandstone_slab\",\n\t\t\t\"cut_sandstone_slab\",\n\t\t\t\"blackstone_slab\",\n\t\t\t\"polished_blackstone_slab\",\n\t\t\t\"polished_blackstone_brick_slab\"\n\t\t]\n\t\tthis.flatBlocks = {\n\t\t\t\"farmland\": 15,\n\t\t\t\"daylight_detector\": 6,\n\t\t\t\"grass_path\": 15,\n\t\t\t\"white_carpet\": 1,\n\t\t\t\"orange_carpet\": 1,\n\t\t\t\"magenta_carpet\": 1,\n\t\t\t\"light_blue_carpet\": 1,\n\t\t\t\"yellow_carpet\": 1,\n\t\t\t\"lime_carpet\": 1,\n\t\t\t\"pink_carpet\": 1,\n\t\t\t\"gray_carpet\": 1,\n\t\t\t\"light_gray_carpet\": 1,\n\t\t\t\"cyan_carpet\": 1,\n\t\t\t\"purple_carpet\": 1,\n\t\t\t\"blue_carpet\": 1,\n\t\t\t\"brown_carpet\": 1,\n\t\t\t\"green_carpet\": 1,\n\t\t\t\"red_carpet\": 1,\n\t\t\t\"black_carpet\": 1,\n\t\t\t\"repeater\": 2,\n\t\t\t\"comparator\": 2,\n\t\t\t\"enchanting_table\": 12,\n\t\t\t\"end_portal_frame\": 13,\n\t\t\t\"lectern\": 2\n\t\t}\n\t}\n\t\n\tbuildStructure(file) {\n\t\tUndo.initEdit({\"elements\": [], \"uv_only\": false, \"textures\": []})\n\t\tfor (var i = 0; i < this.assetPaths.length; i++) {\n\t\t\tthis.assetPaths[i] = this.getAssetsPath(this.assetPaths[i])\n\t\t}\n\t\tfile = file.value\n\t\tvar palette = file.palette.value.value\n\t\tvar blocks = file.blocks.value.value\n\t\tfor (var i = 0; i < palette.length; i++) {\n\t\t\tvar blockId = palette[i].Name.value\n\t\t\tvar blockstates = {}\n\t\t\tif (Object.keys(palette[i]).indexOf(\"Properties\") >= 0) {\n\t\t\t\tvar properties = Object.keys(palette[i].Properties.value)\n\t\t\t\tfor (var j = 0; j < properties.length; j++) {\n\t\t\t\t\tblockstates[properties[j]] = palette[i].Properties.value[properties[j]].value\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.loadBlockstate(blockId, blockstates)\n\t\t\tthis.paletteCulling.push(this.getCullingType(blockId, blockstates))\n\t\t}\n\t\tvar size = file.size.value.value\n\t\tfor (var x = 0; x < size[0]; x++) {\n\t\t\tvar plane = []\n\t\t\tfor (var y = 0; y < size[1]; y++) {\n\t\t\t\tplane.push(Array(size[2]))\n\t\t\t}\n\t\t\tthis.culling.push(plane)\n\t\t}\n\t\tfor (var i = 0; i < blocks.length; i++) {\n\t\t\tthis.culling[blocks[i].pos.value.value[0]][blocks[i].pos.value.value[1]][blocks[i].pos.value.value[2]] = this.paletteCulling[blocks[i].state.value]\n\t\t}\n\t\tfor (var i = 0; i < blocks.length; i++) {\n\t\t\tvar x = blocks[i].pos.value.value[0]\n\t\t\tvar y = blocks[i].pos.value.value[1]\n\t\t\tvar z = blocks[i].pos.value.value[2]\n\t\t\tvar cullingData = this.culling[x][y][z]\n\t\t\tvar cullSides = {\"west\": false, \"east\": false, \"down\": false, \"up\": false, \"north\": false, \"south\": false}\n\t\t\tif (x > 0) cullSides.west = this.doCulling(cullingData, this.culling[x-1][y][z], \"west\")\n\t\t\tif (x < size[0]-1) cullSides.east = this.doCulling(cullingData, this.culling[x+1][y][z], \"east\")\n\t\t\tif (y > 0) cullSides.down = this.doCulling(cullingData, this.culling[x][y-1][z], \"down\")\n\t\t\tif (y < size[1]-1) cullSides.up = this.doCulling(cullingData, this.culling[x][y+1][z], \"up\")\n\t\t\tif (z > 0) cullSides.north = this.doCulling(cullingData, this.culling[x][y][z-1], \"north\")\n\t\t\tif (z < size[2]-1) cullSides.south = this.doCulling(cullingData, this.culling[x][y][z+1], \"south\")\n\t\t\tthis.addModel(blocks[i].state.value, cullSides, [x*16/this.scale, y*16/this.scale, z*16/this.scale], 1/this.scale)\n\t\t}\n\t\tCanvas.updateAll()\n\t\tUndo.finishEdit(\"structure_importer\", {\"elements\": this.group.children, \"uv_only\": false, \"textures\": this.texturesAdded})\n\t}\n\t\n\tgetAssetsPath(path) {\n\t\tlet fs = getFS();\n\t\t// path = path.replace(\"/\", \"\\\\\")\n\t\tif (path.endsWith(osfs + \"assets\")) return path\n\t\tif (fs.existsSync(path + osfs + \"assets\")) return path + osfs + \"assets\"\n\t\tif (path.indexOf(osfs + \"assets\" + osfs) >= 0) return path.slice(0, path.indexOf(osfs + \"assets\" + osfs) + 7)\n\t\treturn path\n\t}\n\t\n\tgetCullingType(blockId, blockstates) {\n\t\tblockId = blockId.slice(blockId.indexOf(\":\") + 1)\n\t\tif (this.solid.indexOf(blockId) >= 0) {\n\t\t\treturn {\"type\": \"solid\"}\n\t\t}\n\t\tif (Object.keys(this.flatBlocks).indexOf(blockId) >= 0) {\n\t\t\treturn {\"type\": \"slab\", \"height\": this.flatBlocks[blockId]}\n\t\t}\n\t\tif (this.slabs.indexOf(blockId) >= 0) {\n\t\t\tif (blockstates.type == \"bottom\") {\n\t\t\t\treturn {\"type\": \"slab\", \"height\": 8}\n\t\t\t}\n\t\t\tif (blockstates.type == \"top\") {\n\t\t\t\treturn {\"type\": \"inverse_slab\", \"height\": 8}\n\t\t\t}\n\t\t\tif (blockstates.type == \"double\") {\n\t\t\t\treturn {\"type\": \"solid\"}\n\t\t\t}\n\t\t}\n\t\tif (blockId == \"snow\") {\n\t\t\tif (blockstates.layers == 8) {\n\t\t\t\treturn {\"type\": \"solid\"}\n\t\t\t}\n\t\t\treturn {\"type\": \"slab\", \"height\": blockstates.layers * 2}\n\t\t}\n\t\tif (this.cullSelf.indexOf(blockId) >= 0) {\n\t\t\treturn {\"type\": \"selfcull\", \"id\": blockId}\n\t\t}\n\t\tfor (var i = 0; i < this.cullSelfGroup.length; i++) {\n\t\t\tif (this.cullSelfGroup[i].indexOf(blockId) >= 0) {\n\t\t\t\treturn {\"type\": \"selfcull\", \"id\": \"GROUP\" + String(i)}\n\t\t\t}\n\t\t}\n\t\treturn {\"type\": \"none\"}\n\t}\n\t\n\tdoCulling(tile, neighbour, side) {\n\t\tif (neighbour == undefined || neighbour.type == \"none\") {\n\t\t\treturn false\n\t\t}\n\t\tif (neighbour.type == \"solid\") {\n\t\t\treturn true\n\t\t}\n\t\tif (neighbour.type == \"selfcull\" && tile.type == \"selfcull\" && tile.id == neighbour.id) {\n\t\t\treturn true\n\t\t}\n\t\tif (neighbour.type == \"slab\") {\n\t\t\tif (side == \"up\") {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (tile.type == \"slab\" && side != \"down\" && tile.height <= neighbour.height) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\tif (neighbour.type == \"inverse_slab\") {\n\t\t\tif (side == \"down\") {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif (tile.type == \"inverse_slab\" && side != \"up\" && tile.height <= neighbour.height) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\t\n\tgetResourcePath(object_type, localPath) {\n\t\tlet fs = getFS();\n\t\tvar namespace = \"minecraft\"\n\t\tvar parts = localPath.split(\":\")\n\t\tif (parts.length > 1) {\n\t\t\tnamespace = parts[0]\n\t\t\tlocalPath = parts[1]\n\t\t}\n\t\tlocalPath = localPath.replace(\"/\", osfs)\n\t\tfor (var i = this.assetPaths.length - 1; i >= 0; i--) {\n\t\t\tvar fullPath = this.assetPaths[i] + osfs + namespace + osfs + object_type + osfs + localPath\n\t\t\tif (fs.existsSync(fullPath)) {\n\t\t\t\treturn fullPath\n\t\t\t}\n\t\t}\n\t\tBlockbench.showMessage(\"Error: File not found: \" + localPath, \"center\")\n\t\tthrow \"Error: File not found: \" + localPath\n\t}\n\t\n\tloadBlockstate(blockId, blockstates) {\n\t\tlet fs = getFS();\n\t\tvar fullPath = this.getResourcePath(\"blockstates\", blockId + \".json\")\n\t\tvar data = JSON.parse(fs.readFileSync(fullPath, \"utf8\"))\n\t\tif (Object.keys(data).indexOf(\"variants\") >= 0) {\n\t\t\tvar variants = Object.keys(data.variants)\n\t\t\tfor (var i=0; i < variants.length; i++) {\n\t\t\t\tvar variant = variants[i]\n\t\t\t\tif (variant == \"\") {\n\t\t\t\t\tthis.palette.push(this.loadRotatedModel(data.variants[\"\"]))\n\t\t\t\t}\n\t\t\t\tvar repeat = true\n\t\t\t\tvar start = 0\n\t\t\t\twhile (repeat) {\n\t\t\t\t\tvar equalSign = variant.indexOf(\"=\", start)\n\t\t\t\t\tvar comma = variant.indexOf(\",\", start)\n\t\t\t\t\tif (comma == -1) {\n\t\t\t\t\t\tcomma = variant.length\n\t\t\t\t\t\trepeat = false\n\t\t\t\t\t}\n\t\t\t\t\tvar state = variant.slice(start, equalSign)\n\t\t\t\t\tvar value = variant.slice(equalSign + 1, comma)\n\t\t\t\t\tif (blockstates[state] != value) {\n\t\t\t\t\t\trepeat = false\n\t\t\t\t\t}\n\t\t\t\t\telse if (!repeat) {\n\t\t\t\t\t\tthis.palette.push(this.loadRotatedModel(data.variants[variant]))\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tstart = comma + 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(data).indexOf(\"multipart\") >= 0) {\n\t\t\tvar model = []\n\t\t\tfor (var i = 0; i < data.multipart.length; i++) {\n\t\t\t\tvar part = data.multipart[i]\n\t\t\t\tif (Object.keys(part).indexOf(\"when\") == -1) {\n\t\t\t\t\tmodel = model.concat(this.loadRotatedModel(part.apply))\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar match\n\t\t\t\t\tif (Object.keys(part.when).indexOf(\"OR\") >= 0) {\n\t\t\t\t\t\tmatch = false\n\t\t\t\t\t\tfor (var j = 0; j < part.when.OR.length; j++) {\n\t\t\t\t\t\t\tmatch = match || this.matchBlockstates(part.when.OR[j], blockstates)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tmatch = this.matchBlockstates(part.when, blockstates)\n\t\t\t\t\t}\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tmodel = model.concat(this.loadRotatedModel(part.apply))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.palette.push(model)\n\t\t}\n\t}\n\t\n\tmatchBlockstates(when, blockstates) {\n\t\tvar states = Object.keys(when)\n\t\tvar match = true\n\t\tfor (var j = 0; j < states.length; j++) {\n\t\t\tvar values = String(when[states[j]]).split(\"|\")\n\t\t\tif (values.indexOf(blockstates[states[j]]) == -1) {\n\t\t\t\tmatch = false\n\t\t\t}\n\t\t}\n\t\treturn match\n\t}\n\t\n\tloadRotatedModel(data) {\n\t\tif (data.model == undefined) {\n\t\t\treturn this.loadRotatedModel(data[0])\n\t\t}\n\t\tvar uvlock = typeof data.uvlock != \"undefined\" && data.uvlock\n\t\tvar cubes = this.loadModel(data.model)\n\t\tif (data.x) {\n\t\t\tthis.rollCubes(cubes, 0, -data.x, uvlock)\n\t\t}\n\t\tif (data.y) {\n\t\t\tthis.rollCubes(cubes, 1, data.y, uvlock)\n\t\t}\n\t\treturn cubes\n\t}\n\t\n\t\n\trollCubes(cubes, axis, angle, uvlock) {\n\t\t// Taken and modified from https://github.com/JannisX11/blockbench/blob/master/js/elements.js\n\t\tfunction rotateCoord(array) {\n\t\t\tvar a, b;\n\t\t\tarray.forEach(function(s, i) {\n\t\t\t\tif (i == axis) {\n\t\t\t\t} else {\n\t\t\t\t\tif (a == undefined) {\n\t\t\t\t\t\ta = s - 8\n\t\t\t\t\t\tb = i\n\t\t\t\t\t} else {\n\t\t\t\t\t\tarray[b] = s - 8\n\t\t\t\t\t\tarray[b] = 8 - array[b]\n\t\t\t\t\t\tarray[i] = 8 + a;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn array\n\t\t}\n\t\tfunction rotateUVFace(number, iterations) {\n\t\t\tif (!number) number = 0;\n\t\t\tnumber += iterations * 90;\n\t\t\treturn number % 360;\n\t\t}\n\t\tfunction rotateUV(uv, times) {\n\t\t\tfor (var i = 0; i < times; i++) {\n\t\t\t\tvar temp = uv[0]\n\t\t\t\tuv[0] = uv[1]\n\t\t\t\tuv[1] = 16 - uv[2]\n\t\t\t\tuv[2] = uv[3]\n\t\t\t\tuv[3] = 16 - temp\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar steps = (angle % 360) / 90\n\t\tif (steps < 0) {\n\t\t\tsteps = steps + 4\n\t\t}\n\t\tfor (var cubeIndex = 0; cubeIndex < cubes.length; cubeIndex++) {\n\t\t\tvar cube = cubes[cubeIndex]\n\t\t\tfor (var repeat = 0; repeat < steps; repeat++) {\n\t\t\t\t//Swap coordinate thingy\n\t\t\t\t[cube.from[2], cube.to[2]] = [cube.to[2], cube.from[2]]\n\t\t\t\tcube.from = rotateCoord(cube.from, 1)\n\t\t\t\tcube.to = rotateCoord(cube.to, 1)\n\t\t\t\tif (cube.origin && [8, 8, 8] != cube.origin) {\n\t\t\t\t\tcube.origin = rotateCoord(cube.origin, 1)\n\t\t\t\t}\n\t\t\t\tif (axis === 0) {\n\t\t\t\t\tif (uvlock) {\n\t\t\t\t\t\trotateUV(cube.faces.west.uv, 3)\n\t\t\t\t\t\trotateUV(cube.faces.east.uv, 1)\n\t\t\t\t\t\trotateUV(cube.faces.north.uv, 2)\n\t\t\t\t\t\trotateUV(cube.faces.down.uv, 2)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcube.faces.west.rotation = rotateUVFace(cube.faces.west.rotation, 1)\n\t\t\t\t\t\tcube.faces.east.rotation = rotateUVFace(cube.faces.east.rotation, 3)\n\t\t\t\t\t\tcube.faces.north.rotation= rotateUVFace(cube.faces.north.rotation, 2)\n\t\t\t\t\t\tcube.faces.down.rotation = rotateUVFace(cube.faces.down.rotation, 2)\n\t\t\t\t\t}\n\n\t\t\t\t\tvar temp = cube.faces.north\n\t\t\t\t\tcube.faces.north = cube.faces.down\n\t\t\t\t\tcube.faces.down = cube.faces.south\n\t\t\t\t\tcube.faces.south = cube.faces.up\n\t\t\t\t\tcube.faces.up = temp\n\t\t\t\t\t\n\t\t\t\t\tfor (var i = 0; i < 6; i++) {\n\t\t\t\t\t\tcube.faces[this.allFaces[i]].cullface = {\"down\": \"north\", \"south\": \"down\", \"up\": \"south\", \"north\": \"up\", \"east\": \"east\", \"west\": \"west\"}[cube.faces[this.allFaces[i]].cullface]\n\t\t\t\t\t}\n\n\t\t\t\t} else if (axis === 1) {\n\t\t\t\t\tif (uvlock) {\n\t\t\t\t\t\trotateUV(cube.faces.up.uv, 3)\n\t\t\t\t\t\trotateUV(cube.faces.down.uv, 1)\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcube.faces.up.rotation= rotateUVFace(cube.faces.up.rotation, 1)\n\t\t\t\t\t\tcube.faces.down.rotation = rotateUVFace(cube.faces.down.rotation, 3)\n\t\t\t\t\t}\n\n\t\t\t\t\tvar temp = cube.faces.north\n\t\t\t\t\tcube.faces.north = cube.faces.west\n\t\t\t\t\tcube.faces.west = cube.faces.south\n\t\t\t\t\tcube.faces.south = cube.faces.east\n\t\t\t\t\tcube.faces.east = temp\n\t\t\t\t\t\n\t\t\t\t\tfor (var i = 0; i < 6; i++) {\n\t\t\t\t\t\tcube.faces[this.allFaces[i]].cullface = {\"west\": \"north\", \"south\": \"west\", \"east\": \"south\", \"north\": \"east\", \"up\": \"up\", \"down\": \"down\"}[cube.faces[this.allFaces[i]].cullface]\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (cube.rotation) {\n\t\t\t\t\t//Fine Rotations\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar temp_rot = undefined;\n\t\t\t\t\tvar temp_i = undefined;\n\t\t\t\t\twhile (i < 3) {\n\t\t\t\t\t\tif (i !== axis) {\n\t\t\t\t\t\t\tif (temp_rot === undefined) {\n\t\t\t\t\t\t\t\ttemp_rot = cube.rotation[i]\n\t\t\t\t\t\t\t\ttemp_i = i\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcube.rotation[temp_i] = -cube.rotation[i]\n\t\t\t\t\t\t\t\tcube.rotation[i] = temp_rot\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t\n\tloadModel(model, textures = {}) {\n\t\tlet fs = getFS();\n\t\tvar cubes = []\n\t\tvar path = this.getResourcePath(\"models\", model + \".json\")\n\t\tvar data = JSON.parse(fs.readFileSync(path, \"utf8\"))\n\t\tif (Object.keys(data).indexOf(\"textures\") >= 0) {\n\t\t\tvar newTextureList = Object.keys(data.textures)\n\t\t\tvar oldTextureList = Object.keys(textures)\n\t\t\tfor (var i=0; i < newTextureList.length; i++) {\n\t\t\t\ttextures[newTextureList[i]] = data.textures[newTextureList[i]]\n\t\t\t\tfor (var j=0; j < oldTextureList.length; j++) {\n\t\t\t\t\tif (data.textures[newTextureList[i]] == \"#\" + oldTextureList[j]) {\n\t\t\t\t\t\ttextures[newTextureList[i]] = textures[oldTextureList[j]]\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(data).indexOf(\"elements\") >= 0) {\n\t\t\tfor (var i=0; i < data.elements.length; i++) {\n\t\t\t\tvar element = data.elements[i]\n\t\t\t\tvar cube = {\"faces\": {\"north\": {}, \"east\": {}, \"south\": {}, \"west\": {}, \"up\": {}, \"down\": {}}}\n\t\t\t\tcube.from = element.from\n\t\t\t\tcube.to = element.to\n\t\t\t\tif (element.rotation && element.rotation.axis != 0) {\n\t\t\t\t\tcube.rotation = [0, 0, 0]\n\t\t\t\t\tcube.rotation[{\"x\": 0, \"y\": 1, \"z\": 2}[element.rotation.axis]] = element.rotation.angle\n\t\t\t\t\tcube.origin = element.rotation.origin\n\t\t\t\t\tcube.rescale = element.rotation.rescale\n\t\t\t\t}\n\t\t\t\tcube.shade = element.shade\n\t\t\t\tfor (var faceIndex=0; faceIndex < this.allFaces.length; faceIndex++) {\n\t\t\t\t\tvar face = this.allFaces[faceIndex]\n\t\t\t\t\tif (face in element.faces) {\n\t\t\t\t\t\tcube.faces[face].texture = this.getTextureVariable(textures[this.removeHashtag(element.faces[face].texture)])\n\t\t\t\t\t\tcube.faces[face].rotation = element.faces[face].rotation\n\t\t\t\t\t\tcube.faces[face].cullface = element.faces[face].cullface\n\t\t\t\t\t\tcube.faces[face].tint = element.faces[face].tintindex != null\n\t\t\t\t\t\tif (\"uv\" in element.faces[face]) {\n\t\t\t\t\t\t\tcube.faces[face].uv = element.faces[face].uv\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tswitch (faceIndex) {\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [16-cube.to[0], 16-cube.to[1], 16-cube.from[0], 16-cube.from[1]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [16-cube.to[2], 16-cube.to[1], 16-cube.from[2], 16-cube.from[1]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [cube.from[0], 16-cube.to[1], cube.to[0], 16-cube.from[1]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [cube.from[2], 16-cube.to[1], cube.to[2], 16-cube.from[1]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [cube.from[0], cube.from[2], cube.to[0], cube.to[2]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\t\tcube.faces[face].uv = [cube.from[0], 16-cube.to[2], cube.to[0], 16-cube.from[2]]\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcube.faces[face].texture = null\n\t\t\t\t\t\tcube.faces[face].uv = [0, 0, 16, 16]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcubes.push(cube)\n\t\t\t}\n\t\t}\n\t\telse if (Object.keys(data).indexOf(\"parent\") >= 0) {\n\t\t\treturn this.loadModel(data.parent, textures)\n\t\t}\n\t\treturn cubes\n\t}\n\t\n\tgetTextureVariable(path) {\n\t\tif (path in this.textureVariables) {\n\t\t\treturn this.textureVariables[path]\n\t\t}\n\t\telse {\n\t\t\tvar texture = new Texture().fromPath(this.getResourcePath(\"textures\", path + \".png\")).add(false)\n\t\t\tthis.texturesAdded.push(texture)\n\t\t\tvar variable = texture.uuid\n\t\t\tthis.textureVariables[path] = variable\n\t\t\treturn variable\n\t\t}\n\t}\n\t\n\tremoveHashtag(texture) {\n\t\tif (texture.charAt(0) == \"#\") {\n\t\t\treturn texture.slice(1)\n\t\t}\n\t\treturn texture\n\t}\n\t\n\taddModel(state, cullsides, position, scale) {\n\t\tvar cubes = this.palette[state]\n\t\tfor (var i=0; i < cubes.length; i++) {\n\t\t\tvar cube = new Cube()\n\t\t\tcube.autouv = 0\n\t\t\tif (cubes[i].rotation) {\n\t\t\t\tcube.rotation = cubes[i].rotation\n\t\t\t\tcube.rescale = cubes[i].rescale\n\t\t\t}\n\t\t\tfor (var j=0; j<3; j++) {\n\t\t\t\tcube.from[j] = cubes[i].from[j] * scale + position[j]\n\t\t\t\tcube.to[j] = cubes[i].to[j] * scale + position[j]\n\t\t\t\tif (cubes[i].origin) {\n\t\t\t\t\tcube.origin[j] = cubes[i].origin[j] * scale + position[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcube.shade = cubes[i].shade\n\t\t\tvar cubeVisible = false\n\t\t\tfor (var faceIndex=0; faceIndex < this.allFaces.length; faceIndex++) {\n\t\t\t\tvar face = this.allFaces[faceIndex]\n\t\t\t\tif (! cullsides[cubes[i].faces[face].cullface] && cubes[i].faces[face].texture != null) {\n\t\t\t\t\tcube.faces[face].texture = cubes[i].faces[face].texture\n\t\t\t\t\tcube.faces[face].uv = cubes[i].faces[face].uv\n\t\t\t\t\tcube.faces[face].rotation = cubes[i].faces[face].rotation\n\t\t\t\t\tcube.faces[face].tint = cubes[i].faces[face].tint\n\t\t\t\t\tcubeVisible = true\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcube.faces[face].texture = null\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cubeVisible) {\n\t\t\t\tcube.init()\n\t\t\t\t// elements.push(cube)\n\t\t\t\tcube.addTo(this.group)\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "plugins/texture_downscaler/LICENSE.MD",
    "content": "MIT License\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "plugins/texture_downscaler/about.md",
    "content": "Downscales your textures to a lower resolution **non-destructively**. Use your high-resolution source textures, while previewing and exporting them as their downscaled low-resolution counterparts.\n\nRight-click a texture and choose `Downscale Texture...`, then choose your target resolution and downsampling method.\n\nOnly glTF export will use the downscaled texture. OBJ and FBX export will use the original high-resolution version.\n"
  },
  {
    "path": "plugins/texture_downscaler/members.yml",
    "content": "maintainers:\n  - mr0x13f\ndevelopers:\n  - mr0x13f\n"
  },
  {
    "path": "plugins/texture_downscaler/texture_downscaler.js",
    "content": "(function() {\n\nlet deferred = [];\n\n//  ########  ##       ##     ##  ######   #### ##    ## \n//  ##     ## ##       ##     ## ##    ##   ##  ###   ## \n//  ##     ## ##       ##     ## ##         ##  ####  ## \n//  ########  ##       ##     ## ##   ####  ##  ## ## ## \n//  ##        ##       ##     ## ##    ##   ##  ##  #### \n//  ##        ##       ##     ## ##    ##   ##  ##   ### \n//  ##        ########  #######   ######   #### ##    ## \n\nPlugin.register('texture_downscaler', {\n\n    title:         'Texture Downscaler',\n    author:        '0x13F',\n    description:   'Downscale textures non-destructively',\n    icon:          'icon.png',\n    creation_date: '2025-10-26',\n    version:       '1.0.0',\n    variant:       'both',\n    min_version:   '5.0.3',\n    has_changelog: false,\n    tags:          [ 'Texture', 'Viewport', 'Utility' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/texture_downscaler',\n    \n    onload() {\n\n        // Downscale properties for Texture\n        deferDelete(new Property(Texture, 'number', 'downscale_target_width',  {default: undefined}));\n        deferDelete(new Property(Texture, 'number', 'downscale_target_height', {default: undefined}));\n        deferDelete(new Property(Texture, 'string', 'downscale_filter', {default: undefined}));\n\n        // Downscale action\n        let downscaleAction = deferDelete(new Action('downscale_texture', {\n            name: 'Downscale Texture...',\n            icon: 'photo_size_select_large',\n\t\t    category: 'textures',\n\t\t    condition: () => Texture.selected,\n            click() {  \n                downscaleDialog.show();\n            },\n        }));\n        insertAfterAndDeferRemove(MenuBar.menus.image.structure, 'resize_texture', downscaleAction)\n        insertAfterAndDeferRemove(Texture.prototype.menu.structure, 'resize_texture', downscaleAction)\n\n        // Downscale dialog\n        let downscaleDialog = deferDelete(new Dialog('downscale_dialog', {\n            title: 'Downscale Texture',\n            form: {\n                ['info']: {\n                    type: 'info',\n                    text: 'Non-destructively downscale texture.',\n                },\n                ['ratio']: {\n                    type: 'number',\n                    label: 'Scale',\n                    value: 4,\n                    min: 1,\n                },\n                ['target']: {\n                    type: 'vector',\n                    label: 'Target Size',\n                    dimensions: 2,\n                    value: [128, 128],\n                    min: 1,\n                    max: 2048,\n                },\n                ['filter']: {\n                    type: 'select',\n                    label: 'Downsampling Filter',\n                    options: {\n                        ['nearest']: 'Nearest',\n                        ['linear' ]: 'Linear',\n                    },\n                    value: 'nearest',\n                },\n            },\n            onOpen() {\n                onOpenDownscaleDialog(downscaleDialog)\n            },\n            onConfirm(result) {\n                onConfirmDownscaleDialog(result)\n            },\n        }));\n\n        // Alter properties dialog\n        // Hook into Texture.openMenu() to edit the dialog after it's opened\n        replaceMethod(Texture, 'openMenu', function (original) {\n            original();\n            let dialog = Dialog.stack[0];\n            alterTexturePropertiesDialog(dialog);\n        });\n\n        // Hook into Texture.updateMaterial() to update the downscaled version of the texture\n        // whenever the original changes\n        replaceMethod(Texture, 'updateMaterial', function (original) {\n            original();\n            updateDownscaledTexture(this);\n            return this;\n        });\n\n        // Hook into Texture.load() to make sure downscaled version\n        // is updated whenever a texture is first loaded\n        replaceMethod(Texture, 'load', function (original, cb) {\n            return original((texture) => {\n                updateDownscaledTexture(texture);\n                updateTexturesPanelItem(texture);\n                if (cb != undefined)\n                    return cb(texture);\n            });\n        });\n\n        // Hook into Texture.updateLayerChanges() to make sure the downscaled version\n        // is updated when a texture gets painted on in Paint mode\n        replaceMethod(Texture, 'updateLayerChanges', function (original, update_data_url) {\n            original(update_data_url);\n            updateDownscaledTexture(this);\n            return this;\n        });\n\n        // Update any textures that are already loaded when the plugin loads\n        updateAllDownscaledTextures();\n        updateAllTexturesPanelItems();\n\n        // Update textures when switching projects\n        deferDelete(Blockbench.addListener('select_project',\n            () => setTimeout(updateAllTexturesPanelItems)));\n\n        // Restore all textures to their original versions when the plugin is unloaded\n        defer(restoreAllDownscaledTextures);\n        defer(restoreAllTexturePanelItems);\n    },\n\n    onunload() {\n        runDeferred();\n    },\n\n});\n\n//  ######## ######## ##     ## ######## ##     ## ########  ########  ######  \n//     ##    ##        ##   ##     ##    ##     ## ##     ## ##       ##    ## \n//     ##    ##         ## ##      ##    ##     ## ##     ## ##       ##       \n//     ##    ######      ###       ##    ##     ## ########  ######    ######  \n//     ##    ##         ## ##      ##    ##     ## ##   ##   ##             ## \n//     ##    ##        ##   ##     ##    ##     ## ##    ##  ##       ##    ## \n//     ##    ######## ##     ##    ##     #######  ##     ## ########  ######  \n\nfunction updateAllDownscaledTextures() {\n    for (let texture of ModelProject.all.flatMap(p => p.textures))\n        updateDownscaledTexture(texture);\n}\n\nfunction updateDownscaledTexture(texture) {\n\n    // Downscaling disabled\n    if (!texture.downscale_target_width) {\n        if (texture.material.map.image !== texture.canvas) {\n            texture.material.map.image = texture.canvas;\n            texture.material.map.needsUpdate = true;\n        }\n        return;\n    }\n\n    if (texture.downscale_canvas == undefined) {\n        texture.downscale_canvas = document.createElement('canvas');\n        texture.downscale_ctx = texture.downscale_canvas.getContext('2d');\n    }\n\n    texture.downscale_canvas.width  = texture.downscale_target_width;\n    texture.downscale_canvas.height = texture.downscale_target_height;\n\n    // Smoothing quality 'medium' should be linear\n    texture.downscale_ctx.imageSmoothingQuality = 'medium';\n    texture.downscale_ctx.imageSmoothingEnabled = texture.downscale_filter === 'linear';\n\n    texture.downscale_ctx.drawImage(texture.canvas, 0, 0, texture.downscale_target_width, texture.downscale_target_height);\n\n    // Tell THREE.js to use the right canvas\n    let isDownscaled = texture.downscale_target_width < texture.width;\n    texture.material.map.image = isDownscaled ? texture.downscale_canvas : texture.canvas;\n    texture.material.map.needsUpdate = true;\n}\n\nfunction restoreAllDownscaledTextures() {\n    restoreAllTexturePanelItems();\n    for (let texture of ModelProject.all.flatMap(p => p.textures)) {\n        texture.material.map.image = texture.canvas;\n        texture.material.map.needsUpdate = true;\n    }\n}\n\n//  ########     ###    ##    ## ######## ##       \n//  ##     ##   ## ##   ###   ## ##       ##       \n//  ##     ##  ##   ##  ####  ## ##       ##       \n//  ########  ##     ## ## ## ## ######   ##       \n//  ##        ######### ##  #### ##       ##       \n//  ##        ##     ## ##   ### ##       ##       \n//  ##        ##     ## ##    ## ######## ######## \n\nfunction updateAllTexturesPanelItems() {\n    for (let texture of Texture.all)\n        updateTexturesPanelItem(texture);\n}\n\nfunction updateTexturesPanelItem(texture) {\n    let textureLi = document.querySelector(`#texture_list>[texid=\"${texture.uuid}\"]`);\n    if (textureLi == undefined)\n        return;\n\n    let ratio = texture.width / (texture.downscale_target_width || texture.width);\n    ratio = Math.roundTo(ratio, 2);\n\n    textureLi.style.alignItems = 'start';\n    let textureResDiv = textureLi.querySelector(`.texture_res`);\n    textureResDiv.style.transform = ratio > 1 ? 'translateY(-5px)' : '';\n\n    if (textureResDiv.nextElementSibling == undefined) {\n        textureResDiv.parentElement.appendChild(Interface.createElement('div', {\n            class: 'texture_res texture_downscale',\n            style: 'transform: translateY(-10px);',\n        }));\n    }\n\n    textureResDiv.nextElementSibling.style.display = ratio > 1 ? 'block' : 'none';\n    textureResDiv.nextElementSibling.textContent = `Downscaled 1:${ratio} (${texture.downscale_filter})`;\n}\n\nfunction restoreAllTexturePanelItems() {\n    for (let texture of ModelProject.all.flatMap(p => p.textures)) {\n        let textureLi = document.querySelector(`#texture_list>[texid=\"${texture.uuid}\"]`);\n        if (textureLi == undefined)\n            continue;\n\n        let textureResDiv = textureLi.querySelector(`.texture_res`);\n        textureResDiv.style.transform = '';\n\n        textureResDiv.nextElementSibling?.remove();\n    }\n}\n\n//  ########  ####    ###    ##        #######   ######   \n//  ##     ##  ##    ## ##   ##       ##     ## ##    ##  \n//  ##     ##  ##   ##   ##  ##       ##     ## ##        \n//  ##     ##  ##  ##     ## ##       ##     ## ##   #### \n//  ##     ##  ##  ######### ##       ##     ## ##    ##  \n//  ##     ##  ##  ##     ## ##       ##     ## ##    ##  \n//  ########  #### ##     ## ########  #######   ######   \n\nfunction onOpenDownscaleDialog(dialog) {\n    let texture = Texture.selected;\n    let ratio = texture.width / (texture.downscale_target_width || texture.width);\n    ratio = Math.roundTo(ratio, 2);\n    let targetWidth = texture.downscale_target_width || texture.width;\n    let targetHeight = texture.downscale_target_height || texture.height;\n\n    let ratioInput        = dialog.object.querySelector('#ratio');\n    let targetWidthInput  = dialog.object.querySelector('#target_0');\n    let targetHeightInput = dialog.object.querySelector('#target_1');\n    let filterInput       = dialog.object.querySelector('#filter');\n\n    ratioInput.value        = '' + ratio;\n    targetWidthInput.value  = '' + targetWidth;\n    targetHeightInput.value = '' + targetHeight;\n    filterInput.value       = texture.downscale_filter || 'nearest';\n\n    ratioInput.oninput        = () => changeRatio('ratio',  false);\n    targetWidthInput.oninput  = () => changeRatio('width',  false);\n    targetHeightInput.oninput = () => changeRatio('height', false);\n\n    function changeRatio(changed) {\n        let result = dialog.getFormResult();\n\n        let newRatio = changed == 'ratio'  ? result.ratio\n                     : changed == 'width'  ? texture.width  / result.target[0]\n                     : changed == 'height' ? texture.height / result.target[1]\n                     : 1;\n\n        newRatio = Math.max(1, Math.roundTo(newRatio, 2));\n        let newWidth  = Math.ceil(texture.width / newRatio);\n        let newHeight = Math.ceil(texture.height / newRatio);\n\n        if (changed != 'ratio')  ratioInput.value        = '' + newRatio;\n        if (changed != 'width')  targetWidthInput.value  = '' + newWidth;\n        if (changed != 'height') targetHeightInput.value = '' + newHeight;\n    } \n}\n\nfunction onConfirmDownscaleDialog(result) {\n    let texture = Texture.selected;\n\n    Undo.initEdit({ textures: [texture] });\n\n    texture.downscale_target_width = result.target[0];\n    texture.downscale_target_height = result.target[1];\n    texture.downscale_filter = result.filter;\n\n    Undo.finishEdit('Change texture downscaling');\n\n    updateDownscaledTexture(texture);\n    updateTexturesPanelItem(texture);\n}\n\n//  ########  ########   #######  ########  ######## ########  ######## #### ########  ######  \n//  ##     ## ##     ## ##     ## ##     ## ##       ##     ##    ##     ##  ##       ##    ## \n//  ##     ## ##     ## ##     ## ##     ## ##       ##     ##    ##     ##  ##       ##       \n//  ########  ########  ##     ## ########  ######   ########     ##     ##  ######    ######  \n//  ##        ##   ##   ##     ## ##        ##       ##   ##      ##     ##  ##             ## \n//  ##        ##    ##  ##     ## ##        ##       ##    ##     ##     ##  ##       ##    ## \n//  ##        ##     ##  #######  ##        ######## ##     ##    ##    #### ########  ######  \n\nfunction alterTexturePropertiesDialog(dialog) {\n\n    let nameInput = dialog.object.querySelector('#name');\n    let form = nameInput.parentElement.parentElement;\n\n    let texture = Texture.selected;\n    let ratio = texture.width / (texture.downscale_target_width || texture.width);\n    ratio = Math.roundTo(ratio, 2);\n    let downscaleText = ratio > 1 ? `1:${ratio} (${texture.downscale_filter})` : 'Disabled';\n\n    let editButton =  Interface.createElement('button', {\n        style: 'height: 100%; min-width: 80px; margin-left: 10px;',\n    }, 'Edit');\n    editButton.onclick = () => {\n        dialog.close();\n        BarItems['downscale_texture'].trigger();\n    };\n\n    form.appendChild(Interface.createElement('hr'));\n    form.appendChild(Interface.createElement('div',\n        { class: 'dialog_bar bar form_bar', },\n        [\n            Interface.createElement('label', {\n                class: 'name_space_left',\n                for: 'downscaling',\n            }, 'Downscaling'),\n            Interface.createElement('div', {\n                id: 'downscaling',\n                class: 'half',\n            }, [\n                downscaleText,\n                editButton,\n            ]),\n        ],\n    ));\n    \n}\n\n//  ##     ## ######## #### ##       \n//  ##     ##    ##     ##  ##       \n//  ##     ##    ##     ##  ##       \n//  ##     ##    ##     ##  ##       \n//  ##     ##    ##     ##  ##       \n//  ##     ##    ##     ##  ##       \n//   #######     ##    #### ######## \n\nfunction replaceMethod(klass, methodName, newMethod) {\n    let originalMethod = klass.prototype[methodName];\n    klass.prototype[methodName] = function (...args) {\n        let originalCaller = (...a) => originalMethod.apply(this, a);\n        return newMethod.apply(this, [originalCaller, ...args]);\n    };\n    defer(() => klass.prototype[methodName] = originalMethod);\n}\n\nfunction insertAfterAndDeferRemove(array, before, item) {\n    array.splice(array.indexOf(before) + 1, 0, item);\n    defer(() => array.remove(item));\n}\n\nfunction defer(lambda) {\n    deferred.push(lambda);\n}\n\nfunction deferDelete(deletable) {\n    defer(() => deletable.delete());\n    return deletable;\n}\n\nfunction runDeferred() {\n    for (let lambda of deferred.reverse())\n        lambda();\n}\n\n})();\n"
  },
  {
    "path": "plugins/texture_filtering/texture_filtering.js",
    "content": "// Based on the Repeating Textures plugin by 0x13F with permission. Thanks!\n(function() {\n\nlet deferred = [];\n\nPlugin.register('texture_filtering', {\n\n    title:         'Texture Filtering',\n    author:        'HeyItsDuke, 0x13F',\n    description:   'Toggles between Nearest (Pixelated, Blockbench default) and Linear texture filtering (Soft/Blurry)',\n    icon:          'deblur',\n    creation_date: '2025-09-01',\n    version:       '1.0.0',\n    variant:       'both',\n    min_version:   '4.12.4',\n    has_changelog: false,\n    tags:          [ 'Texture', 'Viewport', 'Utility' ],\n\trepository:    'https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/texture_filtering',\n    \n    onload() {\n\n        // Hook into the Texture.getMaterial() method to set the filter mode\n        {\n            let original = Texture.prototype.getMaterial;\n            Texture.prototype.getMaterial = function () {\n                let result = original.apply(this);\n                updateTextureFilterMode(this);\n                return result;\n            };\n            defer(() => Texture.prototype.getMaterial = original);\n        }\n\n        // Setting\n        deferDelete(new Setting('texture_filtering', {\n            name: 'Texture Filtering',\n            description: 'Toggles between Nearest (Blockbench default) and Linear texture filtering',\n            category: 'view',\n            value: true,\n            onChange() {\n                updateAllTextureFilterModes();\n            },\n        }));\n\n        // Toggle\n        let filterTexturesToggle = deferDelete(new Toggle('texture_filtering_toggle', {\n            name: 'Texture Filtering',\n            description: 'Toggles between Nearest (Blockbench default) and Linear texture filtering',\n            icon: 'deblur',\n            category: 'view',\n            linked_setting: 'texture_filtering',\n        }));\n        let shadingToggleIndex = MenuBar.menus.view.structure.indexOf('toggle_shading');\n        let filterTexturesToggleIndex = shadingToggleIndex + 1;\n        MenuBar.menus.view.structure.splice(filterTexturesToggleIndex, 0, filterTexturesToggle);\n        defer(() => MenuBar.menus.view.structure.splice(MenuBar.menus.view.structure.indexOf(filterTexturesToggle), 1));\n\n        // Apply setting on load\n        updateAllTextureFilterModes();\n        // Disable on unload\n        defer(() => updateAllTextureFilterModes(false));\n\n    },\n\n    onunload() {\n\n        for (let lambda of deferred.reverse())\n            lambda();\n        \n    },\n\n});\n\nfunction updateAllTextureFilterModes(force = undefined) {\n\n    for (let texture of Texture.all)\n        updateTextureFilterMode(texture, force);\n\n}\n\n// update the filter mode for a specific texture\n// based on the filter_textures setting, \n// unless a 'force' parameter is given (true or false)\nfunction updateTextureFilterMode(texture, force = undefined) {\n\n    // Decide whether to use filtered or non-filtered textures\n    let useFiltering;\n    // if a 'force' parameter was given, use that\n    if (force != undefined) {\n        useFiltering = force;\n    // otherwise read the 'filter_textures' setting from blockbench\n    // which we created earlier\n    } else {\n        useFiltering = Settings.get('texture_filtering');\n    }\n\n    // The actual value THREE.js wants for the filter mode we want to use \n    let filterMode;\n    // If we want filtered textures, use THREE.LinearFilter\n    if (useFiltering) {\n        filterMode = THREE.LinearFilter;\n    // Otherwise use the default THREE.NearestFilter\n    } else {\n        filterMode = THREE.NearestFilter;\n    }\n\n    // Find the texture object we need to edit\n    // In Blockbench 5.0 the object was moved from texture.img.tex to texture.material.map\n    let map;\n    // If texture.material.map exists that means we're in 5.0 so we'll use that\n    if (texture.material?.map) {\n        map = texture.material.map;\n    // Otherwise use the old texture.img.tex\n    } else {\n        map = texture.img.tex;\n    }\n\n    // If the filter mode is already correct, stop early\n    if (map.minFilter === filterMode && map.magFilter === filterMode) {\n        return;\n    }\n\n    // Set the filter mode\n    map.minFilter = filterMode;\n    map.magFilter = filterMode;\n\n    // Let THREE.js know we changed something\n    map.needsUpdate = true;\n\n}\n\nfunction defer(lambda) {\n    deferred.push(lambda);\n}\n\nfunction deferDelete(deletable) {\n    if (deletable.delete == undefined) {\n        console.warn('deferDelete() called with object that isn\\'t deletable: ', deletable);\n        return;\n    }\n    defer(() => deletable.delete());\n    return deletable;\n}\n\n})();\n"
  },
  {
    "path": "plugins/texture_stitcher/about.md",
    "content": "**Texture stitcher** is a plugin that allows you to take currently imported textures in the **Textures** tab and combine (stitch) them into a single texture.\n\nThis is useful when you need to convert/export the textures for specific format that doesn't support multiple textures (Bedrock Model, GeckoLib/AzureLib, BBS mod, etc.).\n\nYou can access this feature by right clicking anywhere in the **Textures** tab and clicking **Stitch all textures** option.\n\n**IMPORTANT**: be really careful when you mix **Box UV** with **Per-face** UV modes! It can greatly inflate the size of the texture for the sake of working correctly with **Box UV** elements!"
  },
  {
    "path": "plugins/texture_stitcher/changelog.json",
    "content": "{\n\t\"1.0.4\": {\n\t\t\"title\": \"1.0.4\",\n\t\t\"date\": \"2024-06-13\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Improved the box packing code to pack boxes much better\",\n                    \"Implemented proper support for mixed Box UV and Per-face UV modes\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.5\": {\n\t\t\"title\": \"1.0.5\",\n\t\t\"date\": \"2024-06-14\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed the plugin not loading correctly due to Blockbench 4.8.0 minimal version\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.6\": {\n\t\t\"title\": \"1.0.6\",\n\t\t\"date\": \"2024-06-19\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed UV coordinates broken in Java Block/Item\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.7\": {\n\t\t\"title\": \"1.0.7\",\n\t\t\"date\": \"2024-09-06\",\n\t\t\"author\": \"McHorse\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added dialog to able specify padding\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "plugins/texture_stitcher/texture_stitcher.js",
    "content": "(function() {\n    var button;\n    var createRect = (x, y, w, h) => { return {x, y, w, h}; };\n\n    function packBoxes(boxes, padding)\n    {\n        var areas = [];\n        var w = getInitialWidth(boxes, padding);\n        var finalW = 0;\n        var finalH = 0;\n\n        boxes.sort((a, b) => b.h - a.h);\n        areas.push(createRect(0, 0, w, Number.MAX_VALUE));\n\n        boxes.forEach((box) =>\n        {\n            for (var i = areas.length - 1; i >= 0; i--)\n            {\n                var area = areas[i];\n\n                if (box.w > area.w || box.h > area.h)\n                {\n                    continue;\n                }\n\n                box.x = area.x;\n                box.y = area.y;\n\n                finalH = Math.max(finalH, box.y + box.h);\n                finalW = Math.max(finalW, box.x + box.w);\n\n                if (box.w == area.w && box.h == area.h)\n                {\n                    var last = areas.pop();\n\n                    if (i < areas.length)\n                    {\n                        areas.set(i, last);\n                    }\n                }\n                else if (box.h == area.h)\n                {\n                    area.x += box.w;\n                    area.w -= box.w;\n\n                }\n                else if (box.w == area.w)\n                {\n                    area.y += box.h;\n                    area.h -= box.h;\n\n                }\n                else\n                {\n                    areas.push(createRect(area.x + box.w, area.y, area.w - box.w, box.h));\n\n                    area.y += box.h;\n                    area.h -= box.h;\n                }\n\n                break;\n            }\n        });\n\n        /* Remove padding from boxes and add them to the final area */\n        if (padding != 0)\n        {\n            boxes.forEach(glyph =>\n            {\n                glyph.w -= padding;\n                glyph.h -= padding;\n                glyph.x += padding;\n                glyph.y += padding;\n            });\n\n            finalW += padding;\n            finalH += padding;\n        }\n\n        return [finalW, finalH];\n    }\n\n    function getInitialWidth(glyphs, padding)\n    {\n        var totalArea = 0;\n        var maxW = 0;\n\n        glyphs.forEach(box =>\n        {\n            box.w += padding;\n            box.h += padding;\n\n            totalArea += box.w * box.h;\n            maxW = Math.max(maxW, box.w);\n        });\n\n        return Math.max(Math.ceil(Math.sqrt(totalArea)), maxW);\n    }\n\n    function calculateRects(userPadding)\n    {\n        var rects = [];\n        var maxScale = 1;\n        var minScale = 1;\n        var resize = false;\n\n        Cube.all.forEach(c => \n        {\n            if (c.box_uv)\n            {\n                resize = true;\n            }\n        });\n\n        Texture.all.forEach(t =>\n        {\n            maxScale = Math.max(maxScale, t.width / t.uv_width);\n            minScale = Math.min(minScale, t.width / t.uv_width);\n        });\n\n        maxScale /= minScale;\n        minScale = 1;\n\n        Texture.all.forEach(texture =>\n        {\n            var uv_scale = texture.width / texture.uv_width;\n            var w = texture.width;\n            var h = texture.height;\n            var scale = resize ? 1 / uv_scale * maxScale : 1;\n            var rect = createRect(0, 0, w * scale, h * scale);\n\n            rect.texture = texture;\n            rect.scale = scale;\n            rect.uv_scale = uv_scale;\n\n            rects.push(rect);\n        });\n\n        var padding = userPadding * (resize ? maxScale : 1);\n        var size = packBoxes(rects, padding);\n\n        return {\n            w: size[0],\n            h: size[1],\n            rects: rects,\n            max_scale: maxScale,\n            resize: resize\n        };\n    }\n\n    function stitchTextures(userPadding)\n    {\n        const data = calculateRects(userPadding);\n        const rects = data.rects;\n\n        const offscreen = new OffscreenCanvas(data.w, data.h);\n        const c = offscreen.getContext('2d');\n\n        /* Turn off AA */\n        c.imageSmoothingEnabled = false;\n\n        rects.forEach(rect => drawToCanvas(c, rect));\n\n        const config = {\n            type: 'image/png' \n        };\n\n        offscreen.convertToBlob(config).then(blob => {\n            var reader = new FileReader();\n            \n            reader.readAsDataURL(blob);\n            reader.onloadend = () => replaceTextures(data, reader.result);\n        });\n    }\n\n    function drawToCanvas(c, rect)\n    {\n        c.drawImage(rect.texture.img, rect.x, rect.y, rect.w, rect.h)\n    }\n\n    function replaceTextures(data, imageData)\n    {\n        var maxScale = data.max_scale, resize = data.resize;\n        var rects = data.rects, w = data.w, h = data.h;\n\n        if (resize)\n        {\n            w /= maxScale;\n            h /= maxScale;\n        }\n\n        const getRect = texture_uuid =>\n        {\n            for (var i = 0; i < rects.length; i++)\n            {\n                if (rects[i].texture.uuid === texture_uuid)\n                {\n                    return rects[i];\n                }\n            }\n\n            return null;\n        };\n\n        var sides = ['north', 'east', 'south', 'west', 'up', 'down']\n        var texture = new Texture({\n            mode: 'bitmap',\n            name: 'stiched_texture',\n            keep_size : true\n        });\n\n        var ts = Texture.all;\n        var elems = Cube.all;\n\n        if (Mesh)\n        {\n            elems = elems.concat(Mesh.all);\n        }\n\n        Undo.initEdit({\n            elements: elems,\n            textures: ts,\n            bitmap: true,\n            uv_mode: true\n        });\n\n        var newTextures = [];\n        ts.forEach(t => newTextures.push(t));\n        newTextures.forEach(t => t.remove(true));\n\n        texture.fromDataURL(imageData).add(false).select();\n        texture.uv_width = w;\n        texture.uv_height = h;\n\n        /* Required to work in Java Block/Item */\n        Project.texture_width = w;\n        Project.texture_height = h;\n\n        Cube.all.forEach(cube => \n        {\n            var toApplySides = [];\n\n            if (cube.box_uv)\n            {\n                var north = cube.faces['north'];\n                var rect = getRect(north.texture);\n\n                if (rect != null)\n                {\n                    cube.uv_offset[0] += rect.x / maxScale;\n                    cube.uv_offset[1] += rect.y / maxScale;\n                }\n\n                toApplySides = north.texture !== false;\n            }\n            else\n            {\n                sides.forEach(side =>\n                {\n                    var face = cube.faces[side];\n                    var rect = getRect(face.texture);\n    \n                    if (rect !== null)\n                    {\n                        var mx = resize ? 1 : rect.uv_scale;\n                        var my = resize ? 1 : rect.uv_scale;\n    \n                        face.uv[0] = face.uv[0] * mx + rect.x / (resize ? maxScale : 1);\n                        face.uv[1] = face.uv[1] * my + rect.y / (resize ? maxScale : 1);\n                        face.uv[2] = face.uv[2] * mx + rect.x / (resize ? maxScale : 1);\n                        face.uv[3] = face.uv[3] * my + rect.y / (resize ? maxScale : 1);\n    \n                        if (face.texture !== false)\n                        {\n                            toApplySides.push(side);\n                        }\n                    }\n                });\n            }\n\n            if (toApplySides !== false)\n            {\n                cube.applyTexture(texture, toApplySides);\n            }\n        });\n\n        if (Mesh)\n        {\n            Mesh.all.forEach(mesh =>\n            {\n                var applied = false;\n\n                Object.keys(mesh.faces).forEach(key =>\n                {\n                    var face = mesh.faces[key];\n                    var rect = getRect(face.texture);\n\n                    if (!rect)\n                    {\n                        return;\n                    }\n\n                    Object.keys(face.uv).forEach(key => \n                    {\n                        var uv = face.uv[key];\n                        var mx = resize ? 1 : rect.uv_scale;\n                        var my = resize ? 1 : rect.uv_scale;\n\n                        uv[0] = uv[0] * mx + rect.x / (resize ? maxScale : 1);\n                        uv[1] = uv[1] * my + rect.y / (resize ? maxScale : 1);\n\n                        applied = true;\n                    });\n                });\n\n                if (applied)\n                {\n                    mesh.applyTexture(texture, true);\n                }\n            });\n        }\n\n        Undo.finishEdit('finished stitching');\n    }\n\n    var stitchDialog = new Dialog({\n        id: \"texture_stitcher_stitch\",\n        title: \"Stitch textures\",\n        form: {\n            padding: {\n                label: \"Padding\",\n                type: \"number\",\n                min: 0,\n                max: 12,\n                step: 1,\n                value: 1\n            }\n        },\n        onConfirm(formData) \n        {\n            this.hide();\n\n            stitchTextures(formData.padding >= 0 ? formData.padding : 0)\n        }\n    });\n\n    Plugin.register('texture_stitcher', {\n        title: 'Texture Stitcher',\n        icon: 'fa-compress-arrows-alt',\n        author: 'McHorse',\n        description: 'Stitch multiple textures into a single texture',\n        version: '1.0.7',\n        min_version: \"4.8.0\",\n        tags: [\"Texture\"],\n        variant: 'both',\n        has_changelog: true,\n        onload() \n        {\n            button = new Action('texture_stitcher', {\n                name: 'Stitch all textures',\n                category: 'textures',\n                description: 'Stitch all of the textures into single texture (you might want to make a back up of the project)',\n                icon: 'fa-compress-arrows-alt',\n                click()\n                {\n                    stitchDialog.show();\n                }\n            });\n\n            Interface.Panels.textures.menu.addAction(button);\n            Texture.prototype.menu.addAction(button);\n        },\n        onunload() \n        {\n            button.delete();\n        }\n    });\n})();"
  },
  {
    "path": "plugins/threecore_exporter.js",
    "content": "(function() {\nlet type;\nlet bipedScale;\nlet bipedParent = {bipedHead:'head', bipedBody:'chest', bipedRightArm:'right_arm', bipedLeftArm:'left_arm', bipedRightLeg:'right_leg', bipedLeftLeg:'left_leg'};\nlet visibilityOverrides = {head:true, head_overlay:true, chest:true, chest_overlay:true, right_arm:true, right_arm_overlay:true, left_arm:true, left_arm_overlay:true, right_leg:true, right_leg_overlay:true, left_leg:true, left_leg_overlay:true};\n\nvar threeCoreCodec = new Codec('threecore_model', {\n\tname: 'ThreeCore Model',\n\textension: 'json',\n\tremember: false,\n\tcompile(options) {\n\t\tvar model = {\n\t\t\ttype: type,\n\t\t\tscale: bipedScale,\n\t\t\ttexture_width: Project.texture_width,\n\t\t\ttexture_height: Project.texture_height,\n\t\t\tvisibility_overrides: visibilityOverrides\n\t\t};\n\t\t\n\t\tvar cubes = [];\n\t\tOutliner.root.forEach(obj => {\n\t\t\tif (obj.type === 'cube') {\n\t\t\t\tcubes.push(createCube(obj, true));\n\t\t\t} else {\n\t\t\t\tvar cube = recurvBBGroup(obj, createCubeFromGroup(obj, true));\n\t\t\t\t\n\t\t\t\t// if type is biped, and cube's name is a biped part\n\t\t\t\tif (type === 'threecore:biped' && bipedParent.hasOwnProperty(cube.name)) {\n\t\t\t\t\tif (cube.hasOwnProperty('children')) {\n\t\t\t\t\t\t// go through the biped part's children and add parent property\n\t\t\t\t\t\tcube.children.forEach(childCube => {\n\t\t\t\t\t\t\tchildCube.parent = bipedParent[cube.name];\n\t\t\t\t\t\t\tcubes.push(childCube);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcubes.push(cube);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\tmodel.cubes = cubes;\n\t\treturn autoStringify(model);\n\t}\n});\n\nvar dialog = new Dialog({\n\tid: 'threecore_dialog',\n\ttitle: 'ThreeCore JSON Model',\n\tform: {\n\t\tmodelType: {\n\t\t\tlabel: 'Model Type',\n\t\t\ttype: 'select',\n\t\t\toptions: {\n\t\t\t\tthreecore_default: 'threecore:default',\n\t\t\t\tthreecore_biped: 'threecore:biped'\n\t\t\t}\n\t\t},\n\t\tbipedScale: {\n\t\t\tlabel: 'Biped Scale',\n\t\t\ttype: 'number',\n\t\t\tvalue: 0.00,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 0.1\n\t\t}\n\t},\n\tlines: [\n\t\t'<p>When you are done exporting your model, you need to put it in your addonpack, the path should be: <i>assets\\/&ltnamespace&gt\\/models\\/entity\\/</i></p>'\n\t],\n\tonConfirm: function (formData) {\n\t\tthis.hide();\n\t\tbipedScale = formData.bipedScale;\n\t\ttype = formData.modelType.replace('_', ':');\n\t\tvisibleOverridesDialog.show();\n\t}\n});\n\nvar visibleOverridesDialog = new Dialog({\n\tid: 'threecore_visible_overrides_dialog',\n\ttitle: 'Visiblity Overrides',\n\tlines: [\n\t\t'<p>This sets each biped part\\'s visibility for all armor item.</p>'\n\t], // This shows up as a paragraph in the dialog\n\tform: {\n\t\thead: {\n\t\t\tlabel: 'Head',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.head\n\t\t},\n\t\theadOverlay: {\n\t\t\tlabel: 'Head Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.head_overlay\n\t\t},\n\t\tchest: {\n\t\t\tlabel: 'Chest',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.chest\n\t\t},\n\t\tchestOverlay: {\n\t\t\tlabel: 'Chest Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.chest_overlay\n\t\t},\n\t\trightArm: {\n\t\t\tlabel: 'Right Arm',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.right_arm\n\t\t},\n\t\trightArmOverlay: {\n\t\t\tlabel: 'Right Arm Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.right_arm_overlay\n\t\t},\n\t\tleftArm: {\n\t\t\tlabel: 'Left Arm',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.left_arm\n\t\t},\n\t\tleftArmOverlay: {\n\t\t\tlabel: 'Left Arm Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.left_arm_overlay\n\t\t},\n\t\trightLeg: {\n\t\t\tlabel: 'Right Leg',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.right_leg\n\t\t},\n\t\trightLegOverlay: {\n\t\t\tlabel: 'Right Leg Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.right_leg_overlay\n\t\t},\n\t\tleftLeg: {\n\t\t\tlabel: 'Left Leg',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.left_leg\n\t\t},\n\t\tleftLegOverlay: {\n\t\t\tlabel: 'Left Leg Overlay',\n\t\t\ttype: 'checkbox',\n\t\t\tvalue: visibilityOverrides.left_leg_overlay\n\t\t}\n\t},\n\tonConfirm: function(formData) {\n\t\tthis.hide();\n\t\tfor (let key in formData) {\n\t\t\tlet newKey = \"\";\n\t\t\tfor (ch of key) {\n\t\t\t\tif (ch == ch.toUpperCase()) { // if character is uppercase, we append underscore\n\t\t\t\t\tnewKey += \"_\";\n\t\t\t\t}\n\t\t\t\tnewKey += ch.toLowerCase();\n\t\t\t}\n\t\t\tvisibilityOverrides[newKey] = formData[key]; // We assign the value of checkbox to our object\n\t\t}\n\t\tthreeCoreCodec.export();\n\t}\n});\n\nvar filterMenuItem = {\n\tid: 'filter_threecore',\n\tname: 'ThreeCore Exporter',\n\ticon: 'looks_3',\n\tcondition: () => Format.id === 'modded_entity',\n\tchildren: [\n\t\t{\n\t\t\tname: 'Generate Steve model',\n\t\t\ticon: 'icon-player',\n\t\t\tclick: function () {\n\t\t\t\tgenerateBipedModel(false);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tname: 'Generate Alex model',\n\t\t\ticon: 'icon-player',\n\t\t\tclick: function () {\n\t\t\t\tgenerateBipedModel(true);\n\t\t\t}\n\t\t}\n\t]\n};\nvar exportAction;\n\nPlugin.register(\"threecore_exporter\", {\n\ttitle: \"ThreeCore Exporter\",\n\tauthor: \"Lucas, Spyeedy\",\n\ticon: \"looks_3\",\n\tdescription: \"Let's you export your models in the json entity model format for the ThreeCore mod!\",\n\tversion: \"1.0.3\",\n\tvariant: \"both\",\n\tmin_version: \"3.7.5\",\n\tonload() {\n\t\texportAction = new Action({\n\t\t\tid: \"export_threecore\",\n\t\t\tname: \"Export ThreeCore entity model\",\n\t\t\ticon: \"archive\",\n\t\t\tdescription: \"Let's you export your models in the json entity model format for the ThreeCore mod!\",\n\t\t\tcategory: \"file\",\n\t\t\tcondition: () => Format.id === \"modded_entity\",\n\t\t\tclick: function () {\n\t\t\t\tdialog.show();\n\t\t\t}\n\t\t});\n\t\t\n\t\tMenuBar.addAction(exportAction, \"file.export\");\n\t\tMenuBar.addAction(filterMenuItem, \"filter\");\n\t},\n\tonunload() {\n\t\texportAction.delete();\n\t\tMenuBar.removeAction(\"filter.filter_threecore\");\n\t\tconsole.clear();\n\t}\n});\n\n// --- Util ---\nfunction dummyCube() {\n\treturn {\n\t\tname: \"\",\n\t\tscale: 0.0,\n\t\tmirror: false,\n\t\ttexture_offset: [0, 0],\n\t\toffset: [0.0, 0.0, 0.0],\n\t\trotation_point: [0.0, 0.0, 0.0],\n\t\tsize: [0, 0, 0],\n\t\trotation: [0.0, 0.0, 0.0]\n\t}\n}\n\nfunction createCube(obj, isRoot) {\t\n\tvar cube = dummyCube();\n\tcube.name = obj.name;\n\tcube.scale = obj.inflate;\n\tcube.mirror = obj.mirror_uv;\n\tcube.texture_offset[0] = Math.floor(obj.uv_offset[0]);\n\tcube.texture_offset[1] = Math.floor(obj.uv_offset[1]);\n\tcube.offset[0] = -obj.to[0];\n\tcube.offset[1] = -obj.to[1] + (isRoot ? 24 : 0); // if it's root, it has no parent, so we have to calculate immediately by 24-value. If it's not a root, meaning it's a child part, we pass the calculation to the parenting method (it corrects the offset and rotation point based on the parent values)\n\tcube.offset[2] = obj.from[2];\n\tcube.size[0] = obj.size(0, true);\n\tcube.size[1] = obj.size(1, true);\n\tcube.size[2] = obj.size(2, true);\n\n\tcube.rotation_point[0] = -obj.origin[0];\n\tcube.rotation_point[1] = -obj.origin[1] + (isRoot ? 24 : 0);\n\tcube.rotation_point[2] = obj.origin[2];\n\tcube.rotation[0] = -obj.rotation[0];\n\tcube.rotation[1] = -obj.rotation[1];\n\tcube.rotation[2] = obj.rotation[2];\n\t\n\treturn cube;\n}\n\nfunction createCubeFromGroup(group, isRoot) {\n\tvar cube = dummyCube();\n\t\n\tcube.name = group.name;\n\tcube.rotation_point[0] = -group.origin[0];\n\tcube.rotation_point[1] = -group.origin[1] + (isRoot ? 24 : 0);\n\tcube.rotation_point[2] = group.origin[2];\n\tcube.rotation[0] = -group.rotation[0];\n\tcube.rotation[1] = -group.rotation[1];\n\tcube.rotation[2] = group.rotation[2];\n\t\n\treturn cube;\n}\n\nfunction combineCubeIntoGroup(groupObj, groupCube, cube, cubeObj) {\n\tgroupCube.scale = cube.scale;\n\tgroupCube.mirror = cube.mirror;\n\tgroupCube.texture_offset = cube.texture_offset;\n\tgroupCube.size = cube.size;\n\tcube.offset[0] += groupObj.origin[0];\n\tcube.offset[1] = (-cubeObj.from[1] - cubeObj.size(1, true) + groupObj.origin[1]);\n\tcube.offset[2] -= groupObj.origin[2];\n\tgroupCube.offset = cube.offset;\n\t\n\treturn groupCube;\n}\n\nfunction parentCubeToGroup(groupObj, cubeObj, groupCube, cube) {\n\tcube.rotation_point[0] += groupObj.origin[0];\n\tcube.rotation_point[1] += groupObj.origin[1];\n\tcube.rotation_point[2] -= groupObj.origin[2];\n\n\tcube.offset[0] += cubeObj.origin[0]; \n\tcube.offset[1] = (-cubeObj.from[1] - cubeObj.size(1, true) + cubeObj.origin[1]);\n\tcube.offset[2] -= cubeObj.origin[2];\n\t\n\treturn cube;\n}\n\nfunction parentGroup2ToGroup1(parentObj, group) {\n\tgroup.rotation_point[0] += parentObj.origin[0];\n\tgroup.rotation_point[1] += parentObj.origin[1];\n\tgroup.rotation_point[2] -= parentObj.origin[2];\n\treturn group;\n}\n\n// obj and cube are always of groups\nfunction recurvBBGroup(obj, cube) {\n\tif (obj.children.length > 0) {\n\t\t\t\t\n\t\tobj.children.forEach(childObj => {\n\t\t\tif (childObj.type !== 'cube') {\n\t\t\t\tvar childGroupCube = parentGroup2ToGroup1(obj, createCubeFromGroup(childObj));\n\t\t\t\tchildGroupCube = recurvBBGroup(childObj, childGroupCube);\n\t\t\t\t\t\n\t\t\t\tif (cube.children == null)\n\t\t\t\t\tcube.children = []\n\t\t\t\t\n\t\t\t\tcube.children.push(childGroupCube);\n\t\t\t} else {\n\t\t\t\tvar childCube = createCube(childObj);\n\t\t\t\t\n\t\t\t\tif (childCube.name === cube.name) {\n\t\t\t\t\tcube = combineCubeIntoGroup(obj, cube, childCube, childObj);\n\t\t\t\t} else {\n\t\t\t\t\tif (cube.children == null)\n\t\t\t\t\t\tcube.children = []\n\t\t\t\t\t\n\t\t\t\t\tchildCube = parentCubeToGroup(obj, childObj, cube, childCube);\n\t\t\t\t\tcube.children.push(childCube);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn cube;\n}\n\nfunction generateBipedModel(isAlex) {\n\tBlockbench.showMessageBox({\n\t\ttitle: 'Warning!',\n\t\tmessage: 'Do not change or delete any auto-generated parts name. If you chose \"threecore:biped\" as the type during export, the auto-generated part will be ignored as a parent for it\\'s children parts'\n\t});\n\t\n\tUndo.initEdit({outliner:true, elements:Outliner.elements});\n\t\n\tvar group;\n\t\n\t// Player Head, size 8, 8, 8\n\tgroup = new Group({\n\t\tname: 'bipedHead',\n\t\torigin: [0, 24, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedHead',\n\t\tfrom: [-4, 24, -4],\n\t\tto: [4, 32, 4],\n\t\tuv_offset: [0, 0]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\t// Player Body, size 8, 12, 4\n\tgroup = new Group({\n\t\tname: 'bipedBody',\n\t\torigin: [0, 24, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedBody',\n\t\tfrom: [-4, 12, -2],\n\t\tto: [4, 24, 2],\n\t\tuv_offset: [16, 16]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\tconst armOriginY = isAlex ? 21.5 : 22;\n\tconst armOffY = isAlex ? 11.5 : 12;\n\t// Player Right Arm, size 4 or 3, 12, 4\n\tgroup = new Group({\n\t\tname: 'bipedRightArm',\n\t\torigin: [5, armOriginY, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedRightArm',\n\t\tfrom: [4, armOffY, -2],\n\t\tto: [isAlex? 7 : 8, armOffY+12, 2],\n\t\tuv_offset: [40, 16]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\t// Player Left Arm, size 4 or 3, 12, 4\n\tgroup = new Group({\n\t\tname: 'bipedLeftArm',\n\t\torigin: [-5, armOriginY, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedLeftArm',\n\t\tfrom: [isAlex ? -7 : -8, armOffY, -2],\n\t\tto: [-4, armOffY+12, 2],\n\t\tuv_offset: [32, 48]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\t// Player Right Leg, size 4, 12, 4\n\tgroup = new Group({\n\t\tname: 'bipedRightLeg',\n\t\torigin: [1.9, 12, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedRightLeg',\n\t\tfrom: [-0.1, 0, -2],\n\t\tto: [3.9, 12, 2],\n\t\tuv_offset: [0, 16]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\t// Player Left Leg, size 4, 12, 4\n\tgroup = new Group({\n\t\tname: 'bipedLeftLeg',\n\t\torigin: [-1.9, 12, 0]\n\t}).init();\n\tnew Cube({\n\t\tname: 'bipedLeftLeg',\n\t\tfrom: [-3.9, 0, -2],\n\t\tto: [0.1, 12, 2],\n\t\tuv_offset: [16, 48]\n\t}).addTo(group).init();\n\tgroup.openUp();\n\t\n\tCanvas.updateAll()\n\t\n\tUndo.finishEdit('generate threecore biped model');\n}\n\n})()"
  },
  {
    "path": "plugins/tint_preview.js",
    "content": "/*\n\tTint Preview - A Blockbench plugin to preview tint effect on JSON models\n\tCopyright (C) 2022  MrCrayfish\n\n\tThis program is free software: you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License as published by\n\tthe Free Software Foundation, either version 3 of the License, or\n\t(at your option) any later version.\n\n\tThis program is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with this program.  If not, see <https://www.gnu.org/licenses/>.\n*/\nvar defaultTintColor = [1.0, 0.705, 0.294];\nvar dragTintColor = null;\nvar origMats = [];\n\nvar blockColorOptions = {\n\t'empty': 'Select...',\n\t'foilage_badlands': 'Foilage (Badlands)',\n\t'foilage_bamboo_jungle': 'Foilage (Bamboo Jungle)',\n\t'foilage_basalt_deltas': 'Foilage (Basalt Deltas)',\n\t'foilage_beach': 'Foilage (Beach)',\n\t'foilage_birch_forest': 'Foilage (Birch Forest)',\n\t'foilage_cold_ocean': 'Foilage (Cold Ocean)',\n\t'foilage_crimson_forest': 'Foilage (Crimson Forest)',\n\t'foilage_dark_forest': 'Foilage (Dark Forest)',\n\t'foilage_deep_cold_ocean': 'Foilage (Deep Cold Ocean)',\n\t'foilage_deep_frozen_ocean': 'Foilage (Deep Frozen Ocean)',\n\t'foilage_deep_lukewarm_ocean': 'Foilage (Deep Lukewarm Ocean)',\n\t'foilage_deep_ocean': 'Foilage (Deep Ocean)',\n\t'foilage_desert': 'Foilage (Desert)',\n\t'foilage_dripstone_caves': 'Foilage (Dripstone Caves)',\n\t'foilage_end_barrens': 'Foilage (End Barrens)',\n\t'foilage_end_highlands': 'Foilage (End Highlands)',\n\t'foilage_end_midlands': 'Foilage (End Midlands)',\n\t'foilage_eroded_badlands': 'Foilage (Eroded Badlands)',\n\t'foilage_flower_forest': 'Foilage (Flower Forest)',\n\t'foilage_forest': 'Foilage (Forest)',\n\t'foilage_frozen_ocean': 'Foilage (Frozen Ocean)',\n\t'foilage_frozen_peaks': 'Foilage (Frozen Peaks)',\n\t'foilage_frozen_river': 'Foilage (Frozen River)',\n\t'foilage_grove': 'Foilage (Grove)',\n\t'foilage_ice_spikes': 'Foilage (Ice Spikes)',\n\t'foilage_jagged_peaks': 'Foilage (Jagged Peaks)',\n\t'foilage_jungle': 'Foilage (Jungle)',\n\t'foilage_lukewarm_ocean': 'Foilage (Lukewarm Ocean)',\n\t'foilage_lush_caves': 'Foilage (Lush Caves)',\n\t'foilage_meadow': 'Foilage (Meadow)',\n\t'foilage_mushroom_fields': 'Foilage (Mushroom Fields)',\n\t'foilage_nether_wastes': 'Foilage (Nether Wastes)',\n\t'foilage_ocean': 'Foilage (Ocean)',\n\t'foilage_old_growth_birch_forest': 'Foilage (Old Growth Birch Forest)',\n\t'foilage_old_growth_pine_taiga': 'Foilage (Old Growth Pine Taiga)',\n\t'foilage_old_growth_spruce_taiga': 'Foilage (Old Growth Spruce Taiga)',\n\t'foilage_plains': 'Foilage (Plains)',\n\t'foilage_river': 'Foilage (River)',\n\t'foilage_savanna': 'Foilage (Savanna)',\n\t'foilage_savanna_plateau': 'Foilage (Savanna Plateau)',\n\t'foilage_small_end_islands': 'Foilage (Small End Islands)',\n\t'foilage_snowy_beach': 'Foilage (Snowy Beach)',\n\t'foilage_snowy_plains': 'Foilage (Snowy Plains)',\n\t'foilage_snowy_slopes': 'Foilage (Snowy Slopes)',\n\t'foilage_snowy_taiga': 'Foilage (Snowy Taiga)',\n\t'foilage_soul_sand_valley': 'Foilage (Soul Sand Valley)',\n\t'foilage_sparse_jungle': 'Foilage (Sparse Jungle)',\n\t'foilage_stony_peaks': 'Foilage (Stony Peaks)',\n\t'foilage_stony_shore': 'Foilage (Stony Shore)',\n\t'foilage_sunflower_plains': 'Foilage (Sunflower Plains)',\n\t'foilage_swamp': 'Foilage (Swamp)',\n\t'foilage_taiga': 'Foilage (Taiga)',\n\t'foilage_the_end': 'Foilage (The End)',\n\t'foilage_the_void': 'Foilage (The Void)',\n\t'foilage_warm_ocean': 'Foilage (Warm Ocean)',\n\t'foilage_warped_forest': 'Foilage (Warped Forest)',\n\t'foilage_windswept_forest': 'Foilage (Windswept Forest)',\n\t'foilage_windswept_gravelly_hills': 'Foilage (Windswept Gravelly Hills)',\n\t'foilage_windswept_hills': 'Foilage (Windswept Hills)',\n\t'foilage_windswept_savanna': 'Foilage (Windswept Savanna)',\n\t'foilage_wooded_badlands': 'Foilage (Wooded Badlands)',\n\t'grass_badlands': 'Grass (Badlands)',\n\t'grass_bamboo_jungle': 'Grass (Bamboo Jungle)',\n\t'grass_basalt_deltas': 'Grass (Basalt Deltas)',\n\t'grass_beach': 'Grass (Beach)',\n\t'grass_birch_forest': 'Grass (Birch Forest)',\n\t'grass_cold_ocean': 'Grass (Cold Ocean)',\n\t'grass_crimson_forest': 'Grass (Crimson Forest)',\n\t'grass_dark_forest': 'Grass (Dark Forest)',\n\t'grass_deep_cold_ocean': 'Grass (Deep Cold Ocean)',\n\t'grass_deep_frozen_ocean': 'Grass (Deep Frozen Ocean)',\n\t'grass_deep_lukewarm_ocean': 'Grass (Deep Lukewarm Ocean)',\n\t'grass_deep_ocean': 'Grass (Deep Ocean)',\n\t'grass_desert': 'Grass (Desert)',\n\t'grass_dripstone_caves': 'Grass (Dripstone Caves)',\n\t'grass_end_barrens': 'Grass (End Barrens)',\n\t'grass_end_highlands': 'Grass (End Highlands)',\n\t'grass_end_midlands': 'Grass (End Midlands)',\n\t'grass_eroded_badlands': 'Grass (Eroded Badlands)',\n\t'grass_flower_forest': 'Grass (Flower Forest)',\n\t'grass_forest': 'Grass (Forest)',\n\t'grass_frozen_ocean': 'Grass (Frozen Ocean)',\n\t'grass_frozen_peaks': 'Grass (Frozen Peaks)',\n\t'grass_frozen_river': 'Grass (Frozen River)',\n\t'grass_grove': 'Grass (Grove)',\n\t'grass_ice_spikes': 'Grass (Ice Spikes)',\n\t'grass_jagged_peaks': 'Grass (Jagged Peaks)',\n\t'grass_jungle': 'Grass (Jungle)',\n\t'grass_lukewarm_ocean': 'Grass (Lukewarm Ocean)',\n\t'grass_lush_caves': 'Grass (Lush Caves)',\n\t'grass_meadow': 'Grass (Meadow)',\n\t'grass_mushroom_fields': 'Grass (Mushroom Fields)',\n\t'grass_nether_wastes': 'Grass (Nether Wastes)',\n\t'grass_ocean': 'Grass (Ocean)',\n\t'grass_old_growth_birch_forest': 'Grass (Old Growth Birch Forest)',\n\t'grass_old_growth_pine_taiga': 'Grass (Old Growth Pine Taiga)',\n\t'grass_old_growth_spruce_taiga': 'Grass (Old Growth Spruce Taiga)',\n\t'grass_plains': 'Grass (Plains)',\n\t'grass_river': 'Grass (River)',\n\t'grass_savanna': 'Grass (Savanna)',\n\t'grass_savanna_plateau': 'Grass (Savanna Plateau)',\n\t'grass_small_end_islands': 'Grass (Small End Islands)',\n\t'grass_snowy_beach': 'Grass (Snowy Beach)',\n\t'grass_snowy_plains': 'Grass (Snowy Plains)',\n\t'grass_snowy_slopes': 'Grass (Snowy Slopes)',\n\t'grass_snowy_taiga': 'Grass (Snowy Taiga)',\n\t'grass_soul_sand_valley': 'Grass (Soul Sand Valley)',\n\t'grass_sparse_jungle': 'Grass (Sparse Jungle)',\n\t'grass_stony_peaks': 'Grass (Stony Peaks)',\n\t'grass_stony_shore': 'Grass (Stony Shore)',\n\t'grass_sunflower_plains': 'Grass (Sunflower Plains)',\n\t'grass_swamp': 'Grass (Swamp)',\n\t'grass_swamp': 'Grass (Swamp)',\n\t'grass_taiga': 'Grass (Taiga)',\n\t'grass_the_end': 'Grass (The End)',\n\t'grass_the_void': 'Grass (The Void)',\n\t'grass_warm_ocean': 'Grass (Warm Ocean)',\n\t'grass_warped_forest': 'Grass (Warped Forest)',\n\t'grass_windswept_forest': 'Grass (Windswept Forest)',\n\t'grass_windswept_gravelly_hills': 'Grass (Windswept Gravelly Hills)',\n\t'grass_windswept_hills': 'Grass (Windswept Hills)',\n\t'grass_windswept_savanna': 'Grass (Windswept Savanna)',\n\t'grass_wooded_badlands': 'Grass (Wooded Badlands)',\n\t'leaves_birch': 'Leaves (Birch)',\n\t'leaves_spruce': 'Leaves (Spruce)',\n\t'lily_pad': 'Lily Pad',\n\t'redstone_0': 'Redstone (Power 0)',\n\t'redstone_1': 'Redstone (Power 1)',\n\t'redstone_2': 'Redstone (Power 2)',\n\t'redstone_3': 'Redstone (Power 3)',\n\t'redstone_4': 'Redstone (Power 4)',\n\t'redstone_5': 'Redstone (Power 5)',\n\t'redstone_6': 'Redstone (Power 6)',\n\t'redstone_7': 'Redstone (Power 7)',\n\t'redstone_8': 'Redstone (Power 8)',\n\t'redstone_9': 'Redstone (Power 9)',\n\t'redstone_10': 'Redstone (Power 10)',\n\t'redstone_11': 'Redstone (Power 11)',\n\t'redstone_12': 'Redstone (Power 12)',\n\t'redstone_13': 'Redstone (Power 13)',\n\t'redstone_14': 'Redstone (Power 14)',\n\t'redstone_15': 'Redstone (Power 15)',\n\t'water_badlands': 'Water (Badlands)',\n\t'water_bamboo_jungle': 'Water (Bamboo Jungle)',\n\t'water_basalt_deltas': 'Water (Basalt Deltas)',\n\t'water_beach': 'Water (Beach)',\n\t'water_birch_forest': 'Water (Birch Forest)',\n\t'water_cold_ocean': 'Water (Cold Ocean)',\n\t'water_crimson_forest': 'Water (Crimson Forest)',\n\t'water_dark_forest': 'Water (Dark Forest)',\n\t'water_deep_cold_ocean': 'Water (Deep Cold Ocean)',\n\t'water_deep_dark': 'Water (Deep Dark)',\n\t'water_deep_frozen_ocean': 'Water (Deep Frozen Ocean)',\n\t'water_deep_lukewarm_ocean': 'Water (Deep Lukewarm Ocean)',\n\t'water_deep_ocean': 'Water (Deep Ocean)',\n\t'water_desert': 'Water (Desert)',\n\t'water_dripstone_caves': 'Water (Dripstone Caves)',\n\t'water_end_barrens': 'Water (End Barrens)',\n\t'water_end_midlands': 'Water (End Midlands)',\n\t'water_eroded_badlands': 'Water (Eroded Badlands)',\n\t'water_flower_forest': 'Water (Flower Forest)',\n\t'water_forest': 'Water (Forest)',\n\t'water_frozen_ocean': 'Water (Frozen Ocean)',\n\t'water_frozen_peaks': 'Water (Frozen Peaks)',\n\t'water_frozen_river': 'Water (Frozen River)',\n\t'water_grove': 'Water (Grove)',\n\t'water_ice_spikes': 'Water (Ice Spikes)',\n\t'water_jagged_peaks': 'Water (Jagged Peaks)',\n\t'water_jungle': 'Water (Jungle)',\n\t'water_lukewarm_ocean': 'Water (Lukewarm Ocean)',\n\t'water_lush_caves': 'Water (Lush Caves)',\n\t'water_meadow': 'Water (Meadow)',\n\t'water_mushroom_fields': 'Water (Mushroom Fields)',\n\t'water_nether_wastes': 'Water (Nether Wastes)',\n\t'water_ocean': 'Water (Ocean)',\n\t'water_old_growth_birch_forest': 'Water (Old Growth Birch Forest)',\n\t'water_old_growth_pine_taiga': 'Water (Old Growth Pine Taiga)',\n\t'water_old_growth_spruce_taiga': 'Water (Old Growth Spruce Taiga)',\n\t'water_plains': 'Water (Plains)',\n\t'water_river': 'Water (River)',\n\t'water_savanna': 'Water (Savanna)',\n\t'water_savanna_plateau': 'Water (Savanna Plateau)',\n\t'water_small_end_islands': 'Water (Small End Islands)',\n\t'water_snowy_beach': 'Water (Snowy Beach)',\n\t'water_snowy_plains': 'Water (Snowy Plains)',\n\t'water_snowy_slopes': 'Water (Snowy Slopes)',\n\t'water_snowy_taiga': 'Water (Snowy Taiga)',\n\t'water_soul_sand_valley': 'Water (Soul Sand Valley)',\n\t'water_sparse_jungle': 'Water (Sparse Jungle)',\n\t'water_stony_peaks': 'Water (Stony Peaks)',\n\t'water_stony_shore': 'Water (Stony Shore)',\n\t'water_sunflower_plains': 'Water (Sunflower Plains)',\n\t'water_swamp': 'Water (Swamp)',\n\t'water_taiga': 'Water (Taiga)',\n\t'water_the_end': 'Water (The End)',\n\t'water_the_void': 'Water (The Void)',\n\t'water_warm_ocean': 'Water (Warm Ocean)',\n\t'water_warped_forest': 'Water (Warped Forest)',\n\t'water_windswept_forest': 'Water (Windswept Forest)',\n\t'water_windswept_gravelly_hills': 'Water (Windswept Gravelly Hills)',\n\t'water_windswept_hills': 'Water (Windswept Hills)',\n\t'water_windswept_savanna': 'Water (Windswept Savanna)',\n\t'water_wooded_badlands': 'Water (Wooded Badlands)'\n}\n\n// Color values sourced from https://minecraft.fandom.com/wiki/Block_colors\nvar blockColorValues = {\n\t'foilage_badlands': '#9e814d',\n\t'foilage_bamboo_jungle': '#30bb0b',\n\t'foilage_basalt_deltas': '#aea42a',\n\t'foilage_beach': '#77ab2f',\n\t'foilage_birch_forest': '#6ba941',\n\t'foilage_cold_ocean': '#71a74d',\n\t'foilage_crimson_forest': '#aea42a',\n\t'foilage_dark_forest': '#59ae30',\n\t'foilage_deep_cold_ocean': '#71a74d',\n\t'foilage_deep_frozen_ocean': '#71a74d',\n\t'foilage_deep_lukewarm_ocean': '#71a74d',\n\t'foilage_deep_ocean': '#71a74d',\n\t'foilage_desert': '#aea42a',\n\t'foilage_dripstone_caves': '#77ab2f',\n\t'foilage_end_barrens': '#71a74d',\n\t'foilage_end_highlands': '#71a74d',\n\t'foilage_end_midlands': '#71a74d',\n\t'foilage_eroded_badlands': '#9e814d',\n\t'foilage_flower_forest': '#59ae30',\n\t'foilage_forest': '#59ae30',\n\t'foilage_frozen_ocean': '#60a17b',\n\t'foilage_frozen_peaks': '#60a17b',\n\t'foilage_frozen_river': '#60a17b',\n\t'foilage_grove': '#60a17b',\n\t'foilage_ice_spikes': '#60a17b',\n\t'foilage_jagged_peaks': '#60a17b',\n\t'foilage_jungle': '#30bb0b',\n\t'foilage_lukewarm_ocean': '#71a74d',\n\t'foilage_lush_caves': '#71a74d',\n\t'foilage_meadow': '#63a948',\n\t'foilage_mushroom_fields': '#2bbb0f',\n\t'foilage_nether_wastes': '#aea42a',\n\t'foilage_ocean': '#71a74d',\n\t'foilage_old_growth_birch_forest': '#6ba941',\n\t'foilage_old_growth_pine_taiga': '#68a55f',\n\t'foilage_old_growth_spruce_taiga': '#68a464',\n\t'foilage_plains': '#77ab2f',\n\t'foilage_river': '#71a74d',\n\t'foilage_savanna': '#aea42a',\n\t'foilage_savanna_plateau': '#aea42a',\n\t'foilage_small_end_islands': '#71a74d',\n\t'foilage_snowy_beach': '#64a278',\n\t'foilage_snowy_plains': '#60a17b',\n\t'foilage_snowy_slopes': '#60a17b',\n\t'foilage_snowy_taiga': '#60a17b',\n\t'foilage_soul_sand_valley': '#aea42a',\n\t'foilage_sparse_jungle': '#3eb80f',\n\t'foilage_stony_peaks': '#82ac1e',\n\t'foilage_stony_shore': '#6da36b',\n\t'foilage_sunflower_plains': '#77ab2f',\n\t'foilage_swamp': '#6a7039',\n\t'foilage_taiga': '#68a464',\n\t'foilage_the_end': '#71a74d',\n\t'foilage_the_void': '#71a74d',\n\t'foilage_warm_ocean': '#71a74d',\n\t'foilage_warped_forest': '#aea42a',\n\t'foilage_windswept_forest': '#6da36b',\n\t'foilage_windswept_gravelly_hills': '#6da36b',\n\t'foilage_windswept_hills': '#6da36b',\n\t'foilage_windswept_savanna': '#aea42a',\n\t'foilage_wooded_badlands': '#9e814d',\n\t'grass_badlands': '#90814d',\n\t'grass_bamboo_jungle': '#59c93c',\n\t'grass_basalt_deltas': '#bfb755',\n\t'grass_beach': '#91bd59',\n\t'grass_birch_forest': '#88bb67',\n\t'grass_cold_ocean': '#8eb971',\n\t'grass_crimson_forest': '#bfb755',\n\t'grass_dark_forest': '#507a32',\n\t'grass_deep_cold_ocean': '#8eb971',\n\t'grass_deep_frozen_ocean': '#8eb971',\n\t'grass_deep_lukewarm_ocean': '#8eb971',\n\t'grass_deep_ocean': '#8eb971',\n\t'grass_desert': '#bfb755',\n\t'grass_dripstone_caves': '#91bd59',\n\t'grass_end_barrens': '#8eb971',\n\t'grass_end_highlands': '#8eb971',\n\t'grass_end_midlands': '#8eb971',\n\t'grass_eroded_badlands': '#90814d',\n\t'grass_flower_forest': '#79c05a',\n\t'grass_forest': '#79c05a',\n\t'grass_frozen_ocean': '#80b497',\n\t'grass_frozen_peaks': '#80b497',\n\t'grass_frozen_river': '#80b497',\n\t'grass_grove': '#80b497',\n\t'grass_ice_spikes': '#80b497',\n\t'grass_jagged_peaks': '#80b497',\n\t'grass_jungle': '#59c93c',\n\t'grass_lukewarm_ocean': '#8eb971',\n\t'grass_lush_caves': '#8eb971',\n\t'grass_meadow': '#83bb6d',\n\t'grass_mushroom_fields': '#55c93f',\n\t'grass_nether_wastes': '#bfb755',\n\t'grass_ocean': '#8eb971',\n\t'grass_old_growth_birch_forest': '#88bb67',\n\t'grass_old_growth_pine_taiga': '#86b87f',\n\t'grass_old_growth_spruce_taiga': '#86b783',\n\t'grass_plains': '#91bd59',\n\t'grass_river': '#8eb971',\n\t'grass_savanna': '#bfb755',\n\t'grass_savanna_plateau': '#bfb755',\n\t'grass_small_end_islands': '#8eb971',\n\t'grass_snowy_beach': '#83b593',\n\t'grass_snowy_plains': '#80b497',\n\t'grass_snowy_slopes': '#80b497',\n\t'grass_snowy_taiga': '#80b497',\n\t'grass_soul_sand_valley': '#bfb755',\n\t'grass_sparse_jungle': '#64c73f',\n\t'grass_stony_peaks': '#9abe4b',\n\t'grass_stony_shore': '#8ab689',\n\t'grass_sunflower_plains': '#91bd59',\n\t'grass_swamp': '#4c763c',\n\t'grass_swamp': '#6a7039',\n\t'grass_taiga': '#86b783',\n\t'grass_the_end': '#8eb971',\n\t'grass_the_void': '#8eb971',\n\t'grass_warm_ocean': '#8eb971',\n\t'grass_warped_forest': '#bfb755',\n\t'grass_windswept_forest': '#8ab689',\n\t'grass_windswept_gravelly_hills': '#8ab689',\n\t'grass_windswept_hills': '#8ab689',\n\t'grass_windswept_savanna': '#bfb755',\n\t'grass_wooded_badlands': '#90814d',\n\t'leaves_birch': '#80a755',\n\t'leaves_spruce': '#619961',\n\t'lily_pad': '#208030',\n\t'redstone_0': '#4b0000',\n\t'redstone_1': '#6f0000',\n\t'redstone_2': '#790000',\n\t'redstone_3': '#820000',\n\t'redstone_4': '#8c0000',\n\t'redstone_5': '#970000',\n\t'redstone_6': '#a10000',\n\t'redstone_7': '#ab0000',\n\t'redstone_8': '#b50000',\n\t'redstone_9': '#bf0000',\n\t'redstone_10': '#ca0000',\n\t'redstone_11': '#d30000',\n\t'redstone_12': '#dd0000',\n\t'redstone_13': '#e70600',\n\t'redstone_14': '#f11b00',\n\t'redstone_15': '#fc3100',\n\t'water_badlands': '#3f76e4',\n\t'water_bamboo_jungle': '#3f76e4',\n\t'water_basalt_deltas': '#3f76e4',\n\t'water_beach': '#3f76e4',\n\t'water_birch_forest': '#3f76e4',\n\t'water_cold_ocean': '#3d57d6',\n\t'water_crimson_forest': '#3f76e4',\n\t'water_dark_forest': '#3f76e4',\n\t'water_deep_cold_ocean': '#3d57d6',\n\t'water_deep_dark': '#3f76e4',\n\t'water_deep_frozen_ocean': '#3938c9',\n\t'water_deep_lukewarm_ocean': '#45adf2',\n\t'water_deep_ocean': '#3f76e4',\n\t'water_desert': '#3f76e4',\n\t'water_dripstone_caves': '#3f76e4',\n\t'water_end_barrens': '#3f76e4',\n\t'water_end_midlands': '#3f76e4',\n\t'water_eroded_badlands': '#3f76e4',\n\t'water_flower_forest': '#3f76e4',\n\t'water_forest': '#3f76e4',\n\t'water_frozen_ocean': '#3938c9',\n\t'water_frozen_peaks': '#3f76e4',\n\t'water_frozen_river': '#3938c9',\n\t'water_grove': '#3f76e4',\n\t'water_ice_spikes': '#3f76e4',\n\t'water_jagged_peaks': '#3f76e4',\n\t'water_jungle': '#3f76e4',\n\t'water_lukewarm_ocean': '#45adf2',\n\t'water_lush_caves': '#3f76e4',\n\t'water_meadow': '#0e4ecf',\n\t'water_mushroom_fields': '#3f76e4',\n\t'water_nether_wastes': '#3f76e4',\n\t'water_ocean': '#3f76e4',\n\t'water_old_growth_birch_forest': '#3f76e4',\n\t'water_old_growth_pine_taiga': '#3f76e4',\n\t'water_old_growth_spruce_taiga': '#3f76e4',\n\t'water_plains': '#3f76e4',\n\t'water_river': '#3f76e4',\n\t'water_savanna': '#3f76e4',\n\t'water_savanna_plateau': '#3f76e4',\n\t'water_small_end_islands': '#3f76e4',\n\t'water_snowy_beach': '#3d57d6',\n\t'water_snowy_plains': '#3f76e4',\n\t'water_snowy_slopes': '#3f76e4',\n\t'water_snowy_taiga': '#3d57d6',\n\t'water_soul_sand_valley': '#3f76e4',\n\t'water_sparse_jungle': '#3f76e4',\n\t'water_stony_peaks': '#3f76e4',\n\t'water_stony_shore': '#3f76e4',\n\t'water_sunflower_plains': '#3f76e4',\n\t'water_swamp': '#617b64',\n\t'water_taiga': '#3f76e4',\n\t'water_the_end': '#3f76e4',\n\t'water_the_void': '#3f76e4',\n\t'water_warm_ocean': '#43d5ee',\n\t'water_warped_forest': '#3f76e4',\n\t'water_windswept_forest': '#3f76e4',\n\t'water_windswept_gravelly_hills': '#3f76e4',\n\t'water_windswept_hills': '#3f76e4',\n\t'water_windswept_savanna': '#3f76e4',\n\t'water_wooded_badlands': '#3f76e4'\n}\n\nfunction isTintColorArray(obj) {\n\treturn obj && Array.isArray(obj) && obj.length == 3 && obj.every(e => typeof e === 'number');\n}\n\n(function() {\n\tvar toggleTintAction;\n\tvar setTintColorAction;\n\tvar patchedCodecs = [];\n\tvar openedDialog;\n\n\t/**\n\t * Hook to patch textures when added\n\t */\n\tfunction addTextureEvent(data) {\n\t\tif(isTintingFormat(Project.format)) {\n\t\t\tapplyTintingShader(Project, data.texture);\n\t\t}\n\t} \n\n\t/**\n\t * Refreshes the tint for supported projects after parsing the model data\n\t */\n\tfunction parsedEvent(data) {\n\t\tif(isTintingFormat(Project.format)) {\n\t\t\tupdateTint();\n\t\t}\n\t}\n\n\t/** \n\t * Adds a parsed event to supported codes to trigger a refresh of the tinted elements.\n\t * This is essentially a \"completed loading\" event, just a strange way to do it.\n\t */\n\tfunction setupProjectEvent() {\n\t\tif(!isTintingFormat(Project.format)) {\n\t\t\treturn;\n\t\t}\n\t\tfor(let key in Codecs) {\n\t\t\tlet codec = Codecs[key];\n\t\t\tif(codec.format && isTintingFormat(codec.format)) {\n\t\t\t\tcodec.on('parsed', parsedEvent);\n\t\t\t\tpatchedCodecs.safePush(codec);\n\t\t\t}\n\t\t}\n\t\t// Add to project format since it can be a fallback\n\t\tCodecs.project.on('parsed', parsedEvent);\n\t\tpatchedCodecs.safePush(Codecs.project);\n\t}\n\n\t/**\n\t * Hides the color picker dialog when switching projects\n\t */\n\tfunction unselectProjectEvent(data) {\n\t\tif(openedDialog) {\n\t\t\topenedDialog.delete();\n\t\t}\n\t} \n\n\t/**\n\t * Causes any changes to face tint toggle to update the tint preview\n\t */\n\tfunction finishEditEvent(data) {\n\t\tif(!isTintingFormat(Project.format)) {\n\t\t\treturn;\n\t\t}\n\t\tlet elements = data.aspects.elements;\n\t\tif(Undo.current_save.elements && Object.keys(Undo.current_save.elements).length && Array.isArray(elements) && elements.length) {\n\t\t\tlet obj = data.aspects.elements[0];\n\t\t\tlet oldObj = Undo.current_save.elements[obj.uuid];\n\t\t\tif(!obj.faces || !oldObj.faces)\n\t\t\t\treturn;\n\t\t\tfunction faceTintChanged(a, b) {\n\t\t\t\treturn a.tint != b.tint;\n\t\t\t}\n\t\t\tfor(let f of Canvas.face_order) {\n\t\t\t\tif(faceTintChanged(obj.faces[f], oldObj.faces[f])) {\n\t\t\t\t\tupdateTint();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Causes undo and redo events related to face tint or deleted \n\t * element to trigger tint update.\n\t */\n\tfunction undoRedoEvent(data) {\n\t\tif(!isTintingFormat(Project.format)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet beforeElements = data.entry.before.elements;\n\t\tif(typeof beforeElements !== 'object' || !beforeElements)\n\t\t\treturn;\n\n\t\tlet postElements = data.entry.post.elements;\n\t\tif(typeof postElements !== 'object' || !postElements)\n\t\t\treturn;\n\n\t\t// Causes the tint to update if the undo/redo action was \"Toggle face tint\".\n\t\tif(Object.keys(beforeElements).length == Object.keys(postElements).length) {\n\t\t\tfor(let key in beforeElements) {\n\t\t\t\tlet beforeObj = beforeElements[key];\n\t\t\t\tlet postObj = postElements[key];\n\t\t\t\tfunction faceTintChanged(a, b) {\n\t\t\t\t\treturn a.tint != b.tint;\n\t\t\t\t}\n\t\t\t\tfor(let f of Canvas.face_order) {\n\t\t\t\t\tif(faceTintChanged(beforeObj.faces[f], postObj.faces[f])) {\n\t\t\t\t\t\tupdateTint();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if(!Object.keys(postElements).length) { // Elements were deleted\n\t\t\tfor(let key in beforeElements) {\n\t\t\t\tlet beforeObj = beforeElements[key];\n\t\t\t\tfor(let f of Canvas.face_order) {\n\t\t\t\t\tfunction hasFaceTint(a) {\n\t\t\t\t\t\treturn a.tint != -1;\n\t\t\t\t\t}\n\t\t\t\t\tif(hasFaceTint(beforeObj.faces[f])) {\n\t\t\t\t\t\tupdateTint();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Loads the tint colour from the project file\n\t */\n\tfunction loadProjectEvent(data) {\n\t\tif(!isTintingFormat(Project.format)) {\n\t\t\treturn;\n\t\t}\n\t\tlet tintColor = data.model.tint_color;\n\t\tif(isTintColorArray(tintColor)) {\n\t\t\tProjectData[Project.uuid].tintColor = tintColor;\n\t\t}\n\t}\n\n\t/**\n\t * Saves the tint colour to the project file\n\t */\n\tfunction saveProjectEvent(data) {\n\t\tif(!isTintingFormat(Project.format)) {\n\t\t\treturn;\n\t\t}\n\t\tlet model = data.model;\n\t\tmodel.tint_color = getTintColor(Project);\n\t}\n\n\t/**\n\t * Patches all textures in opened projects that support tinting with custom material. \n\t * Refer to #isTintingFormat(format) for the condition of a project to support tinting.\n\t */\n\tfunction patchAllTextures() {\n\t\tif(!ModelProject.all.length)\n\t\t\treturn;\n\t\tlet count = 0;\n\t\tModelProject.all.forEach(project => {\n\t\t\tif(isTintingFormat(project.format)) {\n\t\t\t\tlet textures = project.textures;\n\t\t\t\ttextures.forEach(texture => {\n\t\t\t\t\tapplyTintingShader(project, texture);\n\t\t\t\t\tcount++;\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tconsole.log(`[Tint Preview] Patched ${count} textures`);\n\t}\n\n\t/**\n\t * Restores the original materials for all textures in opened projects. Any\n\t * reminant materials (from closed projects) will simply be purged.\n\t */\n\tfunction restoreOriginalMaterials() {\n\t\tif(ModelProject.all.length) {\n\t\t\tlet count = 0;\n\t\t\tModelProject.all.forEach(project => {\n\t\t\t\tif(isTintingFormat(project.format)) {\n\t\t\t\t\tlet textures = project.textures;\n\t\t\t\t\ttextures.forEach(texture => {\n\t\t\t\t\t\tlet origMat = origMats[texture.uuid];\n\t\t\t\t\t\tif(origMat) {\n\t\t\t\t\t\t\tif (project.materials) {\n\t\t\t\t\t\t\t\tproject.materials[texture.uuid] = origMat;\n\t\t\t\t\t\t\t} else if (texture._static?.properties) {\n\t\t\t\t\t\t\t\ttexture._static.properties.material = origMat;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tconsole.log(`[Tint Preview] Restored ${count} textures`);\n\t\t}\n\t\torigMats.purge();\n\t}\n\n\tPlugin.register('tint_preview', {\n\t\ttitle: 'Tint Preview',\n\t\tauthor: 'MrCrayfish',\n\t\tdescription: 'Preview a color on tint enabled faces! (JSON models only)',\n\t\tabout: `The plugin adds the ability to preview a color on tint enabled cube faces. It adds two new options to the Tools menu that allows you to toggle tinting and change the tint color.\nImportant: This plugin is designed for JSON models only and will not work for other formats.`,\n\t\ttags: [\"Minecraft: Java Edition\"],\n\t\ticon: 'fa-fill',\n\t\tversion: '1.1.2',\n\t\tvariant: 'both',\n\t\tmin_version: '4.3.0',\n\t\tonload() {\n\t\t\t// Custom translations. Am I doing this right?\n\t\t\twindow.Language.addTranslations('en', {\n\t\t\t\t'dialog.tint_preview.set_tint_color': 'Set Tint Color',\n\t\t\t\t'panel.color.main_palette': 'Main Palette'\n\t\t\t});\n\n\t\t\t// Register events\n\t\t\tBlockbench.on('add_texture', addTextureEvent);\n\t\t\tBlockbench.on('unselect_project', unselectProjectEvent);\n\t\t\tBlockbench.on('finish_edit', finishEditEvent);\n\t\t\tBlockbench.on('setup_project', setupProjectEvent);\n\t\t\tBlockbench.on('load_project', loadProjectEvent);\n\t\t\tBlockbench.on('save_project', saveProjectEvent);\n\t\t\tBlockbench.on('undo', undoRedoEvent);\n\t\t\tBlockbench.on('redo', undoRedoEvent);\n\n\t\t\t// Patches all current textures loaded in valid porjects\n\t\t\tpatchAllTextures(); \n\n\t\t\t// Setup state memory\n\t\t\tStateMemory.init('tint_color_picker_tab', 'string');\n\t\t\tStateMemory.init('tint_color_wheel', 'boolean');\n\t\t\tStateMemory.init('show_tint', 'boolean');\n\n\t\t\ttoggleTintAction = new Toggle('toggle_tint_preview', {\n\t\t\t\tname: 'Show Tint Color',\n\t\t\t\ticon: (StateMemory.show_tint ? 'fa-fill-drip' : 'fa-fill'),\n\t\t\t\tdescription: 'Toggles the tint effect for tint enabled faces',\n\t\t\t\tcategory: 'tools',\n\t\t\t\tdefault: StateMemory.show_tint,\n\t\t\t\tcondition: () => isTintingFormat(Format),\n\t\t\t\tonChange: (state) => {\n\t\t\t\t\tStateMemory.show_tint = state;\n\t\t\t\t\tStateMemory.save('show_tint');\n\t\t\t\t\tupdateTint(true);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsetTintColorAction = new Action({\n\t\t\t\tid: 'set_tint_color',\n\t\t\t\tname: 'Set Tint Color',\n\t\t\t\ticon: 'fa-palette',\n\t\t\t\tdescription: 'Toggles the tint effect for tint enabled faces',\n\t\t\t\tcategory: 'tools',\n\t\t\t\tcondition: () => isTintingFormat(Format),\n\t\t\t\tclick: () => {\n\t\t\t\t\topenedDialog = createTintColorDialog();\n\t\t\t\t\topenedDialog.show();\n\t\t\t\t\t$('#blackout').hide();\n\t\t\t\t\topen_dialog = false; // Hack to allow keybinds to pass through dialog\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Adds the actions to the tools menu\n\t\t\tMenuBar.addAction(toggleTintAction, 'tools');\n\t\t\tMenuBar.addAction(setTintColorAction, 'tools');\n\t\t\tMenuBar.update();\n\n\t\t\tupdateTint(true);\n\t\t},\n\t\tonunload() {\n\t\t\ttoggleTintAction.delete();\n\t\t\tsetTintColorAction.delete();\n\t\t\tif(openedDialog) openedDialog.delete();\n\t\t\trestoreOriginalMaterials();\n\t\t\tBlockbench.removeListener('add_texture', addTextureEvent);\n\t\t\tBlockbench.removeListener('unselect_project', unselectProjectEvent);\n\t\t\tBlockbench.removeListener('finish_edit', finishEditEvent);\n\t\t\tBlockbench.removeListener('setup_project', setupProjectEvent);\n\t\t\tBlockbench.removeListener('load_project', loadProjectEvent);\n\t\t\tBlockbench.removeListener('save_project', saveProjectEvent);\n\t\t\tBlockbench.removeListener('undo', undoRedoEvent);\n\t\t\tBlockbench.removeListener('redo', undoRedoEvent);\n\t\t\tpatchedCodecs.forEach(codec => codec.removeListener('parsed', parsedEvent));\n\t\t\tclearTint();\n\t\t}\n\t});\n})();\n\nfunction createTintColorDialog(project = Project) {\n\n\t// Gets the current tint color for the project\n\tlet rgb = getTintColor(project);\n\tlet tintColor = new tinycolor({\n\t\tr: Math.round(Math.clamp(rgb[0] * 255, 0, 255)), \n\t\tg: Math.round(Math.clamp(rgb[1] * 255, 0, 255)),\n\t\tb: Math.round(Math.clamp(rgb[2] * 255, 0, 255))\n\t});\n\n\t// Create dialog\n\tlet colorPickerDialog = new Dialog({\n\t\tid: 'select_tint_color_dialog',\n\t\ttitle: 'dialog.tint_preview.set_tint_color',\n\t\tsingleButton: true,\n\t\twidth: 400,\n\t\tdarken: false,\n\t\tcomponent: {\n\t\t\tdata: {\n\t\t\t\twidth: 352,\n\t\t\t\topen_tab: StateMemory.tint_color_picker_tab || 'picker',\n\t\t\t\tpicker_type: StateMemory.tint_color_wheel ? 'wheel' : 'box',\n\t\t\t\tpicker_toggle_label: tl('panel.color.picker_type'),\n\t\t\t\ttext_input: tintColor.toHexString(),\n\t\t\t\ttint_color: tintColor.toHexString(),\n\t\t\t\thover_color: '',\n\t\t\t\tselected_preset: 'empty',\n\t\t\t\tcolor_presets: blockColorOptions,\n\t\t\t\tget color_code() {\n\t\t\t\t\treturn this.hover_color || this.tint_color\n\t\t\t\t},\n\t\t\t\tset color_code(value) {\n\t\t\t\t\tthis.tint_color = value.toLowerCase().replace(/[^a-f0-9#]/g, '');\n\t\t\t\t},\n\t\t\t\t// Just use the palette/history from main color picker. Maybe in a future update it'll be separate\n\t\t\t\tpalette: Interface.Panels.color.vue._data.palette,\n\t\t\t\thistory: Interface.Panels.color.vue._data.history\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\ttogglePickerType() {\n\t\t\t\t\tStateMemory.tint_color_wheel = !StateMemory.tint_color_wheel;\n\t\t\t\t\tStateMemory.save('tint_color_wheel');\n\t\t\t\t\tthis.picker_type = StateMemory.tint_color_wheel ? 'wheel' : 'box';\n\t\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\t\t$('#tint_colorpicker').spectrum('reflow');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsort(event) {\n\t\t\t\t\tvar item = this.palette.splice(event.oldIndex, 1)[0];\n\t\t\t\t\tthis.palette.splice(event.newIndex, 0, item);\n\t\t\t\t},\n\t\t\t\tdrop(event) {\n\t\t\t\t},\n\t\t\t\tsetColor(color) {\n\t\t\t\t\tcolorPickerDialog.set(color, true);\n\t\t\t\t},\n\t\t\t\tvalidateTintColorAndUpdate() {\n\t\t\t\t\tvar color = this.text_input;\n\t\t\t\t\tif (!color.match(/^#[0-9a-f]{6}$/)) {\n\t\t\t\t\t\tthis.tint_color = tinycolor(color).toHexString();\n\t\t\t\t\t}\n\t\t\t\t\tsetTintColor(new tinycolor(this.tint_color), true);\n\t\t\t\t},\n\t\t\t\tisDarkColor(hex) {\n\t\t\t\t\tif (hex) {\n\t\t\t\t\t\tlet color_val = new tinycolor(hex).getBrightness();\n\t\t\t\t\t\tlet bg_val = new tinycolor(CustomTheme.data.colors.back).getBrightness();\n\t\t\t\t\t\treturn Math.abs(color_val - bg_val) <= 50;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonWheelColorChange(value) {\n\t\t\t\t\tlet color = new tinycolor(value);\n\t\t\t\t\tthis.tint_color = color.toHexString();\n\t\t\t\t\tdragTintColor = convertTintToRgbArray(color);\n\t\t\t\t\tupdateTint();\n\t\t\t\t},\n\t\t\t\ttl\n\t\t\t},\n\t\t\twatch: {\n\t\t\t\ttint_color: function(value) {\n\t\t\t\t\tthis.hover_color = '';\n\t\t\t\t\t$('#tint_colorpicker').spectrum('set', value);\n\t\t\t\t\tthis.text_input = value;\n\t\t\t\t},\n\t\t\t\topen_tab(tab) {\n\t\t\t\t\tStateMemory.tint_color_picker_tab = tab;\n\t\t\t\t\tStateMemory.save('tint_color_picker_tab');\n\t\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\t\t$('#tint_colorpicker').spectrum('reflow');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tselected_preset: function(value) {\n\t\t\t\t\tdragTintColor = null;\n\t\t\t\t\tlet color = blockColorValues[value];\n\t\t\t\t\tif(color) {\n\t\t\t\t\t\tthis.tint_color = color;\n\t\t\t\t\t\tsetTintColor(new tinycolor(this.tint_color), true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttemplate: `\n\t\t\t\t<div id=\"tint_color_panel_wrapper\" class=\"panel_inside\">\n\t\t\t\t\t<div id=\"color_panel_head\">\n\t\t\t\t\t\t<div class=\"main\" v-bind:style=\"{'background-color': hover_color || tint_color}\"></div>\n\t\t\t\t\t\t<div class=\"side\">\n\t\t\t\t\t\t\t<input type=\"text\" v-model=\"color_code\" @focusout=\"validateTintColorAndUpdate()\">\n\t\t\t\t\t\t\t<div id=\"color_history\">\n\t\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\t\tv-for=\"(color, i) in history\" v-if=\"i || color != tint_color\"\n\t\t\t\t\t\t\t\t\t:key=\"color\"\n\t\t\t\t\t\t\t\t\tv-bind:style=\"{'background-color': color}\"\n\t\t\t\t\t\t\t\t\tv-bind:title=\"color\" @click=\"setColor(color)\"\n\t\t\t\t\t\t\t\t></li>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"bar tabs_small\">\n\n\t\t\t\t\t\t<input type=\"radio\" name=\"tab\" id=\"radio_tint_color_picker\" value=\"picker\" v-model=\"open_tab\">\n\t\t\t\t\t\t<label for=\"radio_tint_color_picker\">${tl('panel.color.picker')}</label>\n\n\t\t\t\t\t\t<input type=\"radio\" name=\"tab\" id=\"radio_tint_color_palette\" value=\"palette\" v-model=\"open_tab\">\n\t\t\t\t\t\t<label for=\"radio_tint_color_palette\">${tl('panel.color.main_palette')}</label>\n\n\t\t\t\t\t\t<input type=\"radio\" name=\"tab\" id=\"radio_tint_color_both\" value=\"both\" v-model=\"open_tab\">\n\t\t\t\t\t\t<label for=\"radio_tint_color_both\">${tl('panel.color.both')}</label>\n\n\t\t\t\t\t\t<div class=\"tool\" @click=\"togglePickerType()\" :title=\"picker_toggle_label\">\n\t\t\t\t\t\t\t<i class=\"fa_big icon\" :class=\"picker_type == 'box' ? 'fas fa-square' : 'far fa-stop-circle'\"></i>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-show=\"open_tab == 'picker' || open_tab == 'both'\">\n\t\t\t\t\t\t<div v-show=\"picker_type == 'box'\" ref=\"square_picker\" :width=\"width\">\n\t\t\t\t\t\t\t<input id=\"tint_colorpicker\">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<color-wheel ref=\"color_wheel\" v-if=\"picker_type == 'wheel' && width\" v-model=\"tint_color\" :width=\"width\" :height=\"width\" v-on:color-change=\"onWheelColorChange($event)\"></color-wheel>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-show=\"open_tab == 'palette' || open_tab == 'both'\">\n\t\t\t\t\t\t<div class=\"toolbar_wrapper palette\" toolbar=\"palette\"></div>\n\t\t\t\t\t\t<ul id=\"palette_list\" class=\"list\" v-sortable=\"{onUpdate: sort, onEnd: drop, fallbackTolerance: 10}\" @contextmenu=\"ColorPanel.menu.open($event)\">\n\t\t\t\t\t\t\t<li\n\t\t\t\t\t\t\t\tclass=\"color\" v-for=\"color in palette\"\n\t\t\t\t\t\t\t\t:title=\"color\" :key=\"color\"\n\t\t\t\t\t\t\t\t:class=\"{selected: color == tint_color, contrast: isDarkColor(color)}\"\n\t\t\t\t\t\t\t\t@click=\"setColor(color)\"\n\t\t\t\t\t\t\t\t@mouseenter=\"hover_color = color\"\n\t\t\t\t\t\t\t\t@mouseleave=\"hover_color = ''\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"color_inner\" v-bind:style=\"{'background-color': color}\"></div>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style=\"font-size: 0.94em;\">Presets</div>\n\t\t\t\t\t<div class=\"bar_select\">\n\t\t\t\t\t\t<select-input v-model=\"selected_preset\" :options=\"color_presets\"\"/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`,\n\t\t\tmounted() {\n\t\t\t\t// Initialize spectrum and add dragstop event\n\t\t\t\tlet colorPicker = $(this.$el).find('#tint_colorpicker').spectrum({\n\t\t\t\t\tpreferredFormat: \"hex\",\n\t\t\t\t\tflat: true,\n\t\t\t\t\tcolor: tintColor,\n\t\t\t\t\tmove: function(color) {\n\t\t\t\t\t\tcolorPickerDialog.set(color);\n\t\t\t\t\t\tdragTintColor = convertTintToRgbArray(color);\n\t\t\t\t\t\tupdateTint();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t$(colorPicker).on(\"dragstop.spectrum\", function(e, color) {\n\t\t\t\t\tcolorPickerDialog.set(color);\n\t\t\t\t\tdragTintColor = null;\n\t\t\t\t\tsetTintColor(color, true);\n\t\t\t\t});\n\n\t\t\t\t// Adds a mouse up listener to the color wheel\n\t\t\t\tlet scope = this;\n\t\t\t\tfunction colorWheelMouseUp(event) {\n\t\t\t\t\tdocument.removeEventListener('mouseup', colorWheelMouseUp);\n\t\t\t\t\tlet color = new tinycolor(scope.$refs.color_wheel.color);\n\t\t\t\t\tcolorPickerDialog.set(color);\n\t\t\t\t\tdragTintColor = null;\n\t\t\t\t\tsetTintColor(color, true);\n\t\t\t\t}\n\t\t\t\t$(this.$el).find('#color-wheel').on('mousedown', function(event) {\n\t\t\t\t\tdocument.addEventListener('mouseup', colorWheelMouseUp);\n\t\t\t\t});\n\n\t\t\t\t// Fixes an issue on first load where the marker is in the wrong position\n\t\t\t\tVue.nextTick(() => {\n\t\t\t\t\t$(colorPicker).spectrum('reflow');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n\tcolorPickerDialog.set = function(color) {\n\t\tvar value = new tinycolor(color);\n\t\tcolorPickerDialog.content_vue._data.tint_color = value.toHexString();\n\t}\n\tcolorPickerDialog.get = function() {\n\t\treturn colorPickerDialog.content_vue._data.tint_color;\n\t}\n\treturn colorPickerDialog;\n}\n\n/* Converts tinycolor to rgb array in the range of [0, 1]*/\nfunction convertTintToRgbArray(color) {\n\tlet rgb = color.toRgb();\n\tlet r = Math.clamp(rgb.r / 255.0, 0.0, 1.0);\n\tlet g = Math.clamp(rgb.g / 255.0, 0.0, 1.0);\n\tlet b = Math.clamp(rgb.b / 255.0, 0.0, 1.0);\n\treturn [r, g, b];\n}\n\n// Accepts a tinycolor\nfunction setTintColor(color, save = false) {\n\tlet rgb = convertTintToRgbArray(color);\n\tProjectData[Project.uuid].tintColor = rgb;\n\tif(save) Project.saved = false;\n\tupdateTint();\n}\n\n/**\n * Gets the tint color for the given project. This returns an array in\n * in the format of [r, g, b]. If no project is specified, the current is used.\n */\nfunction getTintColor(project = Project) {\n\tif(dragTintColor && isTintColorArray(dragTintColor)) {\n\t\treturn dragTintColor;\n\t}\n\tlet tintColor = ProjectData[project.uuid].tintColor;\n\tif(!isTintColorArray(tintColor)) {\n\t\tProjectData[project.uuid].tintColor = defaultTintColor;\n\t\ttintColor = defaultTintColor;\n\t}\n\treturn tintColor;\n}\n\n/**\n * Updates the color atrribute on the cube geometry. Faces that that have tint\n * enabled will recieve the tint color while other faces will just recieve a\n * white tint.\n */\nfunction updateTint(force = false) {\n\tif(!StateMemory.show_tint && !force)\n\t\treturn;\n\tOutliner.elements.forEach(obj => {\n\t\tconst geometry = obj.mesh.geometry;\n\t\tconst positionAttribute = geometry.getAttribute('position');\n\t\tconst colors = new Array(positionAttribute.count * 3);\n\t\tcolors.fill(1); // Fill with white\n\t\tfunction setFaceTintColor(face, rgb) {\n\t\t\tlet index = Canvas.face_order.indexOf(face);\n\t\t\tif(index == -1) return;\n\t\t\tlet startIndex = index * 12;\n\t\t\tfor(let i = 0; i < 12; i++) {\n\t            colors[startIndex + i] = rgb[i % 3];\n\t\t    }\n\t\t}\n\t\tlet tintColor = getTintColor();\n\t\tfor(let key in obj.faces) {\n\t\t\tlet face = obj.faces[key];\n\t\t\tif(face.tint != -1 && StateMemory.show_tint) {\n\t\t\t\tsetFaceTintColor(face.direction, tintColor);\n\t\t\t} else {\n\t\t\t\tsetFaceTintColor(face.direction, [1.0, 1.0, 1.0]);\n\t\t\t}\n\t\t}\n\t\tgeometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));\n\t\tobj.preview_controller.updateFaces(obj);\n\t});\n}\n\n/**\n * Removes the tint from obj geometry. Only called when uninstalling plugin\n */\nfunction clearTint() {\n\tOutliner.elements.forEach(obj => {\n\t\tconst geometry = obj.mesh.geometry;\n\t\tgeometry.deleteAttribute('color');\n\t\tobj.preview_controller.updateFaces(obj);\n\t});\n}\n\n/**\n * Patches the texture in the given project with a custom material. The shader\n * has been based on the original texture shader, just with the inclusion to \n * apply a vertex color. The tint calculation is the same as Minecraft, that being\n * \"texture * tint\".\n */\nfunction applyTintingShader(project, texture) {\n\tvar originalMat = texture.getMaterial();\n\tvar vertShader = `\n\t\tattribute float highlight;\n\n\t\tuniform bool SHADE;\n\t\tuniform int LIGHTSIDE;\n\n\t\tvarying vec3 vColor;\n\t\tvarying vec2 vUv;\n\t\tvarying float light;\n\t\tvarying float lift;\n\n\t\tfloat AMBIENT = 0.5;\n\t\tfloat XFAC = -0.15;\n\t\tfloat ZFAC = 0.05;\n\n\t\tvoid main() {\n\t\t\tif (SHADE) {\n\t\t\t\tvec3 N = normalize(vec3(modelMatrix * vec4(normal, 0.0)));\n\t\t\t\tif (LIGHTSIDE == 1) {\n\t\t\t\t\tfloat temp = N.y;\n\t\t\t\t\tN.y = N.z * -1.0;\n\t\t\t\t\tN.z = temp;\n\t\t\t\t}\n\t\t\t\tif (LIGHTSIDE == 2) {\n\t\t\t\t\tfloat temp = N.y;\n\t\t\t\t\tN.y = N.x;\n\t\t\t\t\tN.x = temp;\n\t\t\t\t}\n\t\t\t\tif (LIGHTSIDE == 3) {\n\t\t\t\t\tN.y = N.y * -1.0;\n\t\t\t\t}\n\t\t\t\tif (LIGHTSIDE == 4) {\n\t\t\t\t\tfloat temp = N.y;\n\t\t\t\t\tN.y = N.z;\n\t\t\t\t\tN.z = temp;\n\t\t\t\t}\n\t\t\t\tif (LIGHTSIDE == 5) {\n\t\t\t\t\tfloat temp = N.y;\n\t\t\t\t\tN.y = N.x * -1.0;\n\t\t\t\t\tN.x = temp;\n\t\t\t\t}\n\t\t\t\tfloat yLight = (1.0 + N.y) * 0.5;\n\t\t\t\tlight = yLight * (1.0 - AMBIENT) + N.x * N.x * XFAC + N.z * N.z * ZFAC + AMBIENT;\n\t\t\t} else {\n\t\t\t\tlight = 1.0;\n\t\t\t}\n\t\t\tif (highlight == 2.0) {\n\t\t\t\tlift = 0.22;\n\t\t\t} else if (highlight == 1.0) {\n\t\t\t\tlift = 0.1;\n\t\t\t} else {\n\t\t\t\tlift = 0.0;\n\t\t\t}\n\t\t\tvColor = color;\n\t\t\tvUv = uv;\n\t\t\tvec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\n\t\t\tgl_Position = projectionMatrix * mvPosition;\n\t\t}`\n\tvar fragShader = `\n\t\t#ifdef GL_ES\n\t\tprecision ${isApp ? 'highp' : 'mediump'} float;\n\t\t#endif\n\n\t\tuniform sampler2D map;\n\n\t\tuniform bool SHADE;\n\t\tuniform bool EMISSIVE;\n\t\tuniform vec3 LIGHTCOLOR;\n\n\t\tvarying vec3 vColor;\n\t\tvarying vec2 vUv;\n\t\tvarying float light;\n\t\tvarying float lift;\n\n\t\tvoid main(void) {\n\t\t\t\n\t\t\tvec4 color = texture2D(map, vUv);\n\t\t\tif (color.a < 0.01) \n\t\t\t\tdiscard;\n\t\t\tif (EMISSIVE == false) {\n\t\t\t\tcolor = vec4(lift + color.rgb * light, color.a);\n\t\t\t\tcolor.r = color.r * LIGHTCOLOR.r;\n\t\t\t\tcolor.g = color.g * LIGHTCOLOR.g;\n\t\t\t\tcolor.b = color.b * LIGHTCOLOR.b;\n\t\t\t} else {\n\t\t\t\tfloat light_r = (light * LIGHTCOLOR.r) + (1.0 - light * LIGHTCOLOR.r) * (1.0 - color.a);\n\t\t\t\tfloat light_g = (light * LIGHTCOLOR.g) + (1.0 - light * LIGHTCOLOR.g) * (1.0 - color.a);\n\t\t\t\tfloat light_b = (light * LIGHTCOLOR.b) + (1.0 - light * LIGHTCOLOR.b) * (1.0 - color.a);\n\t\t\t\tcolor = vec4(lift + color.r * light_r, lift + color.g * light_g, lift + color.b * light_b, 1.0);\n\t\t\t}\n\t\t\tif (lift > 0.2) {\n\t\t\t\tcolor.r = color.r * 0.6;\n\t\t\t\tcolor.g = color.g * 0.7;\n\t\t\t}\n\t\t\tvec4 tint = vec4(vColor.rgb, 1.0);\n\t\t\tgl_FragColor = color * tint;\n\t\t}`\n\tvar mat = new THREE.ShaderMaterial({\n\t\tuniforms: {\n\t\t\tmap: {type: 't', value: originalMat.map},\n\t\t\tSHADE: {type: 'bool', value: settings.shading.value},\n\t\t\tLIGHTCOLOR: {type: 'vec3', value: new THREE.Color().copy(Canvas.global_light_color).multiplyScalar(settings.brightness.value / 50)},\n\t\t\tLIGHTSIDE: {type: 'int', value: Canvas.global_light_side},\n\t\t\tEMISSIVE: {type: 'bool', value: texture.render_mode == 'emissive'}\n\t\t},\n\t\tvertexShader: vertShader,\n\t\tfragmentShader: fragShader,\n\t\tside: Canvas.getRenderSide(),\n\t\tvertexColors: true,\n\t\ttransparent: true,\n\t});\n\tmat.map = originalMat.map;\n\tmat.uniforms = originalMat.uniforms;\n\tmat.name = texture.name;\n\tif (project.materials) {\n\t\tproject.materials[texture.uuid] = mat;\n\t} else if (texture._static?.properties) {\n\t\ttexture._static.properties.material = mat;\n\t}\n\n\t// Store the original mat for restoring\n\torigMats[texture.uuid] = originalMat;\n}\n\n/**\n * Checks if the format supports tinting. Support for other formats can be added by\n * adding \"allowTinting = true\" onto the format instance on creation.\n */\nfunction isTintingFormat(format) {\n\treturn format.id == 'java_block' || format.allowTinting;\n}"
  },
  {
    "path": "plugins/translation_plane_gizmo/about.md",
    "content": "# Translation Plane Gizmo\n\nEnhanced 2D plane gizmo for simultaneous multi-axis translation. Drag colored planes to move objects along two axes at once, just like in Blender.\n\n![Demo](https://raw.githubusercontent.com/JannisX11/blockbench-plugins/master/plugins/translation_plane_gizmo/demo.gif)\n\n## Features\n- **2D Plane Movement**: Drag colored planes (XY=Blue, XZ=Green, YZ=Red) to move objects along two axes at once\n- **Grid Snapping**: Hold Shift to toggle snapping for precise positioning\n- **Multi-Selection**: Works with multiple selected objects\n- **Parent Space Rotation**: Planes automatically align with parent object orientation (Entity formats)\n- **Toggle Button**: \"Toggle Translation Plane Gizmo\" `view_in_ar` - Enable/disable from toolbar\n\n## How it works\n- **XY Plane (Blue)**: Moves objects in X and Y directions simultaneously\n- **XZ Plane (Green)**: Moves objects in X and Z directions simultaneously\n- **YZ Plane (Red)**: Moves objects in Y and Z directions simultaneously\n\nWhen dragging a plane, only that plane remains visible for a cleaner interaction experience.\n\n## Compatibility\nWorks with cubes, meshes, and groups • Compatible with Java Block and Entity formats • Supports local and global transform spaces • Works with proportional editing • Compatible with Blockbench v4.8.0+\n"
  },
  {
    "path": "plugins/translation_plane_gizmo/changelog.json",
    "content": "{\n\t\"1.0.1\": {\n\t\t\"title\": \"1.0.1\",\n\t\t\"author\": \"AnnJ\",\n\t\t\"date\": \"2025-11-14\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Documentation\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Improved about.md with user-focused content\",\n\t\t\t\t\t\"Fixed demo GIF path to use GitHub raw URL\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"1.0.0\": {\n\t\t\"title\": \"1.0.0\",\n\t\t\"author\": \"AnnJ\",\n\t\t\"date\": \"2025-01-08\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Initial Release\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Created Plugin\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "plugins/translation_plane_gizmo/members.yml",
    "content": "maintainers:\n  - PlanesZwalker\n\ndevelopers:\n  - PlanesZwalker\n"
  },
  {
    "path": "plugins/translation_plane_gizmo/translation_plane_gizmo.js",
    "content": "(function() {\n    'use strict';\n\n    /**\n     * Translation Plane Gizmo Plugin v1.0.1\n     * \n     * Provides Blender-style 2D plane handles for simultaneous multi-axis translation\n     * in Blockbench. Features smart camera scaling, proper margins, and seamless\n     * integration with Blockbench's transform system.\n     * \n     * @author AnnJ\n     * @version 1.0.1\n     * @compatibility Blockbench v4.8.0+\n     */\n\n    const PLUGIN_ID = 'translation_plane_gizmo';\n\n    function detectLanguage() {\n        if (typeof Settings !== 'undefined' && Settings.language) {\n            return Settings.language.startsWith('fr') ? 'fr' : 'en';\n        }\n\n        const docLang = document.documentElement.lang || navigator.language;\n        if (docLang && docLang.startsWith('fr')) {\n            return 'fr';\n        }\n\n        return 'en';\n    }\n\n    function t(key) {\n        const lang = detectLanguage();\n        return translations[lang][key] || translations.en[key] || key;\n    }\n\n    const translations = {\n        en: {\n            'plane_gizmo_toggle': 'Toggle Translation Plane Gizmo',\n            'plane_gizmo_description': 'Enhanced 2D plane gizmo for simultaneous multi-axis translation',\n            'plane_gizmo_plugin_description': 'Adds 2D plane gizmos for multi-axis translation'\n        },\n        fr: {\n            'plane_gizmo_toggle': 'Basculer le Gizmo de Plan de Translation',\n            'plane_gizmo_description': 'Gizmo de plan 2D amélioré pour la translation multi-axes simultanée',\n            'plane_gizmo_plugin_description': 'Ajoute des gizmos de plan 2D pour la translation multi-axes'\n        }\n    };\n\n\n    const PLANE_CONFIG = {\n        baseOpacity: 0.6,\n        hoverOpacity: 1,\n        renderOrder: 99999,\n        snapToGrid: true,\n        gridSize: 1,\n        enableUndo: true,\n        planeSize: 0.15,\n        hoverScale: 1.1,\n        offsetDistance: 4\n    };\n\n    let planeHandles = [];\n    let gizmoGroup = null;\n    let isDragging = false;\n    let currentDragPlane = null;\n    let dragStartPoint = null;\n    let dragAppliedDelta = null;\n    let updateInterval = null;\n    let selectionPollingInterval = null;\n    let isGizmoEnabled = true;\n    let menuAction = null;\n    let lastHoveredPlane = null;\n    let cameraEventHandlers = { wheel: null, cameraMove: null };\n\n    /**\n     * Check if the current model format supports parent space rotation\n     * Java Block models don't support proper parent space, so we disable this feature for them\n     */\n    function supportsParentSpaceRotation() {\n        if (typeof Format === 'undefined' || !Format || !Format.id) {\n            return false;\n        }\n        \n        if (Format.id === 'java_block') {\n            return false;\n        }\n        \n        return true;\n    }\n\n    function isEntityFormat() {\n        if (typeof Format === 'undefined' || !Format || !Format.id) {\n            return false;\n        }\n        \n        return Format.id !== 'java_block';\n    }\n\n    function createSolidMaterial(color, opacity) {\n        return new THREE.MeshBasicMaterial({\n            color: color,\n            transparent: true,\n            opacity: opacity,\n            side: THREE.DoubleSide,\n            depthTest: false,\n            depthWrite: false,\n            alphaTest: 0.1,\n            polygonOffset: true,\n            polygonOffsetFactor: -1,\n            polygonOffsetUnits: -1\n        });\n    }\n\n    function getGizmoParent() {\n        if (gizmoGroup) return gizmoGroup;\n\n        gizmoGroup = new THREE.Group();\n        gizmoGroup.name = 'PlaneGizmoGroup';\n        gizmoGroup.renderOrder = PLANE_CONFIG.renderOrder;\n        scene.add(gizmoGroup);\n        return gizmoGroup;\n    }\n\n    function createPlaneHandles() {\n        if (planeHandles.length) {\n            return;\n        }\n\n        const handleSize = PLANE_CONFIG.planeSize;\n        const planeGeometries = {\n            XY: new THREE.PlaneGeometry(handleSize, handleSize),\n            XZ: new THREE.PlaneGeometry(handleSize, handleSize),\n            YZ: new THREE.PlaneGeometry(handleSize, handleSize)\n        };\n\n        const planes = [\n            { \n                name: 'XY', \n                rotation: new THREE.Euler(0, 0, 0), \n                offset: new THREE.Vector3(PLANE_CONFIG.offsetDistance * 0.5, PLANE_CONFIG.offsetDistance * 0.5, 0) \n            },\n            { \n                name: 'XZ', \n                rotation: new THREE.Euler(-Math.PI/2, 0, 0), \n                offset: new THREE.Vector3(PLANE_CONFIG.offsetDistance * 0.5, 0, PLANE_CONFIG.offsetDistance * 0.5) \n            },\n            { \n                name: 'YZ', \n                rotation: new THREE.Euler(0, Math.PI/2, 0), \n                offset: new THREE.Vector3(0, PLANE_CONFIG.offsetDistance * 0.5, PLANE_CONFIG.offsetDistance * 0.5) \n            }\n        ];\n\n        const parent = getGizmoParent();\n\n        planes.forEach(plane => {\n            let material;\n\n            if (plane.name === 'XY') {\n                material = createSolidMaterial(0x0000ff, PLANE_CONFIG.baseOpacity);\n            } else if (plane.name === 'XZ') {\n                material = createSolidMaterial(0x00ff00, PLANE_CONFIG.baseOpacity);\n            } else if (plane.name === 'YZ') {\n                material = createSolidMaterial(0xff0000, PLANE_CONFIG.baseOpacity);\n            }\n\n            const mesh = new THREE.Mesh(planeGeometries[plane.name], material);\n            mesh.rotation.copy(plane.rotation);\n            mesh.renderOrder = PLANE_CONFIG.renderOrder;\n            mesh.castShadow = false;\n            mesh.receiveShadow = false;\n            mesh.frustumCulled = false;\n            mesh.scale.setScalar(1.0);\n            mesh.userData = {\n                planeName: plane.name,\n                baseOpacity: PLANE_CONFIG.baseOpacity,\n                baseScale: PLANE_CONFIG.planeSize,\n                isPlaneGizmo: true,\n                offset: plane.offset.clone(),\n                originalRotation: plane.rotation.clone()\n            };\n\n            parent.add(mesh);\n            mesh.visible = true;\n            planeHandles.push(mesh);\n\n        });\n\n        parent.updateMatrixWorld(true);\n        \n        // Force canvas to recognize new objects and refresh raycasting system\n        if (Canvas && Canvas.scene) {\n            Canvas.scene.updateMatrixWorld(true);\n        }\n        \n        // Ensure raycasting knows about the plane objects\n        if (Canvas && Canvas.scene) {\n            Canvas.scene.traverse((obj) => {\n                if (obj.userData && obj.userData.isPlaneGizmo) {\n                    // Ensure proper raycast method is available\n                    if (!obj.raycast || typeof obj.raycast !== 'function') {\n                        obj.raycast = THREE.Mesh.prototype.raycast;\n                    }\n                }\n            });\n        }\n        \n        // Force canvas update to register new objects\n        if (Canvas && typeof Canvas.updateAll === 'function') {\n            Canvas.updateAll();\n        }\n    }\n\n    function toggleGizmo() {\n        isGizmoEnabled = !isGizmoEnabled;\n        updatePlaneHandles();\n\n        if (menuAction && menuAction.update) {\n            menuAction.update();\n        }\n\n        return isGizmoEnabled;\n    }\n\n    let cachedControlSize = null;\n    let cachedIsTouch = null;\n    let lastControlSizeCheck = 0;\n    let lastTouchCheck = 0;\n\n    function updatePlaneHandles() {\n        if (planeHandles.length === 0) return;\n\n        const now = Date.now();\n        if (now - lastControlSizeCheck > 100) {\n            cachedControlSize = safeGetControlSize();\n            lastControlSizeCheck = now;\n        }\n        if (now - lastTouchCheck > 1000) {\n            cachedIsTouch = safeIsTouch();\n            lastTouchCheck = now;\n        }\n\n        const mode = Toolbox?.selected?.transformerMode;\n        const isTranslate = mode === 'translate' || mode === 'move';\n\n        const hasSelection = Outliner && Outliner.selected && Outliner.selected.length > 0;\n        let validSelection = false;\n        \n        if (isEntityFormat()) {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el);\n            } else {\n                const allGroups = Project && Project.groups ? Project.groups : [];\n                const selectedGroups = allGroups.filter(g => g && g.selected);\n                validSelection = selectedGroups.length > 0;\n            }\n        } else {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el && (el.from || el.position));\n            }\n        }\n\n        const show = isGizmoEnabled \n                         && Transformer && Transformer.visible\n                         && Toolbox && Toolbox.selected\n                         && isTranslate\n                         && validSelection;\n\n        let center = new THREE.Vector3();\n        let hasValidSelection = false;\n\n        if (show && Transformer) {\n            if (Transformer.position) {\n                center.copy(Transformer.position);\n                hasValidSelection = true;\n            } else if (isEntityFormat() && hasSelection && Outliner.selected.length > 0) {\n                const firstSelected = Outliner.selected[0];\n                if (firstSelected) {\n                    if (firstSelected.origin && Array.isArray(firstSelected.origin) && firstSelected.origin.length >= 3) {\n                        center.set(firstSelected.origin[0] || 0, firstSelected.origin[1] || 0, firstSelected.origin[2] || 0);\n                        hasValidSelection = true;\n                    } else if (firstSelected.position && Array.isArray(firstSelected.position) && firstSelected.position.length >= 3) {\n                        center.set(firstSelected.position[0] || 0, firstSelected.position[1] || 0, firstSelected.position[2] || 0);\n                        hasValidSelection = true;\n                    } else {\n                        center.set(0, 0, 0);\n                        hasValidSelection = true;\n                    }\n                }\n            }\n        }\n\n        let cameraScale = 1.0;\n        if (hasValidSelection && Preview && Preview.selected && typeof Preview.selected.calculateControlScale === 'function') {\n            cameraScale = Preview.selected.calculateControlScale(center);\n        }\n\n        const scaledOffsetMultiplier = cameraScale * 1.5;\n        const baseScaleMultiplier = cameraScale * cachedControlSize * 0.74;\n        const touchMultiplier = cachedIsTouch ? 1.5 : 1.0;\n\n        planeHandles.forEach(handle => {\n            // During dragging, only show the current drag plane\n            if (isDragging && currentDragPlane) {\n                handle.visible = (handle === currentDragPlane) && show;\n            } else {\n                handle.visible = show;\n            }\n            if (!show) return;\n\n            if (hasValidSelection) {\n                if (handle.userData.offset) {\n                    const offset = handle.userData.offset;\n                    handle.position.x = center.x + offset.x * scaledOffsetMultiplier;\n                    handle.position.y = center.y + offset.y * scaledOffsetMultiplier;\n                    handle.position.z = center.z + offset.z * scaledOffsetMultiplier;\n                } else {\n                    handle.position.copy(center);\n                }\n\n                let isParentSpace = false;\n                let parentRotation = null;\n                if (supportsParentSpaceRotation() && Transformer && typeof Transformer.getTransformSpace === 'function') {\n                    const space = Transformer.getTransformSpace();\n                    if (typeof space === 'object' && space !== null) {\n                        isParentSpace = true;\n                        if (space.rotation) {\n                            const rot = space.rotation;\n                            if (Array.isArray(rot) && rot.length >= 3) {\n                                parentRotation = new THREE.Euler(\n                                    THREE.MathUtils.degToRad(rot[0]),\n                                    THREE.MathUtils.degToRad(rot[1]),\n                                    THREE.MathUtils.degToRad(rot[2]),\n                                    'XYZ'\n                                );\n                            }\n                        }\n                    }\n                }\n                \n                if (!parentRotation && isParentSpace && Transformer.rotation) {\n                    parentRotation = Transformer.rotation;\n                }\n                \n                if (isParentSpace && parentRotation) {\n                    const baseRotation = handle.userData.originalRotation || new THREE.Euler(0, 0, 0);\n                    const parentQuat = new THREE.Quaternion().setFromEuler(parentRotation);\n                    const baseQuat = new THREE.Quaternion().setFromEuler(baseRotation);\n                    const finalQuat = parentQuat.clone().multiply(baseQuat);\n                    handle.rotation.setFromQuaternion(finalQuat);\n                } else {\n                    handle.rotation.copy(handle.userData.originalRotation || new THREE.Euler(0, 0, 0));\n                }\n            } else {\n                handle.position.set(0, 0, 0);\n                handle.visible = false;\n            }\n\n            let dynamicScale = 1.0;\n\n            if (hasValidSelection) {\n                dynamicScale = baseScaleMultiplier * touchMultiplier;\n                dynamicScale = THREE.MathUtils.clamp(dynamicScale, 0.8, 1000.0);\n            }\n            handle.userData.baseScale = dynamicScale;\n\n            if (!handle.userData.isHovered) {\n                handle.scale.setScalar(handle.userData.baseScale);\n                handle.material.opacity = handle.userData.baseOpacity;\n            }\n        });   \n    }\n\n    function getRaycaster(event) {\n        const raycaster = new THREE.Raycaster();\n\n        let viewportEl = document.getElementById('preview') || \n                        document.querySelector('#preview canvas') ||\n                        document.querySelector('canvas');\n\n        if (!viewportEl) {\n            return raycaster;\n        }\n\n        const rect = viewportEl.getBoundingClientRect();\n\n        if (rect.width === 0 || rect.height === 0) {\n            return raycaster;\n        }\n\n        const mouse = new THREE.Vector2(\n            ((event.clientX - rect.left) / rect.width) * 2 - 1,\n            -((event.clientY - rect.top) / rect.height) * 2 + 1\n        );\n\n        mouse.x = THREE.MathUtils.clamp(mouse.x, -1, 1);\n        mouse.y = THREE.MathUtils.clamp(mouse.y, -1, 1);\n        if (Preview && Preview.selected && Preview.selected.camera) {\n            raycaster.setFromCamera(mouse, Preview.selected.camera);\n        }\n\n        return raycaster;\n    }\n\n    let hoverUpdateRequestId = null;\n\n    function updateHoverState(event) {\n        if (!planeHandles.length || isDragging) return;\n\n        if (hoverUpdateRequestId) {\n            cancelAnimationFrame(hoverUpdateRequestId);\n        }\n        hoverUpdateRequestId = requestAnimationFrame(() => {\n            performHoverUpdate(event);\n            hoverUpdateRequestId = null;\n        });\n    }\n\n    function performHoverUpdate(event) {\n        const mode = Toolbox?.selected?.transformerMode;\n        const isTranslate = mode === 'translate' || mode === 'move';\n        const hasSelection = Outliner && Outliner.selected && Outliner.selected.length > 0;\n        let validSelection = false;\n        \n        if (isEntityFormat()) {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el);\n            } else {\n                const allGroups = Project && Project.groups ? Project.groups : [];\n                const selectedGroups = allGroups.filter(g => g && g.selected);\n                validSelection = selectedGroups.length > 0;\n            }\n        } else {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el && (el.from || el.position));\n            }\n        }\n        \n        const shouldShow = !!(Transformer && Transformer.visible && Toolbox && Toolbox.selected && isTranslate && validSelection);\n\n        if (!shouldShow) {\n            if (lastHoveredPlane) {\n                resetPlaneHover(lastHoveredPlane);\n                lastHoveredPlane = null;\n            }\n            return;\n        }\n        if (planeHandles.length === 0) return;\n\n        const ray = getRaycaster(event);\n        const intersects = ray.intersectObjects(planeHandles, true);\n\n        let hoveredPlane = null;\n        if (intersects.length > 0) {\n            if (intersects[0].distance < 100) {\n                hoveredPlane = intersects[0].object;\n            }\n        }\n        if (hoveredPlane !== lastHoveredPlane) {\n            if (lastHoveredPlane) {\n                resetPlaneHover(lastHoveredPlane);\n            }\n\n            if (hoveredPlane) {\n                setPlaneHover(hoveredPlane);\n            }\n\n            lastHoveredPlane = hoveredPlane;\n        }\n    }\n\n    function resetPlaneHover(plane) {\n        if (!plane) return;\n\n        plane.userData.isHovered = false;\n        if (plane.material) {\n            plane.material.opacity = plane.userData.baseOpacity;\n            plane.material.needsUpdate = true;\n            plane.scale.setScalar(plane.userData.baseScale || 1.0);\n        }\n    }\n\n    function setPlaneHover(plane) {\n        if (!plane) return;\n\n        plane.userData.isHovered = true;\n        if (plane.material) {\n            plane.material.opacity = PLANE_CONFIG.hoverOpacity;\n            plane.material.needsUpdate = true;\n            plane.scale.setScalar((plane.userData.baseScale || 1.0) * PLANE_CONFIG.hoverScale);\n        }\n    }\n\n    function onMouseMove(event) {\n        if (!isDragging) {\n            updateHoverState(event);\n        }\n    }\n\n    function onMouseDown(event) {\n        if (event.button !== 0) return;\n\n        const isCanvasTarget = event.target.tagName?.toLowerCase() === 'canvas';\n        if (!isCanvasTarget) return;\n\n        const mode = Toolbox?.selected?.transformerMode;\n        const isTranslate = mode === 'translate' || mode === 'move';\n        const hasSelection = Outliner && Outliner.selected && Outliner.selected.length > 0;\n        let validSelection = false;\n        \n        if (isEntityFormat()) {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el);\n            } else {\n                const allGroups = Project && Project.groups ? Project.groups : [];\n                const selectedGroups = allGroups.filter(g => g && g.selected);\n                validSelection = selectedGroups.length > 0;\n            }\n        } else {\n            if (hasSelection) {\n                validSelection = Outliner.selected.some(el => el && (el.from || el.position));\n            }\n        }\n        \n        const shouldShow = !!(Transformer && Transformer.visible && Toolbox && Toolbox.selected && isTranslate && validSelection);\n\n        if (!shouldShow) return;\n\n        const ray = getRaycaster(event);\n        const intersects = ray.intersectObjects(planeHandles, true);\n\n        if (intersects.length === 0) return;\n\n        event.preventDefault();\n        event.stopPropagation();\n        event.stopImmediatePropagation();\n\n        event.isPlaneGizmoInteraction = true;\n\n        isDragging = true;\n        currentDragPlane = intersects[0].object;\n        dragStartPoint = intersects[0].point.clone();\n        dragAppliedDelta = new THREE.Vector3(0, 0, 0);\n\n        if (PLANE_CONFIG.enableUndo && Undo && Undo.initEdit) {\n            const undoable = (Outliner.selected || []).filter(el => typeof el.getUndoCopy === 'function');\n            Undo.initEdit({\n                elements: undoable,\n                selection: true,\n                outliner: true\n            });\n        }\n\n        document.addEventListener('mousemove', onMouseMoveDrag, true);\n        document.addEventListener('mouseup', onMouseUp, true);\n    }\n\n    function onMouseMoveDrag(event) {\n        if (!isDragging || !currentDragPlane || !Outliner.selected) return;\n\n        const ray = getRaycaster(event);\n        const planeName = currentDragPlane.userData.planeName;\n        const plane = new THREE.Plane();\n\n        const localNormal = new THREE.Vector3(0, 0, 1);\n        const worldNormal = localNormal.clone().applyQuaternion(\n            currentDragPlane.getWorldQuaternion(new THREE.Quaternion())\n        );\n        plane.setFromNormalAndCoplanarPoint(worldNormal, dragStartPoint);\n\n        const intersectPoint = new THREE.Vector3();\n        if (!ray.ray.intersectPlane(plane, intersectPoint)) return;\n\n        const worldDelta = intersectPoint.clone().sub(dragStartPoint);\n\n        let isParentSpace = false;\n        let parentRotation = null;\n        if (supportsParentSpaceRotation() && Transformer && typeof Transformer.getTransformSpace === 'function') {\n            const space = Transformer.getTransformSpace();\n            if (typeof space === 'object' && space !== null) {\n                isParentSpace = true;\n                if (space.rotation) {\n                    const rot = space.rotation;\n                    if (Array.isArray(rot) && rot.length >= 3) {\n                        parentRotation = new THREE.Euler(\n                            THREE.MathUtils.degToRad(rot[0]),\n                            THREE.MathUtils.degToRad(rot[1]),\n                            THREE.MathUtils.degToRad(rot[2]),\n                            'XYZ'\n                        );\n                    }\n                }\n            }\n        }\n        \n        if (!parentRotation && isParentSpace && Transformer && Transformer.rotation) {\n            parentRotation = Transformer.rotation;\n        }\n        \n        let parentXAxis = new THREE.Vector3(1, 0, 0);\n        let parentYAxis = new THREE.Vector3(0, 1, 0);\n        let parentZAxis = new THREE.Vector3(0, 0, 1);\n        \n        if (isParentSpace && parentRotation) {\n            const parentQuaternion = new THREE.Quaternion().setFromEuler(parentRotation);\n            parentXAxis.applyQuaternion(parentQuaternion);\n            parentYAxis.applyQuaternion(parentQuaternion);\n            parentZAxis.applyQuaternion(parentQuaternion);\n        }\n\n        let desired = new THREE.Vector3();\n        if (planeName === 'XY') {\n            desired.x = worldDelta.dot(parentXAxis);\n            desired.y = worldDelta.dot(parentYAxis);\n            desired.z = 0;\n        } else if (planeName === 'XZ') {\n            desired.x = worldDelta.dot(parentXAxis);\n            desired.y = 0;\n            desired.z = worldDelta.dot(parentZAxis);\n        } else if (planeName === 'YZ') {\n            desired.x = 0;\n            desired.y = worldDelta.dot(parentYAxis);\n            desired.z = worldDelta.dot(parentZAxis);\n        }\n\n        const snapping = PLANE_CONFIG.snapToGrid ^ (event.shiftKey === true);\n        if (snapping) {\n            const g = PLANE_CONFIG.gridSize;\n            desired.x = Math.round(desired.x / g) * g;\n            desired.y = Math.round(desired.y / g) * g;\n            desired.z = Math.round(desired.z / g) * g;\n        }\n\n        const inc = desired.clone().sub(dragAppliedDelta || new THREE.Vector3());\n        dragAppliedDelta.add(inc);\n        if (inc.x) moveElementsInSpace(inc.x, 0);\n        if (inc.y) moveElementsInSpace(inc.y, 1);\n        if (inc.z) moveElementsInSpace(inc.z, 2);\n\n        if (Transformer && Transformer.update) Transformer.update();\n        if (Canvas && Canvas.updatePositions) Canvas.updatePositions();\n        if (Canvas && Canvas.updateView) {\n            Canvas.updateView({\n                elements: Outliner.selected,\n                element_aspects: { transform: true, geometry: true }\n            });\n        }\n    }\n\n    function onMouseUp(event) {\n        if (!isDragging) return;\n\n        if (PLANE_CONFIG.enableUndo && Undo && Undo.finishEdit) {\n            Undo.finishEdit('Plane Translation');\n        }\n\n        isDragging = false;\n        currentDragPlane = null;\n        dragStartPoint = null;\n        dragAppliedDelta = null;\n\n        document.removeEventListener('mousemove', onMouseMoveDrag, { passive: false, capture: true });\n        document.removeEventListener('mouseup', onMouseUp, { passive: false, capture: true });\n\n        if (Canvas && Canvas.updateView) {\n                Canvas.updateView({\n                    elements: Outliner.selected,\n                element_aspects: { geometry: true, transform: true },\n                    selection: true\n                });\n            }\n\n        if (Transformer && Transformer.update) {\n            Transformer.update();\n        }\n    }\n\n    function addMouseEvents() {\n        const canvas = document.querySelector('canvas');\n        if (canvas) {\n            canvas.addEventListener('mousemove', onMouseMove, { passive: true });\n            canvas.addEventListener('mousedown', onMouseDown, true);\n            canvas.addEventListener('mouseleave', onMouseLeave, { passive: true });\n        }\n    }\n\n    function onMouseLeave(event) {\n        if (lastHoveredPlane) {\n            resetPlaneHover(lastHoveredPlane);\n            lastHoveredPlane = null;\n        }\n    }\n\n    function removeMouseEvents() {\n        const canvas = document.querySelector('canvas');\n        if (canvas) {\n            canvas.removeEventListener('mousemove', onMouseMove, { passive: true });\n            canvas.removeEventListener('mousedown', onMouseDown, true);\n            canvas.removeEventListener('mouseleave', onMouseLeave, { passive: true });\n\n            if (cameraEventHandlers.wheel) {\n                canvas.removeEventListener('wheel', cameraEventHandlers.wheel, { passive: true });\n            }\n            if (cameraEventHandlers.cameraMove) {\n                canvas.removeEventListener('mousemove', cameraEventHandlers.cameraMove, { passive: true });\n            }\n        }\n        document.removeEventListener('mousemove', onMouseMoveDrag, { passive: false, capture: true });\n        document.removeEventListener('mouseup', onMouseUp, { passive: false, capture: true });\n    }\n\n    function removePlaneHandles() {\n        planeHandles.forEach(h => {\n            if (h.parent) h.parent.remove(h);\n            if (h.material) h.material.dispose();\n            if (h.geometry) h.geometry.dispose();\n        });\n        planeHandles = [];\n    }\n\n    function safeGetControlSize() {\n        return (settings && settings.control_size && settings.control_size.value) || 1.0;\n    }\n\n    function safeIsTouch() {\n        return (Blockbench && typeof Blockbench.isTouch === 'boolean') ? Blockbench.isTouch : false;\n    }\n\n\n    function getLocalizedActionName() {\n        return t('plane_gizmo_toggle');\n    }\n\n    function getLocalizedPluginDescription() {\n        return t('plane_gizmo_description');\n    }\n\n    function createToolbarButton() {\n        const actionName = getLocalizedActionName();\n\n        if (typeof Action !== 'undefined') {\n            menuAction = new Action('plane_gizmo_toggle', {\n                name: actionName,\n                description: t('plane_gizmo_description'),\n                icon: 'view_in_ar',\n                click: () => {\n                    toggleGizmo();\n                },\n                condition: {\n                    modes: ['edit']\n                }\n            });\n\n            if (MenuBar && typeof MenuBar.addAction === 'function') {\n                MenuBar.addAction(menuAction, 'toolbar');\n            }\n        }\n    }\n\n\n    Plugin.register(PLUGIN_ID, {\n        title: 'Translation Plane Gizmo',\n        author: 'AnnJ',\n        description: getLocalizedPluginDescription(),\n        icon: 'control_camera',\n        version: '1.0.1',\n        min_version: '4.8.0',\n        variant: 'both',\n        tags: ['Gizmo', 'Translation', 'Tools'],\n        contributes: {\n            actions: [\n                {\n                    id: 'plane_gizmo_toggle',\n                    name: 'Toggle Translation Plane Gizmo',\n                    description: 'Enable/disable the translation plane gizmo for multi-axis movement',\n                    icon: 'view_in_ar'\n                }\n            ],\n            tools: [\n                {\n                    id: 'translation_plane_gizmo',\n                    name: 'Translation Plane Gizmo',\n                    description: '2D plane handles for multi-axis translation (XY=Blue, XZ=Green, YZ=Red)',\n                    icon: 'control_camera'\n                }\n            ]\n        },\n\n        onload() {\n            // Defer gizmo creation to ensure canvas is fully ready\n            setTimeout(() => {\n                createPlaneHandles();\n                addMouseEvents();\n                \n                // Force another update after initialization to ensure raycasting is ready\n                if (Canvas && typeof Canvas.updateAll === 'function') {\n                    Canvas.updateAll();\n                }\n            }, 100);\n            \n            createToolbarButton();\n\n\n            updateInterval = setInterval(() => {\n                if (Transformer && Transformer.visible) {\n                    updatePlaneHandles();\n                }\n            }, 16);\n\n            let lastSelectionLength = Outliner.selected ? Outliner.selected.length : 0;\n\n            selectionPollingInterval = setInterval(() => {\n                const currentLength = Outliner.selected ? Outliner.selected.length : 0;\n                if (currentLength !== lastSelectionLength) {\n                    lastSelectionLength = currentLength;\n                    if (isGizmoEnabled) {\n                        updatePlaneHandles();\n                    }\n                }\n            }, 50);\n\n            const canvas = document.querySelector('canvas');\n            if (canvas) {\n                cameraEventHandlers.wheel = () => {\n                    if (isGizmoEnabled && Transformer && Transformer.visible) {\n                        updatePlaneHandles();\n                    }\n                };\n                canvas.addEventListener('wheel', cameraEventHandlers.wheel, { passive: true });\n\n                cameraEventHandlers.cameraMove = (event) => {\n                    if (isGizmoEnabled && Transformer && Transformer.visible && \n                        (event.buttons === 2 || event.buttons === 4)) {\n                        updatePlaneHandles();\n                    }\n                };\n                canvas.addEventListener('mousemove', cameraEventHandlers.cameraMove, { passive: true });\n            }\n        },\n\n        onunload() {\n            if (hoverUpdateRequestId) {\n                cancelAnimationFrame(hoverUpdateRequestId);\n                hoverUpdateRequestId = null;\n            }\n\n            removeMouseEvents();\n\n            if (updateInterval) {\n                clearInterval(updateInterval);\n                updateInterval = null;\n            }\n\n            if (selectionPollingInterval) {\n                clearInterval(selectionPollingInterval);\n                selectionPollingInterval = null;\n            }\n\n            removePlaneHandles();\n\n            if (gizmoGroup && scene) {\n                scene.remove(gizmoGroup);\n            }\n\n            if (menuAction && MenuBar && typeof MenuBar.removeAction === 'function') {\n                MenuBar.removeAction('plane_gizmo_toggle', 'toolbar');\n                MenuBar.removeAction('plane_gizmo_toggle', 'view');\n                MenuBar.removeAction('plane_gizmo_toggle', 'edit');\n                menuAction = null;\n            }\n\n            gizmoGroup = null;\n            lastHoveredPlane = null;\n            cameraEventHandlers = { wheel: null, cameraMove: null };\n        }\n    });\n})()\n"
  },
  {
    "path": "plugins/transparency_fix.js",
    "content": "(function() {\n\n// Plugin variables isolated outside registration\nlet fixEnabled = false;\nlet originalRenderOrders = new Map();\nlet toggleAction;\n\nfunction hasTransparentTexture(cube) {\n    if (!cube.faces) return false;\n\n    for (let face in cube.faces) {\n        let faceData = cube.faces[face];\n        if (faceData.texture !== null && faceData.texture !== undefined) {\n            let tex = Texture.all.find(t => t.uuid === faceData.texture || t.id == faceData.texture);\n            if (tex && tex.ctx) {\n                try {\n                    let canvas = tex.ctx.canvas || tex.canvas;\n                    if (canvas) {\n                        let ctx = canvas.getContext('2d');\n                        let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n                        for (let i = 3; i < imgData.data.length; i += 4) {\n                            if (imgData.data[i] < 250 && imgData.data[i] > 0) {\n                                return true;\n                            }\n                        }\n                    }\n                } catch (e) {}\n            }\n        }\n    }\n    return false;\n}\n\nfunction isGlassByName(name) {\n    if (!name) return false;\n    let n = name.toLowerCase();\n    return n.includes('glass') || n.includes('window') || n.includes('transparent') ||\n           n.includes('crystal') || n.includes('ice') || n.includes('water');\n}\n\nfunction isInnerByName(name) {\n    if (!name) return false;\n    let n = name.toLowerCase();\n    return n.includes('liquid') || n.includes('glow') || n.includes('inner') ||\n           n.includes('potion') || n.includes('contents') || n.includes('fill');\n}\n\nfunction isInsideOther(cube, allCubes) {\n    let from1 = cube.from || [0, 0, 0];\n    let to1 = cube.to || [0, 0, 0];\n\n    for (let other of allCubes) {\n        if (other.uuid === cube.uuid) continue;\n\n        let from2 = other.from || [0, 0, 0];\n        let to2 = other.to || [0, 0, 0];\n\n        if (from1[0] >= from2[0] && to1[0] <= to2[0] &&\n            from1[1] >= from2[1] && to1[1] <= to2[1] &&\n            from1[2] >= from2[2] && to1[2] <= to2[2]) {\n            if (hasTransparentTexture(other) || isGlassByName(other.name)) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction applyTransparencyFix() {\n    if (typeof Cube === 'undefined' || !Cube.all) return;\n\n    let allCubes = Cube.all;\n    let transparentCubes = [];\n    let innerCubes = [];\n\n    allCubes.forEach(cube => {\n        if (!cube.mesh) return;\n\n        if (!originalRenderOrders.has(cube.uuid)) {\n            originalRenderOrders.set(cube.uuid, cube.mesh.renderOrder);\n        }\n\n        let isTransparent = hasTransparentTexture(cube) || isGlassByName(cube.name);\n        let isInner = isInnerByName(cube.name);\n\n        if (isTransparent && !isInner) {\n            transparentCubes.push(cube);\n        } else if (isInner || isInsideOther(cube, allCubes)) {\n            innerCubes.push(cube);\n        }\n    });\n\n    innerCubes.forEach(cube => {\n        cube.mesh.renderOrder = -100;\n    });\n\n    transparentCubes.forEach(cube => {\n        cube.mesh.renderOrder = 100;\n    });\n\n    Canvas.updateView({elements: allCubes, element_aspects: {transform: true}});\n}\n\nfunction removeTransparencyFix() {\n    if (typeof Cube !== 'undefined' && Cube.all) {\n        Cube.all.forEach(cube => {\n            if (!cube.mesh) return;\n            cube.mesh.renderOrder = originalRenderOrders.get(cube.uuid) || 0;\n        });\n\n        Canvas.updateView({elements: Cube.all, element_aspects: {transform: true}});\n    }\n\n    originalRenderOrders.clear();\n}\n\nPlugin.register('transparency_fix', {\n    title: 'Transparency Fix',\n    author: 'Larsonix',\n    description: 'Shows objects inside transparent containers (glass, windows, etc.)',\n    about: 'This plugin fixes the visibility of objects inside transparent containers by adjusting render order.\\n\\n## Features\\n- Auto-detects transparent textures by scanning alpha values\\n- Name-based detection (glass, window, crystal, ice, liquid, glow, etc.)\\n- Geometry detection - finds cubes inside transparent containers\\n\\n## Usage\\nGo to **View > Toggle Transparency Fix** to enable/disable.\\n\\n## Note\\nSome visual artifacts on transparent faces are a WebGL limitation and cannot be fixed. Models will render correctly in game engines.',\n    icon: 'visibility',\n    version: '2.1.0',\n    min_version: '4.0.0',\n    variant: 'both',\n    tags: ['Rendering', 'Utility'],\n\n    onload() {\n        toggleAction = new Action('toggle_transparency_fix', {\n            name: 'Toggle Transparency Fix',\n            description: 'See objects inside transparent cubes (glass, windows, etc.)',\n            icon: 'visibility',\n            click() {\n                fixEnabled = !fixEnabled;\n                if (fixEnabled) {\n                    applyTransparencyFix();\n                    Blockbench.showQuickMessage('Transparency Fix: ON', 1500);\n                } else {\n                    removeTransparencyFix();\n                    Blockbench.showQuickMessage('Transparency Fix: OFF', 1500);\n                }\n            }\n        });\n\n        MenuBar.addAction(toggleAction, 'view');\n\n        // Enable by default\n        fixEnabled = true;\n        setTimeout(applyTransparencyFix, 500);\n\n        Blockbench.on('select_project', () => {\n            if (fixEnabled) {\n                originalRenderOrders.clear();\n                setTimeout(applyTransparencyFix, 200);\n            }\n        });\n\n        Blockbench.on('load_project', () => {\n            if (fixEnabled) {\n                originalRenderOrders.clear();\n                setTimeout(applyTransparencyFix, 200);\n            }\n        });\n\n        Blockbench.on('update_texture', () => {\n            if (fixEnabled) setTimeout(applyTransparencyFix, 100);\n        });\n    },\n\n    onunload() {\n        if (fixEnabled) removeTransparencyFix();\n        toggleAction.delete();\n    },\n\n    oninstall() {\n        Blockbench.showQuickMessage('Transparency Fix installed! Find it in View menu.', 3000);\n    }\n});\n\n})();\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/.vscode/settings.json",
    "content": "{\n    \"terminal.integrated.cwd\": \"${workspaceFolder}/src\"\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/about.md",
    "content": "**Tweaks & Stuff** plugin adds a handful of utility features that can be toggled in settings. By default, all tweaks are enabled.\n\n## Tweaks\n\nTweaks are configurable through the plugin settings, found in the tab bar that includes this document.\n\n### Header Color\n\nSee your current profile at a glace.\n\n![Header in all profile colors.](https://docs.lpsmods.dev/images/tweaks_n_stuff/header_color.webp)\n\n### Wrap Tabs\n\nQuickly navigate large workspaces.\n\n![wrap tabs](https://docs.lpsmods.dev/images/tweaks_n_stuff/wrap_tabs.webp)\n\n## Utilities\n\n### Close Actions\n\nAdds `Close Others`, `Close to the Right`, `Close Saved`, and `Close All` to the project context menu, opened by right-clicking on a project tab.\n\n![close actions](https://docs.lpsmods.dev/images/tweaks_n_stuff/close_actions.webp)\n\n### Pin Tab\n\nAdds `Pin Tab` and `Unpin Tab` to the project context menu, opened by right-clicking on a project tab.\n\n![pin tabs](https://docs.lpsmods.dev/images/tweaks_n_stuff/pin_tab.webp)\n\n> The wrench used in the plugin icon is from the [Silk Icon Set](https://opengameart.org/content/application-silk-icon-set-13) by Mark James under [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/)\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/changelog.json",
    "content": "{\n  \"1.0.0\": {\n    \"title\": \"1.0.0\",\n    \"date\": \"2024-10-7\",\n    \"author\": \"legopitstop\",\n    \"categories\": [\n      {\n        \"title\": \"General\",\n        \"list\": [\"Initial release\"]\n      }\n    ]\n  },\n  \"1.0.1\": {\n    \"title\": \"1.0.1\",\n    \"date\": \"2024-11-3\",\n    \"author\": \"WalkQuackBack\",\n    \"categories\": [\n      {\n        \"title\": \"General\",\n        \"list\": [\"About changes\"]\n      }\n    ]\n  },\n  \"1.0.2\": {\n    \"title\": \"1.0.2\",\n    \"date\": \"2025-1-24\",\n    \"author\": \"legopitstop\",\n    \"categories\": [\n      {\n        \"title\": \"General\",\n        \"list\": [\"Removed `Image Exporter` tweak\"]\n      }\n    ]\n  },\n  \"1.1.0\": {\n    \"title\": \"1.1.0\",\n    \"date\": \"2025-10-27\",\n    \"author\": \"legopitstop\",\n    \"categories\": [\n      {\n        \"title\": \"General\",\n        \"list\": [\"Plugin now uses typescript.\", \"Added translation support. (Translations found in `plugins/tweaks_n_stuff/src/ts/lang`)\"]\n      },\n      {\n        \"title\": \"New Tweaks\",\n        \"list\": [\"Added `Pin Tab` tweak.\"]\n      },\n      {\n        \"title\": \"Bug Fixes\",\n        \"list\": [\"Changing the profile color wouldn't update the header color.\"]\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/members.yml",
    "content": "maintainers:\n  - legopitstop\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/.prettierrc.json",
    "content": "{\n  \"printWidth\": 120\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/build.mjs",
    "content": "import { build } from \"esbuild\";\n\nconst buildOptions = {\n  entryPoints: [\"./ts\"],\n  outfile: \"../tweaks_n_stuff.js\",\n  format: \"esm\",\n  bundle: true,\n  minify: true,\n};\n\nawait build({ ...buildOptions });\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/package.json",
    "content": "{\n  \"name\": \"tweaks_n_stuff\",\n  \"private\": true,\n  \"main\": \"./ts/index.ts\",\n  \"scripts\": {\n    \"build\": \"node build.mjs\",\n    \"rebuild\": \"npm run build && echo Done!\",\n    \"dev\": \"chokidar \\\"ts/**/*\\\" -c \\\"npm run rebuild\\\" -d\"\n  },\n  \"keywords\": [\n    \"blockbench\"\n  ],\n  \"author\": \"legopitstop\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"esbuild\": \"^0.25.11\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"devDependencies\": {\n    \"blockbench-types\": \"^5.0.0\",\n    \"chokidar-cli\": \"^3.0.0\"\n  }\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/constants.ts",
    "content": "export const VERSION = \"1.1.0\";\nexport const ID = \"tweaks_n_stuff\";\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/index.ts",
    "content": "import \"./languages\";\nimport { VERSION, ID } from \"./constants\";\nimport { Tweak, TweakConfig } from \"./tweaks/base\";\nimport { Mixins } from \"./mixins\";\nimport \"./tweaks\";\n\nvar deleteables: Deletable[] = [];\n\nBBPlugin.register(ID, {\n  title: \"Tweaks & Stuff\",\n  author: \"legopitstop\",\n  icon: \"icon.png\",\n  description: \"Adds a few tweaks to Blockbench to make your modeling experience better.\",\n  has_changelog: true,\n  website: \"https://docs.lpsmods.dev/tweaks_n_stuff\",\n  repository: \"https://github.com/legopitstop/blockbench-plugins/tree/master/src/tweaks_n_stuff\",\n  variant: \"both\",\n  version: VERSION,\n  min_version: \"4.8.0\",\n  tags: [\"Blockbench\"],\n  new_repository_format: true,\n  oninstall() {\n    Tweak.all.forEach((tweak) => tweak.install());\n  },\n  onuninstall() {\n    Tweak.all.forEach((tweak) => tweak.uninstall());\n  },\n  onload() {\n    Mixins.load();\n    TweakConfig.load();\n    Tweak.all.forEach((tweak) => tweak.load());\n    if (Tweak.all.size == 0) {\n      console.warn(\"No tweaks registered!\");\n    }\n  },\n  onunload() {\n    Mixins.unload();\n    Tweak.all.forEach((tweak) => tweak.unload());\n    deleteables.forEach((d) => d?.delete());\n  },\n});\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/cz.json",
    "content": "{}"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/de.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/en.json",
    "content": "{\n  \"settings.header_color\": \"Header Color\",\n  \"settings.header_color.desc\": \"Sets the color of the header depending on the profile color.\",\n  \"settings.close_actions\": \"Close Actions\",\n  \"settings.close_actions.desc\": \"Adds 'Close Others', 'Close to the Right', 'Close Saved', and 'Close All' to the project context menu, opened by right-clicking on a project tab.\",\n  \"settings.pin_tab\": \"Pin Tab\",\n  \"settings.pin_tab.desc\": \"Adds 'Pin Tab' and 'Unpin Tab' to the project context menu, opened by right-clicking on a project tab.\",\n  \"settings.wrap_tabs\": \"Wrap Tabs\",\n  \"settings.wrap_tabs.desc\": \"Controls whether tabs should be wrapped over multiple lines when exceeding available space or whether a scrollbar should appear instead.\",\n  \"action.close_others\": \"Close Others\",\n  \"action.close_others.desc\": \"Close all tabs but this one.\",\n  \"action.close_right\": \"Close to the Right\",\n  \"action.close_right.desc\": \"Close all tabs to the right.\",\n  \"action.close_saved\": \"Close Saved\",\n  \"action.close_saved.desc\": \"Close all saved tabs.\",\n  \"action.close_all\": \"Close All\",\n  \"action.close_all.desc\": \"Close all tabs.\",\n  \"action.pin_tab\": \"Pin Tab\",\n  \"action.pin_tab.desc\": \"desc\",\n  \"action.unpin_tab\": \"Unpin Tab\",\n  \"action.unpin_tab.desc\": \"desc\"\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/es.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/fr.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/it.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/ja.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/ko.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/nl.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/pl.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/pt.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/ru.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/sv.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/uk.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/vi.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/zh.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/lang/zh_tw.json",
    "content": "{}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/languages.ts",
    "content": "import cz from \"./lang/cz.json\";\nimport de from \"./lang/de.json\";\nimport en from \"./lang/en.json\";\nimport es from \"./lang/es.json\";\nimport fr from \"./lang/fr.json\";\nimport it from \"./lang/it.json\";\nimport ja from \"./lang/ja.json\";\nimport ko from \"./lang/ko.json\";\nimport nl from \"./lang/nl.json\";\nimport pl from \"./lang/pl.json\";\nimport pt from \"./lang/pt.json\";\nimport ru from \"./lang/ru.json\";\nimport sv from \"./lang/sv.json\";\nimport uk from \"./lang/uk.json\";\nimport vi from \"./lang/vi.json\";\nimport zh_tw from \"./lang/zh_tw.json\";\nimport zh from \"./lang/zh.json\";\n\nLanguage.addTranslations(\"cz\", cz);\nLanguage.addTranslations(\"de\", de);\nLanguage.addTranslations(\"en\", en);\nLanguage.addTranslations(\"es\", es);\nLanguage.addTranslations(\"fr\", fr);\nLanguage.addTranslations(\"it\", it);\nLanguage.addTranslations(\"ja\", ja);\nLanguage.addTranslations(\"ko\", ko);\nLanguage.addTranslations(\"nl\", nl);\nLanguage.addTranslations(\"pl\", pl);\nLanguage.addTranslations(\"pt\", pt);\nLanguage.addTranslations(\"ru\", ru);\nLanguage.addTranslations(\"sv\", sv);\nLanguage.addTranslations(\"uk\", uk);\nLanguage.addTranslations(\"vi\", vi);\nLanguage.addTranslations(\"zh_tw\", zh_tw);\nLanguage.addTranslations(\"zh\", zh);\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/mixins.ts",
    "content": "export abstract class Mixins {\n  private static selectProfile: (update: boolean) => void;\n  private static unselectProfile: (update: boolean) => void;\n  private static hideDialog: () => Dialog;\n  private static showDialog: (anchor?: HTMLElement) => Dialog;\n\n  static load(): void {\n    this.selectProfile = SettingsProfile.prototype.select;\n    SettingsProfile.prototype.select = function (...args) {\n      Mixins.selectProfile.apply(this, args);\n      // @ts-ignore\n      Blockbench.dispatchEvent(\"profile_changed\", {\n        profile: SettingsProfile.selected,\n      });\n    };\n\n    this.unselectProfile = SettingsProfile.unselect;\n    SettingsProfile.unselect = function (...args) {\n      Mixins.unselectProfile.apply(this, args);\n      // @ts-ignore\n      Blockbench.dispatchEvent(\"profile_changed\", { profile: null });\n    };\n\n    this.hideDialog = Dialog.prototype.hide;\n    Dialog.prototype.hide = function (...args) {\n      // @ts-ignore\n      Blockbench.dispatchEvent(\"hide_dialog\", Dialog.open);\n      return Mixins.hideDialog.apply(this, args);\n    };\n\n    this.showDialog = Dialog.prototype.show;\n    Dialog.prototype.show = function (...args) {\n      const result = Mixins.showDialog.apply(this, args);\n      // @ts-ignore\n      Blockbench.dispatchEvent(\"show_dialog\", Dialog.open);\n      return result;\n    };\n  }\n\n  static unload(): void {\n    SettingsProfile.prototype.select = Mixins.selectProfile;\n    SettingsProfile.unselect = Mixins.unselectProfile;\n    Dialog.prototype.hide = Mixins.hideDialog;\n    Dialog.prototype.show = Mixins.showDialog;\n  }\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/base.ts",
    "content": "import { ID } from \"../constants\";\nimport { wrapError } from \"../utils\";\n\nexport interface TweakOptions {\n  author?: string;\n  category?: string;\n  condition?: ConditionResolvable;\n  name?: string;\n  description?: string;\n}\n\nexport class Tweak {\n  static all = new Map<string, Tweak>();\n  static dialog: Dialog;\n  static action: Action;\n\n  id: string;\n  author: string;\n  category: string;\n  condition: ConditionResolvable;\n  pluginId: string;\n  setting: Setting | undefined;\n  name?: string;\n  description?: string;\n\n  isActive: boolean = false;\n  deleteables: Deletable[];\n\n  /**\n   * Base tweak class.\n   *\n   * @param {string} id\n   * @param {TweakOptions} options\n   */\n  constructor(id: string, options?: TweakOptions) {\n    this.id = id;\n    this.name = options?.name;\n    this.description = options?.description;\n    this.author = options?.author ?? \"unset\";\n    this.category = options?.category ?? \"unset\";\n    this.condition = options?.condition ?? true;\n    this.pluginId = ID;\n    this.deleteables = [];\n    this.setup();\n    Tweak.all.set(this.id, this);\n    console.debug(`🔧 Registered tweak \"${this.id}\"`);\n  }\n\n  createConfig(): any {\n    return {\n      enabled: true,\n    };\n  }\n\n  get config(): any {\n    return TweakConfig.settings[this.id];\n  }\n\n  set config(value) {\n    TweakConfig.settings[this.id] = value;\n  }\n\n  /**\n   * Load this tweak.\n   */\n  load(): void {\n    this.setup();\n    wrapError(this.onLoad.bind(this));\n  }\n\n  /**\n   * Unload this tweak.\n   */\n  unload(): void {\n    wrapError(this.onUnload.bind(this));\n    this.delete();\n  }\n\n  /**\n   * Install this tweak.\n   */\n  install(): void {\n    wrapError(this.onInstall.bind(this));\n  }\n\n  /**\n   * Uninstall this tweak.\n   */\n  uninstall(): void {\n    wrapError(this.onUninstall.bind(this));\n  }\n\n  /**\n   * Delete this tweak with its setting and deleteables.\n   */\n  delete(): void {\n    this.deleteables.forEach((e) => e.delete());\n    if (this.setting) this.setting.delete();\n  }\n\n  /**\n   * Enable this tweak.\n   */\n  enable(): void {\n    console.debug(`✅ Enabled tweak \"${this.id}\"`);\n    this.isActive = true;\n  }\n\n  /**\n   * Disable this tweak.\n   */\n  disable(): void {\n    this.deleteables.forEach((e) => e.delete());\n    if (!this.isActive) return;\n    console.debug(`❌ Disabled tweak \"${this.id}\"`);\n  }\n\n  /**\n   * Called when this tweak is created.\n   */\n  setup(): void {}\n\n  // EVENTS\n\n  /**\n   * Called when this tweak is loaded.\n   */\n  onLoad(): void {}\n\n  /**\n   * Called when this tweak is unloaded.\n   */\n  onUnload(): void {}\n\n  /**\n   * Called when this plugin is installed.\n   */\n  onInstall(): void {}\n\n  /**\n   * Called when this plugin is uninstalled.\n   */\n  onUninstall(): void {}\n}\n\n/**\n * Base tweak with a \"toggle\" setting.\n */\nexport class ToggleTweak extends Tweak {\n  defaultValue: boolean;\n\n  constructor(id: string, options?: TweakOptions, defaultValue: boolean = true) {\n    super(id, options);\n    this.defaultValue = defaultValue;\n  }\n\n  get disabled() {\n    return !(Settings.get(this.id) ?? false);\n  }\n\n  setup() {\n    this.isActive = false;\n    this.setting = new Setting(this.id, {\n      name: this.name,\n      type: \"toggle\",\n      value: this.defaultValue,\n      description: this.description,\n      category: this.category,\n      condition: this.condition,\n      onChange: (v) => this.change(v),\n    });\n  }\n\n  enable(): void {\n    super.enable();\n    if (!this.onEnable) return;\n    wrapError(this.onEnable.bind(this));\n  }\n\n  disable(): void {\n    super.disable();\n    if (!this.isActive) return;\n    this.isActive = false;\n    if (!this.onDisable) return;\n    wrapError(this.onDisable.bind(this));\n  }\n\n  private change(value: boolean): void {\n    if (this.onChange) this.onChange(value);\n    this.disable();\n    if (!value) return;\n    return this.enable();\n  }\n\n  // EVENTS\n\n  onLoad(): void {\n    if (this.disabled) return;\n    this.enable();\n  }\n\n  onUnload(): void {\n    this.disable();\n  }\n\n  onChange?(value: boolean): void;\n\n  /**\n   * Called when this tweak is enabled.\n   */\n  onEnable?(): void;\n\n  /**\n   * Called when this tweak is disabled.\n   */\n  onDisable?(): void;\n}\n\n/**\n * Base tweak with a dialog setting.\n */\nexport class EditTweak extends Tweak {\n  dialog: any;\n\n  setup() {\n    this.dialog = this.createDialog();\n    this.deleteables.push(this.dialog);\n\n    this.setting = new Setting(this.id, {\n      name: this.name,\n      type: \"click\",\n      value: 0,\n      description: this.description,\n      category: this.category,\n      condition: this.condition,\n      icon: \"edit\",\n      click: this.onClick.bind(this),\n    });\n  }\n\n  /**\n   * Called when the user clicks the setting.\n   */\n  onClick(): void {\n    this.dialog.show();\n  }\n\n  createDialog(): void {}\n}\n\n// TODO: Default value not set.\n/**\n * Base tweak with a \"select\" setting.\n */\nexport class SelectTweak extends Tweak {\n  defaultKey: string;\n  options: { [key: string]: string } = {};\n\n  /**\n   * @param {string} id\n   * @param {string} defaultKey\n   * @param {TweakOptions} options\n   */\n  constructor(id: string, defaultKey: string = \"default\", options?: TweakOptions) {\n    super(id, options);\n    this.defaultKey = defaultKey;\n  }\n\n  get disabled() {\n    return Settings.get(this.id) == this.defaultKey;\n  }\n\n  setup() {\n    this.options = this.getOptions();\n    this.isActive = false;\n    this.setting = new Setting(this.id, {\n      name: this.name,\n      type: \"select\",\n      options: this.options,\n      value: this.defaultKey,\n      description: this.description,\n      category: this.category,\n      condition: this.condition,\n      onChange: (v) => this.onChange(v),\n    });\n  }\n  enable(): void {\n    super.enable();\n    this.isActive = true;\n    try {\n      this.onEnable();\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  disable(): void {\n    super.disable();\n    if (!this.isActive) return;\n    this.isActive = false;\n    try {\n      this.onDisable();\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  private onChange(value: string): void {\n    this.disable();\n    if (this.disabled) return;\n    return this.enable();\n  }\n\n  getOptions(): { [key: string]: string } {\n    return { default: \"Disabled\" };\n  }\n\n  // EVENTS\n\n  onLoad(): void {\n    if (this.disabled) return;\n    this.enable();\n  }\n\n  onUnload(): void {\n    this.disable();\n  }\n\n  /**\n   * Called when this tweak is enabled.\n   */\n  onEnable(): void {}\n\n  /**\n   * Called when this tweak is disabled.\n   */\n  onDisable(): void {}\n}\n\n/**\n * Handles tweak settings. Like wether or not its enabled or not.\n */\nexport class TweakConfig {\n  static settings: { [key: string]: any } = {};\n\n  static load() {\n    var s = localStorage.getItem(\"tweaks_n_stuff.config\");\n    if (!s) {\n      TweakConfig.settings = {};\n      for (const t of Tweak.all.values()) {\n        TweakConfig.settings[t.id] = t.createConfig();\n      }\n      return TweakConfig.save();\n    }\n    TweakConfig.settings = JSON.parse(s);\n  }\n\n  static save() {\n    localStorage.setItem(\"tweaks_n_stuff.config\", JSON.stringify(TweakConfig.settings));\n  }\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/close_actions.ts",
    "content": "import { ToggleTweak } from \"./base\";\nimport { process } from \"../utils\";\n\n// TODO: Disabled, Ask, Force\nclass CloseActionsTweak extends ToggleTweak {\n  constructor() {\n    super(\"close_actions\", { author: \"legopitstop\", category: \"interface\" });\n  }\n\n  closeAllProjects() {\n    Blockbench.showQuickMessage(\"Closing all projects…\");\n    process([...ModelProject.all], (p) => {\n      if (!p || p.pinned) return;\n      p.close(false, false);\n    });\n  }\n\n  closeSavedProjects() {\n    Blockbench.showQuickMessage(\"Closing saved projects…\");\n    process([...ModelProject.all], (p) => {\n      if (!p || !p.saved || p.pinned) return;\n      p.close(false, false);\n    });\n  }\n\n  closeRightProjects() {\n    Blockbench.showQuickMessage(\"Closing projects to right…\");\n    if (!Project) return;\n    const index = ModelProject.all.indexOf(Project);\n    process([...ModelProject.all], (p, i) => {\n      if (!p || i <= index || p.pinned) return;\n      p.close(false, false);\n    });\n  }\n\n  closeOtherProjects() {\n    Blockbench.showQuickMessage(\"Closing other projects…\");\n    if (!Project) return;\n    const uuid = Project.uuid;\n    process([...ModelProject.all], (p) => {\n      if (!p || uuid == p.uuid || p.pinned) return;\n      p.close(false, false);\n    });\n  }\n\n  onEnable() {\n    var close_others = new Action(\"close_others\", {\n      icon: \"close\",\n      condition: () => ModelProject.all.length > 1,\n      click: this.closeOtherProjects.bind(this),\n    });\n    var close_right = new Action(\"close_right\", {\n      icon: \"tab_close_right\",\n      condition: () => Project && ModelProject.all.indexOf(Project) != ModelProject.all.length - 1,\n      click: this.closeRightProjects.bind(this),\n    });\n    var close_saved = new Action(\"close_saved\", {\n      icon: \"tab_close_inactive\",\n      condition: () => ModelProject.all.length > 1,\n      click: this.closeSavedProjects.bind(this),\n    });\n    var close_all = new Action(\"close_all\", {\n      icon: \"tab_close\",\n      condition: () => ModelProject.all.length > 1,\n      click: this.closeAllProjects.bind(this),\n    });\n    ModelProject.prototype.menu.addAction(close_others, \"#manage\");\n    ModelProject.prototype.menu.addAction(close_right, \"#manage\");\n    ModelProject.prototype.menu.addAction(close_saved, \"#manage\");\n    ModelProject.prototype.menu.addAction(close_all, \"#manage\");\n    this.deleteables.push(close_others, close_right, close_saved, close_all);\n  }\n}\n\nnew CloseActionsTweak();\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/header_color.ts",
    "content": "import tinycolor from \"tinycolor2\";\nimport { ToggleTweak } from \"./base\";\n\nclass HeaderColorTweak extends ToggleTweak {\n  rootStyle?: Deletable;\n\n  constructor() {\n    super(\"header_color\", { author: \"legopitstop\", category: \"interface\" });\n  }\n\n  update() {\n    if (this.rootStyle) this.rootStyle.delete();\n    if (SettingsProfile.selected == null) {\n      this.rootStyle = Blockbench.addCSS(\n        `:root{--color-header-bg:var(--color-frame);--color-header-text:var(--color-text);--filter-corner-logo:unset;}`\n      );\n      return;\n    }\n    const color1 = markerColors[SettingsProfile.selected.color].standard;\n    const color2 = tinycolor.mostReadable(new tinycolor(color1), [\"#333\", \"#ddd\"]).toHexString();\n    const filter =\n      color2 == \"#333333\"\n        ? \"invert(100%) sepia(0%) saturate(6873%) hue-rotate(217deg) brightness(113%) contrast(73%)\"\n        : \"invert(19%) sepia(10%) saturate(12%) hue-rotate(314deg) brightness(98%) contrast(96%)\";\n    this.rootStyle = Blockbench.addCSS(\n      `:root{--color-header-bg:${color1};--color-header-text:${color2};--filter-corner-logo:${filter};}`\n    );\n  }\n\n  onEnable() {\n    this.update();\n    const css = `div#corner_logo{filter:var(--filter-corner-logo);}header{background-color:var(--color-header-bg)}header>*{color:var(--color-header-text) !important;}`;\n    // @ts-ignore\n    const changed = Blockbench.on(\"profile_changed\", this.update.bind(this));\n    // @ts-ignore\n    const hide = Blockbench.on(\"hide_dialog\", ({ id }) => {\n      if (id !== \"settings_profile\") return;\n      this.update();\n    });\n    this.deleteables.push(Blockbench.addCSS(css), changed, hide);\n  }\n\n  onDisable() {\n    if (!this.rootStyle) return;\n    this.rootStyle.delete();\n  }\n}\n\nnew HeaderColorTweak();\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/index.ts",
    "content": "import \"./header_color\";\nimport \"./close_actions\";\nimport \"./pin_tab\";\nimport \"./wrap_tabs\";\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/pin_tab.ts",
    "content": "import { ToggleTweak } from \"./base\";\n\ndeclare global {\n  interface ModelProject {\n    pinned?: boolean;\n  }\n}\n\nclass PinTabTweak extends ToggleTweak {\n  static originalClose?: any;\n\n  constructor() {\n    super(\"pin_tab\", { author: \"legopitstop\", category: \"interface\" });\n  }\n\n  private static sort(): void {\n    ModelProject.all = ModelProject.all.sort((a, b) => {\n      if (a.pinned && !b.pinned) {\n        return -1;\n      }\n      if (!a.pinned && b.pinned) {\n        return 1;\n      }\n      return 0;\n    });\n  }\n\n  static pinTab(): void {\n    Blockbench.showQuickMessage(\"Pinned Tab!\");\n    if (!Project) return;\n    Project.pinned = true;\n    PinTabTweak.sort();\n    $(\".project_tab.selected .project_tab_close_button .close_icon\").text(\"push_pin\");\n  }\n\n  static unpinTab() {\n    Blockbench.showQuickMessage(\"Unpinned Tab!\");\n    if (!Project) return;\n    Project.pinned = false;\n    PinTabTweak.sort();\n    $(\".project_tab.selected .project_tab_close_button .close_icon\").text(\"clear\");\n  }\n\n  onClose(force: boolean, unpin: boolean = true) {\n    if (!force && unpin && Project?.pinned) {\n      PinTabTweak.unpinTab();\n      return;\n    }\n    return PinTabTweak.originalClose.bind(this)(force);\n  }\n\n  // EVENTS\n\n  onEnable() {\n    const css = Blockbench.addCSS(\n      `.project_tab.selected .project_tab_close_button .close_icon[content=\\\"\\\"] { background-color: red;}`,\n    );\n    ModelProject.prototype.pinned = false;\n    var pinAction = new Action(\"pin_tab\", {\n      icon: \"push_pin\",\n      condition: () => Project && !Project.pinned,\n      click: PinTabTweak.pinTab,\n    });\n    var unpinTab = new Action(\"unpin_tab\", {\n      icon: \"push_pin\",\n      condition: () => Project && Project.pinned,\n      click: PinTabTweak.unpinTab,\n    });\n    ModelProject.prototype.menu.addAction(pinAction, \"#manage\");\n    ModelProject.prototype.menu.addAction(unpinTab, \"#manage\");\n\n    // Inject close\n    PinTabTweak.originalClose = ModelProject.prototype.close;\n    ModelProject.prototype.close = this.onClose;\n\n    this.deleteables.push(pinAction, unpinTab, css);\n  }\n\n  onDisable() {\n    delete ModelProject.prototype.pinned;\n    if (PinTabTweak.originalClose) ModelProject.prototype.close = PinTabTweak.originalClose;\n  }\n}\n\nnew PinTabTweak();\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/tweaks/wrap_tabs.ts",
    "content": "import { ToggleTweak } from \"./base\";\n\nclass WrapTabsTweak extends ToggleTweak {\n  css: Deletable;\n\n  constructor() {\n    super(\"wrap_tabs\", { author: \"legopitstop\", category: \"interface\" });\n  }\n\n  onEnable() {\n    const css = `#tab_bar #tab_bar_list{overflow-y:none;scrollbar-width:auto;flex-wrap:wrap;}#tab_bar{height:auto;align-items:center;}#tab_bar .project_tab{height:32px}#search_tab_button{height:auto;}`;\n    this.deleteables.push(Blockbench.addCSS(css));\n  }\n}\n\nnew WrapTabsTweak();\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/ts/utils.ts",
    "content": "/**\n * Process an array function in chunks.\n * @param {Array} array\n * @param {Function} callback\n */\nexport function process<T>(array: Array<T>, callback: (chunk: T, index: number) => void): void {\n  let index = 0;\n  function processChunk() {\n    callback(array[index], index);\n    index++;\n    if (index < array.length) {\n      requestAnimationFrame(processChunk);\n    }\n  }\n  processChunk();\n}\n\n/**\n * Imports this package.\n * @param {string} url\n * @returns {Deletable}\n */\nexport function addScript(url: string): Deletable {\n  class DeletableScript implements Deletable {\n    constructor(private node: Element) {}\n    delete() {\n      this.node.remove();\n    }\n  }\n  const script = document.createElement(\"script\");\n  script.src = url;\n  try {\n    new Promise((resolve, reject) => {\n      script.src = url;\n      script.onload = resolve;\n      script.onerror = reject;\n      document.head.appendChild(script);\n    });\n  } catch (error) {\n    console.error(`Failed to load script ${url}:`, error);\n  }\n  return new DeletableScript(script);\n}\n\n/**\n * Wraps a function in a try-catch statement to log any errors.\n * @param {Function} callback\n */\nexport function wrapError(callback: () => void): void {\n  try {\n    callback();\n  } catch (err) {\n    console.error(err);\n  }\n}\n\n/**\n * Get a plugin by ID.\n * @param {string} id\n * @returns {Plugin|undefined}\n */\nexport function getPlugin(id: string): global.Plugin | undefined {\n  return Plugins.all.find((p) => p.id == id);\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"typeRoots\": [\"./types\", \"./node_modules/@types\"],\n    \"types\": [\"node\"],\n    \"moduleResolution\": \"Node\",\n    \"esModuleInterop\": true,\n    \"resolveJsonModule\": true,\n    \"target\": \"es2022\"\n  },\n  \"compileOnSave\": false\n}\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/src/types/tweaks_n_stuff.d.ts",
    "content": "/// <reference types=\"blockbench-types\"/>\n\ndeclare global {\n  interface ModelProject {\n    close(force: boolean, unpin?: boolean): Promise<void>;\n  }\n}\n\nexport {};\n"
  },
  {
    "path": "plugins/tweaks_n_stuff/tweaks_n_stuff.js",
    "content": "var D={};var E={};var B={\"settings.header_color\":\"Header Color\",\"settings.header_color.desc\":\"Sets the color of the header depending on the profile color.\",\"settings.close_actions\":\"Close Actions\",\"settings.close_actions.desc\":\"Adds 'Close Others', 'Close to the Right', 'Close Saved', and 'Close All' to the project context menu, opened by right-clicking on a project tab.\",\"settings.pin_tab\":\"Pin Tab\",\"settings.pin_tab.desc\":\"Adds 'Pin Tab' and 'Unpin Tab' to the project context menu, opened by right-clicking on a project tab.\",\"settings.wrap_tabs\":\"Wrap Tabs\",\"settings.wrap_tabs.desc\":\"Controls whether tabs should be wrapped over multiple lines when exceeding available space or whether a scrollbar should appear instead.\",\"action.close_others\":\"Close Others\",\"action.close_others.desc\":\"Close all tabs but this one.\",\"action.close_right\":\"Close to the Right\",\"action.close_right.desc\":\"Close all tabs to the right.\",\"action.close_saved\":\"Close Saved\",\"action.close_saved.desc\":\"Close all saved tabs.\",\"action.close_all\":\"Close All\",\"action.close_all.desc\":\"Close all tabs.\",\"action.pin_tab\":\"Pin Tab\",\"action.pin_tab.desc\":\"desc\",\"action.unpin_tab\":\"Unpin Tab\",\"action.unpin_tab.desc\":\"desc\"};var L={};var F={};var I={};var O={};var N={};var z={};var U={};var V={};var G={};var q={};var Q={};var K={};var J={};var W={};Language.addTranslations(\"cz\",D);Language.addTranslations(\"de\",E);Language.addTranslations(\"en\",B);Language.addTranslations(\"es\",L);Language.addTranslations(\"fr\",F);Language.addTranslations(\"it\",I);Language.addTranslations(\"ja\",O);Language.addTranslations(\"ko\",N);Language.addTranslations(\"nl\",z);Language.addTranslations(\"pl\",U);Language.addTranslations(\"pt\",V);Language.addTranslations(\"ru\",G);Language.addTranslations(\"sv\",q);Language.addTranslations(\"uk\",Q);Language.addTranslations(\"vi\",K);Language.addTranslations(\"zh_tw\",J);Language.addTranslations(\"zh\",W);var X=\"1.1.0\",w=\"tweaks_n_stuff\";function x(e,t){let i=0;function n(){t(e[i],i),i++,i<e.length&&requestAnimationFrame(n)}n()}function _(e){try{e()}catch(t){console.error(t)}}var b=class e{static all=new Map;static dialog;static action;id;author;category;condition;pluginId;setting;name;description;isActive=!1;deleteables;constructor(t,i){this.id=t,this.name=i?.name,this.description=i?.description,this.author=i?.author??\"unset\",this.category=i?.category??\"unset\",this.condition=i?.condition??!0,this.pluginId=w,this.deleteables=[],this.setup(),e.all.set(this.id,this),console.debug(`\\u{1F527} Registered tweak \"${this.id}\"`)}createConfig(){return{enabled:!0}}get config(){return y.settings[this.id]}set config(t){y.settings[this.id]=t}load(){this.setup(),_(this.onLoad.bind(this))}unload(){_(this.onUnload.bind(this)),this.delete()}install(){_(this.onInstall.bind(this))}uninstall(){_(this.onUninstall.bind(this))}delete(){this.deleteables.forEach(t=>t.delete()),this.setting&&this.setting.delete()}enable(){console.debug(`\\u2705 Enabled tweak \"${this.id}\"`),this.isActive=!0}disable(){this.deleteables.forEach(t=>t.delete()),this.isActive&&console.debug(`\\u274C Disabled tweak \"${this.id}\"`)}setup(){}onLoad(){}onUnload(){}onInstall(){}onUninstall(){}},v=class extends b{defaultValue;constructor(t,i,n=!0){super(t,i),this.defaultValue=n}get disabled(){return!(Settings.get(this.id)??!1)}setup(){this.isActive=!1,this.setting=new Setting(this.id,{name:this.name,type:\"toggle\",value:this.defaultValue,description:this.description,category:this.category,condition:this.condition,onChange:t=>this.change(t)})}enable(){super.enable(),this.onEnable&&_(this.onEnable.bind(this))}disable(){super.disable(),this.isActive&&(this.isActive=!1,this.onDisable&&_(this.onDisable.bind(this)))}change(t){if(this.onChange&&this.onChange(t),this.disable(),!!t)return this.enable()}onLoad(){this.disabled||this.enable()}onUnload(){this.disable()}};var y=class e{static settings={};static load(){var t=localStorage.getItem(\"tweaks_n_stuff.config\");if(!t){e.settings={};for(let i of b.all.values())e.settings[i.id]=i.createConfig();return e.save()}e.settings=JSON.parse(t)}static save(){localStorage.setItem(\"tweaks_n_stuff.config\",JSON.stringify(e.settings))}};var M=class e{static selectProfile;static unselectProfile;static hideDialog;static showDialog;static load(){this.selectProfile=SettingsProfile.prototype.select,SettingsProfile.prototype.select=function(...t){e.selectProfile.apply(this,t),Blockbench.dispatchEvent(\"profile_changed\",{profile:SettingsProfile.selected})},this.unselectProfile=SettingsProfile.unselect,SettingsProfile.unselect=function(...t){e.unselectProfile.apply(this,t),Blockbench.dispatchEvent(\"profile_changed\",{profile:null})},this.hideDialog=Dialog.prototype.hide,Dialog.prototype.hide=function(...t){return Blockbench.dispatchEvent(\"hide_dialog\",Dialog.open),e.hideDialog.apply(this,t)},this.showDialog=Dialog.prototype.show,Dialog.prototype.show=function(...t){let i=e.showDialog.apply(this,t);return Blockbench.dispatchEvent(\"show_dialog\",Dialog.open),i}}static unload(){SettingsProfile.prototype.select=e.selectProfile,SettingsProfile.unselect=e.unselectProfile,Dialog.prototype.hide=e.hideDialog,Dialog.prototype.show=e.showDialog}};function A(e){\"@babel/helpers - typeof\";return A=typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?function(t){return typeof t}:function(t){return t&&typeof Symbol==\"function\"&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},A(e)}var Me=/^\\s+/,Se=/\\s+$/;function o(e,t){if(e=e||\"\",t=t||{},e instanceof o)return e;if(!(this instanceof o))return new o(e,t);var i=we(e);this._originalInput=e,this._r=i.r,this._g=i.g,this._b=i.b,this._a=i.a,this._roundA=Math.round(100*this._a)/100,this._format=t.format||i.format,this._gradientType=t.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=i.ok}o.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3},getLuminance:function(){var t=this.toRgb(),i,n,a,r,s,l;return i=t.r/255,n=t.g/255,a=t.b/255,i<=.03928?r=i/12.92:r=Math.pow((i+.055)/1.055,2.4),n<=.03928?s=n/12.92:s=Math.pow((n+.055)/1.055,2.4),a<=.03928?l=a/12.92:l=Math.pow((a+.055)/1.055,2.4),.2126*r+.7152*s+.0722*l},setAlpha:function(t){return this._a=re(t),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var t=Y(this._r,this._g,this._b);return{h:t.h*360,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=Y(this._r,this._g,this._b),i=Math.round(t.h*360),n=Math.round(t.s*100),a=Math.round(t.v*100);return this._a==1?\"hsv(\"+i+\", \"+n+\"%, \"+a+\"%)\":\"hsva(\"+i+\", \"+n+\"%, \"+a+\"%, \"+this._roundA+\")\"},toHsl:function(){var t=Z(this._r,this._g,this._b);return{h:t.h*360,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=Z(this._r,this._g,this._b),i=Math.round(t.h*360),n=Math.round(t.s*100),a=Math.round(t.l*100);return this._a==1?\"hsl(\"+i+\", \"+n+\"%, \"+a+\"%)\":\"hsla(\"+i+\", \"+n+\"%, \"+a+\"%, \"+this._roundA+\")\"},toHex:function(t){return ee(this._r,this._g,this._b,t)},toHexString:function(t){return\"#\"+this.toHex(t)},toHex8:function(t){return Ce(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return\"#\"+this.toHex8(t)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return this._a==1?\"rgb(\"+Math.round(this._r)+\", \"+Math.round(this._g)+\", \"+Math.round(this._b)+\")\":\"rgba(\"+Math.round(this._r)+\", \"+Math.round(this._g)+\", \"+Math.round(this._b)+\", \"+this._roundA+\")\"},toPercentageRgb:function(){return{r:Math.round(c(this._r,255)*100)+\"%\",g:Math.round(c(this._g,255)*100)+\"%\",b:Math.round(c(this._b,255)*100)+\"%\",a:this._a}},toPercentageRgbString:function(){return this._a==1?\"rgb(\"+Math.round(c(this._r,255)*100)+\"%, \"+Math.round(c(this._g,255)*100)+\"%, \"+Math.round(c(this._b,255)*100)+\"%)\":\"rgba(\"+Math.round(c(this._r,255)*100)+\"%, \"+Math.round(c(this._g,255)*100)+\"%, \"+Math.round(c(this._b,255)*100)+\"%, \"+this._roundA+\")\"},toName:function(){return this._a===0?\"transparent\":this._a<1?!1:ze[ee(this._r,this._g,this._b,!0)]||!1},toFilter:function(t){var i=\"#\"+te(this._r,this._g,this._b,this._a),n=i,a=this._gradientType?\"GradientType = 1, \":\"\";if(t){var r=o(t);n=\"#\"+te(r._r,r._g,r._b,r._a)}return\"progid:DXImageTransform.Microsoft.gradient(\"+a+\"startColorstr=\"+i+\",endColorstr=\"+n+\")\"},toString:function(t){var i=!!t;t=t||this._format;var n=!1,a=this._a<1&&this._a>=0,r=!i&&a&&(t===\"hex\"||t===\"hex6\"||t===\"hex3\"||t===\"hex4\"||t===\"hex8\"||t===\"name\");return r?t===\"name\"&&this._a===0?this.toName():this.toRgbString():(t===\"rgb\"&&(n=this.toRgbString()),t===\"prgb\"&&(n=this.toPercentageRgbString()),(t===\"hex\"||t===\"hex6\")&&(n=this.toHexString()),t===\"hex3\"&&(n=this.toHexString(!0)),t===\"hex4\"&&(n=this.toHex8String(!0)),t===\"hex8\"&&(n=this.toHex8String()),t===\"name\"&&(n=this.toName()),t===\"hsl\"&&(n=this.toHslString()),t===\"hsv\"&&(n=this.toHsvString()),n||this.toHexString())},clone:function(){return o(this.toString())},_applyModification:function(t,i){var n=t.apply(null,[this].concat([].slice.call(i)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(De,arguments)},brighten:function(){return this._applyModification(Ee,arguments)},darken:function(){return this._applyModification(Be,arguments)},desaturate:function(){return this._applyModification(Te,arguments)},saturate:function(){return this._applyModification(Re,arguments)},greyscale:function(){return this._applyModification(He,arguments)},spin:function(){return this._applyModification(Le,arguments)},_applyCombination:function(t,i){return t.apply(null,[this].concat([].slice.call(i)))},analogous:function(){return this._applyCombination(Oe,arguments)},complement:function(){return this._applyCombination(Fe,arguments)},monochromatic:function(){return this._applyCombination(Ne,arguments)},splitcomplement:function(){return this._applyCombination(Ie,arguments)},triad:function(){return this._applyCombination(ie,[3])},tetrad:function(){return this._applyCombination(ie,[4])}};o.fromRatio=function(e,t){if(A(e)==\"object\"){var i={};for(var n in e)e.hasOwnProperty(n)&&(n===\"a\"?i[n]=e[n]:i[n]=S(e[n]));e=i}return o(e,t)};function we(e){var t={r:0,g:0,b:0},i=1,n=null,a=null,r=null,s=!1,l=!1;return typeof e==\"string\"&&(e=Ge(e)),A(e)==\"object\"&&(m(e.r)&&m(e.g)&&m(e.b)?(t=Ae(e.r,e.g,e.b),s=!0,l=String(e.r).substr(-1)===\"%\"?\"prgb\":\"rgb\"):m(e.h)&&m(e.s)&&m(e.v)?(n=S(e.s),a=S(e.v),t=je(e.h,n,a),s=!0,l=\"hsv\"):m(e.h)&&m(e.s)&&m(e.l)&&(n=S(e.s),r=S(e.l),t=Pe(e.h,n,r),s=!0,l=\"hsl\"),e.hasOwnProperty(\"a\")&&(i=e.a)),i=re(i),{ok:s,format:e.format||l,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:i}}function Ae(e,t,i){return{r:c(e,255)*255,g:c(t,255)*255,b:c(i,255)*255}}function Z(e,t,i){e=c(e,255),t=c(t,255),i=c(i,255);var n=Math.max(e,t,i),a=Math.min(e,t,i),r,s,l=(n+a)/2;if(n==a)r=s=0;else{var h=n-a;switch(s=l>.5?h/(2-n-a):h/(n+a),n){case e:r=(t-i)/h+(t<i?6:0);break;case t:r=(i-e)/h+2;break;case i:r=(e-t)/h+4;break}r/=6}return{h:r,s,l}}function Pe(e,t,i){var n,a,r;e=c(e,360),t=c(t,100),i=c(i,100);function s(u,k,f){return f<0&&(f+=1),f>1&&(f-=1),f<1/6?u+(k-u)*6*f:f<1/2?k:f<2/3?u+(k-u)*(2/3-f)*6:u}if(t===0)n=a=r=i;else{var l=i<.5?i*(1+t):i+t-i*t,h=2*i-l;n=s(h,l,e+1/3),a=s(h,l,e),r=s(h,l,e-1/3)}return{r:n*255,g:a*255,b:r*255}}function Y(e,t,i){e=c(e,255),t=c(t,255),i=c(i,255);var n=Math.max(e,t,i),a=Math.min(e,t,i),r,s,l=n,h=n-a;if(s=n===0?0:h/n,n==a)r=0;else{switch(n){case e:r=(t-i)/h+(t<i?6:0);break;case t:r=(i-e)/h+2;break;case i:r=(e-t)/h+4;break}r/=6}return{h:r,s,v:l}}function je(e,t,i){e=c(e,360)*6,t=c(t,100),i=c(i,100);var n=Math.floor(e),a=e-n,r=i*(1-t),s=i*(1-a*t),l=i*(1-(1-a)*t),h=n%6,u=[i,s,r,r,l,i][h],k=[l,i,i,s,r,r][h],f=[r,r,l,i,i,s][h];return{r:u*255,g:k*255,b:f*255}}function ee(e,t,i,n){var a=[p(Math.round(e).toString(16)),p(Math.round(t).toString(16)),p(Math.round(i).toString(16))];return n&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)?a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0):a.join(\"\")}function Ce(e,t,i,n,a){var r=[p(Math.round(e).toString(16)),p(Math.round(t).toString(16)),p(Math.round(i).toString(16)),p(ae(n))];return a&&r[0].charAt(0)==r[0].charAt(1)&&r[1].charAt(0)==r[1].charAt(1)&&r[2].charAt(0)==r[2].charAt(1)&&r[3].charAt(0)==r[3].charAt(1)?r[0].charAt(0)+r[1].charAt(0)+r[2].charAt(0)+r[3].charAt(0):r.join(\"\")}function te(e,t,i,n){var a=[p(ae(n)),p(Math.round(e).toString(16)),p(Math.round(t).toString(16)),p(Math.round(i).toString(16))];return a.join(\"\")}o.equals=function(e,t){return!e||!t?!1:o(e).toRgbString()==o(t).toRgbString()};o.random=function(){return o.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})};function Te(e,t){t=t===0?0:t||10;var i=o(e).toHsl();return i.s-=t/100,i.s=P(i.s),o(i)}function Re(e,t){t=t===0?0:t||10;var i=o(e).toHsl();return i.s+=t/100,i.s=P(i.s),o(i)}function He(e){return o(e).desaturate(100)}function De(e,t){t=t===0?0:t||10;var i=o(e).toHsl();return i.l+=t/100,i.l=P(i.l),o(i)}function Ee(e,t){t=t===0?0:t||10;var i=o(e).toRgb();return i.r=Math.max(0,Math.min(255,i.r-Math.round(255*-(t/100)))),i.g=Math.max(0,Math.min(255,i.g-Math.round(255*-(t/100)))),i.b=Math.max(0,Math.min(255,i.b-Math.round(255*-(t/100)))),o(i)}function Be(e,t){t=t===0?0:t||10;var i=o(e).toHsl();return i.l-=t/100,i.l=P(i.l),o(i)}function Le(e,t){var i=o(e).toHsl(),n=(i.h+t)%360;return i.h=n<0?360+n:n,o(i)}function Fe(e){var t=o(e).toHsl();return t.h=(t.h+180)%360,o(t)}function ie(e,t){if(isNaN(t)||t<=0)throw new Error(\"Argument to polyad must be a positive number\");for(var i=o(e).toHsl(),n=[o(e)],a=360/t,r=1;r<t;r++)n.push(o({h:(i.h+r*a)%360,s:i.s,l:i.l}));return n}function Ie(e){var t=o(e).toHsl(),i=t.h;return[o(e),o({h:(i+72)%360,s:t.s,l:t.l}),o({h:(i+216)%360,s:t.s,l:t.l})]}function Oe(e,t,i){t=t||6,i=i||30;var n=o(e).toHsl(),a=360/i,r=[o(e)];for(n.h=(n.h-(a*t>>1)+720)%360;--t;)n.h=(n.h+a)%360,r.push(o(n));return r}function Ne(e,t){t=t||6;for(var i=o(e).toHsv(),n=i.h,a=i.s,r=i.v,s=[],l=1/t;t--;)s.push(o({h:n,s:a,v:r})),r=(r+l)%1;return s}o.mix=function(e,t,i){i=i===0?0:i||50;var n=o(e).toRgb(),a=o(t).toRgb(),r=i/100,s={r:(a.r-n.r)*r+n.r,g:(a.g-n.g)*r+n.g,b:(a.b-n.b)*r+n.b,a:(a.a-n.a)*r+n.a};return o(s)};o.readability=function(e,t){var i=o(e),n=o(t);return(Math.max(i.getLuminance(),n.getLuminance())+.05)/(Math.min(i.getLuminance(),n.getLuminance())+.05)};o.isReadable=function(e,t,i){var n=o.readability(e,t),a,r;switch(r=!1,a=qe(i),a.level+a.size){case\"AAsmall\":case\"AAAlarge\":r=n>=4.5;break;case\"AAlarge\":r=n>=3;break;case\"AAAsmall\":r=n>=7;break}return r};o.mostReadable=function(e,t,i){var n=null,a=0,r,s,l,h;i=i||{},s=i.includeFallbackColors,l=i.level,h=i.size;for(var u=0;u<t.length;u++)r=o.readability(e,t[u]),r>a&&(a=r,n=o(t[u]));return o.isReadable(e,n,{level:l,size:h})||!s?n:(i.includeFallbackColors=!1,o.mostReadable(e,[\"#fff\",\"#000\"],i))};var j=o.names={aliceblue:\"f0f8ff\",antiquewhite:\"faebd7\",aqua:\"0ff\",aquamarine:\"7fffd4\",azure:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"000\",blanchedalmond:\"ffebcd\",blue:\"00f\",blueviolet:\"8a2be2\",brown:\"a52a2a\",burlywood:\"deb887\",burntsienna:\"ea7e5d\",cadetblue:\"5f9ea0\",chartreuse:\"7fff00\",chocolate:\"d2691e\",coral:\"ff7f50\",cornflowerblue:\"6495ed\",cornsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"0ff\",darkblue:\"00008b\",darkcyan:\"008b8b\",darkgoldenrod:\"b8860b\",darkgray:\"a9a9a9\",darkgreen:\"006400\",darkgrey:\"a9a9a9\",darkkhaki:\"bdb76b\",darkmagenta:\"8b008b\",darkolivegreen:\"556b2f\",darkorange:\"ff8c00\",darkorchid:\"9932cc\",darkred:\"8b0000\",darksalmon:\"e9967a\",darkseagreen:\"8fbc8f\",darkslateblue:\"483d8b\",darkslategray:\"2f4f4f\",darkslategrey:\"2f4f4f\",darkturquoise:\"00ced1\",darkviolet:\"9400d3\",deeppink:\"ff1493\",deepskyblue:\"00bfff\",dimgray:\"696969\",dimgrey:\"696969\",dodgerblue:\"1e90ff\",firebrick:\"b22222\",floralwhite:\"fffaf0\",forestgreen:\"228b22\",fuchsia:\"f0f\",gainsboro:\"dcdcdc\",ghostwhite:\"f8f8ff\",gold:\"ffd700\",goldenrod:\"daa520\",gray:\"808080\",green:\"008000\",greenyellow:\"adff2f\",grey:\"808080\",honeydew:\"f0fff0\",hotpink:\"ff69b4\",indianred:\"cd5c5c\",indigo:\"4b0082\",ivory:\"fffff0\",khaki:\"f0e68c\",lavender:\"e6e6fa\",lavenderblush:\"fff0f5\",lawngreen:\"7cfc00\",lemonchiffon:\"fffacd\",lightblue:\"add8e6\",lightcoral:\"f08080\",lightcyan:\"e0ffff\",lightgoldenrodyellow:\"fafad2\",lightgray:\"d3d3d3\",lightgreen:\"90ee90\",lightgrey:\"d3d3d3\",lightpink:\"ffb6c1\",lightsalmon:\"ffa07a\",lightseagreen:\"20b2aa\",lightskyblue:\"87cefa\",lightslategray:\"789\",lightslategrey:\"789\",lightsteelblue:\"b0c4de\",lightyellow:\"ffffe0\",lime:\"0f0\",limegreen:\"32cd32\",linen:\"faf0e6\",magenta:\"f0f\",maroon:\"800000\",mediumaquamarine:\"66cdaa\",mediumblue:\"0000cd\",mediumorchid:\"ba55d3\",mediumpurple:\"9370db\",mediumseagreen:\"3cb371\",mediumslateblue:\"7b68ee\",mediumspringgreen:\"00fa9a\",mediumturquoise:\"48d1cc\",mediumvioletred:\"c71585\",midnightblue:\"191970\",mintcream:\"f5fffa\",mistyrose:\"ffe4e1\",moccasin:\"ffe4b5\",navajowhite:\"ffdead\",navy:\"000080\",oldlace:\"fdf5e6\",olive:\"808000\",olivedrab:\"6b8e23\",orange:\"ffa500\",orangered:\"ff4500\",orchid:\"da70d6\",palegoldenrod:\"eee8aa\",palegreen:\"98fb98\",paleturquoise:\"afeeee\",palevioletred:\"db7093\",papayawhip:\"ffefd5\",peachpuff:\"ffdab9\",peru:\"cd853f\",pink:\"ffc0cb\",plum:\"dda0dd\",powderblue:\"b0e0e6\",purple:\"800080\",rebeccapurple:\"663399\",red:\"f00\",rosybrown:\"bc8f8f\",royalblue:\"4169e1\",saddlebrown:\"8b4513\",salmon:\"fa8072\",sandybrown:\"f4a460\",seagreen:\"2e8b57\",seashell:\"fff5ee\",sienna:\"a0522d\",silver:\"c0c0c0\",skyblue:\"87ceeb\",slateblue:\"6a5acd\",slategray:\"708090\",slategrey:\"708090\",snow:\"fffafa\",springgreen:\"00ff7f\",steelblue:\"4682b4\",tan:\"d2b48c\",teal:\"008080\",thistle:\"d8bfd8\",tomato:\"ff6347\",turquoise:\"40e0d0\",violet:\"ee82ee\",wheat:\"f5deb3\",white:\"fff\",whitesmoke:\"f5f5f5\",yellow:\"ff0\",yellowgreen:\"9acd32\"},ze=o.hexNames=Ue(j);function Ue(e){var t={};for(var i in e)e.hasOwnProperty(i)&&(t[e[i]]=i);return t}function re(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function c(e,t){$e(e)&&(e=\"100%\");var i=Ve(e);return e=Math.min(t,Math.max(0,parseFloat(e))),i&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function P(e){return Math.min(1,Math.max(0,e))}function d(e){return parseInt(e,16)}function $e(e){return typeof e==\"string\"&&e.indexOf(\".\")!=-1&&parseFloat(e)===1}function Ve(e){return typeof e==\"string\"&&e.indexOf(\"%\")!=-1}function p(e){return e.length==1?\"0\"+e:\"\"+e}function S(e){return e<=1&&(e=e*100+\"%\"),e}function ae(e){return Math.round(parseFloat(e)*255).toString(16)}function ne(e){return d(e)/255}var g=(function(){var e=\"[-\\\\+]?\\\\d+%?\",t=\"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\",i=\"(?:\"+t+\")|(?:\"+e+\")\",n=\"[\\\\s|\\\\(]+(\"+i+\")[,|\\\\s]+(\"+i+\")[,|\\\\s]+(\"+i+\")\\\\s*\\\\)?\",a=\"[\\\\s|\\\\(]+(\"+i+\")[,|\\\\s]+(\"+i+\")[,|\\\\s]+(\"+i+\")[,|\\\\s]+(\"+i+\")\\\\s*\\\\)?\";return{CSS_UNIT:new RegExp(i),rgb:new RegExp(\"rgb\"+n),rgba:new RegExp(\"rgba\"+a),hsl:new RegExp(\"hsl\"+n),hsla:new RegExp(\"hsla\"+a),hsv:new RegExp(\"hsv\"+n),hsva:new RegExp(\"hsva\"+a),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}})();function m(e){return!!g.CSS_UNIT.exec(e)}function Ge(e){e=e.replace(Me,\"\").replace(Se,\"\").toLowerCase();var t=!1;if(j[e])e=j[e],t=!0;else if(e==\"transparent\")return{r:0,g:0,b:0,a:0,format:\"name\"};var i;return(i=g.rgb.exec(e))?{r:i[1],g:i[2],b:i[3]}:(i=g.rgba.exec(e))?{r:i[1],g:i[2],b:i[3],a:i[4]}:(i=g.hsl.exec(e))?{h:i[1],s:i[2],l:i[3]}:(i=g.hsla.exec(e))?{h:i[1],s:i[2],l:i[3],a:i[4]}:(i=g.hsv.exec(e))?{h:i[1],s:i[2],v:i[3]}:(i=g.hsva.exec(e))?{h:i[1],s:i[2],v:i[3],a:i[4]}:(i=g.hex8.exec(e))?{r:d(i[1]),g:d(i[2]),b:d(i[3]),a:ne(i[4]),format:t?\"name\":\"hex8\"}:(i=g.hex6.exec(e))?{r:d(i[1]),g:d(i[2]),b:d(i[3]),format:t?\"name\":\"hex\"}:(i=g.hex4.exec(e))?{r:d(i[1]+\"\"+i[1]),g:d(i[2]+\"\"+i[2]),b:d(i[3]+\"\"+i[3]),a:ne(i[4]+\"\"+i[4]),format:t?\"name\":\"hex8\"}:(i=g.hex3.exec(e))?{r:d(i[1]+\"\"+i[1]),g:d(i[2]+\"\"+i[2]),b:d(i[3]+\"\"+i[3]),format:t?\"name\":\"hex\"}:!1}function qe(e){var t,i;return e=e||{level:\"AA\",size:\"small\"},t=(e.level||\"AA\").toUpperCase(),i=(e.size||\"small\").toLowerCase(),t!==\"AA\"&&t!==\"AAA\"&&(t=\"AA\"),i!==\"small\"&&i!==\"large\"&&(i=\"small\"),{level:t,size:i}}var C=class extends v{rootStyle;constructor(){super(\"header_color\",{author:\"legopitstop\",category:\"interface\"})}update(){if(this.rootStyle&&this.rootStyle.delete(),SettingsProfile.selected==null){this.rootStyle=Blockbench.addCSS(\":root{--color-header-bg:var(--color-frame);--color-header-text:var(--color-text);--filter-corner-logo:unset;}\");return}let t=markerColors[SettingsProfile.selected.color].standard,i=o.mostReadable(new o(t),[\"#333\",\"#ddd\"]).toHexString(),n=i==\"#333333\"?\"invert(100%) sepia(0%) saturate(6873%) hue-rotate(217deg) brightness(113%) contrast(73%)\":\"invert(19%) sepia(10%) saturate(12%) hue-rotate(314deg) brightness(98%) contrast(96%)\";this.rootStyle=Blockbench.addCSS(`:root{--color-header-bg:${t};--color-header-text:${i};--filter-corner-logo:${n};}`)}onEnable(){this.update();let t=\"div#corner_logo{filter:var(--filter-corner-logo);}header{background-color:var(--color-header-bg)}header>*{color:var(--color-header-text) !important;}\",i=Blockbench.on(\"profile_changed\",this.update.bind(this)),n=Blockbench.on(\"hide_dialog\",({id:a})=>{a===\"settings_profile\"&&this.update()});this.deleteables.push(Blockbench.addCSS(t),i,n)}onDisable(){this.rootStyle&&this.rootStyle.delete()}};new C;var T=class extends v{constructor(){super(\"close_actions\",{author:\"legopitstop\",category:\"interface\"})}closeAllProjects(){Blockbench.showQuickMessage(\"Closing all projects\\u2026\"),x([...ModelProject.all],t=>{!t||t.pinned||t.close(!1,!1)})}closeSavedProjects(){Blockbench.showQuickMessage(\"Closing saved projects\\u2026\"),x([...ModelProject.all],t=>{!t||!t.saved||t.pinned||t.close(!1,!1)})}closeRightProjects(){if(Blockbench.showQuickMessage(\"Closing projects to right\\u2026\"),!Project)return;let t=ModelProject.all.indexOf(Project);x([...ModelProject.all],(i,n)=>{!i||n<=t||i.pinned||i.close(!1,!1)})}closeOtherProjects(){if(Blockbench.showQuickMessage(\"Closing other projects\\u2026\"),!Project)return;let t=Project.uuid;x([...ModelProject.all],i=>{!i||t==i.uuid||i.pinned||i.close(!1,!1)})}onEnable(){var t=new Action(\"close_others\",{icon:\"close\",condition:()=>ModelProject.all.length>1,click:this.closeOtherProjects.bind(this)}),i=new Action(\"close_right\",{icon:\"tab_close_right\",condition:()=>Project&&ModelProject.all.indexOf(Project)!=ModelProject.all.length-1,click:this.closeRightProjects.bind(this)}),n=new Action(\"close_saved\",{icon:\"tab_close_inactive\",condition:()=>ModelProject.all.length>1,click:this.closeSavedProjects.bind(this)}),a=new Action(\"close_all\",{icon:\"tab_close\",condition:()=>ModelProject.all.length>1,click:this.closeAllProjects.bind(this)});ModelProject.prototype.menu.addAction(t,\"#manage\"),ModelProject.prototype.menu.addAction(i,\"#manage\"),ModelProject.prototype.menu.addAction(n,\"#manage\"),ModelProject.prototype.menu.addAction(a,\"#manage\"),this.deleteables.push(t,i,n,a)}};new T;var R=class e extends v{static originalClose;constructor(){super(\"pin_tab\",{author:\"legopitstop\",category:\"interface\"})}static sort(){ModelProject.all=ModelProject.all.sort((t,i)=>t.pinned&&!i.pinned?-1:!t.pinned&&i.pinned?1:0)}static pinTab(){Blockbench.showQuickMessage(\"Pinned Tab!\"),Project&&(Project.pinned=!0,e.sort(),$(\".project_tab.selected .project_tab_close_button .close_icon\").text(\"push_pin\"))}static unpinTab(){Blockbench.showQuickMessage(\"Unpinned Tab!\"),Project&&(Project.pinned=!1,e.sort(),$(\".project_tab.selected .project_tab_close_button .close_icon\").text(\"clear\"))}onClose(t,i=!0){if(!t&&i&&Project?.pinned){e.unpinTab();return}return e.originalClose.bind(this)(t)}onEnable(){let t=Blockbench.addCSS('.project_tab.selected .project_tab_close_button .close_icon[content=\"\"] { background-color: red;}');ModelProject.prototype.pinned=!1;var i=new Action(\"pin_tab\",{icon:\"push_pin\",condition:()=>Project&&!Project.pinned,click:e.pinTab}),n=new Action(\"unpin_tab\",{icon:\"push_pin\",condition:()=>Project&&Project.pinned,click:e.unpinTab});ModelProject.prototype.menu.addAction(i,\"#manage\"),ModelProject.prototype.menu.addAction(n,\"#manage\"),e.originalClose=ModelProject.prototype.close,ModelProject.prototype.close=this.onClose,this.deleteables.push(i,n,t)}onDisable(){delete ModelProject.prototype.pinned,e.originalClose&&(ModelProject.prototype.close=e.originalClose)}};new R;var H=class extends v{css;constructor(){super(\"wrap_tabs\",{author:\"legopitstop\",category:\"interface\"})}onEnable(){this.deleteables.push(Blockbench.addCSS(\"#tab_bar #tab_bar_list{overflow-y:none;scrollbar-width:auto;flex-wrap:wrap;}#tab_bar{height:auto;align-items:center;}#tab_bar .project_tab{height:32px}#search_tab_button{height:auto;}\"))}};new H;var Qe=[];BBPlugin.register(w,{title:\"Tweaks & Stuff\",author:\"legopitstop\",icon:\"icon.png\",description:\"Adds a few tweaks to Blockbench to make your modeling experience better.\",has_changelog:!0,website:\"https://docs.lpsmods.dev/tweaks_n_stuff\",repository:\"https://github.com/legopitstop/blockbench-plugins/tree/master/src/tweaks_n_stuff\",variant:\"both\",version:X,min_version:\"4.8.0\",tags:[\"Blockbench\"],new_repository_format:!0,oninstall(){b.all.forEach(e=>e.install())},onuninstall(){b.all.forEach(e=>e.uninstall())},onload(){M.load(),y.load(),b.all.forEach(e=>e.load()),b.all.size==0&&console.warn(\"No tweaks registered!\")},onunload(){M.unload(),b.all.forEach(e=>e.unload()),Qe.forEach(e=>e?.delete())}});\n"
  },
  {
    "path": "plugins/utility_flaggers.js",
    "content": "(async function() {\n    let aboutAction, cubes, material, duration, durationInput, hexString, numInput, invalidElementCount\n\n    // Highlighter mechanism\n    const highlighter = {\n        i: 1,\n        running: false,\n        start: (cubes, material, duration, durationPerFlash) => {\n            if (highlighter.running) return\n            highlighter.running = true\n            Blockbench.showQuickMessage(\"Started flagging process...\")\n\n            for (const cube of cubes) {\n                cube.mesh.material_non_flash = cube.mesh.material\n            };\n\n            clearInterval(highlighter.interval)\n            highlighter.i = 1\n            highlighter.interval = setInterval(() => highlighter.flash(cubes, material, duration), durationPerFlash)\n            highlighter.flash(cubes, material, duration)\n        },\n\n        flash: (cubes, material, duration) => {\n            let fc = highlighter.i\n\n            if (fc > duration) {\n                highlighter.running = false\n                clearInterval(highlighter.interval)\n            };\n\n            for (const cube of cubes) {\n                if (cube.mesh) {\n                    cube.mesh.material = (fc % 2) ? material : cube.mesh.material_non_flash\n                }\n            };\n\n            highlighter.i++\n        }\n    }\n\n    // About dialog variables\n    const id = \"utility_flaggers\"\n    const name = \"Utility Flaggers\"\n    const icon = \"lightbulb\"\n    const author = \"SirJain and DerfX\"\n\n    // Dialog variables\n    let invertedDialog, smallCubeDialog, sixFacedMeshDialog, allMeshDialog, decimalCubeDialog, invalidRotationDialog, inflateDialog\n\n    // Action variables\n    let boxuvConditions, meshConditions, invertedCubeCondition, smallCubeCondition, decimalCubeCondition, sixMeshCondition, allMeshCondition, invalidRotationCondition, flaggersParent, inflateCondition\n    \n    // Used in about dialog\n    const links = {\n        twitter: \"https://twitter.com/SirJain2\",\n        twitterDerf: \"https://twitter.com/Derf31922027\",\n        discord: \"https://discord.gg/wM4CKTbFVN\",\n        website: \"https://sirjain0.github.io\"\n    }\n    \n    Plugin.register(id, {\n        title: name,\n        icon,\n        author,\n        description: \"Flashes elements based on template conditions.\",\n        about: \"This plugin allows you to flash elements that meet certain preset conditions on-screen.\\n## How to use\\nTo use this plugin, simply go to `Tools -> Utility Flaggers`. Pick a preset option, fill out your preferred settings, and press `Flag`!\",\n        tags: [\"Utility\", \"BoxUV\", \"Format: Generic Model\"],\n        version: \"1.1.0\",\n        min_version: \"4.2.0\",\n        variant: \"both\",\n\n        oninstall: () => showAbout(true),\n\n        onload() {\n            addAbout()\n            registerDialogs()\n            registerActions()\n            MenuBar.addAction(flaggersParent, \"tools\")\n        },\n\n        onunload() {\n            aboutAction.delete()\n            MenuBar.removeAction(`help.about_plugins.about_${id}`)\n            MenuBar.removeAction(\"tools.flaggers_action\")\n\n            Blockbench.showQuickMessage(\"Uninstalled Utility Flaggers\", 2000)\n        }\n    })\n\n    // Initializes all plugin actions\n    function registerActions() {\n\n        // Child conditions of sub-parent\n        smallCubeCondition = new Action(\"small_cube_condition\", {\n            name: \"Flag Small Cubes\",\n            icon: \"fa-cube\",\n            condition: () => Format?.id !== \"image\",\n            click: () => smallCubeDialog.show()\n        })\n\n        decimalCubeCondition = new Action(\"decimal_cube_condition\", {\n            name: \"Flag Decimal-Sized Cubes\",\n            icon: \"fa-cube\",\n            condition: () => Format?.id !== \"image\",\n            click: () => decimalCubeDialog.show()\n        })\n\n        allMeshCondition = new Action(\"all_mesh_condition\", {\n            name: \"Flag Meshes\",\n            icon: \"diamond\",\n            condition: () => Format?.id === \"free\",\n            click: () => allMeshDialog.show()\n        })\n\n        sixMeshCondition = new Action(\"six_mesh_condition\", {\n            name: \"Flag 6-Faced Meshes\",\n            icon: \"diamond\",\n            condition: () => Format?.id === \"free\",\n            click: () => sixFacedMeshDialog.show()\n        })\n\n        // Other condition\n        invertedCubeCondition = new Action(\"inverted_cube_conditions\", {\n            name: \"Flag Inverted Cubes\",\n            icon: \"invert_colors\",\n            condition: () => Format?.id !== \"image\",\n            click: () => invertedDialog.show()\n        })\n\n        invalidRotationCondition = new Action(\"invalid_rotation_restriction\", {\n            name: \"Flag Invalid Java Block/Item Rotations\",\n            icon: \"rotate_90_degrees_ccw\",\n            condition: () => Format?.id !== \"image\",\n            click: () => invalidRotationDialog.show()\n        })\n\n        inflateCondition = new Action(\"inflate_condition\", {\n            name: \"Flag Inflated Cubes\",\n            icon: \"linear_scale\",\n            condition: () => Format?.id !== \"image\",\n            click: () => inflateDialog.show()\n        })\n\n        // Sub-parent actions\n        boxuvConditions = new Action(\"boxuv_conditions\", {\n            name: \"Invalid BoxUV Cubes\",\n            icon: \"fa-cube\",\n            condition: () => Format?.id !== \"image\",\n            children: [\"small_cube_condition\", \"decimal_cube_condition\"]\n        })\n\n        meshConditions = new Action(\"mesh_conditions\", {\n            name: \"Mesh Flaggers\",\n            icon: \"diamond\",\n            condition: () => Format?.id === \"free\",\n            children: [\"all_mesh_condition\", \"six_mesh_condition\"]\n        })\n\n        // Main Parent Action\n        flaggersParent = new Action(\"flaggers_action\", {\n            name: \"Utility Flaggers\",\n            icon: icon,\n            condition: () => Format?.id !== \"image\" && Format.id,\n            children: [\n                \"boxuv_conditions\", \n                \"mesh_conditions\",\n                \"inverted_cube_conditions\",\n                \"invalid_rotation_restriction\",\n                \"inflate_condition\"\n            ]\n        })\n    }\n\n    // Register the dialogs - dialogs are triggered by clicking an action using .show()\n    function registerDialogs() {\n        smallCubeDialog = new Dialog(\"small_cube_dialog\", {\n            title: \"Flag Small Cubes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#FF3131\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Cube.all.filter(cube => \n                    (cube.size(0) > 0 && cube.size(0) < 1) || \n                    (cube.size(1) > 0 && cube.size(1) < 1) || \n                    (cube.size(2) > 0 && cube.size(2) < 1)\n                )\n\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        decimalCubeDialog = new Dialog(\"decimal_cube_dialog\", {\n            title: \"Flag Decimal-Sized Cubes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#FF8C31\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Cube.all.filter(cube => (\n                    cube.size(0) % 1 !== 0 || \n                    cube.size(1) % 1 !== 0 || \n                    cube.size(2) % 1 !== 0\n                ))\n\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        inflateDialog = new Dialog(\"inflate_dialog\", {\n            title: \"Flag Inflated Cubes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#2ABEDC\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Cube.all.filter(cube => (\n                    cube.inflate !== 0 ||\n                    cube.inflate !== 0 ||\n                    cube.inflate !== 0\n                ))\n\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        allMeshDialog = new Dialog(\"all_mesh_dialog\", {\n            title: \"Flag Meshes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#F1F1F1\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Mesh.all\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        sixFacedMeshDialog = new Dialog(\"six_faced_mesh_dialog\", {\n            title: \"Flag 6-Faced Meshes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#F1F1F1\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Mesh.all.filter(e => Object.entries(e.faces).length === 6)\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        invalidRotationDialog = new Dialog(\"invalid_rotation_dialog\", {\n            title: \"Flag Invalid Java Block/Item Rotations\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Increment Color\",\n                    value: \"#2ABEDC\",\n                    description: \"The color of the increment flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Cube.all.filter(cube => \n                    isInvalidRotationIncrement(cube) ||\n                    isMultipleAxisRotations(cube)\n                )\n\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n\n        invertedDialog = new Dialog(\"inverted_cube_dialog\", {\n            title: \"Flag Inverted Cubes\",\n            buttons: [\"Flag\", \"Cancel\"],\n\n            form: {\n                color: {\n                    type: \"color\",\n                    label: \"Color\",\n                    value: \"#F1F1F1\",\n                    description: \"The color of the flash. It is recommended to use brighter colors to see the flashing better.\"\n                },\n                divider: \"_\",\n                amount: {\n                    type: \"number\",\n                    min: \"1\",\n                    value: \"3\",\n                    label: \"Amount of Flashes\",\n                    description: 'The amount of flashes that happen.'\n                },\n                duration: {\n                    type: \"number\",\n                    min: \"0.1\",\n                    value: \"1\",\n                    step: \"0.1\",\n                    label: \"Duration Per Flash\",\n                    description: 'The duration per flash, in seconds.'\n                }\n            },\n\n            onConfirm(formData) {\n                cubes = Cube.all.filter(cube => \n                    (cube.size(0) < 0) || \n                    (cube.size(1) < 0) || \n                    (cube.size(2) < 0)\n                )\n\n                flagElements(cubes, formData.color, formData.amount, formData.duration)\n            }\n        })\n    }\n\n    function isInvalidRotationIncrement(cube) {\n        return (\n            (cube.rotation[0] !== 0) &&\n            (cube.rotation[0] !== 22.5) &&\n            (cube.rotation[0] !== 45) &&\n            (cube.rotation[0] !== -22.5) &&\n            (cube.rotation[0] !== -45) \n        ) ||\n        (\n            (cube.rotation[1] !== 0) &&\n            (cube.rotation[1] !== 22.5) &&\n            (cube.rotation[1] !== 45) &&\n            (cube.rotation[1] !== -22.5) &&\n            (cube.rotation[1] !== -45) \n        ) ||\n        (\n            (cube.rotation[2] !== 0) &&\n            (cube.rotation[2] !== 22.5) &&\n            (cube.rotation[2] !== 45) &&\n            (cube.rotation[2] !== -22.5) &&\n            (cube.rotation[2] !== -45) \n        ) \n    }\n\n    function isMultipleAxisRotations(cube) {\n        return (\n            cube.rotation[0] !== 0 &&\n            cube.rotation[1] !== 0\n        ) ||\n        (\n            cube.rotation[1] !== 0 &&\n            cube.rotation[2] !== 0\n        ) ||\n        (\n            cube.rotation[0] !== 0 &&\n            cube.rotation[2] !== 0\n        )\n    }\n\n    // Add the about dialog\n    function addAbout() {\n        let about = MenuBar.menus.help.structure.find(e => e.id === \"about_plugins\")\n\n        if (!about) {\n            about = new Action(\"about_plugins\", {\n                name: \"About Plugins...\",\n                icon: \"info\",\n                children: []\n            })\n            MenuBar.addAction(about, \"help\")\n        }\n\n        aboutAction = new Action(`about_${id}`, {\n            name: `About ${name}...`,\n            icon,\n            click: () => showAbout()\n        })\n\n        about.children.push(aboutAction)\n    }\n\n    function flagElements(cubeList, flashColor, flashAmount, flashDuration) {\n        invalidElementCount = 0\n        cubes = cubeList\n\n        for (const cube of cubes) {\n            invalidElementCount++\n        }\n\n        hexString = flashColor.toHexString()\n        parsedStr = parseInt(hexString.substring(1), 16)\n        material = new THREE.MeshBasicMaterial({color: parsedStr})\n\n        numInput = flashAmount\n        duration = 2 * numInput - 1\n\n        durationInput = flashDuration\n        durationPerFlash = durationInput * 1000\n\n        if (invalidElementCount == 0) {\n            Blockbench.showQuickMessage(\"No invalid elements to flag!\")\n        } else {\n            highlighter.start(cubes, material, duration, durationPerFlash)\n        }\n    }\n      \n    function showAbout(banner) {\n        const infoBox = new Dialog({\n            id: \"about\",\n            title: name,\n            width: 780,\n            buttons: [],\n\n            lines: [`\n                <style>\n                    dialog#about .dialog_title {\n                        padding-left: 0;\n                        display: flex;\n                        align-items: center;\n                        gap: 10px;\n                    }\n\n                    dialog#about .dialog_content {\n                        text-align: left!important;\n                        margin: 0!important;\n                    }\n\n                    dialog#about .socials {\n                        padding: 0!important;\n                    }\n\n                    dialog#about #banner {\n                        background-color: var(--color-accent);\n                        color: var(--color-accent_text);\n                        width: 100%;\n                        padding: 0 8px\n                    }\n\n                    dialog#about #content {\n                        margin: 24px;\n                    }\n                </style>\n\n                ${banner ? `<div id=\"banner\">This window can be reopened at any time from <strong>Help > About Plugins > ${name}</strong></div>` : \"\"}\n                <div id=\"content\">\n                    <h1 style=\"margin-top:-10px\">${name}</h1>\n                    <p>Flashes elements based on template conditions.</p>\n                    <h4>Worth noting:</h4>\n                    <p>- This plugin basically combines the original <b>BoxUV Cube Flagger</b> and <b>Mesh Flagger</b> plugins into one, with adding the functionality of flagging inverted (negative-sized) cubes as well.\n                    <p>- DerfX is mentioned as an author due to his original contributions to the Mesh Flagger plugin.</p>\n                    <h4>How to use:</h4>\n                    <p>To use this plugin, go to <b>Tools > Utility Flaggers</b>. Choose your template for flagging (hover over question mark to learn more about it). Configure your settings if you wish, and then press <b>Flag</b>!</p>\n                    <br>\n                    <div class=\"socials\">\n                        <a href=\"${links[\"twitter\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#1DA1F2\"></i>\n                            <label>SirJain's Twitter</label>\n                        </a>\n                        <a href=\"${links[\"twitterDerf\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-twitter\" style=\"color:#1DA1F2\"></i>\n                            <label>DerfX's Twitter</label>\n                        </a>\n                        <a href=\"${links[\"discord\"]}\" class=\"open-in-browser\">\n                            <i class=\"fa-brands fa-discord\" style=\"color:#5865F2\"></i>\n                            <label>Discord Server</label>\n                        </a>\n                        <a href=\"${links[\"website\"]}\" class=\"open-in-browser\">\n                            <i class=\"icon material-icons\" style=\"color:#33E38E\">language</i>\n                            <label>SirJain's Website</label>\n                        </a>\n                    </div>\n                </div>\n            `]\n        }).show()\n        $(\"dialog#about .dialog_title\").html(`\n            <i class=\"icon material-icons\">${icon}</i>\n            ${name}\n        `)\n    }\n})()\n"
  },
  {
    "path": "plugins/vintagestory_models.js",
    "content": "(function(){\r\n    let exportVsAction;\r\n    Plugin.register('vintagestory_models', {\r\n        title: 'Vintage Story Models',\r\n        icon: 'park',\r\n        author: 'Malik12tree',\r\n        description: 'Allows to export VintageStory models.',\r\n        version: '1.0.0',\r\n        variant: \"both\",\r\n        onload() {\r\n            // Simulate the rotation on a mesh; rotation is stored as local\r\n            let m = new THREE.Mesh();\r\n            function rotationToLocal(rotation) {\r\n                m.rotation.set(0,0,0, \"ZYX\");\r\n                m.rotateOnWorldAxis(new THREE.Vector3(1,0,0), Math.degToRad(rotation[0]));\r\n                m.rotateOnWorldAxis(new THREE.Vector3(0,1,0), Math.degToRad(rotation[1]));\r\n                m.rotateOnWorldAxis(new THREE.Vector3(0,0,1), Math.degToRad(rotation[2]));\r\n                m.rotation.reorder(\"XYZ\");\r\n                let r = [\r\n                    Math.radToDeg(m.rotation.x),\r\n                    Math.radToDeg(m.rotation.y),\r\n                    Math.radToDeg(m.rotation.z),\r\n                ]\r\n                return r;\r\n            }\r\n            exportVsAction = new Action(\"exportVsModel\", {\r\n                name: \"Export Vintage Story Model\",\r\n                icon: \"park\",\r\n                click: function(){\r\n                    const worldcenter = Format.name === \"Java Block/Item\" ? 0: 8;\r\n                    let VSjson = {\r\n                        textureWidth: Project.texture_width,\r\n                        textureHeight: Project.texture_height,\r\n                        textureSizes: {\r\n                        },\r\n                        textures: {\r\n                        },\r\n                        elements: [\r\n                        ],\r\n                        animations:[\r\n                        ]\r\n                    };\r\n                    //textures\r\n                    if (Project.textures.length > 0) {\r\n                        let TFS = \"\" // Texture Folder Suffix\r\n                        for (let i = 0; i < Project.textures.length; i++) {\r\n                            eval(`VSjson.textureSizes[\"${Project.textures[i].id}\"] = [${Project.textures[i].width}, ${Project.textures[i].height}]`)\r\n                            if (Project.textures[i].folder) {\r\n                                TFS = \"/\";\r\n                            } else {\r\n                                TFS = \"\";\r\n                            }\r\n                            if (Blockbench.operating_system == \"Windows\") {\r\n                                                                                            // remove Drive name\r\n                                VSjson.textures[Project.textures[i].id] = Project.textures[i].path.substring(2).replace(\".png\", \"\").replaceAll(\"\\\\\", \"/\")\r\n                            } else {\r\n                                VSjson.textures[Project.textures[i].id] = Project.textures[i].path.replace(\".png\", \"\").replaceAll(\"\\\\\", \"/\").replaceAll(\"\\/\", \"/\")\r\n                            }\r\n                        }\r\n                    }\r\n                    //elements\r\n                    let elemALL = [];\r\n                    let axis = [\"x\", \"y\", \"z\"];\r\n                    let faces = [\"north\",\"east\",\"south\",\"west\",\"up\",\"down\",]\r\n                    let channels = [\"rotation\", \"position\", \"scale\"];\r\n                    for (let i = 0; i < Group.all.length; i++) {\r\n                        let elem = {\r\n                            name:           Group.all[i].name,\r\n                            rotationOrigin: [Group.all[i].origin[0]+worldcenter,Group.all[i].origin[1],Group.all[i].origin[2]+worldcenter],\r\n                            from:           [0,0,0],\r\n                            to:             [0,0,0],\r\n                            parent:         Group.all[i].parent === \"root\" ? null : Group.all[i].parent.name,\r\n                            faces:          {north: {    texture: \"#\", uv: [ 0,0,0,0 ] },east: {     texture: \"#\", uv: [ 0,0,0,0 ] },south: {    texture: \"#\", uv: [ 0,0,0,0 ] },west: {     texture: \"#\", uv: [ 0,0,0,0 ] },up: {       texture: \"#\", uv: [ 0,0,0,0 ] },down: {     texture: \"#\", uv: [ 0,0,0,0 ] }},\r\n                        }\r\n                        // rotations\r\n                        let r = Cube.all[i].mesh.rotation.clone().reorder(\"XYZ\");\r\n                        r = [Math.radToDeg(r.x),Math.radToDeg(r.y),Math.radToDeg(r.z)]\r\n                        axis.forEach((axis, index) => {\r\n                            if (Group.all[i].rotation[index] !== 0) {\r\n                                elem[\"rotation\" + axis.toUpperCase()] = r[index];\r\n                            }\r\n                        });\r\n                        elemALL.push(elem);\r\n                    }\r\n                    for (let i = 0; i < Cube.all.length; i++) {\r\n                        let elem = {\r\n                            name :          Cube.all[i].name + i, // index incase\r\n                            from:           [Cube.all[i].from[0]+worldcenter,Cube.all[i].from[1],Cube.all[i].from[2]+worldcenter],\r\n                            to:             [Cube.all[i].to[0]+worldcenter,Cube.all[i].to[1],Cube.all[i].to[2]+worldcenter],\r\n                            rotationOrigin: [Cube.all[i].origin[0]+worldcenter,Cube.all[i].origin[1],Cube.all[i].origin[2]+worldcenter],\r\n                            faces: {\r\n                                north: {    texture: \"#0\", uv: [ 0, 0, 0, 0 ] },\r\n                                east: {     texture: \"#0\", uv: [ 0, 0, 0, 0 ] },\r\n                                south: {    texture: \"#0\", uv: [ 0, 0, 0, 0 ] },\r\n                                west: {     texture: \"#0\", uv: [ 0, 0, 0, 0 ] },\r\n                                up: {       texture: \"#0\", uv: [ 0, 0, 0, 0 ] },\r\n                                down: {     texture: \"#0\", uv: [ 0, 0, 0, 0 ] }\r\n                            },\r\n                            parent: Cube.all[i].parent === \"root\" ? null : Cube.all[i].parent.name\r\n                        };\r\n\r\n                        //rotations\r\n                        let r = Cube.all[i].mesh.rotation.clone().reorder(\"XYZ\");\r\n                        r = [Math.radToDeg(r.x),Math.radToDeg(r.y),Math.radToDeg(r.z)]\r\n                        axis.forEach((axis, index) => {\r\n                            if (Cube.all[i].rotation[index] !== 0) {\r\n                                elem[\"rotation\" + axis.toUpperCase()] = r[index];\r\n                            }\r\n                        });\r\n\r\n                        //faces\r\n                        faces.forEach(face => {\r\n                            if (Project.textures.length > 0) {\r\n                                if (!Format.single_texture) {\r\n                                    if (Project.textures.find(e => e.uuid == Cube.all[i].faces[face].texture) !== false) {\r\n                                        elem.faces[face].texture = \"#\" + Project.textures.find(e => e.uuid == Cube.all[i].faces[face].texture).id;\r\n                                    } else {\r\n                                        elem.faces[face].texture = \"#missing\";\r\n                                    }   \r\n\r\n                                } else {\r\n                                    elem.faces[face].texture = \"#\" + Cube.all[i].faces[face].getTexture().id;\r\n                                }\r\n                            }\r\n                            elem.faces[face].autoUv = Project.box_uv;\r\n                            elem.faces[face].uv = [Cube.all[i].faces[face].uv[0],Cube.all[i].faces[face].uv[1],Cube.all[i].faces[face].uv[2],Cube.all[i].faces[face].uv[3]];\r\n                            if (Cube.all[i].faces[face].rotation !== 0) {\r\n                                elem.faces[face].rotation = Cube.all[i].faces[face].rotation;\r\n                            }\r\n                        });\r\n\r\n                        // VSjson.elements.push(elem);\r\n                        elemALL.push(elem);\r\n                    }\r\n                    VSjson.elements = list_to_tree(elemALL);\r\n\r\n                    //Animation\r\n                    if (Format.animation_mode) {\r\n                        for (let i = 0; i < Animation.all.length; i++) {\r\n                            const snap_time = (1/Math.clamp(Animation.all[i].snapping, 1, 120)).toFixed(4)*1;\r\n                            // console.log(snap_time);\r\n\r\n                            let animators = []\r\n                            Object.keys(Animation.all[i].animators).forEach(key => {\r\n                                animators.push(Animation.all[i].animators[key]);\r\n                            });\r\n                            let anim = {\r\n                                name: Animation.all[i].name,\r\n                                code: (Animation.all[i].name).toLowerCase().replace(\" \", \"_\"),\r\n\t\t\t                    onActivityStopped: \"EaseOut\",\r\n                                onAnimationEnd: \"Repeat\",\r\n                                quantityframes: (Animation.all[i].length*30).toFixed()*1,\r\n                                keyframes: [\r\n                                ],\r\n                            }\r\n                            // loop mode\r\n                            if (Animation.all[i].loop === \"hold\") {\r\n                                anim.onAnimationEnd = \"Hold\"\r\n                            } else if (Animation.all[i].loop === \"once\"){\r\n                                anim.onAnimationEnd = \"Stop\"\r\n                            }\r\n                            animators.forEach(animator => {\r\n\r\n                                // keyframes\r\n\r\n                                //gather\r\n                                let newKfs  = [];\r\n                                channels.forEach(channel => {\r\n                                    if (animator.group !== undefined && animator[channel].length > 0) {\r\n                                        var keyframes_sorted = animator[channel].slice().sort((a, b) => a.time - b.time);\r\n                                        for (let k = 0; k <= keyframes_sorted.last().time + 0.5; k+=snap_time) {\r\n                                            const timeIndex = Math.trunc(k*10000)/10000;\r\n\r\n                                            //target kf\r\n                                            const findingKF = animator[channel].find(kf => getRangeBool(kf.time, timeIndex-.02, timeIndex+.02));\r\n                                            if(findingKF !== undefined){\r\n                                                let KFclone = new Keyframe(findingKF);                                                \r\n                                                if (findingKF.channel == \"rotation\") {\r\n                                                    let rl = rotationToLocal([\r\n                                                        findingKF.data_points[0].x*1,\r\n                                                        findingKF.data_points[0].y*1,\r\n                                                        findingKF.data_points[0].z*1,\r\n                                                    ])\r\n                                                    KFclone.data_points[0].x = rl[0];\r\n                                                    KFclone.data_points[0].y = rl[1];\r\n                                                    KFclone.data_points[0].z = rl[2];\r\n                                                }\r\n                                                const tIndex = newKfs.findIndex(e => e.find(f => f.time == findingKF.time));\r\n                                                if (tIndex !== -1) {\r\n                                                    newKfs[tIndex].push(KFclone);\r\n                                                } else {\r\n                                                    newKfs.push([KFclone]);\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                });\r\n                                newKfs.forEach((frame, indexf) => {\r\n                                    let keyframe = {\r\n                                        frame: ((frame[0].time*30).toFixed()*1),\r\n                                        elements: {\r\n                                        }\r\n                                    }\r\n                                    const groupC = [animator.group]\r\n\r\n                                    for (let g = 0; g < groupC.length; g++) {\r\n                                        let elemA = {};\r\n\r\n                                        if (animator.keyframes.length > 0) {\r\n                                            frame.forEach(kf => {\r\n                                                axis.forEach(a => {\r\n                                                    elemA[kf.channel.replace(\"position\", \"offset\").replace(\"scale\", \"stretch\") + a.toUpperCase()] = kf.data_points[0][a]*1;\r\n                                                });\r\n                                            });\r\n                                            // 30 is fps VS uses for anims\r\n                                            if (anim.keyframes.find(e => e.frame === (frame[0].time*30).toFixed()*1) !== undefined) {\r\n                                                anim.keyframes.find(e => e.frame === (frame[0].time*30).toFixed()*1).elements[groupC[g].name] = elemA;\r\n                                            } else {\r\n                                                keyframe.elements[groupC[g].name] = elemA;\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                    if (anim.keyframes.find(e => e.frame === (frame[0].time*30).toFixed()*1) === undefined) {\r\n                                        anim.keyframes.push(keyframe);\r\n                                    }\r\n                                });\r\n                            });\r\n                            anim.keyframes.sort((a, b) => a.frame - b.frame);\r\n                            VSjson.animations.push(anim)\r\n                        }\r\n                    }\r\n                    if (isApp) {\r\n                            Blockbench.export({\r\n                                type: 'VintageStory Model',\r\n                                extensions: ['json'],\r\n                                name: (Project.name !== '' ? Project.name: \"model\"),\r\n                                content: autoStringify(VSjson),\r\n                                savetype: 'json'\r\n                            });\r\n                    } else{\r\n                        var blob = new Blob([autoStringify(VSjson)], {type: \"text/plain;charset=utf-8\"});\r\n                        saveAs(blob, (Project.name !== '' ? Project.name: \"model\") + \".json\");\r\n                    }\r\n                    console.log(VSjson);\r\n                }\r\n            })\r\n            MenuBar.addAction(exportVsAction, \"file.export\");\r\n        },\r\n        onunload() {\r\n            exportVsAction.delete();\r\n        }\r\n    });\r\n    \r\nfunction getRangeBool(x, min, max) {\r\n    return x >= min && x <= max;\r\n}\r\n\r\nfunction list_to_tree(list) {\r\n    var map = {}, node, roots = [], i;\r\n    \r\n    for (i = 0; i < list.length; i ++) {\r\n      map[list[i].name] = i;\r\n      list[i].children = [];\r\n    }\r\n    \r\n    for (i = 0; i < list.length; i ++) {\r\n      node = list[i];\r\n      if (node.parent !== null) {\r\n        list[map[node.parent]].children.push(node);\r\n      } else {\r\n        roots.push(node);\r\n      }\r\n    }\r\n    return roots;\r\n  }\r\n})()"
  },
  {
    "path": "plugins/vox_importer.js",
    "content": "/// <reference path=\"../types/index.d.ts\" />\r\n\r\n(function() {\r\n\r\nlet import_vox_action;\r\nlet vox = {};\r\n\r\nBBPlugin.register('vox_importer', {\r\n\ttitle: 'Voxel Importer',  \r\n\ticon: 'view_module',\r\n\tauthor: 'JannisX11',\r\n\tdescription: 'Import MagicaVoxel .vox files',\r\n\tversion: '1.2.2',\r\n\tvariant: 'both',\r\n\tonload() {\r\n\r\n\t\timport_vox_action = new Action({\r\n\t\t\tid: 'import_vox',\r\n\t\t\tname: 'Import Vox',\r\n\t\t\ticon: 'view_module',\r\n\t\t\tcategory: 'file',\r\n\t\t\tcondition: () => Project instanceof ModelProject,\r\n\t\t\tclick: function(ev) {\r\n\t\t\r\n\t\t\t\tvar file_path;\r\n\t\t\t\tfunction importVoxFile(cb) {\r\n\t\t\r\n\t\t\t\t\tBlockbench.import({\r\n\t\t\t\t\t\textensions: ['vox'],\r\n\t\t\t\t\t\ttype: 'Vox Model',\r\n\t\t\t\t\t\treadtype: 'binary',\r\n\t\t\t\t\t}, (files) => {\r\n\t\t\t\t\t\tconsole.log(files)\r\n\t\t\t\t\t\tvox.mainParser.parseUint8Array(new Uint8Array(files[0].content), cb)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\timportVoxFile(function(a, data) {\r\n\t\t\t\t\tif (a) throw a\r\n\t\t\t\t\tconsole.log(data)\r\n\t\t\r\n\t\t\r\n\t\t\t\t\tfunction processVoxels() {\r\n\t\t\t\t\t\tvar colors = []\r\n\t\t\t\t\t\tvar group = new Group(typeof file_path === 'string' ? pathToName(file_path) : 'voxel_file').init().addTo()\r\n\t\t\t\t\t\tvar vsize = 16/settings.edit_size.value;\r\n\t\t\t\t\t\tif (Format.canvas_limit && !settings.deactivate_size_limit.value) vsize = 16 / Math.max(data.size.x, data.size.y, data.size.z)\r\n\t\t\t\t\t\tCanvas.buildGrid()\r\n\t\t\t\t\t\tvar i = 0\r\n\t\t\t\t\t\tconsole.log(data)\r\n\t\t\t\t\t\tvar matrix = {}\r\n\t\t\t\t\t\tfunction getFromMatrix(x, y, z) {\r\n\t\t\t\t\t\t\tif (matrix[x] && matrix[x][y] && matrix[x][y][z]) {\r\n\t\t\t\t\t\t\t\treturn matrix[x][y][z];\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfunction expandTo(box, axis, direction, color, write) {\r\n\t\t\t\t\t\t\tvar axisNumber = getAxisNumber(axis)\r\n\t\t\t\t\t\t\t//u, v, layer\r\n\t\t\t\t\t\t\tvar layer = direction ? (box[axis+'2']+1) : (box[axis]-1)\r\n\t\t\t\t\t\t\tvar u_axis = getAxisLetter((axisNumber + 1) % 3)\r\n\t\t\t\t\t\t\tvar v_axis = getAxisLetter((axisNumber + 2) % 3)\r\n\t\t\r\n\t\t\t\t\t\t\tfor (\tvar u = box[u_axis]; u <= box[u_axis+'2']; u++) {\r\n\t\t\t\t\t\t\t\tfor (var v = box[v_axis]; v <= box[v_axis+'2']; v++) {\r\n\t\t\r\n\t\t\t\t\t\t\t\t\tlet coords = {}\r\n\t\t\t\t\t\t\t\t\tcoords[u_axis] = u\r\n\t\t\t\t\t\t\t\t\tcoords[v_axis] = v\r\n\t\t\t\t\t\t\t\t\tcoords[axis] = layer\r\n\t\t\r\n\t\t\t\t\t\t\t\t\tlet voxel = getFromMatrix(coords.x, coords.y, coords.z)\r\n\t\t\t\t\t\t\t\t\tif (!voxel || voxel.processed || voxel.colorIndex !== color) {\r\n\t\t\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t\t\t} else if (write) {\r\n\t\t\t\t\t\t\t\t\t\tvoxel.processed = true;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!write) {\r\n\t\t\t\t\t\t\t\t//mark voxels as processed\r\n\t\t\t\t\t\t\t\texpandTo(box, axis, direction, color, true)\r\n\t\t\t\t\t\t\t\t//Box\r\n\t\t\t\t\t\t\t\tif (direction) {\r\n\t\t\t\t\t\t\t\t\tbox[axis+'2']++;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tbox[axis]--;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t//Setup Matrix\r\n\t\t\t\t\t\twhile (i < data.voxels.length) {\r\n\t\t\t\t\t\t\tvar voxel = data.voxels[i]\r\n\t\t\t\t\t\t\tif (typeof matrix[voxel.x] !== 'object') {\r\n\t\t\t\t\t\t\t\tmatrix[voxel.x] = {}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (typeof matrix[voxel.x][voxel.y] !== 'object') {\r\n\t\t\t\t\t\t\t\tmatrix[voxel.x][voxel.y] = {}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (typeof matrix[voxel.x][voxel.y][voxel.z] !== 'object') {\r\n\t\t\t\t\t\t\t\tmatrix[voxel.x][voxel.y][voxel.z] = voxel\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\t}\r\n\t\t\r\n\t\t\t\t\t\t//Scan Model\r\n\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\twhile (i < data.voxels.length) {\r\n\t\t\t\t\t\t\tvar voxel = data.voxels[i]\r\n\t\t\t\t\t\t\tif (!voxel.processed) {\r\n\t\t\t\t\t\t\t\tvoxel.processed = true\r\n\t\t\t\t\t\t\t\tvar box = {\r\n\t\t\t\t\t\t\t\t\tx:  voxel.x, y:  voxel.y, z:  voxel.z,\r\n\t\t\t\t\t\t\t\t\tx2: voxel.x, y2: voxel.y, z2: voxel.z\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tvar safety_i = 0\r\n\t\t\t\t\t\t\t\tvar can_expand = [true, true, true, true, true, true]\r\n\t\t\t\t\t\t\t\twhile (can_expand.includes(true) && safety_i < 1024) {\r\n\t\t\t\t\t\t\t\t\tcan_expand[0] = can_expand[0] && expandTo(box, 'x', true,  voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tcan_expand[1] = can_expand[1] && expandTo(box, 'x', false, voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tcan_expand[2] = can_expand[2] && expandTo(box, 'y', true,  voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tcan_expand[3] = can_expand[3] && expandTo(box, 'y', false, voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tcan_expand[4] = can_expand[4] && expandTo(box, 'z', true,  voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tcan_expand[5] = can_expand[5] && expandTo(box, 'z', false, voxel.colorIndex)\r\n\t\t\t\t\t\t\t\t\tsafety_i++;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t//Cube\r\n\t\t\t\t\t\t\t\tvar cube = new Cube({\r\n\t\t\t\t\t\t\t\t\tfrom: [\r\n\t\t\t\t\t\t\t\t\t\tbox.x * vsize,\r\n\t\t\t\t\t\t\t\t\t\tbox.z * vsize,\r\n\t\t\t\t\t\t\t\t\t\tbox.y * vsize,\r\n\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\tto:   [\r\n\t\t\t\t\t\t\t\t\t\t(box.x2+1) * vsize,\r\n\t\t\t\t\t\t\t\t\t\t(box.z2+1) * vsize,\r\n\t\t\t\t\t\t\t\t\t\t(box.y2+1) * vsize,\r\n\t\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\t\tname: 'voxel',\r\n\t\t\t\t\t\t\t\t\tbox_uv: false,\r\n\t\t\t\t\t\t\t\t\tdisplay: {\r\n\t\t\t\t\t\t\t\t\t\tautouv: 0\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}).addTo(group, false).init()\r\n\t\t\r\n\t\t\t\t\t\t\t\t//Color\r\n\t\t\t\t\t\t\t\tvar color = data.palette[voxel.colorIndex]\r\n\t\t\t\t\t\t\t\tcolor = color.a + '_' + color.b + '_' + color.g + '_' + color.r\r\n\t\t\t\t\t\t\t\tvar createNew = true\r\n\t\t\t\t\t\t\t\tcolors.forEach(function(c) {\r\n\t\t\t\t\t\t\t\t\tif (c.string === color) {\r\n\t\t\t\t\t\t\t\t\t\tcreateNew = false\r\n\t\t\t\t\t\t\t\t\t\tc.elements.push(cube)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\tif (createNew === true) {\r\n\t\t\t\t\t\t\t\t\tcolors.push({\r\n\t\t\t\t\t\t\t\t\t\tstring: color,\r\n\t\t\t\t\t\t\t\t\t\telements: [cube]\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t\tvar voxel = data.voxels[i]\r\n\t\t\r\n\t\t\t\t\t\t\t//Cube\r\n\t\t\t\t\t\t\tvar cube = new Cube().extend({\r\n\t\t\t\t\t\t\t\tfrom: [\r\n\t\t\t\t\t\t\t\t\tvoxel.x * vsize,\r\n\t\t\t\t\t\t\t\t\tvoxel.z * vsize,\r\n\t\t\t\t\t\t\t\t\tvoxel.y * vsize\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tto:   [\r\n\t\t\t\t\t\t\t\t\t(voxel.x+1) * vsize,\r\n\t\t\t\t\t\t\t\t\t(voxel.z+1) * vsize,\r\n\t\t\t\t\t\t\t\t\t(voxel.y+1) * vsize\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t\t\tname: 'voxel',\r\n\t\t\t\t\t\t\t\tdisplay: {\r\n\t\t\t\t\t\t\t\t\tautouv: false\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}).addTo(group, false)\r\n\t\t\t\t\t\t\telements.push(cube)\r\n\t\t\r\n\t\t\t\t\t\t\t//Color\r\n\t\t\t\t\t\t\tvar color = data.palette[voxel.colorIndex]\r\n\t\t\t\t\t\t\tcolor = color.a + '_' + color.b + '_' + color.g + '_' + color.r\r\n\t\t\t\t\t\t\tvar createNew = true\r\n\t\t\t\t\t\t\tcolors.forEach(function(c) {\r\n\t\t\t\t\t\t\t\tif (c.string === color) {\r\n\t\t\t\t\t\t\t\t\tcreateNew = false\r\n\t\t\t\t\t\t\t\t\tc.elements.push(cube)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tif (createNew === true) {\r\n\t\t\t\t\t\t\t\tcolors.push({\r\n\t\t\t\t\t\t\t\t\tstring: color,\r\n\t\t\t\t\t\t\t\t\telements: [cube]\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}*/\r\n\t\t\r\n\t\t\t\t\t\tvar pos = {x: 0, y: 0}\r\n\t\t\t\t\t\tcolors.forEach(function(c) {\r\n\t\t\t\t\t\t\tc.elements.forEach(function(s) {\r\n\t\t\t\t\t\t\t\tfor (var face in s.faces) {\r\n\t\t\t\t\t\t\t\t\tif (s.faces.hasOwnProperty(face)) {\r\n\t\t\t\t\t\t\t\t\t\ts.faces[face].uv = [\r\n\t\t\t\t\t\t\t\t\t\t\tpos.x + 0.25,\r\n\t\t\t\t\t\t\t\t\t\t\tpos.y + 0.25,\r\n\t\t\t\t\t\t\t\t\t\t\tpos.x + 0.75,\r\n\t\t\t\t\t\t\t\t\t\t\tpos.y + 0.75\r\n\t\t\t\t\t\t\t\t\t\t]\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tc.position = {x: pos.x, y: pos.y}\r\n\t\t\t\t\t\t\t//Position for next pixel\r\n\t\t\t\t\t\t\tif (pos.x > 14) {\r\n\t\t\t\t\t\t\t\tpos.x = 0\r\n\t\t\t\t\t\t\t\tif (pos.y > 14) {\r\n\t\t\t\t\t\t\t\t\tpos = {x: 15, z: 15}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tpos.y += 1\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tpos.x += 1\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\r\n\t\t\t\t\t\tTextureGenerator.addBitmap({\r\n\t\t\t\t\t\t\tres: 16,\r\n\t\t\t\t\t\t\tcolor: new tinycolor(0x00000000),\r\n\t\t\t\t\t\t\tname: 'voxel_palette',\r\n\t\t\t\t\t\t\tfolder: 'blocks',\r\n\t\t\t\t\t\t\tparticle: true\r\n\t\t\t\t\t\t}, function (texture) {\r\n\t\t\t\t\t\t\tgroup.select()\r\n\t\t\t\t\t\t\ttexture.load(_ => {\r\n\t\t\r\n\t\t\t\t\t\t\t\ttexture.edit(function(canvas) {\r\n\t\t\t\t\t\t\t\t\tlet ctx = canvas.getContext('2d');\r\n\t\t\t\t\t\t\t\t\tcolors.forEach(function(c) {\r\n\t\t\t\t\t\t\t\t\t\tvar c_vals = c.string.split('_')\r\n\t\t\t\t\t\t\t\t\t\tc_vals.forEach(function(cv, cvi) {\r\n\t\t\t\t\t\t\t\t\t\t\tc_vals[cvi] = parseInt(cv)\r\n\t\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t\t//var hex_color = Jimp.rgbaToInt(c_vals[3], c_vals[2], c_vals[1], c_vals[0])\r\n\t\t\t\t\t\t\t\t\t\tlet hex_color = tinycolor({r: c_vals[3], g: c_vals[2], b: c_vals[1], a: c_vals[0]}).toRgbString();\r\n\t\t\t\t\t\t\t\t\t\tctx.fillStyle = hex_color\r\n\t\t\t\t\t\t\t\t\t\tctx.fillRect(c.position.x, c.position.y, 1, 1);\r\n\t\t\t\t\t\t\t\t\t\tconsole.log(hex_color, c.position, c)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t\t*/\r\n\t\t\t\t\t\t\ttexture.apply(true)\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tCanvas.updateAll()\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (data.voxels.length > 6000 && Blockbench.showMessageBox) {\r\n\t\t\t\t\t\tBlockbench.showMessageBox({\r\n\t\t\t\t\t\t\ttitle: 'Warning',\r\n\t\t\t\t\t\t\ticon: 'warning',\r\n\t\t\t\t\t\t\tbuttons: ['Continue', 'Cancel'],\r\n\t\t\t\t\t\t\tmessage: 'This file contains too many voxels ('+data.voxels.length+'). Importing it might freeze or crash Blockbench.'\r\n\t\t\t\t\t\t}, function (result) {\r\n\t\t\t\t\t\t\tif (result === 0) {\r\n\t\t\t\t\t\t\t\tprocessVoxels()\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tprocessVoxels()\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t})\r\n\t\tMenuBar.addAction(import_vox_action, 'file.import')\r\n\t},\r\n\tonunload() {\r\n\t\timport_vox_action.delete();\r\n\t}\r\n})\r\n\r\n\"use strict\";\r\n\r\n/**\r\n * @namespace\r\n */\r\n\r\n(function() {\r\n\tif (typeof(window) !== \"undefined\") {\r\n\t\tvox.global = window;\r\n\t\tvox.global.vox = vox;\r\n\t} else {\r\n\t\tvox.global = global;\r\n\t}\r\n\r\n\tif (typeof(module) !== \"undefined\") {\r\n\t\tmodule.exports = vox;\r\n\t}\r\n\r\n})();\r\n\r\n(function() {\r\n\r\n\t/**\r\n\t * @constructor\r\n\t * @property {Object} size {x, y, z}\r\n\t * @property {Array} voxels [{x, y, z, colorIndex}...]\r\n\t * @property {Array} palette [{r, g, b, a}...]\r\n\t */\r\n\tvox.VoxelData = function() {\r\n\t\tthis.size = null;\r\n\t\tthis.voxels = [];\r\n\t\tthis.palette = [];\r\n\t\t\r\n\t\tthis.anim = [{\r\n\t\t\tsize: null,\r\n\t\t\tvoxels: [],\r\n\t\t}];\r\n\t};\r\n\t\r\n})();\r\n\r\n(function() {\r\n\t\r\n\tvox.Xhr = function() {};\r\n\tvox.Xhr.prototype.getBinary = function(url) {\r\n\t\treturn new Promise(function(resolve, reject) {\r\n\t\t\tvar xhr = new XMLHttpRequest();\r\n\t\t\txhr.open(\"GET\", url, true);\r\n\t\t\txhr.responseType = \"arraybuffer\";\r\n\t\t\txhr.onreadystatechange = function() {\r\n\t\t\t\tif (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) {\r\n\t\t\t\t\tvar arrayBuffer = xhr.response;\r\n\t\t\t\t\tif (arrayBuffer) {\r\n\t\t\t\t\t\tvar byteArray = new Uint8Array(arrayBuffer);\r\n\t\t\t\t\t\tresolve(byteArray);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\txhr.send(null);\r\n\t\t});\r\n\t};\r\n\t\r\n})();\r\n\r\n(function() {\r\n\t\r\n\t/** \r\n\t * @constructor\r\n\t */\r\n\tvox.Parser = function() {};\r\n\t\r\n\t/**\r\n\t * 戻り値のPromiseは成功すると{@link vox.VoxelData}を返す.\r\n\t * @param {String} url\r\n\t * @return {Promise}\r\n\t */\r\n\tvox.Parser.prototype.parse = function(url) {\r\n\t\tvar self = this;\r\n\t\tvar xhr = new vox.Xhr();\r\n\t\treturn xhr.getBinary(url).then(function(uint8Array) {\r\n\t\t\treturn new Promise(function(resolve, reject) {\r\n\t\t\t\tself.parseUint8Array(uint8Array, function(error, voxelData) {\r\n\t\t\t\t\tif (error) {\r\n\t\t\t\t\t\treject(error);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tresolve(voxelData);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\tif (typeof(require) !== \"undefined\") {\r\n\t\tvar fs = require(\"fs\");\r\n\t\t/**\r\n\t\t * for node.js\r\n\t\t * @param {String} path\r\n\t\t * @param {function} callback\r\n\t\t */\r\n\t\tvox.Parser.prototype.parseFile = function(path, callback) {\r\n\t\t\tfs.readFile(path, function(error, data) {\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\treturn callback(error);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar uint8Array = new Uint8Array(new ArrayBuffer(data.length));\r\n\t\t\t\t\tfor (var i = 0, len = data.length; i < len; i++) {\r\n\t\t\t\t\t\tuint8Array[i] = data[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.parseUint8Array(uint8Array, callback);\r\n\t\t\t\t}\r\n\t\t\t}.bind(this));\r\n\t\t};\r\n\t}\r\n\t\r\n\t/**\r\n\t * @param {Uint8Array} uint8Array\r\n\t * @param {function} callback\r\n\t */\r\n\tvox.Parser.prototype.parseUint8Array = function(uint8Array, callback) {\r\n\t\tvar dataHolder = new DataHolder(uint8Array);\r\n\t\ttry {\r\n\t\t\troot(dataHolder);\r\n\t\t\tdataHolder.data.size = dataHolder.data.anim[0].size;\r\n\t\t\tdataHolder.data.voxels = dataHolder.data.anim[0].voxels;\r\n\t\t\tif (dataHolder.data.palette.length === 0) {\r\n\t\t\t\t// console.debug(\"(use default palette)\");\r\n\t\t\t\tdataHolder.data.palette = vox.defaultPalette;\r\n\t\t\t} else {\r\n\t\t\t\tdataHolder.data.palette.unshift(dataHolder.data.palette[0]);\r\n\t\t\t\tdataHolder.data.palette.pop();\r\n\t\t\t}\r\n\r\n\t\t\tcallback(null, dataHolder.data);\r\n\t\t} catch (e) {\r\n\t\t\tcallback(e);\r\n\t\t}\r\n\t};\r\n\t\r\n\tvar DataHolder = function(uint8Array) {\r\n\t\tthis.uint8Array = uint8Array;\r\n\t\tthis.cursor = 0;\r\n\t\tthis.data = new vox.VoxelData();\r\n\t\t\r\n\t\tthis._currentChunkId = null;\r\n\t\tthis._currentChunkSize = 0;\r\n\t};\r\n\tDataHolder.prototype.next = function() {\r\n\t\tif (this.uint8Array.byteLength <= this.cursor) {\r\n\t\t\tthrow new Error(\"uint8Array index out of bounds: \" + this.uint8Array.byteLength);\r\n\t\t}\r\n\t\treturn this.uint8Array[this.cursor++];\r\n\t};\r\n\tDataHolder.prototype.hasNext = function() {\r\n\t\treturn this.cursor < this.uint8Array.byteLength;\r\n\t};\r\n\t\r\n\tvar root = function(dataHolder) {\r\n\t\tmagicNumber(dataHolder);\r\n\t\tversionNumber(dataHolder);\r\n\t\tchunk(dataHolder); // main chunk\r\n\t};\r\n\t\r\n\tvar magicNumber = function(dataHolder) {\r\n\t\tvar str = \"\";\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tstr += String.fromCharCode(dataHolder.next());\r\n\t\t}\r\n\t\t\r\n\t\tif (str !== \"VOX \") {\r\n\t\t\tthrow new Error(\"invalid magic number '\" + str + \"'\");\r\n\t\t}\r\n\t};\r\n\t\r\n\tvar versionNumber = function(dataHolder) {\r\n\t\tvar ver = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tver += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\tconsole.info(\".vox format version \" + ver);\r\n\t};\r\n\t\r\n\tvar chunk = function(dataHolder) {\r\n\t\tif (!dataHolder.hasNext()) return false;\r\n\r\n\t\tchunkId(dataHolder);\r\n\t\tsizeOfChunkContents(dataHolder);\r\n\t\ttotalSizeOfChildrenChunks(dataHolder);\r\n\t\tcontents(dataHolder);\r\n\t\twhile (chunk(dataHolder));\r\n\t\treturn dataHolder.hasNext();\r\n\t};\r\n\t\r\n\tvar chunkId = function(dataHolder) {\r\n\t\tvar id = \"\";\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tid += String.fromCharCode(dataHolder.next());\r\n\t\t}\r\n\t\tdataHolder._currentChunkId = id;\r\n\t\tdataHolder._currentChunkSize = 0;\r\n\t\t\r\n\t\t// console.debug(\"chunk id = \" + id);\r\n\t};\r\n\t\r\n\tvar sizeOfChunkContents = function(dataHolder) {\r\n\t\tvar size = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tsize += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\tdataHolder._currentChunkSize = size;\r\n\t\t\r\n\t\t// console.debug(\"  size of chunk = \" + size);\r\n\t};\r\n\t\r\n\tvar totalSizeOfChildrenChunks = function(dataHolder) {\r\n\t\tvar size = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tsize += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t\r\n\t\t// console.debug(\"  total size of children chunks = \" + size);\r\n\t};\r\n\t\r\n\tvar contents = function(dataHolder) {\r\n\t\tswitch (dataHolder._currentChunkId) {\r\n\t\tcase \"PACK\":\r\n\t\t\tcontentsOfPackChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\tcase \"SIZE\":\r\n\t\t\tcontentsOfSizeChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\tcase \"XYZI\":\r\n\t\t\tcontentsOfVoxelChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\tcase \"RGBA\":\r\n\t\t\tcontentsOfPaletteChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\tcase \"MATT\":\r\n\t\t\tcontentsOfMaterialChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tcontentsOfUnknownChunk(dataHolder);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\r\n\tvar contentsOfUnknownChunk = function(dataHolder) {\r\n\t\tfor (var i = 0; i < dataHolder._currentChunkSize; i++) {\r\n\t\t\tdataHolder.next();\r\n\t\t}\r\n\t}\r\n\t\r\n\tvar contentsOfPackChunk = function(dataHolder) {\r\n\t\tvar size = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tsize += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t\r\n\t\t// console.debug(\"  num of SIZE and XYZI chunks = \" + size);\r\n\t};\r\n\t\r\n\tvar contentsOfSizeChunk = function(dataHolder) {\r\n\t\tvar x = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tx += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\tvar y = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\ty += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\tvar z = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tz += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"  bounding box size = \" + x + \", \" + y + \", \" + z);\r\n\r\n\t\tvar data = dataHolder.data.anim[dataHolder.data.anim.length - 1];\r\n\t\tif (data.size) {\r\n\t\t\tdata = { size: null, voxels: [] };\r\n\t\t\tdataHolder.data.anim.push(data);\r\n\t\t}\r\n\t\tdata.size = {\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tz: z,\r\n\t\t};\r\n\t};\r\n\t\r\n\tvar contentsOfVoxelChunk = function(dataHolder) {\r\n\t\tvar num = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tnum += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"  voxel size = \" + num);\r\n\r\n\t\tvar data = dataHolder.data.anim[dataHolder.data.anim.length - 1];\r\n\t\tif (data.voxels.length) {\r\n\t\t\tdata = { size: null, voxels: [] };\r\n\t\t\tdataHolder.data.anim.push(data);\r\n\t\t}\r\n\t\tfor (var i = 0; i < num; i++) {\r\n\t\t\tdata.voxels.push({\r\n\t\t\t\tx: dataHolder.next(),\r\n\t\t\t\ty: dataHolder.next(),\r\n\t\t\t\tz: dataHolder.next(),\r\n\t\t\t\tcolorIndex: dataHolder.next(),\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tvar contentsOfPaletteChunk = function(dataHolder) {\r\n\t\t// console.debug(\"  palette\");\r\n\t\tfor (var i = 0; i < 256; i++) {\r\n\t\t\tvar p = {\r\n\t\t\t\tr: dataHolder.next(),\r\n\t\t\t\tg: dataHolder.next(),\r\n\t\t\t\tb: dataHolder.next(),\r\n\t\t\t\ta: dataHolder.next(),\r\n\t\t\t};\r\n\t\t\tdataHolder.data.palette.push(p);\r\n\t\t}\r\n\t};\r\n\t\r\n\tvar contentsOfMaterialChunk = function(dataHolder) {\r\n\t\t// console.debug(\"  material\");\r\n\t\tvar id = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tid += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"\tid = \" + id);\r\n\r\n\t\tvar type = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\ttype += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"\ttype = \" + type + \" (0:diffuse 1:metal 2:glass 3:emissive)\");\r\n\r\n\t\tvar weight = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tweight += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"\tweight = \" + parseFloat(weight));\r\n\r\n\t\tvar propertyBits = 0;\r\n\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\tpropertyBits += dataHolder.next() * Math.pow(256, i);\r\n\t\t}\r\n\t\t// console.debug(\"\tproperty bits = \" + propertyBits.toString(2));\r\n\t\tvar plastic = !!(propertyBits & 1);\r\n\t\tvar roughness = !!(propertyBits & 2);\r\n\t\tvar specular = !!(propertyBits & 4);\r\n\t\tvar ior = !!(propertyBits & 8);\r\n\t\tvar attenuation = !!(propertyBits & 16);\r\n\t\tvar power = !!(propertyBits & 32);\r\n\t\tvar glow = !!(propertyBits & 64);\r\n\t\tvar isTotalPower = !!(propertyBits & 128);\r\n\t\t// console.debug(\"\t  Plastic = \" + plastic);\r\n\t\t// console.debug(\"\t  Roughness = \" + roughness);\r\n\t\t// console.debug(\"\t  Specular = \" + specular);\r\n\t\t// console.debug(\"\t  IOR = \" + ior);\r\n\t\t// console.debug(\"\t  Attenuation = \" + attenuation);\r\n\t\t// console.debug(\"\t  Power = \" + power);\r\n\t\t// console.debug(\"\t  Glow = \" + glow);\r\n\t\t// console.debug(\"\t  isTotalPower = \" + isTotalPower);\r\n\r\n\t\tvar valueNum = 0;\r\n\t\tif (plastic) valueNum += 1;\r\n\t\tif (roughness) valueNum += 1;\r\n\t\tif (specular) valueNum += 1;\r\n\t\tif (ior) valueNum += 1;\r\n\t\tif (attenuation) valueNum += 1;\r\n\t\tif (power) valueNum += 1;\r\n\t\tif (glow) valueNum += 1;\r\n\t\t// isTotalPower is no value\r\n\t\t\r\n\t\tvar values = [];\r\n\t\tfor (var j = 0; j < valueNum; j++) {\r\n\t\t\tvalues[j] = 0;\r\n\t\t\tfor (var i = 0; i < 4; i++) {\r\n\t\t\t\tvalues[j] += dataHolder.next() * Math.pow(256, i);\r\n\t\t\t}\r\n\t\t\t// console.debug(\"\tnormalized property value = \" + parseFloat(values[j]));\r\n\t\t}\r\n\t};\r\n\t\r\n\tvar parseFloat = function(bytes) {\r\n\t\tvar bin = bytes.toString(2);\r\n\t\twhile(bin.length < 32) {\r\n\t\t\tbin = \"0\" + bin;\r\n\t\t}\r\n\t\tvar sign = bin[0] == \"0\" ? 1 : -1;\r\n\t\tvar exponent = Number.parseInt(bin.substring(1, 9), 2) - 127;\r\n\t\tvar fraction = Number.parseFloat(\"1.\" + Number.parseInt(bin.substring(9), 2));\r\n\t\treturn sign * Math.pow(2, exponent) * fraction;\r\n\t};\r\n\r\n})();\r\n\r\n(function() {\r\n\r\n\t/**\r\n\t * @constructor\r\n\t *\r\n\t * @param {vox.VoxelData} voxelData\r\n\t * @param {Object=} param\r\n\t * @param {number=} param.voxelSize ボクセルの大きさ. default = 1.0.\r\n\t * @param {boolean=} param.vertexColor 頂点色を使用する. default = false.\r\n\t * @param {boolean=} param.optimizeFaces 隠れた頂点／面を削除する. dafalue = true.\r\n\t * @param {boolean=} param.originToBottom 地面の高さを形状の中心にする. dafalue = true.\r\n\t * @property {THREE.Geometry} geometry\r\n\t * @property {THREE.Material} material\r\n\t */\r\n\tvox.MeshBuilder = function(voxelData, param) {\r\n\t\tif (vox.MeshBuilder.textureFactory === null) vox.MeshBuilder.textureFactory = new vox.TextureFactory();\r\n\t\t\r\n\t\tparam = param || {};\r\n\t\tthis.voxelData = voxelData;\r\n\t\tthis.voxelSize = param.voxelSize || vox.MeshBuilder.DEFAULT_PARAM.voxelSize;\r\n\t\tthis.vertexColor = (param.vertexColor === undefined) ? vox.MeshBuilder.DEFAULT_PARAM.vertexColor : param.vertexColor;\r\n\t\tthis.optimizeFaces = (param.optimizeFaces === undefined) ? vox.MeshBuilder.DEFAULT_PARAM.optimizeFaces : param.optimizeFaces;\r\n\t\tthis.originToBottom = (param.originToBottom === undefined) ? vox.MeshBuilder.DEFAULT_PARAM.originToBottom : param.originToBottom;\r\n\r\n\t\tthis.geometry = null;\r\n\t\tthis.material = null;\r\n\t\t\r\n\t\tthis.build();\r\n\t};\r\n\r\n\tvox.MeshBuilder.DEFAULT_PARAM = {\r\n\t\tvoxelSize: 1.0,\r\n\t\tvertexColor: false,\r\n\t\toptimizeFaces: true,\r\n\t\toriginToBottom: true,\r\n\t};\r\n\r\n\t/**\r\n\t * Voxelデータからジオメトリとマテリアルを作成する.\r\n\t */\r\n\tvox.MeshBuilder.prototype.build = function() {\r\n\t\tthis.geometry = new THREE.Geometry();\r\n\t\tthis.material = new THREE.MeshPhongMaterial();\r\n\r\n\t\t// 隣接ボクセル検索用ハッシュテーブル\r\n\t\tthis.hashTable = createHashTable(this.voxelData.voxels);\r\n\t\t\r\n\t\tvar offsetX = (this.voxelData.size.x - 1) * -0.5;\r\n\t\tvar offsetY = (this.voxelData.size.y - 1) * -0.5;\r\n\t\tvar offsetZ = (this.originToBottom) ? 0 : (this.voxelData.size.z - 1) * -0.5;\r\n\t\tvar matrix = new THREE.Matrix4();\r\n\t\tthis.voxelData.voxels.forEach(function(voxel) {\r\n\t\t\tvar voxGeometry = this._createVoxGeometry(voxel);\r\n\t\t\tif (voxGeometry) {\r\n\t\t\t\tmatrix.makeTranslation((voxel.x + offsetX) * this.voxelSize, (voxel.z + offsetZ) * this.voxelSize, -(voxel.y + offsetY) * this.voxelSize);\r\n\t\t\t\tthis.geometry.merge(voxGeometry, matrix);\r\n\t\t\t}\r\n\t\t}.bind(this));\r\n\r\n\t\tif (this.optimizeFaces) {\r\n\t\t\tthis.geometry.mergeVertices();\r\n\t\t}\r\n\t\tthis.geometry.computeFaceNormals();\r\n\t\t\r\n\t\tif (this.vertexColor) {\r\n\t\t\tthis.material.vertexColors = THREE.FaceColors;\r\n\t\t} else {\r\n\t\t\tthis.material.map = vox.MeshBuilder.textureFactory.getTexture(this.voxelData);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @return {THREE.Texture}\r\n\t */\r\n\tvox.MeshBuilder.prototype.getTexture = function() {\r\n\t\treturn vox.MeshBuilder.textureFactory.getTexture(this.voxelData);\r\n\t};\r\n\r\n\tvox.MeshBuilder.prototype._createVoxGeometry = function(voxel) {\r\n\r\n\t\t// 隣接するボクセルを検索し、存在する場合は面を無視する\r\n\t\tvar ignoreFaces = [];\r\n\t\tif (this.optimizeFaces) {\r\n\t\t\tsix.forEach(function(s) {\r\n\t\t\t\tif (this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z)) {\r\n\t\t\t\t\tignoreFaces.push(s.ignoreFace);\r\n\t\t\t\t}\r\n\t\t\t}.bind(this));\r\n\t\t}\r\n\t\t\r\n\t\t// 6方向すべて隣接されていたらnullを返す\r\n\t\tif (ignoreFaces.length ===  6) return null;\r\n\r\n\t\t// 頂点データ\r\n\t\tvar voxVertices = voxVerticesSource.map(function(voxel) {\r\n\t\t\treturn new THREE.Vector3(voxel.x * this.voxelSize * 0.5, voxel.y * this.voxelSize * 0.5, voxel.z * this.voxelSize * 0.5);\r\n\t\t}.bind(this));\r\n\r\n\t\t// 面データ\r\n\t\tvar voxFaces = voxFacesSource.map(function(f) {\r\n\t\t\treturn {\r\n\t\t\t\tfaceA: new THREE.Face3(f.faceA.a, f.faceA.b, f.faceA.c),\r\n\t\t\t\tfaceB: new THREE.Face3(f.faceB.a, f.faceB.b, f.faceB.c),\r\n\t\t\t};\r\n\t\t});\r\n\t\t\r\n\t\t// 頂点色\r\n\t\tif (this.vertexColor) {\r\n\t\t\tvar c = this.voxelData.palette[voxel.colorIndex];\r\n\t\t\tvar color = new THREE.Color(c.r / 255, c.g / 255, c.b / 255);\r\n\t\t}\r\n\r\n\t\tvar vox = new THREE.Geometry();\r\n\t\tvox.faceVertexUvs[0] = [];\r\n\t\t\r\n\t\t// 面を作る\r\n\t\tvoxFaces.forEach(function(faces, i) {\r\n\t\t\tif (ignoreFaces.indexOf(i) >= 0) return;\r\n\t\t\t\r\n\t\t\tif (this.vertexColor) {\r\n\t\t\t\tfaces.faceA.color = color;\r\n\t\t\t\tfaces.faceB.color = color;\r\n\t\t\t} else {\r\n\t\t\t\tvar uv = new THREE.Vector2((voxel.colorIndex + 0.5) / 256, 0.5);\r\n\t\t\t\tvox.faceVertexUvs[0].push([uv, uv, uv], [uv, uv, uv]);\r\n\t\t\t}\r\n\t\t\tvox.faces.push(faces.faceA, faces.faceB);\r\n\t\t}.bind(this));\r\n\t\t\r\n\t\t// 使っている頂点を抽出\r\n\t\tvar usingVertices = {};\r\n\t\tvox.faces.forEach(function(face) {\r\n\t\t\tusingVertices[face.a] = true;\r\n\t\t\tusingVertices[face.b] = true;\r\n\t\t\tusingVertices[face.c] = true;\r\n\t\t});\r\n\t\t\r\n\t\t// 面の頂点インデックスを詰める処理\r\n\t\tvar splice = function(index) {\r\n\t\t\tvox.faces.forEach(function(face) {\r\n\t\t\t\tif (face.a > index) face.a -= 1;\r\n\t\t\t\tif (face.b > index) face.b -= 1;\r\n\t\t\t\tif (face.c > index) face.c -= 1;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t// 使っている頂点のみ追加する\r\n\t\tvar j = 0;\r\n\t\tvoxVertices.forEach(function(vertex, i) {\r\n\t\t\tif (usingVertices[i]) {\r\n\t\t\t\tvox.vertices.push(vertex);\r\n\t\t\t} else {\r\n\t\t\t\tsplice(i - j);\r\n\t\t\t\tj += 1;\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\treturn vox;\r\n\t};\r\n\r\n\t/**\r\n\t * @return {THREE.Mesh}\r\n\t */\r\n\tvox.MeshBuilder.prototype.createMesh = function() {\r\n\t\treturn new THREE.Mesh(this.geometry, this.material);\r\n\t};\r\n\t\r\n\t/**\r\n\t * 外側に面したボクセルか\r\n\t * @return {boolean}\r\n\t */\r\n\tvox.MeshBuilder.prototype.isOuterVoxel = function(voxel) {\r\n\t\treturn six.filter(function(s) {\r\n\t\t\treturn this.hashTable.has(voxel.x + s.x, voxel.y + s.y, voxel.z + s.z);\r\n\t\t}.bind(this)).length < 6;\r\n\t};\r\n\r\n\t/**\r\n\t * @static\r\n\t * @type {vox.TextureFactory}\r\n\t */\r\n\tvox.MeshBuilder.textureFactory = null;\r\n\r\n\t// 隣接方向と無視する面の対応表\r\n\tvar six = [\r\n\t\t{ x: -1, y: 0, z: 0, ignoreFace: 0 },\r\n\t\t{ x:  1, y: 0, z: 0, ignoreFace: 1 },\r\n\t\t{ x:  0, y:-1, z: 0, ignoreFace: 5 },\r\n\t\t{ x:  0, y: 1, z: 0, ignoreFace: 4 },\r\n\t\t{ x:  0, y: 0, z:-1, ignoreFace: 2 },\r\n\t\t{ x:  0, y: 0, z: 1, ignoreFace: 3 },\r\n\t];\r\n\r\n\t// 頂点データソース\r\n\tvar voxVerticesSource = [\r\n\t\t{ x: -1, y: 1, z:-1 },\r\n\t\t{ x:  1, y: 1, z:-1 },\r\n\t\t{ x: -1, y: 1, z: 1 },\r\n\t\t{ x:  1, y: 1, z: 1 },\r\n\t\t{ x: -1, y:-1, z:-1 },\r\n\t\t{ x:  1, y:-1, z:-1 },\r\n\t\t{ x: -1, y:-1, z: 1 },\r\n\t\t{ x:  1, y:-1, z: 1 },\r\n\t];\r\n\r\n\t// 面データソース\r\n\tvar voxFacesSource = [\r\n\t\t{ faceA: { a:6, b:2, c:0 }, faceB: { a:6, b:0, c:4 } },\r\n\t\t{ faceA: { a:5, b:1, c:3 }, faceB: { a:5, b:3, c:7 } },\r\n\t\t{ faceA: { a:5, b:7, c:6 }, faceB: { a:5, b:6, c:4 } },\r\n\t\t{ faceA: { a:2, b:3, c:1 }, faceB: { a:2, b:1, c:0 } },\r\n\t\t{ faceA: { a:4, b:0, c:1 }, faceB: { a:4, b:1, c:5 } },\r\n\t\t{ faceA: { a:7, b:3, c:2 }, faceB: { a:7, b:2, c:6 } },\r\n\t];\r\n\r\n\tvar hash = function(x, y, z) {\r\n\t\treturn \"x\" + x + \"y\" + y + \"z\" + z;\r\n\t};\r\n\r\n\tvar createHashTable = function(voxels) {\r\n\t\tvar hashTable = {};\r\n\t\tvoxels.forEach(function(v) {\r\n\t\t\thashTable[hash(v.x, v.y, v.z)] = true;\r\n\t\t});\r\n\t\t\r\n\t\thashTable.has = function(x, y, z) {\r\n\t\t\treturn hash(x, y, z) in this;\r\n\t\t}\r\n\t\treturn hashTable;\r\n\t};\r\n\r\n})();\r\n\r\n(function() {\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tvox.TextureFactory = function() {};\r\n\r\n\t/**\r\n\t * @param {vox.VoxelData} voxelData\r\n\t * @return {HTMLCanvasElement}\r\n\t */\r\n\tvox.TextureFactory.prototype.createCanvas = function(voxelData) {\r\n\t\tvar canvas = document.createElement(\"canvas\");\r\n\t\tcanvas.width = 256;\r\n\t\tcanvas.height= 1;\r\n\t\tvar context = canvas.getContext(\"2d\");\r\n\t\tfor (var i = 0, len = voxelData.palette.length; i < len; i++) {\r\n\t\t\tvar p = voxelData.palette[i];\r\n\t\t\tcontext.fillStyle = \"rgb(\" + p.r + \",\" + p.g + \",\" + p.b + \")\";\r\n\t\t\tcontext.fillRect(i * 1, 0, 1, 1);\r\n\t\t}\r\n\t\t\r\n\t\treturn canvas;\r\n\t};\r\n\t\r\n\t/**\r\n\t * パレット情報を元に作成したテクスチャを返す.\r\n\t * 生成されたテクスチャはキャッシュされ、同一のパレットからは同じテクスチャオブジェクトが返される.\r\n\t * @param {vox.VoxelData} voxelData\r\n\t * @return {THREE.Texture}\r\n\t */\r\n\tvox.TextureFactory.prototype.getTexture = function(voxelData) {\r\n\t\tvar palette = voxelData.palette;\r\n\t\tvar hashCode = getHashCode(palette);\r\n\t\tif (hashCode in cache) {\r\n\t\t\t// console.log(\"cache hit\");\r\n\t\t\treturn cache[hashCode];\r\n\t\t}\r\n\t\t\r\n\t\tvar canvas = this.createCanvas(voxelData);\r\n\t\tvar texture = new THREE.Texture(canvas);\r\n\t\ttexture.needsUpdate = true;\r\n\t\t\r\n\t\tcache[hashCode] = texture;\r\n\t\t\r\n\t\treturn texture;\r\n\t};\r\n\t\r\n\tvar cache = {};\r\n\t\r\n\tvar getHashCode = function(palette) {\r\n\t\tvar str = \"\";\r\n\t\tfor (var i = 0; i < 256; i++) {\r\n\t\t\tvar p = palette[i];\r\n\t\t\tstr += hex(p.r);\r\n\t\t\tstr += hex(p.g);\r\n\t\t\tstr += hex(p.b);\r\n\t\t\tstr += hex(p.a);\r\n\t\t}\r\n\t\treturn vox.md5(str);\r\n\t};\r\n\tvar hex = function(num) {\r\n\t\tvar r = num.toString(16);\r\n\t\treturn (r.length === 1) ? \"0\" + r : r;\r\n\t};\r\n\r\n})();\r\n\r\n(function() {\r\n\r\n\t/**\r\n\t * MagicaVoxelのデフォルトパレット\r\n\t * @static\r\n\t */\t\r\n\tvox.defaultPalette = [\r\n\t\t{r:255,g:255,b:255,a:255},\r\n\t\t{r:255,g:255,b:255,a:255},\r\n\t\t{r:255,g:255,b:204,a:255},\r\n\t\t{r:255,g:255,b:153,a:255},\r\n\t\t{r:255,g:255,b:102,a:255},\r\n\t\t{r:255,g:255,b:51,a:255},\r\n\t\t{r:255,g:255,b:0,a:255},\r\n\t\t{r:255,g:204,b:255,a:255},\r\n\t\t{r:255,g:204,b:204,a:255},\r\n\t\t{r:255,g:204,b:153,a:255},\r\n\t\t{r:255,g:204,b:102,a:255},\r\n\t\t{r:255,g:204,b:51,a:255},\r\n\t\t{r:255,g:204,b:0,a:255},\r\n\t\t{r:255,g:153,b:255,a:255},\r\n\t\t{r:255,g:153,b:204,a:255},\r\n\t\t{r:255,g:153,b:153,a:255},\r\n\t\t{r:255,g:153,b:102,a:255},\r\n\t\t{r:255,g:153,b:51,a:255},\r\n\t\t{r:255,g:153,b:0,a:255},\r\n\t\t{r:255,g:102,b:255,a:255},\r\n\t\t{r:255,g:102,b:204,a:255},\r\n\t\t{r:255,g:102,b:153,a:255},\r\n\t\t{r:255,g:102,b:102,a:255},\r\n\t\t{r:255,g:102,b:51,a:255},\r\n\t\t{r:255,g:102,b:0,a:255},\r\n\t\t{r:255,g:51,b:255,a:255},\r\n\t\t{r:255,g:51,b:204,a:255},\r\n\t\t{r:255,g:51,b:153,a:255},\r\n\t\t{r:255,g:51,b:102,a:255},\r\n\t\t{r:255,g:51,b:51,a:255},\r\n\t\t{r:255,g:51,b:0,a:255},\r\n\t\t{r:255,g:0,b:255,a:255},\r\n\t\t{r:255,g:0,b:204,a:255},\r\n\t\t{r:255,g:0,b:153,a:255},\r\n\t\t{r:255,g:0,b:102,a:255},\r\n\t\t{r:255,g:0,b:51,a:255},\r\n\t\t{r:255,g:0,b:0,a:255},\r\n\t\t{r:204,g:255,b:255,a:255},\r\n\t\t{r:204,g:255,b:204,a:255},\r\n\t\t{r:204,g:255,b:153,a:255},\r\n\t\t{r:204,g:255,b:102,a:255},\r\n\t\t{r:204,g:255,b:51,a:255},\r\n\t\t{r:204,g:255,b:0,a:255},\r\n\t\t{r:204,g:204,b:255,a:255},\r\n\t\t{r:204,g:204,b:204,a:255},\r\n\t\t{r:204,g:204,b:153,a:255},\r\n\t\t{r:204,g:204,b:102,a:255},\r\n\t\t{r:204,g:204,b:51,a:255},\r\n\t\t{r:204,g:204,b:0,a:255},\r\n\t\t{r:204,g:153,b:255,a:255},\r\n\t\t{r:204,g:153,b:204,a:255},\r\n\t\t{r:204,g:153,b:153,a:255},\r\n\t\t{r:204,g:153,b:102,a:255},\r\n\t\t{r:204,g:153,b:51,a:255},\r\n\t\t{r:204,g:153,b:0,a:255},\r\n\t\t{r:204,g:102,b:255,a:255},\r\n\t\t{r:204,g:102,b:204,a:255},\r\n\t\t{r:204,g:102,b:153,a:255},\r\n\t\t{r:204,g:102,b:102,a:255},\r\n\t\t{r:204,g:102,b:51,a:255},\r\n\t\t{r:204,g:102,b:0,a:255},\r\n\t\t{r:204,g:51,b:255,a:255},\r\n\t\t{r:204,g:51,b:204,a:255},\r\n\t\t{r:204,g:51,b:153,a:255},\r\n\t\t{r:204,g:51,b:102,a:255},\r\n\t\t{r:204,g:51,b:51,a:255},\r\n\t\t{r:204,g:51,b:0,a:255},\r\n\t\t{r:204,g:0,b:255,a:255},\r\n\t\t{r:204,g:0,b:204,a:255},\r\n\t\t{r:204,g:0,b:153,a:255},\r\n\t\t{r:204,g:0,b:102,a:255},\r\n\t\t{r:204,g:0,b:51,a:255},\r\n\t\t{r:204,g:0,b:0,a:255},\r\n\t\t{r:153,g:255,b:255,a:255},\r\n\t\t{r:153,g:255,b:204,a:255},\r\n\t\t{r:153,g:255,b:153,a:255},\r\n\t\t{r:153,g:255,b:102,a:255},\r\n\t\t{r:153,g:255,b:51,a:255},\r\n\t\t{r:153,g:255,b:0,a:255},\r\n\t\t{r:153,g:204,b:255,a:255},\r\n\t\t{r:153,g:204,b:204,a:255},\r\n\t\t{r:153,g:204,b:153,a:255},\r\n\t\t{r:153,g:204,b:102,a:255},\r\n\t\t{r:153,g:204,b:51,a:255},\r\n\t\t{r:153,g:204,b:0,a:255},\r\n\t\t{r:153,g:153,b:255,a:255},\r\n\t\t{r:153,g:153,b:204,a:255},\r\n\t\t{r:153,g:153,b:153,a:255},\r\n\t\t{r:153,g:153,b:102,a:255},\r\n\t\t{r:153,g:153,b:51,a:255},\r\n\t\t{r:153,g:153,b:0,a:255},\r\n\t\t{r:153,g:102,b:255,a:255},\r\n\t\t{r:153,g:102,b:204,a:255},\r\n\t\t{r:153,g:102,b:153,a:255},\r\n\t\t{r:153,g:102,b:102,a:255},\r\n\t\t{r:153,g:102,b:51,a:255},\r\n\t\t{r:153,g:102,b:0,a:255},\r\n\t\t{r:153,g:51,b:255,a:255},\r\n\t\t{r:153,g:51,b:204,a:255},\r\n\t\t{r:153,g:51,b:153,a:255},\r\n\t\t{r:153,g:51,b:102,a:255},\r\n\t\t{r:153,g:51,b:51,a:255},\r\n\t\t{r:153,g:51,b:0,a:255},\r\n\t\t{r:153,g:0,b:255,a:255},\r\n\t\t{r:153,g:0,b:204,a:255},\r\n\t\t{r:153,g:0,b:153,a:255},\r\n\t\t{r:153,g:0,b:102,a:255},\r\n\t\t{r:153,g:0,b:51,a:255},\r\n\t\t{r:153,g:0,b:0,a:255},\r\n\t\t{r:102,g:255,b:255,a:255},\r\n\t\t{r:102,g:255,b:204,a:255},\r\n\t\t{r:102,g:255,b:153,a:255},\r\n\t\t{r:102,g:255,b:102,a:255},\r\n\t\t{r:102,g:255,b:51,a:255},\r\n\t\t{r:102,g:255,b:0,a:255},\r\n\t\t{r:102,g:204,b:255,a:255},\r\n\t\t{r:102,g:204,b:204,a:255},\r\n\t\t{r:102,g:204,b:153,a:255},\r\n\t\t{r:102,g:204,b:102,a:255},\r\n\t\t{r:102,g:204,b:51,a:255},\r\n\t\t{r:102,g:204,b:0,a:255},\r\n\t\t{r:102,g:153,b:255,a:255},\r\n\t\t{r:102,g:153,b:204,a:255},\r\n\t\t{r:102,g:153,b:153,a:255},\r\n\t\t{r:102,g:153,b:102,a:255},\r\n\t\t{r:102,g:153,b:51,a:255},\r\n\t\t{r:102,g:153,b:0,a:255},\r\n\t\t{r:102,g:102,b:255,a:255},\r\n\t\t{r:102,g:102,b:204,a:255},\r\n\t\t{r:102,g:102,b:153,a:255},\r\n\t\t{r:102,g:102,b:102,a:255},\r\n\t\t{r:102,g:102,b:51,a:255},\r\n\t\t{r:102,g:102,b:0,a:255},\r\n\t\t{r:102,g:51,b:255,a:255},\r\n\t\t{r:102,g:51,b:204,a:255},\r\n\t\t{r:102,g:51,b:153,a:255},\r\n\t\t{r:102,g:51,b:102,a:255},\r\n\t\t{r:102,g:51,b:51,a:255},\r\n\t\t{r:102,g:51,b:0,a:255},\r\n\t\t{r:102,g:0,b:255,a:255},\r\n\t\t{r:102,g:0,b:204,a:255},\r\n\t\t{r:102,g:0,b:153,a:255},\r\n\t\t{r:102,g:0,b:102,a:255},\r\n\t\t{r:102,g:0,b:51,a:255},\r\n\t\t{r:102,g:0,b:0,a:255},\r\n\t\t{r:51,g:255,b:255,a:255},\r\n\t\t{r:51,g:255,b:204,a:255},\r\n\t\t{r:51,g:255,b:153,a:255},\r\n\t\t{r:51,g:255,b:102,a:255},\r\n\t\t{r:51,g:255,b:51,a:255},\r\n\t\t{r:51,g:255,b:0,a:255},\r\n\t\t{r:51,g:204,b:255,a:255},\r\n\t\t{r:51,g:204,b:204,a:255},\r\n\t\t{r:51,g:204,b:153,a:255},\r\n\t\t{r:51,g:204,b:102,a:255},\r\n\t\t{r:51,g:204,b:51,a:255},\r\n\t\t{r:51,g:204,b:0,a:255},\r\n\t\t{r:51,g:153,b:255,a:255},\r\n\t\t{r:51,g:153,b:204,a:255},\r\n\t\t{r:51,g:153,b:153,a:255},\r\n\t\t{r:51,g:153,b:102,a:255},\r\n\t\t{r:51,g:153,b:51,a:255},\r\n\t\t{r:51,g:153,b:0,a:255},\r\n\t\t{r:51,g:102,b:255,a:255},\r\n\t\t{r:51,g:102,b:204,a:255},\r\n\t\t{r:51,g:102,b:153,a:255},\r\n\t\t{r:51,g:102,b:102,a:255},\r\n\t\t{r:51,g:102,b:51,a:255},\r\n\t\t{r:51,g:102,b:0,a:255},\r\n\t\t{r:51,g:51,b:255,a:255},\r\n\t\t{r:51,g:51,b:204,a:255},\r\n\t\t{r:51,g:51,b:153,a:255},\r\n\t\t{r:51,g:51,b:102,a:255},\r\n\t\t{r:51,g:51,b:51,a:255},\r\n\t\t{r:51,g:51,b:0,a:255},\r\n\t\t{r:51,g:0,b:255,a:255},\r\n\t\t{r:51,g:0,b:204,a:255},\r\n\t\t{r:51,g:0,b:153,a:255},\r\n\t\t{r:51,g:0,b:102,a:255},\r\n\t\t{r:51,g:0,b:51,a:255},\r\n\t\t{r:51,g:0,b:0,a:255},\r\n\t\t{r:0,g:255,b:255,a:255},\r\n\t\t{r:0,g:255,b:204,a:255},\r\n\t\t{r:0,g:255,b:153,a:255},\r\n\t\t{r:0,g:255,b:102,a:255},\r\n\t\t{r:0,g:255,b:51,a:255},\r\n\t\t{r:0,g:255,b:0,a:255},\r\n\t\t{r:0,g:204,b:255,a:255},\r\n\t\t{r:0,g:204,b:204,a:255},\r\n\t\t{r:0,g:204,b:153,a:255},\r\n\t\t{r:0,g:204,b:102,a:255},\r\n\t\t{r:0,g:204,b:51,a:255},\r\n\t\t{r:0,g:204,b:0,a:255},\r\n\t\t{r:0,g:153,b:255,a:255},\r\n\t\t{r:0,g:153,b:204,a:255},\r\n\t\t{r:0,g:153,b:153,a:255},\r\n\t\t{r:0,g:153,b:102,a:255},\r\n\t\t{r:0,g:153,b:51,a:255},\r\n\t\t{r:0,g:153,b:0,a:255},\r\n\t\t{r:0,g:102,b:255,a:255},\r\n\t\t{r:0,g:102,b:204,a:255},\r\n\t\t{r:0,g:102,b:153,a:255},\r\n\t\t{r:0,g:102,b:102,a:255},\r\n\t\t{r:0,g:102,b:51,a:255},\r\n\t\t{r:0,g:102,b:0,a:255},\r\n\t\t{r:0,g:51,b:255,a:255},\r\n\t\t{r:0,g:51,b:204,a:255},\r\n\t\t{r:0,g:51,b:153,a:255},\r\n\t\t{r:0,g:51,b:102,a:255},\r\n\t\t{r:0,g:51,b:51,a:255},\r\n\t\t{r:0,g:51,b:0,a:255},\r\n\t\t{r:0,g:0,b:255,a:255},\r\n\t\t{r:0,g:0,b:204,a:255},\r\n\t\t{r:0,g:0,b:153,a:255},\r\n\t\t{r:0,g:0,b:102,a:255},\r\n\t\t{r:0,g:0,b:51,a:255},\r\n\t\t{r:238,g:0,b:0,a:255},\r\n\t\t{r:221,g:0,b:0,a:255},\r\n\t\t{r:187,g:0,b:0,a:255},\r\n\t\t{r:170,g:0,b:0,a:255},\r\n\t\t{r:136,g:0,b:0,a:255},\r\n\t\t{r:119,g:0,b:0,a:255},\r\n\t\t{r:85,g:0,b:0,a:255},\r\n\t\t{r:68,g:0,b:0,a:255},\r\n\t\t{r:34,g:0,b:0,a:255},\r\n\t\t{r:17,g:0,b:0,a:255},\r\n\t\t{r:0,g:238,b:0,a:255},\r\n\t\t{r:0,g:221,b:0,a:255},\r\n\t\t{r:0,g:187,b:0,a:255},\r\n\t\t{r:0,g:170,b:0,a:255},\r\n\t\t{r:0,g:136,b:0,a:255},\r\n\t\t{r:0,g:119,b:0,a:255},\r\n\t\t{r:0,g:85,b:0,a:255},\r\n\t\t{r:0,g:68,b:0,a:255},\r\n\t\t{r:0,g:34,b:0,a:255},\r\n\t\t{r:0,g:17,b:0,a:255},\r\n\t\t{r:0,g:0,b:238,a:255},\r\n\t\t{r:0,g:0,b:221,a:255},\r\n\t\t{r:0,g:0,b:187,a:255},\r\n\t\t{r:0,g:0,b:170,a:255},\r\n\t\t{r:0,g:0,b:136,a:255},\r\n\t\t{r:0,g:0,b:119,a:255},\r\n\t\t{r:0,g:0,b:85,a:255},\r\n\t\t{r:0,g:0,b:68,a:255},\r\n\t\t{r:0,g:0,b:34,a:255},\r\n\t\t{r:0,g:0,b:17,a:255},\r\n\r\n\t\t{r:238,g:238,b:238,a:255},\r\n\r\n\t\t{r:221,g:221,b:221,a:255},\r\n\t\t{r:187,g:187,b:187,a:255},\r\n\t\t{r:170,g:170,b:170,a:255},\r\n\t\t{r:136,g:136,b:136,a:255},\r\n\t\t{r:119,g:119,b:119,a:255},\r\n\t\t{r:85,g:85,b:85,a:255},\r\n\t\t{r:68,g:68,b:68,a:255},\r\n\t\t{r:34,g:34,b:34,a:255},\r\n\t\t{r:17,g:17,b:17,a:255},\r\n\t\t// {r:0,g:0,b:0,a:255},\r\n\t];\r\n\t\r\n})();\r\n\r\n(function() {\r\n\r\n\r\n\r\n/* md5.js - MD5 Message-Digest\r\n * Copyright (C) 1999,2002 Masanao Izumo <iz@onicos.co.jp>\r\n * Version: 2.0.0\r\n * LastModified: May 13 2002\r\n *\r\n * This program is free software.  You can redistribute it and/or modify\r\n * it without any warranty.  This library calculates the MD5 based on RFC1321.\r\n * See RFC1321 for more information and algorism.\r\n */\r\n\r\n/* Interface:\r\n * md5_128bits = MD5_hash(data);\r\n * md5_hexstr = MD5_hexhash(data);\r\n */\r\n\r\n/* ChangeLog\r\n * 2002/05/13: Version 2.0.0 released\r\n * NOTICE: API is changed.\r\n * 2002/04/15: Bug fix about MD5 length.\r\n */\r\n\r\n\r\n//\tmd5_T[i] = parseInt(Math.abs(Math.sin(i)) * 4294967296.0);\r\nvar MD5_T = new Array(0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db,\r\n\t\t\t  0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,\r\n\t\t\t  0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1,\r\n\t\t\t  0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,\r\n\t\t\t  0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51,\r\n\t\t\t  0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681,\r\n\t\t\t  0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87,\r\n\t\t\t  0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9,\r\n\t\t\t  0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,\r\n\t\t\t  0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60,\r\n\t\t\t  0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085,\r\n\t\t\t  0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8,\r\n\t\t\t  0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7,\r\n\t\t\t  0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,\r\n\t\t\t  0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314,\r\n\t\t\t  0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,\r\n\t\t\t  0xeb86d391);\r\n\r\nvar MD5_round1 = new Array(new Array( 0, 7, 1), new Array( 1,12, 2),\r\n\t\t\t   new Array( 2,17, 3), new Array( 3,22, 4),\r\n\t\t\t   new Array( 4, 7, 5), new Array( 5,12, 6),\r\n\t\t\t   new Array( 6,17, 7), new Array( 7,22, 8),\r\n\t\t\t   new Array( 8, 7, 9), new Array( 9,12,10),\r\n\t\t\t   new Array(10,17,11), new Array(11,22,12),\r\n\t\t\t   new Array(12, 7,13), new Array(13,12,14),\r\n\t\t\t   new Array(14,17,15), new Array(15,22,16));\r\n\r\nvar MD5_round2 = new Array(new Array( 1, 5,17), new Array( 6, 9,18),\r\n\t\t\t   new Array(11,14,19), new Array( 0,20,20),\r\n\t\t\t   new Array( 5, 5,21), new Array(10, 9,22),\r\n\t\t\t   new Array(15,14,23), new Array( 4,20,24),\r\n\t\t\t   new Array( 9, 5,25), new Array(14, 9,26),\r\n\t\t\t   new Array( 3,14,27), new Array( 8,20,28),\r\n\t\t\t   new Array(13, 5,29), new Array( 2, 9,30),\r\n\t\t\t   new Array( 7,14,31), new Array(12,20,32));\r\n\r\nvar MD5_round3 = new Array(new Array( 5, 4,33), new Array( 8,11,34),\r\n\t\t\t   new Array(11,16,35), new Array(14,23,36),\r\n\t\t\t   new Array( 1, 4,37), new Array( 4,11,38),\r\n\t\t\t   new Array( 7,16,39), new Array(10,23,40),\r\n\t\t\t   new Array(13, 4,41), new Array( 0,11,42),\r\n\t\t\t   new Array( 3,16,43), new Array( 6,23,44),\r\n\t\t\t   new Array( 9, 4,45), new Array(12,11,46),\r\n\t\t\t   new Array(15,16,47), new Array( 2,23,48));\r\n\r\nvar MD5_round4 = new Array(new Array( 0, 6,49), new Array( 7,10,50),\r\n\t\t\t   new Array(14,15,51), new Array( 5,21,52),\r\n\t\t\t   new Array(12, 6,53), new Array( 3,10,54),\r\n\t\t\t   new Array(10,15,55), new Array( 1,21,56),\r\n\t\t\t   new Array( 8, 6,57), new Array(15,10,58),\r\n\t\t\t   new Array( 6,15,59), new Array(13,21,60),\r\n\t\t\t   new Array( 4, 6,61), new Array(11,10,62),\r\n\t\t\t   new Array( 2,15,63), new Array( 9,21,64));\r\n\r\nfunction MD5_F(x, y, z) { return (x & y) | (~x & z); }\r\nfunction MD5_G(x, y, z) { return (x & z) | (y & ~z); }\r\nfunction MD5_H(x, y, z) { return x ^ y ^ z;\t\t  }\r\nfunction MD5_I(x, y, z) { return y ^ (x | ~z);\t   }\r\n\r\nvar MD5_round = new Array(new Array(MD5_F, MD5_round1),\r\n\t\t\t  new Array(MD5_G, MD5_round2),\r\n\t\t\t  new Array(MD5_H, MD5_round3),\r\n\t\t\t  new Array(MD5_I, MD5_round4));\r\n\r\nfunction MD5_pack(n32) {\r\n  return String.fromCharCode(n32 & 0xff) +\r\n\t String.fromCharCode((n32 >>> 8) & 0xff) +\r\n\t String.fromCharCode((n32 >>> 16) & 0xff) +\r\n\t String.fromCharCode((n32 >>> 24) & 0xff);\r\n}\r\n\r\nfunction MD5_unpack(s4) {\r\n  return  s4.charCodeAt(0)\t\t|\r\n\t (s4.charCodeAt(1) <<  8) |\r\n\t (s4.charCodeAt(2) << 16) |\r\n\t (s4.charCodeAt(3) << 24);\r\n}\r\n\r\nfunction MD5_number(n) {\r\n  while (n < 0)\r\n\tn += 4294967296;\r\n  while (n > 4294967295)\r\n\tn -= 4294967296;\r\n  return n;\r\n}\r\n\r\nfunction MD5_apply_round(x, s, f, abcd, r) {\r\n  var a, b, c, d;\r\n  var kk, ss, ii;\r\n  var t, u;\r\n\r\n  a = abcd[0];\r\n  b = abcd[1];\r\n  c = abcd[2];\r\n  d = abcd[3];\r\n  kk = r[0];\r\n  ss = r[1];\r\n  ii = r[2];\r\n\r\n  u = f(s[b], s[c], s[d]);\r\n  t = s[a] + u + x[kk] + MD5_T[ii];\r\n  t = MD5_number(t);\r\n  t = ((t<<ss) | (t>>>(32-ss)));\r\n  t += s[b];\r\n  s[a] = MD5_number(t);\r\n}\r\n\r\nfunction MD5_hash(data) {\r\n  var abcd, x, state, s;\r\n  var len, index, padLen, f, r;\r\n  var i, j, k;\r\n  var tmp;\r\n\r\n  state = new Array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476);\r\n  len = data.length;\r\n  index = len & 0x3f;\r\n  padLen = (index < 56) ? (56 - index) : (120 - index);\r\n  if(padLen > 0) {\r\n\tdata += \"\\x80\";\r\n\tfor(i = 0; i < padLen - 1; i++)\r\n\t  data += \"\\x00\";\r\n  }\r\n  data += MD5_pack(len * 8);\r\n  data += MD5_pack(0);\r\n  len  += padLen + 8;\r\n  abcd = new Array(0, 1, 2, 3);\r\n  x\t= new Array(16);\r\n  s\t= new Array(4);\r\n\r\n  for(k = 0; k < len; k += 64) {\r\n\tfor(i = 0, j = k; i < 16; i++, j += 4) {\r\n\t  x[i] = data.charCodeAt(j) |\r\n\t\t(data.charCodeAt(j + 1) <<  8) |\r\n\t\t(data.charCodeAt(j + 2) << 16) |\r\n\t\t(data.charCodeAt(j + 3) << 24);\r\n\t}\r\n\tfor(i = 0; i < 4; i++)\r\n\t  s[i] = state[i];\r\n\tfor(i = 0; i < 4; i++) {\r\n\t  f = MD5_round[i][0];\r\n\t  r = MD5_round[i][1];\r\n\t  for(j = 0; j < 16; j++) {\r\n\tMD5_apply_round(x, s, f, abcd, r[j]);\r\n\ttmp = abcd[0];\r\n\tabcd[0] = abcd[3];\r\n\tabcd[3] = abcd[2];\r\n\tabcd[2] = abcd[1];\r\n\tabcd[1] = tmp;\r\n\t  }\r\n\t}\r\n\r\n\tfor(i = 0; i < 4; i++) {\r\n\t  state[i] += s[i];\r\n\t  state[i] = MD5_number(state[i]);\r\n\t}\r\n  }\r\n\r\n  return MD5_pack(state[0]) +\r\n\t MD5_pack(state[1]) +\r\n\t MD5_pack(state[2]) +\r\n\t MD5_pack(state[3]);\r\n}\r\n\r\nfunction MD5_hexhash(data) {\r\n\tvar i, out, c;\r\n\tvar bit128;\r\n\r\n\tbit128 = MD5_hash(data);\r\n\tout = \"\";\r\n\tfor(i = 0; i < 16; i++) {\r\n\tc = bit128.charCodeAt(i);\r\n\tout += \"0123456789abcdef\".charAt((c>>4) & 0xf);\r\n\tout += \"0123456789abcdef\".charAt(c & 0xf);\r\n\t}\r\n\treturn out;\r\n}\r\n\r\nvox.mainParser = new vox.Parser()\r\n\r\nvox.md5 = MD5_hexhash;\r\n})();\r\n})();\r\n"
  },
  {
    "path": "plugins/voxel_shape_fabric_generator.js",
    "content": "(function () {\r\n  var menuButton;\r\n\r\n  //Credits to Spectre0987\r\n\r\n  Plugin.register(\"voxel_shape_fabric_generator\", {\r\n    title: \"VoxelShape Fabric Generator\",\r\n    author: \"CyberStefNef\",\r\n    description: \"Generates Voxel Shapes for Fabric\",\r\n    icon: \"bar_chart\",\r\n    version: \"1.0.0\",\r\n    variant: \"both\",\r\n    tags: [\"Minecraft: Java Edition\"],\r\n    onload() {\r\n      menuButton = new Action(\"export_vs\", {\r\n        name: \"Export Voxel Shape for Fabric\",\r\n        description: \"Exports VoxelShape to Fabric Code\",\r\n        icon: \"fa-file-export\",\r\n        click: function () {\r\n          file = generateFabricFile(Format.centered_grid);\r\n          Blockbench.export({\r\n            type: \"Voxel Shape File\",\r\n            extensions: [\"java\", \"txt\"],\r\n            savetype: \"java\",\r\n            content: file,\r\n          });\r\n        },\r\n      });\r\n\r\n      MenuBar.addAction(menuButton, \"file.export\");\r\n    },\r\n    onunload() {\r\n      menuButton.delete();\r\n    },\r\n  });\r\n\r\n  function generateFabricFile(centered) {\r\n    var data = \"public static VoxelShape makeShape() {\\n\\treturn \";\r\n\r\n    if (Cube.all.length < 1) {\r\n      data += \"VoxelShapes.empty()\";\r\n    } else {\r\n      data += \"VoxelShapes.union(\\n\";\r\n      for (var i = 0; i < Cube.all.length; ++i) {\r\n        if (i > 0) data += \",\\n\";\r\n        const cube = Cube.all[i];\r\n        data += \"\\t\\tVoxelShapes.cuboid(\"\r\n            .concat(formatVec3(cube.from, centered))\r\n            .concat(\", \")\r\n            .concat(formatVec3(cube.to, centered))\r\n            .concat(\")\");\r\n      }\r\n      data += \"\\n\\t)\";\r\n    }\r\n\r\n    data += \";\\n}\";\r\n    return data;\r\n  }\r\n\r\n  function convertToBlockPercent(pixel) {\r\n    return pixel / 16.0;\r\n  }\r\n\r\n  function formatVec3(vector, centered) {\r\n    var offset = centered ? 0.5 : 0;\r\n    return \"\"\r\n      .concat(convertToBlockPercent(vector[0]) + offset)\r\n      .concat(\", \")\r\n      .concat(convertToBlockPercent(vector[1]))\r\n      .concat(\", \")\r\n      .concat(convertToBlockPercent(vector[2]) + offset);\r\n  }\r\n})();\r\n"
  },
  {
    "path": "plugins/voxel_shape_generator.js",
    "content": "\n(function(){\n\n    var menuButton;\n\n    Plugin.register('voxel_shape_generator', {\n        title: 'VoxelShape Generators',\n        author: 'Spectre0987, Nyfaria',\n        description: 'Generates Voxel Shapes (Supports MojMaps, MCP and Yarn)',\n        icon: 'bar_chart',\n        version: '0.2.0',\n        variant: 'both',\n        tags: [\"Minecraft: Java Edition\"],\n        onload(){\n            menuButton = new Action(\"export_vs\", {\n                name : 'Export Voxel Shape',\n                description : 'Exports VoxelShape to a mapping of your choice',\n                icon : 'fa-file-export',\n                click: function(){\n                    \n                    openMappingsBox();\n                    \n                }\n            });\n\n            MenuBar.addAction(menuButton, \"file.export\");\n        },\n        onunload(){\n            menuButton.delete();\n        }\n    });\n\n})();\n\nfunction openMappingsBox(){\n    new Dialog(\"select_mappings\", {\n        id: 'select_mappings',\n        title: 'Select Mappings',\n        form:{\n            mappings:{\n                label: 'Mappings',\n                type: 'select',\n                options: {\n                    momap: 'Mojang Mappings',\n                    mcp: 'MCP',\n                    yarn: 'Yarn'\n                }\n            }\n        },\n        onConfirm: function(form){\n\n            var file = \"\";\n\n            if(form.mappings === 'momap')\n                file = generateMomapFile(Format.centered_grid);\n            else if(form.mappings === 'mcp'){\n                file = generateMCPFile(Format.centered_grid);\n            } else if(form.mappings === 'yarn') {\n                file = generateYarnFile(Format.centered_grid);\n            }\n\n            this.hide();\n\n            Blockbench.export({\n                type : 'Voxel Shape File (.txt)',\n                extensions: ['txt'],\n                savetype: 'text',\n                content: file\n            });\n        }\n    })\n    .show();\n}\n\nfunction generateMomapFile(centered){\n    var data = \"public VoxelShape makeShape(){\\n\\tVoxelShape shape = Shapes.empty();\\n\";\n    for(var i = 0; i< Cube.all.length; ++i){\n        var cube = Cube.all[i];\n        \n        var from = cube.from;\n        var to = cube.to;\n\n        data += \"\\tshape = Shapes.join(shape, Shapes.box(\"\n            .concat(formatVec3(from, centered)).concat(\", \")\n            .concat(formatVec3(to, centered))\n            .concat(\"), BooleanOp.OR);\\n\");\n    }\n    data += \"\\n\\treturn shape;\\n}\";\n    return data;\n}\n\nfunction generateYarnFile(centered){\n    var data = \"public VoxelShape makeShape(){\\n\\tVoxelShape shape = VoxelShapes.empty();\\n\";\n    for(var i = 0; i< Cube.all.length; ++i){\n        var cube = Cube.all[i];\n        \n        var from = cube.from;\n        var to = cube.to;\n\n        data += \"\\tshape = VoxelShapes.combine(shape, VoxelShapes.cuboid(\"\n            .concat(formatVec3(from, centered)).concat(\", \")\n            .concat(formatVec3(to, centered))\n            .concat(\"), BooleanBiFunction.OR);\\n\");\n    }\n    data += \"\\n\\treturn shape;\\n}\";\n    return data;\n}\n\nfunction generateMCPFile(centered){\n    var data = \"public VoxelShape makeShape(){\\n\\tVoxelShape shape = VoxelShapes.empty();\\n\"\n\n    for(var i = 0; i < Cube.all.length; ++i){\n        var cube = Cube.all[i];\n\n        data += \"\\tshape = VoxelShapes.combineAndSimplify(shape, VoxelShapes.create(\"\n            .concat(formatVec3(cube.from, centered)).concat(\", \")\n            .concat(formatVec3(cube.to, centered))\n            .concat(\");\\n\");\n    }\n    data += \"\\n\\treturn shape;\\n}\"\n    return data;\n}\n\nfunction convertToBlockPercent(pixel){\n    return pixel / 16.0;\n}\n\nfunction formatVec3(vector, centered){\n    var offset = centered ? 0.5 : 0;\n    return \"\"\n        .concat(convertToBlockPercent(vector[0]) + offset).concat(\", \")\n        .concat(convertToBlockPercent(vector[1])).concat(\", \")\n        .concat(convertToBlockPercent(vector[2]) + offset);\n}\n"
  },
  {
    "path": "plugins/wasd_controls.js",
    "content": "let deletables = [];\nlet old_animate;\nlet rightMouseDown = false;\nlet interval;\n\nBBPlugin.register('wasd_controls', {\n\ttitle: 'WASD Controls',\n\ticon: 'sports_esports',\n\tauthor: 'JannisX11, caioraphael1',\n\tdescription: 'Adds a WASD controlled viewport navigation mode',\n\tabout: 'The WASD mode can be enabled from the View menu.\\nThe keys can be remapped in the keybindings menu.\\nThe sensitivity can be changed in the settings under Preview, along with the movement plane.\\nHold Control to move faster.',\n\tversion: '1.2.2',\n\tmin_version: '4.3.0',\n\tvariant: 'both',\n\tonload() {\n\t\tlet navigate_forward = new KeybindItem('navigate_forward', {\n\t\t\tname: 'Move Forward',\n\t\t\ticon: 'arrow_upward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'w', ctrl: null})\n\t\t});\n\t\tlet navigate_backward = new KeybindItem('navigate_backward', {\n\t\t\tname: 'Move Backward',\n\t\t\ticon: 'arrow_downward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 's', ctrl: null})\n\t\t});\n\t\tlet navigate_left = new KeybindItem('navigate_left', {\n\t\t\tname: 'Move Left',\n\t\t\ticon: 'arrow_back',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'a', ctrl: null})\n\t\t});\n\t\tlet navigate_right = new KeybindItem('navigate_right', {\n\t\t\tname: 'Move Right',\n\t\t\ticon: 'arrow_forward',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 'd', ctrl: null})\n\t\t});\n\t\tlet navigate_down = new KeybindItem('navigate_down', {\n\t\t\tname: 'Move Down',\n\t\t\ticon: 'expand_more',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 16, ctrl: null})\n\t\t});\n\t\tlet navigate_up = new KeybindItem('navigate_up', {\n\t\t\tname: 'Move Up',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 32, ctrl: null})\n\t\t});\n\n\t\tlet navigate_faster = new KeybindItem('navigate_faster', {\n\t\t\tname: 'Move Faster',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 17, ctrl: null})\n\t\t});\n\t\tlet navigate_slower = new KeybindItem('navigate_slower', {\n\t\t\tname: 'Move Slower',\n\t\t\ticon: 'expand_less',\n\t\t\tcategory: 'navigate',\n\t\t\tkeybind: new Keybind({key: 18, ctrl: null})\n\t\t});\n\n\n\t\tlet navigation_keybinds = [navigate_forward, navigate_backward, navigate_left, navigate_right, navigate_down, navigate_up, navigate_faster, navigate_slower];\n\t\tdeletables.push(...navigation_keybinds);\n\n\t\tfunction setupWASDMovement(preview, length = 1) {\n\t\t\tlet pos = new THREE.Vector3().copy(preview.camera.position);\n\t\t\tpos.add(preview.camera.getWorldDirection(new THREE.Vector3()).normalize().multiplyScalar(length));\n\t\t\tpreview.controls.target.copy(pos);\n\t\t}\n\n\t\tdeletables.push(new Setting('wasd_enabled', {\n\t\t\tname: 'WASD Enabled',\n\t\t\tdescription: '_',\n\t\t\tcategory: 'preview',\n\t\t\tvalue: false,\n\t\t\tonChange(value) {\n\t\t\t\tBarItems.wasd_movement.value = value\n\t\t\t\tBarItems.wasd_movement.updateEnabledState();\n\t\t\t\tsetupWASDMovement(Preview.selected, value ? 8 : 32);\n\t\t\t}\n\t\t}));\n\n\t\tlet wasd_toggle = new Toggle('wasd_movement', {\n\t\t\tname: 'WASD Movement',\n\t\t\ticon: 'sports_esports',\n\t\t\tcategory: 'navigate',\n\t\t\tvalue: false,\n\t\t\tonChange(value) {\n\t\t\t\tsettings.wasd_enabled.value = value\n\t\t\t\tSettings.saveLocalStorages();\n\t\t\t\tsetupWASDMovement(Preview.selected, value ? 8 : 32);\n\t\t\t}\n\t\t});\n\n\t\tdeletables.push(wasd_toggle);\n\t\tMenuBar.menus.view.addAction('_');\n\t\tMenuBar.menus.view.addAction(wasd_toggle);\n\t\tBarItems.wasd_movement.value = settings.wasd_enabled.value\n\t\tBarItems.wasd_movement.updateEnabledState();\n\t\t\n\t\tfunction isWASDMovementEnabled() {\n\t\t\tif (settings.wasd_requires_hold_right_mouse.value) {\n\t\t\t\treturn Preview.selected && BarItems.wasd_movement && BarItems.wasd_movement.value && rightMouseDown;\n\t\t\t} else {\n\t\t\t\treturn Preview.selected && BarItems.wasd_movement && BarItems.wasd_movement.value\n\t\t\t}\n\t\t}\n\n\t\tdeletables.push(new Setting('base_speed', {\n\t\t\tname: 'WASD Base Speed',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 50,\n\t\t\tmin: 1\n\t\t}));\n\n\t\tdeletables.push(new Setting('move_faster_mult', {\n\t\t\tname: 'WASD Move Faster Multiplier',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 2,\n\t\t\tmax: 10,\n\t\t\tmin: 1\n\t\t}));\n\n\t\tdeletables.push(new Setting('move_slower_mult', {\n\t\t\tname: 'WASD Move Slower Multiplier',\n\t\t\tdescription: '-', \n\t\t\tcategory: 'preview',\n\t\t\ttype: 'number',\n\t\t\tvalue: 0.5,\n\t\t\tmax: 1,\n\t\t\tmin: 0.1\n\t\t}));\n\n\t\tdeletables.push(new Setting('wasd_y_level', {\n\t\t\tname: 'WASD Navigate at Y Level',\n\t\t\tdescription: 'Navigate using WASD at consistent Y level rather than on camera plane',\n\t\t\tcategory: 'preview',\n\t\t\tvalue: true\n\t\t}));\n\n\t\tdeletables.push(new Setting('wasd_requires_hold_right_mouse', {\n\t\t\tname: 'WASD Hold Right Mouse Button',\n\t\t\tdescription: 'Use WASD controls only while holding the right mouse button',\n\t\t\tcategory: 'preview',\n\t\t\tvalue: false\n\t\t}));\n\n\t\tlet pressed_keys = [];\n\t\tBlockbench.on('press_key', data => {\n\t\t\tlet key = data.event.which;\n\t\t\tif (navigation_keybinds.find(k => k.keybind.key == key) && !getFocusedTextInput()) {\n\t\t\t\tpressed_keys.safePush(key);\n\t\t\t\tif (isWASDMovementEnabled()) {\n\t\t\t\t\tdata.capture();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tdocument.addEventListener('keyup', event => {\n\t\t\tpressed_keys.remove(event.which);\n\t\t});\n\n\t\tdocument.addEventListener('mousedown', event => {\n\t\t\tif (event.button === 2) { // Right mouse button\n\t\t\t\trightMouseDown = true;\n\t\t\t}\n\t\t});\n\n\t\tdocument.addEventListener('mouseup', event => {\n\t\t\tif (event.button === 2) { // Right mouse button\n\t\t\t\trightMouseDown = false;\n\t\t\t}\n\t\t});\n\n\t\tfunction doWASDMovement() {\n\t\t\tlet movement = new THREE.Vector3(0, 0, 0);\n\n\t\t\tlet uses_wasd_movement = false;\n\t\t\tfunction add(x, y, z) {\n\t\t\t\tmovement.x += x;\n\t\t\t\tmovement.y += y;\n\t\t\t\tmovement.z += z;\n\t\t\t\tuses_wasd_movement = true;\n\t\t\t}\n\n\t\t\tif (pressed_keys.includes(navigate_forward.keybind.key)) add(0, 0, -1);\n\t\t\tif (pressed_keys.includes(navigate_backward.keybind.key)) add(0, 0, 1);\n\t\t\tif (pressed_keys.includes(navigate_left.keybind.key)) add(-1, 0, 0);\n\t\t\tif (pressed_keys.includes(navigate_right.keybind.key)) add(1, 0, 0);\n\t\t\tif (pressed_keys.includes(navigate_down.keybind.key)) add(0, -1, 0);\n\t\t\tif (pressed_keys.includes(navigate_up.keybind.key)) add(0, 1, 0);\n\t\t\t\n\t\t\t\n\t\t\tif (uses_wasd_movement) {\n\t\t\t\tsetupWASDMovement(Preview.selected);\n\t\t\t\t\n\t\t\t\tlet speedMultiplier = 1.0; // Default speed\n\t\t\t\t\n\t\t\t\tif (pressed_keys.includes(navigate_faster.keybind.key)) speedMultiplier *= settings.move_faster_mult.value;\n\t\t\t\telse if (pressed_keys.includes(navigate_slower.keybind.key)) speedMultiplier *= settings.move_slower_mult.value;\n\n\t\t\t\tif (settings.wasd_y_level.value) {\n\t\t\t\t\tlet vec = Preview.selected.controls.object.getWorldDirection(new THREE.Vector3()).normalize();\n\t\t\t\t\tlet angle = Math.atan2(-vec.x, -vec.z);\n\t\t\t\t\tmovement.applyAxisAngle(THREE.NormalY, angle);\n\t\t\t\t} else {\n\t\t\t\t\tmovement.applyEuler(Preview.selected.controls.object.rotation);\n\t\t\t\t}\n\n\t\t\t\tmovement.multiplyScalar(Settings.get('base_speed') * speedMultiplier / 100);\n\t\t\t\tPreview.selected.camera.position.add(movement);\n\t\t\t\tPreview.selected.controls.target.add(movement);\n\t\t\t}\n\t\t}\n\n\t\tfunction tickNavigation() {\n\t\t\t\n\t\t\t// Ensure plugin is installed correctly\n\t\t\tif (!settings.wasd_enabled) return;\n\n\t\t\tif (isWASDMovementEnabled() && pressed_keys.length) {\n\t\t\t\tdoWASDMovement();\n\t\t\t}\n\n\t\t\t// Ensure zoom is disabled when moving\n\t\t\tPreview.all.forEach(preview => {\n\t\t\t\tpreview.controls.enableZoom = !isWASDMovementEnabled();\n\t\t\t});\n\t\t};\n\t\tinterval = setInterval(tickNavigation, 1000/60);\n\t},\n\toninstall() {\n\t\tMenuBar.menus.view.highlight(BarItems.wasd_movement);\n\t},\n\tonunload() {\n\t\tdeletables.forEach(action => {\n\t\t\taction.delete();\n\t\t});\n\t\tsetupWASDMovement(Preview.selected, 16);\n\t\tPreview.all.forEach(preview => {\n\t\t\tpreview.controls.enableZoom = true;\n\t\t});\n\t\tclearInterval(interval);\n\t}\n});\n"
  },
  {
    "path": "plugins/workspaces/about.md",
    "content": "<div id=\"about-content\">\n  <p>This plugin adds a workspaces system that allows you to store your recent projects in separate workspaces.</p>\n  <p>This could be used to separate your personal models from your work / commissioned models, or to separate models based on the projects they are part of.</p>\n  <p>To view workspaces, you can click the workspaces button <i class=\"icon material-icons\" style=\"translate:0 5px\">table_restaurant</i> that appears below your recent projects. You can also access workspaces by going to <strong>File > Workspaces</strong> while on the start screen.</p>\n  <div style=\"flex: 1;\"></div>\n  <img src=\"data:image/png;base64,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\">\n  <div style=\"flex: 1;\"></div>\n</div>\n<style>\n  .about {\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n  }\n  #about-content {\n    overflow-y: auto;\n    min-height: 128px;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n  }\n  #about-content > img {\n    width: 100%;\n    height: 216px;\n    object-fit: contain;\n    margin: 10px 0 12px;\n    filter: drop-shadow(0 3px 10px #0006);\n  }\n  #about-markdown-links {\n    display: flex;\n    justify-content: space-around;\n    margin: 20px 20px 0;\n  }\n  #about-markdown-links > a {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    padding: 5px;\n    text-decoration: none;\n    flex-grow: 1;\n    flex-basis: 0;\n    color: var(--color-subtle_text);\n    text-align: center;\n  }\n  #about-markdown-links > a:hover {\n    background-color: var(--color-accent);\n    color: var(--color-light);\n  }\n  #about-markdown-links > a > i {\n    font-size: 32px;\n    width: 100%;\n    max-width: initial;\n    height: 32px;\n    text-align: center;\n  }\n  #about-markdown-links > a:hover > i {\n    color: var(--color-light) !important;\n  }\n  #about-markdown-links > a > p {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    margin: 0;\n  }\n</style>\n<div id=\"about-markdown-links\">\n  <a href=\"https://ewanhowell.com/\">\n    <i class=\"material-icons icon\" style=\"color: #33E38E;\">language</i>\n    <p>By Ewan Howell</p>\n  </a>\n  <a href=\"https://discord.ewanhowell.com/\">\n    <i class=\"fa_big icon fab fa-discord\" style=\"color: #727FFF;\"></i>\n    <p>Discord Server</p>\n  </a>\n</div>"
  },
  {
    "path": "plugins/workspaces/workspaces.js",
    "content": "(() => {\n  let dialog, action, styles, newDialog, editDialog\n  const id = \"workspaces\"\n  const name = \"Workspaces\"\n  const icon = \"table_restaurant\"\n  const E = s => $(document.createElement(s))\n  const workspaces = JSON.parse(localStorage.getItem(\"workspaces\") ?? \"[]\")\n  if (!workspaces.length) workspaces.push({\n    name: \"Default\",\n    projects: recent_projects,\n    active: true\n  })\n  Plugin.register(id, {\n    title: name,\n    icon: \"icon.png\",\n    author: \"Ewan Howell\",\n    description: \"Organise your recent projects into workspaces that you can switch between.\",\n    tags: [\"Files\", \"Management\", \"Blockbench\"],\n    version: \"1.0.0\",\n    min_version: \"4.8.0\",\n    variant: \"desktop\",\n    creation_date: \"2023-09-07\",\n    onload() {\n      Blockbench.on(\"update_recent_project_thumbnail\", recentThumbnails)\n      styles = Blockbench.addCSS(`\n        #workspace-details {\n          position: absolute;\n          bottom: 20px;\n          right: 30px;\n          display: flex;\n          gap: 10px;\n          align-items: center;\n          cursor: pointer;\n        }\n        .workspace {\n          display: flex;\n          align-items: center;\n          gap: 10px;\n          cursor: pointer;\n        }\n        .workspace *, #workspace-details *, #workspace-add * {\n          cursor: pointer;\n        }\n        .workspace i:hover, .workspace input:hover, #workspace-details:hover, #workspace-add:hover {\n          color: var(--color-light);\n        }\n        .workspace-spacer {\n          flex: 1;\n          margin: 0 10px;\n          background-color: var(--color-button);\n          height: 2px;\n        }\n        #workspace-add {\n          display: flex;\n          align-items: center;\n          margin-top: 10px;\n          justify-content: flex-end;\n        }\n        #workspace-add > i {\n          padding-right: 10px;\n          min-width: 32px;\n        }\n        .start_screen_format_page > #workspace-details {\n          display: none;\n        }\n      `)\n      dialog = new Dialog({\n        id,\n        title: name,\n        width: 256,\n        buttons: [],\n        component: {\n          data: {\n            workspaces,\n            switchToWorkspace\n          },\n          methods: {\n            addWorkspace() {\n              newDialog = new Dialog({\n                id: \"new_workspace\",\n                title: \"New Workspace\",\n                form: {\n                  name: {\n                    label: \"Workspace name\"\n                  }\n                },\n                onConfirm(form) {\n                  if (!form.name) return\n                  const m = form.name.match(/[\\\\/*?\"<>|]/)\n                  if (m) return Blockbench.showQuickMessage(`Unsupported character \"${m}\"`, 2000)\n                  if (workspaces.find(e => e.name === form.name)) return Blockbench.showQuickMessage(\"Workspace already exists\", 2000)\n                  workspaces.push({\n                    name: form.name,\n                    projects: []\n                  })\n                  switchToWorkspace(form.name)\n                }\n              }).show()\n            },\n            editWorkspace(e) {\n              e.stopPropagation()\n              const name = e.currentTarget.dataset.name\n              const allow = name !== \"Default\"\n              editDialog = new Dialog({\n                id: \"edit_workspace\",\n                title: `Edit Workspace`,\n                buttons: [\"Confirm\"],\n                form: {\n                  name: {\n                    label: \"Workspace name\",\n                    placeholder: name,\n                    condition: () => allow\n                  },\n                  clear: {\n                    type: \"checkbox\",\n                    label: \"Clear recents\"\n                  }\n                },\n                onConfirm(form) {\n                  let message\n                  if (form.clear) {\n                    const workspace = workspaces.find(e => e.name === name)\n                    workspace.projects = []\n                    if (workspace.active) {\n                      recent_projects.length = 0\n                      updateRecentProjects()\n                    }\n                    message = \"Cleared recent projects\"\n                  }\n                  if (form.name && form.name !== name) {\n                    const m = form.name.match(/[\\\\/*?\"<>|]/)\n                    if (m) return Blockbench.showQuickMessage(`Unsupported character \"${m}\"`, 2000)\n                    if (workspaces.find(e => e.name === form.name)) return Blockbench.showQuickMessage(\"Workspace name already in use\", 2000)\n                    const workspace = workspaces.find(e => e.name === name)\n                    workspace.name = form.name\n                    if (workspace.active) $(\"#active-workspace\").text(form.name)\n                    if (message) message += \" and updated workspace name\"\n                    else message = \"Updated workspace name\"\n                  }\n                  if (message) {\n                    localStorage.setItem(\"workspaces\", JSON.stringify(workspaces))\n                    Blockbench.showQuickMessage(message, 2000)\n                  }\n                }\n              }).show()\n            },\n            deleteWorkspace(e) {\n              e.stopPropagation()\n              const target = e.currentTarget\n              Blockbench.showMessageBox({\n                title: \"Delete workspace\",\n                message: `Are you sure you want to delete the workspace: ${target.dataset.name}\\n\\nIts recent projects list will be lost.`,\n                buttons: [\"dialog.confirm\", \"dialog.cancel\"]\n              }, async button => {\n                if (button === 0) {\n                  if (workspaces.find(f => f.name === target.dataset.name).active) switchToWorkspace(\"Default\")\n                  workspaces.splice(workspaces.findIndex(i => i.name === target.dataset.name), 1)\n                  localStorage.setItem(\"workspaces\", JSON.stringify(workspaces))\n                }\n              })\n            }\n          },\n          template: `\n            <div>\n              <div id=\"workspace-list\">\n                <div class=\"workspace\" v-for=\"workspace in workspaces\" @click=\"switchToWorkspace(workspace.name)\">\n                  <input type=\"radio\" :checked=\"workspace.active\">\n                  <div class=\"workspace-name\">{{ workspace.name }}</div>\n                  <div class=\"workspace-spacer\"></div>\n                  <i v-if=\"workspace.name !== 'Default'\" class=\"material-icons\" @click=\"deleteWorkspace\" :data-name=\"workspace.name\">delete</i>\n                  <i class=\"material-icons\" @click=\"editWorkspace\" :data-name=\"workspace.name\">edit</i>\n                </div>\n              </div>\n              <div id=\"workspace-add\" @click=\"addWorkspace\">\n                <i class=\"material-icons\">add</i>\n                <div>Add new workspace</div>\n              </div>\n            </div>\n          `\n        }\n      })\n      action = new Action({\n        name,\n        id,\n        description: \"Manage workspaces\",\n        icon,\n        click: () => dialog.show(),\n        condition: () => !Format\n      })\n      MenuBar.addAction(action, \"file\")\n      $(\"#start_files > .start_screen_right\").append(\n        E(\"div\").attr(\"id\", \"workspace-details\").append(\n          E(\"i\").addClass(\"material-icons\").text(icon),\n          E(\"div\").attr(\"id\", \"active-workspace\").text(workspaces.find(e => e.active).name)\n        ).on(\"click\", () => dialog.show())\n      )\n    },\n    onunload() {\n      Blockbench.removeListener(\"update_recent_project_thumbnail\", recentThumbnails)\n      action.delete()\n      styles.delete()\n      dialog.close()\n      newDialog?.close()\n      editDialog?.close()\n      $(\"#workspace-details\").remove()\n    }\n  })\n\n  function switchToWorkspace(name) {\n    const old = workspaces.find(e => e.active)\n    old.projects = recent_projects.slice()\n    old.active = false\n    const active = workspaces.find(e => e.name === name)\n    active.active = true\n    recent_projects.length = 0\n    recent_projects.push(...active.projects)\n    localStorage.setItem(\"workspaces\", JSON.stringify(workspaces))\n    updateRecentProjects()\n    StartScreen.vue.updateThumbnails()\n    $(\"#active-workspace\").text(active.name)\n  }\n\n  function recentThumbnails() {\n    const recents = recent_projects.slice()\n    recent_projects.push(...workspaces.filter(e => !e.active).map(e => e.projects).flat())\n    setTimeout(() => {\n      recent_projects.length = 0\n      recent_projects.push(...recents)\n    }, 1)\n  }\n})()"
  },
  {
    "path": "plugins.json",
    "content": "{\n\t\"sam3dj\": {\n\t\t\"title\": \"sam3DJ\",\n\t\t\"author\": \"1Turtle\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Format\", \"Exporter\"],\n\t\t\"version\": \"1.1.1\",\n\t\t\"variant\": \"both\",\n\t\t\"description\": \"Generate 3D prints in MC (Java Edition) via the .3DJ format within the SC-Peripherals mod!\",\n\t\t\"about\": \"This plugin allows you to **export a model into the .3DJ format**.  \\nThe .3DJ format is _mostly_ used with the `3D Printer` from the **SC-Peripherals** Java Edition mod.  \\n  \\n**Tip:** Cubes in a `state_on` folder will be _only_ displayed whenever the model is toggled on!    \\n> **Note:** _The format does not support the following attributes:_  \\n> * Rotated cubes  \\n> * One cube with multiple textures  \\n> * Cubes outside the given block space *(16x16x16 Grid / 1x1x1 Block)*  \\n  \\nTry to avoid those things, or else you might run into weird results.  \\nMeshes are also not supported due to the limitations of the format and Minecraft.\\n> For the full format documentations, see the [SwitchCraft3 Wiki](https://docs.sc3.io/whats-new/sc-peripherals.html#_3dj-format)  \\n\",\n\t\t\"icon\": \"print\"\n\t},\n\t\"animated_java\": {\n\t\t\"title\": \"Animated Java\",\n\t\t\"author\": \"Titus Evans (SnaveSutit)\",\n\t\t\"description\": \"Effortlessly craft complex animations for Minecraft: Java Edition\",\n\t\t\"version\": \"1.8.1\",\n\t\t\"await_loading\": true,\n\t\t\"icon\": \"icon.svg\",\n\t\t\"variant\": \"desktop\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Animation\", \"Display Entities\"],\n\t\t\"min_version\": \"4.12.0\",\n\t\t\"has_changelog\": true\n\t},\n\t\"animated_platforms\": {\n\t\t\"title\": \"Animated Platforms\",\n\t\t\"author\": \"Cazfps\",\n\t\t\"description\": \"An animated ground plane that makes it easier to animate moving entities (walk cycles, vehicles, etc.). It offers customization for size, rotation, speed, opacity, textures, and per-animation presets so you can tune it to your workflow.\",\n\t\t\"icon\": \"icon.svg\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"new_repository_format\": true,\n\t\t\"website\": \"https://www.cazfps.com/links\",\n\t\t\"tags\": [\"Minecraft\", \"Animation\", \"Tools\"]\n\t},\n\t\"armor_stand_animator\": {\n\t\t\"title\": \"Armor Stand Animator\",\n\t\t\"author\": \"DoubleFelix\",\n\t\t\"description\": \"Provides an interface to animate armor stands which is converted to a data pack\",\n\t\t\"about\": \"To start, create the armor stand model by using the \\\"Create Armor Stand Model\\\" action in the toolbar. Then, create your animation in the animate tab as normal. Make sure the snapping value for keyframes is set to 20 for best results. When you're finished, use the \\\"Export Armor Stand Animation\\\" action in the toolbar. Change the settings as needed, then click \\\"Confirm\\\". Animations can be run with \\\"/execute as @e[tag=entity_tag] run function animation_pack:start\\\". The armor stand for an animation can be summoned with \\\"/function animation_pack:create\\\". Supports looping, time scale, block/blockbench unit scale, pausing and playback, and start delays.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"icon\": \"fa-forward\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"animator\": {\n\t\t\"title\": \"Java Item Model Animator\",\n\t\t\"author\": \"Command master\",\n\t\t\"description\": \"Takes two java item models and outputs a zip with a resourcepack and a datapack to make a clear transaction between them in the players hand (the plugin can also work for other animations but the datapack have to be coded manually).\",\n\t\t\"about\": \"The animation is activated using \\\"/scoreboard players set @s animation 0\\\".\\nTo use click Filter -> Save starting model the save the first model, and then click on File -> Export -> Export animation to download the ZIP file of the animation\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"icon\": \"compare\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"brush_tuna\": {\n\t\t\"icon\": \"icon.png\",\n\t\t\"title\": \"Brush Tuna\",\n\t\t\"description\": \"Brush Tuna overhauls the Brush Presets system, providing an improved interface, and several new features.\",\n\t\t\"version\": \"1.0.6\",\n\t\t\"variant\": \"both\",\n\t\t\"author\": \"SnaveSutit & Embody Games\",\n\t\t\"tags\": [\n\t\t\t\"Texture\",\n\t\t\t\"Paint\",\n\t\t\t\"Tool\"\n\t\t],\n\t\t\"min_version\": \"5.1.4\",\n\t\t\"bug_tracker\": \"https://github.com/SnaveSutit/brush-tuna/issues\",\n\t\t\"has_changelog\": true\n\t},\n\t\"geenium_bedrock_entity_helper\": {\n\t\t\"title\": \"Bedrock Entity Model Presets\",\n\t\t\"author\": \"Geenium\",\n\t\t\"description\": \"Loads Bedrock vanilla entity models up to version 1.13\",\n\t\t\"tags\": [\"Deprecated\", \"Minecraft: Bedrock Edition\"],\n\t\t\"deprecation_note\": \"This plugin is no longer updated. To get models for texturing, use File > New > Minecraft Skin. To get Minecraft Bedrock Edition models, use the plugin 'Minecraft Entity Wizard'. To get template models for OptiFine CEM, use the plugin 'CEM Template Loader'.\",\n\t\t\"icon\": \"pets\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"missing_texture_highlighter\": {\n\t\t\"title\": \"Missing Texture Highlighter\",\n\t\t\"icon\": \"flash_on\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Highlights missing textures by flashing them.\",\n\t\t\"version\": \"0.1.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"double_sided_cubes\": {\n\t\t\"title\": \"Double Sided Cube Generator\",\n\t\t\"author\": \"SnaveSutit\",\n\t\t\"icon\": \"flip_to_back\",\n\t\t\"description\": \"Creates inverted duplicates of the selected cube(s) to allow double-sided rendering in Minecraft: Java Edition.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"1.0.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"optimize\": {\n\t\t\"title\": \"Optimize\",\n\t\t\"author\": \"Krozi\",\n\t\t\"description\": \"Hide concealed faces for better performance!\",\n\t\t\"icon\": \"border_outer\",\n\t\t\"min_version\": \"2.0.2\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.2.8\"\n\t},\n\t\"blockmodels-exporter\": {\n\t\t\"title\": \"Export to BlockModels.com\",\n\t\t\"author\": \"TheDestruc7i0n\",\n\t\t\"description\": \"Export models from Blockbench directly to BlockModels.com\",\n\t\t\"icon\": \"web\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"plaster\": {\n\t\t\"title\": \"Plaster\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Fixes texture bleeding (small white or colored lines around the edges of your model) by slightly shrinking UV maps\",\n\t\t\"icon\": \"healing\",\n\t\t\"min_version\": \"3.0.5\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"shape_generator\": {\n\t\t\"title\": \"Shape Generator\",\n\t\t\"author\": \"dragonmaster95\",\n\t\t\"description\": \"Generates shapes.\",\n\t\t\"icon\": \"pages\",\n\t\t\"min_version\": \"3.0.2\",\n\t\t\"version\": \"0.0.4\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"outline_creator\": {\n\t\t\"title\": \"Outline Creator\",\n\t\t\"author\": \"Wither\",\n\t\t\"description\": \"Creates stylistic outlines for cubes and meshes using negative scale values.\",\n\t\t\"about\": \"Select an element you want to create an outline for, go to the `Tools` menu and click on the `Create Outline` option.\",\n\t\t\"icon\": \"crop_square\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"vox_importer\": {\n\t\t\"title\": \"Voxel Importer\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Import voxel (.vox) files\",\n\t\t\"icon\": \"view_module\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.2.2\"\n\t},\n\t\"player_statue_generator\": {\n\t\t\"title\": \"Player Statue Generator\",\n\t\t\"author\": \"Wither, dragonmaster95 and 3XH6R\",\n\t\t\"description\": \"Generates player shaped models.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"icon\": \"accessibility\",\n\t\t\"min_version\": \"3.0.0\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"clone_brush\": {\n\t\t\"title\": \"Clone Brush\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"icon\": \"account_balance_wallet\",\n\t\t\"description\": \"Clone Cubes\",\n\t\t\"min_version\": \"3.0.0\",\n\t\t\"version\": \"1.1.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"mod_utils\": {\n\t\t\"title\": \"Mod Utils\",\n\t\t\"author\": \"JTK222 (Maintainer), Wither (For the original Techne importer), Ocraftyone (VoxelShape improvements)\",\n\t\t\"icon\": \"fa-cubes\",\n\t\t\"description\": \"Allows importing Tabula files, and exporting VoxelShapes\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"1.7.1\",\n\t\t\"variant\": \"desktop\"\n\t},\n\t\"structure_importer\": {\n\t\t\"title\": \"Structure Importer\",\n\t\t\"icon\": \"account_balance\",\n\t\t\"author\": \"JannisX11 & Krozi\",\n\t\t\"description\": \"Import structure files generated by structure blocks in Minecraft Java\",\n\t\t\"version\": \"2.1.7\",\n\t\t\"min_version\": \"3.7.0\",\n\t\t\"variant\": \"desktop\"\n\t},\n\t\"seat_position\": {\n\t\t\"title\": \"Seat Position + Hitbox\",\n\t\t\"icon\": \"event_seat\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Preview seat positions, hit/selection boxes, and collision boxes for custom MC Bedrock entities and blocks\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"],\n\t\t\"version\": \"1.3.2\",\n\t\t\"min_version\": \"3.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"ambient_occlusion\": {\n\t\t\"title\": \"Ambient Occlusion\",\n\t\t\"icon\": \"gradient\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Adds a screen space ambient occlusion shader\",\n\t\t\"about\": \"Ambient Occlusion is enabled by default. You can adjust the intensity or disable it in the settings.\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Deprecated\"],\n\t\t\"deprecation_note\": \"This plugin can cause visual artifacts and a decreased framerate\",\n\t\t\"version\": \"1.0.4\",\n\t\t\"min_version\": \"3.4.0\"\n\t},\n\t\"csmodel\": {\n\t\t\"title\": \"CraftStudio Model Format\",\n\t\t\"icon\": \"star\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Allows to import and export CraftStudio Models (.csmodel).\",\n\t\t\"about\": \"To **import** a model from CraftStudio, go to the CraftStudio project settings and export a cspack file. Open this file in an archive manager (like 7zip) and extract the model file. Import the file into Blockbench using the import menu. \\nTo **export** a file, export a .csmodel file from Blockbench and drop it into an existing .cspack file into the Models folder. Make sure it is using the same file name as the old model in the pack. Import the .cspack into CraftStudio and select the models you want to import.\",\n\t\t\"tags\": [\"CraftStudio\"],\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"0.1.3\",\n\t\t\"min_version\": \"3.2.0\"\n\t},\n\t\"screencast_keys\": {\n\t\t\"title\": \"Screencast Keys\",\n\t\t\"icon\": \"keyboard\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Displays the key combinations you press on screen. Useful for tutorial videos.\",\n\t\t\"version\": \"0.2.0\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"3.2.1\"\n\t},\n\t\"discord-rpc\": {\n\t\t\"title\": \"Discord RPC\",\n\t\t\"icon\": \"announcement\",\n\t\t\"author\": \"strajabot, Kastle, & simplyme\",\n\t\t\"description\": \"Show a rich presence status in Discord.\",\n\t\t\"variant\": \"desktop\",\n\t\t\"version\": \"1.1.4\",\n\t\t\"min_version\": \"3.2.0\"\n\t},\n\t\"cem_template_loader\": {\n\t\t\"title\": \"CEM Template Loader\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Load template Java Edition entity models for use with OptiFine CEM. Also includes an animation editor, so that you can create custom entity animations.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"OptiFine\", \"Templates\"],\n\t\t\"version\": \"9.1.1\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2020-02-02\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://ewanhowell.com/plugins/cem-template-loader/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/cem_template_loader\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[CEM Template Loader]\"\n\t},\n\t\"optifine_player_models\": {\n\t\t\"title\": \"OptiFine Player Models\",\n\t\t\"icon\": \"icon-player\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Adds a new format that allows you to create OptiFine player models.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"OptiFine\", \"Player Models\"],\n\t\t\"version\": \"1.5.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"await_loading\": true,\n\t\t\"creation_date\": \"2022-05-29\",\n\t\t\"contributes\": {\n\t\t\t\"formats\": [\"optifine_player_model\"]\n\t\t}\n\t},\n\t\"colour_gradient_generator\": {\n\t\t\"title\": \"Colour Gradient Generator\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Generate hue shifted gradient palettes from a single colour.\",\n\t\t\"tags\": [\"Paint\", \"Palette\", \"Color\"],\n\t\t\"version\": \"2.1.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/colour-gradient-generator/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/colour_gradient_generator\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Colour Gradient Generator]\",\n\t\t\"creation_date\": \"2022-06-02\",\n\t\t\"has_changelog\": true\n\t},\n\t\"collapsible_start_screen_categories\": {\n\t\t\"title\": \"Collapsible Start Screen Categories\",\n\t\t\"icon\": \"chevron_right\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Add the ability to collapse the start screen categories.\",\n\t\t\"about\": \"This plugin adds a small dropdown arrow next to each category on the start screen, allowing you to collapse each category and hide their respective formats.\",\n\t\t\"tags\": [\"Menu\", \"Start screen\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.4.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"preview_scene_customiser\": {\n\t\t\"title\": \"Preview Scene Customiser\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Create your very own preview scenes. Download preview scenes from the Preview Scene Store. Edit and manage existing preview scenes.\",\n\t\t\"tags\": [\"Preview Scenes\", \"Blockbench\"],\n\t\t\"version\": \"1.2.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2022-10-14\",\n\t\t\"await_loading\": true,\n\t\t\"has_changelog\": true,\n    \"website\": \"https://ewanhowell.com/plugins/preview-scene-customiser/\",\n    \"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/preview-scene-customiser\",\n    \"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Preview Scene Customiser]\"\n\t},\n\t\"splash_art_customiser\": {\n\t\t\"title\": \"Splash Art Customiser\",\n\t\t\"icon\": \"palette\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Customise the start screen's splash art, by adding your own!\",\n\t\t\"tags\": [\"Splash art\", \"Start screen\", \"Blockbench\"],\n\t\t\"version\": \"1.1.4\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2022-11-08\"\n\t},\n\t\"scene_recorder\": {\n\t\t\"title\": \"Scene Recorder\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Enhance the GIF recorder by adding new formats for recording your model. Replace the built-in GIF format with a higher quality one.\",\n\t\t\"tags\": [\"Recording\", \"Media\"],\n\t\t\"version\": \"2.1.1\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/scene-recorder/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/scene_recorder\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Scene Recorder]\",\n\t\t\"creation_date\": \"2022-12-14\",\n\t\t\"has_changelog\": true\n\t},\n\t\"backup_viewer\": {\n\t\t\"title\": \"Backup Viewer\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"View the project backups from the Blockbench start screen.\",\n\t\t\"tags\": [\"Backups\", \"Start screen\", \"Blockbench\"],\n\t\t\"version\": \"2.1.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"creation_date\": \"2022-12-28\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://ewanhowell.com/plugins/backup-viewer/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/backup-viewer\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Backup Viewer]\"\n\t},\n\t\"activity_tracker\": {\n\t\t\"title\": \"Activity Tracker\",\n\t\t\"icon\": \"trending_up\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Track how long you spend using Blockbench and working on each project.\",\n\t\t\"about\": \"This plugin allows you to keep track of how much time you spend using Blockbench and how long you spend working on each project.\\n\\nTo view your activity stats, go to `Tools > Activity Tracker`. From here you can see all your stats for both Blockbench and the current project.\",\n\t\t\"tags\": [\"Tracking\", \"Stats\", \"Utility\"],\n\t\t\"version\": \"1.1.1\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2023-03-30\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/activity-tracker/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/activity-tracker\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Activity Tracker]\",\n\t\t\"has_changelog\": true\n\t},\n\t\"minecraft_title_generator\": {\n\t\t\"title\": \"Minecraft Title Generator\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Create Minecraft-styled title models!\",\n\t\t\"tags\": [\"Minecraft\", \"Title\", \"Logo\"],\n\t\t\"version\": \"1.10.4\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2023-06-10\",\n\t\t\"await_loading\": true,\n\t\t\"contributes\": {\n\t\t\t\"formats\": [\"minectaft_title\"]\n\t\t},\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://ewanhowell.com/plugins/minecraft-title-generator/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/minecraft-title-generator\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Minecraft Title Generator]\"\n\t},\n\t\"workspaces\": {\n\t\t\"title\": \"Workspaces\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Organise your recent projects into workspaces that you can switch between.\",\n\t\t\"tags\": [\"Files\", \"Management\", \"Blockbench\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"creation_date\": \"2023-09-07\"\n\t},\n\t\"live_dev_reloader\": {\n\t\t\"title\": \"Live Dev Reloader\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Edit plugins and themes live in any text editor and have them automatically update in Blockbench.\",\n\t\t\"tags\": [\"Plugins\", \"Themes\", \"Blockbench\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/live-dev-reloader/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/live_dev_reloader\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Live Dev Reloader]\",\n\t\t\"creation_date\": \"2024-01-20\",\n\t\t\"has_changelog\": true\n\t},\n\t\"resource_pack_utilities\": {\n\t\t\"title\": \"Resource Pack Utilities\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"A collection of utilities to assist with resource pack creation.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Resource Packs\", \"Utilities\"],\n\t\t\"version\": \"1.10.0\",\n\t\t\"min_version\": \"5.0.2\",\n\t\t\"variant\": \"desktop\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/resource-pack-utilities/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/resource_pack_utilities\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues?title=[Resource Pack Utilities]\",\n\t\t\"creation_date\": \"2024-07-01\",\n\t\t\"has_changelog\": true\n\t},\n\t\"asset_browser\": {\n\t\t\"title\": \"Asset Browser\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Ewan Howell\",\n\t\t\"description\": \"Browse the Minecraft assets from within Blockbench.\",\n\t\t\"tags\": [\"Minecraft\", \"Assets\", \"Browser\"],\n\t\t\"version\": \"1.2.2\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/asset-browser/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/asset_browser\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Asset Browser]\",\n\t\t\"creation_date\": \"2025-05-30\",\n\t\t\"has_changelog\": true\n\t},\n\t\"free_rotation\": {\n\t\t\"title\": \"Free Rotation\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Godlander & Ewan Howell\",\n\t\t\"description\": \"Create Java Item models without any rotation limitations.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Items\", \"Rotation\"],\n\t\t\"version\": \"1.2.1\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"website\": \"https://ewanhowell.com/plugins/free-rotation/\",\n\t\t\"repository\": \"https://github.com/ewanhowell5195/blockbenchPlugins/tree/main/free_rotation\",\n\t\t\"bug_tracker\": \"https://github.com/ewanhowell5195/blockbenchPlugins/issues/new?title=[Free Rotation]\",\n\t\t\"creation_date\": \"2024-12-20\",\n\t\t\"has_changelog\": true\n\t},\n\t\"threecore_exporter\": {\n\t\t\"title\": \"ThreeCore Exporter\",\n\t\t\"author\": \"Lucas, Spyeedy\",\n\t\t\"icon\": \"looks_3\",\n\t\t\"description\": \"Let's you export your models in the json entity model format for the ThreeCore mod!\",\n\t\t\"version\": \"1.0.3\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"3.7.5\"\n\t},\n\t\"startup_tips\": {\n\t\t\"title\": \"Startup Tips\",\n\t\t\"author\": \"TheOtterlord\",\n\t\t\"icon\": \"info\",\n\t\t\"description\": \"This plugin provides helpful tips for those unfamiliar with Blockbench\",\n\t\t\"about\": \"The Startup Tips plugin provides helpful tips about Blockbench on startup. These tips include tips about model creation, external resources, the editor, and more\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"animation_utils\": {\n\t\t\"title\": \"GeckoLib Animation Utils\",\n\t\t\"author\": \"Eliot Lash, Tslat, Gecko, McHorse\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Replaced by new plugin for Blockbench 5.0+ - Install 'GeckoLib Models and Animations'\",\n\t\t\"deprecation_note\": \"This plugin has been discontinued in favour of the \\\"GeckoLib Models and Animations\\\" plugin. This plugin will continue to work on Blockbench 4 and below. For Blockbench 5+, use 'GeckoLib' instead.\",\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Java Edition\",\n\t\t\t\"Deprecated\"\n\t\t],\n\t\t\"version\": \"4.1.3\",\n\t\t\"min_version\": \"4.12.0\",\n\t\t\"await_loading\": true,\n\t\t\"variant\": \"both\",\n\t\t\"max_version\": \"5.0.0\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://github.com/bernie-g/geckolib/wiki\",\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/animation_utils\",\n\t\t\"bug_tracker\": \"https://github.com/bernie-g/geckolib/issues\"\n\t},\n\t\"geckolib\": {\n\t\t\"title\": \"GeckoLib Models & Animations\",\n\t\t\"author\": \"Eliot Lash, Tslat, Gecko, McHorse\",\n\t\t\"contributors\": [\n\t\t\t\"Zigy\"\n\t\t],\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Create animated blocks, items, entities, and armor for the GeckoLib java mod library.\",\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Java Edition\"\n\t\t],\n\t\t\"version\": \"4.2.5\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"max_version\": \"6.0.0\",\n\t\t\"await_loading\": true,\n\t\t\"variant\": \"both\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://github.com/bernie-g/geckolib/wiki\",\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/geckolib\",\n\t\t\"bug_tracker\": \"https://github.com/bernie-g/geckolib/issues\"\n\t},\n\t\"hytale_plugin\": {\n\t\t\"title\": \"Hytale Models\",\n\t\t\"author\": \"JannisX11, Kanno\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"version\": \"0.9.1\",\n\t\t\"description\": \"Create models and animations for Hytale\",\n\t\t\"tags\": [\"Hytale\"],\n\t\t\"contributes\": {\n\t\t\t\"formats\": [\"hytale_character\", \"hytale_prop\"],\n\t\t\t\"open_extensions\": [\"blockymodel\"]\n\t\t},\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"5.0.5\",\n\t\t\"creation_date\": \"2025-12-22\",\n\t\t\"await_loading\": true,\n\t\t\"has_changelog\": true,\n\t\t\"contributors\": [\"Hedaox\", \"MelodicAlbuild\"],\n\t\t\"repository\": \"https://github.com/JannisX11/hytale-blockbench-plugin\",\n\t\t\"bug_tracker\": \"https://github.com/JannisX11/hytale-blockbench-plugin/issues\"\n\t},\n\t\"modded_entity_fabric\": {\n\t\t\"title\": \"Fabric Modded Entity\",\n\t\t\"author\": \"Eliot Lash\",\n\t\t\"icon\": \"icon-format_java\",\n\t\t\"description\": \"Plugin for exporting Modded Entities using Fabric/Yarn Sourcemap\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"0.2.2\",\n\t\t\"min_version\": \"3.6.6\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"multi-layer\": {\n\t\t\"title\": \"Multi-Layer\",\n\t\t\"icon\": \"layers\",\n\t\t\"author\": \"aidancbrady\",\n\t\t\"description\": \"Allows exporting in Forge's multi-layer model format.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"1.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"light_tracer_uploader\": {\n\t\t\"title\": \"Light Tracer Uploader\",\n\t\t\"icon\": \"fas.fa-feather\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Upload models to Light Tracer to share them or to create renders\",\n\t\t\"version\": \"0.0.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"code_view\": {\n\t\t\"title\": \"Code View\",\n\t\t\"icon\": \"developer_mode\",\n\t\t\"author\": \"wither\",\n\t\t\"description\": \"View the model you are currently editing in the raw format\",\n\t\t\"version\": \"1.0.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"datagen_export\": {\n\t\t\"title\": \"Datagen Export\",\n\t\t\"icon\": \"code\",\n\t\t\"author\": \"itsmeow\",\n\t\t\"description\": \"Allows exporting to BlockStateProvider datagen code\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"duplicate_renamer\": {\n\t\t\"title\": \"Duplicate Bone Renamer\",\n\t\t\"icon\": \"fa-font\",\n\t\t\"author\": \"Gecko\",\n\t\t\"description\": \"This plugin renames duplicate bones so they work in bedrock and GeckoLib models\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"texture_stitcher\": {\n\t\t\"title\": \"Texture Stitcher\",\n\t\t\"icon\": \"fa-compress-arrows-alt\",\n\t\t\"author\": \"McHorse\",\n\t\t\"description\": \"Stitch multiple textures into a single texture\",\n\t\t\"version\": \"1.0.7\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"tags\": [\"Texture\"],\n\t\t\"variant\": \"both\",\n\t\t\"has_changelog\": true\n\t},\n\t\"arcaniax_block_exporter\": {\n\t\t\"title\": \"Bedrock Block Exporter\",\n\t\t\"icon\": \"icon-format_block\",\n\t\t\"author\": \"Arcaniax\",\n\t\t\"description\": \"Helps making new Bedrock blocks (requires experimental mode)\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"],\n\t\t\"variant\": \"desktop\",\n\t\t\"version\": \"0.1.1\"\n\t},\n\t\"bakery\": {\n\t\t\"title\": \"Bakery\",\n\t\t\"icon\": \"storefront\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Bakes complex animations into simple linear keyframes\",\n\t\t\"version\": \"1.1.1\",\n\t\t\"min_version\": \"3.7.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"simplify\": {\n\t\t\"title\": \"Simplify Models\",\n\t\t\"icon\": \"build\",\n\t\t\"author\": \"ThePinkHacker\",\n\t\t\"description\": \"Simplifies the cubes in a model. For example if a block was 0.99 pixels wide, then it would change it to 1.\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"animation_sliders\": {\n\t\t\"title\": \"Animation Sliders\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Adds multiple sliders to tweak keyframes\",\n\t\t\"tags\": [\"Animation\"],\n\t\t\"version\": \"0.5.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"voxel_shape_generator\": {\n\t\t\"title\": \"VoxelShape Generators\",\n\t\t\"icon\": \"fa-cubes\",\n\t\t\"author\": \"Spectre0987, Nyfaria\",\n\t\t\"description\": \"Generates Voxel Shapes (Supports Mojang Mappings and MCP)\",\n\t\t\"version\": \"0.2.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"]\n\t},\n\t\"voxel_shape_fabric_generator\": {\n\t\t\"title\": \"VoxelShape Fabric Generator\",\n\t\t\"icon\": \"bar_chart\",\n\t\t\"author\": \"CyberStefNef\",\n\t\t\"description\": \"Generates Voxel Shapes for Fabric\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"]\n\t},\n\t\"mimodel_format\": {\n\t\t\"title\": \"Mine-imator Model Exporter\",\n\t\t\"icon\": \"fas.fa-box-open\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Export .mimodel files for Mine-imator and Modelbench\",\n\t\t\"tags\": [\"Exporter\"],\n\t\t\"version\": \"1.0.2\",\n\t\t\"min_version\": \"3.7.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"minecraft_entity_wizard\": {\n\t\t\"title\": \"Minecraft Entity Wizard\",\n\t\t\"author\": \"JannisX11 & Mojang Studios\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Create entities for Minecraft: Bedrock Edition! Start with the looks and behavior of a vanilla entity, and turn it into your own creation!\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"],\n\t\t\"version\": \"1.8.3\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2021-08-04\",\n\t\t\"bug_tracker\": \"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",\n\t\t\"has_changelog\": true\n\t},\n\t\"minecraft_block_wizard\": {\n\t\t\"title\": \"Minecraft Block Wizard\",\n\t\t\"author\": \"JannisX11 & Mojang Studios\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Create custom blocks for Minecraft: Bedrock Edition!\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"],\n\t\t\"version\": \"1.7.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2022-10-25\",\n\t\t\"bug_tracker\": \"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",\n\t\t\"has_changelog\": true\n\t},\n\t\"minecraft_item_wizard\": {\n\t\t\"title\": \"Minecraft Item Wizard\",\n\t\t\"author\": \"JannisX11 & Mojang Studios\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Create custom items for Minecraft: Bedrock Edition!\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"],\n\t\t\"version\": \"1.2.4\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2023-09-19\",\n\t\t\"bug_tracker\": \"https://github.com/JannisX11/minecraft-wizards/issues/new/choose\",\n\t\t\"has_changelog\": true\n\t},\n\t\"reference_models\": {\n\t\t\"title\": \"Reference Models\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"icon\": \"fas.fa-monument\",\n\t\t\"description\": \"Load and view glTF/glb models or other project tabs as references in Blockbench\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"5.0.0\",\n\t\t\"variant\": \"desktop\"\n\t},\n\t\"vintagestory_models\": {\n\t\t\"title\": \"Vintage Story Models\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"icon\": \"park\",\n\t\t\"description\": \"Allows to export VintageStory models.\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"endimations_exporter\": {\n\t\t\"title\": \"Endimator Animations Exporter\",\n\t\t\"author\": \"SmellyModder\",\n\t\t\"icon\": \"icon-format_java\",\n\t\t\"description\": \"Exports Blockbench animations as the JSON format for Endimator animations from the Blueprint Mod Library. https://github.com/team-abnormals/blueprint\",\n\t\t\"about\": \"Go to Animation -> Export Endimations...\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"brush_randomizer\": {\n\t\t\"title\": \"Brush Color Randomizer\",\n\t\t\"author\": \"Anniken(YT)\",\n\t\t\"icon\": \"brush\",\n\t\t\"description\": \"Randomize the Brush Color with each stroke to give your artwork more variation\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"cardinal\": {\n\t\t\"title\": \"Cardinal\",\n\t\t\"author\": \"Bug1312\",\n\t\t\"icon\": \"border_outer\",\n\t\t\"description\": \"Adds in all cardinal directions on the grid and renders them on-top of everything while facing the camera.\",\n\t\t\"about\": \"If you wish to change the color, use custom CSS to set the variable 'cardinal' to any color! The scale can be changed from within the settings.\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"mesh_tools\": {\n\t\t\"new_repository_format\": true,\n\t\t\"title\": \"MTools\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Adds powerful mesh modeling tools, operators and generators!\",\n\t\t\"version\": \"2.1.0\",\n\t\t\"min_version\": \"4.9.4\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2022-04-09\",\n\t\t\"has_changelog\": true,\n\t\t\"tags\": [\"Format: Generic Model\", \"Mesh\", \"Tool\"]\n\t},\n\t\"wasd_controls\": {\n\t\t\"title\": \"WASD Controls\",\n\t\t\"icon\": \"sports_esports\",\n\t\t\"author\": \"JannisX11, caioraphael1\",\n\t\t\"description\": \"Adds a WASD controlled viewport navigation mode\",\n\t\t\"about\": \"The WASD mode can be enabled from the View menu.\\nThe keys can be remapped in the keybindings menu.\\nThe sensitivity can be changed in the settings under Preview, along with the movement plane.\\nHold Control to move faster.\",\n\t\t\"version\": \"1.2.2\",\n\t\t\"min_version\": \"4.3.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"skin_packager\": {\n\t\t\"title\": \"Minecraft Skin Pack Packager\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"icon\": \"icon-player\",\n\t\t\"description\": \"Create Skin Packs for the Minecraft Marketplace\",\n\t\t\"about\": \"Generates skin packs for the Minecraft Marketplace.\\n\\nAll textures in all open tabs count as skins. You can load individual skins into Blockbench via **File** > **Import Minecraft Skins**.\\n\\nYou can also create new skins via **New** > **Minecraft Skin**, in the File menu or on the start screen.\\n\\nExport a skin pack via **File** > **Export** > **Export Skin Pack**.\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\", \"Minecraft Marketplace\"],\n\t\t\"version\": \"0.3.2\",\n\t\t\"min_version\": \"4.2.3\",\n\t\t\"variant\": \"desktop\"\n\t},\n\t\"tint_preview\": {\n\t\t\"title\": \"Tint Preview\",\n\t\t\"author\": \"MrCrayfish\",\n\t\t\"description\": \"Quickly preview a color on tint enabled faces!\",\n\t\t\"icon\": \"fa-fill\",\n\t\t\"version\": \"1.1.2\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.3.0\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"about\": \"Tint Preview is a tool to help designers who work with the tint face feature of Java Block/Item models. It features the ability to quickly preview a color on tint enabled faces. Tint Preview adds two new actions to the Tools menu that allows you to toggle tinting and change the tint color.\\n**Important:** This plugin is designed for Java Block/Item models only and will not work for other formats.\"\n\t},\n\t\"pie_menu\": {\n\t\t\"title\": \"Pie Menus\",\n\t\t\"icon\": \"fas.fa-chart-pie\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"description\": \"Add pie shaped menus for faster work.\",\n\t\t\"about\": \"<style>.piePrivate p{width: fit-content;display: inline;margin-left: 10px !important;}.piePrivate tr td:nth-child(2){padding-left:10px}.piePrivate2 td, .piePrivate2 th{padding:0 10px}</style><h1>Built-in Pies</h1><table class=piePrivate><tr>    <td>Add Pie</td>    <td>Keybind: </td>    <td><p><code>ctrl + shift + a</code></p></td></tr><tr>    <td>Import Pie</td>    <td>Keybind: </td>    <td><p><code>shift + q</code></p></td></tr><tr>    <td>Export Pie</td>    <td>Keybind: </td>    <td><p><code>shift + w</code></p></td></tr><tr>    <td>Mode Pie</td>    <td>Keybind: </td>    <td><p><code>shift + tab (web: shift + x)</code></p></td></tr><tr>    <td>View Mode Pie</td>    <td>Keybind: </td>    <td><p><code>alt + z</code></p></td></tr><tr>    <td>Toolbox Pie</td>    <td>Keybind: </td>    <td><p><code>shift + t</code></p></td></tr><tr>    <td>New Pie</td>    <td>Keybind: </td>    <td><p><code>shift + n</code></p></td></tr><tr>    <td>Preferences Pie</td>    <td>Keybind: </td>    <td><p><code>shift + o</code></p></td></tr><tr>    <td>Rotate Pie</td>    <td>Keybind: </td>    <td><p><code>shift + r</code></p></td></tr><tr>    <td>Flip Pie</td>    <td>Keybind: </td>    <td><p><code>shift + f</code></p></td></tr><tr>    <td>Center Pie</td>    <td>Keybind: </td>    <td><p><code>shift + c</code></p></td></tr><tr>    <td>Properties Pie</td>    <td>Keybind: </td>    <td><p><code>shift + p</code></p></td></tr></table><h1>API</h1><h2>CSS Variables</h2><table class=piePrivate2><tr><th>Name</th><th>Default</th><th>Description</th></tr><tr><td>--pie-dir_idct_size</td><td>10%</td><td>sets the angle indicator size</td></tr><tr><td>--pie-major_radius</td><td>30px</td><td>sets the center pie's radius</td></tr><tr><td>--pie-major_thickness</td><td>22px</td><td>sets the center pie's thickness</td></tr></table>\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Interface\"]\n\t},\n\t\"quick_box_uv_layout\": {\n\t\t\"title\": \"Quick Box-UV Layout\",\n\t\t\"author\": \"Manuel-3\",\n\t\t\"description\": \"Button that changes UV of a Per-face cube into Box-UV layout.\",\n\t\t\"icon\": \"calendar_view_month\",\n\t\t\"version\": \"0.0.1\",\n\t\t\"variant\": \"both\",\n\t\t\"about\": \"This plugin simply adds a button that rearranges your individual Per-face UV rectangles in the same way Box-UV mode would. This is handy if you want to use the standard Box-UV format, but also have the flexibility of Per-face UV mode.\"\n\t},\n\t\"animation_to_java\": {\n\t\t\"title\": \"Animation to Java Converter\",\n\t\t\"author\": \"MG, Vincent_Huto(PR), DailyCraft(PR), MarcusSlover(PR)\",\n\t\t\"description\": \"Converts Blockbench animations to Java code for the new 1.19+ keyframe system.\",\n\t\t\"icon\": \"fa-cube\",\n\t\t\"version\": \"1.2.0\",\n\t\t\"max_version\": \"4.12.9\",\n\t\t\"variant\": \"both\",\n\t\t\"about\": \"This plugin exports your Blockbench animations as Java code to be used for the new 1.19+ keyframe system. Please note that this system does not support Molang or step interpolation.\",\n\t\t\"deprecation_note\": \"This feature is now built into Blockbench, the plugin is no longer required.\",\n\t\t\"tags\": [\"Deprecated\", \"Minecraft: Java Edition\"]\n\t},\n\t\"root_motion_extractor\": {\n\t\t\"title\": \"Root Motion Extractor\",\n\t\t\"icon\": \"fa-exchange\",\n\t\t\"author\": \"Tschipp\",\n\t\t\"description\": \"Attempts to extract root motion from an animation\",\n\t\t\"about\": \"This plugin extracts the velocity in m/s for an animation, and provides a value to be used in a movement component to achieve that exact speed. This helps reduce/eliminate foot sliding.\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\", \"Animation\", \"Root Motion\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"ground_plane_editor\": {\n\t\t\"title\": \"Ground Plane Editor\",\n\t\t\"icon\": \"icon-format_free\",\n\t\t\"author\": \"SirJain\",\n\t\t\"description\": \"Edits the opacity and color of the ground plane feature in Blockbench.\",\n\t\t\"about\": \"This simple plugin allows you to customize the ground plane feature in Blockbench; more specifically, the opacity and color.\\n## How to use\\nTo use this plugin, simply go to `Tools > Ground Plane Editor`, fill out the appropriate categories, and hit `Done`. You can choose to edit either the color, the opacity, or both!\\n\\nPlease report any bugs or suggestions you may have.\",\n\t\t\"tags\": [\"Ground Plane\", \"Animation\", \"Customization\"],\n\t\t\"version\": \"1.1.1\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"custom_marker_colors\": {\n\t\t\"title\": \"Custom Marker Colors\",\n\t\t\"icon\": \"colorize\",\n\t\t\"author\": \"SirJain and Geode\",\n\t\t\"description\": \"Allows users to add their own marker colors.\",\n\t\t\"about\": \"To make a new custom marker, go to <b>Tools > Marker Colors > Add Custom Color</b> to get started with making your own custom marker color. Once you are done, click Confirm. You will now see your marker color in the default color list. And finally, if you ever choose to view or edit your marker colors, you can use <b>Tools > Marker Colors > Manage Marker Colors</b>\",\n\t\t\"tags\": [\"Marker Color\", \"Customize\", \"UX\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"resourcepack_packager\": {\n\t\t\"title\": \"Resourcepack Packager\",\n\t\t\"author\": \"leopoldhub\",\n\t\t\"description\": \"Export your java models and texture into a resourcepack\",\n\t\t\"icon\": \"fa-file-zipper\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Resourcepack\", \"Exporter\"],\n\t\t\"version\": \"1.0.1\",\n\t\t\"min_version\": \"4.4.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"grayscale_preview\": {\n\t\t\"title\": \"Grayscale Preview\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Adds a Grayscale preview mode. The mode can be toggled from the View menu.\",\n\t\t\"icon\": \"filter_b_and_w\",\n\t\t\"tags\": [\"Viewport\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.3.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"brush\": {\n\t\t\"title\": \"Brush Plus\",\n\t\t\"icon\": \"fa-brush\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"description\": \"Create/Use custom brushes with dynamic behavior!\",\n\t\t\"version\": \"1.0.1\",\n\t\t\"min_version\": \"4.4.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Paint\", \"Customization\", \"Interface\"]\n\t},\n\t\"smudge_brush\": {\n\t\t\"title\": \"Smudge Brush\",\n\t\t\"icon\": \"touch_app\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Adds a smudge brush to smear, soften, or blur details on textures and images\",\n\t\t\"tags\": [\"Brush\", \"Paint\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"creation_date\": \"2025-12-27\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"pluginstats\": {\n\t\t\"title\": \"Plugin Statistics\",\n\t\t\"icon\": \"trending_up\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"description\": \"View download statistics of your blockbench plugin\",\n\t\t\"version\": \"1.3.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Blockbench\", \"Plugins\", \"Development\"]\n\t},\n\t\"repeat_it\": {\n\t\t\"title\": \"Repeat It\",\n\t\t\"author\": \"Ocraftyone\",\n\t\t\"icon\": \"content_copy\",\n\t\t\"description\": \"Allows you to repeat cubes with a translation applied to each new object\",\n\t\t\"about\": \"Allows you to repeat cubes with a translation applied to each new object.\\n\\nAt this time, the only shape that can be copied are cubes, but this may be updated in the future.\",\n\t\t\"version\": \"0.0.1\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"cameras\": {\n\t\t\"title\": \"Cameras\",\n\t\t\"icon\": \"videocam\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Adds cameras to Blockbench. Cameras allow you to view the model from different angles, and can be animated to create camera paths.\",\n\t\t\"about\": \"Cameras can be added through the Edit menu. Enabling Split Screen from View > Split Screen is recommended to preview what the camera can see while editing it. Right-click the camera in the viewport to link or unlink it to the viewport.\",\n\t\t\"version\": \"1.2.2\",\n\t\t\"min_version\": \"4.5.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"image_centering\": {\n\t\t\"title\": \"Image Centering\",\n\t\t\"icon\": \"center_focus_strong\",\n\t\t\"author\": \"SirJain\",\n\t\t\"tags\": [\"Format: Image\", \"UX\"],\n\t\t\"description\": \"Adds a button and a keybind that centers the image viewport in an Image format.\",\n\t\t\"about\": \"This plugin adds a button that allows you to reset your viewport in the Image format.\\n## How to use\\nTo use this plugin, go to the brush toolbar (top of the image mode) and click the `Center Image Viewport` button. If it doesn't show up, make sure you are in the Image format. If you are, you can add the tool using the `Customize Toolbar` option. There will be a confirmation message displayed on-screen once you center the viewport.\\n\\nPlease report any bugs or suggestions you may have.\",\n\t\t\"version\": \"1.1.1\",\n\t\t\"min_version\": \"4.4.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"bbs_exporter\": {\n\t\t\"title\": \"BBS Model Ex/importer\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"McHorse\",\n\t\t\"description\": \"Adds actions to export/import models in BBS format, which is used by BBS mod.\",\n\t\t\"version\": \"1.3.1\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Exporter\", \"Importer\"],\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"has_changelog\": true\n\t},\n\t\"highlight_generator\": {\n\t\t\"title\": \"Highlight Mod Shape Generator\",\n\t\t\"icon\": \"fa-cube\",\n\t\t\"author\": \"ThatGravyBoat\",\n\t\t\"description\": \"Generates Shape JSONs for the Highlight mod. Mod can be found at: https://links.resourcefulbees.com/highlight\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"]\n\t},\n\t\"obj_animation_export\": {\n\t\t\"title\": \"OBJ Animation Exporter\",\n\t\t\"icon\": \"icon-objects\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Exports an animation to OBJ as an OBJ file sequence\",\n\t\t\"about\": \"To export, right click an animation and click Export OBJ Sequence.\",\n\t\t\"version\": \"0.1.0\",\n\t\t\"min_version\": \"4.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Exporter\"]\n\t},\n\t\"explorer\": {\n\t\t\"title\": \"Explorer\",\n\t\t\"icon\": \"fas.fa-folder-open\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Navigate the files in your project from the sidebar in Blockbench!\",\n\t\t\"tags\": [\"Files\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"5.1.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"has_changelog\": true\n\t},\n\t\"performance_audit\": {\n\t\t\"title\": \"Performance Audit\",\n\t\t\"icon\": \"network_check\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"description\": \"Find performance issues and bottlenecks in your Blockbench installation.\",\n\t\t\"about\": \"You can run a performance audit via Help > Audit Performance.\",\n\t\t\"version\": \"1.1.2\",\n\t\t\"min_version\": \"3.0.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"mc_text_generator\": {\n\t\t\"title\": \"Text Generator\",\n\t\t\"icon\": \"text_format\",\n\t\t\"author\": \"SirJain\",\n\t\t\"description\": \"Generates blocky text in cubes.\",\n\t\t\"about\": \"This plugin adds a button under the `Tools` menu that allows you to generate Minecraft-like text.\\n## How to use\\nTo use this plugin, go to `Tools > Generate Text`. Simply enter some text, configure your settings how you like, and press `Generate`!\\n\\nPlease report any bugs or suggestions you may have.\",\n\t\t\"tags\": [\"Deprecated\", \"Minecraft\", \"Font\"],\n\t\t\"version\": \"2.0.1\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"utility_flaggers\": {\n\t\t\"title\": \"Utility Flaggers\",\n\t\t\"icon\": \"lightbulb\",\n\t\t\"author\": \"SirJain and DerfX\",\n\t\t\"description\": \"Flashes elements based on template conditions.\",\n\t\t\"about\": \"This plugin allows you to flash elements that meet certain preset conditions on-screen.\\\\n## How to use\\\\nTo use this plugin, simply go to `Tools -> Utility Flaggers`. Pick a preset option, fill out your preferred settings, and press `Flag`!\",\n\t\t\"tags\": [\"Utility\", \"BoxUV\", \"Format: Generic Model\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"skin_mirror\": {\n\t\t\"title\": \"Skin Mirror\",\n\t\t\"icon\": \"icon-mirror_x\",\n\t\t\"author\": \"oectway\",\n\t\t\"description\": \"Tool that allows you to mirror the arms and legs of existing skins to the other side.\",\n\t\t\"about\": \"This plugin adds a button under the `Tools` menu that allows you to mirror the arms and legs of existing skins to the other side. Select the type of the skin: Alek (3 Pixel Arm, customSlim) or Steve (4 Pixel Arm, custom). Next, choose whether you want to mirror from left to right, or the other way around. If everything is correct, click \\\"Confirm\\\".\",\n\t\t\"tags\": [\"Minecraft\", \"Skins\"],\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.6.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"bamo\":{\n\t\t\"title\": \"BAMO Exporter\",\n\t\t\"author\": \"Ryytikki\",\n\t\t\"description\": \"Create custom Minecraft blocks without having to write a single line of code when paired with the BAMO mod.\",\n\t\t\"website\": \"https://www.curseforge.com/minecraft/mc-mods/bamo-block-and-move-on\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"0.5.1\",\n\t\t\"variant\": \"desktop\",\n\t\t\"new_repository_format\": true\n\t},\n\t\"animation_to_json\": {\n\t\t\"title\": \"Animation to JSON Converter\",\n\t\t\"author\": \"Gaming32\",\n\t\t\"description\": \"Converts Blockbench animations to the JSON format for the NeoForge mod loader\",\n\t\t\"icon\": \"fa-cube\",\n\t\t\"tags\": [\"Animation\", \"Minecraft: Java Edition\"],\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.0.1\"\n\t},\n\t\"azurelib_utils\": {\n\t\t\"title\": \"AzureLib Animator\",\n\t\t\"author\": \"AzureDoom, Eliot Lash, Gecko, McHorse\",\n\t\t\"icon\": \"azureicon.png\",\n\t\t\"description\": \"Create animated blocks, items, entity, and armor using the AzureLib library and plugin. This is a fork of Geckolib and cross compatibility will not be promised in the future.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\"],\n\t\t\"version\": \"2.1.2\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"new_repository_format\": true,\n\t\t\"await_loading\": true,\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2023-04-04\",\n\t\t\"contributes\": {\n\t\t\t\"formats\": [\"azure_model\"]\n\t\t},\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://wiki.azuredoom.com/\"\n\t},\n\t\"cube_inverter\": {\n\t\t\"title\": \"Cube Inverter\",\n\t\t\"author\": \"SirJain\",\n\t\t\"icon\": \"swap_horiz\",\n\t\t\"description\": \"Adds a button that inverts selected cube sizes.\",\n\t\t\"tags\": [\"Deprecated\"],\n\t\t\"about\": \"This plugin adds a button that inverts the size values of each selected cube.\\n## How to use\\nTo use this plugin, go to the toolbar at the top of the screen (the one with the move, resize, and rotation tools) and click the `Invert Cubes` button. If you don't see the button, make sure to select some cubes. The button is also keybinded with a default of `Shift + I`.\\n\\nPlease report any bugs or suggestions you may have.\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.2.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"figura_format\": {\n\t\t\"title\": \"Figura Model Format\",\n\t\t\"author\": \"Katt (KitCat962)\",\n\t\t\"icon\": \"icon.svg\",\n\t\t\"description\": \"Create models for the Figura mod in a custom format that optimizes Blockbench to work with Figura models.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Figura\"],\n\t\t\"version\": \"0.1.3\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"await_loading\": true,\n\t\t\"creation_date\": \"2023-07-22\"\n\t},\n\t\"rainbow_road_game\": {\n\t\t\"title\": \"Rainbow Road Game\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"The rainbow road racing minigame from April fools day 2024! Turn your model into a race car and take it for a spin!\",\n\t\t\"tags\": [\"Minigame\"],\n\t\t\"version\": \"0.1.1\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2024-04-1\"\n\t},\n\t\"cosmic_reach_model_editor\": {\n\t\t\"title\": \"Cosmic Reach Model Editor\",\n\t\t\"author\": \"Z. Hoeshin\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Allows creating, editing, importing and exporting Cosmic Reach block models.\",\n\t\t\"tags\": [\"Cosmic Reach\"],\n\t\t\"version\": \"2.2.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2024-04-19\",\n\t\t\"new_repository_format\": true,\n\t\t\"has_changelog\": true\n\t},\n\t\"emf_animation_addon\": {\n\t\t\"title\": \"EMF Animation Addon\",\n\t\t\"author\": \"Traben & Ewan Howell\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Adds extra animation support to CEM Template Loader so that it is compatible with the Entity Model Features mod.\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Entity Models\", \"Animation\"],\n\t\t\"version\": \"1.0.4\",\n\t\t\"min_version\": \"4.9.0\",\n\t\t\"variant\": \"both\",\n\t\t\"dependencies\": [\"cem_template_loader\"],\n\t\t\"creation_date\": \"2024-06-05\",\n\t\t\"has_changelog\": true\n\t},\n\t\"creative_mode\": {\n\t\t\"title\": \"Creative Mode\",\n\t\t\"author\": \"Caio Raphael\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Place and remove cubes just like in Minecraft creative mode\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"bedrock_block_transforms\": {\n\t\t\"title\": \"Bedrock Block Transformation Preview\",\n\t\t\"author\": \"JannisX11\",\n\t\t\"icon\": \"token\",\n\t\t\"description\": \"Edit and preview the Minecraft Bedrock Edition block transformation component\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.9.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\"]\n\t},\n\t\"pbr_preview\": {\n\t\t\"title\": \"PBR Tools\",\n\t\t\"author\": \"Jason J. Gardner\",\n\t\t\"await_loading\": true,\n\t\t\"creation_date\": \"2024-06-10\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Create and view PBR materials in Blockbench. Export textures for Java and RenderDragon shaders.\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://github.com/jasonjgardner/blockbench-plugins/\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.2.2\",\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Java Edition\",\n\t\t\t\"Minecraft: Bedrock Edition\",\n\t\t\t\"PBR\"\n\t\t],\n\t\t\"min_version\": \"4.10.4\",\n\t\t\"max_version\": \"4.11.9\"\n\t},\n\t\"tweaks_n_stuff\": {\n\t\t\"title\": \"Tweaks & Stuff\",\n\t\t\"author\": \"legopitstop\",\n\t\t\"creation_date\": \"2024-10-07\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Adds a few tweaks to Blockbench to make your modeling experience better.\",\n\t\t\"has_changelog\": true,\n\t\t\"website\": \"https://docs.lpsmods.dev/tweaks_n_stuff\",\n\t\t\"repository\": \"https://github.com/legopitstop/blockbench-plugins/tree/master/plugins/tweaks_n_stuff\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"tags\": [\"Blockbench\"]\n\t},\n\t\"meshy\": {\n\t\t\"title\": \"Meshy\",\n\t\t\"author\": \"Shadowkitten47\",\n\t\t\"creation_date\": \"2024-09-28\",\n\t\t\"icon\": \"diamond\",\n\t\t\"description\": \"Enables the use of a meshes in bedrock formats and to export them to Minecraft Bedrock\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.0.5\",\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Bedrock Edition\",\n\t\t\t\"Entity Models\",\n\t\t\t\"Mesh\"\n\t\t],\n\t\t\"has_changelog\": true,\n\t\t\"min_version\": \"4.10.4\",\n\t\t\"repository\": \"https://github.com/Shadowkitten47/Meshy\"\n\t},\n\t\"outliner_group_exporter\": {\n\t\t\"title\": \"Group Exporter\",\n\t\t\"author\": \"MrCrayfish\",\n\t\t\"creation_date\": \"2025-03-19\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"A simple plugin to allow you to export a group from the outliner as a model. Only cubes inside the group will be exported.\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Java Edition\"\n\t\t],\n\t\t\"has_changelog\": true,\n\t\t\"min_version\": \"4.10.1\",\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/outliner_group_exporter\"\n\t},\n\t\"export_to_blender\": {\n\t\t\"title\": \"Export to Blender\",\n\t\t\"author\": \"0x13F\",\n\t\t\"description\": \"Export your project as a Blender scene (.blend)\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"creation_date\": \"2025-04-16\",\n\t\t\"version\": \"2.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"min_version\": \"4.12.4\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Exporter\"\n\t\t],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_as_blender\"\n\t},\n\t\"farsight\": {\n\t\t\"title\": \"Farsight\",\n\t\t\"author\": \"Luther Gray\",\n\t\t\"icon\": \"visibility\",\n\t\t\"description\": \"Increases the Clipping Distance of Blockbench to see much larger maps & levels (configurable).\",\n\t\t\"version\": \"1.0.1\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"reexport_on_save\": {\n\t\t\"title\": \"Re-export on Save\",\n\t\t\"author\": \"0x13F\",\n\t\t\"description\": \"Automatically re-export your project when saving\",\n\t\t\"icon\": \"output\",\n\t\t\"creation_date\": \"2025-04-18\",\n\t\t\"version\": \"2.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"min_version\": \"4.12.4\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Exporter\",\n\t\t\t\"Utility\"\n\t\t],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/reexport_on_save\"\n\t},\n\t\"repeating_textures\": {\n\t\t\"title\": \"Repeating Textures\",\n\t\t\"author\": \"0x13F\",\n\t\t\"description\": \"Enables repeating textures\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"creation_date\": \"2025-06-15\",\n\t\t\"version\": \"3.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.12.4\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Texture\",\n\t\t\t\"Viewport\",\n\t\t\t\"Utility\"\n\t\t],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/repeating_textures\"\n\t},\n\t\"export_to_3mf\": {\n\t\t\"title\": \"Export to 3MF\",\n\t\t\"author\": \"Ayden Hodgins-de Jonge\",\n\t\t\"description\": \"Export geometry as 3MF for 3D printing\",\n\t\t\"tags\": [\"Exporter\", \"3D Printing\", \"3MF\"],\n\t\t\"icon\": \"icon.png\",\n\t\t\"variant\": \"both\",\n\t\t\"version\": \"0.0.1\",\n\t\t\"creation_date\": \"2025-07-02\",\n\t\t\"min_version\": \"4.12.5\",\n\t\t\"has_changelog\": false,\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/export_to_3mf\"\n\t},\n\t\"shaper\": {\n\t\t\"title\": \"Shaper\",\n\t\t\"author\": \"Vowxky\",\n\t\t\"description\": \"Support tool for the Shaper mod that helps create and export hitboxes. Exports Voxel Shapes as a flat JSON list with scope selection for easier editing and reuse.\",\n\t\t\"icon\": \"bar_chart\",\n\t\t\"creation_date\": \"2025-08-26\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Minecraft\",\n\t\t\t\"Utility\",\n\t\t\t\"Exporter\"\n\t\t],\n\t\t\"bug_tracker\": \"https://github.com/vowxky/blockbench-plugins/issues?title=[Shaper]\"\n\t},\n\t\"bone_view\": {\n\t\t\"title\": \"Bone View\",\n\t\t\"author\": \"codename-B\",\n\t\t\"description\": \"Toggleable view to visualize group pivots and their connections as bones (Blender-like).\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"tags\": [\n\t\t\t\"Animation\",\n\t\t\t\"Rigging\",\n\t\t\t\"Viewport\"\n\t\t],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.12.6\",\n\t\t\"variant\": \"both\",\n\t\t\"has_changelog\": true,\n\t\t\"creation_date\": \"2025-09-17\",\n\t\t\"repository\": \"https://github.com/codename-B/bone-view\"\n\t},\n\t\"texture_filtering\": {\n\t\t\"title\": \"Texture Filtering\",\n\t\t\"author\": \"HeyItsDuke, 0x13F\",\n\t\t\"description\": \"Toggles between Nearest (Pixelated, Blockbench default) and Linear texture filtering (Soft/Blurry)\",\n\t\t\"icon\": \"deblur\",\n\t\t\"creation_date\": \"2025-09-01\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.12.4\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\"Texture'\", \"Viewport\", \"Utility\"],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/texture_filtering\"\n\t},\n\t\"transparency_fix\": {\n\t\t\"title\": \"Transparency Fix\",\n\t\t\"author\": \"Larsonix\",\n        \"description\": \"Shows objects inside transparent containers (glass, windows, etc.)\",\n        \"about\": \"This plugin fixes the visibility of objects inside transparent containers by adjusting render order.\\n\\n## Features\\n- Auto-detects transparent textures by scanning alpha values\\n- Name-based detection (glass, window, crystal, ice, liquid, glow, etc.)\\n- Geometry detection - finds cubes inside transparent containers\\n\\n## Usage\\nGo to **View > Toggle Transparency Fix** to enable/disable.\",\n        \"icon\": \"visibility\",\n        \"version\": \"2.1.0\",\n        \"min_version\": \"4.0.0\",\n        \"variant\": \"both\",\n        \"tags\": [\"Rendering\", \"Utility\"]\n    },\n\t\"translation_plane_gizmo\": {\n\t\t\"title\": \"Translation Plane Gizmo\",\n\t\t\"author\": \"AnnJ\",\n\t\t\"description\": \"Enhanced 2D plane gizmo for simultaneous multi-axis translation\",\n\t\t\"icon\": \"control_camera\",\n\t\t\"version\": \"1.0.1\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Gizmo\", \"Translation\", \"Tools\"],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/translation_plane_gizmo\"\n\t},\n\t\"gltf_importer\": {\n\t\t\"title\": \"glTF Importer\",\n\t\t\"author\": \"0x13F\",\n\t\t\"description\": \"Import .GLTF and .GLB models\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"creation_date\": \"2025-09-25\",\n\t\t\"version\": \"1.1.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"min_version\": \"4.12.6\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Format: Generic Model\",\n\t\t\t\"Importer\"\n\t\t],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/gltf_importer\"\n\t},\n\t\"java_block_sequencer\": {\n\t\t\"title\": \"Java Block Sequencer\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"author\": \"Jatzylap\",\n\t\t\"description\": \"Exports an animation into a sequence of Minecraft block/item models.\",\n    \t\"tags\": [\"Minecraft: Java Edition\", \"Exporter\", \"Animation\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"5.0.5\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2025-12-27\",\n\t\t\"has_changelog\": true,\n\t\t\"repository\": \"https://github.com/Jatzylap/Java-Block-Sequencer\"\n\t},\n\t\"texture_downscaler\": {\n\t\t\"title\": \"Texture Downscaler\",\n\t\t\"author\": \"0x13F\",\n\t\t\"description\": \"Downscale textures non-destructively\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"creation_date\": \"2025-10-26\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"desktop\",\n\t\t\"min_version\": \"5.0.3\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Texture\",\n\t\t\t\"Viewport\",\n\t\t\t\"Utility\"\n\t\t],\n\t\t\"repository\": \"https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/texture_downscaler\"\n\t},\n\t\"block_multi_collisions\": {\n\t\t\"title\": \"Block Multi-Collision Editor\",\n\t\t\"author\": \"minato4743\",\n        \"description\": \"This Plugin allow you to make and generate multiple collision boxes for Minecraft Bedrock blocks.\",\n\t\t\"icon\": \"icon.svg\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.12.6\",\n\t\t\"has_changelog\": true,\n\t\t\"tags\": [\n\t\t\t\"Minecraft: Bedrock Edition\",\n\t\t\t\"Format: Bedrock Block\"\n\t\t],\n\t\t\"repository\": \"https://github.com/MinecraftBedrockArabic/blockbench-plugins/tree/master/plugins/block_multi_collisions\"\n\t},\n\t\"hytale_avatar_loader\": {\n\t\t\"title\": \"Hytale Avatar Loader\",\n\t\t\"author\": \"PasteDev\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"description\": \"Loads Hytale avatar models with textures and colors from local JSON files or crafthead.net. Automatically applies gradient maps to greyscale textures based on color selections and imports default animations.\",\n\t\t\"tags\": [\"Hytale\"],\n\t\t\"version\": \"1.2.0\",\n\t\t\"min_version\": \"5.0.7\",\n\t\t\"variant\": \"desktop\",\n\t\t\"creation_date\": \"2026-01-16\",\n\t\t\"website\": \"https://pastelito.dev\",\n\t\t\"has_changelog\": true,\n\t\t\"repository\": \"https://github.com/PasteDev/blockbench-plugins/tree/master/plugins/hytale_avatar_loader\"\n\t},\n  \t\"hytale_hitbox_helper\": {\n\t\t\"title\": \"Hytale Hitbox Helper\",\n\t\t\"author\": \"Marck.A.A\",\n\t\t\"version\": \"1.0.1\",\n\t\t\"description\": \"Dedicated tool to create Hytale hitboxes and JSON export.\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"tags\": [\"Hytale\"]\t\n\t},\n\t\"baked_ambient_occlusion\": {\n\t\t\"title\": \"Mr Salmon's Baked Ambient Occlusion\",\n    \t\"author\": \"Kai Salmon\",\n\t\t\"description\": \"Baked Ambient Occlusion, creating instant shading\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\",\n\t\t\"repository\": \"https://github.com/kaisalmon/MrSalmonsBlockbenchBakedAmbientOcclusion\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Texture\",\n\t\t\t\"Shading\"\n\t\t]\n\t},\n\t\"hytale_bridge\": {\n\t\t\"title\": \"Hytale Bridge\",\n\t\t\"author\": \"Tazer\",\n\t\t\"icon\": \"icon.png\",\n\t\t\"version\": \"0.1.1\",\n\t\t\"description\": \"A Hytale/Blockbench plugin that bridges the two together seamlessly and effortlessly\",\n\t\t\"tags\": [\"Hytale\"],\n\t\t\"dependencies\": [\"hytale_plugin\"],\n\t\t\"variant\": \"desktop\",\n\t\t\"min_version\": \"5.0.7\",\n\t\t\"creation_date\": \"2026-02-10\",\n\t\t\"await_loading\": true,\n\t\t\"has_changelog\": true,\n\t\t\"repository\": \"https://github.com/tazercopter/Hytale-Blockbench-Bridge\",\n\t\t\"bug_tracker\": \"https://github.com/tazercopter/Hytale-Blockbench-Bridge/issues\"\n\t},\n\t\"no_java_limits\": {\n\t\t\"title\": \"No Java Limits\",\n\t\t\"author\": \"Rajdacz\",\n\t\t\"description\": \"Allows creating infinite-sized models for use in display entities.\",\n\t\t\"icon\": \"zoom_out_map\",\n\t\t\"tags\": [\"Minecraft: Java Edition\", \"Display Entities\"],\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"variant\": \"both\"\n\t},\n\t\"menu_icon_exporter\": {\n\t\t\"title\": \"Menu Icon Exporter\",\n\t\t\"author\": \"NET\",\n\t\t\"description\": \"Export perfect menu/item icons with advanced camera controls\",\n\t\t\"icon\": \"icon.svg\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"variant\": \"both\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"new_repository_format\": true,\n\t\t\"creation_date\": \"2026-03-15\",\n\t\t\"has_changelog\": false,\n\t\t\"tags\": [\n\t\t\t\"Minecraft\",\n\t\t\t\"Utility\",\n\t\t\t\"Export\"\n\t\t],\n\t\t\"repository\": \"https://github.com/HMC-Studios/Menu-Icon-Exporter\",\n\t\t\"bug_tracker\": \"https://github.com/HMC-Studios/Menu-Icon-Exporter/issues\"\n\t},\n\t\"expand_bone_timeline\": {\n\t\t\"title\": \"Expand Bone Timeline\",\n\t\t\"author\": \"zzz1999\",\n\t\t\"icon\": \"account_tree\",\n\t\t\"tags\": [\"Animation\", \"Timeline\"],\n\t\t\"version\": \"2.2.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"description\": \"Show or hide a bone and all its child bone animators in the timeline from the outliner context menu.\",\n\t\t\"variant\": \"both\",\n\t\t\"creation_date\": \"2026-03-21\",\n\t\t\"has_changelog\": false,\n\t\t\"repository\": \"https://github.com/zzz1999/expand_bone_timeline\",\n\t\t\"bug_tracker\": \"https://github.com/zzz1999/expand_bone_timeline/issues\"\n\t},\n\t\"let_there_be_noise\": {\n\t\t\"title\": \"Let there Be Noise\",\n\t\t\"author\": \"Momoko\",\n\t\t\"icon\": \"grain\",\n\t\t\"description\": \"Adds a noise adding function to BlockBench, supports selections and colour channels\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"creation_date\": \"2026-03-25\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Texture\", \"Paint\", \"Tool\"]\n\t},\n\t\"easings\": {\n\t\t\"title\": \"Easings\",\n\t\t\"author\": \"Svdex\",\n\t\t\"version\": \"1.0.0\",\n\t\t\"description\": \"Apply easing functions to Minecraft: Bedrock Edition animations.\",\n\t\t\"icon\": \"stacked_line_chart\",\n\t\t\"variant\": \"both\",\n\t\t\"tags\": [\"Minecraft: Bedrock Edition\", \"Animation\"],\n\t\t\"website\": \"https://svdex.moe\",\n\t\t\"min_version\": \"4.8.0\",\n\t\t\"has_changelog\": true\n\t}\n}\n"
  },
  {
    "path": "schema.json",
    "content": "{\n\t\"$id\": \"https://blockbench.net/plugins.schema.json\",\n\t\"$schema\": \"http://json-schema.org/draft-07/schema#\",\n\t\"type\": \"object\",\n\t\"propertyNames\": {\n\t\t\"pattern\": \"^[a-z0-9._-]+$\"\n\t},\n\t\"additionalProperties\": {\n\t\t\"type\": \"object\",\n\t\t\"required\": [\"title\", \"author\", \"icon\", \"description\", \"version\"],\n\t\t\"properties\": {\n\t\t\t\"title\": {\n\t\t\t\t\"type\": \"string\"\n\t\t\t},\n\t\t\t\"icon\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"The plugin icon. Icons can be either PNG files with a resolution of 48x48, or they can be SVG files.\"\n\t\t\t},\n\t\t\t\"author\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Name of the author or authors\"\n\t\t\t},\n\t\t\t\"description\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Short plugin description\"\n\t\t\t},\n\t\t\t\"about\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Plugin about text. Markdown is supported. For longer about pages, a separate about.md file is recommended.\"\n\t\t\t},\n\t\t\t\"tags\": {\n\t\t\t\t\"type\": \"array\",\n\t\t\t\t\"description\": \"Plugin tags. Up to 3 tags are allowed\",\n\t\t\t\t\"items\": {\n\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"version\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Plugin version\"\n\t\t\t},\n\t\t\t\"variant\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Supported Blockbench variant\",\n\t\t\t\t\"enum\": [\"desktop\", \"web\", \"both\"]\n\t\t\t},\n\t\t\t\"min_version\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Minimum required Blockbench version. Versions 4.7.x and below use the legacy repository structure, where the plugin file is directly stored in the plugins directory.\"\n\t\t\t},\n\t\t\t\"deprecation_note\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Reason for plugin deprecation. Used alongside the 'Deprecated' tag\"\n\t\t\t},\n\t\t\t\"website\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"URL to website of the plugin, if applicable\"\n\t\t\t},\n\t\t\t\"repository\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"URL to Git repository of the plugin, if applicable\"\n\t\t\t},\n\t\t\t\"bug_tracker\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"URL to the bug tracker of the plugin, if applicable. If unspecified, links to this repository.\"\n\t\t\t},\n\t\t\t\"await_loading\": {\n\t\t\t\t\"type\": \"boolean\",\n\t\t\t\t\"description\": \"When set to true, Blockbench waits for this plugin to finish loading before opening double-clicked files etc. This is useful for plugins that add their own file formats that need to be considered when opening files.\"\n\t\t\t},\n\t\t\t\"creation_date\": {\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"description\": \"Date of the original release of the plugin, as YYYY/MM/DD\"\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "scripts/validate.js",
    "content": "import vm from \"node:vm\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { compareVersions } from \"compare-versions\";\nimport PLUGINS_JSON_META from '../plugins.json' with {type: \"json\"};\nimport imageSize from \"image-size\";\n\nfunction logError(error) {\n\tlet prefix = CHANGED_FILES ? '::error::' : '';\n\tconsole.error(prefix + error);\n\tprocess.exitCode = 1;\n}\n\nlet PLUGIN_ID = process.argv[2];\nlet CHANGED_FILES = process.env.CHANGED_FILES;\n\n// Changed files\nif (CHANGED_FILES) {\n\tlet changes = CHANGED_FILES.replace(/\\//g, '/').split('\\n');\n\tif (!PLUGIN_ID) {\n\t\tfor (let path of changes) {\n\t\t\tif (path.startsWith('plugins/')) {\n\t\t\t\tPLUGIN_ID = path.split(/[/.]/)[1];\n\t\t\t\tconsole.log(\"::debug::Found Plugin ID: \"+PLUGIN_ID);\n\t\t\t}\n\t\t}\n\t}\n\n\tlet allowed_paths = [\n\t\t'plugins.json',\n\t\t`plugins/${PLUGIN_ID}`,\n\t\t`src/${PLUGIN_ID}`,\n\t];\n\tfor (let path of changes) {\n\t\tif (!allowed_paths.some(match => path.startsWith(match))) {\n\t\t\tlogError(`Modifying \"${path}\" is not permitted as an update for \"${PLUGIN_ID}\"`);\n\t\t}\n\t}\n}\n\n// ID\nif (!PLUGIN_ID) {\n\tlogError(\"Plugin ID is not specified\");\n\tprocess.exit();\n}\nif (!PLUGIN_ID.match(/^[a-z][a-z0-9_]+$/)) {\n\tlogError(`Plugin ID \"${PLUGIN_ID}\" is not valid snake case`);\n}\n\nlet json_meta = PLUGINS_JSON_META[PLUGIN_ID];\nlet id = '';\nlet source_meta = {};\n\nif (!json_meta) {\n\tlogError(`Plugin with ID \"${PLUGIN_ID} not found in plugins.json\"`);\n\tprocess.exit();\n}\n\nconst NEW_FORMAT = (json_meta.min_version && compareVersions(json_meta.min_version, '4.8.0') != -1)\n\t|| json_meta.new_repository_format;\nconst BASE_PATH = path.join(import.meta.dirname, '..', NEW_FORMAT ? 'plugins/'+PLUGIN_ID : 'plugins');\n\nlet content_js = '';\ntry {\n\tcontent_js = fs.readFileSync(path.resolve(BASE_PATH, PLUGIN_ID + '.js'));\n} catch (err) {\n\tlogError(\"Could not find plugin source file at \" + path.resolve(BASE_PATH, PLUGIN_ID + '.js'));\n\tprocess.exit();\n}\n\n// Create sandbox to run plugin without errors\nconst Plugin = {\n\tregister(_id, _options) {\n\t\tid = _id;\n\t\tsource_meta = _options;\n\t}\n}\nconst wildcard = new Proxy(function () {}, {\n\tget(target, prop) {\n\t\tif (prop === Symbol.toPrimitive) {\n\t\t\treturn () => '';\n\t\t}\n\t\tif (prop === 'toString') {\n\t\t\treturn () => '';\n\t\t}\n\t\tif (prop === 'valueOf') {\n\t\t\treturn () => '';\n\t\t}\n\t\treturn wildcard;\n\t},\n\tapply(target, thisArg, args) {\n\t\treturn wildcard; // calling it returns wildcard\n\t},\n\tconstruct(target, args) {\n\t\treturn wildcard; // new wildcard() returns wildcard\n\t}\n});\n// Sandbox that pretends every global exists\nconst sandbox = new Proxy({\n\tPlugin,\n\tBBPlugin: Plugin,\n}, {\n\thas() {\n\t\treturn true; // \"yes, this global exists\"\n\t},\n\tget(target, prop) {\n\t\tif (prop in target) return target[prop];\n\t\treturn wildcard;\n\t}\n});\n\nvm.createContext(sandbox);\nvm.runInContext(content_js, sandbox);\n\n\nif (!source_meta) {\n\tlogError(\"Could not find metadata in source file\");\n\tprocess.exit();\n}\n\nif (id != PLUGIN_ID) {\n\tlogError(`Plugin ID \"${PLUGIN_ID}\" does not match value \"${id}\"`);\n}\n\n// Required fields check\nconst REQUIRED_FIELDS = [\"title\", \"author\", \"icon\", \"description\", \"version\"];\nif (REQUIRED_FIELDS.some(key => !json_meta[key])) {\n\tlet fields = REQUIRED_FIELDS.filter(key => !json_meta[key]).map(name => `\"${name}\"`);\n\tlogError(`Required fields ${fields.join()} missing in plugins.json entry`);\n}\n\n// Metadata match\nconst KNOWN_FIELDS = [\n\t\"title\",\n\t\"icon\",\n\t\"author\",\n\t\"description\",\n\t\"about\",\n\t\"tags\",\n\t\"items\",\n\t\"version\",\n\t\"variant\",\n\t\"min_version\",\n\t\"deprecation_note\",\n\t\"website\",\n\t\"repository\",\n\t\"bug_tracker\",\n\t\"await_loading\",\n\t\"creation_date\",\n];\nlet all_fields = new Set([...KNOWN_FIELDS, ...Object.keys(json_meta)]);\nfor (let key of all_fields) {\n\tconst a = JSON.stringify(json_meta[key]);\n\tconst b = JSON.stringify(source_meta[key]);\n\tif (a != b) {\n\t\tlogError(`Metadata mismatch: \"${key}\" is set to ${a} in plugins.json and ${b} in JS file`);\n\t}\n}\n\n// About\nif (NEW_FORMAT && json_meta.about) {\n\tlogError(`About text specified in meta data. In format version 4.8 or newer, about text should be in about.md`);\n}\n\n// Changelog\nif (json_meta.has_changelog && !NEW_FORMAT) {\n\tlogError(\"Changelog is not supported in legacy format\");\n}\nif (json_meta.has_changelog) {let content_js = '';\n\tlet changelog_path = path.resolve(BASE_PATH, 'changelog.json');\n\ttry {\n\t\tlet changelog_content = fs.readFileSync(changelog_path);\n\t\tJSON.parse(changelog_content)\n\t} catch (err) {\n\t\tlogError(\"Could not load changelog: \" + err);\n\t\tprocess.exit();\n\t}\n}\n\n// Icon validation\nif (json_meta.icon && (json_meta.icon.endsWith('.png') || json_meta.icon.endsWith('.svg'))) {\n\tlet icon_path = path.resolve(BASE_PATH, json_meta.icon);\n\tif (!fs.existsSync(icon_path)) {\n\t\tlogError(`Could not find icon at \"${icon_path}\"`);\n\t} else {\n\t\tlet buffer = fs.readFileSync(icon_path);\n\t\tif (buffer.length > 12_000) {\n\t\t\tlogError(`Icon is too large at ${buffer.length/1000} KB, maximum is 12 KB`);\n\t\t}\n\t\tif (json_meta.icon.endsWith('.png')) {\n\t\t\tlet dimensions = imageSize(buffer);\n\t\t\tif (dimensions.width > 96 || dimensions.height > 96) {\n\t\t\t\tlogError(`Icon size is larger than the limit of 96x96`);\n\t\t\t}\n\t\t\tif (dimensions.width != dimensions.height) {\n\t\t\t\tlogError(`Icon is not square`);\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Semver\n//const SEMVER_REGEX = /^\\d+\\.\\d+\\.\\d+(-[a-z]+\\.\\d+)?$/;\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\nfunction validateVersion(v) {\n\tif (!v.match(SEMVER_REGEX)) {\n\t\tlogError(`\"${v}\" is not a valid version number. See semver.org`)\n\t}\n}\nvalidateVersion(json_meta.version);\nvalidateVersion(source_meta.version);\n\n// Pass?\nif (!process.exitCode) {\n\tconsole.log(`Plugin \"${PLUGIN_ID}\" passed validation with no errors!`);\n}\n"
  },
  {
    "path": "src/azurelib_utils/.eslintignore",
    "content": "webpack.config.js\r\n"
  },
  {
    "path": "src/azurelib_utils/.eslintrc.json",
    "content": "{\r\n  \"env\": {\r\n    \"browser\": true,\r\n    \"es2015\": true,\r\n    \"jquery\": true\r\n  },\r\n  \"extends\": \"eslint:recommended\",\r\n  \"parserOptions\": {\r\n    \"ecmaVersion\": 11,\r\n    \"sourceType\": \"module\"\r\n  },\r\n  \"globals\": {\r\n    \"isApp\": \"readonly\",\r\n    \"display\": \"readonly\",\r\n    \"settings\": \"readonly\",\r\n    \"Animator\": \"readonly\",\r\n    \"Blockbench\": \"readonly\",\r\n    \"Keyframe\": \"readonly\",\r\n    \"BarItems\": \"readonly\",\r\n    \"Format\": \"readonly\",\r\n    \"Action\": \"readonly\",\r\n    \"MenuBar\": \"readonly\",\r\n    \"Project\": \"readonly\",\r\n    \"Cube\": \"readonly\",\r\n    \"Canvas\": \"readonly\",\r\n    \"Undo\": \"readonly\",\r\n    \"ModelFormat\": \"readonly\",\r\n    \"Timeline\": \"readonly\",\r\n    \"BoneAnimator\": \"readonly\",\r\n    \"Codecs\": \"readonly\",\r\n    \"Codec\": \"readonly\",\r\n    \"Merge\": \"readonly\",\r\n    \"Modes\": \"readonly\",\r\n    \"ModelMeta\": \"readonly\",\r\n    \"Group\": \"readonly\",\r\n    \"Outliner\": \"readonly\",\r\n    \"Dialog\": \"readonly\",\r\n    \"DisplayMode\": \"readonly\"\r\n  },\r\n  \"rules\": {\r\n    \"no-console\": \"error\"\r\n  }\r\n}"
  },
  {
    "path": "src/azurelib_utils/.gitignore",
    "content": "# Logs\r\nlogs\r\n*.log\r\nnpm-debug.log*\r\nyarn-debug.log*\r\nyarn-error.log*\r\nlerna-debug.log*\r\n\r\n# Diagnostic reports (https://nodejs.org/api/report.html)\r\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\r\n\r\n# Runtime data\r\npids\r\n*.pid\r\n*.seed\r\n*.pid.lock\r\n\r\n# Directory for instrumented libs generated by jscoverage/JSCover\r\nlib-cov\r\n\r\n# Coverage directory used by tools like istanbul\r\ncoverage\r\n*.lcov\r\n\r\n# nyc test coverage\r\n.nyc_output\r\n\r\n# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)\r\n.grunt\r\n\r\n# Bower dependency directory (https://bower.io/)\r\nbower_components\r\n\r\n# node-waf configuration\r\n.lock-wscript\r\n\r\n# Compiled binary addons (https://nodejs.org/api/addons.html)\r\nbuild/Release\r\n\r\n# Dependency directories\r\nnode_modules/\r\njspm_packages/\r\n\r\n# Snowpack dependency directory (https://snowpack.dev/)\r\nweb_modules/\r\n\r\n# TypeScript cache\r\n*.tsbuildinfo\r\n\r\n# Optional npm cache directory\r\n.npm\r\n\r\n# Optional eslint cache\r\n.eslintcache\r\n\r\n# Microbundle cache\r\n.rpt2_cache/\r\n.rts2_cache_cjs/\r\n.rts2_cache_es/\r\n.rts2_cache_umd/\r\n\r\n# Optional REPL history\r\n.node_repl_history\r\n\r\n# Output of 'npm pack'\r\n*.tgz\r\n\r\n# Yarn Integrity file\r\n.yarn-integrity\r\n\r\n# dotenv environment variables file\r\n.env\r\n.env.test\r\n\r\n# parcel-bundler cache (https://parceljs.org/)\r\n.cache\r\n.parcel-cache\r\n\r\n# Next.js build output\r\n.next\r\nout\r\n\r\n# Nuxt.js build / generate output\r\n.nuxt\r\ndist\r\n\r\n# Gatsby files\r\n.cache/\r\n# Comment in the public line in if your project uses Gatsby and not Next.js\r\n# https://nextjs.org/blog/next-9-1#public-directory-support\r\n# public\r\n\r\n# vuepress build output\r\n.vuepress/dist\r\n\r\n# Serverless directories\r\n.serverless/\r\n\r\n# FuseBox cache\r\n.fusebox/\r\n\r\n# DynamoDB Local files\r\n.dynamodb/\r\n\r\n# TernJS port file\r\n.tern-port\r\n\r\n# Stores VSCode versions used for testing VSCode extensions\r\n.vscode-test\r\n\r\n# yarn v2\r\n.yarn/cache\r\n.yarn/unplugged\r\n.yarn/build-state.yml\r\n.yarn/install-state.gz\r\n.pnp.*\r\n"
  },
  {
    "path": "src/azurelib_utils/.nvmrc",
    "content": "v12.16.2\r\n"
  },
  {
    "path": "src/azurelib_utils/LICENSE_Geckolib",
    "content": "MIT License\n\nCopyright (c) 2024 GeckoThePecko\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 all\ncopies 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 THE\nSOFTWARE.\n"
  },
  {
    "path": "src/azurelib_utils/animation/azure-animation-tab.js",
    "content": "/**\n * AzureLib Animator — Unified Animation Tab\n * ------------------------------------------\n * Replaces the Minecraft Bedrock animation tab with a fully custom\n * AnimationCodec that supports both AzureLib custom easings AND\n * Bedrock catmullrom/lerp_mode keyframes in one unified JSON.\n *\n * Keyframe schema auto-detection:\n *   - AzureLib:  { \"vector\": [...], \"easing\": \"easeInSine\", \"easingArgs\": [...] }\n *   - Bedrock:   { \"post\": [...], \"lerp_mode\": \"catmullrom\" }\n *   - Both can coexist in the same animation file.\n *\n * Built on Blockbench's AnimationCodec API — no monkey-patching of\n * Animator.buildFile / Animator.loadFile, no hiding of built-in menu items.\n *\n * © 2025 AzureDoom — MIT License\n */\n\nimport { EASING_TYPES, EASING_DEFAULT, easingRegistry, hasArgs, getEasingArgDefault, parseEasingArg } from './azure-easing.js';\nimport { invertMolang } from '../core/azure-utils.js';\nimport { IKManager } from './azure-ik.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nexport const AZURE_ANIM_FORMAT_ID = 'azure_animation';\nexport const FORMAT_VERSION = '1.8.0';\n\n/**\n * Stores top-level animation include metadata by source file path so we can\n * round-trip the user's custom include system without forcing a dedicated UI.\n *\n * Key: animation file path (or '' for unpathed/ephemeral files)\n * Value: normalised includes array\n */\nconst animationIncludesByPath = new Map();\n\n/** Bedrock lerp modes that this plugin understands natively. */\nconst BEDROCK_LERP_MODES = new Set(['linear', 'catmullrom']);\n\n/** AzureLib easing names that map 1:1 to Bedrock lerp_mode on export. */\nconst AZURE_TO_BEDROCK_LERP = {\n  linear: 'linear',\n  // catmullrom is set via interpolation='catmullrom', not easing field\n};\n\n// ---------------------------------------------------------------------------\n// Schema detection helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if a keyframe object uses the Bedrock pre/post/lerp_mode schema.\n */\nfunction isBedrockKeyframe(obj) {\n  if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false;\n  return obj.lerp_mode !== undefined || obj.pre !== undefined || obj.post !== undefined;\n}\n\n/**\n * Returns true if a keyframe object uses the AzureLib { vector, easing } schema.\n */\nfunction isAzureKeyframe(obj) {\n  if (!obj || typeof obj !== 'object' || Array.isArray(obj)) return false;\n  return obj.vector !== undefined || obj.easing !== undefined;\n}\n\n/**\n * Unwrap a value to a plain [x, y, z] array, handling all known wrapping forms.\n */\nfunction unwrapToArray(v) {\n  if (Array.isArray(v)) return v;\n  if (v && typeof v === 'object') {\n    if (Array.isArray(v.vector)) return v.vector;\n    if (v.vector && typeof v.vector === 'object' && Array.isArray(v.vector.vector)) return v.vector.vector;\n  }\n  return null;\n}\n\n/**\n * Normalise a time key string: \"0.0\" → \"0\", \"1.000\" → \"1\", \"0.5\" stays.\n */\nfunction normTime(t) {\n  return String(t).replace(/^(-?\\d+)\\.0+$/, '$1');\n}\n\nfunction normalizeAnimationIncludes(includes) {\n  if (!Array.isArray(includes) || !includes.length) return [];\n\n  return includes\n    .filter(entry => entry && typeof entry === 'object')\n    .map(entry => ({\n      file_id: String(entry.file_id || '').trim(),\n      animations: Array.isArray(entry.animations)\n        ? entry.animations\n            .map(name => String(name || '').trim())\n            .filter(Boolean)\n        : [],\n    }))\n    .filter(entry => entry.file_id && entry.animations.length);\n}\n\nfunction cloneAnimationIncludes(includes) {\n  return normalizeAnimationIncludes(includes).map(entry => ({\n    file_id: entry.file_id,\n    animations: [...entry.animations],\n  }));\n}\n\nfunction getAnimationIncludesForPath(path) {\n  return cloneAnimationIncludes(animationIncludesByPath.get(path || '') || []);\n}\n\nfunction setAnimationIncludesForPath(path, includes) {\n  const key = path || '';\n  const normal = normalizeAnimationIncludes(includes);\n  if (normal.length) animationIncludesByPath.set(key, normal);\n  else animationIncludesByPath.delete(key);\n}\n\nfunction applyAnimationIncludes(out, includes) {\n  const normal = cloneAnimationIncludes(includes);\n  if (normal.length) out.includes = normal;\n  else delete out.includes;\n  return out;\n}\n\n\nfunction getIncludesTargetPath() {\n  const selected = Animation?.selected;\n  if (selected) return selected.path || '';\n\n  const uniquePaths = [...new Set(Animation.all.map(anim => anim.path || ''))];\n  if (uniquePaths.length === 1) return uniquePaths[0];\n\n  return '';\n}\n\nfunction getAnimationNamesForPath(path) {\n  return Animation.all\n    .filter(anim => (anim.path || '') === (path || '') && anim.name)\n    .map(anim => anim.name)\n    .sort((a, b) => a.localeCompare(b));\n}\n\nfunction findDuplicateIncludedAnimationNames(includes) {\n  const seen = new Map();\n  const duplicates = [];\n\n  includes.forEach((entry, entryIndex) => {\n    (entry.animations || []).forEach(name => {\n      const key = String(name || '').trim();\n      if (!key) return;\n\n      const previous = seen.get(key);\n      if (previous !== undefined) {\n        duplicates.push({ name: key, firstIndex: previous, secondIndex: entryIndex });\n      } else {\n        seen.set(key, entryIndex);\n      }\n    });\n  });\n\n  return duplicates;\n}\n\nfunction showAnimationIncludesDialog() {\n  const targetPath = getIncludesTargetPath();\n  const current = getAnimationIncludesForPath(targetPath);\n  const animationNames = getAnimationNamesForPath(targetPath);\n  const fileLabel = targetPath || 'Unsaved animation file';\n\n  const dialog = new Dialog({\n    id: 'azl_animation_includes_editor',\n    title: 'Edit Animation Includes',\n    width: 760,\n    component: {\n      data() {\n        return {\n          targetPath,\n          fileLabel,\n          rows: current.length\n            ? current.map(entry => ({\n                file_id: entry.file_id,\n                animations_text: entry.animations.join(', '),\n              }))\n            : [{ file_id: '', animations_text: '' }],\n          animationNames,\n          exampleAnimationNames: animationNames.join(', '),\n        };\n      },\n      methods: {\n        addRow() {\n          this.rows.push({ file_id: '', animations_text: '' });\n        },\n        removeRow(index) {\n          this.rows.splice(index, 1);\n          if (!this.rows.length) this.addRow();\n        },\n      },\n      template: `\n        <div class=\"dialog_content azure_includes_dialog\" style=\"display:flex;flex-direction:column;gap:12px;min-width:0;\">\n          <div style=\"min-width:0;\">\n            <p style=\"margin:0;\"><strong>Editing file:</strong> <span style=\"word-break:break-all;\">{{ fileLabel }}</span></p>\n            <p style=\"margin:6px 0 0 0;opacity:0.8;\">\n              These entries are saved at the top level of the animation JSON as <code>includes</code>.\n            </p>\n            <p v-if=\"exampleAnimationNames\" style=\"margin:6px 0 0 0;opacity:0.8;line-height:1.45;\">\n              Animations currently in this file: <code style=\"white-space:pre-wrap;word-break:break-word;\">{{ exampleAnimationNames }}</code>\n            </p>\n          </div>\n\n          <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;\">\n            <strong>Include Entries</strong>\n            <button\n              type=\"button\"\n              style=\"position:static;display:inline-flex;align-items:center;justify-content:center;padding:6px 12px;min-height:32px;white-space:nowrap;\"\n              @click=\"addRow()\"\n            >\n              Add Include\n            </button>\n          </div>\n          \n          <div style=\"display:flex;flex-direction:column;gap:12px;max-height:420px;overflow:auto;padding-right:4px;min-width:0;\">\n            <div\n              v-for=\"(row, index) in rows\"\n              :key=\"index\"\n              style=\"display:block;padding:12px;border:1px solid rgba(255,255,255,0.08);border-radius:8px;background:rgba(255,255,255,0.03);box-sizing:border-box;min-width:0;\"\n            >\n              <div style=\"display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;\">\n                <div style=\"font-weight:600;opacity:0.95;\">Include {{ index + 1 }}</div>\n                <button\n                  type=\"button\"\n                  style=\"position:static;display:inline-flex;align-items:center;justify-content:center;padding:4px 10px;min-height:28px;white-space:nowrap;\"\n                  @click=\"removeRow(index)\"\n                >\n                  Remove\n                </button>\n              </div>\n          \n              <div style=\"display:flex;flex-direction:column;gap:10px;min-width:0;\">\n                <label style=\"display:flex;flex-direction:column;gap:4px;width:100%;min-width:0;\">\n                  <span>File ID</span>\n                  <input\n                    type=\"text\"\n                    class=\"dark_bordered\"\n                    style=\"display:block;width:100%;min-width:0;max-width:100%;box-sizing:border-box;\"\n                    v-model=\"row.file_id\"\n                    placeholder=\"mod_id:path/to/other_animation.json\"\n                  />\n                </label>\n          \n                <label style=\"display:flex;flex-direction:column;gap:4px;width:100%;min-width:0;\">\n                  <span>Animations (comma-separated)</span>\n                  <textarea\n                    class=\"dark_bordered\"\n                    rows=\"3\"\n                    style=\"display:block;width:100%;min-width:0;max-width:100%;resize:vertical;box-sizing:border-box;line-height:1.4;\"\n                    v-model=\"row.animations_text\"\n                    placeholder=\"animation_name_1, animation_name_2\"\n                  ></textarea>\n                </label>\n              </div>\n            </div>\n          </div>\n        </div>\n      `,\n    },\n    onConfirm() {\n      const rows = dialog.content_vue?.rows || [];\n      const normalized = normalizeAnimationIncludes(rows.map(row => ({\n        file_id: row.file_id,\n        animations: String(row.animations_text || '')\n          .split(',')\n          .map(name => name.trim())\n          .filter(Boolean),\n      })));\n\n      const duplicates = findDuplicateIncludedAnimationNames(normalized);\n      if (duplicates.length) {\n        const preview = duplicates\n          .slice(0, 6)\n          .map(dup => `${dup.name} (entries ${dup.firstIndex + 1} and ${dup.secondIndex + 1})`)\n          .join('\\n');\n      \n        if (typeof Blockbench.showMessageBox === 'function') {\n          Blockbench.showMessageBox({\n            title: 'Duplicate Included Animations',\n            message:\n              'Each included animation name must be unique across all include entries.\\n\\n' +\n              preview +\n              (duplicates.length > 6 ? `\\n…and ${duplicates.length - 6} more.` : ''),\n          });\n        } else {\n          Blockbench.showQuickMessage('Duplicate included animation names detected.', 2400);\n        }\n      \n        return false;\n      }\n\n      setAnimationIncludesForPath(targetPath, normalized);\n      Blockbench.showQuickMessage(\n        normalized.length\n          ? `Saved ${normalized.length} animation include${normalized.length === 1 ? '' : 's'}.`\n          : 'Cleared animation includes.',\n        2000\n      );\n    },\n  });\n\n  dialog.show();\n}\n\n// ---------------------------------------------------------------------------\n// Animation file builder (export)\n// ---------------------------------------------------------------------------\n\n/**\n * Serialise all open Animation objects into the unified AzureLib JSON structure.\n * Kept as a convenience for callers that want everything in the project.\n * The codec itself uses compileFile(animations) so it can scope by file path.\n */\nexport function buildAzureAnimationFile() {\n  const out = applyAnimationIncludes({\n    format_version: FORMAT_VERSION,\n    animations: {},\n  }, getAnimationIncludesForPath(''));\n\n  for (const anim of Animation.all) {\n    if (!anim.name) continue;\n    const animOut = serializeAnimation(anim);\n    out.animations[anim.name] = animOut;\n  }\n\n  return out;\n}\n\nfunction serializeAnimation(anim) {\n  const obj = {};\n\n  if (anim.loop === 'loop') obj.loop = true;\n  else if (anim.loop === 'hold') obj.loop = 'hold_on_last_frame';\n  else if (anim.loop) obj.loop = anim.loop;\n\n  if (anim.override) obj.override_previous_animation = true;\n  if (anim.anim_time_update) obj.anim_time_update = anim.anim_time_update.replace(/;\\n/g, ';');\n  if (anim.blend_weight) obj.blend_weight = anim.blend_weight.replace(/;\\n/g, ';');\n  if (anim.length) obj.animation_length = Math.round(anim.length * 1e6) / 1e6;\n\n  const bones = {};\n  const effects = anim.animators.effects;\n  const boneAnimators = Object.values(anim.animators).filter(a => a instanceof BoneAnimator);\n\n  for (const boneAnim of boneAnimators) {\n    const boneName = boneAnim.name;\n    const boneOut = {};\n\n    for (const channel of ['position', 'rotation', 'scale']) {\n      const keyframes = boneAnim.keyframes.filter(kf => kf.channel === channel);\n      if (!keyframes.length) continue;\n\n      // Sort by time\n      keyframes.sort((a, b) => a.time - b.time);\n\n      if (keyframes.length === 1) {\n        // Constant value — AzureLib format: { \"vector\": [...] }\n        // Easing and easingArgs sit alongside vector at the same level (not nested).\n        const kf = keyframes[0];\n        const vec = extractKeyframeVector(kf, channel, true);\n        const node = { vector: vec };\n        const easing = kf.easing;\n        if (easing && easing !== EASING_DEFAULT) node.easing = easing;\n        if (hasArgs(easing) && Array.isArray(kf.easingArgs) && kf.easingArgs.length) {\n          node.easingArgs = [...kf.easingArgs];\n        }\n        boneOut[channel] = node;\n      } else {\n        const channelOut = {};\n        for (const kf of keyframes) {\n          const t = normTime(roundTime(kf.time));\n          channelOut[t] = serializeKeyframe(kf, channel, keyframes);\n        }\n        boneOut[channel] = channelOut;\n      }\n    }\n\n    if (Object.keys(boneOut).length) {\n      bones[boneName] = boneOut;\n    }\n  }\n\n  if (Object.keys(bones).length) obj.bones = bones;\n\n  // Effects (sound/particle/timeline)\n  if (effects && Array.isArray(effects.keyframes) && effects.keyframes.length) {\n    const sounds = {};\n    const particles = {};\n    const timeline = {};\n\n    for (const kf of effects.keyframes) {\n      const t = normTime(roundTime(kf.time));\n      if (kf.channel === 'sound') {\n        const pts = (kf.data_points || []).map(p => (typeof p === 'string' ? { effect: p } : { ...p })).filter(p => p.effect);\n        if (pts.length === 1) sounds[t] = pts[0];\n        else if (pts.length > 1) sounds[t] = pts;\n      } else if (kf.channel === 'particle') {\n        const pts = (kf.data_points || []).map(p => {\n          const o = {};\n          if (p.effect) o.effect = p.effect;\n          if (p.locator !== undefined) o.locator = p.locator;\n          if (p.script !== undefined) o.script = p.script;\n          return Object.keys(o).length ? o : null;\n        }).filter(Boolean);\n        if (pts.length === 1) particles[t] = pts[0];\n        else if (pts.length > 1) particles[t] = pts;\n      } else if (kf.channel === 'timeline') {\n        const script = (kf.data_points?.[0]?.script) || '';\n        if (script) timeline[t] = script;\n      }\n    }\n\n    if (Object.keys(sounds).length) obj.sound_effects = sounds;\n    if (Object.keys(particles).length) obj.particle_effects = particles;\n    if (Object.keys(timeline).length) obj.timeline = timeline;\n  }\n\n  return obj;\n}\n\n/**\n * Map Blockbench interpolation mode → Bedrock lerp_mode string.\n * 'linear' in BB is called 'linear' in Bedrock JSON.\n * 'catmullrom' in BB is called 'catmullrom' in Bedrock JSON.\n * 'bezier' uses Blockbench's own pre/post pair format.\n * 'step' uses a pre/post pair where pre = previous value.\n */\nconst BB_INTERP_TO_LERP_MODE = {\n  catmullrom: 'catmullrom',\n  // bezier and step are handled structurally (pre/post pairs), not via lerp_mode\n};\n\n/**\n * Serialise a single keyframe into its JSON representation.\n *\n * Bedrock interpolation modes (kf.interpolation is set):\n *   'linear'     → { post: [...], lerp_mode: 'linear' }\n *   'catmullrom' → { post: [...], lerp_mode: 'catmullrom' }   (+ pre if available)\n *   'bezier'     → { pre: [...], post: [...] }                 (Blockbench bezier handles pre/post natively)\n *   'step'       → { pre: [...], post: [...] }                 (discrete hold)\n *\n * AzureLib easing mode (kf.interpolation is undefined/null):\n *   With easing   → { vector: [...], easing: \"easeInSine\", easingArgs?: [...] }\n *   No easing     → [x, y, z]   (plain array shorthand)\n */\nfunction serializeKeyframe(kf, channel, allKeyframes) {\n  const vec    = extractKeyframeVector(kf, channel, true);\n  const interp = kf.interpolation;\n\n  // --- Bedrock lerp_mode-based keyframes (linear / catmullrom) ---\n  if (interp === 'catmullrom') {\n    const node = { post: vec, lerp_mode: 'catmullrom' };\n    const preVec = extractKeyframePreVector(kf, channel);\n    if (preVec) node.pre = preVec;\n    return node;\n  }\n\n  // --- Bezier keyframes: always have explicit pre/post control points ---\n  if (interp === 'bezier') {\n    const preVec = extractKeyframePreVector(kf, channel);\n    return preVec\n      ? { pre: preVec, post: vec }\n      : { post: vec };\n  }\n\n  // --- Step / discrete hold: emit pre (previous value) + post (this value) ---\n  if (interp === 'step') {\n    const prevKf = getPreviousKeyframe(kf, allKeyframes);\n    const preVec = extractKeyframePreVector(kf, channel)\n      || (prevKf ? extractKeyframeVector(prevKf, channel, true) : null);\n    return preVec ? { pre: preVec, post: vec } : { post: vec };\n  }\n\n  // --- Transition into a step keyframe: emit pre/post pair at this boundary ---\n  const prevKf = getPreviousKeyframe(kf, allKeyframes);\n  if (prevKf && prevKf.interpolation === 'step') {\n    const preVec = extractKeyframePreVector(kf, channel)\n      || extractKeyframeVector(prevKf, channel, true);\n    const out = { pre: preVec, post: vec };\n    if (kf.easing && kf.easing !== EASING_DEFAULT) out.easing = kf.easing;\n    if (hasArgs(kf.easing) && Array.isArray(kf.easingArgs) && kf.easingArgs.length) {\n      out.easingArgs = [...kf.easingArgs];\n    }\n    return out;\n  }\n\n  // --- AzureLib easing node (no Bedrock interpolation set) ---\n  // Timed keyframes always use { \"vector\": [...] } form — never bare arrays.\n  // Easing is only written when it differs from the default ('linear').\n  // Easing is suppressed for Molang expression vectors (easing is meaningless there).\n  const easing = kf.easing;\n  const vecHasMolang = vec.some(v => typeof v === 'string' && isNaN(Number(v)));\n  const writeEasing  = easing && easing !== EASING_DEFAULT && !vecHasMolang;\n  const writeArgs    = writeEasing && hasArgs(easing) && Array.isArray(kf.easingArgs) && kf.easingArgs.length;\n\n  const node = { vector: vec };\n  if (writeEasing) node.easing = easing;\n  if (writeArgs)   node.easingArgs = [...kf.easingArgs];\n  return node;\n}\n\n/**\n * Invert a single axis value only when needed for BB 5.0+ coordinate fix.\n * Numeric zero stays as numeric 0 (not converted to string \"0\").\n * Molang strings are inverted via invertMolang.\n * Non-zero numbers are negated directly.\n */\nfunction safeInvert(v) {\n  v = normalizeAxisValue(v);\n  if (typeof v === 'string') return invertMolang(v);\n  if (typeof v === 'number') return v === 0 ? 0 : -v;\n  return v;\n}\n\nfunction normalizeAxisValue(v) {\n  // Treat empty UI values as real numeric zero\n  if (v === null || v === undefined) return 0;\n\n  if (typeof v === 'string') {\n    const trimmed = v.trim();\n\n    // This catches '', '\\n', '   ', etc.\n    if (trimmed === '') return 0;\n\n    // Preserve Molang expressions, but convert numeric strings\n    const n = Number(trimmed);\n    return Number.isNaN(n) ? v : n;\n  }\n\n  return v;\n}\n\nfunction extractKeyframeVector(kf, channel, applyInversion) {\n  const dp = kf.data_points?.[kf.data_points.length > 1 ? 1 : 0] || kf.data_points?.[0];\n  if (!dp) return [0, 0, 0];\n\n  let x = normalizeAxisValue(dp.x);\n  let y = normalizeAxisValue(dp.y);\n  let z = normalizeAxisValue(dp.z);\n\n  if (applyInversion && Blockbench.isNewerThan('4.99')) {\n    if (channel === 'rotation') { x = safeInvert(x); y = safeInvert(y); }\n    else if (channel === 'position') { x = safeInvert(x); }\n  }\n\n  return [roundVal(x), roundVal(y), roundVal(z)];\n}\n\nfunction extractKeyframePreVector(kf, channel) {\n  if (!kf.data_points || kf.data_points.length < 2) return null;\n  const dp = kf.data_points[0];\n\n  let x = normalizeAxisValue(dp.x);\n  let y = normalizeAxisValue(dp.y);\n  let z = normalizeAxisValue(dp.z);\n\n  if (Blockbench.isNewerThan('4.99')) {\n    if (channel === 'rotation') { x = safeInvert(x); y = safeInvert(y); }\n    else if (channel === 'position') { x = safeInvert(x); }\n  }\n\n  return [roundVal(x), roundVal(y), roundVal(z)];\n}\n\nfunction getPreviousKeyframe(kf, allKeyframes) {\n  const idx = allKeyframes.indexOf(kf);\n  return idx > 0 ? allKeyframes[idx - 1] : null;\n}\n\nfunction roundTime(t) {\n  return Math.round(t * 1e6) / 1e6;\n}\n\nfunction roundVal(v) {\n  if (typeof v === 'number') return Math.round(v * 1e5) / 1e5;\n  return v;\n}\n\n// ---------------------------------------------------------------------------\n// Animation file loader (import)\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a unified AzureLib/Bedrock animation JSON file and create\n * Animation + BoneAnimator + Keyframe objects in Blockbench.\n */\nexport function loadAzureAnimationFile(file, filter) {\n  const json = file.json || (typeof autoParseJSON === 'function' ? autoParseJSON(file.content) : JSON.parse(file.content));\n  if (!json || typeof json.animations !== 'object') return [];\n\n  setAnimationIncludesForPath(file?.path, json.includes);\n\n  const animsOut = [];\n\n  for (const name in json.animations) {\n    if (filter && !filter.includes(name)) continue;\n    const src = json.animations[name];\n    const anim = parseAnimation(name, src, file.path);\n    animsOut.push(anim);\n  }\n\n  return animsOut;\n}\n\nfunction parseAnimation(name, src, filePath) {\n  const anim = new Animation({\n    name,\n    path: filePath,\n    saved_name: name,\n    loop: src.loop === true ? 'loop' : src.loop === 'hold_on_last_frame' ? 'hold' : src.loop || 'once',\n    override: !!src.override_previous_animation,\n    anim_time_update: typeof src.anim_time_update === 'string'\n      ? src.anim_time_update.replace(/;(?!$)/, ';\\n')\n      : src.anim_time_update || '',\n    blend_weight: typeof src.blend_weight === 'string'\n      ? src.blend_weight.replace(/;(?!$)/, ';\\n')\n      : src.blend_weight || '',\n    length: Number(src.animation_length || 0),\n  }).add();\n\n  // Effects\n  if (src.sound_effects || src.particle_effects || src.timeline || src.instructions) {\n    const effectsAnim = ensureEffectsAnimator(anim);\n    parseEffects(effectsAnim, src);\n  }\n\n  // Bones\n  if (src.bones) {\n    for (const boneName in src.bones) {\n      const bone = src.bones[boneName];\n      const group = Group.all.find(g => g.name.toLowerCase() === boneName.toLowerCase());\n      const uuid = group ? group.uuid : guid();\n      const boneAnim = new BoneAnimator(uuid, anim, boneName);\n      anim.animators[uuid] = boneAnim;\n\n      for (const channel in bone) {\n        if (!Animator.possible_channels[channel]) continue;\n        parseChannel(boneAnim, channel, bone[channel]);\n      }\n    }\n  }\n\n  anim.calculateSnappingFromKeyframes?.();\n  if (!Animation.selected && Animator.open) anim.select();\n\n  return anim;\n}\n\nfunction parseChannel(boneAnim, channel, channelData) {\n  if (!channelData) return;\n\n  const addKf = (time, data) => {\n    const parsed = parseKeyframeData(data, channel, time);\n    if (!parsed) return;\n\n    boneAnim.addKeyframe({\n      time,\n      channel,\n      easing: parsed.easing,\n      easingArgs: parsed.easingArgs,\n      interpolation: parsed.interpolation,\n      uniform: parsed.uniform,\n      data_points: parsed.data_points,\n    });\n  };\n\n  // Shorthand constant value (array or { vector: [...] })\n  if (Array.isArray(channelData) || (channelData.vector !== undefined && Object.keys(channelData).length <= 3)) {\n    const vec = unwrapToArray(channelData) || channelData;\n    if (Array.isArray(vec)) {\n      addKf(0, vec);\n      return;\n    }\n  }\n\n  // Check if the whole channel object is a single keyframe with lerp_mode/pre/post/vector\n  if (\n    channelData.lerp_mode !== undefined ||\n    channelData.pre !== undefined ||\n    channelData.post !== undefined ||\n    (channelData.vector !== undefined && typeof channelData.vector !== 'object')\n  ) {\n    addKf(0, channelData);\n    return;\n  }\n\n  // Normal timed keyframes map: { \"0.0\": {...}, \"0.5\": {...}, ... }\n  for (const rawT in channelData) {\n    const time = parseFloat(rawT);\n    const entry = channelData[rawT];\n    addKf(time, entry);\n  }\n}\n\n/**\n * Converts a raw JSON keyframe entry into a normalised data structure\n * that Blockbench's Keyframe system can consume.\n * Handles all three forms:\n *   1. Plain array          [x, y, z]\n *   2. AzureLib node        { vector, easing?, easingArgs? }\n *   3. Bedrock spline node  { post, pre?, lerp_mode }\n */\n\nfunction toNum(v) {\n  if (typeof v !== 'string') return v;\n  const n = Number(v);\n  return isNaN(n) ? v : n;  // Molang → keep string; numeric string → number\n}\n\nfunction coerceVec(vec) {\n  return vec.map(toNum);\n}\n\nfunction parseKeyframeData(data, channel, time) {\n  // --- 1. Plain array ---\n  if (Array.isArray(data)) {\n    const vec = applyFlipOnLoad(coerceVec(data), channel);\n    return {\n      easing: EASING_DEFAULT,\n      easingArgs: undefined,\n      interpolation: undefined,\n      uniform: false,\n      data_points: [{ x: vec[0], y: vec[1], z: vec[2] }],\n    };\n  }\n\n  if (!data || typeof data !== 'object') return null;\n\n  // --- 2. AzureLib node (has vector or easing) ---\n  if (isAzureKeyframe(data) && !isBedrockKeyframe(data)) {\n    const rawVec = unwrapToArray(data.vector || data) || [0, 0, 0];\n    const vec = applyFlipOnLoad(coerceVec(rawVec), channel);\n    return {\n      easing: data.easing || EASING_DEFAULT,\n      easingArgs: Array.isArray(data.easingArgs) && data.easingArgs.length ? data.easingArgs : undefined,\n      interpolation: undefined,\n      uniform: false,\n      data_points: [{ x: vec[0], y: vec[1], z: vec[2] }],\n    };\n  }\n\n  // --- 3. Bedrock interpolation node (has lerp_mode, pre, or post) ---\n  if (isBedrockKeyframe(data)) {\n    // Map JSON lerp_mode strings back to Blockbench interpolation identifiers\n    const lerp = data.lerp_mode;\n    const interpolation =\n      lerp === 'catmullrom' ? 'catmullrom' :\n      // lerp_mode:'linear' treated as no special interpolation — AzureLib linear easing handles it\n      lerp === 'linear'     ? undefined      :\n      // pre/post without lerp_mode is bezier in Blockbench's own format\n      (data.pre !== undefined || data.post !== undefined) ? 'bezier' :\n      undefined;\n    const data_points = [];\n\n    const postRaw = unwrapToArray(data.post);\n    const preRaw = unwrapToArray(data.pre);\n\n    if (preRaw) {\n      const pre = applyFlipOnLoad(coerceVec(preRaw), channel);\n      data_points.push({ x: pre[0], y: pre[1], z: pre[2] });\n    }\n\n    const postVec = postRaw ? applyFlipOnLoad(coerceVec(postRaw), channel) : [0, 0, 0];\n    data_points.push({ x: postVec[0], y: postVec[1], z: postVec[2] });\n\n    return {\n      easing: EASING_DEFAULT,\n      easingArgs: undefined,\n      interpolation,\n      uniform: false,\n      data_points: data_points.length ? data_points : [{ x: 0, y: 0, z: 0 }],\n    };\n  }\n\n  // Fallback — treat as raw vector object\n  const x = toNum(data.x ?? 0);\n  const y = toNum(data.y ?? 0);\n  const z = toNum(data.z ?? 0);\n  return {\n    easing: EASING_DEFAULT,\n    easingArgs: undefined,\n    interpolation: undefined,\n    uniform: false,\n    data_points: [{ x, y, z }],\n  };\n}\n\nfunction applyFlipOnLoad(vec, channel) {\n  if (!Blockbench.isNewerThan('4.99')) return vec;\n  const v = [...vec];\n  if (channel === 'rotation') {\n    v[0] = invertMolang(v[0]);\n    v[1] = invertMolang(v[1]);\n  } else if (channel === 'position') {\n    v[0] = invertMolang(v[0]);\n  }\n  return v;\n}\n\nfunction parseEffects(effectsAnim, src) {\n  if (src.sound_effects) {\n    for (const t in src.sound_effects) {\n      let sounds = src.sound_effects[t];\n      if (!Array.isArray(sounds)) sounds = [sounds];\n      const pts = sounds.filter(Boolean).map(s => (typeof s === 'string' ? { effect: s } : { ...s }));\n      effectsAnim.addKeyframe({ channel: 'sound', time: parseFloat(t), data_points: pts });\n    }\n  }\n\n  if (src.particle_effects) {\n    for (const t in src.particle_effects) {\n      let particles = src.particle_effects[t];\n      if (!Array.isArray(particles)) particles = [particles];\n      const pts = particles.filter(Boolean).map(p => {\n        const o = { ...p };\n        if (o.pre_effect_script && !o.script) o.script = o.pre_effect_script;\n        return o;\n      });\n      effectsAnim.addKeyframe({ channel: 'particle', time: parseFloat(t), data_points: pts });\n    }\n  }\n\n  const timeline = src.timeline || src.instructions;\n  if (timeline) {\n    for (const t in timeline) {\n      const entry = timeline[t];\n      const script = Array.isArray(entry) ? entry.join('\\n') : entry;\n      effectsAnim.addKeyframe({ channel: 'timeline', time: parseFloat(t), data_points: [{ script }] });\n    }\n  }\n}\n\nfunction ensureEffectsAnimator(anim) {\n  if (!anim.animators.effects) {\n    anim.animators.effects = new EffectAnimator(anim);\n  }\n  return anim.animators.effects;\n}\n\n// ---------------------------------------------------------------------------\n// Pretty-printer (kept from the original — formats arrays inline)\n// ---------------------------------------------------------------------------\n\n/**\n * JSON serialiser that pretty-prints with tabs but keeps arrays compact on one line.\n * This matches the original Bedrock/AzureLib animation file format exactly.\n */\nfunction serializeAnimationJson(obj) {\n  // First pass: standard pretty-print\n  const raw = JSON.stringify(obj, null, '\\t');\n  // Second pass: collapse arrays that contain only numbers/strings onto one line.\n  // Matches [ followed by whitespace+values+whitespace ] across newlines.\n  return raw.replace(\n    /\\[\\s*([\\s\\S]*?)\\s*\\]/g,\n    (match, inner) => {\n      // Only collapse if every element is a number or a quoted string (no nested objects/arrays)\n      const trimmed = inner.trim();\n      if (!trimmed) return '[]';\n      // Check that the inner content has no { or [ — i.e. it's a flat value array\n      if (/[{\\[\\]]/.test(trimmed)) return match;\n      // Collapse: replace all internal whitespace/newlines/tabs between values with ', '\n      const items = trimmed.split(/,\\s*/).map(s => s.trim());\n      return '[' + items.join(', ') + ']';\n    }\n  );\n}\n\n// ---------------------------------------------------------------------------\n// AnimationCodec — the public-facing format integration\n// ---------------------------------------------------------------------------\n\n/**\n * Filesystem helpers — only used in the desktop app. Guarded so the codec\n * still works in the web build (where save/reload-by-path are no-ops).\n */\nconst _fs = (typeof require === 'function' && typeof isApp !== 'undefined' && isApp)\n  ? require('fs')\n  : null;\n\n/**\n * Try to recover a previously written file's JSON (for in-place merges).\n * Returns null if the file is missing or unparseable, never throws.\n */\nfunction _readExistingAnimationFile(path) {\n  if (!_fs || !path) return null;\n  try {\n    if (!_fs.existsSync(path)) return null;\n    const raw = _fs.readFileSync(path, 'utf-8');\n    const parsed = typeof autoParseJSON === 'function'\n      ? autoParseJSON(raw, false)\n      : JSON.parse(raw);\n    return (parsed && typeof parsed.animations === 'object') ? parsed : null;\n  } catch (_) {\n    return null;\n  }\n}\n\n/**\n * Lazily-created codec instance.\n *\n * IMPORTANT:\n * Do not construct AnimationCodec at module load, because the blockbench-plugins\n * validator evaluates the bundle in a VM before the full app/runtime exists.\n */\nexport let azureAnimationCodec = null;\n\nexport function createAzureAnimationCodec() {\n  if (azureAnimationCodec) return azureAnimationCodec;\n\n  if (typeof AnimationCodec === 'undefined') {\n    console.warn('[AzureLib] AnimationCodec API is unavailable in this Blockbench version.');\n    return null;\n  }\n\n  azureAnimationCodec = new AnimationCodec(AZURE_ANIM_FORMAT_ID, {\n    multiple_per_file: true,\n\n    // ---- Import side ---------------------------------------------------\n\n    pickFile() {\n      Blockbench.import({\n        resource_id: 'azure_animation',\n        type: 'AzureLib Animation',\n        extensions: ['json'],\n        readtype: 'text',\n        multiple: true,\n      }, async (files) => {\n        if (!files || !files.length) return;\n        for (const file of files) {\n          await this.importFile(file);\n        }\n      });\n    },\n\n    importFile(file, auto_loaded) {\n      let parsed;\n      try {\n        parsed = typeof autoParseJSON === 'function'\n          ? autoParseJSON(file.content, false)\n          : JSON.parse(file.content);\n      } catch (error) {\n        console.error('[AzureLib] Failed to parse animation file:', error);\n        Blockbench.showQuickMessage('[AzureLib] Failed to parse animation file.');\n        return [];\n      }\n\n      file.json = parsed;\n      return this.loadFile(file, null, auto_loaded);\n    },\n\n    loadFile(file, animation_filter, auto_loaded) {\n      const json = file?.json || (\n        typeof autoParseJSON === 'function'\n          ? autoParseJSON(file.content, false)\n          : JSON.parse(file.content)\n      );\n\n      if (!json || typeof json.animations !== 'object') {\n        Blockbench.showQuickMessage('[AzureLib] No animations found in file.');\n        return [];\n      }\n\n      const path = file.path || '';\n      setAnimationIncludesForPath(path, json.includes || []);\n\n      const created = [];\n\n      for (const [name, animData] of Object.entries(json.animations)) {\n        if (Array.isArray(animation_filter) && animation_filter.length && !animation_filter.includes(name)) {\n          continue;\n        }\n\n        // Delegate to parseAnimation which correctly handles bone UUID assignment,\n        // channel parsing (including numeric coercion and flip-on-load), and effects.\n        const anim = parseAnimation(name, animData, path);\n        anim.saved = true;\n        created.push(anim);\n      }\n\n      if (!auto_loaded && created.length) {\n        Animation.selected = created[0];\n      }\n\n      return created;\n    },\n\n    // ---- Export side ---------------------------------------------------\n\n    compileFile(animations = Animation.all) {\n      const scoped = Array.isArray(animations) ? animations : Animation.all;\n      const path = scoped.length ? (scoped[0].path || '') : '';\n      const out = applyAnimationIncludes({\n        format_version: FORMAT_VERSION,\n        animations: {},\n      }, getAnimationIncludesForPath(path));\n\n      for (const anim of scoped) {\n        if (!anim?.name) continue;\n        out.animations[anim.name] = serializeAnimation(anim);\n      }\n\n      return out;\n    },\n\n    write(content, path) {\n      return serializeAnimationJson(content);\n    },\n\n    /**\n     * Save a single animation back into its source file while preserving\n     * sibling animations and includes.\n     */\n    saveAnimation(animation, save_as) {\n      const compileSingleFile = () => applyAnimationIncludes({\n        format_version: FORMAT_VERSION,\n        animations: {\n          [animation.name]: serializeAnimation(animation),\n        },\n      }, getAnimationIncludesForPath(animation.path));\n\n      if (!isApp || !animation.path || save_as) {\n        Blockbench.export({\n          resource_id: 'azure_animation',\n          type: 'AzureLib Animation',\n          extensions: ['json'],\n          name: (Project?.geometry_name || Project?.name || 'animation') + '.animation',\n          startpath: animation.path,\n          content: serializeAnimationJson(compileSingleFile()),\n        }, (real_path) => {\n          const previousPath = animation.path || '';\n          const includes = getAnimationIncludesForPath(previousPath);\n          setAnimationIncludesForPath(real_path, includes);\n\n          if (real_path !== previousPath && previousPath) {\n            animationIncludesByPath.delete(previousPath);\n          }\n\n          animation.path = real_path;\n          animation.saved = true;\n          animation.saved_name = animation.name;\n        });\n        return;\n      }\n\n      let content = compileSingleFile();\n      const existing = _readExistingAnimationFile(animation.path);\n\n      if (existing) {\n        const fresh = content.animations[animation.name];\n        content = existing;\n\n        if (animation.saved_name && animation.saved_name !== animation.name) {\n          delete content.animations[animation.saved_name];\n        }\n\n        content.animations[animation.name] = fresh;\n        applyAnimationIncludes(content, getAnimationIncludesForPath(animation.path));\n\n        const fileKeys = Object.keys(content.animations);\n        const projectKeys = Animation.all\n          .filter(a => a.path === animation.path)\n          .map(a => a.name);\n\n        let changed = false;\n        let cursor = 0;\n\n        for (const key of projectKeys) {\n          const at = fileKeys.indexOf(key);\n          if (at === -1) continue;\n\n          if (at < cursor) {\n            fileKeys.splice(at, 1);\n            fileKeys.splice(cursor, 0, key);\n            changed = true;\n          } else {\n            cursor = at;\n          }\n        }\n\n        if (changed) {\n          const sorted = {};\n          fileKeys.forEach(k => {\n            sorted[k] = content.animations[k];\n          });\n          content.animations = sorted;\n        }\n      }\n\n      Blockbench.writeFile(animation.path, {\n        content: serializeAnimationJson(content),\n      }, (real_path) => {\n        animation.saved = true;\n        animation.saved_name = animation.name;\n        animation.path = real_path;\n      });\n    },\n\n    /**\n     * Export all animations that share the given path.\n     */\n    exportFile(path, save_as) {\n      const filterPath = path || '';\n      const animations = Animation.all.filter(a => (a.path || '') === filterPath);\n\n      if (!save_as && isApp && path && _fs && _fs.existsSync(path)) {\n        animations.forEach(a => {\n          if (!a.saved) a.save();\n        });\n        return;\n      }\n\n      const content = serializeAnimationJson(this.compileFile(animations));\n\n      Blockbench.export({\n        resource_id: 'azure_animation',\n        type: 'AzureLib Animation',\n        extensions: ['json'],\n        name: (Project?.geometry_name || Project?.name || 'animation') + '.animation',\n        startpath: path,\n        content,\n      }, (real_path) => {\n        const previousPath = filterPath || '';\n        const includes = getAnimationIncludesForPath(previousPath);\n        setAnimationIncludesForPath(real_path, includes);\n\n        if (real_path !== previousPath && previousPath) {\n          animationIncludesByPath.delete(previousPath);\n        }\n\n        animations.forEach(a => {\n          a.path = real_path;\n          a.saved = true;\n          a.saved_name = a.name;\n        });\n      });\n    },\n\n    deleteAnimationFromFile(animation) {\n      if (!_fs || !animation.path) return;\n\n      const existing = _readExistingAnimationFile(animation.path);\n      if (!existing || !existing.animations?.[animation.name]) return;\n\n      delete existing.animations[animation.name];\n      applyAnimationIncludes(existing, getAnimationIncludesForPath(animation.path));\n\n      Blockbench.writeFile(animation.path, {\n        content: serializeAnimationJson(existing),\n      });\n    },\n  });\n\n  return azureAnimationCodec;\n}\n\n// ---------------------------------------------------------------------------\n// Legacy export wrappers — keep external callers working.\n// ---------------------------------------------------------------------------\n\nexport function exportAzureAnimation() {\n  const codec = createAzureAnimationCodec();\n  if (!codec?.exportFile) return;\n\n  const anyPath = Animation.all.find(a => a.path)?.path || '';\n  codec.exportFile(anyPath, true);\n}\n\nexport function importAzureAnimation() {\n  const codec = createAzureAnimationCodec();\n  codec?.pickFile?.();\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nlet editAnimationIncludesAction = null;\n\nexport function registerAzureAnimationFormat() {\n  const codec = createAzureAnimationCodec();\n  if (!codec) {\n    console.warn(\n      '[AzureLib] AnimationCodec API is unavailable in this Blockbench version. ' +\n      'Animation import/export will not work. Please update Blockbench.'\n    );\n    return;\n  }\n\n  if (!editAnimationIncludesAction) {\n    editAnimationIncludesAction = new Action('azl_edit_animation_includes', {\n      name: 'Edit Animation Includes',\n      description: 'Edit AzureLib animation include entries for the current animation file',\n      icon: 'playlist_add',\n      category: 'animation',\n      condition: () => Format?.id === 'azure_model' && Animator.open,\n      click: () => showAnimationIncludesDialog(),\n    });\n\n    try {\n      MenuBar.menus?.animation?.addAction(editAnimationIncludesAction);\n    } catch (_) {}\n  }\n\n  if (!Formats?.azure_animation) {\n    Formats.azure_animation = {\n      id: AZURE_ANIM_FORMAT_ID,\n      name: 'Azure Animation',\n      animation_codec: codec,\n    };\n  }\n\n  console.log('[AzureLib] Azure animation codec registered');\n}\n\nexport function unregisterAzureAnimationFormat() {\n  editAnimationIncludesAction?.delete();\n  editAnimationIncludesAction = null;\n\n  try {\n    delete Formats?.azure_animation;\n  } catch {}\n\n  if (azureAnimationCodec && AnimationCodec?.codecs) {\n    delete AnimationCodec.codecs[AZURE_ANIM_FORMAT_ID];\n  }\n\n  azureAnimationCodec = null;\n  console.log('[AzureLib] Azure animation codec unregistered');\n}"
  },
  {
    "path": "src/azurelib_utils/animation/azure-animation-ui.js",
    "content": "/**\n * AzureLib Animator — Unified Animation UI\n * ----------------------------------------\n * Custom animation panel that replaces the Minecraft Bedrock animation tab.\n * Supports AzureLib custom easings and Bedrock lerp_mode (catmullrom/linear)\n * in one unified interface.\n *\n * UI features:\n *   - Easing family picker (Azure easings: sine, quad, cubic … + linear/step)\n *   - In / Out / InOut type toggle\n *   - Numeric argument input for Back/Elastic/Bounce/Step\n *   - Bedrock catmullrom toggle (sets interpolation, not easing)\n *   - All controls update all selected keyframes atomically via the undo system\n *\n * © 2025 AzureDoom — MIT License\n */\n\nimport { uniq } from 'lodash';\nimport { injectOverride, PatchRegistry } from '../core/azure-utils.js';\nimport {\n  EASING_TYPES,\n  EASING_DEFAULT,\n  getEasingArgDefault,\n  parseEasingArg,\n  hasArgs,\n} from './azure-easing.js';\n\n// ---------------------------------------------------------------------------\n// Lifecycle\n// ---------------------------------------------------------------------------\n\nlet _uiListeners = false;\n\nexport function initializeAnimationUI() {\n  if (_uiListeners) return;\n\n  Blockbench.on('display_animation_frame', _onFrame);\n  Blockbench.on('update_keyframe_selection', refreshKeyframeUI);\n\n  // Expose handlers globally so inline HTML oninput/onclick can call them\n  window._azureApplyEasing       = applyKeyframeEasing;\n  window._azureApplyEasingArg    = applyEasingArgument;\n  window._azureToggleCatmullrom  = toggleCatmullrom;  // kept for compat\n  window._azureSetInterpolation   = setInterpolation;\n\n  // Suppress Blockbench's stock interpolation selector in Azure format\n  _patchStockInterpolationBar();\n\n  _uiListeners = true;\n  console.log('[AzureLib] Animation UI initialised');\n}\n\nexport function unloadAnimationUI() {\n  if (!_uiListeners) return;\n\n  Blockbench.removeListener('display_animation_frame', _onFrame);\n  Blockbench.removeListener('update_keyframe_selection', refreshKeyframeUI);\n\n  delete window._azureApplyEasing;\n  delete window._azureApplyEasingArg;\n  delete window._azureToggleCatmullrom;\n\n  _cleanupKeyframePanel();\n  _uiListeners = false;\n}\n\n// ---------------------------------------------------------------------------\n// Keyframe panel refresh (main entry point)\n// ---------------------------------------------------------------------------\n\nconst PANEL_BARS = [\n  'azl_bar_catmullrom',\n  'azl_bar_easing',\n  'azl_bar_easing_azure',\n  'azl_bar_easing_type',\n  'azl_bar_easing_arg',\n];\n\nexport function refreshKeyframeUI() {\n  _cleanupKeyframePanel();\n\n  // Only show Azure controls when our format is active\n  if (Format?.id !== 'azure_model') return;\n\n  // Show/hide the stock pre/post toggle button\n  const addPrePost = document.querySelector('#keyframe_type_label > div');\n  if (addPrePost) addPrePost.hidden = true;\n\n  const selected = Timeline.selected;\n  if (!selected || !selected.length) return;\n\n  const keyframesByChannel = _groupByChannel(Timeline.keyframes);\n  const firstInChannel = kf => {\n    const ch = keyframesByChannel.get(kf.animator)?.[kf.channel] || [];\n    return ch.indexOf(kf) < 1;\n  };\n\n  // Only render for bone keyframes that are not the first in their channel\n  if (!selected.every(kf => kf.animator instanceof BoneAnimator && !firstInChannel(kf))) return;\n\n  const panel = document.getElementById('panel_keyframe');\n  if (!panel) return;\n\n  _renderInterpolationBar(panel, selected);\n  _renderEasingBar(panel, selected);\n}\n\n// ---------------------------------------------------------------------------\n// Bedrock interpolation bar\n// Blockbench stores these as kf.interpolation:\n//   undefined / null → AzureLib easing mode (our default)\n//   'catmullrom'     → Bedrock smooth spline (BB \"Smooth\")\n//   'bezier'         → Bezier curves (BB \"Bezier\")\n//   'step'           → Discrete step (BB \"Step\")\n// ---------------------------------------------------------------------------\n\n/**\n * All Blockbench-native interpolation modes we expose.\n * Selecting any of these sets kf.interpolation and clears kf.easing.\n * \"Azure Easing\" is our own mode — clears interpolation, uses kf.easing instead.\n */\nconst BB_INTERP_MODES = [\n  { id: null,          label: 'Azure Easing', title: 'Use AzureLib custom easing (see section below)' },\n  { id: 'catmullrom',  label: 'Smooth',        title: 'Bedrock catmullrom spline (BB: Smooth)' },\n  { id: 'bezier',      label: 'Bezier',        title: 'Bezier curve interpolation (BB: Bezier)' },\n  { id: 'step',        label: 'Step',          title: 'Discrete step / hold (BB: Step)' },\n];\n\nfunction _renderInterpolationBar(panel, selected) {\n  // Read the shared interpolation across selected keyframes.\n  // null/undefined/'linear' all mean \"Azure easing mode\" — 'linear' is our internal\n  // sentinel used to keep Blockbench's BarSelect happy (it rejects undefined).\n  const normalizeInterp = kf => {\n    const v = kf.interpolation;\n    return (!v || v === 'linear') ? null : v;\n  };\n  const currentInterp = _readMulti(selected, normalizeInterp, null, '(mixed)');\n\n  const bar = _createBar('azl_bar_catmullrom', panel);\n\n  // Section heading — plain text, no background, matches BB's own keyframe labels\n  const heading = document.createElement('p');\n  heading.style.cssText = 'min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);';\n  heading.textContent = 'Interpolation';\n  bar.appendChild(heading);\n\n  for (const { id, label, title } of BB_INTERP_MODES) {\n    const isActive = (currentInterp === id);\n    const btn = document.createElement('button');\n    btn.id = 'azl_btn_interp_' + (id ?? 'azure');\n    btn.className = 'dark_bordered';\n    btn.textContent = label;\n    btn.title = title;\n    btn.style.cssText = `padding:2px 10px;margin:1px;cursor:pointer;${isActive ? 'color:var(--color-accent);border-color:var(--color-accent);' : ''}`;\n    btn.onclick = () => window._azureSetInterpolation(id);\n    bar.appendChild(btn);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Easing bar\n// ---------------------------------------------------------------------------\n\n/**\n * AzureLib easing families (custom Java-side easings).\n * \"linear\" and \"step\" are special-cased (no In/Out/InOut variants).\n */\nconst AZURE_EASING_FAMILIES = [\n  { id: 'linear',  label: 'Linear'  },\n  { id: 'step',    label: 'Step'    },\n  { id: 'sine',    label: 'Sine'    },\n  { id: 'quad',    label: 'Quad'    },\n  { id: 'cubic',   label: 'Cubic'   },\n  { id: 'quart',   label: 'Quart'   },\n  { id: 'quint',   label: 'Quint'   },\n  { id: 'expo',    label: 'Expo'    },\n  { id: 'circ',    label: 'Circ'    },\n  { id: 'back',    label: 'Back'    },\n  { id: 'elastic', label: 'Elastic' },\n  { id: 'bounce',  label: 'Bounce'  },\n];\n\nconst EASING_TYPES_LIST = [\n  { id: 'in',    label: 'In'    },\n  { id: 'out',   label: 'Out'   },\n  { id: 'inout', label: 'In/Out'},\n];\n\nfunction _renderEasingBar(panel, selected) {\n  // Don't show Azure easing picker when all selected have a Bedrock interpolation mode.\n  // 'linear' is our internal sentinel for Azure easing mode (not a real Bedrock interp),\n  // so it must NOT be treated as a Bedrock mode here.\n  const isBedrock = kf => !!kf.interpolation && kf.interpolation !== 'linear';\n  const allBedrock = selected.every(isBedrock);\n\n  const displayedEasing = _readMulti(selected, kf => kf.easing, EASING_DEFAULT, '(mixed)');\n  const currentFamily   = _easingFamilyOf(displayedEasing);\n  const currentType     = _easingTypeOf(displayedEasing);\n\n  // --- Section header ---\n  const headerBar = _createBar('azl_bar_easing', panel);\n  const easingHeading = document.createElement('p');\n  easingHeading.style.cssText = 'min-width:100%;margin:4px 0 2px 0;padding: 0 0 0 10px;color:var(--color-text);';\n  easingHeading.textContent = 'AzureLib Easings';\n  headerBar.appendChild(easingHeading);\n\n  // --- Azure easing family buttons (icon + label inside each button) ---\n  const azureRow = _createBar('azl_bar_easing_azure', panel);\n  azureRow.style.flexWrap = 'wrap';\n\n  for (const { id, label } of AZURE_EASING_FAMILIES) {\n    const isSelected = !allBedrock && (id === currentFamily);\n    const icon = EASING_ICONS[id] || '';\n    const btn = document.createElement('button');\n    btn.id = `azl_kf_easing_${id}`;\n    btn.className = 'dark_bordered';\n    btn.title = `Switch to ${label} easing`;\n    btn.style.cssText = `\n      padding: 2px 6px;\n      margin: 1px;\n      cursor: pointer;\n      display: inline-flex;\n      align-items: center;\n      gap: 3px;\n      ${isSelected ? 'color:var(--color-accent);border-color:var(--color-accent);' : ''}\n    `;\n    btn.innerHTML = `${icon}<span>${label}</span>`;\n    btn.onclick = () => {\n      const nextEasing = _assembleEasingId(id, currentType);\n      applyKeyframeEasing(nextEasing);\n    };\n    azureRow.appendChild(btn);\n  }\n\n  // --- Type (In / Out / In/Out) row — only for families with variants ---\n  if (!allBedrock && currentFamily !== 'linear' && currentFamily !== 'step') {\n    const typeBar = _createBar('azl_bar_easing_type', panel);\n    const typeHeading = document.createElement('p');\n    typeHeading.style.cssText = 'min-width:100%;margin:4px 0 2px 0;padding:0;color:var(--color-text);';\n    typeHeading.textContent = 'Type';\n    typeBar.appendChild(typeHeading);\n\n    for (const { id, label } of EASING_TYPES_LIST) {\n      const isActive = (id === currentType);\n      const btn = document.createElement('button');\n      btn.id = `azl_kf_type_${id}`;\n      btn.className = 'dark_bordered';\n      btn.textContent = label;\n      btn.style.cssText = `\n        padding: 2px 10px;\n        margin: 1px;\n        cursor: pointer;\n        ${isActive ? 'color:var(--color-accent);border-color:var(--color-accent);' : ''}\n      `;\n      btn.onclick = () => {\n        const nextEasing = _assembleEasingId(currentFamily, id);\n        applyKeyframeEasing(nextEasing);\n      };\n      typeBar.appendChild(btn);\n    }\n  }\n\n  // --- Argument row (for Back/Elastic/Bounce/Step) ---\n  if (selected.every(kf => hasArgs(kf.easing))) {\n    const argLabel = _getArgLabel(selected[0].easing);\n    const defaultArg = getEasingArgDefault(selected[0].easing);\n    const currentArg = _readMulti(\n      selected,\n      kf => (Array.isArray(kf.easingArgs) && kf.easingArgs.length ? kf.easingArgs[0] : defaultArg),\n      defaultArg,\n      defaultArg,\n    );\n\n    const argBar = _createBar('azl_bar_easing_arg', panel);\n    argBar.innerHTML = `\n      <p style=\"margin:4px 0 2px 0;padding:0;color:var(--color-text);min-width:90px;\">${argLabel}</p>\n      <input\n        type=\"number\"\n        id=\"azl_easing_arg_input\"\n        class=\"dark_bordered code keyframe_input tab_target\"\n        value=\"${currentArg}\"\n        oninput=\"window._azureApplyEasingArg(this)\"\n        style=\"flex:1;margin-right:9px;\">`;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Event handlers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply an easing name to all selected keyframes.\n * @param {string} easingId - e.g. 'easeInSine', 'linear', 'step'\n */\nexport function applyKeyframeEasing(easingId) {\n  if (!easingId || easingId === '-') return;\n  Undo.initEdit({ keyframes: Timeline.selected });\n\n  Timeline.selected.forEach(kf => {\n    kf.easing = easingId;\n    // Switching to an Azure easing clears any Bedrock interpolation mode.\n    // Use 'linear' (not undefined) so BB's BarSelect keyframe_interpolation stays valid.\n    if (kf.interpolation && kf.interpolation !== 'linear') kf.interpolation = 'linear';\n  });\n\n  Undo.finishEdit('Set keyframe easing');\n  refreshKeyframeUI();\n}\n\n/**\n * Apply the numeric easing argument from the input field.\n * @param {HTMLInputElement} el\n */\nexport function applyEasingArgument(el) {\n  const raw = $(el).val();\n  if (raw === '' || raw === '-') return;\n  Undo.initEdit({ keyframes: Timeline.selected });\n\n  Timeline.selected.forEach(kf => {\n    kf.easingArgs = [parseEasingArg(kf, String(raw).trim())];\n  });\n\n  Undo.finishEdit('Set keyframe easing argument');\n}\n\n/**\n * Set a Blockbench-native interpolation mode on all selected keyframes.\n * @param {string|null} mode - 'catmullrom' | 'bezier' | 'step' | null\n *   null means \"Azure easing mode\" — clears interpolation so kf.easing takes over.\n */\nexport function setInterpolation(mode) {\n  Undo.initEdit({ keyframes: Timeline.selected });\n\n  Timeline.selected.forEach(kf => {\n    if (mode === null || mode === undefined) {\n      // Azure easing mode: use 'linear' sentinel (not undefined) so BB's BarSelect stays valid.\n      kf.interpolation = 'linear';\n    } else {\n      // Bedrock interpolation: set mode, clear Azure easing\n      kf.interpolation = mode;\n      kf.easing = EASING_DEFAULT;\n      kf.easingArgs = undefined;\n    }\n  });\n\n  Undo.finishEdit('Set keyframe interpolation');\n  refreshKeyframeUI();\n}\n\n/** @deprecated use setInterpolation — kept for backward compatibility */\nexport function toggleCatmullrom(forceValue) {\n  setInterpolation(forceValue === false ? null : 'catmullrom');\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction _onFrame() { /* reserved */ }\n\nfunction _createBar(id, parent) {\n  const el = document.createElement('div');\n  el.id = id;\n  el.className = 'bar flex';\n  el.style.flexWrap = 'wrap';\n  el.style.alignItems = 'center';\n  el.style.gap = '2px';\n  el.style.marginTop = '4px';\n  parent.appendChild(el);\n  return el;\n}\n\nfunction _cleanupKeyframePanel() {\n  PANEL_BARS.forEach(id => document.getElementById(id)?.remove());\n  const prePost = document.querySelector('#keyframe_type_label > div');\n  if (prePost) prePost.hidden = false;\n}\n\nfunction _groupByChannel(keyframes) {\n  const map = new Map();\n  for (const kf of keyframes) {\n    if (!map.has(kf.animator)) map.set(kf.animator, {});\n    const ch = map.get(kf.animator);\n    if (!ch[kf.channel]) ch[kf.channel] = [];\n    ch[kf.channel].push(kf);\n    ch[kf.channel].sort((a, b) => a.time - b.time);\n  }\n  return map;\n}\n\n/**\n * Read a value from all selected keyframes.\n * If all values are equal, return it; otherwise return `conflict`.\n */\nfunction _readMulti(selected, selector, def, conflict) {\n  const fn = typeof selector === 'function' ? selector : kf => kf[selector];\n  if (selected.length === 0) return def;\n  if (selected.length === 1) return fn(selected[0]) ?? def;\n  const values = uniq(selected.map(fn));\n  return values.length === 1 ? values[0] : conflict;\n}\n\n/**\n * Extract the easing family from a full easing name.\n * 'easeInOutSine' → 'sine', 'linear' → 'linear'\n */\nfunction _easingFamilyOf(name) {\n  if (!name || name === 'linear') return 'linear';\n  if (name === 'step') return 'step';\n  const m = String(name).match(/^ease(?:InOut|In|Out)([\\w]+)$/i);\n  return m ? m[1].toLowerCase() : name.toLowerCase();\n}\n\n/**\n * Extract the easing type (in/out/inout) from a full easing name.\n * 'easeInOutSine' → 'inout', 'easeOutBounce' → 'out', 'easeInQuad' → 'in'\n */\nfunction _easingTypeOf(name) {\n  const m = String(name).match(/^ease(InOut|In|Out)/i);\n  if (!m) return 'in';\n  const raw = m[1].toLowerCase();\n  return raw === 'inout' ? 'inout' : raw;\n}\n\n/**\n * Assemble a full easing ID from family + type.\n * ('sine', 'out') → 'easeOutSine'\n * ('linear', *) → 'linear'\n * ('step', *) → 'step'\n */\nfunction _assembleEasingId(family, type) {\n  if (family === 'linear') return 'linear';\n  if (family === 'step') return 'step';\n  const typeStr = type === 'inout' ? 'InOut' : type === 'out' ? 'Out' : 'In';\n  return `ease${typeStr}${family.charAt(0).toUpperCase()}${family.slice(1)}`;\n}\n\nfunction _getArgLabel(easing) {\n  if (!easing) return 'Arg';\n  if (easing.includes('Back')) return 'Overshoot';\n  if (easing.includes('Elastic')) return 'Bounciness';\n  if (easing.includes('Bounce')) return 'Bounciness';\n  if (easing === 'step') return 'Steps';\n  return 'Arg';\n}\n\nfunction _patchStockInterpolationBar() {\n  if (!BarItems.keyframe_interpolation) return;\n  const orig = BarItems.keyframe_interpolation.condition;\n  BarItems.keyframe_interpolation.condition = function (...args) {\n    if (Format?.id === 'azure_model') return false;\n    return typeof orig === 'function' ? orig.apply(this, args) : true;\n  };\n}\n\n// ---------------------------------------------------------------------------\n// SVG easing curve icons (inline)\n// ---------------------------------------------------------------------------\n\nconst EASING_ICONS = {\n  linear:  '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  step:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 0,-1.32 H 1.85 v -1.32 H 3.17 v -1.33 h 1.32 v -1.32 l 1.33,1e-5\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  sine:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 1.85,5.82 4.76,2.38 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  quad:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 3.17,5.82 4.76,3.04 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  cubic:   '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 3.17,5.82 4.76,3.82 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  quart:   '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 3.17,0 4.23,-2.64 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  quint:   '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 3.44,0 4.23,-1.85 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  expo:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 4.23,0 5.29,-1.06 5.29,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  circ:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"M 0.53,5.82 C 5.82,4.97 5.82,3.17 5.82,0.53\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  back:    '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.29 c 3.17,0 4.23,2.91 5.29,-4.76\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  elastic: '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.15 c 0.79,0 0.79,-0.26 1.32,-0.26 0.53,0 0.79,0.53 1.32,0.53 0.53,0 1.01,-1.84 1.32,-0.79 0.79,2.64 1.32,1.32 1.32,-3.97\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n  bounce:  '<svg viewBox=\"0 0 6.35 6.35\" height=\"20\" width=\"20\"><path d=\"m 0.53,5.82 c 0.26,-0.26 0.53,-0.26 0.79,0 0.53,-0.53 0.53,-0.53 1.06,0 0.79,-2.12 1.59,-2.12 2.38,0 0.26,-4.23 1.06,-5.29 1.06,-5.29\" style=\"fill:none;stroke:currentColor;stroke-width:0.53\"/></svg>',\n};\n"
  },
  {
    "path": "src/azurelib_utils/animation/azure-easing.js",
    "content": "/**\r\n * AzureLib Animator — Easing Definitions\r\n * --------------------------------------\r\n * Provides the easing function registry and argument parsing logic\r\n * used for interpolating animated keyframes in AzureLib.\r\n *\r\n * © 2025 AzureDoom — MIT License\r\n */\r\n\r\nimport { clamp } from 'lodash';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Constants and types\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Enumeration of supported easing functions.\r\n * Matches AzureLib's Java easing mappings for full parity.\r\n */\r\nexport const EASING_TYPES = {\r\n  linear: 'linear',\r\n  step: 'step',\r\n  easeInSine: 'easeInSine',\r\n  easeOutSine: 'easeOutSine',\r\n  easeInOutSine: 'easeInOutSine',\r\n  easeInQuad: 'easeInQuad',\r\n  easeOutQuad: 'easeOutQuad',\r\n  easeInOutQuad: 'easeInOutQuad',\r\n  easeInCubic: 'easeInCubic',\r\n  easeOutCubic: 'easeOutCubic',\r\n  easeInOutCubic: 'easeInOutCubic',\r\n  easeInQuart: 'easeInQuart',\r\n  easeOutQuart: 'easeOutQuart',\r\n  easeInOutQuart: 'easeInOutQuart',\r\n  easeInQuint: 'easeInQuint',\r\n  easeOutQuint: 'easeOutQuint',\r\n  easeInOutQuint: 'easeInOutQuint',\r\n  easeInExpo: 'easeInExpo',\r\n  easeOutExpo: 'easeOutExpo',\r\n  easeInOutExpo: 'easeInOutExpo',\r\n  easeInCirc: 'easeInCirc',\r\n  easeOutCirc: 'easeOutCirc',\r\n  easeInOutCirc: 'easeInOutCirc',\r\n  easeInBack: 'easeInBack',\r\n  easeOutBack: 'easeOutBack',\r\n  easeInOutBack: 'easeInOutBack',\r\n  easeInElastic: 'easeInElastic',\r\n  easeOutElastic: 'easeOutElastic',\r\n  easeInOutElastic: 'easeInOutElastic',\r\n  easeInBounce: 'easeInBounce',\r\n  easeOutBounce: 'easeOutBounce',\r\n  easeInOutBounce: 'easeInOutBounce',\r\n};\r\n\r\n/** Default easing for new keyframes. */\r\nexport const EASING_DEFAULT = EASING_TYPES.linear;\r\n\r\n/** Default argument for easing functions that use one. */\r\nexport const DEFAULT_ARG = 1;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Core helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Compute an eased value between 0 and 1 based on an easing type.\r\n * @param {string} easingName\r\n * @param {number} t - normalized time (0..1)\r\n * @param {number} [arg] - optional argument\r\n * @returns {number}\r\n */\r\nexport function applyEasing(easingName, t, arg = DEFAULT_ARG) {\r\n  const ease = easingRegistry[easingName] || easingRegistry.linear;\r\n  return ease(t, arg);\r\n}\r\n\r\n/**\r\n * Return whether a given easing type expects a numeric argument.\r\n * @param {string} easingName\r\n * @returns {boolean}\r\n */\r\nexport function hasArgs(easingName) {\r\n  return (\r\n    easingName?.includes('Back') ||\r\n    easingName?.includes('Elastic') ||\r\n    easingName?.includes('Bounce') ||\r\n    easingName === 'step'\r\n  );\r\n}\r\n\r\n/**\r\n * Returns the default argument for a given easing.\r\n * @param {string} easingName\r\n * @returns {number}\r\n */\r\nexport function getEasingArgDefault(easingName) {\r\n  if (!hasArgs(easingName)) return DEFAULT_ARG;\r\n  if (easingName?.includes('Back')) return 1.70158;\r\n  if (easingName?.includes('Elastic')) return 1;\r\n  if (easingName?.includes('Bounce')) return 1;\r\n  if (easingName === 'step') return 4;\r\n  return DEFAULT_ARG;\r\n}\r\n\r\n/**\r\n * Parses an argument from user input, falling back to defaults if invalid.\r\n * @param {object} keyframe\r\n * @param {string} input\r\n * @returns {number}\r\n */\r\nexport function parseEasingArg(keyframe, input) {\r\n  const num = parseFloat(input);\r\n  if (isNaN(num)) return getEasingArgDefault(keyframe.easing);\r\n  const arg = Math.max(-9999, Math.min(9999, num));\r\n  return arg;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Easing function implementations\r\n// ---------------------------------------------------------------------------\r\n\r\nconst PI = Math.PI;\r\nconst c1 = 1.70158;\r\nconst c2 = c1 * 1.525;\r\nconst c3 = c1 + 1;\r\nconst c4 = (2 * PI) / 3;\r\nconst c5 = (2 * PI) / 4.5;\r\n\r\nconst bounceOut = x => {\r\n  const n1 = 7.5625;\r\n  const d1 = 2.75;\r\n  if (x < 1 / d1) return n1 * x * x;\r\n  if (x < 2 / d1) return n1 * (x -= 1.5 / d1) * x + 0.75;\r\n  if (x < 2.5 / d1) return n1 * (x -= 2.25 / d1) * x + 0.9375;\r\n  return n1 * (x -= 2.625 / d1) * x + 0.984375;\r\n};\r\n\r\n/**\r\n * The easing registry maps an easing name → function.\r\n * Each function takes `(t, arg?)` and returns eased t.\r\n */\r\nexport const easingRegistry = {\r\n  linear: t => t,\r\n\r\n  step: (t, n = 4) => Math.floor(clamp(t * n, 0, n - 1)) / (n - 1),\r\n\r\n  easeInSine: t => 1 - Math.cos((t * PI) / 2),\r\n  easeOutSine: t => Math.sin((t * PI) / 2),\r\n  easeInOutSine: t => -(Math.cos(PI * t) - 1) / 2,\r\n\r\n  easeInQuad: t => t * t,\r\n  easeOutQuad: t => 1 - (1 - t) * (1 - t),\r\n  easeInOutQuad: t => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2),\r\n\r\n  easeInCubic: t => t * t * t,\r\n  easeOutCubic: t => 1 - Math.pow(1 - t, 3),\r\n  easeInOutCubic: t =>\r\n    t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\r\n\r\n  easeInQuart: t => t * t * t * t,\r\n  easeOutQuart: t => 1 - Math.pow(1 - t, 4),\r\n  easeInOutQuart: t =>\r\n    t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2,\r\n\r\n  easeInQuint: t => t * t * t * t * t,\r\n  easeOutQuint: t => 1 - Math.pow(1 - t, 5),\r\n  easeInOutQuint: t =>\r\n    t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2,\r\n\r\n  easeInExpo: t => (t === 0 ? 0 : Math.pow(2, 10 * t - 10)),\r\n  easeOutExpo: t => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\r\n  easeInOutExpo: t =>\r\n    t === 0\r\n      ? 0\r\n      : t === 1\r\n      ? 1\r\n      : t < 0.5\r\n      ? Math.pow(2, 20 * t - 10) / 2\r\n      : (2 - Math.pow(2, -20 * t + 10)) / 2,\r\n\r\n  easeInCirc: t => 1 - Math.sqrt(1 - Math.pow(t, 2)),\r\n  easeOutCirc: t => Math.sqrt(1 - Math.pow(t - 1, 2)),\r\n  easeInOutCirc: t =>\r\n    t < 0.5\r\n      ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\r\n      : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2,\r\n\r\n  easeInBack: (t, s = c1) => c3 * t * t * t - s * t * t,\r\n  easeOutBack: (t, s = c1) =>\r\n    1 + c3 * Math.pow(t - 1, 3) + s * Math.pow(t - 1, 2),\r\n  easeInOutBack: (t, s = c1) =>\r\n    t < 0.5\r\n      ? (Math.pow(2 * t, 2) * ((c2 + 1) * 2 * t - c2)) / 2\r\n      : (Math.pow(2 * t - 2, 2) * ((c2 + 1) * (t * 2 - 2) + c2) + 2) / 2,\r\n\r\n  easeInElastic: (t, p = 1) =>\r\n    t === 0\r\n      ? 0\r\n      : t === 1\r\n      ? 1\r\n      : -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * c4 * p),\r\n\r\n  easeOutElastic: (t, p = 1) =>\r\n    t === 0\r\n      ? 0\r\n      : t === 1\r\n      ? 1\r\n      : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4 * p) + 1,\r\n\r\n  easeInOutElastic: (t, p = 1) =>\r\n    t === 0\r\n      ? 0\r\n      : t === 1\r\n      ? 1\r\n      : t < 0.5\r\n      ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * c5 * p)) / 2\r\n      : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * c5 * p)) / 2 +\r\n        1,\r\n\r\n  easeInBounce: t => 1 - bounceOut(1 - t),\r\n  easeOutBounce: bounceOut,\r\n  easeInOutBounce: t =>\r\n    t < 0.5\r\n      ? (1 - bounceOut(1 - 2 * t)) / 2\r\n      : (1 + bounceOut(2 * t - 1)) / 2,\r\n};\r\n\r\nexport default easingRegistry;\r\n"
  },
  {
    "path": "src/azurelib_utils/animation/azure-ik.js",
    "content": "/**\n * AzureLib Animator — FABRIK Inverse Kinematics\n * -----------------------------------------------\n * Integrated IK module for the AzureLib Blockbench plugin.\n *\n * Exports (consumed by azure-animation-tab.js):\n *   registerIK()    — call inside registerAzureAnimationFormat()\n *   unregisterIK()  — call inside unregisterAzureAnimationFormat()\n *   IKManager       — singleton, accessible for advanced use\n *\n * Features\n *   • FABRIK solver with pole-vector and hinge-axis constraints\n *   • Three Meta gizmos per chain (Tip/green, Knee/blue, Root/orange)\n *     draggable directly in the Blockbench viewport\n *   • Pin Meta — freezes a gizmo in world-space so the body can move\n *     freely while the foot stays planted (walkcycle floor anchoring)\n *   • Hinge Lock — restricts joint rotation to one axis (X/Y/Z)\n *   • Bake — scrubs every frame, solves IK, writes rotation keyframes\n *     into the active animation via Blockbench's undo system\n *\n * © 2025 AzureDoom — MIT License\n */\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst FABRIK_ITERS   = 24;\nconst FABRIK_EPS     = 0.0005;\n\nconst CLR_TIP    = 0x00ff88;  // green\nconst CLR_KNEE   = 0x44aaff;  // blue\nconst CLR_ROOT   = 0xff9900;  // orange\nconst CLR_PINNED = 0xff2255;  // red — shown when pinned\n\nconst RAD2DEG = 180 / Math.PI;\n\n// ---------------------------------------------------------------------------\n// Math utilities\n// ---------------------------------------------------------------------------\n\nfunction v3(x = 0, y = 0, z = 0) { return new THREE.Vector3(x, y, z); }\n\n/**\n * Animated world-space position of a Blockbench Group bone.\n * group.scene_object is the animated THREE.js bone — getWorldPosition on it\n * returns the actual current position including all animation transforms.\n * This is the same object Blockbench uses in animation_transform.js.\n */\nfunction boneWorldPos(bone) {\n  // During solving we need bone.mesh because we've just written rotations to it\n  // and updateWorldMatrix(true,true) has been called to propagate them.\n  // bone.scene_object reflects Blockbench's last preview pass, not our live writes.\n  const obj = bone.mesh ?? bone.scene_object;\n  if (!obj) return v3();\n  obj.updateWorldMatrix(true, false);\n  return new THREE.Vector3().setFromMatrixPosition(obj.matrixWorld);\n}\n\nfunction segmentLengths(positions) {\n  return positions.slice(0, -1).map((p, i) => p.distanceTo(positions[i + 1]));\n}\n\n// ---------------------------------------------------------------------------\n// FABRIKSolver — pure math, no Blockbench I/O\n// ---------------------------------------------------------------------------\n\nconst FABRIKSolver = {\n  /**\n   * @param {THREE.Vector3[]} joints    root-first joint world positions\n   * @param {number[]}        lengths   segment lengths\n   * @param {THREE.Vector3}   target    desired tip world pos\n   * @param {THREE.Vector3|null} pole   optional pole-vector hint\n   * @param {{ hingeAxis?: 'x'|'y'|'z'|null, pinRoot?: boolean }} opts\n   * @returns {THREE.Vector3[]}\n   */\n  solve(joints, lengths, target, pole, opts = {}) {\n    const n       = joints.length;\n    if (n < 2) return joints.map(j => j.clone());\n\n    const pts     = joints.map(j => j.clone());\n    const root    = pts[0].clone();\n    const total   = lengths.reduce((s, l) => s + l, 0);\n    const pinRoot = opts.pinRoot !== false;\n\n    // Chain fully stretched toward target\n    if (pts[0].distanceTo(target) >= total) {\n      for (let i = 0; i < n - 1; i++) {\n        const d = target.distanceTo(pts[i]);\n        pts[i + 1].lerpVectors(pts[i], target, lengths[i] / d);\n      }\n      return pts;\n    }\n\n    for (let iter = 0; iter < FABRIK_ITERS; iter++) {\n      // Forward pass  tip → root\n      pts[n - 1].copy(target);\n      for (let i = n - 2; i >= 0; i--) {\n        const d = pts[i + 1].distanceTo(pts[i]);\n        if (d < 1e-9) continue;\n        pts[i].lerpVectors(pts[i + 1], pts[i], lengths[i] / d);\n      }\n\n      // Backward pass  root → tip\n      if (pinRoot) pts[0].copy(root);\n      for (let i = 0; i < n - 1; i++) {\n        const d = pts[i].distanceTo(pts[i + 1]);\n        if (d < 1e-9) continue;\n        pts[i + 1].lerpVectors(pts[i], pts[i + 1], lengths[i] / d);\n      }\n\n      // Pole-vector nudge\n      if (pole && n >= 3) this._poleHint(pts, lengths, pole);\n\n      // Hinge constraint\n      if (opts.hingeAxis) this._hinge(pts, lengths, opts.hingeAxis);\n\n      if (pts[n - 1].distanceTo(target) < FABRIK_EPS) break;\n    }\n\n    return pts;\n  },\n\n  _poleHint(pts, lengths, pole) {\n    const mid   = Math.floor(pts.length / 2);\n    const nudge = pole.clone().sub(pts[mid]).normalize()\n                     .multiplyScalar(pts[mid - 1].distanceTo(pts[mid]) * 0.25);\n    pts[mid].add(nudge);\n    // Re-project forward\n    for (let i = mid; i < pts.length - 1; i++) {\n      const d = pts[i + 1].distanceTo(pts[i]);\n      if (d < 1e-9) continue;\n      pts[i + 1].lerpVectors(pts[i], pts[i + 1], lengths[i] / d);\n    }\n    // Re-project backward\n    for (let i = mid; i > 0; i--) {\n      const d = pts[i - 1].distanceTo(pts[i]);\n      if (d < 1e-9) continue;\n      pts[i - 1].lerpVectors(pts[i], pts[i - 1], lengths[i - 1] / d);\n    }\n  },\n\n  _hinge(pts, lengths, axis) {\n    const axVec = axis === 'x' ? v3(1, 0, 0)\n                : axis === 'z' ? v3(0, 0, 1)\n                : v3(0, 1, 0);\n    for (let i = 0; i < pts.length - 1; i++) {\n      const delta   = pts[i + 1].clone().sub(pts[i]);\n      const inPlane = delta.clone().sub(delta.clone().projectOnVector(axVec)).normalize();\n      if (inPlane.lengthSq() < 1e-8) continue;\n      pts[i + 1].copy(pts[i]).addScaledVector(inPlane, lengths[i]);\n    }\n  },\n};\n\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\n// Gizmo scene helpers\n// Exact pattern used by Blockbench's own transform gizmo (transform_gizmo.js):\n//   depthTest:false + depthWrite:false + transparent:true + renderOrder:999\n// transparent:true is essential — without it Three.js uses the opaque render\n// queue which ignores renderOrder for depth, so the object gets occluded.\n// ---------------------------------------------------------------------------\n\nfunction _addGizmoToScene(obj) {\n  obj.traverse(child => {\n    child.renderOrder = 999;\n    if (child.material) {\n      const mats = Array.isArray(child.material) ? child.material : [child.material];\n      mats.forEach(m => {\n        m.depthTest   = false;\n        m.depthWrite  = false;\n        m.transparent = true;   // required — moves object to transparent render queue\n        // which respects renderOrder, unlike the opaque queue\n      });\n    }\n  });\n  obj.renderOrder = 999;\n  if (typeof scene !== 'undefined') scene.add(obj);\n}\n\nfunction _removeGizmoFromScene(obj) {\n  if (typeof scene !== 'undefined') scene.remove(obj);\n}\n\nconst IKOverlay = {\n  init()      {},\n  hook()      {},\n  unhook()    {},\n  dispose()   {},\n  add(obj)    { _addGizmoToScene(obj); },\n  remove(obj) { _removeGizmoFromScene(obj); },\n};\n\n// ---------------------------------------------------------------------------\n// Constants — gizmo visuals\n// ---------------------------------------------------------------------------\n\nconst GIZMO_BOX_SIZE = 3;\n\n// ---------------------------------------------------------------------------\n// MetaController — solid coloured box gizmo in the overlay scene\n// ---------------------------------------------------------------------------\n\nclass MetaController {\n  constructor(id, role, initPos) {\n    this.id        = id;\n    this.role      = role;        // 'tip' | 'knee' | 'root'\n    this.position  = initPos.clone();\n    this.pinned    = false;\n    this.pinnedPos = null;\n    this._mesh     = null;\n    this._build();\n  }\n\n  _color() {\n    if (this.pinned)          return CLR_PINNED;\n    if (this.role === 'tip')  return CLR_TIP;\n    if (this.role === 'knee') return CLR_KNEE;\n    return CLR_ROOT;\n  }\n\n  _build() {\n    const s = GIZMO_BOX_SIZE;\n\n    // Solid coloured box — added directly to scene, no children\n    const solidMat = new THREE.MeshBasicMaterial({ color: this._color() });\n    this._mesh = new THREE.Mesh(new THREE.BoxGeometry(s, s, s), solidMat);\n    this._mesh.position.copy(this.position);\n    this._mesh.userData.ikMetaId = this.id;\n\n    // Separate edge lines object — gives the X-marks wireframe look\n    const edgesMat = new THREE.LineBasicMaterial({ color: 0x000000 });\n    this._edges = new THREE.LineSegments(\n      new THREE.EdgesGeometry(new THREE.BoxGeometry(s, s, s)),\n      edgesMat,\n    );\n    this._edges.position.copy(this.position);\n\n    // Add both independently so each gets its own onBeforeRender depth-clear\n    IKOverlay.add(this._mesh);\n    IKOverlay.add(this._edges);\n  }\n\n  refreshColor() {\n    if (this._mesh) this._mesh.material.color.setHex(this._color());\n  }\n\n  moveTo(pos) {\n    this.position.copy(pos);\n    if (this._mesh)  this._mesh.position.copy(pos);\n    if (this._edges) this._edges.position.copy(pos);\n  }\n\n  togglePin() {\n    this.pinned    = !this.pinned;\n    this.pinnedPos = this.pinned ? this.position.clone() : null;\n    this.refreshColor();\n  }\n\n  dispose() {\n    if (this._mesh) {\n      IKOverlay.remove(this._mesh);\n      this._mesh.geometry.dispose();\n      this._mesh.material.dispose();\n      this._mesh = null;\n    }\n    if (this._edges) {\n      IKOverlay.remove(this._edges);\n      this._edges.geometry.dispose();\n      this._edges.material.dispose();\n      this._edges = null;\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// IKChain — bones + Metas + white connector lines\n// ---------------------------------------------------------------------------\n\nclass IKChain {\n  /**\n   * @param {string}   name\n   * @param {Group[]}  bones  ordered Blockbench Group array (root → tip)\n   */\n  constructor(name, bones) {\n    this.name      = name;\n    this.bones     = bones;\n    this.enabled   = true;\n    this.hingeAxis = null;\n    this._lastRotDelta = {};\n\n    const restPos  = bones.map(b => boneWorldPos(b));\n    this._lengths  = segmentLengths(restPos);\n\n    const tipPos   = restPos.at(-1).clone();\n    const rootPos  = restPos[0].clone();\n\n    // Place knee meta exactly at the middle bone's world position.\n    // The user drags it to set the pole direction; starting on the joint\n    // matches the reference and avoids orientation-dependent wrong guesses.\n    const midPos = restPos[Math.floor(restPos.length / 2)].clone();\n\n    this.metaTip  = new MetaController(`${name}_tip`,  'tip',  tipPos);\n    this.metaKnee = new MetaController(`${name}_knee`, 'knee', midPos);\n    this.metaRoot = new MetaController(`${name}_root`, 'root', rootPos);\n\n    // White lines connecting root→knee→tip in the overlay scene\n    this._lineMat = new THREE.LineBasicMaterial({\n      color: 0xffffff, depthTest: false, depthWrite: false, transparent: true,\n    });\n    this._lineGeo  = new THREE.BufferGeometry();\n    this._linePositions = new Float32Array(3 * 3);\n    this._lineGeo.setAttribute('position',\n      new THREE.BufferAttribute(this._linePositions, 3));\n    this._line = new THREE.Line(this._lineGeo, this._lineMat);\n    this._line.renderOrder = 9500;\n    IKOverlay.add(this._line);\n\n    this._updateLines();\n  }\n\n  _updateLines() {\n    if (!this._linePositions || !this._lineGeo) return;\n    const p = this._linePositions;\n    const r = this.metaRoot.position;\n    const k = this.metaKnee.position;\n    const t = this.metaTip.position;\n    p[0] = r.x; p[1] = r.y; p[2] = r.z;\n    p[3] = k.x; p[4] = k.y; p[5] = k.z;\n    p[6] = t.x; p[7] = t.y; p[8] = t.z;\n    this._lineGeo.attributes.position.needsUpdate = true;\n  }\n\n  solve() {\n    if (!this.enabled) return;\n\n    // Seed current joint positions from the mesh hierarchy (live, not stale scene_object)\n    // First ensure the root bone's world matrix is fresh from Blockbench's last frame\n    const rootMesh = this.bones[0]?.mesh;\n    if (rootMesh) rootMesh.updateWorldMatrix(true, true);\n\n    const currentPos = this.bones.map(b => boneWorldPos(b));\n    const tipTarget  = this.metaTip.pinned\n      ? this.metaTip.pinnedPos.clone()\n      : this.metaTip.position.clone();\n\n    const solved = FABRIKSolver.solve(\n      currentPos,\n      this._lengths,\n      tipTarget,\n      this.metaKnee.position,\n      { hingeAxis: this.hingeAxis, pinRoot: true },\n    );\n\n    this._writeRotations(solved);\n\n    if (!this.metaTip.pinned) this.metaTip.moveTo(solved.at(-1));\n    this._updateLines();\n  }\n\n  _writeRotations(solved) {\n    this._lastRotDelta = {};\n\n    for (let i = 0; i < this.bones.length - 1; i++) {\n      const bone     = this.bones[i];\n      const boneMesh = bone.mesh;\n      if (!boneMesh) continue;\n\n      const worldStart = solved[i].clone();\n      const worldEnd   = solved[i + 1].clone();\n\n      // Convert start and end into this bone's LOCAL space\n      // (exactly as Blockbench's own IK does in timeline_animators.js)\n      boneMesh.updateWorldMatrix(true, false);\n      const localStart = boneMesh.worldToLocal(worldStart.clone());\n      const localEnd   = boneMesh.worldToLocal(worldEnd.clone());\n      const localDir   = localEnd.clone().sub(localStart).normalize();\n\n      if (localDir.lengthSq() < 1e-8) continue;\n\n      // Rest-pose direction in local space:\n      // In rest pose the bone points from its own origin toward the next bone's origin.\n      // After worldToLocal this becomes the local +Y direction (0,1,0) assuming\n      // the bone is at its rest rotation. We use the actual rest direction from origins.\n      const nextBone = this.bones[i + 1];\n      const restDir  = new THREE.Vector3(\n        nextBone.origin[0] - bone.origin[0],\n        nextBone.origin[1] - bone.origin[1],\n        nextBone.origin[2] - bone.origin[2],\n      );\n      // Convert rest direction to bone local space at rest pose\n      const restLocal = boneMesh.worldToLocal(\n        new THREE.Vector3(\n          bone.mesh.getWorldPosition(new THREE.Vector3()).x + restDir.x,\n          bone.mesh.getWorldPosition(new THREE.Vector3()).y + restDir.y,\n          bone.mesh.getWorldPosition(new THREE.Vector3()).z + restDir.z,\n        )\n      ).normalize();\n\n      if (restLocal.lengthSq() < 1e-8) continue;\n\n      // Quaternion that rotates restLocal → localDir (both in bone local space)\n      const q = new THREE.Quaternion().setFromUnitVectors(restLocal, localDir);\n      const euler = new THREE.Euler().setFromQuaternion(q, boneMesh.rotation.order || 'ZYX');\n\n      // Apply: ADD to current mesh rotation (same as Blockbench's IK)\n      boneMesh.rotation.x += euler.x;\n      boneMesh.rotation.y += euler.y;\n      boneMesh.rotation.z += euler.z;\n\n      // Apply hinge constraint\n      if (this.hingeAxis) {\n        const fix = boneMesh.fix_rotation ?? new THREE.Euler();\n        if (this.hingeAxis === 'x') { boneMesh.rotation.y = fix.y; boneMesh.rotation.z = fix.z; }\n        else if (this.hingeAxis === 'y') { boneMesh.rotation.x = fix.x; boneMesh.rotation.z = fix.z; }\n        else if (this.hingeAxis === 'z') { boneMesh.rotation.x = fix.x; boneMesh.rotation.y = fix.y; }\n      }\n\n      // Propagate to children\n      boneMesh.updateWorldMatrix(false, true);\n\n      // Store keyframe delta = (mesh.rotation - fix_rotation) in degrees\n      const fix = boneMesh.fix_rotation ?? new THREE.Euler();\n      this._lastRotDelta[bone.uuid] = {\n        x: (boneMesh.rotation.x - fix.x) * RAD2DEG,\n        y: (boneMesh.rotation.y - fix.y) * RAD2DEG,\n        z: (boneMesh.rotation.z - fix.z) * RAD2DEG,\n      };\n    }\n  }\n\n  toggleHinge(axis) {\n    this.hingeAxis = this.hingeAxis === axis ? null : axis;\n  }\n\n  dispose() {\n    // Reset bones to rest rotation\n    for (const bone of this.bones) {\n      if (bone.mesh?.fix_rotation) bone.mesh.rotation.copy(bone.mesh.fix_rotation);\n    }\n    this._lastRotDelta = {};\n    this._linePositions = null;\n    try { Animator.preview(); } catch (_) {}\n\n    this.metaTip.dispose();\n    this.metaKnee.dispose();\n    this.metaRoot.dispose();\n    if (this._line) {\n      IKOverlay.remove(this._line);\n      this._lineGeo.dispose();\n      this._lineMat.dispose();\n      this._line = null;\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// IKManager — top-level singleton\n// ---------------------------------------------------------------------------\n\nexport const IKManager = {\n  chains:     [],\n  _raycaster: new THREE.Raycaster(),\n  _dragState: null,\n  _canvas:    null,\n  _onFrameBound:   null,\n  _compileBound:   null,\n  _parseBound:     null,\n  _onDownBound:    null,\n  _onMoveBound:    null,\n  _onUpBound:      null,\n  _panel:          null,\n  _createAction:   null,\n  _bakeAllAction:  null,\n\n  // ── Public lifecycle ─────────────────────────────────────────────────────\n\n  register() {\n    IKOverlay.init();\n    IKOverlay.hook();\n\n    this._onFrameBound = () => this._onFrame();\n    Blockbench.on('display_animation_frame', this._onFrameBound);\n\n    // Persist chains in the .bbmodel project file\n    this._compileBound = (e) => this._onCompile(e);\n    this._parseBound   = (e) => this._onParse(e);\n    Codecs.project.on('compile', this._compileBound);\n    Codecs.project.on('parsed',  this._parseBound);  // 'parsed' fires after bones are in Group.all\n\n    this._registerActions();\n    this._registerPanel();\n    this._wireCanvas();\n    console.log('[AzureIK] IK registered');\n  },\n\n  unregister() {\n    Blockbench.removeListener('display_animation_frame', this._onFrameBound);\n    Codecs.project.events.compile.remove(this._compileBound);\n    if (Codecs.project.events.parsed) Codecs.project.events.parsed.remove(this._parseBound);\n\n    this.chains.forEach(c => c.dispose());\n    this.chains = [];\n\n    this._createAction?.delete();\n    this._bakeAllAction?.delete();\n    this._createAction  = null;\n    this._bakeAllAction = null;\n\n    this._unregisterPanel();\n    this._unwireCanvas();\n    IKOverlay.dispose();\n    console.log('[AzureIK] IK unregistered');\n  },\n\n  // ── Project persistence ───────────────────────────────────────────────────\n\n  _onCompile(event) {\n    if (Format?.id !== 'azure_model') return;\n    if (!this.chains.length) return;\n    event.model.azureIKChains = this.chains.map(chain => ({\n      name:      chain.name,\n      enabled:   chain.enabled,\n      hingeAxis: chain.hingeAxis,\n      bones:     chain.bones.map(b => b.name),\n      metaTip:  { pos: chain.metaTip.position.toArray(),  pinned: chain.metaTip.pinned },\n      metaKnee: { pos: chain.metaKnee.position.toArray(), pinned: chain.metaKnee.pinned },\n      metaRoot: { pos: chain.metaRoot.position.toArray(), pinned: chain.metaRoot.pinned },\n    }));\n  },\n\n  _onParse(event) {\n    const model = event.model || {};\n    const saved = model.azureIKChains;\n    if (!Array.isArray(saved) || !saved.length) return;\n\n    this.chains.forEach(c => c.dispose());\n    this.chains = [];\n\n    for (const data of saved) {\n      const bones = data.bones\n        .map(name => Group.all.find(g => g.name === name))\n        .filter(Boolean);\n      if (bones.length < 2) continue;\n\n      const chain     = new IKChain(data.name, bones);\n      chain.enabled   = data.enabled ?? true;\n      chain.hingeAxis = data.hingeAxis ?? null;\n\n      const restore = (meta, saved) => {\n        if (saved?.pos) meta.moveTo(new THREE.Vector3(...saved.pos));\n        if (saved?.pinned) meta.togglePin();\n      };\n      restore(chain.metaTip,  data.metaTip);\n      restore(chain.metaKnee, data.metaKnee);\n      restore(chain.metaRoot, data.metaRoot);\n\n      this.chains.push(chain);\n    }\n\n    this._panel?.vue?.$forceUpdate();\n    console.log(`[AzureIK] Restored ${this.chains.length} IK chain(s) from project.`);\n  },\n\n  // ── Frame solve ───────────────────────────────────────────────────────────\n\n  _onFrame() {\n    if (Format?.id !== 'azure_model') return;\n    if (!Animator.open) return;\n    // Only solve when a Meta is actively being dragged — do NOT solve every frame\n    // as that corrupts bone rotations while the user is scrubbing keyframes.\n    if (!this._dragState) return;\n    this.chains.forEach(c => c.solve());\n  },\n\n  // ── Chain management ──────────────────────────────────────────────────────\n\n  /**\n   * Walk a bone's direct children, following the single-child spine downward.\n   * Stops when a bone has 0 or 2+ Group children (fork or leaf).\n   * Returns the ordered array [root, child, grandchild, ...].\n   */\n  _walkChain(root) {\n    const chain = [root];\n    let current = root;\n    // eslint-disable-next-line no-constant-condition\n    while (true) {\n      const childBones = (current.children || []).filter(c => c instanceof Group);\n      if (childBones.length !== 1) break;   // stop at fork or leaf\n      current = childBones[0];\n      chain.push(current);\n      if (chain.length > 64) break;         // safety cap\n    }\n    return chain;\n  },\n\n  /**\n   * Sort a flat selection of Group bones into parent-first hierarchy order\n   * by checking parent links. Falls back to the raw selection if the bones\n   * are not all in the same chain.\n   */\n  _sortByHierarchy(bones) {\n    if (!bones.length) return bones;\n\n    // Build a set for fast membership lookup\n    const set = new Set(bones);\n\n    // Find the root: the bone whose parent is NOT in the selection\n    const roots = bones.filter(b => {\n      let p = b.parent;\n      while (p) {\n        if (set.has(p)) return false;\n        p = p.parent;\n      }\n      return true;\n    });\n\n    if (roots.length !== 1) return bones;  // multiple roots → can't determine order\n\n    // Walk down from root, picking only bones that are in the selection\n    const sorted = [];\n    const visit = (bone) => {\n      if (!set.has(bone)) return;\n      sorted.push(bone);\n      (bone.children || [])\n        .filter(c => c instanceof Group && set.has(c))\n        .forEach(visit);\n    };\n    visit(roots[0]);\n\n    return sorted.length === bones.length ? sorted : bones;\n  },\n\n  createChainFromSelection() {\n    // In Animate mode Blockbench routes bone selection through the BoneAnimator /\n    // timeline, so Outliner.selected is often empty even when a bone is visibly\n    // highlighted. We therefore check every available selection source and merge\n    // them, deduplicated, so the function works in both Edit and Animate mode.\n    const selSources = [\n      ...(Outliner.selected              || []),\n      ...(Group.selected                 || []),  // populated in Animate mode\n      ...(Project?.selected_elements     || []),\n    ];\n    const rawSel = [...new Set(selSources)].filter(el => el instanceof Group);\n    console.log('[AzureIK] createChainFromSelection — rawSel:', rawSel.map(g => g.name),\n      '| Outliner.selected:', (Outliner.selected || []).map(g => g.name ?? g.constructor?.name),\n      '| Group.selected:', (Array.isArray(Group?.selected) ? Group.selected : [Group?.selected])\n        .filter(Boolean).map(g => g.name));\n\n    let bones;\n\n    if (rawSel.length === 1) {\n      // Single bone selected — auto-walk down its child spine\n      bones = this._walkChain(rawSel[0]);\n      if (bones.length < 2) {\n        Blockbench.showMessage(\n          `\"${rawSel[0].name}\" has no single-child chain to follow. ` +\n          'Select the bones you want manually (root → tip) and try again.',\n          'center',\n        );\n        return null;\n      }\n    } else if (rawSel.length >= 2) {\n      // Multi-selection — sort into hierarchy order\n      bones = this._sortByHierarchy(rawSel);\n      if (bones.length < 2) {\n        Blockbench.showMessage('Could not determine chain order. Select bones from root → tip.', 'center');\n        return null;\n      }\n    } else {\n      // Last resort: try the most recently interacted-with Group anywhere in BB's state\n      const lastGroup = typeof Group !== 'undefined' && Group.all\n        ? Group.all.find(g => g.selected)\n        : null;\n      if (lastGroup) {\n        bones = this._walkChain(lastGroup);\n        if (bones.length < 2) {\n          Blockbench.showMessage(\n            `\"${lastGroup.name}\" has no child chain to follow. Select a root bone with children.`,\n            'center',\n          );\n          return null;\n        }\n      } else {\n        console.warn('[AzureIK] createChainFromSelection: no Group found in any selection source.',\n          { OutlinerSelected: Outliner.selected, GroupSelected: Group?.selected });\n        Blockbench.showMessage(\n          'No bone selected. Click a bone in the Outliner or viewport first, then press Create IK Chain.',\n          'center',\n        );\n        return null;\n      }\n    }\n\n    const name  = `Chain_${this.chains.length + 1}`;\n    const chain = new IKChain(name, bones);\n    this.chains.push(chain);\n    Blockbench.showMessage(`IK chain \"${name}\" created (${bones.length} bones).`, 'center');\n    this._panel?.vue?.$forceUpdate();\n    return chain;\n  },\n\n  removeChain(chain) {\n    chain.dispose();\n    this.chains = this.chains.filter(c => c !== chain);\n    this._panel?.vue?.$forceUpdate();\n  },\n\n  // ── Bake ──────────────────────────────────────────────────────────────────\n\n  bakeChain(chain) {\n    const anim = Animation.selected;\n    if (!anim) {\n      Blockbench.showMessageBox({ title: 'No Animation', message: 'Please select an animation first.' });\n      return;\n    }\n    new Dialog({\n      id:    'azl_ik_bake',\n      title: `Bake IK — ${chain.name}`,\n      form: {\n        fps:       { label: 'Frames per second', type: 'number', value: 20, min: 1, max: 60 },\n        overwrite: { label: 'Overwrite existing rotation keyframes', type: 'checkbox', value: true },\n      },\n      onConfirm: ({ fps, overwrite }) => this._doBake([chain], fps, overwrite),\n    }).show();\n  },\n\n  bakeAllChains() {\n    if (!this.chains.length) return;\n    const anim = Animation.selected;\n    if (!anim) {\n      Blockbench.showMessageBox({ title: 'No Animation', message: 'Please select an animation first.' });\n      return;\n    }\n    new Dialog({\n      id:    'azl_ik_bake_all',\n      title: 'Bake All IK Chains',\n      form: {\n        fps:       { label: 'Frames per second', type: 'number', value: 20, min: 1, max: 60 },\n        overwrite: { label: 'Overwrite existing rotation keyframes', type: 'checkbox', value: true },\n      },\n      onConfirm: ({ fps, overwrite }) => this._doBake(this.chains, fps, overwrite),\n    }).show();\n  },\n\n  _doBake(chains, fps, overwrite) {\n    const anim = Animation.selected;\n    if (!anim) return;\n\n    Undo.initEdit({ animations: [anim] });\n    const totalFrames = Math.ceil(anim.length * fps);\n\n    for (let f = 0; f <= totalFrames; f++) {\n      const time = Math.round(f / fps * 1e6) / 1e6;\n      Timeline.setTime(time);\n      Animator.preview();\n\n      for (const chain of chains) {\n        chain.solve();\n        for (const bone of chain.bones.slice(0, -1)) {\n          const animator = anim.getBoneAnimator(bone);\n          if (!animator) continue;\n\n          const delta = chain._lastRotDelta?.[bone.uuid] ?? { x: 0, y: 0, z: 0 };\n\n          if (overwrite) {\n            const toRemove = animator.keyframes.filter(\n              k => k.channel === 'rotation' && Math.abs(k.time - time) < 0.5 / fps\n            );\n            toRemove.forEach(k => {\n              const idx = animator.keyframes.indexOf(k);\n              if (idx !== -1) animator.keyframes.splice(idx, 1);\n            });\n          }\n\n          animator.addKeyframe({\n            channel:       'rotation',\n            time,\n            interpolation: 'linear',\n            data_points:   [{\n              x: delta.x.toFixed(4),\n              y: delta.y.toFixed(4),\n              z: delta.z.toFixed(4),\n            }],\n          });\n        }\n      }\n    }\n\n    Undo.finishEdit(`Bake IK: ${chains.map(c => c.name).join(', ')}`);\n    Timeline.setTime(0);\n    Animator.preview();\n\n    const label = chains.length === 1 ? `\"${chains[0].name}\"` : `${chains.length} chains`;\n    Blockbench.showMessage(`✓ Baked ${label} — ${totalFrames + 1} frames @ ${fps} fps`, 'center');\n  },\n\n  // ── BB Actions ────────────────────────────────────────────────────────────\n\n  _registerActions() {\n    this._createAction = new Action('azl_ik_create_chain', {\n      name:        'Create IK Chain',\n      description: 'Select a root bone (auto-walks children) or multiple bones (root → tip)',\n      icon:        'icon-bone',\n      category:    'animation',\n      condition:   () => Format?.id === 'azure_model' && Animator.open,\n      click:       () => this.createChainFromSelection(),\n    });\n\n    this._bakeAllAction = new Action('azl_ik_bake_all', {\n      name:        'Bake All IK Chains',\n      description: 'Write solved IK rotations as keyframes into the active animation',\n      icon:        'icon-keyframe',\n      category:    'animation',\n      condition:   () => Format?.id === 'azure_model' && Animator.open && this.chains.length > 0,\n      click:       () => this.bakeAllChains(),\n    });\n\n    // Append to Animation menu and Outliner toolbar\n    try { MenuBar.menus?.animation?.addAction(this._createAction); }   catch (_) {}\n    try { MenuBar.menus?.animation?.addAction(this._bakeAllAction); }  catch (_) {}\n    try { Toolbars.outliner?.add(this._createAction); }                catch (_) {}\n  },\n\n  // ── Persistent side panel ─────────────────────────────────────────────────\n\n  _registerPanel() {\n    const manager = this;\n\n    this._panel = new Panel('azl_ik_panel', {\n      name: 'IK Chains',\n      icon: 'icon-bone',\n      display_condition: {\n        modes:   ['animate'],\n        formats: ['azure_model'],\n      },\n      default_position: {\n        slot:   'left_bar',\n        float_position: [0, 0],\n        float_size:     [300, 400],\n        folded: false,\n      },\n      component: {\n        name: 'azl-ik-panel',\n        data() {\n          return { manager };\n        },\n        computed: {\n          chains() { return this.manager.chains; },\n        },\n        methods: {\n          createChain() { manager.createChainFromSelection(); },\n          removeChain(chain) { manager.removeChain(chain); },\n          toggleEnabled(chain) { chain.enabled = !chain.enabled; },\n          togglePin(meta) {\n            meta.togglePin();\n            this.$forceUpdate();\n          },\n          toggleHinge(chain, ax) {\n            chain.toggleHinge(ax);\n            this.$forceUpdate();\n          },\n          bakeChain(chain) { manager.bakeChain(chain); },\n          bakeAll() { manager.bakeAllChains(); },\n          metaDotColor(meta) {\n            if (meta.pinned)          return '#ff2255';\n            if (meta.role === 'tip')  return '#00ff88';\n            if (meta.role === 'knee') return '#44aaff';\n            return '#ff9900';\n          },\n        },\n        template: `\n<div style=\"padding:8px;font-size:12px;\">\n\n  <!-- Empty state -->\n  <div v-if=\"!chains.length\" style=\"color:var(--color-subtle);line-height:1.6;padding:4px 2px;\">\n    <p style=\"margin:0 0 6px 0;\">No IK chains yet.</p>\n    <p style=\"margin:0;\">Select a <b>root bone</b> in the Outliner — its child chain will be detected automatically. Or select multiple bones (root → tip) for a custom chain.</p>\n  </div>\n\n  <!-- Chain cards -->\n  <div v-for=\"chain in chains\" :key=\"chain.name\"\n       style=\"border:1px solid var(--color-border);border-radius:4px;padding:7px 8px;margin-bottom:7px;\">\n\n    <!-- Chain header -->\n    <div style=\"display:flex;align-items:center;gap:5px;margin-bottom:5px;\">\n      <input type=\"checkbox\" :checked=\"chain.enabled\" @change=\"toggleEnabled(chain)\" style=\"cursor:pointer;\" title=\"Enable / disable solving\">\n      <span style=\"flex:1;font-weight:600;\">{{ chain.name }}</span>\n      <span style=\"font-size:10px;color:var(--color-subtle);\">{{ chain.bones.length }} bones</span>\n      <button class=\"dark_bordered\" @click=\"removeChain(chain)\" style=\"padding:1px 6px;cursor:pointer;\" title=\"Remove chain\">✕</button>\n    </div>\n\n    <!-- Tip meta row -->\n    <div style=\"display:flex;align-items:center;gap:5px;margin-bottom:3px;\">\n      <span style=\"width:9px;height:9px;border-radius:2px;flex-shrink:0;display:inline-block;\"\n            :style=\"{ background: metaDotColor(chain.metaTip) }\"></span>\n      <span style=\"flex:1;\">🟢 Tip <small style=\"color:var(--color-subtle);\">(drag in viewport)</small></span>\n      <button class=\"dark_bordered\" @click=\"togglePin(chain.metaTip)\"\n              :style=\"{ padding:'1px 8px', cursor:'pointer', color: chain.metaTip.pinned ? '#ff2255' : '' }\"\n              :title=\"chain.metaTip.pinned ? 'Unpin Tip' : 'Pin Tip to current world position (floor anchor)'\">\n        {{ chain.metaTip.pinned ? '📌 Pinned' : 'Pin' }}\n      </button>\n    </div>\n\n    <!-- Knee meta row -->\n    <div style=\"display:flex;align-items:center;gap:5px;margin-bottom:5px;\">\n      <span style=\"width:9px;height:9px;border-radius:2px;flex-shrink:0;display:inline-block;\"\n            :style=\"{ background: metaDotColor(chain.metaKnee) }\"></span>\n      <span style=\"flex:1;\">🔵 Knee <small style=\"color:var(--color-subtle);\">(pole vector)</small></span>\n      <button class=\"dark_bordered\" @click=\"togglePin(chain.metaKnee)\"\n              :style=\"{ padding:'1px 8px', cursor:'pointer', color: chain.metaKnee.pinned ? '#ff2255' : '' }\"\n              :title=\"chain.metaKnee.pinned ? 'Unpin Knee' : 'Pin Knee to current world position'\">\n        {{ chain.metaKnee.pinned ? '📌 Pinned' : 'Pin' }}\n      </button>\n    </div>\n\n    <!-- Hinge lock -->\n    <div style=\"display:flex;align-items:center;gap:3px;margin-bottom:6px;\">\n      <span style=\"flex:1;font-size:11px;color:var(--color-text);\">Hinge:</span>\n      <button v-for=\"ax in ['x','y','z']\" :key=\"ax\" class=\"dark_bordered\"\n              @click=\"toggleHinge(chain, ax)\"\n              :style=\"{ padding:'1px 8px', cursor:'pointer', fontSize:'11px',\n                        color: chain.hingeAxis === ax ? 'var(--color-accent)' : '',\n                        borderColor: chain.hingeAxis === ax ? 'var(--color-accent)' : '' }\"\n              :title=\"'Restrict joints to ' + ax.toUpperCase() + ' axis rotation only'\">\n        {{ ax.toUpperCase() }}\n      </button>\n      <button v-if=\"chain.hingeAxis\" class=\"dark_bordered\"\n              @click=\"toggleHinge(chain, chain.hingeAxis)\"\n              style=\"padding:1px 6px;cursor:pointer;font-size:11px;color:var(--color-subtle);\"\n              title=\"Remove hinge lock\">✕</button>\n      <span v-if=\"!chain.hingeAxis\" style=\"font-size:10px;color:var(--color-subtle);margin-left:2px;\">None</span>\n    </div>\n\n    <!-- Per-chain bake -->\n    <button class=\"dark_bordered\" @click=\"bakeChain(chain)\"\n            style=\"width:100%;padding:3px;cursor:pointer;font-size:11px;\">\n      ⬇ Bake to Keyframes\n    </button>\n  </div>\n\n  <!-- Create button — always visible -->\n  <button class=\"dark_bordered\" @click=\"createChain()\"\n          style=\"width:100%;padding:4px;cursor:pointer;margin-top:2px;font-weight:600;\">\n    + Create IK Chain from Selection\n  </button>\n\n  <!-- Bake all — only when multiple chains -->\n  <button v-if=\"chains.length > 1\" class=\"dark_bordered\" @click=\"bakeAll()\"\n          style=\"width:100%;padding:4px;cursor:pointer;margin-top:4px;\n                 background:var(--color-accent);color:#fff;border-color:var(--color-accent);\">\n    ⬇ Bake ALL Chains\n  </button>\n\n</div>`,\n      },\n    });\n  },\n\n  _unregisterPanel() {\n    if (this._panel) {\n      this._panel.delete();\n      this._panel = null;\n    }\n  },\n\n  // ── Canvas drag ───────────────────────────────────────────────────────────\n  // We attach to the Preview wrapper element (not the raw canvas) using\n  // pointerdown/pointermove/pointerup so we don't race with Blockbench's own\n  // mouse handler. We only intercept when the pointer hits a Meta gizmo.\n\n  _wireCanvas() {\n    setTimeout(() => {\n      // Blockbench's main 3-D viewport wrapper — more reliable than querying canvas\n      const el = document.getElementById('preview') ?? document.querySelector('.preview');\n      if (!el) {\n        console.warn('[AzureIK] Could not find preview element for drag wiring');\n        return;\n      }\n      this._canvas = el;\n\n      this._onDownBound = e => this._onDown(e);\n      this._onMoveBound = e => this._onMove(e);\n      this._onUpBound   = e => this._onUp(e);\n\n      el.addEventListener('pointerdown', this._onDownBound);\n      el.addEventListener('pointermove', this._onMoveBound);\n      el.addEventListener('pointerup',   this._onUpBound);\n      window.addEventListener('pointerup', this._onUpBound);\n    }, 1200);\n  },\n\n  _unwireCanvas() {\n    if (!this._canvas) return;\n    this._canvas.removeEventListener('pointerdown', this._onDownBound);\n    this._canvas.removeEventListener('pointermove', this._onMoveBound);\n    this._canvas.removeEventListener('pointerup',   this._onUpBound);\n    window.removeEventListener('pointerup', this._onUpBound);\n    this._canvas = null;\n  },\n\n  _ndc(e, el) {\n    const r = el.getBoundingClientRect();\n    return new THREE.Vector2(\n      ((e.clientX - r.left) / r.width)  *  2 - 1,\n      ((e.clientY - r.top)  / r.height) * -2 + 1,\n    );\n  },\n\n  _pickMeta(e) {\n    const cam = Preview.selected?.camera;\n    if (!cam || !this._canvas) return null;\n\n    this._raycaster.setFromCamera(this._ndc(e, this._canvas), cam);\n\n    // Collect only the root mesh of each meta (not children like the wireframe)\n    const meshes = this.chains.flatMap(c =>\n      [c.metaTip, c.metaKnee, c.metaRoot].filter(m => m._mesh).map(m => m._mesh)\n    );\n    if (!meshes.length) return null;\n\n    const hits = this._raycaster.intersectObjects(meshes, false);\n    if (!hits.length) return null;\n\n    const id = hits[0].object.userData.ikMetaId;\n    for (const chain of this.chains) {\n      for (const meta of [chain.metaTip, chain.metaKnee, chain.metaRoot]) {\n        if (meta.id === id) return { meta, chain };\n      }\n    }\n    return null;\n  },\n\n  _onDown(e) {\n    if (e.button !== 0) return;\n    const hit = this._pickMeta(e);\n    if (!hit) return;\n\n    // Confirmed meta hit — fully consume this event so Blockbench's bone\n    // selection / orbit handlers never see it\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    try { this._canvas.setPointerCapture(e.pointerId); } catch (_) {}\n\n    const { meta } = hit;\n    const cam = Preview.selected?.camera;\n    // Camera-facing plane through the meta so dragging works at any angle\n    const normal = cam\n      ? cam.getWorldDirection(new THREE.Vector3()).negate()\n      : v3(0, 1, 0);\n    this._dragState = {\n      meta,\n      pointerId: e.pointerId,\n      plane: new THREE.Plane().setFromNormalAndCoplanarPoint(normal, meta.position),\n    };\n  },\n\n  _onMove(e) {\n    if (!this._dragState || e.pointerId !== this._dragState.pointerId) return;\n    e.preventDefault();\n    e.stopImmediatePropagation();\n\n    const { meta, plane } = this._dragState;\n    if (meta.pinned) return;\n\n    const cam = Preview.selected?.camera;\n    if (!cam || !this._canvas) return;\n\n    this._raycaster.setFromCamera(this._ndc(e, this._canvas), cam);\n    const hit = new THREE.Vector3();\n    if (!this._raycaster.ray.intersectPlane(plane, hit)) return;\n\n    meta.moveTo(hit);\n    // Solve directly — do NOT dispatch display_animation_frame as that\n    // triggers Blockbench's selection/preview pipeline and causes wild jumps\n    for (const chain of this.chains) chain.solve();\n  },\n\n  _onUp(e) {\n    if (this._dragState && e.pointerId === this._dragState.pointerId) {\n      try { this._canvas?.releasePointerCapture(e.pointerId); } catch (_) {}\n      this._dragState = null;\n    }\n  },\n};\n\n// ---------------------------------------------------------------------------\n// DOM helpers — module-level, used by the Vue panel template methods\n// ---------------------------------------------------------------------------\n\nconst _row = () => {\n  const el = document.createElement('div');\n  el.style.cssText = 'display:flex;align-items:center;gap:4px;';\n  return el;\n};\n\nconst _btn = (text, onClick, extraStyle = '', title = '') => {\n  const b = document.createElement('button');\n  b.className = 'dark_bordered';\n  b.textContent = text;\n  b.title = title;\n  b.style.cssText = `padding:2px 8px;cursor:pointer;${extraStyle}`;\n  b.onclick = onClick;\n  return b;\n};\n"
  },
  {
    "path": "src/azurelib_utils/animation/azure-keyframes.js",
    "content": "/**\n * AzureLib Animator — Keyframe Interpolation & Overrides\n * ------------------------------------------------------\n * Adds easing-aware keyframe interpolation and export behaviour\n * for AzureLib's unified animation format.\n *\n * Both AzureLib easing nodes ({ vector, easing, easingArgs }) and\n * Bedrock spline nodes ({ post, pre?, lerp_mode }) are handled here.\n *\n * © 2025 AzureDoom — MIT License\n */\n\nimport { hasArgs } from '../core/azure-utils.js';\nimport { easingRegistry, EASING_DEFAULT, getEasingArgDefault } from './azure-easing.js';\n\nlet ORIG = null;\nlet ORIG_REVERSE_CONDITION = null;\nlet PATCHED = false;\n\n// ---------------------------------------------------------------------------\n// Capture originals once\n// ---------------------------------------------------------------------------\n\nfunction captureOriginalsOnce() {\n  if (ORIG) return;\n  ORIG = {\n    getLerp: Keyframe.prototype.getLerp,\n    compileBedrockKeyframe: Keyframe.prototype.compileBedrockKeyframe,\n    getUndoCopy: Keyframe.prototype.getUndoCopy,\n    extend: Keyframe.prototype.extend,\n  };\n  try {\n    ORIG_REVERSE_CONDITION = BarItems.reverse_keyframes?.condition || null;\n  } catch {\n    ORIG_REVERSE_CONDITION = null;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Registration\n// ---------------------------------------------------------------------------\n\nexport function registerKeyframeOverrides() {\n  if (PATCHED) return;\n  captureOriginalsOnce();\n\n  if (!Keyframe.prototype._azurePatched) {\n    Keyframe.prototype.getLerp              = getLerpOverride;\n    Keyframe.prototype.compileBedrockKeyframe = compileBedrockKeyframe;\n    Keyframe.prototype.getUndoCopy          = getUndoCopy;\n    Keyframe.prototype.extend               = extendKeyframe;\n    Keyframe.prototype._azurePatched        = true;\n  }\n\n  if (BarItems.reverse_keyframes && !BarItems.reverse_keyframes._azurePatched) {\n    if (!ORIG_REVERSE_CONDITION) ORIG_REVERSE_CONDITION = BarItems.reverse_keyframes.condition;\n    BarItems.reverse_keyframes.condition = reverseCondition;\n    BarItems.reverse_keyframes._azurePatched = true;\n  }\n\n  // Hook Blockbench's playback dispatcher so Azure-easing segments are\n  // actually interpolated. Without this, kf.interpolation === 'linear'\n  // (our marker for \"Azure easing mode\") would use BB's plain linear branch\n  // and ignore any Azure easing curve set on the keyframe.\n  Blockbench.on('interpolate_keyframes', azureInterpolateListener);\n\n  PATCHED = true;\n}\n\nexport function unregisterKeyframeOverrides() {\n  if (!PATCHED || !ORIG) return;\n  try {\n    if (Keyframe.prototype._azurePatched) {\n      Keyframe.prototype.getLerp              = ORIG.getLerp;\n      Keyframe.prototype.compileBedrockKeyframe = ORIG.compileBedrockKeyframe;\n      Keyframe.prototype.getUndoCopy          = ORIG.getUndoCopy;\n      Keyframe.prototype.extend               = ORIG.extend;\n      delete Keyframe.prototype._azurePatched;\n    }\n    if (BarItems.reverse_keyframes?._azurePatched && ORIG_REVERSE_CONDITION) {\n      BarItems.reverse_keyframes.condition = ORIG_REVERSE_CONDITION;\n      delete BarItems.reverse_keyframes._azurePatched;\n    }\n    try { Blockbench.removeListener('interpolate_keyframes', azureInterpolateListener); } catch { /* noop */ }\n  } finally {\n    PATCHED = false;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// interpolate_keyframes listener — drives Azure-easing playback\n// ---------------------------------------------------------------------------\n//\n// Blockbench's BoneAnimator.interpolate dispatches this event before its\n// own interpolation switch. If a listener returns { value: [x, y, z] }\n// the dispatcher returns that array directly and the built-in\n// linear/catmullrom/bezier branches are skipped.\n//\n// We use this for Azure-easing segments (kf.interpolation falsy or 'linear')\n// — without it, kf.interpolation === undefined doesn't match any of BB's\n// built-in branches and BoneAnimator.interpolate falls off the end without\n// returning a value, freezing the bone between keyframes.\n//\n// Returning undefined from the listener leaves BB's normal dispatch in\n// place, which is what we want for catmullrom/bezier/step segments.\n\nfunction azureInterpolateListener(args) {\n  if (Format?.id !== 'azure_model') return;\n\n  const before = args && args.keyframe_before;\n  const after  = args && args.keyframe_after;\n  if (!before || !after) return;\n\n  // Only handle Azure-easing segments. Anything that names a BB-native\n  // interpolation mode (catmullrom / bezier / step) is left to BB.\n  // 'linear' is treated as Azure-eligible because that's the default value\n  // BB stamps onto fresh keyframes — and it's also semantically a no-op\n  // when the easing happens to be plain linear.\n  const azureEligible = mode => !mode || mode === 'linear';\n  if (!azureEligible(before.interpolation) || !azureEligible(after.interpolation)) return;\n\n  // Defer to BB when either side carries molang expressions — the eased\n  // numeric path can't preserve string expressions and would silently\n  // change behaviour. (Safe: BB's linear→linear branch handles this case.)\n  if (before.has_expressions || after.has_expressions) return;\n\n  // Resolve easing from the destination keyframe. AzureLib reads easing\n  // off the \"to\" keyframe, mirroring the Java runtime.\n  const easing = after.easing || EASING_DEFAULT;\n  const fn = easingRegistry[easing] || easingRegistry.linear;\n\n  let eased;\n  if (hasArgs(easing)) {\n    const arg = (Array.isArray(after.easingArgs) && after.easingArgs.length)\n      ? after.easingArgs[0]\n      : getEasingArgDefault(easing);\n    eased = fn(args.t, arg);\n  } else {\n    eased = fn(args.t);\n  }\n\n  if (typeof eased !== 'number' || Number.isNaN(eased)) return;\n\n  // Match the data_point selection used by Keyframe.prototype.getLerp:\n  // earlier-in-time kf uses dp 1 if it has multiple, later kf uses dp 0.\n  // before.time < after.time is guaranteed here by BoneAnimator.interpolate.\n  const beforeDP = (before.data_points.length > 1) ? 1 : 0;\n  const afterDP  = 0;\n\n  const value = ['x', 'y', 'z'].map(axis => {\n    const a = before.calc(axis, beforeDP);\n    const b = after.calc(axis, afterDP);\n    return a + (b - a) * eased;\n  });\n\n  return { value };\n}\n\n// ---------------------------------------------------------------------------\n// getLerp — easing-aware interpolation\n// ---------------------------------------------------------------------------\n//\n// Reachable in two situations:\n//   1. BoneAnimator.interpolate's linear-only branch (only when both kfs\n//      have interpolation === 'linear'). With the event listener above,\n//      that branch is short-circuited for Azure-easing segments, so this\n//      path mostly handles plain linear→linear segments at runtime.\n//   2. The keyframe optimizer in animation.js (~line 1462) uses the same\n//      linear-only gate during bake/optimize and calls getLerp directly.\n//      We honour Azure easing there too so optimized output matches\n//      playback behaviour.\n\nfunction lerp(a, b, t) {\n  return a + (b - a) * t;\n}\n\nfunction getLerpOverride(other, axis, t) {\n  if (Format?.id !== 'azure_model') {\n    return ORIG.getLerp.apply(this, arguments);\n  }\n\n  // Defer to Blockbench for explicit Bedrock spline/bezier/step modes.\n  // Note: 'linear' is intentionally NOT in this list — we want to apply\n  // the Azure easing curve when one is set, even if the kf carries\n  // BB's default interpolation === 'linear' marker.\n  if (other.interpolation === 'catmullrom' ||\n      other.interpolation === 'bezier'     ||\n      other.interpolation === 'step') {\n    return ORIG.getLerp.apply(this, arguments);\n  }\n\n  const easing = other.easing || EASING_DEFAULT;\n\n  // Plain linear with no custom easing → BB's original implementation\n  // is fine and preserves its allow_expression fast-path.\n  if (easing === EASING_DEFAULT && (!other.easingArgs || !other.easingArgs.length)) {\n    return ORIG.getLerp.apply(this, arguments);\n  }\n\n  let func = easingRegistry[easing] || easingRegistry.linear;\n\n  if (hasArgs(easing)) {\n    const arg = Array.isArray(other.easingArgs) && other.easingArgs.length\n      ? other.easingArgs[0]\n      : getEasingArgDefault(easing);\n    func = func.bind(null, arg);\n  }\n\n  const eased = func(t);\n  const start = this.calc(axis);\n  const stop  = other.calc(axis);\n  const result = lerp(start, stop, eased);\n\n  if (Number.isNaN(result)) throw new Error('[AzureLib] Invalid easing result');\n  return result;\n}\n\n// ---------------------------------------------------------------------------\n// compileBedrockKeyframe — unified serialiser\n// ---------------------------------------------------------------------------\n\nfunction compileBedrockKeyframe() {\n  if (Format?.id !== 'azure_model') {\n    return ORIG.compileBedrockKeyframe.apply(this, arguments);\n  }\n\n  const base = ORIG.compileBedrockKeyframe.apply(this, arguments);\n  const cloneArray = arr => Array.isArray(arr) ? [...arr] : arr;\n\n  // --- Bedrock lerp_mode keyframes (linear / catmullrom): keep pre/post/lerp_mode ---\n  if (this.interpolation === 'catmullrom') {\n    const lerpMode = 'catmullrom';\n    if (base && typeof base === 'object') {\n      return {\n        ...(base.pre !== undefined ? { pre: cloneArray(base.pre) } : {}),\n        post:      cloneArray(base.post || base),\n        lerp_mode: lerpMode,\n      };\n    }\n    return { post: cloneArray(base), lerp_mode: lerpMode };\n  }\n\n  // --- Bezier keyframes: Blockbench handles pre/post natively, pass through ---\n  if (this.interpolation === 'bezier') {\n    if (base && typeof base === 'object') {\n      return {\n        ...(base.pre  !== undefined ? { pre:  cloneArray(base.pre)  } : {}),\n        ...(base.post !== undefined ? { post: cloneArray(base.post) } : {}),\n      };\n    }\n    return base;\n  }\n\n  // --- Step transition: keep pre/post pair ---\n  const prev = this.getPreviousKeyframe?.();\n  if (this.data_points.length === 1 && prev && prev.interpolation === 'step') {\n    if (base && typeof base === 'object') {\n      return {\n        ...(base.pre  !== undefined ? { pre:  cloneArray(base.pre)  } : {}),\n        ...(base.post !== undefined ? { post: cloneArray(base.post) } : {}),\n      };\n    }\n    return base;\n  }\n\n  // --- If Blockbench emitted explicit pre/post transition data, keep raw ---\n  if (\n    base && typeof base === 'object' && !Array.isArray(base) &&\n    (base.pre !== undefined || base.post !== undefined)\n  ) {\n    const out = {\n      ...(base.pre       !== undefined ? { pre:       cloneArray(base.pre)       } : {}),\n      ...(base.post      !== undefined ? { post:      cloneArray(base.post)      } : {}),\n      ...(base.lerp_mode !== undefined ? { lerp_mode: base.lerp_mode             } : {}),\n    };\n    if (this.easing && this.easing !== EASING_DEFAULT) out.easing = this.easing;\n    if (hasArgs(this.easing) && Array.isArray(this.easingArgs) && this.easingArgs.length) {\n      out.easingArgs = [...this.easingArgs];\n    }\n    return out;\n  }\n\n  // --- AzureLib easing node ---\n  const withAzureVectorNode = value => {\n    // Already an object with extra fields? (e.g. existing easing data)\n    if (value && typeof value === 'object' && !Array.isArray(value)) {\n      const out = { ...value };\n      if (out.easing === undefined && this.easing !== undefined) {\n        out.easing = this.easing;\n      }\n      if (out.easingArgs === undefined && hasArgs(this.easing) &&\n          Array.isArray(this.easingArgs) && this.easingArgs.length) {\n        out.easingArgs = [...this.easingArgs];\n      }\n      return out;\n    }\n\n    // Plain array → Azure node\n    const out = { vector: cloneArray(value) };\n    if (this.easing && this.easing !== EASING_DEFAULT) {\n      out.easing = this.easing;\n    }\n    if (hasArgs(this.easing) && Array.isArray(this.easingArgs) && this.easingArgs.length) {\n      out.easingArgs = [...this.easingArgs];\n    }\n\n    // Flatten to plain array if there are no extra fields\n    if (!out.easing && !out.easingArgs) {\n      return out.vector;\n    }\n    return out;\n  };\n\n  return withAzureVectorNode(base);\n}\n\n// ---------------------------------------------------------------------------\n// getUndoCopy — preserve easing state in undo history\n// ---------------------------------------------------------------------------\n\nfunction getUndoCopy() {\n  const base = ORIG.getUndoCopy.apply(this, arguments);\n  if (Format?.id === 'azure_model') {\n    base.easing = this.easing;\n    base.interpolation = this.interpolation;\n    if (hasArgs(this.easing)) base.easingArgs = this.easingArgs ? [...this.easingArgs] : undefined;\n  }\n  return base;\n}\n\n// ---------------------------------------------------------------------------\n// extend — parse keyframe data on load\n// ---------------------------------------------------------------------------\n\nfunction extendKeyframe(dataIn) {\n  const data = Object.assign({}, dataIn);\n\n  if (Format?.id !== 'azure_model') {\n    return ORIG.extend.apply(this, [data]);\n  }\n\n  const cloneVec = (vec, fallback = [0, 0, 0]) => {\n    if (!Array.isArray(vec)) return [...fallback];\n    return [\n      vec[0] !== undefined ? vec[0] : fallback[0],\n      vec[1] !== undefined ? vec[1] : fallback[1],\n      vec[2] !== undefined ? vec[2] : fallback[2],\n    ];\n  };\n\n  const unwrapNode = value => {\n    if (Array.isArray(value)) {\n      return { vector: cloneVec(value) };\n    }\n    if (value && typeof value === 'object') {\n      const out = {};\n      if (value.easing       !== undefined) out.easing       = value.easing;\n      if (value.interpolation !== undefined) out.interpolation = value.interpolation;\n      if (Array.isArray(value.easingArgs))   out.easingArgs   = [...value.easingArgs];\n      if (Array.isArray(value.vector))       { out.vector = cloneVec(value.vector); return out; }\n      if ('x' in value && 'y' in value && 'z' in value) {\n        out.vector = cloneVec([value.x, value.y, value.z]); return out;\n      }\n    }\n    return { vector: null };\n  };\n\n  const valuesNode = unwrapNode(data.values);\n  const preNode    = unwrapNode(data.pre);\n  const postNode   = unwrapNode(data.post);\n\n  // Apply easing from whichever node carries it\n  const easingSource = valuesNode.easing ?? data.easing ?? postNode.easing;\n  if (easingSource !== undefined)     this.easing      = easingSource;\n\n  // Apply interpolation only for explicit Bedrock modes (catmullrom / bezier / step).\n  // We intentionally IGNORE data.interpolation === 'linear' from Blockbench core because\n  // 'linear' is Blockbench's own default interp label and would shadow our Azure easing.\n  // 'linear' as a Bedrock lerp_mode is set via data.lerp_mode, not data.interpolation.\n  // Only store Blockbench-native interpolation modes that we explicitly support.\n  // We intentionally ignore data.interpolation === 'linear' (Blockbench's own default)\n  // because it would shadow Azure easings. lerp_mode:'linear' from JSON is also dropped —\n  // it is handled by AzureLib's own linear easing instead.\n  const BEDROCK_INTERP_MODES = new Set(['catmullrom', 'bezier', 'step']);\n  let rawInterp = data.interpolation ?? postNode.interpolation;\n  // Prefer explicit lerp_mode from JSON over Blockbench's data.interpolation default\n  if (data.lerp_mode !== undefined && data.lerp_mode !== 'linear') rawInterp = data.lerp_mode;\n\n  if (rawInterp !== undefined && BEDROCK_INTERP_MODES.has(rawInterp)) {\n    this.interpolation = rawInterp;\n  } else {\n    this.interpolation = 'linear';\n  }\n\n  const easingArgsSource = valuesNode.easingArgs ?? data.easingArgs ?? postNode.easingArgs;\n  if (easingArgsSource !== undefined) this.easingArgs   = [...easingArgsSource];\n\n  // Strip Azure/Bedrock wrappers before handing off to Blockbench core\n  const plain = Object.assign({}, data);\n  ['values', 'pre', 'post'].forEach(key => {\n    if (plain[key] && typeof plain[key] === 'object' && !Array.isArray(plain[key])) {\n      delete plain[key];\n    }\n  });\n\n  const result = ORIG.extend.apply(this, [plain]);\n\n  // Re-hydrate axis data explicitly\n  const ensurePoint = idx => {\n    if (!Array.isArray(this.data_points)) this.data_points = [];\n    if (!this.data_points[idx]) this.data_points[idx] = {};\n    return this.data_points[idx];\n  };\n\n  const toNum = v => {\n    if (typeof v !== 'string') return v;\n    const n = Number(v);\n    return isNaN(n) ? v : n;  // Molang → keep string; numeric string → number\n  };\n  const writeVector = (point, vec) => {\n    if (!vec) return;\n    point.x = toNum(vec[0]);\n    point.y = toNum(vec[1]);\n    point.z = toNum(vec[2]);\n    delete point.vector;\n  };\n\n  if (preNode.vector && postNode.vector) {\n    writeVector(ensurePoint(0), preNode.vector);\n    writeVector(ensurePoint(1), postNode.vector);\n  } else if (preNode.vector) {\n    writeVector(ensurePoint(0), preNode.vector);\n  } else if (!preNode.vector && postNode.vector && this.interpolation === 'catmullrom') {\n    writeVector(ensurePoint(0), postNode.vector);\n  } else if (valuesNode.vector) {\n    writeVector(ensurePoint(0), valuesNode.vector);\n  } else if (postNode.vector) {\n    writeVector(ensurePoint(0), postNode.vector);\n  }\n\n  return result;\n}\n\n// ---------------------------------------------------------------------------\n// Reverse keyframes guard\n// ---------------------------------------------------------------------------\n\nfunction reverseCondition() {\n  if (reverseCondition._inAzureCall) return false;\n  try {\n    reverseCondition._inAzureCall = true;\n    if (!ORIG_REVERSE_CONDITION || typeof ORIG_REVERSE_CONDITION !== 'function') return false;\n    const result = ORIG_REVERSE_CONDITION.call(BarItems.reverse_keyframes);\n    return result && Format?.id !== 'azure_model';\n  } finally {\n    reverseCondition._inAzureCall = false;\n  }\n}\n\nexport default { registerKeyframeOverrides, unregisterKeyframeOverrides };\n"
  },
  {
    "path": "src/azurelib_utils/core/azure-codec.js",
    "content": "/**\n * AzureLib Animator — Codec & Format Registration\n * -----------------------------------------------\n * Defines the Blockbench model format for AzureLib (.geo / .animation)\n * and handles project load, save, and import/export utilities.\n *\n * Animation handling is fully owned by azure-animation-tab.js.\n * The animation codec is now created lazily at runtime so validation\n * does not execute AnimationCodec construction during module evaluation.\n *\n * © 2025 AzureDoom — MIT License\n */\n\nimport omit from 'lodash/omit';\nimport AzureConfig, { DEFAULT_CONFIG, onSettingsChanged } from './azure-settings.js';\nimport { invertMolang as localInvert } from './azure-utils.js';\nimport { registerKeyframeOverrides, unregisterKeyframeOverrides } from '../animation/azure-keyframes.js';\nimport {\n  createAzureAnimationCodec,\n  registerAzureAnimationFormat,\n  unregisterAzureAnimationFormat,\n} from '../animation/azure-animation-tab.js';\nimport { initializeAnimationUI, unloadAnimationUI } from '../animation/azure-animation-ui.js';\n\nconst invertMolang = globalThis.invertMolang || localInvert;\nconst OFFSET_Y = 8.0; // BB changed how it's grid is centered in like 4.8 so this is needed.\n\nlet hasNotifiedConversion = false;\nlet azureCodecRegistered = false;\nlet format = null;\n\nfunction getBedrockCodec() {\n  return globalThis.Codecs?.bedrock || null;\n}\n\nfunction getProjectCodec() {\n  return globalThis.Codecs?.project || null;\n}\n\nexport function ensureAzureFormat() {\n  if (format) return format;\n\n  if (typeof ModelFormat === 'undefined' || !globalThis.Codecs?.project) {\n    console.warn('[AzureLib] ModelFormat or Codecs.project unavailable');\n    return null;\n  }\n\n  format = new ModelFormat({\n    id: 'azure_model',\n    name: 'AzureLib Animated Model',\n    category: 'minecraft',\n    description: 'Animated model for Java mods using AzureLib.',\n    icon: 'view_in_ar',\n    rotate_cubes: true,\n    box_uv: true,\n    optional_box_uv: true,\n    single_texture: true,\n    bone_rig: true,\n    centered_grid: true,\n    animated_textures: true,\n    select_texture_for_particles: true,\n    animation_mode: true,\n    animation_files: true,\n    animation_codec: undefined,\n    locators: true,\n    codec: getProjectCodec(),\n    display_mode: true,\n    onActivation() {},\n  });\n\n  return format;\n}\n\nexport function getAzureFormat() {\n  return format;\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle registration\n// ---------------------------------------------------------------------------\n\nexport function registerAzureCodec() {\n  if (azureCodecRegistered) return;\n  azureCodecRegistered = true;\n\n  const projectCodec = globalThis.Codecs?.project;\n  const bedrockCodec = globalThis.Codecs?.bedrock;\n  const azureFormat = ensureAzureFormat();\n\n  if (!projectCodec || !bedrockCodec || !azureFormat) {\n    console.warn('[AzureLib] Required codec APIs are unavailable');\n    return;\n  }\n\n  projectCodec.on('compile', handleProjectCompile);\n  projectCodec.on('parse', handleProjectParse);\n  bedrockCodec.on('compile', handleBedrockCompile);\n\n  registerAzureAnimationFormat();\n  azureFormat.animation_codec = createAzureAnimationCodec() || undefined;\n\n  registerKeyframeOverrides();\n  initializeAnimationUI();\n\n  Blockbench.on('close_project', resetDefaults);\n  Blockbench.on('new_project', resetDefaults);\n\n  console.log('[AzureLib] Azure codec registered (AnimationCodec-backed)');\n}\n\nexport function unregisterAzureCodec() {\n  if (!azureCodecRegistered) return;\n  azureCodecRegistered = false;\n\n  const projectCodec = globalThis.Codecs?.project;\n  const bedrockCodec = globalThis.Codecs?.bedrock;\n\n  projectCodec?.events?.compile?.remove?.(handleProjectCompile);\n  projectCodec?.events?.parse?.remove?.(handleProjectParse);\n  bedrockCodec?.events?.compile?.remove?.(handleBedrockCompile);\n\n  unloadAnimationUI();\n  unregisterKeyframeOverrides();\n  unregisterAzureAnimationFormat();\n\n  if (format) {\n    format.animation_codec = undefined;\n  }\n\n  console.log('[AzureLib] Azure codec unregistered');\n}\n\nfunction resetDefaults() {\n  Object.assign(AzureConfig, DEFAULT_CONFIG);\n  hasNotifiedConversion = false;\n  console.log('[AzureLib] Settings reset to defaults');\n}\n\n// ---------------------------------------------------------------------------\n// Project compile/parse hooks\n// ---------------------------------------------------------------------------\n\nfunction handleProjectCompile(event) {\n  if (Format?.id !== 'azure_model') return;\n\n  if (AzureConfig.objectType === 'AZURE_ITEM_BLOCK') {\n    AzureConfig.objectType = 'AZURE_ENTITY';\n    AzureConfig.entityType = 'Entity/Block/Item';\n  }\n\n  event.model.azurelibSettings = AzureConfig;\n}\n\nfunction handleProjectParse(event) {\n  const model = event.model || {};\n  const formatId = model?.meta?.model_format || model?.model_format;\n  if (formatId !== 'azure_model') return;\n\n  const settings = model.azurelibSettings;\n  if (settings && typeof settings === 'object') {\n    const wasDeprecated = settings.objectType === 'AZURE_ITEM_BLOCK';\n    Object.assign(AzureConfig, omit(settings, ['formatVersion']));\n\n    if (wasDeprecated) {\n      AzureConfig.objectType = 'AZURE_ENTITY';\n      AzureConfig.entityType = 'Entity/Block/Item';\n      console.warn('[AzureLib] Converted deprecated AZURE_ITEM_BLOCK -> AZURE_ENTITY');\n    }\n\n    onSettingsChanged();\n\n    if (wasDeprecated && !hasNotifiedConversion) {\n      hasNotifiedConversion = true;\n      Blockbench.showMessageBox({\n        title: 'AzureLib Conversion',\n        message:\n          'This project used an older \"Block/Item\" type.\\n\\nIt has been updated to the unified \"Entity/Block/Item\" type (AZURE_ENTITY).',\n        buttons: ['OK'],\n      });\n    }\n  } else if (formatId === 'azure_model' && !model.azurelibSettings) {\n    console.debug('[AzureLib] Azure model detected but no settings loaded yet.');\n  }\n\n  if (Blockbench.isNewerThan('4.99') && model.animations) {\n    console.log('[AzureLib] Applying legacy animation inversion fix for Blockbench 5.0+');\n    for (const [, anim] of Object.entries(model.animations)) {\n      for (const bone of Object.values(anim.bones || {})) {\n        for (const [channel, frames] of Object.entries(bone)) {\n          if (channel === 'rotation' || channel === 'position') {\n            for (const kf of Object.values(frames)) {\n              if (kf?.vector) {\n                if (channel === 'rotation') {\n                  kf.vector[0] = invertMolang(kf.vector[0]);\n                  kf.vector[1] = invertMolang(kf.vector[1]);\n                } else if (channel === 'position') {\n                  kf.vector[0] = invertMolang(kf.vector[0]);\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\nfunction handleBedrockCompile(event) {\n  if (Format?.id !== 'azure_model') return;\n\n  const geometry = event.model?.['minecraft:geometry'];\n  if (geometry) {\n    geometry.forEach(geo => {\n      delete geo.item_display_transforms;\n    });\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Export helpers\n// ---------------------------------------------------------------------------\n\nexport function maybeExportItemJson(options = {}, as) {\n  const should = (key, fallback) => (options[key] === undefined ? fallback : options[key]);\n  const model = {};\n  const bedrockCodec = getBedrockCodec();\n\n  if (should('comment', settings.credit.value)) model.credit = settings.credit.value;\n  model.parent = 'builtin/entity';\n\n  if (should('ambientocclusion', Project.ambientocclusion === false)) model.ambientocclusion = false;\n  if (Project.texture_width !== 16 || Project.texture_height !== 16) {\n    model.texture_size = [Project.texture_width, Project.texture_height];\n  }\n  if (should('front_gui_light', Project.front_gui_light)) model.gui_light = 'front';\n  if (should('overrides', Project.overrides)) model.overrides = Project.overrides;\n\n  if (should('display', Object.keys(Project.display_settings).length >= 1)) {\n    const display = {};\n    for (const key in DisplayMode.slots) {\n      const slot = DisplayMode.slots[key];\n      if (DisplayMode.slots.hasOwnProperty(key) && Project.display_settings[slot]?.export) {\n        display[slot] = Project.display_settings[slot].export();\n      }\n    }\n    if (Object.keys(display).length) {\n      model.display = display;\n      for (const [, data] of Object.entries(display)) {\n        if (Array.isArray(data?.translation)) {\n          data.translation = [\n            data.translation[0],\n            Math.round((Number(data.translation[1] || 0) - OFFSET_Y) * 100) / 100,\n            data.translation[2],\n          ];\n        }\n      }\n    }\n  }\n\n  if (Project.textures && should('textures', Object.keys(Project.textures).length >= 1)) {\n    for (const tex of Object.values(Project.textures)) {\n      if (tex.particle || Object.keys(Project.textures).length === 1) {\n        const name = tex.name.replace('.png', '');\n        if (/^[-._a-z0-9/]+$/.test(name)) {\n          model.textures = { particle: name };\n          break;\n        }\n      }\n    }\n  }\n\n  const jsonStr = JSON.stringify(model, null, 2);\n  const path = AzureConfig.itemModelPath;\n\n  Blockbench.export({\n    resource_id: 'model',\n    type: Codecs.java_block.name,\n    extensions: ['json'],\n    name: (bedrockCodec?.fileName?.() || 'model.geo').replace('.geo', '.item'),\n    startpath: path,\n    content: jsonStr,\n  }, realPath => {\n    AzureConfig.itemModelPath = realPath;\n  });\n\n  return this;\n}\n\nexport function maybeImportItemJson() {\n  Blockbench.import({\n    resource_id: 'model',\n    type: 'json',\n    extensions: ['json'],\n    readtype: 'text',\n    multiple: false,\n  }, files => {\n    if (!files?.[0]) return;\n\n    let json;\n    try {\n      json = JSON.parse(files[0].content);\n    } catch {\n      return Blockbench.showQuickMessage('[AzureLib] Invalid JSON file.');\n    }\n\n    if (json.parent !== 'builtin/entity' || typeof json.display !== 'object') {\n      return Blockbench.showQuickMessage('[AzureLib] Not a valid AzureLib display file.');\n    }\n\n    Project.display_settings = {};\n\n    for (const [slot, data] of Object.entries(json.display)) {\n      if (!DisplayMode.slots.includes(slot)) continue;\n\n      const rotation = Array.isArray(data.rotation) ? data.rotation.slice() : [0, 0, 0];\n      const translation = Array.isArray(data.translation) ? data.translation.slice() : [0, 0, 0];\n      const scale = Array.isArray(data.scale) ? data.scale.slice() : [1, 1, 1];\n\n      translation[1] = Math.round((Number(translation[1] || 0) + OFFSET_Y) * 100) / 100;\n\n      const slotObj = new DisplaySlot(slot);\n      Object.assign(slotObj, { rotation, translation, scale });\n      Project.display_settings[slot] = slotObj;\n    }\n\n    Project.saved = false;\n    DisplayMode.vue.$forceUpdate();\n    DisplayMode.updateDisplayBase();\n    Blockbench.showQuickMessage('[AzureLib] Display settings imported.');\n  });\n}\n\nexport default getBedrockCodec();"
  },
  {
    "path": "src/azurelib_utils/core/azure-settings.js",
    "content": "/**\r\n * AzureLib Animator — Settings & Templates\r\n * ----------------------------------------\r\n * Defines runtime configuration, SDK targets, and automatic\r\n * template loading for armor models.\r\n *\r\n * © 2025 AzureDoom — MIT License\r\n */\r\n\r\nimport armorTemplate from '../templates/armorTemplate.json';\r\n\r\nconst makeOptions = list => Object.fromEntries(list.map(x => [x, x]));\r\n\r\nexport const SDK_FORGE = 'Forge 1.12 - 1.16';\r\nexport const SDK_FABRIC = 'Fabric 1.15 - 1.16';\r\nexport const SDK_OPTIONS = makeOptions([SDK_FORGE, SDK_FABRIC]);\r\n\r\nexport const TYPE_ENTITY = 'AZURE_ENTITY';\r\nexport const TYPE_ARMOR = 'AZURE_ARMOR';\r\nexport const TYPE_ITEMBLOCK = 'AZURE_ITEM_BLOCK';\r\n\r\nexport const TYPE_OPTIONS = {\r\n  [TYPE_ENTITY]: 'Entity/Block/Item',\r\n  [TYPE_ARMOR]: 'Armor',\r\n};\r\n\r\nexport const DEFAULT_CONFIG = Object.freeze({\r\n  formatVersion: 2,\r\n  modSDK: SDK_FORGE,\r\n  objectType: TYPE_ENTITY,\r\n  entityType: 'Entity/Block/Item',\r\n  javaPackage: 'com.example.mod',\r\n  animFileNamespace: 'modid',\r\n  animFilePath: 'animations/animation.json',\r\n});\r\n\r\nexport const AzureConfig = Object.assign({}, DEFAULT_CONFIG);\r\n\r\n/**\r\n * Applies configuration and injects armor templates when applicable.\r\n */\r\nexport function onSettingsChanged() {\r\n  Modes.selected.select();\r\n\r\n  if (AzureConfig.objectType === TYPE_ARMOR) {\r\n    if (Outliner.root.length === 0) {\r\n      Codecs.project.parse(armorTemplate);\r\n      console.log('[AzureLib] Loaded armor template.');\r\n    } else {\r\n      alert(\r\n        'Cannot apply Armor Template — please select Armor type in an empty project.'\r\n      );\r\n    }\r\n  } else if (AzureConfig.objectType === TYPE_ENTITY) {\r\n    Project.parent = 'builtin/entity';\r\n  }\r\n}\r\n\r\nexport default AzureConfig;\r\n"
  },
  {
    "path": "src/azurelib_utils/core/azure-utils.js",
    "content": "/**\r\n * AzureLib Animator — Utility & Patching Layer\r\n * --------------------------------------------\r\n * Provides function override registration and restoration.\r\n * Replaces the old addMonkeypatch/removeMonkeypatch system.\r\n *\r\n * © 2025 AzureDoom — MIT License\r\n */\r\n\r\nexport const PatchRegistry = new Map();\r\n\r\n/**\r\n * Register a new override on a target object.\r\n * Keeps a reference to the original method.\r\n */\r\nexport function injectOverride(symbol, path, key, newImpl) {\r\n  const target = path ? symbol[path] : symbol;\r\n  if (!PatchRegistry.has(symbol)) PatchRegistry.set(symbol, { _target: target });\r\n  const entry = PatchRegistry.get(symbol);\r\n  entry[key] = target[key];\r\n  target[key] = newImpl;\r\n}\r\n\r\n/**\r\n * Restore all previously injected overrides.\r\n */\r\nexport function restoreOverrides() {\r\n  PatchRegistry.forEach(entry => {\r\n    Object.keys(entry).forEach(key => {\r\n      if (key.startsWith('_')) return;\r\n      entry._target[key] = entry[key];\r\n    });\r\n  });\r\n  PatchRegistry.clear();\r\n}\r\n\r\n/**\r\n * Whether an easing type uses arguments.\r\n */\r\nexport const hasArgs = easing =>\r\n  easing?.includes('Back') ||\r\n  easing?.includes('Elastic') ||\r\n  easing?.includes('Bounce') ||\r\n  easing === 'step';\r\n\r\n/**\r\n * Fallback Molang inverter for AzureLib standalone use.\r\n */\r\nexport function invertMolang(molang) {\r\n  const OPEN = ['(', '[', '{'];\r\n  const CLOSE = [')', ']', '}'];\r\n\r\n  if (typeof molang === 'number') return -molang;\r\n  if (molang === '' || molang === '0') return molang;\r\n\r\n  if (!isNaN(parseFloat(molang)) && isFinite(molang)) {\r\n    const val = parseFloat(molang);\r\n    return (-val).toString();\r\n  }\r\n\r\n  let invert = true;\r\n  let depth = 0;\r\n  let lastOp;\r\n  let result = '';\r\n\r\n  for (let ch of molang) {\r\n    if (!depth) {\r\n      let op;\r\n      let hadInput = true;\r\n\r\n      if (ch === '-' && lastOp !== '*' && lastOp !== '/') {\r\n        if (!invert && !lastOp) result += '+';\r\n        invert = false;\r\n        continue;\r\n      } else if (ch === '+' && lastOp !== '*' && lastOp !== '/') {\r\n        result += '-';\r\n        invert = false;\r\n        continue;\r\n      } else if ('?:'.includes(ch)) {\r\n        invert = true;\r\n        op = ch;\r\n      } else if (invert) {\r\n        result += '-';\r\n        invert = false;\r\n      } else if ('+-*/&|'.includes(ch)) {\r\n        op = ch;\r\n      }\r\n\r\n      lastOp = op || lastOp;\r\n    }\r\n\r\n    if (OPEN.includes(ch)) depth++;\r\n    if (CLOSE.includes(ch)) depth--;\r\n\r\n    result += ch;\r\n  }\r\n\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/azurelib_utils/index.js",
    "content": "/**\r\n * AzureLib Animator — Blockbench Plugin Entry\r\n * -------------------------------------------\r\n * Registers the AzureLib animation format and editor utilities.\r\n *\r\n * © 2025 AzureDoom — MIT License\r\n */\r\n\r\nimport semverCoerce from 'semver/functions/coerce.js';\r\nimport semverSatisfies from 'semver/functions/satisfies.js';\r\nimport pkg from './package.json' assert { type: 'json' };\r\nimport {\r\n  initializeAnimationUI,\r\n  unloadAnimationUI\r\n} from './animation/azure-animation-ui.js';\r\nimport {\r\n  registerKeyframeOverrides,\r\n  unregisterKeyframeOverrides\r\n} from './animation/azure-keyframes.js';\r\nimport AzureConfig, {\r\n  TYPE_OPTIONS,\r\n  onSettingsChanged\r\n} from './core/azure-settings.js';\r\nimport codec, {\r\n  registerAzureCodec,\r\n  unregisterAzureCodec,\r\n  maybeExportItemJson,\r\n  maybeImportItemJson\r\n} from './core/azure-codec.js';\r\nimport { restoreOverrides } from './core/azure-utils.js';\r\n\r\nconst { version, blockbenchConfig } = pkg;\r\nconst RANGE = `${blockbenchConfig.min_version} - ${blockbenchConfig.max_version}`;\r\nif (!semverSatisfies(semverCoerce(Blockbench.version), RANGE)) {\r\n  alert(`AzureLib Animator supports Blockbench ${RANGE}. Update for best results.`);\r\n}\r\n\r\n(function () {\r\n  let exportAction, exportDisplay, importDisplay, settingsButton;\r\n\r\n  Plugin.register('azurelib_utils', {\r\n    ...blockbenchConfig,\r\n    version,\r\n    await_loading: true,\r\n    onload() {\r\n      registerAzureCodec();\r\n      initializeAnimationUI();\r\n      registerKeyframeOverrides();\r\n      console.log('[AzureLib] Animator loaded');\r\n\t  \r\n      Blockbench.on('ready', () => {\r\n        setTimeout(() => {\r\n          if (!Keyframe.prototype._azurePatched) {\r\n            console.log('[AzureLib] Reattaching keyframe overrides after ready()');\r\n            registerKeyframeOverrides();\r\n          }\r\n        }, 0);\r\n      });\r\n\r\n      // Auto show settings for Azure model\r\n      Blockbench.on('new_project', () => {\r\n        if (Format?.id === 'azure_model') {\r\n          setTimeout(() => {\r\n            try {\r\n              Interface.dialog?.close();\r\n            } catch {}\r\n            new Dialog({\r\n              id: 'azurelib_model_settings',\r\n              title: 'AzureLib Model Settings',\r\n              width: 540,\r\n              lines: [\r\n                `<b class=\"tl\"><a href=\"https://wiki.azuredoom.com/\">AzureLib</a> Animator v${version}</b>`,\r\n                '<p>Select your model type to begin.</p>',\r\n              ],\r\n              form: {\r\n                objectType: {\r\n                  label: 'Object Type',\r\n                  type: 'select',\r\n                  default: AzureConfig.objectType,\r\n                  options: TYPE_OPTIONS,\r\n                },\r\n              },\r\n              onConfirm(form) {\r\n                Object.assign(AzureConfig, form);\r\n                onSettingsChanged();\r\n              },\r\n            }).show();\r\n          }, 150);\r\n        }\r\n      });\r\n\r\n      exportAction = new Action({\r\n        id: 'export_AzureLib_model',\r\n        name: 'Export AzureLib .geo Model',\r\n        icon: 'archive',\r\n        description: 'Export your .geo model for AzureLib.',\r\n        category: 'file',\r\n        condition: () => Format.id === 'azure_model',\r\n        click: () => codec.export(),\r\n      });\r\n      MenuBar.addAction(exportAction, 'file.export');\r\n\r\n      exportDisplay = new Action({\r\n        id: 'export_AzureLib_display',\r\n        name: 'Export AzureLib Display Settings',\r\n        icon: 'icon-bb_interface',\r\n        category: 'file',\r\n        description: 'Export display settings for AzureLib.',\r\n        condition: () => Format.id === 'azure_model',\r\n        click: maybeExportItemJson,\r\n      });\r\n      MenuBar.addAction(exportDisplay, 'file.export');\r\n\r\n      importDisplay = new Action({\r\n        id: 'import_AzureLib_display',\r\n        name: 'Import AzureLib Display Settings',\r\n        icon: 'icon-bow',\r\n        category: 'file',\r\n        condition: () => Format.id === 'azure_model',\r\n        click: maybeImportItemJson,\r\n      });\r\n      MenuBar.addAction(importDisplay, 'file.import');\r\n\r\n      settingsButton = new Action('azurelib_settings', {\r\n        name: 'AzureLib Model Settings',\r\n        description: 'Change model type',\r\n        icon: 'info',\r\n        condition: () => Format.id === 'azure_model',\r\n        click: () => {\r\n          const dialog = new Dialog({\r\n            id: 'project',\r\n            title: 'AzureLib Model Settings',\r\n            width: 540,\r\n            lines: [\r\n              `<b class=\"tl\"><a href=\"https://wiki.azuredoom.com/\">AzureLib</a> Animator v${version}</b>`,\r\n            ],\r\n            form: {\r\n              objectType: {\r\n                label: 'Object Type',\r\n                type: 'select',\r\n                default: AzureConfig.objectType,\r\n                options: TYPE_OPTIONS,\r\n              },\r\n            },\r\n            onConfirm: result => {\r\n              Object.assign(AzureConfig, result);\r\n              onSettingsChanged();\r\n              dialog.hide();\r\n            },\r\n          });\r\n          dialog.show();\r\n        },\r\n      });\r\n      MenuBar.addAction(settingsButton, 'file.1');\r\n    },\r\n    onunload() {\r\n      exportAction.delete();\r\n      exportDisplay.delete();\r\n      importDisplay.delete();\r\n      settingsButton.delete();\r\n      unregisterKeyframeOverrides();\r\n      unloadAnimationUI();\r\n      unregisterAzureCodec();\r\n      restoreOverrides();\r\n      console.log('[AzureLib] Animator unloaded.');\r\n    },\r\n  });\r\n})();\r\n"
  },
  {
    "path": "src/azurelib_utils/package.json",
    "content": "{\n  \"name\": \"azurelib_utils\",\n  \"version\": \"2.1.2\",\n  \"private\": true,\n  \"description\": \"AzureLib Animator\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"start\": \"webpack --watch --mode=development\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint --fix .\",\n    \"pretest\": \"npm run lint\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"AzureDoom\",\n  \"license\": \"MIT\",\n  \"blockbenchConfig\": {\n    \"title\": \"AzureLib Animator\",\n    \"author\": \"AzureDoom\",\n    \"icon\": \"azureicon.png\",\n    \"description\": \"Create models, textures, and animations for AzureLib-powered mods using Bedrock-style tools.\",\n    \"min_version\": \"4.8.0\",\n    \"max_version\": \"15.0.0\",\n    \"new_repository_format\": \"true\",\n    \"await_loading\": true,\n    \"variant\": \"both\",\n    \"creation_date\": \"2023-04-04\",\n    \"contributes\": {\n        \"formats\": [\"azure_model\"]\n    },\n    \"has_changelog\": true,\n    \"website\": \"https://wiki.azuredoom.com/\",\n    \"tags\": [\n      \"Minecraft: Java Edition\"\n    ]\n  },\n  \"sideEffects\": [\n    \"./index.js\"\n  ],\n  \"devDependencies\": {\n    \"eol\": \"0.9.1\",\n    \"eslint\": \"8.46.0\",\n    \"webpack\": \"5.102.1\",\n    \"webpack-cli\": \"5.1.4\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.21\",\n    \"semver\": \"7.5.4\"\n  }\n}\n"
  },
  {
    "path": "src/azurelib_utils/templates/armorTemplate.json",
    "content": "{\r\n  \"meta\": {\r\n    \"format_version\": \"3.2\",\r\n    \"model_format\": \"azure_model\",\r\n    \"box_uv\": true\r\n  },\r\n  \"name\": \"CustomArmor\",\r\n  \"geo_name\": \"CustomArmor\",\r\n  \"resolution\": {\r\n    \"width\": 64,\r\n    \"height\": 64\r\n  },\r\n  \"elements\": [\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        -4,\r\n        24,\r\n        -4\r\n      ],\r\n      \"to\": [\r\n        4,\r\n        32,\r\n        4\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        0,\r\n        0,\r\n        0\r\n      ],\r\n      \"uuid\": \"9675593e-b27d-b70e-e1ea-1fc29f46a294\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        -4,\r\n        12,\r\n        -2\r\n      ],\r\n      \"to\": [\r\n        4,\r\n        24,\r\n        2\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        0,\r\n        24,\r\n        0\r\n      ],\r\n      \"uuid\": \"fa43156a-2a62-948c-082f-483d525f6d1f\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        4,\r\n        12,\r\n        -2\r\n      ],\r\n      \"to\": [\r\n        8,\r\n        24,\r\n        2\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        4,\r\n        22,\r\n        0\r\n      ],\r\n      \"uuid\": \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        -8,\r\n        12,\r\n        -2\r\n      ],\r\n      \"to\": [\r\n        -4,\r\n        24,\r\n        2\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        4,\r\n        22,\r\n        0\r\n      ],\r\n      \"uuid\": \"bf2c2539-20e3-cfcc-94c0-491734019889\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        -4,\r\n        0,\r\n        -2\r\n      ],\r\n      \"to\": [\r\n        0,\r\n        12,\r\n        2\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        4,\r\n        22,\r\n        0\r\n      ],\r\n      \"uuid\": \"17b9bae0-356a-9bba-fad9-4672e2671191\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [\r\n        0,\r\n        0,\r\n        -2\r\n      ],\r\n      \"to\": [\r\n        4,\r\n        12,\r\n        2\r\n      ],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [\r\n        4,\r\n        22,\r\n        0\r\n      ],\r\n      \"uuid\": \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\"\r\n    },\r\n    {\r\n      \"name\": \"dontTouch\",\r\n      \"from\": [-4, 12, -2],\r\n      \"to\": [4, 16, 2],\r\n      \"autouv\": 1,\r\n      \"color\": 0,\r\n      \"export\": false,\r\n      \"locked\": true,\r\n      \"origin\": [0, 12, 0],\r\n      \"uuid\": \"aa51250c-8b32-fb62-71f1-58ac0b7785a8\"\r\n    }\r\n  ],\r\n  \"outliner\": [\r\n    {\r\n      \"name\": \"bipedHead\",\r\n      \"uuid\": \"d340b6fa-56aa-9c0f-3560-7a067643b77d\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        0,\r\n        24,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"9675593e-b27d-b70e-e1ea-1fc29f46a294\",\r\n        {\r\n          \"name\": \"armorHead\",\r\n          \"uuid\": \"6ab88dea-c816-d2bb-6be9-05ed7838da97\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            0,\r\n            24,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedBody\",\r\n      \"uuid\": \"ce5b366c-fd87-41ae-9a73-e0a4d4b05f8d\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        0,\r\n        24,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"fa43156a-2a62-948c-082f-483d525f6d1f\",\r\n        {\r\n          \"name\": \"armorBody\",\r\n          \"uuid\": \"282fcdbb-8ea9-4a13-4154-f2ed20d696c8\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            0,\r\n            24,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedRightArm\",\r\n      \"uuid\": \"d8113cc7-7e10-0930-259e-b8e4211ce9da\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        5,\r\n        22,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"aa51170c-8b32-fb62-71f1-58ac0b7785a8\",\r\n        {\r\n          \"name\": \"armorRightArm\",\r\n          \"uuid\": \"c5300e23-fd2f-b56c-3552-45d6650e11c6\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            5,\r\n            22,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedLeftArm\",\r\n      \"uuid\": \"3b8901e8-3420-0834-51eb-76d64ff2ae8f\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        -5,\r\n        22,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"bf2c2539-20e3-cfcc-94c0-491734019889\",\r\n        {\r\n          \"name\": \"armorLeftArm\",\r\n          \"uuid\": \"b0d41a53-f4ce-53c1-f899-5a2048c90ac2\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            -5,\r\n            22,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedWaist\",\r\n      \"uuid\": \"d8125cc7-7e10-0930-259e-b8e4211ce9da\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        0,\r\n        12,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"aa51250c-8b32-fb62-71f1-58ac0b7785a8\",\r\n        {\r\n          \"name\": \"armorWaist\",\r\n          \"uuid\": \"c9000e23-fd2f-b56c-3552-45d6650e11c6\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            0,\r\n            12,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedLeftLeg\",\r\n      \"uuid\": \"37231be7-a8ef-22ca-7fea-40aed58003bb\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        -2,\r\n        12,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"17b9bae0-356a-9bba-fad9-4672e2671191\",\r\n        {\r\n          \"name\": \"armorLeftLeg\",\r\n          \"uuid\": \"e4b19746-2d17-1f56-befe-00718165ae50\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            -2,\r\n            12,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        },\r\n        {\r\n          \"name\": \"armorLeftBoot\",\r\n          \"uuid\": \"9fe26b9a-ad66-9e6b-2fa2-4168e333b4be\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            -2,\r\n            12,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"name\": \"bipedRightLeg\",\r\n      \"uuid\": \"45c031a5-b6be-e0a7-5454-b45d07f28429\",\r\n      \"export\": true,\r\n      \"isOpen\": true,\r\n      \"visibility\": true,\r\n      \"autouv\": 0,\r\n      \"origin\": [\r\n        2,\r\n        12,\r\n        0\r\n      ],\r\n      \"children\": [\r\n        \"7b31bac4-dc40-2b93-1204-7bbdcfe7d924\",\r\n        {\r\n          \"name\": \"armorRightLeg\",\r\n          \"uuid\": \"60238f18-e74b-c863-cb45-2e2f162221bd\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            2,\r\n            12,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        },\r\n        {\r\n          \"name\": \"armorRightBoot\",\r\n          \"uuid\": \"eb3db34b-ccfe-dae9-ac4d-4e22c3222f70\",\r\n          \"export\": true,\r\n          \"isOpen\": true,\r\n          \"visibility\": true,\r\n          \"autouv\": 0,\r\n          \"origin\": [\r\n            2,\r\n            12,\r\n            0\r\n          ],\r\n          \"children\": [\r\n            \r\n          ]\r\n        }\r\n      ]\r\n    }\r\n  ],\r\n  \"textures\": [\r\n    \r\n  ]\r\n}"
  },
  {
    "path": "src/azurelib_utils/webpack.config.js",
    "content": "const PathModule = require('path')\r\n\r\nmodule.exports = {\r\n    mode: 'production',\r\n    target: 'node',\r\n    entry: './index.js',\r\n    output: {\r\n        filename: 'azurelib_utils.js',\r\n        path: PathModule.resolve(__dirname, '../../plugins/azurelib_utils')\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/easings/.gitignore",
    "content": "node_modules/"
  },
  {
    "path": "src/easings/.prettierrc",
    "content": "{\n\t\"tabWidth\": 2,\n\t\"useTabs\": true,\n\t\"printWidth\": 100,\n\t\"overrides\": [\n\t\t{\n\t\t\t\"files\": [\"*.ts\"],\n\t\t\t\"options\": {\n\t\t\t\t\"plugins\": [\"prettier-plugin-organize-imports\", \"prettier-plugin-multiline-arrays\"]\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "src/easings/README.md",
    "content": "# Easings\n\nApply easing to Minecraft: Bedrock Edition animations by utilizing `anim_time_update`.\n\n> Easing can only be applied to animations with a default or empty anim time update and a defined animation length.\n\n> You must reapply or re-run the easing if you change the animation duration or loop mode.\n\n> Blockbench might not be able to preview bounce easings properly.\n\n## Supported Easings\n\n- Sine\n- Quad\n- Cubic\n- Quart\n- Quint\n- Expo\n- Circ\n- Bounce\n\n## Unsupported Easings\n\n- Back\n- Elastic\n\nThese are unsupported because Bedrock animations clamp values within the animation length while these easings can extend beyond that range.\n"
  },
  {
    "path": "src/easings/eslint.config.mjs",
    "content": "import tseslint from \"typescript-eslint\";\nimport { defineConfig } from \"eslint/config\";\n\nexport default defineConfig([\n\t...tseslint.configs.strict,\n\t{\n\t\trules: {\n\t\t\tcurly: \"warn\",\n\t\t\teqeqeq: \"warn\",\n\t\t\t\"@typescript-eslint/naming-convention\": [\n\t\t\t\t\"warn\",\n\t\t\t\t{\n\t\t\t\t\tselector: \"typeLike\",\n\t\t\t\t\tformat: [\"PascalCase\"],\n\t\t\t\t\tleadingUnderscore: \"allow\",\n\t\t\t\t},\n\t\t\t],\n\t\t\t\"@typescript-eslint/no-extraneous-class\": \"off\",\n\t\t},\n\t},\n]);\n"
  },
  {
    "path": "src/easings/package.json",
    "content": "{\n\t\"name\": \"easings\",\n\t\"private\": true,\n\t\"version\": \"1.0.0\",\n\t\"module\": \"src/index.ts\",\n\t\"type\": \"module\",\n\t\"author\": {\n\t\t\"name\": \"Svdex\",\n\t\t\"url\": \"http://svdex.moe\"\n\t},\n\t\"scripts\": {\n\t\t\"watch\": \"esbuild src/index.ts --bundle --watch --minify --outfile=../../plugins/easings/easings.js --format=iife\",\n\t\t\"build\": \"esbuild src/index.ts --bundle --minify --outfile=../../plugins/easings/easings.js --format=iife\"\n\t},\n\t\"devDependencies\": {\n\t\t\"esbuild\": \"^0.25.6\",\n\t\t\"eslint\": \"^9.37.0\",\n\t\t\"prettier\": \"^3.6.2\",\n\t\t\"prettier-plugin-multiline-arrays\": \"^4.0.3\",\n\t\t\"prettier-plugin-organize-imports\": \"^4.1.0\",\n\t\t\"typescript-eslint\": \"^8.36.0\"\n\t}\n}\n"
  },
  {
    "path": "src/easings/src/easings.ts",
    "content": "import packageJson from \"../package.json\" assert { type: \"json\" };\nimport { variable } from \"./util\";\n\nconst EASING = {\n\tinSine: \"math.ease_in_sine(_t)\",\n\toutSine: \"math.ease_out_sine(_t)\",\n\tinOutSine: \"math.ease_in_out_sine(_t)\",\n\tinQuad: \"math.ease_in_quad(_t)\",\n\toutQuad: \"math.ease_out_quad(_t)\",\n\tinOutQuad: \"math.ease_in_out_quad(_t)\",\n\tinCubic: \"math.ease_in_cubic(_t)\",\n\toutCubic: \"math.ease_out_cubic(_t)\",\n\tinOutCubic: \"math.ease_in_out_cubic(_t)\",\n\tinQuart: \"math.ease_in_quart(_t)\",\n\toutQuart: \"math.ease_out_quart(_t)\",\n\tinOutQuart: \"math.ease_in_out_quart(_t)\",\n\tinQuint: \"math.ease_in_quint(_t)\",\n\toutQuint: \"math.ease_out_quint(_t)\",\n\tinOutQuint: \"math.ease_in_out_quint(_t)\",\n\tinExpo: \"math.ease_in_expo(_t)\",\n\toutExpo: \"math.ease_out_expo(_t)\",\n\tinOutExpo: \"math.ease_in_out_expo(_t)\",\n\tinCirc: \"math.ease_in_circ(_t)\",\n\toutCirc: \"math.ease_out_circ(_t)\",\n\tinOutCirc: \"math.ease_in_out_circ(_t)\",\n\tinBounce: \"math.ease_in_bounce(_t)\",\n\toutBounce: \"math.ease_out_bounce(_t)\",\n\tinOutBounce: \"math.ease_in_out_bounce(_t)\",\n} as const;\nexport const EASING_NAMES = Object.keys(EASING) as Easing[];\n\nfunction ease(options: EasingifyOptions) {\n\tconst { easing, duration, animationName, loop = false } = options;\n\tconst vt = variable(animationName);\n\tconst vo = variable(animationName + \"_orig\");\n\tconst f = EASING[easing].replace(/_t/g, `0,${duration},${vt}`).replace(/\\s+/g, \"\");\n\tlet o: string;\n\tif (loop === \"loop\") {\n\t\to = `${vo}=(${vo}??0)+q.delta_time;${vo}>${duration}?{${vo}=${vo}-${duration};};`;\n\t} else {\n\t\to = `(${vo}??0)>${duration}?{return${duration + 0.1};}:{${vo}=(${vo}??0)+q.delta_time;};`;\n\t}\n\treturn `q.anim_time==0?{${vo}=0;};${o}${vt}=${vo}/${duration};return${f};`;\n}\n\nconst EASING_HEADER = `'${packageJson.name}=${packageJson.version}';`;\nexport function easingify(animation: BedrockAnimation, easing: Easing) {\n\tconst animationName = animation.name;\n\tconst easeIndex = EASING_NAMES.indexOf(easing);\n\tconst str =\n\t\tEASING_HEADER +\n\t\t`'i=${easeIndex}';` +\n\t\tease({ animationName, duration: animation.length, easing, loop: animation.loop });\n\tanimation.anim_time_update = str;\n}\n\nexport function getEasing(animation: BedrockAnimation) {\n\tconst molang = animation.anim_time_update;\n\tif (!molang.startsWith(EASING_HEADER)) {\n\t\treturn;\n\t}\n\tconst sliced = molang.slice(EASING_HEADER.length);\n\tconst captured = sliced.match(/'i=(\\d+)'/)?.[1];\n\tif (!captured) {\n\t\treturn;\n\t}\n\tconst index = +captured;\n\tconst name = EASING_NAMES[index];\n\tif (name) {\n\t\treturn {\n\t\t\teasing: name,\n\t\t\tindex,\n\t\t};\n\t}\n}\n\nexport function canBeEased(animation: BedrockAnimation) {\n\tconst molang = animation.anim_time_update;\n\treturn molang.startsWith(EASING_HEADER) || (!molang && animation.length > 0);\n}\n\nexport type Easing = keyof typeof EASING;\ntype EasingifyOptions = {\n\teasing: Easing;\n\tduration: number;\n\tanimationName: string;\n\tloop: \"once\" | \"hold\" | \"loop\";\n};\n"
  },
  {
    "path": "src/easings/src/index.ts",
    "content": "/// <reference types=\"blockbench-types\" />\nimport packageJson from \"../package.json\" assert { type: \"json\" };\nimport { canBeEased, EASING_NAMES, easingify, getEasing, type Easing } from \"./easings\";\n\nconst ICONS = {\n\ton: \"far.fa-dot-circle\",\n\toff: \"far.fa-circle\",\n};\n\nclass EasingsPlugin implements PluginOptions {\n\treadonly id = packageJson.name;\n\treadonly title = \"Easings\";\n\treadonly author = packageJson.author.name;\n\treadonly version = packageJson.version;\n\treadonly description = \"Apply easing functions to Minecraft: Bedrock Edition animations.\";\n\treadonly icon = \"stacked_line_chart\";\n\treadonly variant: \"both\" | \"desktop\" | \"web\" = \"both\";\n\treadonly tags = [\"Minecraft: Bedrock Edition\", \"Animation\"] satisfies [string, string];\n\treadonly website = packageJson.author.url;\n\treadonly min_version = \"4.8.0\";\n\treadonly has_changelog = true;\n\n\tactions: Action[] = [];\n\treadonly formats = new Set([\"bedrock\", \"bedrock_old\"]);\n\tconstructor() {\n\t\tthis.onload = this.onload.bind(this);\n\t\tthis.onunload = this.onunload.bind(this);\n\t}\n\tonload(): void {\n\t\tthis.actionApplyEasing();\n\t\tthis.actionManageEasings();\n\t}\n\tonunload(): void {\n\t\tfor (const action of this.actions) {\n\t\t\taction.delete();\n\t\t}\n\t\tthis.actions = [];\n\t}\n\tprotected isBedrockAnimation(animation: BBAnimation): animation is BedrockAnimation {\n\t\treturn \"anim_time_update\" in animation && typeof animation.anim_time_update === \"string\";\n\t}\n\tprotected getSelectedAnimation(): BedrockAnimation | undefined {\n\t\t// @ts-expect-error: Animation is not typed correctly in blockbench types, it should be Animation | null.\n\t\tif (Animator.open && Blockbench.Animation && Animation.selected !== null) {\n\t\t\t// @ts-expect-error: Animation is not typed correctly in blockbench types, it should be Animation | null.\n\t\t\tconst animation: BBAnimation = Animation.selected;\n\t\t\tif (this.isBedrockAnimation(animation)) {\n\t\t\t\treturn animation;\n\t\t\t}\n\t\t}\n\t}\n\tprotected actionApplyEasing() {\n\t\tconst changeEasing = new Action(\"easings.apply_easing\", {\n\t\t\ticon: this.icon,\n\t\t\tname: \"Apply Easing\",\n\t\t\tdescription: \"Apply the easing function of the selected animation.\",\n\t\t\tcondition: () => {\n\t\t\t\tif (!this.formats.has(Format.id)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst animation = this.getSelectedAnimation();\n\t\t\t\treturn Animator.open && animation && canBeEased(animation);\n\t\t\t},\n\t\t\tclick(event) {\n\t\t\t\tif (typeof this.children === \"function\" && event?.target instanceof HTMLElement) {\n\t\t\t\t\tnew Menu(this.children()).open(event.target);\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: () => {\n\t\t\t\tconst animation = this.getSelectedAnimation();\n\t\t\t\tif (!animation) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tconst items = [\"None\", ...EASING_NAMES] as (Easing | \"None\")[];\n\t\t\t\tconst easing = getEasing(animation)?.easing ?? \"None\";\n\t\t\t\treturn items.map((item) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: item,\n\t\t\t\t\t\ticon: item === easing ? ICONS.on : ICONS.off,\n\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\tUndo.initEdit({ animations: [animation] });\n\t\t\t\t\t\t\tif (item === \"None\") {\n\t\t\t\t\t\t\t\tanimation.anim_time_update = \"\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\teasingify(animation, item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tUndo.finishEdit(\"Apply Easing\");\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}) satisfies Pick<ActionOptions, \"name\" | \"icon\" | \"click\">[];\n\t\t\t},\n\t\t});\n\t\tthis.actions.push(changeEasing);\n\t}\n\tprotected actionManageEasings() {\n\t\tconst changeEasings = new Action(\"easings.manage_easings\", {\n\t\t\ticon: this.icon,\n\t\t\tname: \"Manage Easings\",\n\t\t\tdescription: \"Manage easing functions for all animations in the current file.\",\n\t\t\tcondition: () =>\n\t\t\t\tthis.formats.has(Format.id) && Animator.open && this.allAnimations.some(canBeEased),\n\t\t\tclick: () => this.easingsDialog.show(),\n\t\t});\n\t\tthis.actions.push(changeEasings);\n\t\tMenuBar.addAction(changeEasings, \"animation\");\n\t}\n\tprotected get allAnimations() {\n\t\tif (!Animator.open) {\n\t\t\treturn [];\n\t\t}\n\t\treturn AnimationItem.all.filter(this.isBedrockAnimation);\n\t}\n\tprotected get easingsDialog() {\n\t\tconst allAnimations = this.allAnimations;\n\t\tconst animations = allAnimations.reduce(\n\t\t\t(acc, animation) => {\n\t\t\t\tacc[animation.name.replaceAll(\".\", \"_tkn_\")] = animation;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, BedrockAnimation>,\n\t\t);\n\t\tconst easingList = [\"None\", ...EASING_NAMES];\n\t\tconst easingEntries = Object.fromEntries(\n\t\t\teasingList.map((name, index) => [index, name] as const),\n\t\t);\n\t\tconst entries = allAnimations.reduce(\n\t\t\t(acc, animation) => {\n\t\t\t\tif (!canBeEased(animation)) {\n\t\t\t\t\treturn acc;\n\t\t\t\t}\n\t\t\t\tconst easing = getEasing(animation);\n\t\t\t\tconst id = animation.name.replaceAll(\".\", \"_tkn_\");\n\t\t\t\tconst value = 1 + (easing?.index ?? -1);\n\t\t\t\tacc[id] = {\n\t\t\t\t\ttype: \"select\",\n\t\t\t\t\tlabel: animation.name,\n\t\t\t\t\toptions: easingEntries,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, FormElementOptions>,\n\t\t);\n\t\tconst dialog = new Dialog({\n\t\t\tid: this.id,\n\t\t\ttitle: this.title,\n\t\t\tform: {\n\t\t\t\t...entries,\n\t\t\t\tbuttonBar: {\n\t\t\t\t\ttype: \"buttons\",\n\t\t\t\t\tbuttons: [\n\t\t\t\t\t\t\"Reset All\",\n\t\t\t\t\t],\n\t\t\t\t\tclick() {\n\t\t\t\t\t\tdialog.setFormValues(\n\t\t\t\t\t\t\tObject.keys(entries).reduce(\n\t\t\t\t\t\t\t\t(acc, key) => {\n\t\t\t\t\t\t\t\t\tacc[key] = 0;\n\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{} as Record<string, number>,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} satisfies Record<string, FormElementOptions>,\n\t\t\tonConfirm: (formData: Record<string, string>) => {\n\t\t\t\tUndo.initEdit({ animations: allAnimations });\n\t\t\t\tfor (const key of Object.keys(formData)) {\n\t\t\t\t\tconst animation = animations[key];\n\t\t\t\t\tif (!animation) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst index = +formData[key];\n\t\t\t\t\tlet changed = false;\n\t\t\t\t\tif (!index) {\n\t\t\t\t\t\tif (getEasing(animation)) {\n\t\t\t\t\t\t\tanimation.anim_time_update = \"\";\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\teasingify(animation, easingList[index] as Easing);\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (changed) {\n\t\t\t\t\t\tanimation.saved = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tUndo.finishEdit(\"Apply Easing\");\n\t\t\t},\n\t\t});\n\t\treturn dialog;\n\t}\n}\n\nconst plugin = new EasingsPlugin();\nBBPlugin.register(plugin.id, plugin);\n\ndeclare global {\n\ttype BBAnimation = Omit<(typeof AnimationItem.all)[number], \"anim_time_update\">;\n\ttype BedrockAnimation = BBAnimation & { anim_time_update: string };\n}\n"
  },
  {
    "path": "src/easings/src/util.ts",
    "content": "const seed = 0xcafecafe;\nexport function hash(str: string): number {\n\tlet hash = 0;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash = (hash * 31 + str.charCodeAt(i)) | 0;\n\t}\n\treturn hash ^ seed;\n}\n\nconst letters = \"abcdefghijklmnopqrstuvwxyz\";\nexport function variable(str: string): string {\n\tconst hashed = hash(str);\n\tlet result = \"\";\n\tlet num = Math.abs(hashed);\n\tdo {\n\t\tresult = letters[num % letters.length] + result;\n\t\tnum = Math.floor(num / letters.length);\n\t} while (num > 0);\n\treturn \"v.__e\" + result;\n}\n"
  },
  {
    "path": "src/easings/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t\"target\": \"ESNext\",\n\t\t\"module\": \"ESNext\",\n\t\t\"lib\": [\"ESNext\", \"DOM\"],\n\t\t\"moduleResolution\": \"node\",\n\t\t\"allowImportingTsExtensions\": true,\n\t\t\"verbatimModuleSyntax\": true,\n\t\t\"noEmit\": true,\n\t\t\"strict\": true,\n\t\t\"skipLibCheck\": true,\n\t\t\"noFallthroughCasesInSwitch\": true,\n\t\t\"noUnusedLocals\": false,\n\t\t\"noUnusedParameters\": false,\n\t\t\"noPropertyAccessFromIndexSignature\": false,\n\t\t\"resolveJsonModule\": true,\n\t\t\"allowSyntheticDefaultImports\": true\n\t}\n}\n"
  },
  {
    "path": "src/mesh_tools/.gitignore",
    "content": "examples"
  },
  {
    "path": "src/mesh_tools/.vscode/settings.json",
    "content": "{\n\t\"cSpell.words\": [\n\t\t\"dont\",\n\t\t\"perlin\",\n\t\t\"quadrilate\",\n\t\t\"Quadrilates\"\n\t],\n\t\"files.autoSave\": \"onWindowChange\"\n}"
  },
  {
    "path": "src/mesh_tools/TODO.md",
    "content": "- [x] Modularize\n- [x] Better about description + Descriptive actions' descriptions\n- [x] Implement checkboxes for amend menus that simulated numbers as toggles. \n- [x] Better English\n- [x] Rewrite utilities\n- [x] Make use of reusable ThreeJS objects scoped for each action file.\n- [ ] MTools Generate:\n\t- [x] Allow loading font files for the Text Mesh generator\n\t- [x] Use a math parser for XYZ surface generator.\n\t- [x] XYZ surface generator: Include variables as sliders.\n\t- [ ] XYZ surface generator: Allow to save multiple presets.\n\t- [ ] Terrain generator\n\t\t- [ ] Style Editor\n\t\t\t- [ ] Better controls\n\t\t\t- [ ] Allow to save multiple presets\n\t\t- [ ] Optimize Code\n\t\t- [x] Add world scale option\n\t\t- [ ] Add texture dithering option\n- [ ] MTools Tools:\n\t- [x] New Bridge Loops Action\n\t\t- [x] Ability to bridge edge loops\n\t\t- [x] Detect face holes\n\t\t- [x] Support path blending\n\t- [x] Triangles To Quads: Improved Algorithm\n\t- [x] Expand/Shrink Selection: Enable for face and edge modes.\n- [ ] MTools Operators:\n\t- [x] Scatter\n\t\t- [x] Improve scattered mesh rotation to accurately follow face\n\t\t- [x] Add More Settings\n\t\t\t- [x] `Max Density`\n\t\t\t- [x] `Min Distance`\n\t\t\t- [x] `Scale`\n\t\t\t- [x] `Min Scale`\n\t\t\t- [x] `Scale Randomness`\n\t\t\t- [x] `Max Rotation`\n\t\t\t- [x] `Rotation Randomness`\n\t- [ ] Array operator: add more controls like rotation and scale\n\t- [ ] New Decimate Operator\n\t- [ ] Unite MTEdge and CMEdge\n- [x] Create an attractive logo 🤔"
  },
  {
    "path": "src/mesh_tools/assets/actions.json",
    "content": "{\n  \"bevel\": {\n    \"docs\": {\n      \"private\": true\n    },\n    \"name\": \"Bevel\",\n    \"icon\": \"rounded_corner\",\n    \"description\": \"Chamfers selected edges\",\n    \"selection_mode\": [\n      \"edge\"\n    ]\n  },\n  \"laplacian_smooth\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"laplacian_smooth_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"laplacian_smooth_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Laplacian Smooth\",\n    \"icon\": \"blur_on\",\n    \"description\": \"Smoothens selected vertices by averaging the position of neighboring vertices.\"\n  },\n  \"to_sphere\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"to_sphere_1_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"to_sphere_1_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        },\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"to_sphere_2_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"to_sphere_2_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"To Sphere\",\n    \"icon\": \"change_circle\",\n    \"description\": \"Casts selected vertices into a smooth, spherical shape with adjustable influence.\"\n  },\n  \"bridge_edge_loops\": {\n    \"docs\": {\n      \"flags\": {\n        \"new\": true\n      },\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"bridge_edge_loops_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"bridge_edge_loops_1_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        },\n        \"Results with Blend Path enabled.\",\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"bridge_edge_loops_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"bridge_edge_loops_2_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Bridge Edge Loops\",\n    \"icon\": \"hub\",\n    \"description\": \"Connects multiple edge loops with faces.\",\n    \"selection_mode\": [\n      \"edge\",\n      \"face\"\n    ]\n  },\n  \"poke\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"poke_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"poke_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Poke Faces\",\n    \"icon\": \"control_camera\",\n    \"description\": \"Generates a fan out of a face.\",\n    \"selection_mode\": \"face\"\n  },\n  \"tris_to_quad\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"tris_to_quad_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"tris_to_quad_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Triangles To Quadrilaterals\",\n    \"icon\": \"fas.fa-external-link-square-alt\",\n    \"description\": \"Attempts to merge adjacent triangles into quadrilaterals.\",\n    \"selection_mode\": \"face\"\n  },\n  \"triangulate\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"triangulate_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"triangulate_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Triangulate Faces\",\n    \"icon\": \"pie_chart_outline\",\n    \"description\": \"Splits selected faces into triangles.\",\n    \"selection_mode\": \"face\"\n  },\n  \"uv_project_view\": {\n    \"docs\": {\n      \"flags\": {\n        \"deprecated\": true\n      },\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"uv_project_view_solid.png\",\n              \"caption\": \"word.mesh\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"uv_project_view_uv.png\",\n              \"caption\": \"word.uv\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Project From View\",\n    \"icon\": \"view_in_ar\",\n    \"description\": \"Projects the selected faces to the UV map from the camera. Use built-in under UV > UV Project from View\"\n  },\n  \"uv_turnaround_projection\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"uv_turnaround_projection_solid.png\",\n              \"caption\": \"word.mesh\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"uv_turnaround_projection_uv.png\",\n              \"caption\": \"word.uv\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Cubic Projection\",\n    \"icon\": \"open_with\",\n    \"description\": \"Unwraps the UV map from the 6 sides of a cube.\"\n  },\n  \"uv_mapping\": {\n    \"name\": \"UV Mapping\",\n    \"icon\": \"map\",\n    \"children\": [\n      \"uv_project_view\",\n      \"uv_turnaround_projection\"\n    ]\n  },\n  \"expand_selection\": {\n    \"name\": \"Expand Selection\",\n    \"icon\": \"unfold_more_double\",\n    \"description\": \"Expands the selection with neighboring vertices.\",\n    \"keybind\": {\n      \"key\": \"l\",\n      \"ctrl\": true\n    }\n  },\n  \"shrink_selection\": {\n    \"name\": \"Shrink Selection\",\n    \"icon\": \"unfold_less_double\",\n    \"description\": \"Shrinks the selection with neighboring vertices.\",\n    \"keybind\": {\n      \"key\": \"k\",\n      \"ctrl\": true\n    }\n  },\n  \"tools\": {\n    \"name\": \"MTools\",\n    \"icon\": \"fas.fa-vector-square\",\n    \"condition\": \"NON_OBJECT_MODE\",\n    \"children\": [\n      \"bridge_edge_loops\",\n      \"to_sphere\",\n      \"laplacian_smooth\",\n      \"_\",\n      \"poke\",\n      \"tris_to_quad\",\n      \"triangulate\",\n      \"_\",\n      \"uv_mapping\",\n      \"_\",\n      \"expand_selection\",\n      \"shrink_selection\"\n    ]\n  },\n  \"operators\": {\n    \"name\": \"MTools Operators\",\n    \"icon\": \"fas.fa-vector-square\",\n    \"condition\": \"OBJECT_MODE\",\n    \"children\": [\n      \"subdivide\",\n      \"split_edges\",\n      \"_\",\n      \"scatter\",\n      \"array_elements\",\n      \"_\",\n      \"boolean\"\n    ]\n  },\n  \"subdivide\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"subdivide_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"subdivide_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Subdivide\",\n    \"icon\": \"content_cut\",\n    \"description\": \"Splits the faces of a mesh into smaller faces, giving it a smooth appearance.\"\n  },\n  \"split_edges\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"split_edges.png\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Split Edges\",\n    \"icon\": \"vertical_split\",\n    \"description\": \"Splits and duplicates edges within a mesh, breaking 'links' between faces around those split edges.\"\n  },\n  \"scatter\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"scatter.png\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Scatter\",\n    \"description\": \"Scatters selected meshes on the active mesh.\",\n    \"icon\": \"scatter_plot\"\n  },\n  \"array_elements\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"array.png\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Array\",\n    \"icon\": \"fas.fa-layer-group\",\n    \"description\": \"Generates an array of copies of the base object, with each copy being offset from the previous one.\"\n  },\n  \"boolean\": {\n    \"name\": \"Boolean\",\n    \"icon\": \"fas.fa-object-group\",\n    \"description\": \"Performs a boolean operation on two selected meshes.\",\n    \"docs\": {\n      \"flags\": {\n        \"new\": true,\n        \"experimental\": true\n      },\n      \"lines\": [\n        \"Result with boolean operation \\\"Subtraction (A - B)\\\".\",\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"boolean_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"boolean_1_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        },\n        \"Result with boolean operation \\\"Intersection (A ∩ B)\\\".\",\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"boolean_before.png\",\n              \"caption\": \"word.before\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"boolean_2_after.png\",\n              \"caption\": \"word.after\"\n            }\n          ]\n        }\n      ]\n    }\n  },\n  \"generators\": {\n    \"name\": \"MTools Generate\",\n    \"icon\": \"fas.fa-vector-square\",\n    \"condition\": \"MESH\",\n    \"children\": [\n      \"terrain_action\",\n      \"terrainse\",\n      \"_\",\n      \"textmesh\",\n      \"xyzmathsurfacefunction\",\n      \"quickprimitives\"\n    ]\n  },\n  \"terrain_action\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"terrain_solid.png\"\n            },\n            {\n              \"type\": \"image\",\n              \"src\": \"terrain_wire.png\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Terrain\",\n    \"icon\": \"terrain\",\n    \"description\": \"Generates terrains procedurally with fully customized settings.\"\n  },\n  \"terrainse\": {\n    \"name\": \"Terrain Style Editor\",\n    \"icon\": \"draw\",\n    \"description\": \"Configure the Custom color gradient style of the terrain generator.\"\n  },\n  \"textmesh\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"text.png\",\n              \"caption\": \"\\\"Butcher\\\" expressed in Chinese\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Text Mesh\",\n    \"icon\": \"format_size\",\n    \"description\": \"Converts text into a 3D object, ideal for creating signs or logos.\"\n  },\n  \"xyzmathsurfacefunction\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"xyz.png\",\n              \"caption\": \"Twisted Torus Preset\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"XYZ Math Surface\",\n    \"icon\": \"fas.fa-brain\",\n    \"description\": \"Generates an xyz surface based on mathematical equations containing 23 pre-built presets!\"\n  },\n  \"quickprimitives\": {\n    \"name\": \"Quick Primitives\",\n    \"icon\": \"fas.fa-shapes\",\n    \"children\": [\n      \"polyhedron\",\n      \"torusknot\"\n    ]\n  },\n  \"polyhedron\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"polyhedron.png\",\n              \"caption\": \"Icosahedron\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Polyhedron\",\n    \"icon\": \"offline_bolt\",\n    \"description\": \"Generate a polyhedron such as an Icosahedron, a Dodecahedron, an Octahedron or a Tetrahedron.\"\n  },\n  \"torusknot\": {\n    \"docs\": {\n      \"lines\": [\n        {\n          \"type\": \"inset_row\",\n          \"items\": [\n            {\n              \"type\": \"image\",\n              \"src\": \"torus_knot.png\"\n            }\n          ]\n        }\n      ]\n    },\n    \"name\": \"Torus Knot\",\n    \"icon\": \"offline_bolt\",\n    \"description\": \"Generate a Torus Knot with fully customized settings.\"\n  }\n}"
  },
  {
    "path": "src/mesh_tools/assets/roboto_regular.json",
    "content": "{\n  \"glyphs\": {\n    \"0\": {\n      \"ha\": 829,\n      \"x_min\": 37,\n      \"x_max\": 790,\n      \"o\": \"m 790 408 q 689 114 790 237 q 414 -18 581 -18 q 139 114 247 -18 q 37 408 37 238 q 139 701 37 578 q 414 832 247 832 q 689 702 581 832 q 790 408 790 579 m 631 408 q 576 589 631 513 q 414 672 515 672 q 252 589 313 672 q 199 408 199 514 q 253 227 199 304 q 414 142 314 142 q 574 229 510 142 q 631 408 631 309 z \"\n    },\n    \"1\": {\n      \"ha\": 389,\n      \"x_min\": 15,\n      \"x_max\": 312,\n      \"o\": \"m 312 802 q 311 790 312 799 q 296 387 296 667 q 297 208 296 328 q 298 28 298 87 q 276 1 298 1 q 212 0 254 1 q 149 -1 170 -1 q 127 16 127 -1 q 136 265 127 30 q 140 597 140 379 q 134 613 140 613 q 82 602 117 613 q 31 591 47 591 q 15 600 15 591 q 17 624 15 608 q 18 648 18 640 q 17 671 18 656 q 16 693 16 686 q 31 708 16 702 q 114 764 70 724 q 151 804 116 766 q 185 838 182 838 q 241 825 184 838 q 302 815 262 823 q 312 802 312 812 z \"\n    },\n    \"2\": {\n      \"ha\": 673,\n      \"x_min\": 8,\n      \"x_max\": 656,\n      \"o\": \"m 656 125 q 654 64 656 105 q 652 3 652 23 q 629 -12 652 -12 q 565 -7 637 -12 q 353 -1 494 -1 q 207 -3 304 -1 q 61 -5 110 -5 q 41 8 45 -5 l 24 106 q 71 122 24 114 q 138 143 124 132 q 323 337 232 225 q 440 558 440 483 q 390 660 440 620 q 281 697 343 697 q 160 673 220 697 q 77 630 119 657 q 42 606 42 606 q 35 607 37 606 q 26 631 28 610 q 22 677 26 647 q 8 728 8 739 q 18 741 8 733 q 158 808 73 782 q 313 833 240 833 q 518 775 437 833 q 610 589 610 709 q 371 220 610 457 q 288 131 345 189 q 332 130 305 130 q 636 146 465 130 l 642 146 q 656 125 656 146 z \"\n    },\n    \"3\": {\n      \"ha\": 654,\n      \"x_min\": 23,\n      \"x_max\": 619,\n      \"o\": \"m 619 232 q 526 41 619 107 q 314 -17 444 -17 q 36 40 160 -17 q 23 52 23 46 q 56 158 23 50 q 68 173 60 173 q 267 111 189 111 q 452 245 452 111 q 388 361 452 329 q 252 385 342 385 q 199 384 233 385 q 151 382 165 382 q 111 399 111 382 q 132 491 111 491 q 221 484 161 491 q 311 477 281 477 q 384 507 356 477 q 412 582 412 537 q 250 707 412 707 q 79 667 155 707 q 73 665 77 665 q 56 766 56 665 q 165 819 56 800 q 301 832 240 832 q 494 783 414 832 q 590 618 590 724 q 560 508 590 563 q 479 429 528 450 q 619 232 619 382 z \"\n    },\n    \"4\": {\n      \"ha\": 694,\n      \"x_min\": 11,\n      \"x_max\": 669,\n      \"o\": \"m 669 184 q 654 172 669 172 q 585 174 630 174 q 566 172 569 174 q 561 153 561 168 q 565 81 561 129 q 568 9 568 33 q 551 -8 568 -5 q 472 -12 528 -12 q 377 3 377 -12 q 385 77 377 22 q 392 158 392 132 q 380 174 392 174 q 216 170 326 174 q 52 167 106 167 q 11 250 11 167 q 24 332 11 316 q 158 496 71 385 q 328 741 267 649 q 386 829 347 770 q 407 844 397 844 q 550 808 454 844 q 571 783 571 801 q 566 679 571 749 q 561 575 561 610 q 560 468 561 544 q 559 361 559 399 l 559 306 q 611 309 577 306 q 663 311 646 311 q 668 300 668 311 q 669 242 668 281 q 669 184 669 204 m 416 668 q 412 676 416 673 q 395 653 406 676 q 380 624 388 638 q 146 307 263 467 q 201 299 149 299 l 229 299 q 397 302 342 299 q 399 469 398 386 q 411 632 402 576 q 416 668 416 665 z \"\n    },\n    \"5\": {\n      \"ha\": 661,\n      \"x_min\": 12,\n      \"x_max\": 607,\n      \"o\": \"m 607 275 q 511 52 607 128 q 273 -18 424 -18 q 130 -1 225 -18 q 12 46 12 21 q 22 124 12 70 q 45 186 34 186 q 105 150 35 186 q 237 113 176 113 q 375 146 322 113 q 437 267 437 187 q 242 399 437 399 q 166 392 216 399 q 97 385 117 385 q 78 393 82 385 q 77 406 77 397 q 77 446 76 420 q 78 486 78 475 q 77 634 78 535 q 75 783 75 734 q 91 807 75 793 q 115 821 106 821 q 222 818 151 821 q 329 814 293 814 q 432 818 363 814 q 535 821 500 821 q 551 808 551 821 q 544 756 551 794 q 538 699 538 718 q 527 683 538 691 q 509 675 517 675 q 403 679 473 675 q 298 683 333 683 q 210 681 248 683 q 203 510 210 625 q 264 515 223 510 q 326 519 305 519 q 525 462 451 519 q 607 275 607 397 z \"\n    },\n    \"6\": {\n      \"ha\": 713,\n      \"x_min\": 46,\n      \"x_max\": 676,\n      \"o\": \"m 676 296 q 593 67 676 152 q 366 -18 509 -18 q 124 92 210 -18 q 46 351 46 191 q 185 691 46 547 q 519 835 324 835 q 538 821 532 835 q 572 724 572 725 q 547 704 572 704 q 378 665 452 704 q 244 533 281 615 q 239 516 239 522 q 246 509 239 508 q 327 540 287 524 q 412 554 370 554 q 602 483 528 554 q 676 296 676 412 m 530 293 q 487 406 530 361 q 375 450 444 450 q 203 311 203 450 q 243 173 203 233 q 364 106 289 106 q 530 293 530 106 z \"\n    },\n    \"7\": {\n      \"ha\": 612,\n      \"x_min\": 9,\n      \"x_max\": 593,\n      \"o\": \"m 593 751 q 591 721 593 728 q 564 681 591 717 q 406 359 473 559 q 321 26 340 167 q 316 5 319 10 q 298 -8 311 -5 q 218 -14 279 -14 q 140 -8 155 -14 q 132 8 132 -5 q 201 258 132 92 q 328 529 246 368 q 397 667 397 663 q 379 677 397 677 q 203 668 321 677 q 28 659 86 659 q 9 671 9 659 q 14 705 9 684 q 20 739 19 732 q 21 814 21 751 q 40 828 21 828 q 195 819 85 828 q 567 814 265 814 q 593 751 593 814 z \"\n    },\n    \"8\": {\n      \"ha\": 636,\n      \"x_min\": 11,\n      \"x_max\": 610,\n      \"o\": \"m 610 224 q 523 43 610 111 q 319 -20 442 -20 q 104 39 184 -20 q 11 242 11 106 q 117 425 11 366 q 60 502 82 452 q 39 604 39 553 q 125 783 39 719 q 322 840 203 840 q 509 779 429 840 q 597 608 597 712 q 571 502 597 555 q 501 417 545 446 q 610 224 610 355 m 458 600 q 420 681 458 647 q 326 715 382 715 q 224 689 262 715 q 187 622 187 663 q 265 528 187 568 q 397 477 300 509 q 458 600 458 529 m 448 214 q 366 316 448 276 q 234 367 300 342 q 159 233 159 316 q 197 141 159 176 q 314 102 239 102 q 448 214 448 102 z \"\n    },\n    \"9\": {\n      \"ha\": 713,\n      \"x_min\": 36,\n      \"x_max\": 667,\n      \"o\": \"m 667 456 q 524 104 667 248 q 172 -39 380 -39 q 154 -26 159 -39 q 121 77 121 58 q 147 92 121 92 q 334 135 249 92 q 425 209 380 159 q 476 312 476 266 q 471 318 476 318 q 456 311 467 318 q 300 268 384 268 q 109 341 182 268 q 36 532 36 414 q 121 754 36 674 q 347 832 204 832 q 591 720 506 832 q 667 456 667 619 m 510 513 q 470 646 510 591 q 350 707 426 707 q 184 532 184 707 q 228 418 184 463 q 339 372 271 372 q 456 407 408 372 q 510 513 510 446 z \"\n    },\n    \" \": {\n      \"ha\": 347,\n      \"x_min\": 0,\n      \"x_max\": 0,\n      \"o\": \"\"\n    },\n    \"!\": {\n      \"ha\": 322,\n      \"x_min\": 79,\n      \"x_max\": 256,\n      \"o\": \"m 253 779 q 228 465 253 608 q 201 304 218 412 q 165 278 199 278 q 139 281 146 278 q 125 301 128 284 q 83 561 83 505 l 83 926 q 92 953 83 953 q 129 949 104 953 q 167 946 154 946 q 205 949 180 946 q 243 953 231 953 q 252 927 252 953 q 252 853 252 902 q 253 779 253 804 m 256 79 q 231 10 256 39 q 167 -18 207 -18 q 102 12 127 -18 q 79 79 79 39 q 103 146 79 119 q 167 174 127 174 q 231 146 206 174 q 256 79 256 119 z \"\n    },\n    \"\\\"\": {\n      \"ha\": 421,\n      \"x_min\": 47,\n      \"x_max\": 375,\n      \"o\": \"m 375 937 l 375 869 q 343 663 375 751 q 311 650 338 650 q 272 660 276 650 q 259 718 270 666 q 248 777 248 770 l 248 937 q 252 950 248 942 q 313 954 269 954 q 371 950 329 954 q 375 937 375 942 m 175 777 q 163 718 175 770 q 150 660 152 666 q 111 650 146 650 q 79 663 83 650 q 47 856 47 750 l 47 941 q 110 954 47 954 q 164 951 155 954 q 176 926 176 946 q 175 896 176 920 q 174 850 174 871 q 174 813 174 838 q 175 777 175 789 z \"\n    },\n    \"#\": {\n      \"ha\": 922,\n      \"x_min\": 35,\n      \"x_max\": 887,\n      \"o\": \"m 887 625 q 881 576 887 606 q 863 538 873 538 q 857 539 861 538 q 672 549 829 543 q 623 357 656 484 q 829 359 764 359 q 844 348 844 359 q 832 265 844 308 q 820 253 829 253 q 814 254 820 253 q 595 264 786 258 q 544 56 578 197 q 518 -53 537 18 q 500 -69 513 -69 q 490 -66 496 -69 q 461 -50 481 -61 q 433 -40 447 -45 q 415 -22 415 -33 q 494 265 415 -8 l 440 265 q 323 264 359 265 q 248 -47 300 159 q 231 -62 243 -62 q 182 -43 219 -62 q 144 -15 144 -24 q 221 261 144 1 q 135 257 196 260 q 50 254 81 254 q 35 272 35 254 q 39 296 35 280 q 45 318 43 312 q 47 350 45 330 q 65 363 51 363 q 159 360 100 363 q 253 357 227 357 l 300 547 q 197 543 269 547 q 93 539 130 539 q 80 553 80 539 q 90 627 80 593 q 109 639 94 639 q 215 637 148 639 q 322 633 294 634 l 382 861 q 406 958 389 894 q 423 973 410 973 q 445 964 431 973 q 467 950 463 951 q 492 943 479 947 q 509 926 509 938 q 425 632 509 906 l 595 632 q 654 856 614 707 q 676 951 661 888 q 694 968 681 968 q 704 965 699 968 q 739 946 715 958 q 772 933 752 942 q 779 920 779 928 q 696 633 779 916 q 872 636 810 636 q 887 625 887 636 m 572 549 q 510 550 543 550 l 401 550 q 351 355 389 507 l 524 355 q 572 549 541 420 z \"\n    },\n    \"$\": {\n      \"ha\": 597,\n      \"x_min\": 50,\n      \"x_max\": 568,\n      \"o\": \"m 568 747 q 566 737 568 743 q 546 690 559 722 q 536 650 543 677 q 524 641 533 641 q 462 675 525 641 q 351 711 399 709 q 346 595 346 671 q 346 476 346 536 q 479 382 449 412 q 545 240 545 321 q 431 53 545 114 q 335 20 370 20 q 336 -90 336 -38 q 333 -110 336 -110 q 314 -109 327 -110 q 294 -107 301 -107 q 276 -109 288 -107 q 258 -111 263 -111 q 252 -92 252 -111 q 253 5 252 -46 q 78 26 141 5 q 65 43 66 31 q 61 97 64 61 q 54 127 60 104 q 50 157 50 146 q 60 168 50 168 q 66 168 64 168 q 100 155 79 163 q 208 134 154 134 l 218 133 q 254 135 236 133 q 260 367 256 212 q 125 463 157 433 q 58 607 58 528 q 120 754 58 694 q 267 827 176 808 q 267 919 267 838 q 273 928 267 928 l 349 928 q 355 829 357 928 q 473 801 391 828 q 568 747 568 770 m 268 701 q 214 671 237 694 q 187 615 187 645 q 265 517 187 563 q 268 701 268 627 m 411 216 q 342 315 411 273 l 338 147 q 411 216 411 170 z \"\n    },\n    \"% \": {\n      \"ha\": 1022,\n      \"x_min\": 32,\n      \"x_max\": 990,\n      \"o\": \"m 990 253 q 933 76 990 153 q 774 -8 871 -8 q 613 76 676 -8 q 555 253 555 153 q 613 431 555 353 q 774 515 677 515 q 933 431 871 515 q 990 253 990 353 m 718 812 q 713 796 718 806 q 533 412 652 669 q 370 -1 479 292 q 356 -20 362 -20 q 321 -4 347 -20 q 296 20 296 12 q 302 40 296 27 q 397 233 342 113 q 489 428 469 388 q 572 627 524 498 q 648 833 610 730 q 662 850 655 850 q 694 836 671 850 q 718 812 718 821 m 467 583 q 410 406 467 483 q 250 322 347 322 q 90 406 153 322 q 32 583 32 483 q 90 761 32 684 q 250 846 153 846 q 410 761 347 846 q 467 583 467 684 m 878 253 q 854 351 878 308 q 774 403 825 403 q 693 351 722 403 q 668 253 668 308 q 694 157 668 201 q 774 104 725 104 q 853 155 824 104 q 878 253 878 198 m 354 583 q 330 682 354 638 q 250 733 301 733 q 170 681 199 733 q 144 583 144 637 q 171 487 144 532 q 250 435 202 435 q 330 486 300 435 q 354 583 354 529 z \"\n    },\n    \"& \": {\n      \"ha\": 956,\n      \"x_min\": 53,\n      \"x_max\": 928,\n      \"o\": \"m 928 113 q 927 90 928 106 q 925 66 925 75 q 926 47 925 60 q 928 28 928 35 q 896 0 928 0 q 842 -1 878 0 q 787 -3 806 -3 q 664 40 731 -3 q 566 129 606 78 q 441 18 496 50 q 279 -24 372 -24 q 113 48 176 -24 q 53 221 53 117 q 116 411 53 333 q 278 538 165 473 q 239 713 239 640 q 299 894 239 827 q 475 962 362 962 q 627 918 565 962 q 697 781 697 867 q 617 610 697 684 q 453 501 574 570 q 578 325 515 398 q 697 451 654 421 q 863 497 763 497 q 901 494 892 497 q 918 464 918 487 q 886 357 918 404 q 825 352 855 354 q 765 338 787 348 q 653 240 699 307 q 750 157 708 178 q 873 132 798 132 q 907 132 907 132 q 928 113 928 129 m 571 777 q 545 840 571 817 q 479 863 519 863 q 367 749 367 863 q 396 600 367 690 q 507 670 479 646 q 571 777 571 721 m 496 212 q 330 433 380 347 q 201 237 201 351 q 233 146 201 182 q 321 109 267 109 q 496 212 404 109 z \"\n    },\n    \"'\": {\n      \"ha\": 239,\n      \"x_min\": 47,\n      \"x_max\": 189,\n      \"o\": \"m 189 850 q 158 642 189 758 q 149 629 157 636 q 122 627 138 627 q 94 629 106 627 q 60 740 75 634 q 47 871 47 824 l 47 932 q 117 951 47 951 q 182 947 168 951 q 189 850 189 945 z \"\n    },\n    \"(\": {\n      \"ha\": 488,\n      \"x_min\": 75,\n      \"x_max\": 492,\n      \"o\": \"m 492 876 q 471 850 492 862 q 323 728 372 794 q 256 566 281 668 q 235 390 235 476 q 260 208 235 308 q 329 40 288 99 q 469 -86 382 -35 q 485 -103 485 -96 q 465 -172 485 -116 q 438 -228 444 -228 q 415 -220 432 -228 q 75 389 75 -50 q 161 739 75 583 q 421 983 254 905 q 442 991 437 991 q 471 939 450 991 q 492 876 492 886 z \"\n    },\n    \")\": {\n      \"ha\": 488,\n      \"x_min\": -5,\n      \"x_max\": 411,\n      \"o\": \"m 411 389 q 71 -220 411 -50 q 48 -228 54 -228 q 22 -172 42 -228 q 1 -103 1 -116 q 17 -86 1 -96 q 157 40 104 -34 q 227 208 199 100 q 252 390 252 308 q 230 566 252 476 q 163 728 205 668 q 16 850 115 794 q -5 876 -5 862 q 16 939 -5 886 q 44 991 37 991 q 65 983 49 991 q 324 739 233 905 q 411 389 411 583 z \"\n    },\n    \"*\": {\n      \"ha\": 494,\n      \"x_min\": 26,\n      \"x_max\": 463,\n      \"o\": \"m 463 724 q 402 674 463 709 q 342 631 342 640 q 368 563 342 620 q 394 483 394 505 q 382 465 394 473 q 360 457 370 457 q 302 509 347 457 q 248 560 257 560 q 198 509 241 560 q 143 457 154 457 q 118 467 130 457 q 107 489 107 477 q 131 564 107 500 q 155 626 155 627 q 91 675 155 640 q 26 727 26 710 q 47 758 26 758 q 110 753 68 758 q 172 749 151 749 q 202 817 194 749 q 212 904 208 860 q 249 921 218 921 q 282 905 277 921 q 292 817 287 861 q 321 750 300 750 q 382 753 341 750 q 444 755 424 755 q 457 744 451 755 q 463 724 463 732 z \"\n    },\n    \"+\": {\n      \"ha\": 561,\n      \"x_min\": 23,\n      \"x_max\": 532,\n      \"o\": \"m 532 467 q 522 354 532 456 q 513 349 520 349 q 424 351 479 349 q 335 353 357 353 q 337 249 335 318 q 339 146 339 180 q 271 119 339 119 q 211 127 226 119 q 204 144 205 132 q 205 248 203 183 q 207 353 207 328 q 121 351 189 353 q 35 349 68 349 q 23 358 23 349 q 29 412 23 363 q 32 471 29 439 q 47 478 37 478 q 207 473 28 478 q 206 574 207 507 q 205 676 205 642 q 218 688 205 688 q 270 689 235 688 q 322 690 305 690 q 339 671 339 690 q 337 572 339 638 q 335 473 335 507 q 427 474 366 473 q 519 475 489 475 q 532 467 532 475 z \"\n    },\n    \",\": {\n      \"ha\": 298,\n      \"x_min\": -5,\n      \"x_max\": 257,\n      \"o\": \"m 257 161 q 233 39 257 92 q 152 -68 218 5 q 54 -149 81 -149 q 22 -117 48 -149 q -5 -78 -5 -86 q 31 -31 -5 -79 q 69 50 66 18 q 69 121 69 45 q 143 167 69 148 q 242 182 202 182 q 257 161 257 182 z \"\n    },\n    \"-\": {\n      \"ha\": 536,\n      \"x_min\": 37,\n      \"x_max\": 500,\n      \"o\": \"m 499 490 l 498 484 q 482 414 492 460 q 473 349 480 391 q 435 340 472 342 q 361 340 409 339 q 304 342 300 342 q 180 334 262 342 q 56 326 97 326 q 37 349 37 326 q 77 478 37 380 q 96 488 80 488 q 165 486 119 488 q 235 484 212 484 q 360 493 277 484 q 485 501 444 501 q 499 490 500 501 z \"\n    },\n    \".\": {\n      \"ha\": 298,\n      \"x_min\": 46,\n      \"x_max\": 253,\n      \"o\": \"m 253 100 q 223 21 253 55 q 149 -12 193 -12 q 75 22 104 -12 q 46 100 46 55 q 75 177 46 145 q 149 210 104 210 q 223 177 193 210 q 253 100 253 144 z \"\n    },\n    \"/\": {\n      \"ha\": 397,\n      \"x_min\": 22,\n      \"x_max\": 375,\n      \"o\": \"m 375 908 q 372 892 375 905 q 248 410 330 731 q 169 87 221 305 q 132 -66 158 35 q 121 -80 127 -80 q 25 -40 31 -44 q 22 -33 22 -39 q 26 -14 22 -26 q 155 484 73 145 q 267 942 191 637 q 277 956 271 956 q 329 935 282 956 q 375 908 375 914 z \"\n    },\n    \":\": {\n      \"ha\": 278,\n      \"x_min\": 46,\n      \"x_max\": 231,\n      \"o\": \"m 231 452 q 203 383 231 411 q 136 355 176 355 q 72 384 98 355 q 46 452 46 412 q 72 520 46 492 q 138 549 98 549 q 204 520 177 549 q 231 452 231 492 m 231 89 q 204 19 231 49 q 138 -11 177 -11 q 72 19 98 -11 q 46 89 46 49 q 72 159 46 132 q 139 186 97 186 q 205 158 179 186 q 231 89 231 130 z \"\n    },\n    \";\": {\n      \"ha\": 278,\n      \"x_min\": -14,\n      \"x_max\": 236,\n      \"o\": \"m 236 452 q 209 382 236 412 q 143 353 182 353 q 78 382 104 353 q 52 452 52 411 q 77 520 52 492 q 143 549 103 549 q 210 520 183 549 q 236 452 236 492 m 231 138 q 136 -75 231 27 q 56 -144 88 -127 q 44 -149 48 -149 q 12 -123 39 -149 q -14 -92 -14 -98 q 22 -43 -14 -88 q 61 41 58 2 q 61 103 61 41 q 78 132 61 125 q 143 146 100 136 q 177 156 146 146 q 212 163 199 163 q 231 138 231 163 z \"\n    },\n    \"<\": {\n      \"ha\": 494,\n      \"x_min\": 36,\n      \"x_max\": 467,\n      \"o\": \"m 467 623 q 460 610 467 618 q 325 494 418 557 q 168 408 238 435 q 152 399 161 406 q 167 389 155 394 q 321 298 238 355 q 456 183 412 235 q 465 167 465 172 q 444 127 465 166 q 421 80 424 87 q 414 73 418 73 q 399 82 410 73 q 234 216 275 185 q 52 323 151 277 q 36 347 36 331 l 36 440 q 54 464 36 457 q 225 564 95 479 q 315 634 260 587 q 404 705 378 686 q 419 713 414 713 q 467 623 430 713 z \"\n    },\n    \"=\": {\n      \"ha\": 606,\n      \"x_min\": 43,\n      \"x_max\": 563,\n      \"o\": \"m 562 569 q 554 465 562 515 q 547 456 553 456 q 413 460 502 456 q 279 464 323 464 q 168 461 242 464 q 57 458 94 458 q 43 473 43 458 q 50 572 43 545 q 64 583 52 583 q 182 580 103 583 q 301 576 262 576 q 426 578 343 576 q 550 581 509 581 q 562 569 562 581 m 563 363 q 555 262 563 354 q 547 255 553 255 l 541 256 q 279 262 404 262 q 168 259 242 262 q 57 256 94 256 q 44 266 44 256 q 50 366 44 341 q 62 375 52 375 q 182 372 102 375 q 301 370 262 370 q 427 372 343 370 q 553 374 511 374 q 563 363 563 374 z \"\n    },\n    \">\": {\n      \"ha\": 494,\n      \"x_min\": 29,\n      \"x_max\": 460,\n      \"o\": \"m 460 347 q 444 323 460 331 q 97 82 271 239 q 82 73 93 77 q 31 167 31 161 q 163 288 31 197 q 329 389 278 367 q 344 399 336 391 q 328 408 340 403 q 36 610 129 494 q 29 623 29 618 q 49 662 29 625 q 71 707 68 699 q 76 714 73 714 q 92 705 79 714 q 271 564 149 656 q 355 509 342 517 q 441 464 410 476 q 460 440 460 457 l 460 347 z \"\n    },\n    \"?\": {\n      \"ha\": 553,\n      \"x_min\": 20,\n      \"x_max\": 524,\n      \"o\": \"m 524 692 q 465 517 524 593 q 354 406 458 509 q 286 288 292 346 q 283 258 285 273 q 264 240 281 246 q 233 233 244 233 q 193 235 199 233 q 176 268 176 241 q 204 397 176 349 q 293 515 249 456 q 346 650 346 585 q 310 751 346 713 q 211 790 273 790 q 99 755 161 790 q 41 720 38 720 q 20 850 20 720 q 40 873 20 859 q 264 947 146 947 q 451 877 378 947 q 524 692 524 806 m 330 77 q 305 10 330 39 q 243 -18 280 -18 q 181 10 206 -18 q 157 77 157 39 q 181 142 157 115 q 243 170 205 170 q 306 142 281 170 q 330 77 330 115 z \"\n    },\n    \"@\": {\n      \"ha\": 863,\n      \"x_min\": 39,\n      \"x_max\": 790,\n      \"o\": \"m 790 510 q 755 347 790 452 q 673 224 715 224 q 610 258 618 224 q 597 285 604 285 q 557 260 598 285 q 476 235 517 235 q 333 301 386 235 q 283 456 283 363 q 338 622 283 556 q 496 692 397 692 q 603 659 553 692 q 654 627 654 627 q 669 647 669 627 q 612 800 669 732 q 469 869 553 869 q 229 742 323 869 q 144 475 144 627 q 228 206 144 318 q 472 82 321 82 q 490 71 490 82 l 490 -7 q 472 -21 490 -21 q 153 132 277 -21 q 39 475 39 275 q 157 811 39 662 q 467 971 284 971 q 725 820 642 971 q 790 510 790 701 m 652 472 q 617 555 652 522 q 532 589 582 589 q 445 553 479 589 q 411 465 411 517 q 435 379 411 415 q 509 337 462 337 q 610 376 568 337 q 652 472 652 415 z \"\n    },\n    \"A\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z \"\n    },\n    \"B\": {\n      \"ha\": 848,\n      \"x_min\": 71,\n      \"x_max\": 803,\n      \"o\": \"m 803 293 q 732 90 803 175 q 541 1 656 1 q 410 3 497 1 q 279 5 323 5 q 183 3 248 5 q 87 0 119 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 269 951 148 951 q 452 950 391 950 q 679 897 594 950 q 782 697 782 833 q 755 600 782 650 q 689 524 728 549 q 669 507 669 511 q 689 492 669 503 q 772 408 741 463 q 803 293 803 353 m 612 682 q 527 811 612 778 q 358 831 475 831 q 244 814 244 831 q 242 747 244 791 q 240 679 240 702 q 241 631 240 663 q 241 582 241 598 q 395 562 241 562 q 612 682 612 562 m 631 300 q 557 412 631 382 q 411 431 510 431 q 240 412 240 431 l 240 301 q 241 227 240 277 q 243 151 243 176 q 286 141 243 144 q 415 138 330 138 q 569 165 522 138 q 631 300 631 202 z \"\n    },\n    \"C\": {\n      \"ha\": 823,\n      \"x_min\": 39,\n      \"x_max\": 819,\n      \"o\": \"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 z \"\n    },\n    \"D\": {\n      \"ha\": 945,\n      \"x_min\": 73,\n      \"x_max\": 905,\n      \"o\": \"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 z \"\n    },\n    \"E\": {\n      \"ha\": 747,\n      \"x_min\": 68,\n      \"x_max\": 713,\n      \"o\": \"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 z \"\n    },\n    \"F\": {\n      \"ha\": 741,\n      \"x_min\": 68,\n      \"x_max\": 722,\n      \"o\": \"m 722 812 q 708 800 722 800 q 534 806 655 800 q 361 810 422 811 l 311 809 q 261 807 264 808 q 248 764 248 802 l 248 601 q 267 555 248 555 q 466 561 333 555 q 664 567 598 567 q 678 556 678 567 q 676 522 678 545 q 675 488 675 499 q 676 451 675 475 q 677 414 677 426 q 663 406 677 406 q 521 408 616 406 q 378 411 426 411 q 279 410 291 411 q 249 385 249 406 q 252 201 249 323 q 256 18 256 79 q 239 -2 256 -2 q 199 1 226 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 15 71 0 q 77 241 71 90 q 83 468 83 393 q 69 922 83 538 l 69 931 q 86 947 68 945 q 172 945 92 947 q 370 945 279 943 q 682 958 492 946 q 711 936 708 960 q 714 880 711 918 q 722 812 722 828 z \"\n    },\n    \"G\": {\n      \"ha\": 937,\n      \"x_min\": 39,\n      \"x_max\": 902,\n      \"o\": \"m 901 33 q 884 18 902 18 q 834 38 873 18 q 785 65 795 57 q 489 -20 660 -20 q 161 130 290 -20 q 39 473 39 271 q 159 822 39 681 q 489 971 286 971 q 690 922 593 971 q 844 787 787 873 q 853 768 853 774 q 805 705 853 758 q 749 652 756 652 q 707 693 743 652 q 625 770 664 743 q 496 811 563 811 q 286 704 368 811 q 211 473 211 606 q 288 244 211 344 q 497 136 371 136 q 725 204 621 136 q 713 333 724 222 q 705 461 705 412 q 720 473 705 473 q 759 471 733 473 q 798 469 785 469 q 837 471 810 469 q 876 472 863 472 q 890 450 890 472 q 889 379 890 427 q 887 307 887 331 q 900 43 887 210 l 901 33 z \"\n    },\n    \"H\": {\n      \"ha\": 994,\n      \"x_min\": 71,\n      \"x_max\": 926,\n      \"o\": \"m 926 16 q 905 0 926 0 q 870 2 894 0 q 833 4 846 4 q 794 2 821 4 q 755 0 768 0 q 740 16 740 0 q 744 199 740 77 q 747 382 747 321 q 732 412 747 408 q 497 418 711 418 q 262 412 283 418 q 248 382 248 408 q 251 202 248 322 q 254 22 254 82 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 201 949 175 947 q 239 951 227 951 q 254 939 254 951 q 249 764 254 881 q 244 589 244 647 q 258 566 244 570 q 497 559 275 559 q 734 566 714 559 q 750 595 750 570 q 746 766 750 652 q 743 938 743 881 q 758 951 743 951 q 796 949 771 951 q 833 947 821 947 q 870 949 846 947 q 907 951 895 951 q 924 937 924 951 q 918 700 924 858 q 911 464 911 543 q 918 240 911 389 q 926 16 926 90 z \"\n    },\n    \"I\": {\n      \"ha\": 329,\n      \"x_min\": 71,\n      \"x_max\": 257,\n      \"o\": \"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 z \"\n    },\n    \"J\": {\n      \"ha\": 371,\n      \"x_min\": 5,\n      \"x_max\": 302,\n      \"o\": \"m 302 937 q 297 737 302 870 q 292 537 292 604 q 292 441 292 505 q 293 345 293 377 q 266 104 293 197 q 135 -96 229 -20 q 117 -106 122 -106 q 106 -98 112 -106 q 11 -1 58 -44 q 5 9 5 4 q 12 21 5 14 q 75 81 58 61 q 113 160 100 113 q 130 417 130 222 l 129 519 q 121 725 129 583 q 113 930 113 861 q 132 950 113 950 q 171 948 145 950 q 210 946 197 946 q 248 948 222 946 q 285 950 273 950 q 302 937 302 950 z \"\n    },\n    \"K\": {\n      \"ha\": 828,\n      \"x_min\": 71,\n      \"x_max\": 821,\n      \"o\": \"m 821 32 q 802 0 821 0 l 646 0 q 543 144 626 0 q 450 321 473 267 q 424 379 427 373 q 376 415 404 413 q 331 416 368 416 q 245 395 245 416 q 250 208 245 332 q 254 22 254 84 q 237 0 254 0 q 199 2 224 0 q 160 4 173 4 q 124 2 148 4 q 87 0 100 0 q 71 16 71 0 q 78 240 71 90 q 85 464 85 389 q 78 700 85 543 q 71 937 71 858 q 87 951 71 951 q 125 949 100 951 q 163 947 150 947 q 199 949 175 947 q 236 951 224 951 q 252 939 252 951 q 248 766 252 882 q 244 591 244 650 q 248 558 244 565 q 275 546 253 546 q 468 595 407 546 q 567 754 520 638 q 635 936 601 845 q 656 951 640 947 q 728 954 667 954 q 802 933 802 954 q 771 823 802 921 q 676 623 734 709 q 574 504 637 564 q 557 478 557 490 q 612 357 557 466 q 699 205 660 262 q 818 45 741 153 q 821 32 821 39 z \"\n    },\n    \"L\": {\n      \"ha\": 718,\n      \"x_min\": 71,\n      \"x_max\": 710,\n      \"o\": \"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 z \"\n    },\n    \"M\": {\n      \"ha\": 1097,\n      \"x_min\": 71,\n      \"x_max\": 1024,\n      \"o\": \"m 1024 17 q 1007 0 1024 0 q 970 2 995 0 q 933 4 945 4 q 896 2 921 4 q 859 0 871 0 q 842 22 842 0 q 847 281 842 109 q 852 539 852 453 q 847 552 852 552 q 838 545 841 552 q 674 150 803 471 q 614 -4 653 88 q 565 -13 609 -13 q 494 -1 501 -13 q 429 153 471 54 q 256 553 372 287 q 247 562 254 557 q 241 547 241 558 q 244 285 241 460 q 248 22 248 110 q 231 0 248 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 13 71 0 q 78 238 71 88 q 85 464 85 389 q 78 698 85 542 q 71 932 71 854 q 86 947 71 945 q 225 960 178 960 q 244 932 232 960 q 526 288 408 571 q 559 221 554 221 q 589 275 566 221 q 844 928 681 495 q 867 954 854 954 q 936 951 890 954 q 1006 949 983 949 q 1023 932 1023 949 q 1018 698 1023 854 q 1013 464 1013 542 q 1018 240 1013 389 q 1024 17 1024 91 z \"\n    },\n    \"N\": {\n      \"ha\": 997,\n      \"x_min\": 71,\n      \"x_max\": 924,\n      \"o\": \"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 z \"\n    },\n    \"O\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z \"\n    },\n    \"P\": {\n      \"ha\": 867,\n      \"x_min\": 68,\n      \"x_max\": 839,\n      \"o\": \"m 839 600 q 753 345 839 441 q 507 247 664 247 q 390 250 468 247 q 272 253 311 253 q 250 225 250 253 q 255 117 250 189 q 259 9 259 45 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 680 l 68 932 q 86 947 68 947 q 196 947 123 947 q 307 946 270 946 q 403 949 339 946 q 498 951 467 951 q 745 850 648 951 q 839 600 839 750 m 668 590 q 613 753 668 692 q 456 817 556 817 q 345 811 425 817 q 250 800 253 806 q 245 567 245 792 q 247 481 245 538 q 249 396 249 425 q 264 387 249 390 q 471 379 301 379 q 618 438 566 379 q 668 590 668 494 z \"\n    },\n    \"Q\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 478 q 859 159 966 298 q 571 -8 745 14 q 660 -144 596 -83 q 664 -153 664 -149 q 618 -175 664 -172 q 557 -175 618 -175 q 463 -172 475 -175 q 424 -7 428 -164 q 145 165 251 27 q 41 478 41 300 q 172 823 41 677 q 504 974 307 974 q 836 823 701 974 q 966 478 966 677 m 804 478 q 721 709 804 611 q 503 811 633 811 q 286 707 374 811 q 204 476 204 608 q 286 245 204 345 q 503 140 373 140 q 722 245 634 140 q 804 478 804 344 z \"\n    },\n    \"R\": {\n      \"ha\": 825,\n      \"x_min\": 68,\n      \"x_max\": 804,\n      \"o\": \"m 804 5 q 793 0 804 0 q 753 2 780 0 q 714 4 727 4 q 672 2 700 4 q 629 0 644 0 q 606 17 614 0 q 482 302 584 63 q 433 332 472 327 q 371 333 424 333 q 260 330 277 333 q 245 296 245 328 q 250 154 245 248 q 254 12 254 59 q 241 -2 254 -2 q 200 1 227 -2 q 158 4 172 4 q 123 2 146 4 q 87 0 99 0 q 71 16 71 0 q 78 242 71 91 q 85 468 85 393 q 69 925 85 682 l 68 936 q 97 949 68 949 q 272 952 155 949 q 446 956 388 956 q 687 884 596 956 q 787 659 787 804 q 760 500 787 558 q 654 385 732 439 q 642 368 642 376 q 723 187 642 358 q 804 5 804 16 m 618 621 q 547 785 618 743 q 359 815 495 815 q 248 798 250 815 q 243 602 243 761 l 243 472 q 252 469 245 471 q 292 466 264 468 q 431 463 356 463 q 618 621 618 463 z \"\n    },\n    \"S\": {\n      \"ha\": 648,\n      \"x_min\": 75,\n      \"x_max\": 614,\n      \"o\": \"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 z \"\n    },\n    \"T\": {\n      \"ha\": 713,\n      \"x_min\": 9,\n      \"x_max\": 701,\n      \"o\": \"m 701 823 q 689 806 701 806 q 449 814 670 806 q 443 482 443 607 q 449 248 443 404 q 454 14 454 92 q 435 0 454 0 q 397 2 422 0 q 359 4 372 4 q 322 2 347 4 q 285 0 297 0 q 268 17 268 0 q 274 249 268 94 q 281 482 281 404 q 273 814 281 603 q 17 803 98 803 q 9 810 9 803 q 15 845 9 822 q 24 880 22 875 q 33 946 25 904 q 45 955 37 955 l 53 954 q 370 940 293 940 q 591 950 437 940 q 679 957 696 957 q 699 945 696 957 q 697 879 697 952 q 699 851 697 870 q 701 823 701 833 z \"\n    },\n    \"U\": {\n      \"ha\": 917,\n      \"x_min\": 68,\n      \"x_max\": 848,\n      \"o\": \"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 z \"\n    },\n    \"V\": {\n      \"ha\": 860,\n      \"x_min\": 41,\n      \"x_max\": 818,\n      \"o\": \"m 818 612 q 685 333 818 584 q 517 20 601 176 q 494 0 507 0 l 358 0 q 339 20 349 0 q 178 323 337 24 q 41 604 41 581 q 45 765 41 658 q 49 926 49 873 q 65 951 49 951 q 103 949 78 951 q 140 947 127 947 q 178 949 153 947 q 215 951 203 951 q 231 939 231 951 q 223 773 231 884 q 216 607 216 663 q 427 196 216 561 q 547 414 482 291 q 642 623 642 591 q 638 781 642 675 q 635 938 635 886 q 650 951 635 951 q 688 949 663 951 q 725 947 713 947 q 762 949 737 947 q 799 951 787 951 q 816 939 814 951 q 815 913 815 943 q 817 763 815 863 q 818 612 818 663 z \"\n    },\n    \"W\": {\n      \"ha\": 1239,\n      \"x_min\": 41,\n      \"x_max\": 1198,\n      \"o\": \"m 1198 604 q 1063 314 1198 599 q 924 18 1017 215 q 905 0 915 0 l 783 0 q 762 18 770 0 q 618 390 712 136 q 472 18 571 265 q 452 0 465 0 l 330 0 q 311 18 320 0 q 171 314 264 117 q 41 604 41 584 q 45 772 41 660 q 48 939 48 884 q 65 951 48 951 q 102 949 77 951 q 139 947 127 947 q 174 949 151 947 q 208 950 197 950 q 222 940 222 950 q 216 774 222 885 q 210 608 210 663 q 347 295 210 574 q 396 203 392 203 q 399 208 397 203 q 434 294 408 223 q 534 595 483 427 q 536 702 536 612 q 534 822 536 742 q 532 941 532 901 q 546 951 532 951 q 585 949 559 951 q 624 947 610 947 q 659 949 635 947 q 693 951 682 951 q 709 941 709 951 q 706 812 709 898 q 703 684 703 726 q 704 599 703 614 q 806 301 706 565 q 842 216 817 271 q 844 211 842 213 q 892 301 848 211 q 1026 610 1026 574 q 1020 776 1026 665 q 1014 941 1014 886 q 1019 951 1014 951 q 1060 949 1033 951 q 1100 947 1086 947 q 1137 949 1112 947 q 1175 951 1162 951 q 1192 943 1190 951 q 1192 924 1192 944 q 1195 764 1192 871 q 1198 604 1198 658 z \"\n    },\n    \"X\": {\n      \"ha\": 796,\n      \"x_min\": 39,\n      \"x_max\": 761,\n      \"o\": \"m 761 8 q 746 0 761 0 l 637 -1 q 628 0 629 -1 q 511 169 618 3 q 401 335 404 334 q 281 161 389 326 q 167 0 177 0 l 54 0 q 39 11 39 0 l 39 109 q 166 291 39 121 q 294 473 294 460 q 167 659 294 488 q 40 840 40 830 l 40 945 q 58 954 40 954 q 115 953 77 954 q 172 951 153 951 q 197 920 176 951 q 390 621 261 820 q 401 610 393 616 q 519 785 411 615 q 635 951 625 951 l 742 951 q 760 942 760 951 l 760 838 q 633 652 760 821 q 507 475 507 484 q 634 291 507 465 q 761 106 761 118 l 761 8 z \"\n    },\n    \"Y\": {\n      \"ha\": 815,\n      \"x_min\": 24,\n      \"x_max\": 794,\n      \"o\": \"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 z \"\n    },\n    \"Z\": {\n      \"ha\": 701,\n      \"x_min\": 26,\n      \"x_max\": 662,\n      \"o\": \"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 z \"\n    },\n    \"[\": {\n      \"ha\": 498,\n      \"x_min\": 86,\n      \"x_max\": 481,\n      \"o\": \"m 481 -118 q 479 -161 481 -132 q 478 -203 478 -190 q 464 -216 478 -216 q 370 -214 433 -216 q 277 -211 308 -211 q 193 -213 249 -211 q 110 -215 138 -215 q 90 -189 90 -215 q 97 73 90 -102 q 103 336 103 248 q 95 635 103 435 q 86 934 86 834 q 107 960 86 960 q 192 958 135 960 q 277 956 248 956 q 370 958 308 956 q 464 960 433 960 q 479 946 479 960 q 480 906 479 932 q 481 865 481 879 q 467 850 481 850 q 382 854 439 850 q 296 859 325 859 q 281 859 285 859 q 261 835 263 856 q 254 637 259 811 q 249 336 249 404 q 252 64 249 230 q 258 -93 253 12 q 269 -115 260 -111 q 294 -117 273 -117 q 381 -112 323 -117 q 467 -107 438 -107 q 481 -118 481 -107 z \"\n    },\n    \"\\\\\": {\n      \"ha\": 397,\n      \"x_min\": 26,\n      \"x_max\": 370,\n      \"o\": \"m 370 -22 q 331 -56 370 -35 q 281 -75 295 -75 l 273 -75 q 221 97 258 -42 q 103 564 206 153 q 26 895 74 674 q 68 929 34 907 q 115 950 102 951 l 122 950 q 256 454 144 891 q 370 -22 370 14 z \"\n    },\n    \"]\": {\n      \"ha\": 498,\n      \"x_min\": 18,\n      \"x_max\": 412,\n      \"o\": \"m 412 934 q 404 635 412 834 q 396 336 396 435 q 402 73 396 248 q 408 -189 408 -102 q 389 -215 408 -215 q 306 -213 361 -215 q 222 -211 250 -211 q 129 -214 191 -211 q 35 -216 66 -216 q 21 -203 21 -216 q 20 -161 21 -190 q 18 -118 18 -132 q 32 -107 18 -107 q 118 -112 60 -107 q 205 -117 176 -117 q 221 -117 217 -117 q 240 -93 238 -114 q 246 64 243 -66 q 250 336 250 230 q 244 637 250 404 q 237 835 244 703 q 227 857 236 852 q 202 859 223 859 q 117 854 174 859 q 32 850 60 850 q 18 865 18 850 q 19 906 18 879 q 20 946 20 932 q 35 960 20 960 q 129 958 66 960 q 222 956 191 956 q 307 958 250 956 q 392 960 363 960 q 412 934 412 960 z \"\n    },\n    \"^\": {\n      \"ha\": 648,\n      \"x_min\": 26,\n      \"x_max\": 618,\n      \"o\": \"m 618 246 q 570 218 616 240 q 541 201 566 216 q 517 187 519 187 q 317 450 494 187 q 224 313 312 445 q 125 193 144 193 q 72 225 129 193 q 26 252 26 250 q 174 478 94 353 q 257 675 214 550 q 266 688 261 688 l 373 688 q 382 675 378 688 q 463 485 404 591 q 618 246 474 464 z \"\n    },\n    \"_\": {\n      \"ha\": 604,\n      \"x_min\": -14,\n      \"x_max\": 609,\n      \"o\": \"m 609 -159 q 604 -271 609 -246 q 587 -282 602 -282 q 431 -279 535 -282 q 273 -275 326 -275 q 139 -279 229 -275 q 4 -282 49 -282 q -14 -267 -14 -282 q -7 -160 -14 -211 q 4 -147 -5 -147 q 151 -151 53 -147 q 298 -154 250 -154 q 449 -152 349 -154 q 599 -150 549 -150 q 609 -159 609 -150 z \"\n    },\n    \"`\": {\n      \"ha\": 485,\n      \"x_min\": 36,\n      \"x_max\": 392,\n      \"o\": \"m 391 809 q 381 774 391 803 q 368 745 372 745 q 357 744 353 745 q 43 907 119 855 q 36 915 40 909 q 76 957 42 927 q 120 987 109 987 q 245 918 136 987 q 387 822 345 855 q 391 809 392 818 z \"\n    },\n    \"a\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 z \"\n    },\n    \"b\": {\n      \"ha\": 770,\n      \"x_min\": 50,\n      \"x_max\": 742,\n      \"o\": \"m 742 328 q 659 94 742 193 q 437 -12 570 -12 q 282 33 349 -12 q 228 78 255 56 q 218 37 220 76 q 207 -1 216 -1 l 64 -1 q 56 7 56 -1 q 57 20 56 7 q 68 435 68 128 q 57 803 68 560 q 50 939 50 958 q 68 958 50 956 q 140 961 92 959 q 179 966 150 962 q 218 970 203 970 q 229 954 229 970 q 226 884 229 931 q 222 812 222 836 q 219 706 222 777 q 216 600 216 635 q 226 574 216 574 q 236 582 231 574 q 433 675 311 675 q 661 570 574 675 q 742 328 742 471 m 589 334 q 538 476 589 414 q 404 542 484 542 q 269 477 323 542 q 216 334 216 416 q 269 189 216 250 q 406 125 323 125 q 539 191 486 125 q 589 334 589 252 z \"\n    },\n    \"c\": {\n      \"ha\": 558,\n      \"x_min\": 26,\n      \"x_max\": 543,\n      \"o\": \"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 z \"\n    },\n    \"d\": {\n      \"ha\": 772,\n      \"x_min\": 28,\n      \"x_max\": 721,\n      \"o\": \"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 z \"\n    },\n    \"e\": {\n      \"ha\": 669,\n      \"x_min\": 26,\n      \"x_max\": 644,\n      \"o\": \"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 z \"\n    },\n    \"f\": {\n      \"ha\": 408,\n      \"x_min\": 12,\n      \"x_max\": 419,\n      \"o\": \"m 419 869 q 407 860 419 861 q 341 854 374 857 q 282 827 302 848 q 249 644 249 791 q 319 643 271 644 q 392 642 368 642 q 408 629 408 642 q 410 573 408 610 q 411 517 411 535 q 397 504 411 504 q 326 506 374 504 q 254 509 277 509 l 254 306 q 258 162 254 258 q 261 18 261 66 q 248 0 261 0 l 123 0 q 106 21 106 0 l 106 488 q 64 505 106 506 q 17 509 20 505 q 15 534 15 511 q 14 578 15 549 q 12 623 12 608 q 98 642 12 637 q 96 712 96 685 q 139 888 96 832 q 250 966 177 938 q 387 992 316 992 q 396 985 393 992 q 408 927 397 983 q 419 869 419 871 z \"\n    },\n    \"g\": {\n      \"ha\": 722,\n      \"x_min\": 26,\n      \"x_max\": 667,\n      \"o\": \"m 667 632 q 665 388 667 551 q 664 143 664 224 q 595 -95 664 -18 q 363 -176 522 -176 q 114 -118 209 -176 q 99 -102 99 -109 q 119 -1 99 -109 q 129 10 121 10 q 138 7 132 10 q 342 -52 239 -52 q 453 -22 409 -52 q 504 77 504 12 q 501 140 504 91 q 310 49 426 49 q 104 139 184 49 q 26 353 26 226 q 101 572 26 481 q 307 668 180 668 q 485 582 419 668 q 500 568 496 568 q 506 580 506 568 q 505 608 506 589 q 503 637 503 627 q 511 677 503 677 q 585 665 518 677 q 657 650 651 652 q 667 632 667 646 m 504 353 q 463 481 504 429 q 343 539 417 539 q 224 481 270 539 q 183 353 183 428 q 225 225 183 279 q 343 167 271 167 q 461 225 415 167 q 504 353 504 279 z \"\n    },\n    \"h\": {\n      \"ha\": 722,\n      \"x_min\": 47,\n      \"x_max\": 661,\n      \"o\": \"m 661 24 q 647 -1 661 -1 q 583 -1 626 -1 q 519 0 541 0 q 503 22 503 0 q 505 121 503 55 q 507 220 507 186 q 505 314 507 251 q 503 410 503 378 q 387 532 503 532 q 290 494 350 532 q 225 421 225 454 l 225 18 q 211 -1 225 -1 q 148 -1 190 -1 q 85 0 106 0 q 69 18 69 0 l 69 346 q 60 686 69 426 q 49 925 59 767 q 47 936 47 933 q 56 950 47 947 q 132 954 67 954 q 175 959 146 954 q 216 964 203 964 q 225 951 225 964 q 220 760 225 888 q 215 568 215 632 q 220 552 215 553 q 310 623 255 581 q 450 664 376 664 q 626 588 578 664 q 661 412 661 532 q 660 347 661 391 q 659 282 659 303 q 660 153 659 239 q 661 24 661 66 z \"\n    },\n    \"i\": {\n      \"ha\": 306,\n      \"x_min\": 58,\n      \"x_max\": 245,\n      \"o\": \"m 245 811 q 153 728 245 728 q 58 811 58 728 q 87 873 58 848 q 153 896 115 896 q 218 872 191 896 q 245 811 245 848 m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z \"\n    },\n    \"j\": {\n      \"ha\": 307,\n      \"x_min\": -31,\n      \"x_max\": 250,\n      \"o\": \"m 250 812 q 155 730 250 730 q 90 751 115 730 q 61 812 61 773 q 90 875 61 850 q 155 897 117 897 q 221 875 194 897 q 250 812 250 850 m 241 629 q 237 495 241 585 q 233 359 233 405 q 235 211 233 310 q 236 61 236 111 q 60 -185 236 -134 q -14 -200 9 -200 q -27 -186 -24 -200 q -28 -157 -30 -176 q -26 -135 -26 -132 q -29 -108 -26 -126 q -31 -82 -31 -90 q -22 -68 -31 -70 q 64 -37 45 -56 q 87 54 87 -14 q 85 200 87 103 q 82 346 82 297 q 66 615 82 442 l 66 623 q 78 635 66 632 q 152 642 82 636 q 231 647 222 647 q 241 629 241 647 z \"\n    },\n    \"k\": {\n      \"ha\": 760,\n      \"x_min\": 68,\n      \"x_max\": 736,\n      \"o\": \"m 736 465 q 572 229 736 289 q 640 104 572 195 q 708 14 708 14 q 640 0 708 3 q 573 -2 595 -2 q 513 18 525 -2 q 412 176 481 73 q 265 186 404 189 l 239 186 l 239 18 q 224 -3 239 -3 q 160 -2 202 -3 q 96 -1 117 -1 q 81 25 81 -1 l 81 447 q 74 694 81 530 q 68 942 68 859 q 81 956 68 954 q 149 958 103 956 q 189 963 158 959 q 228 966 213 966 q 237 950 237 966 q 234 841 237 913 q 231 732 231 768 l 231 557 q 237 543 231 543 q 286 583 253 556 q 503 671 399 671 q 667 619 603 671 q 736 465 736 563 m 572 433 q 447 530 572 530 q 236 406 353 530 l 236 304 q 369 294 291 294 q 503 324 448 294 q 572 433 572 361 z \"\n    },\n    \"l\": {\n      \"ha\": 306,\n      \"x_min\": 66,\n      \"x_max\": 241,\n      \"o\": \"m 241 941 l 240 932 q 225 498 225 680 q 228 257 225 418 q 231 16 231 96 q 220 0 231 0 l 90 0 q 78 16 78 0 q 79 257 78 96 q 81 498 81 418 q 74 719 81 572 q 66 938 66 865 q 81 951 66 951 q 117 949 93 951 q 154 947 142 947 q 192 949 167 947 q 229 951 217 951 q 241 941 241 951 z \"\n    },\n    \"m\": {\n      \"ha\": 1165,\n      \"x_min\": 47,\n      \"x_max\": 1100,\n      \"o\": \"m 1100 25 q 1084 -1 1100 -1 q 1054 1 1074 -1 q 1022 3 1033 3 q 987 1 1010 3 q 953 0 964 0 q 939 32 939 0 q 941 125 939 63 q 943 218 943 187 q 942 410 943 390 q 913 506 937 479 q 819 534 887 534 q 723 494 777 534 q 665 410 667 451 q 663 216 663 357 q 665 117 663 183 q 668 17 668 50 q 656 -1 668 -1 q 620 1 644 -1 q 585 3 597 3 q 553 1 574 3 q 521 0 532 0 q 507 20 507 0 q 509 118 507 52 q 511 216 511 183 l 511 379 q 493 488 511 456 q 395 534 467 534 q 293 498 352 534 q 228 419 228 459 l 228 221 q 229 120 228 187 q 229 20 229 53 q 214 0 229 0 l 87 0 q 74 18 74 0 q 75 183 74 73 q 75 349 75 294 q 49 596 75 473 q 47 610 47 605 q 53 621 47 619 q 126 631 78 623 q 193 646 149 637 l 199 646 q 214 598 207 646 q 227 551 221 551 q 260 581 227 551 q 340 635 300 615 q 456 665 398 665 q 654 538 612 665 q 759 627 696 592 q 890 665 825 665 q 1064 592 1016 665 q 1099 420 1099 538 q 1097 351 1099 398 q 1096 282 1096 304 q 1098 154 1096 239 q 1100 25 1100 68 z \"\n    },\n    \"n\": {\n      \"ha\": 726,\n      \"x_min\": 43,\n      \"x_max\": 667,\n      \"o\": \"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 z \"\n    },\n    \"o\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 z \"\n    },\n    \"p\": {\n      \"ha\": 783,\n      \"x_min\": 50,\n      \"x_max\": 747,\n      \"o\": \"m 747 326 q 661 88 747 189 q 435 -18 570 -18 q 288 34 351 -18 q 231 87 259 60 q 225 77 227 85 q 224 1 224 73 l 224 -191 q 208 -212 224 -212 q 85 -210 104 -212 q 69 -192 69 -208 q 71 68 69 -105 q 72 329 72 242 q 52 628 72 488 q 50 639 50 636 q 57 648 50 646 q 132 656 83 650 q 207 668 199 668 q 222 627 218 668 q 225 574 224 600 q 229 563 225 568 q 240 572 234 566 q 432 669 335 669 q 659 564 566 669 q 747 326 747 463 m 589 329 q 538 472 589 410 q 404 538 484 538 q 275 470 326 538 q 229 328 229 409 q 277 184 229 245 q 410 118 329 118 q 540 186 487 118 q 589 329 589 250 z \"\n    },\n    \"q\": {\n      \"ha\": 778,\n      \"x_min\": 37,\n      \"x_max\": 728,\n      \"o\": \"m 728 642 q 726 629 728 640 q 701 241 701 500 q 706 27 701 170 q 710 -187 710 -116 q 696 -204 710 -204 q 629 -207 673 -204 q 563 -209 585 -209 q 555 -193 555 -209 l 555 75 q 551 86 555 86 q 538 75 545 83 q 340 -17 460 -17 q 121 92 210 -17 q 37 326 37 193 q 118 566 37 466 q 340 673 204 673 q 502 624 437 673 q 555 572 528 598 q 559 663 559 574 q 571 669 559 669 q 720 652 626 669 q 728 642 728 650 m 557 330 q 510 477 557 417 q 375 542 459 542 q 241 477 294 542 q 191 334 191 416 q 242 189 191 249 q 379 125 296 125 q 513 186 464 125 q 557 330 557 243 z \"\n    },\n    \"r\": {\n      \"ha\": 463,\n      \"x_min\": 41,\n      \"x_max\": 457,\n      \"o\": \"m 457 637 q 447 501 457 562 q 433 486 445 486 q 390 489 419 486 q 347 492 361 492 q 237 444 261 492 q 223 322 223 414 l 223 248 q 226 132 223 210 q 229 17 229 55 q 214 -1 229 -1 q 150 -1 193 -1 q 86 0 107 0 q 71 17 71 0 q 72 182 71 72 q 74 349 74 293 q 43 618 74 516 q 41 626 41 623 q 50 637 41 634 q 121 646 75 640 q 189 659 194 659 q 203 619 199 659 q 215 579 206 579 q 218 581 216 579 q 274 616 246 598 q 336 643 304 634 q 404 651 363 651 q 457 637 457 651 z \"\n    },\n    \"s\": {\n      \"ha\": 415,\n      \"x_min\": 31,\n      \"x_max\": 387,\n      \"o\": \"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 z \"\n    },\n    \"t\": {\n      \"ha\": 475,\n      \"x_min\": 5,\n      \"x_max\": 447,\n      \"o\": \"m 447 125 q 444 84 447 110 q 440 43 441 52 q 438 28 439 31 q 425 18 435 23 q 250 -8 370 -8 q 92 136 92 -8 q 94 309 92 193 q 97 482 97 425 q 69 512 97 510 q 20 513 44 512 q 5 568 5 516 q 8 610 5 588 q 30 629 10 626 q 63 630 47 629 q 94 658 94 631 q 93 741 94 685 q 91 824 91 796 q 110 873 91 873 q 237 852 116 873 q 253 838 253 850 q 249 748 253 808 q 244 659 244 688 q 262 639 244 639 l 425 639 q 437 631 437 639 q 434 605 437 623 q 432 578 432 587 q 433 547 432 568 q 433 515 433 526 q 414 503 433 503 q 332 506 387 503 q 250 510 277 510 q 242 471 245 510 q 239 336 239 423 l 239 235 q 250 154 239 177 q 317 119 266 119 q 378 128 338 119 q 439 137 419 137 q 447 125 447 137 z \"\n    },\n    \"u\": {\n      \"ha\": 766,\n      \"x_min\": 65,\n      \"x_max\": 697,\n      \"o\": \"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 z \"\n    },\n    \"v\": {\n      \"ha\": 703,\n      \"x_min\": 45,\n      \"x_max\": 654,\n      \"o\": \"m 654 449 q 648 338 654 353 q 538 159 638 307 q 416 0 436 8 q 359 -4 407 -4 q 300 0 314 -4 q 176 153 281 6 q 61 328 73 296 q 45 460 45 370 q 46 543 45 488 q 47 627 47 599 q 62 642 47 642 q 129 640 85 642 q 196 637 174 637 q 208 624 208 637 q 205 560 208 602 q 203 496 203 517 q 210 382 203 433 q 278 256 213 356 q 359 155 344 155 q 433 254 374 155 q 496 375 492 350 q 501 492 501 409 q 497 559 501 514 q 492 626 492 604 q 503 636 492 636 q 568 638 525 636 q 633 641 612 641 q 654 449 654 641 z \"\n    },\n    \"w\": {\n      \"ha\": 1013,\n      \"x_min\": 35,\n      \"x_max\": 979,\n      \"o\": \"m 979 486 q 965 326 979 359 q 865 148 946 281 q 758 -1 777 3 q 704 -3 753 -3 q 665 -1 671 -3 q 504 232 644 4 q 426 104 465 168 q 345 -1 362 3 q 300 -3 339 -3 q 254 -1 260 -3 q 148 146 233 3 q 50 326 67 281 q 35 486 35 367 q 41 623 35 586 q 58 637 45 637 q 119 636 79 637 q 180 635 160 635 q 193 614 193 635 q 192 569 193 599 q 191 524 191 538 q 197 357 191 406 q 304 178 203 314 q 318 161 316 161 q 330 176 320 161 q 431 351 418 304 q 439 497 439 384 q 436 566 439 520 q 433 633 433 611 q 446 648 433 648 l 575 648 q 586 631 586 648 q 584 565 586 609 q 582 500 582 522 q 586 361 582 380 q 650 255 590 342 q 718 167 709 167 q 730 183 720 167 q 823 358 817 314 q 829 482 829 395 q 825 556 829 508 q 821 626 821 605 q 835 636 821 636 q 895 637 855 636 q 956 639 935 639 q 974 625 970 639 q 979 486 979 599 z \"\n    },\n    \"x\": {\n      \"ha\": 603,\n      \"x_min\": 26,\n      \"x_max\": 578,\n      \"o\": \"m 578 12 q 564 -1 578 3 q 534 -1 553 -3 q 510 0 507 0 q 446 12 456 0 q 319 193 404 74 q 301 215 303 215 q 225 111 295 215 q 139 3 154 5 q 43 0 124 0 q 26 12 26 0 l 26 86 q 117 203 26 94 q 207 323 207 312 q 117 441 207 333 q 26 561 26 550 l 26 633 q 43 647 26 647 q 94 644 60 647 q 144 642 127 642 q 161 632 154 642 q 283 450 201 570 q 301 428 300 428 q 316 446 303 428 q 446 635 355 499 q 461 644 452 644 q 511 646 478 644 q 561 647 545 647 q 578 633 578 647 l 578 562 q 487 441 578 550 q 397 322 397 333 q 487 206 397 315 q 578 85 578 97 l 578 12 z \"\n    },\n    \"y\": {\n      \"ha\": 661,\n      \"x_min\": 24,\n      \"x_max\": 640,\n      \"o\": \"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 z \"\n    },\n    \"z\": {\n      \"ha\": 585,\n      \"x_min\": 21,\n      \"x_max\": 572,\n      \"o\": \"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 z \"\n    },\n    \"{\": {\n      \"ha\": 473,\n      \"x_min\": 33,\n      \"x_max\": 457,\n      \"o\": \"m 457 -204 q 447 -210 457 -207 q 336 -221 410 -221 q 179 -198 231 -221 q 102 -71 102 -163 q 123 31 102 -37 q 151 136 148 105 q 155 201 155 174 q 114 298 155 276 q 46 315 83 315 q 33 329 33 315 q 36 351 33 336 q 39 372 39 365 q 36 393 39 379 q 33 414 33 407 q 62 431 33 425 q 114 444 102 437 q 155 544 155 469 q 128 681 155 591 q 102 814 102 770 q 179 941 102 906 q 336 964 231 964 q 447 954 422 964 q 457 940 457 950 q 454 894 457 926 q 450 846 450 863 q 437 833 450 833 q 383 840 425 833 q 318 847 341 847 q 258 791 258 847 q 277 685 258 755 q 297 579 297 615 q 263 438 297 492 q 140 372 222 372 q 297 174 297 372 q 277 57 297 135 q 257 -56 257 -22 q 326 -111 257 -111 q 437 -93 376 -111 q 444 -92 441 -92 q 452 -106 450 -92 q 453 -135 454 -117 q 452 -157 452 -159 q 454 -180 452 -165 q 457 -204 457 -196 z \"\n    },\n    \"|\": {\n      \"ha\": 340,\n      \"x_min\": 107,\n      \"x_max\": 232,\n      \"o\": \"m 232 -64 q 224 -79 232 -77 q 119 -95 150 -95 q 114 -82 114 -95 l 114 439 q 111 685 114 521 q 107 930 107 849 q 181 963 107 965 l 211 962 q 225 945 224 962 q 225 873 227 918 q 223 802 223 813 l 224 456 q 228 196 224 380 q 232 -64 232 25 z \"\n    },\n    \"}\": {\n      \"ha\": 473,\n      \"x_min\": 21,\n      \"x_max\": 444,\n      \"o\": \"m 444 329 q 432 315 444 315 q 364 298 394 315 q 323 201 323 276 q 326 136 323 174 q 354 31 330 105 q 376 -71 376 -37 q 298 -198 376 -163 q 142 -221 247 -221 q 31 -210 68 -221 q 21 -204 21 -207 q 24 -180 21 -196 q 26 -157 26 -165 q 26 -131 26 -148 q 25 -104 25 -113 q 34 -92 25 -92 q 40 -93 35 -92 q 151 -111 117 -111 q 220 -56 220 -111 q 200 57 220 -22 q 180 174 180 135 q 338 372 180 372 q 215 438 256 372 q 180 579 180 492 q 200 685 180 615 q 220 791 220 755 q 160 847 220 847 q 95 840 137 847 q 40 833 54 833 q 28 846 28 833 q 24 894 28 863 q 21 940 21 926 q 31 954 21 950 q 142 964 56 964 q 298 941 246 964 q 376 814 376 906 q 350 681 376 770 q 323 544 323 591 q 364 444 323 469 q 415 431 376 437 q 444 414 444 425 q 441 393 444 407 q 439 372 439 379 q 441 351 439 365 q 444 329 444 336 z \"\n    },\n    \"~\": {\n      \"ha\": 676,\n      \"x_min\": 22,\n      \"x_max\": 665,\n      \"o\": \"m 665 419 q 570 350 665 405 q 440 309 496 309 q 342 334 398 309 q 258 359 286 359 q 177 325 232 359 q 119 290 123 290 q 77 336 115 290 q 27 390 33 385 q 22 399 22 395 q 125 472 22 411 q 246 515 197 515 q 334 488 284 515 q 416 461 384 461 q 515 498 454 461 q 576 535 576 535 q 624 480 582 535 q 665 419 665 426 z \"\n    },\n    \"Ä\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 668 1017 q 644 1005 668 1005 q 583 1004 623 1005 q 524 1004 543 1004 q 507 1023 507 1004 l 506 1161 q 519 1178 506 1178 q 555 1176 531 1178 q 591 1174 579 1174 q 621 1175 602 1174 q 650 1175 641 1175 q 667 1164 667 1175 q 664 1126 667 1152 q 661 1088 661 1101 q 665 1052 661 1076 q 668 1017 668 1028 m 391 1013 q 371 1004 391 1006 q 332 1004 357 1002 q 304 1006 302 1006 q 273 1004 294 1006 q 242 1003 252 1003 q 229 1016 229 1003 q 231 1048 229 1027 q 232 1080 232 1069 q 230 1121 232 1093 q 228 1162 228 1148 q 244 1177 228 1177 q 306 1176 264 1177 q 369 1175 348 1175 q 389 1161 389 1175 q 387 1124 389 1149 q 385 1086 385 1099 q 388 1050 385 1074 q 391 1013 391 1025 z \"\n    },\n    \"Å\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 721 0 q 632 207 663 205 q 493 208 608 208 l 399 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 310 819 231 606 q 267 930 267 873 q 320 1058 267 1006 q 449 1111 373 1111 q 577 1058 524 1111 q 631 930 631 1006 q 590 827 631 879 q 766 382 635 716 q 909 8 909 15 m 522 930 q 501 986 522 963 q 449 1010 480 1010 q 396 986 417 1010 q 375 930 375 963 q 397 879 375 901 q 447 857 418 857 q 500 878 478 857 q 522 930 522 899 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 z \"\n    },\n    \"Ç\": {\n      \"ha\": 823,\n      \"x_min\": 39,\n      \"x_max\": 819,\n      \"o\": \"m 819 157 q 806 134 819 149 q 478 -20 673 -20 q 153 129 275 -20 q 39 475 39 267 q 155 822 39 682 q 481 972 278 972 q 799 833 686 972 q 810 810 810 819 q 774 742 810 798 q 730 685 738 685 q 689 718 722 685 q 614 779 649 759 q 485 812 555 812 q 276 710 351 812 q 210 479 210 618 q 275 247 210 340 q 484 142 350 142 q 612 175 550 142 q 694 237 652 197 q 733 270 730 270 q 778 216 737 270 q 819 157 819 162 m 565 -77 q 516 -219 565 -165 q 377 -275 465 -275 q 309 -254 352 -275 q 264 -213 264 -233 q 298 -170 264 -211 q 336 -128 333 -128 q 338 -129 337 -128 q 399 -158 368 -158 q 443 -138 424 -158 q 461 -93 461 -117 q 430 -18 461 -52 l 522 -20 q 565 -77 536 -38 z \"\n    },\n    \"É\": {\n      \"ha\": 747,\n      \"x_min\": 68,\n      \"x_max\": 713,\n      \"o\": \"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 584 1151 q 434 1048 574 1123 q 265 974 298 974 q 244 1008 253 974 q 237 1053 237 1034 q 250 1065 237 1059 q 482 1213 362 1121 q 492 1219 485 1215 q 501 1213 496 1217 q 576 1160 530 1188 q 584 1151 580 1158 z \"\n    },\n    \"Ñ\": {\n      \"ha\": 997,\n      \"x_min\": 71,\n      \"x_max\": 924,\n      \"o\": \"m 924 937 q 918 701 924 859 q 913 465 913 544 q 914 244 913 391 q 916 22 916 96 q 899 0 916 0 q 868 2 888 0 q 838 4 848 4 q 804 2 827 4 q 771 0 782 0 q 742 22 759 0 q 298 611 595 220 q 244 677 252 671 q 237 650 237 677 q 241 336 237 545 q 244 22 244 127 q 231 0 244 0 q 195 2 219 0 q 160 4 172 4 q 124 2 148 4 q 87 0 100 0 q 71 14 71 0 q 78 238 71 88 q 85 464 85 389 q 79 760 85 546 q 72 926 77 815 l 71 935 q 87 946 71 945 q 157 949 132 947 q 193 954 166 949 q 228 958 215 958 q 249 939 234 958 q 726 301 405 724 q 753 271 741 283 q 758 401 758 299 q 751 665 758 489 q 745 929 745 842 q 758 951 745 951 q 795 949 770 951 q 832 947 820 947 q 871 949 845 947 q 909 951 897 951 q 924 937 924 951 m 725 1037 q 667 989 725 1021 q 581 957 608 957 q 500 981 541 957 q 439 1004 459 1004 q 391 982 416 1004 q 362 960 366 960 q 349 966 354 960 q 289 1024 289 1025 q 290 1029 289 1026 q 348 1084 300 1057 q 425 1109 393 1109 q 508 1086 458 1109 q 579 1064 558 1064 q 627 1088 592 1064 q 668 1112 663 1112 l 675 1109 q 725 1037 725 1058 z \"\n    },\n    \"Ö\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 713 1032 q 688 1021 713 1021 q 628 1020 668 1021 q 568 1019 588 1019 q 551 1038 551 1019 l 551 1177 q 564 1194 551 1194 q 600 1192 576 1194 q 636 1190 624 1190 q 666 1190 646 1190 q 695 1191 686 1191 q 711 1180 711 1191 q 709 1142 711 1167 q 706 1103 706 1116 q 709 1067 706 1091 q 713 1032 713 1044 m 435 1029 q 416 1019 435 1021 q 376 1019 401 1018 q 349 1021 347 1021 q 318 1020 338 1021 q 287 1019 297 1019 q 274 1031 274 1019 q 275 1063 274 1042 q 277 1095 277 1084 q 275 1136 277 1109 q 273 1177 273 1164 q 289 1192 273 1192 q 351 1192 309 1192 q 413 1191 393 1191 q 434 1177 434 1191 q 432 1139 434 1164 q 429 1102 429 1114 q 432 1065 429 1090 q 435 1029 435 1041 z \"\n    },\n    \"Ü\": {\n      \"ha\": 917,\n      \"x_min\": 68,\n      \"x_max\": 848,\n      \"o\": \"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 675 1032 q 650 1021 675 1021 q 590 1020 630 1021 q 530 1019 550 1019 q 513 1038 513 1019 l 513 1177 q 526 1194 513 1194 q 562 1192 538 1194 q 598 1190 586 1190 q 628 1190 608 1190 q 657 1191 648 1191 q 673 1180 673 1191 q 671 1142 673 1167 q 668 1103 668 1116 q 671 1067 668 1091 q 675 1032 675 1044 m 397 1029 q 378 1019 397 1021 q 338 1019 363 1018 q 311 1021 309 1021 q 280 1020 300 1021 q 249 1019 259 1019 q 236 1031 236 1019 q 237 1063 236 1042 q 239 1095 239 1084 q 237 1136 239 1109 q 235 1177 235 1164 q 251 1192 235 1192 q 313 1192 271 1192 q 375 1191 355 1191 q 396 1177 396 1191 q 394 1139 396 1164 q 391 1102 391 1114 q 394 1065 391 1090 q 397 1029 397 1041 z \"\n    },\n    \"á\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 608 897 q 458 793 597 869 q 289 720 321 720 q 268 753 277 720 q 261 798 261 780 q 274 811 261 805 q 506 958 386 867 q 516 964 509 961 q 525 958 519 963 q 600 905 554 934 q 608 897 604 903 z \"\n    },\n    \"à\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 532 797 q 523 762 532 791 q 510 733 513 733 q 498 732 495 733 q 184 895 261 843 q 178 903 182 897 q 217 945 184 915 q 262 975 251 975 q 387 906 278 975 q 528 810 486 843 q 532 797 534 806 z \"\n    },\n    \"â\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 568 768 q 533 749 566 765 q 495 733 501 733 q 368 844 475 733 q 311 783 361 840 q 250 734 269 734 q 211 750 244 734 q 177 769 177 767 q 268 878 215 812 q 322 970 307 936 q 337 981 327 981 l 408 981 q 420 970 417 981 q 473 878 431 935 q 568 768 520 824 z \"\n    },\n    \"ä\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 581 747 q 556 735 581 735 q 496 734 536 735 q 436 734 456 734 q 419 753 419 734 l 418 891 q 432 908 418 908 q 468 906 444 908 q 504 904 492 904 q 534 905 514 904 q 563 905 553 905 q 579 895 579 905 q 576 856 579 882 q 574 818 574 831 q 577 782 574 806 q 581 747 581 758 m 303 743 q 283 734 303 736 q 244 734 269 732 q 216 736 214 736 q 185 734 206 736 q 155 733 165 733 q 142 746 142 733 q 143 778 142 757 q 144 810 144 799 q 142 851 144 823 q 140 892 140 878 q 157 907 140 907 q 219 906 177 907 q 281 905 260 905 q 302 891 302 905 q 299 854 302 879 q 297 817 297 829 q 300 780 297 804 q 303 743 303 755 z \"\n    },\n    \"ã\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 590 817 q 532 769 590 801 q 446 737 473 737 q 365 761 406 737 q 304 785 324 785 q 256 762 281 785 q 227 740 231 740 q 214 746 219 740 q 154 804 154 806 q 155 810 154 806 q 213 864 165 838 q 290 889 258 889 q 373 867 323 889 q 444 844 423 844 q 492 868 457 844 q 533 892 528 892 l 540 889 q 590 817 590 838 z \"\n    },\n    \"å\": {\n      \"ha\": 770,\n      \"x_min\": 29,\n      \"x_max\": 728,\n      \"o\": \"m 728 614 q 726 602 728 611 q 700 334 700 446 q 717 29 700 327 l 718 20 q 700 0 718 0 q 643 -4 681 0 q 587 -9 606 -9 q 568 39 574 -9 q 555 86 561 86 q 518 60 551 86 q 444 10 478 27 q 336 -17 390 -17 q 115 88 205 -17 q 29 322 29 189 q 115 571 29 473 q 353 673 205 673 q 534 602 456 673 q 570 562 545 588 q 574 560 572 560 q 585 603 578 560 q 604 646 593 646 q 673 635 623 646 q 728 614 728 623 m 555 330 q 506 473 555 414 q 372 538 454 538 q 237 474 291 538 q 184 330 184 413 q 237 188 184 248 q 372 125 291 125 q 505 189 452 125 q 555 330 555 250 m 542 884 q 494 771 542 818 q 379 725 446 725 q 266 771 313 725 q 218 884 218 818 q 265 998 218 951 q 379 1046 312 1046 q 494 998 447 1046 q 542 884 542 951 m 461 884 q 438 945 461 920 q 379 971 415 971 q 320 945 344 971 q 297 884 297 920 q 321 826 297 851 q 378 802 346 802 q 436 826 412 802 q 461 884 461 850 z \"\n    },\n    \"ç\": {\n      \"ha\": 558,\n      \"x_min\": 26,\n      \"x_max\": 543,\n      \"o\": \"m 543 615 q 527 549 543 600 q 505 497 511 497 q 444 524 475 511 q 376 538 413 538 q 237 476 293 538 q 182 330 182 414 q 237 187 182 248 q 376 125 294 125 q 466 147 422 125 q 505 170 510 170 q 524 113 513 170 q 534 41 534 61 q 455 0 534 20 q 357 -17 389 -17 q 121 87 217 -17 q 26 330 26 189 q 119 574 26 474 q 355 677 214 677 q 529 629 450 677 q 543 615 543 621 m 427 -68 q 378 -211 427 -157 q 239 -267 327 -267 q 171 -246 214 -267 q 125 -205 125 -224 q 160 -161 125 -203 q 198 -120 195 -120 q 200 -121 199 -120 q 261 -150 230 -150 q 304 -130 286 -150 q 323 -85 323 -109 q 292 -10 323 -44 l 383 -12 q 427 -68 398 -30 z \"\n    },\n    \"é\": {\n      \"ha\": 669,\n      \"x_min\": 26,\n      \"x_max\": 644,\n      \"o\": \"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 548 897 q 398 793 538 869 q 229 720 262 720 q 208 753 217 720 q 201 798 201 780 q 214 811 201 805 q 446 958 326 867 q 456 964 449 961 q 465 958 460 963 q 541 905 494 934 q 548 897 544 903 z \"\n    },\n    \"è\": {\n      \"ha\": 669,\n      \"x_min\": 26,\n      \"x_max\": 644,\n      \"o\": \"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 496 797 q 487 762 496 791 q 474 733 477 733 q 463 732 459 733 q 149 895 225 843 q 142 903 146 897 q 181 945 148 915 q 226 975 215 975 q 351 906 242 975 q 492 810 450 843 q 496 797 498 806 z \"\n    },\n    \"ê\": {\n      \"ha\": 669,\n      \"x_min\": 26,\n      \"x_max\": 644,\n      \"o\": \"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 528 768 q 493 749 526 765 q 455 733 461 733 q 328 844 435 733 q 271 783 321 840 q 210 734 229 734 q 171 750 204 734 q 137 769 137 767 q 228 878 175 812 q 282 970 267 936 q 297 981 287 981 l 368 981 q 380 970 377 981 q 433 878 391 935 q 528 768 480 824 z \"\n    },\n    \"ë\": {\n      \"ha\": 669,\n      \"x_min\": 26,\n      \"x_max\": 644,\n      \"o\": \"m 644 364 q 600 297 644 314 q 180 257 571 286 q 246 155 189 197 q 363 115 300 115 q 559 184 470 115 q 581 202 570 193 q 588 201 587 202 q 614 154 590 199 q 637 104 637 108 q 627 89 637 100 q 371 -17 527 -17 q 120 77 214 -17 q 26 328 26 171 q 116 571 26 467 q 347 679 210 679 q 560 585 475 679 q 644 364 644 494 m 482 406 q 438 505 482 462 q 338 549 393 549 q 227 498 275 549 q 178 386 178 448 q 203 372 178 372 q 443 392 303 372 q 482 406 482 397 m 558 747 q 534 735 558 735 q 473 734 513 735 q 414 734 433 734 q 397 753 397 734 l 396 891 q 410 908 396 908 q 445 906 421 908 q 481 904 469 904 q 511 905 492 904 q 541 905 531 905 q 557 895 557 905 q 554 856 557 882 q 551 818 551 831 q 555 782 551 806 q 558 747 558 758 m 281 743 q 261 734 281 736 q 222 734 247 732 q 194 736 192 736 q 163 734 184 736 q 132 733 142 733 q 119 746 119 733 q 121 778 119 757 q 122 810 122 799 q 120 851 122 823 q 118 892 118 878 q 134 907 118 907 q 196 906 155 907 q 259 905 238 905 q 279 891 279 905 q 277 854 279 879 q 275 817 275 829 q 278 780 275 804 q 281 743 281 755 z \"\n    },\n    \"í\": {\n      \"ha\": 306,\n      \"x_min\": 15,\n      \"x_max\": 361,\n      \"o\": \"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 361 897 q 212 793 351 869 q 43 720 75 720 q 22 753 31 720 q 15 798 15 780 q 28 811 15 805 q 260 958 140 867 q 270 964 262 961 q 279 958 273 963 q 354 905 308 934 q 361 897 357 903 z \"\n    },\n    \"ì\": {\n      \"ha\": 306,\n      \"x_min\": -66,\n      \"x_max\": 290,\n      \"o\": \"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 289 797 q 279 762 289 791 q 267 733 270 733 q 255 732 252 733 q -59 895 18 843 q -66 903 -62 897 q -26 945 -60 915 q 18 975 7 975 q 143 906 35 975 q 285 810 243 843 q 289 797 290 806 z \"\n    },\n    \"î\": {\n      \"ha\": 306,\n      \"x_min\": -45,\n      \"x_max\": 346,\n      \"o\": \"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 346 764 q 312 745 344 761 q 273 729 279 729 q 146 840 254 729 q 90 779 140 836 q 28 730 47 730 q -11 746 22 730 q -45 765 -45 763 q 46 873 -7 808 q 100 966 85 932 q 115 977 105 977 l 186 977 q 199 966 195 977 q 252 873 210 931 q 346 764 298 820 z \"\n    },\n    \"ï\": {\n      \"ha\": 306,\n      \"x_min\": -71,\n      \"x_max\": 370,\n      \"o\": \"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 m 370 760 q 345 748 370 748 q 285 747 325 748 q 225 747 245 747 q 208 766 208 747 l 208 904 q 221 921 208 921 q 257 919 233 921 q 293 917 281 917 q 323 918 303 917 q 352 918 342 918 q 368 907 368 918 q 366 869 368 895 q 363 831 363 844 q 366 795 363 819 q 370 760 370 771 m 92 756 q 73 747 92 749 q 33 747 58 745 q 5 749 3 749 q -25 747 -5 749 q -56 746 -46 746 q -69 759 -69 746 q -68 791 -69 770 q -66 823 -66 812 q -68 864 -66 836 q -71 905 -71 891 q -54 920 -71 920 q 8 919 -34 920 q 70 918 50 918 q 91 904 91 918 q 89 867 91 892 q 86 829 86 842 q 89 793 86 817 q 92 756 92 768 z \"\n    },\n    \"ñ\": {\n      \"ha\": 726,\n      \"x_min\": 43,\n      \"x_max\": 667,\n      \"o\": \"m 667 14 q 653 -1 667 -1 q 586 -1 631 -1 q 519 0 542 0 q 507 20 507 0 q 509 121 507 53 q 511 222 511 189 q 511 303 511 250 q 510 385 510 357 q 488 494 510 462 q 387 532 460 532 q 293 494 353 532 q 229 422 229 454 l 229 16 q 216 -1 229 -1 q 151 -1 195 -1 q 86 0 108 0 q 72 16 72 0 q 74 176 72 69 q 75 338 75 283 q 45 604 75 482 q 43 613 43 610 q 52 623 43 620 q 129 635 56 623 q 205 647 202 647 q 211 636 210 647 q 227 551 214 594 q 319 621 262 579 q 457 664 391 664 q 631 590 585 664 q 666 414 666 536 q 665 350 666 393 q 664 285 664 307 q 665 149 664 239 q 667 14 667 59 m 581 810 q 522 762 581 794 q 436 730 464 730 q 355 754 396 730 q 294 778 315 778 q 246 755 271 778 q 218 733 221 733 q 204 739 210 733 q 144 798 144 799 q 146 803 144 800 q 203 857 156 831 q 281 882 249 882 q 364 860 314 882 q 435 838 414 838 q 483 861 448 838 q 524 885 518 885 l 530 882 q 581 810 581 831 z \"\n    },\n    \"ó\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 562 897 q 412 793 551 869 q 243 720 275 720 q 222 753 231 720 q 215 798 215 780 q 228 811 215 805 q 460 958 340 867 q 470 964 463 961 q 479 958 473 963 q 554 905 508 934 q 562 897 557 903 z \"\n    },\n    \"ò\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 471 797 q 462 762 471 791 q 449 733 452 733 q 437 732 434 733 q 123 895 200 843 q 117 903 121 897 q 156 945 123 915 q 201 975 190 975 q 326 906 217 975 q 467 810 425 843 q 471 797 473 806 z \"\n    },\n    \"ô\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 547 768 q 513 749 545 765 q 475 733 481 733 q 348 844 455 733 q 291 783 341 840 q 229 734 248 734 q 190 750 224 734 q 157 769 157 767 q 248 878 195 812 q 302 970 286 936 q 317 981 307 981 l 388 981 q 400 970 397 981 q 453 878 411 935 q 547 768 500 824 z \"\n    },\n    \"ö\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 574 747 q 549 735 574 735 q 489 734 529 735 q 429 734 449 734 q 412 753 412 734 l 412 891 q 425 908 412 908 q 461 906 437 908 q 497 904 485 904 q 527 905 507 904 q 556 905 547 905 q 572 895 572 905 q 570 856 572 882 q 567 818 567 831 q 570 782 567 806 q 574 747 574 758 m 296 743 q 277 734 296 736 q 237 734 262 732 q 210 736 208 736 q 179 734 199 736 q 148 733 158 733 q 135 746 135 733 q 136 778 135 757 q 138 810 138 799 q 136 851 138 823 q 134 892 134 878 q 150 907 134 907 q 212 906 170 907 q 274 905 254 905 q 295 891 295 905 q 293 854 295 879 q 290 817 290 829 q 293 780 290 804 q 296 743 296 755 z \"\n    },\n    \"õ\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 571 817 q 513 769 571 801 q 427 737 454 737 q 346 761 387 737 q 285 785 305 785 q 237 762 262 785 q 208 740 212 740 q 195 746 200 740 q 135 804 135 806 q 136 810 135 806 q 194 864 146 838 q 271 889 239 889 q 354 867 304 889 q 425 844 404 844 q 473 868 438 844 q 514 892 509 892 l 521 889 q 571 817 571 838 z \"\n    },\n    \"ú\": {\n      \"ha\": 766,\n      \"x_min\": 65,\n      \"x_max\": 697,\n      \"o\": \"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 604 897 q 454 793 593 869 q 285 720 317 720 q 264 753 273 720 q 257 798 257 780 q 270 811 257 805 q 502 958 382 867 q 512 964 505 961 q 521 958 515 963 q 596 905 550 934 q 604 897 600 903 z \"\n    },\n    \"ù\": {\n      \"ha\": 766,\n      \"x_min\": 65,\n      \"x_max\": 697,\n      \"o\": \"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 526 797 q 516 762 526 791 q 503 733 507 733 q 492 732 488 733 q 178 895 254 843 q 171 903 175 897 q 211 945 177 915 q 255 975 244 975 q 380 906 271 975 q 522 810 479 843 q 526 797 527 806 z \"\n    },\n    \"û\": {\n      \"ha\": 766,\n      \"x_min\": 65,\n      \"x_max\": 697,\n      \"o\": \"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 587 768 q 553 749 585 765 q 515 733 521 733 q 388 844 495 733 q 331 783 381 840 q 269 734 288 734 q 230 750 264 734 q 197 769 197 767 q 288 878 235 812 q 342 970 326 936 q 357 981 347 981 l 428 981 q 440 970 437 981 q 493 878 451 935 q 587 768 540 824 z \"\n    },\n    \"ü\": {\n      \"ha\": 766,\n      \"x_min\": 65,\n      \"x_max\": 697,\n      \"o\": \"m 697 615 q 693 466 697 566 q 689 315 689 366 q 692 167 689 266 q 695 19 695 68 q 682 1 695 5 q 545 0 677 0 q 535 51 536 0 q 527 102 533 102 q 517 96 524 102 q 293 -3 404 -3 q 95 106 143 -3 q 65 347 65 173 q 90 614 65 505 q 113 640 96 640 q 172 640 132 640 q 231 639 211 639 q 244 624 244 639 q 235 536 244 597 q 225 443 226 470 q 223 353 223 402 q 240 194 223 235 q 370 121 269 121 q 471 163 412 121 q 534 248 532 207 q 538 606 538 298 q 566 639 538 639 l 677 639 q 697 615 697 639 m 612 747 q 588 735 612 735 q 528 734 568 735 q 468 734 488 734 q 451 753 451 734 l 450 891 q 464 908 450 908 q 499 906 475 908 q 536 904 524 904 q 566 905 546 904 q 595 905 585 905 q 611 895 611 905 q 608 856 611 882 q 606 818 606 831 q 609 782 606 806 q 612 747 612 758 m 335 743 q 315 734 335 736 q 276 734 301 732 q 248 736 246 736 q 217 734 238 736 q 186 733 197 733 q 174 746 174 733 q 175 778 174 757 q 176 810 176 799 q 174 851 176 823 q 172 892 172 878 q 189 907 172 907 q 251 906 209 907 q 313 905 292 905 q 334 891 334 905 q 331 854 334 879 q 329 817 329 829 q 332 780 329 804 q 335 743 335 755 z \"\n    },\n    \"†\": {\n      \"ha\": 581,\n      \"x_min\": 25,\n      \"x_max\": 557,\n      \"o\": \"m 557 637 q 556 579 557 618 q 555 521 555 541 q 534 504 555 504 q 364 513 533 504 q 363 455 364 494 q 363 397 363 416 q 364 164 363 319 q 366 -68 366 9 q 351 -127 366 -127 l 227 -127 q 210 -118 212 -127 q 210 -96 210 -117 q 213 147 210 -15 q 216 389 216 309 l 216 511 q 132 507 203 511 q 46 504 79 504 q 26 519 26 504 q 26 578 26 539 q 25 636 25 616 q 39 652 25 652 q 125 650 71 652 q 211 647 190 648 l 208 946 q 224 971 208 971 l 359 971 q 372 949 372 971 q 368 647 372 810 q 454 650 389 648 q 539 652 507 652 q 557 637 557 652 z \"\n    },\n    \"°\": {\n      \"ha\": 545,\n      \"x_min\": 50,\n      \"x_max\": 492,\n      \"o\": \"m 492 713 q 431 542 492 614 q 271 465 367 465 q 111 543 175 465 q 50 713 50 615 q 111 883 50 810 q 271 960 175 960 q 431 883 368 960 q 492 713 492 811 m 396 713 q 366 817 396 775 q 271 864 332 864 q 177 817 212 864 q 146 713 146 774 q 179 611 146 654 q 271 562 215 562 q 365 609 330 562 q 396 713 396 651 z \"\n    },\n    \"¢\": {\n      \"ha\": 481,\n      \"x_min\": 37,\n      \"x_max\": 450,\n      \"o\": \"m 450 661 q 428 570 450 646 q 422 562 425 562 q 415 566 419 562 q 339 597 375 594 q 289 271 322 488 q 318 267 302 267 q 389 285 355 267 q 419 303 404 294 q 436 255 427 299 q 444 199 444 216 q 382 167 444 179 q 287 157 335 157 q 271 158 276 157 q 252 11 260 60 q 245 -1 249 -1 q 225 2 239 -1 q 203 5 211 5 q 191 13 191 5 q 216 172 191 25 q 85 272 133 203 q 37 432 37 342 q 110 628 37 549 q 300 710 184 710 q 317 818 304 746 q 322 831 319 831 l 372 811 q 374 802 374 808 q 364 752 374 787 q 357 704 355 720 q 409 689 378 701 q 450 661 450 674 m 282 593 q 199 534 230 582 q 171 434 171 490 q 235 294 171 344 q 282 593 241 333 z \"\n    },\n    \"£\": {\n      \"ha\": 648,\n      \"x_min\": 35,\n      \"x_max\": 671,\n      \"o\": \"m 671 132 q 668 121 671 130 q 650 14 668 121 q 631 0 648 0 q 466 2 576 0 q 302 5 357 5 q 146 -3 178 5 q 75 -16 87 -16 q 61 -4 64 -16 q 35 117 35 85 q 60 132 35 132 q 172 168 115 132 q 235 261 235 209 q 222 315 235 286 q 114 312 195 312 q 62 313 65 312 q 52 360 52 319 q 79 454 52 454 q 110 454 90 454 q 140 453 130 453 q 80 618 80 558 q 176 783 80 724 q 369 833 257 833 q 501 810 420 833 q 600 749 600 783 q 591 701 600 745 q 579 643 581 654 q 571 618 578 631 q 566 617 569 617 q 494 656 572 617 q 354 694 416 694 q 274 676 307 694 q 233 610 233 654 q 264 526 233 579 q 313 447 288 486 q 513 444 372 444 q 526 432 523 444 q 527 406 528 423 q 525 385 525 383 q 527 352 525 374 q 530 319 530 330 q 517 313 530 313 q 382 315 391 313 q 391 262 391 288 q 335 138 391 193 q 493 139 387 138 q 653 140 600 140 q 671 132 671 140 z \"\n    },\n    \"§\": {\n      \"ha\": 564,\n      \"x_min\": 40,\n      \"x_max\": 518,\n      \"o\": \"m 518 123 q 439 -35 518 24 q 264 -89 367 -89 q 52 -7 125 -89 q 40 11 40 5 q 92 106 40 8 q 99 111 94 111 q 152 68 96 111 q 254 25 208 25 q 332 46 302 25 q 368 115 368 71 q 286 205 368 161 q 134 286 134 285 q 52 421 52 342 q 86 534 52 483 q 121 587 121 586 q 102 617 121 594 q 66 671 77 646 q 46 760 46 711 q 115 913 46 859 q 281 962 178 962 q 461 897 404 962 q 470 880 470 887 l 425 791 q 419 787 422 787 q 373 821 420 787 q 282 856 326 856 q 186 782 186 856 q 216 707 186 738 q 286 660 234 690 q 425 575 402 592 q 511 450 511 511 q 472 343 511 397 q 432 292 432 290 q 454 266 432 285 q 496 219 482 243 q 518 123 518 180 m 371 409 q 319 494 371 448 q 229 541 267 541 q 199 512 215 541 q 184 471 184 486 q 239 389 184 433 q 326 349 290 349 q 355 373 339 349 q 371 409 371 395 z \"\n    },\n    \"•\": {\n      \"ha\": 627,\n      \"x_min\": 52,\n      \"x_max\": 572,\n      \"o\": \"m 572 403 q 503 202 572 283 q 311 118 429 118 q 121 203 193 118 q 52 403 52 283 q 121 602 52 522 q 311 686 193 686 q 503 602 429 686 q 572 403 572 522 z \"\n    },\n    \"¶\": {\n      \"ha\": 754,\n      \"x_min\": 52,\n      \"x_max\": 677,\n      \"o\": \"m 677 890 q 677 697 677 826 q 676 504 676 568 q 397 7 676 121 q 192 -34 298 -34 q 168 -21 174 -34 q 153 32 153 12 q 170 45 153 43 q 272 52 221 48 q 372 77 330 57 q 557 292 511 140 q 587 585 587 387 q 585 793 587 732 q 509 819 568 819 q 520 568 520 755 q 494 333 520 418 q 355 149 457 208 q 184 105 281 105 q 130 132 144 105 q 119 197 119 151 q 132 216 119 216 q 182 207 142 216 q 248 197 223 197 q 376 256 327 197 q 422 394 422 312 q 418 413 422 413 q 368 392 421 413 q 275 371 314 371 q 111 446 174 371 q 52 619 52 517 q 143 866 52 773 q 389 960 235 960 q 642 922 494 960 q 668 914 665 916 q 677 890 677 908 m 440 578 q 439 700 440 618 q 437 822 437 781 q 401 836 437 836 q 229 629 229 836 q 336 470 229 470 q 435 501 391 470 q 440 578 440 529 z \"\n    },\n    \"ß\": {\n      \"ha\": 694,\n      \"x_min\": 77,\n      \"x_max\": 659,\n      \"o\": \"m 659 330 q 389 -4 659 111 q 371 -9 377 -9 q 334 36 362 -9 q 307 93 307 82 q 326 107 307 98 q 504 318 504 191 q 464 427 504 385 q 357 469 423 469 q 320 461 343 469 q 288 454 296 454 q 273 561 273 454 q 288 574 273 568 q 415 729 415 628 q 336 832 415 832 q 252 787 283 832 q 224 693 224 748 q 232 353 224 580 q 240 12 240 126 q 228 -3 240 -3 q 192 0 216 -3 q 155 3 168 3 q 125 1 145 3 q 94 0 104 0 q 77 21 77 0 q 80 202 77 81 q 83 383 83 323 q 80 528 83 431 q 77 672 77 624 q 146 869 77 787 q 334 954 220 954 q 486 903 426 954 q 549 757 549 848 q 526 669 549 713 q 486 607 511 639 q 463 580 463 581 q 489 562 463 572 q 659 330 659 503 z \"\n    },\n    \"®\": {\n      \"ha\": 859,\n      \"x_min\": 52,\n      \"x_max\": 807,\n      \"o\": \"m 807 528 q 703 237 807 361 q 429 107 593 107 q 156 238 267 107 q 52 528 52 362 q 155 819 52 695 q 429 949 265 949 q 703 819 593 949 q 807 528 807 695 m 742 528 q 657 773 742 669 q 429 885 568 885 q 331 867 393 885 q 255 817 256 844 l 258 812 q 435 821 330 821 q 654 643 654 821 q 633 536 654 581 q 593 482 619 508 q 571 454 571 461 q 652 278 571 448 q 742 528 742 377 m 526 621 q 393 733 526 733 q 335 725 366 733 q 332 631 332 694 l 332 555 q 433 550 389 550 q 526 621 526 550 m 623 249 q 581 247 608 249 q 539 245 553 245 q 525 254 529 245 q 497 343 515 275 q 465 429 481 404 q 406 439 459 439 q 367 439 357 439 q 340 422 340 437 q 350 337 340 394 q 359 253 359 281 q 273 250 359 250 q 236 249 245 250 q 429 174 317 174 q 623 249 538 174 m 227 492 q 218 635 227 537 q 197 771 208 747 q 117 528 117 655 q 199 288 117 385 q 211 282 203 282 q 220 289 218 282 q 227 492 227 333 z \"\n    },\n    \"©\": {\n      \"ha\": 859,\n      \"x_min\": 53,\n      \"x_max\": 808,\n      \"o\": \"m 808 528 q 704 237 808 361 q 431 107 594 107 q 157 237 267 107 q 53 528 53 361 q 156 819 53 696 q 431 949 264 949 q 705 819 595 949 q 808 528 808 695 m 736 529 q 652 768 736 665 q 431 878 563 878 q 207 769 295 878 q 125 529 125 668 q 208 290 125 391 q 431 180 296 180 q 653 290 564 180 q 736 529 736 393 m 603 753 q 582 713 603 749 q 557 670 559 675 q 553 659 555 665 q 550 661 552 659 q 456 694 504 694 q 328 533 328 694 q 464 372 328 372 q 520 385 492 372 q 549 399 534 392 l 554 392 q 577 350 559 385 q 596 310 596 314 q 534 273 596 288 q 454 260 486 260 q 266 337 338 260 q 193 532 193 414 q 264 726 193 648 q 453 806 338 806 q 538 793 486 806 q 603 753 603 776 z \"\n    },\n    \"™\": {\n      \"ha\": 871,\n      \"x_min\": 5,\n      \"x_max\": 837,\n      \"o\": \"m 836 542 q 833 533 837 533 l 730 533 q 722 545 722 533 q 724 638 722 576 q 725 730 725 700 q 722 739 725 739 q 692 645 711 734 q 664 536 672 549 q 651 534 663 534 l 578 534 q 564 536 570 534 q 537 635 551 567 q 510 734 523 704 q 506 739 509 737 q 503 730 503 737 q 505 637 503 699 q 507 545 507 576 q 497 533 507 533 q 474 535 490 533 q 452 536 459 536 q 424 535 442 536 q 395 533 405 533 q 392 542 392 533 q 395 640 392 574 q 397 739 397 706 q 395 842 397 773 q 393 945 393 910 q 401 954 393 954 q 455 957 419 954 q 507 960 490 960 q 555 889 517 960 q 597 804 590 825 q 615 761 604 783 q 666 871 640 816 q 726 959 709 959 q 776 957 742 959 q 827 956 810 956 q 835 952 835 956 q 833 846 835 917 q 832 739 832 774 q 834 640 832 706 q 836 542 836 574 m 359 914 q 347 824 359 824 q 299 823 334 823 q 252 822 269 822 q 250 750 250 798 l 250 699 q 253 620 250 672 q 256 542 256 568 q 245 533 256 533 l 112 533 q 109 536 110 534 q 112 620 109 564 q 115 703 115 675 l 115 818 q 9 812 45 812 q 5 816 5 812 q 9 879 5 827 q 17 939 15 934 q 32 944 19 944 q 187 949 83 944 q 342 954 290 954 q 359 914 359 954 z \"\n    },\n    \"´\": {\n      \"ha\": 485,\n      \"x_min\": 32,\n      \"x_max\": 378,\n      \"o\": \"m 378 918 q 229 814 368 890 q 60 741 92 741 q 39 774 47 741 q 32 819 32 801 q 45 832 32 826 q 277 979 157 888 q 287 985 279 982 q 296 979 290 984 q 371 926 325 955 q 378 918 374 924 z \"\n    },\n    \"¨\": {\n      \"ha\": 485,\n      \"x_min\": 24,\n      \"x_max\": 464,\n      \"o\": \"m 464 825 q 439 813 464 813 q 379 812 419 813 q 319 812 339 812 q 302 831 302 812 l 302 969 q 315 986 302 986 q 351 984 327 986 q 387 982 375 982 q 417 983 397 982 q 446 983 437 983 q 463 972 463 983 q 460 934 463 960 q 457 896 457 909 q 460 860 457 884 q 464 825 464 836 m 186 821 q 167 812 186 814 q 127 812 153 810 q 100 814 98 814 q 69 812 90 814 q 38 811 48 811 q 25 824 25 811 q 26 856 25 835 q 28 888 28 877 q 26 929 28 901 q 24 970 24 956 q 40 985 24 985 q 102 984 60 985 q 164 983 144 983 q 185 969 185 983 q 183 932 185 957 q 180 895 180 907 q 183 858 180 882 q 186 821 186 833 z \"\n    },\n    \"≠\": {\n      \"ha\": 612,\n      \"x_min\": 69,\n      \"x_max\": 543,\n      \"o\": \"m 543 265 l 308 265 l 254 47 l 174 66 l 223 265 l 69 265 l 69 346 l 243 346 l 285 513 l 69 513 l 69 595 l 305 595 l 359 812 l 438 792 l 389 595 l 543 595 l 543 513 l 369 513 l 328 346 l 543 346 l 543 265 z \"\n    },\n    \"Æ\": {\n      \"ha\": 1149,\n      \"x_min\": 43,\n      \"x_max\": 1112,\n      \"o\": \"m 1112 143 q 1100 77 1112 122 q 1089 9 1089 32 q 1072 -2 1089 -2 q 928 2 1024 -2 q 783 5 831 5 q 674 3 747 5 q 566 0 602 0 q 545 20 545 0 q 546 117 545 56 q 549 214 548 191 q 467 218 513 218 q 298 212 348 218 q 273 196 281 210 q 229 87 252 142 q 183 0 193 0 l 61 0 q 45 9 49 0 q 44 28 43 15 q 46 47 46 47 q 45 66 46 54 q 45 86 45 79 q 65 132 45 87 q 232 488 123 250 q 424 916 340 747 q 431 932 427 924 q 446 942 435 940 q 641 953 502 953 q 784 956 688 953 q 926 960 879 960 q 989 962 947 960 q 1053 965 1031 965 q 1082 946 1078 965 q 1097 831 1097 873 q 1061 821 1097 821 q 770 814 930 821 q 728 810 754 814 q 701 696 701 802 l 701 667 q 703 589 701 597 q 758 553 713 553 q 1060 566 855 553 l 1066 566 q 1079 554 1079 566 q 1074 492 1079 535 q 1068 428 1068 450 q 1055 417 1068 417 q 1028 421 1050 417 q 810 429 979 429 q 716 416 731 429 q 701 331 701 404 l 701 289 q 702 210 701 217 q 730 141 707 152 q 787 135 744 135 q 1088 153 929 135 q 1099 154 1095 154 q 1112 143 1112 154 m 549 395 q 548 530 549 440 q 546 666 546 621 q 545 751 546 733 q 536 783 542 783 q 513 749 529 783 q 340 352 340 387 q 364 338 340 338 q 549 350 487 338 q 549 395 549 367 z \"\n    },\n    \"Ø\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 893 876 q 880 852 893 867 q 498 429 871 841 q 107 -4 370 282 q 94 -13 98 -13 q 70 14 87 -13 q 52 49 56 38 q 417 458 56 59 q 842 929 819 904 q 854 939 846 934 q 878 910 863 934 q 893 876 893 886 m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 z \"\n    },\n    \"∞\": {\n      \"ha\": 861,\n      \"x_min\": 24,\n      \"x_max\": 838,\n      \"o\": \"m 838 171 q 762 94 838 94 l 591 94 q 498 171 548 94 l 431 273 l 364 170 q 321 113 336 125 q 273 94 302 95 l 101 94 q 24 171 24 94 l 24 515 q 101 592 24 592 l 273 592 q 366 515 317 591 l 432 413 l 498 515 q 591 592 548 592 l 762 592 q 838 515 838 592 l 838 171 m 747 174 l 747 513 l 586 513 l 477 344 l 587 174 l 747 174 m 386 342 l 274 513 l 115 513 l 115 174 l 277 174 l 386 342 z \"\n    },\n    \"±\": {\n      \"ha\": 568,\n      \"x_min\": 46,\n      \"x_max\": 524,\n      \"o\": \"m 521 441 l 325 441 l 325 269 l 244 269 l 244 441 l 47 441 l 47 518 l 244 518 l 244 697 l 325 697 l 325 518 l 521 518 l 521 441 m 524 129 l 46 129 l 46 212 l 524 212 l 524 129 z \"\n    },\n    \"≤\": {\n      \"ha\": 473,\n      \"x_min\": 52,\n      \"x_max\": 396,\n      \"o\": \"m 396 205 l 392 205 l 52 439 l 52 488 l 396 725 l 396 631 l 144 465 l 396 299 l 396 205 m 396 98 l 52 98 l 52 179 l 396 179 l 396 98 z \"\n    },\n    \"≥\": {\n      \"ha\": 473,\n      \"x_min\": 65,\n      \"x_max\": 410,\n      \"o\": \"m 410 439 l 65 205 l 65 299 l 316 465 l 65 631 l 65 725 l 69 725 l 410 488 l 410 439 m 409 98 l 65 98 l 65 179 l 409 179 l 409 98 z \"\n    },\n    \"¥\": {\n      \"ha\": 914,\n      \"x_min\": 9,\n      \"x_max\": 889,\n      \"o\": \"m 889 646 q 888 593 889 628 q 886 541 886 558 q 834 530 886 530 q 771 533 802 532 q 643 361 732 472 q 742 370 665 362 q 840 375 804 375 q 852 366 852 375 l 852 306 q 855 286 852 299 q 858 264 858 272 q 840 243 858 246 q 764 241 839 243 q 545 237 645 239 q 536 12 536 222 q 528 0 536 0 q 487 1 514 0 q 447 3 460 3 q 410 1 435 3 q 372 0 385 0 q 358 20 359 0 q 359 117 357 56 q 361 214 361 189 q 357 239 361 224 q 60 243 57 243 q 40 294 40 243 q 42 366 40 357 q 56 375 43 375 q 258 361 44 375 q 131 532 214 416 q 29 530 94 530 q 11 568 11 530 q 9 621 11 679 q 25 656 9 656 q 90 652 32 656 q 87 739 90 669 q 86 825 86 791 q 102 840 86 840 q 174 837 125 840 q 248 833 223 833 q 258 827 258 833 q 257 736 258 797 q 256 644 256 675 q 447 642 374 642 q 644 644 523 642 q 641 731 644 665 q 639 818 639 785 q 653 833 639 831 q 803 840 700 840 q 819 821 819 840 q 818 736 819 789 q 815 652 816 671 q 876 656 871 656 q 889 646 889 656 m 603 538 q 490 539 555 539 l 437 539 q 371 538 416 539 q 306 538 327 538 q 463 361 399 426 q 603 538 524 425 z \"\n    },\n    \"µ\": {\n      \"ha\": 532,\n      \"x_min\": 74,\n      \"x_max\": 458,\n      \"o\": \"m 458 0 l 370 0 l 370 19 q 245 -1 323 -1 q 163 26 181 -1 l 163 -250 l 74 -250 l 74 660 l 163 660 l 163 172 q 256 77 163 77 q 369 88 321 77 l 369 660 l 458 660 l 458 0 z \"\n    },\n    \"∂\": {\n      \"ha\": 589,\n      \"x_min\": 84,\n      \"x_max\": 505,\n      \"o\": \"m 505 583 l 505 75 q 484 21 505 42 q 430 0 463 0 l 159 0 q 105 21 126 0 q 84 75 84 42 l 84 510 q 105 564 84 543 q 159 585 126 585 l 401 585 l 180 1061 l 282 1061 l 505 583 m 410 83 l 410 503 l 178 503 l 178 83 l 410 83 z \"\n    },\n    \"∑\": {\n      \"ha\": 496,\n      \"x_min\": 58,\n      \"x_max\": 440,\n      \"o\": \"m 440 0 l 58 0 l 58 73 l 317 540 l 58 977 l 58 1061 l 436 1061 l 436 978 l 151 978 l 393 580 l 393 499 l 152 83 l 440 83 l 440 0 z \"\n    },\n    \"∏\": {\n      \"ha\": 545,\n      \"x_min\": 26,\n      \"x_max\": 518,\n      \"o\": \"m 518 978 l 418 978 l 418 0 l 326 0 l 326 978 l 216 978 l 216 0 l 124 0 l 124 978 l 26 978 l 26 1061 l 518 1061 l 518 978 z \"\n    },\n    \"π\": {\n      \"ha\": 545,\n      \"x_min\": 26,\n      \"x_max\": 518,\n      \"o\": \"m 518 522 l 418 522 l 418 0 l 326 0 l 326 522 l 216 522 l 216 0 l 124 0 l 124 522 l 26 522 l 26 606 l 518 606 l 518 522 z \"\n    },\n    \"∫\": {\n      \"ha\": 330,\n      \"x_min\": -22,\n      \"x_max\": 323,\n      \"o\": \"m 323 982 l 196 982 l 196 -196 q 178 -247 196 -226 q 123 -271 158 -271 l -22 -272 l -22 -193 l 106 -193 l 107 985 q 183 1061 107 1061 l 323 1061 l 323 982 z \"\n    },\n    \"ª\": {\n      \"ha\": 639,\n      \"x_min\": 35,\n      \"x_max\": 594,\n      \"o\": \"m 594 922 q 593 911 594 920 q 572 681 572 775 q 580 494 572 604 q 586 412 586 397 q 574 395 586 395 q 521 392 556 395 q 468 390 486 390 q 453 432 457 390 q 446 475 450 473 q 432 463 440 471 q 269 382 357 382 q 96 477 163 382 q 35 672 35 562 q 101 872 35 791 q 289 958 172 958 q 382 929 334 958 q 456 861 431 901 q 462 878 459 859 q 468 922 464 892 q 479 950 469 935 q 543 941 503 949 q 594 922 594 932 m 587 318 q 579 218 587 310 q 571 211 577 210 l 564 211 q 302 218 428 218 q 192 215 266 218 q 81 211 117 211 q 68 221 68 211 q 74 321 68 297 q 86 330 76 330 q 205 328 126 330 q 325 325 285 325 q 451 327 367 325 q 576 329 534 329 q 587 318 587 329 m 436 679 q 404 788 436 740 q 310 843 368 843 q 208 789 247 843 q 174 675 174 741 q 206 555 174 603 q 313 501 243 501 q 407 564 372 501 q 436 679 436 614 z \"\n    },\n    \"º\": {\n      \"ha\": 639,\n      \"x_min\": 57,\n      \"x_max\": 575,\n      \"o\": \"m 575 676 q 504 475 575 562 q 317 383 429 383 q 128 475 204 383 q 57 676 57 562 q 129 877 57 791 q 317 968 205 968 q 504 876 428 968 q 575 676 575 790 m 552 318 q 547 265 552 307 q 545 218 548 248 q 536 211 542 210 l 529 211 q 310 218 393 218 q 205 215 275 218 q 102 211 136 211 q 89 221 89 211 q 94 321 89 298 q 107 330 97 330 q 219 328 144 330 q 332 325 294 325 q 437 327 367 325 q 542 329 507 329 q 552 318 552 329 m 449 676 q 417 791 449 741 q 319 848 380 848 q 218 791 258 848 q 183 676 183 741 q 216 558 183 607 q 319 503 253 503 q 418 561 382 503 q 449 676 449 610 z \"\n    },\n    \"Ω\": {\n      \"ha\": 716,\n      \"x_min\": 40,\n      \"x_max\": 678,\n      \"o\": \"m 678 -1 l 415 -1 l 415 332 l 540 332 l 540 978 l 180 977 l 179 332 l 304 332 l 304 -1 l 40 -1 l 40 87 l 224 87 l 224 248 l 160 248 q 106 269 127 248 q 85 323 85 290 l 85 986 q 106 1040 85 1019 q 160 1061 127 1061 l 557 1061 q 612 1040 590 1061 q 634 986 634 1019 l 634 323 q 613 269 634 290 q 559 248 592 248 l 494 248 l 494 87 l 678 87 l 678 -1 z \"\n    },\n    \"æ\": {\n      \"ha\": 1192,\n      \"x_min\": 29,\n      \"x_max\": 1168,\n      \"o\": \"m 1168 362 q 1157 322 1168 341 q 1125 297 1144 300 q 986 283 1078 292 l 711 256 q 785 152 720 193 q 911 115 844 115 q 1015 138 966 115 q 1080 180 1048 153 q 1107 203 1107 203 q 1112 201 1110 203 q 1137 146 1123 178 q 1162 104 1162 103 q 1152 89 1162 100 q 895 -9 1061 -9 q 705 69 753 -9 q 709 22 709 49 q 708 1 709 10 q 626 -5 671 -5 q 575 0 598 -5 q 572 89 572 33 q 571 113 572 105 q 470 18 517 46 q 335 -16 413 -16 q 111 87 197 -16 q 29 323 29 184 q 115 571 29 473 q 351 673 205 673 q 581 553 465 673 q 604 646 586 585 l 607 646 q 721 623 616 646 q 868 672 786 672 q 1083 583 998 672 q 1168 362 1168 494 m 1008 411 q 962 506 1008 463 q 863 549 915 549 q 753 504 799 549 q 708 395 708 458 q 726 372 708 372 q 970 390 768 372 q 1008 411 1008 394 m 558 330 q 509 475 558 415 q 374 539 456 539 q 234 475 286 539 q 186 326 186 416 q 236 183 186 241 q 372 121 289 121 q 509 185 455 121 q 558 330 558 245 z \"\n    },\n    \"ø\": {\n      \"ha\": 710,\n      \"x_min\": 26,\n      \"x_max\": 684,\n      \"o\": \"m 684 330 q 591 88 684 189 q 355 -16 496 -16 q 119 87 214 -16 q 26 329 26 187 q 119 570 26 471 q 355 672 215 672 q 590 570 495 672 q 684 330 684 471 m 541 329 q 490 470 541 412 q 355 532 437 532 q 220 471 274 532 q 170 329 170 412 q 221 188 170 248 q 355 125 275 125 q 490 188 436 125 q 541 329 541 248 m 650 650 q 640 631 650 642 q 302 238 527 500 q 96 -3 234 157 q 82 -14 92 -8 q 61 11 77 -12 q 46 39 46 34 q 302 345 46 44 q 602 692 548 632 q 613 701 605 696 q 633 676 617 699 q 650 650 650 653 z \"\n    },\n    \"¿\": {\n      \"ha\": 553,\n      \"x_min\": 31,\n      \"x_max\": 536,\n      \"o\": \"m 399 860 q 374 794 399 821 q 311 766 349 766 q 249 794 273 766 q 224 860 224 822 q 249 926 224 897 q 311 954 274 954 q 374 926 349 954 q 399 860 399 898 m 536 111 q 534 86 536 92 q 426 18 528 52 q 290 -11 337 -11 q 103 60 176 -11 q 31 244 31 130 q 70 387 31 316 q 167 500 107 454 q 269 648 264 574 q 271 680 270 664 q 290 696 274 696 q 327 699 302 696 q 362 703 351 703 q 379 668 379 703 q 335 517 379 586 q 253 412 294 465 q 208 286 208 350 q 245 185 208 224 q 345 146 282 146 q 464 182 406 146 q 515 218 522 218 q 536 111 536 218 z \"\n    },\n    \"¡\": {\n      \"ha\": 322,\n      \"x_min\": 79,\n      \"x_max\": 256,\n      \"o\": \"m 256 857 q 231 789 256 817 q 167 762 206 762 q 103 789 127 762 q 79 857 79 817 q 103 926 79 897 q 167 954 127 954 q 231 926 207 954 q 256 857 256 898 m 253 157 q 252 83 253 132 q 252 9 252 35 q 243 -17 252 -17 q 205 -13 231 -17 q 167 -9 180 -9 q 129 -13 154 -9 q 92 -17 104 -17 q 83 9 83 -17 l 83 415 q 125 675 83 467 q 129 688 127 684 q 139 696 132 696 l 191 696 q 201 672 198 696 q 228 511 207 631 q 253 157 253 369 z \"\n    },\n    \"¬\": {\n      \"ha\": 639,\n      \"x_min\": 81,\n      \"x_max\": 558,\n      \"o\": \"m 558 225 l 474 225 l 474 423 l 81 423 l 81 507 l 558 507 l 558 225 z \"\n    },\n    \"√\": {\n      \"ha\": 1320,\n      \"x_min\": 107,\n      \"x_max\": 1310,\n      \"o\": \"m 1305 920 q 1310 896 1310 903 q 1297 883 1310 886 q 1253 875 1256 876 q 1137 802 1213 864 q 1013 682 1060 741 q 833 395 923 571 q 708 69 736 205 q 692 -52 707 60 q 668 -118 684 -111 q 583 -143 612 -143 q 568 -117 572 -143 q 553 -50 560 -70 q 343 243 495 110 q 235 326 271 306 q 132 366 216 336 q 107 399 107 375 q 116 420 107 412 q 188 507 138 448 q 246 566 218 542 q 272 578 261 578 q 302 568 279 578 q 458 456 375 532 q 570 316 541 380 q 602 277 588 277 q 642 335 618 277 q 755 527 664 390 q 908 734 847 664 q 1225 1047 1124 984 q 1244 1054 1236 1054 q 1278 1013 1261 1054 q 1305 920 1287 989 z \"\n    },\n    \"ƒ\": {\n      \"ha\": 530,\n      \"x_min\": 50,\n      \"x_max\": 492,\n      \"o\": \"m 492 781 q 469 689 492 785 q 458 670 465 670 q 411 686 455 670 q 342 701 367 701 q 290 678 302 701 q 283 616 283 663 q 286 547 283 589 q 452 534 398 547 q 465 524 465 532 q 457 461 465 511 q 446 404 450 408 q 370 401 418 399 q 293 404 290 404 q 323 73 323 197 q 192 -142 323 -88 q 182 -144 186 -144 q 172 -134 178 -144 q 111 -26 140 -67 q 104 -16 108 -22 q 142 21 123 3 q 171 103 171 51 q 144 403 171 282 q 77 399 115 399 q 62 407 65 399 q 50 536 50 530 q 61 546 50 546 q 98 545 73 546 q 135 545 123 545 q 127 653 127 673 q 177 791 127 736 q 309 846 227 846 q 412 829 347 846 q 492 781 492 807 z \"\n    },\n    \"≈\": {\n      \"ha\": 701,\n      \"x_min\": 115,\n      \"x_max\": 586,\n      \"o\": \"m 586 545 q 530 487 586 487 q 460 500 496 487 l 204 598 l 204 491 l 115 491 l 115 633 q 171 691 115 691 q 241 677 205 691 l 497 580 l 497 687 l 586 687 l 586 545 m 586 277 q 530 219 586 219 q 460 233 496 219 l 204 330 l 204 223 l 115 223 l 115 365 q 171 423 115 423 q 241 409 205 423 l 497 312 l 497 419 l 586 419 l 586 277 z \"\n    },\n    \"Δ\": {\n      \"ha\": 555,\n      \"x_min\": 31,\n      \"x_max\": 526,\n      \"o\": \"m 526 0 l 31 0 l 31 83 l 232 1064 l 325 1064 q 431 547 332 1025 q 526 80 526 81 l 526 0 m 432 90 l 277 895 l 122 90 l 432 90 z \"\n    },\n    \"«\": {\n      \"ha\": 699,\n      \"x_min\": 36,\n      \"x_max\": 663,\n      \"o\": \"m 663 528 q 585 456 663 509 q 485 396 517 410 q 473 388 479 394 q 570 327 473 388 q 661 248 661 270 q 659 241 661 246 q 618 149 645 216 q 610 139 615 139 q 473 243 553 184 q 349 317 408 286 q 336 338 336 323 q 336 387 336 354 q 335 436 335 420 q 347 457 335 450 q 484 536 418 494 q 552 589 490 541 q 612 634 611 634 q 619 625 617 634 q 663 528 621 619 m 364 527 q 270 447 364 508 q 175 387 222 417 q 273 327 176 387 q 362 249 362 271 q 359 241 362 247 q 319 149 345 212 q 312 139 316 139 q 174 244 253 185 q 50 317 118 281 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 186 536 134 503 q 254 589 193 541 q 314 634 312 634 q 322 626 319 634 q 364 527 324 618 z \"\n    },\n    \"»\": {\n      \"ha\": 699,\n      \"x_min\": 40,\n      \"x_max\": 667,\n      \"o\": \"m 667 436 q 666 387 667 420 q 665 339 665 354 q 653 317 665 323 q 406 149 498 235 q 391 139 401 144 q 383 149 387 142 q 343 241 372 180 q 340 249 340 246 q 418 319 340 267 q 517 379 486 366 q 528 387 522 381 q 431 447 479 417 q 338 528 338 506 q 382 625 358 568 q 389 634 385 634 q 449 589 391 634 q 518 536 511 541 q 654 457 583 494 q 667 436 667 450 m 368 338 q 355 317 368 323 q 107 149 186 227 q 94 140 103 144 q 86 149 89 142 q 45 241 73 180 q 43 248 43 245 q 57 269 43 256 q 220 379 138 347 q 231 387 224 380 q 134 447 182 417 q 40 528 40 506 q 45 538 40 530 q 83 625 73 593 q 91 634 86 634 q 220 536 149 590 q 355 457 281 496 q 368 436 368 450 l 368 338 z \"\n    },\n    \"…\": {\n      \"ha\": 896,\n      \"x_min\": 46,\n      \"x_max\": 850,\n      \"o\": \"m 850 100 q 820 21 850 55 q 746 -12 790 -12 q 671 22 702 -12 q 643 100 643 55 q 672 177 643 145 q 746 210 701 210 q 820 177 790 210 q 850 100 850 144 m 551 100 q 522 21 551 55 q 447 -12 492 -12 q 373 22 403 -12 q 345 100 345 55 q 374 177 345 145 q 447 210 403 210 q 522 177 492 210 q 551 100 551 144 m 253 100 q 223 21 253 55 q 149 -12 193 -12 q 75 22 104 -12 q 46 100 46 55 q 75 177 46 145 q 149 210 104 210 q 223 177 193 210 q 253 100 253 144 z \"\n    },\n    \" \": {\n      \"ha\": 174,\n      \"x_min\": 0,\n      \"x_max\": 0,\n      \"o\": \"\"\n    },\n    \"À\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 578 1058 q 568 1023 578 1052 q 555 994 559 994 q 544 993 541 994 q 230 1156 307 1104 q 223 1164 227 1158 q 263 1206 229 1176 q 307 1236 296 1236 q 432 1167 323 1236 q 574 1071 532 1104 q 578 1058 579 1067 z \"\n    },\n    \"Ã\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 661 1101 q 603 1053 661 1084 q 517 1021 545 1021 q 436 1044 477 1021 q 375 1068 395 1068 q 327 1046 352 1068 q 298 1023 302 1023 q 285 1029 290 1023 q 225 1088 225 1089 q 227 1093 225 1090 q 284 1147 237 1121 q 361 1173 330 1173 q 445 1150 395 1173 q 515 1128 494 1128 q 564 1152 528 1128 q 604 1175 599 1175 l 611 1173 q 661 1101 661 1122 z \"\n    },\n    \"Õ\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 711 1094 q 653 1046 711 1078 q 567 1014 595 1014 q 486 1038 527 1014 q 425 1061 446 1061 q 377 1039 402 1061 q 349 1017 352 1017 q 335 1023 340 1017 q 275 1081 275 1082 q 277 1086 275 1083 q 334 1141 287 1114 q 412 1166 380 1166 q 495 1143 445 1166 q 566 1121 545 1121 q 614 1145 578 1121 q 654 1168 649 1168 l 661 1166 q 711 1094 711 1115 z \"\n    },\n    \"Œ\": {\n      \"ha\": 1303,\n      \"x_min\": 40,\n      \"x_max\": 1259,\n      \"o\": \"m 1259 136 q 1249 75 1259 119 q 1238 7 1238 30 q 1224 -5 1238 -5 l 1211 -4 q 875 1 1196 -3 q 822 2 848 2 q 791 35 791 7 q 795 88 791 54 q 799 142 798 126 q 671 26 753 70 q 503 -17 589 -17 q 171 132 307 -17 q 40 475 40 277 q 170 819 40 675 q 503 966 304 966 q 673 924 591 966 q 807 809 754 881 q 811 803 811 803 q 813 830 813 803 l 813 885 q 818 951 812 949 q 831 951 819 952 q 906 949 856 951 q 981 947 956 947 q 1099 949 1020 947 q 1217 951 1177 951 q 1240 932 1236 951 q 1255 817 1255 857 q 1240 807 1255 807 q 1120 811 1200 807 q 1000 815 1040 815 q 949 762 958 815 q 947 673 947 753 q 946 648 947 665 q 945 622 945 630 q 1000 553 945 553 q 1115 556 1038 553 q 1231 559 1192 559 q 1249 543 1249 559 q 1247 510 1249 532 q 1246 477 1246 488 q 1247 456 1246 470 q 1249 435 1249 441 q 1240 421 1249 421 q 1155 424 1212 421 q 1070 427 1099 427 q 958 405 974 427 q 949 281 949 390 q 958 168 949 186 q 1053 135 975 135 q 1152 141 1086 135 q 1249 146 1217 146 q 1259 136 1259 146 m 804 475 q 719 709 804 609 q 497 815 629 815 q 282 707 371 815 q 199 475 199 604 q 283 245 199 347 q 497 136 372 136 q 720 240 631 136 q 804 475 804 340 z \"\n    },\n    \"œ\": {\n      \"ha\": 1196,\n      \"x_min\": 26,\n      \"x_max\": 1173,\n      \"o\": \"m 1173 357 q 1129 294 1173 304 q 1000 283 1126 294 l 714 257 q 779 156 722 198 q 893 117 831 117 q 1089 182 1015 117 q 1109 200 1109 200 q 1117 199 1116 200 q 1141 143 1127 175 q 1166 102 1166 100 q 1156 86 1166 98 q 900 -16 1061 -16 q 736 23 816 -16 q 614 135 650 66 q 505 27 583 69 q 355 -12 432 -12 q 117 88 211 -12 q 26 332 26 186 q 118 575 26 477 q 355 676 212 676 q 603 547 513 676 l 615 529 q 725 637 652 596 q 873 678 796 678 q 1091 584 1007 678 q 1173 357 1173 493 m 1013 411 q 966 505 1013 463 q 867 546 920 546 q 753 500 802 546 q 705 390 705 455 q 734 372 705 372 q 974 390 774 372 q 1013 411 1013 394 m 543 332 q 493 476 543 418 q 355 538 440 538 q 218 477 271 538 q 170 332 170 419 q 219 188 170 245 q 355 126 271 126 q 493 188 440 126 q 543 332 543 245 z \"\n    },\n    \"–\": {\n      \"ha\": 785,\n      \"x_min\": 32,\n      \"x_max\": 753,\n      \"o\": \"m 753 467 q 747 400 753 465 q 741 334 741 336 q 728 325 739 325 q 565 326 674 325 q 401 328 456 328 q 225 323 342 328 q 50 319 109 319 q 32 338 32 319 q 45 401 32 356 q 53 465 45 425 q 74 476 57 476 q 220 474 123 476 q 367 472 318 472 q 553 476 429 472 q 739 479 677 479 q 753 467 753 479 z \"\n    },\n    \"—\": {\n      \"ha\": 1104,\n      \"x_min\": 39,\n      \"x_max\": 1069,\n      \"o\": \"m 1069 466 q 1061 401 1069 464 q 1053 334 1054 338 q 1039 325 1051 325 q 806 326 961 325 q 572 328 650 328 q 315 323 486 328 q 58 319 144 319 q 39 338 39 319 q 61 465 39 339 q 83 476 66 476 q 310 474 159 476 q 536 472 460 472 q 794 476 622 472 q 1051 479 966 479 q 1069 466 1069 479 z \"\n    },\n    \"“\": {\n      \"ha\": 526,\n      \"x_min\": 47,\n      \"x_max\": 486,\n      \"o\": \"m 486 629 q 439 577 486 621 q 385 533 392 533 q 370 543 379 533 q 287 713 287 627 q 317 846 287 776 q 392 961 347 916 q 408 972 402 972 q 415 966 411 972 q 465 916 465 911 q 435 869 465 922 q 406 774 406 817 q 446 674 406 719 q 486 629 486 629 m 243 646 q 196 595 243 639 q 145 551 149 551 q 74 627 127 551 q 47 730 47 664 q 158 991 47 876 q 174 1002 168 1002 q 202 977 176 1002 q 229 949 229 953 q 197 901 229 957 q 165 793 165 844 q 185 716 165 751 q 223 671 198 695 q 243 646 243 652 z \"\n    },\n    \"”\": {\n      \"ha\": 526,\n      \"x_min\": 39,\n      \"x_max\": 478,\n      \"o\": \"m 478 817 q 367 555 478 672 q 352 546 357 546 q 323 570 350 546 q 297 598 297 595 q 328 647 297 591 q 359 754 359 703 q 340 831 359 797 q 302 876 328 852 q 282 901 282 895 q 329 952 282 909 q 380 996 376 996 q 452 921 398 996 q 478 817 478 883 m 238 779 q 208 646 238 715 q 134 530 178 576 q 117 520 123 520 q 110 525 114 520 q 60 576 60 581 q 90 623 60 570 q 119 718 119 675 q 79 818 119 773 q 39 863 39 863 q 86 915 39 871 q 140 958 133 958 q 155 949 146 958 q 238 779 238 865 z \"\n    },\n    \"‘\": {\n      \"ha\": 288,\n      \"x_min\": 54,\n      \"x_max\": 254,\n      \"o\": \"m 254 633 q 205 582 254 627 q 153 538 157 538 q 138 546 146 538 q 54 718 54 618 q 87 859 54 782 q 165 979 119 936 q 181 987 174 987 q 210 963 184 987 q 237 936 237 939 q 233 929 237 933 q 180 779 180 861 q 217 677 180 722 q 254 633 254 633 z \"\n    },\n    \"’\": {\n      \"ha\": 288,\n      \"x_min\": 32,\n      \"x_max\": 233,\n      \"o\": \"m 233 803 q 121 542 233 661 q 106 532 111 532 q 97 538 103 532 q 50 583 50 583 q 54 591 50 586 q 103 741 103 659 q 84 820 103 785 q 50 865 73 842 q 32 887 32 883 q 72 926 32 889 q 121 974 115 964 q 133 983 127 983 q 150 974 139 983 q 233 803 233 900 z \"\n    },\n    \"÷\": {\n      \"ha\": 568,\n      \"x_min\": 47,\n      \"x_max\": 521,\n      \"o\": \"m 355 640 q 334 589 355 610 q 283 568 313 568 q 234 589 254 568 q 213 640 213 610 q 234 691 213 670 q 283 712 254 712 q 334 691 313 712 q 355 640 355 670 m 521 424 l 47 424 l 47 509 l 521 509 l 521 424 m 355 292 q 334 241 355 262 q 283 220 313 220 q 234 241 254 220 q 213 292 213 262 q 234 343 213 321 q 283 364 254 364 q 334 343 313 364 q 355 292 355 321 z \"\n    },\n    \"◊\": {\n      \"ha\": 560,\n      \"x_min\": 20,\n      \"x_max\": 541,\n      \"o\": \"m 541 389 l 306 45 l 257 45 l 20 389 l 257 734 l 306 734 l 541 389 m 447 389 l 281 641 l 115 389 l 281 138 l 447 389 z \"\n    },\n    \"ÿ\": {\n      \"ha\": 661,\n      \"x_min\": 24,\n      \"x_max\": 640,\n      \"o\": \"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 558 697 q 534 686 558 686 q 473 685 513 686 q 414 684 433 684 q 397 703 397 684 l 396 842 q 410 859 396 859 q 445 857 421 859 q 481 854 469 854 q 511 855 492 854 q 541 856 531 856 q 557 845 557 856 q 554 807 557 832 q 551 768 551 781 q 555 732 551 756 q 558 697 558 709 m 281 694 q 261 684 281 686 q 222 684 247 683 q 194 686 192 686 q 163 685 184 686 q 132 684 142 684 q 119 696 119 684 q 121 728 119 707 q 122 760 122 749 q 120 801 122 774 q 118 842 118 829 q 134 857 118 857 q 196 857 155 857 q 259 856 238 856 q 279 842 279 856 q 277 804 279 829 q 275 767 275 779 q 278 730 275 755 q 281 694 281 706 z \"\n    },\n    \"Ÿ\": {\n      \"ha\": 815,\n      \"x_min\": 24,\n      \"x_max\": 794,\n      \"o\": \"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 638 1000 q 614 988 638 988 q 553 987 593 988 q 494 987 513 987 q 477 1006 477 987 l 476 1144 q 490 1161 476 1161 q 525 1159 501 1161 q 562 1157 549 1157 q 591 1158 572 1157 q 621 1158 611 1158 q 637 1147 637 1158 q 634 1109 637 1135 q 631 1071 631 1084 q 635 1035 631 1059 q 638 1000 638 1011 m 361 996 q 341 987 361 989 q 302 987 327 985 q 274 989 272 989 q 243 987 264 989 q 212 986 222 986 q 199 999 199 986 q 201 1031 199 1010 q 202 1063 202 1052 q 200 1104 202 1076 q 198 1145 198 1131 q 214 1160 198 1160 q 276 1159 235 1160 q 339 1158 318 1158 q 359 1144 359 1158 q 357 1107 359 1132 q 355 1069 355 1082 q 358 1033 355 1057 q 361 996 361 1008 z \"\n    },\n    \"⁄\": {\n      \"ha\": 424,\n      \"x_min\": -61,\n      \"x_max\": 495,\n      \"o\": \"m 495 789 q 490 777 495 786 q 264 380 413 646 q 44 -41 193 238 q 32 -53 37 -53 q -16 -18 28 -53 q -61 22 -61 18 q -58 32 -61 26 q 395 851 231 525 q 404 860 399 860 q 455 829 414 860 q 495 789 495 798 z \"\n    },\n    \"¤\": {\n      \"ha\": 828,\n      \"x_min\": 96,\n      \"x_max\": 743,\n      \"o\": \"m 743 745 l 623 625 l 623 357 l 743 237 l 663 157 l 531 288 l 307 288 l 176 157 l 96 237 l 216 357 l 216 625 l 96 745 l 176 825 l 308 694 l 532 694 l 663 825 l 743 745 m 511 389 l 511 594 l 328 594 l 328 389 l 511 389 z \"\n    },\n    \"‹\": {\n      \"ha\": 406,\n      \"x_min\": 36,\n      \"x_max\": 380,\n      \"o\": \"m 380 524 q 207 388 380 500 q 296 330 208 386 q 374 256 374 281 q 355 205 374 252 q 332 149 334 155 q 325 139 331 144 q 191 239 268 182 q 50 317 155 262 q 37 338 37 323 q 37 387 37 354 q 36 436 36 420 q 49 457 36 450 q 315 628 182 528 q 328 634 319 631 q 335 625 332 632 q 376 534 347 595 q 380 524 380 528 z \"\n    },\n    \"›\": {\n      \"ha\": 406,\n      \"x_min\": 24,\n      \"x_max\": 370,\n      \"o\": \"m 370 338 q 357 317 370 323 q 96 149 194 231 q 81 139 91 144 q 74 149 77 142 q 29 245 60 181 q 26 252 26 250 q 104 324 26 274 q 203 379 170 367 q 213 387 208 380 q 117 446 165 416 q 24 524 24 503 q 47 569 24 525 q 72 625 69 613 q 79 634 75 634 q 92 628 83 634 q 214 538 132 597 q 357 457 264 505 q 370 436 370 450 l 370 338 z \"\n    },\n    \"\": {\n      \"ha\": 705,\n      \"x_min\": 12,\n      \"x_max\": 644,\n      \"o\": \"m 644 630 q 637 471 644 577 q 631 311 631 364 q 634 164 631 262 q 637 17 637 66 q 625 1 637 1 l 496 1 q 479 24 479 1 q 482 143 479 64 q 485 261 485 222 q 484 372 485 298 q 484 484 484 446 q 463 505 484 504 q 250 510 391 505 q 255 265 250 429 q 260 18 260 100 q 245 0 260 0 l 123 0 q 106 21 106 0 l 106 489 q 92 504 106 500 q 65 505 83 507 q 43 503 41 503 q 17 510 18 503 q 12 619 12 525 q 50 635 12 630 q 98 637 75 636 q 96 715 96 689 q 369 983 96 983 q 555 940 463 983 q 566 929 566 936 q 555 863 566 910 q 533 807 544 807 q 472 831 528 807 q 385 854 416 854 q 269 809 301 854 q 243 684 243 772 q 244 640 243 664 q 365 638 281 640 q 485 636 444 636 q 557 637 533 636 q 595 642 567 638 q 633 645 620 645 q 644 630 644 645 z \"\n    },\n    \"\": {\n      \"ha\": 721,\n      \"x_min\": 16,\n      \"x_max\": 669,\n      \"o\": \"m 669 934 q 665 922 669 930 q 649 683 650 892 q 650 436 650 852 q 652 232 650 368 q 654 28 654 96 q 643 0 654 0 l 513 0 q 500 16 500 0 q 502 226 500 85 q 504 436 504 366 l 504 521 q 252 514 420 521 q 257 266 252 433 q 262 18 262 101 q 249 0 262 0 l 126 0 q 109 21 109 0 l 109 492 q 95 507 109 503 q 68 508 86 509 q 45 505 43 505 q 20 513 22 505 q 16 621 16 524 q 54 636 16 632 q 102 639 77 637 q 96 705 96 671 q 173 916 96 840 q 387 992 251 992 q 652 949 517 992 q 669 934 669 943 m 509 852 q 376 867 422 867 q 273 810 311 867 q 240 692 240 760 q 244 643 240 668 l 503 643 q 509 852 503 805 z \"\n    },\n    \"‡\": {\n      \"ha\": 607,\n      \"x_min\": 35,\n      \"x_max\": 570,\n      \"o\": \"m 570 637 q 569 582 570 619 q 568 527 568 545 q 549 509 568 509 q 372 517 541 509 q 370 446 372 494 q 368 374 368 397 q 371 235 368 393 q 550 240 532 240 q 567 226 563 240 q 569 196 570 216 q 567 171 567 167 q 569 144 567 174 q 568 113 570 123 q 549 98 563 98 q 375 104 536 98 q 378 -45 376 62 q 380 -195 380 -140 q 367 -227 380 -227 l 236 -227 q 220 -220 223 -227 q 219 -201 219 -217 q 222 -48 219 -142 q 227 104 226 76 q 142 101 203 104 q 57 98 88 98 q 38 113 43 98 q 37 144 35 123 q 39 171 39 173 q 37 196 39 168 q 38 226 36 216 q 52 240 41 240 q 142 237 83 240 q 232 233 205 234 q 233 298 232 245 q 235 361 235 337 l 235 515 q 147 511 221 515 q 60 509 94 509 q 39 524 39 509 q 38 580 39 543 q 37 636 37 617 q 52 652 37 652 q 139 650 84 652 q 227 647 205 648 q 223 797 226 684 q 221 946 221 890 q 236 971 221 971 l 372 971 q 385 956 385 971 q 379 647 385 865 q 466 650 400 648 q 553 652 520 652 q 570 637 570 652 z \"\n    },\n    \"·\": {\n      \"ha\": 298,\n      \"x_min\": 46,\n      \"x_max\": 253,\n      \"o\": \"m 253 501 q 223 423 253 456 q 149 390 193 390 q 75 423 104 390 q 46 501 46 456 q 75 579 46 547 q 149 611 104 611 q 223 578 193 611 q 253 501 253 546 z \"\n    },\n    \"‚\": {\n      \"ha\": 288,\n      \"x_min\": 33,\n      \"x_max\": 232,\n      \"o\": \"m 232 48 q 198 -85 232 -11 q 121 -201 165 -160 q 105 -210 112 -210 q 77 -186 103 -210 q 51 -159 51 -161 q 82 -110 51 -167 q 114 -1 114 -52 q 73 98 114 52 q 33 143 33 144 q 83 196 33 151 q 135 240 131 240 q 150 232 140 240 q 232 48 232 158 z \"\n    },\n    \"„\": {\n      \"ha\": 526,\n      \"x_min\": 28,\n      \"x_max\": 448,\n      \"o\": \"m 448 113 q 336 -149 448 -33 q 321 -159 327 -159 q 293 -134 319 -159 q 267 -106 267 -110 q 298 -58 267 -114 q 329 50 329 -1 q 309 127 329 93 q 271 172 297 148 q 252 197 252 191 q 298 248 252 204 q 349 292 345 292 q 421 216 368 292 q 448 113 448 179 m 227 59 q 197 -75 227 -5 q 121 -189 168 -141 q 105 -199 111 -199 q 97 -195 102 -199 q 50 -143 50 -140 q 79 -97 50 -150 q 109 -1 109 -44 q 68 99 109 54 q 28 144 28 144 q 75 195 28 151 q 129 239 122 239 q 144 229 135 239 q 227 59 227 146 z \"\n    },\n    \"‰\": {\n      \"ha\": 1522,\n      \"x_min\": 32,\n      \"x_max\": 1491,\n      \"o\": \"m 1491 253 q 1433 76 1491 153 q 1274 -8 1371 -8 q 1114 76 1177 -8 q 1055 253 1055 153 q 1114 431 1055 353 q 1274 515 1177 515 q 1433 431 1371 515 q 1491 253 1491 353 m 990 253 q 933 76 990 153 q 774 -8 871 -8 q 613 76 676 -8 q 555 253 555 153 q 613 431 555 353 q 774 515 677 515 q 933 431 871 515 q 990 253 990 353 m 718 812 q 713 796 718 806 q 533 412 652 669 q 370 -1 479 292 q 356 -20 362 -20 q 321 -4 347 -20 q 296 20 296 12 q 302 40 296 27 q 397 233 342 113 q 489 428 469 388 q 572 627 524 498 q 648 833 610 730 q 662 850 655 850 q 694 836 671 850 q 718 812 718 821 m 467 583 q 410 406 467 483 q 250 322 347 322 q 90 406 153 322 q 32 583 32 483 q 90 761 32 684 q 250 846 153 846 q 410 761 347 846 q 467 583 467 684 m 1378 253 q 1354 351 1378 308 q 1274 403 1324 403 q 1193 351 1223 403 q 1168 253 1168 308 q 1194 157 1168 201 q 1274 104 1225 104 q 1354 155 1324 104 q 1378 253 1378 198 m 878 253 q 854 351 878 308 q 774 403 825 403 q 693 351 722 403 q 668 253 668 308 q 694 157 668 201 q 774 104 725 104 q 853 155 824 104 q 878 253 878 198 m 354 583 q 330 682 354 638 q 250 733 301 733 q 170 681 199 733 q 144 583 144 637 q 171 487 144 532 q 250 435 202 435 q 330 486 300 435 q 354 583 354 529 z \"\n    },\n    \"Â\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 644 1020 q 610 1001 642 1017 q 572 985 578 985 q 445 1096 552 985 q 388 1034 438 1092 q 326 985 345 985 q 287 1002 321 985 q 254 1021 254 1019 q 345 1129 292 1064 q 399 1221 383 1187 q 414 1232 404 1232 l 485 1232 q 497 1221 494 1232 q 550 1129 508 1187 q 644 1020 597 1076 z \"\n    },\n    \"Ê\": {\n      \"ha\": 747,\n      \"x_min\": 68,\n      \"x_max\": 713,\n      \"o\": \"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 576 1025 q 542 1006 574 1022 q 504 990 510 990 q 377 1101 484 990 q 320 1040 370 1097 q 258 991 277 991 q 219 1007 253 991 q 186 1026 186 1024 q 277 1135 224 1069 q 331 1227 315 1193 q 346 1238 336 1238 l 417 1238 q 429 1227 426 1238 q 482 1135 440 1192 q 576 1025 529 1081 z \"\n    },\n    \"Á\": {\n      \"ha\": 916,\n      \"x_min\": 6,\n      \"x_max\": 909,\n      \"o\": \"m 909 8 q 893 0 909 0 q 856 2 880 0 q 818 4 831 4 q 779 2 805 4 q 741 0 753 0 q 692 103 722 0 q 632 207 663 205 q 501 208 607 208 l 394 208 q 267 207 282 208 q 215 102 242 205 q 172 0 187 0 l 20 0 q 6 9 6 0 q 16 40 6 16 l 182 494 q 309 811 203 549 q 361 942 328 854 q 378 968 369 968 q 416 964 391 968 q 454 961 441 961 q 491 965 467 961 q 528 968 516 968 q 545 943 534 968 q 705 534 561 905 q 909 8 909 13 m 593 382 q 532 559 593 402 q 449 758 473 711 q 309 383 309 400 q 360 356 309 360 q 427 355 363 355 l 496 355 q 593 382 593 355 m 642 1166 q 492 1063 632 1139 q 323 989 356 989 q 302 1023 311 989 q 296 1068 296 1050 q 309 1081 296 1075 q 541 1228 420 1137 q 551 1234 543 1231 q 559 1228 554 1233 q 635 1175 589 1204 q 642 1166 638 1173 z \"\n    },\n    \"Ë\": {\n      \"ha\": 747,\n      \"x_min\": 68,\n      \"x_max\": 713,\n      \"o\": \"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 595 1008 q 570 996 595 996 q 510 996 550 996 q 450 995 470 995 q 433 1014 433 995 l 433 1152 q 446 1169 433 1169 q 482 1167 458 1169 q 518 1165 506 1165 q 548 1166 528 1165 q 577 1166 568 1166 q 593 1156 593 1166 q 591 1117 593 1143 q 588 1079 588 1092 q 591 1043 588 1067 q 595 1008 595 1019 m 317 1004 q 298 995 317 997 q 258 995 283 994 q 231 997 229 997 q 200 996 220 997 q 169 994 179 994 q 156 1007 156 994 q 157 1039 156 1018 q 159 1071 159 1060 q 157 1112 159 1084 q 155 1153 155 1139 q 171 1168 155 1168 q 233 1167 191 1168 q 295 1166 275 1166 q 316 1152 316 1166 q 314 1115 316 1140 q 311 1078 311 1090 q 314 1041 311 1065 q 317 1004 317 1017 z \"\n    },\n    \"È\": {\n      \"ha\": 747,\n      \"x_min\": 68,\n      \"x_max\": 713,\n      \"o\": \"m 713 136 q 707 105 713 125 q 700 74 701 79 q 690 3 698 50 q 673 -9 687 -9 q 647 -7 666 -9 q 389 5 564 5 q 239 3 339 5 q 90 0 140 0 q 68 20 68 0 q 76 248 68 96 q 85 476 85 400 q 77 764 85 553 q 69 926 75 819 l 68 936 q 86 951 68 951 q 229 949 134 951 q 371 946 323 946 q 507 949 416 946 q 643 951 597 951 q 677 932 675 951 q 692 821 692 842 q 677 805 692 805 q 502 811 619 805 q 326 818 385 818 q 256 803 271 818 q 241 729 241 788 l 241 628 q 243 580 241 587 q 279 559 250 559 q 302 559 287 559 q 325 559 317 559 q 564 564 458 559 q 661 571 605 566 q 675 559 675 572 q 670 492 675 537 q 665 425 665 448 q 645 413 665 413 q 585 418 637 413 q 414 422 547 422 q 272 419 302 422 q 241 391 245 417 q 241 338 241 395 l 241 238 q 263 150 241 168 q 348 136 280 136 l 422 136 q 689 153 470 136 l 699 153 q 713 136 713 155 m 559 1046 q 549 1011 559 1040 q 536 983 540 983 q 525 981 522 983 q 211 1144 288 1093 q 204 1152 208 1146 q 244 1195 210 1164 q 288 1225 277 1225 q 413 1156 304 1225 q 555 1059 513 1093 q 559 1046 560 1055 z \"\n    },\n    \"Í\": {\n      \"ha\": 329,\n      \"x_min\": 21,\n      \"x_max\": 368,\n      \"o\": \"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 368 1149 q 218 1046 357 1122 q 49 972 81 972 q 28 1006 37 972 q 21 1051 21 1033 q 34 1064 21 1058 q 266 1211 146 1120 q 276 1217 269 1214 q 285 1211 279 1216 q 360 1158 314 1187 q 368 1149 363 1156 z \"\n    },\n    \"Î\": {\n      \"ha\": 329,\n      \"x_min\": -30,\n      \"x_max\": 361,\n      \"o\": \"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 361 1027 q 327 1007 359 1023 q 288 991 294 991 q 161 1103 269 991 q 104 1041 155 1099 q 43 992 62 992 q 4 1009 37 992 q -30 1027 -30 1025 q 61 1136 8 1071 q 115 1228 100 1194 q 130 1239 120 1239 l 201 1239 q 214 1228 210 1239 q 267 1136 224 1194 q 361 1027 313 1082 z \"\n    },\n    \"Ï\": {\n      \"ha\": 329,\n      \"x_min\": -62,\n      \"x_max\": 378,\n      \"o\": \"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 378 1005 q 353 994 378 994 q 293 993 333 994 q 233 992 253 992 q 216 1011 216 992 l 216 1149 q 229 1166 216 1166 q 265 1164 241 1166 q 301 1162 289 1162 q 331 1163 311 1162 q 360 1164 351 1164 q 376 1153 376 1164 q 374 1115 376 1140 q 371 1076 371 1089 q 374 1040 371 1064 q 378 1005 378 1017 m 100 1002 q 81 992 100 994 q 41 992 66 991 q 14 994 12 994 q -17 993 3 994 q -48 991 -38 991 q -61 1004 -61 991 q -60 1036 -61 1015 q -58 1068 -58 1057 q -60 1109 -58 1082 q -62 1150 -62 1137 q -46 1165 -62 1165 q 16 1164 -26 1165 q 78 1164 58 1164 q 99 1149 99 1164 q 97 1112 99 1137 q 94 1075 94 1087 q 97 1038 94 1063 q 100 1002 100 1014 z \"\n    },\n    \"Ì\": {\n      \"ha\": 329,\n      \"x_min\": -16,\n      \"x_max\": 340,\n      \"o\": \"m 257 14 q 237 0 257 0 q 200 2 225 0 q 163 4 175 4 q 125 2 150 4 q 87 0 100 0 q 71 16 71 0 q 78 249 71 93 q 85 482 85 404 q 78 708 85 557 q 71 935 71 859 q 86 951 71 951 q 125 949 99 951 q 165 947 152 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 251 710 256 862 q 245 482 245 558 q 251 248 245 404 q 257 14 257 92 m 339 1037 q 330 1002 339 1031 q 317 973 320 973 q 305 972 302 973 q -9 1135 68 1083 q -16 1143 -12 1137 q 24 1185 -9 1155 q 68 1215 58 1215 q 193 1146 85 1215 q 335 1050 293 1083 q 339 1037 340 1046 z \"\n    },\n    \"Ó\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 701 1159 q 551 1056 690 1131 q 382 982 414 982 q 361 1016 370 982 q 354 1061 354 1042 q 367 1074 354 1067 q 599 1221 479 1129 q 609 1227 602 1223 q 618 1221 612 1225 q 693 1168 647 1196 q 701 1159 696 1166 z \"\n    },\n    \"Ô\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 693 1024 q 659 1005 691 1021 q 621 989 627 989 q 494 1100 601 989 q 437 1038 487 1096 q 375 989 394 989 q 336 1006 370 989 q 302 1025 302 1023 q 393 1133 340 1068 q 448 1225 432 1192 q 463 1236 452 1236 l 534 1236 q 546 1225 543 1236 q 599 1133 557 1191 q 693 1024 646 1080 z \"\n    },\n    \"Ò\": {\n      \"ha\": 1007,\n      \"x_min\": 41,\n      \"x_max\": 966,\n      \"o\": \"m 966 476 q 838 130 966 275 q 504 -21 703 -21 q 170 129 304 -21 q 41 476 41 273 q 172 823 41 677 q 504 974 306 974 q 837 823 703 974 q 966 476 966 677 m 803 478 q 720 709 803 611 q 503 814 633 814 q 287 708 373 814 q 205 476 205 609 q 287 245 205 344 q 503 139 373 139 q 721 245 634 139 q 803 478 803 344 m 678 1048 q 669 1013 678 1042 q 656 984 659 984 q 644 983 641 984 q 330 1145 407 1094 q 323 1154 328 1147 q 363 1196 330 1166 q 408 1226 397 1226 q 532 1157 424 1226 q 674 1061 632 1094 q 678 1048 680 1057 z \"\n    },\n    \"Ú\": {\n      \"ha\": 917,\n      \"x_min\": 68,\n      \"x_max\": 848,\n      \"o\": \"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 703 1136 q 553 1033 693 1108 q 385 959 417 959 q 363 993 372 959 q 357 1038 357 1019 q 370 1050 357 1044 q 602 1198 481 1106 q 612 1204 604 1200 q 621 1198 615 1202 q 696 1145 650 1173 q 703 1136 699 1143 z \"\n    },\n    \"Û\": {\n      \"ha\": 917,\n      \"x_min\": 68,\n      \"x_max\": 848,\n      \"o\": \"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 664 1019 q 630 999 662 1015 q 591 983 597 983 q 465 1095 572 983 q 408 1033 458 1090 q 346 984 365 984 q 307 1001 340 984 q 273 1019 273 1017 q 364 1128 311 1063 q 418 1220 403 1186 q 433 1231 423 1231 l 505 1231 q 517 1220 513 1231 q 570 1128 528 1185 q 664 1019 616 1074 z \"\n    },\n    \"Ù\": {\n      \"ha\": 917,\n      \"x_min\": 68,\n      \"x_max\": 848,\n      \"o\": \"m 848 937 q 841 701 848 858 q 835 465 835 544 q 836 388 835 439 q 836 312 836 337 q 810 115 836 170 q 652 1 769 31 q 449 -17 580 -17 q 138 62 212 -17 q 81 306 81 123 q 81 381 81 328 q 82 465 82 435 q 75 760 82 545 q 69 926 75 816 q 68 937 68 935 q 86 951 68 951 q 161 951 114 951 q 236 950 216 950 q 252 938 252 950 q 247 628 252 835 q 243 318 243 421 q 295 160 243 201 q 460 123 340 123 q 615 153 569 123 q 673 293 673 191 q 670 615 673 400 q 667 937 667 829 q 686 950 667 947 q 727 950 701 952 q 757 947 758 947 q 794 949 769 947 q 831 951 819 951 q 848 937 848 951 m 613 1038 q 604 1003 613 1032 q 591 975 594 975 q 579 973 576 975 q 265 1136 342 1084 q 258 1144 262 1138 q 298 1186 264 1156 q 342 1217 332 1217 q 467 1147 359 1217 q 609 1051 567 1084 q 613 1038 614 1047 z \"\n    },\n    \"ı\": {\n      \"ha\": 306,\n      \"x_min\": 62,\n      \"x_max\": 241,\n      \"o\": \"m 241 627 q 234 470 241 575 q 228 311 228 364 q 230 163 228 262 q 232 16 232 64 q 220 1 232 1 l 87 1 q 73 29 73 1 q 76 170 73 76 q 78 311 78 264 q 70 470 78 364 q 62 629 62 576 q 77 640 62 640 q 114 637 89 640 q 153 633 140 633 q 191 637 165 633 q 229 640 216 640 q 241 627 241 640 z \"\n    },\n    \"ˆ\": {\n      \"ha\": 485,\n      \"x_min\": 48,\n      \"x_max\": 439,\n      \"o\": \"m 439 771 q 405 752 437 768 q 366 736 372 736 q 239 847 347 736 q 182 785 233 843 q 121 736 140 736 q 82 753 115 736 q 48 772 48 770 q 139 880 86 815 q 193 972 178 939 q 208 983 198 983 l 279 983 q 292 972 288 983 q 345 880 302 938 q 439 771 391 827 z \"\n    },\n    \"˜\": {\n      \"ha\": 485,\n      \"x_min\": 25,\n      \"x_max\": 461,\n      \"o\": \"m 461 842 q 403 794 461 826 q 317 762 345 762 q 236 786 277 762 q 175 810 195 810 q 127 787 152 810 q 98 765 102 765 q 85 771 90 765 q 25 829 25 831 q 26 835 25 831 q 84 889 37 863 q 161 914 130 914 q 244 892 195 914 q 315 869 294 869 q 363 893 328 869 q 404 917 399 917 l 411 914 q 461 842 461 863 z \"\n    },\n    \"¯\": {\n      \"ha\": 485,\n      \"x_min\": 25,\n      \"x_max\": 472,\n      \"o\": \"m 472 893 q 460 840 472 890 q 450 785 456 814 q 410 777 447 778 q 341 777 385 776 q 292 779 290 779 q 168 774 250 779 q 45 768 85 768 q 25 787 25 768 q 45 851 25 803 q 75 899 64 899 q 144 895 98 899 q 214 892 191 892 q 337 897 255 892 q 460 901 419 901 q 472 893 472 901 z \"\n    },\n    \"˘\": {\n      \"ha\": 485,\n      \"x_min\": 32,\n      \"x_max\": 444,\n      \"o\": \"m 444 940 q 390 784 444 844 q 239 721 334 721 q 86 783 143 721 q 32 940 32 844 q 52 951 32 951 q 121 939 119 951 q 130 903 124 927 q 239 823 157 823 q 347 901 319 823 q 355 939 349 914 q 382 949 359 949 q 444 940 444 949 z \"\n    },\n    \"˙\": {\n      \"ha\": 485,\n      \"x_min\": 141,\n      \"x_max\": 320,\n      \"o\": \"m 320 783 q 294 764 320 764 l 168 764 q 142 802 142 764 q 142 862 142 822 q 141 922 141 903 q 153 947 141 943 q 168 949 158 949 q 222 948 186 949 q 275 947 258 947 q 309 943 302 947 q 317 912 317 937 q 317 882 317 902 q 317 852 317 863 q 318 818 317 841 q 320 783 320 794 z \"\n    },\n    \"˚\": {\n      \"ha\": 485,\n      \"x_min\": 78,\n      \"x_max\": 401,\n      \"o\": \"m 401 832 q 353 720 401 766 q 239 673 305 673 q 125 720 173 673 q 78 832 78 766 q 125 947 78 899 q 239 994 172 994 q 354 947 307 994 q 401 832 401 899 m 321 832 q 298 894 321 868 q 239 920 275 920 q 180 894 203 920 q 157 832 157 868 q 181 775 157 800 q 237 750 205 750 q 296 774 271 750 q 321 832 321 798 z \"\n    },\n    \"¸\": {\n      \"ha\": 485,\n      \"x_min\": 39,\n      \"x_max\": 340,\n      \"o\": \"m 340 -77 q 292 -219 340 -165 q 153 -275 241 -275 q 85 -254 127 -275 q 39 -213 39 -233 q 74 -170 39 -211 q 112 -128 109 -128 q 114 -129 113 -128 q 175 -158 144 -158 q 218 -138 199 -158 q 237 -93 237 -117 q 205 -18 237 -52 l 297 -20 q 340 -77 312 -38 z \"\n    },\n    \"˝\": {\n      \"ha\": 485,\n      \"x_min\": 14,\n      \"x_max\": 515,\n      \"o\": \"m 515 941 q 504 926 515 936 q 347 829 446 876 q 174 766 255 786 q 162 765 166 765 q 140 799 146 765 q 25 748 63 748 q 14 758 14 748 q 16 773 14 763 q 18 789 18 784 q 17 806 18 795 q 15 822 15 817 q 26 835 15 830 q 279 986 109 869 q 294 995 284 990 q 324 968 302 991 q 354 945 347 945 q 393 973 362 945 q 430 1002 424 1002 q 475 973 435 1002 q 515 941 515 945 z \"\n    },\n    \"˛\": {\n      \"ha\": 485,\n      \"x_min\": 110,\n      \"x_max\": 398,\n      \"o\": \"m 398 -162 q 334 -224 378 -199 q 246 -248 290 -248 q 148 -211 186 -248 q 110 -115 110 -174 q 113 -82 110 -100 q 159 -36 124 -66 q 210 -3 197 -3 l 301 -3 q 214 -111 214 -60 q 260 -152 214 -152 q 319 -133 292 -152 q 348 -113 347 -113 q 376 -135 354 -113 q 398 -162 398 -157 z \"\n    },\n    \"ˇ\": {\n      \"ha\": 485,\n      \"x_min\": 45,\n      \"x_max\": 435,\n      \"o\": \"m 435 953 q 345 844 397 910 q 290 753 306 787 q 275 742 285 742 l 204 742 q 192 753 195 742 q 139 844 180 787 q 45 954 92 898 q 79 974 46 958 q 117 989 111 989 q 244 878 137 989 q 301 940 251 882 q 362 988 344 988 q 401 972 368 988 q 435 953 435 956 z \"\n    },\n    \"Ł\": {\n      \"ha\": 718,\n      \"x_min\": -1,\n      \"x_max\": 710,\n      \"o\": \"m 710 147 q 700 12 710 52 q 676 -7 695 -7 q 526 -2 626 -7 q 375 4 425 4 q 233 2 328 4 q 92 0 139 0 q 75 17 75 0 q 80 240 75 91 q 85 464 85 389 q 78 700 85 543 q 71 935 71 857 q 87 950 71 950 q 125 948 100 950 q 163 946 150 946 q 201 948 175 946 q 239 950 227 950 q 255 937 255 950 q 250 721 255 865 q 244 504 244 576 q 244 397 244 469 q 243 290 243 325 q 256 139 243 139 q 633 151 506 139 q 665 156 640 152 q 696 160 685 160 q 710 147 710 160 m 492 519 q 479 507 492 513 q 309 438 422 484 q 22 322 214 399 q 16 321 19 321 q 1 335 7 321 l -1 444 q 12 458 -1 452 q 465 640 463 640 q 475 628 473 640 q 492 519 492 536 z \"\n    },\n    \"ł\": {\n      \"ha\": 306,\n      \"x_min\": -28,\n      \"x_max\": 399,\n      \"o\": \"m 274 941 l 273 932 q 258 498 258 680 q 261 257 258 418 q 264 16 264 96 q 253 0 264 0 l 123 0 q 111 16 111 0 q 113 257 111 96 q 114 498 114 418 q 107 719 114 572 q 100 938 100 865 q 114 951 100 951 q 151 949 126 951 q 187 947 175 947 q 225 949 200 947 q 262 951 250 951 q 274 941 275 951 m 399 495 q 386 488 399 493 q -9 332 251 432 q -25 346 -19 332 l -28 456 q -14 469 -28 464 q 372 621 360 621 q 382 608 380 621 q 399 495 399 518 z \"\n    },\n    \"Š\": {\n      \"ha\": 648,\n      \"x_min\": 75,\n      \"x_max\": 614,\n      \"o\": \"m 614 883 q 576 815 600 861 q 550 755 569 794 q 539 749 546 749 q 474 773 540 749 q 365 798 408 798 q 240 688 240 798 q 328 581 240 627 q 490 493 475 505 q 578 304 578 423 q 458 65 578 153 q 193 -14 350 -14 q 114 3 119 -14 q 102 78 111 28 q 85 139 96 98 q 83 151 83 145 q 93 160 83 160 q 143 157 109 160 q 193 153 176 153 q 404 289 404 153 q 319 404 404 355 q 161 496 164 492 q 75 682 75 565 q 158 884 75 808 q 367 957 239 957 q 492 939 421 957 q 607 892 568 920 q 614 883 610 889 m 560 1197 q 469 1088 522 1154 q 415 997 431 1031 q 400 986 410 986 l 329 986 q 317 997 320 986 q 264 1088 305 1031 q 170 1198 216 1142 q 203 1218 171 1202 q 241 1234 236 1234 q 369 1122 262 1234 q 426 1184 376 1126 q 487 1232 469 1232 q 526 1216 493 1232 q 560 1197 559 1200 z \"\n    },\n    \"š\": {\n      \"ha\": 415,\n      \"x_min\": 14,\n      \"x_max\": 405,\n      \"o\": \"m 387 209 q 306 47 387 108 q 127 -9 233 -9 q 81 -7 87 -9 q 70 26 70 -1 q 66 71 70 41 q 62 115 62 101 q 75 127 62 124 q 100 127 83 129 q 120 125 121 125 q 248 203 248 125 q 192 272 248 241 q 87 334 100 322 q 31 460 31 382 q 107 618 31 562 q 282 669 176 669 q 296 661 292 669 q 313 606 300 652 q 326 550 326 559 q 313 541 326 543 q 225 529 269 534 q 173 472 173 515 q 228 410 173 441 q 331 345 309 365 q 387 209 387 292 m 405 911 q 314 803 367 869 q 260 711 275 745 q 245 701 254 701 l 174 701 q 161 711 165 701 q 109 803 150 745 q 14 912 61 857 q 48 932 16 916 q 86 948 81 948 q 214 836 106 948 q 271 899 220 841 q 332 947 313 947 q 371 930 338 947 q 405 911 404 914 z \"\n    },\n    \"Ž\": {\n      \"ha\": 701,\n      \"x_min\": 26,\n      \"x_max\": 662,\n      \"o\": \"m 662 155 q 653 83 662 132 q 644 9 644 34 q 628 -5 644 -5 q 507 -3 587 -5 q 386 0 427 0 l 64 0 q 41 14 45 0 q 26 127 26 90 q 233 459 26 134 q 439 800 439 783 q 422 807 439 807 l 61 807 q 47 821 47 807 q 57 882 47 826 q 70 948 67 939 q 85 957 72 957 q 164 952 112 957 q 241 947 216 947 l 623 947 q 637 936 635 947 q 648 835 648 895 q 433 494 648 831 q 218 146 218 157 q 231 142 221 142 q 532 150 427 142 q 593 157 545 151 q 653 163 631 163 q 662 155 662 163 m 549 1189 q 458 1080 511 1146 q 404 989 420 1023 q 389 978 399 978 l 318 978 q 306 989 309 978 q 253 1080 294 1023 q 159 1190 205 1134 q 193 1210 160 1194 q 231 1225 225 1225 q 358 1114 251 1225 q 415 1176 365 1118 q 476 1224 458 1224 q 515 1208 482 1224 q 549 1189 549 1192 z \"\n    },\n    \"ž\": {\n      \"ha\": 585,\n      \"x_min\": 21,\n      \"x_max\": 572,\n      \"o\": \"m 572 129 q 562 81 572 125 q 550 21 551 33 q 538 -3 547 -3 q 474 0 514 -3 q 411 4 429 3 q 281 5 366 5 q 135 0 215 5 q 49 -7 35 -7 q 31 5 35 -7 q 21 81 21 38 q 22 99 21 87 q 22 115 22 110 q 37 138 22 125 q 182 292 52 151 q 368 503 248 360 l 69 503 q 58 517 58 503 q 67 575 58 536 q 75 633 75 614 q 94 642 75 642 q 208 638 132 642 q 321 635 283 635 q 530 632 507 635 q 547 618 547 630 q 539 503 547 515 q 422 369 532 493 q 207 129 351 288 q 557 135 433 135 q 572 129 572 135 m 503 895 q 412 786 465 852 q 358 694 374 728 q 343 684 353 684 l 272 684 q 260 694 263 684 q 207 786 248 728 q 113 895 159 840 q 146 915 114 899 q 184 931 179 931 q 312 819 205 931 q 369 882 319 824 q 430 930 412 930 q 469 913 436 930 q 503 895 503 897 z \"\n    },\n    \"¦\": {\n      \"ha\": 340,\n      \"x_min\": 107,\n      \"x_max\": 232,\n      \"o\": \"m 232 481 q 224 473 232 474 q 119 464 163 464 q 114 471 114 464 l 114 761 q 111 896 114 806 q 107 1031 107 986 q 181 1052 107 1052 q 225 1042 224 1052 q 223 961 223 1057 l 224 770 q 228 625 224 723 q 232 481 232 530 m 232 -220 q 224 -229 232 -228 q 119 -238 163 -238 q 114 -231 114 -238 l 114 59 q 111 194 114 104 q 107 329 107 284 q 181 351 107 351 q 225 340 224 351 q 223 259 223 355 l 224 68 q 228 -77 224 22 q 232 -220 232 -172 z \"\n    },\n    \"Ð\": {\n      \"ha\": 945,\n      \"x_min\": -18,\n      \"x_max\": 905,\n      \"o\": \"m 905 481 q 797 151 905 290 q 494 0 679 0 q 388 3 459 0 q 282 5 317 5 q 186 3 250 5 q 90 0 122 0 q 73 17 73 0 q 79 240 73 91 q 85 464 85 389 q 79 701 85 543 q 74 937 74 859 q 92 951 74 951 q 166 951 117 951 q 241 950 216 950 q 312 951 264 950 q 384 951 359 951 q 734 863 619 951 q 863 691 817 799 q 905 481 905 591 m 739 481 q 656 720 739 627 q 424 815 569 815 q 327 817 304 815 q 248 787 248 812 q 245 631 248 735 q 243 475 243 527 q 245 320 243 423 q 248 165 248 217 q 329 136 248 140 q 428 136 318 136 q 552 153 506 136 q 654 228 609 173 q 739 481 739 331 m 443 530 q 427 468 443 541 q 418 410 425 448 q 401 403 416 403 q 299 404 368 403 q 197 406 231 406 q 98 401 164 406 q 0 396 33 396 q -18 416 -18 396 q 21 532 -18 439 q 40 542 25 542 q 429 547 83 542 q 443 530 443 541 z \"\n    },\n    \"ð\": {\n      \"ha\": 772,\n      \"x_min\": 28,\n      \"x_max\": 806,\n      \"o\": \"m 721 946 q 713 684 721 859 q 705 422 705 509 q 717 17 705 155 l 718 8 q 699 -1 718 1 q 663 -1 686 -2 q 636 1 634 1 q 606 -1 626 1 q 576 -3 587 -3 q 565 44 567 -3 q 560 92 564 92 q 550 83 556 90 q 336 -17 457 -17 q 111 87 199 -17 q 28 325 28 186 q 112 568 28 469 q 342 671 200 671 q 491 621 427 671 q 549 570 520 595 q 554 579 554 572 l 554 799 q 552 867 554 821 q 550 935 550 912 q 561 951 550 951 q 635 956 586 951 q 709 960 685 960 q 721 946 721 960 m 551 329 q 501 472 551 410 q 368 538 448 538 q 231 473 285 538 q 179 326 179 412 q 233 184 179 245 q 368 121 288 121 q 503 185 450 121 q 551 329 551 245 m 806 852 q 791 787 806 857 q 783 736 789 764 q 407 724 777 724 q 392 742 392 724 q 427 846 392 775 q 444 854 431 854 q 619 857 503 854 q 793 860 735 860 q 806 852 806 860 z \"\n    },\n    \"Ý\": {\n      \"ha\": 815,\n      \"x_min\": 24,\n      \"x_max\": 794,\n      \"o\": \"m 794 696 q 673 491 794 657 q 514 283 593 387 q 494 231 494 258 q 498 121 494 194 q 502 12 502 48 q 485 0 502 0 l 323 0 q 310 20 310 0 q 315 125 310 54 q 319 231 319 195 q 302 285 319 261 q 157 475 254 348 q 37 647 74 588 q 25 686 25 667 q 24 933 24 772 q 40 951 24 951 q 74 949 52 951 q 109 947 97 947 q 149 949 122 947 q 191 951 176 951 q 203 941 203 951 q 199 827 203 903 q 195 713 195 751 q 410 427 195 672 q 526 570 460 484 q 618 711 618 688 q 612 822 618 748 q 607 933 607 897 q 623 951 607 951 q 660 949 635 951 q 697 947 685 947 q 736 949 710 947 q 775 951 762 951 q 791 929 791 951 q 793 812 791 890 q 794 696 794 734 m 623 1151 q 473 1048 612 1123 q 304 974 336 974 q 283 1008 292 974 q 276 1053 276 1034 q 289 1065 276 1059 q 521 1213 401 1121 q 531 1219 524 1215 q 540 1213 534 1217 q 615 1160 569 1188 q 623 1151 618 1158 z \"\n    },\n    \"Þ\": {\n      \"ha\": 867,\n      \"x_min\": 68,\n      \"x_max\": 839,\n      \"o\": \"m 839 517 q 751 268 839 358 q 507 178 664 178 q 390 180 468 178 q 272 183 311 183 q 250 155 250 183 q 255 82 250 131 q 259 9 259 34 q 246 -2 259 -2 q 203 1 232 -2 q 160 4 174 4 q 124 2 148 4 q 89 0 100 0 q 72 21 72 0 q 78 244 72 95 q 85 468 85 393 q 69 922 85 645 l 69 930 q 92 951 68 951 q 129 949 104 951 q 165 947 153 947 q 202 949 178 947 q 239 951 227 951 q 256 938 256 951 q 250 847 256 923 q 296 846 273 846 q 398 850 330 846 q 498 854 465 854 q 744 761 648 854 q 839 517 839 667 m 668 507 q 612 663 668 606 q 456 720 555 720 q 345 714 425 720 q 250 703 253 708 q 245 484 245 695 q 247 405 245 457 q 249 326 249 353 q 264 317 249 320 q 471 310 301 310 q 668 507 668 310 z \"\n    },\n    \"þ\": {\n      \"ha\": 798,\n      \"x_min\": 71,\n      \"x_max\": 761,\n      \"o\": \"m 761 326 q 675 88 761 189 q 449 -18 583 -18 q 300 37 369 -18 q 243 92 272 64 q 237 -191 237 85 q 222 -212 237 -212 q 98 -210 117 -212 q 83 -192 83 -208 q 85 68 83 -105 q 86 329 86 242 q 78 634 86 431 q 71 939 71 838 q 89 958 71 956 q 161 961 113 959 q 200 966 171 962 q 239 970 224 970 q 250 954 250 970 q 247 884 250 931 q 243 812 243 836 q 241 701 243 775 q 239 589 239 627 q 243 563 239 563 q 254 572 248 566 q 446 669 349 669 q 673 564 581 669 q 761 326 761 463 m 603 329 q 552 472 603 410 q 418 538 498 538 q 289 470 339 538 q 243 328 243 409 q 291 184 243 245 q 424 118 342 118 q 554 186 500 118 q 603 329 603 250 z \"\n    },\n    \"­\": {\n      \"ha\": 561,\n      \"x_min\": 23,\n      \"x_max\": 532,\n      \"o\": \"m 532 471 q 522 350 532 462 q 513 345 520 345 q 390 347 472 345 q 267 349 308 349 q 35 345 267 349 q 23 354 23 345 q 29 412 23 362 q 32 475 29 441 q 47 482 37 482 q 160 478 85 482 q 272 473 235 473 q 396 476 313 473 q 519 479 478 479 q 532 471 532 479 z \"\n    },\n    \"¹\": {\n      \"ha\": 335,\n      \"x_min\": 27,\n      \"x_max\": 277,\n      \"o\": \"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 z \"\n    },\n    \"²\": {\n      \"ha\": 532,\n      \"x_min\": 18,\n      \"x_max\": 503,\n      \"o\": \"m 503 268 q 486 258 503 258 q 381 261 451 258 q 276 265 311 265 q 168 264 240 265 q 58 262 95 262 q 44 272 47 262 q 31 370 31 312 q 43 384 31 382 q 114 404 66 387 q 311 637 311 517 q 210 703 311 703 q 104 671 167 703 q 50 640 42 640 q 44 641 46 640 q 30 697 42 642 q 18 761 18 753 q 125 811 29 786 q 250 833 208 833 q 399 798 340 833 q 471 671 471 755 q 243 385 471 519 l 264 385 q 486 396 353 383 l 492 396 q 500 385 500 396 q 499 354 500 374 q 498 323 498 333 q 500 296 498 314 q 503 268 503 277 z \"\n    },\n    \"³\": {\n      \"ha\": 525,\n      \"x_min\": 27,\n      \"x_max\": 478,\n      \"o\": \"m 478 423 q 404 290 478 334 q 248 254 343 254 q 37 292 135 254 q 27 300 27 296 q 28 306 27 302 q 41 339 33 317 q 52 393 44 357 q 61 404 55 404 q 68 401 64 403 q 212 366 153 366 q 294 376 270 366 q 332 440 332 393 q 206 517 332 517 q 162 515 190 517 q 124 514 134 514 q 94 525 94 514 q 110 616 94 616 q 176 611 132 616 q 241 607 220 607 q 302 661 302 607 q 199 722 302 722 q 99 708 139 722 q 70 695 89 703 q 63 694 67 694 q 57 705 59 694 q 52 787 52 731 q 134 822 52 810 q 239 831 191 831 q 382 799 319 831 q 462 686 462 759 q 393 562 462 593 q 478 423 478 520 z \"\n    },\n    \"½\": {\n      \"ha\": 1086,\n      \"x_min\": 27,\n      \"x_max\": 998,\n      \"o\": \"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 703 789 q 699 777 703 786 q 472 380 621 646 q 252 -41 401 238 q 240 -53 245 -53 q 192 -18 237 -53 q 147 22 147 18 q 151 32 147 26 q 603 851 439 525 q 612 860 608 860 q 663 829 623 860 q 703 789 703 798 m 998 7 q 981 -3 998 -3 q 876 0 945 -3 q 770 4 806 4 q 662 3 734 4 q 553 1 589 1 q 538 11 541 1 q 526 109 526 51 q 537 123 526 121 q 608 142 561 126 q 805 376 805 256 q 705 441 805 441 q 599 410 661 441 q 544 379 536 379 q 538 380 541 379 q 525 436 536 381 q 513 500 513 492 q 619 550 524 525 q 744 572 703 572 q 894 537 835 572 q 966 410 966 494 q 738 124 966 258 l 758 124 q 980 135 848 122 l 987 135 q 995 123 995 135 q 994 93 995 113 q 992 62 992 72 q 995 35 992 53 q 998 7 998 16 z \"\n    },\n    \"¼\": {\n      \"ha\": 1086,\n      \"x_min\": 27,\n      \"x_max\": 987,\n      \"o\": \"m 277 814 l 275 806 q 264 532 264 689 q 265 410 264 491 q 266 287 266 328 q 248 269 266 269 q 188 268 228 269 q 128 267 149 267 q 113 277 113 267 q 117 464 113 339 q 122 652 122 589 q 117 663 122 663 q 78 655 104 663 q 39 648 52 648 q 27 654 27 648 q 27 740 27 738 q 39 750 27 746 q 102 788 69 762 q 130 815 104 789 q 157 838 154 838 q 269 823 208 838 q 277 814 277 821 m 731 789 q 726 777 731 786 q 500 380 649 646 q 280 -41 429 238 q 268 -53 273 -53 q 220 -18 264 -53 q 175 22 175 18 q 178 32 175 26 q 631 851 467 525 q 640 860 635 860 q 691 829 650 860 q 731 789 731 798 m 987 107 q 928 100 987 100 q 911 85 911 100 q 913 44 911 72 q 916 2 916 16 q 837 -13 916 -13 q 751 -3 751 -13 q 757 43 751 12 q 762 90 762 74 q 754 100 762 100 q 636 97 715 100 q 517 95 557 95 q 489 121 494 95 q 487 165 487 129 q 496 221 487 211 q 632 387 557 288 q 758 559 695 473 q 774 570 766 570 q 902 545 828 570 q 918 528 918 541 q 915 457 918 505 q 911 387 911 410 q 910 317 911 366 q 909 248 909 273 l 909 212 q 944 214 921 212 q 978 216 967 216 q 987 208 987 216 q 987 157 987 191 q 987 107 987 124 m 779 429 l 779 432 q 685 307 764 406 q 610 212 648 260 q 653 208 613 208 q 767 210 724 208 q 774 302 768 238 q 780 395 780 362 q 779 429 780 413 z \"\n    },\n    \"¾\": {\n      \"ha\": 1086,\n      \"x_min\": -4,\n      \"x_max\": 1059,\n      \"o\": \"m 876 789 q 871 777 876 786 q 644 380 793 646 q 425 -41 574 238 q 412 -53 418 -53 q 364 -18 409 -53 q 319 22 319 18 q 323 32 319 26 q 775 851 612 525 q 785 860 780 860 q 835 829 795 860 q 876 789 876 798 m 1059 107 q 1000 100 1059 100 q 983 85 983 100 q 985 44 983 72 q 988 2 988 16 q 909 -13 988 -13 q 823 -3 823 -13 q 829 43 823 12 q 834 90 834 74 q 826 100 834 100 q 708 97 787 100 q 589 95 629 95 q 561 121 566 95 q 559 165 559 129 q 568 221 559 211 q 704 387 629 288 q 830 559 767 473 q 846 570 838 570 q 974 545 900 570 q 990 528 990 541 q 986 457 990 505 q 983 387 983 410 q 982 317 983 366 q 981 248 981 273 l 981 212 q 1016 214 993 212 q 1050 216 1039 216 q 1059 208 1059 216 q 1059 157 1059 191 q 1059 107 1059 124 m 850 429 l 850 432 q 757 307 836 406 q 682 212 720 260 q 725 208 685 208 q 839 210 795 208 q 846 302 840 238 q 852 395 852 362 q 850 429 852 413 m 447 423 q 373 290 447 334 q 217 254 312 254 q 6 292 104 254 q -4 300 -4 296 q -3 306 -4 302 q 10 339 2 317 q 20 393 13 357 q 30 404 24 404 q 37 401 33 403 q 181 366 122 366 q 263 376 239 366 q 301 440 301 393 q 175 517 301 517 q 131 515 159 517 q 93 514 102 514 q 63 525 63 514 q 79 616 63 616 q 144 611 100 616 q 210 607 189 607 q 271 661 271 607 q 168 722 271 722 q 68 708 108 722 q 39 695 58 703 q 32 694 36 694 q 26 705 28 694 q 20 787 20 731 q 103 822 20 810 q 208 831 159 831 q 351 799 288 831 q 431 686 431 759 q 362 562 431 593 q 447 423 447 520 z \"\n    },\n    \"ý\": {\n      \"ha\": 661,\n      \"x_min\": 24,\n      \"x_max\": 640,\n      \"o\": \"m 640 472 q 633 334 640 357 q 466 67 625 303 q 277 -196 307 -168 q 102 -220 250 -220 q 79 -217 84 -220 q 56 -168 74 -213 q 38 -113 38 -122 q 74 -98 38 -98 q 186 -77 150 -98 q 223 -30 198 -69 q 248 23 248 9 q 149 166 248 41 q 33 334 45 298 q 24 467 24 361 q 24 544 24 492 q 25 623 25 596 q 41 637 25 637 q 105 635 63 637 q 170 632 148 632 q 180 618 180 632 q 178 561 180 599 q 176 504 176 523 q 182 380 176 421 q 256 252 186 355 q 342 150 326 150 q 415 251 353 150 q 481 375 477 351 q 486 498 486 409 q 482 556 486 518 q 478 614 478 595 q 489 631 478 631 q 554 634 511 631 q 620 637 598 637 q 640 472 640 637 m 534 892 q 384 789 524 865 q 215 715 248 715 q 194 749 203 715 q 187 794 187 776 q 200 807 187 801 q 432 954 312 863 q 442 960 435 957 q 451 954 446 959 q 526 901 480 930 q 534 892 530 899 z \"\n    },\n    \"×\": {\n      \"ha\": 561,\n      \"x_min\": 42,\n      \"x_max\": 503,\n      \"o\": \"m 503 553 q 491 530 503 541 l 363 401 l 490 274 q 502 250 502 262 q 472 201 502 232 q 423 171 441 171 q 401 182 412 171 l 272 311 l 144 183 q 122 172 134 172 q 73 202 103 172 q 42 250 42 231 q 53 273 42 261 l 182 401 l 54 529 q 43 551 43 540 q 73 601 43 571 q 121 631 102 631 q 144 621 132 631 l 272 492 l 400 619 q 423 631 412 631 q 472 601 441 631 q 503 553 503 571 z \"\n    },\n    \"⁴\": {\n      \"ha\": 552,\n      \"x_min\": 26,\n      \"x_max\": 526,\n      \"o\": \"m 526 379 q 467 372 526 372 q 450 357 450 372 q 452 316 450 344 q 455 274 455 288 q 376 259 455 259 q 290 269 290 259 q 296 315 290 284 q 301 361 301 346 q 293 372 301 372 q 175 369 254 372 q 56 367 96 367 q 28 393 33 367 q 26 437 26 401 q 35 493 26 483 q 171 659 96 559 q 297 831 234 745 q 313 842 304 842 q 441 817 367 842 q 457 800 457 812 q 453 729 457 777 q 450 659 450 682 q 449 589 450 638 q 448 520 448 545 l 448 484 q 483 486 460 484 q 517 488 506 488 q 526 480 526 488 q 526 429 526 463 q 526 379 526 396 m 317 701 l 317 704 q 224 578 302 678 q 149 484 186 532 q 192 479 152 479 q 306 481 262 479 q 313 574 307 510 q 319 667 319 634 q 317 701 319 685 z \"\n    },\n    \"€\": {\n      \"ha\": 642,\n      \"x_min\": 43,\n      \"x_max\": 595,\n      \"o\": \"m 595 4 q 583 -15 595 -11 q 521 -22 561 -22 q 283 51 387 -22 q 135 251 178 124 q 57 249 89 249 q 44 259 44 249 q 50 359 44 334 q 62 368 52 368 q 111 368 85 368 q 110 409 110 388 q 112 452 110 431 q 57 452 81 452 q 43 466 43 452 q 50 566 43 538 q 64 576 52 576 q 140 575 96 576 q 292 766 186 695 q 523 836 396 836 q 576 831 549 836 q 588 820 588 828 q 587 797 588 820 q 585 758 585 773 q 586 725 585 748 q 587 700 587 703 q 574 688 587 686 q 523 694 528 694 q 302 570 375 694 q 426 572 343 570 q 550 574 509 574 q 562 562 562 574 q 554 458 562 509 q 547 450 553 450 q 414 453 503 450 q 279 457 325 457 l 264 457 q 261 409 261 433 q 264 363 261 385 q 301 363 284 363 q 427 365 343 363 q 553 367 511 367 q 563 356 563 367 q 555 256 563 347 q 547 248 553 248 l 541 249 q 296 256 411 256 q 529 118 369 118 q 587 124 562 118 q 595 115 595 126 q 594 89 595 111 q 593 60 593 68 q 594 32 593 54 q 595 4 595 10 z \"\n    }\n  },\n  \"familyName\": \"Berlin Sans FB\",\n  \"ascender\": 1244,\n  \"descender\": -282,\n  \"underlinePosition\": -176,\n  \"underlineThickness\": 69,\n  \"boundingBox\": {\n    \"yMin\": -282,\n    \"xMin\": -71,\n    \"yMax\": 1244,\n    \"xMax\": 1492\n  },\n  \"resolution\": 1000,\n  \"original_font_information\": {\n    \"format\": 0,\n    \"copyright\": \"Copyright (c) 1997 The Font Bureau, Inc. All rights reserved. Designed by David Berlow.\",\n    \"fontFamily\": \"Berlin Sans FB\",\n    \"fontSubfamily\": \"Regular\",\n    \"uniqueID\": \"FB Berlin Sans FB Regular\",\n    \"fullName\": \"Berlin Sans FB\",\n    \"version\": \"Version 1.00\",\n    \"postScriptName\": \"BerlinSansFB-Reg\",\n    \"trademark\": \"Copyright (c) 1985, 1987, 1988, 1989 The Font Bureau, Inc. All rights reserved. Berlin Sans is a trademark of The Font Bureau, Inc.\",\n    \"manufacturer\": \"The Font Bureau, Inc.\",\n    \"designer\": \"David Berlow\",\n    \"description\": \"Berlin Sans is based on a brilliant alphabet from the late twenties, the first sans that Lucian Bernhard ever designed, imaginative and little-known. Assisted by Matthew Butterick, David Berlow expanded the single font into a series of four weights, all four complete with Expert character sets, plus one dingbat font.\",\n    \"manufacturerURL\": \"http://www.fontbureau.com\",\n    \"designerURL\": \"http://www.fontbureau.com/designers/\"\n  },\n  \"cssFontWeight\": \"normal\",\n  \"cssFontStyle\": \"normal\"\n}"
  },
  {
    "path": "src/mesh_tools/assets/xyz_presets.jsonc",
    "content": "// Special thanks to the Blender3d addon \"Add Mesh - Extra Objects\" for the inspiration! :)\n// \t\t\t\t  and the presets of the addon, at: https://github.com/elfnor/blender_XYZ_surface_presets\n// :)\n{\n  \"TwistedTorus\": {\n    \"x\": \"-cos(u)*(6-(5/4 + sin(3*v))*sin(v-3*u))\",\n    \"y\": \"-(6-(5/4 + sin(3*v))*sin(v-3*u))*sin(u)\",\n    \"z\": \"cos(v-3*u)*(5/4+sin(3*v))\",\n    \"scale\": 1,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 32,\n    \"uWrap\": true,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": true,\n    \"vClose\": true\n  },\n  \"Bonbon\": {\n    \"x\": \"(u-3.3379)\",\n    \"y\": \"cos(u)*sin(v)\",\n    \"z\": \"cos(u)*cos(v)\",\n    \"scale\": 2,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Boy\": {\n    \"x\": \"(sq2 * cos(2*u)*pow(cos(v),2) + cos(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))\",\n    \"y\": \"(sq2 * sin(2*u)*pow(cos(v),2) - sin(u)*sin(2*v)) / (2 - alpha *sq2*sin(3*u)*sin(2*v))\",\n    \"z\": \"(3*pow(cos(v),2)) / (2 - alpha*sq2*sin(3*u)*sin(2*v))\",\n    \"scale\": 4,\n    \"uRange\": [-1.5707963705062866, 1.5707963705062866],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 3.1415927410125732],\n    \"vDivs\": 32,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"alpha=1\"\n  },\n  \"Hexahedron\": {\n    \"x\": \"pow(cos(v),3)*pow(cos(u),3)\",\n    \"y\": \"pow(sin(u),3)\",\n    \"z\": \"pow(sin(v),3)*pow(cos(u),3)\",\n    \"scale\": 8,\n    \"uRange\": [-1.2999999523162842, 1.2999999523162842],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Klein\": {\n    \"x\": \"(3*(1+sin(v)) + 2*(1-cos(v)/2)*cos(u))*cos(v)\",\n    \"y\": \"(4+2*(1-cos(v)/2)*cos(u))*sin(v)\",\n    \"z\": \"-2*(1-cos(v)/2)*sin(u)\",\n    \"scale\": 1,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 16,\n    \"uWrap\": true,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Moebius\": {\n    \"x\": \"(cos(v)+u*cos(v/2)*cos(v))\",\n    \"y\": \"(u*sin(v/2))\",\n    \"z\": \"(sin(v)+u*cos(v/2)*sin(v))\",\n    \"scale\": 4,\n    \"uRange\": [-0.4000000059604645, 0.4000000059604645],\n    \"uDivs\": 4,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Breather\": {\n    \"x\": \"-u + (2*rr*cosh(alpha*u)*sinh(alpha*u))/denom\",\n    \"y\": \"(2*ww*cosh(alpha*u)*(-(ww*cos(v)*cos(ww*v)) - sin(v)*sin(ww*v)))/denom\",\n    \"z\": \"(2*ww*cosh(alpha*u)*(-(ww*sin(v)*cos(ww*v)) + cos(v)*sin(ww*v)))/denom\",\n    \"scale\": 2,\n    \"uRange\": [-13.2, 13.2],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [-37.4, 37.4],\n    \"vDivs\": 32,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"alpha = 0.4\\nrr= 1 - pow(alpha,2)\\nww = sqrt(rr)\\ndenom = alpha*( pow(ww*cosh(alpha*u),2) + pow(alpha*sin(ww*v),2) )\"\n  },\n  \"RidgedTorus\": {\n    \"x\": \"outer_radius*cos(u)+(ridge_power*sin(numofridges*u)+inner_radius)*cos(u)*cos(v)\",\n    \"y\": \"outer_radius*sin(u)+(ridge_power*sin(numofridges*u)+inner_radius)*sin(u)*cos(v)\",\n    \"z\": \"(ridge_power*sin(numofridges*u)+inner_radius)*sin(v)\",\n    \"scale\": 1,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 32,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"outer_radius = 5\\nridge_power = 0.6\\ninner_radius = 2\\nnumofridges = 10\"\n  },\n  \"CliffordTorus\": {\n    \"x\": \"cos(u+v)/(sq2+cos(v-u))\",\n    \"y\": \"sin(v-u)/(sq2+cos(v-u))\",\n    \"z\": \"sin(u+v)/(sq2+cos(v-u))\",\n    \"scale\": 4,\n    \"uRange\": [0, 3.1415927410125732],\n    \"uDivs\": 8,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 32,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"sq2 = 1.4142135623730951\"\n  },\n  \"Cyclide\": {\n    \"x\": \"(thickness*(center_offset - aspect_ratio*cos(u)*cos(v) ) + radius*radius*cos(u)) / denom\",\n    \"y\": \"(radius*sin(u)*(aspect_ratio-thickness*cos(v) ) )/denom\",\n    \"z\": \"(radius*sin(v)*(center_offset*cos(u)-thickness ) )/denom\",\n    \"scale\": 4,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"aspect_ratio = 1\\nradius = 0.98\\ncenter_offset = 0.199\\nthickness  = 0.3\\ndenom = (aspect_ratio-center_offset*cos(u)*cos(v))\"\n  },\n  \"Shell\": {\n    \"x\": \"(cos(v)*(1+cos(u))*sin(v/8))\",\n    \"y\": \"(sin(u)*sin(v/8)+cos(v/8)*1.5)\",\n    \"z\": \"(sin(v)*(1+cos(u))*sin(v/8))\",\n    \"scale\": 4,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 8,\n    \"uWrap\": true,\n    \"vRange\": [0, 12.566370964050293],\n    \"vDivs\": 32,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Catalan\": {\n    \"x\": \"u-sin(u)*cosh(v)\",\n    \"y\": \"4*sin(1/2*u)*sinh(v/2)\",\n    \"z\": \"1-cos(u)*cosh(v)\",\n    \"scale\": 1,\n    \"uRange\": [-3.1415927410125732, 9.42477798461914],\n    \"uDivs\": 24,\n    \"uWrap\": false,\n    \"vRange\": [-2, 2],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Dini\": {\n    \"x\": \"radius*cos(u)*sin(v)\",\n    \"y\": \"2*(((cos(v)+ln(tan(v/2)+1E-2)) + twist_rotation*u)+3.4985)\",\n    \"z\": \"radius*sin(u)*sin(v)\",\n    \"scale\": 1,\n    \"uRange\": [0, 12.566370614359172],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 2],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false,\n    \"variables\": \"radius = 4\\ntwist_rotation=0.2\"\n  },\n  \"Catenoid\": {\n    \"x\": \"2*cosh(v/2)*cos(u)\",\n    \"y\": \"v\",\n    \"z\": \"2*cosh(v/2)*sin(u)\",\n    \"scale\": 1,\n    \"uRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"uDivs\": 24,\n    \"uWrap\": true,\n    \"vRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Cochlea\": {\n    \"x\": \"v*cos(u)\",\n    \"y\": \"v*sin(u)\",\n    \"z\": \"(0.4*u-2.5383)\",\n    \"scale\": 4,\n    \"uRange\": [0, 12.566370964050293],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [0, 2],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Cosinus\": {\n    \"x\": \"u\",\n    \"y\": \"sin(pi* ( pow(u,2) + pow(v,2) ) )/2\",\n    \"z\": \"v\",\n    \"scale\": 8,\n    \"uRange\": [-1, 1],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [-1, 1],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Enneper\": {\n    \"x\": \"u -pow(u,3)/3  + u*pow(v,2)\",\n    \"y\": \"pow(u,2) - pow(v,2)\",\n    \"z\": \"v -pow(v,3)/3  + v*pow(u,2)\",\n    \"scale\": 1,\n    \"uRange\": [-2, 2],\n    \"uDivs\": 8,\n    \"uWrap\": false,\n    \"vRange\": [-2, 2],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Helicoidal\": {\n    \"x\": \"sinh(v)*sin(u)\",\n    \"y\": \"3*u\",\n    \"z\": \"-sinh(v)*cos(u)\",\n    \"scale\": 1,\n    \"uRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Helix\": {\n    \"x\": \"(1-0.1*cos(v))*cos(u)/0.1\",\n    \"y\": \"0.1*(sin(v) + u/1.7 -10)/0.1 + 5\",\n    \"z\": \"(1-0.1*cos(v))*sin(u)/0.1\",\n    \"scale\": 1,\n    \"uRange\": [0, 12.566370964050293],\n    \"uDivs\": 32,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Hyperhelicoidal\": {\n    \"x\": \"(sinh(v)*cos(3*u))/(1+cosh(u)*cosh(v))\",\n    \"y\": \"(cosh(v)*sinh(u))/(1+cosh(u)*cosh(v))\",\n    \"z\": \"(sinh(v)*sin(3*u))/(1+cosh(u)*cosh(v))\",\n    \"scale\": 8,\n    \"uRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"uDivs\": 32,\n    \"uWrap\": false,\n    \"vRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"PseudoCatenoid\": {\n    \"x\": \"2.2*(2*cosh(v/2)*cos(u))\",\n    \"y\": \"1.51166 * (2*cosh(v/2)*sin(u) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) + 1.8*(v) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))\",\n    \"z\": \"1.51166 * (2*cosh(v/2)*sin(u) * cos((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513) - 1.8*(v) * sin((2.2*(2*cosh(v/2)*cos(u)) - -11.0404)*2*pi*1/22.0513))\",\n    \"scale\": 1,\n    \"uRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"uDivs\": 32,\n    \"uWrap\": false,\n    \"vRange\": [-3.1415927410125732, 3.1415927410125732],\n    \"vDivs\": 14,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"PseudoSphere\": {\n    \"x\": \"cos(u)*cos(v)+sin((sin(u)+1)*2*pi)\",\n    \"y\": \"4*sin(u)\",\n    \"z\": \"cos(u)*sin(v)+cos((sin(u)+1)*2*pi)\",\n    \"scale\": 2,\n    \"uRange\": [-1.5707963705062866, 1.5707963705062866],\n    \"uDivs\": 32,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 8,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Sine\": {\n    \"x\": \"sin(u)\",\n    \"y\": \"sin(v)\",\n    \"z\": \"sin(u+v)\",\n    \"scale\": 8,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 16,\n    \"uWrap\": true,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 16,\n    \"vWrap\": true,\n    \"vClose\": true\n  },\n  \"Snake\": {\n    \"x\": \"1.2*(1 -v/(2*pi))*cos(3*v)*(1 + cos(u)) + 3*cos(3*v)\",\n    \"y\": \"9*v/(2*pi) + 1.2*(1 - v/(2*pi))*sin(u)\",\n    \"z\": \"1.2*(1 -v/(2*pi))*sin(3*v)*(1 + cos(u)) + 3*sin(3*v)\",\n    \"scale\": 1,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 7,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 42,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"SteroSphere\": {\n    \"x\": \"(2*u/(u*u+v*v+1))\",\n    \"y\": \"((u*u+v*v-1)/(u*u+v*v+1))\",\n    \"z\": \"(2*v/(u*u+v*v+1))\",\n    \"scale\": 8,\n    \"uRange\": [-2, 2],\n    \"uDivs\": 16,\n    \"uWrap\": false,\n    \"vRange\": [-2, 2],\n    \"vDivs\": 16,\n    \"vWrap\": false,\n    \"vClose\": false\n  },\n  \"Torus\": {\n    \"x\": \"(1+0.5*cos(u))*cos(v)\",\n    \"y\": \"0.5*sin(u)\",\n    \"z\": \"(1+0.5*cos(u))*sin(v)\",\n    \"scale\": 6,\n    \"uRange\": [0, 6.2831854820251465],\n    \"uDivs\": 8,\n    \"uWrap\": false,\n    \"vRange\": [0, 6.2831854820251465],\n    \"vDivs\": 12,\n    \"vWrap\": false,\n    \"vClose\": false\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/esbuild.js",
    "content": "import * as esbuild from \"esbuild\";\nimport { copy } from 'esbuild-plugin-copy';\nimport FastGlob from \"fast-glob\";\nimport fs from \"fs/promises\";\nimport * as jsonc from \"jsonc-parser\";\nimport path from \"path\";\nimport { aboutPlugin } from \"./plugins/about.plugin.js\";\n\nconst watch = process.argv.includes(\"--watch\");\nconst sourcemap = process.argv.includes(\"--sourcemap\");\n\nconst context = await esbuild.context({\n  entryPoints: [\"src/index.js\"],\n  outfile: \"../../plugins/mesh_tools/mesh_tools.js\",\n  bundle: true,\n  minify: true,\n  sourcemap,\n  format: \"iife\",\n  loader: {\n    \".js\": \"js\",\n    \".ts\": \"ts\",\n  },\n  external: [\"three\"],\n  alias: {\n    three: \"./src/shims/three.shim.ts\",\n  },\n  logLevel: \"info\",\n  plugins: [\n    copy({\n      assets: {\n        from: [\"./meta/*\"],\n        to: [\"../../plugins/mesh_tools\"],\n      },\n      watch: true,\n    }),\n    aboutPlugin({ actionsPath: \"assets/actions.json\" }),\n    jsoncPlugin(),\n    globImportPlugin(),\n  ],\n});\n\nif (watch) {\n  await context.watch();\n} else {\n  await context.rebuild();\n  await context.dispose();\n}\n\n/**\n *\n * @returns {import(\"esbuild\").Plugin}\n */\nfunction globImportPlugin() {\n  // from esbuild-plugin-import-glob (modified)\n  return {\n    name: \"glob-import\",\n    setup: (build) => {\n      build.onResolve({ filter: /\\*/ }, async (args) => {\n        if (args.resolveDir === \"\") {\n          return;\n        }\n\n        return {\n          path: path.join(args.resolveDir, args.path),\n          namespace: \"glob-import\",\n          pluginData: {\n            path: args.path,\n            resolveDir: args.resolveDir,\n          },\n        };\n      });\n      build.onLoad({ filter: /.*/, namespace: \"glob-import\" }, async (args) => {\n        const files = (\n          await FastGlob(args.pluginData.path, {\n            cwd: args.pluginData.resolveDir,\n          })\n        ).sort();\n\n        const importerCode = `\n\t\t\t${files\n        .map((module, index) => `import * as module${index} from './${module}'`)\n        .join(\";\")}\n\t\n\t\t\tconst modules = {\n      ${files\n        .map((module, index) => `[${JSON.stringify(module)}]: module${index}`)\n        .join(\",\")}\n      };\n\t\n\t\t\texport default modules;\n\t\t  `;\n\n        return {\n          contents: importerCode,\n          resolveDir: args.pluginData.resolveDir,\n        };\n      });\n    },\n  };\n}\n\n/**\n *\n * @returns {import(\"esbuild\").Plugin}\n */\nfunction jsoncPlugin() {\n  return {\n    name: \"jsonc\",\n    setup(build) {\n      build.onLoad({ filter: /\\.jsonc$/ }, async (args) => {\n        const content = await fs.readFile(args.path, \"utf8\");\n        const parsed = jsonc.parse(content);\n        return {\n          contents: JSON.stringify(parsed),\n          loader: \"json\",\n        };\n      });\n    },\n  };\n}\n"
  },
  {
    "path": "src/mesh_tools/jsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"es6\"\n  },\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "src/mesh_tools/meta/changelog.json",
    "content": "{\n\t\"2.0.0\": {\n\t\t\"title\": \"2.0.0\",\n\t\t\"date\": \"2024-03-21\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added new Bridge Edge Loops action\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Triangles To Quadrilaterals: Improved algorithm\",\n\t\t\t\t\t\"Scatter: Scattered elements more accurately follow surface rotation\",\n\t\t\t\t\t\"Expand/Shrink Selection: Extend functionality in face and edge selection modes\",\n\t\t\t\t\t\"Text Mesh: Support loading OpenType font files\",\n\t\t\t\t\t\"XYZ Surface Generator: Include variables as sliders\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.0.1\": {\n\t\t\"title\": \"2.0.1\",\n\t\t\"date\": \"2024-05-10\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Scatter: Added additional scatter settings\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Scatter: Fixed issue with undoing group creation\",\n\t\t\t\t\t\"Bridge Edge Loops: Fix issue with choosing best followup twist offset\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.0.2\": {\n\t\t\"title\": \"2.0.2\",\n\t\t\"date\": \"2024-05-11\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Text Mesh: Fixed issue where fonts wouldn't load\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t},\n\t\"2.1.0\": {\n\t\t\"title\": \"2.1.0\",\n\t\t\"date\": \"2025-03-16\",\n\t\t\"author\": \"Malik12tree\",\n\t\t\"categories\": [\n\t\t\t{\n\t\t\t\t\"title\": \"Features\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Added new Boolean operations action\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Changes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Enhance amend edit menus\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Fixes\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"Fixed amend edits for Poke and Triangles To Quadrilaterals actions\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"title\": \"Deprecations\",\n\t\t\t\t\"list\": [\n\t\t\t\t\t\"UV Project From View: Deprecated in favor of UV > UV Project from View\"\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "src/mesh_tools/package.json",
    "content": "{\n\t\"name\": \"mesh_tools\",\n\t\"version\": \"0.0.1\",\n\t\"author\": \"Malik12tree\",\n\t\"description\": \"Mesh Tools Plugin\",\n\t\"main\": \"src/index.js\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"build\": \"node esbuild.js\",\n\t\t\"dev\": \"node esbuild.js --watch --sourcemap\"\n\t},\n\t\"devDependencies\": {\n\t\t\"blockbench-types\": \"^4.12.1\",\n\t\t\"esbuild\": \"^0.25.0\",\n\t\t\"esbuild-plugin-copy\": \"^2.1.1\",\n\t\t\"fast-glob\": \"^3.3.3\",\n\t\t\"jsonc-parser\": \"^3.3.1\",\n\t\t\"typescript\": \"^5.8.2\"\n\t},\n\t\"dependencies\": {\n\t\t\"expr-eval\": \"^2.0.2\",\n\t\t\"opentype.js\": \"^1.3.4\",\n\t\t\"three-bvh-csg\": \"^0.0.16\"\n\t}\n}\n"
  },
  {
    "path": "src/mesh_tools/plugins/about.plugin.js",
    "content": "import fs from \"fs/promises\";\nimport path from \"path\";\nimport { renderLine, renderPill } from \"../src/utils/docs.js\";\n\nlet lastRawActions = \"\";\n\n/**\n *\n * @returns {import(\"esbuild\").Plugin}\n */\nexport function aboutPlugin({ actionsPath }) {\n  return {\n    name: \"about\",\n    setup: (build) => {\n      build.onStart(async () => {\n        const rawActions = await fs.readFile(\n          path.resolve(\"assets/actions.json\"),\n          \"utf8\"\n        );\n        if (rawActions == lastRawActions) {\n          return;\n        }\n        lastRawActions = rawActions;\n        console.log(\"Writing about.md! ...\");\n        const ACTIONS = JSON.parse(rawActions);\n        for (const id in ACTIONS) {\n          const action = ACTIONS[id];\n          action.id = id;\n          if (ACTIONS[id]?.docs?.private) delete ACTIONS[id];\n        }\n\n        const tableOfContents = [];\n        function iter(renders, parents, node) {\n          if (node == \"_\") return;\n          if (typeof node == \"string\")\n            return iter(renders, parents, ACTIONS[node]);\n          if (node instanceof Array) {\n            for (const child of node) {\n              iter(renders, parents, child);\n            }\n            return;\n          }\n\n          tableOfContents.push(\n            `<div\n        style=\"padding-inline-start: ${\n          24 * (parents.length - 1)\n        }px\" >${getActionRaw(node)}</div>`\n          );\n          if (node.children) {\n            parents.push(node);\n            iter(renders, parents, node.children);\n            parents.pop();\n            return;\n          }\n\n          renders.push(`\n<section id=\"mesh_tools-action-${node.id}\" style=\"margin-top: 10px;\"> \n${getActionRaw(node)}\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n${parents.map(getActionRaw).join(getIconRaw(\"fas.fa-chevron-right\"))}\n</span>\n<p>${node.description ?? \"\"}</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n${node?.docs?.lines ? node.docs.lines.map(renderLine).join(\"\\n\") : \"\"}\n</div>\n</section>\n`);\n        }\n        const toolsRender = [];\n        const operatorsRender = [];\n        const generatorsRender = [];\n        iter(toolsRender, [ACTIONS.tools], ACTIONS.tools.children.slice());\n        iter(\n          operatorsRender,\n          [ACTIONS.operators],\n          ACTIONS.operators.children.slice()\n        );\n        iter(\n          generatorsRender,\n          [ACTIONS.generators],\n          ACTIONS.generators.children.slice()\n        );\n\n        const content = `\n<div>\n\nThis plugin adds **powerful** mesh modeling tools, operators, and generators into to your Blockbench.\nBy installing the plugin, you get:\n<div style=\"display: flex;flex-direction: column;\">\n${tableOfContents.join(\"\\n\")}\n</div>\n\n### Modeling Tools\nFor applying modifications on selected vertices, edges or faces.\n${toolsRender.join(\"\\n\")}\n\n### Modeling Operators\nFor applying modifications on selected meshes.\n${operatorsRender.join(\"\\n\")}\n\n### Mesh Generators\nFor procedural mesh generation\n${generatorsRender.join(\"\\n\")}\n\n<div style=\"display: flex; gap: 5px;padding-top:10px\">\n  &minus; &nbsp; <img width=\"25\" src=\"https://avatars.githubusercontent.com/u/82341209\"> Malik12tree\n</div>\n</div>\n`;\n        await fs.writeFile(\"../../plugins/mesh_tools/about.md\", content);\n      });\n    },\n  };\n}\n\nfunction updateAbout() {}\n\nfunction getIconRaw(icon) {\n  let node;\n  if (icon === undefined) {\n    return `<i class=\"material-icons notranslate icon\">help_outline</i>`;\n  } else if (icon === true || icon === false) {\n    return `<i class=\"material-icons notranslate icon\">${\n      icon ? \"check_box\" : \"check_box_outline_blank\"\n    }</i>`;\n  } else if (icon.match(/^(fa[.-])|(fa[rsb]\\.)/)) {\n    let classList;\n    if (icon.substr(3, 1) === \".\") {\n      classList = [icon.substr(0, 3), icon.substr(4)];\n    } else {\n      classList = [\"fa\", icon];\n    }\n    return `<i class=\"fa_big ${classList.join(\" \")}\"></i>`;\n  } else if (icon.substr(0, 5) === \"icon-\") {\n    return `<i class=\"icon ${icon}\"></i>`;\n  } else if (icon.substr(0, 14) === \"data:image/png\") {\n    return `<img src=\"${icon}\" />`;\n  } else {\n    return `<i class=\"material-icons notranslate icon\">${icon}</i>`;\n  }\n}\nfunction getActionRaw(node) {\n  const tags = node?.docs?.tags ?? [];\n\n  if (node.docs?.flags) {\n    if (node.docs.flags.deprecated)\n      tags.unshift({ title: \"Deprecated\", color: \"var(--color-error)\" });\n    if (node.docs.flags.experimental)\n      tags.unshift({ title: \"Experimental\", color: \"var(--color-warning)\" });\n    if (node.docs.flags.new)\n      tags.unshift({ title: \"New\", color: \"var(--color-confirm)\" });\n  }\n\n  return `<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  ${getIconRaw(node.icon)} <b>${node.name}</b>\n  ${tags.map(renderPill).join(\"\\n\")}\n  </div>`;\n}\n"
  },
  {
    "path": "src/mesh_tools/plugins/about.rollup.plugin.js",
    "content": "import { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { renderLine, renderPill } from \"../src/utils/docs.js\";\n\nlet lastRawActions = \"\";\nexport default {\n  buildStart: async function () {\n    const rawActions = await fs.readFile(path.resolve(\"assets/actions.json\"), {\n      encoding: \"utf-8\",\n    });\n    if (rawActions == lastRawActions) {\n      return;\n    }\n    lastRawActions = rawActions;\n    console.log(\"Writing about.md!\");\n    const ACTIONS = JSON.parse(rawActions);\n    for (const id in ACTIONS) {\n      const action = ACTIONS[id];\n      action.id = id;\n      if (ACTIONS[id]?.docs?.private) delete ACTIONS[id];\n    }\n\n    const tableOfContents = [];\n    function iter(renders, parents, node) {\n      if (node == \"_\") return;\n      if (typeof node == \"string\") return iter(renders, parents, ACTIONS[node]);\n      if (node instanceof Array) {\n        for (const child of node) {\n          iter(renders, parents, child);\n        }\n        return;\n      }\n\n      tableOfContents.push(\n        `<div\n        style=\"padding-inline-start: ${\n          24 * (parents.length - 1)\n        }px\" >${getActionRaw(node)}</div>`\n      );\n      if (node.children) {\n        parents.push(node);\n        iter(renders, parents, node.children);\n        parents.pop();\n        return;\n      }\n\n      renders.push(`\n<section id=\"mesh_tools-action-${node.id}\">\n${getActionRaw(node)}\n<span style=\"display:flex;align-items:center;gap: 10px;\">\nAccess From:\n${parents.map(getActionRaw).join(getIconRaw(\"fas.fa-chevron-right\"))}\n</span>\n<p>${node.description ?? \"\"}</p>\n<div style=\"display:flex;flex-direction:column;gap: 5px;\">\n${node?.docs?.lines ? node.docs.lines.map(renderLine).join(\"\\n\") : \"\"}\n</div>\n</section>\n`);\n    }\n    const toolsRender = [];\n    const operatorsRender = [];\n    const generatorsRender = [];\n    iter(toolsRender, [ACTIONS.tools], ACTIONS.tools.children.slice());\n    iter(\n      operatorsRender,\n      [ACTIONS.operators],\n      ACTIONS.operators.children.slice()\n    );\n    iter(\n      generatorsRender,\n      [ACTIONS.generators],\n      ACTIONS.generators.children.slice()\n    );\n\n    const content = `\n<div>\n\nThis plugin adds **powerful** mesh modeling tools, operators, and generators into to your Blockbench.\nBy installing the plugin, you get:\n<div style=\"display: flex;flex-direction: column;\">\n${tableOfContents.join(\"\\n\")}\n</div>\n\n### Modeling Tools\nFor applying modifications on selected vertices, edges or faces.\n${toolsRender.join(\"\\n\")}\n\n### Modeling Operators\nFor applying modifications on selected meshes.\n${operatorsRender.join(\"\\n\")}\n\n### Mesh Generators\nFor procedural mesh generation\n${generatorsRender.join(\"\\n\")}\n\n<div style=\"display: flex; gap: 5px;padding-top:10px\">\n  &minus; &nbsp; <img width=\"25\" src=\"https://avatars.githubusercontent.com/u/82341209\"> Malik12tree\n</div>\n</div>\n`;\n    await fs.writeFile(\"../../plugins/mesh_tools/about.md\", content);\n  },\n};\n\nfunction getIconRaw(icon) {\n  let node;\n  if (icon === undefined) {\n    return `<i class=\"material-icons notranslate icon\">help_outline</i>`;\n  } else if (icon === true || icon === false) {\n    return `<i class=\"material-icons notranslate icon\">${\n      icon ? \"check_box\" : \"check_box_outline_blank\"\n    }</i>`;\n  } else if (icon.match(/^(fa[.-])|(fa[rsb]\\.)/)) {\n    let classList;\n    if (icon.substr(3, 1) === \".\") {\n      classList = [icon.substr(0, 3), icon.substr(4)];\n    } else {\n      classList = [\"fa\", icon];\n    }\n    return `<i class=\"fa_big ${classList.join(\" \")}\"></i>`;\n  } else if (icon.substr(0, 5) === \"icon-\") {\n    return `<i class=\"icon ${icon}\"></i>`;\n  } else if (icon.substr(0, 14) === \"data:image/png\") {\n    return `<img src=\"${icon}\" />`;\n  } else {\n    return `<i class=\"material-icons notranslate icon\">${icon}</i>`;\n  }\n}\nfunction getActionRaw(node) {\n  return `<div style=\"display: inline-flex;align-items:center;gap: 5px;\">\n  ${getIconRaw(node.icon)} <b>${node.name}</b>\n  ${node?.docs?.tags ? node.docs.tags.map(renderPill).join(\"\\n\") : \"\"}\n  </div>`;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/actions.js",
    "content": "import _ACTIONS from '../assets/actions.json';\nimport { PLUGIN_ID } from './globals.js';\nexport const ACTIONS = _ACTIONS;\n\nconst CONDITIONS = {\n  MESH: {\n    modes: [\"edit\"],\n    features: [\"meshes\"],\n  },\n  OBJECT_MODE: {\n    modes: [\"edit\"],\n    features: [\"meshes\"],\n    method: () =>\n      Mesh.selected.length && BarItems[\"selection_mode\"].value == \"object\",\n  },\n  NON_OBJECT_MODE: {\n    modes: [\"edit\"],\n    features: [\"meshes\"],\n    method: () =>\n      Mesh.selected.length && BarItems[\"selection_mode\"].value != \"object\",\n  },\n}\n\n\nexport const qualifyName = (id) => (id == \"_\" ? id : `@${PLUGIN_ID}/${id}`);\n\n/**\n *\n * @param {keyof ACTIONS} id\n * @param {?Function} click\n * @returns {Action}\n */\nexport function action(id, click) {\n  console.assert(id in ACTIONS, id);\n\n  const options = Object.assign({ click }, ACTIONS[id]);\n  options.plugin = PLUGIN_ID;\n\n  if (options.children) {\n    // TODO qualify with parents\n    options.children = options.children.map(qualifyName);\n  }\n  if (typeof options.condition == 'string') {\n    options.condition = CONDITIONS[options.condition];\n  }\n  if (options.selection_mode) {\n    const oldCondition = options.condition;\n    options.condition = () =>\n      Mesh.selected.length &&\n      (options.selection_mode instanceof Array\n        ? options.selection_mode.includes(BarItems[\"selection_mode\"].value)\n        : BarItems[\"selection_mode\"].value == options.selection_mode) &&\n      Condition(oldCondition);\n  }\n  if (options.keybind) {\n    options.keybind = new Keybind(options.keybind);\n  }\n  return new Action(qualifyName(id), options);\n}\n"
  },
  {
    "path": "src/mesh_tools/src/generators/index.js",
    "content": "import \"./**/*.action.js\";\nimport { action } from \"../actions.js\";\n\nexport default action(\"generators\");\n"
  },
  {
    "path": "src/mesh_tools/src/generators/quickprimitives/polyhedron.action.js",
    "content": "import { action } from \"../../actions.js\";\nimport * as ThreeJSInteroperability from \"../../utils/threejs_interoperability.js\";\n\nfunction runEdit(selected, s, amended = false) {\n  let elements = [];\n  Undo.initEdit({ elements, selection: true }, amended);\n  const geometry = new THREE[selected + \"BufferGeometry\"](\n    s.radius,\n    s.detail - 1\n  );\n  let mesh = ThreeJSInteroperability.nonIndexed(geometry);\n\n  mesh.init();\n  elements.push(mesh);\n  mesh.select();\n  UVEditor.setAutoSize(null, true, Object.keys(mesh.faces));\n  Undo.finishEdit(\"MTools: Generate Mesh\");\n}\nconst dialog = new Dialog({\n  title: \"Quick Primitive [ Polyhedron ]\",\n  form: {\n    select: {\n      label: \"Hedron\",\n      type: \"select\",\n      options: {\n        Icosahedron: \"Icosahedron\",\n        Dodecahedron: \"Dodecahedron\",\n        Octahedron: \"Octahedron\",\n        Tetrahedron: \"Tetrahedron\",\n      },\n    },\n    radius: { label: \"Radius\", value: 8, type: \"number\" },\n    detail: {\n      label: \"Detail\",\n      value: 2,\n      min: 1,\n      max: 6,\n      type: \"number\",\n    },\n  },\n  onConfirm(out) {\n    runEdit(out.select, out);\n    Undo.amendEdit(\n      {\n        radius: { label: \"Radius\", value: out.radius, type: \"number\", min: 1 },\n        detail: {\n          label: \"Detail\",\n          value: out.detail,\n          type: \"range\",\n          min: 1,\n          max: 6,\n        },\n      },\n      (form) => {\n        runEdit(out.select, form, true);\n      }\n    );\n  },\n});\nexport default action(\"polyhedron\", () => {\n  dialog.show();\n});\n"
  },
  {
    "path": "src/mesh_tools/src/generators/quickprimitives/quickprimitives.action.js",
    "content": "import { action } from \"../../actions.js\";\n\nexport default action(\"quickprimitives\");\n"
  },
  {
    "path": "src/mesh_tools/src/generators/quickprimitives/torusknot.action.js",
    "content": "import { action } from \"../../actions.js\";\nimport * as ThreeJSInteroperability from \"../../utils/threejs_interoperability.js\";\n\nfunction runEdit(s, amended = false) {\n  let elements = [];\n  Undo.initEdit({ elements, selection: true }, amended);\n  const geometry = new THREE.TorusKnotBufferGeometry(\n    s.r,\n    s.t,\n    s.ts,\n    s.rs,\n    s.p,\n    s.q\n  );\n  let mesh = ThreeJSInteroperability.indexed(geometry, true);\n\n  mesh.init();\n  elements.push(mesh);\n  mesh.select();\n  UVEditor.setAutoSize(null, true, Object.keys(mesh.faces));\n  Undo.finishEdit(\"MTools: Generate Mesh\");\n}\nconst dialog = new Dialog({\n  title: \"Quick Primitive [ Torus Knot ]\",\n  lines: [\n    `<p class=\"small_text subtle\" style=\"display: inline;\">P and Q should be coprime integers meaning non should be divisible by the other.</p>`,\n  ],\n  form: {\n    r: { label: \"Torus Radius\", type: \"number\", value: 8 },\n    t: { label: \"Tube Radius\", type: \"number\", value: 3.4, step: 0.2 },\n    ts: { label: \"Tubular Segments\", type: \"number\", value: 25 },\n    rs: { label: \"Radial Segments\", type: \"number\", value: 5 },\n    p: { label: \"P\", type: \"number\", value: 2 },\n    q: { label: \"Q\", type: \"number\", value: 3 },\n  },\n  onConfirm(out) {\n    runEdit(out);\n    let s = out;\n\n    Undo.amendEdit(\n      {\n        r: { label: \"Torus Radius\", type: \"number\", value: s.r },\n        t: {\n          label: \"Tube Radius\",\n          type: \"number\",\n          value: s.t,\n          step: 0.2,\n        },\n        ts: { label: \"Tubular Segments\", type: \"number\", value: s.ts },\n        rs: { label: \"Radial Segments\", type: \"number\", value: s.rs },\n        p: { label: \"P\", type: \"number\", value: s.p },\n        q: { label: \"Q\", type: \"number\", value: s.q },\n      },\n      (form) => {\n        runEdit(form, true);\n      }\n    );\n  },\n});\nexport default action(\"torusknot\", () => {\n  dialog.show();\n});\n"
  },
  {
    "path": "src/mesh_tools/src/generators/terrain.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { TerrainGen } from \"../utils/terrain_gen.js\";\nimport { parseRGB, easeInOutSine, falloffMap } from \"../utils/utils.js\";\nimport { perlin } from \"../utils/perlin.js\";\n\nnew TerrainGen({\n  name: \"Open Terrain\",\n  settings: {\n    time: { label: \"Time\", type: \"number\", min: 0, value: 0, step: 1 },\n    scale: { label: \"Noise Scale\", type: \"number\", min: 0, value: 25 },\n    octaves: { label: \"Octaves\", type: \"number\", min: 0, value: 2 },\n    persistance: {\n      label: \"Persistancy\",\n      type: \"number\",\n      min: 0,\n      max: 1,\n      step: 0.1,\n      value: 0.4,\n    },\n    lacunarity: { label: \"lacunarity\", type: \"number\", min: 0, value: 3 },\n    min: {\n      label: \"Min Level\",\n      type: \"number\",\n      min: 0,\n      max: 0.9,\n      step: 0.1,\n      value: 0.1,\n    },\n  },\n  noise(s, addOn) {\n    if (s.scale <= 0) s.scale = 1e-6;\n    const z = s.time + TerrainGen.timeWhenDialogWasOpened;\n    const map = {};\n\n    for (let y = s.height - 1; y >= 0; y--) {\n      for (let x = s.width - 1; x >= 0; x--) {\n        const G = Math.pow(2.0, -s.persistance);\n        let amplitude = 1;\n        let frequency = 1;\n        let noiseHeight = 0;\n        let normalization = 0;\n\n        for (let i = 0; i < s.octaves; i++) {\n          const sampX = (x / s.scale) * frequency;\n          const sampY = (y / s.scale) * frequency;\n          const val = perlin.get(sampX, sampY, (z / s.scale) * frequency) + 0.4;\n\n          noiseHeight += val * amplitude;\n          normalization += amplitude;\n\n          amplitude *= G;\n          frequency *= s.lacunarity;\n        }\n        noiseHeight /= normalization;\n\n        // custom functions\n        if (addOn) {\n          noiseHeight = addOn(noiseHeight, x, y);\n        }\n\n        // falloff\n        if (s.falloff) {\n          const falloff = falloffMap(x, y, s.width, s.height);\n          noiseHeight = Math.clamp(noiseHeight - falloff, 0, 1);\n        }\n\n        // min/max level\n        if (s.min || s.max) {\n          const min = s.min ?? 0;\n          const max = s.max ?? 1;\n\n          noiseHeight = Math.clamp(\n            THREE.MathUtils.mapLinear(\n              easeInOutSine(noiseHeight),\n              min,\n              max,\n              0,\n              1\n            ),\n            0,\n            1\n          );\n        }\n\n        map[x + \",\" + y] = noiseHeight;\n      }\n    }\n    return map;\n  },\n});\nnew TerrainGen({\n  name: \"Valley\",\n  settings: {\n    time: { label: \"Time\", type: \"number\", min: 0, value: 0, step: 1 },\n    scale: { label: \"Noise Scale\", type: \"number\", min: 0, value: 25 },\n    octaves: { label: \"Octaves\", type: \"number\", min: 0, value: 2 },\n    persistance: {\n      label: \"Persistancy\",\n      type: \"number\",\n      min: 0,\n      max: 1,\n      step: 0.1,\n      value: 0.4,\n    },\n    lacunarity: { label: \"lacunarity\", type: \"number\", min: 0, value: 3 },\n  },\n  suggested: {\n    style: \"EarthMountains\",\n  },\n  noise: function (s) {\n    s.min = 0.7;\n    const noise = TerrainGen.all[0].noise(s, (v) => 1 - Math.abs(v * 2 - 1));\n    return noise;\n  },\n});\nnew TerrainGen({\n  name: \"Mesa\",\n  settings: {\n    time: { label: \"Time\", type: \"number\", min: 0, value: 0, step: 1 },\n    scale: { label: \"Noise Scale\", type: \"number\", min: 0, value: 25 },\n    octaves: { label: \"Octaves\", type: \"number\", min: 0, value: 2 },\n    persistance: {\n      label: \"Persistancy\",\n      type: \"number\",\n      min: 0,\n      max: 1,\n      step: 0.1,\n      value: 0.4,\n    },\n    lacunarity: { label: \"lacunarity\", type: \"number\", min: 0, value: 3 },\n  },\n  suggested: {\n    falloff: true,\n    style: \"Desert\",\n  },\n  noise: function (s) {\n    s.max = 0.7;\n    s.min = 0;\n    const noise = TerrainGen.all[0].noise(s);\n    return noise;\n  },\n});\nnew TerrainGen({\n  name: \"River\",\n  settings: {\n    time: { label: \"Time\", type: \"number\", min: 0, value: 0, step: 1 },\n    scale: { label: \"Noise Scale\", type: \"number\", min: 0, value: 25 },\n    octaves: { label: \"Octaves\", type: \"number\", min: 0, value: 2 },\n    persistance: {\n      label: \"Persistancy\",\n      type: \"number\",\n      min: 0,\n      max: 1,\n      step: 0.1,\n      value: 0.4,\n    },\n    lacunarity: { label: \"lacunarity\", type: \"number\", min: 0, value: 3 },\n    turbpower: {\n      label: \"Turb-Power\",\n      type: \"number\",\n      min: 0,\n      value: 1.3,\n      step: 0.1,\n    },\n  },\n  suggested: {\n    style: \"Ice\",\n    multiplier: 3,\n    lacunarity: 2,\n    octaves: 4,\n  },\n  noise: function (s) {\n    const noise = TerrainGen.all[0].noise(s, function (val, x, y) {\n      const xyValue = x / s.width + y / s.height + s.turbpower * val;\n      const sineValue = Math.abs(Math.cos(xyValue * Math.PI));\n      return sineValue;\n    });\n\n    return noise;\n  },\n});\n\nconst styleOptions = {};\nfor (const key in TerrainGen.styles) styleOptions[key] = key;\nconst settingsCombined = {};\nconst form = {\n  style: { label: \"Style\", type: \"select\", options: styleOptions },\n  terrain: { label: \"Terrain Type\", type: \"select\" },\n  width: {\n    label: \"Resolution X\",\n    type: \"number\",\n    value: 32,\n    min: 1,\n    max: 255,\n  },\n  height: {\n    label: \"Resolution Y\",\n    type: \"number\",\n    value: 32,\n    min: 1,\n    max: 255,\n  },\n  size: {\n    label: \"Size\",\n    type: \"number\",\n    value: 16,\n    min: 16,\n  },\n  suggested: {\n    label: \"Update Suggested Settings\",\n    type: \"checkbox\",\n    value: true,\n  },\n  _: \"_\",\n  multiplier: {\n    label: \"Height Multiplier\",\n    type: \"number\",\n    value: 5,\n    max: Infinity,\n  },\n  falloff: { label: \"FallOff Map\", type: \"checkbox\", value: false },\n  __: \"_\",\n};\nstyleOptions.custom = \"Custom\";\nconst options = {};\nfor (let i = 0; i < TerrainGen.all.length; i++) {\n  const { codeName, name, settings } = TerrainGen.all[i];\n  options[codeName] = name;\n\n  for (const key in settings) {\n    const currentSettingValue = settings[key];\n\n    if (key in settingsCombined) {\n      settingsCombined[key].push(codeName);\n    } else {\n      settingsCombined[key] = [codeName];\n    }\n\n    currentSettingValue.condition = ({ terrain } = {}) =>\n      settingsCombined[key].includes(terrain);\n    form[key] = currentSettingValue;\n  }\n}\nform.terrain.options = options;\n\nexport default action(\"terrain_action\", () => {\n  let typeBeforeUpdate;\n  TerrainGen.timeWhenDialogWasOpened = Date.now();\n  new Dialog({\n    title: \"Terrain Settings\",\n    id: \"terrain_settings\",\n    form,\n    /** @param {any} _out  */\n    onConfirm(_out) {\n      let style = TerrainGen.styles[_out.style];\n\n      if (_out.style == \"custom\") {\n        const customStyleString = localStorage.mt_customStyle;\n        if (!customStyleString)\n          Blockbench.showQuickMessage(\n            \"No Custom Style found, 'Earth' is used instead.\",\n            2000\n          );\n\n        const customStyle = JSON.parse(customStyleString);\n        customStyle.forEach((h) => (h.color = parseRGB(h.col)));\n        style = customStyle;\n      }\n      let terrain = TerrainGen.all.find((e) => e.codeName == _out.terrain);\n\n      function runEdit(out, amended) {\n        const { width, height } = out;\n        out.falloff = _out.falloff;\n\n        const elements = [];\n        const textures = [];\n        Undo.initEdit({ elements, textures, selection: true }, amended);\n\n        const map = terrain.noise(out);\n        const topLeftX = 0.5 - width / 2;\n        const topLeftY = 0.5 - height / 2;\n\n        const mesh = new Mesh({ vertices: {} });\n        const texture = TerrainGen.genTexture(\n          width,\n          height,\n          map,\n          style,\n          out.blending\n        );\n\n        const addedVertices = [];\n        let vertexIndex = 0;\n        for (let j = height - 1; j >= 0; j--) {\n          for (let i = width - 1; i >= 0; i--) {\n            let x = (out.size * (i + topLeftX)) / width;\n            let y = (out.size * (j + topLeftY)) / height;\n            let z = map[[i, j]] * out.multiplier + 1;\n\n            let vertex = [x, z, y];\n            addedVertices[vertexIndex] = mesh.addVertices(vertex)[0];\n            vertexIndex++;\n          }\n        }\n        vertexIndex = 0;\n        for (let y = height - 1; y >= 0; y--) {\n          for (let x = width - 1; x >= 0; x--) {\n            if (x > 0 && y > 0) {\n              let indices = [\n                vertexIndex,\n                vertexIndex + 1,\n                vertexIndex + width + 1,\n                vertexIndex + width,\n              ];\n\n              const uv = {};\n              uv[addedVertices[indices[0]]] = [\n                ((x - 1) / width) * Project._texture_width,\n                ((y - 1) / height) * Project._texture_height,\n              ];\n              uv[addedVertices[indices[1]]] = [\n                (x / width) * Project._texture_width,\n                ((y - 1) / height) * Project._texture_height,\n              ];\n              uv[addedVertices[indices[2]]] = [\n                (x / width) * Project._texture_width,\n                (y / height) * Project._texture_height,\n              ];\n              uv[addedVertices[indices[3]]] = [\n                ((x - 1) / width) * Project._texture_width,\n                (y / height) * Project._texture_height,\n              ];\n\n              const face = new MeshFace(mesh, {\n                vertices: [\n                  addedVertices[indices[3]],\n                  addedVertices[indices[2]],\n                  addedVertices[indices[1]],\n                  addedVertices[indices[0]],\n                ],\n                uv,\n                texture: texture.uuid,\n              });\n              const key = mesh.addFaces(face);\n\n              // procces were we want to remove distorted faces that get distorted from sorting problems\n              // a quick fix is to triangulate the face\n              const sortedVertices = face.getSortedVertices();\n              for (let i = 0; i < 4; i++) {\n                const vertexA = mesh.vertices[sortedVertices[i]];\n                const vertexB = mesh.vertices[sortedVertices[(i + 1) % 4]];\n\n                const dirToB = [\n                  vertexB[0] - vertexA[0],\n                  vertexB[2] - vertexA[2],\n                ];\n\n                const daigonalCheck =\n                  (dirToB[0] && dirToB[1] == 0) ||\n                  (dirToB[1] && dirToB[0] == 0);\n                if (daigonalCheck) continue;\n\n                delete mesh.faces[key];\n\n                const face1 = new MeshFace(mesh, {\n                  vertices: [\n                    addedVertices[indices[3]],\n                    addedVertices[indices[2]],\n                    addedVertices[indices[0]],\n                  ],\n                  uv,\n                  texture: texture.uuid,\n                });\n                const face2 = new MeshFace(mesh, {\n                  vertices: [\n                    addedVertices[indices[1]],\n                    addedVertices[indices[0]],\n                    addedVertices[indices[2]],\n                  ],\n                  uv,\n                  texture: texture.uuid,\n                });\n                mesh.addFaces(face1);\n                mesh.addFaces(face2);\n\n                break;\n              }\n            }\n            vertexIndex++;\n          }\n        }\n        mesh.init();\n\n        elements.push(mesh);\n        mesh.select();\n        textures.push(texture);\n        Undo.finishEdit(\"MTools: Generate Terrain Mesh\");\n      }\n      runEdit(_out, false);\n      const amendForm = {};\n\n      amendForm.width = form.width;\n      amendForm.height = form.height;\n      amendForm.size = form.size;\n      amendForm.multiplier = form.multiplier;\n      for (const key in terrain.settings) {\n        const c = {};\n        for (const skey in terrain.settings[key]) {\n          if (skey == \"value\") {\n            c[skey] = _out[key];\n          } else if (skey != \"condition\") {\n            c[skey] = terrain.settings[key][skey];\n          }\n        }\n        amendForm[key] = c;\n      }\n\n      Undo.amendEdit(amendForm, (form) => {\n        runEdit(form, true);\n      });\n    },\n    onFormChange(data) {\n      if (!data.suggested) return;\n      if (data.terrain == typeBeforeUpdate) return; // stop call stack\n\n      const selected = TerrainGen.all.find((e) => e.codeName == data.terrain);\n      typeBeforeUpdate = data.terrain;\n\n      this.setFormValues(selected.suggested);\n    },\n  }).show();\n});\n"
  },
  {
    "path": "src/mesh_tools/src/generators/terrain_style_editor.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { TerrainGen } from \"../utils/terrain_gen.js\";\nimport { parseRGB, gradient256 } from \"../utils/utils.js\";\n\n// wtf.\n// TODO clean the code.\nexport default action(\"terrainse\", () => {\n  let customStyle;\n  new Dialog({\n    title: \"Terrain Generator Style Editor\",\n    buttons: [\"Save\", \"Cancel\"],\n    confirmEnabled: false,\n    cancelIndex: 1,\n    width: 650,\n    onButton(i) {\n      if (i == 0) {\n        localStorage.setItem(\"mt_customStyle\", JSON.stringify(customStyle));\n      }\n    },\n    lines: [\n      `\n\t\t\t\t\t\t  <style>\n\t\t\t\t\t\t\t  .tgseLevel {\n\t\t\t\t\t\t\t\t  background-color: var(--color-back);\n\t\t\t\t\t\t\t\t  border-top: 2px solid var(--color-ui);\n\t\t\t\t\t\t\t\t  cursor: move;\n\t\t\t\t\t\t\t\t  padding: 5px;\n\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t\t  #tgse_levels{\n\t\t\t\t\t\t\t\t  max-height: 250px;\n\t\t\t\t\t\t\t\t  overflow-y: auto;\n\t\t\t\t\t\t\t  }\n\t\t\t\t\t\t  </style>\n\t\t\t\t\t\t  <div class=\"dialog_bar form_bar form_bar_t\">\n\t\t\t\t\t\t\t  <label class=\"name_space_left\">Result: </label>\n\t\t\t\t\t\t\t  <canvas id=\"tgseCanvas\" style=\"background:white\" width=\"256\", height=\"25\"></canvas>\n\t\t\t\t\t\t  </div>\n\t\t\t\t\t\t  <div class=\"dialog_bar form_bar form_bar_t\"> <button id=\"tgse_addlevel\"><b>+</b> Add level</button> </div>\n\t\t\t\t\t\t  <ul id=\"tgse_levels\" class=\"ui-sortable\">\n\t\t\t\t\t\t  </ul>\n\t\t\t\t\t\t  `,\n    ],\n  }).show();\n  /**\n   * @type HTMLCanvasElement\n   */\n  let canvas = $(\"#tgseCanvas\")[0];\n  let ctx = canvas.getContext(\"2d\");\n  // UI PART\n  let c = function (s) {\n    return $(document.createElement(s));\n  };\n  $(\"#tgse_levels\").sortable({\n    stop() {\n      comuteMTStyle();\n    },\n  });\n  $(\"#tgse_addlevel\")[0].onclick = function (v, col, b, t = true) {\n    let level = c(\"li\");\n    let deleteBtn = c(\"span\").append(\n      `<i class=\"material-icons icon tool\" style=\"float:right\">delete</i>`\n    );\n    let color = new ColorPicker({\n      label: false,\n      name: \"Color\",\n      private: true,\n      color: col || \"#fff\",\n    });\n    color.jq.spectrum({\n      preferredFormat: \"hex\",\n      color: col || \"#fff\",\n      showinput: true,\n      maxSelectionSize: 128,\n      resetText: tl(\"generic.reset\"),\n      cancelText: tl(\"dialog.cancel\"),\n      chooseText: tl(\"dialog.confirm\"),\n      // !! EVERYTHING !!\n      hide: function () {\n        comuteMTStyle();\n      },\n      change: function () {\n        comuteMTStyle();\n      },\n      move: function () {\n        comuteMTStyle();\n      },\n    });\n    let height = c(\"input\")\n      .attr({\n        type: \"number\",\n        min: 0,\n        max: 100,\n        step: 0.5,\n        value: typeof v == \"number\" ? v : 100,\n      })\n      .addClass(\"dark_bordered focusable_input\");\n    let blending = c(\"input\")\n      .attr({\n        type: \"number\",\n        min: 0,\n        max: 100,\n        step: 0.5,\n        value: typeof b == \"number\" ? b : 100,\n      })\n      .addClass(\"dark_bordered focusable_input\");\n\n    height[0].oninput = function () {\n      comuteMTStyle();\n    };\n    blending[0].oninput = function () {\n      comuteMTStyle();\n    };\n    deleteBtn[0].onclick = function () {\n      ctx.clearRect(0, 0, 256, 25);\n      level.remove();\n      comuteMTStyle();\n    };\n    level\n      .addClass(\"tgseLevel\")\n      .append(deleteBtn)\n      .append(color.getNode())\n      .append(\"&nbsp;&nbsp;\")\n      .append(c(\"label\").text(\"At height percent of: \"))\n      .append(\"&nbsp;&nbsp;\")\n      .append(height)\n      .append(\"&nbsp;&nbsp;\")\n      .append(c(\"label\").text(\"With blending as: \"))\n      .append(\"&nbsp;&nbsp;\")\n      .append(blending);\n\n    $(\"#tgse_levels\").append(level[0]);\n    if (t) {\n      comuteMTStyle();\n    }\n  };\n  let cs = localStorage.mt_customStyle;\n  if (cs) {\n    let custom = JSON.parse(cs);\n    custom.forEach((h) => {\n      $(\"#tgse_addlevel\")[0].onclick(h.height * 100, h.col, h.blend * 100);\n    });\n  } else {\n    $(\"#tgse_addlevel\")[0].onclick(0, \"#f00\", 0, false);\n    $(\"#tgse_addlevel\")[0].onclick(50, \"#0f0\", 100, false);\n    $(\"#tgse_addlevel\")[0].onclick(100, \"#00f\", 100);\n  }\n\n  // COMPILING part\n\n  function comuteMTStyle() {\n    let children = $(\"#tgse_levels\").children();\n    customStyle = [];\n    const l = children.length;\n    for (let i = 0; i < l; i++) {\n      const child = children.eq(i);\n      const childChildren = child.children();\n\n      let currentHeight = childChildren.eq(3).val() * 1;\n      let currentBlend = childChildren.eq(5).val() * 1;\n      let currentColor = childChildren\n        .find(\".sp-preview-inner\")\n        .css(\"background-color\");\n      customStyle.push({\n        height: currentHeight / 100,\n        col: currentColor,\n        color: parseRGB(currentColor),\n        blend: currentBlend / 100,\n      });\n    }\n    // !uneffiecent code ahead!\n    let image = new Image(256, 1);\n    image.src = TerrainGen.genTexture(256, 1, gradient256, customStyle, false);\n    image.onload = function () {\n      ctx.drawImage(image, 0, 0, 256, 25);\n    };\n  }\n});\n"
  },
  {
    "path": "src/mesh_tools/src/generators/text_mesh.action.js",
    "content": "import RobotoRegular from \"../../assets/roboto_regular.json\";\nimport { action } from \"../actions.js\";\nimport { convertOpenTypeBufferToThreeJS } from \"../utils/facetype.js\";\nimport { throwQuickMessage } from \"../utils/info.js\";\nimport * as ThreeJSInteroperability from \"../utils/threejs_interoperability.js\";\n\nfunction runEdit(text, font, s, amended = false) {\n  let elements = [];\n  Undo.initEdit({ elements, selection: true }, amended);\n  let geometry;\n  try {\n    geometry = new THREE.TextGeometry(text, {\n      font: font,\n      size: s.size,\n      height: s.height,\n      curveSegments: s.curveSegments,\n      bevelEnabled: s.bevelThickness > 0,\n      bevelThickness: s.bevelThickness / 16,\n      bevelSize: s.bevelSize / 16,\n      bevelOffset: s.bevelOffset / 16,\n      bevelSegments: s.bevelSegments,\n    });\n  } catch (error) {\n    Blockbench.showQuickMessage(\"Invalid OpenType font!\");\n    throw error;\n  }\n  let mesh = ThreeJSInteroperability.nonIndexed(geometry);\n\n  mesh.init();\n  elements.push(mesh);\n  mesh.select();\n  Undo.finishEdit(\"MTools: Generate Mesh\");\n}\nconst dialog = new Dialog({\n  title: \"Generate Text\",\n  form: {\n    text: { label: \"Text\", type: \"textarea\", value: \"Hello, World!\" },\n    file: {\n      label: \"OpenType Font (Optional)\",\n      type: \"file\",\n      extensions: [\"ttf\", \"otf\", \"woff\", \"woff2\"],\n      placeholder: \"Roboto Regular\",\n      filetype: \"Font\",\n      readtype: \"buffer\",\n    },\n    size: { label: \"Size\", type: \"number\", value: 8, min: 0 },\n    height: { label: \"Thickness\", type: \"number\", value: 2, min: 0 },\n    curveSegments: {\n      label: \"Resolution\",\n      type: \"number\",\n      value: 1,\n      min: 1,\n    },\n    _: \"_\",\n    bevelThickness: {\n      label: \"Bevel Thickness\",\n      type: \"number\",\n      value: 0,\n      min: 0,\n    },\n    bevelSize: { label: \"Bevel Size\", type: \"number\", value: 8, min: 0 },\n    bevelOffset: {\n      label: \"Bevel Offset\",\n      type: \"number\",\n      value: 0,\n      min: 0,\n    },\n    bevelSegments: {\n      label: \"Bevel Segments\",\n      type: \"number\",\n      value: 1,\n      min: 0,\n    },\n  },\n  onConfirm(out) {\n    let content;\n    if (!out.file) {\n      content = RobotoRegular;\n    } else {\n      try {\n        content = convertOpenTypeBufferToThreeJS(this.form.file.content);\n      } catch (err) {\n        Blockbench.showQuickMessage(\"Invalid OpenType font!\");\n        throw err;\n      }\n    }\n    for (const char of out.text) {\n      if (char != \"\\n\" && !(char in content.glyphs)) {\n        throwQuickMessage(\n          `Character \"${char}\" doesn't exist on the provided font!`,\n          2000\n        );\n      }\n    }\n    const font = new THREE.Font(content);\n    runEdit(out.text, font, out);\n\n    Undo.amendEdit(\n      {\n        text: {\n          label: \"Text\",\n          type: \"textarea\",\n          value: out.text,\n        },\n        size: {\n          label: \"Size\",\n          type: \"number\",\n          value: out.size,\n          min: 0,\n        },\n        height: {\n          label: \"Thickness\",\n          type: \"number\",\n          value: out.height,\n          min: 0,\n        },\n        curveSegments: {\n          label: \"Resolution\",\n          type: \"number\",\n          value: out.curveSegments,\n          min: 1,\n        },\n        bevelThickness: {\n          label: \"Bevel Thickness\",\n          type: \"number\",\n          value: out.bevelThickness,\n          min: 0,\n        },\n        bevelSize: {\n          label: \"Bevel Size\",\n          type: \"number\",\n          value: out.bevelSize,\n          min: 0,\n        },\n        bevelOffset: {\n          label: \"Bevel Offset\",\n          type: \"number\",\n          value: out.bevelOffset,\n          min: 0,\n        },\n        bevelSegments: {\n          label: \"Bevel Segments\",\n          type: \"number\",\n          value: out.bevelSegments,\n          min: 0,\n        },\n      },\n      (form) => {\n        runEdit(form.text, font, form, true);\n      }\n    );\n  },\n});\nexport default action(\"textmesh\", () => {\n  dialog.show();\n});\n"
  },
  {
    "path": "src/mesh_tools/src/generators/xyz_math_surface_function.action.js",
    "content": "import xyzpresets from \"../../assets/xyz_presets.jsonc\";\nimport { action } from \"../actions.js\";\nimport { Parser, Expression } from \"expr-eval\";\nimport { freezeProperty, snakeToPascal } from \"../utils/utils.js\";\nconst mathParser = new Parser({\n  allowMemberAccess: true,\n});\nmathParser.consts = {\n  E: Math.E,\n  e: Math.E,\n  PI: Math.PI,\n  pi: Math.PI,\n  sq2: Math.SQRT2\n};\n\nexport default action(\"xyzmathsurfacefunction\", () => {\n  let options = {};\n  for (const key in xyzpresets) {\n    options[key] = key;\n  }\n  let msettings = localStorage.getItem(\"mt_xyzSettings\");\n  let presetBeforeUpdate;\n  if (msettings != null) {\n    msettings = JSON.parse(msettings);\n    presetBeforeUpdate = msettings.preset;\n  } else {\n    msettings = xyzpresets.TwistedTorus;\n    presetBeforeUpdate = \"TwistedTorus\";\n  }\n  let justOpened = true;\n  let dial = new Dialog({\n    title: \"XYZ Math Surface Function\",\n    part_order: [\"form\", \"lines\"],\n    buttons: [\"Save Settings To Memory\", \"Confirm\", \"Cancel\"],\n    cancelIndex: 2,\n    confirmIndex: 1,\n    width: 650,\n    onFormChange(data) {\n      if (justOpened) {\n        // this just for skipping loading saved settings\n        justOpened = false;\n        return;\n      }\n      if (data.preset == presetBeforeUpdate) return; // stop call stack\n      presetBeforeUpdate = data.preset;\n\n      this.setFormValues(xyzpresets[data.preset]);\n    },\n    form: {\n      preset: { label: \"Preset\", type: \"select\", options: () => options },\n      x: {\n        label: \"X\",\n        type: \"text\",\n        value: xyzpresets[\"TwistedTorus\"].x,\n      },\n      y: {\n        label: \"Y\",\n        type: \"text\",\n        value: xyzpresets[\"TwistedTorus\"].y,\n      },\n      z: {\n        label: \"Z\",\n        type: \"text\",\n        value: xyzpresets[\"TwistedTorus\"].z,\n      },\n      scale: { label: \"Scale\", type: \"number\", value: 1 },\n      _: \"_\",\n      uRange: {\n        label: \"U Range\",\n        type: \"vector\",\n        dimensions: 2,\n        value: [0, 6.2831854820251465],\n      },\n      uDivs: { label: \"U Divisions\", type: \"number\", min: 2, value: 32 },\n      uWrap: { label: \"U Wrap\", type: \"checkbox\", value: true },\n      vRange: {\n        label: \"V Range\",\n        type: \"vector\",\n        dimensions: 2,\n        value: [0, 6.2831854820251465],\n      },\n      vDivs: { label: \"V Divisions\", type: \"number\", min: 2, value: 16 },\n      vWrap: { label: \"V Wrap\", type: \"checkbox\", value: true },\n      vClose: { label: \"V Close\", type: \"checkbox\", value: true },\n      __: \"_\",\n      variables: {\n        label: \"Variables\",\n        type: \"textarea\",\n        placeholder: \"List the variables you want to use via name = value\",\n      },\n    },\n    onConfirm(out) {\n      const declarations = out.variables.split(`\\n`);\n\n      /**\n       * @type {{[P in string]: Expression }}\n       */\n      const declarationsMap = {};\n      for (const declaration of declarations) {\n        let [key, val] = declaration.split(/=(.+)/);\n        key = key.replace(/[\\s;]/g, \"\");\n\n        if (val !== undefined) {\n          val = val.trim();\n          declarationsMap[key] = mathParser.parse(val);\n        }\n      }\n      /**\n       * Declarations that do not depend on other variable declarations.\n       * Examples of static declarations:\n       * ```\n       * a = 2; \n       * b = 2 * pi;\n       * c = a * pi; // non static declaration\n       * ```\n       */\n      const staticDeclarations = [];\n      for (const key in declarationsMap) {\n        const variables = declarationsMap[key].variables();\n        if (variables.length == 0) {\n          staticDeclarations.push(key);\n        }\n      }\n\n      function runEdit(s, overrideVariables = {}, amended = false) {\n        const declarationValues = {};\n\n        let elements = [];\n        Undo.initEdit({ elements, selection: true }, amended);\n        let mesh = new Mesh({ vertices: {} });\n\n        let [umin, umax] = out.uRange;\n        let usteps = s.uDivs;\n        let uinc = (umax - umin) / usteps;\n\n        let [vmin, vmax] = out.vRange;\n        let vsteps = s.vDivs;\n        let vinc = (vmax - vmin) / vsteps;\n\n        let uRange = usteps + 1;\n        let vRange = vsteps + 1;\n        if (out.uWrap) uRange -= 1;\n        if (out.vWrap) vRange -= 1;\n\n        let vertices = [];\n        let uvPositions = [];\n        for (let j = 0; j < vRange; j++) {\n          let v = vmin + j * vinc;\n          for (let i = 0; i < uRange; i++) {\n            let u = umin + i * uinc;\n\n            const context = {\n              u,\n              v,\n              /**\n               * Backwards compatibility for p.u and p.v\n               */\n              p: { u, v },\n            };\n            // Disable overwriting\n            freezeProperty(context, \"u\");\n            freezeProperty(context, \"v\");\n            freezeProperty(context, \"p\");\n            freezeProperty(context.p, \"u\");\n            freezeProperty(context.p, \"v\");\n\n            for (const key in declarationsMap) {\n              if (key in overrideVariables) {\n                declarationValues[key] = context[key] = overrideVariables[key];\n                continue;\n              }\n              const expression = declarationsMap[key];\n              declarationValues[key] = context[key] = expression.evaluate(context);\n            }\n\n            let x = +mathParser.evaluate(out.x, context) * out.scale;\n            let y = +mathParser.evaluate(out.y, context) * out.scale;\n            let z = +mathParser.evaluate(out.z, context) * out.scale;\n            if (isNaN(x) || Math.abs(x) === Infinity) {\n              x = 0;\n            }\n            if (isNaN(y) || Math.abs(y) === Infinity) {\n              y = 0;\n            }\n            if (isNaN(z) || Math.abs(z) === Infinity) {\n              z = 0;\n            }\n\n            vertices.push(mesh.addVertices([x, y, z])[0]);\n            uvPositions.push([i, j]);\n          }\n        }\n        for (let y = 0; y < vsteps; y++) {\n          for (let x = 0; x < usteps; x++) {\n            let yNext = y + 1;\n            let xNext = x + 1;\n\n            if (out.vWrap && yNext >= vRange) yNext = 0;\n            if (out.uWrap && xNext >= uRange) xNext = 0;\n\n            let vertexIndices = [\n              yNext * uRange + xNext,\n              yNext * uRange + x,\n              y * uRange + x,\n              y * uRange + xNext,\n            ];\n            let face = new MeshFace(mesh, {\n              vertices: [\n                vertices[vertexIndices[0]],\n                vertices[vertexIndices[1]],\n                vertices[vertexIndices[2]],\n                vertices[vertexIndices[3]],\n              ],\n            });\n            let uv = [\n              uvPositions[vertexIndices[0]]\n                .slice()\n                .V3_divide(uRange - 1, vRange - 1)\n                .V3_multiply(Project._texture_width, Project._texture_height),\n              uvPositions[vertexIndices[1]]\n                .slice()\n                .V3_divide(uRange - 1, vRange - 1)\n                .V3_multiply(Project._texture_width, Project._texture_height),\n              uvPositions[vertexIndices[2]]\n                .slice()\n                .V3_divide(uRange - 1, vRange - 1)\n                .V3_multiply(Project._texture_width, Project._texture_height),\n              uvPositions[vertexIndices[3]]\n                .slice()\n                .V3_divide(uRange - 1, vRange - 1)\n                .V3_multiply(Project._texture_width, Project._texture_height),\n            ];\n            face.uv[face.vertices[0]] = [uv[0][0], uv[0][1]];\n            face.uv[face.vertices[1]] = [uv[1][0], uv[1][1]];\n            face.uv[face.vertices[2]] = [uv[2][0], uv[2][1]];\n            face.uv[face.vertices[3]] = [uv[3][0], uv[3][1]];\n            mesh.addFaces(face);\n          }\n        }\n        // fills end caps\n        if (out.vClose && out.uWrap && !out.vWrap) {\n          for (let x = 1; x < usteps - 1; x++) {\n            let face1 = new MeshFace(mesh, {\n              vertices: [\n                vertices[usteps - 1],\n                vertices[usteps - 1 - x],\n                vertices[usteps - 2 - x],\n              ],\n            });\n            let face2 = new MeshFace(mesh, {\n              vertices: [\n                vertices[vsteps * uRange],\n                vertices[vsteps * uRange + x],\n                vertices[vsteps * uRange + x + 1],\n              ],\n            });\n            mesh.addFaces(face1, face2);\n          }\n        }\n        mesh.init();\n        elements.push(mesh);\n        mesh.select();\n        Undo.finishEdit(\"MTools: Generate Mesh\");\n\n        return declarationValues;\n      }\n      const declarationValues = runEdit(out);\n      Undo.amendEdit(\n        {\n          uDivs: { label: \"U divisions\", value: out.uDivs, min: 2 },\n          vDivs: { label: \"V divisions\", value: out.vDivs, min: 2 },\n\n          ...Object.fromEntries(staticDeclarations.map(key => ['@value/' +key, {\n            label: snakeToPascal(key),\n            value: declarationValues[key],\n            step: 0.1\n          }])),\n        },\n        (form) => {\n          const variables = {};\n          for (const key in form) {\n            if (key.startsWith('@value/')) {\n              variables[key.substring('@value/'.length)] = form[key];\n            }\n          }\n          runEdit(form, variables, true);\n        }\n      );\n    },\n  });\n  dial.show();\n  if (msettings != null) {\n    dial.setFormValues(msettings);\n  }\n\n  let saveBtn = $(`button:contains(\"Save Settings To Memory\")`);\n  saveBtn.off(\"click\");\n  saveBtn.on(\"click\", function () {\n    let mmsettings = dial.getFormResult();\n    localStorage.setItem(\"mt_xyzSettings\", JSON.stringify(mmsettings));\n  });\n});\n"
  },
  {
    "path": "src/mesh_tools/src/global.d.ts",
    "content": "declare interface UndoSystem {\n  /**\n   * Starts an edit to the current project by saving the state of the provided aspects\n   * @param aspects Aspects to save\n   */\n  initEdit(aspects: UndoAspects, amended?: boolean): UndoEntry;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/globals.js",
    "content": "import { QualifiedStorage } from \"./utils/storage.js\";\n\nexport const PLUGIN_ID = \"mesh_tools\";\nexport const storage = new QualifiedStorage(PLUGIN_ID);\n"
  },
  {
    "path": "src/mesh_tools/src/index.js",
    "content": "import \"./tools/index.js\";\nimport \"./operators/index.js\";\nimport \"./generators/index.js\";\nimport { ACTIONS, qualifyName } from \"./actions.js\";\nimport { createTextMesh, vertexNormal } from \"./utils/utils.js\";\nimport { PLUGIN_ID, storage } from \"./globals.js\";\n\nconst deletables = [];\n/**\n * @type {Array<THREE.Object3D>}\n */\nconst meshToolTips = [];\nBBPlugin.register(PLUGIN_ID, {\n  new_repository_format: true,\n  title: \"MTools\",\n  author: \"Malik12tree\",\n  icon: \"icon.png\",\n  description: \"Adds powerful mesh modeling tools, operators and generators!\",\n  version: \"2.1.0\",\n  min_version: \"4.9.4\",\n  variant: \"both\",\n  creation_date: \"2022-04-09\",\n  has_changelog: true,\n  tags: [\"Format: Generic Model\", \"Mesh\", \"Tool\"],\n  onload() {\n    function debug(element) {\n      for (const object of meshToolTips) {\n        scene.remove(object);\n      }\n\n      for (const faceKey in element.faces) {\n        const face = element.faces[faceKey];\n        const center = face.getCenter().V3_toThree();\n        element.mesh.localToWorld(center);\n\n        const normal = face.getNormal(true).V3_toThree();\n\n        const mesh = createTextMesh(faceKey, {\n          fillStyle: \"blue\",\n          fontSize: 25,\n        });\n        meshToolTips.push(mesh);\n\n        mesh.position.copy(center);\n        if (normal) {\n          mesh.position.add(normal.multiplyScalar(0.5));\n        }\n\n        scene.add(mesh);\n      }\n      for (const vertexKey in element.vertices) {\n        const vertex = element.vertices[vertexKey].V3_toThree();\n        element.mesh.localToWorld(vertex);\n\n        const normal =\n          vertexNormal(element, vertexKey) ?? new THREE.Vector3(0, 1, 0);\n\n        const mesh = createTextMesh(vertexKey, {\n          fillStyle: \"red\",\n          fontSize: 25,\n        });\n        meshToolTips.push(mesh);\n\n        mesh.position.copy(vertex);\n\n        if (normal) {\n          mesh.position.add(normal.multiplyScalar(0.25));\n        }\n\n        scene.add(mesh);\n      }\n    }\n\n    // TODO move to separate plugin\n    const isDebug = false && this.source == \"file\";\n    if (isDebug) {\n      deletables.push(\n        Mesh.prototype.preview_controller.on(\"update_geometry\", ({ element }) =>\n          debug(element)\n        )\n      );\n      for (const mesh of Mesh.all) {\n        debug(mesh);\n      }\n    }\n\n    Mesh.prototype.menu.structure.unshift(qualifyName(\"tools\"));\n    Mesh.prototype.menu.structure.unshift(qualifyName(\"operators\"));\n    MenuBar.addAction(qualifyName(\"generators\"), \"filter\");\n  },\n  onuninstall() {\n    storage.clear();\n  },\n  onunload() {\n    for (const deletable of deletables) {\n      deletable.delete();\n    }\n    for (const object of meshToolTips) {\n      scene.remove(object);\n    }\n\n    for (const actionId in ACTIONS) {\n      const id = qualifyName(actionId);\n      BarItems[id]?.delete();\n    }\n  },\n});\n"
  },
  {
    "path": "src/mesh_tools/src/lib/three-polyfills/BatchedMesh.js",
    "content": "import { BufferAttribute } from \"three\";\nimport { BufferGeometry } from \"three\";\nimport { DataTexture } from \"three\";\nimport {\n  FloatType,\n  RedIntegerFormat,\n  UnsignedIntType,\n  RGBAFormat,\n} from \"three\";\nimport { Matrix4 } from \"three\";\nimport { Mesh } from \"three\";\nimport { Box3 } from \"three\";\nimport { Sphere } from \"three\";\nimport { Frustum } from \"three\";\nimport { Vector3 } from \"three\";\nimport { Color } from \"three\";\n\nfunction ascIdSort(a, b) {\n  return a - b;\n}\n\nfunction sortOpaque(a, b) {\n  return a.z - b.z;\n}\n\nfunction sortTransparent(a, b) {\n  return b.z - a.z;\n}\n\nclass MultiDrawRenderList {\n  constructor() {\n    this.index = 0;\n    this.pool = [];\n    this.list = [];\n  }\n\n  push(start, count, z, index) {\n    const pool = this.pool;\n    const list = this.list;\n    if (this.index >= pool.length) {\n      pool.push({\n        start: -1,\n        count: -1,\n        z: -1,\n        index: -1,\n      });\n    }\n\n    const item = pool[this.index];\n    list.push(item);\n    this.index++;\n\n    item.start = start;\n    item.count = count;\n    item.z = z;\n    item.index = index;\n  }\n\n  reset() {\n    this.list.length = 0;\n    this.index = 0;\n  }\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color(1, 1, 1);\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _box = /*@__PURE__*/ new Box3();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData(src, target, targetOffset = 0) {\n  const itemSize = target.itemSize;\n  if (\n    src.isInterleavedBufferAttribute ||\n    src.array.constructor !== target.array.constructor\n  ) {\n    // use the component getters and setters if the array data cannot\n    // be copied directly\n    const vertexCount = src.count;\n    for (let i = 0; i < vertexCount; i++) {\n      for (let c = 0; c < itemSize; c++) {\n        target.setComponent(i + targetOffset, c, src.getComponent(i, c));\n      }\n    }\n  } else {\n    // faster copy approach using typed array set function\n    target.array.set(src.array, targetOffset * itemSize);\n  }\n\n  target.needsUpdate = true;\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents(src, target) {\n  if (src.constructor !== target.constructor) {\n    // if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n    const len = Math.min(src.length, target.length);\n    for (let i = 0; i < len; i++) {\n      target[i] = src[i];\n    }\n  } else {\n    // if the arrays use the same data layout we can use a fast block copy\n    const len = Math.min(src.length, target.length);\n    target.set(new src.constructor(src.buffer, 0, len));\n  }\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n  /**\n   * Constructs a new batched mesh.\n   *\n   * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n   * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n   * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n   * @param {Material|Array<Material>} [material] - The mesh material.\n   */\n  constructor(\n    maxInstanceCount,\n    maxVertexCount,\n    maxIndexCount = maxVertexCount * 2,\n    material\n  ) {\n    super(new BufferGeometry(), material);\n\n    /**\n     * This flag can be used for type testing.\n     *\n     * @type {boolean}\n     * @readonly\n     * @default true\n     */\n    this.isBatchedMesh = true;\n\n    /**\n     * When set ot `true`, the individual objects of a batch are frustum culled.\n     *\n     * @type {boolean}\n     * @default true\n     */\n    this.perObjectFrustumCulled = true;\n\n    /**\n     * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n     * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n     * rendered front to back.\n     *\n     * @type {boolean}\n     * @default true\n     */\n    this.sortObjects = true;\n\n    /**\n     * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n     *\n     * @type {?Box3}\n     * @default null\n     */\n    this.boundingBox = null;\n\n    /**\n     * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n     *\n     * @type {?Sphere}\n     * @default null\n     */\n    this.boundingSphere = null;\n\n    /**\n     * Takes a sort a function that is run before render. The function takes a list of instances to\n     * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n     * sort with.\n     *\n     * @type {?Function}\n     * @default null\n     */\n    this.customSort = null;\n\n    // stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n    this._instanceInfo = [];\n    this._geometryInfo = [];\n\n    // instance, geometry ids that have been set as inactive, and are available to be overwritten\n    this._availableInstanceIds = [];\n    this._availableGeometryIds = [];\n\n    // used to track where the next point is that geometry should be inserted\n    this._nextIndexStart = 0;\n    this._nextVertexStart = 0;\n    this._geometryCount = 0;\n\n    // flags\n    this._visibilityChanged = true;\n    this._geometryInitialized = false;\n\n    // cached user options\n    this._maxInstanceCount = maxInstanceCount;\n    this._maxVertexCount = maxVertexCount;\n    this._maxIndexCount = maxIndexCount;\n\n    // buffers for multi draw\n    this._multiDrawCounts = new Int32Array(maxInstanceCount);\n    this._multiDrawStarts = new Int32Array(maxInstanceCount);\n    this._multiDrawCount = 0;\n    this._multiDrawInstances = null;\n\n    // Local matrix per geometry by using data texture\n    this._matricesTexture = null;\n    this._indirectTexture = null;\n    this._colorsTexture = null;\n\n    this._initMatricesTexture();\n    this._initIndirectTexture();\n  }\n\n  /**\n   * The maximum number of individual instances that can be stored in the batch.\n   *\n   * @type {number}\n   * @readonly\n   */\n  get maxInstanceCount() {\n    return this._maxInstanceCount;\n  }\n\n  /**\n   * The instance count.\n   *\n   * @type {number}\n   * @readonly\n   */\n  get instanceCount() {\n    return this._instanceInfo.length - this._availableInstanceIds.length;\n  }\n\n  /**\n   * The number of unused vertices.\n   *\n   * @type {number}\n   * @readonly\n   */\n  get unusedVertexCount() {\n    return this._maxVertexCount - this._nextVertexStart;\n  }\n\n  /**\n   * The number of unused indices.\n   *\n   * @type {number}\n   * @readonly\n   */\n  get unusedIndexCount() {\n    return this._maxIndexCount - this._nextIndexStart;\n  }\n\n  _initMatricesTexture() {\n    // layout (1 matrix = 4 pixels)\n    //      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n    //  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n    //       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n    //       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n    //       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n    let size = Math.sqrt(this._maxInstanceCount * 4); // 4 pixels needed for 1 matrix\n    size = Math.ceil(size / 4) * 4;\n    size = Math.max(size, 4);\n\n    const matricesArray = new Float32Array(size * size * 4); // 4 floats per RGBA pixel\n    const matricesTexture = new DataTexture(\n      matricesArray,\n      size,\n      size,\n      RGBAFormat,\n      FloatType\n    );\n\n    this._matricesTexture = matricesTexture;\n  }\n\n  _initIndirectTexture() {\n    let size = Math.sqrt(this._maxInstanceCount);\n    size = Math.ceil(size);\n\n    const indirectArray = new Uint32Array(size * size);\n    const indirectTexture = new DataTexture(\n      indirectArray,\n      size,\n      size,\n      RedIntegerFormat,\n      UnsignedIntType\n    );\n\n    this._indirectTexture = indirectTexture;\n  }\n\n  _initColorsTexture() {\n    let size = Math.sqrt(this._maxInstanceCount);\n    size = Math.ceil(size);\n\n    // 4 floats per RGBA pixel initialized to white\n    const colorsArray = new Float32Array(size * size * 4).fill(1);\n    const colorsTexture = new DataTexture(\n      colorsArray,\n      size,\n      size,\n      RGBAFormat,\n      FloatType\n    );\n    colorsTexture.colorSpace = \"srgb-linear\";\n\n    this._colorsTexture = colorsTexture;\n  }\n\n  _initializeGeometry(reference) {\n    const geometry = this.geometry;\n    const maxVertexCount = this._maxVertexCount;\n    const maxIndexCount = this._maxIndexCount;\n    if (this._geometryInitialized === false) {\n      for (const attributeName in reference.attributes) {\n        const srcAttribute = reference.getAttribute(attributeName);\n        const { array, itemSize, normalized } = srcAttribute;\n\n        const dstArray = new array.constructor(maxVertexCount * itemSize);\n        const dstAttribute = new BufferAttribute(\n          dstArray,\n          itemSize,\n          normalized\n        );\n\n        geometry.setAttribute(attributeName, dstAttribute);\n      }\n\n      if (reference.getIndex() !== null) {\n        // Reserve last u16 index for primitive restart.\n        const indexArray =\n          maxVertexCount > 65535\n            ? new Uint32Array(maxIndexCount)\n            : new Uint16Array(maxIndexCount);\n\n        geometry.setIndex(new BufferAttribute(indexArray, 1));\n      }\n\n      this._geometryInitialized = true;\n    }\n  }\n\n  // Make sure the geometry is compatible with the existing combined geometry attributes\n  _validateGeometry(geometry) {\n    // check to ensure the geometries are using consistent attributes and indices\n    const batchGeometry = this.geometry;\n    if (Boolean(geometry.getIndex()) !== Boolean(batchGeometry.getIndex())) {\n      throw new Error(\n        'THREE.BatchedMesh: All geometries must consistently have \"index\".'\n      );\n    }\n\n    for (const attributeName in batchGeometry.attributes) {\n      if (!geometry.hasAttribute(attributeName)) {\n        throw new Error(\n          `THREE.BatchedMesh: Added geometry missing \"${attributeName}\". All geometries must have consistent attributes.`\n        );\n      }\n\n      const srcAttribute = geometry.getAttribute(attributeName);\n      const dstAttribute = batchGeometry.getAttribute(attributeName);\n      if (\n        srcAttribute.itemSize !== dstAttribute.itemSize ||\n        srcAttribute.normalized !== dstAttribute.normalized\n      ) {\n        throw new Error(\n          \"THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.\"\n        );\n      }\n    }\n  }\n\n  /**\n   * Validates the instance defined by the given ID.\n   *\n   * @param {number} instanceId - The the instance to validate.\n   */\n  validateInstanceId(instanceId) {\n    const instanceInfo = this._instanceInfo;\n    if (\n      instanceId < 0 ||\n      instanceId >= instanceInfo.length ||\n      instanceInfo[instanceId].active === false\n    ) {\n      throw new Error(\n        `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.`\n      );\n    }\n  }\n\n  /**\n   * Validates the geometry defined by the given ID.\n   *\n   * @param {number} geometryId - The the geometry to validate.\n   */\n  validateGeometryId(geometryId) {\n    const geometryInfoList = this._geometryInfo;\n    if (\n      geometryId < 0 ||\n      geometryId >= geometryInfoList.length ||\n      geometryInfoList[geometryId].active === false\n    ) {\n      throw new Error(\n        `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.`\n      );\n    }\n  }\n\n  /**\n   * Takes a sort a function that is run before render. The function takes a list of instances to\n   * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n   *\n   * @param {Function} func - The custom sort function.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  setCustomSort(func) {\n    this.customSort = func;\n    return this;\n  }\n\n  /**\n   * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n   * Bounding boxes aren't computed by default. They need to be explicitly computed,\n   * otherwise they are `null`.\n   */\n  computeBoundingBox() {\n    if (this.boundingBox === null) {\n      this.boundingBox = new Box3();\n    }\n\n    const boundingBox = this.boundingBox;\n    const instanceInfo = this._instanceInfo;\n\n    boundingBox.makeEmpty();\n    for (let i = 0, l = instanceInfo.length; i < l; i++) {\n      if (instanceInfo[i].active === false) continue;\n\n      const geometryId = instanceInfo[i].geometryIndex;\n      this.getMatrixAt(i, _matrix);\n      this.getBoundingBoxAt(geometryId, _box).applyMatrix4(_matrix);\n      boundingBox.union(_box);\n    }\n  }\n\n  /**\n   * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n   * Bounding spheres aren't computed by default. They need to be explicitly computed,\n   * otherwise they are `null`.\n   */\n  computeBoundingSphere() {\n    if (this.boundingSphere === null) {\n      this.boundingSphere = new Sphere();\n    }\n\n    const boundingSphere = this.boundingSphere;\n    const instanceInfo = this._instanceInfo;\n\n    boundingSphere.makeEmpty();\n    for (let i = 0, l = instanceInfo.length; i < l; i++) {\n      if (instanceInfo[i].active === false) continue;\n\n      const geometryId = instanceInfo[i].geometryIndex;\n      this.getMatrixAt(i, _matrix);\n      this.getBoundingSphereAt(geometryId, _sphere).applyMatrix4(_matrix);\n      boundingSphere.union(_sphere);\n    }\n  }\n\n  /**\n   * Adds a new instance to the batch using the geometry of the given ID and returns\n   * a new id referring to the new instance to be used by other functions.\n   *\n   * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n   * @return {number} The instance ID.\n   */\n  addInstance(geometryId) {\n    const atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n    // ensure we're not over geometry\n    if (atCapacity && this._availableInstanceIds.length === 0) {\n      throw new Error(\"THREE.BatchedMesh: Maximum item count reached.\");\n    }\n\n    const instanceInfo = {\n      visible: true,\n      active: true,\n      geometryIndex: geometryId,\n    };\n\n    let drawId = null;\n\n    // Prioritize using previously freed instance ids\n    if (this._availableInstanceIds.length > 0) {\n      this._availableInstanceIds.sort(ascIdSort);\n\n      drawId = this._availableInstanceIds.shift();\n      this._instanceInfo[drawId] = instanceInfo;\n    } else {\n      drawId = this._instanceInfo.length;\n      this._instanceInfo.push(instanceInfo);\n    }\n\n    const matricesTexture = this._matricesTexture;\n    _matrix.identity().toArray(matricesTexture.image.data, drawId * 16);\n    matricesTexture.needsUpdate = true;\n\n    const colorsTexture = this._colorsTexture;\n    if (colorsTexture) {\n      _whiteColor.toArray(colorsTexture.image.data, drawId * 4);\n      colorsTexture.needsUpdate = true;\n    }\n\n    this._visibilityChanged = true;\n    return drawId;\n  }\n\n  /**\n   * Adds the given geometry to the batch and returns the associated\n   * geometry id referring to it to be used in other functions.\n   *\n   * @param {BufferGeometry} geometry - The geometry to add.\n   * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n   * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n   * to set a new geometry at this index at a later time that is larger than the original geometry.\n   * Defaults to the length of the given geometry vertex buffer.\n   * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n   * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n   * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n   * the length of the given geometry index buffer.\n   * @return {number} The geometry ID.\n   */\n  addGeometry(geometry, reservedVertexCount = -1, reservedIndexCount = -1) {\n    this._initializeGeometry(geometry);\n\n    this._validateGeometry(geometry);\n\n    const geometryInfo = {\n      // geometry information\n      vertexStart: -1,\n      vertexCount: -1,\n      reservedVertexCount: -1,\n\n      indexStart: -1,\n      indexCount: -1,\n      reservedIndexCount: -1,\n\n      // draw range information\n      start: -1,\n      count: -1,\n\n      // state\n      boundingBox: null,\n      boundingSphere: null,\n      active: true,\n    };\n\n    const geometryInfoList = this._geometryInfo;\n    geometryInfo.vertexStart = this._nextVertexStart;\n    geometryInfo.reservedVertexCount =\n      reservedVertexCount === -1\n        ? geometry.getAttribute(\"position\").count\n        : reservedVertexCount;\n\n    const index = geometry.getIndex();\n    const hasIndex = index !== null;\n    if (hasIndex) {\n      geometryInfo.indexStart = this._nextIndexStart;\n      geometryInfo.reservedIndexCount =\n        reservedIndexCount === -1 ? index.count : reservedIndexCount;\n    }\n\n    if (\n      (geometryInfo.indexStart !== -1 &&\n        geometryInfo.indexStart + geometryInfo.reservedIndexCount >\n          this._maxIndexCount) ||\n      geometryInfo.vertexStart + geometryInfo.reservedVertexCount >\n        this._maxVertexCount\n    ) {\n      throw new Error(\n        \"THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.\"\n      );\n    }\n\n    // update id\n    let geometryId;\n    if (this._availableGeometryIds.length > 0) {\n      this._availableGeometryIds.sort(ascIdSort);\n\n      geometryId = this._availableGeometryIds.shift();\n      geometryInfoList[geometryId] = geometryInfo;\n    } else {\n      geometryId = this._geometryCount;\n      this._geometryCount++;\n      geometryInfoList.push(geometryInfo);\n    }\n\n    // update the geometry\n    this.setGeometryAt(geometryId, geometry);\n\n    // increment the next geometry position\n    this._nextIndexStart =\n      geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n    this._nextVertexStart =\n      geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n    return geometryId;\n  }\n\n  /**\n   * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n   * is not enough space reserved for geometry. Calling this will change all instances that are\n   * rendering that geometry.\n   *\n   * @param {number} geometryId - The ID of the geomtry that should be replaced with the given geometry.\n   * @param {BufferGeometry} geometry - The new geometry.\n   * @return {number} The geometry ID.\n   */\n  setGeometryAt(geometryId, geometry) {\n    if (geometryId >= this._geometryCount) {\n      throw new Error(\"THREE.BatchedMesh: Maximum geometry count reached.\");\n    }\n\n    this._validateGeometry(geometry);\n\n    const batchGeometry = this.geometry;\n    const hasIndex = batchGeometry.getIndex() !== null;\n    const dstIndex = batchGeometry.getIndex();\n    const srcIndex = geometry.getIndex();\n    const geometryInfo = this._geometryInfo[geometryId];\n    if (\n      (hasIndex && srcIndex.count > geometryInfo.reservedIndexCount) ||\n      geometry.attributes.position.count > geometryInfo.reservedVertexCount\n    ) {\n      throw new Error(\n        \"THREE.BatchedMesh: Reserved space not large enough for provided geometry.\"\n      );\n    }\n\n    // copy geometry buffer data over\n    const vertexStart = geometryInfo.vertexStart;\n    const reservedVertexCount = geometryInfo.reservedVertexCount;\n    geometryInfo.vertexCount = geometry.getAttribute(\"position\").count;\n\n    for (const attributeName in batchGeometry.attributes) {\n      // copy attribute data\n      const srcAttribute = geometry.getAttribute(attributeName);\n      const dstAttribute = batchGeometry.getAttribute(attributeName);\n      copyAttributeData(srcAttribute, dstAttribute, vertexStart);\n\n      // fill the rest in with zeroes\n      const itemSize = srcAttribute.itemSize;\n      for (let i = srcAttribute.count, l = reservedVertexCount; i < l; i++) {\n        const index = vertexStart + i;\n        for (let c = 0; c < itemSize; c++) {\n          dstAttribute.setComponent(index, c, 0);\n        }\n      }\n\n      dstAttribute.needsUpdate = true;\n      dstAttribute.addUpdateRange(\n        vertexStart * itemSize,\n        reservedVertexCount * itemSize\n      );\n    }\n\n    // copy index\n    if (hasIndex) {\n      const indexStart = geometryInfo.indexStart;\n      const reservedIndexCount = geometryInfo.reservedIndexCount;\n      geometryInfo.indexCount = geometry.getIndex().count;\n\n      // copy index data over\n      for (let i = 0; i < srcIndex.count; i++) {\n        dstIndex.setX(indexStart + i, vertexStart + srcIndex.getX(i));\n      }\n\n      // fill the rest in with zeroes\n      for (let i = srcIndex.count, l = reservedIndexCount; i < l; i++) {\n        dstIndex.setX(indexStart + i, vertexStart);\n      }\n\n      dstIndex.needsUpdate = true;\n      dstIndex.addUpdateRange(indexStart, geometryInfo.reservedIndexCount);\n    }\n\n    // update the draw range\n    geometryInfo.start = hasIndex\n      ? geometryInfo.indexStart\n      : geometryInfo.vertexStart;\n    geometryInfo.count = hasIndex\n      ? geometryInfo.indexCount\n      : geometryInfo.vertexCount;\n\n    // store the bounding boxes\n    geometryInfo.boundingBox = null;\n    if (geometry.boundingBox !== null) {\n      geometryInfo.boundingBox = geometry.boundingBox.clone();\n    }\n\n    geometryInfo.boundingSphere = null;\n    if (geometry.boundingSphere !== null) {\n      geometryInfo.boundingSphere = geometry.boundingSphere.clone();\n    }\n\n    this._visibilityChanged = true;\n    return geometryId;\n  }\n\n  /**\n   * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n   * this geometry will also be removed as a side effect.\n   *\n   * @param {number} geometryId - The ID of the geomtry to remove from the batch.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  deleteGeometry(geometryId) {\n    const geometryInfoList = this._geometryInfo;\n    if (\n      geometryId >= geometryInfoList.length ||\n      geometryInfoList[geometryId].active === false\n    ) {\n      return this;\n    }\n\n    // delete any instances associated with this geometry\n    const instanceInfo = this._instanceInfo;\n    for (let i = 0, l = instanceInfo.length; i < l; i++) {\n      if (\n        instanceInfo[i].active &&\n        instanceInfo[i].geometryIndex === geometryId\n      ) {\n        this.deleteInstance(i);\n      }\n    }\n\n    geometryInfoList[geometryId].active = false;\n    this._availableGeometryIds.push(geometryId);\n    this._visibilityChanged = true;\n\n    return this;\n  }\n\n  /**\n   * Deletes an existing instance from the batch using the given ID.\n   *\n   * @param {number} instanceId - The ID of the instance to remove from the batch.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  deleteInstance(instanceId) {\n    this.validateInstanceId(instanceId);\n\n    this._instanceInfo[instanceId].active = false;\n    this._availableInstanceIds.push(instanceId);\n    this._visibilityChanged = true;\n\n    return this;\n  }\n\n  /**\n   * Repacks the sub geometries in [name] to remove any unused space remaining from\n   * previously deleted geometry, freeing up space to add new geometry.\n   *\n   * @param {number} instanceId - The ID of the instance to remove from the batch.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  optimize() {\n    // track the next indices to copy data to\n    let nextVertexStart = 0;\n    let nextIndexStart = 0;\n\n    // Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n    // in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n    const geometryInfoList = this._geometryInfo;\n    const indices = geometryInfoList\n      .map((e, i) => i)\n      .sort((a, b) => {\n        return (\n          geometryInfoList[a].vertexStart - geometryInfoList[b].vertexStart\n        );\n      });\n\n    const geometry = this.geometry;\n    for (let i = 0, l = geometryInfoList.length; i < l; i++) {\n      // if a geometry range is inactive then don't copy anything\n      const index = indices[i];\n      const geometryInfo = geometryInfoList[index];\n      if (geometryInfo.active === false) {\n        continue;\n      }\n\n      // if a geometry contains an index buffer then shift it, as well\n      if (geometry.index !== null) {\n        if (geometryInfo.indexStart !== nextIndexStart) {\n          const { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n          const index = geometry.index;\n          const array = index.array;\n\n          // shift the index pointers based on how the vertex data will shift\n          // adjusting the index must happen first so the original vertex start value is available\n          const elementDelta = nextVertexStart - vertexStart;\n          for (let j = indexStart; j < indexStart + reservedIndexCount; j++) {\n            array[j] = array[j] + elementDelta;\n          }\n\n          index.array.copyWithin(\n            nextIndexStart,\n            indexStart,\n            indexStart + reservedIndexCount\n          );\n          index.addUpdateRange(nextIndexStart, reservedIndexCount);\n\n          geometryInfo.indexStart = nextIndexStart;\n        }\n\n        nextIndexStart += geometryInfo.reservedIndexCount;\n      }\n\n      // if a geometry needs to be moved then copy attribute data to overwrite unused space\n      if (geometryInfo.vertexStart !== nextVertexStart) {\n        const { vertexStart, reservedVertexCount } = geometryInfo;\n        const attributes = geometry.attributes;\n        for (const key in attributes) {\n          const attribute = attributes[key];\n          const { array, itemSize } = attribute;\n          array.copyWithin(\n            nextVertexStart * itemSize,\n            vertexStart * itemSize,\n            (vertexStart + reservedVertexCount) * itemSize\n          );\n          attribute.addUpdateRange(\n            nextVertexStart * itemSize,\n            reservedVertexCount * itemSize\n          );\n        }\n\n        geometryInfo.vertexStart = nextVertexStart;\n      }\n\n      nextVertexStart += geometryInfo.reservedVertexCount;\n      geometryInfo.start = geometry.index\n        ? geometryInfo.indexStart\n        : geometryInfo.vertexStart;\n\n      // step the next geometry points to the shifted position\n      this._nextIndexStart = geometry.index\n        ? geometryInfo.indexStart + geometryInfo.reservedIndexCount\n        : 0;\n      this._nextVertexStart =\n        geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns the bounding box for the given geometry.\n   *\n   * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n   * @param {Box3} target - The target object that is used to store the method's result.\n   * @return {Box3|null} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n   */\n  getBoundingBoxAt(geometryId, target) {\n    if (geometryId >= this._geometryCount) {\n      return null;\n    }\n\n    // compute bounding box\n    const geometry = this.geometry;\n    const geometryInfo = this._geometryInfo[geometryId];\n    if (geometryInfo.boundingBox === null) {\n      const box = new Box3();\n      const index = geometry.index;\n      const position = geometry.attributes.position;\n      for (\n        let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count;\n        i < l;\n        i++\n      ) {\n        let iv = i;\n        if (index) {\n          iv = index.getX(iv);\n        }\n\n        box.expandByPoint(_vector.fromBufferAttribute(position, iv));\n      }\n\n      geometryInfo.boundingBox = box;\n    }\n\n    target.copy(geometryInfo.boundingBox);\n    return target;\n  }\n\n  /**\n   * Returns the bounding sphere for the given geometry.\n   *\n   * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n   * @param {Sphere} target - The target object that is used to store the method's result.\n   * @return {Sphere|null} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n   */\n  getBoundingSphereAt(geometryId, target) {\n    if (geometryId >= this._geometryCount) {\n      return null;\n    }\n\n    // compute bounding sphere\n    const geometry = this.geometry;\n    const geometryInfo = this._geometryInfo[geometryId];\n    if (geometryInfo.boundingSphere === null) {\n      const sphere = new Sphere();\n      this.getBoundingBoxAt(geometryId, _box);\n      _box.getCenter(sphere.center);\n\n      const index = geometry.index;\n      const position = geometry.attributes.position;\n\n      let maxRadiusSq = 0;\n      for (\n        let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count;\n        i < l;\n        i++\n      ) {\n        let iv = i;\n        if (index) {\n          iv = index.getX(iv);\n        }\n\n        _vector.fromBufferAttribute(position, iv);\n        maxRadiusSq = Math.max(\n          maxRadiusSq,\n          sphere.center.distanceToSquared(_vector)\n        );\n      }\n\n      sphere.radius = Math.sqrt(maxRadiusSq);\n      geometryInfo.boundingSphere = sphere;\n    }\n\n    target.copy(geometryInfo.boundingSphere);\n    return target;\n  }\n\n  /**\n   * Sets the given local transformation matrix to the defined instance.\n   * Negatively scaled matrices are not supported.\n   *\n   * @param {number} instanceId - The ID of an instance to set the matrix of.\n   * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  setMatrixAt(instanceId, matrix) {\n    this.validateInstanceId(instanceId);\n\n    const matricesTexture = this._matricesTexture;\n    const matricesArray = this._matricesTexture.image.data;\n    matrix.toArray(matricesArray, instanceId * 16);\n    matricesTexture.needsUpdate = true;\n\n    return this;\n  }\n\n  /**\n   * Returns the local transformation matrix of the defined instance.\n   *\n   * @param {number} instanceId - The ID of an instance to get the matrix of.\n   * @param {Matrix4} matrix - The target object that is used to store the method's result.\n   * @return {Matrix4} The instance's local transformation matrix.\n   */\n  getMatrixAt(instanceId, matrix) {\n    this.validateInstanceId(instanceId);\n    return matrix.fromArray(this._matricesTexture.image.data, instanceId * 16);\n  }\n\n  /**\n   * Sets the given color to the defined instance.\n   *\n   * @param {number} instanceId - The ID of an instance to set the color of.\n   * @param {Color} color - The color to set the instance to.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  setColorAt(instanceId, color) {\n    this.validateInstanceId(instanceId);\n\n    if (this._colorsTexture === null) {\n      this._initColorsTexture();\n    }\n\n    color.toArray(this._colorsTexture.image.data, instanceId * 4);\n    this._colorsTexture.needsUpdate = true;\n\n    return this;\n  }\n\n  /**\n   * Returns the color of the defined instance.\n   *\n   * @param {number} instanceId - The ID of an instance to get the color of.\n   * @param {Color} color - The target object that is used to store the method's result.\n   * @return {Color} The instance's color.\n   */\n  getColorAt(instanceId, color) {\n    this.validateInstanceId(instanceId);\n    return color.fromArray(this._colorsTexture.image.data, instanceId * 4);\n  }\n\n  /**\n   * Sets the visibility of the instance.\n   *\n   * @param {number} instanceId - The id of the instance to set the visibility of.\n   * @param {boolean} visible - Whether the instance is visible or not.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  setVisibleAt(instanceId, visible) {\n    this.validateInstanceId(instanceId);\n\n    if (this._instanceInfo[instanceId].visible === visible) {\n      return this;\n    }\n\n    this._instanceInfo[instanceId].visible = visible;\n    this._visibilityChanged = true;\n\n    return this;\n  }\n\n  /**\n   * Returns the visibility state of the defined instance.\n   *\n   * @param {number} instanceId - The ID of an instance to get the visibility state of.\n   * @return {boolean} Whether the instance is visible or not.\n   */\n  getVisibleAt(instanceId) {\n    this.validateInstanceId(instanceId);\n\n    return this._instanceInfo[instanceId].visible;\n  }\n\n  /**\n   * Sets the geometry ID of the instance at the given index.\n   *\n   * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n   * @param {number} geometryId - The geometry ID to be use by the instance.\n   * @return {BatchedMesh} A reference to this batched mesh.\n   */\n  setGeometryIdAt(instanceId, geometryId) {\n    this.validateInstanceId(instanceId);\n    this.validateGeometryId(geometryId);\n\n    this._instanceInfo[instanceId].geometryIndex = geometryId;\n\n    return this;\n  }\n\n  /**\n   * Returns the geometry ID of the defined instance.\n   *\n   * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n   * @return {number} The instance's geometry ID.\n   */\n  getGeometryIdAt(instanceId) {\n    this.validateInstanceId(instanceId);\n\n    return this._instanceInfo[instanceId].geometryIndex;\n  }\n\n  /**\n   * Get the range representing the subset of triangles related to the attached geometry,\n   * indicating the starting offset and count, or `null` if invalid.\n   *\n   * @param {number} geometryId - The id of the geometry to get the range of.\n   * @param {Object} [target] - The target object that is used to store the method's result.\n   * @return {{\n   * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n   * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n   * \tstart:number,count:number\n   * }} The result object with range data.\n   */\n  getGeometryRangeAt(geometryId, target = {}) {\n    this.validateGeometryId(geometryId);\n\n    const geometryInfo = this._geometryInfo[geometryId];\n    target.vertexStart = geometryInfo.vertexStart;\n    target.vertexCount = geometryInfo.vertexCount;\n    target.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n    target.indexStart = geometryInfo.indexStart;\n    target.indexCount = geometryInfo.indexCount;\n    target.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n    target.start = geometryInfo.start;\n    target.count = geometryInfo.count;\n\n    return target;\n  }\n\n  /**\n   * Resizes the necessary buffers to support the provided number of instances.\n   * If the provided arguments shrink the number of instances but there are not enough\n   * unused Ids at the end of the list then an error is thrown.\n   *\n   * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n   */\n  setInstanceCount(maxInstanceCount) {\n    // shrink the available instances as much as possible\n    const availableInstanceIds = this._availableInstanceIds;\n    const instanceInfo = this._instanceInfo;\n    availableInstanceIds.sort(ascIdSort);\n    while (\n      availableInstanceIds[availableInstanceIds.length - 1] ===\n      instanceInfo.length\n    ) {\n      instanceInfo.pop();\n      availableInstanceIds.pop();\n    }\n\n    // throw an error if it can't be shrunk to the desired size\n    if (maxInstanceCount < instanceInfo.length) {\n      throw new Error(\n        `BatchedMesh: Instance ids outside the range ${maxInstanceCount} are being used. Cannot shrink instance count.`\n      );\n    }\n\n    // copy the multi draw counts\n    const multiDrawCounts = new Int32Array(maxInstanceCount);\n    const multiDrawStarts = new Int32Array(maxInstanceCount);\n    copyArrayContents(this._multiDrawCounts, multiDrawCounts);\n    copyArrayContents(this._multiDrawStarts, multiDrawStarts);\n\n    this._multiDrawCounts = multiDrawCounts;\n    this._multiDrawStarts = multiDrawStarts;\n    this._maxInstanceCount = maxInstanceCount;\n\n    // update texture data for instance sampling\n    const indirectTexture = this._indirectTexture;\n    const matricesTexture = this._matricesTexture;\n    const colorsTexture = this._colorsTexture;\n\n    indirectTexture.dispose();\n    this._initIndirectTexture();\n    copyArrayContents(\n      indirectTexture.image.data,\n      this._indirectTexture.image.data\n    );\n\n    matricesTexture.dispose();\n    this._initMatricesTexture();\n    copyArrayContents(\n      matricesTexture.image.data,\n      this._matricesTexture.image.data\n    );\n\n    if (colorsTexture) {\n      colorsTexture.dispose();\n      this._initColorsTexture();\n      copyArrayContents(\n        colorsTexture.image.data,\n        this._colorsTexture.image.data\n      );\n    }\n  }\n\n  /**\n   * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n   * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n   * end of the geometry attributes then an error is thrown.\n   *\n   * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n   * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n   */\n  setGeometrySize(maxVertexCount, maxIndexCount) {\n    // Check if we can shrink to the requested vertex attribute size\n    const validRanges = [...this._geometryInfo].filter((info) => info.active);\n    const requiredVertexLength = Math.max(\n      ...validRanges.map(\n        (range) => range.vertexStart + range.reservedVertexCount\n      )\n    );\n    if (requiredVertexLength > maxVertexCount) {\n      throw new Error(\n        `BatchedMesh: Geometry vertex values are being used outside the range ${maxIndexCount}. Cannot shrink further.`\n      );\n    }\n\n    // Check if we can shrink to the requested index attribute size\n    if (this.geometry.index) {\n      const requiredIndexLength = Math.max(\n        ...validRanges.map(\n          (range) => range.indexStart + range.reservedIndexCount\n        )\n      );\n      if (requiredIndexLength > maxIndexCount) {\n        throw new Error(\n          `BatchedMesh: Geometry index values are being used outside the range ${maxIndexCount}. Cannot shrink further.`\n        );\n      }\n    }\n\n    //\n\n    // dispose of the previous geometry\n    const oldGeometry = this.geometry;\n    oldGeometry.dispose();\n\n    // recreate the geometry needed based on the previous variant\n    this._maxVertexCount = maxVertexCount;\n    this._maxIndexCount = maxIndexCount;\n\n    if (this._geometryInitialized) {\n      this._geometryInitialized = false;\n      this.geometry = new BufferGeometry();\n      this._initializeGeometry(oldGeometry);\n    }\n\n    // copy data from the previous geometry\n    const geometry = this.geometry;\n    if (oldGeometry.index) {\n      copyArrayContents(oldGeometry.index.array, geometry.index.array);\n    }\n\n    for (const key in oldGeometry.attributes) {\n      copyArrayContents(\n        oldGeometry.attributes[key].array,\n        geometry.attributes[key].array\n      );\n    }\n  }\n\n  raycast(raycaster, intersects) {\n    const instanceInfo = this._instanceInfo;\n    const geometryInfoList = this._geometryInfo;\n    const matrixWorld = this.matrixWorld;\n    const batchGeometry = this.geometry;\n\n    // iterate over each geometry\n    _mesh.material = this.material;\n    _mesh.geometry.index = batchGeometry.index;\n    _mesh.geometry.attributes = batchGeometry.attributes;\n    if (_mesh.geometry.boundingBox === null) {\n      _mesh.geometry.boundingBox = new Box3();\n    }\n\n    if (_mesh.geometry.boundingSphere === null) {\n      _mesh.geometry.boundingSphere = new Sphere();\n    }\n\n    for (let i = 0, l = instanceInfo.length; i < l; i++) {\n      if (!instanceInfo[i].visible || !instanceInfo[i].active) {\n        continue;\n      }\n\n      const geometryId = instanceInfo[i].geometryIndex;\n      const geometryInfo = geometryInfoList[geometryId];\n      _mesh.geometry.setDrawRange(geometryInfo.start, geometryInfo.count);\n\n      // get the intersects\n      this.getMatrixAt(i, _mesh.matrixWorld).premultiply(matrixWorld);\n      this.getBoundingBoxAt(geometryId, _mesh.geometry.boundingBox);\n      this.getBoundingSphereAt(geometryId, _mesh.geometry.boundingSphere);\n      _mesh.raycast(raycaster, _batchIntersects);\n\n      // add batch id to the intersects\n      for (let j = 0, l = _batchIntersects.length; j < l; j++) {\n        const intersect = _batchIntersects[j];\n        intersect.object = this;\n        intersect.batchId = i;\n        intersects.push(intersect);\n      }\n\n      _batchIntersects.length = 0;\n    }\n\n    _mesh.material = null;\n    _mesh.geometry.index = null;\n    _mesh.geometry.attributes = {};\n    _mesh.geometry.setDrawRange(0, Infinity);\n  }\n\n  copy(source) {\n    super.copy(source);\n\n    this.geometry = source.geometry.clone();\n    this.perObjectFrustumCulled = source.perObjectFrustumCulled;\n    this.sortObjects = source.sortObjects;\n    this.boundingBox =\n      source.boundingBox !== null ? source.boundingBox.clone() : null;\n    this.boundingSphere =\n      source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n    this._geometryInfo = source._geometryInfo.map((info) => ({\n      ...info,\n\n      boundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n      boundingSphere:\n        info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n    }));\n    this._instanceInfo = source._instanceInfo.map((info) => ({ ...info }));\n\n    this._maxInstanceCount = source._maxInstanceCount;\n    this._maxVertexCount = source._maxVertexCount;\n    this._maxIndexCount = source._maxIndexCount;\n\n    this._geometryInitialized = source._geometryInitialized;\n    this._geometryCount = source._geometryCount;\n    this._multiDrawCounts = source._multiDrawCounts.slice();\n    this._multiDrawStarts = source._multiDrawStarts.slice();\n\n    this._matricesTexture = source._matricesTexture.clone();\n    this._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n    if (this._colorsTexture !== null) {\n      this._colorsTexture = source._colorsTexture.clone();\n      this._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n    }\n\n    return this;\n  }\n\n  /**\n   * Frees the GPU-related resources allocated by this instance. Call this\n   * method whenever this instance is no longer used in your app.\n   */\n  dispose() {\n    // Assuming the geometry is not shared with other meshes\n    this.geometry.dispose();\n\n    this._matricesTexture.dispose();\n    this._matricesTexture = null;\n\n    this._indirectTexture.dispose();\n    this._indirectTexture = null;\n\n    if (this._colorsTexture !== null) {\n      this._colorsTexture.dispose();\n      this._colorsTexture = null;\n    }\n  }\n\n  onBeforeRender(renderer, scene, camera, geometry, material /*, _group*/) {\n    // if visibility has not changed and frustum culling and object sorting is not required\n    // then skip iterating over all items\n    if (\n      !this._visibilityChanged &&\n      !this.perObjectFrustumCulled &&\n      !this.sortObjects\n    ) {\n      return;\n    }\n\n    // the indexed version of the multi draw function requires specifying the start\n    // offset in bytes.\n    const index = geometry.getIndex();\n    const bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n    const instanceInfo = this._instanceInfo;\n    const multiDrawStarts = this._multiDrawStarts;\n    const multiDrawCounts = this._multiDrawCounts;\n    const geometryInfoList = this._geometryInfo;\n    const perObjectFrustumCulled = this.perObjectFrustumCulled;\n    const indirectTexture = this._indirectTexture;\n    const indirectArray = indirectTexture.image.data;\n\n    // prepare the frustum in the local frame\n    if (perObjectFrustumCulled) {\n      _matrix\n        .multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)\n        .multiply(this.matrixWorld);\n      _frustum.setFromProjectionMatrix(_matrix, renderer.coordinateSystem);\n    }\n\n    let multiDrawCount = 0;\n    if (this.sortObjects) {\n      // get the camera position in the local frame\n      _matrix.copy(this.matrixWorld).invert();\n      _vector.setFromMatrixPosition(camera.matrixWorld).applyMatrix4(_matrix);\n      _forward\n        .set(0, 0, -1)\n        .transformDirection(camera.matrixWorld)\n        .transformDirection(_matrix);\n\n      for (let i = 0, l = instanceInfo.length; i < l; i++) {\n        if (instanceInfo[i].visible && instanceInfo[i].active) {\n          const geometryId = instanceInfo[i].geometryIndex;\n\n          // get the bounds in world space\n          this.getMatrixAt(i, _matrix);\n          this.getBoundingSphereAt(geometryId, _sphere).applyMatrix4(_matrix);\n\n          // determine whether the batched geometry is within the frustum\n          let culled = false;\n          if (perObjectFrustumCulled) {\n            culled = !_frustum.intersectsSphere(_sphere);\n          }\n\n          if (!culled) {\n            // get the distance from camera used for sorting\n            const geometryInfo = geometryInfoList[geometryId];\n            const z = _temp.subVectors(_sphere.center, _vector).dot(_forward);\n            _renderList.push(geometryInfo.start, geometryInfo.count, z, i);\n          }\n        }\n      }\n\n      // Sort the draw ranges and prep for rendering\n      const list = _renderList.list;\n      const customSort = this.customSort;\n      if (customSort === null) {\n        list.sort(material.transparent ? sortTransparent : sortOpaque);\n      } else {\n        customSort.call(this, list, camera);\n      }\n\n      for (let i = 0, l = list.length; i < l; i++) {\n        const item = list[i];\n        multiDrawStarts[multiDrawCount] = item.start * bytesPerElement;\n        multiDrawCounts[multiDrawCount] = item.count;\n        indirectArray[multiDrawCount] = item.index;\n        multiDrawCount++;\n      }\n\n      _renderList.reset();\n    } else {\n      for (let i = 0, l = instanceInfo.length; i < l; i++) {\n        if (instanceInfo[i].visible && instanceInfo[i].active) {\n          const geometryId = instanceInfo[i].geometryIndex;\n\n          // determine whether the batched geometry is within the frustum\n          let culled = false;\n          if (perObjectFrustumCulled) {\n            // get the bounds in world space\n            this.getMatrixAt(i, _matrix);\n            this.getBoundingSphereAt(geometryId, _sphere).applyMatrix4(_matrix);\n            culled = !_frustum.intersectsSphere(_sphere);\n          }\n\n          if (!culled) {\n            const geometryInfo = geometryInfoList[geometryId];\n            multiDrawStarts[multiDrawCount] =\n              geometryInfo.start * bytesPerElement;\n            multiDrawCounts[multiDrawCount] = geometryInfo.count;\n            indirectArray[multiDrawCount] = i;\n            multiDrawCount++;\n          }\n        }\n      }\n    }\n\n    indirectTexture.needsUpdate = true;\n    this._multiDrawCount = multiDrawCount;\n    this._visibilityChanged = false;\n  }\n\n  onBeforeShadow(\n    renderer,\n    object,\n    camera,\n    shadowCamera,\n    geometry,\n    depthMaterial /* , group */\n  ) {\n    this.onBeforeRender(renderer, null, shadowCamera, geometry, depthMaterial);\n  }\n}\n\nexport { BatchedMesh };\n"
  },
  {
    "path": "src/mesh_tools/src/lib/three-polyfills/Triangle.js",
    "content": "const _v3 = /*@__PURE__*/ new THREE.Vector3();\n\nObject.assign(THREE.Triangle, {\n  getInterpolation(point, p1, p2, p3, v1, v2, v3, target) {\n    if (THREE.Triangle.getBarycoord(point, p1, p2, p3, _v3) === null) {\n      target.x = 0;\n      target.y = 0;\n      if (\"z\" in target) target.z = 0;\n      if (\"w\" in target) target.w = 0;\n      return null;\n    }\n\n    target.setScalar(0);\n    target.addScaledVector(v1, _v3.x);\n    target.addScaledVector(v2, _v3.y);\n    target.addScaledVector(v3, _v3.z);\n\n    return target;\n  },\n});\n"
  },
  {
    "path": "src/mesh_tools/src/operators/array_elements.action.js",
    "content": "import { action } from \"../actions.js\";\n\n/**\n *\n * @param {THREE.Vector3} offset _\n */\nfunction runEdit(selected, offset = [1, 0, 0], count = 1, amend = false) {\n  offset = offset.V3_toThree();\n\n  const elements = [];\n  Undo.initEdit({ elements, selection: true }, amend);\n  selected.forEach((mesh) => {\n    const bounding = new THREE.Vector3();\n    mesh.mesh.geometry.boundingBox.getSize(bounding);\n\n    for (let i = 0; i < count; i++) {\n      const newMesh = mesh.duplicate();\n      newMesh.moveVector(\n        offset\n          .clone()\n          .multiplyScalar(i + 1)\n          .multiply(bounding)\n      );\n      elements.push(newMesh);\n    }\n  });\n  Undo.finishEdit(\"MTools: Array selected meshes\");\n}\n\nexport default action(\"array_elements\", () => {\n  const selected = Mesh.selected;\n  selected.forEach((mesh) => {\n    mesh.mesh.geometry.computeBoundingBox();\n  });\n  runEdit(selected);\n  Undo.amendEdit(\n    {\n      // shameful vector input\n      x: { type: \"number\", value: 1, label: \"OffsetX\", step: 0.1 },\n      y: { type: \"number\", value: 0, label: \"OffsetY\", step: 0.1 },\n      z: { type: \"number\", value: 0, label: \"OffsetZ\", step: 0.1 },\n      count: {\n        type: \"number\",\n        value: 1,\n        label: \"Count\",\n        min: 0,\n        max: 50,\n      },\n    },\n    (form) => {\n      runEdit(selected, [form.x, form.y, form.z], form.count, true);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/operators/boolean.action.ts",
    "content": "import {\n  ADDITION,\n  Brush,\n  DIFFERENCE,\n  Evaluator,\n  INTERSECTION,\n  REVERSE_SUBTRACTION,\n  SUBTRACTION,\n} from \"three-bvh-csg\";\nimport { action } from \"../actions.js\";\nimport { dontShowAgainWarning, throwQuickMessage } from \"../utils/info.js\";\nimport * as ThreeJSInteroperability from \"../utils/threejs_interoperability.js\";\n\nexport const operations = {\n  addition: {\n    name: \"Union (A ∪ B)\",\n    operator: ADDITION,\n  },\n  intersection: {\n    name: \"Intersection (A ∩ B)\",\n    operator: INTERSECTION,\n  },\n  subtraction: {\n    name: \"Subtraction (A - B)\",\n    operator: SUBTRACTION,\n  },\n  reverse_subtraction: {\n    name: \"Reverse Subtraction (B - A)\",\n    operator: REVERSE_SUBTRACTION,\n  },\n  difference: {\n    name: \"Difference (A ⊕ B)\",\n    operator: DIFFERENCE,\n  },\n\n  hollow_intersection: {\n    name: \"Hollow Intersection (A ∩ B)\",\n    // Types are not exported through the library for some reason\n    operator: 5,\n  },\n  hollow_subtraction: {\n    name: \"Hollow Subtraction (A - B)\",\n    // Types are not exported through the library for some reason\n    operator: 6,\n  },\n};\n\nconst evaluator = new Evaluator();\nfunction runEdit(\n  meshes: Mesh[],\n  amend: boolean,\n  {\n    operation,\n    hideMeshes,\n  }: { operation: keyof typeof operations; hideMeshes: boolean }\n) {\n  if (meshes.length !== 2) {\n    throwQuickMessage(\"Exactly 2 meshes must be selected.\");\n  }\n  const [meshA, meshB] = meshes;\n  const elements = [meshA, meshB];\n  Undo.initEdit({ elements, selection: true }, amend);\n\n  // if (implementation == \"CSG\") {\n  //   const newMesh = CSG[operation](\n  //     // @ts-ignore\n  //     meshA.mesh as unknown as THREE.Mesh,\n  //     meshB.mesh as unknown as THREE.Mesh\n  //   );\n  // }\n\n  const brush1 = new Brush(\n    // @ts-ignore\n    meshA.mesh.geometry.clone()\n  );\n  meshA.mesh.getWorldPosition(brush1.position);\n  meshA.mesh.getWorldQuaternion(brush1.quaternion);\n  meshA.mesh.getWorldScale(brush1.scale);\n  brush1.updateMatrixWorld();\n\n  const brush2 = new Brush(\n    // @ts-ignore\n    meshB.mesh.geometry.clone()\n  );\n  meshB.mesh.getWorldPosition(brush2.position);\n  meshB.mesh.getWorldQuaternion(brush2.quaternion);\n  meshB.mesh.getWorldScale(brush2.scale);\n  brush2.updateMatrixWorld();\n\n  // TODO: Implement in-house boolean operation algorithm\n  const result = evaluator.evaluate(\n    brush1,\n    brush2,\n    operations[operation].operator\n  );\n\n  const mesh = ThreeJSInteroperability.nonIndexed(result.geometry);\n  mesh.init();\n  elements.push(mesh);\n  mesh.select();\n  if (hideMeshes) {\n    meshA.visibility = false;\n    meshB.visibility = false;\n  }\n\n  Undo.finishEdit(`MTools: Boolean Operation: ${operations[operation].name}`);\n  Canvas.updateVisibility();\n}\n\nexport default action(\"boolean\", async () => {\n  const shouldContinue = await dontShowAgainWarning(\n    \"boolean\",\n    \"Heads Up!\",\n    \"This feature is experimental and may cause unexpected behavior. Are you sure you want to continue?\"\n  );\n  if (!shouldContinue) {\n    return;\n  }\n\n  const meshes = Mesh.selected.slice();\n\n  runEdit(meshes, false, { operation: \"addition\", hideMeshes: true });\n  Undo.amendEdit(\n    {\n      operation: {\n        label: \"Operation\",\n        type: \"select\",\n        options: operations,\n        value: \"addition\",\n      },\n      hideMeshes: {\n        label: \"Hide Meshes\",\n        type: \"checkbox\",\n        value: true,\n      },\n    },\n    (form) => {\n      runEdit(meshes, true, form);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/operators/index.js",
    "content": "import \"./**/*.action.js\";\nimport \"./**/*.action.ts\";\nimport { action } from \"../actions.js\";\n\nexport default action(\"operators\");"
  },
  {
    "path": "src/mesh_tools/src/operators/scatter.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { renderLine } from \"../utils/docs.js\";\nimport { dontShowAgainInfo } from \"../utils/info.js\";\nimport {\n  computeTriangleNormal,\n  rotationFromDirection,\n} from \"../utils/utils.js\";\n\nconst reusableEuler1 = new THREE.Euler();\nconst reusableVec1 = new THREE.Vector3();\nconst reusableVec2 = new THREE.Vector3();\nconst reusableVec3 = new THREE.Vector3();\nconst reusableVec4 = new THREE.Vector3();\nconst reusableVec5 = new THREE.Vector3();\n// const reusableVec6 = new THREE.Vector3();\nfunction runEdit(\n  mesh,\n  selected,\n  {\n    density = 3,\n    min_distance: minDistance = 0,\n    scale = 100,\n    min_scale: minScale = 100,\n    scale_factor: scaleFactor = 50,\n    rotation = 0,\n    rotation_factor: rotationFactor = 0,\n  },\n  amend = false\n) {\n  const meshes = [];\n  scale /= 100;\n  minScale /= 100;\n  scaleFactor /= 100;\n  rotationFactor /= 100;\n  const minDistanceSquared = minDistance ** 2;\n\n  Undo.initEdit({ outliner: true, elements: [], selection: true }, amend);\n\n  /**\n   * @type {THREE.Mesh}\n   */\n  const tmesh = mesh.mesh; // threejs mesh\n\n  const faces = tmesh.geometry.getIndex();\n  const vertices = tmesh.geometry.getAttribute(\"position\");\n  const l = faces.count;\n\n  const points = [];\n  for (let d = 0; d < density; d++) {\n    const i = Math.floor((Math.random() * l) / 3) * 3; // random face index\n    const t0 = reusableVec1.set(\n      vertices.getX(faces.getX(i)),\n      vertices.getY(faces.getX(i)),\n      vertices.getZ(faces.getX(i))\n    );\n    const t1 = reusableVec2.set(\n      vertices.getX(faces.getY(i)),\n      vertices.getY(faces.getY(i)),\n      vertices.getZ(faces.getY(i))\n    );\n    const t2 = reusableVec3.set(\n      vertices.getX(faces.getZ(i)),\n      vertices.getY(faces.getZ(i)),\n      vertices.getZ(faces.getZ(i))\n    );\n\n    tmesh.localToWorld(t0);\n    tmesh.localToWorld(t1);\n    tmesh.localToWorld(t2);\n\n    // f*ed up midpoint theroem\n    const pointA = reusableVec4.lerpVectors(t0, t1, Math.random());\n    const pointB = reusableVec5.lerpVectors(t0, t2, Math.random());\n\n    const point = new THREE.Vector3().lerpVectors(\n      pointA,\n      pointB,\n      Math.random()\n    );\n    if (points.find((e) => e.distanceToSquared(point) < minDistanceSquared)) {\n      continue;\n    }\n    points.push(point);\n    // scatter on points\n    /**\n     * @type {Mesh}\n     */\n    const otherMesh =\n      selected[Math.floor(selected.length * Math.random())].duplicate();\n\n    otherMesh.removeFromParent();\n    otherMesh.parent = \"root\";\n\n    const currentScale = Math.lerp(\n      scale,\n      Math.lerp(minScale, 1, Math.random()) * scale,\n      scaleFactor\n    );\n\n    const currentRotation = rotationFactor * (Math.random() * 2 - 1) * rotation;\n\n    for (const key in otherMesh.vertices) {\n      otherMesh.vertices[key].V3_multiply(currentScale);\n    }\n\n    const normal = computeTriangleNormal(t0, t1, t2);\n\n    const euler = rotationFromDirection(normal, reusableEuler1, {\n      rotateY: Math.degToRad(currentRotation),\n    });\n    otherMesh.rotation[0] = Math.radToDeg(euler.x);\n    otherMesh.rotation[1] = Math.radToDeg(euler.y);\n    otherMesh.rotation[2] = Math.radToDeg(euler.z);\n\n    otherMesh.origin = point.toArray();\n\n    meshes.push(otherMesh);\n  }\n  const group = new Group({ name: \"instances_on_\" + mesh.name });\n  meshes.forEach((e) => {\n    // Outliner.root.push(otherMesh);\n    e.addTo(group);\n  });\n  group.init();\n\n  Undo.finishEdit(\"MTools: Scatter meshes\", {\n    outliner: true,\n    elements: meshes,\n    selection: true,\n  });\n  Canvas.updateAll();\n}\nexport default action(\"scatter\", function () {\n  if (Mesh.selected.length < 2) {\n    Blockbench.showQuickMessage(\"At least two meshes must be selected\");\n    return;\n  }\n  dontShowAgainInfo(\n    \"scatter_pivot\",\n    \"Good To Know\",\n    [\n      \"Scattered meshes are <b>relative</b> to their <u>pivot points</u> on the target surface.\",\n\n      renderLine({\n        type: \"inset_row\",\n        items: [\n          {\n            type: \"image\",\n            src: \"scatter_pivot_1.png\",\n            caption: \"Pivot point located on the bottom\",\n          },\n          {\n            type: \"image\",\n            src: \"scatter_pivot_2.png\",\n            caption: \"Pivot point located far down\",\n          },\n        ],\n      }),\n    ].join(\"\\n\")\n  );\n\n  const mesh = Mesh.selected.last();\n  mesh.unselect();\n\n  const selected = Mesh.selected.slice();\n  runEdit(mesh, selected, {});\n\n  Undo.amendEdit(\n    {\n      density: {\n        type: \"number\",\n        value: 3,\n        label: \"Max Density\",\n        min: 0,\n        max: 256,\n      },\n      min_distance: {\n        type: \"number\",\n        value: 0,\n        label: \"Min Distance\",\n        min: 0,\n      },\n      scale: {\n        type: \"range\",\n        value: 100,\n        label: \"Scale\",\n        min: 0,\n        max: 100,\n      },\n      min_scale: {\n        type: \"range\",\n        value: 100,\n        label: \"Min Scale\",\n        min: 0,\n        max: 100,\n      },\n      scale_factor: {\n        type: \"range\",\n        value: 50,\n        label: \"Scale Randomness\",\n        min: 0,\n        max: 100,\n      },\n\n      rotation: {\n        type: \"range\",\n        value: 0,\n        label: \"Max Rotation\",\n        min: 0,\n        max: 180,\n      },\n      rotation_factor: {\n        type: \"range\",\n        value: 0,\n        label: \"Rotation Randomness\",\n        min: 0,\n        max: 100,\n      },\n    },\n    (form) => {\n      runEdit(mesh, selected, form, true);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/operators/split_edges.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { MTEdge } from \"../utils/geometry.js\";\n\nfunction runEdit(angle = 30, amend = false) {\n  angle = Math.degToRad(angle);\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n  Mesh.selected.forEach((mesh) => {\n    MTEdge.reset();\n\n    const faces = mesh.faces;\n    for (const key in faces) {\n      const face = faces[key];\n\n      const vertices = face.getSortedVertices();\n      const len = vertices.length;\n      if (len <= 2) continue;\n      for (let i = 0; i < len; i++) {\n        const a = vertices[i];\n        const b = vertices[(i + 1) % len];\n        const center = mesh.vertices[a]\n          .slice()\n          .V3_add(mesh.vertices[b])\n          .V3_divide(2);\n\n        const earlyEdge = MTEdge.all.find((e) => e.equalsV(a, b));\n        if (earlyEdge) {\n          if (earlyEdge.faces.length >= 2) {\n            Blockbench.showQuickMessage(\n              \"Error: non-manifold meshes are not allowed\",\n              2000\n            );\n            throw new Error(\"non-manifold meshes are not allowed\");\n          }\n          earlyEdge.faces.push(face);\n          continue;\n        }\n        // indices in the non sorted order\n        const indices = [];\n        indices[0] = face.vertices.findIndex((vkey) => vkey == a);\n        indices[1] = face.vertices.findIndex((vkey) => vkey == b);\n\n        const e = new MTEdge(a, b, { center, indices });\n        e.faces = [face];\n      }\n    }\n\n    const edgesLength = MTEdge.all.length; // skip calculating length each iteration\n    for (let i = 0; i < edgesLength; i++) {\n      const edge = MTEdge.all[i];\n      if (edge.faces.length < 2) continue;\n\n      const [face1, face2] = edge.faces;\n\n      // Duplicate code!!\n      const disp1 = face2.getCenter().V3_subtract(edge.center).V3_toThree();\n      const disp2 = face2.getCenter().V3_subtract(edge.center).V3_toThree();\n\n      const theta = disp1.angleTo(disp2);\n\n      // splitting process\n\n      // saved indices since: faces update, edge vertices doesnt\n      if (theta <= angle) {\n        const newVertices = mesh.addVertices(\n          mesh.vertices[edge.vertexA],\n          mesh.vertices[edge.vertexB]\n        );\n        const indexA = edge.indices[0];\n        const indexB = edge.indices[1];\n\n        face1.uv[newVertices[0]] = face1.uv[edge.vertexA];\n        face1.uv[newVertices[1]] = face1.uv[edge.vertexB];\n        face1.vertices[indexA] = newVertices[0];\n        face1.vertices[indexB] = newVertices[1];\n      }\n    }\n  });\n  Undo.finishEdit(\"MTools: Split edges\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\n\nexport default action(\"split_edges\", () => {\n  runEdit(180);\n  Undo.amendEdit(\n    {\n      angle: { label: \"Angle\", type: \"range\", value: 180, min: 0, max: 180 },\n    },\n    (form) => {\n      runEdit(form.angle, true);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/operators/subdivide.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { CMFace, CMEdge } from \"../utils/geometry.js\";\nimport { getFaceUVCenter, v3Tov2 } from \"../utils/utils.js\";\n\nexport default action(\"subdivide\", () => {\n  Undo.initEdit({ elements: Mesh.selected, selection: true });\n  Mesh.selected.forEach((mesh) => {\n    CMEdge.all = [];\n    CMFace.all = [];\n    const originalVertices = Object.keys(mesh.vertices);\n    const { faces } = mesh;\n\n    for (let key in faces) {\n      const face = faces[key];\n\n      const vertices = face.getSortedVertices();\n      const len = vertices.length;\n      if (len < 3) {\n        continue;\n      }\n      const cmface = new CMFace(face, key);\n      cmface.vertices = vertices;\n\n      for (let i = 0; i < len; i++) {\n        const a = vertices[i];\n        const b = vertices[(i + 1) % len];\n        const center = mesh.vertices[a]\n          .slice()\n          .V3_add(mesh.vertices[b])\n          .V3_divide(2);\n\n        const targetEdge =\n          CMEdge.all.find((e) => e.equalsV(a, b)) ??\n          new CMEdge(a, b, null, center);\n\n        cmface.edgePoints.push(targetEdge);\n      }\n    }\n\n    const cmedgeLength = CMEdge.all.length;\n    for (let i = 0; i < cmedgeLength; i++) {\n      const edge = CMEdge.all[i];\n      const averagedPoint = [0, 0, 0];\n      const cmfaceLength = CMFace.all.length;\n\n      let k = 0;\n      for (let j = 0; j < cmfaceLength; j++) {\n        const face = CMFace.all[j];\n        if (face.edgePoints.find((e) => edge.equalsU(e))) {\n          averagedPoint.V3_add(face.facePoint);\n          k++;\n        }\n      }\n      if (k < 2) {\n        edge.edgePoint = edge.center;\n      } else {\n        edge.edgePoint = averagedPoint.V3_divide(k);\n        edge.edgePoint.V3_add(edge.center).V3_divide(2);\n      }\n      edge.edgePointKey = mesh.addVertices(edge.edgePoint)[0];\n    }\n\n    const originalVertexLength = originalVertices.length;\n    for (let index = 0; index < originalVertexLength; index++) {\n      const key = originalVertices[index];\n      const P = mesh.vertices[key]; // originalPoint;\n\n      const F = [0, 0, 0]; // The average of touching face points\n      let l = CMFace.all.length;\n      let tlength = 0;\n      let atleastFace = false;\n\n      for (let i = 0; i < l; i++) {\n        const face = CMFace.all[i];\n        if (!face.for(key)) continue;\n\n        F.V3_add(face.facePoint);\n        atleastFace = true;\n        tlength++;\n      }\n\n      if (!atleastFace) continue;\n\n      F.V3_divide(tlength);\n\n      const R = [0, 0, 0]; // The average of touching edge points\n      l = CMEdge.all.length;\n      let elength = 0;\n      for (let i = 0; i < l; i++) {\n        const edge = CMEdge.all[i];\n        if (!edge.for(key)) continue;\n\n        R.V3_add(edge.center);\n        elength++;\n      }\n      R.V3_divide(elength);\n\n      if (elength != tlength) {\n        P.V3_add(R).V3_divide(2);\n      } else {\n        for (let i = 0; i < 3; i++) {\n          P[i] = (F[i] + 2 * R[i] + (tlength - 3) * P[i]) / tlength;\n        }\n      }\n      mesh.vertices[key] = P;\n    }\n\n    let facesLength = CMFace.all.length;\n    for (let i = 0; i < facesLength; i++) {\n      const currentFace = CMFace.all[i];\n      const bbFace = currentFace.bbFace;\n      const vertices = currentFace.vertices;\n      const verticesLen = vertices.length;\n\n      for (let j = 0; j < verticesLen; j++) {\n        const vertexA = vertices[j];\n        const vertexB = vertices[(j + 1) % verticesLen];\n        const vertexBeforeA = vertices[(j - 1 + verticesLen) % verticesLen];\n        /*\n\t\t\t\t\t\t\t\t\t-->\n\t\t\t\t\t\t\t\tc -- b -- z\n\t\t\t\t\t\t\t\t|\t |\t  | |\n\t\t\t\t\t\t\t\td -- a -- y v\n\t\t\t\t\t\t\t\t|\t |    |\n\t\t\t\t\t\t\t\tx -- w -- u\n\t\t\t\t\t\t\t\t*/\n\n        const a = currentFace.facePointKey;\n        const b = currentFace.edgePoints.find((e) =>\n          e.equalsV(vertexA, vertexB)\n        ).edgePointKey;\n        const c = vertexA;\n        const d = currentFace.edgePoints.find((e) =>\n          e.equalsV(vertexA, vertexBeforeA)\n        ).edgePointKey;\n\n        const newFace = new MeshFace(mesh, bbFace).extend({\n          vertices: [d, c, b, a],\n        });\n\n        // uv center point\n        newFace.uv[currentFace.facePointKey] = getFaceUVCenter(bbFace);\n\n        // uv edges\n        const bPoint = [0, 0, 0]\n          .V3_add(bbFace.uv[vertexA])\n          .V3_add(bbFace.uv[vertexB]);\n        bPoint.V3_divide(2);\n\n        const dPoint = [0, 0, 0]\n          .V3_add(bbFace.uv[vertexA])\n          .V3_add(bbFace.uv[vertexBeforeA]);\n        dPoint.V3_divide(2);\n\n        newFace.uv[b] = v3Tov2(bPoint);\n        newFace.uv[d] = v3Tov2(dPoint);\n        //\n\n        mesh.addFaces(newFace);\n      }\n      delete mesh.faces[currentFace.key];\n    }\n  });\n  Undo.finishEdit(\"MTools: Subdivide selected meshes\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n});\n"
  },
  {
    "path": "src/mesh_tools/src/shims/three.shim.ts",
    "content": "export * from \"../lib/three-polyfills/BatchedMesh.js\";\nimport \"../lib/three-polyfills/Triangle.js\";\n\nexport const {\n  BufferAttribute,\n  BufferGeometry,\n  Matrix3,\n  Matrix4,\n  Mesh,\n  Vector3,\n\n  ACESFilmicToneMapping,\n  AddEquation,\n  AddOperation,\n  AdditiveAnimationBlendMode,\n  AdditiveBlending,\n  AlphaFormat,\n  AlwaysDepth,\n  AlwaysStencilFunc,\n  AmbientLight,\n  AmbientLightProbe,\n  AnimationClip,\n  AnimationLoader,\n  AnimationMixer,\n  AnimationObjectGroup,\n  AnimationUtils,\n  ArcCurve,\n  ArrayCamera,\n  ArrowHelper,\n  Audio,\n  AudioAnalyser,\n  AudioContext,\n  AudioListener,\n  AudioLoader,\n  AxesHelper,\n  BackSide,\n  BasicDepthPacking,\n  BasicShadowMap,\n  Bone,\n  BooleanKeyframeTrack,\n  Box2,\n  Box3,\n  Box3Helper,\n  BoxGeometry,\n  BoxHelper,\n  BufferGeometryLoader,\n  ByteType,\n  Cache,\n  Camera,\n  CameraHelper,\n  CanvasTexture,\n  CatmullRomCurve3,\n  CineonToneMapping,\n  CircleGeometry,\n  ClampToEdgeWrapping,\n  Clock,\n  Color,\n  ColorKeyframeTrack,\n  CompressedTexture,\n  CompressedTextureLoader,\n  ConeGeometry,\n  CubeCamera,\n  CubeReflectionMapping,\n  CubeRefractionMapping,\n  CubeTexture,\n  CubeTextureLoader,\n  CubeUVReflectionMapping,\n  CubicBezierCurve,\n  CubicBezierCurve3,\n  CubicInterpolant,\n  CullFaceBack,\n  CullFaceFront,\n  CullFaceFrontBack,\n  CullFaceNone,\n  Curve,\n  CurvePath,\n  CustomBlending,\n  CylinderGeometry,\n  Cylindrical,\n  DataTexture,\n  DataTextureLoader,\n  DataUtils,\n  DecrementStencilOp,\n  DecrementWrapStencilOp,\n  DefaultLoadingManager,\n  DepthFormat,\n  DepthStencilFormat,\n  DepthTexture,\n  DirectionalLight,\n  DirectionalLightHelper,\n  DiscreteInterpolant,\n  DodecahedronGeometry,\n  DoubleSide,\n  DstAlphaFactor,\n  DstColorFactor,\n  DynamicCopyUsage,\n  DynamicDrawUsage,\n  DynamicReadUsage,\n  EdgesGeometry,\n  EllipseCurve,\n  EqualDepth,\n  EqualStencilFunc,\n  EquirectangularReflectionMapping,\n  EquirectangularRefractionMapping,\n  Euler,\n  EventDispatcher,\n  ExtrudeGeometry,\n  FileLoader,\n  Float16BufferAttribute,\n  Float32BufferAttribute,\n  Float64BufferAttribute,\n  FloatType,\n  Fog,\n  FogExp2,\n  FrontSide,\n  Frustum,\n  GLBufferAttribute,\n  GLSL1,\n  GLSL3,\n  GreaterDepth,\n  GreaterEqualDepth,\n  GreaterEqualStencilFunc,\n  GreaterStencilFunc,\n  GridHelper,\n  Group,\n  HalfFloatType,\n  HemisphereLight,\n  HemisphereLightHelper,\n  HemisphereLightProbe,\n  IcosahedronGeometry,\n  ImageBitmapLoader,\n  ImageLoader,\n  ImageUtils,\n  IncrementStencilOp,\n  IncrementWrapStencilOp,\n  InstancedBufferAttribute,\n  InstancedBufferGeometry,\n  InstancedInterleavedBuffer,\n  InstancedMesh,\n  Int16BufferAttribute,\n  Int32BufferAttribute,\n  Int8BufferAttribute,\n  IntType,\n  InterleavedBuffer,\n  InterleavedBufferAttribute,\n  Interpolant,\n  InterpolateDiscrete,\n  InterpolateLinear,\n  InterpolateSmooth,\n  InvertStencilOp,\n  KeepStencilOp,\n  KeyframeTrack,\n  LOD,\n  LatheGeometry,\n  Layers,\n  LessDepth,\n  LessEqualDepth,\n  LessEqualStencilFunc,\n  LessStencilFunc,\n  Light,\n  LightProbe,\n  Line,\n  Line3,\n  LineBasicMaterial,\n  LineCurve,\n  LineCurve3,\n  LineDashedMaterial,\n  LineLoop,\n  LineSegments,\n  LinearEncoding,\n  LinearFilter,\n  LinearInterpolant,\n  LinearMipMapLinearFilter,\n  LinearMipMapNearestFilter,\n  LinearMipmapLinearFilter,\n  LinearMipmapNearestFilter,\n  LinearToneMapping,\n  Loader,\n  LoaderUtils,\n  LoadingManager,\n  LoopOnce,\n  LoopPingPong,\n  LoopRepeat,\n  LuminanceAlphaFormat,\n  LuminanceFormat,\n  MOUSE,\n  Material,\n  MaterialLoader,\n  MathUtils,\n  MaxEquation,\n  MeshBasicMaterial,\n  MeshDepthMaterial,\n  MeshDistanceMaterial,\n  MeshLambertMaterial,\n  MeshMatcapMaterial,\n  MeshNormalMaterial,\n  MeshPhongMaterial,\n  MeshPhysicalMaterial,\n  MeshStandardMaterial,\n  MeshToonMaterial,\n  MinEquation,\n  MirroredRepeatWrapping,\n  MixOperation,\n  MultiplyBlending,\n  MultiplyOperation,\n  NearestFilter,\n  NearestMipMapLinearFilter,\n  NearestMipMapNearestFilter,\n  NearestMipmapLinearFilter,\n  NearestMipmapNearestFilter,\n  NeverDepth,\n  NeverStencilFunc,\n  NoBlending,\n  NoToneMapping,\n  NormalAnimationBlendMode,\n  NormalBlending,\n  NotEqualDepth,\n  NotEqualStencilFunc,\n  NumberKeyframeTrack,\n  Object3D,\n  ObjectLoader,\n  ObjectSpaceNormalMap,\n  OctahedronGeometry,\n  OneFactor,\n  OneMinusDstAlphaFactor,\n  OneMinusDstColorFactor,\n  OneMinusSrcAlphaFactor,\n  OneMinusSrcColorFactor,\n  OrthographicCamera,\n  PCFShadowMap,\n  PCFSoftShadowMap,\n  PMREMGenerator,\n  Path,\n  PerspectiveCamera,\n  Plane,\n  PlaneGeometry,\n  PlaneHelper,\n  PointLight,\n  PointLightHelper,\n  Points,\n  PointsMaterial,\n  PolarGridHelper,\n  PolyhedronGeometry,\n  PositionalAudio,\n  PropertyBinding,\n  PropertyMixer,\n  QuadraticBezierCurve,\n  QuadraticBezierCurve3,\n  Quaternion,\n  QuaternionKeyframeTrack,\n  QuaternionLinearInterpolant,\n  REVISION,\n  RGBADepthPacking,\n  RGBAFormat,\n  RGBAIntegerFormat,\n  RGBA_ASTC_10x10_Format,\n  RGBA_ASTC_10x5_Format,\n  RGBA_ASTC_10x6_Format,\n  RGBA_ASTC_10x8_Format,\n  RGBA_ASTC_12x10_Format,\n  RGBA_ASTC_12x12_Format,\n  RGBA_ASTC_4x4_Format,\n  RGBA_ASTC_5x4_Format,\n  RGBA_ASTC_5x5_Format,\n  RGBA_ASTC_6x5_Format,\n  RGBA_ASTC_6x6_Format,\n  RGBA_ASTC_8x5_Format,\n  RGBA_ASTC_8x6_Format,\n  RGBA_ASTC_8x8_Format,\n  RGBA_BPTC_Format,\n  RGBA_ETC2_EAC_Format,\n  RGBA_PVRTC_2BPPV1_Format,\n  RGBA_PVRTC_4BPPV1_Format,\n  RGBA_S3TC_DXT1_Format,\n  RGBA_S3TC_DXT3_Format,\n  RGBA_S3TC_DXT5_Format,\n  RGB_ETC1_Format,\n  RGB_ETC2_Format,\n  RGB_PVRTC_2BPPV1_Format,\n  RGB_PVRTC_4BPPV1_Format,\n  RGB_S3TC_DXT1_Format,\n  RGFormat,\n  RGIntegerFormat,\n  RawShaderMaterial,\n  Ray,\n  Raycaster,\n  RectAreaLight,\n  RedFormat,\n  RedIntegerFormat,\n  ReinhardToneMapping,\n  RepeatWrapping,\n  ReplaceStencilOp,\n  ReverseSubtractEquation,\n  RingGeometry,\n  Scene,\n  ShaderChunk,\n  ShaderLib,\n  ShaderMaterial,\n  ShadowMaterial,\n  Shape,\n  ShapeGeometry,\n  ShapePath,\n  ShapeUtils,\n  ShortType,\n  Skeleton,\n  SkeletonHelper,\n  SkinnedMesh,\n  Sphere,\n  SphereGeometry,\n  Spherical,\n  SphericalHarmonics3,\n  SplineCurve,\n  SpotLight,\n  SpotLightHelper,\n  Sprite,\n  SpriteMaterial,\n  SrcAlphaFactor,\n  SrcAlphaSaturateFactor,\n  SrcColorFactor,\n  StaticCopyUsage,\n  StaticDrawUsage,\n  StaticReadUsage,\n  StereoCamera,\n  StreamCopyUsage,\n  StreamDrawUsage,\n  StreamReadUsage,\n  StringKeyframeTrack,\n  SubtractEquation,\n  SubtractiveBlending,\n  TOUCH,\n  TangentSpaceNormalMap,\n  TetrahedronGeometry,\n  Texture,\n  TextureLoader,\n  TorusGeometry,\n  TorusKnotGeometry,\n  Triangle,\n  TriangleFanDrawMode,\n  TriangleStripDrawMode,\n  TrianglesDrawMode,\n  TubeGeometry,\n  UVMapping,\n  Uint16BufferAttribute,\n  Uint32BufferAttribute,\n  Uint8BufferAttribute,\n  Uint8ClampedBufferAttribute,\n  Uniform,\n  UniformsLib,\n  UniformsUtils,\n  UnsignedByteType,\n  UnsignedInt248Type,\n  UnsignedIntType,\n  UnsignedShort4444Type,\n  UnsignedShort5551Type,\n  UnsignedShortType,\n  VSMShadowMap,\n  Vector2,\n  Vector4,\n  VectorKeyframeTrack,\n  VideoTexture,\n  WebGL1Renderer,\n  WebGLCubeRenderTarget,\n  WebGLMultipleRenderTargets,\n  WebGLRenderTarget,\n  WebGLRenderer,\n  WireframeGeometry,\n  ZeroCurvatureEnding,\n  ZeroFactor,\n  ZeroSlopeEnding,\n  ZeroStencilOp,\n  sRGBEncoding,\n} = window.THREE;\n"
  },
  {
    "path": "src/mesh_tools/src/tools/bevel._action.js",
    "content": "/**\n * !\n * ! Beveling is really brain draining!!! ...\n * ! Until my sanes are ready to continue, this action will be left silence.. alone...\n * !\n */\nimport { action } from \"../actions.js\";\nimport {\n  groupElementsCollided,\n  groupMultipleBy,\n  lerp3,\n} from \"../utils/array.js\";\nimport Neighborhood from \"../utils/mesh/neighborhood.js\";\nimport {\n  extractEdgeKey,\n  getEdgeKey,\n  isEdgeKeySelected,\n  quadrilate,\n  sortVerticesByAngle,\n} from \"../utils/utils.js\";\nimport { distanceBetweenSq } from \"../utils/vector.js\";\n/**\n *\n * @param {*} v1\n * @param {*} v2\n * @param {*} factor\n * @returns {ArrayVector3}\n */\nfunction interpolateEdge(v1, v2, factor) {\n  return lerp3(v1, v2, factor);\n  const offset = v2.slice().V3_subtract(v1);\n  const direction = offset.V3_divide(\n    Math.hypot(offset[0], offset[1], offset[2])\n  );\n  return direction.V3_multiply(factor);\n}\nfunction replaceVertexAndTriangulate(\n  mesh,\n  face,\n  vertexKey,\n  replacementVertices\n) {\n  const vertexKeys = face.getSortedVertices();\n  const index = vertexKeys.indexOf(vertexKey);\n  const nextVertexKey = vertexKeys[(index + 1) % vertexKeys.length];\n  if (\n    replacementVertices.length > 1 &&\n    distanceBetweenSq(\n      mesh.vertices[replacementVertices[0]],\n      mesh.vertices[nextVertexKey]\n    ) <\n      distanceBetweenSq(\n        mesh.vertices[replacementVertices[1]],\n        mesh.vertices[nextVertexKey]\n      )\n  ) {\n    replacementVertices.reverse();\n  }\n\n  vertexKeys.splice(index, 1, ...replacementVertices);\n\n  replaceTriangulated(mesh, face, vertexKeys);\n}\nfunction runEdit(factor, amend) {\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n\n  for (const mesh of Mesh.selected) {\n    let veNeighborhood = Neighborhood.VertexEdges(mesh);\n    let efNeighborhood = Neighborhood.EdgeFaces(mesh);\n    let vfNeighborhood = Neighborhood.VertexFaces(mesh);\n    const beveledEdgeVertices = new Map();\n\n    const oppVertex = (face, edge, vertex) => {\n      return extractEdgeKey(\n        veNeighborhood[vertex].find(\n          (e) =>\n            e != edge && efNeighborhood[e] && efNeighborhood[e].includes(face)\n        )\n      ).find((e) => e != vertex);\n    };\n\n    function insetVertexFaces(\n      vertexKey,\n      edge,\n      newVertexAKey,\n      newVertexBKey,\n      edgesA,\n      edgesB,\n      faces\n    ) {\n      const verticesToInset = veNeighborhood[vertexKey]\n        .filter((e) => e != edge && !edgesA.includes(e) && !edgesB.includes(e))\n        .map(extractEdgeKey)\n        .map((e) => e.find((e) => e != vertexKey));\n\n      const verticesToInsetMap = {};\n      for (const vertexToInset of verticesToInset) {\n        [verticesToInsetMap[vertexToInset]] = mesh.addVertices(\n          interpolateEdge(\n            mesh.vertices[vertexKey],\n            mesh.vertices[vertexToInset],\n            factor\n          )\n        );\n      }\n      const newFaceVertices = Object.values(verticesToInsetMap);\n      newFaceVertices.unshift(newVertexAKey);\n      newFaceVertices.push(newVertexBKey);\n\n      // Inset Face\n      const insetFace = new MeshFace(mesh, {\n        vertices: sortVerticesByAngle(mesh, newFaceVertices),\n      });\n      mesh.addFaces(insetFace);\n      replaceTriangulated(mesh, insetFace);\n\n      for (const face of faces) {\n        const edges = getEdgesOfFace(face);\n        // TODO optimize by making use of face-face neighborhood\n        const isNeighborWithA = edgesA.some((e) => edges.includes(e));\n        const isNeighborWithB = edgesB.some((e) => edges.includes(e));\n\n        const vertexKeys = face.getSortedVertices().slice();\n        const replacementVertices = [];\n\n        if (isNeighborWithA || isNeighborWithB) {\n          replacementVertices.push(\n            isNeighborWithA ? newVertexAKey : newVertexBKey\n          );\n        }\n\n        for (let i = vertexKeys.length - 1; i >= 0; i--) {\n          const vertexKey = vertexKeys[i];\n          if (verticesToInsetMap[vertexKey]) {\n            replacementVertices.push(verticesToInsetMap[vertexKey]);\n          }\n        }\n\n        replaceVertexAndTriangulate(mesh, face, vertexKey, replacementVertices);\n      }\n    }\n    function handleEdgeVertexFaces(\n      vertexKey,\n      edge,\n      newVertexAKey,\n      newVertexBKey,\n      edgesA,\n      edgesB,\n      faces\n    ) {\n      if (faces.length < 1) {\n        return;\n      }\n      if (faces.length > 1) {\n        insetVertexFaces(\n          vertexKey,\n          edge,\n          newVertexAKey,\n          newVertexBKey,\n          edgesA,\n          edgesB,\n          faces\n        );\n        return;\n      }\n\n      for (const face of faces)\n        replaceVertexAndTriangulate(mesh, face, vertexKey, [\n          newVertexBKey,\n          newVertexAKey,\n        ]);\n    }\n\n    for (const vertex in veNeighborhood) {\n      const selectedEdges = veNeighborhood[vertex].filter(\n        isEdgeKeySelected.bind(null, mesh)\n      );\n      const edges = veNeighborhood[vertex];\n      if (selectedEdges.length == 0) continue;\n\n      if (selectedEdges.length == 2) {\n        const edgeA = selectedEdges[0];\n        const edgeB = selectedEdges[1];\n        const vertexA = extractEdgeKey(edgeA).find((e) => e != vertex);\n        const vertexB = extractEdgeKey(edgeB).find((e) => e != vertex);\n\n        const splitterEdges = edges.filter((e) => !selectedEdges.includes(e));\n        function gatherNeighboringFacesUntilEdge(\n          startingEdge,\n          startingFace,\n          targetEdge\n        ) {\n          let currentEdge;\n          const faces = [];\n          const foundEdges = [];\n          const maxIterations = Object.values(mesh.faces).length ** 2;\n          let safetyIndex = 0;\n          while (safetyIndex <= maxIterations && currentEdge != targetEdge) {\n            foundEdges.push(currentEdge ?? startingEdge);\n            const facesEdges = (\n              !currentEdge ? [startingFace] : efNeighborhood[currentEdge]\n            ).map((e) => [e, getEdgesOfFace(e)]);\n\n            currentEdge = undefined;\n            for (const [face, edges] of facesEdges) {\n              const edge = edges.find(\n                (edge) =>\n                  !foundEdges.includes(edge) &&\n                  (splitterEdges.includes(edge) || edge == targetEdge)\n              );\n              if (edge) {\n                currentEdge = edge;\n                faces.push(face);\n                break;\n              }\n            }\n            if (!currentEdge) break;\n\n            safetyIndex++;\n          }\n\n          return faces;\n        }\n        const facesA = efNeighborhood[edgeA];\n\n        if (facesA.length != 2) {\n          // TODO\n          continue;\n        }\n        const facesB = efNeighborhood[edgeB];\n\n        if (facesB.length != 2) {\n          // TODO\n          continue;\n        }\n\n        /**\n         * Includes facesA[1] and (facesB[0] OR facesB[1])\n         */\n        const splitterFaces = gatherNeighboringFacesUntilEdge(\n          edgeA,\n          facesA[1],\n          edgeB\n        );\n\n        // Make faces in the same order.\n        if (!splitterFaces.includes(facesB[1])) {\n          /**\n           * Now splitterFaces includes facesA[1] and facesB[1]\n           */\n          facesB.reverse();\n        }\n\n        const commonFaces = gatherNeighboringFacesUntilEdge(\n          edgeA,\n          facesA[0],\n          edgeB\n        );\n\n        let vertexCommon;\n        let vertexSplit;\n        {\n          const oppVertexAAKey = oppVertex(facesA[0], edgeA, vertexA);\n          const oppVertexABKey = oppVertex(facesA[1], edgeA, vertexA);\n          const newVertexAA = interpolateEdge(\n            mesh.vertices[vertexA],\n            mesh.vertices[oppVertexAAKey],\n            factor\n          );\n          const newVertexAB = interpolateEdge(\n            mesh.vertices[vertexA],\n            mesh.vertices[oppVertexABKey],\n            factor\n          );\n          const oppVertexBAKey = oppVertex(facesB[0], edgeB, vertexB);\n          const oppVertexBBKey = oppVertex(facesB[1], edgeB, vertexB);\n          const newVertexBA = interpolateEdge(\n            mesh.vertices[vertexB],\n            mesh.vertices[oppVertexBAKey],\n            factor\n          );\n          const newVertexBB = interpolateEdge(\n            mesh.vertices[vertexB],\n            mesh.vertices[oppVertexBBKey],\n            factor\n          );\n          vertexCommon = newVertexAA\n            .V3_subtract(mesh.vertices[vertexA])\n            .V3_add(newVertexBA.V3_subtract(mesh.vertices[vertexB]))\n            .V3_add(mesh.vertices[vertex]);\n          vertexSplit = newVertexAB\n            .V3_subtract(mesh.vertices[vertexA])\n            .V3_add(newVertexBB.V3_subtract(mesh.vertices[vertexB]))\n            .V3_add(mesh.vertices[vertex]);\n        }\n\n        const [vertexCommonKey, vertexSplitKey] = mesh.addVertices(\n          vertexCommon,\n          vertexSplit\n        );\n        /* Handle common */\n        for (const commonFace of commonFaces) {\n          const vertexIndex = commonFace.vertices.indexOf(vertex);\n          commonFace.vertices[vertexIndex] = vertexCommonKey;\n          commonFace.uv[vertexCommonKey] = commonFace.uv[vertex].slice();\n        }\n\n        /* Handle splitter */\n        for (const splitterFace of splitterFaces) {\n          const vertexIndex = splitterFace.vertices.indexOf(vertex);\n          splitterFace.vertices[vertexIndex] = vertexSplitKey;\n          splitterFace.uv[vertexSplitKey] = splitterFace.uv[vertex].slice();\n        }\n\n        /*  */\n        beveledEdgeVertices.set(vertex, {\n          newVertexAKey: vertexSplitKey,\n          newVertexBKey: vertexCommonKey,\n        });\n      }\n      if (selectedEdges.length == 1) {\n        const edge = selectedEdges[0];\n        if (efNeighborhood[edge].length < 2) {\n          // TODO Disjoint\n          continue;\n        }\n        if (efNeighborhood[edge].length > 2) {\n          // TODO Non-Manifold\n          continue;\n        }\n\n        const [faceA, faceB] = efNeighborhood[edge];\n        const connectedFaces = vfNeighborhood[vertex].filter(\n          (e) => e != faceA && e != faceB\n        );\n        const edgesA = getEdgesOfFace(faceA);\n        const edgesB = getEdgesOfFace(faceB);\n\n        /*  */\n        const oppVertexAKey = oppVertex(faceA, edge, vertex);\n        const oppVertexBKey = oppVertex(faceB, edge, vertex);\n        const newVertexA = interpolateEdge(\n          mesh.vertices[vertex],\n          mesh.vertices[oppVertexAKey],\n          factor\n        );\n        const newVertexB = interpolateEdge(\n          mesh.vertices[vertex],\n          mesh.vertices[oppVertexBKey],\n          factor\n        );\n        let newVertexAKey = mesh.addVertices(newVertexA)[0];\n        let newVertexBKey = mesh.addVertices(newVertexB)[0];\n        handleEdgeVertexFaces(\n          vertex,\n          edge,\n          newVertexAKey,\n          newVertexBKey,\n          edgesA,\n          edgesB,\n          connectedFaces\n        );\n        const vertexAIndex = faceA.vertices.indexOf(vertex);\n        const vertexBIndex = faceB.vertices.indexOf(vertex);\n\n        faceA.vertices[vertexAIndex] = newVertexAKey;\n        faceB.vertices[vertexBIndex] = newVertexBKey;\n\n        faceA.uv[newVertexAKey] = faceA.uv[vertex].slice();\n        faceB.uv[newVertexBKey] = faceB.uv[vertex].slice();\n\n        beveledEdgeVertices.set(vertex, {\n          newVertexAKey,\n          newVertexBKey,\n        });\n      }\n    }\n\n    // TODO use a real array of edges.\n    for (const edge in efNeighborhood) {\n      const [vertex0, vertex1] = extractEdgeKey(edge);\n      if (\n        !beveledEdgeVertices.has(vertex0) ||\n        !beveledEdgeVertices.has(vertex1)\n      )\n        continue;\n      const { newVertexAKey: newVertexA1Key, newVertexBKey: newVertexB1Key } =\n        beveledEdgeVertices.get(vertex1);\n      const { newVertexAKey: newVertexA0Key, newVertexBKey: newVertexB0Key } =\n        beveledEdgeVertices.get(vertex0);\n\n      const newFace = new MeshFace(mesh, {\n        vertices: [\n          newVertexA0Key,\n          newVertexA1Key,\n          newVertexB1Key,\n          newVertexB0Key,\n        ],\n      });\n      UVEditor.setAutoSize(null, true, mesh.addFaces(newFace));\n    }\n  }\n\n  Undo.finishEdit(\"MTools: Bevel Edges\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\nfunction runEdit2(factor, amend) {\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n\n  for (const mesh of Mesh.selected) {\n    // A district?! 🤔\n    // TODO move into more optimized Neighborhood.District(...);\n    let veNeighborhood;\n    let vfNeighborhood;\n    let efNeighborhood;\n    efNeighborhood = Neighborhood.EdgeFaces(mesh);\n    veNeighborhood = Neighborhood.VertexEdges(mesh);\n    vfNeighborhood = Neighborhood.VertexFaces(mesh);\n\n    const oppVertex = (face, edge, vertex) => {\n      return extractEdgeKey(\n        veNeighborhood[vertex].find(\n          (e) =>\n            e != edge && efNeighborhood[e] && efNeighborhood[e].includes(face)\n        )\n      ).find((e) => e != vertex);\n    };\n\n    const processedEdgeSet = new Set();\n\n    const edges = mesh.getSelectedEdges().map((e) => {\n      e = getEdgeKey(e[0], e[1]);\n      const vertices = extractEdgeKey(e);\n      const tuple = vertices;\n      tuple.push(e);\n\n      return tuple;\n    });\n\n    /**\n     * For Handling 2 connected edges\n     */\n    const verticesToMergeMap = new Map();\n    const verticesToJoinMap = new Map();\n\n    console.log(groupMultipleBy(edges, (value) => value.slice(0, 2)));\n    for (const [vertex0Key, vertex1Key, edge] of edges) {\n      if (processedEdgeSet.has(edge)) continue;\n      processedEdgeSet.add(edge);\n\n      const faces = efNeighborhood[edge];\n      if (faces.length == 0) continue; /* Single Edge */\n      if (faces.length == 1) continue; /* Single Face */\n      if (faces.length > 2) continue; /* Non-Manifold */\n      const [faceA, faceB] = faces;\n\n      const verticesA = faceA.vertices;\n      const verticesB = faceB.vertices;\n\n      const sharedEdges0 = edges.filter(\n        ([v0, v1, e]) => edge != e && (v0 == vertex0Key || v1 == vertex0Key)\n      );\n      const sharedEdges1 = edges.filter(\n        ([v0, v1, e]) => edge != e && (v0 == vertex1Key || v1 == vertex1Key)\n      );\n\n      const oppVertexA0Key = oppVertex(faceA, edge, vertex0Key);\n      const oppVertexA1Key = oppVertex(faceA, edge, vertex1Key);\n      const oppVertexB0Key = oppVertex(faceB, edge, vertex0Key);\n      const oppVertexB1Key = oppVertex(faceB, edge, vertex1Key);\n      const vertexA0Index = verticesA.indexOf(vertex0Key);\n      const vertexA1Index = verticesA.indexOf(vertex1Key);\n      const vertexB0Index = verticesB.indexOf(vertex0Key);\n      const vertexB1Index = verticesB.indexOf(vertex1Key);\n\n      const vertex0 = mesh.vertices[vertex0Key];\n      const vertex1 = mesh.vertices[vertex1Key];\n      const oppVertexA0 = mesh.vertices[oppVertexA0Key];\n      const oppVertexA1 = mesh.vertices[oppVertexA1Key];\n      const oppVertexB0 = mesh.vertices[oppVertexB0Key];\n      const oppVertexB1 = mesh.vertices[oppVertexB1Key];\n\n      const newVertexA0 = lerp3(vertex0, oppVertexA0, factor);\n      const newVertexA1 = lerp3(vertex1, oppVertexA1, factor);\n      const newVertexB0 = lerp3(vertex0, oppVertexB0, factor);\n      const newVertexB1 = lerp3(vertex1, oppVertexB1, factor);\n      const newVertexA0Offset = newVertexA0.slice().V3_subtract(vertex0);\n      const newVertexA1Offset = newVertexA1.slice().V3_subtract(vertex1);\n      const newVertexB0Offset = newVertexB0.slice().V3_subtract(vertex0);\n      const newVertexB1Offset = newVertexB1.slice().V3_subtract(vertex1);\n      /* DO NOT SORT */\n      const A0Edge = [vertex0Key, oppVertexA0Key].join(\"_\");\n      const A1Edge = [vertex1Key, oppVertexA1Key].join(\"_\");\n      const B0Edge = [vertex0Key, oppVertexB0Key].join(\"_\");\n      const B1Edge = [vertex1Key, oppVertexB1Key].join(\"_\");\n      let newVertexA0Key, newVertexA1Key, newVertexB0Key, newVertexB1Key;\n\n      if (sharedEdges0.length == 1) {\n        newVertexA0Key = verticesToMergeMap.get(A0Edge);\n        newVertexB0Key = verticesToMergeMap.get(B0Edge);\n      }\n      if (sharedEdges1.length == 1) {\n        newVertexA1Key = verticesToMergeMap.get(A1Edge);\n        newVertexB1Key = verticesToMergeMap.get(B1Edge);\n      }\n      const toJoin0 = verticesToJoinMap.get(vertex0Key);\n      const toJoin1 = verticesToJoinMap.get(vertex1Key);\n\n      if (toJoin1) {\n        if (!newVertexA1Key) {\n          newVertexA1Key = toJoin1[0];\n          mesh.vertices[newVertexA1Key].V3_add(newVertexA1Offset);\n        }\n        if (!newVertexB1Key) {\n          newVertexB1Key = toJoin1[1];\n          mesh.vertices[newVertexB1Key].V3_add(newVertexB1Offset);\n        }\n      }\n      if (toJoin0) {\n        if (!newVertexA0Key) {\n          newVertexA0Key = toJoin0[0];\n          mesh.vertices[newVertexA0Key].V3_add(newVertexA0Offset);\n        }\n        if (!newVertexB0Key) {\n          newVertexB0Key = toJoin0[1];\n          mesh.vertices[newVertexB0Key].V3_add(newVertexB0Offset);\n        }\n      }\n\n      newVertexA0Key ??= mesh.addVertices(newVertexA0)[0];\n      newVertexB0Key ??= mesh.addVertices(newVertexB0)[0];\n      newVertexA1Key ??= mesh.addVertices(newVertexA1)[0];\n      newVertexB1Key ??= mesh.addVertices(newVertexB1)[0];\n\n      if (sharedEdges0.length == 1) {\n        if (!verticesToJoinMap.has(vertex0Key)) {\n          verticesToJoinMap.set(vertex0Key, [newVertexA0Key, newVertexB0Key]);\n        }\n      }\n      if (sharedEdges1.length == 1) {\n        if (!verticesToJoinMap.has(vertex1Key)) {\n          verticesToJoinMap.set(vertex1Key, [newVertexA1Key, newVertexB1Key]);\n        }\n      }\n\n      verticesToMergeMap.set(A0Edge, newVertexA0Key);\n      verticesToMergeMap.set(B0Edge, newVertexB0Key);\n      verticesToMergeMap.set(A1Edge, newVertexA1Key);\n      verticesToMergeMap.set(B1Edge, newVertexB1Key);\n\n      const newFace = new MeshFace(mesh, {\n        vertices: [\n          newVertexA0Key,\n          newVertexA1Key,\n          newVertexB1Key,\n          newVertexB0Key,\n        ],\n        uv: {\n          [newVertexA0Key]: faceA.uv[vertex0Key].slice(),\n          [newVertexA1Key]: faceA.uv[vertex1Key].slice(),\n          [newVertexB0Key]: faceB.uv[vertex0Key].slice(),\n          [newVertexB1Key]: faceB.uv[vertex1Key].slice(),\n        },\n      });\n      mesh.addFaces(newFace);\n\n      const faces0 = vfNeighborhood[vertex0Key].filter(\n        (e) => e != faceA && e != faceB\n      );\n      const faces1 = vfNeighborhood[vertex1Key].filter(\n        (e) => e != faceA && e != faceB\n      );\n\n      const edgesA = getEdgesOfFace(faceA);\n      const edgesB = getEdgesOfFace(faceB);\n\n      function insetVertexFaces(\n        vertexKey,\n        newVertexAKey,\n        newVertexBKey,\n        faces\n      ) {\n        const verticesToInset = veNeighborhood[vertexKey]\n          .filter(\n            (e) => e != edge && !edgesA.includes(e) && !edgesB.includes(e)\n          )\n          .map(extractEdgeKey)\n          .map((e) => e.find((e) => e != vertexKey));\n\n        const verticesToInsetMap = {};\n        for (const vertexToInset of verticesToInset) {\n          [verticesToInsetMap[vertexToInset]] = mesh.addVertices(\n            lerp3(\n              mesh.vertices[vertexKey],\n              mesh.vertices[vertexToInset],\n              factor\n            )\n          );\n        }\n        const newFaceVertices = Object.values(verticesToInsetMap);\n        newFaceVertices.unshift(newVertexAKey);\n        newFaceVertices.push(newVertexBKey);\n\n        // Inset Face\n        const insetFace = new MeshFace(mesh, { vertices: newFaceVertices });\n        mesh.addFaces(insetFace);\n        replaceTriangulated(mesh, insetFace);\n\n        for (const face of faces) {\n          const edges = getEdgesOfFace(face);\n          // TODO optimize by making use of face-face neighborhood\n          const isNeighborWithA = edgesA.some((e) => edges.includes(e));\n          const isNeighborWithB = edgesB.some((e) => edges.includes(e));\n\n          const vertexKeys = face.getSortedVertices().slice();\n          const replacementVertices = [];\n\n          if (isNeighborWithA || isNeighborWithB) {\n            replacementVertices.push(\n              isNeighborWithA ? newVertexAKey : newVertexBKey\n            );\n          }\n\n          for (let i = vertexKeys.length - 1; i >= 0; i--) {\n            const vertexKey = vertexKeys[i];\n            if (verticesToInsetMap[vertexKey]) {\n              replacementVertices.push(verticesToInsetMap[vertexKey]);\n            }\n          }\n\n          replaceVertexAndTriangulate(\n            mesh,\n            face,\n            vertexKey,\n            replacementVertices\n          );\n        }\n      }\n      function handleEdgeVertexFaces(\n        vertexKey,\n        newVertexAKey,\n        newVertexBKey,\n        faces\n      ) {\n        if (faces.length < 1) {\n          return;\n        }\n\n        if (faces.length > 1) {\n          insetVertexFaces(vertexKey, newVertexAKey, newVertexBKey, faces);\n          return;\n        }\n\n        for (const face of faces)\n          replaceVertexAndTriangulate(mesh, face, vertexKey, [\n            newVertexBKey,\n            newVertexAKey,\n          ]);\n      }\n\n      if (sharedEdges0.length == 0) {\n        handleEdgeVertexFaces(\n          vertex0Key,\n          newVertexA0Key,\n          newVertexB0Key,\n          faces0\n        );\n      }\n      if (sharedEdges1.length == 0) {\n        handleEdgeVertexFaces(\n          vertex1Key,\n          newVertexA1Key,\n          newVertexB1Key,\n          faces1\n        );\n      }\n\n      faceA.vertices[vertexA0Index] = newVertexA0Key;\n      faceA.vertices[vertexA1Index] = newVertexA1Key;\n      faceB.vertices[vertexB0Index] = newVertexB0Key;\n      faceB.vertices[vertexB1Index] = newVertexB1Key;\n\n      faceA.uv[newVertexA0Key] = faceA.uv[vertex0Key].slice();\n      faceA.uv[newVertexA1Key] = faceA.uv[vertex1Key].slice();\n      faceB.uv[newVertexB0Key] = faceB.uv[vertex0Key].slice();\n      faceB.uv[newVertexB1Key] = faceB.uv[vertex1Key].slice();\n    }\n  }\n\n  Undo.finishEdit(\"MTools: Bevel Edges\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\nexport default action(\"bevel\", () => {\n  runEdit(0.1, false);\n  Undo.amendEdit(\n    {\n      factor: {\n        label: \"Width Percentage\",\n        type: \"number\",\n        value: 10,\n        min: 0,\n        max: 100,\n      },\n    },\n    ({ factor }) => runEdit(factor / 100, true)\n  );\n});\nfunction getEdgesOfFace(face) {\n  return groupElementsCollided(face.getSortedVertices(), 2).map((e) =>\n    getEdgeKey(e[0], e[1])\n  );\n}\nfunction fillInAbsentUVS(face) {\n  for (const vertex of face.vertices) {\n    face.uv[vertex] ??= [0, 0]; // TODO\n  }\n  if (\n    face.vertices.map((e) => face.uv[e]).allAre((e) => e[0] == 0 && e[1] == 0)\n  ) {\n    UVEditor.setAutoSize(null, true, [face.getFaceKey()]);\n  }\n}\nfunction replaceTriangulated(\n  mesh,\n  face,\n  vertexKeys = face.getSortedVertices()\n) {\n  fillInAbsentUVS(face);\n  if (vertexKeys.length == 4) return;\n\n  const vertices = vertexKeys.map((e) => mesh.vertices[e]);\n  const quadrilaterals = quadrilate(vertices);\n\n  delete mesh.faces[face.getFaceKey()];\n\n  for (const quadrilateral of quadrilaterals) {\n    const newFace = new MeshFace(mesh, face).extend({\n      vertices: quadrilateral.map((e) => vertexKeys[e]),\n    });\n    mesh.addFaces(newFace);\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/tools/bridge_edge_loops.action.js",
    "content": "/**\n * !\n * ! Big thanks to Blender for inspiration.\n * ! Special thanks to this code that came in clutch when i was about to give up on path interpolation option.\n * ! https://github.com/blender/blender/blob/703353b5dafc344ac4080d280312ef3aa496b6de/source/blender/bmesh/operators/bmo_subdivide_edgering.cc#L67\n * !\n */\n\nimport { action } from \"../actions.js\";\nimport {\n  findMin,\n  groupElementsCollided,\n  lerp3,\n  offsetArray,\n} from \"../utils/array.js\";\nimport {\n  CubicBezier as CB,\n  closestToLine,\n  computeCentroid,\n  computeTriangleNormal,\n  extractEdgeKey,\n  getSelectedEdgesConnectedCountMap,\n  getSelectedFacesAndEdgesByVertices,\n  selectFacesAndEdgesByVertices,\n} from \"../utils/utils.js\";\nimport {\n  addVectors,\n  distanceBetween,\n  subtractVectors,\n} from \"../utils/vector.js\";\n\n// +\n/**\n *\n * @param {THREE.Vector3} coordinateA\n * @param {THREE.Vector3} normalA\n * @param {THREE.Vector3} coordinateB\n * @param {THREE.Vector3} normalB\n * @returns {number}\n */\nfunction bezierHandleCalcLength(coordinateA, normalA, coordinateB, normalB) {\n  const dot = normalA.dot(normalB);\n  /* gives closest approx at a circle with 2 parallel handles */\n  let fac = 1.333333;\n  let len;\n  if (dot < 0.0) {\n    /* Scale down to 0.666 if we point directly at each other rough but ok. */\n    /* TODO: current blend from dot may not be optimal but its also a detail. */\n    const t = 1.0 + dot;\n    fac = fac * t + 0.75 * (1.0 - t);\n  }\n\n  /* 2d length projected on plane of normals */\n  {\n    let co_a_ofs = new THREE.Vector3().crossVectors(normalA, normalB);\n\n    if (co_a_ofs.lengthSq() > Number.MIN_VALUE) {\n      co_a_ofs.add(coordinateA);\n      closestToLine(co_a_ofs, coordinateB, coordinateA, co_a_ofs);\n    } else {\n      co_a_ofs.copy(coordinateA);\n    }\n    len = co_a_ofs.distanceTo(coordinateB);\n  }\n\n  return len * 0.5 * fac;\n}\n// +\n\n/**\n *\n * @param {Mesh} mesh\n * @param {*} edgeLoopA\n * @param {*} edgeLoopB\n */\nfunction bridgeLoops(mesh, edgeLoopA, edgeLoopB) {\n  for (let i = 0; i < edgeLoopA.length; i++) {\n    const edgeA = edgeLoopA[i];\n    const edgeB = edgeLoopB[Math.min(i, edgeLoopB.length - 1)];\n\n    let vertexA = edgeA[0];\n    let vertexB = edgeA[1];\n    let vertexC = edgeB[1];\n    let vertexD = edgeB[0];\n\n    const width = distanceBetween(\n      mesh.vertices[vertexB],\n      mesh.vertices[vertexA]\n    );\n    const height = distanceBetween(\n      mesh.vertices[vertexA],\n      mesh.vertices[vertexD]\n    );\n    const face = new MeshFace(mesh, {\n      vertices: [vertexB, vertexA, vertexD, vertexC],\n      uv: {\n        [vertexB]: [0, 0],\n        [vertexA]: [width, 0],\n        [vertexD]: [width, height],\n        [vertexC]: [0, height],\n      },\n    });\n    mesh.addFaces(face);\n  }\n}\n\n/**\n *\n * @param {Mesh} mesh\n * @param {*} edgeLoopA\n * @param {*} edgeLoopB\n * @param {THREE.Vector3} centroidA\n * @param {THREE.Vector3} centroidB\n */\nfunction bridgeLoopsConfigured(\n  mesh,\n  edgeLoopA,\n  edgeLoopB,\n  centroidA,\n  centroidB,\n  { twist, numberOfCuts, blendPath, blendInfluence, reverse }\n) {\n  if (edgeLoopA.length < 3 || edgeLoopB.length < 3) {\n    return;\n  }\n  edgeLoopA = edgeLoopA.map((e) => e.slice());\n  edgeLoopB = edgeLoopB.map((e) => e.slice());\n\n  const bestOffset = bestEdgeLoopsOffset(edgeLoopA, edgeLoopB, mesh);\n  offsetArray(edgeLoopB, bestOffset);\n\n  const reversedEdgeLoopB = edgeLoopB.map((e) => e.slice().reverse()).reverse();\n\n  const bestOffsetReversed = bestEdgeLoopsOffset(\n    edgeLoopA,\n    reversedEdgeLoopB,\n    mesh\n  );\n  offsetArray(reversedEdgeLoopB, bestOffsetReversed);\n  if (\n    edgeLoopsLength(mesh, edgeLoopA, reverse ? edgeLoopB : reversedEdgeLoopB) <\n    edgeLoopsLength(mesh, edgeLoopA, reverse ? reversedEdgeLoopB : edgeLoopB)\n  ) {\n    edgeLoopB = reversedEdgeLoopB;\n  }\n\n  let handleA;\n  let handleB;\n  let direction;\n  if (blendPath) {\n    // +\n    direction = new THREE.Vector3().subVectors(centroidB, centroidA);\n    const edgeLoopANormal = computeTriangleNormal(\n      mesh.vertices[edgeLoopA[0][0]],\n      mesh.vertices[edgeLoopA[1][0]],\n      mesh.vertices[edgeLoopA[2][0]]\n    ).normalize();\n    const edgeLoopBNormal = computeTriangleNormal(\n      mesh.vertices[edgeLoopB[0][0]],\n      mesh.vertices[edgeLoopB[1][0]],\n      mesh.vertices[edgeLoopB[2][0]]\n    ).normalize();\n\n    // Normals should be facing each other\n    if (direction.dot(edgeLoopANormal) < 0) {\n      edgeLoopANormal.negate();\n    }\n    if (direction.dot(edgeLoopBNormal) > 0) {\n      edgeLoopBNormal.negate();\n    }\n    // +\n\n    const handleLength =\n      bezierHandleCalcLength(\n        centroidA,\n        edgeLoopANormal,\n        centroidB,\n        edgeLoopBNormal\n      ) * blendInfluence;\n    handleA = edgeLoopANormal.clone();\n    handleA.setLength(handleLength);\n    handleA.add(centroidA);\n    handleB = edgeLoopBNormal.clone();\n    handleB.setLength(handleLength);\n    handleB.add(centroidB);\n  }\n\n  const subEdgeLoops = [];\n  offsetArray(edgeLoopB, twist);\n\n  for (let i = 0; i < numberOfCuts; i++) {\n    const t = i / (numberOfCuts - 1);\n\n    const subEdgeLoop = [];\n    // TODO ??\n    const centroid = lerp3(centroidA.toArray(), centroidB.toArray(), t);\n    const normal = lerp3(centroidA.toArray(), centroidB.toArray(), t);\n\n    for (let j = 0; j < edgeLoopA.length; j++) {\n      const edgeA = edgeLoopA[j];\n      const edgeB = edgeLoopB[Math.min(j, edgeLoopB.length - 1)];\n\n      if (i == 0) {\n        subEdgeLoop.push(edgeA[0]);\n      } else if (i == numberOfCuts - 1) {\n        subEdgeLoop.push(edgeB[0]);\n      } else {\n        const vertex = lerp3(\n          mesh.vertices[edgeA[0]],\n          mesh.vertices[edgeB[0]],\n          t\n        );\n        if (handleA && handleB) {\n          const v3Vertex = vertex.V3_toThree();\n          subtractVectors(v3Vertex, centroid);\n\n          // const smoothenedTangent = [\n          //   CBTangent(t, centroidA.x, handleA.x, handleB.x, centroidB.x),\n          //   CBTangent(t, centroidA.y, handleA.y, handleB.y, centroidB.y),\n          //   CBTangent(t, centroidA.z, handleA.z, handleB.z, centroidB.z),\n          // ].V3_toThree();\n          // const eulerInitial = rotationFromDirection(direction);\n          // const eulerTarget = rotationFromDirection(smoothenedTangent);\n          // const matrix4Initial = new THREE.Matrix4().makeRotationFromEuler(\n          //   eulerInitial\n          // );\n          // const matrix4Target = new THREE.Matrix4().makeRotationFromEuler(\n          //   eulerTarget\n          // );\n          // const matrix = matrix4Initial\n          //   .clone()\n          //   .transpose()\n          //   .multiply(matrix4Target);\n          // v3Vertex.applyMatrix4(matrix);\n\n          const smoothenedCentroid = [\n            CB(t, centroidA.x, handleA.x, handleB.x, centroidB.x),\n            CB(t, centroidA.y, handleA.y, handleB.y, centroidB.y),\n            CB(t, centroidA.z, handleA.z, handleB.z, centroidB.z),\n          ];\n\n          addVectors(v3Vertex, smoothenedCentroid);\n          vertex[0] = v3Vertex.x;\n          vertex[1] = v3Vertex.y;\n          vertex[2] = v3Vertex.z;\n        }\n\n        subEdgeLoop.push(mesh.addVertices(vertex)[0]);\n      }\n    }\n\n    subEdgeLoops.push(groupElementsCollided(subEdgeLoop, 2));\n  }\n\n  for (let i = 0; i < subEdgeLoops.length - 1; i++) {\n    const fromEdgeLoop = subEdgeLoops[i];\n    const intoEdgeLoop = subEdgeLoops[i + 1];\n    bridgeLoops(mesh, fromEdgeLoop, intoEdgeLoop);\n  }\n}\n\nfunction runEdit(\n  amend,\n  numberOfCuts,\n  twist,\n  cutHoles,\n  blendPath,\n  blendInfluence,\n  reverse\n) {\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n\n  for (const mesh of Mesh.selected) {\n    // Delete selected faces and keep outer edges\n    let keptVerticesSet;\n    if (BarItems[\"selection_mode\"].value == \"face\") {\n      keptVerticesSet = new Set();\n      const keptEdges = new Set();\n      const {\n        selectedConnectedCount: edgesConnectedCount,\n        connectedCount: edgesAllConnectedCount,\n      } = getSelectedEdgesConnectedCountMap(mesh);\n\n      for (const edge in edgesConnectedCount) {\n        const [a, b] = extractEdgeKey(edge);\n        const count = edgesConnectedCount[edge];\n        const allCount = edgesAllConnectedCount[edge];\n\n        if (count == 1) {\n          keptEdges.add(edge);\n          keptVerticesSet.add(a);\n          keptVerticesSet.add(b);\n\n          if (allCount == 1 && cutHoles) {\n            mesh.addFaces(\n              new MeshFace(mesh, {\n                vertices: [a, b],\n              })\n            );\n          }\n        }\n      }\n\n      if (cutHoles) {\n        const leftVerticesSet = new Set();\n        for (const vertexKey of mesh.getSelectedVertices()) {\n          if (!keptVerticesSet.has(vertexKey)) {\n            leftVerticesSet.add(vertexKey);\n          }\n        }\n        for (const vertexKey of leftVerticesSet) {\n          delete mesh.vertices[vertexKey];\n        }\n        for (const faceKey of mesh.getSelectedFaces()) {\n          delete mesh.faces[faceKey];\n        }\n      }\n      selectFacesAndEdgesByVertices(mesh, keptVerticesSet);\n    } else {\n      keptVerticesSet = new Set(mesh.getSelectedVertices());\n    }\n    const loops = [];\n    const { edges } = getSelectedFacesAndEdgesByVertices(mesh, keptVerticesSet);\n\n    const visitedEdges = new Set();\n    for (const edge of edges) {\n      if (visitedEdges.has(edge)) continue;\n      visitedEdges.add(edge);\n\n      const currentLoop = [edge];\n      while (true) {\n        const targetEdge = currentLoop.last();\n        let connectedEdge;\n        for (const otherEdge of edges) {\n          if (\n            !currentLoop.includes(otherEdge) &&\n            (otherEdge[0] == targetEdge[0] ||\n              otherEdge[1] == targetEdge[0] ||\n              otherEdge[1] == targetEdge[1] ||\n              otherEdge[0] == targetEdge[1])\n          ) {\n            connectedEdge = otherEdge;\n            break;\n          }\n        }\n        if (!connectedEdge) break;\n        if (visitedEdges.has(connectedEdge)) break;\n\n        visitedEdges.add(connectedEdge);\n        currentLoop.push(connectedEdge);\n      }\n      // Organize unorganized loops\n      for (let i = 0; i < currentLoop.length; i++) {\n        const currEdge = currentLoop[i];\n        const nextEdge = currentLoop[(i + 1) % currentLoop.length];\n        if (currEdge[1] != nextEdge[0]) {\n          nextEdge.reverse();\n        }\n      }\n\n      loops.push(currentLoop);\n    }\n\n    if (loops.length < 2) continue;\n    for (let i = 0; i < loops.length; i++) {\n      loops[i] = {\n        loop: loops[i],\n        centroid: computeCentroid(loops[i].map((e) => mesh.vertices[e[0]])),\n      };\n    }\n\n    const furthestLoop = findMin(loops, (e) => e.centroid.length());\n    loops.remove(furthestLoop);\n\n    const sortedEdgeLoops = [furthestLoop];\n    mesh.addVertices(sortedEdgeLoops[0].centroid.toArray());\n    while (loops.length) {\n      const currEdgeLoop = sortedEdgeLoops.last();\n      const closestLoop = findMin(loops, (e) =>\n        e.centroid.distanceToSquared(currEdgeLoop.centroid)\n      );\n\n      sortedEdgeLoops.push(closestLoop);\n      loops.remove(closestLoop);\n    }\n    for (let i = 0; i < sortedEdgeLoops.length - 1; i++) {\n      const { centroid: fromCentroid, loop: fromEdgeLoop } = sortedEdgeLoops[i];\n      const { centroid: intoCentroid, loop: intoEdgeLoop } =\n        sortedEdgeLoops[i + 1];\n\n      bridgeLoopsConfigured(\n        mesh,\n        fromEdgeLoop,\n        intoEdgeLoop,\n        fromCentroid,\n        intoCentroid,\n        {\n          twist,\n          numberOfCuts,\n          blendPath,\n          blendInfluence,\n          reverse,\n        }\n      );\n    }\n  }\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n  });\n  Undo.finishEdit(\"MTools: Bridged Edge Loops.\");\n}\nexport default action(\"bridge_edge_loops\", () => {\n  runEdit(false, 2, 0, true, true, 1, false);\n\n  Undo.amendEdit(\n    {\n      // reverse: {\n      //   type: \"checkbox\",\n      //   label: \"Reverse Winding\",\n      //   value: false,\n      // },\n      num_cuts: {\n        type: \"number\",\n        label: \"Number Of Cuts\",\n        min: 1,\n        value: 1,\n      },\n      twist: {\n        type: \"number\",\n        label: \"Twist\",\n        value: 0,\n      },\n      blend_influence: {\n        type: \"range\",\n        label: \"Smoothness\",\n        value: 100,\n        min: -200,\n        max: 200,\n      },\n      blend_path: {\n        type: \"checkbox\",\n        label: \"Blend Path\",\n        value: true,\n      },\n      cut_holes: {\n        type: \"checkbox\",\n        label: \"Cut Holes\",\n        value: true,\n        condition: () => BarItems[\"selection_mode\"].value == \"face\",\n      },\n    },\n    (form) => {\n      runEdit(\n        true,\n        form.num_cuts + 1,\n        form.twist,\n        form.cut_holes,\n        form.blend_path,\n        form.blend_influence / 100,\n        form.reverse\n      );\n    }\n  );\n});\nfunction edgeLoopsLength(mesh, fromEdgeLoop, intoEdgeLoop) {\n  let length = 0;\n  for (let i = 0; i < fromEdgeLoop.length; i++) {\n    const [vertexA0] = fromEdgeLoop[i];\n    const [vertexB0] = intoEdgeLoop[Math.min(i, intoEdgeLoop.length - 1)];\n    length += distanceBetween(mesh.vertices[vertexA0], mesh.vertices[vertexB0]);\n  }\n  return length;\n}\n/**\n * Returns the best offset applied on {@linkcode intoEdgeLoop} when connected with {@linkcode fromEdgeLoop}\n * @param {*} fromEdgeLoop\n * @param {*} intoEdgeLoop\n * @param {Mesh} mesh\n * @returns {number}\n */\nfunction bestEdgeLoopsOffset(fromEdgeLoop, intoEdgeLoop, mesh) {\n  let bestOffset = 0;\n  let minLength = Infinity;\n  outer: for (let i = 0; i < intoEdgeLoop.length; i++) {\n    let length = 0;\n    for (let i = 0; i < fromEdgeLoop.length; i++) {\n      const [vertexA0] = fromEdgeLoop[i];\n      const [vertexB0] = intoEdgeLoop[Math.min(i, intoEdgeLoop.length - 1)];\n      length += distanceBetween(\n        mesh.vertices[vertexA0],\n        mesh.vertices[vertexB0]\n      );\n\n      // Optimization\n      if (length > minLength) {\n        offsetArray(intoEdgeLoop, 1);\n        continue outer;\n      }\n    }\n    if (length <= minLength) {\n      bestOffset = i;\n      minLength = length;\n    }\n    offsetArray(intoEdgeLoop, 1);\n  }\n  return bestOffset;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/tools/expand_selection.action.js",
    "content": "import { action } from \"../actions.js\";\nimport Neighborhood from \"../utils/mesh/neighborhood.js\";\nimport { selectFacesAndEdgesByVertices } from \"../utils/utils.js\";\n\nexport default action(\"expand_selection\", () => {\n  Mesh.selected.forEach((mesh) => {\n    const neighborMap = Neighborhood.VertexVertices(mesh);\n\n    const selectedVertices = mesh.getSelectedVertices();\n    const selectedVertexSet = new Set(selectedVertices);\n    for (const vertexKey of selectedVertices) {\n      const neighbors = neighborMap[vertexKey];\n      if (neighbors) {\n        for (const neighbor of neighbors) {\n          selectedVertexSet.add(neighbor);\n        }\n      }\n    }\n    selectFacesAndEdgesByVertices(mesh, selectedVertexSet);\n  });\n  Canvas.updateView({ elements: Mesh.selected, selection: true });\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/index.js",
    "content": "import \"./**/*.action.js\";\nimport { action } from \"../actions.js\";\n\nexport default action(\"tools\");"
  },
  {
    "path": "src/mesh_tools/src/tools/laplacian_smooth.action.js",
    "content": "import { action } from \"../actions.js\";\nimport Neighborhood from \"../utils/mesh/neighborhood.js\";\n\nfunction runEdit(amend = false, influence = 1, iterations = 1) {\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n\n  Mesh.selected.forEach((mesh) => {\n    if (!influence || !iterations) return; //\n\n    const { vertices } = mesh;\n    const neighborMap = Neighborhood.VertexVertices(mesh);\n\n    const selectedVertices = mesh.getSelectedVertices();\n\n    const originalVertexPositions = {};\n    for (let i = 0; i < iterations; i++) {\n      for (let vertexKey of selectedVertices) {\n        originalVertexPositions[vertexKey] = mesh.vertices[vertexKey].slice();\n      }\n\n      for (let vertexKey of selectedVertices) {\n        const neighbors = neighborMap[vertexKey];\n\n        const vertexSmoothed = [0, 0, 0];\n        for (const neigbor of neighbors) {\n          const neigborPosition = originalVertexPositions[neigbor];\n          vertexSmoothed.V3_add(neigborPosition);\n        }\n        vertexSmoothed.V3_divide(neighbors.length);\n\n        vertices[vertexKey] = vertices[vertexKey].map((e, i) =>\n          Math.lerp(e, vertexSmoothed[i], influence)\n        );\n      }\n    }\n  });\n  Undo.finishEdit(\"MTools: Laplacian Smooth selected vertices\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\n\nexport default action(\"laplacian_smooth\", () => {\n  runEdit();\n  Undo.amendEdit(\n    {\n      influence: {\n        type: \"range\",\n        value: 100,\n        label: \"Influence\",\n        min: 0,\n        max: 100,\n      },\n      iterations: {\n        type: \"range\",\n        value: 1,\n        label: \"Iterations\",\n        min: 1,\n        max: 10,\n      },\n    },\n    (form) => runEdit(true, form.influence / 100, form.iterations)\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/poke.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { getFaceUVCenter } from \"../utils/utils.js\";\n\nfunction runEdit(meshes, facesByMesh, amended, depth) {\n  Undo.initEdit({ elements: meshes, selection: true }, amended);\n\n  meshes.forEach((mesh, meshIndex) => {\n    const faces = facesByMesh[meshIndex];\n    faces.forEach((key) => {\n      const face = mesh.faces[key];\n\n      /* center vertex creation */\n      const am = face.getNormal(true).V3_multiply(depth);\n      const centerVertex = mesh.addVertices(face.getCenter().V3_add(am))[0];\n\n      /* faces creation */\n      const vertices = face.getSortedVertices();\n      for (let i = 0; i < vertices.length; i++) {\n        const vertexA = vertices[i];\n        const vertexB = vertices[(i + 1) % vertices.length];\n        const new_face = new MeshFace(mesh, face).extend({\n          vertices: [vertexA, vertexB, centerVertex],\n        });\n        new_face.uv[centerVertex] = getFaceUVCenter(face);\n\n        mesh.addFaces(new_face);\n      }\n      delete mesh.faces[key];\n    });\n  });\n  Undo.finishEdit(\"MTools: Poke mesh face selection\");\n  Canvas.updateView({\n    elements: meshes,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\n\nexport default action(\"poke\", () => {\n  const meshes = Mesh.selected.slice();\n  const facesByMesh = meshes.map((mesh) => mesh.getSelectedFaces().slice());\n\n  runEdit(meshes, facesByMesh, false, 0);\n  Undo.amendEdit(\n    {\n      depth: { type: \"number\", value: 0, label: \"Depth\" },\n    },\n    (form) => {\n      runEdit(meshes, facesByMesh, true, form.depth);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/shrink_selection.action.js",
    "content": "import { action } from \"../actions.js\";\nimport Neighborhood from \"../utils/mesh/neighborhood.js\";\nimport { selectFacesAndEdgesByVertices } from \"../utils/utils.js\";\n\nexport default action(\"shrink_selection\", () => {\n  Mesh.selected.forEach((mesh) => {\n    const neighborMap = Neighborhood.VertexVertices(mesh);\n\n    const selectedVertices = mesh.getSelectedVertices();\n    const selectedVertexSet = new Set(selectedVertices);\n    for (const vertexKey of selectedVertices) {\n      const neighbors = neighborMap[vertexKey];\n\n      for (const neighbor of neighbors) {\n        const isNotSelected = !selectedVertexSet.has(neighbor);\n\n        if (isNotSelected) {\n          selectedVertexSet.delete(vertexKey);\n          break;\n        }\n      }\n    }\n    selectFacesAndEdgesByVertices(mesh, selectedVertexSet);\n  });\n  Canvas.updateView({ elements: Mesh.selected, selection: true });\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/to_sphere.action.js",
    "content": "import { action } from \"../actions.js\";\n\nfunction runEdit(amend, influence = 100) {\n  influence /= 100;\n  Undo.initEdit({ elements: Mesh.selected, selection: true }, amend);\n  /* selected meshes */\n  Mesh.selected.forEach((mesh) => {\n    const center = [0, 0, 0];\n    const selectedVertices = mesh.getSelectedVertices();\n    const positions = [];\n    const size = [0, 0, 0];\n    selectedVertices.forEach((key) => {\n      positions.push(mesh.vertices[key]);\n      center.V3_add(mesh.vertices[key]);\n    });\n    center.V3_divide(selectedVertices.length);\n\n    for (let i = 0; i < 3; i++) {\n      positions.sort((a, b) => a[i] - b[i]);\n      size[i] = positions.last()[i] - positions[0][i];\n    }\n    size.V3_divide(2);\n\n    selectedVertices.forEach((key) => {\n      const vertex = mesh.vertices[key];\n      const spherePosition = vertex\n        .V3_subtract(center)\n        .V3_toThree()\n        .normalize()\n        .toArray()\n        .V3_multiply(size)\n        .V3_add(center)\n        .V3_toThree();\n\n      const finalPoint = vertex\n        .V3_add(center)\n        .V3_toThree()\n        .lerp(spherePosition, influence)\n        .toArray();\n      mesh.vertices[key] = finalPoint;\n    });\n  });\n  Undo.finishEdit(\"MTools: Spherize mesh selection\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\n\nexport default action(\"to_sphere\", () => {\n  runEdit(false, 100);\n  Undo.amendEdit(\n    {\n      influence: {\n        type: \"range\",\n        value: 100,\n        label: \"Influence\",\n        min: 0,\n        max: 100,\n      },\n    },\n    (form) => {\n      runEdit(true, form.influence);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/triangulate.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { triangulate } from \"../utils/utils.js\";\n\n/**\n * ! I'm very aware that BlockBench only supports quadrilaterals and triangles for faces.\n * ! However, this action is kept for the future if higher vertex polygons are implemented.\n * !\n */\nexport default action(\"triangulate\", () => {\n  Undo.initEdit({ elements: Mesh.selected, selection: true });\n  /* selected meshes */\n  Mesh.selected.forEach((mesh) => {\n    /* selected faces */\n    mesh.getSelectedFaces().forEach((key) => {\n      const face = mesh.faces[key];\n      const vertices = face.getSortedVertices();\n      if (!(vertices.length <= 3)) {\n        const triangles = triangulate(\n          vertices.map((key) => mesh.vertices[key]),\n          face.getNormal(true)\n        );\n        // create faces\n        for (let i = 0; i < triangles.length; i++) {\n          const newTri = new MeshFace(mesh, face).extend({\n            vertices: [\n              vertices[triangles[i][0]],\n              vertices[triangles[i][2]],\n              vertices[triangles[i][1]],\n            ],\n          });\n          mesh.addFaces(newTri);\n        }\n        delete mesh.faces[key];\n      }\n    });\n  });\n  Undo.finishEdit(\"MTools: Triangulate mesh face selection\");\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/tris_to_quad.action.js",
    "content": "import { action } from \"../actions.js\";\nimport { minIndex } from \"../utils/array.js\";\nimport { isValidQuad } from \"../utils/utils.js\";\n\nfunction runEdit(meshes, facesByMesh, maxAngle, ignoreDisjointUVs, amend) {\n  Undo.initEdit({ elements: meshes, selection: true }, amend);\n\n  meshes.forEach((mesh, meshIndex) => {\n    const faces = facesByMesh[meshIndex];\n\n    faces.forEach((faceKey) => {\n      const face = mesh.faces[faceKey];\n\n      if (!face || face.vertices.length != 3) return;\n\n      const vertices = face.getSortedVertices().slice();\n      const faceNormal = face.getNormal(true);\n\n      const adjacentFacesEdges = [];\n      const adjacentFaces = [];\n      const adjacentFaceKeys = [];\n      const adjacentFacesIndices = [];\n      for (let i = 0; i < 3; i++) {\n        const currentAdjacentFaceData = face.getAdjacentFace(i);\n\n        if (!currentAdjacentFaceData) continue;\n\n        const currentAdjacentFace = currentAdjacentFaceData.face;\n        const currentAdjacentFaceKey = currentAdjacentFaceData.key;\n        const currentAdjacentFaceEdge = currentAdjacentFaceData.edge;\n\n        if (currentAdjacentFace.vertices.length != 3) continue;\n        if (\n          adjacentFaces.length > 1 &&\n          adjacentFaces.last() == adjacentFaces[i]\n        )\n          break;\n        if (!faces.includes(currentAdjacentFaceKey)) continue;\n\n        adjacentFaces.push(currentAdjacentFace);\n        adjacentFacesEdges.push(currentAdjacentFaceEdge);\n        adjacentFaceKeys.push(currentAdjacentFaceKey);\n        adjacentFacesIndices.push(i);\n      }\n      const angles = adjacentFaces.map((e) => face.getAngleTo(e));\n      const minAngledFaceIndex = minIndex(angles);\n      if (minAngledFaceIndex == -1) return;\n      const minAngle = angles[minAngledFaceIndex];\n      const adjacentFace = adjacentFaces[minAngledFaceIndex];\n      const adjacentFaceKey = adjacentFaceKeys[minAngledFaceIndex];\n      const adjacentEdge = adjacentFacesEdges[minAngledFaceIndex];\n      if (minAngle > maxAngle) {\n        return;\n      }\n      const adjacentVertices = adjacentFace.getSortedVertices().slice();\n      const uniqueVertex = vertices.find(\n        (key) => !adjacentVertices.includes(key)\n      );\n      if (!uniqueVertex) {\n        return;\n      }\n\n      adjacentVertices.splice(\n        adjacentFacesIndices[minAngledFaceIndex] + 1,\n        0,\n        uniqueVertex\n      );\n\n      const newQuad = new MeshFace(mesh, {\n        vertices: adjacentVertices,\n      });\n      const newFaceNormal = newQuad.getNormal(true);\n      if (\n        !isValidQuad(newQuad.getSortedVertices().map((e) => mesh.vertices[e]))\n      ) {\n        return;\n      }\n      if (newFaceNormal.V3_toThree().dot(faceNormal.V3_toThree()) < 0) {\n        newQuad.invert();\n      }\n\n      if (ignoreDisjointUVs) {\n        for (const edgeVertex of adjacentEdge) {\n          const areUVsJoint =\n            Math.roundTo(face.uv[edgeVertex][0], 5) ==\n              Math.roundTo(adjacentFace.uv[edgeVertex][0], 5) &&\n            Math.roundTo(face.uv[edgeVertex][1], 5) ==\n              Math.roundTo(adjacentFace.uv[edgeVertex][1], 5);\n\n          if (!areUVsJoint) {\n            return;\n          }\n        }\n      }\n\n      newQuad.uv = adjacentFace.uv;\n      if (face.uv[uniqueVertex] instanceof Array) {\n        newQuad.uv[uniqueVertex] = face.uv[uniqueVertex];\n      }\n      for (const key of newQuad.vertices) {\n        newQuad.uv[key] ??= [0, 0];\n      }\n\n      newQuad.texture = face.texture;\n      mesh.addFaces(newQuad);\n      delete mesh.faces[adjacentFaceKey];\n      delete mesh.faces[faceKey];\n    });\n  });\n  Undo.finishEdit(\"MTools: Convert selected Triangles to Quads\");\n  Canvas.updateView({\n    elements: meshes,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n}\nexport default action(\"tris_to_quad\", () => {\n  const meshes = Mesh.selected.slice();\n  const facesByMesh = meshes.map((mesh) => mesh.getSelectedFaces().slice());\n\n  runEdit(meshes, facesByMesh, 45, true, false);\n  Undo.amendEdit(\n    {\n      max_angle: {\n        label: \"Max Angle\",\n        value: 45,\n        min: 0,\n        max: 180,\n        type: \"range\",\n      },\n      ignore_disjoint_uvs: {\n        label: \"Ignore Disjoint UVs\",\n        value: true,\n        type: \"checkbox\",\n      },\n    },\n    (out) =>\n      runEdit(meshes, facesByMesh, out.max_angle, out.ignore_disjoint_uvs, true)\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/uv_mapping/uv_mapping.action.js",
    "content": "import { action } from \"../../actions.js\";\n\nexport default action(\"uv_mapping\");\n"
  },
  {
    "path": "src/mesh_tools/src/tools/uv_mapping/uv_project_view.action.js",
    "content": "import { action } from \"../../actions.js\";\nimport { dontShowAgainInfo } from \"../../utils/info.js\";\nimport { worldToScreen } from \"../../utils/utils.js\";\n\nfunction runEdit(preview, preserveAspect, amend) {\n  const { width, height, camera } = preview;\n\n  Undo.initEdit(\n    {\n      elements: Mesh.selected,\n      selection: true,\n      uv_only: true,\n      uv_mode: true,\n    },\n    amend\n  );\n\n  const aspect = preserveAspect\n    ? height / width\n    : Math.max(width, height) / Math.min(width, height);\n\n  Mesh.selected.forEach((mesh) => {\n    /* selected faces */\n    mesh.getSelectedFaces().forEach((key) => {\n      const face = mesh.faces[key];\n\n      face.vertices.forEach((vkey) => {\n        const vertex = mesh.mesh.localToWorld(mesh.vertices[vkey].V3_toThree());\n\n        const screenCoordinate = worldToScreen(vertex, camera, width, height);\n        face.uv[vkey] = [\n          (screenCoordinate.x / width) * Project.texture_width,\n          (screenCoordinate.y / height) * Project.texture_height * aspect,\n        ];\n      });\n    });\n  });\n  Undo.finishEdit(\"MTools: Unwrap mesh face selection uv from view\", {\n    uv_only: true,\n    uv_mode: true,\n  });\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n  updateSelection();\n}\nexport default action(\"uv_project_view\", () => {\n  const preview = Canvas.getHoveredPreview();\n  runEdit(preview, true, false);\n\n  dontShowAgainInfo(\n    \"uv_project_view\",\n    \"Deprecation Notice\",\n    \"UV Project View is deprecated and will be removed from MTools. It's now built into Blockbench under <br> <code>UV > UV Project from View</code>.\"\n  );\n\n  Undo.amendEdit(\n    {\n      preserve_aspect: {\n        type: \"checkbox\",\n        value: true,\n        label: \"Preserve Aspect\",\n      },\n    },\n    (form) => runEdit(preview, form.preserve_aspect, true)\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/tools/uv_mapping/uv_turnaround_projection.action.js",
    "content": "import { action } from \"../../actions.js\";\nimport { getMinProjectTextureSize } from \"../../utils/utils.js\";\n\nfunction runEdit(margin, split, amend) {\n  /* selected meshes */\n  Undo.initEdit(\n    {\n      elements: Mesh.selected,\n      selection: true,\n      uv_only: true,\n      uv_mode: true,\n    },\n    amend\n  );\n  Mesh.selected.forEach((mesh) => {\n    if (mesh.getSelectedFaces().length) {\n      let positions = [];\n      let selectionBound = { min: [0, 0, 0], max: [0, 0, 0] };\n      let gatheredDirs = {\n        \"1,0,0\": [],\n        \"-1,0,0\": [],\n        \"0,1,0\": [],\n        \"0,-1,0\": [],\n        \"0,0,1\": [],\n        \"0,0,-1\": [],\n      };\n      /* selected faces */\n      mesh.getSelectedFaces().forEach((key) => {\n        let face = mesh.faces[key];\n        let normal = face.getNormal(true);\n        face.vertices.forEach((Vkey) => {\n          positions.push(mesh.vertices[Vkey]);\n        });\n        // choose its direction\n        let d0 = normal[0];\n        let d1 = normal[1];\n        let d2 = normal[2];\n        let finalDir = [0, 0, 0];\n        /* chooses the furthest from 0 ( there should be one )*/\n        let furthest = Math.max(\n          Math.abs(normal[0]),\n          Math.abs(normal[1]),\n          Math.abs(normal[2])\n        );\n        if (furthest == d0 * Math.sign(normal[0])) {\n          finalDir = [Math.sign(d0), 0, 0];\n        } else if (furthest == d1 * Math.sign(normal[1])) {\n          finalDir = [0, Math.sign(d1), 0];\n        } else if (furthest == d2 * Math.sign(normal[2])) {\n          finalDir = [0, 0, Math.sign(d2)];\n        }\n\n        if (face.vertices.length >= 3) {\n          gatheredDirs[finalDir.toString()].push(key);\n        }\n      });\n      for (let i = 0; i < 3; i++) {\n        positions.sort((a, b) => b[i] - a[i]);\n        selectionBound.max[i] = positions[0][i] + 0.0001;\n        selectionBound.min[i] = positions.last()[i] - positions[0][i] + 0.0001;\n      }\n      let x = 0;\n      let S_res = getMinProjectTextureSize();\n      let _margin = 1 - margin / 100;\n      for (const key in gatheredDirs) {\n        x++;\n        gatheredDirs[key].forEach((Fkey) => {\n          let face = mesh.faces[Fkey];\n          let I = key.replace(\"-\", \"\").replaceAll(\",\", \"\");\n          I = I == \"100\" ? [2, 1] : I == \"010\" ? [0, 2] : [0, 1];\n          face.vertices.forEach((Vkey) => {\n            let uv = [\n              ((selectionBound.max[I[0]] - mesh.vertices[Vkey][I[0]] + 0.0001) *\n                _margin) /\n                -selectionBound.min[I[0]],\n              ((selectionBound.max[I[1]] - mesh.vertices[Vkey][I[1]] + 0.0001) *\n                _margin) /\n                -selectionBound.min[I[1]],\n            ];\n            if (split) {\n              // work with normalised values\n              uv[0] *= 0.33;\n              uv[1] *= 0.33;\n              // remove the safety number\n              uv[0] -= 0.0001;\n              uv[1] -= 0.0001;\n\n              uv[0] += (x % 3) * 0.33;\n              uv[1] += x > 3 ? 0.33 : 0;\n            }\n\n            // scale to project res\n            uv[0] *= S_res;\n            uv[1] *= S_res;\n\n            mesh.faces[Fkey].uv[Vkey] = uv;\n          });\n        });\n      }\n    }\n  });\n  Undo.finishEdit(\"MTools: Unwrap mesh face selection (cubic projection)\", {\n    uv_only: true,\n    uv_mode: true,\n  });\n  Canvas.updateView({\n    elements: Mesh.selected,\n    element_aspects: { geometry: true, uv: true, faces: true },\n    selection: true,\n  });\n  updateSelection();\n}\nexport default action(\"uv_turnaround_projection\", () => {\n  runEdit(0.1, true, false);\n  Undo.amendEdit(\n    {\n      margin: {\n        type: \"number\",\n        value: 0,\n        label: \"Margin\",\n        min: 0,\n        max: 100,\n      },\n      split: { type: \"checkbox\", label: \"Split\", value: true },\n    },\n    (form) => {\n      runEdit(form.margin, form.split, true);\n    }\n  );\n});\n"
  },
  {
    "path": "src/mesh_tools/src/utils/array.js",
    "content": "/**\n * @template {V}\n * @template {K}\n * @param {V[]} arr\n * @param {(value: V, currentIndex: number, array: V[]) => K[]} callback\n * @returns {{[k: K]: V[]}}\n */\nexport function groupMultipleBy(arr, callback) {\n  return arr.reduce((acc, ...args) => {\n    const keys = callback(...args);\n    for (const key of keys) {\n      acc[key] ??= [];\n      acc[key].push(args[0]);\n    }\n    return acc;\n  }, {});\n}\n\nexport function minIndex(array) {\n  let minI = -1;\n  let minValue = Infinity;\n  for (let i = 0; i < array.length; i++) {\n    const value = array[i];\n\n    if (value <= minValue) {\n      minValue = value;\n      minI = i;\n    }\n  }\n  return minI;\n}\nexport function findMin(array, map = (x) => x) {\n  if (array.length == 1) return array[0];\n  if (array.length == 0) return null;\n\n  let minElement = null;\n  let minValue = Infinity;\n\n  for (const element of array) {\n    const value = map(element);\n\n    if (value <= minValue) {\n      minElement = element;\n      minValue = value;\n    }\n  }\n\n  return minElement;\n}\n\n/**\n *\n * @param {ArrayVector3} a\n * @param {ArrayVector3} b\n * @param {number} t\n * @returns {ArrayVector3}\n */\nexport function lerp3(a, b, t) {\n  return a.map((e, i) => Math.lerp(e, b[i], t));\n}\nexport function groupElementsCollided(array, every = 2) {\n  const newArray = [];\n  for (let i = 0; i < array.length; i++) {\n    const sub = [];\n    for (let j = 0; j < every; j++) {\n      const element = array[(i + j) % array.length];\n      sub.push(element);\n    }\n    newArray.push(sub);\n  }\n  return newArray;\n}\n\nexport function offsetArray(array, offset) {\n  while (offset < 0) offset += array.length;\n  while (offset >= array.length) offset -= array.length;\n\n  const newArr = [];\n  for (let i = 0; i < array.length; i++) {\n    newArr[(i + offset) % array.length] = array[i];\n  }\n\n  array.splice(0, Infinity, ...newArr);\n}\nexport function deepIncludes(array, value) {\n  for (const item of array) {\n    if (item === value) {\n      return true;\n    }\n    if (item instanceof Array && deepIncludes(item, value)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * @template {T}\n * @param {T[]} array\n * @returns {T[]}\n */\nexport function distinguishArray(array) {\n  const distinctArray = [];\n  for (const element of array) {\n    if (distinctArray.includes(element)) continue;\n\n    distinctArray.push(element);\n  }\n  return distinctArray;\n}\n\nexport function distinctlyMergeArrays(...arrays) {\n  const distinctArray = [];\n  for (const array of arrays) {\n    for (const element of array) {\n      if (distinctArray.includes(element)) continue;\n\n      distinctArray.push(element);\n    }\n  }\n  return distinctArray;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/docs.js",
    "content": "const LanguageDefinitions = {\n  \"word.before\": \"Input\",\n  \"word.after\": \"Result\",\n  \"word.mesh\": \"Mesh\",\n  \"word.uv\": \"UV\",\n};\nexport function getLanguage() {\n  return LanguageDefinitions;\n}\nexport function translate(subject) {\n  return subject.replace(/[a-zA-Z_][a-zA-Z0-9_\\.]+/g, (key) => {\n    return getLanguage(LanguageDefinitions)[key] ?? key;\n  });\n}\nconst getURL = (e) =>\n  // `http://127.0.0.1:5500/${e}?t=${Math.random()}`;\n  `https://github.com/JannisX11/blockbench-plugins/blob/master/src/mesh_tools/${e}?raw=true`;\n\nexport function renderPill({ title, color = \"var(--color-accent)\" }) {\n  return `<span style=\"\n\tborder: max(1px, 0.0625rem) solid ${color};\n\tcolor: ${color};\n\tborder-radius: 2em;\n\tfont-size: .75rem;\n\tfont-weight: 500;\n\tpadding: 0 7px;\n\twhite-space: nowrap;\">${(title + \"\").toUpperCase()}</span>`;\n}\nexport function renderImage({ src, caption = \"\" }) {\n  return `\n  <figure>\n  <img style=\"image-rendering: auto;object-fit:contain;width: 250px; height: 250px;min-width: 100px\" src=\"${getURL(\n    `assets/actions/${src}`\n  )}\" />\n  <figcaption>${translate(caption)}</figcaption>\n  </figure>\n  `;\n}\nexport function renderOverflow(children) {\n  return `<content>${children}</content>`;\n}\nexport function renderInsetRow({ items }) {\n  return `<div style=\"display: flex;flex-wrap:wrap;\">\n\t\t${items\n      .map(\n        (e) =>\n          `<div style=\"border: 1px solid var(--color-dark);background: var(--color-back);\">${renderLine(\n            e\n          )}</div>`\n      )\n      .join(\"\\n\")}\n\t</div>\n\t`;\n}\nexport function renderLine(options) {\n  if (typeof options == \"string\") return options;\n\n  switch (options.type) {\n    case \"image\":\n      return renderImage(options);\n    case \"overflow\":\n      return renderOverflow(options);\n    case \"inset_row\":\n      return renderInsetRow(options);\n    default:\n      throw new Error(`Unknown line type: ${options.type}`);\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/facetype.js",
    "content": "import opentype from \"opentype.js\";\n// Credits to https://github.com/gero3/facetype.js/blob/gh-pages/javascripts/main.js\n// (Modified)\n\nexport function convertOpenTypeBufferToThreeJS(buffer) {\n  return convertOpenTypeToThreeJS(opentype.parse(buffer));\n}\nexport function convertOpenTypeToThreeJS(font) {\n  const scale = (1000 * 100) / ((font.unitsPerEm || 2048) * 72);\n  const result = {};\n  result.glyphs = {};\n\n  for (const key in font.glyphs.glyphs) {\n\tconst glyph = font.glyphs.glyphs[key];\n\n    const unicodes = [];\n    if (glyph.unicode !== undefined) {\n      unicodes.push(glyph.unicode);\n    }\n    for (const unicode of glyph.unicodes) {\n      if (unicodes.indexOf(unicode) == -1) {\n        unicodes.push(unicode);\n      }\n    }\n\n    for (const unicode of unicodes) {\n      var token = {};\n      token.ha = Math.round(glyph.advanceWidth * scale);\n\n      const { x1: xMin, y1: xMax } = glyph.getPath().getBoundingBox();\n      token.x_min = Math.round(xMin * scale);\n      token.x_max = Math.round(xMax * scale);\n      token.o = \"\";\n      glyph.path.commands.forEach(function (command, i) {\n        if (command.type.toLowerCase() === \"c\") {\n          command.type = \"b\";\n        }\n        token.o += command.type.toLowerCase();\n        token.o += \" \";\n        if (command.x !== undefined && command.y !== undefined) {\n          token.o += Math.round(command.x * scale);\n          token.o += \" \";\n          token.o += Math.round(command.y * scale);\n          token.o += \" \";\n        }\n        if (command.x1 !== undefined && command.y1 !== undefined) {\n          token.o += Math.round(command.x1 * scale);\n          token.o += \" \";\n          token.o += Math.round(command.y1 * scale);\n          token.o += \" \";\n        }\n        if (command.x2 !== undefined && command.y2 !== undefined) {\n          token.o += Math.round(command.x2 * scale);\n          token.o += \" \";\n          token.o += Math.round(command.y2 * scale);\n          token.o += \" \";\n        }\n      });\n      result.glyphs[String.fromCharCode(unicode)] = token;\n    }\n  }\n\n  result.familyName = font.familyName;\n  result.ascender = Math.round(font.ascender * scale);\n  result.descender = Math.round(font.descender * scale);\n  result.underlinePosition = Math.round(\n    font.tables.post.underlinePosition * scale\n  );\n  result.underlineThickness = Math.round(\n    font.tables.post.underlineThickness * scale\n  );\n  result.boundingBox = {\n    yMin: Math.round(font.tables.head.yMin * scale),\n    xMin: Math.round(font.tables.head.xMin * scale),\n    yMax: Math.round(font.tables.head.yMax * scale),\n    xMax: Math.round(font.tables.head.xMax * scale),\n  };\n  result.resolution = 1000;\n  result.original_font_information = font.tables.name;\n\n  if (font.styleName?.toLowerCase().indexOf(\"bold\") > -1) {\n    result.cssFontWeight = \"bold\";\n  } else {\n    result.cssFontWeight = \"normal\";\n  }\n\n  if (font.styleName?.toLowerCase().indexOf(\"italic\") > -1) {\n    result.cssFontStyle = \"italic\";\n  } else {\n    result.cssFontStyle = \"normal\";\n  }\n\n  return result;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/geometry.js",
    "content": "// https://en.wikipedia.org/wiki/Catmull–Clark_subdivision_surface\n// custom data, just for manging other data easily\nexport class CMFace {\n  /**\n   * @type Array<CMFace>\n   */\n  static all = [];\n  constructor(bbFace, key) {\n    this.key = key;\n    this.bbFace = bbFace;\n    this.facePoint = bbFace.getCenter();\n    this.uuid = guid();\n    this.facePointKey = bbFace.mesh.addVertices(this.facePoint)[0];\n    this.edgePoints = []; // should be called edges\n    this.vertices = []; // store sorted vertices before editing vertices positions and causing BB sorting problems\n    CMFace.all.push(this);\n  }\n  for(vertex) {\n    return this.bbFace.vertices.includes(vertex);\n  }\n}\nexport class CMEdge {\n  /**\n   * @type Array<CMEdge>\n   */\n  static all = [];\n  constructor(a, b, edgePoint, center) {\n    this.vertexA = a;\n    this.vertexB = b;\n    this.uuid = guid();\n    this.center = center;\n    this.edgePoint = edgePoint;\n    CMEdge.all.push(this);\n  }\n  equals(other) {\n    return (\n      (other.vertexA == this.vertexA && other.vertexB == this.vertexB) ||\n      (other.vertexA == this.vertexB && other.vertexB == this.vertexA)\n    );\n  }\n  equalsV(a, b) {\n    return (\n      (a == this.vertexA && b == this.vertexB) ||\n      (a == this.vertexB && b == this.vertexA)\n    );\n  }\n  equalsU(other) {\n    return this.uuid == other.uuid;\n  }\n  for(vertex) {\n    return this.vertexA == vertex || this.vertexB == vertex;\n  }\n}\n\nexport class MTEdge {\n  /**\n   * @type Array<MTEdge>\n   */\n  static all = [];\n  static reset() {\n    MTEdge.all = [];\n  }\n  constructor(a, b, data) {\n    this.vertexA = a;\n    this.vertexB = b;\n    this.faces = [];\n    this.indices = data.indices;\n    this.center = data ? data.center : null;\n    MTEdge.all.push(this);\n  }\n  equals(other) {\n    return (\n      (other.vertexA == this.vertexA && other.vertexB == this.vertexB) ||\n      (other.vertexA == this.vertexB && other.vertexB == this.vertexA)\n    );\n  }\n  equalsV(a, b) {\n    return (\n      (a == this.vertexA && b == this.vertexB) ||\n      (a == this.vertexB && b == this.vertexA)\n    );\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/info.js",
    "content": "import { storage } from \"../globals.js\";\n\nconst dontShowAgainInfoStorage = storage.in(\"dont_show_again_info_storage\");\nexport function dontShowAgainInfo(id, title, message) {\n  if (dontShowAgainInfoStorage.has(id)) {\n    return;\n  }\n\n  const messageBox = Blockbench.showMessageBox(\n    {\n      title,\n      message,\n      icon: \"info\",\n      checkboxes: {\n        dont_show_again: { value: false, text: \"dialog.dontshowagain\" },\n      },\n      buttons: [\"dialog.ok\"],\n    },\n    (_, { dont_show_again: dontShowAgain }) => {\n      if (dontShowAgain) {\n        dontShowAgainInfoStorage.set(id, true);\n      }\n    }\n  );\n}\nexport function dontShowAgainWarning(id, title, message) {\n  if (dontShowAgainInfoStorage.has(id)) {\n    return true;\n  }\n\n  return new Promise((resolve) => {\n    Blockbench.showMessageBox(\n      {\n        title,\n        message,\n        icon: \"warning\",\n        checkboxes: {\n          dont_show_again: { value: false, text: \"dialog.dontshowagain\" },\n        },\n        buttons: [\"dialog.ok\", \"dialog.cancel\"],\n      },\n      (button, { dont_show_again: dontShowAgain }) => {\n        if (dontShowAgain) {\n          dontShowAgainInfoStorage.set(id, true);\n        }\n\n        if (button === 0) {\n          resolve(true);\n        } else {\n          resolve(false);\n        }\n      }\n    );\n  });\n}\n\n/**\n *\n * @param {string} message\n * @param {?number} timeout\n * @returns {never}\n */\nexport function throwQuickMessage(message, timeout = 2000) {\n  Blockbench.showQuickMessage(message, timeout);\n  throw message;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/mesh/neighborhood.js",
    "content": "import { getEdgeKey } from \"../utils.js\";\n\nexport default class Neighborhood {\n  /**\n   *\n   * @param {Mesh} mesh\n   * @returns {{[vertexKey: string]: string[]}}\n   */\n  static VertexVertices(mesh) {\n    const map = {};\n\n    for (const key in mesh.faces) {\n      const face = mesh.faces[key];\n\n      face.vertices.forEach((vkey) => {\n        if (!(vkey in map)) {\n          map[vkey] = [];\n        }\n\n        face.vertices.forEach((neighborkey) => {\n          if (neighborkey == vkey) return;\n\n          map[vkey].safePush(neighborkey);\n        });\n      });\n    }\n\n    return map;\n  }\n\n  /**\n   *\n   * @param {Mesh} mesh\n   * @returns {{[vertexKey: string]: MeshFace[]}}\n   */\n  static VertexFaces(mesh) {\n    const neighborhood = {};\n\n    for (const key in mesh.faces) {\n      const face = mesh.faces[key];\n\n      for (const vertexKey of face.vertices) {\n        neighborhood[vertexKey] ??= [];\n        neighborhood[vertexKey].safePush(face);\n      }\n    }\n\n    return neighborhood;\n  }\n\n  /**\n   *\n   * @param {Mesh} mesh\n   * @returns {{[edgeKey: string]: MeshFace[]}}\n   */\n  static EdgeFaces(mesh) {\n    const neighborhood = {};\n    for (const key in mesh.faces) {\n      const face = mesh.faces[key];\n      const vertices = face.getSortedVertices();\n\n      for (let i = 0; i < vertices.length; i++) {\n        const vertexCurr = vertices[i];\n        const vertexNext = vertices[(i + 1) % vertices.length];\n        const edgeKey = getEdgeKey(vertexCurr, vertexNext);\n        neighborhood[edgeKey] ??= [];\n        neighborhood[edgeKey].safePush(face);\n      }\n    }\n    return neighborhood;\n  }\n\n  /**\n   *\n   * @param {Mesh} mesh\n   * @returns {{[vertexKey: string]: string[]}}\n   */\n  static VertexEdges(mesh) {\n    const neighborhood = {};\n    for (const key in mesh.faces) {\n      const face = mesh.faces[key];\n      const vertices = face.getSortedVertices();\n\n      for (let i = 0; i < vertices.length; i++) {\n        const vertexCurr = vertices[i];\n        const vertexNext = vertices[(i + 1) % vertices.length];\n        const edgeKey = getEdgeKey(vertexCurr, vertexNext);\n        neighborhood[vertexCurr] ??= [];\n        neighborhood[vertexNext] ??= [];\n        neighborhood[vertexCurr].safePush(edgeKey);\n        neighborhood[vertexNext].safePush(edgeKey);\n      }\n    }\n    return neighborhood;\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/perlin.js",
    "content": "export const perlin = {\n  reusableVec3: new THREE.Vector3(),\n  perlinVectorSeed: new THREE.Vector3(12.9898, 78.233, 190.124),\n\n  randomAt(x, y, z) {\n    const vec = this.reusableVec3.set(x, y, z);\n    return (Math.sin(this.perlinVectorSeed.dot(vec)) * 43758.5453) % 1;\n  },\n  interpolate(a0, a1, w) {\n    if (0 >= w) return a0;\n    if (1 <= w) return a1;\n    return (a1 - a0) * (3 - w * 2) * w * w + a0;\n  },\n  grad(ix, iy, iz) {\n    const rand = this.randomAt(ix, iy, iz) * Math.PI * 2;\n\n    const sin = Math.sin(rand);\n    const cos = Math.cos(rand);\n\n    const x = sin * cos;\n    const y = cos * cos;\n    const z = sin;\n\n    return { x, y, z };\n  },\n  dotgrad(ix, iy, iz, x, y, z) {\n    const gradient = this.grad(ix, iy, iz);\n\n    const dx = x - ix;\n    const dy = y - iy;\n    const dz = z - iz;\n\n    return dx * gradient.x + dy * gradient.y + dz * gradient.z;\n  },\n  get(x = 0, y = 0, z = 0) {\n    x = (x + 128) % 128;\n    y = (y + 128) % 128;\n    z = (z + 128) % 128;\n\n    const x0 = Math.floor(x);\n    const x1 = x0 + 1;\n    const y0 = Math.floor(y);\n    const y1 = y0 + 1;\n    const z0 = Math.floor(z);\n    const z1 = z0 + 1;\n\n    const sx = x % 1;\n    const sy = y % 1;\n    const sz = z % 1;\n\n    let n0, n1, n2, n3;\n\n    // North Side of the Cube\n    n0 = this.dotgrad(x0, y0, z0, x, y, z);\n    n1 = this.dotgrad(x1, y0, z0, x, y, z);\n    const i0 = this.interpolate(n0, n1, sx);\n\n    n0 = this.dotgrad(x0, y1, z0, x, y, z);\n    n1 = this.dotgrad(x1, y1, z0, x, y, z);\n    const i1 = this.interpolate(n0, n1, sx);\n    const valuen = this.interpolate(i0, i1, sy);\n\n    // West Side of the Cube\n    n2 = this.dotgrad(x0, y0, z1, x, y, z);\n    n3 = this.dotgrad(x1, y0, z1, x, y, z);\n    const i2 = this.interpolate(n2, n3, sx);\n\n    n2 = this.dotgrad(x0, y1, z1, x, y, z);\n    n3 = this.dotgrad(x1, y1, z1, x, y, z);\n    const i3 = this.interpolate(n2, n3, sx);\n    const valuew = this.interpolate(i2, i3, sy);\n\n    const value = this.interpolate(valuen, valuew, sz);\n    return value;\n  },\n};\n"
  },
  {
    "path": "src/mesh_tools/src/utils/storage.js",
    "content": "const KEYS_KEY = \"<keys>\";\nconst SUBS_KEY = \"<subs>\";\nclass BasicQualifiedStorage {\n  constructor(id) {\n    this.id = id;\n  }\n  #isQualified() {\n    return this.id.startsWith(\"@\");\n  }\n  qualifyKey(key) {\n    if (this.#isQualified()) {\n      return `${this.id}/${key}`;\n    }\n    return `@${this.id}/${key}`;\n  }\n  set(key, value) {\n    key = this.qualifyKey(key);\n\n    localStorage.setItem(key, JSON.stringify(value));\n  }\n  delete(key) {\n    key = this.qualifyKey(key);\n\n    localStorage.removeItem(key);\n  }\n  has(key) {\n    key = this.qualifyKey(key);\n\n    return localStorage.hasOwnProperty(key);\n  }\n  get(key) {\n    key = this.qualifyKey(key);\n\n    const rawValue = localStorage.getItem(key);\n    if (rawValue != null) {\n      return JSON.parse(rawValue);\n    }\n    return null;\n  }\n  update(key, callback, defaultValue) {\n    const value = this.get(key) ?? defaultValue;\n    const newValue = callback(value);\n    return this.set(key, newValue);\n  }\n}\n\nconst keysStorage = new BasicQualifiedStorage(KEYS_KEY);\nconst subStoragesStorage = new BasicQualifiedStorage(SUBS_KEY);\nexport class QualifiedStorage extends BasicQualifiedStorage {\n  \n  in(key) {\n    subStoragesStorage.update(this.id, (keys) => {\n      keys.safePush(key);\n      return keys;\n    }, []);\n    return new QualifiedStorage(this.qualifyKey(key));\n  }\n\n  constructor(id) {\n    console.assert(\n      id != KEYS_KEY,\n      `QualifiedStorage: id cannot be equal to ${JSON.stringify(KEYS_KEY)}`\n    );\n\n    super(id);\n  }\n  set(key, value) {\n    keysStorage.update(\n      this.id,\n      (keys) => {\n        keys.safePush(key);\n        return keys;\n      },\n      []\n    );\n\n    super.set(key, value);\n  }\n  delete(key) {\n    keysStorage.update(\n      this.id,\n      (keys) => {\n        const index = keys.indexOf(key);\n        if (index != -1) {\n          keys.splice(index, 1);\n        }\n\n        return keys;\n      },\n      []\n    );\n\n    super.delete(key);\n  }\n  getAllKeys() {\n    return keysStorage.get(this.id) ?? [];\n  }\n  clear() {\n    for (const key of this.getAllKeys()) {\n      super.delete(key);\n    }\n    const subKeys = subStoragesStorage.get(this.id) ?? [];\n    for (const subKey of subKeys) {\n      new QualifiedStorage(this.qualifyKey(subKey)).clear();\n    }\n    keysStorage.delete(this.id);\n    subStoragesStorage.delete(this.id);\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/terrain_gen.js",
    "content": "import { action } from \"../actions.js\";\n\nexport class TerrainGen {\n  static styles = {\n    Earth: [\n      { blend: 0.5, height: 0.2, color: new THREE.Color(0.13, 0.36, 0.89) },\n      {\n        blend: 0.2,\n        height: 0.375,\n        color: new THREE.Color(0.9, 0.86, 0.36),\n      },\n      {\n        blend: 0.3,\n        height: 0.5,\n        color: new THREE.Color(0.15, 0.87, 0.113),\n      },\n      { blend: 1, height: 1, color: new THREE.Color(0.113, 0.87, 0.137) },\n    ],\n    EarthMountains: [\n      { blend: 0.5, height: 0.2, color: new THREE.Color(0.13, 0.36, 0.89) },\n      {\n        blend: 0.2,\n        height: 0.375,\n        color: new THREE.Color(0.9, 0.86, 0.36),\n      },\n      {\n        blend: 0.3,\n        height: 0.5,\n        color: new THREE.Color(0.15, 0.87, 0.113),\n      },\n      { blend: 1, height: 0.6, color: new THREE.Color(0.113, 0.87, 0.137) },\n      { blend: 0.1, height: 1, color: new THREE.Color(0.39, 0.28, 0.12) },\n    ],\n    Grass: [\n      { blend: 1, height: 0.2, color: new THREE.Color(0.69, 1, 0.11) },\n      { blend: 1, height: 0.375, color: new THREE.Color(0.51, 1, 0.14) },\n      {\n        blend: 1,\n        height: 0.375,\n        color: new THREE.Color(0.17, 0.63, 0.054),\n      },\n    ],\n    Desert: [\n      { blend: 0, height: 0, color: new THREE.Color(0.54, 0.42, 0.17) },\n      { blend: 0.9, height: 1, color: new THREE.Color(0.79, 0.56, 0.25) },\n    ],\n    Ice: [\n      { blend: 0, height: 0, color: new THREE.Color(0.45, 0.68, 0.86) },\n      { blend: 1, height: 0.5, color: new THREE.Color(0.58, 0.77, 0.89) },\n      { blend: 1, height: 0.75, color: new THREE.Color(0.83, 0.94, 0.97) },\n      { blend: 1, height: 1, color: new THREE.Color(0.61, 0.84, 0.94) },\n    ],\n    Mask: [\n      { blend: 0, height: 0, color: new THREE.Color(0, 0, 0) },\n      { blend: 1, height: 1, color: new THREE.Color(1, 1, 1) },\n    ],\n  };\n  /**\n   * @type {Array<TerrainGen>}\n   */\n  static all = [];\n  static timeWhenDialogWasOpened = 0;\n  static genTexture(\n    width,\n    height,\n    noise,\n    style = this.styles.Earth,\n    asTexture = true\n  ) {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    const ctx = canvas.getContext(\"2d\");\n\n    for (let y = height - 1; y >= 0; y--) {\n      for (let x = width - 1; x >= 0; x--) {\n        const currentHeight = Math.clamp(noise[[x, y]], 0, style.last().height);\n        for (let i = 0; i < style.length; i++) {\n          if (currentHeight <= style[i].height) {\n            let s2 = style[Math.clamp(i - 1, 0, Infinity)];\n            let percent =\n              1 -\n              THREE.Math.inverseLerp(s2.height, style[i].height, currentHeight);\n            let color = style[i].color\n              .clone()\n              .lerp(s2.color, percent * style[i].blend);\n            ctx.fillStyle = `rgb(${color.r * 255},${color.g * 255},${\n              color.b * 255\n            })`;\n            ctx.fillRect(x, y, 1, 1);\n            break;\n          }\n        }\n      }\n    }\n    if (!asTexture) {\n      return canvas.toDataURL();\n    }\n    const _texture = new Texture({ saved: false }).fromDataURL(\n      canvas.toDataURL()\n    );\n    _texture.add();\n    return _texture;\n  }\n  constructor(data) {\n    this.name = data.name;\n    this.codeName = data.name.toLowerCase().replaceAll(\" \", \"_\");\n    this.settings = data.settings;\n    this.suggested = data.suggested || {};\n    /**\n     * @type {Function}\n     */\n    this.noise = data.noise;\n\n    TerrainGen.all.push(this);\n  }\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/threejs_interoperability.js",
    "content": "export function nonIndexed(geometry) {\n  const mesh = new Mesh({ vertices: {} });\n\n  const vertices = geometry.getAttribute(\"position\");\n  const vertexLength = vertices.count;\n\n  const newVertices = [];\n  const positions = {}; // remove duplicate vertices on the go\n  for (let i = 0; i < vertexLength; i++) {\n    let v = [vertices.getX(i), vertices.getY(i), vertices.getZ(i)];\n    if (positions[v]) {\n      newVertices.push(positions[v].key);\n    } else {\n      newVertices.push(mesh.addVertices(v)[0]);\n      positions[v] = { v, key: newVertices.last() };\n    }\n  }\n  for (let i = 0; i < vertexLength; i += 3) {\n    let face = new MeshFace(mesh, {\n      vertices: [newVertices[i + 0], newVertices[i + 1], newVertices[i + 2]],\n    });\n    mesh.addFaces(face);\n  }\n  return mesh;\n}\nexport function indexed(geometry, quadCompatible) {\n  const mesh = new Mesh({ vertices: {} });\n\n  const vertices = geometry.getAttribute(\"position\");\n  let indices = geometry.getIndex();\n  const vertexLength = vertices.count;\n  const faceLength = indices.count;\n  indices = indices.array;\n\n  const newVertices = [];\n  for (let i = 0; i < vertexLength; i++) {\n    const v = [vertices.getX(i), vertices.getY(i), vertices.getZ(i)];\n    newVertices.push(mesh.addVertices(v)[0]);\n  }\n  if (quadCompatible) {\n    for (let i = 0; i < faceLength; i += 6) {\n      const face = new MeshFace(mesh, {\n        vertices: [\n          newVertices[indices[i + 0]],\n          newVertices[indices[i + 1]],\n          newVertices[indices[i + 4]],\n          newVertices[indices[i + 2]],\n        ],\n      });\n      mesh.addFaces(face);\n    }\n  } else {\n    for (let i = 0; i < faceLength; i += 3) {\n      const face = new MeshFace(mesh, {\n        vertices: [\n          newVertices[indices[i + 0]],\n          newVertices[indices[i + 1]],\n          newVertices[indices[i + 2]],\n        ],\n      });\n      mesh.addFaces(face);\n    }\n  }\n  return mesh;\n}\n"
  },
  {
    "path": "src/mesh_tools/src/utils/utils.js",
    "content": "import { groupElementsCollided } from \"./array.js\";\nimport Neighborhood from \"./mesh/neighborhood.js\";\nimport { addVectors, getX, getY, getZ, isZeroVector } from \"./vector.js\";\n\nconst reusableEuler1 = new THREE.Euler();\nconst reusableQuat1 = new THREE.Quaternion();\nconst reusableVec1 = new THREE.Vector3();\nconst reusableVec2 = new THREE.Vector3();\nconst reusableVec3 = new THREE.Vector3();\nconst reusableVec4 = new THREE.Vector3();\nconst reusableVec5 = new THREE.Vector3();\nconst reusable2dVec1 = new THREE.Vector2();\nconst Normal2dX = new THREE.Vector2(1, 0);\n\nexport const gradient256 = {};\nfor (let x = 0; x < 256; x++) gradient256[[x, 0]] = x / 255;\n\n/**\n *\n * @param {THREE.Vector3} vector\n * @param {THREE.Euler} targetEuler\n * @returns {THREE.Euler}\n */\nconst reusableObject = new THREE.Object3D();\nreusableObject.rotation.order = \"XYZ\";\nexport function rotationFromDirection(\n  target,\n  targetEuler = new THREE.Euler(),\n  { rotateX = 0, rotateY = 0, rotateZ = 0 } = {}\n) {\n  reusableObject.lookAt(target);\n  reusableObject.rotateX(Math.degToRad(90));\n  reusableObject.rotateX(rotateX);\n  reusableObject.rotateY(rotateY);\n  reusableObject.rotateZ(rotateZ);\n\n  targetEuler.copy(reusableObject.rotation);\n  return targetEuler;\n}\n/**\n *\n * @param {import(\"./vector.js\").Vector3} A\n * @param {import(\"./vector.js\").Vector3} B\n * @param {import(\"./vector.js\").Vector3} C\n * @returns {THREE.Vector3}\n */\nexport function computeTriangleNormal(A, B, C) {\n  reusableVec1.set(getX(A), getY(A), getZ(A));\n  reusableVec2.set(getX(B), getY(B), getZ(B));\n  reusableVec3.set(getX(C), getY(C), getZ(C));\n  return reusableVec4\n    .crossVectors(\n      reusableVec2.sub(reusableVec1),\n      reusableVec3.sub(reusableVec1)\n    )\n    .clone();\n}\nexport function parseRGB(s) {\n  let string = \"\";\n  for (let i = 4; i < s.length - 1; i++) {\n    string += s[i];\n  }\n  string = string.split(\",\");\n  return new THREE.Color(string[0] / 255, string[1] / 255, string[2] / 255);\n}\n\nexport function sm(v) {\n  let a = 3;\n  let b = 2.7;\n  return Math.pow(v, a) / (Math.pow(v, a) + Math.pow(b - b * v, a));\n}\nexport function falloffMap(i, j, width, height, v) {\n  let x = (i / width) * 2 - 1;\n  let y = (j / height) * 2 - 1;\n  return sm(Math.max(Math.abs(x), Math.abs(y)));\n}\nexport function roundVector(vec) {\n  return vec.map((e) => Math.roundTo(e, 5));\n}\nexport function areVectorsCollinear(v1, v2) {\n  v1 = roundVector(v1);\n  v2 = roundVector(v2);\n\n  const cross = reusableVec1.fromArray(v1).cross(reusableVec2.fromArray(v2));\n  for (let i = 0; i < 3; i++) {\n    if (!Math.isBetween(cross[getAxisLetter(i)], -0.005, 0.005)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function easeInOutSine(x) {\n  return -(Math.cos(Math.PI * x) - 1) / 2;\n}\n\nexport function getAdjacentElements(arr, index) {\n  return [\n    arr[(index + 1 + arr.length) % arr.length],\n    arr[index],\n    arr[(index - 1 + arr.length) % arr.length],\n  ];\n}\n\n/**\n * Determines on which side of a line a point lies.\n *\n * @param {THREE.Vector2} p\n * @param {THREE.Vector2} p1\n * @param {THREE.Vector2} p2\n * @returns {-1 | 0 | 1} 1 if the point is on the left side, -1 if on the right side, and 0 if on the line.\n */\nfunction lineSide(p, p1, p2) {\n  return Math.sign((p.x - p2.x) * (p1.y - p2.y) - (p1.x - p2.x) * (p.y - p2.y));\n}\n\n/**\n *\n * @param {THREE.Vector2} point\n * @param {THREE.Vector2} point1\n * @param {THREE.Vector2} point2\n * @param {THREE.Vector2} point3\n * @returns {boolean}\n */\nexport function isPointInTriangle(point, point1, point2, point3) {\n  const d1 = lineSide(point, point1, point2);\n  const d2 = lineSide(point, point2, point3);\n  const d3 = lineSide(point, point3, point1);\n  const hasNegative = d1 < 0 || d2 < 0 || d3 < 0;\n  const hasPositive = d1 > 0 || d2 > 0 || d3 > 0;\n\n  return !(hasNegative && hasPositive);\n}\n/**\n * Note: If the polygon length is less than 3, true is returned.\n * @param {ArrayVector3[]} polygon\n * @returns {boolean}\n */\nexport function isPolygon3ClockWise(polygon) {\n  if (polygon.length <= 2) {\n    return true;\n  }\n  let sum = 0;\n  for (let i = 0; i < polygon.length; i++) {\n    const vertexA = polygon[i];\n    const vertexB = polygon[(i + 1) % polygon.length];\n    sum +=\n      (getX(vertexB) - getX(vertexA)) *\n      (getY(vertexB) - getY(vertexA)) *\n      (getZ(vertexB) - getZ(vertexA));\n  }\n  return sum >= 0;\n}\n/**\n * Note: If the polygon length is less than 3, true is returned.\n * @param {ArrayVector2[]} polygon\n * @returns {boolean}\n */\nexport function isPolygonClockWise(polygon) {\n  if (polygon.length <= 2) {\n    return true;\n  }\n  let sum = 0;\n  for (let i = 0; i < polygon.length; i++) {\n    const vertexA = polygon[i];\n    const vertexB = polygon[(i + 1) % polygon.length];\n    sum += (getX(vertexB) - getX(vertexA)) * (getY(vertexB) - getY(vertexA));\n  }\n  return sum >= 0;\n}\n\n/**\n * @param {THREE.Vector3[]} polygon\n * @return {THREE.Vector2[]}\n * @throws When `polygon.length` is less than 3\n */\nexport function projectIntoOwnPlane(polygon) {\n  if (polygon.length < 3) {\n    throw new Error(\n      \"projectIntoOwnPlane(): Polygon should have 3 or more vertices!\"\n    );\n  }\n  const plane = new THREE.Plane();\n  plane.setFromCoplanarPoints(polygon[0], polygon[1], polygon[2]);\n  return projectOnPlane(polygon, plane);\n}\n/**\n * @overload\n * @param {THREE.Vector3} point\n * @return {THREE.Vector2}\n */\n/**\n * @overload\n * @param {THREE.Vector3[]} polygon\n * @return {THREE.Vector2[]}\n */\n/**\n * @param {THREE.Vector3 | THREE.Vector3[]} polygon\n * @return {THREE.Vector2 | THREE.Vector2[]}\n */\nexport function projectOnPlane(polygonOrPoint, plane) {\n  const euler = rotationFromDirection(plane.normal, reusableEuler1);\n  const quat = reusableQuat1.setFromEuler(euler);\n  quat.invert();\n\n  if (polygonOrPoint instanceof Array) {\n    return polygonOrPoint.map((e) => {\n      reusableVec5.copy(e);\n      reusableVec5.applyQuaternion(quat);\n      return new THREE.Vector2(reusableVec5.x, reusableVec5.z);\n    });\n  }\n  reusableVec5.copy(polygonOrPoint);\n  reusableVec5.applyQuaternion(quat);\n  return new THREE.Vector2(reusableVec5.x, reusableVec5.z);\n}\n\n/**\n * Triangulates a polygon into a set of triangles.\n *\n * @param {ArrayVector3[]} polygon\n * @returns {Array<ArrayVector3>} An array of triangles.\n */\nexport function triangulate(polygon) {\n  const vertices3d = polygon.map((v) => v.V3_toThree());\n  const indices = Array.from(Array(vertices3d.length).keys());\n  const triangles = [];\n\n  const vertices = projectIntoOwnPlane(vertices3d);\n  const isClockWise = isPolygonClockWise(vertices);\n\n  const SAFETY_LIMIT = 100;\n  let safetyIndex = 0;\n  while (indices.length > 3 && safetyIndex <= SAFETY_LIMIT) {\n    for (let i = 0; i < indices.length; i++) {\n      const [a, b, c] = getAdjacentElements(indices, i);\n\n      const vecAC = vertices[c].clone().sub(vertices[a]);\n      const vecAB = vertices[b].clone().sub(vertices[a]);\n\n      const cross = vecAC.x * vecAB.z - vecAC.z * vecAB.x;\n      const isConcave = isClockWise ? cross <= 0 : cross >= 0;\n      if (isConcave) continue;\n\n      let someVertexLiesInsideEar = false;\n      for (let j = 0; j < vertices.length; j++) {\n        if (j === a || j === b || j === c) continue;\n\n        someVertexLiesInsideEar = isPointInTriangle(\n          vertices[j],\n          vertices[a],\n          vertices[b],\n          vertices[c]\n        );\n        if (someVertexLiesInsideEar) break;\n      }\n      if (!someVertexLiesInsideEar) {\n        triangles.push([a, b, c].sort((a, b) => b - a));\n        indices.splice(i, 1);\n        break;\n      }\n    }\n    safetyIndex++;\n  }\n  // Add the remaining triangle\n  triangles.push(indices.sort((a, b) => b - a));\n\n  return triangles;\n}\n/**\n * @template T\n * @param {[T, T, T]} triangleA\n * @param {[T, T, T]} triangleB\n * @returns {boolean}\n */\nfunction areTrianglesAdjacent(triangleA, triangleB) {\n  let sharedCount = 0;\n  for (const a of triangleA) {\n    sharedCount += triangleB.includes(a);\n    if (sharedCount == 2) break;\n  }\n  return sharedCount == 2;\n}\n/**\n * Quadrilates a polygon into a set of quadrilaterals.\n *\n * @param {ArrayVector3[]} polygon\n * @returns {Array<ArrayVector4 | ArrayVector3>} An array of quadrilate/triangles.\n */\nexport function quadrilate(polygon) {\n  const triangles = triangulate(polygon);\n  const processedTriangles = new Set();\n\n  const quadrilaterals = [];\n  for (const triangle of triangles) {\n    if (processedTriangles.has(triangle)) continue;\n    const adjacentTriangle = triangles.find(\n      (e) => areTrianglesAdjacent(triangle, e) && !processedTriangles.has(e)\n    );\n\n    if (!adjacentTriangle) continue;\n    const sharedVertices = adjacentTriangle.filter((e) => triangle.includes(e));\n    const uniqueVertex = adjacentTriangle.find(\n      (e) => !sharedVertices.includes(e)\n    );\n    if (!uniqueVertex) continue;\n    if (sharedVertices.length != 2) continue;\n\n    // TODO optimize\n    const triangleEdges = groupElementsCollided(triangle);\n    const index = triangleEdges.findIndex(\n      (e) => !e.some((f) => !sharedVertices.includes(f))\n    );\n    if (index == -1) continue;\n    processedTriangles.add(adjacentTriangle);\n    processedTriangles.add(triangle);\n\n    const quadrilateral = triangle; /* .slice() */\n    quadrilateral.splice(index, 0, uniqueVertex);\n\n    quadrilaterals.push(quadrilateral);\n  }\n  for (const triangle of triangles) {\n    if (!processedTriangles.has(triangle)) {\n      quadrilaterals.push(triangle);\n    }\n  }\n\n  return quadrilaterals;\n}\n\nexport function worldToScreen(p, camera, width, height) {\n  // https://stackoverflow.com/a/27448966/16079500\n  const vector = p.project(camera);\n\n  vector.x = ((vector.x + 1) / 2) * width;\n  vector.y = (-(vector.y - 1) / 2) * height;\n\n  return vector;\n}\n\nexport function getMinProjectTextureSize() {\n  return Math.min(Project._texture_width, Project._texture_height);\n}\n\nexport function v3Tov2(v3) {\n  return [v3[0], v3[1]];\n}\nexport function getFaceUVCenter(face) {\n  let uv = face.uv;\n  let center = [0, 0, 0];\n  let i = 0;\n  for (const key in uv) {\n    const currentPT = uv[key];\n    center.V3_add(currentPT);\n    i++;\n  }\n  center.V3_divide(i + 1e-5);\n  return v3Tov2(center);\n}\n\nexport function freezeProperty(object, key) {\n  Object.defineProperty(object, key, { configurable: false, writable: false });\n  return object;\n}\nexport function snakeToPascal(subject) {\n  return subject\n    .split(/[_\\s]+/g)\n    .map((word) => word[0].toUpperCase() + word.slice(1))\n    .join(\" \");\n}\n/**\n *\n * @param {ArrayVector3[]} points\n * @returns {boolean}\n */\nexport function isValidQuad(points) {\n  for (let i = 0; i < points.length; i++) {\n    for (let j = i + 1; j < points.length; j++) {\n      if (\n        points[i][0] === points[j][0] &&\n        points[i][1] === points[j][1] &&\n        points[i][2] === points[j][2]\n      ) {\n        return false;\n      }\n    }\n  }\n\n  let prevCurvature = undefined;\n  for (let i = 0; i < points.length; i++) {\n    const prev = points[(i - 1 + points.length) % points.length];\n    const current = points[i];\n    const next = points[(i + 1) % points.length];\n\n    const edge1 = prev.V3_toThree().sub(current.V3_toThree());\n    const edge2 = next.V3_toThree().sub(current.V3_toThree());\n\n    const cross = edge1.cross(edge2);\n    const curvature = cross.x - cross.y - cross.z > 0;\n    if (prevCurvature !== undefined && curvature !== prevCurvature) {\n      return false;\n    }\n    prevCurvature = curvature;\n  }\n  return true;\n}\n\n/**\n * @param {Mesh} mesh\n * @param {Set<string>} vertexSet\n */\nexport function getSelectedFacesAndEdgesByVertices(mesh, vertexSet) {\n  const selectedFaces = [];\n  const selectedEdges = [];\n  const foundEdges = new Set();\n\n  for (const faceKey in mesh.faces) {\n    const face = mesh.faces[faceKey];\n    if (face.vertices.length < 2) continue;\n\n    const areAllVerticesSelected = !face.vertices.some(\n      (e) => !vertexSet.has(e)\n    );\n    if (areAllVerticesSelected) {\n      selectedFaces.push(faceKey);\n    }\n\n    const sortedVertices = face.getSortedVertices();\n    for (let i = 0; i < sortedVertices.length; i++) {\n      const vertexA = sortedVertices[i];\n      const vertexB = sortedVertices[(i + 1) % sortedVertices.length];\n      if (vertexA == vertexB) continue;\n      const edgeKey = getEdgeKey(vertexA, vertexB);\n      if (foundEdges.has(edgeKey)) {\n        continue;\n      }\n      foundEdges.add(edgeKey);\n\n      if (vertexSet.has(vertexA) && vertexSet.has(vertexB)) {\n        selectedEdges.push([vertexA, vertexB]);\n      }\n    }\n  }\n  return { edges: selectedEdges, faces: selectedFaces };\n}\n\n/**\n * Note: The caller is responsible for calling `Canvas.updateView()`\n * @param {Mesh} mesh\n * @param {Set<string>} vertexSet\n */\nexport function selectFacesAndEdgesByVertices(mesh, vertexSet) {\n  if (!Project) {\n    throw new Error(\n      \"selectFacesAndEdgesByVertices(): An open project is required before calling!\"\n    );\n  }\n  const { edges, faces } = getSelectedFacesAndEdgesByVertices(mesh, vertexSet);\n  const vertices = Array.from(vertexSet);\n\n  mesh.getSelectedVertices().splice(0, Infinity, ...vertices);\n  switch (BarItems[\"selection_mode\"].value) {\n    case \"vertex\":\n      break;\n    case \"edge\":\n      mesh.getSelectedEdges().splice(0, Infinity, ...edges);\n      mesh.getSelectedFaces().splice(0, Infinity);\n      break;\n    case \"cluster\":\n    case \"face\":\n      mesh.getSelectedFaces().splice(0, Infinity, ...faces);\n      mesh.getSelectedEdges().splice(0, Infinity);\n      break;\n  }\n}\n\n/**\n *\n * @param {string} vertex\n * @returns\n */\nfunction gatherConnectedVertices(\n  vertex,\n  { neighborhoodCondition, processedVertices, neighborhood, mesh } = {}\n) {\n  if (!neighborhood && !mesh) {\n    throw new Error(\n      `gatherConnectedVertices(): Must call with either a neighborhood map or a mesh.`\n    );\n  }\n  if (!neighborhood) {\n    neighborhood = Neighborhood.VertexVertices(mesh);\n  }\n\n  const connected = new Set([vertex]);\n  if (!neighborhood[vertex]) {\n    return connected;\n  }\n\n  for (const currentConnected of connected) {\n    processedVertices && processedVertices.add(currentConnected);\n    for (const neighbor of neighborhood[currentConnected]) {\n      if (connected.has(neighbor)) {\n        continue;\n      }\n      if (!neighborhoodCondition || neighborhoodCondition(neighbor)) {\n        connected.add(neighbor);\n      }\n    }\n  }\n  return connected;\n}\nexport function sortVerticesByAngle(mesh, vertexKeys) {\n  const vertices = vertexKeys.map((e) => mesh.vertices[e].V3_toThree());\n  const vertices2d = projectIntoOwnPlane(vertices);\n\n  const centroid = new THREE.Vector2();\n  for (const vertex of vertices2d) {\n    centroid.add(vertex);\n  }\n  centroid.divideScalar(vertices2d.length);\n\n  const sorted = vertices2d\n    .map((e, i) => {\n      const dir = reusable2dVec1.subVectors(e, centroid);\n\n      let angle = dir.angle();\n      if (angle < 0) {\n        angle += 2 * Math.PI;\n      }\n\n      return [angle, vertexKeys[i]];\n    })\n    .sort(([a], [b]) => a - b)\n    .map(([, e]) => e);\n  return sorted;\n}\nexport function getEdgeKey(a, b) {\n  if (b < a) {\n    const tmp = a;\n    a = b;\n    b = tmp;\n  }\n  return `${a}_${b}`;\n}\nexport function sortEdgeVertices(arr) {\n  return arr.sort();\n}\nexport function isEdgeKeySelected(mesh, edge) {\n  const edges = mesh.getSelectedEdges();\n  // TODO optimize\n  return edges.map(([a, b]) => getEdgeKey(a, b)).includes(edge);\n}\n/**\n *\n * @param {string} edgeKey\n * @returns {[string, string]}\n */\nexport function extractEdgeKey(edgeKey) {\n  return edgeKey.split(\"_\");\n}\nexport function getSelectedEdgesConnectedCountMap(mesh) {\n  const { edges } = getSelectedFacesAndEdgesByVertices(\n    mesh,\n    new Set(mesh.getSelectedVertices())\n  );\n  const selectedConnectedCount = {};\n  const connectedCount = {};\n\n  const neighborhood = Neighborhood.EdgeFaces(mesh);\n\n  for (const [a, b] of edges) {\n    const edgeKey = getEdgeKey(a, b);\n    selectedConnectedCount[edgeKey] ??= 0;\n    connectedCount[edgeKey] ??= 0;\n    if (!(edgeKey in neighborhood)) {\n      continue;\n    }\n    connectedCount[edgeKey] = neighborhood[edgeKey].length;\n    for (const connectedFace of neighborhood[edgeKey]) {\n      if (connectedFace.isSelected()) {\n        selectedConnectedCount[edgeKey] += 1;\n      }\n    }\n  }\n  return { connectedCount, selectedConnectedCount };\n}\n\n/**\n * @param {Mesh} mesh\n */\nexport function groupLoopsIncluding(mesh, verticesSet) {\n  const groups = groupConnectedVerticesIncluding(mesh, verticesSet);\n\n  const loops = [];\n  for (const group of groups) {\n    const groupArr = Array.from(group);\n    if (groupArr.length < 3) {\n      continue;\n    }\n\n    const sortedGroup = sortVerticesByAngle(mesh, groupArr);\n\n    loops.push(sortedGroup);\n  }\n\n  return loops;\n}\nexport function groupConnectedVerticesIncluding(mesh, verticesSet) {\n  const neighborhood = Neighborhood.VertexVertices(mesh);\n  const processedVertices = new Set();\n  const groups = [];\n\n  for (const vertex of verticesSet) {\n    if (!processedVertices.has(vertex)) {\n      groups.push(\n        gatherConnectedVertices(vertex, {\n          neighborhood,\n          processedVertices,\n          neighborhoodCondition: (neighbor) => verticesSet.has(neighbor),\n        })\n      );\n    }\n  }\n  return groups;\n}\n\nexport function createTextMesh(text, options = {}) {\n  const defaults = {\n    fontSize: 50,\n    fontFamily: \"Arial\",\n    fillStyle: \"red\",\n    textAlign: \"center\",\n  };\n  const mergedOptions = Object.assign({}, defaults, options);\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\");\n\n  const font = `${mergedOptions.fontSize}px ${mergedOptions.fontFamily}`;\n  const fontSize = mergedOptions.fontSize;\n  context.font = font;\n  canvas.width = context.measureText(text).width + fontSize * 0.2;\n  canvas.height = fontSize * 1.5;\n\n  context.font = font;\n  context.fillStyle = mergedOptions.fillStyle;\n  context.textAlign = mergedOptions.textAlign;\n  context.fillText(text, canvas.width / 2, canvas.height / 2 + fontSize / 3);\n\n  const texture = new THREE.Texture(canvas);\n  texture.needsUpdate = true;\n\n  const material = new THREE.SpriteMaterial({ map: texture });\n  const sprite = new THREE.Sprite(material);\n  sprite.scale.set(canvas.width / 100, canvas.height / 100, 1);\n\n  return sprite;\n}\n/**\n *\n * @param {Mesh} mesh\n * @param {string} vertexKey\n * @returns {MeshFace[]}\n */\nexport function getVertexConnectedFaces(mesh, vertexKey) {\n  const faces = [];\n  for (const faceKey in mesh.faces) {\n    const face = mesh.faces[faceKey];\n    if (face.vertices.includes(vertexKey)) {\n      faces.push(face);\n    }\n  }\n  return faces;\n}\n/**\n *\n * @param {Mesh} mesh\n * @param {string} vertexKey\n */\nexport function vertexNormal(mesh, vertexKey) {\n  const faces = getVertexConnectedFaces(mesh, vertexKey);\n  if (faces.length == 0) return null;\n\n  const avgNormal = new THREE.Vector3();\n  for (const face of faces) {\n    const normal = face.getNormal(true);\n    avgNormal.x += normal[0];\n    avgNormal.y += normal[1];\n    avgNormal.z += normal[2];\n  }\n  avgNormal.divideScalar(faces.length);\n  return avgNormal;\n}\n\nexport function computeCentroid(polygon) {\n  const centroid = new THREE.Vector3();\n  for (const vertex of polygon) {\n    addVectors(centroid, vertex);\n  }\n  centroid.divideScalar(polygon.length);\n  return centroid;\n}\n\n\n/**\n *\n * @param {THREE.Vector3} rClose\n * @param {THREE.Vector3} p\n * @param {THREE.Vector3} rayOrigin\n * @param {THREE.Vector3} rayDir\n * @returns\n */\nexport function closestToRay(rClose, p, rayOrigin, rayDir) {\n  if (isZeroVector(rayDir)) {\n    rClose.copy(rayOrigin);\n    return 0.0;\n  }\n\n  const h = new THREE.Vector3();\n  h.subVectors(p, rayOrigin);\n\n  const lambda = h.dot(rayDir) / rayDir.dot(rayDir);\n\n  rClose.copy(rayOrigin).addScaledVector(rayDir, lambda);\n\n  return lambda;\n}\n/**\n * Returns a point on ({@linkcode l1}{@linkcode l2}) closest point to {@linkcode p}.\n * @param {*} rClose\n * @param {*} p\n * @param {*} l1\n * @param {*} l2\n * @returns\n */\nexport function closestToLine(rClose, p, l1, l2) {\n  const ray = new THREE.Vector3();\n  ray.subVectors(l2, l1);\n\n  return closestToRay(rClose, p, l1, ray);\n}\n\nexport function CubicBezier(t, p0, p1, p2, p3) {\n  t = Math.clamp(t, 0, 1);\n\n  return (\n    (1 - t) ** 3 * p0 +\n    3 * (1 - t) ** 2 * t * p1 +\n    3 * (1 - t) * t ** 2 * p2 +\n    t ** 3 * p3\n  );\n}\nexport function CubicBezierTangent(t, p0, p1, p2, p3) {\n  t = Math.clamp(t, 0, 1);\n\n  return (\n    3 * (1 - t) ** 2 * (p1 - p0) +\n    6 * (1 - t) * t * (p2 - p1) +\n    3 * t ** 2 * (p3 - p2)\n  );\n}"
  },
  {
    "path": "src/mesh_tools/src/utils/vector.js",
    "content": "function xKey(obj) {\n  if (obj instanceof THREE.Vector3 || obj instanceof THREE.Vector2) {\n    return \"x\";\n  }\n  if (obj instanceof Array) {\n    return 0;\n  }\n  return null;\n}\nfunction yKey(obj) {\n  if (obj instanceof THREE.Vector3 || obj instanceof THREE.Vector2) {\n    return \"y\";\n  }\n  if (obj instanceof Array) {\n    return 1;\n  }\n  return null;\n}\nfunction zKey(obj) {\n  if (obj instanceof THREE.Vector3) {\n    return \"z\";\n  }\n  if (obj instanceof Array) {\n    return 2;\n  }\n  return null;\n}\n\nexport function getX(obj) {\n  return obj[xKey(obj)];\n}\nexport function getY(obj) {\n  return obj[yKey(obj)];\n}\nexport function getZ(obj) {\n  return obj[zKey(obj)] ?? 0;\n}\n/**\n * @typedef {THREE.Vector3 | ArrayVector3} Vector3\n *\n * @template T\n * @param {T} a\n * @param {Vector3} b\n * @returns {T}\n */\nexport function addVectors(target, source) {\n  target[xKey(target)] += source[xKey(source)];\n  target[yKey(target)] += source[yKey(source)];\n  target[zKey(target)] += source[zKey(source)];\n  return target;\n}\n/**\n * @template T\n * @param {T} a\n * @param {Vector3} b\n * @returns {T}\n */\nexport function subtractVectors(target, source) {\n  target[xKey(target)] -= source[xKey(source)];\n  target[yKey(target)] -= source[yKey(source)];\n  target[zKey(target)] -= source[zKey(source)];\n  return target;\n}\n/**\n * @template T\n * @param {Vector3} a\n * @param {Vector3} b\n * @param {T} three\n * @returns {T extends true ? THREE.Vector3: ArrayVector3}\n */\nexport function addedVectors(a, b, three = true) {\n  const x = a[xKey(a)] + b[xKey(b)];\n  const y = a[yKey(a)] + b[yKey(b)];\n  const z = a[zKey(a)] + b[zKey(b)];\n  if (three) {\n    return new THREE.Vector3(x, y, z);\n  }\n  return [x, y, z];\n}\n/**\n * @param {Vector3} a\n * @param {Vector3} b\n */\nexport function distanceBetween(a, b) {\n  return Math.hypot(getX(a) - getX(b), getY(a) - getY(b), getZ(a) - getZ(b));\n}\n/**\n * @param {Vector3} a\n * @param {Vector3} b\n */\nexport function distanceBetweenSq(a, b) {\n  return (\n    (getX(a) - getX(b)) ** 2 +\n    (getY(a) - getY(b)) ** 2 +\n    (getZ(a) - getZ(b)) ** 2\n  );\n}\n/**\n * @param {Vector3} vector\n */\nexport function isZeroVector(vector) {\n  return getX(vector) === 0 && getY(vector) === 0 && getZ(vector) === 0;\n}\n"
  },
  {
    "path": "src/pbr_preview/.prettierignore",
    "content": "node_modules/\ndist/\npackage-lock.json"
  },
  {
    "path": "src/pbr_preview/.prettierrc",
    "content": "{\n  \"semi\": true,\n  \"trailingComma\": \"es5\",\n  \"singleQuote\": false,\n  \"printWidth\": 80,\n  \"tabWidth\": 2,\n  \"vueIndentScriptAndStyle\": true,\n  \"bracketSameLine\": false,\n  \"arrowParens\": \"always\",\n  \"endOfLine\": \"lf\",\n  \"quoteProps\": \"as-needed\"\n}"
  },
  {
    "path": "src/pbr_preview/changelog.mjs",
    "content": "import readline from \"node:readline/promises\";\nimport { writeFile, readFile } from \"node:fs/promises\";\n\nconst rl = readline.createInterface({\n  input: process.stdin,\n  output: process.stdout,\n});\n\nconst changelog = \"./plugins/pbr_preview/changelog.json\";\n\nfunction createChangelog(version, changes, author, title = null, date = null) {\n  const changelog = {\n    [version.toString()]: {\n      title: title ?? `Version ${version}`,\n      date: date || new Date().toISOString().split(\"T\")[0],\n      author,\n      categories: [],\n    },\n  };\n\n  for (const change of changes) {\n    changelog[version].categories.push({\n      title: \"\",\n      list: [],\n      ...change,\n    });\n  }\n\n  return changelog;\n}\n\nasync function amendChangelog(\n  version,\n  changes,\n  author,\n  title = null,\n  date = null,\n) {\n  const data = JSON.parse(await readFile(changelog, \"utf-8\"));\n  const newChangelog = createChangelog(version, changes, author, title, date);\n  const mergedChangelog = { ...data, ...newChangelog };\n\n  await writeFile(changelog, JSON.stringify(mergedChangelog, null, 4));\n}\n\nasync function main() {\n  const version = await rl.question(\"Enter the version number: \");\n  const author = await rl.question(\"Enter the author: \");\n  const title = await rl.question(\n    \"Enter the title (leave blank for default): \",\n  );\n\n  const changes = [];\n  let makingChanges = true;\n  let writingDescriptions = false;\n\n  while (makingChanges) {\n    const change = await rl.question(\n      \"Enter a change title (leave blank to exit): \",\n    );\n\n    makingChanges = change.length > 0;\n\n    if (!makingChanges) {\n      break;\n    }\n\n    const descriptions = [];\n    writingDescriptions = true;\n\n    while (writingDescriptions) {\n      const description = await rl.question(\n        \"Enter a description (leave blank to finish): \",\n      );\n\n      writingDescriptions = description.length > 0;\n\n      if (!writingDescriptions) {\n        break;\n      }\n\n      descriptions.push(description);\n    }\n\n    changes.push({\n      title: change,\n      list: descriptions,\n    });\n  }\n\n  await amendChangelog(\n    version,\n    changes,\n    author,\n    title ?? `Version ${version}`,\n    new Date().toISOString().split(\"T\")[0],\n  );\n}\n\nmain()\n  .then(() => {\n    console.log(\"Changelog updated!\");\n    process.exit(0);\n  })\n  .catch((err) => {\n    console.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "src/pbr_preview/package.json",
    "content": "{\n  \"name\": \"blockbench-pbr\",\n  \"version\": \"1.0.0\",\n  \"description\": \"PBR support for Blockbench\",\n  \"main\": \"./src/index.ts\",\n  \"scripts\": {\n    \"build\": \"esbuild src/index.ts --bundle --minify --outfile=../../plugins/pbr_preview/pbr_preview.js\",\n    \"build:watch\": \"esbuild src/index.ts --bundle --minify --outfile=../../plugins/pbr_preview/pbr_preview.js --watch\",\n    \"dev\": \"esbuild src/index.ts --bundle --sourcemap --outfile=../../plugins/pbr_preview/pbr_preview.js --watch\"\n  },\n  \"keywords\": [\n    \"blockbench\"\n  ],\n  \"author\": \"Jason Gardner\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@types/three\": \"^0.157.0\",\n    \"blockbench-types\": \"4.9.0\",\n    \"esbuild\": \"0.19.4\",\n    \"prettier\": \"^3.2.5\",\n    \"typescript\": \"^5.2.2\"\n  }\n}"
  },
  {
    "path": "src/pbr_preview/src/constants.ts",
    "content": "import type { IChannel, IRegistry } from \"./types\";\nimport { three as THREE } from \"./deps\";\n\nexport const PLUGIN_VERSION = \"1.2.2\";\nexport const BBMAT_VERSION = \"1.0.0\";\nexport const NA_CHANNEL = \"_NONE_\";\nexport const CHANNELS: Record<IChannel[\"id\"], IChannel> = {\n  albedo: {\n    id: \"albedo\",\n    label: \"Albedo\",\n    description: \"The color of the material\",\n    map: \"map\",\n    icon: \"tonality\",\n    default: new THREE.Color(0xffffff),\n    regex: new RegExp(\"(s|_)*(basecolor|color|albedo)\", \"i\"),\n  },\n  metalness: {\n    id: \"metalness\",\n    label: \"Metalness\",\n    description: \"The material's metalness map\",\n    map: \"metalnessMap\",\n    icon: \"brightness_6\",\n    default: new THREE.Color(0),\n    regex: new RegExp(\"[ _]*metal(lic|ness)?\", \"i\"),\n  },\n  emissive: {\n    id: \"emissive\",\n    label: \"Emissive\",\n    description: \"The material's emissive map\",\n    map: \"emissiveMap\",\n    icon: \"wb_twilight\",\n    default: new THREE.Color(0),\n    regex: new RegExp(\"[ _]*(emissive|emission)\", \"i\"),\n  },\n  roughness: {\n    id: \"roughness\",\n    label: \"Roughness\",\n    description: \"The material's roughness map\",\n    map: \"roughnessMap\",\n    icon: \"grain\",\n    default: new THREE.Color(0xffffff),\n    regex: new RegExp(\"[ _]*rough(ness)?\", \"i\"),\n  },\n  height: {\n    id: \"height\",\n    label: \"Height\",\n    description: \"The material's height map\",\n    map: \"bumpMap\",\n    icon: \"landscape\",\n    default: new THREE.Color(0xffffff),\n    regex: new RegExp(\"[ _]*(height|bump)\", \"i\"),\n  },\n  normal: {\n    id: \"normal\",\n    label: \"Normal\",\n    description: \"The material's normal map\",\n    map: \"normalMap\",\n    icon: \"looks\",\n    default: new THREE.Color(\"rgb(128, 128, 255)\"),\n    regex: new RegExp(\"[ _]*normal\", \"i\"),\n  },\n  ao: {\n    id: \"ao\",\n    label: \"Ambient Occlusion\",\n    description: \"The material's ambient occlusion map\",\n    map: \"aoMap\",\n    icon: \"motion_mode\",\n    default: new THREE.Color(0xffffff),\n    regex: new RegExp(\"[ _]*(ao|ambientocclusion|ambient occlusion)\", \"i\"),\n  },\n};\n\n/**\n * Collection of registered Blockbench UI elements\n * Used for component communication as well as to simplify cleanup\n */\nexport const registry: Partial<IRegistry> = {};\n\nexport const setups: Array<() => void> = [];\nexport const teardowns: Array<() => void> = [];\n"
  },
  {
    "path": "src/pbr_preview/src/deps.ts",
    "content": "// @ts-expect-error THREE UMD is OK\nconst three = THREE;\n// @ts-expect-error Vue UMD is OK\nconst vue = Vue;\n// const bb = Blockbench;\n\n// @ts-expect-error JSZip is on window\nconst jszip = window.JSZip;\n\nexport { three, vue, jszip };\n"
  },
  {
    "path": "src/pbr_preview/src/index.ts",
    "content": "/**\n * @author jasonjgardner\n * @discord jason.gardner\n * @github https://github.com/jasonjgardner\n */\n/// <reference types=\"three\" />\n/// <reference path=\"../../../types/index.d.ts\" />\n/// <reference path=\"./types.d.ts\" />\n\nimport {\n  registry,\n  setups,\n  teardowns,\n  PLUGIN_VERSION as version,\n} from \"./constants\";\nimport \"./lib/properties\";\nimport \"./lib/actions\";\nimport \"./lib/tools\";\nimport \"./lib/panels\";\nimport { disablePbr } from \"./lib/disablePbr\";\n\n(() => {\n  const onload = () => {\n    setups.forEach((setup) => setup());\n  };\n\n  const onunload = () => {\n    disablePbr();\n    teardowns.forEach((teardown) => teardown());\n    Object.entries(registry).forEach(([key, value]) => {\n      try {\n        value?.delete();\n      } catch (err) {\n        console.warn(`Failed to delete ${key} action:`, err);\n      }\n    });\n  };\n\n  BBPlugin.register(\"pbr_preview\", {\n    // @ts-expect-error Version does exist in PluginOptions\n    version,\n    title: \"PBR Tools\",\n    author: \"Jason J. Gardner\",\n    description:\n      \"Create and view PBR materials in Blockbench. Export USDZ scenes and textures for Java or RenderDragon shaders.\",\n    tags: [\"Minecraft: Java Edition\", \"Minecraft: Bedrock Edition\", \"PBR\"],\n    icon: \"icon.png\",\n    variant: \"both\",\n    await_loading: true,\n    repository: \"https://github.com/jasonjgardner/blockbench-plugins\",\n    has_changelog: true,\n    min_version: \"4.10.3\",\n    max_version: \"4.11.9\",\n    onload,\n    onunload,\n  });\n})();\n"
  },
  {
    "path": "src/pbr_preview/src/lib/Lightr.ts",
    "content": "import type { ILightrParams } from \"../types\";\n/**\n * Adapted from Lightr by phosphoer\n * @see https://github.com/phosphoer/lightr\n */\nexport class Lightr {\n  lightHeight: number;\n  ambientLight: [number, number, number];\n  minLightIntensity: number;\n  lightDiffuse: [number, number, number];\n\n  constructor({\n    lightHeight = 0.66,\n    ambientLight = [0.1, 0.1, 0.1],\n    minLightIntensity = 0.0,\n    lightDiffuse = [1, 1, 1],\n  }: ILightrParams = {}) {\n    this.lightHeight = lightHeight;\n    this.ambientLight = ambientLight;\n    this.minLightIntensity = minLightIntensity;\n    this.lightDiffuse = lightDiffuse;\n  }\n\n  bake(\n    numDirs: number,\n    diffuseMap: HTMLImageElement | HTMLCanvasElement,\n    normalMap: HTMLImageElement | HTMLCanvasElement,\n  ): HTMLCanvasElement[] {\n    const canvasDiffuse =\n      diffuseMap instanceof HTMLCanvasElement\n        ? diffuseMap\n        : this.createCanvas(diffuseMap.width, diffuseMap.height);\n    const canvasNormals =\n      normalMap instanceof HTMLCanvasElement\n        ? normalMap\n        : this.createCanvas(normalMap.width, normalMap.height);\n\n    const contextDiffuse = canvasDiffuse.getContext(\"2d\")!;\n    const contextNormals = canvasNormals.getContext(\"2d\")!;\n\n    contextDiffuse.drawImage(diffuseMap, 0, 0);\n    contextNormals.drawImage(normalMap, 0, 0);\n\n    const bufferDiffuse = contextDiffuse.getImageData(\n      0,\n      0,\n      diffuseMap.width,\n      diffuseMap.height,\n    );\n    const bufferNormals = contextNormals.getImageData(\n      0,\n      0,\n      normalMap.width,\n      normalMap.height,\n    );\n\n    const bakedImages: HTMLCanvasElement[] = [];\n    const normals: [number, number, number][][] = [];\n\n    for (let x = 0; x < bufferNormals.width; ++x) {\n      normals[x] = [];\n      for (let y = 0; y < bufferNormals.height; ++y) {\n        const idx = (x + y * bufferNormals.width) * 4;\n\n        const normal = [\n          (bufferNormals.data[idx + 0] / 255 - 0.5) * 2,\n          (bufferNormals.data[idx + 1] / 255 - 0.5) * 2,\n          (bufferNormals.data[idx + 2] / 255 - 0.5) * 2,\n        ];\n\n        const len = Math.sqrt(normal[0] ** 2 + normal[1] ** 2 + normal[2] ** 2);\n        normals[x][y] = [normal[0] / len, normal[1] / len, normal[2] / len];\n      }\n    }\n\n    const bakeDirection = (dir: number): HTMLCanvasElement => {\n      const canvas = this.createCanvas(diffuseMap.width, diffuseMap.height);\n      const context = canvas.getContext(\"2d\")!;\n      const buffer = context.getImageData(0, 0, canvas.width, canvas.height);\n\n      const lightDir = [Math.cos(dir), Math.sin(dir), this.lightHeight];\n\n      for (let x = 0; x < bufferNormals.width; ++x) {\n        for (let y = 0; y < bufferNormals.height; ++y) {\n          const normal = normals[x][y];\n          const index = (x + y * bufferNormals.width) * 4;\n          const diffuse = [\n            bufferDiffuse.data[index + 0] / 255,\n            bufferDiffuse.data[index + 1] / 255,\n            bufferDiffuse.data[index + 2] / 255,\n            bufferDiffuse.data[index + 3],\n          ];\n\n          let intensity =\n            normal[0] * lightDir[0] +\n            normal[1] * lightDir[1] +\n            normal[2] * lightDir[2];\n          intensity = Math.min(1, Math.max(this.minLightIntensity, intensity));\n\n          const out = [\n            intensity * diffuse[0] * this.lightDiffuse[0] +\n              this.ambientLight[0],\n            intensity * diffuse[1] * this.lightDiffuse[1] +\n              this.ambientLight[1],\n            intensity * diffuse[2] * this.lightDiffuse[2] +\n              this.ambientLight[2],\n            diffuse[3],\n          ];\n\n          buffer.data[index + 0] = Math.floor(out[0] * 255);\n          buffer.data[index + 1] = Math.floor(out[1] * 255);\n          buffer.data[index + 2] = Math.floor(out[2] * 255);\n          buffer.data[index + 3] = out[3];\n        }\n      }\n\n      context.putImageData(buffer, 0, 0);\n      return canvas;\n    };\n\n    for (let i = 0; i < numDirs; ++i) {\n      const lightDir = ((Math.PI * 2) / numDirs) * i;\n      bakedImages.push(bakeDirection(lightDir));\n    }\n\n    return bakedImages;\n  }\n\n  private createCanvas(width: number, height: number): HTMLCanvasElement {\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    return canvas;\n  }\n}\n"
  },
  {
    "path": "src/pbr_preview/src/lib/MaterialBrush.ts",
    "content": "import type { IChannel } from \"../types\";\nimport { CHANNELS, registry } from \"../constants\";\nimport { three as THREE } from \"../deps\";\n\n/**\n * ### Material Brush\n * Class for painting across multiple TextureLayers in a Texture\n * Used to iterate over PBR channels and apply a brush value to each layer\n * at the same UV coordinates\n */\nexport class MaterialBrush {\n  private _colors: Record<IChannel[\"id\"], THREE.Color>;\n\n  constructor({ colors }: { colors?: Record<IChannel[\"id\"], THREE.Color> }) {\n    this._colors = {\n      ...Object.fromEntries(\n        Object.keys(CHANNELS).map((key) => [\n          key,\n          CHANNELS[key].default ?? new THREE.Color(0xffffff00),\n        ])\n      ),\n      ...colors,\n    };\n  }\n\n  get colors() {\n    return this._colors;\n  }\n\n  set colors(colors: Record<IChannel[\"id\"], THREE.Color>) {\n    this._colors = { ...this._colors, ...colors };\n  }\n\n  toString() {\n    const colors = Object.entries(this._colors).map(([key, color]) => [\n      key,\n      color.getHexString(),\n    ]);\n    return JSON.stringify(colors);\n  }\n\n  getChannel(channel: IChannel[\"id\"]) {\n    return this._colors[channel];\n  }\n\n  static makeLinearColor(value: number) {\n    const clamped = Math.min(1, Math.max(0, value));\n    return new THREE.Color(clamped, clamped, clamped).convertSRGBToLinear();\n  }\n\n  static fromSettings() {\n    const defaultEmissive = \"#000000\";\n    const metalnessValue = Number(registry.brushMetalnessSlider?.get());\n    const roughnessValue = Number(registry.brushRoughnessSlider?.get() ?? 1);\n    const emissiveValue = (\n      registry.brushEmissiveColor?.get() ?? defaultEmissive\n    ).toString();\n    const heightValue = Number(registry.brushHeightSlider?.get());\n    // @ts-expect-error ColorPanel global is not typed\n    const currentColor = ColorPanel.get();\n\n    const colors = {\n      [CHANNELS.albedo.id]: new THREE.Color(currentColor),\n      [CHANNELS.metalness.id]: MaterialBrush.makeLinearColor(metalnessValue),\n      [CHANNELS.roughness.id]: MaterialBrush.makeLinearColor(roughnessValue),\n      [CHANNELS.emissive.id]: new THREE.Color(emissiveValue ?? defaultEmissive),\n      [CHANNELS.height.id]: MaterialBrush.makeLinearColor(heightValue),\n      // TODO: Add normal map color input\n      // [CHANNELS.normal.id]:\n      //   CHANNELS.normal.default ?? new THREE.Color(\"#8080ff\"),\n    };\n\n    return new MaterialBrush({ colors });\n  }\n}\n"
  },
  {
    "path": "src/pbr_preview/src/lib/PbrMaterials.ts",
    "content": "import type { IChannel } from \"../types\";\nimport { CHANNELS, NA_CHANNEL } from \"../constants\";\nimport { three as THREE } from \"../deps\";\nimport { generatePreviewImage } from \"./util\";\n\nconst getProjectTextures = (layers = true) => {\n  const allTextures = Project ? Project.textures ?? Texture.all : Texture.all;\n\n  if (!layers) {\n    return allTextures;\n  }\n\n  return allTextures\n    .filter((t: Texture) => t.layers_enabled && t.layers.length > 0)\n    .flatMap((t: Texture) => t.layers);\n};\n\n/**\n * ### PBR Material\n * Class for handling PBR materials in Blockbench\n *\n * Uses a texture's layers to generate a PBR material,\n * or a project's textures if no layers are available.\n */\nexport default class PbrMaterial {\n  private _scope: Array<Texture | TextureLayer>;\n  private _materialUuid: string;\n\n  constructor(\n    scope: Array<Texture | TextureLayer> | null,\n    materialUuid: string\n  ) {\n    this._scope = scope ?? getProjectTextures();\n    this._materialUuid = materialUuid;\n  }\n\n  merToCanvas() {\n    let emissiveMap = this.getTexture(CHANNELS.emissive);\n    let roughnessMap = this.getTexture(CHANNELS.roughness);\n    let metalnessMap = this.getTexture(CHANNELS.metalness);\n\n    if (!emissiveMap && !roughnessMap && !metalnessMap) {\n      const { metalness, emissive, roughness } = this.decodeMer();\n\n      if (metalness) {\n        metalnessMap = PbrMaterial.makePixelatedCanvas(metalness);\n      }\n\n      if (emissive) {\n        emissiveMap = PbrMaterial.makePixelatedCanvas(emissive);\n      }\n\n      if (roughness) {\n        roughnessMap = PbrMaterial.makePixelatedCanvas(roughness);\n      }\n    }\n\n    return {\n      emissiveMap,\n      roughnessMap,\n      metalnessMap,\n    };\n  }\n\n  getMaterial(options: THREE.MeshStandardMaterialParameters = {}) {\n    const { emissiveMap, roughnessMap, metalnessMap } = Format.id.startsWith(\n      \"bedrock\"\n    )\n      ? this.merToCanvas()\n      : {\n          emissiveMap: this.getTexture(CHANNELS.emissive),\n          roughnessMap: this.getTexture(CHANNELS.roughness),\n          metalnessMap: this.getTexture(CHANNELS.metalness),\n        };\n\n    const normalMap = this.getTexture(CHANNELS.normal);\n\n    return new THREE.MeshStandardMaterial({\n      map:\n        this.getTexture(CHANNELS.albedo) ??\n        PbrMaterial.makePixelatedCanvas(\n          TextureLayer.selected?.canvas ??\n            Texture.all.find((t) => t.selected)?.canvas ??\n            Texture.getDefault().canvas\n        ),\n      aoMap: this.getTexture(CHANNELS.ao),\n      bumpMap: this.getTexture(CHANNELS.height),\n      normalMap,\n      // TODO: Use project settings to determine if normal map should be flipped\n      //normalScale: new THREE.Vector2(-1, 1),\n      metalnessMap,\n      metalness: metalnessMap ? 1 : 0,\n      roughnessMap,\n      roughness: 1,\n      emissiveMap,\n      emissiveIntensity: emissiveMap ? 1 : 0,\n      emissive: emissiveMap ? 0xffffff : 0,\n      envMap: PreviewScene.active?.cubemap ?? null,\n      envMapIntensity: 0.95,\n      alphaTest: 0.01,\n      transparent: true,\n      ...options,\n    });\n  }\n\n  renderMaterialPreview() {\n    const previewImage = generatePreviewImage(this.getMaterial());\n    return previewImage;\n  }\n\n  saveTexture(channel: IChannel, texture: Texture | TextureLayer) {\n    if (!Project) {\n      return;\n    }\n\n    if (!Project.pbr_materials) {\n      Project.pbr_materials = {};\n    }\n\n    if (!Project.pbr_materials[this._materialUuid]) {\n      Project.pbr_materials[this._materialUuid] = {};\n    }\n\n    Project.pbr_materials[this._materialUuid][channel.id] = texture.uuid;\n    texture.extend({ channel: channel.id });\n  }\n\n  /**\n   * ### Find channel texture\n   * @param name Channel to find\n   * @param inference Whether or not to infer the texture based on the channel name\n   * @returns The channel if it exists in the project, otherwise `null`\n   */\n  findTexture(\n    name: string | IChannel,\n    inference = true\n  ): Texture | TextureLayer | null {\n    if (!Project) {\n      return null;\n    }\n\n    const materialChannel = this._scope.find(\n      (t) => t.channel && (t.channel === name || t.channel === name.id)\n    );\n\n    if (materialChannel) {\n      return materialChannel;\n    }\n\n    const [channel, regex] =\n      typeof name === \"string\"\n        ? [name, new RegExp(`_*${name}(\\.[^.]+)?$`, \"i\")]\n        : [name.id, name.regex ?? new RegExp(`_*${name.id}(\\.[^.]+)?$`, \"i\")];\n\n    Project.pbr_materials = Project.pbr_materials ?? {};\n    const materialData = Project.pbr_materials[this._materialUuid];\n\n    // Don't infer the channel if it has already been assigned to NA_CHANNEL\n    if (inference && !materialData?.length && channel !== NA_CHANNEL) {\n      return this._scope.find((t) => regex.test(t.name)) ?? null;\n    }\n\n    const textureUuid = materialData?.[channel];\n\n    if (!textureUuid) {\n      return null;\n    }\n\n    return this._scope.find((t) => t.uuid === textureUuid) ?? null;\n  }\n\n  /**\n   * Helper function to create a canvas texture with pixelated filtering\n   * @param canvas Texture canvas source\n   * @returns `THREE.CanvasTexture` with pixelated filtering\n   */\n  static makePixelatedCanvas(canvas: HTMLCanvasElement) {\n    const texture = new THREE.CanvasTexture(\n      canvas,\n      undefined,\n      undefined,\n      undefined,\n      THREE.NearestFilter,\n      THREE.NearestFilter\n    );\n\n    texture.needsUpdate = true;\n\n    return texture;\n  }\n\n  /**\n   * Searches for a texture and creates a canvas element with the texture data if found\n   * @param name The name of the texture to search for. Use a channel or a texture name or UUID\n   * @param scope An array of textures to search in. Defaults to all textures in the project\n   */\n  getTexture(name: string | IChannel) {\n    const texture = this.findTexture(name);\n    return texture ? PbrMaterial.makePixelatedCanvas(texture.canvas) : null;\n  }\n\n  static extractChannel(\n    texture: Texture | TextureLayer,\n    channel: \"r\" | \"g\" | \"b\" | \"a\"\n  ) {\n    const canvas = texture.canvas;\n    const { width, height } = canvas;\n\n    const ctx = canvas.getContext(\"2d\");\n\n    if (!ctx || !width || !height) {\n      return null;\n    }\n\n    const channelCanvas = document.createElement(\"canvas\");\n    channelCanvas.width = width;\n    channelCanvas.height = height;\n\n    const channelCtx = channelCanvas.getContext(\"2d\");\n\n    if (!channelCtx) {\n      return null;\n    }\n\n    const channelIdx = { r: 0, g: 1, b: 2, a: 3 }[channel];\n\n    const { data } = ctx.getImageData(0, 0, width, height);\n\n    const channelData = new Uint8ClampedArray(width * height * 4);\n\n    for (let idx = 0; idx < data.length; idx += 4) {\n      const value = data[idx + channelIdx];\n      channelData[idx] = value;\n      channelData[idx + 1] = value;\n      channelData[idx + 2] = value;\n      channelData[idx + 3] = 255;\n    }\n\n    const imageData = new ImageData(channelData, width, height);\n\n    channelCtx.putImageData(imageData, 0, 0);\n\n    return channelCanvas;\n  }\n\n  decodeMer(emissiveThreshold = 1): {\n    metalness?: HTMLCanvasElement | null;\n    emissive?: HTMLCanvasElement | null;\n    emissiveLevel?: HTMLCanvasElement | null;\n    roughness?: HTMLCanvasElement | null;\n    sss?: HTMLCanvasElement | null;\n  } {\n    const texture = this.findTexture(\"mer\", true);\n\n    if (!texture) {\n      return {\n        metalness: null,\n        emissive: null,\n        emissiveLevel: null,\n        roughness: null,\n        sss: null,\n      };\n    }\n\n    const metalness = PbrMaterial.extractChannel(texture, \"r\");\n    const emissiveLevel = PbrMaterial.extractChannel(texture, \"g\");\n    const roughness = PbrMaterial.extractChannel(texture, \"b\");\n    const sss = PbrMaterial.extractChannel(texture, \"a\");\n\n    const emissive = document.createElement(\"canvas\");\n    emissive.width = texture.img.width ?? 16;\n    emissive.height = texture.img.height ?? 16;\n\n    // Use emissiveLevel as mask for getting emissive color from albedo channel\n    const albedo = this.findTexture(CHANNELS.albedo);\n\n    if (albedo) {\n      emissive.width = albedo.img.width ?? 16;\n      emissive.height = albedo.img.height ?? 16;\n    }\n\n    const emissiveCtx = emissive.getContext(\"2d\");\n    const emissiveLevelCtx = emissiveLevel?.getContext(\"2d\");\n    const albedoCtx = albedo?.canvas?.getContext(\"2d\");\n\n    if (!emissiveCtx || !albedoCtx || !emissiveLevelCtx) {\n      return {\n        metalness,\n        emissive: emissiveLevel,\n        roughness,\n        sss,\n      };\n    }\n\n    // Write the albedo color to the emissive canvas where the emissive level is greater than a certain threshold\n    const albedoData = albedoCtx.getImageData(\n      0,\n      0,\n      emissive.width,\n      emissive.height\n    );\n    const emissiveLevelData = emissiveLevelCtx.getImageData(\n      0,\n      0,\n      emissive.width,\n      emissive.height\n    );\n\n    const emissiveData = new Uint8ClampedArray(\n      emissive.width * emissive.height * 4\n    );\n\n    for (let idx = 0; idx < albedoData.data.length; idx += 4) {\n      if (emissiveLevelData.data[idx] > emissiveThreshold) {\n        emissiveData[idx] = albedoData.data[idx];\n        emissiveData[idx + 1] = albedoData.data[idx + 1];\n        emissiveData[idx + 2] = albedoData.data[idx + 2];\n        emissiveData[idx + 3] = 255;\n        continue;\n      }\n\n      emissiveData[idx] = 0;\n      emissiveData[idx + 1] = 0;\n      emissiveData[idx + 2] = 0;\n      emissiveData[idx + 3] = 255;\n    }\n\n    emissiveCtx.putImageData(\n      new ImageData(emissiveData, emissive.width, emissive.height),\n      0,\n      0\n    );\n\n    return {\n      metalness,\n      emissive,\n      emissiveLevel,\n      roughness,\n      sss,\n    };\n  }\n\n  createMer(inference = false) {\n    const metalness = this.findTexture(CHANNELS.metalness, inference);\n    const emissive = this.findTexture(CHANNELS.emissive, inference);\n    const roughness = this.findTexture(CHANNELS.roughness, inference);\n    const sss = this.findTexture(\"sss\", false);\n\n    const width = Math.max(\n      metalness?.img.width ?? 0,\n      emissive?.img.width ?? 0,\n      roughness?.img.width ?? 0,\n      Project ? Project.texture_width : 0,\n      16\n    );\n\n    const height = Math.max(\n      metalness?.img.height ?? 0,\n      emissive?.img.height ?? 0,\n      roughness?.img.height ?? 0,\n      Project ? Project.texture_height : 0,\n      16\n    );\n\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n\n    const ctx = canvas.getContext(\"2d\");\n\n    if (!ctx) {\n      return null;\n    }\n\n    const metalnessCanvas = metalness?.img\n      ? PbrMaterial.extractChannel(metalness, \"r\")\n      : null;\n    const emissiveCanvas = emissive?.img\n      ? PbrMaterial.extractChannel(emissive, \"g\")\n      : null;\n    const roughnessCanvas = roughness?.img\n      ? PbrMaterial.extractChannel(roughness, \"b\")\n      : null;\n    const sssCanvas =\n      sss && sss?.img ? PbrMaterial.extractChannel(sss, \"a\") : null;\n\n    const metalnessData =\n      metalnessCanvas?.getContext(\"2d\")?.getImageData(0, 0, width, height) ??\n      new ImageData(width, height);\n    const emissiveData =\n      emissiveCanvas?.getContext(\"2d\")?.getImageData(0, 0, width, height) ??\n      new ImageData(width, height);\n    const roughnessData =\n      roughnessCanvas?.getContext(\"2d\")?.getImageData(0, 0, width, height) ??\n      new ImageData(width, height);\n    const sssData =\n      sssCanvas?.getContext(\"2d\")?.getImageData(0, 0, width, height) ??\n      new ImageData(\n        new Uint8ClampedArray(width * height * 4).fill(255),\n        width,\n        height\n      );\n\n    const data = new Uint8ClampedArray(width * height * 4);\n\n    for (let idx = 0; idx < data.length; idx += 4) {\n      data[idx] = metalnessData.data[idx];\n      data[idx + 1] = emissiveData.data[idx];\n      data[idx + 2] = roughnessData.data[idx];\n      data[idx + 3] = sssData.data[idx];\n    }\n\n    ctx.putImageData(new ImageData(data, width, height), 0, 0);\n\n    return canvas;\n  }\n\n  createLabPbrOutput(inference = true) {\n    const metalness = this.findTexture(CHANNELS.metalness, inference);\n    const emissive = this.findTexture(CHANNELS.emissive, inference);\n    const roughness = this.findTexture(CHANNELS.roughness, inference);\n    const normal = this.findTexture(CHANNELS.normal, inference);\n    const heightmap = this.findTexture(CHANNELS.height, inference);\n    const ao = this.findTexture(CHANNELS.ao, false);\n    const sss = this.findTexture(\"sss\", true);\n    const porosity = this.findTexture(\"porosity\", true);\n\n    const width = Math.max(\n      metalness?.img.width ?? 0,\n      emissive?.img.width ?? 0,\n      roughness?.img.width ?? 0,\n      Project ? Project.texture_width : 0,\n      16\n    );\n\n    const height = Math.max(\n      metalness?.img.height ?? 0,\n      emissive?.img.height ?? 0,\n      roughness?.img.height ?? 0,\n      Project ? Project.texture_height : 0,\n      16\n    );\n\n    const specularCanvas = document.createElement(\"canvas\");\n    specularCanvas.width = width;\n    specularCanvas.height = height;\n\n    const specularCtx = specularCanvas.getContext(\"2d\");\n\n    const normalMapCanvas = document.createElement(\"canvas\");\n    normalMapCanvas.width = width;\n    normalMapCanvas.height = height;\n\n    const normalMapCtx = normalMapCanvas.getContext(\"2d\");\n\n    if (!specularCtx || !normalMapCtx) {\n      return null;\n    }\n\n    const specularData = new Uint8ClampedArray(width * height * 4);\n    const normalData = new Uint8ClampedArray(width * height * 4);\n\n    // Specular texture output \"_s\"\n    // Red channel: Convert linear roughness to perceptual smoothness with: perceptualSmoothness = 1.0 - sqrt(roughness).\n    // Green channel: Values from 0 to 229 represent F0. Stored linearly. Values from 230 to 255 represent various different metals.\n    // Blue channel: Values from 0 to 64 represent porosity. Values from 65 to 255 represent subsurface scattering. Both porosity and subsurface scattering are stored linearly.\n    // Alpha channel: It can have values ranging from 0 to 254; 0 being 0% emissiveness and 254 being 100%. Stored linearly.\n    const metalnessCanvas = metalness?.canvas;\n    const emissiveCanvas = emissive?.canvas;\n    const roughnessCanvas = roughness?.canvas;\n    const sssCanvas = sss?.canvas;\n    const porosityCanvas = porosity?.canvas;\n\n    const metalnessCtx = metalnessCanvas?.getContext(\"2d\");\n    const emissiveCtx = emissiveCanvas?.getContext(\"2d\");\n    const roughnessCtx = roughnessCanvas?.getContext(\"2d\");\n    const sssCtx = sssCanvas?.getContext(\"2d\");\n    const porosityCtx = porosityCanvas?.getContext(\"2d\");\n\n    const metalnessData = metalnessCtx?.getImageData(0, 0, width, height);\n    const emissiveData = emissiveCtx?.getImageData(0, 0, width, height);\n    const roughnessData = roughnessCtx?.getImageData(0, 0, width, height);\n    const sssData = sssCtx?.getImageData(0, 0, width, height);\n    const porosityData = porosityCtx?.getImageData(0, 0, width, height);\n\n    for (let idx = 0; idx < specularData.length; idx += 4) {\n      const smoothness = roughnessData\n        ? 1.0 - Math.sqrt(roughnessData.data[idx] / 255)\n        : 0;\n      //   const f0 = Math.min(229, Math.max(0, Math.round(smoothness * 229)));\n\n      // Convert metalness to F0\n      const f0 = Math.min(\n        229,\n        Math.max(0, Math.round((metalnessData?.data[idx] ?? smoothness) * 229))\n      );\n\n      const porosity = porosityData?.data[idx];\n      const sss = sssData?.data[idx];\n\n      specularData[idx] = smoothness * 255;\n      specularData[idx + 1] = f0;\n\n      // Merge porosity and sss in blue channel because they are mutually exclusive\n      specularData[idx + 2] = sss ?? porosity ?? 0;\n\n      // Add emissive to alpha\n      // But first convert emissive channel from color to grayscale\n\n      if (!emissiveData) {\n        specularData[idx + 3] = 255;\n        continue;\n      }\n\n      const emissiveLevel = Math.round(\n        (emissiveData?.data[idx] +\n          emissiveData?.data[idx + 1] +\n          emissiveData?.data[idx + 2]) /\n          3\n      );\n\n      specularData[idx + 3] = emissiveLevel || 255;\n    }\n\n    specularCtx.putImageData(new ImageData(specularData, width, height), 0, 0);\n\n    // Normal map output \"_n\"\n    // AO is stored in blue channel\n    // Height map is stored in alpha channel\n    const normalCanvas = normal?.canvas;\n    const aoCanvas = ao?.canvas;\n    const heightmapCanvas = heightmap?.canvas;\n\n    const normalCtx = normalCanvas?.getContext(\"2d\");\n    const aoCtx = aoCanvas?.getContext(\"2d\");\n    const heightmapCtx = heightmapCanvas?.getContext(\"2d\");\n\n    const normalMapData = normalCtx?.getImageData(0, 0, width, height);\n    const aoData = aoCtx?.getImageData(0, 0, width, height);\n    const heightmapData = heightmapCtx?.getImageData(0, 0, width, height);\n\n    for (let idx = 0; idx < normalData.length; idx += 4) {\n      normalData[idx] = normalMapData?.data[idx] ?? 0;\n      normalData[idx + 1] = normalMapData?.data[idx + 1] ?? 0;\n      normalData[idx + 2] = aoData?.data[idx + 2] ?? 255;\n      normalData[idx + 3] = heightmapData?.data[idx + 3] || 255;\n    }\n\n    normalMapCtx.putImageData(new ImageData(normalData, width, height), 0, 0);\n\n    return {\n      specular: specularCanvas,\n      normalMap: normalMapCanvas,\n    };\n  }\n\n  decodeLabPbrNormal(texture: Texture | TextureLayer): {\n    ao?: HTMLCanvasElement | null;\n    normal?: HTMLCanvasElement | null;\n    heightmap?: HTMLCanvasElement | null;\n  } {\n    const width = texture.img.width ?? 16;\n    const height = texture.img.height ?? 16;\n\n    const ctx = texture.canvas.getContext(\"2d\");\n\n    if (!ctx) {\n      return {};\n    }\n\n    const aoCanvas = document.createElement(\"canvas\");\n    aoCanvas.width = width;\n    aoCanvas.height = height;\n\n    const normalCanvas = document.createElement(\"canvas\");\n    normalCanvas.width = width;\n    normalCanvas.height = height;\n\n    const heightmapCanvas = document.createElement(\"canvas\");\n    heightmapCanvas.width = width;\n    heightmapCanvas.height = height;\n\n    const aoCtx = aoCanvas.getContext(\"2d\");\n    const normalCtx = normalCanvas.getContext(\"2d\");\n    const heightmapCtx = heightmapCanvas.getContext(\"2d\");\n\n    const { data } = ctx.getImageData(0, 0, width, height);\n\n    if (!data || !aoCtx || !normalCtx || !heightmapCtx) {\n      return {};\n    }\n\n    const aoData = new Uint8ClampedArray(width * height * 4);\n    const normalData = new Uint8ClampedArray(width * height * 4);\n    const heightmapData = new Uint8ClampedArray(width * height * 4);\n\n    for (let r = 0; r < data.length; r += 4) {\n      const g = r + 1;\n      const b = r + 2;\n      const a = r + 3;\n\n      aoData[r] = data[b];\n      aoData[g] = data[b];\n      aoData[b] = data[b];\n      aoData[a] = 255;\n\n      normalData[r] = data[r];\n      normalData[g] = data[g];\n      normalData[b] = 255;\n      normalData[a] = 255;\n\n      heightmapData[r] = data[a];\n      heightmapData[g] = data[a];\n      heightmapData[b] = data[a];\n      heightmapData[a] = 255;\n    }\n\n    aoCtx.putImageData(new ImageData(aoData, width, height), 0, 0);\n    normalCtx.putImageData(new ImageData(normalData, width, height), 0, 0);\n    heightmapCtx.putImageData(\n      new ImageData(heightmapData, width, height),\n      0,\n      0\n    );\n\n    return {\n      ao: aoCanvas,\n      normal: normalCanvas,\n      heightmap: heightmapCanvas,\n    };\n  }\n\n  decodeLabPbrSpecular(texture: Texture | TextureLayer): {\n    metalness?: HTMLCanvasElement | null;\n    emissive?: HTMLCanvasElement | null;\n    roughness?: HTMLCanvasElement | null;\n    sss?: HTMLCanvasElement | null;\n    porosity?: HTMLCanvasElement | null;\n  } {\n    const width = texture.img.width ?? 16;\n    const height = texture.img.height ?? 16;\n\n    const ctx = texture.canvas.getContext(\"2d\");\n\n    if (!ctx) {\n      return {};\n    }\n    const metalnessCanvas = document.createElement(\"canvas\");\n    metalnessCanvas.width = width;\n    metalnessCanvas.height = height;\n\n    const emissiveCanvas = document.createElement(\"canvas\");\n    emissiveCanvas.width = width;\n    emissiveCanvas.height = height;\n\n    const roughnessCanvas = document.createElement(\"canvas\");\n    roughnessCanvas.width = width;\n    roughnessCanvas.height = height;\n\n    const sssCanvas = document.createElement(\"canvas\");\n    sssCanvas.width = width;\n    sssCanvas.height = height;\n\n    const porosityCanvas = document.createElement(\"canvas\");\n    porosityCanvas.width = width;\n    porosityCanvas.height = height;\n\n    const metalnessCtx = metalnessCanvas.getContext(\"2d\");\n    const emissiveCtx = emissiveCanvas.getContext(\"2d\");\n    const roughnessCtx = roughnessCanvas.getContext(\"2d\");\n    const sssCtx = sssCanvas.getContext(\"2d\");\n    const porosityCtx = porosityCanvas.getContext(\"2d\");\n\n    const { data } = ctx.getImageData(0, 0, width, height);\n\n    if (\n      !data ||\n      !metalnessCtx ||\n      !emissiveCtx ||\n      !roughnessCtx ||\n      !sssCtx ||\n      !porosityCtx\n    ) {\n      return {};\n    }\n\n    const metalnessData = new Uint8ClampedArray(width * height * 4);\n    const emissiveData = new Uint8ClampedArray(width * height * 4);\n    const roughnessData = new Uint8ClampedArray(width * height * 4);\n    const sssData = new Uint8ClampedArray(width * height * 4);\n    const porosityData = new Uint8ClampedArray(width * height * 4);\n\n    for (let r = 0; r < data.length; r += 4) {\n      // Roughness is inverted smoothness in red channel\n      // Metalness is F0 in green channel\n      // SSS and porosity are stored in blue channel linearly\n      // Emissive is stored in alpha channel linearly\n\n      const g = r + 1;\n      const b = r + 2;\n      const a = r + 3;\n\n      roughnessData[r] = 255 - data[r];\n      roughnessData[g] = 255 - data[r];\n      roughnessData[b] = 255 - data[r];\n      roughnessData[a] = 255;\n\n      metalnessData[r] = data[g];\n      metalnessData[g] = data[g];\n      metalnessData[b] = data[g];\n      metalnessData[a] = 255;\n\n      emissiveData[r] = data[a];\n      emissiveData[g] = data[a];\n      emissiveData[b] = data[a];\n      emissiveData[a] = 255;\n\n      sssData[r] = 0;\n      sssData[g] = 0;\n      sssData[b] = 0;\n      sssData[a] = 255;\n\n      porosityData[r] = data[b];\n      porosityData[g] = data[b];\n      porosityData[b] = data[b];\n      porosityData[a] = 255;\n\n      if (data[b] < 65) {\n        sssData[r] = data[b];\n        sssData[g] = data[b];\n        sssData[b] = data[b];\n        sssData[a] = 255;\n\n        porosityData[r] = 0;\n        porosityData[g] = 0;\n        porosityData[b] = 0;\n        porosityData[a] = 255;\n      }\n    }\n\n    metalnessCtx.putImageData(\n      new ImageData(metalnessData, width, height),\n      0,\n      0\n    );\n\n    emissiveCtx.putImageData(new ImageData(emissiveData, width, height), 0, 0);\n\n    roughnessCtx.putImageData(\n      new ImageData(roughnessData, width, height),\n      0,\n      0\n    );\n\n    sssCtx.putImageData(new ImageData(sssData, width, height), 0, 0);\n\n    porosityCtx.putImageData(new ImageData(porosityData, width, height), 0, 0);\n\n    return {\n      metalness: metalnessCanvas,\n      emissive: emissiveCanvas,\n      roughness: roughnessCanvas,\n      sss: sssCanvas,\n      porosity: porosityCanvas,\n    };\n  }\n\n  createTexturesFromSpecular(texture: Texture | TextureLayer) {\n    const maps = this.decodeLabPbrSpecular(texture);\n\n    Object.entries(maps).forEach(([name, map]) => {\n      if (map) {\n        const textureMap = new Texture({\n          name: `${texture.name}_${name}`,\n          saved: false,\n          particle: false,\n          keep_size: false,\n        }).fromDataURL(map.toDataURL());\n\n        textureMap.add();\n      }\n    });\n\n    return maps;\n  }\n\n  createTexturesFromNormal(texture: Texture | TextureLayer) {\n    const maps = this.decodeLabPbrNormal(texture);\n\n    Object.entries(maps).forEach(([name, map]) => {\n      if (map) {\n        const textureMap = new Texture({\n          name: `${texture.name}_${name}`,\n          saved: false,\n          particle: false,\n          keep_size: false,\n        }).fromDataURL(map.toDataURL());\n\n        textureMap.add();\n      }\n    });\n\n    return maps;\n  }\n}\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/bakeTextures.ts",
    "content": "import { three as THREE } from \"../../deps\";\nimport { registry, setups, teardowns } from \"../../constants\";\nimport { bakeTextures } from \"../bakery\";\n\nsetups.push(() => {\n  registry.bakeTexturesDialog = new Dialog(\"bake_textures\", {\n    id: \"bake_textures\",\n    title: \"Bake Textures\",\n    buttons: [\"Bake\", \"Cancel\"],\n    form: {\n      ambientLight: {\n        type: \"color\",\n        label: \"Ambient Light\",\n        value: \"#1f1f1f\",\n      },\n      lightDiffuse: {\n        type: \"color\",\n        label: \"Light Diffuse\",\n        value: \"#ffffff\",\n      },\n      lightHeight: {\n        type: \"range\",\n        label: \"Light Height\",\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: 0.66,\n      },\n      minLightIntensity: {\n        type: \"range\",\n        label: \"Minimum Light Intensity\",\n        min: 0,\n        max: 1,\n        step: 0.01,\n        value: 0,\n      },\n      directions: {\n        type: \"number\",\n        label: \"Directions\",\n        value: 8,\n        min: 1,\n        max: 360,\n        step: 1,\n      },\n      blendEmissive: {\n        type: \"checkbox\",\n        label: \"Blend Emissive\",\n        value: false,\n      },\n    },\n    onConfirm(formResult: Record<string, any>) {\n      const ambientLight = new THREE.Color(formResult.ambientLight.toString());\n      const lightDiffuse = new THREE.Color(formResult.lightDiffuse.toString());\n      bakeTextures(\n        {\n          ambientLight: [ambientLight.r, ambientLight.g, ambientLight.b],\n          lightDiffuse: [lightDiffuse.r, lightDiffuse.g, lightDiffuse.b],\n          lightHeight: Number(formResult.lightHeight),\n          minLightIntensity: Number(formResult.minLightIntensity),\n        },\n        formResult.directions ?? 8,\n        formResult.blendEmissive ?? false,\n      );\n    },\n  });\n\n  registry.bakeTexturesAction = new Action(\"bake_textures\", {\n    icon: \"cake\",\n    name: \"Bake Textures\",\n    description: \"Bakes textures for the selected PBR material\",\n    click() {\n      registry.bakeTexturesDialog?.show();\n    },\n  });\n\n  MenuBar.addAction(registry.bakeTexturesAction, \"tools\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"tools.bake_textures\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/channelAssignment.ts",
    "content": "import type { IChannel } from \"../../types\";\nimport {\n  CHANNELS,\n  NA_CHANNEL,\n  registry,\n  setups,\n  teardowns,\n} from \"../../constants\";\nimport {\n  applyPbrMaterial,\n  debounceApplyPbrMaterial,\n} from \"../applyPbrMaterial\";\nimport { getSelectedLayer, getSelectedTexture } from \"../util\";\n\n/**\n * Registry of channel actions\\\n * (Not in the same registry as the other actions. Needs its own teardown.)\n */\nconst channelAssignmentActions: Record<IChannel[\"id\"], Action> = {};\n\nconst canShowChannelAssignment = () =>\n  Condition({\n    modes: [\"edit\", \"paint\"],\n    selected: {\n      texture: true,\n    },\n    project: true,\n    method() {\n      const selected = getSelectedTexture();\n\n      if (selected && !selected.material) {\n        return true;\n      }\n\n      return (\n        selected?.material === true &&\n        getSelectedLayer() !== null &&\n        Modes.paint\n      );\n    },\n  });\n\nconst canUnassignChannel = () =>\n  Condition({\n    modes: [\"paint\", \"edit\"],\n    selected: {\n      texture: true,\n    },\n    method() {\n      const texture = getSelectedTexture();\n\n      if (texture?.material && Modes.edit) {\n        // Don't show Action on material textures in edit mode\n        return false;\n      }\n\n      const layer = getSelectedLayer() ?? texture;\n\n      return layer?.channel && layer.channel !== NA_CHANNEL;\n    },\n  });\n\nsetups.push(() => {\n  Object.entries(CHANNELS).forEach(([key, channel]) => {\n    channelAssignmentActions[key] = new Action(`assign_channel_${key}`, {\n      icon: channel.icon ?? \"tv_options_edit_channels\",\n      name: `Assign to ${channel.label.toLocaleLowerCase()} channel`,\n      description: `Assign the selected layer to the ${channel.label} channel`,\n      category: \"textures\",\n      condition: canShowChannelAssignment,\n      click() {\n        const layer =\n          TextureLayer.selected ?? (Project ? Project.selected_texture : null);\n\n        if (!layer) {\n          return;\n        }\n\n        Undo.initEdit({ layers: [layer] });\n\n        layer.extend({ channel: channel.id });\n\n        const texture = layer instanceof TextureLayer ? layer.texture : layer;\n\n        texture.updateChangesAfterEdit();\n\n        if (!Project.pbr_materials[texture.uuid]) {\n          Project.pbr_materials[texture.uuid] = {};\n        }\n\n        // If the layer uuid is already assigned to another channel, unassign it first\n        Object.entries(Project.pbr_materials[texture.uuid]).forEach(\n          ([assignedChannel, assignedLayerUuid]) => {\n            if (assignedLayerUuid === layer.uuid) {\n              delete Project.pbr_materials[texture.uuid][assignedChannel];\n              layer.channel = NA_CHANNEL;\n            }\n          }\n        );\n\n        // If the layer uuid is equal to the texture uuid, the texture can not be assigned to any other channels\n        if (texture.uuid === layer.uuid) {\n          Project.pbr_materials[texture.uuid] = {};\n        }\n\n        Project.pbr_materials[texture.uuid][key] = layer.uuid;\n\n        Undo.finishEdit(\"Change channel assignment\");\n\n        Blockbench.showQuickMessage(\n          `Assigned \"${layer.name}\" to ${channel.label} channel`,\n          2000\n        );\n\n        applyPbrMaterial();\n      },\n    });\n  });\n});\n\nteardowns.push(() => {\n  Object.values(channelAssignmentActions).forEach((action) => {\n    action.delete();\n  });\n});\n\nsetups.push(() => {\n  registry.unassignChannel = new Action(\"unassign_channel\", {\n    icon: \"cancel\",\n    name: \"Unassign Channel\",\n    description: \"Unassign the selected layer from the channel\",\n    category: \"textures\",\n    condition: canUnassignChannel,\n    click() {\n      const layer =\n        TextureLayer.selected ?? (Project ? Project.selected_texture : null);\n\n      if (!layer) {\n        return;\n      }\n\n      Undo.initEdit({ layers: [layer] });\n\n      const texture = layer instanceof TextureLayer ? layer.texture : layer;\n      const prevChannel = layer.channel;\n\n      Project.pbr_materials[texture.uuid] = {};\n\n      layer.channel = NA_CHANNEL;\n\n      texture.updateChangesAfterEdit();\n      Undo.finishEdit(\"Unassign channel\");\n\n      Blockbench.showQuickMessage(\n        `Unassigned \"${layer.name}\" from ${prevChannel} channel`,\n        2000\n      );\n\n      debounceApplyPbrMaterial();\n    },\n  });\n\n  registry.channelMenu = new Menu(\n    \"channel_menu\",\n    [\n      ...Object.keys(CHANNELS).map((key) => `assign_channel_${key}`),\n      ...[\"unassign_channel\"],\n    ],\n    {\n      onOpen() {\n        debounceApplyPbrMaterial();\n      },\n    }\n  );\n\n  registry.openChannelMenu = new Action(\"pbr_channel_menu\", {\n    name: \"Assign to PBR Channel\",\n    icon: \"texture\",\n    condition: () => canShowChannelAssignment() || canUnassignChannel(),\n    click(event) {\n      registry.channelMenu?.open(event as MouseEvent);\n    },\n    children: [\n      ...Object.values(channelAssignmentActions),\n      registry.unassignChannel,\n    ],\n  });\n\n  registry.showChannelMenu = new Action(\"show_channel_menu\", {\n    icon: \"texture\",\n    name: \"Assign to PBR Channel\",\n    description: \"Assign the selected layer to a channel\",\n    category: \"textures\",\n    condition: canShowChannelAssignment,\n    click(event) {\n      registry.channelMenu?.open(event as MouseEvent);\n    },\n  });\n\n  if (registry.openChannelMenu) {\n    MenuBar.addAction(registry.openChannelMenu, \"image.0\");\n    Texture.prototype.menu.addAction(registry.openChannelMenu, \"0\");\n    TextureLayer.prototype.menu.addAction(registry.openChannelMenu, \"0\");\n  }\n\n  Toolbars.layers.add(registry.showChannelMenu, 1);\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"image.pbr_channel_menu\");\n  Texture.prototype.menu.removeAction(\"pbr_channel_menu\");\n  TextureLayer.prototype.menu.removeAction(\"pbr_channel_menu\");\n  Toolbars.layers.remove(registry.showChannelMenu);\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/generateNormal.ts",
    "content": "import { registry, setups, teardowns } from \"../../constants\";\nimport { CHANNELS } from \"../../constants\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport { getSelectedLayer, getSelectedTexture } from \"../util\";\nimport { createNormalMap, createAoMap } from \"../normalMap\";\n\nconst generateNormal = (\n  e: Event,\n  orientation: \"OpenGL\" | \"DirectX\" = \"DirectX\"\n) => {\n  const texture: Texture | TextureLayer =\n    getSelectedLayer() ?? getSelectedTexture() ?? Texture.getDefault();\n\n  if (!texture) {\n    return;\n  }\n\n  const normalMap = createNormalMap(texture, orientation, false);\n\n  if (!normalMap) {\n    Blockbench.showQuickMessage(\"Failed to generate normal map\", 2000);\n    return;\n  }\n\n  normalMap.select(e);\n\n  new PbrMaterial(\n    texture instanceof Texture && texture.layers_enabled\n      ? texture.layers\n      : null,\n    texture.uuid\n  ).saveTexture(CHANNELS.normal, normalMap);\n\n  Blockbench.showQuickMessage(\"Normal map generated\", 2000);\n};\n\nsetups.push(() => {\n  registry.generateDirectXNormal = new Action(\"generate_dx_normal\", {\n    icon: CHANNELS.normal.icon ?? \"altitude\",\n    name: \"Generate DirectX Normal Map\",\n    description: \"Generates a DirectX normal map from the height map\",\n    condition: () => (getSelectedLayer() ?? getSelectedTexture()) !== null,\n    click: (e) => generateNormal(e),\n  });\n\n  registry.generateOpenGlNormal = new Action(\"generate_opengl_normal\", {\n    icon: CHANNELS.normal.icon ?? \"altitude\",\n    name: \"Generate OpenGL Normal Map\",\n    description: \"Generates an OpenGL normal map from the height map\",\n    condition: () => (getSelectedLayer() ?? getSelectedTexture()) !== null,\n    click: (e) => generateNormal(e, \"OpenGL\"),\n  });\n\n  registry.generateAo = new Action(\"generate_ao\", {\n    icon: CHANNELS.ao.icon ?? \"motion_mode\",\n    name: \"Generate Ambient Occlusion Map\",\n    description: \"Generates an ambient occlusion map from the height map\",\n    condition: {\n      selected: {\n        texture: true,\n      },\n      project: true,\n    },\n    click() {\n      const texture: Texture | TextureLayer =\n        getSelectedLayer() ?? getSelectedTexture() ?? Texture.getDefault();\n\n      if (!texture) {\n        return;\n      }\n\n      const mat = new PbrMaterial(\n        texture instanceof Texture && texture.layers_enabled\n          ? texture.layers\n          : null,\n        texture.uuid\n      );\n\n      const normalMap =\n        mat.findTexture(CHANNELS.normal) ?? createNormalMap(texture);\n\n      if (!normalMap) {\n        // TODO: Use Validator\n        Blockbench.showQuickMessage(\n          \"Unable to generate ambient occlusion map without a normal map\",\n          2000\n        );\n        return;\n      }\n\n      const aoMap = createAoMap(normalMap);\n\n      if (aoMap) {\n        mat.saveTexture(CHANNELS.ao, aoMap);\n        aoMap.select();\n        Blockbench.showQuickMessage(\"Ambient occlusion map generated\", 2000);\n        return;\n      }\n\n      Blockbench.showQuickMessage(\n        \"Failed to generate ambient occlusion map\",\n        2000\n      );\n    },\n  });\n\n  registry.generateNormal = new Action(\"generate_normal\", {\n    children: [registry.generateDirectXNormal, registry.generateOpenGlNormal],\n    name: \"Generate Normal Map\",\n    description: \"Generates a normal map from the height map\",\n    condition: () => (getSelectedLayer() ?? getSelectedTexture()) !== null,\n    click() {},\n    icon: CHANNELS.normal.icon ?? \"altitude\",\n  });\n\n  MenuBar.addAction(registry.generateNormal, \"tools\");\n  MenuBar.addAction(registry.generateAo, \"tools\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(`tools.generate_normal`);\n  MenuBar.removeAction(`tools.generate_ao`);\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/index.ts",
    "content": "import \"./bakeTextures\";\nimport \"./channelAssignment\";\nimport \"./generateNormal\";\nimport \"./labPbr\";\nimport \"./materialTexture\";\nimport \"./mer\";\nimport \"./textureSet\";\nimport \"./toggleLights\";\nimport \"./togglePbr\";\nimport \"./tonemapping\";\nimport \"./usdz\";\nimport \"../io/bbmat\";\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/labPbr.ts",
    "content": "import { registry, setups, teardowns } from \"../../constants\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport { getSelectedTexture } from \"../util\";\n\nconst exportNormalMap = (\n  normalMap: HTMLCanvasElement,\n  baseName = \"texture\",\n) => {\n  normalMap.toBlob(async (blob) => {\n    if (!blob) {\n      return;\n    }\n\n    Blockbench.export({\n      content: await blob.arrayBuffer(),\n      type: \"PNG\",\n      name: `${baseName}_n`,\n      extensions: [\"png\"],\n      resource_id: \"normal_map\",\n      savetype: \"image\",\n    });\n  });\n};\n\nconst exportSpecularMap = (\n  specularMap: HTMLCanvasElement,\n  baseName = \"texture\",\n) => {\n  specularMap.toBlob(async (blob) => {\n    if (!blob) {\n      return;\n    }\n\n    Blockbench.export({\n      content: await blob.arrayBuffer(),\n      type: \"PNG\",\n      name: `${baseName}_s`,\n      extensions: [\"png\"],\n      resource_id: \"specular_map\",\n      savetype: \"image\",\n    });\n  });\n};\n\nsetups.push(() => {\n  registry.generateLabPbr = new Action(\"generate_lab_pbr\", {\n    icon: \"experiment\",\n    name: \"Generate labPBR textures\",\n    description:\n      \"Generate a specular and normal map in labPBR format for Java shaders\",\n    condition: {\n      formats: [\"java_block\"],\n      project: true,\n    },\n    async click() {\n      const selected = getSelectedTexture();\n\n      if (!selected) {\n        return;\n      }\n\n      const mat = new PbrMaterial(\n        selected.layers_enabled ? selected.layers : [selected],\n        selected.uuid\n      );\n\n      const outputs = mat.createLabPbrOutput();\n\n      if (outputs === null) {\n        return;\n      }\n\n      const baseName =\n        selected.name ?? (!!Project ? Project.getDisplayName() : \"texture\");\n\n      await Promise.all([\n        exportNormalMap(outputs.normalMap, pathToName(baseName)),\n        exportSpecularMap(outputs.specular, pathToName(baseName)),\n      ]);\n\n      Blockbench.showQuickMessage(\"Exported labPBR textures\");\n    },\n  });\n\n  registry.decodeLabPbr = new Action(\"decode_lab_pbr\", {\n    icon: \"frame_source\",\n    name: \"Decode labPBR textures\",\n    description:\n      \"Decodes the selected texture into a specular or normal map in labPBR format\",\n    condition: {\n      formats: [\"java\"],\n      project: true,\n      selected: {\n        texture: true,\n      },\n    },\n    click() {\n      const selected =\n        TextureLayer.selected?.texture ??\n        Texture.all.find((t) => t.selected) ??\n        Texture.getDefault();\n\n      const mat = new PbrMaterial(\n        selected.layers_enabled ? selected.layers : [selected],\n        selected.uuid,\n      );\n\n      if (pathToName(selected.name).endsWith(\"_n\")) {\n        mat.createTexturesFromNormal(selected);\n        return;\n      }\n\n      if (pathToName(selected.name).endsWith(\"_s\")) {\n        mat.createTexturesFromSpecular(selected);\n        return;\n      }\n\n      Blockbench.showQuickMessage(\"Failed to decode labPBR texture\");\n    },\n  });\n\n  MenuBar.addAction(registry.generateLabPbr, \"file.export\");\n  MenuBar.addAction(registry.decodeLabPbr, \"tools\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"file.export.generate_lab_pbr\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/materialTexture.ts",
    "content": "import {\n  registry,\n  CHANNELS,\n  setups,\n  teardowns,\n  NA_CHANNEL,\n} from \"../../constants\";\nimport { three as THREE } from \"../../deps\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport {\n  colorDataUrl,\n  generatePreviewImage,\n  getSelectedTexture,\n} from \"../util\";\n\nsetups.push(() => {\n  registry.createMaterialTexture = new Action(\"create_material_texture\", {\n    icon: \"deployed_code\",\n    name: \"Create Material Texture\",\n    description: \"Creates a new texture for a PBR material\",\n    condition: {\n      modes: [\"edit\", \"paint\"],\n      project: true,\n    },\n    click() {\n      if (!Project) {\n        return;\n      }\n\n      const channels = {\n        ...CHANNELS,\n      };\n\n      const texture = new Texture({\n        name: \"New Material\",\n        saved: false,\n        particle: false,\n      });\n\n      texture.extend({ material: true });\n\n      const scope =\n        Texture.all.filter(\n          (t) => (t.selected || t.multi_selected) && !t.material\n        ) ?? Texture.all;\n\n      const selected = getSelectedTexture();\n\n      const mat = selected ? new PbrMaterial(scope, selected.uuid) : null;\n\n      try {\n        const baseColor =\n          mat?.findTexture(CHANNELS.albedo, true)?.canvas.toDataURL() ??\n          selected?.canvas.toDataURL() ??\n          colorDataUrl(new THREE.Color(0x808080), texture.canvas);\n\n        if (!baseColor) {\n          return;\n        }\n\n        texture.fromDataURL(baseColor);\n\n        const layer = new TextureLayer(\n          {\n            name: channels.albedo.label,\n            visible: true,\n            data_url: baseColor,\n            keep_size: true,\n          },\n          texture\n        );\n\n        layer.extend({ channel: channels.albedo.id });\n        layer.addForEditing();\n        layer.texture.updateChangesAfterEdit();\n        mat?.saveTexture(channels.albedo, layer);\n        delete channels.albedo;\n      } catch (e) {\n        console.warn(\"Failed to create base color texture\", e);\n        Blockbench.showStatusMessage(\n          \"Failed to create base color texture in new material\",\n          3000\n        );\n      }\n\n      // Create PBR channels as texture layers for the new texture\n      const layers = Object.keys(channels)\n        .reverse()\n        .map((key) => {\n          const channel = CHANNELS[key];\n          const channelTexture = mat?.findTexture(channel, true);\n\n          const data = channelTexture\n            ? channelTexture.canvas.toDataURL()\n            : colorDataUrl(channel.default ?? new THREE.Color(0));\n\n          if (!data) {\n            return;\n          }\n\n          const layer = new TextureLayer(\n            {\n              name: channel.label,\n              visible: true,\n              data_url: data,\n              keep_size: true,\n            },\n            texture\n          );\n\n          layer.extend({ channel: channel.id });\n\n          mat?.saveTexture(channel, layer);\n\n          return layer;\n        })\n        .filter(Boolean) as TextureLayer[];\n\n      Undo.initEdit({ textures: Texture.all, layers });\n\n      texture.add().select();\n      texture.activateLayers();\n      layers.map((layer) => {\n        layer.addForEditing();\n\n        texture.width = Math.max(texture.width, layer.img.width);\n        texture.height = Math.max(texture.height, layer.img.height);\n      });\n      texture.updateChangesAfterEdit();\n\n      Undo.finishEdit(\"Create Material Texture\");\n    },\n  });\n\n  MenuBar.addAction(registry.createMaterialTexture, \"tools\");\n  Toolbars.texturelist.add(registry.createMaterialTexture, 3);\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"tools.create_material_texture\");\n  Toolbars.texturelist.remove(\"create_material_texture\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/mer.ts",
    "content": "import { CHANNELS, registry, setups, teardowns } from \"../../constants\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport { exportMer } from \"../mer\";\nimport { getSelectedTexture } from \"../util\";\n\nsetups.push(() => {\n  registry.generateMer = new Action(\"create_mer\", {\n    icon: \"lightbulb_circle\",\n    name: \"Export MER\",\n    description:\n      \"Exports a texture map from the metalness, emissive, and roughness channels. (For use in Bedrock resource packs.)\",\n    condition: {\n      formats: [\"bedrock\", \"bedrock_block\"],\n      project: true,\n    },\n    click() {\n      try {\n        exportMer();\n      } catch (err) {\n        console.error(\"Failed to export MER map:\", err);\n        Blockbench.showStatusMessage(\"Failed to export MER map\", 3000);\n      }\n    },\n  });\n\n  registry.decodeMer = new Action(\"decode_mer\", {\n    name: \"Decode MER\",\n    icon: \"arrow_split\",\n    condition: {\n      formats: [\"bedrock\", \"bedrock_block\"],\n      project: true,\n      selected: {\n        texture: true,\n      },\n    },\n    children: [\n      {\n        icon: \"move_item\",\n        name: \"Decode MER to Textures\",\n        description:\n          \"Decodes a MER texture map into metalness, emissive, and roughness channels into separate textures\",\n        click() {\n          const selected = getSelectedTexture() ?? Texture.getDefault();\n\n          const mat = new PbrMaterial([selected], selected.uuid);\n\n          const mer = mat.decodeMer();\n          const merChannels = [\n            CHANNELS.metalness,\n            CHANNELS.emissive,\n            CHANNELS.roughness,\n          ];\n\n          Undo.initEdit({ textures: [selected] });\n\n          merChannels.forEach((channel) => {\n            const key = channel.id as keyof typeof mer;\n            const canvas = mer[key];\n\n            if (!canvas) {\n              Blockbench.showStatusMessage(\n                `Failed to decode ${channel.label} channel`,\n                3000\n              );\n              return;\n            }\n\n            const texture = new Texture({\n              name: `${selected?.name}_${key}`,\n              keep_size: false,\n            }).fromDataURL(canvas.toDataURL());\n\n            texture.add(true);\n\n            mat.saveTexture(channel, texture);\n          });\n\n          Undo.finishEdit(\"Decode MER to textures\");\n        },\n      },\n      {\n        icon: \"move_group\",\n        name: \"Decode MER to Layers\",\n        description:\n          \"Decodes a MER texture map into metalness, emissive, and roughness channels into material layers\",\n        condition: () => getSelectedTexture()?.layers_enabled === true,\n        click() {\n          const selected = getSelectedTexture() ?? Texture.getDefault();\n\n          const mat = new PbrMaterial(\n            selected.layers_enabled ? selected.layers : [selected],\n            selected.uuid\n          );\n\n          const mer = mat.decodeMer();\n          const merChannels = [\n            CHANNELS.metalness,\n            CHANNELS.emissive,\n            CHANNELS.roughness,\n          ];\n\n          Undo.initEdit({ textures: [selected] });\n\n          merChannels.forEach((channel) => {\n            const key = channel.id as keyof typeof mer;\n            const canvas = mer[key];\n\n            if (!canvas) {\n              Blockbench.showStatusMessage(\n                `Failed to decode ${channel.label} channel`,\n                3000\n              );\n              return;\n            }\n\n            const layer = new TextureLayer(\n              {\n                name: `${selected?.name}_${key}`,\n                data_url: canvas.toDataURL(),\n              },\n              selected\n            );\n\n            mat.saveTexture(channel, layer);\n\n            layer.addForEditing();\n          });\n\n          Undo.finishEdit(\"Decode MER to layers\");\n        },\n      },\n    ],\n    click() {},\n  });\n\n  MenuBar.addAction(registry.decodeMer, \"tools\");\n  MenuBar.addAction(registry.generateMer, \"file.export\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(`file.export.create_mer`);\n  MenuBar.removeAction(`tools.decode_mer`);\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/textureSet.ts",
    "content": "import { CHANNELS, registry, setups, teardowns } from \"../../constants\";\nimport { exportMer } from \"../mer\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport { getOutputBaseName } from \"../util\";\n\nconst createTextureSetDialog = () => {\n  if (!Project) {\n    return;\n  }\n  Project.textures.forEach((t) => {\n    const mat = new PbrMaterial(null, t.uuid);\n\n    const projectNormalMap = mat.findTexture(CHANNELS.normal, false);\n    const projectHeightMap = mat.findTexture(CHANNELS.height, false);\n    const projectColorMap = mat.findTexture(CHANNELS.albedo, false);\n    const projectMetalnessMap = mat.findTexture(\n      CHANNELS.metalness,\n      false\n    )?.name;\n    const projectEmissiveMap = mat.findTexture(CHANNELS.emissive, false)?.name;\n    const projectRoughnessMap = mat.findTexture(\n      CHANNELS.roughness,\n      false\n    )?.name;\n\n    const form: DialogOptions[\"form\"] = {};\n\n    if (!projectColorMap) {\n      form.baseColor = {\n        type: \"color\",\n        label: \"Base Color\",\n        value: \"#ff00ff\",\n      };\n    }\n\n    if (!projectMetalnessMap && !projectEmissiveMap && !projectRoughnessMap) {\n      form.metalness = {\n        label: \"Metalness\",\n        type: \"range\",\n        min: 0,\n        max: 255,\n        step: 1,\n        value: 0,\n      };\n\n      form.emissive = {\n        label: \"Emissive\",\n        type: \"range\",\n        min: 0,\n        max: 255,\n        step: 1,\n        value: 0,\n      };\n\n      form.roughness = {\n        label: \"Roughness\",\n        type: \"range\",\n        min: 0,\n        max: 255,\n        step: 1,\n        value: 0,\n      };\n    }\n\n    if (projectNormalMap) {\n      form.depthMap = {\n        type: \"checkbox\",\n        label: \"Normal Map\",\n        value: \"normal\",\n      };\n    }\n\n    if (projectHeightMap) {\n      form.depthMap = {\n        type: \"checkbox\",\n        label: \"Height Map\",\n        value: \"heightmap\",\n      };\n    }\n\n    if (projectNormalMap && projectHeightMap) {\n      form.depthMap = {\n        type: \"radio\",\n        label: \"Depth Map\",\n        options: {\n          normal: \"Normal Map\",\n          heightmap: \"Height\",\n        },\n        value: \"normal\",\n      };\n    }\n\n    registry.textureSetDialog = new Dialog(\"texture_set\", {\n      id: \"texture_set\",\n      title: \"Create Texture Set JSON\",\n      buttons: [\"Create\", \"Cancel\"],\n      form,\n      cancelIndex: 1,\n      onConfirm(formResult: Record<string, any>) {\n        const baseName = getOutputBaseName();\n\n        const hasMer =\n          projectMetalnessMap || projectEmissiveMap || projectRoughnessMap;\n\n        const textureSet: {\n          format_version: string;\n          \"minecraft:texture_set\": {\n            color: string;\n            metalness_emissive_roughness: [number, number, number];\n            normal?: string;\n            heightmap?: string;\n          };\n        } = {\n          format_version: \"1.16.100\",\n          \"minecraft:texture_set\": {\n            color:\n              (projectColorMap\n                ? baseName // pathToName(projectColorMap.name, false)\n                : formResult.baseColor?.toHexString()) ?? baseName,\n            metalness_emissive_roughness: [\n              formResult.metalness ?? 0,\n              formResult.emissive ?? 0,\n              formResult.roughness ?? 255,\n            ],\n          },\n        };\n\n        if (\n          (formResult.depthMap === \"normal\" && projectNormalMap) ||\n          (!projectHeightMap && projectNormalMap)\n        ) {\n          textureSet[\"minecraft:texture_set\"].normal = `${baseName}_normal`;\n        } else if (\n          (!projectNormalMap || formResult.depthMap === \"heightmap\") &&\n          projectHeightMap\n        ) {\n          textureSet[\"minecraft:texture_set\"].heightmap =\n            `${baseName}_heightmap`;\n        }\n\n        const exportDepthMap = (cb: () => void) => {\n          if (!formResult.depthMap) {\n            return cb();\n          }\n\n          const useNormalMap =\n            formResult.depthMap === \"normal\" ||\n            (formResult.depthMap && !projectHeightMap);\n\n          const depthMap = useNormalMap ? projectNormalMap : projectHeightMap;\n\n          if (!depthMap) {\n            return cb();\n          }\n\n          Blockbench.export(\n            {\n              content: depthMap.canvas.toDataURL() ?? \"\",\n              type: \"PNG\",\n              name: `${baseName}_${useNormalMap ? \"normal\" : \"heightmap\"}`,\n              extensions: [\"png\"],\n              resource_id: formResult.depthMap,\n              startpath: Project.export_path,\n              savetype: \"image\",\n            },\n            (filePath) => {\n              textureSet[\"minecraft:texture_set\"][\n                useNormalMap ? \"normal\" : \"heightmap\"\n              ] = pathToName(filePath, false);\n              cb();\n            }\n          );\n        };\n\n        const exportBaseColor = (cb: () => void) => {\n          if (!projectColorMap) {\n            return cb();\n          }\n\n          Blockbench.export(\n            {\n              content: projectColorMap.canvas.toDataURL(),\n              extensions: [\"png\"],\n              type: \"PNG\",\n              name: baseName,\n              startpath: Project.export_path,\n              savetype: \"image\",\n            },\n            (filePath) => {\n              textureSet[\"minecraft:texture_set\"].color = pathToName(\n                filePath,\n                false\n              );\n              cb();\n            }\n          );\n        };\n\n        const exportTextureSet = () =>\n          exportDepthMap(() => {\n            exportBaseColor(() => {\n              Blockbench.export(\n                {\n                  content: JSON.stringify(textureSet, null, 2),\n                  type: \"JSON\",\n                  name: `${baseName}.texture_set`,\n                  extensions: [\"json\"],\n                  resource_id: \"texture_set\",\n                  startpath: Project.export_path,\n                  savetype: \"text\",\n                },\n                () => {\n                  Blockbench.showQuickMessage(\"Texture set created\", 2000);\n                  registry.textureSetDialog?.hide();\n                }\n              );\n            });\n          });\n\n        if (hasMer) {\n          try {\n            exportMer(baseName, (filePath) => {\n              textureSet[\"minecraft:texture_set\"].metalness_emissive_roughness =\n                pathToName(filePath, false);\n              exportTextureSet();\n            });\n          } catch (err) {\n            console.warn(\"Failed to export MER map:\", err);\n            Blockbench.showStatusMessage(\"Failed to export MER map\", 3000);\n          }\n          return;\n        }\n\n        exportTextureSet();\n      },\n    });\n\n    return registry.textureSetDialog.show();\n  });\n};\n\nsetups.push(() => {\n  registry.createTextureSet = new Action(\"create_texture_set\", {\n    name: \"Create Texture Set\",\n    icon: \"layers\",\n    description:\n      \"Creates a texture set JSON file. Generates a MER when metalness, emissive, or roughness channels are set.\",\n    click() {\n      createTextureSetDialog();\n    },\n    condition: {\n      formats: [\"bedrock\", \"bedrock_block\"],\n      project: true,\n    },\n  });\n\n  MenuBar.addAction(registry.createTextureSet, \"file.export\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(`file.export.create_texture_set`);\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/toggleLights.ts",
    "content": "import { registry, setups, teardowns } from \"../../constants\";\nimport { applyPbrMaterial } from \"../applyPbrMaterial\";\n\nsetups.push(() => {\n  registry.toggleCorrectLights = new Toggle(\"correct_lights\", {\n    category: \"preview\",\n    name: \"Correct Lights\",\n    description: \"Corrects the lighting in the preview\",\n    icon: \"fluorescent\",\n    default: false,\n    onChange(value) {\n      Preview.all.forEach((preview) => {\n        preview.renderer.physicallyCorrectLights = value;\n      });\n\n      Preview.selected.renderer.physicallyCorrectLights = value;\n\n      Blockbench.showQuickMessage(\n        `Physically corrected lighting is now ${value ? \"enabled\" : \"disabled\"}`,\n        2000\n      );\n\n      if (value) {\n        // @ts-expect-error Set method exists on the toggle\n        registry.togglePbr?.set(true);\n      }\n\n      applyPbrMaterial();\n    },\n    click() {},\n  });\n\n  MenuBar.addAction(registry.toggleCorrectLights, \"preview\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"preview.correct_lights\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/togglePbr.ts",
    "content": "import { registry, setups, teardowns } from \"../../constants\";\nimport { applyPbrMaterial } from \"../applyPbrMaterial\";\nimport { disablePbr } from \"../disablePbr\";\n\n/**\n * List of Blockbench events which trigger a PBR material update\n */\nconst subscribeToEvents: EventName[] = [\n  \"undo\",\n  \"redo\",\n  \"add_texture\",\n  \"finish_edit\",\n  \"finished_edit\",\n  \"load_project\",\n  \"select_preview_scene\",\n  \"change_texture_path\",\n  \"select_project\",\n  \"load_undo_save\",\n  \"add_cube\",\n];\n\n/**\n * Conditionally triggers the PBR material update based on the `pbr_active` setting\n * @returns void\n */\nconst renderPbrScene = () =>\n  Project && Project.pbr_active && applyPbrMaterial();\n\nconst enableListeners = () => {\n  Blockbench.on(subscribeToEvents.join(\" \") as EventName, renderPbrScene);\n};\n\nconst disableListeners = () => {\n  subscribeToEvents.forEach((event) => {\n    Blockbench.removeListener(event as EventName, renderPbrScene);\n  });\n};\n\nsetups.push(() => {\n  registry.togglePbr = new Toggle(\"toggle_pbr\", {\n    name: \"PBR Preview\",\n    description: \"Toggle PBR Preview\",\n    icon: \"panorama_photosphere\",\n    category: \"view\",\n    default: false,\n    click() {},\n    onChange(value) {\n      if (value) {\n        applyPbrMaterial();\n        enableListeners();\n\n        Blockbench.showQuickMessage(\"PBR Preview is now enabled\");\n\n        return;\n      }\n      disablePbr();\n      disableListeners();\n\n      Blockbench.showQuickMessage(\"PBR Preview is now disabled\");\n    },\n  });\n\n  MenuBar.addAction(registry.togglePbr, \"view\");\n});\n\nteardowns.push(() => {\n  disableListeners();\n  MenuBar.removeAction(\"view.toggle_pbr\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/tonemapping.ts",
    "content": "import { registry, setups } from \"../../constants\";\nimport { three as THREE } from \"../../deps\";\nimport {\n  applyPbrMaterial,\n  debounceApplyPbrMaterial,\n} from \"../applyPbrMaterial\";\n\nconst setPreviewExposure = (value: number) => {\n  const exposureValue = Math.max(-2, Math.min(2, value));\n  Preview.all.forEach((preview) => {\n    preview.renderer.toneMappingExposure = exposureValue;\n  });\n\n  Preview.selected.renderer.toneMappingExposure = exposureValue;\n};\n\nsetups.push(() => {\n  registry.exposureSlider = new NumSlider(\"display_settings_exposure\", {\n    category: \"preview\",\n    name: \"Exposure\",\n    description: \"Adjusts the exposure of the scene\",\n    type: \"number\",\n    value: 1,\n    icon: \"exposure\",\n    settings: {\n      min: -2,\n      max: 2,\n      step: 0.01,\n      default: 1,\n    },\n    // condition: () => Number(tonemappingSelect.get()) !== THREE.NoToneMapping,\n    onBefore() {\n      if (Number(registry.tonemappingSelect?.get()) === THREE.NoToneMapping) {\n        // @ts-expect-error `.change()` does not require an Event for its value\n        registry.tonemappingSelect.change(THREE.LinearToneMapping.toString());\n      }\n      // @ts-expect-error Set method exists on the toggle\n      registry.togglePbr?.set(true);\n    },\n    onChange(value) {\n      setPreviewExposure(Number(value));\n    },\n    onAfter() {\n      debounceApplyPbrMaterial();\n    },\n  });\n\n  registry.resetExposureButton = new Action(\"display_settings_reset_exposure\", {\n    category: \"preview\",\n    name: \"Reset Exposure\",\n    description: \"Resets the exposure of the scene\",\n    icon: \"exposure_plus_1\",\n    condition: () =>\n      registry.exposureSlider !== undefined &&\n      Number(registry.exposureSlider?.get()) !== 1,\n    click() {\n      setPreviewExposure(1);\n      registry.exposureSlider?.setValue(1, true);\n\n      debounceApplyPbrMaterial();\n    },\n  });\n\n  registry.tonemappingSelect = new BarSelect(\"display_settings_tone_mapping\", {\n    category: \"preview\",\n    name: \"Tone Mapping\",\n    description: \"Changes the tone mapping of the preview\",\n    type: \"select\",\n    default_value: THREE.NoToneMapping,\n    value: Preview.selected.renderer.toneMapping ?? THREE.NoToneMapping,\n    icon: \"monochrome_photos\",\n    options: {\n      [THREE.NoToneMapping]: \"No Tone Mapping\",\n      [THREE.LinearToneMapping]: \"Linear\",\n      [THREE.ReinhardToneMapping]: \"Reinhard\",\n      [THREE.CineonToneMapping]: \"Cineon\",\n      [THREE.ACESFilmicToneMapping]: \"ACES\",\n    },\n    onChange({ value }) {\n      Preview.selected.renderer.toneMapping = Number(\n        value\n      ) as THREE.ToneMapping;\n\n      let currentExposure = 1;\n      if (Preview.selected.renderer.toneMapping === THREE.NoToneMapping) {\n        registry.exposureSlider?.setValue(currentExposure, true);\n      } else {\n        currentExposure = Number(registry.exposureSlider?.get() ?? 1);\n      }\n\n      Preview.all.forEach((preview) => {\n        preview.renderer.toneMapping = Number(value) as THREE.ToneMapping;\n        preview.renderer.toneMappingExposure = currentExposure;\n      });\n\n      Preview.selected.renderer.toneMappingExposure = currentExposure;\n\n      Blockbench.showQuickMessage(\n        `Tone mapping set to ${this.getNameFor(value)}`,\n        2000,\n      );\n\n      if (registry.togglePbr && !registry.togglePbr.value) {\n        registry.togglePbr.set(true);\n      }\n\n      applyPbrMaterial();\n    },\n  });\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/actions/usdz.ts",
    "content": "import { CHANNELS, registry, setups, teardowns } from \"../../constants\";\nimport { three as THREE } from \"../../deps\";\nimport { getOutputBaseName } from \"../util\";\nimport USDZExporter from \"../io/UsdzExporter\";\nimport { applyPbrMaterial } from \"../applyPbrMaterial\";\nimport PbrMaterial from \"../PbrMaterials\";\nimport { createNormalMap } from \"../normalMap\";\n\nsetups.push(() => {\n  const usdz = new Codec(\"usdz\", {\n    extension: \"usdz\",\n    name: \"USDZ\",\n    remember: true,\n    export_options: {\n      normal_type: {\n        type: \"select\",\n        label: \"Normal Map Type\",\n        default: \"opengl\",\n        options: {\n          opengl: \"OpenGL\",\n          directx: \"DirectX\",\n        },\n      },\n    },\n    fileName() {\n      return getOutputBaseName() + \".usdz\";\n    },\n    async compile(compileOptions = {}) {\n      if (!Project) {\n        throw new Error(\"No project loaded\");\n      }\n      const options = Object.assign(this.getExportOptions(), compileOptions);\n\n      Project.textures.forEach((texture) => {\n        if (!texture.material) {\n          return;\n        }\n\n        const mat = new PbrMaterial(texture.layers, texture.uuid);\n        const normal = mat.findTexture(\"normal\", true);\n\n        if (!normal) {\n          return;\n        }\n\n        const normalMap = createNormalMap(normal, options.normal_type);\n\n        if (normalMap) {\n          mat.saveTexture(CHANNELS.normal, normalMap);\n        }\n      });\n\n      applyPbrMaterial();\n\n      const exporter = new USDZExporter();\n      const scene = new THREE.Scene();\n\n      scene.name = \"blockbench_export\";\n      scene.add(Project.model_3d);\n\n      const result = await exporter.parse(scene);\n\n      this.dispatchEvent(\"compile\", { model: result, options });\n\n      Canvas.scene.add(Project.model_3d);\n\n      return result;\n    },\n    async export(options = {}) {\n      const content = await this.compile(options);\n      Blockbench.export(\n        {\n          content,\n          name: this.fileName(),\n          startpath: this.startPath(),\n          resource_id: \"usdz\",\n          type: this.name,\n          extensions: [\"usdz\"],\n          savetype: \"buffer\",\n        },\n        (path) => this.afterDownload(path)\n      );\n    },\n  });\n\n  registry.exportUsdz = new Action(\"export_usdz\", {\n    category: \"file\",\n    name: \"Export USDZ\",\n    description: \"Exports the current model as a USDZ file\",\n    icon: \"stacks\",\n    async click() {\n      if (!usdz) {\n        return;\n      }\n      const options = await usdz.promptExportOptions();\n      await usdz.export(options);\n    },\n  });\n\n  registry.usdz = usdz;\n\n  MenuBar.addAction(registry.exportUsdz, \"file.export\");\n});\n\nteardowns.push(() => {\n  MenuBar.removeAction(\"file.export_usdz\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/applyPbrMaterial.ts",
    "content": "import { three as THREE } from \"../deps\";\nimport PbrMaterial from \"./PbrMaterials\";\nimport { debounce } from \"./util\";\n\nfunction applyToFace(\n  face: CubeFace | MeshFace,\n  materialParams: THREE.MeshStandardMaterialParameters\n) {\n  const texture = face.getTexture();\n\n  if (!texture || !Project) {\n    return null;\n  }\n\n  const projectMaterial = Project.materials[texture.uuid];\n\n  if (projectMaterial.isShaderMaterial && !Project.bb_materials[texture.uuid]) {\n    Project.bb_materials[texture.uuid] = projectMaterial;\n  } else if (projectMaterial.isMeshStandardMaterial) {\n    projectMaterial.dispose();\n  }\n\n  const material = new PbrMaterial(\n    texture.layers_enabled\n      ? texture.layers.filter((layer) => layer.visible) ?? null\n      : Project.textures,\n    texture.uuid\n  ).getMaterial({\n    side: Canvas.getRenderSide(texture) as THREE.Side,\n    ...materialParams,\n    alphaTest: 0.01,\n  });\n\n  Project.materials[texture.uuid] = THREE.ShaderMaterial.prototype.copy.call(\n    material,\n    projectMaterial\n  );\n\n  return texture;\n}\n\nfunction updateFaces(applied: Record<string, Texture>) {\n  return (\n    Object.values(applied).filter((texture) => {\n      if (texture) {\n        Canvas.updateAllFaces(texture);\n        return true;\n      }\n\n      return false;\n    }).length > 0\n  );\n}\n\nfunction applyToMesh(\n  mesh: Mesh,\n  materialParams: THREE.MeshStandardMaterialParameters\n) {\n  const applied: Record<string, Texture> = {};\n  mesh.forAllFaces((face) => {\n    const texture = applyToFace(face, materialParams);\n\n    if (texture) {\n      applied[texture.uuid] = texture;\n    }\n  });\n\n  return applied;\n}\n\nfunction applyToCube(\n  cube: Cube,\n  materialParams: THREE.MeshStandardMaterialParameters\n) {\n  const applied: Record<string, Texture> = {};\n\n  Object.keys(cube.faces).forEach((key) => {\n    const face = cube.faces[key];\n    const texture = applyToFace(face, materialParams);\n\n    if (texture) {\n      applied[texture.uuid] = texture;\n    }\n  });\n\n  return applied;\n}\n\n/**\n * ### Apply PBR Material\n * Iterates over all faces in the project and applies a PBR material to each face\n * @param materialParams Parameters to extend the base material with\n * @returns `THREE.MeshStandardMaterial` with PBR textures applied\n */\nexport const applyPbrMaterial = (\n  materialParams: THREE.MeshStandardMaterialParameters = {}\n) => {\n  if (!Project) {\n    return;\n  }\n\n  const appliedTextures = Project.elements.map(\n    (item) =>\n      (item instanceof Mesh && applyToMesh(item, materialParams)) ||\n      (item instanceof Cube && applyToCube(item, materialParams))\n  );\n\n  const allTextures = appliedTextures.reduce(\n    (acc, val) => ({ ...acc, ...val }),\n    {}\n  );\n\n  // @ts-expect-error - Property 'pbr_active' does not exist on type 'Project'\n  Project.pbr_active =\n    Texture.all.length > 0 && allTextures && updateFaces(allTextures);\n};\n\nexport const debounceApplyPbrMaterial = (wait = 100) =>\n  debounce(applyPbrMaterial, wait);\n"
  },
  {
    "path": "src/pbr_preview/src/lib/bakery.ts",
    "content": "import type { ILightrParams } from \"../types\";\nimport { CHANNELS } from \"../constants\";\nimport PbrMaterial from \"./PbrMaterials\";\nimport { Lightr } from \"./Lightr\";\n\nexport const bakeTextures = (\n  params: ILightrParams,\n  directions = 8,\n  blendEmissive = false,\n) => {\n  if (!Project) {\n    return;\n  }\n\n  const selected = Project.selected_texture ?? Texture.getDefault();\n\n  const mat = new PbrMaterial(\n    selected.layers_enabled ? selected.layers : Project.textures,\n    selected.uuid,\n  );\n\n  const texture = mat.findTexture(CHANNELS.albedo);\n\n  if (!texture) {\n    Blockbench.showStatusMessage(\n      \"Can not bake without a base color assigned.\",\n      3000,\n    );\n    return;\n  }\n\n  let normalMap = mat.findTexture(CHANNELS.normal);\n\n  // TODO: Generate normal map automatically when needed and possible\n  //   const heightmap = mat.findTexture(CHANNELS.height);\n  //   if (!normalMap && heightmap) {\n  //     normalMap = PbrMaterial.createNormalMap(heightmap, false);\n  //   }\n\n  if (!normalMap) {\n    Blockbench.showStatusMessage(\n      \"Can not bake without a normal map assigned.\",\n      3000,\n    );\n    return;\n  }\n\n  const lightr = new Lightr(params);\n  const bakedImages = lightr.bake(directions, texture.canvas, normalMap.canvas);\n\n  const bakedTexture = new Texture({\n    name: `${texture.name}_baked`,\n    saved: false,\n    particle: false,\n    keep_size: false,\n    // @ts-expect-error Layers enabled can be set here\n    layers_enabled: true,\n  }).fromDataURL(bakedImages[0].toDataURL());\n\n  const addEmissive = blendEmissive\n    ? (canvas: HTMLCanvasElement) => {\n        const emissive = mat.findTexture(CHANNELS.emissive);\n\n        if (!emissive) {\n          return canvas;\n        }\n\n        const emissiveCanvas = emissive.canvas;\n        const emissiveCtx = emissiveCanvas.getContext(\"2d\");\n\n        if (!emissiveCtx) {\n          return canvas;\n        }\n\n        const width = Math.max(\n          canvas.width,\n          emissiveCanvas.width,\n          Project ? Project.texture_width : 16,\n        );\n        const height = Math.max(\n          canvas.height,\n          emissiveCanvas.height,\n          Project ? Project.texture_height : 16,\n        );\n\n        const mergedCanvas = document.createElement(\"canvas\");\n        mergedCanvas.width = width;\n        mergedCanvas.height = height;\n\n        const mergedCtx = mergedCanvas.getContext(\"2d\");\n\n        if (!mergedCtx) {\n          return canvas;\n        }\n\n        mergedCtx.drawImage(canvas, 0, 0);\n        mergedCtx.globalCompositeOperation = \"screen\";\n        mergedCtx.drawImage(emissiveCanvas, 0, 0);\n\n        return mergedCanvas;\n      }\n    : (canvas: HTMLCanvasElement) => canvas;\n\n  bakedImages.forEach((image, idx) => {\n    const layer = new TextureLayer(\n      {\n        name: `baked_${idx + 1}`,\n        data_url: addEmissive(image).toDataURL(),\n      },\n      bakedTexture,\n    );\n\n    layer.addForEditing();\n  });\n\n  bakedTexture.add().select();\n\n  Blockbench.showQuickMessage(\"Textures baked 🥐\", 2000);\n};\n"
  },
  {
    "path": "src/pbr_preview/src/lib/disablePbr.ts",
    "content": "/**\n * ### Disable PBR\n * Reverts all faces in the project to their original materials\n * @returns void\n */\nexport const disablePbr = () => {\n  if (!Project || !Project.bb_materials) {\n    return;\n  }\n\n  Project.elements.forEach((item) => {\n    if (!(item instanceof Cube)) {\n      return;\n    }\n\n    Object.keys(item.faces).forEach((key) => {\n      const face = item.faces[key];\n      const texture = face.getTexture();\n\n      if (!texture) {\n        return;\n      }\n\n      const projectMaterial = Project.bb_materials[texture.uuid];\n\n      if (!projectMaterial) {\n        return;\n      }\n\n      Project.materials[texture.uuid] = projectMaterial;\n    });\n  });\n\n  Project.pbr_active = false;\n  Canvas.updateAll();\n};\n"
  },
  {
    "path": "src/pbr_preview/src/lib/io/UsdzExporter.ts",
    "content": "import { three as THREE, jszip as JSZip } from \"../../deps\";\n\nclass USDZExporter {\n  async parse(scene: THREE.Scene): Promise<Uint8Array> {\n    const zip = new JSZip();\n    const modelFileName = \"model.usda\"; // model file should be first in USDZ archive so we init it here\n\n    zip.file(modelFileName, \"\");\n    let output: string | null = buildHeader();\n    const materials: Record<string, THREE.Material> = {};\n    const textures: Record<string, THREE.Texture> = {};\n    scene.traverseVisible((object) => {\n      if (!(object as THREE.Mesh).isMesh) {\n        return;\n      }\n      const mesh = object as THREE.Mesh;\n      if (\n        !(mesh.material as THREE.MeshStandardMaterial).isMeshStandardMaterial\n      ) {\n        console.warn(\n          \"THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)\",\n          object\n        );\n        return;\n      }\n      const geometry = mesh.geometry;\n      const material = mesh.material as THREE.MeshStandardMaterial;\n      const geometryFileName = \"geometries/Geometry_\" + geometry.id + \".usd\";\n\n      if (!zip.file(geometryFileName)) {\n        const meshObject = buildMeshObject(geometry);\n        zip.file(geometryFileName, buildUSDFileAsString(meshObject));\n      }\n\n      if (!(material.uuid in materials)) {\n        materials[material.uuid] = material;\n      }\n\n      output += buildXform(mesh, geometry, material);\n    });\n    output += buildMaterials(materials, textures);\n    zip.file(modelFileName, output);\n    output = null;\n\n    for (const id in textures) {\n      const texture = textures[id];\n      const color = id.split(\"_\")[1];\n      const isRGBA = texture.format === THREE.RGBAFormat;\n      const canvas = imageToCanvas(texture.image, color);\n      const blob = await new Promise<Blob>((resolve) =>\n        canvas.toBlob(\n          (v) => v && resolve(v),\n          isRGBA ? \"image/png\" : \"image/jpeg\",\n          1\n        )\n      );\n      const arrayBuffer = await blob.arrayBuffer();\n      zip.file(`textures/Texture_${id}.${isRGBA ? \"png\" : \"jpg\"}`, arrayBuffer);\n    }\n\n    // 64 byte alignment\n    let offset = 0;\n\n    zip.forEach(async (relativePath: string) => {\n      const headerSize = 34 + relativePath.length;\n      offset += headerSize;\n      const offsetMod64 = offset & 63;\n      const content = await zip.file(relativePath)!.async(\"uint8array\");\n\n      if (offsetMod64 !== 4) {\n        const padLength = 64 - offsetMod64;\n        const padding = new Uint8Array(padLength);\n        const newContent = new Uint8Array(content.length + padLength);\n        newContent.set(content, 0);\n        newContent.set(padding, content.length);\n        zip.file(relativePath, newContent);\n      }\n\n      offset += content.length;\n    });\n\n    const zipBlob = await zip.generateAsync({\n      type: \"blob\",\n      compression: \"STORE\",\n    });\n    return new Uint8Array(await zipBlob.arrayBuffer());\n  }\n}\n\nfunction imageToCanvas(\n  image: HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap,\n  color?: string\n): HTMLCanvasElement {\n  if (\n    (typeof HTMLImageElement !== \"undefined\" &&\n      image instanceof HTMLImageElement) ||\n    (typeof HTMLCanvasElement !== \"undefined\" &&\n      image instanceof HTMLCanvasElement) ||\n    (typeof OffscreenCanvas !== \"undefined\" &&\n      image instanceof OffscreenCanvas) ||\n    (typeof ImageBitmap !== \"undefined\" && image instanceof ImageBitmap)\n  ) {\n    const scale = 1024 / Math.max(image.width, image.height);\n    const canvas = document.createElement(\"canvas\");\n    canvas.width = image.width * Math.min(1, scale);\n    canvas.height = image.height * Math.min(1, scale);\n    const context = canvas.getContext(\"2d\")!;\n\n    // Use nearest neighbor for scaling\n    context.imageSmoothingEnabled = false;\n\n    context.drawImage(image, 0, 0, canvas.width, canvas.height);\n\n    if (color !== undefined) {\n      const hex = parseInt(color, 16);\n      const r = ((hex >> 16) & 255) / 255;\n      const g = ((hex >> 8) & 255) / 255;\n      const b = (hex & 255) / 255;\n      const imagedata = context.getImageData(0, 0, canvas.width, canvas.height);\n      const data = imagedata.data;\n\n      for (let i = 0; i < data.length; i += 4) {\n        data[i + 0] = data[i + 0] * r;\n        data[i + 1] = data[i + 1] * g;\n        data[i + 2] = data[i + 2] * b;\n      }\n\n      context.putImageData(imagedata, 0, 0);\n    }\n\n    return canvas;\n  }\n\n  throw new Error(\"Unsupported image type\");\n}\n\nconst PRECISION = 7;\n\nfunction buildHeader(): string {\n  return `#usda 1.0\n(\n    customLayerData = {\n        string creator = \"Blockbench USDZExporter\"\n    }\n    metersPerUnit = 1\n    upAxis = \"Y\"\n)\n\n`;\n}\n\nfunction buildUSDFileAsString(dataToInsert: string): string {\n  let output = buildHeader();\n  output += dataToInsert;\n  return output;\n}\n\nfunction buildXform(\n  object: THREE.Object3D,\n  geometry: THREE.BufferGeometry,\n  material: THREE.Material\n): string {\n  const name = \"Object_\" + object.id;\n  const transform = buildMatrix(object.matrixWorld);\n\n  if (object.matrixWorld.determinant() < 0) {\n    console.warn(\n      \"THREE.USDZExporter: USDZ does not support negative scales\",\n      object\n    );\n  }\n\n  return `def Xform \"${name}\" (\n    prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>\n)\n{\n    matrix4d xformOp:transform = ${transform}\n    uniform token[] xformOpOrder = [\"xformOp:transform\"]\n\n    rel material:binding = </Materials/Material_${material.id}>\n}\n\n`;\n}\n\nfunction buildMatrix(matrix: THREE.Matrix4): string {\n  const array = matrix.elements;\n  return `( ${buildMatrixRow(array, 0)}, ${buildMatrixRow(array, 4)}, ${buildMatrixRow(array, 8)}, ${buildMatrixRow(array, 12)} )`;\n}\n\nfunction buildMatrixRow(array: number[], offset: number): string {\n  return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`;\n}\n\nfunction buildMeshObject(geometry: THREE.BufferGeometry): string {\n  const mesh = buildMesh(geometry);\n  return `\ndef \"Geometry\"\n{\n  ${mesh}\n}\n`;\n}\n\nfunction buildMesh(geometry: THREE.BufferGeometry): string {\n  const name = \"Geometry\";\n  const attributes = geometry.attributes;\n  const count = attributes.position.count;\n  return `\n    def Mesh \"${name}\"\n    {\n        int[] faceVertexCounts = [${buildMeshVertexCount(geometry)}]\n        int[] faceVertexIndices = [${buildMeshVertexIndices(geometry)}]\n        normal3f[] normals = [${buildVector3Array(attributes.normal as THREE.BufferAttribute, count)}] (\n            interpolation = \"vertex\"\n        )\n        point3f[] points = [${buildVector3Array(attributes.position as THREE.BufferAttribute, count)}]\n        float2[] primvars:st = [${buildVector2Array(attributes.uv as THREE.BufferAttribute, count)}] (\n            interpolation = \"vertex\"\n        )\n        uniform token subdivisionScheme = \"none\"\n    }\n`;\n}\n\nfunction buildMeshVertexCount(geometry: THREE.BufferGeometry): string {\n  const count =\n    geometry.index !== null\n      ? geometry.index.count\n      : geometry.attributes.position.count;\n  return Array(count / 3)\n    .fill(3)\n    .join(\", \");\n}\n\nfunction buildMeshVertexIndices(geometry: THREE.BufferGeometry): string {\n  const index = geometry.index;\n  const array: number[] = [];\n\n  if (index !== null) {\n    for (let i = 0; i < index.count; i++) {\n      array.push(index.getX(i));\n    }\n  } else {\n    const length = geometry.attributes.position.count;\n\n    for (let i = 0; i < length; i++) {\n      array.push(i);\n    }\n  }\n\n  return array.join(\", \");\n}\n\nfunction buildVector3Array(\n  attribute: THREE.BufferAttribute,\n  count: number\n): string {\n  if (attribute === undefined) {\n    console.warn(\"USDZExporter: Normals missing.\");\n    return Array(count).fill(\"(0, 0, 0)\").join(\", \");\n  }\n\n  const array: string[] = [];\n\n  for (let i = 0; i < attribute.count; i++) {\n    const x = attribute.getX(i);\n    const y = attribute.getY(i);\n    const z = attribute.getZ(i);\n    array.push(\n      `(${x.toPrecision(PRECISION)}, ${y.toPrecision(PRECISION)}, ${z.toPrecision(PRECISION)})`\n    );\n  }\n\n  return array.join(\", \");\n}\n\nfunction buildVector2Array(\n  attribute: THREE.BufferAttribute,\n  count: number\n): string {\n  if (attribute === undefined) {\n    console.warn(\"USDZExporter: UVs missing.\");\n    return Array(count).fill(\"(0, 0)\").join(\", \");\n  }\n\n  const array: string[] = [];\n\n  for (let i = 0; i < attribute.count; i++) {\n    const x = attribute.getX(i);\n    const y = attribute.getY(i);\n    array.push(\n      `(${x.toPrecision(PRECISION)}, ${Number(y.toPrecision(PRECISION))})`\n    );\n  }\n  return array.join(\", \");\n}\n\nfunction buildMaterials(\n  materials: { [key: string]: THREE.Material },\n  textures: { [key: string]: THREE.Texture }\n): string {\n  const array: string[] = [];\n\n  for (const uuid in materials) {\n    const material = materials[uuid];\n    array.push(buildMaterial(material, textures));\n  }\n\n  return `def \"Materials\"\n{\n${array.join(\"\")}\n}\n\n`;\n}\n\nfunction buildMaterial(\n  material: THREE.Material,\n  textures: { [key: string]: THREE.Texture }\n): string {\n  // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n  const pad = \"            \";\n  const inputs: string[] = [];\n  const samplers: string[] = [];\n\n  function buildTexture(\n    texture: THREE.Texture,\n    mapType: string,\n    color?: THREE.Color\n  ): string {\n    const id = texture.id + (color ? \"_\" + color.getHexString() : \"\");\n    const isRGBA = texture.format === THREE.RGBAFormat;\n    textures[id] = texture;\n    return `\n        def Shader \"Transform2d_${mapType}\" (\n            sdrMetadata = {\n                string role = \"math\"\n            }\n        )\n        {\n            uniform token info:id = \"UsdTransform2d\"\n            float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>\n            float2 inputs:scale = ${buildVector2(texture.repeat)}\n            float2 inputs:translation = ${buildVector2(texture.offset)}\n            float2 outputs:result\n        }\n\n        def Shader \"Texture_${texture.id}_${mapType}\"\n        {\n            uniform token info:id = \"UsdUVTexture\"\n            asset inputs:file = @textures/Texture_${id}.${isRGBA ? \"png\" : \"jpg\"}@\n            float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>\n            token inputs:wrapS = \"repeat\"\n            token inputs:wrapT = \"repeat\"\n            float outputs:r\n            float outputs:g\n            float outputs:b\n            float3 outputs:rgb\n        }`;\n  }\n\n  const mat = material as THREE.MeshStandardMaterial;\n\n  if (mat.map !== null) {\n    inputs.push(\n      `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${mat.id}/Texture_${mat.map.id}_diffuse.outputs:rgb>`\n    );\n    samplers.push(buildTexture(mat.map, \"diffuse\", mat.color));\n  } else {\n    inputs.push(`${pad}color3f inputs:diffuseColor = ${buildColor(mat.color)}`);\n  }\n\n  if (mat.emissiveMap !== null) {\n    inputs.push(\n      `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${mat.id}/Texture_${mat.emissiveMap.id}_emissive.outputs:rgb>`\n    );\n    samplers.push(buildTexture(mat.emissiveMap, \"emissive\"));\n  } else if (mat.emissive.getHex() > 0) {\n    inputs.push(\n      `${pad}color3f inputs:emissiveColor = ${buildColor(mat.emissive)}`\n    );\n  }\n\n  if (mat.normalMap !== null) {\n    inputs.push(\n      `${pad}normal3f inputs:normal.connect = </Materials/Material_${mat.id}/Texture_${mat.normalMap.id}_normal.outputs:rgb>`\n    );\n    samplers.push(buildTexture(mat.normalMap, \"normal\"));\n  }\n\n  if (mat.aoMap !== null) {\n    inputs.push(\n      `${pad}float inputs:occlusion.connect = </Materials/Material_${mat.id}/Texture_${mat.aoMap.id}_occlusion.outputs:r>`\n    );\n    samplers.push(buildTexture(mat.aoMap, \"occlusion\"));\n  }\n\n  if (mat.roughnessMap !== null && mat.roughness === 1) {\n    inputs.push(\n      `${pad}float inputs:roughness.connect = </Materials/Material_${mat.id}/Texture_${mat.roughnessMap.id}_roughness.outputs:g>`\n    );\n    samplers.push(buildTexture(mat.roughnessMap, \"roughness\"));\n  } else {\n    inputs.push(`${pad}float inputs:roughness = ${mat.roughness}`);\n  }\n\n  if (mat.metalnessMap !== null && mat.metalness === 1) {\n    inputs.push(\n      `${pad}float inputs:metallic.connect = </Materials/Material_${mat.id}/Texture_${mat.metalnessMap.id}_metallic.outputs:b>`\n    );\n    samplers.push(buildTexture(mat.metalnessMap, \"metallic\"));\n  } else {\n    inputs.push(`${pad}float inputs:metallic = ${mat.metalness}`);\n  }\n\n  if (mat.alphaMap !== null) {\n    inputs.push(\n      `${pad}float inputs:opacity.connect = </Materials/Material_${mat.id}/Texture_${mat.alphaMap.id}_opacity.outputs:r>`\n    );\n    inputs.push(`${pad}float inputs:opacityThreshold = 0.0001`);\n    samplers.push(buildTexture(mat.alphaMap, \"opacity\"));\n  } else {\n    inputs.push(`${pad}float inputs:opacity = ${mat.opacity}`);\n  }\n\n  if ((mat as any).isMeshPhysicalMaterial) {\n    const physicalMat = mat as any;\n    inputs.push(`${pad}float inputs:clearcoat = ${physicalMat.clearcoat}`);\n    inputs.push(\n      `${pad}float inputs:clearcoatRoughness = ${physicalMat.clearcoatRoughness}`\n    );\n    inputs.push(`${pad}float inputs:ior = ${physicalMat.ior}`);\n  }\n\n  return `\n    def Material \"Material_${mat.id}\"\n    {\n        def Shader \"PreviewSurface\"\n        {\n            uniform token info:id = \"UsdPreviewSurface\"\n${inputs.join(\"\\n\")}\n            int inputs:useSpecularWorkflow = 0\n            token outputs:surface\n        }\n\n        token outputs:surface.connect = </Materials/Material_${mat.id}/PreviewSurface.outputs:surface>\n        token inputs:frame:stPrimvarName = \"st\"\n\n        def Shader \"uvReader_st\"\n        {\n            uniform token info:id = \"UsdPrimvarReader_float2\"\n            token inputs:varname.connect = </Materials/Material_${mat.id}.inputs:frame:stPrimvarName>\n            float2 inputs:fallback = (0.0, 0.0)\n            float2 outputs:result\n        }\n\n${samplers.join(\"\\n\")}\n\n    }\n`;\n}\n\nfunction buildColor(color: THREE.Color): string {\n  return `(${color.r}, ${color.g}, ${color.b})`;\n}\n\nfunction buildVector2(vector: THREE.Vector2): string {\n  return `(${vector.x}, ${vector.y})`;\n}\n\nexport default USDZExporter;\n"
  },
  {
    "path": "src/pbr_preview/src/lib/io/bbmat.ts",
    "content": "import {\n  registry,\n  setups,\n  teardowns,\n  CHANNELS,\n  BBMAT_VERSION,\n  PLUGIN_VERSION,\n} from \"../../constants\";\nimport type { Channel, IBbMat } from \"../../types\";\n\nsetups.push(() => {\n  registry.bbmat = new Codec(\"material\", {\n    name: \"Blockbench Material\",\n    extension: \"bbmat\",\n    remember: false,\n    load_filter: {\n      extensions: [\"bbmat\"],\n      type: \"json\",\n    },\n    compile() {\n      if (!Texture.selected?.material || !Texture.selected?.layers_enabled) {\n        return;\n      }\n\n      const channels = Texture.selected.layers.map((layer: TextureLayer) => {\n        const channel = layer.channel;\n        const map = layer.canvas.toDataURL();\n        return [channel, map];\n      });\n\n      return JSON.stringify({\n        version: BBMAT_VERSION,\n        channels: Object.fromEntries(channels),\n      });\n    },\n    parse(content, path) {\n      content = typeof content === \"string\" ? JSON.parse(content) : content;\n      const version = content.version;\n\n      if (version !== BBMAT_VERSION) {\n        Blockbench.showMessageBox(\n          {\n            title: \"Invalid Blockbench Material Version\",\n            message: `The material file \"${path}\" is not compatible with version ${PLUGIN_VERSION} of the PBR plugin.`,\n            buttons: [\"OK\"],\n            confirm: 0,\n            width: 400,\n            cancel: 0,\n            checkboxes: {},\n          },\n          () => null\n        );\n        return {};\n      }\n\n      return content.channels as IBbMat[\"channels\"];\n    },\n    load(content, file, add) {\n      if (!Project) {\n        return;\n      }\n\n      const data = this.parse(\n        content,\n        file.path\n      ) as unknown as IBbMat[\"channels\"];\n\n      const channelKeys = Object.keys(data);\n\n      if (!channelKeys.length) {\n        throw new Error(\"No valid channels found in the material\");\n      }\n\n      let baseColor =\n        data[CHANNELS.albedo.id as Channel] ?? data[channelKeys[0] as Channel];\n\n      if (channelKeys.includes(\"preview\")) {\n        baseColor = data[\"preview\"];\n      }\n\n      const material = new Texture({\n        name: pathToName(file.name),\n        saved: true,\n        particle: false,\n        source: baseColor,\n        layers_enabled: true,\n      });\n      material.extend({ material: true });\n\n      const layers = channelKeys\n        .map((channel) => {\n          if (!(channel in CHANNELS)) {\n            return null;\n          }\n\n          const map = data[channel as Channel];\n          const layer = new TextureLayer(\n            {\n              name: channel,\n              data_url: map,\n              visible: true,\n            },\n            material\n          );\n\n          layer.extend({ channel });\n\n          return layer;\n        })\n        .filter(Boolean) as TextureLayer[];\n\n      if (!layers.length) {\n        throw new Error(\"No valid channel layers found in the material\");\n      }\n\n      if (!baseColor) {\n        material.fromDataURL(layers[0].canvas.toDataURL());\n      }\n\n      material.add().select();\n\n      layers.forEach((layer) => {\n        layer.addForEditing();\n        material.width = Math.max(material.width, layer.img.width);\n        material.height = Math.max(material.height, layer.img.height);\n      });\n      material.updateChangesAfterEdit();\n    },\n    export() {\n      Blockbench.export(\n        {\n          resource_id: \"material\",\n          type: this.name,\n          extensions: [this.extension],\n          name: `${Texture.selected?.name ?? this.fileName ?? \"material\"}.bbmat`,\n          startpath: this.startPath(),\n          content: this.compile(),\n        },\n        (path) => this.afterDownload(path)\n      );\n    },\n  });\n\n  registry.bbMatExport = new Action(\"export_bbmat\", {\n    icon: \"stacks\",\n    name: \"Save as .bbmat\",\n    category: \"file\",\n    condition: {\n      project: true,\n      selected: {\n        texture: true,\n      },\n      method() {\n        return Texture.selected?.material;\n      },\n    },\n    click() {\n      registry.bbmat?.export?.();\n    },\n  });\n\n  registry.bbMatImport = new Action(\"import_bbmat\", {\n    icon: \"stacks\",\n    name: \"Import .bbmat\",\n    category: \"file\",\n    condition: {\n      project: true,\n    },\n    click() {\n      Blockbench.import(\n        {\n          extensions: [\"bbmat\"],\n          type: \"json\",\n          title: \"Import .bbmat\",\n          multiple: true,\n        },\n        (files) => {\n          if (!registry.bbmat?.load) {\n            return;\n          }\n\n          files.forEach((file) => {\n            registry.bbmat!.load!(file.content, file, true);\n          });\n        }\n      );\n    },\n  });\n\n  registry.bbmat.export_action = registry.bbMatExport;\n  Texture.prototype.menu.addAction(registry.bbMatExport);\n  MenuBar.addAction(registry.bbMatImport, \"file.import\");\n});\n\nteardowns.push(() => {\n  Texture.prototype.menu.removeAction(\"export_bbmat\");\n  MenuBar.removeAction(\"file.import.import_bbmat\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/mer.ts",
    "content": "import PbrMaterial from \"./PbrMaterials\";\nimport { getSelectedTexture } from \"./util\";\n\n/**\n * ### Export MER map\n * Generates a MER map from the currently selected texture and exports it as a PNG file\n * @param cb Callback function to run after the MER file is exported\n * @returns void\n */\nexport const exportMer = (\n  baseName?: string,\n  cb?: (filePath: string) => void\n) => {\n  const selected = getSelectedTexture() ?? Texture.getDefault();\n\n  const mer = new PbrMaterial(\n    selected.layers_enabled\n      ? selected.layers\n      : Project\n        ? Project.textures\n        : null,\n    selected.uuid\n  ).createMer(true);\n\n  if (!mer) {\n    throw new Error(\"Failed to generate MER map from selected texture.\");\n  }\n\n  mer.toBlob(async (blob) => {\n    if (!blob) {\n      throw new Error(\"Failed to save MER map.\");\n    }\n\n    const [name, startpath] = Project\n      ? [\n          baseName\n            ? `${baseName}_mer`\n            : `${selected.name ?? Project.getDisplayName()}_mer`,\n          Project.export_path,\n        ]\n      : [\"mer\"];\n\n    Blockbench.export(\n      {\n        content: await blob.arrayBuffer(),\n        type: \"PNG\",\n        name,\n        extensions: [\"png\"],\n        resource_id: \"mer\",\n        savetype: \"image\",\n        startpath,\n      },\n      cb\n    );\n  });\n};\n"
  },
  {
    "path": "src/pbr_preview/src/lib/normalMap.ts",
    "content": "/**\n * ### Generate Normal Map\n * Generates a normal map from a height map texture\n * @param texture Height map texture\n * @param heightInAlpha Whether or not to store the height map in the alpha channel (Used in labPBR shaders for POM)\n * @param orientation Whether or not to flip the normal map vertically\n * @returns Normal map texture or layer if successful, otherwise `null`\n */\nexport function createNormalMap(\n  texture: Texture | TextureLayer,\n  orientation: \"DirectX\" | \"OpenGL\" = \"DirectX\",\n  heightInAlpha = false\n): Texture | TextureLayer | null {\n  const textureCtx = texture.canvas.getContext(\"2d\");\n\n  if (!textureCtx) {\n    return null;\n  }\n\n  const width = Math.max(\n    texture.img.width ?? texture.canvas.width,\n    Project ? Project.texture_width : 0,\n    16\n  );\n  const height = Math.max(\n    texture.img.height ?? texture.canvas.height,\n    Project ? Project.texture_height : 0,\n    16\n  );\n\n  const { data: textureData } = textureCtx.getImageData(0, 0, width, height);\n\n  const canvas = document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) {\n    return null;\n  }\n\n  const getHeight = (x: number, y: number): number => {\n    const idx = (x + y * width) * 4;\n    return textureData[idx] / 255;\n  };\n\n  canvas.width = width;\n  canvas.height = height;\n\n  ctx.drawImage(texture.img, 0, 0, width, height);\n\n  const imageData = ctx.getImageData(0, 0, width, height);\n\n  const data = imageData.data;\n\n  const normalize = (v: number[]): number[] => {\n    const length = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);\n    return [v[0] / length, v[1] / length, v[2] / length];\n  };\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      const left = getHeight(Math.max(x - 1, 0), y);\n      const right = getHeight(Math.min(x + 1, width - 1), y);\n      const top = getHeight(x, Math.max(y - 1, 0));\n      const bottom = getHeight(x, Math.min(y + 1, height - 1));\n\n      const dx = right - left;\n      const dy = bottom - top;\n      const vector = orientation === \"DirectX\" ? [dx, dy, 1] : [-dx, -dy, 1];\n      const normal = normalize(vector);\n\n      const idx = (y * width + x) * 4;\n      data[idx] = ((normal[0] + 1) / 2) * 255;\n      data[idx + 1] = ((normal[1] + 1) / 2) * 255;\n      data[idx + 2] = ((normal[2] + 1) / 2) * 255;\n      data[idx + 3] = heightInAlpha ? getHeight(x, y) * 255 : 255;\n    }\n  }\n\n  ctx.putImageData(imageData, 0, 0);\n\n  const dataUrl = canvas.toDataURL();\n\n  const name = `${texture.name.replace(/_height(map)?/i, \"\")}_normal`;\n\n  if (texture instanceof TextureLayer) {\n    const normalMapLayer = new TextureLayer(\n      {\n        name,\n        data_url: dataUrl,\n        visible: true,\n      },\n      texture.texture\n    );\n\n    normalMapLayer.addForEditing();\n\n    return normalMapLayer;\n  }\n\n  const normalMapTexture = new Texture({\n    name,\n    saved: false,\n    particle: false,\n  }).fromDataURL(dataUrl);\n\n  if (Project) {\n    normalMapTexture.add();\n  }\n\n  return normalMapTexture;\n}\n\nexport function createAoMap(\n  texture: Texture | TextureLayer\n): Texture | TextureLayer | null {\n  const textureCtx = texture.canvas.getContext(\"2d\");\n\n  if (!textureCtx) {\n    return null;\n  }\n\n  const width = Math.max(\n    texture.img.width ?? texture.canvas.width,\n    Project ? Project.texture_width : 0,\n    16\n  );\n  const height = Math.max(\n    texture.img.height ?? texture.canvas.height,\n    Project ? Project.texture_height : 0,\n    16\n  );\n\n  const { data: textureData } = textureCtx.getImageData(0, 0, width, height);\n\n  const canvas = document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) {\n    return null;\n  }\n\n  const getHeight = (x: number, y: number): number => {\n    const idx = (x + y * width) * 4;\n    return textureData[idx] / 255;\n  };\n\n  canvas.width = width;\n  canvas.height = height;\n\n  ctx.drawImage(texture.img, 0, 0, width, height);\n\n  const imageData = ctx.getImageData(0, 0, width, height);\n\n  const data = imageData.data;\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      const left = getHeight(Math.max(x - 1, 0), y);\n      const right = getHeight(Math.min(x + 1, width - 1), y);\n      const top = getHeight(x, Math.max(y - 1, 0));\n      const bottom = getHeight(x, Math.min(y + 1, height - 1));\n\n      const dx = right - left;\n      const dy = bottom - top;\n\n      const ao = Math.sqrt(dx * dx + dy * dy) * 255;\n\n      const idx = (y * width + x) * 4;\n      data[idx] = ao;\n      data[idx + 1] = ao;\n      data[idx + 2] = ao;\n      data[idx + 3] = 255;\n    }\n  }\n\n  ctx.putImageData(imageData, 0, 0);\n\n  const dataUrl = canvas.toDataURL();\n\n  const name = `${texture.name.replace(/_height(map)?/i, \"\")}_ao`;\n\n  if (texture instanceof TextureLayer) {\n    const aoMapLayer = new TextureLayer(\n      {\n        name,\n        data_url: dataUrl,\n        visible: true,\n      },\n      texture.texture\n    );\n\n    aoMapLayer.addForEditing();\n\n    return aoMapLayer;\n  }\n\n  const aoMapTexture = new Texture({\n    name,\n    saved: false,\n    particle: false,\n    keep_size: false,\n  }).fromDataURL(dataUrl);\n\n  if (Project) {\n    aoMapTexture.add();\n  }\n\n  return aoMapTexture;\n}\n\nexport function convertNormalMap(\n  texture: Texture | TextureLayer,\n  orientation: \"DirectX\" | \"OpenGL\" = \"DirectX\"\n): string | null {\n  const textureCtx = texture.canvas.getContext(\"2d\");\n\n  if (!textureCtx) {\n    return null;\n  }\n\n  const width = Math.max(\n    texture.img.width ?? texture.canvas.width,\n    Project ? Project.texture_width : 0,\n    16\n  );\n  const height = Math.max(\n    texture.img.height ?? texture.canvas.height,\n    Project ? Project.texture_height : 0,\n    16\n  );\n\n  const { data: textureData } = textureCtx.getImageData(0, 0, width, height);\n\n  const canvas = document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) {\n    return null;\n  }\n\n  const getNormal = (x: number, y: number): number[] => {\n    const idx = (x + y * width) * 4;\n    return [\n      (textureData[idx] / 255) * 2 - 1,\n      (textureData[idx + 1] / 255) * 2 - 1,\n      (textureData[idx + 2] / 255) * 2 - 1,\n    ];\n  };\n\n  canvas.width = width;\n  canvas.height = height;\n\n  ctx.drawImage(texture.img, 0, 0, width, height);\n\n  const imageData = ctx.getImageData(0, 0, width, height);\n\n  const data = imageData.data;\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      const normal = getNormal(x, y);\n\n      const [dx, dy] =\n        orientation === \"DirectX\"\n          ? [normal[0], normal[1]]\n          : [-normal[0], -normal[1]];\n\n      const idx = (y * width + x) * 4;\n      data[idx] = ((dx + 1) / 2) * 255;\n      data[idx + 1] = ((dy + 1) / 2) * 255;\n      data[idx + 2] = 0;\n      data[idx + 3] = 255;\n    }\n  }\n\n  ctx.putImageData(imageData, 0, 0);\n\n  return canvas.toDataURL();\n}\n"
  },
  {
    "path": "src/pbr_preview/src/lib/panels/channels.ts",
    "content": "import type { IChannel } from \"../../types\";\nimport {\n  registry,\n  setups,\n  CHANNELS,\n  NA_CHANNEL,\n  teardowns,\n} from \"../../constants\";\nimport { getSelectedLayer, getSelectedTexture } from \"../util\";\n\nconst filterLayers = (layer: Texture | TextureLayer) =>\n  layer.visible && layer.channel && layer.channel !== NA_CHANNEL;\n\nconst getChannels = () => {\n  const selectedLayer = getSelectedLayer();\n\n  if (selectedLayer) {\n    return selectedLayer.texture.layers.filter(filterLayers);\n  }\n\n  const selectedTexture = getSelectedTexture();\n\n  if (!selectedTexture) {\n    return [];\n  }\n\n  return selectedTexture.layers_enabled\n    ? selectedTexture.layers.filter(filterLayers)\n    : Texture.all\n        .map((t) =>\n          t.layers_enabled\n            ? [...t.layers.filter(filterLayers)]\n            : [filterLayers(t) ? t : null]\n        )\n        .flat()\n        .filter(Boolean);\n};\n\nconst events: EventName[] = [\n  \"select_texture\" as EventName,\n  \"update_texture_selection\" as EventName,\n  \"finish_edit\",\n  \"add_texture\",\n];\n\nconst refresh = () => {\n  Panels.channels_panel.inside_vue.textures = getChannels();\n};\n\nsetups.push(() => {\n  registry.channelsPanelStyle = Blockbench.addCSS(/* css */ `\n    .texture_channel {\n      color: var(--color-text);\n      flex: 1;\n      font-size: 1em;\n      margin: 0 0 0 auto;\n      padding: 0 8px;\n      text-align: right;\n    }\n\n    .texture_channel + .texture_particle_icon {\n      padding-right: 8px;\n    }\n\n    .texture_channel_description {\n      background-color: var(--color-back);\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n      justify-content: space-between;\n    }\n    \n    .texture_channel_wrapper {\n      align-items: center;\n      background-color: var(--color-ui);\n      border-left: 1px solid var(--color-border);\n      display: flex;\n      flex: 1;\n      flex-direction: row;\n      align-items: center;\n      flex-wrap: nowrap;\n      padding: 0 8px;\n    }\n\n    .texture_channel_wrapper:hover {\n      background-color: var(--color-button);\n    }\n\n    .texture_channel_description .texture_name {\n      flex-direction: column;\n      flex-wrap: nowrap;\n      color: var(--color-subtle_text);\n      display: flex;\n      flex: 1;\n      justify-content: center;\n      align-items: start;\n    }\n\n    .texture_parent {\n      color: var(--color-subtle_text);\n      font-size: 0.8em;\n    }\n\n    .texture_channel_description:hover .texture_channel {\n      color: var(--color-accent);\n    }\n\n    #pbr_channel_list {\n      display: flex;\n      flex-direction: column;\n    }\n\n    #pbr_channel_list .texture {\n      border-top: 1px solid var(--color-border);\n      padding-right: 0;\n    }\n  `);\n\n  registry.channelsPanel = new Panel(\"channels_panel\", {\n    name: \"PBR Channels\",\n    id: \"channels_panel\",\n    icon: \"gallery_thumbnail\",\n    condition: {\n      project: true,\n      selected: {\n        texture: true,\n      },\n      modes: [\"paint\", \"edit\"],\n    },\n    toolbars: [\n      // new Toolbar(\"channel_assignment_toolbar\", {\n      //   id: \"channel_assignment_toolbar\",\n      //   children: [\"create_material_texture\", \"show_channel_menu\"],\n      //   name: \"PBR Channel Controls\",\n      // }),\n    ],\n    component: {\n      name: \"ChannelsPanel\",\n      data(): {\n        channels: Record<string, IChannel>;\n        textures: Array<Texture | TextureLayer>;\n      } {\n        return {\n          channels: CHANNELS,\n          textures: [],\n        };\n      },\n      methods: {\n        openMenu(event: MouseEvent) {\n          registry.channelMenu?.open(event);\n        },\n        selectTexture(texture: Texture | TextureLayer) {\n          Modes.options.paint.select();\n          texture.select();\n          texture.scrollTo();\n        },\n        channelEnabled(texture: Texture) {\n          return (\n            texture.channel &&\n            texture.channel !== NA_CHANNEL &&\n            texture.channel in this.channels\n          );\n        },\n        getImgSrc(texture: Texture | TextureLayer) {\n          return (\n            texture.img?.src ??\n            `data:image/png;base64,${texture.canvas.toDataURL()}`\n          );\n        },\n      },\n      template: /* html */ `\n      <div>\n        <ul class=\"list mobile_scrollbar\" id=\"pbr_channel_list\">\n          <li\n            v-for=\"texture in textures\"\n            v-on:click.stop=\"selectTexture(texture)\"\n            v-on:dblclick=\"openMenu($event)\"\n            :key=\"texture.uuid\"\n            class=\"texture\"\n          >\n            <img :src=\"getImgSrc(texture)\" :alt=\"texture.name\" width=\"48\" height=\"48\" />\n            <div class=\"texture_description_wrapper texture_channel_description\">\n              <div class=\"texture_name\">\n                <div>{{ texture.name }}</div>\n                <div v-if=\"texture && texture.texture\" class=\"texture_parent\">\n                  {{ texture.texture.name }}\n                </div>\n              </div>\n              <div v-if=\"channelEnabled(texture)\" class=\"texture_channel_wrapper\">\n                <div class=\"texture_channel\">{{ channels[texture.channel].label }}</div>\n                <i class=\"material-icons texture_particle_icon\">{{ channels[texture.channel].icon }}</i>\n              </div>\n            </div>\n          </li>\n        </ul>\n      </div>`,\n    },\n    expand_button: true,\n    growable: true,\n    onFold() {},\n    onResize() {},\n    default_side: \"left\",\n    default_position: {\n      slot: \"left_bar\",\n      float_position: [0, 0],\n      float_size: [400, 300],\n      height: 350,\n      folded: true,\n    },\n    insert_after: \"layers\",\n    insert_before: \"color\",\n  });\n\n  Blockbench.on(events.join(\" \") as EventName, refresh);\n});\n\nteardowns.push(() => {\n  events.forEach((event) => {\n    Blockbench.removeListener(event, refresh);\n  });\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/panels/index.ts",
    "content": "import \"./materialBrush\";\nimport \"./pbrSettings\";\nimport \"./channels\";\n"
  },
  {
    "path": "src/pbr_preview/src/lib/panels/materialBrush.ts",
    "content": "import { registry, setups } from \"../../constants\";\n\nsetups.push(() => {\n  registry.materialBrushPanel = new Panel(\"material_brush_panel\", {\n    name: \"Material Brush\",\n    id: \"material_brush_panel\",\n    icon: \"view_in_ar\",\n    toolbars: [\n      new Toolbar(\"material_brush_toolbar\", {\n        id: \"material_brush_toolbar\",\n        children: [\n          \"material_brush\",\n          \"load_brush_preset\",\n          \"slider_brush_metalness\",\n          \"slider_brush_roughness\",\n          \"brush_emissive_color\",\n          \"slider_brush_height\",\n        ],\n        name: \"Material Settings\",\n      }),\n    ],\n    condition: {\n      modes: [\"paint\"],\n      project: true,\n    },\n    component: {},\n    expand_button: true,\n    growable: false,\n    onFold() {},\n    onResize() {},\n    default_side: \"right\",\n    default_position: {\n      slot: \"right_bar\",\n      float_position: [0, 0],\n      float_size: [400, 300],\n      height: 300,\n      folded: false,\n    },\n    insert_after: \"color\",\n    insert_before: \"outliner\",\n  });\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/panels/pbrSettings.ts",
    "content": "import { registry, setups } from \"../../constants\";\n\n// TODO: Teardown toolbars\n\nsetups.push(() => {\n  registry.displaySettingsPanel = new Panel(\"display_settings\", {\n    name: \"PBR Controls\",\n    id: \"display_settings_panel\",\n    icon: \"display_settings\",\n    toolbars: [\n      new Toolbar(\"controls_toolbar\", {\n        id: \"controls_toolbar\",\n        children: [\n          \"toggle_pbr\",\n          \"correct_lights\",\n          \"display_settings_tone_mapping\",\n          \"display_settings_exposure\",\n          \"display_settings_reset_exposure\",\n          \"show_channel_select_menu\",\n        ],\n        name: \"Display Settings\",\n      }),\n    ],\n    display_condition: {\n      modes: [\"edit\", \"paint\", \"animate\"],\n      project: true,\n    },\n    component: {},\n    expand_button: true,\n    growable: false,\n    onFold() {},\n    onResize() {},\n    default_side: \"left\",\n    default_position: {\n      slot: \"left_bar\",\n      float_position: [0, 0],\n      float_size: [400, 300],\n      height: 300,\n      folded: false,\n    },\n    insert_after: \"textures\",\n    insert_before: \"color\",\n  });\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/properties.ts",
    "content": "import { registry, CHANNELS, NA_CHANNEL, setups } from \"../constants\";\n\nconst channelsEnum = [\n  ...Object.keys(CHANNELS).map((key) => CHANNELS[key].id),\n  NA_CHANNEL,\n];\n\nsetups.push(() => {\n  registry.channelProp = new Property(TextureLayer, \"enum\", \"channel\", {\n    default: NA_CHANNEL,\n    values: channelsEnum,\n    label: \"PBR Channel\",\n    exposed: false,\n  });\n\n  registry.textureChannelProp = new Property(Texture, \"enum\", \"channel\", {\n    default: NA_CHANNEL,\n    values: channelsEnum,\n    label: \"PBR Channel\",\n    exposed: false,\n  });\n\n  // @ts-expect-error Boolean values not required\n  registry.materialTextureProp = new Property(Texture, \"boolean\", \"material\", {\n    default: false,\n    label: \"Material Texture\",\n  });\n\n  registry.pbrMaterialsProp = new Property(\n    ModelProject,\n    // @ts-expect-error \"object\" is a valid type for a property\n    \"object\",\n    \"pbr_materials\",\n    {\n      default: {},\n      exposed: false,\n      label: \"PBR Materials\",\n    }\n  );\n\n  registry.projectMaterialsProp = new Property(\n    ModelProject,\n    // @ts-expect-error \"object\" is a valid type for a property\n    \"object\",\n    \"bb_materials\",\n    {\n      default: {},\n      exposed: false,\n      label: \"Project Materials\",\n    }\n  );\n\n  registry.projectPbrModeProp = new Property(\n    ModelProject,\n    \"boolean\",\n    \"pbr_active\",\n    {\n      default: false,\n      exposed: false,\n      values: [],\n      label: \"PBR Mode\",\n    }\n  );\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/tools/index.ts",
    "content": "import \"./materialBrush\";\n"
  },
  {
    "path": "src/pbr_preview/src/lib/tools/materialBrush.ts",
    "content": "import type { IChannel } from \"../../types\";\nimport { registry, CHANNELS, setups, teardowns } from \"../../constants\";\nimport {\n  applyPbrMaterial,\n  debounceApplyPbrMaterial,\n} from \"../applyPbrMaterial\";\nimport { MaterialBrush } from \"../MaterialBrush\";\nimport { vue as Vue, three as THREE } from \"../../deps\";\nimport { getSelectedTexture, generatePreviewImage } from \"../util\";\n\nconst STORAGE_NAMESPACE = \"materialBrushPresets\";\n\nconst getPresets = () => {\n  return JSON.parse(localStorage.getItem(STORAGE_NAMESPACE) || \"{}\");\n};\n\nconst savePreset = (name?: string, id?: string) => {\n  const presets = getPresets();\n  const uuid = id ?? guid();\n  const results = registry.userMaterialBrushPresets?.getFormResult() ?? {};\n  const settings = {};\n\n  if (results.albedo) {\n    settings.albedo = results.albedo.toString();\n  }\n\n  if (results.metalness) {\n    settings.metalness = Number(results.metalness);\n  }\n\n  if (results.roughness) {\n    settings.roughness = Number(results.roughness);\n  }\n\n  if (results.emissive) {\n    settings.emissive = results.emissive.toString();\n  }\n\n  if (results.height) {\n    settings.height = Number(results.height);\n  }\n\n  presets[uuid] = [\n    settings,\n    name ?? \"New Preset\",\n    generatePreviewImage(settings),\n  ];\n\n  localStorage.setItem(STORAGE_NAMESPACE, JSON.stringify(presets));\n\n  return uuid;\n};\n\nconst applyPreset = ({\n  metalness,\n  roughness,\n  emissive,\n  height,\n  albedo,\n}: {\n  metalness?: number;\n  roughness?: number;\n  emissive?: string;\n  height?: number;\n  albedo?: string;\n}) => {\n  if (metalness !== undefined) {\n    registry.brushMetalnessSlider?.setValue(metalness || 0, true);\n  }\n\n  if (roughness !== undefined) {\n    registry.brushRoughnessSlider?.setValue(roughness ?? 1, true);\n  }\n\n  if (emissive !== undefined) {\n    registry.brushEmissiveColor?.set(emissive ?? \"#000000\");\n  }\n\n  if (height !== undefined) {\n    registry.brushHeightSlider?.setValue(\n      Math.max(0, Math.min(1, height ?? 0.5)),\n      true\n    );\n  }\n\n  if (albedo !== undefined) {\n    // @ts-expect-error ColorPanel global is not typed\n    ColorPanel.set(albedo);\n  }\n};\n\nconst materialBrushSliderCondition = ({ id }: IChannel) =>\n  Condition({\n    project: true,\n    tools: [\"material_brush\"],\n    method() {\n      const texture = getSelectedTexture();\n\n      return (\n        (texture?.layers_enabled &&\n          texture.layers.find(({ channel }) => channel && channel === id) !==\n            undefined) === true\n      );\n    },\n  });\n\nconst userPresetsDialogComponent = Vue.extend({\n  name: \"UserPresetsDialog\",\n  data(): {\n    userPresets: Record<string, [Record<string, number | string>, string]>;\n    channels: typeof CHANNELS;\n  } {\n    return {\n      userPresets: {},\n      channels: CHANNELS,\n    };\n  },\n  methods: {\n    applyPreset(preset: string) {\n      try {\n        const [settings, name] = this.userPresets[preset];\n\n        const { metalness, roughness, emissive, height, albedo } = settings;\n\n        applyPreset({\n          metalness: Number(metalness),\n          roughness: Number(roughness),\n          emissive: emissive.toString(),\n          height: Number(height),\n          albedo: albedo.toString(),\n        });\n\n        registry.userMaterialBrushPresets?.hide();\n        Blockbench.showQuickMessage(`Preset \"${name}\" applied`, 2000);\n      } catch {\n        Blockbench.showQuickMessage(\"Failed to apply preset\", 2000);\n      }\n    },\n    deletePreset(preset: string) {\n      Blockbench.showMessageBox(\n        {\n          title: \"Delete Preset\",\n          message: \"Are you sure you want to delete this preset?\",\n          confirm: 1,\n          cancel: 0,\n          buttons: [\"Cancel\", \"Delete\"],\n          checkboxes: {},\n          width: 400,\n        },\n        (btn) => {\n          if (btn) {\n            const presets = getPresets();\n            const friendlyName = this.userPresets[preset][1] ?? preset;\n\n            delete presets[preset];\n\n            localStorage.setItem(\n              \"materialBrushPresets\",\n              JSON.stringify(presets)\n            );\n\n            this.userPresets = presets;\n\n            Blockbench.showQuickMessage(\n              `Preset \"${friendlyName}\" deleted`,\n              2000\n            );\n          }\n        }\n      );\n    },\n    editPreset(preset: string) {\n      registry.userMaterialBrushPresets?.setFormValues({\n        name: this.userPresets[preset][1] ?? preset,\n        ...this.userPresets[preset][0],\n      });\n    },\n    getSummary(settings: Record<string, number | string>) {\n      return Object.entries(settings)\n        .filter(([channel]) => channel in this.channels)\n        .map(([channel, value]) => {\n          if (channel === \"albedo\" || channel === \"emissive\") {\n            return `${this.channels[channel]?.label ?? channel}: ${value}`;\n          }\n\n          return `${this.channels[channel]?.label ?? channel}: ${Number(value).toFixed(1)}`;\n        })\n        .join(\"\\n\");\n    },\n  },\n  computed: {\n    presets() {\n      return Object.entries(this.userPresets);\n    },\n  },\n  mounted() {\n    this.userPresets = getPresets();\n  },\n  template: /* html */ `\n    <div>\n      <ul class=\"list mobile_scrollbar preset_list\">\n        <li\n          v-for=\"([key, [settings, name, image]]) in presets\"\n          :key=\"key\"\n          class=\"user_preset\"\n        >\n          <div v-if=\"image\" class=\"preset_preview\" @click=\"editPreset(key)\">\n            <img :src=\"image\" :alt=\"name\" :title=\"getSummary(settings)\" width=\"96\" height=\"96\" />\n            <div class=\"preset_title\">{{ name }}</div>\n          </div>\n          <div v-else>\n            <div class=\"preset_title\" @click=\"editPreset(key)\" :title=\"getSummary(settings)\">{{ name }}</div>\n          </div>\n          <div class=\"preset_buttons\">\n            <button class=\"delete_preset\" type=\"button\" @click=\"deletePreset(key)\">\n              <i class=\"material-icons\">close</i>\n            </button>\n          </div>\n        </li>\n      </ul>\n    </div>`,\n});\n\nsetups.push(() => {\n  registry.materialBrushStyles = Blockbench.addCSS(/* css */ `\n  .preset_list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, 96px);\n    grid-gap: 8px;\n    justify-content: start;\n    align-items: start;\n    margin: 0 auto;\n    padding: 8px;\n  }\n\n  .user_preset {\n    display: flex;\n    justify-content: start;\n    align-items: center;\n    width: 100%;\n    padding: 8px;\n    position: relative;\n  }\n\n  .preset_title {\n    font-size: 1em;\n    color: var(--color-text);\n  }\n\n  .user_preset:hover .preset_title {\n    color: var(--color-accent);\n  }\n\n  .preset_preview {\n    display: flex;\n    flex-direction: column;\n    flex-wrap: nowrap;\n    justify-content: center;\n    align-items: center;\n    text-align: center;\n  }\n\n  .preset_buttons {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    font-size: 0.8em;\n    padding: 0 4px;\n  }\n\n  .preset_channel {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    margin: 0 8px;\n    font-size: 0.8em;\n  }\n\n  .delete_preset {\n    margin-left: 8px;\n    padding: 4px;\n    height: 24px;\n    width: 24px;\n    min-width: 24px;\n    background-color: transparent;\n    color: var(--color-text);\n    border: none;\n    border-radius: 100%;\n    position: absolute;\n    right: -8px;\n    top: 0;\n    filter: drop-shadow(0 0 2px var(--color-shadow));\n  }\n\n  .delete_preset:hover {\n    background: transparent;\n    color: var(--color-accent);\n  }\n\n  .delete_preset .material-icons {\n    font-size: 0.825em;\n  }\n\n  .delete_preset:hover .material-icons {\n    color: var(--color-accent);\n  }`);\n\n  registry.brushMetalnessSlider = new NumSlider(\"slider_brush_metalness\", {\n    category: \"paint\",\n    name: \"Metalness\",\n    description: \"Adjust the metalness of the brush\",\n    tool_setting: \"brush_metalness\",\n    settings: {\n      min: 0,\n      max: 1,\n      step: 0.01,\n      default: 0,\n    },\n    condition: () => materialBrushSliderCondition(CHANNELS.metalness),\n  });\n\n  registry.brushRoughnessSlider = new NumSlider(\"slider_brush_roughness\", {\n    category: \"paint\",\n    name: \"Roughness\",\n    description: \"Adjust the roughness of the brush\",\n    tool_setting: \"brush_roughness\",\n    settings: {\n      min: 0,\n      max: 1,\n      step: 0.01,\n      default: 1,\n    },\n    condition: () => materialBrushSliderCondition(CHANNELS.roughness),\n  });\n\n  registry.brushEmissiveColor = new ColorPicker(\"brush_emissive_color\", {\n    category: \"paint\",\n    name: \"Emissive\",\n    description: \"Adjust the emissive color of the brush\",\n    value: \"#000000\",\n    tool_setting: \"brush_emissive\",\n    condition: () => materialBrushSliderCondition(CHANNELS.emissive),\n  });\n\n  registry.brushHeightSlider = new NumSlider(\"slider_brush_height\", {\n    category: \"paint\",\n    name: \"Height\",\n    description: \"Adjust the height of the brush\",\n    tool_setting: \"brush_height\",\n    settings: {\n      min: 0,\n      max: 1,\n      step: 0.01,\n      default: 0.5,\n    },\n    condition: () => materialBrushSliderCondition(CHANNELS.height),\n  });\n\n  registry.materialBrushTool = new Tool(\"material_brush\", {\n    name: \"Material Brush\",\n    description: \"Paints across multiple texture layers\",\n    icon: \"view_in_ar\",\n    paintTool: true,\n    cursor: \"cell\",\n    category: \"tools\",\n    toolbar: \"brush\",\n    condition: {\n      project: true,\n      selected: {\n        texture: true,\n      },\n      modes: [\"paint\"],\n      method() {\n        return getSelectedTexture()?.layers_enabled ?? false;\n      },\n    },\n    allowed_view_modes: \"textured\",\n    tool_settings: {\n      brush_metalness: 0,\n      brush_roughness: 1,\n      brush_emissive: \"#000000\",\n      brush_height: 0.5,\n    },\n    brush: {\n      blend_modes: false,\n      shapes: true,\n      size: true,\n      softness: true,\n      opacity: true,\n      offset_even_radius: true,\n      floor_coordinates: true,\n      changePixel(\n        pxX, // Pixel that is changing\n        pxY,\n        px,\n        alpha,\n        { size, softness, texture, x, y }\n      ) {\n        const mat = MaterialBrush.fromSettings();\n\n        const matChannels = Object.keys(mat.colors);\n\n        const brushSize = Math.floor(size - (softness * size) / 100);\n\n        let rgba = px;\n\n        texture.layers.forEach((layer) => {\n          // @ts-expect-error Channel property is an extension of TextureLayer\n          if (!layer.visible || !matChannels.includes(layer.channel)) {\n            return;\n          }\n\n          // @ts-expect-error Channel property is an extension of TextureLayer\n          const fill = mat.getChannel(layer.channel);\n\n          if (!fill) {\n            return;\n          }\n\n          const distance = Math.sqrt((x - pxX) ** 2 + (y - pxY) ** 2);\n          const fallOff = Math.min(1, distance / brushSize);\n\n          // Transition colors at soft edges\n          if (x % brushSize <= fallOff && y % brushSize <= fallOff) {\n            const currentPixel = layer.ctx.getImageData(pxX, pxY, 1, 1).data;\n            const currentFill = new THREE.Color(\n              `rgb(${currentPixel[0]}, ${currentPixel[1]}, ${currentPixel[2]})`\n            );\n\n            // Set the fill color to the lerp between the current pixel and the new color\n            fill.lerp(currentFill, 1);\n          }\n\n          layer.ctx.fillStyle = fill.getStyle();\n          layer.ctx.fillRect(pxX, pxY, 1, 1);\n\n          if (layer.selected) {\n            rgba = {\n              r: fill.r * 255,\n              g: fill.g * 255,\n              b: fill.b * 255,\n              a: alpha * 255,\n            };\n          }\n        });\n\n        return rgba;\n      },\n      onStrokeStart({ texture }) {\n        Undo.initEdit({\n          layers: texture.layers,\n        });\n\n        return true;\n      },\n      onStrokeEnd({ texture }) {\n        Undo.finishEdit(\"Material Brush Stroke\");\n\n        return true;\n      },\n    },\n    onCanvasClick(data: any) {\n      Painter.startPaintToolCanvas(data, data.event);\n    },\n    onSelect() {\n      Painter.updateNslideValues();\n      applyPbrMaterial();\n    },\n    click() {\n      debounceApplyPbrMaterial();\n    },\n  });\n\n  registry.loadBrushPreset = new Action(\"load_brush_preset\", {\n    icon: \"stroke_full\",\n    name: \"Material Brush Presets\",\n    description: \"Load or save a brush preset\",\n    category: \"paint\",\n    condition: {\n      project: true,\n    },\n    click() {\n      registry.userMaterialBrushPresets = new Dialog(\"user_brush_presets\", {\n        id: \"user_brush_presets\",\n        title: \"Edit Material Brush\",\n        component: userPresetsDialogComponent,\n        part_order: [\"lines\", \"component\", \"form\"],\n        form: {\n          albedo: {\n            type: \"color\",\n            label: \"Albedo\",\n            value: ColorPanel.get(),\n            toggle_enabled: true,\n          },\n          metalness: {\n            type: \"number\",\n            label: \"Metalness\",\n            min: 0,\n            max: 1,\n            step: 0.01,\n            full_width: false,\n            toggle_enabled: true,\n          },\n          roughness: {\n            type: \"number\",\n            label: \"Roughness\",\n            min: 0,\n            max: 1,\n            step: 0.01,\n            toggle_enabled: true,\n            full_width: false,\n          },\n          emissive: {\n            type: \"color\",\n            label: \"Emissive\",\n            value: \"#000000\",\n            toggle_enabled: true,\n          },\n          height: {\n            type: \"number\",\n            label: \"Height\",\n            min: 0,\n            max: 1,\n            step: 0.01,\n            toggle_enabled: true,\n          },\n        },\n        onConfirm(formResult) {\n          applyPreset({\n            metalness: Number(\n              formResult.metalness ?? registry.brushMetalnessSlider?.get()\n            ),\n            roughness: Number(\n              formResult.roughness ?? registry.brushRoughnessSlider?.get()\n            ),\n            emissive: (\n              formResult.emissive ?? registry.brushEmissiveColor?.get()\n            ).toString(),\n            height: Number(\n              formResult.height ?? registry.brushHeightSlider?.get()\n            ),\n            albedo: (formResult.albedo ?? ColorPanel.get()).toString(),\n          });\n        },\n        buttons: [\"Close\", \"Save\", \"Apply\"],\n        cancelIndex: 0,\n        confirmIndex: 2,\n        onButton(idx, event) {\n          registry.materialBrushTool?.select();\n\n          if (idx !== 1) {\n            return;\n          }\n\n          Blockbench.textPrompt(\"Save Preset\", \"New Preset\", (name) => {\n            if (name) {\n              savePreset(name);\n              Blockbench.showQuickMessage(`Preset \"${name}\" saved`, 2000);\n            }\n          });\n        },\n      }).show();\n    },\n  });\n\n  MenuBar.addAction(registry.materialBrushTool, \"tools.0\");\n});\nteardowns.push(() => {\n  MenuBar.removeAction(\"tools.material_brush\");\n});\n"
  },
  {
    "path": "src/pbr_preview/src/lib/util.ts",
    "content": "import { three as THREE } from \"../deps\";\n\n/**\n * Attempts to find the selected texture/layer using various methods\n * @returns Texture | null\n */\nexport function getSelectedTexture(): Texture | null {\n  if (Texture.selected) {\n    return Texture.selected;\n  }\n\n  if (TextureLayer.selected) {\n    return TextureLayer.selected.texture;\n  }\n\n  if (!Project) {\n    return Texture.all.find((t) => t.selected) ?? Texture.getDefault();\n  }\n\n  if (Project.selected_texture) {\n    return Project.selected_texture;\n  }\n\n  return Project.textures.find((t) => t.selected) ?? null; // Texture.getDefault();\n}\n\n/**\n * Attempts to find the currently selected layer\n * @returns TextureLayer | null\n */\nexport function getSelectedLayer(): TextureLayer | null {\n  if (TextureLayer.selected) {\n    return TextureLayer.selected;\n  }\n\n  if (Texture.selected?.selected_layer) {\n    return Texture.selected.selected_layer;\n  }\n\n  if (\n    Project.selected_texture !== null &&\n    Project.selected_texture?.layers_enabled === true\n  ) {\n    return (\n      Project.selected_texture.layers.find((l: TextureLayer) => l.selected) ??\n      Project.selected_texture.layers[0]\n    );\n  }\n\n  return getSelectedTexture()?.getActiveLayer() ?? null;\n}\n\nexport function getOutputBaseName() {\n  if (!Project) {\n    return pathToName(getSelectedTexture()?.name ?? \"texture\");\n  }\n\n  return Project.model_identifier.length > 0\n    ? Project.model_identifier\n    : Project.getDisplayName();\n}\n\nexport function getMaterialsFromProject() {\n  const materials: Record<string, THREE.MeshStandardMaterial> = {};\n\n  if (!Project) {\n    return materials;\n  }\n\n  Project.elements.forEach((item) => {\n    if (!(item instanceof Cube)) {\n      return;\n    }\n\n    Object.keys(item.faces).forEach((key) => {\n      const face = item.faces[key];\n      const texture = face.getTexture();\n\n      if (!texture) {\n        return;\n      }\n\n      const projectMaterial = Project.materials[texture.uuid];\n\n      if (projectMaterial.isMeshStandardMaterial) {\n        materials[texture.uuid] = projectMaterial;\n      }\n    });\n  });\n\n  return materials;\n}\n\nexport function debounce(func: Function, wait: number) {\n  let timeout: number | undefined;\n  return function (this: any, ...args: any[]) {\n    const later = () => {\n      timeout = undefined;\n      func.apply(this, args);\n    };\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n  };\n}\n\nexport function generatePreviewImage(\n  settings:\n    | THREE.MeshStandardMaterial\n    | (THREE.MeshStandardMaterialParameters & {\n        albedo: THREE.ColorRepresentation;\n        emissive: THREE.ColorRepresentation;\n        height?: number;\n      })\n): string {\n  const renderer =\n    MediaPreview.renderer ??\n    new THREE.WebGLRenderer({\n      alpha: true,\n      antialias: true,\n    });\n  const scene = new THREE.Scene();\n  const camera = new THREE.PerspectiveCamera(75, 96 / 96, 0.1, 1000);\n\n  const ambientLight = new THREE.AmbientLight(0xffffff, 0.75);\n  scene.add(ambientLight);\n\n  const pointLight = new THREE.PointLight(0xffffff, 1, 100);\n  pointLight.position.set(5, 5, 5);\n  scene.add(pointLight);\n  const geometry = new THREE.SphereGeometry(1, 32, 32);\n\n  const material =\n    settings instanceof THREE.MeshStandardMaterial &&\n    settings.isMeshStandardMaterial\n      ? settings\n      : new THREE.MeshStandardMaterial({\n          color: settings.albedo,\n          metalness: settings.metalness ?? 0,\n          roughness: settings.roughness ?? 1,\n          emissive: settings.emissive,\n          bumpScale: settings.height ?? 0,\n          envMap: PreviewScene.active?.cubemap ?? null,\n          envMapIntensity: 0.5,\n        });\n\n  const sphere = new THREE.Mesh(geometry, material);\n  scene.add(sphere);\n\n  camera.position.x = 0;\n  camera.position.y = 0;\n  camera.position.z = 2;\n\n  renderer.setSize(96, 96);\n\n  renderer.render(scene, camera);\n\n  const data = renderer.domElement.toDataURL();\n\n  material.dispose();\n\n  if (!MediaPreview.renderer) {\n    renderer.clear();\n    renderer.dispose();\n  }\n\n  return data;\n}\n\nexport function colorDataUrl(color: THREE.Color, src?: HTMLCanvasElement) {\n  const canvas = src ?? document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n\n  if (!ctx) {\n    canvas.remove();\n    return null;\n  }\n\n  const width = Math.max(Project ? Project.texture_width : 16, 16);\n  const height = Math.max(Project ? Project.texture_height : 16, 16);\n\n  canvas.width = width;\n  canvas.height = height;\n\n  ctx.fillStyle = `rgb(${color.r * 255}, ${color.g * 255}, ${color.b * 255})`;\n  ctx.fillRect(0, 0, width, height);\n\n  const data = canvas.toDataURL();\n\n  if (!src) {\n    canvas.remove();\n  }\n\n  return data;\n}\n"
  },
  {
    "path": "src/pbr_preview/src/types.d.ts",
    "content": "export type Channel =\n  | \"albedo\"\n  | \"metalness\"\n  | \"emissive\"\n  | \"roughness\"\n  | \"height\"\n  | \"normal\"\n  | \"ao\";\n\nexport interface IChannel {\n  label: string;\n  description: string;\n  map: string;\n  id: string;\n  icon?: string;\n  default?: THREE.Color;\n  regex?: RegExp;\n}\n\nexport interface ILightrParams {\n  lightHeight?: number;\n  ambientLight?: [number, number, number];\n  minLightIntensity?: number;\n  lightDiffuse?: [number, number, number];\n}\n\nexport interface IPbrMaterials {\n  [materialUuid: string]: {\n    [channelId: string]: string;\n  };\n}\n\nexport interface IBbMat {\n  version: number;\n  channels: Record<Channel | \"preview\", string>;\n}\n\nexport interface IRegistry {\n  bakeTexturesAction: Action;\n  bakeTexturesDialog: Dialog;\n  brushEmissiveColor: ColorPicker;\n  brushHeightSlider: NumSlider;\n  brushMetalnessSlider: NumSlider;\n  brushRoughnessSlider: NumSlider;\n  channelMenu: Menu;\n  channelProp: Property;\n  createMaterialTexture: Action;\n  createTextureSet: Action;\n  decodeMer: Action;\n  displaySettingsPanel: Panel;\n  exposureSlider: NumSlider;\n  resetExposure: Action;\n  generateMer: Action;\n  generateNormal: Action;\n  generateAo: Action;\n  generateLabPbr: Action;\n  decodeLabPbr: Action;\n  materialBrushPanel: Panel;\n  materialBrushTool: Tool;\n  openChannelMenu: Action;\n  pbrMaterialsProp: Property;\n  projectMaterialsProp: Property;\n  projectPbrModeProp: Property;\n  setBrushMaterial: Action;\n  showChannelMenu: Action;\n  textureChannelProp: Property;\n  textureSetDialog: Dialog;\n  toggleCorrectLights: Toggle;\n  togglePbr: Toggle;\n  tonemappingSelect: BarSelect;\n  unassignChannel: Action;\n  userMaterialBrushPresets: Dialog;\n  exportUsdz: Action;\n  usdz: Codec;\n  bbmat: Codec;\n  bbMatExport: Action;\n  bbMatImport: Action;\n  [key: string]: Deletable;\n}\n"
  },
  {
    "path": "src/pbr_preview/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    /* Visit https://aka.ms/tsconfig to read more about this file */\n    /* Projects */\n    // \"incremental\": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */\n    // \"composite\": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */\n    // \"tsBuildInfoFile\": \"./.tsbuildinfo\",              /* Specify the path to .tsbuildinfo incremental compilation file. */\n    // \"disableSourceOfProjectReferenceRedirect\": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */\n    // \"disableSolutionSearching\": true,                 /* Opt a project out of multi-project reference checking when editing. */\n    // \"disableReferencedProjectLoad\": true,             /* Reduce the number of projects loaded automatically by TypeScript. */\n    /* Language and Environment */\n    \"target\": \"ES2019\" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, /* Specify a set of bundled library declaration files that describe the target runtime environment. */\n    // \"jsx\": \"preserve\",                                /* Specify what JSX code is generated. */\n    // \"experimentalDecorators\": true,                   /* Enable experimental support for legacy experimental decorators. */\n    // \"emitDecoratorMetadata\": true,                    /* Emit design-type metadata for decorated declarations in source files. */\n    // \"jsxFactory\": \"\",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */\n    // \"jsxFragmentFactory\": \"\",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */\n    // \"jsxImportSource\": \"\",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */\n    // \"reactNamespace\": \"\",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */\n    // \"noLib\": true,                                    /* Disable including any library files, including the default lib.d.ts. */\n    // \"useDefineForClassFields\": true,                  /* Emit ECMAScript-standard-compliant class fields. */\n    // \"moduleDetection\": \"auto\",                        /* Control what method is used to detect module-format JS files. */\n    /* Modules */\n    \"module\": \"ES2022\" /* Specify what module code is generated. */,\n    // \"rootDir\": \"./\",                                  /* Specify the root folder within your source files. */\n    // \"moduleResolution\": \"node10\",                     /* Specify how TypeScript looks up a file from a given module specifier. */\n    // \"baseUrl\": \"./\",                                  /* Specify the base directory to resolve non-relative module names. */\n    // \"paths\": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */\n    // \"rootDirs\": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */\n    // \"typeRoots\": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */\n    // \"types\": [],                                      /* Specify type package names to be included without being referenced in a source file. */\n    // \"allowUmdGlobalAccess\": true,                     /* Allow accessing UMD globals from modules. */\n    // \"moduleSuffixes\": [],                             /* List of file name suffixes to search when resolving a module. */\n    // \"allowImportingTsExtensions\": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */\n    // \"resolvePackageJsonExports\": true,                /* Use the package.json 'exports' field when resolving package imports. */\n    // \"resolvePackageJsonImports\": true,                /* Use the package.json 'imports' field when resolving imports. */\n    // \"customConditions\": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */\n    // \"resolveJsonModule\": true,                        /* Enable importing .json files. */\n    // \"allowArbitraryExtensions\": true,                 /* Enable importing files with any extension, provided a declaration file is present. */\n    // \"noResolve\": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */\n    /* JavaScript Support */\n    // \"allowJs\": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */\n    // \"checkJs\": true,                                  /* Enable error reporting in type-checked JavaScript files. */\n    // \"maxNodeModuleJsDepth\": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */\n    /* Emit */\n    // \"declaration\": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */\n    // \"declarationMap\": true,                           /* Create sourcemaps for d.ts files. */\n    // \"emitDeclarationOnly\": true,                      /* Only output d.ts files and not JavaScript files. */\n    // \"sourceMap\": true,                                /* Create source map files for emitted JavaScript files. */\n    \"inlineSourceMap\": true /* Include sourcemap files inside the emitted JavaScript. */,\n    // \"outFile\": \"./\",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */\n    // \"outDir\": \"./\",                                   /* Specify an output folder for all emitted files. */\n    // \"removeComments\": true,                           /* Disable emitting comments. */\n    // \"noEmit\": true,                                   /* Disable emitting files from a compilation. */\n    // \"importHelpers\": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */\n    // \"importsNotUsedAsValues\": \"remove\",               /* Specify emit/checking behavior for imports that are only used for types. */\n    // \"downlevelIteration\": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */\n    \"sourceRoot\": \"./src\" /* Specify the root path for debuggers to find the reference source code. */,\n    // \"mapRoot\": \"\",                                    /* Specify the location where debugger should locate map files instead of generated locations. */\n    \"inlineSources\": true /* Include source code in the sourcemaps inside the emitted JavaScript. */,\n    // \"emitBOM\": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */\n    // \"newLine\": \"crlf\",                                /* Set the newline character for emitting files. */\n    // \"stripInternal\": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n    // \"noEmitHelpers\": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */\n    // \"noEmitOnError\": true,                            /* Disable emitting files if any type checking errors are reported. */\n    // \"preserveConstEnums\": true,                       /* Disable erasing 'const enum' declarations in generated code. */\n    // \"declarationDir\": \"./\",                           /* Specify the output directory for generated declaration files. */\n    // \"preserveValueImports\": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */\n    /* Interop Constraints */\n    // \"isolatedModules\": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */\n    // \"verbatimModuleSyntax\": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */\n    // \"allowSyntheticDefaultImports\": true,             /* Allow 'import x from y' when a module doesn't have a default export. */\n    \"esModuleInterop\": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,\n    // \"preserveSymlinks\": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */\n    \"forceConsistentCasingInFileNames\": true /* Ensure that casing is correct in imports. */,\n    /* Type Checking */\n    \"strict\": true /* Enable all strict type-checking options. */,\n    // \"noImplicitAny\": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */\n    // \"strictNullChecks\": true,                         /* When type checking, take into account 'null' and 'undefined'. */\n    // \"strictFunctionTypes\": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */\n    // \"strictBindCallApply\": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */\n    // \"strictPropertyInitialization\": true,             /* Check for class properties that are declared but not set in the constructor. */\n    // \"noImplicitThis\": true,                           /* Enable error reporting when 'this' is given the type 'any'. */\n    // \"useUnknownInCatchVariables\": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */\n    // \"alwaysStrict\": true,                             /* Ensure 'use strict' is always emitted. */\n    // \"noUnusedLocals\": true,                           /* Enable error reporting when local variables aren't read. */\n    // \"noUnusedParameters\": true,                       /* Raise an error when a function parameter isn't read. */\n    // \"exactOptionalPropertyTypes\": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */\n    // \"noImplicitReturns\": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */\n    // \"noFallthroughCasesInSwitch\": true,               /* Enable error reporting for fallthrough cases in switch statements. */\n    // \"noUncheckedIndexedAccess\": true,                 /* Add 'undefined' to a type when accessed using an index. */\n    // \"noImplicitOverride\": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */\n    // \"noPropertyAccessFromIndexSignature\": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */\n    // \"allowUnusedLabels\": true,                        /* Disable error reporting for unused labels. */\n    // \"allowUnreachableCode\": true,                     /* Disable error reporting for unreachable code. */\n    /* Completeness */\n    // \"skipDefaultLibCheck\": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */\n    \"lib\": [\n      \"ES2019\",\n      \"DOM\"\n    ],\n    \"rootDir\": \"src\" /* Specify the root folder within your source files. */,\n    \"allowJs\": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */,\n    \"declaration\": false /* Generate .d.ts files from TypeScript and JavaScript files in your project. */,\n    // \"sourceMap\": true /* Create source map files for emitted JavaScript files. */,\n    \"outDir\": \"dist\" /* Specify an output folder for all emitted files. */,\n    \"noImplicitAny\": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */,\n    \"skipLibCheck\": true /* Skip type checking all .d.ts files. */,\n    \"removeComments\": true\n  }\n}"
  },
  {
    "path": "src/resourcepack_packager/.eslintrc",
    "content": "{\n  \"env\": {\n    \"node\": true,\n    \"es6\": true\n  },\n  \"extends\": [\"airbnb-base\", \"prettier\"],\n  \"parser\": \"@typescript-eslint/parser\",\n  \"overrides\": [\n    {\n      \"files\": [\"*.ts\", \"*.tsx\"],\n      \"extends\": [\"airbnb-typescript/base\", \"prettier\"],\n      \"parserOptions\": {\n        \"project\": \"./tsconfig.json\"\n      },\n      \"rules\": {\n        \"comma-dangle\": \"off\",\n        \"@typescript-eslint/comma-dangle\": [\"error\", \"never\"]\n      }\n    }\n  ],\n  \"plugins\": [\"@typescript-eslint\", \"prettier\"],\n  \"rules\": {\n    \"no-unused-vars\": [\"error\", { \"argsIgnorePattern\": \"^_\" }],\n    \"no-restricted-syntax\": \"off\",\n    \"class-methods-use-this\": \"off\",\n    \"prettier/prettier\": [\n      \"error\",\n      {\n        \"trailingComma\": \"none\"\n      }\n    ],\n    \"no-empty\": \"off\",\n    \"comma-dangle\": [\"error\", \"never\"],\n    \"import/prefer-default-export\": \"off\"\n  }\n}\n"
  },
  {
    "path": "src/resourcepack_packager/.gitignore",
    "content": "node_modules/"
  },
  {
    "path": "src/resourcepack_packager/.prettierrc",
    "content": "{\n  \"printWidth\": 80,\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"semi\": true,\n  \"singleQuote\": true,\n  \"trailingComma\": \"none\",\n  \"bracketSpacing\": true,\n  \"jsxBracketSameLine\": false,\n  \"arrowParens\": \"always\"\n}\n"
  },
  {
    "path": "src/resourcepack_packager/LICENSE",
    "content": "This work is licensed under the Creative Commons Attribution 4.0 International License.\nTo view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.\n"
  },
  {
    "path": "src/resourcepack_packager/package.json",
    "content": "{\n  \"name\": \"resourcepack_packager\",\n  \"version\": \"1.0.1\",\n  \"description\": \"Export your java models and texture into a resourcepack\",\n  \"scripts\": {\n    \"build\": \"npm run lint && webpack --mode production\",\n    \"lint\": \"eslint src/**/*.ts\",\n    \"format\": \"eslint --fix src/**/*.ts\"\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"npm run lint\"\n    }\n  },\n  \"author\": \"leopoldhub\",\n  \"license\": \"CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE\",\n  \"repository\": {\n    \"url\": \"https://github.com/leopoldhub/Blockbench-Resourcepack-Packager-Plugin.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/JannisX11/blockbench-plugins/issues\"\n  },\n  \"devDependencies\": {\n    \"@types/jszip\": \"^3.4.1\",\n    \"@types/parse-data-url\": \"^3.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.40.0\",\n    \"@typescript-eslint/parser\": \"^5.40.0\",\n    \"blockbench-types\": \"^4.4.0\",\n    \"eslint\": \"^8.25.0\",\n    \"eslint-config-airbnb-base\": \"^15.0.0\",\n    \"eslint-config-airbnb-typescript\": \"^17.0.0\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"husky\": \"^8.0.1\",\n    \"prettier\": \"^2.7.1\",\n    \"terser-webpack-plugin\": \"^5.3.6\",\n    \"ts-loader\": \"^9.4.1\",\n    \"typescript\": \"^4.8.4\",\n    \"webpack-cli\": \"^4.10.0\"\n  },\n  \"dependencies\": {\n    \"events\": \"^3.3.0\",\n    \"merge-base64\": \"^1.0.4\",\n    \"parse-data-url\": \"^4.0.1\"\n  }\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/elements/ExportResourcepackFormDialog.ts",
    "content": "import javaPackVersions from '../javaPackVersions';\nimport buildResourcepackArchive from '../services/buildResourcepackService';\nimport { setResourcepackFormDialogOptions } from '../services/resourcepackOptionsService';\nimport { ResourcepackOptions } from '../types';\nimport { saveArchive } from '../utils/archiveUtils';\n\nexport default class ExportResourcepackFormDialog extends Dialog {\n  public constructor(options: ResourcepackOptions) {\n    super({\n      id: 'export-resourcepack-form-dialog',\n      title: 'Export resourcepack',\n      form: {\n        resourcepackName: {\n          label: 'Resourcepack Name',\n          type: 'text',\n          value: options.resourcepackName\n        },\n        resourcepackVersion: {\n          label: 'Resourcepack Version',\n          type: 'select',\n          options: Object.fromEntries(\n            Object.entries(javaPackVersions).map((a) => a.reverse())\n          ),\n          value: options.resourcepackVersion\n        },\n        resourcepackDescription: {\n          label: 'Resourcepack Description',\n          type: 'textarea',\n          value: options.resourcepackDescription\n        },\n        enableResourcepackCredits: {\n          label: 'Enable Credits',\n          type: 'checkbox',\n          value: options.enableResourcepackCredits\n        },\n        resourcepackCredits: {\n          label: 'Resourcepack Credits',\n          type: 'text',\n          value: options.resourcepackCredits\n        },\n        modelType: {\n          label: 'Model type',\n          type: 'select',\n          options: {\n            block: 'block',\n            item: 'item'\n          },\n          value: options.modelType\n        },\n        namespace: {\n          label: 'Namespace',\n          type: 'text',\n          value: options.namespace\n        },\n        modelId: {\n          label: 'Model id',\n          type: 'text',\n          value: options.modelId\n        },\n        enableAnimation: {\n          label: 'Enable Animation',\n          type: 'checkbox',\n          value: options.enableAnimation\n        },\n        frameTime: {\n          label: 'Time between frames',\n          type: 'number',\n          min: 1,\n          value: options.frameTime\n        },\n        frameStart: {\n          label: 'Starting frame',\n          description:\n            'must be inferior to the number of frames in your animation',\n          type: 'number',\n          min: 0,\n          value: options.frameStart\n        },\n        interpolate: {\n          label: 'Interpolate',\n          description: 'generate \"between-frames\" if frametime > 1',\n          type: 'checkbox',\n          value: options.interpolate\n        }\n      },\n      onConfirm: async (data) => {\n        const formResult = data as ResourcepackOptions;\n        setResourcepackFormDialogOptions(formResult);\n\n        saveArchive(\n          await buildResourcepackArchive(formResult),\n          formResult.resourcepackName\n        );\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/elements/ExportResourcepackMenuAction.ts",
    "content": "import pluginEmitter from '../pluginEmitter';\nimport { getResourcepackFormDialogOptions } from '../services/resourcepackOptionsService';\nimport ExportResourcepackFormDialog from './ExportResourcepackFormDialog';\n\nexport default class ExportResourcepackMenuAction extends Action {\n  public exportResourcepackFormDialog = new ExportResourcepackFormDialog(\n    getResourcepackFormDialogOptions()\n  );\n\n  public constructor() {\n    super('export-resourcepack-menu-action', {\n      name: 'Export resourcepack',\n      icon: 'fa-file-zipper',\n      click: () => {\n        this.exportResourcepackFormDialog.show();\n      },\n      condition: () => Format.id === 'java_block'\n    });\n\n    pluginEmitter.once('unload', this.exportResourcepackFormDialog.delete);\n  }\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/index.ts",
    "content": "/**\n * @author leopoldhub\n * @discord patatoe02#1499\n * @github https://github.com/leopoldhub\n */\n\n/// <reference types=\"blockbench-types\" />\n\nimport ExportResourcepackMenuAction from './elements/ExportResourcepackMenuAction';\nimport pluginEmitter from './pluginEmitter';\n\n(() => {\n  pluginEmitter.on('load', () => {\n    const exportResourcepackMenuAction = new ExportResourcepackMenuAction();\n    MenuBar.addAction(exportResourcepackMenuAction, 'file.export');\n    pluginEmitter.once('unload', () => {\n      try {\n        exportResourcepackMenuAction.delete();\n      } catch (e) {}\n    });\n  });\n\n  Plugin.register('resourcepack_packager', {\n    title: 'Resourcepack Packager',\n    author: 'leopoldhub',\n    description: 'Export your java models and texture into a resourcepack',\n    icon: 'fa-file-zipper',\n    tags: ['Minecraft: Java Edition', 'Resourcepack', 'Exporter'],\n    variant: 'both',\n    version: '1.0.1',\n    oninstall: () => {\n      pluginEmitter.emit('install');\n    },\n    onload: () => {\n      pluginEmitter.emit('load');\n    },\n    onuninstall: () => {\n      pluginEmitter.emit('uninstall');\n    },\n    onunload: () => {\n      pluginEmitter.emit('unload');\n    }\n  } as unknown as PluginData);\n})();\n"
  },
  {
    "path": "src/resourcepack_packager/src/javaPackVersions.ts",
    "content": "const javaPackVersions = {\n  '1.8': 1,\n  '1.9-1.10': 2,\n  '1.11-1.12': 3,\n  '1.13-1.14': 4,\n  '1.15-1.16.1': 5,\n  '1.16.2-1.16.5': 6,\n  '1.17.17.1': 7,\n  '1.18-1.18.2': 8,\n  '1.19-1.19.2': 9,\n  '1.19.3': 12\n};\n\nexport default javaPackVersions;\n"
  },
  {
    "path": "src/resourcepack_packager/src/pluginEmitter.ts",
    "content": "import EventEmitter from 'events';\n\nexport default new EventEmitter();\n"
  },
  {
    "path": "src/resourcepack_packager/src/services/buildResourcepackService.ts",
    "content": "// eslint-disable-next-line import/no-extraneous-dependencies\nimport JSZip from 'jszip';\nimport { ResourcepackOptions } from '../types';\nimport { obtainBase64PackIcon } from '../utils/blockbenchUtils';\nimport {\n  archiveManifest,\n  archiveModel,\n  archiveTextures,\n  getNamespaceModelsFolder,\n  getNamespaceTexturesFolder\n} from '../utils/archiveUtils';\n\nexport default async function buildResourcepackArchive(\n  options: ResourcepackOptions\n): Promise<JSZip> {\n  const archive = new JSZip();\n  try {\n    archive.file('pack.png', await obtainBase64PackIcon(), { base64: true });\n  } catch (error) {\n    // eslint-disable-next-line no-console\n    console.error('unable to add pack icon... reason: ', error);\n  }\n\n  archiveManifest(\n    archive,\n    options.resourcepackDescription,\n    parseInt(options.resourcepackVersion, 10)\n  );\n\n  const texturesFolder = getNamespaceTexturesFolder(\n    archive,\n    options.namespace,\n    options.modelType\n  );\n\n  const modelsFolder = getNamespaceModelsFolder(\n    archive,\n    options.namespace,\n    options.modelType\n  );\n\n  archiveTextures(\n    texturesFolder,\n    options.namespace,\n    options.modelType,\n    options.modelId,\n    options.frameTime,\n    options.frameStart,\n    options.interpolate\n  );\n\n  archiveModel(\n    modelsFolder,\n    options.modelId,\n    options.enableResourcepackCredits,\n    options.resourcepackCredits\n  );\n\n  return archive;\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/services/resourcepackOptionsService.ts",
    "content": "import javaPackVersions from '../javaPackVersions';\nimport { ResourcepackOptions } from '../types';\n\nlet savedResourcepackFormDialogOptions: ResourcepackOptions | undefined;\n\nexport function getDefaultResourcepackFormDialogOptions(): ResourcepackOptions {\n  return {\n    resourcepackName: 'blockbench-pack',\n    resourcepackDescription: '',\n    enableResourcepackCredits: true,\n    resourcepackCredits:\n      'Created with Blockbench [Exported as resourcepack with the \"resourcepack_packager\" plugin]',\n    resourcepackVersion: Object.values(javaPackVersions)\n      .reverse()[0]\n      .toString(),\n    namespace: 'minecraft',\n    modelId: 'stone',\n    modelType: 'block',\n    enableAnimation: true,\n    frameTime: 1,\n    frameStart: 0,\n    interpolate: false\n  };\n}\n\nexport function getResourcepackFormDialogOptions(): ResourcepackOptions {\n  savedResourcepackFormDialogOptions ||=\n    getDefaultResourcepackFormDialogOptions();\n  return savedResourcepackFormDialogOptions;\n}\n\nexport function setResourcepackFormDialogOptions(\n  options: ResourcepackOptions\n): void {\n  savedResourcepackFormDialogOptions = options;\n}\n\nexport function resetResourcepackFormDialogOptions(): void {\n  savedResourcepackFormDialogOptions = undefined;\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/types.d.ts",
    "content": "export type ModelType = 'block' | 'item';\n\nexport interface ResourcepackOptions {\n  resourcepackVersion: string;\n  resourcepackName: string;\n  resourcepackDescription: string;\n  enableResourcepackCredits: boolean;\n  resourcepackCredits: string;\n  modelType: ModelType;\n  namespace: string;\n  modelId: string;\n  enableAnimation: boolean;\n  frameTime: number;\n  frameStart: number;\n  interpolate: boolean;\n}\n\nexport interface Manifest {\n  pack: {\n    description: string;\n    pack_format: number;\n  };\n}\n\nexport interface Animation {\n  animation: {\n    frametime: number;\n    frames: Array<number>;\n    interpolate: boolean;\n  };\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/utils/archiveUtils.ts",
    "content": "// eslint-disable-next-line import/no-extraneous-dependencies\nimport JSZip from 'jszip';\nimport { ModelType } from '../types';\nimport {\n  buildManifest,\n  createTextureAnimation,\n  compileJavaBlockCodec\n} from './blockbenchUtils';\nimport { createIncrementalArray, cutAndSwapArray } from './arrayUtils';\nimport { hardDefineProperty, hardObtainProperty } from './objectUtils';\n\nexport function getNamespaceAssetsFolder(archive: JSZip, namespace: string) {\n  return archive.folder('assets')?.folder(namespace);\n}\n\nexport function getNamespaceModelsFolder(\n  archive: JSZip,\n  namespace: string,\n  modelType: ModelType\n): JSZip {\n  return getNamespaceAssetsFolder(archive, namespace)\n    ?.folder('models')\n    ?.folder(modelType) as JSZip;\n}\n\nexport function getNamespaceTexturesFolder(\n  archive: JSZip,\n  namespace: string,\n  modelType: ModelType\n): JSZip {\n  return getNamespaceAssetsFolder(archive, namespace)\n    ?.folder('textures')\n    ?.folder(modelType) as JSZip;\n}\n\nexport function archiveManifest(\n  archive: JSZip,\n  resourcepackDescription: string,\n  resourcepackVersion: number\n) {\n  archive.file(\n    'pack.mcmeta',\n    // @ts-ignore\n    autoStringify(buildManifest(resourcepackDescription, resourcepackVersion))\n  );\n}\n\nexport function archiveTextures(\n  archiveTexturesFolder: JSZip,\n  namespace: string,\n  modelType: ModelType,\n  modelId: string,\n  frameTime: number,\n  frameStart: number,\n  interpolate: boolean\n) {\n  const texturesFolder = archiveTexturesFolder.folder(modelId);\n  Texture.all.forEach((texture) => {\n    const textureName = `${hardObtainProperty(texture, 'name')}.png`;\n    if (texture.frameCount && texture.frameCount > 1) {\n      let framesOrder = createIncrementalArray(texture.frameCount as number);\n      framesOrder = cutAndSwapArray(framesOrder, frameStart);\n      texturesFolder?.file(\n        `${textureName}.mcmeta`,\n        // @ts-ignore\n        autoStringify(\n          createTextureAnimation(frameTime, framesOrder, interpolate)\n        )\n      );\n    }\n\n    hardDefineProperty(texture, 'folder', `${modelType}/${modelId}`);\n    hardDefineProperty(texture, 'namespace', namespace);\n\n    texturesFolder?.file(textureName, texture.getBase64(), {\n      base64: true\n    });\n  });\n}\n\nexport function archiveModel(\n  archiveModelsFolder: JSZip,\n  modelId: string,\n  enableResourcepackCredits: boolean = false,\n  resourcepackCredits: string = ''\n) {\n  archiveModelsFolder?.file(\n    `${modelId}.json`,\n    // @ts-ignore\n    autoStringify(\n      compileJavaBlockCodec(enableResourcepackCredits, resourcepackCredits)\n    )\n  );\n}\n\nexport function saveArchive(archive: JSZip, name: string) {\n  return archive.generateAsync({ type: 'blob' }).then(async (content) => {\n    Blockbench.export({\n      type: 'Zip Archive',\n      extensions: ['zip'],\n      name,\n      content,\n      savetype: 'zip'\n    } as unknown as any);\n  });\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/utils/arrayUtils.ts",
    "content": "export function createIncrementalArray(size: number) {\n  return [...[...Array(size)].keys()];\n}\n\nexport function cutAndSwapArray<T>(\n  array: Array<T>,\n  cutIndex: number\n): Array<T> {\n  return [...array.slice(cutIndex, array.length), ...array.slice(0, cutIndex)];\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/utils/blockbenchUtils.ts",
    "content": "import parseDataUrl, { DataUrl } from 'parse-data-url';\nimport { Animation, Manifest } from '../types';\n\nexport function obtainBase64PackIcon(): Promise<string> {\n  return new Promise((resolve, reject) => {\n    // @ts-ignore\n    Screencam.cleanCanvas({ width: 100, height: 100 }, (dataUrl: string) => {\n      const parsedDataUrl = parseDataUrl(dataUrl);\n\n      if (!parsedDataUrl)\n        reject(new Error('unable to parse screenshot data url'));\n\n      resolve((parsedDataUrl as DataUrl).data);\n    });\n  });\n}\n\nexport function buildManifest(\n  description: string,\n  pack_format: number\n): Manifest {\n  return {\n    pack: {\n      description,\n      pack_format\n    }\n  };\n}\n\nexport function compileJavaBlockCodec(\n  enableCredits: boolean = false,\n  credits: string = ''\n) {\n  // @ts-ignore\n  const data = Codecs.java_block.compile({ raw: true });\n  (data as { credit: string }).credit = enableCredits ? credits : '';\n  return data;\n}\n\nexport function createTextureAnimation(\n  frametime: number,\n  frames: Array<number>,\n  interpolate: boolean\n): Animation {\n  return {\n    animation: {\n      frametime,\n      frames,\n      interpolate\n    }\n  };\n}\n"
  },
  {
    "path": "src/resourcepack_packager/src/utils/objectUtils.ts",
    "content": "export function hardDefineProperty(\n  object: object,\n  property: string,\n  value: any\n) {\n  Object.defineProperty(object, property, {\n    value,\n    writable: true,\n    configurable: true\n  });\n}\n\nexport function hardObtainProperty(object: object, property: string) {\n  return Object.entries(object).find(([name]) => name === property)?.[1];\n}\n"
  },
  {
    "path": "src/resourcepack_packager/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES6\" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,\n    \"lib\": [\"ES6\"],\n    \"module\": \"commonjs\" /* Specify what module code is generated. */,\n    \"rootDir\": \"src\" /* Specify the root folder within your source files. */,\n    \"allowJs\": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */,\n    \"declaration\": false /* Generate .d.ts files from TypeScript and JavaScript files in your project. */,\n    \"sourceMap\": true /* Create source map files for emitted JavaScript files. */,\n    \"outDir\": \"dist\" /* Specify an output folder for all emitted files. */,\n    \"esModuleInterop\": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,\n    \"forceConsistentCasingInFileNames\": true /* Ensure that casing is correct in imports. */,\n    \"strict\": true /* Enable all strict type-checking options. */,\n    \"noImplicitAny\": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */,\n    \"skipLibCheck\": true /* Skip type checking all .d.ts files. */,\n    \"removeComments\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "src/resourcepack_packager/webpack.config.js",
    "content": "const path = require('path');\nconst TerserPlugin = require('terser-webpack-plugin');\n\nmodule.exports = {\n  entry: './src/index.ts',\n  optimization: {\n    minimize: true,\n    minimizer: [\n      new TerserPlugin({\n        terserOptions: {\n          output: {\n            preamble:\n              '/* Blockbench \"resourcepack_packager\" Plugin created by leopoldhub*/\\n\\n/** This work is licensed under the Creative Commons Attribution 4.0 International License.\\nTo view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. */\\n\\n/* the source code is in the \"src/resourcepack_packager\" folder! */',\n            comments: false\n          }\n        },\n        extractComments: false\n      })\n    ]\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.ts$/,\n        use: 'ts-loader',\n        exclude: /node_modules/\n      }\n    ]\n  },\n  resolve: {\n    extensions: ['.ts', '.js']\n  },\n  externals: {\n    jszip: 'JSZip'\n  },\n  output: {\n    filename: 'resourcepack_packager.js',\n    path: path.resolve(__dirname, '../../plugins')\n  }\n};\n"
  },
  {
    "path": "types/changelog.schema.json",
    "content": "{\n    \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n    \"$id\": \"changelog.schema\",\n    \"title\": \"Changelog\",\n    \"description\": \"A plugin changelog. Make sure to add new versions at the bottom of the document!\",\n    \"type\": \"object\",\n    \"propertyNames\": {\n        \"pattern\": \"^\\\\d+.\\\\d+.\\\\d+$\"\n    },\n    \"additionalProperties\": {\n        \"type\": \"object\",\n        \"required\": [\"title\", \"author\", \"date\", \"categories\"],\n        \"properties\": {\n            \"title\": {\"type\": \"string\"},\n            \"date\": {\"type\": \"string\", \"description\": \"Date as YYYY/MM/DD\", \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"},\n            \"author\": {\"type\": \"string\"},\n            \"categories\": {\n                \"type\": \"array\",\n                \"items\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"title\": {\"type\": \"string\"},\n                        \"list\": {\n                            \"type\": \"array\",\n                            \"items\": {\"type\": \"string\"}\n                        }\n                    },\n                    \"defaultSnippets\": [\n                        {\n                            \"label\": \"Category\",\n                            \"description\": \"A new category or changes\",\n                            \"body\": {\n                                \"title\": \"Changes\",\n                                \"list\": [\n                                    \"\"\n                                ]\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        \"defaultSnippets\": [\n            {\n                \"label\": \"New Version\",\n                \"description\": \"A new version example snippet\",\n                \"body\": {\n                    \"title\": \"1.0.0\",\n                    \"author\": \"\",\n                    \"date\": \"2017-05-07\",\n                    \"categories\": [\n                        {\n                            \"title\": \"Features\",\n                            \"list\": [\n                                \"\"\n                            ]\n                        },\n                        {\n                            \"title\": \"Fixes\",\n                            \"list\": [\n                                \"\"\n                            ]\n                        }\n                    ]\n                    \n                }\n            }\n        ]\n    }\n}"
  },
  {
    "path": "types/index.d.ts",
    "content": "/// <reference types=\"blockbench-types\" />\n"
  },
  {
    "path": "types/plugins.schema.json",
    "content": "{\n    \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n    \"$id\": \"plugins.schema\",\n    \"title\": \"plugins.json\",\n    \"description\": \"List of all plugins and their store metadata\",\n    \"type\": \"object\",\n    \"additionalProperties\": {\n        \"type\": \"object\",\n        \"required\": [\"title\", \"author\", \"version\", \"icon\"],\n        \"properties\": {\n            \"title\": {\n                \"type\": \"string\",\n                \"description\": \"Name of the plugin\"\n            },\n            \"author\": {\n                \"type\": \"string\",\n                \"description\": \"Author or authors\"\n            },\n            \"icon\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-zA-Z0-9._-]+$\",\n                \"description\": \"Icon, either an icon resolvable string, or icon.png / icon.svg in the new repo format\"\n            },\n            \"description\": {\n                \"type\": \"string\",\n                \"description\": \"Short plugin description\"\n            },\n            \"tags\": {\n                \"type\": \"array\",\n                \"items\": {\"type\": \"string\"},\n                \"description\": \"Tags to help categorize the plugin\",\n                \"maxItems\": 3\n            },\n            \"version\": {\n                \"type\": \"string\",\n                \"description\": \"Semver version string\"\n            },\n            \"min_version\": {\n                \"type\": \"string\",\n                \"description\": \"Minimum required Blockbench version to run this plugin\"\n            },\n            \"variant\": {\n                \"type\": \"string\",\n                \"enum\": [\"both\", \"desktop\", \"web\"],\n                \"description\": \"Specify if Blockbench can run only on desktop, only in the web app, or on both\"\n            },\n            \"creation_date\": {\n                \"type\": \"string\",\n                \"description\": \"Date of when the plugin was first released. As YYYY/MM/DD\",\n                \"pattern\": \"^\\\\d{4}-\\\\d{2}-\\\\d{2}$\"\n            },\n            \"new_repository_format\": {\n                \"type\": \"boolean\",\n                \"deprecated\": true,\n                \"description\": \"Instruct the plugin to use the new repository format, see README.md. This field was only used in the transition period, instead the behavior is now based on a min_version of 4.8.0 or higher.\"\n            },\n            \"has_changelog\": {\n                \"type\": \"boolean\",\n                \"description\": \"Whether the plugin has a changelog.json file, specifying changes in past updates.\"\n            },\n            \"await_loading\": {\n                \"type\": \"boolean\",\n                \"description\": \"Set to true if you need the plugin to finish loading when starting Blockbench before loading files\"\n            },\n            \"contributes\": {\n                \"type\": \"object\",\n                \"properties\": {\n                    \"formats\": {\n                        \"type\": \"array\",\n                        \"items\": {\"type\": \"string\"}\n                    }\n                }\n            },\n            \"website\": {\n                \"type\": \"string\",\n                \"description\": \"Link to the plugins website\",\n                \"pattern\": \"^https://.+\"\n            },\n            \"repository\": {\n                \"type\": \"string\",\n                \"description\": \"Link to the repository that contains the source for the plugin\",\n                \"pattern\": \"^https://.+\"\n            },\n            \"bug_tracker\": {\n                \"type\": \"string\",\n                \"description\": \"Link to where users can report issues with the plugin\",\n                \"pattern\": \"^https://.+\"\n            },\n            \"contributors\": {\n                \"type\": \"array\",\n                \"items\": {\"type\": \"string\"},\n                \"description\": \"List of people who have contributed to the plugin but are not the main author(s)\"\n            },\n            \"deprecation_note\": {\n                \"type\": \"string\",\n                \"description\": \"Used in combination with a \\\"Deprecated\\\" tag. Explains why the plugin is deprecated and what to do or use instead.\"\n            }\n        },\n        \"defaultSnippets\": [\n            {\n                \"label\": \"Basic plugin\",\n                \"description\": \"A new plugin example\",\n                \"body\": {\n                    \"title\": \"My Plugin\",\n                    \"author\": \"Benchbot\",\n                    \"description\": \"\",\n                    \"icon\": \"icon.png\",\n                    \"version\": \"1.0.0\",\n                    \"min_version\": \"4.10.0\",\n                    \"variant\": \"both\"\n                }\n            }\n        ]\n    },\n    \"propertyNames\": {\n        \"pattern\": \"^[a-z0-9_]{3,64}$\"\n    }\n}"
  },
  {
    "path": "updates.json",
    "content": "{\n  \"sam3dj\": {\n    \"version\": \"1.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"animated_java\": {\n    \"version\": \"1.8.1\",\n    \"created\": 1736294400000,\n    \"updated\": 1761004800000\n  },\n  \"armor_stand_animator\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"missing_texture_highlighter\": {\n    \"version\": \"0.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"double_sided_cubes\": {\n    \"version\": \"1.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"optimize\": {\n    \"version\": \"1.2.8\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"plaster\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"outline_creator\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"vox_importer\": {\n    \"version\": \"1.2.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"clone_brush\": {\n    \"version\": \"1.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"mod_utils\": {\n    \"version\": \"1.7.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"structure_importer\": {\n    \"version\": \"2.1.7\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"seat_position\": {\n    \"version\": \"1.3.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"ambient_occlusion\": {\n    \"version\": \"1.0.4\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"csmodel\": {\n    \"version\": \"0.1.3\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"screencast_keys\": {\n    \"version\": \"0.2.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"discord-rpc\": {\n    \"version\": \"1.1.4\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"cem_template_loader\": {\n    \"version\": \"9.1.1\",\n    \"created\": 1580601600000,\n    \"updated\": 1775867773569\n  },\n  \"optifine_player_models\": {\n    \"version\": \"1.5.0\",\n    \"created\": 1653782400000,\n    \"updated\": 1653782400000\n  },\n  \"colour_gradient_generator\": {\n    \"version\": \"2.1.0\",\n    \"created\": 1654128000000,\n    \"updated\": 1760227200000\n  },\n  \"collapsible_start_screen_categories\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"preview_scene_customiser\": {\n    \"version\": \"1.2.0\",\n    \"created\": 1665705600000,\n    \"updated\": 1760227200000\n  },\n  \"splash_art_customiser\": {\n    \"version\": \"1.1.4\",\n    \"created\": 1667865600000,\n    \"updated\": 1667865600000\n  },\n  \"scene_recorder\": {\n    \"version\": \"2.1.1\",\n    \"created\": 1670976000000,\n    \"updated\": 1760227200000\n  },\n  \"backup_viewer\": {\n    \"version\": \"2.1.0\",\n    \"created\": 1672185600000,\n    \"updated\": 1760227200000\n  },\n  \"activity_tracker\": {\n    \"version\": \"1.1.1\",\n    \"created\": 1680134400000,\n    \"updated\": 1760832000000\n  },\n  \"minecraft_title_generator\": {\n    \"version\": \"1.10.4\",\n    \"created\": 1686355200000,\n    \"updated\": 1760572800000\n  },\n  \"workspaces\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1694044800000,\n    \"updated\": 1694044800000\n  },\n  \"live_dev_reloader\": {\n    \"version\": \"1.1.0\",\n    \"created\": 1705708800000,\n    \"updated\": 1760227200000\n  },\n  \"resource_pack_utilities\": {\n    \"version\": \"1.10.0\",\n    \"created\": 1719792000000,\n    \"updated\": 1779139186810\n  },\n  \"asset_browser\": {\n    \"version\": \"1.2.2\",\n    \"created\": 1748563200000,\n    \"updated\": 1760572800000\n  },\n  \"free_rotation\": {\n    \"version\": \"1.2.1\",\n    \"created\": 1734652800000,\n    \"updated\": 1760227200000\n  },\n  \"threecore_exporter\": {\n    \"version\": \"1.0.3\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"startup_tips\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"animation_utils\": {\n    \"version\": \"4.1.3\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"geckolib\": {\n    \"version\": \"4.2.5\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"modded_entity_fabric\": {\n    \"version\": \"0.2.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"light_tracer_uploader\": {\n    \"version\": \"0.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"code_view\": {\n    \"version\": \"1.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"datagen_export\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"duplicate_renamer\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"texture_stitcher\": {\n    \"version\": \"1.0.7\",\n    \"created\": 1718236800000,\n    \"updated\": 1725580800000\n  },\n  \"arcaniax_block_exporter\": {\n    \"version\": \"0.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"bakery\": {\n    \"version\": \"1.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"simplify\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"animation_sliders\": {\n    \"version\": \"0.5.0\",\n    \"created\": 0,\n    \"updated\": 1771523210049\n  },\n  \"voxel_shape_generator\": {\n    \"version\": \"0.2.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"voxel_shape_fabric_generator\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"mimodel_format\": {\n    \"version\": \"1.0.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"minecraft_entity_wizard\": {\n    \"version\": \"1.8.3\",\n    \"created\": 1628035200000,\n    \"updated\": 1761350400000\n  },\n  \"minecraft_block_wizard\": {\n    \"version\": \"1.7.0\",\n    \"created\": 1666656000000,\n    \"updated\": 1778102478437\n  },\n  \"minecraft_item_wizard\": {\n    \"version\": \"1.2.4\",\n    \"created\": 1695081600000,\n    \"updated\": 1761350400000\n  },\n  \"reference_models\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 1771505381549\n  },\n  \"vintagestory_models\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"endimations_exporter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"brush_randomizer\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"cardinal\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"mesh_tools\": {\n    \"version\": \"2.1.0\",\n    \"created\": 1649462400000,\n    \"updated\": 1742083200000\n  },\n  \"wasd_controls\": {\n    \"version\": \"1.2.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"skin_packager\": {\n    \"version\": \"0.3.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"tint_preview\": {\n    \"version\": \"1.1.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"pie_menu\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"quick_box_uv_layout\": {\n    \"version\": \"0.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"animation_to_java\": {\n    \"version\": \"1.2.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"root_motion_extractor\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"ground_plane_editor\": {\n    \"version\": \"1.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"custom_marker_colors\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"resourcepack_packager\": {\n    \"version\": \"1.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"grayscale_preview\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"brush\": {\n    \"version\": \"1.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"pluginstats\": {\n    \"version\": \"1.3.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"repeat_it\": {\n    \"version\": \"0.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"cameras\": {\n    \"version\": \"1.2.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"image_centering\": {\n    \"version\": \"1.1.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"bbs_exporter\": {\n    \"version\": \"1.3.1\",\n    \"created\": 1714608000000,\n    \"updated\": 1760400000000\n  },\n  \"highlight_generator\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"obj_animation_export\": {\n    \"version\": \"0.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"explorer\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 1776286387152\n  },\n  \"performance_audit\": {\n    \"version\": \"1.1.2\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"mc_text_generator\": {\n    \"version\": \"2.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"utility_flaggers\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"skin_mirror\": {\n    \"version\": \"1.1.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"bamo\": {\n    \"version\": \"0.5.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"animation_to_json\": {\n    \"version\": \"1.0.1\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"azurelib_utils\": {\n    \"version\": \"2.1.2\",\n    \"created\": 1680566400000,\n    \"updated\": 1776713189096\n  },\n  \"cube_inverter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"figura_format\": {\n    \"version\": \"0.1.3\",\n    \"created\": 1689984000000,\n    \"updated\": 1689984000000\n  },\n  \"rainbow_road_game\": {\n    \"version\": \"0.1.1\",\n    \"created\": 1711926000000,\n    \"updated\": 1711926000000\n  },\n  \"cosmic_reach_model_editor\": {\n    \"version\": \"2.2.0\",\n    \"created\": 1713484800000,\n    \"updated\": 1709424000000\n  },\n  \"emf_animation_addon\": {\n    \"version\": \"1.0.4\",\n    \"created\": 1717545600000,\n    \"updated\": 1724544000000\n  },\n  \"creative_mode\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"bedrock_block_transforms\": {\n    \"version\": \"1.0.0\",\n    \"created\": 0,\n    \"updated\": 0\n  },\n  \"pbr_preview\": {\n    \"version\": \"1.2.2\",\n    \"created\": 1717977600000,\n    \"updated\": 1731196800000\n  },\n  \"tweaks_n_stuff\": {\n    \"version\": \"1.1.0\",\n    \"created\": 1728259200000,\n    \"updated\": 1763074905482\n  },\n  \"meshy\": {\n    \"version\": \"1.0.5\",\n    \"created\": 1727481600000,\n    \"updated\": 1751756400000\n  },\n  \"outliner_group_exporter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1742342400000,\n    \"updated\": 1742342400000\n  },\n  \"export_to_blender\": {\n    \"version\": \"2.0.0\",\n    \"created\": 1744761600000,\n    \"updated\": 1744761600000\n  },\n  \"reexport_on_save\": {\n    \"version\": \"2.0.0\",\n    \"created\": 1744934400000,\n    \"updated\": 1744934400000\n  },\n  \"repeating_textures\": {\n    \"version\": \"3.0.0\",\n    \"created\": 1749945600000,\n    \"updated\": 1749945600000\n  },\n  \"export_to_3mf\": {\n    \"version\": \"0.0.1\",\n    \"created\": 1751414400000,\n    \"updated\": 1751414400000\n  },\n  \"shaper\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1756166400000,\n    \"updated\": 1756166400000\n  },\n  \"bone_view\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1758067200000,\n    \"updated\": 1758067200000\n  },\n  \"texture_filtering\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1756684800000,\n    \"updated\": 1756684800000\n  },\n  \"gltf_importer\": {\n    \"version\": \"1.1.0\",\n    \"created\": 1758758400000,\n    \"updated\": 1763074905482\n  },\n  \"translation_plane_gizmo\": {\n    \"version\": \"1.0.1\",\n    \"created\": 1763076756774,\n    \"updated\": 1763076756774\n  },\n  \"shape_generator\": {\n    \"version\": \"0.0.4\",\n    \"created\": 1765964433931,\n    \"updated\": 1765964433931\n  },\n  \"hytale_plugin\": {\n    \"version\": \"0.9.1\",\n    \"created\": 1766421748990,\n    \"updated\": 1776021669799\n  },\n  \"texture_downscaler\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1766497657176,\n    \"updated\": 1766497657176\n  },\n  \"smudge_brush\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1766790102010,\n    \"updated\": 1766790102010\n  },\n  \"java_block_animation_exporter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1766859185469,\n    \"updated\": 1766859185469\n  },\n  \"animated_platforms\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1766862509962,\n    \"updated\": 1766862509962\n  },\n  \"java_block_sequencer\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1766970388550,\n    \"updated\": 1766970388550\n  },\n  \"block_multi_collisions\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1767891679712,\n    \"updated\": 1767891679712\n  },\n  \"transparency_fix\": {\n    \"version\": \"2.1.0\",\n    \"created\": 1768678498580,\n    \"updated\": 1768678498580\n  },\n  \"farsight\": {\n    \"version\": \"1.0.1\",\n    \"created\": 1768678815290,\n    \"updated\": 1768678815290\n  },\n  \"hytale_avatar_loader\": {\n    \"version\": \"1.2.0\",\n    \"created\": 1768738768363,\n    \"updated\": 1771095730771\n  },\n  \"baked_ambient_occlusion\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1771093398623,\n    \"updated\": 1771093398623\n  },\n  \"hytale_bridge\": {\n    \"version\": \"0.1.1\",\n    \"created\": 1771677037011,\n    \"updated\": 1771677037011\n  },\n  \"hytale_hitbox_helper\": {\n    \"version\": \"1.0.1\",\n    \"created\": 1771678722825,\n    \"updated\": 1771678722825\n  },\n  \"animator\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776515943658,\n    \"updated\": 1776515943658\n  },\n  \"geenium_bedrock_entity_helper\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776515943658,\n    \"updated\": 1776515943658\n  },\n  \"blockmodels-exporter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776515943658,\n    \"updated\": 1776515943658\n  },\n  \"player_statue_generator\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776515943658,\n    \"updated\": 1776515943658\n  },\n  \"easings\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776527910925,\n    \"updated\": 1776527910925\n  },\n  \"let_there_be_noise\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776530761043,\n    \"updated\": 1776530761043\n  },\n  \"expand_bone_timeline\": {\n    \"version\": \"2.2.0\",\n    \"created\": 1776715194414,\n    \"updated\": 1776715194414\n  },\n  \"menu_icon_exporter\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1776715988139,\n    \"updated\": 1776715988139\n  },\n  \"no_java_limits\": {\n    \"version\": \"1.0.0\",\n    \"created\": 1778439813605,\n    \"updated\": 1778439813605\n  },\n  \"brush_tuna\": {\n    \"version\": \"1.0.6\",\n    \"created\": 1778520382148,\n    \"updated\": 1778520382148\n  }\n}"
  }
]